@wemap/routers 12.2.0 → 12.4.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.
package/dist/index.js CHANGED
@@ -914,6 +914,1321 @@ class Itinerary {
914
914
  });
915
915
  }
916
916
  }
917
+ var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
918
+ var uaParser = { exports: {} };
919
+ (function(module2, exports2) {
920
+ (function(window2, undefined$1) {
921
+ var LIBVERSION = "1.0.35", EMPTY = "", UNKNOWN = "?", FUNC_TYPE = "function", UNDEF_TYPE = "undefined", OBJ_TYPE = "object", STR_TYPE = "string", MAJOR = "major", MODEL = "model", NAME = "name", TYPE = "type", VENDOR = "vendor", VERSION = "version", ARCHITECTURE = "architecture", CONSOLE = "console", MOBILE = "mobile", TABLET = "tablet", SMARTTV = "smarttv", WEARABLE = "wearable", EMBEDDED = "embedded", UA_MAX_LENGTH = 350;
922
+ var AMAZON = "Amazon", APPLE = "Apple", ASUS = "ASUS", BLACKBERRY = "BlackBerry", BROWSER = "Browser", CHROME = "Chrome", EDGE = "Edge", FIREFOX = "Firefox", GOOGLE = "Google", HUAWEI = "Huawei", LG = "LG", MICROSOFT = "Microsoft", MOTOROLA = "Motorola", OPERA = "Opera", SAMSUNG = "Samsung", SHARP = "Sharp", SONY = "Sony", XIAOMI = "Xiaomi", ZEBRA = "Zebra", FACEBOOK = "Facebook", CHROMIUM_OS = "Chromium OS", MAC_OS = "Mac OS";
923
+ var extend = function(regexes2, extensions) {
924
+ var mergedRegexes = {};
925
+ for (var i in regexes2) {
926
+ if (extensions[i] && extensions[i].length % 2 === 0) {
927
+ mergedRegexes[i] = extensions[i].concat(regexes2[i]);
928
+ } else {
929
+ mergedRegexes[i] = regexes2[i];
930
+ }
931
+ }
932
+ return mergedRegexes;
933
+ }, enumerize = function(arr) {
934
+ var enums = {};
935
+ for (var i = 0; i < arr.length; i++) {
936
+ enums[arr[i].toUpperCase()] = arr[i];
937
+ }
938
+ return enums;
939
+ }, has = function(str1, str2) {
940
+ return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;
941
+ }, lowerize = function(str) {
942
+ return str.toLowerCase();
943
+ }, majorize = function(version) {
944
+ return typeof version === STR_TYPE ? version.replace(/[^\d\.]/g, EMPTY).split(".")[0] : undefined$1;
945
+ }, trim = function(str, len) {
946
+ if (typeof str === STR_TYPE) {
947
+ str = str.replace(/^\s\s*/, EMPTY);
948
+ return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
949
+ }
950
+ };
951
+ var rgxMapper = function(ua, arrays) {
952
+ var i = 0, j, k, p, q, matches, match;
953
+ while (i < arrays.length && !matches) {
954
+ var regex = arrays[i], props = arrays[i + 1];
955
+ j = k = 0;
956
+ while (j < regex.length && !matches) {
957
+ if (!regex[j]) {
958
+ break;
959
+ }
960
+ matches = regex[j++].exec(ua);
961
+ if (!!matches) {
962
+ for (p = 0; p < props.length; p++) {
963
+ match = matches[++k];
964
+ q = props[p];
965
+ if (typeof q === OBJ_TYPE && q.length > 0) {
966
+ if (q.length === 2) {
967
+ if (typeof q[1] == FUNC_TYPE) {
968
+ this[q[0]] = q[1].call(this, match);
969
+ } else {
970
+ this[q[0]] = q[1];
971
+ }
972
+ } else if (q.length === 3) {
973
+ if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
974
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined$1;
975
+ } else {
976
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined$1;
977
+ }
978
+ } else if (q.length === 4) {
979
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined$1;
980
+ }
981
+ } else {
982
+ this[q] = match ? match : undefined$1;
983
+ }
984
+ }
985
+ }
986
+ }
987
+ i += 2;
988
+ }
989
+ }, strMapper = function(str, map) {
990
+ for (var i in map) {
991
+ if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
992
+ for (var j = 0; j < map[i].length; j++) {
993
+ if (has(map[i][j], str)) {
994
+ return i === UNKNOWN ? undefined$1 : i;
995
+ }
996
+ }
997
+ } else if (has(map[i], str)) {
998
+ return i === UNKNOWN ? undefined$1 : i;
999
+ }
1000
+ }
1001
+ return str;
1002
+ };
1003
+ var oldSafariMap = {
1004
+ "1.0": "/8",
1005
+ "1.2": "/1",
1006
+ "1.3": "/3",
1007
+ "2.0": "/412",
1008
+ "2.0.2": "/416",
1009
+ "2.0.3": "/417",
1010
+ "2.0.4": "/419",
1011
+ "?": "/"
1012
+ }, windowsVersionMap = {
1013
+ "ME": "4.90",
1014
+ "NT 3.11": "NT3.51",
1015
+ "NT 4.0": "NT4.0",
1016
+ "2000": "NT 5.0",
1017
+ "XP": ["NT 5.1", "NT 5.2"],
1018
+ "Vista": "NT 6.0",
1019
+ "7": "NT 6.1",
1020
+ "8": "NT 6.2",
1021
+ "8.1": "NT 6.3",
1022
+ "10": ["NT 6.4", "NT 10.0"],
1023
+ "RT": "ARM"
1024
+ };
1025
+ var regexes = {
1026
+ browser: [
1027
+ [
1028
+ /\b(?:crmo|crios)\/([\w\.]+)/i
1029
+ // Chrome for Android/iOS
1030
+ ],
1031
+ [VERSION, [NAME, "Chrome"]],
1032
+ [
1033
+ /edg(?:e|ios|a)?\/([\w\.]+)/i
1034
+ // Microsoft Edge
1035
+ ],
1036
+ [VERSION, [NAME, "Edge"]],
1037
+ [
1038
+ // Presto based
1039
+ /(opera mini)\/([-\w\.]+)/i,
1040
+ // Opera Mini
1041
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
1042
+ // Opera Mobi/Tablet
1043
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
1044
+ // Opera
1045
+ ],
1046
+ [NAME, VERSION],
1047
+ [
1048
+ /opios[\/ ]+([\w\.]+)/i
1049
+ // Opera mini on iphone >= 8.0
1050
+ ],
1051
+ [VERSION, [NAME, OPERA + " Mini"]],
1052
+ [
1053
+ /\bopr\/([\w\.]+)/i
1054
+ // Opera Webkit
1055
+ ],
1056
+ [VERSION, [NAME, OPERA]],
1057
+ [
1058
+ // Mixed
1059
+ /(kindle)\/([\w\.]+)/i,
1060
+ // Kindle
1061
+ /(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i,
1062
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer
1063
+ // Trident based
1064
+ /(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i,
1065
+ // Avant/IEMobile/SlimBrowser
1066
+ /(ba?idubrowser)[\/ ]?([\w\.]+)/i,
1067
+ // Baidu Browser
1068
+ /(?:ms|\()(ie) ([\w\.]+)/i,
1069
+ // Internet Explorer
1070
+ // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
1071
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,
1072
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
1073
+ /(heytap|ovi)browser\/([\d\.]+)/i,
1074
+ // Heytap/Ovi
1075
+ /(weibo)__([\d\.]+)/i
1076
+ // Weibo
1077
+ ],
1078
+ [NAME, VERSION],
1079
+ [
1080
+ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i
1081
+ // UCBrowser
1082
+ ],
1083
+ [VERSION, [NAME, "UC" + BROWSER]],
1084
+ [
1085
+ /microm.+\bqbcore\/([\w\.]+)/i,
1086
+ // WeChat Desktop for Windows Built-in Browser
1087
+ /\bqbcore\/([\w\.]+).+microm/i
1088
+ ],
1089
+ [VERSION, [NAME, "WeChat(Win) Desktop"]],
1090
+ [
1091
+ /micromessenger\/([\w\.]+)/i
1092
+ // WeChat
1093
+ ],
1094
+ [VERSION, [NAME, "WeChat"]],
1095
+ [
1096
+ /konqueror\/([\w\.]+)/i
1097
+ // Konqueror
1098
+ ],
1099
+ [VERSION, [NAME, "Konqueror"]],
1100
+ [
1101
+ /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i
1102
+ // IE11
1103
+ ],
1104
+ [VERSION, [NAME, "IE"]],
1105
+ [
1106
+ /ya(?:search)?browser\/([\w\.]+)/i
1107
+ // Yandex
1108
+ ],
1109
+ [VERSION, [NAME, "Yandex"]],
1110
+ [
1111
+ /(avast|avg)\/([\w\.]+)/i
1112
+ // Avast/AVG Secure Browser
1113
+ ],
1114
+ [[NAME, /(.+)/, "$1 Secure " + BROWSER], VERSION],
1115
+ [
1116
+ /\bfocus\/([\w\.]+)/i
1117
+ // Firefox Focus
1118
+ ],
1119
+ [VERSION, [NAME, FIREFOX + " Focus"]],
1120
+ [
1121
+ /\bopt\/([\w\.]+)/i
1122
+ // Opera Touch
1123
+ ],
1124
+ [VERSION, [NAME, OPERA + " Touch"]],
1125
+ [
1126
+ /coc_coc\w+\/([\w\.]+)/i
1127
+ // Coc Coc Browser
1128
+ ],
1129
+ [VERSION, [NAME, "Coc Coc"]],
1130
+ [
1131
+ /dolfin\/([\w\.]+)/i
1132
+ // Dolphin
1133
+ ],
1134
+ [VERSION, [NAME, "Dolphin"]],
1135
+ [
1136
+ /coast\/([\w\.]+)/i
1137
+ // Opera Coast
1138
+ ],
1139
+ [VERSION, [NAME, OPERA + " Coast"]],
1140
+ [
1141
+ /miuibrowser\/([\w\.]+)/i
1142
+ // MIUI Browser
1143
+ ],
1144
+ [VERSION, [NAME, "MIUI " + BROWSER]],
1145
+ [
1146
+ /fxios\/([-\w\.]+)/i
1147
+ // Firefox for iOS
1148
+ ],
1149
+ [VERSION, [NAME, FIREFOX]],
1150
+ [
1151
+ /\bqihu|(qi?ho?o?|360)browser/i
1152
+ // 360
1153
+ ],
1154
+ [[NAME, "360 " + BROWSER]],
1155
+ [
1156
+ /(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i
1157
+ ],
1158
+ [[NAME, /(.+)/, "$1 " + BROWSER], VERSION],
1159
+ [
1160
+ // Oculus/Samsung/Sailfish/Huawei Browser
1161
+ /(comodo_dragon)\/([\w\.]+)/i
1162
+ // Comodo Dragon
1163
+ ],
1164
+ [[NAME, /_/g, " "], VERSION],
1165
+ [
1166
+ /(electron)\/([\w\.]+) safari/i,
1167
+ // Electron-based App
1168
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
1169
+ // Tesla
1170
+ /m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i
1171
+ // QQBrowser/Baidu App/2345 Browser
1172
+ ],
1173
+ [NAME, VERSION],
1174
+ [
1175
+ /(metasr)[\/ ]?([\w\.]+)/i,
1176
+ // SouGouBrowser
1177
+ /(lbbrowser)/i,
1178
+ // LieBao Browser
1179
+ /\[(linkedin)app\]/i
1180
+ // LinkedIn App for iOS & Android
1181
+ ],
1182
+ [NAME],
1183
+ [
1184
+ // WebView
1185
+ /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i
1186
+ // Facebook App for iOS & Android
1187
+ ],
1188
+ [[NAME, FACEBOOK], VERSION],
1189
+ [
1190
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
1191
+ // Kakao App
1192
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
1193
+ // Naver InApp
1194
+ /safari (line)\/([\w\.]+)/i,
1195
+ // Line App for iOS
1196
+ /\b(line)\/([\w\.]+)\/iab/i,
1197
+ // Line App for Android
1198
+ /(chromium|instagram)[\/ ]([-\w\.]+)/i
1199
+ // Chromium/Instagram
1200
+ ],
1201
+ [NAME, VERSION],
1202
+ [
1203
+ /\bgsa\/([\w\.]+) .*safari\//i
1204
+ // Google Search Appliance on iOS
1205
+ ],
1206
+ [VERSION, [NAME, "GSA"]],
1207
+ [
1208
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i
1209
+ // TikTok
1210
+ ],
1211
+ [VERSION, [NAME, "TikTok"]],
1212
+ [
1213
+ /headlesschrome(?:\/([\w\.]+)| )/i
1214
+ // Chrome Headless
1215
+ ],
1216
+ [VERSION, [NAME, CHROME + " Headless"]],
1217
+ [
1218
+ / wv\).+(chrome)\/([\w\.]+)/i
1219
+ // Chrome WebView
1220
+ ],
1221
+ [[NAME, CHROME + " WebView"], VERSION],
1222
+ [
1223
+ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i
1224
+ // Android Browser
1225
+ ],
1226
+ [VERSION, [NAME, "Android " + BROWSER]],
1227
+ [
1228
+ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i
1229
+ // Chrome/OmniWeb/Arora/Tizen/Nokia
1230
+ ],
1231
+ [NAME, VERSION],
1232
+ [
1233
+ /version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i
1234
+ // Mobile Safari
1235
+ ],
1236
+ [VERSION, [NAME, "Mobile Safari"]],
1237
+ [
1238
+ /version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i
1239
+ // Safari & Safari Mobile
1240
+ ],
1241
+ [VERSION, NAME],
1242
+ [
1243
+ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i
1244
+ // Safari < 3.0
1245
+ ],
1246
+ [NAME, [VERSION, strMapper, oldSafariMap]],
1247
+ [
1248
+ /(webkit|khtml)\/([\w\.]+)/i
1249
+ ],
1250
+ [NAME, VERSION],
1251
+ [
1252
+ // Gecko based
1253
+ /(navigator|netscape\d?)\/([-\w\.]+)/i
1254
+ // Netscape
1255
+ ],
1256
+ [[NAME, "Netscape"], VERSION],
1257
+ [
1258
+ /mobile vr; rv:([\w\.]+)\).+firefox/i
1259
+ // Firefox Reality
1260
+ ],
1261
+ [VERSION, [NAME, FIREFOX + " Reality"]],
1262
+ [
1263
+ /ekiohf.+(flow)\/([\w\.]+)/i,
1264
+ // Flow
1265
+ /(swiftfox)/i,
1266
+ // Swiftfox
1267
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\/ ]?([\w\.\+]+)/i,
1268
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar
1269
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
1270
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
1271
+ /(firefox)\/([\w\.]+)/i,
1272
+ // Other Firefox-based
1273
+ /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i,
1274
+ // Mozilla
1275
+ // Other
1276
+ /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
1277
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser
1278
+ /(links) \(([\w\.]+)/i,
1279
+ // Links
1280
+ /panasonic;(viera)/i
1281
+ // Panasonic Viera
1282
+ ],
1283
+ [NAME, VERSION],
1284
+ [
1285
+ /(cobalt)\/([\w\.]+)/i
1286
+ // Cobalt
1287
+ ],
1288
+ [NAME, [VERSION, /master.|lts./, ""]]
1289
+ ],
1290
+ cpu: [
1291
+ [
1292
+ /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i
1293
+ // AMD64 (x64)
1294
+ ],
1295
+ [[ARCHITECTURE, "amd64"]],
1296
+ [
1297
+ /(ia32(?=;))/i
1298
+ // IA32 (quicktime)
1299
+ ],
1300
+ [[ARCHITECTURE, lowerize]],
1301
+ [
1302
+ /((?:i[346]|x)86)[;\)]/i
1303
+ // IA32 (x86)
1304
+ ],
1305
+ [[ARCHITECTURE, "ia32"]],
1306
+ [
1307
+ /\b(aarch64|arm(v?8e?l?|_?64))\b/i
1308
+ // ARM64
1309
+ ],
1310
+ [[ARCHITECTURE, "arm64"]],
1311
+ [
1312
+ /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i
1313
+ // ARMHF
1314
+ ],
1315
+ [[ARCHITECTURE, "armhf"]],
1316
+ [
1317
+ // PocketPC mistakenly identified as PowerPC
1318
+ /windows (ce|mobile); ppc;/i
1319
+ ],
1320
+ [[ARCHITECTURE, "arm"]],
1321
+ [
1322
+ /((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i
1323
+ // PowerPC
1324
+ ],
1325
+ [[ARCHITECTURE, /ower/, EMPTY, lowerize]],
1326
+ [
1327
+ /(sun4\w)[;\)]/i
1328
+ // SPARC
1329
+ ],
1330
+ [[ARCHITECTURE, "sparc"]],
1331
+ [
1332
+ /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
1333
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
1334
+ ],
1335
+ [[ARCHITECTURE, lowerize]]
1336
+ ],
1337
+ device: [
1338
+ [
1339
+ //////////////////////////
1340
+ // MOBILES & TABLETS
1341
+ /////////////////////////
1342
+ // Samsung
1343
+ /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
1344
+ ],
1345
+ [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]],
1346
+ [
1347
+ /\b((?:s[cgp]h|gt|sm)-\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
1348
+ /samsung[- ]([-\w]+)/i,
1349
+ /sec-(sgh\w+)/i
1350
+ ],
1351
+ [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]],
1352
+ [
1353
+ // Apple
1354
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i
1355
+ // iPod/iPhone
1356
+ ],
1357
+ [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]],
1358
+ [
1359
+ /\((ipad);[-\w\),; ]+apple/i,
1360
+ // iPad
1361
+ /applecoremedia\/[\w\.]+ \((ipad)/i,
1362
+ /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
1363
+ ],
1364
+ [MODEL, [VENDOR, APPLE], [TYPE, TABLET]],
1365
+ [
1366
+ /(macintosh);/i
1367
+ ],
1368
+ [MODEL, [VENDOR, APPLE]],
1369
+ [
1370
+ // Sharp
1371
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
1372
+ ],
1373
+ [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]],
1374
+ [
1375
+ // Huawei
1376
+ /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
1377
+ ],
1378
+ [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]],
1379
+ [
1380
+ /(?:huawei|honor)([-\w ]+)[;\)]/i,
1381
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
1382
+ ],
1383
+ [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]],
1384
+ [
1385
+ // Xiaomi
1386
+ /\b(poco[\w ]+)(?: bui|\))/i,
1387
+ // Xiaomi POCO
1388
+ /\b; (\w+) build\/hm\1/i,
1389
+ // Xiaomi Hongmi 'numeric' models
1390
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
1391
+ // Xiaomi Hongmi
1392
+ /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,
1393
+ // Xiaomi Redmi
1394
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i
1395
+ // Xiaomi Mi
1396
+ ],
1397
+ [[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, MOBILE]],
1398
+ [
1399
+ /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i
1400
+ // Mi Pad tablets
1401
+ ],
1402
+ [[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, TABLET]],
1403
+ [
1404
+ // OPPO
1405
+ /; (\w+) bui.+ oppo/i,
1406
+ /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
1407
+ ],
1408
+ [MODEL, [VENDOR, "OPPO"], [TYPE, MOBILE]],
1409
+ [
1410
+ // Vivo
1411
+ /vivo (\w+)(?: bui|\))/i,
1412
+ /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
1413
+ ],
1414
+ [MODEL, [VENDOR, "Vivo"], [TYPE, MOBILE]],
1415
+ [
1416
+ // Realme
1417
+ /\b(rmx[12]\d{3})(?: bui|;|\))/i
1418
+ ],
1419
+ [MODEL, [VENDOR, "Realme"], [TYPE, MOBILE]],
1420
+ [
1421
+ // Motorola
1422
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
1423
+ /\bmot(?:orola)?[- ](\w*)/i,
1424
+ /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i
1425
+ ],
1426
+ [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]],
1427
+ [
1428
+ /\b(mz60\d|xoom[2 ]{0,2}) build\//i
1429
+ ],
1430
+ [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]],
1431
+ [
1432
+ // LG
1433
+ /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
1434
+ ],
1435
+ [MODEL, [VENDOR, LG], [TYPE, TABLET]],
1436
+ [
1437
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
1438
+ /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,
1439
+ /\blg-?([\d\w]+) bui/i
1440
+ ],
1441
+ [MODEL, [VENDOR, LG], [TYPE, MOBILE]],
1442
+ [
1443
+ // Lenovo
1444
+ /(ideatab[-\w ]+)/i,
1445
+ /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i
1446
+ ],
1447
+ [MODEL, [VENDOR, "Lenovo"], [TYPE, TABLET]],
1448
+ [
1449
+ // Nokia
1450
+ /(?:maemo|nokia).*(n900|lumia \d+)/i,
1451
+ /nokia[-_ ]?([-\w\.]*)/i
1452
+ ],
1453
+ [[MODEL, /_/g, " "], [VENDOR, "Nokia"], [TYPE, MOBILE]],
1454
+ [
1455
+ // Google
1456
+ /(pixel c)\b/i
1457
+ // Google Pixel C
1458
+ ],
1459
+ [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]],
1460
+ [
1461
+ /droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i
1462
+ // Google Pixel
1463
+ ],
1464
+ [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]],
1465
+ [
1466
+ // Sony
1467
+ /droid.+ (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
1468
+ ],
1469
+ [MODEL, [VENDOR, SONY], [TYPE, MOBILE]],
1470
+ [
1471
+ /sony tablet [ps]/i,
1472
+ /\b(?:sony)?sgp\w+(?: bui|\))/i
1473
+ ],
1474
+ [[MODEL, "Xperia Tablet"], [VENDOR, SONY], [TYPE, TABLET]],
1475
+ [
1476
+ // OnePlus
1477
+ / (kb2005|in20[12]5|be20[12][59])\b/i,
1478
+ /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
1479
+ ],
1480
+ [MODEL, [VENDOR, "OnePlus"], [TYPE, MOBILE]],
1481
+ [
1482
+ // Amazon
1483
+ /(alexa)webm/i,
1484
+ /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i,
1485
+ // Kindle Fire without Silk / Echo Show
1486
+ /(kf[a-z]+)( bui|\)).+silk\//i
1487
+ // Kindle Fire HD
1488
+ ],
1489
+ [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]],
1490
+ [
1491
+ /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i
1492
+ // Fire Phone
1493
+ ],
1494
+ [[MODEL, /(.+)/g, "Fire Phone $1"], [VENDOR, AMAZON], [TYPE, MOBILE]],
1495
+ [
1496
+ // BlackBerry
1497
+ /(playbook);[-\w\),; ]+(rim)/i
1498
+ // BlackBerry PlayBook
1499
+ ],
1500
+ [MODEL, VENDOR, [TYPE, TABLET]],
1501
+ [
1502
+ /\b((?:bb[a-f]|st[hv])100-\d)/i,
1503
+ /\(bb10; (\w+)/i
1504
+ // BlackBerry 10
1505
+ ],
1506
+ [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]],
1507
+ [
1508
+ // Asus
1509
+ /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
1510
+ ],
1511
+ [MODEL, [VENDOR, ASUS], [TYPE, TABLET]],
1512
+ [
1513
+ / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
1514
+ ],
1515
+ [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]],
1516
+ [
1517
+ // HTC
1518
+ /(nexus 9)/i
1519
+ // HTC Nexus 9
1520
+ ],
1521
+ [MODEL, [VENDOR, "HTC"], [TYPE, TABLET]],
1522
+ [
1523
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
1524
+ // HTC
1525
+ // ZTE
1526
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
1527
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
1528
+ // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
1529
+ ],
1530
+ [VENDOR, [MODEL, /_/g, " "], [TYPE, MOBILE]],
1531
+ [
1532
+ // Acer
1533
+ /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
1534
+ ],
1535
+ [MODEL, [VENDOR, "Acer"], [TYPE, TABLET]],
1536
+ [
1537
+ // Meizu
1538
+ /droid.+; (m[1-5] note) bui/i,
1539
+ /\bmz-([-\w]{2,})/i
1540
+ ],
1541
+ [MODEL, [VENDOR, "Meizu"], [TYPE, MOBILE]],
1542
+ [
1543
+ // MIXED
1544
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\w]*)/i,
1545
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
1546
+ /(hp) ([\w ]+\w)/i,
1547
+ // HP iPAQ
1548
+ /(asus)-?(\w+)/i,
1549
+ // Asus
1550
+ /(microsoft); (lumia[\w ]+)/i,
1551
+ // Microsoft Lumia
1552
+ /(lenovo)[-_ ]?([-\w]+)/i,
1553
+ // Lenovo
1554
+ /(jolla)/i,
1555
+ // Jolla
1556
+ /(oppo) ?([\w ]+) bui/i
1557
+ // OPPO
1558
+ ],
1559
+ [VENDOR, MODEL, [TYPE, MOBILE]],
1560
+ [
1561
+ /(kobo)\s(ereader|touch)/i,
1562
+ // Kobo
1563
+ /(archos) (gamepad2?)/i,
1564
+ // Archos
1565
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i,
1566
+ // HP TouchPad
1567
+ /(kindle)\/([\w\.]+)/i,
1568
+ // Kindle
1569
+ /(nook)[\w ]+build\/(\w+)/i,
1570
+ // Nook
1571
+ /(dell) (strea[kpr\d ]*[\dko])/i,
1572
+ // Dell Streak
1573
+ /(le[- ]+pan)[- ]+(\w{1,9}) bui/i,
1574
+ // Le Pan Tablets
1575
+ /(trinity)[- ]*(t\d{3}) bui/i,
1576
+ // Trinity Tablets
1577
+ /(gigaset)[- ]+(q\w{1,9}) bui/i,
1578
+ // Gigaset Tablets
1579
+ /(vodafone) ([\w ]+)(?:\)| bui)/i
1580
+ // Vodafone
1581
+ ],
1582
+ [VENDOR, MODEL, [TYPE, TABLET]],
1583
+ [
1584
+ /(surface duo)/i
1585
+ // Surface Duo
1586
+ ],
1587
+ [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]],
1588
+ [
1589
+ /droid [\d\.]+; (fp\du?)(?: b|\))/i
1590
+ // Fairphone
1591
+ ],
1592
+ [MODEL, [VENDOR, "Fairphone"], [TYPE, MOBILE]],
1593
+ [
1594
+ /(u304aa)/i
1595
+ // AT&T
1596
+ ],
1597
+ [MODEL, [VENDOR, "AT&T"], [TYPE, MOBILE]],
1598
+ [
1599
+ /\bsie-(\w*)/i
1600
+ // Siemens
1601
+ ],
1602
+ [MODEL, [VENDOR, "Siemens"], [TYPE, MOBILE]],
1603
+ [
1604
+ /\b(rct\w+) b/i
1605
+ // RCA Tablets
1606
+ ],
1607
+ [MODEL, [VENDOR, "RCA"], [TYPE, TABLET]],
1608
+ [
1609
+ /\b(venue[\d ]{2,7}) b/i
1610
+ // Dell Venue Tablets
1611
+ ],
1612
+ [MODEL, [VENDOR, "Dell"], [TYPE, TABLET]],
1613
+ [
1614
+ /\b(q(?:mv|ta)\w+) b/i
1615
+ // Verizon Tablet
1616
+ ],
1617
+ [MODEL, [VENDOR, "Verizon"], [TYPE, TABLET]],
1618
+ [
1619
+ /\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i
1620
+ // Barnes & Noble Tablet
1621
+ ],
1622
+ [MODEL, [VENDOR, "Barnes & Noble"], [TYPE, TABLET]],
1623
+ [
1624
+ /\b(tm\d{3}\w+) b/i
1625
+ ],
1626
+ [MODEL, [VENDOR, "NuVision"], [TYPE, TABLET]],
1627
+ [
1628
+ /\b(k88) b/i
1629
+ // ZTE K Series Tablet
1630
+ ],
1631
+ [MODEL, [VENDOR, "ZTE"], [TYPE, TABLET]],
1632
+ [
1633
+ /\b(nx\d{3}j) b/i
1634
+ // ZTE Nubia
1635
+ ],
1636
+ [MODEL, [VENDOR, "ZTE"], [TYPE, MOBILE]],
1637
+ [
1638
+ /\b(gen\d{3}) b.+49h/i
1639
+ // Swiss GEN Mobile
1640
+ ],
1641
+ [MODEL, [VENDOR, "Swiss"], [TYPE, MOBILE]],
1642
+ [
1643
+ /\b(zur\d{3}) b/i
1644
+ // Swiss ZUR Tablet
1645
+ ],
1646
+ [MODEL, [VENDOR, "Swiss"], [TYPE, TABLET]],
1647
+ [
1648
+ /\b((zeki)?tb.*\b) b/i
1649
+ // Zeki Tablets
1650
+ ],
1651
+ [MODEL, [VENDOR, "Zeki"], [TYPE, TABLET]],
1652
+ [
1653
+ /\b([yr]\d{2}) b/i,
1654
+ /\b(dragon[- ]+touch |dt)(\w{5}) b/i
1655
+ // Dragon Touch Tablet
1656
+ ],
1657
+ [[VENDOR, "Dragon Touch"], MODEL, [TYPE, TABLET]],
1658
+ [
1659
+ /\b(ns-?\w{0,9}) b/i
1660
+ // Insignia Tablets
1661
+ ],
1662
+ [MODEL, [VENDOR, "Insignia"], [TYPE, TABLET]],
1663
+ [
1664
+ /\b((nxa|next)-?\w{0,9}) b/i
1665
+ // NextBook Tablets
1666
+ ],
1667
+ [MODEL, [VENDOR, "NextBook"], [TYPE, TABLET]],
1668
+ [
1669
+ /\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i
1670
+ // Voice Xtreme Phones
1671
+ ],
1672
+ [[VENDOR, "Voice"], MODEL, [TYPE, MOBILE]],
1673
+ [
1674
+ /\b(lvtel\-)?(v1[12]) b/i
1675
+ // LvTel Phones
1676
+ ],
1677
+ [[VENDOR, "LvTel"], MODEL, [TYPE, MOBILE]],
1678
+ [
1679
+ /\b(ph-1) /i
1680
+ // Essential PH-1
1681
+ ],
1682
+ [MODEL, [VENDOR, "Essential"], [TYPE, MOBILE]],
1683
+ [
1684
+ /\b(v(100md|700na|7011|917g).*\b) b/i
1685
+ // Envizen Tablets
1686
+ ],
1687
+ [MODEL, [VENDOR, "Envizen"], [TYPE, TABLET]],
1688
+ [
1689
+ /\b(trio[-\w\. ]+) b/i
1690
+ // MachSpeed Tablets
1691
+ ],
1692
+ [MODEL, [VENDOR, "MachSpeed"], [TYPE, TABLET]],
1693
+ [
1694
+ /\btu_(1491) b/i
1695
+ // Rotor Tablets
1696
+ ],
1697
+ [MODEL, [VENDOR, "Rotor"], [TYPE, TABLET]],
1698
+ [
1699
+ /(shield[\w ]+) b/i
1700
+ // Nvidia Shield Tablets
1701
+ ],
1702
+ [MODEL, [VENDOR, "Nvidia"], [TYPE, TABLET]],
1703
+ [
1704
+ /(sprint) (\w+)/i
1705
+ // Sprint Phones
1706
+ ],
1707
+ [VENDOR, MODEL, [TYPE, MOBILE]],
1708
+ [
1709
+ /(kin\.[onetw]{3})/i
1710
+ // Microsoft Kin
1711
+ ],
1712
+ [[MODEL, /\./g, " "], [VENDOR, MICROSOFT], [TYPE, MOBILE]],
1713
+ [
1714
+ /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i
1715
+ // Zebra
1716
+ ],
1717
+ [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]],
1718
+ [
1719
+ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
1720
+ ],
1721
+ [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]],
1722
+ [
1723
+ ///////////////////
1724
+ // SMARTTVS
1725
+ ///////////////////
1726
+ /smart-tv.+(samsung)/i
1727
+ // Samsung
1728
+ ],
1729
+ [VENDOR, [TYPE, SMARTTV]],
1730
+ [
1731
+ /hbbtv.+maple;(\d+)/i
1732
+ ],
1733
+ [[MODEL, /^/, "SmartTV"], [VENDOR, SAMSUNG], [TYPE, SMARTTV]],
1734
+ [
1735
+ /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
1736
+ // LG SmartTV
1737
+ ],
1738
+ [[VENDOR, LG], [TYPE, SMARTTV]],
1739
+ [
1740
+ /(apple) ?tv/i
1741
+ // Apple TV
1742
+ ],
1743
+ [VENDOR, [MODEL, APPLE + " TV"], [TYPE, SMARTTV]],
1744
+ [
1745
+ /crkey/i
1746
+ // Google Chromecast
1747
+ ],
1748
+ [[MODEL, CHROME + "cast"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
1749
+ [
1750
+ /droid.+aft(\w)( bui|\))/i
1751
+ // Fire TV
1752
+ ],
1753
+ [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]],
1754
+ [
1755
+ /\(dtv[\);].+(aquos)/i,
1756
+ /(aquos-tv[\w ]+)\)/i
1757
+ // Sharp
1758
+ ],
1759
+ [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],
1760
+ [
1761
+ /(bravia[\w ]+)( bui|\))/i
1762
+ // Sony
1763
+ ],
1764
+ [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]],
1765
+ [
1766
+ /(mitv-\w{5}) bui/i
1767
+ // Xiaomi
1768
+ ],
1769
+ [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]],
1770
+ [
1771
+ /Hbbtv.*(technisat) (.*);/i
1772
+ // TechniSAT
1773
+ ],
1774
+ [VENDOR, MODEL, [TYPE, SMARTTV]],
1775
+ [
1776
+ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,
1777
+ // Roku
1778
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i
1779
+ // HbbTV devices
1780
+ ],
1781
+ [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]],
1782
+ [
1783
+ /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i
1784
+ // SmartTV from Unidentified Vendors
1785
+ ],
1786
+ [[TYPE, SMARTTV]],
1787
+ [
1788
+ ///////////////////
1789
+ // CONSOLES
1790
+ ///////////////////
1791
+ /(ouya)/i,
1792
+ // Ouya
1793
+ /(nintendo) ([wids3utch]+)/i
1794
+ // Nintendo
1795
+ ],
1796
+ [VENDOR, MODEL, [TYPE, CONSOLE]],
1797
+ [
1798
+ /droid.+; (shield) bui/i
1799
+ // Nvidia
1800
+ ],
1801
+ [MODEL, [VENDOR, "Nvidia"], [TYPE, CONSOLE]],
1802
+ [
1803
+ /(playstation [345portablevi]+)/i
1804
+ // Playstation
1805
+ ],
1806
+ [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]],
1807
+ [
1808
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i
1809
+ // Microsoft Xbox
1810
+ ],
1811
+ [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]],
1812
+ [
1813
+ ///////////////////
1814
+ // WEARABLES
1815
+ ///////////////////
1816
+ /((pebble))app/i
1817
+ // Pebble
1818
+ ],
1819
+ [VENDOR, MODEL, [TYPE, WEARABLE]],
1820
+ [
1821
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i
1822
+ // Apple Watch
1823
+ ],
1824
+ [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]],
1825
+ [
1826
+ /droid.+; (glass) \d/i
1827
+ // Google Glass
1828
+ ],
1829
+ [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]],
1830
+ [
1831
+ /droid.+; (wt63?0{2,3})\)/i
1832
+ ],
1833
+ [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]],
1834
+ [
1835
+ /(quest( 2| pro)?)/i
1836
+ // Oculus Quest
1837
+ ],
1838
+ [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]],
1839
+ [
1840
+ ///////////////////
1841
+ // EMBEDDED
1842
+ ///////////////////
1843
+ /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i
1844
+ // Tesla
1845
+ ],
1846
+ [VENDOR, [TYPE, EMBEDDED]],
1847
+ [
1848
+ /(aeobc)\b/i
1849
+ // Echo Dot
1850
+ ],
1851
+ [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]],
1852
+ [
1853
+ ////////////////////
1854
+ // MIXED (GENERIC)
1855
+ ///////////////////
1856
+ /droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i
1857
+ // Android Phones from Unidentified Vendors
1858
+ ],
1859
+ [MODEL, [TYPE, MOBILE]],
1860
+ [
1861
+ /droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i
1862
+ // Android Tablets from Unidentified Vendors
1863
+ ],
1864
+ [MODEL, [TYPE, TABLET]],
1865
+ [
1866
+ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i
1867
+ // Unidentifiable Tablet
1868
+ ],
1869
+ [[TYPE, TABLET]],
1870
+ [
1871
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i
1872
+ // Unidentifiable Mobile
1873
+ ],
1874
+ [[TYPE, MOBILE]],
1875
+ [
1876
+ /(android[-\w\. ]{0,9});.+buil/i
1877
+ // Generic Android Device
1878
+ ],
1879
+ [MODEL, [VENDOR, "Generic"]]
1880
+ ],
1881
+ engine: [
1882
+ [
1883
+ /windows.+ edge\/([\w\.]+)/i
1884
+ // EdgeHTML
1885
+ ],
1886
+ [VERSION, [NAME, EDGE + "HTML"]],
1887
+ [
1888
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i
1889
+ // Blink
1890
+ ],
1891
+ [VERSION, [NAME, "Blink"]],
1892
+ [
1893
+ /(presto)\/([\w\.]+)/i,
1894
+ // Presto
1895
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
1896
+ // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
1897
+ /ekioh(flow)\/([\w\.]+)/i,
1898
+ // Flow
1899
+ /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,
1900
+ // KHTML/Tasman/Links
1901
+ /(icab)[\/ ]([23]\.[\d\.]+)/i,
1902
+ // iCab
1903
+ /\b(libweb)/i
1904
+ ],
1905
+ [NAME, VERSION],
1906
+ [
1907
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i
1908
+ // Gecko
1909
+ ],
1910
+ [VERSION, NAME]
1911
+ ],
1912
+ os: [
1913
+ [
1914
+ // Windows
1915
+ /microsoft (windows) (vista|xp)/i
1916
+ // Windows (iTunes)
1917
+ ],
1918
+ [NAME, VERSION],
1919
+ [
1920
+ /(windows) nt 6\.2; (arm)/i,
1921
+ // Windows RT
1922
+ /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i,
1923
+ // Windows Phone
1924
+ /(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i
1925
+ ],
1926
+ [NAME, [VERSION, strMapper, windowsVersionMap]],
1927
+ [
1928
+ /(win(?=3|9|n)|win 9x )([nt\d\.]+)/i
1929
+ ],
1930
+ [[NAME, "Windows"], [VERSION, strMapper, windowsVersionMap]],
1931
+ [
1932
+ // iOS/macOS
1933
+ /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i,
1934
+ // iOS
1935
+ /ios;fbsv\/([\d\.]+)/i,
1936
+ /cfnetwork\/.+darwin/i
1937
+ ],
1938
+ [[VERSION, /_/g, "."], [NAME, "iOS"]],
1939
+ [
1940
+ /(mac os x) ?([\w\. ]*)/i,
1941
+ /(macintosh|mac_powerpc\b)(?!.+haiku)/i
1942
+ // Mac OS
1943
+ ],
1944
+ [[NAME, MAC_OS], [VERSION, /_/g, "."]],
1945
+ [
1946
+ // Mobile OSes
1947
+ /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i
1948
+ // Android-x86/HarmonyOS
1949
+ ],
1950
+ [VERSION, NAME],
1951
+ [
1952
+ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS
1953
+ /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\/ ]?([\w\.]*)/i,
1954
+ /(blackberry)\w*\/([\w\.]*)/i,
1955
+ // Blackberry
1956
+ /(tizen|kaios)[\/ ]([\w\.]+)/i,
1957
+ // Tizen/KaiOS
1958
+ /\((series40);/i
1959
+ // Series 40
1960
+ ],
1961
+ [NAME, VERSION],
1962
+ [
1963
+ /\(bb(10);/i
1964
+ // BlackBerry 10
1965
+ ],
1966
+ [VERSION, [NAME, BLACKBERRY]],
1967
+ [
1968
+ /(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i
1969
+ // Symbian
1970
+ ],
1971
+ [VERSION, [NAME, "Symbian"]],
1972
+ [
1973
+ /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i
1974
+ // Firefox OS
1975
+ ],
1976
+ [VERSION, [NAME, FIREFOX + " OS"]],
1977
+ [
1978
+ /web0s;.+rt(tv)/i,
1979
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i
1980
+ // WebOS
1981
+ ],
1982
+ [VERSION, [NAME, "webOS"]],
1983
+ [
1984
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i
1985
+ // watchOS
1986
+ ],
1987
+ [VERSION, [NAME, "watchOS"]],
1988
+ [
1989
+ // Google Chromecast
1990
+ /crkey\/([\d\.]+)/i
1991
+ // Google Chromecast
1992
+ ],
1993
+ [VERSION, [NAME, CHROME + "cast"]],
1994
+ [
1995
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i
1996
+ // Chromium OS
1997
+ ],
1998
+ [[NAME, CHROMIUM_OS], VERSION],
1999
+ [
2000
+ // Smart TVs
2001
+ /panasonic;(viera)/i,
2002
+ // Panasonic Viera
2003
+ /(netrange)mmh/i,
2004
+ // Netrange
2005
+ /(nettv)\/(\d+\.[\w\.]+)/i,
2006
+ // NetTV
2007
+ // Console
2008
+ /(nintendo|playstation) ([wids345portablevuch]+)/i,
2009
+ // Nintendo/Playstation
2010
+ /(xbox); +xbox ([^\);]+)/i,
2011
+ // Microsoft Xbox (360, One, X, S, Series X, Series S)
2012
+ // Other
2013
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
2014
+ // Joli/Palm
2015
+ /(mint)[\/\(\) ]?(\w*)/i,
2016
+ // Mint
2017
+ /(mageia|vectorlinux)[; ]/i,
2018
+ // Mageia/VectorLinux
2019
+ /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
2020
+ // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
2021
+ /(hurd|linux) ?([\w\.]*)/i,
2022
+ // Hurd/Linux
2023
+ /(gnu) ?([\w\.]*)/i,
2024
+ // GNU
2025
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
2026
+ // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
2027
+ /(haiku) (\w+)/i
2028
+ // Haiku
2029
+ ],
2030
+ [NAME, VERSION],
2031
+ [
2032
+ /(sunos) ?([\w\.\d]*)/i
2033
+ // Solaris
2034
+ ],
2035
+ [[NAME, "Solaris"], VERSION],
2036
+ [
2037
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
2038
+ // Solaris
2039
+ /(aix) ((\d)(?=\.|\)| )[\w\.])*/i,
2040
+ // AIX
2041
+ /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i,
2042
+ // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
2043
+ /(unix) ?([\w\.]*)/i
2044
+ // UNIX
2045
+ ],
2046
+ [NAME, VERSION]
2047
+ ]
2048
+ };
2049
+ var UAParser = function(ua, extensions) {
2050
+ if (typeof ua === OBJ_TYPE) {
2051
+ extensions = ua;
2052
+ ua = undefined$1;
2053
+ }
2054
+ if (!(this instanceof UAParser)) {
2055
+ return new UAParser(ua, extensions).getResult();
2056
+ }
2057
+ var _navigator = typeof window2 !== UNDEF_TYPE && window2.navigator ? window2.navigator : undefined$1;
2058
+ var _ua = ua || (_navigator && _navigator.userAgent ? _navigator.userAgent : EMPTY);
2059
+ var _uach = _navigator && _navigator.userAgentData ? _navigator.userAgentData : undefined$1;
2060
+ var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
2061
+ var _isSelfNav = _navigator && _navigator.userAgent == _ua;
2062
+ this.getBrowser = function() {
2063
+ var _browser = {};
2064
+ _browser[NAME] = undefined$1;
2065
+ _browser[VERSION] = undefined$1;
2066
+ rgxMapper.call(_browser, _ua, _rgxmap.browser);
2067
+ _browser[MAJOR] = majorize(_browser[VERSION]);
2068
+ if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
2069
+ _browser[NAME] = "Brave";
2070
+ }
2071
+ return _browser;
2072
+ };
2073
+ this.getCPU = function() {
2074
+ var _cpu = {};
2075
+ _cpu[ARCHITECTURE] = undefined$1;
2076
+ rgxMapper.call(_cpu, _ua, _rgxmap.cpu);
2077
+ return _cpu;
2078
+ };
2079
+ this.getDevice = function() {
2080
+ var _device = {};
2081
+ _device[VENDOR] = undefined$1;
2082
+ _device[MODEL] = undefined$1;
2083
+ _device[TYPE] = undefined$1;
2084
+ rgxMapper.call(_device, _ua, _rgxmap.device);
2085
+ if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {
2086
+ _device[TYPE] = MOBILE;
2087
+ }
2088
+ if (_isSelfNav && _device[MODEL] == "Macintosh" && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
2089
+ _device[MODEL] = "iPad";
2090
+ _device[TYPE] = TABLET;
2091
+ }
2092
+ return _device;
2093
+ };
2094
+ this.getEngine = function() {
2095
+ var _engine = {};
2096
+ _engine[NAME] = undefined$1;
2097
+ _engine[VERSION] = undefined$1;
2098
+ rgxMapper.call(_engine, _ua, _rgxmap.engine);
2099
+ return _engine;
2100
+ };
2101
+ this.getOS = function() {
2102
+ var _os = {};
2103
+ _os[NAME] = undefined$1;
2104
+ _os[VERSION] = undefined$1;
2105
+ rgxMapper.call(_os, _ua, _rgxmap.os);
2106
+ if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != "Unknown") {
2107
+ _os[NAME] = _uach.platform.replace(/chrome os/i, CHROMIUM_OS).replace(/macos/i, MAC_OS);
2108
+ }
2109
+ return _os;
2110
+ };
2111
+ this.getResult = function() {
2112
+ return {
2113
+ ua: this.getUA(),
2114
+ browser: this.getBrowser(),
2115
+ engine: this.getEngine(),
2116
+ os: this.getOS(),
2117
+ device: this.getDevice(),
2118
+ cpu: this.getCPU()
2119
+ };
2120
+ };
2121
+ this.getUA = function() {
2122
+ return _ua;
2123
+ };
2124
+ this.setUA = function(ua2) {
2125
+ _ua = typeof ua2 === STR_TYPE && ua2.length > UA_MAX_LENGTH ? trim(ua2, UA_MAX_LENGTH) : ua2;
2126
+ return this;
2127
+ };
2128
+ this.setUA(_ua);
2129
+ return this;
2130
+ };
2131
+ UAParser.VERSION = LIBVERSION;
2132
+ UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);
2133
+ UAParser.CPU = enumerize([ARCHITECTURE]);
2134
+ UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
2135
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
2136
+ {
2137
+ if (module2.exports) {
2138
+ exports2 = module2.exports = UAParser;
2139
+ }
2140
+ exports2.UAParser = UAParser;
2141
+ }
2142
+ var $ = typeof window2 !== UNDEF_TYPE && (window2.jQuery || window2.Zepto);
2143
+ if ($ && !$.ua) {
2144
+ var parser = new UAParser();
2145
+ $.ua = parser.getResult();
2146
+ $.ua.get = function() {
2147
+ return parser.getUA();
2148
+ };
2149
+ $.ua.set = function(ua) {
2150
+ parser.setUA(ua);
2151
+ var result = parser.getResult();
2152
+ for (var prop in result) {
2153
+ $.ua[prop] = result[prop];
2154
+ }
2155
+ };
2156
+ }
2157
+ })(typeof window === "object" ? window : commonjsGlobal);
2158
+ })(uaParser, uaParser.exports);
2159
+ var __defProp2 = Object.defineProperty;
2160
+ var __defNormalProp2 = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2161
+ var __publicField2 = (obj, key, value) => {
2162
+ __defNormalProp2(obj, typeof key !== "symbol" ? key + "" : key, value);
2163
+ return value;
2164
+ };
2165
+ const Browser = {
2166
+ UNKNOWN: "Unknown",
2167
+ SAFARI: "Safari",
2168
+ FIREFOX: "Firefox",
2169
+ OPERA: "Opera",
2170
+ CHROME: "Chrome",
2171
+ IOS_WEBVIEW: "iOS-webview"
2172
+ };
2173
+ class BrowserUtils {
2174
+ static getName() {
2175
+ if (!this._name) {
2176
+ if (typeof navigator === "undefined" || !navigator) {
2177
+ this._name = Browser.UNKNOWN;
2178
+ } else {
2179
+ const { userAgent } = navigator;
2180
+ if (userAgent.match(/Firefox/i)) {
2181
+ this._name = Browser.FIREFOX;
2182
+ } else if (userAgent.match(/(Opera|OPR)/i)) {
2183
+ this._name = Browser.OPERA;
2184
+ } else if (userAgent.match(/Chrome/i)) {
2185
+ this._name = Browser.CHROME;
2186
+ } else if (userAgent.match(/Safari/i)) {
2187
+ this._name = Browser.SAFARI;
2188
+ } else if (userAgent.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Version)/i)) {
2189
+ this._name = Browser.IOS_WEBVIEW;
2190
+ } else {
2191
+ this._name = Browser.UNKNOWN;
2192
+ }
2193
+ }
2194
+ }
2195
+ return this._name;
2196
+ }
2197
+ static get isMobile() {
2198
+ if (this._isMobile === null) {
2199
+ this._isMobile = false;
2200
+ if (typeof navigator !== "undefined" && navigator) {
2201
+ const userAgent = navigator.userAgent || navigator.vendor;
2202
+ if (userAgent && (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(userAgent.substr(0, 4)))) {
2203
+ this._isMobile = true;
2204
+ }
2205
+ }
2206
+ }
2207
+ return this._isMobile;
2208
+ }
2209
+ static clearCache() {
2210
+ this._name = null;
2211
+ this._isMobile = null;
2212
+ }
2213
+ }
2214
+ __publicField2(BrowserUtils, "_name", null);
2215
+ __publicField2(BrowserUtils, "_isMobile", null);
2216
+ const QUALITATIVE_COLORS = [
2217
+ 4215763,
2218
+ 14529296,
2219
+ 11869460,
2220
+ 48895,
2221
+ 16468400,
2222
+ 45661,
2223
+ 13290186
2224
+ ];
2225
+ function getQualitativeColor(number) {
2226
+ return QUALITATIVE_COLORS[number % QUALITATIVE_COLORS.length];
2227
+ }
2228
+ const ColorUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2229
+ __proto__: null,
2230
+ getQualitativeColor
2231
+ }, Symbol.toStringTag, { value: "Module" }));
917
2232
  const _GraphRouterOptionsBuilder = class _GraphRouterOptionsBuilder {
918
2233
  constructor() {
919
2234
  __publicField(this, "avoidStairs", false);
@@ -1146,19 +2461,47 @@ class GraphRouterEngine {
1146
2461
  components.push([vertexToTest, ...reachedVertices]);
1147
2462
  reachedVertices.forEach((rv) => verticesToTest.delete(rv));
1148
2463
  }
1149
- for (let i = 0; i < components.length - 1; i++) {
1150
- const component1 = components[i];
1151
- for (let j = i + 1; j < components.length; j++) {
1152
- const component2 = components[j];
1153
- const componentsIntersect = component2.some((v) => component1.includes(v));
1154
- if (componentsIntersect) {
1155
- component1.push(...component2);
1156
- components = components.filter((component) => component !== component2);
2464
+ let hasChanged;
2465
+ do {
2466
+ hasChanged = false;
2467
+ for (let i = 0; i < components.length - 1; i++) {
2468
+ const component1 = components[i];
2469
+ for (let j = i + 1; j < components.length; j++) {
2470
+ const component2 = components[j];
2471
+ const componentsIntersect = component2.some((v) => component1.includes(v));
2472
+ if (componentsIntersect) {
2473
+ component1.push(...component2);
2474
+ components = components.filter((component) => component !== component2);
2475
+ hasChanged = true;
2476
+ }
1157
2477
  }
1158
2478
  }
1159
- }
2479
+ } while (hasChanged);
1160
2480
  return components.map((c) => [...new Set(c)]);
1161
2481
  }
2482
+ toGeoJson() {
2483
+ const components = this.calculateComponents();
2484
+ const features = components.map((component, i) => {
2485
+ const edges = this.graph.edges.filter((edge) => component.includes(edge.vertex1) && component.includes(edge.vertex2));
2486
+ return {
2487
+ "type": "Feature",
2488
+ "geometry": {
2489
+ "type": "MultiLineString",
2490
+ "coordinates": edges.map((e) => [
2491
+ [e.vertex1.coords.lng, e.vertex1.coords.lat],
2492
+ [e.vertex2.coords.lng, e.vertex2.coords.lat]
2493
+ ])
2494
+ },
2495
+ "properties": {
2496
+ "stroke": "#" + ColorUtils.getQualitativeColor(i).toString(16)
2497
+ }
2498
+ };
2499
+ });
2500
+ return {
2501
+ "type": "FeatureCollection",
2502
+ "features": features
2503
+ };
2504
+ }
1162
2505
  }
1163
2506
  class GraphRouterResults extends GraphRouterEngineResults {
1164
2507
  constructor(engineResults, sourceProjection, targetsProjections) {
@@ -2712,8 +4055,20 @@ class CustomNetworkMap {
2712
4055
  };
2713
4056
  }
2714
4057
  }
2715
- static fromOsmXml(osmXmlString, name = null) {
2716
- const osmModel = osm.OsmParser.parseOsmXmlString(osmXmlString);
4058
+ static fromOsmXml(osmXmlString, name = null, callbackErrors) {
4059
+ const errors = {
4060
+ couldNotParseFile: false,
4061
+ routingIoNotFound: [],
4062
+ routingBoundsNotFound: false
4063
+ };
4064
+ let osmModel;
4065
+ try {
4066
+ osmModel = osm.OsmParser.parseOsmXmlString(osmXmlString);
4067
+ } catch (e) {
4068
+ errors.couldNotParseFile = true;
4069
+ callbackErrors == null ? void 0 : callbackErrors(errors);
4070
+ return;
4071
+ }
2717
4072
  let verticesMapping = [];
2718
4073
  const graph = OsmGraphUtils.createGraphFromOsmModel(osmModel, OsmGraphUtils.DEFAULT_WAY_SELECTOR, (vm) => verticesMapping = vm);
2719
4074
  const entryPointsOsmNodes = osmModel.nodes.filter((node) => node.tags["wemap:routing-io"]);
@@ -2721,7 +4076,7 @@ class CustomNetworkMap {
2721
4076
  var _a;
2722
4077
  const vertex = (_a = verticesMapping.find((v) => v[0] === node.id)) == null ? void 0 : _a[1];
2723
4078
  if (!vertex) {
2724
- Logger.warn(`Could not parse this wemap:routing-io correctly: ${JSON.stringify(node.coords.toJson())}`);
4079
+ errors.routingIoNotFound.push(node);
2725
4080
  }
2726
4081
  return vertex || null;
2727
4082
  });
@@ -2744,8 +4099,9 @@ class CustomNetworkMap {
2744
4099
  polygon && bounds.coordinates.push(polygon.coordinates);
2745
4100
  });
2746
4101
  if (!bounds.coordinates.length) {
2747
- throw new Error('Search bounds is undefined. Please use OSM tag : "wemap:routing-bounds=yes"');
4102
+ errors.routingBoundsNotFound = true;
2748
4103
  }
4104
+ callbackErrors == null ? void 0 : callbackErrors(errors);
2749
4105
  return new CustomNetworkMap(graph, entryPoints, bounds, name);
2750
4106
  }
2751
4107
  isPointInside(coordinates) {
@@ -2822,6 +4178,54 @@ class CustomNetworkMap {
2822
4178
  return this.router.calculateShortestPathToMultipleDestinations(start, ends, options);
2823
4179
  }
2824
4180
  }
4181
+ class CustomNetworkMapTester {
4182
+ static createReport(osmXmlString) {
4183
+ var _a;
4184
+ let customNetworkMapErrors;
4185
+ const networkMap = CustomNetworkMap.fromOsmXml(osmXmlString, null, (e) => customNetworkMapErrors = e);
4186
+ const errors = [];
4187
+ if ((customNetworkMapErrors == null ? void 0 : customNetworkMapErrors.couldNotParseFile) || !networkMap) {
4188
+ errors.push({
4189
+ type: "could-not-parse-file"
4190
+ });
4191
+ return { errors };
4192
+ }
4193
+ const components = networkMap.router.calculateComponents();
4194
+ if (components.length > 1) {
4195
+ errors.push({
4196
+ type: "multiple-graph-components",
4197
+ data: components
4198
+ });
4199
+ }
4200
+ if (customNetworkMapErrors == null ? void 0 : customNetworkMapErrors.routingBoundsNotFound) {
4201
+ errors.push({
4202
+ type: "routing-bounds-not-found"
4203
+ });
4204
+ }
4205
+ if ((_a = customNetworkMapErrors == null ? void 0 : customNetworkMapErrors.routingIoNotFound) == null ? void 0 : _a.length) {
4206
+ errors.push({
4207
+ type: "routing-io-not-on-graph",
4208
+ data: customNetworkMapErrors.routingIoNotFound
4209
+ });
4210
+ }
4211
+ return { graph: networkMap.graph, errors };
4212
+ }
4213
+ static reportToJson(report) {
4214
+ var _a;
4215
+ return {
4216
+ graph: (_a = report.graph) == null ? void 0 : _a.toCompressedJson(),
4217
+ errors: report.errors.map((error) => {
4218
+ if (error.type === "multiple-graph-components") {
4219
+ return { type: error.type, data: error.data.map((c) => c.map((v) => v.id)) };
4220
+ }
4221
+ if (error.type === "routing-io-not-on-graph") {
4222
+ return { type: error.type, data: error.data.map((v) => v.id) };
4223
+ }
4224
+ return { type: error.type };
4225
+ })
4226
+ };
4227
+ }
4228
+ }
2825
4229
  class ItineraryInfoManager {
2826
4230
  constructor(itinerary = null) {
2827
4231
  __publicField(this, "_itinerary", null);
@@ -2923,6 +4327,7 @@ class ItineraryInfoManager {
2923
4327
  }
2924
4328
  exports.CitywayRemoteRouter = CitywayRemoteRouter$1;
2925
4329
  exports.CustomNetworkMap = CustomNetworkMap;
4330
+ exports.CustomNetworkMapTester = CustomNetworkMapTester;
2926
4331
  exports.DeutscheBahnRemoteRouter = DeutscheBahnRemoteRouter$1;
2927
4332
  exports.Edge = Edge;
2928
4333
  exports.Graph = Graph;