unshared-frontend-sdk 2.3.0 → 3.0.0-rc.14
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 +56 -35
- package/dist/browser.d.ts +43 -37
- package/dist/fingerprint-agent.d.ts +3 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/shared-types.d.ts +148 -0
- package/package.json +3 -3
package/dist/index.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).UnsharedBrowser={})}(this,function(e){"use strict";const t="1.3.3",n=1282368115,r={exclude:[],include:[],timeout:3e3,stabilize:["private","iframe","always"],experimental:!1,debug:!1,salt:""},o=new Set(["audio","timing","navigatorConnection","domrect","permissions","fonts","speech","display","cssLayout"]),i=new Set(["domrect"]),a=new Set(["screen","mediaCapabilities","storage","features","sensors","battery","gamepads","webApis","notificationState","extendedLocale","privacyPrefs","performanceContext","canvas","audioOscillator","webglRender","canvasTextMetrics","vendorFlavors","fontPreferences","screenFrame","clientHints","domBlockers","privateClickMeasurement","automationDetection","agentDetection","tamperDetection","vmDetection","devtoolsDetection"]),c={always:[{exclude:["speech"],browsers:["brave","firefox"]},{exclude:["keyboard"],browsers:["firefox","safari"]},{exclude:["workers"],browsers:["firefox"]},{exclude:["hardwareSensitive","navigatorProps"],browsers:["brave"]},{exclude:["canvas","audioOscillator","webglRender","canvasTextMetrics"],browsers:["brave"]},{exclude:["canvas"],browsers:["firefox"]}],private:[{exclude:["fonts"],browsers:["firefox"]},{exclude:["audio"],browsers:["safari","brave"]},{exclude:["audioOscillator"],browsers:["safari"]}],iframe:[{exclude:["applePay"],browsers:["safari"]},{exclude:["permissions"]},{exclude:["keyboard"]}]};let s=null;function u(){if(s)return s;const e=navigator.userAgent;return s=function(){const e=navigator.brave;return!!e&&"function"==typeof e.isBrave}()?{name:"brave",version:l(e,/Chrome\/([\d.]+)/)}:/Edg\//i.test(e)?{name:"edge",version:l(e,/Edg\/([\d.]+)/)}:/OPR\//i.test(e)||/Opera/i.test(e)?{name:"opera",version:l(e,/OPR\/([\d.]+)/)||l(e,/Opera\/([\d.]+)/)}:/SamsungBrowser/i.test(e)?{name:"samsung",version:l(e,/SamsungBrowser\/([\d.]+)/)}:/Firefox\//i.test(e)?{name:"firefox",version:l(e,/Firefox\/([\d.]+)/)}:/Safari\//i.test(e)&&!/Chrome/i.test(e)?{name:"safari",version:l(e,/Version\/([\d.]+)/)}:/Chrome\//i.test(e)?{name:"chrome",version:l(e,/Chrome\/([\d.]+)/)}:{name:"unknown",version:""},s}function l(e,t){const n=e.match(t);return n?.[1]??""}function d(e,t){const n=e[0]>>>16,r=65535&e[0],o=e[1]>>>16,i=65535&e[1],a=t[0]>>>16,c=65535&t[0],s=t[1]>>>16;let u=0,l=0,d=0,f=0,m=0;return l=i+(65535&t[1]),u=l>>>16,l&=65535,d=o+s+u,u=d>>>16,d&=65535,f=r+c+u,u=f>>>16,f&=65535,m=n+a+u,m&=65535,[m<<16|f,d<<16|l]}function f(e,t){const n=e[0]>>>16,r=65535&e[0],o=e[1]>>>16,i=65535&e[1],a=t[0]>>>16,c=65535&t[0],s=t[1]>>>16,u=65535&t[1];let l=0,d=0,f=0,m=0,h=0;return d=i*u,l=d>>>16,d&=65535,f=o*u+l,l=f>>>16,f&=65535,f+=i*s,l+=f>>>16,f&=65535,m=r*u+l,l=m>>>16,m&=65535,m+=o*s,l+=m>>>16,m&=65535,m+=i*c,l+=m>>>16,m&=65535,h=n*u+r*s+o*c+i*a+l,h&=65535,[h<<16|m,f<<16|d]}function m(e,t){return 32==(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])}function h(e,t){return 0==(t%=64)?[e[0],e[1]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]}function p(e,t){return[e[0]^t[0],e[1]^t[1]]}function y(e){let t=[e[0],e[1]];return t=p(t,[0,t[0]>>>1]),t=f(t,[4283543511,3981806797]),t=p(t,[0,t[0]>>>1]),t=f(t,[3301882366,444984403]),t=p(t,[0,t[0]>>>1]),t}function g(e){return("00000000"+(e>>>0).toString(16)).slice(-8)}function w(e,t=0){const n=e.length%16,r=e.length-n;let o=[0,t],i=[0,t];const a=[2277735313,289559509],c=[1291169091,658871167];for(let t=0;t<r;t+=16){let n=[255&e.charCodeAt(t+4)|(255&e.charCodeAt(t+5))<<8|(255&e.charCodeAt(t+6))<<16|(255&e.charCodeAt(t+7))<<24,255&e.charCodeAt(t)|(255&e.charCodeAt(t+1))<<8|(255&e.charCodeAt(t+2))<<16|(255&e.charCodeAt(t+3))<<24],r=[255&e.charCodeAt(t+12)|(255&e.charCodeAt(t+13))<<8|(255&e.charCodeAt(t+14))<<16|(255&e.charCodeAt(t+15))<<24,255&e.charCodeAt(t+8)|(255&e.charCodeAt(t+9))<<8|(255&e.charCodeAt(t+10))<<16|(255&e.charCodeAt(t+11))<<24];n=f(n,a),n=m(n,31),n=f(n,c),o=p(o,n),o=m(o,27),o=d(o,i),o=d(f(o,[0,5]),[0,1390208809]),r=f(r,c),r=m(r,33),r=f(r,a),i=p(i,r),i=m(i,31),i=d(i,o),i=d(f(i,[0,5]),[0,944331445])}let s=[0,0],u=[0,0];switch(n){case 15:u=p(u,h([0,e.charCodeAt(r+14)],48));case 14:u=p(u,h([0,e.charCodeAt(r+13)],40));case 13:u=p(u,h([0,e.charCodeAt(r+12)],32));case 12:u=p(u,h([0,e.charCodeAt(r+11)],24));case 11:u=p(u,h([0,e.charCodeAt(r+10)],16));case 10:u=p(u,h([0,e.charCodeAt(r+9)],8));case 9:u=p(u,[0,e.charCodeAt(r+8)]),u=f(u,c),u=m(u,33),u=f(u,a),i=p(i,u);case 8:s=p(s,h([0,e.charCodeAt(r+7)],56));case 7:s=p(s,h([0,e.charCodeAt(r+6)],48));case 6:s=p(s,h([0,e.charCodeAt(r+5)],40));case 5:s=p(s,h([0,e.charCodeAt(r+4)],32));case 4:s=p(s,h([0,e.charCodeAt(r+3)],24));case 3:s=p(s,h([0,e.charCodeAt(r+2)],16));case 2:s=p(s,h([0,e.charCodeAt(r+1)],8));case 1:s=p(s,[0,e.charCodeAt(r)]),s=f(s,a),s=m(s,31),s=f(s,c),o=p(o,s)}return o=p(o,[0,e.length]),i=p(i,[0,e.length]),o=d(o,i),i=d(i,o),o=y(o),i=y(i),o=d(o,i),i=d(i,o),g(o[0])+g(o[1])+g(i[0])+g(i[1])}function v(e){return b(e,new Set)}function b(e,t){if(null===e)return"null";if(void 0===e)return"undefined";const n=typeof e;if("boolean"===n||"number"===n)return String(e);if("string"===n)return JSON.stringify(e);if(Array.isArray(e)){if(t.has(e))return'"[Circular]"';t.add(e);const n=e.map(e=>b(e,t));return t.delete(e),"["+n.join(",")+"]"}if("object"===n){const n=e;if(t.has(n))return'"[Circular]"';t.add(n);const r=Object.keys(n).sort().filter(e=>void 0!==n[e]).map(e=>JSON.stringify(e)+":"+b(n[e],t));return t.delete(n),"{"+r.join(",")+"}"}return String(e)}const _=w("",n);function x(e,t){const r=function(e){if(0===e.length)return w("",n);if(1===e.length)return w(e[0],n);let t=[...e];for(;t.length>1;){const e=[];for(let r=0;r<t.length;r+=2){const o=r+1<t.length?t[r+1]:_;e.push(w(t[r]+o,n))}t=e}return t[0]}(Object.keys(e).sort().map(t=>{const r=function(e){let t=n;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),1540483477),t^=t>>>13;return t>>>0}(t);return w(v(e[t]),r)})),o=String.fromCharCode(76,111,98,115),i=t?w(t,n):"";return w(r+o+i,n)}const S={name:"webgl",tier:1,async collect(){const e=document.createElement("canvas"),t=e.getContext("webgl")||e.getContext("experimental-webgl");if(!(t&&t instanceof WebGLRenderingContext))return null;const n=t.getExtension("WEBGL_debug_renderer_info"),r=t.getSupportedExtensions()??[],o=function(e){const t={},n=[e.VERTEX_SHADER,e.FRAGMENT_SHADER],r=[e.LOW_FLOAT,e.MEDIUM_FLOAT,e.HIGH_FLOAT,e.LOW_INT,e.MEDIUM_INT,e.HIGH_INT],o=["vertex","fragment"],i=["lowFloat","mediumFloat","highFloat","lowInt","mediumInt","highInt"];for(let a=0;a<n.length;a++){const c={};for(let t=0;t<r.length;t++){const o=e.getShaderPrecisionFormat(n[a],r[t]);o&&(c[i[t]]={rangeMin:o.rangeMin,rangeMax:o.rangeMax,precision:o.precision})}t[o[a]]=c}return t}(t),i={vendor:t.getParameter(t.VENDOR),renderer:t.getParameter(t.RENDERER),version:t.getParameter(t.VERSION),shadingLanguageVersion:t.getParameter(t.SHADING_LANGUAGE_VERSION),unmaskedVendor:n?t.getParameter(n.UNMASKED_VENDOR_WEBGL):null,unmaskedRenderer:n?t.getParameter(n.UNMASKED_RENDERER_WEBGL):null,extensions:r.sort(),maxTextureSize:t.getParameter(t.MAX_TEXTURE_SIZE),maxRenderbufferSize:t.getParameter(t.MAX_RENDERBUFFER_SIZE),maxViewportDims:Array.from(t.getParameter(t.MAX_VIEWPORT_DIMS)),maxVertexAttribs:t.getParameter(t.MAX_VERTEX_ATTRIBS),maxVertexUniformVectors:t.getParameter(t.MAX_VERTEX_UNIFORM_VECTORS),maxFragmentUniformVectors:t.getParameter(t.MAX_FRAGMENT_UNIFORM_VECTORS),maxVaryingVectors:t.getParameter(t.MAX_VARYING_VECTORS),aliasedLineWidthRange:Array.from(t.getParameter(t.ALIASED_LINE_WIDTH_RANGE)),aliasedPointSizeRange:Array.from(t.getParameter(t.ALIASED_POINT_SIZE_RANGE)),maxCombinedTextureImageUnits:t.getParameter(t.MAX_COMBINED_TEXTURE_IMAGE_UNITS),maxTextureImageUnits:t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS),maxVertexTextureImageUnits:t.getParameter(t.MAX_VERTEX_TEXTURE_IMAGE_UNITS),shaderPrecision:o,maxAnisotropy:k(t),webgl2:C(e)};return t.getExtension("WEBGL_lose_context")?.loseContext(),i}};function k(e){try{const t=e.getExtension("EXT_texture_filter_anisotropic")??e.getExtension("WEBKIT_EXT_texture_filter_anisotropic")??e.getExtension("MOZ_EXT_texture_filter_anisotropic");return t?e.getParameter(t.MAX_TEXTURE_MAX_ANISOTROPY_EXT):null}catch{return null}}function C(e){try{const t=e.getContext("webgl2");if(!t)return null;const n={version:t.getParameter(t.VERSION),maxSamples:t.getParameter(t.MAX_SAMPLES),max3DTextureSize:t.getParameter(t.MAX_3D_TEXTURE_SIZE),maxArrayTextureLayers:t.getParameter(t.MAX_ARRAY_TEXTURE_LAYERS),maxUniformBlockSize:t.getParameter(t.MAX_UNIFORM_BLOCK_SIZE),maxVertexUniformComponents:t.getParameter(t.MAX_VERTEX_UNIFORM_COMPONENTS),maxFragmentUniformComponents:t.getParameter(t.MAX_FRAGMENT_UNIFORM_COMPONENTS),maxColorAttachments:t.getParameter(t.MAX_COLOR_ATTACHMENTS),maxDrawBuffers:t.getParameter(t.MAX_DRAW_BUFFERS)};return t.getExtension("WEBGL_lose_context")?.loseContext(),n}catch{return null}}const E={name:"hardware",tier:1,collect:async()=>({architecture:$(),platform:D()})},A={name:"hardwareSensitive",tier:1,collect:async()=>({deviceMemory:navigator.deviceMemory??null,hardwareConcurrency:navigator.hardwareConcurrency??null})};function D(){const e=navigator.userAgentData;if(e?.platform)return e.platform;const t=navigator.userAgent??"";return/Windows/.test(t)?"Windows":/Macintosh|Mac OS X/.test(t)?"macOS":/CrOS/.test(t)?"Chrome OS":/Android/.test(t)?"Android":/Linux/.test(t)?"Linux":/iPhone|iPad|iPod/.test(t)?"iOS":""}function $(){try{const e=new ArrayBuffer(4),t=new Float32Array(e),n=new Uint8Array(e);return t[0]=1/0,n[3]}catch{return 0}}const I={name:"math",tier:1,collect:async()=>({acos:Math.acos(.5),asin:M(Math.asin,-1,1,97),cos:M(Math.cos,0,Math.PI,97),cosLarge:Math.cos(1e20),sinLarge:Math.sin(1e20),tanLarge:Math.tan(1e20),sin:M(Math.sin,0,Math.PI,97),tan:M(Math.tan,0,Math.PI/4,97)})};function M(e,t,n,r){const o=(n-t)/r;let i=e(t)+e(n);for(let n=1;n<r;n++)i+=e(t+n*o)*(n%2==0?2:4);return i*o/3}const T={name:"i18n",tier:1,collect:async()=>({dateTimeFormat:P(),numberFormat:O(),collator:L(),pluralRules:R(),relativeTimeFormat:F(),listFormat:B()})};function P(){try{const e=(new Intl.DateTimeFormat).resolvedOptions();return{locale:e.locale,calendar:e.calendar,numberingSystem:e.numberingSystem,timeZone:e.timeZone}}catch{return{}}}function O(){try{const e=(new Intl.NumberFormat).resolvedOptions();return{locale:e.locale,numberingSystem:e.numberingSystem,style:e.style,minimumIntegerDigits:e.minimumIntegerDigits,minimumFractionDigits:e.minimumFractionDigits,maximumFractionDigits:e.maximumFractionDigits,useGrouping:e.useGrouping}}catch{return{}}}function L(){try{const e=(new Intl.Collator).resolvedOptions();return{locale:e.locale,usage:e.usage,sensitivity:e.sensitivity,collation:e.collation,numeric:e.numeric,caseFirst:e.caseFirst}}catch{return{}}}function R(){try{const e=(new Intl.PluralRules).resolvedOptions(),t=new Intl.PluralRules(void 0,{type:"ordinal"}).resolvedOptions();return{locale:e.locale,type:e.type,cardinalCategories:(new Intl.PluralRules).select(0)+","+(new Intl.PluralRules).select(1)+","+(new Intl.PluralRules).select(2)+","+(new Intl.PluralRules).select(5)+","+(new Intl.PluralRules).select(11)+","+(new Intl.PluralRules).select(100),ordinalCategory1:t.type,minimumIntegerDigits:e.minimumIntegerDigits}}catch{return{}}}function F(){try{const e=new Intl.RelativeTimeFormat;if(!e)return{};const t=e.resolvedOptions();return{locale:t.locale,style:t.style,numeric:t.numeric,numberingSystem:t.numberingSystem}}catch{return{}}}function B(){try{const e=new Intl.ListFormat;if(!e)return{};const t=e.resolvedOptions(),n=["X","Y","Z"],r=new Intl.ListFormat(void 0,{type:"conjunction",style:"long"}),o=new Intl.ListFormat(void 0,{type:"disjunction",style:"long"});return{locale:t.locale,type:t.type,style:t.style,conjunctionSample:r.format(n),disjunctionSample:o.format(n)}}catch{return{}}}const U={name:"domrect",tier:1,collect:async()=>({basic:function(){const e=document.createElement("div");e.style.cssText="position:fixed;left:-9999px;width:100px;height:100px;",document.body.appendChild(e);const t=e.getBoundingClientRect();return document.body.removeChild(e),{x:t.x,y:t.y,width:t.width,height:t.height,top:t.top,right:t.right,bottom:t.bottom,left:t.left}}(),precision:function(){const e=document.createElement("div");e.style.cssText=`position:absolute;left:-9999px;width:${Math.PI}px;height:${Math.E}px;`,document.body.appendChild(e);const t=e.getBoundingClientRect();return document.body.removeChild(e),{width:t.width,height:t.height}}(),fromRect:"undefined"!=typeof DOMRectReadOnly&&"function"==typeof DOMRectReadOnly.fromRect})},j={name:"touch",tier:1,collect:async()=>({supported:"ontouchstart"in window||navigator.maxTouchPoints>0,maxTouchPoints:navigator.maxTouchPoints??0})},z={name:"display",tier:1,collect:async()=>({colorDepth:screen.colorDepth??0,pixelDepth:screen.pixelDepth??0})},W={name:"locale",tier:1,collect:async()=>({timezone:Intl.DateTimeFormat().resolvedOptions().timeZone??"",language:navigator.language??""})},V={name:"workers",tier:1,collect:async()=>({webWorker:"undefined"!=typeof Worker,sharedWorker:"undefined"!=typeof SharedWorker,serviceWorker:"serviceWorker"in navigator})},N={name:"plugins",tier:1,async collect(){const e=[];if(navigator.plugins)for(let t=0;t<navigator.plugins.length;t++){const n=navigator.plugins[t];"internal-pdf-viewer"===n.filename&&e.push(`${n.name}|${n.filename}|${n.description}`)}return{plugins:e.sort(),pdfViewerEnabled:navigator.pdfViewerEnabled??!1}}},G=[["backdrop-filter","blur(1px)"],["container-type","inline-size"],["text-wrap","balance"],["overscroll-behavior","contain"],["hanging-punctuation","first"],["-webkit-line-clamp","1"],["appearance","none"],["font-size-adjust","ex-height 0.5"],["font-palette","normal"],["field-sizing","content"],["-webkit-text-stroke","1px black"],["zoom","1"],["scrollbar-width","thin"],["scrollbar-color","red blue"],["animation-timeline","auto"],["mask-composite","add"],["offset-path","none"],["text-decoration-thickness","1px"],["content-visibility","auto"],["contain-intrinsic-size","auto 100px"],["aspect-ratio","16/9"],["gap","10px"],["color-mix","in srgb, red 50%, blue"],["linear-gradient(in oklch, red, blue)",""]],q={name:"css",tier:1,collect:async()=>({supports:H(),safeArea:K()})};function H(){const e={};if("undefined"==typeof CSS||"function"!=typeof CSS.supports)return e;for(const[t,n]of G)e[t]=n?CSS.supports(t,n):CSS.supports(t);return e}function K(){try{const e=document.createElement("div");e.style.cssText=["position:fixed","top:0","left:0","width:0","height:0","visibility:hidden","padding-top:env(safe-area-inset-top,0px)","padding-bottom:env(safe-area-inset-bottom,0px)","padding-left:env(safe-area-inset-left,0px)","padding-right:env(safe-area-inset-right,0px)"].join(";"),document.body.appendChild(e);const t=getComputedStyle(e),n={top:t.paddingTop,bottom:t.paddingBottom,left:t.paddingLeft,right:t.paddingRight};return document.body.removeChild(e),n}catch{return null}}const J={name:"cssLayout",tier:1,collect:async()=>({scrollbarWidth:Y()})};function Y(){try{const e=document.createElement("div");e.style.cssText="visibility:hidden;overflow:scroll;position:absolute;top:-9999px;width:100px;height:100px",document.body.appendChild(e);const t=document.createElement("div");e.appendChild(t);const n=e.offsetWidth-t.offsetWidth;return document.body.removeChild(e),n}catch{return-1}}const X={name:"navigatorProps",tier:1,collect:async()=>({vendor:navigator.vendor??"",productSub:navigator.productSub??"",cookieEnabled:navigator.cookieEnabled})},Q={name:"navigatorConnection",tier:2,async collect(){const e=navigator,t=e.connection??e.mozConnection??e.webkitConnection??null,n=performance.memory??null;return{connection:t?{type:t.type??null,effectiveType:t.effectiveType??null,saveData:t.saveData??null}:null,memory:n?{jsHeapSizeLimit:n.jsHeapSizeLimit}:null}}},Z={name:"timing",tier:2,collect:async()=>({performancePrecisionUs:ee()})};function ee(){try{const e=performance.now();let t=1/0,n=e;for(let r=0;r<50;r++){const r=performance.now(),o=r-n;if(o>0&&o<t&&(t=o),n=r,r-e>=1)break}if(t===1/0)return-1;const r=1e3*t;if(r<=0)return-1;const o=Math.max(0,Math.round(Math.log10(r)));return Math.pow(10,o)}catch{return-1}}const te={name:"webgpu",tier:2,async collect(){const e=navigator.gpu;if(!e)return null;const t=await e.requestAdapter();if(!t)return null;let n="",r="",o="",i="";if(t.info)n=t.info.vendor??"",r=t.info.architecture??"",o=t.info.device??"",i=t.info.description??"";else if("function"==typeof t.requestAdapterInfo){const e=await t.requestAdapterInfo();n=e.vendor??"",r=e.architecture??"",o=e.device??"",i=e.description??""}const a=[];t.features&&(t.features.forEach(e=>a.push(e)),a.sort());const c={};if(t.limits){const e=["maxTextureDimension1D","maxTextureDimension2D","maxTextureDimension3D","maxTextureArrayLayers","maxBindGroups","maxBindGroupsPlusVertexBuffers","maxBindingsPerBindGroup","maxDynamicUniformBuffersPerPipelineLayout","maxDynamicStorageBuffersPerPipelineLayout","maxSampledTexturesPerShaderStage","maxSamplersPerShaderStage","maxStorageBuffersPerShaderStage","maxStorageTexturesPerShaderStage","maxUniformBuffersPerShaderStage","maxUniformBufferBindingSize","maxStorageBufferBindingSize","minUniformBufferOffsetAlignment","minStorageBufferOffsetAlignment","maxVertexBuffers","maxBufferSize","maxVertexAttributes","maxVertexBufferArrayStride","maxInterStageShaderComponents","maxInterStageShaderVariables","maxColorAttachments","maxColorAttachmentBytesPerSample","maxComputeWorkgroupStorageSize","maxComputeInvocationsPerWorkgroup","maxComputeWorkgroupSizeX","maxComputeWorkgroupSizeY","maxComputeWorkgroupSizeZ","maxComputeWorkgroupsPerDimension"];for(const n of e){const e=t.limits[n];void 0!==e&&(c[n]=e)}}return{vendor:n,architecture:r,device:o,description:i,features:a,limits:c}}},ne={name:"audio",tier:2,async collect(){const e=window.AudioContext||window.webkitAudioContext;if(!e)return null;let t=null;try{t=new e;const n=t.destination;return{sampleRate:t.sampleRate,maxChannelCount:n.maxChannelCount,channelCount:n.channelCount,channelCountMode:n.channelCountMode,channelInterpretation:n.channelInterpretation,baseLatency:t.baseLatency??null,outputLatency:t.outputLatency??null}}finally{if(t&&"closed"!==t.state)try{await t.close()}catch{}}}},re=["Arial","Arial Black","Arial Narrow","Arial Rounded MT Bold","Bookman Old Style","Bradley Hand","Calibri","Cambria","Cambria Math","Century","Century Gothic","Comic Sans MS","Consolas","Courier","Courier New","Garamond","Geneva","Georgia","Gill Sans","Helvetica","Helvetica Neue","Impact","Lucida Console","Lucida Grande","Lucida Sans Unicode","Microsoft Sans Serif","Monaco","Palatino","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Tahoma","Times","Times New Roman","Trebuchet MS","Verdana","Wingdings","Wingdings 2","Wingdings 3","Inter","Roboto","Open Sans","Lato","Montserrat","Poppins","Nunito","Raleway","Ubuntu","Merriweather","Playfair Display","Source Sans Pro","Source Code Pro","Fira Code","JetBrains Mono","Cascadia Code","Apple Color Emoji","Segoe UI Emoji","Noto Color Emoji","SF Pro","SF Pro Display","SF Mono","San Francisco","Menlo","Andale Mono","Futura","MS Gothic","MS Mincho","MS PGothic","MS PMincho","Yu Gothic","Meiryo","Hiragino Sans","Hiragino Kaku Gothic Pro","SimSun","SimHei","Microsoft YaHei","PingFang SC","Noto Sans CJK","Malgun Gothic","Arial Hebrew"],oe=["monospace","sans-serif","serif"],ie="mmMwWLliI0O&1",ae={name:"fonts",tier:2,collect:()=>new Promise(e=>{const t=()=>e(function(){try{if("undefined"==typeof document)return{available:[],method:"css-layout"};const e=new Set,t=[];if("function"==typeof document.fonts?.check)for(const n of re)document.fonts.check(`72px "${n}"`)?e.add(n):t.push(n);else t.push(...re);const n=new Set;if(t.length>0){const e=document.createElement("div");e.style.cssText="position:absolute;visibility:hidden;top:-9999px;left:-9999px;pointer-events:none;";const r=oe.map(t=>{const n=document.createElement("span");return n.style.cssText=`font-size:72px;font-family:${t};white-space:nowrap;display:inline-block`,n.textContent=ie,e.appendChild(n),n}),o=t.map(t=>oe.map(n=>{const r=document.createElement("span");return r.style.cssText=`font-size:72px;font-family:'${t}',${n};white-space:nowrap;display:inline-block`,r.textContent=ie,e.appendChild(r),r}));document.body.appendChild(e);const i=r.map(e=>e.getBoundingClientRect().width),a=o.map(e=>e.map(e=>e.getBoundingClientRect().width));document.body.removeChild(e);for(let e=0;e<t.length;e++)for(let r=0;r<oe.length;r++)if(a[e][r]!==i[r]){n.add(t[e]);break}}return{available:re.filter(t=>e.has(t)||n.has(t)),method:"css-layout"}}catch{return{available:[],method:"css-layout"}}}());"undefined"!=typeof requestIdleCallback?requestIdleCallback(t,{timeout:2e3}):setTimeout(t,0)})},ce={name:"webrtc",tier:2,async collect(){if("undefined"==typeof RTCPeerConnection)return{supported:!1,audioCodecCount:0,videoCodecCount:0,audioCodecs:[],videoCodecs:[],extensions:[]};const e=new RTCPeerConnection({iceServers:[]});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=(await e.createOffer()).sdp??"",n=se(t,"audio"),r=se(t,"video"),o=function(e){const t=new Set,n=e.split("\r\n");for(const e of n)if(e.startsWith("a=extmap:")){const n=e.match(/^a=extmap:\d+(?:\/\w+)?\s+(.+)$/);n&&t.add(n[1].trim())}return Array.from(t)}(t);return{supported:!0,audioCodecCount:n.length,videoCodecCount:r.length,audioCodecs:n.sort(),videoCodecs:r.sort(),extensions:o.sort()}}finally{e.close()}}};function se(e,t){const n=[],r=e.split("\r\n");let o=!1;for(const e of r)if(e.startsWith(`m=${t}`))o=!0;else{if(e.startsWith("m=")&&o)break;if(o&&e.startsWith("a=rtpmap:")){const t=e.match(/^a=rtpmap:\d+\s+(.+)$/);t&&n.push(t[1])}}return n}const ue=["accelerometer","accessibility-events","ambient-light-sensor","background-fetch","background-sync","bluetooth","camera","clipboard-read","clipboard-write","display-capture","geolocation","gyroscope","local-fonts","magnetometer","microphone","midi","nfc","notifications","payment-handler","persistent-storage","push","screen-wake-lock","speaker-selection","storage-access","top-level-storage-access","window-management","xr-spatial-tracking"],le={name:"permissions",tier:2,async collect(){if(!navigator.permissions?.query)return{states:{}};const e=()=>Promise.allSettled(ue.map(async e=>{try{return{name:e,state:(await navigator.permissions.query({name:e})).state}}catch{return{name:e,state:"error"}}})),t=await Promise.all([e(),e(),e()]),n={};for(const e of t)for(const t of e)if("fulfilled"===t.status){const{name:e,state:r}=t.value;n[e]||(n[e]=[]),n[e].push(r)}const r={};for(const[e,t]of Object.entries(n))r[e]=de(t);return{states:r}}};function de(e){const t={};for(const n of e)t[n]=(t[n]??0)+1;let n=e[0],r=0;for(const[e,o]of Object.entries(t))o>r&&(n=e,r=o);return n}const fe={name:"speech",tier:2,async collect(){if("undefined"==typeof speechSynthesis)return{supported:!1,voiceCount:0,voices:[]};const e=await new Promise(e=>{const t=speechSynthesis.getVoices();if(t.length>0)return void e(t);const n=setTimeout(()=>e([]),800);speechSynthesis.addEventListener("voiceschanged",()=>{clearTimeout(n),e(speechSynthesis.getVoices())},{once:!0})}),t=e.map(e=>`${e.name}|${e.lang}|${e.localService}`).sort();return{supported:!0,voiceCount:e.length,voices:t}}},me=[{name:"prefers-contrast",values:["no-preference","more","less","custom"]},{name:"any-hover",values:["none","hover"]},{name:"any-pointer",values:["none","coarse","fine"]},{name:"pointer",values:["none","coarse","fine"]},{name:"hover",values:["none","hover"]},{name:"update",values:["none","slow","fast"]},{name:"inverted-colors",values:["none","inverted"]},{name:"prefers-reduced-motion",values:["no-preference","reduce"]},{name:"prefers-reduced-transparency",values:["no-preference","reduce"]},{name:"scripting",values:["none","initial-only","enabled"]},{name:"forced-colors",values:["none","active"]},{name:"prefers-color-scheme",values:["light","dark"]},{name:"color-gamut",values:["srgb","p3","rec2020"]},{name:"dynamic-range",values:["standard","high"]}],he={name:"mediaQueries",tier:2,async collect(){if("function"!=typeof matchMedia){const e={};for(const t of me)e[t.name.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())]="unsupported";return{...e,monochrome:0}}const e={};for(const t of me){let n="unknown";for(const e of t.values){const r=matchMedia(`(${t.name}: ${e})`);if(r?.matches){n=e;break}}e[t.name.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())]=n}let t=0;for(let e=100;e>=0;e--)if(matchMedia(`(monochrome: ${e})`)?.matches){t=e;break}return{...e,monochrome:t}}},pe={name:"applePay",tier:2,async collect(){const e=window.ApplePaySession;if(!e||"function"!=typeof e.supportsVersion)return{supported:!1,maxVersion:0};let t=0;for(let n=15;n>=1;n--)try{if(e.supportsVersion(n)){t=n;break}}catch{continue}return{supported:!0,maxVersion:t}}},ye=["KeyQ","KeyW","KeyA","KeyS","KeyZ","KeyX","KeyY","KeyM","Semicolon","BracketLeft","Quote","Digit1","Digit2","Digit3"],ge={name:"keyboard",tier:2,async collect(){const e=navigator.keyboard;if(!e||"function"!=typeof e.getLayoutMap)return{supported:!1,layoutKeys:null,layoutHint:null};try{const t=await e.getLayoutMap(),n={};for(const e of ye){const r=t.get(e);void 0!==r&&(n[e]=r)}return{supported:!0,layoutKeys:n,layoutHint:we(n)}}catch{return{supported:!1,layoutKeys:null,layoutHint:null}}}};function we(e){const t=e.KeyQ,n=e.KeyZ,r=e.KeyY;return t?"a"===t?"azerty":"q"===t&&"z"===r?"qwertz":"q"===t&&"z"===n?"qwerty":"'"===t?"dvorak":"other":null}const ve={name:"canvas",tier:2,async collect(){const e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return null;e.width=240,e.height=120,t.textBaseline="alphabetic",t.fillStyle="#f60",t.fillRect(100,1,62,20),t.fillStyle="#069",t.font='11pt "Times New Roman"',t.fillText("Cwm fjordbank gly"+String.fromCharCode(55357,56835),2,15),t.fillStyle="rgba(102,204,0,0.2)",t.font="18pt Arial",t.fillText("Cwm fjordbank gly"+String.fromCharCode(55357,56835),4,45);const n=e.toDataURL("image/png");t.clearRect(0,0,e.width,e.height),t.globalCompositeOperation="multiply",t.fillStyle="#f2f",t.beginPath(),t.arc(40,40,40,0,2*Math.PI),t.fill(),t.fillStyle="#2ff",t.beginPath(),t.arc(80,40,40,0,2*Math.PI),t.fill(),t.fillStyle="#ff2",t.beginPath(),t.arc(60,80,40,0,2*Math.PI),t.fill(),t.globalCompositeOperation="source-over",t.fillStyle="#f9c",t.beginPath(),t.arc(60,60,60,0,2*Math.PI),t.arc(60,60,20,0,2*Math.PI),t.fill("evenodd");const r=e.toDataURL("image/png");return{textDataUrl:n,geometryDataUrl:r,readbackAllowed:n.length>=1e3&&r.length>=1e3,windingRule:0===t.getImageData(60,60,1,1).data[3]}}},be={name:"audioOscillator",tier:2,async collect(){const e=window.OfflineAudioContext||window.webkitOfflineAudioContext;if(!e)return null;const t=new e(1,5e3,44100),n=t.createOscillator();n.type="triangle",n.frequency.value=1e4;const r=t.createDynamicsCompressor();r.threshold.value=-50,r.knee.value=40,r.ratio.value=12,r.attack.value=0,r.release.value=.25,n.connect(r),r.connect(t.destination),n.start(0);const o=(await t.startRendering()).getChannelData(0).slice(4500,5e3);let i=0;for(let e=0;e<o.length;e++)i+=Math.abs(o[e]);return{sampleSum:i,sampleCount:o.length}}},_e={name:"webglRender",tier:2,async collect(){const e=document.createElement("canvas");e.width=256,e.height=256;const t=e.getContext("webgl",{preserveDrawingBuffer:!0});if(!t)return null;try{const e="\n attribute vec2 position;\n attribute vec3 color;\n varying vec3 vColor;\n void main() {\n gl_Position = vec4(position, 0.0, 1.0);\n vColor = color;\n }\n ",n="\n precision mediump float;\n varying vec3 vColor;\n void main() {\n gl_FragColor = vec4(vColor, 1.0);\n }\n ",r=t.createShader(t.VERTEX_SHADER);t.shaderSource(r,e),t.compileShader(r);const o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,n),t.compileShader(o);const i=t.createProgram();t.attachShader(i,r),t.attachShader(i,o),t.linkProgram(i),t.useProgram(i);const a=new Float32Array([-.5,-.5,1,0,0,.5,-.5,0,1,0,0,.5,0,0,1]),c=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,c),t.bufferData(t.ARRAY_BUFFER,a,t.STATIC_DRAW);const s=t.getAttribLocation(i,"position");t.enableVertexAttribArray(s),t.vertexAttribPointer(s,2,t.FLOAT,!1,20,0);const u=t.getAttribLocation(i,"color");t.enableVertexAttribArray(u),t.vertexAttribPointer(u,3,t.FLOAT,!1,20,8),t.clearColor(0,0,0,1),t.clear(t.COLOR_BUFFER_BIT),t.drawArrays(t.TRIANGLES,0,3),t.enable(t.BLEND),t.blendFunc(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA),t.drawArrays(t.TRIANGLES,0,3);const l=new Uint8Array(262144);t.readPixels(0,0,256,256,t.RGBA,t.UNSIGNED_BYTE,l);const d=function(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e[n],t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}(l);let f=!1;for(let e=0;e<l.length;e++)if(0!==l[e]){f=!0;break}return{pixelHash:d,readbackAllowed:f}}finally{t.getExtension("WEBGL_lose_context")?.loseContext()}}},xe=["14px Arial","14px Georgia","14px monospace"],Se={name:"canvasTextMetrics",tier:2,async collect(){const e=document.createElement("canvas").getContext("2d");if(!e)return null;const t=[];for(const n of xe){e.font=n;const r=e.measureText("Sphinx of black quartz, judge my vow. 0123456789");t.push({font:n,width:r.width,actualBoundingBoxAscent:r.actualBoundingBoxAscent??null,actualBoundingBoxDescent:r.actualBoundingBoxDescent??null,actualBoundingBoxLeft:r.actualBoundingBoxLeft??null,actualBoundingBoxRight:r.actualBoundingBoxRight??null,fontBoundingBoxAscent:r.fontBoundingBoxAscent??null,fontBoundingBoxDescent:r.fontBoundingBoxDescent??null})}return{metrics:t}}},ke=["chrome","safari","__crWeb","__gCrWeb","yandex","__yb","__ybro","__firefox__","__edgeTrackingPreventionStatistics","webkit","oprt","samsungAr","ucweb","UCShellJava","puffinDevice"],Ce={name:"vendorFlavors",tier:2,async collect(){const e=window,t=[];for(const n of ke)void 0!==e[n]&&t.push(n);return t.sort(),{flavors:t}}},Ee=[{key:"default",family:""},{key:"apple",family:"-apple-system, BlinkMacSystemFont"},{key:"serif",family:"serif"},{key:"sansSerif",family:"sans-serif"},{key:"monospace",family:"monospace"},{key:"systemUi",family:"system-ui"}],Ae={name:"fontPreferences",tier:2,async collect(){if("undefined"==typeof document||!document.body)return null;const e=document.createElement("div");e.style.cssText="position:absolute;visibility:hidden;top:-9999px";const t=Ee.map(({family:t})=>{const n=document.createElement("span");return n.textContent="mmMwWLliI0fiflO&1",n.style.fontSize="72px",t&&(n.style.fontFamily=t),e.appendChild(n),n});document.body.appendChild(e);const n={};for(let e=0;e<Ee.length;e++){const r=t[e].getBoundingClientRect().width;n[Ee[e].key]=Math.round(1e3*r)/1e3}return document.body.removeChild(e),n}},De={name:"screenFrame",tier:2,async collect(){const e=screen,t=e.availTop??0,n=e.availLeft??0;return{top:t,right:screen.width-(e.availWidth??screen.width)-n,bottom:screen.height-(e.availHeight??screen.height)-t,left:n}}};function $e(e){return/Not[ ;)\/]/i.test(e)}const Ie={name:"clientHints",tier:2,async collect(){const e=navigator;if(!e.userAgentData)return null;const t=(e.userAgentData.brands??[]).filter(e=>!$e(e.brand)),n=e.userAgentData.mobile??!1,r=e.userAgentData.platform??"",o=await e.userAgentData.getHighEntropyValues(["architecture","bitness","model","platformVersion","fullVersionList"]),i=(o.fullVersionList??[]).filter(e=>!$e(e.brand));return{brands:t,mobile:n,platform:r,architecture:o.architecture??"",bitness:o.bitness??"",model:o.model??"",platformVersion:o.platformVersion??"",fullVersionList:i}}},Me=[{name:"EasyList",selectors:[".ad-banner",".ad_banner","#ad-banner",".adsbygoogle",".ad-container"]},{name:"AdGuard Base",selectors:[".BannerAd",".ad-rotate","#ad-box",".ad-placement",".ad-zone"]},{name:"EasyPrivacy",selectors:["#tracking-pixel",".tracking",".analytics-tag","#beacon",".pixel-tracker"]},{name:"Fanboy Annoyances",selectors:["#newsletter-popup",".cookie-banner",".consent-dialog","#gdpr-notice",".subscribe-modal"]},{name:"AdGuard Tracking",selectors:[".tracker-frame","#analytics-beacon",".telemetry-pixel",".data-tracker","#stats-counter"]}],Te={name:"domBlockers",tier:2,async collect(){if("undefined"==typeof document||!document.body)return{activeFilters:[]};const e=[],t=[];try{for(const n of Me){const r=[];for(const t of n.selectors){const n=document.createElement("div");t.startsWith("#")?n.id=t.slice(1):n.className=t.slice(1),document.body.appendChild(n),r.push(n),e.push(n)}t.push({name:n.name,elements:r})}await new Promise(e=>setTimeout(e,0));const n=[];for(const{name:e,elements:r}of t){let t=0;for(const e of r)null===e.offsetParent&&t++;t/r.length>.6&&n.push(e)}return{activeFilters:n}}catch{return{activeFilters:[]}}finally{for(const t of e)try{t.parentNode?.removeChild(t)}catch{}}}},Pe={name:"privateClickMeasurement",tier:2,collect:async()=>({supported:"attributionSourceId"in document.createElement("a")})},Oe={name:"automationDetection",tier:2,async collect(){const e=!!navigator.webdriver,t=function(){const e=[];try{const t=Object.getOwnPropertyNames(document);for(const n of t)/^\$?cdc_/.test(n)&&e.push(n)}catch{}const t=[["_Selenium_IDE_Recorder",()=>"t"in window],["__webdriver_evaluate",()=>"o"in document],["__driver_evaluate",()=>"i"in document],["__puppeteer_evaluation_script__",()=>"u"in window],["__playwright__binding__",()=>"l"in window],["__pwInitScripts",()=>"m"in window],["callPhantom",()=>"callPhantom"in window],["_phantom",()=>"h"in window],["__nightmare",()=>"p"in window],["domAutomation",()=>"domAutomation"in window],["domAutomationController",()=>"domAutomationController"in window]];for(const[n,r]of t)try{r()&&e.push(n)}catch{}return e}(),n=await async function(){try{if("undefined"==typeof Proxy)return!1;let e=!1;const t={};return Object.setPrototypeOf(t,new Proxy(Object.create(null),{ownKeys:()=>(e=!0,[])})),console.groupEnd(t),await new Promise(e=>setTimeout(e,100)),e}catch{return!1}}(),r=await async function(){const e=[];try{0===navigator.plugins.length&&window.chrome&&e.push("no_plugins_with_chrome")}catch{}0!==window.outerWidth&&0!==window.outerHeight||e.push("zero_outer_dimensions"),0===screen.availHeight&&e.push("zero_avail_height");try{0===navigator.languages.length&&e.push("empty_languages")}catch{}try{window.chrome&&void 0===window.chrome?.runtime&&e.push("chrome_without_runtime")}catch{}try{"undefined"!=typeof Notification&&"denied"===Notification.permission&&"prompt"===(await navigator.permissions.query({name:"notifications"})).state&&e.push("notification_permission_contradiction")}catch{}return e}(),o=function(){let e=null;try{if(e=document.createElement("canvas").getContext("webgl"),!e)return!1;const t=e.getExtension("WEBGL_debug_renderer_info");if(!t)return!1;const n=e.getParameter(t.UNMASKED_RENDERER_WEBGL);if("string"!=typeof n)return!1;const r=["swiftshader","google swiftshader","llvmpipe","mesa","software rasterizer","microsoft basic render driver"],o=n.toLowerCase();return r.some(e=>o.includes(e))}catch{return!1}finally{if(e){const t=e.getExtension("WEBGL_lose_context");t&&t.loseContext()}}}();let i=0;return e&&(i+=30),t.length>0&&(i+=20),n&&(i+=25),r.length>=2&&(i+=15),o&&(i+=20),{webdriver:e,automationMarkers:t,cdpDetected:n,headlessIndicators:r,softwareRenderer:o,botScore:i}}},Le={name:"agentDetection",tier:2,async collect(){const e=function(){const e=[];try{13===navigator.hardwareConcurrency&&e.push("unusual_core_count_13")}catch{}try{4===navigator.deviceMemory&&6===navigator.hardwareConcurrency&&e.push("manus_hardware_signature")}catch{}try{1280===screen.width&&1100===screen.height&&e.push("manus_resolution")}catch{}try{if("UTC"===Intl.DateTimeFormat().resolvedOptions().timeZone){const t=navigator.languages||[],n=["en-GB","pt-PT","is","is-IS"];t.some(e=>n.includes(e))||e.push("utc_timezone_mismatch")}}catch{}return e}(),t=function(){try{const e=navigator.userAgent||"",t=navigator.userAgentData?.platform,n=navigator.platform||"";let r="";if(/Windows/.test(e)?r="Windows":/Macintosh|Mac OS X/.test(e)?r="macOS":/Android/.test(e)?r="Android":/iPhone|iPad|iPod/.test(e)?r="iOS":/Linux/.test(e)&&(r="Linux"),t){const e=t.toLowerCase();if("linux"===e&&("macOS"===r||"Windows"===r))return!1;if("windows"===e&&"macOS"===r)return!1;if("macos"===e&&"Windows"===r)return!1}if(n){const e=n.toLowerCase();if(e.includes("linux")&&("macOS"===r||"Windows"===r))return!1;if(e.includes("win")&&"macOS"===r)return!1;if(e.includes("mac")&&"Windows"===r)return!1}return!0}catch{return!0}}(),n=function(){try{const e=Intl.DateTimeFormat().resolvedOptions().timeZone,t=(new Date).getTimezoneOffset();return"UTC"!==e||0===t}catch{return!0}}(),r=function(e,t){return e.includes("unusual_core_count_13")?"chatgpt":e.includes("manus_hardware_signature")&&e.includes("manus_resolution")?"manus":t?null:"operator"}(e,t);let o=0;return o+=25*e.length,t||(o+=30),r&&(o+=50),{fingerprintAnomalies:e,uaPlatformMatch:t,timezoneConsistent:n,detectedAgent:r,agentScore:o}}},Re={name:"tamperDetection",tier:2,async collect(){const e=function(){try{const e=navigator.userAgent||"",t=/Chrome\//.test(e)&&!/Edg\//.test(e),n=/Firefox\//.test(e)&&!/Chrome/.test(e),r="undefined"!=typeof CSS&&CSS.supports&&CSS.supports("-moz-appearance","none"),o=void 0!==window.chrome;return!(t&&r||n&&o)}catch{return!0}}(),t=function(){try{const e=Object.getOwnPropertyDescriptor(Navigator.prototype,"userAgent");if(!e)return!1;if(!e.get)return!1;const t=e.get.toString();return!!/\[native code\]/.test(t)}catch{return!0}}(),n=function(){try{const e=eval.toString().length;if(33!==e&&37!==e&&39!==e&&(e<20||e>60))return!1;try{if(1!==new(0,navigator.userAgent.constructor.constructor)("return 1")())return!1}catch{return!1}return!0}catch{return!0}}(),r=function(){const e=[];try{"v"in window&&e.push("multilogin")}catch{}try{void 0!==window.chrome&&0===navigator.plugins.length&&e.push("empty_plugins_chromium")}catch{}try{const t=window;if(t.safari){const n=t.safari.toString?.();n&&!/\[object Safari\]/.test(n)&&e.push("safari_object_spoofed")}}catch{}try{const t=navigator.userAgent||"",n=t.match(/Chrome\/(\d+)/);n&&parseInt(n[1],10)>=88&&/Macintosh/.test(t)&&void 0===window.BarcodeDetector&&e.push("missing_barcode_detector")}catch{}return e}(),o=function(){try{const e=((new Error).stack||"").split("\n").filter(e=>e.trim().length>0);for(const t of e){const e=t.trim();if("Error"!==e){if(/^\s*at\s/.test(e))return"chromium";if(/@/.test(e)&&!e.startsWith("at"))return/^\w+@/.test(e)?"gecko":"webkit"}}return"unknown"}catch{return"unknown"}}(),i=eval.toString().length;let a=0;if(e||(a+=30),t||(a+=25),n||(a+=20),a+=15*r.length,"unknown"!==o){const e=navigator.userAgent||"";("gecko"===o&&!/Firefox/.test(e)||"chromium"===o&&/Firefox/.test(e)&&!/Chrome/.test(e))&&(a+=10)}return{uaEngineConsistent:e,navigatorPropsNative:t,prototypeChainIntact:n,antiDetectMarkers:r,stackTraceFormat:o,evalLength:i,tamperScore:a}}},Fe={name:"vmDetection",tier:2,async collect(){const e=function(){const e=[];try{navigator.hardwareConcurrency<=2&&e.push("low_core_count")}catch{}try{const t=navigator.deviceMemory;"number"==typeof t&&t<=2&&e.push("low_memory")}catch{}try{screen.colorDepth<24&&e.push("low_color_depth")}catch{}try{screen.colorDepth!==screen.pixelDepth&&e.push("depth_mismatch")}catch{}return e}();let t="",n=null;try{if(n=document.createElement("canvas").getContext("webgl"),n){const e=n.getExtension("WEBGL_debug_renderer_info");e&&(t=n.getParameter(e.UNMASKED_RENDERER_WEBGL)||"")}}catch{}finally{if(n)try{const e=n.getExtension("WEBGL_lose_context");e&&e.loseContext()}catch{}}const r=function(e){if(!e)return[];const t=e.toLowerCase();return Be.filter(e=>t.includes(e))}(t),o=function(e){if(!e)return!1;const t=e.toLowerCase();return Ue.some(e=>t.includes(e))}(t);let i=0;return r.length>0?i=.9:o?i=.5:e.length>=3&&(i=.3),{isVM:r.length>0,vmRendererMatches:r,softwareRenderer:o,confidence:i,indicators:e}}},Be=["virtualbox","vmware","svga3d","qemu","parallels","hyper-v","qxl","red hat","virtio","citrix"],Ue=["swiftshader","google swiftshader","llvmpipe","mesa","software rasterizer","microsoft basic render driver","softpipe"],je=[{label:"h264",contentType:'video/mp4; codecs="avc1.42E01E"',width:1920,height:1080,bitrate:5e6,framerate:30},{label:"vp8",contentType:'video/webm; codecs="vp8"',width:1920,height:1080,bitrate:5e6,framerate:30},{label:"vp9",contentType:'video/webm; codecs="vp09.00.10.08"',width:1920,height:1080,bitrate:5e6,framerate:30},{label:"av1",contentType:'video/mp4; codecs="av01.0.05M.08"',width:1920,height:1080,bitrate:5e6,framerate:30}],ze=[{label:"aac",contentType:'audio/mp4; codecs="mp4a.40.2"',channels:"2",bitrate:128e3,samplerate:44100},{label:"opus",contentType:'audio/webm; codecs="opus"',channels:"2",bitrate:128e3,samplerate:48e3}],We=[S,E,A,I,T,U,j,z,W,V,N,q,J,X,Z,Q,te,ne,ae,ce,le,fe,he,pe,ge,ve,be,_e,Se,Ce,Ae,De,Ie,Te,Pe,Oe,Le,Re,Fe,{name:"devtoolsDetection",tier:2,collect:async()=>({dimensionDelta:function(){const e=window.outerHeight-window.innerHeight,t=window.outerWidth-window.innerWidth;return{heightDelta:e,widthDelta:t,likelyOpen:e>200||t>200}}(),consoleTimingAnomaly:function(){try{const e={};for(let t=0;t<1e3;t++)e[`key${t}`]=t;const t=performance.now();return console.log(e),performance.now()-t>1}catch{return!1}}(),consoleNative:function(){try{return/\[native code\]/.test(Function.prototype.toString.call(console.log))}catch{return!0}}()})},{name:"webApis",tier:2,async collect(){const e=navigator,t=window;return{credentials:void 0!==e.credentials,usb:void 0!==e.usb,bluetooth:void 0!==e.bluetooth,clipboard:void 0!==e.clipboard,serial:void 0!==e.serial,hid:void 0!==e.hid,xr:void 0!==e.xr,share:"function"==typeof e.share,wakeLock:void 0!==e.wakeLock,presentation:void 0!==e.presentation,mediaSession:void 0!==e.mediaSession,ink:void 0!==e.ink,virtualKeyboard:void 0!==e.virtualKeyboard,eyeDropper:void 0!==t.EyeDropper,getScreenDetails:"function"==typeof t.getScreenDetails,paymentRequest:void 0!==t.PaymentRequest,adoptedStyleSheets:void 0!==document.adoptedStyleSheets,cssHighlights:void 0!==t.CSS?.highlights}}},{name:"notificationState",tier:2,async collect(){const e="undefined"!=typeof Notification;return{supported:e,permission:e?Notification.permission:null}}},{name:"extendedLocale",tier:2,collect:async()=>({languages:Array.from(navigator.languages??[])})},{name:"privacyPrefs",tier:2,async collect(){const e=navigator;return{doNotTrack:navigator.doNotTrack??null,globalPrivacyControl:e.globalPrivacyControl??null}}},{name:"performanceContext",tier:2,async collect(){let e=null;try{const t=performance.getEntriesByType("navigation");t.length>0&&(e=t[0].nextHopProtocol||null)}catch{}let t=[];try{t=Array.from(PerformanceObserver.supportedEntryTypes??[])}catch{}return{nextHopProtocol:e,supportedEntryTypes:t}}},{name:"sensors",tier:2,async collect(){const e=window;return{deviceOrientation:void 0!==e.DeviceOrientationEvent,deviceMotion:void 0!==e.DeviceMotionEvent,gyroscope:void 0!==e.Gyroscope,accelerometer:void 0!==e.Accelerometer,ambientLightSensor:void 0!==e.AmbientLightSensor,absoluteOrientationSensor:void 0!==e.AbsoluteOrientationSensor,relativeOrientationSensor:void 0!==e.RelativeOrientationSensor}}},{name:"battery",tier:2,collect:async()=>({supported:"function"==typeof navigator.getBattery})},{name:"gamepads",tier:2,collect:async()=>({supported:"function"==typeof navigator.getGamepads})},{name:"storage",tier:2,async collect(){let e=null;try{navigator.storage?.estimate&&(e=(await navigator.storage.estimate()).quota??null)}catch{}let t=!1;try{t=void 0!==window.indexedDB}catch{}let n=!1;try{n=void 0!==window.localStorage}catch{}return{quota:e,indexedDB:t,localStorage:n,cacheApi:void 0!==window.caches}}},{name:"features",tier:2,async collect(){const e=window;return{isSecureContext:!!e.isSecureContext,webdriver:!!navigator.webdriver,crossOriginIsolated:!!e.crossOriginIsolated,sharedArrayBuffer:void 0!==e.SharedArrayBuffer,webAssembly:void 0!==e.WebAssembly,bigInt:void 0!==e.BigInt,offscreenCanvas:void 0!==e.OffscreenCanvas}}},{name:"screen",tier:2,async collect(){const e=window.visualViewport;return{availWidth:screen.availWidth??0,availHeight:screen.availHeight??0,devicePixelRatio:window.devicePixelRatio??1,orientationType:screen.orientation?.type??null,orientationAngle:screen.orientation?.angle??null,visualViewport:e?{width:e.width,height:e.height,offsetLeft:e.offsetLeft,offsetTop:e.offsetTop,scale:e.scale}:null}}},{name:"mediaCapabilities",tier:2,async collect(){if(!navigator.mediaCapabilities?.decodingInfo)return null;const e={},t=[...je.map(e=>({label:e.label,config:{type:"file",video:{contentType:e.contentType,width:e.width,height:e.height,bitrate:e.bitrate,framerate:e.framerate}}})),...ze.map(e=>({label:e.label,config:{type:"file",audio:{contentType:e.contentType,channels:e.channels,bitrate:e.bitrate,samplerate:e.samplerate}}}))];return await Promise.allSettled(t.map(async({label:t,config:n})=>{try{const r=await navigator.mediaCapabilities.decodingInfo(n);e[t]={supported:r.supported,smooth:r.smooth,powerEfficient:r.powerEfficient}}catch{e[t]=null}})),e}}];async function Ve(e){const n=function(e){return e?{exclude:e.exclude??r.exclude,include:e.include??r.include,timeout:e.timeout??r.timeout,stabilize:e.stabilize??r.stabilize,experimental:e.experimental??r.experimental,debug:e.debug??r.debug,salt:e.salt??r.salt}:{...r}}(e),s=u(),l=function(){try{return window.self!==window.top}catch{return!0}}();let d=!1;try{d=await async function(e){try{switch(e){case"chrome":case"edge":case"opera":default:return await async function(){if(!navigator.storage?.estimate)return!1;const{quota:e}=await navigator.storage.estimate();return void 0!==e&&e<4294967296}();case"brave":return await async function(){return!1}();case"safari":return await async function(){if(navigator.storage?.estimate){const{quota:e}=await navigator.storage.estimate();if(void 0!==e)return e<4294967296}try{return!!navigator.storage?.getDirectory&&(await navigator.storage.getDirectory(),!1)}catch(e){return"NotFoundError"===e?.name}}();case"firefox":return await async function(){if(!("serviceWorker"in navigator))return!0;try{return!!navigator.storage?.getDirectory&&(await navigator.storage.getDirectory(),!1)}catch(e){return"SecurityError"===e?.name}}()}}catch{return!1}}(s.name)}catch{}const f=function(e,t,n,r){const o=new Set;for(const i of e){if("private"===i&&!n)continue;if("iframe"===i&&!r)continue;const e=c[i];if(e)for(const n of e)if(!n.browsers||n.browsers.includes(t))for(const e of n.exclude)o.add(e)}return o}(n.stabilize,s.name,d,l),m=new Set(f);for(const e of n.exclude)m.add(e);for(const e of n.include)m.delete(e);const{components:h,errors:p}=await async function(e,t,n){const r={},o=[],i=We.filter(t=>!e.has(t.name)&&(n||3!==t.tier)),a=await Promise.allSettled(i.map(async e=>{const n=await(r=e.collect(),o=t,new Promise((e,t)=>{const n=setTimeout(()=>e(null),o);r.then(t=>{clearTimeout(n),e(t)},e=>{clearTimeout(n),t(e)})}));var r,o;return{name:e.name,value:n}}));for(let e=0;e<a.length;e++){const t=a[e],n=i[e].name;"fulfilled"===t.status&&null!==t.value.value?r[n]=t.value.value:"rejected"===t.status&&o.push({signal:n,error:String(t.reason?.message??t.reason)})}return{components:r,errors:o}}(m,n.timeout,n.experimental),y={_:t};for(const[e,t]of Object.entries(h))i.has(e)||a.has(e)||(y[e]=t);const g=x(y,n.salt),w={_:t};for(const[e,t]of Object.entries(h))o.has(e)||a.has(e)||(w[e]=t);const v=x(w,n.salt),b={hash:g,stableHash:v,components:{...h,_:t},timestamp:(new Date).toISOString(),version:t,isIncognito:d,errors:p};return n.debug&&(console.log("[fingerprint] components:",h),console.log("[fingerprint] hash:",g,"stableHash:",v),p.length>0&&console.warn("[fingerprint] errors:",p)),b}const Ne=new RegExp(["googlebot","bingbot","slurp","baiduspider","duckduckbot","yandex","sogou","exabot","ia_archiver","curl","wget","python-requests","python-urllib","axios","node-fetch","go-http-client","java/","libwww-perl","okhttp","apache-httpclient","http_request","httpie","headlesschrome","phantomjs","puppeteer","playwright","cypress","selenium","webdriver","electron","jsdom","vercel-screenshot","screenshot","prerender","lighthouse","chrome-lighthouse","pagespeed","gtmetrix","pingdom","nessus","nikto","sqlmap","burp","zap","qualys","openvas","nmap","masscan","facebookexternalhit","twitterbot","linkedinbot","whatsapp","telegrambot","slackbot","discordbot","bot","crawl","spider","scrape","fetch","scan"].join("|"),"i");function Ge(e){return!!e&&Ne.test(e)}let qe;function He(){if("undefined"==typeof window)return;const e=window.UnsharedFingerprint;return"function"==typeof e?.getFingerprint?e.getFingerprint:void 0}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ke={};!function(e){function t(e,t){return e&&(/^#[0-9a-fA-F]{3,8}$/.test(e)||/^rgba?\(\s*[\d.,\s]+\)$/.test(e))?e:t}const n=/^[a-zA-Z0-9\s,\-'"]+$/;function r(e){return e&&/^\d+(\.\d+)?(px|rem|em|%)?$/.test(e)?e:"8px"}const o=new Set;function i(e,t){let n=e;for(const e of t.split(".")){if(null==n||"object"!=typeof n)return"";n=n[e]}return null==n?"":String(n)}function a(e){if(!e)return"";const t=e.indexOf("@");if(t>0){const n=e.slice(0,t),r=e.slice(t);return`${n.slice(0,1)}${"*".repeat(Math.max(n.length-1,1))}${r}`}return e.length<=4?"*".repeat(e.length):`${"*".repeat(e.length-4)}${e.slice(-4)}`}function c(e,t,n,r){return"runtime"===t.source?t.path?i({user:n.user??{},device:n.device??{}},t.path):"":r.get(e)??""}const s={email_verification:{"verify-email":{op:"triggerEmailVerification",inputs:["email","deviceId"]},"verify-otp":{op:"verify",inputs:["email","deviceId","otp"]},"resend-verification":{op:"triggerEmailVerification",inputs:["email","deviceId"]}}};function u(e){const t=(e??"").trim();if(""===t)return!1;const n=/^([a-z][a-z0-9+.-]*):/i.exec(t);if(!n)return!0;const r=n[1].toLowerCase();return"http"===r||"https"===r}function l(e){return{left:`${e.x}px`,top:`${e.y}px`,width:`${e.width}px`,height:`${e.height}px`}}function d(e){return"string"!=typeof e?null:/^#[0-9a-fA-F]{3,8}$/.test(e)||/^rgba?\(\s*[\d.,\s]+\)$/.test(e)?e:null}function f(e,t,r={}){const o=t.props,i="heading"===t.type||"text"===t.type,a=o.fontSize;"number"==typeof a&&a>=8&&a<=120&&(e.style.fontSize=`${a}px`);const c=o.align,s="left"===c||"center"===c||"right"===c?c:void 0;s&&(e.style.textAlign=s);const u="boolean"==typeof o.bold?o.bold:r.bold;void 0!==u&&(e.style.fontWeight=u?"700":"400"),!0===o.italic&&(e.style.fontStyle="italic"),!0===o.underline&&(e.style.textDecoration="underline");const l="string"!=typeof(f=o.fontFamily)||""===f?null:n.test(f)?f:null;var f;l&&(e.style.fontFamily=l);const m=d(o.textColor)??r.color??null;m&&(e.style.color=m,i&&(e.style.opacity="1"));const h=o.verticalAlign;!i||"middle"!==h&&"bottom"!==h||(e.style.display="flex",e.style.flexDirection="column",e.style.justifyContent="bottom"===h?"flex-end":"center",e.style.alignItems="center"===s?"center":"right"===s?"flex-end":"flex-start")}function m(e,t){const n="string"==typeof e.props.binding?e.props.binding:"";return n&&t.flow.bindings[n]?function(e,t,n,r){if("never"===t.display)return"";const o=c(e,t,n,r);return"masked"===t.display?a(o):o}(n,t.flow.bindings[n],t.ctx,t.formState):String(e.props.text??"")}function h(e,t){const n=document.createElement("div");return n.className="el el-heading",Object.assign(n.style,l(e)),f(n,e,{bold:!0}),n.textContent=m(e,t),n}function p(e,t){const n=document.createElement("div");return n.className="el el-text",Object.assign(n.style,l(e)),f(n,e,{bold:!1}),n.textContent=m(e,t),n}function y(e){const t=document.createElement("img");return t.className="el el-image",Object.assign(t.style,l(e)),t.src=String(e.props.src??""),t.alt=String(e.props.alt??""),t}function g(e){const t=document.createElement("div");return t.className="el el-divider",t.style.left=`${e.x}px`,t.style.top=`${e.y+e.height/2}px`,t.style.width=`${e.width}px`,t}function w(e,t){const n=document.createElement("input");n.className="el el-input",Object.assign(n.style,l(e)),f(n,e),"string"==typeof e.props.placeholder&&(n.placeholder=e.props.placeholder),"number"==typeof e.props.maxLength&&(n.maxLength=e.props.maxLength),"string"==typeof e.props.pattern&&(n.pattern=e.props.pattern),"otp"===e.props.fieldType?n.inputMode="numeric":"email"===e.props.fieldType&&(n.type="email"),!0===e.props.autoFocus&&(n.autofocus=!0);const r=t.elementToBinding.get(e.id)??String(e.props.name??e.id);return n.value=t.formState.get(r)??"",n.addEventListener("input",()=>t.formState.set(r,n.value)),n}function v(e,t){const n=e?.goTo??e?.advanceTo;e?.dismiss?t.close():"string"==typeof n&&(t.screenState.goTo(n),t.screenState.isLast&&t.complete())}function b(e,t,n,r){e?.showError&&n(t instanceof Error&&t.message?t.message:"Something went wrong. Please try again."),e?.dismiss&&r.close()}function _(e,t,n){const r=document.createElement("button"),o="secondary"===e.props.variant?"secondary":"primary";r.className=`el el-button el-button-${o}`,Object.assign(r.style,l(e));const i=d(e.props.bgColor);return i&&(r.style.background=i),f(r,e),r.textContent=String(e.props.text??"Continue"),r.addEventListener("click",()=>{!async function(e,t,n,r){const o=String(e.props.action??"");if(!o)return;if("close"===o)return void t.close();if("prev-screen"===o)return void t.screenState.prev();if("next-screen"===o){if(t.screenState.isLast)return;return t.screenState.next(),void(t.screenState.isLast&&t.complete())}const i=t.flow.actions[o],a=e=>{r.textContent=e,r.classList.add("visible")};if("client_steps"===i?.type){const c=Array.isArray(e.props.steps)?e.props.steps:[];if(0===c.length)return void("undefined"!=typeof console&&console.warn(`[interstitial] client_steps action "${o}" has no steps`));r.classList.remove("visible"),n.disabled=!0;try{await async function(e){for(const t of e){if("redirect"===t.type)return u(t.url)?void window.location.assign(t.url):void("undefined"!=typeof console&&console.warn(`[interstitial] blocked unsafe redirect url: ${t.url}`));if("webhook"===t.type){const e=await fetch(t.url,{method:t.method??"POST",credentials:"same-origin"});if(!e.ok)throw new Error(`webhook ${t.url} returned ${e.status}`)}else"undefined"!=typeof console&&console.warn(`[interstitial] unknown step type: ${t.type}`)}}(c),v(i.onSuccess,t)}catch(e){b(i.onError,e,a,t)}finally{n.disabled=!1}return}const l=function(e,t,n,r){const o=s[e.flowType]?.[t];if(!o)return null;const i={};for(const t of o.inputs){const o=e.bindings[t];o&&(i[t]=c(t,o,n,r))}return{op:o.op,values:i}}(t.flow,o,t.ctx,t.formState);if(l){r.classList.remove("visible"),n.disabled=!0;try{await t.ctx.actions(l.op,l.values),v(i?.onSuccess,t)}catch(e){b(i?.onError,e,a,t)}finally{n.disabled=!1}}else"undefined"!=typeof console&&console.warn(`[interstitial] unknown action: ${o}`)}(e,t,r,n)}),r}function x(e,t,n){Array.from(t.children).forEach(e=>e.remove());const r=document.createElement("div");r.className="el-error",r.style.left="0",r.style.right="0",r.style.bottom="12px";for(const o of e.elements){let e=null;switch(o.type){case"heading":e=h(o,n);break;case"text":e=p(o,n);break;case"image":e=y(o);break;case"divider":e=g(o);break;case"input":e=w(o,n);break;case"button":e=_(o,n,r);break;default:e=null}e&&t.appendChild(e)}t.appendChild(r)}e.maskValue=a,e.renderFlow=function(e,i){const a=i.container??document.body,c=new Map,s=function(e){const t=new Map;for(const[n,r]of Object.entries(e.bindings))"form"===r.source&&r.elementId&&t.set(r.elementId,n);return t}(e);let u=!1;const l=()=>{u||(u=!0,d.destroy())},d=function(e,i,a){const c={primaryColor:t(e.primaryColor,"#4f46e5"),backgroundColor:t(e.backgroundColor,"#ffffff"),textColor:t(e.textColor,"#111827"),fontFamily:(s=e.fontFamily,s&&n.test(s)?s:"sans-serif"),borderRadius:r(e.borderRadius)};var s;const u=document.createElement("div");u.id="__unshared-interstitial-host",Object.assign(u.style,{position:"fixed",inset:"0",zIndex:"2147483647"}),a.appendChild(u),o.add(u);const l=u.attachShadow({mode:"open"}),d=document.createElement("style");d.textContent=`\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n :host { all: initial; }\n .backdrop {\n position: fixed; inset: 0;\n /* Frost the page behind the modal: a lighter scrim reads as "blurred content"\n rather than "blacked out". Browsers without backdrop-filter fall back to the\n scrim alone, so it degrades to a plain dim — never worse. On the blockFlagged\n gate page there is no content behind it, so this has no visible effect there. */\n background: rgba(0,0,0,0.35);\n -webkit-backdrop-filter: blur(6px);\n backdrop-filter: blur(6px);\n display: flex; align-items: center; justify-content: center;\n }\n .frame {\n position: relative;\n background: ${function(e,n){const r=e.backgroundGradient;if(r&&"object"==typeof r){const{from:e,to:n,angle:o}=r,i=t(e,""),a=t(n,""),c="number"==typeof o&&isFinite(o)?o:180;if(i&&a)return`linear-gradient(${c}deg, ${i}, ${a})`}return n}(e,c.backgroundColor)};\n color: ${c.textColor};\n font-family: ${c.fontFamily};\n border-radius: ${c.borderRadius};\n width: ${i.width}px;\n height: ${i.height}px;\n max-width: 95vw; max-height: 95vh;\n overflow: hidden;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n }\n .frame:focus { outline: none; }\n .el { position: absolute; }\n .el-heading { font-weight: 700; line-height: 1.2; color: ${c.textColor}; }\n .el-text { color: ${c.textColor}; opacity: 0.75; line-height: 1.5; }\n .el-image { object-fit: contain; }\n /* Hairline: uses the frame's text color at low opacity so it reads on light AND dark themes. */\n .el-divider { background: currentColor; opacity: 0.12; height: 1px; }\n .el-input {\n width: 100%; height: 100%;\n border: 1.5px solid #D1D5DB; border-radius: ${c.borderRadius};\n padding: 0 12px; font-family: ${c.fontFamily}; outline: none;\n transition: border-color 0.15s;\n }\n .el-input:focus { border-color: ${c.primaryColor}; }\n .el-button {\n width: 100%; height: 100%;\n border-radius: ${c.borderRadius}; font-weight: 600;\n font-family: ${c.fontFamily}; cursor: pointer; transition: opacity 0.15s;\n }\n .el-button:hover { opacity: 0.9; }\n .el-button:disabled { opacity: 0.5; cursor: not-allowed; }\n .el-button-primary { background: ${c.primaryColor}; color: #fff; border: none; }\n .el-button-secondary { background: transparent; color: ${c.primaryColor}; border: 1.5px solid ${c.primaryColor}; }\n .el-error {\n position: absolute; color: #DC2626; font-size: 13px;\n display: none; text-align: center;\n }\n .el-error.visible { display: block; }\n `,l.appendChild(d);const f=document.createElement("div");f.className="backdrop";const m=document.createElement("div");m.className="frame",m.setAttribute("role","dialog"),m.setAttribute("aria-modal","true"),m.tabIndex=-1,f.appendChild(m),l.appendChild(f);const h=document.body.style.overflow;document.body.style.overflow="hidden";const p=e=>{"Escape"===e.key&&(e.preventDefault(),e.stopPropagation())};document.addEventListener("keydown",p,!0);const y=e=>{const t=e.target;if(t){for(const e of o)if(e.contains(t))return;m.focus()}};return document.addEventListener("focusin",y,!0),m.focus(),{shadowRoot:l,frame:m,destroy:()=>{document.removeEventListener("keydown",p,!0),document.removeEventListener("focusin",y,!0),document.body.style.overflow=h,o.delete(u),u.remove()}}}(e.theme,e.frame,a),f={flow:e,ctx:i,formState:c,elementToBinding:s,screenState:void 0,close:()=>{l(),i.onDismiss?.()},complete:()=>i.onComplete?.()},m=function(e,t,n){let r=Math.max(e.findIndex(e=>e.id===t),0);return{get current(){return e[r]},get isLast(){return r===e.length-1},next(){r<e.length-1&&(r++,n(e[r]))},prev(){r>0&&(r--,n(e[r]))},goTo(t){const o=e.findIndex(e=>e.id===t);-1!==o&&o!==r&&(r=o,n(e[r]))}}}(e.screens,e.initialScreenId,e=>{x(e,d.frame,f)});return f.screenState=m,x(m.current,d.frame,f),{destroy:l}},e.resolvePath=i}(Ke);var Je=Ke;const Ye=new Set(["__pre_auth__","anonymous","guest","undefined","null"]),Xe=["http","s://","api.","unsh","ared",".ai"].join(""),Qe="__unshared_email",Ze="__unshared_fp",et="__unshared_last_submit",tt="__unshared_device_id",nt="__unshared_event_queue",rt="__unshared_event_queue_inflight",ot="__unshared_uid",it="__unshared_sid",at="__UNSHARED_PUBLISHABLE_API_KEY__";function ct(){if("undefined"!=typeof crypto&&crypto.randomUUID)return crypto.randomUUID();const e=new Uint8Array(16);crypto.getRandomValues(e),e[6]=15&e[6]|64,e[8]=63&e[8]|128;const t=Array.from(e).map(e=>e.toString(16).padStart(2,"0")).join("");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}function st(e){return new Promise(t=>setTimeout(t,e))}function ut(e){const t=Math.min(1e3*Math.pow(2,e-1),3e4),n=500*Math.random()-250;return Math.max(0,t+n)}function lt(e){try{if("undefined"==typeof document)return;const t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):void 0}catch{return}}function dt(){try{return"undefined"!=typeof location&&"https:"===location.protocol?"; Secure":""}catch{return""}}function ft(e,t){try{if("undefined"==typeof document)return;document.cookie=`${e}=${encodeURIComponent(t)}; Path=/; SameSite=Lax${dt()}`}catch{}}function mt(e){try{if("undefined"==typeof localStorage)return;return localStorage.getItem(e)??void 0}catch{return}}function ht(e,t){try{if("undefined"==typeof localStorage)return;localStorage.setItem(e,t)}catch{}}function pt(e){try{if("undefined"==typeof localStorage)return;localStorage.removeItem(e)}catch{}}function yt(e){try{if("undefined"==typeof sessionStorage)return;return sessionStorage.getItem(e)??void 0}catch{return}}function gt(e,t){try{if("undefined"==typeof sessionStorage)return;sessionStorage.setItem(e,t)}catch{}}function wt(e){try{return new URL(e),!0}catch{return!1}}function vt(e){let t="";for(const n of e)t+=String.fromCharCode(n);return btoa(t)}function bt(e){const t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function _t(e){return new Uint8Array(Array.from(e))}function xt(){return"undefined"!=typeof crypto&&!!crypto.subtle&&!!crypto.getRandomValues}e.UnsharedBrowser=class{constructor(e={}){if(this.S=!1,this.k=!1,this.C=!1,this.A="",e.baseUrl&&!wt(e.baseUrl))throw new Error('baseUrl must be a valid URL (e.g. "https://app.example.com")');if(e.apiUrl&&!wt(e.apiUrl))throw new Error('apiUrl must be a valid URL (e.g. ["http","s://","api.","unsh","ared",".ai"].join(""))');let t,n;this.D=e.baseUrl?e.baseUrl.replace(/\/$/,""):"",this.$=e.publishableKey??function(e){if(void 0===e)return at.startsWith("__UNSHARED_")?void 0:at}(e.baseUrl),this.I=(e.apiUrl??Xe).replace(/\/$/,""),this.M=e.maxRetries??3,this.T=e.timeout??3e4,this.P=e.includePathPrefix,this.O=e.skipPaths,this.L=e.sessionId,this.R=e.deviceId,this.F=e.enableInterstitial??!1,this.B=e.interstitialFlowType??"email_verification",this.A=yt(et)??"";try{t=this.L?.()}catch{}this.U=t??lt(it)??ct(),ft(it,this.U);try{n=this.R?.()}catch{}n?(this.j=n,ht(tt,n)):this.j=mt(tt)??"",this.W(),this.F&&this.V()}async init(e){try{if("undefined"!=typeof navigator&&Ge(navigator.userAgent))return;if("string"==typeof(t=e.userId)&&Ye.has(t))return void this.N;if(!1===e.isPaidSubscriber)return void(this.S=!0);this.S=!1,this.N=e.userId,this.G=e.emailAddress,gt(Qe,e.emailAddress),ft(ot,e.userId);let n,r=this.q();r||(r=await this.collect(),this.H(r));try{n=this.R?.()}catch{}n?(this.j=n,ht(tt,n)):r.fingerprint_id&&(this.j=r.fingerprint_id,ht(tt,r.fingerprint_id)),this.K(r).catch(()=>{})}catch{}var t}onRouteChange(){try{if(!this.J())return;const e=this.q();if(!e)return;this.K(e).catch(()=>{})}catch{}}destroy(){try{"undefined"!=typeof sessionStorage&&(sessionStorage.removeItem(Qe),sessionStorage.removeItem(Ze),sessionStorage.removeItem(et)),this.A="",function(e){try{if("undefined"==typeof document)return;document.cookie=`${e}=; Path=/; SameSite=Lax; Expires=Thu, 01 Jan 1970 00:00:00 GMT${dt()}`}catch{}}(ot),this.Y&&"undefined"!=typeof document&&(document.removeEventListener("DOMContentLoaded",this.Y),this.Y=void 0),this.X&&"undefined"!=typeof window&&(window.removeEventListener("unshared:flagged",this.X),this.X=void 0),this.Z?.destroy(),this.Z=void 0,this.C=!1,this.N=void 0,this.G=void 0,this.S=!1}catch{}}async collect(e){const t=[...new Set(["timing","speech",...e?.exclude??[]])],{getFingerprint:n,source:r}=await(i={proxyBaseUrl:this.D,isProxy:!this.$},qe||(qe=(async()=>{const e=He();if(e)return{getFingerprint:e,source:"remote"};const t=i.isProxy?`${i.proxyBaseUrl??""}/__unshared/fingerprint.js`:"https://unshared-public.s3.us-east-2.amazonaws.com/fingerprint@1/fingerprint.umd.js";var n,r;await(n=t,r=function(){const e=globalThis.__UNSHARED_FP_LOAD_TIMEOUT_MS;return"number"==typeof e?e:1500}(),new Promise(e=>{if("undefined"==typeof document||!document.head)return void e();let t=!1;const o=()=>{t||(t=!0,clearTimeout(i),e())},i=setTimeout(o,r),a=document.createElement("script");a.src=n,a.async=!0,a.onload=o,a.onerror=o,document.head.appendChild(a)}));const o=He();return o?{getFingerprint:o,source:"remote"}:{getFingerprint:Ve,source:"bundled"}})(),qe)),o=await n({...e,exclude:t});var i;return{fingerprint_id:o.stableHash,full_hash:o.hash,components:o.components,timestamp:o.timestamp,isIncognito:o.isIncognito,version:o.version,source:r}}async submitFingerprintEvent(e,t){try{const n=this.ee(e,t),r=ct();return await this.te(this.ne(),JSON.stringify(n),r)}catch(e){return{success:!1,error:{code:"DELIVERY_FAILED",message:e instanceof Error?e.message:String(e)}}}}async checkUser(e){const t=this.re(e);return"success"in t?t:this.oe("GET","/v2/browser/check-user",{query:{email_address:await this.ie(t.email),device_id:t.deviceId},retry:!0})}async triggerEmailVerification(e){const t=this.re(e);return"success"in t?t:this.oe("POST","/v2/browser/trigger-email-verification",{body:{email_address:await this.ie(t.email),device_id:t.deviceId},retry:!1})}async verify(e,t){const n=this.re(t);return"success"in n?n:this.oe("POST","/v2/browser/verify",{body:{email_address:await this.ie(n.email),device_id:n.deviceId,code:e},retry:!1})}async emailVerificationStatus(e){const t=this.re(e);return"success"in t?t:this.oe("GET","/v2/browser/email-verification-status",{query:{email_address:await this.ie(t.email),device_id:t.deviceId},retry:!0})}async showInterstitial(e){const t=!this.$;if("undefined"==typeof document)return{success:!1,error:{code:"NO_DOM",message:"showInterstitial requires a browser DOM."}};if(this.C)return{success:!0,data:{shown:!1}};this.C=!0;const n=e?.flowType??this.B,r=t?await this.ae(n):await this.ce(n);if(!r.success||!r.data)return this.C=!1,{success:!1,error:r.error};try{return this.Z=Je.renderFlow(r.data,{user:t?{}:{email:this.G??this.J()??""},device:t?{}:{id:this.j},actions:t?this.se():this.ue(),container:e?.container,onComplete:()=>{e?.onComplete?.()},onDismiss:()=>{this.C=!1,this.Z=void 0,e?.onDismiss?.()}}),{success:!0,data:{shown:!0}}}catch(e){return this.C=!1,{success:!1,error:{code:"RENDER_FAILED",message:e instanceof Error?e.message:String(e)}}}}async ce(e){return this.oe("GET","/v2/browser/interstitial-flow",{query:{flow_type:e,platform:"web"},retry:!0})}async ae(e){try{const t=`${this.D}/__unshared/interstitial-flow?flow_type=${encodeURIComponent(e)}&platform=web`,n=await fetch(t,{method:"GET",credentials:"include"}),r=await n.json().catch(()=>({}));return n.ok&&!1!==r?.success&&r?.data?{success:!0,data:r.data}:{success:!1,error:r?.error??{code:"FLOW_FETCH_FAILED",message:`Flow fetch failed (${n.status})`}}}catch(e){return{success:!1,error:{code:"FLOW_FETCH_FAILED",message:e instanceof Error?e.message:String(e)}}}}se(){const e=async(e,t)=>{const n=await fetch(`${this.D}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(t)}),r=await n.json().catch(()=>({}));if(!n.ok||!1===r?.success)throw new Error(r?.error?.message??"Request failed. Please try again.");return r};return async(t,n)=>{if("triggerEmailVerification"!==t){if("verify"===t){const t=await e("/__unshared/verify",{code:n.otp});if(!1===t?.data?.verified)throw new Error("Incorrect or expired code. Please try again.");return}throw new Error(`Unsupported interstitial action: ${t}`)}await e("/__unshared/verify-trigger",{})}}ue(){return async(e,t)=>{const n={email:t.email,deviceId:t.deviceId};if("triggerEmailVerification"===e){const e=await this.triggerEmailVerification(n);if(!e.success)throw new Error(e.error?.message??"Could not send the verification code.");return}if("verify"===e){const e=await this.verify(t.otp,n);if(!e.success)throw new Error(e.error?.message??"Verification failed.");if(e.data&&!1===e.data.verified)throw new Error("Incorrect or expired code. Please try again.");return}throw new Error(`Unsupported interstitial action: ${e}`)}}V(){try{if("undefined"==typeof window)return;this.X=()=>{this.showInterstitial()},window.addEventListener("unshared:flagged",this.X)}catch{}}re(e){if(!this.$)return{success:!1,error:{code:"DIRECT_MODE_REQUIRED",message:"This method requires direct mode — construct the SDK with a publishableKey."}};const t=e?.email??this.G??this.J(),n=e?.deviceId??this.j;return t&&n?{email:t,deviceId:n}:{success:!1,error:{code:"MISSING_IDENTITY",message:"No email/deviceId available — call init() first or pass them explicitly."}}}async oe(e,t,n){try{let r=`${this.I}${t}`;n.query&&(r+=`?${new URLSearchParams(n.query).toString()}`);const o={"X-Publishable-Key":this.$,"X-Session-Id":this.U,"X-Device-Id":this.j},i={method:e,headers:o};void 0!==n.body&&(o["Content-Type"]="application/json",i.body=JSON.stringify(n.body));const a=n.retry?this.M+1:1,c=n.retry?Date.now()+8e3:1/0;let s={code:"DELIVERY_FAILED",message:"Request failed"};for(let e=1;e<=a&&!(Date.now()>=c)&&(e>1&&await st(ut(e-1)),!(Date.now()>=c));e++){const e=new AbortController,t=Math.min(this.T,Math.max(0,c-Date.now())),o=setTimeout(()=>e.abort(),n.retry?t:this.T);try{const t=await fetch(r,{...i,signal:e.signal});clearTimeout(o);const n=await t.text().catch(()=>"{}");let a;try{a=JSON.parse(n)}catch{a={}}if(t.status>=500){s={code:"DELIVERY_FAILED",message:`Backend returned ${t.status}`};continue}if(t.status>=400||!1===a?.success){const e=a?.error??{};return{success:!1,error:{code:"string"==typeof e.code?e.code:"UPSTREAM_ERROR",message:"string"==typeof e.message?e.message:`Backend returned ${t.status}`,retryAfter:e.details?.retry_after_seconds,nextAllowedAt:e.details?.next_allowed_at}}}return{success:!0,data:a?.data}}catch(e){clearTimeout(o),s={code:"DELIVERY_FAILED",message:e instanceof Error?e.message:String(e)}}}return{success:!1,error:s}}catch(e){return{success:!1,error:{code:"DELIVERY_FAILED",message:e instanceof Error?e.message:String(e)}}}}J(){return yt(Qe)}q(){const e=yt(Ze);if(e)try{return JSON.parse(e)}catch{return}}H(e){gt(Ze,JSON.stringify(e))}le(){if("undefined"==typeof location)return!0;const e=location.pathname||"/";if(this.O)for(const t of this.O)if(e.startsWith(t))return!1;return!this.P||this.P.some(t=>e.startsWith(t))}async K(e){if("undefined"!=typeof navigator&&Ge(navigator.userAgent))return{success:!0};if(this.S)return{success:!0};if(!this.le())return{success:!0};const t=this.G??this.J(),n=this.N??lt(ot),r="undefined"!=typeof location?(location.pathname||"/")+(location.search||""):"/";if(n){const e=`${n}|${r}`,t=function(){if("undefined"==typeof window)return;const e=window;return e.__unshared=e.__unshared||{}}();if(e===this.A||t?.lastKey===e)return{success:!0};t&&(t.lastKey=e),this.A=e,gt(et,e)}const o={hash:e.full_hash,stable_hash:e.fingerprint_id,collected_at:(new Date).toISOString(),is_incognito:e.isIncognito,components:e.components,version:e.version,session_id:this.U,event_type:r};e.source&&(o.source=e.source),this.$?(n&&(o.user_id=await this.ie(n)),t&&(o.email_address=await this.ie(t))):(n&&(o.user_id=n),t&&(o.email=t));const i=`${e.fingerprint_id}|${n??""}|${r}`,a=await async function(e){if(xt())try{const t=await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(e));return Array.from(new Uint8Array(t)).map(e=>e.toString(16).padStart(2,"0")).join("")}catch{return}}(i),c=a??(this.$?`${i}|${Math.floor(Date.now()/6e4)}`:i);return this.te(this.ne(),JSON.stringify(o),c)}ne(){return this.$?`${this.I}/v2/browser/submit-fingerprint-event`:`${this.D}/__unshared/submit-fp`}W(){try{if("undefined"==typeof document)return;this.Y&&document.removeEventListener("DOMContentLoaded",this.Y),this.Y=()=>{if(!this.J())return;const e=this.q();e&&this.K(e).catch(()=>{})},document.addEventListener("DOMContentLoaded",this.Y)}catch{}}async te(e,t,n,r={}){r.skipFlush||await this.de();const o=this.M+1;let i={success:!1,error:{code:"DELIVERY_FAILED",message:"Request failed"}};for(let r=1;r<=o;r++){r>1&&await st(ut(r-1));const o=new AbortController,a=setTimeout(()=>o.abort(),this.T),c={"Content-Type":"application/json","X-Idempotency-Key":n,"X-Session-Id":this.U,"X-Device-Id":this.j};this.$&&(c["X-Publishable-Key"]=this.$);try{const n=await fetch(e,{method:"POST",headers:c,body:t,signal:o.signal});if(clearTimeout(a),n.status>=500){i={success:!1,error:{code:"DELIVERY_FAILED",message:`Backend returned ${n.status}`}};continue}if(n.status>=400)return{success:!1,error:{code:"DELIVERY_FAILED",message:`Backend returned ${n.status}`}};const r=await n.text().catch(()=>"{}");let s;try{s=JSON.parse(r)}catch{s={}}return!1===s?.success?{success:!1,error:s.error??{code:"UPSTREAM_ERROR",message:"Upstream failed"}}:{success:!0,data:s?.data}}catch(e){clearTimeout(a),i={success:!1,error:{code:"DELIVERY_FAILED",message:e instanceof Error?e.message:String(e)}}}}return r.skipQueue||await this.fe({url:e,payload:t,idempotencyKey:n,queuedAt:(new Date).toISOString()}),i}me(){if(!this.$||!xt())return Promise.resolve(void 0);if(!this.he){const e=this.$;this.he=(async()=>{const t=await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(e));return crypto.subtle.importKey("raw",t,"AES-GCM",!1,["encrypt"])})().catch(()=>{})}return this.he}async ie(e){try{const t=await this.me();if(!t)return e;const n=crypto.getRandomValues(new Uint8Array(12)),r=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:n},t,(new TextEncoder).encode(e))),o=r.slice(r.length-16),i=r.slice(0,r.length-16);return`${vt(n)}:${vt(o)}:${vt(i)}`}catch{return e}}async pe(){if(!xt())return;const e=`unshared-browser-queue:${this.$??this.D}:${this.U}`,t=await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(e));return crypto.subtle.importKey("raw",t,"AES-GCM",!1,["encrypt","decrypt"])}async ye(e){const t=await this.pe();if(!t)return;const n=crypto.getRandomValues(new Uint8Array(12)),r=(new TextEncoder).encode(JSON.stringify(e)),o=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:n},t,r));return`v1:${vt(n)}:${vt(o)}`}async ge(e){const[t,n,r]=e.split(":");if("v1"!==t||!n||!r)return;const o=await this.pe();if(!o)return;const i=_t(bt(n)),a=_t(bt(r)),c=await crypto.subtle.decrypt({name:"AES-GCM",iv:i},o,a);return JSON.parse((new TextDecoder).decode(c))}we(){const e=mt(nt);if(!e)return[];try{const t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}ve(e){0!==e.length?ht(nt,JSON.stringify(e.slice(-20))):pt(nt)}async fe(e){try{const t=await this.ye(e);if(!t)return;this.ve([...this.we(),t])}catch{}}be(){const e=mt(rt);if(e)try{const t=JSON.parse(e);if("number"!=typeof t.ts||!Array.isArray(t.records))return void pt(rt);if(Date.now()-t.ts>6e4){const e=t.records.filter(e=>"string"==typeof e);pt(rt),this.ve([...e,...this.we()])}}catch{pt(rt)}}async de(){if(this.k)return;this.be();const e=this.we();if(0===e.length)return;this.k=!0,ht(rt,JSON.stringify({ts:Date.now(),records:e})),this.ve([]);const t=[];let n=0;try{for(let r=0;r<e.length;r++){const o=e[r];let i;try{i=await this.ge(o)}catch{n=r+1;continue}if(i){if(!(await this.te(i.url,i.payload,i.idempotencyKey,{skipFlush:!0,skipQueue:!0})).success){t.push(o,...e.slice(r+1));break}n=r+1}else n=r+1}}catch{t.push(...e.slice(n))}finally{t.length>0&&this.ve([...t,...this.we()]),pt(rt),this.k=!1}}ee(e,t){const n={hash:e.full_hash,stable_hash:e.fingerprint_id,collected_at:e.timestamp,is_incognito:e.isIncognito,components:e.components,version:e.version,session_id:this.U};e.source&&(n.source=e.source),n.user_id=t.userId,null!=t?.eventType&&(n.event_type=t.eventType);const r=this.G??this.J();return r&&(n.email=r),n}},e.createAxiosInterceptor=function(e){return t=>{if(403===t?.response?.status&&"account_flagged"===t?.response?.data?.error)try{e.onFlagged()}catch{}return Promise.reject(t)}},e.createFetchInterceptor=function(e,t){return async(...n)=>{const r=await e(...n);if(403===r.status){const e=r.clone();try{const n=await e.json();if("account_flagged"===n?.error)try{t.onFlagged()}catch{}}catch{}}return r}}});
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).UnsharedBrowser={})}(this,function(e){"use strict";const t=1282368115,n={exclude:[],include:[],timeout:3e3,stabilize:["private","iframe","always"],experimental:!1,debug:!1,salt:""},r={always:[{exclude:["speech"],browsers:["brave","firefox"]},{exclude:["keyboard"],browsers:["firefox","safari"]},{exclude:["hardwareSensitive","navigatorProps"],browsers:["brave"]},{exclude:["canvas","audioOscillator","webglRender","canvasTextMetrics"],browsers:["brave"]},{exclude:["canvas","audioOscillator"],browsers:["firefox","safari"]}],private:[{exclude:["fonts"],browsers:["firefox"]},{exclude:["audio"],browsers:["safari","brave"]}],iframe:[{exclude:["permissions"]},{exclude:["keyboard"]}]};let o=null;function i(){if(o)return o;const e=navigator.userAgent;return o=function(){const e=navigator.brave;return!!e&&"function"==typeof e.isBrave}()?{name:"brave",version:a(e,/Chrome\/([\d.]+)/)}:/Edg\//i.test(e)?{name:"edge",version:a(e,/Edg\/([\d.]+)/)}:/OPR\//i.test(e)||/Opera/i.test(e)?{name:"opera",version:a(e,/OPR\/([\d.]+)/)||a(e,/Opera\/([\d.]+)/)}:/SamsungBrowser/i.test(e)?{name:"samsung",version:a(e,/SamsungBrowser\/([\d.]+)/)}:/Firefox\//i.test(e)?{name:"firefox",version:a(e,/Firefox\/([\d.]+)/)}:/Safari\//i.test(e)&&!/Chrome/i.test(e)?{name:"safari",version:a(e,/Version\/([\d.]+)/)}:/Chrome\//i.test(e)?{name:"chrome",version:a(e,/Chrome\/([\d.]+)/)}:{name:"unknown",version:""},o}function a(e,t){const n=e.match(t);return n?.[1]??""}const s=4294967296;function c(e){return"number"==typeof e&&Number.isFinite(e)&&e>0}async function u(e){try{switch(e){case"chrome":case"edge":case"opera":default:return await async function(){if(!navigator.storage?.estimate)return!1;const{quota:e}=await navigator.storage.estimate();return!!c(e)&&e<s}();case"brave":return await async function(){return!1}();case"safari":return await async function(){if(navigator.storage?.estimate)try{const{quota:e}=await navigator.storage.estimate();if(c(e))return e<s}catch{}try{return!!navigator.storage?.getDirectory&&(await navigator.storage.getDirectory(),!1)}catch(e){return"NotFoundError"===e?.name}}();case"firefox":return await async function(){if(window.isSecureContext&&!("serviceWorker"in navigator))return!0;try{return!!navigator.storage?.getDirectory&&(await navigator.storage.getDirectory(),!1)}catch(e){return"SecurityError"===e?.name}}()}}catch{return!1}}const l=Object.freeze({status:"absent"}),d="indexedDB",f="localStorage",p="cacheApi",m={storage:{strategy:"allowlist",objectRequired:!0,incognitoFullReplacement:{incognito:!0},paths:[{path:"quota",outputPath:"quota_bucket",lanes:["full"],operation:"log2Bucket16",defaultValue:null},{path:d,lanes:["full"],operation:"keep",defaultValue:null},{path:f,lanes:["full"],operation:"keep",defaultValue:null},{path:p,lanes:["full"],operation:"keep",defaultValue:null}]},webrtc:{strategy:"passthrough",paths:[{path:"videoCodecCount",lanes:["full","stable"],operation:"omit"}]},navigatorProps:{strategy:"passthrough",paths:[{path:"cookieEnabled",lanes:["stable"],operation:"omit"}]}},h=new Set(["anyHover","anyPointer","pointer","hover","update","colorGamut","monochrome"]),y={"fp-v3-cross-context":m,"fp-v4-cross-session":{storage:{strategy:"allowlist",objectRequired:!0,paths:[{path:d,lanes:["full","stable"],operation:"keep",defaultValue:null},{path:f,lanes:["full"],operation:"keep",defaultValue:null},{path:p,lanes:["full"],operation:"keep",defaultValue:null}]},workers:{strategy:"stableAllowlist",objectRequired:!0,paths:[{path:"webWorker",lanes:["stable"],operation:"keep",defaultValue:null},{path:"sharedWorker",lanes:["stable"],operation:"keep",defaultValue:null}]},webrtc:{strategy:"allowlist",objectRequired:!0,paths:[{path:"supported",lanes:["full","stable"],operation:"keep",defaultValue:null},{path:"audioCodecs",lanes:["full","stable"],operation:"keep",defaultValue:[]},{path:"videoCodecs",lanes:["full","stable"],operation:"keep",defaultValue:[]},{path:"extensions",lanes:["full","stable"],operation:"keep",defaultValue:[]}]},navigatorProps:{strategy:"passthrough",paths:[{path:"cookieEnabled",lanes:["stable"],operation:"omit"}]},mediaQueries:{strategy:"allowlist",objectRequired:!0,paths:["prefersContrast","anyHover","anyPointer","pointer","hover","update","invertedColors","prefersReducedMotion","prefersReducedTransparency","scripting","forcedColors","prefersColorScheme","colorGamut","dynamicRange","monochrome"].map(e=>({path:e,lanes:h.has(e)?["full","stable"]:["full"],operation:"keep",defaultValue:null}))},applePay:{strategy:"stableAllowlist",objectRequired:!0,paths:[{path:"supported",lanes:["stable"],operation:"keep",defaultValue:null}]}}},g=Symbol("omit");function w(e,t){let n=e;for(const e of t.split(".")){if("object"!=typeof n||null===n||Array.isArray(n)||!Object.prototype.propertyIsEnumerable.call(n,e))return{found:!1,value:void 0};n=n[e]}return{found:!0,value:n}}function v(e,t){return"omit"===e?g:"log2Bucket16"===e?"number"==typeof t&&Number.isFinite(t)&&t>0?Math.round(16*Math.log2(t))/16:null:t}function b(e,t,n){const r=n.find(e=>e.path===t);if(r)return v(r.operation,e);if("object"!=typeof e||null===e||Array.isArray(e)||""!==t&&!n.some(e=>e.path.startsWith(`${t}.`)))return e;const o=[];for(const[r,i]of Object.entries(e)){const e=b(i,t?`${t}.${r}`:r,n);e!==g&&o.push([r,e])}return Object.fromEntries(o)}function _(e,t,n,r,o){const i=y[e][t];if(!i)return n;if("stableAllowlist"===i.strategy&&"full"===r)return n;if(i.objectRequired&&("object"!=typeof n||null===n||Array.isArray(n)))return l;if("full"===r&&o.isIncognito&&i.incognitoFullReplacement)return{...i.incognitoFullReplacement};const a=i.paths.filter(e=>e.lanes.includes(r));if("passthrough"===i.strategy)return b(n,"",a);const s=n,c=[];for(const e of a){const t=w(s,e.path),n=t.found?t.value:e.defaultValue,r=v(e.operation,n);r!==g&&c.push([e.outputPath??e.path,r])}return Object.fromEntries(c)}function x(e,t){const n=e[0]>>>16,r=65535&e[0],o=e[1]>>>16,i=65535&e[1],a=t[0]>>>16,s=65535&t[0],c=t[1]>>>16;let u=0,l=0,d=0,f=0,p=0;return l=i+(65535&t[1]),u=l>>>16,l&=65535,d=o+c+u,u=d>>>16,d&=65535,f=r+s+u,u=f>>>16,f&=65535,p=n+a+u,p&=65535,[p<<16|f,d<<16|l]}function S(e,t){const n=e[0]>>>16,r=65535&e[0],o=e[1]>>>16,i=65535&e[1],a=t[0]>>>16,s=65535&t[0],c=t[1]>>>16,u=65535&t[1];let l=0,d=0,f=0,p=0,m=0;return d=i*u,l=d>>>16,d&=65535,f=o*u+l,l=f>>>16,f&=65535,f+=i*c,l+=f>>>16,f&=65535,p=r*u+l,l=p>>>16,p&=65535,p+=o*c,l+=p>>>16,p&=65535,p+=i*s,l+=p>>>16,p&=65535,m=n*u+r*c+o*s+i*a+l,m&=65535,[m<<16|p,f<<16|d]}function E(e,t){return 32==(t%=64)?[e[1],e[0]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t|e[0]>>>32-t]:(t-=32,[e[1]<<t|e[0]>>>32-t,e[0]<<t|e[1]>>>32-t])}function k(e,t){return 0==(t%=64)?[e[0],e[1]]:t<32?[e[0]<<t|e[1]>>>32-t,e[1]<<t]:[e[1]<<t-32,0]}function C(e,t){return[e[0]^t[0],e[1]^t[1]]}function A(e){let t=[e[0],e[1]];return t=C(t,[0,t[0]>>>1]),t=S(t,[4283543511,3981806797]),t=C(t,[0,t[0]>>>1]),t=S(t,[3301882366,444984403]),t=C(t,[0,t[0]>>>1]),t}function R(e){return("00000000"+(e>>>0).toString(16)).slice(-8)}function I(e,t=0){const n=e.length%16,r=e.length-n;let o=[0,t],i=[0,t];const a=[2277735313,289559509],s=[1291169091,658871167];for(let t=0;t<r;t+=16){let n=[255&e.charCodeAt(t+4)|(255&e.charCodeAt(t+5))<<8|(255&e.charCodeAt(t+6))<<16|(255&e.charCodeAt(t+7))<<24,255&e.charCodeAt(t)|(255&e.charCodeAt(t+1))<<8|(255&e.charCodeAt(t+2))<<16|(255&e.charCodeAt(t+3))<<24],r=[255&e.charCodeAt(t+12)|(255&e.charCodeAt(t+13))<<8|(255&e.charCodeAt(t+14))<<16|(255&e.charCodeAt(t+15))<<24,255&e.charCodeAt(t+8)|(255&e.charCodeAt(t+9))<<8|(255&e.charCodeAt(t+10))<<16|(255&e.charCodeAt(t+11))<<24];n=S(n,a),n=E(n,31),n=S(n,s),o=C(o,n),o=E(o,27),o=x(o,i),o=x(S(o,[0,5]),[0,1390208809]),r=S(r,s),r=E(r,33),r=S(r,a),i=C(i,r),i=E(i,31),i=x(i,o),i=x(S(i,[0,5]),[0,944331445])}let c=[0,0],u=[0,0];switch(n){case 15:u=C(u,k([0,e.charCodeAt(r+14)],48));case 14:u=C(u,k([0,e.charCodeAt(r+13)],40));case 13:u=C(u,k([0,e.charCodeAt(r+12)],32));case 12:u=C(u,k([0,e.charCodeAt(r+11)],24));case 11:u=C(u,k([0,e.charCodeAt(r+10)],16));case 10:u=C(u,k([0,e.charCodeAt(r+9)],8));case 9:u=C(u,[0,e.charCodeAt(r+8)]),u=S(u,s),u=E(u,33),u=S(u,a),i=C(i,u);case 8:c=C(c,k([0,e.charCodeAt(r+7)],56));case 7:c=C(c,k([0,e.charCodeAt(r+6)],48));case 6:c=C(c,k([0,e.charCodeAt(r+5)],40));case 5:c=C(c,k([0,e.charCodeAt(r+4)],32));case 4:c=C(c,k([0,e.charCodeAt(r+3)],24));case 3:c=C(c,k([0,e.charCodeAt(r+2)],16));case 2:c=C(c,k([0,e.charCodeAt(r+1)],8));case 1:c=C(c,[0,e.charCodeAt(r)]),c=S(c,a),c=E(c,31),c=S(c,s),o=C(o,c)}return o=C(o,[0,e.length]),i=C(i,[0,e.length]),o=x(o,i),i=x(i,o),o=A(o),i=A(i),o=x(o,i),i=x(i,o),R(o[0])+R(o[1])+R(i[0])+R(i[1])}function O(e){return T(e,new Set)}function T(e,t){if(null===e)return"null";if(void 0===e)return"undefined";const n=typeof e;if("boolean"===n||"number"===n)return String(e);if("string"===n)return JSON.stringify(e);if(Array.isArray(e)){if(t.has(e))return'"[Circular]"';t.add(e);const n=e.map(e=>T(e,t));return t.delete(e),"["+n.join(",")+"]"}if("object"===n){const n=e;if(t.has(n))return'"[Circular]"';t.add(n);const r=Object.keys(n).sort().filter(e=>void 0!==n[e]).map(e=>JSON.stringify(e)+":"+T(n[e],t));return t.delete(n),"{"+r.join(",")+"}"}return String(e)}const P=I("",t);function D(e,n){const r=function(e){if(0===e.length)return I("",t);if(1===e.length)return I(e[0],t);let n=[...e];for(;n.length>1;){const e=[];for(let r=0;r<n.length;r+=2){const o=r+1<n.length?n[r+1]:P;e.push(I(n[r]+o,t))}n=e}return n[0]}(Object.keys(e).sort().map(n=>{const r=function(e){let n=t;for(let t=0;t<e.length;t++)n=Math.imul(n^e.charCodeAt(t),1540483477),n^=n>>>13;return n>>>0}(n);return I(O(e[n]),r)})),o=String.fromCharCode(76,111,98,115),i=n?I(n,t):"";return I(r+o+i,t)}const M="__version",$=Object.freeze(["webgl","hardware","hardwareSensitive","math","i18n","touch","display","locale","workers","plugins","css","cssLayout","navigatorProps","timing","navigatorConnection","webgpu","audio","fonts","webrtc","permissions","speech","mediaQueries","applePay","keyboard","storage","extendedLocale","privacyPrefs","vendorFlavors","audioOscillator","canvas"]),L=Object.freeze(["webgl","hardware","hardwareSensitive","math","i18n","touch","locale","workers","plugins","css","navigatorProps","webgpu","webrtc","mediaQueries","applePay","storage","vendorFlavors"]),N=Object.freeze(["webgl","hardware","hardwareSensitive","math","i18n","touch","display","locale","workers","plugins","css","cssLayout","navigatorProps","timing","navigatorConnection","webgpu","audio","fonts","webrtc","permissions","speech","mediaQueries","applePay","keyboard","storage","extendedLocale","privacyPrefs","vendorFlavors","audioOscillator","canvas"]),j=Object.freeze(["webgl","hardware","hardwareSensitive","math","i18n","touch","locale","workers","plugins","css","navigatorProps","webgpu","webrtc","mediaQueries","vendorFlavors"]),B=Object.freeze(["webgl","hardware","hardwareSensitive","math","i18n","touch","display","locale","workers","plugins","css","cssLayout","navigatorProps","timing","navigatorConnection","webgpu","audio","fonts","webrtc","permissions","speech","mediaQueries","applePay","keyboard"]),F=Object.freeze(["webgl","hardware","hardwareSensitive","math","i18n","touch","locale","workers","plugins","css","navigatorProps","webgpu","webrtc","mediaQueries","applePay","keyboard"]);function V(e,t,n,r,o){const i={};for(const a of t)Object.prototype.propertyIsEnumerable.call(e,a)&&void 0!==e[a]?i[a]=_(n,a,e[a],o,{isIncognito:r}):i[a]=l;return i}function U(e,t,n,r,o,i){return{policyVersion:e,hash:D(V(t,o,e,r,"full"),n),stableHash:D(V(t,i,e,r,"stable"),n)}}function W(e,t,n){return U("fp-v4-cross-session",e,t,n,$,L)}function G(e,t,n){return U("fp-v3-cross-context",e,t,n,N,j)}function z(e,t){const n={[M]:"1.3.3"};for(const r of t)Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r]);return n}function H(e,t){return{policyVersion:"fp-v1",hash:D(z(e,B),t),stableHash:D(z(e,F),t)}}const q={name:"webgl",tier:1,async collect(){const e=document.createElement("canvas"),t=e.getContext("webgl")||e.getContext("experimental-webgl");if(!(t&&t instanceof WebGLRenderingContext))return null;const n=t.getExtension("WEBGL_debug_renderer_info"),r=t.getSupportedExtensions()??[],o=function(e){const t={},n=[e.VERTEX_SHADER,e.FRAGMENT_SHADER],r=[e.LOW_FLOAT,e.MEDIUM_FLOAT,e.HIGH_FLOAT,e.LOW_INT,e.MEDIUM_INT,e.HIGH_INT],o=["vertex","fragment"],i=["lowFloat","mediumFloat","highFloat","lowInt","mediumInt","highInt"];for(let a=0;a<n.length;a++){const s={};for(let t=0;t<r.length;t++){const o=e.getShaderPrecisionFormat(n[a],r[t]);o&&(s[i[t]]={rangeMin:o.rangeMin,rangeMax:o.rangeMax,precision:o.precision})}t[o[a]]=s}return t}(t),i={vendor:t.getParameter(t.VENDOR),renderer:t.getParameter(t.RENDERER),version:t.getParameter(t.VERSION),shadingLanguageVersion:t.getParameter(t.SHADING_LANGUAGE_VERSION),unmaskedVendor:n?t.getParameter(n.UNMASKED_VENDOR_WEBGL):null,unmaskedRenderer:n?t.getParameter(n.UNMASKED_RENDERER_WEBGL):null,extensions:r.sort(),maxTextureSize:t.getParameter(t.MAX_TEXTURE_SIZE),maxRenderbufferSize:t.getParameter(t.MAX_RENDERBUFFER_SIZE),maxViewportDims:Array.from(t.getParameter(t.MAX_VIEWPORT_DIMS)),maxVertexAttribs:t.getParameter(t.MAX_VERTEX_ATTRIBS),maxVertexUniformVectors:t.getParameter(t.MAX_VERTEX_UNIFORM_VECTORS),maxFragmentUniformVectors:t.getParameter(t.MAX_FRAGMENT_UNIFORM_VECTORS),maxVaryingVectors:t.getParameter(t.MAX_VARYING_VECTORS),aliasedLineWidthRange:Array.from(t.getParameter(t.ALIASED_LINE_WIDTH_RANGE)),aliasedPointSizeRange:Array.from(t.getParameter(t.ALIASED_POINT_SIZE_RANGE)),maxCombinedTextureImageUnits:t.getParameter(t.MAX_COMBINED_TEXTURE_IMAGE_UNITS),maxTextureImageUnits:t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS),maxVertexTextureImageUnits:t.getParameter(t.MAX_VERTEX_TEXTURE_IMAGE_UNITS),shaderPrecision:o,maxAnisotropy:K(t),webgl2:J(e)};return t.getExtension("WEBGL_lose_context")?.loseContext(),i}};function K(e){try{const t=e.getExtension("EXT_texture_filter_anisotropic")??e.getExtension("WEBKIT_EXT_texture_filter_anisotropic")??e.getExtension("MOZ_EXT_texture_filter_anisotropic");return t?e.getParameter(t.MAX_TEXTURE_MAX_ANISOTROPY_EXT):null}catch{return null}}function J(e){try{const t=e.getContext("webgl2");if(!t)return null;const n={version:t.getParameter(t.VERSION),maxSamples:t.getParameter(t.MAX_SAMPLES),max3DTextureSize:t.getParameter(t.MAX_3D_TEXTURE_SIZE),maxArrayTextureLayers:t.getParameter(t.MAX_ARRAY_TEXTURE_LAYERS),maxUniformBlockSize:t.getParameter(t.MAX_UNIFORM_BLOCK_SIZE),maxVertexUniformComponents:t.getParameter(t.MAX_VERTEX_UNIFORM_COMPONENTS),maxFragmentUniformComponents:t.getParameter(t.MAX_FRAGMENT_UNIFORM_COMPONENTS),maxColorAttachments:t.getParameter(t.MAX_COLOR_ATTACHMENTS),maxDrawBuffers:t.getParameter(t.MAX_DRAW_BUFFERS)};return t.getExtension("WEBGL_lose_context")?.loseContext(),n}catch{return null}}const Y={name:"hardware",tier:1,collect:async()=>({architecture:Z(),platform:X()})},Q={name:"hardwareSensitive",tier:1,collect:async()=>({deviceMemory:navigator.deviceMemory??null,hardwareConcurrency:navigator.hardwareConcurrency??null})};function X(){const e=navigator.userAgentData;if(e?.platform)return e.platform;const t=navigator.userAgent??"";return/Windows/.test(t)?"Windows":/Macintosh|Mac OS X/.test(t)?"macOS":/CrOS/.test(t)?"Chrome OS":/Android/.test(t)?"Android":/Linux/.test(t)?"Linux":/iPhone|iPad|iPod/.test(t)?"iOS":""}function Z(){try{const e=new ArrayBuffer(4),t=new Float32Array(e),n=new Uint8Array(e);return t[0]=1/0,n[3]}catch{return 0}}const ee={name:"math",tier:1,collect:async()=>({acos:Math.acos(.5),asin:te(Math.asin,-1,1,97),cos:te(Math.cos,0,Math.PI,97),cosLarge:Math.cos(1e20),sinLarge:Math.sin(1e20),tanLarge:Math.tan(1e20),sin:te(Math.sin,0,Math.PI,97),tan:te(Math.tan,0,Math.PI/4,97)})};function te(e,t,n,r){const o=(n-t)/r;let i=e(t)+e(n);for(let n=1;n<r;n++)i+=e(t+n*o)*(n%2==0?2:4);return i*o/3}const ne={name:"i18n",tier:1,collect:async()=>({dateTimeFormat:re(),numberFormat:oe(),collator:ie(),pluralRules:ae(),relativeTimeFormat:se(),listFormat:ce()})};function re(){try{const e=(new Intl.DateTimeFormat).resolvedOptions();return{locale:e.locale,calendar:e.calendar,numberingSystem:e.numberingSystem,timeZone:e.timeZone}}catch{return{}}}function oe(){try{const e=(new Intl.NumberFormat).resolvedOptions();return{locale:e.locale,numberingSystem:e.numberingSystem,style:e.style,minimumIntegerDigits:e.minimumIntegerDigits,minimumFractionDigits:e.minimumFractionDigits,maximumFractionDigits:e.maximumFractionDigits,useGrouping:e.useGrouping}}catch{return{}}}function ie(){try{const e=(new Intl.Collator).resolvedOptions();return{locale:e.locale,usage:e.usage,sensitivity:e.sensitivity,collation:e.collation,numeric:e.numeric,caseFirst:e.caseFirst}}catch{return{}}}function ae(){try{const e=(new Intl.PluralRules).resolvedOptions(),t=new Intl.PluralRules(void 0,{type:"ordinal"}).resolvedOptions();return{locale:e.locale,type:e.type,cardinalCategories:(new Intl.PluralRules).select(0)+","+(new Intl.PluralRules).select(1)+","+(new Intl.PluralRules).select(2)+","+(new Intl.PluralRules).select(5)+","+(new Intl.PluralRules).select(11)+","+(new Intl.PluralRules).select(100),ordinalCategory1:t.type,minimumIntegerDigits:e.minimumIntegerDigits}}catch{return{}}}function se(){try{const e=new Intl.RelativeTimeFormat;if(!e)return{};const t=e.resolvedOptions();return{locale:t.locale,style:t.style,numeric:t.numeric,numberingSystem:t.numberingSystem}}catch{return{}}}function ce(){try{const e=new Intl.ListFormat;if(!e)return{};const t=e.resolvedOptions(),n=["X","Y","Z"],r=new Intl.ListFormat(void 0,{type:"conjunction",style:"long"}),o=new Intl.ListFormat(void 0,{type:"disjunction",style:"long"});return{locale:t.locale,type:t.type,style:t.style,conjunctionSample:r.format(n),disjunctionSample:o.format(n)}}catch{return{}}}const ue={name:"domrect",tier:1,collect:async()=>({basic:function(){const e=document.createElement("div");e.style.cssText="position:fixed;left:-9999px;width:100px;height:100px;",document.body.appendChild(e);const t=e.getBoundingClientRect();return document.body.removeChild(e),{x:t.x,y:t.y,width:t.width,height:t.height,top:t.top,right:t.right,bottom:t.bottom,left:t.left}}(),precision:function(){const e=document.createElement("div");e.style.cssText=`position:absolute;left:-9999px;width:${Math.PI}px;height:${Math.E}px;`,document.body.appendChild(e);const t=e.getBoundingClientRect();return document.body.removeChild(e),{width:t.width,height:t.height}}(),fromRect:"undefined"!=typeof DOMRectReadOnly&&"function"==typeof DOMRectReadOnly.fromRect})},le={name:"touch",tier:1,collect:async()=>({supported:"ontouchstart"in window||navigator.maxTouchPoints>0,maxTouchPoints:navigator.maxTouchPoints??0})},de={name:"display",tier:1,collect:async()=>({colorDepth:screen.colorDepth??0,pixelDepth:screen.pixelDepth??0})},fe={name:"locale",tier:1,collect:async()=>({timezone:Intl.DateTimeFormat().resolvedOptions().timeZone??"",language:navigator.language??""})},pe={name:"workers",tier:1,collect:async()=>({webWorker:"undefined"!=typeof Worker,sharedWorker:"undefined"!=typeof SharedWorker,serviceWorker:"serviceWorker"in navigator})},me={name:"plugins",tier:1,async collect(){const e=[];if(navigator.plugins)for(let t=0;t<navigator.plugins.length;t++){const n=navigator.plugins[t];"internal-pdf-viewer"===n.filename&&e.push(`${n.name}|${n.filename}|${n.description}`)}return{plugins:e.sort(),pdfViewerEnabled:navigator.pdfViewerEnabled??!1}}},he=[["backdrop-filter","blur(1px)"],["container-type","inline-size"],["text-wrap","balance"],["overscroll-behavior","contain"],["hanging-punctuation","first"],["-webkit-line-clamp","1"],["appearance","none"],["font-size-adjust","ex-height 0.5"],["font-palette","normal"],["field-sizing","content"],["-webkit-text-stroke","1px black"],["zoom","1"],["scrollbar-width","thin"],["scrollbar-color","red blue"],["animation-timeline","auto"],["mask-composite","add"],["offset-path","none"],["text-decoration-thickness","1px"],["content-visibility","auto"],["contain-intrinsic-size","auto 100px"],["aspect-ratio","16/9"],["gap","10px"],["color-mix","in srgb, red 50%, blue"],["linear-gradient(in oklch, red, blue)",""]],ye={name:"css",tier:1,collect:async()=>({supports:ge(),safeArea:we()})};function ge(){const e={};if("undefined"==typeof CSS||"function"!=typeof CSS.supports)return e;for(const[t,n]of he)e[t]=n?CSS.supports(t,n):CSS.supports(t);return e}function we(){try{const e=document.createElement("div");e.style.cssText=["position:fixed","top:0","left:0","width:0","height:0","visibility:hidden","padding-top:env(safe-area-inset-top,0px)","padding-bottom:env(safe-area-inset-bottom,0px)","padding-left:env(safe-area-inset-left,0px)","padding-right:env(safe-area-inset-right,0px)"].join(";"),document.body.appendChild(e);const t=getComputedStyle(e),n={top:t.paddingTop,bottom:t.paddingBottom,left:t.paddingLeft,right:t.paddingRight};return document.body.removeChild(e),n}catch{return null}}const ve={name:"cssLayout",tier:1,collect:async()=>({scrollbarWidth:be()})};function be(){try{const e=document.createElement("div");e.style.cssText="visibility:hidden;overflow:scroll;position:absolute;top:-9999px;width:100px;height:100px",document.body.appendChild(e);const t=document.createElement("div");e.appendChild(t);const n=e.offsetWidth-t.offsetWidth;return document.body.removeChild(e),n}catch{return-1}}const _e={name:"navigatorProps",tier:1,collect:async()=>({vendor:navigator.vendor??"",productSub:navigator.productSub??"",cookieEnabled:navigator.cookieEnabled})},xe={name:"navigatorConnection",tier:2,async collect(){const e=navigator,t=e.connection??e.mozConnection??e.webkitConnection??null,n=performance.memory??null;return{connection:t?{type:t.type??null,effectiveType:t.effectiveType??null,saveData:t.saveData??null}:null,memory:n?{jsHeapSizeLimit:n.jsHeapSizeLimit}:null}}},Se={name:"timing",tier:2,collect:async()=>({performancePrecisionUs:Ee()})};function Ee(){try{const e=performance.now();let t=1/0,n=e;for(let r=0;r<50;r++){const r=performance.now(),o=r-n;if(o>0&&o<t&&(t=o),n=r,r-e>=1)break}if(t===1/0)return-1;const r=1e3*t;if(r<=0)return-1;const o=Math.max(0,Math.round(Math.log10(r)));return Math.pow(10,o)}catch{return-1}}const ke={name:"webgpu",tier:2,async collect(){const e=navigator.gpu;if(!e)return null;const t=await e.requestAdapter();if(!t)return null;let n="",r="",o="",i="";if(t.info)n=t.info.vendor??"",r=t.info.architecture??"",o=t.info.device??"",i=t.info.description??"";else if("function"==typeof t.requestAdapterInfo){const e=await t.requestAdapterInfo();n=e.vendor??"",r=e.architecture??"",o=e.device??"",i=e.description??""}const a=[];t.features&&(t.features.forEach(e=>a.push(e)),a.sort());const s={};if(t.limits){const e=["maxTextureDimension1D","maxTextureDimension2D","maxTextureDimension3D","maxTextureArrayLayers","maxBindGroups","maxBindGroupsPlusVertexBuffers","maxBindingsPerBindGroup","maxDynamicUniformBuffersPerPipelineLayout","maxDynamicStorageBuffersPerPipelineLayout","maxSampledTexturesPerShaderStage","maxSamplersPerShaderStage","maxStorageBuffersPerShaderStage","maxStorageTexturesPerShaderStage","maxUniformBuffersPerShaderStage","maxUniformBufferBindingSize","maxStorageBufferBindingSize","minUniformBufferOffsetAlignment","minStorageBufferOffsetAlignment","maxVertexBuffers","maxBufferSize","maxVertexAttributes","maxVertexBufferArrayStride","maxInterStageShaderComponents","maxInterStageShaderVariables","maxColorAttachments","maxColorAttachmentBytesPerSample","maxComputeWorkgroupStorageSize","maxComputeInvocationsPerWorkgroup","maxComputeWorkgroupSizeX","maxComputeWorkgroupSizeY","maxComputeWorkgroupSizeZ","maxComputeWorkgroupsPerDimension"];for(const n of e){const e=t.limits[n];void 0!==e&&(s[n]=e)}}return{vendor:n,architecture:r,device:o,description:i,features:a,limits:s}}},Ce={name:"audio",tier:2,async collect(){const e=window.AudioContext||window.webkitAudioContext;if(!e)return null;let t=null;try{t=new e;const n=t.destination;return{sampleRate:t.sampleRate,maxChannelCount:n.maxChannelCount,channelCount:n.channelCount,channelCountMode:n.channelCountMode,channelInterpretation:n.channelInterpretation,baseLatency:t.baseLatency??null,outputLatency:t.outputLatency??null}}finally{if(t&&"closed"!==t.state)try{await t.close()}catch{}}}},Ae=["Arial","Arial Black","Arial Narrow","Arial Rounded MT Bold","Bookman Old Style","Bradley Hand","Calibri","Cambria","Cambria Math","Century","Century Gothic","Comic Sans MS","Consolas","Courier","Courier New","Garamond","Geneva","Georgia","Gill Sans","Helvetica","Helvetica Neue","Impact","Lucida Console","Lucida Grande","Lucida Sans Unicode","Microsoft Sans Serif","Monaco","Palatino","Palatino Linotype","Segoe Print","Segoe Script","Segoe UI","Tahoma","Times","Times New Roman","Trebuchet MS","Verdana","Wingdings","Wingdings 2","Wingdings 3","Inter","Roboto","Open Sans","Lato","Montserrat","Poppins","Nunito","Raleway","Ubuntu","Merriweather","Playfair Display","Source Sans Pro","Source Code Pro","Fira Code","JetBrains Mono","Cascadia Code","Apple Color Emoji","Segoe UI Emoji","Noto Color Emoji","SF Pro","SF Pro Display","SF Mono","San Francisco","Menlo","Andale Mono","Futura","MS Gothic","MS Mincho","MS PGothic","MS PMincho","Yu Gothic","Meiryo","Hiragino Sans","Hiragino Kaku Gothic Pro","SimSun","SimHei","Microsoft YaHei","PingFang SC","Noto Sans CJK","Malgun Gothic","Arial Hebrew"],Re=["monospace","sans-serif","serif"],Ie="mmMwWLliI0O&1",Oe={name:"fonts",tier:2,collect:()=>new Promise(e=>{const t=()=>e(function(){try{if("undefined"==typeof document)return{available:[],method:"css-layout"};const e=new Set,t=[];if("function"==typeof document.fonts?.check)for(const n of Ae)document.fonts.check(`72px "${n}"`)?e.add(n):t.push(n);else t.push(...Ae);const n=new Set;if(t.length>0){const e=document.createElement("div");e.style.cssText="position:absolute;visibility:hidden;top:-9999px;left:-9999px;pointer-events:none;";const r=Re.map(t=>{const n=document.createElement("span");return n.style.cssText=`font-size:72px;font-family:${t};white-space:nowrap;display:inline-block`,n.textContent=Ie,e.appendChild(n),n}),o=t.map(t=>Re.map(n=>{const r=document.createElement("span");return r.style.cssText=`font-size:72px;font-family:'${t}',${n};white-space:nowrap;display:inline-block`,r.textContent=Ie,e.appendChild(r),r}));document.body.appendChild(e);const i=r.map(e=>e.getBoundingClientRect().width),a=o.map(e=>e.map(e=>e.getBoundingClientRect().width));document.body.removeChild(e);for(let e=0;e<t.length;e++)for(let r=0;r<Re.length;r++)if(a[e][r]!==i[r]){n.add(t[e]);break}}return{available:Ae.filter(t=>e.has(t)||n.has(t)),method:"css-layout"}}catch{return{available:[],method:"css-layout"}}}());"undefined"!=typeof requestIdleCallback?requestIdleCallback(t,{timeout:2e3}):setTimeout(t,0)})},Te={name:"webrtc",tier:2,async collect(){if("undefined"==typeof RTCPeerConnection)return{supported:!1,audioCodecCount:0,videoCodecCount:0,audioCodecs:[],videoCodecs:[],extensions:[]};const e=new RTCPeerConnection({iceServers:[]});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=(await e.createOffer()).sdp??"",n=Pe(t,"audio"),r=Pe(t,"video"),o=function(e){const t=new Set,n=e.split("\r\n");for(const e of n)if(e.startsWith("a=extmap:")){const n=e.match(/^a=extmap:\d+(?:\/\w+)?\s+(.+)$/);n&&t.add(n[1].trim())}return Array.from(t)}(t);return{supported:!0,audioCodecCount:n.length,videoCodecCount:r.length,audioCodecs:n.sort(),videoCodecs:r.sort(),extensions:o.sort()}}finally{e.close()}}};function Pe(e,t){const n=[],r=e.split("\r\n");let o=!1;for(const e of r)if(e.startsWith(`m=${t}`))o=!0;else{if(e.startsWith("m=")&&o)break;if(o&&e.startsWith("a=rtpmap:")){const t=e.match(/^a=rtpmap:\d+\s+(.+)$/);t&&n.push(t[1])}}return n}const De=["accelerometer","accessibility-events","ambient-light-sensor","background-fetch","background-sync","bluetooth","camera","clipboard-read","clipboard-write","display-capture","geolocation","gyroscope","local-fonts","magnetometer","microphone","midi","nfc","notifications","payment-handler","persistent-storage","push","screen-wake-lock","speaker-selection","storage-access","top-level-storage-access","window-management","xr-spatial-tracking"],Me={name:"permissions",tier:2,async collect(){if(!navigator.permissions?.query)return{states:{}};const e=()=>Promise.allSettled(De.map(async e=>{try{return{name:e,state:(await navigator.permissions.query({name:e})).state}}catch{return{name:e,state:"error"}}})),t=await Promise.all([e(),e(),e()]),n={};for(const e of t)for(const t of e)if("fulfilled"===t.status){const{name:e,state:r}=t.value;n[e]||(n[e]=[]),n[e].push(r)}const r={};for(const[e,t]of Object.entries(n))r[e]=$e(t);return{states:r}}};function $e(e){const t={};for(const n of e)t[n]=(t[n]??0)+1;let n=e[0],r=0;for(const[e,o]of Object.entries(t))o>r&&(n=e,r=o);return n}const Le={name:"speech",tier:2,async collect(){if("undefined"==typeof speechSynthesis)return{supported:!1,voiceCount:0,voices:[]};const e=await new Promise(e=>{const t=speechSynthesis.getVoices();if(t.length>0)return void e(t);const n=setTimeout(()=>e([]),800);speechSynthesis.addEventListener("voiceschanged",()=>{clearTimeout(n),e(speechSynthesis.getVoices())},{once:!0})}),t=e.map(e=>`${e.name}|${e.lang}|${e.localService}`).sort();return{supported:!0,voiceCount:e.length,voices:t}}},Ne=[{name:"prefers-contrast",values:["no-preference","more","less","custom"]},{name:"any-hover",values:["none","hover"]},{name:"any-pointer",values:["none","coarse","fine"]},{name:"pointer",values:["none","coarse","fine"]},{name:"hover",values:["none","hover"]},{name:"update",values:["none","slow","fast"]},{name:"inverted-colors",values:["none","inverted"]},{name:"prefers-reduced-motion",values:["no-preference","reduce"]},{name:"prefers-reduced-transparency",values:["no-preference","reduce"]},{name:"scripting",values:["none","initial-only","enabled"]},{name:"forced-colors",values:["none","active"]},{name:"prefers-color-scheme",values:["light","dark"]},{name:"color-gamut",values:["srgb","p3","rec2020"]},{name:"dynamic-range",values:["standard","high"]}],je={name:"mediaQueries",tier:2,async collect(){if("function"!=typeof matchMedia){const e={};for(const t of Ne)e[t.name.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())]="unsupported";return{...e,monochrome:0}}const e={};for(const t of Ne){let n="unknown";for(const e of t.values){const r=matchMedia(`(${t.name}: ${e})`);if(r?.matches){n=e;break}}e[t.name.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())]=n}let t=0;for(let e=100;e>=0;e--)if(matchMedia(`(monochrome: ${e})`)?.matches){t=e;break}return{...e,monochrome:t}}},Be={name:"applePay",tier:2,async collect(){const e=window.ApplePaySession;if(!e||"function"!=typeof e.supportsVersion)return{supported:!1,maxVersion:0};let t=0;for(let n=15;n>=1;n--)try{if(e.supportsVersion(n)){t=n;break}}catch{continue}return{supported:!0,maxVersion:t}}},Fe=["KeyQ","KeyW","KeyA","KeyS","KeyZ","KeyX","KeyY","KeyM","Semicolon","BracketLeft","Quote","Digit1","Digit2","Digit3"],Ve={name:"keyboard",tier:2,async collect(){const e=navigator.keyboard;if(!e||"function"!=typeof e.getLayoutMap)return{supported:!1,layoutKeys:null,layoutHint:null};try{const t=await e.getLayoutMap(),n={};for(const e of Fe){const r=t.get(e);void 0!==r&&(n[e]=r)}return{supported:!0,layoutKeys:n,layoutHint:Ue(n)}}catch{return{supported:!1,layoutKeys:null,layoutHint:null}}}};function Ue(e){const t=e.KeyQ,n=e.KeyZ,r=e.KeyY;return t?"a"===t?"azerty":"q"===t&&"z"===r?"qwertz":"q"===t&&"z"===n?"qwerty":"'"===t?"dvorak":"other":null}const We={name:"canvas",tier:2,async collect(){const e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return null;e.width=240,e.height=120,t.textBaseline="alphabetic",t.fillStyle="#f60",t.fillRect(100,1,62,20),t.fillStyle="#069",t.font='11pt "Times New Roman"',t.fillText("Cwm fjordbank gly"+String.fromCharCode(55357,56835),2,15),t.fillStyle="rgba(102,204,0,0.2)",t.font="18pt Arial",t.fillText("Cwm fjordbank gly"+String.fromCharCode(55357,56835),4,45);const n=e.toDataURL("image/png");t.clearRect(0,0,e.width,e.height),t.globalCompositeOperation="multiply",t.fillStyle="#f2f",t.beginPath(),t.arc(40,40,40,0,2*Math.PI),t.fill(),t.fillStyle="#2ff",t.beginPath(),t.arc(80,40,40,0,2*Math.PI),t.fill(),t.fillStyle="#ff2",t.beginPath(),t.arc(60,80,40,0,2*Math.PI),t.fill(),t.globalCompositeOperation="source-over",t.fillStyle="#f9c",t.beginPath(),t.arc(60,60,60,0,2*Math.PI),t.arc(60,60,20,0,2*Math.PI),t.fill("evenodd");const r=e.toDataURL("image/png");return{textDataUrl:n,geometryDataUrl:r,readbackAllowed:n.length>=1e3&&r.length>=1e3,windingRule:0===t.getImageData(60,60,1,1).data[3]}}},Ge={name:"audioOscillator",tier:2,async collect(){const e=window.OfflineAudioContext||window.webkitOfflineAudioContext;if(!e)return null;const t=new e(1,5e3,44100),n=t.createOscillator();n.type="triangle",n.frequency.value=1e4;const r=t.createDynamicsCompressor();r.threshold.value=-50,r.knee.value=40,r.ratio.value=12,r.attack.value=0,r.release.value=.25,n.connect(r),r.connect(t.destination),n.start(0);const o=(await t.startRendering()).getChannelData(0).slice(4500,5e3);let i=0;for(let e=0;e<o.length;e++)i+=Math.abs(o[e]);return{sampleSum:i,sampleCount:o.length}}},ze={name:"webglRender",tier:2,async collect(){const e=document.createElement("canvas");e.width=256,e.height=256;const t=e.getContext("webgl",{preserveDrawingBuffer:!0});if(!t)return null;try{const e="\n attribute vec2 position;\n attribute vec3 color;\n varying vec3 vColor;\n void main() {\n gl_Position = vec4(position, 0.0, 1.0);\n vColor = color;\n }\n ",n="\n precision mediump float;\n varying vec3 vColor;\n void main() {\n gl_FragColor = vec4(vColor, 1.0);\n }\n ",r=t.createShader(t.VERTEX_SHADER);t.shaderSource(r,e),t.compileShader(r);const o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,n),t.compileShader(o);const i=t.createProgram();t.attachShader(i,r),t.attachShader(i,o),t.linkProgram(i),t.useProgram(i);const a=new Float32Array([-.5,-.5,1,0,0,.5,-.5,0,1,0,0,.5,0,0,1]),s=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,s),t.bufferData(t.ARRAY_BUFFER,a,t.STATIC_DRAW);const c=t.getAttribLocation(i,"position");t.enableVertexAttribArray(c),t.vertexAttribPointer(c,2,t.FLOAT,!1,20,0);const u=t.getAttribLocation(i,"color");t.enableVertexAttribArray(u),t.vertexAttribPointer(u,3,t.FLOAT,!1,20,8),t.clearColor(0,0,0,1),t.clear(t.COLOR_BUFFER_BIT),t.drawArrays(t.TRIANGLES,0,3),t.enable(t.BLEND),t.blendFunc(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA),t.drawArrays(t.TRIANGLES,0,3);const l=new Uint8Array(262144);t.readPixels(0,0,256,256,t.RGBA,t.UNSIGNED_BYTE,l);const d=function(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e[n],t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}(l);let f=!1;for(let e=0;e<l.length;e++)if(0!==l[e]){f=!0;break}return{pixelHash:d,readbackAllowed:f}}finally{t.getExtension("WEBGL_lose_context")?.loseContext()}}},He=["14px Arial","14px Georgia","14px monospace"],qe={name:"canvasTextMetrics",tier:2,async collect(){const e=document.createElement("canvas").getContext("2d");if(!e)return null;const t=[];for(const n of He){e.font=n;const r=e.measureText("Sphinx of black quartz, judge my vow. 0123456789");t.push({font:n,width:r.width,actualBoundingBoxAscent:r.actualBoundingBoxAscent??null,actualBoundingBoxDescent:r.actualBoundingBoxDescent??null,actualBoundingBoxLeft:r.actualBoundingBoxLeft??null,actualBoundingBoxRight:r.actualBoundingBoxRight??null,fontBoundingBoxAscent:r.fontBoundingBoxAscent??null,fontBoundingBoxDescent:r.fontBoundingBoxDescent??null})}return{metrics:t}}},Ke=["chrome","safari","__crWeb","__gCrWeb","yandex","__yb","__ybro","__firefox__","__edgeTrackingPreventionStatistics","webkit","oprt","samsungAr","ucweb","UCShellJava","puffinDevice"],Je={name:"vendorFlavors",tier:2,async collect(){const e=window,t=[];for(const n of Ke)void 0!==e[n]&&t.push(n);return t.sort(),{flavors:t}}},Ye=[{key:"default",family:""},{key:"apple",family:"-apple-system, BlinkMacSystemFont"},{key:"serif",family:"serif"},{key:"sansSerif",family:"sans-serif"},{key:"monospace",family:"monospace"},{key:"systemUi",family:"system-ui"}],Qe={name:"fontPreferences",tier:2,async collect(){if("undefined"==typeof document||!document.body)return null;const e=document.createElement("div");e.style.cssText="position:absolute;visibility:hidden;top:-9999px";const t=Ye.map(({family:t})=>{const n=document.createElement("span");return n.textContent="mmMwWLliI0fiflO&1",n.style.fontSize="72px",t&&(n.style.fontFamily=t),e.appendChild(n),n});document.body.appendChild(e);const n={};for(let e=0;e<Ye.length;e++){const r=t[e].getBoundingClientRect().width;n[Ye[e].key]=Math.round(1e3*r)/1e3}return document.body.removeChild(e),n}},Xe={name:"screenFrame",tier:2,async collect(){const e=screen,t=e.availTop??0,n=e.availLeft??0;return{top:t,right:screen.width-(e.availWidth??screen.width)-n,bottom:screen.height-(e.availHeight??screen.height)-t,left:n}}};function Ze(e){return/Not[ ;)\/]/i.test(e)}const et={name:"clientHints",tier:2,async collect(){const e=navigator;if(!e.userAgentData)return null;const t=(e.userAgentData.brands??[]).filter(e=>!Ze(e.brand)),n=e.userAgentData.mobile??!1,r=e.userAgentData.platform??"",o=await e.userAgentData.getHighEntropyValues(["architecture","bitness","model","platformVersion","fullVersionList"]),i=(o.fullVersionList??[]).filter(e=>!Ze(e.brand));return{brands:t,mobile:n,platform:r,architecture:o.architecture??"",bitness:o.bitness??"",model:o.model??"",platformVersion:o.platformVersion??"",fullVersionList:i}}},tt=[{name:"EasyList",selectors:[".ad-banner",".ad_banner","#ad-banner",".adsbygoogle",".ad-container"]},{name:"AdGuard Base",selectors:[".BannerAd",".ad-rotate","#ad-box",".ad-placement",".ad-zone"]},{name:"EasyPrivacy",selectors:["#tracking-pixel",".tracking",".analytics-tag","#beacon",".pixel-tracker"]},{name:"Fanboy Annoyances",selectors:["#newsletter-popup",".cookie-banner",".consent-dialog","#gdpr-notice",".subscribe-modal"]},{name:"AdGuard Tracking",selectors:[".tracker-frame","#analytics-beacon",".telemetry-pixel",".data-tracker","#stats-counter"]}],nt={name:"domBlockers",tier:2,async collect(){if("undefined"==typeof document||!document.body)return{activeFilters:[]};const e=[],t=[];try{for(const n of tt){const r=[];for(const t of n.selectors){const n=document.createElement("div");t.startsWith("#")?n.id=t.slice(1):n.className=t.slice(1),document.body.appendChild(n),r.push(n),e.push(n)}t.push({name:n.name,elements:r})}await new Promise(e=>setTimeout(e,0));const n=[];for(const{name:e,elements:r}of t){let t=0;for(const e of r)null===e.offsetParent&&t++;t/r.length>.6&&n.push(e)}return{activeFilters:n}}catch{return{activeFilters:[]}}finally{for(const t of e)try{t.parentNode?.removeChild(t)}catch{}}}},rt={name:"privateClickMeasurement",tier:2,collect:async()=>({supported:"attributionSourceId"in document.createElement("a")})},ot={name:"automationDetection",tier:2,async collect(){const e=!!navigator.webdriver,t=function(){const e=[];try{const t=Object.getOwnPropertyNames(document);for(const n of t)/^\$?cdc_/.test(n)&&e.push(n)}catch{}const t=[["_Selenium_IDE_Recorder",()=>"t"in window],["__webdriver_evaluate",()=>"o"in document],["__driver_evaluate",()=>"i"in document],["__puppeteer_evaluation_script__",()=>"u"in window],["__playwright__binding__",()=>"l"in window],["__pwInitScripts",()=>"p"in window],["callPhantom",()=>"callPhantom"in window],["_phantom",()=>"m"in window],["__nightmare",()=>"h"in window],["domAutomation",()=>"domAutomation"in window],["domAutomationController",()=>"domAutomationController"in window]];for(const[n,r]of t)try{r()&&e.push(n)}catch{}return e}(),n=await async function(){const e=[];try{0===navigator.plugins.length&&window.chrome&&e.push("no_plugins_with_chrome")}catch{}0!==window.outerWidth&&0!==window.outerHeight||e.push("zero_outer_dimensions"),0===screen.availHeight&&e.push("zero_avail_height");try{0===navigator.languages.length&&e.push("empty_languages")}catch{}try{window.chrome&&void 0===window.chrome?.runtime&&e.push("chrome_without_runtime")}catch{}try{"undefined"!=typeof Notification&&"denied"===Notification.permission&&"prompt"===(await navigator.permissions.query({name:"notifications"})).state&&e.push("notification_permission_contradiction")}catch{}return e}(),r=function(){let e=null;try{if(e=document.createElement("canvas").getContext("webgl"),!e)return!1;const t=e.getExtension("WEBGL_debug_renderer_info");if(!t)return!1;const n=e.getParameter(t.UNMASKED_RENDERER_WEBGL);if("string"!=typeof n)return!1;const r=["swiftshader","google swiftshader","llvmpipe","mesa","software rasterizer","microsoft basic render driver"],o=n.toLowerCase();return r.some(e=>o.includes(e))}catch{return!1}finally{if(e){const t=e.getExtension("WEBGL_lose_context");t&&t.loseContext()}}}();let o=0;return e&&(o+=30),t.length>0&&(o+=25),n.length>=2&&(o+=20),r&&(o+=25),{webdriver:e,automationMarkers:t,headlessIndicators:n,softwareRenderer:r,botScore:o}}},it={name:"agentDetection",tier:2,async collect(){const e=function(){const e=[];try{13===navigator.hardwareConcurrency&&e.push("unusual_core_count_13")}catch{}try{4===navigator.deviceMemory&&6===navigator.hardwareConcurrency&&e.push("manus_hardware_signature")}catch{}try{1280===screen.width&&1100===screen.height&&e.push("manus_resolution")}catch{}try{if("UTC"===Intl.DateTimeFormat().resolvedOptions().timeZone){const t=navigator.languages||[],n=["en-GB","pt-PT","is","is-IS"];t.some(e=>n.includes(e))||e.push("utc_timezone_mismatch")}}catch{}return e}(),t=function(){try{const e=navigator.userAgent||"",t=navigator.userAgentData?.platform,n=navigator.platform||"";let r="";if(/Windows/.test(e)?r="Windows":/Macintosh|Mac OS X/.test(e)?r="macOS":/Android/.test(e)?r="Android":/iPhone|iPad|iPod/.test(e)?r="iOS":/Linux/.test(e)&&(r="Linux"),t){const e=t.toLowerCase();if("linux"===e&&("macOS"===r||"Windows"===r))return!1;if("windows"===e&&"macOS"===r)return!1;if("macos"===e&&"Windows"===r)return!1}if(n){const e=n.toLowerCase();if(e.includes("linux")&&("macOS"===r||"Windows"===r))return!1;if(e.includes("win")&&"macOS"===r)return!1;if(e.includes("mac")&&"Windows"===r)return!1}return!0}catch{return!0}}(),n=function(){try{const e=Intl.DateTimeFormat().resolvedOptions().timeZone,t=(new Date).getTimezoneOffset();return"UTC"!==e||0===t}catch{return!0}}(),r=function(e,t){return e.includes("unusual_core_count_13")?"chatgpt":e.includes("manus_hardware_signature")&&e.includes("manus_resolution")?"manus":t?null:"operator"}(e,t);let o=0;return o+=25*e.length,t||(o+=30),r&&(o+=50),{fingerprintAnomalies:e,uaPlatformMatch:t,timezoneConsistent:n,detectedAgent:r,agentScore:o}}},at={name:"tamperDetection",tier:2,async collect(){const e=function(){try{const e=navigator.userAgent||"",t=/Chrome\//.test(e)&&!/Edg\//.test(e),n=/Firefox\//.test(e)&&!/Chrome/.test(e),r="undefined"!=typeof CSS&&CSS.supports&&CSS.supports("-moz-appearance","none"),o=void 0!==window.chrome;return!(t&&r||n&&o)}catch{return!0}}(),t=function(){try{const e=Object.getOwnPropertyDescriptor(Navigator.prototype,"userAgent");if(!e)return!1;if(!e.get)return!1;const t=e.get.toString();return!!/\[native code\]/.test(t)}catch{return!0}}(),n=function(){try{const e=eval.toString().length;if(33!==e&&37!==e&&39!==e&&(e<20||e>60))return!1;try{if(1!==new(0,navigator.userAgent.constructor.constructor)("return 1")())return!1}catch{return!1}return!0}catch{return!0}}(),r=function(){const e=[];try{"v"in window&&e.push("multilogin")}catch{}try{void 0!==window.chrome&&0===navigator.plugins.length&&e.push("empty_plugins_chromium")}catch{}try{const t=window;if(t.safari){const n=t.safari.toString?.();n&&!/\[object Safari\]/.test(n)&&e.push("safari_object_spoofed")}}catch{}try{const t=navigator.userAgent||"",n=t.match(/Chrome\/(\d+)/);n&&parseInt(n[1],10)>=88&&/Macintosh/.test(t)&&void 0===window.BarcodeDetector&&e.push("missing_barcode_detector")}catch{}return e}(),o=function(){try{const e=((new Error).stack||"").split("\n").filter(e=>e.trim().length>0);for(const t of e){const e=t.trim();if("Error"!==e){if(/^\s*at\s/.test(e))return"chromium";if(/@/.test(e)&&!e.startsWith("at"))return/^\w+@/.test(e)?"gecko":"webkit"}}return"unknown"}catch{return"unknown"}}(),i=eval.toString().length;let a=0;if(e||(a+=30),t||(a+=25),n||(a+=20),a+=15*r.length,"unknown"!==o){const e=navigator.userAgent||"";("gecko"===o&&!/Firefox/.test(e)||"chromium"===o&&/Firefox/.test(e)&&!/Chrome/.test(e))&&(a+=10)}return{uaEngineConsistent:e,navigatorPropsNative:t,prototypeChainIntact:n,antiDetectMarkers:r,stackTraceFormat:o,evalLength:i,tamperScore:a}}},st={name:"vmDetection",tier:2,async collect(){const e=function(){const e=[];try{navigator.hardwareConcurrency<=2&&e.push("low_core_count")}catch{}try{const t=navigator.deviceMemory;"number"==typeof t&&t<=2&&e.push("low_memory")}catch{}try{screen.colorDepth<24&&e.push("low_color_depth")}catch{}try{screen.colorDepth!==screen.pixelDepth&&e.push("depth_mismatch")}catch{}return e}();let t="",n=null;try{if(n=document.createElement("canvas").getContext("webgl"),n){const e=n.getExtension("WEBGL_debug_renderer_info");e&&(t=n.getParameter(e.UNMASKED_RENDERER_WEBGL)||"")}}catch{}finally{if(n)try{const e=n.getExtension("WEBGL_lose_context");e&&e.loseContext()}catch{}}const r=function(e){if(!e)return[];const t=e.toLowerCase();return ct.filter(e=>t.includes(e))}(t),o=function(e){if(!e)return!1;const t=e.toLowerCase();return ut.some(e=>t.includes(e))}(t);let i=0;return r.length>0?i=.9:o?i=.5:e.length>=3&&(i=.3),{isVM:r.length>0,vmRendererMatches:r,softwareRenderer:o,confidence:i,indicators:e}}},ct=["virtualbox","vmware","svga3d","qemu","parallels","hyper-v","qxl","red hat","virtio","citrix"],ut=["swiftshader","google swiftshader","llvmpipe","mesa","software rasterizer","microsoft basic render driver","softpipe"],lt=[{label:"h264",contentType:'video/mp4; codecs="avc1.42E01E"',width:1920,height:1080,bitrate:5e6,framerate:30},{label:"vp8",contentType:'video/webm; codecs="vp8"',width:1920,height:1080,bitrate:5e6,framerate:30},{label:"vp9",contentType:'video/webm; codecs="vp09.00.10.08"',width:1920,height:1080,bitrate:5e6,framerate:30},{label:"av1",contentType:'video/mp4; codecs="av01.0.05M.08"',width:1920,height:1080,bitrate:5e6,framerate:30}],dt=[{label:"aac",contentType:'audio/mp4; codecs="mp4a.40.2"',channels:"2",bitrate:128e3,samplerate:44100},{label:"opus",contentType:'audio/webm; codecs="opus"',channels:"2",bitrate:128e3,samplerate:48e3}],ft=[q,Y,Q,ee,ne,ue,le,de,fe,pe,me,ye,ve,_e,Se,xe,ke,Ce,Oe,Te,Me,Le,je,Be,Ve,We,Ge,ze,qe,Je,Qe,Xe,et,nt,rt,ot,it,at,st,{name:"devtoolsDetection",tier:2,collect:async()=>({dimensionDelta:function(){const e=window.outerHeight-window.innerHeight,t=window.outerWidth-window.innerWidth;return{heightDelta:e,widthDelta:t,likelyOpen:e>200||t>200}}(),consoleNative:function(){try{return/\[native code\]/.test(Function.prototype.toString.call(console.log))}catch{return!0}}()})},{name:"webApis",tier:2,async collect(){const e=navigator,t=window;return{credentials:void 0!==e.credentials,usb:void 0!==e.usb,bluetooth:void 0!==e.bluetooth,clipboard:void 0!==e.clipboard,serial:void 0!==e.serial,hid:void 0!==e.hid,xr:void 0!==e.xr,share:"function"==typeof e.share,wakeLock:void 0!==e.wakeLock,presentation:void 0!==e.presentation,mediaSession:void 0!==e.mediaSession,ink:void 0!==e.ink,virtualKeyboard:void 0!==e.virtualKeyboard,eyeDropper:void 0!==t.EyeDropper,getScreenDetails:"function"==typeof t.getScreenDetails,paymentRequest:void 0!==t.PaymentRequest,adoptedStyleSheets:void 0!==document.adoptedStyleSheets,cssHighlights:void 0!==t.CSS?.highlights}}},{name:"notificationState",tier:2,async collect(){const e="undefined"!=typeof Notification;return{supported:e,permission:e?Notification.permission:null}}},{name:"extendedLocale",tier:2,collect:async()=>({languages:Array.from(navigator.languages??[])})},{name:"privacyPrefs",tier:2,async collect(){const e=navigator;return{doNotTrack:navigator.doNotTrack??null,globalPrivacyControl:e.globalPrivacyControl??null}}},{name:"performanceContext",tier:2,async collect(){let e=null;try{const t=performance.getEntriesByType("navigation");t.length>0&&(e=t[0].nextHopProtocol||null)}catch{}let t=[];try{t=Array.from(PerformanceObserver.supportedEntryTypes??[])}catch{}return{nextHopProtocol:e,supportedEntryTypes:t}}},{name:"sensors",tier:2,async collect(){const e=window;return{deviceOrientation:void 0!==e.DeviceOrientationEvent,deviceMotion:void 0!==e.DeviceMotionEvent,gyroscope:void 0!==e.Gyroscope,accelerometer:void 0!==e.Accelerometer,ambientLightSensor:void 0!==e.AmbientLightSensor,absoluteOrientationSensor:void 0!==e.AbsoluteOrientationSensor,relativeOrientationSensor:void 0!==e.RelativeOrientationSensor}}},{name:"battery",tier:2,collect:async()=>({supported:"function"==typeof navigator.getBattery})},{name:"gamepads",tier:2,collect:async()=>({supported:"function"==typeof navigator.getGamepads})},{name:"storage",tier:2,async collect(){let e=null;try{navigator.storage?.estimate&&(e=(await navigator.storage.estimate()).quota??null)}catch{}let t=!1;try{t=void 0!==window.indexedDB}catch{}let n=!1;try{n=void 0!==window.localStorage}catch{}let r=!1;try{r=void 0!==window.caches}catch{}return{quota:e,indexedDB:t,localStorage:n,cacheApi:r}}},{name:"features",tier:2,async collect(){const e=window;return{isSecureContext:!!e.isSecureContext,webdriver:!!navigator.webdriver,crossOriginIsolated:!!e.crossOriginIsolated,sharedArrayBuffer:void 0!==e.SharedArrayBuffer,webAssembly:void 0!==e.WebAssembly,bigInt:void 0!==e.BigInt,offscreenCanvas:void 0!==e.OffscreenCanvas}}},{name:"screen",tier:2,async collect(){const e=window.visualViewport;return{availWidth:screen.availWidth??0,availHeight:screen.availHeight??0,devicePixelRatio:window.devicePixelRatio??1,orientationType:screen.orientation?.type??null,orientationAngle:screen.orientation?.angle??null,visualViewport:e?{width:e.width,height:e.height,offsetLeft:e.offsetLeft,offsetTop:e.offsetTop,scale:e.scale}:null}}},{name:"mediaCapabilities",tier:2,async collect(){if(!navigator.mediaCapabilities?.decodingInfo)return null;const e={},t=[...lt.map(e=>({label:e.label,config:{type:"file",video:{contentType:e.contentType,width:e.width,height:e.height,bitrate:e.bitrate,framerate:e.framerate}}})),...dt.map(e=>({label:e.label,config:{type:"file",audio:{contentType:e.contentType,channels:e.channels,bitrate:e.bitrate,samplerate:e.samplerate}}}))];return await Promise.allSettled(t.map(async({label:t,config:n})=>{try{const r=await navigator.mediaCapabilities.decodingInfo(n);e[t]={supported:r.supported,smooth:r.smooth,powerEfficient:r.powerEfficient}}catch{e[t]=null}})),e}}];async function pt(e){const t=(s=e)?{exclude:s.exclude??n.exclude,include:s.include??n.include,timeout:s.timeout??n.timeout,stabilize:s.stabilize??n.stabilize,experimental:s.experimental??n.experimental,debug:s.debug??n.debug,salt:s.salt??n.salt}:{...n},o=i(),a=function(){try{return window.self!==window.top}catch{return!0}}();var s;let c=!1;try{c=await u(o.name)}catch{}const l=function(e,t,n,o){const i=new Set;for(const a of e){if("private"===a&&!n)continue;if("iframe"===a&&!o)continue;const e=r[a];if(e)for(const n of e)if(!n.browsers||n.browsers.includes(t))for(const e of n.exclude)i.add(e)}return i}(t.stabilize,o.name,c,a),d=new Set(t.exclude);for(const e of t.include)d.delete(e),l.delete(e);const{components:f,errors:p}=await async function(e,t,n){const r={},o=[],i=ft.filter(t=>!e.has(t.name)&&(n||3!==t.tier)),a=await Promise.allSettled(i.map(async e=>{const n=await(r=e.collect(),o=t,new Promise((e,t)=>{const n=setTimeout(()=>e(null),o);r.then(t=>{clearTimeout(n),e(t)},e=>{clearTimeout(n),t(e)})}));var r,o;return{name:e.name,value:n}}));for(let e=0;e<a.length;e++){const t=a[e],n=i[e].name;"fulfilled"===t.status&&null!==t.value.value?r[n]=t.value.value:"rejected"===t.status&&o.push({signal:n,error:String(t.reason?.message??t.reason)})}return{components:r,errors:o}}(d,t.timeout,t.experimental),m=function(e,t,n){return[W(e,t,n),G(e,t,n),H(e,t)]}(Object.fromEntries(Object.entries(f).filter(([e])=>!l.has(e))),t.salt,c),h=m[0],y={hash:h.hash,stableHash:h.stableHash,components:{...f},timestamp:(new Date).toISOString(),version:"1.5.2",isIncognito:c,errors:p,hashPolicyVersion:h.policyVersion,hashes:m,browser:{...o}};return t.debug&&(console.log("[fingerprint] components:",f),console.log("[fingerprint] hash:",h.hash,"stableHash:",h.stableHash),p.length>0&&console.warn("[fingerprint] errors:",p)),y}new Set([...$,"fontPreferences","webglRender","clientHints","canvasTextMetrics","mediaCapabilities","features","sensors","webApis","performanceContext"]);const mt=new RegExp(["googlebot","bingbot","slurp","baiduspider","duckduckbot","yandex","sogou","exabot","ia_archiver","curl","wget","python-requests","python-urllib","axios","node-fetch","go-http-client","java/","libwww-perl","okhttp","apache-httpclient","http_request","httpie","headlesschrome","phantomjs","puppeteer","playwright","cypress","selenium","webdriver","electron","jsdom","vercel-screenshot","screenshot","prerender","lighthouse","chrome-lighthouse","pagespeed","gtmetrix","pingdom","nessus","nikto","sqlmap","burp","zap","qualys","openvas","nmap","masscan","facebookexternalhit","twitterbot","linkedinbot","whatsapp","telegrambot","slackbot","discordbot","bot","crawl","spider","scrape","fetch","scan"].join("|"),"i");function ht(e){return!!e&&mt.test(e)}let yt;function gt(){if("undefined"==typeof window)return;const e=window.UnsharedFingerprint;return"function"==typeof e?.getFingerprint?e.getFingerprint:void 0}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var wt={};!function(e){function t(e,t){return e&&(/^#[0-9a-fA-F]{3,8}$/.test(e)||/^rgba?\(\s*[\d.,\s]+\)$/.test(e))?e:t}const n=/^[a-zA-Z0-9\s,\-'"]+$/;function r(e){return e&&/^\d+(\.\d+)?(px|rem|em|%)?$/.test(e)?e:"8px"}const o=new Set;function i(e,t){let n=e;for(const e of t.split(".")){if(null==n||"object"!=typeof n)return"";n=n[e]}return null==n?"":String(n)}function a(e){if(!e)return"";const t=e.indexOf("@");if(t>0){const n=e.slice(0,t),r=e.slice(t);return`${n.slice(0,1)}${"*".repeat(Math.max(n.length-1,1))}${r}`}return e.length<=4?"*".repeat(e.length):`${"*".repeat(e.length-4)}${e.slice(-4)}`}function s(e,t,n,r){return"runtime"===t.source?t.path?i({user:n.user??{},device:n.device??{}},t.path):"":r.get(e)??""}const c={email_verification:{"verify-email":{op:"triggerEmailVerification",inputs:["email","deviceId"]},"verify-otp":{op:"verify",inputs:["email","deviceId","otp"]},"resend-verification":{op:"triggerEmailVerification",inputs:["email","deviceId"]}}};function u(e){const t=(e??"").trim();if(""===t)return!1;const n=/^([a-z][a-z0-9+.-]*):/i.exec(t);if(!n)return!0;const r=n[1].toLowerCase();return"http"===r||"https"===r}function l(e){return{left:`${e.x}px`,top:`${e.y}px`,width:`${e.width}px`,height:`${e.height}px`}}function d(e){return"string"!=typeof e?null:/^#[0-9a-fA-F]{3,8}$/.test(e)||/^rgba?\(\s*[\d.,\s]+\)$/.test(e)?e:null}function f(e,t,r={}){const o=t.props,i="heading"===t.type||"text"===t.type,a=o.fontSize;"number"==typeof a&&a>=8&&a<=120&&(e.style.fontSize=`${a}px`);const s=o.align,c="left"===s||"center"===s||"right"===s?s:void 0;c&&(e.style.textAlign=c);const u="boolean"==typeof o.bold?o.bold:r.bold;void 0!==u&&(e.style.fontWeight=u?"700":"400"),!0===o.italic&&(e.style.fontStyle="italic"),!0===o.underline&&(e.style.textDecoration="underline");const l="string"!=typeof(f=o.fontFamily)||""===f?null:n.test(f)?f:null;var f;l&&(e.style.fontFamily=l);const p=d(o.textColor)??r.color??null;p&&(e.style.color=p,i&&(e.style.opacity="1"));const m=o.verticalAlign;!i||"middle"!==m&&"bottom"!==m||(e.style.display="flex",e.style.flexDirection="column",e.style.justifyContent="bottom"===m?"flex-end":"center",e.style.alignItems="center"===c?"center":"right"===c?"flex-end":"flex-start")}function p(e,t){const n="string"==typeof e.props.binding?e.props.binding:"";return n&&t.flow.bindings[n]?function(e,t,n,r){if("never"===t.display)return"";const o=s(e,t,n,r);return"masked"===t.display?a(o):o}(n,t.flow.bindings[n],t.ctx,t.formState):String(e.props.text??"")}function m(e,t){const n=document.createElement("div");return n.className="el el-heading",Object.assign(n.style,l(e)),f(n,e,{bold:!0}),n.textContent=p(e,t),n}function h(e,t){const n=document.createElement("div");return n.className="el el-text",Object.assign(n.style,l(e)),f(n,e,{bold:!1}),n.textContent=p(e,t),n}function y(e){const t=document.createElement("img");return t.className="el el-image",Object.assign(t.style,l(e)),t.src=String(e.props.src??""),t.alt=String(e.props.alt??""),t}function g(e){const t=document.createElement("div");return t.className="el el-divider",t.style.left=`${e.x}px`,t.style.top=`${e.y+e.height/2}px`,t.style.width=`${e.width}px`,t}function w(e,t){const n=document.createElement("input");n.className="el el-input",Object.assign(n.style,l(e)),f(n,e),"string"==typeof e.props.placeholder&&(n.placeholder=e.props.placeholder),"number"==typeof e.props.maxLength&&(n.maxLength=e.props.maxLength),"string"==typeof e.props.pattern&&(n.pattern=e.props.pattern),"otp"===e.props.fieldType?n.inputMode="numeric":"email"===e.props.fieldType&&(n.type="email"),!0===e.props.autoFocus&&(n.autofocus=!0);const r=t.elementToBinding.get(e.id)??String(e.props.name??e.id);return n.value=t.formState.get(r)??"",n.addEventListener("input",()=>t.formState.set(r,n.value)),n}function v(e,t){const n=e?.goTo??e?.advanceTo;e?.dismiss?t.close():"string"==typeof n&&(t.screenState.goTo(n),t.screenState.isLast&&t.complete())}function b(e,t,n,r){e?.showError&&n(t instanceof Error&&t.message?t.message:"Something went wrong. Please try again."),e?.dismiss&&r.close()}function _(e,t,n){const r=document.createElement("button"),o="secondary"===e.props.variant?"secondary":"primary";r.className=`el el-button el-button-${o}`,Object.assign(r.style,l(e));const i=d(e.props.bgColor);return i&&(r.style.background=i),f(r,e),r.textContent=String(e.props.text??"Continue"),r.addEventListener("click",()=>{!async function(e,t,n,r){const o=String(e.props.action??"");if(!o)return;if("close"===o)return void t.close();if("prev-screen"===o)return void t.screenState.prev();if("next-screen"===o){if(t.screenState.isLast)return;return t.screenState.next(),void(t.screenState.isLast&&t.complete())}const i=t.flow.actions[o],a=e=>{r.textContent=e,r.classList.add("visible")};if("client_steps"===i?.type){const s=Array.isArray(e.props.steps)?e.props.steps:[];if(0===s.length)return void("undefined"!=typeof console&&console.warn(`[interstitial] client_steps action "${o}" has no steps`));r.classList.remove("visible"),n.disabled=!0;try{await async function(e){for(const t of e){if("redirect"===t.type)return u(t.url)?void window.location.assign(t.url):void("undefined"!=typeof console&&console.warn(`[interstitial] blocked unsafe redirect url: ${t.url}`));if("webhook"===t.type){const e=await fetch(t.url,{method:t.method??"POST",credentials:"same-origin"});if(!e.ok)throw new Error(`webhook ${t.url} returned ${e.status}`)}else"undefined"!=typeof console&&console.warn(`[interstitial] unknown step type: ${t.type}`)}}(s),v(i.onSuccess,t)}catch(e){b(i.onError,e,a,t)}finally{n.disabled=!1}return}const l=function(e,t,n,r){const o=c[e.flowType]?.[t];if(!o)return null;const i={};for(const t of o.inputs){const o=e.bindings[t];o&&(i[t]=s(t,o,n,r))}return{op:o.op,values:i}}(t.flow,o,t.ctx,t.formState);if(l){r.classList.remove("visible"),n.disabled=!0;try{await t.ctx.actions(l.op,l.values),v(i?.onSuccess,t)}catch(e){b(i?.onError,e,a,t)}finally{n.disabled=!1}}else"undefined"!=typeof console&&console.warn(`[interstitial] unknown action: ${o}`)}(e,t,r,n)}),r}function x(e,t,n){Array.from(t.children).forEach(e=>e.remove());const r=document.createElement("div");r.className="el-error",r.style.left="0",r.style.right="0",r.style.bottom="12px";for(const o of e.elements){let e=null;switch(o.type){case"heading":e=m(o,n);break;case"text":e=h(o,n);break;case"image":e=y(o);break;case"divider":e=g(o);break;case"input":e=w(o,n);break;case"button":e=_(o,n,r);break;default:e=null}e&&t.appendChild(e)}t.appendChild(r)}e.maskValue=a,e.renderFlow=function(e,i){const a=i.container??document.body,s=new Map,c=function(e){const t=new Map;for(const[n,r]of Object.entries(e.bindings))"form"===r.source&&r.elementId&&t.set(r.elementId,n);return t}(e);let u=!1;const l=()=>{u||(u=!0,d.destroy())},d=function(e,i,a){const s={primaryColor:t(e.primaryColor,"#4f46e5"),backgroundColor:t(e.backgroundColor,"#ffffff"),textColor:t(e.textColor,"#111827"),fontFamily:(c=e.fontFamily,c&&n.test(c)?c:"sans-serif"),borderRadius:r(e.borderRadius)};var c;const u=document.createElement("div");u.id="__unshared-interstitial-host",Object.assign(u.style,{position:"fixed",inset:"0",zIndex:"2147483647"}),a.appendChild(u),o.add(u);const l=u.attachShadow({mode:"open"}),d=document.createElement("style");d.textContent=`\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n :host { all: initial; }\n .backdrop {\n position: fixed; inset: 0;\n /* Frost the page behind the modal: a lighter scrim reads as "blurred content"\n rather than "blacked out". Browsers without backdrop-filter fall back to the\n scrim alone, so it degrades to a plain dim — never worse. On the blockFlagged\n gate page there is no content behind it, so this has no visible effect there. */\n background: rgba(0,0,0,0.35);\n -webkit-backdrop-filter: blur(6px);\n backdrop-filter: blur(6px);\n display: flex; align-items: center; justify-content: center;\n }\n .frame {\n position: relative;\n background: ${function(e,n){const r=e.backgroundGradient;if(r&&"object"==typeof r){const{from:e,to:n,angle:o}=r,i=t(e,""),a=t(n,""),s="number"==typeof o&&isFinite(o)?o:180;if(i&&a)return`linear-gradient(${s}deg, ${i}, ${a})`}return n}(e,s.backgroundColor)};\n color: ${s.textColor};\n font-family: ${s.fontFamily};\n border-radius: ${s.borderRadius};\n width: ${i.width}px;\n height: ${i.height}px;\n max-width: 95vw; max-height: 95vh;\n overflow: hidden;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n }\n .frame:focus { outline: none; }\n .el { position: absolute; }\n .el-heading { font-weight: 700; line-height: 1.2; color: ${s.textColor}; }\n .el-text { color: ${s.textColor}; opacity: 0.75; line-height: 1.5; }\n .el-image { object-fit: contain; }\n /* Hairline: uses the frame's text color at low opacity so it reads on light AND dark themes. */\n .el-divider { background: currentColor; opacity: 0.12; height: 1px; }\n .el-input {\n width: 100%; height: 100%;\n border: 1.5px solid #D1D5DB; border-radius: ${s.borderRadius};\n padding: 0 12px; font-family: ${s.fontFamily}; outline: none;\n transition: border-color 0.15s;\n }\n .el-input:focus { border-color: ${s.primaryColor}; }\n .el-button {\n width: 100%; height: 100%;\n border-radius: ${s.borderRadius}; font-weight: 600;\n font-family: ${s.fontFamily}; cursor: pointer; transition: opacity 0.15s;\n }\n .el-button:hover { opacity: 0.9; }\n .el-button:disabled { opacity: 0.5; cursor: not-allowed; }\n .el-button-primary { background: ${s.primaryColor}; color: #fff; border: none; }\n .el-button-secondary { background: transparent; color: ${s.primaryColor}; border: 1.5px solid ${s.primaryColor}; }\n .el-error {\n position: absolute; color: #DC2626; font-size: 13px;\n display: none; text-align: center;\n }\n .el-error.visible { display: block; }\n `,l.appendChild(d);const f=document.createElement("div");f.className="backdrop";const p=document.createElement("div");p.className="frame",p.setAttribute("role","dialog"),p.setAttribute("aria-modal","true"),p.tabIndex=-1,f.appendChild(p),l.appendChild(f);const m=document.body.style.overflow;document.body.style.overflow="hidden";const h=e=>{"Escape"===e.key&&(e.preventDefault(),e.stopPropagation())};document.addEventListener("keydown",h,!0);const y=e=>{const t=e.target;if(t){for(const e of o)if(e.contains(t))return;p.focus()}};return document.addEventListener("focusin",y,!0),p.focus(),{shadowRoot:l,frame:p,destroy:()=>{document.removeEventListener("keydown",h,!0),document.removeEventListener("focusin",y,!0),document.body.style.overflow=m,o.delete(u),u.remove()}}}(e.theme,e.frame,a),f={flow:e,ctx:i,formState:s,elementToBinding:c,screenState:void 0,close:()=>{l(),i.onDismiss?.()},complete:()=>i.onComplete?.()},p=function(e,t,n){let r=Math.max(e.findIndex(e=>e.id===t),0);return{get current(){return e[r]},get isLast(){return r===e.length-1},next(){r<e.length-1&&(r++,n(e[r]))},prev(){r>0&&(r--,n(e[r]))},goTo(t){const o=e.findIndex(e=>e.id===t);-1!==o&&o!==r&&(r=o,n(e[r]))}}}(e.screens,e.initialScreenId,e=>{x(e,d.frame,f)});return f.screenState=p,x(p.current,d.frame,f),{destroy:l}},e.resolvePath=i}(wt);var vt=wt;const bt=new Set(["__pre_auth__","anonymous","guest","undefined","null"]),_t=["http","s://","api.","unsh","ared",".ai"].join(""),xt="__unshared_email",St="__unshared_fp",Et="__unshared_last_submit",kt="__unshared_fp_raw",Ct="__unshared_verification_id",At="__unshared_device_id",Rt="__unshared_uid",It="__unshared_sid",Ot="__unshared_device_id",Tt=1<<20,Pt=102400,Dt=[xt,Et,Ct],Mt=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,$t=/^\d{6}$/,Lt=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|[+-](\d{2}):(\d{2}))$/,Nt=new Set(["RATE_LIMIT_UNAVAILABLE","AUDIT_UNAVAILABLE"]),jt="__UNSHARED_PUBLISHABLE_API_KEY__";function Bt(){if("undefined"!=typeof crypto&&crypto.randomUUID)return crypto.randomUUID();const e=new Uint8Array(16);crypto.getRandomValues(e),e[6]=15&e[6]|64,e[8]=63&e[8]|128;const t=Array.from(e).map(e=>e.toString(16).padStart(2,"0")).join("");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}function Ft(e){return"string"==typeof e&&/^upid_[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)}function Vt(e){return new Promise(t=>setTimeout(t,e))}function Ut(e){const t=Math.min(1e3*Math.pow(2,e-1),3e4),n=500*Math.random()-250;return Math.max(0,t+n)}function Wt(e){try{if("undefined"==typeof document)return;const t=document.cookie.match(new RegExp(`(?:^|; )${e}=([^;]*)`));return t?decodeURIComponent(t[1]):void 0}catch{return}}function Gt(){try{return"undefined"!=typeof location&&"https:"===location.protocol?"; Secure":""}catch{return""}}function zt(e,t){try{if("undefined"==typeof document)return;document.cookie=`${e}=${encodeURIComponent(t)}; Path=/; SameSite=Lax; Max-Age=31536000${Gt()}`}catch{}}function Ht(e){try{if("undefined"==typeof localStorage)return;return localStorage.getItem(e)??void 0}catch{return}}function qt(e){try{if("undefined"==typeof localStorage)return;localStorage.removeItem(e)}catch{}}function Kt(e){try{if("undefined"==typeof sessionStorage)return;return sessionStorage.getItem(e)??void 0}catch{return}}function Jt(e,t){return e.name<t.name?-1:e.name>t.name?1:0}function Yt(){try{return"undefined"==typeof document?[]:document.cookie.split(";").map(e=>e.trim()).filter(Boolean).map(e=>{const t=e.indexOf("="),n=-1===t?e:e.slice(0,t),r=-1===t?"":e.slice(t+1);try{return{name:n,value:decodeURIComponent(r)}}catch{return{name:n,value:r}}}).sort(Jt)}catch{return[]}}function Qt(e,t){try{if(!e)return[];const n=[];for(const r of t){const t=e.getItem(r);null!==t&&n.push({name:r,value:t})}return n.sort(Jt)}catch{return[]}}function Xt(){let e,t;try{e="undefined"==typeof localStorage?void 0:localStorage}catch{}try{t="undefined"==typeof sessionStorage?void 0:sessionStorage}catch{}return{cookies:Yt(),local_storage:Qt(e,[At]),session_storage:Qt(t,Dt)}}function Zt(e,t){try{if("undefined"==typeof sessionStorage)return;sessionStorage.setItem(e,t)}catch{}}function en(e){return null===e||"object"!=typeof e||Array.isArray(e)?{}:e}function tn(e,t=new WeakSet){if(null===e||"object"!=typeof e||Array.isArray(e)||t.has(e))return!1;const n=Object.getPrototypeOf(e);if(n!==Object.prototype&&null!==n)return!1;t.add(e);for(const n of Object.values(e))if(null!==n&&"string"!=typeof n&&"boolean"!=typeof n&&!("number"==typeof n&&Number.isFinite(n)||Array.isArray(n)&&nn(n,t)||tn(n,t)))return!1;return t.delete(e),!0}function nn(e,t){if(null===e||"string"==typeof e||"boolean"==typeof e)return!0;if("number"==typeof e)return Number.isFinite(e);if(Array.isArray(e)){if(t.has(e))return!1;t.add(e);let n=Object.keys(e).length===e.length;for(let r=0;n&&r<e.length;r++)n=Object.prototype.hasOwnProperty.call(e,r)&&nn(e[r],t);return t.delete(e),n}return tn(e,t)}function rn(e,t){return null!==e&&"object"==typeof e&&!Array.isArray(e)&&(Object.keys(e).length===t.length&&t.every(t=>Object.prototype.hasOwnProperty.call(e,t)))}function on(e){if("string"!=typeof e)return!1;const t=Lt.exec(e);if(!t||!Number.isFinite(Date.parse(e)))return!1;const n=Number(t[1]),r=Number(t[2]),o=Number(t[3]),i=Number(t[4]),a=Number(t[5]),s=Number(t[6]),c=Number(t[7]??0),u=Number(t[8]??0);return r>=1&&r<=12&&o>=1&&o<=[31,n%4!=0||n%100==0&&n%400!=0?28:29,31,30,31,30,31,31,30,31,30,31][r-1]&&i<=23&&a<=59&&s<=59&&c<=23&&u<=59}function an(e){return rn(e,["success","data"])&&!0===e.success}function sn(e){return rn(e,["success","error"])&&!1===e.success&&rn(e.error,["code","message"])&&"string"==typeof e.error.code&&"string"==typeof e.error.message}function cn(e){return rn(e,["event_id","collected_at","endpoint_version"])&&"string"==typeof e.event_id&&Mt.test(e.event_id)&&on(e.collected_at)&&"v3"===e.endpoint_version}function un(e){if(!rn(e,["is_user_flagged","decision_id","decision_code"]))return!1;const t=new Set(["FLAGGED_RISK_MATCH","NO_ENFORCING_RISK","NO_IDENTITY_MATCH","IDENTITY_UNCERTAIN","CHECK_UNAVAILABLE"]);return"boolean"==typeof e.is_user_flagged&&"string"==typeof e.decision_id&&Mt.test(e.decision_id)&&"string"==typeof e.decision_code&&t.has(e.decision_code)&&e.is_user_flagged===("FLAGGED_RISK_MATCH"===e.decision_code)}function ln(e){return rn(e,["verification_id","next_allowed_at","retry_after_seconds"])&&"string"==typeof e.verification_id&&Mt.test(e.verification_id)&&on(e.next_allowed_at)&&Number.isInteger(e.retry_after_seconds)&&e.retry_after_seconds>=0}function dn(e){return rn(e,["verified","verification_scope"])?!0===e.verified&&"email"===e.verification_scope:rn(e,["verified","verification_scope","reason"])&&!1===e.verified&&"email"===e.verification_scope&&"invalid_code"===e.reason}function fn(e,...t){for(const n of t){const t=e[n];if("string"==typeof t&&""!==t.trim())return t}}function pn(){if("undefined"==typeof window)return;const e=window;return e.__unshared=e.__unshared||{}}function mn(e){try{return new URL(e),!0}catch{return!1}}function hn(e){const t=new URL(e);return"https:"===t.protocol||"localhost"===t.hostname||"[::1]"===t.hostname||/^127\./.test(t.hostname)}function yn(){return"undefined"!=typeof crypto&&!!crypto.subtle&&!!crypto.getRandomValues}function gn(e){let t="";for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}e.UnsharedBrowser=class{constructor(e={}){if(this._=!1,this.S=!1,this.k="",e.baseUrl&&!mn(e.baseUrl))throw new Error('baseUrl must be a valid URL (e.g. "https://app.example.com")');if(e.apiUrl&&!mn(e.apiUrl))throw new Error('apiUrl must be a valid URL (e.g. ["http","s://","api.","unsh","ared",".ai"].join(""))');if(e.baseUrl&&!hn(e.baseUrl))throw new Error("baseUrl must use HTTPS except for loopback development URLs");if(e.apiUrl&&!hn(e.apiUrl))throw new Error("apiUrl must use HTTPS except for loopback development URLs");let t,n;this.C=e.baseUrl?e.baseUrl.replace(/\/$/,""):"",this.A=e.publishableKey??function(e){if(void 0===e)return jt.startsWith("__UNSHARED_")?void 0:jt}(e.baseUrl),this.R=(e.apiUrl??_t).replace(/\/$/,""),this.I=e.maxRetries??3,this.O=e.timeout??3e4,this.T=e.includePathPrefix,this.P=e.skipPaths,this.D=e.sessionId,this.M=e.deviceId,this.$=e.enableInterstitial??!1,this.L=e.interstitialFlowType??"email_verification",this.k=Kt(Et)??"",qt("__unshared_event_queue"),qt("__unshared_event_queue_inflight");try{t=this.D?.()}catch{}this.N=t??Wt(It)??Bt(),zt(It,this.N);try{n=this.M?.()}catch{}if(n)this.j=n;else{const e=Ht(At);this.j=Ft(e)?"":e??""}const r=Ht(At);this.B=Ft(r)?r:"",this.F(),this.$&&this.V()}async init(e){try{if("undefined"!=typeof navigator&&ht(navigator.userAgent))return;if("string"==typeof(t=e.userId)&&bt.has(t))return void this.U;if(!1===e.isPaidSubscriber)return void(this._=!0);this._=!1,this.W(),this.U=e.userId,this.G=e.emailAddress,Zt(xt,e.emailAddress),zt(Rt,e.userId);let n,r=this.H(),o=this.q();if(!r){const e=await this.K();r=e.wire,o=e.raw,this.J(r),this.Y(o)}try{n=this.M?.()}catch{}n?this.j=n:r.fingerprint_id&&(this.j=r.fingerprint_id),this.X(r,o).catch(()=>{})}catch{}var t}onRouteChange(){try{if(!this.Z())return;const e=this.H();if(!e)return;this.X(e,this.q()).catch(()=>{})}catch{}}destroy(){try{"undefined"!=typeof sessionStorage&&(sessionStorage.removeItem(xt),sessionStorage.removeItem(St),sessionStorage.removeItem(kt),sessionStorage.removeItem(Et),sessionStorage.removeItem(Ct)),this.k="",function(e){try{if("undefined"==typeof document)return;document.cookie=`${e}=; Path=/; SameSite=Lax; Expires=Thu, 01 Jan 1970 00:00:00 GMT${Gt()}`}catch{}}(Rt),this.ee&&"undefined"!=typeof document&&(document.removeEventListener("DOMContentLoaded",this.ee),this.ee=void 0),this.te&&"undefined"!=typeof window&&(window.removeEventListener("unshared:flagged",this.te),this.te=void 0),this.ne?.destroy(),this.ne=void 0,this.S=!1,this.U=void 0,this.G=void 0,this._=!1}catch{}}async collect(e){return(await this.K(e)).wire}async collectRaw(e){return(await this.K(e)).raw}async collectWithMetadata(e){return this.K(e)}async K(e){const{getFingerprint:t,source:n}=await(a={proxyBaseUrl:this.C,isProxy:!this.A},yt||(yt=(async()=>{const e=gt();if(e)return{getFingerprint:e,source:"remote"};const t=a.isProxy?`${a.proxyBaseUrl??""}/__unshared/fingerprint.js`:"https://unshared-public.s3.us-east-2.amazonaws.com/fingerprint@1/fingerprint.umd.js";var n,r;await(n=t,r=function(){const e=globalThis.__UNSHARED_FP_LOAD_TIMEOUT_MS;return"number"==typeof e?e:1500}(),new Promise(e=>{if("undefined"==typeof document||!document.head)return void e();let t=!1;const o=()=>{t||(t=!0,clearTimeout(i),e())},i=setTimeout(o,r),a=document.createElement("script");a.src=n,a.async=!0,a.onload=o,a.onerror=o,document.head.appendChild(a)}));const o=gt();return o?{getFingerprint:o,source:"remote"}:{getFingerprint:pt,source:"bundled"}})(),yt)),r=en(await t(e)),o=fn(r,"stableHash","stable_hash","fingerprint_id")??"",i=fn(r,"hash","full_hash")??"";var a;return{raw:r,wire:{...r,fingerprint_id:o,full_hash:i,components:en(r.components),timestamp:fn(r,"timestamp","collected_at")??(new Date).toISOString(),isIncognito:"boolean"==typeof r.isIncognito&&r.isIncognito,version:fn(r,"version")??"unknown",source:n},source:n}}async submitFingerprintEvent(e,t){try{if(this._)return{success:!0};const n=this.re(e,e,{userId:t.userId,eventType:t.eventType,permanentDeviceId:t.permanentDeviceId}),r=Bt(),o=await this.oe(this.ie(),JSON.stringify(n),r);return o.success?o.data?{success:!0,data:{...o.data,hash:e.full_hash,stable_hash:e.fingerprint_id,collected_at:o.data.collected_at??e.timestamp,version:e.version??"unknown"}}:{success:!1,error:{code:"PARSE_ERROR",message:"Invalid v3 ingestion result"}}:{success:!1,error:o.error}}catch(e){return{success:!1,error:{code:"DELIVERY_FAILED",message:e instanceof Error?e.message:String(e)}}}}async submitFingerprint(e){try{return this._?{success:!0}:tn(e)?await this.oe(this.ie(),JSON.stringify(e),Bt()):{success:!1,error:{code:"VALIDATION_ERROR",message:"Fingerprint payload must be a valid JSON object"}}}catch(e){return{success:!1,error:{code:"DELIVERY_FAILED",message:e instanceof Error?e.message:String(e)}}}}async checkUser(e){return this.ae(e,!0)}async ae(e,t){const n=this.se(e,!1);if("success"in n)return n;if("string"!=typeof n.email||""===n.email.trim())return{success:!1,error:{code:"VALIDATION_ERROR",message:"email must be a non-empty string"}};const r={...this.U?{user_id:this.U}:{},email_address:n.email,identifiers:this.ce(n,!0)},o=await this.ue("POST","/v3/browser/check-user",{body:r,retry:t,expectedStatus:200,validateData:un,retryErrorCodes:Nt});if(!o.success)return o;if(!o.data)return{success:!1,error:{code:"PARSE_ERROR",message:"Missing Check result"}};const i=pn();return o.data.is_user_flagged?i&&(i.flagged={email:n.email}):"CHECK_UNAVAILABLE"!==o.data.decision_code&&i?.flagged?.email&&i.flagged.email.trim().toLowerCase()===n.email.trim().toLowerCase()&&delete i.flagged,o}async triggerEmailVerification(e){const t=this.se(e,!1);if("success"in t)return t;if("string"!=typeof t.email||""===t.email.trim())return{success:!1,error:{code:"VALIDATION_ERROR",message:"email must be a non-empty string"}};const n={email_address:t.email,identifiers:this.ce(t,!1)},r=await this.ue("POST","/v3/browser/trigger-email-verification",{body:n,retry:!1,expectedStatus:200,validateData:ln});return r.success&&r.data?(Zt(Ct,JSON.stringify({email:t.email.toLowerCase(),verificationId:r.data.verification_id})),{success:!0,data:{...r.data,message:"Verification email sent"}}):r}async verify(e,t){const n=this.se(t,!1);if("success"in n)return n;const r=this.le(n.email);return r?this.de({verification_id:r,code:e},n):{success:!1,error:{code:"MISSING_VERIFICATION_ID",message:"Trigger email verification before verifying the code."}}}async verifyEmail(e){return this.de(e)}async de(e,t){if(!this.A)return{success:!1,error:{code:"DIRECT_MODE_REQUIRED",message:"This method requires direct mode — construct the SDK with a publishableKey."}};if(null===e||"object"!=typeof e||"string"!=typeof e.verification_id||!Mt.test(e.verification_id)||"string"!=typeof e.code||!$t.test(e.code))return{success:!1,error:{code:"VALIDATION_ERROR",message:"verification_id must be UUIDv4 and code must be exactly 6 digits"}};const n=await this.ue("POST","/v3/browser/verify",{body:e,retry:!1,expectedStatus:200,validateData:dn});if(n.success&&n.data?.verified){const n=t??this.fe(e.verification_id);try{sessionStorage.removeItem(Ct)}catch{}await this.ae(n,!1)}return n}async emailVerificationStatus(e){const t=this.se(e);return"success"in t?t:this.ue("GET","/v2/browser/email-verification-status",{query:{email_address:t.email,device_id:t.deviceId,permanent_device_id:t.permanentDeviceId},retry:!0})}async showInterstitial(e){const t=!this.A;if("undefined"==typeof document)return{success:!1,error:{code:"NO_DOM",message:"showInterstitial requires a browser DOM."}};if(this.S)return{success:!0,data:{shown:!1}};this.S=!0;const n=e?.flowType??this.L,r=t?await this.pe(n):await this.me(n);if(!r.success||!r.data)return this.S=!1,{success:!1,error:r.error};try{return this.ne=vt.renderFlow(r.data,{user:t?{}:{email:this.G??this.Z()??""},device:t?{}:{id:this.j},actions:t?this.he():this.ye(),container:e?.container,onComplete:()=>{e?.onComplete?.()},onDismiss:()=>{this.S=!1,this.ne=void 0,e?.onDismiss?.()}}),{success:!0,data:{shown:!0}}}catch(e){return this.S=!1,{success:!1,error:{code:"RENDER_FAILED",message:e instanceof Error?e.message:String(e)}}}}async me(e){return this.ue("GET","/v2/browser/interstitial-flow",{query:{flow_type:e,platform:"web"},retry:!0})}async pe(e){try{const t=`${this.C}/__unshared/interstitial-flow?flow_type=${encodeURIComponent(e)}&platform=web`,n=await fetch(t,{method:"GET",credentials:"include"}),r=await n.json().catch(()=>({}));return n.ok&&!1!==r?.success&&r?.data?{success:!0,data:r.data}:{success:!1,error:r?.error??{code:"FLOW_FETCH_FAILED",message:`Flow fetch failed (${n.status})`}}}catch(e){return{success:!1,error:{code:"FLOW_FETCH_FAILED",message:e instanceof Error?e.message:String(e)}}}}he(){const e=async(e,t)=>{const n=await fetch(`${this.C}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(t)}),r=await n.json().catch(()=>({}));if(!n.ok||!1===r?.success)throw new Error(r?.error?.message??"Request failed. Please try again.");return{json:r,enforcementReconciled:"clean"===n.headers?.get?.("X-Unshared-Enforcement-Reconciled")}};return async(t,n)=>{if("triggerEmailVerification"!==t){if("verify"===t){const{json:t,enforcementReconciled:r}=await e("/__unshared/verify",{code:n.otp});if(!1===t?.data?.verified)throw new Error("Incorrect or expired code. Please try again.");if(!0===t?.data?.verified&&r){const e=pn();e&&delete e.flagged}return}throw new Error(`Unsupported interstitial action: ${t}`)}await e("/__unshared/verify-trigger",{})}}ye(){return async(e,t)=>{const n={email:t.email,deviceId:t.deviceId};if("triggerEmailVerification"===e){const e=await this.triggerEmailVerification(n);if(!e.success)throw new Error(e.error?.message??"Could not send the verification code.");return}if("verify"===e){const e=await this.verify(t.otp,n);if(!e.success)throw new Error(e.error?.message??"Verification failed.");if(e.data&&!1===e.data.verified)throw new Error("Incorrect or expired code. Please try again.");return}throw new Error(`Unsupported interstitial action: ${e}`)}}V(){try{if("undefined"==typeof window)return;this.te=()=>{this.showInterstitial()},window.addEventListener("unshared:flagged",this.te),pn()?.flagged&&this.showInterstitial()}catch{}}se(e,t=!0){if(this._)return{success:!1,error:{code:"COLLECTION_DISABLED",message:"Collection is disabled for this user."}};if(!this.A)return{success:!1,error:{code:"DIRECT_MODE_REQUIRED",message:"This method requires direct mode — construct the SDK with a publishableKey."}};const n=e?.email??this.G??this.Z(),r=e?.deviceId??this.j,o=e?.permanentDeviceId??this.W();return!n||t&&!r?{success:!1,error:{code:"MISSING_IDENTITY",message:"No email/deviceId available — call init() first or pass them explicitly."}}:{email:n,deviceId:r,permanentDeviceId:o,stableHash:e?.stableHash,fullHash:e?.fullHash}}async ue(e,t,n){try{let r=`${this.R}${t}`;n.query&&(r+=`?${new URLSearchParams(n.query).toString()}`);const o={"X-Publishable-Key":this.A,"X-Session-Id":this.N,"X-Device-Id":this.j},i={method:e,headers:o};if(void 0!==n.body){o["Content-Type"]="application/json";const e=JSON.stringify(n.body);if((new TextEncoder).encode(e).byteLength>Tt)return{success:!1,error:{code:"REQUEST_TOO_LARGE",message:"Request body exceeds 1 MiB"}};i.body=e}const a=n.retry?this.I+1:1,s=n.retry?Date.now()+8e3:1/0;let c={code:"DELIVERY_FAILED",message:"Request failed"};for(let e=1;e<=a&&!(Date.now()>=s);e++){if(e>1){const t=Math.max(0,s-Date.now());if(0===t)break;await Vt(Math.min(Ut(e-1),t))}if(Date.now()>=s)break;const t=new AbortController,o=Math.min(this.O,Math.max(0,s-Date.now())),a=setTimeout(()=>t.abort(),n.retry?o:this.O);try{const e=await fetch(r,{...i,signal:t.signal}),o=await e.text();let a;try{a=JSON.parse(o)}catch{return{success:!1,error:{code:"PARSE_ERROR",message:"Invalid JSON response"}}}if(void 0!==n.expectedStatus&&n.validateData){if(sn(a)){if(c={code:a.error.code,message:a.error.message,retryAfter:Number(e.headers?.get?.("Retry-After"))||void 0},n.retry&&503===e.status&&n.retryErrorCodes?.has(a.error.code))continue;return{success:!1,error:c}}return e.status===n.expectedStatus&&an(a)&&n.validateData(a.data)?{success:!0,data:a.data}:{success:!1,error:{code:"PARSE_ERROR",message:"Invalid v3 response"}}}if(e.status>=500){const t=a?.error??{};c={code:"string"==typeof t.code?t.code:"DELIVERY_FAILED",message:"string"==typeof t.message?t.message:`Backend returned ${e.status}`};continue}if(e.status>=400||!1===a?.success){const t=a?.error??{};return{success:!1,error:{code:"string"==typeof t.code?t.code:"UPSTREAM_ERROR",message:"string"==typeof t.message?t.message:`Backend returned ${e.status}`,retryAfter:Number(e.headers?.get?.("Retry-After"))||t.details?.retry_after_seconds,nextAllowedAt:t.details?.next_allowed_at}}}return!0===a?.success&&Object.prototype.hasOwnProperty.call(a,"data")?{success:!0,data:a.data}:{success:!1,error:{code:"PARSE_ERROR",message:"Invalid v3 response envelope"}}}catch(e){c={code:"DELIVERY_FAILED",message:e instanceof Error?e.message:String(e)}}finally{clearTimeout(a)}}return{success:!1,error:c}}catch(e){return{success:!1,error:{code:"DELIVERY_FAILED",message:e instanceof Error?e.message:String(e)}}}}Z(){return Kt(xt)}H(){const e=Kt(St);if(e)try{return JSON.parse(e)}catch{return}}q(){const e=Kt(kt);if(e)try{return en(JSON.parse(e))}catch{return}}J(e){Zt(St,JSON.stringify(e))}Y(e){Zt(kt,JSON.stringify(e))}le(e){const t=Kt(Ct);if(t)try{const n=JSON.parse(t);return n.email===e.toLowerCase()&&"string"==typeof n.verificationId?n.verificationId:void 0}catch{return}}fe(e){const t=Kt(Ct);if(t)try{const n=JSON.parse(t);return n.verificationId===e&&"string"==typeof n.email?{email:n.email}:void 0}catch{return}}ge(){if("undefined"==typeof location)return!0;const e=location.pathname||"/";if(this.P)for(const t of this.P)if(e.startsWith(t))return!1;return!this.T||this.T.some(t=>e.startsWith(t))}async X(e,t){if("undefined"!=typeof navigator&&ht(navigator.userAgent))return{success:!0};if(this._)return{success:!0};if(!this.ge())return{success:!0};const n=this.G??this.Z(),r=this.U??Wt(Rt),o="undefined"!=typeof location?(location.pathname||"/")+(location.search||""):"/",i=this.re(t??en(e),e,{userId:r,email:n,eventType:o}),a=JSON.stringify(i);if((new TextEncoder).encode(a).byteLength>(this.A?Tt:Pt))return{success:!1,error:{code:"REQUEST_TOO_LARGE",message:"Request body exceeds "+(this.A?"1 MiB":"100 KiB")}};if(r){const e=`${r}|${o}`,t=pn();if(e===this.k||t?.lastKey===e)return{success:!0};t&&(t.lastKey=e),this.k=e,Zt(Et,e)}const s=`${e.fingerprint_id}|${r??""}|${o}`,c=await async function(e){if(yn())try{const t=await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(e));return Array.from(new Uint8Array(t)).map(e=>e.toString(16).padStart(2,"0")).join("")}catch{return}}(s),u=c??(this.A?`${s}|${Math.floor(Date.now()/6e4)}`:s);return this.oe(this.ie(),a,u)}ie(){return this.A?`${this.R}/v3/browser/submit-fingerprint-event`:`${this.C}/__unshared/submit-fp`}F(){try{if("undefined"==typeof document)return;this.ee&&document.removeEventListener("DOMContentLoaded",this.ee),this.ee=()=>{this.Z()&&this.K().then(({raw:e,wire:t})=>this.X(t,e)).catch(()=>{})},document.addEventListener("DOMContentLoaded",this.ee)}catch{}}async oe(e,t,n){if((new TextEncoder).encode(t).byteLength>(this.A?Tt:Pt))return{success:!1,error:{code:"REQUEST_TOO_LARGE",message:"Request body exceeds "+(this.A?"1 MiB":"100 KiB")}};if(this.A){try{t=await async function(e,t){if(!yn())throw new Error("WebCrypto is unavailable");const n=await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(t)),r=await crypto.subtle.importKey("raw",n,{name:"AES-GCM"},!1,["encrypt"]),o=crypto.getRandomValues(new Uint8Array(12)),i=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:o,tagLength:128},r,(new TextEncoder).encode(e))),a=i.slice(i.length-16),s=i.slice(0,i.length-16);return JSON.stringify({encrypted_data:`${gn(o)}:${gn(a)}:${gn(s)}`})}(t,this.A)}catch(e){return{success:!1,error:{code:"CLIENT_ENCRYPTION_ERROR",message:e instanceof Error?e.message:String(e)}}}if((new TextEncoder).encode(t).byteLength>1572864)return{success:!1,error:{code:"REQUEST_TOO_LARGE",message:"Encrypted request body exceeds 1.5 MiB"}}}let r={success:!1,error:{code:"DELIVERY_FAILED",message:"Request failed"}};for(let o=1;o<=1;o++){const o=new AbortController,i=setTimeout(()=>o.abort(),this.O),a={"Content-Type":"application/json","X-Idempotency-Key":n,"X-Session-Id":this.N,"X-Device-Id":this.j};this.A||(a["X-Permanent-Device-Id"]=this.W()),this.A&&(a["X-Publishable-Key"]=this.A);try{const n=await fetch(e,{method:"POST",headers:a,body:t,signal:o.signal,...!this.A&&this.we()?{credentials:"include"}:{}}),r=await n.text();let i;try{i=JSON.parse(r)}catch{return{success:!1,error:{code:"PARSE_ERROR",message:"Invalid JSON response"}}}if(sn(i)){const e=Number(n.headers?.get?.("Retry-After"))||void 0;return{success:!1,error:{...i.error,...e?{retryAfter:e}:{}}}}const s=this.A?202:200;return n.status===s&&an(i)&&cn(i.data)?{success:!0,data:i.data}:{success:!1,error:{code:"PARSE_ERROR",message:"Invalid v3 ingestion response"}}}catch(e){r={success:!1,error:{code:"DELIVERY_FAILED",message:e instanceof Error?e.message:String(e)}}}finally{clearTimeout(i)}}return r}ce(e,t){const n=this.H(),r={unshared_device_id:e.permanentDeviceId},o=e.stableHash||n?.fingerprint_id,i=e.fullHash||n?.full_hash;return e.deviceId&&(r.device_id=e.deviceId),o&&(r.stable_hash=o),i&&(r.full_hash=i),t&&this.N&&(r.session_hash=this.N),r}re(e,t,n){const r=n.permanentDeviceId??this.W(),o={deviceId:this.j,permanentDeviceId:r,stableHash:t.fingerprint_id,fullHash:t.full_hash},i=n.userId??this.U??Wt(Rt),a=n.email??this.G??this.Z(),s=n.eventType??("undefined"!=typeof location?(location.pathname||"/")+(location.search||""):"/"),c={fingerprint:e,context:{sdk:{name:"unshared-frontend-sdk",version:"3.0.0",agent_source:t.source??"unknown"},identity:{...i?{user_id:i}:{},...a?{email_address:a}:{}},identifiers:this.ce(o,!0),browser_storage:Xt(),event:{type:s,collected_at:(new Date).toISOString()}}};return!this.A&&(new TextEncoder).encode(JSON.stringify(c)).byteLength>Pt&&(c.context.browser_storage.local_storage=[],c.context.browser_storage.session_storage=[],(new TextEncoder).encode(JSON.stringify(c)).byteLength>Pt&&delete c.context.browser_storage),c}W(){if(!Ft(this.B)){const e=Ht(At),t=Wt(Ot);this.B=Ft(e)?e:Ft(t)?t:`upid_${Bt()}`,function(e,t){try{if("undefined"==typeof localStorage)return;localStorage.setItem(e,t)}catch{}}(At,this.B)}return function(e,t){try{if("undefined"==typeof document)return;document.cookie=`${e}=${encodeURIComponent(t)}; Path=/; SameSite=Lax; Max-Age=34560000${Gt()}`}catch{}}(Ot,this.B),this.B}we(){try{return"undefined"!=typeof location&&new URL(this.C||location.origin,location.href).origin===location.origin}catch{return!1}}},e.createAxiosInterceptor=function(e){return t=>{if(403===t?.response?.status&&"account_flagged"===t?.response?.data?.error)try{e.onFlagged()}catch{}return Promise.reject(t)}},e.createFetchInterceptor=function(e,t){return async(...n)=>{const r=await e(...n);if(403===r.status){const e=r.clone();try{const n=await e.json();if("account_flagged"===n?.error)try{t.onFlagged()}catch{}}catch{}}return r}}});
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical wire-format for fingerprint data transmitted from the browser SDK to the backend.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth shared by:
|
|
5
|
+
* - @unshared-labs/frontend-fingerprint (serializer: _buildBody in browser.ts)
|
|
6
|
+
* - @unshared-labs/sdk (submitFingerprintEvent in client.ts)
|
|
7
|
+
*
|
|
8
|
+
* SCHEMA AUTHORITY: The browser SDK serializer is the writer. The Node.js SDK is the
|
|
9
|
+
* reader. Any field added here must be produced by the browser SDK and consumed by the
|
|
10
|
+
* server SDK. Do not add fields that only one side uses.
|
|
11
|
+
*/
|
|
12
|
+
export type JSONPrimitive = string | number | boolean | null;
|
|
13
|
+
export type JSONValue = JSONPrimitive | JSONObject | JSONValue[];
|
|
14
|
+
export interface JSONObject {
|
|
15
|
+
[key: string]: JSONValue;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface BrowserStorageEntry extends JSONObject {
|
|
19
|
+
name: string;
|
|
20
|
+
value: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface BrowserStorageSnapshot extends JSONObject {
|
|
24
|
+
cookies: BrowserStorageEntry[];
|
|
25
|
+
local_storage: BrowserStorageEntry[];
|
|
26
|
+
session_storage: BrowserStorageEntry[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface EncryptedEventEnvelope {
|
|
30
|
+
encrypted_data: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface FingerprintEventContext extends JSONObject {
|
|
34
|
+
sdk: JSONObject;
|
|
35
|
+
identity: JSONObject;
|
|
36
|
+
identifiers: JSONObject;
|
|
37
|
+
event: JSONObject;
|
|
38
|
+
browser_storage?: BrowserStorageSnapshot;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type V3Identifiers = Record<string, string>;
|
|
42
|
+
|
|
43
|
+
export interface V3Success<T> {
|
|
44
|
+
success: true;
|
|
45
|
+
data: T;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface V3Error {
|
|
49
|
+
success: false;
|
|
50
|
+
error: {
|
|
51
|
+
code: string;
|
|
52
|
+
message: string;
|
|
53
|
+
retryAfter?: number;
|
|
54
|
+
nextAllowedAt?: string;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type V3Result<T> = V3Success<T> | V3Error;
|
|
59
|
+
|
|
60
|
+
export interface IngestResult {
|
|
61
|
+
event_id: string;
|
|
62
|
+
collected_at: string;
|
|
63
|
+
endpoint_version: 'v3';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface TriggerEmailRequest {
|
|
67
|
+
email_address: string;
|
|
68
|
+
identifiers: V3Identifiers;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface TriggerEmailResult {
|
|
72
|
+
verification_id: string;
|
|
73
|
+
next_allowed_at: string;
|
|
74
|
+
retry_after_seconds: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface VerifyEmailRequest {
|
|
78
|
+
verification_id: string;
|
|
79
|
+
code: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export type VerifyEmailResult =
|
|
83
|
+
| { verified: true; verification_scope: 'email' }
|
|
84
|
+
| { verified: false; verification_scope: 'email'; reason: 'invalid_code' };
|
|
85
|
+
|
|
86
|
+
export interface CheckUserRequest {
|
|
87
|
+
user_id?: string;
|
|
88
|
+
email_address: string;
|
|
89
|
+
identifiers: V3Identifiers;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export type CheckDecisionCode =
|
|
93
|
+
| 'FLAGGED_RISK_MATCH'
|
|
94
|
+
| 'NO_ENFORCING_RISK'
|
|
95
|
+
| 'NO_IDENTITY_MATCH'
|
|
96
|
+
| 'IDENTITY_UNCERTAIN'
|
|
97
|
+
| 'CHECK_UNAVAILABLE';
|
|
98
|
+
|
|
99
|
+
export interface CheckUserResult {
|
|
100
|
+
is_user_flagged: boolean;
|
|
101
|
+
decision_id: string;
|
|
102
|
+
decision_code: CheckDecisionCode;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface FingerprintEventPayload extends JSONObject {
|
|
106
|
+
fingerprint: JSONObject;
|
|
107
|
+
context: FingerprintEventContext;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface FingerprintWireFormat {
|
|
111
|
+
[key: string]: unknown;
|
|
112
|
+
/**
|
|
113
|
+
* Primary device identifier — stable hash excluding volatile signals (audio, timing).
|
|
114
|
+
* Consistent across normal and incognito sessions on the same device.
|
|
115
|
+
* 32-character hex string.
|
|
116
|
+
*/
|
|
117
|
+
fingerprint_id: string;
|
|
118
|
+
/**
|
|
119
|
+
* Full hash including all active signals (volatile signals included).
|
|
120
|
+
* Maximum entropy; may vary slightly between sessions on the same device.
|
|
121
|
+
* 32-character hex string.
|
|
122
|
+
*/
|
|
123
|
+
full_hash: string;
|
|
124
|
+
/**
|
|
125
|
+
* Raw browser signal data keyed by signal name (e.g. `webgl`, `hardware`, `audio`).
|
|
126
|
+
*
|
|
127
|
+
* This blob is forwarded as-is in the `components` JSON field and stored verbatim
|
|
128
|
+
* in a `components JSONB` column on `fingerprint_events`. No server-side decomposition
|
|
129
|
+
* is performed; the full component tree is preserved for querying.
|
|
130
|
+
*/
|
|
131
|
+
components: Record<string, unknown>;
|
|
132
|
+
/** ISO timestamp when the fingerprint was collected. */
|
|
133
|
+
timestamp: string;
|
|
134
|
+
/** Whether private/incognito browsing was detected at collection time. */
|
|
135
|
+
isIncognito: boolean;
|
|
136
|
+
/** Fingerprint library semver, e.g. "1.0.0". */
|
|
137
|
+
version: string;
|
|
138
|
+
/**
|
|
139
|
+
* Where the fingerprint agent that produced this result was loaded from:
|
|
140
|
+
* - `'remote'` — the runtime-loaded UMD (S3 directly in browser direct mode,
|
|
141
|
+
* or the Node SDK's same-origin proxy of S3).
|
|
142
|
+
* - `'bundled'` — the copy compiled into the SDK, used as the fallback when
|
|
143
|
+
* the remote load failed/timed out.
|
|
144
|
+
* Optional: older SDK artifacts and the mobile SDKs omit it, so the reader
|
|
145
|
+
* must tolerate its absence. Observability for S3 fast-path vs fallback rates.
|
|
146
|
+
*/
|
|
147
|
+
source?: 'remote' | 'bundled';
|
|
148
|
+
}
|