{"version":3,"sources":[" [synthetic:util/defineproperty] "," [synthetic:util/global] "," [synthetic:es6/symbol] "," [synthetic:es6/util/arrayfromiterable] "," [synthetic:es6/util/makeiterator] "," [synthetic:es6/util/arrayfromiterator] "," [synthetic:es6/util/inherits] ","../../node_modules/dom-utils/lib/matches.js","../../node_modules/dom-utils/lib/parents.js","../../node_modules/dom-utils/lib/delegate.js","../../node_modules/dom-utils/lib/closest.js","../../node_modules/autotrack/lib/plugins/outbound-link-tracker.js","../../node_modules/dom-utils/lib/get-attributes.js","../../node_modules/dom-utils/lib/parse-url.js","../../node_modules/autotrack/lib/method-chain.js","../../node_modules/autotrack/lib/utilities.js","../../node_modules/autotrack/lib/provide.js","../../node_modules/autotrack/lib/constants.js","../../node_modules/autotrack/lib/usage.js","../../node_modules/autotrack/lib/plugins/url-change-tracker.js","../../node_modules/autotrack/lib/event-emitter.js","../../node_modules/autotrack/lib/store.js","../../node_modules/autotrack/lib/session.js","../../node_modules/autotrack/lib/plugins/page-visibility-tracker.js"],"names":["$jscomp.defineProperty","$jscomp.global","$jscomp.initSymbol","$jscomp.Symbol","$jscomp.symbolCounter_","$jscomp.SYMBOL_PREFIX","$jscomp.arrayIterator","$jscomp.initSymbolIterator","$jscomp.iteratorPrototype","proto","window","Element","prototype","nativeMatches","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","element","test","nodeType","i","item","selector","call","nodes","parentNode","querySelectorAll","node","parents","list","push","delegate","eventType","callback","listener","event","delegateTarget","opts","composed","composedPath","target","parentElements","concat","parent","document","useCapture","ancestor","addEventListener","destroy","removeEventListener","getAttributes","attrs","map","attributes","length","attr","name","value","DEFAULT_PORT","a","createElement","cache","parseUrl","url","location","href","charAt","port","HTTP_PORT","HTTPS_PORT","host","replace","hash","hostname","origin","protocol","pathname","search","instances","constructor","MethodChain","context","methodName","originalMethodReference","isTask","get","methodChain","boundMethodChain","wrappedMethod","this.wrappedMethod","lastBoundMethod","$jscomp.arrayFromIterable","args","set","add","methodOverride","getOrCreateMethodChain","rebindMethodChain","remove","index","indexOf","splice","method","previousMethod","bind","filter","h","createFieldsObj","defaultFields","userFields","tracker","hitFilter","originalBuildHitTask","buildHitTask","model","assign","getAttributeFields","prefix","attributeFields","Object","keys","forEach","attribute","field","camelCase","slice","withTimeout","fn","called","setTimeout","wait","queueMap","deferUntilPluginsLoaded","processQueue","clearTimeout","ref","timeout","send","MethodChain.remove","trackingId","queue","ref.send","originalMethod","MethodChain.add","len","sources","source","key","hasOwnProperty","str","match","p1","toUpperCase","uuid","b","toString","Math","random","provide","pluginName","pluginConstructor","gaAlias","GoogleAnalyticsObject","q","gaDevIds","DEV_ID","gaplugins","plugins","CLEAN_URL_TRACKER","EVENT_TRACKER","IMPRESSION_TRACKER","MEDIA_QUERY_TRACKER","OUTBOUND_FORM_TRACKER","OUTBOUND_LINK_TRACKER","PAGE_VISIBILITY_TRACKER","SOCIAL_WIDGET_TRACKER","URL_CHANGE_TRACKER","MAX_SCROLL_TRACKER","PLUGIN_COUNT","trackUsage","plugin","VERSION","usageHex","parseInt","toAdd","usageBin","substr","OutboundLinkTracker","defaultOpts","events","linkSelector","shouldTrackOutboundLink","fieldsObj","attributePrefix","handleLinkInteractions","delegates","link","getAttribute","transport","eventCategory","eventAction","type","eventLabel","navigator","sendBeacon","metaKey","ctrlKey","shiftKey","altKey","which","clickHandler","defaultPrevented","preventDefault","oldHitCallback","hitCallback","parseUrlFn","UrlChangeTracker","history","pushState","shouldTrackUrlChange","trackReplaceState","path","pushStateOverride","replaceStateOverride","handlePopState","handleUrlChange","historyDidUpdate","oldPath","newPath","page","title","EventEmitter","registry_","on","getRegistry_","emit","isListening","browserSupportsLocalStorage","Store","defaults","key_","defaults_","cache_","$jscomp.inherits","getOrCreate","namespace","AUTOTRACK_PREFIX","join","storageListener","isSupported_","localStorage","setItem","removeItem","err","Store.isSupported_","parse","getItem","newData","JSON","stringify","clear","store","oldData","oldValue","newValue","data","Session","timeZone","Session.DEFAULT_TIMEOUT","sendHitTaskOverride","dateTimeFormatter","Intl","DateTimeFormat","Store.getOrCreate","defaultProps","hitTime","isExpired","id","getId","sessionData","oldHitTime","currentDate","Date","oldHitDate","MINUTES","datesAreDifferentInTimezone","format","sessionControl","sessionWillStart","sessionWillEnd","PAGE_ID","PageVisibilityTracker","visibilityState","sessionTimeout","visibleThreshold","sendInitialPageview","lastPageState","visibleThresholdTimeout_","isInitialPageviewSent_","trackerSetOverride","handleChange","handleWindowUnload","handleExternalStoreSet","session","Session.getOrCreate","VISIBLE","sendPageview","isPageLoad","time","state","pageId","sessionId","pageLoadsMetricIndex","NULL_DIMENSION","sendPageLoad","HIDDEN","lastStoredChange","getAndValidateChangeData","change","sendPageVisibilityEvent","delta","deltaInSeconds","round","SECONDS","nonInteraction","eventValue","queueTime","visibleMetricIndex","fields"],"mappings":"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","file":"","sourcesContent":[null,null,null,null,null,null,null,"const proto = window.Element.prototype;\nconst nativeMatches = proto.matches ||\n proto.matchesSelector ||\n proto.webkitMatchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector;\n\n\n/**\n * Tests if a DOM elements matches any of the test DOM elements or selectors.\n * @param {Element} element The DOM element to test.\n * @param {Element|string|Array} test A DOM element, a CSS\n * selector, or an array of DOM elements or CSS selectors to match against.\n * @return {boolean} True of any part of the test matches.\n */\nexport default function matches(element, test) {\n // Validate input.\n if (element && element.nodeType == 1 && test) {\n // if test is a string or DOM element test it.\n if (typeof test == 'string' || test.nodeType == 1) {\n return element == test ||\n matchesSelector(element, /** @type {string} */ (test));\n } else if ('length' in test) {\n // if it has a length property iterate over the items\n // and return true if any match.\n for (let i = 0, item; item = test[i]; i++) {\n if (element == item || matchesSelector(element, item)) return true;\n }\n }\n }\n // Still here? Return false\n return false;\n}\n\n\n/**\n * Tests whether a DOM element matches a selector. This polyfills the native\n * Element.prototype.matches method across browsers.\n * @param {!Element} element The DOM element to test.\n * @param {string} selector The CSS selector to test element against.\n * @return {boolean} True if the selector matches.\n */\nfunction matchesSelector(element, selector) {\n if (typeof selector != 'string') return false;\n if (nativeMatches) return nativeMatches.call(element, selector);\n const nodes = element.parentNode.querySelectorAll(selector);\n for (let i = 0, node; node = nodes[i]; i++) {\n if (node == element) return true;\n }\n return false;\n}\n","/**\n * Returns an array of a DOM element's parent elements.\n * @param {!Element} element The DOM element whose parents to get.\n * @return {!Array} An array of all parent elemets, or an empty array if no\n * parent elements are found.\n */\nexport default function parents(element) {\n const list = [];\n while (element && element.parentNode && element.parentNode.nodeType == 1) {\n element = /** @type {!Element} */ (element.parentNode);\n list.push(element);\n }\n return list;\n}\n","import closest from './closest';\nimport matches from './matches';\n\n/**\n * Delegates the handling of events for an element matching a selector to an\n * ancestor of the matching element.\n * @param {!Node} ancestor The ancestor element to add the listener to.\n * @param {string} eventType The event type to listen to.\n * @param {string} selector A CSS selector to match against child elements.\n * @param {!Function} callback A function to run any time the event happens.\n * @param {Object=} opts A configuration options object. The available options:\n * - useCapture: If true, bind to the event capture phase.\n * - deep: If true, delegate into shadow trees.\n * @return {Object} The delegate object. It contains a destroy method.\n */\nexport default function delegate(\n ancestor, eventType, selector, callback, opts = {}) {\n // Defines the event listener.\n const listener = function(event) {\n let delegateTarget;\n\n // If opts.composed is true and the event originated from inside a Shadow\n // tree, check the composed path nodes.\n if (opts.composed && typeof event.composedPath == 'function') {\n const composedPath = event.composedPath();\n for (let i = 0, node; node = composedPath[i]; i++) {\n if (node.nodeType == 1 && matches(node, selector)) {\n delegateTarget = node;\n }\n }\n } else {\n // Otherwise check the parents.\n delegateTarget = closest(event.target, selector, true);\n }\n\n if (delegateTarget) {\n callback.call(delegateTarget, event, delegateTarget);\n }\n };\n\n ancestor.addEventListener(eventType, listener, opts.useCapture);\n\n return {\n destroy: function() {\n ancestor.removeEventListener(eventType, listener, opts.useCapture);\n },\n };\n}\n","import matches from './matches';\nimport parents from './parents';\n\n/**\n * Gets the closest parent element that matches the passed selector.\n * @param {Element} element The element whose parents to check.\n * @param {string} selector The CSS selector to match against.\n * @param {boolean=} shouldCheckSelf True if the selector should test against\n * the passed element itself.\n * @return {Element|undefined} The matching element or undefined.\n */\nexport default function closest(element, selector, shouldCheckSelf = false) {\n if (!(element && element.nodeType == 1 && selector)) return;\n const parentElements =\n (shouldCheckSelf ? [element] : []).concat(parents(element));\n\n for (let i = 0, parent; parent = parentElements[i]; i++) {\n if (matches(parent, selector)) return parent;\n }\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {delegate, parseUrl} from 'dom-utils';\nimport provide from '../provide';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj,\n getAttributeFields, withTimeout} from '../utilities';\n\n\n/**\n * Class for the `outboundLinkTracker` analytics.js plugin.\n * @implements {OutboundLinkTrackerPublicInterface}\n */\nclass OutboundLinkTracker {\n /**\n * Registers outbound link tracking on a tracker object.\n * @param {!Tracker} tracker Passed internally by analytics.js\n * @param {?Object} opts Passed by the require command.\n */\n constructor(tracker, opts) {\n trackUsage(tracker, plugins.OUTBOUND_LINK_TRACKER);\n\n // Feature detects to prevent errors in unsupporting browsers.\n if (!window.addEventListener) return;\n\n /** @type {OutboundLinkTrackerOpts} */\n const defaultOpts = {\n events: ['click'],\n linkSelector: 'a, area',\n shouldTrackOutboundLink: this.shouldTrackOutboundLink,\n fieldsObj: {},\n attributePrefix: 'ga-',\n // hitFilter: undefined,\n };\n\n this.opts = /** @type {OutboundLinkTrackerOpts} */ (\n assign(defaultOpts, opts));\n\n this.tracker = tracker;\n\n // Binds methods.\n this.handleLinkInteractions = this.handleLinkInteractions.bind(this);\n\n // Creates a mapping of events to their delegates\n this.delegates = {};\n this.opts.events.forEach((event) => {\n this.delegates[event] = delegate(document, event, this.opts.linkSelector,\n this.handleLinkInteractions, {composed: true, useCapture: true});\n });\n }\n\n /**\n * Handles all interactions on link elements. A link is considered an outbound\n * link if its hostname property does not match location.hostname. When the\n * beacon transport method is not available, the links target is set to\n * \"_blank\" to ensure the hit can be sent.\n * @param {Event} event The DOM click event.\n * @param {Element} link The delegated event target.\n */\n handleLinkInteractions(event, link) {\n if (this.opts.shouldTrackOutboundLink(link, parseUrl)) {\n const href = link.getAttribute('href') || link.getAttribute('xlink:href');\n const url = parseUrl(href);\n\n /** @type {FieldsObj} */\n const defaultFields = {\n transport: 'beacon',\n eventCategory: 'Outbound Link',\n eventAction: event.type,\n eventLabel: url.href,\n };\n\n /** @type {FieldsObj} */\n const userFields = assign({}, this.opts.fieldsObj,\n getAttributeFields(link, this.opts.attributePrefix));\n\n const fieldsObj = createFieldsObj(defaultFields, userFields,\n this.tracker, this.opts.hitFilter, link, event);\n\n if (!navigator.sendBeacon &&\n linkClickWillUnloadCurrentPage(event, link)) {\n // Adds a new event handler at the last minute to minimize the chances\n // that another event handler for this click will run after this logic.\n const clickHandler = () => {\n window.removeEventListener('click', clickHandler);\n\n // Checks to make sure another event handler hasn't already prevented\n // the default action. If it has the custom redirect isn't needed.\n if (!event.defaultPrevented) {\n // Stops the click and waits until the hit is complete (with\n // timeout) for browsers that don't support beacon.\n event.preventDefault();\n\n const oldHitCallback = fieldsObj.hitCallback;\n fieldsObj.hitCallback = withTimeout(function() {\n if (typeof oldHitCallback == 'function') oldHitCallback();\n location.href = href;\n });\n }\n this.tracker.send('event', fieldsObj);\n };\n window.addEventListener('click', clickHandler);\n } else {\n this.tracker.send('event', fieldsObj);\n }\n }\n }\n\n /**\n * Determines whether or not the tracker should send a hit when a link is\n * clicked. By default links with a hostname property not equal to the current\n * hostname are tracked.\n * @param {Element} link The link that was clicked on.\n * @param {Function} parseUrlFn A cross-browser utility method for url\n * parsing (note: renamed to disambiguate when compiling).\n * @return {boolean} Whether or not the link should be tracked.\n */\n shouldTrackOutboundLink(link, parseUrlFn) {\n const href = link.getAttribute('href') || link.getAttribute('xlink:href');\n const url = parseUrlFn(href);\n return url.hostname != location.hostname &&\n url.protocol.slice(0, 4) == 'http';\n }\n\n /**\n * Removes all event listeners and instance properties.\n */\n remove() {\n Object.keys(this.delegates).forEach((key) => {\n this.delegates[key].destroy();\n });\n }\n}\n\n\nprovide('outboundLinkTracker', OutboundLinkTracker);\n\n\n/**\n * Determines if a link click event will cause the current page to upload.\n * Note: most link clicks *will* cause the current page to unload because they\n * initiate a page navigation. The most common reason a link click won't cause\n * the page to unload is if the clicked was to open the link in a new tab.\n * @param {Event} event The DOM event.\n * @param {Element} link The link element clicked on.\n * @return {boolean} True if the current page will be unloaded.\n */\nfunction linkClickWillUnloadCurrentPage(event, link) {\n return !(\n // The event type can be customized; we only care about clicks here.\n event.type != 'click' ||\n // Links with target=\"_blank\" set will open in a new window/tab.\n link.target == '_blank' ||\n // On mac, command clicking will open a link in a new tab. Control\n // clicking does this on windows.\n event.metaKey || event.ctrlKey ||\n // Shift clicking in Chrome/Firefox opens the link in a new window\n // In Safari it adds the URL to a favorites list.\n event.shiftKey ||\n // On Mac, clicking with the option key is used to download a resouce.\n event.altKey ||\n // Middle mouse button clicks (which == 2) are used to open a link\n // in a new tab, and right clicks (which == 3) on Firefox trigger\n // a click event.\n event.which > 1);\n}\n","/**\n * Gets all attributes of an element as a plain JavaScriot object.\n * @param {Element} element The element whose attributes to get.\n * @return {!Object} An object whose keys are the attribute keys and whose\n * values are the attribute values. If no attributes exist, an empty\n * object is returned.\n */\nexport default function getAttributes(element) {\n const attrs = {};\n\n // Validate input.\n if (!(element && element.nodeType == 1)) return attrs;\n\n // Return an empty object if there are no attributes.\n const map = element.attributes;\n if (map.length === 0) return {};\n\n for (let i = 0, attr; attr = map[i]; i++) {\n attrs[attr.name] = attr.value;\n }\n return attrs;\n}\n","const HTTP_PORT = '80';\nconst HTTPS_PORT = '443';\nconst DEFAULT_PORT = RegExp(':(' + HTTP_PORT + '|' + HTTPS_PORT + ')$');\n\n\nconst a = document.createElement('a');\nconst cache = {};\n\n\n/**\n * Parses the given url and returns an object mimicing a `Location` object.\n * @param {string} url The url to parse.\n * @return {!Object} An object with the same properties as a `Location`.\n */\nexport default function parseUrl(url) {\n // All falsy values (as well as \".\") should map to the current URL.\n url = (!url || url == '.') ? location.href : url;\n\n if (cache[url]) return cache[url];\n\n a.href = url;\n\n // When parsing file relative paths (e.g. `../index.html`), IE will correctly\n // resolve the `href` property but will keep the `..` in the `path` property.\n // It will also not include the `host` or `hostname` properties. Furthermore,\n // IE will sometimes return no protocol or just a colon, especially for things\n // like relative protocol URLs (e.g. \"//google.com\").\n // To workaround all of these issues, we reparse with the full URL from the\n // `href` property.\n if (url.charAt(0) == '.' || url.charAt(0) == '/') return parseUrl(a.href);\n\n // Don't include default ports.\n let port = (a.port == HTTP_PORT || a.port == HTTPS_PORT) ? '' : a.port;\n\n // PhantomJS sets the port to \"0\" when using the file: protocol.\n port = port == '0' ? '' : port;\n\n // Sometimes IE incorrectly includes a port for default ports\n // (e.g. `:80` or `:443`) even when no port is specified in the URL.\n // http://bit.ly/1rQNoMg\n const host = a.host.replace(DEFAULT_PORT, '');\n\n // Not all browser support `origin` so we have to build it.\n const origin = a.origin ? a.origin : a.protocol + '//' + host;\n\n // Sometimes IE doesn't include the leading slash for pathname.\n // http://bit.ly/1rQNoMg\n const pathname = a.pathname.charAt(0) == '/' ? a.pathname : '/' + a.pathname;\n\n return cache[url] = {\n hash: a.hash,\n host: host,\n hostname: a.hostname,\n href: a.href,\n origin: origin,\n pathname: pathname,\n port: port,\n protocol: a.protocol,\n search: a.search,\n };\n}\n","/**\n * Copyright 2017 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * @fileoverview\n * The functions exported by this module make it easier (and safer) to override\n * foreign object methods (in a modular way) and respond to or modify their\n * invocation. The primary feature is the ability to override a method without\n * worrying if it's already been overridden somewhere else in the codebase. It\n * also allows for safe restoring of an overridden method by only fully\n * restoring a method once all overrides have been removed.\n */\n\n\nconst instances = [];\n\n\n/**\n * A class that wraps a foreign object method and emit events before and\n * after the original method is called.\n */\nexport default class MethodChain {\n /**\n * Adds the passed override method to the list of method chain overrides.\n * @param {!Object} context The object containing the method to chain.\n * @param {string} methodName The name of the method on the object.\n * @param {!Function} methodOverride The override method to add.\n */\n static add(context, methodName, methodOverride) {\n getOrCreateMethodChain(context, methodName).add(methodOverride);\n }\n\n /**\n * Removes a method chain added via `add()`. If the override is the\n * only override added, the original method is restored.\n * @param {!Object} context The object containing the method to unchain.\n * @param {string} methodName The name of the method on the object.\n * @param {!Function} methodOverride The override method to remove.\n */\n static remove(context, methodName, methodOverride) {\n getOrCreateMethodChain(context, methodName).remove(methodOverride);\n }\n\n /**\n * Wraps a foreign object method and overrides it. Also stores a reference\n * to the original method so it can be restored later.\n * @param {!Object} context The object containing the method.\n * @param {string} methodName The name of the method on the object.\n */\n constructor(context, methodName) {\n this.context = context;\n this.methodName = methodName;\n this.isTask = /Task$/.test(methodName);\n\n this.originalMethodReference = this.isTask ?\n context.get(methodName) : context[methodName];\n\n this.methodChain = [];\n this.boundMethodChain = [];\n\n // Wraps the original method.\n this.wrappedMethod = (...args) => {\n const lastBoundMethod =\n this.boundMethodChain[this.boundMethodChain.length - 1];\n\n return lastBoundMethod(...args);\n };\n\n // Override original method with the wrapped one.\n if (this.isTask) {\n context.set(methodName, this.wrappedMethod);\n } else {\n context[methodName] = this.wrappedMethod;\n }\n }\n\n /**\n * Adds a method to the method chain.\n * @param {!Function} overrideMethod The override method to add.\n */\n add(overrideMethod) {\n this.methodChain.push(overrideMethod);\n this.rebindMethodChain();\n }\n\n /**\n * Removes a method from the method chain and restores the prior order.\n * @param {!Function} overrideMethod The override method to remove.\n */\n remove(overrideMethod) {\n const index = this.methodChain.indexOf(overrideMethod);\n if (index > -1) {\n this.methodChain.splice(index, 1);\n if (this.methodChain.length > 0) {\n this.rebindMethodChain();\n } else {\n this.destroy();\n }\n }\n }\n\n /**\n * Loops through the method chain array and recreates the bound method\n * chain array. This is necessary any time a method is added or removed\n * to ensure proper original method context and order.\n */\n rebindMethodChain() {\n this.boundMethodChain = [];\n for (let method, i = 0; method = this.methodChain[i]; i++) {\n const previousMethod = this.boundMethodChain[i - 1] ||\n this.originalMethodReference.bind(this.context);\n this.boundMethodChain.push(method(previousMethod));\n }\n }\n\n /**\n * Calls super and destroys the instance if no registered handlers remain.\n */\n destroy() {\n const index = instances.indexOf(this);\n if (index > -1) {\n instances.splice(index, 1);\n if (this.isTask) {\n this.context.set(this.methodName, this.originalMethodReference);\n } else {\n this.context[this.methodName] = this.originalMethodReference;\n }\n }\n }\n}\n\n\n/**\n * Gets a MethodChain instance for the passed object and method. If the method\n * has already been wrapped via an existing MethodChain instance, that\n * instance is returned.\n * @param {!Object} context The object containing the method.\n * @param {string} methodName The name of the method on the object.\n * @return {!MethodChain}\n */\nfunction getOrCreateMethodChain(context, methodName) {\n let methodChain = instances\n .filter((h) => h.context == context && h.methodName == methodName)[0];\n\n if (!methodChain) {\n methodChain = new MethodChain(context, methodName);\n instances.push(methodChain);\n }\n return methodChain;\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {getAttributes} from 'dom-utils';\nimport MethodChain from './method-chain';\n\n\n/**\n * Accepts default and user override fields and an optional tracker, hit\n * filter, and target element and returns a single object that can be used in\n * `ga('send', ...)` commands.\n * @param {FieldsObj} defaultFields The default fields to return.\n * @param {FieldsObj} userFields Fields set by the user to override the\n * defaults.\n * @param {Tracker=} tracker The tracker object to apply the hit filter to.\n * @param {Function=} hitFilter A filter function that gets\n * called with the tracker model right before the `buildHitTask`. It can\n * be used to modify the model for the current hit only.\n * @param {Element=} target If the hit originated from an interaction\n * with a DOM element, hitFilter is invoked with that element as the\n * second argument.\n * @param {(Event|TwttrEvent)=} event If the hit originated via a DOM event,\n * hitFilter is invoked with that event as the third argument.\n * @return {!FieldsObj} The final fields object.\n */\nexport function createFieldsObj(\n defaultFields, userFields, tracker = undefined,\n hitFilter = undefined, target = undefined, event = undefined) {\n if (typeof hitFilter == 'function') {\n const originalBuildHitTask = tracker.get('buildHitTask');\n return {\n buildHitTask: (/** @type {!Model} */ model) => {\n model.set(defaultFields, null, true);\n model.set(userFields, null, true);\n hitFilter(model, target, event);\n originalBuildHitTask(model);\n },\n };\n } else {\n return assign({}, defaultFields, userFields);\n }\n}\n\n\n/**\n * Retrieves the attributes from an DOM element and returns a fields object\n * for all attributes matching the passed prefix string.\n * @param {Element} element The DOM element to get attributes from.\n * @param {string} prefix An attribute prefix. Only the attributes matching\n * the prefix will be returned on the fields object.\n * @return {FieldsObj} An object of analytics.js fields and values\n */\nexport function getAttributeFields(element, prefix) {\n const attributes = getAttributes(element);\n const attributeFields = {};\n\n Object.keys(attributes).forEach(function(attribute) {\n // The `on` prefix is used for event handling but isn't a field.\n if (attribute.indexOf(prefix) === 0 && attribute != prefix + 'on') {\n let value = attributes[attribute];\n\n // Detects Boolean value strings.\n if (value == 'true') value = true;\n if (value == 'false') value = false;\n\n const field = camelCase(attribute.slice(prefix.length));\n attributeFields[field] = value;\n }\n });\n\n return attributeFields;\n}\n\n\n/**\n * Accepts a function to be invoked once the DOM is ready. If the DOM is\n * already ready, the callback is invoked immediately.\n * @param {!Function} callback The ready callback.\n */\nexport function domReady(callback) {\n if (document.readyState == 'loading') {\n document.addEventListener('DOMContentLoaded', function fn() {\n document.removeEventListener('DOMContentLoaded', fn);\n callback();\n });\n } else {\n callback();\n }\n}\n\n\n/**\n * Returns a function, that, as long as it continues to be called, will not\n * actually run. The function will only run after it stops being called for\n * `wait` milliseconds.\n * @param {!Function} fn The function to debounce.\n * @param {number} wait The debounce wait timeout in ms.\n * @return {!Function} The debounced function.\n */\nexport function debounce(fn, wait) {\n let timeout;\n return function(...args) {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), wait);\n };\n}\n\n\n/**\n * Accepts a function and returns a wrapped version of the function that is\n * expected to be called elsewhere in the system. If it's not called\n * elsewhere after the timeout period, it's called regardless. The wrapper\n * function also prevents the callback from being called more than once.\n * @param {!Function} callback The function to call.\n * @param {number=} wait How many milliseconds to wait before invoking\n * the callback.\n * @return {!Function} The wrapped version of the passed function.\n */\nexport function withTimeout(callback, wait = 2000) {\n let called = false;\n const fn = function() {\n if (!called) {\n called = true;\n callback();\n }\n };\n setTimeout(fn, wait);\n return fn;\n}\n\n// Maps trackers to queue by tracking ID.\nconst queueMap = {};\n\n/**\n * Queues a function for execution in the next call stack, or immediately\n * before any send commands are executed on the tracker. This allows\n * autotrack plugins to defer running commands until after all other plugins\n * are required but before any other hits are sent.\n * @param {!Tracker} tracker\n * @param {!Function} fn\n */\nexport function deferUntilPluginsLoaded(tracker, fn) {\n const trackingId = tracker.get('trackingId');\n const ref = queueMap[trackingId] = queueMap[trackingId] || {};\n\n const processQueue = () => {\n clearTimeout(ref.timeout);\n if (ref.send) {\n MethodChain.remove(tracker, 'send', ref.send);\n }\n delete queueMap[trackingId];\n\n ref.queue.forEach((fn) => fn());\n };\n\n clearTimeout(ref.timeout);\n ref.timeout = setTimeout(processQueue, 0);\n ref.queue = ref.queue || [];\n ref.queue.push(fn);\n\n if (!ref.send) {\n ref.send = (originalMethod) => {\n return (...args) => {\n processQueue();\n originalMethod(...args);\n };\n };\n MethodChain.add(tracker, 'send', ref.send);\n }\n}\n\n\n/**\n * A small shim of Object.assign that aims for brevity over spec-compliant\n * handling all the edge cases.\n * @param {!Object} target The target object to assign to.\n * @param {...?Object} sources Additional objects who properties should be\n * assigned to target. Non-objects are converted to objects.\n * @return {!Object} The modified target object.\n */\nexport const assign = Object.assign || function(target, ...sources) {\n for (let i = 0, len = sources.length; i < len; i++) {\n const source = Object(sources[i]);\n for (let key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n};\n\n\n/**\n * Accepts a string containing hyphen or underscore word separators and\n * converts it to camelCase.\n * @param {string} str The string to camelCase.\n * @return {string} The camelCased version of the string.\n */\nexport function camelCase(str) {\n return str.replace(/[\\-\\_]+(\\w?)/g, function(match, p1) {\n return p1.toUpperCase();\n });\n}\n\n\n/**\n * Capitalizes the first letter of a string.\n * @param {string} str The input string.\n * @return {string} The capitalized string\n */\nexport function capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\n/**\n * Indicates whether the passed variable is a JavaScript object.\n * @param {*} value The input variable to test.\n * @return {boolean} Whether or not the test is an object.\n */\nexport function isObject(value) {\n return typeof value == 'object' && value !== null;\n}\n\n\n/**\n * Accepts a value that may or may not be an array. If it is not an array,\n * it is returned as the first item in a single-item array.\n * @param {*} value The value to convert to an array if it is not.\n * @return {!Array} The array-ified value.\n */\nexport function toArray(value) {\n return Array.isArray(value) ? value : [value];\n}\n\n\n/**\n * @return {number} The current date timestamp\n */\nexport function now() {\n return +new Date();\n}\n\n\n/*eslint-disable */\n// https://gist.github.com/jed/982883\n/** @param {?=} a */\nexport const uuid = function b(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,b)};\n/*eslint-enable */\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {DEV_ID} from './constants';\nimport {capitalize} from './utilities';\n\n\n/**\n * Provides a plugin for use with analytics.js, accounting for the possibility\n * that the global command queue has been renamed or not yet defined.\n * @param {string} pluginName The plugin name identifier.\n * @param {Function} pluginConstructor The plugin constructor function.\n */\nexport default function provide(pluginName, pluginConstructor) {\n const gaAlias = window.GoogleAnalyticsObject || 'ga';\n window[gaAlias] = window[gaAlias] || function(...args) {\n (window[gaAlias].q = window[gaAlias].q || []).push(args);\n };\n\n // Adds the autotrack dev ID if not already included.\n window.gaDevIds = window.gaDevIds || [];\n if (window.gaDevIds.indexOf(DEV_ID) < 0) {\n window.gaDevIds.push(DEV_ID);\n }\n\n // Formally provides the plugin for use with analytics.js.\n window[gaAlias]('provide', pluginName, pluginConstructor);\n\n // Registers the plugin on the global gaplugins object.\n window.gaplugins = window.gaplugins || {};\n window.gaplugins[capitalize(pluginName)] = pluginConstructor;\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nexport const VERSION = '2.4.1';\nexport const DEV_ID = 'i5iSjo';\n\nexport const VERSION_PARAM = '_av';\nexport const USAGE_PARAM = '_au';\n\nexport const NULL_DIMENSION = '(not set)';\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {USAGE_PARAM, VERSION, VERSION_PARAM} from './constants';\n\n\nexport const plugins = {\n CLEAN_URL_TRACKER: 1,\n EVENT_TRACKER: 2,\n IMPRESSION_TRACKER: 3,\n MEDIA_QUERY_TRACKER: 4,\n OUTBOUND_FORM_TRACKER: 5,\n OUTBOUND_LINK_TRACKER: 6,\n PAGE_VISIBILITY_TRACKER: 7,\n SOCIAL_WIDGET_TRACKER: 8,\n URL_CHANGE_TRACKER: 9,\n MAX_SCROLL_TRACKER: 10,\n};\n\n\nconst PLUGIN_COUNT = Object.keys(plugins).length;\n\n\n/**\n * Tracks the usage of the passed plugin by encoding a value into a usage\n * string sent with all hits for the passed tracker.\n * @param {!Tracker} tracker The analytics.js tracker object.\n * @param {number} plugin The plugin enum.\n */\nexport function trackUsage(tracker, plugin) {\n trackVersion(tracker);\n trackPlugin(tracker, plugin);\n}\n\n\n/**\n * Converts a hexadecimal string to a binary string.\n * @param {string} hex A hexadecimal numeric string.\n * @return {string} a binary numeric string.\n */\nfunction convertHexToBin(hex) {\n return parseInt(hex || '0', 16).toString(2);\n}\n\n\n/**\n * Converts a binary string to a hexadecimal string.\n * @param {string} bin A binary numeric string.\n * @return {string} a hexadecimal numeric string.\n */\nfunction convertBinToHex(bin) {\n return parseInt(bin || '0', 2).toString(16);\n}\n\n\n/**\n * Adds leading zeros to a string if it's less than a minimum length.\n * @param {string} str A string to pad.\n * @param {number} len The minimum length of the string\n * @return {string} The padded string.\n */\nfunction padZeros(str, len) {\n if (str.length < len) {\n let toAdd = len - str.length;\n while (toAdd) {\n str = '0' + str;\n toAdd--;\n }\n }\n return str;\n}\n\n\n/**\n * Accepts a binary numeric string and flips the digit from 0 to 1 at the\n * specified index.\n * @param {string} str The binary numeric string.\n * @param {number} index The index to flip the bit.\n * @return {string} The new binary string with the bit flipped on\n */\nfunction flipBitOn(str, index) {\n return str.substr(0, index) + 1 + str.substr(index + 1);\n}\n\n\n/**\n * Accepts a tracker and a plugin index and flips the bit at the specified\n * index on the tracker's usage parameter.\n * @param {Object} tracker An analytics.js tracker.\n * @param {number} pluginIndex The index of the plugin in the global list.\n */\nfunction trackPlugin(tracker, pluginIndex) {\n const usageHex = tracker.get('&' + USAGE_PARAM);\n let usageBin = padZeros(convertHexToBin(usageHex), PLUGIN_COUNT);\n\n // Flip the bit of the plugin being tracked.\n usageBin = flipBitOn(usageBin, PLUGIN_COUNT - pluginIndex);\n\n // Stores the modified usage string back on the tracker.\n tracker.set('&' + USAGE_PARAM, convertBinToHex(usageBin));\n}\n\n\n/**\n * Accepts a tracker and adds the current version to the version param.\n * @param {Object} tracker An analytics.js tracker.\n */\nfunction trackVersion(tracker) {\n tracker.set('&' + VERSION_PARAM, VERSION);\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport MethodChain from '../method-chain';\nimport provide from '../provide';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj} from '../utilities';\n\n\n/**\n * Class for the `urlChangeTracker` analytics.js plugin.\n * @implements {UrlChangeTrackerPublicInterface}\n */\nclass UrlChangeTracker {\n /**\n * Adds handler for the history API methods\n * @param {!Tracker} tracker Passed internally by analytics.js\n * @param {?Object} opts Passed by the require command.\n */\n constructor(tracker, opts) {\n trackUsage(tracker, plugins.URL_CHANGE_TRACKER);\n\n // Feature detects to prevent errors in unsupporting browsers.\n if (!history.pushState || !window.addEventListener) return;\n\n /** @type {UrlChangeTrackerOpts} */\n const defaultOpts = {\n shouldTrackUrlChange: this.shouldTrackUrlChange,\n trackReplaceState: false,\n fieldsObj: {},\n hitFilter: null,\n };\n\n this.opts = /** @type {UrlChangeTrackerOpts} */ (assign(defaultOpts, opts));\n\n this.tracker = tracker;\n\n // Sets the initial page field.\n // Don't set this on the tracker yet so campaign data can be retreived\n // from the location field.\n this.path = getPath();\n\n // Binds methods.\n this.pushStateOverride = this.pushStateOverride.bind(this);\n this.replaceStateOverride = this.replaceStateOverride.bind(this);\n this.handlePopState = this.handlePopState.bind(this);\n\n // Watches for history changes.\n MethodChain.add(history, 'pushState', this.pushStateOverride);\n MethodChain.add(history, 'replaceState', this.replaceStateOverride);\n window.addEventListener('popstate', this.handlePopState);\n }\n\n /**\n * Handles invocations of the native `history.pushState` and calls\n * `handleUrlChange()` indicating that the history updated.\n * @param {!Function} originalMethod A reference to the overridden method.\n * @return {!Function}\n */\n pushStateOverride(originalMethod) {\n return (...args) => {\n originalMethod(...args);\n this.handleUrlChange(true);\n };\n }\n\n /**\n * Handles invocations of the native `history.replaceState` and calls\n * `handleUrlChange()` indicating that history was replaced.\n * @param {!Function} originalMethod A reference to the overridden method.\n * @return {!Function}\n */\n replaceStateOverride(originalMethod) {\n return (...args) => {\n originalMethod(...args);\n this.handleUrlChange(false);\n };\n }\n\n /**\n * Handles responding to the popstate event and calls\n * `handleUrlChange()` indicating that history was updated.\n */\n handlePopState() {\n this.handleUrlChange(true);\n }\n\n /**\n * Updates the page and title fields on the tracker and sends a pageview\n * if a new history entry was created.\n * @param {boolean} historyDidUpdate True if the history was changed via\n * `pushState()` or the `popstate` event. False if the history was just\n * modified via `replaceState()`.\n */\n handleUrlChange(historyDidUpdate) {\n // Calls the update logic asychronously to help ensure that app logic\n // responding to the URL change happens prior to this.\n setTimeout(() => {\n const oldPath = this.path;\n const newPath = getPath();\n\n if (oldPath != newPath &&\n this.opts.shouldTrackUrlChange.call(this, newPath, oldPath)) {\n this.path = newPath;\n this.tracker.set({\n page: newPath,\n title: document.title,\n });\n\n if (historyDidUpdate || this.opts.trackReplaceState) {\n /** @type {FieldsObj} */\n const defaultFields = {transport: 'beacon'};\n this.tracker.send('pageview', createFieldsObj(defaultFields,\n this.opts.fieldsObj, this.tracker, this.opts.hitFilter));\n }\n }\n }, 0);\n }\n\n /**\n * Determines whether or not the tracker should send a hit with the new page\n * data. This default implementation can be overrided in the config options.\n * @param {string} newPath The path after the URL change.\n * @param {string} oldPath The path prior to the URL change.\n * @return {boolean} Whether or not the URL change should be tracked.\n */\n shouldTrackUrlChange(newPath, oldPath) {\n return !!(newPath && oldPath);\n }\n\n /**\n * Removes all event listeners and restores overridden methods.\n */\n remove() {\n MethodChain.remove(history, 'pushState', this.pushStateOverride);\n MethodChain.remove(history, 'replaceState', this.replaceStateOverride);\n window.removeEventListener('popstate', this.handlePopState);\n }\n}\n\n\nprovide('urlChangeTracker', UrlChangeTracker);\n\n\n/**\n * @return {string} The path value of the current URL.\n */\nfunction getPath() {\n return location.pathname + location.search;\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * An simple reimplementation of the native Node.js EventEmitter class.\n * The goal of this implementation is to be as small as possible.\n */\nexport default class EventEmitter {\n /**\n * Creates the event registry.\n */\n constructor() {\n this.registry_ = {};\n }\n\n /**\n * Adds a handler function to the registry for the passed event.\n * @param {string} event The event name.\n * @param {!Function} fn The handler to be invoked when the passed\n * event is emitted.\n */\n on(event, fn) {\n this.getRegistry_(event).push(fn);\n }\n\n /**\n * Removes a handler function from the registry for the passed event.\n * @param {string=} event The event name.\n * @param {Function=} fn The handler to be removed.\n */\n off(event = undefined, fn = undefined) {\n if (event && fn) {\n const eventRegistry = this.getRegistry_(event);\n const handlerIndex = eventRegistry.indexOf(fn);\n if (handlerIndex > -1) {\n eventRegistry.splice(handlerIndex, 1);\n }\n } else {\n this.registry_ = {};\n }\n }\n\n /**\n * Runs all registered handlers for the passed event with the optional args.\n * @param {string} event The event name.\n * @param {...*} args The arguments to be passed to the handler.\n */\n emit(event, ...args) {\n this.getRegistry_(event).forEach((fn) => fn(...args));\n }\n\n /**\n * Returns the total number of event handlers currently registered.\n * @return {number}\n */\n getEventCount() {\n let eventCount = 0;\n Object.keys(this.registry_).forEach((event) => {\n eventCount += this.getRegistry_(event).length;\n });\n return eventCount;\n }\n\n /**\n * Returns an array of handlers associated with the passed event name.\n * If no handlers have been registered, an empty array is returned.\n * @private\n * @param {string} event The event name.\n * @return {!Array} An array of handler functions.\n */\n getRegistry_(event) {\n return this.registry_[event] = (this.registry_[event] || []);\n }\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport EventEmitter from './event-emitter';\nimport {assign} from './utilities';\n\n\nconst AUTOTRACK_PREFIX = 'autotrack';\nconst instances = {};\nlet isListening = false;\n\n\n/** @type {boolean|undefined} */\nlet browserSupportsLocalStorage;\n\n\n/**\n * A storage object to simplify interacting with localStorage.\n */\nexport default class Store extends EventEmitter {\n /**\n * Gets an existing instance for the passed arguements or creates a new\n * instance if one doesn't exist.\n * @param {string} trackingId The tracking ID for the GA property.\n * @param {string} namespace A namespace unique to this store.\n * @param {Object=} defaults An optional object of key/value defaults.\n * @return {Store} The Store instance.\n */\n static getOrCreate(trackingId, namespace, defaults) {\n const key = [AUTOTRACK_PREFIX, trackingId, namespace].join(':');\n\n // Don't create multiple instances for the same tracking Id and namespace.\n if (!instances[key]) {\n instances[key] = new Store(key, defaults);\n if (!isListening) initStorageListener();\n }\n return instances[key];\n }\n\n /**\n * Returns true if the browser supports and can successfully write to\n * localStorage. The results is cached so this method can be invoked many\n * times with no extra performance cost.\n * @private\n * @return {boolean}\n */\n static isSupported_() {\n if (browserSupportsLocalStorage != null) {\n return browserSupportsLocalStorage;\n }\n\n try {\n window.localStorage.setItem(AUTOTRACK_PREFIX, AUTOTRACK_PREFIX);\n window.localStorage.removeItem(AUTOTRACK_PREFIX);\n browserSupportsLocalStorage = true;\n } catch (err) {\n browserSupportsLocalStorage = false;\n }\n return browserSupportsLocalStorage;\n }\n\n /**\n * Wraps the native localStorage method for each stubbing in tests.\n * @private\n * @param {string} key The store key.\n * @return {string|null} The stored value.\n */\n static get_(key) {\n return window.localStorage.getItem(key);\n }\n\n /**\n * Wraps the native localStorage method for each stubbing in tests.\n * @private\n * @param {string} key The store key.\n * @param {string} value The value to store.\n */\n static set_(key, value) {\n window.localStorage.setItem(key, value);\n }\n\n /**\n * Wraps the native localStorage method for each stubbing in tests.\n * @private\n * @param {string} key The store key.\n */\n static clear_(key) {\n window.localStorage.removeItem(key);\n }\n\n /**\n * @param {string} key A key unique to this store.\n * @param {Object=} defaults An optional object of key/value defaults.\n */\n constructor(key, defaults = {}) {\n super();\n this.key_ = key;\n this.defaults_ = defaults;\n\n /** @type {?Object} */\n this.cache_ = null; // Will be set after the first get.\n }\n\n /**\n * Gets the data stored in localStorage for this store. If the cache is\n * already populated, return it as is (since it's always kept up-to-date\n * and in sync with activity in other windows via the `storage` event).\n * TODO(philipwalton): Implement schema migrations if/when a new\n * schema version is introduced.\n * @return {!Object} The stored data merged with the defaults.\n */\n get() {\n if (this.cache_) {\n return this.cache_;\n } else {\n if (Store.isSupported_()) {\n try {\n this.cache_ = parse(Store.get_(this.key_));\n } catch(err) {\n // Do nothing.\n }\n }\n return this.cache_ = assign({}, this.defaults_, this.cache_);\n }\n }\n\n /**\n * Saves the passed data object to localStorage,\n * merging it with the existing data.\n * @param {Object} newData The data to save.\n */\n set(newData) {\n this.cache_ = assign({}, this.defaults_, this.cache_, newData);\n\n if (Store.isSupported_()) {\n try {\n Store.set_(this.key_, JSON.stringify(this.cache_));\n } catch(err) {\n // Do nothing.\n }\n }\n }\n\n /**\n * Clears the data in localStorage for the current store.\n */\n clear() {\n this.cache_ = {};\n if (Store.isSupported_()) {\n try {\n Store.clear_(this.key_);\n } catch(err) {\n // Do nothing.\n }\n }\n }\n\n /**\n * Removes the store instance for the global instances map. If this is the\n * last store instance, the storage listener is also removed.\n * Note: this does not erase the stored data. Use `clear()` for that.\n */\n destroy() {\n delete instances[this.key_];\n if (!Object.keys(instances).length) {\n removeStorageListener();\n }\n }\n}\n\n\n/**\n * Adds a single storage event listener and flips the global `isListening`\n * flag so multiple events aren't added.\n */\nfunction initStorageListener() {\n window.addEventListener('storage', storageListener);\n isListening = true;\n}\n\n\n/**\n * Removes the storage event listener and flips the global `isListening`\n * flag so it can be re-added later.\n */\nfunction removeStorageListener() {\n window.removeEventListener('storage', storageListener);\n isListening = false;\n}\n\n\n/**\n * The global storage event listener.\n * @param {!Event} event The DOM event.\n */\nfunction storageListener(event) {\n const store = instances[event.key];\n if (store) {\n const oldData = assign({}, store.defaults_, parse(event.oldValue));\n const newData = assign({}, store.defaults_, parse(event.newValue));\n\n store.cache_ = newData;\n store.emit('externalSet', newData, oldData);\n }\n}\n\n\n/**\n * Parses a source string as JSON\n * @param {string|null} source\n * @return {!Object} The JSON object.\n */\nfunction parse(source) {\n let data = {};\n if (source) {\n try {\n data = /** @type {!Object} */ (JSON.parse(source));\n } catch(err) {\n // Do nothing.\n }\n }\n return data;\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport MethodChain from './method-chain';\nimport Store from './store';\nimport {now, uuid} from './utilities';\n\n\nconst SECONDS = 1000;\nconst MINUTES = 60 * SECONDS;\n\n\nconst instances = {};\n\n\n/**\n * A session management class that helps track session boundaries\n * across multiple open tabs/windows.\n */\nexport default class Session {\n /**\n * Gets an existing instance for the passed arguments or creates a new\n * instance if one doesn't exist.\n * @param {!Tracker} tracker An analytics.js tracker object.\n * @param {number} timeout The session timeout (in minutes). This value\n * should match what's set in the \"Session settings\" section of the\n * Google Analytics admin.\n * @param {string=} timeZone The optional IANA time zone of the view. This\n * value should match what's set in the \"View settings\" section of the\n * Google Analytics admin. (Note: this assumes all views for the property\n * use the same time zone. If that's not true, it's better not to use\n * this feature).\n * @return {Session} The Session instance.\n */\n static getOrCreate(tracker, timeout, timeZone) {\n // Don't create multiple instances for the same property.\n const trackingId = tracker.get('trackingId');\n if (instances[trackingId]) {\n return instances[trackingId];\n } else {\n return instances[trackingId] = new Session(tracker, timeout, timeZone);\n }\n }\n\n /**\n * @param {!Tracker} tracker An analytics.js tracker object.\n * @param {number} timeout The session timeout (in minutes). This value\n * should match what's set in the \"Session settings\" section of the\n * Google Analytics admin.\n * @param {string=} timeZone The optional IANA time zone of the view. This\n * value should match what's set in the \"View settings\" section of the\n * Google Analytics admin. (Note: this assumes all views for the property\n * use the same time zone. If that's not true, it's better not to use\n * this feature).\n */\n constructor(tracker, timeout, timeZone) {\n this.tracker = tracker;\n this.timeout = timeout || Session.DEFAULT_TIMEOUT;\n this.timeZone = timeZone;\n\n // Binds methods.\n this.sendHitTaskOverride = this.sendHitTaskOverride.bind(this);\n\n // Overrides into the trackers sendHitTask method.\n MethodChain.add(tracker, 'sendHitTask', this.sendHitTaskOverride);\n\n // Some browser doesn't support various features of the\n // `Intl.DateTimeFormat` API, so we have to try/catch it. Consequently,\n // this allows us to assume the presence of `this.dateTimeFormatter` means\n // it works in the current browser.\n try {\n this.dateTimeFormatter =\n new Intl.DateTimeFormat('en-US', {timeZone: this.timeZone});\n } catch(err) {\n // Do nothing.\n }\n\n /** @type {SessionStoreData} */\n const defaultProps = {\n hitTime: 0,\n isExpired: false,\n };\n this.store = Store.getOrCreate(\n tracker.get('trackingId'), 'session', defaultProps);\n\n // Ensure the session has an ID.\n if (!this.store.get().id) {\n this.store.set(/** @type {SessionStoreData} */ ({id: uuid()}));\n }\n }\n\n /**\n * Returns the ID of the current session.\n * @return {string}\n */\n getId() {\n return this.store.get().id;\n }\n\n /**\n * Accepts a session ID and returns true if the specified session has\n * evidentially expired. A session can expire for two reasons:\n * - More than 30 minutes has elapsed since the previous hit\n * was sent (The 30 minutes number is the Google Analytics default, but\n * it can be modified in GA admin \"Session settings\").\n * - A new day has started since the previous hit, in the\n * specified time zone (should correspond to the time zone of the\n * property's views).\n *\n * Note: since real session boundaries are determined at processing time,\n * this is just a best guess rather than a source of truth.\n *\n * @param {string} id The ID of a session to check for expiry.\n * @return {boolean} True if the session has not exp\n */\n isExpired(id = this.getId()) {\n // If a session ID is passed and it doesn't match the current ID,\n // assume it's from an expired session. If no ID is passed, assume the ID\n // of the current session.\n if (id != this.getId()) return true;\n\n /** @type {SessionStoreData} */\n const sessionData = this.store.get();\n\n // `isExpired` will be `true` if the sessionControl field was set to\n // 'end' on the previous hit.\n if (sessionData.isExpired) return true;\n\n const oldHitTime = sessionData.hitTime;\n\n // Only consider a session expired if previous hit time data exists, and\n // the previous hit time is greater than that session timeout period or\n // the hits occurred on different days in the session timezone.\n if (oldHitTime) {\n const currentDate = new Date();\n const oldHitDate = new Date(oldHitTime);\n if (currentDate - oldHitDate > (this.timeout * MINUTES) ||\n this.datesAreDifferentInTimezone(currentDate, oldHitDate)) {\n return true;\n }\n }\n\n // For all other cases return false.\n return false;\n }\n\n /**\n * Returns true if (and only if) the timezone date formatting is supported\n * in the current browser and if the two dates are definitively not the\n * same date in the session timezone. Anything short of this returns false.\n * @param {!Date} d1\n * @param {!Date} d2\n * @return {boolean}\n */\n datesAreDifferentInTimezone(d1, d2) {\n if (!this.dateTimeFormatter) {\n return false;\n } else {\n return this.dateTimeFormatter.format(d1)\n != this.dateTimeFormatter.format(d2);\n }\n }\n\n /**\n * Keeps track of when the previous hit was sent to determine if a session\n * has expired. Also inspects the `sessionControl` field to handles\n * expiration accordingly.\n * @param {function(!Model)} originalMethod A reference to the overridden\n * method.\n * @return {function(!Model)}\n */\n sendHitTaskOverride(originalMethod) {\n return (model) => {\n originalMethod(model);\n\n const sessionControl = model.get('sessionControl');\n const sessionWillStart = sessionControl == 'start' || this.isExpired();\n const sessionWillEnd = sessionControl == 'end';\n\n /** @type {SessionStoreData} */\n const sessionData = this.store.get();\n sessionData.hitTime = now();\n if (sessionWillStart) {\n sessionData.isExpired = false;\n sessionData.id = uuid();\n }\n if (sessionWillEnd) {\n sessionData.isExpired = true;\n }\n this.store.set(sessionData);\n };\n }\n\n /**\n * Restores the tracker's original `sendHitTask` to the state before\n * session control was initialized and removes this instance from the global\n * store.\n */\n destroy() {\n MethodChain.remove(this.tracker, 'sendHitTask', this.sendHitTaskOverride);\n this.store.destroy();\n delete instances[this.tracker.get('trackingId')];\n }\n}\n\n\nSession.DEFAULT_TIMEOUT = 30; // minutes\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {NULL_DIMENSION} from '../constants';\nimport MethodChain from '../method-chain';\nimport provide from '../provide';\nimport Session from '../session';\nimport Store from '../store';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj, deferUntilPluginsLoaded,\n isObject, now, uuid} from '../utilities';\n\n\nconst HIDDEN = 'hidden';\nconst VISIBLE = 'visible';\nconst PAGE_ID = uuid();\nconst SECONDS = 1000;\n\n\n/**\n * Class for the `pageVisibilityTracker` analytics.js plugin.\n * @implements {PageVisibilityTrackerPublicInterface}\n */\nclass PageVisibilityTracker {\n /**\n * Registers outbound link tracking on tracker object.\n * @param {!Tracker} tracker Passed internally by analytics.js\n * @param {?Object} opts Passed by the require command.\n */\n constructor(tracker, opts) {\n trackUsage(tracker, plugins.PAGE_VISIBILITY_TRACKER);\n\n // Feature detects to prevent errors in unsupporting browsers.\n if (!document.visibilityState) return;\n\n /** @type {PageVisibilityTrackerOpts} */\n const defaultOpts = {\n sessionTimeout: Session.DEFAULT_TIMEOUT,\n visibleThreshold: 5 * SECONDS,\n // timeZone: undefined,\n sendInitialPageview: false,\n // pageLoadsMetricIndex: undefined,\n // visibleMetricIndex: undefined,\n fieldsObj: {},\n // hitFilter: undefined\n };\n\n this.opts = /** @type {PageVisibilityTrackerOpts} */ (\n assign(defaultOpts, opts));\n\n this.tracker = tracker;\n this.lastPageState = document.visibilityState;\n this.visibleThresholdTimeout_ = null;\n this.isInitialPageviewSent_ = false;\n\n // Binds methods to `this`.\n this.trackerSetOverride = this.trackerSetOverride.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleWindowUnload = this.handleWindowUnload.bind(this);\n this.handleExternalStoreSet = this.handleExternalStoreSet.bind(this);\n\n // Creates the store and binds storage change events.\n this.store = Store.getOrCreate(\n tracker.get('trackingId'), 'plugins/page-visibility-tracker');\n this.store.on('externalSet', this.handleExternalStoreSet);\n\n // Creates the session and binds session events.\n this.session = Session.getOrCreate(\n tracker, this.opts.sessionTimeout, this.opts.timeZone);\n\n // Override the built-in tracker.set method to watch for changes.\n MethodChain.add(tracker, 'set', this.trackerSetOverride);\n\n window.addEventListener('unload', this.handleWindowUnload);\n document.addEventListener('visibilitychange', this.handleChange);\n\n // Postpone sending any hits until the next call stack, which allows all\n // autotrack plugins to be required sync before any hits are sent.\n deferUntilPluginsLoaded(this.tracker, () => {\n if (document.visibilityState == VISIBLE) {\n if (this.opts.sendInitialPageview) {\n this.sendPageview({isPageLoad: true});\n this.isInitialPageviewSent_ = true;\n }\n this.store.set(/** @type {PageVisibilityStoreData} */ ({\n time: now(),\n state: VISIBLE,\n pageId: PAGE_ID,\n sessionId: this.session.getId(),\n }));\n } else {\n if (this.opts.sendInitialPageview && this.opts.pageLoadsMetricIndex) {\n this.sendPageLoad();\n }\n }\n });\n }\n\n /**\n * Inspects the last visibility state change data and determines if a\n * visibility event needs to be tracked based on the current visibility\n * state and whether or not the session has expired. If the session has\n * expired, a change to `visible` will trigger an additional pageview.\n * This method also sends as the event value (and optionally a custom metric)\n * the elapsed time between this event and the previously reported change\n * in the same session, allowing you to more accurately determine when users\n * were actually looking at your page versus when it was in the background.\n */\n handleChange() {\n if (!(document.visibilityState == VISIBLE ||\n document.visibilityState == HIDDEN)) {\n return;\n }\n\n const lastStoredChange = this.getAndValidateChangeData();\n\n /** @type {PageVisibilityStoreData} */\n const change = {\n time: now(),\n state: document.visibilityState,\n pageId: PAGE_ID,\n sessionId: this.session.getId(),\n };\n\n // If the visibilityState has changed to visible and the initial pageview\n // has not been sent (and the `sendInitialPageview` option is `true`).\n // Send the initial pageview now.\n if (document.visibilityState == VISIBLE &&\n this.opts.sendInitialPageview && !this.isInitialPageviewSent_) {\n this.sendPageview();\n this.isInitialPageviewSent_ = true;\n }\n\n // If the visibilityState has changed to hidden, clear any scheduled\n // pageviews waiting for the visibleThreshold timeout.\n if (document.visibilityState == HIDDEN && this.visibleThresholdTimeout_) {\n clearTimeout(this.visibleThresholdTimeout_);\n }\n\n if (this.session.isExpired(lastStoredChange.sessionId)) {\n this.store.clear();\n if (this.lastPageState == HIDDEN &&\n document.visibilityState == VISIBLE) {\n // If the session has expired, changes from hidden to visible should\n // be considered a new pageview rather than a visibility event.\n // This behavior ensures all sessions contain a pageview so\n // session-level page dimensions and metrics (e.g. ga:landingPagePath\n // and ga:entrances) are correct.\n // Also, in order to prevent false positives, we add a small timeout\n // that is cleared if the visibilityState changes to hidden shortly\n // after the change to visible. This can happen if a user is quickly\n // switching through their open tabs but not actually interacting with\n // and of them. It can also happen when a user goes to a tab just to\n // immediately close it. Such cases should not be considered pageviews.\n clearTimeout(this.visibleThresholdTimeout_);\n this.visibleThresholdTimeout_ = setTimeout(() => {\n this.store.set(change);\n this.sendPageview({hitTime: change.time});\n }, this.opts.visibleThreshold);\n }\n } else {\n if (lastStoredChange.pageId == PAGE_ID &&\n lastStoredChange.state == VISIBLE) {\n this.sendPageVisibilityEvent(lastStoredChange);\n }\n this.store.set(change);\n }\n\n this.lastPageState = document.visibilityState;\n }\n\n /**\n * Retroactively updates the stored change data in cases where it's known to\n * be out of sync.\n * This plugin keeps track of each visiblity change and stores the last one\n * in localStorage. LocalStorage is used to handle situations where the user\n * has multiple page open at the same time and we don't want to\n * double-report page visibility in those cases.\n * However, a problem can occur if a user closes a page when one or more\n * visible pages are still open. In such cases it's impossible to know\n * which of the remaining pages the user will interact with next.\n * To solve this problem we wait for the next change on any page and then\n * retroactively update the stored data to reflect the current page as being\n * the page on which the last change event occured and measure visibility\n * from that point.\n * @return {!PageVisibilityStoreData}\n */\n getAndValidateChangeData() {\n const lastStoredChange =\n /** @type {PageVisibilityStoreData} */ (this.store.get());\n\n if (this.lastPageState == VISIBLE &&\n lastStoredChange.state == HIDDEN &&\n lastStoredChange.pageId != PAGE_ID) {\n lastStoredChange.state = VISIBLE;\n lastStoredChange.pageId = PAGE_ID;\n this.store.set(lastStoredChange);\n }\n return lastStoredChange;\n }\n\n /**\n * Sends a Page Visibility event to track the time this page was in the\n * visible state (assuming it was in that state long enough to meet the\n * threshold).\n * @param {!PageVisibilityStoreData} lastStoredChange\n * @param {{hitTime: (number|undefined)}=} param1\n * - hitTime: A hit timestap used to help ensure original order in cases\n * where the send is delayed.\n */\n sendPageVisibilityEvent(lastStoredChange, {hitTime} = {}) {\n const delta = this.getTimeSinceLastStoredChange(\n lastStoredChange, {hitTime});\n\n // If the detla is greater than the visibileThreshold, report it.\n if (delta && delta >= this.opts.visibleThreshold) {\n const deltaInSeconds = Math.round(delta / SECONDS);\n\n /** @type {FieldsObj} */\n const defaultFields = {\n transport: 'beacon',\n nonInteraction: true,\n eventCategory: 'Page Visibility',\n eventAction: 'track',\n eventValue: deltaInSeconds,\n eventLabel: NULL_DIMENSION,\n };\n\n if (hitTime) {\n defaultFields.queueTime = now() - hitTime;\n }\n\n // If a custom metric was specified, set it equal to the event value.\n if (this.opts.visibleMetricIndex) {\n defaultFields['metric' + this.opts.visibleMetricIndex] = deltaInSeconds;\n }\n\n this.tracker.send('event',\n createFieldsObj(defaultFields, this.opts.fieldsObj,\n this.tracker, this.opts.hitFilter));\n }\n }\n\n /**\n * Sends a page load event.\n */\n sendPageLoad() {\n /** @type {FieldsObj} */\n const defaultFields = {\n transport: 'beacon',\n eventCategory: 'Page Visibility',\n eventAction: 'page load',\n eventLabel: NULL_DIMENSION,\n ['metric' + this.opts.pageLoadsMetricIndex]: 1,\n nonInteraction: true,\n };\n this.tracker.send('event',\n createFieldsObj(defaultFields, this.opts.fieldsObj,\n this.tracker, this.opts.hitFilter));\n }\n\n /**\n * Sends a pageview, optionally calculating an offset if hitTime is passed.\n * @param {{\n * hitTime: (number|undefined),\n * isPageLoad: (boolean|undefined)\n * }=} param1\n * hitTime: The timestamp of the current hit.\n * isPageLoad: True if this pageview was also a page load.\n */\n sendPageview({hitTime, isPageLoad} = {}) {\n /** @type {FieldsObj} */\n const defaultFields = {transport: 'beacon'};\n if (hitTime) {\n defaultFields.queueTime = now() - hitTime;\n }\n if (isPageLoad && this.opts.pageLoadsMetricIndex) {\n defaultFields['metric' + this.opts.pageLoadsMetricIndex] = 1;\n }\n\n this.tracker.send('pageview',\n createFieldsObj(defaultFields, this.opts.fieldsObj,\n this.tracker, this.opts.hitFilter));\n }\n\n /**\n * Detects changes to the tracker object and triggers an update if the page\n * field has changed.\n * @param {function((Object|string), (string|undefined))} originalMethod\n * A reference to the overridden method.\n * @return {function((Object|string), (string|undefined))}\n */\n trackerSetOverride(originalMethod) {\n return (field, value) => {\n /** @type {!FieldsObj} */\n const fields = isObject(field) ? field : {[field]: value};\n if (fields.page && fields.page !== this.tracker.get('page')) {\n if (this.lastPageState == VISIBLE) {\n this.handleChange();\n }\n }\n originalMethod(field, value);\n };\n }\n\n /**\n * Calculates the time since the last visibility change event in the current\n * session. If the session has expired the reported time is zero.\n * @param {PageVisibilityStoreData} lastStoredChange\n * @param {{hitTime: (number|undefined)}=} param1\n * hitTime: The time of the current hit (defaults to now).\n * @return {number} The time (in ms) since the last change.\n */\n getTimeSinceLastStoredChange(lastStoredChange, {hitTime} = {}) {\n return lastStoredChange.time ?\n (hitTime || now()) - lastStoredChange.time : 0;\n }\n\n /**\n * Handles responding to the `storage` event.\n * The code on this page needs to be informed when other tabs or windows are\n * updating the stored page visibility state data. This method checks to see\n * if a hidden state is stored when there are still visible tabs open, which\n * can happen if multiple windows are open at the same time.\n * @param {PageVisibilityStoreData} newData\n * @param {PageVisibilityStoreData} oldData\n */\n handleExternalStoreSet(newData, oldData) {\n // If the change times are the same, then the previous write only\n // updated the active page ID. It didn't enter a new state and thus no\n // hits should be sent.\n if (newData.time == oldData.time) return;\n\n // Page Visibility events must be sent by the tracker on the page\n // where the original event occurred. So if a change happens on another\n // page, but this page is where the previous change event occurred, then\n // this page is the one that needs to send the event (so all dimension\n // data is correct).\n if (oldData.pageId == PAGE_ID &&\n oldData.state == VISIBLE &&\n !this.session.isExpired(oldData.sessionId)) {\n this.sendPageVisibilityEvent(oldData, {hitTime: newData.time});\n }\n }\n\n /**\n * Handles responding to the `unload` event.\n * Since some browsers don't emit a `visibilitychange` event in all cases\n * where a page might be unloaded, it's necessary to hook into the `unload`\n * event to ensure the correct state is always stored.\n */\n handleWindowUnload() {\n // If the stored visibility state isn't hidden when the unload event\n // fires, it means the visibilitychange event didn't fire as the document\n // was being unloaded, so we invoke it manually.\n if (this.lastPageState != HIDDEN) {\n this.handleChange();\n }\n }\n\n /**\n * Removes all event listeners and restores overridden methods.\n */\n remove() {\n this.store.destroy();\n this.session.destroy();\n MethodChain.remove(this.tracker, 'set', this.trackerSetOverride);\n window.removeEventListener('unload', this.handleWindowUnload);\n document.removeEventListener('visibilitychange', this.handleChange);\n }\n}\n\n\nprovide('pageVisibilityTracker', PageVisibilityTracker);\n"]}