(function () { 'use strict'; function n$2(t,e,l,n,r){for(e=e.split?e.split("."):e,n=0;n1&&(m(t,c.map(function(e){return e.replace(/[?[\]\\ ]/g,"")}),t[u]),delete t[u]);}return t}(function(r){if(r){var t=r.match(/\?(.*)/);return t&&t[1]?t[1].split("#")[0]:""}return $$1&&window.location.search.substring(1)}(r))}function m(e,r,t){for(var n=r.length-1,o=0;o>4;}return e} var l="global",o=j$1+"global"+j$1,n=typeof self===o$1&&self.self===self&&self||typeof global===o$1&&global.global===global&&global||void 0;function a$2(t){return n[o][t]}function f(t,e){return n[o][t]=e}function i$2(t){delete n[o][t];}function u$1(t,e,r){var l;try{if(b$2(t)){var o=window[t];l=o[e].bind(o);}}catch(t){}return l||r}n[o]||(n[o]={});var c$1={};function b$2(t){if(typeof c$1[t]!==e)return c$1[t];try{var e$1=window[t];e$1.setItem(e,e),e$1.removeItem(e);}catch(e){return c$1[t]=!1}return c$1[t]=!0} function g$1(){return g$1=Object.assign||function(e){for(var t=1;t1;return !1===i$1&&(d?f(e,t):a$2(e)),d?document.cookie=e+"="+encodeURIComponent(t)+(r?"; expires="+new Date(+new Date+1e3*r).toUTCString()+(c?"; path="+c:"")+(u?"; domain="+u:"")+(a?"; secure":""):""):decodeURIComponent((("; "+document.cookie).split("; "+e+"=")[1]||"").split(";")[0])}} var r="localStorage",g=b$2.bind(null,"localStorage");u$1("localStorage","getItem",a$2);u$1("localStorage","setItem",f);u$1("localStorage","removeItem",i$2); var a="sessionStorage",i=b$2.bind(null,"sessionStorage");u$1("sessionStorage","getItem",a$2);u$1("sessionStorage","setItem",f);u$1("sessionStorage","removeItem",i$2); function I(t){var o=t;try{if("true"===(o=JSON.parse(t)))return !0;if("false"===o)return !1;if(on(o))return o;parseFloat(o)===o&&(o=parseFloat(o));}catch(t){}if(null!==o&&""!==o)return o}var k=g(),O=i(),x=a$1();function C(o,e){if(o){var r=A(e),a=!N(r),i=d(r)?I(localStorage.getItem(o)):void 0;if(a&&!I$2(i))return i;var n=h(r)?I(r$1(o)):void 0;if(a&&n)return n;var l=E(r)?I(sessionStorage.getItem(o)):void 0;if(a&&l)return l;var u=a$2(o);return a?u:{localStorage:i,sessionStorage:l,cookie:n,global:u}}}function L(r$2,a$1,l$1){if(r$2&&!I$2(a$1)){var u={},g=A(l$1),m=JSON.stringify(a$1),S=!N(g);return d(g)&&(u[r]=F(r,a$1,I(localStorage.getItem(r$2))),localStorage.setItem(r$2,m),S)?u[r]:h(g)&&(u[t]=F(t,a$1,I(r$1(r$2))),c(r$2,m),S)?u[t]:E(g)&&(u[a]=F(a,a$1,I(sessionStorage.getItem(r$2))),sessionStorage.setItem(r$2,m),S)?u[a]:(u[l]=F(l,a$1,a$2(r$2)),f(r$2,a$1),S?u[l]:u)}}function b(t$1,e){if(t$1){var a$1=A(e),s=C(t$1,m$1),n={};return !I$2(s.localStorage)&&d(a$1)&&(localStorage.removeItem(t$1),n[r]=s.localStorage),!I$2(s.cookie)&&h(a$1)&&(u(t$1),n[t]=s.cookie),!I$2(s.sessionStorage)&&E(a$1)&&(sessionStorage.removeItem(t$1),n[a]=s.sessionStorage),!I$2(s.global)&&G(a$1,l)&&(i$2(t$1),n[l]=s.global),n}}function A(t){return t?q$1(t)?t:t.storage:b$3}function d(t){return k&&G(t,r)}function h(t$1){return x&&G(t$1,t)}function E(t){return O&&G(t,a)}function N(t){return t===m$1||"all"===t}function G(t,o){return t===b$3||t===o||N(t)}function F(t,o,e){return {location:t,current:o,previous:e}}var J={setItem:L,getItem:C,removeItem:b}; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function analyticsLib() { var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var defaultSettings = { storage: J }; return je(_objectSpread2(_objectSpread2({}, defaultSettings), opts)); } function findScript(src) { const scripts = Array.prototype.slice.call(window.document.querySelectorAll("script")); return scripts.find(s => s.src === src); } function loadScript(src, attributes) { const found = findScript(src); if (found !== undefined) { const status = found === null || found === void 0 ? void 0 : found.getAttribute("status"); if (status === "loaded") { return Promise.resolve(found); } if (status === "loading") { return new Promise((resolve, reject) => { found.addEventListener("load", () => resolve(found)); found.addEventListener("error", err => reject(err)); }); } } return new Promise((resolve, reject) => { var _a; const script = window.document.createElement("script"); script.type = "text/javascript"; script.src = src; script.async = true; script.setAttribute("status", "loading"); for (const [k, v] of Object.entries(attributes !== null && attributes !== void 0 ? attributes : {})) { script.setAttribute(k, v); } script.onload = () => { script.onerror = script.onload = null; script.setAttribute("status", "loaded"); resolve(script); }; script.onerror = () => { script.onerror = script.onload = null; script.setAttribute("status", "error"); reject(new Error(`Failed to load ${src}`)); }; const tag = window.document.getElementsByTagName("script")[0]; (_a = tag.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(script, tag); }); } var __awaiter$4 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; const tagPlugin = { id: "tag", handle(config, payload) { return __awaiter$4(this, void 0, void 0, function* () { if (!applyFilters(payload, config)) { return; } insertTags(config.code, payload); }); }, }; function insertTags(code, event, opts = {}) { let tag; try { tag = JSON.parse(code); } catch (e) { tag = { code, lang: "javascript" }; } const debug = opts.debug || false; if (isInBrowser()) { if (tag.lang === "javascript") { execJs(tag.code, event); } else { const codeHolder = document.createElement("span"); codeHolder.innerHTML = replaceMacro(tag.code, event); document.body.insertAdjacentElement("beforeend", codeHolder); const scripts = codeHolder.querySelectorAll("script"); scripts.forEach(script => { const scriptClone = document.createElement("script"); scriptClone.type = scriptClone.type || "text/javascript"; if (script.hasAttribute("src")) { scriptClone.src = script.src; } scriptClone.text = script.text; if (debug) { console.log(`[JITSU] Executing script${script.hasAttribute("src") ? ` ${script.src}` : ""}`, scriptClone.text); } document.head.appendChild(scriptClone); document.head.removeChild(scriptClone); }); } } else { if (debug) { console.log(`[JITSU] insertTags(): cannot insert tags in non-browser environment`); } } } function execJs(code, event) { const varName = `jitsu_event_${randomId()}`; window[varName] = event; const iif = `(function(){ const event = ${varName}; ${code} })()`; try { eval(iif); } catch (e) { console.error(`[JITSU] Error executing JS code: ${e.message}. Code: `, iif); } finally { delete window[varName]; } return iif; } function replaceMacro(code, event) { return code.replace(/{{\s*event\s*}}/g, JSON.stringify(event)); } var __awaiter$3 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; const logrocketPlugin = { id: "logrocket", handle(config, payload) { return __awaiter$3(this, void 0, void 0, function* () { if (!applyFilters(payload, config)) { return; } initLogrocketIfNeeded(config.appId); const action = logRocket => { if (payload.type === "identify" && payload.userId) { logRocket.identify(payload.userId, payload.traits || {}); } }; getLogRocketQueue().push(action); if (getLogRocketState() === "loaded") { flushLogRocketQueue(window["LogRocket"]); } }); }, }; function getLogRocketState() { return window["__jitsuLrState"] || "fresh"; } function setLogRocketState(s) { window["__jitsuLrState"] = s; } function getLogRocketQueue() { return window["__jitsuLrQueue"] || (window["__jitsuLrQueue"] = []); } function flushLogRocketQueue(lr) { const queue = getLogRocketQueue(); while (queue.length > 0) { const method = queue.shift(); try { const res = method(lr); if (res) { res.catch(e => console.warn(`Async LogRocket method failed: ${e.message}`, e)); } } catch (e) { console.warn(`LogRocket method failed: ${e.message}`, e); } } } function initLogrocketIfNeeded(appId) { return __awaiter$3(this, void 0, void 0, function* () { if (getLogRocketState() !== "fresh") { return; } setLogRocketState("loading"); loadScript(`https://cdn.lr-ingest.io/LogRocket.min.js`, { crossOrigin: "anonymous" }) .then(() => { if (window["LogRocket"]) { try { window["LogRocket"].init(appId); } catch (e) { console.warn(`LogRocket (id=${appId}) init failed: ${e.message}`, e); setLogRocketState("failed"); } setLogRocketState("loaded"); flushLogRocketQueue(window["LogRocket"]); } }) .catch(e => { console.warn(`LogRocket (id=${appId}) init failed: ${e.message}`, e); setLogRocketState("failed"); }); }); } var __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; const defaultScriptSrc$1 = "https://www.googletagmanager.com/gtag/js"; const gtmPlugin = { id: "gtm", handle(config, payload) { var _a, _b; return __awaiter$2(this, void 0, void 0, function* () { if (!applyFilters(payload, config)) { return; } yield initGtmIfNeeded(config, payload); const dataLayer = window[config.dataLayerName || "dataLayer"]; const ids = Object.assign(Object.assign({}, (payload.userId ? { user_id: payload.userId, userId: payload.userId } : {})), (payload.anonymousId ? { anonymousId: payload.anonymousId } : {})); switch (payload.type) { case "page": const { properties: pageProperties, context } = payload; const pageEvent = Object.assign({ event: "page_view", page_location: pageProperties.url, page_title: pageProperties.title, page_path: pageProperties.path, page_hash: pageProperties.hash, page_search: pageProperties.search, page_referrer: (_b = (_a = context === null || context === void 0 ? void 0 : context.page) === null || _a === void 0 ? void 0 : _a.referrer) !== null && _b !== void 0 ? _b : "" }, ids); dataLayer.push(pageEvent); break; case "track": const { properties: trackProperties } = payload; const trackEvent = Object.assign(Object.assign({ event: payload.event }, trackProperties), ids); dataLayer.push(trackEvent); break; case "identify": const { traits } = payload; const identifyEvent = Object.assign(Object.assign({ event: "identify" }, traits), ids); dataLayer.push(identifyEvent); break; } dataLayer.push(function () { this.reset(); }); }); }, }; function getGtmState() { return window["__jitsuGtmState"] || "fresh"; } function setGtmState(s) { window["__jitsuGtmState"] = s; } function initGtmIfNeeded(config, payload) { return __awaiter$2(this, void 0, void 0, function* () { if (getGtmState() !== "fresh") { return; } setGtmState("loading"); const dlName = config.dataLayerName || "dataLayer"; const dlParam = dlName !== "dataLayer" ? "&l=" + dlName : ""; const previewParams = config.preview ? `>m_preview=${config.preview}>m_auth=${config.auth}>m_cookies_win=x` : ""; const tagId = config.containerId; const scriptSrc = `${config.customScriptSrc || defaultScriptSrc$1}?id=${tagId}${dlParam}${previewParams}`; window[dlName] = window[dlName] || []; const gtag = function () { window[dlName].push(arguments); }; window[dlName].push({ user_id: payload.userId, }); // @ts-ignore gtag("js", new Date()); // @ts-ignore gtag("config", tagId); loadScript(scriptSrc) .then(() => { setGtmState("loaded"); }) .catch(e => { console.warn(`GTM (containerId=${tagId}) init failed: ${e.message}`, e); setGtmState("failed"); }); }); } var __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; const defaultScriptSrc = "https://www.googletagmanager.com/gtag/js"; const ga4Plugin = { id: "ga4-tag", handle(config, payload) { var _a, _b; return __awaiter$1(this, void 0, void 0, function* () { if (!applyFilters(payload, config)) { return; } yield initGa4IfNeeded(config, payload); const dataLayer = window[config.dataLayerName || "dataLayer"]; const gtag = function () { dataLayer.push(arguments); }; const ids = Object.assign(Object.assign({}, (payload.userId ? { user_id: payload.userId, userId: payload.userId } : {})), (payload.anonymousId ? { anonymousId: payload.anonymousId } : {})); if (payload.userId) { // @ts-ignore gtag("set", { user_id: payload.userId }); } switch (payload.type) { case "page": if (config.autoPageView) { console.log("autoPageView"); break; } const { properties: pageProperties, context } = payload; const pageEvent = Object.assign({ page_location: pageProperties.url, page_title: pageProperties.title, page_path: pageProperties.path, page_hash: pageProperties.hash, page_search: pageProperties.search, page_referrer: (_b = (_a = context === null || context === void 0 ? void 0 : context.page) === null || _a === void 0 ? void 0 : _a.referrer) !== null && _b !== void 0 ? _b : "" }, ids); // @ts-ignore gtag("event", "page_view", pageEvent); break; case "track": const { properties: trackProperties } = payload; const trackEvent = Object.assign(Object.assign({}, trackProperties), ids); // @ts-ignore gtag("event", payload.event, trackEvent); break; case "identify": const { traits } = payload; const identifyEvent = Object.assign(Object.assign({}, traits), ids); // @ts-ignore gtag("event", "identify", identifyEvent); break; } }); }, }; function getGa4State() { return window["__jitsuGa4State"] || "fresh"; } function setGa4State(s) { window["__jitsuGa4State"] = s; } function initGa4IfNeeded(config, payload) { return __awaiter$1(this, void 0, void 0, function* () { if (getGa4State() !== "fresh") { return; } setGa4State("loading"); const dlName = config.dataLayerName || "dataLayer"; const dlParam = dlName !== "dataLayer" ? "&l=" + dlName : ""; // to work with both GA4 and GTM const tagId = config.measurementIds; const scriptSrc = `${defaultScriptSrc}?id=${tagId}${dlParam}`; window[dlName] = window[dlName] || []; const gtag = function () { window[dlName].push(arguments); }; // @ts-ignore gtag("js", new Date()); gtag( // @ts-ignore "config", tagId, Object.assign(Object.assign({}, (payload.userId ? { user_id: payload.userId } : {})), (!config.autoPageView ? { send_page_view: false } : {}))); loadScript(scriptSrc) .then(() => { setGa4State("loaded"); }) .catch(e => { console.warn(`GA4 (containerId=${config.measurementIds}) init failed: ${e.message}`, e); setGa4State("failed"); }); }); } function satisfyFilter(filter, subject) { return filter === "*" || filter.toLowerCase().trim() === (subject || "").trim().toLowerCase(); } function satisfyDomainFilter(filter, subject) { if (filter === "*") { return true; } subject = subject || ""; if (filter.startsWith("*.")) { return subject.endsWith(filter.substring(1)); } else { return filter === subject; } } function applyFilters(event, creds) { const { hosts = "*", events = "*" } = creds; try { const eventsArray = Array.isArray(events) ? events : events.split("\n"); const hostsArray = Array.isArray(hosts) ? hosts : hosts.split("\n"); return (!!hostsArray.find(hostFilter => { var _a, _b; return satisfyDomainFilter(hostFilter, (_b = (_a = event.context) === null || _a === void 0 ? void 0 : _a.page) === null || _b === void 0 ? void 0 : _b.host); }) && (!!eventsArray.find(eventFilter => satisfyFilter(eventFilter, event.type)) || !!eventsArray.find(eventFilter => satisfyFilter(eventFilter, event.event)))); } catch (e) { console.warn(`Failed to apply filters: ${e.message}. Typeof events: ${typeof events}, typeof hosts: ${typeof hosts}. Values`, events, hosts); throw new Error(`Failed to apply filters: ${e.message}. Typeof events: ${typeof events}, typeof hosts: ${typeof hosts}`); } } const internalDestinationPlugins = { [tagPlugin.id]: tagPlugin, [gtmPlugin.id]: gtmPlugin, [ga4Plugin.id]: ga4Plugin, [logrocketPlugin.id]: logrocketPlugin, }; var name = "@jitsu/js"; var version = "0.0.0"; const publicSuffixes = "ac,com.ac,edu.ac,gov.ac,net.ac,mil.ac,org.ac,ad,nom.ad,ae,co.ae,net.ae,org.ae,sch.ae,ac.ae,gov.ae,mil.ae,aero,af,gov.af,com.af,org.af,net.af,edu.af,ag,com.ag,org.ag,net.ag,co.ag,nom.ag,ai,off.ai,com.ai,net.ai,org.ai,al,com.al,edu.al,gov.al,mil.al,net.al,org.al,am,co.am,com.am,commune.am,net.am,org.am,ao,ed.ao,gv.ao,og.ao,co.ao,pb.ao,it.ao,aq,ar,bet.ar,com.ar,coop.ar,edu.ar,gob.ar,gov.ar,int.ar,mil.ar,musica.ar,mutual.ar,net.ar,org.ar,senasa.ar,tur.ar,arpa,e164.arpa,in-addr.arpa,ip6.arpa,iris.arpa,uri.arpa,urn.arpa,as,gov.as,asia,at,ac.at,co.at,gv.at,or.at,sth.ac.at,au,com.au,net.au,org.au,edu.au,gov.au,asn.au,id.au,act.au,nsw.au,nt.au,qld.au,sa.au,tas.au,vic.au,wa.au,aw,com.aw,ax,az,com.az,net.az,int.az,gov.az,org.az,edu.az,info.az,pp.az,mil.az,name.az,pro.az,biz.az,ba,com.ba,edu.ba,gov.ba,mil.ba,net.ba,org.ba,bb,biz.bb,co.bb,com.bb,edu.bb,gov.bb,info.bb,net.bb,org.bb,store.bb,tv.bb,bd,be,ac.be,bf,gov.bf,bg,a.bg,b.bg,c.bg,d.bg,e.bg,f.bg,g.bg,h.bg,i.bg,j.bg,k.bg,l.bg,m.bg,n.bg,o.bg,p.bg,q.bg,r.bg,s.bg,t.bg,u.bg,v.bg,w.bg,x.bg,y.bg,z.bg,0.bg,1.bg,2.bg,3.bg,4.bg,5.bg,6.bg,7.bg,8.bg,9.bg,bh,com.bh,edu.bh,net.bh,org.bh,gov.bh,bi,co.bi,com.bi,edu.bi,or.bi,org.bi,biz,bj,africa.bj,agro.bj,architectes.bj,assur.bj,avocats.bj,co.bj,com.bj,eco.bj,econo.bj,edu.bj,info.bj,loisirs.bj,money.bj,net.bj,org.bj,ote.bj,resto.bj,restaurant.bj,tourism.bj,univ.bj,bm,com.bm,edu.bm,gov.bm,net.bm,org.bm,bn,com.bn,edu.bn,gov.bn,net.bn,org.bn,bo,com.bo,edu.bo,gob.bo,int.bo,org.bo,net.bo,mil.bo,tv.bo,web.bo,br,9guacu.br,abc.br,adm.br,adv.br,agr.br,aju.br,am.br,anani.br,aparecida.br,app.br,arq.br,art.br,ato.br,b.br,barueri.br,belem.br,bhz.br,bib.br,bio.br,blog.br,bmd.br,boavista.br,bsb.br,campinagrande.br,campinas.br,caxias.br,cim.br,cng.br,cnt.br,com.br,contagem.br,coop.br,coz.br,cri.br,cuiaba.br,curitiba.br,def.br,des.br,det.br,dev.br,ecn.br,eco.br,edu.br,emp.br,enf.br,eng.br,esp.br,etc.br,eti.br,far.br,feira.br,flog.br,floripa.br,fm.br,fnd.br,fortal.br,fot.br,foz.br,fst.br,g12.br,geo.br,ggf.br,goiania.br,gov.br,gru.br,imb.br,ind.br,inf.br,jab.br,jampa.br,jdf.br,joinville.br,jor.br,jus.br,leg.br,lel.br,log.br,londrina.br,macapa.br,maceio.br,manaus.br,maringa.br,mat.br,med.br,mil.br,morena.br,mp.br,mus.br,natal.br,net.br,niteroi.br,nom.br,not.br,ntr.br,odo.br,ong.br,org.br,osasco.br,palmas.br,poa.br,ppg.br,pro.br,psc.br,psi.br,pvh.br,qsl.br,radio.br,rec.br,recife.br,rep.br,ribeirao.br,rio.br,riobranco.br,riopreto.br,salvador.br,sampa.br,santamaria.br,santoandre.br,saobernardo.br,saogonca.br,seg.br,sjc.br,slg.br,slz.br,sorocaba.br,srv.br,taxi.br,tc.br,tec.br,teo.br,the.br,tmp.br,trd.br,tur.br,tv.br,udi.br,vet.br,vix.br,vlog.br,wiki.br,zlg.br,bs,com.bs,net.bs,org.bs,edu.bs,gov.bs,bt,com.bt,edu.bt,gov.bt,net.bt,org.bt,bv,bw,co.bw,org.bw,by,gov.by,mil.by,com.by,of.by,bz,com.bz,net.bz,org.bz,edu.bz,gov.bz,ca,ab.ca,bc.ca,mb.ca,nb.ca,nf.ca,nl.ca,ns.ca,nt.ca,nu.ca,on.ca,pe.ca,qc.ca,sk.ca,yk.ca,gc.ca,cat,cc,cd,gov.cd,cf,cg,ch,ci,org.ci,or.ci,com.ci,co.ci,edu.ci,ed.ci,ac.ci,net.ci,go.ci,asso.ci,aéroport.ci,int.ci,presse.ci,md.ci,gouv.ci,ck,cl,co.cl,gob.cl,gov.cl,mil.cl,cm,co.cm,com.cm,gov.cm,net.cm,cn,ac.cn,com.cn,edu.cn,gov.cn,net.cn,org.cn,mil.cn,co,arts.co,com.co,edu.co,firm.co,gov.co,info.co,int.co,mil.co,net.co,nom.co,org.co,rec.co,web.co,com,coop,cr,ac.cr,co.cr,ed.cr,fi.cr,go.cr,or.cr,sa.cr,cu,com.cu,edu.cu,org.cu,net.cu,gov.cu,inf.cu,cv,com.cv,edu.cv,int.cv,nome.cv,org.cv,cw,com.cw,edu.cw,net.cw,org.cw,cx,gov.cx,cy,ac.cy,biz.cy,com.cy,ekloges.cy,gov.cy,ltd.cy,mil.cy,net.cy,org.cy,press.cy,pro.cy,tm.cy,cz,de,dj,dk,dm,com.dm,net.dm,org.dm,edu.dm,gov.dm,do,art.do,com.do,edu.do,gob.do,gov.do,mil.do,net.do,org.do,sld.do,web.do,dz,art.dz,asso.dz,com.dz,edu.dz,gov.dz,org.dz,net.dz,pol.dz,soc.dz,tm.dz,ec,com.ec,info.ec,net.ec,fin.ec,k12.ec,med.ec,pro.ec,org.ec,edu.ec,gov.ec,gob.ec,mil.ec,edu,ee,edu.ee,gov.ee,riik.ee,lib.ee,med.ee,com.ee,pri.ee,aip.ee,org.ee,fie.ee,eg,com.eg,edu.eg,eun.eg,gov.eg,mil.eg,name.eg,net.eg,org.eg,sci.eg,er,es,com.es,nom.es,org.es,gob.es,edu.es,et,com.et,gov.et,org.et,edu.et,biz.et,name.et,info.et,net.et,eu,fi,aland.fi,fj,ac.fj,biz.fj,com.fj,gov.fj,info.fj,mil.fj,name.fj,net.fj,org.fj,pro.fj,fk,com.fm,edu.fm,net.fm,org.fm,fm,fo,fr,asso.fr,com.fr,gouv.fr,nom.fr,prd.fr,tm.fr,aeroport.fr,avocat.fr,avoues.fr,cci.fr,chambagri.fr,chirurgiens-dentistes.fr,experts-comptables.fr,geometre-expert.fr,greta.fr,huissier-justice.fr,medecin.fr,notaires.fr,pharmacien.fr,port.fr,veterinaire.fr,ga,gb,edu.gd,gov.gd,gd,ge,com.ge,edu.ge,gov.ge,org.ge,mil.ge,net.ge,pvt.ge,gf,gg,co.gg,net.gg,org.gg,gh,com.gh,edu.gh,gov.gh,org.gh,mil.gh,gi,com.gi,ltd.gi,gov.gi,mod.gi,edu.gi,org.gi,gl,co.gl,com.gl,edu.gl,net.gl,org.gl,gm,gn,ac.gn,com.gn,edu.gn,gov.gn,org.gn,net.gn,gov,gp,com.gp,net.gp,mobi.gp,edu.gp,org.gp,asso.gp,gq,gr,com.gr,edu.gr,net.gr,org.gr,gov.gr,gs,gt,com.gt,edu.gt,gob.gt,ind.gt,mil.gt,net.gt,org.gt,gu,com.gu,edu.gu,gov.gu,guam.gu,info.gu,net.gu,org.gu,web.gu,gw,gy,co.gy,com.gy,edu.gy,gov.gy,net.gy,org.gy,hk,com.hk,edu.hk,gov.hk,idv.hk,net.hk,org.hk,hm,hn,com.hn,edu.hn,org.hn,net.hn,mil.hn,gob.hn,hr,iz.hr,from.hr,name.hr,com.hr,ht,com.ht,shop.ht,firm.ht,info.ht,adult.ht,net.ht,pro.ht,org.ht,med.ht,art.ht,coop.ht,pol.ht,asso.ht,edu.ht,rel.ht,gouv.ht,perso.ht,hu,co.hu,info.hu,org.hu,priv.hu,sport.hu,tm.hu,2000.hu,agrar.hu,bolt.hu,casino.hu,city.hu,erotica.hu,erotika.hu,film.hu,forum.hu,games.hu,hotel.hu,ingatlan.hu,jogasz.hu,konyvelo.hu,lakas.hu,media.hu,news.hu,reklam.hu,sex.hu,shop.hu,suli.hu,szex.hu,tozsde.hu,utazas.hu,video.hu,id,ac.id,biz.id,co.id,desa.id,go.id,mil.id,my.id,net.id,or.id,ponpes.id,sch.id,web.id,ie,gov.ie,il,ac.il,co.il,gov.il,idf.il,k12.il,muni.il,net.il,org.il,im,ac.im,co.im,com.im,ltd.co.im,net.im,org.im,plc.co.im,tt.im,tv.im,in,5g.in,6g.in,ac.in,ai.in,am.in,bihar.in,biz.in,business.in,ca.in,cn.in,co.in,com.in,coop.in,cs.in,delhi.in,dr.in,edu.in,er.in,firm.in,gen.in,gov.in,gujarat.in,ind.in,info.in,int.in,internet.in,io.in,me.in,mil.in,net.in,nic.in,org.in,pg.in,post.in,pro.in,res.in,travel.in,tv.in,uk.in,up.in,us.in,info,int,eu.int,io,com.io,iq,gov.iq,edu.iq,mil.iq,com.iq,org.iq,net.iq,ir,ac.ir,co.ir,gov.ir,id.ir,net.ir,org.ir,sch.ir,is,net.is,com.is,edu.is,gov.is,org.is,int.is,it,gov.it,edu.it,je,co.je,net.je,org.je,jm,jo,com.jo,org.jo,net.jo,edu.jo,sch.jo,gov.jo,mil.jo,name.jo,jobs,jp,ac.jp,ad.jp,co.jp,ed.jp,go.jp,gr.jp,lg.jp,ne.jp,or.jp,ke,ac.ke,co.ke,go.ke,info.ke,me.ke,mobi.ke,ne.ke,or.ke,sc.ke,kg,org.kg,net.kg,com.kg,edu.kg,gov.kg,mil.kg,kh,ki,edu.ki,biz.ki,net.ki,org.ki,gov.ki,info.ki,com.ki,km,org.km,nom.km,gov.km,prd.km,tm.km,edu.km,mil.km,ass.km,com.km,kn,net.kn,org.kn,edu.kn,gov.kn,kp,com.kp,edu.kp,gov.kp,org.kp,rep.kp,tra.kp,kr,ac.kr,co.kr,es.kr,go.kr,hs.kr,kg.kr,mil.kr,ms.kr,ne.kr,or.kr,pe.kr,re.kr,sc.kr,kw,com.kw,edu.kw,emb.kw,gov.kw,ind.kw,net.kw,org.kw,ky,com.ky,edu.ky,net.ky,org.ky,kz,org.kz,edu.kz,net.kz,gov.kz,mil.kz,com.kz,la,int.la,net.la,info.la,edu.la,gov.la,per.la,com.la,org.la,lb,com.lb,edu.lb,gov.lb,net.lb,org.lb,lc,com.lc,net.lc,co.lc,org.lc,edu.lc,gov.lc,li,lk,gov.lk,sch.lk,net.lk,int.lk,com.lk,org.lk,edu.lk,ngo.lk,soc.lk,web.lk,ltd.lk,assn.lk,grp.lk,hotel.lk,ac.lk,lr,com.lr,edu.lr,gov.lr,org.lr,net.lr,ls,ac.ls,biz.ls,co.ls,edu.ls,gov.ls,info.ls,net.ls,org.ls,sc.ls,lt,gov.lt,lu,lv,com.lv,edu.lv,gov.lv,org.lv,mil.lv,id.lv,net.lv,asn.lv,conf.lv,ly,com.ly,net.ly,gov.ly,plc.ly,edu.ly,sch.ly,med.ly,org.ly,id.ly,ma,co.ma,net.ma,gov.ma,org.ma,ac.ma,press.ma,mc,tm.mc,asso.mc,md,me,co.me,net.me,org.me,edu.me,ac.me,gov.me,its.me,priv.me,mg,org.mg,nom.mg,gov.mg,prd.mg,tm.mg,edu.mg,mil.mg,com.mg,co.mg,mh,mil,mk,com.mk,org.mk,net.mk,edu.mk,gov.mk,inf.mk,name.mk,ml,com.ml,edu.ml,gouv.ml,gov.ml,net.ml,org.ml,presse.ml,mm,mn,gov.mn,edu.mn,org.mn,mo,com.mo,net.mo,org.mo,edu.mo,gov.mo,mobi,mp,mq,mr,gov.mr,ms,com.ms,edu.ms,gov.ms,net.ms,org.ms,mt,com.mt,edu.mt,net.mt,org.mt,mu,com.mu,net.mu,org.mu,gov.mu,ac.mu,co.mu,or.mu,museum,mv,aero.mv,biz.mv,com.mv,coop.mv,edu.mv,gov.mv,info.mv,int.mv,mil.mv,museum.mv,name.mv,net.mv,org.mv,pro.mv,mw,ac.mw,biz.mw,co.mw,com.mw,coop.mw,edu.mw,gov.mw,int.mw,museum.mw,net.mw,org.mw,mx,com.mx,org.mx,gob.mx,edu.mx,net.mx,my,biz.my,com.my,edu.my,gov.my,mil.my,name.my,net.my,org.my,mz,ac.mz,adv.mz,co.mz,edu.mz,gov.mz,mil.mz,net.mz,org.mz,na,info.na,pro.na,name.na,school.na,or.na,dr.na,us.na,mx.na,ca.na,in.na,cc.na,tv.na,ws.na,mobi.na,co.na,com.na,org.na,name,nc,asso.nc,nom.nc,ne,net,nf,com.nf,net.nf,per.nf,rec.nf,web.nf,arts.nf,firm.nf,info.nf,other.nf,store.nf,ng,com.ng,edu.ng,gov.ng,i.ng,mil.ng,mobi.ng,name.ng,net.ng,org.ng,sch.ng,ni,ac.ni,biz.ni,co.ni,com.ni,edu.ni,gob.ni,in.ni,info.ni,int.ni,mil.ni,net.ni,nom.ni,org.ni,web.ni,nl,no,fhs.no,vgs.no,fylkesbibl.no,folkebibl.no,museum.no,idrett.no,priv.no,mil.no,stat.no,dep.no,kommune.no,herad.no,np,nr,biz.nr,info.nr,gov.nr,edu.nr,org.nr,net.nr,com.nr,nu,nz,ac.nz,co.nz,cri.nz,geek.nz,gen.nz,govt.nz,health.nz,iwi.nz,kiwi.nz,maori.nz,mil.nz,māori.nz,net.nz,org.nz,parliament.nz,school.nz,om,co.om,com.om,edu.om,gov.om,med.om,museum.om,net.om,org.om,pro.om,onion,org,pa,ac.pa,gob.pa,com.pa,org.pa,sld.pa,edu.pa,net.pa,ing.pa,abo.pa,med.pa,nom.pa,pe,edu.pe,gob.pe,nom.pe,mil.pe,org.pe,com.pe,net.pe,pf,com.pf,org.pf,edu.pf,pg,ph,com.ph,net.ph,org.ph,gov.ph,edu.ph,ngo.ph,mil.ph,i.ph,pk,com.pk,net.pk,edu.pk,org.pk,fam.pk,biz.pk,web.pk,gov.pk,gob.pk,gok.pk,gon.pk,gop.pk,gos.pk,info.pk,pl,com.pl,net.pl,org.pl,aid.pl,agro.pl,atm.pl,auto.pl,biz.pl,edu.pl,gmina.pl,gsm.pl,info.pl,mail.pl,miasta.pl,media.pl,mil.pl,nieruchomosci.pl,nom.pl,pc.pl,powiat.pl,priv.pl,realestate.pl,rel.pl,sex.pl,shop.pl,sklep.pl,sos.pl,szkola.pl,targi.pl,tm.pl,tourism.pl,travel.pl,turystyka.pl,pm,pn,gov.pn,co.pn,org.pn,edu.pn,net.pn,post,pr,com.pr,net.pr,org.pr,gov.pr,edu.pr,isla.pr,pro.pr,biz.pr,info.pr,name.pr,est.pr,prof.pr,ac.pr,pro,aaa.pro,aca.pro,acct.pro,avocat.pro,bar.pro,cpa.pro,eng.pro,jur.pro,law.pro,med.pro,recht.pro,ps,edu.ps,gov.ps,sec.ps,plo.ps,com.ps,org.ps,net.ps,pt,net.pt,gov.pt,org.pt,edu.pt,int.pt,publ.pt,com.pt,nome.pt,pw,co.pw,ne.pw,or.pw,ed.pw,go.pw,belau.pw,py,com.py,coop.py,edu.py,gov.py,mil.py,net.py,org.py,qa,com.qa,edu.qa,gov.qa,mil.qa,name.qa,net.qa,org.qa,sch.qa,re,asso.re,com.re,nom.re,ro,arts.ro,com.ro,firm.ro,info.ro,nom.ro,nt.ro,org.ro,rec.ro,store.ro,tm.ro,www.ro,rs,ac.rs,co.rs,edu.rs,gov.rs,in.rs,org.rs,ru,rw,ac.rw,co.rw,coop.rw,gov.rw,mil.rw,net.rw,org.rw,sa,com.sa,net.sa,org.sa,gov.sa,med.sa,pub.sa,edu.sa,sch.sa,sb,com.sb,edu.sb,gov.sb,net.sb,org.sb,sc,com.sc,gov.sc,net.sc,org.sc,edu.sc,sd,com.sd,net.sd,org.sd,edu.sd,med.sd,tv.sd,gov.sd,info.sd,se,a.se,ac.se,b.se,bd.se,brand.se,c.se,d.se,e.se,f.se,fh.se,fhsk.se,fhv.se,g.se,h.se,i.se,k.se,komforb.se,kommunalforbund.se,komvux.se,l.se,lanbib.se,m.se,n.se,naturbruksgymn.se,o.se,org.se,p.se,parti.se,pp.se,press.se,r.se,s.se,t.se,tm.se,u.se,w.se,x.se,y.se,z.se,sg,com.sg,net.sg,org.sg,gov.sg,edu.sg,per.sg,sh,com.sh,net.sh,gov.sh,org.sh,mil.sh,si,sj,sk,sl,com.sl,net.sl,edu.sl,gov.sl,org.sl,sm,sn,art.sn,com.sn,edu.sn,gouv.sn,org.sn,perso.sn,univ.sn,so,com.so,edu.so,gov.so,me.so,net.so,org.so,sr,ss,biz.ss,com.ss,edu.ss,gov.ss,me.ss,net.ss,org.ss,sch.ss,st,co.st,com.st,consulado.st,edu.st,embaixada.st,mil.st,net.st,org.st,principe.st,saotome.st,store.st,su,sv,com.sv,edu.sv,gob.sv,org.sv,red.sv,sx,gov.sx,sy,edu.sy,gov.sy,net.sy,mil.sy,com.sy,org.sy,sz,co.sz,ac.sz,org.sz,tc,td,tel,tf,tg,th,ac.th,co.th,go.th,in.th,mi.th,net.th,or.th,tj,ac.tj,biz.tj,co.tj,com.tj,edu.tj,go.tj,gov.tj,int.tj,mil.tj,name.tj,net.tj,nic.tj,org.tj,test.tj,web.tj,tk,tl,gov.tl,tm,com.tm,co.tm,org.tm,net.tm,nom.tm,gov.tm,mil.tm,edu.tm,tn,com.tn,ens.tn,fin.tn,gov.tn,ind.tn,info.tn,intl.tn,mincom.tn,nat.tn,net.tn,org.tn,perso.tn,tourism.tn,to,com.to,gov.to,net.to,org.to,edu.to,mil.to,tr,av.tr,bbs.tr,bel.tr,biz.tr,com.tr,dr.tr,edu.tr,gen.tr,gov.tr,info.tr,mil.tr,k12.tr,kep.tr,name.tr,net.tr,org.tr,pol.tr,tel.tr,tsk.tr,tv.tr,web.tr,nc.tr,tt,co.tt,com.tt,org.tt,net.tt,biz.tt,info.tt,pro.tt,int.tt,coop.tt,jobs.tt,mobi.tt,travel.tt,museum.tt,aero.tt,name.tt,gov.tt,edu.tt,tv,tw,edu.tw,gov.tw,mil.tw,com.tw,net.tw,org.tw,idv.tw,game.tw,ebiz.tw,club.tw,tz,ac.tz,co.tz,go.tz,hotel.tz,info.tz,me.tz,mil.tz,mobi.tz,ne.tz,or.tz,sc.tz,tv.tz,ua,com.ua,edu.ua,gov.ua,in.ua,net.ua,org.ua,ug,co.ug,or.ug,ac.ug,sc.ug,go.ug,ne.ug,com.ug,org.ug,uk,ac.uk,co.uk,gov.uk,ltd.uk,me.uk,net.uk,nhs.uk,org.uk,plc.uk,police.uk,us,dni.us,fed.us,isa.us,kids.us,nsn.us,ak.us,al.us,ar.us,as.us,az.us,ca.us,co.us,ct.us,dc.us,de.us,fl.us,ga.us,gu.us,hi.us,ia.us,id.us,il.us,in.us,ks.us,ky.us,la.us,ma.us,md.us,me.us,mi.us,mn.us,mo.us,ms.us,mt.us,nc.us,nd.us,ne.us,nh.us,nj.us,nm.us,nv.us,ny.us,oh.us,ok.us,or.us,pa.us,pr.us,ri.us,sc.us,sd.us,tn.us,tx.us,ut.us,vi.us,vt.us,va.us,wa.us,wi.us,wv.us,wy.us,uy,com.uy,edu.uy,gub.uy,mil.uy,net.uy,org.uy,uz,co.uz,com.uz,net.uz,org.uz,va,vc,com.vc,net.vc,org.vc,gov.vc,mil.vc,edu.vc,ve,arts.ve,bib.ve,co.ve,com.ve,e12.ve,edu.ve,firm.ve,gob.ve,gov.ve,info.ve,int.ve,mil.ve,net.ve,nom.ve,org.ve,rar.ve,rec.ve,store.ve,tec.ve,web.ve,vg,vi,co.vi,com.vi,k12.vi,net.vi,org.vi,vn,ac.vn,ai.vn,biz.vn,com.vn,edu.vn,gov.vn,health.vn,id.vn,info.vn,int.vn,io.vn,name.vn,net.vn,org.vn,pro.vn,vu,com.vu,edu.vu,net.vu,org.vu,wf,ws,com.ws,net.ws,org.ws,gov.ws,edu.ws,yt,ye,com.ye,edu.ye,gov.ye,net.ye,mil.ye,org.ye,ac.za,agric.za,alt.za,co.za,edu.za,gov.za,grondar.za,law.za,mil.za,net.za,ngo.za,nic.za,nis.za,nom.za,org.za,school.za,tm.za,web.za,zm,ac.zm,biz.zm,co.zm,com.zm,edu.zm,gov.zm,info.zm,mil.zm,net.zm,org.zm,sch.zm,zw,ac.zw,co.zw,gov.zw,mil.zw,org.zw".split(","); //convert to Map const _publicSuffixesMap = {}; publicSuffixes.forEach(tld => { _publicSuffixesMap[tld] = true; }); const publicSuffixesMap = _publicSuffixesMap; function getTopLevelDomain(hostname) { const [domain] = hostname.split(":"); const parts = domain.split("."); if (parts[parts.length - 1] === "localhost" || parts.length < 2) { return parts[parts.length - 1]; } else { const d = parts[parts.length - 2] + "." + parts[parts.length - 1]; if (parts.length > 2 && publicSuffixesMap[d]) { return parts[parts.length - 3] + "." + d; } else { return d; } } } /* global analytics */ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; const defaultConfig = { /* Your segment writeKey */ writeKey: null, /* Disable anonymous MTU */ host: null, debug: false, fetch: null, echoEvents: false, cookieDomain: undefined, runtime: undefined, }; const parseQuery = (qs) => { if (!qs) { return {}; } let queryString = qs.length > 0 && qs.charAt(0) === "?" ? qs.substring(1) : qs; let query = {}; let pairs = (queryString[0] === "?" ? queryString.substr(1) : queryString).split("&"); for (let i = 0; i < pairs.length; i++) { let pair = pairs[i].split("="); query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || ""); } return query; }; function utmToKey(key) { const name = key.substring("utm_".length); return name === "campaign" ? "name" : name; } function parseUtms(query) { return Object.entries(query) .filter(([key]) => key.indexOf("utm_") === 0) .reduce((acc, [key, value]) => (Object.assign(Object.assign({}, acc), { [utmToKey(key)]: value })), {}); } function safeCall(f, defaultVal) { try { return f(); } catch (e) { return defaultVal; } } function restoreTraits(storage) { const val = storage.getItem("__user_traits"); if (typeof val === "string") { return safeCall(() => JSON.parse(val), {}); } return val; } function getCookie(name) { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); return parts.length === 2 ? parts.pop().split(";").shift() : undefined; } function getGa4Ids(runtime) { var _a; const allCookies = runtime.getCookies(); const clientId = (_a = allCookies["_ga"]) === null || _a === void 0 ? void 0 : _a.split(".").slice(-2).join("."); const gaSessionCookies = Object.entries(allCookies).filter(([key]) => key.startsWith("_ga_")); const sessionIds = gaSessionCookies.length > 0 ? Object.fromEntries(gaSessionCookies .map(([key, value]) => { if (typeof value !== "string") { return null; } const parts = value.split("."); if (parts.length < 3) { return null; } return [key.substring("_ga_".length), parts[2]]; }) .filter(v => v !== null)) : undefined; if (clientId || sessionIds) { return { ga4: { clientId, sessionIds } }; } else { return undefined; } } function removeCookie(name) { document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;"; } function setCookie(name, val, { domain, secure }) { document.cookie = name + "=" + val + ";domain=" + domain + ";path=/" + ";expires=" + new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 365 * 5).toUTCString() + ";SameSite=" + (secure ? "None" : "Lax") + (secure ? ";secure" : ""); } const defaultCookie2Key = { __anon_id: "__eventn_id", __user_traits: "__eventn_id_usr", __user_id: "__eventn_uid", }; const cookieStorage = (cookieDomain, key2cookie) => { return { setItem(key, val) { const strVal = typeof val === "object" && val !== null ? encodeURIComponent(JSON.stringify(val)) : val; const cookieName = key2cookie[key] || key; setCookie(cookieName, strVal, { domain: cookieDomain, secure: window.location.protocol === "https:", }); }, getItem(key) { const cookieName = key2cookie[key] || key; const result = getCookie(cookieName); if (typeof result === "undefined" && key === "__user_id") { //backward compatibility with old jitsu cookie. get user id if from traits const traits = parse(getCookie("__eventn_id_usr")) || {}; return traits.internal_id || traits.user_id || traits.id || traits.userId; } return parse(result); }, removeItem(key) { removeCookie(key2cookie[key] || key); }, }; }; function windowRuntime(opts) { return { getCookie(name) { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); return parts.length === 2 ? parts.pop().split(";").shift() : undefined; }, getCookies() { const value = `; ${document.cookie}`; const cookies = {}; const matches = value.matchAll(/(\w+)=([^;]+)/g); for (const match of matches) { cookies[match[1]] = match[2]; } return cookies; }, documentEncoding() { return window.document.characterSet; }, timezoneOffset() { return new Date().getTimezoneOffset(); }, store() { return cookieStorage(opts.cookieDomain || getTopLevelDomain(window.location.hostname), defaultCookie2Key); }, language() { return window.navigator.language; }, pageTitle() { return window.document.title; }, pageUrl() { return window.location.href; }, referrer() { return window.document.referrer; }, screen() { return { width: window.screen.width, height: window.screen.height, innerWidth: window.innerWidth, innerHeight: window.innerHeight, density: Math.floor(window.devicePixelRatio), }; }, userAgent() { return window.navigator.userAgent; }, }; } const emptyRuntime = (config) => ({ documentEncoding() { return undefined; }, timezoneOffset() { return undefined; }, getCookie(name) { return undefined; }, getCookies() { return {}; }, store() { const storage = {}; return { setItem(key, val) { if (config.debug) { console.log(`[JITSU EMPTY RUNTIME] Set storage item ${key}=${JSON.stringify(val)}`); } storage[key] = val; }, getItem(key) { const val = storage[key]; if (config.debug) { console.log(`[JITSU EMPTY RUNTIME] Get storage item ${key}=${JSON.stringify(val)}`); } return val; }, removeItem(key) { if (config.debug) { console.log(`[JITSU EMPTY RUNTIME] Get storage item ${key}=${storage[key]}`); } delete storage[key]; }, }; }, language() { return undefined; }, pageTitle() { return undefined; }, pageUrl() { return undefined; }, referrer() { return undefined; }, screen() { return undefined; }, userAgent() { return undefined; }, }); function deepMerge(target, source) { if (typeof source !== "object" || source === null) { return source; } if (typeof target !== "object" || target === null) { return source; } return Object.entries(source).reduce((acc, [key, value]) => { acc[key] = deepMerge(target[key], value); return acc; }, target); } function isInBrowser() { return typeof document !== "undefined" && typeof window !== "undefined"; } function adjustPayload(payload, config, storage) { var _a, _b; const runtime = config.runtime || (isInBrowser() ? windowRuntime(config) : emptyRuntime(config)); const url = runtime.pageUrl(); const parsedUrl = safeCall(() => new URL(url), undefined); const query = parsedUrl ? parseQuery(parsedUrl.search) : {}; const properties = payload.properties || {}; const customContext = ((_a = payload.properties) === null || _a === void 0 ? void 0 : _a.context) || {}; (_b = payload.properties) === null || _b === void 0 ? true : delete _b.context; const referrer = runtime.referrer(); const context = { library: { name: name, version: version, }, userAgent: runtime.userAgent(), locale: runtime.language(), screen: runtime.screen(), traits: payload.type != "identify" && payload.type != "group" ? Object.assign({}, (restoreTraits(storage) || {})) : undefined, page: { path: properties.path || (parsedUrl && parsedUrl.pathname), referrer: referrer, referring_domain: safeCall(() => referrer && new URL(referrer).hostname), host: parsedUrl && parsedUrl.host, search: properties.search || (parsedUrl && parsedUrl.search), title: properties.title || runtime.pageTitle(), url: properties.url || url, encoding: properties.encoding || runtime.documentEncoding(), }, clientIds: Object.assign({ fbc: runtime.getCookie("_fbc"), fbp: runtime.getCookie("_fbp") }, getGa4Ids(runtime)), campaign: parseUtms(query), }; const withContext = Object.assign(Object.assign({}, payload), { timestamp: new Date().toISOString(), sentAt: new Date().toISOString(), messageId: randomId(properties.path || (parsedUrl && parsedUrl.pathname)), writeKey: maskWriteKey(config.writeKey), context: deepMerge(context, customContext) }); delete withContext.meta; delete withContext.options; return withContext; } function processDestinations(destinations, method, originalEvent, debug, analyticsInstance) { return __awaiter(this, void 0, void 0, function* () { const promises = []; for (const destination of destinations) { let newEvents = [originalEvent]; if (destination.newEvents) { newEvents = destination.newEvents.map(e => (e === "same" ? originalEvent : e)); } const credentials = Object.assign(Object.assign({}, destination.credentials), destination.options); if (destination.deviceOptions.type === "internal-plugin") { const plugin = internalDestinationPlugins[destination.deviceOptions.name]; if (plugin) { for (const event of newEvents) { try { promises.push(plugin.handle(credentials, event)); } catch (e) { console.warn(`[JITSU] Error processing event with internal plugin '${destination.deviceOptions.name}': ${e === null || e === void 0 ? void 0 : e.message}`, e); } } } else { console.warn(`[JITSU] Unknown internal plugin '${destination.deviceOptions.name}' for destination '${destination.id}'`); } } else if (destination.deviceOptions.type === "analytics-plugin") { yield loadScript(destination.deviceOptions.packageCdn); const plugin = window[destination.deviceOptions.moduleVarName]; if (!plugin) { console.warn(`[JITSU] Broken plugin '${destination.deviceOptions.packageCdn}' for destination '${destination.id}' - it doesn't export '${destination.deviceOptions.moduleVarName}' variable`); } else { let pluginInstance; try { pluginInstance = (typeof plugin === "function" ? plugin : plugin.init)(credentials); } catch (e) { console.warn(`[JITSU] Error creating plugin '${destination.deviceOptions.moduleVarName}@${destination.deviceOptions.packageCdn}' for destination '${destination.id}': ${e === null || e === void 0 ? void 0 : e.message}`, e); } try { if (debug) { console.log(`[JITSU] Plugin '${destination.deviceOptions.moduleVarName}@${destination.deviceOptions.packageCdn}' for destination '${destination.id}' initialized with config:`, pluginInstance.config); } pluginInstance.initialize({ config: pluginInstance.config, instance: analyticsInstance }); } catch (e) { console.warn(`[JITSU] Error initializing plugin '${destination.deviceOptions.moduleVarName}@${destination.deviceOptions.packageCdn}' for destination '${destination.id}': ${e === null || e === void 0 ? void 0 : e.message}. Config: ${JSON.stringify(pluginInstance.config)}`, e); continue; } if (pluginInstance[method]) { for (const event of newEvents) { try { pluginInstance[method]({ payload: event, config: pluginInstance.config, instance: analyticsInstance, }); } catch (e) { console.warn(`[JITSU] Error processing ${method}() with plugin '${destination.deviceOptions.moduleVarName}@${destination.deviceOptions.packageCdn}' for destination '${destination.id}': ${e === null || e === void 0 ? void 0 : e.message}`, e); } } } } } } }); } function looksLikeCuid(id) { return id.length === 25 && id.charAt(0) === "c"; } function validateWriteKey(writeKey) { if (writeKey) { const [, secret] = writeKey.split(":", 2); if (!secret && !looksLikeCuid(writeKey)) { throw new Error(`Legacy write key detected - ${writeKey}! This format doesn't work anymore, it should be 'key:secret'. Please download a new key from Jitsu UI`); } } return writeKey; } function maskWriteKey(writeKey) { if (writeKey) { const [id, secret] = writeKey.split(":", 2); if (secret) { return `${id}:***`; } else { return "***"; } } return writeKey; } function send(method, payload, jitsuConfig, instance, store) { if (jitsuConfig.echoEvents) { console.log(`[JITSU DEBUG] sending '${method}' event:`, payload); return; } const url = `${jitsuConfig.host}/api/s/${method}`; const fetch = jitsuConfig.fetch || globalThis.fetch; if (!fetch) { throw new Error("Please specify fetch function in jitsu plugin initialization, fetch isn't available in global scope"); } const debugHeader = jitsuConfig.debug ? { "X-Enable-Debug": "true" } : {}; // if (jitsuConfig.debug) { // console.log(`[JITSU] Sending event to ${url}: `, JSON.stringify(payload, null, 2)); // } const adjustedPayload = adjustPayload(payload, jitsuConfig, store); const authHeader = jitsuConfig.writeKey ? { "X-Write-Key": jitsuConfig.writeKey } : {}; return fetch(url, { method: "POST", headers: Object.assign(Object.assign({ "Content-Type": "application/json" }, authHeader), debugHeader), body: JSON.stringify(adjustedPayload), }) .then(res => { if (jitsuConfig.debug) { console.log(`[JITSU] ${url} replied ${res.status}. Original payload: `, JSON.stringify(adjustedPayload, null, 2)); } if (res.ok) { return res.text(); } else { return Promise.reject(res.text()); } }) .then(responseText => { let response; try { response = JSON.parse(responseText); } catch (e) { return Promise.reject(`Can't parse JSON: ${responseText}: ${e === null || e === void 0 ? void 0 : e.message}`); } if (response.destinations) { if (jitsuConfig.debug) { console.log(`[JITSU] Processing device destinations: `, JSON.stringify(response.destinations, null, 2)); } return processDestinations(response.destinations, method, adjustedPayload, !!jitsuConfig.debug, instance); } }) .catch(err => { if (jitsuConfig.debug) { console.error(`Jitsu ${url} failed: `, err); } }); } const jitsuAnalyticsPlugin = (pluginConfig = {}) => { const storageCache = {}; // AnalyticsInstance's storage is async somewhere inside. So if we make 'page' call right after 'identify' call // 'page' call will load traits from storage before 'identify' call had a change to save them. // to avoid that we use in-memory cache for storage const cachingStorageWrapper = (persistentStorage) => ({ setItem(key, val) { if (pluginConfig.debug) { console.log(`[JITSU DEBUG] Caching storage setItem: ${key}=${val}`); } storageCache[key] = val; persistentStorage.setItem(key, val); }, getItem(key) { const value = storageCache[key] || persistentStorage.getItem(key); if (pluginConfig.debug) { console.log(`[JITSU DEBUG] Caching storage getItem: ${key}=${value}. Evicted from cache: ${!storageCache[key]}`); } return value; }, removeItem(key) { if (pluginConfig.debug) { console.log(`[JITSU DEBUG] Caching storage removeItem: ${key}`); } delete storageCache[key]; persistentStorage.removeItem(key); }, }); const instanceConfig = Object.assign(Object.assign({}, defaultConfig), pluginConfig); return { name: "jitsu", config: instanceConfig, initialize: args => { const { config } = args; if (config.debug) { console.debug("[JITSU DEBUG] Initializing Jitsu plugin with config: ", JSON.stringify(config, null, 2)); } if (!config.host && !config.echoEvents) { throw new Error("Please specify host variable in jitsu plugin initialization, or set echoEvents to true"); } validateWriteKey(config.writeKey); }, page: args => { const { payload, config, instance } = args; return send("page", payload, config, instance, cachingStorageWrapper(instance.storage)); }, track: args => { const { payload, config, instance } = args; return send("track", payload, config, instance, cachingStorageWrapper(instance.storage)); }, identify: args => { const { payload, config, instance } = args; // Store traits in cache to be able to use them in page and track events that run asynchronously with current identify. storageCache["__user_traits"] = payload.traits; return send("identify", payload, config, instance, cachingStorageWrapper(instance.storage)); }, reset: args => { //clear storage cache Object.keys(storageCache).forEach(key => delete storageCache[key]); }, methods: { //analytics doesn't support group as a base method, so we need to add it manually group(groupId, traits, options, callback) { const analyticsInstance = this.instance; const cacheWrap = cachingStorageWrapper(analyticsInstance.storage); const user = analyticsInstance.user(); const userId = (options === null || options === void 0 ? void 0 : options.userId) || (user === null || user === void 0 ? void 0 : user.userId); const anonymousId = (options === null || options === void 0 ? void 0 : options.anonymousId) || (user === null || user === void 0 ? void 0 : user.anonymousId) || cacheWrap.getItem("__anon_id"); return send("group", Object.assign(Object.assign({ type: "group", groupId, traits }, (anonymousId ? { anonymousId } : {})), (userId ? { userId } : {})), instanceConfig, analyticsInstance, cacheWrap); }, }, }; }; function getSeed() { var _a; const defaultSeed = Date.now() % 2147483647; return isInBrowser() ? ((_a = window === null || window === void 0 ? void 0 : window.performance) === null || _a === void 0 ? void 0 : _a.now()) || defaultSeed : defaultSeed; } function randomId(hashString = "") { const d = Date.now(); return (((Math.random() * d * hash(hashString !== null && hashString !== void 0 ? hashString : "", getSeed())) % Number.MAX_SAFE_INTEGER).toString(36) + ((Math.random() * d * hash(hashString !== null && hashString !== void 0 ? hashString : "", getSeed())) % Number.MAX_SAFE_INTEGER).toString(36)); } function hash(str, seed = 0) { let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed; for (let i = 0, ch; i < str.length; i++) { ch = str.charCodeAt(i); h1 = Math.imul(h1 ^ ch, 2654435761); h2 = Math.imul(h2 ^ ch, 1597334677); } h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909); h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909); return 4294967296 * (2097151 & h2) + (h1 >>> 0); } function parse(input) { let value = input; if ((input === null || input === void 0 ? void 0 : input.indexOf("%7B%22")) === 0) { value = decodeURIComponent(input); } try { value = JSON.parse(value); if (value === "true") return true; if (value === "false") return false; if (typeof value === "object") return value; if (parseFloat(value) === value) { value = parseFloat(value); } } catch (e) { } if (value === null || value === "") { return; } return value; } function createUnderlyingAnalyticsInstance(opts, rt, plugins = []) { const storage = rt.store(); const analytics = analyticsLib({ app: "test", debug: !!opts.debug, storage, plugins: [jitsuAnalyticsPlugin(opts), ...plugins], }); const originalPage = analytics.page; analytics.page = (...args) => { if (args.length === 2 && typeof args[0] === "string" && typeof args[1] === "object") { return originalPage(Object.assign({ name: args[0] }, args[1])); } else { return originalPage(...args); } }; return Object.assign(Object.assign({}, analytics), { setAnonymousId: (id) => { if (opts.debug) { console.log("[JITSU DEBUG] Setting anonymous id to " + id); //Workaround for analytics.js bug. Underlying setAnonymousId doesn't work set the id immediately, //so we got to it manually here. See https://github.com/jitsucom/jitsu/issues/1060 storage.setItem("__anon_id", id); const userState = analytics.user(); if (userState) { userState.anonymousId = id; } analytics.setAnonymousId(id); } }, group(groupId, traits, options, callback) { for (const plugin of Object.values(analytics.plugins)) { if (plugin["group"]) { plugin["group"](groupId, traits, options, callback); } } return Promise.resolve({}); } }); } function jitsuAnalytics(opts) { const inBrowser = isInBrowser(); const rt = opts.runtime || (inBrowser ? windowRuntime(opts) : emptyRuntime(opts)); return createUnderlyingAnalyticsInstance(opts, rt); // if (inBrowser) { // const fetch = opts.fetch || globalThis.fetch; // if (!fetch) { // throw new Error( // "Please specify fetch function in jitsu plugin initialization, fetch isn't available in global scope" // ); // } // const url = `${opts.host}/api/s/cfg`; // const authHeader = {}; // const debugHeader = opts.debug ? { "X-Enable-Debug": "true" } : {}; // fetch(url) // .then(res => res.json()) // .then(res => { // result.loaded(createUnderlyingAnalyticsInstance(opts, rt, [])); // }) // .catch(e => { // console.warn(`[JITSU] error getting device-destinations from ${url}`, e); // result.loaded(createUnderlyingAnalyticsInstance(opts, rt)); // }); // } else { // result.loaded(createUnderlyingAnalyticsInstance(opts, rt)); // } } function snakeToCamel(s) { return s.replace(/([-_][a-z])/gi, $1 => { return $1.toUpperCase().replace("-", "").replace("_", ""); }); } const booleanParser = (arg) => arg === "true" || arg === "1" || arg === "yes"; const parsers = { debug: booleanParser, initOnly: booleanParser, }; function getParser(name) { return parsers[name] || (x => x); } function getScriptAttributes(scriptElement) { return scriptElement .getAttributeNames() .filter(name => name.indexOf("data-") === 0) .map(name => name.substring("data-".length)) .reduce((res, name) => (Object.assign(Object.assign({}, res), { [snakeToCamel(name)]: getParser(snakeToCamel(name))(scriptElement.getAttribute(`data-${name}`)) })), {}); } (function () { function readJitsuOptions() { const scriptElement = window.document.currentScript; if (!scriptElement) { throw new Error(`Can't find script element`); } const host = new URL(scriptElement.src).origin; return Object.assign(Object.assign(Object.assign({}, ((window === null || window === void 0 ? void 0 : window.jitsuConfig) || {})), getScriptAttributes(scriptElement)), { host }); } const options = readJitsuOptions(); const JITSU_V2_ID = options.namespace || "jitsu"; if (options.debug) { console.log(`Jitsu options: `, JSON.stringify(options)); } const jitsu = jitsuAnalytics(options); if (options.onload) { const onloadFunction = window[options.onload]; if (!onloadFunction) { console.warn(`onload function ${options.onload} is not found in window`); } if (typeof onloadFunction === "function") { onloadFunction(jitsu); } else { console.warn(`onload function ${options.onload} is not callable: ${typeof onloadFunction}`); } } window[JITSU_V2_ID] = jitsu; /** * New callback based queue, see below */ //make a copy of the queue const callbackQueue = [...(window[JITSU_V2_ID + "Q"] || [])]; //replace push with a function that calls callback immediately window[JITSU_V2_ID + "Q"] = { push: (callback) => { if (typeof callback === "function") { callback(jitsu); } else { console.warn(`${JITSU_V2_ID}Q.push() accepts only function, ${typeof callback} given`); } }, }; if (options.debug) { console.log(`Jitsu callback queue size: ${callbackQueue.length}`, callbackQueue); } callbackQueue.forEach((callback) => { try { callback(jitsu); } catch (e) { console.warn(`Error processing callback from Jitsu queue`, e); } }); if (!options.initOnly) { jitsu.page(); } })(); })();