From 71df33b4b67271f67dd91f5d85de1832e5091322 Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Thu, 15 Oct 2026 13:02:41 +0200 Subject: [PATCH 1/2] Respect the configured namespace for manual pageviews Requested in item 3: keep namespaced trackers from replacing another tracker manual pageview function. Reuse existing namespace and pageview text variables to reduce minified bytes. Refs #107 --- dist/latest/cloudflare.js | 8 ++++-- dist/latest/custom/app.js | 4 +-- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 +-- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 8 ++++-- dist/latest/custom/latest.js | 4 +-- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/proxy.js | 4 +-- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 +-- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 8 ++++-- dist/latest/latest.js | 4 +-- dist/latest/latest.js.map | 2 +- dist/v12/app.js | 4 +-- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 +-- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/proxy.js | 4 +-- dist/v12/custom/proxy.js.map | 2 +- src/default.js | 8 ++++-- test/unit/pageview.test.js | 48 +++++++++++++++++++++++++++++++- 23 files changed, 98 insertions(+), 36 deletions(-) diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index c6c62a8..a7cd7e4 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; 3c57; v12) */ /* eslint-env browser */ (function ( @@ -894,7 +894,11 @@ if (autoCollect) pageview(); - window.sa_pageview = function (path, metadata, callback) { + window[namespace + "_" + pageviewText] = function ( + path, + metadata, + callback + ) { pageview(0, path, metadata, callback); }; diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 50e7c3c..8852e7d 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; 94f3; 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(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"); //# 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..c023d95 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":"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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) {\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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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..d256bc1 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; 9fd6; 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(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,f=w.userAgent,p="Not sending request ",h=p+"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(f)&&!/(cubot)/i.test(f),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"); //# 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..303b97d 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) {\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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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..fd4b1c5 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; 6b30; v12) */ /* eslint-env browser */ (function ( @@ -894,7 +894,11 @@ if (autoCollect) pageview(); - window.sa_pageview = function (path, metadata, callback) { + window[namespace + "_" + pageviewText] = function ( + path, + metadata, + callback + ) { pageview(0, path, metadata, callback); }; diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index f331c1b..1524eb1 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; 0e54; 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(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,f=w.userAgent,p="Not sending request ",h=p+"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(f)&&!/(cubot)/i.test(f),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"); //# 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..ff0746e 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) {\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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 67ce58b..57ec51c 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; d83b; 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(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"); //# 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..f653fa2 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) {\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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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..72e448c 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; 886c) */ -!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]||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> (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) {\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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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..53daf9a 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; ba0f; v12) */ /* eslint-env browser */ (function ( @@ -894,7 +894,11 @@ if (autoCollect) pageview(); - window.sa_pageview = function (path, metadata, callback) { + window[namespace + "_" + pageviewText] = function ( + path, + metadata, + callback + ) { pageview(0, path, metadata, callback); }; diff --git a/dist/latest/latest.js b/dist/latest/latest.js index d4e8c8e..34068e6 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; b31a; 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]||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> (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) {\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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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..77ec8a6 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; 91b9; 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]||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> (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) {\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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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..e8cb1f7 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; a7c9; 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(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"); //# 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..a5d0c43 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) {\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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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..64cf14f 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; 3cb1; 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(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"); //# 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..a980462 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) {\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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index d8dd4c9..e936068 100644 --- a/src/default.js +++ b/src/default.js @@ -1015,11 +1015,15 @@ if (autoCollect) pageview(); /** if metadata **/ - window.sa_pageview = function (path, metadata, callback) { + window[namespace + "_" + pageviewText] = function ( + path, + metadata, + callback + ) { pageview(0, path, metadata, callback); }; /** else **/ - window.sa_pageview = function (path, callback) { + window[namespace + "_" + pageviewText] = function (path, callback) { pageview(0, path, undefinedVar, callback); }; /** endif **/ diff --git a/test/unit/pageview.test.js b/test/unit/pageview.test.js index 0459f47..b66d0c2 100644 --- a/test/unit/pageview.test.js +++ b/test/unit/pageview.test.js @@ -1,7 +1,53 @@ const { expect } = require("chai"); -const { createDOM } = require("./helpers/dom"); +const { readFileSync } = require("fs"); +const { runInContext } = require("vm"); +const { createDOM, SCRIPT_PATH } = require("./helpers/dom"); describe("pageview", function () { + it("exposes the pageview function under its configured namespace", function () { + const dom = createDOM({ + settings: { namespace: "ba", autoCollect: false }, + }); + expect(dom.window.ba_pageview).to.be.a("function"); + expect(dom.window.sa_pageview).to.be.undefined; + dom.window.ba_pageview("/namespaced"); + expect(new URL(dom.sent[0].url).searchParams.get("path")).to.equal( + "/namespaced" + ); + dom.window.close(); + }); + + it("keeps a default manual tracker separate from an automatic namespaced tracker", function () { + const dom = createDOM({ + beforeRun(context) { + const script = context.document.createElement("script"); + script.setAttribute("data-auto-collect", "false"); + script.setAttribute("data-hostname", "primary.example.com"); + Object.defineProperty(context.document, "currentScript", { + value: script, + }); + }, + }); + const manualPageview = dom.window.sa_pageview; + const script = dom.window.document.currentScript; + script.setAttribute("data-auto-collect", "true"); + script.setAttribute("data-hostname", "secondary.example.com"); + script.setAttribute("data-namespace", "ba"); + runInContext(readFileSync(SCRIPT_PATH, "utf8"), dom.getInternalVMContext()); + expect(dom.window.sa_pageview).to.equal(manualPageview); + dom.window.sa_pageview("/manual"); + dom.window.ba_pageview("/other"); + const hostnames = dom.sent + .filter((request) => request.type === "image") + .map((request) => new URL(request.url).searchParams.get("hostname")); + expect(hostnames).to.deep.equal([ + "secondary.example.com", + "primary.example.com", + "secondary.example.com", + ]); + dom.window.close(); + }); + it("sends pageview, event and beacon requests", function (done) { const dom = createDOM({ navigationType: "reload" }); From cf05276124f3a931657a953953700e119c86ddbb Mon Sep 17 00:00:00 2001 From: Simple Analytics Codex Date: Thu, 15 Oct 2026 13:12:43 +0200 Subject: [PATCH 2/2] Retain the free legacy manual pageview alias Address review of item 3: older namespaced installations still call sa_pageview. Keep that alias when free, without overwriting another tracker, and cover both function names in the regression test. Refs #107 --- dist/latest/cloudflare.js | 11 +++++------ dist/latest/custom/app.js | 4 ++-- dist/latest/custom/app.js.map | 2 +- dist/latest/custom/e.js | 4 ++-- dist/latest/custom/e.js.map | 2 +- dist/latest/custom/latest.dev.js | 11 +++++------ dist/latest/custom/latest.js | 4 ++-- dist/latest/custom/latest.js.map | 2 +- dist/latest/custom/proxy.js | 4 ++-- dist/latest/custom/proxy.js.map | 2 +- dist/latest/hello.js | 4 ++-- dist/latest/hello.js.map | 2 +- dist/latest/latest.dev.js | 11 +++++------ dist/latest/latest.js | 4 ++-- dist/latest/latest.js.map | 2 +- dist/v12/app.js | 4 ++-- dist/v12/app.js.map | 2 +- dist/v12/custom/app.js | 4 ++-- dist/v12/custom/app.js.map | 2 +- dist/v12/custom/proxy.js | 4 ++-- dist/v12/custom/proxy.js.map | 2 +- src/default.js | 11 +++++------ test/unit/pageview.test.js | 8 +++++--- 23 files changed, 52 insertions(+), 54 deletions(-) diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index a7cd7e4..28400c2 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-10-15; 3c57; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; bf80; v12) */ /* eslint-env browser */ (function ( @@ -894,13 +894,12 @@ if (autoCollect) pageview(); - window[namespace + "_" + pageviewText] = function ( - path, - metadata, - callback - ) { + var manualPageview = function (path, metadata, callback) { pageview(0, path, metadata, callback); }; + window[namespace + "_" + pageviewText] = manualPageview; + var defaultPageview = defaultNamespace + "_" + pageviewText; + if (!window[defaultPageview]) window[defaultPageview] = manualPageview; ///////////////////// diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 8852e7d..1d1bb52 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-10-15; 94f3; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0f28; 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(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"); //# 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 c023d95..9b91452 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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","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) {\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\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","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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 d256bc1..36ddb9a 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-10-15; 9fd6; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; dc42; 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,f=w.userAgent,p="Not sending request ",h=p+"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(f)&&!/(cubot)/i.test(f),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(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,f=w.userAgent,p="Not sending request ",h=p+"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(f)&&!/(cubot)/i.test(f),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"); //# 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 303b97d..454bad5 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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","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) {\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\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","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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 fd4b1c5..0627142 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-10-15; 6b30; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 96de; v12) */ /* eslint-env browser */ (function ( @@ -894,13 +894,12 @@ if (autoCollect) pageview(); - window[namespace + "_" + pageviewText] = function ( - path, - metadata, - callback - ) { + var manualPageview = function (path, metadata, callback) { pageview(0, path, metadata, callback); }; + window[namespace + "_" + pageviewText] = manualPageview; + var defaultPageview = defaultNamespace + "_" + pageviewText; + if (!window[defaultPageview]) window[defaultPageview] = manualPageview; ///////////////////// diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index 1524eb1..69677d5 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-10-15; 0e54; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; ea2f; 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,f=w.userAgent,p="Not sending request ",h=p+"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(f)&&!/(cubot)/i.test(f),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(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,f=w.userAgent,p="Not sending request ",h=p+"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(f)&&!/(cubot)/i.test(f),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"); //# 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 ff0746e..c0f311e 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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","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) {\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\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","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js index 57ec51c..3ea4691 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-10-15; d83b; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; e48a; 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(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"); //# 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 f653fa2..777a6aa 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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","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) {\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\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","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index 72e448c..65db218 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-10-15; 886c) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; dca6) */ -!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]||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> (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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","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) {\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\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","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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 53daf9a..562c27b 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-10-15; ba0f; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; df32; v12) */ /* eslint-env browser */ (function ( @@ -894,13 +894,12 @@ if (autoCollect) pageview(); - window[namespace + "_" + pageviewText] = function ( - path, - metadata, - callback - ) { + var manualPageview = function (path, metadata, callback) { pageview(0, path, metadata, callback); }; + window[namespace + "_" + pageviewText] = manualPageview; + var defaultPageview = defaultNamespace + "_" + pageviewText; + if (!window[defaultPageview]) window[defaultPageview] = manualPageview; ///////////////////// diff --git a/dist/latest/latest.js b/dist/latest/latest.js index 34068e6..3053262 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-10-15; b31a; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 2446; 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]||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> (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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","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) {\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\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","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js index 77ec8a6..b2380e4 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-10-15; 91b9; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 410c; 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]||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> (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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","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.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) {\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\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","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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 e8cb1f7..365d4ed 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-10-15; a7c9; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 0ed8; 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(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"); //# 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 a5d0c43..138b932 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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","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) {\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\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","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue"],"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 64cf14f..e320412 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-10-15; 3cb1; SRI-version; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; afc9; 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(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"); //# 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 a980462..2b716dd 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[namespace + \"_\" + pageviewText] = function (\n path,\n metadata,\n callback\n ) {\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","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,KAqyBxB,KAlyBME,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,QAmpBJ,kBAlpBIH,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,IAAMvM,EAIVmC,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,EAAO6H,GAAY,IAAMlH,GAAgB,SACvCgK,EACA5C,EACAuB,GAEA8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAQ9B,IAAI4I,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUtH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIqK,EAAkB1K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnD8C,SAAmBxH,EAEvB,GAAIqH,GAAWtJ,QAAQyJ,GAAa,IAAMD,EAExC,OADAlO,EAAeqH,GAAmB3K,EAAY,aAAeyR,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,KAAM9J,EAAWiK,MAAOA,GACxC2H,GAAa5D,IAAiBzL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAUwK,GAEhC1H,GACFxB,GACE1D,EAAO4M,EAAa,CAClB9E,GAAI5G,KACJgK,MAAOxI,IAAgBmK,GACvBlF,UACGkF,GAAa7D,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAU9F,EAAU8F,KAEtBuB,IAKFmJ,GAAmB,SAAU5H,EAAO9C,EAAUuB,GAChD6I,GAAUtH,EAAO9C,EAAUuB,IAIxBtJ,EAAOuL,MACVvL,EAAOuL,IAAqBkH,IAE9B,IAAIC,GAAY1S,EAAOuL,IAGnBoH,GAAQD,IAAaA,GAAUlK,EAAIkK,GAAUlK,EAAI,GAMrD,IAAK,IAAIqC,MAHT7K,EAAOuL,IAAqBkH,GAGVE,GACZtO,EAAQsO,GAAO9H,MACjBzF,MAAMC,QAAQsN,GAAM9H,KAChBsH,GAAUlO,MAAM,KAAM0O,GAAM9H,KAC5BsH,GAAUQ,GAAM9H,MAGxB,MAAOsD,IACPhO,EAAUgO,IAjJY,IAAUzD,GACxBmH,GArnBkBxG,GAnN9B,CA29BErL,OACA,uBACA"} \ 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) {\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 var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\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","manualPageview","defaultPageview","defaultNamespace","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,KAoyBxB,KAjyBME,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,QAkpBJ,kBAjpBIH,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,IAAMvM,EAIVmC,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,KAEjB,IAAI8C,GAAiB,SAAUvH,EAAM5C,EAAUuB,GAC7C8F,GAAS,EAAGzE,EAAM5C,EAAUuB,IAE9BtJ,EAAO6H,GAAY,IAAMlH,GAAgBuR,GACzC,IAAIC,GAAkBC,MAAyBzR,EAC1CX,EAAOmS,MAAkBnS,EAAOmS,IAAmBD,IAOxD,IAAIG,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUzH,EAAO9C,EAAUwH,IACpCA,GAAe7H,GAAWK,KAAWwH,EAAcxH,GAExD,IAAIwK,EAAkB7K,GAAWmD,GAC7BvB,EAAW5B,GAAW6H,GAAeA,EAAc,aACnDiD,SAAmB3H,EAEvB,GAAIwH,GAAWzJ,QAAQ4J,GAAa,IAAMD,EAExC,OADArO,EAAeqH,GAAmB3K,EAAY,aAAe4R,GACtDlJ,IAGT,IACE,GAAIiJ,EAAiB,CACnB,IAAIE,EAAc5H,IAClB,GAAIwH,GAAWzJ,eAAe6J,GAAe,EAK3C,OAJAvO,EACEqH,GACAV,EAAQ,uBAAyB4H,GAE5BnJ,IAETuB,EAAQ4H,GAEV,MAAOrO,IAEP,OADAF,EAAeqH,GAAmBnH,IAC3BkF,IAGTuB,GAAS,GAAKA,GAAO/F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI4N,EAAc,CAAEhI,KAAM9J,EAAWiK,MAAOA,GACxC8H,GAAa/D,IAAiBzL,EAAQ,EAE1C4E,EAAWD,GAAeC,EAAU2K,GAEhC7H,GACFxB,GACE1D,EAAO+M,EAAa,CAClBjF,GAAI5G,KACJgK,MAAOxI,IAAgBsK,GACvBrF,UACGqF,GAAahE,KAAapI,GAAsB,KAC7CmI,GACA,KAEN3G,SAAU9F,EAAU8F,KAEtBuB,IAKFsJ,GAAmB,SAAU/H,EAAO9C,EAAUuB,GAChDgJ,GAAUzH,EAAO9C,EAAUuB,IAIxBtJ,EAAOuL,MACVvL,EAAOuL,IAAqBqH,IAE9B,IAAIC,GAAY7S,EAAOuL,IAGnBuH,GAAQD,IAAaA,GAAUrK,EAAIqK,GAAUrK,EAAI,GAMrD,IAAK,IAAIqC,MAHT7K,EAAOuL,IAAqBqH,GAGVE,GACZzO,EAAQyO,GAAOjI,MACjBzF,MAAMC,QAAQyN,GAAMjI,KAChByH,GAAUrO,MAAM,KAAM6O,GAAMjI,KAC5ByH,GAAUQ,GAAMjI,MAGxB,MAAOsD,IACPhO,EAAUgO,IAhJY,IAAUzD,GACxBmH,GArnBkBxG,GAnN9B,CA09BErL,OACA,uBACA"} \ No newline at end of file diff --git a/src/default.js b/src/default.js index e936068..3b0a8c0 100644 --- a/src/default.js +++ b/src/default.js @@ -1015,18 +1015,17 @@ if (autoCollect) pageview(); /** if metadata **/ - window[namespace + "_" + pageviewText] = function ( - path, - metadata, - callback - ) { + var manualPageview = function (path, metadata, callback) { pageview(0, path, metadata, callback); }; /** else **/ - window[namespace + "_" + pageviewText] = function (path, callback) { + var manualPageview = function (path, callback) { pageview(0, path, undefinedVar, callback); }; /** endif **/ + window[namespace + "_" + pageviewText] = manualPageview; + var defaultPageview = defaultNamespace + "_" + pageviewText; + if (!window[defaultPageview]) window[defaultPageview] = manualPageview; /** else **/ pageview(); diff --git a/test/unit/pageview.test.js b/test/unit/pageview.test.js index b66d0c2..fc692a5 100644 --- a/test/unit/pageview.test.js +++ b/test/unit/pageview.test.js @@ -9,11 +9,13 @@ describe("pageview", function () { settings: { namespace: "ba", autoCollect: false }, }); expect(dom.window.ba_pageview).to.be.a("function"); - expect(dom.window.sa_pageview).to.be.undefined; + expect(dom.window.sa_pageview).to.equal(dom.window.ba_pageview); + dom.window.sa_pageview("/legacy"); dom.window.ba_pageview("/namespaced"); - expect(new URL(dom.sent[0].url).searchParams.get("path")).to.equal( - "/namespaced" + const paths = dom.sent.map((request) => + new URL(request.url).searchParams.get("path") ); + expect(paths).to.deep.equal(["/legacy", "/namespaced"]); dom.window.close(); });