@anonympins/fingerprint 0.3.0 → 0.3.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.
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  ![GitHub commit activity](https://img.shields.io/github/commit-activity/w/anonympins/fingerprint)
6
6
  [![Watchers](https://img.shields.io/github/watchers/anonympins/fingerprint)](https://github.com/anonympins/fingerprint/watchers)
7
7
 
8
- An HTTP(S) client mitigation and anti-bot protection library for Node.js/Express, based on digital fingerprinting and dynamic Proof-of-Work (PoW) challenges.
8
+ An HTTP(S) client mitigation and anti-bot protection library for both PHP and Node.js/Express, based on digital fingerprinting and dynamic Proof-of-Work (PoW) challenges.
9
9
 
10
10
  ## How It Works
11
11
 
@@ -47,18 +47,105 @@ For API clients, the challenge is delivered as a `404` JSON response, and the cl
47
47
  - **Timing Attack Protection**: Uses `crypto.timingSafeEqual` for secure validation of tickets and other signatures.
48
48
  - **Bot Whitelisting**: Includes a DNS-based verification mechanism to reliably identify and whitelist legitimate crawlers like Googlebot and Bingbot, preventing them from being challenged. The results are cached for optimal performance.
49
49
  - **Automatic Parameter Tuning**: Includes a genetic algorithm-based optimizer (`startThresholdAutoTuning`) that analyzes real traffic to dynamically adjust suspicion thresholds, weights, and behavioral pattern detection parameters, improving accuracy and reducing false positives over time. The tuner is hardened against data poisoning attempts.
50
+ - **Optional WASM Acceleration**: The client-side library can be accelerated with a WebAssembly module for high-performance hashing. The build process handles this optionally, and the client gracefully falls back to a pure JavaScript implementation if WASM is unavailable.
50
51
  - **Hardened Security**: Protects against various attacks, including DoS via memory exhaustion, invalid nonce submission, and uses cryptographically secure randomness for all sensitive operations.
51
52
 
52
53
  ## Installation and Usage
53
54
 
54
- This module is designed for a Node.js environment.
55
+ This library is available for both **Node.js** and **PHP**.
56
+
57
+ * [PHP Quickstart](#php-quickstart)
58
+ * [Node.js Quickstart](#nodejs-quickstart)
55
59
 
56
60
  ### Prerequisites
57
61
 
58
- Ensure you have middleware for parsing cookies (like `cookie-parser`) and request bodies (like `express.json` and `express.urlencoded`) set up in your Express application *before* the `powMiddleware`.
62
+ * **PHP 7.4+**
63
+ * The **GMP** extension (`php-gmp`) is required for handling the large-integer arithmetic used in cryptographic challenges.
64
+ * **Composer** for package management.
65
+
66
+ ---
67
+
68
+ <a id="php-quickstart"></a>
69
+
70
+ ## PHP Quickstart (Direct Integration)
71
+
72
+ This guide shows the simplest way to integrate the library into any PHP application, without requiring a framework. It interacts directly with PHP's native functions and superglobals.
73
+
74
+ ### Prerequisites
75
+
76
+ * **PHP 7.4+**
77
+ * The **GMP** extension (`php-gmp`) is required for handling the large-integer arithmetic used in cryptographic challenges.
78
+ * **Composer** for package management.
79
+
80
+ ### Installation
81
+
82
+ Install the main library via Composer:
83
+
84
+ ```bash
85
+ composer require anonympins/fingerprint
86
+ ```
59
87
 
60
88
  ### Configuration
61
89
 
90
+ Define a secret key for signing Proof-of-Work tickets in your environment variables or your `.env` file. This is **required** for production environments.
91
+
92
+ ```bash
93
+ POW_SECRET="your_secret_key_of_at_least_32_characters"
94
+ ```
95
+
96
+ ### Integration Example
97
+
98
+ This example shows how to protect an application's entry point (e.g., `index.php`) by calling the `protect()` method at the very beginning of your script.
99
+
100
+ ```php
101
+ <?php
102
+
103
+ declare(strict_types=1);
104
+
105
+ require_once __DIR__ . '/vendor/autoload.php';
106
+
107
+ use Anonympins\Fingerprint\Config\SecurityProfiles;
108
+ use Anonympins\Fingerprint\DirectFingerprint;
109
+
110
+ // 1. Choose a security profile and customize it if necessary.
111
+ $securityConfig = SecurityProfiles::createSecurityProfile('balanced', [
112
+ // Enable verbose mode for development
113
+ 'verbose' => true,
114
+ ]);
115
+
116
+ // IMPORTANT: For PHP environments, TLS fingerprinting (JA3/JA4) requires a reverse proxy
117
+ // (like Nginx, HAProxy, or a cloud load balancer) to inspect the TLS handshake and
118
+ // pass the fingerprint hashes to the PHP application via HTTP headers
119
+ // (e.g., `X-JA3-Hash`, `X-JA4-Hash`).
120
+
121
+ // 2. Create an instance of the DirectFingerprint protector.
122
+ $protector = new DirectFingerprint($securityConfig);
123
+
124
+ // 3. Protect the script.
125
+ // This method will analyze the request. If it's suspicious, it will
126
+ // send a challenge or block response and then call `exit()`.
127
+ // If the request is allowed, it returns the fingerprint data.
128
+ $fingerprint = $protector->protect();
129
+
130
+ // --- If the script continues, the request was allowed ---
131
+
132
+ $score = $fingerprint['score'] ?? 0;
133
+
134
+ header('Content-Type: text/html; charset=utf-8');
135
+ echo "<h1>Welcome to the protected page!</h1>";
136
+ echo "<p>Your suspicion score was: " . round($score, 2) . "</p>";
137
+
138
+ ?>
139
+ ```
140
+
141
+ <a id="nodejs-quickstart"></a>
142
+ ## NodeJS Configuration
143
+
144
+ ### Prerequisites for Node.js
145
+
146
+ Ensure you have middleware for parsing cookies (like `cookie-parser`) and request bodies (like `express.json` and `express.urlencoded`) set up in your Express application *before* the `powMiddleware`.
147
+
148
+ ### Configuration
62
149
  Define a secret key for signing PoW tickets in your environment variables.
63
150
 
64
151
  ```bash
@@ -173,7 +260,7 @@ const securityConfig = {
173
260
  },
174
261
  cpu: {
175
262
  minDifficultyBits: 8,
176
- maxDifficultyBits: 24,
263
+ maxDifficultyBits: 32,
177
264
  },
178
265
  // (Optional) Configure the duration (in milliseconds) for various temporary data.
179
266
  ticketMaxAge: 3600000, // 1 hour. Duration for which a solved challenge ticket is valid.
@@ -250,6 +337,11 @@ const securityConfig = {
250
337
  '/api/v1/webhooks/trusted-source', // Exact path
251
338
  '/api/v2/public/*', // All paths starting with /api/v2/public/
252
339
  ]},
340
+
341
+ // Allows a specific GraphQL query and all mutations•
342
+ {type: 'graphql_operation_allowlist',entries: [
343
+ 'query:GetPublicPosts',
344
+ 'mutation:*']},
253
345
  // Option 2: DNS-verified bots (e.g., search engine crawlers).
254
346
  // This uses a secure DNS lookup (reverse then forward) to verify the bot's identity.
255
347
  // The result is cached per IP to avoid repeated DNS lookups.
@@ -274,6 +366,10 @@ const securityConfig = {
274
366
  enableUsefulWork: true,
275
367
  usefulWorkConfigPath: './path/to/your/problems.config.json' // (Optional) Path to the useful work configuration.
276
368
  };
369
+
370
+
371
+ // Create an instance of the middleware with your security configuration.
372
+ const powMiddlewareInstance = powMiddleware(securityConfig);
277
373
  ```
278
374
 
279
375
 
@@ -531,6 +627,11 @@ initializeClient({
531
627
  // (Optional) An array of `name` attributes for hidden form fields that act as bot traps.
532
628
  honeypots: ['email_confirm', 'user_nickname', 'website_url'],
533
629
 
630
+ // (Optional) Path to the WebAssembly loader script (`fp.js`) for accelerated hashing.
631
+ // If provided, the client will attempt to load the WASM module. If it fails or is not available,
632
+ // it will gracefully fall back to the pure JavaScript implementation.
633
+ wasmPath: '/fp.js',
634
+
534
635
  // (Optional) Enables automatic protection for `fetch` requests.
535
636
  // If the `fetch` object is present, the protection is active.
536
637
  fetch: {
@@ -656,6 +757,11 @@ app.get('/api/problems/solutions', (req, res) => {
656
757
 
657
758
  ```
658
759
 
760
+ #### `getBestTuningSolution()`
761
+
762
+ Returns the last best solution object found by the auto-tuner. This is particularly useful for "FinOps" or for auditing the tuner's performance, as it allows you to log the exact configuration that the genetic algorithm identified as optimal.
763
+
764
+ * **Returns**: (`object|null`) The best solution object `{ solution, objectives }` or `null` if no tuning cycle has completed yet. The `solution` property contains the optimized `weights`, `thresholds`, and `patterns`, while `objectives` contains the performance scores (e.g., false positive/negative rates) for that solution.
659
765
 
660
766
  #### `problemManager.updateProblemPayload(problemId, newPayload)`
661
767
 
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Algorithme de hachage cyrb53 (rapide et faible taux de collision).
3
3
  */
4
- export const cyrb53 = (str, seed = 0) => {
4
+ // Exporté pour être utilisé comme fallback par fingerprint.client.js
5
+ export const cyrb53 = (str, seed = 0) => {
5
6
  let h1 = 0xdeadbeef ^ seed,
6
7
  h2 = 0x41c6ce57 ^ seed;
7
8
  for (let i = 0, ch; i < str.length; i++) {
@@ -24,7 +25,10 @@ export const cyrb53 = (str, seed = 0) => {
24
25
  */
25
26
  export class FingerprintBuilder {
26
27
  constructor() {
28
+ // Le hasher est maintenant une propriété pour pouvoir être surchargé par le client WASM.
27
29
  this.components = new Map();
30
+ // FIX: Initialiser le hasher par défaut à l'implémentation JS.
31
+ this.hasher = cyrb53;
28
32
  }
29
33
 
30
34
  /**
@@ -35,7 +39,7 @@ export class FingerprintBuilder {
35
39
  add(group, value) {
36
40
  if (value === undefined || value === null) return this;
37
41
  // On hash la valeur individuellement pour l'anonymiser et réduire sa taille
38
- this.components.set(group, cyrb53(String(value)));
42
+ this.components.set(group, this.hasher(String(value)));
39
43
  return this;
40
44
  }
41
45
 
@@ -1,9 +1,19 @@
1
- import { cyrb53, FingerprintBuilder } from './fingerprint.builder.js';
1
+ import { cyrb53 as jsCyrb53, FingerprintBuilder } from './fingerprint.builder.js';
2
2
  import { solveChallenge } from './pow.solver.js';
3
3
 
4
+ // Variable pour stocker la fonction de hachage active.
5
+ // Par défaut, c'est l'implémentation JavaScript.
6
+ let activeCyrb53 = jsCyrb53;
7
+
4
8
  const ClientLibrary = {
5
9
  // Cache pour éviter de recalculer les constantes (Hardware, etc.)
6
10
  _cachedBuilder: null,
11
+ /**
12
+ * Wrapper interne pour la fonction de hachage.
13
+ * @private
14
+ */
15
+ _hasher: (str, seed) => activeCyrb53(str, seed),
16
+
7
17
  /**
8
18
  * Génère l'empreinte de l'appareil actuel.
9
19
  */
@@ -12,7 +22,7 @@ const ClientLibrary = {
12
22
  console.error("getDeviceFingerprint can only be called on the client-side.");
13
23
  return "";
14
24
  }
15
-
25
+
16
26
  if (!this._cachedBuilder) {
17
27
  const nav = window.navigator;
18
28
  const screen = window.screen;
@@ -21,7 +31,7 @@ const ClientLibrary = {
21
31
 
22
32
  // 1. Hardware (Très stable) : Cœurs, RAM, GPU (si dispo via canvas), Touch
23
33
  this._cachedBuilder.add(
24
- "hw",
34
+ "hw", // Utilise maintenant le hasher actif
25
35
  `${nav.hardwareConcurrency}_${nav.deviceMemory}_${nav.maxTouchPoints}`,
26
36
  );
27
37
 
@@ -111,7 +121,7 @@ const ClientLibrary = {
111
121
  .sort()
112
122
  .map((k) => `${k}=${payload[k]}`)
113
123
  .join("&");
114
- const payloadHash = cyrb53(sortedPayload);
124
+ const payloadHash = this._hasher(sortedPayload);
115
125
  return `${deviceFp}|req:${payloadHash}`;
116
126
  },
117
127
 
@@ -138,6 +148,8 @@ const ClientLibrary = {
138
148
  * Resets the cached fingerprint builder. Used for testing purposes.
139
149
  */
140
150
  _resetCache() {
151
+ // Réinitialise le hasher à l'implémentation JS par défaut.
152
+ activeCyrb53 = jsCyrb53;
141
153
  this._cachedBuilder = null;
142
154
  },
143
155
 
@@ -345,7 +357,7 @@ const ClientLibrary = {
345
357
  };
346
358
 
347
359
  this.addFetchInterceptor(fingerprintInterceptor);
348
- },
360
+ }, // <-- VIRGULE AJOUTÉE ICI
349
361
 
350
362
  /**
351
363
  * Intercepte une réponse de challenge JSON, le résout, et réessaie la requête.
@@ -388,18 +400,11 @@ const ClientLibrary = {
388
400
  console.error('[Fingerprint] Failed to solve or retry challenge:', e);
389
401
  return response; // Retourne la réponse 429 originale en cas d'échec
390
402
  }
391
- },
392
- /**
393
- * @typedef {object} ClientConfig
394
- * @property {boolean} [mouse=true] - Activer le suivi de l'entropie de la souris.
395
- * @property {boolean} [keystrokes=true] - Activer le suivi de la dynamique de frappe.
396
- * @property {string[]} [honeypots] - Noms des champs de formulaire honeypot à initialiser.
397
- * @property {object} [fetch] - Configuration pour l'interception de fetch.
398
- * @property {string[]} [fetch.targetDomains] - Domaines à protéger. Si non fourni, protège les requêtes de même origine.
399
- */
403
+ }, // <-- VIRGULE AJOUTÉE ICI
400
404
 
401
405
  /**
402
406
  * Initialise toutes les protections côté client en une seule fois.
407
+ * Tente également de charger le module WASM si `wasmPath` est fourni.
403
408
  * C'est la méthode d'initialisation recommandée.
404
409
  * @param {ClientConfig} [config={}] - L'objet de configuration.
405
410
  */
@@ -408,9 +413,15 @@ const ClientLibrary = {
408
413
  mouse = true,
409
414
  keystrokes = true,
410
415
  honeypots = [],
411
- fetch: fetchConfig = {},
416
+ wasmPath, // Nouveau paramètre
417
+ fetch: fetchConfig = {}
412
418
  } = config;
413
419
 
420
+ // Tentative de chargement du WASM si le chemin est fourni
421
+ if (wasmPath) {
422
+ this.initializeWasm(wasmPath);
423
+ }
424
+
414
425
  if (mouse) {
415
426
  this.startMouseEntropyTracker();
416
427
  }
@@ -426,14 +437,57 @@ const ClientLibrary = {
426
437
 
427
438
  // Ajoute l'intercepteur pour la résolution de challenge
428
439
  if (fetchConfig.handleChallenges !== false) {
429
- this.addFetchInterceptor(async (resource, options, next) => {
430
- const originalResponse = await next(resource, options);
431
- // On clone la réponse pour que la lecture du corps par solveChallengeAndRetry ne la consomme pas pour l'appelant original.
432
- return this.solveChallengeAndRetry(originalResponse.clone(), resource, options);
433
- });
440
+ this.addFetchInterceptor(async (resource, options, next) => {
441
+ const originalResponse = await next(resource, options);
442
+ // On clone la réponse pour que la lecture du corps par solveChallengeAndRetry ne la consomme pas pour l'appelant original.
443
+ return this.solveChallengeAndRetry(originalResponse.clone(), resource, options);
444
+ });
445
+ }
446
+ }
447
+ },
448
+
449
+ /**
450
+ * Tente de charger et d'initialiser le module WebAssembly pour un hachage plus rapide.
451
+ * Si le chargement échoue, il se rabat silencieusement sur l'implémentation JS.
452
+ * @param {string} wasmPath - Le chemin vers le script de chargement du module WASM (ex: '/fp.js').
453
+ */
454
+ async initializeWasm(wasmPath) {
455
+ try {
456
+ // 1. Injecter le script qui charge le module WASM
457
+ const script = document.createElement('script');
458
+ script.src = wasmPath;
459
+ await new Promise((resolve, reject) => {
460
+ script.onload = resolve;
461
+ script.onerror = reject;
462
+ document.head.appendChild(script);
463
+ });
464
+
465
+ // 2. Attendre que la fonction globale `createFingerprintModule` soit disponible
466
+ if (typeof window.createFingerprintModule !== 'function') {
467
+ throw new Error('WASM loader script did not expose createFingerprintModule.');
468
+ }
469
+
470
+ // 3. Initialiser le module
471
+ const wasmModule = await window.createFingerprintModule();
472
+ if (typeof wasmModule._hash_string !== 'function') {
473
+ throw new Error('WASM module did not export _hash_string.');
474
+ }
475
+
476
+ // 4. Remplacer la fonction de hachage par la version WASM
477
+ activeCyrb53 = (str) => {
478
+ // La fonction C++ attend un pointeur, Emscripten gère la conversion
479
+ return wasmModule._hash_string(str);
480
+ };
481
+
482
+ console.log('[Fingerprint] WASM module loaded successfully. Using fast hashing.');
483
+ // NOUVEAU: Ajoute un indicateur à l'empreinte pour que le serveur sache que le WASM est actif.
484
+ if (this._cachedBuilder) {
485
+ this._cachedBuilder.addRaw('wasm', 'true');
486
+ }
487
+ } catch (error) {
488
+ console.warn('[Fingerprint] WASM module failed to load. Falling back to JS implementation. Error:', error);
434
489
  }
435
490
  }
436
- }
437
491
  };
438
492
 
439
493
  /**
@@ -477,6 +531,7 @@ export const addFetchInterceptor = ClientLibrary.addFetchInterceptor.bind(Client
477
531
  export const patchGlobalFetch = ClientLibrary.patchGlobalFetch.bind(ClientLibrary);
478
532
  export const initializeFetch = ClientLibrary.initializeFetch.bind(ClientLibrary);
479
533
  export const initializeClient = ClientLibrary.initializeClient.bind(ClientLibrary);
534
+ export const initializeWasm = ClientLibrary.initializeWasm.bind(ClientLibrary);
480
535
  export const solveChallengeAndRetry = ClientLibrary.solveChallengeAndRetry.bind(ClientLibrary);
481
536
 
482
537
  // Export the internal object for testing purposes
@@ -0,0 +1 @@
1
+ const _0x36a6f6=_0x3ded;(function(_0xd469c7,_0x539490){const _0x2197dc=_0x3ded,_0x1c4904=_0xd469c7();while(!![]){try{const _0x5bb030=-parseInt(_0x2197dc(0x196))/0x1*(parseInt(_0x2197dc(0xc2))/0x2)+-parseInt(_0x2197dc(0xe0))/0x3+parseInt(_0x2197dc(0x199))/0x4*(parseInt(_0x2197dc(0x169))/0x5)+-parseInt(_0x2197dc(0xfd))/0x6+-parseInt(_0x2197dc(0x19c))/0x7+-parseInt(_0x2197dc(0x177))/0x8*(parseInt(_0x2197dc(0x12b))/0x9)+parseInt(_0x2197dc(0x10f))/0xa;if(_0x5bb030===_0x539490)break;else _0x1c4904['push'](_0x1c4904['shift']());}catch(_0x114096){_0x1c4904['push'](_0x1c4904['shift']());}}}(_0x1767,0x8b1d5));import{cyrb53,FingerprintBuilder}from'./fingerprint.builder.js';import{solveChallenge}from'./pow.solver.js';const ClientLibrary={'_cachedBuilder':null,'getDeviceFingerprint'(){const _0x1702f1=_0x3ded,_0x206c6={'cULNl':_0x1702f1(0xdf),'VzKMM':'#f60','pTLFs':'fingerprint','JhsGL':_0x1702f1(0x16d),'jFsJk':function(_0x3ae839,_0x3e3e21){return _0x3ae839>=_0x3e3e21;},'MOqXj':'X-Device-Fingerprint','HYzKb':_0x1702f1(0x174),'ShXUn':_0x1702f1(0x120),'fDyok':function(_0x1b1506,_0x2cb101){return _0x1b1506===_0x2cb101;},'JGbxj':_0x1702f1(0xbd),'QAfih':function(_0xb2c742,_0x2a9037){return _0xb2c742===_0x2a9037;},'ZPEDq':_0x1702f1(0x166),'CqBVe':_0x1702f1(0xdb),'ZJikv':_0x1702f1(0x195),'SMoNd':_0x1702f1(0x12d),'ludee':_0x1702f1(0x11d),'qEBDQ':_0x1702f1(0x18c),'DHlHG':function(_0x2648f4,_0x32ef13){return _0x2648f4!==_0x32ef13;},'poDMc':_0x1702f1(0x183),'GXVFN':_0x1702f1(0x151),'djlzo':_0x1702f1(0x110),'TpGlv':_0x1702f1(0x143),'Dszxr':'cvs','WFqZN':_0x1702f1(0x19b),'nmBda':_0x1702f1(0xce),'KhHvl':_0x1702f1(0xed),'GvfQC':_0x1702f1(0x14e),'FkIBk':'EAwSu','ozxdT':_0x1702f1(0xc6),'zMAjP':'true'};if(_0x206c6[_0x1702f1(0x113)](typeof window,_0x206c6[_0x1702f1(0x158)])){if(_0x206c6[_0x1702f1(0x112)](_0x1702f1(0x19d),_0x1702f1(0x19d)))return console[_0x1702f1(0xf2)](_0x206c6[_0x1702f1(0x129)]),'';else{const _0x58ba0a=_0x481887['createElement'](_0x1702f1(0xdb)),_0x21dd30=_0x58ba0a['getContext']('2d');if(_0x21dd30){const _0x5968d1=_0x206c6['cULNl']['split']('|');let _0x5e1339=0x0;while(!![]){switch(_0x5968d1[_0x5e1339++]){case'0':this[_0x1702f1(0xc7)]['add']('cvs',_0x58ba0a['toDataURL']());continue;case'1':_0x58ba0a['height']=0x32;continue;case'2':_0x21dd30[_0x1702f1(0x1a7)]='rgba(102,\x20204,\x200,\x200.7)';continue;case'3':_0x58ba0a[_0x1702f1(0x173)]=0xc8;continue;case'4':_0x21dd30['fillStyle']=_0x206c6[_0x1702f1(0x13a)];continue;case'5':_0x21dd30['fillStyle']='#069';continue;case'6':_0x21dd30[_0x1702f1(0x15e)](_0x1702f1(0x153),0x4,0x11);continue;case'7':_0x21dd30[_0x1702f1(0x1ae)]='alphabetic';continue;case'8':_0x21dd30[_0x1702f1(0x15e)](_0x206c6[_0x1702f1(0x19f)],0x2,0xf);continue;case'9':_0x21dd30[_0x1702f1(0x13b)]=_0x206c6[_0x1702f1(0x15b)];continue;case'10':_0x21dd30[_0x1702f1(0x132)](0x7d,0x1,0x3e,0x14);continue;}break;}}}}if(!this[_0x1702f1(0xc7)]){const _0x300990=window[_0x1702f1(0x172)],_0x223aa0=window[_0x1702f1(0x181)];this[_0x1702f1(0xc7)]=new FingerprintBuilder(),this['_cachedBuilder'][_0x1702f1(0xd9)]('hw',_0x300990[_0x1702f1(0x101)]+'_'+_0x300990[_0x1702f1(0x108)]+'_'+_0x300990[_0x1702f1(0x145)]),this[_0x1702f1(0xc7)]['add']('geo',Intl[_0x1702f1(0xe8)]()[_0x1702f1(0x16b)]()[_0x1702f1(0xff)]+'_'+_0x300990['language']+'_'+new Date()[_0x1702f1(0x123)]()),this[_0x1702f1(0xc7)][_0x1702f1(0xd9)](_0x1702f1(0x17b),_0x223aa0[_0x1702f1(0x173)]+'x'+_0x223aa0[_0x1702f1(0x19a)]+'_'+_0x223aa0['colorDepth']),this[_0x1702f1(0xc7)][_0x1702f1(0xd9)]('os',_0x300990[_0x1702f1(0x150)]);try{const _0x1821c6=document['createElement'](_0x206c6['CqBVe']),_0x15d87e=_0x1821c6[_0x1702f1(0x178)](_0x206c6[_0x1702f1(0x1a8)])||_0x1821c6[_0x1702f1(0x178)](_0x1702f1(0x176));if(_0x15d87e){const _0x1c97ce=_0x15d87e['getExtension'](_0x206c6[_0x1702f1(0xd6)]);if(_0x1c97ce){if(_0x206c6['fDyok'](_0x206c6[_0x1702f1(0x1a2)],_0x206c6[_0x1702f1(0x146)]))_0x206c6[_0x1702f1(0x180)](_0xde990b[_0x1702f1(0xf0)],_0x2a29f7)&&_0x49e695[_0x1702f1(0xf8)](),_0x9066e8[_0x1702f1(0x126)](_0x36aa17);else{const _0x226d11=_0x15d87e[_0x1702f1(0x106)](_0x1c97ce[_0x1702f1(0x133)]),_0x2693d4=_0x15d87e[_0x1702f1(0x106)](_0x1c97ce[_0x1702f1(0x131)]);this[_0x1702f1(0xc7)][_0x1702f1(0xd9)](_0x206c6[_0x1702f1(0xde)],_0x226d11+'_'+_0x2693d4);}}}}catch(_0x25780a){}try{const _0x229958=document[_0x1702f1(0x139)](_0x1702f1(0xdb)),_0x3630a7=_0x229958['getContext']('2d');if(_0x3630a7){if(_0x206c6[_0x1702f1(0x107)](_0x206c6['poDMc'],_0x206c6[_0x1702f1(0x11f)])){const _0x5b6782=this[_0x1702f1(0x13f)](),_0x3937e1=this['getClientBehaviorMetrics'](),_0x16c4d2=new _0x66fa7a(_0x289c58[_0x1702f1(0xc5)]||{});_0x16c4d2[_0x1702f1(0x105)](_0x206c6[_0x1702f1(0xd2)],_0x5b6782),_0x16c4d2['set'](_0x206c6['HYzKb'],_0x2b30c3['stringify'](_0x3937e1)),_0x259285[_0x1702f1(0xc5)]=_0x16c4d2;}else{const _0xbd617b=_0x206c6['GXVFN'][_0x1702f1(0xda)]('|');let _0x1f4bdc=0x0;while(!![]){switch(_0xbd617b[_0x1f4bdc++]){case'0':_0x229958[_0x1702f1(0x173)]=0xc8;continue;case'1':_0x3630a7[_0x1702f1(0x1a7)]=_0x206c6['djlzo'];continue;case'2':_0x3630a7[_0x1702f1(0x1a7)]=_0x206c6[_0x1702f1(0x13a)];continue;case'3':_0x3630a7['fillRect'](0x7d,0x1,0x3e,0x14);continue;case'4':_0x3630a7[_0x1702f1(0x13b)]=_0x206c6[_0x1702f1(0x15b)];continue;case'5':_0x3630a7[_0x1702f1(0x1ae)]=_0x1702f1(0xdc);continue;case'6':_0x3630a7[_0x1702f1(0x1a7)]=_0x206c6[_0x1702f1(0xc4)];continue;case'7':this[_0x1702f1(0xc7)][_0x1702f1(0xd9)](_0x206c6[_0x1702f1(0x148)],_0x229958[_0x1702f1(0x18d)]());continue;case'8':_0x3630a7['fillText'](_0x206c6[_0x1702f1(0x19f)],0x2,0xf);continue;case'9':_0x3630a7[_0x1702f1(0x15e)](_0x206c6['pTLFs'],0x4,0x11);continue;case'10':_0x229958[_0x1702f1(0x19a)]=0x32;continue;}break;}}}}catch(_0x221dd9){}const _0x30a162=[_0x206c6[_0x1702f1(0x179)],_0x206c6[_0x1702f1(0x116)],_0x1702f1(0x19e),_0x206c6[_0x1702f1(0x16c)],_0x1702f1(0xb9),_0x1702f1(0x16a)];if(_0x30a162[_0x1702f1(0xf5)](_0x1d0c81=>window[_0x1d0c81])){if(_0x206c6['GvfQC']===_0x206c6[_0x1702f1(0xfc)]){const _0x56bad4=_0xee0031[_0x1702f1(0x106)](_0x472262['UNMASKED_VENDOR_WEBGL']),_0x411c06=_0x44242a[_0x1702f1(0x106)](_0x2ec280[_0x1702f1(0x131)]);this[_0x1702f1(0xc7)]['add'](_0x206c6[_0x1702f1(0xde)],_0x56bad4+'_'+_0x411c06);}else this[_0x1702f1(0xc7)][_0x1702f1(0xd9)](_0x206c6[_0x1702f1(0xbe)],_0x1702f1(0x11a));}if(_0x300990['webdriver'])this[_0x1702f1(0xc7)][_0x1702f1(0xd9)](_0x1702f1(0xf4),_0x206c6[_0x1702f1(0x14b)]);}return this[_0x1702f1(0xc7)][_0x1702f1(0xeb)]();},'generateRequestSignature'(_0x1180f7={}){const _0x8684b8=_0x3ded,_0x279c8d={'WpxuB':function(_0x45c206,_0x741d5){return _0x45c206(_0x741d5);}},_0x1d0a00=this[_0x8684b8(0x13f)](),_0x5b4dfb=Object[_0x8684b8(0xd4)](_0x1180f7)['sort']()[_0x8684b8(0x147)](_0x177013=>_0x177013+'='+_0x1180f7[_0x177013])[_0x8684b8(0x135)]('&'),_0x1765cd=_0x279c8d['WpxuB'](cyrb53,_0x5b4dfb);return _0x1d0a00+_0x8684b8(0x1a4)+_0x1765cd;},async 'generateClientSideSignature'(_0x5665d4,_0x371982){const _0x5e4c38=_0x3ded,_0x5e8f0c={'pYzra':_0x5e4c38(0x1ad),'MzpqC':_0x5e4c38(0x17a),'Lfbdu':_0x5e4c38(0x1b1)},_0xb818af=Object[_0x5e4c38(0xd4)](_0x5665d4)[_0x5e4c38(0x1ac)]()[_0x5e4c38(0x147)](_0x326f6a=>_0x326f6a+'='+_0x5665d4[_0x326f6a])[_0x5e4c38(0x135)]('&'),_0x3c7b9a=new TextEncoder(),_0x19d9ac=await window[_0x5e4c38(0xfe)][_0x5e4c38(0x141)][_0x5e4c38(0xe4)]('raw',_0x3c7b9a[_0x5e4c38(0x102)](_0x371982),{'name':_0x5e8f0c['pYzra'],'hash':_0x5e8f0c['MzpqC']},![],[_0x5e8f0c[_0x5e4c38(0xbf)]]),_0x4a5a03=await window['crypto'][_0x5e4c38(0x141)][_0x5e4c38(0x1b1)](_0x5e8f0c[_0x5e4c38(0xd0)],_0x19d9ac,_0x3c7b9a[_0x5e4c38(0x102)](_0xb818af)),_0x5b56e0=Array[_0x5e4c38(0xc8)](new Uint8Array(_0x4a5a03));return _0x5b56e0[_0x5e4c38(0x147)](_0x44530e=>_0x44530e['toString'](0x10)[_0x5e4c38(0x170)](0x2,'0'))[_0x5e4c38(0x135)]('');},'_resetCache'(){this['_cachedBuilder']=null;},'startMouseEntropyTracker'(){const _0xae9632=_0x3ded,_0x51cc6f={'rkTpQ':function(_0x7cab8b,_0x6a2a96){return _0x7cab8b-_0x6a2a96;},'GxZbY':function(_0x1a2294,_0x15c55b){return _0x1a2294+_0x15c55b;},'iWuoK':function(_0x1b04e7,_0x51f681){return _0x1b04e7*_0x51f681;},'RCyvF':function(_0x1891eb,_0xacdbf4){return _0x1891eb>_0xacdbf4;},'HxpKP':_0xae9632(0x124)};if(_0x51cc6f[_0xae9632(0x122)](mouseMovements,0x0))return;document[_0xae9632(0x10b)](_0x51cc6f[_0xae9632(0xe9)],_0x8c9f0e=>{const _0x104cb7=_0xae9632,_0x48a436=_0x51cc6f[_0x104cb7(0x138)](_0x8c9f0e[_0x104cb7(0xba)],lastMousePos['x']),_0x46cb58=_0x8c9f0e[_0x104cb7(0x10e)]-lastMousePos['y'];metrics['mouseEntropy']+=Math['sqrt'](_0x51cc6f[_0x104cb7(0x164)](_0x51cc6f['iWuoK'](_0x48a436,_0x48a436),_0x51cc6f['iWuoK'](_0x46cb58,_0x46cb58))),lastMousePos={'x':_0x8c9f0e[_0x104cb7(0xba)],'y':_0x8c9f0e[_0x104cb7(0x10e)]},mouseMovements++;},{'passive':!![]});},'startKeystrokeDynamicsTracker'(){const _0xa8e5ff=_0x3ded,_0x5175cd={'oIsdC':_0xa8e5ff(0x17c),'txqnf':_0xa8e5ff(0x12e),'ZlsIY':function(_0xaa5cc6,_0x57dc36){return _0xaa5cc6(_0x57dc36);},'yNuZu':function(_0x4c1a54,_0x54254a){return _0x4c1a54!==_0x54254a;},'OYscH':'fDYPp','hcXeO':_0xa8e5ff(0xe5),'UdOnC':'OyjRb','KKGAj':function(_0x307c99,_0x12c84a){return _0x307c99-_0x12c84a;},'HRdIX':function(_0xb42a20,_0x3302f7){return _0xb42a20>_0x3302f7;},'BNjZr':function(_0x5f5c5a,_0x54922f){return _0x5f5c5a<_0x54922f;},'HXQvR':function(_0x194cef,_0x455f39){return _0x194cef>=_0x455f39;},'ramfw':_0xa8e5ff(0x168),'gQdCY':function(_0x20f07d,_0x5d14ab,_0x188c41){return _0x20f07d(_0x5d14ab,_0x188c41);},'mAqrf':function(_0x51bacc){return _0x51bacc();},'snkJf':_0xa8e5ff(0x186)},_0x435c1c=(function(){const _0x576dd2=_0xa8e5ff,_0x581866={'eIiyn':_0x5175cd[_0x576dd2(0xdd)]};if(_0x576dd2(0xd7)!==_0x5175cd['txqnf']){let _0x2e5b43=!![];return function(_0x1c4d6a,_0x5bae42){const _0x4fd58b=_0x2e5b43?function(){const _0x37611d=_0x3ded;if(_0x5bae42){const _0x2dc7f6=_0x5bae42[_0x37611d(0x136)](_0x1c4d6a,arguments);return _0x5bae42=null,_0x2dc7f6;}}:function(){};return _0x2e5b43=![],_0x4fd58b;};}else{const _0x579cbf={'ptAtp':_0x581866[_0x576dd2(0x191)]},_0x49d16c=()=>{const _0x294d3e=_0x576dd2;this[_0x294d3e(0xea)](),_0x29ff90['removeEventListener'](_0x579cbf[_0x294d3e(0xcd)],_0x49d16c);};_0x4658c4[_0x576dd2(0x10b)](_0x581866['eIiyn'],_0x49d16c),_0x584f07[_0x576dd2(0x105)](_0x4456f6,_0x49d16c);}}()),_0x57fa1d=_0x5175cd[_0xa8e5ff(0x194)](_0x435c1c,this,function(){const _0x47e248=_0xa8e5ff,_0x4b4721={'Terov':function(_0x1984cc,_0x2d8d7a){const _0x3dc872=_0x3ded;return _0x5175cd[_0x3dc872(0x17e)](_0x1984cc,_0x2d8d7a);}};if(_0x5175cd['yNuZu']('fDYPp',_0x5175cd[_0x47e248(0x111)])){const _0x527a92=this[_0x47e248(0x13f)](),_0x3ab7d5=_0x247f84[_0x47e248(0xd4)](_0x4e74c4)['sort']()[_0x47e248(0x147)](_0x3507a2=>_0x3507a2+'='+_0x44b23a[_0x3507a2])[_0x47e248(0x135)]('&'),_0x1700f0=_0x4b4721[_0x47e248(0x18e)](_0x6bcbd3,_0x3ab7d5);return _0x527a92+_0x47e248(0x1a4)+_0x1700f0;}else return _0x57fa1d[_0x47e248(0xeb)]()[_0x47e248(0x190)](_0x47e248(0xe5))[_0x47e248(0xeb)]()['constructor'](_0x57fa1d)[_0x47e248(0x190)](_0x5175cd[_0x47e248(0x156)]);});_0x5175cd['mAqrf'](_0x57fa1d);if(_0x5175cd[_0xa8e5ff(0x103)](keystrokeTimestamps['length'],0x0))return;document['addEventListener'](_0x5175cd[_0xa8e5ff(0x1b0)],()=>{const _0x4d368f=_0xa8e5ff,_0x51af92={'uOEag':_0x5175cd[_0x4d368f(0xdd)]};if(_0x4d368f(0x1a5)===_0x5175cd[_0x4d368f(0xee)]){const _0x5079a4=performance[_0x4d368f(0xfa)]();if(keystrokeTimestamps[_0x4d368f(0xf0)]>0x0){const _0x1d5744=keystrokeTimestamps[keystrokeTimestamps[_0x4d368f(0xf0)]-0x1],_0xc534b9=_0x5175cd[_0x4d368f(0x159)](_0x5079a4,_0x1d5744);if(_0x5175cd[_0x4d368f(0x103)](_0xc534b9,0xa)&&_0x5175cd[_0x4d368f(0xd8)](_0xc534b9,0x7d0)){if(_0x5175cd['HXQvR'](keystrokeLatencies['length'],KEYSTROKE_HISTORY_MAX)){if(_0x4d368f(0x14d)!==_0x5175cd['ramfw'])keystrokeLatencies[_0x4d368f(0xf8)]();else{const _0x460e78={'byRYW':_0x51af92[_0x4d368f(0x157)]},_0x2288ab=_0xdf36d7['querySelector']('[name=\x22'+_0x1cc580+'\x22]');if(_0x2288ab){const _0xca8edb=()=>{const _0x3f4dc1=_0x4d368f;this[_0x3f4dc1(0xea)](),_0x2288ab[_0x3f4dc1(0x104)](_0x460e78['byRYW'],_0xca8edb);};_0x2288ab[_0x4d368f(0x10b)](_0x51af92[_0x4d368f(0x157)],_0xca8edb),_0x397ad[_0x4d368f(0x105)](_0x2288ab,_0xca8edb);}}}keystrokeLatencies[_0x4d368f(0x126)](_0xc534b9);}}keystrokeTimestamps['push'](_0x5079a4);}else{const _0x23ee1e=_0x82bc67[_0x4d368f(0x136)](_0x3be78d,arguments);return _0x3cbb8e=null,_0x23ee1e;}},{'passive':!![]});},'initializeHoneypots'(_0x38af96){const _0x3615f0=_0x3ded,_0x4b9490={'eOvPm':_0x3615f0(0x17c),'cMRwi':function(_0x37f550,_0x522001){return _0x37f550-_0x522001;},'wRwUh':function(_0xf484d8,_0x2d0b0f){return _0xf484d8>_0x2d0b0f;},'aoQcr':function(_0x56c98d,_0x3517ad){return _0x56c98d<_0x3517ad;},'xYzDE':function(_0xd8487d,_0x2760a4){return _0xd8487d>=_0x2760a4;},'JHxNo':function(_0x144045,_0x1b5cb4){return _0x144045===_0x1b5cb4;},'nRoBi':function(_0x32761b,_0x58d597){return _0x32761b!==_0x58d597;},'cAdGH':_0x3615f0(0x18b),'GBdER':_0x3615f0(0xe6)};activeHoneypotListeners[_0x3615f0(0xf3)]((_0x125440,_0x5da119)=>{const _0x593db4=_0x3615f0;_0x5da119[_0x593db4(0x104)](_0x4b9490['eOvPm'],_0x125440);}),activeHoneypotListeners[_0x3615f0(0xd5)](),_0x38af96['forEach'](_0x78c4b1=>{const _0x3b6e43=_0x3615f0;if(_0x4b9490['nRoBi']('ZaxJn',_0x4b9490[_0x3b6e43(0x10d)])){const _0x1c5859=document[_0x3b6e43(0xe2)](_0x3b6e43(0xcf)+_0x78c4b1+'\x22]');if(_0x1c5859){if(_0x4b9490['JHxNo'](_0x4b9490[_0x3b6e43(0x149)],_0x3b6e43(0x117))){const _0x342922=_0x37e127[_0x4b9490['cMRwi'](_0xe176fc[_0x3b6e43(0xf0)],0x1)],_0x269156=_0x3fa204-_0x342922;_0x4b9490[_0x3b6e43(0x15f)](_0x269156,0xa)&&_0x4b9490[_0x3b6e43(0x125)](_0x269156,0x7d0)&&(_0x4b9490[_0x3b6e43(0x163)](_0x2ad3ec[_0x3b6e43(0xf0)],_0x21fc3c)&&_0x26a006[_0x3b6e43(0xf8)](),_0x47356e[_0x3b6e43(0x126)](_0x269156));}else{const _0x1c65a5=()=>{const _0x9b08f1=_0x3b6e43;this[_0x9b08f1(0xea)](),_0x1c5859['removeEventListener'](_0x4b9490[_0x9b08f1(0x1b3)],_0x1c65a5);};_0x1c5859[_0x3b6e43(0x10b)](_0x4b9490[_0x3b6e43(0x1b3)],_0x1c65a5),activeHoneypotListeners[_0x3b6e43(0x105)](_0x1c5859,_0x1c65a5);}}}else{const _0xa3923d=new _0x995f19(_0x2eab39,_0x3a553a['location'][_0x3b6e43(0x197)]);_0x251a94=_0x4b9490['JHxNo'](_0x5496a7[_0x3b6e43(0xf0)],0x0)&&_0xa3923d[_0x3b6e43(0x197)]===_0x4cb449[_0x3b6e43(0xc0)][_0x3b6e43(0x197)]||_0x4ffd9d[_0x3b6e43(0xf0)]>0x0&&_0x581ac4[_0x3b6e43(0xbc)](_0xa3923d[_0x3b6e43(0xbb)]);}});},'getClientBehaviorMetrics'(){const _0x5c6f56=_0x3ded,_0x563708={'iNHgS':function(_0x4a5f74,_0x115b16){return _0x4a5f74>_0x115b16;}};metrics[_0x5c6f56(0xca)]=window[_0x5c6f56(0x1a0)][_0x5c6f56(0xf0)],metrics['clientTimestamp']=Date[_0x5c6f56(0xfa)]();mouseMovements>0xa&&(metrics[_0x5c6f56(0x192)]/=mouseMovements);if(_0x563708[_0x5c6f56(0x160)](keystrokeLatencies[_0x5c6f56(0xf0)],0x0)){const _0x1b599c=keystrokeLatencies[_0x5c6f56(0x198)]((_0x20ee4b,_0x3a2f2e)=>_0x20ee4b+_0x3a2f2e,0x0);metrics['keystrokeLatency']=_0x1b599c/keystrokeLatencies[_0x5c6f56(0xf0)];}else metrics[_0x5c6f56(0x1af)]=0x0;return metrics;},async 'protectedFetch'(_0x104340,_0x2f3494={}){const _0x223ade=_0x3ded,_0x1d10d5={'pWtnC':_0x223ade(0x12a),'lRhQp':_0x223ade(0x174),'JiTog':function(_0xd1cc16,_0x33e6ff,_0x11a3e2){return _0xd1cc16(_0x33e6ff,_0x11a3e2);}},_0x146be5=this[_0x223ade(0x13f)](),_0x34fc70=this[_0x223ade(0x114)](),_0x3501e3=new Headers(_0x2f3494[_0x223ade(0xc5)]||{});return _0x3501e3[_0x223ade(0x105)](_0x1d10d5['pWtnC'],_0x146be5),_0x3501e3[_0x223ade(0x105)](_0x1d10d5[_0x223ade(0x1aa)],JSON[_0x223ade(0x1b5)](_0x34fc70)),_0x2f3494[_0x223ade(0xc5)]=_0x3501e3,_0x1d10d5[_0x223ade(0x134)](fetch,_0x104340,_0x2f3494);},'_isFetchPatched':![],'_interceptorChain':[],'_originalFetch':typeof window!==_0x36a6f6(0xbd)?window[_0x36a6f6(0x13c)]['bind'](window):null,'addFetchInterceptor'(_0x41b1d2){const _0x59f2a9=_0x36a6f6,_0x2779aa={'AyNQw':function(_0xfc14cc,_0x59f3c4){return _0xfc14cc/_0x59f3c4;},'AqkYz':function(_0x4632b9,_0xa2e9ad){return _0x4632b9!==_0xa2e9ad;},'WCWAr':_0x59f2a9(0x18f)};if(!this[_0x59f2a9(0x189)]){if(_0x2779aa[_0x59f2a9(0x100)](_0x2779aa[_0x59f2a9(0x1a1)],_0x2779aa[_0x59f2a9(0x1a1)])){const _0x405dc9=_0x190df9[_0x59f2a9(0x198)]((_0x23d6ab,_0x43ece3)=>_0x23d6ab+_0x43ece3,0x0);_0x34e6f3['keystrokeLatency']=_0x2779aa['AyNQw'](_0x405dc9,_0x4769a8['length']);}else this['patchGlobalFetch']();}this[_0x59f2a9(0x1b2)][_0x59f2a9(0x126)](_0x41b1d2);},'patchGlobalFetch'(){const _0x22379c=_0x36a6f6,_0x277059={'tRGaB':function(_0x174ebc,_0x67a0f5){return _0x174ebc>=_0x67a0f5;},'rKOdc':function(_0x116041,_0x4252f7,_0x35b5a4,_0x1746ca){return _0x116041(_0x4252f7,_0x35b5a4,_0x1746ca);}};if(this[_0x22379c(0x189)]||!this['_originalFetch'])return;this[_0x22379c(0x189)]=!![],window['fetch']=(_0x311504,_0xaeb635)=>{const _0x38abba={'YvudY':function(_0x74a0bb,_0x5ee561){return _0x277059['tRGaB'](_0x74a0bb,_0x5ee561);}},_0x142513=(_0x46f9ce,_0x1f092b,_0x8b6bb0)=>{const _0x265faf=_0x3ded;if(_0x265faf(0x171)!==_0x265faf(0x171))return _0x4e26e9;else{if(_0x38abba[_0x265faf(0xef)](_0x46f9ce,this[_0x265faf(0x1b2)][_0x265faf(0xf0)]))return this[_0x265faf(0x121)](_0x1f092b,_0x8b6bb0);const _0x2a465d=this[_0x265faf(0x1b2)][_0x46f9ce];return _0x2a465d(_0x1f092b,_0x8b6bb0,(_0x2cb4c4,_0x40009d)=>_0x142513(_0x46f9ce+0x1,_0x2cb4c4,_0x40009d));}};return _0x277059['rKOdc'](_0x142513,0x0,_0x311504,_0xaeb635||{});};},'onHoneypotTrigger':()=>{const _0x1d73a4=_0x36a6f6;metrics[_0x1d73a4(0xc9)]=!![];},'initializeFetch'(_0x3dced7=[]){const _0x1c9fa1=_0x36a6f6,_0x1e25d9={'YXoZg':function(_0x1d7822,_0xd61bd5){return _0x1d7822 instanceof _0xd61bd5;},'Qvuua':function(_0x5cc6c1,_0x13b050){return _0x5cc6c1(_0x13b050);},'fVaTy':function(_0x3aaec6,_0x1b5392){return _0x3aaec6===_0x1b5392;},'CYnzE':_0x1c9fa1(0xf7),'mUHdh':function(_0x59a2c5,_0x538ce6){return _0x59a2c5>_0x538ce6;},'Gmuxa':'IJmIH','KHsWw':'ydgth','QVMhW':_0x1c9fa1(0x12a),'rAruj':_0x1c9fa1(0x174),'ChSmn':function(_0x250ad1,_0x35d9f3,_0x22661e){return _0x250ad1(_0x35d9f3,_0x22661e);}},_0x3256a1=(_0x4d6751,_0x4fa0fa,_0x307d40)=>{const _0x39aeac=_0x1c9fa1,_0x46bc12=_0x1e25d9['YXoZg'](_0x4d6751,Request)?_0x4d6751[_0x39aeac(0x130)]:_0x1e25d9[_0x39aeac(0x15c)](String,_0x4d6751);let _0x2ac23c=![];try{if(_0x1e25d9[_0x39aeac(0xf6)]('BVAiO',_0x1e25d9[_0x39aeac(0x11c)])){const _0x43f67b=new URL(_0x46bc12,window[_0x39aeac(0xc0)]['origin']);_0x2ac23c=_0x1e25d9[_0x39aeac(0xf6)](_0x3dced7['length'],0x0)&&_0x1e25d9[_0x39aeac(0xf6)](_0x43f67b[_0x39aeac(0x197)],window[_0x39aeac(0xc0)][_0x39aeac(0x197)])||_0x1e25d9[_0x39aeac(0x18a)](_0x3dced7[_0x39aeac(0xf0)],0x0)&&_0x3dced7[_0x39aeac(0xbc)](_0x43f67b[_0x39aeac(0xbb)]);}else this['initializeHoneypots'](_0x2512a3);}catch(_0x57ba87){_0x2ac23c=_0x1e25d9[_0x39aeac(0xf6)](_0x3dced7[_0x39aeac(0xf0)],0x0);}if(_0x2ac23c){if(_0x1e25d9[_0x39aeac(0xe7)]===_0x1e25d9[_0x39aeac(0x10c)])this[_0x39aeac(0x167)]();else{const _0x34f4ff=this[_0x39aeac(0x13f)](),_0x439212=this['getClientBehaviorMetrics'](),_0x149c69=new Headers(_0x4fa0fa[_0x39aeac(0xc5)]||{});_0x149c69['set'](_0x1e25d9['QVMhW'],_0x34f4ff),_0x149c69['set'](_0x1e25d9[_0x39aeac(0xf9)],JSON[_0x39aeac(0x1b5)](_0x439212)),_0x4fa0fa['headers']=_0x149c69;}}return _0x1e25d9['ChSmn'](_0x307d40,_0x4d6751,_0x4fa0fa);};this[_0x1c9fa1(0x184)](_0x3256a1);},async 'solveChallengeAndRetry'(_0x2bcd0a,_0x284668,_0x6c3172){const _0x1fbfe9=_0x36a6f6,_0x21a2db={'cVQko':function(_0x5e6358,_0x2e04f0){return _0x5e6358-_0x2e04f0;},'uKCPd':function(_0x555fca,_0x1bda17){return _0x555fca*_0x1bda17;},'NlgVf':function(_0x40eb1b,_0x3b9c5c){return _0x40eb1b*_0x3b9c5c;},'agdJu':function(_0x4cd42c,_0x45e984){return _0x4cd42c>_0x45e984;},'gpaBr':function(_0xa94376,_0x47d2a8){return _0xa94376!==_0x47d2a8;},'KcCeo':'content-type','IYYFp':_0x1fbfe9(0x14a),'cdHXx':_0x1fbfe9(0x15d),'ItacQ':function(_0x886911,_0x46dc84){return _0x886911===_0x46dc84;},'VGHub':_0x1fbfe9(0x1b4),'WDaIb':_0x1fbfe9(0xe3),'vXXJR':function(_0x4daea7,_0x2ef7d5,_0x39a513){return _0x4daea7(_0x2ef7d5,_0x39a513);},'mANcj':function(_0x43ac22,_0x5b8d49){return _0x43ac22 instanceof _0x5b8d49;},'VNNHB':function(_0x2bc73d,_0xad755a){return _0x2bc73d(_0xad755a);},'VZbQj':_0x1fbfe9(0x144),'NYHdH':_0x1fbfe9(0x118),'dllUH':_0x1fbfe9(0x140)};if(_0x21a2db[_0x1fbfe9(0x193)](_0x2bcd0a[_0x1fbfe9(0x185)],0x194)||!_0x2bcd0a[_0x1fbfe9(0xc5)][_0x1fbfe9(0x165)](_0x21a2db[_0x1fbfe9(0x11e)])?.[_0x1fbfe9(0xbc)](_0x1fbfe9(0x187))||_0x2bcd0a['bodyUsed'])return _0x21a2db[_0x1fbfe9(0x14f)]===_0x21a2db[_0x1fbfe9(0x12c)]?this['_originalFetch'](_0x3fd899,_0x193ad3):_0x2bcd0a;try{if(_0x21a2db['ItacQ'](_0x21a2db[_0x1fbfe9(0x109)],_0x21a2db[_0x1fbfe9(0xe1)])){if(_0x21a2db[_0x1fbfe9(0x188)](_0x477685,0x0))return;_0xf6df71[_0x1fbfe9(0x10b)](_0x1fbfe9(0x124),_0x5875e9=>{const _0x29ef7c=_0x1fbfe9,_0x4993e5=_0x21a2db[_0x29ef7c(0x11b)](_0x5875e9[_0x29ef7c(0xba)],_0x28ce6d['x']),_0xeb7a91=_0x5875e9['clientY']-_0x245ce6['y'];_0x235c50[_0x29ef7c(0x192)]+=_0x58e3a6[_0x29ef7c(0x16f)](_0x21a2db[_0x29ef7c(0xd3)](_0x4993e5,_0x4993e5)+_0x21a2db[_0x29ef7c(0x16e)](_0xeb7a91,_0xeb7a91)),_0xe121a0={'x':_0x5875e9['clientX'],'y':_0x5875e9[_0x29ef7c(0x10e)]},_0x127925++;},{'passive':!![]});}else{const _0x3ea42b=await _0x2bcd0a[_0x1fbfe9(0x127)]();if(!_0x3ea42b['challenge']||!_0x3ea42b[_0x1fbfe9(0x115)][_0x1fbfe9(0xd1)])return _0x2bcd0a;console[_0x1fbfe9(0x1a9)]('[Fingerprint]\x20Received\x20a\x20\x27'+_0x3ea42b[_0x1fbfe9(0x115)][_0x1fbfe9(0xd1)]+_0x1fbfe9(0x155));const _0x4b9e05=this[_0x1fbfe9(0x13f)](),_0x2cddff=await _0x21a2db[_0x1fbfe9(0x137)](solveChallenge,_0x3ea42b['challenge'],_0x4b9e05);console[_0x1fbfe9(0x1a9)](_0x1fbfe9(0x17f));const _0x1cc16d=new URL(_0x21a2db[_0x1fbfe9(0x10a)](_0x284668,Request)?_0x284668[_0x1fbfe9(0x130)]:_0x21a2db[_0x1fbfe9(0xec)](String,_0x284668),window[_0x1fbfe9(0xc0)][_0x1fbfe9(0x197)]);return _0x2cddff[_0x1fbfe9(0x17d)](_0x1cc16d),_0x1cc16d[_0x1fbfe9(0x152)][_0x1fbfe9(0x105)](_0x21a2db[_0x1fbfe9(0xf1)],_0x4b9e05),window[_0x1fbfe9(0x13c)](_0x1cc16d[_0x1fbfe9(0xeb)](),_0x6c3172);}}catch(_0x52bae4){if(_0x21a2db[_0x1fbfe9(0x128)]===_0x21a2db['NYHdH'])return console[_0x1fbfe9(0xf2)](_0x21a2db[_0x1fbfe9(0x162)],_0x52bae4),_0x2bcd0a;else this[_0x1fbfe9(0xc7)]=null;}},'initializeClient'(_0x35b617={}){const _0x19a0aa=_0x36a6f6,_0x8af965={'vHzym':function(_0x227008,_0x2a50c2){return _0x227008-_0x2a50c2;},'CvUOR':function(_0x38f3bf,_0x30ad7b){return _0x38f3bf*_0x30ad7b;},'dKjPU':function(_0x4f834c,_0x289ff8){return _0x4f834c*_0x289ff8;},'vlAgr':function(_0x934015,_0x23301f){return _0x934015===_0x23301f;},'uJKrU':_0x19a0aa(0x12f),'FtQJh':function(_0x1380dc,_0x3f2018){return _0x1380dc>_0x3f2018;},'pvjwl':function(_0x4c20fe,_0x2a4b7f){return _0x4c20fe!==_0x2a4b7f;}},{mouse:mouse=!![],keystrokes:keystrokes=!![],honeypots:honeypots=[],fetch:_0x27a2cc={}}=_0x35b617;if(mouse){if(_0x8af965[_0x19a0aa(0x13d)](_0x8af965[_0x19a0aa(0x15a)],_0x8af965['uJKrU']))this[_0x19a0aa(0x167)]();else{const _0x84b29f=_0x8af965[_0x19a0aa(0x1ab)](_0x3172ec[_0x19a0aa(0xba)],_0x4a322a['x']),_0x4ab7a6=_0x31b599['clientY']-_0x479cac['y'];_0xcbd86f['mouseEntropy']+=_0x560864['sqrt'](_0x8af965[_0x19a0aa(0xfb)](_0x84b29f,_0x84b29f)+_0x8af965['dKjPU'](_0x4ab7a6,_0x4ab7a6)),_0x28dbe9={'x':_0x580d32['clientX'],'y':_0x26c274[_0x19a0aa(0x10e)]},_0x59886f++;}}keystrokes&&this['startKeystrokeDynamicsTracker'](),_0x8af965['FtQJh'](honeypots[_0x19a0aa(0xf0)],0x0)&&this[_0x19a0aa(0x161)](honeypots),_0x35b617[_0x19a0aa(0x13c)]&&(this[_0x19a0aa(0xcb)](_0x27a2cc[_0x19a0aa(0x175)]),_0x8af965['pvjwl'](_0x27a2cc[_0x19a0aa(0x142)],![])&&this[_0x19a0aa(0x184)](async(_0x3a3d2f,_0x1424f6,_0x5a499c)=>{const _0x4d43b6=_0x19a0aa,_0xf9a29e=await _0x5a499c(_0x3a3d2f,_0x1424f6);return this[_0x4d43b6(0x182)](_0xf9a29e[_0x4d43b6(0x13e)](),_0x3a3d2f,_0x1424f6);}));}},metrics={'mouseEntropy':0x0,'keystrokeLatency':0x0,'honeypotInteraction':![],'historyLength':0x0,'clientTimestamp':0x0};let lastMousePos={'x':0x0,'y':0x0},mouseMovements=0x0,activeHoneypotListeners=new Map(),keystrokeTimestamps=[],keystrokeLatencies=[];const KEYSTROKE_HISTORY_MAX=0x14;export const getDeviceFingerprint=ClientLibrary[_0x36a6f6(0x13f)][_0x36a6f6(0x119)](ClientLibrary);function _0x1767(){const _0x20c082=['UNMASKED_VENDOR_WEBGL','JiTog','join','apply','vXXJR','rkTpQ','createElement','VzKMM','font','fetch','vlAgr','clone','getDeviceFingerprint','[Fingerprint]\x20Failed\x20to\x20solve\x20or\x20retry\x20challenge:','subtle','handleChallenges','#069','pow_fp','maxTouchPoints','qEBDQ','map','Dszxr','GBdER','mhwig','zMAjP','initializeClient','aDlMf','cQCyS','IYYFp','platform','0|10|5|4|2|3|6|8|1|9|7','searchParams','fingerprint','_resetCache','\x27\x20challenge.\x20Solving...','hcXeO','uOEag','JGbxj','KKGAj','uJKrU','JhsGL','Qvuua','MRvYz','fillText','wRwUh','iNHgS','initializeHoneypots','dllUH','xYzDE','GxZbY','get','getDeviceFingerprint\x20can\x20only\x20be\x20called\x20on\x20the\x20client-side.','startMouseEntropyTracker','LmYoK','120395WhoYZQ','_driver','resolvedOptions','KhHvl','14px\x20\x27Arial\x27','NlgVf','sqrt','padStart','xUITl','navigator','width','X-Behavior-Metrics','targetDomains','experimental-webgl','1352CdlXSJ','getContext','WFqZN','SHA-256','scr','input','applyToUrl','ZlsIY','[Fingerprint]\x20Challenge\x20solved.\x20Retrying\x20original\x20request.','jFsJk','screen','solveChallengeAndRetry','xTTVb','addFetchInterceptor','status','keydown','application/json','agdJu','_isFetchPatched','mUHdh','vWZLU','mgWxo','toDataURL','Terov','Ykgxe','search','eIiyn','mouseEntropy','gpaBr','gQdCY','webgl','10eyGeAs','origin','reduce','176YjTYXP','height','cdc_adoQpoasnfa76pfcZLmcfl_Array','6244546XLbLyq','yXqIF','cdc_adoQpoasnfa76pfcZLmcfl_Symbol','pTLFs','history','WCWAr','ludee','generateRequestSignature','|req:','OyjRb','startKeystrokeDynamicsTracker','fillStyle','ZJikv','log','lRhQp','vHzym','sort','HMAC','textBaseline','keystrokeLatency','snkJf','sign','_interceptorChain','eOvPm','AWJWN','stringify','_selenium','clientX','hostname','includes','undefined','ozxdT','Lfbdu','location','patchGlobalFetch','31542WwhuGF','protectedFetch','TpGlv','headers','cdp','_cachedBuilder','from','honeypotInteraction','historyLength','initializeFetch','generateClientSideSignature','ptAtp','cdc_adoQpoasnfa76pfcZLmcfl_Promise','[name=\x22','pYzra','type','MOqXj','uKCPd','keys','clear','SMoNd','Vnazq','BNjZr','add','split','canvas','alphabetic','oIsdC','ShXUn','3|1|7|9|4|10|5|8|2|6|0','1961460AEuuXZ','WDaIb','querySelector','lAELe','importKey','(((.+)+)+)+$','ccdCX','Gmuxa','DateTimeFormat','HxpKP','onHoneypotTrigger','toString','VNNHB','$cdc_asdjflasutopfhvcZLmcfl_','UdOnC','YvudY','length','VZbQj','error','forEach','bot','some','fVaTy','BVAiO','shift','rAruj','now','CvUOR','FkIBk','372372oQtIgx','crypto','timeZone','AqkYz','hardwareConcurrency','encode','HRdIX','removeEventListener','set','getParameter','DHlHG','deviceMemory','VGHub','mANcj','addEventListener','KHsWw','cAdGH','clientY','19041800GtNTdO','rgba(102,\x20204,\x200,\x200.7)','OYscH','QAfih','fDyok','getClientBehaviorMetrics','challenge','nmBda','jfMws','upqeG','bind','true','cVQko','CYnzE','YpqFG','KcCeo','poDMc','gpu','_originalFetch','RCyvF','getTimezoneOffset','mousemove','aoQcr','push','json','NYHdH','ZPEDq','X-Device-Fingerprint','33453ROjroP','cdHXx','WEBGL_debug_renderer_info','lowDB','chiNc','url','UNMASKED_RENDERER_WEBGL','fillRect'];_0x1767=function(){return _0x20c082;};return _0x1767();}export const generateRequestSignature=ClientLibrary[_0x36a6f6(0x1a3)]['bind'](ClientLibrary);function _0x3ded(_0x575f2d,_0x459484){_0x575f2d=_0x575f2d-0xb9;const _0x2833c4=_0x1767();let _0xf6ed51=_0x2833c4[_0x575f2d];return _0xf6ed51;}export const generateClientSideSignature=ClientLibrary[_0x36a6f6(0xcc)]['bind'](ClientLibrary);export const _resetCache=ClientLibrary[_0x36a6f6(0x154)][_0x36a6f6(0x119)](ClientLibrary);export const startMouseEntropyTracker=ClientLibrary['startMouseEntropyTracker']['bind'](ClientLibrary);export const startKeystrokeDynamicsTracker=ClientLibrary[_0x36a6f6(0x1a6)]['bind'](ClientLibrary);export const initializeHoneypots=ClientLibrary['initializeHoneypots']['bind'](ClientLibrary);export const getClientBehaviorMetrics=ClientLibrary[_0x36a6f6(0x114)][_0x36a6f6(0x119)](ClientLibrary);export const protectedFetch=ClientLibrary[_0x36a6f6(0xc3)][_0x36a6f6(0x119)](ClientLibrary);export const addFetchInterceptor=ClientLibrary[_0x36a6f6(0x184)][_0x36a6f6(0x119)](ClientLibrary);export const patchGlobalFetch=ClientLibrary[_0x36a6f6(0xc1)][_0x36a6f6(0x119)](ClientLibrary);export const initializeFetch=ClientLibrary[_0x36a6f6(0xcb)][_0x36a6f6(0x119)](ClientLibrary);export const initializeClient=ClientLibrary[_0x36a6f6(0x14c)][_0x36a6f6(0x119)](ClientLibrary);export const solveChallengeAndRetry=ClientLibrary[_0x36a6f6(0x182)][_0x36a6f6(0x119)](ClientLibrary);export default ClientLibrary;