{"version":3,"file":"telemetry.dojo.min.js","sources":["../src/request.js","../src/amazon/auth.js","../src/amazon/user.js","../src/amazon/signer.js","../src/amazon/index.js","../src/google/index.js","../src/storage.js","../src/crypto.js","../src/anonymize.js","../src/internal-orgs.js","../src/telemetry-enabled.js","../src/index.js"],"sourcesContent":["export default function request (options, callback) {\n const req = new XMLHttpRequest() //eslint-disable-line\n req.addEventListener('load', () => {\n callback(req.responseText)\n })\n\n req.open(options.method, options.url)\n\n Object.keys(options.headers).forEach(header => {\n req.setRequestHeader(header, options.headers[header])\n })\n\n req.send(options.body)\n}\n","import request from '../request'\nimport Storage from '../storage'\n\nconst COGNITO_KEY = 'TELEMETRY_COGNITO_CREDENTIALS'\nconst COGNITO_URL = 'https://cognito-identity.us-east-1.amazonaws.com/'\n\nexport function getCredentials (IdentityPoolId, callback) {\n let cached = Storage.get(COGNITO_KEY)\n if (cached && Date.now() / 1000 < cached.Expiration) return callback(cached)\n\n authWithCognito(IdentityPoolId, credentials => {\n Storage.set(COGNITO_KEY, credentials)\n callback(credentials)\n })\n}\n\nfunction authWithCognito (IdentityPoolId, callback) {\n const options = Object.assign({}, defaults)\n options.headers['X-Amz-Target'] = 'AWSCognitoIdentityService.GetId'\n options.body = JSON.stringify({ IdentityPoolId })\n\n request(options, response => {\n requestCredentials(JSON.parse(response), callback)\n })\n}\n\nfunction requestCredentials (json, callback) {\n const options = Object.assign({}, defaults)\n options.headers['X-Amz-Target'] = 'AWSCognitoIdentityService.GetCredentialsForIdentity'\n options.body = JSON.stringify({ IdentityId: json.IdentityId })\n\n request(options, response => {\n const json = JSON.parse(response)\n callback(json.Credentials)\n })\n}\n\nconst defaults = {\n method: 'POST',\n url: COGNITO_URL,\n headers: {\n 'Content-type': 'application/x-amz-json-1.1'\n }\n}\n","import Storage from '../storage'\n\nconst SESSION_LENGTH = 30 * 60 * 1000\nconst SESSION_KEY = 'TELEMETRY_SESSION'\nconst CLIENT_KEY = 'TELEMETRY_CLIENT_ID'\n\nexport function getUser () {\n return {\n session: getSession(),\n id: getClientID()\n }\n}\n\nfunction getSession () {\n let newSession\n let session = Storage.get(SESSION_KEY)\n if (!session || Date.now() > session.expiration) {\n newSession = true\n session = generateNewSession()\n }\n session.expiration = Date.now() + SESSION_LENGTH\n Storage.set(SESSION_KEY, session)\n if (newSession) session.new = true\n return session\n}\n\nfunction getClientID () {\n let id = Storage.get(CLIENT_KEY)\n if (!id) {\n id = generateNewClientID()\n Storage.set(CLIENT_KEY, id)\n }\n return id\n}\n\nfunction generateNewSession () {\n return {\n id: Math.floor((1 + Math.random()) * 0x100000000000).toString(16),\n startTimestamp: new Date().toISOString()\n }\n}\n\n/*\n\nCopyright 2016 Amazon.com, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nfunction generateNewClientID () {\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4()\n}\n\nfunction s4 () {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1)\n}\n","//\n// AWS Signature v4 Implementation for Web Browsers\n//\n// Copyright (c) 2016 Daniel Joos\n//\n// Distributed under MIT license. (See file LICENSE)\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport CryptoJS from '../crypto'\n\nvar defaultConfig = {\n region: 'eu-west-1',\n service: 'execute-api',\n defaultContentType: 'application/json',\n defaultAcceptType: 'application/json',\n payloadSerializerFactory: JsonPayloadSerializer,\n uriParserFactory: SimpleUriParser,\n hasherFactory: CryptoJSHasher\n}\n\n/**\n * Create a new signer object with the given configuration.\n * Configuration must specify the AWS credentials used for the signing operation.\n * It must contain the following properties:\n * `accessKeyId`: The AWS IAM access key ID.\n * `secretAccessKey`: The AWS IAM secret key.\n * `sessionToken`: Optional session token, required for temporary credentials.\n * @param {object} config The configuration object.\n * @constructor\n */\nexport default class AwsSigner {\n constructor (config) {\n this.config = extend({}, defaultConfig, config)\n this.payloadSerializer = this.config.payloadSerializer ||\n this.config.payloadSerializerFactory()\n this.uriParser = this.config.uriParserFactory()\n this.hasher = this.config.hasherFactory()\n assertRequired(this.config.accessKeyId, 'AwsSigner requires AWS AccessKeyID')\n assertRequired(this.config.secretAccessKey, 'AwsSigner requires AWS SecretAccessKey')\n }\n /**\n * Create signature headers for the given request.\n * Request must be in the format, known from the `$http` service of Angular:\n * ```\n * request = {\n * headers: { ... },\n * method: 'GET',\n * url: 'http://...',\n * params: { ... },\n * data: ... // alternative: body\n * };\n * ```\n * The resulting object contains the signature headers. For example, it can be merged into an\n * existing `$http` config when dealing with Angular JS.\n * @param {object} request The request to create the signature for. Will not be modified!\n * @param {Date=} signDate Optional signature date to use. Current date-time is used if not specified.\n * @returns Signed request headers.\n */\n sign (request, signDate) {\n var workingSet = {\n request: extend({}, request),\n signDate: signDate || new Date(),\n uri: this.uriParser(request.url)\n }\n prepare(this, workingSet)\n buildCanonicalRequest(this, workingSet) // Step1: build the canonical request\n buildStringToSign(this, workingSet) // Step2: build the string to sign\n calculateSignature(this, workingSet) // Step3: calculate the signature hash\n buildSignatureHeader(this, workingSet) // Step4: build the authorization header\n return {\n 'Accept': workingSet.request.headers['accept'],\n 'Authorization': workingSet.authorization,\n 'Content-Type': workingSet.request.headers['content-type'],\n 'x-amz-date': workingSet.request.headers['x-amz-date'],\n 'x-amz-security-token': this.config.sessionToken || undefined\n }\n };\n};\n\n// Some preparations\nfunction prepare (self, ws) {\n var headers = {\n 'host': ws.uri.host,\n 'content-type': self.config.defaultContentType,\n 'accept': self.config.defaultAcceptType,\n 'x-amz-date': amzDate(ws.signDate)\n }\n // Payload or not?\n ws.request.method = ws.request.method.toUpperCase()\n if (ws.request.body) {\n ws.payload = ws.request.body\n } else if (ws.request.data && self.payloadSerializer) {\n ws.payload = self.payloadSerializer(ws.request.data)\n } else {\n delete headers['content-type']\n }\n // Headers\n ws.request.headers = extend(\n headers,\n Object.keys(ws.request.headers || {}).reduce(function (normalized, key) {\n normalized[key.toLowerCase()] = ws.request.headers[key]\n return normalized\n }, {})\n )\n ws.sortedHeaderKeys = Object.keys(ws.request.headers).sort()\n // Remove content-type parameters as some browser might change them on send\n if (ws.request.headers['content-type']) {\n ws.request.headers['content-type'] = ws.request.headers['content-type'].split(';')[0]\n }\n // Merge params to query params\n if (typeof (ws.request.params) === 'object') {\n extend(ws.uri.queryParams, ws.request.params)\n }\n}\n\n// Convert the request to a canonical format.\nfunction buildCanonicalRequest (self, ws) {\n ws.signedHeaders = ws.sortedHeaderKeys.map(function (key) {\n return key.toLowerCase()\n }).join(';')\n ws.canonicalRequest = String(ws.request.method).toUpperCase() + '\\n' +\n // Canonical URI:\n encodeURI(ws.uri.path) + '\\n' +\n // Canonical Query String:\n Object.keys(ws.uri.queryParams).sort().map(function (key) {\n return encodeURIComponent(key) + '=' +\n encodeURIComponent(ws.uri.queryParams[key])\n }).join('&') + '\\n' +\n // Canonical Headers:\n ws.sortedHeaderKeys.map(function (key) {\n return key.toLocaleLowerCase() + ':' + ws.request.headers[key]\n }).join('\\n') + '\\n\\n' +\n // Signed Headers:\n ws.signedHeaders + '\\n' +\n // Hashed Payload\n self.hasher.hash((ws.payload) ? ws.payload : '')\n}\n\n// Construct the string that will be signed.\nfunction buildStringToSign (self, ws) {\n ws.credentialScope = [amzDate(ws.signDate, true), self.config.region, self.config.service,\n 'aws4_request'].join('/')\n ws.stringToSign = 'AWS4-HMAC-SHA256' + '\\n' +\n amzDate(ws.signDate) + '\\n' +\n ws.credentialScope + '\\n' +\n self.hasher.hash(ws.canonicalRequest)\n}\n\n// Calculate the signature\nfunction calculateSignature (self, ws) {\n var hmac = self.hasher.hmac\n var signKey = hmac(\n hmac(\n hmac(\n hmac(\n 'AWS4' + self.config.secretAccessKey,\n amzDate(ws.signDate, true),\n {hexOutput: false}\n ),\n self.config.region,\n {hexOutput: false, textInput: false}\n ),\n self.config.service,\n {hexOutput: false, textInput: false}\n ),\n 'aws4_request',\n {hexOutput: false, textInput: false}\n )\n ws.signature = hmac(signKey, ws.stringToSign, {textInput: false})\n}\n\n// Build the signature HTTP header using the data in the working set.\nfunction buildSignatureHeader (self, ws) {\n ws.authorization = 'AWS4-HMAC-SHA256 ' +\n 'Credential=' + self.config.accessKeyId + '/' + ws.credentialScope + ', ' +\n 'SignedHeaders=' + ws.signedHeaders + ', ' +\n 'Signature=' + ws.signature\n}\n\n// Format the given `Date` as AWS compliant date string.\n// Time part gets omitted if second argument is set to `true`.\nfunction amzDate (date, short) {\n var result = date.toISOString().replace(/[:\\-]|\\.\\d{3}/g, '').substr(0, 17) // eslint-disable-line\n if (short) {\n return result.substr(0, 8)\n }\n return result\n}\n\n/**\n * Payload serializer factory implementation that converts the data to a JSON string.\n */\nfunction JsonPayloadSerializer () {\n return function (data) {\n return JSON.stringify(data)\n }\n}\n\n/**\n * Simple URI parser factory.\n * Uses an `a` document element for parsing given URIs.\n * Therefore it most likely will only work in a web browser.\n */\nfunction SimpleUriParser () {\n var parser = document ? document.createElement('a') : {}\n\n /**\n * Parse the given URI.\n * @param {string} uri The URI to parse.\n * @returns JavaScript object with the parse results:\n * `protocol`: The URI protocol part.\n * `host`: Host part of the URI.\n * `path`: Path part of the URI, always starting with a `/`\n * `queryParams`: Query parameters as JavaScript object.\n */\n return function (uri) {\n parser.href = uri\n return {\n protocol: parser.protocol,\n host: parser.host.replace(/^(.*):((80)|(443))$/, '$1'),\n path: ((parser.pathname.charAt(0) !== '/') ? '/' : '') + parser.pathname,\n queryParams: extractQueryParams(parser.search)\n }\n }\n\n function extractQueryParams (search) {\n return /^\\??(.*)$/.exec(search)[1].split('&').reduce(function (result, arg) {\n arg = /^(.+)=(.*)$/.exec(arg)\n if (arg) {\n result[arg[1]] = arg[2]\n }\n return result\n }, {})\n }\n}\n\n/**\n * Hash factory implementation using the SHA-256 hash algorithm of CryptoJS.\n * Requires at least the CryptoJS rollups: `sha256.js` and `hmac-sha256.js`.\n */\nfunction CryptoJSHasher () {\n return {\n /**\n * Hash the given input using SHA-256 algorithm.\n * The options can be used to control the in-/output of the hash operation.\n * @param {*} input Input data.\n * @param {object} options Options object:\n * `hexOutput` -- Output the hash with hex encoding (default: `true`).\n * `textInput` -- Interpret the input data as text (default: `true`).\n * @returns The generated hash\n */\n hash: function (input, options) {\n options = extend({hexOutput: true, textInput: true}, options)\n var hash = CryptoJS.SHA256(input)\n if (options.hexOutput) {\n return hash.toString(CryptoJS.enc.Hex)\n }\n return hash\n },\n\n /**\n * Create the HMAC of the given input data with the given key using the SHA-256\n * hash algorithm.\n * The options can be used to control the in-/output of the hash operation.\n * @param {string} key Secret key.\n * @param {*} input Input data.\n * @param {object} options Options object:\n * `hexOutput` -- Output the hash with hex encoding (default: `true`).\n * `textInput` -- Interpret the input data as text (default: `true`).\n * @returns The generated HMAC.\n */\n hmac: function (key, input, options) {\n options = extend({hexOutput: true, textInput: true}, options)\n var hmac = CryptoJS.HmacSHA256(input, key, {asBytes: true})\n if (options.hexOutput) {\n return hmac.toString(CryptoJS.enc.Hex)\n }\n return hmac\n }\n }\n}\n\n// Simple version of the `extend` function, known from Angular and Backbone.\n// It merges the second (and all succeeding) argument(s) into the object, given as first\n// argument. This is done recursively for all child objects, as well.\nfunction extend (dest) {\n var objs = [].slice.call(arguments, 1)\n objs.forEach(function (obj) {\n if (!obj || typeof (obj) !== 'object') {\n return\n }\n Object.keys(obj).forEach(function (key) {\n var src = obj[key]\n if (typeof (src) === 'undefined') {\n return\n }\n if (src !== null && typeof (src) === 'object') {\n dest[key] = (Array.isArray(src) ? [] : {})\n extend(dest[key], src)\n } else {\n dest[key] = src\n }\n })\n })\n return dest\n}\n\n// Throw an error if the given object is undefined.\nfunction assertRequired (obj, msg) {\n if (typeof (obj) === 'undefined' || !obj) {\n throw new Error(msg)\n }\n}\n","import { getCredentials } from './auth'\nimport { getUser } from './user'\nimport AwsSigner from './signer'\nimport request from '../request'\n\nconst METRICS = ['size', 'duration', 'position', 'number', 'count']\nconst DEFAULT_ENDPOINT = 'https://mobileanalytics.us-east-1.amazonaws.com/2014-06-05/events'\n\nexport default class Amazon {\n constructor (options) {\n this.name = 'amazon'\n Object.assign(this, options)\n const session = getUser().session\n if (session.new && !options.test) this.logEvent({ eventType: '_session.start' })\n }\n\n logPageView (page, options) {\n const event = createPageView(page, this.previousPage, options)\n sendTelemetry(event, this.userPoolID, this.app)\n this.previousPage = event.attributes\n }\n\n logEvent (event) {\n const events = createEventLog(event)\n sendTelemetry(events, this.userPoolID, this.app)\n }\n}\n\nfunction createPageView (page, previousPage = {}, options = {}) {\n const session = getUser().session\n return {\n eventType: 'pageView',\n timestamp: new Date().toISOString(),\n session: {\n id: session.id,\n startTimestamp: session.startTimestamp\n },\n attributes: {\n referrer: document.referrer,\n hostname: window.location.hostname,\n path: page || window.location.pathname,\n pageUrl: page || window.location.pathname,\n pageName: document.title,\n previousPageUrl: previousPage.pageUrl,\n previousPageName: previousPage.pageName,\n ...extractAttributes(options)\n },\n metrics: extractMetrics(options)\n }\n}\n\nfunction createEventLog (event) {\n const session = getUser().session\n return {\n eventType: event.eventType || 'other',\n timestamp: new Date().toISOString(),\n session: {\n id: session.id,\n startTimestamp: session.startTimestamp\n },\n attributes: {\n referrer: document.referrer,\n hostname: window.location.hostname,\n path: window.location.pathname,\n ...extractAttributes(event)\n },\n metrics: extractMetrics(event)\n }\n}\n\nfunction extractAttributes (event) {\n const attributes = Object.assign({}, event)\n delete attributes.workflow\n METRICS.forEach(metric => delete attributes[metric])\n Object.keys(attributes).forEach(attr => {\n if (attr === 'json') {\n attributes[attr] = attributes[attr] ? JSON.stringify(attributes[attr]) : 'null'\n } else {\n attributes[attr] = attributes[attr] !== undefined ? attributes[attr].toString() : 'null'\n }\n })\n return attributes\n}\n\nfunction extractMetrics (event) {\n const metrics = {}\n METRICS.forEach(metric => {\n if (event[metric]) metrics[metric] = event[metric]\n })\n return metrics\n}\n\nfunction createHeaders (credentials = {}, options) {\n const config = {\n region: 'us-east-1',\n service: 'mobileanalytics',\n accessKeyId: credentials.AccessKeyId,\n secretAccessKey: credentials.SecretKey,\n sessionToken: credentials.SessionToken\n }\n const signer = new AwsSigner(config)\n const signed = signer.sign(options)\n return signed\n}\n\nfunction createClientContext (clientId, app) {\n // eslint-disable-line\n return JSON.stringify({\n client: {\n client_id: clientId,\n app_title: app.name,\n app_version_name: app.version || 'unknown'\n },\n services: {\n mobile_analytics: {\n app_id: app.id\n }\n }\n })\n}\n\nfunction sendTelemetry (events, userPoolID, app) {\n const user = getUser()\n events = Array.isArray(events) ? events : [events]\n const options = createTelemetryOptions(events)\n getCredentials(userPoolID, credentials => {\n try {\n options.headers = createHeaders(credentials, options)\n options.headers['x-amz-Client-Context'] = createClientContext(user.id, app)\n } catch (e) {\n console.error(e)\n return\n }\n request(options, response => {\n if (response) {\n console.error(JSON.parse(response))\n }\n })\n })\n}\n\nfunction createTelemetryOptions (events, url = DEFAULT_ENDPOINT) {\n return {\n url,\n method: 'POST',\n body: JSON.stringify({\n events\n })\n }\n}\n","export default class Google {\n constructor (options = {}) {\n this.name = 'google'\n Object.assign(this, options)\n }\n\n logPageView (page, options) {\n const pageviewObj = buildPageViewObject(page, options, this.dimensions, this.metrics)\n getTrackers((trackers) => {\n trackers.forEach((tracker) => {\n tracker.send(pageviewObj)\n })\n })\n }\n\n logEvent (event) {\n const eventObject = buildEventObject(event, this.dimensions, this.metrics)\n getTrackers(trackers => {\n trackers.forEach(tracker => {\n tracker.send(eventObject)\n })\n })\n }\n}\n\nfunction getTrackers (callback) {\n if (window.ga) {\n window.ga(() => {\n callback(window.ga.getAll())\n })\n } else {\n console.log(new Error('Google Analytics trackers not available'))\n }\n}\n\nfunction buildPageViewObject (page, options, dimensions = {}, metrics = {}) {\n const pageviewObject = {\n hitType: 'pageview',\n page: page || window.location.pathname\n }\n\n return mapMetricsAndDimensions(pageviewObject, options, dimensions, metrics)\n}\n\nfunction buildEventObject (event, dimensions = {}, metrics = {}) {\n const eventObject = {\n hitType: 'event',\n eventCategory: event.category || 'none',\n eventAction: event.action,\n eventLabel: event.label,\n nonInteraction: event.nonInteraction\n }\n\n return mapMetricsAndDimensions(eventObject, event, dimensions, metrics)\n}\n\nfunction mapMetricsAndDimensions (inputObject, options, dimensions, metrics) {\n let mappedObject = inputObject\n\n Object.keys(dimensions).forEach(dimension => {\n mappedObject[`dimension${dimensions[dimension]}`] = options[dimension]\n })\n\n Object.keys(metrics).forEach(metric => {\n mappedObject[`metric${metrics[metric]}`] = options[metric]\n })\n\n return mappedObject\n}\n","export default {\n storage: {},\n memory: true,\n get (key) {\n let stored\n try {\n stored = (window.localStorage && window.localStorage.getItem(key)) || this.storage[key]\n } catch (e) {\n stored = this.storage[key]\n }\n if (stored) {\n try {\n return JSON.parse(stored)\n } catch (e) {\n return undefined\n }\n } else {\n return undefined\n }\n },\n set (key, value) {\n // handle Safari private mode (setItem is not allowed)\n value = JSON.stringify(value)\n try {\n window.localStorage.setItem(key, value)\n } catch (e) {\n if (!this.memory) {\n console.error('setting local storage failed, falling back to in-memory storage')\n this.memory = true\n }\n this.storage[key] = value\n }\n },\n delete (key) {\n try {\n window.localStorage.removeItem(key)\n } catch (e) {\n if (!this.memory) {\n console.error('setting local storage failed, falling back to in-memory storage')\n this.memory = true\n }\n delete this.storage[key]\n }\n }\n}\n","/*\n(c) 2009-2013 by Jeff Mott. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer.\nRedistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation or other materials provided with the distribution.\nNeither the name CryptoJS nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS,\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\nvar CryptoJS = (function (h, s) {\n var f = {}, g = f.lib = {}, q = function () {}, m = g.Base = {extend: function (a) { q.prototype = this; var c = new q(); a && c.mixIn(a); c.hasOwnProperty('init') || (c.init = function () { c.$super.init.apply(this, arguments) }); c.init.prototype = c; c.$super = this; return c }, create: function () { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function () {}, mixIn: function (a) { for (var c in a)a.hasOwnProperty(c) && (this[c] = a[c]); a.hasOwnProperty('toString') && (this.toString = a.toString) }, clone: function () { return this.init.prototype.extend(this) }},\n r = g.WordArray = m.extend({init: function (a, c) { a = this.words = a || []; this.sigBytes = c != s ? c : 4 * a.length }, toString: function (a) { return (a || k).stringify(this) }, concat: function (a) { var c = this.words, d = a.words, b = this.sigBytes; a = a.sigBytes; this.clamp(); if (b % 4) for (var e = 0; e < a; e++)c[b + e >>> 2] |= (d[e >>> 2] >>> 24 - 8 * (e % 4) & 255) << 24 - 8 * ((b + e) % 4); else if (d.length > 65535) for (e = 0; e < a; e += 4)c[b + e >>> 2] = d[e >>> 2]; else c.push.apply(c, d); this.sigBytes += a; return this }, clamp: function () {\n var a = this.words, c = this.sigBytes; a[c >>> 2] &= 4294967295 <<\n32 - 8 * (c % 4); a.length = h.ceil(c / 4)\n }, clone: function () { var a = m.clone.call(this); a.words = this.words.slice(0); return a }, random: function (a) { for (var c = [], d = 0; d < a; d += 4)c.push(4294967296 * h.random() | 0); return new r.init(c, a) }}), l = f.enc = {}, k = l.Hex = {stringify: function (a) { var c = a.words; a = a.sigBytes; for (var d = [], b = 0; b < a; b++) { var e = c[b >>> 2] >>> 24 - 8 * (b % 4) & 255; d.push((e >>> 4).toString(16)); d.push((e & 15).toString(16)) } return d.join('') }, parse: function (a) {\n for (var c = a.length, d = [], b = 0; b < c; b += 2) {\n d[b >>> 3] |= parseInt(a.substr(b,\n2), 16) << 24 - 4 * (b % 8)\n } return new r.init(d, c / 2)\n }}, n = l.Latin1 = {stringify: function (a) { var c = a.words; a = a.sigBytes; for (var d = [], b = 0; b < a; b++)d.push(String.fromCharCode(c[b >>> 2] >>> 24 - 8 * (b % 4) & 255)); return d.join('') }, parse: function (a) { for (var c = a.length, d = [], b = 0; b < c; b++)d[b >>> 2] |= (a.charCodeAt(b) & 255) << 24 - 8 * (b % 4); return new r.init(d, c) }}, j = l.Utf8 = {stringify: function (a) { try { return decodeURIComponent(escape(n.stringify(a))) } catch (c) { throw Error('Malformed UTF-8 data') } }, parse: function (a) { return n.parse(unescape(encodeURIComponent(a))) }},\n u = g.BufferedBlockAlgorithm = m.extend({reset: function () { this._data = new r.init(); this._nDataBytes = 0 }, _append: function (a) { typeof a === 'string' && (a = j.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function (a) { var c = this._data, d = c.words, b = c.sigBytes, e = this.blockSize, f = b / (4 * e), f = a ? h.ceil(f) : h.max((f | 0) - this._minBufferSize, 0); a = f * e; b = h.min(4 * a, b); if (a) { for (var g = 0; g < a; g += e) this._doProcessBlock(d, g); g = d.splice(0, a); c.sigBytes -= b } return new r.init(g, b) }, clone: function () {\n var a = m.clone.call(this)\n a._data = this._data.clone(); return a\n }, _minBufferSize: 0}); g.Hasher = u.extend({cfg: m.extend(), init: function (a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function () { u.reset.call(this); this._doReset() }, update: function (a) { this._append(a); this._process(); return this }, finalize: function (a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function (a) { return function (c, d) { return (new a.init(d)).finalize(c) } }, _createHmacHelper: function (a) {\n return function (c, d) {\n return (new t.HMAC.init(a,\nd)).finalize(c)\n }\n }}); var t = f.algo = {}; return f\n}(Math));\n(function (h) {\n for (var s = CryptoJS, f = s.lib, g = f.WordArray, q = f.Hasher, f = s.algo, m = [], r = [], l = function (a) { return 4294967296 * (a - (a | 0)) | 0 }, k = 2, n = 0; n < 64;) { var j; a: { j = k; for (var u = h.sqrt(j), t = 2; t <= u; t++) if (!(j % t)) { j = !1; break a }j = !0 }j && (n < 8 && (m[n] = l(h.pow(k, 0.5))), r[n] = l(h.pow(k, 1 / 3)), n++); k++ } var a = [], f = f.SHA256 = q.extend({_doReset: function () { this._hash = new g.init(m.slice(0)) }, _doProcessBlock: function (c, d) {\n for (var b = this._hash.words, e = b[0], f = b[1], g = b[2], j = b[3], h = b[4], m = b[5], n = b[6], q = b[7], p = 0; p < 64; p++) {\n if (p < 16) {\n a[p] =\nc[d + p] | 0\n } else { var k = a[p - 15], l = a[p - 2]; a[p] = ((k << 25 | k >>> 7) ^ (k << 14 | k >>> 18) ^ k >>> 3) + a[p - 7] + ((l << 15 | l >>> 17) ^ (l << 13 | l >>> 19) ^ l >>> 10) + a[p - 16] }k = q + ((h << 26 | h >>> 6) ^ (h << 21 | h >>> 11) ^ (h << 7 | h >>> 25)) + (h & m ^ ~h & n) + r[p] + a[p]; l = ((e << 30 | e >>> 2) ^ (e << 19 | e >>> 13) ^ (e << 10 | e >>> 22)) + (e & f ^ e & g ^ f & g); q = n; n = m; m = h; h = j + k | 0; j = g; g = f; f = e; e = k + l | 0\n }b[0] = b[0] + e | 0; b[1] = b[1] + f | 0; b[2] = b[2] + g | 0; b[3] = b[3] + j | 0; b[4] = b[4] + h | 0; b[5] = b[5] + m | 0; b[6] = b[6] + n | 0; b[7] = b[7] + q | 0\n }, _doFinalize: function () {\n var a = this._data, d = a.words, b = 8 * this._nDataBytes, e = 8 * a.sigBytes\n d[e >>> 5] |= 128 << 24 - e % 32; d[(e + 64 >>> 9 << 4) + 14] = h.floor(b / 4294967296); d[(e + 64 >>> 9 << 4) + 15] = b; a.sigBytes = 4 * d.length; this._process(); return this._hash\n }, clone: function () { var a = q.clone.call(this); a._hash = this._hash.clone(); return a }}); s.SHA256 = q._createHelper(f); s.HmacSHA256 = q._createHmacHelper(f)\n})(Math);\n(function () {\n var h = CryptoJS, s = h.enc.Utf8; h.algo.HMAC = h.lib.Base.extend({init: function (f, g) { f = this._hasher = new f.init(); typeof g === 'string' && (g = s.parse(g)); var h = f.blockSize, m = 4 * h; g.sigBytes > m && (g = f.finalize(g)); g.clamp(); for (var r = this._oKey = g.clone(), l = this._iKey = g.clone(), k = r.words, n = l.words, j = 0; j < h; j++)k[j] ^= 1549556828, n[j] ^= 909522486; r.sigBytes = l.sigBytes = m; this.reset() }, reset: function () { var f = this._hasher; f.reset(); f.update(this._iKey) }, update: function (f) { this._hasher.update(f); return this }, finalize: function (f) {\n var g =\nthis._hasher; f = g.finalize(f); g.reset(); return g.finalize(this._oKey.clone().concat(f))\n }})\n})()\n\nexport default CryptoJS\n","import Crypto from './crypto'\n\nexport default function (user) {\n if (!user) return undefined\n return Crypto.SHA256(user).toString(Crypto.enc.Hex)\n}\n","export default [\n 'esri.com',\n 'esriuk.com',\n 'esri.de',\n 'esri.ca',\n 'esrifrance.fr',\n 'esri.nl',\n 'esri-portugal.pt',\n 'esribulgaria.com',\n 'esri.fi',\n 'esri.kr',\n 'esrimalaysia.com.my',\n 'esri.es',\n 'esriaustralia.com.au',\n 'esri-southafrica.com',\n 'esri.cl',\n 'esrichina.com.cn',\n 'esri.co',\n 'esriturkey.com.tr',\n 'geodata.no',\n 'esriitalia.it',\n 'esri.pl'\n]\n","/*\n * Determines whether or not the telemetry library should be enabled based on passed in options\n */\nexport default function (options = {}) {\n const portal = options.portal || {}\n if (options.disabled) {\n // Tracking is manually disabled\n return false\n } else if (navigator.doNotTrack === '1' || window.doNotTrack === '1') {\n // user's browser has turned off tracking\n return false\n } else if (typeof portal.eueiEnabled !== 'undefined' && portal.eueiEnabled === false) {\n // Portal does not allow tracking\n return false\n } else if (portal.eueiEnabled && portal.user && portal.user.orgId === portal.id) {\n // Portal allows tracking; except when user is anonymous or doesn't belong to portal's org\n return true\n } else if (portal.user && !portal.user.orgId && portal.ipCntryCode === 'US') {\n // Public user in the United States on a portal that allows tracking\n return true\n } else if (!portal.user && portal.ipCntryCode === 'US') {\n // Anonymous user in the United States on a portal that allows tracking\n return true\n } else if (Object.keys(portal).length > 0) {\n // Initialized with a Portal object but does not meet tracking conditions\n return false\n } else {\n // Default condition not initialized with a Portal-Self object\n return true\n }\n}\n","import Amazon from './amazon'\nimport Google from './google'\nimport anonymize from './anonymize'\nimport internalOrgs from './internal-orgs'\nimport telemetryEnabled from './telemetry-enabled'\nimport storage from './storage'\n\nexport default class Telemetry {\n constructor (options) {\n // Make sure failure to init this library cannot have side-effects\n try {\n this.trackers = []\n this.workflows = {}\n this.test = options.test\n this.debug = options.debug\n\n this.disabled = !telemetryEnabled(options)\n if (this.disabled) console.log('Telemetry Disabled')\n\n if (options.portal && options.portal.user) {\n const subscriptionInfo = options.portal.subscriptionInfo || {}\n this.setUser(options.portal.user, subscriptionInfo.type)\n } else if (options.user) {\n this.setUser(options.user)\n }\n\n if (!this.disabled) {\n this._initTrackers(options)\n }\n } catch (e) {\n console.error('Telemetry Disabled')\n console.error(e)\n this.disabled = true\n }\n }\n\n _initTrackers (options) {\n if (options.amazon) {\n const amazon = new Amazon(options.amazon)\n this.trackers.push(amazon)\n }\n\n if (options.google) {\n const google = new Google(options.google)\n this.trackers.push(google)\n }\n if (!this.trackers.length) console.error(new Error('No trackers configured'))\n }\n\n setUser (user = {}, orgType = 'Public') {\n user = typeof user === 'string' ? { username: user } : user\n this.user = user\n this.user.accountType = orgType\n let internalDomain\n if (user.email && user.email.split) {\n const domain = user.email.split('@')[1]\n internalDomain =\n internalOrgs.filter(org => {\n return domain === org\n }).length > 0\n }\n\n if (internalDomain || ['In House', 'Demo and Marketing'].indexOf(orgType) > -1) {\n this.user.internalUser = true\n }\n }\n\n logPageView (page, options = {}) {\n const attributes = this.preProcess(options)\n if (this.debug) console.log('Tracking page view', JSON.stringify(attributes))\n else if (this.test && !this.disabled) return attributes\n\n if (!this.trackers.length || this.disabled) {\n if (!this.disabled) console.error(new Error('Page view was not logged because no trackers are configured.'))\n return false\n } else {\n this.trackers.forEach(tracker => {\n try {\n tracker.logPageView(page, attributes)\n } catch (e) {\n console.error(`${tracker.name} tracker failed to log page view.`, e)\n }\n })\n return true\n }\n }\n\n logEvent (options = {}) {\n const event = this.preProcess(options)\n\n if (this.debug) console.log('Tracking event', JSON.stringify(event))\n else if (this.test) return event\n\n if (!this.trackers.length || this.disabled) {\n if (!this.disabled) console.error(new Error('Event was not logged because no trackers are configured.'))\n return false\n } else {\n this.trackers.forEach(tracker => {\n try {\n tracker.logEvent(event)\n } catch (e) {\n console.error(`${tracker.name} tracker failed to log event`, e)\n }\n })\n return true\n }\n }\n\n logError (options = {}) {\n const event = Object.assign({ eventType: 'error' }, options)\n this.logEvent(event)\n }\n\n startWorkflow (name, attributes = {}) {\n const workflow = {\n name,\n start: Date.now(),\n steps: [],\n workflowId: Math.floor((1 + Math.random()) * 0x100000000000).toString(16)\n }\n this._saveWorkflow(workflow)\n const workflowObj = Object.assign({ name, step: 'start' }, attributes)\n this._logWorkflow(workflowObj)\n return workflow\n }\n\n stepWorkflow (name, step, attributes = {}) {\n const details = typeof options === 'string' ? attributes : attributes.details\n const workflowObj = Object.assign({ name, step, details }, attributes)\n this._logWorkflow(workflowObj)\n }\n\n endWorkflow (name, attributes = {}) {\n const workflowObj = Object.assign({ name, step: 'finish' }, attributes)\n this._logWorkflow(workflowObj)\n }\n\n cancelWorkflow (name, attributes = {}) {\n const workflowObj = Object.assign({ name, step: 'cancel' }, attributes)\n this._logWorkflow(workflowObj)\n }\n\n getWorkflow (name) {\n const workflow = storage.get(`TELEMETRY-WORKFLOW:${name}`)\n // do not let old workflows be returned\n if (workflow) {\n const workflowAge = Date.now() - workflow.start\n const timeout = 30 * 60 * 1000\n if (workflowAge < timeout) {\n return workflow\n } else {\n this._deleteWorkflow(workflow)\n }\n }\n }\n\n _saveWorkflow (workflow) {\n storage.set(`TELEMETRY-WORKFLOW:${workflow.name}`, workflow)\n }\n\n _deleteWorkflow (workflow) {\n storage.delete(`TELEMETRY-WORKFLOW:${workflow.name}`)\n }\n\n _logWorkflow (options = {}) {\n /*\n const workflow = {\n name: 'add layer to map',\n step: 'start',\n details: 'some details about the step'\n }\n */\n options = this.preProcess(options)\n let workflow = this.getWorkflow(options.name)\n if (!workflow) {\n this.startWorkflow(options.name)\n workflow = this.getWorkflow(options.name)\n }\n workflow.steps.push(options.step)\n workflow.duration = (Date.now() - workflow.start) / 1000\n\n if (['cancel', 'finish'].indexOf(options.step) > -1) {\n this._deleteWorkflow(workflow)\n } else {\n this._saveWorkflow(workflow)\n }\n\n const track = Object.assign(options, {\n eventType: 'workflow',\n category: options.name,\n action: options.step,\n label: options.details,\n duration: workflow.duration,\n workflowId: workflow.workflowId\n })\n\n this.logEvent(track)\n }\n\n preProcess (options = {}) {\n let userOptions = {}\n if (this.user) {\n userOptions = {\n user: anonymize(this.user.username),\n org: anonymize(this.user.orgId),\n lastLogin: this.user.lastLogin,\n userSince: this.user.created,\n internalUser: this.user.internalUser || false,\n accountType: this.user.accountType\n }\n }\n\n return Object.assign({}, options, userOptions)\n }\n}\n"],"names":["request","options","callback","req","XMLHttpRequest","addEventListener","responseText","open","method","url","keys","headers","forEach","setRequestHeader","header","send","body","getCredentials","IdentityPoolId","cached","Storage","get","COGNITO_KEY","Date","now","Expiration","set","credentials","authWithCognito","babelHelpers.extends","defaults","JSON","stringify","parse","response","requestCredentials","json","IdentityId","Credentials","getUser","getSession","getClientID","newSession","session","SESSION_KEY","expiration","generateNewSession","SESSION_LENGTH","new","id","CLIENT_KEY","generateNewClientID","Math","floor","random","toString","toISOString","s4","substring","prepare","self","ws","uri","host","config","defaultContentType","defaultAcceptType","amzDate","signDate","toUpperCase","payload","data","payloadSerializer","extend","Object","reduce","normalized","key","toLowerCase","sortedHeaderKeys","sort","split","babelHelpers.typeof","params","queryParams","buildCanonicalRequest","signedHeaders","map","join","canonicalRequest","String","path","encodeURIComponent","toLocaleLowerCase","hasher","hash","buildStringToSign","credentialScope","region","service","stringToSign","calculateSignature","hmac","signKey","secretAccessKey","hexOutput","textInput","signature","buildSignatureHeader","authorization","accessKeyId","date","short","result","replace","substr","JsonPayloadSerializer","SimpleUriParser","extractQueryParams","search","exec","arg","parser","document","createElement","href","protocol","pathname","charAt","CryptoJSHasher","input","CryptoJS","SHA256","enc","Hex","HmacSHA256","asBytes","dest","slice","call","arguments","obj","src","Array","isArray","assertRequired","msg","Error","createPageView","page","previousPage","startTimestamp","referrer","window","location","hostname","title","pageUrl","pageName","extractAttributes","extractMetrics","createEventLog","event","eventType","attributes","workflow","metric","attr","undefined","metrics","createHeaders","AccessKeyId","SecretKey","SessionToken","AwsSigner","sign","createClientContext","clientId","app","name","version","sendTelemetry","events","userPoolID","user","createTelemetryOptions","e","error","DEFAULT_ENDPOINT","getTrackers","ga","getAll","log","buildPageViewObject","dimensions","mapMetricsAndDimensions","buildEventObject","category","action","label","nonInteraction","inputObject","mappedObject","dimension","stored","localStorage","getItem","this","storage","value","setItem","memory","removeItem","h","s","f","g","lib","q","m","Base","a","prototype","c","mixIn","hasOwnProperty","init","$super","apply","create","clone","r","WordArray","words","sigBytes","length","k","concat","d","b","clamp","push","ceil","l","parseInt","n","Latin1","fromCharCode","charCodeAt","j","Utf8","decodeURIComponent","escape","unescape","u","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","blockSize","max","_minBufferSize","min","_doProcessBlock","splice","Hasher","cfg","_doReset","update","finalize","_doFinalize","_createHelper","_createHmacHelper","t","HMAC","algo","sqrt","pow","_hash","p","_hasher","_oKey","_iKey","defaultConfig","payloadSerializerFactory","uriParser","uriParserFactory","hasherFactory","workingSet","sessionToken","METRICS","Amazon","test","logEvent","Google","pageviewObj","trackers","tracker","eventObject","Crypto","portal","disabled","navigator","doNotTrack","eueiEnabled","orgId","ipCntryCode","workflows","debug","telemetryEnabled","console","subscriptionInfo","setUser","type","_initTrackers","amazon","google","orgType","username","accountType","internalDomain","email","domain","internalOrgs","filter","org","indexOf","internalUser","preProcess","logPageView","_saveWorkflow","workflowObj","step","_logWorkflow","details","start","_deleteWorkflow","delete","getWorkflow","startWorkflow","steps","duration","track","workflowId","userOptions","anonymize","lastLogin","created"],"mappings":"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"}