diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index 967e418..2a9d738 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -6,6 +6,7 @@ on: push: branches: - master + - main jobs: build: @@ -29,26 +30,16 @@ jobs: local-logging-level: "all-logs" local-identifier: "random" - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + set-safe-directory: "/github/workspace" - name: Prettier Action on PR - if: github.event_name == 'pull_request' - uses: creyD/prettier_action@v1.0 + uses: creyD/prettier_action@v4.3 with: prettier_options: "--write {**/*,*}.{js,hbs,html,json,md,yml,css,scss} !.github/workflows/**/* !dist/**/*" commit_message: "Run prettier via GitHub Action" - branch: ${{ github.head_ref }} - file_pattern: "." - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Prettier Action on master - if: github.ref == 'refs/heads/master' - uses: creyD/prettier_action@v1.0 - with: - prettier_options: "--write {**/*,*}.{js,html,json,md,yml,css,scss} !.github/workflows/**/* !dist/**/*" - commit_message: "Run prettier via GitHub Action" - branch: master file_pattern: "." env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/compile.js b/compile.js index 041220a..52f4bbf 100644 --- a/compile.js +++ b/compile.js @@ -8,7 +8,7 @@ const GREEN = "\x1b[32m%s\x1b[0m"; const YELLOW = "\x1b[33m%s\x1b[0m"; const RED = "\x1b[31m%s\x1b[0m"; -const VERSION = 10; +const VERSION = 11; Handlebars.registerHelper("or", function (param1, param2) { return param1 || param2; @@ -77,6 +77,7 @@ const DEFAULTS = { nonuniquehostnames: true, ignoremetrics: true, dev: false, + skipnonwindow: false, }; const LIGHT = { @@ -161,15 +162,27 @@ const templates = [ output: `cloudflare.js`, variables: { ...DEFAULTS, + skipnonwindow: true, minify: false, version: VERSION, scriptName: `cloudflare_${VERSION}`, sri: false, baseUrl: "{{cloudFlareCustomDomain}}", overwriteOptions: { - saGlobal: "INSTALL_OPTIONS.sa_global", - mode: "INSTALL_OPTIONS.hash_mode ? 'hash' : null", - collectDnt: "INSTALL_OPTIONS.collect_dnt", + hostname: "INSTALL_OPTIONS.hostname", + collectDnt: + "typeof INSTALL_OPTIONS.collect_dnt === 'boolean' ? INSTALL_OPTIONS.collect_dnt : null", + mode: "INSTALL_OPTIONS.hash_mode ? 'hash' : 'normal'", + strictUtm: + "INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.strict_utm", + allowParams: + "INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.allow_url_parameters", + nonUniqueHostnames: + "INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.non_unique_hostnames", + ignorePages: + "INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.ignore_pages", + namespace: + "INSTALL_OPTIONS.overwrite_namespace && INSTALL_OPTIONS.namespace", }, }, }, diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index 6f5e25c..df23dca 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; d8f9; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 19c1; v11) */ -function n(t,e){var o,a=!1;b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp(".("+(b.downloadsExtensions||[]).join("|")+")","i").test(t.pathname)?a="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==c.location.hostname?a="outbound":b.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(o="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.on("click",function(){saAutomatedLink(a)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n var event;\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, callback);\n\n log(\"collected \" + clean);\n\n return window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \".(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.on(\"click\", function () {\n saAutomatedLink(collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n\n // Skip links that don't have an href\n if (!link.getAttribute(\"href\")) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\")) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","on","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","useTitle","event","pop","clean","replace","setTimeout","readyState","addEventListener","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function (element) {\n saAutomatedLink(element.target, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","element","saAutomatedLink","target","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/cloudflare.js b/dist/latest/cloudflare.js index 465cd66..9142e78 100644 --- a/dist/latest/cloudflare.js +++ b/dist/latest/cloudflare.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 9974; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 0dec; v11) */ /* eslint-env browser */ (function ( @@ -59,10 +59,14 @@ var platformText = "platform"; var platformVersionText = "platformVersion"; var docsUrl = "https://docs.simpleanalytics.com"; + var pages = 0; var isBotAgent = /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); var screen = window.screen; + // Skip server side rendered pages on Cloudflare + if (typeof window == "" + undefinedVar) return; + // Find the script element where options can be set on var scriptElement = doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); @@ -77,12 +81,11 @@ var args = [].slice.call(arguments); // 2. Prepend log prefix - args.unshift("Simple Analytics: "); + args.unshift("Simple Analytics:"); // 3. Pass along arguments to console.warn - // Function.prototype.bind.call is needed for Internet Explorer - var log = Function.prototype.bind.call(con.warn, con); - log.apply(con, args); + // Function.prototype.apply.call is needed for Internet Explorer + return Function.prototype.apply.call(con.warn, con, args); }; var warnInFunction = function (name, error) { @@ -133,8 +136,13 @@ return to; }; + var settings = window.sa_settings; + var logSettings = settings || Object.keys(overwriteOptions).length; + // Merge overwriteOptions with sa_settings - overwriteOptions = assign(overwriteOptions, window.sa_settings); + overwriteOptions = assign(overwriteOptions, settings); + + if (logSettings) warn("Settings", overwriteOptions); // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( @@ -280,6 +288,7 @@ data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; + if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar; var image = new Image(); @@ -432,7 +441,8 @@ window.phantom || window.__polypane || window._bot || - isBotAgent; + isBotAgent || + Math.random() == Math.random(); // t = timeonpage, scro = scrolled var collectDataOnLeave = @@ -501,12 +511,17 @@ var page = {}; var lastSendPath; + var getReferrer = function () { + return ( + (doc.referrer || "") + .replace(locationHostname, definedHostname) + .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") + .replace(/^([^/]+)$/, "$1") || undefinedVar + ); + }; + // We don't want to end up with sensitive data so we clean the referrer URL - var referrer = - (doc.referrer || "") - .replace(locationHostname, definedHostname) - .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") - .replace(/^([^/]+)$/, "$1") || undefinedVar; + var referrer = getReferrer(); ///////////////////// // TIME ON PAGE AND SCROLLED LOGIC @@ -629,6 +644,8 @@ return path; }; + var previousReferrer; + // Send page view and append data to it var sendPageView = function ( isPushState, @@ -650,9 +667,14 @@ metadata: stringify(metadata), }); + previousReferrer = referrer; referrer = currentPage; + + pages++; }; + var sameSite, userNavigated; + var pageview = function (isPushState, pathOverwrite, metadata) { // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -698,7 +720,7 @@ warn(error); } - var userNavigated = performaceEntryType + userNavigated = performaceEntryType ? ["reload", "back_forward"].indexOf(performaceEntryType) > -1 : // Check if back, forward or reload buttons are being use in older browsers // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD @@ -707,8 +729,10 @@ [1, 2].indexOf(perf[navigationText].type) > -1; // Check if referrer is the same as current real hostname (not the defined hostname!) - var currentReferrerHostname = doc.referrer.split(slash)[2]; - var sameSite = referrer + var currentReferrerHostname = referrer + ? referrer.split(slash)[0] + : undefinedVar; + sameSite = referrer ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 || currentReferrerHostname == locationHostname : falseVar; @@ -861,13 +885,19 @@ event = ("" + event).replace(/[^a-z0-9]+/gi, "_").replace(/(^_|_$)/g, ""); var eventParams = { type: eventText, event: event }; + var firstPage = !userNavigated && pages < 2; metadata = appendMetadata(metadata, eventParams); if (event) { sendData( assign(eventParams, { - query: getQueryParams(), + id: uuid(), + query: getQueryParams(!firstPage), + referrer: + (firstPage || sameSite) && collectMetricByString("r") + ? previousReferrer + : null, metadata: stringify(metadata), }), @@ -905,9 +935,9 @@ } })( window, - {"saGlobal":INSTALL_OPTIONS.sa_global,"mode":INSTALL_OPTIONS.hash_mode ? 'hash' : null,"collectDnt":INSTALL_OPTIONS.collect_dnt}, + {"hostname":INSTALL_OPTIONS.hostname,"collectDnt":typeof INSTALL_OPTIONS.collect_dnt === 'boolean' ? INSTALL_OPTIONS.collect_dnt : null,"mode":INSTALL_OPTIONS.hash_mode ? 'hash' : 'normal',"strictUtm":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.strict_utm,"allowParams":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.allow_url_parameters,"nonUniqueHostnames":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.non_unique_hostnames,"ignorePages":INSTALL_OPTIONS.advanced_settings_toggle && INSTALL_OPTIONS.ignore_pages,"namespace":INSTALL_OPTIONS.overwrite_namespace && INSTALL_OPTIONS.namespace}, INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com", "", - "cloudflare_10", + "cloudflare_11", "sa" ); diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js index 35e4ac5..a3febd3 100644 --- a/dist/latest/custom/app.js +++ b/dist/latest/custom/app.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 2407; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 527b; v11) */ -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,A=f.addEventListener,q="https://"+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,H="offset"+D,R="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=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)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=f[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=f[Ot];if(!tt(n))return t;try{return Y(t,n.call(f,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(f[ct]==d)return h(w+"twice");f.sa_event_loaded=d,f[ct]=d;var st=function(e,t,n){e=n?e:Y(At,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=q+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"custom_app_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,h(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},A(o,function(t){t.filename&&-1"); +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.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(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_app_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); //# 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 9e264f4..ea3f10a 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 isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\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.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(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 // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, window.sa_settings);\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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // 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 // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 var 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 = doc.referrer.split(slash)[2];\n var 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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\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_10\",\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","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\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 return (\n (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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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_11\",\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","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","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","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","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js index 6f5e25c..df23dca 100644 --- a/dist/latest/custom/auto-events.js +++ b/dist/latest/custom/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; d8f9; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 19c1; v11) */ -function n(t,e){var o,a=!1;b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp(".("+(b.downloadsExtensions||[]).join("|")+")","i").test(t.pathname)?a="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==c.location.hostname?a="outbound":b.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(o="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.on("click",function(){saAutomatedLink(a)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n var event;\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, callback);\n\n log(\"collected \" + clean);\n\n return window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \".(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.on(\"click\", function () {\n saAutomatedLink(collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n\n // Skip links that don't have an href\n if (!link.getAttribute(\"href\")) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\")) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","on","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","useTitle","event","pop","clean","replace","setTimeout","readyState","addEventListener","target"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auto-events.source.js","sources":["auto-events.source.js"],"sourcesContent":["(function saAutomatedEvents(window) {\n // Skip server side rendered pages\n if (typeof window === \"undefined\") return;\n\n var log = function (message, type) {\n var logger = type === \"warn\" ? console.warn : console.info;\n return logger && logger(\"Simple Analytics auto events:\", message);\n };\n\n var doc = window.document;\n\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"auto-events.js\"]');\n\n var setting = function (attribute, type, defaultValue) {\n var value = scriptElement && scriptElement.dataset[attribute];\n\n // Booleans\n if (type === \"bool\" && (value === \"true\" || value === \"false\"))\n return value === \"true\";\n else if (type === \"bool\") return defaultValue;\n\n // Arrays\n if (type === \"array\" && value)\n return value\n .split(\",\")\n .map(function (item) {\n return item.trim();\n })\n .filter(Boolean);\n else if (type === \"array\") return defaultValue;\n\n return value || defaultValue;\n };\n\n var collectTypes = setting(\"collect\", \"array\", [\n \"outbound\",\n \"emails\",\n \"downloads\",\n ]);\n var fullUrls = setting(\"fullUrls\", \"bool\", false);\n\n var options = {\n // What to collect\n outbound: collectTypes.indexOf(\"outbound\") > -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function (element) {\n saAutomatedLink(element.target, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","element","saAutomatedLink","target","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js index d6ec5b1..2313f00 100644 --- a/dist/latest/custom/e.js +++ b/dist/latest/custom/e.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 9b1b; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; e5db; v11) */ -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,A=f.addEventListener,q="https://"+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,H="offset"+D,R="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=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)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=f[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=f[Ot];if(!tt(n))return t;try{return Y(t,n.call(f,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(f[ct]==d)return h(w+"twice");f.sa_event_loaded=d,f[ct]=d;var st=function(e,t,n){e=n?e:Y(At,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=q+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"custom_events_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,h(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},A(o,function(t){t.filename&&-1"); +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.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(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_events_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); //# 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 7fd4880..3563f4b 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 isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\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.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(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 // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, window.sa_settings);\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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // 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 // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 var 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 = doc.referrer.split(slash)[2];\n var 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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\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_10\",\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","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\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 return (\n (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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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_11\",\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","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","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","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","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"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 92216ad..51d316c 100644 --- a/dist/latest/custom/latest.dev.js +++ b/dist/latest/custom/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; e711; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 761d; v11) */ /* eslint-env browser */ (function ( @@ -59,10 +59,12 @@ var platformText = "platform"; var platformVersionText = "platformVersion"; var docsUrl = "https://docs.simpleanalytics.com"; + var pages = 0; var isBotAgent = /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); var screen = window.screen; + // Find the script element where options can be set on var scriptElement = doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); @@ -77,12 +79,11 @@ var args = [].slice.call(arguments); // 2. Prepend log prefix - args.unshift("Simple Analytics: "); + args.unshift("Simple Analytics:"); // 3. Pass along arguments to console.warn - // Function.prototype.bind.call is needed for Internet Explorer - var log = Function.prototype.bind.call(con.warn, con); - log.apply(con, args); + // Function.prototype.apply.call is needed for Internet Explorer + return Function.prototype.apply.call(con.warn, con, args); }; var warnInFunction = function (name, error) { @@ -133,8 +134,13 @@ return to; }; + var settings = window.sa_settings; + var logSettings = settings || Object.keys(overwriteOptions).length; + // Merge overwriteOptions with sa_settings - overwriteOptions = assign(overwriteOptions, window.sa_settings); + overwriteOptions = assign(overwriteOptions, settings); + + if (logSettings) warn("Settings", overwriteOptions); // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( @@ -280,6 +286,7 @@ data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; + if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar; data.dev = trueVar; @@ -433,7 +440,8 @@ window.phantom || window.__polypane || window._bot || - isBotAgent; + isBotAgent || + Math.random() == Math.random(); // t = timeonpage, scro = scrolled var collectDataOnLeave = @@ -503,12 +511,17 @@ var page = {}; var lastSendPath; + var getReferrer = function () { + return ( + (doc.referrer || "") + .replace(locationHostname, definedHostname) + .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") + .replace(/^([^/]+)$/, "$1") || undefinedVar + ); + }; + // We don't want to end up with sensitive data so we clean the referrer URL - var referrer = - (doc.referrer || "") - .replace(locationHostname, definedHostname) - .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") - .replace(/^([^/]+)$/, "$1") || undefinedVar; + var referrer = getReferrer(); ///////////////////// // TIME ON PAGE AND SCROLLED LOGIC @@ -631,6 +644,8 @@ return path; }; + var previousReferrer; + // Send page view and append data to it var sendPageView = function ( isPushState, @@ -652,9 +667,14 @@ metadata: stringify(metadata), }); + previousReferrer = referrer; referrer = currentPage; + + pages++; }; + var sameSite, userNavigated; + var pageview = function (isPushState, pathOverwrite, metadata) { // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -700,7 +720,7 @@ warn(error); } - var userNavigated = performaceEntryType + userNavigated = performaceEntryType ? ["reload", "back_forward"].indexOf(performaceEntryType) > -1 : // Check if back, forward or reload buttons are being use in older browsers // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD @@ -709,8 +729,10 @@ [1, 2].indexOf(perf[navigationText].type) > -1; // Check if referrer is the same as current real hostname (not the defined hostname!) - var currentReferrerHostname = doc.referrer.split(slash)[2]; - var sameSite = referrer + var currentReferrerHostname = referrer + ? referrer.split(slash)[0] + : undefinedVar; + sameSite = referrer ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 || currentReferrerHostname == locationHostname : falseVar; @@ -863,13 +885,19 @@ event = ("" + event).replace(/[^a-z0-9]+/gi, "_").replace(/(^_|_$)/g, ""); var eventParams = { type: eventText, event: event }; + var firstPage = !userNavigated && pages < 2; metadata = appendMetadata(metadata, eventParams); if (event) { sendData( assign(eventParams, { - query: getQueryParams(), + id: uuid(), + query: getQueryParams(!firstPage), + referrer: + (firstPage || sameSite) && collectMetricByString("r") + ? previousReferrer + : null, metadata: stringify(metadata), }), @@ -910,6 +938,6 @@ {}, "", "", - "custom_latest_dev_10", + "custom_latest_dev_11", "sa" ); diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js index 27faae6..003984e 100644 --- a/dist/latest/custom/latest.js +++ b/dist/latest/custom/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; fe3c; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; b8c6; v11) */ -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,A=f.addEventListener,q="https://"+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,H="offset"+D,R="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=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)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=f[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=f[Ot];if(!tt(n))return t;try{return Y(t,n.call(f,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(f[ct]==d)return h(w+"twice");f.sa_event_loaded=d,f[ct]=d;var st=function(e,t,n){e=n?e:Y(At,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=q+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"custom_latest_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,h(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},A(o,function(t){t.filename&&-1"); +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.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(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); //# 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 3c24609..f5c01b2 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 isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\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.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(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 // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, window.sa_settings);\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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // 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 // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 var 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 = doc.referrer.split(slash)[2];\n var 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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\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_10\",\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","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\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 return (\n (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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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_11\",\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","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","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","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","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"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,IAO/CG,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUtB,EAAeuB,GAClC,OAAOvB,GAAiBA,EAAcwB,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EAboB,iBAcXA,GAAQA,EAAIG,OACrBH,EAAII,MAAM,OACV,IAGFC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBhB,QAGtCiB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAM9B,UACD+B,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACdxB,EAAQwB,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAW/F,EAAOgG,YAClBC,EAAcF,GAAYvB,OAAO0B,KAAKjG,GAAkBmF,OAG5DnF,EAAmBwF,EAAOxF,EAAkB8F,GAExCE,GAAa7F,EAAK,WAAYH,GAGlC,IAAIkG,EAAgBnB,EAClB/E,EAAiBkG,eAAiBtB,EAAKtB,EAAe,mBAGpD6C,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,EAAcG,OAAO,SAAU3B,GAC7B,OAAO,IAAI4B,OAAO,IAAMF,GAAoBhD,KAAKsB,KAChDS,QAIHoB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe3G,EAAO4G,QAAU5G,EAAO6G,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAO/C,GACP,OAAO0C,EAAUlC,QAAQmC,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,GACFzH,EAAiBwH,KACjB5C,EAAKtB,EAAekE,KA6uBxB,KA1uBME,GAAiB3H,EAAO0H,GAAY,aACpCE,GAAiB,SAAUC,EAAUC,GACnCxC,EAASqC,MAAiBE,EAAWpC,EAAOoC,EAAUF,KAC1D,IAAII,EAA4B/H,EAAOgI,IACvC,IAAKT,GAAWQ,GAA4B,OAAOF,EACnD,IACE,OAAOpC,EACLoC,EACAE,EAA0BnE,KAAK5D,EAAQyF,EAAOoC,EAAUC,KAE1D,MAAO1D,GACPF,EAAe,WAAYE,KAU3B6D,GACFhI,EAAiBgI,WACjBpD,EAAKtB,EAAe,eAAiB9C,EAEnCyH,GAAiB,SAAUC,GAC7B,OACEhH,EAAIiH,OACDzE,MAAM,GACN0B,MAAM,KACNiB,OAAO,SAAU+B,GAChB,IAAIC,EAASH,IAAiB/B,GAAsB,MAEhDmC,EAAkBC,GAAYC,IAAI/D,GAAagE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCN,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAM,EACA,KACJ,OAAID,IAAWE,GAAYpD,OAAe5E,EAInC,IAAI+F,OAAOoC,GAAOtF,KAAKgF,KAE/BK,KAAK,MAAQrI,GAgChBuI,GAAiBlB,GAAY,UACjC,GAAI1H,EAAO4I,KAAmBrI,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAO6I,gBAAkBtI,EACzBP,EAAO4I,IAAkBrI,EAOzB,IAAIuI,GAAW,SAAUhB,EAAMiB,EAAUC,GACvClB,EAAOkB,EAAelB,EAAOrC,EAAOwD,GAASC,GAAMpB,GAE/C7G,EAAIkI,QAAUH,IAAclB,EAAKqB,MAAQ5I,GACzCU,EAAImI,qBAAuBJ,IAAclB,EAAKuB,KAAO9I,GAGzD,IAAI+I,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJrH,EACA,eACAmC,OAAO0B,KAAK4B,GACTxB,OAAO,SAAUqD,GAChB,OAAO7B,EAAK6B,IAAQtJ,IAErBoI,IAAI,SAAUkB,GACb,OACE9H,EAAuB8H,GACvB,IACA9H,EAAuBiG,EAAK6B,MAG/BjB,KAAK,KACR,SACAjC,KAAKD,OAILoD,GACF3J,EAAiB4J,UAAYhF,EAAKtB,EAAe,YAC/CuG,GAAkBF,IAAuBvI,EAEzC0I,GAAc,CAChBC,QAymBJ,mBAxmBIH,SAAUC,IASZ3J,EAAY,SAAU8J,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ7J,EAAK6J,GACLnB,GACErD,EAAOsE,GAAa,CAClBI,KAAMtJ,EACNuD,MAAO6F,EACPG,KAAMjJ,EAAIkJ,WAEZhK,EACAE,IAMJ4B,EACEtB,EACA,SAAUyJ,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASC,QAAQtK,IAC3CC,EAAUmK,EAAMG,UAGpBjK,GAOF,IAwDIkK,GAxDAC,GAAQnE,KAERoE,GAAW,EAOXC,GAAO5K,EAAiB4K,MAAQhG,EAAKtB,EAAe,QAGpDuH,MAvKsBC,GAuKC9K,EAAiB6K,cAtKvBC,GAuKjB9K,EAAiB6K,WACjBjG,EAAKtB,EAAe,eAAiB9C,GACrCoE,EAAKtB,EAAe,aAAe9C,GACnCoE,EAAKtB,EAAe,gBAAkB9C,EAGtCuK,KACqC,SAAvCnG,EAAKtB,EAAe,iBACpBtD,EAAiB+K,cAAgBxK,GAI/ByK,GACFhL,EAAiBiL,UACjBrG,EAAKtB,EAAe,cACpBmE,GAAY,IAAM9G,EAGhBuK,GAAcnG,EAChB/E,EAAiBkL,aAAetG,EAAKtB,EAAe,iBAIlDiF,GAAcxD,EAChB/E,EAAiBuI,aAAe3D,EAAKtB,EAAe,iBAIlD6H,GAAqBpG,EACvB/E,EAAiBmL,oBACfvG,EAAKtB,EAAe,yBAIpB8H,GACFpL,EAAiBoL,gBAAkBxG,EAAKtB,EAAe,mBAGrDyE,GACF/H,EAAiB+H,mBACjBnD,EAAKtB,EAAe,sBAItB,IAEEmH,GAAWtE,GAAsB,KAC7BkF,KAAKC,iBAAiBC,kBAAkBC,SACxCpL,EACJ,MAAO+D,IACPhE,EAAKgE,IAOP,IAAIsH,GACFzK,EAAI0K,WACJ3L,EAAO4L,aACP5L,EAAO6L,aACP7L,EAAO8L,UACP9L,EAAO+L,SACP/L,EAAOgM,YACPhM,EAAOiM,MACP7I,GACAiE,KAAKC,UAAYD,KAAKC,SAGpB4E,GACF9F,GAAsB,MAAQA,GAAsB,QAElDsF,KAAK3B,GAAY2B,IAAMnL,GAE3B,IAAI0I,GAAUxD,EAAOsE,GAAa,CAEhCoC,GAAI/F,GAAsB,MAAQ3E,EAAYpB,EAE9CK,MAAOS,EAAIiL,UAAY1L,EACvBgK,SAAUA,GACV2B,QAASH,GAAqBxF,KAASrG,EAGvCiM,WAAYlG,GAAsB,MAAQM,KAASrG,IA0BrD,GAvBA4I,GAAQsD,IAAM/L,EAIVkC,IACFuG,GAAQuD,OAAS9J,EAAO8J,OACxBvD,GAAQwD,OAASxK,EAAUS,EAAO+J,SAS/BlL,EAAImL,SAAStM,EAAK,4CAInB0J,KAAoBzI,IACtB4H,GAAQ0D,kBAAoBtL,IAGzByJ,IAAc9J,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBkC,EAAU,SAK7B,GAAlC7B,EAAiBmJ,QAAQ,OACxB,aAAanH,KAAKhC,IACnBuI,IAEDxJ,EACE,mBACEiB,EACA,SACA6B,EACA,0BAON,IACI0J,GAiDAC,GAlDA3D,GAAO,GAaP4D,IARCvL,EAAIuL,UAAY,IACdlI,QAAQvD,EAAkByI,IAC1BlF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASvE,EAYjC0M,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,IAEIC,EAFCjB,KAEDiB,EAAS1H,EAAOsE,GAAa,CAC/BI,KAAM,SACNiD,YAAaF,EAAOD,EAAKhE,GAAQoD,UAI/BjG,GAAsB,OACxB+G,EAAOE,SAAWhG,KAAKiG,OAAO9G,KAAQmE,GAAQoC,IAhfnC,MAkfbA,GAAW,EACXpC,GAAQnE,KAGJJ,GAAsB,UACxB+G,EAAOvC,SAAWvD,KAAKkG,IAAI,EAAG3C,GAAU4C,OAGtCN,IAASjM,EAAIwM,WAEf3E,GAASqE,EAAQ9M,EAAcE,GAE/BU,EAAIwM,WAAWpL,EAAa,UAAWJ,EAAUkL,MAKrDhL,EACE,mBACA,WACMZ,EAAImM,QACA,KAAO3K,KAAY/C,GAASgN,KAClCH,GAAcrG,MACTuG,IAAYvG,KAAQqG,IAE7BrM,GAGF2B,EAAqBY,EAAUiK,GAAaxM,GAE5C,IAAImN,GAAOpM,EAAIoM,MAAQ,GACnBH,GAAW,WACb,IACE,IAAII,EAAuBtL,EAAgBQ,IAAiB,EACxD+K,EAASxG,KAAKkG,IAChBI,GAAK/K,IAAiB,EACtB+K,GAAK9K,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAOwE,KAAKyG,IACV,IAKI,EAJJzG,KAAKiG,MACF,MAAQhL,EAAgByL,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOzJ,IAEP,OADAhE,EAAKgE,IACE,IAIXjC,EAAqB,OAAQ,WAC3ByI,GAAW4C,KACXrL,EACEM,EACA,WACMmI,GAAW4C,OAAY5C,GAAW4C,OAExChN,KAQJ,IAgCIwN,GA6BAC,GAAUC,GA7DVC,GAAU,SAAUC,GACtB,IAAIhE,EAAO,GAIX,IACEA,EAAOgE,GAAarM,EAAuBZ,EAAIkJ,UAC/C,MAAOjG,IACPhE,EAAKgE,IAGP,IAAIiK,EAAyBrO,EAAOqL,IACpC,GAAI9D,GAAW8G,GACb,IACEjE,EAAOiE,EAAuBzK,KAAK5D,EAAQ,CAAEoK,KAAMA,KAAWA,EAC9D,MAAOhG,IACPF,EAAe,OAAQE,IAK3B,IAlYiB,SAAUgG,GAC3B,IAAK,IAAIkE,KAAKnD,GAAa,CACzB,IAAIoD,EAAgBpD,GAAYmD,GAChC,GAAKC,EAAL,CAGA,IAAIC,EAhOI,KAiOND,EAAc,GAAcA,EAjOtB,IAiO8CA,EAEtD,GACEC,IAAepE,GACf,IAAI7D,OACF,IAAM7B,EAAY8J,GAAY5J,QAAQ,SAAU,QAAU,IAC1D,KACAvB,KAAK+G,GAEP,OAAO7J,GAEX,OAAOC,EAgXHiO,CAAarE,GAQjB,MAFY,QAARS,IAAkB1J,EAAIuN,OAAMtE,GAAQjJ,EAAIuN,KAAKrJ,MAAM,KAAK,IAErD+E,EAPLhK,EAAKuB,EAAiB,YAAcyI,IAyCpCuE,GAAW,SAAUC,EAAaC,EAAehH,GAEnD,IAAIuC,EAAO+D,GAAQU,GAGnB,GAAKzE,GAAQwC,IAAgBxC,EAA7B,CAEAwC,GAAexC,EACflB,GAAKkB,KAAOA,EAGRhE,GAAsB,OACxB8C,GAAK4F,eACHzH,KAAKkG,IAAIjL,EAA2B,aAAK,EAAGtC,EAAO+O,YAAc,IACjE,KACF7F,GAAK8F,gBACH3H,KAAKkG,IACHjL,EAAgBQ,IAAiB,EACjC9C,EAAOiP,aAAe,IACnB,MAIL7I,GAAsB,MACpBnF,EAAIsB,KAAW2G,GAAK3G,GAAYtB,EAAIsB,IAItCe,GAAU8C,GAAsB,QAClC8C,GAAKgG,aAAe5L,EAAO6L,MAC3BjG,GAAKkG,cAAgB9L,EAAOuK,QAI9B,IAIIwB,EAJAC,EAAOtP,EAAOuP,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGrF,KAC/D,MAAO/F,IACPhE,EAAKgE,IAGP8J,GAAgBmB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB7E,QAAQ6E,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAGhF,QAAQ8E,EAAKE,GAAgBrF,MAGxC,IAAIuF,EAA0B5C,GAC1BA,GAASzH,MA7rBH,KA6rBgB,GACtBhF,EACJ4N,GAAWnB,IACgD,EAAvD1B,GAAmBZ,QAAQkF,IAC3BA,GAA2BrO,EAC3Bb,EAGJ0I,GAAKyG,OAASf,GAAeV,GAAgB1N,GAAYyN,GAEzDpG,EAAWD,GAAeC,EAAU,CAClCsC,KAAMxJ,EACNyJ,KAAMlB,GAAKkB,OAGb,IAAIwF,EAAsB,WACxBhO,EAA2BrB,EAnGZ,SACjBqO,EACAiB,EACA5B,EACApG,GAEI+G,GAAa5B,GAAY,GAAK/D,GAAQoD,QAAS9L,GAC/C2L,KAAoBjD,GAAQoD,QAAU3F,MAE1C,IAAIoJ,EAAchG,GAAkBqE,KAEpCrF,GAAS,CACPmE,GAAIhE,GAAQoD,QACZlC,KAAMxJ,EACNmM,UAAW+C,GAAoB5B,EAAWnB,GAAW,KACrDiD,MAAO7H,GAAe2H,GAEtBhI,SAAU5F,EAAU4F,KAGtBmG,GAAmBlB,GACnBA,GAAWgD,EAEX3M,IA6EE6M,CACEpB,EACAA,GAAeV,KAAkB9H,GAAsB,KACvD6H,GACApG,IAIJ,GAAKjG,EAmBHgO,SAjBA,IACMlN,GAAU6E,GAAW7E,EAAOuN,sBAC9BvN,EACGuN,qBAAqB,CAACjN,EAAcC,IACpCiN,KAAK,SAAUC,GACdlH,GAAQmH,QAAUD,EAAkBnN,GACpCiG,GAAQoH,WAAaF,EAAkBlN,GACvC2M,MAEDU,SAAMV,GAETA,IAEF,MAAOW,GACPX,OAWFY,GAAMxQ,EAAOyQ,QACbC,GAAeF,GAAMA,GAAIG,UAAYtQ,EACrCuQ,GAAM5Q,EAAO6Q,cACbC,GAAgB,YAIhB9F,IAAe0F,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiBrG,GAoBA2G,IAlBrB,WACL,IAEIxG,EAFA3E,EAAM9B,UACNoN,EAAKD,GAAK/M,MAAMiN,KAAMvL,GAY1B,OAVI4B,GAAWwJ,OACbzG,EAAQ,IAAIyG,MAAM5G,KAIlBG,EAAQ/I,EAAI4P,YAAY,UAClBC,UAAUjH,GAAM5J,EAASA,GAEjC+J,EAAMzG,UAAY8B,EAClBiL,GAAItG,GACG2G,IAMX9O,EACE2O,GACA,WACEnC,GAAS,IAEXnO,GAGF2B,EACE,WACA,WACEwM,GAAS,IAEXnO,IAKAwK,IAAuB,QAARH,IAAkB,iBAAkB7K,GACrDmC,EACE,aACA,WACEwM,GAAS,IAEXnO,GAIAwK,GAAa2D,KAEf3O,EAAOqR,YAAc,SAAUjH,EAAMvC,GACnC8G,GAAS,EAAGvE,EAAMvC,IAQtB,IAAIyJ,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUjH,EAAOzC,EAAU2J,IACpCA,GAAejK,GAAWM,KAAW2J,EAAc3J,GAExD,IAAI4J,EAAkBlK,GAAW+C,GAC7BvB,EAAWxB,GAAWiK,GAAeA,EAAc,aACnDE,SAAmBpH,EAEvB,GAAIgH,GAAW9G,QAAQkH,GAAa,IAAMD,EAExC,OADAvN,EAAe+G,GAAmBrK,EAAY,aAAe8Q,GACtD3I,IAGT,IACE,GAAI0I,EAAiB,CACnB,IAAIE,EAAcrH,IAClB,GAAIgH,GAAW9G,eAAemH,GAAe,EAK3C,OAJAzN,EACE+G,GACAX,EAAQ,uBAAyBqH,GAE5B5I,IAETuB,EAAQqH,GAEV,MAAOvN,IAEP,OADAF,EAAe+G,GAAmB7G,IAC3B2E,IAGTuB,GAAS,GAAKA,GAAO1F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAIgN,EAAc,CAAEzH,KAAMvJ,EAAW0J,MAAOA,GACxCuH,GAAa3D,IAAiB/K,EAAQ,EAE1C0E,EAAWD,GAAeC,EAAU+J,GAEhCtH,GACFxB,GACErD,EAAOmM,EAAa,CAClB3E,GAAIvG,KACJqJ,MAAO7H,IAAgB2J,GACvB/E,UACG+E,GAAa5D,KAAa7H,GAAsB,KAC7C4H,GACA,KAENnG,SAAU5F,EAAU4F,KAEtBkB,IAKF+I,GAAmB,SAAUxH,EAAOzC,EAAUkB,GAChDwI,GAAUjH,EAAOzC,EAAUkB,IAIxB/I,EAAOiL,MACVjL,EAAOiL,IAAqB6G,IAE9B,IAAIC,GAAY/R,EAAOiL,IAGnB+G,GAAQD,IAAaA,GAAUE,EAAIF,GAAUE,EAAI,GAMrD,IAAK,IAAI3H,MAHTtK,EAAOiL,IAAqB6G,GAGVE,GACZ3N,EAAQ2N,GAAO1H,MACjBpF,MAAMC,QAAQ6M,GAAM1H,KAChBiH,GAAUtN,MAAM,KAAM+N,GAAM1H,KAC5BiH,GAAUS,GAAM1H,MAGxB,MAAOiG,IACPpQ,EAAUoQ,IA7IY,IAAUpG,GACxB6G,GAvkBkBjG,GA7M9B,CAm6BE/K,OACA,uBACA"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js index 7337cf3..20bf335 100644 --- a/dist/latest/custom/light.js +++ b/dist/latest/custom/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 8ca6; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; a797; v11) */ -!function(u,e,t,l){try{var i=undefined,n="https:",r=u.console,a="doNotTrack",d=u.navigator,c=u.location,m=c.host,f=u.document,o=d.userAgent,s="Not sending request ",g=!1,p=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=u.addEventListener,_="https://"+t,w=(f.documentElement,"language"),b=d.userAgentData,O="platform",S="platformVersion",E="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=f.currentScript||f.querySelector('script[src*="'+t+'"]');l=function(){var e=[].slice.call(arguments);e.unshift("Simple Analytics: "),Function.prototype.bind.call(r.warn,r).apply(r,e)};var A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},D="namespace",I=e[D]||A(x,D)||"sa",N=e.strictUtm||"true"==A(x,"strict-utm"),R=I+"_loaded";if(1==u[R])return l(s+"twice");u.sa_event_loaded=!0,u[R]=!0;var U,V=function(t,e,n){t=n?t:$(H,F,t),d.brave&&!n&&(t.brave=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return p(e)+"="+p(t[e])}).join("&")+"&time="+Date.now()},k=e.hostname||A(x,"hostname"),B=k||m,C={version:"custom_light_10",hostname:B};e.mode||A(x,"mode");try{U=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(P){l(P)}j&&(C.bot=!0);var H=$(C,{ua:o,https:c.protocol==n,timezone:U,page_id:q(),session_id:q()});if(H.sri=!1,b&&(H.mobile=b.mobile,H.brands=v(b.brands)),B!==m&&(H.hostname_original=m),a in d&&"1"==d[a])return l("Not sending request when "+a+" is enabled. See "+E+"/dnt");-1!=m.indexOf(".")&&!/^[0-9.:]+$/.test(m)||k||l("Set hostname on "+m+". See "+E+"/overwrite-domain-name");var T,F={},z=(f.referrer||"").replace(m,B).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,J=function(e,t){var n=$(C,{type:"append",original_id:t?e:H.page_id});t||!d.sendBeacon?V(n,0,!0):d.sendBeacon(_+"/append",v(n))};y("pagehide",J,!1);var L=function(e){var t="";try{t=e||h(c.pathname)}catch(P){l(P)}return t},M=function(e,t,n,r){e&&J(""+H.page_id,!0),H.page_id=q();var a,o=B+L();V({id:H.page_id,type:"pageview",referrer:!t||n?z:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(N?"":"?")+"(source|medium|content|term|campaign)"+(N?"":"|ref")+")=").test(e)}).join("&")||i)}),z=o};!function(e,t){var n=L(t);if(n&&T!=n){T=n,F.path=n,d[w]&&(F[w]=d[w]);var r,a=u.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(P){l(P)}var i=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),c=!!z&&f.referrer.split("/")[2]==m,s=function(){g=!0,M(e,e||i||!1,c)};if(g)s();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){H.os_name=e[O],H.os_version=e[S],s()})["catch"](s):s()}catch(p){s()}}}()}catch(Z){l(Z)}}(window,{},""); +!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://"+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||x(E,I)||"sa",R=e.strictUtm||"true"==x(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(F,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||x(E,"hostname"),H=C||d,T={version:"custom_light_11",hostname:H};e.mode||x(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(T.bot=!0);var F=A(T,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(F.sri=!1,b&&(F.mobile=b.mobile,F.brands=v(b.brands)),H!==d&&(F.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(T,{type:"append",original_id:t?e:F.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+F.page_id,!0),F.page_id=D();var a,o=H+G();B({id:F.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){F.os_name=e[O],F.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},""); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map index dabd50d..b68cba9 100644 --- a/dist/latest/custom/light.js.map +++ b/dist/latest/custom/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\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.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(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 // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, window.sa_settings);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var 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 sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_10\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","Image","src","keys","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","sameSite","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"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 ef3c1c9..3c4bf08 100644 --- a/dist/latest/custom/proxy.js +++ b/dist/latest/custom/proxy.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; a174; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 9b4d; v11) */ -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",x=m,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,A=f.addEventListener,q="https://"+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,H="offset"+D,P="client"+D,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=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)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=f[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=f[Et];if(!tt(n))return t;try{return Y(t,n.call(f,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(f[ct]==d)return h(w+"twice");f.sa_event_loaded=d,f[ct]=d;var st=function(e,t,n){e=n?e:Y(At,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=q+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"custom_proxy_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,h(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},A(o,function(t){t.filename&&-1"); +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",x=d,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.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(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Et.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_proxy_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); //# 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 13e52fb..88f1671 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 isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\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.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(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 // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, window.sa_settings);\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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // 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 // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 var 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 = doc.referrer.split(slash)[2];\n var 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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\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_10\",\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","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\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 return (\n (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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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_11\",\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","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","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","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","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js index bf2173b..289727a 100644 --- a/dist/latest/hello.js +++ b/dist/latest/hello.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 68b2) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; f60b) */ -!function(h,t,e,n,f){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=h.console,u="doNotTrack",v=h.navigator,l=h.location,y=l.host,_=h.document,p=v.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,q=h.addEventListener,A="https://queue."+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,R="offset"+D,H="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=h.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');f=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){f("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=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)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=h[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=h[Ot];if(!tt(n))return t;try{return Y(t,n.call(h,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(h[ct]==d)return f(w+"twice");h.sa_event_loaded=d,h[ct]=d;var st=function(e,t,n){e=n?e:Y(qt,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=A+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"cdn_hello_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,f(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},q(o,function(t){t.filename&&-1>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)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_hello_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // 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 // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 var 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 = doc.referrer.split(slash)[2];\n var 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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\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_10\",\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","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\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 return (\n (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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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_11\",\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","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","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","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","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"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 730ec53..a2127a9 100644 --- a/dist/latest/latest.dev.js +++ b/dist/latest/latest.dev.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; c427; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; ed1a; v11) */ /* eslint-env browser */ (function ( @@ -59,10 +59,12 @@ var platformText = "platform"; var platformVersionText = "platformVersion"; var docsUrl = "https://docs.simpleanalytics.com"; + var pages = 0; var isBotAgent = /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); var screen = window.screen; + // Find the script element where options can be set on var scriptElement = doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); @@ -77,12 +79,11 @@ var args = [].slice.call(arguments); // 2. Prepend log prefix - args.unshift("Simple Analytics: "); + args.unshift("Simple Analytics:"); // 3. Pass along arguments to console.warn - // Function.prototype.bind.call is needed for Internet Explorer - var log = Function.prototype.bind.call(con.warn, con); - log.apply(con, args); + // Function.prototype.apply.call is needed for Internet Explorer + return Function.prototype.apply.call(con.warn, con, args); }; var warnInFunction = function (name, error) { @@ -133,8 +134,13 @@ return to; }; + var settings = window.sa_settings; + var logSettings = settings || Object.keys(overwriteOptions).length; + // Merge overwriteOptions with sa_settings - overwriteOptions = assign(overwriteOptions, window.sa_settings); + overwriteOptions = assign(overwriteOptions, settings); + + if (logSettings) warn("Settings", overwriteOptions); // Customers can skip data points var ignoreMetrics = convertCommaSeparatedToArray( @@ -280,6 +286,7 @@ data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; + if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar; data.dev = trueVar; @@ -433,7 +440,8 @@ window.phantom || window.__polypane || window._bot || - isBotAgent; + isBotAgent || + Math.random() == Math.random(); // t = timeonpage, scro = scrolled var collectDataOnLeave = @@ -503,12 +511,17 @@ var page = {}; var lastSendPath; + var getReferrer = function () { + return ( + (doc.referrer || "") + .replace(locationHostname, definedHostname) + .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") + .replace(/^([^/]+)$/, "$1") || undefinedVar + ); + }; + // We don't want to end up with sensitive data so we clean the referrer URL - var referrer = - (doc.referrer || "") - .replace(locationHostname, definedHostname) - .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") - .replace(/^([^/]+)$/, "$1") || undefinedVar; + var referrer = getReferrer(); ///////////////////// // TIME ON PAGE AND SCROLLED LOGIC @@ -631,6 +644,8 @@ return path; }; + var previousReferrer; + // Send page view and append data to it var sendPageView = function ( isPushState, @@ -652,9 +667,14 @@ metadata: stringify(metadata), }); + previousReferrer = referrer; referrer = currentPage; + + pages++; }; + var sameSite, userNavigated; + var pageview = function (isPushState, pathOverwrite, metadata) { // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -700,7 +720,7 @@ warn(error); } - var userNavigated = performaceEntryType + userNavigated = performaceEntryType ? ["reload", "back_forward"].indexOf(performaceEntryType) > -1 : // Check if back, forward or reload buttons are being use in older browsers // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD @@ -709,8 +729,10 @@ [1, 2].indexOf(perf[navigationText].type) > -1; // Check if referrer is the same as current real hostname (not the defined hostname!) - var currentReferrerHostname = doc.referrer.split(slash)[2]; - var sameSite = referrer + var currentReferrerHostname = referrer + ? referrer.split(slash)[0] + : undefinedVar; + sameSite = referrer ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 || currentReferrerHostname == locationHostname : falseVar; @@ -863,13 +885,19 @@ event = ("" + event).replace(/[^a-z0-9]+/gi, "_").replace(/(^_|_$)/g, ""); var eventParams = { type: eventText, event: event }; + var firstPage = !userNavigated && pages < 2; metadata = appendMetadata(metadata, eventParams); if (event) { sendData( assign(eventParams, { - query: getQueryParams(), + id: uuid(), + query: getQueryParams(!firstPage), + referrer: + (firstPage || sameSite) && collectMetricByString("r") + ? previousReferrer + : null, metadata: stringify(metadata), }), @@ -910,6 +938,6 @@ {}, "simpleanalyticscdn.com", "queue.", - "cdn_latest_dev_10", + "cdn_latest_dev_11", "sa" ); diff --git a/dist/latest/latest.js b/dist/latest/latest.js index fbec0c5..15d59a3 100644 --- a/dist/latest/latest.js +++ b/dist/latest/latest.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 44e6; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; f270; v11) */ -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,q=f.addEventListener,A="https://queue."+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,R="offset"+D,H="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=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)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=f[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=f[Ot];if(!tt(n))return t;try{return Y(t,n.call(f,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(f[ct]==d)return h(w+"twice");f.sa_event_loaded=d,f[ct]=d;var st=function(e,t,n){e=n?e:Y(qt,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=A+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"cdn_latest_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,h(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},q(o,function(t){t.filename&&-1>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)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // 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 // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 var 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 = doc.referrer.split(slash)[2];\n var 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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\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_10\",\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","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\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 return (\n (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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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_11\",\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","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","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","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","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js index 27078d4..1e53911 100644 --- a/dist/latest/light.js +++ b/dist/latest/light.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; f5a1; v10) */ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; c569; v11) */ -!function(u,e,t,l){try{var i=undefined,n="https:",r=u.console,a="doNotTrack",d=u.navigator,c=u.location,m=c.host,f=u.document,o=d.userAgent,s="Not sending request ",g=!1,p=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=u.addEventListener,_="https://queue."+t,w=(f.documentElement,"language"),b=d.userAgentData,O="platform",S="platformVersion",E="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),q=f.currentScript||f.querySelector('script[src*="'+t+'"]');l=function(){var e=[].slice.call(arguments);e.unshift("Simple Analytics: "),Function.prototype.bind.call(r.warn,r).apply(r,e)};var A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},D="namespace",I=e[D]||A(q,D)||"sa",N=e.strictUtm||"true"==A(q,"strict-utm"),R=I+"_loaded";if(1==u[R])return l(s+"twice");u.sa_event_loaded=!0,u[R]=!0;var U,V=function(t,e,n){t=n?t:$(T,H,t),d.brave&&!n&&(t.brave=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return p(e)+"="+p(t[e])}).join("&")+"&time="+Date.now()},k=e.hostname||A(q,"hostname"),B=k||m,C={version:"cdn_light_10",hostname:B};e.mode||A(q,"mode");try{U=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(P){l(P)}j&&(C.bot=!0);var T=$(C,{ua:o,https:c.protocol==n,timezone:U,page_id:x(),session_id:x()});if(T.sri=!1,b&&(T.mobile=b.mobile,T.brands=v(b.brands)),B!==m&&(T.hostname_original=m),a in d&&"1"==d[a])return l("Not sending request when "+a+" is enabled. See "+E+"/dnt");-1!=m.indexOf(".")&&!/^[0-9.:]+$/.test(m)||k||l("Set hostname on "+m+". See "+E+"/overwrite-domain-name");var F,H={},z=(f.referrer||"").replace(m,B).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,J=function(e,t){var n=$(C,{type:"append",original_id:t?e:T.page_id});t||!d.sendBeacon?V(n,0,!0):d.sendBeacon(_+"/append",v(n))};y("pagehide",J,!1);var L=function(e){var t="";try{t=e||h(c.pathname)}catch(P){l(P)}return t},M=function(e,t,n,r){e&&J(""+T.page_id,!0),T.page_id=x();var a,o=B+L();V({id:T.page_id,type:"pageview",referrer:!t||n?z:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(N?"":"?")+"(source|medium|content|term|campaign)"+(N?"":"|ref")+")=").test(e)}).join("&")||i)}),z=o};!function(e,t){var n=L(t);if(n&&F!=n){F=n,H.path=n,d[w]&&(H[w]=d[w]);var r,a=u.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(P){l(P)}var i=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),c=!!z&&f.referrer.split("/")[2]==m,s=function(){g=!0,M(e,e||i||!1,c)};if(g)s();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){T.os_name=e[O],T.os_version=e[S],s()})["catch"](s):s()}catch(p){s()}}}()}catch(Z){l(Z)}}(window,{},"simpleanalyticscdn.com"); +!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://queue."+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||q(E,I)||"sa",R=e.strictUtm||"true"==q(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(H,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||q(E,"hostname"),T=C||d,F={version:"cdn_light_11",hostname:T};e.mode||q(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(F.bot=!0);var H=A(F,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(H.sri=!1,b&&(H.mobile=b.mobile,H.brands=v(b.brands)),T!==d&&(H.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(F,{type:"append",original_id:t?e:H.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+H.page_id,!0),H.page_id=D();var a,o=T+G();B({id:H.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){H.os_name=e[O],H.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},"simpleanalyticscdn.com"); //# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/light.js.map b/dist/latest/light.js.map index b4e9853..9d7d455 100644 --- a/dist/latest/light.js.map +++ b/dist/latest/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\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.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(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 // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, window.sa_settings);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var 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 sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_10\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","Image","src","keys","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","sameSite","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAAaC,iBAA0B5B,EAEvC6B,GADkBf,EAAIgB,gBACX,YAIXC,EAASvB,EAAIwB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EACF,sBAAsBC,KAAKrB,KAAe,WAAWqB,KAAKrB,GAGxDsB,EACFxB,EAAIyB,eAAiBzB,EAAI0B,cAAc,gBAAkBxC,EAAU,MAOrEC,EAAO,WAEL,IAAIwC,EAAO,GAAGC,MAAMC,KAAKC,WAGzBH,EAAKI,QAAQ,sBAIHC,SAASC,UAAUC,KAAKL,KAAKtC,EAAIJ,KAAMI,GAC7C4C,MAAM5C,EAAKoC,IAGjB,IAgBIS,EAAO,SAAUZ,EAAea,GAClC,OAAOb,GAAiBA,EAAcc,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMd,UACDe,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOhB,UAAUkB,eAAetB,KAAKW,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAIT1D,EAAmBsD,EAAOtD,EAAkBD,EAAOoE,aAOzCC,KAAKC,IAJf,IAMIC,EAAO,WACT,IAAIC,EAAexE,EAAOyE,QAAUzE,EAAO0E,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAUpBK,EAAgB,YAChBC,EACFtF,EAAiBqF,IACjBlC,EAAKZ,EAAe8C,IA6WxB,KAnWME,EACFvF,EAAiBuF,WAhKJ,QAiKbpC,EAAKZ,EAAe,cAiClBiD,EAAiBF,EAAY,UACjC,GArMc,GAqMVvF,EAAOyF,GAA4B,OAAOtF,EAAKgB,EAAa,SAChEnB,EAAO0F,iBAtMO,EAuMd1F,EAAOyF,IAvMO,EA8Md,IA2DIE,EA3DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAOtC,EAAOyC,EAASC,EAAMJ,GAE/CnF,EAAIwF,QAAUH,IAAcF,EAAKK,OAjNzB,IAoNA,IAAIC,OACVC,IACJvE,EACA,eACAoC,OAAOoC,KAAKR,GACTS,OAAO,SAAUC,GAChB,OAAOV,EAAKU,IAAQnG,IAErBoG,IAAI,SAAUD,GACb,OACElF,EAAuBkF,GACvB,IACAlF,EAAuBwE,EAAKU,MAG/BE,KAAK,KACR,SACApC,KAAKC,OAILoC,EACFzG,EAAiB0G,UAAYvD,EAAKZ,EAAe,YAC/CoE,EAAkBF,GAAuB5F,EAEzC+F,EAAc,CAChBC,QAqRJ,eApRIH,SAAUC,GAeD3G,EAAiB8G,MAAQ3D,EAAKZ,EAAe,QAYxD,IAEEmD,EACIqB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOjC,GACP/E,EAAK+E,GAOG5C,IAMDuE,EAAYO,KA7RP,GA+Rd,IAAIpB,EAAUzC,EAAOsD,EAAa,CAEhCQ,GAAkCnG,EAElCZ,MAAOM,EAAIkB,UAAYxB,EACvBqF,SAAUA,EACV2B,QAA8B/C,IAG9BgD,WAA0ChD,MAwB5C,GArBAyB,EAAQwB,KA1SO,EA8SXvF,IACF+D,EAAQyB,OAASxF,EAAOwF,OACxBzB,EAAQ0B,OAASjG,EAAUQ,EAAOyF,SAWhCd,IAAoB9F,IACtBkF,EAAQ2B,kBAAoB7G,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EAjTYgB,4BAkTAV,EAAa,oBAAsB4B,EAAU,SAK7B,GAAlCvB,EAAiB8G,QAAQ,OACxB,aAAarF,KAAKzB,IACnB4F,GAEDvG,EACE,mBACEW,EACA,SACAuB,EACA,0BAON,IACIwF,EADA5B,EAAO,GAIP6B,GACD9G,EAAI8G,UAAY,IACdjD,QAAQ/D,EAAkB8F,GAC1B/B,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASzE,EAS/B2H,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAAS3E,EAAOsD,EAAa,CAC/BsB,KAAM,SACNC,YAAaH,EAAOD,EAAKhC,EAAQsB,UAK/BW,IAASvH,EAAI2H,WAEfzC,EAASsC,EAAQ9H,GApXP,GAsXVM,EAAI2H,WAAWxG,EAAa,UAAWJ,EAAUyG,KAKrDvG,EAzVe,WAyVgBoG,GA1XhB,GAiYf,IAAIO,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAahH,EAAuBX,EAAI6H,UAC/C,MAAOvD,GACP/E,EAAK+E,GAMP,OAAOsD,GAILE,EAAe,SACjBC,EACAC,EACAC,EACAC,GAEIH,GAAaZ,EAAY,GAAK/B,EAAQsB,SA1Z9B,GA2ZYtB,EAAQsB,QAAU/C,IAE1C,IAxP6BwE,EAwPzBC,EAAcpC,EAAkB0B,IAEpC1C,EAAS,CACPoC,GAAIhC,EAAQsB,QACZa,KA7Ze,WA8ZfL,UAAWc,GAAoBC,EAAWf,EAAW,KACrDmB,OA9P2BF,EA8PLH,EA5PtBhI,EAAIsI,OACDtG,MAAM,GACNuG,MAAM,KACN7C,OAAO,SAAU8C,GAGhB,OAFaL,GAYN,IAAIM,OART,YACC7D,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,MAIuBjD,KAAK6G,KAE/B3C,KAAK,MAAQrG,KA8OlB0H,EAAWkB,IAGE,SAAUL,EAAaW,GAEpC,IAAId,EAAOF,EAAQgB,GAGnB,GAAKd,GAAQX,GAAgBW,EAA7B,CAEAX,EAAeW,EACfvC,EAAKuC,KAAOA,EAKN9H,EAAIqB,KAAWkE,EAAKlE,GAAYrB,EAAIqB,IAK1C,IAIIwH,EAJAC,EAAOxJ,EAAOyJ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGvB,KAC/D,MAAOjD,GACP/E,EAAK+E,GAGP,IAAI0E,EAAgBL,GAC2C,EAA3D,CAAC,SAAU,gBAAgB3B,QAAQ2B,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG9B,QAAQ4B,EAAKE,GAAgBvB,MAGpCU,IAAWf,GACX9G,EAAI8G,SAASqB,MA3cP,KA2coB,IAAMrI,EAKhC+I,EAAsB,WACxBzI,GAvdU,EAwdVsH,EACEC,EACAA,GAAeiB,IAAiB,EAChCf,IAKJ,GAAKzH,EAmBHyI,SAjBA,IACM5H,GAnVc,mBAmVOA,EAAO6H,qBAC9B7H,EACG6H,qBAAqB,CAAC3H,EAAcC,IACpC2H,KAAK,SAAUC,GACdhE,EAAQiE,QAAUD,EAAkB7H,GACpC6D,EAAQkE,WAAaF,EAAkB5H,GACvCyH,MAEDM,SAAMN,GAETA,IAEF,MAAOO,GACPP,MASNQ,GAEA,MAAOD,GACPjK,EAAKiK,IA/gBT,CAkhBEpK,OACA,uBACA"} \ No newline at end of file +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v10/v10.js b/dist/v10/v10.js new file mode 100644 index 0000000..9ee4fe2 --- /dev/null +++ b/dist/v10/v10.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 73b3; SRI-version; v10) */ + +!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,q=f.addEventListener,A="https://queue."+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,R="offset"+D,H="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=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)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=f[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=f[Ot];if(!tt(n))return t;try{return Y(t,n.call(f,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(f[ct]==d)return h(w+"twice");f.sa_event_loaded=d,f[ct]=d;var st=function(e,t,n){e=n?e:Y(qt,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=A+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"cdn_latest_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,h(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},q(o,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // 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 // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 var 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 = doc.referrer.split(slash)[2];\n var 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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\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_10\",\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","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/app.js b/dist/v11/app.js new file mode 100644 index 0000000..ebeba2c --- /dev/null +++ b/dist/v11/app.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 10ee; SRI-version; v11) */ + +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://queue."+e,q=y.documentElement||{},A="language",$="Height",j="scroll",D=g.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(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\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 return (\n (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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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_11\",\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","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","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","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","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"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,IAO/CG,EAAc,SAAUC,GAC1B,OAAOA,EAAKC,QAAQ,sBAAuB,SAGzCC,EAAO,SAAUtB,EAAeuB,GAClC,OAAOvB,GAAiBA,EAAcwB,aAAa,QAAUD,IAG3DE,EAA+B,SAAUC,GAC3C,OAAOC,MAAMC,QAAQF,GACjBA,EAboB,iBAcXA,GAAQA,EAAIG,OACrBH,EAAII,MAAM,OACV,IAGFC,EAAW,SAAUC,GACvB,OAAOA,GAAUA,EAAOC,cAAgBhB,QAGtCiB,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAM9B,UACD+B,EAAQ,EAAGA,EAAQD,EAAIP,OAAQQ,IAAS,CAC/C,IAAIC,EAAaF,EAAIC,GACrB,GAAIN,EAASO,GACX,IAAK,IAAIC,KAAWD,EACdxB,EAAQwB,EAAYC,KACtBJ,EAAGI,GAAWD,EAAWC,IAKjC,OAAOJ,GAGLK,EAAWhG,EAAOiG,YAClBC,EAAcF,GAAYvB,OAAO0B,KAAKlG,GAAkBoF,OAG5DpF,EAAmByF,EAAOzF,EAAkB+F,GAExCE,GAAa9F,EAAK,WAAYH,GAGlC,IAAImG,EAAgBnB,EAClBhF,EAAiBmG,eAAiBtB,EAAKtB,EAAe,mBAGpD6C,GAAwB,SAAUC,GAEpC,OAGgB,IAFdF,EAAcG,OAAO,SAAU3B,GAC7B,OAAO,IAAI4B,OAAO,IAAMF,GAAoBhD,KAAKsB,KAChDS,QAIHoB,GAAMC,KAAKD,IAEXE,GAAO,WACT,IAAIC,EAAe5G,EAAO6G,QAAU7G,EAAO8G,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUlC,QAAQmC,EAAW,SAAUC,GAC5C,OACEA,EACCL,EAAaM,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAO/C,GACP,OAAO0C,EAAUlC,QAAQmC,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,GACF1H,EAAiByH,KACjB5C,EAAKtB,EAAekE,KA6uBxB,KA1uBME,GAAiB5H,EAAO2H,GAAY,aACpCE,GAAiB,SAAUC,EAAUC,GACnCxC,EAASqC,MAAiBE,EAAWpC,EAAOoC,EAAUF,KAC1D,IAAII,EAA4BhI,EAAOiI,IACvC,IAAKT,GAAWQ,GAA4B,OAAOF,EACnD,IACE,OAAOpC,EACLoC,EACAE,EAA0BnE,KAAK7D,EAAQ0F,EAAOoC,EAAUC,KAE1D,MAAO1D,GACPF,EAAe,WAAYE,KAU3B6D,GACFjI,EAAiBiI,WACjBpD,EAAKtB,EAAe,eAAiB/C,EAEnC0H,GAAiB,SAAUC,GAC7B,OACEjH,EAAIkH,OACDzE,MAAM,GACN0B,MAAM,KACNiB,OAAO,SAAU+B,GAChB,IAAIC,EAASH,IAAiB/B,GAAsB,MAEhDmC,EAAkBC,GAAYC,IAAI/D,GAAagE,KAAK,KACpDC,EAAQL,EACR,KAAOC,EAAkB,KACzB,YACCN,GAAY,GAAK,KAClB,yCACCA,GAAY,GAAK,QAClB,IACAM,EACA,KACJ,OAAID,IAAWE,GAAYpD,OAAe7E,EAInC,IAAIgG,OAAOoC,GAAOtF,KAAKgF,KAE/BK,KAAK,MAAQtI,GAgChBwI,GAAiBlB,GAAY,UACjC,GAAI3H,EAAO6I,KAAmBtI,EAAS,OAAOH,EAAKsB,EAAa,SAChE1B,EAAO8I,gBAAkBvI,EACzBP,EAAO6I,IAAkBtI,EAOzB,IAAIwI,GAAW,SAAUhB,EAAMiB,EAAUC,GACvClB,EAAOkB,EAAelB,EAAOrC,EAAOwD,GAASC,GAAMpB,GAE/C9G,EAAImI,QAAUH,IAAclB,EAAKqB,MAAQ7I,GACzCU,EAAIoI,qBAAuBJ,IAAclB,EAAKuB,KAAO/I,GAGzD,IAAIgJ,EAAQ,IAAIC,MACZR,IACFO,EAAME,QAAUT,EAChBO,EAAMG,OAASV,GAEjBO,EAAMI,IACJtH,EACA,eACAoC,OAAO0B,KAAK4B,GACTxB,OAAO,SAAUqD,GAChB,OAAO7B,EAAK6B,IAAQvJ,IAErBqI,IAAI,SAAUkB,GACb,OACE/H,EAAuB+H,GACvB,IACA/H,EAAuBkG,EAAK6B,MAG/BjB,KAAK,KACR,SACAjC,KAAKD,OAILoD,GACF5J,EAAiB6J,UAAYhF,EAAKtB,EAAe,YAC/CuG,GAAkBF,IAAuBxI,EAEzC2I,GAAc,CAChBC,QAymBJ,gBAxmBIH,SAAUC,IASZ5J,EAAY,SAAU+J,GACpBA,EAAiBA,EAAeC,MAC5BD,EAAiB,IAAMA,EAAeC,MACtCD,EACJ9J,EAAK8J,GACLnB,GACErD,EAAOsE,GAAa,CAClBI,KAAMvJ,EACNwD,MAAO6F,EACPG,KAAMlJ,EAAImJ,WAEZjK,EACAE,IAMJ4B,EACEtB,EACA,SAAU0J,GACJA,EAAMC,WAA+C,EAAnCD,EAAMC,SAASC,QAAQvK,IAC3CC,EAAUoK,EAAMG,UAGpBlK,GAOF,IAwDImK,GAxDAC,GAAQnE,KAERoE,GAAW,EAOXC,GAAO7K,EAAiB6K,MAAQhG,EAAKtB,EAAe,QAGpDuH,MAvKsBC,GAuKC/K,EAAiB8K,cAtKvBC,GAuKjB/K,EAAiB8K,WACjBjG,EAAKtB,EAAe,eAAiB/C,GACrCqE,EAAKtB,EAAe,aAAe/C,GACnCqE,EAAKtB,EAAe,gBAAkB/C,EAGtCwK,KACqC,SAAvCnG,EAAKtB,EAAe,iBACpBvD,EAAiBgL,cAAgBzK,GAI/B0K,GACFjL,EAAiBkL,UACjBrG,EAAKtB,EAAe,cACpBmE,GAAY,IAAM/G,EAGhBwK,GAAcnG,EAChBhF,EAAiBmL,aAAetG,EAAKtB,EAAe,iBAIlDiF,GAAcxD,EAChBhF,EAAiBwI,aAAe3D,EAAKtB,EAAe,iBAIlD6H,GAAqBpG,EACvBhF,EAAiBoL,oBACfvG,EAAKtB,EAAe,yBAIpB8H,GACFrL,EAAiBqL,gBAAkBxG,EAAKtB,EAAe,mBAGrDyE,GACFhI,EAAiBgI,mBACjBnD,EAAKtB,EAAe,sBAItB,IAEEmH,GAAWtE,GAAsB,KAC7BkF,KAAKC,iBAAiBC,kBAAkBC,SACxCrL,EACJ,MAAOgE,IACPjE,EAAKiE,IAOP,IAAIsH,GACF1K,EAAI2K,WACJ5L,EAAO6L,aACP7L,EAAO8L,aACP9L,EAAO+L,UACP/L,EAAOgM,SACPhM,EAAOiM,YACPjM,EAAOkM,MACP7I,GACAiE,KAAKC,UAAYD,KAAKC,SAGpB4E,GACF9F,GAAsB,MAAQA,GAAsB,QAElDsF,KAAK3B,GAAY2B,IAAMpL,GAE3B,IAAI2I,GAAUxD,EAAOsE,GAAa,CAEhCoC,GAAI/F,GAAsB,MAAQ5E,EAAYpB,EAE9CK,MAAOS,EAAImB,UAAY5B,EACvBiK,SAAUA,GACV0B,QAASF,GAAqBxF,KAAStG,EAGvCiM,WAAYjG,GAAsB,MAAQM,KAAStG,IA0BrD,GAvBA6I,GAAQqD,IAAMhM,EAIVoC,IACFuG,GAAQsD,OAAS7J,EAAO6J,OACxBtD,GAAQuD,OAASxK,EAAUU,EAAO8J,SAS/BlL,EAAImL,SAAStM,EAAK,4CAInB2J,KAAoB1I,IACtB6H,GAAQyD,kBAAoBtL,IAGzB0J,IAAc/J,KAAcC,GAA0B,KAAnBA,EAAID,GAC1C,OAAOZ,EACLuB,EAAiBX,EAAa,oBAAsBmC,EAAU,SAK7B,GAAlC9B,EAAiBoJ,QAAQ,OACxB,aAAanH,KAAKjC,IACnBwI,IAEDzJ,EACE,mBACEiB,EACA,SACA8B,EACA,0BAON,IACIyJ,GAiDAC,GAlDA1D,GAAO,GAaP2D,IARCvL,EAAIuL,UAAY,IACdjI,QAAQxD,EAAkB0I,IAC1BlF,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASxE,EAYjC0M,GAAW,EAEXC,GAAc,SAAUC,EAAIC,GAC9B,IAEIC,EAFChB,KAEDgB,EAASzH,EAAOsE,GAAa,CAC/BI,KAAM,SACNgD,YAAaF,EAAOD,EAAK/D,GAAQmD,UAI/BhG,GAAsB,OACxB8G,EAAOE,SAAW/F,KAAKgG,OAAO7G,KAAQmE,GAAQmC,IAhfnC,MAkfbA,GAAW,EACXnC,GAAQnE,KAGJJ,GAAsB,UACxB8G,EAAOtC,SAAWvD,KAAKiG,IAAI,EAAG1C,GAAU2C,OAGtCN,IAASjM,EAAIwM,WAEf1E,GAASoE,EAAQ9M,EAAcE,GAE/BU,EAAIwM,WAAWpL,EAAa,UAAWJ,EAAUkL,MAKrDhL,EACE,mBACA,WACMZ,EAAImM,QACA,KAAO1K,KAAYhD,GAASgN,KAClCH,GAAcpG,MACTsG,IAAYtG,KAAQoG,IAE7BrM,GAGF2B,EAAqBa,EAAUgK,GAAaxM,GAE5C,IAAImN,GAAOpM,EAAIoM,MAAQ,GACnBH,GAAW,WACb,IACE,IAAII,EAAuBrL,EAAgBQ,IAAiB,EACxD8K,EAASvG,KAAKiG,IAChBI,GAAK9K,IAAiB,EACtB8K,GAAK7K,IAAiB,EACtBP,EAAgBQ,IAAiB,EACjCR,EAAgBM,IAAiB,EACjCN,EAAgBO,IAAiB,GAEnC,OAAOwE,KAAKwG,IACV,IAKI,EAJJxG,KAAKgG,MACF,MAAQ/K,EAAgBwL,WAAa,GAAKH,GACzCC,EACA,IAGN,MAAOxJ,IAEP,OADAjE,EAAKiE,IACE,IAIXlC,EAAqB,OAAQ,WAC3B0I,GAAW2C,KACXrL,EACEO,EACA,WACMmI,GAAW2C,OAAY3C,GAAW2C,OAExChN,KAQJ,IAgCIwN,GA6BAC,GAAUC,GA7DVC,GAAU,SAAUC,GACtB,IAAI/D,EAAO,GAIX,IACEA,EAAO+D,GAAarM,EAAuBZ,EAAImJ,UAC/C,MAAOjG,IACPjE,EAAKiE,IAGP,IAAIgK,EAAyBrO,EAAOsL,IACpC,GAAI9D,GAAW6G,GACb,IACEhE,EAAOgE,EAAuBxK,KAAK7D,EAAQ,CAAEqK,KAAMA,KAAWA,EAC9D,MAAOhG,IACPF,EAAe,OAAQE,IAK3B,IAlYiB,SAAUgG,GAC3B,IAAK,IAAIiE,KAAKlD,GAAa,CACzB,IAAImD,EAAgBnD,GAAYkD,GAChC,GAAKC,EAAL,CAGA,IAAIC,EAhOI,KAiOND,EAAc,GAAcA,EAjOtB,IAiO8CA,EAEtD,GACEC,IAAenE,GACf,IAAI7D,OACF,IAAM7B,EAAY6J,GAAY3J,QAAQ,SAAU,QAAU,IAC1D,KACAvB,KAAK+G,GAEP,OAAO9J,GAEX,OAAOC,EAgXHiO,CAAapE,GAQjB,MAFY,QAARS,IAAkB3J,EAAIuN,OAAMrE,GAAQlJ,EAAIuN,KAAKpJ,MAAM,KAAK,IAErD+E,EAPLjK,EAAKuB,EAAiB,YAAc0I,IAyCpCsE,GAAW,SAAUC,EAAaC,EAAe/G,GAEnD,IAAIuC,EAAO8D,GAAQU,GAGnB,GAAKxE,GAAQuC,IAAgBvC,EAA7B,CAEAuC,GAAevC,EACflB,GAAKkB,KAAOA,EAGRhE,GAAsB,OACxB8C,GAAK2F,eACHxH,KAAKiG,IAAIhL,EAA2B,aAAK,EAAGvC,EAAO+O,YAAc,IACjE,KACF5F,GAAK6F,gBACH1H,KAAKiG,IACHhL,EAAgBQ,IAAiB,EACjC/C,EAAOiP,aAAe,IACnB,MAIL5I,GAAsB,MACpBpF,EAAIuB,KAAW2G,GAAK3G,GAAYvB,EAAIuB,IAItCe,GAAU8C,GAAsB,QAClC8C,GAAK+F,aAAe3L,EAAO4L,MAC3BhG,GAAKiG,cAAgB7L,EAAOsK,QAI9B,IAIIwB,EAJAC,EAAOtP,EAAOuP,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGpF,KAC/D,MAAO/F,IACPjE,EAAKiE,IAGP6J,GAAgBmB,GAC+C,EAA3D,CAAC,SAAU,gBAAgB5E,QAAQ4E,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG/E,QAAQ6E,EAAKE,GAAgBpF,MAGxC,IAAIsF,EAA0B5C,GAC1BA,GAASxH,MA7rBH,KA6rBgB,GACtBjF,EACJ4N,GAAWnB,IACgD,EAAvDzB,GAAmBZ,QAAQiF,IAC3BA,GAA2BrO,EAC3Bb,EAGJ2I,GAAKwG,OAASf,GAAeV,GAAgB1N,GAAYyN,GAEzDnG,EAAWD,GAAeC,EAAU,CAClCsC,KAAMzJ,EACN0J,KAAMlB,GAAKkB,OAGb,IAAIuF,EAAsB,WACxBhO,EAA2BrB,EAnGZ,SACjBqO,EACAiB,EACA5B,EACAnG,GAEI8G,GAAa5B,GAAY,GAAK9D,GAAQmD,QAAS9L,GAC/C4L,KAAoBjD,GAAQmD,QAAU1F,MAE1C,IAAImJ,EAAc/F,GAAkBoE,KAEpCpF,GAAS,CACPkE,GAAI/D,GAAQmD,QACZjC,KAAMzJ,EACNmM,UAAW+C,GAAoB5B,EAAWnB,GAAW,KACrDiD,MAAO5H,GAAe0H,GAEtB/H,SAAU7F,EAAU6F,KAGtBkG,GAAmBlB,GACnBA,GAAWgD,EAEX1M,IA6EE4M,CACEpB,EACAA,GAAeV,KAAkB7H,GAAsB,KACvD4H,GACAnG,IAIJ,GAAKlG,EAmBHgO,SAjBA,IACMjN,GAAU6E,GAAW7E,EAAOsN,sBAC9BtN,EACGsN,qBAAqB,CAAChN,EAAcC,IACpCgN,KAAK,SAAUC,GACdjH,GAAQkH,QAAUD,EAAkBlN,GACpCiG,GAAQmH,WAAaF,EAAkBjN,GACvC0M,MAEDU,SAAMV,GAETA,IAEF,MAAOW,GACPX,OAWFY,GAAMxQ,EAAOyQ,QACbC,GAAeF,GAAMA,GAAIG,UAAYtQ,EACrCuQ,GAAM5Q,EAAO6Q,cACbC,GAAgB,YAIhB7F,IAAeyF,IAAgBK,OAASH,KAqB1CJ,GAAIG,WAnBEK,GAAOR,GADiBpG,GAoBA0G,IAlBrB,WACL,IAEIvG,EAFA3E,EAAM9B,UACNmN,EAAKD,GAAK9M,MAAMgN,KAAMtL,GAY1B,OAVI4B,GAAWuJ,OACbxG,EAAQ,IAAIwG,MAAM3G,KAIlBG,EAAQhJ,EAAI4P,YAAY,UAClBC,UAAUhH,GAAM7J,EAASA,GAEjCgK,EAAMzG,UAAY8B,EAClBgL,GAAIrG,GACG0G,IAMX9O,EACE2O,GACA,WACEnC,GAAS,IAEXnO,GAGF2B,EACE,WACA,WACEwM,GAAS,IAEXnO,IAKAyK,IAAuB,QAARH,IAAkB,iBAAkB9K,GACrDmC,EACE,aACA,WACEwM,GAAS,IAEXnO,GAIAyK,GAAa0D,KAEf3O,EAAOqR,YAAc,SAAUhH,EAAMvC,GACnC6G,GAAS,EAAGtE,EAAMvC,IAQtB,IAAIwJ,GAAa,CAAC,SAAU,UAExBC,GAAY,SAAUhH,EAAOzC,EAAU0J,IACpCA,GAAehK,GAAWM,KAAW0J,EAAc1J,GAExD,IAAI2J,EAAkBjK,GAAW+C,GAC7BvB,EAAWxB,GAAWgK,GAAeA,EAAc,aACnDE,SAAmBnH,EAEvB,GAAI+G,GAAW7G,QAAQiH,GAAa,IAAMD,EAExC,OADAtN,EAAe+G,GAAmBtK,EAAY,aAAe8Q,GACtD1I,IAGT,IACE,GAAIyI,EAAiB,CACnB,IAAIE,EAAcpH,IAClB,GAAI+G,GAAW7G,eAAekH,GAAe,EAK3C,OAJAxN,EACE+G,GACAX,EAAQ,uBAAyBoH,GAE5B3I,IAETuB,EAAQoH,GAEV,MAAOtN,IAEP,OADAF,EAAe+G,GAAmB7G,IAC3B2E,IAGTuB,GAAS,GAAKA,GAAO1F,QAAQ,eAAgB,KAAKA,QAAQ,WAAY,IAEtE,IAAI+M,EAAc,CAAExH,KAAMxJ,EAAW2J,MAAOA,GACxCsH,GAAa3D,IAAiB9K,EAAQ,EAE1C0E,EAAWD,GAAeC,EAAU8J,GAEhCrH,GACFxB,GACErD,EAAOkM,EAAa,CAClB3E,GAAItG,KACJoJ,MAAO5H,IAAgB0J,GACvB/E,UACG+E,GAAa5D,KAAa5H,GAAsB,KAC7C2H,GACA,KAENlG,SAAU7F,EAAU6F,KAEtBkB,IAKF8I,GAAmB,SAAUvH,EAAOzC,EAAUkB,GAChDuI,GAAUhH,EAAOzC,EAAUkB,IAIxBhJ,EAAOkL,MACVlL,EAAOkL,IAAqB4G,IAE9B,IAAIC,GAAY/R,EAAOkL,IAGnB8G,GAAQD,IAAaA,GAAUE,EAAIF,GAAUE,EAAI,GAMrD,IAAK,IAAI1H,MAHTvK,EAAOkL,IAAqB4G,GAGVE,GACZ1N,EAAQ0N,GAAOzH,MACjBpF,MAAMC,QAAQ4M,GAAMzH,KAChBgH,GAAUrN,MAAM,KAAM8N,GAAMzH,KAC5BgH,GAAUS,GAAMzH,MAGxB,MAAOgG,IACPpQ,EAAUoQ,IA7IY,IAAUnG,GACxB4G,GAvkBkBhG,GA7M9B,CAm6BEhL,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v11/auto-events.js b/dist/v11/auto-events.js new file mode 100644 index 0000000..3f5ff6e --- /dev/null +++ b/dist/v11/auto-events.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 19c1; SRI-version; v11) */ + +function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(t){saAutomatedLink(t.target,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function (element) {\n saAutomatedLink(element.target, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","element","saAutomatedLink","target","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/app.js b/dist/v11/custom/app.js new file mode 100644 index 0000000..cd85c13 --- /dev/null +++ b/dist/v11/custom/app.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 120c; SRI-version; v11) */ + +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.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(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_app_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); +//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v11/custom/app.js.map b/dist/v11/custom/app.js.map new file mode 100644 index 0000000..9bc6a22 --- /dev/null +++ b/dist/v11/custom/app.js.map @@ -0,0 +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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\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 return (\n (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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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_11\",\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","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","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","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","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/auto-events.js b/dist/v11/custom/auto-events.js new file mode 100644 index 0000000..3f5ff6e --- /dev/null +++ b/dist/v11/custom/auto-events.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 19c1; SRI-version; v11) */ + +function r(t,e){var a,o=!1;h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":h.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(t){saAutomatedLink(t.target,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function (element) {\n saAutomatedLink(element.target, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","element","saAutomatedLink","target","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/light.js b/dist/v11/custom/light.js new file mode 100644 index 0000000..bc77d99 --- /dev/null +++ b/dist/v11/custom/light.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; e624; SRI-version; v11) */ + +!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://"+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||x(E,I)||"sa",R=e.strictUtm||"true"==x(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(F,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||x(E,"hostname"),H=C||d,T={version:"custom_light_11",hostname:H};e.mode||x(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(T.bot=!0);var F=A(T,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(F.sri=!0,b&&(F.mobile=b.mobile,F.brands=v(b.brands)),H!==d&&(F.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(T,{type:"append",original_id:t?e:F.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+F.page_id,!0),F.page_id=D();var a,o=H+G();B({id:F.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){F.os_name=e[O],F.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},""); +//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v11/custom/light.js.map b/dist/v11/custom/light.js.map new file mode 100644 index 0000000..1820aeb --- /dev/null +++ b/dist/v11/custom/light.js.map @@ -0,0 +1 @@ +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/proxy.js b/dist/v11/custom/proxy.js new file mode 100644 index 0000000..1fd4bf8 --- /dev/null +++ b/dist/v11/custom/proxy.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; 0989; SRI-version; v11) */ + +!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",x=d,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.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(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Et.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_proxy_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); +//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v11/custom/proxy.js.map b/dist/v11/custom/proxy.js.map new file mode 100644 index 0000000..f6f5a90 --- /dev/null +++ b/dist/v11/custom/proxy.js.map @@ -0,0 +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 metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\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 getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\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).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\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 bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\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 return (\n (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 nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\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 metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\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 = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\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 else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\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_11\",\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","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","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","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","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/light.js b/dist/v11/light.js new file mode 100644 index 0000000..f63624b --- /dev/null +++ b/dist/v11/light.js @@ -0,0 +1,4 @@ +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2023-05-03; e23d; SRI-version; v11) */ + +!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://queue."+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||q(E,I)||"sa",R=e.strictUtm||"true"==q(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(H,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||q(E,"hostname"),T=C||d,F={version:"cdn_light_11",hostname:T};e.mode||q(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(F.bot=!0);var H=A(F,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(H.sri=!0,b&&(H.mobile=b.mobile,H.brands=v(b.brands)),T!==d&&(H.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(F,{type:"append",original_id:t?e:H.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+H.page_id,!0),H.page_id=D();var a,o=T+G();B({id:H.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){H.os_name=e[O],H.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},"simpleanalyticscdn.com"); +//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v11/light.js.map b/dist/v11/light.js.map new file mode 100644 index 0000000..fca4099 --- /dev/null +++ b/dist/v11/light.js.map @@ -0,0 +1 @@ +{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/src/auto-events.js b/src/auto-events.js index c41176e..0df0361 100644 --- a/src/auto-events.js +++ b/src/auto-events.js @@ -87,31 +87,39 @@ if (window[saGlobal] && window[saGlobal + "_loaded"]) { var hostname = element.hostname; var pathname = element.pathname; + + var event; + var metadata = { + title: element.getAttribute("title") || undefined, + }; + var url = element.href || undefined; + var useTitle = false; if (optionsLink.title && element.hasAttribute("title")) { var theTitle = element.getAttribute("title").trim(); if (theTitle != "") useTitle = true; } - var event; - if (useTitle) { event = theTitle; } else { switch (type) { case "outbound": { event = hostname + (optionsLink.outboundFullUrl ? pathname : ""); + metadata.url = url; break; } case "download": { event = optionsLink.downloadsFullUrl ? hostname + pathname : pathname.split("/").pop(); + metadata.url = url; break; } case "email": { var href = element.getAttribute("href"); event = (href.split(":")[1] || "").split("?")[0]; + metadata.email = event; break; } } @@ -122,11 +130,13 @@ "_" + event.replace(/[^a-z0-9]+/gi, "_").replace(/(^_+|_+$)/g, ""); - window[saGlobal](clean, callback); + window[saGlobal](clean, metadata, callback); log("collected " + clean); - return window.setTimeout(callback, 5000); + return type === "email" + ? callback() + : window.setTimeout(callback, 5000); } else { log(saGlobal + " is not defined", "warn"); return callback(); @@ -176,8 +186,8 @@ link.setAttribute("onclick", onClickAttribute); } else { - link.on("click", function () { - saAutomatedLink(collect); + link.addEventListener("click", function (element) { + saAutomatedLink(element.target, collect); }); } } @@ -189,12 +199,13 @@ // Loop over all links on the page for (var i = 0; i < a.length; i++) { var link = a[i]; + var href = link.getAttribute("href"); // Skip links that don't have an href - if (!link.getAttribute("href")) continue; + if (!href) continue; // We don't want to overwrite website behaviour so we check for the onclick attribute - if (!link.getAttribute("onclick")) { + if (!link.getAttribute("onclick") && !/^mailto:/.test(href)) { collectLink(link, true); } else { collectLink(link, false); diff --git a/src/default.js b/src/default.js index 7ef3a91..dfeccbd 100644 --- a/src/default.js +++ b/src/default.js @@ -60,12 +60,18 @@ var platformText = "platform"; var platformVersionText = "platformVersion"; var docsUrl = "https://docs.simpleanalytics.com"; + var pages = 0; var isBotAgent = /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); /** if screen **/ var screen = window.screen; /** endif **/ + /** if skipnonwindow **/ + // Skip server side rendered pages on Cloudflare + if (typeof window == "" + undefinedVar) return; + /** endif **/ + // Find the script element where options can be set on var scriptElement = doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); @@ -80,12 +86,11 @@ var args = [].slice.call(arguments); // 2. Prepend log prefix - args.unshift("Simple Analytics: "); + args.unshift("Simple Analytics:"); // 3. Pass along arguments to console.warn - // Function.prototype.bind.call is needed for Internet Explorer - var log = Function.prototype.bind.call(con.warn, con); - log.apply(con, args); + // Function.prototype.apply.call is needed for Internet Explorer + return Function.prototype.apply.call(con.warn, con, args); }; var warnInFunction = function (name, error) { @@ -136,8 +141,13 @@ return to; }; + var settings = window.sa_settings; + var logSettings = settings || Object.keys(overwriteOptions).length; + // Merge overwriteOptions with sa_settings - overwriteOptions = assign(overwriteOptions, window.sa_settings); + overwriteOptions = assign(overwriteOptions, settings); + + if (logSettings) warn("Settings", overwriteOptions); /** if ignoremetrics **/ // Customers can skip data points @@ -303,6 +313,7 @@ data = onlyThisData ? data : assign(payload, page, data); if (nav.brave && !onlyThisData) data.brave = trueVar; + if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar; /** if dev **/ data.dev = trueVar; @@ -483,7 +494,8 @@ window.phantom || window.__polypane || window._bot || - isBotAgent; + isBotAgent || + Math.random() == Math.random(); /** else **/ var bot = isBotAgent; /** endif **/ @@ -571,12 +583,17 @@ var page = {}; var lastSendPath; + var getReferrer = function () { + return ( + (doc.referrer || "") + .replace(locationHostname, definedHostname) + .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") + .replace(/^([^/]+)$/, "$1") || undefinedVar + ); + }; + // We don't want to end up with sensitive data so we clean the referrer URL - var referrer = - (doc.referrer || "") - .replace(locationHostname, definedHostname) - .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") - .replace(/^([^/]+)$/, "$1") || undefinedVar; + var referrer = getReferrer(); ///////////////////// // TIME ON PAGE AND SCROLLED LOGIC @@ -713,6 +730,8 @@ return path; }; + var previousReferrer; + // Send page view and append data to it var sendPageView = function ( isPushState, @@ -736,9 +755,14 @@ /** endif **/ }); + previousReferrer = referrer; referrer = currentPage; + + pages++; }; + var sameSite, userNavigated; + var pageview = function (isPushState, pathOverwrite, metadata) { // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -788,7 +812,7 @@ warn(error); } - var userNavigated = performaceEntryType + userNavigated = performaceEntryType ? ["reload", "back_forward"].indexOf(performaceEntryType) > -1 : // Check if back, forward or reload buttons are being use in older browsers // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD @@ -798,14 +822,16 @@ // Check if referrer is the same as current real hostname (not the defined hostname!) /** if nonuniquehostnames **/ - var currentReferrerHostname = doc.referrer.split(slash)[2]; - var sameSite = referrer + var currentReferrerHostname = referrer + ? referrer.split(slash)[0] + : undefinedVar; + sameSite = referrer ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 || currentReferrerHostname == locationHostname : falseVar; /** else **/ - var sameSite = referrer - ? doc.referrer.split(slash)[2] == locationHostname + sameSite = referrer + ? referrer.split(slash)[0] == locationHostname : falseVar; /** endif **/ @@ -976,6 +1002,7 @@ event = ("" + event).replace(/[^a-z0-9]+/gi, "_").replace(/(^_|_$)/g, ""); var eventParams = { type: eventText, event: event }; + var firstPage = !userNavigated && pages < 2; /** if metadata **/ metadata = appendMetadata(metadata, eventParams); @@ -984,7 +1011,12 @@ if (event) { sendData( assign(eventParams, { - query: getQueryParams(), + id: uuid(), + query: getQueryParams(!firstPage), + referrer: + (firstPage || sameSite) && collectMetricByString("r") + ? previousReferrer + : null, /** if metadata **/ metadata: stringify(metadata), diff --git a/src/embed.js b/src/embed.js deleted file mode 100644 index a5f4b7a..0000000 --- a/src/embed.js +++ /dev/null @@ -1,50 +0,0 @@ -(function (document) { - NodeList.prototype.forEach = Array.prototype.forEach; - - document.addEventListener("DOMContentLoaded", function () { - var counter = 1; - document.querySelectorAll("[data-sa-graph-url]").forEach(function (graph) { - var url = graph.getAttribute("data-sa-graph-url"); - var append = url.indexOf("?") > -1 ? "&" : "?"; - var iframe = document.createElement("iframe"); - iframe.setAttribute( - "src", - url + append + "embed=true&graph_id=" + counter - ); - iframe.setAttribute("id", "sa-graph-" + counter); - iframe.setAttribute("scrolling", "no"); - iframe.style.width = "100%"; - iframe.style.border = "none"; - graph.innerHTML = iframe.outerHTML; - counter = counter + 1; - }); - - window.onresize = function () { - document - .querySelectorAll("[data-sa-graph-url] iframe") - .forEach(function (iframe) { - iframe.contentWindow.postMessage("true", "*"); - }); - }; - - window.addEventListener("message", function (event) { - if (typeof event.data !== "object") { - return; - } else if (event.data.type === "resize") { - document.getElementById("sa-graph-" + event.data.id).height = - event.data.height + "px"; - } else if (event.data.type === "pageviews") { - var graph = document.getElementById("sa-graph-" + event.data.id); - var selector = graph.parentNode.getAttribute( - "data-sa-page-views-selector" - ); - if (selector) - document - .querySelectorAll(selector) - .forEach(function (pageViewsElement) { - pageViewsElement.textContent = event.data.pageviews; - }); - } - }); - }); -})(document); diff --git a/test/helpers/server.js b/test/helpers/server.js index 0c757e5..18ef4df 100644 --- a/test/helpers/server.js +++ b/test/helpers/server.js @@ -119,6 +119,8 @@ const route = async (req, res) => { script: script || "", beacon: beacon || "", push: push || "", + os: os || "", + browser: browser || "", }).toString(); onload = `window.location.href = "/href?${params}"`; } diff --git a/test/index.js b/test/index.js index c73479b..8bafc94 100644 --- a/test/index.js +++ b/test/index.js @@ -246,6 +246,7 @@ const getDeviceName = ({ browser.supportsPushState = getSupportsPushState(browser); browser.supportsClientHints = getSupportsClientHints(browser); browser.useLocalIp = browser.os === "ios"; + browser["browserstack.consoleLogs"] = "verbose"; return browser; }; @@ -327,60 +328,80 @@ const getDeviceName = ({ // Empty global REQUESTS global.REQUESTS = []; - await navigate({ - ...browser, - commands, - driver, - }); + let errorMessage = null; - // console.log(JSON.stringify(global.REQUESTS, null, 2)); + try { + await navigate({ + ...browser, + commands, + driver, + }); - if (browser.supportsSendBeacon) { - log("Testing beacon"); - await require("./test-beacon")(browser); - } else if (browser.supportsPushState) { - log("Testing one beacon"); - await require("./test-one-beacon")(browser); - } + // console.log(JSON.stringify(global.REQUESTS, null, 2)); - if (browser.supportsPushState) { - log("Testing push state"); - await require("./test-pushstate")(browser); - } else { - log("Testing no push state"); - await require("./test-no-pushstate")(browser); - } + if (browser.supportsSendBeacon) { + log("Testing beacon"); + await require("./test-beacon")(browser); + } else if (browser.supportsPushState) { + log("Testing one beacon"); + await require("./test-one-beacon")(browser); + } - if (browser.supportsClientHints) { - log("We can't test client hints because they only work on https"); - } + if (browser.supportsPushState) { + log("Testing push state"); + await require("./test-pushstate")(browser); + } else { + log("Testing no push state"); + await require("./test-no-pushstate")(browser); + } - log("Testing events"); + if (browser.supportsClientHints) { + log("We can't test client hints because they only work on https"); + } - // Empty global REQUESTS - global.REQUESTS = []; + log("Testing events"); + + // Empty global REQUESTS + global.REQUESTS = []; - commands = [ - { script: "/latest/hello.js", event: "-- event 123 &&" }, - { wait: "/simple.gif", params: { body: { type: "event" } } }, - { script: "/latest/hello.js", event: "function" }, - { script: "/latest/hello.js", event: "metadata" }, - { - wait: "/simple.gif", - params: { body: { type: "event" } }, - amount: 3, - }, - ]; - - await navigate({ - ...browser, - commands, - driver, - }); - - await require("./test-events")(browser); - - if (driver) await driver.quit(); + commands = [ + { script: "/latest/hello.js", event: "-- event 123 &&" }, + { wait: "/simple.gif", params: { body: { type: "event" } } }, + { script: "/latest/hello.js", event: "function" }, + { script: "/latest/hello.js", event: "metadata" }, + { + wait: "/simple.gif", + params: { body: { type: "event" } }, + amount: 3, + }, + ]; + + await navigate({ + ...browser, + commands, + driver, + }); + + await require("./test-events")(browser); + } catch (error) { + errorMessage = error.message; + throw error; + } finally { + // if (!driver) return; + // try { + // const reason = errorMessage?.replace(/"/g, "'") || ""; + // driver.executeScript( + // `browserstack_executor: {"action": "setSessionStatus", "arguments": {"status":"${ + // errorMessage ? "failed" : "passed" + // }","reason": "${reason}"}}` + // ); + // const sessionId = await driver.getSession(); + // console.log({ sessionId: sessionId?.id_ }); + // if (sessionId?.id_) await driver.quit(); + // } catch (error) { + // // Don't log when driver.quit() fails + // } + } }; for (const [index, browser] of browsers.entries()) { diff --git a/test/test-events.js b/test/test-events.js index 956eed0..04e633d 100644 --- a/test/test-events.js +++ b/test/test-events.js @@ -42,8 +42,14 @@ module.exports = async ({ os, browser }) => { "page_id", "session_id", "type", + "id", ]); + expect( + UUIDvalidate(request.body.id, 4), + "event id should be a valid UUIDv4" + ).to.be.true; + expect( UUIDvalidate(request.body.session_id, 4), "session_id should be a valid UUIDv4" diff --git a/test/test-pushstate.js b/test/test-pushstate.js index 8a9edc5..bd3781b 100644 --- a/test/test-pushstate.js +++ b/test/test-pushstate.js @@ -1,6 +1,5 @@ const { expect } = require("chai"); const UUIDvalidate = require("uuid-validate"); -const { CI } = require("./constants"); const { getRequests } = require("./helpers"); module.exports = async () => { @@ -31,6 +30,9 @@ module.exports = async () => { "project=project_x" ); + // Seconds page referrer should be the first page (ending with /) + expect(pageViewRequests[1].body.referrer).to.be.a("string").and.match(/\/$/i); + pageViewRequests.map((request) => { expect( request,