fpscanner 0.2.0 → 0.9.2

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 (168) hide show
  1. package/README.md +639 -55
  2. package/bin/cli.js +216 -0
  3. package/dist/crypto-helpers.d.ts +19 -0
  4. package/dist/crypto-helpers.d.ts.map +1 -0
  5. package/dist/detections/hasCDP.d.ts +3 -0
  6. package/dist/detections/hasCDP.d.ts.map +1 -0
  7. package/dist/detections/hasContextMismatch.d.ts +3 -0
  8. package/dist/detections/hasContextMismatch.d.ts.map +1 -0
  9. package/dist/detections/hasHeadlessChromeScreenResolution.d.ts +3 -0
  10. package/dist/detections/hasHeadlessChromeScreenResolution.d.ts.map +1 -0
  11. package/dist/detections/hasHighCPUCount.d.ts +3 -0
  12. package/dist/detections/hasHighCPUCount.d.ts.map +1 -0
  13. package/dist/detections/hasImpossibleDeviceMemory.d.ts +3 -0
  14. package/dist/detections/hasImpossibleDeviceMemory.d.ts.map +1 -0
  15. package/dist/detections/hasMismatchPlatformIframe.d.ts +3 -0
  16. package/dist/detections/hasMismatchPlatformIframe.d.ts.map +1 -0
  17. package/dist/detections/hasMismatchPlatformWorker.d.ts +3 -0
  18. package/dist/detections/hasMismatchPlatformWorker.d.ts.map +1 -0
  19. package/dist/detections/hasMismatchWebGLInWorker.d.ts +3 -0
  20. package/dist/detections/hasMismatchWebGLInWorker.d.ts.map +1 -0
  21. package/dist/detections/hasMissingChromeObject.d.ts +3 -0
  22. package/dist/detections/hasMissingChromeObject.d.ts.map +1 -0
  23. package/dist/detections/hasPlaywright.d.ts +3 -0
  24. package/dist/detections/hasPlaywright.d.ts.map +1 -0
  25. package/dist/detections/hasSeleniumProperty.d.ts +3 -0
  26. package/dist/detections/hasSeleniumProperty.d.ts.map +1 -0
  27. package/dist/detections/hasSwiftshaderRenderer.d.ts +3 -0
  28. package/dist/detections/hasSwiftshaderRenderer.d.ts.map +1 -0
  29. package/dist/detections/hasUTCTimezone.d.ts +3 -0
  30. package/dist/detections/hasUTCTimezone.d.ts.map +1 -0
  31. package/dist/detections/hasWebdriver.d.ts +3 -0
  32. package/dist/detections/hasWebdriver.d.ts.map +1 -0
  33. package/dist/detections/hasWebdriverIframe.d.ts +3 -0
  34. package/dist/detections/hasWebdriverIframe.d.ts.map +1 -0
  35. package/dist/detections/hasWebdriverWorker.d.ts +3 -0
  36. package/dist/detections/hasWebdriverWorker.d.ts.map +1 -0
  37. package/dist/detections/hasWebdriverWritable.d.ts +3 -0
  38. package/dist/detections/hasWebdriverWritable.d.ts.map +1 -0
  39. package/dist/fpScanner.cjs.js +31 -0
  40. package/dist/fpScanner.es.js +1066 -0
  41. package/dist/index.d.ts +39 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/signals/browserExtensions.d.ts +5 -0
  44. package/dist/signals/browserExtensions.d.ts.map +1 -0
  45. package/dist/signals/browserFeatures.d.ts +14 -0
  46. package/dist/signals/browserFeatures.d.ts.map +1 -0
  47. package/dist/signals/canvas.d.ts +6 -0
  48. package/dist/signals/canvas.d.ts.map +1 -0
  49. package/dist/signals/cdp.d.ts +2 -0
  50. package/dist/signals/cdp.d.ts.map +1 -0
  51. package/dist/signals/cpuCount.d.ts +2 -0
  52. package/dist/signals/cpuCount.d.ts.map +1 -0
  53. package/dist/signals/etsl.d.ts +2 -0
  54. package/dist/signals/etsl.d.ts.map +1 -0
  55. package/dist/signals/highEntropyValues.d.ts +11 -0
  56. package/dist/signals/highEntropyValues.d.ts.map +1 -0
  57. package/dist/signals/iframe.d.ts +9 -0
  58. package/dist/signals/iframe.d.ts.map +1 -0
  59. package/dist/signals/internationalization.d.ts +5 -0
  60. package/dist/signals/internationalization.d.ts.map +1 -0
  61. package/dist/signals/languages.d.ts +5 -0
  62. package/dist/signals/languages.d.ts.map +1 -0
  63. package/dist/signals/maths.d.ts +2 -0
  64. package/dist/signals/maths.d.ts.map +1 -0
  65. package/dist/signals/mediaCodecs.d.ts +11 -0
  66. package/dist/signals/mediaCodecs.d.ts.map +1 -0
  67. package/dist/signals/mediaQueries.d.ts +13 -0
  68. package/dist/signals/mediaQueries.d.ts.map +1 -0
  69. package/dist/signals/memory.d.ts +2 -0
  70. package/dist/signals/memory.d.ts.map +1 -0
  71. package/dist/signals/multimediaDevices.d.ts +2 -0
  72. package/dist/signals/multimediaDevices.d.ts.map +1 -0
  73. package/dist/signals/navigatorPropertyDescriptors.d.ts +2 -0
  74. package/dist/signals/navigatorPropertyDescriptors.d.ts.map +1 -0
  75. package/dist/signals/nonce.d.ts +2 -0
  76. package/dist/signals/nonce.d.ts.map +1 -0
  77. package/dist/signals/platform.d.ts +2 -0
  78. package/dist/signals/platform.d.ts.map +1 -0
  79. package/dist/signals/playwright.d.ts +2 -0
  80. package/dist/signals/playwright.d.ts.map +1 -0
  81. package/dist/signals/plugins.d.ts +9 -0
  82. package/dist/signals/plugins.d.ts.map +1 -0
  83. package/dist/signals/screenResolution.d.ts +12 -0
  84. package/dist/signals/screenResolution.d.ts.map +1 -0
  85. package/dist/signals/seleniumProperties.d.ts +2 -0
  86. package/dist/signals/seleniumProperties.d.ts.map +1 -0
  87. package/dist/signals/time.d.ts +2 -0
  88. package/dist/signals/time.d.ts.map +1 -0
  89. package/dist/signals/toSourceError.d.ts +5 -0
  90. package/dist/signals/toSourceError.d.ts.map +1 -0
  91. package/dist/signals/url.d.ts +2 -0
  92. package/dist/signals/url.d.ts.map +1 -0
  93. package/dist/signals/userAgent.d.ts +2 -0
  94. package/dist/signals/userAgent.d.ts.map +1 -0
  95. package/dist/signals/utils.d.ts +11 -0
  96. package/dist/signals/utils.d.ts.map +1 -0
  97. package/dist/signals/webGL.d.ts +5 -0
  98. package/dist/signals/webGL.d.ts.map +1 -0
  99. package/dist/signals/webdriver.d.ts +2 -0
  100. package/dist/signals/webdriver.d.ts.map +1 -0
  101. package/dist/signals/webdriverWritable.d.ts +2 -0
  102. package/dist/signals/webdriverWritable.d.ts.map +1 -0
  103. package/dist/signals/webgpu.d.ts +7 -0
  104. package/dist/signals/webgpu.d.ts.map +1 -0
  105. package/dist/signals/worker.d.ts +2 -0
  106. package/dist/signals/worker.d.ts.map +1 -0
  107. package/dist/types.d.ts +207 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/package.json +58 -15
  110. package/scripts/build-custom.js +246 -0
  111. package/src/crypto-helpers.ts +50 -0
  112. package/src/detections/hasCDP.ts +5 -0
  113. package/src/detections/hasContextMismatch.ts +19 -0
  114. package/src/detections/hasHeadlessChromeScreenResolution.ts +10 -0
  115. package/src/detections/hasHighCPUCount.ts +9 -0
  116. package/src/detections/hasImpossibleDeviceMemory.ts +9 -0
  117. package/src/detections/hasMismatchPlatformIframe.ts +10 -0
  118. package/src/detections/hasMismatchPlatformWorker.ts +10 -0
  119. package/src/detections/hasMismatchWebGLInWorker.ts +13 -0
  120. package/src/detections/hasMissingChromeObject.ts +6 -0
  121. package/src/detections/hasPlaywright.ts +5 -0
  122. package/src/detections/hasSeleniumProperty.ts +5 -0
  123. package/src/detections/hasSwiftshaderRenderer.ts +5 -0
  124. package/src/detections/hasUTCTimezone.ts +5 -0
  125. package/src/detections/hasWebdriver.ts +5 -0
  126. package/src/detections/hasWebdriverIframe.ts +5 -0
  127. package/src/detections/hasWebdriverWorker.ts +5 -0
  128. package/src/detections/hasWebdriverWritable.ts +5 -0
  129. package/src/globals.d.ts +10 -0
  130. package/src/index.ts +644 -0
  131. package/src/signals/browserExtensions.ts +57 -0
  132. package/src/signals/browserFeatures.ts +24 -0
  133. package/src/signals/canvas.ts +84 -0
  134. package/src/signals/cdp.ts +18 -0
  135. package/src/signals/cpuCount.ts +5 -0
  136. package/src/signals/etsl.ts +3 -0
  137. package/src/signals/highEntropyValues.ts +48 -0
  138. package/src/signals/iframe.ts +34 -0
  139. package/src/signals/internationalization.ts +24 -0
  140. package/src/signals/languages.ts +6 -0
  141. package/src/signals/maths.ts +30 -0
  142. package/src/signals/mediaCodecs.ts +120 -0
  143. package/src/signals/mediaQueries.ts +85 -0
  144. package/src/signals/memory.ts +5 -0
  145. package/src/signals/multimediaDevices.ts +34 -0
  146. package/src/signals/navigatorPropertyDescriptors.ts +17 -0
  147. package/src/signals/nonce.ts +3 -0
  148. package/src/signals/platform.ts +3 -0
  149. package/src/signals/playwright.ts +3 -0
  150. package/src/signals/plugins.ts +70 -0
  151. package/src/signals/screenResolution.ts +15 -0
  152. package/src/signals/seleniumProperties.ts +40 -0
  153. package/src/signals/time.ts +3 -0
  154. package/src/signals/toSourceError.ts +27 -0
  155. package/src/signals/url.ts +3 -0
  156. package/src/signals/userAgent.ts +3 -0
  157. package/src/signals/utils.ts +29 -0
  158. package/src/signals/webGL.ts +28 -0
  159. package/src/signals/webdriver.ts +3 -0
  160. package/src/signals/webdriverWritable.ts +15 -0
  161. package/src/signals/webgpu.ts +28 -0
  162. package/src/signals/worker.ts +77 -0
  163. package/src/types.ts +237 -0
  164. package/.babelrc +0 -3
  165. package/.travis.yml +0 -17
  166. package/src/fpScanner.js +0 -222
  167. package/test/test.html +0 -11
  168. package/test/test.js +0 -116
@@ -0,0 +1,1066 @@
1
+ function te() {
2
+ return navigator.webdriver;
3
+ }
4
+ function re() {
5
+ return navigator.userAgent;
6
+ }
7
+ function ne() {
8
+ return navigator.platform;
9
+ }
10
+ const l = "ERROR", r = "INIT", s = "NA", p = "SKIPPED", g = "high", ie = "low", ae = "medium";
11
+ function d(t) {
12
+ let e = 0;
13
+ for (let n = 0, a = t.length; n < a; n++) {
14
+ let i = t.charCodeAt(n);
15
+ e = (e << 5) - e + i, e |= 0;
16
+ }
17
+ return e.toString(16).padStart(8, "0");
18
+ }
19
+ function h(t, e) {
20
+ for (const n in t)
21
+ t[n] = e;
22
+ }
23
+ function oe() {
24
+ return navigator.buildID === "20181001000000";
25
+ }
26
+ function se() {
27
+ try {
28
+ let t = !1;
29
+ const e = Error.prepareStackTrace;
30
+ Error.prepareStackTrace = function() {
31
+ return t = !0, e;
32
+ };
33
+ const n = new Error("");
34
+ return console.log(n), t;
35
+ } catch {
36
+ return l;
37
+ }
38
+ }
39
+ function ce() {
40
+ const t = {
41
+ vendor: r,
42
+ renderer: r
43
+ };
44
+ if (oe())
45
+ return h(t, s), t;
46
+ try {
47
+ var e = document.createElement("canvas"), n = e.getContext("webgl") || e.getContext("experimental-webgl");
48
+ n.getSupportedExtensions().indexOf("WEBGL_debug_renderer_info") >= 0 ? (t.vendor = n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_VENDOR_WEBGL), t.renderer = n.getParameter(n.getExtension("WEBGL_debug_renderer_info").UNMASKED_RENDERER_WEBGL)) : h(t, s);
49
+ } catch {
50
+ h(t, l);
51
+ }
52
+ return t;
53
+ }
54
+ function le() {
55
+ return "__pwInitScripts" in window || "__playwright__binding__" in window;
56
+ }
57
+ function ue() {
58
+ return navigator.hardwareConcurrency || s;
59
+ }
60
+ function de() {
61
+ const t = [], e = 0.123456789;
62
+ return ["E", "LN10", "LN2", "LOG10E", "LOG2E", "PI", "SQRT1_2", "SQRT2"].forEach(function(i) {
63
+ try {
64
+ t.push(Math[i]);
65
+ } catch {
66
+ t.push(-1);
67
+ }
68
+ }), ["tan", "sin", "exp", "atan", "acosh", "asinh", "atanh", "expm1", "log1p", "sinh"].forEach(function(i) {
69
+ try {
70
+ t.push(Math[i](e));
71
+ } catch {
72
+ t.push(-1);
73
+ }
74
+ }), d(t.map(String).join(","));
75
+ }
76
+ function he() {
77
+ return navigator.deviceMemory || s;
78
+ }
79
+ function ge() {
80
+ return eval.toString().length;
81
+ }
82
+ function me() {
83
+ const t = {
84
+ timezone: r,
85
+ localeLanguage: r
86
+ };
87
+ try {
88
+ if (typeof Intl < "u" && typeof Intl.DateTimeFormat < "u") {
89
+ const e = Intl.DateTimeFormat().resolvedOptions();
90
+ t.timezone = e.timeZone, t.localeLanguage = e.locale;
91
+ } else
92
+ t.timezone = s, t.localeLanguage = s;
93
+ } catch {
94
+ t.timezone = l, t.localeLanguage = l;
95
+ }
96
+ return t;
97
+ }
98
+ function pe() {
99
+ return {
100
+ width: window.screen.width,
101
+ height: window.screen.height,
102
+ pixelDepth: window.screen.pixelDepth,
103
+ colorDepth: window.screen.colorDepth,
104
+ availableWidth: window.screen.availWidth,
105
+ availableHeight: window.screen.availHeight,
106
+ innerWidth: window.innerWidth,
107
+ innerHeight: window.innerHeight,
108
+ hasMultipleDisplays: typeof screen.isExtended < "u" ? screen.isExtended : s
109
+ };
110
+ }
111
+ function fe() {
112
+ return {
113
+ languages: navigator.languages,
114
+ language: navigator.language
115
+ };
116
+ }
117
+ async function ve() {
118
+ const t = {
119
+ vendor: r,
120
+ architecture: r,
121
+ device: r,
122
+ description: r
123
+ };
124
+ if ("gpu" in navigator)
125
+ try {
126
+ const e = await navigator.gpu.requestAdapter();
127
+ e && (t.vendor = e.info.vendor, t.architecture = e.info.architecture, t.device = e.info.device, t.description = e.info.description);
128
+ } catch {
129
+ h(t, l);
130
+ }
131
+ else
132
+ h(t, s);
133
+ return t;
134
+ }
135
+ function ye() {
136
+ const t = [
137
+ "__driver_evaluate",
138
+ "__webdriver_evaluate",
139
+ "__selenium_evaluate",
140
+ "__fxdriver_evaluate",
141
+ "__driver_unwrapped",
142
+ "__webdriver_unwrapped",
143
+ "__selenium_unwrapped",
144
+ "__fxdriver_unwrapped",
145
+ "_Selenium_IDE_Recorder",
146
+ "_selenium",
147
+ "calledSelenium",
148
+ "$cdc_asdjflasutopfhvcZLmcfl_",
149
+ "$chrome_asyncScriptInfo",
150
+ "__$webdriverAsyncExecutor",
151
+ "webdriver",
152
+ "__webdriverFunc",
153
+ "domAutomation",
154
+ "domAutomationController",
155
+ "__lastWatirAlert",
156
+ "__lastWatirConfirm",
157
+ "__lastWatirPrompt",
158
+ "__webdriver_script_fn",
159
+ "_WEBDRIVER_ELEM_CACHE"
160
+ ];
161
+ let e = !1;
162
+ for (let n = 0; n < t.length; n++)
163
+ if (t[n] in window) {
164
+ e = !0;
165
+ break;
166
+ }
167
+ return e = e || !!document.__webdriver_script_fn || !!window.domAutomation || !!window.domAutomationController, e;
168
+ }
169
+ function we() {
170
+ try {
171
+ const t = "webdriver", e = window.navigator;
172
+ if (!e[t] && !e.hasOwnProperty(t)) {
173
+ e[t] = 1;
174
+ const n = e[t] === 1;
175
+ return delete e[t], n;
176
+ }
177
+ return !0;
178
+ } catch {
179
+ return !1;
180
+ }
181
+ }
182
+ async function be() {
183
+ const t = window.navigator, e = {
184
+ architecture: r,
185
+ bitness: r,
186
+ brands: r,
187
+ mobile: r,
188
+ model: r,
189
+ platform: r,
190
+ platformVersion: r,
191
+ uaFullVersion: r
192
+ };
193
+ if ("userAgentData" in t)
194
+ try {
195
+ const n = await t.userAgentData.getHighEntropyValues([
196
+ "architecture",
197
+ "bitness",
198
+ "brands",
199
+ "mobile",
200
+ "model",
201
+ "platform",
202
+ "platformVersion",
203
+ "uaFullVersion"
204
+ ]);
205
+ e.architecture = n.architecture, e.bitness = n.bitness, e.brands = n.brands, e.mobile = n.mobile, e.model = n.model, e.platform = n.platform, e.platformVersion = n.platformVersion, e.uaFullVersion = n.uaFullVersion;
206
+ } catch {
207
+ h(e, l);
208
+ }
209
+ else
210
+ h(e, s);
211
+ return e;
212
+ }
213
+ function Se() {
214
+ if (!navigator.plugins) return !1;
215
+ const t = typeof navigator.plugins.toString == "function" ? navigator.plugins.toString() : navigator.plugins.constructor && typeof navigator.plugins.constructor.toString == "function" ? navigator.plugins.constructor.toString() : typeof navigator.plugins;
216
+ return t === "[object PluginArray]" || t === "[object MSPluginsCollection]" || t === "[object HTMLPluginsCollection]";
217
+ }
218
+ function Ce() {
219
+ if (!navigator.plugins) return s;
220
+ const t = [];
221
+ for (let e = 0; e < navigator.plugins.length; e++)
222
+ t.push(navigator.plugins[e].name);
223
+ return d(t.join(","));
224
+ }
225
+ function We() {
226
+ return navigator.plugins ? navigator.plugins.length : s;
227
+ }
228
+ function ke() {
229
+ if (!navigator.plugins) return s;
230
+ try {
231
+ return navigator.plugins[0] === navigator.plugins[0][0].enabledPlugin;
232
+ } catch {
233
+ return l;
234
+ }
235
+ }
236
+ function Ee() {
237
+ if (!navigator.plugins) return s;
238
+ try {
239
+ return navigator.plugins.item(4294967296) !== navigator.plugins[0];
240
+ } catch {
241
+ return l;
242
+ }
243
+ }
244
+ function Ae() {
245
+ const t = {
246
+ isValidPluginArray: r,
247
+ pluginCount: r,
248
+ pluginNamesHash: r,
249
+ pluginConsistency1: r,
250
+ pluginOverflow: r
251
+ };
252
+ try {
253
+ t.isValidPluginArray = Se(), t.pluginCount = We(), t.pluginNamesHash = Ce(), t.pluginConsistency1 = ke(), t.pluginOverflow = Ee();
254
+ } catch {
255
+ h(t, l);
256
+ }
257
+ return t;
258
+ }
259
+ async function xe() {
260
+ return new Promise(async function(t) {
261
+ var e = {
262
+ audiooutput: 0,
263
+ audioinput: 0,
264
+ videoinput: 0
265
+ };
266
+ if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
267
+ const i = await navigator.mediaDevices.enumerateDevices();
268
+ if (typeof i < "u") {
269
+ for (var n = 0; n < i.length; n++) {
270
+ var a = i[n].kind;
271
+ e[a] = e[a] + 1;
272
+ }
273
+ return t({
274
+ speakers: e.audiooutput,
275
+ microphones: e.audioinput,
276
+ webcams: e.videoinput
277
+ });
278
+ } else
279
+ return h(e, s), t(e);
280
+ } else
281
+ return h(e, s), t(e);
282
+ });
283
+ }
284
+ function Pe() {
285
+ const t = {
286
+ webdriver: r,
287
+ userAgent: r,
288
+ platform: r,
289
+ memory: r,
290
+ cpuCount: r,
291
+ language: r
292
+ }, e = document.createElement("iframe");
293
+ try {
294
+ e.style.display = "none", e.src = "about:blank", document.body.appendChild(e);
295
+ const n = e.contentWindow?.navigator;
296
+ t.webdriver = n.webdriver ?? !1, t.userAgent = n.userAgent ?? s, t.platform = n.platform ?? s, t.memory = n.deviceMemory ?? s, t.cpuCount = n.hardwareConcurrency ?? s, t.language = n.language ?? s;
297
+ } catch {
298
+ h(t, l);
299
+ } finally {
300
+ document.body.removeChild(e);
301
+ }
302
+ return t;
303
+ }
304
+ async function De() {
305
+ return new Promise((t) => {
306
+ const e = {
307
+ vendor: r,
308
+ renderer: r,
309
+ userAgent: r,
310
+ language: r,
311
+ platform: r,
312
+ memory: r,
313
+ cpuCount: r
314
+ };
315
+ try {
316
+ const n = `try {
317
+ var fingerprintWorker = {};
318
+
319
+ fingerprintWorker.userAgent = navigator.userAgent;
320
+ fingerprintWorker.language = navigator.language;
321
+ fingerprintWorker.cpuCount = navigator.hardwareConcurrency;
322
+ fingerprintWorker.platform = navigator.platform;
323
+ fingerprintWorker.memory = navigator.deviceMemory;
324
+
325
+
326
+ var canvas = new OffscreenCanvas(1, 1);
327
+ fingerprintWorker.vendor = 'INIT';
328
+ fingerprintWorker.renderer = 'INIT';
329
+ var gl = canvas.getContext('webgl');
330
+ try {
331
+ if (gl) {
332
+ var glExt = gl.getExtension('WEBGL_debug_renderer_info');
333
+ fingerprintWorker.vendor = gl.getParameter(glExt.UNMASKED_VENDOR_WEBGL);
334
+ fingerprintWorker.renderer = gl.getParameter(glExt.UNMASKED_RENDERER_WEBGL);
335
+ } else {
336
+ fingerprintWorker.vendor = 'NA';
337
+ fingerprintWorker.renderer = 'NA';
338
+ }
339
+ } catch (_) {
340
+ fingerprintWorker.vendor = 'ERROR';
341
+ fingerprintWorker.renderer = 'ERROR';
342
+ }
343
+ self.postMessage(fingerprintWorker);
344
+ } catch (e) {
345
+ self.postMessage(fingerprintWorker);
346
+ }`, a = new Blob([n], { type: "application/javascript" }), i = URL.createObjectURL(a), m = new Worker(i);
347
+ m.onmessage = function(u) {
348
+ try {
349
+ return e.vendor = u.data.vendor, e.renderer = u.data.renderer, e.userAgent = u.data.userAgent, e.language = u.data.language, e.platform = u.data.platform, e.memory = u.data.memory, e.cpuCount = u.data.cpuCount, t(e);
350
+ } catch {
351
+ return h(e, l), t(e);
352
+ }
353
+ };
354
+ } catch {
355
+ return h(e, l), t(e);
356
+ }
357
+ });
358
+ }
359
+ function Me() {
360
+ const t = {
361
+ toSourceError: r,
362
+ hasToSource: !1
363
+ };
364
+ try {
365
+ null.usdfsh;
366
+ } catch (e) {
367
+ t.toSourceError = e.toString();
368
+ }
369
+ try {
370
+ throw "xyz";
371
+ } catch (e) {
372
+ try {
373
+ e.toSource(), t.hasToSource = !0;
374
+ } catch {
375
+ t.hasToSource = !1;
376
+ }
377
+ }
378
+ return t;
379
+ }
380
+ const w = [
381
+ 'audio/mp4; codecs="mp4a.40.2"',
382
+ "audio/mpeg;",
383
+ 'audio/webm; codecs="vorbis"',
384
+ 'audio/ogg; codecs="vorbis"',
385
+ 'audio/wav; codecs="1"',
386
+ 'audio/ogg; codecs="speex"',
387
+ 'audio/ogg; codecs="flac"',
388
+ 'audio/3gpp; codecs="samr"'
389
+ ], b = [
390
+ 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
391
+ 'video/mp4; codecs="avc1.42E01E"',
392
+ 'video/mp4; codecs="avc1.58A01E"',
393
+ 'video/mp4; codecs="avc1.4D401E"',
394
+ 'video/mp4; codecs="avc1.64001E"',
395
+ 'video/mp4; codecs="mp4v.20.8"',
396
+ 'video/mp4; codecs="mp4v.20.240"',
397
+ 'video/webm; codecs="vp8"',
398
+ 'video/ogg; codecs="theora"',
399
+ 'video/ogg; codecs="dirac"',
400
+ 'video/3gpp; codecs="mp4v.20.8"',
401
+ 'video/x-matroska; codecs="theora"'
402
+ ];
403
+ function S(t, e) {
404
+ const n = {};
405
+ try {
406
+ const a = document.createElement(e);
407
+ for (const i of t)
408
+ try {
409
+ n[i] = a.canPlayType(i) || null;
410
+ } catch {
411
+ n[i] = null;
412
+ }
413
+ } catch {
414
+ for (const a of t)
415
+ n[a] = null;
416
+ }
417
+ return n;
418
+ }
419
+ function C(t) {
420
+ const e = {}, n = window.MediaSource;
421
+ if (!n || typeof n.isTypeSupported != "function") {
422
+ for (const a of t)
423
+ e[a] = null;
424
+ return e;
425
+ }
426
+ for (const a of t)
427
+ try {
428
+ e[a] = n.isTypeSupported(a);
429
+ } catch {
430
+ e[a] = null;
431
+ }
432
+ return e;
433
+ }
434
+ function W(t) {
435
+ try {
436
+ const e = window.RTCRtpReceiver;
437
+ if (e && typeof e.getCapabilities == "function") {
438
+ const n = e.getCapabilities(t);
439
+ return d(JSON.stringify(n));
440
+ }
441
+ return s;
442
+ } catch {
443
+ return l;
444
+ }
445
+ }
446
+ function _e() {
447
+ const t = {
448
+ audioCanPlayTypeHash: s,
449
+ videoCanPlayTypeHash: s,
450
+ audioMediaSourceHash: s,
451
+ videoMediaSourceHash: s,
452
+ rtcAudioCapabilitiesHash: s,
453
+ rtcVideoCapabilitiesHash: s,
454
+ hasMediaSource: !1
455
+ };
456
+ try {
457
+ t.hasMediaSource = !!window.MediaSource;
458
+ const e = S(w, "audio"), n = S(b, "video");
459
+ t.audioCanPlayTypeHash = d(JSON.stringify(e)), t.videoCanPlayTypeHash = d(JSON.stringify(n));
460
+ const a = C(w), i = C(b);
461
+ t.audioMediaSourceHash = d(JSON.stringify(a)), t.videoMediaSourceHash = d(JSON.stringify(i)), t.rtcAudioCapabilitiesHash = W("audio"), t.rtcVideoCapabilitiesHash = W("video");
462
+ } catch {
463
+ h(t, l);
464
+ }
465
+ return t;
466
+ }
467
+ async function Re() {
468
+ return new Promise((t) => {
469
+ try {
470
+ const e = new Image(), n = document.createElement("canvas").getContext("2d");
471
+ e.onload = () => {
472
+ n.drawImage(e, 0, 0), t(n.getImageData(0, 0, 1, 1).data.filter((a) => a === 0).length != 4);
473
+ }, e.onerror = () => {
474
+ t(l);
475
+ }, e.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=";
476
+ } catch {
477
+ t(l);
478
+ }
479
+ });
480
+ }
481
+ function Ie() {
482
+ var t = document.createElement("canvas");
483
+ t.width = 400, t.height = 200, t.style.display = "inline";
484
+ var e = t.getContext("2d");
485
+ try {
486
+ return e.rect(0, 0, 10, 10), e.rect(2, 2, 6, 6), e.textBaseline = "alphabetic", e.fillStyle = "#f60", e.fillRect(125, 1, 62, 20), e.fillStyle = "#069", e.font = "11pt no-real-font-123", e.fillText("Cwm fjordbank glyphs vext quiz, 😃", 2, 15), e.fillStyle = "rgba(102, 204, 0, 0.2)", e.font = "18pt Arial", e.fillText("Cwm fjordbank glyphs vext quiz, 😃", 4, 45), e.globalCompositeOperation = "multiply", e.fillStyle = "rgb(255,0,255)", e.beginPath(), e.arc(50, 50, 50, 0, 2 * Math.PI, !0), e.closePath(), e.fill(), e.fillStyle = "rgb(0,255,255)", e.beginPath(), e.arc(100, 50, 50, 0, 2 * Math.PI, !0), e.closePath(), e.fill(), e.fillStyle = "rgb(255,255,0)", e.beginPath(), e.arc(75, 100, 50, 0, 2 * Math.PI, !0), e.closePath(), e.fill(), e.fillStyle = "rgb(255,0,255)", e.arc(75, 75, 75, 0, 2 * Math.PI, !0), e.arc(75, 75, 25, 0, 2 * Math.PI, !0), e.fill("evenodd"), d(t.toDataURL());
487
+ } catch {
488
+ return l;
489
+ }
490
+ }
491
+ async function Te() {
492
+ const t = {
493
+ hasModifiedCanvas: r,
494
+ canvasFingerprint: r
495
+ };
496
+ return t.hasModifiedCanvas = await Re(), t.canvasFingerprint = Ie(), t;
497
+ }
498
+ function He() {
499
+ const t = ["deviceMemory", "hardwareConcurrency", "language", "languages", "platform"], e = [];
500
+ for (const n of t) {
501
+ const a = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator), n);
502
+ a && a.value ? e.push("1") : e.push("0");
503
+ }
504
+ return e.join("");
505
+ }
506
+ function Oe() {
507
+ return Math.random().toString(36).substring(2, 15);
508
+ }
509
+ function Le() {
510
+ return (/* @__PURE__ */ new Date()).getTime();
511
+ }
512
+ function Ve() {
513
+ return window.location.href;
514
+ }
515
+ function k(t, e) {
516
+ const n = t.signals;
517
+ return e === "iframe" ? n.contexts.iframe.webdriver !== n.automation.webdriver || n.contexts.iframe.userAgent !== n.browser.userAgent || n.contexts.iframe.platform !== n.device.platform || n.contexts.iframe.memory !== n.device.memory || n.contexts.iframe.cpuCount !== n.device.cpuCount : n.contexts.webWorker.webdriver !== n.automation.webdriver || n.contexts.webWorker.userAgent !== n.browser.userAgent || n.contexts.webWorker.platform !== n.device.platform || n.contexts.webWorker.memory !== n.device.memory || n.contexts.webWorker.cpuCount !== n.device.cpuCount;
518
+ }
519
+ function je() {
520
+ const t = {
521
+ bitmask: r,
522
+ extensions: []
523
+ }, e = document.body.hasAttribute("data-gr-ext-installed"), n = typeof window.ethereum < "u", a = document.getElementById("coupon-birds-drop-div") !== null, i = document.querySelector("deepl-input-controller") !== null, m = document.getElementById("monica-content-root") !== null, u = document.querySelector("chatgpt-sidebar") !== null, v = typeof window.__REQUESTLY__ < "u", o = Array.from(document.querySelectorAll("*")).filter((f) => f.tagName.toLowerCase().startsWith("veepn-")).length > 0;
524
+ return t.bitmask = [
525
+ e ? "1" : "0",
526
+ n ? "1" : "0",
527
+ a ? "1" : "0",
528
+ i ? "1" : "0",
529
+ m ? "1" : "0",
530
+ u ? "1" : "0",
531
+ v ? "1" : "0",
532
+ o ? "1" : "0"
533
+ ].join(""), e && t.extensions.push("grammarly"), n && t.extensions.push("metamask"), a && t.extensions.push("coupon-birds"), i && t.extensions.push("deepl"), m && t.extensions.push("monica-ai"), u && t.extensions.push("sider-ai"), v && t.extensions.push("requestly"), o && t.extensions.push("veepn"), t;
534
+ }
535
+ function Ge() {
536
+ const t = {
537
+ bitmask: r,
538
+ chrome: "chrome" in window,
539
+ brave: "brave" in navigator,
540
+ applePaySupport: "ApplePaySetup" in window,
541
+ opera: typeof window.opr < "u" || typeof window.onoperadetachedviewchange == "object",
542
+ serial: window.navigator.serial !== void 0,
543
+ attachShadow: !!Element.prototype.attachShadow,
544
+ caches: !!window.caches,
545
+ webAssembly: !!window.WebAssembly && !!window.WebAssembly.instantiate,
546
+ buffer: "Buffer" in window,
547
+ showModalDialog: "showModalDialog" in window
548
+ }, e = Object.keys(t).filter((n) => n !== "bitmask").map((n) => t[n] ? "1" : "0").join("");
549
+ return t.bitmask = e, t;
550
+ }
551
+ function Ne() {
552
+ const t = {
553
+ prefersColorScheme: r,
554
+ prefersReducedMotion: r,
555
+ prefersReducedTransparency: r,
556
+ colorGamut: r,
557
+ pointer: r,
558
+ anyPointer: r,
559
+ hover: r,
560
+ anyHover: r,
561
+ colorDepth: r
562
+ };
563
+ try {
564
+ window.matchMedia("(prefers-color-scheme: dark)").matches ? t.prefersColorScheme = "dark" : window.matchMedia("(prefers-color-scheme: light)").matches ? t.prefersColorScheme = "light" : t.prefersColorScheme = null, t.prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches, t.prefersReducedTransparency = window.matchMedia("(prefers-reduced-transparency: reduce)").matches, window.matchMedia("(color-gamut: rec2020)").matches ? t.colorGamut = "rec2020" : window.matchMedia("(color-gamut: p3)").matches ? t.colorGamut = "p3" : window.matchMedia("(color-gamut: srgb)").matches ? t.colorGamut = "srgb" : t.colorGamut = null, window.matchMedia("(pointer: fine)").matches ? t.pointer = "fine" : window.matchMedia("(pointer: coarse)").matches ? t.pointer = "coarse" : window.matchMedia("(pointer: none)").matches ? t.pointer = "none" : t.pointer = null, window.matchMedia("(any-pointer: fine)").matches ? t.anyPointer = "fine" : window.matchMedia("(any-pointer: coarse)").matches ? t.anyPointer = "coarse" : window.matchMedia("(any-pointer: none)").matches ? t.anyPointer = "none" : t.anyPointer = null, t.hover = window.matchMedia("(hover: hover)").matches, t.anyHover = window.matchMedia("(any-hover: hover)").matches;
565
+ let e = 0;
566
+ for (let n = 0; n <= 16; n++)
567
+ window.matchMedia(`(color: ${n})`).matches && (e = n);
568
+ t.colorDepth = e;
569
+ } catch {
570
+ h(t, l);
571
+ }
572
+ return t;
573
+ }
574
+ function Be(t) {
575
+ const e = t.signals.device.screenResolution;
576
+ return typeof e.width != "number" || typeof e.height != "number" ? !1 : e.width === 600 && e.height === 800 || e.availableWidth === 600 && e.availableHeight === 800 || e.innerWidth === 600 && e.innerHeight === 800;
577
+ }
578
+ function Fe(t) {
579
+ return t.signals.automation.webdriver === !0;
580
+ }
581
+ function ze(t) {
582
+ return !!t.signals.automation.selenium;
583
+ }
584
+ function Ue(t) {
585
+ return t.signals.automation.cdp === !0;
586
+ }
587
+ function $e(t) {
588
+ return t.signals.automation.playwright === !0;
589
+ }
590
+ function Qe(t) {
591
+ return typeof t.signals.device.memory != "number" ? !1 : t.signals.device.memory > 8 || t.signals.device.memory < 0.25;
592
+ }
593
+ function Ke(t) {
594
+ return typeof t.signals.device.cpuCount != "number" ? !1 : t.signals.device.cpuCount > 70;
595
+ }
596
+ function qe(t) {
597
+ const e = t.signals.browser.userAgent;
598
+ return t.signals.browser.features.chrome === !1 && typeof e == "string" && e.includes("Chrome");
599
+ }
600
+ function Je(t) {
601
+ return t.signals.contexts.iframe.webdriver === !0;
602
+ }
603
+ function Ye(t) {
604
+ return t.signals.contexts.webWorker.webdriver === !0;
605
+ }
606
+ function Ze(t) {
607
+ const e = t.signals.contexts.webWorker, n = t.signals.graphics.webGL;
608
+ return e.vendor === l || e.renderer === l || n.vendor === s || n.renderer === s || e.vendor === p ? !1 : e.vendor !== n.vendor || e.renderer !== n.renderer;
609
+ }
610
+ function Xe(t) {
611
+ return t.signals.contexts.webWorker.platform === s || t.signals.contexts.webWorker.platform === l || t.signals.contexts.webWorker.platform === p ? !1 : t.signals.device.platform !== t.signals.contexts.webWorker.platform;
612
+ }
613
+ function et(t) {
614
+ return t.signals.contexts.iframe.platform === s || t.signals.contexts.iframe.platform === l ? !1 : t.signals.device.platform !== t.signals.contexts.iframe.platform;
615
+ }
616
+ function tt(t) {
617
+ return t.signals.automation.webdriverWritable === !0;
618
+ }
619
+ function rt(t) {
620
+ return t.signals.graphics.webGL.renderer.includes("SwiftShader");
621
+ }
622
+ function nt(t) {
623
+ return t.signals.locale.internationalization.timezone === "UTC";
624
+ }
625
+ async function it(t, e) {
626
+ const n = new TextEncoder().encode(e), a = new TextEncoder().encode(t), i = new Uint8Array(a.length);
627
+ for (let u = 0; u < a.length; u++)
628
+ i[u] = a[u] ^ n[u % n.length];
629
+ const m = String.fromCharCode(...i);
630
+ return btoa(m);
631
+ }
632
+ class ot {
633
+ constructor() {
634
+ this.fingerprint = {
635
+ signals: {
636
+ // Automation/Bot detection signals
637
+ automation: {
638
+ webdriver: r,
639
+ webdriverWritable: r,
640
+ selenium: r,
641
+ cdp: r,
642
+ playwright: r,
643
+ navigatorPropertyDescriptors: r
644
+ },
645
+ // Device hardware characteristics
646
+ device: {
647
+ cpuCount: r,
648
+ memory: r,
649
+ platform: r,
650
+ screenResolution: {
651
+ width: r,
652
+ height: r,
653
+ pixelDepth: r,
654
+ colorDepth: r,
655
+ availableWidth: r,
656
+ availableHeight: r,
657
+ innerWidth: r,
658
+ innerHeight: r,
659
+ hasMultipleDisplays: r
660
+ },
661
+ multimediaDevices: {
662
+ speakers: r,
663
+ microphones: r,
664
+ webcams: r
665
+ },
666
+ mediaQueries: {
667
+ prefersColorScheme: r,
668
+ prefersReducedMotion: r,
669
+ prefersReducedTransparency: r,
670
+ colorGamut: r,
671
+ pointer: r,
672
+ anyPointer: r,
673
+ hover: r,
674
+ anyHover: r,
675
+ colorDepth: r
676
+ }
677
+ },
678
+ // Browser identity & features
679
+ browser: {
680
+ userAgent: r,
681
+ features: {
682
+ bitmask: r,
683
+ chrome: r,
684
+ brave: r,
685
+ applePaySupport: r,
686
+ opera: r,
687
+ serial: r,
688
+ attachShadow: r,
689
+ caches: r,
690
+ webAssembly: r,
691
+ buffer: r,
692
+ showModalDialog: r
693
+ },
694
+ plugins: {
695
+ isValidPluginArray: r,
696
+ pluginCount: r,
697
+ pluginNamesHash: r,
698
+ pluginConsistency1: r,
699
+ pluginOverflow: r
700
+ },
701
+ extensions: {
702
+ bitmask: r,
703
+ extensions: r
704
+ },
705
+ highEntropyValues: {
706
+ architecture: r,
707
+ bitness: r,
708
+ brands: r,
709
+ mobile: r,
710
+ model: r,
711
+ platform: r,
712
+ platformVersion: r,
713
+ uaFullVersion: r
714
+ },
715
+ etsl: r,
716
+ maths: r,
717
+ toSourceError: {
718
+ toSourceError: r,
719
+ hasToSource: r
720
+ }
721
+ },
722
+ // Graphics & rendering
723
+ graphics: {
724
+ webGL: {
725
+ vendor: r,
726
+ renderer: r
727
+ },
728
+ webgpu: {
729
+ vendor: r,
730
+ architecture: r,
731
+ device: r,
732
+ description: r
733
+ },
734
+ canvas: {
735
+ hasModifiedCanvas: r,
736
+ canvasFingerprint: r
737
+ }
738
+ },
739
+ // Media codecs (at root level)
740
+ codecs: {
741
+ audioCanPlayTypeHash: r,
742
+ videoCanPlayTypeHash: r,
743
+ audioMediaSourceHash: r,
744
+ videoMediaSourceHash: r,
745
+ rtcAudioCapabilitiesHash: r,
746
+ rtcVideoCapabilitiesHash: r,
747
+ hasMediaSource: r
748
+ },
749
+ // Locale & internationalization
750
+ locale: {
751
+ internationalization: {
752
+ timezone: r,
753
+ localeLanguage: r
754
+ },
755
+ languages: {
756
+ languages: r,
757
+ language: r
758
+ }
759
+ },
760
+ // Isolated execution contexts
761
+ contexts: {
762
+ iframe: {
763
+ webdriver: r,
764
+ userAgent: r,
765
+ platform: r,
766
+ memory: r,
767
+ cpuCount: r,
768
+ language: r
769
+ },
770
+ webWorker: {
771
+ webdriver: r,
772
+ userAgent: r,
773
+ platform: r,
774
+ memory: r,
775
+ cpuCount: r,
776
+ language: r,
777
+ vendor: r,
778
+ renderer: r
779
+ }
780
+ }
781
+ },
782
+ fsid: r,
783
+ nonce: r,
784
+ time: r,
785
+ url: r,
786
+ fastBotDetection: !1,
787
+ fastBotDetectionDetails: {
788
+ headlessChromeScreenResolution: { detected: !1, severity: "high" },
789
+ hasWebdriver: { detected: !1, severity: "high" },
790
+ hasWebdriverWritable: { detected: !1, severity: "high" },
791
+ hasSeleniumProperty: { detected: !1, severity: "high" },
792
+ hasCDP: { detected: !1, severity: "high" },
793
+ hasPlaywright: { detected: !1, severity: "high" },
794
+ hasImpossibleDeviceMemory: { detected: !1, severity: "high" },
795
+ hasHighCPUCount: { detected: !1, severity: "high" },
796
+ hasMissingChromeObject: { detected: !1, severity: "high" },
797
+ hasWebdriverIframe: { detected: !1, severity: "high" },
798
+ hasWebdriverWorker: { detected: !1, severity: "high" },
799
+ hasMismatchWebGLInWorker: { detected: !1, severity: "high" },
800
+ hasMismatchPlatformIframe: { detected: !1, severity: "high" },
801
+ hasMismatchPlatformWorker: { detected: !1, severity: "high" },
802
+ hasSwiftshaderRenderer: { detected: !1, severity: "low" },
803
+ hasUTCTimezone: { detected: !1, severity: "medium" }
804
+ }
805
+ };
806
+ }
807
+ async collectSignal(e) {
808
+ try {
809
+ return await e();
810
+ } catch {
811
+ return l;
812
+ }
813
+ }
814
+ /**
815
+ * Generate a JA4-inspired fingerprint scanner ID
816
+ * Format: FS1_<det>_<auto>_<dev>_<brw>_<gfx>_<cod>_<loc>_<ctx>
817
+ *
818
+ * Each section is delimited by '_', allowing partial matching.
819
+ * Sections use the pattern: <bitmask>h<hash> where applicable.
820
+ * Bitmasks are extensible - new boolean fields are appended without breaking existing positions.
821
+ *
822
+ * Sections:
823
+ * - det: fastBotDetectionDetails bitmask (14 bits: headlessChromeScreenResolution, hasWebdriver,
824
+ * hasWebdriverWritable, hasSeleniumProperty, hasCDP, hasPlaywright, hasImpossibleDeviceMemory,
825
+ * hasHighCPUCount, hasMissingChromeObject, hasWebdriverIframe, hasWebdriverWorker,
826
+ * hasMismatchWebGLInWorker, hasMismatchPlatformIframe, hasMismatchPlatformWorker)
827
+ * - auto: automation bitmask (5 bits: webdriver, webdriverWritable, selenium, cdp, playwright) + hash
828
+ * - dev: WIDTHxHEIGHT + cpu + mem + device bitmask + hash of all device signals
829
+ * - brw: features.bitmask + extensions.bitmask + plugins bitmask (3 bits) + hash of browser signals
830
+ * - gfx: canvas bitmask (1 bit: hasModifiedCanvas) + hash of all graphics signals
831
+ * - cod: codecs bitmask (1 bit: hasMediaSource) + hash of all codec hashes
832
+ * - loc: language code (2 chars) + language count + hash of locale signals
833
+ * - ctx: context mismatch bitmask (2 bits: iframe, worker) + hash of all context signals
834
+ */
835
+ generateFingerprintScannerId() {
836
+ try {
837
+ const e = this.fingerprint.signals, n = this.fingerprint.fastBotDetectionDetails, a = "FS1", m = [
838
+ n.headlessChromeScreenResolution.detected,
839
+ n.hasWebdriver.detected,
840
+ n.hasWebdriverWritable.detected,
841
+ n.hasSeleniumProperty.detected,
842
+ n.hasCDP.detected,
843
+ n.hasPlaywright.detected,
844
+ n.hasImpossibleDeviceMemory.detected,
845
+ n.hasHighCPUCount.detected,
846
+ n.hasMissingChromeObject.detected,
847
+ n.hasWebdriverIframe.detected,
848
+ n.hasWebdriverWorker.detected,
849
+ n.hasMismatchWebGLInWorker.detected,
850
+ n.hasMismatchPlatformIframe.detected,
851
+ n.hasMismatchPlatformWorker.detected,
852
+ n.hasSwiftshaderRenderer.detected,
853
+ n.hasUTCTimezone.detected
854
+ // Add other detection rules output here
855
+ ].map((c) => c ? "1" : "0").join(""), u = [
856
+ e.automation.webdriver === !0,
857
+ e.automation.webdriverWritable === !0,
858
+ e.automation.selenium === !0,
859
+ e.automation.cdp === !0,
860
+ e.automation.playwright === !0
861
+ ].map((c) => c ? "1" : "0").join(""), v = d(String(e.automation.navigatorPropertyDescriptors)).slice(0, 4), o = `${u}h${v}`, f = typeof e.device.screenResolution.width == "number" ? e.device.screenResolution.width : 0, y = typeof e.device.screenResolution.height == "number" ? e.device.screenResolution.height : 0, E = typeof e.device.cpuCount == "number" ? String(e.device.cpuCount).padStart(2, "0") : "00", A = typeof e.device.memory == "number" ? String(Math.round(e.device.memory)).padStart(2, "0") : "00", x = [
862
+ e.device.screenResolution.hasMultipleDisplays === !0,
863
+ e.device.mediaQueries.prefersReducedMotion === !0,
864
+ e.device.mediaQueries.prefersReducedTransparency === !0,
865
+ e.device.mediaQueries.hover === !0,
866
+ e.device.mediaQueries.anyHover === !0
867
+ ].map((c) => c ? "1" : "0").join(""), P = [
868
+ e.device.platform,
869
+ e.device.screenResolution.pixelDepth,
870
+ e.device.screenResolution.colorDepth,
871
+ e.device.multimediaDevices.speakers,
872
+ e.device.multimediaDevices.microphones,
873
+ e.device.multimediaDevices.webcams,
874
+ e.device.mediaQueries.prefersColorScheme,
875
+ e.device.mediaQueries.colorGamut,
876
+ e.device.mediaQueries.pointer,
877
+ e.device.mediaQueries.anyPointer,
878
+ e.device.mediaQueries.colorDepth
879
+ ].map((c) => String(c)).join("|"), D = d(P).slice(0, 6), M = `${f}x${y}c${E}m${A}b${x}h${D}`, _ = typeof e.browser.features.bitmask == "string" ? e.browser.features.bitmask : "0000000000", R = typeof e.browser.extensions.bitmask == "string" ? e.browser.extensions.bitmask : "00000000", I = [
880
+ e.browser.plugins.isValidPluginArray === !0,
881
+ e.browser.plugins.pluginConsistency1 === !0,
882
+ e.browser.plugins.pluginOverflow === !0,
883
+ e.browser.toSourceError.hasToSource === !0
884
+ ].map((c) => c ? "1" : "0").join(""), T = [
885
+ e.browser.userAgent,
886
+ e.browser.etsl,
887
+ e.browser.maths,
888
+ e.browser.plugins.pluginCount,
889
+ e.browser.plugins.pluginNamesHash,
890
+ e.browser.toSourceError.toSourceError,
891
+ e.browser.highEntropyValues.architecture,
892
+ e.browser.highEntropyValues.bitness,
893
+ e.browser.highEntropyValues.platform,
894
+ e.browser.highEntropyValues.platformVersion,
895
+ e.browser.highEntropyValues.uaFullVersion,
896
+ e.browser.highEntropyValues.mobile
897
+ ].map((c) => String(c)).join("|"), H = d(T).slice(0, 6), O = `f${_}e${R}p${I}h${H}`, L = [
898
+ e.graphics.canvas.hasModifiedCanvas === !0
899
+ ].map((c) => c ? "1" : "0").join(""), V = [
900
+ e.graphics.webGL.vendor,
901
+ e.graphics.webGL.renderer,
902
+ e.graphics.webgpu.vendor,
903
+ e.graphics.webgpu.architecture,
904
+ e.graphics.webgpu.device,
905
+ e.graphics.webgpu.description,
906
+ e.graphics.canvas.canvasFingerprint
907
+ ].map((c) => String(c)).join("|"), j = d(V).slice(0, 6), G = `${L}h${j}`, N = [
908
+ e.codecs.hasMediaSource === !0
909
+ ].map((c) => c ? "1" : "0").join(""), B = [
910
+ e.codecs.audioCanPlayTypeHash,
911
+ e.codecs.videoCanPlayTypeHash,
912
+ e.codecs.audioMediaSourceHash,
913
+ e.codecs.videoMediaSourceHash,
914
+ e.codecs.rtcAudioCapabilitiesHash,
915
+ e.codecs.rtcVideoCapabilitiesHash
916
+ ].map((c) => String(c)).join("|"), F = d(B).slice(0, 6), z = `${N}h${F}`, U = typeof e.locale.languages.language == "string" ? e.locale.languages.language.slice(0, 2).toLowerCase() : "xx", $ = Array.isArray(e.locale.languages.languages) ? e.locale.languages.languages.length : 0, Q = (typeof e.locale.internationalization.timezone == "string" ? e.locale.internationalization.timezone : "unknown").replace(/[\/\s]/g, "-"), K = [
917
+ e.locale.internationalization.timezone,
918
+ e.locale.internationalization.localeLanguage,
919
+ Array.isArray(e.locale.languages.languages) ? e.locale.languages.languages.join(",") : e.locale.languages.languages,
920
+ e.locale.languages.language
921
+ ].map((c) => String(c)).join("|"), q = d(K).slice(0, 4), J = `${U}${$}t${Q}_h${q}`, Y = [
922
+ k(this.fingerprint, "iframe"),
923
+ k(this.fingerprint, "worker"),
924
+ e.contexts.iframe.webdriver === !0,
925
+ e.contexts.webWorker.webdriver === !0
926
+ ].map((c) => c ? "1" : "0").join(""), Z = [
927
+ e.contexts.iframe.userAgent,
928
+ e.contexts.iframe.platform,
929
+ e.contexts.iframe.memory,
930
+ e.contexts.iframe.cpuCount,
931
+ e.contexts.iframe.language,
932
+ e.contexts.webWorker.userAgent,
933
+ e.contexts.webWorker.platform,
934
+ e.contexts.webWorker.memory,
935
+ e.contexts.webWorker.cpuCount,
936
+ e.contexts.webWorker.language,
937
+ e.contexts.webWorker.vendor,
938
+ e.contexts.webWorker.renderer
939
+ ].map((c) => String(c)).join("|"), X = d(Z).slice(0, 6), ee = `${Y}h${X}`;
940
+ return [
941
+ a,
942
+ m,
943
+ o,
944
+ M,
945
+ O,
946
+ G,
947
+ z,
948
+ J,
949
+ ee
950
+ ].join("_");
951
+ } catch (e) {
952
+ return console.error("Error generating fingerprint scanner id", e), l;
953
+ }
954
+ }
955
+ async encryptFingerprint(e) {
956
+ return await it(JSON.stringify(e), "dev-key");
957
+ }
958
+ /**
959
+ * Detection rules with name and severity.
960
+ * All rules are currently HIGH severity as they indicate bot-like behavior.
961
+ */
962
+ getDetectionRules() {
963
+ return [
964
+ { name: "headlessChromeScreenResolution", severity: g, test: Be },
965
+ { name: "hasWebdriver", severity: g, test: Fe },
966
+ { name: "hasWebdriverWritable", severity: g, test: tt },
967
+ { name: "hasSeleniumProperty", severity: g, test: ze },
968
+ { name: "hasCDP", severity: g, test: Ue },
969
+ { name: "hasPlaywright", severity: g, test: $e },
970
+ { name: "hasImpossibleDeviceMemory", severity: g, test: Qe },
971
+ { name: "hasHighCPUCount", severity: g, test: Ke },
972
+ { name: "hasMissingChromeObject", severity: g, test: qe },
973
+ { name: "hasWebdriverIframe", severity: g, test: Je },
974
+ { name: "hasWebdriverWorker", severity: g, test: Ye },
975
+ { name: "hasMismatchWebGLInWorker", severity: g, test: Ze },
976
+ { name: "hasMismatchPlatformIframe", severity: g, test: et },
977
+ { name: "hasMismatchPlatformWorker", severity: g, test: Xe },
978
+ { name: "hasSwiftshaderRenderer", severity: ie, test: rt },
979
+ { name: "hasUTCTimezone", severity: ae, test: nt }
980
+ ];
981
+ }
982
+ runDetectionRules() {
983
+ const e = this.getDetectionRules(), n = {
984
+ headlessChromeScreenResolution: { detected: !1, severity: "high" },
985
+ hasWebdriver: { detected: !1, severity: "high" },
986
+ hasWebdriverWritable: { detected: !1, severity: "high" },
987
+ hasSeleniumProperty: { detected: !1, severity: "high" },
988
+ hasCDP: { detected: !1, severity: "high" },
989
+ hasPlaywright: { detected: !1, severity: "high" },
990
+ hasImpossibleDeviceMemory: { detected: !1, severity: "high" },
991
+ hasHighCPUCount: { detected: !1, severity: "high" },
992
+ hasMissingChromeObject: { detected: !1, severity: "high" },
993
+ hasWebdriverIframe: { detected: !1, severity: "high" },
994
+ hasWebdriverWorker: { detected: !1, severity: "high" },
995
+ hasMismatchWebGLInWorker: { detected: !1, severity: "high" },
996
+ hasMismatchPlatformIframe: { detected: !1, severity: "high" },
997
+ hasMismatchPlatformWorker: { detected: !1, severity: "high" },
998
+ hasSwiftshaderRenderer: { detected: !1, severity: "low" },
999
+ hasUTCTimezone: { detected: !1, severity: "medium" }
1000
+ };
1001
+ for (const a of e)
1002
+ try {
1003
+ const i = a.test(this.fingerprint);
1004
+ n[a.name] = { detected: i, severity: a.severity };
1005
+ } catch {
1006
+ n[a.name] = { detected: !1, severity: a.severity };
1007
+ }
1008
+ return n;
1009
+ }
1010
+ async collectFingerprint(e = { encrypt: !0 }) {
1011
+ const { encrypt: n = !0, skipWorker: a = !1 } = e, i = this.fingerprint.signals, m = {
1012
+ // Automation signals
1013
+ webdriver: this.collectSignal(te),
1014
+ webdriverWritable: this.collectSignal(we),
1015
+ selenium: this.collectSignal(ye),
1016
+ cdp: this.collectSignal(se),
1017
+ playwright: this.collectSignal(le),
1018
+ navigatorPropertyDescriptors: this.collectSignal(He),
1019
+ // Device signals
1020
+ cpuCount: this.collectSignal(ue),
1021
+ memory: this.collectSignal(he),
1022
+ platform: this.collectSignal(ne),
1023
+ screenResolution: this.collectSignal(pe),
1024
+ multimediaDevices: this.collectSignal(xe),
1025
+ mediaQueries: this.collectSignal(Ne),
1026
+ // Browser signals
1027
+ userAgent: this.collectSignal(re),
1028
+ browserFeatures: this.collectSignal(Ge),
1029
+ plugins: this.collectSignal(Ae),
1030
+ browserExtensions: this.collectSignal(je),
1031
+ highEntropyValues: this.collectSignal(be),
1032
+ etsl: this.collectSignal(ge),
1033
+ maths: this.collectSignal(de),
1034
+ toSourceError: this.collectSignal(Me),
1035
+ // Graphics signals
1036
+ webGL: this.collectSignal(ce),
1037
+ webgpu: this.collectSignal(ve),
1038
+ canvas: this.collectSignal(Te),
1039
+ // Codecs
1040
+ mediaCodecs: this.collectSignal(_e),
1041
+ // Locale signals
1042
+ internationalization: this.collectSignal(me),
1043
+ languages: this.collectSignal(fe),
1044
+ // Context signals
1045
+ iframe: this.collectSignal(Pe),
1046
+ webWorker: a ? Promise.resolve({
1047
+ webdriver: p,
1048
+ userAgent: p,
1049
+ platform: p,
1050
+ memory: p,
1051
+ cpuCount: p,
1052
+ language: p,
1053
+ vendor: p,
1054
+ renderer: p
1055
+ }) : this.collectSignal(De),
1056
+ // Meta signals
1057
+ nonce: this.collectSignal(Oe),
1058
+ time: this.collectSignal(Le),
1059
+ url: this.collectSignal(Ve)
1060
+ }, u = Object.keys(m), v = await Promise.all(Object.values(m)), o = Object.fromEntries(u.map((f, y) => [f, v[y]]));
1061
+ return i.automation.webdriver = o.webdriver, i.automation.webdriverWritable = o.webdriverWritable, i.automation.selenium = o.selenium, i.automation.cdp = o.cdp, i.automation.playwright = o.playwright, i.automation.navigatorPropertyDescriptors = o.navigatorPropertyDescriptors, i.device.cpuCount = o.cpuCount, i.device.memory = o.memory, i.device.platform = o.platform, i.device.screenResolution = o.screenResolution, i.device.multimediaDevices = o.multimediaDevices, i.device.mediaQueries = o.mediaQueries, i.browser.userAgent = o.userAgent, i.browser.features = o.browserFeatures, i.browser.plugins = o.plugins, i.browser.extensions = o.browserExtensions, i.browser.highEntropyValues = o.highEntropyValues, i.browser.etsl = o.etsl, i.browser.maths = o.maths, i.browser.toSourceError = o.toSourceError, i.graphics.webGL = o.webGL, i.graphics.webgpu = o.webgpu, i.graphics.canvas = o.canvas, i.codecs = o.mediaCodecs, i.locale.internationalization = o.internationalization, i.locale.languages = o.languages, i.contexts.iframe = o.iframe, i.contexts.webWorker = o.webWorker, this.fingerprint.nonce = o.nonce, this.fingerprint.time = o.time, this.fingerprint.url = o.url, this.fingerprint.fastBotDetectionDetails = this.runDetectionRules(), this.fingerprint.fastBotDetection = Object.values(this.fingerprint.fastBotDetectionDetails).some((f) => f.detected), this.fingerprint.fsid = this.generateFingerprintScannerId(), n ? await this.encryptFingerprint(JSON.stringify(this.fingerprint)) : this.fingerprint;
1062
+ }
1063
+ }
1064
+ export {
1065
+ ot as default
1066
+ };