@incodetech/core 0.0.0-dev-20260205-bb46959 → 0.0.0-dev-20260206-cd4d6ec

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/OpenViduLogger-B6-UWyJe.esm.js +3 -0
  2. package/dist/{OpenViduLogger-XKcjntVs.esm.js → OpenViduLogger-DrE4_cHh.esm.js} +1 -1
  3. package/dist/{deepsightLoader-CGdK3U_s.esm.js → deepsightLoader-CHzDt5p2.esm.js} +4 -4
  4. package/dist/{deepsightService-BqN04Xvz.esm.js → deepsightService-C_AyxXhJ.esm.js} +9 -46
  5. package/dist/{deepsightService-C-8SR9TZ.d.ts → deepsightService-D8qaikEi.d.ts} +1 -1
  6. package/dist/email.d.ts +1 -1
  7. package/dist/email.esm.js +4 -4
  8. package/dist/{endpoints-CmGlc9UG.esm.js → endpoints-Q2cBwc8v.esm.js} +3 -0
  9. package/dist/{events-CLVaKe2J.esm.js → events-BN5bIhsN.esm.js} +2 -2
  10. package/dist/face-match.d.ts +227 -0
  11. package/dist/face-match.esm.js +312 -0
  12. package/dist/flow.d.ts +2 -2
  13. package/dist/flow.esm.js +5 -5
  14. package/dist/{id-DE76bgjS.esm.js → id-B6VREnGU.esm.js} +54 -172
  15. package/dist/id.d.ts +4 -4
  16. package/dist/id.esm.js +8 -8
  17. package/dist/{index-aadmCg5s.d.ts → index-BOpNqAs7.d.ts} +3 -3
  18. package/dist/index.d.ts +6 -4
  19. package/dist/index.esm.js +9 -9
  20. package/dist/{lib-Cmee0CBZ.esm.js → lib-ieMlAKG1.esm.js} +2 -2
  21. package/dist/phone.d.ts +1 -1
  22. package/dist/phone.esm.js +4 -4
  23. package/dist/selfie.d.ts +3 -3
  24. package/dist/selfie.esm.js +8 -8
  25. package/dist/{src-BEaVRVtC.esm.js → src-B0UBQ8zw.esm.js} +2943 -26
  26. package/dist/{stats-onWUN0tY.esm.js → stats-CpcCA-Ml.esm.js} +1 -1
  27. package/dist/stats.esm.js +2 -2
  28. package/dist/{streamingEvents-EcGvh3bl.esm.js → streamingEvents-DhMoimL8.esm.js} +3 -4
  29. package/package.json +5 -1
  30. package/dist/OpenViduLogger-Cu0BjUgP.esm.js +0 -3
  31. /package/dist/{Manager-WTb99jnh.d.ts → Manager-CWwvSZqZ.d.ts} +0 -0
  32. /package/dist/{api-DfRLAneb.esm.js → api-BkkE6cfa.esm.js} +0 -0
  33. /package/dist/{chunk-V5DOKNPJ.esm.js → chunk-CiY78uGR.esm.js} +0 -0
  34. /package/dist/{types-CflhN94Q.d.ts → types-BHcijCvX.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { a as __toDynamicImportESM } from "./chunk-V5DOKNPJ.esm.js";
1
+ import { a as __toDynamicImportESM } from "./chunk-CiY78uGR.esm.js";
2
2
 
3
3
  //#region ../infra/src/capabilities/platform.ts
4
4
  /**
@@ -76,6 +76,1658 @@ function isIPhone14OrHigher() {
76
76
  return IPHONE_14_PLUS_DIMENSIONS.some((dims) => dims.outerHeight === outerHeight && dims.outerWidth === outerWidth || dims.innerHeight === innerHeight && dims.innerWidth === innerWidth);
77
77
  }
78
78
 
79
+ //#endregion
80
+ //#region ../infra/src/device/getBrowser.ts
81
+ function getUserAgent() {
82
+ if (typeof navigator === "undefined") return "";
83
+ return navigator.userAgent;
84
+ }
85
+
86
+ //#endregion
87
+ //#region ../infra/src/device/getDeviceClass.ts
88
+ function getDeviceInfo() {
89
+ if (typeof navigator === "undefined") return {
90
+ userAgent: "",
91
+ platform: "",
92
+ maxTouchPoints: 0
93
+ };
94
+ return {
95
+ userAgent: navigator.userAgent,
96
+ platform: navigator.platform,
97
+ maxTouchPoints: navigator.maxTouchPoints
98
+ };
99
+ }
100
+ /**
101
+ * Gets the current window dimensions.
102
+ * Returns default values (1280x720) in non-browser environments.
103
+ */
104
+ function getWindowDimensions(defaultWidth = 1280, defaultHeight = 720) {
105
+ if (typeof window === "undefined") return {
106
+ outerWidth: defaultWidth,
107
+ outerHeight: defaultHeight,
108
+ innerWidth: defaultWidth,
109
+ innerHeight: defaultHeight
110
+ };
111
+ return {
112
+ outerWidth: window.outerWidth,
113
+ outerHeight: window.outerHeight,
114
+ innerWidth: window.innerWidth,
115
+ innerHeight: window.innerHeight
116
+ };
117
+ }
118
+
119
+ //#endregion
120
+ //#region ../../node_modules/.pnpm/ua-parser-js@2.0.9/node_modules/ua-parser-js/src/main/ua-parser.mjs
121
+ var LIBVERSION = "2.0.9", UA_MAX_LENGTH = 500, USER_AGENT = "user-agent", EMPTY = "", UNKNOWN = "?", TYPEOF = {
122
+ FUNCTION: "function",
123
+ OBJECT: "object",
124
+ STRING: "string",
125
+ UNDEFINED: "undefined"
126
+ }, BROWSER = "browser", CPU = "cpu", DEVICE = "device", ENGINE = "engine", OS = "os", RESULT = "result", NAME = "name", TYPE = "type", VENDOR = "vendor", VERSION = "version", ARCHITECTURE = "architecture", MAJOR = "major", MODEL = "model", CONSOLE = "console", MOBILE = "mobile", TABLET = "tablet", SMARTTV = "smarttv", WEARABLE = "wearable", XR = "xr", EMBEDDED = "embedded", FETCHER = "fetcher", INAPP = "inapp", BRANDS = "brands", FORMFACTORS = "formFactors", FULLVERLIST = "fullVersionList", PLATFORM = "platform", PLATFORMVER = "platformVersion", BITNESS = "bitness", CH = "sec-ch-ua", CH_FULL_VER_LIST = CH + "-full-version-list", CH_ARCH = CH + "-arch", CH_BITNESS = CH + "-" + BITNESS, CH_FORM_FACTORS = CH + "-form-factors", CH_MOBILE = CH + "-" + MOBILE, CH_MODEL = CH + "-" + MODEL, CH_PLATFORM = CH + "-" + PLATFORM, CH_PLATFORM_VER = CH_PLATFORM + "-version", CH_ALL_VALUES = [
127
+ BRANDS,
128
+ FULLVERLIST,
129
+ MOBILE,
130
+ MODEL,
131
+ PLATFORM,
132
+ PLATFORMVER,
133
+ ARCHITECTURE,
134
+ FORMFACTORS,
135
+ BITNESS
136
+ ], AMAZON = "Amazon", APPLE = "Apple", ASUS = "ASUS", BLACKBERRY = "BlackBerry", GOOGLE = "Google", HUAWEI = "Huawei", LENOVO = "Lenovo", HONOR = "Honor", LG = "LG", MICROSOFT = "Microsoft", MOTOROLA = "Motorola", NVIDIA = "Nvidia", ONEPLUS = "OnePlus", OPPO = "OPPO", SAMSUNG = "Samsung", SHARP = "Sharp", SONY = "Sony", XIAOMI = "Xiaomi", ZEBRA = "Zebra", CHROME = "Chrome", CHROMIUM = "Chromium", CHROMECAST = "Chromecast", EDGE = "Edge", FIREFOX = "Firefox", OPERA = "Opera", FACEBOOK = "Facebook", SOGOU = "Sogou", PREFIX_MOBILE = "Mobile ", SUFFIX_BROWSER = " Browser", WINDOWS = "Windows";
137
+ var NAVIGATOR = typeof window !== TYPEOF.UNDEFINED && window.navigator ? window.navigator : void 0, NAVIGATOR_UADATA = NAVIGATOR && NAVIGATOR.userAgentData ? NAVIGATOR.userAgentData : void 0;
138
+ var extend = function(defaultRgx, extensions) {
139
+ var mergedRgx = {};
140
+ var extraRgx = extensions;
141
+ if (!isExtensions(extensions)) {
142
+ extraRgx = {};
143
+ for (var i in extensions) for (var j$1 in extensions[i]) extraRgx[j$1] = extensions[i][j$1].concat(extraRgx[j$1] ? extraRgx[j$1] : []);
144
+ }
145
+ for (var k$1 in defaultRgx) mergedRgx[k$1] = extraRgx[k$1] && extraRgx[k$1].length % 2 === 0 ? extraRgx[k$1].concat(defaultRgx[k$1]) : defaultRgx[k$1];
146
+ return mergedRgx;
147
+ }, enumerize = function(arr) {
148
+ var enums = {};
149
+ for (var i = 0; i < arr.length; i++) enums[arr[i].toUpperCase()] = arr[i];
150
+ return enums;
151
+ }, has = function(str1, str2) {
152
+ if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
153
+ for (var i in str1) if (lowerize(str2) == lowerize(str1[i])) return true;
154
+ return false;
155
+ }
156
+ return isString(str1) ? lowerize(str2) == lowerize(str1) : false;
157
+ }, isExtensions = function(obj, deep) {
158
+ for (var prop in obj) return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
159
+ }, isString = function(val) {
160
+ return typeof val === TYPEOF.STRING;
161
+ }, itemListToArray = function(header) {
162
+ if (!header) return void 0;
163
+ var arr = [];
164
+ var tokens = strip(/\\?\"/g, header).split(",");
165
+ for (var i = 0; i < tokens.length; i++) if (tokens[i].indexOf(";") > -1) {
166
+ var token = trim(tokens[i]).split(";v=");
167
+ arr[i] = {
168
+ brand: token[0],
169
+ version: token[1]
170
+ };
171
+ } else arr[i] = trim(tokens[i]);
172
+ return arr;
173
+ }, lowerize = function(str) {
174
+ return isString(str) ? str.toLowerCase() : str;
175
+ }, majorize = function(version) {
176
+ return isString(version) ? strip(/[^\d\.]/g, version).split(".")[0] : void 0;
177
+ }, setProps = function(arr) {
178
+ for (var i in arr) {
179
+ if (!arr.hasOwnProperty(i)) continue;
180
+ var propName = arr[i];
181
+ if (typeof propName == TYPEOF.OBJECT && propName.length == 2) this[propName[0]] = propName[1];
182
+ else this[propName] = void 0;
183
+ }
184
+ return this;
185
+ }, strip = function(pattern, str) {
186
+ return isString(str) ? str.replace(pattern, EMPTY) : str;
187
+ }, stripQuotes = function(str) {
188
+ return strip(/\\?\"/g, str);
189
+ }, trim = function(str, len) {
190
+ str = strip(/^\s\s*/, String(str));
191
+ return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
192
+ };
193
+ var rgxMapper = function(ua, arrays) {
194
+ if (!ua || !arrays) return;
195
+ var i = 0, j$1, k$1, p$1, q$1, matches, match;
196
+ while (i < arrays.length && !matches) {
197
+ var regex = arrays[i], props = arrays[i + 1];
198
+ j$1 = k$1 = 0;
199
+ while (j$1 < regex.length && !matches) {
200
+ if (!regex[j$1]) break;
201
+ matches = regex[j$1++].exec(ua);
202
+ if (!!matches) for (p$1 = 0; p$1 < props.length; p$1++) {
203
+ match = matches[++k$1];
204
+ q$1 = props[p$1];
205
+ if (typeof q$1 === TYPEOF.OBJECT && q$1.length > 0) {
206
+ if (q$1.length === 2) if (typeof q$1[1] == TYPEOF.FUNCTION) this[q$1[0]] = q$1[1].call(this, match);
207
+ else this[q$1[0]] = q$1[1];
208
+ else if (q$1.length >= 3) {
209
+ if (typeof q$1[1] === TYPEOF.FUNCTION && !(q$1[1].exec && q$1[1].test)) if (q$1.length > 3) this[q$1[0]] = match ? q$1[1].apply(this, q$1.slice(2)) : void 0;
210
+ else this[q$1[0]] = match ? q$1[1].call(this, match, q$1[2]) : void 0;
211
+ else if (q$1.length == 3) this[q$1[0]] = match ? match.replace(q$1[1], q$1[2]) : void 0;
212
+ else if (q$1.length == 4) this[q$1[0]] = match ? q$1[3].call(this, match.replace(q$1[1], q$1[2])) : void 0;
213
+ else if (q$1.length > 4) this[q$1[0]] = match ? q$1[3].apply(this, [match.replace(q$1[1], q$1[2])].concat(q$1.slice(4))) : void 0;
214
+ }
215
+ } else this[q$1] = match ? match : void 0;
216
+ }
217
+ }
218
+ i += 2;
219
+ }
220
+ }, strMapper = function(str, map) {
221
+ for (var i in map) if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
222
+ for (var j$1 = 0; j$1 < map[i].length; j$1++) if (has(map[i][j$1], str)) return i === UNKNOWN ? void 0 : i;
223
+ } else if (has(map[i], str)) return i === UNKNOWN ? void 0 : i;
224
+ return map.hasOwnProperty("*") ? map["*"] : str;
225
+ };
226
+ var windowsVersionMap = {
227
+ "ME": "4.90",
228
+ "NT 3.51": "3.51",
229
+ "NT 4.0": "4.0",
230
+ "2000": ["5.0", "5.01"],
231
+ "XP": ["5.1", "5.2"],
232
+ "Vista": "6.0",
233
+ "7": "6.1",
234
+ "8": "6.2",
235
+ "8.1": "6.3",
236
+ "10": ["6.4", "10.0"],
237
+ "NT": ""
238
+ }, formFactorsMap = {
239
+ "embedded": "Automotive",
240
+ "mobile": "Mobile",
241
+ "tablet": ["Tablet", "EInk"],
242
+ "smarttv": "TV",
243
+ "wearable": "Watch",
244
+ "xr": ["VR", "XR"],
245
+ "?": ["Desktop", "Unknown"],
246
+ "*": void 0
247
+ }, browserHintsMap = {
248
+ "Chrome": "Google Chrome",
249
+ "Edge": "Microsoft Edge",
250
+ "Edge WebView2": "Microsoft Edge WebView2",
251
+ "Chrome WebView": "Android WebView",
252
+ "Chrome Headless": "HeadlessChrome",
253
+ "Huawei Browser": "HuaweiBrowser",
254
+ "MIUI Browser": "Miui Browser",
255
+ "Opera Mobi": "OperaMobile",
256
+ "Yandex": "YaBrowser"
257
+ };
258
+ var defaultRegexes = {
259
+ browser: [
260
+ [/\b(?:crmo|crios)\/([\w\.]+)/i],
261
+ [VERSION, [NAME, PREFIX_MOBILE + "Chrome"]],
262
+ [/webview.+edge\/([\w\.]+)/i],
263
+ [VERSION, [NAME, EDGE + " WebView"]],
264
+ [/edg(?:e|ios|a)?\/([\w\.]+)/i],
265
+ [VERSION, [NAME, "Edge"]],
266
+ [
267
+ /(opera mini)\/([-\w\.]+)/i,
268
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
269
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
270
+ ],
271
+ [NAME, VERSION],
272
+ [/opios[\/ ]+([\w\.]+)/i],
273
+ [VERSION, [NAME, OPERA + " Mini"]],
274
+ [/\bop(?:rg)?x\/([\w\.]+)/i],
275
+ [VERSION, [NAME, OPERA + " GX"]],
276
+ [/\bopr\/([\w\.]+)/i],
277
+ [VERSION, [NAME, OPERA]],
278
+ [/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],
279
+ [VERSION, [NAME, "Baidu"]],
280
+ [/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],
281
+ [VERSION, [NAME, "Maxthon"]],
282
+ [
283
+ /(kindle)\/([\w\.]+)/i,
284
+ /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
285
+ /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,
286
+ /(?:ms|\()(ie) ([\w\.]+)/i,
287
+ /(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,
288
+ /(brave)(?: chrome)?\/([\d\.]+)/i,
289
+ /(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,
290
+ /(qwant)(?:ios|mobile)\/([\d\.]+)/i,
291
+ /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i
292
+ ],
293
+ [NAME, VERSION],
294
+ [/quark(?:pc)?\/([-\w\.]+)/i],
295
+ [VERSION, [NAME, "Quark"]],
296
+ [/\bddg\/([\w\.]+)/i],
297
+ [VERSION, [NAME, "DuckDuckGo"]],
298
+ [/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],
299
+ [VERSION, [NAME, "UCBrowser"]],
300
+ [
301
+ /microm.+\bqbcore\/([\w\.]+)/i,
302
+ /\bqbcore\/([\w\.]+).+microm/i,
303
+ /micromessenger\/([\w\.]+)/i
304
+ ],
305
+ [VERSION, [NAME, "WeChat"]],
306
+ [/konqueror\/([\w\.]+)/i],
307
+ [VERSION, [NAME, "Konqueror"]],
308
+ [/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],
309
+ [VERSION, [NAME, "IE"]],
310
+ [/ya(?:search)?browser\/([\w\.]+)/i],
311
+ [VERSION, [NAME, "Yandex"]],
312
+ [/slbrowser\/([\w\.]+)/i],
313
+ [VERSION, [NAME, "Smart " + LENOVO + SUFFIX_BROWSER]],
314
+ [/(av(?:ast|g|ira))\/([\w\.]+)/i],
315
+ [[
316
+ NAME,
317
+ /(.+)/,
318
+ "$1 Secure" + SUFFIX_BROWSER
319
+ ], VERSION],
320
+ [/norton\/([\w\.]+)/i],
321
+ [VERSION, [NAME, "Norton Private" + SUFFIX_BROWSER]],
322
+ [/\bfocus\/([\w\.]+)/i],
323
+ [VERSION, [NAME, FIREFOX + " Focus"]],
324
+ [/ mms\/([\w\.]+)$/i],
325
+ [VERSION, [NAME, OPERA + " Neon"]],
326
+ [/ opt\/([\w\.]+)$/i],
327
+ [VERSION, [NAME, OPERA + " Touch"]],
328
+ [/coc_coc\w+\/([\w\.]+)/i],
329
+ [VERSION, [NAME, "Coc Coc"]],
330
+ [/dolfin\/([\w\.]+)/i],
331
+ [VERSION, [NAME, "Dolphin"]],
332
+ [/coast\/([\w\.]+)/i],
333
+ [VERSION, [NAME, OPERA + " Coast"]],
334
+ [/miuibrowser\/([\w\.]+)/i],
335
+ [VERSION, [NAME, "MIUI" + SUFFIX_BROWSER]],
336
+ [/fxios\/([\w\.-]+)/i],
337
+ [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]],
338
+ [/\bqihoobrowser\/?([\w\.]*)/i],
339
+ [VERSION, [NAME, "360"]],
340
+ [/\b(qq)\/([\w\.]+)/i],
341
+ [[
342
+ NAME,
343
+ /(.+)/,
344
+ "$1Browser"
345
+ ], VERSION],
346
+ [/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],
347
+ [[
348
+ NAME,
349
+ /(.+)/,
350
+ "$1" + SUFFIX_BROWSER
351
+ ], VERSION],
352
+ [/samsungbrowser\/([\w\.]+)/i],
353
+ [VERSION, [NAME, SAMSUNG + " Internet"]],
354
+ [/metasr[\/ ]?([\d\.]+)/i],
355
+ [VERSION, [NAME, SOGOU + " Explorer"]],
356
+ [/(sogou)mo\w+\/([\d\.]+)/i],
357
+ [[NAME, SOGOU + " Mobile"], VERSION],
358
+ [
359
+ /(electron)\/([\w\.]+) safari/i,
360
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
361
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i
362
+ ],
363
+ [NAME, VERSION],
364
+ [/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],
365
+ [NAME],
366
+ [/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],
367
+ [VERSION, NAME],
368
+ [/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],
369
+ [
370
+ [NAME, FACEBOOK],
371
+ VERSION,
372
+ [TYPE, INAPP]
373
+ ],
374
+ [
375
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
376
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
377
+ /(daum)apps[\/ ]([\w\.]+)/i,
378
+ /safari (line)\/([\w\.]+)/i,
379
+ /\b(line)\/([\w\.]+)\/iab/i,
380
+ /(alipay)client\/([\w\.]+)/i,
381
+ /(twitter)(?:and| f.+e\/([\w\.]+))/i,
382
+ /(bing)(?:web|sapphire)\/([\w\.]+)/i,
383
+ /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i
384
+ ],
385
+ [
386
+ NAME,
387
+ VERSION,
388
+ [TYPE, INAPP]
389
+ ],
390
+ [/\bgsa\/([\w\.]+) .*safari\//i],
391
+ [
392
+ VERSION,
393
+ [NAME, "GSA"],
394
+ [TYPE, INAPP]
395
+ ],
396
+ [/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],
397
+ [
398
+ VERSION,
399
+ [NAME, "TikTok"],
400
+ [TYPE, INAPP]
401
+ ],
402
+ [/\[(linkedin)app\]/i],
403
+ [NAME, [TYPE, INAPP]],
404
+ [/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],
405
+ [
406
+ [
407
+ NAME,
408
+ /(.+)/,
409
+ "Zalo"
410
+ ],
411
+ VERSION,
412
+ [TYPE, INAPP]
413
+ ],
414
+ [/(chromium)[\/ ]([-\w\.]+)/i],
415
+ [NAME, VERSION],
416
+ [/ome-(lighthouse)$/i],
417
+ [NAME, [TYPE, FETCHER]],
418
+ [/headlesschrome(?:\/([\w\.]+)| )/i],
419
+ [VERSION, [NAME, CHROME + " Headless"]],
420
+ [/wv\).+chrome\/([\w\.]+).+edgw\//i],
421
+ [VERSION, [NAME, EDGE + " WebView2"]],
422
+ [/ wv\).+(chrome)\/([\w\.]+)/i],
423
+ [[NAME, CHROME + " WebView"], VERSION],
424
+ [/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],
425
+ [VERSION, [NAME, "Android" + SUFFIX_BROWSER]],
426
+ [/chrome\/([\w\.]+) mobile/i],
427
+ [VERSION, [NAME, PREFIX_MOBILE + "Chrome"]],
428
+ [/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],
429
+ [NAME, VERSION],
430
+ [/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],
431
+ [VERSION, [NAME, PREFIX_MOBILE + "Safari"]],
432
+ [/iphone .*mobile(?:\/\w+ | ?)safari/i],
433
+ [[NAME, PREFIX_MOBILE + "Safari"]],
434
+ [/version\/([\w\.\,]+) .*(safari)/i],
435
+ [VERSION, NAME],
436
+ [/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],
437
+ [NAME, [VERSION, "1"]],
438
+ [/(webkit|khtml)\/([\w\.]+)/i],
439
+ [NAME, VERSION],
440
+ [/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],
441
+ [[NAME, PREFIX_MOBILE + FIREFOX], VERSION],
442
+ [/(navigator|netscape\d?)\/([-\w\.]+)/i],
443
+ [[NAME, "Netscape"], VERSION],
444
+ [/(wolvic|librewolf)\/([\w\.]+)/i],
445
+ [NAME, VERSION],
446
+ [/mobile vr; rv:([\w\.]+)\).+firefox/i],
447
+ [VERSION, [NAME, FIREFOX + " Reality"]],
448
+ [
449
+ /ekiohf.+(flow)\/([\w\.]+)/i,
450
+ /(swiftfox)/i,
451
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
452
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
453
+ /(firefox)\/([\w\.]+)/i,
454
+ /(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,
455
+ /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
456
+ /\b(links) \(([\w\.]+)/i
457
+ ],
458
+ [NAME, [
459
+ VERSION,
460
+ /_/g,
461
+ "."
462
+ ]],
463
+ [/(cobalt)\/([\w\.]+)/i],
464
+ [NAME, [
465
+ VERSION,
466
+ /[^\d\.]+./,
467
+ EMPTY
468
+ ]]
469
+ ],
470
+ cpu: [
471
+ [/\b((amd|x|x86[-_]?|wow|win)64)\b/i],
472
+ [[ARCHITECTURE, "amd64"]],
473
+ [/(ia32(?=;))/i, /\b((i[346]|x)86)(pc)?\b/i],
474
+ [[ARCHITECTURE, "ia32"]],
475
+ [/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],
476
+ [[ARCHITECTURE, "arm64"]],
477
+ [/\b(arm(v[67])?ht?n?[fl]p?)\b/i],
478
+ [[ARCHITECTURE, "armhf"]],
479
+ [/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],
480
+ [[ARCHITECTURE, "arm"]],
481
+ [/ sun4\w[;\)]/i],
482
+ [[ARCHITECTURE, "sparc"]],
483
+ [
484
+ /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
485
+ /((ppc|powerpc)(64)?)( mac|;|\))/i,
486
+ /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i
487
+ ],
488
+ [[
489
+ ARCHITECTURE,
490
+ /ower/,
491
+ EMPTY,
492
+ lowerize
493
+ ]],
494
+ [/mc680.0/i],
495
+ [[ARCHITECTURE, "68k"]],
496
+ [/winnt.+\[axp/i],
497
+ [[ARCHITECTURE, "alpha"]]
498
+ ],
499
+ device: [
500
+ [/\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],
501
+ [
502
+ MODEL,
503
+ [VENDOR, SAMSUNG],
504
+ [TYPE, TABLET]
505
+ ],
506
+ [
507
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
508
+ /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
509
+ /sec-(sgh\w+)/i
510
+ ],
511
+ [
512
+ MODEL,
513
+ [VENDOR, SAMSUNG],
514
+ [TYPE, MOBILE]
515
+ ],
516
+ [/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],
517
+ [
518
+ MODEL,
519
+ [VENDOR, APPLE],
520
+ [TYPE, MOBILE]
521
+ ],
522
+ [/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i, /\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],
523
+ [
524
+ MODEL,
525
+ [VENDOR, APPLE],
526
+ [TYPE, TABLET]
527
+ ],
528
+ [/(macintosh);/i],
529
+ [MODEL, [VENDOR, APPLE]],
530
+ [/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],
531
+ [
532
+ MODEL,
533
+ [VENDOR, SHARP],
534
+ [TYPE, MOBILE]
535
+ ],
536
+ [/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],
537
+ [
538
+ MODEL,
539
+ [VENDOR, HONOR],
540
+ [TYPE, TABLET]
541
+ ],
542
+ [/honor([-\w ]+)[;\)]/i],
543
+ [
544
+ MODEL,
545
+ [VENDOR, HONOR],
546
+ [TYPE, MOBILE]
547
+ ],
548
+ [/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],
549
+ [
550
+ MODEL,
551
+ [VENDOR, HUAWEI],
552
+ [TYPE, TABLET]
553
+ ],
554
+ [/(?:huawei) ?([-\w ]+)[;\)]/i, /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],
555
+ [
556
+ MODEL,
557
+ [VENDOR, HUAWEI],
558
+ [TYPE, MOBILE]
559
+ ],
560
+ [/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i, /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],
561
+ [
562
+ [
563
+ MODEL,
564
+ /_/g,
565
+ " "
566
+ ],
567
+ [VENDOR, XIAOMI],
568
+ [TYPE, TABLET]
569
+ ],
570
+ [
571
+ /\b; (\w+) build\/hm\1/i,
572
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
573
+ /oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,
574
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
575
+ / ([\w ]+) miui\/v?\d/i
576
+ ],
577
+ [
578
+ [
579
+ MODEL,
580
+ /_/g,
581
+ " "
582
+ ],
583
+ [VENDOR, XIAOMI],
584
+ [TYPE, MOBILE]
585
+ ],
586
+ [/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i, /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],
587
+ [
588
+ MODEL,
589
+ [VENDOR, ONEPLUS],
590
+ [TYPE, MOBILE]
591
+ ],
592
+ [/; (\w+) bui.+ oppo/i, /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],
593
+ [
594
+ MODEL,
595
+ [VENDOR, OPPO],
596
+ [TYPE, MOBILE]
597
+ ],
598
+ [/\b(opd2(\d{3}a?))(?: bui|\))/i],
599
+ [
600
+ MODEL,
601
+ [
602
+ VENDOR,
603
+ strMapper,
604
+ {
605
+ "OnePlus": [
606
+ "203",
607
+ "304",
608
+ "403",
609
+ "404",
610
+ "413",
611
+ "415"
612
+ ],
613
+ "*": OPPO
614
+ }
615
+ ],
616
+ [TYPE, TABLET]
617
+ ],
618
+ [/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],
619
+ [
620
+ MODEL,
621
+ [VENDOR, "BLU"],
622
+ [TYPE, MOBILE]
623
+ ],
624
+ [/; vivo (\w+)(?: bui|\))/i, /\b(v[12]\d{3}\w?[at])(?: bui|;)/i],
625
+ [
626
+ MODEL,
627
+ [VENDOR, "Vivo"],
628
+ [TYPE, MOBILE]
629
+ ],
630
+ [/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],
631
+ [
632
+ MODEL,
633
+ [VENDOR, "Realme"],
634
+ [TYPE, MOBILE]
635
+ ],
636
+ [/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i, /lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],
637
+ [
638
+ MODEL,
639
+ [VENDOR, LENOVO],
640
+ [TYPE, TABLET]
641
+ ],
642
+ [/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],
643
+ [
644
+ MODEL,
645
+ [VENDOR, LENOVO],
646
+ [TYPE, MOBILE]
647
+ ],
648
+ [
649
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
650
+ /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
651
+ /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
652
+ ],
653
+ [
654
+ MODEL,
655
+ [VENDOR, MOTOROLA],
656
+ [TYPE, MOBILE]
657
+ ],
658
+ [/\b(mz60\d|xoom[2 ]{0,2}) build\//i],
659
+ [
660
+ MODEL,
661
+ [VENDOR, MOTOROLA],
662
+ [TYPE, TABLET]
663
+ ],
664
+ [/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],
665
+ [
666
+ MODEL,
667
+ [VENDOR, LG],
668
+ [TYPE, TABLET]
669
+ ],
670
+ [
671
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
672
+ /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
673
+ /\blg-?([\d\w]+) bui/i
674
+ ],
675
+ [
676
+ MODEL,
677
+ [VENDOR, LG],
678
+ [TYPE, MOBILE]
679
+ ],
680
+ [/(nokia) (t[12][01])/i],
681
+ [
682
+ VENDOR,
683
+ MODEL,
684
+ [TYPE, TABLET]
685
+ ],
686
+ [/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i, /nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],
687
+ [
688
+ [
689
+ MODEL,
690
+ /_/g,
691
+ " "
692
+ ],
693
+ [TYPE, MOBILE],
694
+ [VENDOR, "Nokia"]
695
+ ],
696
+ [/(pixel (c|tablet))\b/i],
697
+ [
698
+ MODEL,
699
+ [VENDOR, GOOGLE],
700
+ [TYPE, TABLET]
701
+ ],
702
+ [/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],
703
+ [
704
+ MODEL,
705
+ [VENDOR, GOOGLE],
706
+ [TYPE, MOBILE]
707
+ ],
708
+ [/(google) (pixelbook( go)?)/i],
709
+ [VENDOR, MODEL],
710
+ [/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],
711
+ [
712
+ MODEL,
713
+ [VENDOR, SONY],
714
+ [TYPE, MOBILE]
715
+ ],
716
+ [/sony tablet [ps]/i, /\b(?:sony)?sgp\w+(?: bui|\))/i],
717
+ [
718
+ [MODEL, "Xperia Tablet"],
719
+ [VENDOR, SONY],
720
+ [TYPE, TABLET]
721
+ ],
722
+ [
723
+ /(alexa)webm/i,
724
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,
725
+ /(kf[a-z]+)( bui|\)).+silk\//i
726
+ ],
727
+ [
728
+ MODEL,
729
+ [VENDOR, AMAZON],
730
+ [TYPE, TABLET]
731
+ ],
732
+ [/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],
733
+ [
734
+ [
735
+ MODEL,
736
+ /(.+)/g,
737
+ "Fire Phone $1"
738
+ ],
739
+ [VENDOR, AMAZON],
740
+ [TYPE, MOBILE]
741
+ ],
742
+ [/(playbook);[-\w\),; ]+(rim)/i],
743
+ [
744
+ MODEL,
745
+ VENDOR,
746
+ [TYPE, TABLET]
747
+ ],
748
+ [/\b((?:bb[a-f]|st[hv])100-\d)/i, /(?:blackberry|\(bb10;) (\w+)/i],
749
+ [
750
+ MODEL,
751
+ [VENDOR, BLACKBERRY],
752
+ [TYPE, MOBILE]
753
+ ],
754
+ [/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],
755
+ [
756
+ MODEL,
757
+ [VENDOR, ASUS],
758
+ [TYPE, TABLET]
759
+ ],
760
+ [/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],
761
+ [
762
+ MODEL,
763
+ [VENDOR, ASUS],
764
+ [TYPE, MOBILE]
765
+ ],
766
+ [/(nexus 9)/i],
767
+ [
768
+ MODEL,
769
+ [VENDOR, "HTC"],
770
+ [TYPE, TABLET]
771
+ ],
772
+ [
773
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
774
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
775
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
776
+ ],
777
+ [
778
+ VENDOR,
779
+ [
780
+ MODEL,
781
+ /_/g,
782
+ " "
783
+ ],
784
+ [TYPE, MOBILE]
785
+ ],
786
+ [/tcl (xess p17aa)/i, /droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],
787
+ [
788
+ MODEL,
789
+ [VENDOR, "TCL"],
790
+ [TYPE, TABLET]
791
+ ],
792
+ [/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],
793
+ [
794
+ MODEL,
795
+ [VENDOR, "TCL"],
796
+ [TYPE, MOBILE]
797
+ ],
798
+ [/(itel) ((\w+))/i],
799
+ [
800
+ [VENDOR, lowerize],
801
+ MODEL,
802
+ [
803
+ TYPE,
804
+ strMapper,
805
+ {
806
+ "tablet": ["p10001l", "w7001"],
807
+ "*": "mobile"
808
+ }
809
+ ]
810
+ ],
811
+ [/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],
812
+ [
813
+ MODEL,
814
+ [VENDOR, "Acer"],
815
+ [TYPE, TABLET]
816
+ ],
817
+ [/droid.+; (m[1-5] note) bui/i, /\bmz-([-\w]{2,})/i],
818
+ [
819
+ MODEL,
820
+ [VENDOR, "Meizu"],
821
+ [TYPE, MOBILE]
822
+ ],
823
+ [/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],
824
+ [
825
+ MODEL,
826
+ [VENDOR, "Ulefone"],
827
+ [TYPE, MOBILE]
828
+ ],
829
+ [/; (energy ?\w+)(?: bui|\))/i, /; energizer ([\w ]+)(?: bui|\))/i],
830
+ [
831
+ MODEL,
832
+ [VENDOR, "Energizer"],
833
+ [TYPE, MOBILE]
834
+ ],
835
+ [/; cat (b35);/i, /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],
836
+ [
837
+ MODEL,
838
+ [VENDOR, "Cat"],
839
+ [TYPE, MOBILE]
840
+ ],
841
+ [/((?:new )?andromax[\w- ]+)(?: bui|\))/i],
842
+ [
843
+ MODEL,
844
+ [VENDOR, "Smartfren"],
845
+ [TYPE, MOBILE]
846
+ ],
847
+ [/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],
848
+ [
849
+ MODEL,
850
+ [VENDOR, "Nothing"],
851
+ [TYPE, MOBILE]
852
+ ],
853
+ [/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i, /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],
854
+ [
855
+ MODEL,
856
+ [VENDOR, "Archos"],
857
+ [TYPE, TABLET]
858
+ ],
859
+ [/archos ([\w ]+)( b|\))/i, /; (ac[3-6]\d\w{2,8})( b|\))/i],
860
+ [
861
+ MODEL,
862
+ [VENDOR, "Archos"],
863
+ [TYPE, MOBILE]
864
+ ],
865
+ [/; (n159v)/i],
866
+ [
867
+ MODEL,
868
+ [VENDOR, "HMD"],
869
+ [TYPE, MOBILE]
870
+ ],
871
+ [/(imo) (tab \w+)/i, /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],
872
+ [
873
+ VENDOR,
874
+ MODEL,
875
+ [TYPE, TABLET]
876
+ ],
877
+ [
878
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
879
+ /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
880
+ /(hp) ([\w ]+\w)/i,
881
+ /(microsoft); (lumia[\w ]+)/i,
882
+ /(oppo) ?([\w ]+) bui/i,
883
+ /(hisense) ([ehv][\w ]+)\)/i,
884
+ /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i
885
+ ],
886
+ [
887
+ VENDOR,
888
+ MODEL,
889
+ [TYPE, MOBILE]
890
+ ],
891
+ [
892
+ /(kobo)\s(ereader|touch)/i,
893
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i,
894
+ /(kindle)\/([\w\.]+)/i
895
+ ],
896
+ [
897
+ VENDOR,
898
+ MODEL,
899
+ [TYPE, TABLET]
900
+ ],
901
+ [/(surface duo)/i],
902
+ [
903
+ MODEL,
904
+ [VENDOR, MICROSOFT],
905
+ [TYPE, TABLET]
906
+ ],
907
+ [/droid [\d\.]+; (fp\du?)(?: b|\))/i],
908
+ [
909
+ MODEL,
910
+ [VENDOR, "Fairphone"],
911
+ [TYPE, MOBILE]
912
+ ],
913
+ [/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],
914
+ [
915
+ MODEL,
916
+ [VENDOR, NVIDIA],
917
+ [TYPE, TABLET]
918
+ ],
919
+ [/(sprint) (\w+)/i],
920
+ [
921
+ VENDOR,
922
+ MODEL,
923
+ [TYPE, MOBILE]
924
+ ],
925
+ [/(kin\.[onetw]{3})/i],
926
+ [
927
+ [
928
+ MODEL,
929
+ /\./g,
930
+ " "
931
+ ],
932
+ [VENDOR, MICROSOFT],
933
+ [TYPE, MOBILE]
934
+ ],
935
+ [/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],
936
+ [
937
+ MODEL,
938
+ [VENDOR, ZEBRA],
939
+ [TYPE, TABLET]
940
+ ],
941
+ [/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],
942
+ [
943
+ MODEL,
944
+ [VENDOR, ZEBRA],
945
+ [TYPE, MOBILE]
946
+ ],
947
+ [/(philips)[\w ]+tv/i, /smart-tv.+(samsung)/i],
948
+ [VENDOR, [TYPE, SMARTTV]],
949
+ [/hbbtv.+maple;(\d+)/i],
950
+ [
951
+ [
952
+ MODEL,
953
+ /^/,
954
+ "SmartTV"
955
+ ],
956
+ [VENDOR, SAMSUNG],
957
+ [TYPE, SMARTTV]
958
+ ],
959
+ [/(vizio)(?: |.+model\/)(\w+-\w+)/i, /tcast.+(lg)e?. ([-\w]+)/i],
960
+ [
961
+ VENDOR,
962
+ MODEL,
963
+ [TYPE, SMARTTV]
964
+ ],
965
+ [/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],
966
+ [[VENDOR, LG], [TYPE, SMARTTV]],
967
+ [/(apple) ?tv/i],
968
+ [
969
+ VENDOR,
970
+ [MODEL, APPLE + " TV"],
971
+ [TYPE, SMARTTV]
972
+ ],
973
+ [/crkey.*devicetype\/chromecast/i],
974
+ [
975
+ [MODEL, CHROMECAST + " Third Generation"],
976
+ [VENDOR, GOOGLE],
977
+ [TYPE, SMARTTV]
978
+ ],
979
+ [/crkey.*devicetype\/([^/]*)/i],
980
+ [
981
+ [
982
+ MODEL,
983
+ /^/,
984
+ "Chromecast "
985
+ ],
986
+ [VENDOR, GOOGLE],
987
+ [TYPE, SMARTTV]
988
+ ],
989
+ [/fuchsia.*crkey/i],
990
+ [
991
+ [MODEL, CHROMECAST + " Nest Hub"],
992
+ [VENDOR, GOOGLE],
993
+ [TYPE, SMARTTV]
994
+ ],
995
+ [/crkey/i],
996
+ [
997
+ [MODEL, CHROMECAST],
998
+ [VENDOR, GOOGLE],
999
+ [TYPE, SMARTTV]
1000
+ ],
1001
+ [/(portaltv)/i],
1002
+ [
1003
+ MODEL,
1004
+ [VENDOR, FACEBOOK],
1005
+ [TYPE, SMARTTV]
1006
+ ],
1007
+ [/droid.+aft(\w+)( bui|\))/i],
1008
+ [
1009
+ MODEL,
1010
+ [VENDOR, AMAZON],
1011
+ [TYPE, SMARTTV]
1012
+ ],
1013
+ [/(shield \w+ tv)/i],
1014
+ [
1015
+ MODEL,
1016
+ [VENDOR, NVIDIA],
1017
+ [TYPE, SMARTTV]
1018
+ ],
1019
+ [/\(dtv[\);].+(aquos)/i, /(aquos-tv[\w ]+)\)/i],
1020
+ [
1021
+ MODEL,
1022
+ [VENDOR, SHARP],
1023
+ [TYPE, SMARTTV]
1024
+ ],
1025
+ [/(bravia[\w ]+)( bui|\))/i],
1026
+ [
1027
+ MODEL,
1028
+ [VENDOR, SONY],
1029
+ [TYPE, SMARTTV]
1030
+ ],
1031
+ [/(mi(tv|box)-?\w+) bui/i],
1032
+ [
1033
+ MODEL,
1034
+ [VENDOR, XIAOMI],
1035
+ [TYPE, SMARTTV]
1036
+ ],
1037
+ [/Hbbtv.*(technisat) (.*);/i],
1038
+ [
1039
+ VENDOR,
1040
+ MODEL,
1041
+ [TYPE, SMARTTV]
1042
+ ],
1043
+ [/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],
1044
+ [
1045
+ [
1046
+ VENDOR,
1047
+ /.+\/(\w+)/,
1048
+ "$1",
1049
+ strMapper,
1050
+ { "LG": "lge" }
1051
+ ],
1052
+ [MODEL, trim],
1053
+ [TYPE, SMARTTV]
1054
+ ],
1055
+ [/(playstation \w+)/i],
1056
+ [
1057
+ MODEL,
1058
+ [VENDOR, SONY],
1059
+ [TYPE, CONSOLE]
1060
+ ],
1061
+ [/\b(xbox(?: one)?(?!; xbox))[\); ]/i],
1062
+ [
1063
+ MODEL,
1064
+ [VENDOR, MICROSOFT],
1065
+ [TYPE, CONSOLE]
1066
+ ],
1067
+ [
1068
+ /(ouya)/i,
1069
+ /(nintendo) (\w+)/i,
1070
+ /(retroid) (pocket ([^\)]+))/i,
1071
+ /(valve).+(steam deck)/i,
1072
+ /droid.+; ((shield|rgcube|gr0006))( bui|\))/i
1073
+ ],
1074
+ [
1075
+ [
1076
+ VENDOR,
1077
+ strMapper,
1078
+ {
1079
+ "Nvidia": "Shield",
1080
+ "Anbernic": "RGCUBE",
1081
+ "Logitech": "GR0006"
1082
+ }
1083
+ ],
1084
+ MODEL,
1085
+ [TYPE, CONSOLE]
1086
+ ],
1087
+ [/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],
1088
+ [
1089
+ MODEL,
1090
+ [VENDOR, SAMSUNG],
1091
+ [TYPE, WEARABLE]
1092
+ ],
1093
+ [/((pebble))app/i, /(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],
1094
+ [
1095
+ VENDOR,
1096
+ MODEL,
1097
+ [TYPE, WEARABLE]
1098
+ ],
1099
+ [/(ow(?:19|20)?we?[1-3]{1,3})/i],
1100
+ [
1101
+ MODEL,
1102
+ [VENDOR, OPPO],
1103
+ [TYPE, WEARABLE]
1104
+ ],
1105
+ [/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],
1106
+ [
1107
+ MODEL,
1108
+ [VENDOR, APPLE],
1109
+ [TYPE, WEARABLE]
1110
+ ],
1111
+ [/(opwwe\d{3})/i],
1112
+ [
1113
+ MODEL,
1114
+ [VENDOR, ONEPLUS],
1115
+ [TYPE, WEARABLE]
1116
+ ],
1117
+ [/(moto 360)/i],
1118
+ [
1119
+ MODEL,
1120
+ [VENDOR, MOTOROLA],
1121
+ [TYPE, WEARABLE]
1122
+ ],
1123
+ [/(smartwatch 3)/i],
1124
+ [
1125
+ MODEL,
1126
+ [VENDOR, SONY],
1127
+ [TYPE, WEARABLE]
1128
+ ],
1129
+ [/(g watch r)/i],
1130
+ [
1131
+ MODEL,
1132
+ [VENDOR, LG],
1133
+ [TYPE, WEARABLE]
1134
+ ],
1135
+ [/droid.+; (wt63?0{2,3})\)/i],
1136
+ [
1137
+ MODEL,
1138
+ [VENDOR, ZEBRA],
1139
+ [TYPE, WEARABLE]
1140
+ ],
1141
+ [/droid.+; (glass) \d/i],
1142
+ [
1143
+ MODEL,
1144
+ [VENDOR, GOOGLE],
1145
+ [TYPE, XR]
1146
+ ],
1147
+ [/(pico) ([\w ]+) os\d/i],
1148
+ [
1149
+ VENDOR,
1150
+ MODEL,
1151
+ [TYPE, XR]
1152
+ ],
1153
+ [/(quest( \d| pro)?s?).+vr/i],
1154
+ [
1155
+ MODEL,
1156
+ [VENDOR, FACEBOOK],
1157
+ [TYPE, XR]
1158
+ ],
1159
+ [/mobile vr; rv.+firefox/i],
1160
+ [[TYPE, XR]],
1161
+ [/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],
1162
+ [VENDOR, [TYPE, EMBEDDED]],
1163
+ [/(aeobc)\b/i],
1164
+ [
1165
+ MODEL,
1166
+ [VENDOR, AMAZON],
1167
+ [TYPE, EMBEDDED]
1168
+ ],
1169
+ [/(homepod).+mac os/i],
1170
+ [
1171
+ MODEL,
1172
+ [VENDOR, APPLE],
1173
+ [TYPE, EMBEDDED]
1174
+ ],
1175
+ [/windows iot/i],
1176
+ [[TYPE, EMBEDDED]],
1177
+ [/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],
1178
+ [MODEL, [TYPE, SMARTTV]],
1179
+ [/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],
1180
+ [[TYPE, SMARTTV]],
1181
+ [/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],
1182
+ [MODEL, [
1183
+ TYPE,
1184
+ strMapper,
1185
+ {
1186
+ "mobile": "Mobile",
1187
+ "xr": "VR",
1188
+ "*": TABLET
1189
+ }
1190
+ ]],
1191
+ [/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],
1192
+ [[TYPE, TABLET]],
1193
+ [/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],
1194
+ [[TYPE, MOBILE]],
1195
+ [/droid .+?; ([\w\. -]+)( bui|\))/i],
1196
+ [MODEL, [VENDOR, "Generic"]]
1197
+ ],
1198
+ engine: [
1199
+ [/windows.+ edge\/([\w\.]+)/i],
1200
+ [VERSION, [NAME, EDGE + "HTML"]],
1201
+ [/(arkweb)\/([\w\.]+)/i],
1202
+ [NAME, VERSION],
1203
+ [/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],
1204
+ [VERSION, [NAME, "Blink"]],
1205
+ [
1206
+ /(presto)\/([\w\.]+)/i,
1207
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,
1208
+ /ekioh(flow)\/([\w\.]+)/i,
1209
+ /(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,
1210
+ /(icab)[\/ ]([23]\.[\d\.]+)/i,
1211
+ /\b(libweb)/i
1212
+ ],
1213
+ [NAME, VERSION],
1214
+ [/ladybird\//i],
1215
+ [[NAME, "LibWeb"]],
1216
+ [/rv\:([\w\.]{1,9})\b.+(gecko)/i],
1217
+ [VERSION, NAME]
1218
+ ],
1219
+ os: [
1220
+ [/(windows nt) (6\.[23]); arm/i],
1221
+ [[
1222
+ NAME,
1223
+ /N/,
1224
+ "R"
1225
+ ], [
1226
+ VERSION,
1227
+ strMapper,
1228
+ windowsVersionMap
1229
+ ]],
1230
+ [/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i, /(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],
1231
+ [NAME, VERSION],
1232
+ [/windows nt ?([\d\.\)]*)(?!.+xbox)/i, /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],
1233
+ [[
1234
+ VERSION,
1235
+ /(;|\))/g,
1236
+ "",
1237
+ strMapper,
1238
+ windowsVersionMap
1239
+ ], [NAME, WINDOWS]],
1240
+ [/(windows ce)\/?([\d\.]*)/i],
1241
+ [NAME, VERSION],
1242
+ [
1243
+ /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,
1244
+ /(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,
1245
+ /\btvos ?([\w\.]+)/i,
1246
+ /cfnetwork\/.+darwin/i
1247
+ ],
1248
+ [[
1249
+ VERSION,
1250
+ /_/g,
1251
+ "."
1252
+ ], [NAME, "iOS"]],
1253
+ [/(mac os x) ?([\w\. ]*)/i, /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],
1254
+ [[NAME, "macOS"], [
1255
+ VERSION,
1256
+ /_/g,
1257
+ "."
1258
+ ]],
1259
+ [/android ([\d\.]+).*crkey/i],
1260
+ [VERSION, [NAME, CHROMECAST + " Android"]],
1261
+ [/fuchsia.*crkey\/([\d\.]+)/i],
1262
+ [VERSION, [NAME, CHROMECAST + " Fuchsia"]],
1263
+ [/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],
1264
+ [VERSION, [NAME, CHROMECAST + " SmartSpeaker"]],
1265
+ [/linux.*crkey\/([\d\.]+)/i],
1266
+ [VERSION, [NAME, CHROMECAST + " Linux"]],
1267
+ [/crkey\/([\d\.]+)/i],
1268
+ [VERSION, [NAME, CHROMECAST]],
1269
+ [/droid ([\w\.]+)\b.+(android[- ]x86)/i],
1270
+ [VERSION, NAME],
1271
+ [/(ubuntu) ([\w\.]+) like android/i],
1272
+ [[
1273
+ NAME,
1274
+ /(.+)/,
1275
+ "$1 Touch"
1276
+ ], VERSION],
1277
+ [/(harmonyos)[\/ ]?([\d\.]*)/i, /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],
1278
+ [NAME, VERSION],
1279
+ [/\(bb(10);/i],
1280
+ [VERSION, [NAME, BLACKBERRY]],
1281
+ [/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],
1282
+ [VERSION, [NAME, "Symbian"]],
1283
+ [/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],
1284
+ [VERSION, [NAME, FIREFOX + " OS"]],
1285
+ [/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],
1286
+ [VERSION, [NAME, "webOS"]],
1287
+ [/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],
1288
+ [[
1289
+ VERSION,
1290
+ strMapper,
1291
+ {
1292
+ "25": "120",
1293
+ "24": "108",
1294
+ "23": "94",
1295
+ "22": "87",
1296
+ "6": "79",
1297
+ "5": "68",
1298
+ "4": "53",
1299
+ "3": "38",
1300
+ "2": "538",
1301
+ "1": "537",
1302
+ "*": "TV"
1303
+ }
1304
+ ], [NAME, "webOS"]],
1305
+ [/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],
1306
+ [VERSION, [NAME, "watchOS"]],
1307
+ [/cros [\w]+(?:\)| ([\w\.]+)\b)/i],
1308
+ [VERSION, [NAME, "Chrome OS"]],
1309
+ [/kepler ([\w\.]+); (aft|aeo)/i],
1310
+ [VERSION, [NAME, "Vega OS"]],
1311
+ [
1312
+ /(netrange)mmh/i,
1313
+ /(nettv)\/(\d+\.[\w\.]+)/i,
1314
+ /(nintendo|playstation) (\w+)/i,
1315
+ /(xbox); +xbox ([^\);]+)/i,
1316
+ /(pico) .+os([\w\.]+)/i,
1317
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
1318
+ /linux.+(mint)[\/\(\) ]?([\w\.]*)/i,
1319
+ /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,
1320
+ /([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
1321
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
1322
+ /\b(aix)[; ]([1-9\.]{0,4})/i,
1323
+ /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,
1324
+ /(gnu) ?([\w\.]*)/i,
1325
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
1326
+ /(haiku) ?(r\d)?/i
1327
+ ],
1328
+ [NAME, VERSION],
1329
+ [/(sunos) ?([\d\.]*)/i],
1330
+ [[NAME, "Solaris"], VERSION],
1331
+ [/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i, /(unix) ?([\w\.]*)/i],
1332
+ [NAME, VERSION]
1333
+ ]
1334
+ };
1335
+ var defaultProps = (function() {
1336
+ var props = {
1337
+ init: {},
1338
+ isIgnore: {},
1339
+ isIgnoreRgx: {},
1340
+ toString: {}
1341
+ };
1342
+ setProps.call(props.init, [
1343
+ [BROWSER, [
1344
+ NAME,
1345
+ VERSION,
1346
+ MAJOR,
1347
+ TYPE
1348
+ ]],
1349
+ [CPU, [ARCHITECTURE]],
1350
+ [DEVICE, [
1351
+ TYPE,
1352
+ MODEL,
1353
+ VENDOR
1354
+ ]],
1355
+ [ENGINE, [NAME, VERSION]],
1356
+ [OS, [NAME, VERSION]]
1357
+ ]);
1358
+ setProps.call(props.isIgnore, [
1359
+ [BROWSER, [VERSION, MAJOR]],
1360
+ [ENGINE, [VERSION]],
1361
+ [OS, [VERSION]]
1362
+ ]);
1363
+ setProps.call(props.isIgnoreRgx, [[BROWSER, / ?browser$/i], [OS, / ?os$/i]]);
1364
+ setProps.call(props.toString, [
1365
+ [BROWSER, [NAME, VERSION]],
1366
+ [CPU, [ARCHITECTURE]],
1367
+ [DEVICE, [VENDOR, MODEL]],
1368
+ [ENGINE, [NAME, VERSION]],
1369
+ [OS, [NAME, VERSION]]
1370
+ ]);
1371
+ return props;
1372
+ })();
1373
+ var createIData = function(item, itemType) {
1374
+ var init_props = defaultProps.init[itemType], is_ignoreProps = defaultProps.isIgnore[itemType] || 0, is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0, toString_props = defaultProps.toString[itemType] || 0;
1375
+ function IData() {
1376
+ setProps.call(this, init_props);
1377
+ }
1378
+ IData.prototype.getItem = function() {
1379
+ return item;
1380
+ };
1381
+ IData.prototype.withClientHints = function() {
1382
+ if (!NAVIGATOR_UADATA) return item.parseCH().get();
1383
+ return NAVIGATOR_UADATA.getHighEntropyValues(CH_ALL_VALUES).then(function(res) {
1384
+ return item.setCH(new UACHData(res, false)).parseCH().get();
1385
+ });
1386
+ };
1387
+ IData.prototype.withFeatureCheck = function() {
1388
+ return item.detectFeature().get();
1389
+ };
1390
+ if (itemType != RESULT) {
1391
+ IData.prototype.is = function(strToCheck) {
1392
+ var is = false;
1393
+ for (var i in this) if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
1394
+ is = true;
1395
+ if (strToCheck != TYPEOF.UNDEFINED) break;
1396
+ } else if (strToCheck == TYPEOF.UNDEFINED && is) {
1397
+ is = !is;
1398
+ break;
1399
+ }
1400
+ return is;
1401
+ };
1402
+ IData.prototype.toString = function() {
1403
+ var str = EMPTY;
1404
+ for (var i in toString_props) if (typeof this[toString_props[i]] !== TYPEOF.UNDEFINED) str += (str ? " " : EMPTY) + this[toString_props[i]];
1405
+ return str || TYPEOF.UNDEFINED;
1406
+ };
1407
+ }
1408
+ IData.prototype.then = function(cb) {
1409
+ var that = this;
1410
+ var IDataResolve = function() {
1411
+ for (var prop in that) if (that.hasOwnProperty(prop)) this[prop] = that[prop];
1412
+ };
1413
+ IDataResolve.prototype = {
1414
+ is: IData.prototype.is,
1415
+ toString: IData.prototype.toString,
1416
+ withClientHints: IData.prototype.withClientHints,
1417
+ withFeatureCheck: IData.prototype.withFeatureCheck
1418
+ };
1419
+ var resolveData = new IDataResolve();
1420
+ cb(resolveData);
1421
+ return resolveData;
1422
+ };
1423
+ return new IData();
1424
+ };
1425
+ function UACHData(uach, isHttpUACH) {
1426
+ uach = uach || {};
1427
+ setProps.call(this, CH_ALL_VALUES);
1428
+ if (isHttpUACH) setProps.call(this, [
1429
+ [BRANDS, itemListToArray(uach[CH])],
1430
+ [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
1431
+ [MOBILE, /\?1/.test(uach[CH_MOBILE])],
1432
+ [MODEL, stripQuotes(uach[CH_MODEL])],
1433
+ [PLATFORM, stripQuotes(uach[CH_PLATFORM])],
1434
+ [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
1435
+ [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
1436
+ [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
1437
+ [BITNESS, stripQuotes(uach[CH_BITNESS])]
1438
+ ]);
1439
+ else for (var prop in uach) if (this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
1440
+ }
1441
+ function UAItem(itemType, ua, rgxMap, uaCH) {
1442
+ setProps.call(this, [
1443
+ ["itemType", itemType],
1444
+ ["ua", ua],
1445
+ ["uaCH", uaCH],
1446
+ ["rgxMap", rgxMap],
1447
+ ["data", createIData(this, itemType)]
1448
+ ]);
1449
+ return this;
1450
+ }
1451
+ UAItem.prototype.get = function(prop) {
1452
+ if (!prop) return this.data;
1453
+ return this.data.hasOwnProperty(prop) ? this.data[prop] : void 0;
1454
+ };
1455
+ UAItem.prototype.set = function(prop, val) {
1456
+ this.data[prop] = val;
1457
+ return this;
1458
+ };
1459
+ UAItem.prototype.setCH = function(ch) {
1460
+ this.uaCH = ch;
1461
+ return this;
1462
+ };
1463
+ UAItem.prototype.detectFeature = function() {
1464
+ if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) switch (this.itemType) {
1465
+ case BROWSER:
1466
+ if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) this.set(NAME, "Brave");
1467
+ break;
1468
+ case DEVICE:
1469
+ if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) this.set(TYPE, MOBILE);
1470
+ if (this.get(MODEL) == "Macintosh" && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) this.set(MODEL, "iPad").set(TYPE, TABLET);
1471
+ break;
1472
+ case OS:
1473
+ if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
1474
+ break;
1475
+ case RESULT:
1476
+ var data = this.data;
1477
+ var detect = function(itemType) {
1478
+ return data[itemType].getItem().detectFeature().get();
1479
+ };
1480
+ this.set(BROWSER, detect(BROWSER)).set(CPU, detect(CPU)).set(DEVICE, detect(DEVICE)).set(ENGINE, detect(ENGINE)).set(OS, detect(OS));
1481
+ }
1482
+ return this;
1483
+ };
1484
+ UAItem.prototype.parseUA = function() {
1485
+ if (this.itemType != RESULT) rgxMapper.call(this.data, this.ua, this.rgxMap);
1486
+ switch (this.itemType) {
1487
+ case BROWSER:
1488
+ this.set(MAJOR, majorize(this.get(VERSION)));
1489
+ break;
1490
+ case OS:
1491
+ if (this.get(NAME) == "iOS" && this.get(VERSION) == "18.6") {
1492
+ var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua);
1493
+ if (realVersion && parseInt(realVersion[1].substring(0, 2), 10) >= 26) this.set(VERSION, realVersion[1]);
1494
+ }
1495
+ break;
1496
+ }
1497
+ return this;
1498
+ };
1499
+ UAItem.prototype.parseCH = function() {
1500
+ var uaCH = this.uaCH, rgxMap = this.rgxMap;
1501
+ switch (this.itemType) {
1502
+ case BROWSER:
1503
+ case ENGINE:
1504
+ var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
1505
+ if (brands) for (var i = 0; i < brands.length; i++) {
1506
+ var brandName = brands[i].brand || brands[i], brandVersion = brands[i].version;
1507
+ if (this.itemType == BROWSER && !/not.a.brand/i.test(brandName) && (!prevName || /Chrom/.test(prevName) && brandName != CHROMIUM || prevName == EDGE && /WebView2/.test(brandName))) {
1508
+ brandName = strMapper(brandName, browserHintsMap);
1509
+ prevName = this.get(NAME);
1510
+ if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) this.set(NAME, brandName).set(VERSION, brandVersion).set(MAJOR, majorize(brandVersion));
1511
+ prevName = brandName;
1512
+ }
1513
+ if (this.itemType == ENGINE && brandName == CHROMIUM) this.set(VERSION, brandVersion);
1514
+ }
1515
+ break;
1516
+ case CPU:
1517
+ var archName = uaCH[ARCHITECTURE];
1518
+ if (archName) {
1519
+ if (archName && uaCH[BITNESS] == "64") archName += "64";
1520
+ rgxMapper.call(this.data, archName + ";", rgxMap);
1521
+ }
1522
+ break;
1523
+ case DEVICE:
1524
+ if (uaCH[MOBILE]) this.set(TYPE, MOBILE);
1525
+ if (uaCH[MODEL]) {
1526
+ this.set(MODEL, uaCH[MODEL]);
1527
+ if (!this.get(TYPE) || !this.get(VENDOR)) {
1528
+ var reParse = {};
1529
+ rgxMapper.call(reParse, "droid 9; " + uaCH[MODEL] + ")", rgxMap);
1530
+ if (!this.get(TYPE) && !!reParse.type) this.set(TYPE, reParse.type);
1531
+ if (!this.get(VENDOR) && !!reParse.vendor) this.set(VENDOR, reParse.vendor);
1532
+ }
1533
+ }
1534
+ if (uaCH[FORMFACTORS]) {
1535
+ var ff;
1536
+ if (typeof uaCH[FORMFACTORS] !== "string") {
1537
+ var idx = 0;
1538
+ while (!ff && idx < uaCH[FORMFACTORS].length) ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
1539
+ } else ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
1540
+ this.set(TYPE, ff);
1541
+ }
1542
+ break;
1543
+ case OS:
1544
+ var osName = uaCH[PLATFORM];
1545
+ if (osName) {
1546
+ var osVersion = uaCH[PLATFORMVER];
1547
+ if (osName == WINDOWS) osVersion = parseInt(majorize(osVersion), 10) >= 13 ? "11" : "10";
1548
+ this.set(NAME, osName).set(VERSION, osVersion);
1549
+ }
1550
+ if (this.get(NAME) == WINDOWS && uaCH[MODEL] == "Xbox") this.set(NAME, "Xbox").set(VERSION, void 0);
1551
+ break;
1552
+ case RESULT:
1553
+ var data = this.data;
1554
+ var parse = function(itemType) {
1555
+ return data[itemType].getItem().setCH(uaCH).parseCH().get();
1556
+ };
1557
+ this.set(BROWSER, parse(BROWSER)).set(CPU, parse(CPU)).set(DEVICE, parse(DEVICE)).set(ENGINE, parse(ENGINE)).set(OS, parse(OS));
1558
+ }
1559
+ return this;
1560
+ };
1561
+ function UAParser(ua, extensions, headers) {
1562
+ if (typeof ua === TYPEOF.OBJECT) {
1563
+ if (isExtensions(ua, true)) {
1564
+ if (typeof extensions === TYPEOF.OBJECT) headers = extensions;
1565
+ extensions = ua;
1566
+ } else {
1567
+ headers = ua;
1568
+ extensions = void 0;
1569
+ }
1570
+ ua = void 0;
1571
+ } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
1572
+ headers = extensions;
1573
+ extensions = void 0;
1574
+ }
1575
+ if (headers) if (typeof headers.append === TYPEOF.FUNCTION) {
1576
+ var kv = {};
1577
+ headers.forEach(function(v$1, k$1) {
1578
+ kv[String(k$1).toLowerCase()] = v$1;
1579
+ });
1580
+ headers = kv;
1581
+ } else {
1582
+ var normalized = {};
1583
+ for (var header in headers) if (headers.hasOwnProperty(header)) normalized[String(header).toLowerCase()] = headers[header];
1584
+ headers = normalized;
1585
+ }
1586
+ if (!(this instanceof UAParser)) return new UAParser(ua, extensions, headers).getResult();
1587
+ var userAgent = typeof ua === TYPEOF.STRING ? ua : headers && headers[USER_AGENT] ? headers[USER_AGENT] : NAVIGATOR && NAVIGATOR.userAgent ? NAVIGATOR.userAgent : EMPTY, httpUACH = new UACHData(headers, true), regexMap = extensions ? extend(defaultRegexes, extensions) : defaultRegexes, createItemFunc = function(itemType) {
1588
+ if (itemType == RESULT) return function() {
1589
+ return new UAItem(itemType, userAgent, regexMap, httpUACH).set("ua", userAgent).set(BROWSER, this.getBrowser()).set(CPU, this.getCPU()).set(DEVICE, this.getDevice()).set(ENGINE, this.getEngine()).set(OS, this.getOS()).get();
1590
+ };
1591
+ else return function() {
1592
+ return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH).parseUA().get();
1593
+ };
1594
+ };
1595
+ setProps.call(this, [
1596
+ ["getBrowser", createItemFunc(BROWSER)],
1597
+ ["getCPU", createItemFunc(CPU)],
1598
+ ["getDevice", createItemFunc(DEVICE)],
1599
+ ["getEngine", createItemFunc(ENGINE)],
1600
+ ["getOS", createItemFunc(OS)],
1601
+ ["getResult", createItemFunc(RESULT)],
1602
+ ["getUA", function() {
1603
+ return userAgent;
1604
+ }],
1605
+ ["setUA", function(ua$1) {
1606
+ if (isString(ua$1)) userAgent = trim(ua$1, UA_MAX_LENGTH);
1607
+ return this;
1608
+ }]
1609
+ ]).setUA(userAgent);
1610
+ return this;
1611
+ }
1612
+ UAParser.VERSION = LIBVERSION;
1613
+ UAParser.BROWSER = enumerize([
1614
+ NAME,
1615
+ VERSION,
1616
+ MAJOR,
1617
+ TYPE
1618
+ ]);
1619
+ UAParser.CPU = enumerize([ARCHITECTURE]);
1620
+ UAParser.DEVICE = enumerize([
1621
+ MODEL,
1622
+ VENDOR,
1623
+ TYPE,
1624
+ CONSOLE,
1625
+ MOBILE,
1626
+ SMARTTV,
1627
+ TABLET,
1628
+ WEARABLE,
1629
+ EMBEDDED
1630
+ ]);
1631
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
1632
+
1633
+ //#endregion
1634
+ //#region ../infra/src/device/getDeviceData.ts
1635
+ const HIGH_ENTROPY_HINTS = new Set([
1636
+ "model",
1637
+ "platformVersion",
1638
+ "fullVersionList",
1639
+ "brands",
1640
+ "platform"
1641
+ ]);
1642
+ function getFallbackDeviceInfo() {
1643
+ const result = new UAParser().getResult();
1644
+ return {
1645
+ device: { model: result.device.model },
1646
+ os: {
1647
+ name: result.os.name,
1648
+ version: result.os.version
1649
+ },
1650
+ browser: {
1651
+ name: result.browser.name,
1652
+ version: result.browser.version
1653
+ }
1654
+ };
1655
+ }
1656
+ function sanitizeString(value) {
1657
+ return value?.trim() || void 0;
1658
+ }
1659
+ function extractPrimaryBrandInfo(fullVersionList, brands) {
1660
+ const primaryBrand = fullVersionList?.[0] || brands?.[0];
1661
+ return {
1662
+ name: sanitizeString(primaryBrand?.brand),
1663
+ version: sanitizeString(primaryBrand?.version)
1664
+ };
1665
+ }
1666
+ async function getHighEntropyDeviceInfo(userAgentData) {
1667
+ const highEntropyValues = await userAgentData.getHighEntropyValues(Array.from(HIGH_ENTROPY_HINTS));
1668
+ const { name: browserName, version: browserVersion } = extractPrimaryBrandInfo(highEntropyValues.fullVersionList, userAgentData.brands);
1669
+ return {
1670
+ device: { model: sanitizeString(highEntropyValues.model) },
1671
+ os: {
1672
+ name: sanitizeString(highEntropyValues.platform),
1673
+ version: sanitizeString(highEntropyValues.platformVersion)
1674
+ },
1675
+ browser: {
1676
+ name: browserName,
1677
+ version: browserVersion
1678
+ }
1679
+ };
1680
+ }
1681
+ const checkForUnbrandedBrowser = (browser) => {
1682
+ const userAgent = typeof navigator !== "undefined" ? navigator.userAgent : "";
1683
+ const fallback = getFallbackDeviceInfo();
1684
+ if (!userAgent) return browser;
1685
+ try {
1686
+ return {
1687
+ ...browser,
1688
+ name: fallback.browser.name,
1689
+ version: fallback.browser.version
1690
+ };
1691
+ } catch {
1692
+ return {
1693
+ ...browser,
1694
+ name: "Unknown",
1695
+ version: "Unknown"
1696
+ };
1697
+ }
1698
+ };
1699
+ function mergeDeviceInfo(fallback, enhanced) {
1700
+ return {
1701
+ device: { model: enhanced.device?.model || fallback.device.model },
1702
+ os: {
1703
+ name: enhanced.os?.name || fallback.os.name,
1704
+ version: enhanced.os?.version || fallback.os.version
1705
+ },
1706
+ browser: checkForUnbrandedBrowser({
1707
+ name: enhanced.browser?.name || fallback.browser.name,
1708
+ version: enhanced.browser?.version || fallback.browser.version
1709
+ })
1710
+ };
1711
+ }
1712
+ function isUserAgentClientHintsSupported(navigator$1) {
1713
+ return Boolean(navigator$1.userAgentData?.getHighEntropyValues && typeof navigator$1.userAgentData.getHighEntropyValues === "function");
1714
+ }
1715
+ async function getDeviceFingerprintInfo() {
1716
+ if (typeof navigator === "undefined") return {
1717
+ device: {},
1718
+ os: {},
1719
+ browser: {}
1720
+ };
1721
+ const customNavigator = navigator;
1722
+ const fallbackInfo = getFallbackDeviceInfo();
1723
+ if (!isUserAgentClientHintsSupported(customNavigator)) return fallbackInfo;
1724
+ try {
1725
+ return mergeDeviceInfo(fallbackInfo, await getHighEntropyDeviceInfo(customNavigator.userAgentData));
1726
+ } catch {
1727
+ return fallbackInfo;
1728
+ }
1729
+ }
1730
+
79
1731
  //#endregion
80
1732
  //#region ../infra/src/http/createApi.ts
81
1733
  var FetchHttpError = class extends Error {
@@ -198,7 +1850,7 @@ const createApi = (config) => {
198
1850
  const requestBody = prepareBody(body);
199
1851
  let finalHeaders = mergedHeaders;
200
1852
  if (requestBody === null && (method === "POST" || method === "PUT" || method === "PATCH")) {
201
- const { "Content-Type": _, ...headersWithoutContentType } = mergedHeaders;
1853
+ const { "Content-Type": _$1, ...headersWithoutContentType } = mergedHeaders;
202
1854
  finalHeaders = headersWithoutContentType;
203
1855
  }
204
1856
  if (onUploadProgress) {
@@ -373,7 +2025,7 @@ function stopCameraStream(stream) {
373
2025
  }
374
2026
  async function enumerateVideoDevices() {
375
2027
  if (typeof navigator === "undefined" || !navigator.mediaDevices) return [];
376
- return (await navigator.mediaDevices.enumerateDevices()).filter((d) => d.kind === "videoinput");
2028
+ return (await navigator.mediaDevices.enumerateDevices()).filter((d$1) => d$1.kind === "videoinput");
377
2029
  }
378
2030
  async function applyTrackConstraints(track, constraints) {
379
2031
  await track.applyConstraints(constraints);
@@ -1007,6 +2659,43 @@ var BrowserEnvironmentProvider = class {
1007
2659
  }
1008
2660
  };
1009
2661
 
2662
+ //#endregion
2663
+ //#region ../infra/src/providers/browser/BrowserInfoProvider.ts
2664
+ var BrowserInfoProvider = class {
2665
+ checkWebRtcSupport() {
2666
+ if (typeof window === "undefined") return false;
2667
+ const hasRTCPeerConnection = "RTCPeerConnection" in window || "webkitRTCPeerConnection" in window || "mozRTCPeerConnection" in window;
2668
+ const hasGetUserMedia = typeof navigator !== "undefined" && navigator.mediaDevices?.getUserMedia !== void 0;
2669
+ return hasRTCPeerConnection && hasGetUserMedia;
2670
+ }
2671
+ getBrowserInfo() {
2672
+ const userAgent = typeof navigator !== "undefined" ? navigator.userAgent : "";
2673
+ const result = new UAParser(userAgent).getResult();
2674
+ return {
2675
+ userAgent,
2676
+ isWebRtcSupported: this.checkWebRtcSupport(),
2677
+ browser: {
2678
+ name: result.browser.name,
2679
+ version: result.browser.version
2680
+ },
2681
+ os: {
2682
+ name: result.os.name,
2683
+ version: result.os.version
2684
+ },
2685
+ device: {
2686
+ model: result.device.model,
2687
+ type: result.device.type,
2688
+ vendor: result.device.vendor
2689
+ },
2690
+ engine: {
2691
+ name: result.engine.name,
2692
+ version: result.engine.version
2693
+ },
2694
+ cpu: { architecture: result.cpu.architecture }
2695
+ };
2696
+ }
2697
+ };
2698
+
1010
2699
  //#endregion
1011
2700
  //#region ../infra/src/providers/browser/BrowserStorageProvider.ts
1012
2701
  /**
@@ -1082,6 +2771,1234 @@ var BrowserTimerProvider = class BrowserTimerProvider {
1082
2771
  }
1083
2772
  };
1084
2773
 
2774
+ //#endregion
2775
+ //#region ../../node_modules/.pnpm/@thumbmarkjs+thumbmarkjs@1.6.4/node_modules/@thumbmarkjs/thumbmarkjs/dist/thumbmark.esm.js
2776
+ const e = 2592e5, t = "thumbmark", n = "https://api.thumbmarkjs.com", o = {
2777
+ exclude: [],
2778
+ include: [],
2779
+ stabilize: ["private", "iframe"],
2780
+ logging: !0,
2781
+ timeout: 5e3,
2782
+ cache_api_call: !0,
2783
+ cache_lifetime_in_ms: 0,
2784
+ performance: !1,
2785
+ experimental: !1,
2786
+ property_name_factory: (e$1) => `${t}_${e$1}`
2787
+ };
2788
+ let r = { ...o };
2789
+ const a = {
2790
+ private: [
2791
+ {
2792
+ exclude: ["canvas"],
2793
+ browsers: [
2794
+ "firefox",
2795
+ "safari>=17",
2796
+ "brave"
2797
+ ]
2798
+ },
2799
+ {
2800
+ exclude: ["audio"],
2801
+ browsers: ["samsungbrowser", "safari"]
2802
+ },
2803
+ {
2804
+ exclude: ["fonts"],
2805
+ browsers: ["firefox"]
2806
+ },
2807
+ {
2808
+ exclude: [
2809
+ "audio.sampleHash",
2810
+ "hardware.deviceMemory",
2811
+ "header.acceptLanguage.q",
2812
+ "system.hardwareConcurrency",
2813
+ "plugins"
2814
+ ],
2815
+ browsers: ["brave"]
2816
+ },
2817
+ {
2818
+ exclude: ["tls.extensions"],
2819
+ browsers: [
2820
+ "firefox",
2821
+ "chrome",
2822
+ "safari"
2823
+ ]
2824
+ },
2825
+ {
2826
+ exclude: ["header.acceptLanguage"],
2827
+ browsers: ["edge", "chrome"]
2828
+ }
2829
+ ],
2830
+ iframe: [{
2831
+ exclude: ["system.applePayVersion", "system.cookieEnabled"],
2832
+ browsers: ["safari"]
2833
+ }, { exclude: ["permissions"] }],
2834
+ vpn: [{ exclude: ["ip"] }]
2835
+ }, s = "undefined" != typeof window ? window.OfflineAudioContext || window.webkitOfflineAudioContext : null;
2836
+ function c(e$1) {
2837
+ let t$1 = 0;
2838
+ for (let n$1 = 0; n$1 < e$1.length; ++n$1) t$1 += Math.abs(e$1[n$1]);
2839
+ return t$1;
2840
+ }
2841
+ function l(e$1, t$1, n$1) {
2842
+ let o$1 = [];
2843
+ for (let t$2 = 0; t$2 < e$1[0].data.length; t$2++) {
2844
+ let n$2 = [];
2845
+ for (let o$2 = 0; o$2 < e$1.length; o$2++) n$2.push(e$1[o$2].data[t$2]);
2846
+ o$1.push(u(n$2));
2847
+ }
2848
+ const r$1 = new Uint8ClampedArray(o$1);
2849
+ return new ImageData(r$1, t$1, n$1);
2850
+ }
2851
+ function u(e$1) {
2852
+ if (0 === e$1.length) return 0;
2853
+ const t$1 = {};
2854
+ for (const n$2 of e$1) t$1[n$2] = (t$1[n$2] || 0) + 1;
2855
+ let n$1 = e$1[0];
2856
+ for (const e$2 in t$1) t$1[e$2] > t$1[n$1] && (n$1 = parseInt(e$2, 10));
2857
+ return n$1;
2858
+ }
2859
+ function d(e$1) {
2860
+ return e$1 ^= e$1 >>> 16, e$1 = Math.imul(e$1, 2246822507), e$1 ^= e$1 >>> 13, e$1 = Math.imul(e$1, 3266489909), (e$1 ^= e$1 >>> 16) >>> 0;
2861
+ }
2862
+ const m = new Uint32Array([
2863
+ 597399067,
2864
+ 2869860233,
2865
+ 951274213,
2866
+ 2716044179
2867
+ ]);
2868
+ function f(e$1, t$1) {
2869
+ return e$1 << t$1 | e$1 >>> 32 - t$1;
2870
+ }
2871
+ function h(e$1, t$1 = 0) {
2872
+ if (t$1 = t$1 ? 0 | t$1 : 0, "string" == typeof e$1 && (e$1 = function(e$2) {
2873
+ if ("undefined" != typeof TextEncoder) return new TextEncoder().encode(e$2).buffer;
2874
+ const t$2 = [];
2875
+ for (let n$2 = 0; n$2 < e$2.length; n$2++) {
2876
+ let o$2 = e$2.charCodeAt(n$2);
2877
+ o$2 < 128 ? t$2.push(o$2) : o$2 < 2048 ? t$2.push(192 | o$2 >> 6, 128 | 63 & o$2) : o$2 < 55296 || o$2 >= 57344 ? t$2.push(224 | o$2 >> 12, 128 | o$2 >> 6 & 63, 128 | 63 & o$2) : (n$2++, o$2 = 65536 + ((1023 & o$2) << 10 | 1023 & e$2.charCodeAt(n$2)), t$2.push(240 | o$2 >> 18, 128 | o$2 >> 12 & 63, 128 | o$2 >> 6 & 63, 128 | 63 & o$2));
2878
+ }
2879
+ return new Uint8Array(t$2).buffer;
2880
+ }(e$1)), !(e$1 instanceof ArrayBuffer)) throw new TypeError("Expected key to be ArrayBuffer or string");
2881
+ const n$1 = new Uint32Array([
2882
+ t$1,
2883
+ t$1,
2884
+ t$1,
2885
+ t$1
2886
+ ]);
2887
+ (function(e$2, t$2) {
2888
+ const n$2 = e$2.byteLength / 16 | 0, o$2 = new Uint32Array(e$2, 0, 4 * n$2);
2889
+ for (let e$3 = 0; e$3 < n$2; e$3++) {
2890
+ const n$3 = o$2.subarray(4 * e$3, 4 * (e$3 + 1));
2891
+ n$3[0] = Math.imul(n$3[0], m[0]), n$3[0] = f(n$3[0], 15), n$3[0] = Math.imul(n$3[0], m[1]), t$2[0] = t$2[0] ^ n$3[0], t$2[0] = f(t$2[0], 19), t$2[0] = t$2[0] + t$2[1], t$2[0] = Math.imul(t$2[0], 5) + 1444728091, n$3[1] = Math.imul(n$3[1], m[1]), n$3[1] = f(n$3[1], 16), n$3[1] = Math.imul(n$3[1], m[2]), t$2[1] = t$2[1] ^ n$3[1], t$2[1] = f(t$2[1], 17), t$2[1] = t$2[1] + t$2[2], t$2[1] = Math.imul(t$2[1], 5) + 197830471, n$3[2] = Math.imul(n$3[2], m[2]), n$3[2] = f(n$3[2], 17), n$3[2] = Math.imul(n$3[2], m[3]), t$2[2] = t$2[2] ^ n$3[2], t$2[2] = f(t$2[2], 15), t$2[2] = t$2[2] + t$2[3], t$2[2] = Math.imul(t$2[2], 5) + 2530024501, n$3[3] = Math.imul(n$3[3], m[3]), n$3[3] = f(n$3[3], 18), n$3[3] = Math.imul(n$3[3], m[0]), t$2[3] = t$2[3] ^ n$3[3], t$2[3] = f(t$2[3], 13), t$2[3] = t$2[3] + t$2[0], t$2[3] = Math.imul(t$2[3], 5) + 850148119;
2892
+ }
2893
+ })(e$1, n$1), function(e$2, t$2) {
2894
+ const n$2 = e$2.byteLength / 16 | 0, o$2 = e$2.byteLength % 16, r$1 = new Uint32Array(4), i = new Uint8Array(e$2, 16 * n$2, o$2);
2895
+ switch (o$2) {
2896
+ case 15: r$1[3] = r$1[3] ^ i[14] << 16;
2897
+ case 14: r$1[3] = r$1[3] ^ i[13] << 8;
2898
+ case 13: r$1[3] = r$1[3] ^ i[12], r$1[3] = Math.imul(r$1[3], m[3]), r$1[3] = f(r$1[3], 18), r$1[3] = Math.imul(r$1[3], m[0]), t$2[3] = t$2[3] ^ r$1[3];
2899
+ case 12: r$1[2] = r$1[2] ^ i[11] << 24;
2900
+ case 11: r$1[2] = r$1[2] ^ i[10] << 16;
2901
+ case 10: r$1[2] = r$1[2] ^ i[9] << 8;
2902
+ case 9: r$1[2] = r$1[2] ^ i[8], r$1[2] = Math.imul(r$1[2], m[2]), r$1[2] = f(r$1[2], 17), r$1[2] = Math.imul(r$1[2], m[3]), t$2[2] = t$2[2] ^ r$1[2];
2903
+ case 8: r$1[1] = r$1[1] ^ i[7] << 24;
2904
+ case 7: r$1[1] = r$1[1] ^ i[6] << 16;
2905
+ case 6: r$1[1] = r$1[1] ^ i[5] << 8;
2906
+ case 5: r$1[1] = r$1[1] ^ i[4], r$1[1] = Math.imul(r$1[1], m[1]), r$1[1] = f(r$1[1], 16), r$1[1] = Math.imul(r$1[1], m[2]), t$2[1] = t$2[1] ^ r$1[1];
2907
+ case 4: r$1[0] = r$1[0] ^ i[3] << 24;
2908
+ case 3: r$1[0] = r$1[0] ^ i[2] << 16;
2909
+ case 2: r$1[0] = r$1[0] ^ i[1] << 8;
2910
+ case 1: r$1[0] = r$1[0] ^ i[0], r$1[0] = Math.imul(r$1[0], m[0]), r$1[0] = f(r$1[0], 15), r$1[0] = Math.imul(r$1[0], m[1]), t$2[0] = t$2[0] ^ r$1[0];
2911
+ }
2912
+ }(e$1, n$1), function(e$2, t$2) {
2913
+ t$2[0] = t$2[0] ^ e$2.byteLength, t$2[1] = t$2[1] ^ e$2.byteLength, t$2[2] = t$2[2] ^ e$2.byteLength, t$2[3] = t$2[3] ^ e$2.byteLength, t$2[0] = t$2[0] + t$2[1] | 0, t$2[0] = t$2[0] + t$2[2] | 0, t$2[0] = t$2[0] + t$2[3] | 0, t$2[1] = t$2[1] + t$2[0] | 0, t$2[2] = t$2[2] + t$2[0] | 0, t$2[3] = t$2[3] + t$2[0] | 0, t$2[0] = d(t$2[0]), t$2[1] = d(t$2[1]), t$2[2] = d(t$2[2]), t$2[3] = d(t$2[3]), t$2[0] = t$2[0] + t$2[1] | 0, t$2[0] = t$2[0] + t$2[2] | 0, t$2[0] = t$2[0] + t$2[3] | 0, t$2[1] = t$2[1] + t$2[0] | 0, t$2[2] = t$2[2] + t$2[0] | 0, t$2[3] = t$2[3] + t$2[0] | 0;
2914
+ }(e$1, n$1);
2915
+ const o$1 = new Uint8Array(n$1.buffer);
2916
+ return Array.from(o$1).map(((e$2) => e$2.toString(16).padStart(2, "0"))).join("");
2917
+ }
2918
+ const p = 280;
2919
+ async function g(e$1) {
2920
+ for (var t$1; !document.body;) await w(50);
2921
+ const n$1 = document.createElement("iframe");
2922
+ n$1.setAttribute("frameBorder", "0");
2923
+ const o$1 = n$1.style;
2924
+ o$1.setProperty("position", "fixed"), o$1.setProperty("display", "block", "important"), o$1.setProperty("visibility", "visible"), o$1.setProperty("border", "0"), o$1.setProperty("opacity", "0"), n$1.src = "about:blank", document.body.appendChild(n$1);
2925
+ const r$1 = n$1.contentDocument || (null === (t$1 = n$1.contentWindow) || void 0 === t$1 ? void 0 : t$1.document);
2926
+ if (!r$1) throw new Error("Iframe document is not accessible");
2927
+ e$1({ iframe: r$1 }), setTimeout((() => {
2928
+ document.body.removeChild(n$1);
2929
+ }), 0);
2930
+ }
2931
+ function w(e$1, t$1) {
2932
+ return new Promise(((n$1) => setTimeout(n$1, e$1, t$1)));
2933
+ }
2934
+ const v = [
2935
+ "Arial",
2936
+ "Arial Black",
2937
+ "Arial Narrow",
2938
+ "Arial Rounded MT",
2939
+ "Arimo",
2940
+ "Archivo",
2941
+ "Barlow",
2942
+ "Bebas Neue",
2943
+ "Bitter",
2944
+ "Bookman",
2945
+ "Calibri",
2946
+ "Cabin",
2947
+ "Candara",
2948
+ "Century",
2949
+ "Century Gothic",
2950
+ "Comic Sans MS",
2951
+ "Constantia",
2952
+ "Courier",
2953
+ "Courier New",
2954
+ "Crimson Text",
2955
+ "DM Mono",
2956
+ "DM Sans",
2957
+ "DM Serif Display",
2958
+ "DM Serif Text",
2959
+ "Dosis",
2960
+ "Droid Sans",
2961
+ "Exo",
2962
+ "Fira Code",
2963
+ "Fira Sans",
2964
+ "Franklin Gothic Medium",
2965
+ "Garamond",
2966
+ "Geneva",
2967
+ "Georgia",
2968
+ "Gill Sans",
2969
+ "Helvetica",
2970
+ "Impact",
2971
+ "Inconsolata",
2972
+ "Indie Flower",
2973
+ "Inter",
2974
+ "Josefin Sans",
2975
+ "Karla",
2976
+ "Lato",
2977
+ "Lexend",
2978
+ "Lucida Bright",
2979
+ "Lucida Console",
2980
+ "Lucida Sans Unicode",
2981
+ "Manrope",
2982
+ "Merriweather",
2983
+ "Merriweather Sans",
2984
+ "Montserrat",
2985
+ "Myriad",
2986
+ "Noto Sans",
2987
+ "Nunito",
2988
+ "Nunito Sans",
2989
+ "Open Sans",
2990
+ "Optima",
2991
+ "Orbitron",
2992
+ "Oswald",
2993
+ "Pacifico",
2994
+ "Palatino",
2995
+ "Perpetua",
2996
+ "PT Sans",
2997
+ "PT Serif",
2998
+ "Poppins",
2999
+ "Prompt",
3000
+ "Public Sans",
3001
+ "Quicksand",
3002
+ "Rajdhani",
3003
+ "Recursive",
3004
+ "Roboto",
3005
+ "Roboto Condensed",
3006
+ "Rockwell",
3007
+ "Rubik",
3008
+ "Segoe Print",
3009
+ "Segoe Script",
3010
+ "Segoe UI",
3011
+ "Sora",
3012
+ "Source Sans Pro",
3013
+ "Space Mono",
3014
+ "Tahoma",
3015
+ "Taviraj",
3016
+ "Times",
3017
+ "Times New Roman",
3018
+ "Titillium Web",
3019
+ "Trebuchet MS",
3020
+ "Ubuntu",
3021
+ "Varela Round",
3022
+ "Verdana",
3023
+ "Work Sans"
3024
+ ], y = [
3025
+ "monospace",
3026
+ "sans-serif",
3027
+ "serif"
3028
+ ];
3029
+ function S(e$1, t$1) {
3030
+ return e$1.font = `72px ${t$1}`, e$1.measureText("WwMmLli0Oo").width;
3031
+ }
3032
+ function b() {
3033
+ var e$1;
3034
+ const t$1 = document.createElement("canvas"), n$1 = null !== (e$1 = t$1.getContext("webgl")) && void 0 !== e$1 ? e$1 : t$1.getContext("experimental-webgl");
3035
+ if (n$1 && "getParameter" in n$1) try {
3036
+ const e$2 = (n$1.getParameter(n$1.VENDOR) || "").toString(), t$2 = (n$1.getParameter(n$1.RENDERER) || "").toString();
3037
+ let o$1 = {
3038
+ vendor: e$2,
3039
+ renderer: t$2,
3040
+ version: (n$1.getParameter(n$1.VERSION) || "").toString(),
3041
+ shadingLanguageVersion: (n$1.getParameter(n$1.SHADING_LANGUAGE_VERSION) || "").toString()
3042
+ };
3043
+ if (!t$2.length || !e$2.length) {
3044
+ const e$3 = n$1.getExtension("WEBGL_debug_renderer_info");
3045
+ if (e$3) {
3046
+ const t$3 = (n$1.getParameter(e$3.UNMASKED_VENDOR_WEBGL) || "").toString(), r$1 = (n$1.getParameter(e$3.UNMASKED_RENDERER_WEBGL) || "").toString();
3047
+ t$3 && (o$1.vendorUnmasked = t$3), r$1 && (o$1.rendererUnmasked = r$1);
3048
+ }
3049
+ }
3050
+ return o$1;
3051
+ } catch (e$2) {}
3052
+ return "undefined";
3053
+ }
3054
+ function E() {
3055
+ const e$1 = new Float32Array(1), t$1 = new Uint8Array(e$1.buffer);
3056
+ return e$1[0] = Infinity, e$1[0] = e$1[0] - e$1[0], t$1[3];
3057
+ }
3058
+ const M = (e$1, t$1, n$1, o$1) => {
3059
+ const r$1 = (n$1 - t$1) / o$1;
3060
+ let i = 0;
3061
+ for (let n$2 = 0; n$2 < o$1; n$2++) i += e$1(t$1 + (n$2 + .5) * r$1);
3062
+ return i * r$1;
3063
+ };
3064
+ function P(e$1, t$1) {
3065
+ const n$1 = {};
3066
+ return t$1.forEach(((t$2) => {
3067
+ const o$1 = function(e$2) {
3068
+ if (0 === e$2.length) return null;
3069
+ const t$3 = {};
3070
+ e$2.forEach(((e$3) => {
3071
+ const n$3 = String(e$3);
3072
+ t$3[n$3] = (t$3[n$3] || 0) + 1;
3073
+ }));
3074
+ let n$2 = e$2[0], o$2 = 1;
3075
+ return Object.keys(t$3).forEach(((e$3) => {
3076
+ t$3[e$3] > o$2 && (n$2 = e$3, o$2 = t$3[e$3]);
3077
+ })), n$2;
3078
+ }(e$1.map(((e$2) => t$2 in e$2 ? e$2[t$2] : void 0)).filter(((e$2) => void 0 !== e$2)));
3079
+ o$1 && (n$1[t$2] = o$1);
3080
+ })), n$1;
3081
+ }
3082
+ const A = [
3083
+ "accelerometer",
3084
+ "accessibility",
3085
+ "accessibility-events",
3086
+ "ambient-light-sensor",
3087
+ "background-fetch",
3088
+ "background-sync",
3089
+ "bluetooth",
3090
+ "camera",
3091
+ "clipboard-read",
3092
+ "clipboard-write",
3093
+ "device-info",
3094
+ "display-capture",
3095
+ "gyroscope",
3096
+ "geolocation",
3097
+ "local-fonts",
3098
+ "magnetometer",
3099
+ "microphone",
3100
+ "midi",
3101
+ "nfc",
3102
+ "notifications",
3103
+ "payment-handler",
3104
+ "persistent-storage",
3105
+ "push",
3106
+ "speaker",
3107
+ "storage-access",
3108
+ "top-level-storage-access",
3109
+ "window-management",
3110
+ "query"
3111
+ ];
3112
+ function x() {
3113
+ var e$1, t$1, n$1, o$1, r$1, i;
3114
+ if ("undefined" == typeof navigator) return {
3115
+ name: "unknown",
3116
+ version: "unknown"
3117
+ };
3118
+ const a$1 = navigator.userAgent, s$1 = [
3119
+ /(?<name>SamsungBrowser)\/(?<version>\d+(?:\.\d+)+)/,
3120
+ /(?<name>EdgA|EdgiOS|Edg)\/(?<version>\d+(?:\.\d+)+)/,
3121
+ /(?<name>OPR|OPX)\/(?<version>\d+(?:\.\d+)+)/,
3122
+ /Opera[\s\/](?<version>\d+(?:\.\d+)+)/,
3123
+ /Opera Mini\/(?<version>\d+(?:\.\d+)+)/,
3124
+ /Opera Mobi\/(?<version>\d+(?:\.\d+)+)/,
3125
+ /(?<name>Vivaldi)\/(?<version>\d+(?:\.\d+)+)/,
3126
+ /(?<name>Brave)\/(?<version>\d+(?:\.\d+)+)/,
3127
+ /(?<name>CriOS)\/(?<version>\d+(?:\.\d+)+)/,
3128
+ /(?<name>FxiOS)\/(?<version>\d+(?:\.\d+)+)/,
3129
+ /(?<name>Chrome|Chromium)\/(?<version>\d+(?:\.\d+)+)/,
3130
+ /(?<name>Firefox|Waterfox|Iceweasel|IceCat)\/(?<version>\d+(?:\.\d+)+)/,
3131
+ /Version\/(?<version1>[\d.]+).*Safari\/[\d.]+|(?<name>Safari)\/(?<version2>[\d.]+)/,
3132
+ /(?<name>MSIE|Trident|IEMobile).+?(?<version>\d+(?:\.\d+)+)/,
3133
+ /(?<name>[A-Za-z]+)\/(?<version>\d+(?:\.\d+)+)/
3134
+ ], c$1 = {
3135
+ edg: "Edge",
3136
+ edga: "Edge",
3137
+ edgios: "Edge",
3138
+ opr: "Opera",
3139
+ opx: "Opera",
3140
+ crios: "Chrome",
3141
+ fxios: "Firefox",
3142
+ samsung: "SamsungBrowser",
3143
+ vivaldi: "Vivaldi",
3144
+ brave: "Brave"
3145
+ };
3146
+ for (const l$1 of s$1) {
3147
+ const s$2 = a$1.match(l$1);
3148
+ if (s$2) {
3149
+ let a$2 = null === (e$1 = s$2.groups) || void 0 === e$1 ? void 0 : e$1.name, u$1 = (null === (t$1 = s$2.groups) || void 0 === t$1 ? void 0 : t$1.version) || (null === (n$1 = s$2.groups) || void 0 === n$1 ? void 0 : n$1.version1) || (null === (o$1 = s$2.groups) || void 0 === o$1 ? void 0 : o$1.version2);
3150
+ if (a$2 || !(null === (r$1 = s$2.groups) || void 0 === r$1 ? void 0 : r$1.version1) && !(null === (i = s$2.groups) || void 0 === i ? void 0 : i.version2) || (a$2 = "Safari"), !a$2 && l$1.source.includes("Opera Mini") && (a$2 = "Opera Mini"), !a$2 && l$1.source.includes("Opera Mobi") && (a$2 = "Opera Mobi"), !a$2 && l$1.source.includes("Opera") && (a$2 = "Opera"), !a$2 && s$2[1] && (a$2 = s$2[1]), !u$1 && s$2[2] && (u$1 = s$2[2]), a$2) return {
3151
+ name: c$1[a$2.toLowerCase()] || a$2,
3152
+ version: u$1 || "unknown"
3153
+ };
3154
+ }
3155
+ }
3156
+ return {
3157
+ name: "unknown",
3158
+ version: "unknown"
3159
+ };
3160
+ }
3161
+ function C() {
3162
+ if ("undefined" == typeof navigator || !navigator.userAgent) return !1;
3163
+ const e$1 = navigator.userAgent;
3164
+ return /Mobi|Android|iPhone|iPod|IEMobile|Opera Mini|Opera Mobi|webOS|BlackBerry|Windows Phone/i.test(e$1) && !/iPad/i.test(e$1);
3165
+ }
3166
+ function _() {
3167
+ let e$1 = [];
3168
+ const t$1 = {
3169
+ "prefers-contrast": [
3170
+ "high",
3171
+ "more",
3172
+ "low",
3173
+ "less",
3174
+ "forced",
3175
+ "no-preference"
3176
+ ],
3177
+ "any-hover": ["hover", "none"],
3178
+ "any-pointer": [
3179
+ "none",
3180
+ "coarse",
3181
+ "fine"
3182
+ ],
3183
+ pointer: [
3184
+ "none",
3185
+ "coarse",
3186
+ "fine"
3187
+ ],
3188
+ hover: ["hover", "none"],
3189
+ update: ["fast", "slow"],
3190
+ "inverted-colors": ["inverted", "none"],
3191
+ "prefers-reduced-motion": ["reduce", "no-preference"],
3192
+ "prefers-reduced-transparency": ["reduce", "no-preference"],
3193
+ scripting: [
3194
+ "none",
3195
+ "initial-only",
3196
+ "enabled"
3197
+ ],
3198
+ "forced-colors": ["active", "none"]
3199
+ };
3200
+ return Object.keys(t$1).forEach(((n$1) => {
3201
+ t$1[n$1].forEach(((t$2) => {
3202
+ matchMedia(`(${n$1}: ${t$2})`).matches && e$1.push(`${n$1}: ${t$2}`);
3203
+ }));
3204
+ })), e$1;
3205
+ }
3206
+ function I() {
3207
+ if ("https:" === window.location.protocol && "function" == typeof window.ApplePaySession) try {
3208
+ const e$1 = window.ApplePaySession.supportsVersion;
3209
+ for (let t$1 = 15; t$1 > 0; t$1--) if (e$1(t$1)) return t$1;
3210
+ } catch (e$1) {
3211
+ return 0;
3212
+ }
3213
+ return 0;
3214
+ }
3215
+ const T = "SamsungBrowser" !== x().name ? 1 : 3;
3216
+ let R, k = null;
3217
+ function O(e$1) {
3218
+ const t$1 = [];
3219
+ return function e$2(n$1) {
3220
+ if (n$1 && n$1.toJSON && "function" == typeof n$1.toJSON && (n$1 = n$1.toJSON()), void 0 === n$1) return;
3221
+ if ("number" == typeof n$1) return isFinite(n$1) ? "" + n$1 : "null";
3222
+ if ("object" != typeof n$1) return JSON.stringify(n$1);
3223
+ let o$1, r$1;
3224
+ if (Array.isArray(n$1)) {
3225
+ for (r$1 = "[", o$1 = 0; o$1 < n$1.length; o$1++) o$1 && (r$1 += ","), r$1 += e$2(n$1[o$1]) || "null";
3226
+ return r$1 + "]";
3227
+ }
3228
+ if (null === n$1) return "null";
3229
+ if (-1 !== t$1.indexOf(n$1)) throw new TypeError("Converting circular structure to JSON");
3230
+ const i = t$1.push(n$1) - 1, a$1 = Object.keys(n$1).sort();
3231
+ for (r$1 = "", o$1 = 0; o$1 < a$1.length; o$1++) {
3232
+ const t$2 = a$1[o$1], i$1 = e$2(n$1[t$2]);
3233
+ i$1 && (r$1 && (r$1 += ","), r$1 += JSON.stringify(t$2) + ":" + i$1);
3234
+ }
3235
+ return t$1.splice(i, 1), "{" + r$1 + "}";
3236
+ }(e$1) || "";
3237
+ }
3238
+ const L = [
3239
+ "𝔄",
3240
+ "𝔅",
3241
+ "ℭ",
3242
+ "𝔇",
3243
+ "𝔈",
3244
+ "𝔉",
3245
+ "𝔸",
3246
+ "𝔹",
3247
+ "ℂ",
3248
+ "𝔻",
3249
+ "𝔼",
3250
+ "𝔽"
3251
+ ], B = [
3252
+ "β",
3253
+ "ψ",
3254
+ "λ",
3255
+ "ε",
3256
+ "ζ",
3257
+ "α",
3258
+ "ξ",
3259
+ "μ",
3260
+ "ρ",
3261
+ "φ",
3262
+ "κ",
3263
+ "τ",
3264
+ "η",
3265
+ "σ",
3266
+ "ι",
3267
+ "ω",
3268
+ "γ",
3269
+ "ν",
3270
+ "χ",
3271
+ "δ",
3272
+ "θ",
3273
+ "π",
3274
+ "υ",
3275
+ "ο"
3276
+ ];
3277
+ function D(e$1, t$1) {
3278
+ return `<math><mrow>${t$1}</mrow></math>`;
3279
+ }
3280
+ function N() {
3281
+ let e$1 = "<mo>∏</mo>";
3282
+ return L.forEach(((t$1, n$1) => {
3283
+ const o$1 = 2 * n$1, r$1 = B.slice(o$1, o$1 + 2);
3284
+ 2 === r$1.length && (e$1 += `<mmultiscripts><mi>${t$1}</mi><none/><mi>${r$1[1]}</mi><mprescripts></mprescripts><mi>${r$1[0]}</mi><none/></mmultiscripts>`);
3285
+ })), D(0, `<munderover><mmultiscripts>${e$1}</mmultiscripts></munderover>`);
3286
+ }
3287
+ function $() {
3288
+ const e$1 = [];
3289
+ return L.forEach(((t$1, n$1) => {
3290
+ const o$1 = 2 * n$1, r$1 = B.slice(o$1, o$1 + 2);
3291
+ 2 === r$1.length && e$1.push(D(0, `<mmultiscripts><mi>${t$1}</mi><none/><mi>${r$1[1]}</mi><mprescripts></mprescripts><mi>${r$1[0]}</mi><none/></mmultiscripts>`));
3292
+ })), e$1;
3293
+ }
3294
+ const V = {
3295
+ audio: async function() {
3296
+ return s ? async function() {
3297
+ return new Promise(((e$1, t$1) => {
3298
+ try {
3299
+ const t$2 = new s(1, 5e3, 44100), n$1 = t$2.createBufferSource(), o$1 = t$2.createOscillator();
3300
+ o$1.frequency.value = 1e3;
3301
+ const r$1 = t$2.createDynamicsCompressor();
3302
+ let i;
3303
+ r$1.threshold.value = -50, r$1.knee.value = 40, r$1.ratio.value = 12, r$1.attack.value = 0, r$1.release.value = .2, o$1.connect(r$1), r$1.connect(t$2.destination), o$1.start(), t$2.oncomplete = (o$2) => {
3304
+ i = o$2.renderedBuffer.getChannelData(0), e$1({
3305
+ sampleHash: c(i),
3306
+ maxChannels: t$2.destination.maxChannelCount,
3307
+ channelCountMode: n$1.channelCountMode
3308
+ });
3309
+ }, t$2.startRendering();
3310
+ } catch (e$2) {
3311
+ console.error("Error creating audio fingerprint:", e$2), t$1(e$2);
3312
+ }
3313
+ }));
3314
+ }() : null;
3315
+ },
3316
+ canvas: async function() {
3317
+ return new Promise(((e$1) => {
3318
+ const t$1 = Array.from({ length: 3 }, (() => function() {
3319
+ const e$2 = document.createElement("canvas"), t$2 = e$2.getContext("2d");
3320
+ if (!t$2) return null;
3321
+ e$2.width = p, e$2.height = 20;
3322
+ const n$1 = t$2.createLinearGradient(0, 0, e$2.width, e$2.height);
3323
+ n$1.addColorStop(0, "red"), n$1.addColorStop(1 / 6, "orange"), n$1.addColorStop(2 / 6, "yellow"), n$1.addColorStop(.5, "green"), n$1.addColorStop(4 / 6, "blue"), n$1.addColorStop(5 / 6, "indigo"), n$1.addColorStop(1, "violet"), t$2.fillStyle = n$1, t$2.fillRect(0, 0, e$2.width, e$2.height);
3324
+ const o$1 = "Random Text WMwmil10Oo";
3325
+ t$2.font = "23.123px Arial", t$2.fillStyle = "black", t$2.fillText(o$1, -5, 15), t$2.fillStyle = "rgba(0, 0, 255, 0.5)", t$2.fillText(o$1, -3.3, 17.7), t$2.beginPath(), t$2.moveTo(0, 0), t$2.lineTo(2 * e$2.width / 7, e$2.height), t$2.strokeStyle = "white", t$2.lineWidth = 2, t$2.stroke();
3326
+ return t$2.getImageData(0, 0, e$2.width, e$2.height);
3327
+ }())).filter(((e$2) => null !== e$2));
3328
+ 0 !== t$1.length ? e$1({ commonPixelsHash: h(l(t$1, p, 20).data.toString()).toString() }) : e$1(null);
3329
+ }));
3330
+ },
3331
+ fonts: async function(e$1) {
3332
+ return new Promise(((e$2) => {
3333
+ try {
3334
+ g((async ({ iframe: t$1 }) => {
3335
+ const n$1 = t$1.createElement("canvas").getContext("2d");
3336
+ if (!n$1) return void e$2(null);
3337
+ const o$1 = y.map(((e$3) => S(n$1, e$3)));
3338
+ let r$1 = {};
3339
+ v.forEach(((e$3) => {
3340
+ const t$2 = S(n$1, e$3);
3341
+ o$1.includes(t$2) || (r$1[e$3] = t$2);
3342
+ })), e$2(r$1);
3343
+ }));
3344
+ } catch (t$1) {
3345
+ e$2(null);
3346
+ }
3347
+ }));
3348
+ },
3349
+ hardware: function() {
3350
+ return new Promise(((e$1, t$1) => {
3351
+ const n$1 = void 0 !== navigator.deviceMemory ? navigator.deviceMemory : 0, o$1 = window.performance && window.performance.memory ? window.performance.memory : 0;
3352
+ e$1({
3353
+ videocard: b(),
3354
+ architecture: E(),
3355
+ deviceMemory: n$1.toString() || "undefined",
3356
+ jsHeapSizeLimit: o$1.jsHeapSizeLimit || 0
3357
+ });
3358
+ }));
3359
+ },
3360
+ locales: function() {
3361
+ return new Promise(((e$1) => {
3362
+ e$1({
3363
+ languages: navigator.language,
3364
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
3365
+ });
3366
+ }));
3367
+ },
3368
+ math: function() {
3369
+ return new Promise(((e$1) => {
3370
+ e$1({
3371
+ acos: Math.acos(.5),
3372
+ asin: M(Math.asin, -1, 1, 97),
3373
+ cos: M(Math.cos, 0, Math.PI, 97),
3374
+ largeCos: Math.cos(0x56bc75e2d63100000),
3375
+ largeSin: Math.sin(0x56bc75e2d63100000),
3376
+ largeTan: Math.tan(0x56bc75e2d63100000),
3377
+ sin: M(Math.sin, -Math.PI, Math.PI, 97),
3378
+ tan: M(Math.tan, 0, 2 * Math.PI, 97)
3379
+ });
3380
+ }));
3381
+ },
3382
+ permissions: async function(e$1) {
3383
+ const t$1 = (null == e$1 ? void 0 : e$1.permissions_to_check) || A;
3384
+ return P(await Promise.all(Array.from({ length: 3 }, (() => async function(e$2) {
3385
+ const t$2 = {};
3386
+ for (const n$1 of e$2) try {
3387
+ t$2[n$1] = (await navigator.permissions.query({ name: n$1 })).state.toString();
3388
+ } catch (e$3) {}
3389
+ return t$2;
3390
+ }(t$1)))), t$1);
3391
+ },
3392
+ plugins: async function() {
3393
+ const e$1 = [];
3394
+ if (navigator.plugins) for (let t$1 = 0; t$1 < navigator.plugins.length; t$1++) {
3395
+ const n$1 = navigator.plugins[t$1];
3396
+ e$1.push([
3397
+ n$1.name,
3398
+ n$1.filename,
3399
+ n$1.description
3400
+ ].join("|"));
3401
+ }
3402
+ return new Promise(((t$1) => {
3403
+ t$1({ plugins: e$1 });
3404
+ }));
3405
+ },
3406
+ screen: function() {
3407
+ return new Promise(((e$1) => {
3408
+ if ("undefined" == typeof matchMedia || "undefined" == typeof screen) return void e$1(null);
3409
+ const t$1 = {
3410
+ is_touchscreen: navigator.maxTouchPoints > 0,
3411
+ maxTouchPoints: navigator.maxTouchPoints,
3412
+ colorDepth: screen.colorDepth,
3413
+ mediaMatches: _()
3414
+ };
3415
+ C() && navigator.maxTouchPoints > 0 && (t$1.resolution = function() {
3416
+ const e$2 = window.screen.width, t$2 = window.screen.height;
3417
+ return `${Math.max(e$2, t$2).toString()}x${Math.min(e$2, t$2).toString()}`;
3418
+ }()), e$1(t$1);
3419
+ }));
3420
+ },
3421
+ system: function() {
3422
+ return new Promise(((e$1) => {
3423
+ const t$1 = x();
3424
+ e$1({
3425
+ platform: window.navigator.platform,
3426
+ productSub: navigator.productSub,
3427
+ product: navigator.product,
3428
+ useragent: navigator.userAgent,
3429
+ hardwareConcurrency: navigator.hardwareConcurrency,
3430
+ browser: {
3431
+ name: t$1.name,
3432
+ version: t$1.version
3433
+ },
3434
+ mobile: C(),
3435
+ applePayVersion: I(),
3436
+ cookieEnabled: window.navigator.cookieEnabled
3437
+ });
3438
+ }));
3439
+ },
3440
+ webgl: async function() {
3441
+ "undefined" != typeof document && (R = document.createElement("canvas"), R.width = 200, R.height = 100, k = R.getContext("webgl"));
3442
+ try {
3443
+ if (!k) throw new Error("WebGL not supported");
3444
+ return { commonPixelsHash: h(l(Array.from({ length: T }, (() => function() {
3445
+ try {
3446
+ if (!k) throw new Error("WebGL not supported");
3447
+ const e$1 = "\n attribute vec2 position;\n void main() {\n gl_Position = vec4(position, 0.0, 1.0);\n }\n ", t$1 = "\n precision mediump float;\n void main() {\n gl_FragColor = vec4(0.812, 0.195, 0.553, 0.921); // Set line color\n }\n ", n$1 = k.createShader(k.VERTEX_SHADER), o$1 = k.createShader(k.FRAGMENT_SHADER);
3448
+ if (!n$1 || !o$1) throw new Error("Failed to create shaders");
3449
+ if (k.shaderSource(n$1, e$1), k.shaderSource(o$1, t$1), k.compileShader(n$1), !k.getShaderParameter(n$1, k.COMPILE_STATUS)) throw new Error("Vertex shader compilation failed: " + k.getShaderInfoLog(n$1));
3450
+ if (k.compileShader(o$1), !k.getShaderParameter(o$1, k.COMPILE_STATUS)) throw new Error("Fragment shader compilation failed: " + k.getShaderInfoLog(o$1));
3451
+ const r$1 = k.createProgram();
3452
+ if (!r$1) throw new Error("Failed to create shader program");
3453
+ if (k.attachShader(r$1, n$1), k.attachShader(r$1, o$1), k.linkProgram(r$1), !k.getProgramParameter(r$1, k.LINK_STATUS)) throw new Error("Shader program linking failed: " + k.getProgramInfoLog(r$1));
3454
+ k.useProgram(r$1);
3455
+ const i = 137, a$1 = new Float32Array(4 * i), s$1 = 2 * Math.PI / i;
3456
+ for (let e$2 = 0; e$2 < i; e$2++) {
3457
+ const t$2 = e$2 * s$1;
3458
+ a$1[4 * e$2] = 0, a$1[4 * e$2 + 1] = 0, a$1[4 * e$2 + 2] = Math.cos(t$2) * (R.width / 2), a$1[4 * e$2 + 3] = Math.sin(t$2) * (R.height / 2);
3459
+ }
3460
+ const c$1 = k.createBuffer();
3461
+ k.bindBuffer(k.ARRAY_BUFFER, c$1), k.bufferData(k.ARRAY_BUFFER, a$1, k.STATIC_DRAW);
3462
+ const l$1 = k.getAttribLocation(r$1, "position");
3463
+ k.enableVertexAttribArray(l$1), k.vertexAttribPointer(l$1, 2, k.FLOAT, !1, 0, 0), k.viewport(0, 0, R.width, R.height), k.clearColor(0, 0, 0, 1), k.clear(k.COLOR_BUFFER_BIT), k.drawArrays(k.LINES, 0, 2 * i);
3464
+ const u$1 = new Uint8ClampedArray(R.width * R.height * 4);
3465
+ k.readPixels(0, 0, R.width, R.height, k.RGBA, k.UNSIGNED_BYTE, u$1);
3466
+ return new ImageData(u$1, R.width, R.height);
3467
+ } catch (e$1) {
3468
+ return new ImageData(1, 1);
3469
+ } finally {
3470
+ k && (k.bindBuffer(k.ARRAY_BUFFER, null), k.useProgram(null), k.viewport(0, 0, k.drawingBufferWidth, k.drawingBufferHeight), k.clearColor(0, 0, 0, 0));
3471
+ }
3472
+ }())), R.width, R.height).data.toString()).toString() };
3473
+ } catch (e$1) {
3474
+ return { webgl: "unsupported" };
3475
+ }
3476
+ }
3477
+ }, F = {
3478
+ webrtc: async function() {
3479
+ return new Promise(((e$1) => {
3480
+ try {
3481
+ const t$1 = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
3482
+ if (!t$1) return void e$1({
3483
+ supported: !1,
3484
+ error: "WebRTC not supported"
3485
+ });
3486
+ const n$1 = new t$1({
3487
+ iceCandidatePoolSize: 1,
3488
+ iceServers: []
3489
+ });
3490
+ n$1.createDataChannel("");
3491
+ (async () => {
3492
+ try {
3493
+ const o$1 = await n$1.createOffer({
3494
+ offerToReceiveAudio: !0,
3495
+ offerToReceiveVideo: !0
3496
+ });
3497
+ await n$1.setLocalDescription(o$1);
3498
+ const r$1 = o$1.sdp || "", i = [...new Set((r$1.match(/extmap:\d+ [^\n\r]+/g) || []).map(((e$2) => e$2.replace(/extmap:\d+ /, ""))))].sort(), a$1 = (e$2) => {
3499
+ const t$2 = r$1.match(/* @__PURE__ */ new RegExp(`m=${e$2} [^\\s]+ [^\\s]+ ([^\\n\\r]+)`));
3500
+ return t$2 ? t$2[1].split(" ") : [];
3501
+ }, s$1 = (e$2, t$2) => t$2.map(((t$3) => {
3502
+ const n$2 = new RegExp(`(rtpmap|fmtp|rtcp-fb):${t$3} (.+)`, "g"), o$2 = [...r$1.matchAll(n$2)];
3503
+ if (!o$2.length) return null;
3504
+ const i$1 = {};
3505
+ return o$2.forEach(((t$4) => {
3506
+ const [n$3, o$3, r$2] = t$4, a$2 = r$2.split("/");
3507
+ "rtpmap" === o$3 ? (i$1.mimeType = `${e$2}/${a$2[0]}`, i$1.clockRate = +a$2[1], "audio" === e$2 && (i$1.channels = +a$2[2] || 1)) : "rtcp-fb" === o$3 ? (i$1.feedbackSupport = i$1.feedbackSupport || [], i$1.feedbackSupport.push(r$2)) : "fmtp" === o$3 && (i$1.sdpFmtpLine = r$2);
3508
+ })), i$1;
3509
+ })).filter(Boolean), c$1 = s$1("audio", a$1("audio")), l$1 = s$1("video", a$1("video")), u$1 = {
3510
+ audio: {
3511
+ count: c$1.length,
3512
+ hash: h(O(c$1))
3513
+ },
3514
+ video: {
3515
+ count: l$1.length,
3516
+ hash: h(O(l$1))
3517
+ },
3518
+ extensionsHash: h(O(i))
3519
+ }, d$1 = await new Promise(((e$2) => {
3520
+ const t$2 = setTimeout((() => {
3521
+ n$1.removeEventListener("icecandidate", o$2), n$1.close(), e$2({
3522
+ supported: !0,
3523
+ ...u$1,
3524
+ timeout: !0
3525
+ });
3526
+ }), 3e3), o$2 = (r$2) => {
3527
+ const i$1 = r$2.candidate;
3528
+ i$1 && i$1.candidate && (clearTimeout(t$2), n$1.removeEventListener("icecandidate", o$2), n$1.close(), e$2({
3529
+ supported: !0,
3530
+ ...u$1,
3531
+ candidateType: i$1.type || ""
3532
+ }));
3533
+ };
3534
+ n$1.addEventListener("icecandidate", o$2);
3535
+ }));
3536
+ e$1({
3537
+ details: d$1,
3538
+ hash: h(O(d$1))
3539
+ });
3540
+ } catch (t$2) {
3541
+ n$1.close(), e$1({
3542
+ supported: !0,
3543
+ error: `WebRTC offer failed: ${t$2.message}`
3544
+ });
3545
+ }
3546
+ })();
3547
+ } catch (t$1) {
3548
+ e$1({
3549
+ supported: !1,
3550
+ error: `WebRTC error: ${t$1.message}`
3551
+ });
3552
+ }
3553
+ }));
3554
+ },
3555
+ mathml: async function() {
3556
+ return new Promise(((e$1) => {
3557
+ try {
3558
+ g((async ({ iframe: t$1 }) => {
3559
+ try {
3560
+ if (!function(e$2) {
3561
+ try {
3562
+ const t$2 = e$2.createElement("math");
3563
+ t$2.innerHTML = "<mrow><mi>x</mi></mrow>", t$2.style.position = "absolute", t$2.style.visibility = "hidden", e$2.body.appendChild(t$2);
3564
+ const n$2 = t$2.getBoundingClientRect();
3565
+ return e$2.body.removeChild(t$2), n$2.width > 0 && n$2.height > 0;
3566
+ } catch (e$3) {
3567
+ return !1;
3568
+ }
3569
+ }(t$1)) return void e$1({
3570
+ supported: !1,
3571
+ error: "MathML not supported"
3572
+ });
3573
+ const n$1 = [
3574
+ D("integral", "<msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mfrac><mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mrow><mi>g</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mfrac><mi>dx</mi>"),
3575
+ D("fraction", "<mfrac><mrow><mi>π</mi><mo>×</mo><msup><mi>r</mi><mn>2</mn></msup></mrow><mrow><mn>2</mn><mi>σ</mi></mrow></mfrac>"),
3576
+ D("matrix", "<mo>[</mo><mtable><mtr><mtd><mi>α</mi></mtd><mtd><mi>β</mi></mtd></mtr><mtr><mtd><mi>γ</mi></mtd><mtd><mi>δ</mi></mtd></mtr></mtable><mo>]</mo>"),
3577
+ N(),
3578
+ ...$()
3579
+ ], o$1 = [];
3580
+ let r$1 = "";
3581
+ n$1.forEach(((e$2, n$2) => {
3582
+ const i$1 = function(e$3, t$2) {
3583
+ try {
3584
+ const n$3 = t$2.createElement("math");
3585
+ n$3.innerHTML = e$3.replace(/<\/?math>/g, ""), n$3.style.whiteSpace = "nowrap", n$3.style.position = "absolute", n$3.style.visibility = "hidden", n$3.style.top = "-9999px", t$2.body.appendChild(n$3);
3586
+ const o$2 = n$3.getBoundingClientRect(), r$2 = (t$2.defaultView || window).getComputedStyle(n$3), i$2 = {
3587
+ dimensions: {
3588
+ width: o$2.width,
3589
+ height: o$2.height
3590
+ },
3591
+ fontInfo: {
3592
+ fontFamily: r$2.fontFamily,
3593
+ fontSize: r$2.fontSize,
3594
+ fontWeight: r$2.fontWeight,
3595
+ fontStyle: r$2.fontStyle,
3596
+ lineHeight: r$2.lineHeight,
3597
+ fontVariant: r$2.fontVariant || "normal",
3598
+ fontStretch: r$2.fontStretch || "normal",
3599
+ fontSizeAdjust: r$2.fontSizeAdjust || "none",
3600
+ textRendering: r$2.textRendering || "auto",
3601
+ fontFeatureSettings: r$2.fontFeatureSettings || "normal",
3602
+ fontVariantNumeric: r$2.fontVariantNumeric || "normal",
3603
+ fontKerning: r$2.fontKerning || "auto"
3604
+ }
3605
+ };
3606
+ return t$2.body.removeChild(n$3), i$2;
3607
+ } catch (e$4) {
3608
+ return { error: e$4.message };
3609
+ }
3610
+ }(e$2, t$1);
3611
+ o$1.push({
3612
+ width: i$1.dimensions.width,
3613
+ height: i$1.dimensions.height
3614
+ }), 0 === n$2 && i$1.fontInfo && (r$1 = h(O(i$1.fontInfo)));
3615
+ }));
3616
+ const i = {
3617
+ fontStyleHash: r$1,
3618
+ dimensions: o$1
3619
+ };
3620
+ e$1({
3621
+ details: i,
3622
+ hash: h(O(i))
3623
+ });
3624
+ } catch (t$2) {
3625
+ e$1({
3626
+ supported: !1,
3627
+ error: `MathML error: ${t$2.message}`
3628
+ });
3629
+ }
3630
+ }));
3631
+ } catch (t$1) {
3632
+ e$1({
3633
+ supported: !1,
3634
+ error: `MathML error: ${t$1.message}`
3635
+ });
3636
+ }
3637
+ }));
3638
+ },
3639
+ speech: async function() {
3640
+ return new Promise(((e$1) => {
3641
+ try {
3642
+ if ("undefined" == typeof window || !window.speechSynthesis || "function" != typeof window.speechSynthesis.getVoices) return void e$1({
3643
+ supported: !1,
3644
+ error: "Speech Synthesis API not supported"
3645
+ });
3646
+ let t$1 = !1, n$1 = null;
3647
+ const o$1 = (o$2) => {
3648
+ if (!t$1) {
3649
+ t$1 = !0, n$1 && clearTimeout(n$1);
3650
+ try {
3651
+ const t$2 = o$2.map(((e$2) => {
3652
+ const t$3 = (e$3) => e$3.replace(/\\/g, "\\\\").replace(/,/g, "\\,");
3653
+ return [
3654
+ t$3(e$2.voiceURI || ""),
3655
+ t$3(e$2.name || ""),
3656
+ t$3(e$2.lang || ""),
3657
+ e$2.localService ? "1" : "0",
3658
+ e$2.default ? "1" : "0"
3659
+ ].join(",");
3660
+ }));
3661
+ t$2.sort();
3662
+ const n$2 = {
3663
+ voiceCount: o$2.length,
3664
+ voicesHash: h(O(t$2))
3665
+ };
3666
+ e$1({
3667
+ details: n$2,
3668
+ hash: h(O(n$2))
3669
+ });
3670
+ } catch (t$2) {
3671
+ e$1({
3672
+ supported: !0,
3673
+ error: `Voice processing failed: ${t$2.message}`
3674
+ });
3675
+ }
3676
+ }
3677
+ }, r$1 = window.speechSynthesis.getVoices();
3678
+ if (r$1.length > 0) return void o$1(r$1);
3679
+ n$1 = setTimeout((() => {
3680
+ o$1(window.speechSynthesis.getVoices());
3681
+ }), 800);
3682
+ const i = () => {
3683
+ window.speechSynthesis.removeEventListener("voiceschanged", i);
3684
+ o$1(window.speechSynthesis.getVoices());
3685
+ };
3686
+ window.speechSynthesis.addEventListener("voiceschanged", i);
3687
+ } catch (t$1) {
3688
+ e$1({
3689
+ supported: !1,
3690
+ error: `Speech Synthesis error: ${t$1.message}`
3691
+ });
3692
+ }
3693
+ }));
3694
+ }
3695
+ }, U = {}, j = { timeout: "true" }, W = (e$1, t$1, n$1) => {
3696
+ U[e$1] = t$1;
3697
+ };
3698
+ function G(e$1, t$1) {
3699
+ var n$1;
3700
+ let o$1 = x();
3701
+ if ("unknown" === o$1.name && e$1.system && "object" == typeof e$1.system && !Array.isArray(e$1.system)) {
3702
+ const t$2 = e$1.system.browser;
3703
+ if (t$2 && "object" == typeof t$2 && !Array.isArray(t$2)) {
3704
+ const e$2 = t$2;
3705
+ o$1 = {
3706
+ name: e$2.name || "unknown",
3707
+ version: e$2.version || "unknown"
3708
+ };
3709
+ }
3710
+ }
3711
+ const r$1 = o$1.name.toLowerCase(), i = o$1.version.split(".")[0] || "0", s$1 = parseInt(i, 10), c$1 = [...(null == t$1 ? void 0 : t$1.exclude) || []], l$1 = (null == t$1 ? void 0 : t$1.stabilize) || [], u$1 = (null == t$1 ? void 0 : t$1.include) || [];
3712
+ for (const e$2 of l$1) {
3713
+ const t$2 = a[e$2];
3714
+ if (t$2) for (const e$3 of t$2) {
3715
+ const t$3 = !("browsers" in e$3), o$2 = !t$3 && (null === (n$1 = e$3.browsers) || void 0 === n$1 ? void 0 : n$1.some(((e$4) => {
3716
+ const t$4 = e$4.match(/(.+?)(>=)(\d+)/);
3717
+ if (t$4) {
3718
+ const [, e$5, , n$2] = t$4;
3719
+ return r$1 === e$5 && s$1 >= parseInt(n$2, 10);
3720
+ }
3721
+ return r$1 === e$4;
3722
+ })));
3723
+ (t$3 || o$2) && c$1.push(...e$3.exclude);
3724
+ }
3725
+ }
3726
+ return function e$2(t$2, n$2 = "") {
3727
+ const o$2 = {};
3728
+ for (const [r$2, i$1] of Object.entries(t$2)) {
3729
+ const t$3 = n$2 ? `${n$2}.${r$2}` : r$2;
3730
+ if ("object" != typeof i$1 || Array.isArray(i$1) || null === i$1) {
3731
+ const e$3 = c$1.some(((e$4) => t$3.startsWith(e$4))), n$3 = u$1.some(((e$4) => t$3.startsWith(e$4)));
3732
+ e$3 && !n$3 || (o$2[r$2] = i$1);
3733
+ } else {
3734
+ const n$3 = e$2(i$1, t$3);
3735
+ Object.keys(n$3).length > 0 && (o$2[r$2] = n$3);
3736
+ }
3737
+ }
3738
+ return o$2;
3739
+ }(e$1);
3740
+ }
3741
+ const z = "visitor_id";
3742
+ function J(e$1) {
3743
+ return e$1.storage_property_name ? e$1.storage_property_name : e$1.property_name_factory(z);
3744
+ }
3745
+ const q = `${t}_${z}`;
3746
+ function K(e$1, t$1) {
3747
+ try {
3748
+ localStorage.setItem(J(t$1), e$1);
3749
+ } catch (e$2) {}
3750
+ }
3751
+ const Y = "cache";
3752
+ function X(e$1) {
3753
+ try {
3754
+ const t$1 = localStorage.getItem(e$1.property_name_factory(Y));
3755
+ return JSON.parse(t$1) || {};
3756
+ } catch (e$2) {}
3757
+ return {};
3758
+ }
3759
+ function Z(t$1) {
3760
+ return t$1.cache_lifetime_in_ms > e ? Date.now() + e : Date.now() + t$1.cache_lifetime_in_ms;
3761
+ }
3762
+ let Q = null, ee = null;
3763
+ const te = (e$1, t$1) => {
3764
+ if (e$1.cache_api_call) {
3765
+ if (ee) return Promise.resolve(ee);
3766
+ const t$2 = function(e$2) {
3767
+ const t$3 = X(e$2);
3768
+ if (t$3 && t$3.apiResponse && t$3.apiResponseExpiry && Date.now() <= t$3.apiResponseExpiry) return t$3.apiResponse;
3769
+ }(e$1);
3770
+ if (t$2) return Promise.resolve(t$2);
3771
+ if (Q) return Q;
3772
+ }
3773
+ const o$1 = `${e$1.api_endpoint || n}/thumbmark`, r$1 = function(e$2) {
3774
+ try {
3775
+ const t$2 = J(e$2);
3776
+ let n$1 = localStorage.getItem(t$2);
3777
+ return n$1 || t$2 === q || (n$1 = localStorage.getItem(q), n$1 && K(n$1, e$2)), n$1;
3778
+ } catch (e$3) {
3779
+ return null;
3780
+ }
3781
+ }(e$1), i = {
3782
+ components: t$1,
3783
+ options: e$1,
3784
+ clientHash: h(O(t$1)),
3785
+ version: "1.6.3"
3786
+ };
3787
+ r$1 && (i.visitorId = r$1);
3788
+ const a$1 = fetch(o$1, {
3789
+ method: "POST",
3790
+ headers: {
3791
+ "x-api-key": e$1.api_key,
3792
+ Authorization: "custom-authorized",
3793
+ "Content-Type": "application/json"
3794
+ },
3795
+ body: JSON.stringify(i)
3796
+ }).then(((e$2) => {
3797
+ if (!e$2.ok) {
3798
+ if (403 === e$2.status) throw new Error("INVALID_API_KEY");
3799
+ throw new Error(`HTTP error! status: ${e$2.status}`);
3800
+ }
3801
+ return e$2.json();
3802
+ })).then(((t$2) => (t$2.visitorId && t$2.visitorId !== r$1 && K(t$2.visitorId, e$1), ee = t$2, function(e$2, t$3) {
3803
+ if (!e$2.cache_api_call || !e$2.cache_lifetime_in_ms) return;
3804
+ (function(e$3, t$4) {
3805
+ const n$1 = {
3806
+ ...X(e$3),
3807
+ ...t$4
3808
+ };
3809
+ try {
3810
+ localStorage.setItem(e$3.property_name_factory(Y), JSON.stringify(n$1));
3811
+ } catch (e$4) {}
3812
+ })(e$2, {
3813
+ apiResponseExpiry: Z(e$2),
3814
+ apiResponse: t$3
3815
+ });
3816
+ }(e$1, t$2), Q = null, t$2))).catch(((e$2) => {
3817
+ if (console.error("Error fetching pro data", e$2), Q = null, "INVALID_API_KEY" === e$2.message) throw e$2;
3818
+ return null;
3819
+ })), s$1 = e$1.timeout || 5e3, c$1 = new Promise(((t$2) => {
3820
+ setTimeout((() => {
3821
+ const n$1 = X(e$1);
3822
+ n$1 && n$1.apiResponse ? t$2(n$1.apiResponse) : t$2({
3823
+ info: { timed_out: !0 },
3824
+ ...r$1 && { visitorId: r$1 }
3825
+ });
3826
+ }), s$1);
3827
+ }));
3828
+ return Q = Promise.race([a$1, c$1]), Q;
3829
+ };
3830
+ async function ne(e$1) {
3831
+ var t$1;
3832
+ if ("undefined" == typeof document || "undefined" == typeof window) return {
3833
+ thumbmark: "",
3834
+ components: {},
3835
+ info: {},
3836
+ version: "1.6.3",
3837
+ error: "Browser environment required"
3838
+ };
3839
+ const r$1 = {
3840
+ ...o,
3841
+ ...e$1
3842
+ }, i = r$1.logging && !sessionStorage.getItem("_tmjs_l") && Math.random() < 1e-4, { elapsed: s$1, resolvedComponents: c$1 } = await oe({
3843
+ ...V,
3844
+ ...U
3845
+ }, r$1);
3846
+ let l$1 = {}, u$1 = {};
3847
+ if (i || r$1.experimental) {
3848
+ const { elapsed: e$2, resolvedComponents: t$2 } = await oe(F, r$1);
3849
+ l$1 = t$2, u$1 = e$2;
3850
+ }
3851
+ const d$1 = r$1.api_key ? te(r$1, c$1) : null;
3852
+ let m$1 = null;
3853
+ if (d$1) try {
3854
+ m$1 = await d$1;
3855
+ } catch (e$2) {
3856
+ if (e$2 instanceof Error && "INVALID_API_KEY" === e$2.message) return {
3857
+ error: "Invalid API key or quota exceeded",
3858
+ components: {},
3859
+ info: {},
3860
+ version: "1.6.3",
3861
+ thumbmark: ""
3862
+ };
3863
+ throw e$2;
3864
+ }
3865
+ const f$1 = {
3866
+ ...s$1,
3867
+ ...u$1
3868
+ }, p$1 = r$1.performance ? { elapsed: f$1 } : {}, g$1 = G((null == m$1 ? void 0 : m$1.components) || {}, r$1), w$1 = {
3869
+ ...c$1,
3870
+ ...g$1
3871
+ }, v$1 = (null == m$1 ? void 0 : m$1.info) || { uniqueness: { score: "api only" } }, y$1 = null !== (t$1 = null == m$1 ? void 0 : m$1.thumbmark) && void 0 !== t$1 ? t$1 : h(O(w$1));
3872
+ i && async function(e$2, t$2, o$1, r$2 = {}) {
3873
+ var i$1;
3874
+ const a$1 = `${n}/log`, s$2 = {
3875
+ thumbmark: e$2,
3876
+ components: t$2,
3877
+ experimental: r$2,
3878
+ version: "1.6.3",
3879
+ options: o$1,
3880
+ path: null === (i$1 = null === window || void 0 === window ? void 0 : window.location) || void 0 === i$1 ? void 0 : i$1.pathname
3881
+ };
3882
+ sessionStorage.setItem("_tmjs_l", "1");
3883
+ try {
3884
+ await fetch(a$1, {
3885
+ method: "POST",
3886
+ headers: { "Content-Type": "application/json" },
3887
+ body: JSON.stringify(s$2)
3888
+ });
3889
+ } catch (e$3) {}
3890
+ }(y$1, w$1, r$1, l$1).catch((() => {}));
3891
+ return {
3892
+ ...(null == m$1 ? void 0 : m$1.visitorId) && { visitorId: m$1.visitorId },
3893
+ thumbmark: y$1,
3894
+ components: w$1,
3895
+ info: v$1,
3896
+ version: "1.6.3",
3897
+ ...p$1,
3898
+ ...Object.keys(l$1).length > 0 && r$1.experimental && { experimental: l$1 },
3899
+ ...(null == m$1 ? void 0 : m$1.requestId) && { requestId: m$1.requestId }
3900
+ };
3901
+ }
3902
+ async function oe(e$1, t$1) {
3903
+ const n$1 = {
3904
+ ...o,
3905
+ ...t$1
3906
+ }, r$1 = Object.entries(e$1).filter((([e$2]) => {
3907
+ var t$2;
3908
+ return !(null === (t$2 = null == n$1 ? void 0 : n$1.exclude) || void 0 === t$2 ? void 0 : t$2.includes(e$2));
3909
+ })).filter((([e$2]) => {
3910
+ var t$2, o$1, r$2, i$1;
3911
+ return (null === (t$2 = null == n$1 ? void 0 : n$1.include) || void 0 === t$2 ? void 0 : t$2.some(((e$3) => e$3.includes(".")))) ? null === (o$1 = null == n$1 ? void 0 : n$1.include) || void 0 === o$1 ? void 0 : o$1.some(((t$3) => t$3.startsWith(e$2))) : 0 === (null === (r$2 = null == n$1 ? void 0 : n$1.include) || void 0 === r$2 ? void 0 : r$2.length) || (null === (i$1 = null == n$1 ? void 0 : n$1.include) || void 0 === i$1 ? void 0 : i$1.includes(e$2));
3912
+ })), i = r$1.map((([e$2]) => e$2)), s$1 = await function(e$2, t$2, n$2) {
3913
+ return Promise.all(e$2.map(((e$3) => {
3914
+ const o$1 = performance.now();
3915
+ return Promise.race([e$3.then(((e$4) => ({
3916
+ value: e$4,
3917
+ elapsed: performance.now() - o$1
3918
+ }))), (r$2 = t$2, i$1 = n$2, new Promise(((e$4) => {
3919
+ setTimeout((() => e$4(i$1)), r$2);
3920
+ }))).then(((e$4) => ({
3921
+ value: e$4,
3922
+ elapsed: performance.now() - o$1
3923
+ })))]);
3924
+ var r$2, i$1;
3925
+ })));
3926
+ }(r$1.map((([e$2, n$2]) => n$2(t$1))), (null == n$1 ? void 0 : n$1.timeout) || 5e3, j), c$1 = {}, l$1 = {};
3927
+ s$1.forEach(((e$2, t$2) => {
3928
+ var n$2;
3929
+ null != e$2.value && (l$1[i[t$2]] = e$2.value, c$1[i[t$2]] = null !== (n$2 = e$2.elapsed) && void 0 !== n$2 ? n$2 : 0);
3930
+ }));
3931
+ return {
3932
+ elapsed: c$1,
3933
+ resolvedComponents: G(l$1, n$1)
3934
+ };
3935
+ }
3936
+ var se = class {
3937
+ constructor(e$1) {
3938
+ this.options = {
3939
+ ...o,
3940
+ ...e$1
3941
+ };
3942
+ }
3943
+ async get(e$1) {
3944
+ return ne({
3945
+ ...this.options,
3946
+ ...e$1
3947
+ });
3948
+ }
3949
+ getVersion() {
3950
+ return "1.6.3";
3951
+ }
3952
+ includeComponent(e$1, t$1) {
3953
+ W(e$1, t$1);
3954
+ }
3955
+ };
3956
+
3957
+ //#endregion
3958
+ //#region ../infra/src/providers/browser/FingerprintProvider.ts
3959
+ var FingerprintProvider = class {
3960
+ constructor(ipLookup) {
3961
+ this.ipLookup = ipLookup;
3962
+ }
3963
+ async getFingerprint(disableIpify = false) {
3964
+ const thumbmarkData = await new se().get();
3965
+ const [deviceInfo, ip] = await Promise.all([getDeviceFingerprintInfo(), disableIpify ? Promise.resolve("") : this.ipLookup.getIp()]);
3966
+ return {
3967
+ visitorId: thumbmarkData.thumbmark,
3968
+ ip,
3969
+ deviceInfo
3970
+ };
3971
+ }
3972
+ };
3973
+
3974
+ //#endregion
3975
+ //#region ../infra/src/providers/browser/IpifyProvider.ts
3976
+ var IpifyProvider = class {
3977
+ async getIp() {
3978
+ try {
3979
+ if (typeof fetch === "undefined") return "";
3980
+ let timeoutId = 0;
3981
+ const controller = new AbortController();
3982
+ if (AbortSignal.timeout) {
3983
+ const signal = AbortSignal.timeout(3e3);
3984
+ return (await (await fetch("https://api.ipify.org?format=json", { signal })).json()).ip;
3985
+ }
3986
+ const timeoutPromise = new Promise((_$1, reject) => {
3987
+ timeoutId = setTimeout(() => {
3988
+ controller.abort();
3989
+ reject(/* @__PURE__ */ new Error("Request timeout"));
3990
+ }, 3e3);
3991
+ });
3992
+ const fetchPromise = fetch("https://api.ipify.org?format=json", { signal: controller.signal }).then((res) => res.json()).then((data) => data.ip);
3993
+ const result = await Promise.race([fetchPromise, timeoutPromise]);
3994
+ clearTimeout(timeoutId);
3995
+ return result;
3996
+ } catch {
3997
+ return "";
3998
+ }
3999
+ }
4000
+ };
4001
+
1085
4002
  //#endregion
1086
4003
  //#region ../infra/src/providers/browser/LocalRecordingProvider.ts
1087
4004
  function toBase64(videoBlob) {
@@ -1476,13 +4393,13 @@ var MotionSensorProvider = class {
1476
4393
  //#region ../infra/src/providers/browser/openviduLazy.ts
1477
4394
  let openViduImport;
1478
4395
  async function enableProdModeBeforeLoad() {
1479
- const { OpenViduLogger } = await import("./OpenViduLogger-Cu0BjUgP.esm.js").then(__toDynamicImportESM(1));
4396
+ const { OpenViduLogger } = await import("./OpenViduLogger-B6-UWyJe.esm.js").then(__toDynamicImportESM(1));
1480
4397
  OpenViduLogger.getInstance().enableProdMode();
1481
4398
  }
1482
4399
  async function loadOpenVidu() {
1483
4400
  if (openViduImport) return openViduImport;
1484
4401
  await enableProdModeBeforeLoad();
1485
- openViduImport = import("./lib-Cmee0CBZ.esm.js").then(__toDynamicImportESM(1));
4402
+ openViduImport = import("./lib-ieMlAKG1.esm.js").then(__toDynamicImportESM(1));
1486
4403
  return openViduImport;
1487
4404
  }
1488
4405
 
@@ -1520,10 +4437,10 @@ var OpenViduRecordingProvider = class {
1520
4437
  frameRate: 30
1521
4438
  });
1522
4439
  session.on("exception", (event) => {
1523
- const e = event;
4440
+ const e$1 = event;
1524
4441
  params.events?.onSessionException?.({
1525
- name: e?.name,
1526
- message: e?.message,
4442
+ name: e$1?.name,
4443
+ message: e$1?.message,
1527
4444
  sessionId: session.sessionId
1528
4445
  });
1529
4446
  });
@@ -1558,8 +4475,8 @@ var OpenViduRecordingProvider = class {
1558
4475
  disconnect: async () => {
1559
4476
  try {
1560
4477
  session.disconnect();
1561
- params.stream.getTracks().forEach((t) => {
1562
- t.stop();
4478
+ params.stream.getTracks().forEach((t$1) => {
4479
+ t$1.stop();
1563
4480
  });
1564
4481
  } finally {
1565
4482
  params.events?.onSessionDisconnected?.(session.sessionId);
@@ -1905,9 +4822,9 @@ var MlWasmJSApi = class MlWasmJSApi {
1905
4822
  try {
1906
4823
  window.wasmArrayBuffer = await fetch(libPath).then((response) => response.arrayBuffer()).then((buffer) => new Uint8Array(buffer));
1907
4824
  this.wasmModule = await this.Module();
1908
- } catch (e) {
4825
+ } catch (e$1) {
1909
4826
  if (useSimd) return await this.loadWasm(false, webLibPath, webLibPathSimd);
1910
- else throw e;
4827
+ else throw e$1;
1911
4828
  }
1912
4829
  return useSimd;
1913
4830
  }
@@ -1935,9 +4852,9 @@ var MlWasmJSApi = class MlWasmJSApi {
1935
4852
  this.modelsBuffers = this.pipelineApiUtilities.allocateModelsBuffers(buffSizes);
1936
4853
  for (const [type, data] of modelData) {
1937
4854
  const buffers = this.modelsBuffers?.get(type);
1938
- for (let k = 0; k < buffers.size(); k++) {
1939
- const buffer = buffers?.get(k);
1940
- if (buffer) buffer.set(data[k]);
4855
+ for (let k$1 = 0; k$1 < buffers.size(); k$1++) {
4856
+ const buffer = buffers?.get(k$1);
4857
+ if (buffer) buffer.set(data[k$1]);
1941
4858
  else throw new Error("Unable to get model buffer from shared memory!");
1942
4859
  }
1943
4860
  }
@@ -2073,8 +4990,8 @@ var MlWasmJSApi = class MlWasmJSApi {
2073
4990
  if (isFinished) return;
2074
4991
  await new Promise((resolve) => setTimeout(resolve, 0));
2075
4992
  }
2076
- } catch (e) {
2077
- console.log("Error in wasmCallWrapper:", e);
4993
+ } catch (e$1) {
4994
+ console.log("Error in wasmCallWrapper:", e$1);
2078
4995
  }
2079
4996
  }, ...args);
2080
4997
  }
@@ -2170,7 +5087,7 @@ async function warmupWasm(config) {
2170
5087
  const modelsBasePath = config.modelsBasePath ?? deriveModelsBasePath(config.wasmPath);
2171
5088
  if (state === "loading" && loadingPromise) return loadingPromise;
2172
5089
  if (state === "ready") {
2173
- if (pipelines.filter((p) => !loadedPipelines.includes(p)).length === 0) return;
5090
+ if (pipelines.filter((p$1) => !loadedPipelines.includes(p$1)).length === 0) return;
2174
5091
  if (!lastConfig) throw new Error("Cannot add pipelines: original warmup config not available");
2175
5092
  if (lastConfig.wasmPath !== config.wasmPath || lastConfig.glueCodePath !== config.glueCodePath || (lastConfig.wasmSimdPath ?? lastConfig.wasmPath) !== (config.wasmSimdPath ?? config.wasmPath) || (lastConfig.useSimd ?? true) !== (config.useSimd ?? true)) throw new Error("Cannot add pipelines: WASM config mismatch. Use same wasmPath, glueCodePath, and useSimd settings.");
2176
5093
  const combinedPipelines = [...new Set([...loadedPipelines, ...pipelines])];
@@ -2603,16 +5520,16 @@ var IdCaptureProvider = class extends BaseWasmProvider {
2603
5520
  const canvasWidth = canvas.width();
2604
5521
  const canvasHeight = canvas.height();
2605
5522
  if (!canvasWidth || !canvasHeight) return null;
2606
- const x = Math.max(0, Math.min(rect.x, canvasWidth));
2607
- const y = Math.max(0, Math.min(rect.y, canvasHeight));
2608
- const w = Math.max(1, Math.min(rect.w, canvasWidth - x));
2609
- const h = Math.max(1, Math.min(rect.h, canvasHeight - y));
5523
+ const x$1 = Math.max(0, Math.min(rect.x, canvasWidth));
5524
+ const y$1 = Math.max(0, Math.min(rect.y, canvasHeight));
5525
+ const w$1 = Math.max(1, Math.min(rect.w, canvasWidth - x$1));
5526
+ const h$1 = Math.max(1, Math.min(rect.h, canvasHeight - y$1));
2610
5527
  const croppedCanvasElement = document.createElement("canvas");
2611
- croppedCanvasElement.width = w;
2612
- croppedCanvasElement.height = h;
5528
+ croppedCanvasElement.width = w$1;
5529
+ croppedCanvasElement.height = h$1;
2613
5530
  const ctx = croppedCanvasElement.getContext("2d");
2614
5531
  if (!ctx) return null;
2615
- ctx.drawImage(canvas.canvas, x, y, w, h, 0, 0, w, h);
5532
+ ctx.drawImage(canvas.canvas, x$1, y$1, w$1, h$1, 0, 0, w$1, h$1);
2616
5533
  return new IncodeCanvas(croppedCanvasElement);
2617
5534
  }
2618
5535
  /**
@@ -2781,4 +5698,4 @@ const DEFAULT_ID_CAPTURE_THRESHOLDS = {
2781
5698
  const DEFAULT_ID_CAPTURE_MODEL_VERSION = "v2";
2782
5699
 
2783
5700
  //#endregion
2784
- export { createManager as C, isIOS as D, isDesktop as E, isIPhone14OrHigher as O, stopCameraStream as S, isAndroid as T, createHiddenVideoElement as _, FaceDetectionProvider as a, enumerateVideoDevices as b, OpenViduRecordingProvider as c, BrowserTimerProvider as d, BrowserStorageProvider as f, queryCameraPermission as g, StreamCanvasCapture as h, IdCaptureProvider as i, isSafari as k, MotionSensorProvider as l, StreamCanvasProcessingSession as m, DEFAULT_ID_CAPTURE_THRESHOLDS as n, warmupWasm as o, BrowserEnvironmentProvider as p, WasmUtilProvider as r, VisibilityProvider as s, DEFAULT_ID_CAPTURE_MODEL_VERSION as t, LocalRecordingProvider as u, IncodeCanvas as v, createApi_default as w, requestCameraAccess as x, applyTrackConstraints as y };
5701
+ export { getUserAgent as A, enumerateVideoDevices as C, createApi_default as D, createManager as E, isSafari as F, isDesktop as M, isIOS as N, getDeviceInfo as O, isIPhone14OrHigher as P, applyTrackConstraints as S, stopCameraStream as T, StreamCanvasProcessingSession as _, FaceDetectionProvider as a, createHiddenVideoElement as b, OpenViduRecordingProvider as c, IpifyProvider as d, FingerprintProvider as f, BrowserEnvironmentProvider as g, BrowserInfoProvider as h, IdCaptureProvider as i, isAndroid as j, getWindowDimensions as k, MotionSensorProvider as l, BrowserStorageProvider as m, DEFAULT_ID_CAPTURE_THRESHOLDS as n, warmupWasm as o, BrowserTimerProvider as p, WasmUtilProvider as r, VisibilityProvider as s, DEFAULT_ID_CAPTURE_MODEL_VERSION as t, LocalRecordingProvider as u, StreamCanvasCapture as v, requestCameraAccess as w, IncodeCanvas as x, queryCameraPermission as y };