class DeviceFingerprint{constructor(){this.fingerprint=this.generateFingerprint()}static fpstr;async generateFingerprint(){if(DeviceFingerprint.fpstr)return DeviceFingerprint.fpstr;const e=[navigator.userAgent,navigator.language,screen.colorDepth,(new Date).getTimezoneOffset(),navigator.platform,navigator.hardwareConcurrency,navigator.deviceMemory||"unknown",this.getCanvasFingerprint(),this.getWebGLFingerprint(),await this.getAudioFingerprint(),this.getInstalledPlugins(),this.getFonts()].join("###");return DeviceFingerprint.fpstr=`FP${this.hashString(e)}`.replace("-","N"),DeviceFingerprint.fpstr}getCanvasFingerprint(){const e=document.createElement("canvas"),t=e.getContext("2d");return t.textBaseline="top",t.font="14px 'Arial'",t.fillStyle="#f60",t.fillRect(125,1,62,20),t.fillStyle="#069",t.fillText("Browser fingerprint",2,15),t.fillStyle="rgba(102, 204, 0, 0.7)",t.fillText("Browser fingerprint",4,17),e.toDataURL()}getWebGLFingerprint(){ const e=document.createElement("canvas"),t=e.getContext("webgl")||e.getContext("experimental-webgl");if(!t)return"no_webgl";const n=t.getExtension("WEBGL_debug_renderer_info");return`Vendor:${t.getParameter(n.UNMASKED_VENDOR_WEBGL)} Renderer:${t.getParameter(n.UNMASKED_RENDERER_WEBGL)}`}async getAudioFingerprint(){try{const e=(window.AudioContext||window.webkitAudioContext)??!1;if(!e)return resolve("audio-worklet-failed"),!1;const t=new e,n=new Blob(["class AudioProcessor extends AudioWorkletProcessor { constructor() { super(); } process(inputs, outputs, parameters) { return true; } } registerProcessor('audio-processor', AudioProcessor); "],{type:"application/javascript"}),r=URL.createObjectURL(n);await t.audioWorklet.addModule(r);const i=new AudioWorkletNode(t,"audio-processor");return i.connect(t.destination),new Promise((e=>{setTimeout((()=>{e(i.port?"audio-worklet-success":"audio-worklet-failed"),t.close()}),500)}))}catch(e){return"audio-fingerprint-failed"}}getInstalledPlugins(){ return navigator.plugins?Array.from(navigator.plugins).map((e=>`${e.name} - ${e.description}`)).join("###"):"no_plugins"}getFonts(){const e=[],t=document.createElement("canvas").getContext("2d");return["Arial","Verdana","Times New Roman","Courier New","Comic Sans MS"].forEach((n=>{t.font=`72px ${n}, monospace`;const r=t.measureText("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").width;t.font="72px monospace",r!==t.measureText("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").width&&e.push(n)})),e.join("###")}hashString(e){let t=0;if(0===e.length)return t;for(let n=0;n