sitepong 0.1.13 → 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 +6 -6
- 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 +513 -11
- package/dist/entries/rn.js.map +1 -1
- package/dist/entries/web.d.mts +2 -2
- package/dist/entries/web.d.ts +2 -2
- package/dist/entries/web.js +694 -137
- package/dist/entries/web.js.map +1 -1
- package/dist/entries/web.mjs +681 -137
- package/dist/entries/web.mjs.map +1 -1
- package/dist/index.d.mts +351 -23
- package/dist/index.d.ts +351 -23
- package/dist/index.js +367 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +354 -6
- 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 +4 -4
- package/dist/react/index.d.ts +4 -4
- package/dist/react/index.js +367 -7
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +354 -7
- 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 +162 -160
package/dist/cdn/sitepong.min.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
var SitePong=(function(exports){'use strict';function lt(){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 Me(){return {platform:"browser",storage:lt(),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 T=null;function A(r){T=r;}function b(){return T}function ae(){if(T)return T.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 M(){return ae()==="react-native"}var ut=null;function dt(){return T&&T.platform==="react-native"?T:null}function ce(r){let e=dt();e&&e._setGetCurrentScreen(r);}function X(){return ut}function le(){return T?T.storage:null}var j="sitepong_anonymous_id";function ue(){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 x=null;function R(){if(typeof window<"u"&&typeof localStorage<"u")try{let r=localStorage.getItem(j);return r||(r=ue(),localStorage.setItem(j,r)),r}catch{return x||(x=ue()),x}return x||(x=ue()),x}function Re(){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.removeItem(j);}catch{}x=null;}function Ie(r){if(typeof window<"u"&&typeof localStorage<"u")try{localStorage.setItem(j,r);}catch{x=r;}else x=r;}function Pe(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 Fe(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 De(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 de(){let r=b()?.getUserAgent()??"";return {anonymous_id:R(),device_type:r?Pe(r):void 0,browser:r?Fe(r):void 0,os:r?De(r):void 0,user_agent:r||void 0,timestamp:new Date}}function Ae(r){let e=5381;for(let t=0;t<r.length;t++)e=(e<<5)+e^r.charCodeAt(t);return e>>>0}function ft(r){return Math.random()*100<r.percentage}function pt(r,e,t){let n=`${e.anonymous_id}:${t}`;return Ae(n)%100<r.percentage}function Q(r){let[e,t]=r.split(":").map(Number);return e*60+t}function gt(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(d=>d.type==="weekday")?.value||""),s=parseInt(i.find(d=>d.type==="hour")?.value||"0",10),c=parseInt(i.find(d=>d.type==="minute")?.value||"0",10),l=s*60+c;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 d=Q(r.start_time),f=Q(r.end_time);if(d>f){if(l<d&&l>=f)return false}else if(l<d||l>=f)return false}else if(r.start_time){let d=Q(r.start_time);if(l<d)return false}else if(r.end_time){let d=Q(r.end_time);if(l>=d)return false}return true}function ht(r,e){return e.device_type?r.types.includes(e.device_type):false}function mt(r,e){return e.browser?r.browsers.includes(e.browser):false}function vt(r,e){return e.os?r.operating_systems.includes(e.os):false}function yt(r,e,t,n){switch(r){case "percentage_rollout":return ft(e);case "userbase_percentage":return pt(e,t,n);case "time_based":return gt(e,t);case "device_type":return ht(e,t);case "browser":return mt(e,t);case "os":return vt(e,t);default:return false}}function Y(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(!yt(t.rule_type,t.config,e,r.key))return false;return true}function _e(r,e){if(!Y(r,e)||r.flag_type!=="multivariate"||!r.variants||r.variants.length===0)return null;let t=`${e.anonymous_id}:${r.key}:variant`,n=Ae(t),i=r.variants.reduce((c,l)=>c+l.weight,0),o=n%i,s=0;for(let c of r.variants)if(s+=c.weight,o<s)return c.key;return r.variants[0].key}function Le(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 bt="https://api.sitepong.com",I=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:bt,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=de(),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=Y(n,this.context);if(this.evaluatedFlags.set(n.key,i),n.flag_type==="multivariate"&&n.variants){let o=_e(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?Le(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 fe="sitepong_session_id",J="sitepong_session_ts";var _=null,L=null;function Oe(){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 He(r){return Date.now()-r>18e5}function pe(){if(typeof window<"u"&&typeof sessionStorage<"u")try{let r=sessionStorage.getItem(fe),e=sessionStorage.getItem(J);if(r&&e&&!He(parseInt(e,10)))return sessionStorage.setItem(J,String(Date.now())),r;let t=Oe();return sessionStorage.setItem(fe,t),sessionStorage.setItem(J,String(Date.now())),t}catch{return Ne()}return Ne()}function Ne(){return _&&L&&!He(L)?(L=Date.now(),_):(_=Oe(),L=Date.now(),_)}function ge(){if(typeof window<"u"&&typeof sessionStorage<"u")try{sessionStorage.removeItem(fe),sessionStorage.removeItem(J);}catch{}_=null,L=null;}var Be=["[data-sp-no-capture]",".sp-no-capture"];var N=class{constructor(e,t){this.clickHandler=null;this.submitHandler=null;this.active=false;this.config={clicks:true,forms:true,pageviews:true,blockSelectors:Be,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||Be;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 c=Array.from(s.children).filter(l=>l.tagName===n.tagName);if(c.length>1){let l=c.indexOf(n)+1;o+=`:nth-of-type(${l})`;}}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 wt="https://ingest.sitepong.com",St=20,Tt=1e4,he=3,P=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:wt,enabled:true,autocapturePageviews:false,maxBatchSize:St,flushInterval:Tt,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,c;e===true?(i=true,o=true):e&&typeof e=="object"&&(i=e.clicks!==false,o=e.forms!==false,s=e.blockSelectors,c=e.allowSelectors,e.pageviews!==false&&!this.config.autocapturePageviews&&this.setupSPATracking()),!(!i&&!o)&&(this.autocaptureModule=new N({clicks:i,forms:o,pageviews:false,blockSelectors:s,allowSelectors:c,debug:this.config.debug},l=>{let d=l.type==="click"?"$autocapture_click":l.type==="form_submit"?"$autocapture_form_submit":"$autocapture";this.track(d,l.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,ge(),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>=he){this.disabled=true,console.warn(`[SitePong Analytics] Disabled after ${he} 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}/${he}):`,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:R(),deviceId:void 0,groupId:this.groupId||void 0,traits:t.traits,sessionId:pe(),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"||M()||typeof window.addEventListener!="function"||window.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&this.flushWithBeacon();});}flushWithBeacon(){if(this.eventQueue.length===0||M()||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"||M()||!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 O=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 H=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 B=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,c)=>s[1].since-c[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 U=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 c=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=[],c}catch(c){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=[],c}}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(Ue(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 Ue(r){let e=r.length;for(let t of r)e+=Ue(t.children);return e}var me={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 Ve="sitepong_remote_config",$e="sitepong_remote_config_ts",F=class{constructor(e){this.listeners=[];this.refreshTimer=null;this.initialized=false;this.options=e,this.config={...me};}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(Ve),n=await e.getItem($e);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=ae(),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(Ve,JSON.stringify(this.config)),await e.setItem($e,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,c=i[o]||0;if(s>c)return 1;if(s<c)return -1}return 0}log(...e){this.options.debug&&console.log("[SitePong RemoteConfig]",...e);}};var xt="https://ingest.sitepong.com";var V=class{constructor(e){this.metrics=[];this.flushTimer=null;this.flushFailures=0;this.disabled=false;this.vitals={};this.activeTransactions=new Map;this.config={endpoint:xt,enabled:true,webVitals:true,navigationTiming:true,resourceTiming:false,flushInterval:1e4,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&&this.observeWebVitals(),this.config.navigationTiming&&this.collectNavigationTiming(),this.startFlushTimer(),this.log("Performance monitoring initialized"));}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.flush();}observeWebVitals(){if(!(typeof PerformanceObserver>"u")){try{new PerformanceObserver(t=>{let n=t.getEntries(),i=n[n.length-1];i&&(this.vitals.lcp=i.startTime,this.reportVital("LCP",i.startTime));}).observe({type:"largest-contentful-paint",buffered:!0});}catch{}try{new PerformanceObserver(t=>{let n=t.getEntries()[0];if(n){let i=n.processingStart-n.startTime;this.vitals.fid=i,this.reportVital("FID",i);}}).observe({type:"first-input",buffered:!0});}catch{}try{let e=0;new PerformanceObserver(n=>{for(let i of n.getEntries()){let o=i;o.hadRecentInput||(e+=o.value);}this.vitals.cls=e;}).observe({type:"layout-shift",buffered:!0}),typeof document<"u"&&document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&e>0&&this.reportVital("CLS",e,"score");});}catch{}try{new PerformanceObserver(t=>{let n=t.getEntries().find(i=>i.name==="first-contentful-paint");n&&(this.vitals.fcp=n.startTime,this.reportVital("FCP",n.startTime));}).observe({type:"paint",buffered:!0});}catch{}try{let e=0;new PerformanceObserver(n=>{for(let i of n.getEntries()){let o=i.duration;o>e&&(e=o,this.vitals.inp=e);}}).observe({type:"event",buffered:!0});}catch{}}}collectNavigationTiming(){if(typeof window>"u"||!window.performance||!window.location)return;let e=()=>{let t=performance.getEntriesByType("navigation")[0];if(!t)return;let n=t.responseStart-t.requestStart;this.vitals.ttfb=n,this.reportVital("TTFB",n),this.addMetric({type:"navigation",name:"page_load",value:t.loadEventEnd-t.startTime,unit:"ms",timestamp:new Date().toISOString(),url:window.location.href,data:{dns:t.domainLookupEnd-t.domainLookupStart,tcp:t.connectEnd-t.connectStart,ttfb:n,domContentLoaded:t.domContentLoadedEventEnd-t.startTime,domComplete:t.domComplete-t.startTime,transferSize:t.transferSize,encodedBodySize:t.encodedBodySize,decodedBodySize:t.decodedBodySize}});};document.readyState==="complete"?setTimeout(e,0):window.addEventListener("load",()=>setTimeout(e,0));}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=[];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>=3){this.disabled=true,console.warn(`[SitePong Performance] Disabled after 3 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}/3):`,n);}}log(...e){this.config.debug&&console.log("[SitePong Performance]",...e);}};function ze(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 ve(){return ze(16)}function te(){return ze(8)}function ye(){return {traceId:ve(),spanId:te(),parentSpanId:null,sampled:true}}function Z(r){let e=r.sampled?"01":"00";return {traceparent:`00-${r.traceId}-${r.spanId}-${e}`,tracestate:`sitepong=${r.spanId}`}}function Ke(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 c=(parseInt(s,16)&1)===1;return {traceId:i,spanId:te(),parentSpanId:o,sampled:c}}var ee=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=Z(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=ye(),s=Z(o),c={};if(n?.headers)if(n.headers instanceof Headers)n.headers.forEach((f,g)=>{c[g]=f;});else if(Array.isArray(n.headers))for(let[f,g]of n.headers)c[f]=g;else Object.assign(c,n.headers);let l={...c,...s},d={...n,headers:l};return e.originalFetch.call(window,t,d)}return e.originalFetch.call(window,t,n)};}stop(){typeof window>"u"||this.originalFetch&&(window.fetch=this.originalFetch,this.originalFetch=null);}};function kt(){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";A({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=c=>o(c.error||c.message);return r.window.addEventListener("error",s),()=>r.window?.removeEventListener?.("error",s)}if(t&&r.process?.on&&r.process.off){let s=c=>o(c);return r.process.on("uncaughtException",s),()=>r.process?.off?.("uncaughtException",s)}return ()=>{}},onUnhandledRejection(o){if(e&&r.window?.addEventListener){let s=c=>o(c.reason);return r.window.addEventListener("unhandledrejection",s),()=>r.window?.removeEventListener?.("unhandledrejection",s)}if(t&&r.process?.on&&r.process.off){let s=c=>o(c);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}}});}kt();var k={};function qe(r){k={...k,...r};}var m="https://ingest.sitepong.com",Et=10,Ct=5e3,be=3,we=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:m,environment:"production",release:"",autoCapture:true,maxBatchSize:Et,flushInterval:Ct,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 I({apiKey:e.apiKey,endpoint:e.flagsEndpoint||e.endpoint||m,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 P({apiKey:e.apiKey,endpoint:e.endpoint||m,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&&k.createFingerprint?this.fingerprintManager=k.createFingerprint({apiKey:e.apiKey,endpoint:e.endpoint||m,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&&k.createPerformance?(this.performanceManager&&this.performanceManager.destroy(),this.performanceManager=k.createPerformance({apiKey:e.apiKey,endpoint:e.endpoint||m,enabled:true,webVitals:e.performance.webVitals,navigationTiming:e.performance.navigationTiming,resourceTiming:e.performance.resourceTiming,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&&k.createReplay?(this.replayManager&&this.replayManager.stop(),this.replayManager=k.createReplay({apiKey:e.apiKey,endpoint:e.endpoint||m,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 O({apiKey:e.apiKey,endpoint:e.endpoint||m,debug:e.debug})),e.database?.enabled&&(this.databaseTracker=new B({apiKey:e.apiKey,endpoint:e.endpoint||m,debug:e.debug,slowQueryThreshold:e.database.slowQueryThreshold,redactParams:e.database.redactParams})),e.metrics?.enabled&&(this.metricsManager=new H({apiKey:e.apiKey,endpoint:e.endpoint||m,debug:e.debug,flushInterval:e.metrics.flushInterval,maxBatchSize:e.metrics.maxBatchSize})),e.profiling?.enabled&&(this.profiler=new U({apiKey:e.apiKey,endpoint:e.endpoint||m,debug:e.debug,sampleRate:e.profiling.sampleRate,maxDuration:e.profiling.maxDuration,flushInterval:e.profiling.flushInterval})),e.remoteConfig?.enabled!==false){let t=e._storageAdapter||le();this.remoteConfigManager=new F({apiKey:e.apiKey,endpoint:e.endpoint||m,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 I({apiKey:e.apiKey,endpoint:e.flagsEndpoint||e.endpoint||m,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 P({apiKey:e.apiKey,endpoint:e.endpoint||m,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 O({apiKey:e.apiKey,endpoint:e.endpoint||m,debug:e.debug})),e.metrics?.enabled&&(this.metricsManager=new H({apiKey:e.apiKey,endpoint:e.endpoint||m,debug:e.debug,flushInterval:e.metrics.flushInterval,maxBatchSize:e.metrics.maxBatchSize})),e.database?.enabled&&(this.databaseTracker=new B({apiKey:e.apiKey,endpoint:e.endpoint||m,debug:e.debug,slowQueryThreshold:e.database.slowQueryThreshold,redactParams:e.database.redactParams})),e.profiling?.enabled&&(this.profiler=new U({apiKey:e.apiKey,endpoint:e.endpoint||m,debug:e.debug,sampleRate:e.profiling.sampleRate,maxDuration:e.profiling.maxDuration,flushInterval:e.profiling.flushInterval})),e.remoteConfig?.enabled!==false){let t=e._storageAdapter||le();this.remoteConfigManager=new F({apiKey:e.apiKey,endpoint:e.endpoint||m,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>=be){this.disabled=true,console.warn(`[SitePong] SDK disabled after ${be} 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}/${be}):`,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):"",c=[i,o,s].join(`
|
|
2
|
-
`),
|
|
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,
|
|
4
|
-
`;return t}catch{return null}}function
|
|
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
|
+
`),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,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 At="https://ingest.sitepong.com",_t=2e4,Lt=3600*1e3,Te=3,Nt=5e3,q=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:At,enabled:true,maskInputs:true,maxSessionDuration:Lt,flushInterval:5e3,maxBatchSize:100,sampleRate:1,debug:false,bufferDuration:_t,...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=oe({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=[],Je(),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=oe({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>=Te){this.disabled=true,console.warn(`[SitePong Replay] Disabled after ${Te} consecutive failures. Check that ${n} is accessible and has proper CORS headers.`);return}this.log(`Failed to flush replay events (attempt ${this.flushFailures}/${Te}):`,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=ie(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},c=n.tagName?.toLowerCase();if(c==="style"||c==="link"&&n.getAttribute("rel")==="stylesheet"){let l=re(n);l&&(s._cssText=l);}if(i==="class"||i==="style"){let l=Se(n);l&&(s._computedStyle=l);}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=re(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=u=>{this.mouseMoveBuffer.push({x:u.clientX,y:u.clientY,t:Date.now()-this.sessionStartTime}),this.mouseMoveFlushTimer||(this.mouseMoveFlushTimer=setTimeout(()=>{if(this.mouseMoveBuffer.length>0){let p={positions:[...this.mouseMoveBuffer]};this.addEvent("mouse_move",p),this.mouseMoveBuffer=[];}this.mouseMoveFlushTimer=null;},1e3));},t=u=>{let p=u.target;this.addEvent("mouse_click",{x:u.clientX,y:u.clientY,targetId:y(p),button:u.button}),this.takeInteractionSnapshot();},n=u=>{let p=u.target;this.addEvent("mouse_click",{x:u.clientX,y:u.clientY,targetId:y(p),button:2}),this.takeInteractionSnapshot();},i=()=>{this.addEvent("mouse_leave",{});},o=u=>{let p=u.touches[0];if(!p)return;let h=u.target;this.addEvent("touch",{x:p.clientX,y:p.clientY,targetId:y(h)}),this.takeInteractionSnapshot();},s=null,c=()=>{s&&clearTimeout(s),s=setTimeout(()=>{let u={id:0,x:window.scrollX,y:window.scrollY};this.addEvent("scroll",u),this.takeInteractionSnapshot();},1e3);},l=u=>{let p=u.target;if(!p)return;let h={id:y(p),value:this.config.maskInputs?"***":p.value};"checked"in p&&(h.isChecked=p.checked),this.addEvent("input",h);},d=()=>{this.addEvent("resize",{width:window.innerWidth,height:window.innerHeight});},f=u=>{u.target&&u.target!==document&&this.addEvent("focus",{id:y(u.target)});},g=u=>{u.target&&u.target!==document&&this.addEvent("blur",{id:y(u.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",c,{passive:true}),document.addEventListener("input",l,{passive:true}),window.addEventListener("resize",d,{passive:true}),document.addEventListener("focus",f,{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",c),()=>document.removeEventListener("input",l),()=>window.removeEventListener("resize",d),()=>document.removeEventListener("focus",f,{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 K(e=>{this.addEvent("console",e.data);},{levels:this.config.consoleLevels}),this.consoleRecorder.start());}startTrimTimer(){this.trimTimer=setInterval(()=>{this.trimBuffer();},Nt);}takeInteractionSnapshot(){let e=Date.now();if(e-this.lastSnapshotTime<this.snapshotCooldown)return;this.lastSnapshotTime=e;let t=oe({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{Ye(n.href).catch(()=>{});}}}log(...e){this.config.debug&&console.log("[SitePong Replay]",...e);}};function xe(){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=Ot(r);e+=t;let n=Ht(r);e+=n;let i=Bt(r);e+=i;let o=Ut(r);e+=o;let s=Vt(r);e+=s;let c=$t(r);return e+=c,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 Ot(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),c=/Win/.test(n),l=/Mac/.test(n),d=/Linux/.test(n);(i&&!c||o&&!l||s&&!d)&&(r.platformMismatch=true,r.uaSpoofed=true,e+=.3);let f=/Chrome\/\d+/.test(t)&&!/Edge|OPR|Brave/.test(t);f&&!("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 u=navigator;if(u.userAgentData?.brands){let v=u.userAgentData.brands.map(E=>E.brand);(v.length===0||v.every(E=>E===""||E==="Not A;Brand"))&&(r.antiDetectBrowser=true,e+=.25);}/mobile|android|iphone|ipad/i.test(t)||(navigator.plugins?.length||0)===0&&f&&(r.pluginAnomaly=true,e+=.1);let p=navigator.hardwareConcurrency||0,h=navigator.deviceMemory||0;return p>0&&h>0&&p>=16&&h<=1&&(r.featureAnomaly=true,e+=.15),Math.min(e,.5)}function Ht(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 c=n.getImageData(0,0,100,20).data,l=!0,d=!0,f=c[0];for(let u=0;u<c.length;u+=4)(c[u]!==0||c[u+1]!==0||c[u+2]!==0)&&(l=!1),c[u]!==f&&(d=!1);(l||d)&&(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 Bt(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),c=["Brian Paul","Mesa","VMware"];["llvmpipe","softpipe","Mesa","SwiftShader"].some(h=>s.includes(h))&&!c.some(h=>o.includes(h))&&(r.webglSpoofed=!0,e+=.25);let d=navigator.userAgent,f=/mobile|android|iphone|ipad/i.test(d),g=/GeForce|Radeon|Intel.*HD|GTX|RTX|Vega/i.test(s);f&&g&&(r.webglSpoofed=!0,e+=.3);let u=Object.getOwnPropertyDescriptor(WebGLRenderingContext.prototype,"getParameter");u&&typeof u.value=="function"&&(u.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 Ut(r){if(typeof navigator>"u"||typeof window>"u")return 0;let e=[],t=navigator.userAgent;try{let s=document.createElement("canvas"),c=s.getContext("webgl")||s.getContext("experimental-webgl");if(c&&c instanceof WebGLRenderingContext){let l=c.getExtension("WEBGL_debug_renderer_info");if(l){let d=c.getParameter(l.UNMASKED_RENDERER_WEBGL).toLowerCase(),f=c.getParameter(l.UNMASKED_VENDOR_WEBGL).toLowerCase(),g=["vmware","virtualbox","hyper-v","parallels","qemu","llvmpipe","mesa"],u=["vmware","innotek","microsoft basic","parallels"];for(let p of g)d.includes(p)&&e.push(`webgl_renderer:${p}`);for(let p of u)f.includes(p)&&e.push(`webgl_vendor:${p}`);}}}catch{}if(typeof screen<"u"){let s=screen.width,c=screen.height;[[800,600],[1024,768],[1280,800]].some(([d,f])=>s===d&&c===f)&&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 l=0;l<10;l++)s.push(performance.now());new Set(s.map(l=>Math.floor(l*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 Vt(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 $t(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 et(){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:zt(),localStorage:Kt(),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 tt(){let r={};r.canvasFingerprint=qt();let e=Wt();return r.webglVendor=e.vendor,r.webglRenderer=e.renderer,r.audioFingerprint=await Gt(),r.fontFingerprint=nn(),r.mathFingerprint=rn(),r.webglRenderHash=on(),r.cssFeatureHash=sn(),r.localIps=await an(),r}async function ke(r){let t={...et()};r&&(t.extended=await tt());let n=rt();return t.smart=n,t.incognito=n.incognito,t.bot=n.bot,t}async function nt(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 rt(){let r={};r.incognito=Xt(),r.bot=jt(),r.privacyBrowser=Qt(),r.devToolsOpen=Yt(),r.connectionType=Jt(),r.doNotTrack=Zt(),r.notificationsEnabled=en();let e=tn();r.deviceFirstSeen=e.firstSeen,r.deviceVisitCount=e.visitCount;let t=xe();return r.browserTampered=t.browserTampered,r.canvasTampered=t.canvasTampered,r.webglTampered=t.webglTampered,r.vmDetected=t.vmDetected,r.vmIndicators=t.signals.vmIndicators,r}function zt(){try{let r="__sp_test__";return sessionStorage.setItem(r,"1"),sessionStorage.removeItem(r),!0}catch{return false}}function Kt(){try{let r="__sp_test__";return localStorage.setItem(r,"1"),localStorage.removeItem(r),!0}catch{return false}}function qt(){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),D(r.toDataURL())):void 0}catch{return}}function Wt(){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 Gt(){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 D(`audio:${o.toFixed(6)}`)}catch{return}}function Xt(){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 jt(){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 Qt(){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 Yt(){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 Jt(){if(typeof navigator>"u")return;let r=navigator.connection;if(r)return r.effectiveType||r.type||void 0}function Zt(){if(typeof navigator>"u")return false;let r=navigator.doNotTrack;return r==="1"||r==="yes"}function en(){return typeof Notification>"u"?false:Notification.permission==="granted"}function tn(){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 nn(){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 l of r)o.font=`${n} ${l}`,s[l]=o.measureText(t).width;let c=[];for(let l of e)for(let d of r)if(o.font=`${n} '${l}', ${d}`,o.measureText(t).width!==s[d]){c.push(l);break}return D(c.join(","))}catch{return}}function rn(){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 D(r.map(e=>e.toString()).join(","))}catch{return}}function on(){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),D(r.toDataURL())}catch{return}}function sn(){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 D(e)}catch{return}}async function an(){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 D(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 W=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 d=1;d<this.mousePoints.length;d++){let f=this.mousePoints[d-1],g=this.mousePoints[d],u=g.t-f.t||1,p=g.x-f.x,h=g.y-f.y,v=Math.sqrt(p*p+h*h),E=v/u;if(e.push(E),v<3&&v>0&&o++,d>=2){let w=this.mousePoints[d-2],st=w.x+(g.x-w.x)*((f.t-w.t)/(g.t-w.t)),at=w.y+(g.y-w.y)*((f.t-w.t)/(g.t-w.t)),ct=Math.sqrt((f.x-st)**2+(f.y-at)**2);i++,ct<2&&n++;}if(d>=2){let w=e[e.length-2]||0;t.push(Math.abs(E-w)/u);}}let s=e.reduce((d,f)=>d+f,0)/e.length,c=Math.max(...e),l=t.length>0?t.reduce((d,f)=>d+f,0)/t.length:0;return {totalMovements:this.mousePoints.length,averageSpeed:Math.round(s*1e3)/1e3,maxSpeed:Math.round(c*1e3)/1e3,averageAcceleration:Math.round(l*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 c=this.scrollEvents[s].t-this.scrollEvents[s-1].t||1,l=Math.abs(this.scrollEvents[s].deltaY-this.scrollEvents[s-1].deltaY);e.push(l/c);}let n=e.reduce((s,c)=>s+c,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 c=.5;e.jitter>.05&&(c+=.15),e.straightLineRatio<.5?c+=.15:e.straightLineRatio>.9&&(c-=.2),e.averageSpeed>0&&e.maxSpeed/e.averageSpeed>3&&(c+=.1),e.averageAcceleration>0&&(c+=.1),o+=Math.max(0,Math.min(1,c))-.5;}if(t.hasKeystrokes){s++;let c=.5;t.intervalVariance>1e3?c+=.2:t.intervalVariance<100&&(c-=.2),(t.averageInterval>0?Math.sqrt(t.intervalVariance)/t.averageInterval:0)>.3&&(c+=.15),t.holdTimeVariance>500&&(c+=.1),o+=Math.max(0,Math.min(1,c))-.5;}if(n.hasScroll){s++;let c=.5;n.smoothness>.3&&n.smoothness<.9&&(c+=.2),o+=Math.max(0,Math.min(1,c))-.5;}if(i.hasClicks){s++;let c=.5;i.intervalVariance>5e4?c+=.15:i.intervalVariance<100&&(c-=.2),o+=Math.max(0,Math.min(1,c))-.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 Ee(){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=cn(),r.torBrowser&&(i=true,e+=.9);try{r.webrtcLeak=await ln(),r.webrtcLeak&&(t=!0,e+=.3);}catch{r.webrtcLeak=null;}r.connectionType=un(),(r.connectionType==="unknown"||r.connectionType===null)&&(e+=.05),r.knownVPNExtension=dn(),r.knownVPNExtension&&(t=true,e+=.4);let o=Intl.DateTimeFormat().resolvedOptions().timeZone,s=navigator.language;if(o&&s){let c=fn(o),l=s.split("-")[1]?.toUpperCase();c&&l&&c!==l&&(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 cn(){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 ln(){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 un(){if(typeof navigator>"u")return null;let r=navigator;return r.connection&&(r.connection.type||r.connection.effectiveType)||null}function dn(){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 fn(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 pn="https://ingest.sitepong.com",Ce="sitepong_visitor",it=720*60*60*1e3,ot="__sp_vid",gn=63072e3,G=class{constructor(e){this.cachedVisitor=null;this.pendingRequest=null;this.config={endpoint:pn,enabled:true,debug:false,...e},this.behaviorAnalyzer=new W,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");M()?X():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 ke(this.config.extendedSignals??false)}async getFraudCheck(){let[e,t,n]=await Promise.all([this.getVisitorId(),this.getDeviceSignals(),Ee().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 nt(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>it:true}loadFromStorage(){if(!(typeof window>"u"||typeof localStorage>"u"))try{let e=localStorage.getItem(Ce);if(!e)return;let t=JSON.parse(e);this.isCacheExpiredAt(t.cachedAt)?localStorage.removeItem(Ce):(this.cachedVisitor=t,this.log("Loaded cached visitor from storage"));}catch{}}saveToStorage(){if(!(typeof window>"u"||typeof localStorage>"u")&&this.cachedVisitor)try{localStorage.setItem(Ce,JSON.stringify(this.cachedVisitor));}catch{}}isCacheExpiredAt(e){return Date.now()-e>it}getCookieVisitorId(){if(!(typeof document>"u"))try{return document.cookie.match(new RegExp(`(?:^|; )${ot}=([^;]*)`))?.[1]||void 0}catch{return}}setCookieVisitorId(e){if(!(typeof document>"u"))try{document.cookie=`${ot}=${e}; path=/; max-age=${gn}; SameSite=Lax`;}catch{}}log(...e){this.config.debug&&console.log("[SitePong Fingerprint]",...e);}};A(Me());qe({createReplay:r=>new q(r),createFingerprint:r=>new G(r),createPerformance:r=>new V(r)});
|
|
8
|
-
exports.TracePropagator=
|
|
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
|