{"version":3,"file":"ldclient.min.js","sources":["../node_modules/launchdarkly-js-sdk-common/src/errors.js","../node_modules/base64-js/index.js","../node_modules/launchdarkly-js-sdk-common/node_modules/fast-deep-equal/index.js","../node_modules/launchdarkly-js-sdk-common/src/utils.js","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/regex.js","../node_modules/uuid/dist/esm-browser/validate.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/v1.js","../node_modules/uuid/dist/esm-browser/parse.js","../node_modules/uuid/dist/esm-browser/v35.js","../node_modules/uuid/dist/esm-browser/md5.js","../node_modules/uuid/dist/esm-browser/v3.js","../node_modules/uuid/dist/esm-browser/sha1.js","../node_modules/uuid/dist/esm-browser/v5.js","../node_modules/uuid/dist/esm-browser/v4.js","../node_modules/uuid/dist/esm-browser/nil.js","../node_modules/uuid/dist/esm-browser/version.js","../node_modules/launchdarkly-js-sdk-common/src/loggers.js","../node_modules/launchdarkly-js-sdk-common/src/messages.js","../node_modules/launchdarkly-js-sdk-common/src/configuration.js","../node_modules/launchdarkly-js-sdk-common/src/headers.js","../node_modules/launchdarkly-js-sdk-common/src/EventSender.js","../node_modules/launchdarkly-js-sdk-common/src/context.js","../node_modules/launchdarkly-js-sdk-common/src/EventSummarizer.js","../node_modules/launchdarkly-js-sdk-common/src/attributeReference.js","../node_modules/launchdarkly-js-sdk-common/src/ContextFilter.js","../node_modules/launchdarkly-js-sdk-common/src/EventProcessor.js","../node_modules/launchdarkly-js-sdk-common/src/EventEmitter.js","../node_modules/launchdarkly-js-sdk-common/src/InitializationState.js","../node_modules/launchdarkly-js-sdk-common/src/PersistentFlagStore.js","../node_modules/launchdarkly-js-sdk-common/src/PersistentStorage.js","../node_modules/launchdarkly-js-sdk-common/src/Stream.js","../node_modules/launchdarkly-js-sdk-common/src/promiseCoalescer.js","../node_modules/launchdarkly-js-sdk-common/src/Requestor.js","../node_modules/launchdarkly-js-sdk-common/src/Identity.js","../node_modules/launchdarkly-js-sdk-common/src/AnonymousContextProcessor.js","../node_modules/launchdarkly-js-sdk-common/src/diagnosticEvents.js","../node_modules/launchdarkly-js-sdk-common/src/SafeInspector.js","../node_modules/launchdarkly-js-sdk-common/src/InspectorManager.js","../node_modules/launchdarkly-js-sdk-common/src/index.js","../src/basicLogger.js","../src/httpRequest.js","../node_modules/escape-string-regexp/index.js","../src/GoalTracker.js","../src/GoalManager.js","../src/index.js","../src/browserPlatform.js"],"sourcesContent":["function createCustomError(name) {\n function CustomError(message, code) {\n Error.captureStackTrace && Error.captureStackTrace(this, this.constructor);\n this.message = message;\n this.code = code;\n }\n\n CustomError.prototype = new Error();\n CustomError.prototype.name = name;\n CustomError.prototype.constructor = CustomError;\n\n return CustomError;\n}\n\nconst LDUnexpectedResponseError = createCustomError('LaunchDarklyUnexpectedResponseError');\nconst LDInvalidEnvironmentIdError = createCustomError('LaunchDarklyInvalidEnvironmentIdError');\nconst LDInvalidUserError = createCustomError('LaunchDarklyInvalidUserError');\nconst LDInvalidEventKeyError = createCustomError('LaunchDarklyInvalidEventKeyError');\nconst LDInvalidArgumentError = createCustomError('LaunchDarklyInvalidArgumentError');\nconst LDFlagFetchError = createCustomError('LaunchDarklyFlagFetchError');\nconst LDInvalidDataError = createCustomError('LaunchDarklyInvalidDataError');\n\nfunction isHttpErrorRecoverable(status) {\n if (status >= 400 && status < 500) {\n return status === 400 || status === 408 || status === 429;\n }\n return true;\n}\n\nmodule.exports = {\n LDUnexpectedResponseError,\n LDInvalidEnvironmentIdError,\n LDInvalidUserError,\n LDInvalidEventKeyError,\n LDInvalidArgumentError,\n LDInvalidDataError,\n LDFlagFetchError,\n isHttpErrorRecoverable,\n};\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","'use strict';\n\nvar isArray = Array.isArray;\nvar keyList = Object.keys;\nvar hasProp = Object.prototype.hasOwnProperty;\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n var arrA = isArray(a)\n , arrB = isArray(b)\n , i\n , length\n , key;\n\n if (arrA && arrB) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n if (arrA != arrB) return false;\n\n var dateA = a instanceof Date\n , dateB = b instanceof Date;\n if (dateA != dateB) return false;\n if (dateA && dateB) return a.getTime() == b.getTime();\n\n var regexpA = a instanceof RegExp\n , regexpB = b instanceof RegExp;\n if (regexpA != regexpB) return false;\n if (regexpA && regexpB) return a.toString() == b.toString();\n\n var keys = keyList(a);\n length = keys.length;\n\n if (length !== keyList(b).length)\n return false;\n\n for (i = length; i-- !== 0;)\n if (!hasProp.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n key = keys[i];\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n return a!==a && b!==b;\n};\n","const base64 = require('base64-js');\nconst fastDeepEqual = require('fast-deep-equal');\n\nconst userAttrsToStringify = ['key', 'ip', 'country', 'email', 'firstName', 'lastName', 'avatar', 'name'];\n\nfunction appendUrlPath(baseUrl, path) {\n // Ensure that URL concatenation is done correctly regardless of whether the\n // base URL has a trailing slash or not.\n const trimBaseUrl = baseUrl.endsWith('/') ? baseUrl.substring(0, baseUrl.length - 1) : baseUrl;\n return trimBaseUrl + (path.startsWith('/') ? '' : '/') + path;\n}\n\n// See http://ecmanaut.blogspot.com/2006/07/encoding-decoding-utf8-in-javascript.html\nfunction btoa(s) {\n const escaped = unescape(encodeURIComponent(s));\n return base64.fromByteArray(stringToBytes(escaped));\n}\n\nfunction stringToBytes(s) {\n const b = [];\n for (let i = 0; i < s.length; i++) {\n b.push(s.charCodeAt(i));\n }\n return b;\n}\n\nfunction base64URLEncode(s) {\n return (\n btoa(s)\n // eslint-disable-next-line\n .replace(/=/g, '')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n );\n}\n\nfunction clone(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\n\nfunction deepEquals(a, b) {\n return fastDeepEqual(a, b);\n}\n\n// Events emitted in LDClient's initialize method will happen before the consumer\n// can register a listener, so defer them to next tick.\nfunction onNextTick(cb) {\n setTimeout(cb, 0);\n}\n\n/**\n * Wrap a promise to invoke an optional callback upon resolution or rejection.\n *\n * This function assumes the callback follows the Node.js callback type: (err, value) => void\n *\n * If a callback is provided:\n * - if the promise is resolved, invoke the callback with (null, value)\n * - if the promise is rejected, invoke the callback with (error, null)\n *\n * @param {Promise} promise\n * @param {Function} callback\n * @returns Promise | undefined\n */\nfunction wrapPromiseCallback(promise, callback) {\n const ret = promise.then(\n value => {\n if (callback) {\n setTimeout(() => {\n callback(null, value);\n }, 0);\n }\n return value;\n },\n error => {\n if (callback) {\n setTimeout(() => {\n callback(error, null);\n }, 0);\n } else {\n return Promise.reject(error);\n }\n }\n );\n\n return !callback ? ret : undefined;\n}\n\n/**\n * Takes a map of flag keys to values, and returns the more verbose structure used by the\n * client stream.\n */\nfunction transformValuesToVersionedValues(flags) {\n const ret = {};\n for (const key in flags) {\n if (objectHasOwnProperty(flags, key)) {\n ret[key] = { value: flags[key], version: 0 };\n }\n }\n return ret;\n}\n\n/**\n * Converts the internal flag state map to a simple map of flag keys to values.\n */\nfunction transformVersionedValuesToValues(flagsState) {\n const ret = {};\n for (const key in flagsState) {\n if (objectHasOwnProperty(flagsState, key)) {\n ret[key] = flagsState[key].value;\n }\n }\n return ret;\n}\n\n/**\n * Returns an array of event groups each of which can be safely URL-encoded\n * without hitting the safe maximum URL length of certain browsers.\n *\n * @param {number} maxLength maximum URL length targeted\n * @param {Array[Object}]} events queue of events to divide\n * @returns Array[Array[Object]]\n */\nfunction chunkEventsForUrl(maxLength, events) {\n const allEvents = events.slice(0);\n const allChunks = [];\n let remainingSpace = maxLength;\n let chunk;\n\n while (allEvents.length > 0) {\n chunk = [];\n\n while (remainingSpace > 0) {\n const event = allEvents.shift();\n if (!event) {\n break;\n }\n remainingSpace = remainingSpace - base64URLEncode(JSON.stringify(event)).length;\n // If we are over the max size, put this one back on the queue\n // to try in the next round, unless this event alone is larger\n // than the limit, in which case, screw it, and try it anyway.\n if (remainingSpace < 0 && chunk.length > 0) {\n allEvents.unshift(event);\n } else {\n chunk.push(event);\n }\n }\n\n remainingSpace = maxLength;\n allChunks.push(chunk);\n }\n\n return allChunks;\n}\n\nfunction getLDUserAgentString(platform) {\n const version = platform.version || '?';\n return platform.userAgent + '/' + version;\n}\n\nfunction extend(...objects) {\n return objects.reduce((acc, obj) => ({ ...acc, ...obj }), {});\n}\n\nfunction objectHasOwnProperty(object, name) {\n return Object.prototype.hasOwnProperty.call(object, name);\n}\n\nfunction sanitizeContext(context) {\n if (!context) {\n return context;\n }\n let newContext;\n // Only stringify user attributes for legacy users.\n if (context.kind === null || context.kind === undefined) {\n userAttrsToStringify.forEach(attr => {\n const value = context[attr];\n if (value !== undefined && typeof value !== 'string') {\n newContext = newContext || { ...context };\n newContext[attr] = String(value);\n }\n });\n }\n\n return newContext || context;\n}\n\nmodule.exports = {\n appendUrlPath,\n base64URLEncode,\n btoa,\n chunkEventsForUrl,\n clone,\n deepEquals,\n extend,\n getLDUserAgentString,\n objectHasOwnProperty,\n onNextTick,\n sanitizeContext,\n transformValuesToVersionedValues,\n transformVersionedValuesToValues,\n wrapPromiseCallback,\n};\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","const logLevels = ['debug', 'info', 'warn', 'error', 'none'];\n\n/**\n * A simple logger that writes to stderr.\n */\nfunction commonBasicLogger(options, formatFn) {\n if (options && options.destination && typeof options.destination !== 'function') {\n throw new Error('destination for basicLogger was set to a non-function');\n }\n\n function toConsole(methodName) {\n // The global console variable is not guaranteed to be defined at all times in all browsers:\n // https://www.beyondjava.net/console-log-surprises-with-internet-explorer-11-and-edge\n return function(line) {\n if (console && console[methodName]) {\n console[methodName].call(console, line);\n }\n };\n }\n const destinations =\n options && options.destination\n ? [options.destination, options.destination, options.destination, options.destination]\n : [toConsole('log'), toConsole('info'), toConsole('warn'), toConsole('error')];\n const prependLevelToMessage = !!(options && options.destination); // if we're writing to console.warn, etc. we don't need the prefix\n const prefix =\n !options || options.prefix === undefined || options.prefix === null ? '[LaunchDarkly] ' : options.prefix;\n\n let minLevel = 1; // default is 'info'\n if (options && options.level) {\n for (let i = 0; i < logLevels.length; i++) {\n if (logLevels[i] === options.level) {\n minLevel = i;\n }\n }\n }\n\n function write(levelIndex, levelName, args) {\n if (args.length < 1) {\n return;\n }\n let line;\n const fullPrefix = prependLevelToMessage ? levelName + ': ' + prefix : prefix;\n if (args.length === 1 || !formatFn) {\n line = fullPrefix + args[0];\n } else {\n const tempArgs = [...args];\n tempArgs[0] = fullPrefix + tempArgs[0];\n line = formatFn(...tempArgs);\n }\n try {\n destinations[levelIndex](line);\n } catch (err) {\n console &&\n console.log &&\n console.log(\"[LaunchDarkly] Configured logger's \" + levelName + ' method threw an exception: ' + err);\n }\n }\n\n const logger = {};\n for (let i = 0; i < logLevels.length; i++) {\n const levelName = logLevels[i];\n if (levelName !== 'none') {\n if (i < minLevel) {\n logger[levelName] = () => {};\n } else {\n const levelIndex = i;\n logger[levelName] = function() {\n // can't use arrow function with \"arguments\"\n write(levelIndex, levelName, arguments);\n };\n }\n }\n }\n\n return logger;\n}\n\nfunction validateLogger(logger) {\n logLevels.forEach(level => {\n if (level !== 'none' && (!logger[level] || typeof logger[level] !== 'function')) {\n throw new Error('Provided logger instance must support logger.' + level + '(...) method');\n // Note that the SDK normally does not throw exceptions to the application, but that rule\n // does not apply to LDClient.init() which will throw an exception if the parameters are so\n // invalid that we cannot proceed with creating the client. An invalid logger meets those\n // criteria since the SDK calls the logger during nearly all of its operations.\n }\n });\n}\n\nmodule.exports = {\n commonBasicLogger,\n validateLogger,\n};\n","const errors = require('./errors');\n\nfunction errorString(err) {\n if (err && err.message) {\n return err.message;\n }\n if (typeof err === 'string' || err instanceof String) {\n return err;\n }\n return JSON.stringify(err);\n}\n\nconst clientInitialized = function() {\n return 'LaunchDarkly client initialized';\n};\n\nconst docLink =\n ' Please see https://docs.launchdarkly.com/sdk/client-side/javascript#initializing-the-client for instructions on SDK initialization.';\n\nconst clientNotReady = function() {\n return 'LaunchDarkly client is not ready';\n};\n\nconst eventCapacityExceeded = function() {\n return 'Exceeded event queue capacity. Increase capacity to avoid dropping events.';\n};\n\nconst eventWithoutContext = function() {\n return 'Be sure to call `identify` in the LaunchDarkly client: https://docs.launchdarkly.com/sdk/features/identify#javascript';\n};\n\nconst invalidContentType = function(contentType) {\n return 'Expected application/json content type but got \"' + contentType + '\"';\n};\n\nconst invalidKey = function() {\n return 'Event key must be a string';\n};\n\nconst localStorageUnavailable = function(err) {\n return 'local storage is unavailable: ' + errorString(err);\n};\n\nconst networkError = e => 'network error' + (e ? ' (' + e + ')' : '');\n\n// We should remove unknownCustomEventKey in the future - see comments in track() in index.js\nconst unknownCustomEventKey = function(key) {\n return 'Custom event \"' + key + '\" does not exist';\n};\n\nconst environmentNotFound = function() {\n return 'Environment not found. Double check that you specified a valid environment/client-side ID.' + docLink;\n};\n\nconst environmentNotSpecified = function() {\n return 'No environment/client-side ID was specified.' + docLink;\n};\n\nconst errorFetchingFlags = function(err) {\n return 'Error fetching flag settings: ' + errorString(err);\n};\n\nconst contextNotSpecified = function() {\n return 'No context specified.' + docLink;\n};\n\nconst invalidContext = function() {\n return 'Invalid context specified.' + docLink;\n};\n\nconst invalidData = function() {\n return 'Invalid data received from LaunchDarkly; connection may have been interrupted';\n};\n\nconst bootstrapOldFormat = function() {\n return (\n 'LaunchDarkly client was initialized with bootstrap data that did not include flag metadata. ' +\n 'Events may not be sent correctly.' +\n docLink\n );\n};\n\nconst bootstrapInvalid = function() {\n return 'LaunchDarkly bootstrap data is not available because the back end could not read the flags.';\n};\n\nconst deprecated = function(oldName, newName) {\n if (newName) {\n return '\"' + oldName + '\" is deprecated, please use \"' + newName + '\"';\n }\n return '\"' + oldName + '\" is deprecated';\n};\n\nconst httpErrorMessage = function(status, context, retryMessage) {\n return (\n 'Received error ' +\n status +\n (status === 401 ? ' (invalid SDK key)' : '') +\n ' for ' +\n context +\n ' - ' +\n (errors.isHttpErrorRecoverable(status) ? retryMessage : 'giving up permanently')\n );\n};\n\nconst httpUnavailable = function() {\n return 'Cannot make HTTP requests in this environment.' + docLink;\n};\n\nconst identifyDisabled = function() {\n return 'identify() has no effect here; it must be called on the main client instance';\n};\n\nconst streamClosing = function() {\n return 'Closing stream connection';\n};\n\nconst streamConnecting = function(url) {\n return 'Opening stream connection to ' + url;\n};\n\nconst streamError = function(err, streamReconnectDelay) {\n return (\n 'Error on stream connection: ' +\n errorString(err) +\n ', will continue retrying after ' +\n streamReconnectDelay +\n ' milliseconds.'\n );\n};\n\nconst unknownOption = name => 'Ignoring unknown config option \"' + name + '\"';\n\nconst unrecoverableStreamError = err => `Error on stream connection ${errorString(err)}, giving up permanently`;\n\nconst wrongOptionType = (name, expectedType, actualType) =>\n 'Config option \"' + name + '\" should be of type ' + expectedType + ', got ' + actualType + ', using default value';\n\nconst wrongOptionTypeBoolean = (name, actualType) =>\n 'Config option \"' + name + '\" should be a boolean, got ' + actualType + ', converting to boolean';\n\nconst optionBelowMinimum = (name, value, minimum) =>\n 'Config option \"' + name + '\" was set to ' + value + ', changing to minimum value of ' + minimum;\n\nconst debugPolling = function(url) {\n return 'polling for feature flags at ' + url;\n};\n\nconst debugStreamPing = function() {\n return 'received ping message from stream';\n};\n\nconst debugStreamPut = function() {\n return 'received streaming update for all flags';\n};\n\nconst debugStreamPatch = function(key) {\n return 'received streaming update for flag \"' + key + '\"';\n};\n\nconst debugStreamPatchIgnored = function(key) {\n return 'received streaming update for flag \"' + key + '\" but ignored due to version check';\n};\n\nconst debugStreamDelete = function(key) {\n return 'received streaming deletion for flag \"' + key + '\"';\n};\n\nconst debugStreamDeleteIgnored = function(key) {\n return 'received streaming deletion for flag \"' + key + '\" but ignored due to version check';\n};\n\nconst debugEnqueueingEvent = function(kind) {\n return 'enqueueing \"' + kind + '\" event';\n};\n\nconst debugPostingEvents = function(count) {\n return 'sending ' + count + ' events';\n};\n\nconst debugPostingDiagnosticEvent = function(event) {\n return 'sending diagnostic event (' + event.kind + ')';\n};\n\nconst invalidInspector = (type, name) => `an inspector: \"${name}\" of an invalid type (${type}) was configured`;\n\nconst inspectorMethodError = (type, name) => `an inspector: \"${name}\" of type: \"${type}\" generated an exception`;\n\nconst invalidTagValue = name => `Config option \"${name}\" must only contain letters, numbers, ., _ or -.`;\n\nconst tagValueTooLong = name => `Value of \"${name}\" was longer than 64 characters and was discarded.`;\n\nmodule.exports = {\n bootstrapInvalid,\n bootstrapOldFormat,\n clientInitialized,\n clientNotReady,\n debugEnqueueingEvent,\n debugPostingDiagnosticEvent,\n debugPostingEvents,\n debugStreamDelete,\n debugStreamDeleteIgnored,\n debugStreamPatch,\n debugStreamPatchIgnored,\n debugStreamPing,\n debugPolling,\n debugStreamPut,\n deprecated,\n environmentNotFound,\n environmentNotSpecified,\n errorFetchingFlags,\n eventCapacityExceeded,\n eventWithoutContext,\n httpErrorMessage,\n httpUnavailable,\n identifyDisabled,\n inspectorMethodError,\n invalidContentType,\n invalidData,\n invalidInspector,\n invalidKey,\n invalidContext,\n invalidTagValue,\n localStorageUnavailable,\n networkError,\n optionBelowMinimum,\n streamClosing,\n streamConnecting,\n streamError,\n tagValueTooLong,\n unknownCustomEventKey,\n unknownOption,\n contextNotSpecified,\n unrecoverableStreamError,\n wrongOptionType,\n wrongOptionTypeBoolean,\n};\n","const errors = require('./errors');\nconst { validateLogger } = require('./loggers');\nconst messages = require('./messages');\nconst utils = require('./utils');\n\n// baseOptionDefs should contain an entry for each supported configuration option in the common package.\n// Each entry can have three properties:\n// - \"default\": the default value if any\n// - \"type\": a type constraint used if the type can't be inferred from the default value). The allowable\n// values are \"boolean\", \"string\", \"number\", \"array\", \"object\", \"function\", or several of these OR'd\n// together with \"|\" (\"function|object\").\n// - \"minimum\": minimum value if any for numeric properties\n//\n// The extraOptionDefs parameter to validate() uses the same format.\nconst baseOptionDefs = {\n baseUrl: { default: 'https://app.launchdarkly.com' },\n streamUrl: { default: 'https://clientstream.launchdarkly.com' },\n eventsUrl: { default: 'https://events.launchdarkly.com' },\n sendEvents: { default: true },\n streaming: { type: 'boolean' }, // default for this is undefined, which is different from false\n sendLDHeaders: { default: true },\n requestHeaderTransform: { type: 'function' },\n sendEventsOnlyForVariation: { default: false },\n useReport: { default: false },\n evaluationReasons: { default: false },\n eventCapacity: { default: 100, minimum: 1 },\n flushInterval: { default: 2000, minimum: 2000 },\n samplingInterval: { default: 0, minimum: 0 },\n streamReconnectDelay: { default: 1000, minimum: 0 },\n allAttributesPrivate: { default: false },\n privateAttributes: { default: [] },\n bootstrap: { type: 'string|object' },\n diagnosticRecordingInterval: { default: 900000, minimum: 2000 },\n diagnosticOptOut: { default: false },\n wrapperName: { type: 'string' },\n wrapperVersion: { type: 'string' },\n stateProvider: { type: 'object' }, // not a public option, used internally\n application: { validator: applicationConfigValidator },\n inspectors: { default: [] },\n};\n\n/**\n * Expression to validate characters that are allowed in tag keys and values.\n */\nconst allowedTagCharacters = /^(\\w|\\.|-)+$/;\n\nfunction canonicalizeUrl(url) {\n return url && url.replace(/\\/+$/, '');\n}\n\n/**\n * Verify that a value meets the requirements for a tag value.\n * @param {string} tagValue\n * @param {Object} logger\n */\nfunction validateTagValue(name, tagValue, logger) {\n if (typeof tagValue !== 'string' || !tagValue.match(allowedTagCharacters)) {\n logger.warn(messages.invalidTagValue(name));\n return undefined;\n }\n if (tagValue.length > 64) {\n logger.warn(messages.tagValueTooLong(name));\n return undefined;\n }\n return tagValue;\n}\n\nfunction applicationConfigValidator(name, value, logger) {\n const validated = {};\n if (value.id) {\n validated.id = validateTagValue(`${name}.id`, value.id, logger);\n }\n if (value.version) {\n validated.version = validateTagValue(`${name}.version`, value.version, logger);\n }\n return validated;\n}\n\nfunction validate(options, emitter, extraOptionDefs, logger) {\n const optionDefs = utils.extend({ logger: { default: logger } }, baseOptionDefs, extraOptionDefs);\n\n const deprecatedOptions = {\n // As of the latest major version, there are no deprecated options. Next time we deprecate\n // something, add an item here where the property name is the deprecated name, and the\n // property value is the preferred name if any, or null/undefined if there is no replacement.\n };\n\n function checkDeprecatedOptions(config) {\n const opts = config;\n Object.keys(deprecatedOptions).forEach(oldName => {\n if (opts[oldName] !== undefined) {\n const newName = deprecatedOptions[oldName];\n logger && logger.warn(messages.deprecated(oldName, newName));\n if (newName) {\n if (opts[newName] === undefined) {\n opts[newName] = opts[oldName];\n }\n delete opts[oldName];\n }\n }\n });\n }\n\n function applyDefaults(config) {\n // This works differently from utils.extend() in that it *will not* override a default value\n // if the provided value is explicitly set to null. This provides backward compatibility\n // since in the past we only used the provided values if they were truthy.\n const ret = utils.extend({}, config);\n Object.keys(optionDefs).forEach(name => {\n if (ret[name] === undefined || ret[name] === null) {\n ret[name] = optionDefs[name] && optionDefs[name].default;\n }\n });\n return ret;\n }\n\n function validateTypesAndNames(config) {\n const ret = utils.extend({}, config);\n const typeDescForValue = value => {\n if (value === null) {\n return 'any';\n }\n if (value === undefined) {\n return undefined;\n }\n if (Array.isArray(value)) {\n return 'array';\n }\n const t = typeof value;\n if (t === 'boolean' || t === 'string' || t === 'number' || t === 'function') {\n return t;\n }\n return 'object';\n };\n Object.keys(config).forEach(name => {\n const value = config[name];\n if (value !== null && value !== undefined) {\n const optionDef = optionDefs[name];\n if (optionDef === undefined) {\n reportArgumentError(messages.unknownOption(name));\n } else {\n const expectedType = optionDef.type || typeDescForValue(optionDef.default);\n const validator = optionDef.validator;\n if (validator) {\n const validated = validator(name, config[name], logger);\n if (validated !== undefined) {\n ret[name] = validated;\n } else {\n delete ret[name];\n }\n } else if (expectedType !== 'any') {\n const allowedTypes = expectedType.split('|');\n const actualType = typeDescForValue(value);\n if (allowedTypes.indexOf(actualType) < 0) {\n if (expectedType === 'boolean') {\n ret[name] = !!value;\n reportArgumentError(messages.wrongOptionTypeBoolean(name, actualType));\n } else {\n reportArgumentError(messages.wrongOptionType(name, expectedType, actualType));\n ret[name] = optionDef.default;\n }\n } else {\n if (actualType === 'number' && optionDef.minimum !== undefined && value < optionDef.minimum) {\n reportArgumentError(messages.optionBelowMinimum(name, value, optionDef.minimum));\n ret[name] = optionDef.minimum;\n }\n }\n }\n }\n }\n });\n\n ret.baseUrl = canonicalizeUrl(ret.baseUrl);\n ret.streamUrl = canonicalizeUrl(ret.streamUrl);\n ret.eventsUrl = canonicalizeUrl(ret.eventsUrl);\n\n return ret;\n }\n\n function reportArgumentError(message) {\n utils.onNextTick(() => {\n emitter && emitter.maybeReportError(new errors.LDInvalidArgumentError(message));\n });\n }\n\n let config = utils.extend({}, options || {});\n\n checkDeprecatedOptions(config);\n\n config = applyDefaults(config);\n config = validateTypesAndNames(config);\n validateLogger(config.logger);\n\n return config;\n}\n\n/**\n * Get tags for the specified configuration.\n *\n * If any additional tags are added to the configuration, then the tags from\n * this method should be extended with those.\n * @param {Object} config The already valiated configuration.\n * @returns {Object} The tag configuration.\n */\nfunction getTags(config) {\n const tags = {};\n if (config) {\n if (config.application && config.application.id !== undefined && config.application.id !== null) {\n tags['application-id'] = [config.application.id];\n }\n if (config.application && config.application.version !== undefined && config.application.id !== null) {\n tags['application-version'] = [config.application.version];\n }\n }\n\n return tags;\n}\n\nmodule.exports = {\n baseOptionDefs,\n validate,\n getTags,\n};\n","const { getLDUserAgentString } = require('./utils');\nconst configuration = require('./configuration');\n\nfunction getLDHeaders(platform, options) {\n if (options && !options.sendLDHeaders) {\n return {};\n }\n const h = {};\n h[platform.userAgentHeaderName || 'User-Agent'] = getLDUserAgentString(platform);\n if (options && options.wrapperName) {\n h['X-LaunchDarkly-Wrapper'] = options.wrapperVersion\n ? options.wrapperName + '/' + options.wrapperVersion\n : options.wrapperName;\n }\n const tags = configuration.getTags(options);\n const tagKeys = Object.keys(tags);\n if (tagKeys.length) {\n h['x-launchdarkly-tags'] = tagKeys\n .sort()\n .map(\n key => (Array.isArray(tags[key]) ? tags[key].sort().map(value => `${key}/${value}`) : [`${key}/${tags[key]}`])\n )\n .reduce((flattened, item) => flattened.concat(item), [])\n .join(' ');\n }\n return h;\n}\n\nfunction transformHeaders(headers, options) {\n if (!options || !options.requestHeaderTransform) {\n return headers;\n }\n return options.requestHeaderTransform({ ...headers });\n}\n\nmodule.exports = {\n getLDHeaders,\n transformHeaders,\n};\n","const errors = require('./errors');\nconst utils = require('./utils');\nconst { v1: uuidv1 } = require('uuid');\nconst { getLDHeaders, transformHeaders } = require('./headers');\n\nconst MAX_URL_LENGTH = 2000;\n\nfunction EventSender(platform, environmentId, options) {\n const imageUrlPath = '/a/' + environmentId + '.gif';\n const baseHeaders = utils.extend({ 'Content-Type': 'application/json' }, getLDHeaders(platform, options));\n const httpFallbackPing = platform.httpFallbackPing; // this will be set for us if we're in the browser SDK\n const sender = {};\n\n function getResponseInfo(result) {\n const ret = { status: result.status };\n const dateStr = result.header('date');\n if (dateStr) {\n const time = Date.parse(dateStr);\n if (time) {\n ret.serverTime = time;\n }\n }\n return ret;\n }\n\n sender.sendChunk = (events, url, isDiagnostic, usePost) => {\n const jsonBody = JSON.stringify(events);\n const payloadId = isDiagnostic ? null : uuidv1();\n\n function doPostRequest(canRetry) {\n const headers = isDiagnostic\n ? baseHeaders\n : utils.extend({}, baseHeaders, {\n 'X-LaunchDarkly-Event-Schema': '4',\n 'X-LaunchDarkly-Payload-ID': payloadId,\n });\n return platform\n .httpRequest('POST', url, transformHeaders(headers, options), jsonBody)\n .promise.then(result => {\n if (!result) {\n // This was a response from a fire-and-forget request, so we won't have a status.\n return;\n }\n if (result.status >= 400 && errors.isHttpErrorRecoverable(result.status) && canRetry) {\n return doPostRequest(false);\n } else {\n return getResponseInfo(result);\n }\n })\n .catch(() => {\n if (canRetry) {\n return doPostRequest(false);\n }\n return Promise.reject();\n });\n }\n\n if (usePost) {\n return doPostRequest(true).catch(() => {});\n } else {\n httpFallbackPing && httpFallbackPing(url + imageUrlPath + '?d=' + utils.base64URLEncode(jsonBody));\n return Promise.resolve(); // we don't wait for this request to complete, it's just a one-way ping\n }\n };\n\n sender.sendEvents = function(events, url, isDiagnostic) {\n if (!platform.httpRequest) {\n return Promise.resolve();\n }\n const canPost = platform.httpAllowsPost();\n let chunks;\n if (canPost) {\n // no need to break up events into chunks if we can send a POST\n chunks = [events];\n } else {\n chunks = utils.chunkEventsForUrl(MAX_URL_LENGTH - url.length, events);\n }\n const results = [];\n for (let i = 0; i < chunks.length; i++) {\n results.push(sender.sendChunk(chunks[i], url, isDiagnostic, canPost));\n }\n return Promise.all(results);\n };\n\n return sender;\n}\n\nmodule.exports = EventSender;\n","/**\n * Validate a context kind.\n * @param {string} kind\n * @returns true if the kind is valid.\n */\nconst { commonBasicLogger } = require('./loggers');\n\nfunction validKind(kind) {\n return typeof kind === 'string' && kind !== 'kind' && kind.match(/^(\\w|\\.|-)+$/);\n}\n\n/**\n * Perform a check of basic context requirements.\n * @param {Object} context\n * @param {boolean} allowLegacyKey If true, then a legacy user can have an\n * empty or non-string key. A legacy user is a context without a kind.\n * @returns true if the context meets basic requirements.\n */\nfunction checkContext(context, allowLegacyKey) {\n if (context) {\n if (allowLegacyKey && (context.kind === undefined || context.kind === null)) {\n return context.key !== undefined && context.key !== null;\n }\n const key = context.key;\n const kind = context.kind === undefined ? 'user' : context.kind;\n const kindValid = validKind(kind);\n const keyValid = kind === 'multi' || (key !== undefined && key !== null && key !== '');\n if (kind === 'multi') {\n const kinds = Object.keys(context).filter(key => key !== 'kind');\n return (\n keyValid &&\n kinds.every(key => validKind(key)) &&\n kinds.every(key => {\n const contextKey = context[key].key;\n return contextKey !== undefined && contextKey !== null && contextKey !== '';\n })\n );\n }\n return keyValid && kindValid;\n }\n return false;\n}\n\n/**\n * For a given context get a list of context kinds.\n * @param {Object} context\n * @returns A list of kinds in the context.\n */\nfunction getContextKinds(context) {\n if (context) {\n if (context.kind === null || context.kind === undefined) {\n return ['user'];\n }\n if (context.kind !== 'multi') {\n return [context.kind];\n }\n return Object.keys(context).filter(kind => kind !== 'kind');\n }\n return [];\n}\n\n/**\n * The partial URL encoding is needed because : is a valid character in context keys.\n *\n * Partial encoding is the replacement of all colon (:) characters with the URL\n * encoded equivalent (%3A) and all percent (%) characters with the URL encoded\n * equivalent (%25).\n * @param {string} key The key to encode.\n * @returns {string} Partially URL encoded key.\n */\nfunction encodeKey(key) {\n if (key.includes('%') || key.includes(':')) {\n return key.replace(/%/g, '%25').replace(/:/g, '%3A');\n }\n return key;\n}\n\nfunction getCanonicalKey(context) {\n if (context) {\n if ((context.kind === undefined || context.kind === null || context.kind === 'user') && context.key) {\n return context.key;\n } else if (context.kind !== 'multi' && context.key) {\n return `${context.kind}:${encodeKey(context.key)}`;\n } else if (context.kind === 'multi') {\n return Object.keys(context)\n .sort()\n .filter(key => key !== 'kind')\n .map(key => `${key}:${encodeKey(context[key].key)}`)\n .join(':');\n }\n }\n}\n\nfunction getContextKeys(context, logger = commonBasicLogger()) {\n if (!context) {\n return undefined;\n }\n\n const keys = {};\n const { kind, key } = context;\n\n switch (kind) {\n case undefined:\n keys.user = `${key}`;\n break;\n case 'multi':\n Object.entries(context)\n .filter(([key]) => key !== 'kind')\n .forEach(([key, value]) => {\n if (value && value.key) {\n keys[key] = value.key;\n }\n });\n break;\n case null:\n logger.warn(`null is not a valid context kind: ${context}`);\n break;\n case '':\n logger.warn(`'' is not a valid context kind: ${context}`);\n break;\n default:\n keys[kind] = `${key}`;\n break;\n }\n\n return keys;\n}\n\nmodule.exports = {\n checkContext,\n getContextKeys,\n getContextKinds,\n getCanonicalKey,\n};\n","const { getContextKinds } = require('./context');\n\nfunction getKinds(event) {\n if (event.context) {\n return getContextKinds(event.context);\n }\n if (event.contextKeys) {\n return Object.keys(event.contextKeys);\n }\n return [];\n}\n\nfunction EventSummarizer() {\n const es = {};\n\n let startDate = 0,\n endDate = 0,\n counters = {},\n contextKinds = {};\n\n es.summarizeEvent = event => {\n if (event.kind === 'feature') {\n const counterKey =\n event.key +\n ':' +\n (event.variation !== null && event.variation !== undefined ? event.variation : '') +\n ':' +\n (event.version !== null && event.version !== undefined ? event.version : '');\n const counterVal = counters[counterKey];\n let kinds = contextKinds[event.key];\n if (!kinds) {\n kinds = new Set();\n contextKinds[event.key] = kinds;\n }\n getKinds(event).forEach(kind => kinds.add(kind));\n\n if (counterVal) {\n counterVal.count = counterVal.count + 1;\n } else {\n counters[counterKey] = {\n count: 1,\n key: event.key,\n version: event.version,\n variation: event.variation,\n value: event.value,\n default: event.default,\n };\n }\n if (startDate === 0 || event.creationDate < startDate) {\n startDate = event.creationDate;\n }\n if (event.creationDate > endDate) {\n endDate = event.creationDate;\n }\n }\n };\n\n es.getSummary = () => {\n const flagsOut = {};\n let empty = true;\n for (const c of Object.values(counters)) {\n let flag = flagsOut[c.key];\n if (!flag) {\n flag = {\n default: c.default,\n counters: [],\n contextKinds: [...contextKinds[c.key]],\n };\n flagsOut[c.key] = flag;\n }\n const counterOut = {\n value: c.value,\n count: c.count,\n };\n if (c.variation !== undefined && c.variation !== null) {\n counterOut.variation = c.variation;\n }\n if (c.version !== undefined && c.version !== null) {\n counterOut.version = c.version;\n } else {\n counterOut.unknown = true;\n }\n flag.counters.push(counterOut);\n empty = false;\n }\n return empty\n ? null\n : {\n startDate,\n endDate,\n features: flagsOut,\n };\n };\n\n es.clearSummary = () => {\n startDate = 0;\n endDate = 0;\n counters = {};\n contextKinds = {};\n };\n\n return es;\n}\n\nmodule.exports = EventSummarizer;\n","/**\n * Take a key string and escape the characters to allow it to be used as a reference.\n * @param {string} key\n * @returns {string} The processed key.\n */\nfunction processEscapeCharacters(key) {\n return key.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n\n/**\n * @param {string} reference The reference to get the components of.\n * @returns {string[]} The components of the reference. Escape characters will be converted to their representative values.\n */\nfunction getComponents(reference) {\n const referenceWithoutPrefix = reference.startsWith('/') ? reference.substring(1) : reference;\n return referenceWithoutPrefix\n .split('/')\n .map(component => (component.indexOf('~') >= 0 ? component.replace(/~1/g, '/').replace(/~0/g, '~') : component));\n}\n\n/**\n * @param {string} reference The reference to check if it is a literal.\n * @returns true if the reference is a literal.\n */\nfunction isLiteral(reference) {\n return !reference.startsWith('/');\n}\n\n/**\n * Compare two references and determine if they are equivalent.\n * @param {string} a\n * @param {string} b\n */\nfunction compare(a, b) {\n const aIsLiteral = isLiteral(a);\n const bIsLiteral = isLiteral(b);\n if (aIsLiteral && bIsLiteral) {\n return a === b;\n }\n if (aIsLiteral) {\n const bComponents = getComponents(b);\n if (bComponents.length !== 1) {\n return false;\n }\n return a === bComponents[0];\n }\n if (bIsLiteral) {\n const aComponents = getComponents(a);\n if (aComponents.length !== 1) {\n return false;\n }\n return b === aComponents[0];\n }\n return a === b;\n}\n\n/**\n * @param {string} a\n * @param {string} b\n * @returns The two strings joined by '/'.\n */\nfunction join(a, b) {\n return `${a}/${b}`;\n}\n\n/**\n * There are cases where a field could have been named with a preceeding '/'.\n * If that attribute was private, then the literal would appear to be a reference.\n * This method can be used to convert a literal to a reference in such situations.\n * @param {string} literal The literal to convert to a reference.\n * @returns A literal which has been converted to a reference.\n */\nfunction literalToReference(literal) {\n return `/${processEscapeCharacters(literal)}`;\n}\n\n/**\n * Clone an object excluding the values referenced by a list of references.\n * @param {Object} target The object to clone.\n * @param {string[]} references A list of references from the cloned object.\n * @returns {{cloned: Object, excluded: string[]}} The cloned object and a list of excluded values.\n */\nfunction cloneExcluding(target, references) {\n const stack = [];\n const cloned = {};\n const excluded = [];\n\n stack.push(\n ...Object.keys(target).map(key => ({\n key,\n ptr: literalToReference(key),\n source: target,\n parent: cloned,\n visited: [target],\n }))\n );\n\n while (stack.length) {\n const item = stack.pop();\n if (!references.some(ptr => compare(ptr, item.ptr))) {\n const value = item.source[item.key];\n\n // Handle null because it overlaps with object, which we will want to handle later.\n if (value === null) {\n item.parent[item.key] = value;\n } else if (Array.isArray(value)) {\n item.parent[item.key] = [...value];\n } else if (typeof value === 'object') {\n //Arrays and null must already be handled.\n\n //Prevent cycles by not visiting the same object\n //with in the same branch. Parallel branches\n //may contain the same object.\n if (item.visited.includes(value)) {\n continue;\n }\n\n item.parent[item.key] = {};\n\n stack.push(\n ...Object.keys(value).map(key => ({\n key,\n ptr: join(item.ptr, processEscapeCharacters(key)),\n source: value,\n parent: item.parent[item.key],\n visited: [...item.visited, value],\n }))\n );\n } else {\n item.parent[item.key] = value;\n }\n } else {\n excluded.push(item.ptr);\n }\n }\n return { cloned, excluded: excluded.sort() };\n}\n\nmodule.exports = {\n cloneExcluding,\n compare,\n literalToReference,\n};\n","const AttributeReference = require('./attributeReference');\n\nfunction ContextFilter(config) {\n const filter = {};\n\n const allAttributesPrivate = config.allAttributesPrivate;\n const privateAttributes = config.privateAttributes || [];\n\n // These attributes cannot be removed via a private attribute.\n const protectedAttributes = ['key', 'kind', '_meta', 'anonymous'];\n\n const legacyTopLevelCopyAttributes = ['name', 'ip', 'firstName', 'lastName', 'email', 'avatar', 'country'];\n\n /**\n * For the given context and configuration get a list of attributes to filter.\n * @param {Object} context\n * @returns {string[]} A list of the attributes to filter.\n */\n const getAttributesToFilter = context =>\n (allAttributesPrivate\n ? Object.keys(context)\n : [...privateAttributes, ...((context._meta && context._meta.privateAttributes) || [])]\n ).filter(attr => !protectedAttributes.some(protectedAttr => AttributeReference.compare(attr, protectedAttr)));\n\n /**\n * @param {Object} context\n * @returns {Object} A copy of the context with private attributes removed,\n * and the redactedAttributes meta populated.\n */\n const filterSingleKind = context => {\n if (typeof context !== 'object' || context === null || Array.isArray(context)) {\n return undefined;\n }\n\n const { cloned, excluded } = AttributeReference.cloneExcluding(context, getAttributesToFilter(context));\n cloned.key = String(cloned.key);\n if (excluded.length) {\n if (!cloned._meta) {\n cloned._meta = {};\n }\n cloned._meta.redactedAttributes = excluded;\n }\n if (cloned._meta) {\n delete cloned._meta['privateAttributes'];\n if (Object.keys(cloned._meta).length === 0) {\n delete cloned._meta;\n }\n }\n // Make sure anonymous is boolean if present.\n // Null counts as present, and would be falsy, which is the default.\n if (cloned.anonymous !== undefined) {\n cloned.anonymous = !!cloned.anonymous;\n }\n\n return cloned;\n };\n\n /**\n * @param {Object} context\n * @returns {Object} A copy of the context with the private attributes removed,\n * and the redactedAttributes meta populated for each sub-context.\n */\n const filterMultiKind = context => {\n const filtered = {\n kind: context.kind,\n };\n const contextKeys = Object.keys(context);\n\n for (const contextKey of contextKeys) {\n if (contextKey !== 'kind') {\n const filteredContext = filterSingleKind(context[contextKey]);\n if (filteredContext) {\n filtered[contextKey] = filteredContext;\n }\n }\n }\n return filtered;\n };\n\n /**\n * Convert the LDUser object into an LDContext object.\n * @param {Object} user The LDUser to produce an LDContext for.\n * @returns {Object} A single kind context based on the provided user.\n */\n const legacyToSingleKind = user => {\n const filtered = {\n /* Destructure custom items into the top level.\n Duplicate keys will be overridden by previously\n top level items.\n */\n ...(user.custom || {}),\n\n // Implicity a user kind.\n kind: 'user',\n\n key: user.key,\n };\n\n if (user.anonymous !== undefined) {\n filtered.anonymous = !!user.anonymous;\n }\n\n // Copy top level keys and convert them to strings.\n // Remove keys that may have been destructured from `custom`.\n for (const key of legacyTopLevelCopyAttributes) {\n delete filtered[key];\n if (user[key] !== undefined && user[key] !== null) {\n filtered[key] = String(user[key]);\n }\n }\n\n if (user.privateAttributeNames !== undefined && user.privateAttributeNames !== null) {\n filtered._meta = filtered._meta || {};\n // If any private attributes started with '/' we need to convert them to references, otherwise the '/' will\n // cause the literal to incorrectly be treated as a reference.\n filtered._meta.privateAttributes = user.privateAttributeNames.map(\n literal => (literal.startsWith('/') ? AttributeReference.literalToReference(literal) : literal)\n );\n }\n\n return filtered;\n };\n\n filter.filter = context => {\n if (context.kind === undefined || context.kind === null) {\n return filterSingleKind(legacyToSingleKind(context));\n } else if (context.kind === 'multi') {\n return filterMultiKind(context);\n } else {\n return filterSingleKind(context);\n }\n };\n\n return filter;\n}\n\nmodule.exports = ContextFilter;\n","const EventSender = require('./EventSender');\nconst EventSummarizer = require('./EventSummarizer');\nconst ContextFilter = require('./ContextFilter');\nconst errors = require('./errors');\nconst messages = require('./messages');\nconst utils = require('./utils');\nconst { getContextKeys } = require('./context');\n\nfunction EventProcessor(\n platform,\n options,\n environmentId,\n diagnosticsAccumulator = null,\n emitter = null,\n sender = null\n) {\n const processor = {};\n const eventSender = sender || EventSender(platform, environmentId, options);\n const mainEventsUrl = utils.appendUrlPath(options.eventsUrl, '/events/bulk/' + environmentId);\n const summarizer = EventSummarizer();\n const contextFilter = ContextFilter(options);\n const samplingInterval = options.samplingInterval;\n const eventCapacity = options.eventCapacity;\n const flushInterval = options.flushInterval;\n const logger = options.logger;\n let queue = [];\n let lastKnownPastTime = 0;\n let disabled = false;\n let exceededCapacity = false;\n let flushTimer;\n\n function shouldSampleEvent() {\n return samplingInterval === 0 || Math.floor(Math.random() * samplingInterval) === 0;\n }\n\n function shouldDebugEvent(e) {\n if (e.debugEventsUntilDate) {\n // The \"last known past time\" comes from the last HTTP response we got from the server.\n // In case the client's time is set wrong, at least we know that any expiration date\n // earlier than that point is definitely in the past. If there's any discrepancy, we\n // want to err on the side of cutting off event debugging sooner.\n return e.debugEventsUntilDate > lastKnownPastTime && e.debugEventsUntilDate > new Date().getTime();\n }\n return false;\n }\n\n // Transform an event from its internal format to the format we use when sending a payload.\n function makeOutputEvent(e) {\n const ret = utils.extend({}, e);\n if (e.kind === 'identify') {\n // identify events always have an inline context\n ret.context = contextFilter.filter(e.context);\n } else {\n ret.contextKeys = getContextKeysFromEvent(e);\n delete ret['context'];\n }\n if (e.kind === 'feature') {\n delete ret['trackEvents'];\n delete ret['debugEventsUntilDate'];\n }\n return ret;\n }\n\n function getContextKeysFromEvent(event) {\n return getContextKeys(event.context, logger);\n }\n\n function addToOutbox(event) {\n if (queue.length < eventCapacity) {\n queue.push(event);\n exceededCapacity = false;\n } else {\n if (!exceededCapacity) {\n exceededCapacity = true;\n logger.warn(messages.eventCapacityExceeded());\n }\n if (diagnosticsAccumulator) {\n // For diagnostic events, we track how many times we had to drop an event due to exceeding the capacity.\n diagnosticsAccumulator.incrementDroppedEvents();\n }\n }\n }\n\n processor.enqueue = function(event) {\n if (disabled) {\n return;\n }\n let addFullEvent = false;\n let addDebugEvent = false;\n\n // Add event to the summary counters if appropriate\n summarizer.summarizeEvent(event);\n\n // Decide whether to add the event to the payload. Feature events may be added twice, once for\n // the event (if tracked) and once for debugging.\n if (event.kind === 'feature') {\n if (shouldSampleEvent()) {\n addFullEvent = !!event.trackEvents;\n addDebugEvent = shouldDebugEvent(event);\n }\n } else {\n addFullEvent = shouldSampleEvent();\n }\n\n if (addFullEvent) {\n addToOutbox(makeOutputEvent(event));\n }\n if (addDebugEvent) {\n const debugEvent = utils.extend({}, event, { kind: 'debug' });\n debugEvent.context = contextFilter.filter(debugEvent.context);\n delete debugEvent['trackEvents'];\n delete debugEvent['debugEventsUntilDate'];\n addToOutbox(debugEvent);\n }\n };\n\n processor.flush = function() {\n if (disabled) {\n return Promise.resolve();\n }\n const eventsToSend = queue;\n const summary = summarizer.getSummary();\n summarizer.clearSummary();\n if (summary) {\n summary.kind = 'summary';\n eventsToSend.push(summary);\n }\n if (diagnosticsAccumulator) {\n // For diagnostic events, we record how many events were in the queue at the last flush (since \"how\n // many events happened to be in the queue at the moment we decided to send a diagnostic event\" would\n // not be a very useful statistic).\n diagnosticsAccumulator.setEventsInLastBatch(eventsToSend.length);\n }\n if (eventsToSend.length === 0) {\n return Promise.resolve();\n }\n queue = [];\n logger.debug(messages.debugPostingEvents(eventsToSend.length));\n return eventSender.sendEvents(eventsToSend, mainEventsUrl).then(responses => {\n const responseInfo = responses && responses[0];\n if (responseInfo) {\n if (responseInfo.serverTime) {\n lastKnownPastTime = responseInfo.serverTime;\n }\n if (!errors.isHttpErrorRecoverable(responseInfo.status)) {\n disabled = true;\n }\n if (responseInfo.status >= 400) {\n utils.onNextTick(() => {\n emitter.maybeReportError(\n new errors.LDUnexpectedResponseError(\n messages.httpErrorMessage(responseInfo.status, 'event posting', 'some events were dropped')\n )\n );\n });\n }\n }\n });\n };\n\n processor.start = function() {\n const flushTick = () => {\n processor.flush();\n flushTimer = setTimeout(flushTick, flushInterval);\n };\n flushTimer = setTimeout(flushTick, flushInterval);\n };\n\n processor.stop = function() {\n clearTimeout(flushTimer);\n };\n\n return processor;\n}\n\nmodule.exports = EventProcessor;\n","function EventEmitter(logger) {\n const emitter = {};\n const events = {};\n\n const listeningTo = event => !!events[event];\n\n emitter.on = function(event, handler, context) {\n events[event] = events[event] || [];\n events[event] = events[event].concat({\n handler: handler,\n context: context,\n });\n };\n\n emitter.off = function(event, handler, context) {\n if (!events[event]) {\n return;\n }\n for (let i = 0; i < events[event].length; i++) {\n if (events[event][i].handler === handler && events[event][i].context === context) {\n events[event] = events[event].slice(0, i).concat(events[event].slice(i + 1));\n }\n }\n };\n\n emitter.emit = function(event) {\n if (!events[event]) {\n return;\n }\n // Copy the list of handlers before iterating, in case any handler adds or removes another handler.\n // Any such changes should not affect what we do here-- we want to notify every handler that existed\n // at the moment that the event was fired.\n const copiedHandlers = events[event].slice(0);\n for (let i = 0; i < copiedHandlers.length; i++) {\n copiedHandlers[i].handler.apply(copiedHandlers[i].context, Array.prototype.slice.call(arguments, 1));\n }\n };\n\n emitter.getEvents = function() {\n return Object.keys(events);\n };\n\n emitter.getEventListenerCount = function(event) {\n return events[event] ? events[event].length : 0;\n };\n\n emitter.maybeReportError = function(error) {\n if (!error) {\n return;\n }\n if (listeningTo('error')) {\n this.emit('error', error);\n } else {\n (logger || console).error(error.message);\n }\n };\n return emitter;\n}\n\nmodule.exports = EventEmitter;\n","// This file provides an abstraction of the client's startup state.\n//\n// Startup can either succeed or fail exactly once; calling signalSuccess() or signalFailure()\n// after that point has no effect.\n//\n// On success, we fire both an \"initialized\" event and a \"ready\" event. Both the waitForInitialization()\n// promise and the waitUntilReady() promise are resolved in this case.\n//\n// On failure, we fire both a \"failed\" event (with the error as a parameter) and a \"ready\" event.\n// The waitForInitialization() promise is rejected, but the waitUntilReady() promise is resolved.\n//\n// To complicate things, we must *not* create the waitForInitialization() promise unless it is\n// requested, because otherwise failures would cause an *unhandled* rejection which can be a\n// serious problem in some environments. So we use a somewhat roundabout system for tracking the\n// initialization state and lazily creating this promise.\n\nconst readyEvent = 'ready',\n successEvent = 'initialized',\n failureEvent = 'failed';\n\nfunction InitializationStateTracker(eventEmitter) {\n let succeeded = false,\n failed = false,\n failureValue = null,\n initializationPromise = null;\n\n const readyPromise = new Promise(resolve => {\n const onReady = () => {\n eventEmitter.off(readyEvent, onReady); // we can't use \"once\" because it's not available on some JS platforms\n resolve();\n };\n eventEmitter.on(readyEvent, onReady);\n }).catch(() => {}); // this Promise should never be rejected, but the catch handler is a safety measure\n\n return {\n getInitializationPromise: () => {\n if (initializationPromise) {\n return initializationPromise;\n }\n if (succeeded) {\n return Promise.resolve();\n }\n if (failed) {\n return Promise.reject(failureValue);\n }\n initializationPromise = new Promise((resolve, reject) => {\n const onSuccess = () => {\n eventEmitter.off(successEvent, onSuccess);\n resolve();\n };\n const onFailure = err => {\n eventEmitter.off(failureEvent, onFailure);\n reject(err);\n };\n eventEmitter.on(successEvent, onSuccess);\n eventEmitter.on(failureEvent, onFailure);\n });\n return initializationPromise;\n },\n\n getReadyPromise: () => readyPromise,\n\n signalSuccess: () => {\n if (!succeeded && !failed) {\n succeeded = true;\n eventEmitter.emit(successEvent);\n eventEmitter.emit(readyEvent);\n }\n },\n\n signalFailure: err => {\n if (!succeeded && !failed) {\n failed = true;\n failureValue = err;\n eventEmitter.emit(failureEvent, err);\n eventEmitter.emit(readyEvent);\n }\n eventEmitter.maybeReportError(err); // the \"error\" event can be emitted more than once, unlike the others\n },\n };\n}\n\nmodule.exports = InitializationStateTracker;\n","const utils = require('./utils');\n\nfunction PersistentFlagStore(storage, environment, hash, ident) {\n const store = {};\n\n function getFlagsKey() {\n let key = '';\n const context = ident.getContext();\n if (context) {\n key = hash || utils.btoa(JSON.stringify(context));\n }\n return 'ld:' + environment + ':' + key;\n }\n\n // Returns a Promise which will be resolved with a parsed JSON value if a stored value was available,\n // or resolved with null if there was no value or if storage was not available.\n store.loadFlags = () =>\n storage.get(getFlagsKey()).then(dataStr => {\n if (dataStr === null || dataStr === undefined) {\n return null;\n }\n try {\n let data = JSON.parse(dataStr);\n if (data) {\n const schema = data.$schema;\n if (schema === undefined || schema < 1) {\n data = utils.transformValuesToVersionedValues(data);\n } else {\n delete data['$schema'];\n }\n }\n return data;\n } catch (ex) {\n return store.clearFlags().then(() => null);\n }\n });\n\n // Resolves with true if successful, or false if storage is unavailable. Never rejects.\n store.saveFlags = flags => {\n const data = utils.extend({}, flags, { $schema: 1 });\n return storage.set(getFlagsKey(), JSON.stringify(data));\n };\n\n // Resolves with true if successful, or false if storage is unavailable. Never rejects.\n store.clearFlags = () => storage.clear(getFlagsKey());\n\n return store;\n}\n\nmodule.exports = PersistentFlagStore;\n","const messages = require('./messages');\n\n// The localStorageProvider is provided by the platform object. It should have the following\n// methods, each of which should return a Promise:\n// - get(key): Gets the string value, if any, for the given key\n// - set(key, value): Stores a string value for the given key\n// - remove(key): Removes the given key\n//\n// Storage is just a light wrapper of the localStorageProvider, adding error handling and\n// ensuring that we don't call it if it's unavailable. The get method will simply resolve\n// with an undefined value if there is an error or if there is no localStorageProvider.\n// None of the promises returned by Storage will ever be rejected.\n//\n// It is always possible that the underlying platform storage mechanism might fail or be\n// disabled. If so, it's likely that it will keep failing, so we will only log one warning\n// instead of repetitive warnings.\nfunction PersistentStorage(localStorageProvider, logger) {\n const storage = {};\n let loggedError = false;\n\n const logError = err => {\n if (!loggedError) {\n loggedError = true;\n logger.warn(messages.localStorageUnavailable(err));\n }\n };\n\n storage.isEnabled = () => !!localStorageProvider;\n\n // Resolves with a value, or undefined if storage is unavailable. Never rejects.\n storage.get = key =>\n new Promise(resolve => {\n if (!localStorageProvider) {\n resolve(undefined);\n return;\n }\n localStorageProvider\n .get(key)\n .then(resolve)\n .catch(err => {\n logError(err);\n resolve(undefined);\n });\n });\n\n // Resolves with true if successful, or false if storage is unavailable. Never rejects.\n storage.set = (key, value) =>\n new Promise(resolve => {\n if (!localStorageProvider) {\n resolve(false);\n return;\n }\n localStorageProvider\n .set(key, value)\n .then(() => resolve(true))\n .catch(err => {\n logError(err);\n resolve(false);\n });\n });\n\n // Resolves with true if successful, or false if storage is unavailable. Never rejects.\n storage.clear = key =>\n new Promise(resolve => {\n if (!localStorageProvider) {\n resolve(false);\n return;\n }\n localStorageProvider\n .clear(key)\n .then(() => resolve(true))\n .catch(err => {\n logError(err);\n resolve(false);\n });\n });\n\n return storage;\n}\n\nmodule.exports = PersistentStorage;\n","const messages = require('./messages');\nconst { appendUrlPath, base64URLEncode, objectHasOwnProperty } = require('./utils');\nconst { getLDHeaders, transformHeaders } = require('./headers');\nconst { isHttpErrorRecoverable } = require('./errors');\n\n// The underlying event source implementation is abstracted via the platform object, which should\n// have these three properties:\n// eventSourceFactory(): a function that takes a URL and optional config object and returns an object\n// with the same methods as the regular HTML5 EventSource object. The properties in the config\n// object are those supported by the launchdarkly-eventsource package; browser EventSource\n// implementations don't have any config options.\n// eventSourceIsActive(): a function that takes an EventSource-compatible object and returns true if\n// it is in an active state (connected or connecting).\n// eventSourceAllowsReport: true if REPORT is supported.\n\n// The read timeout for the stream is a fixed value that is set to be slightly longer than the expected\n// interval between heartbeats from the LaunchDarkly streaming server. If this amount of time elapses\n// with no new data, the connection will be cycled.\nconst streamReadTimeoutMillis = 5 * 60 * 1000; // 5 minutes\nconst maxRetryDelay = 30 * 1000; // Maximum retry delay 30 seconds.\nconst jitterRatio = 0.5; // Delay should be 50%-100% of calculated time.\n\nfunction Stream(platform, config, environment, diagnosticsAccumulator) {\n const baseUrl = config.streamUrl;\n const logger = config.logger;\n const stream = {};\n const evalUrlPrefix = appendUrlPath(baseUrl, '/eval/' + environment);\n const useReport = config.useReport;\n const withReasons = config.evaluationReasons;\n const baseReconnectDelay = config.streamReconnectDelay;\n const headers = getLDHeaders(platform, config);\n let firstConnectionErrorLogged = false;\n let es = null;\n let reconnectTimeoutReference = null;\n let connectionAttemptStartTime;\n let context = null;\n let hash = null;\n let handlers = null;\n let retryCount = 0;\n\n function backoff() {\n const delay = baseReconnectDelay * Math.pow(2, retryCount);\n return delay > maxRetryDelay ? maxRetryDelay : delay;\n }\n\n function jitter(computedDelayMillis) {\n return computedDelayMillis - Math.trunc(Math.random() * jitterRatio * computedDelayMillis);\n }\n\n function getNextRetryDelay() {\n const delay = jitter(backoff());\n retryCount += 1;\n return delay;\n }\n\n stream.connect = function(newContext, newHash, newHandlers) {\n context = newContext;\n hash = newHash;\n handlers = {};\n for (const key in newHandlers || {}) {\n handlers[key] = function(e) {\n // Reset the state for logging the first connection error so that the first\n // connection error following a successful connection will once again be logged.\n // We will decorate *all* handlers to do this to keep this abstraction agnostic\n // for different stream implementations.\n firstConnectionErrorLogged = false;\n logConnectionResult(true);\n newHandlers[key] && newHandlers[key](e);\n };\n }\n tryConnect();\n };\n\n stream.disconnect = function() {\n clearTimeout(reconnectTimeoutReference);\n reconnectTimeoutReference = null;\n closeConnection();\n };\n\n stream.isConnected = function() {\n return !!(es && platform.eventSourceIsActive && platform.eventSourceIsActive(es));\n };\n\n function handleError(err) {\n // The event source may not produce a status. But the LaunchDarkly\n // polyfill can. If we can get the status, then we should stop retrying\n // on certain error codes.\n if (err.status && typeof err.status === 'number' && !isHttpErrorRecoverable(err.status)) {\n // If we encounter an unrecoverable condition, then we do not want to\n // retry anymore.\n closeConnection();\n logger.error(messages.unrecoverableStreamError(err));\n // Ensure any pending retry attempts are not done.\n if (reconnectTimeoutReference) {\n clearTimeout(reconnectTimeoutReference);\n reconnectTimeoutReference = null;\n }\n return;\n }\n\n const delay = getNextRetryDelay();\n\n if (!firstConnectionErrorLogged) {\n logger.warn(messages.streamError(err, delay));\n firstConnectionErrorLogged = true;\n }\n logConnectionResult(false);\n closeConnection();\n tryConnect(delay);\n }\n\n function tryConnect(delay) {\n if (!reconnectTimeoutReference) {\n if (delay) {\n reconnectTimeoutReference = setTimeout(openConnection, delay);\n } else {\n openConnection();\n }\n }\n }\n\n function openConnection() {\n reconnectTimeoutReference = null;\n let url;\n let query = '';\n const options = { headers, readTimeoutMillis: streamReadTimeoutMillis };\n if (platform.eventSourceFactory) {\n if (hash !== null && hash !== undefined) {\n query = 'h=' + hash;\n }\n if (useReport) {\n if (platform.eventSourceAllowsReport) {\n url = evalUrlPrefix;\n options.method = 'REPORT';\n options.headers['Content-Type'] = 'application/json';\n options.body = JSON.stringify(context);\n } else {\n // if we can't do REPORT, fall back to the old ping-based stream\n url = appendUrlPath(baseUrl, '/ping/' + environment);\n query = '';\n }\n } else {\n url = evalUrlPrefix + '/' + base64URLEncode(JSON.stringify(context));\n }\n options.headers = transformHeaders(options.headers, config);\n if (withReasons) {\n query = query + (query ? '&' : '') + 'withReasons=true';\n }\n url = url + (query ? '?' : '') + query;\n\n closeConnection();\n logger.info(messages.streamConnecting(url));\n logConnectionStarted();\n\n es = platform.eventSourceFactory(url, options);\n for (const key in handlers) {\n if (objectHasOwnProperty(handlers, key)) {\n es.addEventListener(key, handlers[key]);\n }\n }\n\n es.onerror = handleError;\n\n es.onopen = () => {\n // If the connection is a success, then reset the retryCount.\n retryCount = 0;\n };\n }\n }\n\n function closeConnection() {\n if (es) {\n logger.info(messages.streamClosing());\n es.close();\n es = null;\n }\n }\n\n function logConnectionStarted() {\n connectionAttemptStartTime = new Date().getTime();\n }\n\n function logConnectionResult(success) {\n if (connectionAttemptStartTime && diagnosticsAccumulator) {\n diagnosticsAccumulator.recordStreamInit(\n connectionAttemptStartTime,\n !success,\n new Date().getTime() - connectionAttemptStartTime\n );\n }\n connectionAttemptStartTime = null;\n }\n\n return stream;\n}\n\nmodule.exports = Stream;\n","// This function allows a series of Promises to be coalesced such that only the most recently\n// added one actually matters. For instance, if several HTTP requests are made to the same\n// endpoint and we want to ensure that whoever made each one always gets the latest data, each\n// can be passed to addPromise (on the same coalescer) and each caller can wait on the\n// coalescer.resultPromise; all three will then receive the result (or error) from the *last*\n// request, and the results of the first two will be discarded.\n//\n// The cancelFn callback, if present, will be called whenever an existing promise is being\n// discarded. This can be used for instance to abort an HTTP request that's now obsolete.\n//\n// The finallyFn callback, if present, is called on completion of the whole thing. This is\n// different from calling coalescer.resultPromise.finally() because it is executed before any\n// other handlers. Its purpose is to tell the caller that this coalescer should no longer be used.\n\nfunction promiseCoalescer(finallyFn) {\n let currentPromise;\n let currentCancelFn;\n let finalResolve;\n let finalReject;\n\n const coalescer = {};\n\n coalescer.addPromise = (p, cancelFn) => {\n currentPromise = p;\n currentCancelFn && currentCancelFn();\n currentCancelFn = cancelFn;\n\n p.then(\n result => {\n if (currentPromise === p) {\n finalResolve(result);\n finallyFn && finallyFn();\n }\n },\n error => {\n if (currentPromise === p) {\n finalReject(error);\n finallyFn && finallyFn();\n }\n }\n );\n };\n\n coalescer.resultPromise = new Promise((resolve, reject) => {\n finalResolve = resolve;\n finalReject = reject;\n });\n\n return coalescer;\n}\n\nmodule.exports = promiseCoalescer;\n","const utils = require('./utils');\nconst errors = require('./errors');\nconst messages = require('./messages');\nconst promiseCoalescer = require('./promiseCoalescer');\nconst { transformHeaders, getLDHeaders } = require('./headers');\n\nconst jsonContentType = 'application/json';\n\nfunction getResponseError(result) {\n if (result.status === 404) {\n return new errors.LDInvalidEnvironmentIdError(messages.environmentNotFound());\n } else {\n return new errors.LDFlagFetchError(messages.errorFetchingFlags(result.statusText || String(result.status)));\n }\n}\n\nfunction Requestor(platform, options, environment) {\n const baseUrl = options.baseUrl;\n const useReport = options.useReport;\n const withReasons = options.evaluationReasons;\n const logger = options.logger;\n\n const requestor = {};\n\n const activeRequests = {}; // map of URLs to promiseCoalescers\n\n function fetchJSON(endpoint, body) {\n if (!platform.httpRequest) {\n return new Promise((resolve, reject) => {\n reject(new errors.LDFlagFetchError(messages.httpUnavailable()));\n });\n }\n\n const method = body ? 'REPORT' : 'GET';\n const headers = getLDHeaders(platform, options);\n if (body) {\n headers['Content-Type'] = jsonContentType;\n }\n\n let coalescer = activeRequests[endpoint];\n if (!coalescer) {\n coalescer = promiseCoalescer(() => {\n // this will be called once there are no more active requests for the same endpoint\n delete activeRequests[endpoint];\n });\n activeRequests[endpoint] = coalescer;\n }\n\n const req = platform.httpRequest(method, endpoint, transformHeaders(headers, options), body);\n const p = req.promise.then(\n result => {\n if (result.status === 200) {\n // We're using substring here because using startsWith would require a polyfill in IE.\n if (\n result.header('content-type') &&\n result.header('content-type').substring(0, jsonContentType.length) === jsonContentType\n ) {\n return JSON.parse(result.body);\n } else {\n const message = messages.invalidContentType(result.header('content-type') || '');\n return Promise.reject(new errors.LDFlagFetchError(message));\n }\n } else {\n return Promise.reject(getResponseError(result));\n }\n },\n e => Promise.reject(new errors.LDFlagFetchError(messages.networkError(e)))\n );\n coalescer.addPromise(p, () => {\n // this will be called if another request for the same endpoint supersedes this one\n req.cancel && req.cancel();\n });\n return coalescer.resultPromise;\n }\n\n // Performs a GET request to an arbitrary path under baseUrl. Returns a Promise which will resolve\n // with the parsed JSON response, or will be rejected if the request failed.\n requestor.fetchJSON = function(path) {\n return fetchJSON(utils.appendUrlPath(baseUrl, path), null);\n };\n\n // Requests the current state of all flags for the given context from LaunchDarkly. Returns a Promise\n // which will resolve with the parsed JSON response, or will be rejected if the request failed.\n requestor.fetchFlagSettings = function(context, hash) {\n let data;\n let endpoint;\n let query = '';\n let body;\n\n if (useReport) {\n endpoint = [baseUrl, '/sdk/evalx/', environment, '/context'].join('');\n body = JSON.stringify(context);\n } else {\n data = utils.base64URLEncode(JSON.stringify(context));\n endpoint = [baseUrl, '/sdk/evalx/', environment, '/contexts/', data].join('');\n }\n if (hash) {\n query = 'h=' + hash;\n }\n if (withReasons) {\n query = query + (query ? '&' : '') + 'withReasons=true';\n }\n endpoint = endpoint + (query ? '?' : '') + query;\n logger.debug(messages.debugPolling(endpoint));\n\n return fetchJSON(endpoint, body);\n };\n\n return requestor;\n}\n\nmodule.exports = Requestor;\n","const utils = require('./utils');\n\nfunction Identity(initialContext, onChange) {\n const ident = {};\n let context;\n\n ident.setContext = function(c) {\n context = utils.sanitizeContext(c);\n if (context && onChange) {\n onChange(utils.clone(context));\n }\n };\n\n ident.getContext = function() {\n return context ? utils.clone(context) : null;\n };\n\n if (initialContext) {\n ident.setContext(initialContext);\n }\n\n return ident;\n}\n\nmodule.exports = Identity;\n","const { v1: uuidv1 } = require('uuid');\nconst { getContextKinds } = require('./context');\n\nconst errors = require('./errors');\nconst messages = require('./messages');\nconst utils = require('./utils');\n\nconst ldUserIdKey = 'ld:$anonUserId';\n\n/**\n * Create an object which can process a context and populate any required keys\n * for anonymous objects.\n *\n * @param {Object} persistentStorage The persistent storage from which to store\n * and access persisted anonymous context keys.\n * @returns An AnonymousContextProcessor.\n */\nfunction AnonymousContextProcessor(persistentStorage) {\n function getContextKeyIdString(kind) {\n if (kind === undefined || kind === null || kind === 'user') {\n return ldUserIdKey;\n }\n return `ld:$contextKey:${kind}`;\n }\n\n function getCachedContextKey(kind) {\n return persistentStorage.get(getContextKeyIdString(kind));\n }\n\n function setCachedContextKey(id, kind) {\n return persistentStorage.set(getContextKeyIdString(kind), id);\n }\n\n /**\n * Process a single kind context, or a single context within a multi-kind context.\n * @param {string} kind The kind of the context. Independent because the kind is not prevent\n * within a context in a multi-kind context.\n * @param {Object} context\n * @returns {Promise} a promise that resolves to a processed contexts, or rejects\n * a context which cannot be processed.\n */\n function processSingleKindContext(kind, context) {\n // We are working on a copy of an original context, so we want to re-assign\n // versus duplicating it again.\n\n /* eslint-disable no-param-reassign */\n if (context.key !== null && context.key !== undefined) {\n context.key = context.key.toString();\n return Promise.resolve(context);\n }\n\n if (context.anonymous) {\n // If the key doesn't exist, then the persistent storage will resolve\n // with undefined.\n return getCachedContextKey(kind).then(cachedId => {\n if (cachedId) {\n context.key = cachedId;\n return context;\n } else {\n const id = uuidv1();\n context.key = id;\n return setCachedContextKey(id, kind).then(() => context);\n }\n });\n } else {\n return Promise.reject(new errors.LDInvalidUserError(messages.invalidContext()));\n }\n /* eslint-enable no-param-reassign */\n }\n\n /**\n * Process the context, returning a Promise that resolves to the processed context, or rejects if there is an error.\n * @param {Object} context\n * @returns {Promise} A promise which resolves to a processed context, or a rejection if the context cannot be\n * processed. The context should still be checked for overall validity after being processed.\n */\n this.processContext = context => {\n if (!context) {\n return Promise.reject(new errors.LDInvalidUserError(messages.contextNotSpecified()));\n }\n\n const processedContext = utils.clone(context);\n\n if (context.kind === 'multi') {\n const kinds = getContextKinds(processedContext);\n\n return Promise.all(kinds.map(kind => processSingleKindContext(kind, processedContext[kind]))).then(\n () => processedContext\n );\n }\n return processSingleKindContext(context.kind, processedContext);\n };\n}\n\nmodule.exports = AnonymousContextProcessor;\n","const { v1: uuidv1 } = require('uuid');\n// Note that in the diagnostic events spec, these IDs are to be generated with UUID v4. However,\n// in JS we were already using v1 for unique context keys, so to avoid bringing in two packages we\n// will use v1 here as well.\n\nconst { baseOptionDefs } = require('./configuration');\nconst messages = require('./messages');\nconst { appendUrlPath } = require('./utils');\n\nfunction DiagnosticId(sdkKey) {\n const ret = {\n diagnosticId: uuidv1(),\n };\n if (sdkKey) {\n ret.sdkKeySuffix = sdkKey.length > 6 ? sdkKey.substring(sdkKey.length - 6) : sdkKey;\n }\n return ret;\n}\n\n// A stateful object holding statistics that will go into diagnostic events.\n\nfunction DiagnosticsAccumulator(startTime) {\n let dataSinceDate, droppedEvents, eventsInLastBatch, streamInits;\n\n function reset(time) {\n dataSinceDate = time;\n droppedEvents = 0;\n eventsInLastBatch = 0;\n streamInits = [];\n }\n\n reset(startTime);\n\n return {\n getProps: () => ({\n dataSinceDate,\n droppedEvents,\n eventsInLastBatch,\n streamInits,\n // omit deduplicatedUsers for the JS SDKs because they don't deduplicate users\n }),\n setProps: props => {\n dataSinceDate = props.dataSinceDate;\n droppedEvents = props.droppedEvents || 0;\n eventsInLastBatch = props.eventsInLastBatch || 0;\n streamInits = props.streamInits || [];\n },\n incrementDroppedEvents: () => {\n droppedEvents++;\n },\n setEventsInLastBatch: n => {\n eventsInLastBatch = n;\n },\n recordStreamInit: (timestamp, failed, durationMillis) => {\n const info = { timestamp, failed, durationMillis };\n streamInits.push(info);\n },\n reset,\n };\n}\n\n// An object that maintains information that will go into diagnostic events, and knows how to format\n// those events. It is instantiated by the SDK client, and shared with the event processor.\n//\n// The JS-based SDKs have two modes for diagnostic events. By default, the behavior is basically the\n// same as the server-side SDKs: a \"diagnostic-init\" event is sent on startup, and then \"diagnostic\"\n// events with operating statistics are sent periodically. However, in a browser environment this is\n// undesirable because the page may be reloaded frequently. In that case, setting the property\n// \"platform.diagnosticUseCombinedEvent\" to true enables an alternate mode in which a combination of\n// both kinds of event is sent at intervals, relative to the last time this was done (if any) which\n// is cached in local storage.\n\nfunction DiagnosticsManager(\n platform,\n persistentStorage,\n accumulator,\n eventSender,\n environmentId,\n config,\n diagnosticId\n) {\n const combinedMode = !!platform.diagnosticUseCombinedEvent;\n const localStorageKey = 'ld:' + environmentId + ':$diagnostics';\n const diagnosticEventsUrl = appendUrlPath(config.eventsUrl, '/events/diagnostic/' + environmentId);\n const periodicInterval = config.diagnosticRecordingInterval;\n const acc = accumulator;\n const initialEventSamplingInterval = 4; // used only in combined mode - see start()\n let streamingEnabled = !!config.streaming;\n let eventSentTime;\n let periodicTimer;\n const manager = {};\n\n function makeInitProperties() {\n return {\n sdk: makeSdkData(),\n configuration: makeConfigData(),\n platform: platform.diagnosticPlatformData,\n };\n }\n\n // Send a diagnostic event and do not wait for completion.\n function sendDiagnosticEvent(event) {\n config.logger && config.logger.debug(messages.debugPostingDiagnosticEvent(event));\n eventSender\n .sendEvents(event, diagnosticEventsUrl, true)\n .then(() => undefined)\n .catch(() => undefined);\n }\n\n function loadProperties(callback) {\n if (!persistentStorage.isEnabled()) {\n return callback(false); // false indicates that local storage is not available\n }\n persistentStorage\n .get(localStorageKey)\n .then(data => {\n if (data) {\n try {\n const props = JSON.parse(data);\n acc.setProps(props);\n eventSentTime = props.dataSinceDate;\n } catch (e) {\n // disregard malformed cached data\n }\n }\n callback(true);\n })\n .catch(() => {\n callback(false);\n });\n }\n\n function saveProperties() {\n if (persistentStorage.isEnabled()) {\n const props = { ...acc.getProps() };\n persistentStorage.set(localStorageKey, JSON.stringify(props));\n }\n }\n\n // Creates the initial event that is sent by the event processor when the SDK starts up. This will not\n // be repeated during the lifetime of the SDK client. In combined mode, we don't send this.\n function createInitEvent() {\n return {\n kind: 'diagnostic-init',\n id: diagnosticId,\n creationDate: acc.getProps().dataSinceDate,\n ...makeInitProperties(),\n };\n }\n\n // Creates a periodic event containing time-dependent stats, and resets the state of the manager with\n // regard to those stats. In combined mode (browser SDK) this also contains the configuration data.\n function createPeriodicEventAndReset() {\n const currentTime = new Date().getTime();\n let ret = {\n kind: combinedMode ? 'diagnostic-combined' : 'diagnostic',\n id: diagnosticId,\n creationDate: currentTime,\n ...acc.getProps(),\n };\n if (combinedMode) {\n ret = { ...ret, ...makeInitProperties() };\n }\n acc.reset(currentTime);\n return ret;\n }\n\n function sendPeriodicEvent() {\n sendDiagnosticEvent(createPeriodicEventAndReset());\n periodicTimer = setTimeout(sendPeriodicEvent, periodicInterval);\n eventSentTime = new Date().getTime();\n if (combinedMode) {\n saveProperties();\n }\n }\n\n function makeSdkData() {\n const sdkData = { ...platform.diagnosticSdkData };\n if (config.wrapperName) {\n sdkData.wrapperName = config.wrapperName;\n }\n if (config.wrapperVersion) {\n sdkData.wrapperVersion = config.wrapperVersion;\n }\n return sdkData;\n }\n\n function makeConfigData() {\n const configData = {\n customBaseURI: config.baseUrl !== baseOptionDefs.baseUrl.default,\n customStreamURI: config.streamUrl !== baseOptionDefs.streamUrl.default,\n customEventsURI: config.eventsUrl !== baseOptionDefs.eventsUrl.default,\n eventsCapacity: config.eventCapacity,\n eventsFlushIntervalMillis: config.flushInterval,\n reconnectTimeMillis: config.streamReconnectDelay,\n streamingDisabled: !streamingEnabled,\n allAttributesPrivate: !!config.allAttributesPrivate,\n diagnosticRecordingIntervalMillis: config.diagnosticRecordingInterval,\n // The following extra properties are only provided by client-side JS SDKs:\n usingSecureMode: !!config.hash,\n bootstrapMode: !!config.bootstrap,\n fetchGoalsDisabled: !config.fetchGoals,\n sendEventsOnlyForVariation: !!config.sendEventsOnlyForVariation,\n };\n // Client-side JS SDKs do not have the following properties which other SDKs have:\n // connectTimeoutMillis\n // pollingIntervalMillis\n // samplingInterval\n // socketTimeoutMillis\n // startWaitMillis\n // userKeysCapacity\n // userKeysFlushIntervalMillis\n // usingProxy\n // usingProxyAuthenticator\n // usingRelayDaemon\n\n return configData;\n }\n\n // Called when the SDK is starting up. Either send an init event immediately, or, in the alternate\n // mode, check for cached local storage properties and send an event only if we haven't done so\n // recently.\n manager.start = () => {\n if (combinedMode) {\n loadProperties(localStorageAvailable => {\n if (localStorageAvailable) {\n const nextEventTime = (eventSentTime || 0) + periodicInterval;\n const timeNow = new Date().getTime();\n if (timeNow >= nextEventTime) {\n sendPeriodicEvent();\n } else {\n periodicTimer = setTimeout(sendPeriodicEvent, nextEventTime - timeNow);\n }\n } else {\n // We don't have the ability to cache anything in local storage, so we don't know if we\n // recently sent an event before this page load, but we would still prefer not to send one\n // on *every* page load. So, as a rough heuristic, we'll decide semi-randomly.\n if (Math.floor(Math.random() * initialEventSamplingInterval) === 0) {\n sendPeriodicEvent();\n } else {\n periodicTimer = setTimeout(sendPeriodicEvent, periodicInterval);\n }\n }\n });\n } else {\n sendDiagnosticEvent(createInitEvent());\n periodicTimer = setTimeout(sendPeriodicEvent, periodicInterval);\n }\n };\n\n manager.stop = () => {\n periodicTimer && clearTimeout(periodicTimer);\n };\n\n // Called when streaming mode is turned on or off dynamically.\n manager.setStreaming = enabled => {\n streamingEnabled = enabled;\n };\n\n return manager;\n}\n\nmodule.exports = {\n DiagnosticId,\n DiagnosticsAccumulator,\n DiagnosticsManager,\n};\n","const messages = require('./messages');\n\n/**\n * Wrap an inspector ensuring that calling its methods are safe.\n * @param {object} inspector Inspector to wrap.\n */\nfunction SafeInspector(inspector, logger) {\n let errorLogged = false;\n const wrapper = {\n type: inspector.type,\n name: inspector.name,\n };\n\n wrapper.method = (...args) => {\n try {\n inspector.method(...args);\n } catch {\n // If something goes wrong in an inspector we want to log that something\n // went wrong. We don't want to flood the logs, so we only log something\n // the first time that something goes wrong.\n // We do not include the exception in the log, because we do not know what\n // kind of data it may contain.\n if (!errorLogged) {\n errorLogged = true;\n logger.warn(messages.inspectorMethodError(wrapper.type, wrapper.name));\n }\n // Prevent errors.\n }\n };\n\n return wrapper;\n}\n\nmodule.exports = SafeInspector;\n","const messages = require('./messages');\nconst SafeInspector = require('./SafeInspector');\nconst { onNextTick } = require('./utils');\n\n/**\n * The types of supported inspectors.\n */\nconst InspectorTypes = {\n flagUsed: 'flag-used',\n flagDetailsChanged: 'flag-details-changed',\n flagDetailChanged: 'flag-detail-changed',\n clientIdentityChanged: 'client-identity-changed',\n};\n\nObject.freeze(InspectorTypes);\n\n/**\n * Manages dispatching of inspection data to registered inspectors.\n */\nfunction InspectorManager(inspectors, logger) {\n const manager = {};\n\n /**\n * Collection of inspectors keyed by type.\n * @type {{[type: string]: object[]}}\n */\n const inspectorsByType = {\n [InspectorTypes.flagUsed]: [],\n [InspectorTypes.flagDetailsChanged]: [],\n [InspectorTypes.flagDetailChanged]: [],\n [InspectorTypes.clientIdentityChanged]: [],\n };\n\n const safeInspectors = inspectors && inspectors.map(inspector => SafeInspector(inspector, logger));\n\n safeInspectors &&\n safeInspectors.forEach(safeInspector => {\n // Only add inspectors of supported types.\n if (Object.prototype.hasOwnProperty.call(inspectorsByType, safeInspector.type)) {\n inspectorsByType[safeInspector.type].push(safeInspector);\n } else {\n logger.warn(messages.invalidInspector(safeInspector.type, safeInspector.name));\n }\n });\n\n /**\n * Check if there is an inspector of a specific type registered.\n *\n * @param {string} type The type of the inspector to check.\n * @returns True if there are any inspectors of that type registered.\n */\n manager.hasListeners = type => inspectorsByType[type] && inspectorsByType[type].length;\n\n /**\n * Notify registered inspectors of a flag being used.\n *\n * The notification itself will be dispatched asynchronously.\n *\n * @param {string} flagKey The key for the flag.\n * @param {Object} detail The LDEvaluationDetail for the flag.\n * @param {Object} context The LDContext for the flag.\n */\n manager.onFlagUsed = (flagKey, detail, context) => {\n if (inspectorsByType[InspectorTypes.flagUsed].length) {\n onNextTick(() => {\n inspectorsByType[InspectorTypes.flagUsed].forEach(inspector => inspector.method(flagKey, detail, context));\n });\n }\n };\n\n /**\n * Notify registered inspectors that the flags have been replaced.\n *\n * The notification itself will be dispatched asynchronously.\n *\n * @param {Record} flags The current flags as a Record.\n */\n manager.onFlags = flags => {\n if (inspectorsByType[InspectorTypes.flagDetailsChanged].length) {\n onNextTick(() => {\n inspectorsByType[InspectorTypes.flagDetailsChanged].forEach(inspector => inspector.method(flags));\n });\n }\n };\n\n /**\n * Notify registered inspectors that a flag value has changed.\n *\n * The notification itself will be dispatched asynchronously.\n *\n * @param {string} flagKey The key for the flag that changed.\n * @param {Object} flag An `LDEvaluationDetail` for the flag.\n */\n manager.onFlagChanged = (flagKey, flag) => {\n if (inspectorsByType[InspectorTypes.flagDetailChanged].length) {\n onNextTick(() => {\n inspectorsByType[InspectorTypes.flagDetailChanged].forEach(inspector => inspector.method(flagKey, flag));\n });\n }\n };\n\n /**\n * Notify the registered inspectors that the context identity has changed.\n *\n * The notification itself will be dispatched asynchronously.\n *\n * @param {Object} context The `LDContext` which is now identified.\n */\n manager.onIdentityChanged = context => {\n if (inspectorsByType[InspectorTypes.clientIdentityChanged].length) {\n onNextTick(() => {\n inspectorsByType[InspectorTypes.clientIdentityChanged].forEach(inspector => inspector.method(context));\n });\n }\n };\n\n return manager;\n}\n\nmodule.exports = { InspectorTypes, InspectorManager };\n","const EventProcessor = require('./EventProcessor');\nconst EventEmitter = require('./EventEmitter');\nconst EventSender = require('./EventSender');\nconst InitializationStateTracker = require('./InitializationState');\nconst PersistentFlagStore = require('./PersistentFlagStore');\nconst PersistentStorage = require('./PersistentStorage');\nconst Stream = require('./Stream');\nconst Requestor = require('./Requestor');\nconst Identity = require('./Identity');\nconst AnonymousContextProcessor = require('./AnonymousContextProcessor');\nconst configuration = require('./configuration');\nconst diagnostics = require('./diagnosticEvents');\nconst { commonBasicLogger } = require('./loggers');\nconst utils = require('./utils');\nconst errors = require('./errors');\nconst messages = require('./messages');\nconst { checkContext, getContextKeys } = require('./context');\nconst { InspectorTypes, InspectorManager } = require('./InspectorManager');\n\nconst changeEvent = 'change';\nconst internalChangeEvent = 'internal-change';\n\n// This is called by the per-platform initialize functions to create the base client object that we\n// may also extend with additional behavior. It returns an object with these properties:\n// client: the actual client object\n// options: the configuration (after any appropriate defaults have been applied)\n// If we need to give the platform-specific clients access to any internals here, we should add those\n// as properties of the return object, not public properties of the client.\n//\n// For definitions of the API in the platform object, see stubPlatform.js in the test code.\n\nfunction initialize(env, context, specifiedOptions, platform, extraOptionDefs) {\n const logger = createLogger();\n const emitter = EventEmitter(logger);\n const initializationStateTracker = InitializationStateTracker(emitter);\n const options = configuration.validate(specifiedOptions, emitter, extraOptionDefs, logger);\n const inspectorManager = InspectorManager(options.inspectors, logger);\n const sendEvents = options.sendEvents;\n let environment = env;\n let hash = options.hash;\n\n const persistentStorage = PersistentStorage(platform.localStorage, logger);\n\n const eventSender = EventSender(platform, environment, options);\n\n const diagnosticsEnabled = options.sendEvents && !options.diagnosticOptOut;\n const diagnosticId = diagnosticsEnabled ? diagnostics.DiagnosticId(environment) : null;\n const diagnosticsAccumulator = diagnosticsEnabled ? diagnostics.DiagnosticsAccumulator(new Date().getTime()) : null;\n const diagnosticsManager = diagnosticsEnabled\n ? diagnostics.DiagnosticsManager(\n platform,\n persistentStorage,\n diagnosticsAccumulator,\n eventSender,\n environment,\n options,\n diagnosticId\n )\n : null;\n\n const stream = Stream(platform, options, environment, diagnosticsAccumulator);\n\n const events =\n options.eventProcessor ||\n EventProcessor(platform, options, environment, diagnosticsAccumulator, emitter, eventSender);\n\n const requestor = Requestor(platform, options, environment);\n\n let flags = {};\n let useLocalStorage;\n let streamActive;\n let streamForcedState = options.streaming;\n let subscribedToChangeEvents;\n let inited = false;\n let closed = false;\n let firstEvent = true;\n\n // The \"stateProvider\" object is used in the Electron SDK, to allow one client instance to take partial\n // control of another. If present, it has the following contract:\n // - getInitialState() returns the initial client state if it is already available. The state is an\n // object whose properties are \"environment\", \"context\", and \"flags\".\n // - on(\"init\", listener) triggers an event when the initial client state becomes available, passing\n // the state object to the listener.\n // - on(\"update\", listener) triggers an event when flag values change and/or the current context changes.\n // The parameter is an object that *may* contain \"context\" and/or \"flags\".\n // - enqueueEvent(event) accepts an analytics event object and returns true if the stateProvider will\n // be responsible for delivering it, or false if we still should deliver it ourselves.\n const stateProvider = options.stateProvider;\n\n const ident = Identity(null, onIdentifyChange);\n const anonymousContextProcessor = new AnonymousContextProcessor(persistentStorage);\n const persistentFlagStore = persistentStorage.isEnabled()\n ? PersistentFlagStore(persistentStorage, environment, hash, ident, logger)\n : null;\n\n function createLogger() {\n if (specifiedOptions && specifiedOptions.logger) {\n return specifiedOptions.logger;\n }\n return (extraOptionDefs && extraOptionDefs.logger && extraOptionDefs.logger.default) || commonBasicLogger('warn');\n }\n\n function readFlagsFromBootstrap(data) {\n // If the bootstrap data came from an older server-side SDK, we'll have just a map of keys to values.\n // Newer SDKs that have an allFlagsState method will provide an extra \"$flagsState\" key that contains\n // the rest of the metadata we want. We do it this way for backward compatibility with older JS SDKs.\n const keys = Object.keys(data);\n const metadataKey = '$flagsState';\n const validKey = '$valid';\n const metadata = data[metadataKey];\n if (!metadata && keys.length) {\n logger.warn(messages.bootstrapOldFormat());\n }\n if (data[validKey] === false) {\n logger.warn(messages.bootstrapInvalid());\n }\n const ret = {};\n keys.forEach(key => {\n if (key !== metadataKey && key !== validKey) {\n let flag = { value: data[key] };\n if (metadata && metadata[key]) {\n flag = utils.extend(flag, metadata[key]);\n } else {\n flag.version = 0;\n }\n ret[key] = flag;\n }\n });\n return ret;\n }\n\n function shouldEnqueueEvent() {\n return sendEvents && !closed && !platform.isDoNotTrack();\n }\n\n function enqueueEvent(event) {\n if (!environment) {\n // We're in paired mode and haven't been initialized with an environment or context yet\n return;\n }\n if (stateProvider && stateProvider.enqueueEvent && stateProvider.enqueueEvent(event)) {\n return; // it'll be handled elsewhere\n }\n\n if (!event.context) {\n if (firstEvent) {\n logger.warn(messages.eventWithoutContext());\n firstEvent = false;\n }\n return;\n }\n firstEvent = false;\n\n if (shouldEnqueueEvent()) {\n logger.debug(messages.debugEnqueueingEvent(event.kind));\n events.enqueue(event);\n }\n }\n\n function notifyInspectionFlagUsed(key, detail) {\n if (inspectorManager.hasListeners(InspectorTypes.flagUsed)) {\n inspectorManager.onFlagUsed(key, detail, ident.getContext());\n }\n }\n\n function notifyInspectionIdentityChanged() {\n if (inspectorManager.hasListeners(InspectorTypes.clientIdentityChanged)) {\n inspectorManager.onIdentityChanged(ident.getContext());\n }\n }\n\n function notifyInspectionFlagChanged(data, newFlag) {\n if (inspectorManager.hasListeners(InspectorTypes.flagDetailChanged)) {\n inspectorManager.onFlagChanged(data.key, getFlagDetail(newFlag));\n }\n }\n\n function notifyInspectionFlagsChanged() {\n if (inspectorManager.hasListeners(InspectorTypes.flagDetailsChanged)) {\n inspectorManager.onFlags(\n Object.entries(flags)\n .map(([key, value]) => ({ key, detail: getFlagDetail(value) }))\n .reduce((acc, cur) => {\n // eslint-disable-next-line no-param-reassign\n acc[cur.key] = cur.detail;\n return acc;\n }, {})\n );\n }\n }\n\n function onIdentifyChange(context) {\n sendIdentifyEvent(context);\n notifyInspectionIdentityChanged();\n }\n\n function sendIdentifyEvent(context) {\n if (stateProvider) {\n // In paired mode, the other client is responsible for sending identify events\n return;\n }\n if (context) {\n enqueueEvent({\n kind: 'identify',\n context,\n creationDate: new Date().getTime(),\n });\n }\n }\n\n function sendFlagEvent(key, detail, defaultValue, includeReason) {\n const context = ident.getContext();\n const now = new Date();\n const value = detail ? detail.value : null;\n\n const event = {\n kind: 'feature',\n key: key,\n context,\n value: value,\n variation: detail ? detail.variationIndex : null,\n default: defaultValue,\n creationDate: now.getTime(),\n };\n const flag = flags[key];\n if (flag) {\n event.version = flag.flagVersion ? flag.flagVersion : flag.version;\n event.trackEvents = flag.trackEvents;\n event.debugEventsUntilDate = flag.debugEventsUntilDate;\n }\n if ((includeReason || (flag && flag.trackReason)) && detail) {\n event.reason = detail.reason;\n }\n\n enqueueEvent(event);\n }\n\n function verifyContext(context) {\n // The context will already have been processed to have a string key, so we\n // do not need to allow for legacy keys in the check.\n if (checkContext(context, false)) {\n return Promise.resolve(context);\n } else {\n return Promise.reject(new errors.LDInvalidUserError(messages.invalidContext()));\n }\n }\n\n function identify(context, newHash, onDone) {\n if (closed) {\n return utils.wrapPromiseCallback(Promise.resolve({}), onDone);\n }\n if (stateProvider) {\n // We're being controlled by another client instance, so only that instance is allowed to change the context\n logger.warn(messages.identifyDisabled());\n return utils.wrapPromiseCallback(Promise.resolve(utils.transformVersionedValuesToValues(flags)), onDone);\n }\n const clearFirst = useLocalStorage && persistentFlagStore ? persistentFlagStore.clearFlags() : Promise.resolve();\n return utils.wrapPromiseCallback(\n clearFirst\n .then(() => anonymousContextProcessor.processContext(context))\n .then(verifyContext)\n .then(validatedContext =>\n requestor\n .fetchFlagSettings(validatedContext, newHash)\n // the following then() is nested within this one so we can use realUser from the previous closure\n .then(requestedFlags => {\n const flagValueMap = utils.transformVersionedValuesToValues(requestedFlags);\n ident.setContext(validatedContext);\n hash = newHash;\n if (requestedFlags) {\n return replaceAllFlags(requestedFlags).then(() => flagValueMap);\n } else {\n return flagValueMap;\n }\n })\n )\n .then(flagValueMap => {\n if (streamActive) {\n connectStream();\n }\n return flagValueMap;\n })\n .catch(err => {\n emitter.maybeReportError(err);\n return Promise.reject(err);\n }),\n onDone\n );\n }\n\n function getContext() {\n return ident.getContext();\n }\n\n function flush(onDone) {\n return utils.wrapPromiseCallback(sendEvents ? events.flush() : Promise.resolve(), onDone);\n }\n\n function variation(key, defaultValue) {\n return variationDetailInternal(key, defaultValue, true, false, false).value;\n }\n\n function variationDetail(key, defaultValue) {\n return variationDetailInternal(key, defaultValue, true, true, false);\n }\n\n function variationDetailInternal(key, defaultValue, sendEvent, includeReasonInEvent, isAllFlags) {\n let detail;\n\n if (flags && utils.objectHasOwnProperty(flags, key) && flags[key] && !flags[key].deleted) {\n const flag = flags[key];\n detail = getFlagDetail(flag);\n if (flag.value === null || flag.value === undefined) {\n detail.value = defaultValue;\n }\n } else {\n detail = { value: defaultValue, variationIndex: null, reason: { kind: 'ERROR', errorKind: 'FLAG_NOT_FOUND' } };\n }\n\n if (sendEvent) {\n sendFlagEvent(key, detail, defaultValue, includeReasonInEvent);\n }\n\n // For the all flags case `onFlags` will be called instead.\n if (!isAllFlags) {\n notifyInspectionFlagUsed(key, detail);\n }\n\n return detail;\n }\n\n function getFlagDetail(flag) {\n return {\n value: flag.value,\n variationIndex: flag.variation === undefined ? null : flag.variation,\n reason: flag.reason || null,\n };\n // Note, the logic above ensures that variationIndex and reason will always be null rather than\n // undefined if we don't have values for them. That's just to avoid subtle errors that depend on\n // whether an object was JSON-encoded with null properties omitted or not.\n }\n\n function allFlags() {\n const results = {};\n\n if (!flags) {\n return results;\n }\n\n for (const key in flags) {\n if (utils.objectHasOwnProperty(flags, key) && !flags[key].deleted) {\n results[key] = variationDetailInternal(key, null, !options.sendEventsOnlyForVariation, false, true).value;\n }\n }\n\n return results;\n }\n\n function userContextKind(user) {\n return user.anonymous ? 'anonymousUser' : 'user';\n }\n\n function track(key, data, metricValue) {\n if (typeof key !== 'string') {\n emitter.maybeReportError(new errors.LDInvalidEventKeyError(messages.unknownCustomEventKey(key)));\n return;\n }\n\n // The following logic was used only for the JS browser SDK (js-client-sdk) and\n // is no longer needed as of version 2.9.13 of that SDK. The other client-side\n // JS-based SDKs did not define customEventFilter, and now none of them do. We\n // can remove this in the next major version of the common code, when it's OK to\n // make breaking changes to our internal API contracts.\n if (platform.customEventFilter && !platform.customEventFilter(key)) {\n logger.warn(messages.unknownCustomEventKey(key));\n }\n\n const context = ident.getContext();\n const e = {\n kind: 'custom',\n key: key,\n context,\n url: platform.getCurrentUrl(),\n creationDate: new Date().getTime(),\n };\n if (context && context.anonymous) {\n e.contextKind = userContextKind(context);\n }\n // Note, check specifically for null/undefined because it is legal to set these fields to a falsey value.\n if (data !== null && data !== undefined) {\n e.data = data;\n }\n if (metricValue !== null && metricValue !== undefined) {\n e.metricValue = metricValue;\n }\n enqueueEvent(e);\n }\n\n function connectStream() {\n streamActive = true;\n if (!ident.getContext()) {\n return;\n }\n const tryParseData = jsonData => {\n try {\n return JSON.parse(jsonData);\n } catch (err) {\n emitter.maybeReportError(new errors.LDInvalidDataError(messages.invalidData()));\n return undefined;\n }\n };\n stream.connect(ident.getContext(), hash, {\n ping: function() {\n logger.debug(messages.debugStreamPing());\n const contextAtTimeOfPingEvent = ident.getContext();\n requestor\n .fetchFlagSettings(contextAtTimeOfPingEvent, hash)\n .then(requestedFlags => {\n // Check whether the current context is still the same - we don't want to overwrite the flags if\n // the application has called identify() while this request was in progress\n if (utils.deepEquals(contextAtTimeOfPingEvent, ident.getContext())) {\n replaceAllFlags(requestedFlags || {});\n }\n })\n .catch(err => {\n emitter.maybeReportError(new errors.LDFlagFetchError(messages.errorFetchingFlags(err)));\n });\n },\n put: function(e) {\n const data = tryParseData(e.data);\n if (!data) {\n return;\n }\n logger.debug(messages.debugStreamPut());\n replaceAllFlags(data);\n // Don't wait for this Promise to be resolved; note that replaceAllFlags is guaranteed\n // never to have an unhandled rejection\n },\n patch: function(e) {\n const data = tryParseData(e.data);\n if (!data) {\n return;\n }\n // If both the flag and the patch have a version property, then the patch version must be\n // greater than the flag version for us to accept the patch. If either one has no version\n // then the patch always succeeds.\n const oldFlag = flags[data.key];\n if (!oldFlag || !oldFlag.version || !data.version || oldFlag.version < data.version) {\n logger.debug(messages.debugStreamPatch(data.key));\n const mods = {};\n const newFlag = utils.extend({}, data);\n delete newFlag['key'];\n flags[data.key] = newFlag;\n const newDetail = getFlagDetail(newFlag);\n if (oldFlag) {\n mods[data.key] = { previous: oldFlag.value, current: newDetail };\n } else {\n mods[data.key] = { current: newDetail };\n }\n handleFlagChanges(mods); // don't wait for this Promise to be resolved\n notifyInspectionFlagChanged(data, newFlag);\n } else {\n logger.debug(messages.debugStreamPatchIgnored(data.key));\n }\n },\n delete: function(e) {\n const data = tryParseData(e.data);\n if (!data) {\n return;\n }\n if (!flags[data.key] || flags[data.key].version < data.version) {\n logger.debug(messages.debugStreamDelete(data.key));\n const mods = {};\n if (flags[data.key] && !flags[data.key].deleted) {\n mods[data.key] = { previous: flags[data.key].value };\n }\n flags[data.key] = { version: data.version, deleted: true };\n notifyInspectionFlagChanged(data, flags[data.key]);\n handleFlagChanges(mods); // don't wait for this Promise to be resolved\n } else {\n logger.debug(messages.debugStreamDeleteIgnored(data.key));\n }\n },\n });\n }\n\n function disconnectStream() {\n if (streamActive) {\n stream.disconnect();\n streamActive = false;\n }\n }\n\n // Returns a Promise which will be resolved when we have completely updated the internal flags state,\n // dispatched all change events, and updated local storage if appropriate. This Promise is guaranteed\n // never to have an unhandled rejection.\n function replaceAllFlags(newFlags) {\n const changes = {};\n\n if (!newFlags) {\n return Promise.resolve();\n }\n\n for (const key in flags) {\n if (utils.objectHasOwnProperty(flags, key) && flags[key]) {\n if (newFlags[key] && !utils.deepEquals(newFlags[key].value, flags[key].value)) {\n changes[key] = { previous: flags[key].value, current: getFlagDetail(newFlags[key]) };\n } else if (!newFlags[key] || newFlags[key].deleted) {\n changes[key] = { previous: flags[key].value };\n }\n }\n }\n for (const key in newFlags) {\n if (utils.objectHasOwnProperty(newFlags, key) && newFlags[key] && (!flags[key] || flags[key].deleted)) {\n changes[key] = { current: getFlagDetail(newFlags[key]) };\n }\n }\n\n flags = { ...newFlags };\n\n notifyInspectionFlagsChanged();\n\n return handleFlagChanges(changes).catch(() => {}); // swallow any exceptions from this Promise\n }\n\n // Returns a Promise which will be resolved when we have dispatched all change events and updated\n // local storage if appropriate.\n function handleFlagChanges(changes) {\n const keys = Object.keys(changes);\n\n if (keys.length > 0) {\n const changeEventParams = {};\n keys.forEach(key => {\n const current = changes[key].current;\n const value = current ? current.value : undefined;\n const previous = changes[key].previous;\n emitter.emit(changeEvent + ':' + key, value, previous);\n changeEventParams[key] = current ? { current: value, previous: previous } : { previous: previous };\n });\n\n emitter.emit(changeEvent, changeEventParams);\n emitter.emit(internalChangeEvent, flags);\n\n // By default, we send feature evaluation events whenever we have received new flag values -\n // the client has in effect evaluated these flags just by receiving them. This can be suppressed\n // by setting \"sendEventsOnlyForVariation\". Also, if we have a stateProvider, we don't send these\n // events because we assume they have already been sent by the other client that gave us the flags\n // (when it received them in the first place).\n if (!options.sendEventsOnlyForVariation && !stateProvider) {\n keys.forEach(key => {\n sendFlagEvent(key, changes[key].current);\n });\n }\n }\n\n if (useLocalStorage && persistentFlagStore) {\n return persistentFlagStore.saveFlags(flags);\n } else {\n return Promise.resolve();\n }\n }\n\n function on(event, handler, context) {\n if (isChangeEventKey(event)) {\n subscribedToChangeEvents = true;\n if (inited) {\n updateStreamingState();\n }\n emitter.on(event, handler, context);\n } else {\n emitter.on(...arguments);\n }\n }\n\n function off(event) {\n emitter.off(...arguments);\n if (isChangeEventKey(event)) {\n let haveListeners = false;\n emitter.getEvents().forEach(key => {\n if (isChangeEventKey(key) && emitter.getEventListenerCount(key) > 0) {\n haveListeners = true;\n }\n });\n if (!haveListeners) {\n subscribedToChangeEvents = false;\n if (streamActive && streamForcedState === undefined) {\n disconnectStream();\n }\n }\n }\n }\n\n function setStreaming(state) {\n const newState = state === null ? undefined : state;\n if (newState !== streamForcedState) {\n streamForcedState = newState;\n updateStreamingState();\n }\n }\n\n function updateStreamingState() {\n const shouldBeStreaming = streamForcedState || (subscribedToChangeEvents && streamForcedState === undefined);\n if (shouldBeStreaming && !streamActive) {\n connectStream();\n } else if (!shouldBeStreaming && streamActive) {\n disconnectStream();\n }\n if (diagnosticsManager) {\n diagnosticsManager.setStreaming(shouldBeStreaming);\n }\n }\n\n function isChangeEventKey(event) {\n return event === changeEvent || event.substr(0, changeEvent.length + 1) === changeEvent + ':';\n }\n\n if (typeof options.bootstrap === 'string' && options.bootstrap.toUpperCase() === 'LOCALSTORAGE') {\n if (persistentFlagStore) {\n useLocalStorage = true;\n } else {\n logger.warn(messages.localStorageUnavailable());\n }\n }\n\n if (typeof options.bootstrap === 'object') {\n // Set the flags as soon as possible before we get into any async code, so application code can read\n // them even if the ready event has not yet fired.\n flags = readFlagsFromBootstrap(options.bootstrap);\n }\n\n if (stateProvider) {\n // The stateProvider option is used in the Electron SDK, to allow a client instance in the main process\n // to control another client instance (i.e. this one) in the renderer process. We can't predict which\n // one will start up first, so the initial state may already be available for us or we may have to wait\n // to receive it.\n const state = stateProvider.getInitialState();\n if (state) {\n initFromStateProvider(state);\n } else {\n stateProvider.on('init', initFromStateProvider);\n }\n stateProvider.on('update', updateFromStateProvider);\n } else {\n finishInit().catch(signalFailedInit);\n }\n\n function finishInit() {\n if (!env) {\n return Promise.reject(new errors.LDInvalidEnvironmentIdError(messages.environmentNotSpecified()));\n }\n return anonymousContextProcessor\n .processContext(context)\n .then(verifyContext)\n .then(validatedContext => {\n ident.setContext(validatedContext);\n if (typeof options.bootstrap === 'object') {\n // flags have already been set earlier\n return signalSuccessfulInit();\n } else if (useLocalStorage) {\n return finishInitWithLocalStorage();\n } else {\n return finishInitWithPolling();\n }\n });\n }\n\n function finishInitWithLocalStorage() {\n return persistentFlagStore.loadFlags().then(storedFlags => {\n if (storedFlags === null || storedFlags === undefined) {\n flags = {};\n return requestor\n .fetchFlagSettings(ident.getContext(), hash)\n .then(requestedFlags => replaceAllFlags(requestedFlags || {}))\n .then(signalSuccessfulInit)\n .catch(err => {\n const initErr = new errors.LDFlagFetchError(messages.errorFetchingFlags(err));\n signalFailedInit(initErr);\n });\n } else {\n // We're reading the flags from local storage. Signal that we're ready,\n // then update localStorage for the next page load. We won't signal changes or update\n // the in-memory flags unless you subscribe for changes\n flags = storedFlags;\n utils.onNextTick(signalSuccessfulInit);\n\n return requestor\n .fetchFlagSettings(ident.getContext(), hash)\n .then(requestedFlags => replaceAllFlags(requestedFlags))\n .catch(err => emitter.maybeReportError(err));\n }\n });\n }\n\n function finishInitWithPolling() {\n return requestor\n .fetchFlagSettings(ident.getContext(), hash)\n .then(requestedFlags => {\n flags = requestedFlags || {};\n\n notifyInspectionFlagsChanged();\n // Note, we don't need to call updateSettings here because local storage and change events are not relevant\n signalSuccessfulInit();\n })\n .catch(err => {\n flags = {};\n signalFailedInit(err);\n });\n }\n\n function initFromStateProvider(state) {\n environment = state.environment;\n ident.setContext(state.context);\n flags = { ...state.flags };\n utils.onNextTick(signalSuccessfulInit);\n }\n\n function updateFromStateProvider(state) {\n if (state.context) {\n ident.setContext(state.context);\n }\n if (state.flags) {\n replaceAllFlags(state.flags); // don't wait for this Promise to be resolved\n }\n }\n\n function signalSuccessfulInit() {\n logger.info(messages.clientInitialized());\n inited = true;\n updateStreamingState();\n initializationStateTracker.signalSuccess();\n }\n\n function signalFailedInit(err) {\n initializationStateTracker.signalFailure(err);\n }\n\n function start() {\n if (sendEvents) {\n if (diagnosticsManager) {\n diagnosticsManager.start();\n }\n events.start();\n }\n }\n\n function close(onDone) {\n if (closed) {\n return utils.wrapPromiseCallback(Promise.resolve(), onDone);\n }\n const finishClose = () => {\n closed = true;\n flags = {};\n };\n const p = Promise.resolve()\n .then(() => {\n disconnectStream();\n if (diagnosticsManager) {\n diagnosticsManager.stop();\n }\n if (sendEvents) {\n events.stop();\n return events.flush();\n }\n })\n .then(finishClose)\n .catch(finishClose);\n return utils.wrapPromiseCallback(p, onDone);\n }\n\n function getFlagsInternal() {\n // used by Electron integration\n return flags;\n }\n\n const client = {\n waitForInitialization: () => initializationStateTracker.getInitializationPromise(),\n waitUntilReady: () => initializationStateTracker.getReadyPromise(),\n identify: identify,\n getContext: getContext,\n variation: variation,\n variationDetail: variationDetail,\n track: track,\n on: on,\n off: off,\n setStreaming: setStreaming,\n flush: flush,\n allFlags: allFlags,\n close: close,\n };\n\n return {\n client: client, // The client object containing all public methods.\n options: options, // The validated configuration object, including all defaults.\n emitter: emitter, // The event emitter which can be used to log errors or trigger events.\n ident: ident, // The Identity object that manages the current context.\n logger: logger, // The logging abstraction.\n requestor: requestor, // The Requestor object.\n start: start, // Starts the client once the environment is ready.\n enqueueEvent: enqueueEvent, // Puts an analytics event in the queue, if event sending is enabled.\n getFlagsInternal: getFlagsInternal, // Returns flag data structure with all details.\n getEnvironmentId: () => environment, // Gets the environment ID (this may have changed since initialization, if we have a state provider)\n internalChangeEventName: internalChangeEvent, // This event is triggered whenever we have new flag state.\n };\n}\n\nmodule.exports = {\n initialize,\n commonBasicLogger,\n errors,\n messages,\n utils,\n getContextKeys,\n};\n","const { commonBasicLogger } = require('launchdarkly-js-sdk-common');\n\nfunction basicLogger(options) {\n return commonBasicLogger({ destination: console.log, ...options });\n}\n\nmodule.exports = {\n basicLogger,\n};\n","function isSyncXhrSupported() {\n // This is temporary logic to disable synchronous XHR in Chrome 73 and above. In all other browsers,\n // we will assume it is supported. See https://github.com/launchdarkly/js-client-sdk/issues/147\n const userAgent = window.navigator && window.navigator.userAgent;\n if (userAgent) {\n const chromeMatch = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n if (chromeMatch) {\n const version = parseInt(chromeMatch[2], 10);\n return version < 73;\n }\n }\n return true;\n}\n\nconst emptyResult = { promise: Promise.resolve({ status: 200, header: () => null, body: null }) };\n\nexport default function newHttpRequest(method, url, headers, body, pageIsClosing) {\n if (pageIsClosing) {\n // When the page is about to close, we have to use synchronous XHR (until we migrate to sendBeacon).\n // But not all browsers support this.\n if (!isSyncXhrSupported()) {\n return emptyResult;\n // Note that we return a fake success response, because we don't want the request to be retried in this case.\n }\n }\n\n const xhr = new window.XMLHttpRequest();\n xhr.open(method, url, !pageIsClosing);\n for (const key in headers || {}) {\n if (Object.prototype.hasOwnProperty.call(headers, key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n if (pageIsClosing) {\n xhr.send(body); // We specified synchronous mode when we called xhr.open\n return emptyResult; // Again, we never want a request to be retried in this case, so we must say it succeeded.\n } else {\n let cancelled;\n const p = new Promise((resolve, reject) => {\n xhr.addEventListener('load', () => {\n if (cancelled) {\n return;\n }\n resolve({\n status: xhr.status,\n header: (key) => xhr.getResponseHeader(key),\n body: xhr.responseText,\n });\n });\n xhr.addEventListener('error', () => {\n if (cancelled) {\n return;\n }\n reject(new Error());\n });\n xhr.send(body);\n });\n const cancel = () => {\n cancelled = true;\n xhr.abort();\n };\n return { promise: p, cancel: cancel };\n }\n}\n","'use strict';\n\nmodule.exports = string => {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it’s always valid, and a \\unnnn escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n\t\t.replace(/-/g, '\\\\x2d');\n};\n","import escapeStringRegexp from 'escape-string-regexp';\n\nexport function doesUrlMatch(matcher, href, search, hash) {\n const keepHash = (matcher.kind === 'substring' || matcher.kind === 'regex') && hash.includes('/');\n const canonicalUrl = (keepHash ? href : href.replace(hash, '')).replace(search, '');\n\n let regex;\n let testUrl;\n\n switch (matcher.kind) {\n case 'exact':\n testUrl = href;\n regex = new RegExp('^' + escapeStringRegexp(matcher.url) + '/?$');\n break;\n case 'canonical':\n testUrl = canonicalUrl;\n regex = new RegExp('^' + escapeStringRegexp(matcher.url) + '/?$');\n break;\n case 'substring':\n testUrl = canonicalUrl;\n regex = new RegExp('.*' + escapeStringRegexp(matcher.substring) + '.*$');\n break;\n case 'regex':\n testUrl = canonicalUrl;\n regex = new RegExp(matcher.pattern);\n break;\n default:\n return false;\n }\n return regex.test(testUrl);\n}\n\nfunction findGoalsForClick(event, clickGoals) {\n const matches = [];\n\n for (let i = 0; i < clickGoals.length; i++) {\n let target = event.target;\n const goal = clickGoals[i];\n const selector = goal.selector;\n const elements = document.querySelectorAll(selector);\n while (target && elements.length > 0) {\n for (let j = 0; j < elements.length; j++) {\n if (target === elements[j]) {\n matches.push(goal);\n }\n }\n target = target.parentNode;\n }\n }\n\n return matches;\n}\n\nexport default function GoalTracker(goals, onEvent) {\n const tracker = {};\n let listenerFn = null;\n\n const clickGoals = [];\n\n for (let i = 0; i < goals.length; i++) {\n const goal = goals[i];\n const urls = goal.urls || [];\n\n for (let j = 0; j < urls.length; j++) {\n if (doesUrlMatch(urls[j], window.location.href, window.location.search, window.location.hash)) {\n if (goal.kind === 'pageview') {\n onEvent('pageview', goal);\n } else {\n clickGoals.push(goal);\n onEvent('click_pageview', goal);\n }\n break;\n }\n }\n }\n\n if (clickGoals.length > 0) {\n listenerFn = function (event) {\n const goals = findGoalsForClick(event, clickGoals);\n for (let i = 0; i < goals.length; i++) {\n onEvent('click', goals[i]);\n }\n };\n\n document.addEventListener('click', listenerFn);\n }\n\n tracker.dispose = function () {\n document.removeEventListener('click', listenerFn);\n };\n\n return tracker;\n}\n","import * as common from 'launchdarkly-js-sdk-common';\nimport GoalTracker from './GoalTracker';\n\nconst locationWatcherInterval = 300;\n\nexport default function GoalManager(clientVars, readyCallback) {\n let goals;\n let goalTracker;\n\n const ret = {};\n\n function getGoalsPath() {\n return '/sdk/goals/' + clientVars.getEnvironmentId();\n }\n\n function refreshGoalTracker() {\n if (goalTracker) {\n goalTracker.dispose();\n }\n if (goals && goals.length) {\n goalTracker = GoalTracker(goals, sendGoalEvent);\n }\n }\n\n function sendGoalEvent(kind, goal) {\n const context = clientVars.ident.getContext();\n const event = {\n kind: kind,\n key: goal.key,\n data: null,\n url: window.location.href,\n creationDate: new Date().getTime(),\n context: context,\n };\n\n if (kind === 'click') {\n event.selector = goal.selector;\n }\n\n return clientVars.enqueueEvent(event);\n }\n\n function watchLocation(interval, callback) {\n let previousUrl = window.location.href;\n let currentUrl;\n\n function checkUrl() {\n currentUrl = window.location.href;\n\n if (currentUrl !== previousUrl) {\n previousUrl = currentUrl;\n callback();\n }\n }\n\n function poll(fn, interval) {\n fn();\n setTimeout(() => {\n poll(fn, interval);\n }, interval);\n }\n\n poll(checkUrl, interval);\n\n if (window.history && window.history.pushState) {\n window.addEventListener('popstate', checkUrl);\n } else {\n window.addEventListener('hashchange', checkUrl);\n }\n }\n\n clientVars.requestor\n .fetchJSON(getGoalsPath())\n .then((g) => {\n if (g && g.length > 0) {\n goals = g;\n goalTracker = GoalTracker(goals, sendGoalEvent);\n watchLocation(locationWatcherInterval, refreshGoalTracker);\n }\n readyCallback();\n })\n .catch((err) => {\n clientVars.emitter.maybeReportError(\n new common.errors.LDUnexpectedResponseError('Error fetching goals: ' + (err && err.message) ? err.message : err)\n );\n readyCallback();\n });\n\n return ret;\n}\n","import * as common from 'launchdarkly-js-sdk-common';\nimport * as importBasicLogger from './basicLogger';\nimport browserPlatform from './browserPlatform';\nimport GoalManager from './GoalManager';\n\nconst goalsEvent = 'goalsReady';\nconst extraOptionDefs = {\n fetchGoals: { default: true },\n hash: { type: 'string' },\n eventProcessor: { type: 'object' }, // used only in tests\n eventUrlTransformer: { type: 'function' },\n disableSyncEventPost: { default: false },\n};\n\n// Pass our platform object to the common code to create the browser version of the client\nexport function initialize(env, user, options = {}) {\n const platform = browserPlatform(options);\n const clientVars = common.initialize(env, user, options, platform, extraOptionDefs);\n\n const client = clientVars.client;\n const validatedOptions = clientVars.options;\n const emitter = clientVars.emitter;\n\n const goalsPromise = new Promise((resolve) => {\n const onGoals = emitter.on(goalsEvent, () => {\n emitter.off(goalsEvent, onGoals);\n resolve();\n });\n });\n client.waitUntilGoalsReady = () => goalsPromise;\n\n if (validatedOptions.fetchGoals) {\n GoalManager(clientVars, () => emitter.emit(goalsEvent));\n // Don't need to save a reference to the GoalManager - its constructor takes care of setting\n // up the necessary event wiring\n } else {\n emitter.emit(goalsEvent);\n }\n\n if (document.readyState !== 'complete') {\n window.addEventListener('load', clientVars.start);\n } else {\n clientVars.start();\n }\n\n const syncFlush = () => {\n // Synchronous events are not available in all browsers, but where they\n // are we should attempt to use them. This increases the chance of the events\n // being delivered.\n platform.synchronousFlush = true;\n client.flush().catch(() => {});\n platform.synchronousFlush = false;\n };\n\n // When the visibility of the page changes to hidden we want to flush any pending events.\n //\n // This is handled with visibility, instead of beforeunload/unload\n // because those events are not compatible with the bfcache and are unlikely\n // to be called in many situations. For more information see: https://developer.chrome.com/blog/page-lifecycle-api/\n //\n // Redundancy is included by using both the visibilitychange handler as well as\n // pagehide, because different browsers, and versions have different bugs with each.\n // This also may provide more opportunity for the events to get flushed.\n //\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n syncFlush();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n window.addEventListener('pagehide', syncFlush);\n\n return client;\n}\n\nexport const basicLogger = importBasicLogger.basicLogger;\n\nexport const createConsoleLogger = common.createConsoleLogger;\n\nexport const version = VERSION;\n\nfunction deprecatedInitialize(env, user, options = {}) {\n console && console.warn && console.warn(common.messages.deprecated('default export', 'named LDClient export')); // eslint-disable-line no-console\n return initialize(env, user, options);\n}\n\nexport default { initialize: deprecatedInitialize, version };\n","import newHttpRequest from './httpRequest';\n\nexport default function makeBrowserPlatform(options) {\n const ret = {\n userAgentHeaderName: 'X-LaunchDarkly-User-Agent',\n };\n\n ret.synchronousFlush = false; // this will be set to true by index.js if the page is hidden\n\n // XMLHttpRequest may not exist if we're running in a server-side rendering context\n if (window.XMLHttpRequest) {\n const disableSyncFlush = options && options.disableSyncEventPost;\n ret.httpRequest = (method, url, headers, body) => {\n const syncFlush = ret.synchronousFlush & !disableSyncFlush;\n ret.synchronousFlush = false;\n return newHttpRequest(method, url, headers, body, syncFlush);\n };\n }\n\n let hasCors;\n ret.httpAllowsPost = () => {\n // We compute this lazily because calling XMLHttpRequest() at initialization time can disrupt tests\n if (hasCors === undefined) {\n hasCors = window.XMLHttpRequest ? 'withCredentials' in new window.XMLHttpRequest() : false;\n }\n return hasCors;\n };\n\n // Image-based mechanism for sending events if POST isn't available\n ret.httpFallbackPing = (url) => {\n const img = new window.Image();\n img.src = url;\n };\n\n const eventUrlTransformer = options && options.eventUrlTransformer;\n ret.getCurrentUrl = () => (eventUrlTransformer ? eventUrlTransformer(window.location.href) : window.location.href);\n\n ret.isDoNotTrack = () => {\n let flag;\n if (window.navigator && window.navigator.doNotTrack !== undefined) {\n flag = window.navigator.doNotTrack; // FF, Chrome\n } else if (window.navigator && window.navigator.msDoNotTrack !== undefined) {\n flag = window.navigator.msDoNotTrack; // IE 9/10\n } else {\n flag = window.doNotTrack; // IE 11+, Safari\n }\n return flag === 1 || flag === true || flag === '1' || flag === 'yes';\n };\n\n try {\n if (window.localStorage) {\n ret.localStorage = {\n get: (key) =>\n new Promise((resolve) => {\n resolve(window.localStorage.getItem(key));\n }),\n set: (key, value) =>\n new Promise((resolve) => {\n window.localStorage.setItem(key, value);\n resolve();\n }),\n clear: (key) =>\n new Promise((resolve) => {\n window.localStorage.removeItem(key);\n resolve();\n }),\n };\n }\n } catch (e) {\n // In some browsers (such as Chrome), even looking at window.localStorage at all will cause a\n // security error if the feature is disabled.\n ret.localStorage = null;\n }\n\n // The browser built-in EventSource implementations do not support setting the method used for\n // the request. When useReport is true, we ensure sending the user in the body of a REPORT request\n // rather than in the URL path. If a polyfill for EventSource that supports setting the request\n // method is provided (currently, launchdarkly-eventsource is the only polyfill that both supports\n // it and gives us a way to *know* that it supports it), we use the polyfill to connect to a flag\n // stream that will provide evaluated flags for the specific user. Otherwise, when useReport is\n // true, we fall back to a generic 'ping' stream that informs the SDK to make a separate REPORT\n // request for the user's flag evaluations whenever the flag definitions have been updated.\n let eventSourceConstructor;\n const useReport = options && options.useReport;\n if (\n useReport &&\n typeof window.EventSourcePolyfill === 'function' &&\n window.EventSourcePolyfill.supportedOptions &&\n window.EventSourcePolyfill.supportedOptions.method\n ) {\n ret.eventSourceAllowsReport = true;\n eventSourceConstructor = window.EventSourcePolyfill;\n } else {\n ret.eventSourceAllowsReport = false;\n eventSourceConstructor = window.EventSource;\n }\n\n // If EventSource does not exist, the absence of eventSourceFactory will make us not try to open streams\n if (window.EventSource) {\n const timeoutMillis = 300000; // this is only used by polyfills - see below\n\n ret.eventSourceFactory = (url, options) => {\n // The standard EventSource constructor doesn't take any options, just a URL. However, some\n // EventSource polyfills allow us to specify a timeout interval, and in some cases they will\n // default to a too-short timeout if we don't specify one. So, here, we are setting the\n // timeout properties that are used by several popular polyfills.\n // Also, the skipDefaultHeaders property (if supported) tells the polyfill not to add the\n // Cache-Control header that can cause CORS problems in browsers.\n // See: https://github.com/launchdarkly/js-eventsource\n const defaultOptions = {\n heartbeatTimeout: timeoutMillis,\n silentTimeout: timeoutMillis,\n skipDefaultHeaders: true,\n };\n\n const esOptions = { ...defaultOptions, ...options };\n\n return new eventSourceConstructor(url, esOptions);\n };\n\n ret.eventSourceIsActive = (es) =>\n es.readyState === window.EventSource.OPEN || es.readyState === window.EventSource.CONNECTING;\n }\n\n ret.userAgent = 'JSClient';\n ret.version = VERSION;\n\n ret.diagnosticSdkData = {\n name: 'js-client-sdk',\n version: VERSION,\n };\n\n ret.diagnosticPlatformData = {\n name: 'JS',\n };\n\n ret.diagnosticUseCombinedEvent = true; // the browser SDK uses the \"diagnostic-combined\" event format\n\n return ret;\n}\n"],"names":["createCustomError","name","CustomError","message","code","Error","captureStackTrace","this","constructor","prototype","LDUnexpectedResponseError","LDInvalidEnvironmentIdError","LDInvalidUserError","LDInvalidEventKeyError","LDInvalidArgumentError","LDFlagFetchError","errors","LDInvalidDataError","isHttpErrorRecoverable","status","byteLength_1","b64","lens","getLens","validLen","placeHoldersLen","toByteArray_1","tmp","i","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray_1","uint8","length","extraBytes","parts","maxChunkLength","len2","push","encodeChunk","lookup","join","Uint8Array","Array","indexOf","start","end","num","output","isArray","keyList","Object","keys","hasProp","hasOwnProperty","fastDeepEqual","equal","a","b","key","arrA","arrB","dateA","Date","dateB","getTime","regexpA","RegExp","regexpB","toString","call","userAttrsToStringify","btoa","s","escaped","unescape","encodeURIComponent","base64","fromByteArray","stringToBytes","base64URLEncode","replace","objectHasOwnProperty","object","getRandomValues","utils","appendUrlPath","baseUrl","path","endsWith","substring","startsWith","chunkEventsForUrl","maxLength","events","allEvents","slice","allChunks","chunk","remainingSpace","event","shift","JSON","stringify","unshift","clone","obj","parse","deepEquals","extend","objects","reduce","acc","getLDUserAgentString","platform","version","userAgent","onNextTick","cb","setTimeout","sanitizeContext","context","newContext","kind","undefined","forEach","attr","value","String","transformValuesToVersionedValues","flags","ret","transformVersionedValuesToValues","flagsState","wrapPromiseCallback","promise","callback","then","error","Promise","reject","rnds8","rng","crypto","bind","msCrypto","REGEX","validate","uuid","test","_nodeId","_clockseq","byteToHex","substr","offset","arguments","toLowerCase","TypeError","_lastMSecs","_lastNSecs","v","parseInt","v35","hashfunc","generateUUID","namespace","buf","str","bytes","set","err","DNS","URL","getOutputLength","inputLength8","safeAdd","x","y","lsw","md5cmn","q","t","cnt","md5ff","c","d","md5gg","md5hh","md5ii","v3","msg","input","length32","hexTab","hex","charAt","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","v3$1","f","z","ROTL","n","v5","K","H","l","N","Math","ceil","M","_i","j","pow","floor","_i2","W","_t","e","_t2","T","v5$1","options","node","clockseq","seedBytes","random","msecs","now","nsecs","dt","tl","tmh","rnds","logLevels","loggers","commonBasicLogger","formatFn","destination","toConsole","methodName","line","console","destinations","prependLevelToMessage","prefix","minLevel","level","write","levelIndex","levelName","args","fullPrefix","tempArgs","log","logger","validateLogger","errorString","docLink","messages","bootstrapInvalid","bootstrapOldFormat","clientInitialized","clientNotReady","debugEnqueueingEvent","debugPostingDiagnosticEvent","debugPostingEvents","count","debugStreamDelete","debugStreamDeleteIgnored","debugStreamPatch","debugStreamPatchIgnored","debugStreamPing","debugPolling","url","debugStreamPut","deprecated","oldName","newName","environmentNotFound","environmentNotSpecified","errorFetchingFlags","eventCapacityExceeded","eventWithoutContext","httpErrorMessage","retryMessage","httpUnavailable","identifyDisabled","inspectorMethodError","type","invalidContentType","contentType","invalidData","invalidInspector","invalidKey","invalidContext","invalidTagValue","localStorageUnavailable","networkError","optionBelowMinimum","minimum","streamClosing","streamConnecting","streamError","streamReconnectDelay","tagValueTooLong","unknownCustomEventKey","unknownOption","contextNotSpecified","unrecoverableStreamError","wrongOptionType","expectedType","actualType","wrongOptionTypeBoolean","require$$0","baseOptionDefs","default","streamUrl","eventsUrl","sendEvents","streaming","sendLDHeaders","requestHeaderTransform","sendEventsOnlyForVariation","useReport","evaluationReasons","eventCapacity","flushInterval","samplingInterval","allAttributesPrivate","privateAttributes","bootstrap","diagnosticRecordingInterval","diagnosticOptOut","wrapperName","wrapperVersion","stateProvider","application","validator","validated","id","validateTagValue","inspectors","allowedTagCharacters","canonicalizeUrl","tagValue","match","warn","configuration","emitter","extraOptionDefs","optionDefs","deprecatedOptions","reportArgumentError","maybeReportError","config","opts","checkDeprecatedOptions","applyDefaults","typeDescForValue","optionDef","allowedTypes","split","validateTypesAndNames","getTags","tags","headers","getLDHeaders","h","userAgentHeaderName","tagKeys","sort","map","flattened","item","concat","transformHeaders","v1","uuidv1","require$$1","EventSender_1","environmentId","imageUrlPath","baseHeaders","httpFallbackPing","sender","sendChunk","isDiagnostic","usePost","jsonBody","payloadId","doPostRequest","canRetry","httpRequest","result","dateStr","header","time","serverTime","getResponseInfo","catch","resolve","canPost","httpAllowsPost","chunks","results","all","validKind","encodeKey","includes","checkContext","allowLegacyKey","kindValid","keyValid","kinds","filter","every","contextKey","getContextKeys","user","entries","getContextKinds","getCanonicalKey","EventSummarizer_1","es","startDate","endDate","counters","contextKinds","summarizeEvent","counterKey","variation","counterVal","Set","contextKeys","getKinds","add","creationDate","getSummary","flagsOut","empty","values","flag","counterOut","unknown","features","clearSummary","processEscapeCharacters","getComponents","reference","component","isLiteral","compare","aIsLiteral","bIsLiteral","bComponents","aComponents","literalToReference","literal","attributeReference","cloneExcluding","target","references","stack","cloned","excluded","ptr","source","parent","visited","pop","some","ContextFilter_1","protectedAttributes","legacyTopLevelCopyAttributes","filterSingleKind","AttributeReference","_meta","protectedAttr","getAttributesToFilter","redactedAttributes","anonymous","filtered","custom","privateAttributeNames","legacyToSingleKind","filteredContext","filterMultiKind","EventProcessor_1","diagnosticsAccumulator","processor","eventSender","EventSender","mainEventsUrl","summarizer","EventSummarizer","contextFilter","ContextFilter","flushTimer","queue","lastKnownPastTime","disabled","exceededCapacity","shouldSampleEvent","makeOutputEvent","addToOutbox","incrementDroppedEvents","enqueue","addFullEvent","addDebugEvent","trackEvents","debugEventsUntilDate","debugEvent","flush","eventsToSend","summary","setEventsInLastBatch","debug","responses","responseInfo","flushTick","stop","clearTimeout","EventEmitter_1","on","handler","off","emit","copiedHandlers","apply","getEvents","getEventListenerCount","readyEvent","successEvent","failureEvent","InitializationState","eventEmitter","succeeded","failed","failureValue","initializationPromise","readyPromise","onReady","getInitializationPromise","onSuccess","onFailure","getReadyPromise","signalSuccess","signalFailure","PersistentFlagStore_1","storage","environment","hash","ident","store","getFlagsKey","getContext","loadFlags","get","dataStr","data","schema","$schema","ex","clearFlags","saveFlags","clear","PersistentStorage_1","localStorageProvider","loggedError","logError","isEnabled","require$$2","Stream_1","stream","evalUrlPrefix","withReasons","baseReconnectDelay","connectionAttemptStartTime","firstConnectionErrorLogged","reconnectTimeoutReference","handlers","retryCount","getNextRetryDelay","delay","computedDelayMillis","backoff","trunc","handleError","closeConnection","logConnectionResult","tryConnect","openConnection","query","readTimeoutMillis","eventSourceFactory","eventSourceAllowsReport","method","body","info","addEventListener","onerror","onopen","close","success","recordStreamInit","connect","newHash","newHandlers","disconnect","isConnected","eventSourceIsActive","promiseCoalescer_1","finallyFn","currentPromise","currentCancelFn","finalResolve","finalReject","coalescer","p","cancelFn","resultPromise","jsonContentType","Requestor_1","requestor","activeRequests","fetchJSON","endpoint","promiseCoalescer","req","statusText","getResponseError","addPromise","cancel","fetchFlagSettings","Identity_1","initialContext","onChange","setContext","AnonymousContextProcessor_1","persistentStorage","getContextKeyIdString","processSingleKindContext","getCachedContextKey","cachedId","setCachedContextKey","processContext","processedContext","diagnosticEvents","DiagnosticId","sdkKey","diagnosticId","sdkKeySuffix","DiagnosticsAccumulator","startTime","dataSinceDate","droppedEvents","eventsInLastBatch","streamInits","reset","getProps","setProps","props","timestamp","durationMillis","DiagnosticsManager","accumulator","combinedMode","diagnosticUseCombinedEvent","localStorageKey","diagnosticEventsUrl","periodicInterval","eventSentTime","periodicTimer","streamingEnabled","manager","makeInitProperties","sdk","makeSdkData","makeConfigData","diagnosticPlatformData","sendDiagnosticEvent","sendPeriodicEvent","currentTime","createPeriodicEventAndReset","saveProperties","sdkData","diagnosticSdkData","customBaseURI","customStreamURI","customEventsURI","eventsCapacity","eventsFlushIntervalMillis","reconnectTimeMillis","streamingDisabled","diagnosticRecordingIntervalMillis","usingSecureMode","bootstrapMode","fetchGoalsDisabled","fetchGoals","loadProperties","localStorageAvailable","nextEventTime","timeNow","setStreaming","enabled","SafeInspector_1","inspector","errorLogged","wrapper","InspectorTypes","flagUsed","flagDetailsChanged","flagDetailChanged","clientIdentityChanged","freeze","InspectorManager_1","InspectorManager","inspectorsByType","safeInspectors","SafeInspector","safeInspector","hasListeners","onFlagUsed","flagKey","detail","onFlags","onFlagChanged","onIdentityChanged","changeEvent","internalChangeEvent","src","initialize","env","specifiedOptions","createLogger","EventEmitter","initializationStateTracker","InitializationStateTracker","inspectorManager","PersistentStorage","localStorage","diagnosticsEnabled","diagnostics","diagnosticsManager","Stream","eventProcessor","EventProcessor","Requestor","useLocalStorage","streamActive","subscribedToChangeEvents","streamForcedState","inited","closed","firstEvent","Identity","enqueueEvent","sendIdentifyEvent","anonymousContextProcessor","AnonymousContextProcessor","persistentFlagStore","PersistentFlagStore","isDoNotTrack","notifyInspectionFlagChanged","newFlag","getFlagDetail","notifyInspectionFlagsChanged","cur","sendFlagEvent","defaultValue","includeReason","variationIndex","flagVersion","trackReason","reason","verifyContext","variationDetailInternal","sendEvent","includeReasonInEvent","isAllFlags","deleted","errorKind","notifyInspectionFlagUsed","connectStream","tryParseData","jsonData","ping","contextAtTimeOfPingEvent","requestedFlags","replaceAllFlags","put","patch","oldFlag","mods","newDetail","previous","current","handleFlagChanges","delete","disconnectStream","newFlags","changes","changeEventParams","updateStreamingState","shouldBeStreaming","isChangeEventKey","toUpperCase","metadataKey","validKey","metadata","readFlagsFromBootstrap","state","getInitialState","initFromStateProvider","validatedContext","signalSuccessfulInit","storedFlags","signalFailedInit","finishInit","client","waitForInitialization","waitUntilReady","identify","onDone","clearFirst","flagValueMap","variationDetail","track","metricValue","customEventFilter","getCurrentUrl","contextKind","haveListeners","newState","allFlags","finishClose","getFlagsInternal","getEnvironmentId","internalChangeEventName","_objectSpread","emptyResult","newHttpRequest","pageIsClosing","window","navigator","chromeMatch","isSyncXhrSupported","xhr","XMLHttpRequest","open","setRequestHeader","send","cancelled","getResponseHeader","responseText","abort","escapeStringRegexp","string","doesUrlMatch","matcher","href","search","regex","testUrl","canonicalUrl","pattern","GoalTracker","goals","onEvent","tracker","listenerFn","clickGoals","goal","urls","location","matches","selector","elements","document","querySelectorAll","parentNode","findGoalsForClick","dispose","removeEventListener","locationWatcherInterval","GoalManager","clientVars","readyCallback","goalTracker","refreshGoalTracker","sendGoalEvent","g","interval","currentUrl","previousUrl","checkUrl","poll","fn","history","pushState","watchLocation","common","goalsEvent","eventUrlTransformer","disableSyncEventPost","hasCors","disableSyncFlush","syncFlush","synchronousFlush","Image","eventSourceConstructor","doNotTrack","msDoNotTrack","getItem","setItem","removeItem","EventSourcePolyfill","supportedOptions","EventSource","timeoutMillis","esOptions","defaultOptions","heartbeatTimeout","silentTimeout","skipDefaultHeaders","readyState","OPEN","CONNECTING","browserPlatform","validatedOptions","goalsPromise","onGoals","waitUntilGoalsReady","visibilityState","basicLogger","importBasicLogger","index"],"mappings":"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"}