sitepong 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cdn/sitepong.min.js +5 -5
- package/dist/cdn/sitepong.min.js.map +1 -1
- package/dist/entries/node.d.mts +2 -2
- package/dist/entries/node.d.ts +2 -2
- package/dist/entries/rn.js +62 -6
- package/dist/entries/rn.js.map +1 -1
- package/dist/entries/web.d.mts +1 -1
- package/dist/entries/web.d.ts +1 -1
- package/dist/entries/web.js +72 -16
- package/dist/entries/web.js.map +1 -1
- package/dist/entries/web.mjs +72 -16
- package/dist/entries/web.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +69 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +69 -13
- package/dist/index.mjs.map +1 -1
- package/dist/nextjs/index.d.mts +2 -2
- package/dist/nextjs/index.d.ts +2 -2
- package/dist/react/index.d.mts +3 -3
- package/dist/react/index.d.ts +3 -3
- package/dist/react/index.js +69 -13
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +69 -13
- package/dist/react/index.mjs.map +1 -1
- package/dist/server/index.d.mts +3 -3
- package/dist/server/index.d.ts +3 -3
- package/dist/{types-DQSv7JAE.d.ts → types-BTA43eyz.d.ts} +1 -1
- package/dist/{types-Cms9VXx9.d.mts → types-CphqOTfm.d.mts} +1 -1
- package/dist/{types-BEqbz0tw.d.mts → types-DPINdOQW.d.mts} +2 -0
- package/dist/{types-BEqbz0tw.d.ts → types-DPINdOQW.d.ts} +2 -0
- package/package.json +1 -1
package/dist/cdn/sitepong.min.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
var SitePong=(function(exports){'use strict';function mn(){try{return typeof localStorage>"u"?null:{getItem:async r=>localStorage.getItem(r),setItem:async(r,e)=>{localStorage.setItem(r,e);},removeItem:async r=>{localStorage.removeItem(r);}}}catch{return null}}function it(){return {platform:"browser",storage:mn(),getDeviceInfo(){let e={platform:"browser"};return typeof navigator<"u"&&(e.userAgent=navigator.userAgent),typeof window<"u"&&window.screen&&(e.screenWidth=window.screen.width,e.screenHeight=window.screen.height),e},getCurrentUrl(){if(!(typeof window>"u"||!window.location))return window.location.href},getReferrer(){if(!(typeof document>"u"))return document.referrer||void 0},getUserAgent(){if(!(typeof navigator>"u"))return navigator.userAgent},onUncaughtError(e){if(typeof window>"u"||!window.addEventListener)return ()=>{};let t=n=>{e(n.error||n.message);};return window.addEventListener("error",t),()=>window.removeEventListener("error",t)},onUnhandledRejection(e){if(typeof window>"u"||!window.addEventListener)return ()=>{};let t=n=>{e(n.reason);};return window.addEventListener("unhandledrejection",t),()=>window.removeEventListener("unhandledrejection",t)},onBeforeTerminate(e){return typeof window>"u"||!window.addEventListener?()=>{}:(window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e))},onVisibilityHidden(e){if(typeof document>"u"||!document.addEventListener)return ()=>{};let t=()=>{document.visibilityState==="hidden"&&e();};return document.addEventListener("visibilitychange",t),()=>document.removeEventListener("visibilitychange",t)},sendBeacon(e,t){if(typeof navigator>"u"||typeof navigator.sendBeacon!="function")return false;try{let n=new Blob([t],{type:"application/json"});return navigator.sendBeacon(e,n)}catch{return false}}}}var C=null;function U(r){C=r;}function b(){return C}function Ee(){if(C)return C.platform;let r=globalThis;return r.navigator&&r.navigator.product==="ReactNative"?"react-native":r.process&&r.process.versions&&r.process.versions.node?"node":r.window&&r.document?"browser":"unknown"}function L(){return Ee()==="react-native"}var vn=null;function yn(){return C&&C.platform==="react-native"?C:null}function Ce(r){let e=yn();e&&e._setGetCurrentScreen(r);}function ie(){return vn}function Me(){return C?C.storage:null}var oe="sitepong_anonymous_id";function Re(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return (r==="x"?e:e&3|8).toString(16)})}var M=null;function D(){if(typeof window<"u"&&typeof localStorage<"u")try{let r=localStorage.getItem(oe);return r||(r=Re(),localStorage.setItem(oe,r)),r}catch{return M||(M=Re()),M}return M||(M=Re()),M}function ot(){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.removeItem(oe);}catch{}M=null;}function st(r){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.setItem(oe,r);}catch{M=r;}else M=r;}function at(r){let e=r.toLowerCase();return /ipad/.test(e)||/android/.test(e)&&!/mobile/.test(e)||/tablet/.test(e)?"tablet":/mobile/.test(e)||/iphone/.test(e)||/ipod/.test(e)||/android/.test(e)||/blackberry/.test(e)||/windows phone/.test(e)?"mobile":"desktop"}function ct(r){let e=r.toLowerCase();return /edg/.test(e)?"edge":/opr|opera/.test(e)?"opera":/samsungbrowser/.test(e)?"samsung":/chrome|chromium|crios/.test(e)?"chrome":/safari/.test(e)&&!/chrome/.test(e)?"safari":/firefox|fxios/.test(e)?"firefox":/msie|trident/.test(e)?"ie":"other"}function lt(r){let e=r.toLowerCase();return /iphone|ipad|ipod/.test(e)?"ios":/android/.test(e)?"android":/mac os|macos|macintosh/.test(e)?"macos":/windows/.test(e)?"windows":/linux/.test(e)?"linux":"other"}function Ie(){let r=b()?.getUserAgent()??"";return {anonymous_id:D(),device_type:r?at(r):void 0,browser:r?ct(r):void 0,os:r?lt(r):void 0,user_agent:r||void 0,timestamp:new Date}}function ut(r){let e=5381;for(let t=0;t<r.length;t++)e=(e<<5)+e^r.charCodeAt(t);return e>>>0}function bn(r){return Math.random()*100<r.percentage}function wn(r,e,t){let n=`${e.anonymous_id}:${t}`;return ut(n)%100<r.percentage}function se(r){let[e,t]=r.split(":").map(Number);return e*60+t}function Sn(r,e){let t=e.timestamp||new Date,i=new Intl.DateTimeFormat("en-US",{timeZone:r.timezone,weekday:"short",hour:"2-digit",minute:"2-digit",hour12:false}).formatToParts(t),o=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"].indexOf(i.find(u=>u.type==="weekday")?.value||""),s=parseInt(i.find(u=>u.type==="hour")?.value||"0",10),a=parseInt(i.find(u=>u.type==="minute")?.value||"0",10),c=s*60+a;if(r.days_of_week&&r.days_of_week.length>0&&!r.days_of_week.includes(o))return false;if(r.start_time&&r.end_time){let u=se(r.start_time),p=se(r.end_time);if(u>p){if(c<u&&c>=p)return false}else if(c<u||c>=p)return false}else if(r.start_time){let u=se(r.start_time);if(c<u)return false}else if(r.end_time){let u=se(r.end_time);if(c>=u)return false}return true}function Tn(r,e){return e.device_type?r.types.includes(e.device_type):false}function kn(r,e){return e.browser?r.browsers.includes(e.browser):false}function xn(r,e){return e.os?r.operating_systems.includes(e.os):false}function En(r,e,t,n){switch(r){case "percentage_rollout":return bn(e);case "userbase_percentage":return wn(e,t,n);case "time_based":return Sn(e,t);case "device_type":return Tn(e,t);case "browser":return kn(e,t);case "os":return xn(e,t);default:return false}}function ae(r,e){if(r.override==="force_on")return true;if(r.override==="force_off"||!r.enabled)return false;if(!r.rules||r.rules.length===0)return true;for(let t of r.rules)if(!En(t.rule_type,t.config,e,r.key))return false;return true}function dt(r,e){if(!ae(r,e)||r.flag_type!=="multivariate"||!r.variants||r.variants.length===0)return null;let t=`${e.anonymous_id}:${r.key}:variant`,n=ut(t),i=r.variants.reduce((a,c)=>a+c.weight,0),o=n%i,s=0;for(let a of r.variants)if(s+=a.weight,o<s)return a.key;return r.variants[0].key}function pt(r,e){return r.variant_payloads&&r.variant_payloads[e]!==void 0?r.variant_payloads[e]:r.variants?.find(n=>n.key===e)?.payload||null}var Cn="https://api.sitepong.com",F=class{constructor(e){this.flags=new Map;this.evaluatedFlags=new Map;this.evaluatedVariants=new Map;this.context=null;this.initialized=false;this.initPromise=null;this.config={endpoint:Cn,debug:false,...e};}async init(){if(!this.initialized){if(this.initPromise)return this.initPromise;this.initPromise=this.fetchAndEvaluateFlags();try{await this.initPromise,this.initialized=!0;}catch(e){this.log("Failed to initialize flags:",e),this.initialized=true;}finally{this.initPromise=null;}}}async fetchAndEvaluateFlags(){try{let e=await fetch(`${this.config.endpoint}/api/sdk/flags`,{method:"GET",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey}});if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);let t=await e.json();this.log("Fetched flags:",t.flags.length),this.context=Ie(),this.log("Evaluation context:",this.context),this.flags.clear(),this.evaluatedFlags.clear(),this.evaluatedVariants.clear();for(let n of t.flags){this.flags.set(n.key,n);let i=ae(n,this.context);if(this.evaluatedFlags.set(n.key,i),n.flag_type==="multivariate"&&n.variants){let o=dt(n,this.context);this.evaluatedVariants.set(n.key,o),this.log(`Flag "${n.key}": ${i}, variant: ${o}`);}else this.log(`Flag "${n.key}": ${i}`);}}catch(e){throw this.log("Error fetching flags:",e),e}}getFlag(e,t=false){if(!this.initialized)return this.log(`Flag "${e}" requested before init, returning default:`,t),t;let n=this.evaluatedFlags.get(e);return n===void 0?(this.log(`Flag "${e}" not found, returning default:`,t),t):n}getVariant(e,t=null){if(!this.initialized)return this.log(`Variant "${e}" requested before init, returning default:`,t),t;let n=this.evaluatedVariants.get(e);return n===void 0?(this.log(`Variant "${e}" not found, returning default:`,t),t):n}getVariantPayload(e,t=null){let n=this.getVariant(e);if(!n)return t;let i=this.flags.get(e);return i?pt(i,n)??t:t}getAllFlags(){let e={};for(let[t,n]of this.evaluatedFlags)e[t]=n;return e}hasFlag(e){return this.flags.has(e)}isInitialized(){return this.initialized}async waitForInit(){this.initialized||await this.init();}async refresh(){this.initialized=false,await this.init();}getContext(){return this.context}log(...e){this.config.debug&&console.log("[SitePong Flags]",...e);}};var Pe="sitepong_session_id",ce="sitepong_session_ts";var z=null,V=null;function gt(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return (r==="x"?e:e&3|8).toString(16)})}function ht(r){return Date.now()-r>18e5}function Le(){if(typeof window<"u"&&typeof sessionStorage<"u")try{let r=sessionStorage.getItem(Pe),e=sessionStorage.getItem(ce);if(r&&e&&!ht(parseInt(e,10)))return sessionStorage.setItem(ce,String(Date.now())),r;let t=gt();return sessionStorage.setItem(Pe,t),sessionStorage.setItem(ce,String(Date.now())),t}catch{return ft()}return ft()}function ft(){return z&&V&&!ht(V)?(V=Date.now(),z):(z=gt(),V=Date.now(),z)}function De(){if(typeof window<"u"&&typeof sessionStorage<"u")try{sessionStorage.removeItem(Pe),sessionStorage.removeItem(ce);}catch{}z=null,V=null;}var mt=["[data-sp-no-capture]",".sp-no-capture"];var $=class{constructor(e,t){this.clickHandler=null;this.submitHandler=null;this.active=false;this.config={clicks:true,forms:true,pageviews:true,blockSelectors:mt,maxTextLength:255,debug:false,...e},this.callback=t;}start(){this.active||typeof document>"u"||typeof document.addEventListener!="function"||(this.active=true,this.config.clicks&&this.setupClickCapture(),this.config.forms&&this.setupFormCapture(),this.log("Autocapture started"));}stop(){this.active&&(this.active=false,this.clickHandler&&(document.removeEventListener("click",this.clickHandler,true),this.clickHandler=null),this.submitHandler&&(document.removeEventListener("submit",this.submitHandler,true),this.submitHandler=null),this.log("Autocapture stopped"));}setupClickCapture(){this.clickHandler=e=>{let t=e.target;if(!t||!this.shouldCapture(t))return;let n=this.getElementProperties(t);n.$event_type="click",n.$x=e.clientX,n.$y=e.clientY,this.callback({type:"click",timestamp:new Date().toISOString(),properties:n});},document.addEventListener("click",this.clickHandler,true);}setupFormCapture(){this.submitHandler=e=>{let t=e.target;if(!t||!this.shouldCapture(t))return;let n={$event_type:"form_submit",$form_action:t.action||void 0,$form_method:t.method||"get",$form_name:t.name||t.id||void 0,$field_names:this.getFormFieldNames(t),$field_count:t.elements.length},i=this.getElementProperties(t);Object.assign(n,i),this.callback({type:"form_submit",timestamp:new Date().toISOString(),properties:n});},document.addEventListener("submit",this.submitHandler,true);}shouldCapture(e){let t=this.config.blockSelectors||mt;for(let n of t)if(e.matches(n)||e.closest(n))return false;return !(this.config.allowSelectors&&this.config.allowSelectors.length>0&&!this.config.allowSelectors.some(i=>e.matches(i)||e.closest(i)!==null)||e.offsetParent===null&&e.tagName!=="BODY")}getElementProperties(e){let t={};t.$tag_name=e.tagName.toLowerCase(),t.$el_id=e.id||void 0,e.classList.length>0&&(t.$el_classes=Array.from(e.classList).slice(0,5));let n=this.getElementText(e);n&&(t.$el_text=n),e instanceof HTMLAnchorElement&&(t.$href=e.href||void 0,t.$target=e.target||void 0),(e instanceof HTMLInputElement||e instanceof HTMLButtonElement)&&(t.$el_type=e.type||void 0,t.$el_name=e.name||void 0);let i=e.getAttribute("aria-label");i&&(t.$aria_label=this.truncate(i));let o=e.getAttribute("role");return o&&(t.$el_role=o),t.$selector=this.getSelector(e),typeof window<"u"&&window.location&&(t.$current_url=window.location.href,t.$pathname=window.location.pathname),t}getElementText(e){if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)return;let t="";if(e instanceof HTMLButtonElement||e instanceof HTMLAnchorElement)t=e.innerText||e.textContent||"";else for(let n of Array.from(e.childNodes))n.nodeType===Node.TEXT_NODE&&(t+=n.textContent||"");return t=t.trim().replace(/\s+/g," "),t?this.truncate(t):void 0}getFormFieldNames(e){let t=[];for(let n of Array.from(e.elements)){let i=n;i.name&&i.type!=="password"&&i.type!=="hidden"&&t.push(i.name);}return t.slice(0,20)}getSelector(e){let t=[],n=e,i=0;for(;n&&n!==document.body&&i<5;){let o=n.tagName.toLowerCase();if(n.id){o=`#${n.id}`,t.unshift(o);break}n.classList.length>0&&(o+=`.${Array.from(n.classList).slice(0,2).join(".")}`);let s=n.parentElement;if(s){let a=Array.from(s.children).filter(c=>c.tagName===n.tagName);if(a.length>1){let c=a.indexOf(n)+1;o+=`:nth-of-type(${c})`;}}t.unshift(o),n=n.parentElement,i++;}return t.join(" > ")}truncate(e){let t=this.config.maxTextLength||255;return e.length>t?e.slice(0,t)+"...":e}log(...e){this.config.debug&&console.log("[SitePong Autocapture]",...e);}};var Mn="https://ingest.sitepong.com",Rn=20,In=1e4,Fe=3,_=class{constructor(e){this.eventQueue=[];this.flushTimer=null;this.flushFailures=0;this.disabled=false;this.userId=null;this.groupId=null;this.userTraits=null;this.groupTraits=null;this.lastUrl=null;this.popstateHandler=null;this.autocaptureModule=null;this.config={endpoint:Mn,enabled:true,autocapturePageviews:false,maxBatchSize:Rn,flushInterval:In,debug:false,...e};}init(){this.config.enabled&&(this.startFlushTimer(),this.setupPageHideListener(),this.config.autocapturePageviews&&this.setupSPATracking(),this.setupAutocapture(),this.log("Analytics initialized"));}initHeadless(){this.config.enabled&&(this.startFlushTimer(),this.log("Analytics initialized (headless)"));}setupAutocapture(){let e=this.config.autocapture,t=this.config.autocaptureClicks,n=this.config.autocaptureForms,i=t||false,o=n||false,s,a;e===true?(i=true,o=true):e&&typeof e=="object"&&(i=e.clicks!==false,o=e.forms!==false,s=e.blockSelectors,a=e.allowSelectors,e.pageviews!==false&&!this.config.autocapturePageviews&&this.setupSPATracking()),!(!i&&!o)&&(this.autocaptureModule=new $({clicks:i,forms:o,pageviews:false,blockSelectors:s,allowSelectors:a,debug:this.config.debug},c=>{let u=c.type==="click"?"$autocapture_click":c.type==="form_submit"?"$autocapture_form_submit":"$autocapture";this.track(u,c.properties);}),this.autocaptureModule.start());}track(e,t){if(!this.config.enabled)return;let n=this.createEvent("track",{name:e,properties:t});this.enqueue(n),this.log("Track:",e,t);}trackPageView(e,t){if(!this.config.enabled)return;let n=e||(typeof window<"u"&&window.location?window.location.href:void 0),i=this.createEvent("page",{properties:{url:n,referrer:typeof document<"u"?document.referrer:void 0,title:typeof document<"u"?document.title:void 0,...t}});this.enqueue(i),this.log("Page view:",n);}identify(e,t){if(!this.config.enabled)return;this.userId=e,t&&(this.userTraits={...this.userTraits,...t});let n=this.createEvent("identify",{traits:this.userTraits||void 0});this.enqueue(n),this.log("Identify:",e,t);}group(e,t){if(!this.config.enabled)return;this.groupId=e,t&&(this.groupTraits={...this.groupTraits,...t});let n=this.createEvent("group",{traits:this.groupTraits||void 0});this.enqueue(n),this.log("Group:",e,t);}reset(){this.userId=null,this.groupId=null,this.userTraits=null,this.groupTraits=null,De(),this.log("Analytics state reset");}async flush(){if(this.eventQueue.length===0)return;if(this.disabled){this.eventQueue=[];return}let e=[...this.eventQueue];this.eventQueue=[];let t=this.config.eventsEndpoint||`${this.config.endpoint}/api/events`;try{let n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({events:e})});if(!n.ok)throw new Error(`HTTP ${n.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} events`);}catch(n){if(this.flushFailures++,this.flushFailures>=Fe){this.disabled=true,console.warn(`[SitePong Analytics] Disabled after ${Fe} consecutive failures. Check that ${t} is accessible and has proper CORS headers.`);return}this.eventQueue.unshift(...e),this.log(`Failed to flush events (attempt ${this.flushFailures}/${Fe}):`,n);}}destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.popstateHandler&&typeof window<"u"&&(window.removeEventListener("popstate",this.popstateHandler),this.popstateHandler=null),this.autocaptureModule&&(this.autocaptureModule.stop(),this.autocaptureModule=null),this.flushWithBeacon();}createEvent(e,t){return {type:e,name:t.name,properties:t.properties,userId:this.userId||void 0,anonymousId:D(),deviceId:void 0,groupId:this.groupId||void 0,traits:t.traits,sessionId:Le(),timestamp:new Date().toISOString(),url:typeof window<"u"&&window.location?window.location.href:void 0,referrer:typeof document<"u"&&typeof document.referrer=="string"?document.referrer:void 0,userAgent:typeof navigator<"u"?navigator.userAgent:void 0}}enqueue(e){this.eventQueue.push(e),this.eventQueue.length>=this.config.maxBatchSize&&this.flush();}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval);}setupPageHideListener(){typeof window>"u"||L()||typeof window.addEventListener!="function"||window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flushWithBeacon();});}flushWithBeacon(){if(this.eventQueue.length===0||L()||typeof navigator?.sendBeacon!="function")return;let e=[...this.eventQueue];this.eventQueue=[];let t=this.config.eventsEndpoint||`${this.config.endpoint}/api/events`,n=new Blob([JSON.stringify({events:e,apiKey:this.config.apiKey})],{type:"application/json"});navigator.sendBeacon(t,n),this.log(`Flushed ${e.length} events via beacon`);}setupSPATracking(){if(typeof window>"u"||L()||!window.location||typeof window.addEventListener!="function")return;this.lastUrl=window.location.href,this.trackPageView(),this.popstateHandler=()=>{if(!window.location)return;let n=window.location.href;n!==this.lastUrl&&(this.lastUrl=n,this.trackPageView(n));},window.addEventListener("popstate",this.popstateHandler);let e=history.pushState.bind(history),t=history.replaceState.bind(history);history.pushState=(...n)=>{e(...n),this.handleUrlChange();},history.replaceState=(...n)=>{t(...n),this.handleUrlChange();};}handleUrlChange(){if(typeof window>"u"||!window.location)return;let e=window.location.href;e!==this.lastUrl&&(this.lastUrl=e,this.trackPageView(e));}log(...e){this.config.debug&&console.log("[SitePong Analytics]",...e);}};var K=class{constructor(e){this.apiKey=e.apiKey,this.endpoint=e.endpoint,this.debug=e.debug||false;}async checkin(e,t={}){try{let n=await fetch(`${this.endpoint}/api/sdk/crons`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify({slug:e,status:t.status||"ok",duration_ms:t.duration_ms,message:t.message,environment:t.environment})});if(!n.ok)throw new Error(`HTTP ${n.status}`);this.log(`Check-in sent for "${e}" (${t.status||"ok"})`);}catch(n){this.log("Failed to send check-in:",n);}}start(e,t){let n=Date.now();return this.checkin(e,{status:"in_progress",environment:t}),{ok:async i=>{let o=Date.now()-n;await this.checkin(e,{status:"ok",duration_ms:o,message:i,environment:t});},error:async i=>{let o=Date.now()-n;await this.checkin(e,{status:"error",duration_ms:o,message:i,environment:t});}}}wrap(e,t,n){let i=this.start(e,n);return t().then(async o=>(await i.ok(),o),async o=>{throw await i.error(o?.message||String(o)),o})}log(...e){this.debug&&console.log("[SitePong:Cron]",...e);}};var q=class{constructor(e){this.queue=[];this.flushTimer=null;this.apiKey=e.apiKey,this.endpoint=e.endpoint,this.debug=e.debug||false,this.flushInterval=e.flushInterval||1e4,this.maxBatchSize=e.maxBatchSize||100,this.startFlushTimer();}increment(e,t=1,n){this.enqueue(e,t,"counter",n);}decrement(e,t=1,n){this.enqueue(e,-t,"counter",n);}gauge(e,t,n){this.enqueue(e,t,"gauge",n);}histogram(e,t,n){this.enqueue(e,t,"histogram",n);}distribution(e,t,n){this.enqueue(e,t,"distribution",n);}async time(e,t,n){let i=Date.now();try{let o=await t();return this.distribution(e,Date.now()-i,{...n,unit:n?.unit||"ms"}),o}catch(o){throw this.distribution(e,Date.now()-i,{...n,unit:n?.unit||"ms",tags:{...n?.tags,error:"true"}}),o}}startTimer(e,t){let n=Date.now();return {stop:()=>{this.distribution(e,Date.now()-n,{...t,unit:t?.unit||"ms"});}}}async flush(){if(this.queue.length===0)return;let e=[...this.queue];this.queue=[];try{let t=await fetch(`${this.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify({metrics:e})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} metrics`);}catch(t){this.queue.unshift(...e),this.log("Failed to flush metrics:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}enqueue(e,t,n,i){this.queue.push({name:e,value:t,type:n,unit:i?.unit,tags:i?.tags,timestamp:i?.timestamp||new Date().toISOString()}),this.queue.length>=this.maxBatchSize&&this.flush();}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.flushInterval);let e=b();e&&e.onVisibilityHidden(()=>this.flushWithBeacon());}flushWithBeacon(){if(this.queue.length===0)return;let e=b();if(!e||!e.sendBeacon)return;let t=[...this.queue];this.queue=[];let n=JSON.stringify({metrics:t,apiKey:this.apiKey});e.sendBeacon(`${this.endpoint}/api/sdk/metrics`,n)?this.log(`Flushed ${t.length} metrics via beacon`):this.queue.unshift(...t);}log(...e){this.debug&&console.log("[SitePong:Metrics]",...e);}};var W=class{constructor(e){this.queue=[];this.flushTimer=null;this.queryCounter=0;this.nPlusOneDetector=new Map;this.config={slowQueryThreshold:1e3,maxBatchSize:50,flushInterval:1e4,redactParams:true,...e},this.startFlushTimer();}async track(e,t,n){let i=Date.now();this.queryCounter++;try{let o=await t(),s=Date.now()-i;return this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,is_slow:s>=(this.config.slowQueryThreshold||1e3)}),this.detectNPlusOne(e),o}catch(o){let s=Date.now()-i;throw this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,error:o instanceof Error?o.message:String(o)}),o}}trackSync(e,t,n){let i=Date.now();this.queryCounter++;try{let o=t(),s=Date.now()-i;return this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,is_slow:s>=(this.config.slowQueryThreshold||1e3)}),o}catch(o){let s=Date.now()-i;throw this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,error:o instanceof Error?o.message:String(o)}),o}}getQueryCount(){return this.queryCounter}resetQueryCount(){this.queryCounter=0,this.nPlusOneDetector.clear();}getNPlusOnePatterns(){let e=[];for(let[t,{count:n}]of this.nPlusOneDetector.entries())n>=5&&e.push({query:t,count:n});return e}async flush(){if(this.queue.length===0)return;let e=[...this.queue];this.queue=[];try{let t=await fetch(`${this.config.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({metrics:e.map(n=>({name:"db.query",value:n.duration_ms,type:"distribution",unit:"ms",tags:{query:n.query.substring(0,200),source:n.source||"unknown",is_slow:String(n.is_slow||!1),...n.error?{error:"true"}:{}},timestamp:n.timestamp}))})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} query events`);}catch(t){this.queue.unshift(...e),this.log("Failed to flush query events:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}recordQuery(e){this.queue.push(e),this.queue.length>=(this.config.maxBatchSize||50)&&this.flush(),e.is_slow&&this.log(`Slow query (${e.duration_ms}ms):`,e.query.substring(0,100));}detectNPlusOne(e){let t=this.normalizeQuery(e),n=Date.now(),i=this.nPlusOneDetector.get(t);if(i?n-i.since<1e3?(i.count++,i.count===5&&this.log(`N+1 query detected! Pattern repeated ${i.count} times:`,t.substring(0,100))):this.nPlusOneDetector.set(t,{count:1,since:n}):this.nPlusOneDetector.set(t,{count:1,since:n}),this.nPlusOneDetector.size>100){let o=[...this.nPlusOneDetector.entries()];o.sort((s,a)=>s[1].since-a[1].since);for(let s=0;s<50;s++)this.nPlusOneDetector.delete(o[s][0]);}}normalizeQuery(e){return e.replace(/\s+/g," ").replace(/'[^']*'/g,"?").replace(/\b\d+\b/g,"?").trim().substring(0,300)}redactQuery(e){return e.replace(/'[^']*'/g,"'***'").replace(/\b\d{4,}\b/g,"***")}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval||1e4);}log(...e){this.config.debug&&console.log("[SitePong:DB]",...e);}};var j=class{constructor(e){this.profiles=[];this.activeProfile=null;this.frameStack=[];this.flushTimer=null;this.config={sampleRate:.1,maxDuration:3e4,flushInterval:3e4,...e},this.startFlushTimer();}async profile(e,t,n){if(Math.random()>(this.config.sampleRate||.1))return t();let i=this.generateId(),o=performance.now();this.activeProfile={id:i,name:e,startTime:o,duration_ms:0,frames:[],metadata:n},this.frameStack=[];let s={name:e,start_ms:0,duration_ms:0,children:[],metadata:n};this.frameStack.push(s);try{let a=await t();return s.duration_ms=performance.now()-o,this.activeProfile.duration_ms=s.duration_ms,this.activeProfile.frames=[s],s.duration_ms<=(this.config.maxDuration||3e4)&&this.profiles.push(this.activeProfile),this.activeProfile=null,this.frameStack=[],a}catch(a){throw s.duration_ms=performance.now()-o,s.metadata={...s.metadata,error:true},this.activeProfile&&(this.activeProfile.duration_ms=s.duration_ms,this.activeProfile.frames=[s],this.profiles.push(this.activeProfile)),this.activeProfile=null,this.frameStack=[],a}}startSpan(e,t){if(!this.activeProfile)return ()=>{};let n=performance.now()-this.activeProfile.startTime,i={name:e,start_ms:n,duration_ms:0,children:[],metadata:t},o=this.frameStack[this.frameStack.length-1];return o&&o.children.push(i),this.frameStack.push(i),()=>{i.duration_ms=performance.now()-this.activeProfile.startTime-i.start_ms,this.frameStack.pop();}}getProfiles(){return [...this.profiles]}getLatestProfile(){return this.profiles.length>0?this.profiles[this.profiles.length-1]:null}async flush(){if(this.profiles.length===0)return;let e=[...this.profiles];this.profiles=[];try{let t=await fetch(`${this.config.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({metrics:e.map(n=>({name:`profile.${n.name}`,value:n.duration_ms,type:"distribution",unit:"ms",tags:{profile_id:n.id,frame_count:String(vt(n.frames)),...n.metadata||{}},timestamp:new Date(Date.now()-n.duration_ms).toISOString()}))})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} profiles`);}catch(t){this.profiles.unshift(...e),this.log("Failed to flush profiles:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval||3e4);}generateId(){return `prof_${Date.now().toString(36)}_${Math.random().toString(36).substring(2,8)}`}log(...e){this.config.debug&&console.log("[SitePong:Profiler]",...e);}};function vt(r){let e=r.length;for(let t of r)e+=vt(t.children);return e}var _e={features:{},sampling:{errors:1,analytics:1,replay:1,performance:1},transport:{flushInterval:1e4,maxBatchSize:20,maxRetries:3},autocapture:{clicks:true,forms:true,pageviews:true,appState:true,screenViews:true},ttl:300};var yt="sitepong_remote_config",bt="sitepong_remote_config_ts",A=class{constructor(e){this.listeners=[];this.refreshTimer=null;this.initialized=false;this.options=e,this.config={..._e};}async init(){await this.loadFromCache(),this.initialized=true,this.fetchAndApply().catch(e=>{this.log("Failed to fetch remote config:",e);});}getConfig(){return this.config}isFeatureEnabled(e,t=true){return this.config.features[e]??t}onChange(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e);}}isInitialized(){return this.initialized}destroy(){this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null),this.listeners=[];}async loadFromCache(){let e=this.options.storage;if(e)try{let t=await e.getItem(yt),n=await e.getItem(bt);if(t&&n){let i=Date.now()-parseInt(n,10),o=this.config.ttl*1e3;if(i<o){let s=JSON.parse(t);this.config=s,this.log("Loaded config from cache (age:",Math.round(i/1e3),"s)");}}}catch{this.log("Failed to load cached config");}}async fetchAndApply(){try{let e=Ee(),t=new URLSearchParams({platform:e,...this.options.sdkVersion?{sdkVersion:this.options.sdkVersion}:{}}),n=await fetch(`${this.options.endpoint}/api/sdk/config?${t}`,{method:"GET",headers:{"X-API-Key":this.options.apiKey}});if(!n.ok)throw new Error(`HTTP ${n.status}`);let i=await n.json();this.config=i.config;for(let o of this.listeners)try{o(this.config);}catch{}await this.saveToCache(),this.scheduleRefresh(),i.config.minSdkVersion&&this.options.sdkVersion&&this.compareVersions(this.options.sdkVersion,i.config.minSdkVersion)<0&&console.warn(`[SitePong] SDK version ${this.options.sdkVersion} is outdated. Minimum recommended: ${i.config.minSdkVersion}. Please update.`),this.log("Remote config fetched successfully");}catch(e){throw this.scheduleRefresh(),e}}async saveToCache(){let e=this.options.storage;if(e)try{await e.setItem(yt,JSON.stringify(this.config)),await e.setItem(bt,String(Date.now()));}catch{this.log("Failed to cache remote config");}}scheduleRefresh(){this.refreshTimer&&clearTimeout(this.refreshTimer);let e=this.config.ttl*1e3;this.refreshTimer=setTimeout(()=>{this.fetchAndApply().catch(t=>{this.log("Refresh failed:",t);});},e);}compareVersions(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let o=0;o<3;o++){let s=n[o]||0,a=i[o]||0;if(s>a)return 1;if(s<a)return -1}return 0}log(...e){this.options.debug&&console.log("[SitePong RemoteConfig]",...e);}};var Oe;var Mt=-1,O=function(r){addEventListener("pageshow",(function(e){e.persisted&&(Mt=e.timeStamp,r(e));}),true);},Be=function(){var r=self.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];if(r&&r.responseStart>0&&r.responseStart<performance.now())return r},pe=function(){var r=Be();return r&&r.activationStart||0},k=function(r,e){var t=Be(),n="navigate";return Mt>=0?n="back-forward-cache":t&&(document.prerendering||pe()>0?n="prerender":document.wasDiscarded?n="restore":t.type&&(n=t.type.replace(/_/g,"-"))),{name:r,value:e===void 0?-1:e,rating:"good",delta:0,entries:[],id:"v4-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:n}},G=function(r,e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(r)){var n=new PerformanceObserver((function(i){Promise.resolve().then((function(){e(i.getEntries());}));}));return n.observe(Object.assign({type:r,buffered:!0},t||{})),n}}catch{}},x=function(r,e,t,n){var i,o;return function(s){e.value>=0&&(s||n)&&((o=e.value-(i||0))||i===void 0)&&(i=e.value,e.delta=o,e.rating=(function(a,c){return a>c[1]?"poor":a>c[0]?"needs-improvement":"good"})(e.value,t),r(e));}},He=function(r){requestAnimationFrame((function(){return requestAnimationFrame((function(){return r()}))}));},fe=function(r){document.addEventListener("visibilitychange",(function(){document.visibilityState==="hidden"&&r();}));},Ue=function(r){var e=false;return function(){e||(r(),e=true);}},N=-1,wt=function(){return document.visibilityState!=="hidden"||document.prerendering?1/0:0},de=function(r){document.visibilityState==="hidden"&&N>-1&&(N=r.type==="visibilitychange"?r.timeStamp:0,Pn());},St=function(){addEventListener("visibilitychange",de,true),addEventListener("prerenderingchange",de,true);},Pn=function(){removeEventListener("visibilitychange",de,true),removeEventListener("prerenderingchange",de,true);},Rt=function(){return N<0&&(N=wt(),St(),O((function(){setTimeout((function(){N=wt(),St();}),0);}))),{get firstHiddenTime(){return N}}},ge=function(r){document.prerendering?addEventListener("prerenderingchange",(function(){return r()}),true):r();},Tt=[1800,3e3],ze=function(r,e){e=e||{},ge((function(){var t,n=Rt(),i=k("FCP"),o=G("paint",(function(s){s.forEach((function(a){a.name==="first-contentful-paint"&&(o.disconnect(),a.startTime<n.firstHiddenTime&&(i.value=Math.max(a.startTime-pe(),0),i.entries.push(a),t(true)));}));}));o&&(t=x(r,i,Tt,e.reportAllChanges),O((function(s){i=k("FCP"),t=x(r,i,Tt,e.reportAllChanges),He((function(){i.value=performance.now()-s.timeStamp,t(true);}));})));}));},kt=[.1,.25],It=function(r,e){e=e||{},ze(Ue((function(){var t,n=k("CLS",0),i=0,o=[],s=function(c){c.forEach((function(u){if(!u.hadRecentInput){var p=o[0],g=o[o.length-1];i&&u.startTime-g.startTime<1e3&&u.startTime-p.startTime<5e3?(i+=u.value,o.push(u)):(i=u.value,o=[u]);}})),i>n.value&&(n.value=i,n.entries=o,t());},a=G("layout-shift",s);a&&(t=x(r,n,kt,e.reportAllChanges),fe((function(){s(a.takeRecords()),t(true);})),O((function(){i=0,n=k("CLS",0),t=x(r,n,kt,e.reportAllChanges),He((function(){return t()}));})),setTimeout(t,0));})));},Pt=0,Ae=1/0,le=0,Ln=function(r){r.forEach((function(e){e.interactionId&&(Ae=Math.min(Ae,e.interactionId),le=Math.max(le,e.interactionId),Pt=le?(le-Ae)/7+1:0);}));},Lt=function(){return Oe?Pt:performance.interactionCount||0},Dn=function(){"interactionCount"in performance||Oe||(Oe=G("event",Ln,{type:"event",buffered:true,durationThreshold:0}));},T=[],ue=new Map,Dt=0,Fn=function(){var r=Math.min(T.length-1,Math.floor((Lt()-Dt)/50));return T[r]},_n=[],An=function(r){if(_n.forEach((function(i){return i(r)})),r.interactionId||r.entryType==="first-input"){var e=T[T.length-1],t=ue.get(r.interactionId);if(t||T.length<10||r.duration>e.latency){if(t)r.duration>t.latency?(t.entries=[r],t.latency=r.duration):r.duration===t.latency&&r.startTime===t.entries[0].startTime&&t.entries.push(r);else {var n={id:r.interactionId,latency:r.duration,entries:[r]};ue.set(n.id,n),T.push(n);}T.sort((function(i,o){return o.latency-i.latency})),T.length>10&&T.splice(10).forEach((function(i){return ue.delete(i.id)}));}}},Ft=function(r){var e=self.requestIdleCallback||self.setTimeout,t=-1;return r=Ue(r),document.visibilityState==="hidden"?r():(t=e(r),fe(r)),t},xt=[200,500],_t=function(r,e){"PerformanceEventTiming"in self&&"interactionId"in PerformanceEventTiming.prototype&&(e=e||{},ge((function(){var t;Dn();var n,i=k("INP"),o=function(a){Ft((function(){a.forEach(An);var c=Fn();c&&c.latency!==i.value&&(i.value=c.latency,i.entries=c.entries,n());}));},s=G("event",o,{durationThreshold:(t=e.durationThreshold)!==null&&t!==void 0?t:40});n=x(r,i,xt,e.reportAllChanges),s&&(s.observe({type:"first-input",buffered:true}),fe((function(){o(s.takeRecords()),n(true);})),O((function(){Dt=Lt(),T.length=0,ue.clear(),i=k("INP"),n=x(r,i,xt,e.reportAllChanges);})));})));},Et=[2500,4e3],Ne={},At=function(r,e){e=e||{},ge((function(){var t,n=Rt(),i=k("LCP"),o=function(c){e.reportAllChanges||(c=c.slice(-1)),c.forEach((function(u){u.startTime<n.firstHiddenTime&&(i.value=Math.max(u.startTime-pe(),0),i.entries=[u],t());}));},s=G("largest-contentful-paint",o);if(s){t=x(r,i,Et,e.reportAllChanges);var a=Ue((function(){Ne[i.id]||(o(s.takeRecords()),s.disconnect(),Ne[i.id]=true,t(true));}));["keydown","click"].forEach((function(c){addEventListener(c,(function(){return Ft(a)}),{once:true,capture:true});})),fe(a),O((function(c){i=k("LCP"),t=x(r,i,Et,e.reportAllChanges),He((function(){i.value=performance.now()-c.timeStamp,Ne[i.id]=true,t(true);}));}));}}));},Ct=[800,1800],Nn=function r(e){document.prerendering?ge((function(){return r(e)})):document.readyState!=="complete"?addEventListener("load",(function(){return r(e)}),true):setTimeout(e,0);},Nt=function(r,e){e=e||{};var t=k("TTFB"),n=x(r,t,Ct,e.reportAllChanges);Nn((function(){var i=Be();i&&(t.value=Math.max(i.responseStart-pe(),0),t.entries=[i],n(true),O((function(){t=k("TTFB",0),(n=x(r,t,Ct,e.reportAllChanges))(true);})));}));};var On="https://ingest.sitepong.com",Bn=1e4,Ve=3,Hn=200,Ot=200,Bt=3e4;function Un(r){let e=[],t=document.getElementsByTagName("*"),n=/url\(("[^"]*"|'[^']*'|[^)]*)\)/i;for(let i=0;i<t.length;i++){let o=t[i],s="";if(o.tagName==="IMG"&&(s=o.currentSrc||o.src),!s){let h=getComputedStyle(o).getPropertyValue("background-image");if(h){let m=n.exec(h);m!==null&&(s=m[1],(s.startsWith('"')||s.startsWith("'"))&&(s=s.substr(1,s.length-2)));}}if(!s)continue;let a=s.substr(0,10)==="data:image"?0:r[s];if(a===void 0)continue;let c=o.getBoundingClientRect(),u=Math.max(c.top,0),p=Math.max(c.left,0),g=Math.min(c.bottom,window.innerHeight||document.documentElement&&document.documentElement.clientHeight||0),d=Math.min(c.right,window.innerWidth||document.documentElement&&document.documentElement.clientWidth||0);if(g<=u||d<=p)continue;let f=(g-u)*(d-p);e.push({time:a,area:f});}return e}function zn(r,e){let t=Math.max(document.documentElement&&document.documentElement.clientWidth||0,window.innerWidth||0)*Math.max(document.documentElement&&document.documentElement.clientHeight||0,window.innerHeight||0)/10,n=t*r;for(let i=0;i<e.length;i++){let{time:o,area:s}=e[i];t+=s,n+=s*(o>r?o:r);}return t===0?0:n/t}var X=class{constructor(e){this.metrics=[];this.flushTimer=null;this.flushFailures=0;this.disabled=false;this.vitals={};this.activeTransactions=new Map;this.resourceObserver=null;this.resourceTimeMap={};this.resourceCount=0;this.pageLoadTimer=null;this.pageRenderTimer=null;this.config={endpoint:On,enabled:true,webVitals:true,navigationTiming:true,resourceTiming:true,capturePageLoadTimings:true,capturePageRenderTimings:true,excludedResourceUrls:[],flushInterval:Bn,sampleRate:1,debug:false,...e},this.sampled=Math.random()<=this.config.sampleRate;}init(){!this.config.enabled||!this.sampled||typeof window>"u"||typeof window.addEventListener!="function"||(this.config.webVitals!==false&&this.initWebVitals(),this.config.resourceTiming!==false&&this.initResourceTiming(),this.config.capturePageLoadTimings!==false&&this.initPageLoadTiming(),this.config.capturePageRenderTimings!==false&&this.initPageRenderTiming(),this.startFlushTimer(),this.log("Performance monitoring initialized"));}initWebVitals(){It(e=>{this.vitals.cls=e.value,this.reportVital("CLS",e.value,"score");}),_t(e=>{this.vitals.inp=e.value,this.reportVital("INP",e.value);}),At(e=>{this.vitals.lcp=e.value,this.reportVital("LCP",e.value);}),Nt(e=>{this.vitals.ttfb=e.value,this.reportVital("TTFB",e.value);}),ze(e=>{this.vitals.fcp=e.value,this.reportVital("FCP",e.value);});}initResourceTiming(){if(!(typeof PerformanceObserver>"u"))try{this.resourceObserver=new PerformanceObserver(e=>{for(let t of e.getEntries())this.processResourceEntry(t);}),this.resourceObserver.observe({type:"resource",buffered:!0});}catch{this.log("PerformanceObserver for resource timing not supported");}}isServiceURL(e){let t=this.config.performanceEndpoint||this.config.endpoint;return e.startsWith(t)}processResourceEntry(e){if(e.duration<0||!e.name.startsWith("http")||this.isServiceURL(e.name))return;this.resourceTimeMap!==null&&(this.resourceTimeMap[e.name]=e.startTime+e.duration);for(let c of this.config.excludedResourceUrls)if(e.name.startsWith(c))return;if(this.resourceCount>=Hn)return;this.resourceCount++;let t=0;e.connectEnd&&e.connectEnd>e.domainLookupEnd?t=Math.max(0,e.requestStart-e.connectEnd):t=Math.max(0,e.requestStart-e.domainLookupEnd);let n=e.responseStatus&&e.responseStatus===304||e.deliveryType&&e.deliveryType==="cache"||e.transferSize===0&&e.decodedBodySize>0,i=e.responseStatus||0,o=i>=400,s={queueing:e.requestStart-e.fetchStart,dnsLookup:e.domainLookupEnd-e.domainLookupStart,initialConnection:e.connectEnd-e.connectStart,ssl:e.secureConnectionStart>0?e.connectEnd-e.secureConnectionStart:0,ttfb:e.responseStart-e.requestStart,contentDownload:e.responseEnd-e.responseStart,total:e.duration??e.responseEnd-e.startTime,stalled:t,cached:n,failed:o,responseStatus:i,headerSize:e.transferSize>e.encodedBodySize?e.transferSize-e.encodedBodySize:0,encodedBodySize:e.encodedBodySize||0,decodedBodySize:o?-111:e.decodedBodySize||0,transferSize:e.transferSize,initiatorType:e.initiatorType},a=this.config.resourceNameSanitizer?this.config.resourceNameSanitizer(e.name):e.name;this.addMetric({type:"resource",name:a,value:e.duration,unit:"ms",timestamp:new Date().toISOString(),url:typeof window<"u"&&window.location?window.location.href:void 0,data:s});}initPageLoadTiming(){if(typeof window>"u"||!window.performance)return;let e=0,t=0,n=false,i=performance.now();this.pageLoadTimer=setInterval(()=>{if(n){this.pageLoadTimer&&clearInterval(this.pageLoadTimer);return}if(e===0||t===0)for(let a of performance.getEntriesByType("paint"))a.name==="first-paint"&&(e=a.startTime),a.name==="first-contentful-paint"&&(t=a.startTime);let o=performance.getEntriesByType("navigation")[0],s=performance.now()-i>Bt;if((o&&o.loadEventEnd>0||s)&&(n=true,this.pageLoadTimer&&clearInterval(this.pageLoadTimer),o)){let a=o.startTime;this.addMetric({type:"navigation",name:"page_load",value:o.loadEventEnd-a,unit:"ms",timestamp:new Date().toISOString(),url:window.location.href,data:{requestStart:o.requestStart-a,responseStart:o.responseStart-a,responseEnd:o.responseEnd-a,domContentLoadedEventStart:o.domContentLoadedEventEnd-a,domContentLoadedEventEnd:o.domContentLoadedEventEnd-a,loadEventStart:o.loadEventStart-a,loadEventEnd:o.loadEventEnd-a,firstPaint:e,firstContentfulPaint:t,dns:o.domainLookupEnd-o.domainLookupStart,tcp:o.connectEnd-o.connectStart,ttfb:o.responseStart-o.requestStart,domComplete:o.domComplete-a,transferSize:o.transferSize,encodedBodySize:o.encodedBodySize,decodedBodySize:o.decodedBodySize}});}},Ot);}initPageRenderTiming(){if(typeof window>"u"||!window.performance)return;let e=0,t=0,n=0,i=0,o=null,s=false,a=performance.now();this.pageRenderTimer=setInterval(()=>{if(s){this.pageRenderTimer&&clearInterval(this.pageRenderTimer);return}let c=performance.now();if(e===0)for(let p of performance.getEntriesByType("paint"))p.name==="first-contentful-paint"&&(e=p.startTime);if(this.resourceTimeMap!==null){let p=Object.values(this.resourceTimeMap);p.length>0&&(t=Math.max(...p)),c-t>1e3&&(o=Un(this.resourceTimeMap),this.resourceTimeMap=null);}i!==null&&(c-i>50&&(n=c),i=c-n>5e3?null:c);let u=c-a>Bt;if(o!==null&&i===null||u){s=true,this.pageRenderTimer&&clearInterval(this.pageRenderTimer),this.resourceTimeMap=null;let p=o===null?0:zn(e||0,o),g=performance.getEntriesByType("navigation")[0],d=g?g.domContentLoadedEventEnd-g.startTime:0,f=i===null?Math.max(n,e,d):0,h=window.location.href,m=new Date().toISOString();p>0&&this.addMetric({type:"page_render",name:"speed_index",value:Math.round(p),unit:"ms",timestamp:m,url:h}),t>0&&this.addMetric({type:"page_render",name:"visually_complete",value:Math.round(t),unit:"ms",timestamp:m,url:h}),f>0&&this.addMetric({type:"page_render",name:"tti",value:Math.round(f),unit:"ms",timestamp:m,url:h});}},Ot);}startTransaction(e,t){let n=`txn_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,6)}`,i={id:n,name:e,startTime:performance.now(),status:"running",spans:[],data:t};return this.activeTransactions.set(n,i),this.log("Transaction started:",e,n),n}endTransaction(e,t="ok"){let n=this.activeTransactions.get(e);if(!n){this.log("Transaction not found:",e);return}n.endTime=performance.now(),n.duration=n.endTime-n.startTime,n.status=t;for(let i of n.spans)i.status==="running"&&(i.endTime=n.endTime,i.duration=i.endTime-i.startTime,i.status=t);this.activeTransactions.delete(e),this.addMetric({type:"transaction",name:n.name,value:n.duration,unit:"ms",timestamp:new Date().toISOString(),url:typeof window<"u"&&window.location?window.location.href:void 0,transaction:n}),this.log("Transaction ended:",n.name,`${n.duration.toFixed(1)}ms`);}startSpan(e,t,n){let i=this.activeTransactions.get(e);if(!i)return this.log("Transaction not found for span:",e),"";let o={id:`span_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,6)}`,name:t,startTime:performance.now(),status:"running",data:n};return i.spans.push(o),o.id}endSpan(e,t,n="ok"){let i=this.activeTransactions.get(e);if(!i)return;let o=i.spans.find(s=>s.id===t);o&&(o.endTime=performance.now(),o.duration=o.endTime-o.startTime,o.status=n);}getVitals(){return {...this.vitals}}destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.pageLoadTimer&&(clearInterval(this.pageLoadTimer),this.pageLoadTimer=null),this.pageRenderTimer&&(clearInterval(this.pageRenderTimer),this.pageRenderTimer=null),this.resourceObserver&&(this.resourceObserver.disconnect(),this.resourceObserver=null),this.flush();}reportVital(e,t,n="ms"){this.addMetric({type:"web_vital",name:e,value:t,unit:n,timestamp:new Date().toISOString(),url:typeof window<"u"&&window.location?window.location.href:void 0});}addMetric(e){this.metrics.push(e);}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval),typeof document<"u"&&document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush();});}async flush(){if(this.metrics.length===0)return;if(this.disabled){this.metrics=[];return}let e=[...this.metrics];this.metrics=[],this.resourceCount=0;let t=this.config.performanceEndpoint||`${this.config.endpoint}/api/performance`;try{let n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({metrics:e})});if(!n.ok)throw new Error(`HTTP ${n.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} performance metrics`);}catch(n){if(this.flushFailures++,this.flushFailures>=Ve){this.disabled=true,console.warn(`[SitePong Performance] Disabled after ${Ve} consecutive failures. Check that ${t} is accessible and has proper CORS headers.`);return}this.metrics.unshift(...e),this.log(`Failed to flush metrics (attempt ${this.flushFailures}/${Ve}):`,n);}}log(...e){this.config.debug&&console.log("[SitePong Performance]",...e);}};function Ht(r){try{if(typeof crypto<"u"&&crypto.getRandomValues){let t=new Uint8Array(r);return crypto.getRandomValues(t),Array.from(t).map(n=>n.toString(16).padStart(2,"0")).join("")}}catch{}let e="";for(let t=0;t<r;t++)e+=Math.floor(Math.random()*256).toString(16).padStart(2,"0");return e}function $e(){return Ht(16)}function ve(){return Ht(8)}function Ke(){return {traceId:$e(),spanId:ve(),parentSpanId:null,sampled:true}}function he(r){let e=r.sampled?"01":"00";return {traceparent:`00-${r.traceId}-${r.spanId}-${e}`,tracestate:`sitepong=${r.spanId}`}}function Ut(r){let e=r.traceparent||r.Traceparent;if(!e)return null;let t=e.split("-");if(t.length!==4)return null;let[n,i,o,s]=t;if(n!=="00"||i.length!==32||!/^[0-9a-f]{32}$/.test(i)||o.length!==16||!/^[0-9a-f]{16}$/.test(o)||s.length!==2||!/^[0-9a-f]{2}$/.test(s))return null;let a=(parseInt(s,16)&1)===1;return {traceId:i,spanId:ve(),parentSpanId:o,sampled:a}}var me=class{constructor(e){this.originalFetch=null;this.targets=e;}shouldPropagate(e){return this.targets.some(t=>{if(t.includes("*")){let n=t.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${n}$`).test(e)}return e.startsWith(t)})}injectHeaders(e,t,n){if(!this.shouldPropagate(e))return t;let i=he(n);return {...t,...i}}start(){if(typeof window>"u"||!window.fetch||this.originalFetch)return;this.originalFetch=window.fetch;let e=this;window.fetch=function(t,n){let i=typeof t=="string"?t:t instanceof URL?t.toString():t.url;if(e.shouldPropagate(i)){let o=Ke(),s=he(o),a={};if(n?.headers)if(n.headers instanceof Headers)n.headers.forEach((p,g)=>{a[g]=p;});else if(Array.isArray(n.headers))for(let[p,g]of n.headers)a[p]=g;else Object.assign(a,n.headers);let c={...a,...s},u={...n,headers:c};return e.originalFetch.call(window,t,u)}return e.originalFetch.call(window,t,n)};}stop(){typeof window>"u"||this.originalFetch&&(window.fetch=this.originalFetch,this.originalFetch=null);}};var qe="https://pongl.ink",Q=class{constructor(e={}){this.config={endpoint:zt(e.endpoint||qe),appId:e.appId,installId:e.installId,debug:e.debug??false};}configure(e){e.endpoint&&(this.config.endpoint=zt(e.endpoint)),e.appId!==void 0&&(this.config.appId=e.appId),e.installId!==void 0&&(this.config.installId=e.installId),e.debug!==void 0&&(this.config.debug=e.debug);}log(...e){this.config.debug&&console.warn("[SuperLink]",...e);}async match(e){let t={...e,install_id:e.install_id??this.config.installId};try{let n=await fetch(`${this.config.endpoint}/match`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return n.ok?await n.json()??{matched:!1}:(this.log("match failed",n.status),{matched:!1})}catch(n){return this.log("match error",n),{matched:false}}}async reportEvent(e){try{let t=await fetch(`${this.config.endpoint}/events`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({app_id:this.config.appId,install_id:this.config.installId,...e})});return t.ok||this.log("event failed",e.type,t.status),t.ok}catch(t){return this.log("event error",t),false}}};function zt(r){return r.endsWith("/")?r.slice(0,-1):r}var w=new Q;var Vn=[["source","utm_source"],["medium","utm_medium"],["campaign","utm_campaign"],["term","utm_term"],["content","utm_content"]];function ye(r){let e;try{e=new URL(r);}catch{return null}let t=e.searchParams,n={};for(let[c,u]of Vn){let p=t.get(u);p&&(n[c]=p);}let i={},o={};return t.forEach((c,u)=>{u.startsWith("r_")?i[u.slice(2)]=c:u.startsWith("~")&&(o[u.slice(1)]=c);}),{deep_link_path:t.get("$deep_link_path")??t.get("dlp")??(e.pathname&&e.pathname!=="/"?e.pathname:null),deep_link_data:o,utm:n,referral:i,click_id:t.get("click_id"),match_type:"none",confidence:1}}var We=new Set,be=null;function je(r){return {deep_link_path:r.deep_link_path??null,deep_link_data:r.deep_link_data??{},utm:r.utm??{},referral:r.referral??{},click_id:r.click_id??null,match_type:r.match_type??"fingerprint",confidence:r.confidence??(r.match_type&&r.match_type!=="none"?1:0)}}function Ge(r){be=r;for(let e of We)try{e(r);}catch(t){w.config.debug&&console.warn("[SuperLink] handler threw",t);}}function Vt(r){if(We.add(r),be)try{r(be);}catch{}return ()=>{We.delete(r);}}function $t(){return be}var Kt="sp_superlink",B=null,Xe=false;function $n(){if(typeof sessionStorage>"u")return null;try{let r=sessionStorage.getItem(Kt);if(!r)return null;let e=JSON.parse(r);return e&&typeof e=="object"?e:null}catch{return null}}function Kn(r){if(!(typeof sessionStorage>"u"))try{sessionStorage.setItem(Kt,JSON.stringify(r));}catch{}}function qn(r){return !!(r.deep_link_path||r.click_id||Object.keys(r.deep_link_data).length>0||Object.keys(r.referral).length>0||Object.keys(r.utm).length>0)}function qt(r){if(typeof navigator>"u"||!navigator.clipboard)return;let e=`${w.config.endpoint}/c/${r}`;navigator.clipboard.writeText(e).catch(()=>{});}function Wt(r){let e=r??(typeof window<"u"&&window.location?window.location.href:null);if(!e)return;let t;try{t=new URL(e);}catch{return}let n=t.searchParams.get("email"),i=t.searchParams.get("phone"),o=t.searchParams.get("user_id"),s=t.searchParams.get("id"),a=t.searchParams.get("custom"),c={};if(n&&(c.email=n),i&&(c.phone=i),o&&(c.user_id=o),s&&(c.id=s),a)try{let u=JSON.parse(decodeURIComponent(a));typeof u=="object"&&u!==null&&(c.custom=u);}catch{}return Object.keys(c).length>0?c:void 0}function Y(){if(Xe)return B;Xe=true;let r=$n();if(r)return B=r,B;if(typeof window>"u"||!window.location)return null;let e=ye(window.location.href);return e&&qn(e)&&(B=e,Kn(e),w.reportEvent({type:"opened",click_id:e.click_id,platform:"desktop",properties:{surface:"web"}})),B}function jt(){return Xe?B:Y()}function Gt(){let r={platform:"desktop"};if(typeof navigator<"u"){navigator.userAgent&&(r.user_agent=navigator.userAgent);let e=navigator.language||navigator.languages&&navigator.languages[0];e&&(r.language=e);}return r}async function Xt(r){if(!r||Object.keys(r).length===0)return null;let e=await w.match({identity:r,fingerprint:Gt()});if(!e.matched)return null;let t=je(e);return Ge(t),t}async function Qt(r){if(!r)return null;let e=await w.match({qr_token:r,fingerprint:Gt()});if(!e.matched)return null;let t=je(e);return Ge(t),t}function Wn(r={}){w.configure(r),Y();}function jn(){if(b())return;let r=globalThis,e=typeof r.window<"u"&&typeof r.document<"u",t=!e&&!!r.process?.versions?.node,n=e?"browser":"node";U({platform:n,storage:null,getDeviceInfo(){let o={platform:n};return r.navigator?.userAgent&&(o.userAgent=r.navigator.userAgent),e&&r.window?.screen&&(o.screenWidth=r.window.screen.width,o.screenHeight=r.window.screen.height),t&&r.process&&(o.osName=r.process.platform,o.osVersion=r.process.versions?.node),o},getCurrentUrl(){return r.window?.location?.href??void 0},getReferrer(){return r.document?.referrer||void 0},getUserAgent(){if(r.navigator?.userAgent)return r.navigator.userAgent;if(t&&r.process)return `SitePong-Node/${r.process.versions?.node} (${r.process.platform})`},onUncaughtError(o){if(e&&r.window?.addEventListener){let s=a=>o(a.error||a.message);return r.window.addEventListener("error",s),()=>r.window?.removeEventListener?.("error",s)}if(t&&r.process?.on&&r.process.off){let s=a=>o(a);return r.process.on("uncaughtException",s),()=>r.process?.off?.("uncaughtException",s)}return ()=>{}},onUnhandledRejection(o){if(e&&r.window?.addEventListener){let s=a=>o(a.reason);return r.window.addEventListener("unhandledrejection",s),()=>r.window?.removeEventListener?.("unhandledrejection",s)}if(t&&r.process?.on&&r.process.off){let s=a=>o(a);return r.process.on("unhandledRejection",s),()=>r.process?.off?.("unhandledRejection",s)}return ()=>{}},onBeforeTerminate(o){return e&&r.window?.addEventListener?(r.window.addEventListener("beforeunload",o),()=>r.window?.removeEventListener?.("beforeunload",o)):t&&r.process?.on&&r.process.off?(r.process.on("beforeExit",o),r.process.on("SIGINT",o),r.process.on("SIGTERM",o),()=>{r.process?.off?.("beforeExit",o),r.process?.off?.("SIGINT",o),r.process?.off?.("SIGTERM",o);}):()=>{}},onVisibilityHidden(o){if(r.document?.addEventListener){let s=()=>{r.document?.visibilityState==="hidden"&&o();};return r.document.addEventListener("visibilitychange",s),()=>r.document?.removeEventListener?.("visibilitychange",s)}return ()=>{}},sendBeacon(o,s){if(typeof r.navigator?.sendBeacon!="function")return false;try{return r.navigator.sendBeacon(o,new Blob([s],{type:"application/json"}))}catch{return false}}});}jn();var R={};function Yt(r){R={...R,...r};}var v="https://ingest.sitepong.com",Gn=10,Xn=5e3,Qe=3,Ye=class{constructor(){this.errorQueue=[];this.flushTimer=null;this.context={};this.initialized=false;this.flushFailures=0;this.disabled=false;this.flagManager=null;this.analyticsManager=null;this.fingerprintManager=null;this.replayManager=null;this.performanceManager=null;this.cronManager=null;this.metricsManager=null;this.databaseTracker=null;this.profiler=null;this.remoteConfigManager=null;this.envUnsubs=[];this.identifyHooks=[];this.config={apiKey:"",endpoint:v,environment:"production",release:"",autoCapture:true,maxBatchSize:Gn,flushInterval:Xn,debug:false};}init(e){if(!e.apiKey){console.error("[SitePong] API key is required");return}if(this.config={...this.config,...e},this.initialized=true,this.config.autoCapture&&this.setupAutoCapture(),this.startFlushTimer(),this.log("Initialized with endpoint:",this.config.endpoint),e.enableFlags&&(this.flagManager=new F({apiKey:e.apiKey,endpoint:e.flagsEndpoint||e.endpoint||v,debug:e.debug}),this.flagManager.init().catch(t=>{this.log("Failed to initialize flags:",t);})),e.analytics?.enabled&&(this.analyticsManager&&this.analyticsManager.destroy(),this.analyticsManager=new _({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,autocapturePageviews:e.analytics.autocapturePageviews,autocaptureClicks:e.analytics.autocaptureClicks,autocaptureForms:e.analytics.autocaptureForms,autocapture:e.analytics.autocapture,maxBatchSize:e.analytics.maxBatchSize,flushInterval:e.analytics.flushInterval,eventsEndpoint:e.analytics.eventsEndpoint,debug:e.debug}),this.analyticsManager.init()),e.fingerprint?.enabled&&R.createFingerprint?this.fingerprintManager=R.createFingerprint({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,extendedSignals:e.fingerprint.extendedSignals,visitorEndpoint:e.fingerprint.visitorEndpoint,debug:e.debug}):e.fingerprint?.enabled&&this.log("Fingerprint requested but not available on this platform (web only)."),e.performance?.enabled&&R.createPerformance?(this.performanceManager&&this.performanceManager.destroy(),this.performanceManager=R.createPerformance({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,webVitals:e.performance.webVitals,navigationTiming:e.performance.navigationTiming,resourceTiming:e.performance.resourceTiming,capturePageLoadTimings:e.performance.capturePageLoadTimings,capturePageRenderTimings:e.performance.capturePageRenderTimings,excludedResourceUrls:e.performance.excludedResourceUrls,resourceNameSanitizer:e.performance.resourceNameSanitizer,sampleRate:e.performance.sampleRate,flushInterval:e.performance.flushInterval,performanceEndpoint:e.performance.performanceEndpoint,debug:e.debug}),this.performanceManager.init()):e.performance?.enabled&&this.log("Performance requested but not available on this platform (web only)."),e.replay?.enabled&&R.createReplay?(this.replayManager&&this.replayManager.stop(),this.replayManager=R.createReplay({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,maskInputs:e.replay.maskInputs,blockSelector:e.replay.blockSelector,maskSelector:e.replay.maskSelector,sampleRate:e.replay.sampleRate,maxSessionDuration:e.replay.maxSessionDuration,flushInterval:e.replay.flushInterval,replayEndpoint:e.replay.replayEndpoint,recordNetwork:e.replay.recordNetwork,captureNetworkHeaders:e.replay.captureNetworkHeaders,recordConsole:e.replay.recordConsole,consoleLevels:e.replay.consoleLevels,bufferDuration:e.replay.bufferDuration,debug:e.debug}),this.replayManager.start()):e.replay?.enabled&&this.log("Replay requested but not available on this platform (web only)."),e.crons?.enabled&&(this.cronManager=new K({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug})),e.database?.enabled&&(this.databaseTracker=new W({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,slowQueryThreshold:e.database.slowQueryThreshold,redactParams:e.database.redactParams})),e.metrics?.enabled&&(this.metricsManager=new q({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,flushInterval:e.metrics.flushInterval,maxBatchSize:e.metrics.maxBatchSize})),e.profiling?.enabled&&(this.profiler=new j({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,sampleRate:e.profiling.sampleRate,maxDuration:e.profiling.maxDuration,flushInterval:e.profiling.flushInterval})),e.remoteConfig?.enabled!==false){let t=e._storageAdapter||Me();this.remoteConfigManager=new A({apiKey:e.apiKey,endpoint:e.endpoint||v,storage:t,debug:e.debug}),this.remoteConfigManager.init().catch(n=>{this.log("Failed to initialize remote config:",n);});}}initRN(e){if(!e.apiKey){console.error("[SitePong] API key is required");return}if(this.config={...this.config,...e},this.initialized=true,this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval),this.log("Initialized (React Native) with endpoint:",this.config.endpoint),e.enableFlags&&(this.flagManager=new F({apiKey:e.apiKey,endpoint:e.flagsEndpoint||e.endpoint||v,debug:e.debug}),this.flagManager.init().catch(t=>{this.log("Failed to initialize flags:",t);})),e.analytics?.enabled&&(this.analyticsManager&&this.analyticsManager.destroy(),this.analyticsManager=new _({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,maxBatchSize:e.analytics.maxBatchSize,flushInterval:e.analytics.flushInterval,eventsEndpoint:e.analytics.eventsEndpoint,debug:e.debug}),this.analyticsManager.initHeadless()),e.crons?.enabled&&(this.cronManager=new K({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug})),e.metrics?.enabled&&(this.metricsManager=new q({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,flushInterval:e.metrics.flushInterval,maxBatchSize:e.metrics.maxBatchSize})),e.database?.enabled&&(this.databaseTracker=new W({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,slowQueryThreshold:e.database.slowQueryThreshold,redactParams:e.database.redactParams})),e.profiling?.enabled&&(this.profiler=new j({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,sampleRate:e.profiling.sampleRate,maxDuration:e.profiling.maxDuration,flushInterval:e.profiling.flushInterval})),e.remoteConfig?.enabled!==false){let t=e._storageAdapter||Me();this.remoteConfigManager=new A({apiKey:e.apiKey,endpoint:e.endpoint||v,storage:t,debug:e.debug}),this.remoteConfigManager.init().catch(n=>{this.log("Failed to initialize remote config:",n);});}}isInitialized(){return this.initialized}getFlag(e,t=false){return this.flagManager?this.flagManager.getFlag(e,t):(this.log("Flags not enabled. Set enableFlags: true in init()"),t)}getAllFlags(){return this.flagManager?this.flagManager.getAllFlags():{}}async waitForFlags(){this.flagManager&&await this.flagManager.waitForInit();}areFlagsReady(){return this.flagManager?.isInitialized()??false}getVariant(e,t=null){return this.flagManager?this.flagManager.getVariant(e,t):(this.log("Flags not enabled. Set enableFlags: true in init()"),t)}getVariantPayload(e,t=null){return this.flagManager?this.flagManager.getVariantPayload(e,t):t}async refreshFlags(){this.flagManager&&await this.flagManager.refresh();}track(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.track(e,t);}trackPageView(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.trackPageView(e,t);}identify(e,t){this.replayManager&&this.replayManager.setUser({id:e});for(let n of this.identifyHooks)try{n(e);}catch(i){this.log("identify hook failed:",i);}if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.identify(e,t);}registerIdentifyHook(e){return this.identifyHooks.push(e),()=>{let t=this.identifyHooks.indexOf(e);t>=0&&this.identifyHooks.splice(t,1);}}group(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.group(e,t);}resetAnalytics(){this.analyticsManager&&this.analyticsManager.reset();}async getVisitorId(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getVisitorId()}async getDeviceSignals(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getDeviceSignals()}async getFraudCheck(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getFraudCheck()}startReplay(){return this.replayManager?this.replayManager.start():(this.log("Replay not enabled. Set replay.enabled: true in init()"),false)}stopReplay(){this.replayManager&&this.replayManager.stop();}isReplayRecording(){return this.replayManager?.isRecording()??false}getReplaySessionId(){return this.replayManager?.getSessionId()??null}startTransaction(e,t){return this.performanceManager?this.performanceManager.startTransaction(e,t):(this.log("Performance not enabled. Set performance.enabled: true in init()"),"")}endTransaction(e,t="ok"){this.performanceManager&&this.performanceManager.endTransaction(e,t);}startSpan(e,t,n){return this.performanceManager?this.performanceManager.startSpan(e,t,n):""}endSpan(e,t,n="ok"){this.performanceManager&&this.performanceManager.endSpan(e,t,n);}getWebVitals(){return this.performanceManager?this.performanceManager.getVitals():{}}cronCheckin(e,t){return this.cronManager?this.cronManager.checkin(e,t):(this.log("Cron monitoring not enabled. Set crons.enabled: true in init()"),Promise.resolve())}cronStart(e,t){return this.cronManager?this.cronManager.start(e,t):(this.log("Cron monitoring not enabled. Set crons.enabled: true in init()"),{ok:()=>Promise.resolve(),error:()=>Promise.resolve()})}cronWrap(e,t,n){return this.cronManager?this.cronManager.wrap(e,t,n):t()}metricIncrement(e,t,n){if(!this.metricsManager){this.log("Metrics not enabled. Set metrics.enabled: true in init()");return}this.metricsManager.increment(e,t,n);}metricGauge(e,t,n){this.metricsManager&&this.metricsManager.gauge(e,t,n);}metricHistogram(e,t,n){this.metricsManager&&this.metricsManager.histogram(e,t,n);}metricDistribution(e,t,n){this.metricsManager&&this.metricsManager.distribution(e,t,n);}async metricTime(e,t,n){return this.metricsManager?this.metricsManager.time(e,t,n):t()}metricStartTimer(e,t){return this.metricsManager?this.metricsManager.startTimer(e,t):{stop:()=>{}}}async flushMetrics(){if(this.metricsManager)return this.metricsManager.flush()}async dbTrack(e,t,n){return this.databaseTracker?this.databaseTracker.track(e,t,n):t()}dbTrackSync(e,t,n){return this.databaseTracker?this.databaseTracker.trackSync(e,t,n):t()}getDbQueryCount(){return this.databaseTracker?this.databaseTracker.getQueryCount():0}resetDbQueryCount(){this.databaseTracker&&this.databaseTracker.resetQueryCount();}getDbNPlusOnePatterns(){return this.databaseTracker?this.databaseTracker.getNPlusOnePatterns():[]}async profile(e,t,n){return this.profiler?this.profiler.profile(e,t,n):t()}startProfileSpan(e,t){return this.profiler?this.profiler.startSpan(e,t):()=>{}}getProfiles(){return this.profiler?this.profiler.getProfiles():[]}getLatestProfile(){return this.profiler?this.profiler.getLatestProfile():null}async flushProfiles(){if(this.profiler)return this.profiler.flush()}getRemoteConfig(){return this.remoteConfigManager?.getConfig()??null}isRemoteConfigFeatureEnabled(e,t=true){return this.remoteConfigManager?.isFeatureEnabled(e,t)??t}onRemoteConfigChange(e){return this.remoteConfigManager?this.remoteConfigManager.onChange(e):()=>{}}setContext(e){this.context={...this.context,...e};}setUser(e){this.context.user=e,this.replayManager&&this.replayManager.setUser(e?{id:e.id}:null);}setTags(e){this.context.tags={...this.context.tags,...e};}clearUser(){this.context.user=void 0,this.replayManager&&this.replayManager.setUser(null);}addBreadcrumb(e){this.log("Breadcrumb added:",e);}captureError(e,t){if(!this.initialized){console.warn("[SitePong] SDK not initialized. Call init() first.");return}let n=this.formatError(e,t);this.errorQueue.push(n),this.log("Captured error:",n.message),this.replayManager?.isRecording()&&this.replayManager.flushOnError().catch(i=>{this.log("Failed to flush replay on error:",i);}),this.errorQueue.length>=this.config.maxBatchSize&&this.flush();}captureMessage(e,t="info",n){if(!this.initialized){console.warn("[SitePong] SDK not initialized. Call init() first.");return}let i={message:e,type:t,timestamp:new Date().toISOString(),url:this.getUrl(),userAgent:this.getUserAgent(),environment:this.config.environment,release:this.config.release,context:{...this.context,...n},replaySessionId:this.replayManager?.isRecording()&&this.replayManager.getSessionId()||void 0};this.errorQueue.push(i),this.log("Captured message:",e),this.errorQueue.length>=this.config.maxBatchSize&&this.flush();}async flush(){if(this.errorQueue.length===0)return;if(this.disabled){this.errorQueue=[];return}let e=[...this.errorQueue];this.errorQueue=[];try{let t=await fetch(`${this.config.endpoint}/api/errors/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({errors:e})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} errors`);}catch(t){if(this.flushFailures++,this.flushFailures>=Qe){this.disabled=true,console.warn(`[SitePong] SDK disabled after ${Qe} consecutive failures. Events will no longer be sent. This may be due to CORS issues or network problems. Check that ${this.config.endpoint} is accessible and has proper CORS headers.`);return}this.errorQueue.unshift(...e),this.log(`Failed to flush errors (attempt ${this.flushFailures}/${Qe}):`,t);}}formatError(e,t){let n=e instanceof Error,i=n?e.message:String(e),o=n?e.stack:new Error(i).stack,s=n?e.name:"Error";return {message:i,stack:o,type:s,timestamp:new Date().toISOString(),url:this.getUrl(),userAgent:this.getUserAgent(),environment:this.config.environment,release:this.config.release,context:{...this.context,...t},fingerprint:this.generateFingerprint(i,o,s),replaySessionId:this.replayManager?.isRecording()&&this.replayManager.getSessionId()||void 0}}generateFingerprint(e,t,n){let i=n||"Error",o=this.normalizeMessage(e),s=t?this.extractTopFrame(t):"",a=[i,o,s].join(`
|
|
1
|
+
var SitePong=(function(exports){'use strict';function yn(){try{return typeof localStorage>"u"?null:{getItem:async r=>localStorage.getItem(r),setItem:async(r,e)=>{localStorage.setItem(r,e);},removeItem:async r=>{localStorage.removeItem(r);}}}catch{return null}}function it(){return {platform:"browser",storage:yn(),getDeviceInfo(){let e={platform:"browser"};return typeof navigator<"u"&&(e.userAgent=navigator.userAgent),typeof window<"u"&&window.screen&&(e.screenWidth=window.screen.width,e.screenHeight=window.screen.height),e},getCurrentUrl(){if(!(typeof window>"u"||!window.location))return window.location.href},getReferrer(){if(!(typeof document>"u"))return document.referrer||void 0},getUserAgent(){if(!(typeof navigator>"u"))return navigator.userAgent},onUncaughtError(e){if(typeof window>"u"||!window.addEventListener)return ()=>{};let t=n=>{e(n.error||n.message);};return window.addEventListener("error",t),()=>window.removeEventListener("error",t)},onUnhandledRejection(e){if(typeof window>"u"||!window.addEventListener)return ()=>{};let t=n=>{e(n.reason);};return window.addEventListener("unhandledrejection",t),()=>window.removeEventListener("unhandledrejection",t)},onBeforeTerminate(e){return typeof window>"u"||!window.addEventListener?()=>{}:(window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e))},onVisibilityHidden(e){if(typeof document>"u"||!document.addEventListener)return ()=>{};let t=()=>{document.visibilityState==="hidden"&&e();};return document.addEventListener("visibilitychange",t),()=>document.removeEventListener("visibilitychange",t)},sendBeacon(e,t){if(typeof navigator>"u"||typeof navigator.sendBeacon!="function")return false;try{let n=new Blob([t],{type:"application/json"});return navigator.sendBeacon(e,n)}catch{return false}}}}var C=null;function H(r){C=r;}function b(){return C}function Ee(){if(C)return C.platform;let r=globalThis;return r.navigator&&r.navigator.product==="ReactNative"?"react-native":r.process&&r.process.versions&&r.process.versions.node?"node":r.window&&r.document?"browser":"unknown"}function L(){return Ee()==="react-native"}var bn=null;function wn(){return C&&C.platform==="react-native"?C:null}function Ce(r){let e=wn();e&&e._setGetCurrentScreen(r);}function ie(){return bn}function Me(){return C?C.storage:null}var oe="sitepong_anonymous_id";function Re(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return (r==="x"?e:e&3|8).toString(16)})}var M=null;function D(){if(typeof window<"u"&&typeof localStorage<"u")try{let r=localStorage.getItem(oe);return r||(r=Re(),localStorage.setItem(oe,r)),r}catch{return M||(M=Re()),M}return M||(M=Re()),M}function ot(){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.removeItem(oe);}catch{}M=null;}function st(r){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.setItem(oe,r);}catch{M=r;}else M=r;}function at(r){let e=r.toLowerCase();return /ipad/.test(e)||/android/.test(e)&&!/mobile/.test(e)||/tablet/.test(e)?"tablet":/mobile/.test(e)||/iphone/.test(e)||/ipod/.test(e)||/android/.test(e)||/blackberry/.test(e)||/windows phone/.test(e)?"mobile":"desktop"}function ct(r){let e=r.toLowerCase();return /edg/.test(e)?"edge":/opr|opera/.test(e)?"opera":/samsungbrowser/.test(e)?"samsung":/chrome|chromium|crios/.test(e)?"chrome":/safari/.test(e)&&!/chrome/.test(e)?"safari":/firefox|fxios/.test(e)?"firefox":/msie|trident/.test(e)?"ie":"other"}function lt(r){let e=r.toLowerCase();return /iphone|ipad|ipod/.test(e)?"ios":/android/.test(e)?"android":/mac os|macos|macintosh/.test(e)?"macos":/windows/.test(e)?"windows":/linux/.test(e)?"linux":"other"}function Pe(){let r=b()?.getUserAgent()??"";return {anonymous_id:D(),device_type:r?at(r):void 0,browser:r?ct(r):void 0,os:r?lt(r):void 0,user_agent:r||void 0,timestamp:new Date}}function ut(r){let e=5381;for(let t=0;t<r.length;t++)e=(e<<5)+e^r.charCodeAt(t);return e>>>0}function Sn(r){return Math.random()*100<r.percentage}function Tn(r,e,t){let n=`${e.anonymous_id}:${t}`;return ut(n)%100<r.percentage}function se(r){let[e,t]=r.split(":").map(Number);return e*60+t}function kn(r,e){let t=e.timestamp||new Date,i=new Intl.DateTimeFormat("en-US",{timeZone:r.timezone,weekday:"short",hour:"2-digit",minute:"2-digit",hour12:false}).formatToParts(t),o=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"].indexOf(i.find(u=>u.type==="weekday")?.value||""),s=parseInt(i.find(u=>u.type==="hour")?.value||"0",10),a=parseInt(i.find(u=>u.type==="minute")?.value||"0",10),c=s*60+a;if(r.days_of_week&&r.days_of_week.length>0&&!r.days_of_week.includes(o))return false;if(r.start_time&&r.end_time){let u=se(r.start_time),p=se(r.end_time);if(u>p){if(c<u&&c>=p)return false}else if(c<u||c>=p)return false}else if(r.start_time){let u=se(r.start_time);if(c<u)return false}else if(r.end_time){let u=se(r.end_time);if(c>=u)return false}return true}function xn(r,e){return e.device_type?r.types.includes(e.device_type):false}function En(r,e){return e.browser?r.browsers.includes(e.browser):false}function Cn(r,e){return e.os?r.operating_systems.includes(e.os):false}function Mn(r,e,t,n){switch(r){case "percentage_rollout":return Sn(e);case "userbase_percentage":return Tn(e,t,n);case "time_based":return kn(e,t);case "device_type":return xn(e,t);case "browser":return En(e,t);case "os":return Cn(e,t);default:return false}}function ae(r,e){if(r.override==="force_on")return true;if(r.override==="force_off"||!r.enabled)return false;if(!r.rules||r.rules.length===0)return true;for(let t of r.rules)if(!Mn(t.rule_type,t.config,e,r.key))return false;return true}function dt(r,e){if(!ae(r,e)||r.flag_type!=="multivariate"||!r.variants||r.variants.length===0)return null;let t=`${e.anonymous_id}:${r.key}:variant`,n=ut(t),i=r.variants.reduce((a,c)=>a+c.weight,0),o=n%i,s=0;for(let a of r.variants)if(s+=a.weight,o<s)return a.key;return r.variants[0].key}function pt(r,e){return r.variant_payloads&&r.variant_payloads[e]!==void 0?r.variant_payloads[e]:r.variants?.find(n=>n.key===e)?.payload||null}var Rn="https://api.sitepong.com",_=class{constructor(e){this.flags=new Map;this.evaluatedFlags=new Map;this.evaluatedVariants=new Map;this.context=null;this.initialized=false;this.initPromise=null;this.config={endpoint:Rn,debug:false,...e};}async init(){if(!this.initialized){if(this.initPromise)return this.initPromise;this.initPromise=this.fetchAndEvaluateFlags();try{await this.initPromise,this.initialized=!0;}catch(e){this.log("Failed to initialize flags:",e),this.initialized=true;}finally{this.initPromise=null;}}}async fetchAndEvaluateFlags(){try{let e=await fetch(`${this.config.endpoint}/api/sdk/flags`,{method:"GET",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey}});if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);let t=await e.json();this.log("Fetched flags:",t.flags.length),this.context=Pe(),this.log("Evaluation context:",this.context),this.flags.clear(),this.evaluatedFlags.clear(),this.evaluatedVariants.clear();for(let n of t.flags){this.flags.set(n.key,n);let i=ae(n,this.context);if(this.evaluatedFlags.set(n.key,i),n.flag_type==="multivariate"&&n.variants){let o=dt(n,this.context);this.evaluatedVariants.set(n.key,o),this.log(`Flag "${n.key}": ${i}, variant: ${o}`);}else this.log(`Flag "${n.key}": ${i}`);}}catch(e){throw this.log("Error fetching flags:",e),e}}getFlag(e,t=false){if(!this.initialized)return this.log(`Flag "${e}" requested before init, returning default:`,t),t;let n=this.evaluatedFlags.get(e);return n===void 0?(this.log(`Flag "${e}" not found, returning default:`,t),t):n}getVariant(e,t=null){if(!this.initialized)return this.log(`Variant "${e}" requested before init, returning default:`,t),t;let n=this.evaluatedVariants.get(e);return n===void 0?(this.log(`Variant "${e}" not found, returning default:`,t),t):n}getVariantPayload(e,t=null){let n=this.getVariant(e);if(!n)return t;let i=this.flags.get(e);return i?pt(i,n)??t:t}getAllFlags(){let e={};for(let[t,n]of this.evaluatedFlags)e[t]=n;return e}hasFlag(e){return this.flags.has(e)}isInitialized(){return this.initialized}async waitForInit(){this.initialized||await this.init();}async refresh(){this.initialized=false,await this.init();}getContext(){return this.context}log(...e){this.config.debug&&console.log("[SitePong Flags]",...e);}};var Ie="sitepong_session_id",ce="sitepong_session_ts";var V=null,z=null;function gt(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return (r==="x"?e:e&3|8).toString(16)})}function ht(r){return Date.now()-r>18e5}function Le(){if(typeof window<"u"&&typeof sessionStorage<"u")try{let r=sessionStorage.getItem(Ie),e=sessionStorage.getItem(ce);if(r&&e&&!ht(parseInt(e,10)))return sessionStorage.setItem(ce,String(Date.now())),r;let t=gt();return sessionStorage.setItem(Ie,t),sessionStorage.setItem(ce,String(Date.now())),t}catch{return ft()}return ft()}function ft(){return V&&z&&!ht(z)?(z=Date.now(),V):(V=gt(),z=Date.now(),V)}function De(){if(typeof window<"u"&&typeof sessionStorage<"u")try{sessionStorage.removeItem(Ie),sessionStorage.removeItem(ce);}catch{}V=null,z=null;}var mt="sp_utm",Pn=[["source","utm_source"],["medium","utm_medium"],["campaign","utm_campaign"],["term","utm_term"],["content","utm_content"]];function In(){if(typeof window>"u"||!window.location||!window.location.search)return null;let r;try{r=new URLSearchParams(window.location.search);}catch{return null}let e={},t=false;for(let[n,i]of Pn){let o=r.get(i);o&&(e[n]=o,t=true);}return t?e:null}function Ln(){if(typeof sessionStorage>"u")return null;try{let r=sessionStorage.getItem(mt);if(!r)return null;let e=JSON.parse(r);return e&&typeof e=="object"?e:null}catch{return null}}function Dn(r){if(!(typeof sessionStorage>"u"))try{sessionStorage.setItem(mt,JSON.stringify(r));}catch{}}function vt(){let r=Ln();if(r)return r;let e=In();return e&&Dn(e),e}var yt=["[data-sp-no-capture]",".sp-no-capture"];var $=class{constructor(e,t){this.clickHandler=null;this.submitHandler=null;this.active=false;this.config={clicks:true,forms:true,pageviews:true,blockSelectors:yt,maxTextLength:255,debug:false,...e},this.callback=t;}start(){this.active||typeof document>"u"||typeof document.addEventListener!="function"||(this.active=true,this.config.clicks&&this.setupClickCapture(),this.config.forms&&this.setupFormCapture(),this.log("Autocapture started"));}stop(){this.active&&(this.active=false,this.clickHandler&&(document.removeEventListener("click",this.clickHandler,true),this.clickHandler=null),this.submitHandler&&(document.removeEventListener("submit",this.submitHandler,true),this.submitHandler=null),this.log("Autocapture stopped"));}setupClickCapture(){this.clickHandler=e=>{let t=e.target;if(!t||!this.shouldCapture(t))return;let n=this.getElementProperties(t);n.$event_type="click",n.$x=e.clientX,n.$y=e.clientY,this.callback({type:"click",timestamp:new Date().toISOString(),properties:n});},document.addEventListener("click",this.clickHandler,true);}setupFormCapture(){this.submitHandler=e=>{let t=e.target;if(!t||!this.shouldCapture(t))return;let n={$event_type:"form_submit",$form_action:t.action||void 0,$form_method:t.method||"get",$form_name:t.name||t.id||void 0,$field_names:this.getFormFieldNames(t),$field_count:t.elements.length},i=this.getElementProperties(t);Object.assign(n,i),this.callback({type:"form_submit",timestamp:new Date().toISOString(),properties:n});},document.addEventListener("submit",this.submitHandler,true);}shouldCapture(e){let t=this.config.blockSelectors||yt;for(let n of t)if(e.matches(n)||e.closest(n))return false;return !(this.config.allowSelectors&&this.config.allowSelectors.length>0&&!this.config.allowSelectors.some(i=>e.matches(i)||e.closest(i)!==null)||e.offsetParent===null&&e.tagName!=="BODY")}getElementProperties(e){let t={};t.$tag_name=e.tagName.toLowerCase(),t.$el_id=e.id||void 0,e.classList.length>0&&(t.$el_classes=Array.from(e.classList).slice(0,5));let n=this.getElementText(e);n&&(t.$el_text=n),e instanceof HTMLAnchorElement&&(t.$href=e.href||void 0,t.$target=e.target||void 0),(e instanceof HTMLInputElement||e instanceof HTMLButtonElement)&&(t.$el_type=e.type||void 0,t.$el_name=e.name||void 0);let i=e.getAttribute("aria-label");i&&(t.$aria_label=this.truncate(i));let o=e.getAttribute("role");return o&&(t.$el_role=o),t.$selector=this.getSelector(e),typeof window<"u"&&window.location&&(t.$current_url=window.location.href,t.$pathname=window.location.pathname),t}getElementText(e){if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)return;let t="";if(e instanceof HTMLButtonElement||e instanceof HTMLAnchorElement)t=e.innerText||e.textContent||"";else for(let n of Array.from(e.childNodes))n.nodeType===Node.TEXT_NODE&&(t+=n.textContent||"");return t=t.trim().replace(/\s+/g," "),t?this.truncate(t):void 0}getFormFieldNames(e){let t=[];for(let n of Array.from(e.elements)){let i=n;i.name&&i.type!=="password"&&i.type!=="hidden"&&t.push(i.name);}return t.slice(0,20)}getSelector(e){let t=[],n=e,i=0;for(;n&&n!==document.body&&i<5;){let o=n.tagName.toLowerCase();if(n.id){o=`#${n.id}`,t.unshift(o);break}n.classList.length>0&&(o+=`.${Array.from(n.classList).slice(0,2).join(".")}`);let s=n.parentElement;if(s){let a=Array.from(s.children).filter(c=>c.tagName===n.tagName);if(a.length>1){let c=a.indexOf(n)+1;o+=`:nth-of-type(${c})`;}}t.unshift(o),n=n.parentElement,i++;}return t.join(" > ")}truncate(e){let t=this.config.maxTextLength||255;return e.length>t?e.slice(0,t)+"...":e}log(...e){this.config.debug&&console.log("[SitePong Autocapture]",...e);}};var _n="https://ingest.sitepong.com",Fn=20,An=1e4,_e=3,F=class{constructor(e){this.eventQueue=[];this.flushTimer=null;this.flushFailures=0;this.disabled=false;this.userId=null;this.groupId=null;this.userTraits=null;this.groupTraits=null;this.lastUrl=null;this.popstateHandler=null;this.autocaptureModule=null;this.config={endpoint:_n,enabled:true,autocapturePageviews:false,maxBatchSize:Fn,flushInterval:An,debug:false,...e};}init(){this.config.enabled&&(this.startFlushTimer(),this.setupPageHideListener(),this.config.autocapturePageviews&&this.setupSPATracking(),this.setupAutocapture(),this.log("Analytics initialized"));}initHeadless(){this.config.enabled&&(this.startFlushTimer(),this.log("Analytics initialized (headless)"));}setupAutocapture(){let e=this.config.autocapture,t=this.config.autocaptureClicks,n=this.config.autocaptureForms,i=t||false,o=n||false,s,a;e===true?(i=true,o=true):e&&typeof e=="object"&&(i=e.clicks!==false,o=e.forms!==false,s=e.blockSelectors,a=e.allowSelectors,e.pageviews!==false&&!this.config.autocapturePageviews&&this.setupSPATracking()),!(!i&&!o)&&(this.autocaptureModule=new $({clicks:i,forms:o,pageviews:false,blockSelectors:s,allowSelectors:a,debug:this.config.debug},c=>{let u=c.type==="click"?"$autocapture_click":c.type==="form_submit"?"$autocapture_form_submit":"$autocapture";this.track(u,c.properties);}),this.autocaptureModule.start());}track(e,t){if(!this.config.enabled)return;let n=this.createEvent("track",{name:e,properties:t});this.enqueue(n),this.log("Track:",e,t);}trackPageView(e,t){if(!this.config.enabled)return;let n=e||(typeof window<"u"&&window.location?window.location.href:void 0),i=this.createEvent("page",{properties:{url:n,referrer:typeof document<"u"?document.referrer:void 0,title:typeof document<"u"?document.title:void 0,...t}});this.enqueue(i),this.log("Page view:",n);}identify(e,t){if(!this.config.enabled)return;this.userId=e,t&&(this.userTraits={...this.userTraits,...t});let n=this.createEvent("identify",{traits:this.userTraits||void 0});this.enqueue(n),this.log("Identify:",e,t);}group(e,t){if(!this.config.enabled)return;this.groupId=e,t&&(this.groupTraits={...this.groupTraits,...t});let n=this.createEvent("group",{traits:this.groupTraits||void 0});this.enqueue(n),this.log("Group:",e,t);}reset(){this.userId=null,this.groupId=null,this.userTraits=null,this.groupTraits=null,De(),this.log("Analytics state reset");}async flush(){if(this.eventQueue.length===0)return;if(this.disabled){this.eventQueue=[];return}let e=[...this.eventQueue];this.eventQueue=[];let t=this.config.eventsEndpoint||`${this.config.endpoint}/api/events`;try{let n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({events:e})});if(!n.ok)throw new Error(`HTTP ${n.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} events`);}catch(n){if(this.flushFailures++,this.flushFailures>=_e){this.disabled=true,console.warn(`[SitePong Analytics] Disabled after ${_e} consecutive failures. Check that ${t} is accessible and has proper CORS headers.`);return}this.eventQueue.unshift(...e),this.log(`Failed to flush events (attempt ${this.flushFailures}/${_e}):`,n);}}destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.popstateHandler&&typeof window<"u"&&(window.removeEventListener("popstate",this.popstateHandler),this.popstateHandler=null),this.autocaptureModule&&(this.autocaptureModule.stop(),this.autocaptureModule=null),this.flushWithBeacon();}createEvent(e,t){return {type:e,name:t.name,properties:t.properties,userId:this.userId||void 0,anonymousId:D(),deviceId:void 0,groupId:this.groupId||void 0,traits:t.traits,sessionId:Le(),timestamp:new Date().toISOString(),url:typeof window<"u"&&window.location?window.location.href:void 0,referrer:typeof document<"u"&&typeof document.referrer=="string"?document.referrer:void 0,userAgent:typeof navigator<"u"?navigator.userAgent:void 0,utm:vt()||void 0,appVersion:this.config.appVersion||void 0}}enqueue(e){this.eventQueue.push(e),this.eventQueue.length>=this.config.maxBatchSize&&this.flush();}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval);}setupPageHideListener(){typeof window>"u"||L()||typeof window.addEventListener!="function"||window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flushWithBeacon();});}flushWithBeacon(){if(this.eventQueue.length===0||L()||typeof navigator?.sendBeacon!="function")return;let e=[...this.eventQueue];this.eventQueue=[];let t=this.config.eventsEndpoint||`${this.config.endpoint}/api/events`,n=new Blob([JSON.stringify({events:e,apiKey:this.config.apiKey})],{type:"application/json"});navigator.sendBeacon(t,n),this.log(`Flushed ${e.length} events via beacon`);}setupSPATracking(){if(typeof window>"u"||L()||!window.location||typeof window.addEventListener!="function")return;this.lastUrl=window.location.href,this.trackPageView(),this.popstateHandler=()=>{if(!window.location)return;let n=window.location.href;n!==this.lastUrl&&(this.lastUrl=n,this.trackPageView(n));},window.addEventListener("popstate",this.popstateHandler);let e=history.pushState.bind(history),t=history.replaceState.bind(history);history.pushState=(...n)=>{e(...n),this.handleUrlChange();},history.replaceState=(...n)=>{t(...n),this.handleUrlChange();};}handleUrlChange(){if(typeof window>"u"||!window.location)return;let e=window.location.href;e!==this.lastUrl&&(this.lastUrl=e,this.trackPageView(e));}log(...e){this.config.debug&&console.log("[SitePong Analytics]",...e);}};var K=class{constructor(e){this.apiKey=e.apiKey,this.endpoint=e.endpoint,this.debug=e.debug||false;}async checkin(e,t={}){try{let n=await fetch(`${this.endpoint}/api/sdk/crons`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify({slug:e,status:t.status||"ok",duration_ms:t.duration_ms,message:t.message,environment:t.environment})});if(!n.ok)throw new Error(`HTTP ${n.status}`);this.log(`Check-in sent for "${e}" (${t.status||"ok"})`);}catch(n){this.log("Failed to send check-in:",n);}}start(e,t){let n=Date.now();return this.checkin(e,{status:"in_progress",environment:t}),{ok:async i=>{let o=Date.now()-n;await this.checkin(e,{status:"ok",duration_ms:o,message:i,environment:t});},error:async i=>{let o=Date.now()-n;await this.checkin(e,{status:"error",duration_ms:o,message:i,environment:t});}}}wrap(e,t,n){let i=this.start(e,n);return t().then(async o=>(await i.ok(),o),async o=>{throw await i.error(o?.message||String(o)),o})}log(...e){this.debug&&console.log("[SitePong:Cron]",...e);}};var q=class{constructor(e){this.queue=[];this.flushTimer=null;this.apiKey=e.apiKey,this.endpoint=e.endpoint,this.debug=e.debug||false,this.flushInterval=e.flushInterval||1e4,this.maxBatchSize=e.maxBatchSize||100,this.startFlushTimer();}increment(e,t=1,n){this.enqueue(e,t,"counter",n);}decrement(e,t=1,n){this.enqueue(e,-t,"counter",n);}gauge(e,t,n){this.enqueue(e,t,"gauge",n);}histogram(e,t,n){this.enqueue(e,t,"histogram",n);}distribution(e,t,n){this.enqueue(e,t,"distribution",n);}async time(e,t,n){let i=Date.now();try{let o=await t();return this.distribution(e,Date.now()-i,{...n,unit:n?.unit||"ms"}),o}catch(o){throw this.distribution(e,Date.now()-i,{...n,unit:n?.unit||"ms",tags:{...n?.tags,error:"true"}}),o}}startTimer(e,t){let n=Date.now();return {stop:()=>{this.distribution(e,Date.now()-n,{...t,unit:t?.unit||"ms"});}}}async flush(){if(this.queue.length===0)return;let e=[...this.queue];this.queue=[];try{let t=await fetch(`${this.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify({metrics:e})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} metrics`);}catch(t){this.queue.unshift(...e),this.log("Failed to flush metrics:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}enqueue(e,t,n,i){this.queue.push({name:e,value:t,type:n,unit:i?.unit,tags:i?.tags,timestamp:i?.timestamp||new Date().toISOString()}),this.queue.length>=this.maxBatchSize&&this.flush();}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.flushInterval);let e=b();e&&e.onVisibilityHidden(()=>this.flushWithBeacon());}flushWithBeacon(){if(this.queue.length===0)return;let e=b();if(!e||!e.sendBeacon)return;let t=[...this.queue];this.queue=[];let n=JSON.stringify({metrics:t,apiKey:this.apiKey});e.sendBeacon(`${this.endpoint}/api/sdk/metrics`,n)?this.log(`Flushed ${t.length} metrics via beacon`):this.queue.unshift(...t);}log(...e){this.debug&&console.log("[SitePong:Metrics]",...e);}};var W=class{constructor(e){this.queue=[];this.flushTimer=null;this.queryCounter=0;this.nPlusOneDetector=new Map;this.config={slowQueryThreshold:1e3,maxBatchSize:50,flushInterval:1e4,redactParams:true,...e},this.startFlushTimer();}async track(e,t,n){let i=Date.now();this.queryCounter++;try{let o=await t(),s=Date.now()-i;return this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,is_slow:s>=(this.config.slowQueryThreshold||1e3)}),this.detectNPlusOne(e),o}catch(o){let s=Date.now()-i;throw this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,error:o instanceof Error?o.message:String(o)}),o}}trackSync(e,t,n){let i=Date.now();this.queryCounter++;try{let o=t(),s=Date.now()-i;return this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,is_slow:s>=(this.config.slowQueryThreshold||1e3)}),o}catch(o){let s=Date.now()-i;throw this.recordQuery({query:this.config.redactParams?this.redactQuery(e):e,duration_ms:s,timestamp:new Date().toISOString(),source:n,error:o instanceof Error?o.message:String(o)}),o}}getQueryCount(){return this.queryCounter}resetQueryCount(){this.queryCounter=0,this.nPlusOneDetector.clear();}getNPlusOnePatterns(){let e=[];for(let[t,{count:n}]of this.nPlusOneDetector.entries())n>=5&&e.push({query:t,count:n});return e}async flush(){if(this.queue.length===0)return;let e=[...this.queue];this.queue=[];try{let t=await fetch(`${this.config.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({metrics:e.map(n=>({name:"db.query",value:n.duration_ms,type:"distribution",unit:"ms",tags:{query:n.query.substring(0,200),source:n.source||"unknown",is_slow:String(n.is_slow||!1),...n.error?{error:"true"}:{}},timestamp:n.timestamp}))})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} query events`);}catch(t){this.queue.unshift(...e),this.log("Failed to flush query events:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}recordQuery(e){this.queue.push(e),this.queue.length>=(this.config.maxBatchSize||50)&&this.flush(),e.is_slow&&this.log(`Slow query (${e.duration_ms}ms):`,e.query.substring(0,100));}detectNPlusOne(e){let t=this.normalizeQuery(e),n=Date.now(),i=this.nPlusOneDetector.get(t);if(i?n-i.since<1e3?(i.count++,i.count===5&&this.log(`N+1 query detected! Pattern repeated ${i.count} times:`,t.substring(0,100))):this.nPlusOneDetector.set(t,{count:1,since:n}):this.nPlusOneDetector.set(t,{count:1,since:n}),this.nPlusOneDetector.size>100){let o=[...this.nPlusOneDetector.entries()];o.sort((s,a)=>s[1].since-a[1].since);for(let s=0;s<50;s++)this.nPlusOneDetector.delete(o[s][0]);}}normalizeQuery(e){return e.replace(/\s+/g," ").replace(/'[^']*'/g,"?").replace(/\b\d+\b/g,"?").trim().substring(0,300)}redactQuery(e){return e.replace(/'[^']*'/g,"'***'").replace(/\b\d{4,}\b/g,"***")}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval||1e4);}log(...e){this.config.debug&&console.log("[SitePong:DB]",...e);}};var j=class{constructor(e){this.profiles=[];this.activeProfile=null;this.frameStack=[];this.flushTimer=null;this.config={sampleRate:.1,maxDuration:3e4,flushInterval:3e4,...e},this.startFlushTimer();}async profile(e,t,n){if(Math.random()>(this.config.sampleRate||.1))return t();let i=this.generateId(),o=performance.now();this.activeProfile={id:i,name:e,startTime:o,duration_ms:0,frames:[],metadata:n},this.frameStack=[];let s={name:e,start_ms:0,duration_ms:0,children:[],metadata:n};this.frameStack.push(s);try{let a=await t();return s.duration_ms=performance.now()-o,this.activeProfile.duration_ms=s.duration_ms,this.activeProfile.frames=[s],s.duration_ms<=(this.config.maxDuration||3e4)&&this.profiles.push(this.activeProfile),this.activeProfile=null,this.frameStack=[],a}catch(a){throw s.duration_ms=performance.now()-o,s.metadata={...s.metadata,error:true},this.activeProfile&&(this.activeProfile.duration_ms=s.duration_ms,this.activeProfile.frames=[s],this.profiles.push(this.activeProfile)),this.activeProfile=null,this.frameStack=[],a}}startSpan(e,t){if(!this.activeProfile)return ()=>{};let n=performance.now()-this.activeProfile.startTime,i={name:e,start_ms:n,duration_ms:0,children:[],metadata:t},o=this.frameStack[this.frameStack.length-1];return o&&o.children.push(i),this.frameStack.push(i),()=>{i.duration_ms=performance.now()-this.activeProfile.startTime-i.start_ms,this.frameStack.pop();}}getProfiles(){return [...this.profiles]}getLatestProfile(){return this.profiles.length>0?this.profiles[this.profiles.length-1]:null}async flush(){if(this.profiles.length===0)return;let e=[...this.profiles];this.profiles=[];try{let t=await fetch(`${this.config.endpoint}/api/sdk/metrics`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({metrics:e.map(n=>({name:`profile.${n.name}`,value:n.duration_ms,type:"distribution",unit:"ms",tags:{profile_id:n.id,frame_count:String(bt(n.frames)),...n.metadata||{}},timestamp:new Date(Date.now()-n.duration_ms).toISOString()}))})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.log(`Flushed ${e.length} profiles`);}catch(t){this.profiles.unshift(...e),this.log("Failed to flush profiles:",t);}}async destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush();}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval||3e4);}generateId(){return `prof_${Date.now().toString(36)}_${Math.random().toString(36).substring(2,8)}`}log(...e){this.config.debug&&console.log("[SitePong:Profiler]",...e);}};function bt(r){let e=r.length;for(let t of r)e+=bt(t.children);return e}var Fe={features:{},sampling:{errors:1,analytics:1,replay:1,performance:1},transport:{flushInterval:1e4,maxBatchSize:20,maxRetries:3},autocapture:{clicks:true,forms:true,pageviews:true,appState:true,screenViews:true},ttl:300};var wt="sitepong_remote_config",St="sitepong_remote_config_ts",A=class{constructor(e){this.listeners=[];this.refreshTimer=null;this.initialized=false;this.options=e,this.config={...Fe};}async init(){await this.loadFromCache(),this.initialized=true,this.fetchAndApply().catch(e=>{this.log("Failed to fetch remote config:",e);});}getConfig(){return this.config}isFeatureEnabled(e,t=true){return this.config.features[e]??t}onChange(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e);}}isInitialized(){return this.initialized}destroy(){this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null),this.listeners=[];}async loadFromCache(){let e=this.options.storage;if(e)try{let t=await e.getItem(wt),n=await e.getItem(St);if(t&&n){let i=Date.now()-parseInt(n,10),o=this.config.ttl*1e3;if(i<o){let s=JSON.parse(t);this.config=s,this.log("Loaded config from cache (age:",Math.round(i/1e3),"s)");}}}catch{this.log("Failed to load cached config");}}async fetchAndApply(){try{let e=Ee(),t=new URLSearchParams({platform:e,...this.options.sdkVersion?{sdkVersion:this.options.sdkVersion}:{}}),n=await fetch(`${this.options.endpoint}/api/sdk/config?${t}`,{method:"GET",headers:{"X-API-Key":this.options.apiKey}});if(!n.ok)throw new Error(`HTTP ${n.status}`);let i=await n.json();this.config=i.config;for(let o of this.listeners)try{o(this.config);}catch{}await this.saveToCache(),this.scheduleRefresh(),i.config.minSdkVersion&&this.options.sdkVersion&&this.compareVersions(this.options.sdkVersion,i.config.minSdkVersion)<0&&console.warn(`[SitePong] SDK version ${this.options.sdkVersion} is outdated. Minimum recommended: ${i.config.minSdkVersion}. Please update.`),this.log("Remote config fetched successfully");}catch(e){throw this.scheduleRefresh(),e}}async saveToCache(){let e=this.options.storage;if(e)try{await e.setItem(wt,JSON.stringify(this.config)),await e.setItem(St,String(Date.now()));}catch{this.log("Failed to cache remote config");}}scheduleRefresh(){this.refreshTimer&&clearTimeout(this.refreshTimer);let e=this.config.ttl*1e3;this.refreshTimer=setTimeout(()=>{this.fetchAndApply().catch(t=>{this.log("Refresh failed:",t);});},e);}compareVersions(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let o=0;o<3;o++){let s=n[o]||0,a=i[o]||0;if(s>a)return 1;if(s<a)return -1}return 0}log(...e){this.options.debug&&console.log("[SitePong RemoteConfig]",...e);}};var Oe;var Pt=-1,O=function(r){addEventListener("pageshow",(function(e){e.persisted&&(Pt=e.timeStamp,r(e));}),true);},Ue=function(){var r=self.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];if(r&&r.responseStart>0&&r.responseStart<performance.now())return r},pe=function(){var r=Ue();return r&&r.activationStart||0},k=function(r,e){var t=Ue(),n="navigate";return Pt>=0?n="back-forward-cache":t&&(document.prerendering||pe()>0?n="prerender":document.wasDiscarded?n="restore":t.type&&(n=t.type.replace(/_/g,"-"))),{name:r,value:e===void 0?-1:e,rating:"good",delta:0,entries:[],id:"v4-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:n}},G=function(r,e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(r)){var n=new PerformanceObserver((function(i){Promise.resolve().then((function(){e(i.getEntries());}));}));return n.observe(Object.assign({type:r,buffered:!0},t||{})),n}}catch{}},x=function(r,e,t,n){var i,o;return function(s){e.value>=0&&(s||n)&&((o=e.value-(i||0))||i===void 0)&&(i=e.value,e.delta=o,e.rating=(function(a,c){return a>c[1]?"poor":a>c[0]?"needs-improvement":"good"})(e.value,t),r(e));}},Be=function(r){requestAnimationFrame((function(){return requestAnimationFrame((function(){return r()}))}));},fe=function(r){document.addEventListener("visibilitychange",(function(){document.visibilityState==="hidden"&&r();}));},He=function(r){var e=false;return function(){e||(r(),e=true);}},N=-1,Tt=function(){return document.visibilityState!=="hidden"||document.prerendering?1/0:0},de=function(r){document.visibilityState==="hidden"&&N>-1&&(N=r.type==="visibilitychange"?r.timeStamp:0,Nn());},kt=function(){addEventListener("visibilitychange",de,true),addEventListener("prerenderingchange",de,true);},Nn=function(){removeEventListener("visibilitychange",de,true),removeEventListener("prerenderingchange",de,true);},It=function(){return N<0&&(N=Tt(),kt(),O((function(){setTimeout((function(){N=Tt(),kt();}),0);}))),{get firstHiddenTime(){return N}}},ge=function(r){document.prerendering?addEventListener("prerenderingchange",(function(){return r()}),true):r();},xt=[1800,3e3],Ve=function(r,e){e=e||{},ge((function(){var t,n=It(),i=k("FCP"),o=G("paint",(function(s){s.forEach((function(a){a.name==="first-contentful-paint"&&(o.disconnect(),a.startTime<n.firstHiddenTime&&(i.value=Math.max(a.startTime-pe(),0),i.entries.push(a),t(true)));}));}));o&&(t=x(r,i,xt,e.reportAllChanges),O((function(s){i=k("FCP"),t=x(r,i,xt,e.reportAllChanges),Be((function(){i.value=performance.now()-s.timeStamp,t(true);}));})));}));},Et=[.1,.25],Lt=function(r,e){e=e||{},Ve(He((function(){var t,n=k("CLS",0),i=0,o=[],s=function(c){c.forEach((function(u){if(!u.hadRecentInput){var p=o[0],g=o[o.length-1];i&&u.startTime-g.startTime<1e3&&u.startTime-p.startTime<5e3?(i+=u.value,o.push(u)):(i=u.value,o=[u]);}})),i>n.value&&(n.value=i,n.entries=o,t());},a=G("layout-shift",s);a&&(t=x(r,n,Et,e.reportAllChanges),fe((function(){s(a.takeRecords()),t(true);})),O((function(){i=0,n=k("CLS",0),t=x(r,n,Et,e.reportAllChanges),Be((function(){return t()}));})),setTimeout(t,0));})));},Dt=0,Ae=1/0,le=0,On=function(r){r.forEach((function(e){e.interactionId&&(Ae=Math.min(Ae,e.interactionId),le=Math.max(le,e.interactionId),Dt=le?(le-Ae)/7+1:0);}));},_t=function(){return Oe?Dt:performance.interactionCount||0},Un=function(){"interactionCount"in performance||Oe||(Oe=G("event",On,{type:"event",buffered:true,durationThreshold:0}));},T=[],ue=new Map,Ft=0,Bn=function(){var r=Math.min(T.length-1,Math.floor((_t()-Ft)/50));return T[r]},Hn=[],Vn=function(r){if(Hn.forEach((function(i){return i(r)})),r.interactionId||r.entryType==="first-input"){var e=T[T.length-1],t=ue.get(r.interactionId);if(t||T.length<10||r.duration>e.latency){if(t)r.duration>t.latency?(t.entries=[r],t.latency=r.duration):r.duration===t.latency&&r.startTime===t.entries[0].startTime&&t.entries.push(r);else {var n={id:r.interactionId,latency:r.duration,entries:[r]};ue.set(n.id,n),T.push(n);}T.sort((function(i,o){return o.latency-i.latency})),T.length>10&&T.splice(10).forEach((function(i){return ue.delete(i.id)}));}}},At=function(r){var e=self.requestIdleCallback||self.setTimeout,t=-1;return r=He(r),document.visibilityState==="hidden"?r():(t=e(r),fe(r)),t},Ct=[200,500],Nt=function(r,e){"PerformanceEventTiming"in self&&"interactionId"in PerformanceEventTiming.prototype&&(e=e||{},ge((function(){var t;Un();var n,i=k("INP"),o=function(a){At((function(){a.forEach(Vn);var c=Bn();c&&c.latency!==i.value&&(i.value=c.latency,i.entries=c.entries,n());}));},s=G("event",o,{durationThreshold:(t=e.durationThreshold)!==null&&t!==void 0?t:40});n=x(r,i,Ct,e.reportAllChanges),s&&(s.observe({type:"first-input",buffered:true}),fe((function(){o(s.takeRecords()),n(true);})),O((function(){Ft=_t(),T.length=0,ue.clear(),i=k("INP"),n=x(r,i,Ct,e.reportAllChanges);})));})));},Mt=[2500,4e3],Ne={},Ot=function(r,e){e=e||{},ge((function(){var t,n=It(),i=k("LCP"),o=function(c){e.reportAllChanges||(c=c.slice(-1)),c.forEach((function(u){u.startTime<n.firstHiddenTime&&(i.value=Math.max(u.startTime-pe(),0),i.entries=[u],t());}));},s=G("largest-contentful-paint",o);if(s){t=x(r,i,Mt,e.reportAllChanges);var a=He((function(){Ne[i.id]||(o(s.takeRecords()),s.disconnect(),Ne[i.id]=true,t(true));}));["keydown","click"].forEach((function(c){addEventListener(c,(function(){return At(a)}),{once:true,capture:true});})),fe(a),O((function(c){i=k("LCP"),t=x(r,i,Mt,e.reportAllChanges),Be((function(){i.value=performance.now()-c.timeStamp,Ne[i.id]=true,t(true);}));}));}}));},Rt=[800,1800],zn=function r(e){document.prerendering?ge((function(){return r(e)})):document.readyState!=="complete"?addEventListener("load",(function(){return r(e)}),true):setTimeout(e,0);},Ut=function(r,e){e=e||{};var t=k("TTFB"),n=x(r,t,Rt,e.reportAllChanges);zn((function(){var i=Ue();i&&(t.value=Math.max(i.responseStart-pe(),0),t.entries=[i],n(true),O((function(){t=k("TTFB",0),(n=x(r,t,Rt,e.reportAllChanges))(true);})));}));};var $n="https://ingest.sitepong.com",Kn=1e4,ze=3,qn=200,Bt=200,Ht=3e4;function Wn(r){let e=[],t=document.getElementsByTagName("*"),n=/url\(("[^"]*"|'[^']*'|[^)]*)\)/i;for(let i=0;i<t.length;i++){let o=t[i],s="";if(o.tagName==="IMG"&&(s=o.currentSrc||o.src),!s){let h=getComputedStyle(o).getPropertyValue("background-image");if(h){let m=n.exec(h);m!==null&&(s=m[1],(s.startsWith('"')||s.startsWith("'"))&&(s=s.substr(1,s.length-2)));}}if(!s)continue;let a=s.substr(0,10)==="data:image"?0:r[s];if(a===void 0)continue;let c=o.getBoundingClientRect(),u=Math.max(c.top,0),p=Math.max(c.left,0),g=Math.min(c.bottom,window.innerHeight||document.documentElement&&document.documentElement.clientHeight||0),d=Math.min(c.right,window.innerWidth||document.documentElement&&document.documentElement.clientWidth||0);if(g<=u||d<=p)continue;let f=(g-u)*(d-p);e.push({time:a,area:f});}return e}function jn(r,e){let t=Math.max(document.documentElement&&document.documentElement.clientWidth||0,window.innerWidth||0)*Math.max(document.documentElement&&document.documentElement.clientHeight||0,window.innerHeight||0)/10,n=t*r;for(let i=0;i<e.length;i++){let{time:o,area:s}=e[i];t+=s,n+=s*(o>r?o:r);}return t===0?0:n/t}var X=class{constructor(e){this.metrics=[];this.flushTimer=null;this.flushFailures=0;this.disabled=false;this.vitals={};this.activeTransactions=new Map;this.resourceObserver=null;this.resourceTimeMap={};this.resourceCount=0;this.pageLoadTimer=null;this.pageRenderTimer=null;this.config={endpoint:$n,enabled:true,webVitals:true,navigationTiming:true,resourceTiming:true,capturePageLoadTimings:true,capturePageRenderTimings:true,excludedResourceUrls:[],flushInterval:Kn,sampleRate:1,debug:false,...e},this.sampled=Math.random()<=this.config.sampleRate;}init(){!this.config.enabled||!this.sampled||typeof window>"u"||typeof window.addEventListener!="function"||(this.config.webVitals!==false&&this.initWebVitals(),this.config.resourceTiming!==false&&this.initResourceTiming(),this.config.capturePageLoadTimings!==false&&this.initPageLoadTiming(),this.config.capturePageRenderTimings!==false&&this.initPageRenderTiming(),this.startFlushTimer(),this.log("Performance monitoring initialized"));}initWebVitals(){Lt(e=>{this.vitals.cls=e.value,this.reportVital("CLS",e.value,"score");}),Nt(e=>{this.vitals.inp=e.value,this.reportVital("INP",e.value);}),Ot(e=>{this.vitals.lcp=e.value,this.reportVital("LCP",e.value);}),Ut(e=>{this.vitals.ttfb=e.value,this.reportVital("TTFB",e.value);}),Ve(e=>{this.vitals.fcp=e.value,this.reportVital("FCP",e.value);});}initResourceTiming(){if(!(typeof PerformanceObserver>"u"))try{this.resourceObserver=new PerformanceObserver(e=>{for(let t of e.getEntries())this.processResourceEntry(t);}),this.resourceObserver.observe({type:"resource",buffered:!0});}catch{this.log("PerformanceObserver for resource timing not supported");}}isServiceURL(e){let t=this.config.performanceEndpoint||this.config.endpoint;return e.startsWith(t)}processResourceEntry(e){if(e.duration<0||!e.name.startsWith("http")||this.isServiceURL(e.name))return;this.resourceTimeMap!==null&&(this.resourceTimeMap[e.name]=e.startTime+e.duration);for(let c of this.config.excludedResourceUrls)if(e.name.startsWith(c))return;if(this.resourceCount>=qn)return;this.resourceCount++;let t=0;e.connectEnd&&e.connectEnd>e.domainLookupEnd?t=Math.max(0,e.requestStart-e.connectEnd):t=Math.max(0,e.requestStart-e.domainLookupEnd);let n=e.responseStatus&&e.responseStatus===304||e.deliveryType&&e.deliveryType==="cache"||e.transferSize===0&&e.decodedBodySize>0,i=e.responseStatus||0,o=i>=400,s={queueing:e.requestStart-e.fetchStart,dnsLookup:e.domainLookupEnd-e.domainLookupStart,initialConnection:e.connectEnd-e.connectStart,ssl:e.secureConnectionStart>0?e.connectEnd-e.secureConnectionStart:0,ttfb:e.responseStart-e.requestStart,contentDownload:e.responseEnd-e.responseStart,total:e.duration??e.responseEnd-e.startTime,stalled:t,cached:n,failed:o,responseStatus:i,headerSize:e.transferSize>e.encodedBodySize?e.transferSize-e.encodedBodySize:0,encodedBodySize:e.encodedBodySize||0,decodedBodySize:o?-111:e.decodedBodySize||0,transferSize:e.transferSize,initiatorType:e.initiatorType},a=this.config.resourceNameSanitizer?this.config.resourceNameSanitizer(e.name):e.name;this.addMetric({type:"resource",name:a,value:e.duration,unit:"ms",timestamp:new Date().toISOString(),url:typeof window<"u"&&window.location?window.location.href:void 0,data:s});}initPageLoadTiming(){if(typeof window>"u"||!window.performance)return;let e=0,t=0,n=false,i=performance.now();this.pageLoadTimer=setInterval(()=>{if(n){this.pageLoadTimer&&clearInterval(this.pageLoadTimer);return}if(e===0||t===0)for(let a of performance.getEntriesByType("paint"))a.name==="first-paint"&&(e=a.startTime),a.name==="first-contentful-paint"&&(t=a.startTime);let o=performance.getEntriesByType("navigation")[0],s=performance.now()-i>Ht;if((o&&o.loadEventEnd>0||s)&&(n=true,this.pageLoadTimer&&clearInterval(this.pageLoadTimer),o)){let a=o.startTime;this.addMetric({type:"navigation",name:"page_load",value:o.loadEventEnd-a,unit:"ms",timestamp:new Date().toISOString(),url:window.location.href,data:{requestStart:o.requestStart-a,responseStart:o.responseStart-a,responseEnd:o.responseEnd-a,domContentLoadedEventStart:o.domContentLoadedEventEnd-a,domContentLoadedEventEnd:o.domContentLoadedEventEnd-a,loadEventStart:o.loadEventStart-a,loadEventEnd:o.loadEventEnd-a,firstPaint:e,firstContentfulPaint:t,dns:o.domainLookupEnd-o.domainLookupStart,tcp:o.connectEnd-o.connectStart,ttfb:o.responseStart-o.requestStart,domComplete:o.domComplete-a,transferSize:o.transferSize,encodedBodySize:o.encodedBodySize,decodedBodySize:o.decodedBodySize}});}},Bt);}initPageRenderTiming(){if(typeof window>"u"||!window.performance)return;let e=0,t=0,n=0,i=0,o=null,s=false,a=performance.now();this.pageRenderTimer=setInterval(()=>{if(s){this.pageRenderTimer&&clearInterval(this.pageRenderTimer);return}let c=performance.now();if(e===0)for(let p of performance.getEntriesByType("paint"))p.name==="first-contentful-paint"&&(e=p.startTime);if(this.resourceTimeMap!==null){let p=Object.values(this.resourceTimeMap);p.length>0&&(t=Math.max(...p)),c-t>1e3&&(o=Wn(this.resourceTimeMap),this.resourceTimeMap=null);}i!==null&&(c-i>50&&(n=c),i=c-n>5e3?null:c);let u=c-a>Ht;if(o!==null&&i===null||u){s=true,this.pageRenderTimer&&clearInterval(this.pageRenderTimer),this.resourceTimeMap=null;let p=o===null?0:jn(e||0,o),g=performance.getEntriesByType("navigation")[0],d=g?g.domContentLoadedEventEnd-g.startTime:0,f=i===null?Math.max(n,e,d):0,h=window.location.href,m=new Date().toISOString();p>0&&this.addMetric({type:"page_render",name:"speed_index",value:Math.round(p),unit:"ms",timestamp:m,url:h}),t>0&&this.addMetric({type:"page_render",name:"visually_complete",value:Math.round(t),unit:"ms",timestamp:m,url:h}),f>0&&this.addMetric({type:"page_render",name:"tti",value:Math.round(f),unit:"ms",timestamp:m,url:h});}},Bt);}startTransaction(e,t){let n=`txn_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,6)}`,i={id:n,name:e,startTime:performance.now(),status:"running",spans:[],data:t};return this.activeTransactions.set(n,i),this.log("Transaction started:",e,n),n}endTransaction(e,t="ok"){let n=this.activeTransactions.get(e);if(!n){this.log("Transaction not found:",e);return}n.endTime=performance.now(),n.duration=n.endTime-n.startTime,n.status=t;for(let i of n.spans)i.status==="running"&&(i.endTime=n.endTime,i.duration=i.endTime-i.startTime,i.status=t);this.activeTransactions.delete(e),this.addMetric({type:"transaction",name:n.name,value:n.duration,unit:"ms",timestamp:new Date().toISOString(),url:typeof window<"u"&&window.location?window.location.href:void 0,transaction:n}),this.log("Transaction ended:",n.name,`${n.duration.toFixed(1)}ms`);}startSpan(e,t,n){let i=this.activeTransactions.get(e);if(!i)return this.log("Transaction not found for span:",e),"";let o={id:`span_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,6)}`,name:t,startTime:performance.now(),status:"running",data:n};return i.spans.push(o),o.id}endSpan(e,t,n="ok"){let i=this.activeTransactions.get(e);if(!i)return;let o=i.spans.find(s=>s.id===t);o&&(o.endTime=performance.now(),o.duration=o.endTime-o.startTime,o.status=n);}getVitals(){return {...this.vitals}}destroy(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.pageLoadTimer&&(clearInterval(this.pageLoadTimer),this.pageLoadTimer=null),this.pageRenderTimer&&(clearInterval(this.pageRenderTimer),this.pageRenderTimer=null),this.resourceObserver&&(this.resourceObserver.disconnect(),this.resourceObserver=null),this.flush();}reportVital(e,t,n="ms"){this.addMetric({type:"web_vital",name:e,value:t,unit:n,timestamp:new Date().toISOString(),url:typeof window<"u"&&window.location?window.location.href:void 0});}addMetric(e){this.metrics.push(e);}startFlushTimer(){this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval),typeof document<"u"&&document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flush();});}async flush(){if(this.metrics.length===0)return;if(this.disabled){this.metrics=[];return}let e=[...this.metrics];this.metrics=[],this.resourceCount=0;let t=this.config.performanceEndpoint||`${this.config.endpoint}/api/performance`;try{let n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({metrics:e})});if(!n.ok)throw new Error(`HTTP ${n.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} performance metrics`);}catch(n){if(this.flushFailures++,this.flushFailures>=ze){this.disabled=true,console.warn(`[SitePong Performance] Disabled after ${ze} consecutive failures. Check that ${t} is accessible and has proper CORS headers.`);return}this.metrics.unshift(...e),this.log(`Failed to flush metrics (attempt ${this.flushFailures}/${ze}):`,n);}}log(...e){this.config.debug&&console.log("[SitePong Performance]",...e);}};function Vt(r){try{if(typeof crypto<"u"&&crypto.getRandomValues){let t=new Uint8Array(r);return crypto.getRandomValues(t),Array.from(t).map(n=>n.toString(16).padStart(2,"0")).join("")}}catch{}let e="";for(let t=0;t<r;t++)e+=Math.floor(Math.random()*256).toString(16).padStart(2,"0");return e}function $e(){return Vt(16)}function ve(){return Vt(8)}function Ke(){return {traceId:$e(),spanId:ve(),parentSpanId:null,sampled:true}}function he(r){let e=r.sampled?"01":"00";return {traceparent:`00-${r.traceId}-${r.spanId}-${e}`,tracestate:`sitepong=${r.spanId}`}}function zt(r){let e=r.traceparent||r.Traceparent;if(!e)return null;let t=e.split("-");if(t.length!==4)return null;let[n,i,o,s]=t;if(n!=="00"||i.length!==32||!/^[0-9a-f]{32}$/.test(i)||o.length!==16||!/^[0-9a-f]{16}$/.test(o)||s.length!==2||!/^[0-9a-f]{2}$/.test(s))return null;let a=(parseInt(s,16)&1)===1;return {traceId:i,spanId:ve(),parentSpanId:o,sampled:a}}var me=class{constructor(e){this.originalFetch=null;this.targets=e;}shouldPropagate(e){return this.targets.some(t=>{if(t.includes("*")){let n=t.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${n}$`).test(e)}return e.startsWith(t)})}injectHeaders(e,t,n){if(!this.shouldPropagate(e))return t;let i=he(n);return {...t,...i}}start(){if(typeof window>"u"||!window.fetch||this.originalFetch)return;this.originalFetch=window.fetch;let e=this;window.fetch=function(t,n){let i=typeof t=="string"?t:t instanceof URL?t.toString():t.url;if(e.shouldPropagate(i)){let o=Ke(),s=he(o),a={};if(n?.headers)if(n.headers instanceof Headers)n.headers.forEach((p,g)=>{a[g]=p;});else if(Array.isArray(n.headers))for(let[p,g]of n.headers)a[p]=g;else Object.assign(a,n.headers);let c={...a,...s},u={...n,headers:c};return e.originalFetch.call(window,t,u)}return e.originalFetch.call(window,t,n)};}stop(){typeof window>"u"||this.originalFetch&&(window.fetch=this.originalFetch,this.originalFetch=null);}};var qe="https://pongl.ink",Q=class{constructor(e={}){this.config={endpoint:$t(e.endpoint||qe),appId:e.appId,installId:e.installId,debug:e.debug??false};}configure(e){e.endpoint&&(this.config.endpoint=$t(e.endpoint)),e.appId!==void 0&&(this.config.appId=e.appId),e.installId!==void 0&&(this.config.installId=e.installId),e.debug!==void 0&&(this.config.debug=e.debug);}log(...e){this.config.debug&&console.warn("[SuperLink]",...e);}async match(e){let t={...e,install_id:e.install_id??this.config.installId};try{let n=await fetch(`${this.config.endpoint}/match`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return n.ok?await n.json()??{matched:!1}:(this.log("match failed",n.status),{matched:!1})}catch(n){return this.log("match error",n),{matched:false}}}async reportEvent(e){try{let t=await fetch(`${this.config.endpoint}/events`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({app_id:this.config.appId,install_id:this.config.installId,...e})});return t.ok||this.log("event failed",e.type,t.status),t.ok}catch(t){return this.log("event error",t),false}}};function $t(r){return r.endsWith("/")?r.slice(0,-1):r}var w=new Q;var Gn=[["source","utm_source"],["medium","utm_medium"],["campaign","utm_campaign"],["term","utm_term"],["content","utm_content"]];function ye(r){let e;try{e=new URL(r);}catch{return null}let t=e.searchParams,n={};for(let[c,u]of Gn){let p=t.get(u);p&&(n[c]=p);}let i={},o={};return t.forEach((c,u)=>{u.startsWith("r_")?i[u.slice(2)]=c:u.startsWith("~")&&(o[u.slice(1)]=c);}),{deep_link_path:t.get("$deep_link_path")??t.get("dlp")??(e.pathname&&e.pathname!=="/"?e.pathname:null),deep_link_data:o,utm:n,referral:i,click_id:t.get("click_id"),match_type:"none",confidence:1}}var We=new Set,be=null;function je(r){return {deep_link_path:r.deep_link_path??null,deep_link_data:r.deep_link_data??{},utm:r.utm??{},referral:r.referral??{},click_id:r.click_id??null,match_type:r.match_type??"fingerprint",confidence:r.confidence??(r.match_type&&r.match_type!=="none"?1:0)}}function Ge(r){be=r;for(let e of We)try{e(r);}catch(t){w.config.debug&&console.warn("[SuperLink] handler threw",t);}}function Kt(r){if(We.add(r),be)try{r(be);}catch{}return ()=>{We.delete(r);}}function qt(){return be}var Wt="sp_superlink",U=null,Xe=false;function Xn(){if(typeof sessionStorage>"u")return null;try{let r=sessionStorage.getItem(Wt);if(!r)return null;let e=JSON.parse(r);return e&&typeof e=="object"?e:null}catch{return null}}function Qn(r){if(!(typeof sessionStorage>"u"))try{sessionStorage.setItem(Wt,JSON.stringify(r));}catch{}}function Yn(r){return !!(r.deep_link_path||r.click_id||Object.keys(r.deep_link_data).length>0||Object.keys(r.referral).length>0||Object.keys(r.utm).length>0)}function jt(r){if(typeof navigator>"u"||!navigator.clipboard)return;let e=`${w.config.endpoint}/c/${r}`;navigator.clipboard.writeText(e).catch(()=>{});}function Gt(r){let e=r??(typeof window<"u"&&window.location?window.location.href:null);if(!e)return;let t;try{t=new URL(e);}catch{return}let n=t.searchParams.get("email"),i=t.searchParams.get("phone"),o=t.searchParams.get("user_id"),s=t.searchParams.get("id"),a=t.searchParams.get("custom"),c={};if(n&&(c.email=n),i&&(c.phone=i),o&&(c.user_id=o),s&&(c.id=s),a)try{let u=JSON.parse(decodeURIComponent(a));typeof u=="object"&&u!==null&&(c.custom=u);}catch{}return Object.keys(c).length>0?c:void 0}function Y(){if(Xe)return U;Xe=true;let r=Xn();if(r)return U=r,U;if(typeof window>"u"||!window.location)return null;let e=ye(window.location.href);return e&&Yn(e)&&(U=e,Qn(e),w.reportEvent({type:"opened",click_id:e.click_id,platform:"desktop",properties:{surface:"web"}})),U}function Xt(){return Xe?U:Y()}function Qt(){let r={platform:"desktop"};if(typeof navigator<"u"){navigator.userAgent&&(r.user_agent=navigator.userAgent);let e=navigator.language||navigator.languages&&navigator.languages[0];e&&(r.language=e);}return r}async function Yt(r){if(!r||Object.keys(r).length===0)return null;let e=await w.match({identity:r,fingerprint:Qt()});if(!e.matched)return null;let t=je(e);return Ge(t),t}async function Jt(r){if(!r)return null;let e=await w.match({qr_token:r,fingerprint:Qt()});if(!e.matched)return null;let t=je(e);return Ge(t),t}function Jn(r={}){w.configure(r),Y();}function Zn(){if(b())return;let r=globalThis,e=typeof r.window<"u"&&typeof r.document<"u",t=!e&&!!r.process?.versions?.node,n=e?"browser":"node";H({platform:n,storage:null,getDeviceInfo(){let o={platform:n};return r.navigator?.userAgent&&(o.userAgent=r.navigator.userAgent),e&&r.window?.screen&&(o.screenWidth=r.window.screen.width,o.screenHeight=r.window.screen.height),t&&r.process&&(o.osName=r.process.platform,o.osVersion=r.process.versions?.node),o},getCurrentUrl(){return r.window?.location?.href??void 0},getReferrer(){return r.document?.referrer||void 0},getUserAgent(){if(r.navigator?.userAgent)return r.navigator.userAgent;if(t&&r.process)return `SitePong-Node/${r.process.versions?.node} (${r.process.platform})`},onUncaughtError(o){if(e&&r.window?.addEventListener){let s=a=>o(a.error||a.message);return r.window.addEventListener("error",s),()=>r.window?.removeEventListener?.("error",s)}if(t&&r.process?.on&&r.process.off){let s=a=>o(a);return r.process.on("uncaughtException",s),()=>r.process?.off?.("uncaughtException",s)}return ()=>{}},onUnhandledRejection(o){if(e&&r.window?.addEventListener){let s=a=>o(a.reason);return r.window.addEventListener("unhandledrejection",s),()=>r.window?.removeEventListener?.("unhandledrejection",s)}if(t&&r.process?.on&&r.process.off){let s=a=>o(a);return r.process.on("unhandledRejection",s),()=>r.process?.off?.("unhandledRejection",s)}return ()=>{}},onBeforeTerminate(o){return e&&r.window?.addEventListener?(r.window.addEventListener("beforeunload",o),()=>r.window?.removeEventListener?.("beforeunload",o)):t&&r.process?.on&&r.process.off?(r.process.on("beforeExit",o),r.process.on("SIGINT",o),r.process.on("SIGTERM",o),()=>{r.process?.off?.("beforeExit",o),r.process?.off?.("SIGINT",o),r.process?.off?.("SIGTERM",o);}):()=>{}},onVisibilityHidden(o){if(r.document?.addEventListener){let s=()=>{r.document?.visibilityState==="hidden"&&o();};return r.document.addEventListener("visibilitychange",s),()=>r.document?.removeEventListener?.("visibilitychange",s)}return ()=>{}},sendBeacon(o,s){if(typeof r.navigator?.sendBeacon!="function")return false;try{return r.navigator.sendBeacon(o,new Blob([s],{type:"application/json"}))}catch{return false}}});}Zn();var R={};function Zt(r){R={...R,...r};}var v="https://ingest.sitepong.com",er=10,tr=5e3,Qe=3,Ye=class{constructor(){this.errorQueue=[];this.flushTimer=null;this.context={};this.initialized=false;this.flushFailures=0;this.disabled=false;this.flagManager=null;this.analyticsManager=null;this.fingerprintManager=null;this.replayManager=null;this.performanceManager=null;this.cronManager=null;this.metricsManager=null;this.databaseTracker=null;this.profiler=null;this.remoteConfigManager=null;this.envUnsubs=[];this.identifyHooks=[];this.config={apiKey:"",endpoint:v,environment:"production",release:"",autoCapture:true,maxBatchSize:er,flushInterval:tr,debug:false};}init(e){if(!e.apiKey){console.error("[SitePong] API key is required");return}if(this.config={...this.config,...e},this.initialized=true,this.config.autoCapture&&this.setupAutoCapture(),this.startFlushTimer(),this.log("Initialized with endpoint:",this.config.endpoint),e.enableFlags&&(this.flagManager=new _({apiKey:e.apiKey,endpoint:e.flagsEndpoint||e.endpoint||v,debug:e.debug}),this.flagManager.init().catch(t=>{this.log("Failed to initialize flags:",t);})),e.analytics?.enabled&&(this.analyticsManager&&this.analyticsManager.destroy(),this.analyticsManager=new F({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,autocapturePageviews:e.analytics.autocapturePageviews,autocaptureClicks:e.analytics.autocaptureClicks,autocaptureForms:e.analytics.autocaptureForms,autocapture:e.analytics.autocapture,maxBatchSize:e.analytics.maxBatchSize,flushInterval:e.analytics.flushInterval,eventsEndpoint:e.analytics.eventsEndpoint,debug:e.debug}),this.analyticsManager.init()),e.fingerprint?.enabled&&R.createFingerprint?this.fingerprintManager=R.createFingerprint({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,extendedSignals:e.fingerprint.extendedSignals,visitorEndpoint:e.fingerprint.visitorEndpoint,debug:e.debug}):e.fingerprint?.enabled&&this.log("Fingerprint requested but not available on this platform (web only)."),e.performance?.enabled&&R.createPerformance?(this.performanceManager&&this.performanceManager.destroy(),this.performanceManager=R.createPerformance({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,webVitals:e.performance.webVitals,navigationTiming:e.performance.navigationTiming,resourceTiming:e.performance.resourceTiming,capturePageLoadTimings:e.performance.capturePageLoadTimings,capturePageRenderTimings:e.performance.capturePageRenderTimings,excludedResourceUrls:e.performance.excludedResourceUrls,resourceNameSanitizer:e.performance.resourceNameSanitizer,sampleRate:e.performance.sampleRate,flushInterval:e.performance.flushInterval,performanceEndpoint:e.performance.performanceEndpoint,debug:e.debug}),this.performanceManager.init()):e.performance?.enabled&&this.log("Performance requested but not available on this platform (web only)."),e.replay?.enabled&&R.createReplay?(this.replayManager&&this.replayManager.stop(),this.replayManager=R.createReplay({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,maskInputs:e.replay.maskInputs,blockSelector:e.replay.blockSelector,maskSelector:e.replay.maskSelector,sampleRate:e.replay.sampleRate,maxSessionDuration:e.replay.maxSessionDuration,flushInterval:e.replay.flushInterval,replayEndpoint:e.replay.replayEndpoint,recordNetwork:e.replay.recordNetwork,captureNetworkHeaders:e.replay.captureNetworkHeaders,recordConsole:e.replay.recordConsole,consoleLevels:e.replay.consoleLevels,bufferDuration:e.replay.bufferDuration,debug:e.debug}),this.replayManager.start()):e.replay?.enabled&&this.log("Replay requested but not available on this platform (web only)."),e.crons?.enabled&&(this.cronManager=new K({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug})),e.database?.enabled&&(this.databaseTracker=new W({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,slowQueryThreshold:e.database.slowQueryThreshold,redactParams:e.database.redactParams})),e.metrics?.enabled&&(this.metricsManager=new q({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,flushInterval:e.metrics.flushInterval,maxBatchSize:e.metrics.maxBatchSize})),e.profiling?.enabled&&(this.profiler=new j({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,sampleRate:e.profiling.sampleRate,maxDuration:e.profiling.maxDuration,flushInterval:e.profiling.flushInterval})),e.remoteConfig?.enabled!==false){let t=e._storageAdapter||Me();this.remoteConfigManager=new A({apiKey:e.apiKey,endpoint:e.endpoint||v,storage:t,debug:e.debug}),this.remoteConfigManager.init().catch(n=>{this.log("Failed to initialize remote config:",n);});}}initRN(e){if(!e.apiKey){console.error("[SitePong] API key is required");return}if(this.config={...this.config,...e},this.initialized=true,this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval),this.log("Initialized (React Native) with endpoint:",this.config.endpoint),e.enableFlags&&(this.flagManager=new _({apiKey:e.apiKey,endpoint:e.flagsEndpoint||e.endpoint||v,debug:e.debug}),this.flagManager.init().catch(t=>{this.log("Failed to initialize flags:",t);})),e.analytics?.enabled&&(this.analyticsManager&&this.analyticsManager.destroy(),this.analyticsManager=new F({apiKey:e.apiKey,endpoint:e.endpoint||v,enabled:true,maxBatchSize:e.analytics.maxBatchSize,flushInterval:e.analytics.flushInterval,eventsEndpoint:e.analytics.eventsEndpoint,debug:e.debug}),this.analyticsManager.initHeadless()),e.crons?.enabled&&(this.cronManager=new K({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug})),e.metrics?.enabled&&(this.metricsManager=new q({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,flushInterval:e.metrics.flushInterval,maxBatchSize:e.metrics.maxBatchSize})),e.database?.enabled&&(this.databaseTracker=new W({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,slowQueryThreshold:e.database.slowQueryThreshold,redactParams:e.database.redactParams})),e.profiling?.enabled&&(this.profiler=new j({apiKey:e.apiKey,endpoint:e.endpoint||v,debug:e.debug,sampleRate:e.profiling.sampleRate,maxDuration:e.profiling.maxDuration,flushInterval:e.profiling.flushInterval})),e.remoteConfig?.enabled!==false){let t=e._storageAdapter||Me();this.remoteConfigManager=new A({apiKey:e.apiKey,endpoint:e.endpoint||v,storage:t,debug:e.debug}),this.remoteConfigManager.init().catch(n=>{this.log("Failed to initialize remote config:",n);});}}isInitialized(){return this.initialized}getFlag(e,t=false){return this.flagManager?this.flagManager.getFlag(e,t):(this.log("Flags not enabled. Set enableFlags: true in init()"),t)}getAllFlags(){return this.flagManager?this.flagManager.getAllFlags():{}}async waitForFlags(){this.flagManager&&await this.flagManager.waitForInit();}areFlagsReady(){return this.flagManager?.isInitialized()??false}getVariant(e,t=null){return this.flagManager?this.flagManager.getVariant(e,t):(this.log("Flags not enabled. Set enableFlags: true in init()"),t)}getVariantPayload(e,t=null){return this.flagManager?this.flagManager.getVariantPayload(e,t):t}async refreshFlags(){this.flagManager&&await this.flagManager.refresh();}track(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.track(e,t);}trackPageView(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.trackPageView(e,t);}identify(e,t){this.replayManager&&this.replayManager.setUser({id:e});for(let n of this.identifyHooks)try{n(e);}catch(i){this.log("identify hook failed:",i);}if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.identify(e,t);}registerIdentifyHook(e){return this.identifyHooks.push(e),()=>{let t=this.identifyHooks.indexOf(e);t>=0&&this.identifyHooks.splice(t,1);}}group(e,t){if(!this.analyticsManager){this.log("Analytics not enabled. Set analytics.enabled: true in init()");return}this.analyticsManager.group(e,t);}resetAnalytics(){this.analyticsManager&&this.analyticsManager.reset();}async getVisitorId(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getVisitorId()}async getDeviceSignals(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getDeviceSignals()}async getFraudCheck(){if(!this.fingerprintManager)throw new Error("Fingerprint not enabled. Set fingerprint.enabled: true in init()");return this.fingerprintManager.getFraudCheck()}startReplay(){return this.replayManager?this.replayManager.start():(this.log("Replay not enabled. Set replay.enabled: true in init()"),false)}stopReplay(){this.replayManager&&this.replayManager.stop();}isReplayRecording(){return this.replayManager?.isRecording()??false}getReplaySessionId(){return this.replayManager?.getSessionId()??null}startTransaction(e,t){return this.performanceManager?this.performanceManager.startTransaction(e,t):(this.log("Performance not enabled. Set performance.enabled: true in init()"),"")}endTransaction(e,t="ok"){this.performanceManager&&this.performanceManager.endTransaction(e,t);}startSpan(e,t,n){return this.performanceManager?this.performanceManager.startSpan(e,t,n):""}endSpan(e,t,n="ok"){this.performanceManager&&this.performanceManager.endSpan(e,t,n);}getWebVitals(){return this.performanceManager?this.performanceManager.getVitals():{}}cronCheckin(e,t){return this.cronManager?this.cronManager.checkin(e,t):(this.log("Cron monitoring not enabled. Set crons.enabled: true in init()"),Promise.resolve())}cronStart(e,t){return this.cronManager?this.cronManager.start(e,t):(this.log("Cron monitoring not enabled. Set crons.enabled: true in init()"),{ok:()=>Promise.resolve(),error:()=>Promise.resolve()})}cronWrap(e,t,n){return this.cronManager?this.cronManager.wrap(e,t,n):t()}metricIncrement(e,t,n){if(!this.metricsManager){this.log("Metrics not enabled. Set metrics.enabled: true in init()");return}this.metricsManager.increment(e,t,n);}metricGauge(e,t,n){this.metricsManager&&this.metricsManager.gauge(e,t,n);}metricHistogram(e,t,n){this.metricsManager&&this.metricsManager.histogram(e,t,n);}metricDistribution(e,t,n){this.metricsManager&&this.metricsManager.distribution(e,t,n);}async metricTime(e,t,n){return this.metricsManager?this.metricsManager.time(e,t,n):t()}metricStartTimer(e,t){return this.metricsManager?this.metricsManager.startTimer(e,t):{stop:()=>{}}}async flushMetrics(){if(this.metricsManager)return this.metricsManager.flush()}async dbTrack(e,t,n){return this.databaseTracker?this.databaseTracker.track(e,t,n):t()}dbTrackSync(e,t,n){return this.databaseTracker?this.databaseTracker.trackSync(e,t,n):t()}getDbQueryCount(){return this.databaseTracker?this.databaseTracker.getQueryCount():0}resetDbQueryCount(){this.databaseTracker&&this.databaseTracker.resetQueryCount();}getDbNPlusOnePatterns(){return this.databaseTracker?this.databaseTracker.getNPlusOnePatterns():[]}async profile(e,t,n){return this.profiler?this.profiler.profile(e,t,n):t()}startProfileSpan(e,t){return this.profiler?this.profiler.startSpan(e,t):()=>{}}getProfiles(){return this.profiler?this.profiler.getProfiles():[]}getLatestProfile(){return this.profiler?this.profiler.getLatestProfile():null}async flushProfiles(){if(this.profiler)return this.profiler.flush()}getRemoteConfig(){return this.remoteConfigManager?.getConfig()??null}isRemoteConfigFeatureEnabled(e,t=true){return this.remoteConfigManager?.isFeatureEnabled(e,t)??t}onRemoteConfigChange(e){return this.remoteConfigManager?this.remoteConfigManager.onChange(e):()=>{}}setContext(e){this.context={...this.context,...e};}setUser(e){this.context.user=e,this.replayManager&&this.replayManager.setUser(e?{id:e.id}:null);}setTags(e){this.context.tags={...this.context.tags,...e};}clearUser(){this.context.user=void 0,this.replayManager&&this.replayManager.setUser(null);}addBreadcrumb(e){this.log("Breadcrumb added:",e);}captureError(e,t){if(!this.initialized){console.warn("[SitePong] SDK not initialized. Call init() first.");return}let n=this.formatError(e,t);this.errorQueue.push(n),this.log("Captured error:",n.message),this.replayManager?.isRecording()&&this.replayManager.flushOnError().catch(i=>{this.log("Failed to flush replay on error:",i);}),this.errorQueue.length>=this.config.maxBatchSize&&this.flush();}captureMessage(e,t="info",n){if(!this.initialized){console.warn("[SitePong] SDK not initialized. Call init() first.");return}let i={message:e,type:t,timestamp:new Date().toISOString(),url:this.getUrl(),userAgent:this.getUserAgent(),environment:this.config.environment,release:this.config.release,context:{...this.context,...n},replaySessionId:this.replayManager?.isRecording()&&this.replayManager.getSessionId()||void 0};this.errorQueue.push(i),this.log("Captured message:",e),this.errorQueue.length>=this.config.maxBatchSize&&this.flush();}async flush(){if(this.errorQueue.length===0)return;if(this.disabled){this.errorQueue=[];return}let e=[...this.errorQueue];this.errorQueue=[];try{let t=await fetch(`${this.config.endpoint}/api/errors/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({errors:e})});if(!t.ok)throw new Error(`HTTP ${t.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} errors`);}catch(t){if(this.flushFailures++,this.flushFailures>=Qe){this.disabled=true,console.warn(`[SitePong] SDK disabled after ${Qe} consecutive failures. Events will no longer be sent. This may be due to CORS issues or network problems. Check that ${this.config.endpoint} is accessible and has proper CORS headers.`);return}this.errorQueue.unshift(...e),this.log(`Failed to flush errors (attempt ${this.flushFailures}/${Qe}):`,t);}}formatError(e,t){let n=e instanceof Error,i=n?e.message:String(e),o=n?e.stack:new Error(i).stack,s=n?e.name:"Error";return {message:i,stack:o,type:s,timestamp:new Date().toISOString(),url:this.getUrl(),userAgent:this.getUserAgent(),environment:this.config.environment,release:this.config.release,context:{...this.context,...t},fingerprint:this.generateFingerprint(i,o,s),replaySessionId:this.replayManager?.isRecording()&&this.replayManager.getSessionId()||void 0}}generateFingerprint(e,t,n){let i=n||"Error",o=this.normalizeMessage(e),s=t?this.extractTopFrame(t):"",a=[i,o,s].join(`
|
|
2
2
|
`),c=2166136261;for(let u=0;u<a.length;u++)c^=a.charCodeAt(u),c=Math.imul(c,16777619);return (c>>>0).toString(16).padStart(8,"0")}normalizeMessage(e){return e.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,"<uuid>").replace(/\b0x[0-9a-f]{4,}\b/gi,"<hex>").replace(/\b[0-9a-f]{8,}\b/gi,"<hex>").replace(/https?:\/\/[^\s)"']+/g,"<url>").replace(/\b\d+(\.\d+)?\b/g,"<n>").replace(/\s+/g," ").trim()}extractTopFrame(e){let t=e.split(`
|
|
3
|
-
`);for(let n=1;n<t.length;n++){let i=t[n].trim();if(i&&(i.startsWith("at ")||/^\w+@/.test(i)))return i.replace(/:\d+\)?\s*$/,")")}return ""}setupAutoCapture(){let e=b();e&&(this.envUnsubs.push(e.onUncaughtError(t=>{let n=t instanceof Error?t:new Error(String(t));this.captureError(n);})),this.envUnsubs.push(e.onUnhandledRejection(t=>{let n=t instanceof Error?t:new Error(String(t));this.captureError(n);})),this.log("Auto-capture enabled for",e.platform));}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval);let e=b();e&&(this.envUnsubs.push(e.onBeforeTerminate(()=>this.flush())),this.envUnsubs.push(e.onVisibilityHidden(()=>this.flushWithBeacon())));}flushWithBeacon(){if(this.errorQueue.length===0)return;let e=b();if(!e||!e.sendBeacon)return;let t=[...this.errorQueue];this.errorQueue=[];let n=JSON.stringify({errors:t,apiKey:this.config.apiKey});e.sendBeacon(`${this.config.endpoint}/api/errors/batch`,n)?this.log(`Flushed ${t.length} errors via beacon`):this.errorQueue.unshift(...t);}setCurrentScreen(e){this.currentScreen=e,Ce(()=>this.currentScreen);}getUrl(){let e=b();return e?e.getCurrentUrl()??this.currentScreen??void 0:this.currentScreen??void 0}getUserAgent(){let e=b();if(e)return e.getUserAgent()}log(...e){this.config.debug&&console.log("[SitePong]",...e);}},l=new Ye,
|
|
4
|
-
`;return t}catch{return null}}function Se(r){let e=r.tagName.toLowerCase(),t=location.href;if(e==="style"){let n=r;if(n.sheet){let o=
|
|
3
|
+
`);for(let n=1;n<t.length;n++){let i=t[n].trim();if(i&&(i.startsWith("at ")||/^\w+@/.test(i)))return i.replace(/:\d+\)?\s*$/,")")}return ""}setupAutoCapture(){let e=b();e&&(this.envUnsubs.push(e.onUncaughtError(t=>{let n=t instanceof Error?t:new Error(String(t));this.captureError(n);})),this.envUnsubs.push(e.onUnhandledRejection(t=>{let n=t instanceof Error?t:new Error(String(t));this.captureError(n);})),this.log("Auto-capture enabled for",e.platform));}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval);let e=b();e&&(this.envUnsubs.push(e.onBeforeTerminate(()=>this.flush())),this.envUnsubs.push(e.onVisibilityHidden(()=>this.flushWithBeacon())));}flushWithBeacon(){if(this.errorQueue.length===0)return;let e=b();if(!e||!e.sendBeacon)return;let t=[...this.errorQueue];this.errorQueue=[];let n=JSON.stringify({errors:t,apiKey:this.config.apiKey});e.sendBeacon(`${this.config.endpoint}/api/errors/batch`,n)?this.log(`Flushed ${t.length} errors via beacon`):this.errorQueue.unshift(...t);}setCurrentScreen(e){this.currentScreen=e,Ce(()=>this.currentScreen);}getUrl(){let e=b();return e?e.getCurrentUrl()??this.currentScreen??void 0:this.currentScreen??void 0}getUserAgent(){let e=b();if(e)return e.getUserAgent()}log(...e){this.config.debug&&console.log("[SitePong]",...e);}},l=new Ye,lo=l.init.bind(l),uo=l.initRN.bind(l),po=l.captureError.bind(l),fo=l.captureMessage.bind(l),go=l.setContext.bind(l),ho=l.setUser.bind(l),mo=l.setTags.bind(l),vo=l.flush.bind(l),yo=l.isInitialized.bind(l),bo=l.clearUser.bind(l),wo=l.addBreadcrumb.bind(l),So=l.setCurrentScreen.bind(l);var To=l.getFlag.bind(l),ko=l.getAllFlags.bind(l),xo=l.getVariant.bind(l),Eo=l.getVariantPayload.bind(l),Co=l.waitForFlags.bind(l),Mo=l.areFlagsReady.bind(l),Ro=l.refreshFlags.bind(l),Po=l.track.bind(l),Io=l.trackPageView.bind(l),Lo=l.identify.bind(l),Do=l.group.bind(l),_o=l.resetAnalytics.bind(l),Fo=l.getVisitorId.bind(l),Ao=l.getDeviceSignals.bind(l),No=l.getFraudCheck.bind(l),Oo=l.startReplay.bind(l),Uo=l.stopReplay.bind(l),Bo=l.isReplayRecording.bind(l),Ho=l.getReplaySessionId.bind(l),Vo=l.startTransaction.bind(l),zo=l.endTransaction.bind(l),$o=l.startSpan.bind(l),Ko=l.endSpan.bind(l),qo=l.getWebVitals.bind(l),Wo=l.dbTrack.bind(l),jo=l.dbTrackSync.bind(l),Go=l.getDbQueryCount.bind(l),Xo=l.resetDbQueryCount.bind(l),Qo=l.getDbNPlusOnePatterns.bind(l),Yo=l.cronCheckin.bind(l),Jo=l.cronStart.bind(l),Zo=l.cronWrap.bind(l),es=l.metricIncrement.bind(l),ts=l.metricGauge.bind(l),ns=l.metricHistogram.bind(l),rs=l.metricDistribution.bind(l),is=l.metricTime.bind(l),os=l.metricStartTimer.bind(l),ss=l.flushMetrics.bind(l),as=l.profile.bind(l),cs=l.startProfileSpan.bind(l),ls=l.getProfiles.bind(l),us=l.getLatestProfile.bind(l),ds=l.flushProfiles.bind(l),ps=l.getRemoteConfig.bind(l),fs=l.isRemoteConfigFeatureEnabled.bind(l),gs=l.onRemoteConfigChange.bind(l),hs=l.registerIdentifyHook.bind(l),nr=l;var nn=0,en=new WeakMap;function rr(){nn=0;}function y(r){let e=en.get(r);return e===void 0&&(e=++nn,en.set(r,e)),e}var rn=new Set(["script","noscript"]),ir=new Set(["src","href","action","poster"]),on=["display","visibility","opacity","position","top","right","bottom","left","z-index","float","clear","width","height","min-width","min-height","max-width","max-height","margin-top","margin-right","margin-bottom","margin-left","padding-top","padding-right","padding-bottom","padding-left","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-style","border-right-style","border-bottom-style","border-left-style","border-top-color","border-right-color","border-bottom-color","border-left-color","border-radius","background-color","background-image","background-size","background-position","color","font-family","font-size","font-weight","font-style","line-height","letter-spacing","text-align","text-decoration","text-transform","overflow","overflow-x","overflow-y","flex-direction","flex-wrap","justify-content","align-items","align-self","flex-grow","flex-shrink","flex-basis","gap","grid-template-columns","grid-template-rows","transform","box-shadow","text-shadow","cursor","white-space","word-break","box-sizing"],J=null,E=null;function or(r){if(typeof document>"u")return {};J||(J=new Map);let e=J.get(r);if(e)return e;try{E||(E=document.createElement("iframe"),E.style.cssText="position:fixed;top:-9999px;left:-9999px;width:0;height:0;border:none;visibility:hidden;",document.body.appendChild(E));let t=E.contentDocument;if(!t)return {};let n=t.createElement(r);t.body.appendChild(n);let i=t.defaultView.getComputedStyle(n),o={};for(let s of on)o[s]=i.getPropertyValue(s);return t.body.removeChild(n),J.set(r,o),o}catch{return {}}}function Je(r){if(typeof window>"u")return null;try{let e=r.tagName.toLowerCase();if(rn.has(e)||e==="head"||e==="html"||e==="meta"||e==="link"||e==="title")return null;let t=window.getComputedStyle(r),n=or(e),i=[];for(let o of on){let s=t.getPropertyValue(o);s&&s!==n[o]&&i.push(`${o}:${s}`);}return i.length>0?i.join(";"):null}catch{return null}}var I=new Map;async function sn(r){if(I.has(r))return I.get(r)??null;try{let e=await fetch(r,{mode:"cors"});if(!e.ok)return I.set(r,null),null;let t=await e.text(),n=we(t,r);return I.set(r,n),n}catch{return I.set(r,null),null}}function sr(r){return I.get(r)??null}function an(){E&&E.parentNode&&E.parentNode.removeChild(E),E=null,J=null,I.clear();}function cn(r,e){if(!r||r.startsWith("data:")||r.startsWith("blob:")||r.startsWith("#"))return r;try{return new URL(r,e).href}catch{return r}}function we(r,e){return r.replace(/url\(\s*(['"]?)([^'")]+)\1\s*\)/g,(t,n,i)=>{let o=i.trim();if(o.startsWith("data:")||o.startsWith("blob:")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("//"))return `url(${n}${o}${n})`;try{let s=new URL(o,e).href;return `url(${n}${s}${n})`}catch{return `url(${n}${o}${n})`}})}function tn(r){try{let e=r.cssRules,t="";for(let n=0;n<e.length;n++)t+=e[n].cssText+`
|
|
4
|
+
`;return t}catch{return null}}function Se(r){let e=r.tagName.toLowerCase(),t=location.href;if(e==="style"){let n=r;if(n.sheet){let o=tn(n.sheet);if(o!==null)return we(o,t)}let i=r.textContent||"";return i?we(i,t):null}if(e==="link"){let n=r;if(n.rel!=="stylesheet")return null;let i=n.href||t;if(n.sheet){let o=tn(n.sheet);if(o!==null)return we(o,i)}if(n.href){let o=sr(n.href);if(o)return o}return null}return null}function ar(r,e){return r.split(",").map(t=>{let n=t.trim().split(/\s+/);return n[0]&&(n[0]=cn(n[0],e)),n.join(" ")}).join(", ")}function Te(r,e,t=false){let n=y(r);if(r.nodeType===Node.TEXT_NODE){let i=r.parentElement,o=r.textContent||"";return i&&e.maskSelector&&i.matches(e.maskSelector)&&(o=o.replace(/\S/g,"*")),{id:n,type:"text",textContent:o}}if(r.nodeType===Node.COMMENT_NODE)return {id:n,type:"comment",textContent:""};if(r.nodeType===Node.ELEMENT_NODE){let i=r,o=i;if(e.blockSelector&&i.matches(e.blockSelector))return {id:n,type:"element",tagName:"div",attributes:{"data-blocked":"true",style:`width:${o.offsetWidth}px;height:${o.offsetHeight}px;background:#f0f0f0;`}};let s=i.tagName.toLowerCase();if(rn.has(s))return null;let a=t||s==="svg"||i instanceof SVGElement,c={},u=location.href;for(let d=0;d<i.attributes.length;d++){let f=i.attributes[d],h=f.name,m=f.value;h.startsWith("on")||m&&m.toLowerCase().startsWith("javascript:")||(ir.has(h)&&(m=cn(m,u)),h==="srcset"&&(m=ar(m,u)),c[h]=m);}if(s==="style"||s==="link"&&i.getAttribute("rel")==="stylesheet"){let d=Se(i);d&&(c._cssText=d);}if(!a&&s!=="style"&&s!=="link"){let d=Je(i);d&&(c._computedStyle=d);}if(s==="input"){let d=i,f=(d.type||"").toLowerCase();if(f==="checkbox"||f==="radio")c._checked=String(d.checked);else {let h=e.maskInputs?"***":d.value;h&&(c._value=h);}}else if(s==="textarea"){let d=i,f=e.maskInputs?"***":d.value;f&&(c._value=f);}else if(s==="select"){let d=i;c._selectedIndex=String(d.selectedIndex);}if(s==="canvas")try{let f=i.toDataURL("image/webp",.4);f&&f!=="data:,"&&(c._canvasDataUrl=f);}catch{}e.maskSelector&&i.matches(e.maskSelector);let p=[];for(let d of Array.from(i.childNodes)){let f=Te(d,e,a);f&&p.push(f);}let g={id:n,type:"element",tagName:s,attributes:Object.keys(c).length>0?c:void 0,children:p.length>0?p:void 0};return a&&(g.isSVG=true),g}return null}function ke(r){if(typeof document>"u")return null;rr();let e=Te(document.documentElement,r);return e?{_version:2,doctype:document.doctype?`<!DOCTYPE ${document.doctype.name}>`:void 0,html:e,width:window.innerWidth,height:window.innerHeight}:null}var xe=["authorization","cookie","set-cookie","x-api-key","x-auth-token"],Z=class{constructor(e,t){this.originalFetch=null;this.originalXhrOpen=null;this.originalXhrSend=null;this.active=false;this.callback=e,this.captureHeaders=t?.captureHeaders??false,this.urlFilter=t?.urlFilter;}start(){this.active||typeof window>"u"||(this.active=true,this.interceptFetch(),this.interceptXHR());}stop(){this.active&&(this.active=false,this.originalFetch&&(window.fetch=this.originalFetch,this.originalFetch=null),this.originalXhrOpen&&(XMLHttpRequest.prototype.open=this.originalXhrOpen,this.originalXhrOpen=null),this.originalXhrSend&&(XMLHttpRequest.prototype.send=this.originalXhrSend,this.originalXhrSend=null));}interceptFetch(){if(typeof window.fetch!="function")return;this.originalFetch=window.fetch;let e=this;window.fetch=async function(t,n){let i=typeof t=="string"?t:t instanceof URL?t.toString():t.url;if(e.urlFilter&&!e.urlFilter(i))return e.originalFetch.call(window,t,n);let o=Date.now(),s=n?.method||(t instanceof Request?t.method:"GET"),a;n?.body&&(typeof n.body=="string"?a=n.body.length:n.body instanceof Blob&&(a=n.body.size));try{let c=await e.originalFetch.call(window,t,n),u=Date.now()-o,p={method:s.toUpperCase(),url:e.truncateUrl(i),status:c.status,statusText:c.statusText,duration:u,requestSize:a,initiator:"fetch"};return e.captureHeaders&&(p.requestHeaders=e.safeHeaders(n?.headers),p.responseHeaders=e.headersToObject(c.headers)),e.emit(p),c}catch(c){let u=Date.now()-o;throw e.emit({method:s.toUpperCase(),url:e.truncateUrl(i),duration:u,requestSize:a,error:c instanceof Error?c.message:"Network error",initiator:"fetch"}),c}};}interceptXHR(){if(typeof XMLHttpRequest>"u")return;this.originalXhrOpen=XMLHttpRequest.prototype.open,this.originalXhrSend=XMLHttpRequest.prototype.send;let e=this;XMLHttpRequest.prototype.open=function(t,n,...i){return this._spMethod=t,this._spUrl=typeof n=="string"?n:n.toString(),e.originalXhrOpen.apply(this,[t,n,...i])},XMLHttpRequest.prototype.send=function(t){let n=this,i=n._spUrl;if(e.urlFilter&&!e.urlFilter(i))return e.originalXhrSend.call(this,t);let o=Date.now(),s;typeof t=="string"&&(s=t.length);let a=()=>{let c=Date.now()-o,u;try{n.responseType===""||n.responseType==="text"?u=n.responseText?.length:n.responseType==="json"&&n.response!=null?u=JSON.stringify(n.response).length:n.responseType==="arraybuffer"&&n.response?u=n.response.byteLength:n.responseType==="blob"&&n.response&&(u=n.response.size);}catch{}let p={method:(n._spMethod||"GET").toUpperCase(),url:e.truncateUrl(i),status:n.status,statusText:n.statusText,duration:c,requestSize:s,responseSize:u,initiator:"xhr"};n.status===0&&(p.error="Network error"),e.emit(p),n.removeEventListener("loadend",a);};return n.addEventListener("loadend",a),e.originalXhrSend.call(this,t)};}emit(e){this.active&&this.callback({type:"network",timestamp:Date.now(),data:e});}truncateUrl(e){try{let t=new URL(e,window.location.origin),n=t.pathname+t.search;return n.length>500?n.slice(0,500)+"...":t.origin+n}catch{return e.length>500?e.slice(0,500)+"...":e}}safeHeaders(e){if(!e)return;let t={};if(e instanceof Headers)e.forEach((n,i)=>{t[i]=xe.includes(i.toLowerCase())?"[REDACTED]":n;});else if(Array.isArray(e))for(let[n,i]of e)t[n]=xe.includes(n.toLowerCase())?"[REDACTED]":i;else for(let[n,i]of Object.entries(e))t[n]=xe.includes(n.toLowerCase())?"[REDACTED]":i;return t}headersToObject(e){let t={};return e.forEach((n,i)=>{t[i]=xe.includes(i.toLowerCase())?"[REDACTED]":n;}),t}};var ee=class{constructor(e,t){this.originals={};this.active=false;this.callback=e,this.levels=t?.levels||["log","info","warn","error","debug"];}start(){if(!(this.active||typeof console>"u")){this.active=true;for(let e of this.levels)this.originals[e]=console[e].bind(console),console[e]=(...t)=>{this.originals[e](...t),this.record(e,t);};}}stop(){if(this.active){this.active=false;for(let e of this.levels)this.originals[e]&&(console[e]=this.originals[e]);this.originals={};}}record(e,t){if(!this.active||t.length>0&&typeof t[0]=="string"&&t[0].startsWith("[SitePong"))return;let n=t.slice(0,10).map(o=>this.serialize(o)),i={level:e,args:n};if(e==="error"){let o=this.getStackTrace();o&&(i.trace=o.slice(0,2e3));}this.callback({type:"console",timestamp:Date.now(),data:i});}serialize(e){if(e===null)return "null";if(e===void 0)return "undefined";if(e instanceof Error)return `Error: ${e.message}${e.stack?`
|
|
5
5
|
`+e.stack:""}`.slice(0,1e3);if(typeof e=="string")return e.slice(0,1e3);if(typeof e=="number"||typeof e=="boolean")return String(e);if(typeof e=="function")return `[Function: ${e.name||"anonymous"}]`;if(typeof e=="symbol")return e.toString();if(e instanceof HTMLElement)return `<${e.tagName.toLowerCase()}${e.id?"#"+e.id:""}${e.className?"."+e.className.split(" ").join("."):""}>`;try{let t=JSON.stringify(e,this.getReplacer(),0);return t?t.slice(0,1e3):String(e)}catch{return String(e).slice(0,1e3)}}getReplacer(){let e=new WeakSet;return (t,n)=>{if(typeof n=="object"&&n!==null){if(e.has(n))return "[Circular]";e.add(n);}return typeof n=="function"?"[Function]":n instanceof RegExp?n.toString():n}}getStackTrace(){try{let e=new Error;return e.stack&&e.stack.split(`
|
|
6
6
|
`).slice(4).join(`
|
|
7
|
-
`)||void 0}catch{return}}};var nr="https://ingest.sitepong.com",rr=2e4,ir=3600*1e3,Ze=3,or=5e3,te=class{constructor(e){this.recording=false;this.sessionId=null;this.events=[];this.trimTimer=null;this.flushFailures=0;this.disabled=false;this.sessionStartTime=0;this.observer=null;this.mouseMoveBuffer=[];this.mouseMoveFlushTimer=null;this.cleanupFns=[];this.networkRecorder=null;this.consoleRecorder=null;this.lastSnapshotTime=0;this.snapshotCooldown=500;this.userContext=null;this.mutationBuffer=null;this.mutationFlushTimer=null;this.lastScrollTime=0;this.latestSnapshot=null;this.config={endpoint:nr,enabled:true,maskInputs:true,maxSessionDuration:ir,flushInterval:5e3,maxBatchSize:100,sampleRate:1,debug:false,bufferDuration:rr,...e};}start(){if(typeof window>"u"||typeof document>"u"||typeof window.addEventListener!="function")return false;if(this.recording)return true;if(!this.config.enabled)return false;if(Math.random()>this.config.sampleRate)return this.log("Session not sampled"),false;this.sessionId=this.getOrCreateSessionId(),this.sessionStartTime=this.getOrCreateStartTime(),this.recording=true,this.events=[],this.prefetchCrossOriginStylesheets();let e=ke({maskInputs:this.config.maskInputs,blockSelector:this.config.blockSelector,maskSelector:this.config.maskSelector});return e&&this.addEvent("snapshot",e),this.setupMutationObserver(),this.setupEventListeners(),this.setupNetworkRecording(),this.setupConsoleRecording(),this.startTrimTimer(),this.log("Recording started (rolling buffer mode):",this.sessionId),true}stop(){if(this.recording){this.recording=false,this.observer&&(this.observer.disconnect(),this.observer=null),this.trimTimer&&(clearInterval(this.trimTimer),this.trimTimer=null),this.mouseMoveFlushTimer&&(clearTimeout(this.mouseMoveFlushTimer),this.mouseMoveFlushTimer=null),this.mutationFlushTimer&&this.flushMutationBuffer(),this.networkRecorder&&(this.networkRecorder.stop(),this.networkRecorder=null),this.consoleRecorder&&(this.consoleRecorder.stop(),this.consoleRecorder=null);for(let e of this.cleanupFns)e();this.cleanupFns=[],on(),this.log("Recording stopped:",this.sessionId),this.sessionId=null;}}isRecording(){return this.recording}getSessionId(){return this.sessionId}setUser(e){this.userContext=e;}async flushOnError(){if(!this.recording||!this.sessionId||this.disabled)return;this.flushMutationBuffer();let e=[];if(this.latestSnapshot&&e.push(this.latestSnapshot),e.push(...this.events),e.length===0)return;this.events=[],this.latestSnapshot=null;let t=ke({maskInputs:this.config.maskInputs,blockSelector:this.config.blockSelector,maskSelector:this.config.maskSelector});t&&this.addEvent("snapshot",t);let n=this.config.replayEndpoint||`${this.config.endpoint}/api/replays`;try{let i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({sessionId:this.sessionId,events:e,startedAt:new Date(this.sessionStartTime).toISOString(),pageUrl:typeof location<"u"&&location?location.href:void 0,pageTitle:typeof document<"u"?document.title:void 0,userAgent:typeof navigator<"u"?navigator.userAgent:void 0,userId:this.userContext?.id,trigger:"error"})});if(!i.ok)throw new Error(`HTTP ${i.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} replay events (error-triggered)`);}catch(i){if(this.flushFailures++,this.flushFailures>=Ze){this.disabled=true,console.warn(`[SitePong Replay] Disabled after ${Ze} consecutive failures. Check that ${n} is accessible and has proper CORS headers.`);return}this.log(`Failed to flush replay events (attempt ${this.flushFailures}/${Ze}):`,i);}}async flush(){return this.flushOnError()}addEvent(e,t){if(!this.recording)return;if(Date.now()-this.sessionStartTime>this.config.maxSessionDuration){this.stop();return}let n={type:e,timestamp:Date.now()-this.sessionStartTime,data:t};e==="snapshot"&&(this.latestSnapshot=n),this.events.push(n);}trimBuffer(){if(this.events.length===0)return;let t=Date.now()-this.sessionStartTime-this.config.bufferDuration,n=0;for(let i=0;i<this.events.length;i++){if(this.events[i].timestamp>=t){n=i;break}this.events[i].type==="snapshot"&&(this.latestSnapshot=this.events[i]),n=i+1;}n>0&&(this.events=this.events.slice(n));}flushMutationBuffer(){this.mutationBuffer&&(this.mutationBuffer.adds.length||this.mutationBuffer.removes.length||this.mutationBuffer.attributes.length||this.mutationBuffer.texts.length)&&this.addEvent("mutation",this.mutationBuffer),this.mutationBuffer=null,this.mutationFlushTimer&&clearTimeout(this.mutationFlushTimer),this.mutationFlushTimer=null;}setupMutationObserver(){typeof MutationObserver>"u"||(this.observer=new MutationObserver(e=>{this.mutationBuffer||(this.mutationBuffer={adds:[],removes:[],attributes:[],texts:[]});for(let t of e)switch(t.type){case "childList":{for(let n of Array.from(t.addedNodes)){let i=Te(n,{maskInputs:this.config.maskInputs,blockSelector:this.config.blockSelector,maskSelector:this.config.maskSelector});i&&this.mutationBuffer.adds.push({parentId:y(t.target),nextId:t.nextSibling?y(t.nextSibling):null,node:i});}for(let n of Array.from(t.removedNodes))this.mutationBuffer.removes.push({parentId:y(t.target),id:y(n)});break}case "attributes":{let n=t.target,i=t.attributeName||"",o=n.getAttribute(i),s={[i]:o},a=n.tagName?.toLowerCase();if(a==="style"||a==="link"&&n.getAttribute("rel")==="stylesheet"){let c=Se(n);c&&(s._cssText=c);}if(i==="class"||i==="style"){let c=Je(n);c&&(s._computedStyle=c);}this.mutationBuffer.attributes.push({id:y(t.target),attributes:s});break}case "characterData":{let n=t.target.textContent||"",i=t.target.parentElement;if(i&&this.config.maskSelector&&i.matches(this.config.maskSelector)&&(n=n.replace(/\S/g,"*")),this.mutationBuffer.texts.push({id:y(t.target),value:n}),i&&i.tagName?.toLowerCase()==="style"){let o=Se(i);o&&this.mutationBuffer.attributes.push({id:y(i),attributes:{_cssText:o}});}break}}this.mutationFlushTimer||(this.mutationFlushTimer=setTimeout(()=>this.flushMutationBuffer(),1e3));}),this.observer.observe(document.documentElement,{childList:true,subtree:true,attributes:true,characterData:true,attributeOldValue:false}));}setupEventListeners(){let e=d=>{this.mouseMoveBuffer.push({x:d.clientX,y:d.clientY,t:Date.now()-this.sessionStartTime}),this.mouseMoveFlushTimer||(this.mouseMoveFlushTimer=setTimeout(()=>{if(this.mouseMoveBuffer.length>0){let f={positions:[...this.mouseMoveBuffer]};this.addEvent("mouse_move",f),this.mouseMoveBuffer=[];}this.mouseMoveFlushTimer=null;},1e3));},t=d=>{let f=d.target;this.addEvent("mouse_click",{x:d.clientX,y:d.clientY,targetId:y(f),button:d.button}),this.takeInteractionSnapshot();},n=d=>{let f=d.target;this.addEvent("mouse_click",{x:d.clientX,y:d.clientY,targetId:y(f),button:2}),this.takeInteractionSnapshot();},i=()=>{this.addEvent("mouse_leave",{});},o=d=>{let f=d.touches[0];if(!f)return;let h=d.target;this.addEvent("touch",{x:f.clientX,y:f.clientY,targetId:y(h)}),this.takeInteractionSnapshot();},s=null,a=()=>{s&&clearTimeout(s),s=setTimeout(()=>{let d={id:0,x:window.scrollX,y:window.scrollY};this.addEvent("scroll",d),this.takeInteractionSnapshot();},1e3);},c=d=>{let f=d.target;if(!f)return;let h={id:y(f),value:this.config.maskInputs?"***":f.value};"checked"in f&&(h.isChecked=f.checked),this.addEvent("input",h);},u=()=>{this.addEvent("resize",{width:window.innerWidth,height:window.innerHeight});},p=d=>{d.target&&d.target!==document&&this.addEvent("focus",{id:y(d.target)});},g=d=>{d.target&&d.target!==document&&this.addEvent("blur",{id:y(d.target)});};document.addEventListener("mousemove",e,{passive:true}),document.addEventListener("click",t,{passive:true}),document.addEventListener("contextmenu",n,{passive:true}),document.documentElement.addEventListener("mouseleave",i,{passive:true}),document.addEventListener("touchstart",o,{passive:true}),window.addEventListener("scroll",a,{passive:true}),document.addEventListener("input",c,{passive:true}),window.addEventListener("resize",u,{passive:true}),document.addEventListener("focus",p,{passive:true,capture:true}),document.addEventListener("blur",g,{passive:true,capture:true}),this.cleanupFns.push(()=>document.removeEventListener("mousemove",e),()=>document.removeEventListener("click",t),()=>document.removeEventListener("contextmenu",n),()=>document.documentElement.removeEventListener("mouseleave",i),()=>document.removeEventListener("touchstart",o),()=>window.removeEventListener("scroll",a),()=>document.removeEventListener("input",c),()=>window.removeEventListener("resize",u),()=>document.removeEventListener("focus",p,{capture:true}),()=>document.removeEventListener("blur",g,{capture:true}));}setupNetworkRecording(){if(!this.config.recordNetwork)return;let e=this.config.replayEndpoint||this.config.endpoint;this.networkRecorder=new Z(t=>{this.addEvent("network",t.data);},{captureHeaders:this.config.captureNetworkHeaders,urlFilter:t=>!t.startsWith(e)}),this.networkRecorder.start();}setupConsoleRecording(){this.config.recordConsole&&(this.consoleRecorder=new ee(e=>{this.addEvent("console",e.data);},{levels:this.config.consoleLevels}),this.consoleRecorder.start());}startTrimTimer(){this.trimTimer=setInterval(()=>{this.trimBuffer();},or);}takeInteractionSnapshot(){let e=Date.now();if(e-this.lastSnapshotTime<this.snapshotCooldown)return;this.lastSnapshotTime=e;let t=ke({maskInputs:this.config.maskInputs,blockSelector:this.config.blockSelector,maskSelector:this.config.maskSelector});t&&this.addEvent("snapshot",t);}getOrCreateSessionId(){let e="__sp_replay_session";try{let n=sessionStorage.getItem(e);if(n)return n}catch{}let t=`rep_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,10)}`;try{sessionStorage.setItem(e,t);}catch{}return t}getOrCreateStartTime(){let e="__sp_replay_start";try{let n=sessionStorage.getItem(e);if(n)return parseInt(n,10)}catch{}let t=Date.now();try{sessionStorage.setItem(e,String(t));}catch{}return t}prefetchCrossOriginStylesheets(){if(typeof document>"u")return;let e=document.querySelectorAll('link[rel="stylesheet"]');for(let t of Array.from(e)){let n=t;if(n.href&&n.sheet)try{n.sheet.cssRules;}catch{rn(n.href).catch(()=>{});}}}log(...e){this.config.debug&&console.log("[SitePong Replay]",...e);}};function et(){let r={uaSpoofed:false,antiDetectBrowser:false,canvasNoise:false,canvasBlocked:false,webglSpoofed:false,webglBlocked:false,vmIndicators:[],platformMismatch:false,pluginAnomaly:false,featureAnomaly:false,geolocationSpoofed:false,mitmIndicators:[]},e=0,t=sr(r);e+=t;let n=ar(r);e+=n;let i=cr(r);e+=i;let o=lr(r);e+=o;let s=ur(r);e+=s;let a=dr(r);return e+=a,e=Math.min(e,1),{browserTampered:r.uaSpoofed||r.antiDetectBrowser||r.platformMismatch,canvasTampered:r.canvasNoise||r.canvasBlocked,webglTampered:r.webglSpoofed||r.webglBlocked,vmDetected:r.vmIndicators.length>=2,geolocationSpoofed:r.geolocationSpoofed,mitmDetected:r.mitmIndicators.length>=1,confidence:e,signals:r}}function sr(r){if(typeof navigator>"u"||typeof window>"u")return 0;let e=0,t=navigator.userAgent,n=navigator.platform||"",i=/Windows/.test(t),o=/Mac/.test(t),s=/Linux/.test(t)&&!/Android/.test(t),a=/Win/.test(n),c=/Mac/.test(n),u=/Linux/.test(n);(i&&!a||o&&!c||s&&!u)&&(r.platformMismatch=true,r.uaSpoofed=true,e+=.3);let p=/Chrome\/\d+/.test(t)&&!/Edge|OPR|Brave/.test(t);p&&!("chrome"in window||"CSS"in window&&"paintWorklet"in window.CSS)&&!("brave"in navigator)&&(r.uaSpoofed=true,e+=.2),/Firefox\/\d+/.test(t)&&!/Seamonkey/.test(t)&&("InstallTrigger"in window||CSS.supports("-moz-appearance","none")||(r.uaSpoofed=true,e+=.2));let d=navigator;if(d.userAgentData?.brands){let m=d.userAgentData.brands.map(I=>I.brand);(m.length===0||m.every(I=>I===""||I==="Not A;Brand"))&&(r.antiDetectBrowser=true,e+=.25);}/mobile|android|iphone|ipad/i.test(t)||(navigator.plugins?.length||0)===0&&p&&(r.pluginAnomaly=true,e+=.1);let f=navigator.hardwareConcurrency||0,h=navigator.deviceMemory||0;return f>0&&h>0&&f>=16&&h<=1&&(r.featureAnomaly=true,e+=.15),Math.min(e,.5)}function ar(r){if(typeof document>"u")return 0;let e=0;try{let t=document.createElement("canvas");t.width=100,t.height=20;let n=t.getContext("2d");if(!n)return r.canvasBlocked=!0,.1;n.fillStyle="#ff0000",n.fillRect(0,0,100,20),n.fillStyle="#00ff00",n.font="12px Arial",n.fillText("SitePong",5,14);let i=t.toDataURL();n.clearRect(0,0,100,20),n.fillStyle="#ff0000",n.fillRect(0,0,100,20),n.fillStyle="#00ff00",n.font="12px Arial",n.fillText("SitePong",5,14);let o=t.toDataURL();i!==o&&(r.canvasNoise=!0,e+=.35);let a=n.getImageData(0,0,100,20).data,c=!0,u=!0,p=a[0];for(let d=0;d<a.length;d+=4)(a[d]!==0||a[d+1]!==0||a[d+2]!==0)&&(c=!1),a[d]!==p&&(u=!1);(c||u)&&(r.canvasBlocked=!0,e+=.2);let g=Object.getOwnPropertyDescriptor(HTMLCanvasElement.prototype,"toDataURL");g&&g.value!==HTMLCanvasElement.prototype.toDataURL&&(r.canvasNoise=!0,e+=.3);}catch{r.canvasBlocked=true,e+=.1;}return Math.min(e,.4)}function cr(r){if(typeof document>"u")return 0;let e=0;try{let t=document.createElement("canvas"),n=t.getContext("webgl")||t.getContext("experimental-webgl");if(!n||!(n instanceof WebGLRenderingContext))return r.webglBlocked=!0,.1;let i=n.getExtension("WEBGL_debug_renderer_info");if(!i)return r.webglBlocked=!0,.1;let o=n.getParameter(i.UNMASKED_VENDOR_WEBGL),s=n.getParameter(i.UNMASKED_RENDERER_WEBGL),a=["Brian Paul","Mesa","VMware"];["llvmpipe","softpipe","Mesa","SwiftShader"].some(h=>s.includes(h))&&!a.some(h=>o.includes(h))&&(r.webglSpoofed=!0,e+=.25);let u=navigator.userAgent,p=/mobile|android|iphone|ipad/i.test(u),g=/GeForce|Radeon|Intel.*HD|GTX|RTX|Vega/i.test(s);p&&g&&(r.webglSpoofed=!0,e+=.3);let d=Object.getOwnPropertyDescriptor(WebGLRenderingContext.prototype,"getParameter");d&&typeof d.value=="function"&&(d.value.toString().includes("[native code]")||(r.webglSpoofed=!0,e+=.35)),(n.getSupportedExtensions()||[]).length<5&&g&&(r.webglSpoofed=!0,e+=.1);}catch{r.webglBlocked=true,e+=.1;}return Math.min(e,.4)}function lr(r){if(typeof navigator>"u"||typeof window>"u")return 0;let e=[],t=navigator.userAgent;try{let s=document.createElement("canvas"),a=s.getContext("webgl")||s.getContext("experimental-webgl");if(a&&a instanceof WebGLRenderingContext){let c=a.getExtension("WEBGL_debug_renderer_info");if(c){let u=a.getParameter(c.UNMASKED_RENDERER_WEBGL).toLowerCase(),p=a.getParameter(c.UNMASKED_VENDOR_WEBGL).toLowerCase(),g=["vmware","virtualbox","hyper-v","parallels","qemu","llvmpipe","mesa"],d=["vmware","innotek","microsoft basic","parallels"];for(let f of g)u.includes(f)&&e.push(`webgl_renderer:${f}`);for(let f of d)p.includes(f)&&e.push(`webgl_vendor:${f}`);}}}catch{}if(typeof screen<"u"){let s=screen.width,a=screen.height;[[800,600],[1024,768],[1280,800]].some(([u,p])=>s===u&&a===p)&&screen.colorDepth===24&&navigator.hardwareConcurrency<=2&&e.push("vm_resolution");}let n=navigator.hardwareConcurrency||0,i=navigator.deviceMemory||0;if(n>0&&n<=2&&i>0&&i<=2&&(/mobile|android|iphone/i.test(t)||e.push("low_hw_specs")),typeof performance<"u"){let s=[];for(let c=0;c<10;c++)s.push(performance.now());new Set(s.map(c=>Math.floor(c*1e3))).size<=3&&s.length===10&&e.push("coarse_timing");}if(typeof navigator<"u"){let s=navigator.connection;s&&s.downlink&&s.downlink>=10&&s.rtt&&s.rtt<=5&&e.push("cloud_vm_network");}return r.vmIndicators=e,Math.min(e.length*.15,.5)}function ur(r){if(typeof navigator>"u")return 0;let e=0;if("geolocation"in navigator){let t=Object.getOwnPropertyDescriptor(navigator,"geolocation");t&&t.configurable===false&&t.get&&(t.get.toString().includes("[native code]")||(r.geolocationSpoofed=true,e+=.3));try{let n=Object.getOwnPropertyDescriptor(Geolocation.prototype,"getCurrentPosition");n?.value&&(n.value.toString().includes("[native code]")||(r.geolocationSpoofed=!0,e+=.3));}catch{}}if(typeof window<"u")try{let t=Object.getPrototypeOf(navigator),n=Object.getOwnPropertyDescriptor(t,"geolocation");n&&n.get&&!n.get.toString().includes("[native code]")&&(r.geolocationSpoofed=!0,e+=.2);}catch{}return Math.min(e,.4)}function dr(r){if(typeof window>"u"||typeof document>"u")return 0;let e=[];if(window.location?.protocol==="https:"){let n=document.querySelectorAll("script[src]");for(let i=0;i<n.length;i++){let o=n[i].getAttribute("src")||"";if(o.startsWith("http://")&&!o.includes("localhost")){e.push("mixed_content_script");break}}}let t=document.querySelectorAll("iframe");for(let n=0;n<t.length;n++){let i=t[n].getAttribute("src")||"";if(i&&!i.startsWith(window.location?.origin||"")&&!i.startsWith("about:")&&!i.startsWith("javascript:")){let o=window.getComputedStyle(t[n]);(o.display==="none"||o.visibility==="hidden"||parseInt(o.width)<=1||parseInt(o.height)<=1)&&e.push("hidden_iframe");}}if("serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(n=>{for(let i of n){let o=i.active?.scriptURL||"";o&&!o.startsWith(window.location?.origin||"")&&e.push("foreign_service_worker");}}).catch(()=>{}),typeof performance<"u"&&performance.getEntriesByType)try{let n=performance.getEntriesByType("navigation")[0];if(n){let i=n.connectEnd-n.connectStart,o=n.requestStart-n.secureConnectionStart;i>1e3&&o>500&&e.push("slow_tls_handshake");}}catch{}if(window.location?.protocol==="https:"&&typeof performance<"u")try{let n=performance.getEntriesByType("resource");for(let i of n.slice(0,20))if(i.transferSize===0&&i.encodedBodySize>0&&!i.name.includes("cache")){e.push("intercepted_resource");break}}catch{}return r.mitmIndicators=e,Math.min(e.length*.2,.5)}function an(){return {userAgent:typeof navigator<"u"?navigator.userAgent:"",language:typeof navigator<"u"?navigator.language:"",languages:typeof navigator<"u"?Array.from(navigator.languages||[]):[],platform:typeof navigator<"u"&&navigator.platform||"",screenWidth:typeof screen<"u"?screen.width:0,screenHeight:typeof screen<"u"?screen.height:0,screenColorDepth:typeof screen<"u"?screen.colorDepth:0,devicePixelRatio:typeof window<"u"&&window.devicePixelRatio||1,timezoneOffset:new Date().getTimezoneOffset(),timezone:Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone||"",sessionStorage:pr(),localStorage:fr(),indexedDB:typeof indexedDB<"u",cookieEnabled:typeof navigator<"u"?navigator.cookieEnabled:false,hardwareConcurrency:typeof navigator<"u"&&navigator.hardwareConcurrency||0,maxTouchPoints:typeof navigator<"u"&&navigator.maxTouchPoints||0,deviceMemory:typeof navigator<"u"?navigator.deviceMemory:void 0}}async function cn(){let r={};r.canvasFingerprint=gr();let e=hr();return r.webglVendor=e.vendor,r.webglRenderer=e.renderer,r.audioFingerprint=await mr(),r.fontFingerprint=Er(),r.mathFingerprint=Cr(),r.webglRenderHash=Mr(),r.cssFeatureHash=Rr(),r.localIps=await Ir(),r}async function tt(r){let t={...an()};r&&(t.extended=await cn());let n=un();return t.smart=n,t.incognito=n.incognito,t.bot=n.bot,t}async function ln(r){let e={userAgent:r.userAgent,language:r.language,languages:r.languages,platform:r.platform,screenWidth:r.screenWidth,screenHeight:r.screenHeight,screenColorDepth:r.screenColorDepth,devicePixelRatio:r.devicePixelRatio,timezoneOffset:r.timezoneOffset,timezone:r.timezone,hardwareConcurrency:r.hardwareConcurrency,maxTouchPoints:r.maxTouchPoints,deviceMemory:r.deviceMemory};return r.extended&&(e.canvasFingerprint=r.extended.canvasFingerprint,e.webglVendor=r.extended.webglVendor,e.webglRenderer=r.extended.webglRenderer,e.audioFingerprint=r.extended.audioFingerprint,e.fontFingerprint=r.extended.fontFingerprint,e.mathFingerprint=r.extended.mathFingerprint,e.webglRenderHash=r.extended.webglRenderHash,e.cssFeatureHash=r.extended.cssFeatureHash,e.localIps=r.extended.localIps),e}function un(){let r={};r.incognito=vr(),r.bot=yr(),r.privacyBrowser=br(),r.devToolsOpen=wr(),r.connectionType=Sr(),r.doNotTrack=Tr(),r.notificationsEnabled=kr();let e=xr();r.deviceFirstSeen=e.firstSeen,r.deviceVisitCount=e.visitCount;let t=et();return r.browserTampered=t.browserTampered,r.canvasTampered=t.canvasTampered,r.webglTampered=t.webglTampered,r.vmDetected=t.vmDetected,r.vmIndicators=t.signals.vmIndicators,r}function pr(){try{let r="__sp_test__";return sessionStorage.setItem(r,"1"),sessionStorage.removeItem(r),!0}catch{return false}}function fr(){try{let r="__sp_test__";return localStorage.setItem(r,"1"),localStorage.removeItem(r),!0}catch{return false}}function gr(){if(!(typeof document>"u"))try{let r=document.createElement("canvas"),e=r.getContext("2d");return e?(r.width=200,r.height=50,e.textBaseline="top",e.font="14px Arial",e.fillStyle="#f60",e.fillRect(0,0,200,50),e.fillStyle="#069",e.fillText("SitePong fingerprint",2,15),e.fillStyle="rgba(102, 204, 0, 0.7)",e.fillText("SitePong fingerprint",4,17),H(r.toDataURL())):void 0}catch{return}}function hr(){if(typeof document>"u")return {};try{let r=document.createElement("canvas"),e=r.getContext("webgl")||r.getContext("experimental-webgl");if(!e||!(e instanceof WebGLRenderingContext))return {};let t=e.getExtension("WEBGL_debug_renderer_info");return t?{vendor:e.getParameter(t.UNMASKED_VENDOR_WEBGL),renderer:e.getParameter(t.UNMASKED_RENDERER_WEBGL)}:{}}catch{return {}}}async function mr(){if(!(typeof window>"u"||typeof OfflineAudioContext>"u"))try{let r=new OfflineAudioContext(1,4500,44100),e=r.createOscillator();e.type="triangle",e.frequency.setValueAtTime(1e4,r.currentTime);let t=r.createDynamicsCompressor();t.threshold.setValueAtTime(-50,r.currentTime),t.knee.setValueAtTime(40,r.currentTime),t.ratio.setValueAtTime(12,r.currentTime),t.attack.setValueAtTime(0,r.currentTime),t.release.setValueAtTime(.25,r.currentTime),e.connect(t),t.connect(r.destination),e.start(0);let i=(await r.startRendering()).getChannelData(0),o=0;for(let s=4e3;s<4500;s++)o+=Math.abs(i[s]);return H(`audio:${o.toFixed(6)}`)}catch{return}}function vr(){if(typeof window>"u")return false;try{let r="__sp_incognito_test__";try{localStorage.setItem(r,new Array(100).join("x")),localStorage.removeItem(r);}catch{return !0}if(typeof indexedDB<"u")try{let t=indexedDB.open("__sp_test__");t.onerror=()=>{};}catch{return !0}if("webkitRequestFileSystem"in window){let t=!1;try{window.webkitRequestFileSystem(0,1,()=>{t=!1;},()=>{t=!0;});}catch{}if(t)return !0}let e=performance;if(e.memory){let t=e.memory.jsHeapSizeLimit||0;if(t>0&&t<1073741824)return !0}return !1}catch{return false}}function yr(){if(typeof navigator>"u")return false;let r=navigator.userAgent.toLowerCase();return !!(["bot","crawler","spider","headless","phantom","puppeteer","selenium","webdriver","playwright"].some(t=>r.includes(t))||"webdriver"in navigator&&navigator.webdriver||navigator.plugins&&navigator.plugins.length===0&&!/mobile|android|iphone/i.test(r))}function br(){if(typeof navigator>"u")return false;let r=navigator.userAgent.toLowerCase();return !!("brave"in navigator||r.includes("focus")&&r.includes("firefox")||r.includes("duckduckgo")||typeof window<"u"&&(screen.width===1e3&&screen.height===1e3||new Date().getTimezoneOffset()===0&&navigator.language!=="en"))}function wr(){if(typeof window>"u")return false;try{let r=window.outerWidth-window.innerWidth>160,e=window.outerHeight-window.innerHeight>160;if(r||e)return !0}catch{}return false}function Sr(){if(typeof navigator>"u")return;let r=navigator.connection;if(r)return r.effectiveType||r.type||void 0}function Tr(){if(typeof navigator>"u")return false;let r=navigator.doNotTrack;return r==="1"||r==="yes"}function kr(){return typeof Notification>"u"?false:Notification.permission==="granted"}function xr(){let r="sitepong_device_age",e={visitCount:1};if(typeof localStorage>"u")return e;try{let t=localStorage.getItem(r);if(t){let n=JSON.parse(t);e.firstSeen=n.firstSeen,e.visitCount=(n.visitCount||0)+1;}else e.firstSeen=new Date().toISOString();localStorage.setItem(r,JSON.stringify({firstSeen:e.firstSeen,visitCount:e.visitCount}));}catch{}return e}function Er(){if(!(typeof document>"u"))try{let r=["monospace","sans-serif","serif"],e=["Arial","Arial Black","Courier New","Georgia","Helvetica","Impact","Lucida Console","Lucida Sans Unicode","Palatino Linotype","Tahoma","Times New Roman","Trebuchet MS","Verdana","Comic Sans MS","Courier","Garamond","Monaco"],t="mmmmmmmmmmlli",n="72px",o=document.createElement("canvas").getContext("2d");if(!o)return;let s={};for(let c of r)o.font=`${n} ${c}`,s[c]=o.measureText(t).width;let a=[];for(let c of e)for(let u of r)if(o.font=`${n} '${c}', ${u}`,o.measureText(t).width!==s[u]){a.push(c);break}return H(a.join(","))}catch{return}}function Cr(){try{let r=[Math.tan(-1e300),Math.log(1e-10),Math.pow(Math.PI,-100),Math.acos(.5),Math.atan2(1,1),Math.exp(1),Math.sinh(1)];return H(r.map(e=>e.toString()).join(","))}catch{return}}function Mr(){if(!(typeof document>"u"))try{let r=document.createElement("canvas");r.width=50,r.height=50;let e=r.getContext("webgl");if(!e)return;let t=e.createShader(e.VERTEX_SHADER);e.shaderSource(t,"attribute vec2 p;void main(){gl_Position=vec4(p,0,1);}"),e.compileShader(t);let n=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(n,"precision mediump float;void main(){gl_FragColor=vec4(.86,.27,.33,1);}"),e.compileShader(n);let i=e.createProgram();e.attachShader(i,t),e.attachShader(i,n),e.linkProgram(i),e.useProgram(i);let o=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,o),e.bufferData(e.ARRAY_BUFFER,new Float32Array([0,.5,-.5,-.5,.5,-.5]),e.STATIC_DRAW);let s=e.getAttribLocation(i,"p");return e.enableVertexAttribArray(s),e.vertexAttribPointer(s,2,e.FLOAT,!1,0,0),e.clearColor(0,0,0,1),e.clear(e.COLOR_BUFFER_BIT),e.drawArrays(e.TRIANGLES,0,3),H(r.toDataURL())}catch{return}}function Rr(){if(!(typeof CSS>"u"||typeof CSS.supports!="function"))try{let e=["display: grid","display: flex","display: contents","position: sticky","backdrop-filter: blur(1px)","gap: 1px","aspect-ratio: 1","contain: paint","overflow: clip","accent-color: red","color: oklch(0.5 0.2 0)","container-type: inline-size","text-wrap: balance","view-transition-name: x","anchor-name: --x","field-sizing: content"].map(t=>CSS.supports(t)?"1":"0").join("");return H(e)}catch{return}}async function Ir(){if(!(typeof window>"u"||typeof RTCPeerConnection>"u"))try{let r=new Set,e=new RTCPeerConnection({iceServers:[]});e.createDataChannel("");let t=await e.createOffer();return await e.setLocalDescription(t),new Promise(n=>{let i=setTimeout(()=>{e.close(),n(r.size>0?Array.from(r):void 0);},1e3);e.onicecandidate=o=>{if(!o.candidate){clearTimeout(i),e.close(),n(r.size>0?Array.from(r):void 0);return}let s=o.candidate.candidate.match(/([0-9]{1,3}\.([0-9]{1,3}\.){2}[0-9]{1,3})/);s&&s[1]&&!s[1].startsWith("0.")&&r.add(s[1]);};})}catch{return}}function H(r){let e=0;for(let t=0;t<r.length;t++){let n=r.charCodeAt(t);e=(e<<5)-e+n,e=e&e;}return Math.abs(e).toString(16)}var ne=class{constructor(){this.mousePoints=[];this.keyDownTimes=new Map;this.keyIntervals=[];this.keyHoldTimes=[];this.lastKeyTime=0;this.scrollEvents=[];this.clickTimes=[];this.running=false;this.maxSamples=500;this.handleMouseMove=e=>{this.mousePoints.length>=this.maxSamples||this.mousePoints.push({x:e.clientX,y:e.clientY,t:Date.now()});};this.handleKeyDown=e=>{if(this.keyIntervals.length>=this.maxSamples)return;let t=Date.now();this.keyDownTimes.set(e.key,t),this.lastKeyTime>0&&this.keyIntervals.push(t-this.lastKeyTime),this.lastKeyTime=t;};this.handleKeyUp=e=>{let t=this.keyDownTimes.get(e.key);t&&(this.keyHoldTimes.push(Date.now()-t),this.keyDownTimes.delete(e.key));};this.handleScroll=()=>{this.scrollEvents.length>=this.maxSamples||this.scrollEvents.push({deltaY:window.scrollY,t:Date.now()});};this.handleClick=()=>{this.clickTimes.length>=this.maxSamples||this.clickTimes.push(Date.now());};}start(){this.running||typeof window>"u"||typeof window.addEventListener!="function"||(this.running=true,window.addEventListener("mousemove",this.handleMouseMove,{passive:true}),window.addEventListener("keydown",this.handleKeyDown,{passive:true}),window.addEventListener("keyup",this.handleKeyUp,{passive:true}),window.addEventListener("scroll",this.handleScroll,{passive:true}),window.addEventListener("click",this.handleClick,{passive:true}));}stop(){!this.running||typeof window>"u"||typeof window.removeEventListener!="function"||(this.running=false,window.removeEventListener("mousemove",this.handleMouseMove),window.removeEventListener("keydown",this.handleKeyDown),window.removeEventListener("keyup",this.handleKeyUp),window.removeEventListener("scroll",this.handleScroll),window.removeEventListener("click",this.handleClick));}getMetrics(){let e=this.analyzeMouseMovement(),t=this.analyzeKeyboard(),n=this.analyzeScroll(),i=this.analyzeClicks(),o=this.calculateHumanScore(e,t,n,i);return {mouse:e,keyboard:t,scroll:n,clicks:i,score:o}}reset(){this.mousePoints=[],this.keyDownTimes.clear(),this.keyIntervals=[],this.keyHoldTimes=[],this.lastKeyTime=0,this.scrollEvents=[],this.clickTimes=[];}analyzeMouseMovement(){if(this.mousePoints.length<3)return {totalMovements:this.mousePoints.length,averageSpeed:0,maxSpeed:0,averageAcceleration:0,straightLineRatio:0,jitter:0,hasMovement:false};let e=[],t=[],n=0,i=0,o=0;for(let u=1;u<this.mousePoints.length;u++){let p=this.mousePoints[u-1],g=this.mousePoints[u],d=g.t-p.t||1,f=g.x-p.x,h=g.y-p.y,m=Math.sqrt(f*f+h*h),I=m/d;if(e.push(I),m<3&&m>0&&o++,u>=2){let S=this.mousePoints[u-2],fn=S.x+(g.x-S.x)*((p.t-S.t)/(g.t-S.t)),gn=S.y+(g.y-S.y)*((p.t-S.t)/(g.t-S.t)),hn=Math.sqrt((p.x-fn)**2+(p.y-gn)**2);i++,hn<2&&n++;}if(u>=2){let S=e[e.length-2]||0;t.push(Math.abs(I-S)/d);}}let s=e.reduce((u,p)=>u+p,0)/e.length,a=Math.max(...e),c=t.length>0?t.reduce((u,p)=>u+p,0)/t.length:0;return {totalMovements:this.mousePoints.length,averageSpeed:Math.round(s*1e3)/1e3,maxSpeed:Math.round(a*1e3)/1e3,averageAcceleration:Math.round(c*1e3)/1e3,straightLineRatio:i>0?n/i:0,jitter:this.mousePoints.length>0?o/this.mousePoints.length:0,hasMovement:true}}analyzeKeyboard(){if(this.keyIntervals.length<2)return {totalKeystrokes:this.keyIntervals.length,averageInterval:0,intervalVariance:0,holdTimeAverage:0,holdTimeVariance:0,hasKeystrokes:false};let e=this.keyIntervals.reduce((o,s)=>o+s,0)/this.keyIntervals.length,t=this.variance(this.keyIntervals),n=this.keyHoldTimes.length>0?this.keyHoldTimes.reduce((o,s)=>o+s,0)/this.keyHoldTimes.length:0,i=this.keyHoldTimes.length>0?this.variance(this.keyHoldTimes):0;return {totalKeystrokes:this.keyIntervals.length+1,averageInterval:Math.round(e),intervalVariance:Math.round(t),holdTimeAverage:Math.round(n),holdTimeVariance:Math.round(i),hasKeystrokes:true}}analyzeScroll(){if(this.scrollEvents.length<2)return {totalScrolls:this.scrollEvents.length,averageSpeed:0,smoothness:0,hasScroll:false};let e=[];for(let s=1;s<this.scrollEvents.length;s++){let a=this.scrollEvents[s].t-this.scrollEvents[s-1].t||1,c=Math.abs(this.scrollEvents[s].deltaY-this.scrollEvents[s-1].deltaY);e.push(c/a);}let n=e.reduce((s,a)=>s+a,0)/e.length,i=this.variance(e),o=n>0?Math.min(1,n/(i+n)):0;return {totalScrolls:this.scrollEvents.length,averageSpeed:Math.round(n*100)/100,smoothness:Math.round(o*100)/100,hasScroll:true}}analyzeClicks(){if(this.clickTimes.length<2)return {totalClicks:this.clickTimes.length,averageInterval:0,intervalVariance:0,doubleClickCount:0,hasClicks:this.clickTimes.length>0};let e=[],t=0;for(let o=1;o<this.clickTimes.length;o++){let s=this.clickTimes[o]-this.clickTimes[o-1];e.push(s),s<500&&t++;}let n=e.reduce((o,s)=>o+s,0)/e.length,i=this.variance(e);return {totalClicks:this.clickTimes.length,averageInterval:Math.round(n),intervalVariance:Math.round(i),doubleClickCount:t,hasClicks:true}}calculateHumanScore(e,t,n,i){let o=.5,s=0;if(e.hasMovement){s++;let a=.5;e.jitter>.05&&(a+=.15),e.straightLineRatio<.5?a+=.15:e.straightLineRatio>.9&&(a-=.2),e.averageSpeed>0&&e.maxSpeed/e.averageSpeed>3&&(a+=.1),e.averageAcceleration>0&&(a+=.1),o+=Math.max(0,Math.min(1,a))-.5;}if(t.hasKeystrokes){s++;let a=.5;t.intervalVariance>1e3?a+=.2:t.intervalVariance<100&&(a-=.2),(t.averageInterval>0?Math.sqrt(t.intervalVariance)/t.averageInterval:0)>.3&&(a+=.15),t.holdTimeVariance>500&&(a+=.1),o+=Math.max(0,Math.min(1,a))-.5;}if(n.hasScroll){s++;let a=.5;n.smoothness>.3&&n.smoothness<.9&&(a+=.2),o+=Math.max(0,Math.min(1,a))-.5;}if(i.hasClicks){s++;let a=.5;i.intervalVariance>5e4?a+=.15:i.intervalVariance<100&&(a-=.2),o+=Math.max(0,Math.min(1,a))-.5;}return s===0?.3:Math.max(0,Math.min(1,o))}variance(e){if(e.length<2)return 0;let t=e.reduce((n,i)=>n+i,0)/e.length;return e.reduce((n,i)=>n+(i-t)**2,0)/(e.length-1)}};async function nt(){let r={webrtcLeak:null,timezoneIPMismatch:false,dnsLeak:null,connectionType:null,multipleIPs:false,torBrowser:false,knownVPNExtension:false},e=0,t=false,n=false,i=false;r.torBrowser=Pr(),r.torBrowser&&(i=true,e+=.9);try{r.webrtcLeak=await Lr(),r.webrtcLeak&&(t=!0,e+=.3);}catch{r.webrtcLeak=null;}r.connectionType=Dr(),(r.connectionType==="unknown"||r.connectionType===null)&&(e+=.05),r.knownVPNExtension=Fr(),r.knownVPNExtension&&(t=true,e+=.4);let o=Intl.DateTimeFormat().resolvedOptions().timeZone,s=navigator.language;if(o&&s){let a=_r(o),c=s.split("-")[1]?.toUpperCase();a&&c&&a!==c&&(r.timezoneIPMismatch=true,e+=.1);}return e=Math.min(e,1),e<.3&&(t=false,n=false),{vpnDetected:t,proxyDetected:n,torDetected:i,confidence:e,signals:r}}function Pr(){if(typeof window>"u")return false;let r=[];r.push(window.screen.width===1e3&&window.screen.height===1e3),r.push(!window.MediaDevices),r.push(navigator.plugins.length===0),r.push(new Date().getTimezoneOffset()===0);let e=navigator.userAgent;return r.push(e.includes("Firefox")&&!e.includes("Chrome")),r.filter(Boolean).length>=3}async function Lr(){return typeof window>"u"||!window.RTCPeerConnection?false:new Promise(r=>{let e=setTimeout(()=>r(false),3e3),t=new Set;try{let n=new RTCPeerConnection({iceServers:[{urls:"stun:stun.l.google.com:19302"}]});n.createDataChannel(""),n.onicecandidate=i=>{if(!i.candidate){clearTimeout(e),n.close(),r(t.size>1);return}let s=i.candidate.candidate.match(/(\d{1,3}\.){3}\d{1,3}/);s&&t.add(s[0]);},n.createOffer().then(i=>n.setLocalDescription(i)).catch(()=>{clearTimeout(e),r(!1);});}catch{clearTimeout(e),r(false);}})}function Dr(){if(typeof navigator>"u")return null;let r=navigator;return r.connection&&(r.connection.type||r.connection.effectiveType)||null}function Fr(){if(typeof document>"u"||!document.body)return false;let e=["[data-windscribe]","[data-nord]",".surfshark-extension","#vpn-indicator","[data-expressvpn]"];for(let t of e)try{if(document.querySelector(t))return !0}catch{}return false}function _r(r){return {"America/New_York":"US","America/Chicago":"US","America/Denver":"US","America/Los_Angeles":"US","Europe/London":"GB","Europe/Paris":"FR","Europe/Berlin":"DE","Europe/Madrid":"ES","Europe/Rome":"IT","Asia/Tokyo":"JP","Asia/Shanghai":"CN","Asia/Kolkata":"IN","Asia/Seoul":"KR","Australia/Sydney":"AU","America/Toronto":"CA","America/Sao_Paulo":"BR","America/Mexico_City":"MX"}[r]||null}var Ar="https://ingest.sitepong.com",rt="sitepong_visitor",dn=720*60*60*1e3,pn="__sp_vid",Nr=63072e3,re=class{constructor(e){this.cachedVisitor=null;this.pendingRequest=null;this.config={endpoint:Ar,enabled:true,debug:false,...e},this.behaviorAnalyzer=new ne,this.config.enabled&&typeof window<"u"&&typeof window.addEventListener=="function"&&this.behaviorAnalyzer.start(),this.loadFromStorage();}async getVisitorId(){if(!this.config.enabled)throw new Error("Fingerprint is not enabled");L()?ie():null;if(this.cachedVisitor&&!this.isCacheExpired())return this.log("Returning cached visitor ID:",this.cachedVisitor.result.visitorId),this.cachedVisitor.result;if(this.pendingRequest)return this.pendingRequest;this.pendingRequest=this.fetchVisitorId();try{return await this.pendingRequest}finally{this.pendingRequest=null;}}async getDeviceSignals(){return tt(this.config.extendedSignals??false)}async getFraudCheck(){let[e,t,n]=await Promise.all([this.getVisitorId(),this.getDeviceSignals(),nt().catch(()=>null)]),i=this.behaviorAnalyzer.getMetrics();t.behavior={score:i.score,mouseMovements:i.mouse.totalMovements,keystrokes:i.keyboard.totalKeystrokes,scrolls:i.scroll.totalScrolls,clicks:i.clicks.totalClicks,isHuman:i.score>.6};let o=n?.vpnDetected||n?.torDetected||false;return {visitorId:e.visitorId,riskScore:this.calculateRiskScore(t,o),signals:t,flags:{incognito:t.smart?.incognito||t.incognito,bot:t.smart?.bot||t.bot||!t.behavior.isHuman,vpn:o||t.smart?.timezoneMismatch,tampered:t.smart?.privacyBrowser}}}stopBehaviorTracking(){this.behaviorAnalyzer.stop();}async fetchVisitorId(){let e=await this.getDeviceSignals(),t=await ln(e),n=this.config.visitorEndpoint||`${this.config.endpoint}/api/visitors`,i=this.getCookieVisitorId()||this.cachedVisitor?.result.visitorId||void 0;try{let o=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},credentials:"include",body:JSON.stringify({signals:e,stableFingerprint:t,previousVisitorId:i})});if(!o.ok)throw new Error(`HTTP ${o.status}`);let s=await o.json();return this.cachedVisitor={result:s,signals:e,cachedAt:Date.now()},this.saveToStorage(),this.setCookieVisitorId(s.visitorId),this.log("Visitor ID fetched:",s.visitorId),s}catch(o){throw this.log("Failed to fetch visitor ID:",o),o}}calculateRiskScore(e,t=false){let n=0,i=e.smart;return (i?.bot||e.bot)&&(n+=.8),e.behavior&&(e.behavior.score<.3?n+=.4:e.behavior.score<.5&&(n+=.2)),t&&(n+=.25),(i?.incognito||e.incognito)&&(n+=.2),i?.devToolsOpen&&(n+=.1),i?.privacyBrowser&&(n+=.1),e.hardwareConcurrency===0&&(n+=.1),e.maxTouchPoints===0&&/mobile|android|iphone/i.test(e.userAgent)&&(n+=.15),e.cookieEnabled||(n+=.1),i?.doNotTrack&&(n+=.05),i?.deviceVisitCount===1&&(n+=.05),Math.round(Math.min(n,1)*100)/100}isCacheExpired(){return this.cachedVisitor?Date.now()-this.cachedVisitor.cachedAt>dn:true}loadFromStorage(){if(!(typeof window>"u"||typeof localStorage>"u"))try{let e=localStorage.getItem(rt);if(!e)return;let t=JSON.parse(e);this.isCacheExpiredAt(t.cachedAt)?localStorage.removeItem(rt):(this.cachedVisitor=t,this.log("Loaded cached visitor from storage"));}catch{}}saveToStorage(){if(!(typeof window>"u"||typeof localStorage>"u")&&this.cachedVisitor)try{localStorage.setItem(rt,JSON.stringify(this.cachedVisitor));}catch{}}isCacheExpiredAt(e){return Date.now()-e>dn}getCookieVisitorId(){if(!(typeof document>"u"))try{return document.cookie.match(new RegExp(`(?:^|; )${pn}=([^;]*)`))?.[1]||void 0}catch{return}}setCookieVisitorId(e){if(!(typeof document>"u"))try{document.cookie=`${pn}=${e}; path=/; max-age=${Nr}; SameSite=Lax`;}catch{}}log(...e){this.config.debug&&console.log("[SitePong Fingerprint]",...e);}};U(it());Yt({createReplay:r=>new te(r),createFingerprint:r=>new re(r),createPerformance:r=>new X(r)});
|
|
8
|
-
exports.DEFAULT_SUPERLINK_ENDPOINT=qe;exports.SuperLinkClient=Q;exports.TracePropagator=me;exports.addBreadcrumb=
|
|
7
|
+
`)||void 0}catch{return}}};var cr="https://ingest.sitepong.com",lr=2e4,ur=3600*1e3,Ze=3,dr=5e3,te=class{constructor(e){this.recording=false;this.sessionId=null;this.events=[];this.trimTimer=null;this.flushFailures=0;this.disabled=false;this.sessionStartTime=0;this.observer=null;this.mouseMoveBuffer=[];this.mouseMoveFlushTimer=null;this.cleanupFns=[];this.networkRecorder=null;this.consoleRecorder=null;this.lastSnapshotTime=0;this.snapshotCooldown=500;this.userContext=null;this.mutationBuffer=null;this.mutationFlushTimer=null;this.lastScrollTime=0;this.latestSnapshot=null;this.config={endpoint:cr,enabled:true,maskInputs:true,maxSessionDuration:ur,flushInterval:5e3,maxBatchSize:100,sampleRate:1,debug:false,bufferDuration:lr,...e};}start(){if(typeof window>"u"||typeof document>"u"||typeof window.addEventListener!="function")return false;if(this.recording)return true;if(!this.config.enabled)return false;if(Math.random()>this.config.sampleRate)return this.log("Session not sampled"),false;this.sessionId=this.getOrCreateSessionId(),this.sessionStartTime=this.getOrCreateStartTime(),this.recording=true,this.events=[],this.prefetchCrossOriginStylesheets();let e=ke({maskInputs:this.config.maskInputs,blockSelector:this.config.blockSelector,maskSelector:this.config.maskSelector});return e&&this.addEvent("snapshot",e),this.setupMutationObserver(),this.setupEventListeners(),this.setupNetworkRecording(),this.setupConsoleRecording(),this.startTrimTimer(),this.log("Recording started (rolling buffer mode):",this.sessionId),true}stop(){if(this.recording){this.recording=false,this.observer&&(this.observer.disconnect(),this.observer=null),this.trimTimer&&(clearInterval(this.trimTimer),this.trimTimer=null),this.mouseMoveFlushTimer&&(clearTimeout(this.mouseMoveFlushTimer),this.mouseMoveFlushTimer=null),this.mutationFlushTimer&&this.flushMutationBuffer(),this.networkRecorder&&(this.networkRecorder.stop(),this.networkRecorder=null),this.consoleRecorder&&(this.consoleRecorder.stop(),this.consoleRecorder=null);for(let e of this.cleanupFns)e();this.cleanupFns=[],an(),this.log("Recording stopped:",this.sessionId),this.sessionId=null;}}isRecording(){return this.recording}getSessionId(){return this.sessionId}setUser(e){this.userContext=e;}async flushOnError(){if(!this.recording||!this.sessionId||this.disabled)return;this.flushMutationBuffer();let e=[];if(this.latestSnapshot&&e.push(this.latestSnapshot),e.push(...this.events),e.length===0)return;this.events=[],this.latestSnapshot=null;let t=ke({maskInputs:this.config.maskInputs,blockSelector:this.config.blockSelector,maskSelector:this.config.maskSelector});t&&this.addEvent("snapshot",t);let n=this.config.replayEndpoint||`${this.config.endpoint}/api/replays`;try{let i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},body:JSON.stringify({sessionId:this.sessionId,events:e,startedAt:new Date(this.sessionStartTime).toISOString(),pageUrl:typeof location<"u"&&location?location.href:void 0,pageTitle:typeof document<"u"?document.title:void 0,userAgent:typeof navigator<"u"?navigator.userAgent:void 0,userId:this.userContext?.id,trigger:"error"})});if(!i.ok)throw new Error(`HTTP ${i.status}`);this.flushFailures=0,this.log(`Flushed ${e.length} replay events (error-triggered)`);}catch(i){if(this.flushFailures++,this.flushFailures>=Ze){this.disabled=true,console.warn(`[SitePong Replay] Disabled after ${Ze} consecutive failures. Check that ${n} is accessible and has proper CORS headers.`);return}this.log(`Failed to flush replay events (attempt ${this.flushFailures}/${Ze}):`,i);}}async flush(){return this.flushOnError()}addEvent(e,t){if(!this.recording)return;if(Date.now()-this.sessionStartTime>this.config.maxSessionDuration){this.stop();return}let n={type:e,timestamp:Date.now()-this.sessionStartTime,data:t};e==="snapshot"&&(this.latestSnapshot=n),this.events.push(n);}trimBuffer(){if(this.events.length===0)return;let t=Date.now()-this.sessionStartTime-this.config.bufferDuration,n=0;for(let i=0;i<this.events.length;i++){if(this.events[i].timestamp>=t){n=i;break}this.events[i].type==="snapshot"&&(this.latestSnapshot=this.events[i]),n=i+1;}n>0&&(this.events=this.events.slice(n));}flushMutationBuffer(){this.mutationBuffer&&(this.mutationBuffer.adds.length||this.mutationBuffer.removes.length||this.mutationBuffer.attributes.length||this.mutationBuffer.texts.length)&&this.addEvent("mutation",this.mutationBuffer),this.mutationBuffer=null,this.mutationFlushTimer&&clearTimeout(this.mutationFlushTimer),this.mutationFlushTimer=null;}setupMutationObserver(){typeof MutationObserver>"u"||(this.observer=new MutationObserver(e=>{this.mutationBuffer||(this.mutationBuffer={adds:[],removes:[],attributes:[],texts:[]});for(let t of e)switch(t.type){case "childList":{for(let n of Array.from(t.addedNodes)){let i=Te(n,{maskInputs:this.config.maskInputs,blockSelector:this.config.blockSelector,maskSelector:this.config.maskSelector});i&&this.mutationBuffer.adds.push({parentId:y(t.target),nextId:t.nextSibling?y(t.nextSibling):null,node:i});}for(let n of Array.from(t.removedNodes))this.mutationBuffer.removes.push({parentId:y(t.target),id:y(n)});break}case "attributes":{let n=t.target,i=t.attributeName||"",o=n.getAttribute(i),s={[i]:o},a=n.tagName?.toLowerCase();if(a==="style"||a==="link"&&n.getAttribute("rel")==="stylesheet"){let c=Se(n);c&&(s._cssText=c);}if(i==="class"||i==="style"){let c=Je(n);c&&(s._computedStyle=c);}this.mutationBuffer.attributes.push({id:y(t.target),attributes:s});break}case "characterData":{let n=t.target.textContent||"",i=t.target.parentElement;if(i&&this.config.maskSelector&&i.matches(this.config.maskSelector)&&(n=n.replace(/\S/g,"*")),this.mutationBuffer.texts.push({id:y(t.target),value:n}),i&&i.tagName?.toLowerCase()==="style"){let o=Se(i);o&&this.mutationBuffer.attributes.push({id:y(i),attributes:{_cssText:o}});}break}}this.mutationFlushTimer||(this.mutationFlushTimer=setTimeout(()=>this.flushMutationBuffer(),1e3));}),this.observer.observe(document.documentElement,{childList:true,subtree:true,attributes:true,characterData:true,attributeOldValue:false}));}setupEventListeners(){let e=d=>{this.mouseMoveBuffer.push({x:d.clientX,y:d.clientY,t:Date.now()-this.sessionStartTime}),this.mouseMoveFlushTimer||(this.mouseMoveFlushTimer=setTimeout(()=>{if(this.mouseMoveBuffer.length>0){let f={positions:[...this.mouseMoveBuffer]};this.addEvent("mouse_move",f),this.mouseMoveBuffer=[];}this.mouseMoveFlushTimer=null;},1e3));},t=d=>{let f=d.target;this.addEvent("mouse_click",{x:d.clientX,y:d.clientY,targetId:y(f),button:d.button}),this.takeInteractionSnapshot();},n=d=>{let f=d.target;this.addEvent("mouse_click",{x:d.clientX,y:d.clientY,targetId:y(f),button:2}),this.takeInteractionSnapshot();},i=()=>{this.addEvent("mouse_leave",{});},o=d=>{let f=d.touches[0];if(!f)return;let h=d.target;this.addEvent("touch",{x:f.clientX,y:f.clientY,targetId:y(h)}),this.takeInteractionSnapshot();},s=null,a=()=>{s&&clearTimeout(s),s=setTimeout(()=>{let d={id:0,x:window.scrollX,y:window.scrollY};this.addEvent("scroll",d),this.takeInteractionSnapshot();},1e3);},c=d=>{let f=d.target;if(!f)return;let h={id:y(f),value:this.config.maskInputs?"***":f.value};"checked"in f&&(h.isChecked=f.checked),this.addEvent("input",h);},u=()=>{this.addEvent("resize",{width:window.innerWidth,height:window.innerHeight});},p=d=>{d.target&&d.target!==document&&this.addEvent("focus",{id:y(d.target)});},g=d=>{d.target&&d.target!==document&&this.addEvent("blur",{id:y(d.target)});};document.addEventListener("mousemove",e,{passive:true}),document.addEventListener("click",t,{passive:true}),document.addEventListener("contextmenu",n,{passive:true}),document.documentElement.addEventListener("mouseleave",i,{passive:true}),document.addEventListener("touchstart",o,{passive:true}),window.addEventListener("scroll",a,{passive:true}),document.addEventListener("input",c,{passive:true}),window.addEventListener("resize",u,{passive:true}),document.addEventListener("focus",p,{passive:true,capture:true}),document.addEventListener("blur",g,{passive:true,capture:true}),this.cleanupFns.push(()=>document.removeEventListener("mousemove",e),()=>document.removeEventListener("click",t),()=>document.removeEventListener("contextmenu",n),()=>document.documentElement.removeEventListener("mouseleave",i),()=>document.removeEventListener("touchstart",o),()=>window.removeEventListener("scroll",a),()=>document.removeEventListener("input",c),()=>window.removeEventListener("resize",u),()=>document.removeEventListener("focus",p,{capture:true}),()=>document.removeEventListener("blur",g,{capture:true}));}setupNetworkRecording(){if(!this.config.recordNetwork)return;let e=this.config.replayEndpoint||this.config.endpoint;this.networkRecorder=new Z(t=>{this.addEvent("network",t.data);},{captureHeaders:this.config.captureNetworkHeaders,urlFilter:t=>!t.startsWith(e)}),this.networkRecorder.start();}setupConsoleRecording(){this.config.recordConsole&&(this.consoleRecorder=new ee(e=>{this.addEvent("console",e.data);},{levels:this.config.consoleLevels}),this.consoleRecorder.start());}startTrimTimer(){this.trimTimer=setInterval(()=>{this.trimBuffer();},dr);}takeInteractionSnapshot(){let e=Date.now();if(e-this.lastSnapshotTime<this.snapshotCooldown)return;this.lastSnapshotTime=e;let t=ke({maskInputs:this.config.maskInputs,blockSelector:this.config.blockSelector,maskSelector:this.config.maskSelector});t&&this.addEvent("snapshot",t);}getOrCreateSessionId(){let e="__sp_replay_session";try{let n=sessionStorage.getItem(e);if(n)return n}catch{}let t=`rep_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,10)}`;try{sessionStorage.setItem(e,t);}catch{}return t}getOrCreateStartTime(){let e="__sp_replay_start";try{let n=sessionStorage.getItem(e);if(n)return parseInt(n,10)}catch{}let t=Date.now();try{sessionStorage.setItem(e,String(t));}catch{}return t}prefetchCrossOriginStylesheets(){if(typeof document>"u")return;let e=document.querySelectorAll('link[rel="stylesheet"]');for(let t of Array.from(e)){let n=t;if(n.href&&n.sheet)try{n.sheet.cssRules;}catch{sn(n.href).catch(()=>{});}}}log(...e){this.config.debug&&console.log("[SitePong Replay]",...e);}};function et(){let r={uaSpoofed:false,antiDetectBrowser:false,canvasNoise:false,canvasBlocked:false,webglSpoofed:false,webglBlocked:false,vmIndicators:[],platformMismatch:false,pluginAnomaly:false,featureAnomaly:false,geolocationSpoofed:false,mitmIndicators:[]},e=0,t=pr(r);e+=t;let n=fr(r);e+=n;let i=gr(r);e+=i;let o=hr(r);e+=o;let s=mr(r);e+=s;let a=vr(r);return e+=a,e=Math.min(e,1),{browserTampered:r.uaSpoofed||r.antiDetectBrowser||r.platformMismatch,canvasTampered:r.canvasNoise||r.canvasBlocked,webglTampered:r.webglSpoofed||r.webglBlocked,vmDetected:r.vmIndicators.length>=2,geolocationSpoofed:r.geolocationSpoofed,mitmDetected:r.mitmIndicators.length>=1,confidence:e,signals:r}}function pr(r){if(typeof navigator>"u"||typeof window>"u")return 0;let e=0,t=navigator.userAgent,n=navigator.platform||"",i=/Windows/.test(t),o=/Mac/.test(t),s=/Linux/.test(t)&&!/Android/.test(t),a=/Win/.test(n),c=/Mac/.test(n),u=/Linux/.test(n);(i&&!a||o&&!c||s&&!u)&&(r.platformMismatch=true,r.uaSpoofed=true,e+=.3);let p=/Chrome\/\d+/.test(t)&&!/Edge|OPR|Brave/.test(t);p&&!("chrome"in window||"CSS"in window&&"paintWorklet"in window.CSS)&&!("brave"in navigator)&&(r.uaSpoofed=true,e+=.2),/Firefox\/\d+/.test(t)&&!/Seamonkey/.test(t)&&("InstallTrigger"in window||CSS.supports("-moz-appearance","none")||(r.uaSpoofed=true,e+=.2));let d=navigator;if(d.userAgentData?.brands){let m=d.userAgentData.brands.map(P=>P.brand);(m.length===0||m.every(P=>P===""||P==="Not A;Brand"))&&(r.antiDetectBrowser=true,e+=.25);}/mobile|android|iphone|ipad/i.test(t)||(navigator.plugins?.length||0)===0&&p&&(r.pluginAnomaly=true,e+=.1);let f=navigator.hardwareConcurrency||0,h=navigator.deviceMemory||0;return f>0&&h>0&&f>=16&&h<=1&&(r.featureAnomaly=true,e+=.15),Math.min(e,.5)}function fr(r){if(typeof document>"u")return 0;let e=0;try{let t=document.createElement("canvas");t.width=100,t.height=20;let n=t.getContext("2d");if(!n)return r.canvasBlocked=!0,.1;n.fillStyle="#ff0000",n.fillRect(0,0,100,20),n.fillStyle="#00ff00",n.font="12px Arial",n.fillText("SitePong",5,14);let i=t.toDataURL();n.clearRect(0,0,100,20),n.fillStyle="#ff0000",n.fillRect(0,0,100,20),n.fillStyle="#00ff00",n.font="12px Arial",n.fillText("SitePong",5,14);let o=t.toDataURL();i!==o&&(r.canvasNoise=!0,e+=.35);let a=n.getImageData(0,0,100,20).data,c=!0,u=!0,p=a[0];for(let d=0;d<a.length;d+=4)(a[d]!==0||a[d+1]!==0||a[d+2]!==0)&&(c=!1),a[d]!==p&&(u=!1);(c||u)&&(r.canvasBlocked=!0,e+=.2);let g=Object.getOwnPropertyDescriptor(HTMLCanvasElement.prototype,"toDataURL");g&&g.value!==HTMLCanvasElement.prototype.toDataURL&&(r.canvasNoise=!0,e+=.3);}catch{r.canvasBlocked=true,e+=.1;}return Math.min(e,.4)}function gr(r){if(typeof document>"u")return 0;let e=0;try{let t=document.createElement("canvas"),n=t.getContext("webgl")||t.getContext("experimental-webgl");if(!n||!(n instanceof WebGLRenderingContext))return r.webglBlocked=!0,.1;let i=n.getExtension("WEBGL_debug_renderer_info");if(!i)return r.webglBlocked=!0,.1;let o=n.getParameter(i.UNMASKED_VENDOR_WEBGL),s=n.getParameter(i.UNMASKED_RENDERER_WEBGL),a=["Brian Paul","Mesa","VMware"];["llvmpipe","softpipe","Mesa","SwiftShader"].some(h=>s.includes(h))&&!a.some(h=>o.includes(h))&&(r.webglSpoofed=!0,e+=.25);let u=navigator.userAgent,p=/mobile|android|iphone|ipad/i.test(u),g=/GeForce|Radeon|Intel.*HD|GTX|RTX|Vega/i.test(s);p&&g&&(r.webglSpoofed=!0,e+=.3);let d=Object.getOwnPropertyDescriptor(WebGLRenderingContext.prototype,"getParameter");d&&typeof d.value=="function"&&(d.value.toString().includes("[native code]")||(r.webglSpoofed=!0,e+=.35)),(n.getSupportedExtensions()||[]).length<5&&g&&(r.webglSpoofed=!0,e+=.1);}catch{r.webglBlocked=true,e+=.1;}return Math.min(e,.4)}function hr(r){if(typeof navigator>"u"||typeof window>"u")return 0;let e=[],t=navigator.userAgent;try{let s=document.createElement("canvas"),a=s.getContext("webgl")||s.getContext("experimental-webgl");if(a&&a instanceof WebGLRenderingContext){let c=a.getExtension("WEBGL_debug_renderer_info");if(c){let u=a.getParameter(c.UNMASKED_RENDERER_WEBGL).toLowerCase(),p=a.getParameter(c.UNMASKED_VENDOR_WEBGL).toLowerCase(),g=["vmware","virtualbox","hyper-v","parallels","qemu","llvmpipe","mesa"],d=["vmware","innotek","microsoft basic","parallels"];for(let f of g)u.includes(f)&&e.push(`webgl_renderer:${f}`);for(let f of d)p.includes(f)&&e.push(`webgl_vendor:${f}`);}}}catch{}if(typeof screen<"u"){let s=screen.width,a=screen.height;[[800,600],[1024,768],[1280,800]].some(([u,p])=>s===u&&a===p)&&screen.colorDepth===24&&navigator.hardwareConcurrency<=2&&e.push("vm_resolution");}let n=navigator.hardwareConcurrency||0,i=navigator.deviceMemory||0;if(n>0&&n<=2&&i>0&&i<=2&&(/mobile|android|iphone/i.test(t)||e.push("low_hw_specs")),typeof performance<"u"){let s=[];for(let c=0;c<10;c++)s.push(performance.now());new Set(s.map(c=>Math.floor(c*1e3))).size<=3&&s.length===10&&e.push("coarse_timing");}if(typeof navigator<"u"){let s=navigator.connection;s&&s.downlink&&s.downlink>=10&&s.rtt&&s.rtt<=5&&e.push("cloud_vm_network");}return r.vmIndicators=e,Math.min(e.length*.15,.5)}function mr(r){if(typeof navigator>"u")return 0;let e=0;if("geolocation"in navigator){let t=Object.getOwnPropertyDescriptor(navigator,"geolocation");t&&t.configurable===false&&t.get&&(t.get.toString().includes("[native code]")||(r.geolocationSpoofed=true,e+=.3));try{let n=Object.getOwnPropertyDescriptor(Geolocation.prototype,"getCurrentPosition");n?.value&&(n.value.toString().includes("[native code]")||(r.geolocationSpoofed=!0,e+=.3));}catch{}}if(typeof window<"u")try{let t=Object.getPrototypeOf(navigator),n=Object.getOwnPropertyDescriptor(t,"geolocation");n&&n.get&&!n.get.toString().includes("[native code]")&&(r.geolocationSpoofed=!0,e+=.2);}catch{}return Math.min(e,.4)}function vr(r){if(typeof window>"u"||typeof document>"u")return 0;let e=[];if(window.location?.protocol==="https:"){let n=document.querySelectorAll("script[src]");for(let i=0;i<n.length;i++){let o=n[i].getAttribute("src")||"";if(o.startsWith("http://")&&!o.includes("localhost")){e.push("mixed_content_script");break}}}let t=document.querySelectorAll("iframe");for(let n=0;n<t.length;n++){let i=t[n].getAttribute("src")||"";if(i&&!i.startsWith(window.location?.origin||"")&&!i.startsWith("about:")&&!i.startsWith("javascript:")){let o=window.getComputedStyle(t[n]);(o.display==="none"||o.visibility==="hidden"||parseInt(o.width)<=1||parseInt(o.height)<=1)&&e.push("hidden_iframe");}}if("serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(n=>{for(let i of n){let o=i.active?.scriptURL||"";o&&!o.startsWith(window.location?.origin||"")&&e.push("foreign_service_worker");}}).catch(()=>{}),typeof performance<"u"&&performance.getEntriesByType)try{let n=performance.getEntriesByType("navigation")[0];if(n){let i=n.connectEnd-n.connectStart,o=n.requestStart-n.secureConnectionStart;i>1e3&&o>500&&e.push("slow_tls_handshake");}}catch{}if(window.location?.protocol==="https:"&&typeof performance<"u")try{let n=performance.getEntriesByType("resource");for(let i of n.slice(0,20))if(i.transferSize===0&&i.encodedBodySize>0&&!i.name.includes("cache")){e.push("intercepted_resource");break}}catch{}return r.mitmIndicators=e,Math.min(e.length*.2,.5)}function ln(){return {userAgent:typeof navigator<"u"?navigator.userAgent:"",language:typeof navigator<"u"?navigator.language:"",languages:typeof navigator<"u"?Array.from(navigator.languages||[]):[],platform:typeof navigator<"u"&&navigator.platform||"",screenWidth:typeof screen<"u"?screen.width:0,screenHeight:typeof screen<"u"?screen.height:0,screenColorDepth:typeof screen<"u"?screen.colorDepth:0,devicePixelRatio:typeof window<"u"&&window.devicePixelRatio||1,timezoneOffset:new Date().getTimezoneOffset(),timezone:Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone||"",sessionStorage:yr(),localStorage:br(),indexedDB:typeof indexedDB<"u",cookieEnabled:typeof navigator<"u"?navigator.cookieEnabled:false,hardwareConcurrency:typeof navigator<"u"&&navigator.hardwareConcurrency||0,maxTouchPoints:typeof navigator<"u"&&navigator.maxTouchPoints||0,deviceMemory:typeof navigator<"u"?navigator.deviceMemory:void 0}}async function un(){let r={};r.canvasFingerprint=wr();let e=Sr();return r.webglVendor=e.vendor,r.webglRenderer=e.renderer,r.audioFingerprint=await Tr(),r.fontFingerprint=Lr(),r.mathFingerprint=Dr(),r.webglRenderHash=_r(),r.cssFeatureHash=Fr(),r.localIps=await Ar(),r}async function tt(r){let t={...ln()};r&&(t.extended=await un());let n=pn();return t.smart=n,t.incognito=n.incognito,t.bot=n.bot,t}async function dn(r){let e={userAgent:r.userAgent,language:r.language,languages:r.languages,platform:r.platform,screenWidth:r.screenWidth,screenHeight:r.screenHeight,screenColorDepth:r.screenColorDepth,devicePixelRatio:r.devicePixelRatio,timezoneOffset:r.timezoneOffset,timezone:r.timezone,hardwareConcurrency:r.hardwareConcurrency,maxTouchPoints:r.maxTouchPoints,deviceMemory:r.deviceMemory};return r.extended&&(e.canvasFingerprint=r.extended.canvasFingerprint,e.webglVendor=r.extended.webglVendor,e.webglRenderer=r.extended.webglRenderer,e.audioFingerprint=r.extended.audioFingerprint,e.fontFingerprint=r.extended.fontFingerprint,e.mathFingerprint=r.extended.mathFingerprint,e.webglRenderHash=r.extended.webglRenderHash,e.cssFeatureHash=r.extended.cssFeatureHash,e.localIps=r.extended.localIps),e}function pn(){let r={};r.incognito=kr(),r.bot=xr(),r.privacyBrowser=Er(),r.devToolsOpen=Cr(),r.connectionType=Mr(),r.doNotTrack=Rr(),r.notificationsEnabled=Pr();let e=Ir();r.deviceFirstSeen=e.firstSeen,r.deviceVisitCount=e.visitCount;let t=et();return r.browserTampered=t.browserTampered,r.canvasTampered=t.canvasTampered,r.webglTampered=t.webglTampered,r.vmDetected=t.vmDetected,r.vmIndicators=t.signals.vmIndicators,r}function yr(){try{let r="__sp_test__";return sessionStorage.setItem(r,"1"),sessionStorage.removeItem(r),!0}catch{return false}}function br(){try{let r="__sp_test__";return localStorage.setItem(r,"1"),localStorage.removeItem(r),!0}catch{return false}}function wr(){if(!(typeof document>"u"))try{let r=document.createElement("canvas"),e=r.getContext("2d");return e?(r.width=200,r.height=50,e.textBaseline="top",e.font="14px Arial",e.fillStyle="#f60",e.fillRect(0,0,200,50),e.fillStyle="#069",e.fillText("SitePong fingerprint",2,15),e.fillStyle="rgba(102, 204, 0, 0.7)",e.fillText("SitePong fingerprint",4,17),B(r.toDataURL())):void 0}catch{return}}function Sr(){if(typeof document>"u")return {};try{let r=document.createElement("canvas"),e=r.getContext("webgl")||r.getContext("experimental-webgl");if(!e||!(e instanceof WebGLRenderingContext))return {};let t=e.getExtension("WEBGL_debug_renderer_info");return t?{vendor:e.getParameter(t.UNMASKED_VENDOR_WEBGL),renderer:e.getParameter(t.UNMASKED_RENDERER_WEBGL)}:{}}catch{return {}}}async function Tr(){if(!(typeof window>"u"||typeof OfflineAudioContext>"u"))try{let r=new OfflineAudioContext(1,4500,44100),e=r.createOscillator();e.type="triangle",e.frequency.setValueAtTime(1e4,r.currentTime);let t=r.createDynamicsCompressor();t.threshold.setValueAtTime(-50,r.currentTime),t.knee.setValueAtTime(40,r.currentTime),t.ratio.setValueAtTime(12,r.currentTime),t.attack.setValueAtTime(0,r.currentTime),t.release.setValueAtTime(.25,r.currentTime),e.connect(t),t.connect(r.destination),e.start(0);let i=(await r.startRendering()).getChannelData(0),o=0;for(let s=4e3;s<4500;s++)o+=Math.abs(i[s]);return B(`audio:${o.toFixed(6)}`)}catch{return}}function kr(){if(typeof window>"u")return false;try{let r="__sp_incognito_test__";try{localStorage.setItem(r,new Array(100).join("x")),localStorage.removeItem(r);}catch{return !0}if(typeof indexedDB<"u")try{let t=indexedDB.open("__sp_test__");t.onerror=()=>{};}catch{return !0}if("webkitRequestFileSystem"in window){let t=!1;try{window.webkitRequestFileSystem(0,1,()=>{t=!1;},()=>{t=!0;});}catch{}if(t)return !0}let e=performance;if(e.memory){let t=e.memory.jsHeapSizeLimit||0;if(t>0&&t<1073741824)return !0}return !1}catch{return false}}function xr(){if(typeof navigator>"u")return false;let r=navigator.userAgent.toLowerCase();return !!(["bot","crawler","spider","headless","phantom","puppeteer","selenium","webdriver","playwright"].some(t=>r.includes(t))||"webdriver"in navigator&&navigator.webdriver||navigator.plugins&&navigator.plugins.length===0&&!/mobile|android|iphone/i.test(r))}function Er(){if(typeof navigator>"u")return false;let r=navigator.userAgent.toLowerCase();return !!("brave"in navigator||r.includes("focus")&&r.includes("firefox")||r.includes("duckduckgo")||typeof window<"u"&&(screen.width===1e3&&screen.height===1e3||new Date().getTimezoneOffset()===0&&navigator.language!=="en"))}function Cr(){if(typeof window>"u")return false;try{let r=window.outerWidth-window.innerWidth>160,e=window.outerHeight-window.innerHeight>160;if(r||e)return !0}catch{}return false}function Mr(){if(typeof navigator>"u")return;let r=navigator.connection;if(r)return r.effectiveType||r.type||void 0}function Rr(){if(typeof navigator>"u")return false;let r=navigator.doNotTrack;return r==="1"||r==="yes"}function Pr(){return typeof Notification>"u"?false:Notification.permission==="granted"}function Ir(){let r="sitepong_device_age",e={visitCount:1};if(typeof localStorage>"u")return e;try{let t=localStorage.getItem(r);if(t){let n=JSON.parse(t);e.firstSeen=n.firstSeen,e.visitCount=(n.visitCount||0)+1;}else e.firstSeen=new Date().toISOString();localStorage.setItem(r,JSON.stringify({firstSeen:e.firstSeen,visitCount:e.visitCount}));}catch{}return e}function Lr(){if(!(typeof document>"u"))try{let r=["monospace","sans-serif","serif"],e=["Arial","Arial Black","Courier New","Georgia","Helvetica","Impact","Lucida Console","Lucida Sans Unicode","Palatino Linotype","Tahoma","Times New Roman","Trebuchet MS","Verdana","Comic Sans MS","Courier","Garamond","Monaco"],t="mmmmmmmmmmlli",n="72px",o=document.createElement("canvas").getContext("2d");if(!o)return;let s={};for(let c of r)o.font=`${n} ${c}`,s[c]=o.measureText(t).width;let a=[];for(let c of e)for(let u of r)if(o.font=`${n} '${c}', ${u}`,o.measureText(t).width!==s[u]){a.push(c);break}return B(a.join(","))}catch{return}}function Dr(){try{let r=[Math.tan(-1e300),Math.log(1e-10),Math.pow(Math.PI,-100),Math.acos(.5),Math.atan2(1,1),Math.exp(1),Math.sinh(1)];return B(r.map(e=>e.toString()).join(","))}catch{return}}function _r(){if(!(typeof document>"u"))try{let r=document.createElement("canvas");r.width=50,r.height=50;let e=r.getContext("webgl");if(!e)return;let t=e.createShader(e.VERTEX_SHADER);e.shaderSource(t,"attribute vec2 p;void main(){gl_Position=vec4(p,0,1);}"),e.compileShader(t);let n=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(n,"precision mediump float;void main(){gl_FragColor=vec4(.86,.27,.33,1);}"),e.compileShader(n);let i=e.createProgram();e.attachShader(i,t),e.attachShader(i,n),e.linkProgram(i),e.useProgram(i);let o=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,o),e.bufferData(e.ARRAY_BUFFER,new Float32Array([0,.5,-.5,-.5,.5,-.5]),e.STATIC_DRAW);let s=e.getAttribLocation(i,"p");return e.enableVertexAttribArray(s),e.vertexAttribPointer(s,2,e.FLOAT,!1,0,0),e.clearColor(0,0,0,1),e.clear(e.COLOR_BUFFER_BIT),e.drawArrays(e.TRIANGLES,0,3),B(r.toDataURL())}catch{return}}function Fr(){if(!(typeof CSS>"u"||typeof CSS.supports!="function"))try{let e=["display: grid","display: flex","display: contents","position: sticky","backdrop-filter: blur(1px)","gap: 1px","aspect-ratio: 1","contain: paint","overflow: clip","accent-color: red","color: oklch(0.5 0.2 0)","container-type: inline-size","text-wrap: balance","view-transition-name: x","anchor-name: --x","field-sizing: content"].map(t=>CSS.supports(t)?"1":"0").join("");return B(e)}catch{return}}async function Ar(){if(!(typeof window>"u"||typeof RTCPeerConnection>"u"))try{let r=new Set,e=new RTCPeerConnection({iceServers:[]});e.createDataChannel("");let t=await e.createOffer();return await e.setLocalDescription(t),new Promise(n=>{let i=setTimeout(()=>{e.close(),n(r.size>0?Array.from(r):void 0);},1e3);e.onicecandidate=o=>{if(!o.candidate){clearTimeout(i),e.close(),n(r.size>0?Array.from(r):void 0);return}let s=o.candidate.candidate.match(/([0-9]{1,3}\.([0-9]{1,3}\.){2}[0-9]{1,3})/);s&&s[1]&&!s[1].startsWith("0.")&&r.add(s[1]);};})}catch{return}}function B(r){let e=0;for(let t=0;t<r.length;t++){let n=r.charCodeAt(t);e=(e<<5)-e+n,e=e&e;}return Math.abs(e).toString(16)}var ne=class{constructor(){this.mousePoints=[];this.keyDownTimes=new Map;this.keyIntervals=[];this.keyHoldTimes=[];this.lastKeyTime=0;this.scrollEvents=[];this.clickTimes=[];this.running=false;this.maxSamples=500;this.handleMouseMove=e=>{this.mousePoints.length>=this.maxSamples||this.mousePoints.push({x:e.clientX,y:e.clientY,t:Date.now()});};this.handleKeyDown=e=>{if(this.keyIntervals.length>=this.maxSamples)return;let t=Date.now();this.keyDownTimes.set(e.key,t),this.lastKeyTime>0&&this.keyIntervals.push(t-this.lastKeyTime),this.lastKeyTime=t;};this.handleKeyUp=e=>{let t=this.keyDownTimes.get(e.key);t&&(this.keyHoldTimes.push(Date.now()-t),this.keyDownTimes.delete(e.key));};this.handleScroll=()=>{this.scrollEvents.length>=this.maxSamples||this.scrollEvents.push({deltaY:window.scrollY,t:Date.now()});};this.handleClick=()=>{this.clickTimes.length>=this.maxSamples||this.clickTimes.push(Date.now());};}start(){this.running||typeof window>"u"||typeof window.addEventListener!="function"||(this.running=true,window.addEventListener("mousemove",this.handleMouseMove,{passive:true}),window.addEventListener("keydown",this.handleKeyDown,{passive:true}),window.addEventListener("keyup",this.handleKeyUp,{passive:true}),window.addEventListener("scroll",this.handleScroll,{passive:true}),window.addEventListener("click",this.handleClick,{passive:true}));}stop(){!this.running||typeof window>"u"||typeof window.removeEventListener!="function"||(this.running=false,window.removeEventListener("mousemove",this.handleMouseMove),window.removeEventListener("keydown",this.handleKeyDown),window.removeEventListener("keyup",this.handleKeyUp),window.removeEventListener("scroll",this.handleScroll),window.removeEventListener("click",this.handleClick));}getMetrics(){let e=this.analyzeMouseMovement(),t=this.analyzeKeyboard(),n=this.analyzeScroll(),i=this.analyzeClicks(),o=this.calculateHumanScore(e,t,n,i);return {mouse:e,keyboard:t,scroll:n,clicks:i,score:o}}reset(){this.mousePoints=[],this.keyDownTimes.clear(),this.keyIntervals=[],this.keyHoldTimes=[],this.lastKeyTime=0,this.scrollEvents=[],this.clickTimes=[];}analyzeMouseMovement(){if(this.mousePoints.length<3)return {totalMovements:this.mousePoints.length,averageSpeed:0,maxSpeed:0,averageAcceleration:0,straightLineRatio:0,jitter:0,hasMovement:false};let e=[],t=[],n=0,i=0,o=0;for(let u=1;u<this.mousePoints.length;u++){let p=this.mousePoints[u-1],g=this.mousePoints[u],d=g.t-p.t||1,f=g.x-p.x,h=g.y-p.y,m=Math.sqrt(f*f+h*h),P=m/d;if(e.push(P),m<3&&m>0&&o++,u>=2){let S=this.mousePoints[u-2],hn=S.x+(g.x-S.x)*((p.t-S.t)/(g.t-S.t)),mn=S.y+(g.y-S.y)*((p.t-S.t)/(g.t-S.t)),vn=Math.sqrt((p.x-hn)**2+(p.y-mn)**2);i++,vn<2&&n++;}if(u>=2){let S=e[e.length-2]||0;t.push(Math.abs(P-S)/d);}}let s=e.reduce((u,p)=>u+p,0)/e.length,a=Math.max(...e),c=t.length>0?t.reduce((u,p)=>u+p,0)/t.length:0;return {totalMovements:this.mousePoints.length,averageSpeed:Math.round(s*1e3)/1e3,maxSpeed:Math.round(a*1e3)/1e3,averageAcceleration:Math.round(c*1e3)/1e3,straightLineRatio:i>0?n/i:0,jitter:this.mousePoints.length>0?o/this.mousePoints.length:0,hasMovement:true}}analyzeKeyboard(){if(this.keyIntervals.length<2)return {totalKeystrokes:this.keyIntervals.length,averageInterval:0,intervalVariance:0,holdTimeAverage:0,holdTimeVariance:0,hasKeystrokes:false};let e=this.keyIntervals.reduce((o,s)=>o+s,0)/this.keyIntervals.length,t=this.variance(this.keyIntervals),n=this.keyHoldTimes.length>0?this.keyHoldTimes.reduce((o,s)=>o+s,0)/this.keyHoldTimes.length:0,i=this.keyHoldTimes.length>0?this.variance(this.keyHoldTimes):0;return {totalKeystrokes:this.keyIntervals.length+1,averageInterval:Math.round(e),intervalVariance:Math.round(t),holdTimeAverage:Math.round(n),holdTimeVariance:Math.round(i),hasKeystrokes:true}}analyzeScroll(){if(this.scrollEvents.length<2)return {totalScrolls:this.scrollEvents.length,averageSpeed:0,smoothness:0,hasScroll:false};let e=[];for(let s=1;s<this.scrollEvents.length;s++){let a=this.scrollEvents[s].t-this.scrollEvents[s-1].t||1,c=Math.abs(this.scrollEvents[s].deltaY-this.scrollEvents[s-1].deltaY);e.push(c/a);}let n=e.reduce((s,a)=>s+a,0)/e.length,i=this.variance(e),o=n>0?Math.min(1,n/(i+n)):0;return {totalScrolls:this.scrollEvents.length,averageSpeed:Math.round(n*100)/100,smoothness:Math.round(o*100)/100,hasScroll:true}}analyzeClicks(){if(this.clickTimes.length<2)return {totalClicks:this.clickTimes.length,averageInterval:0,intervalVariance:0,doubleClickCount:0,hasClicks:this.clickTimes.length>0};let e=[],t=0;for(let o=1;o<this.clickTimes.length;o++){let s=this.clickTimes[o]-this.clickTimes[o-1];e.push(s),s<500&&t++;}let n=e.reduce((o,s)=>o+s,0)/e.length,i=this.variance(e);return {totalClicks:this.clickTimes.length,averageInterval:Math.round(n),intervalVariance:Math.round(i),doubleClickCount:t,hasClicks:true}}calculateHumanScore(e,t,n,i){let o=.5,s=0;if(e.hasMovement){s++;let a=.5;e.jitter>.05&&(a+=.15),e.straightLineRatio<.5?a+=.15:e.straightLineRatio>.9&&(a-=.2),e.averageSpeed>0&&e.maxSpeed/e.averageSpeed>3&&(a+=.1),e.averageAcceleration>0&&(a+=.1),o+=Math.max(0,Math.min(1,a))-.5;}if(t.hasKeystrokes){s++;let a=.5;t.intervalVariance>1e3?a+=.2:t.intervalVariance<100&&(a-=.2),(t.averageInterval>0?Math.sqrt(t.intervalVariance)/t.averageInterval:0)>.3&&(a+=.15),t.holdTimeVariance>500&&(a+=.1),o+=Math.max(0,Math.min(1,a))-.5;}if(n.hasScroll){s++;let a=.5;n.smoothness>.3&&n.smoothness<.9&&(a+=.2),o+=Math.max(0,Math.min(1,a))-.5;}if(i.hasClicks){s++;let a=.5;i.intervalVariance>5e4?a+=.15:i.intervalVariance<100&&(a-=.2),o+=Math.max(0,Math.min(1,a))-.5;}return s===0?.3:Math.max(0,Math.min(1,o))}variance(e){if(e.length<2)return 0;let t=e.reduce((n,i)=>n+i,0)/e.length;return e.reduce((n,i)=>n+(i-t)**2,0)/(e.length-1)}};async function nt(){let r={webrtcLeak:null,timezoneIPMismatch:false,dnsLeak:null,connectionType:null,multipleIPs:false,torBrowser:false,knownVPNExtension:false},e=0,t=false,n=false,i=false;r.torBrowser=Nr(),r.torBrowser&&(i=true,e+=.9);try{r.webrtcLeak=await Or(),r.webrtcLeak&&(t=!0,e+=.3);}catch{r.webrtcLeak=null;}r.connectionType=Ur(),(r.connectionType==="unknown"||r.connectionType===null)&&(e+=.05),r.knownVPNExtension=Br(),r.knownVPNExtension&&(t=true,e+=.4);let o=Intl.DateTimeFormat().resolvedOptions().timeZone,s=navigator.language;if(o&&s){let a=Hr(o),c=s.split("-")[1]?.toUpperCase();a&&c&&a!==c&&(r.timezoneIPMismatch=true,e+=.1);}return e=Math.min(e,1),e<.3&&(t=false,n=false),{vpnDetected:t,proxyDetected:n,torDetected:i,confidence:e,signals:r}}function Nr(){if(typeof window>"u")return false;let r=[];r.push(window.screen.width===1e3&&window.screen.height===1e3),r.push(!window.MediaDevices),r.push(navigator.plugins.length===0),r.push(new Date().getTimezoneOffset()===0);let e=navigator.userAgent;return r.push(e.includes("Firefox")&&!e.includes("Chrome")),r.filter(Boolean).length>=3}async function Or(){return typeof window>"u"||!window.RTCPeerConnection?false:new Promise(r=>{let e=setTimeout(()=>r(false),3e3),t=new Set;try{let n=new RTCPeerConnection({iceServers:[{urls:"stun:stun.l.google.com:19302"}]});n.createDataChannel(""),n.onicecandidate=i=>{if(!i.candidate){clearTimeout(e),n.close(),r(t.size>1);return}let s=i.candidate.candidate.match(/(\d{1,3}\.){3}\d{1,3}/);s&&t.add(s[0]);},n.createOffer().then(i=>n.setLocalDescription(i)).catch(()=>{clearTimeout(e),r(!1);});}catch{clearTimeout(e),r(false);}})}function Ur(){if(typeof navigator>"u")return null;let r=navigator;return r.connection&&(r.connection.type||r.connection.effectiveType)||null}function Br(){if(typeof document>"u"||!document.body)return false;let e=["[data-windscribe]","[data-nord]",".surfshark-extension","#vpn-indicator","[data-expressvpn]"];for(let t of e)try{if(document.querySelector(t))return !0}catch{}return false}function Hr(r){return {"America/New_York":"US","America/Chicago":"US","America/Denver":"US","America/Los_Angeles":"US","Europe/London":"GB","Europe/Paris":"FR","Europe/Berlin":"DE","Europe/Madrid":"ES","Europe/Rome":"IT","Asia/Tokyo":"JP","Asia/Shanghai":"CN","Asia/Kolkata":"IN","Asia/Seoul":"KR","Australia/Sydney":"AU","America/Toronto":"CA","America/Sao_Paulo":"BR","America/Mexico_City":"MX"}[r]||null}var Vr="https://ingest.sitepong.com",rt="sitepong_visitor",fn=720*60*60*1e3,gn="__sp_vid",zr=63072e3,re=class{constructor(e){this.cachedVisitor=null;this.pendingRequest=null;this.config={endpoint:Vr,enabled:true,debug:false,...e},this.behaviorAnalyzer=new ne,this.config.enabled&&typeof window<"u"&&typeof window.addEventListener=="function"&&this.behaviorAnalyzer.start(),this.loadFromStorage();}async getVisitorId(){if(!this.config.enabled)throw new Error("Fingerprint is not enabled");L()?ie():null;if(this.cachedVisitor&&!this.isCacheExpired())return this.log("Returning cached visitor ID:",this.cachedVisitor.result.visitorId),this.cachedVisitor.result;if(this.pendingRequest)return this.pendingRequest;this.pendingRequest=this.fetchVisitorId();try{return await this.pendingRequest}finally{this.pendingRequest=null;}}async getDeviceSignals(){return tt(this.config.extendedSignals??false)}async getFraudCheck(){let[e,t,n]=await Promise.all([this.getVisitorId(),this.getDeviceSignals(),nt().catch(()=>null)]),i=this.behaviorAnalyzer.getMetrics();t.behavior={score:i.score,mouseMovements:i.mouse.totalMovements,keystrokes:i.keyboard.totalKeystrokes,scrolls:i.scroll.totalScrolls,clicks:i.clicks.totalClicks,isHuman:i.score>.6};let o=n?.vpnDetected||n?.torDetected||false;return {visitorId:e.visitorId,riskScore:this.calculateRiskScore(t,o),signals:t,flags:{incognito:t.smart?.incognito||t.incognito,bot:t.smart?.bot||t.bot||!t.behavior.isHuman,vpn:o||t.smart?.timezoneMismatch,tampered:t.smart?.privacyBrowser}}}stopBehaviorTracking(){this.behaviorAnalyzer.stop();}async fetchVisitorId(){let e=await this.getDeviceSignals(),t=await dn(e),n=this.config.visitorEndpoint||`${this.config.endpoint}/api/visitors`,i=this.getCookieVisitorId()||this.cachedVisitor?.result.visitorId||void 0;try{let o=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey},credentials:"include",body:JSON.stringify({signals:e,stableFingerprint:t,previousVisitorId:i})});if(!o.ok)throw new Error(`HTTP ${o.status}`);let s=await o.json();return this.cachedVisitor={result:s,signals:e,cachedAt:Date.now()},this.saveToStorage(),this.setCookieVisitorId(s.visitorId),this.log("Visitor ID fetched:",s.visitorId),s}catch(o){throw this.log("Failed to fetch visitor ID:",o),o}}calculateRiskScore(e,t=false){let n=0,i=e.smart;return (i?.bot||e.bot)&&(n+=.8),e.behavior&&(e.behavior.score<.3?n+=.4:e.behavior.score<.5&&(n+=.2)),t&&(n+=.25),(i?.incognito||e.incognito)&&(n+=.2),i?.devToolsOpen&&(n+=.1),i?.privacyBrowser&&(n+=.1),e.hardwareConcurrency===0&&(n+=.1),e.maxTouchPoints===0&&/mobile|android|iphone/i.test(e.userAgent)&&(n+=.15),e.cookieEnabled||(n+=.1),i?.doNotTrack&&(n+=.05),i?.deviceVisitCount===1&&(n+=.05),Math.round(Math.min(n,1)*100)/100}isCacheExpired(){return this.cachedVisitor?Date.now()-this.cachedVisitor.cachedAt>fn:true}loadFromStorage(){if(!(typeof window>"u"||typeof localStorage>"u"))try{let e=localStorage.getItem(rt);if(!e)return;let t=JSON.parse(e);this.isCacheExpiredAt(t.cachedAt)?localStorage.removeItem(rt):(this.cachedVisitor=t,this.log("Loaded cached visitor from storage"));}catch{}}saveToStorage(){if(!(typeof window>"u"||typeof localStorage>"u")&&this.cachedVisitor)try{localStorage.setItem(rt,JSON.stringify(this.cachedVisitor));}catch{}}isCacheExpiredAt(e){return Date.now()-e>fn}getCookieVisitorId(){if(!(typeof document>"u"))try{return document.cookie.match(new RegExp(`(?:^|; )${gn}=([^;]*)`))?.[1]||void 0}catch{return}}setCookieVisitorId(e){if(!(typeof document>"u"))try{document.cookie=`${gn}=${e}; path=/; max-age=${zr}; SameSite=Lax`;}catch{}}log(...e){this.config.debug&&console.log("[SitePong Fingerprint]",...e);}};H(it());Zt({createReplay:r=>new te(r),createFingerprint:r=>new re(r),createPerformance:r=>new X(r)});
|
|
8
|
+
exports.DEFAULT_SUPERLINK_ENDPOINT=qe;exports.SuperLinkClient=Q;exports.TracePropagator=me;exports.addBreadcrumb=wo;exports.areFlagsReady=Mo;exports.captureError=po;exports.captureMessage=fo;exports.captureWebDeepLink=Y;exports.clearAnonymousId=ot;exports.clearUser=bo;exports.client=l;exports.completeFromScan=Jt;exports.createTraceContext=Ke;exports.cronCheckin=Yo;exports.cronStart=Jo;exports.cronWrap=Zo;exports.dbTrack=Wo;exports.dbTrackSync=jo;exports.default=nr;exports.endSpan=Ko;exports.endTransaction=zo;exports.extractIdentityMetadata=Gt;exports.extractTrace=zt;exports.flush=vo;exports.flushMetrics=ss;exports.flushProfiles=ds;exports.generateSpanId=ve;exports.generateTraceId=$e;exports.getAllFlags=ko;exports.getAnonymousId=D;exports.getDbNPlusOnePatterns=Qo;exports.getDbQueryCount=Go;exports.getDeepLink=Xt;exports.getDeviceSignals=Ao;exports.getFlag=To;exports.getFraudCheck=No;exports.getLatestProfile=us;exports.getMatchedDeepLink=qt;exports.getProfiles=ls;exports.getRemoteConfig=ps;exports.getReplaySessionId=Ho;exports.getVariant=xo;exports.getVariantPayload=Eo;exports.getVisitorId=Fo;exports.getWebVitals=qo;exports.group=Do;exports.identify=Lo;exports.init=lo;exports.initRN=uo;exports.initSuperLink=Jn;exports.isInitialized=yo;exports.isRemoteConfigFeatureEnabled=fs;exports.isReplayRecording=Bo;exports.metricDistribution=rs;exports.metricGauge=ts;exports.metricHistogram=ns;exports.metricIncrement=es;exports.metricStartTimer=os;exports.metricTime=is;exports.onDeferredDeepLink=Kt;exports.onRemoteConfigChange=gs;exports.parseUniversalLink=ye;exports.profile=as;exports.propagateTrace=he;exports.refreshFlags=Ro;exports.registerIdentifyHook=hs;exports.registerWebManagerFactories=Zt;exports.resetAnalytics=_o;exports.resetDbQueryCount=Xo;exports.setAnonymousId=st;exports.setContext=go;exports.setCurrentScreen=So;exports.setEnvironment=H;exports.setRNGetCurrentScreen=Ce;exports.setTags=mo;exports.setUser=ho;exports.startProfileSpan=cs;exports.startReplay=Oo;exports.startSpan=$o;exports.startTransaction=Vo;exports.stopReplay=Uo;exports.superlinkClient=w;exports.superlinkIdentify=Yt;exports.track=Po;exports.trackPageView=Io;exports.waitForFlags=Co;exports.writeClipboardToken=jt;Object.defineProperty(exports,'__esModule',{value:true});return exports;})({});//# sourceMappingURL=sitepong.min.js.map
|
|
9
9
|
//# sourceMappingURL=sitepong.min.js.map
|