diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index 659668c..5b0047c 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -54,6 +54,9 @@ jobs: - name: Test BrowserStack matrix selection run: pnpm run test:matrix + - name: Run unit tests + run: pnpm run build && pnpm run test:unit + - name: Prettier check (report only, no writes or commits) if: always() run: | diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index c6c62a8..e6b4bf2 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; b9db; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 6cf3; v12) */ /* eslint-env browser */ (function ( @@ -298,7 +298,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -310,7 +310,7 @@ image.onerror = callback; image.onload = callback; } - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -327,6 +327,23 @@ .join("&") + "&time=" + Date.now(); + + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -905,7 +922,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -953,7 +970,9 @@ metadata: stringify(metadata), }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -982,6 +1001,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } } catch (e) { sendError(e); } diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 50e7c3c..80658ac 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 2be9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; dced; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map index d49fd42..81a83e2 100644 --- a/dist/latest/custom/app.js.map +++ b/dist/latest/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAhBW3B,WAgB4BR,EACvCoC,EAAkBf,EAAIe,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAASzB,EAAI0B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK5B,KAAe,WAAW4B,KAAK5B,GACxD6B,EAAStD,EAAOsD,OAIhBC,EACFhC,EAAIiC,eAAiBjC,EAAIkC,cAAc,gBAAkBvD,EAAU,MAOrEE,EAAO,WAEL,IAAIsD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK9C,EAAIV,KAAMU,EAAK4C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnChE,EAAK,iBAAmB+D,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWjG,EAAOkG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKnG,GAAkBqF,OAG5DrF,EAAmB0F,EAAO1F,EAAkBgG,GAExCE,GAAa/F,EAAK,WAAYH,GAGlC,IA+EIoG,GA/EAC,GAAgBpB,EAClBjF,EAAiBqG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe9G,EAAO+G,QAAU/G,EAAOgH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF5H,EAAiB2H,KACjB7C,EAAKxB,EAAeqE,KAiyBxB,KA9xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBjI,EAAO6H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BlI,EAAOmI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACF/H,EACE+H,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK5D,EAAQ2F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFnI,EAAiBmI,WACjBrD,EAAKxB,EAAe,eAAiB9C,EAInC4H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAK/F,EACvD,IAAIgI,GAAKD,GAAmBpH,EAAIsH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM7F,GAAgB,EAAJmI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe9E,EAInC,IAAIkG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKhG,EACFmI,GAAKnI,GA+BV8I,GAAiBtB,GAAY,UACjC,GAAI7H,EAAOmJ,KAAmB5I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOoJ,gBAAkB7I,EACzBP,EAAOmJ,IAAkB5I,EAOzB,IAAI8I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/C/G,EAAIyI,QAAUH,IAAcvB,EAAK0B,MAAQnJ,GACzCU,EAAI0I,qBAAuBJ,IAAcvB,EAAK4B,KAAOrJ,GAGzD,IAAIsJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ5H,EACA,eACAmC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ7J,IAErB2I,IAAI,SAAUkB,GACb,OACErI,EAAuBqI,GACvB,IACArI,EAAuBmG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFlK,EAAiBmK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB9I,EAEzCiJ,GAAc,CAChBC,QA+oBJ,gBA9oBIH,SAAUC,IASZlK,EAAY,SAAUqK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJpK,EAAKoK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM7J,EACNuD,MAAOoG,EACPG,KAAMxJ,EAAIyJ,WAEZvK,EACAE,IAMJ4B,EACEtB,EACA,SAAUgK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ1I,IAC3CC,EAAU0K,EAAME,UAGpBvK,GAOF,IAwDIwK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOlL,EAAiBkL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCpL,EAAiBmL,cA9KvBC,GA+KjBpL,EAAiBmL,WACjBrG,EAAKxB,EAAe,eAAiB9C,GACrCsE,EAAKxB,EAAe,aAAe9C,GACnCsE,EAAKxB,EAAe,gBAAkB9C,EAGtC6K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBtD,EAAiBqL,cAAgB9K,GAI/B+K,GACFtL,EAAiBuL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMjH,EAGhB6K,GAAcvG,EAChBjF,EAAiBwL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBjF,EAAiB8I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBjF,EAAiByL,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF1L,EAAiB0L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFlI,EAAiBkI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC1L,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAI4H,GAAUhM,EAAOgM,QACjBC,GACFhL,EAAIiL,WACJlM,EAAOmM,aACPnM,EAAOoM,aACPpM,EAAOqM,UACNL,KAAYA,GAAQM,QACrBtM,EAAOuM,YACPvM,EAAOwM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM1L,GAE3B,IAAIiJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ9E,EAAYpB,EAE9CK,MAAOS,EAAIwL,UAAYjM,EACvBsK,SAAUA,GACV4B,QAASH,GAAqB5F,KAASxG,EAGvCwM,WAAYtG,GAAsB,MAAQM,KAASxG,IA0BrD,GAvBAmJ,GAAQsD,IAAMtM,EAIVkC,IACF8G,GAAQuD,OAASrK,EAAOqK,OACxBvD,GAAQwD,OAAS/K,EAAUS,EAAOsK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBiK,KAAoBhJ,IACtBmI,GAAQ0D,kBAAoB7L,IAGzB+J,IAAcpK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBuH,QAAQ,OACxB,aAAavF,KAAKhC,IACnB8I,IAED/J,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACIiK,GA0DAC,GA3DA3D,GAAO,GAGP4D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYvI,EAAKxB,EAAe,aAGzBhC,EAAI+L,UAAY,IACrCxI,QAAQzD,EAAkBgJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKjB,GAAL,CAEA,IAAIkB,EAAShI,EAAO2E,GAAa,CAC/BI,KAAM,SACNkD,YAAaF,EAAOD,EAAKjE,GAAQoD,UAenC,GAXIrG,GAAsB,OACxBoH,EAAOE,SAAWrG,KAAKsG,OAAOnH,KAAQsE,GAAQsC,IAngBnC,MAqgBbA,GAAW,EACXtC,GAAQtE,KAGJJ,GAAsB,UACxBoH,EAAOzC,SAAW1D,KAAKuG,IAAI,EAAG7C,GAAU8C,OAGtCN,IAASzM,EAAIgN,WAEf5E,GAASsE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP9E,GAASsE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOrL,KAAY/C,GAASwN,KAClCJ,GAAczG,MACT4G,IAAY5G,KAAQyG,IAE7B5M,GAGF2B,EAAqBY,EAAUyK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuBhM,EAAgBQ,IAAiB,EACxDyL,EAAS/G,KAAKuG,IAChBM,GAAKzL,IAAiB,EACtByL,GAAKxL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAKgH,IACV,IAKI,EAJJhH,KAAKsG,MACF,MAAQxL,EAAgBmM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOnK,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3B+I,GAAW8C,KACX7L,EACEM,EACA,WACMyI,GAAW8C,OAAY9C,GAAW8C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAInE,EAAO,GAIX,IACEA,EAAOmE,GAAa/M,EAAuBZ,EAAIyJ,UAC/C,MAAOxG,IACPhE,EAAKgE,IAGP,IAAI2K,EAAyB/O,EAAO2L,IACpC,GAAIjE,GAAWqH,GACb,IACEpE,EAAOoE,EAAuBnL,KAAK5D,EAAQ,CAAE2K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIuD,EAAgBvD,GAAY9C,GAChC,GAAKqG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAetE,GACf,IAAIjE,OACF,IAAM9B,EAAYqK,GAAYnK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOpK,GAEX,OAAOC,EA0XH0O,CAAavE,GAQjB,MAFY,QAARQ,IAAkBhK,EAAIgO,OAAMxE,GAAQxJ,EAAIgO,KAAK5J,MAAM,KAAK,IAErDoF,EAPLvK,EAAKuB,EAAiB,YAAcgJ,IAgDpCyE,GAAW,SACbC,EACAC,EACAvH,EACAwH,IAEKA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GACxD,IACIyH,EAGEC,EAJFnG,EAAW5B,GAAW6H,GAAeA,EAAc,aAEnD7K,EAAS4K,KAAgD,EAA9BA,EAAc1G,QAAQ,OAGnD0G,GADIG,EAAQH,EAAc/J,MAAM,MACVmK,QACtBF,EAAc,IAAMC,EAAMxG,KAAK,MAGjC,IAAI0B,EAAOkE,GAAQS,GAGnB,GAAK3E,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKkG,eACHnI,KAAKuG,IAAIzL,EAA2B,aAAK,EAAGtC,EAAO4P,YAAc,IACjE,KACFnG,GAAKoG,gBACHrI,KAAKuG,IACHzL,EAAgBQ,IAAiB,EACjC9C,EAAO8P,aAAe,IACnB,MAILvJ,GAAsB,MACpBtF,EAAIsB,KAAWkH,GAAKlH,GAAYtB,EAAIsB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKsG,aAAezM,EAAO0M,MAC3BvG,GAAKwG,cAAgB3M,EAAOiL,QAI9B,IAII2B,EAJAC,EAAOnQ,EAAOoQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG3F,KAC/D,MAAOtG,IACPhE,EAAKgE,IAGPwK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBtH,QAAQsH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGzH,QAAQuH,EAAKE,GAAgB3F,MAGxC,IAAI6F,EAA0BjD,GAC1BA,GAAS/H,MA1uBH,KA0uBgB,GACtBlF,EACJsO,GAAWrB,IACgD,EAAvD5B,GAAmB9C,QAAQ2H,IAC3BA,GAA2BlP,EAC3Bb,EAGJiJ,GAAK+G,OACH,QAAQnN,KAAKgK,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP5G,EAAWD,GAAeC,EAAU,CAClC2C,KAAM/J,EACNgK,KAAMlB,GAAKkB,OAGb,IAAI8F,EAAsB,WACxB7O,EAA2BrB,EAC3B,IAAImQ,EACFrB,GAAeT,KAAkBrI,GAAsB,MA7H1C,SACjB8I,EACAsB,EACAhC,EACAlG,EACAV,EACAuB,GAEI+F,GAAa7B,GAAY,GAAKhE,GAAQoD,QAASrM,GAC/CkM,KAAoBjD,GAAQoD,QAAU/F,MAE1C,IAAI+J,EAAcvG,GAAkBwE,KAChCgC,EAAQxI,GAAesI,EAAkBlI,GAE7CY,GACE,CACEoE,GAAIjE,GAAQoD,QACZlC,KAAM/J,EACN2M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACPxK,EAAGA,GAEH0B,SAAU9F,EAAU8F,IAEtBuB,GAGFoF,GAAmBpB,GACnBA,GAAWsD,EAEXzN,IAgGE2N,CACEzB,EACAqB,EACA/B,GACAa,EACAzH,EACAuB,IAIJ,GAAK1H,EAmBH6O,SAjBA,IACM/N,GAAUgF,GAAWhF,EAAOqO,sBAC9BrO,EACGqO,qBAAqB,CAAC/N,EAAcC,IACpC+N,KAAK,SAAUC,GACdzH,GAAQ0H,QAAUD,EAAkBjO,GACpCwG,GAAQ2H,WAAaF,EAAkBhO,GACvCwN,MAEDW,SAAMX,GAETA,IAEF,MAAOtC,GACPsC,OAWFY,GAAMrR,EAAOsR,QACbC,GAAeF,GAAMA,GAAIG,UAAYnR,EACrCoR,GAAMzR,EAAO0R,cACbC,GAAgB,YAIhBrG,IAAeiG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB3G,GAoBAiH,IAlBrB,WACL,IAEI9G,EAFAhF,EAAMhC,UACNiO,EAAKD,GAAK5N,MAAM8N,KAAMlM,GAY1B,OAVI6B,GAAWkK,OACb/G,EAAQ,IAAI+G,MAAMlH,KAIlBG,EAAQtJ,EAAIyQ,YAAY,UAClBC,UAAUvH,GAAMnK,EAASA,GAEjCsK,EAAMhH,UAAYgC,EAClB4L,GAAI5G,GACGiH,IAMX3P,EACEwP,GACA,WACEvC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA8K,IAAuB,QAARH,IAAkB,iBAAkBnL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA8K,IAAa8D,KAEjBpP,EAAOkS,YAAc,SAAUvH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI6I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUvH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIsK,EAAkB3K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnD+C,SAAmBzH,EAEvB,GAAIsH,GAAWvJ,QAAQ0J,GAAa,IAAMD,EAExC,OADAnO,EAAeqH,GAAmB3K,EAAY,aAAe0R,GACtDhJ,IAGT,IACE,GAAI+I,EAAiB,CACnB,IAAIE,EAAc1H,IAClB,GAAIsH,GAAWvJ,eAAe2J,GAAe,EAK3C,OAJArO,EACEqH,GACAV,EAAQ,uBAAyB0H,GAE5BjJ,IAETuB,EAAQ0H,GAEV,MAAOnO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI0N,EAAc,CAAE9H,KAAM9J,EAAWiK,MAAOA,GACxC4H,GAAa7D,IAAiBzL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUyK,GAEhC3H,GACFxB,GACE1D,EAAO6M,EAAa,CAClB/E,GAAI5G,KACJgK,MAAOxI,IAAgBoK,GACvBnF,UACGmF,GAAa9D,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAU9F,EAAU8F,KAEtBuB,IAKFoJ,GAAmB,SAAU7H,EAAO9C,EAAUuB,GAChD8I,GAAUvH,EAAO9C,EAAUuB,IAIxBtJ,EAAOuL,MACVvL,EAAOuL,IAAqBmH,IAE9B,IAAIC,GAAY3S,EAAOuL,IAGnBqH,GAAQD,IAAaA,GAAUnK,EAAImK,GAAUnK,EAAI,GAMrD,IAAK,IAAIqC,MAHT7K,EAAOuL,IAAqBmH,GAGVE,GACZvO,EAAQuO,GAAO/H,MACjBzF,MAAMC,QAAQuN,GAAM/H,KAChBuH,GAAUnO,MAAM,KAAM2O,GAAM/H,KAC5BuH,GAAUQ,GAAM/H,MAGxB,MAAOsD,IACPhO,EAAUgO,IA7IY,IAAUzD,GACxBmH,GArnBkBxG,GAnN9B,CAu9BErL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index 56af8e4..edf0362 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; a33e; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; a84b; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,v){try{var m=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,f=b.userAgent,p="Not sending request ",d=p+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){v("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&v(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map index 7d67aee..9bf41c9 100644 --- a/dist/latest/custom/e.js.map +++ b/dist/latest/custom/e.js.map @@ -1 +1 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js index 8dc894a..3d22c76 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 3665; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; e9a1; v12) */ /* eslint-env browser */ (function ( @@ -296,7 +296,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -309,7 +309,7 @@ image.onerror = callback; image.onload = callback; } - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -326,6 +326,23 @@ .join("&") + "&time=" + Date.now(); + + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -905,7 +922,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -953,7 +970,9 @@ metadata: stringify(metadata), }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -982,6 +1001,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } } catch (e) { sendError(e); } diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index f331c1b..d61b736 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 2fea; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 1805; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,f=b.userAgent,p="Not sending request ",d=p+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(f)&&!/(cubot)/i.test(f),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map index e2232a8..82a6992 100644 --- a/dist/latest/custom/latest.js.map +++ b/dist/latest/custom/latest.js.map @@ -1 +1 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index f32008e..6aa847a 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 1b6a; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; fa6c; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,i="doNotTrack",m=l.navigator,p=l.location,g=p.host,a=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); +!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index a65fce3..8672605 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAhBWvB,WAgB4BJ,EAEvC4B,GADkBd,EAAIe,gBACX,YAIXC,EAAStB,EAAIuB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCAEVC,EACF,sBAAsBC,KAAKpB,KAAe,WAAWoB,KAAKpB,GAIxDqB,EACFvB,EAAIwB,eAAiBxB,EAAIyB,cAAc,gBAAkBvC,EAAU,MAOrEC,EAAO,WAEL,IAAIuC,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAKrC,EAAIJ,KAAMI,EAAKmC,IAGtD,IAQIQ,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAOZC,EAAO,SAAUb,EAAec,GAClC,OAAOd,GAAiBA,EAAce,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMf,UACDgB,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOjB,UAAUmB,eAAevB,KAAKY,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAGLS,EAAWpE,EAAOqE,YAClBC,EAAcF,GAAYH,OAAOM,KAAKtE,GAAkB6D,OAG5D7D,EAAmBsD,EAAOtD,EAAkBmE,GAExCE,GAAanE,EAAK,WAAYF,GAQxBuE,KAAKC,IALf,IAOIC,EAAO,WACT,IAAIC,EAAe3E,EAAO4E,QAAU5E,EAAO6E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAKpBK,EAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,EAAgB,YAChBC,EACF3F,EAAiB0F,IACjBvC,EAAKb,EAAeoD,IAiaxB,KAvZME,EACF5F,EAAiB4F,WAvKJ,QAwKbzC,EAAKb,EAAe,cAoClBuD,EAAiBF,EAAY,UACjC,GA/Mc,GA+MV5F,EAAO8F,GAA4B,OAAO3F,EAAKgB,EAAa,SAChEnB,EAAO+F,iBAhNO,EAiNd/F,EAAO8F,IAjNO,EAwNd,IA8DIE,EA9DAC,EAAW,SAAUC,EAAMC,EAAUC,EAAcC,GACrDH,EAAOE,EAAeF,EAAO3C,EAAO+C,EAASC,EAAML,GAE/CxF,EAAI8F,QAAUJ,IAAcF,EAAKM,OA3NzB,GA4NR9F,EAAI+F,qBAAuBL,IAAcF,EAAKQ,MA5NtC,GA+NZ,IAAIC,EAAQ,IAAIC,MACZC,EACFhF,EACA,eACAoC,OAAOM,KAAK2B,GACTY,OAAO,SAAUC,GAChB,OAAOb,EAAKa,IAAQ3G,IAErB4G,IAAI,SAAUD,GACb,OACE1F,EAAuB0F,GACvB,IACA1F,EAAuB6E,EAAKa,MAG/BE,KAAK,KACR,SACAzC,KAAKC,MAEPkC,EAAMO,IAAML,GAIVM,EACFlH,EAAiBmH,UAAYhE,EAAKb,EAAe,YAC/C8E,EAAkBF,GAAuBrG,EAEzCwG,EAAc,CAChBC,QAmUJ,kBAlUIH,SAAUC,GAeDpH,EAAiBuH,MAAQpE,EAAKb,EAAe,QAYxD,IAEEyD,EACIyB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOvC,GACPlF,EAAKkF,GAQGhD,IAMDiF,EAAYO,KA3SP,GA6Sd,IAAIvB,EAAU/C,EAAO+D,EAAa,CAEhCQ,GAAkC5G,EAElCZ,MAAOM,EAAImH,UAAYzH,EACvB0F,SAAUA,EACVgC,QAA8BtD,IAG9BuD,WAA0CvD,MAwB5C,GArBA4B,EAAQ4B,KAxTO,EA4TXlG,IACFsE,EAAQ6B,OAASnG,EAAOmG,OACxB7B,EAAQ8B,OAAS3G,EAAUO,EAAOoG,SAWhCf,IAAoBvG,IACtBwF,EAAQ+B,kBAAoBvH,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EA/TYgB,4BAgUAV,EAAa,oBAAsB2B,EAAU,SAK7B,GAAlCtB,EAAiBwH,QAAQ,OACxB,aAAahG,KAAKxB,IACnBqG,GAEDhH,EACE,mBACEW,EACA,SACAsB,EACA,0BAON,IACImG,EADAhC,EAAO,GAiBPiC,GAXAvI,EAAiBuI,UAAYpF,EAAKb,EAAe,aAGzBvB,EAAIwH,UAAY,IACrCxD,QAAQlE,EAAkBuG,GAC1BrC,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS5E,EAcjCqI,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAASrF,EAAO+D,EAAa,CAC/BuB,KAAM,SACNC,YAAaH,EAAOD,EAAKpC,EAAQ0B,UAKnC,GAAIW,IAASjI,EAAIqI,WAEf9C,EAAS2C,EAAQxI,GA3YP,QA6YV,IACEM,EAAIqI,WAAWC,KAAKtI,EAApBA,CAAyBmB,EAAa,UAAWJ,EAAUmH,IAC3D,MAAOK,GAEPhD,EAAS2C,EAAQxI,GAjZT,KAuZduB,EArXe,WAqXgB8G,GAtZhB,GA6Zf,IAmDIS,EAAUC,EAnDVC,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAa9H,EAAuBX,EAAI2I,UAC/C,MAAOlE,GACPlF,EAAKkF,GAMP,OAAOiE,GAMLE,EAAe,SACjBC,EACAC,EACAR,EACAS,EACAC,EACAzD,GAEIsD,GAAahB,EAAY,GAAKnC,EAAQ0B,SA1b9B,GA2bY1B,EAAQ0B,QAAUtD,IAE1C,IAhR6BmF,EAgRzBC,EAAczC,EAAkB+B,IAChCW,GAjRyBF,EAiRFH,GAAkBC,GAhRjB/I,EAAI+I,QAC7BhH,MAAM,GACNqH,MAAM,KACNlD,OAAO,SAAUmD,GAIhB,OAFaJ,GAaN,IAAIK,OART,YACCrE,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,KAIuB,KAAKvD,KAAK2H,KAEpChD,KAAK,MAEI7G,GA4PZ6F,EACE,CACEyC,GAAIpC,EAAQ0B,QACZa,KA/ba,WAgcbL,UAAWkB,GAAoBR,EAAWV,EAAW,KACrDuB,MAAOA,IAOXvB,EAAWsB,EAEXK,IAKa,SACbV,EACAW,EACAR,EACAS,IAEKA,GAAe5E,EAAWmE,KAAWS,EAAcT,GACxD,IACIU,EAGEC,EAJS9E,EAAW4E,GAEtBnH,EAASkH,KAAgD,EAA9BA,EAAc9B,QAAQ,OAGnD8B,GADIG,EAAQH,EAAcJ,MAAM,MACVQ,QACtBF,EAAc,IAAMC,EAAMtD,KAAK,MAGjC,IAAIqC,EAAOF,EAAQgB,GAGnB,GAAKd,GAAQf,GAAgBe,EAA7B,CAEAf,EAAee,EACf/C,EAAK+C,KAAOA,EAKN5I,EAAIoB,KAAWyE,EAAKzE,GAAYpB,EAAIoB,IAK1C,IAII2I,EAJAC,EAAO1K,EAAO2K,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG/B,KAC/D,MAAOxD,GACPlF,EAAKkF,GAGP8D,EAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBnC,QAAQmC,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGtC,QAAQoC,EAAKE,GAAgB/B,MAGxCK,IAAWV,GACPA,EAASwB,MAlgBH,KAkgBgB,IAAMlJ,EAKhC,IAAIgK,EAAsB,WACxB1J,GA9gBU,EAihBVoI,EACEC,EAFAA,GAAeN,IAAiB,EAIhCD,EACAoB,IAMJ,GAAKlJ,EAmBH0J,SAjBA,IACM9I,GAAUyD,EAAWzD,EAAO+I,sBAC9B/I,EACG+I,qBAAqB,CAAC7I,EAAcC,IACpC6I,KAAK,SAAUC,GACd3E,EAAQ4E,QAAUD,EAAkB/I,GACpCoE,EAAQ6E,WAAaF,EAAkB9I,GACvC2I,MAEDM,SAAMN,GAETA,IAEF,MAAO7B,GACP6B,MASNO,GAEA,MAAOpC,GACP9I,EAAK8I,IA1kBT,CA6kBEjJ,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 67ce58b..7779633 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 3faa; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 09c1; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map index f859b43..0219736 100644 --- a/dist/latest/custom/proxy.js.map +++ b/dist/latest/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index b9dc364..bbca586 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; e718) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 4044) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hello.source.js","sources":["hello.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js index 57f7f5d..7fcde74 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 4ae9; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 9630; v12) */ /* eslint-env browser */ (function ( @@ -296,7 +296,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -309,7 +309,7 @@ image.onerror = callback; image.onload = callback; } - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -326,6 +326,23 @@ .join("&") + "&time=" + Date.now(); + + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -905,7 +922,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -953,7 +970,9 @@ metadata: stringify(metadata), }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -982,6 +1001,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } } catch (e) { sendError(e); } diff --git a/dist/latest/latest.js b/dist/latest/latest.js index d4e8c8e..51b4691 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; dbab; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 986a; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 8f61160..807f3d7 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 5f98; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; a4f9; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!1,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index a428f09..d8677e3 100644 --- a/dist/v12/app.js +++ b/dist/v12/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; ac4d; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 093c; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,E=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,q="https://queue."+e,M=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[qt];if(!it(r))return qt&&m(qt+" not found, set window."+qt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAIAC,EACAC,GAEA,IAQE,IAAIC,EAAeC,UACfC,GAAU,EACVC,GAAW,EACXC,EAAW,OACXC,EAAQ,SACRC,EAAe,WACfC,EAAY,QACZC,EAAY,QAGZC,EAAMd,EAAOe,QACbC,EAAa,aACbC,EAAMjB,EAAOkB,UACbC,EAAMnB,EAAOoB,SACbC,EAAmBF,EAAIG,KACvBC,EAAMvB,EAAOwB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAiBD,EAAa,QAC9BE,EAA2BpB,EAC3BqB,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBnC,EAAOoC,iBAC9BC,EAAaC,iBAA0BpC,EACvCqC,EAAkBhB,EAAIgB,iBAAmB,GACzCC,EAAW,WACXC,EAAS,SAETC,EAAS,SACTC,EAAS1B,EAAI2B,cACbC,EAAeH,EAASD,EACxBK,EAAe,SAAWL,EAC1BM,EAAe,SAAWN,EAE1BO,EAAW,WACXC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EAAQ,EACRC,EACF,sBAAsBC,KAAK7B,KAAe,WAAW6B,KAAK7B,GACxD8B,EAASvD,EAAOuD,OAIhBC,EACFjC,EAAIkC,eAAiBlC,EAAImC,cAAc,gBAAkBxD,EAAU,MAOrEE,EAAO,WAEL,IAAIuD,EAAO,GAAGC,MAAMC,KAAKC,WAOzB,OAJAH,EAAKI,QAAQ,qBAINC,SAASC,UAAUC,MAAML,KAAK/C,EAAIV,KAAMU,EAAK6C,IAGtD,IAAIQ,EAAiB,SAAUC,EAAMC,GACnCjE,EAAK,iBAAmBgE,EAAO,aAAcC,IAG3CC,EAAU,SAAUC,EAAKC,GAC3B,OAAOC,OAAOR,UAAUS,eAAeb,KAAKU,EAAKC,IAG/CG,EAAW,SAAUC,GACvB,MAAwB,iBAAVA,GAGZC,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUxB,EAAeyB,GAClC,OAAOzB,GAAiBA,EAAc0B,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EACAT,EAASS,IAAQA,EAAIG,OACnBH,EAAII,MAAM,OACV,IAGJC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBlB,QAGtCmB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMhC,UACDiC,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACd1B,EAAQ0B,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWlG,EAAOmG,YAClBC,EAAcF,GAAYzB,OAAO4B,KAAKpG,GAAkBsF,OAG5DtF,EAAmB2F,EAAO3F,EAAkBiG,GAExCE,GAAahG,EAAK,WAAYH,GAGlC,IA+EIqG,GA/EAC,GAAgBpB,EAClBlF,EAAiBsG,eAAiBvB,EAAKxB,EAAe,mBAGpDgD,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,GAAcG,OAAO,SAAU5B,GAC7B,OAAO,IAAI6B,OAAO,IAAMF,GAAoBnD,KAAKwB,KAChDS,QAIHqB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe/G,EAAOgH,QAAUhH,EAAOiH,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOlD,GACP,OAAO6C,EAAUnC,QAAQoC,EAAW,SAAUC,GAC5C,IAAII,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMN,EAAI,EAAII,EAAS,EAAJA,EAAW,GACrBD,SAAS,QAKpBI,GAAa,SAAUC,GACzB,MAAsB,mBAARA,GAIZC,GAAgB,YAChBC,GACF7H,EAAiB4H,KACjB7C,EAAKxB,EAAeqE,KAiyBxB,KA9xBME,GAAiB,SAAUC,EAAUC,GACvC,IAAIC,EAAiBlI,EAAO8H,GAAY,aACpCrC,EAASyC,KAAiBF,EAAWpC,EAAOoC,EAAUE,IAC1D,IAAIC,EAA4BnI,EAAOoI,IACvC,IAAKT,GAAWQ,GAKd,OAJIC,IACFhI,EACEgI,GAAoB,0BAA4BA,IAE7CJ,EAET,IACE,OAAOpC,EACLoC,EACAG,EAA0BtE,KAAK7D,EAAQ4F,EAAOoC,EAAUC,KAE1D,MAAO5D,GACPF,EAAe,WAAYE,KAU3BgE,GACFpI,EAAiBoI,WACjBrD,EAAKxB,EAAe,eAAiB/C,EAInC6H,GAAiB,SAAUC,EAAcC,GAC3ClC,IAAKiC,GAAgB/B,GAAsB,KAAO,GAAKhG,EACvD,IAAIiI,GAAKD,GAAmBrH,EAAIuH,QAC7B9E,MAAM,GACN4B,MAAM,KACNkB,OAAO,SAAUiC,GAChB,IAAIC,EAAID,EAASE,QAAQ,KACrBvC,KAAM9F,GAAgB,EAAJoI,GAASD,EAAS/E,MAAMgF,EAAI,KAChDtC,KAAMA,GAAI,IAAM,IAAMqC,EAAS/E,MAAM,EAAGgF,IAE1C,IAAIE,EAASP,IAAiB/B,GAAsB,MAEhDuC,EAAkBC,GAAYC,IAAIpE,GAAaqE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCV,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAU,EACA,KACJ,OAAID,IAAWE,GAAYzD,OAAe/E,EAInC,IAAImG,OAAOwC,EAAO,KAAK7F,KAAKqF,KAEpCO,KAAK,KAGR,OADA5C,GAAIA,IAAKjG,EACFoI,GAAKpI,GA+BV+I,GAAiBtB,GAAY,UACjC,GAAI9H,EAAOoJ,KAAmB7I,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAOqJ,gBAAkB9I,EACzBP,EAAOoJ,IAAkB7I,EAOzB,IAAI+I,GAAW,SAAUrB,EAAMsB,EAAUC,GACvCvB,EAAOuB,EAAevB,EAAOrC,EAAO6D,GAASC,GAAMzB,GAE/ChH,EAAI0I,QAAUH,IAAcvB,EAAK0B,MAAQpJ,GACzCU,EAAI2I,qBAAuBJ,IAAcvB,EAAK4B,KAAOtJ,GAGzD,IAAIuJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJ7H,EACA,eACAoC,OAAO4B,KAAK4B,GACTvB,OAAO,SAAUyD,GAChB,OAAOlC,EAAKkC,IAAQ9J,IAErB4I,IAAI,SAAUkB,GACb,OACEtI,EAAuBsI,GACvB,IACAtI,EAAuBoG,EAAKkC,MAG/BjB,KAAK,KACR,SACArC,KAAKD,OAILwD,GACFnK,EAAiBoK,UAAYrF,EAAKxB,EAAe,YAC/C8G,GAAkBF,IAAuB/I,EAEzCkJ,GAAc,CAChBC,QA+oBJ,gBA9oBIH,SAAUC,IASZnK,EAAY,SAAUsK,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJrK,EAAKqK,GACLnB,GACE1D,EAAO2E,GAAa,CAClBI,KAAM9J,EACNwD,MAAOoG,EACPG,KAAMzJ,EAAI0J,WAEZxK,EACAE,IAMJ4B,EACEtB,EACA,SAAUiK,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASlC,QAAQ3I,IAC3CC,EAAU2K,EAAME,UAGpBxK,GAOF,IAwDIyK,GAxDAC,GAAQtE,KAERuE,GAAW,EAOXC,GAAOnL,EAAiBmL,MAAQpG,EAAKxB,EAAe,QAGpD6H,MA/KsBC,GA+KCrL,EAAiBoL,cA9KvBC,GA+KjBrL,EAAiBoL,WACjBrG,EAAKxB,EAAe,eAAiB/C,GACrCuE,EAAKxB,EAAe,aAAe/C,GACnCuE,EAAKxB,EAAe,gBAAkB/C,EAGtC8K,KACqC,SAAvCvG,EAAKxB,EAAe,iBACpBvD,EAAiBsL,cAAgB/K,GAI/BgL,GACFvL,EAAiBwL,UACjBzG,EAAKxB,EAAe,cACpBsE,GAAY,IAAMlH,EAGhB8K,GAAcvG,EAChBlF,EAAiByL,aAAe1G,EAAKxB,EAAe,iBAIlDwF,GAAc7D,EAChBlF,EAAiB+I,aAAehE,EAAKxB,EAAe,iBAIlDmI,GAAqBxG,EACvBlF,EAAiB0L,oBACf3G,EAAKxB,EAAe,yBAIpBoI,GACF3L,EAAiB2L,gBAAkB5G,EAAKxB,EAAe,mBAGrD4E,GACFnI,EAAiBmI,mBACjBpD,EAAKxB,EAAe,sBAItB,IAEEyH,GAAWzE,GAAsB,KAC7BqF,KAAKC,iBAAiBC,kBAAkBC,SACxC3L,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAI4H,GAAUjM,EAAOiM,QACjBC,GACFjL,EAAIkL,WACJnM,EAAOoM,aACPpM,EAAOqM,aACPrM,EAAOsM,UACNL,KAAYA,GAAQM,QACrBvM,EAAOwM,YACPxM,EAAOyM,MACPpJ,GACAoE,KAAKC,UAAYD,KAAKC,SAGpBgF,GACFlG,GAAsB,MAAQA,GAAsB,QAElD0F,KAAK3B,GAAY2B,IAAM3L,GAE3B,IAAIkJ,GAAU7D,EAAO2E,GAAa,CAEhCoC,GAAInG,GAAsB,MAAQ/E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBuK,SAAUA,GACV2B,QAASF,GAAqB5F,KAASzG,EAGvCwM,WAAYrG,GAAsB,MAAQM,KAASzG,IA0BrD,GAvBAoJ,GAAQqD,IAAMvM,EAIVoC,IACF8G,GAAQsD,OAASpK,EAAOoK,OACxBtD,GAAQuD,OAAS/K,EAAUU,EAAOqK,SAS/BzL,EAAI0L,SAAS7M,EAAK,4CAInBkK,KAAoBjJ,IACtBoI,GAAQyD,kBAAoB7L,IAGzBgK,IAAcrK,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBwH,QAAQ,OACxB,aAAavF,KAAKjC,IACnB+I,IAEDhK,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIgK,GA0DAC,GA3DA1D,GAAO,GAGP2D,GAAc,WAKhB,OAFEpN,EAAiBqN,UAAYtI,EAAKxB,EAAe,aAGzBjC,EAAI+L,UAAY,IACrCvI,QAAQ1D,EAAkBiJ,IAC1BvF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS1E,GAKjCiN,GAAWD,KAOXE,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,GAAKhB,GAAL,CAEA,IAAIiB,EAAS/H,EAAO2E,GAAa,CAC/BI,KAAM,SACNiD,YAAaF,EAAOD,EAAKhE,GAAQmD,UAenC,GAXIpG,GAAsB,OACxBmH,EAAOE,SAAWpG,KAAKqG,OAAOlH,KAAQsE,GAAQqC,IAngBnC,MAqgBbA,GAAW,EACXrC,GAAQtE,KAGJJ,GAAsB,UACxBmH,EAAOxC,SAAW1D,KAAKsG,IAAI,EAAG5C,GAAU6C,OAGtCN,IAASzM,EAAIgN,WAEf3E,GAASqE,EAAQtN,EAAcE,QAE/B,IACEU,EAAIgN,WAAWC,KAAKjN,EAApBA,CAAyBoB,EAAa,UAAWJ,EAAU0L,IAC3D,MAAOQ,GAEP7E,GAASqE,EAAQtN,EAAcE,MAMrC4B,EACE,mBACA,WACMZ,EAAI6M,QACA,KAAOpL,KAAYhD,GAASwN,KAClCJ,GAAcxG,MACT2G,IAAY3G,KAAQwG,IAE7B5M,GAGF2B,EAAqBa,EAAUwK,GAAahN,GAE5C,IAAI6N,GAAO9M,EAAI8M,MAAQ,GACnBL,GAAW,WACb,IACE,IAAIM,EAAuB/L,EAAgBQ,IAAiB,EACxDwL,EAAS9G,KAAKsG,IAChBM,GAAKxL,IAAiB,EACtBwL,GAAKvL,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAO2E,KAAK+G,IACV,IAKI,EAJJ/G,KAAKqG,MACF,MAAQvL,EAAgBkM,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOlK,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3BgJ,GAAW6C,KACX7L,EACEO,EACA,WACMyI,GAAW6C,OAAY7C,GAAW6C,OAExCxN,KAQJ,IAgCIkO,GAoCAC,GAAUC,GApEVC,GAAU,SAAUC,GACtB,IAAIlE,EAAO,GAIX,IACEA,EAAOkE,GAAa/M,EAAuBZ,EAAI0J,UAC/C,MAAOxG,IACPjE,EAAKiE,IAGP,IAAI0K,EAAyB/O,EAAO4L,IACpC,GAAIjE,GAAWoH,GACb,IACEnE,EAAOmE,EAAuBlL,KAAK7D,EAAQ,CAAE4K,KAAMA,KAAWA,EAC9D,MAAOvG,IACPF,EAAe,OAAQE,IAK3B,IA5YiB,SAAUuG,GAC3B,IAAK,IAAIhC,KAAK8C,GAAa,CACzB,IAAIsD,EAAgBtD,GAAY9C,GAChC,GAAKoG,EAAL,CAGA,IAAIC,EA9OI,KA+OND,EAAc,GAAcA,EA/OtB,IA+O8CA,EAEtD,GACEC,IAAerE,GACf,IAAIjE,OACF,IAAM9B,EAAYoK,GAAYlK,QAAQ,SAAU,QAAU,IAC1D,KACAzB,KAAKsH,GAEP,OAAOrK,GAEX,OAAOC,EA0XH0O,CAAatE,GAQjB,MAFY,QAARQ,IAAkBjK,EAAIgO,OAAMvE,GAAQzJ,EAAIgO,KAAK3J,MAAM,KAAK,IAErDoF,EAPLxK,EAAKuB,EAAiB,YAAciJ,IAgDpCwE,GAAW,SACbC,EACAC,EACAtH,EACAuH,IAEKA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GACxD,IACIwH,EAGEC,EAJFlG,EAAW5B,GAAW4H,GAAeA,EAAc,aAEnD5K,EAAS2K,KAAgD,EAA9BA,EAAczG,QAAQ,OAGnDyG,GADIG,EAAQH,EAAc9J,MAAM,MACVkK,QACtBF,EAAc,IAAMC,EAAMvG,KAAK,MAGjC,IAAI0B,EAAOiE,GAAQS,GAGnB,GAAK1E,GAAQuC,IAAgBvC,EAA7B,CAEAuC,GAAevC,EACflB,GAAKkB,KAAOA,EAGRpE,GAAsB,OACxBkD,GAAKiG,eACHlI,KAAKsG,IAAIxL,EAA2B,aAAK,EAAGvC,EAAO4P,YAAc,IACjE,KACFlG,GAAKmG,gBACHpI,KAAKsG,IACHxL,EAAgBQ,IAAiB,EACjC/C,EAAO8P,aAAe,IACnB,MAILtJ,GAAsB,MACpBvF,EAAIuB,KAAWkH,GAAKlH,GAAYvB,EAAIuB,IAItCe,GAAUiD,GAAsB,QAClCkD,GAAKqG,aAAexM,EAAOyM,MAC3BtG,GAAKuG,cAAgB1M,EAAOgL,QAI9B,IAII2B,EAJAC,EAAOnQ,EAAOoQ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAG1F,KAC/D,MAAOtG,IACPjE,EAAKiE,IAGPuK,GAAgBsB,GAC+C,EAA3D,CAAC,SAAU,gBAAgBrH,QAAQqH,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGxH,QAAQsH,EAAKE,GAAgB1F,MAGxC,IAAI4F,EAA0BjD,GAC1BA,GAAS9H,MA1uBH,KA0uBgB,GACtBnF,EACJsO,GAAWrB,IACgD,EAAvD3B,GAAmB9C,QAAQ0H,IAC3BA,GAA2BlP,EAC3Bb,EAGJkJ,GAAK8G,OACH,QAAQlN,KAAK+J,OAAkBgC,GAAeT,GAC1CpO,GACCmO,GAEP3G,EAAWD,GAAeC,EAAU,CAClC2C,KAAMhK,EACNiK,KAAMlB,GAAKkB,OAGb,IAAI6F,EAAsB,WACxB7O,EAA2BrB,EAC3B,IAAImQ,EACFrB,GAAeT,KAAkBpI,GAAsB,MA7H1C,SACjB6I,EACAsB,EACAhC,EACAjG,EACAV,EACAuB,GAEI8F,GAAa7B,GAAY,GAAK/D,GAAQmD,QAASrM,GAC/CmM,KAAoBjD,GAAQmD,QAAU9F,MAE1C,IAAI8J,EAActG,GAAkBuE,KAChCgC,EAAQvI,GAAeqI,EAAkBjI,GAE7CY,GACE,CACEmE,GAAIhE,GAAQmD,QACZjC,KAAMhK,EACN2M,UAAWqD,GAAoBhC,EAAWrB,GAAW,KACrDuD,MAAOA,EACPvK,EAAGA,GAEH0B,SAAU/F,EAAU+F,IAEtBuB,GAGFmF,GAAmBpB,GACnBA,GAAWsD,EAEXxN,IAgGE0N,CACEzB,EACAqB,EACA/B,GACAa,EACAxH,EACAuB,IAIJ,GAAK3H,EAmBH6O,SAjBA,IACM9N,GAAUgF,GAAWhF,EAAOoO,sBAC9BpO,EACGoO,qBAAqB,CAAC9N,EAAcC,IACpC8N,KAAK,SAAUC,GACdxH,GAAQyH,QAAUD,EAAkBhO,GACpCwG,GAAQ0H,WAAaF,EAAkB/N,GACvCuN,MAEDW,SAAMX,GAETA,IAEF,MAAOtC,GACPsC,OAWFY,GAAMrR,EAAOsR,QACbC,GAAeF,GAAMA,GAAIG,UAAYnR,EACrCoR,GAAMzR,EAAO0R,cACbC,GAAgB,YAIhBpG,IAAegG,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiB1G,GAoBAgH,IAlBrB,WACL,IAEI7G,EAFAhF,EAAMhC,UACNgO,EAAKD,GAAK3N,MAAM6N,KAAMjM,GAY1B,OAVI6B,GAAWiK,OACb9G,EAAQ,IAAI8G,MAAMjH,KAIlBG,EAAQvJ,EAAIyQ,YAAY,UAClBC,UAAUtH,GAAMpK,EAASA,GAEjCuK,EAAMhH,UAAYgC,EAClB2L,GAAI3G,GACGgH,IAMX3P,EACEwP,GACA,WACEvC,GAAS,IAEX5O,GAGF2B,EACE,WACA,WACEiN,GAAS,IAEX5O,IAKA+K,IAAuB,QAARH,IAAkB,iBAAkBpL,GACrDmC,EACE,aACA,WACEiN,GAAS,IAEX5O,GAIA+K,IAAa6D,KAEjBpP,EAAOkS,YAAc,SAAUtH,EAAM5C,EAAUuB,GAC7C6F,GAAS,EAAGxE,EAAM5C,EAAUuB,IAQ9B,IAAI4I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUtH,EAAO9C,EAAUuH,IACpCA,GAAe5H,GAAWK,KAAWuH,EAAcvH,GAExD,IAAIqK,EAAkB1K,GAAWmD,GAC7BvB,EAAW5B,GAAW4H,GAAeA,EAAc,aACnD+C,SAAmBxH,EAEvB,GAAIqH,GAAWtJ,QAAQyJ,GAAa,IAAMD,EAExC,OADAlO,EAAeqH,GAAmB5K,EAAY,aAAe0R,GACtD/I,IAGT,IACE,GAAI8I,EAAiB,CACnB,IAAIE,EAAczH,IAClB,GAAIqH,GAAWtJ,eAAe0J,GAAe,EAK3C,OAJApO,EACEqH,GACAV,EAAQ,uBAAyByH,GAE5BhJ,IAETuB,EAAQyH,GAEV,MAAOlO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIyN,EAAc,CAAE7H,KAAM/J,EAAWkK,MAAOA,GACxC2H,GAAa7D,IAAiBxL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUwK,GAEhC1H,GACFxB,GACE1D,EAAO4M,EAAa,CAClB/E,GAAI3G,KACJ+J,MAAOvI,IAAgBmK,GACvBnF,UACGmF,GAAa9D,KAAanI,GAAsB,KAC7CkI,GACA,KAEN1G,SAAU/F,EAAU+F,KAEtBuB,IAKFmJ,GAAmB,SAAU5H,EAAO9C,EAAUuB,GAChD6I,GAAUtH,EAAO9C,EAAUuB,IAIxBvJ,EAAOwL,MACVxL,EAAOwL,IAAqBkH,IAE9B,IAAIC,GAAY3S,EAAOwL,IAGnBoH,GAAQD,IAAaA,GAAUlK,EAAIkK,GAAUlK,EAAI,GAMrD,IAAK,IAAIqC,MAHT9K,EAAOwL,IAAqBkH,GAGVE,GACZtO,EAAQsO,GAAO9H,MACjBzF,MAAMC,QAAQsN,GAAM9H,KAChBsH,GAAUlO,MAAM,KAAM0O,GAAM9H,KAC5BsH,GAAUQ,GAAM9H,MAGxB,MAAOqD,IACPhO,EAAUgO,IA7IY,IAAUxD,GACxBkH,GArnBkBvG,GAnN9B,CAu9BEtL,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"app.js","sources":["app.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js index 44f421b..3cb3cb7 100644 --- a/dist/v12/custom/app.js +++ b/dist/v12/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 237b; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 5aad; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",O=y,x=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map index 4cd0921..de73d00 100644 --- a/dist/v12/custom/app.js.map +++ b/dist/v12/custom/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js index f76cb58..219d389 100644 --- a/dist/v12/custom/light.js +++ b/dist/v12/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; ede2; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0001; SRI-version; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,i="doNotTrack",m=l.navigator,p=l.location,g=p.host,a=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(a.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=a.currentScript||a.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),i in m&&"1"==m[i])return f("Not sending request when "+i+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||a.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,i,a){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var i,a;N(r);E(t)&&-1"); +!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://"+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var E=function(e){return"string"==typeof e},A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||A(x,R)||"sa",V=e.strictUtm||"true"==A(x,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,H=function(t,e,n,r){t=n?t:$(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=e.hostname||A(x,"hostname"),F=T||g,z={version:"custom_light_12",hostname:F};e.mode||A(x,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=$(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),F!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||T||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||A(x,"referrer")||i.referrer||"").replace(g,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=$(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)H(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){H(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=F+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);H({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);E(t)&&-1"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map index 4563a96..07a0c73 100644 --- a/dist/v12/custom/light.js.map +++ b/dist/v12/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js index e8c6791..c6cdbd3 100644 --- a/dist/v12/custom/proxy.js +++ b/dist/v12/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 6f40; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 8696; SRI-version; v12) */ -!function(d,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",u="event",i="error",o=d.console,c="doNotTrack",w=d.navigator,s=d.location,b=s.host,l=d.document,p=w.userAgent,f="Not sending request ",h=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,S=JSON.stringify,k=d.addEventListener,M="https://"+e,q=l.documentElement||{},A="language",$="Height",j="scroll",D=w.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),N=d.screen,z=l.currentScript||l.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return"string"==typeof t},J=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},L=function(t,e){return t&&t.getAttribute("data-"+e)},Y=function(t){return Array.isArray(t)?t:G(t)&&t.length?t.split(/, ?/):[]},Z=function(t){return t&&t.constructor===Object},K=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||L(z,ot)||"sa",st=function(t,e){var n=d[ct+"_metadata"];Z(n)&&(t=K(t,n));var r=d[Mt];if(!it(r))return Mt&&m(Mt+" not found, set window."+Mt),t;try{return K(t,r.call(d,K(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||L(z,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); +!function(h,t,e,n,m){try{var v=undefined,g=!0,y=!1,r="true",a="https:",_="pageview",l="event",i="error",o=h.console,c="doNotTrack",b=h.navigator,s=h.location,w=s.host,u=h.document,p=b.userAgent,f="Not sending request ",d=f+"when ",x=y,O=encodeURIComponent,E=decodeURIComponent,M=JSON.stringify,S=h.addEventListener,k="https://"+e,A=u.documentElement||{},q="language",C="Height",D="scroll",$=b.userAgentData,j=D+C,H="offset"+C,R="client"+C,L="pagehide",N="platform",P="platformVersion",T="https://docs.simpleanalytics.com",U=0,I=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),V=h.screen,B=u.currentScript||u.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){m("Error in your "+t+" function:",e)},z=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return"string"==typeof t},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},X=function(t){return Array.isArray(t)?t:W(t)&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},it=function(t){return"function"==typeof t},ot="namespace",ct=t[ot]||J(B,ot)||"sa",st=function(t,e){var n=h[ct+"_metadata"];Y(n)&&(t=Z(t,n));var r=h[kt];if(!it(r))return kt&&m(kt+" not found, set window."+kt),t;try{return Z(t,r.call(h,Z(t,e)))}catch(a){F("metadata",a)}},ut=t.strictUtm||J(B,"strict-utm")==r,lt=function(i,t){tt=!i&&nt("q")?"":y;var e=(t||s.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");tt!==y&&0"); //# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map index fe419aa..c82de94 100644 --- a/dist/v12/custom/proxy.js.map +++ b/dist/v12/custom/proxy.js.map @@ -1 +1 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Inline events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique =\n /__cf_/.test(getReferrer()) || isPushState || userNavigated\n ? falseVar\n : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n window.sa_pageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n overwriteOptions.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","querySearch","parts","shift","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js index 5ad37a9..aca47cb 100644 --- a/dist/v12/light.js +++ b/dist/v12/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-09-16; 12b3; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 2d4f; SRI-version; v12) */ -!function(l,e,t,f){try{var u=undefined,n="https:",r=l.console,a="doNotTrack",m=l.navigator,p=l.location,g=p.host,i=l.document,o=m.userAgent,c="Not sending request ",h=!1,s=encodeURIComponent,d=decodeURIComponent,v=JSON.stringify,y=l.addEventListener,_="https://queue."+t,b=(i.documentElement,"language"),w=m.userAgentData,O="platform",S="platformVersion",j="https://docs.simpleanalytics.com",k=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),E=i.currentScript||i.querySelector('script[src*="'+t+'"]');f=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e){return"string"==typeof e},x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now()},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},R="namespace",U=e[R]||x(E,R)||"sa",V=e.strictUtm||"true"==x(E,"strict-utm"),B=U+"_loaded";if(1==l[B])return f(c+"twice");l.sa_event_loaded=!0,l[B]=!0;var C,T=function(t,e,n,r){t=n?t:A(J,M,t),m.brave&&!n&&(t.brave=!0),m._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return s(e)+"="+s(t[e])}).join("&")+"&time="+Date.now();a.src=i},F=e.hostname||x(E,"hostname"),H=F||g,z={version:"cdn_light_12",hostname:H};e.mode||x(E,"mode");try{C=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(X){f(X)}k&&(z.bot=!0);var J=A(z,{ua:o,https:p.protocol==n,timezone:C,page_id:I(),session_id:I()});if(J.sri=!0,w&&(J.mobile=w.mobile,J.brands=v(w.brands)),H!==g&&(J.hostname_original=g),a in m&&"1"==m[a])return f("Not sending request when "+a+" is enabled. See "+j+"/dnt");-1!=g.indexOf(".")&&!/^[0-9.:]+$/.test(g)||F||f("Set hostname on "+g+". See "+j+"/overwrite-domain-name");var L,M={},P=(e.referrer||x(E,"referrer")||i.referrer||"").replace(g,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,Z=function(e,t){var n=A(z,{type:"append",original_id:t?e:J.page_id});if(t||!m.sendBeacon)T(n,0,!0);else try{m.sendBeacon.bind(m)(_+"/append",v(n))}catch(r){T(n,0,!0)}};y("pagehide",Z,!1);var G,K,Q=function(e){var t="";try{t=e||d(p.pathname)}catch(X){f(X)}return t},W=function(e,t,n,r,a,i){e&&Z(""+J.page_id,!0),J.page_id=I();var o,c=H+Q(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(V?"":"?")+"(source|medium|content|term|campaign)"+(V?"":"|ref")+")=","i").test(e)}).join("&")||u);T({id:J.page_id,type:"pageview",referrer:!t||n?P:null,query:s}),P=c,0};!function(e,t,n,r){!r&&N(n)&&(r=n);var a,i;N(r);q(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n // Customers can overwrite their referrer, here we check for that\n var overwrittenReferrer =\n overwriteOptions.referrer || attr(scriptElement, \"referrer\");\n\n return (\n (overwrittenReferrer || doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch;\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","querySearch","parts","shift","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 639b29a..41f384b 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "deploy": "node --env-file-if-exists=.env deploy.mts", "pretest": "pnpm run build:testing", "test": "node -r dotenv/config ./test/index.js", + "test:unit": "mocha \"test/unit/*.test.js\" --exit", "test:matrix": "mocha test/helpers/get-browsers.test.js", "test:deploy": "node --test test/deploy.test.mts", "posttest": "pnpm run build", @@ -44,7 +45,8 @@ "dotenv": "^8.2.0", "eslint": "^6.7.2", "esprima": "^4.0.1", - "handlebars": "^4.7.6", + "handlebars": "^4.7.10", + "jsdom": "26.1.0", "mocha": "^6.2.3", "nodemon": "^1.19.4", "request": "^2.88.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e88fece..e24287c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,8 +34,11 @@ importers: specifier: ^4.0.1 version: 4.0.1 handlebars: - specifier: ^4.7.6 - version: 4.7.6 + specifier: ^4.7.10 + version: 4.7.10 + jsdom: + specifier: 26.1.0 + version: 26.1.0(supports-color@5.5.0) mocha: specifier: ^6.2.3 version: 6.2.3 @@ -60,6 +63,9 @@ importers: packages: + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + '@babel/code-frame@7.5.5': resolution: {integrity: sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==} @@ -74,6 +80,34 @@ packages: resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} engines: {node: '>= 20.12.0'} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} @@ -225,6 +259,10 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv@6.10.2: resolution: {integrity: sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==} @@ -456,10 +494,18 @@ packages: resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} engines: {node: '>=4'} + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -490,6 +536,9 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decode-uri-component@0.2.0: resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} engines: {node: '>=0.10'} @@ -556,6 +605,10 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + es-abstract@1.17.6: resolution: {integrity: sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==} engines: {node: '>= 0.4'} @@ -779,8 +832,8 @@ packages: resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} engines: {node: '>=4.x'} - handlebars@4.7.6: - resolution: {integrity: sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==} + handlebars@4.7.10: + resolution: {integrity: sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==} engines: {node: '>=0.4.7'} hasBin: true @@ -825,6 +878,14 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http-signature@1.2.0: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} @@ -833,10 +894,18 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} @@ -977,6 +1046,9 @@ packages: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@2.1.0: resolution: {integrity: sha512-NECAi6wp6CgMesHuVUEK8JwjCvm/tvnn5pCbB42JOHp3mgUizN0nagXu4HEqQZBkieGEQ+jVcMKWqoVd6CDbLQ==} @@ -1037,6 +1109,15 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -1098,6 +1179,9 @@ packages: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -1138,6 +1222,9 @@ packages: minimist@1.2.5: resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -1178,8 +1265,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - neo-async@2.6.1: - resolution: {integrity: sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -1208,6 +1295,9 @@ packages: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} + nwsapi@2.2.28: + resolution: {integrity: sha512-IlVB7OS7qrOsVYlpnFIkETjMwT9jwvmocJmmM+GZU/PAB3uGi9Ezd7vcWhWBUnSc0ya4ppmQITOyP1ez9gg8cg==} + oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} @@ -1280,6 +1370,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + pascalcase@0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} @@ -1355,6 +1448,10 @@ packages: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + qs@6.5.2: resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} engines: {node: '>=0.6'} @@ -1439,6 +1536,9 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-async@2.3.0: resolution: {integrity: sha512-Fx+QT3fGtS0jk8OvKyKgAB2YHPsrmqBRcMeTC5AZ+lp4vzXKPPrFSY3iLdgvjA3HVBkIvJeM6J80LRjx8bQwhA==} engines: {node: '>=0.12.0'} @@ -1456,6 +1556,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + selenium-webdriver@4.3.1: resolution: {integrity: sha512-TjH/ls1WKRQoFEHcqtn6UtwcLnA3yvx08v9cSSFYvyhp8hJWRtbe9ae2I8uXPisEZ2EaGKKoxBZ4EHv0BJM15g==} engines: {node: '>= 10.15.0'} @@ -1603,6 +1707,9 @@ packages: resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} engines: {node: '>=6'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + table@5.4.6: resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} engines: {node: '>=6.0.0'} @@ -1625,6 +1732,13 @@ packages: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -1653,6 +1767,14 @@ packages: resolution: {integrity: sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==} engines: {node: '>=0.8'} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + tslib@1.10.0: resolution: {integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==} @@ -1747,6 +1869,27 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} @@ -1782,6 +1925,18 @@ packages: resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} engines: {node: '>=4'} + ws@8.22.0: + resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.8.1: resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} engines: {node: '>=10.0.0'} @@ -1798,6 +1953,13 @@ packages: resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} engines: {node: '>=4'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@4.0.0: resolution: {integrity: sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==} @@ -1816,6 +1978,14 @@ packages: snapshots: + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + '@babel/code-frame@7.5.5': dependencies: '@babel/highlight': 7.5.0 @@ -1838,6 +2008,26 @@ snapshots: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + '@types/keyv@3.1.4': dependencies: '@types/node': 24.13.3 @@ -1926,6 +2116,8 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.4: {} + ajv@6.10.2: dependencies: fast-deep-equal: 2.0.1 @@ -2195,10 +2387,20 @@ snapshots: crypto-random-string@1.0.0: {} + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + dashdash@1.14.1: dependencies: assert-plus: 1.0.0 + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + debug@2.6.9(supports-color@5.5.0): dependencies: ms: 2.0.0 @@ -2225,6 +2427,8 @@ snapshots: decamelize@1.2.0: {} + decimal.js@10.6.0: {} + decode-uri-component@0.2.0: {} deep-eql@3.0.1: @@ -2279,6 +2483,8 @@ snapshots: emoji-regex@8.0.0: {} + entities@6.0.1: {} + es-abstract@1.17.6: dependencies: es-to-primitive: 1.2.1 @@ -2583,10 +2789,10 @@ snapshots: growl@1.10.5: {} - handlebars@4.7.6: + handlebars@4.7.10: dependencies: - minimist: 1.2.5 - neo-async: 2.6.1 + minimist: 1.2.8 + neo-async: 2.6.2 source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: @@ -2628,6 +2834,17 @@ snapshots: he@1.2.0: {} + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + http-proxy-agent@7.0.2(supports-color@5.5.0): + dependencies: + agent-base: 7.1.4 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + http-signature@1.2.0: dependencies: assert-plus: 1.0.0 @@ -2641,10 +2858,21 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6(supports-color@5.5.0): + dependencies: + agent-base: 7.1.4 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + ignore-by-default@1.0.1: {} ignore@4.0.6: {} @@ -2770,6 +2998,8 @@ snapshots: dependencies: isobject: 3.0.1 + is-potential-custom-element-name@1.0.1: {} + is-promise@2.1.0: {} is-redirect@1.0.0: {} @@ -2813,6 +3043,33 @@ snapshots: jsbn@0.1.1: {} + jsdom@26.1.0(supports-color@5.5.0): + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2(supports-color@5.5.0) + https-proxy-agent: 7.0.6(supports-color@5.5.0) + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.28 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.22.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + json-schema-traverse@0.4.1: {} json-schema@0.2.3: {} @@ -2873,6 +3130,8 @@ snapshots: lowercase-keys@1.0.1: {} + lru-cache@10.4.3: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -2922,6 +3181,8 @@ snapshots: minimist@1.2.5: {} + minimist@1.2.8: {} + mixin-deep@1.3.2: dependencies: for-in: 1.0.2 @@ -2990,7 +3251,7 @@ snapshots: natural-compare@1.4.0: {} - neo-async@2.6.1: {} + neo-async@2.6.2: {} nice-try@1.0.5: {} @@ -3026,6 +3287,8 @@ snapshots: dependencies: path-key: 2.0.1 + nwsapi@2.2.28: {} + oauth-sign@0.9.0: {} object-copy@0.1.0: @@ -3102,6 +3365,10 @@ snapshots: dependencies: callsites: 3.1.0 + parse5@7.3.0: + dependencies: + entities: 6.0.1 + pascalcase@0.1.1: {} path-dirname@1.0.2: {} @@ -3148,6 +3415,8 @@ snapshots: punycode@2.1.1: {} + punycode@2.3.1: {} + qs@6.5.2: {} rc@1.2.8: @@ -3247,6 +3516,8 @@ snapshots: dependencies: glob: 7.1.6 + rrweb-cssom@0.8.0: {} + run-async@2.3.0: dependencies: is-promise: 2.1.0 @@ -3263,6 +3534,10 @@ snapshots: safer-buffer@2.1.2: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + selenium-webdriver@4.3.1: dependencies: jszip: 3.10.0 @@ -3432,6 +3707,8 @@ snapshots: dependencies: has-flag: 3.0.0 + symbol-tree@3.2.4: {} + table@5.4.6: dependencies: ajv: 6.10.2 @@ -3453,6 +3730,12 @@ snapshots: timed-out@4.0.1: {} + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -3486,6 +3769,14 @@ snapshots: psl: 1.7.0 punycode: 1.4.1 + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + tslib@1.10.0: {} tunnel-agent@0.6.0: @@ -3596,6 +3887,23 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + webidl-conversions@7.0.0: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + which-module@2.0.0: {} which@1.3.1: @@ -3632,10 +3940,16 @@ snapshots: dependencies: mkdirp: 0.5.5 + ws@8.22.0: {} + ws@8.8.1: {} xdg-basedir@3.0.0: {} + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + y18n@4.0.0: {} yallist@2.1.2: {} diff --git a/src/default.js b/src/default.js index d8dd4c9..a22de19 100644 --- a/src/default.js +++ b/src/default.js @@ -333,7 +333,7 @@ // // Send data via image - var sendData = function (data, callback, onlyThisData) { + var sendData = function (data, callback, onlyThisData, keepalive) { data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; @@ -350,7 +350,7 @@ image.onload = callback; } /** endif **/ - image.src = + var imageUrl = fullApiUrl + "/simple.gif?" + Object.keys(data) @@ -367,6 +367,25 @@ .join("&") + "&time=" + Date.now(); + + /** if events **/ + // Inline events must survive navigation without taking over links or forms. + if (keepalive && window.fetch) { + try { + window + .fetch(imageUrl, { + keepalive: trueVar, + mode: "no-cors", + credentials: "omit", + }) + .catch(function () { + image.src = imageUrl; + }); + return; + } catch (error) {} + } + /** endif **/ + image.src = imageUrl; }; // Customers can overwrite their hostname, here we check for that @@ -1035,7 +1054,7 @@ var validTypes = ["string", "number"]; - var sendEvent = function (event, metadata, callbackRaw) { + var sendEvent = function (event, metadata, callbackRaw, keepalive) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var eventIsFunction = isFunction(event); @@ -1087,7 +1106,9 @@ metadata: stringify(metadata), /** endif **/ }), - callback + callback, + undefinedVar, + keepalive ); } }; @@ -1116,6 +1137,71 @@ : sendEvent(queue[event]); } } + + var inlineEvent = function (event) { + var element = event.target; + while ( + element && + element !== doc && + (!element.getAttribute || attr(element, "simple-event") === null) + ) + element = element.parentNode; + + if (!element || element === doc) return; + var isForm = element.tagName === "FORM"; + var name = attr(element, "simple-event"); + if (!name || isForm !== (event.type === "submit")) return; + + var metadata = { tag: element.tagName.toLowerCase() }; + var attributes = element.attributes; + for (var i = 0; i < attributes.length; i++) { + var attribute = attributes[i]; + if (attribute.name.indexOf("data-simple-event-") === 0) + metadata[attribute.name.slice(18).replace(/-/g, "_")] = + attribute.value; + } + if (isForm) { + var button = event.submitter; + metadata.button_text = button + ? (button.textContent || button.value || "") + .replace(/\s+/g, " ") + .trim() + .slice(0, 200) + : ""; + } + sendEvent(name, metadata, undefinedVar, trueVar); + }; + + doc.addEventListener("click", inlineEvent, falseVar); + doc.addEventListener("submit", inlineEvent, falseVar); + + // 404 confirmation adds a request, so existing installs must opt in. + if ( + overwriteOptions.detect404 === trueVar || + attr(scriptElement, "detect-404") == trueText + ) { + var detect404 = function () { + if ( + !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) + ) + return; + try { + var request = new window.XMLHttpRequest(); + request.open("HEAD", loc.href, trueVar); + request.onload = function () { + if (request.status === 404) + sendEvent("page_404", { + url: loc.protocol + "//" + definedHostname + loc.pathname, + status: 404, + }); + }; + request.send(); + } catch (error) {} + }; + if (doc.readyState === "loading") + doc.addEventListener("DOMContentLoaded", detect404, falseVar); + else detect404(); + } /** endif **/ } catch (e) { /** if errorhandling **/ diff --git a/test/unit/inline-events.test.js b/test/unit/inline-events.test.js new file mode 100644 index 0000000..dbf5923 --- /dev/null +++ b/test/unit/inline-events.test.js @@ -0,0 +1,316 @@ +const { expect } = require("chai"); +const { runInContext } = require("vm"); +const { createDOM } = require("./helpers/dom"); + +describe("inline events", function () { + const windows = []; + const setup = (options = {}) => { + const dom = createDOM({ settings: { autoCollect: false }, ...options }); + windows.push(dom.window); + return dom; + }; + const events = (dom) => + dom.sent + .filter( + (request) => new URL(request.url).searchParams.get("type") === "event" + ) + .map((request) => { + const params = new URL(request.url).searchParams; + return { + name: params.get("event"), + metadata: JSON.parse(params.get("metadata")), + }; + }); + const click = (dom, element, options = {}) => { + const event = new dom.window.MouseEvent("click", { + bubbles: true, + cancelable: true, + ...options, + }); + element.dispatchEvent(event); + return event; + }; + const submit = (dom, form, button) => { + const event = new dom.window.SubmitEvent("submit", { + bubbles: true, + cancelable: true, + submitter: button, + }); + form.dispatchEvent(event); + return event; + }; + + afterEach(() => windows.splice(0).forEach((window) => window.close())); + + it("tracks nested clicks and new elements with current metadata", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + ''; + const button = dom.window.document.querySelector("button"); + click(dom, button.firstChild); + button.setAttribute("data-simple-event", "upgrade"); + button.setAttribute("data-simple-event-plan-name", "enterprise"); + click(dom, button); + expect(events(dom)).to.deep.equal([ + { name: "choose", metadata: { tag: "button", plan_name: "pro" } }, + { name: "upgrade", metadata: { tag: "button", plan_name: "enterprise" } }, + ]); + }); + + it("leaves link behavior and modified clicks untouched", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + 'Download'; + const link = dom.window.document.querySelector("a"); + const event = click(dom, link, { ctrlKey: true }); + expect(event.defaultPrevented).to.equal(false); + expect(link.getAttribute("target")).to.equal("_blank"); + expect(link.hasAttribute("download")).to.equal(true); + expect(link.hasAttribute("onclick")).to.equal(false); + expect(events(dom)).to.have.length(1); + }); + + it("tracks SPA clicks without undoing cancellation, and ignores untagged elements", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + ''; + const buttons = dom.window.document.querySelectorAll("button"); + buttons[0].addEventListener("click", (event) => event.preventDefault()); + expect(click(dom, buttons[0]).defaultPrevented).to.equal(true); + click(dom, buttons[1]); + expect(events(dom)).to.have.length(1); + expect(events(dom)[0].name).to.equal("cancelled"); + }); + + it("uses the actual submitter and lets the browser submit the form", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const form = dom.window.document.querySelector("form"); + const button = dom.window.document.querySelector("button"); + click(dom, form.querySelector("input")); + const event = submit(dom, form, button); + expect(event.defaultPrevented).to.equal(false); + expect(button.getAttribute("formaction")).to.equal("/other"); + expect(events(dom)).to.deep.equal([ + { name: "signup", metadata: { tag: "form", button_text: "Join" } }, + ]); + }); + + it("tracks SPA form submissions without submitting the form itself", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const form = dom.window.document.querySelector("form"); + form.addEventListener("submit", (event) => event.preventDefault()); + let submits = 0; + form.submit = () => submits++; + expect(submit(dom, form, form.firstChild).defaultPrevented).to.equal(true); + expect(events(dom)).to.have.length(1); + expect(submits).to.equal(0); + }); + + it("does not disable built-in events when the beta helper is installed", function () { + const dom = setup({ + beforeRun(context) { + context.document.head.innerHTML = + ''; + }, + }); + dom.window.document.body.innerHTML = + ''; + click(dom, dom.window.document.querySelector("button")); + expect(events(dom)).to.have.length(1); + }); + + it("uses the button label, trims it, and limits its length", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const form = dom.window.document.querySelector("form"); + const button = form.firstChild; + submit(dom, form, button); + expect(events(dom)[0].metadata.button_text).to.equal("Save changes"); + button.textContent = "x".repeat(5000); + submit(dom, form, button); + expect(events(dom)[1].metadata.button_text).to.equal("x".repeat(200)); + }); + + it("keeps submit labels stable when button markup is reformatted", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const form = dom.window.document.querySelector("form"); + const button = form.firstChild; + submit(dom, form, button); + button.innerHTML = + "\n \n Save\n changes\n"; + submit(dom, form, button); + expect( + events(dom).map((event) => event.metadata.button_text) + ).to.deep.equal(["Save changes", "Save changes"]); + }); + + it("uses submit input labels and leaves missing submitter text empty", function () { + const dom = setup(); + dom.window.document.body.innerHTML = + '
'; + const form = dom.window.document.querySelector("form"); + submit(dom, form, form.lastChild); + expect(events(dom)[0].metadata.button_text).to.equal("Join"); + form.firstChild.focus(); + submit(dom, form); + expect(events(dom)[1].metadata.button_text).to.equal(""); + }); + + it("uses a keepalive GET for inline events", function () { + const requests = []; + const dom = setup(); + dom.window.fetch = (url, options) => { + requests.push({ url, options }); + return Promise.resolve(); + }; + dom.window.document.body.innerHTML = + ''; + click(dom, dom.window.document.querySelector("button")); + expect(requests).to.have.length(1); + expect(new URL(requests[0].url).searchParams.get("event")).to.equal( + "choose" + ); + expect(requests[0].options).to.include({ + keepalive: true, + mode: "no-cors", + credentials: "omit", + }); + expect(requests[0].options.method).to.equal(undefined); + expect(events(dom)).to.have.length(0); + }); + + it("falls back to the image when fetch fails", async function () { + const dom = setup(); + dom.window.fetch = () => Promise.reject(new Error("blocked")); + dom.window.document.body.innerHTML = + ''; + click(dom, dom.window.document.querySelector("button")); + await Promise.resolve(); + expect(events(dom)).to.have.length(1); + }); + + it("falls back when fetch throws synchronously", function () { + const dom = setup(); + dom.window.fetch = () => { + throw new Error("unsupported"); + }; + dom.window.document.body.innerHTML = + ''; + click(dom, dom.window.document.querySelector("button")); + expect(events(dom)).to.have.length(1); + }); + + it("uses the tracker namespace and global metadata", function () { + const dom = setup({ + settings: { autoCollect: false, namespace: "other" }, + beforeRun(context) { + runInContext('window.other_metadata = { source: "global" };', context); + }, + }); + dom.window.document.body.innerHTML = + ''; + click(dom, dom.window.document.querySelector("button")); + expect(events(dom)[0].metadata).to.include({ + source: "global", + tag: "button", + }); + }); + + it("only confirms 404s when opted in, and strips query strings and fragments", function () { + const requests = []; + const options = { + url: "https://example.test/missing?secret=private#fragment", + beforeRun(context) { + context.document.body.innerHTML = "Page 404 not found"; + context.XMLHttpRequest = function () { + this.open = (method, url) => requests.push({ method, url }); + this.send = () => { + this.status = 404; + this.onload(); + }; + }; + }, + }; + const off = setup(options); + off.window.document.dispatchEvent(new off.window.Event("DOMContentLoaded")); + expect(requests).to.have.length(0); + const on = setup({ + ...options, + settings: { autoCollect: false, detect404: true }, + }); + on.window.document.dispatchEvent(new on.window.Event("DOMContentLoaded")); + expect(requests).to.have.length(1); + expect(requests[0].method).to.equal("HEAD"); + expect(events(on)).to.deep.equal([ + { + name: "page_404", + metadata: { url: "https://example.test/missing", status: 404 }, + }, + ]); + }); + + it("supports the 404 script attribute after DOMContentLoaded", function () { + const dom = setup({ + beforeRun(context) { + context.document.head.innerHTML = + ''; + context.document.body.innerHTML = "Page 404 not found"; + Object.defineProperty(context.document, "readyState", { + value: "complete", + }); + context.XMLHttpRequest = function () { + this.open = () => {}; + this.send = () => { + this.status = 404; + this.onload(); + }; + }; + }, + }); + expect(events(dom)).to.have.length(1); + expect(events(dom)[0].name).to.equal("page_404"); + }); + + it("does not report a successful HEAD response as a 404", function () { + const dom = setup({ + settings: { autoCollect: false, detect404: true }, + beforeRun(context) { + context.document.body.innerHTML = "An article about 404 errors"; + context.XMLHttpRequest = function () { + this.open = () => {}; + this.send = () => { + this.status = 200; + this.onload(); + }; + }; + }, + }); + dom.window.document.dispatchEvent(new dom.window.Event("DOMContentLoaded")); + expect(events(dom)).to.have.length(0); + }); + + it("does not issue HEAD requests for 404 in HTML attributes", function () { + let requests = 0; + const dom = setup({ + settings: { autoCollect: false, detect404: true }, + beforeRun(context) { + context.document.head.innerHTML = + ''; + context.document.body.innerHTML = + '
A normal page
'; + context.XMLHttpRequest = function () { + requests++; + }; + }, + }); + dom.window.document.dispatchEvent(new dom.window.Event("DOMContentLoaded")); + expect(requests).to.equal(0); + }); +});