{"version":3,"sources":["jsdelivr-header.js","/npm/moesif-browser-js@1.10.2/build/moesif.cjs.js"],"names":[],"mappings":"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","file":"/npm/moesif-browser-js@1.10.2/build/moesif.cjs.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /npm/moesif-browser-js@1.10.2/build/moesif.cjs.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\nvar Config = {\n    DEBUG: false,\n    LIB_VERSION: '1.10.2'\n};\n\n// since es6 imports are static and we run unit tests from the console, window won't be defined when importing this file\nvar win;\nif (typeof(window) === 'undefined') {\n    var loc = {\n        hostname: ''\n    };\n    win = {\n        navigator: { userAgent: '' },\n        document: {\n            location: loc,\n            referrer: ''\n        },\n        screen: { width: 0, height: 0 },\n        location: loc\n    };\n} else {\n    win = window;\n}\n\n/*\n * Saved references to long variable names, so that closure compiler can\n * minimize file size.\n */\n\nvar ArrayProto = Array.prototype;\nvar FuncProto = Function.prototype;\nvar ObjProto = Object.prototype;\nvar slice = ArrayProto.slice;\nvar toString = ObjProto.toString;\nvar hasOwnProperty = ObjProto.hasOwnProperty;\nvar windowConsole = win.console;\nvar navigator$1 = win.navigator;\nvar document$1 = win.document;\nvar windowOpera = win.opera;\nvar screen = win.screen;\nvar userAgent = navigator$1.userAgent;\nvar nativeBind = FuncProto.bind;\nvar nativeForEach = ArrayProto.forEach;\nvar nativeIndexOf = ArrayProto.indexOf;\nvar nativeMap = ArrayProto.map;\nvar nativeIsArray = Array.isArray;\nvar breaker = {};\nvar _ = {\n    trim: function(str) {\n        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill\n        return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n    }\n};\n\n// Console override\nvar console$1 = {\n    /** @type {function(...*)} */\n    log: function() {\n        if (Config.DEBUG && !_.isUndefined(windowConsole) && windowConsole) {\n            try {\n                windowConsole.log.apply(windowConsole, arguments);\n            } catch (err) {\n                _.each(arguments, function(arg) {\n                    windowConsole.log(arg);\n                });\n            }\n        }\n    },\n    /** @type {function(...*)} */\n    error: function() {\n        if (Config.DEBUG && !_.isUndefined(windowConsole) && windowConsole) {\n            var args = ['Moesif error:'].concat(_.toArray(arguments));\n            try {\n                windowConsole.error.apply(windowConsole, args);\n            } catch (err) {\n                _.each(args, function(arg) {\n                    windowConsole.error(arg);\n                });\n            }\n        }\n    },\n    /** @type {function(...*)} */\n    critical: function() {\n        if (!_.isUndefined(windowConsole) && windowConsole) {\n            var args = ['Moesif error:'].concat(_.toArray(arguments));\n            try {\n                windowConsole.error.apply(windowConsole, args);\n            } catch (err) {\n                _.each(args, function(arg) {\n                    windowConsole.error(arg);\n                });\n            }\n        }\n    }\n};\n\nvar log_func_with_prefix = function(func, prefix) {\n    return function() {\n        arguments[0] = '[' + prefix + '] ' + arguments[0];\n        return func.apply(console$1, arguments);\n    };\n};\nvar console_with_prefix = function(prefix) {\n    return {\n        log: log_func_with_prefix(console$1.log, prefix),\n        error: log_func_with_prefix(console$1.error, prefix),\n        critical: log_func_with_prefix(console$1.critical, prefix)\n    };\n};\n\n// UNDERSCORE\n// Embed part of the Underscore Library\n_.bind = function(func, context) {\n    var args, bound;\n    if (nativeBind && func.bind === nativeBind) {\n        return nativeBind.apply(func, slice.call(arguments, 1));\n    }\n    if (!_.isFunction(func)) {\n        throw new TypeError();\n    }\n    args = slice.call(arguments, 2);\n    bound = function() {\n        if (!(this instanceof bound)) {\n            return func.apply(context, args.concat(slice.call(arguments)));\n        }\n        var ctor = {};\n        ctor.prototype = func.prototype;\n        var self = new ctor();\n        ctor.prototype = null;\n        var result = func.apply(self, args.concat(slice.call(arguments)));\n        if (Object(result) === result) {\n            return result;\n        }\n        return self;\n    };\n    return bound;\n};\n\n_.bind_instance_methods = function(obj) {\n    for (var func in obj) {\n        if (typeof(obj[func]) === 'function') {\n            obj[func] = _.bind(obj[func], obj);\n        }\n    }\n};\n\n/**\n * @param {*=} obj\n * @param {function(...*)=} iterator\n * @param {Object=} context\n */\n_.each = function(obj, iterator, context) {\n    if (obj === null || obj === undefined) {\n        return;\n    }\n    if (nativeForEach && obj.forEach === nativeForEach) {\n        obj.forEach(iterator, context);\n    } else if (obj.length === +obj.length) {\n        for (var i = 0, l = obj.length; i < l; i++) {\n            if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) {\n                return;\n            }\n        }\n    } else {\n        for (var key in obj) {\n            if (hasOwnProperty.call(obj, key)) {\n                if (iterator.call(context, obj[key], key, obj) === breaker) {\n                    return;\n                }\n            }\n        }\n    }\n};\n\n_.escapeHTML = function(s) {\n    var escaped = s;\n    if (escaped && _.isString(escaped)) {\n        escaped = escaped\n            .replace(/&/g, '&amp;')\n            .replace(/</g, '&lt;')\n            .replace(/>/g, '&gt;')\n            .replace(/\"/g, '&quot;')\n            .replace(/'/g, '&#039;');\n    }\n    return escaped;\n};\n\n_.extend = function(obj) {\n    _.each(slice.call(arguments, 1), function(source) {\n        for (var prop in source) {\n            if (source[prop] !== void 0) {\n                obj[prop] = source[prop];\n            }\n        }\n    });\n    return obj;\n};\n\n_.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) === '[object Array]';\n};\n\n// from a comment on http://dbj.org/dbj/?p=286\n// fails on only one very rare and deliberate custom object:\n// var bomb = { toString : undefined, valueOf: function(o) { return \"function BOMBA!\"; }};\n_.isFunction = function(f) {\n    try {\n        return /^\\s*\\bfunction\\b/.test(f);\n    } catch (x) {\n        return false;\n    }\n};\n\n_.isArguments = function(obj) {\n    return !!(obj && hasOwnProperty.call(obj, 'callee'));\n};\n\n_.toArray = function(iterable) {\n    if (!iterable) {\n        return [];\n    }\n    if (iterable.toArray) {\n        return iterable.toArray();\n    }\n    if (_.isArray(iterable)) {\n        return slice.call(iterable);\n    }\n    if (_.isArguments(iterable)) {\n        return slice.call(iterable);\n    }\n    return _.values(iterable);\n};\n\n_.map = function(arr, callback) {\n    if (nativeMap && arr.map === nativeMap) {\n        return arr.map(callback);\n    } else {\n        var results = [];\n        _.each(arr, function(item) {\n            results.push(callback(item));\n        });\n        return results;\n    }\n};\n\n_.keys = function(obj) {\n    var results = [];\n    if (obj === null) {\n        return results;\n    }\n    _.each(obj, function(value, key) {\n        results[results.length] = key;\n    });\n    return results;\n};\n\n_.values = function(obj) {\n    var results = [];\n    if (obj === null) {\n        return results;\n    }\n    _.each(obj, function(value) {\n        results[results.length] = value;\n    });\n    return results;\n};\n\n_.identity = function(value) {\n    return value;\n};\n\n_.include = function(obj, target) {\n    var found = false;\n    if (obj === null) {\n        return found;\n    }\n    if (nativeIndexOf && obj.indexOf === nativeIndexOf) {\n        return obj.indexOf(target) != -1;\n    }\n    _.each(obj, function(value) {\n        if (found || (found = (value === target))) {\n            return breaker;\n        }\n    });\n    return found;\n};\n\n_.includes = function(str, needle) {\n    return str.indexOf(needle) !== -1;\n};\n\n// Underscore Addons\n_.inherit = function(subclass, superclass) {\n    subclass.prototype = new superclass();\n    subclass.prototype.constructor = subclass;\n    subclass.superclass = superclass.prototype;\n    return subclass;\n};\n\n_.isArrayBuffer = function(value) {\n  var toString = Object.prototype.toString;\n  var hasArrayBuffer = typeof ArrayBuffer === 'function';\n  return hasArrayBuffer && (value instanceof ArrayBuffer || toString.call(value) === '[object ArrayBuffer]');\n};\n\n_.isObject = function(obj) {\n    return (obj === Object(obj) && !_.isArray(obj));\n};\n\n_.isEmptyObject = function(obj) {\n    if (_.isObject(obj)) {\n        for (var key in obj) {\n            if (hasOwnProperty.call(obj, key)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    return false;\n};\n\n_.isEmptyString = function isEmptyString(str) {\n  return (!str || str.length === 0);\n};\n\n_.isUndefined = function(obj) {\n    return obj === void 0;\n};\n\n_.isString = function(obj) {\n    return toString.call(obj) == '[object String]';\n};\n\n_.isDate = function(obj) {\n    return toString.call(obj) == '[object Date]';\n};\n\n_.isNumber = function(obj) {\n    return toString.call(obj) == '[object Number]';\n};\n\n_.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n};\n\n_.isNil = function(val) {\n  return _.isUndefined(val) || val === null;\n};\n\n_.encodeDates = function(obj) {\n    _.each(obj, function(v, k) {\n        if (_.isDate(v)) {\n            obj[k] = _.formatDate(v);\n        } else if (_.isObject(v)) {\n            obj[k] = _.encodeDates(v); // recurse\n        }\n    });\n    return obj;\n};\n\n_.timestamp = function() {\n    Date.now = Date.now || function() {\n        return +new Date;\n    };\n    return Date.now();\n};\n\n_.formatDate = function(d) {\n    // YYYY-MM-DDTHH:MM:SS in UTC\n    function pad(n) {\n        return n < 10 ? '0' + n : n;\n    }\n    return d.getUTCFullYear() + '-' +\n        pad(d.getUTCMonth() + 1) + '-' +\n        pad(d.getUTCDate()) + 'T' +\n        pad(d.getUTCHours()) + ':' +\n        pad(d.getUTCMinutes()) + ':' +\n        pad(d.getUTCSeconds());\n};\n\n_.safewrap = function(f) {\n    return function() {\n        try {\n            return f.apply(this, arguments);\n        } catch (e) {\n            console$1.critical('Implementation error. Please turn on debug and contact support@Moesif.com.');\n            if (Config.DEBUG){\n                console$1.critical(e);\n            }\n        }\n    };\n};\n\n_.safewrap_class = function(klass, functions) {\n    for (var i = 0; i < functions.length; i++) {\n        klass.prototype[functions[i]] = _.safewrap(klass.prototype[functions[i]]);\n    }\n};\n\n_.safewrap_instance_methods = function(obj) {\n    for (var func in obj) {\n        if (typeof(obj[func]) === 'function') {\n            obj[func] = _.safewrap(obj[func]);\n        }\n    }\n};\n\n_.strip_empty_properties = function(p) {\n    var ret = {};\n    _.each(p, function(v, k) {\n        if (_.isString(v) && v.length > 0) {\n            ret[k] = v;\n        }\n    });\n    return ret;\n};\n\n/*\n * this function returns a copy of object after truncating it.  If\n * passed an Array or Object it will iterate through obj and\n * truncate all the values recursively.\n */\n_.truncate = function(obj, length) {\n    var ret;\n\n    if (typeof(obj) === 'string') {\n        ret = obj.slice(0, length);\n    } else if (_.isArray(obj)) {\n        ret = [];\n        _.each(obj, function(val) {\n            ret.push(_.truncate(val, length));\n        });\n    } else if (_.isObject(obj)) {\n        ret = {};\n        _.each(obj, function(val, key) {\n            ret[key] = _.truncate(val, length);\n        });\n    } else {\n        ret = obj;\n    }\n\n    return ret;\n};\n\n_.JSONEncode = (function() {\n    return function(mixed_val) {\n        var value = mixed_val;\n        var quote = function(string) {\n            var escapable = /[\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g; // eslint-disable-line no-control-regex\n            var meta = { // table of character substitutions\n                '\\b': '\\\\b',\n                '\\t': '\\\\t',\n                '\\n': '\\\\n',\n                '\\f': '\\\\f',\n                '\\r': '\\\\r',\n                '\"': '\\\\\"',\n                '\\\\': '\\\\\\\\'\n            };\n\n            escapable.lastIndex = 0;\n            return escapable.test(string) ?\n                '\"' + string.replace(escapable, function(a) {\n                    var c = meta[a];\n                    return typeof c === 'string' ? c :\n                        '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n                }) + '\"' :\n                '\"' + string + '\"';\n        };\n\n        var str = function(key, holder) {\n            var gap = '';\n            var indent = '    ';\n            var i = 0; // The loop counter.\n            var k = ''; // The member key.\n            var v = ''; // The member value.\n            var length = 0;\n            var mind = gap;\n            var partial = [];\n            var value = holder[key];\n\n            // If the value has a toJSON method, call it to obtain a replacement value.\n            if (value && typeof value === 'object' &&\n                typeof value.toJSON === 'function') {\n                value = value.toJSON(key);\n            }\n\n            // What happens next depends on the value's type.\n            switch (typeof value) {\n                case 'string':\n                    return quote(value);\n\n                case 'number':\n                    // JSON numbers must be finite. Encode non-finite numbers as null.\n                    return isFinite(value) ? String(value) : 'null';\n\n                case 'boolean':\n                case 'null':\n                    // If the value is a boolean or null, convert it to a string. Note:\n                    // typeof null does not produce 'null'. The case is included here in\n                    // the remote chance that this gets fixed someday.\n\n                    return String(value);\n\n                case 'object':\n                    // If the type is 'object', we might be dealing with an object or an array or\n                    // null.\n                    // Due to a specification blunder in ECMAScript, typeof null is 'object',\n                    // so watch out for that case.\n                    if (!value) {\n                        return 'null';\n                    }\n\n                    // Make an array to hold the partial results of stringifying this object value.\n                    gap += indent;\n                    partial = [];\n\n                    // Is the value an array?\n                    if (toString.apply(value) === '[object Array]') {\n                        // The value is an array. Stringify every element. Use null as a placeholder\n                        // for non-JSON values.\n\n                        length = value.length;\n                        for (i = 0; i < length; i += 1) {\n                            partial[i] = str(i, value) || 'null';\n                        }\n\n                        // Join all of the elements together, separated with commas, and wrap them in\n                        // brackets.\n                        v = partial.length === 0 ? '[]' :\n                            gap ? '[\\n' + gap +\n                            partial.join(',\\n' + gap) + '\\n' +\n                            mind + ']' :\n                                '[' + partial.join(',') + ']';\n                        gap = mind;\n                        return v;\n                    }\n\n                    // Iterate through all of the keys in the object.\n                    for (k in value) {\n                        if (hasOwnProperty.call(value, k)) {\n                            v = str(k, value);\n                            if (v) {\n                                partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                            }\n                        }\n                    }\n\n                    // Join all of the member texts together, separated with commas,\n                    // and wrap them in braces.\n                    v = partial.length === 0 ? '{}' :\n                        gap ? '{' + partial.join(',') + '' +\n                        mind + '}' : '{' + partial.join(',') + '}';\n                    gap = mind;\n                    return v;\n            }\n        };\n\n        // Make a fake root object containing our value under the key of ''.\n        // Return the result of stringifying the value.\n        return str('', {\n            '': value\n        });\n    };\n})();\n\n/**\n * From https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js\n * Slightly modified to throw a real Error rather than a POJO\n */\n_.JSONDecode = (function() {\n    var at, // The index of the current character\n        ch, // The current character\n        escapee = {\n            '\"': '\"',\n            '\\\\': '\\\\',\n            '/': '/',\n            'b': '\\b',\n            'f': '\\f',\n            'n': '\\n',\n            'r': '\\r',\n            't': '\\t'\n        },\n        text,\n        error = function(m) {\n            var e = new SyntaxError(m);\n            e.at = at;\n            e.text = text;\n            throw e;\n        },\n        next = function(c) {\n            // If a c parameter is provided, verify that it matches the current character.\n            if (c && c !== ch) {\n                error('Expected \\'' + c + '\\' instead of \\'' + ch + '\\'');\n            }\n            // Get the next character. When there are no more characters,\n            // return the empty string.\n            ch = text.charAt(at);\n            at += 1;\n            return ch;\n        },\n        number = function() {\n            // Parse a number value.\n            var number,\n                string = '';\n\n            if (ch === '-') {\n                string = '-';\n                next('-');\n            }\n            while (ch >= '0' && ch <= '9') {\n                string += ch;\n                next();\n            }\n            if (ch === '.') {\n                string += '.';\n                while (next() && ch >= '0' && ch <= '9') {\n                    string += ch;\n                }\n            }\n            if (ch === 'e' || ch === 'E') {\n                string += ch;\n                next();\n                if (ch === '-' || ch === '+') {\n                    string += ch;\n                    next();\n                }\n                while (ch >= '0' && ch <= '9') {\n                    string += ch;\n                    next();\n                }\n            }\n            number = +string;\n            if (!isFinite(number)) {\n                error('Bad number');\n            } else {\n                return number;\n            }\n        },\n\n        string = function() {\n            // Parse a string value.\n            var hex,\n                i,\n                string = '',\n                uffff;\n            // When parsing for string values, we must look for \" and \\ characters.\n            if (ch === '\"') {\n                while (next()) {\n                    if (ch === '\"') {\n                        next();\n                        return string;\n                    }\n                    if (ch === '\\\\') {\n                        next();\n                        if (ch === 'u') {\n                            uffff = 0;\n                            for (i = 0; i < 4; i += 1) {\n                                hex = parseInt(next(), 16);\n                                if (!isFinite(hex)) {\n                                    break;\n                                }\n                                uffff = uffff * 16 + hex;\n                            }\n                            string += String.fromCharCode(uffff);\n                        } else if (typeof escapee[ch] === 'string') {\n                            string += escapee[ch];\n                        } else {\n                            break;\n                        }\n                    } else {\n                        string += ch;\n                    }\n                }\n            }\n            error('Bad string');\n        },\n        white = function() {\n            // Skip whitespace.\n            while (ch && ch <= ' ') {\n                next();\n            }\n        },\n        word = function() {\n            // true, false, or null.\n            switch (ch) {\n                case 't':\n                    next('t');\n                    next('r');\n                    next('u');\n                    next('e');\n                    return true;\n                case 'f':\n                    next('f');\n                    next('a');\n                    next('l');\n                    next('s');\n                    next('e');\n                    return false;\n                case 'n':\n                    next('n');\n                    next('u');\n                    next('l');\n                    next('l');\n                    return null;\n            }\n            error('Unexpected \"' + ch + '\"');\n        },\n        value, // Placeholder for the value function.\n        array = function() {\n            // Parse an array value.\n            var array = [];\n\n            if (ch === '[') {\n                next('[');\n                white();\n                if (ch === ']') {\n                    next(']');\n                    return array; // empty array\n                }\n                while (ch) {\n                    array.push(value());\n                    white();\n                    if (ch === ']') {\n                        next(']');\n                        return array;\n                    }\n                    next(',');\n                    white();\n                }\n            }\n            error('Bad array');\n        },\n        object = function() {\n            // Parse an object value.\n            var key,\n                object = {};\n\n            if (ch === '{') {\n                next('{');\n                white();\n                if (ch === '}') {\n                    next('}');\n                    return object; // empty object\n                }\n                while (ch) {\n                    key = string();\n                    white();\n                    next(':');\n                    if (Object.hasOwnProperty.call(object, key)) {\n                        error('Duplicate key \"' + key + '\"');\n                    }\n                    object[key] = value();\n                    white();\n                    if (ch === '}') {\n                        next('}');\n                        return object;\n                    }\n                    next(',');\n                    white();\n                }\n            }\n            error('Bad object');\n        };\n\n    value = function() {\n        // Parse a JSON value. It could be an object, an array, a string,\n        // a number, or a word.\n        white();\n        switch (ch) {\n            case '{':\n                return object();\n            case '[':\n                return array();\n            case '\"':\n                return string();\n            case '-':\n                return number();\n            default:\n                return ch >= '0' && ch <= '9' ? number() : word();\n        }\n    };\n\n    // Return the json_parse function. It will have access to all of the\n    // above functions and variables.\n    return function(source) {\n        var result;\n\n        text = source;\n        at = 0;\n        ch = ' ';\n        result = value();\n        white();\n        if (ch) {\n            error('Syntax error');\n        }\n\n        return result;\n    };\n})();\n\n_.base64Encode = function(data) {\n    var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,\n        ac = 0,\n        enc = '',\n        tmp_arr = [];\n\n    if (!data) {\n        return data;\n    }\n\n    data = _.utf8Encode(data);\n\n    do { // pack three octets into four hexets\n        o1 = data.charCodeAt(i++);\n        o2 = data.charCodeAt(i++);\n        o3 = data.charCodeAt(i++);\n\n        bits = o1 << 16 | o2 << 8 | o3;\n\n        h1 = bits >> 18 & 0x3f;\n        h2 = bits >> 12 & 0x3f;\n        h3 = bits >> 6 & 0x3f;\n        h4 = bits & 0x3f;\n\n        // use hexets to index into b64, and append result to encoded string\n        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);\n    } while (i < data.length);\n\n    enc = tmp_arr.join('');\n\n    switch (data.length % 3) {\n        case 1:\n            enc = enc.slice(0, -2) + '==';\n            break;\n        case 2:\n            enc = enc.slice(0, -1) + '=';\n            break;\n    }\n\n    return enc;\n};\n\n_.utf8Encode = function(string) {\n    string = (string + '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n\n    var utftext = '',\n        start,\n        end;\n    var stringl = 0,\n        n;\n\n    start = end = 0;\n    stringl = string.length;\n\n    for (n = 0; n < stringl; n++) {\n        var c1 = string.charCodeAt(n);\n        var enc = null;\n\n        if (c1 < 128) {\n            end++;\n        } else if ((c1 > 127) && (c1 < 2048)) {\n            enc = String.fromCharCode((c1 >> 6) | 192, (c1 & 63) | 128);\n        } else {\n            enc = String.fromCharCode((c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128);\n        }\n        if (enc !== null) {\n            if (end > start) {\n                utftext += string.substring(start, end);\n            }\n            utftext += enc;\n            start = end = n + 1;\n        }\n    }\n\n    if (end > start) {\n        utftext += string.substring(start, string.length);\n    }\n\n    return utftext;\n};\n\n_.UUID = (function() {\n\n    // Time/ticks information\n    // 1*new Date() is a cross browser version of Date.now()\n    var T = function() {\n        var d = 1 * new Date(),\n            i = 0;\n\n        // this while loop figures how many browser ticks go by\n        // before 1*new Date() returns a new number, ie the amount\n        // of ticks that go by per millisecond\n        while (d == 1 * new Date()) {\n            i++;\n        }\n\n        return d.toString(16) + i.toString(16);\n    };\n\n    // Math.Random entropy\n    var R = function() {\n        return Math.random().toString(16).replace('.', '');\n    };\n\n    // User agent entropy\n    // This function takes the user agent string, and then xors\n    // together each sequence of 8 bytes.  This produces a final\n    // sequence of 8 bytes which it returns as hex.\n    var UA = function() {\n        var ua = userAgent,\n            i, ch, buffer = [],\n            ret = 0;\n\n        function xor(result, byte_array) {\n            var j, tmp = 0;\n            for (j = 0; j < byte_array.length; j++) {\n                tmp |= (buffer[j] << j * 8);\n            }\n            return result ^ tmp;\n        }\n\n        for (i = 0; i < ua.length; i++) {\n            ch = ua.charCodeAt(i);\n            buffer.unshift(ch & 0xFF);\n            if (buffer.length >= 4) {\n                ret = xor(ret, buffer);\n                buffer = [];\n            }\n        }\n\n        if (buffer.length > 0) {\n            ret = xor(ret, buffer);\n        }\n\n        return ret.toString(16);\n    };\n\n    return function() {\n        var se = (screen.height * screen.width).toString(16);\n        return (T() + '-' + R() + '-' + UA() + '-' + se);\n    };\n})();\n\n\n_.uuid4 = function () {\n  // based on\n  // https://github.com/tracker1/node-uuid4/blob/master/browser.js\n  var temp_url = URL.createObjectURL(new Blob());\n  var uuid = temp_url.toString();\n  URL.revokeObjectURL(temp_url);\n  return uuid.split(/[:\\/]/g).pop().toLowerCase(); // remove prefixes\n};\n\n// _.isBlockedUA()\n// This is to block various web spiders from executing our JS and\n// sending false tracking data\n_.isBlockedUA = function(ua) {\n    if (/(google web preview|baiduspider|yandexbot|bingbot|googlebot|yahoo! slurp)/i.test(ua)) {\n        return true;\n    }\n    return false;\n};\n\n/**\n * @param {Object=} formdata\n * @param {string=} arg_separator\n */\n_.HTTPBuildQuery = function(formdata, arg_separator) {\n    var use_val, use_key, tmp_arr = [];\n\n    if (_.isUndefined(arg_separator)) {\n        arg_separator = '&';\n    }\n\n    _.each(formdata, function(val, key) {\n        use_val = encodeURIComponent(val.toString());\n        use_key = encodeURIComponent(key);\n        tmp_arr[tmp_arr.length] = use_key + '=' + use_val;\n    });\n\n    return tmp_arr.join(arg_separator);\n};\n\nfunction splitFromQuestionMark(myHref) {\n  if (myHref) {\n    var startOfQuery = myHref.indexOf('?');\n    if (startOfQuery >= 0) {\n      var res = myHref.substring(startOfQuery);\n      return res;\n    }\n  }\n  return '';\n}\n\n_.getUrlParams = function() {\n  return location && (location.search || splitFromQuestionMark(location.href));\n};\n\n_.getQueryParamByName = function(name, query) {\n  // expects a name\n  // and a query string. aka location part.\n  name = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n  var regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)');\n  var results = regex.exec(query);\n  return results === null ? undefined : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n};\n\n_.getQueryParam = function(url, param) {\n    // Expects a raw URL\n\n    param = param.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n    var regexS = '[\\\\?&]' + param + '=([^&#]*)',\n        regex = new RegExp(regexS),\n        results = regex.exec(url);\n    if (results === null || (results && typeof(results[1]) !== 'string' && results[1].length)) {\n        return '';\n    } else {\n        var result = results[1];\n        try {\n            result = decodeURIComponent(result);\n        } catch(err) {\n            console$1.error('Skipping decoding for malformed query param: ' + result);\n        }\n        return result.replace(/\\+/g, ' ');\n    }\n};\n\n_.getHashParam = function(hash, param) {\n    var matches = hash.match(new RegExp(param + '=([^&]*)'));\n    return matches ? matches[1] : null;\n};\n\n// _.cookie\n// Methods partially borrowed from quirksmode.org/js/cookies.html\n_.cookie = {\n    get: function(name) {\n        var nameEQ = name + '=';\n        var ca = document$1.cookie.split(';');\n        for (var i = 0; i < ca.length; i++) {\n            var c = ca[i];\n            while (c.charAt(0) == ' ') {\n                c = c.substring(1, c.length);\n            }\n            if (c.indexOf(nameEQ) === 0) {\n                return decodeURIComponent(c.substring(nameEQ.length, c.length));\n            }\n        }\n        return null;\n    },\n\n    parse: function(name) {\n        var cookie;\n        try {\n            cookie = _.JSONDecode(_.cookie.get(name)) || {};\n        } catch (err) {\n            // noop\n        }\n        return cookie;\n    },\n\n    set_seconds: function(name, value, seconds, is_cross_subdomain, is_secure, is_cross_site, domain_override) {\n        var cdomain = '',\n            expires = '',\n            secure = '';\n\n        if (domain_override) {\n            cdomain = '; domain=' + domain_override;\n        } else if (is_cross_subdomain) {\n            var domain = extract_domain(document$1.location.hostname);\n            cdomain = domain ? '; domain=.' + domain : '';\n        }\n\n        if (seconds) {\n            var date = new Date();\n            date.setTime(date.getTime() + (seconds * 1000));\n            expires = '; expires=' + date.toGMTString();\n        }\n\n        if (is_cross_site) {\n            is_secure = true;\n            secure = '; SameSite=None';\n        }\n        if (is_secure) {\n            secure += '; secure';\n        }\n\n        document$1.cookie = name + '=' + encodeURIComponent(value) + expires + '; path=/' + cdomain + secure;\n    },\n\n    set: function(name, value, days, is_cross_subdomain, is_secure, is_cross_site, domain_override) {\n        var cdomain = '', expires = '', secure = '';\n\n        if (domain_override) {\n            cdomain = '; domain=' + domain_override;\n        } else if (is_cross_subdomain) {\n            var domain = extract_domain(document$1.location.hostname);\n            cdomain = domain ? '; domain=.' + domain : '';\n        }\n\n        if (days) {\n            var date = new Date();\n            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n            expires = '; expires=' + date.toGMTString();\n        }\n\n        if (is_cross_site) {\n            is_secure = true;\n            secure = '; SameSite=None';\n        }\n        if (is_secure) {\n            secure += '; secure';\n        }\n\n        var new_cookie_val = name + '=' + encodeURIComponent(value) + expires + '; path=/' + cdomain + secure;\n        document$1.cookie = new_cookie_val;\n        return new_cookie_val;\n    },\n\n    remove: function(name, is_cross_subdomain, domain_override) {\n        _.cookie.set(name, '', -1, is_cross_subdomain, false, false, domain_override);\n    }\n};\n\nvar _localStorageSupported = null;\nvar localStorageSupported = function(storage, forceCheck) {\n    if (_localStorageSupported !== null && !forceCheck) {\n        return _localStorageSupported;\n    }\n\n    var supported = true;\n    try {\n        storage = storage || window.localStorage;\n        var key = '__mplss_' + cheap_guid(8),\n            val = 'xyz';\n        storage.setItem(key, val);\n        if (storage.getItem(key) !== val) {\n            supported = false;\n        }\n        storage.removeItem(key);\n    } catch (err) {\n        supported = false;\n    }\n\n    _localStorageSupported = supported;\n    return supported;\n};\n\n// _.localStorage\n_.localStorage = {\n    is_supported: function(force_check) {\n        var supported = localStorageSupported(null, force_check);\n        if (!supported) {\n            console$1.error('localStorage unsupported; falling back to cookie store');\n        }\n        return supported;\n    },\n\n    error: function(msg) {\n        console$1.error('localStorage error: ' + msg);\n    },\n\n    get: function(name) {\n        try {\n            return window.localStorage.getItem(name);\n        } catch (err) {\n            _.localStorage.error(err);\n        }\n        return null;\n    },\n\n    parse: function(name) {\n        try {\n            return _.JSONDecode(_.localStorage.get(name)) || {};\n        } catch (err) {\n            // noop\n        }\n        return null;\n    },\n\n    set: function(name, value) {\n        try {\n            window.localStorage.setItem(name, value);\n        } catch (err) {\n            _.localStorage.error(err);\n        }\n    },\n\n    remove: function(name) {\n        try {\n            window.localStorage.removeItem(name);\n        } catch (err) {\n            _.localStorage.error(err);\n        }\n    }\n};\n\n_.register_event = (function() {\n    // written by Dean Edwards, 2005\n    // with input from Tino Zijdel - crisp@xs4all.nl\n    // with input from Carl Sverre - mail@carlsverre.com\n    // with input from Moesif\n    // http://dean.edwards.name/weblog/2005/10/add-event/\n    // https://gist.github.com/1930440\n\n    /**\n     * @param {Object} element\n     * @param {string} type\n     * @param {function(...*)} handler\n     * @param {boolean=} oldSchool\n     * @param {boolean=} useCapture\n     */\n    var register_event = function(element, type, handler, oldSchool, useCapture) {\n        if (!element) {\n            console$1.error('No valid element provided to register_event');\n            return;\n        }\n\n        if (element.addEventListener && !oldSchool) {\n            element.addEventListener(type, handler, !!useCapture);\n        } else {\n            var ontype = 'on' + type;\n            var old_handler = element[ontype]; // can be undefined\n            element[ontype] = makeHandler(element, handler, old_handler);\n        }\n    };\n\n    function makeHandler(element, new_handler, old_handlers) {\n        var handler = function(event) {\n            event = event || fixEvent(window.event);\n\n            // this basically happens in firefox whenever another script\n            // overwrites the onload callback and doesn't pass the event\n            // object to previously defined callbacks.  All the browsers\n            // that don't define window.event implement addEventListener\n            // so the dom_loaded handler will still be fired as usual.\n            if (!event) {\n                return undefined;\n            }\n\n            var ret = true;\n            var old_result, new_result;\n\n            if (_.isFunction(old_handlers)) {\n                old_result = old_handlers(event);\n            }\n            new_result = new_handler.call(element, event);\n\n            if ((false === old_result) || (false === new_result)) {\n                ret = false;\n            }\n\n            return ret;\n        };\n\n        return handler;\n    }\n\n    function fixEvent(event) {\n        if (event) {\n            event.preventDefault = fixEvent.preventDefault;\n            event.stopPropagation = fixEvent.stopPropagation;\n        }\n        return event;\n    }\n    fixEvent.preventDefault = function() {\n        this.returnValue = false;\n    };\n    fixEvent.stopPropagation = function() {\n        this.cancelBubble = true;\n    };\n\n    return register_event;\n})();\n\n\nvar TOKEN_MATCH_REGEX = new RegExp('^(\\\\w*)\\\\[(\\\\w+)([=~\\\\|\\\\^\\\\$\\\\*]?)=?\"?([^\\\\]\"]*)\"?\\\\]$');\n\n_.dom_query = (function() {\n    /* document.getElementsBySelector(selector)\n    - returns an array of element objects from the current document\n    matching the CSS selector. Selectors can contain element names,\n    class names and ids and can be nested. For example:\n\n    elements = document.getElementsBySelector('div#main p a.external')\n\n    Will return an array of all 'a' elements with 'external' in their\n    class attribute that are contained inside 'p' elements that are\n    contained inside the 'div' element which has id=\"main\"\n\n    New in version 0.4: Support for CSS2 and CSS3 attribute selectors:\n    See http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\n    Version 0.4 - Simon Willison, March 25th 2003\n    -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows\n    -- Opera 7 fails\n\n    Version 0.5 - Carl Sverre, Jan 7th 2013\n    -- Now uses jQuery-esque `hasClass` for testing class name\n    equality.  This fixes a bug related to '-' characters being\n    considered not part of a 'word' in regex.\n    */\n\n    function getAllChildren(e) {\n        // Returns all children of element. Workaround required for IE5/Windows. Ugh.\n        return e.all ? e.all : e.getElementsByTagName('*');\n    }\n\n    var bad_whitespace = /[\\t\\r\\n]/g;\n\n    function hasClass(elem, selector) {\n        var className = ' ' + selector + ' ';\n        return ((' ' + elem.className + ' ').replace(bad_whitespace, ' ').indexOf(className) >= 0);\n    }\n\n    function getElementsBySelector(selector) {\n        // Attempt to fail gracefully in lesser browsers\n        if (!document$1.getElementsByTagName) {\n            return [];\n        }\n        // Split selector in to tokens\n        var tokens = selector.split(' ');\n        var token, bits, tagName, found, foundCount, i, j, k, elements, currentContextIndex;\n        var currentContext = [document$1];\n        for (i = 0; i < tokens.length; i++) {\n            token = tokens[i].replace(/^\\s+/, '').replace(/\\s+$/, '');\n            if (token.indexOf('#') > -1) {\n                // Token is an ID selector\n                bits = token.split('#');\n                tagName = bits[0];\n                var id = bits[1];\n                var element = document$1.getElementById(id);\n                if (!element || (tagName && element.nodeName.toLowerCase() != tagName)) {\n                    // element not found or tag with that ID not found, return false\n                    return [];\n                }\n                // Set currentContext to contain just this element\n                currentContext = [element];\n                continue; // Skip to next token\n            }\n            if (token.indexOf('.') > -1) {\n                // Token contains a class selector\n                bits = token.split('.');\n                tagName = bits[0];\n                var className = bits[1];\n                if (!tagName) {\n                    tagName = '*';\n                }\n                // Get elements matching tag, filter them for class selector\n                found = [];\n                foundCount = 0;\n                for (j = 0; j < currentContext.length; j++) {\n                    if (tagName == '*') {\n                        elements = getAllChildren(currentContext[j]);\n                    } else {\n                        elements = currentContext[j].getElementsByTagName(tagName);\n                    }\n                    for (k = 0; k < elements.length; k++) {\n                        found[foundCount++] = elements[k];\n                    }\n                }\n                currentContext = [];\n                currentContextIndex = 0;\n                for (j = 0; j < found.length; j++) {\n                    if (found[j].className &&\n                        _.isString(found[j].className) && // some SVG elements have classNames which are not strings\n                        hasClass(found[j], className)\n                    ) {\n                        currentContext[currentContextIndex++] = found[j];\n                    }\n                }\n                continue; // Skip to next token\n            }\n            // Code to deal with attribute selectors\n            var token_match = token.match(TOKEN_MATCH_REGEX);\n            if (token_match) {\n                tagName = token_match[1];\n                var attrName = token_match[2];\n                var attrOperator = token_match[3];\n                var attrValue = token_match[4];\n                if (!tagName) {\n                    tagName = '*';\n                }\n                // Grab all of the tagName elements within current context\n                found = [];\n                foundCount = 0;\n                for (j = 0; j < currentContext.length; j++) {\n                    if (tagName == '*') {\n                        elements = getAllChildren(currentContext[j]);\n                    } else {\n                        elements = currentContext[j].getElementsByTagName(tagName);\n                    }\n                    for (k = 0; k < elements.length; k++) {\n                        found[foundCount++] = elements[k];\n                    }\n                }\n                currentContext = [];\n                currentContextIndex = 0;\n                var checkFunction; // This function will be used to filter the elements\n                switch (attrOperator) {\n                    case '=': // Equality\n                        checkFunction = function(e) {\n                            return (e.getAttribute(attrName) == attrValue);\n                        };\n                        break;\n                    case '~': // Match one of space seperated words\n                        checkFunction = function(e) {\n                            return (e.getAttribute(attrName).match(new RegExp('\\\\b' + attrValue + '\\\\b')));\n                        };\n                        break;\n                    case '|': // Match start with value followed by optional hyphen\n                        checkFunction = function(e) {\n                            return (e.getAttribute(attrName).match(new RegExp('^' + attrValue + '-?')));\n                        };\n                        break;\n                    case '^': // Match starts with value\n                        checkFunction = function(e) {\n                            return (e.getAttribute(attrName).indexOf(attrValue) === 0);\n                        };\n                        break;\n                    case '$': // Match ends with value - fails with \"Warning\" in Opera 7\n                        checkFunction = function(e) {\n                            return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length);\n                        };\n                        break;\n                    case '*': // Match ends with value\n                        checkFunction = function(e) {\n                            return (e.getAttribute(attrName).indexOf(attrValue) > -1);\n                        };\n                        break;\n                    default:\n                        // Just test for existence of attribute\n                        checkFunction = function(e) {\n                            return e.getAttribute(attrName);\n                        };\n                }\n                currentContext = [];\n                currentContextIndex = 0;\n                for (j = 0; j < found.length; j++) {\n                    if (checkFunction(found[j])) {\n                        currentContext[currentContextIndex++] = found[j];\n                    }\n                }\n                // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);\n                continue; // Skip to next token\n            }\n            // If we get here, token is JUST an element (not a class or ID selector)\n            tagName = token;\n            found = [];\n            foundCount = 0;\n            for (j = 0; j < currentContext.length; j++) {\n                elements = currentContext[j].getElementsByTagName(tagName);\n                for (k = 0; k < elements.length; k++) {\n                    found[foundCount++] = elements[k];\n                }\n            }\n            currentContext = found;\n        }\n        return currentContext;\n    }\n\n    return function(query) {\n        if (_.isElement(query)) {\n            return [query];\n        } else if (_.isObject(query) && !_.isUndefined(query.length)) {\n            return query;\n        } else {\n            return getElementsBySelector.call(this, query);\n        }\n    };\n})();\n\n_.info = {\n    campaignParams: function() {\n        var campaign_keywords = 'utm_source utm_medium utm_campaign utm_content utm_term'.split(' '),\n            kw = '',\n            params = {};\n        _.each(campaign_keywords, function(kwkey) {\n            kw = _.getQueryParam(document$1.URL, kwkey);\n            if (kw.length) {\n                params[kwkey] = kw;\n            }\n        });\n\n        return params;\n    },\n\n    searchEngine: function(referrer) {\n        if (referrer.search('https?://(.*)google.([^/?]*)') === 0) {\n            return 'google';\n        } else if (referrer.search('https?://(.*)bing.com') === 0) {\n            return 'bing';\n        } else if (referrer.search('https?://(.*)yahoo.com') === 0) {\n            return 'yahoo';\n        } else if (referrer.search('https?://(.*)duckduckgo.com') === 0) {\n            return 'duckduckgo';\n        } else {\n            return null;\n        }\n    },\n\n    searchInfo: function(referrer) {\n        var search = _.info.searchEngine(referrer),\n            param = (search != 'yahoo') ? 'q' : 'p',\n            ret = {};\n\n        if (search !== null) {\n            ret['$search_engine'] = search;\n\n            var keyword = _.getQueryParam(referrer, param);\n            if (keyword.length) {\n                ret['mp_keyword'] = keyword;\n            }\n        }\n\n        return ret;\n    },\n\n    /**\n     * This function detects which browser is running this script.\n     * The order of the checks are important since many user agents\n     * include key words used in later checks.\n     */\n    browser: function(user_agent, vendor, opera) {\n        vendor = vendor || ''; // vendor is undefined for at least IE9\n        if (opera || _.includes(user_agent, ' OPR/')) {\n            if (_.includes(user_agent, 'Mini')) {\n                return 'Opera Mini';\n            }\n            return 'Opera';\n        } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n            return 'BlackBerry';\n        } else if (_.includes(user_agent, 'IEMobile') || _.includes(user_agent, 'WPDesktop')) {\n            return 'Internet Explorer Mobile';\n        } else if (_.includes(user_agent, 'SamsungBrowser/')) {\n            // https://developer.samsung.com/internet/user-agent-string-format\n            return 'Samsung Internet';\n        } else if (_.includes(user_agent, 'Edge') || _.includes(user_agent, 'Edg/')) {\n            return 'Microsoft Edge';\n        } else if (_.includes(user_agent, 'FBIOS')) {\n            return 'Facebook Mobile';\n        } else if (_.includes(user_agent, 'Chrome')) {\n            return 'Chrome';\n        } else if (_.includes(user_agent, 'CriOS')) {\n            return 'Chrome iOS';\n        } else if (_.includes(user_agent, 'UCWEB') || _.includes(user_agent, 'UCBrowser')) {\n            return 'UC Browser';\n        } else if (_.includes(user_agent, 'FxiOS')) {\n            return 'Firefox iOS';\n        } else if (_.includes(vendor, 'Apple')) {\n            if (_.includes(user_agent, 'Mobile')) {\n                return 'Mobile Safari';\n            }\n            return 'Safari';\n        } else if (_.includes(user_agent, 'Android')) {\n            return 'Android Mobile';\n        } else if (_.includes(user_agent, 'Konqueror')) {\n            return 'Konqueror';\n        } else if (_.includes(user_agent, 'Firefox')) {\n            return 'Firefox';\n        } else if (_.includes(user_agent, 'MSIE') || _.includes(user_agent, 'Trident/')) {\n            return 'Internet Explorer';\n        } else if (_.includes(user_agent, 'Gecko')) {\n            return 'Mozilla';\n        } else {\n            return '';\n        }\n    },\n\n    /**\n     * This function detects which browser version is running this script,\n     * parsing major and minor version (e.g., 42.1). User agent strings from:\n     * http://www.useragentstring.com/pages/useragentstring.php\n     */\n    browserVersion: function(userAgent, vendor, opera) {\n        var browser = _.info.browser(userAgent, vendor, opera);\n        var versionRegexs = {\n            'Internet Explorer Mobile': /rv:(\\d+(\\.\\d+)?)/,\n            'Microsoft Edge': /Edge?\\/(\\d+(\\.\\d+)?)/,\n            'Chrome': /Chrome\\/(\\d+(\\.\\d+)?)/,\n            'Chrome iOS': /CriOS\\/(\\d+(\\.\\d+)?)/,\n            'UC Browser' : /(UCBrowser|UCWEB)\\/(\\d+(\\.\\d+)?)/,\n            'Safari': /Version\\/(\\d+(\\.\\d+)?)/,\n            'Mobile Safari': /Version\\/(\\d+(\\.\\d+)?)/,\n            'Opera': /(Opera|OPR)\\/(\\d+(\\.\\d+)?)/,\n            'Firefox': /Firefox\\/(\\d+(\\.\\d+)?)/,\n            'Firefox iOS': /FxiOS\\/(\\d+(\\.\\d+)?)/,\n            'Konqueror': /Konqueror:(\\d+(\\.\\d+)?)/,\n            'BlackBerry': /BlackBerry (\\d+(\\.\\d+)?)/,\n            'Android Mobile': /android\\s(\\d+(\\.\\d+)?)/,\n            'Samsung Internet': /SamsungBrowser\\/(\\d+(\\.\\d+)?)/,\n            'Internet Explorer': /(rv:|MSIE )(\\d+(\\.\\d+)?)/,\n            'Mozilla': /rv:(\\d+(\\.\\d+)?)/\n        };\n        var regex = versionRegexs[browser];\n        if (regex === undefined) {\n            return null;\n        }\n        var matches = userAgent.match(regex);\n        if (!matches) {\n            return null;\n        }\n        return parseFloat(matches[matches.length - 2]);\n    },\n\n    os: function() {\n        var a = userAgent;\n        if (/Windows/i.test(a)) {\n            if (/Phone/.test(a) || /WPDesktop/.test(a)) {\n                return 'Windows Phone';\n            }\n            return 'Windows';\n        } else if (/(iPhone|iPad|iPod)/.test(a)) {\n            return 'iOS';\n        } else if (/Android/.test(a)) {\n            return 'Android';\n        } else if (/(BlackBerry|PlayBook|BB10)/i.test(a)) {\n            return 'BlackBerry';\n        } else if (/Mac/i.test(a)) {\n            return 'Mac OS X';\n        } else if (/Linux/.test(a)) {\n            return 'Linux';\n        } else if (/CrOS/.test(a)) {\n            return 'Chrome OS';\n        } else {\n            return '';\n        }\n    },\n\n    device: function(user_agent) {\n        if (/Windows Phone/i.test(user_agent) || /WPDesktop/.test(user_agent)) {\n            return 'Windows Phone';\n        } else if (/iPad/.test(user_agent)) {\n            return 'iPad';\n        } else if (/iPod/.test(user_agent)) {\n            return 'iPod Touch';\n        } else if (/iPhone/.test(user_agent)) {\n            return 'iPhone';\n        } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n            return 'BlackBerry';\n        } else if (/Android/.test(user_agent)) {\n            return 'Android';\n        } else {\n            return '';\n        }\n    },\n\n    referringDomain: function(referrer) {\n        var split = referrer.split('/');\n        if (split.length >= 3) {\n            return split[2];\n        }\n        return '';\n    },\n\n    properties: function() {\n        return _.extend(_.strip_empty_properties({\n            '$os': _.info.os(),\n            '$browser': _.info.browser(userAgent, navigator$1.vendor, windowOpera),\n            '$referrer': document$1.referrer,\n            '$referring_domain': _.info.referringDomain(document$1.referrer),\n            '$device': _.info.device(userAgent)\n        }), {\n            '$current_url': win.location.href,\n            '$browser_version': _.info.browserVersion(userAgent, navigator$1.vendor, windowOpera),\n            '$screen_height': screen.height,\n            '$screen_width': screen.width,\n            'mp_lib': 'web',\n            '$lib_version': Config.LIB_VERSION,\n            '$insert_id': cheap_guid(),\n            'time': _.timestamp() / 1000 // epoch time in seconds\n        });\n    },\n\n    people_properties: function() {\n        return _.extend(_.strip_empty_properties({\n            '$os': _.info.os(),\n            '$browser': _.info.browser(userAgent, navigator$1.vendor, windowOpera)\n        }), {\n            '$browser_version': _.info.browserVersion(userAgent, navigator$1.vendor, windowOpera)\n        });\n    },\n\n    pageviewInfo: function(page) {\n        return _.strip_empty_properties({\n            'mp_page': page,\n            'mp_referrer': document$1.referrer,\n            'mp_browser': _.info.browser(userAgent, navigator$1.vendor, windowOpera),\n            'mp_platform': _.info.os()\n        });\n    }\n};\n\nvar cheap_guid = function(maxlen) {\n    var guid = Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10);\n    return maxlen ? guid.substring(0, maxlen) : guid;\n};\n\nvar quick_hash = function (str) {\n  // Bernstein's hash: http://www.cse.yorku.ca/~oz/hash.html#djb2\n  var hash = 5381;\n  if (str.length == 0) return hash;\n  for (var i = 0; i < str.length; i++) {\n      hash = ((hash << 5) - hash) + str.charCodeAt(i);\n      hash = hash & hash;\n  }\n\n  return hash;\n};\n\n/**\n * Check deterministically whether to include or exclude from a feature rollout/test based on the\n * given string and the desired percentage to include.\n * @param {String} str - string to run the check against (for instance a project's token)\n * @param {String} feature - name of feature (for inclusion in hash, to ensure different results\n * for different features)\n * @param {Number} percent_allowed - percentage chance that a given string will be included\n * @returns {Boolean} whether the given string should be included\n */\nvar determine_eligibility = _.safewrap(function(str, feature, percent_allowed) {\n    str = str + feature;\n\n    var hash = quick_hash(str);\n    var dart = (hash >>> 0) % 100;\n    return dart < percent_allowed;\n});\n\n// naive way to extract domain name (example.com) from full hostname (my.sub.example.com)\nvar SIMPLE_DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]*\\.[a-z]+$/i;\n// this next one attempts to account for some ccSLDs, e.g. extracting oxford.ac.uk from www.oxford.ac.uk\nvar DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z.]{2,6}$/i;\n/**\n * Attempts to extract main domain name from full hostname, using a few blunt heuristics. For\n * common TLDs like .com/.org that always have a simple SLD.TLD structure (example.com), we\n * simply extract the last two .-separated parts of the hostname (SIMPLE_DOMAIN_MATCH_REGEX).\n * For others, we attempt to account for short ccSLD+TLD combos (.ac.uk) with the legacy\n * DOMAIN_MATCH_REGEX (kept to maintain backwards compatibility with existing Moesif\n * integrations). The only _reliable_ way to extract domain from hostname is with an up-to-date\n * list like at https://publicsuffix.org/ so for cases that this helper fails at, the SDK\n * offers the 'cookie_domain' config option to set it explicitly.\n * @example\n * extract_domain('my.sub.example.com')\n * // 'example.com'\n */\nvar extract_domain = function(hostname) {\n    var domain_regex = DOMAIN_MATCH_REGEX;\n    var parts = hostname.split('.');\n    var tld = parts[parts.length - 1];\n    if (tld.length > 4 || tld === 'com' || tld === 'org') {\n        domain_regex = SIMPLE_DOMAIN_MATCH_REGEX;\n    }\n    var matches = hostname.match(domain_regex);\n    return matches ? matches[0] : '';\n};\n\nvar JSONStringify = null;\nvar JSONParse = null;\nif (typeof JSON !== 'undefined') {\n    JSONStringify = JSON.stringify;\n    JSONParse = JSON.parse;\n}\nJSONStringify = JSONStringify || _.JSONEncode;\nJSONParse = JSONParse || _.JSONDecode;\n\n// EXPORTS (for closure compiler)\n_['toArray']                = _.toArray;\n_['isObject']               = _.isObject;\n_['JSONEncode']             = _.JSONEncode;\n_['JSONDecode']             = _.JSONDecode;\n_['isBlockedUA']            = _.isBlockedUA;\n_['isEmptyObject']          = _.isEmptyObject;\n_['isEmptyString']          = _.isEmptyString;\n_['info']                   = _.info;\n_['info']['device']         = _.info.device;\n_['info']['browser']        = _.info.browser;\n_['info']['browserVersion'] = _.info.browserVersion;\n_['info']['properties']     = _.info.properties;\n\n// eslint-disable-line camelcase\n\nvar logger$1 = console_with_prefix('parsers');\n\nvar attemptParseText = function(text) {\n  try {\n    return { 'body': _.JSONDecode(text) };\n  } catch(err) {\n    logger$1.log('JSON decode failed');\n    logger$1.log(err);\n    return {\n      'transfer_encoding': 'base64',  // eslint-disable-line camelcase\n      'body': _.base64Encode(text)\n    };\n  }\n};\n\n/**\n * @param {*} buffer\n * this checks the buffer and\n * returns something to start building the response or request model\n * with body filled in.\n */\nvar attemptParseBuffer = function (buffer) {\n  if (!buffer) return {};\n  logger$1.log('about to decode buffer');\n  logger$1.log(buffer);\n  logger$1.log(buffer.byteLength);\n\n  if (buffer.byteLength <= 0) {\n    // empty body.\n    return {};\n  }\n\n  try {\n    var decoder = new TextDecoder('utf-8');\n    var text = decoder.decode(buffer);\n\n    try {\n      return { 'body': _.JSONDecode(text) };\n    } catch (err) {\n      logger$1.error(err);\n      return {\n        'transfer_encoding': 'base64',\n        'body': _.base64Encode(text)\n      };\n    }\n  } catch (err) {\n    logger$1.error(err);\n    logger$1.log(buffer);\n    return {\n      'transfer_encoding': 'base64',\n      'body': 'can not be decoded'\n    };\n  }\n};\n\nvar logger = console_with_prefix('capture');\n\nvar HTTP_PROTOCOL$1 = (('http:' === (document && document.location.protocol)) ? 'http://' : 'https://');\n\nfunction handleRequestFinished(xhrInstance, postData, recorder) {\n  logger.log('processResponse for' + xhrInstance._url);\n  var endTime = (new Date()).toISOString();\n\n  if (recorder) {\n    // avoid apiRequest.io and moesif.com\n    var myUrl = xhrInstance._url ? xhrInstance._url.toLowerCase() : xhrInstance._url;\n    if(myUrl && myUrl.indexOf('moesif.com') < 0 && myUrl.indexOf('apirequest.io') < 0) {\n\n      var requestModel = {\n        'uri': convertToFullUrl(xhrInstance._url),\n        'verb': xhrInstance._method,\n        'time': xhrInstance._startTime,\n        'headers': xhrInstance._requestHeaders\n      };\n\n      if (postData) {\n        if (typeof postData === 'string') {\n          logger.log('request post data is string');\n          logger.log(postData);\n\n          var parseResult = attemptParseText(postData);\n          requestModel['transfer_encoding'] = parseResult['transfer_encoding'];\n          requestModel['body'] = parseResult['body'];\n        } else if (typeof postData === 'object' || Array.isArray(postData) || typeof postData === 'number' || typeof postData === 'boolean') {\n          requestModel['body'] = postData;\n        }\n      }\n      var rawResponseHeaders = xhrInstance.getAllResponseHeaders();\n\n      logger.log('rawResponseHeaders are ' + rawResponseHeaders);\n\n      var responseHeaders = parseResponseHeaders(rawResponseHeaders);\n\n      var _status = xhrInstance.status;\n      // handle IE9 bug: http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n      if (_status === 1223) {\n        _status = 204;\n      }\n\n      var responseModel = {\n        'status': _status,\n        'time': endTime,\n        'headers': responseHeaders\n      };\n\n      logger.log('responseType: ' + xhrInstance.responseType);\n      logger.log('responseText: ' + xhrInstance.responseText);\n      logger.log('response: ' + xhrInstance.response);\n\n      // responseText is accessible only if responseType is '' or 'text' and on older browsers\n      // but we attempt to grab it anyways.\n      var rawText = xhrInstance.responseText;\n\n      var parsedBody = {};\n\n      if (rawText) {\n        // responseText is string or null\n        parsedBody = attemptParseText(rawText);\n        responseModel['body'] = parsedBody['body'];\n        responseModel['transfer_encoding'] = parsedBody['transfer_encoding'];\n      } else if (xhrInstance.response) {\n        // if there is no responseText, but response exists, we'll try process it.\n        logger.log('no responseText trying with xhr.response');\n        if (_.isString(xhrInstance.response)) {\n          logger.log('response is string. attempt to parse');\n          parsedBody = attemptParseText(xhrInstance.response);\n          responseModel['body'] = parsedBody['body'];\n          responseModel['transfer_encoding'] = parsedBody['transfer_encoding'];\n        } else if (_.isArrayBuffer(xhrInstance.response)) {\n          logger.log('response is arraybuffer. attempt to parse');\n          parsedBody = attemptParseBuffer(xhrInstance.response);\n          responseModel['body'] = parsedBody['body'];\n          responseModel['transfer_encoding'] = parsedBody['transfer_encoding'];\n        } else if (_.isArray(xhrInstance.response) || _.isObject(xhrInstance.response)) {\n          responseModel['body'] = xhrInstance.response;\n        }\n      }\n\n      var event = {\n        'request': requestModel,\n        'response': responseModel\n      };\n\n      recorder(event);\n    }\n  }\n}\n\nfunction parseResponseHeaders(headerStr) {\n  var headers = {};\n  if (!headerStr) {\n    return headers;\n  }\n  var headerPairs = headerStr.split('\\u000d\\u000a');\n  for (var i = 0; i < headerPairs.length; i++) {\n    var headerPair = headerPairs[i];\n    var index = headerPair.indexOf('\\u003a\\u0020');\n    if (index > 0) {\n      var key = headerPair.substring(0, index);\n      headers[key] = headerPair.substring(index + 2);\n    }\n  }\n  return headers;\n}\n\nfunction convertToFullUrl(url) {\n  if (url && typeof url === 'string') {\n    var trimedUrl = _.trim(url);\n    if (trimedUrl.indexOf('http') !== 0) {\n      return HTTP_PROTOCOL$1 + window.location.host + '/' + trimedUrl.replace(/^\\./, '').replace(/^\\//, '');\n    } else {\n      return url;\n    }\n  }\n  return url;\n}\n\n/**\n * @param recorder\n * @returns {undoPatch}\n *\n * The recorder is a function that takes an Event and records it.\n *\n */\nfunction captureXMLHttpRequest(recorder, options) {\n  var XHR = XMLHttpRequest.prototype;\n\n  var shouldPatchOnReadyState = options && options.eagerBodyLogging;\n\n  var open = XHR.open;\n  var send = XHR.send;\n  var setRequestHeader = XHR.setRequestHeader;\n\n  // Collect data:\n  XHR.open = function(method, url) {\n    logger.log('XHR open triggered');\n    this._method = method;\n    this._url = url;\n    this._requestHeaders = {};\n    this._startTime = (new Date()).toISOString();\n    return open.apply(this, arguments);\n  };\n\n  XHR.setRequestHeader =  function(header, value) {\n    this._requestHeaders[header] = value;\n    return setRequestHeader.apply(this, arguments);\n  };\n\n  XHR.send = function(postData) {\n    logger.log('XHR send started for ' + this._url);\n\n    var _self = this;\n\n    // in case of eagerBodyLogging, we'll\n    // patch onreadystatechange which is more of\n    // replacement or if addEventListener does not exist.\n    if (shouldPatchOnReadyState || !this.addEventListener) {\n      var _onreadystatechange = this.onreadystatechange;\n      this.onreadystatechange = function() {\n        var readyState = _self.readyState;\n        logger.log('readyState ' + readyState);\n        if (readyState === XMLHttpRequest.DONE) {\n          logger.log('XHR onreadystatechange DONE triggered for ' + _self._url);\n          handleRequestFinished(_self, postData, recorder);\n        }\n\n        if (_onreadystatechange && _.isFunction(_onreadystatechange)) {\n          logger.log('trigger old onreadystatechange');\n          return _onreadystatechange.apply(this, arguments);\n        }\n      };\n    } else {\n      // this only adds another listener.\n      this.addEventListener('loadend', function() {\n        logger.log('XHR loadend triggered for ' + _self._url);\n        handleRequestFinished(_self, postData, recorder);\n      });\n    }\n\n    return send.apply(this, arguments);\n  };\n\n  var undoPatch = function () {\n    XHR.open = open;\n    XHR.send = send;\n    XHR.setRequestHeader = setRequestHeader;\n  };\n\n  // so caller have a handle to undo the patch if needed.\n  return undoPatch;\n}\n\n// eslint-disable-line\n\nvar logger$2 = console_with_prefix('web3capture');\n\nfunction computeUrl(provider) {\n  if (provider && provider.host) {\n    return provider.host;\n  }\n\n  return '/';\n}\n\nfunction createEventModel(provider, startTime, endTime, payload, result, error) {\n  // JSONRPC will always be POST.\n  var requestModel = {\n    'uri': computeUrl(provider),\n    'verb': 'POST',\n    'time': startTime,\n    'headers': {}\n  };\n\n  if (provider['headers']) {\n    var hdrs = {};\n\n    _['each'](provider['headers'], function (item) {\n      hdrs[item['name']] = item['value'];\n    });\n\n    requestModel['headers'] = hdrs;\n  }\n\n  if (payload) {\n    if (typeof payload === 'string') {\n      logger$2.log('request post data is string');\n      logger$2.log(payload);\n      try {\n        requestModel['body'] = _.JSONDecode(payload);\n      } catch(err) {\n        logger$2.log('JSON decode failed');\n        logger$2.log(err);\n        requestModel['transfer_encoding'] = 'base64';\n        requestModel['body'] = _.base64Encode(payload);\n      }\n    } else if (typeof payload === 'object' || Array.isArray(payload) || typeof payload === 'number' || typeof postData === 'boolean') {\n      requestModel['body'] = payload;\n    }\n  }\n\n  // var responseHeaders = parseResponseHeaders(this.getAllResponseHeaders());\n\n  var responseModel = {\n    'status': 200,\n    // it is always 200 for JSON RPC.\n    'time': endTime,\n    'headers': {}\n  };\n\n  if (result) {\n    // responseText is string or null\n    responseModel['body'] = result;\n    // if (isJsonHeader(responseHeaders) || isStartJson(this.responseText)) {\n    //   responseModel['body'] = parseBody(this.responseText);\n    // } else {\n    //   responseModel['transfer_encoding'] = 'base64';\n    //   responseModel['body'] = _.base64Encode(this.responseText);\n    // }\n  } else if (error) {\n    responseModel['body'] = {\n      'error': error\n    };\n  }\n\n  var event = {\n    'request': requestModel,\n    'response': responseModel,\n    'metadata': {\n      '_web3': {\n        'via_web3_provider': true,\n        'path': provider['path'],\n        'host': provider['host']\n      }\n    }\n  };\n\n  if (provider['isMetaMask']) {\n    event['metadata']['_web3']['is_metamask'] = true;\n  }\n\n  return event;\n}\n\n/**\n * @param recorder\n * @returns {undoPatch}\n *\n * The recorder is a function that takes an Event and records it.\n *\n */\nfunction captureWeb3Requests(myWeb3, recorder, options) {\n  if (myWeb3['currentProvider']) {\n    logger$2.log('found my currentProvider, patching it');\n    var CPDR = myWeb3['currentProvider'];\n\n    var send = CPDR['send'];\n    var sendAsync = CPDR['sendAsync'];\n\n    CPDR['send'] = function(payload) {\n      logger$2.log('patched send is called');\n      logger$2.log(payload);\n      var _startTime = (new Date()).toISOString();\n      var result = send.apply(CPDR, arguments);\n\n      logger$2.log('patch send result is back');\n      logger$2.log(result);\n      var _endTime = (new Date()).toISOString();\n      if (recorder) {\n        recorder(createEventModel(CPDR, _startTime, _endTime, payload, result));\n      }\n\n      return result;\n    };\n\n    CPDR['sendAsync'] = function(payload, callback) {\n      logger$2.log('patched sendAsync is called');\n      logger$2.log(payload);\n      var _startTime = (new Date()).toISOString();\n      var provider = CPDR;\n\n      var _callback = function(err, result) {\n        var _endTime = (new Date()).toISOString();\n\n        logger$2.log('inside patched callback');\n        logger$2.log(result);\n        if (recorder) {\n          recorder(createEventModel(provider, _startTime, _endTime, payload, result, err));\n        }\n        if (callback) {\n          callback(err, result);\n        }\n      };\n\n      sendAsync.apply(CPDR, [payload, _callback]);\n    };\n\n    var undoPatch = function () {\n      CPDR.send = send;\n      CPDR.sendAsync = sendAsync;\n    };\n    return undoPatch;\n  }\n  return null;\n  // so caller have a handle to undo the patch if needed.\n}\n\nvar logger$3 = console_with_prefix('capture fetch');\n\n/**\n *\n * @param {*} headers\n * headers must be a Headers object.\n */\nfunction parseHeaders(headers) {\n  var result = {};\n  logger$3.log('parseheaders is called');\n\n  var entries = headers.entries();\n\n  var entry = entries.next();\n  while (!entry.done) {\n    logger$3.log(entry.value); // 1 3 5 7 9\n    result[entry.value[0]] = entry.value[1];\n\n    entry = entries.next();\n  }\n\n  return result;\n}\n\nfunction processSavedRequestResponse(savedRequest, savedResponse, startTime, endTime, recorder) {\n  try {\n    setTimeout(function() {\n      logger$3.log('interception is here.');\n      logger$3.log(savedRequest);\n      logger$3.log(savedResponse);\n      if (savedRequest && savedResponse) {\n        // try to exract out information:\n        // var reqHeaders = {};\n        // var resHeaders = {};\n\n        // for (var pair of savedRequest.headers.entries()) {\n        //   reqHeaders[pair[0]] = pair[1];\n        // }\n\n        // for (var pair2 of savedResponse.headers.entries()) {\n        //   resHeaders[pair2[0]] = pair2[1];\n        // }\n        try {\n          Promise.all([savedRequest.arrayBuffer(), savedResponse.arrayBuffer()]).then(function(\n            bodies\n          ) {\n            // attemptParseBuffer will return either {}, { body }, or { body, transfer_enconding }\n            var processedBodies = bodies.map(attemptParseBuffer);\n\n            var requestModel = Object.assign(processedBodies[0], {\n              'uri': savedRequest.url,\n              'verb': savedRequest.method,\n              'time': startTime,\n              'headers': parseHeaders(savedRequest.headers)\n            });\n\n            var responseModel = Object.assign(processedBodies[1], {\n              'status': savedResponse.status,\n              'time': endTime,\n              'headers': parseHeaders(savedResponse.headers)\n            });\n\n            logger$3.log(requestModel);\n            logger$3.log(responseModel);\n\n            var event = {\n              'request': requestModel,\n              'response': responseModel\n            };\n\n            recorder(event);\n          });\n        } catch (err) {\n          logger$3.error('error processing body');\n        }\n      } else {\n        logger$3.log('savedRequest');\n      }\n    }, 50);\n  } catch (err) {\n    logger$3.error('error processing saved fetch request and response, but move on anyways.');\n    logger$3.log(err);\n  }\n}\n\nfunction interceptor(recorder, fetch, arg1, arg2) {\n  var savedRequest = null;\n\n  try {\n    savedRequest = new Request(arg1, arg2);\n  } catch (err) {\n    // for internal errors only.\n  }\n  var startTime = new Date().toISOString();\n  var endTime = null;\n\n  var promise = null;\n\n  promise = fetch(arg1, arg2);\n\n  var savedResponse = null;\n  // add handlers for response.\n  promise = promise.then(function(response) {\n    //\n    savedResponse = response.clone();\n    endTime = new Date().toISOString();\n\n    processSavedRequestResponse(savedRequest, savedResponse, startTime, endTime, recorder);\n\n    return response;\n  });\n\n  return promise;\n}\n\n// var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';\n\nfunction patch(recorder, env) {\n  var myenv = env || window || self;\n\n  if (myenv['fetch']) {\n    logger$3.log('found fetch method.');\n    if (!myenv['fetch']['polyfill']) {\n      // basically, if it is polyfill, it means\n      // that it is using XMLhttpRequest underneath,\n      // then no need to patch fetch.\n      var oldFetch = myenv['fetch'];\n\n      logger$3.log('fetch is not polyfilled so instrumenting it');\n\n      myenv['fetch'] = (function(fetch) {\n        return function(arg1, arg2) {\n          return interceptor(recorder, fetch, arg1, arg2);\n        };\n      })(myenv['fetch']);\n\n      var unpatch = function() {\n        myenv['fetch'] = oldFetch;\n      };\n\n      return unpatch;\n    } else {\n      // should not patch if it is polyfilled.\n      // since it would duplicate the data.\n      logger$3.log('skip patching fetch since it is polyfilled');\n      return null;\n    }\n  } else {\n    logger$3.log('there is no fetch found, so skipping instrumentation.');\n  }\n}\n\nfunction executeWithMiddleware(context, finalAction, middleware) {\n  // If no middleware, just run the core logic\n  if (typeof middleware !== 'function') {\n    return finalAction();\n  }\n\n  middleware(context, finalAction);\n}\n\nfunction isTargetDomain(urlObj, decoratableDomains) {\n  if (decoratableDomains === null) return true; // Decorate all domains if decoratableDomains is null\n  if (Array.isArray(decoratableDomains) && decoratableDomains.length === 0) return false;\n  return decoratableDomains.some(function(domain) {\n    var target = domain.toLowerCase();\n    var current = urlObj.hostname.toLowerCase();\n    return current === target || current.indexOf('.' + target, current.length - ('.' + target).length) !== -1;\n  });\n}\n\nfunction isSameOrigin(urlObj, env) {\n  var myenv = env || window || self;\n  try {\n    return urlObj.origin === myenv.location.origin;\n  } catch (e) {\n    // Fallback for older browsers\n    return urlObj.hostname === myenv.location.hostname &&\n           urlObj.protocol === myenv.location.protocol &&\n           urlObj.port === myenv.location.port;\n  }\n}\n\nfunction decorator(url, decoratableDomains, trackingParam, trackingValue, env) {\n  if (!url) return url; // Added check for empty/undefined URLs\n  try {\n    var urlObj = new URL(url, window.location.origin);\n\n    // Skip same-origin links to avoid unnecessary overhead and exposure\n    if (isSameOrigin(urlObj, env)) {\n      return url;\n    }\n\n    // Check if the hostname of the URL matches any of the decoratable domains\n    var isTarget = isTargetDomain(urlObj, decoratableDomains);\n\n    if (isTarget) {\n      urlObj.searchParams.set(trackingParam, trackingValue);\n      return urlObj.href;\n    }\n  } catch (e) {\n    return url;\n  }\n  return url;\n}\n\nfunction decorateLinks(trackingDomains, trackingParamName, trackingParamValue, middleware, env) {\n  var myenv = env || window || self;\n\n  // Link click handler - handles various click events\n  var linkClickHandler = function(e) {\n    function next() {\n      var link = e.target.closest('a');\n      if (link && link.href) {\n        link.href = decorator(link.href, trackingDomains, trackingParamName, trackingParamValue, myenv);\n      }\n    }\n    var contextForMiddleware = {\n      event: e,\n      trackingDomains: trackingDomains,\n      trackingParamName: trackingParamName,\n      trackingParamValue: trackingParamValue,\n      env: myenv\n    };\n    executeWithMiddleware(contextForMiddleware, next, middleware);\n  };\n\n  // Form submission handler\n  var formSubmitHandler = function(e) {\n    function next() {\n      var form = e.target;\n      try {\n        var actionUrl = new URL(form.action, myenv.location.origin);\n\n        // Skip same-origin forms\n        if (isSameOrigin(actionUrl, myenv)) {\n          return;\n        }\n\n        var isTarget = isTargetDomain(actionUrl, trackingDomains);\n\n        if (isTarget) {\n          var method = (form.method || 'get').toLowerCase();\n\n          // Only decorate GET forms automatically\n          // POST forms are skipped to avoid breaking server-side logic (CSRF, routing, etc.)\n          // POST body can't be read by JavaScript on the destination page anyway\n          // Users can manually use cdtUrlDecorator() for form.action if needed\n          if (method === 'get') {\n            // Add as hidden input which will be appended to the query string\n            var trackingInput = form.querySelector('input[name=\"' + trackingParamName + '\"]');\n\n            if (!trackingInput) {\n              trackingInput = myenv.document.createElement('input');\n              trackingInput.type = 'hidden';\n              trackingInput.name = trackingParamName;\n              form.appendChild(trackingInput);\n            }\n\n            trackingInput.value = trackingParamValue;\n          }\n        }\n      } catch (err) {\n        // skip decoration\n      }\n    }\n\n    var contextForMiddleware = {\n      event: e,\n      trackingDomains: trackingDomains,\n      trackingParamName: trackingParamName,\n      trackingParamValue: trackingParamValue,\n      env: myenv\n    };\n    executeWithMiddleware(contextForMiddleware, next, middleware);\n  };\n\n  // Add event listeners for various interaction types\n  // regular clicks\n  myenv.addEventListener('mousedown', linkClickHandler, true);\n  // keyboard navigation (Tab + Enter)\n  myenv.addEventListener('click', linkClickHandler, true);\n  // middle-click and other auxiliary button clicks\n  myenv.addEventListener('auxclick', linkClickHandler, true);\n  // right-click (for copy link address)\n  myenv.addEventListener('contextmenu', linkClickHandler, true);\n  // touch events for mobile devices\n  myenv.addEventListener('touchstart', linkClickHandler, true);\n\n  // Form submissions\n  myenv.addEventListener('submit', formSubmitHandler, true);\n\n  // Return cleanup function to remove event listeners\n  return function cleanup() {\n    myenv.removeEventListener('mousedown', linkClickHandler, true);\n    myenv.removeEventListener('click', linkClickHandler, true);\n    myenv.removeEventListener('auxclick', linkClickHandler, true);\n    myenv.removeEventListener('contextmenu', linkClickHandler, true);\n    myenv.removeEventListener('touchstart', linkClickHandler, true);\n    myenv.removeEventListener('submit', formSubmitHandler, true);\n  };\n}\n\nfunction getCrossDomainTrackingParamValue(paramName) {\n  try {\n    if (!window || !window.location || !window.location.search) {\n      return null;\n    }\n    var urlParams = new URLSearchParams(window.location.search);\n    return urlParams.get(paramName);\n  } catch (err) {\n    // URLSearchParams might not be available in older browsers\n    // or window.location might not be accessible\n    return null;\n  }\n}\n\n// Remove the tracking parameter from the URL to prevent pollution\n// Call this after the parameter has been read and persisted\nfunction cleanUrlParameter(paramName) {\n  try {\n    if (!window || !window.location || !window.history || !window.history.replaceState) {\n      console.log('Browser does not support URL manipulation APIs, cannot clean URL parameter');\n      return; // Browser doesn't support history API\n    }\n\n    var urlParams = new URLSearchParams(window.location.search);\n    if (!urlParams.has(paramName)) {\n      console.log('URL parameter not present, nothing to clean');\n      return; // Parameter not present, nothing to clean\n    }\n\n    // Remove the parameter\n    urlParams['delete'](paramName); // 'delete' is a reserved keyword, so we use bracket notation\n\n    // reconsruct the new URL\n    var newSearch = urlParams.toString();\n    var newUrl = window.location.pathname + (newSearch ? '?' + newSearch : '') + window.location.hash;\n\n    // Replace the URL without reloading the page\n    window.history.replaceState(null, '', newUrl);\n  } catch (err) {\n    console.log('Error cleaning URL parameter: ' + err.message);\n    // Silently fail - URL cleaning is not critical\n  }\n}\n\n_.crossDomainTrackingUtils = {\n  getCrossDomainTrackingParamValue: getCrossDomainTrackingParamValue,\n  cleanUrlParameter: cleanUrlParameter,\n  cdtUrlDecorator: decorator\n};\n\n// eslint-disable-line\n\nvar logger$5 = console_with_prefix('referrer');\n\nfunction _getReferrerStr() {\n  return document && document.referrer;\n}\n\nfunction _getReferringDomain(referrer) {\n  if (_.isEmptyString(referrer)) {\n    return null;\n  }\n  var parts = referrer.split('/');\n  if (parts.length >= 3) {\n    return parts[2];\n  }\n  return null;\n}\n\nfunction getReferrer() {\n  var referrer = _getReferrerStr();\n\n  logger$5.log(referrer);\n\n  if (_.isEmptyString(referrer)) {\n    return;\n  }\n\n  if (referrer.indexOf(location.protocol + '//' + location.host) === 0) {\n    logger$5.log('referrer is the same so skipping');\n    return;\n  }\n\n  var referrerInfo = {\n    'referrer': referrer,\n    'referring_domain': _getReferringDomain(referrer)\n  };\n\n  return referrerInfo;\n}\n\n// eslint-disable-line\n\nvar logger$6 = console_with_prefix('utm');\n\nvar UTMConstants = {  // UTM Params\n  UTM_SOURCE: 'utm_source',\n  UTM_MEDIUM: 'utm_medium',\n  UTM_CAMPAIGN: 'utm_campaign',\n  UTM_TERM: 'utm_term',\n  UTM_CONTENT: 'utm_content'\n};\n\nfunction getUtmData(rawCookie, query) {\n  // Translate the utmz cookie format into url query string format.\n  var cookie = rawCookie ? '?' + rawCookie.split('.').slice(-1)[0].replace(/\\|/g, '&') : '';\n\n  logger$6.log('cookie');\n  logger$6.log(cookie);\n\n  var fetchParam = function fetchParam(queryName, query, cookieName, cookie) {\n    return _.getQueryParamByName(queryName, query) ||\n           _.getQueryParamByName(cookieName, cookie);\n  };\n\n  var utmSource = fetchParam(UTMConstants.UTM_SOURCE, query, 'utmcsr', cookie);\n  var utmMedium = fetchParam(UTMConstants.UTM_MEDIUM, query, 'utmcmd', cookie);\n  var utmCampaign = fetchParam(UTMConstants.UTM_CAMPAIGN, query, 'utmccn', cookie);\n  var utmTerm = fetchParam(UTMConstants.UTM_TERM, query, 'utmctr', cookie);\n  var utmContent = fetchParam(UTMConstants.UTM_CONTENT, query, 'utmcct', cookie);\n\n  var utmData = {};\n  var addIfNotNull = function addIfNotNull(key, value) {\n    if (!_.isEmptyString(value)) {\n      utmData[key] = value;\n    }\n  };\n\n  addIfNotNull(UTMConstants.UTM_SOURCE, utmSource);\n  addIfNotNull(UTMConstants.UTM_MEDIUM, utmMedium);\n  addIfNotNull(UTMConstants.UTM_CAMPAIGN, utmCampaign);\n  addIfNotNull(UTMConstants.UTM_TERM, utmTerm);\n  addIfNotNull(UTMConstants.UTM_CONTENT, utmContent);\n\n  return utmData;\n}\n\nfunction getUtm(queryParams, cookieParams) {\n  queryParams = _.getUrlParams();\n  cookieParams = _.cookie.get('__utmz');\n  var utmProperties = getUtmData(cookieParams, queryParams);\n  return utmProperties;\n}\n\nvar STORAGE_CONSTANTS = {\n  STORED_USER_ID: 'moesif_stored_user_id',\n  STORED_COMPANY_ID: 'moesif_stored_company_id',\n  STORED_SESSION_ID: 'moesif_stored_session_id',\n  STORED_ANONYMOUS_ID: 'moesif_anonymous_id',\n  STORED_CAMPAIGN_DATA_USER: 'moesif_campaign_data',\n  STORED_CAMPAIGN_DATA_COMPANY: 'moesif_campaign_company',\n  STORED_PENDING_REQUESTS: 'moesif_pending_requests'\n};\n\nfunction replacePrefix(key, prefix) {\n  if (!prefix) return key;\n  if (key.indexOf('moesif_') === 0) {\n    return key.replace('moesif_', prefix);\n  }\n  return key;\n}\n\nfunction getPersistenceFunction(opt) {\n  var storageType = opt['persistence'];\n  if (storageType !== 'cookie' && storageType !== 'localStorage') {\n    console$1.critical('Unknown persistence type ' + storageType + '; falling back to cookie');\n    storageType = Config['persistence'] = 'localStorage';\n  }\n  var prefix = opt['persistence_key_prefix'];\n\n  // we default to localStorage unless cookie is specificied.\n  var setFunction = function (key, value) {\n     var resolvedKey = replacePrefix(key, prefix);\n     _.localStorage.set(resolvedKey, value);\n     // if localStorage and by default, we'll try to set the cookie too.\n     _.cookie.set(\n       resolvedKey,\n       value,\n       opt['cookie_expiration'],\n       opt['cross_subdomain_cookie'],\n       opt['secure_cookie'],\n       opt['cross_site_cookie'],\n       opt['cookie_domain']\n      );\n  };\n\n  if (storageType === 'cookie' || !_.localStorage.is_supported()) {\n    setFunction = function(key, value) {\n      var resolvedKey = replacePrefix(key, prefix);\n      _.cookie.set(\n        resolvedKey,\n        value,\n        opt['cookie_expiration'],\n        opt['cross_subdomain_cookie'],\n        opt['secure_cookie'],\n        opt['cross_site_cookie'],\n        opt['cookie_domain']\n      );\n    };\n  }\n\n  if (storageType === 'none') {\n    setFunction = function () {};\n  }\n\n  return setFunction;\n}\n\nfunction ensureNotNilString(str) {\n  // this is sometimes localStorage saves null and undefined\n  // as string null and undefined\n  if (str === 'null' || str === 'undefined' || str === '') {\n    return null;\n  }\n  return str;\n}\n\n// Helper to check if localStorage should be used based on user's persistence preference\nfunction shouldUseLocalStorage(opt) {\n  var storageType = opt && opt['persistence'];\n  return storageType !== 'cookie' && _.localStorage.is_supported();\n}\n\n// Helper to get resolved storage key with prefix\nfunction getResolvedKey(key, opt) {\n  var prefix = opt && opt['persistence_key_prefix'];\n  return replacePrefix(key, prefix);\n}\n\n// this tries to get from either cookie or localStorage.\n// whichever have data.\nfunction getFromPersistence(key, opt) {\n  var storageType = opt && opt['persistence'];\n  var resolvedKey = getResolvedKey(key, opt);\n  if (_.localStorage.is_supported()) {\n    var localValue = ensureNotNilString(_.localStorage.get(resolvedKey));\n    var cookieValue = ensureNotNilString(_.cookie.get(resolvedKey));\n    // if there is value in cookie but not in localStorage\n    // but persistence type if localStorage, try to re-save in localStorage.\n    if (!localValue && cookieValue && storageType === 'localStorage') {\n      _.localStorage.set(resolvedKey, cookieValue);\n    }\n    return localValue || cookieValue;\n  }\n  return ensureNotNilString(_.cookie.get(resolvedKey));\n}\n\nfunction clearCookies(opt) {\n  var isCrossSubdomain = opt && opt['cross_subdomain_cookie'];\n  var domain = opt && opt['cookie_domain'];\n  var keys = [\n    STORAGE_CONSTANTS.STORED_USER_ID,\n    STORAGE_CONSTANTS.STORED_COMPANY_ID,\n    STORAGE_CONSTANTS.STORED_ANONYMOUS_ID,\n    STORAGE_CONSTANTS.STORED_SESSION_ID,\n    STORAGE_CONSTANTS.STORED_CAMPAIGN_DATA_USER,\n    STORAGE_CONSTANTS.STORED_CAMPAIGN_DATA_COMPANY\n  ];\n  keys.forEach(function(key) {\n    _.cookie.remove(getResolvedKey(key, opt), isCrossSubdomain, domain);\n  });\n}\n\nfunction clearLocalStorage(opt) {\n  _.localStorage.remove(getResolvedKey(STORAGE_CONSTANTS.STORED_USER_ID, opt));\n  _.localStorage.remove(getResolvedKey(STORAGE_CONSTANTS.STORED_COMPANY_ID, opt));\n  _.localStorage.remove(getResolvedKey(STORAGE_CONSTANTS.STORED_ANONYMOUS_ID, opt));\n  _.localStorage.remove(getResolvedKey(STORAGE_CONSTANTS.STORED_SESSION_ID, opt));\n  _.localStorage.remove(getResolvedKey(STORAGE_CONSTANTS.STORED_CAMPAIGN_DATA_USER, opt));\n  _.localStorage.remove(getResolvedKey(STORAGE_CONSTANTS.STORED_CAMPAIGN_DATA_COMPANY, opt));\n}\n\n// LocalStorage-only helpers for page-specific data (e.g., pending requests queue)\n// These do NOT sync to cookies and are not meant for cross-subdomain data\n// Respects user's persistence preference - if they opted for 'cookie' mode, localStorage is not used\nfunction getFromLocalStorageOnly(key, opt) {\n  if (!shouldUseLocalStorage(opt)) {\n    return null;\n  }\n  return ensureNotNilString(_.localStorage.get(getResolvedKey(key, opt)));\n}\n\nfunction saveToLocalStorageOnly(key, value, opt) {\n  if (!shouldUseLocalStorage(opt)) {\n    return false;\n  }\n  _.localStorage.set(getResolvedKey(key, opt), value);\n  return true;\n}\n\nfunction removeFromLocalStorageOnly(key, opt) {\n  if (!shouldUseLocalStorage(opt)) {\n    return false;\n  }\n  _.localStorage.remove(getResolvedKey(key, opt));\n  return true;\n}\n\nvar logger$4 = console_with_prefix('campaign');\n\nfunction getGclid(urlParams) {\n  var gclid = _.getQueryParamByName('gclid', urlParams);\n  if (_.isEmptyString(gclid)) {\n    return;\n  }\n  return gclid;\n}\n\nfunction getCampaignDataFromUrlOrCookie(opt) {\n  try {\n    var result = {};\n\n    if (!opt.disableUtm) {\n      result = getUtm() || {};\n    }\n\n    if (!opt.disableReferer) {\n      var referrer = getReferrer();\n      if (referrer) {\n        result['referrer'] = referrer['referrer'];\n        result['referring_domain'] = referrer['referring_domain'];\n      }\n    }\n    if (!opt.disableRGclid) {\n      var gclid = getGclid(_.getUrlParams());\n      if (gclid) {\n        result['gclid'] = gclid;\n      }\n    }\n\n    return result;\n  } catch (err) {\n    logger$4.log(err);\n  }\n}\n\nfunction hasData(data) {\n  if (data && !_.isEmptyObject(data)) {\n    return true;\n  }\n  return false;\n}\n\nfunction saveEncodeIfHasData(persist, storageKey, data) {\n  try {\n    if (hasData(data)) {\n      var dataString = _.JSONEncode(data);\n      persist(storageKey, dataString);\n    }\n  } catch (err) {\n    logger$4.error('failed to decode campaign data');\n    logger$4.error(err);\n  }\n}\n\nfunction getAndDecode(storageKey, opt) {\n  try {\n    var stringVal = getFromPersistence(storageKey, opt);\n    if (stringVal && stringVal !== 'null') {\n       var data = _.JSONDecode(stringVal);\n       if (hasData(data)) {\n         return data;\n       }\n       return null;\n    }\n  } catch (err) {\n    logger$4.error('failed to persist campaign data');\n    logger$4.error(err);\n    return null;\n  }\n}\n\nfunction storeForOneEntityIfNotSavedYet(\n  persist,\n  opt,\n  entityStorageKey,\n  currentCampaignData\n) {\n  var storedData = getAndDecode(entityStorageKey, opt);\n  if (!storedData && persist) {\n    // no stored data thus store current.\n    saveEncodeIfHasData(persist, entityStorageKey, currentCampaignData);\n  }\n}\n\n// this stores Campaign data if not saved yet.\nfunction storeCampaignDataIfNeeded(persist, opt, currentCampaignData) {\n  storeForOneEntityIfNotSavedYet(persist, opt, STORAGE_CONSTANTS.STORED_CAMPAIGN_DATA_USER, currentCampaignData);\n  storeForOneEntityIfNotSavedYet(persist, opt, STORAGE_CONSTANTS.STORED_CAMPAIGN_DATA_COMPANY, currentCampaignData);\n}\n\nfunction popStoredCampaignData(persist, opt, storageKey) {\n  var storedCampaignData = getAndDecode(storageKey, opt);\n\n  if (storedCampaignData) {\n    // let's delete it\n    // we know we will use it.\n    // so next one can overridee\n    try {\n      persist(storageKey, '');\n    } catch (err) {\n      logger$4.error('failed to clear campaign data');\n    }\n  }\n  return storedCampaignData;\n}\n\nfunction popStoredCampaignDataForUser(persist, opt) {\n  return popStoredCampaignData(persist, opt, STORAGE_CONSTANTS.STORED_CAMPAIGN_DATA_USER);\n}\n\nfunction popStoredCampaignDataForCompany(persist, opt) {\n  return popStoredCampaignData(persist, opt, STORAGE_CONSTANTS.STORED_CAMPAIGN_DATA_COMPANY);\n}\n\n// eslint-disable-line\n\nvar logger$9 = console_with_prefix('lock');\n\n/**\n * SharedLock: a mutex built on HTML5 localStorage, to ensure that only one browser\n * window/tab at a time will be able to access shared resources.\n *\n * Implementation based on the original version by David Wolever (https://github.com/wolever)\n * at https://gist.github.com/wolever/5fd7573d1ef6166e8f8c4af286a69432.\n *\n * @example\n * var myLock = new SharedLock('some-key');\n * myLock.withLock(function() {\n *   console.log('I hold the mutex!');\n * });\n *\n * @constructor\n */\nvar SharedLock = function(key, options) {\n    options = options || {};\n\n    this.storageKey = key;\n    this.storage = options.storage || window.localStorage;\n    this.pollIntervalMS = options.pollIntervalMS || 100;\n    this.timeoutMS = options.timeoutMS || 2000;\n};\n\n// pass in a specific pid to test contention scenarios; otherwise\n// it is chosen randomly for each acquisition attempt\nSharedLock.prototype.withLock = function(lockedCB, errorCB, pid) {\n    if (!pid && typeof errorCB !== 'function') {\n        pid = errorCB;\n        errorCB = null;\n    }\n\n    var i = pid || (new Date().getTime() + '|' + Math.random());\n    var startTime = new Date().getTime();\n\n    var key = this.storageKey;\n    var pollIntervalMS = this.pollIntervalMS;\n    var timeoutMS = this.timeoutMS;\n    var storage = this.storage;\n\n    var keyX = key + ':X';\n    var keyY = key + ':Y';\n    var keyZ = key + ':Z';\n\n    var reportError = function(err) {\n        errorCB && errorCB(err);\n    };\n\n    var delay = function(cb) {\n        if (new Date().getTime() - startTime > timeoutMS) {\n            logger$9.error('Timeout waiting for mutex on ' + key + '; clearing lock. [' + i + ']');\n            storage.removeItem(keyZ);\n            storage.removeItem(keyY);\n            loop();\n            return;\n        }\n        setTimeout(function() {\n            try {\n                cb();\n            } catch(err) {\n                reportError(err);\n            }\n        }, pollIntervalMS * (Math.random() + 0.1));\n    };\n\n    var waitFor = function(predicate, cb) {\n        if (predicate()) {\n            cb();\n        } else {\n            delay(function() {\n                waitFor(predicate, cb);\n            });\n        }\n    };\n\n    var getSetY = function() {\n        var valY = storage.getItem(keyY);\n        if (valY && valY !== i) { // if Y == i then this process already has the lock (useful for test cases)\n            return false;\n        } else {\n            storage.setItem(keyY, i);\n            if (storage.getItem(keyY) === i) {\n                return true;\n            } else {\n                if (!localStorageSupported(storage, true)) {\n                    throw new Error('localStorage support dropped while acquiring lock');\n                }\n                return false;\n            }\n        }\n    };\n\n    var loop = function() {\n        storage.setItem(keyX, i);\n\n        waitFor(getSetY, function() {\n            if (storage.getItem(keyX) === i) {\n                criticalSection();\n                return;\n            }\n\n            delay(function() {\n                if (storage.getItem(keyY) !== i) {\n                    loop();\n                    return;\n                }\n                waitFor(function() {\n                    return !storage.getItem(keyZ);\n                }, criticalSection);\n            });\n        });\n    };\n\n    var criticalSection = function() {\n        storage.setItem(keyZ, '1');\n        try {\n            lockedCB();\n        } finally {\n            storage.removeItem(keyZ);\n            if (storage.getItem(keyY) === i) {\n                storage.removeItem(keyY);\n            }\n            if (storage.getItem(keyX) === i) {\n                storage.removeItem(keyX);\n            }\n        }\n    };\n\n    try {\n        if (localStorageSupported(storage, true)) {\n            loop();\n        } else {\n            throw new Error('localStorage support check failed');\n        }\n    } catch(err) {\n        reportError(err);\n    }\n};\n\nvar logger$8 = console_with_prefix('batch');\n\nvar DEFAULT_STORAGE_EXPIRATION = 6 * 60 * 60 * 1000; // 6 hours.\n\n/**\n * RequestQueue: queue for batching API requests with localStorage backup for retries.\n * Maintains an in-memory queue which represents the source of truth for the current\n * page, but also writes all items out to a copy in the browser's localStorage, which\n * can be read on subsequent pageloads and retried. For batchability, all the request\n * items in the queue should be of the same type (events, people updates, group updates)\n * so they can be sent in a single request to the same API endpoint.\n *\n * LocalStorage keying and locking: In order for reloads and subsequent pageloads of\n * the same site to access the same persisted data, they must share the same localStorage\n * key (for instance based on project token and queue type). Therefore access to the\n * localStorage entry is guarded by an asynchronous mutex (SharedLock) to prevent\n * simultaneously open windows/tabs from overwriting each other's data (which would lead\n * to data loss in some situations).\n * @constructor\n */\nvar RequestQueue = function(storageKey, options) {\n    options = options || {};\n    this.storageKey = storageKey;\n    this.storage = options.storage || window.localStorage;\n    this.lock = new SharedLock(storageKey, {storage: this.storage});\n    this.storageExpiration = options.storageExpiration || DEFAULT_STORAGE_EXPIRATION;\n\n    this.pid = options.pid || null; // pass pid to test out storage lock contention scenarios\n\n    this.memQueue = [];\n};\n\n/**\n * Add one item to queues (memory and localStorage). The queued entry includes\n * the given item along with an auto-generated ID and a \"flush-after\" timestamp.\n * It is expected that the item will be sent over the network and dequeued\n * before the flush-after time; if this doesn't happen it is considered orphaned\n * (e.g., the original tab where it was enqueued got closed before it could be\n * sent) and the item can be sent by any tab that finds it in localStorage.\n *\n * The final callback param is called with a param indicating success or\n * failure of the enqueue operation; it is asynchronous because the localStorage\n * lock is asynchronous.\n */\nRequestQueue.prototype.enqueue = function(item, flushInterval, cb) {\n    var queueEntry = {\n        'id': cheap_guid(),\n        'flushAfter': new Date().getTime() + flushInterval * 2,\n        'payload': item\n    };\n\n    this.lock.withLock(_.bind(function lockAcquired() {\n        var succeeded;\n        try {\n            var storedQueue = this.readFromStorage();\n            storedQueue.push(queueEntry);\n            succeeded = this.saveToStorage(storedQueue);\n            if (succeeded) {\n                // only add to in-memory queue when storage succeeds\n                logger$8.log('succeeded saving to storage');\n                this.memQueue.push(queueEntry);\n            }\n        } catch(err) {\n            logger$8.error('Error enqueueing item', item);\n            succeeded = false;\n        }\n        if (cb) {\n            cb(succeeded);\n        }\n    }, this), function lockFailure(err) {\n        logger$8.error('Error acquiring storage lock', err);\n        if (cb) {\n            cb(false);\n        }\n    }, this.pid);\n};\n\n/**\n * Read out the given number of queue entries. If this.memQueue\n * has fewer than batchSize items, then look for \"orphaned\" items\n * in the persisted queue (items where the 'flushAfter' time has\n * already passed).\n */\nRequestQueue.prototype.fillBatch = function(batchSize) {\n    this.memQueue = filterOutIDsAndInvalid(this.memQueue, {}, this.storageExpiration);\n    var batch = this.memQueue.slice(0, batchSize);\n\n    if (batch.length < batchSize) {\n        // don't need lock just to read events; localStorage is thread-safe\n        // and the worst that could happen is a duplicate send of some\n        // orphaned events, which will be deduplicated on the server side\n        var storedQueue = this.readFromStorage();\n        logger$8.log('current storedQueue size ' + storedQueue.length);\n        if (storedQueue.length) {\n            // item IDs already in batch; don't duplicate out of storage\n            var idsInBatch = {}; // poor man's Set\n            _.each(batch, function(item) { idsInBatch[item['id']] = true; });\n\n            for (var i = 0; i < storedQueue.length; i++) {\n                var item = storedQueue[i];\n                var currentTime = new Date().getTime();\n\n                var expirationTime = currentTime - this.storageExpiration;\n\n                if (currentTime > item['flushAfter'] && item['flushAfter'] >= expirationTime && !idsInBatch[item['id']]) {\n                    batch.push(item);\n                    if (batch.length >= batchSize) {\n                        break;\n                    }\n                } else {\n                  logger$8.log('fill batch filtered item because invalid or expired' + JSONStringify(item));\n                }\n            }\n        }\n    }\n    return batch;\n};\n\n/**\n * Remove items with matching 'id' from array (immutably)\n * also remove any item without a valid id (e.g., malformed\n * storage entries).\n */\nvar filterOutIDsAndInvalid = function(items, idSet, storageExpiration) {\n    var filteredItems = [];\n    var currentTime = new Date().getTime();\n\n    var expirationTime = currentTime - storageExpiration;\n    logger$8.log('expiration time is ' + expirationTime);\n\n    _.each(items, function(item) {\n        if (item['id'] && !idSet[item['id']]) {\n            if (item['flushAfter'] && item['flushAfter'] >= expirationTime) {\n              filteredItems.push(item);\n            }\n        } else {\n          logger$8.log('filtered out item because invalid or expired' + JSONStringify(item));\n        }\n    });\n    return filteredItems;\n};\n\n/**\n * Remove items with matching IDs from both in-memory queue\n * and persisted queue\n */\nRequestQueue.prototype.removeItemsByID = function(ids, cb) {\n    var idSet = {}; // poor man's Set\n    _.each(ids, function(id) { idSet[id] = true; });\n\n    this.memQueue = filterOutIDsAndInvalid(this.memQueue, idSet, this.storageExpiration);\n\n    var removeFromStorage = _.bind(function () {\n      var succeeded;\n      try {\n          var storedQueue = this.readFromStorage();\n          storedQueue = filterOutIDsAndInvalid(storedQueue, idSet, this.storageExpiration);\n          succeeded = this.saveToStorage(storedQueue);\n      } catch(err) {\n          logger$8.error('Error removing items', ids);\n          succeeded = false;\n      }\n      return succeeded;\n    } , this);\n\n    this.lock.withLock(\n      _.bind(function lockAcquired() {\n        var succeeded = removeFromStorage();\n        if (cb) {\n          logger$8.log('triggering callback of removalItems');\n          cb(succeeded);\n        }\n      }, this),\n      _.bind(function lockFailure(err) {\n        var succeeded = false;\n        logger$8.error('Error acquiring storage lock', err);\n        if (!localStorageSupported(this.storage, true)) {\n          succeeded = removeFromStorage();\n          if (!succeeded) {\n            // still can not remove from storage.\n            // we stop using storage.\n            logger$8.error('still can not remove from storage, thus stop using storage');\n\n            try {\n              this.storage.removeItem(this.storageKey);\n            } catch (err) {\n              logger$8.error('error clearing queue', err);\n            }\n          }\n        }\n        if (cb) {\n          cb(succeeded);\n        }\n      }, this),\n      this.pid\n    );\n};\n\n/**\n * Read and parse items array from localStorage entry, handling\n * malformed/missing data if necessary.\n */\nRequestQueue.prototype.readFromStorage = function() {\n    var storageEntry;\n    try {\n        logger$8.log('trying to get storage with storage key ' + this.storageKey);\n        storageEntry = this.storage.getItem(this.storageKey);\n        if (storageEntry) {\n            storageEntry = JSONParse(storageEntry);\n            if (!_.isArray(storageEntry)) {\n                logger$8.error('Invalid storage entry:', storageEntry);\n                storageEntry = null;\n            }\n        } else {\n          logger$8.log('storageEntry is empty');\n        }\n    } catch (err) {\n        logger$8.error('Error retrieving queue', err);\n        storageEntry = null;\n    }\n    return storageEntry || [];\n};\n\n/**\n * Serialize the given items array to localStorage.\n */\nRequestQueue.prototype.saveToStorage = function(queue) {\n    try {\n        this.storage.setItem(this.storageKey, JSONStringify(queue));\n        return true;\n    } catch (err) {\n        logger$8.error('Error saving queue', err);\n        return false;\n    }\n};\n\n/**\n * Clear out queues (memory and localStorage).\n */\nRequestQueue.prototype.clear = function() {\n    this.memQueue = [];\n    try {\n      this.storage.removeItem(this.storageKey);\n    } catch (err) {\n      logger$8.error('Failed to clear storage', err);\n    }\n};\n\n// eslint-disable-line camelcase\n\n// maximum interval between request retries after exponential backoff\nvar MAX_RETRY_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes\nvar MAX_REMOVE_FAILURE = 5;\n\nvar logger$7 = console_with_prefix('batch');\n\n/**\n * RequestBatcher: manages the queueing, flushing, retry etc of requests of one\n * type (events, people, groups).\n * Uses RequestQueue to manage the backing store.\n * @constructor\n */\nvar RequestBatcher = function(storageKey, endpoint, options) {\n    var storageExpiration = options.libConfig['batch_storage_expiration'];\n    this.queue = new RequestQueue(storageKey, { storage: options.storage, storageExpiration: storageExpiration });\n    this.endpoint = endpoint;\n\n    this.libConfig = options.libConfig;\n    this.sendRequest = options.sendRequestFunc;\n\n    // seed variable batch size + flush interval with configured values\n    this.batchSize = this.libConfig['batch_size'];\n    this.flushInterval = this.libConfig['batch_flush_interval_ms'];\n\n    this.stopAllBatching = options.stopAllBatching;\n\n    this.stopped = false;\n    this.removalFailures = 0;\n};\n\n/**\n * Add one item to queue.\n */\nRequestBatcher.prototype.enqueue = function(item, cb) {\n    this.queue.enqueue(item, this.flushInterval, cb);\n};\n\n/**\n * Start flushing batches at the configured time interval. Must call\n * this method upon SDK init in order to send anything over the network.\n */\nRequestBatcher.prototype.start = function() {\n    this.stopped = false;\n    this.removalFailures = 0;\n    this.flush();\n};\n\n/**\n * Stop flushing batches. Can be restarted by calling start().\n */\nRequestBatcher.prototype.stop = function() {\n    this.stopped = true;\n    if (this.timeoutID) {\n        clearTimeout(this.timeoutID);\n        this.timeoutID = null;\n    }\n};\n\n/**\n * Clear out queue.\n */\nRequestBatcher.prototype.clear = function() {\n    this.queue.clear();\n};\n\n/**\n * Restore batch size configuration to whatever is set in the main SDK.\n */\nRequestBatcher.prototype.resetBatchSize = function() {\n    this.batchSize = this.libConfig['batch_size'];\n};\n\n/**\n * Restore flush interval time configuration to whatever is set in the main SDK.\n */\nRequestBatcher.prototype.resetFlush = function() {\n    this.scheduleFlush(this.libConfig['batch_flush_interval_ms']);\n};\n\n/**\n * Schedule the next flush in the given number of milliseconds.\n */\nRequestBatcher.prototype.scheduleFlush = function(flushMS) {\n    this.flushInterval = flushMS;\n    if (!this.stopped) { // don't schedule anymore if batching has been stopped\n        this.timeoutID = setTimeout(_.bind(this.flush, this), this.flushInterval);\n    }\n};\n\n/**\n * Flush one batch to network. Depending on success/failure modes, it will either\n * remove the batch from the queue or leave it in for retry, and schedule the next\n * flush. In cases of most network or API failures, it will back off exponentially\n * when retrying.\n * @param {Object} [options]\n * @param {boolean} [options.sendBeacon] - whether to send batch with\n * navigator.sendBeacon (only useful for sending batches before page unloads, as\n * sendBeacon offers no callbacks or status indications)\n */\nRequestBatcher.prototype.flush = function(options) {\n    try {\n        if (this.requestInProgress) {\n            logger$7.log('Flush: Request already in progress');\n            return;\n        }\n\n        options = options || {};\n        var currentBatchSize = this.batchSize;\n        var batch = this.queue.fillBatch(currentBatchSize);\n        logger$7.log('current batch size is ' + batch.length);\n\n        if (batch.length < 1) {\n            this.resetFlush();\n            return; // nothing to do\n        }\n\n        this.requestInProgress = true;\n\n        var timeoutMS = this.libConfig['batch_request_timeout_ms'];\n        var startTime = new Date().getTime();\n        var dataForRequest = _.map(batch, function(item) { return item['payload']; });\n        var batchSendCallback = _.bind(function(res) {\n            this.requestInProgress = false;\n\n            try {\n                // handle API response in a try-catch to make sure we can reset the\n                // flush operation if something goes wrong\n\n                var removeItemsFromQueue = false;\n                if (\n                    _.isObject(res) &&\n                    res.error === 'timeout' &&\n                    new Date().getTime() - startTime >= timeoutMS\n                ) {\n                    logger$7.error('Network timeout; retrying');\n                    this.flush();\n                } else if (\n                    _.isObject(res) &&\n                    res.xhr_req &&\n                    (res.xhr_req['status'] >= 500 || res.xhr_req['status'] <= 0)\n                ) {\n                    // network or API error, retry\n                    var retryMS = this.flushInterval * 2;\n                    var headers = res.xhr_req['responseHeaders'];\n                    if (headers) {\n                        var retryAfter = headers['Retry-After'];\n                        if (retryAfter) {\n                            retryMS = (parseInt(retryAfter, 10) * 1000) || retryMS;\n                        }\n                    }\n                    retryMS = Math.min(MAX_RETRY_INTERVAL_MS, retryMS);\n                    logger$7.error('Error; retry in ' + retryMS + ' ms');\n                    this.scheduleFlush(retryMS);\n                } else if (_.isObject(res) && res.xhr_req && res.xhr_req['status'] === 413) {\n                    // 413 Payload Too Large\n                    if (batch.length > 1) {\n                        var halvedBatchSize = Math.max(1, Math.floor(currentBatchSize / 2));\n                        this.batchSize = Math.min(this.batchSize, halvedBatchSize, batch.length - 1);\n                        logger$7.error('413 response; reducing batch size to ' + this.batchSize);\n                        this.resetFlush();\n                    } else {\n                        logger$7.error('Single-event request too large; dropping', batch);\n                        this.resetBatchSize();\n                        removeItemsFromQueue = true;\n                    }\n                } else {\n                    // successful network request+response; remove each item in batch from queue\n                    // (even if it was e.g. a 400, in which case retrying won't help)\n                    removeItemsFromQueue = true;\n                }\n\n                if (removeItemsFromQueue) {\n                  this.queue.removeItemsByID(\n                    _.map(batch, function (item) {\n                      return item['id'];\n                    }),\n                    _.bind(function (success) {\n                      if (success) {\n                        this.removalFailures = 0;\n                        this.flush();\n                      } else {\n                        this.removalFailures = this.removalFailures + 1;\n                        logger$7.error(\n                          'failed to remove items from batched queue ' +\n                            this.removalFailures +\n                            ' times.'\n                        );\n                        if (this.removalFailures > MAX_REMOVE_FAILURE) {\n                          logger$7.error(\n                            'stop batching because too m any errors remove from storage'\n                          );\n                          this.stopAllBatching();\n                        } else {\n                          this.resetFlush();\n                        }\n                      }\n                    }, this) // handle next batch if the queue isn't empty\n                  );\n                }\n            } catch(err) {\n                logger$7.error('Error handling API response', err);\n                this.resetFlush();\n            }\n        }, this);\n        var requestOptions = {\n            method: 'POST',\n            verbose: true,\n            ignore_json_errors: true, // eslint-disable-line camelcase\n            timeout_ms: timeoutMS // eslint-disable-line camelcase\n        };\n        if (options.sendBeacon) {\n            requestOptions.transport = 'sendBeacon';\n        }\n        logger$7.log('Moesif Request:', this.endpoint, dataForRequest);\n        this.sendRequest(this.endpoint, dataForRequest, requestOptions, batchSendCallback);\n\n    } catch(err) {\n        logger$7.error('Error flushing request queue', err);\n        this.resetFlush();\n    }\n};\n\n// Validate anonymous ID format\n// Should be hex characters separated by dashes, reasonable length\nfunction isValidAnonymousId(id) {\n  if (!id || typeof id !== 'string') {\n    return false;\n  }\n  // Limit length to prevent abuse (max 200 chars)\n  if (id.length > 200) {\n    return false;\n  }\n  // Should contain only hex characters and dashes\n  // Format is: hex-hex-hex-hex (from _.UUID())\n  var validPattern = /^[a-f0-9-]+$/i;\n  if (!validPattern.test(id)) {\n    return false;\n  }\n  // Should have at least one dash (segments)\n  if (id.indexOf('-') === -1) {\n    return false;\n  }\n  return true;\n}\n\nfunction regenerateAnonymousId(persist) {\n  var newId = _.UUID();\n  if (persist) {\n    persist(STORAGE_CONSTANTS.STORED_ANONYMOUS_ID, newId);\n  }\n  return newId;\n}\n\nfunction getAnonymousId(persist, opt, cdtParamName) {\n  // If there is an anonymous id in the url param for cross domain tracking, use that and persist it.\n  if (cdtParamName) { // if cross domain tracking is enabled\n    try {\n      var anonIdFromCrossDomainTracking = _.crossDomainTrackingUtils.getCrossDomainTrackingParamValue(cdtParamName);\n      if (anonIdFromCrossDomainTracking && isValidAnonymousId(anonIdFromCrossDomainTracking)) {\n        persist(STORAGE_CONSTANTS.STORED_ANONYMOUS_ID, anonIdFromCrossDomainTracking);\n        // Clean the URL parameter after persisting to prevent pollution\n        _.crossDomainTrackingUtils.cleanUrlParameter(cdtParamName);\n        return anonIdFromCrossDomainTracking;\n      } else if (anonIdFromCrossDomainTracking) {\n        // Invalid format detected\n        console$1.log('Invalid anonymous ID format from URL parameter, ignoring');\n        // Clean the invalid parameter from URL\n        _.crossDomainTrackingUtils.cleanUrlParameter(cdtParamName);\n      } else {\n        // No parameter found, nothing to do\n        console$1.log('No anonymous ID found in URL parameter for cross-domain tracking');\n      }\n    } catch (err) {\n      console$1.log('Error reading cross-domain tracking parameter: ' + err.message);\n    }\n  }\n  var storedAnonId = getFromPersistence(STORAGE_CONSTANTS.STORED_ANONYMOUS_ID, opt);\n  if (storedAnonId) {\n    return storedAnonId;\n  }\n\n  return regenerateAnonymousId(persist);\n}\n\nvar MOESIF_CONSTANTS = {\n  //The base Uri for API calls\n  HOST: 'api.moesif.net',\n  EVENT_ENDPOINT: '/v1/events',\n  EVENT_BATCH_ENDPOINT: '/v1/events/batch',\n  ACTION_ENDPOINT: '/v1/actions',\n  ACTION_BATCH_ENDPOINT: '/v1/actions/batch',\n  USER_ENDPOINT: '/v1/users',\n  COMPANY_ENDPOINT: '/v1/companies'\n};\n\n// http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/\n// https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#withCredentials\nvar USE_XHR = (window.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest());\n// IE<10 does not support cross-origin XHR's but script tags\n// with defer won't block window.onload; ENQUEUE_REQUESTS\n// should only be true for Opera<12\n\nvar ENQUEUE_REQUESTS = !USE_XHR && (userAgent.indexOf('MSIE') === -1) && (userAgent.indexOf('Mozilla') === -1);\n\nvar NOOP = function() {};\n\n// save reference to navigator.sendBeacon so it can be minified\nvar sendBeacon = null;\nif (navigator['sendBeacon']) {\n  sendBeacon = function () {\n    // late reference to navigator.sendBeacon to allow patching/spying\n    return navigator['sendBeacon'].apply(navigator, arguments);\n  };\n}\n\nvar HTTP_PROTOCOL = (('http:' === (document && document.location.protocol)) ? 'http://' : 'https://');\n\nfunction isMoesif(event) {\n  try {\n    return event['request']['headers']['X-Moesif-SDK'];\n  } catch(err) {\n    return false;\n  }\n}\n\nfunction ensureValidOptions(options) {\n  if (!options) throw new Error('options are required by moesif-browser-js middleware');\n  if (!options['applicationId']) throw new Error('A moesif application id is required. Please obtain it through your settings at www.moesif.com');\n\n  if (options['getTags'] && !_.isFunction(options['getTags'])) {\n    throw new Error('getTags should be a function');\n  }\n  if (options['getMetadata'] && !_.isFunction(options['getMetadata'])) {\n    throw new Error('getMetadata should be a function');\n  }\n  if (options['getApiVersion'] && !_.isFunction(options['getApiVersion'])) {\n    throw new Error('identifyUser should be a function');\n  }\n  if (options['maskContent'] && !_.isFunction(options['maskContent'])) {\n    throw new Error('maskContent should be a function');\n  }\n  if (options['skip'] && !_.isFunction(options['skip'])) {\n    throw new Error('skip should be a function');\n  }\n}\n\nfunction moesifCreator () {\n  console$1.log('moesif object creator is called');\n\n  return {\n    'init': function (options) {\n      if (!window) {\n        console$1.critical('Warning, this library need to be initiated on the client side');\n      }\n\n      ensureValidOptions(options);\n\n      var ops = {};\n\n      ops.getTags = options['getTags'] || NOOP;\n      ops.maskContent = options['maskContent'] || function (eventData) {\n        return eventData;\n      };\n\n      ops.getMetadata = options['getMetadata'] || NOOP;\n\n      ops.skip = options['skip'] || function () {\n        return false;\n      };\n\n      ops.debug = options['debug'];\n      ops.callback = options['callback'] || NOOP;\n      ops.applicationId = options['applicationId'];\n      ops.apiVersion = options['apiVersion'];\n      ops.disableFetch = options['disableFetch'];\n\n      ops.disableReferrer = options['disableReferrer'];\n      ops.disableGclid = options['disableGclid'];\n      ops.disableUtm = options['disableUtm'];\n\n      ops.eagerBodyLogging = options['eagerBodyLogging'];\n      ops.host = options['host'] || MOESIF_CONSTANTS.HOST;\n\n      ops.batchEnabled = options['batchEnabled'] || false;\n\n      ops['batch_size'] = options['batchSize'] || 25,\n      ops['batch_flush_interval_ms'] = options['batchMaxTime'] || 2500;\n      ops['batch_request_timeout_ms'] = options['batchTimeout'] || 90000;\n      ops['batch_storage_expiration'] = options['batchStorageExpiration'];\n\n      // storage persistence based options.\n      // cookie, localStorage, or none.\n      ops['persistence'] = options['persistence'] || 'localStorage';\n\n      // below persistence options only applies to cookie.\n      ops['cross_site_cookie'] = options['crossSiteCookie']  || false;\n      // the default value for this is true.\n      ops['cross_subdomain_cookie'] = options['crossSubdomainCookie'] === false ? false : true;\n      ops['cookie_expiration'] = options['cookieExpiration'] || 365;\n      ops['secure_cookie'] = options['secureCookie'] || false;\n      ops['cookie_domain'] = options['cookieDomain'] || '';\n      ops['persistence_key_prefix'] = options['persistenceKeyPrefix'];\n\n      // specify domains to be considered for cross domain tracking.\n      ops.enableCrossDomainTracking = options['enableCrossDomainTracking'] || false;\n      // crossDomainTargets: array of domains to decorate, null to decorate all domains, [] or undefined to decorate none\n      ops.crossDomainTargets = Object.hasOwn(options, 'crossDomainTargets') ? options['crossDomainTargets'] : [];\n      ops.crossDomainTrackingParameterName = ops.enableCrossDomainTracking ? (options['crossDomainTrackingParameterName'] || '__mt') : null;\n\n      // consent management options\n      ops.requirePublishingConsent = options['requirePublishingConsent'] || false;\n      ops.maxQueueSize = options['maxQueueSize'] || 1000; // Max pending requests before consent\n\n      this.requestBatchers = {};\n\n      this._options = ops;\n      this._persist = getPersistenceFunction(ops);\n\n      // Initialize consent state and pending requests queue\n      // If consent is not required, it's automatically granted\n      this._publishingConsentGranted = !ops.requirePublishingConsent;\n      this._pendingRequests = [];\n      this._recordingActive = false; // Track if recording is active\n\n      try {\n        this._userId = getFromPersistence(STORAGE_CONSTANTS.STORED_USER_ID, ops);\n        this._session = getFromPersistence(STORAGE_CONSTANTS.STORED_SESSION_ID, ops);\n        this._companyId = getFromPersistence(STORAGE_CONSTANTS.STORED_COMPANY_ID, ops);\n        this._anonymousId = getAnonymousId(this._persist, ops, ops.crossDomainTrackingParameterName);\n        this._currentCampaign = getCampaignDataFromUrlOrCookie(ops);\n\n        if (this._currentCampaign) {\n          storeCampaignDataIfNeeded(this._persist, ops, this._currentCampaign);\n        }\n\n        // Load persisted pending requests queue if consent is required\n        if (ops.requirePublishingConsent) {\n          this._loadPersistedQueue();\n        }\n\n        // this._campaign = getCampaignData(this._persist, ops);\n\n        // try to save campaign data on anonymous id\n        // if there is no userId saved, means it is still anonymous.\n        // later on, when identifyUser is called with real user id,\n        // the campaigne data will be resent with that again.\n        if (this._currentCampaign && !this._userId) {\n          var anonUserObject = {};\n          anonUserObject['anonymous_id'] = this._anonymousId;\n          anonUserObject['campaign'] = this._currentCampaign;\n          this.updateUser(anonUserObject, this._options.applicationId, this._options.host, this._options.callback);\n        }\n      } catch(err) {\n        console$1.error('error loading saved data from local storage but continue');\n      }\n\n      if (ops.batchEnabled) {\n        if (!localStorageSupported() || !USE_XHR) {\n          ops.batchEnabled = false;\n          console$1.log('Turning off batch processing because it needs XHR and localStorage');\n        } else {\n          this.initBatching();\n          if (sendBeacon && window.addEventListener) {\n            var flushOnClose = _.bind(function() {\n              _.each(this.requestBatchers, function (batcher) {\n                if (!batcher.stopped) {\n                  batcher.flush({ sendBeacon: true });\n                }\n              });\n            }, this);\n\n            // some browsers do not support visibilitychange event.\n            window.addEventListener('pagehide', function(ev) {\n                flushOnClose();\n            });\n\n            window.addEventListener('visibilitychange', function() {\n              if (document['visibilityState'] === 'hidden') {\n                flushOnClose();\n              }\n            });\n          }\n        }\n      }\n\n      console$1.log('moesif initiated');\n      return this;\n    },\n    _executeRequest: function (url, data, options, callback) {\n      // options structure\n      // {\n      //   method: 'POST',\n      //   verbose: true,\n      //   ignore_json_errors: true, // eslint-disable-line camelcase\n      //   timeout_ms: timeoutMS, // eslint-disable-line camelcase\n      //   applicationId\n      // };\n      var token = (options && options.applicationId) || this._options.applicationId;\n      var method = (options && options.method) || 'POST';\n\n      // right now we onlu support USE_XHR\n      try {\n        var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance\n        xmlhttp.open(method, url);\n        xmlhttp.setRequestHeader('Content-Type', 'application/json');\n        xmlhttp.setRequestHeader('X-Moesif-Application-Id', token);\n        xmlhttp.setRequestHeader('X-Moesif-SDK', 'moesif-browser-js/' + Config.LIB_VERSION);\n\n        if (options.timeout_ms && typeof xmlhttp.timeout !== 'undefined') {\n          xmlhttp.timeout = options.timeout_ms;\n          var startTime = new Date().getTime();\n        }\n        xmlhttp.onreadystatechange = function () {\n          if (xmlhttp.readyState === 4) { // XMLHttpRequest.DONE == 4, except in safari 4\n            if (xmlhttp.status >= 200 && xmlhttp.status <= 300) {\n              if (callback) {\n                var response = XMLHttpRequest.responseText;\n                callback(response);\n              }\n            } else {\n              var error;\n              if (\n                xmlhttp.timeout &&\n                !xmlhttp.status &&\n                new Date().getTime() - startTime >= xmlhttp.timeout\n              ) {\n                error = 'timeout';\n              } else {\n                error = 'Bad HTTP status: ' + xmlhttp.status + ' ' + xmlhttp.statusText;\n              }\n              console$1.error(error);\n              if (callback) {\n                callback({ status: 0, error: error, xhr_req: xmlhttp }); // eslint-disable-line camelcase\n              }\n            }\n          }\n        };\n\n        xmlhttp.send(JSONStringify(data));\n      } catch (err) {\n        console$1.error('failed to send to moesif ' + (data && data['request'] && data['request']['uri']));\n        console$1.error(err);\n         if (callback) {\n          callback({status: 0, error: err });\n        }\n      }\n    },\n    // Queue persistence helpers - uses localStorage only (not cookies)\n    // Pending requests are page-specific, not user-specific\n    _loadPersistedQueue: function() {\n      try {\n        var persistedQueue = getFromLocalStorageOnly(STORAGE_CONSTANTS.STORED_PENDING_REQUESTS, this._options);\n        if (persistedQueue) {\n          var parsed = JSON.parse(persistedQueue);\n          if (Array.isArray(parsed) && parsed.length > 0) {\n            this._pendingRequests = parsed;\n            console$1.log('loaded ' + parsed.length + ' requests from persisted queue');\n          }\n        }\n      } catch (err) {\n        console$1.error('error loading persisted queue: ' + err);\n        this._pendingRequests = [];\n      }\n    },\n    _savePersistedQueue: function() {\n      try {\n        // Serialize queue without callbacks (callbacks can't be serialized)\n        var serializableQueue = this._pendingRequests.map(function(req) {\n          var copy = Object.assign({}, req);\n          delete copy.callback; // Remove callback function\n          return copy;\n        });\n        saveToLocalStorageOnly(STORAGE_CONSTANTS.STORED_PENDING_REQUESTS, JSON.stringify(serializableQueue), this._options);\n      } catch (err) {\n        console$1.error('error saving persisted queue: ' + err);\n      }\n    },\n    _clearPersistedQueue: function() {\n      try {\n        removeFromLocalStorageOnly(STORAGE_CONSTANTS.STORED_PENDING_REQUESTS, this._options);\n      } catch (err) {\n        console$1.error('error clearing persisted queue: ' + err);\n      }\n    },\n    _enqueueRequest: function(requestObject) {\n      // Don't queue if recording is not active\n      if (!this._recordingActive) {\n        console$1.log('recording is not active, dropping request');\n        if (requestObject.callback) {\n          requestObject.callback({ status: 0, error: 'Recording is not active' });\n        }\n        return;\n      }\n\n      // FIFO queue: if queue is full, remove oldest request and add newest\n      if (this._pendingRequests.length >= this._options.maxQueueSize) {\n        var droppedRequest = this._pendingRequests.shift(); // Remove oldest\n        console$1.log('queue size limit reached (' + this._options.maxQueueSize + '), dropping oldest request');\n        if (droppedRequest && droppedRequest.callback) {\n          droppedRequest.callback({ status: 0, error: 'Dropped from queue - queue size limit reached' });\n        }\n      }\n\n      console$1.log('publishing consent not granted, queuing request');\n      this._pendingRequests.push(requestObject);\n\n      // Persist queue to storage\n      this._savePersistedQueue();\n    },\n    _executeOrQueueRequest: function(url, data, options, callback) {\n      // Check consent before sending\n      if (!this._publishingConsentGranted) {\n        this._enqueueRequest({\n          type: 'direct',\n          url: url,\n          data: data,\n          options: options,\n          callback: callback\n        });\n        return;\n      }\n\n      this._executeRequest(url, data, options, callback);\n    },\n    initBatching: function () {\n      var applicationId = this._options.applicationId;\n      var host = this._options.host;\n\n      console$1.log('does requestBatch.events exists? ' + this.requestBatchers.events);\n\n      if (!this.requestBatchers.events) {\n        var batchConfig = {\n          libConfig: this._options,\n          sendRequestFunc: _.bind(function (endPoint, data, options, cb) {\n            this._executeRequest(\n              endPoint,\n              data,\n              options,\n              cb\n            );\n          }, this),\n          stopAllBatching: _.bind(function () {\n            this.stopAllBatching();\n          }, this)\n        };\n\n        var hash = quick_hash(applicationId);\n\n        var eventsBatcher = new RequestBatcher('__mf_' + hash + '_ev', HTTP_PROTOCOL + host + MOESIF_CONSTANTS.EVENT_BATCH_ENDPOINT, batchConfig);\n        var actionsBatcher = new RequestBatcher('__mf_' + hash + '_ac', HTTP_PROTOCOL + host + MOESIF_CONSTANTS.ACTION_BATCH_ENDPOINT, batchConfig);\n\n        this.requestBatchers = {\n          events: eventsBatcher,\n          actions: actionsBatcher\n        };\n      }\n\n      _.each(this.requestBatchers, function (batcher) {\n        batcher.start();\n      });\n    },\n    stopAllBatching: function () {\n      this._options.batchEnabled = false;\n      _.each(this.requestBatchers, function(batcher) {\n          batcher.stop();\n          batcher.clear();\n      });\n    },\n    _sendOrBatch: function(data, applicationId, endPoint, batcher, callback) {\n      var requestInitiated = true;\n      var self = this;\n\n      // Check consent before sending\n      if (!this._publishingConsentGranted) {\n        this._enqueueRequest({\n          type: 'batch',\n          data: data,\n          applicationId: applicationId,\n          endPoint: endPoint,\n          batcher: batcher,\n          callback: callback\n        });\n        return true;\n      }\n\n      var sendImmediately = function () {\n        var executeOps = {\n          applicationId: applicationId\n        };\n        return self._executeRequest(endPoint, data, executeOps, callback);\n      };\n\n      if (this._options.batchEnabled && batcher) {\n        console$1.log('current batcher storage key is  ' + batcher.queue.storageKey);\n        var enqueueCallback = _.bind(function (enqueueSuccess) {\n          if (!enqueueSuccess) {\n            console$1.log('enqueue failed, send immediately');\n            sendImmediately();\n          }\n        }, this);\n        batcher.enqueue(data, enqueueCallback);\n      } else {\n        return sendImmediately();\n      }\n      return requestInitiated;\n    },\n    'start': function (passedInWeb3) {\n      var _self = this;\n\n      if (this._stopRecording || this._stopWeb3Recording) {\n        console$1.log('recording has already started, please call stop first.');\n        return false;\n      }\n\n      function recorder(event) {\n        _self.recordEvent(event);\n      }\n\n      console$1.log('moesif starting');\n      this._recordingActive = true; // Mark recording as active\n      this._stopRecording = captureXMLHttpRequest(recorder, this._options);\n\n      if (!this._options.disableFetch) {\n        console$1.log('also instrumenting fetch API');\n        this._stopFetchRecording = patch(recorder);\n      }\n\n      if (this._options.enableCrossDomainTracking) {\n        console$1.log('enabling cross domain tracking');\n\n        var targets = this._options.crossDomainTargets;\n\n        // If user has not consented to publishing data, we should not decorate links for cross domain tracking\n        var crossDomainDecoratorMiddleware = _.bind(function(context, next) {\n          if (this._publishingConsentGranted) {\n            next();\n          } else {\n            // if no consent, skip decoration (ex: not call next())\n          }\n        }, this);\n\n        // null means decorate all domains (explicit opt-in)\n        if (targets === null) {\n          console$1.log('cross domain tracking is enabled for ALL domains and hyperlinks');\n          this._stopCrossDomainTracking = decorateLinks(\n            null,\n            this._options.crossDomainTrackingParameterName,\n            this._anonymousId,\n            crossDomainDecoratorMiddleware\n          );\n        } else if (Array.isArray(targets) && targets.length > 0) {\n          console$1.log('decorating links for cross domain tracking on specified domains: ' + targets.join(', '));\n          this._stopCrossDomainTracking = decorateLinks(\n            targets,\n            this._options.crossDomainTrackingParameterName,\n            this._anonymousId,\n            crossDomainDecoratorMiddleware\n          );\n        } else {\n          console$1.log('cross domain tracking is enabled but no target domains specified - no links will be decorated');\n          // Don't set up event listeners if no targets specified\n        }\n      }\n\n      this['useWeb3'](passedInWeb3);\n\n      // if (passedInWeb3) {\n      //   this._stopWeb3Recording = patchWeb3WithCapture(passedInWeb3, _self.recordEvent, this._options);\n      // } else if (window['web3']) {\n      //   // try to patch the global web3\n      //   console.log('found global web3, will capture from it');\n      //   this._stopWeb3Recording = patchWeb3WithCapture(window['web3'], _self.recordEvent, this._options);\n      // }\n      return true;\n    },\n    // Let users decorate their own links with cdt. (ex: for window.open/location, navigation api, etc.)\n    'cdtUrlDecorator': function (url, overrideDomains) {\n      if (overrideDomains === undefined) {\n          overrideDomains = false;\n      }\n      if (!url) {\n        return url;\n      }\n\n      // Check consent before decorating\n      if (!this._publishingConsentGranted) {\n        console$1.log('publishing consent not granted, skipping URL decoration');\n        return url;\n      }\n\n      var decoratableDomains = overrideDomains ? null : this._options.crossDomainTargets;\n      return _.crossDomainTrackingUtils.cdtUrlDecorator(url, decoratableDomains, this._options.crossDomainTrackingParameterName, this._anonymousId, window);\n    },\n     'useWeb3': function (passedInWeb3) {\n      var _self = this;\n\n      function recorder(event) {\n        _self.recordEvent(event);\n      }\n\n      try {\n        if (this._stopWeb3Recording) {\n          this._stopWeb3Recording();\n          this._stopWeb3Recording = null;\n        }\n        if (passedInWeb3) {\n          this._stopWeb3Recording = captureWeb3Requests(passedInWeb3, recorder, this._options);\n        } else if (window['web3']) {\n          // try to patch the global web3\n          console$1.log('found global web3, will capture from it');\n          this._stopWeb3Recording = captureWeb3Requests(window['web3'], recorder, this._options);\n        }\n        if (this._stopWeb3Recording) {\n          // if function is returned it means we succeeded.\n          return true;\n        }\n      } catch (err) {\n        console$1.log('error patching web3, moving forward anyways');\n        if(this._options.callback) {\n          this._options.callback({ status: 0, error: err, message: 'failed to instrument web3, but moving forward with other instrumentation' });\n        }\n      }\n      return false;\n    },\n    updateUser: function(userObject, applicationId, host, callback) {\n      this._executeOrQueueRequest(\n        HTTP_PROTOCOL + host + MOESIF_CONSTANTS.USER_ENDPOINT,\n        userObject,\n        { applicationId: applicationId },\n        callback\n      );\n    },\n    'identifyUser': function (userId, metadata) {\n      if (_.isNil(userId)) {\n        console$1.critical('identifyUser called with nil userId');\n        return;\n      }\n\n      this._userId = userId;\n      if (!(this._options && this._options.applicationId)) {\n        throw new Error('Init needs to be called with a valid application Id before calling identify User.');\n      }\n      var userObject = {\n        'user_id': userId\n      };\n\n      if (metadata) {\n        userObject['metadata'] = metadata;\n      }\n      if (this._session) {\n        userObject['session_token'] = this._session;\n      }\n\n      var campaignData = popStoredCampaignDataForUser(this._persist, this._options) || this._currentCampaign;\n\n      if (campaignData) {\n        userObject['campaign'] = campaignData;\n      }\n\n      if (this._companyId) {\n        userObject['company_id'] = this._companyId;\n      }\n\n      userObject['anonymous_id'] = this._anonymousId;\n\n      this.updateUser(userObject, this._options.applicationId, this._options.host, this._options.callback);\n      try {\n        if (userId) {\n          this._persist(STORAGE_CONSTANTS.STORED_USER_ID, userId);\n        }\n      } catch (err) {\n        console$1.error('error saving to local storage');\n      }\n    },\n    updateCompany: function(companyObject, applicationId, host, callback) {\n      this._executeOrQueueRequest(\n        HTTP_PROTOCOL + host + MOESIF_CONSTANTS.COMPANY_ENDPOINT,\n        companyObject,\n        { applicationId: applicationId },\n        callback\n      );\n    },\n    'identifyCompany': function (companyId, metadata, companyDomain) {\n      if (_.isNil(companyId)) {\n        console$1.critical('identifyCompany called with nil companyId.');\n        return;\n      }\n\n      this._companyId = companyId;\n      if (!(this._options && this._options.applicationId)) {\n        throw new Error('Init needs to be called with a valid application Id before calling identify User.');\n      }\n      var companyObject = {\n        'company_id': companyId\n      };\n\n      if (companyDomain) {\n        companyObject['company_domain'] = companyDomain;\n      }\n\n      if (metadata) {\n        companyObject['metadata'] = metadata;\n      }\n      if (this._session) {\n        companyObject['session_token'] = this._session;\n      }\n\n      var campaignData = popStoredCampaignDataForCompany(this._persist, this._options) || this._currentCampaign;\n\n      if (campaignData) {\n        companyObject['campaign'] = campaignData;\n      }\n\n      this.updateCompany(companyObject, this._options.applicationId, this._options.host, this._options.callback);\n\n      try {\n        if (companyId) {\n          this._persist(STORAGE_CONSTANTS.STORED_COMPANY_ID, companyId);\n        }\n      } catch (err) {\n        console$1.error('error saving to local storage');\n      }\n    },\n    'identifySession': function (session) {\n      if (_.isNil(session)) {\n        console$1.critical('identifySession called with nil');\n        return;\n      }\n      this._session = session;\n      if (session) {\n        try {\n          this._persist(STORAGE_CONSTANTS.STORED_SESSION_ID, session);\n        } catch (err) {\n          console$1.error('local storage error');\n        }\n      }\n    },\n    'track': function (actionName, metadata) {\n      var _self = this;\n      if (!actionName) {\n        throw new Error('track name must have action Name defined');\n      }\n\n      var actionObject = {\n        'action_name': actionName\n      };\n\n      if (_self._companyId) {\n        actionObject['company_id'] = _self._companyId;\n      }\n      if (_self._userId) {\n        actionObject['user_id'] = _self._userId;\n      } else {\n        actionObject['anonymous_id'] = _self._anonymousId;\n      }\n      if (this._session) {\n        actionObject['session_token'] = this._session;\n      }\n\n      actionObject['request'] = {\n        'uri': document.location.href,\n        'verb': 'GET', // for UI events on a current page, the current page verb is always get\n        'user_agent_string': navigator.userAgent\n      };\n\n      actionObject['transaction_id'] = _.uuid4();\n\n      if (metadata) {\n        actionObject['metadata'] = metadata;\n      }\n\n      // sendAction(actionObject, this._options.applicationId, this._options.debug, this._options.callback);\n      var endPoint = HTTP_PROTOCOL + _self._options.host + MOESIF_CONSTANTS.ACTION_ENDPOINT;\n      console$1.log('sending or queuing: ' + actionName);\n      return _self._sendOrBatch(\n        actionObject,\n        _self._options.applicationId,\n        endPoint,\n        _self.requestBatchers.actions,\n        _self._options.callback\n      );\n    },\n    recordEvent: function (event) {\n      if (isMoesif(event)) {\n        console$1.log('skipped logging for requests to moesif');\n        return;\n      }\n\n      var _self = this;\n      console$1.log('determining if should log: ' + event['request']['uri']);\n      var logData = Object.assign({}, event);\n      if (_self._getUserId()) {\n        logData['user_id'] = _self._getUserId();\n      } else {\n        logData['anonymous_id'] = _self._anonymousId;\n      }\n\n      if (_self._getCompanyId()) {\n        logData['company_id'] = _self._getCompanyId();\n      }\n      if (_self._getSession()) {\n        logData['session_token'] = _self._getSession();\n      }\n\n      logData['tags'] = _self._options.getTags(event) || '';\n\n      if (_self._options.apiVersion) {\n        logData['request']['api_version'] = _self._options.apiVersion;\n      }\n\n      if (!logData['request']['headers']['User-Agent']) {\n        logData['request']['headers']['User-Agent'] = window.navigator.userAgent;\n      }\n\n      logData['transaction_id'] = _.uuid4();\n\n      if (_self._options.maskContent) {\n        logData = _self._options.maskContent(logData);\n      }\n\n      if (_self._options.getMetadata) {\n        if (logData['metadata']) {\n          var newMetadata = _self._options.getMetadata(logData);\n          logData['metadata'] = Object.assign(logData['metadata'], newMetadata);\n        } else {\n          logData['metadata'] = _self._options.getMetadata(logData);\n        }\n      }\n\n      if (!_self._options.skip(event) && !isMoesif(event)) {\n        // sendEvent(logData, _self._options.applicationId, _self._options.callback);\n        console$1.log('sending or queuing: ' + event['request']['uri']);\n        var endPoint = HTTP_PROTOCOL + _self._options.host + MOESIF_CONSTANTS.EVENT_ENDPOINT;\n        _self._sendOrBatch(\n          logData,\n          _self._options.applicationId,\n          endPoint,\n          _self.requestBatchers.events,\n          _self._options.callback\n        );\n      } else {\n        console$1.log('skipped logging for ' + event['request']['uri']);\n      }\n    },\n    _getUserId: function () {\n      return this._userId;\n    },\n    _getCompanyId: function () {\n      return this._companyId;\n    },\n    _getSession: function () {\n      return this._session;\n    },\n    'stop': function () {\n      console$1.log('stopping moesif recording');\n      this._recordingActive = false; // Mark recording as inactive\n\n      if (this._stopRecording) {\n        this._stopRecording();\n        this._stopRecording = null;\n      }\n      if (this._stopWeb3Recording) {\n        this._stopWeb3Recording();\n        this._stopWeb3Recording = null;\n      }\n      if (this._stopFetchRecording) {\n        this._stopFetchRecording();\n        this._stopFetchRecording = null;\n      }\n      if (this._stopCrossDomainTracking) {\n        this._stopCrossDomainTracking();\n        this._stopCrossDomainTracking = null;\n      }\n    },\n    'clearCookies': function () {\n      clearCookies(this._options);\n    },\n    'clearStorage': function () {\n      clearLocalStorage(this._options);\n      this._clearPersistedQueue();\n    },\n    'resetAnonymousId': function () {\n      this._anonymousId = regenerateAnonymousId(this._persist);\n      return this._anonymousId;\n    },\n    'reset': function () {\n      clearCookies(this._options);\n      clearLocalStorage(this._options);\n      this._anonymousId = regenerateAnonymousId(this._persist);\n      this._companyId = null;\n      this._userId = null;\n      this._session = null;\n      this._currentCampaign = null;\n      this._pendingRequests = [];\n      this._clearPersistedQueue();\n      // Consent state is NOT reset - use revokePublishingConsent() to explicitly revoke consent\n    },\n    '_flushPendingRequests': function() {\n      console$1.log('flushing ' + this._pendingRequests.length + ' pending requests');\n\n      while (this._pendingRequests.length > 0) {\n        var request = this._pendingRequests.shift();\n\n        if (request.type === 'batch') {\n          // Re-call _sendOrBatch, but now consent is granted so it will send\n          this._sendOrBatch(\n            request.data,\n            request.applicationId,\n            request.endPoint,\n            request.batcher,\n            request.callback\n          );\n        } else if (request.type === 'direct') {\n          // Direct requests (user/company updates) - just execute with stored parameters\n          this._executeRequest(\n            request.url,\n            request.data,\n            request.options,\n            request.callback\n          );\n        }\n      }\n\n      // Clear persisted queue after flushing\n      this._clearPersistedQueue();\n    },\n    'grantPublishingConsent': function() {\n      if (this._publishingConsentGranted) {\n        console$1.log('publishing consent already granted');\n        return;\n      }\n\n      console$1.log('granting publishing consent and flushing pending requests');\n      this._publishingConsentGranted = true;\n      this._flushPendingRequests();\n    },\n    'revokePublishingConsent': function() {\n      if (!this._publishingConsentGranted) {\n        console$1.log('publishing consent already revoked');\n        return;\n      }\n\n      console$1.log('revoking publishing consent - future requests will be queued');\n      this._publishingConsentGranted = false;\n      // Clear pending requests when revoking consent\n      this._pendingRequests = [];\n      // Clear persisted queue as well\n      this._clearPersistedQueue();\n    },\n    'isPublishingConsentGranted': function() {\n      return this._publishingConsentGranted;\n    }\n  };\n}\n\n/*\n * Moesif Browser JS Library\n *\n * Copyright 2017, Moesif Inc. All Rights Reserved\n */\n\n// ==ClosureCompiler==\n// @compilation_level ADVANCED_OPTIMIZATIONS\n// @output_file_name moesif-1.0.min.js\n// ==/ClosureCompiler==\n\n/*\nSIMPLE STYLE GUIDE:\n\nthis.x === public function\nthis._x === internal - only use within this file\nthis.__x === private - only use within the class\n\nGlobals should be all caps\n*/\n\nvar init_type;       // MODULE or SNIPPET loader\nvar INIT_MODULE  = 0;\nfunction init_as_module() {\n  init_type = INIT_MODULE;\n  var instance = moesifCreator();\n  instance['new'] = moesifCreator;\n  return instance;\n}\n\nvar moesif = init_as_module();\n\nmodule.exports = moesif;"]}