@incodetech/core 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/Actor-CI32dTbG.d.ts +2 -0
  2. package/dist/BaseWasmProvider-C_DLEI40.esm.js +1118 -0
  3. package/dist/BrowserStorageProvider-CuOW1Er2.esm.js +55 -0
  4. package/dist/BrowserTimerProvider-DhNc_x02.esm.js +22 -0
  5. package/dist/ITimerCapability-C67ZRskg.esm.js +7 -0
  6. package/dist/IpifyProvider-D7jx52AL.esm.js +139 -0
  7. package/dist/Manager-C8PrhBOx.d.ts +19 -0
  8. package/dist/MotionSensorProvider-4v7xkqAp.esm.js +254 -0
  9. package/dist/OpenViduRecordingProvider-CMu6XVdc.esm.js +87 -0
  10. package/dist/StateMachine-BCQrZJhf.d.ts +2 -0
  11. package/dist/WasmUtilProvider-j98OJf-S.esm.js +114 -0
  12. package/dist/addressSearch-BpTbTWCa.esm.js +430 -0
  13. package/dist/ae-signature-DDDZmWXj.esm.js +12 -0
  14. package/dist/ae-signature.d.ts +25 -0
  15. package/dist/ae-signature.esm.js +8 -0
  16. package/dist/antifraud.d.ts +57 -0
  17. package/dist/antifraud.esm.js +45 -0
  18. package/dist/antifraudStateMachine-O0TMf6yc.esm.js +39 -0
  19. package/dist/api-CESGtpbH.esm.js +53 -0
  20. package/dist/authentication.d.ts +12 -0
  21. package/dist/authentication.esm.js +25 -0
  22. package/dist/authenticationManager-5M-fKzXx.esm.js +67 -0
  23. package/dist/authenticationManager-C83GNIhl.d.ts +66 -0
  24. package/dist/authenticationStateMachine-BMZqatiF.esm.js +139 -0
  25. package/dist/backCameraStream-DMdMeGk2.esm.js +346 -0
  26. package/dist/browserSimulation-gxD8cSpM.esm.js +20 -0
  27. package/dist/camera-DBSxa6ML.d.ts +4 -0
  28. package/dist/camera-PA2Ljri3.esm.js +22 -0
  29. package/dist/camera.d.ts +15 -0
  30. package/dist/camera.esm.js +5 -0
  31. package/dist/chunk-CRF6K_H_.esm.js +49 -0
  32. package/dist/consent.d.ts +398 -0
  33. package/dist/consent.esm.js +79 -0
  34. package/dist/consentStateMachine-CCT-B60O.esm.js +151 -0
  35. package/dist/cpf-PPz2Njto.esm.js +38 -0
  36. package/dist/cpf-ocr.d.ts +204 -0
  37. package/dist/cpf-ocr.esm.js +177 -0
  38. package/dist/cross-document-data-match.d.ts +34 -0
  39. package/dist/cross-document-data-match.esm.js +71 -0
  40. package/dist/curp-validation.d.ts +188 -0
  41. package/dist/curp-validation.esm.js +110 -0
  42. package/dist/curpValidationStateMachine-CitWLr2c.esm.js +595 -0
  43. package/dist/custom-fields.d.ts +115 -0
  44. package/dist/custom-fields.esm.js +177 -0
  45. package/dist/custom-watchlist.d.ts +66 -0
  46. package/dist/custom-watchlist.esm.js +86 -0
  47. package/dist/dateUtils-UoN5xswP.esm.js +23 -0
  48. package/dist/deepsightLoader-Cm4JIT_z.esm.js +52 -0
  49. package/dist/deepsightService-CEVxzehb.d.ts +412 -0
  50. package/dist/deepsightService-O74l4Y__.esm.js +489 -0
  51. package/dist/device.d.ts +46 -0
  52. package/dist/device.esm.js +106 -0
  53. package/dist/displayErrors-DqJ_IbsG.d.ts +39 -0
  54. package/dist/document-capture.d.ts +906 -0
  55. package/dist/document-capture.esm.js +156 -0
  56. package/dist/document-upload.d.ts +331 -0
  57. package/dist/document-upload.esm.js +203 -0
  58. package/dist/documentCaptureStateMachine-BqzTDy9k.esm.js +394 -0
  59. package/dist/dynamic-forms.d.ts +178 -0
  60. package/dist/dynamic-forms.esm.js +323 -0
  61. package/dist/ekyb.d.ts +148 -0
  62. package/dist/ekyb.esm.js +127 -0
  63. package/dist/ekybStateMachine-CyMx_kg-.esm.js +674 -0
  64. package/dist/ekyc.d.ts +164 -0
  65. package/dist/ekyc.esm.js +104 -0
  66. package/dist/ekycStateMachine-oeO0Iekd.esm.js +10626 -0
  67. package/dist/electronic-signature.d.ts +4 -0
  68. package/dist/electronic-signature.esm.js +7 -0
  69. package/dist/electronicSignatureManager-D9OHzTpG.esm.js +428 -0
  70. package/dist/email.d.ts +4 -0
  71. package/dist/email.esm.js +9 -0
  72. package/dist/emailManager-DIfnS5g1.d.ts +352 -0
  73. package/dist/emailManager-wAV0LE-H.esm.js +238 -0
  74. package/dist/emailStateMachine-DOf4j58N.esm.js +292 -0
  75. package/dist/endpoints-CnN3SyDa.esm.js +87 -0
  76. package/dist/events-D6-e4vok.esm.js +596 -0
  77. package/dist/events.d.ts +265 -0
  78. package/dist/events.esm.js +4 -0
  79. package/dist/extensibility.d.ts +122 -0
  80. package/dist/extensibility.esm.js +43 -0
  81. package/dist/face-match.d.ts +228 -0
  82. package/dist/face-match.esm.js +173 -0
  83. package/dist/faceCaptureManagerFactory-Dh2PdGlF.esm.js +290 -0
  84. package/dist/faceCaptureManagerFactory-yqtpxjnN.d.ts +690 -0
  85. package/dist/faceCaptureSetup-B3faSpYA.esm.js +873 -0
  86. package/dist/faceMatchStateMachine-DNFrxTFS.esm.js +127 -0
  87. package/dist/flow-events.d.ts +6 -0
  88. package/dist/flow-events.esm.js +0 -0
  89. package/dist/flow.d.ts +358 -0
  90. package/dist/flow.esm.js +825 -0
  91. package/dist/flowCompletionService-DhkT4SRY.d.ts +10 -0
  92. package/dist/flowCompletionService-P54yzGvA.esm.js +13 -0
  93. package/dist/flowServices-PiNsxLfK.esm.js +188 -0
  94. package/dist/geolocation.d.ts +127 -0
  95. package/dist/geolocation.esm.js +89 -0
  96. package/dist/geolocationStateMachine-asasuHY2.esm.js +105 -0
  97. package/dist/getBrowser-BSXUTWXw.esm.js +41 -0
  98. package/dist/getDeviceClass-BSntT9_j.esm.js +14 -0
  99. package/dist/government-validation.d.ts +67 -0
  100. package/dist/government-validation.esm.js +81 -0
  101. package/dist/governmentValidationStateMachine-BDDYrJTo.esm.js +271 -0
  102. package/dist/home.d.ts +99 -0
  103. package/dist/home.esm.js +61 -0
  104. package/dist/http.d.ts +68 -0
  105. package/dist/http.esm.js +3 -0
  106. package/dist/id-ocr.d.ts +635 -0
  107. package/dist/id-ocr.esm.js +86 -0
  108. package/dist/id-verification.d.ts +190 -0
  109. package/dist/id-verification.esm.js +43 -0
  110. package/dist/id.d.ts +24 -0
  111. package/dist/id.esm.js +164 -0
  112. package/dist/idCaptureManager-D0ktk7Hh.esm.js +581 -0
  113. package/dist/idCaptureManager-Fyd0eam-.d.ts +958 -0
  114. package/dist/idCaptureStateMachine-dwlBUjbC.esm.js +2963 -0
  115. package/dist/idOcrStateMachine-YbjjC_Gg.esm.js +388 -0
  116. package/dist/idVerificationStateMachine-xbw9HP1Z.esm.js +71 -0
  117. package/dist/identity-reuse.d.ts +530 -0
  118. package/dist/identity-reuse.esm.js +274 -0
  119. package/dist/index-BcRG8rtJ.d.ts +97 -0
  120. package/dist/index-ChHWNH48.d.ts +1177 -0
  121. package/dist/index.d.ts +3 -0
  122. package/dist/index.esm.js +12 -0
  123. package/dist/invokeOnCaptureCallback-rc6kBHo5.esm.js +30 -0
  124. package/dist/lib-BB0B_qQX.esm.js +12499 -0
  125. package/dist/mandatory-consent.d.ts +412 -0
  126. package/dist/mandatory-consent.esm.js +78 -0
  127. package/dist/mandatoryConsentStateMachine-Cnco1jvn.esm.js +126 -0
  128. package/dist/openviduLazy-Cm0XFh_v.esm.js +3 -0
  129. package/dist/openviduLazy-Cok70ZSg.esm.js +12 -0
  130. package/dist/permissionServices-D_i6nzEw.esm.js +50 -0
  131. package/dist/phone.d.ts +4 -0
  132. package/dist/phone.esm.js +9 -0
  133. package/dist/phoneManager-B6M30hKE.d.ts +397 -0
  134. package/dist/phoneManager-DAJbGhlY.esm.js +256 -0
  135. package/dist/phoneStateMachine-CuPARRaT.esm.js +351 -0
  136. package/dist/platform-CfrjKhmi.esm.js +83 -0
  137. package/dist/qe-signature-DFo_Cc-I.esm.js +12 -0
  138. package/dist/qe-signature.d.ts +25 -0
  139. package/dist/qe-signature.esm.js +8 -0
  140. package/dist/recordingService-Ig2UgbLv.esm.js +1003 -0
  141. package/dist/redirect-to-mobile.d.ts +107 -0
  142. package/dist/redirect-to-mobile.esm.js +102 -0
  143. package/dist/redirectToMobileStateMachine-BOEqe46A.esm.js +249 -0
  144. package/dist/runChildModule-CqqwqAkW.esm.js +219 -0
  145. package/dist/selfie.d.ts +26 -0
  146. package/dist/selfie.esm.js +146 -0
  147. package/dist/selfieManager-D0lSgd-J.d.ts +68 -0
  148. package/dist/selfieManager-Duisl7qN.esm.js +60 -0
  149. package/dist/selfieStateMachine-D76whWEf.esm.js +68 -0
  150. package/dist/session-CrkWAs-q.esm.js +3206 -0
  151. package/dist/session.d.ts +217 -0
  152. package/dist/session.esm.js +9 -0
  153. package/dist/setup-C5AITV8m.d.ts +254 -0
  154. package/dist/setup-DPPAxmXf.esm.js +887 -0
  155. package/dist/signature.d.ts +94 -0
  156. package/dist/signature.esm.js +66 -0
  157. package/dist/signatureStateMachine-B5-QVUve.esm.js +132 -0
  158. package/dist/stats-CIfiPzb1.esm.js +16 -0
  159. package/dist/stats.d.ts +16 -0
  160. package/dist/stats.esm.js +4 -0
  161. package/dist/trust-graph.d.ts +54 -0
  162. package/dist/trust-graph.esm.js +56 -0
  163. package/dist/types-B06Ypu2F.d.ts +49 -0
  164. package/dist/types-BP1m8VRw.d.ts +340 -0
  165. package/dist/types-CAD4va6a.d.ts +5 -0
  166. package/dist/types-CFV9G_7j.d.ts +24 -0
  167. package/dist/warmup-CEcppFiS.d.ts +63 -0
  168. package/dist/wasm.d.ts +15 -0
  169. package/dist/wasm.esm.js +12 -0
  170. package/dist/watchlist-for-business.d.ts +79 -0
  171. package/dist/watchlist-for-business.esm.js +148 -0
  172. package/dist/watchlist.d.ts +62 -0
  173. package/dist/watchlist.esm.js +86 -0
  174. package/dist/watchlistServices-DMbUhkBX.esm.js +12 -0
  175. package/dist/workflow.d.ts +907 -0
  176. package/dist/workflow.esm.js +702 -0
  177. package/dist/xstate.esm-B70JrNqo.esm.js +3404 -0
  178. package/package.json +1 -1
@@ -0,0 +1,3206 @@
1
+ import { n as getApi, r as getToken, s as setToken, t as api } from "./api-CESGtpbH.esm.js";
2
+ import { g as getAnalyticsBatcher, h as addEvent } from "./events-D6-e4vok.esm.js";
3
+ import { t as endpoints } from "./endpoints-CnN3SyDa.esm.js";
4
+ import { n as resetIpifyCache, r as BrowserEnvironmentProvider, t as IpifyProvider } from "./IpifyProvider-D7jx52AL.esm.js";
5
+ import { t as isBrowserSimulation } from "./browserSimulation-gxD8cSpM.esm.js";
6
+
7
+ //#region src/internal/session/sessionService.ts
8
+ /**
9
+ * HTTP status codes the QR validation endpoint emits, keyed by their semantic
10
+ * name. Hosts switch on these to render distinct messaging — `invalidQRuuid`
11
+ * for an unknown/expired link, `onboardingUrlAlreadyUsed` for a one-time link
12
+ * that has already been consumed.
13
+ */
14
+ const QR_VALIDATION_ERROR_CODES = {
15
+ expiredUUID: 4026,
16
+ invalidQRuuid: 4081,
17
+ onboardingUrlAlreadyUsed: 4083
18
+ };
19
+ var QrValidationError = class extends Error {
20
+ constructor(status, statusText) {
21
+ super(`POST ${endpoints.qrValidateUuid} failed: ${status} ${statusText}`);
22
+ this.name = "QrValidationError";
23
+ this.status = status;
24
+ this.statusText = statusText;
25
+ }
26
+ };
27
+ /**
28
+ * Creates a new onboarding session.
29
+ *
30
+ * @param apiKey - The API key from the Incode dashboard
31
+ * @param options - Session creation options
32
+ * @param signal - Optional AbortSignal for request cancellation
33
+ * @returns The created session with token
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * const session = await createSession('your-api-key', {
38
+ * configurationId: 'your-flow-id',
39
+ * language: 'en-US',
40
+ * });
41
+ * console.log(session.token); // Use this token for subsequent API calls
42
+ * ```
43
+ */
44
+ async function createSession(apiKey, options, signal) {
45
+ const res = await getApi().post(endpoints.createSession, {
46
+ configurationId: options.configurationId,
47
+ externalId: options.externalId,
48
+ externalCustomerId: options.externalCustomerId,
49
+ language: options.language ?? "en-US",
50
+ customFields: options.customFields,
51
+ uuid: options.uuid ?? null,
52
+ urlUuid: options.urlUuid ?? null,
53
+ interviewId: options.interviewId ?? null,
54
+ ...options.loginHint != null && options.loginHint !== "" ? { loginHint: options.loginHint } : {}
55
+ }, {
56
+ headers: {
57
+ "x-api-key": apiKey,
58
+ "api-version": "1.0"
59
+ },
60
+ signal
61
+ });
62
+ if (!res.ok) throw new Error(`POST ${endpoints.createSession} failed: ${res.status} ${res.statusText}`);
63
+ return res.data;
64
+ }
65
+ /**
66
+ * Validates and rotates a QR anti-phishing URL UUID before creating a session.
67
+ *
68
+ * This call is unauthenticated; the `{ onboardingId, urlUuid }` pair itself
69
+ * acts as the credential. The server burns the incoming `urlUuid` and returns
70
+ * a freshly minted one that must be used in the subsequent `createSession`
71
+ * call.
72
+ *
73
+ * @param options - `{ onboardingId, urlUuid }` from the incoming URL
74
+ * @param signal - Optional AbortSignal for request cancellation
75
+ * @returns The refreshed `urlUuid` to use for the session
76
+ * @throws {QrValidationError} When the server rejects the validation request.
77
+ */
78
+ async function validateQrUuid(options, signal) {
79
+ try {
80
+ return (await getApi().post(endpoints.qrValidateUuid, {
81
+ onboardingId: options.onboardingId,
82
+ urlUuid: options.urlUuid
83
+ }, {
84
+ headers: { "api-version": "1.0" },
85
+ signal
86
+ })).data;
87
+ } catch (error) {
88
+ const httpError = error;
89
+ throw new QrValidationError(httpError.data?.status ?? httpError.status, httpError.statusText);
90
+ }
91
+ }
92
+ /**
93
+ * One-shot QR phishing-resistance helper.
94
+ *
95
+ * When `urlUuid` is a non-empty string, burns the stale value via
96
+ * `validateQrUuid`, invokes `onRefreshed` with the fresh value, and returns
97
+ * it so callers can forward it into `createSession`. When `urlUuid` is
98
+ * absent, returns `undefined` without making any network call.
99
+ *
100
+ * Consolidates the rotation + callback logic shared by Flow self-loading and
101
+ * Workflow token-mode bootstraps.
102
+ *
103
+ * @throws {QrValidationError} When the server rejects the validation request.
104
+ */
105
+ async function refreshQrUrlUuid(options, signal) {
106
+ if (typeof options.urlUuid !== "string" || options.urlUuid.length === 0) return;
107
+ const result = await validateQrUuid({
108
+ onboardingId: options.onboardingId ?? null,
109
+ urlUuid: options.urlUuid
110
+ }, signal);
111
+ options.onRefreshed?.(result.urlUuid);
112
+ return result.urlUuid;
113
+ }
114
+ /**
115
+ * Validates and rotates a QR anti-phishing `urlUuid` (when present), then
116
+ * creates a session bound to the refreshed value. When `urlUuid` is absent,
117
+ * behaves identically to {@link createSession}.
118
+ *
119
+ * Use this when the host owns session creation and wants the SDK to handle
120
+ * phishing-resistance rotation in a single call. For raw control, compose
121
+ * `refreshQrUrlUuid` and `createSession` directly.
122
+ *
123
+ * @throws {QrValidationError} When the server rejects the QR validation step.
124
+ *
125
+ * @example
126
+ * ```ts
127
+ * const session = await bootstrapSession(apiKey, {
128
+ * configurationId,
129
+ * urlUuid,
130
+ * onUrlUuidRefreshed: (refreshed) => {
131
+ * const url = new URL(window.location.href);
132
+ * url.searchParams.set('url_uuid', refreshed);
133
+ * window.history.replaceState({}, '', url);
134
+ * },
135
+ * });
136
+ * ```
137
+ */
138
+ async function bootstrapSession(apiKey, options, signal) {
139
+ const { onUrlUuidRefreshed, ...createSessionOptions } = options;
140
+ const refreshedUrlUuid = await refreshQrUrlUuid({
141
+ urlUuid: options.urlUuid,
142
+ onboardingId: options.uuid ?? null,
143
+ onRefreshed: onUrlUuidRefreshed
144
+ }, signal);
145
+ return createSession(apiKey, {
146
+ ...createSessionOptions,
147
+ urlUuid: refreshedUrlUuid
148
+ }, signal);
149
+ }
150
+
151
+ //#endregion
152
+ //#region ../../node_modules/.pnpm/ua-parser-js@2.0.9/node_modules/ua-parser-js/src/main/ua-parser.mjs
153
+ var LIBVERSION = "2.0.9", UA_MAX_LENGTH = 500, USER_AGENT = "user-agent", EMPTY = "", UNKNOWN = "?", TYPEOF = {
154
+ FUNCTION: "function",
155
+ OBJECT: "object",
156
+ STRING: "string",
157
+ UNDEFINED: "undefined"
158
+ }, 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 = [
159
+ BRANDS,
160
+ FULLVERLIST,
161
+ MOBILE,
162
+ MODEL,
163
+ PLATFORM,
164
+ PLATFORMVER,
165
+ ARCHITECTURE,
166
+ FORMFACTORS,
167
+ BITNESS
168
+ ], 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";
169
+ var NAVIGATOR = typeof window !== TYPEOF.UNDEFINED && window.navigator ? window.navigator : void 0, NAVIGATOR_UADATA = NAVIGATOR && NAVIGATOR.userAgentData ? NAVIGATOR.userAgentData : void 0;
170
+ var extend = function(defaultRgx, extensions) {
171
+ var mergedRgx = {};
172
+ var extraRgx = extensions;
173
+ if (!isExtensions(extensions)) {
174
+ extraRgx = {};
175
+ 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] : []);
176
+ }
177
+ 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];
178
+ return mergedRgx;
179
+ }, enumerize = function(arr) {
180
+ var enums = {};
181
+ for (var i = 0; i < arr.length; i++) enums[arr[i].toUpperCase()] = arr[i];
182
+ return enums;
183
+ }, has = function(str1, str2) {
184
+ if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
185
+ for (var i in str1) if (lowerize(str2) == lowerize(str1[i])) return true;
186
+ return false;
187
+ }
188
+ return isString(str1) ? lowerize(str2) == lowerize(str1) : false;
189
+ }, isExtensions = function(obj, deep) {
190
+ for (var prop in obj) return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
191
+ }, isString = function(val) {
192
+ return typeof val === TYPEOF.STRING;
193
+ }, itemListToArray = function(header) {
194
+ if (!header) return void 0;
195
+ var arr = [];
196
+ var tokens = strip(/\\?\"/g, header).split(",");
197
+ for (var i = 0; i < tokens.length; i++) if (tokens[i].indexOf(";") > -1) {
198
+ var token = trim(tokens[i]).split(";v=");
199
+ arr[i] = {
200
+ brand: token[0],
201
+ version: token[1]
202
+ };
203
+ } else arr[i] = trim(tokens[i]);
204
+ return arr;
205
+ }, lowerize = function(str) {
206
+ return isString(str) ? str.toLowerCase() : str;
207
+ }, majorize = function(version) {
208
+ return isString(version) ? strip(/[^\d\.]/g, version).split(".")[0] : void 0;
209
+ }, setProps = function(arr) {
210
+ for (var i in arr) {
211
+ if (!arr.hasOwnProperty(i)) continue;
212
+ var propName = arr[i];
213
+ if (typeof propName == TYPEOF.OBJECT && propName.length == 2) this[propName[0]] = propName[1];
214
+ else this[propName] = void 0;
215
+ }
216
+ return this;
217
+ }, strip = function(pattern, str) {
218
+ return isString(str) ? str.replace(pattern, EMPTY) : str;
219
+ }, stripQuotes = function(str) {
220
+ return strip(/\\?\"/g, str);
221
+ }, trim = function(str, len) {
222
+ str = strip(/^\s\s*/, String(str));
223
+ return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
224
+ };
225
+ var rgxMapper = function(ua, arrays) {
226
+ if (!ua || !arrays) return;
227
+ var i = 0, j$1, k$1, p$1, q$1, matches, match;
228
+ while (i < arrays.length && !matches) {
229
+ var regex = arrays[i], props = arrays[i + 1];
230
+ j$1 = k$1 = 0;
231
+ while (j$1 < regex.length && !matches) {
232
+ if (!regex[j$1]) break;
233
+ matches = regex[j$1++].exec(ua);
234
+ if (!!matches) for (p$1 = 0; p$1 < props.length; p$1++) {
235
+ match = matches[++k$1];
236
+ q$1 = props[p$1];
237
+ if (typeof q$1 === TYPEOF.OBJECT && q$1.length > 0) {
238
+ if (q$1.length === 2) if (typeof q$1[1] == TYPEOF.FUNCTION) this[q$1[0]] = q$1[1].call(this, match);
239
+ else this[q$1[0]] = q$1[1];
240
+ else if (q$1.length >= 3) {
241
+ 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;
242
+ else this[q$1[0]] = match ? q$1[1].call(this, match, q$1[2]) : void 0;
243
+ else if (q$1.length == 3) this[q$1[0]] = match ? match.replace(q$1[1], q$1[2]) : void 0;
244
+ 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;
245
+ 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;
246
+ }
247
+ } else this[q$1] = match ? match : void 0;
248
+ }
249
+ }
250
+ i += 2;
251
+ }
252
+ }, strMapper = function(str, map) {
253
+ for (var i in map) if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
254
+ 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;
255
+ } else if (has(map[i], str)) return i === UNKNOWN ? void 0 : i;
256
+ return map.hasOwnProperty("*") ? map["*"] : str;
257
+ };
258
+ var windowsVersionMap = {
259
+ "ME": "4.90",
260
+ "NT 3.51": "3.51",
261
+ "NT 4.0": "4.0",
262
+ "2000": ["5.0", "5.01"],
263
+ "XP": ["5.1", "5.2"],
264
+ "Vista": "6.0",
265
+ "7": "6.1",
266
+ "8": "6.2",
267
+ "8.1": "6.3",
268
+ "10": ["6.4", "10.0"],
269
+ "NT": ""
270
+ }, formFactorsMap = {
271
+ "embedded": "Automotive",
272
+ "mobile": "Mobile",
273
+ "tablet": ["Tablet", "EInk"],
274
+ "smarttv": "TV",
275
+ "wearable": "Watch",
276
+ "xr": ["VR", "XR"],
277
+ "?": ["Desktop", "Unknown"],
278
+ "*": void 0
279
+ }, browserHintsMap = {
280
+ "Chrome": "Google Chrome",
281
+ "Edge": "Microsoft Edge",
282
+ "Edge WebView2": "Microsoft Edge WebView2",
283
+ "Chrome WebView": "Android WebView",
284
+ "Chrome Headless": "HeadlessChrome",
285
+ "Huawei Browser": "HuaweiBrowser",
286
+ "MIUI Browser": "Miui Browser",
287
+ "Opera Mobi": "OperaMobile",
288
+ "Yandex": "YaBrowser"
289
+ };
290
+ var defaultRegexes = {
291
+ browser: [
292
+ [/\b(?:crmo|crios)\/([\w\.]+)/i],
293
+ [VERSION, [NAME, PREFIX_MOBILE + "Chrome"]],
294
+ [/webview.+edge\/([\w\.]+)/i],
295
+ [VERSION, [NAME, EDGE + " WebView"]],
296
+ [/edg(?:e|ios|a)?\/([\w\.]+)/i],
297
+ [VERSION, [NAME, "Edge"]],
298
+ [
299
+ /(opera mini)\/([-\w\.]+)/i,
300
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
301
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
302
+ ],
303
+ [NAME, VERSION],
304
+ [/opios[\/ ]+([\w\.]+)/i],
305
+ [VERSION, [NAME, OPERA + " Mini"]],
306
+ [/\bop(?:rg)?x\/([\w\.]+)/i],
307
+ [VERSION, [NAME, OPERA + " GX"]],
308
+ [/\bopr\/([\w\.]+)/i],
309
+ [VERSION, [NAME, OPERA]],
310
+ [/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],
311
+ [VERSION, [NAME, "Baidu"]],
312
+ [/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],
313
+ [VERSION, [NAME, "Maxthon"]],
314
+ [
315
+ /(kindle)\/([\w\.]+)/i,
316
+ /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
317
+ /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,
318
+ /(?:ms|\()(ie) ([\w\.]+)/i,
319
+ /(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,
320
+ /(brave)(?: chrome)?\/([\d\.]+)/i,
321
+ /(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,
322
+ /(qwant)(?:ios|mobile)\/([\d\.]+)/i,
323
+ /(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i
324
+ ],
325
+ [NAME, VERSION],
326
+ [/quark(?:pc)?\/([-\w\.]+)/i],
327
+ [VERSION, [NAME, "Quark"]],
328
+ [/\bddg\/([\w\.]+)/i],
329
+ [VERSION, [NAME, "DuckDuckGo"]],
330
+ [/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],
331
+ [VERSION, [NAME, "UCBrowser"]],
332
+ [
333
+ /microm.+\bqbcore\/([\w\.]+)/i,
334
+ /\bqbcore\/([\w\.]+).+microm/i,
335
+ /micromessenger\/([\w\.]+)/i
336
+ ],
337
+ [VERSION, [NAME, "WeChat"]],
338
+ [/konqueror\/([\w\.]+)/i],
339
+ [VERSION, [NAME, "Konqueror"]],
340
+ [/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],
341
+ [VERSION, [NAME, "IE"]],
342
+ [/ya(?:search)?browser\/([\w\.]+)/i],
343
+ [VERSION, [NAME, "Yandex"]],
344
+ [/slbrowser\/([\w\.]+)/i],
345
+ [VERSION, [NAME, "Smart " + LENOVO + SUFFIX_BROWSER]],
346
+ [/(av(?:ast|g|ira))\/([\w\.]+)/i],
347
+ [[
348
+ NAME,
349
+ /(.+)/,
350
+ "$1 Secure" + SUFFIX_BROWSER
351
+ ], VERSION],
352
+ [/norton\/([\w\.]+)/i],
353
+ [VERSION, [NAME, "Norton Private" + SUFFIX_BROWSER]],
354
+ [/\bfocus\/([\w\.]+)/i],
355
+ [VERSION, [NAME, FIREFOX + " Focus"]],
356
+ [/ mms\/([\w\.]+)$/i],
357
+ [VERSION, [NAME, OPERA + " Neon"]],
358
+ [/ opt\/([\w\.]+)$/i],
359
+ [VERSION, [NAME, OPERA + " Touch"]],
360
+ [/coc_coc\w+\/([\w\.]+)/i],
361
+ [VERSION, [NAME, "Coc Coc"]],
362
+ [/dolfin\/([\w\.]+)/i],
363
+ [VERSION, [NAME, "Dolphin"]],
364
+ [/coast\/([\w\.]+)/i],
365
+ [VERSION, [NAME, OPERA + " Coast"]],
366
+ [/miuibrowser\/([\w\.]+)/i],
367
+ [VERSION, [NAME, "MIUI" + SUFFIX_BROWSER]],
368
+ [/fxios\/([\w\.-]+)/i],
369
+ [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]],
370
+ [/\bqihoobrowser\/?([\w\.]*)/i],
371
+ [VERSION, [NAME, "360"]],
372
+ [/\b(qq)\/([\w\.]+)/i],
373
+ [[
374
+ NAME,
375
+ /(.+)/,
376
+ "$1Browser"
377
+ ], VERSION],
378
+ [/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],
379
+ [[
380
+ NAME,
381
+ /(.+)/,
382
+ "$1" + SUFFIX_BROWSER
383
+ ], VERSION],
384
+ [/samsungbrowser\/([\w\.]+)/i],
385
+ [VERSION, [NAME, SAMSUNG + " Internet"]],
386
+ [/metasr[\/ ]?([\d\.]+)/i],
387
+ [VERSION, [NAME, SOGOU + " Explorer"]],
388
+ [/(sogou)mo\w+\/([\d\.]+)/i],
389
+ [[NAME, SOGOU + " Mobile"], VERSION],
390
+ [
391
+ /(electron)\/([\w\.]+) safari/i,
392
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
393
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i
394
+ ],
395
+ [NAME, VERSION],
396
+ [/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],
397
+ [NAME],
398
+ [/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],
399
+ [VERSION, NAME],
400
+ [/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],
401
+ [
402
+ [NAME, FACEBOOK],
403
+ VERSION,
404
+ [TYPE, INAPP]
405
+ ],
406
+ [
407
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
408
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
409
+ /(daum)apps[\/ ]([\w\.]+)/i,
410
+ /safari (line)\/([\w\.]+)/i,
411
+ /\b(line)\/([\w\.]+)\/iab/i,
412
+ /(alipay)client\/([\w\.]+)/i,
413
+ /(twitter)(?:and| f.+e\/([\w\.]+))/i,
414
+ /(bing)(?:web|sapphire)\/([\w\.]+)/i,
415
+ /(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i
416
+ ],
417
+ [
418
+ NAME,
419
+ VERSION,
420
+ [TYPE, INAPP]
421
+ ],
422
+ [/\bgsa\/([\w\.]+) .*safari\//i],
423
+ [
424
+ VERSION,
425
+ [NAME, "GSA"],
426
+ [TYPE, INAPP]
427
+ ],
428
+ [/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],
429
+ [
430
+ VERSION,
431
+ [NAME, "TikTok"],
432
+ [TYPE, INAPP]
433
+ ],
434
+ [/\[(linkedin)app\]/i],
435
+ [NAME, [TYPE, INAPP]],
436
+ [/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],
437
+ [
438
+ [
439
+ NAME,
440
+ /(.+)/,
441
+ "Zalo"
442
+ ],
443
+ VERSION,
444
+ [TYPE, INAPP]
445
+ ],
446
+ [/(chromium)[\/ ]([-\w\.]+)/i],
447
+ [NAME, VERSION],
448
+ [/ome-(lighthouse)$/i],
449
+ [NAME, [TYPE, FETCHER]],
450
+ [/headlesschrome(?:\/([\w\.]+)| )/i],
451
+ [VERSION, [NAME, CHROME + " Headless"]],
452
+ [/wv\).+chrome\/([\w\.]+).+edgw\//i],
453
+ [VERSION, [NAME, EDGE + " WebView2"]],
454
+ [/ wv\).+(chrome)\/([\w\.]+)/i],
455
+ [[NAME, CHROME + " WebView"], VERSION],
456
+ [/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],
457
+ [VERSION, [NAME, "Android" + SUFFIX_BROWSER]],
458
+ [/chrome\/([\w\.]+) mobile/i],
459
+ [VERSION, [NAME, PREFIX_MOBILE + "Chrome"]],
460
+ [/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],
461
+ [NAME, VERSION],
462
+ [/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],
463
+ [VERSION, [NAME, PREFIX_MOBILE + "Safari"]],
464
+ [/iphone .*mobile(?:\/\w+ | ?)safari/i],
465
+ [[NAME, PREFIX_MOBILE + "Safari"]],
466
+ [/version\/([\w\.\,]+) .*(safari)/i],
467
+ [VERSION, NAME],
468
+ [/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],
469
+ [NAME, [VERSION, "1"]],
470
+ [/(webkit|khtml)\/([\w\.]+)/i],
471
+ [NAME, VERSION],
472
+ [/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],
473
+ [[NAME, PREFIX_MOBILE + FIREFOX], VERSION],
474
+ [/(navigator|netscape\d?)\/([-\w\.]+)/i],
475
+ [[NAME, "Netscape"], VERSION],
476
+ [/(wolvic|librewolf)\/([\w\.]+)/i],
477
+ [NAME, VERSION],
478
+ [/mobile vr; rv:([\w\.]+)\).+firefox/i],
479
+ [VERSION, [NAME, FIREFOX + " Reality"]],
480
+ [
481
+ /ekiohf.+(flow)\/([\w\.]+)/i,
482
+ /(swiftfox)/i,
483
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
484
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
485
+ /(firefox)\/([\w\.]+)/i,
486
+ /(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,
487
+ /(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
488
+ /\b(links) \(([\w\.]+)/i
489
+ ],
490
+ [NAME, [
491
+ VERSION,
492
+ /_/g,
493
+ "."
494
+ ]],
495
+ [/(cobalt)\/([\w\.]+)/i],
496
+ [NAME, [
497
+ VERSION,
498
+ /[^\d\.]+./,
499
+ EMPTY
500
+ ]]
501
+ ],
502
+ cpu: [
503
+ [/\b((amd|x|x86[-_]?|wow|win)64)\b/i],
504
+ [[ARCHITECTURE, "amd64"]],
505
+ [/(ia32(?=;))/i, /\b((i[346]|x)86)(pc)?\b/i],
506
+ [[ARCHITECTURE, "ia32"]],
507
+ [/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],
508
+ [[ARCHITECTURE, "arm64"]],
509
+ [/\b(arm(v[67])?ht?n?[fl]p?)\b/i],
510
+ [[ARCHITECTURE, "armhf"]],
511
+ [/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],
512
+ [[ARCHITECTURE, "arm"]],
513
+ [/ sun4\w[;\)]/i],
514
+ [[ARCHITECTURE, "sparc"]],
515
+ [
516
+ /\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
517
+ /((ppc|powerpc)(64)?)( mac|;|\))/i,
518
+ /(?:osf1|[freopnt]{3,4}bsd) (alpha)/i
519
+ ],
520
+ [[
521
+ ARCHITECTURE,
522
+ /ower/,
523
+ EMPTY,
524
+ lowerize
525
+ ]],
526
+ [/mc680.0/i],
527
+ [[ARCHITECTURE, "68k"]],
528
+ [/winnt.+\[axp/i],
529
+ [[ARCHITECTURE, "alpha"]]
530
+ ],
531
+ device: [
532
+ [/\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],
533
+ [
534
+ MODEL,
535
+ [VENDOR, SAMSUNG],
536
+ [TYPE, TABLET]
537
+ ],
538
+ [
539
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
540
+ /samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
541
+ /sec-(sgh\w+)/i
542
+ ],
543
+ [
544
+ MODEL,
545
+ [VENDOR, SAMSUNG],
546
+ [TYPE, MOBILE]
547
+ ],
548
+ [/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],
549
+ [
550
+ MODEL,
551
+ [VENDOR, APPLE],
552
+ [TYPE, MOBILE]
553
+ ],
554
+ [/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i, /\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],
555
+ [
556
+ MODEL,
557
+ [VENDOR, APPLE],
558
+ [TYPE, TABLET]
559
+ ],
560
+ [/(macintosh);/i],
561
+ [MODEL, [VENDOR, APPLE]],
562
+ [/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],
563
+ [
564
+ MODEL,
565
+ [VENDOR, SHARP],
566
+ [TYPE, MOBILE]
567
+ ],
568
+ [/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],
569
+ [
570
+ MODEL,
571
+ [VENDOR, HONOR],
572
+ [TYPE, TABLET]
573
+ ],
574
+ [/honor([-\w ]+)[;\)]/i],
575
+ [
576
+ MODEL,
577
+ [VENDOR, HONOR],
578
+ [TYPE, MOBILE]
579
+ ],
580
+ [/\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],
581
+ [
582
+ MODEL,
583
+ [VENDOR, HUAWEI],
584
+ [TYPE, TABLET]
585
+ ],
586
+ [/(?:huawei) ?([-\w ]+)[;\)]/i, /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],
587
+ [
588
+ MODEL,
589
+ [VENDOR, HUAWEI],
590
+ [TYPE, MOBILE]
591
+ ],
592
+ [/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i, /\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],
593
+ [
594
+ [
595
+ MODEL,
596
+ /_/g,
597
+ " "
598
+ ],
599
+ [VENDOR, XIAOMI],
600
+ [TYPE, TABLET]
601
+ ],
602
+ [
603
+ /\b; (\w+) build\/hm\1/i,
604
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
605
+ /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,
606
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
607
+ / ([\w ]+) miui\/v?\d/i
608
+ ],
609
+ [
610
+ [
611
+ MODEL,
612
+ /_/g,
613
+ " "
614
+ ],
615
+ [VENDOR, XIAOMI],
616
+ [TYPE, MOBILE]
617
+ ],
618
+ [/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],
619
+ [
620
+ MODEL,
621
+ [VENDOR, ONEPLUS],
622
+ [TYPE, MOBILE]
623
+ ],
624
+ [/; (\w+) bui.+ oppo/i, /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],
625
+ [
626
+ MODEL,
627
+ [VENDOR, OPPO],
628
+ [TYPE, MOBILE]
629
+ ],
630
+ [/\b(opd2(\d{3}a?))(?: bui|\))/i],
631
+ [
632
+ MODEL,
633
+ [
634
+ VENDOR,
635
+ strMapper,
636
+ {
637
+ "OnePlus": [
638
+ "203",
639
+ "304",
640
+ "403",
641
+ "404",
642
+ "413",
643
+ "415"
644
+ ],
645
+ "*": OPPO
646
+ }
647
+ ],
648
+ [TYPE, TABLET]
649
+ ],
650
+ [/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],
651
+ [
652
+ MODEL,
653
+ [VENDOR, "BLU"],
654
+ [TYPE, MOBILE]
655
+ ],
656
+ [/; vivo (\w+)(?: bui|\))/i, /\b(v[12]\d{3}\w?[at])(?: bui|;)/i],
657
+ [
658
+ MODEL,
659
+ [VENDOR, "Vivo"],
660
+ [TYPE, MOBILE]
661
+ ],
662
+ [/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],
663
+ [
664
+ MODEL,
665
+ [VENDOR, "Realme"],
666
+ [TYPE, MOBILE]
667
+ ],
668
+ [/(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],
669
+ [
670
+ MODEL,
671
+ [VENDOR, LENOVO],
672
+ [TYPE, TABLET]
673
+ ],
674
+ [/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],
675
+ [
676
+ MODEL,
677
+ [VENDOR, LENOVO],
678
+ [TYPE, MOBILE]
679
+ ],
680
+ [
681
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
682
+ /\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
683
+ /((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
684
+ ],
685
+ [
686
+ MODEL,
687
+ [VENDOR, MOTOROLA],
688
+ [TYPE, MOBILE]
689
+ ],
690
+ [/\b(mz60\d|xoom[2 ]{0,2}) build\//i],
691
+ [
692
+ MODEL,
693
+ [VENDOR, MOTOROLA],
694
+ [TYPE, TABLET]
695
+ ],
696
+ [/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],
697
+ [
698
+ MODEL,
699
+ [VENDOR, LG],
700
+ [TYPE, TABLET]
701
+ ],
702
+ [
703
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
704
+ /\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
705
+ /\blg-?([\d\w]+) bui/i
706
+ ],
707
+ [
708
+ MODEL,
709
+ [VENDOR, LG],
710
+ [TYPE, MOBILE]
711
+ ],
712
+ [/(nokia) (t[12][01])/i],
713
+ [
714
+ VENDOR,
715
+ MODEL,
716
+ [TYPE, TABLET]
717
+ ],
718
+ [/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i, /nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],
719
+ [
720
+ [
721
+ MODEL,
722
+ /_/g,
723
+ " "
724
+ ],
725
+ [TYPE, MOBILE],
726
+ [VENDOR, "Nokia"]
727
+ ],
728
+ [/(pixel (c|tablet))\b/i],
729
+ [
730
+ MODEL,
731
+ [VENDOR, GOOGLE],
732
+ [TYPE, TABLET]
733
+ ],
734
+ [/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],
735
+ [
736
+ MODEL,
737
+ [VENDOR, GOOGLE],
738
+ [TYPE, MOBILE]
739
+ ],
740
+ [/(google) (pixelbook( go)?)/i],
741
+ [VENDOR, MODEL],
742
+ [/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],
743
+ [
744
+ MODEL,
745
+ [VENDOR, SONY],
746
+ [TYPE, MOBILE]
747
+ ],
748
+ [/sony tablet [ps]/i, /\b(?:sony)?sgp\w+(?: bui|\))/i],
749
+ [
750
+ [MODEL, "Xperia Tablet"],
751
+ [VENDOR, SONY],
752
+ [TYPE, TABLET]
753
+ ],
754
+ [
755
+ /(alexa)webm/i,
756
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,
757
+ /(kf[a-z]+)( bui|\)).+silk\//i
758
+ ],
759
+ [
760
+ MODEL,
761
+ [VENDOR, AMAZON],
762
+ [TYPE, TABLET]
763
+ ],
764
+ [/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],
765
+ [
766
+ [
767
+ MODEL,
768
+ /(.+)/g,
769
+ "Fire Phone $1"
770
+ ],
771
+ [VENDOR, AMAZON],
772
+ [TYPE, MOBILE]
773
+ ],
774
+ [/(playbook);[-\w\),; ]+(rim)/i],
775
+ [
776
+ MODEL,
777
+ VENDOR,
778
+ [TYPE, TABLET]
779
+ ],
780
+ [/\b((?:bb[a-f]|st[hv])100-\d)/i, /(?:blackberry|\(bb10;) (\w+)/i],
781
+ [
782
+ MODEL,
783
+ [VENDOR, BLACKBERRY],
784
+ [TYPE, MOBILE]
785
+ ],
786
+ [/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],
787
+ [
788
+ MODEL,
789
+ [VENDOR, ASUS],
790
+ [TYPE, TABLET]
791
+ ],
792
+ [/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],
793
+ [
794
+ MODEL,
795
+ [VENDOR, ASUS],
796
+ [TYPE, MOBILE]
797
+ ],
798
+ [/(nexus 9)/i],
799
+ [
800
+ MODEL,
801
+ [VENDOR, "HTC"],
802
+ [TYPE, TABLET]
803
+ ],
804
+ [
805
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
806
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
807
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
808
+ ],
809
+ [
810
+ VENDOR,
811
+ [
812
+ MODEL,
813
+ /_/g,
814
+ " "
815
+ ],
816
+ [TYPE, MOBILE]
817
+ ],
818
+ [/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],
819
+ [
820
+ MODEL,
821
+ [VENDOR, "TCL"],
822
+ [TYPE, TABLET]
823
+ ],
824
+ [/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],
825
+ [
826
+ MODEL,
827
+ [VENDOR, "TCL"],
828
+ [TYPE, MOBILE]
829
+ ],
830
+ [/(itel) ((\w+))/i],
831
+ [
832
+ [VENDOR, lowerize],
833
+ MODEL,
834
+ [
835
+ TYPE,
836
+ strMapper,
837
+ {
838
+ "tablet": ["p10001l", "w7001"],
839
+ "*": "mobile"
840
+ }
841
+ ]
842
+ ],
843
+ [/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],
844
+ [
845
+ MODEL,
846
+ [VENDOR, "Acer"],
847
+ [TYPE, TABLET]
848
+ ],
849
+ [/droid.+; (m[1-5] note) bui/i, /\bmz-([-\w]{2,})/i],
850
+ [
851
+ MODEL,
852
+ [VENDOR, "Meizu"],
853
+ [TYPE, MOBILE]
854
+ ],
855
+ [/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],
856
+ [
857
+ MODEL,
858
+ [VENDOR, "Ulefone"],
859
+ [TYPE, MOBILE]
860
+ ],
861
+ [/; (energy ?\w+)(?: bui|\))/i, /; energizer ([\w ]+)(?: bui|\))/i],
862
+ [
863
+ MODEL,
864
+ [VENDOR, "Energizer"],
865
+ [TYPE, MOBILE]
866
+ ],
867
+ [/; cat (b35);/i, /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],
868
+ [
869
+ MODEL,
870
+ [VENDOR, "Cat"],
871
+ [TYPE, MOBILE]
872
+ ],
873
+ [/((?:new )?andromax[\w- ]+)(?: bui|\))/i],
874
+ [
875
+ MODEL,
876
+ [VENDOR, "Smartfren"],
877
+ [TYPE, MOBILE]
878
+ ],
879
+ [/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],
880
+ [
881
+ MODEL,
882
+ [VENDOR, "Nothing"],
883
+ [TYPE, MOBILE]
884
+ ],
885
+ [/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i, /archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],
886
+ [
887
+ MODEL,
888
+ [VENDOR, "Archos"],
889
+ [TYPE, TABLET]
890
+ ],
891
+ [/archos ([\w ]+)( b|\))/i, /; (ac[3-6]\d\w{2,8})( b|\))/i],
892
+ [
893
+ MODEL,
894
+ [VENDOR, "Archos"],
895
+ [TYPE, MOBILE]
896
+ ],
897
+ [/; (n159v)/i],
898
+ [
899
+ MODEL,
900
+ [VENDOR, "HMD"],
901
+ [TYPE, MOBILE]
902
+ ],
903
+ [/(imo) (tab \w+)/i, /(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],
904
+ [
905
+ VENDOR,
906
+ MODEL,
907
+ [TYPE, TABLET]
908
+ ],
909
+ [
910
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
911
+ /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
912
+ /(hp) ([\w ]+\w)/i,
913
+ /(microsoft); (lumia[\w ]+)/i,
914
+ /(oppo) ?([\w ]+) bui/i,
915
+ /(hisense) ([ehv][\w ]+)\)/i,
916
+ /droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i
917
+ ],
918
+ [
919
+ VENDOR,
920
+ MODEL,
921
+ [TYPE, MOBILE]
922
+ ],
923
+ [
924
+ /(kobo)\s(ereader|touch)/i,
925
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i,
926
+ /(kindle)\/([\w\.]+)/i
927
+ ],
928
+ [
929
+ VENDOR,
930
+ MODEL,
931
+ [TYPE, TABLET]
932
+ ],
933
+ [/(surface duo)/i],
934
+ [
935
+ MODEL,
936
+ [VENDOR, MICROSOFT],
937
+ [TYPE, TABLET]
938
+ ],
939
+ [/droid [\d\.]+; (fp\du?)(?: b|\))/i],
940
+ [
941
+ MODEL,
942
+ [VENDOR, "Fairphone"],
943
+ [TYPE, MOBILE]
944
+ ],
945
+ [/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],
946
+ [
947
+ MODEL,
948
+ [VENDOR, NVIDIA],
949
+ [TYPE, TABLET]
950
+ ],
951
+ [/(sprint) (\w+)/i],
952
+ [
953
+ VENDOR,
954
+ MODEL,
955
+ [TYPE, MOBILE]
956
+ ],
957
+ [/(kin\.[onetw]{3})/i],
958
+ [
959
+ [
960
+ MODEL,
961
+ /\./g,
962
+ " "
963
+ ],
964
+ [VENDOR, MICROSOFT],
965
+ [TYPE, MOBILE]
966
+ ],
967
+ [/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],
968
+ [
969
+ MODEL,
970
+ [VENDOR, ZEBRA],
971
+ [TYPE, TABLET]
972
+ ],
973
+ [/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],
974
+ [
975
+ MODEL,
976
+ [VENDOR, ZEBRA],
977
+ [TYPE, MOBILE]
978
+ ],
979
+ [/(philips)[\w ]+tv/i, /smart-tv.+(samsung)/i],
980
+ [VENDOR, [TYPE, SMARTTV]],
981
+ [/hbbtv.+maple;(\d+)/i],
982
+ [
983
+ [
984
+ MODEL,
985
+ /^/,
986
+ "SmartTV"
987
+ ],
988
+ [VENDOR, SAMSUNG],
989
+ [TYPE, SMARTTV]
990
+ ],
991
+ [/(vizio)(?: |.+model\/)(\w+-\w+)/i, /tcast.+(lg)e?. ([-\w]+)/i],
992
+ [
993
+ VENDOR,
994
+ MODEL,
995
+ [TYPE, SMARTTV]
996
+ ],
997
+ [/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],
998
+ [[VENDOR, LG], [TYPE, SMARTTV]],
999
+ [/(apple) ?tv/i],
1000
+ [
1001
+ VENDOR,
1002
+ [MODEL, APPLE + " TV"],
1003
+ [TYPE, SMARTTV]
1004
+ ],
1005
+ [/crkey.*devicetype\/chromecast/i],
1006
+ [
1007
+ [MODEL, CHROMECAST + " Third Generation"],
1008
+ [VENDOR, GOOGLE],
1009
+ [TYPE, SMARTTV]
1010
+ ],
1011
+ [/crkey.*devicetype\/([^/]*)/i],
1012
+ [
1013
+ [
1014
+ MODEL,
1015
+ /^/,
1016
+ "Chromecast "
1017
+ ],
1018
+ [VENDOR, GOOGLE],
1019
+ [TYPE, SMARTTV]
1020
+ ],
1021
+ [/fuchsia.*crkey/i],
1022
+ [
1023
+ [MODEL, CHROMECAST + " Nest Hub"],
1024
+ [VENDOR, GOOGLE],
1025
+ [TYPE, SMARTTV]
1026
+ ],
1027
+ [/crkey/i],
1028
+ [
1029
+ [MODEL, CHROMECAST],
1030
+ [VENDOR, GOOGLE],
1031
+ [TYPE, SMARTTV]
1032
+ ],
1033
+ [/(portaltv)/i],
1034
+ [
1035
+ MODEL,
1036
+ [VENDOR, FACEBOOK],
1037
+ [TYPE, SMARTTV]
1038
+ ],
1039
+ [/droid.+aft(\w+)( bui|\))/i],
1040
+ [
1041
+ MODEL,
1042
+ [VENDOR, AMAZON],
1043
+ [TYPE, SMARTTV]
1044
+ ],
1045
+ [/(shield \w+ tv)/i],
1046
+ [
1047
+ MODEL,
1048
+ [VENDOR, NVIDIA],
1049
+ [TYPE, SMARTTV]
1050
+ ],
1051
+ [/\(dtv[\);].+(aquos)/i, /(aquos-tv[\w ]+)\)/i],
1052
+ [
1053
+ MODEL,
1054
+ [VENDOR, SHARP],
1055
+ [TYPE, SMARTTV]
1056
+ ],
1057
+ [/(bravia[\w ]+)( bui|\))/i],
1058
+ [
1059
+ MODEL,
1060
+ [VENDOR, SONY],
1061
+ [TYPE, SMARTTV]
1062
+ ],
1063
+ [/(mi(tv|box)-?\w+) bui/i],
1064
+ [
1065
+ MODEL,
1066
+ [VENDOR, XIAOMI],
1067
+ [TYPE, SMARTTV]
1068
+ ],
1069
+ [/Hbbtv.*(technisat) (.*);/i],
1070
+ [
1071
+ VENDOR,
1072
+ MODEL,
1073
+ [TYPE, SMARTTV]
1074
+ ],
1075
+ [/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],
1076
+ [
1077
+ [
1078
+ VENDOR,
1079
+ /.+\/(\w+)/,
1080
+ "$1",
1081
+ strMapper,
1082
+ { "LG": "lge" }
1083
+ ],
1084
+ [MODEL, trim],
1085
+ [TYPE, SMARTTV]
1086
+ ],
1087
+ [/(playstation \w+)/i],
1088
+ [
1089
+ MODEL,
1090
+ [VENDOR, SONY],
1091
+ [TYPE, CONSOLE]
1092
+ ],
1093
+ [/\b(xbox(?: one)?(?!; xbox))[\); ]/i],
1094
+ [
1095
+ MODEL,
1096
+ [VENDOR, MICROSOFT],
1097
+ [TYPE, CONSOLE]
1098
+ ],
1099
+ [
1100
+ /(ouya)/i,
1101
+ /(nintendo) (\w+)/i,
1102
+ /(retroid) (pocket ([^\)]+))/i,
1103
+ /(valve).+(steam deck)/i,
1104
+ /droid.+; ((shield|rgcube|gr0006))( bui|\))/i
1105
+ ],
1106
+ [
1107
+ [
1108
+ VENDOR,
1109
+ strMapper,
1110
+ {
1111
+ "Nvidia": "Shield",
1112
+ "Anbernic": "RGCUBE",
1113
+ "Logitech": "GR0006"
1114
+ }
1115
+ ],
1116
+ MODEL,
1117
+ [TYPE, CONSOLE]
1118
+ ],
1119
+ [/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],
1120
+ [
1121
+ MODEL,
1122
+ [VENDOR, SAMSUNG],
1123
+ [TYPE, WEARABLE]
1124
+ ],
1125
+ [/((pebble))app/i, /(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],
1126
+ [
1127
+ VENDOR,
1128
+ MODEL,
1129
+ [TYPE, WEARABLE]
1130
+ ],
1131
+ [/(ow(?:19|20)?we?[1-3]{1,3})/i],
1132
+ [
1133
+ MODEL,
1134
+ [VENDOR, OPPO],
1135
+ [TYPE, WEARABLE]
1136
+ ],
1137
+ [/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],
1138
+ [
1139
+ MODEL,
1140
+ [VENDOR, APPLE],
1141
+ [TYPE, WEARABLE]
1142
+ ],
1143
+ [/(opwwe\d{3})/i],
1144
+ [
1145
+ MODEL,
1146
+ [VENDOR, ONEPLUS],
1147
+ [TYPE, WEARABLE]
1148
+ ],
1149
+ [/(moto 360)/i],
1150
+ [
1151
+ MODEL,
1152
+ [VENDOR, MOTOROLA],
1153
+ [TYPE, WEARABLE]
1154
+ ],
1155
+ [/(smartwatch 3)/i],
1156
+ [
1157
+ MODEL,
1158
+ [VENDOR, SONY],
1159
+ [TYPE, WEARABLE]
1160
+ ],
1161
+ [/(g watch r)/i],
1162
+ [
1163
+ MODEL,
1164
+ [VENDOR, LG],
1165
+ [TYPE, WEARABLE]
1166
+ ],
1167
+ [/droid.+; (wt63?0{2,3})\)/i],
1168
+ [
1169
+ MODEL,
1170
+ [VENDOR, ZEBRA],
1171
+ [TYPE, WEARABLE]
1172
+ ],
1173
+ [/droid.+; (glass) \d/i],
1174
+ [
1175
+ MODEL,
1176
+ [VENDOR, GOOGLE],
1177
+ [TYPE, XR]
1178
+ ],
1179
+ [/(pico) ([\w ]+) os\d/i],
1180
+ [
1181
+ VENDOR,
1182
+ MODEL,
1183
+ [TYPE, XR]
1184
+ ],
1185
+ [/(quest( \d| pro)?s?).+vr/i],
1186
+ [
1187
+ MODEL,
1188
+ [VENDOR, FACEBOOK],
1189
+ [TYPE, XR]
1190
+ ],
1191
+ [/mobile vr; rv.+firefox/i],
1192
+ [[TYPE, XR]],
1193
+ [/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],
1194
+ [VENDOR, [TYPE, EMBEDDED]],
1195
+ [/(aeobc)\b/i],
1196
+ [
1197
+ MODEL,
1198
+ [VENDOR, AMAZON],
1199
+ [TYPE, EMBEDDED]
1200
+ ],
1201
+ [/(homepod).+mac os/i],
1202
+ [
1203
+ MODEL,
1204
+ [VENDOR, APPLE],
1205
+ [TYPE, EMBEDDED]
1206
+ ],
1207
+ [/windows iot/i],
1208
+ [[TYPE, EMBEDDED]],
1209
+ [/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],
1210
+ [MODEL, [TYPE, SMARTTV]],
1211
+ [/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],
1212
+ [[TYPE, SMARTTV]],
1213
+ [/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],
1214
+ [MODEL, [
1215
+ TYPE,
1216
+ strMapper,
1217
+ {
1218
+ "mobile": "Mobile",
1219
+ "xr": "VR",
1220
+ "*": TABLET
1221
+ }
1222
+ ]],
1223
+ [/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],
1224
+ [[TYPE, TABLET]],
1225
+ [/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],
1226
+ [[TYPE, MOBILE]],
1227
+ [/droid .+?; ([\w\. -]+)( bui|\))/i],
1228
+ [MODEL, [VENDOR, "Generic"]]
1229
+ ],
1230
+ engine: [
1231
+ [/windows.+ edge\/([\w\.]+)/i],
1232
+ [VERSION, [NAME, EDGE + "HTML"]],
1233
+ [/(arkweb)\/([\w\.]+)/i],
1234
+ [NAME, VERSION],
1235
+ [/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],
1236
+ [VERSION, [NAME, "Blink"]],
1237
+ [
1238
+ /(presto)\/([\w\.]+)/i,
1239
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,
1240
+ /ekioh(flow)\/([\w\.]+)/i,
1241
+ /(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,
1242
+ /(icab)[\/ ]([23]\.[\d\.]+)/i,
1243
+ /\b(libweb)/i
1244
+ ],
1245
+ [NAME, VERSION],
1246
+ [/ladybird\//i],
1247
+ [[NAME, "LibWeb"]],
1248
+ [/rv\:([\w\.]{1,9})\b.+(gecko)/i],
1249
+ [VERSION, NAME]
1250
+ ],
1251
+ os: [
1252
+ [/(windows nt) (6\.[23]); arm/i],
1253
+ [[
1254
+ NAME,
1255
+ /N/,
1256
+ "R"
1257
+ ], [
1258
+ VERSION,
1259
+ strMapper,
1260
+ windowsVersionMap
1261
+ ]],
1262
+ [/(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],
1263
+ [NAME, VERSION],
1264
+ [/windows nt ?([\d\.\)]*)(?!.+xbox)/i, /\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],
1265
+ [[
1266
+ VERSION,
1267
+ /(;|\))/g,
1268
+ "",
1269
+ strMapper,
1270
+ windowsVersionMap
1271
+ ], [NAME, WINDOWS]],
1272
+ [/(windows ce)\/?([\d\.]*)/i],
1273
+ [NAME, VERSION],
1274
+ [
1275
+ /[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,
1276
+ /(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,
1277
+ /\btvos ?([\w\.]+)/i,
1278
+ /cfnetwork\/.+darwin/i
1279
+ ],
1280
+ [[
1281
+ VERSION,
1282
+ /_/g,
1283
+ "."
1284
+ ], [NAME, "iOS"]],
1285
+ [/(mac os x) ?([\w\. ]*)/i, /(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],
1286
+ [[NAME, "macOS"], [
1287
+ VERSION,
1288
+ /_/g,
1289
+ "."
1290
+ ]],
1291
+ [/android ([\d\.]+).*crkey/i],
1292
+ [VERSION, [NAME, CHROMECAST + " Android"]],
1293
+ [/fuchsia.*crkey\/([\d\.]+)/i],
1294
+ [VERSION, [NAME, CHROMECAST + " Fuchsia"]],
1295
+ [/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],
1296
+ [VERSION, [NAME, CHROMECAST + " SmartSpeaker"]],
1297
+ [/linux.*crkey\/([\d\.]+)/i],
1298
+ [VERSION, [NAME, CHROMECAST + " Linux"]],
1299
+ [/crkey\/([\d\.]+)/i],
1300
+ [VERSION, [NAME, CHROMECAST]],
1301
+ [/droid ([\w\.]+)\b.+(android[- ]x86)/i],
1302
+ [VERSION, NAME],
1303
+ [/(ubuntu) ([\w\.]+) like android/i],
1304
+ [[
1305
+ NAME,
1306
+ /(.+)/,
1307
+ "$1 Touch"
1308
+ ], VERSION],
1309
+ [/(harmonyos)[\/ ]?([\d\.]*)/i, /(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],
1310
+ [NAME, VERSION],
1311
+ [/\(bb(10);/i],
1312
+ [VERSION, [NAME, BLACKBERRY]],
1313
+ [/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],
1314
+ [VERSION, [NAME, "Symbian"]],
1315
+ [/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],
1316
+ [VERSION, [NAME, FIREFOX + " OS"]],
1317
+ [/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i, /webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],
1318
+ [VERSION, [NAME, "webOS"]],
1319
+ [/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],
1320
+ [[
1321
+ VERSION,
1322
+ strMapper,
1323
+ {
1324
+ "25": "120",
1325
+ "24": "108",
1326
+ "23": "94",
1327
+ "22": "87",
1328
+ "6": "79",
1329
+ "5": "68",
1330
+ "4": "53",
1331
+ "3": "38",
1332
+ "2": "538",
1333
+ "1": "537",
1334
+ "*": "TV"
1335
+ }
1336
+ ], [NAME, "webOS"]],
1337
+ [/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],
1338
+ [VERSION, [NAME, "watchOS"]],
1339
+ [/cros [\w]+(?:\)| ([\w\.]+)\b)/i],
1340
+ [VERSION, [NAME, "Chrome OS"]],
1341
+ [/kepler ([\w\.]+); (aft|aeo)/i],
1342
+ [VERSION, [NAME, "Vega OS"]],
1343
+ [
1344
+ /(netrange)mmh/i,
1345
+ /(nettv)\/(\d+\.[\w\.]+)/i,
1346
+ /(nintendo|playstation) (\w+)/i,
1347
+ /(xbox); +xbox ([^\);]+)/i,
1348
+ /(pico) .+os([\w\.]+)/i,
1349
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
1350
+ /linux.+(mint)[\/\(\) ]?([\w\.]*)/i,
1351
+ /(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,
1352
+ /([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,
1353
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
1354
+ /\b(aix)[; ]([1-9\.]{0,4})/i,
1355
+ /(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,
1356
+ /(gnu) ?([\w\.]*)/i,
1357
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
1358
+ /(haiku) ?(r\d)?/i
1359
+ ],
1360
+ [NAME, VERSION],
1361
+ [/(sunos) ?([\d\.]*)/i],
1362
+ [[NAME, "Solaris"], VERSION],
1363
+ [/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i, /(unix) ?([\w\.]*)/i],
1364
+ [NAME, VERSION]
1365
+ ]
1366
+ };
1367
+ var defaultProps = (function() {
1368
+ var props = {
1369
+ init: {},
1370
+ isIgnore: {},
1371
+ isIgnoreRgx: {},
1372
+ toString: {}
1373
+ };
1374
+ setProps.call(props.init, [
1375
+ [BROWSER, [
1376
+ NAME,
1377
+ VERSION,
1378
+ MAJOR,
1379
+ TYPE
1380
+ ]],
1381
+ [CPU, [ARCHITECTURE]],
1382
+ [DEVICE, [
1383
+ TYPE,
1384
+ MODEL,
1385
+ VENDOR
1386
+ ]],
1387
+ [ENGINE, [NAME, VERSION]],
1388
+ [OS, [NAME, VERSION]]
1389
+ ]);
1390
+ setProps.call(props.isIgnore, [
1391
+ [BROWSER, [VERSION, MAJOR]],
1392
+ [ENGINE, [VERSION]],
1393
+ [OS, [VERSION]]
1394
+ ]);
1395
+ setProps.call(props.isIgnoreRgx, [[BROWSER, / ?browser$/i], [OS, / ?os$/i]]);
1396
+ setProps.call(props.toString, [
1397
+ [BROWSER, [NAME, VERSION]],
1398
+ [CPU, [ARCHITECTURE]],
1399
+ [DEVICE, [VENDOR, MODEL]],
1400
+ [ENGINE, [NAME, VERSION]],
1401
+ [OS, [NAME, VERSION]]
1402
+ ]);
1403
+ return props;
1404
+ })();
1405
+ var createIData = function(item, itemType) {
1406
+ var init_props = defaultProps.init[itemType], is_ignoreProps = defaultProps.isIgnore[itemType] || 0, is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0, toString_props = defaultProps.toString[itemType] || 0;
1407
+ function IData() {
1408
+ setProps.call(this, init_props);
1409
+ }
1410
+ IData.prototype.getItem = function() {
1411
+ return item;
1412
+ };
1413
+ IData.prototype.withClientHints = function() {
1414
+ if (!NAVIGATOR_UADATA) return item.parseCH().get();
1415
+ return NAVIGATOR_UADATA.getHighEntropyValues(CH_ALL_VALUES).then(function(res) {
1416
+ return item.setCH(new UACHData(res, false)).parseCH().get();
1417
+ });
1418
+ };
1419
+ IData.prototype.withFeatureCheck = function() {
1420
+ return item.detectFeature().get();
1421
+ };
1422
+ if (itemType != RESULT) {
1423
+ IData.prototype.is = function(strToCheck) {
1424
+ var is = false;
1425
+ 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)) {
1426
+ is = true;
1427
+ if (strToCheck != TYPEOF.UNDEFINED) break;
1428
+ } else if (strToCheck == TYPEOF.UNDEFINED && is) {
1429
+ is = !is;
1430
+ break;
1431
+ }
1432
+ return is;
1433
+ };
1434
+ IData.prototype.toString = function() {
1435
+ var str = EMPTY;
1436
+ for (var i in toString_props) if (typeof this[toString_props[i]] !== TYPEOF.UNDEFINED) str += (str ? " " : EMPTY) + this[toString_props[i]];
1437
+ return str || TYPEOF.UNDEFINED;
1438
+ };
1439
+ }
1440
+ IData.prototype.then = function(cb) {
1441
+ var that = this;
1442
+ var IDataResolve = function() {
1443
+ for (var prop in that) if (that.hasOwnProperty(prop)) this[prop] = that[prop];
1444
+ };
1445
+ IDataResolve.prototype = {
1446
+ is: IData.prototype.is,
1447
+ toString: IData.prototype.toString,
1448
+ withClientHints: IData.prototype.withClientHints,
1449
+ withFeatureCheck: IData.prototype.withFeatureCheck
1450
+ };
1451
+ var resolveData = new IDataResolve();
1452
+ cb(resolveData);
1453
+ return resolveData;
1454
+ };
1455
+ return new IData();
1456
+ };
1457
+ function UACHData(uach, isHttpUACH) {
1458
+ uach = uach || {};
1459
+ setProps.call(this, CH_ALL_VALUES);
1460
+ if (isHttpUACH) setProps.call(this, [
1461
+ [BRANDS, itemListToArray(uach[CH])],
1462
+ [FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
1463
+ [MOBILE, /\?1/.test(uach[CH_MOBILE])],
1464
+ [MODEL, stripQuotes(uach[CH_MODEL])],
1465
+ [PLATFORM, stripQuotes(uach[CH_PLATFORM])],
1466
+ [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
1467
+ [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
1468
+ [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
1469
+ [BITNESS, stripQuotes(uach[CH_BITNESS])]
1470
+ ]);
1471
+ else for (var prop in uach) if (this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
1472
+ }
1473
+ function UAItem(itemType, ua, rgxMap, uaCH) {
1474
+ setProps.call(this, [
1475
+ ["itemType", itemType],
1476
+ ["ua", ua],
1477
+ ["uaCH", uaCH],
1478
+ ["rgxMap", rgxMap],
1479
+ ["data", createIData(this, itemType)]
1480
+ ]);
1481
+ return this;
1482
+ }
1483
+ UAItem.prototype.get = function(prop) {
1484
+ if (!prop) return this.data;
1485
+ return this.data.hasOwnProperty(prop) ? this.data[prop] : void 0;
1486
+ };
1487
+ UAItem.prototype.set = function(prop, val) {
1488
+ this.data[prop] = val;
1489
+ return this;
1490
+ };
1491
+ UAItem.prototype.setCH = function(ch) {
1492
+ this.uaCH = ch;
1493
+ return this;
1494
+ };
1495
+ UAItem.prototype.detectFeature = function() {
1496
+ if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) switch (this.itemType) {
1497
+ case BROWSER:
1498
+ if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) this.set(NAME, "Brave");
1499
+ break;
1500
+ case DEVICE:
1501
+ if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) this.set(TYPE, MOBILE);
1502
+ if (this.get(MODEL) == "Macintosh" && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) this.set(MODEL, "iPad").set(TYPE, TABLET);
1503
+ break;
1504
+ case OS:
1505
+ if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
1506
+ break;
1507
+ case RESULT:
1508
+ var data = this.data;
1509
+ var detect = function(itemType) {
1510
+ return data[itemType].getItem().detectFeature().get();
1511
+ };
1512
+ this.set(BROWSER, detect(BROWSER)).set(CPU, detect(CPU)).set(DEVICE, detect(DEVICE)).set(ENGINE, detect(ENGINE)).set(OS, detect(OS));
1513
+ }
1514
+ return this;
1515
+ };
1516
+ UAItem.prototype.parseUA = function() {
1517
+ if (this.itemType != RESULT) rgxMapper.call(this.data, this.ua, this.rgxMap);
1518
+ switch (this.itemType) {
1519
+ case BROWSER:
1520
+ this.set(MAJOR, majorize(this.get(VERSION)));
1521
+ break;
1522
+ case OS:
1523
+ if (this.get(NAME) == "iOS" && this.get(VERSION) == "18.6") {
1524
+ var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua);
1525
+ if (realVersion && parseInt(realVersion[1].substring(0, 2), 10) >= 26) this.set(VERSION, realVersion[1]);
1526
+ }
1527
+ break;
1528
+ }
1529
+ return this;
1530
+ };
1531
+ UAItem.prototype.parseCH = function() {
1532
+ var uaCH = this.uaCH, rgxMap = this.rgxMap;
1533
+ switch (this.itemType) {
1534
+ case BROWSER:
1535
+ case ENGINE:
1536
+ var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
1537
+ if (brands) for (var i = 0; i < brands.length; i++) {
1538
+ var brandName = brands[i].brand || brands[i], brandVersion = brands[i].version;
1539
+ if (this.itemType == BROWSER && !/not.a.brand/i.test(brandName) && (!prevName || /Chrom/.test(prevName) && brandName != CHROMIUM || prevName == EDGE && /WebView2/.test(brandName))) {
1540
+ brandName = strMapper(brandName, browserHintsMap);
1541
+ prevName = this.get(NAME);
1542
+ if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) this.set(NAME, brandName).set(VERSION, brandVersion).set(MAJOR, majorize(brandVersion));
1543
+ prevName = brandName;
1544
+ }
1545
+ if (this.itemType == ENGINE && brandName == CHROMIUM) this.set(VERSION, brandVersion);
1546
+ }
1547
+ break;
1548
+ case CPU:
1549
+ var archName = uaCH[ARCHITECTURE];
1550
+ if (archName) {
1551
+ if (archName && uaCH[BITNESS] == "64") archName += "64";
1552
+ rgxMapper.call(this.data, archName + ";", rgxMap);
1553
+ }
1554
+ break;
1555
+ case DEVICE:
1556
+ if (uaCH[MOBILE]) this.set(TYPE, MOBILE);
1557
+ if (uaCH[MODEL]) {
1558
+ this.set(MODEL, uaCH[MODEL]);
1559
+ if (!this.get(TYPE) || !this.get(VENDOR)) {
1560
+ var reParse = {};
1561
+ rgxMapper.call(reParse, "droid 9; " + uaCH[MODEL] + ")", rgxMap);
1562
+ if (!this.get(TYPE) && !!reParse.type) this.set(TYPE, reParse.type);
1563
+ if (!this.get(VENDOR) && !!reParse.vendor) this.set(VENDOR, reParse.vendor);
1564
+ }
1565
+ }
1566
+ if (uaCH[FORMFACTORS]) {
1567
+ var ff;
1568
+ if (typeof uaCH[FORMFACTORS] !== "string") {
1569
+ var idx = 0;
1570
+ while (!ff && idx < uaCH[FORMFACTORS].length) ff = strMapper(uaCH[FORMFACTORS][idx++], formFactorsMap);
1571
+ } else ff = strMapper(uaCH[FORMFACTORS], formFactorsMap);
1572
+ this.set(TYPE, ff);
1573
+ }
1574
+ break;
1575
+ case OS:
1576
+ var osName = uaCH[PLATFORM];
1577
+ if (osName) {
1578
+ var osVersion = uaCH[PLATFORMVER];
1579
+ if (osName == WINDOWS) osVersion = parseInt(majorize(osVersion), 10) >= 13 ? "11" : "10";
1580
+ this.set(NAME, osName).set(VERSION, osVersion);
1581
+ }
1582
+ if (this.get(NAME) == WINDOWS && uaCH[MODEL] == "Xbox") this.set(NAME, "Xbox").set(VERSION, void 0);
1583
+ break;
1584
+ case RESULT:
1585
+ var data = this.data;
1586
+ var parse = function(itemType) {
1587
+ return data[itemType].getItem().setCH(uaCH).parseCH().get();
1588
+ };
1589
+ this.set(BROWSER, parse(BROWSER)).set(CPU, parse(CPU)).set(DEVICE, parse(DEVICE)).set(ENGINE, parse(ENGINE)).set(OS, parse(OS));
1590
+ }
1591
+ return this;
1592
+ };
1593
+ function UAParser(ua, extensions, headers) {
1594
+ if (typeof ua === TYPEOF.OBJECT) {
1595
+ if (isExtensions(ua, true)) {
1596
+ if (typeof extensions === TYPEOF.OBJECT) headers = extensions;
1597
+ extensions = ua;
1598
+ } else {
1599
+ headers = ua;
1600
+ extensions = void 0;
1601
+ }
1602
+ ua = void 0;
1603
+ } else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
1604
+ headers = extensions;
1605
+ extensions = void 0;
1606
+ }
1607
+ if (headers) if (typeof headers.append === TYPEOF.FUNCTION) {
1608
+ var kv = {};
1609
+ headers.forEach(function(v$1, k$1) {
1610
+ kv[String(k$1).toLowerCase()] = v$1;
1611
+ });
1612
+ headers = kv;
1613
+ } else {
1614
+ var normalized = {};
1615
+ for (var header in headers) if (headers.hasOwnProperty(header)) normalized[String(header).toLowerCase()] = headers[header];
1616
+ headers = normalized;
1617
+ }
1618
+ if (!(this instanceof UAParser)) return new UAParser(ua, extensions, headers).getResult();
1619
+ 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) {
1620
+ if (itemType == RESULT) return function() {
1621
+ 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();
1622
+ };
1623
+ else return function() {
1624
+ return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH).parseUA().get();
1625
+ };
1626
+ };
1627
+ setProps.call(this, [
1628
+ ["getBrowser", createItemFunc(BROWSER)],
1629
+ ["getCPU", createItemFunc(CPU)],
1630
+ ["getDevice", createItemFunc(DEVICE)],
1631
+ ["getEngine", createItemFunc(ENGINE)],
1632
+ ["getOS", createItemFunc(OS)],
1633
+ ["getResult", createItemFunc(RESULT)],
1634
+ ["getUA", function() {
1635
+ return userAgent;
1636
+ }],
1637
+ ["setUA", function(ua$1) {
1638
+ if (isString(ua$1)) userAgent = trim(ua$1, UA_MAX_LENGTH);
1639
+ return this;
1640
+ }]
1641
+ ]).setUA(userAgent);
1642
+ return this;
1643
+ }
1644
+ UAParser.VERSION = LIBVERSION;
1645
+ UAParser.BROWSER = enumerize([
1646
+ NAME,
1647
+ VERSION,
1648
+ MAJOR,
1649
+ TYPE
1650
+ ]);
1651
+ UAParser.CPU = enumerize([ARCHITECTURE]);
1652
+ UAParser.DEVICE = enumerize([
1653
+ MODEL,
1654
+ VENDOR,
1655
+ TYPE,
1656
+ CONSOLE,
1657
+ MOBILE,
1658
+ SMARTTV,
1659
+ TABLET,
1660
+ WEARABLE,
1661
+ EMBEDDED
1662
+ ]);
1663
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
1664
+
1665
+ //#endregion
1666
+ //#region ../infra/src/providers/browser/BrowserInfoProvider.ts
1667
+ var BrowserInfoProvider = class {
1668
+ checkWebRtcSupport() {
1669
+ if (typeof window === "undefined") return false;
1670
+ const hasRTCPeerConnection = "RTCPeerConnection" in window || "webkitRTCPeerConnection" in window || "mozRTCPeerConnection" in window;
1671
+ const hasGetUserMedia = typeof navigator !== "undefined" && navigator.mediaDevices?.getUserMedia !== void 0;
1672
+ return hasRTCPeerConnection && hasGetUserMedia;
1673
+ }
1674
+ getBrowserInfo() {
1675
+ const userAgent = typeof navigator !== "undefined" ? navigator.userAgent : "";
1676
+ const result = new UAParser(userAgent).getResult();
1677
+ return {
1678
+ userAgent,
1679
+ isWebRtcSupported: this.checkWebRtcSupport(),
1680
+ browser: {
1681
+ name: result.browser.name,
1682
+ version: result.browser.version
1683
+ },
1684
+ os: {
1685
+ name: result.os.name,
1686
+ version: result.os.version
1687
+ },
1688
+ device: {
1689
+ model: result.device.model,
1690
+ type: result.device.type,
1691
+ vendor: result.device.vendor
1692
+ },
1693
+ engine: {
1694
+ name: result.engine.name,
1695
+ version: result.engine.version
1696
+ },
1697
+ cpu: { architecture: result.cpu.architecture }
1698
+ };
1699
+ }
1700
+ };
1701
+
1702
+ //#endregion
1703
+ //#region ../infra/src/device/getDeviceData.ts
1704
+ const HIGH_ENTROPY_HINTS = new Set([
1705
+ "model",
1706
+ "platformVersion",
1707
+ "fullVersionList",
1708
+ "brands",
1709
+ "platform"
1710
+ ]);
1711
+ function getFallbackDeviceInfo() {
1712
+ const result = new UAParser().getResult();
1713
+ return {
1714
+ device: { model: result.device.model },
1715
+ os: {
1716
+ name: result.os.name,
1717
+ version: result.os.version
1718
+ },
1719
+ browser: {
1720
+ name: result.browser.name,
1721
+ version: result.browser.version
1722
+ }
1723
+ };
1724
+ }
1725
+ function sanitizeString(value) {
1726
+ return value?.trim() || void 0;
1727
+ }
1728
+ function extractPrimaryBrandInfo(fullVersionList, brands) {
1729
+ const primaryBrand = fullVersionList?.[0] || brands?.[0];
1730
+ return {
1731
+ name: sanitizeString(primaryBrand?.brand),
1732
+ version: sanitizeString(primaryBrand?.version)
1733
+ };
1734
+ }
1735
+ async function getHighEntropyDeviceInfo(userAgentData) {
1736
+ const highEntropyValues = await userAgentData.getHighEntropyValues(Array.from(HIGH_ENTROPY_HINTS));
1737
+ const { name: browserName, version: browserVersion } = extractPrimaryBrandInfo(highEntropyValues.fullVersionList, userAgentData.brands);
1738
+ return {
1739
+ device: { model: sanitizeString(highEntropyValues.model) },
1740
+ os: {
1741
+ name: sanitizeString(highEntropyValues.platform),
1742
+ version: sanitizeString(highEntropyValues.platformVersion)
1743
+ },
1744
+ browser: {
1745
+ name: browserName,
1746
+ version: browserVersion
1747
+ }
1748
+ };
1749
+ }
1750
+ const checkForUnbrandedBrowser = (browser) => {
1751
+ const userAgent = typeof navigator !== "undefined" ? navigator.userAgent : "";
1752
+ const fallback = getFallbackDeviceInfo();
1753
+ if (!userAgent) return browser;
1754
+ try {
1755
+ return {
1756
+ ...browser,
1757
+ name: fallback.browser.name,
1758
+ version: fallback.browser.version
1759
+ };
1760
+ } catch {
1761
+ return {
1762
+ ...browser,
1763
+ name: "Unknown",
1764
+ version: "Unknown"
1765
+ };
1766
+ }
1767
+ };
1768
+ function mergeDeviceInfo(fallback, enhanced) {
1769
+ return {
1770
+ device: { model: enhanced.device?.model || fallback.device.model },
1771
+ os: {
1772
+ name: enhanced.os?.name || fallback.os.name,
1773
+ version: enhanced.os?.version || fallback.os.version
1774
+ },
1775
+ browser: checkForUnbrandedBrowser({
1776
+ name: enhanced.browser?.name || fallback.browser.name,
1777
+ version: enhanced.browser?.version || fallback.browser.version
1778
+ })
1779
+ };
1780
+ }
1781
+ function isUserAgentClientHintsSupported(navigator$1) {
1782
+ return Boolean(navigator$1.userAgentData?.getHighEntropyValues && typeof navigator$1.userAgentData.getHighEntropyValues === "function");
1783
+ }
1784
+ async function getDeviceFingerprintInfo() {
1785
+ if (typeof navigator === "undefined") return {
1786
+ device: {},
1787
+ os: {},
1788
+ browser: {}
1789
+ };
1790
+ const customNavigator = navigator;
1791
+ const fallbackInfo = getFallbackDeviceInfo();
1792
+ if (!isUserAgentClientHintsSupported(customNavigator)) return fallbackInfo;
1793
+ try {
1794
+ return mergeDeviceInfo(fallbackInfo, await getHighEntropyDeviceInfo(customNavigator.userAgentData));
1795
+ } catch {
1796
+ return fallbackInfo;
1797
+ }
1798
+ }
1799
+
1800
+ //#endregion
1801
+ //#region ../../node_modules/.pnpm/@thumbmarkjs+thumbmarkjs@1.6.4/node_modules/@thumbmarkjs/thumbmarkjs/dist/thumbmark.esm.js
1802
+ const e = 2592e5, t = "thumbmark", n = "https://api.thumbmarkjs.com", o = {
1803
+ exclude: [],
1804
+ include: [],
1805
+ stabilize: ["private", "iframe"],
1806
+ logging: !0,
1807
+ timeout: 5e3,
1808
+ cache_api_call: !0,
1809
+ cache_lifetime_in_ms: 0,
1810
+ performance: !1,
1811
+ experimental: !1,
1812
+ property_name_factory: (e$1) => `${t}_${e$1}`
1813
+ };
1814
+ let r = { ...o };
1815
+ const a = {
1816
+ private: [
1817
+ {
1818
+ exclude: ["canvas"],
1819
+ browsers: [
1820
+ "firefox",
1821
+ "safari>=17",
1822
+ "brave"
1823
+ ]
1824
+ },
1825
+ {
1826
+ exclude: ["audio"],
1827
+ browsers: ["samsungbrowser", "safari"]
1828
+ },
1829
+ {
1830
+ exclude: ["fonts"],
1831
+ browsers: ["firefox"]
1832
+ },
1833
+ {
1834
+ exclude: [
1835
+ "audio.sampleHash",
1836
+ "hardware.deviceMemory",
1837
+ "header.acceptLanguage.q",
1838
+ "system.hardwareConcurrency",
1839
+ "plugins"
1840
+ ],
1841
+ browsers: ["brave"]
1842
+ },
1843
+ {
1844
+ exclude: ["tls.extensions"],
1845
+ browsers: [
1846
+ "firefox",
1847
+ "chrome",
1848
+ "safari"
1849
+ ]
1850
+ },
1851
+ {
1852
+ exclude: ["header.acceptLanguage"],
1853
+ browsers: ["edge", "chrome"]
1854
+ }
1855
+ ],
1856
+ iframe: [{
1857
+ exclude: ["system.applePayVersion", "system.cookieEnabled"],
1858
+ browsers: ["safari"]
1859
+ }, { exclude: ["permissions"] }],
1860
+ vpn: [{ exclude: ["ip"] }]
1861
+ }, s = "undefined" != typeof window ? window.OfflineAudioContext || window.webkitOfflineAudioContext : null;
1862
+ function c(e$1) {
1863
+ let t$1 = 0;
1864
+ for (let n$1 = 0; n$1 < e$1.length; ++n$1) t$1 += Math.abs(e$1[n$1]);
1865
+ return t$1;
1866
+ }
1867
+ function l(e$1, t$1, n$1) {
1868
+ let o$1 = [];
1869
+ for (let t$2 = 0; t$2 < e$1[0].data.length; t$2++) {
1870
+ let n$2 = [];
1871
+ for (let o$2 = 0; o$2 < e$1.length; o$2++) n$2.push(e$1[o$2].data[t$2]);
1872
+ o$1.push(u(n$2));
1873
+ }
1874
+ const r$1 = new Uint8ClampedArray(o$1);
1875
+ return new ImageData(r$1, t$1, n$1);
1876
+ }
1877
+ function u(e$1) {
1878
+ if (0 === e$1.length) return 0;
1879
+ const t$1 = {};
1880
+ for (const n$2 of e$1) t$1[n$2] = (t$1[n$2] || 0) + 1;
1881
+ let n$1 = e$1[0];
1882
+ for (const e$2 in t$1) t$1[e$2] > t$1[n$1] && (n$1 = parseInt(e$2, 10));
1883
+ return n$1;
1884
+ }
1885
+ function d(e$1) {
1886
+ 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;
1887
+ }
1888
+ const m = new Uint32Array([
1889
+ 597399067,
1890
+ 2869860233,
1891
+ 951274213,
1892
+ 2716044179
1893
+ ]);
1894
+ function f(e$1, t$1) {
1895
+ return e$1 << t$1 | e$1 >>> 32 - t$1;
1896
+ }
1897
+ function h(e$1, t$1 = 0) {
1898
+ if (t$1 = t$1 ? 0 | t$1 : 0, "string" == typeof e$1 && (e$1 = function(e$2) {
1899
+ if ("undefined" != typeof TextEncoder) return new TextEncoder().encode(e$2).buffer;
1900
+ const t$2 = [];
1901
+ for (let n$2 = 0; n$2 < e$2.length; n$2++) {
1902
+ let o$2 = e$2.charCodeAt(n$2);
1903
+ 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));
1904
+ }
1905
+ return new Uint8Array(t$2).buffer;
1906
+ }(e$1)), !(e$1 instanceof ArrayBuffer)) throw new TypeError("Expected key to be ArrayBuffer or string");
1907
+ const n$1 = new Uint32Array([
1908
+ t$1,
1909
+ t$1,
1910
+ t$1,
1911
+ t$1
1912
+ ]);
1913
+ (function(e$2, t$2) {
1914
+ const n$2 = e$2.byteLength / 16 | 0, o$2 = new Uint32Array(e$2, 0, 4 * n$2);
1915
+ for (let e$3 = 0; e$3 < n$2; e$3++) {
1916
+ const n$3 = o$2.subarray(4 * e$3, 4 * (e$3 + 1));
1917
+ 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;
1918
+ }
1919
+ })(e$1, n$1), function(e$2, t$2) {
1920
+ 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);
1921
+ switch (o$2) {
1922
+ case 15: r$1[3] = r$1[3] ^ i[14] << 16;
1923
+ case 14: r$1[3] = r$1[3] ^ i[13] << 8;
1924
+ 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];
1925
+ case 12: r$1[2] = r$1[2] ^ i[11] << 24;
1926
+ case 11: r$1[2] = r$1[2] ^ i[10] << 16;
1927
+ case 10: r$1[2] = r$1[2] ^ i[9] << 8;
1928
+ 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];
1929
+ case 8: r$1[1] = r$1[1] ^ i[7] << 24;
1930
+ case 7: r$1[1] = r$1[1] ^ i[6] << 16;
1931
+ case 6: r$1[1] = r$1[1] ^ i[5] << 8;
1932
+ 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];
1933
+ case 4: r$1[0] = r$1[0] ^ i[3] << 24;
1934
+ case 3: r$1[0] = r$1[0] ^ i[2] << 16;
1935
+ case 2: r$1[0] = r$1[0] ^ i[1] << 8;
1936
+ 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];
1937
+ }
1938
+ }(e$1, n$1), function(e$2, t$2) {
1939
+ 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;
1940
+ }(e$1, n$1);
1941
+ const o$1 = new Uint8Array(n$1.buffer);
1942
+ return Array.from(o$1).map(((e$2) => e$2.toString(16).padStart(2, "0"))).join("");
1943
+ }
1944
+ const p = 280;
1945
+ async function g(e$1) {
1946
+ for (var t$1; !document.body;) await w(50);
1947
+ const n$1 = document.createElement("iframe");
1948
+ n$1.setAttribute("frameBorder", "0");
1949
+ const o$1 = n$1.style;
1950
+ 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);
1951
+ const r$1 = n$1.contentDocument || (null === (t$1 = n$1.contentWindow) || void 0 === t$1 ? void 0 : t$1.document);
1952
+ if (!r$1) throw new Error("Iframe document is not accessible");
1953
+ e$1({ iframe: r$1 }), setTimeout((() => {
1954
+ document.body.removeChild(n$1);
1955
+ }), 0);
1956
+ }
1957
+ function w(e$1, t$1) {
1958
+ return new Promise(((n$1) => setTimeout(n$1, e$1, t$1)));
1959
+ }
1960
+ const v = [
1961
+ "Arial",
1962
+ "Arial Black",
1963
+ "Arial Narrow",
1964
+ "Arial Rounded MT",
1965
+ "Arimo",
1966
+ "Archivo",
1967
+ "Barlow",
1968
+ "Bebas Neue",
1969
+ "Bitter",
1970
+ "Bookman",
1971
+ "Calibri",
1972
+ "Cabin",
1973
+ "Candara",
1974
+ "Century",
1975
+ "Century Gothic",
1976
+ "Comic Sans MS",
1977
+ "Constantia",
1978
+ "Courier",
1979
+ "Courier New",
1980
+ "Crimson Text",
1981
+ "DM Mono",
1982
+ "DM Sans",
1983
+ "DM Serif Display",
1984
+ "DM Serif Text",
1985
+ "Dosis",
1986
+ "Droid Sans",
1987
+ "Exo",
1988
+ "Fira Code",
1989
+ "Fira Sans",
1990
+ "Franklin Gothic Medium",
1991
+ "Garamond",
1992
+ "Geneva",
1993
+ "Georgia",
1994
+ "Gill Sans",
1995
+ "Helvetica",
1996
+ "Impact",
1997
+ "Inconsolata",
1998
+ "Indie Flower",
1999
+ "Inter",
2000
+ "Josefin Sans",
2001
+ "Karla",
2002
+ "Lato",
2003
+ "Lexend",
2004
+ "Lucida Bright",
2005
+ "Lucida Console",
2006
+ "Lucida Sans Unicode",
2007
+ "Manrope",
2008
+ "Merriweather",
2009
+ "Merriweather Sans",
2010
+ "Montserrat",
2011
+ "Myriad",
2012
+ "Noto Sans",
2013
+ "Nunito",
2014
+ "Nunito Sans",
2015
+ "Open Sans",
2016
+ "Optima",
2017
+ "Orbitron",
2018
+ "Oswald",
2019
+ "Pacifico",
2020
+ "Palatino",
2021
+ "Perpetua",
2022
+ "PT Sans",
2023
+ "PT Serif",
2024
+ "Poppins",
2025
+ "Prompt",
2026
+ "Public Sans",
2027
+ "Quicksand",
2028
+ "Rajdhani",
2029
+ "Recursive",
2030
+ "Roboto",
2031
+ "Roboto Condensed",
2032
+ "Rockwell",
2033
+ "Rubik",
2034
+ "Segoe Print",
2035
+ "Segoe Script",
2036
+ "Segoe UI",
2037
+ "Sora",
2038
+ "Source Sans Pro",
2039
+ "Space Mono",
2040
+ "Tahoma",
2041
+ "Taviraj",
2042
+ "Times",
2043
+ "Times New Roman",
2044
+ "Titillium Web",
2045
+ "Trebuchet MS",
2046
+ "Ubuntu",
2047
+ "Varela Round",
2048
+ "Verdana",
2049
+ "Work Sans"
2050
+ ], y = [
2051
+ "monospace",
2052
+ "sans-serif",
2053
+ "serif"
2054
+ ];
2055
+ function S(e$1, t$1) {
2056
+ return e$1.font = `72px ${t$1}`, e$1.measureText("WwMmLli0Oo").width;
2057
+ }
2058
+ function b() {
2059
+ var e$1;
2060
+ 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");
2061
+ if (n$1 && "getParameter" in n$1) try {
2062
+ const e$2 = (n$1.getParameter(n$1.VENDOR) || "").toString(), t$2 = (n$1.getParameter(n$1.RENDERER) || "").toString();
2063
+ let o$1 = {
2064
+ vendor: e$2,
2065
+ renderer: t$2,
2066
+ version: (n$1.getParameter(n$1.VERSION) || "").toString(),
2067
+ shadingLanguageVersion: (n$1.getParameter(n$1.SHADING_LANGUAGE_VERSION) || "").toString()
2068
+ };
2069
+ if (!t$2.length || !e$2.length) {
2070
+ const e$3 = n$1.getExtension("WEBGL_debug_renderer_info");
2071
+ if (e$3) {
2072
+ const t$3 = (n$1.getParameter(e$3.UNMASKED_VENDOR_WEBGL) || "").toString(), r$1 = (n$1.getParameter(e$3.UNMASKED_RENDERER_WEBGL) || "").toString();
2073
+ t$3 && (o$1.vendorUnmasked = t$3), r$1 && (o$1.rendererUnmasked = r$1);
2074
+ }
2075
+ }
2076
+ return o$1;
2077
+ } catch (e$2) {}
2078
+ return "undefined";
2079
+ }
2080
+ function E() {
2081
+ const e$1 = new Float32Array(1), t$1 = new Uint8Array(e$1.buffer);
2082
+ return e$1[0] = Infinity, e$1[0] = e$1[0] - e$1[0], t$1[3];
2083
+ }
2084
+ const M = (e$1, t$1, n$1, o$1) => {
2085
+ const r$1 = (n$1 - t$1) / o$1;
2086
+ let i = 0;
2087
+ for (let n$2 = 0; n$2 < o$1; n$2++) i += e$1(t$1 + (n$2 + .5) * r$1);
2088
+ return i * r$1;
2089
+ };
2090
+ function P(e$1, t$1) {
2091
+ const n$1 = {};
2092
+ return t$1.forEach(((t$2) => {
2093
+ const o$1 = function(e$2) {
2094
+ if (0 === e$2.length) return null;
2095
+ const t$3 = {};
2096
+ e$2.forEach(((e$3) => {
2097
+ const n$3 = String(e$3);
2098
+ t$3[n$3] = (t$3[n$3] || 0) + 1;
2099
+ }));
2100
+ let n$2 = e$2[0], o$2 = 1;
2101
+ return Object.keys(t$3).forEach(((e$3) => {
2102
+ t$3[e$3] > o$2 && (n$2 = e$3, o$2 = t$3[e$3]);
2103
+ })), n$2;
2104
+ }(e$1.map(((e$2) => t$2 in e$2 ? e$2[t$2] : void 0)).filter(((e$2) => void 0 !== e$2)));
2105
+ o$1 && (n$1[t$2] = o$1);
2106
+ })), n$1;
2107
+ }
2108
+ const A = [
2109
+ "accelerometer",
2110
+ "accessibility",
2111
+ "accessibility-events",
2112
+ "ambient-light-sensor",
2113
+ "background-fetch",
2114
+ "background-sync",
2115
+ "bluetooth",
2116
+ "camera",
2117
+ "clipboard-read",
2118
+ "clipboard-write",
2119
+ "device-info",
2120
+ "display-capture",
2121
+ "gyroscope",
2122
+ "geolocation",
2123
+ "local-fonts",
2124
+ "magnetometer",
2125
+ "microphone",
2126
+ "midi",
2127
+ "nfc",
2128
+ "notifications",
2129
+ "payment-handler",
2130
+ "persistent-storage",
2131
+ "push",
2132
+ "speaker",
2133
+ "storage-access",
2134
+ "top-level-storage-access",
2135
+ "window-management",
2136
+ "query"
2137
+ ];
2138
+ function x() {
2139
+ var e$1, t$1, n$1, o$1, r$1, i;
2140
+ if ("undefined" == typeof navigator) return {
2141
+ name: "unknown",
2142
+ version: "unknown"
2143
+ };
2144
+ const a$1 = navigator.userAgent, s$1 = [
2145
+ /(?<name>SamsungBrowser)\/(?<version>\d+(?:\.\d+)+)/,
2146
+ /(?<name>EdgA|EdgiOS|Edg)\/(?<version>\d+(?:\.\d+)+)/,
2147
+ /(?<name>OPR|OPX)\/(?<version>\d+(?:\.\d+)+)/,
2148
+ /Opera[\s\/](?<version>\d+(?:\.\d+)+)/,
2149
+ /Opera Mini\/(?<version>\d+(?:\.\d+)+)/,
2150
+ /Opera Mobi\/(?<version>\d+(?:\.\d+)+)/,
2151
+ /(?<name>Vivaldi)\/(?<version>\d+(?:\.\d+)+)/,
2152
+ /(?<name>Brave)\/(?<version>\d+(?:\.\d+)+)/,
2153
+ /(?<name>CriOS)\/(?<version>\d+(?:\.\d+)+)/,
2154
+ /(?<name>FxiOS)\/(?<version>\d+(?:\.\d+)+)/,
2155
+ /(?<name>Chrome|Chromium)\/(?<version>\d+(?:\.\d+)+)/,
2156
+ /(?<name>Firefox|Waterfox|Iceweasel|IceCat)\/(?<version>\d+(?:\.\d+)+)/,
2157
+ /Version\/(?<version1>[\d.]+).*Safari\/[\d.]+|(?<name>Safari)\/(?<version2>[\d.]+)/,
2158
+ /(?<name>MSIE|Trident|IEMobile).+?(?<version>\d+(?:\.\d+)+)/,
2159
+ /(?<name>[A-Za-z]+)\/(?<version>\d+(?:\.\d+)+)/
2160
+ ], c$1 = {
2161
+ edg: "Edge",
2162
+ edga: "Edge",
2163
+ edgios: "Edge",
2164
+ opr: "Opera",
2165
+ opx: "Opera",
2166
+ crios: "Chrome",
2167
+ fxios: "Firefox",
2168
+ samsung: "SamsungBrowser",
2169
+ vivaldi: "Vivaldi",
2170
+ brave: "Brave"
2171
+ };
2172
+ for (const l$1 of s$1) {
2173
+ const s$2 = a$1.match(l$1);
2174
+ if (s$2) {
2175
+ 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);
2176
+ 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 {
2177
+ name: c$1[a$2.toLowerCase()] || a$2,
2178
+ version: u$1 || "unknown"
2179
+ };
2180
+ }
2181
+ }
2182
+ return {
2183
+ name: "unknown",
2184
+ version: "unknown"
2185
+ };
2186
+ }
2187
+ function C() {
2188
+ if ("undefined" == typeof navigator || !navigator.userAgent) return !1;
2189
+ const e$1 = navigator.userAgent;
2190
+ return /Mobi|Android|iPhone|iPod|IEMobile|Opera Mini|Opera Mobi|webOS|BlackBerry|Windows Phone/i.test(e$1) && !/iPad/i.test(e$1);
2191
+ }
2192
+ function _() {
2193
+ let e$1 = [];
2194
+ const t$1 = {
2195
+ "prefers-contrast": [
2196
+ "high",
2197
+ "more",
2198
+ "low",
2199
+ "less",
2200
+ "forced",
2201
+ "no-preference"
2202
+ ],
2203
+ "any-hover": ["hover", "none"],
2204
+ "any-pointer": [
2205
+ "none",
2206
+ "coarse",
2207
+ "fine"
2208
+ ],
2209
+ pointer: [
2210
+ "none",
2211
+ "coarse",
2212
+ "fine"
2213
+ ],
2214
+ hover: ["hover", "none"],
2215
+ update: ["fast", "slow"],
2216
+ "inverted-colors": ["inverted", "none"],
2217
+ "prefers-reduced-motion": ["reduce", "no-preference"],
2218
+ "prefers-reduced-transparency": ["reduce", "no-preference"],
2219
+ scripting: [
2220
+ "none",
2221
+ "initial-only",
2222
+ "enabled"
2223
+ ],
2224
+ "forced-colors": ["active", "none"]
2225
+ };
2226
+ return Object.keys(t$1).forEach(((n$1) => {
2227
+ t$1[n$1].forEach(((t$2) => {
2228
+ matchMedia(`(${n$1}: ${t$2})`).matches && e$1.push(`${n$1}: ${t$2}`);
2229
+ }));
2230
+ })), e$1;
2231
+ }
2232
+ function I() {
2233
+ if ("https:" === window.location.protocol && "function" == typeof window.ApplePaySession) try {
2234
+ const e$1 = window.ApplePaySession.supportsVersion;
2235
+ for (let t$1 = 15; t$1 > 0; t$1--) if (e$1(t$1)) return t$1;
2236
+ } catch (e$1) {
2237
+ return 0;
2238
+ }
2239
+ return 0;
2240
+ }
2241
+ const T = "SamsungBrowser" !== x().name ? 1 : 3;
2242
+ let R, k = null;
2243
+ function O(e$1) {
2244
+ const t$1 = [];
2245
+ return function e$2(n$1) {
2246
+ if (n$1 && n$1.toJSON && "function" == typeof n$1.toJSON && (n$1 = n$1.toJSON()), void 0 === n$1) return;
2247
+ if ("number" == typeof n$1) return isFinite(n$1) ? "" + n$1 : "null";
2248
+ if ("object" != typeof n$1) return JSON.stringify(n$1);
2249
+ let o$1, r$1;
2250
+ if (Array.isArray(n$1)) {
2251
+ 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";
2252
+ return r$1 + "]";
2253
+ }
2254
+ if (null === n$1) return "null";
2255
+ if (-1 !== t$1.indexOf(n$1)) throw new TypeError("Converting circular structure to JSON");
2256
+ const i = t$1.push(n$1) - 1, a$1 = Object.keys(n$1).sort();
2257
+ for (r$1 = "", o$1 = 0; o$1 < a$1.length; o$1++) {
2258
+ const t$2 = a$1[o$1], i$1 = e$2(n$1[t$2]);
2259
+ i$1 && (r$1 && (r$1 += ","), r$1 += JSON.stringify(t$2) + ":" + i$1);
2260
+ }
2261
+ return t$1.splice(i, 1), "{" + r$1 + "}";
2262
+ }(e$1) || "";
2263
+ }
2264
+ const L = [
2265
+ "𝔄",
2266
+ "𝔅",
2267
+ "ℭ",
2268
+ "𝔇",
2269
+ "𝔈",
2270
+ "𝔉",
2271
+ "𝔸",
2272
+ "𝔹",
2273
+ "ℂ",
2274
+ "𝔻",
2275
+ "𝔼",
2276
+ "𝔽"
2277
+ ], B = [
2278
+ "β",
2279
+ "ψ",
2280
+ "λ",
2281
+ "ε",
2282
+ "ζ",
2283
+ "α",
2284
+ "ξ",
2285
+ "μ",
2286
+ "ρ",
2287
+ "φ",
2288
+ "κ",
2289
+ "τ",
2290
+ "η",
2291
+ "σ",
2292
+ "ι",
2293
+ "ω",
2294
+ "γ",
2295
+ "ν",
2296
+ "χ",
2297
+ "δ",
2298
+ "θ",
2299
+ "π",
2300
+ "υ",
2301
+ "ο"
2302
+ ];
2303
+ function D(e$1, t$1) {
2304
+ return `<math><mrow>${t$1}</mrow></math>`;
2305
+ }
2306
+ function N() {
2307
+ let e$1 = "<mo>∏</mo>";
2308
+ return L.forEach(((t$1, n$1) => {
2309
+ const o$1 = 2 * n$1, r$1 = B.slice(o$1, o$1 + 2);
2310
+ 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>`);
2311
+ })), D(0, `<munderover><mmultiscripts>${e$1}</mmultiscripts></munderover>`);
2312
+ }
2313
+ function $() {
2314
+ const e$1 = [];
2315
+ return L.forEach(((t$1, n$1) => {
2316
+ const o$1 = 2 * n$1, r$1 = B.slice(o$1, o$1 + 2);
2317
+ 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>`));
2318
+ })), e$1;
2319
+ }
2320
+ const V = {
2321
+ audio: async function() {
2322
+ return s ? async function() {
2323
+ return new Promise(((e$1, t$1) => {
2324
+ try {
2325
+ const t$2 = new s(1, 5e3, 44100), n$1 = t$2.createBufferSource(), o$1 = t$2.createOscillator();
2326
+ o$1.frequency.value = 1e3;
2327
+ const r$1 = t$2.createDynamicsCompressor();
2328
+ let i;
2329
+ 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) => {
2330
+ i = o$2.renderedBuffer.getChannelData(0), e$1({
2331
+ sampleHash: c(i),
2332
+ maxChannels: t$2.destination.maxChannelCount,
2333
+ channelCountMode: n$1.channelCountMode
2334
+ });
2335
+ }, t$2.startRendering();
2336
+ } catch (e$2) {
2337
+ console.error("Error creating audio fingerprint:", e$2), t$1(e$2);
2338
+ }
2339
+ }));
2340
+ }() : null;
2341
+ },
2342
+ canvas: async function() {
2343
+ return new Promise(((e$1) => {
2344
+ const t$1 = Array.from({ length: 3 }, (() => function() {
2345
+ const e$2 = document.createElement("canvas"), t$2 = e$2.getContext("2d");
2346
+ if (!t$2) return null;
2347
+ e$2.width = p, e$2.height = 20;
2348
+ const n$1 = t$2.createLinearGradient(0, 0, e$2.width, e$2.height);
2349
+ 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);
2350
+ const o$1 = "Random Text WMwmil10Oo";
2351
+ 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();
2352
+ return t$2.getImageData(0, 0, e$2.width, e$2.height);
2353
+ }())).filter(((e$2) => null !== e$2));
2354
+ 0 !== t$1.length ? e$1({ commonPixelsHash: h(l(t$1, p, 20).data.toString()).toString() }) : e$1(null);
2355
+ }));
2356
+ },
2357
+ fonts: async function(e$1) {
2358
+ return new Promise(((e$2) => {
2359
+ try {
2360
+ g((async ({ iframe: t$1 }) => {
2361
+ const n$1 = t$1.createElement("canvas").getContext("2d");
2362
+ if (!n$1) return void e$2(null);
2363
+ const o$1 = y.map(((e$3) => S(n$1, e$3)));
2364
+ let r$1 = {};
2365
+ v.forEach(((e$3) => {
2366
+ const t$2 = S(n$1, e$3);
2367
+ o$1.includes(t$2) || (r$1[e$3] = t$2);
2368
+ })), e$2(r$1);
2369
+ }));
2370
+ } catch (t$1) {
2371
+ e$2(null);
2372
+ }
2373
+ }));
2374
+ },
2375
+ hardware: function() {
2376
+ return new Promise(((e$1, t$1) => {
2377
+ const n$1 = void 0 !== navigator.deviceMemory ? navigator.deviceMemory : 0, o$1 = window.performance && window.performance.memory ? window.performance.memory : 0;
2378
+ e$1({
2379
+ videocard: b(),
2380
+ architecture: E(),
2381
+ deviceMemory: n$1.toString() || "undefined",
2382
+ jsHeapSizeLimit: o$1.jsHeapSizeLimit || 0
2383
+ });
2384
+ }));
2385
+ },
2386
+ locales: function() {
2387
+ return new Promise(((e$1) => {
2388
+ e$1({
2389
+ languages: navigator.language,
2390
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
2391
+ });
2392
+ }));
2393
+ },
2394
+ math: function() {
2395
+ return new Promise(((e$1) => {
2396
+ e$1({
2397
+ acos: Math.acos(.5),
2398
+ asin: M(Math.asin, -1, 1, 97),
2399
+ cos: M(Math.cos, 0, Math.PI, 97),
2400
+ largeCos: Math.cos(0x56bc75e2d63100000),
2401
+ largeSin: Math.sin(0x56bc75e2d63100000),
2402
+ largeTan: Math.tan(0x56bc75e2d63100000),
2403
+ sin: M(Math.sin, -Math.PI, Math.PI, 97),
2404
+ tan: M(Math.tan, 0, 2 * Math.PI, 97)
2405
+ });
2406
+ }));
2407
+ },
2408
+ permissions: async function(e$1) {
2409
+ const t$1 = (null == e$1 ? void 0 : e$1.permissions_to_check) || A;
2410
+ return P(await Promise.all(Array.from({ length: 3 }, (() => async function(e$2) {
2411
+ const t$2 = {};
2412
+ for (const n$1 of e$2) try {
2413
+ t$2[n$1] = (await navigator.permissions.query({ name: n$1 })).state.toString();
2414
+ } catch (e$3) {}
2415
+ return t$2;
2416
+ }(t$1)))), t$1);
2417
+ },
2418
+ plugins: async function() {
2419
+ const e$1 = [];
2420
+ if (navigator.plugins) for (let t$1 = 0; t$1 < navigator.plugins.length; t$1++) {
2421
+ const n$1 = navigator.plugins[t$1];
2422
+ e$1.push([
2423
+ n$1.name,
2424
+ n$1.filename,
2425
+ n$1.description
2426
+ ].join("|"));
2427
+ }
2428
+ return new Promise(((t$1) => {
2429
+ t$1({ plugins: e$1 });
2430
+ }));
2431
+ },
2432
+ screen: function() {
2433
+ return new Promise(((e$1) => {
2434
+ if ("undefined" == typeof matchMedia || "undefined" == typeof screen) return void e$1(null);
2435
+ const t$1 = {
2436
+ is_touchscreen: navigator.maxTouchPoints > 0,
2437
+ maxTouchPoints: navigator.maxTouchPoints,
2438
+ colorDepth: screen.colorDepth,
2439
+ mediaMatches: _()
2440
+ };
2441
+ C() && navigator.maxTouchPoints > 0 && (t$1.resolution = function() {
2442
+ const e$2 = window.screen.width, t$2 = window.screen.height;
2443
+ return `${Math.max(e$2, t$2).toString()}x${Math.min(e$2, t$2).toString()}`;
2444
+ }()), e$1(t$1);
2445
+ }));
2446
+ },
2447
+ system: function() {
2448
+ return new Promise(((e$1) => {
2449
+ const t$1 = x();
2450
+ e$1({
2451
+ platform: window.navigator.platform,
2452
+ productSub: navigator.productSub,
2453
+ product: navigator.product,
2454
+ useragent: navigator.userAgent,
2455
+ hardwareConcurrency: navigator.hardwareConcurrency,
2456
+ browser: {
2457
+ name: t$1.name,
2458
+ version: t$1.version
2459
+ },
2460
+ mobile: C(),
2461
+ applePayVersion: I(),
2462
+ cookieEnabled: window.navigator.cookieEnabled
2463
+ });
2464
+ }));
2465
+ },
2466
+ webgl: async function() {
2467
+ "undefined" != typeof document && (R = document.createElement("canvas"), R.width = 200, R.height = 100, k = R.getContext("webgl"));
2468
+ try {
2469
+ if (!k) throw new Error("WebGL not supported");
2470
+ return { commonPixelsHash: h(l(Array.from({ length: T }, (() => function() {
2471
+ try {
2472
+ if (!k) throw new Error("WebGL not supported");
2473
+ 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);
2474
+ if (!n$1 || !o$1) throw new Error("Failed to create shaders");
2475
+ 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));
2476
+ if (k.compileShader(o$1), !k.getShaderParameter(o$1, k.COMPILE_STATUS)) throw new Error("Fragment shader compilation failed: " + k.getShaderInfoLog(o$1));
2477
+ const r$1 = k.createProgram();
2478
+ if (!r$1) throw new Error("Failed to create shader program");
2479
+ 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));
2480
+ k.useProgram(r$1);
2481
+ const i = 137, a$1 = new Float32Array(4 * i), s$1 = 2 * Math.PI / i;
2482
+ for (let e$2 = 0; e$2 < i; e$2++) {
2483
+ const t$2 = e$2 * s$1;
2484
+ 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);
2485
+ }
2486
+ const c$1 = k.createBuffer();
2487
+ k.bindBuffer(k.ARRAY_BUFFER, c$1), k.bufferData(k.ARRAY_BUFFER, a$1, k.STATIC_DRAW);
2488
+ const l$1 = k.getAttribLocation(r$1, "position");
2489
+ 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);
2490
+ const u$1 = new Uint8ClampedArray(R.width * R.height * 4);
2491
+ k.readPixels(0, 0, R.width, R.height, k.RGBA, k.UNSIGNED_BYTE, u$1);
2492
+ return new ImageData(u$1, R.width, R.height);
2493
+ } catch (e$1) {
2494
+ return new ImageData(1, 1);
2495
+ } finally {
2496
+ k && (k.bindBuffer(k.ARRAY_BUFFER, null), k.useProgram(null), k.viewport(0, 0, k.drawingBufferWidth, k.drawingBufferHeight), k.clearColor(0, 0, 0, 0));
2497
+ }
2498
+ }())), R.width, R.height).data.toString()).toString() };
2499
+ } catch (e$1) {
2500
+ return { webgl: "unsupported" };
2501
+ }
2502
+ }
2503
+ }, F = {
2504
+ webrtc: async function() {
2505
+ return new Promise(((e$1) => {
2506
+ try {
2507
+ const t$1 = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
2508
+ if (!t$1) return void e$1({
2509
+ supported: !1,
2510
+ error: "WebRTC not supported"
2511
+ });
2512
+ const n$1 = new t$1({
2513
+ iceCandidatePoolSize: 1,
2514
+ iceServers: []
2515
+ });
2516
+ n$1.createDataChannel("");
2517
+ (async () => {
2518
+ try {
2519
+ const o$1 = await n$1.createOffer({
2520
+ offerToReceiveAudio: !0,
2521
+ offerToReceiveVideo: !0
2522
+ });
2523
+ await n$1.setLocalDescription(o$1);
2524
+ 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) => {
2525
+ const t$2 = r$1.match(/* @__PURE__ */ new RegExp(`m=${e$2} [^\\s]+ [^\\s]+ ([^\\n\\r]+)`));
2526
+ return t$2 ? t$2[1].split(" ") : [];
2527
+ }, s$1 = (e$2, t$2) => t$2.map(((t$3) => {
2528
+ const n$2 = new RegExp(`(rtpmap|fmtp|rtcp-fb):${t$3} (.+)`, "g"), o$2 = [...r$1.matchAll(n$2)];
2529
+ if (!o$2.length) return null;
2530
+ const i$1 = {};
2531
+ return o$2.forEach(((t$4) => {
2532
+ const [n$3, o$3, r$2] = t$4, a$2 = r$2.split("/");
2533
+ "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);
2534
+ })), i$1;
2535
+ })).filter(Boolean), c$1 = s$1("audio", a$1("audio")), l$1 = s$1("video", a$1("video")), u$1 = {
2536
+ audio: {
2537
+ count: c$1.length,
2538
+ hash: h(O(c$1))
2539
+ },
2540
+ video: {
2541
+ count: l$1.length,
2542
+ hash: h(O(l$1))
2543
+ },
2544
+ extensionsHash: h(O(i))
2545
+ }, d$1 = await new Promise(((e$2) => {
2546
+ const t$2 = setTimeout((() => {
2547
+ n$1.removeEventListener("icecandidate", o$2), n$1.close(), e$2({
2548
+ supported: !0,
2549
+ ...u$1,
2550
+ timeout: !0
2551
+ });
2552
+ }), 3e3), o$2 = (r$2) => {
2553
+ const i$1 = r$2.candidate;
2554
+ i$1 && i$1.candidate && (clearTimeout(t$2), n$1.removeEventListener("icecandidate", o$2), n$1.close(), e$2({
2555
+ supported: !0,
2556
+ ...u$1,
2557
+ candidateType: i$1.type || ""
2558
+ }));
2559
+ };
2560
+ n$1.addEventListener("icecandidate", o$2);
2561
+ }));
2562
+ e$1({
2563
+ details: d$1,
2564
+ hash: h(O(d$1))
2565
+ });
2566
+ } catch (t$2) {
2567
+ n$1.close(), e$1({
2568
+ supported: !0,
2569
+ error: `WebRTC offer failed: ${t$2.message}`
2570
+ });
2571
+ }
2572
+ })();
2573
+ } catch (t$1) {
2574
+ e$1({
2575
+ supported: !1,
2576
+ error: `WebRTC error: ${t$1.message}`
2577
+ });
2578
+ }
2579
+ }));
2580
+ },
2581
+ mathml: async function() {
2582
+ return new Promise(((e$1) => {
2583
+ try {
2584
+ g((async ({ iframe: t$1 }) => {
2585
+ try {
2586
+ if (!function(e$2) {
2587
+ try {
2588
+ const t$2 = e$2.createElement("math");
2589
+ t$2.innerHTML = "<mrow><mi>x</mi></mrow>", t$2.style.position = "absolute", t$2.style.visibility = "hidden", e$2.body.appendChild(t$2);
2590
+ const n$2 = t$2.getBoundingClientRect();
2591
+ return e$2.body.removeChild(t$2), n$2.width > 0 && n$2.height > 0;
2592
+ } catch (e$3) {
2593
+ return !1;
2594
+ }
2595
+ }(t$1)) return void e$1({
2596
+ supported: !1,
2597
+ error: "MathML not supported"
2598
+ });
2599
+ const n$1 = [
2600
+ 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>"),
2601
+ 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>"),
2602
+ 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>"),
2603
+ N(),
2604
+ ...$()
2605
+ ], o$1 = [];
2606
+ let r$1 = "";
2607
+ n$1.forEach(((e$2, n$2) => {
2608
+ const i$1 = function(e$3, t$2) {
2609
+ try {
2610
+ const n$3 = t$2.createElement("math");
2611
+ 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);
2612
+ const o$2 = n$3.getBoundingClientRect(), r$2 = (t$2.defaultView || window).getComputedStyle(n$3), i$2 = {
2613
+ dimensions: {
2614
+ width: o$2.width,
2615
+ height: o$2.height
2616
+ },
2617
+ fontInfo: {
2618
+ fontFamily: r$2.fontFamily,
2619
+ fontSize: r$2.fontSize,
2620
+ fontWeight: r$2.fontWeight,
2621
+ fontStyle: r$2.fontStyle,
2622
+ lineHeight: r$2.lineHeight,
2623
+ fontVariant: r$2.fontVariant || "normal",
2624
+ fontStretch: r$2.fontStretch || "normal",
2625
+ fontSizeAdjust: r$2.fontSizeAdjust || "none",
2626
+ textRendering: r$2.textRendering || "auto",
2627
+ fontFeatureSettings: r$2.fontFeatureSettings || "normal",
2628
+ fontVariantNumeric: r$2.fontVariantNumeric || "normal",
2629
+ fontKerning: r$2.fontKerning || "auto"
2630
+ }
2631
+ };
2632
+ return t$2.body.removeChild(n$3), i$2;
2633
+ } catch (e$4) {
2634
+ return { error: e$4.message };
2635
+ }
2636
+ }(e$2, t$1);
2637
+ o$1.push({
2638
+ width: i$1.dimensions.width,
2639
+ height: i$1.dimensions.height
2640
+ }), 0 === n$2 && i$1.fontInfo && (r$1 = h(O(i$1.fontInfo)));
2641
+ }));
2642
+ const i = {
2643
+ fontStyleHash: r$1,
2644
+ dimensions: o$1
2645
+ };
2646
+ e$1({
2647
+ details: i,
2648
+ hash: h(O(i))
2649
+ });
2650
+ } catch (t$2) {
2651
+ e$1({
2652
+ supported: !1,
2653
+ error: `MathML error: ${t$2.message}`
2654
+ });
2655
+ }
2656
+ }));
2657
+ } catch (t$1) {
2658
+ e$1({
2659
+ supported: !1,
2660
+ error: `MathML error: ${t$1.message}`
2661
+ });
2662
+ }
2663
+ }));
2664
+ },
2665
+ speech: async function() {
2666
+ return new Promise(((e$1) => {
2667
+ try {
2668
+ if ("undefined" == typeof window || !window.speechSynthesis || "function" != typeof window.speechSynthesis.getVoices) return void e$1({
2669
+ supported: !1,
2670
+ error: "Speech Synthesis API not supported"
2671
+ });
2672
+ let t$1 = !1, n$1 = null;
2673
+ const o$1 = (o$2) => {
2674
+ if (!t$1) {
2675
+ t$1 = !0, n$1 && clearTimeout(n$1);
2676
+ try {
2677
+ const t$2 = o$2.map(((e$2) => {
2678
+ const t$3 = (e$3) => e$3.replace(/\\/g, "\\\\").replace(/,/g, "\\,");
2679
+ return [
2680
+ t$3(e$2.voiceURI || ""),
2681
+ t$3(e$2.name || ""),
2682
+ t$3(e$2.lang || ""),
2683
+ e$2.localService ? "1" : "0",
2684
+ e$2.default ? "1" : "0"
2685
+ ].join(",");
2686
+ }));
2687
+ t$2.sort();
2688
+ const n$2 = {
2689
+ voiceCount: o$2.length,
2690
+ voicesHash: h(O(t$2))
2691
+ };
2692
+ e$1({
2693
+ details: n$2,
2694
+ hash: h(O(n$2))
2695
+ });
2696
+ } catch (t$2) {
2697
+ e$1({
2698
+ supported: !0,
2699
+ error: `Voice processing failed: ${t$2.message}`
2700
+ });
2701
+ }
2702
+ }
2703
+ }, r$1 = window.speechSynthesis.getVoices();
2704
+ if (r$1.length > 0) return void o$1(r$1);
2705
+ n$1 = setTimeout((() => {
2706
+ o$1(window.speechSynthesis.getVoices());
2707
+ }), 800);
2708
+ const i = () => {
2709
+ window.speechSynthesis.removeEventListener("voiceschanged", i);
2710
+ o$1(window.speechSynthesis.getVoices());
2711
+ };
2712
+ window.speechSynthesis.addEventListener("voiceschanged", i);
2713
+ } catch (t$1) {
2714
+ e$1({
2715
+ supported: !1,
2716
+ error: `Speech Synthesis error: ${t$1.message}`
2717
+ });
2718
+ }
2719
+ }));
2720
+ }
2721
+ }, U = {}, j = { timeout: "true" }, W = (e$1, t$1, n$1) => {
2722
+ U[e$1] = t$1;
2723
+ };
2724
+ function G(e$1, t$1) {
2725
+ var n$1;
2726
+ let o$1 = x();
2727
+ if ("unknown" === o$1.name && e$1.system && "object" == typeof e$1.system && !Array.isArray(e$1.system)) {
2728
+ const t$2 = e$1.system.browser;
2729
+ if (t$2 && "object" == typeof t$2 && !Array.isArray(t$2)) {
2730
+ const e$2 = t$2;
2731
+ o$1 = {
2732
+ name: e$2.name || "unknown",
2733
+ version: e$2.version || "unknown"
2734
+ };
2735
+ }
2736
+ }
2737
+ 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) || [];
2738
+ for (const e$2 of l$1) {
2739
+ const t$2 = a[e$2];
2740
+ if (t$2) for (const e$3 of t$2) {
2741
+ 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) => {
2742
+ const t$4 = e$4.match(/(.+?)(>=)(\d+)/);
2743
+ if (t$4) {
2744
+ const [, e$5, , n$2] = t$4;
2745
+ return r$1 === e$5 && s$1 >= parseInt(n$2, 10);
2746
+ }
2747
+ return r$1 === e$4;
2748
+ })));
2749
+ (t$3 || o$2) && c$1.push(...e$3.exclude);
2750
+ }
2751
+ }
2752
+ return function e$2(t$2, n$2 = "") {
2753
+ const o$2 = {};
2754
+ for (const [r$2, i$1] of Object.entries(t$2)) {
2755
+ const t$3 = n$2 ? `${n$2}.${r$2}` : r$2;
2756
+ if ("object" != typeof i$1 || Array.isArray(i$1) || null === i$1) {
2757
+ 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)));
2758
+ e$3 && !n$3 || (o$2[r$2] = i$1);
2759
+ } else {
2760
+ const n$3 = e$2(i$1, t$3);
2761
+ Object.keys(n$3).length > 0 && (o$2[r$2] = n$3);
2762
+ }
2763
+ }
2764
+ return o$2;
2765
+ }(e$1);
2766
+ }
2767
+ const z = "visitor_id";
2768
+ function J(e$1) {
2769
+ return e$1.storage_property_name ? e$1.storage_property_name : e$1.property_name_factory(z);
2770
+ }
2771
+ const q = `${t}_${z}`;
2772
+ function K(e$1, t$1) {
2773
+ try {
2774
+ localStorage.setItem(J(t$1), e$1);
2775
+ } catch (e$2) {}
2776
+ }
2777
+ const Y = "cache";
2778
+ function X(e$1) {
2779
+ try {
2780
+ const t$1 = localStorage.getItem(e$1.property_name_factory(Y));
2781
+ return JSON.parse(t$1) || {};
2782
+ } catch (e$2) {}
2783
+ return {};
2784
+ }
2785
+ function Z(t$1) {
2786
+ return t$1.cache_lifetime_in_ms > e ? Date.now() + e : Date.now() + t$1.cache_lifetime_in_ms;
2787
+ }
2788
+ let Q = null, ee = null;
2789
+ const te = (e$1, t$1) => {
2790
+ if (e$1.cache_api_call) {
2791
+ if (ee) return Promise.resolve(ee);
2792
+ const t$2 = function(e$2) {
2793
+ const t$3 = X(e$2);
2794
+ if (t$3 && t$3.apiResponse && t$3.apiResponseExpiry && Date.now() <= t$3.apiResponseExpiry) return t$3.apiResponse;
2795
+ }(e$1);
2796
+ if (t$2) return Promise.resolve(t$2);
2797
+ if (Q) return Q;
2798
+ }
2799
+ const o$1 = `${e$1.api_endpoint || n}/thumbmark`, r$1 = function(e$2) {
2800
+ try {
2801
+ const t$2 = J(e$2);
2802
+ let n$1 = localStorage.getItem(t$2);
2803
+ return n$1 || t$2 === q || (n$1 = localStorage.getItem(q), n$1 && K(n$1, e$2)), n$1;
2804
+ } catch (e$3) {
2805
+ return null;
2806
+ }
2807
+ }(e$1), i = {
2808
+ components: t$1,
2809
+ options: e$1,
2810
+ clientHash: h(O(t$1)),
2811
+ version: "1.6.3"
2812
+ };
2813
+ r$1 && (i.visitorId = r$1);
2814
+ const a$1 = fetch(o$1, {
2815
+ method: "POST",
2816
+ headers: {
2817
+ "x-api-key": e$1.api_key,
2818
+ Authorization: "custom-authorized",
2819
+ "Content-Type": "application/json"
2820
+ },
2821
+ body: JSON.stringify(i)
2822
+ }).then(((e$2) => {
2823
+ if (!e$2.ok) {
2824
+ if (403 === e$2.status) throw new Error("INVALID_API_KEY");
2825
+ throw new Error(`HTTP error! status: ${e$2.status}`);
2826
+ }
2827
+ return e$2.json();
2828
+ })).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) {
2829
+ if (!e$2.cache_api_call || !e$2.cache_lifetime_in_ms) return;
2830
+ (function(e$3, t$4) {
2831
+ const n$1 = {
2832
+ ...X(e$3),
2833
+ ...t$4
2834
+ };
2835
+ try {
2836
+ localStorage.setItem(e$3.property_name_factory(Y), JSON.stringify(n$1));
2837
+ } catch (e$4) {}
2838
+ })(e$2, {
2839
+ apiResponseExpiry: Z(e$2),
2840
+ apiResponse: t$3
2841
+ });
2842
+ }(e$1, t$2), Q = null, t$2))).catch(((e$2) => {
2843
+ if (console.error("Error fetching pro data", e$2), Q = null, "INVALID_API_KEY" === e$2.message) throw e$2;
2844
+ return null;
2845
+ })), s$1 = e$1.timeout || 5e3, c$1 = new Promise(((t$2) => {
2846
+ setTimeout((() => {
2847
+ const n$1 = X(e$1);
2848
+ n$1 && n$1.apiResponse ? t$2(n$1.apiResponse) : t$2({
2849
+ info: { timed_out: !0 },
2850
+ ...r$1 && { visitorId: r$1 }
2851
+ });
2852
+ }), s$1);
2853
+ }));
2854
+ return Q = Promise.race([a$1, c$1]), Q;
2855
+ };
2856
+ async function ne(e$1) {
2857
+ var t$1;
2858
+ if ("undefined" == typeof document || "undefined" == typeof window) return {
2859
+ thumbmark: "",
2860
+ components: {},
2861
+ info: {},
2862
+ version: "1.6.3",
2863
+ error: "Browser environment required"
2864
+ };
2865
+ const r$1 = {
2866
+ ...o,
2867
+ ...e$1
2868
+ }, i = r$1.logging && !sessionStorage.getItem("_tmjs_l") && Math.random() < 1e-4, { elapsed: s$1, resolvedComponents: c$1 } = await oe({
2869
+ ...V,
2870
+ ...U
2871
+ }, r$1);
2872
+ let l$1 = {}, u$1 = {};
2873
+ if (i || r$1.experimental) {
2874
+ const { elapsed: e$2, resolvedComponents: t$2 } = await oe(F, r$1);
2875
+ l$1 = t$2, u$1 = e$2;
2876
+ }
2877
+ const d$1 = r$1.api_key ? te(r$1, c$1) : null;
2878
+ let m$1 = null;
2879
+ if (d$1) try {
2880
+ m$1 = await d$1;
2881
+ } catch (e$2) {
2882
+ if (e$2 instanceof Error && "INVALID_API_KEY" === e$2.message) return {
2883
+ error: "Invalid API key or quota exceeded",
2884
+ components: {},
2885
+ info: {},
2886
+ version: "1.6.3",
2887
+ thumbmark: ""
2888
+ };
2889
+ throw e$2;
2890
+ }
2891
+ const f$1 = {
2892
+ ...s$1,
2893
+ ...u$1
2894
+ }, p$1 = r$1.performance ? { elapsed: f$1 } : {}, g$1 = G((null == m$1 ? void 0 : m$1.components) || {}, r$1), w$1 = {
2895
+ ...c$1,
2896
+ ...g$1
2897
+ }, 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));
2898
+ i && async function(e$2, t$2, o$1, r$2 = {}) {
2899
+ var i$1;
2900
+ const a$1 = `${n}/log`, s$2 = {
2901
+ thumbmark: e$2,
2902
+ components: t$2,
2903
+ experimental: r$2,
2904
+ version: "1.6.3",
2905
+ options: o$1,
2906
+ path: null === (i$1 = null === window || void 0 === window ? void 0 : window.location) || void 0 === i$1 ? void 0 : i$1.pathname
2907
+ };
2908
+ sessionStorage.setItem("_tmjs_l", "1");
2909
+ try {
2910
+ await fetch(a$1, {
2911
+ method: "POST",
2912
+ headers: { "Content-Type": "application/json" },
2913
+ body: JSON.stringify(s$2)
2914
+ });
2915
+ } catch (e$3) {}
2916
+ }(y$1, w$1, r$1, l$1).catch((() => {}));
2917
+ return {
2918
+ ...(null == m$1 ? void 0 : m$1.visitorId) && { visitorId: m$1.visitorId },
2919
+ thumbmark: y$1,
2920
+ components: w$1,
2921
+ info: v$1,
2922
+ version: "1.6.3",
2923
+ ...p$1,
2924
+ ...Object.keys(l$1).length > 0 && r$1.experimental && { experimental: l$1 },
2925
+ ...(null == m$1 ? void 0 : m$1.requestId) && { requestId: m$1.requestId }
2926
+ };
2927
+ }
2928
+ async function oe(e$1, t$1) {
2929
+ const n$1 = {
2930
+ ...o,
2931
+ ...t$1
2932
+ }, r$1 = Object.entries(e$1).filter((([e$2]) => {
2933
+ var t$2;
2934
+ return !(null === (t$2 = null == n$1 ? void 0 : n$1.exclude) || void 0 === t$2 ? void 0 : t$2.includes(e$2));
2935
+ })).filter((([e$2]) => {
2936
+ var t$2, o$1, r$2, i$1;
2937
+ 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));
2938
+ })), i = r$1.map((([e$2]) => e$2)), s$1 = await function(e$2, t$2, n$2) {
2939
+ return Promise.all(e$2.map(((e$3) => {
2940
+ const o$1 = performance.now();
2941
+ return Promise.race([e$3.then(((e$4) => ({
2942
+ value: e$4,
2943
+ elapsed: performance.now() - o$1
2944
+ }))), (r$2 = t$2, i$1 = n$2, new Promise(((e$4) => {
2945
+ setTimeout((() => e$4(i$1)), r$2);
2946
+ }))).then(((e$4) => ({
2947
+ value: e$4,
2948
+ elapsed: performance.now() - o$1
2949
+ })))]);
2950
+ var r$2, i$1;
2951
+ })));
2952
+ }(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 = {};
2953
+ s$1.forEach(((e$2, t$2) => {
2954
+ var n$2;
2955
+ 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);
2956
+ }));
2957
+ return {
2958
+ elapsed: c$1,
2959
+ resolvedComponents: G(l$1, n$1)
2960
+ };
2961
+ }
2962
+ var se = class {
2963
+ constructor(e$1) {
2964
+ this.options = {
2965
+ ...o,
2966
+ ...e$1
2967
+ };
2968
+ }
2969
+ async get(e$1) {
2970
+ return ne({
2971
+ ...this.options,
2972
+ ...e$1
2973
+ });
2974
+ }
2975
+ getVersion() {
2976
+ return "1.6.3";
2977
+ }
2978
+ includeComponent(e$1, t$1) {
2979
+ W(e$1, t$1);
2980
+ }
2981
+ };
2982
+
2983
+ //#endregion
2984
+ //#region ../infra/src/providers/browser/thumbmarkAdapter.ts
2985
+ /**
2986
+ * Adapter for @thumbmarkjs/thumbmarkjs. Single point of dependency so bundlers
2987
+ * resolve it from infra's node_modules when building apps that depend on core → infra.
2988
+ */
2989
+ async function getThumbmarkId() {
2990
+ return (await new se().get()).thumbmark;
2991
+ }
2992
+
2993
+ //#endregion
2994
+ //#region ../infra/src/providers/browser/FingerprintProvider.ts
2995
+ var FingerprintProvider = class {
2996
+ constructor(ipLookup) {
2997
+ this.ipLookup = ipLookup;
2998
+ }
2999
+ async getFingerprint(disableIpify = false) {
3000
+ const visitorId = await getThumbmarkId();
3001
+ const [deviceInfo, ip] = await Promise.all([getDeviceFingerprintInfo(), disableIpify ? Promise.resolve("") : this.ipLookup.getIp()]);
3002
+ return {
3003
+ visitorId,
3004
+ ip,
3005
+ deviceInfo
3006
+ };
3007
+ }
3008
+ };
3009
+
3010
+ //#endregion
3011
+ //#region src/internal/featureConfig/featureConfigService.ts
3012
+ let cachedFeatures$1 = null;
3013
+ /**
3014
+ * Checks if a feature is enabled in the feature config.
3015
+ */
3016
+ function isFeatureEnabled(feature, features) {
3017
+ return features?.find((f$1) => f$1.feature === feature)?.enabled ?? false;
3018
+ }
3019
+ /**
3020
+ * Fetches feature configuration from the backend.
3021
+ * Results are cached for the session lifetime.
3022
+ */
3023
+ async function fetchFeatureConfig(signal) {
3024
+ if (cachedFeatures$1) return cachedFeatures$1;
3025
+ const response = await api.get(endpoints.featureConfig, { signal });
3026
+ if (!response.ok) throw new Error(`Failed to fetch feature config: ${response.status} ${response.statusText}`);
3027
+ cachedFeatures$1 = response.data;
3028
+ return cachedFeatures$1;
3029
+ }
3030
+ /**
3031
+ * Resets the cached feature config (useful for testing).
3032
+ */
3033
+ function resetFeatureConfigCache() {
3034
+ cachedFeatures$1 = null;
3035
+ }
3036
+
3037
+ //#endregion
3038
+ //#region src/internal/version/sdkVersion.ts
3039
+ const SDK_VERSION = "2.0.1";
3040
+
3041
+ //#endregion
3042
+ //#region src/internal/fingerprint/fingerprintService.ts
3043
+ function formatOsVersion(os) {
3044
+ return `${os.name || "Unknown"} ${os.version || ""}`.trim();
3045
+ }
3046
+ function formatBrowser(browser) {
3047
+ if (!browser.name || !browser.version) return "Unknown";
3048
+ return `${browser.name} ${browser.version}`;
3049
+ }
3050
+ async function submitDeviceFingerprint(options = {}, dependencies) {
3051
+ const { disableIpify = false, hostingApp, signal } = options;
3052
+ const fingerprint = await dependencies.fingerprintProvider.getFingerprint(disableIpify);
3053
+ const hasLiedBrowser = isBrowserSimulation(dependencies.browserEnv);
3054
+ const payload = {
3055
+ hash: fingerprint.visitorId || "",
3056
+ ip: fingerprint.ip || "",
3057
+ deviceType: "WEBAPP",
3058
+ data: JSON.stringify(fingerprint),
3059
+ osVersion: formatOsVersion(fingerprint.deviceInfo.os),
3060
+ deviceModel: fingerprint.deviceInfo.device.model || "",
3061
+ browser: formatBrowser(fingerprint.deviceInfo.browser),
3062
+ hasLiedBrowser,
3063
+ sdkVersion: SDK_VERSION,
3064
+ hostingApp: hostingApp ?? "Web SDK"
3065
+ };
3066
+ const response = await api.post(endpoints.deviceFingerprint, payload, { signal });
3067
+ if (!response.ok) throw new Error(`Failed to submit fingerprint: ${response.status} ${response.statusText}`);
3068
+ return response.data;
3069
+ }
3070
+
3071
+ //#endregion
3072
+ //#region src/internal/session/sessionInitializer.ts
3073
+ let sessionInitialized = false;
3074
+ let cachedFeatures = null;
3075
+ let cachedDisableIpify = false;
3076
+ let cachedFingerprintSuccess = false;
3077
+ let cachedFingerprintResult;
3078
+ let sessionInitPromise = null;
3079
+ /**
3080
+ * Activates a session by setting the auth token on the HTTP client and
3081
+ * preloading session-scoped state.
3082
+ *
3083
+ * Performs:
3084
+ * 1. Sets the token (and clears stale session-init cache if the token changed)
3085
+ * 2. Fetches feature configuration from backend
3086
+ * 3. Submits device fingerprint
3087
+ * 4. Starts the analytics batcher so buffered events are flushed
3088
+ *
3089
+ * Results are cached per token. Calling again with the same token returns the
3090
+ * cached result; calling with a different token re-initializes from scratch.
3091
+ *
3092
+ * @param options - Session activation options (`token` required)
3093
+ * @returns Session initialization result with feature config
3094
+ *
3095
+ * @example
3096
+ * ```ts
3097
+ * await setup({ apiURL: 'https://api.incode.com' });
3098
+ * const session = await createSession('api-key', options);
3099
+ * const { features } = await initializeSession({ token: session.token });
3100
+ *
3101
+ * // Check feature flags
3102
+ * if (isFeatureEnabled('DISABLE_IPIFY', features.features)) {
3103
+ * // Handle disabled ipify
3104
+ * }
3105
+ * ```
3106
+ */
3107
+ async function initializeSession(options = {}) {
3108
+ const { token, hostingApp, signal } = options;
3109
+ if (token !== void 0 && token !== getToken()) {
3110
+ setToken(token);
3111
+ resetSessionInit();
3112
+ }
3113
+ if (sessionInitialized && cachedFeatures) return {
3114
+ features: cachedFeatures,
3115
+ disableIpify: cachedDisableIpify,
3116
+ fingerprintSuccess: cachedFingerprintSuccess,
3117
+ fingerprintResult: cachedFingerprintResult
3118
+ };
3119
+ if (sessionInitPromise) return sessionInitPromise;
3120
+ sessionInitPromise = (async () => {
3121
+ let features;
3122
+ let disableIpify = false;
3123
+ try {
3124
+ features = await fetchFeatureConfig(signal);
3125
+ disableIpify = isFeatureEnabled("DISABLE_IPIFY", features.features);
3126
+ } catch {
3127
+ features = { sessionIdentifier: "" };
3128
+ }
3129
+ let fingerprintSuccess = false;
3130
+ let fingerprintResult;
3131
+ try {
3132
+ const fingerprintProvider = new FingerprintProvider(new IpifyProvider());
3133
+ const browserEnv = new BrowserEnvironmentProvider();
3134
+ fingerprintResult = await submitDeviceFingerprint({
3135
+ disableIpify,
3136
+ hostingApp,
3137
+ signal
3138
+ }, {
3139
+ fingerprintProvider,
3140
+ browserEnv
3141
+ });
3142
+ fingerprintSuccess = true;
3143
+ } catch (error) {
3144
+ console.warn("Failed to submit device fingerprint:", error);
3145
+ }
3146
+ try {
3147
+ const browserInfo = new BrowserInfoProvider().getBrowserInfo();
3148
+ addEvent({
3149
+ code: "browser",
3150
+ payload: {
3151
+ userAgent: browserInfo.userAgent,
3152
+ isWebRtcSupported: browserInfo.isWebRtcSupported,
3153
+ browser: browserInfo.browser,
3154
+ os: browserInfo.os,
3155
+ device: browserInfo.device,
3156
+ engine: browserInfo.engine,
3157
+ cpu: browserInfo.cpu
3158
+ }
3159
+ });
3160
+ } catch (error) {
3161
+ console.warn("Failed to send browser info event:", error);
3162
+ }
3163
+ sessionInitialized = true;
3164
+ cachedFeatures = features;
3165
+ cachedDisableIpify = disableIpify;
3166
+ cachedFingerprintSuccess = fingerprintSuccess;
3167
+ cachedFingerprintResult = fingerprintResult;
3168
+ return {
3169
+ features,
3170
+ disableIpify,
3171
+ fingerprintSuccess,
3172
+ fingerprintResult
3173
+ };
3174
+ })().finally(() => {
3175
+ sessionInitPromise = null;
3176
+ getAnalyticsBatcher()?.start();
3177
+ });
3178
+ return sessionInitPromise;
3179
+ }
3180
+ /**
3181
+ * Gets the cached disableIpify flag.
3182
+ * Returns false if session hasn't been initialized.
3183
+ */
3184
+ function getDisableIpify() {
3185
+ return cachedDisableIpify;
3186
+ }
3187
+ function getSessionFingerprintResult() {
3188
+ return cachedFingerprintResult;
3189
+ }
3190
+ /**
3191
+ * Resets session initialization state.
3192
+ * Useful for testing or when starting a new session.
3193
+ */
3194
+ function resetSessionInit() {
3195
+ sessionInitialized = false;
3196
+ cachedFeatures = null;
3197
+ cachedDisableIpify = false;
3198
+ cachedFingerprintSuccess = false;
3199
+ cachedFingerprintResult = void 0;
3200
+ sessionInitPromise = null;
3201
+ resetFeatureConfigCache();
3202
+ resetIpifyCache();
3203
+ }
3204
+
3205
+ //#endregion
3206
+ export { FingerprintProvider as a, QrValidationError as c, refreshQrUrlUuid as d, validateQrUuid as f, resetSessionInit as i, bootstrapSession as l, getSessionFingerprintResult as n, getDeviceFingerprintInfo as o, initializeSession as r, QR_VALIDATION_ERROR_CODES as s, getDisableIpify as t, createSession as u };