diff --git a/README.md b/README.md index a94c563..00e5033 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,8 @@ new Elmahio({ logId: null, debug: false, application: null, - filter: null + filter: null, + captureConsoleMinimumLevel: 'none' }); ``` @@ -61,6 +62,29 @@ log.fatal(msg, error); ``` Where __msg__ is a text string and __error__ is a [JavaScript Error Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error). +### Manual logging using console logging +*Works only with UMD Constructor ! +console.log() is not available for logging !* +```javascript +var log = new Elmahio({ + apiKey: 'YOUR-API-KEY', + logId: 'YOUR-LOG-ID', + captureConsoleMinimumLevel: 'debug' // options available: 'none', 'debug', 'info', 'warn', 'error' +}); + +// captureConsoleMinimumLevel: 'none' will disable logging from console; +// captureConsoleMinimumLevel: 'debug' will enable all of them - console.debug, console.info, console.warn, console.error; +// captureConsoleMinimumLevel: 'info' will enable - console.info, console.warn, console.error; +// captureConsoleMinimumLevel: 'warn' will enable - console.warn, console.error; +// captureConsoleMinimumLevel: 'error' will enable - console.error. + +console.error('This is an %s message.', 'error'); +console.warn('This is a %s message.', 'warning'); +console.info('This is an %s message.', 'information'); +console.debug('This is a %s message.', 'debug'); +``` + + ### Acknowledgments -* [Rojan Gharibpour](https://github.com/Sojaner) \ No newline at end of file +* [Rojan Gharibpour](https://github.com/Sojaner) diff --git a/dist/elmahio.js b/dist/elmahio.js index 540546b..1299213 100644 --- a/dist/elmahio.js +++ b/dist/elmahio.js @@ -1,1449 +1,1757 @@ -/*! - * elmah.io Javascript Logger - version 3.2.0 - * (c) 2018-2020 elmah.io, Apache 2.0 License, https://elmah.io - */ -(function(root, factory) { - if (typeof define === 'function' && define.amd) { - define([], function() { - return factory(root); - }); - } else if (typeof exports === 'object') { - module.exports = factory(root); - } else { - root.Elmahio = factory(root); - } -})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, function(window) { - 'use strict'; - var StackFrame = (function() { - "use strict"; - - function _isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - function _capitalize(str) { - return str.charAt(0).toUpperCase() + str.substring(1); - } - - function _getter(p) { - return function() { - return this[p]; - }; - } - var booleanProps = ["isConstructor", "isEval", "isNative", "isToplevel"]; - var numericProps = ["columnNumber", "lineNumber"]; - var stringProps = ["fileName", "functionName", "source"]; - var arrayProps = ["args"]; - var props = booleanProps.concat(numericProps, stringProps, arrayProps); - - function StackFrame(obj) { - if (obj instanceof Object) { - for (var i = 0; i < props.length; i++) { - if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) { - this["set" + _capitalize(props[i])](obj[props[i]]); - } - } - } - } - StackFrame.prototype = { - getArgs: function() { - return this.args; - }, - setArgs: function(v) { - if (Object.prototype.toString.call(v) !== "[object Array]") { - throw new TypeError("Args must be an Array"); - } - this.args = v; - }, - getEvalOrigin: function() { - return this.evalOrigin; - }, - setEvalOrigin: function(v) { - if (v instanceof StackFrame) { - this.evalOrigin = v; - } else if (v instanceof Object) { - this.evalOrigin = new StackFrame(v); - } else { - throw new TypeError("Eval Origin must be an Object or StackFrame"); - } - }, - toString: function() { - var functionName = this.getFunctionName() || "{anonymous}"; - var args = "(" + (this.getArgs() || []).join(",") + ")"; - var fileName = this.getFileName() ? "@" + this.getFileName() : ""; - var lineNumber = _isNumber(this.getLineNumber()) ? ":" + this.getLineNumber() : ""; - var columnNumber = _isNumber(this.getColumnNumber()) ? ":" + this.getColumnNumber() : ""; - return functionName + args + fileName + lineNumber + columnNumber; - } - }; - StackFrame.fromString = function StackFrame$$fromString(str) { - var argsStartIndex = str.indexOf("("); - var argsEndIndex = str.lastIndexOf(")"); - var functionName = str.substring(0, argsStartIndex); - var args = str.substring(argsStartIndex + 1, argsEndIndex).split(","); - var locationString = str.substring(argsEndIndex + 1); - if (locationString.indexOf("@") === 0) { - var parts = /@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(locationString, ""); - var fileName = parts[1]; - var lineNumber = parts[2]; - var columnNumber = parts[3]; - } - return new StackFrame({ - functionName: functionName, - args: args || undefined, - fileName: fileName, - lineNumber: lineNumber || undefined, - columnNumber: columnNumber || undefined - }); - }; - for (var i = 0; i < booleanProps.length; i++) { - StackFrame.prototype["get" + _capitalize(booleanProps[i])] = _getter(booleanProps[i]); - StackFrame.prototype["set" + _capitalize(booleanProps[i])] = function(p) { - return function(v) { - this[p] = Boolean(v); - }; - }(booleanProps[i]); - } - for (var j = 0; j < numericProps.length; j++) { - StackFrame.prototype["get" + _capitalize(numericProps[j])] = _getter(numericProps[j]); - StackFrame.prototype["set" + _capitalize(numericProps[j])] = function(p) { - return function(v) { - if (!_isNumber(v)) { - throw new TypeError(p + " must be a Number"); - } - this[p] = Number(v); - }; - }(numericProps[j]); - } - for (var k = 0; k < stringProps.length; k++) { - StackFrame.prototype["get" + _capitalize(stringProps[k])] = _getter(stringProps[k]); - StackFrame.prototype["set" + _capitalize(stringProps[k])] = function(p) { - return function(v) { - this[p] = String(v); - }; - }(stringProps[k]); - } - return StackFrame; - })(); - var ErrorStackParser = (function() { - "use strict"; - var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\S+\:\d+/; - var CHROME_IE_STACK_REGEXP = /^\s*at .*(\S+\:\d+|\(native\))/m; - var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\[native code\])?$/; - return { - parse: function ErrorStackParser$$parse(error) { - if (typeof error.stacktrace !== "undefined" || typeof error["opera#sourceloc"] !== "undefined") { - return this.parseOpera(error); - } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) { - return this.parseV8OrIE(error); - } else if (error.stack) { - return this.parseFFOrSafari(error); - } else { - throw new Error("Cannot parse given Error object"); - } - }, - extractLocation: function ErrorStackParser$$extractLocation(urlLike) { - if (urlLike.indexOf(":") === -1) { - return [urlLike]; - } - var regExp = /(.+?)(?:\:(\d+))?(?:\:(\d+))?$/; - var parts = regExp.exec(urlLike.replace(/[\(\)]/g, "")); - return [parts[1], parts[2] || undefined, parts[3] || undefined]; - }, - parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) { - var filtered = error.stack.split("\n").filter(function(line) { - return !!line.match(CHROME_IE_STACK_REGEXP); - }, this); - return filtered.map(function(line) { - if (line.indexOf("(eval ") > -1) { - line = line.replace(/eval code/g, "eval").replace(/(\(eval at [^\()]*)|(\)\,.*$)/g, ""); - } - var tokens = line.replace(/^\s+/, "").replace(/\(eval code/g, "(").split(/\s+/).slice(1); - var locationParts = this.extractLocation(tokens.pop()); - var functionName = tokens.join(" ") || undefined; - var fileName = ["eval", ""].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0]; - return new StackFrame({ - functionName: functionName, - fileName: fileName, - lineNumber: locationParts[1], - columnNumber: locationParts[2], - source: line - }); - }, this); - }, - parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) { - var filtered = error.stack.split("\n").filter(function(line) { - return !line.match(SAFARI_NATIVE_CODE_REGEXP); - }, this); - return filtered.map(function(line) { - if (line.indexOf(" > eval") > -1) { - line = line.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g, ":$1"); - } - if (line.indexOf("@") === -1 && line.indexOf(":") === -1) { - return new StackFrame({ - functionName: line - }); - } else { - var functionNameRegex = /((.*".+"[^@]*)?[^@]*)(?:@)/; - var matches = line.match(functionNameRegex); - var functionName = matches && matches[1] ? matches[1] : undefined; - var locationParts = this.extractLocation(line.replace(functionNameRegex, "")); - return new StackFrame({ - functionName: functionName, - fileName: locationParts[0], - lineNumber: locationParts[1], - columnNumber: locationParts[2], - source: line - }); - } - }, this); - }, - parseOpera: function ErrorStackParser$$parseOpera(e) { - if (!e.stacktrace || e.message.indexOf("\n") > -1 && e.message.split("\n").length > e.stacktrace.split("\n").length) { - return this.parseOpera9(e); - } else if (!e.stack) { - return this.parseOpera10(e); - } else { - return this.parseOpera11(e); - } - }, - parseOpera9: function ErrorStackParser$$parseOpera9(e) { - var lineRE = /Line (\d+).*script (?:in )?(\S+)/i; - var lines = e.message.split("\n"); - var result = []; - for (var i = 2, len = lines.length; i < len; i += 2) { - var match = lineRE.exec(lines[i]); - if (match) { - result.push(new StackFrame({ - fileName: match[2], - lineNumber: match[1], - source: lines[i] - })); - } - } - return result; - }, - parseOpera10: function ErrorStackParser$$parseOpera10(e) { - var lineRE = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i; - var lines = e.stacktrace.split("\n"); - var result = []; - for (var i = 0, len = lines.length; i < len; i += 2) { - var match = lineRE.exec(lines[i]); - if (match) { - result.push(new StackFrame({ - functionName: match[3] || undefined, - fileName: match[2], - lineNumber: match[1], - source: lines[i] - })); - } - } - return result; - }, - parseOpera11: function ErrorStackParser$$parseOpera11(error) { - var filtered = error.stack.split("\n").filter(function(line) { - return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/); - }, this); - return filtered.map(function(line) { - var tokens = line.split("@"); - var locationParts = this.extractLocation(tokens.pop()); - var functionCall = tokens.shift() || ""; - var functionName = functionCall.replace(//, "$2").replace(/\([^\)]*\)/g, "") || undefined; - var argsRaw; - if (functionCall.match(/\(([^\)]*)\)/)) { - argsRaw = functionCall.replace(/^[^\(]+\(([^\)]*)\)$/, "$1"); - } - var args = argsRaw === undefined || argsRaw === "[arguments not available]" ? undefined : argsRaw.split(","); - return new StackFrame({ - functionName: functionName, - args: args, - fileName: locationParts[0], - lineNumber: locationParts[1], - columnNumber: locationParts[2], - source: line - }); - }, this); - } - }; - })(); - var SourceMap = function(e) { - var n = {}; - - function r(t) { - if (n[t]) return n[t].exports; - var o = n[t] = { - exports: {}, - id: t, - loaded: !1 - }; - return e[t].call(o.exports, o, o.exports, r), o.loaded = !0, o.exports - } - return r.m = e, r.c = n, r.p = "", r(0) - }([function(e, n, r) { - var t = r(1), - o = r(2), - i = r(3).ArraySet, - a = r(4), - s = r(6).quickSort; - - function u(e) { - var n = e; - return "string" == typeof e && (n = JSON.parse(e.replace(/^\)\]\}'/, ""))), null != n.sections ? new c(n) : new l(n) - } - - function l(e) { - var n = e; - "string" == typeof e && (n = JSON.parse(e.replace(/^\)\]\}'/, ""))); - var r = t.getArg(n, "version"), - o = t.getArg(n, "sources"), - a = t.getArg(n, "names", []), - s = t.getArg(n, "sourceRoot", null), - u = t.getArg(n, "sourcesContent", null), - l = t.getArg(n, "mappings"), - g = t.getArg(n, "file", null); - if (r != this._version) throw new Error("Unsupported version: " + r); - o = o.map(String).map(t.normalize).map(function(e) { - return s && t.isAbsolute(s) && t.isAbsolute(e) ? t.relative(s, e) : e - }), this._names = i.fromArray(a.map(String), !0), this._sources = i.fromArray(o, !0), this.sourceRoot = s, this.sourcesContent = u, this._mappings = l, this.file = g - } - - function g() { - this.generatedLine = 0, this.generatedColumn = 0, this.source = null, this.originalLine = null, this.originalColumn = null, this.name = null - } - - function c(e) { - var n = e; - "string" == typeof e && (n = JSON.parse(e.replace(/^\)\]\}'/, ""))); - var r = t.getArg(n, "version"), - o = t.getArg(n, "sections"); - if (r != this._version) throw new Error("Unsupported version: " + r); - this._sources = new i, this._names = new i; - var a = { - line: -1, - column: 0 - }; - this._sections = o.map(function(e) { - if (e.url) throw new Error("Support for url field in sections not implemented."); - var n = t.getArg(e, "offset"), - r = t.getArg(n, "line"), - o = t.getArg(n, "column"); - if (r < a.line || r === a.line && o < a.column) throw new Error("Section offsets must be ordered and non-overlapping."); - return a = n, { - generatedOffset: { - generatedLine: r + 1, - generatedColumn: o + 1 - }, - consumer: new u(t.getArg(e, "map")) - } - }) - } - u.fromSourceMap = function(e) { - return l.fromSourceMap(e) - }, u.prototype._version = 3, u.prototype.__generatedMappings = null, Object.defineProperty(u.prototype, "_generatedMappings", { - get: function() { - return this.__generatedMappings || this._parseMappings(this._mappings, this.sourceRoot), this.__generatedMappings - } - }), u.prototype.__originalMappings = null, Object.defineProperty(u.prototype, "_originalMappings", { - get: function() { - return this.__originalMappings || this._parseMappings(this._mappings, this.sourceRoot), this.__originalMappings - } - }), u.prototype._charIsMappingSeparator = function(e, n) { - var r = e.charAt(n); - return ";" === r || "," === r - }, u.prototype._parseMappings = function(e, n) { - throw new Error("Subclasses must implement _parseMappings") - }, u.GENERATED_ORDER = 1, u.ORIGINAL_ORDER = 2, u.GREATEST_LOWER_BOUND = 1, u.LEAST_UPPER_BOUND = 2, u.prototype.eachMapping = function(e, n, r) { - var o, i = n || null; - switch (r || u.GENERATED_ORDER) { - case u.GENERATED_ORDER: - o = this._generatedMappings; - break; - case u.ORIGINAL_ORDER: - o = this._originalMappings; - break; - default: - throw new Error("Unknown order of iteration.") - } - var a = this.sourceRoot; - o.map(function(e) { - var n = null === e.source ? null : this._sources.at(e.source); - return null != n && null != a && (n = t.join(a, n)), { - source: n, - generatedLine: e.generatedLine, - generatedColumn: e.generatedColumn, - originalLine: e.originalLine, - originalColumn: e.originalColumn, - name: null === e.name ? null : this._names.at(e.name) - } - }, this).forEach(e, i) - }, u.prototype.allGeneratedPositionsFor = function(e) { - var n = t.getArg(e, "line"), - r = { - source: t.getArg(e, "source"), - originalLine: n, - originalColumn: t.getArg(e, "column", 0) - }; - if (null != this.sourceRoot && (r.source = t.relative(this.sourceRoot, r.source)), !this._sources.has(r.source)) return []; - r.source = this._sources.indexOf(r.source); - var i = [], - a = this._findMapping(r, this._originalMappings, "originalLine", "originalColumn", t.compareByOriginalPositions, o.LEAST_UPPER_BOUND); - if (a >= 0) { - var s = this._originalMappings[a]; - if (void 0 === e.column) - for (var u = s.originalLine; s && s.originalLine === u;) i.push({ - line: t.getArg(s, "generatedLine", null), - column: t.getArg(s, "generatedColumn", null), - lastColumn: t.getArg(s, "lastGeneratedColumn", null) - }), s = this._originalMappings[++a]; - else - for (var l = s.originalColumn; s && s.originalLine === n && s.originalColumn == l;) i.push({ - line: t.getArg(s, "generatedLine", null), - column: t.getArg(s, "generatedColumn", null), - lastColumn: t.getArg(s, "lastGeneratedColumn", null) - }), s = this._originalMappings[++a] - } - return i - }, n.SourceMapConsumer = u, l.prototype = Object.create(u.prototype), l.prototype.consumer = u, l.fromSourceMap = function(e) { - var n = Object.create(l.prototype), - r = n._names = i.fromArray(e._names.toArray(), !0), - o = n._sources = i.fromArray(e._sources.toArray(), !0); - n.sourceRoot = e._sourceRoot, n.sourcesContent = e._generateSourcesContent(n._sources.toArray(), n.sourceRoot), n.file = e._file; - for (var a = e._mappings.toArray().slice(), u = n.__generatedMappings = [], c = n.__originalMappings = [], p = 0, h = a.length; p < h; p++) { - var f = a[p], - d = new g; - d.generatedLine = f.generatedLine, d.generatedColumn = f.generatedColumn, f.source && (d.source = o.indexOf(f.source), d.originalLine = f.originalLine, d.originalColumn = f.originalColumn, f.name && (d.name = r.indexOf(f.name)), c.push(d)), u.push(d) - } - return s(n.__originalMappings, t.compareByOriginalPositions), n - }, l.prototype._version = 3, Object.defineProperty(l.prototype, "sources", { - get: function() { - return this._sources.toArray().map(function(e) { - return null != this.sourceRoot ? t.join(this.sourceRoot, e) : e - }, this) - } - }), l.prototype._parseMappings = function(e, n) { - for (var r, o, i, u, l, c = 1, p = 0, h = 0, f = 0, d = 0, m = 0, _ = e.length, v = 0, C = {}, A = {}, y = [], L = []; v < _;) - if (";" === e.charAt(v)) c++, v++, p = 0; - else if ("," === e.charAt(v)) v++; - else { - for ((r = new g).generatedLine = c, u = v; u < _ && !this._charIsMappingSeparator(e, u); u++); - if (i = C[o = e.slice(v, u)]) v += o.length; - else { - for (i = []; v < u;) a.decode(e, v, A), l = A.value, v = A.rest, i.push(l); - if (2 === i.length) throw new Error("Found a source, but no line and column"); - if (3 === i.length) throw new Error("Found a source and line, but no column"); - C[o] = i - } - r.generatedColumn = p + i[0], p = r.generatedColumn, i.length > 1 && (r.source = d + i[1], d += i[1], r.originalLine = h + i[2], h = r.originalLine, r.originalLine += 1, r.originalColumn = f + i[3], f = r.originalColumn, i.length > 4 && (r.name = m + i[4], m += i[4])), L.push(r), "number" == typeof r.originalLine && y.push(r) - } - s(L, t.compareByGeneratedPositionsDeflated), this.__generatedMappings = L, s(y, t.compareByOriginalPositions), this.__originalMappings = y - }, l.prototype._findMapping = function(e, n, r, t, i, a) { - if (e[r] <= 0) throw new TypeError("Line must be greater than or equal to 1, got " + e[r]); - if (e[t] < 0) throw new TypeError("Column must be greater than or equal to 0, got " + e[t]); - return o.search(e, n, i, a) - }, l.prototype.computeColumnSpans = function() { - for (var e = 0; e < this._generatedMappings.length; ++e) { - var n = this._generatedMappings[e]; - if (e + 1 < this._generatedMappings.length) { - var r = this._generatedMappings[e + 1]; - if (n.generatedLine === r.generatedLine) { - n.lastGeneratedColumn = r.generatedColumn - 1; - continue - } - } - n.lastGeneratedColumn = 1 / 0 - } - }, l.prototype.originalPositionFor = function(e) { - var n = { - generatedLine: t.getArg(e, "line"), - generatedColumn: t.getArg(e, "column") - }, - r = this._findMapping(n, this._generatedMappings, "generatedLine", "generatedColumn", t.compareByGeneratedPositionsDeflated, t.getArg(e, "bias", u.GREATEST_LOWER_BOUND)); - if (r >= 0) { - var o = this._generatedMappings[r]; - if (o.generatedLine === n.generatedLine) { - var i = t.getArg(o, "source", null); - null !== i && (i = this._sources.at(i), null != this.sourceRoot && (i = t.join(this.sourceRoot, i))); - var a = t.getArg(o, "name", null); - return null !== a && (a = this._names.at(a)), { - source: i, - line: t.getArg(o, "originalLine", null), - column: t.getArg(o, "originalColumn", null), - name: a - } - } - } - return { - source: null, - line: null, - column: null, - name: null - } - }, l.prototype.hasContentsOfAllSources = function() { - return !!this.sourcesContent && (this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function(e) { - return null == e - })) - }, l.prototype.sourceContentFor = function(e, n) { - if (!this.sourcesContent) return null; - if (null != this.sourceRoot && (e = t.relative(this.sourceRoot, e)), this._sources.has(e)) return this.sourcesContent[this._sources.indexOf(e)]; - var r; - if (null != this.sourceRoot && (r = t.urlParse(this.sourceRoot))) { - var o = e.replace(/^file:\/\//, ""); - if ("file" == r.scheme && this._sources.has(o)) return this.sourcesContent[this._sources.indexOf(o)]; - if ((!r.path || "/" == r.path) && this._sources.has("/" + e)) return this.sourcesContent[this._sources.indexOf("/" + e)] - } - if (n) return null; - throw new Error('"' + e + '" is not in the SourceMap.') - }, l.prototype.generatedPositionFor = function(e) { - var n = t.getArg(e, "source"); - if (null != this.sourceRoot && (n = t.relative(this.sourceRoot, n)), !this._sources.has(n)) return { - line: null, - column: null, - lastColumn: null - }; - var r = { - source: n = this._sources.indexOf(n), - originalLine: t.getArg(e, "line"), - originalColumn: t.getArg(e, "column") - }, - o = this._findMapping(r, this._originalMappings, "originalLine", "originalColumn", t.compareByOriginalPositions, t.getArg(e, "bias", u.GREATEST_LOWER_BOUND)); - if (o >= 0) { - var i = this._originalMappings[o]; - if (i.source === r.source) return { - line: t.getArg(i, "generatedLine", null), - column: t.getArg(i, "generatedColumn", null), - lastColumn: t.getArg(i, "lastGeneratedColumn", null) - } - } - return { - line: null, - column: null, - lastColumn: null - } - }, n.BasicSourceMapConsumer = l, c.prototype = Object.create(u.prototype), c.prototype.constructor = u, c.prototype._version = 3, Object.defineProperty(c.prototype, "sources", { - get: function() { - for (var e = [], n = 0; n < this._sections.length; n++) - for (var r = 0; r < this._sections[n].consumer.sources.length; r++) e.push(this._sections[n].consumer.sources[r]); - return e - } - }), c.prototype.originalPositionFor = function(e) { - var n = { - generatedLine: t.getArg(e, "line"), - generatedColumn: t.getArg(e, "column") - }, - r = o.search(n, this._sections, function(e, n) { - var r = e.generatedLine - n.generatedOffset.generatedLine; - return r || e.generatedColumn - n.generatedOffset.generatedColumn - }), - i = this._sections[r]; - return i ? i.consumer.originalPositionFor({ - line: n.generatedLine - (i.generatedOffset.generatedLine - 1), - column: n.generatedColumn - (i.generatedOffset.generatedLine === n.generatedLine ? i.generatedOffset.generatedColumn - 1 : 0), - bias: e.bias - }) : { - source: null, - line: null, - column: null, - name: null - } - }, c.prototype.hasContentsOfAllSources = function() { - return this._sections.every(function(e) { - return e.consumer.hasContentsOfAllSources() - }) - }, c.prototype.sourceContentFor = function(e, n) { - for (var r = 0; r < this._sections.length; r++) { - var t = this._sections[r].consumer.sourceContentFor(e, !0); - if (t) return t - } - if (n) return null; - throw new Error('"' + e + '" is not in the SourceMap.') - }, c.prototype.generatedPositionFor = function(e) { - for (var n = 0; n < this._sections.length; n++) { - var r = this._sections[n]; - if (-1 !== r.consumer.sources.indexOf(t.getArg(e, "source"))) { - var o = r.consumer.generatedPositionFor(e); - if (o) return { - line: o.line + (r.generatedOffset.generatedLine - 1), - column: o.column + (r.generatedOffset.generatedLine === o.line ? r.generatedOffset.generatedColumn - 1 : 0) - } - } - } - return { - line: null, - column: null - } - }, c.prototype._parseMappings = function(e, n) { - this.__generatedMappings = [], this.__originalMappings = []; - for (var r = 0; r < this._sections.length; r++) - for (var o = this._sections[r], i = o.consumer._generatedMappings, a = 0; a < i.length; a++) { - var u = i[a], - l = o.consumer._sources.at(u.source); - null !== o.consumer.sourceRoot && (l = t.join(o.consumer.sourceRoot, l)), this._sources.add(l), l = this._sources.indexOf(l); - var g = o.consumer._names.at(u.name); - this._names.add(g), g = this._names.indexOf(g); - var c = { - source: l, - generatedLine: u.generatedLine + (o.generatedOffset.generatedLine - 1), - generatedColumn: u.generatedColumn + (o.generatedOffset.generatedLine === u.generatedLine ? o.generatedOffset.generatedColumn - 1 : 0), - originalLine: u.originalLine, - originalColumn: u.originalColumn, - name: g - }; - this.__generatedMappings.push(c), "number" == typeof c.originalLine && this.__originalMappings.push(c) - } - s(this.__generatedMappings, t.compareByGeneratedPositionsDeflated), s(this.__originalMappings, t.compareByOriginalPositions) - }, n.IndexedSourceMapConsumer = c - }, function(e, n) { - n.getArg = function(e, n, r) { - if (n in e) return e[n]; - if (3 === arguments.length) return r; - throw new Error('"' + n + '" is a required argument.') - }; - var r = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/, - t = /^data:.+\,.+$/; - - function o(e) { - var n = e.match(r); - return n ? { - scheme: n[1], - auth: n[2], - host: n[3], - port: n[4], - path: n[5] - } : null - } - - function i(e) { - var n = ""; - return e.scheme && (n += e.scheme + ":"), n += "//", e.auth && (n += e.auth + "@"), e.host && (n += e.host), e.port && (n += ":" + e.port), e.path && (n += e.path), n - } - - function a(e) { - var r = e, - t = o(e); - if (t) { - if (!t.path) return e; - r = t.path - } - for (var a, s = n.isAbsolute(r), u = r.split(/\/+/), l = 0, g = u.length - 1; g >= 0; g--) "." === (a = u[g]) ? u.splice(g, 1) : ".." === a ? l++ : l > 0 && ("" === a ? (u.splice(g + 1, l), l = 0) : (u.splice(g, 2), l--)); - return "" === (r = u.join("/")) && (r = s ? "/" : "."), t ? (t.path = r, i(t)) : r - } - n.urlParse = o, n.urlGenerate = i, n.normalize = a, n.join = function(e, n) { - "" === e && (e = "."), "" === n && (n = "."); - var r = o(n), - s = o(e); - if (s && (e = s.path || "/"), r && !r.scheme) return s && (r.scheme = s.scheme), i(r); - if (r || n.match(t)) return n; - if (s && !s.host && !s.path) return s.host = n, i(s); - var u = "/" === n.charAt(0) ? n : a(e.replace(/\/+$/, "") + "/" + n); - return s ? (s.path = u, i(s)) : u - }, n.isAbsolute = function(e) { - return "/" === e.charAt(0) || !!e.match(r) - }, n.relative = function(e, n) { - "" === e && (e = "."), e = e.replace(/\/$/, ""); - for (var r = 0; 0 !== n.indexOf(e + "/");) { - var t = e.lastIndexOf("/"); - if (t < 0) return n; - if ((e = e.slice(0, t)).match(/^([^\/]+:\/)?\/*$/)) return n; - ++r - } - return Array(r + 1).join("../") + n.substr(e.length + 1) - }; - var s = !("__proto__" in Object.create(null)); - - function u(e) { - return e - } - - function l(e) { - if (!e) return !1; - var n = e.length; - if (n < 9) return !1; - if (95 !== e.charCodeAt(n - 1) || 95 !== e.charCodeAt(n - 2) || 111 !== e.charCodeAt(n - 3) || 116 !== e.charCodeAt(n - 4) || 111 !== e.charCodeAt(n - 5) || 114 !== e.charCodeAt(n - 6) || 112 !== e.charCodeAt(n - 7) || 95 !== e.charCodeAt(n - 8) || 95 !== e.charCodeAt(n - 9)) return !1; - for (var r = n - 10; r >= 0; r--) - if (36 !== e.charCodeAt(r)) return !1; - return !0 - } - - function g(e, n) { - return e === n ? 0 : e > n ? 1 : -1 - } - n.toSetString = s ? u : function(e) { - return l(e) ? "$" + e : e - }, n.fromSetString = s ? u : function(e) { - return l(e) ? e.slice(1) : e - }, n.compareByOriginalPositions = function(e, n, r) { - var t = e.source - n.source; - return 0 !== t ? t : 0 != (t = e.originalLine - n.originalLine) ? t : 0 != (t = e.originalColumn - n.originalColumn) || r ? t : 0 != (t = e.generatedColumn - n.generatedColumn) ? t : 0 != (t = e.generatedLine - n.generatedLine) ? t : e.name - n.name - }, n.compareByGeneratedPositionsDeflated = function(e, n, r) { - var t = e.generatedLine - n.generatedLine; - return 0 !== t ? t : 0 != (t = e.generatedColumn - n.generatedColumn) || r ? t : 0 != (t = e.source - n.source) ? t : 0 != (t = e.originalLine - n.originalLine) ? t : 0 != (t = e.originalColumn - n.originalColumn) ? t : e.name - n.name - }, n.compareByGeneratedPositionsInflated = function(e, n) { - var r = e.generatedLine - n.generatedLine; - return 0 !== r ? r : 0 != (r = e.generatedColumn - n.generatedColumn) ? r : 0 !== (r = g(e.source, n.source)) ? r : 0 != (r = e.originalLine - n.originalLine) ? r : 0 != (r = e.originalColumn - n.originalColumn) ? r : g(e.name, n.name) - } - }, function(e, n) { - n.GREATEST_LOWER_BOUND = 1, n.LEAST_UPPER_BOUND = 2, n.search = function(e, r, t, o) { - if (0 === r.length) return -1; - var i = function e(r, t, o, i, a, s) { - var u = Math.floor((t - r) / 2) + r, - l = a(o, i[u], !0); - return 0 === l ? u : l > 0 ? t - u > 1 ? e(u, t, o, i, a, s) : s == n.LEAST_UPPER_BOUND ? t < i.length ? t : -1 : u : u - r > 1 ? e(r, u, o, i, a, s) : s == n.LEAST_UPPER_BOUND ? u : r < 0 ? -1 : r - }(-1, r.length, e, r, t, o || n.GREATEST_LOWER_BOUND); - if (i < 0) return -1; - for (; i - 1 >= 0 && 0 === t(r[i], r[i - 1], !0);) --i; - return i - } - }, function(e, n, r) { - var t = r(1), - o = Object.prototype.hasOwnProperty; - - function i() { - this._array = [], this._set = Object.create(null) - } - i.fromArray = function(e, n) { - for (var r = new i, t = 0, o = e.length; t < o; t++) r.add(e[t], n); - return r - }, i.prototype.size = function() { - return Object.getOwnPropertyNames(this._set).length - }, i.prototype.add = function(e, n) { - var r = t.toSetString(e), - i = o.call(this._set, r), - a = this._array.length; - i && !n || this._array.push(e), i || (this._set[r] = a) - }, i.prototype.has = function(e) { - var n = t.toSetString(e); - return o.call(this._set, n) - }, i.prototype.indexOf = function(e) { - var n = t.toSetString(e); - if (o.call(this._set, n)) return this._set[n]; - throw new Error('"' + e + '" is not in the set.') - }, i.prototype.at = function(e) { - if (e >= 0 && e < this._array.length) return this._array[e]; - throw new Error("No element indexed by " + e) - }, i.prototype.toArray = function() { - return this._array.slice() - }, n.ArraySet = i - }, function(e, n, r) { - var t = r(5); - n.encode = function(e) { - var n, r, o = "", - i = (r = e) < 0 ? 1 + (-r << 1) : 0 + (r << 1); - do { - n = 31 & i, (i >>>= 5) > 0 && (n |= 32), o += t.encode(n) - } while (i > 0); - return o - }, n.decode = function(e, n, r) { - var o, i, a, s, u = e.length, - l = 0, - g = 0; - do { - if (n >= u) throw new Error("Expected more digits in base 64 VLQ value."); - if (-1 === (i = t.decode(e.charCodeAt(n++)))) throw new Error("Invalid base64 digit: " + e.charAt(n - 1)); - o = !!(32 & i), l += (i &= 31) << g, g += 5 - } while (o); - r.value = (s = (a = l) >> 1, 1 == (1 & a) ? -s : s), r.rest = n - } - }, function(e, n) { - var r = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); - n.encode = function(e) { - if (0 <= e && e < r.length) return r[e]; - throw new TypeError("Must be between 0 and 63: " + e) - }, n.decode = function(e) { - return 65 <= e && e <= 90 ? e - 65 : 97 <= e && e <= 122 ? e - 97 + 26 : 48 <= e && e <= 57 ? e - 48 + 52 : 43 == e ? 62 : 47 == e ? 63 : -1 - } - }, function(e, n) { - function r(e, n, r) { - var t = e[n]; - e[n] = e[r], e[r] = t - } - - function t(e, n, o, i) { - if (o < i) { - var a = o - 1; - r(e, (g = o, c = i, Math.round(g + Math.random() * (c - g))), i); - for (var s = e[i], u = o; u < i; u++) n(e[u], s) <= 0 && r(e, a += 1, u); - r(e, a + 1, u); - var l = a + 1; - t(e, n, o, l - 1), t(e, n, l + 1, i) - } - var g, c - } - n.quickSort = function(e, n) { - t(e, n, 0, e.length - 1) - } - }]); - var StackTraceGPS = (function(SourceMap, StackFrame) { - "use strict"; - - function _xdr(url) { - return new Promise(function(resolve, reject) { - var req = new XMLHttpRequest(); - req.open("get", url); - req.onerror = reject; - req.onreadystatechange = function onreadystatechange() { - if (req.readyState === 4) { - if (req.status >= 200 && req.status < 300 || url.substr(0, 7) === "file://" && req.responseText) { - resolve(req.responseText); - } else { - reject(new Error("HTTP status: " + req.status + " retrieving " + url)); - } - } - }; - req.send(); - }); - } - - function _atob(b64str) { - if (typeof window !== "undefined" && window.atob) { - return window.atob(b64str); - } else { - throw new Error("You must supply a polyfill for window.atob in this environment"); - } - } - - function _parseJson(string) { - if (typeof JSON !== "undefined" && JSON.parse) { - return JSON.parse(string); - } else { - throw new Error("You must supply a polyfill for JSON.parse in this environment"); - } - } - - function _findFunctionName(source, lineNumber) { - var syntaxes = [/['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*function\b/, /function\s+([^('"`]*?)\s*\(([^)]*)\)/, /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*(?:eval|new Function)\b/, /\b(?!(?:if|for|switch|while|with|catch)\b)(?:(?:static)\s+)?(\S+)\s*\(.*?\)\s*\{/, /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*\(.*?\)\s*=>/]; - var lines = source.split("\n"); - var code = ""; - var maxLines = Math.min(lineNumber, 20); - for (var i = 0; i < maxLines; ++i) { - var line = lines[lineNumber - i - 1]; - var commentPos = line.indexOf("//"); - if (commentPos >= 0) { - line = line.substr(0, commentPos); - } - if (line) { - code = line + code; - var len = syntaxes.length; - for (var index = 0; index < len; index++) { - var m = syntaxes[index].exec(code); - if (m && m[1]) { - return m[1]; - } - } - } - } - return undefined; - } - - function _ensureSupportedEnvironment() { - if (typeof Object.defineProperty !== "function" || typeof Object.create !== "function") { - throw new Error("Unable to consume source maps in older browsers"); - } - } - - function _ensureStackFrameIsLegit(stackframe) { - if (typeof stackframe !== "object") { - throw new TypeError("Given StackFrame is not an object"); - } else if (typeof stackframe.fileName !== "string") { - throw new TypeError("Given file name is not a String"); - } else if (typeof stackframe.lineNumber !== "number" || stackframe.lineNumber % 1 !== 0 || stackframe.lineNumber < 1) { - throw new TypeError("Given line number must be a positive integer"); - } else if (typeof stackframe.columnNumber !== "number" || stackframe.columnNumber % 1 !== 0 || stackframe.columnNumber < 0) { - throw new TypeError("Given column number must be a non-negative integer"); - } - return true; - } - - function _findSourceMappingURL(source) { - var sourceMappingUrlRegExp = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/gm; - var lastSourceMappingUrl; - var matchSourceMappingUrl; - while (matchSourceMappingUrl = sourceMappingUrlRegExp.exec(source)) { - lastSourceMappingUrl = matchSourceMappingUrl[1]; - } - if (lastSourceMappingUrl) { - return lastSourceMappingUrl; - } else { - throw new Error("sourceMappingURL not found"); - } - } - - function _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache) { - return new Promise(function(resolve, reject) { - var loc = sourceMapConsumer.originalPositionFor({ - line: stackframe.lineNumber, - column: stackframe.columnNumber - }); - if (loc.source) { - var mappedSource = sourceMapConsumer.sourceContentFor(loc.source); - if (mappedSource) { - sourceCache[loc.source] = mappedSource; - } - resolve(new StackFrame({ - functionName: loc.name || stackframe.functionName, - args: stackframe.args, - fileName: loc.source, - lineNumber: loc.line, - columnNumber: loc.column - })); - } else { - reject(new Error("Could not get original source for given stackframe and source map")); - } - }); - } - return function StackTraceGPS(opts) { - if (!(this instanceof StackTraceGPS)) { - return new StackTraceGPS(opts); - } - opts = opts || {}; - this.sourceCache = opts.sourceCache || {}; - this.sourceMapConsumerCache = opts.sourceMapConsumerCache || {}; - this.ajax = opts.ajax || _xdr; - this._atob = opts.atob || _atob; - this._get = function _get(location) { - return new Promise(function(resolve, reject) { - var isDataUrl = location.substr(0, 5) === "data:"; - if (this.sourceCache[location]) { - resolve(this.sourceCache[location]); - } else if (opts.offline && !isDataUrl) { - reject(new Error("Cannot make network requests in offline mode")); - } else { - if (isDataUrl) { - var supportedEncodingRegexp = /^data:application\/json;([\w=:"-]+;)*base64,/; - var match = location.match(supportedEncodingRegexp); - if (match) { - var sourceMapStart = match[0].length; - var encodedSource = location.substr(sourceMapStart); - var source = this._atob(encodedSource); - this.sourceCache[location] = source; - resolve(source); - } else { - reject(new Error("The encoding of the inline sourcemap is not supported")); - } - } else { - var xhrPromise = this.ajax(location, { - method: "get" - }); - this.sourceCache[location] = xhrPromise; - xhrPromise.then(resolve, reject); - } - } - }.bind(this)); - }; - this._getSourceMapConsumer = function _getSourceMapConsumer(sourceMappingURL, defaultSourceRoot) { - return new Promise(function(resolve, reject) { - if (this.sourceMapConsumerCache[sourceMappingURL]) { - resolve(this.sourceMapConsumerCache[sourceMappingURL]); - } else { - var sourceMapConsumerPromise = new Promise(function(resolve, reject) { - return this._get(sourceMappingURL).then(function(sourceMapSource) { - if (typeof sourceMapSource === "string") { - sourceMapSource = _parseJson(sourceMapSource.replace(/^\)\]\}'/, "")); - } - if (typeof sourceMapSource.sourceRoot === "undefined") { - sourceMapSource.sourceRoot = defaultSourceRoot; - } - resolve(new SourceMap.SourceMapConsumer(sourceMapSource)); - }, reject); - }.bind(this)); - this.sourceMapConsumerCache[sourceMappingURL] = sourceMapConsumerPromise; - resolve(sourceMapConsumerPromise); - } - }.bind(this)); - }; - this.pinpoint = function StackTraceGPS$$pinpoint(stackframe) { - return new Promise(function(resolve, reject) { - this.getMappedLocation(stackframe).then(function(mappedStackFrame) { - function resolveMappedStackFrame() { - resolve(mappedStackFrame); - } - this.findFunctionName(mappedStackFrame).then(resolve, resolveMappedStackFrame)["catch"](resolveMappedStackFrame); - }.bind(this), reject); - }.bind(this)); - }; - this.findFunctionName = function StackTraceGPS$$findFunctionName(stackframe) { - return new Promise(function(resolve, reject) { - _ensureStackFrameIsLegit(stackframe); - this._get(stackframe.fileName).then(function getSourceCallback(source) { - var lineNumber = stackframe.lineNumber; - var columnNumber = stackframe.columnNumber; - var guessedFunctionName = _findFunctionName(source, lineNumber, columnNumber); - if (guessedFunctionName) { - resolve(new StackFrame({ - functionName: guessedFunctionName, - args: stackframe.args, - fileName: stackframe.fileName, - lineNumber: lineNumber, - columnNumber: columnNumber - })); - } else { - resolve(stackframe); - } - }, reject)["catch"](reject); - }.bind(this)); - }; - this.getMappedLocation = function StackTraceGPS$$getMappedLocation(stackframe) { - return new Promise(function(resolve, reject) { - _ensureSupportedEnvironment(); - _ensureStackFrameIsLegit(stackframe); - var sourceCache = this.sourceCache; - var fileName = stackframe.fileName; - this._get(fileName).then(function(source) { - var sourceMappingURL = _findSourceMappingURL(source); - var isDataUrl = sourceMappingURL.substr(0, 5) === "data:"; - var defaultSourceRoot = fileName.substring(0, fileName.lastIndexOf("/") + 1); - if (sourceMappingURL[0] !== "/" && !isDataUrl && !/^https?:\/\/|^\/\//i.test(sourceMappingURL)) { - sourceMappingURL = defaultSourceRoot + sourceMappingURL; - } - return this._getSourceMapConsumer(sourceMappingURL, defaultSourceRoot).then(function(sourceMapConsumer) { - return _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache).then(resolve)["catch"](function() { - resolve(stackframe); - }); - }); - }.bind(this), reject)["catch"](reject); - }.bind(this)); - }; - }; - })(SourceMap, StackFrame); - var scriptFile = document.getElementsByTagName('script'); - var scriptIndex = scriptFile.length - 1; - var myScript = scriptFile[scriptIndex]; - var queryString = myScript.src.replace(/^[^\?]+\??/, ''); - var params = parseQuery(queryString); - var paramsLength = objectLength(params); - var debugSettings = { - label: ' elmah.io debugger : On ', - labelCSS: 'background: #06a89c; color: #ffffff; display: inline-block; font-size: 14px;', - successCSS: 'background: #d4edda; color: #155724; display: inline-block; font-size: 13px;', - errorCSS: 'background: #f8d7da; color: #721c24; display: inline-block; font-size: 13px;', - warningCSS: 'background: #fff3cd; color: #856404; display: inline-block; font-size: 13px;', - lightCSS: 'background: #e2e3e5; color: #383d41; display: inline-block; font-size: 13px;' - }; - var defaults = { - apiKey: null, - logId: null, - debug: false, - application: null, - filter: null - }; - var extend = function() { - var extended = {}; - var deep = false; - var i = 0; - if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') { - deep = arguments[0]; - i++; - } - var merge = function(obj) { - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') { - extended[prop] = extend(extended[prop], obj[prop]); - } else { - extended[prop] = obj[prop]; - } - } - } - }; - for (; i < arguments.length; i++) { - var obj = arguments[i]; - merge(obj); - } - return extended; - }; - - function parseQuery(query) { - var Params = new Object(); - if (!query) return Params; - var Pairs = query.split(/[;&]/); - for (var i = 0; i < Pairs.length; i++) { - var KeyVal = Pairs[i].split('='); - if (!KeyVal || KeyVal.length !== 2) continue; - var key = unescape(KeyVal[0]); - var val = unescape(KeyVal[1]); - val = val.replace(/\+/g, ' '); - Params[key] = val; - } - return Params; - } - - function objectLength(obj) { - var size = 0, - key; - for (key in obj) { - if (obj.hasOwnProperty(key)) size++; - } - return size; - }; - - function getSearchParameters() { - var prmstr = window.location.search.substr(1); - return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {}; - } - - function transformToAssocArray(prmstr) { - var params = []; - var prmarr = prmstr.split("&"); - for (var i = 0; i < prmarr.length; i++) { - var tmparr = prmarr[i].split("="); - params.push({ - 'key': tmparr[0], - 'value': tmparr[1] - }); - } - return params; - } - - function merge_objects(obj1, obj2) { - var obj3 = {}; - for (var attrname1 in obj1) { - obj3[attrname1] = obj1[attrname1]; - } - for (var attrname2 in obj2) { - obj3[attrname2] = obj2[attrname2]; - } - return obj3; - } - var Constructor = function(options) { - var publicAPIs = {}; - var settings; - - function getPayload() { - var payload = { - "url": document.location.pathname || '/', - "application": settings.application - }; - var payload_data = []; - if (document.documentMode) payload_data.push({ - "key": "Document-Mode", - "value": document.documentMode - }); - if (window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth) payload_data.push({ - "key": "Browser-Width", - "value": window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth - }); - if (window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight) payload_data.push({ - "key": "Browser-Height", - "value": window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight - }); - if ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type) !== undefined) payload_data.push({ - "key": "Screen-Orientation", - "value": ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type).split("-"))[0] - }); - if (screen.width) payload_data.push({ - "key": "Screen-Width", - "value": screen.width - }); - if (screen.height) payload_data.push({ - "key": "Screen-Height", - "value": screen.height - }); - if (screen.colorDepth) payload_data.push({ - "key": "Color-Depth", - "value": screen.colorDepth - }); - payload_data.push({ - "key": "X-ELMAHIO-SEARCH-isClientside", - "value": "true" - }); - payload.data = payload_data; - var payload_serverVariables = []; - if (navigator.language) payload_serverVariables.push({ - "key": "User-Language", - "value": navigator.language - }); - if (navigator.userAgent) payload_serverVariables.push({ - "key": "User-Agent", - "value": navigator.userAgent - }); - if (document.referrer) payload_serverVariables.push({ - "key": "Referer", - "value": document.referrer - }); - if (document.location.protocol === "https:") payload_serverVariables.push({ - "key": "HTTPS", - "value": 'on' - }); - if (document.location.hostname) payload_serverVariables.push({ - "key": "Host", - "value": document.location.hostname - }); - payload.serverVariables = payload_serverVariables; - return payload; - } - - function confirmResponse(status, response) { - if (settings.debug) { - if (status === 'error') { - console.log('%c \u2BC8 Error log: ' + '%c \u2715 Not created ', debugSettings.lightCSS, debugSettings.errorCSS); - } else if (status === 'success') { - console.log('%c \u2BC8 Error log: ' + '%c \u2714 ' + response + ' at ' + new Date().toLocaleString() + ' ', debugSettings.lightCSS, debugSettings.successCSS); - } else { - console.log('%c \u2BC8 Error log: ' + '%c \u2715 Not created. Title should not be undefined, null or empty ! ', debugSettings.lightCSS, debugSettings.errorCSS); - } - } - } - - function stackGPS(error, xhr, jsonData) { - var errorStack = error.toString().split("\n")[0]; - var gps = new StackTraceGPS(); - var promise = new Promise(function(resolve) { - var stackframes = ErrorStackParser.parse(error); - resolve(Promise.all(stackframes.map(function(sf) { - return new Promise(function(resolve) { - function resolveOriginal() { - resolve(sf); - } - gps.pinpoint(sf).then(resolve, resolveOriginal)['catch'](resolveOriginal); - }); - }))); - }); - promise.then(function(newFrames) { - newFrames.forEach(function(stackFrame, i) { - if (stackFrame.functionName) { - var fn = stackFrame.functionName + ' '; - } else { - var fn = ''; - } - var stackString = ' at ' + fn + '(' + stackFrame.fileName + ':' + stackFrame.lineNumber + ':' + stackFrame.columnNumber + ')'; - newFrames[i] = stackString; - }); - newFrames.unshift(errorStack); - jsonData.detail = newFrames.join("\n"); - publicAPIs.emit('message', jsonData); - xhr.send(JSON.stringify(jsonData)); - }); - } - - function stackString(error) { - var typeOF = typeof error.error; - var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1); - return typeOFCapitalized + ': ' + error.error + '\n' + ' at ' + '(' + error.source + ':' + error.lineno + ':' + error.colno + ')'; - } - var sendPayload = function(apiKey, logId, callback, errorLog) { - var api_key = apiKey, - log_id = logId, - error = errorLog, - send = 1, - queryParams = getSearchParameters(), - stack = error.error && objectLength(error.error.stack) !== 0 && typeof error.error === "object" ? ErrorStackParser.parse(error.error) : ''; - if (error && error.colno === 0 && error.lineno === 0 && (!stack || stack === '') && error.message && (error.message === "Script error." || error.message === "Script error")) { - if (settings.debug) { - console.log('%c \u2BC8 Error log: ' + '%c \uD83D\uDEC8 Ignoring error from external script ', debugSettings.lightCSS, debugSettings.warningCSS); - } - return; - } - if ((api_key !== null && log_id !== null) || (paramsLength === 2)) { - if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { - api_key = params['apiKey']; - log_id = params['logId']; - } - var xhr = new XMLHttpRequest(); - xhr.open("POST", "https://api.elmah.io/v3/messages/" + log_id + "?api_key=" + api_key, true); - xhr.setRequestHeader('Content-type', 'application/json'); - xhr.onload = function(e) { - if (xhr.readyState === 4) { - if (xhr.status === 201) { - callback('success', xhr.statusText); - } - } - }; - xhr.onerror = function(e) { - callback('error', xhr.statusText); - publicAPIs.emit('error', xhr.status, xhr.statusText); - } - var jsonData = { - "detail": error.error ? error.error.stack : null, - "title": error.message || 'Unspecified error', - "source": stack && stack.length > 0 ? stack[0].fileName : null, - "severity": "Error", - "type": error.error ? error.error.name : null, - "queryString": JSON.parse(JSON.stringify(queryParams)) - }; - if (error.error && (objectLength(error.error.stack) === 0) && typeof jsonData.detail === "undefined") { - var typeOF = typeof errorLog.error; - var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1); - jsonData.detail = stackString(errorLog); - jsonData.source = errorLog.source; - jsonData.title = "Uncaught " + typeOFCapitalized + ": " + errorLog.error; - } - jsonData = merge_objects(jsonData, getPayload()); - if (settings.filter !== null) { - if (settings.filter(jsonData)) { - send = 0; - } - } - if (send === 1) { - if (error.error && typeof error.error === "object" && objectLength(error.error.stack) !== 0 && typeof Promise !== "undefined" && Promise.toString().indexOf("[native code]") !== -1) { - stackGPS(error.error, xhr, jsonData); - } else { - publicAPIs.emit('message', jsonData); - xhr.send(JSON.stringify(jsonData)); - } - } - } else { - return console.log('Login api error'); - } - }; - var sendManualPayload = function(apiKey, logId, callback, logType, messageLog, errorLog) { - var api_key = apiKey, - log_id = logId, - type = logType, - error = errorLog, - message = messageLog, - send = 1, - queryParams = getSearchParameters(); - if ((api_key !== null && log_id !== null) || (paramsLength === 2)) { - if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { - api_key = params['apiKey']; - log_id = params['logId']; - } - var xhr = new XMLHttpRequest(); - xhr.open("POST", "https://api.elmah.io/v3/messages/" + log_id + "?api_key=" + api_key, true); - xhr.setRequestHeader('Content-type', 'application/json'); - xhr.onload = function(e) { - if (xhr.readyState === 4) { - if (xhr.status === 201) { - callback('success', xhr.statusText); - } - } - }; - xhr.onerror = function(e) { - callback('error', xhr.statusText); - publicAPIs.emit('error', xhr.status, xhr.statusText); - } - if (type !== "Log") { - var stack = error ? ErrorStackParser.parse(error) : null; - var jsonData = { - "title": message, - "source": stack && stack.length > 0 ? stack[0].fileName : null, - "detail": error ? error.stack : null, - "severity": type, - "type": error ? error.name : null, - "queryString": JSON.parse(JSON.stringify(queryParams)) - }; - jsonData = merge_objects(jsonData, getPayload()); - } else { - jsonData = error; - } - if (settings.filter !== null) { - if (settings.filter(jsonData)) { - send = 0; - } - } - if (send === 1) { - if (jsonData.title) { - if (error && type !== "Log" && typeof Promise !== "undefined" && Promise.toString().indexOf("[native code]") !== -1) { - stackGPS(error, xhr, jsonData); - } else { - publicAPIs.emit('message', jsonData); - xhr.send(JSON.stringify(jsonData)); - } - } else { - callback('missing-title', xhr.statusText); - } - } - } else { - return console.log('Login api error'); - } - }; - publicAPIs.error = function(msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg); - }; - publicAPIs.error = function(msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg, error); - }; - publicAPIs.verbose = function(msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg); - }; - publicAPIs.verbose = function(msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg, error); - }; - publicAPIs.debug = function(msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg); - }; - publicAPIs.debug = function(msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg, error); - }; - publicAPIs.information = function(msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg); - }; - publicAPIs.information = function(msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg, error); - }; - publicAPIs.warning = function(msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg); - }; - publicAPIs.warning = function(msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg, error); - }; - publicAPIs.fatal = function(msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg); - }; - publicAPIs.fatal = function(msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg, error); - }; - publicAPIs.log = function(obj) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Log', null, obj); - }; - publicAPIs.message = function() { - return getPayload(); - }; - publicAPIs.on = function(name, callback, ctx) { - var e = this.e || (this.e = {}); - (e[name] || (e[name] = [])).push({ - fn: callback, - ctx: ctx - }); - return this; - }; - publicAPIs.emit = function(name) { - var data = [].slice.call(arguments, 1); - var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); - var i = 0; - var len = evtArr.length; - for (i; i < len; i++) { - evtArr[i].fn.apply(evtArr[i].ctx, data); - } - return this; - }; - publicAPIs.init = function(options) { - settings = extend(defaults, options || {}); - window.onerror = function(message, source, lineno, colno, error) { - var errorLog = { - 'message': message, - 'source': source, - 'lineno': lineno, - 'colno': colno, - 'error': error - } - sendPayload(settings.apiKey, settings.logId, confirmResponse, errorLog); - return false; - } - }; - publicAPIs.init(options); - if (settings.debug) { - console.log('%c' + debugSettings.label, debugSettings.labelCSS); - if (settings.apiKey) { - if (settings.apiKey.length !== 32) { - console.log('%c \u26A0 API Key: ' + '%c The API Key must have exactly 32 characters long ', debugSettings.errorCSS, debugSettings.lightCSS); - } - } else { - console.log('%c \u26A0 API Key: ' + '%c The API Key is not set ', debugSettings.errorCSS, debugSettings.lightCSS); - } - if (settings.logId) { - if (!settings.logId.match(/^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$/gi)) { - console.log('%c \u26A0 API Key: ' + '%c The Log ID is not valid ', debugSettings.errorCSS, debugSettings.lightCSS); - } - } else { - console.log('%c \u26A0 Log ID: ' + '%c The Log ID is not set ', debugSettings.errorCSS, debugSettings.lightCSS); - } - } - return publicAPIs; - }; - if (paramsLength && params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { - return new Constructor; - } else { - return Constructor; - } -}); -//# sourceMappingURL=elmahio.js.map +/*! + * elmah.io Javascript Logger - version 3.3.0 + * (c) 2018 elmah.io, Apache 2.0 License, https://elmah.io + */ +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + define([], function() { + return factory(root); + }); + } else if (typeof exports === 'object') { + module.exports = factory(root); + } else { + root.Elmahio = factory(root); + } +})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, function(window) { + 'use strict'; + var StackFrame = (function() { + "use strict"; + + function _isNumber(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + } + + function _capitalize(str) { + return str.charAt(0).toUpperCase() + str.substring(1); + } + + function _getter(p) { + return function() { + return this[p]; + }; + } + var booleanProps = ["isConstructor", "isEval", "isNative", "isToplevel"]; + var numericProps = ["columnNumber", "lineNumber"]; + var stringProps = ["fileName", "functionName", "source"]; + var arrayProps = ["args"]; + var props = booleanProps.concat(numericProps, stringProps, arrayProps); + + function StackFrame(obj) { + if (obj instanceof Object) { + for (var i = 0; i < props.length; i++) { + if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) { + this["set" + _capitalize(props[i])](obj[props[i]]); + } + } + } + } + StackFrame.prototype = { + getArgs: function() { + return this.args; + }, + setArgs: function(v) { + if (Object.prototype.toString.call(v) !== "[object Array]") { + throw new TypeError("Args must be an Array"); + } + this.args = v; + }, + getEvalOrigin: function() { + return this.evalOrigin; + }, + setEvalOrigin: function(v) { + if (v instanceof StackFrame) { + this.evalOrigin = v; + } else if (v instanceof Object) { + this.evalOrigin = new StackFrame(v); + } else { + throw new TypeError("Eval Origin must be an Object or StackFrame"); + } + }, + toString: function() { + var functionName = this.getFunctionName() || "{anonymous}"; + var args = "(" + (this.getArgs() || []).join(",") + ")"; + var fileName = this.getFileName() ? "@" + this.getFileName() : ""; + var lineNumber = _isNumber(this.getLineNumber()) ? ":" + this.getLineNumber() : ""; + var columnNumber = _isNumber(this.getColumnNumber()) ? ":" + this.getColumnNumber() : ""; + return functionName + args + fileName + lineNumber + columnNumber; + } + }; + StackFrame.fromString = function StackFrame$$fromString(str) { + var argsStartIndex = str.indexOf("("); + var argsEndIndex = str.lastIndexOf(")"); + var functionName = str.substring(0, argsStartIndex); + var args = str.substring(argsStartIndex + 1, argsEndIndex).split(","); + var locationString = str.substring(argsEndIndex + 1); + if (locationString.indexOf("@") === 0) { + var parts = /@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(locationString, ""); + var fileName = parts[1]; + var lineNumber = parts[2]; + var columnNumber = parts[3]; + } + return new StackFrame({ + functionName: functionName, + args: args || undefined, + fileName: fileName, + lineNumber: lineNumber || undefined, + columnNumber: columnNumber || undefined + }); + }; + for (var i = 0; i < booleanProps.length; i++) { + StackFrame.prototype["get" + _capitalize(booleanProps[i])] = _getter(booleanProps[i]); + StackFrame.prototype["set" + _capitalize(booleanProps[i])] = function(p) { + return function(v) { + this[p] = Boolean(v); + }; + }(booleanProps[i]); + } + for (var j = 0; j < numericProps.length; j++) { + StackFrame.prototype["get" + _capitalize(numericProps[j])] = _getter(numericProps[j]); + StackFrame.prototype["set" + _capitalize(numericProps[j])] = function(p) { + return function(v) { + if (!_isNumber(v)) { + throw new TypeError(p + " must be a Number"); + } + this[p] = Number(v); + }; + }(numericProps[j]); + } + for (var k = 0; k < stringProps.length; k++) { + StackFrame.prototype["get" + _capitalize(stringProps[k])] = _getter(stringProps[k]); + StackFrame.prototype["set" + _capitalize(stringProps[k])] = function(p) { + return function(v) { + this[p] = String(v); + }; + }(stringProps[k]); + } + return StackFrame; + })(); + var ErrorStackParser = (function() { + "use strict"; + var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\S+\:\d+/; + var CHROME_IE_STACK_REGEXP = /^\s*at .*(\S+\:\d+|\(native\))/m; + var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\[native code\])?$/; + return { + parse: function ErrorStackParser$$parse(error) { + if (typeof error.stacktrace !== "undefined" || typeof error["opera#sourceloc"] !== "undefined") { + return this.parseOpera(error); + } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) { + return this.parseV8OrIE(error); + } else if (error.stack) { + return this.parseFFOrSafari(error); + } else { + throw new Error("Cannot parse given Error object"); + } + }, + extractLocation: function ErrorStackParser$$extractLocation(urlLike) { + if (urlLike.indexOf(":") === -1) { + return [urlLike]; + } + var regExp = /(.+?)(?:\:(\d+))?(?:\:(\d+))?$/; + var parts = regExp.exec(urlLike.replace(/[\(\)]/g, "")); + return [parts[1], parts[2] || undefined, parts[3] || undefined]; + }, + parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) { + var filtered = error.stack.split("\n").filter(function(line) { + return !!line.match(CHROME_IE_STACK_REGEXP); + }, this); + return filtered.map(function(line) { + if (line.indexOf("(eval ") > -1) { + line = line.replace(/eval code/g, "eval").replace(/(\(eval at [^\()]*)|(\)\,.*$)/g, ""); + } + var tokens = line.replace(/^\s+/, "").replace(/\(eval code/g, "(").split(/\s+/).slice(1); + var locationParts = this.extractLocation(tokens.pop()); + var functionName = tokens.join(" ") || undefined; + var fileName = ["eval", ""].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0]; + return new StackFrame({ + functionName: functionName, + fileName: fileName, + lineNumber: locationParts[1], + columnNumber: locationParts[2], + source: line + }); + }, this); + }, + parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) { + var filtered = error.stack.split("\n").filter(function(line) { + return !line.match(SAFARI_NATIVE_CODE_REGEXP); + }, this); + return filtered.map(function(line) { + if (line.indexOf(" > eval") > -1) { + line = line.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g, ":$1"); + } + if (line.indexOf("@") === -1 && line.indexOf(":") === -1) { + return new StackFrame({ + functionName: line + }); + } else { + var functionNameRegex = /((.*".+"[^@]*)?[^@]*)(?:@)/; + var matches = line.match(functionNameRegex); + var functionName = matches && matches[1] ? matches[1] : undefined; + var locationParts = this.extractLocation(line.replace(functionNameRegex, "")); + return new StackFrame({ + functionName: functionName, + fileName: locationParts[0], + lineNumber: locationParts[1], + columnNumber: locationParts[2], + source: line + }); + } + }, this); + }, + parseOpera: function ErrorStackParser$$parseOpera(e) { + if (!e.stacktrace || e.message.indexOf("\n") > -1 && e.message.split("\n").length > e.stacktrace.split("\n").length) { + return this.parseOpera9(e); + } else if (!e.stack) { + return this.parseOpera10(e); + } else { + return this.parseOpera11(e); + } + }, + parseOpera9: function ErrorStackParser$$parseOpera9(e) { + var lineRE = /Line (\d+).*script (?:in )?(\S+)/i; + var lines = e.message.split("\n"); + var result = []; + for (var i = 2, len = lines.length; i < len; i += 2) { + var match = lineRE.exec(lines[i]); + if (match) { + result.push(new StackFrame({ + fileName: match[2], + lineNumber: match[1], + source: lines[i] + })); + } + } + return result; + }, + parseOpera10: function ErrorStackParser$$parseOpera10(e) { + var lineRE = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i; + var lines = e.stacktrace.split("\n"); + var result = []; + for (var i = 0, len = lines.length; i < len; i += 2) { + var match = lineRE.exec(lines[i]); + if (match) { + result.push(new StackFrame({ + functionName: match[3] || undefined, + fileName: match[2], + lineNumber: match[1], + source: lines[i] + })); + } + } + return result; + }, + parseOpera11: function ErrorStackParser$$parseOpera11(error) { + var filtered = error.stack.split("\n").filter(function(line) { + return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/); + }, this); + return filtered.map(function(line) { + var tokens = line.split("@"); + var locationParts = this.extractLocation(tokens.pop()); + var functionCall = tokens.shift() || ""; + var functionName = functionCall.replace(//, "$2").replace(/\([^\)]*\)/g, "") || undefined; + var argsRaw; + if (functionCall.match(/\(([^\)]*)\)/)) { + argsRaw = functionCall.replace(/^[^\(]+\(([^\)]*)\)$/, "$1"); + } + var args = argsRaw === undefined || argsRaw === "[arguments not available]" ? undefined : argsRaw.split(","); + return new StackFrame({ + functionName: functionName, + args: args, + fileName: locationParts[0], + lineNumber: locationParts[1], + columnNumber: locationParts[2], + source: line + }); + }, this); + } + }; + })(); + var SourceMap = function(e) { + var n = {}; + + function r(t) { + if (n[t]) return n[t].exports; + var o = n[t] = { + exports: {}, + id: t, + loaded: !1 + }; + return e[t].call(o.exports, o, o.exports, r), o.loaded = !0, o.exports + } + return r.m = e, r.c = n, r.p = "", r(0) + }([function(e, n, r) { + var t = r(1), + o = r(2), + i = r(3).ArraySet, + a = r(4), + s = r(6).quickSort; + + function u(e) { + var n = e; + return "string" == typeof e && (n = JSON.parse(e.replace(/^\)\]\}'/, ""))), null != n.sections ? new c(n) : new l(n) + } + + function l(e) { + var n = e; + "string" == typeof e && (n = JSON.parse(e.replace(/^\)\]\}'/, ""))); + var r = t.getArg(n, "version"), + o = t.getArg(n, "sources"), + a = t.getArg(n, "names", []), + s = t.getArg(n, "sourceRoot", null), + u = t.getArg(n, "sourcesContent", null), + l = t.getArg(n, "mappings"), + g = t.getArg(n, "file", null); + if (r != this._version) throw new Error("Unsupported version: " + r); + o = o.map(String).map(t.normalize).map(function(e) { + return s && t.isAbsolute(s) && t.isAbsolute(e) ? t.relative(s, e) : e + }), this._names = i.fromArray(a.map(String), !0), this._sources = i.fromArray(o, !0), this.sourceRoot = s, this.sourcesContent = u, this._mappings = l, this.file = g + } + + function g() { + this.generatedLine = 0, this.generatedColumn = 0, this.source = null, this.originalLine = null, this.originalColumn = null, this.name = null + } + + function c(e) { + var n = e; + "string" == typeof e && (n = JSON.parse(e.replace(/^\)\]\}'/, ""))); + var r = t.getArg(n, "version"), + o = t.getArg(n, "sections"); + if (r != this._version) throw new Error("Unsupported version: " + r); + this._sources = new i, this._names = new i; + var a = { + line: -1, + column: 0 + }; + this._sections = o.map(function(e) { + if (e.url) throw new Error("Support for url field in sections not implemented."); + var n = t.getArg(e, "offset"), + r = t.getArg(n, "line"), + o = t.getArg(n, "column"); + if (r < a.line || r === a.line && o < a.column) throw new Error("Section offsets must be ordered and non-overlapping."); + return a = n, { + generatedOffset: { + generatedLine: r + 1, + generatedColumn: o + 1 + }, + consumer: new u(t.getArg(e, "map")) + } + }) + } + u.fromSourceMap = function(e) { + return l.fromSourceMap(e) + }, u.prototype._version = 3, u.prototype.__generatedMappings = null, Object.defineProperty(u.prototype, "_generatedMappings", { + get: function() { + return this.__generatedMappings || this._parseMappings(this._mappings, this.sourceRoot), this.__generatedMappings + } + }), u.prototype.__originalMappings = null, Object.defineProperty(u.prototype, "_originalMappings", { + get: function() { + return this.__originalMappings || this._parseMappings(this._mappings, this.sourceRoot), this.__originalMappings + } + }), u.prototype._charIsMappingSeparator = function(e, n) { + var r = e.charAt(n); + return ";" === r || "," === r + }, u.prototype._parseMappings = function(e, n) { + throw new Error("Subclasses must implement _parseMappings") + }, u.GENERATED_ORDER = 1, u.ORIGINAL_ORDER = 2, u.GREATEST_LOWER_BOUND = 1, u.LEAST_UPPER_BOUND = 2, u.prototype.eachMapping = function(e, n, r) { + var o, i = n || null; + switch (r || u.GENERATED_ORDER) { + case u.GENERATED_ORDER: + o = this._generatedMappings; + break; + case u.ORIGINAL_ORDER: + o = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration.") + } + var a = this.sourceRoot; + o.map(function(e) { + var n = null === e.source ? null : this._sources.at(e.source); + return null != n && null != a && (n = t.join(a, n)), { + source: n, + generatedLine: e.generatedLine, + generatedColumn: e.generatedColumn, + originalLine: e.originalLine, + originalColumn: e.originalColumn, + name: null === e.name ? null : this._names.at(e.name) + } + }, this).forEach(e, i) + }, u.prototype.allGeneratedPositionsFor = function(e) { + var n = t.getArg(e, "line"), + r = { + source: t.getArg(e, "source"), + originalLine: n, + originalColumn: t.getArg(e, "column", 0) + }; + if (null != this.sourceRoot && (r.source = t.relative(this.sourceRoot, r.source)), !this._sources.has(r.source)) return []; + r.source = this._sources.indexOf(r.source); + var i = [], + a = this._findMapping(r, this._originalMappings, "originalLine", "originalColumn", t.compareByOriginalPositions, o.LEAST_UPPER_BOUND); + if (a >= 0) { + var s = this._originalMappings[a]; + if (void 0 === e.column) + for (var u = s.originalLine; s && s.originalLine === u;) i.push({ + line: t.getArg(s, "generatedLine", null), + column: t.getArg(s, "generatedColumn", null), + lastColumn: t.getArg(s, "lastGeneratedColumn", null) + }), s = this._originalMappings[++a]; + else + for (var l = s.originalColumn; s && s.originalLine === n && s.originalColumn == l;) i.push({ + line: t.getArg(s, "generatedLine", null), + column: t.getArg(s, "generatedColumn", null), + lastColumn: t.getArg(s, "lastGeneratedColumn", null) + }), s = this._originalMappings[++a] + } + return i + }, n.SourceMapConsumer = u, l.prototype = Object.create(u.prototype), l.prototype.consumer = u, l.fromSourceMap = function(e) { + var n = Object.create(l.prototype), + r = n._names = i.fromArray(e._names.toArray(), !0), + o = n._sources = i.fromArray(e._sources.toArray(), !0); + n.sourceRoot = e._sourceRoot, n.sourcesContent = e._generateSourcesContent(n._sources.toArray(), n.sourceRoot), n.file = e._file; + for (var a = e._mappings.toArray().slice(), u = n.__generatedMappings = [], c = n.__originalMappings = [], p = 0, h = a.length; p < h; p++) { + var f = a[p], + d = new g; + d.generatedLine = f.generatedLine, d.generatedColumn = f.generatedColumn, f.source && (d.source = o.indexOf(f.source), d.originalLine = f.originalLine, d.originalColumn = f.originalColumn, f.name && (d.name = r.indexOf(f.name)), c.push(d)), u.push(d) + } + return s(n.__originalMappings, t.compareByOriginalPositions), n + }, l.prototype._version = 3, Object.defineProperty(l.prototype, "sources", { + get: function() { + return this._sources.toArray().map(function(e) { + return null != this.sourceRoot ? t.join(this.sourceRoot, e) : e + }, this) + } + }), l.prototype._parseMappings = function(e, n) { + for (var r, o, i, u, l, c = 1, p = 0, h = 0, f = 0, d = 0, m = 0, _ = e.length, v = 0, C = {}, A = {}, y = [], L = []; v < _;) + if (";" === e.charAt(v)) c++, v++, p = 0; + else if ("," === e.charAt(v)) v++; + else { + for ((r = new g).generatedLine = c, u = v; u < _ && !this._charIsMappingSeparator(e, u); u++); + if (i = C[o = e.slice(v, u)]) v += o.length; + else { + for (i = []; v < u;) a.decode(e, v, A), l = A.value, v = A.rest, i.push(l); + if (2 === i.length) throw new Error("Found a source, but no line and column"); + if (3 === i.length) throw new Error("Found a source and line, but no column"); + C[o] = i + } + r.generatedColumn = p + i[0], p = r.generatedColumn, i.length > 1 && (r.source = d + i[1], d += i[1], r.originalLine = h + i[2], h = r.originalLine, r.originalLine += 1, r.originalColumn = f + i[3], f = r.originalColumn, i.length > 4 && (r.name = m + i[4], m += i[4])), L.push(r), "number" == typeof r.originalLine && y.push(r) + } + s(L, t.compareByGeneratedPositionsDeflated), this.__generatedMappings = L, s(y, t.compareByOriginalPositions), this.__originalMappings = y + }, l.prototype._findMapping = function(e, n, r, t, i, a) { + if (e[r] <= 0) throw new TypeError("Line must be greater than or equal to 1, got " + e[r]); + if (e[t] < 0) throw new TypeError("Column must be greater than or equal to 0, got " + e[t]); + return o.search(e, n, i, a) + }, l.prototype.computeColumnSpans = function() { + for (var e = 0; e < this._generatedMappings.length; ++e) { + var n = this._generatedMappings[e]; + if (e + 1 < this._generatedMappings.length) { + var r = this._generatedMappings[e + 1]; + if (n.generatedLine === r.generatedLine) { + n.lastGeneratedColumn = r.generatedColumn - 1; + continue + } + } + n.lastGeneratedColumn = 1 / 0 + } + }, l.prototype.originalPositionFor = function(e) { + var n = { + generatedLine: t.getArg(e, "line"), + generatedColumn: t.getArg(e, "column") + }, + r = this._findMapping(n, this._generatedMappings, "generatedLine", "generatedColumn", t.compareByGeneratedPositionsDeflated, t.getArg(e, "bias", u.GREATEST_LOWER_BOUND)); + if (r >= 0) { + var o = this._generatedMappings[r]; + if (o.generatedLine === n.generatedLine) { + var i = t.getArg(o, "source", null); + null !== i && (i = this._sources.at(i), null != this.sourceRoot && (i = t.join(this.sourceRoot, i))); + var a = t.getArg(o, "name", null); + return null !== a && (a = this._names.at(a)), { + source: i, + line: t.getArg(o, "originalLine", null), + column: t.getArg(o, "originalColumn", null), + name: a + } + } + } + return { + source: null, + line: null, + column: null, + name: null + } + }, l.prototype.hasContentsOfAllSources = function() { + return !!this.sourcesContent && (this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function(e) { + return null == e + })) + }, l.prototype.sourceContentFor = function(e, n) { + if (!this.sourcesContent) return null; + if (null != this.sourceRoot && (e = t.relative(this.sourceRoot, e)), this._sources.has(e)) return this.sourcesContent[this._sources.indexOf(e)]; + var r; + if (null != this.sourceRoot && (r = t.urlParse(this.sourceRoot))) { + var o = e.replace(/^file:\/\//, ""); + if ("file" == r.scheme && this._sources.has(o)) return this.sourcesContent[this._sources.indexOf(o)]; + if ((!r.path || "/" == r.path) && this._sources.has("/" + e)) return this.sourcesContent[this._sources.indexOf("/" + e)] + } + if (n) return null; + throw new Error('"' + e + '" is not in the SourceMap.') + }, l.prototype.generatedPositionFor = function(e) { + var n = t.getArg(e, "source"); + if (null != this.sourceRoot && (n = t.relative(this.sourceRoot, n)), !this._sources.has(n)) return { + line: null, + column: null, + lastColumn: null + }; + var r = { + source: n = this._sources.indexOf(n), + originalLine: t.getArg(e, "line"), + originalColumn: t.getArg(e, "column") + }, + o = this._findMapping(r, this._originalMappings, "originalLine", "originalColumn", t.compareByOriginalPositions, t.getArg(e, "bias", u.GREATEST_LOWER_BOUND)); + if (o >= 0) { + var i = this._originalMappings[o]; + if (i.source === r.source) return { + line: t.getArg(i, "generatedLine", null), + column: t.getArg(i, "generatedColumn", null), + lastColumn: t.getArg(i, "lastGeneratedColumn", null) + } + } + return { + line: null, + column: null, + lastColumn: null + } + }, n.BasicSourceMapConsumer = l, c.prototype = Object.create(u.prototype), c.prototype.constructor = u, c.prototype._version = 3, Object.defineProperty(c.prototype, "sources", { + get: function() { + for (var e = [], n = 0; n < this._sections.length; n++) + for (var r = 0; r < this._sections[n].consumer.sources.length; r++) e.push(this._sections[n].consumer.sources[r]); + return e + } + }), c.prototype.originalPositionFor = function(e) { + var n = { + generatedLine: t.getArg(e, "line"), + generatedColumn: t.getArg(e, "column") + }, + r = o.search(n, this._sections, function(e, n) { + var r = e.generatedLine - n.generatedOffset.generatedLine; + return r || e.generatedColumn - n.generatedOffset.generatedColumn + }), + i = this._sections[r]; + return i ? i.consumer.originalPositionFor({ + line: n.generatedLine - (i.generatedOffset.generatedLine - 1), + column: n.generatedColumn - (i.generatedOffset.generatedLine === n.generatedLine ? i.generatedOffset.generatedColumn - 1 : 0), + bias: e.bias + }) : { + source: null, + line: null, + column: null, + name: null + } + }, c.prototype.hasContentsOfAllSources = function() { + return this._sections.every(function(e) { + return e.consumer.hasContentsOfAllSources() + }) + }, c.prototype.sourceContentFor = function(e, n) { + for (var r = 0; r < this._sections.length; r++) { + var t = this._sections[r].consumer.sourceContentFor(e, !0); + if (t) return t + } + if (n) return null; + throw new Error('"' + e + '" is not in the SourceMap.') + }, c.prototype.generatedPositionFor = function(e) { + for (var n = 0; n < this._sections.length; n++) { + var r = this._sections[n]; + if (-1 !== r.consumer.sources.indexOf(t.getArg(e, "source"))) { + var o = r.consumer.generatedPositionFor(e); + if (o) return { + line: o.line + (r.generatedOffset.generatedLine - 1), + column: o.column + (r.generatedOffset.generatedLine === o.line ? r.generatedOffset.generatedColumn - 1 : 0) + } + } + } + return { + line: null, + column: null + } + }, c.prototype._parseMappings = function(e, n) { + this.__generatedMappings = [], this.__originalMappings = []; + for (var r = 0; r < this._sections.length; r++) + for (var o = this._sections[r], i = o.consumer._generatedMappings, a = 0; a < i.length; a++) { + var u = i[a], + l = o.consumer._sources.at(u.source); + null !== o.consumer.sourceRoot && (l = t.join(o.consumer.sourceRoot, l)), this._sources.add(l), l = this._sources.indexOf(l); + var g = o.consumer._names.at(u.name); + this._names.add(g), g = this._names.indexOf(g); + var c = { + source: l, + generatedLine: u.generatedLine + (o.generatedOffset.generatedLine - 1), + generatedColumn: u.generatedColumn + (o.generatedOffset.generatedLine === u.generatedLine ? o.generatedOffset.generatedColumn - 1 : 0), + originalLine: u.originalLine, + originalColumn: u.originalColumn, + name: g + }; + this.__generatedMappings.push(c), "number" == typeof c.originalLine && this.__originalMappings.push(c) + } + s(this.__generatedMappings, t.compareByGeneratedPositionsDeflated), s(this.__originalMappings, t.compareByOriginalPositions) + }, n.IndexedSourceMapConsumer = c + }, function(e, n) { + n.getArg = function(e, n, r) { + if (n in e) return e[n]; + if (3 === arguments.length) return r; + throw new Error('"' + n + '" is a required argument.') + }; + var r = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/, + t = /^data:.+\,.+$/; + + function o(e) { + var n = e.match(r); + return n ? { + scheme: n[1], + auth: n[2], + host: n[3], + port: n[4], + path: n[5] + } : null + } + + function i(e) { + var n = ""; + return e.scheme && (n += e.scheme + ":"), n += "//", e.auth && (n += e.auth + "@"), e.host && (n += e.host), e.port && (n += ":" + e.port), e.path && (n += e.path), n + } + + function a(e) { + var r = e, + t = o(e); + if (t) { + if (!t.path) return e; + r = t.path + } + for (var a, s = n.isAbsolute(r), u = r.split(/\/+/), l = 0, g = u.length - 1; g >= 0; g--) "." === (a = u[g]) ? u.splice(g, 1) : ".." === a ? l++ : l > 0 && ("" === a ? (u.splice(g + 1, l), l = 0) : (u.splice(g, 2), l--)); + return "" === (r = u.join("/")) && (r = s ? "/" : "."), t ? (t.path = r, i(t)) : r + } + n.urlParse = o, n.urlGenerate = i, n.normalize = a, n.join = function(e, n) { + "" === e && (e = "."), "" === n && (n = "."); + var r = o(n), + s = o(e); + if (s && (e = s.path || "/"), r && !r.scheme) return s && (r.scheme = s.scheme), i(r); + if (r || n.match(t)) return n; + if (s && !s.host && !s.path) return s.host = n, i(s); + var u = "/" === n.charAt(0) ? n : a(e.replace(/\/+$/, "") + "/" + n); + return s ? (s.path = u, i(s)) : u + }, n.isAbsolute = function(e) { + return "/" === e.charAt(0) || !!e.match(r) + }, n.relative = function(e, n) { + "" === e && (e = "."), e = e.replace(/\/$/, ""); + for (var r = 0; 0 !== n.indexOf(e + "/");) { + var t = e.lastIndexOf("/"); + if (t < 0) return n; + if ((e = e.slice(0, t)).match(/^([^\/]+:\/)?\/*$/)) return n; + ++r + } + return Array(r + 1).join("../") + n.substr(e.length + 1) + }; + var s = !("__proto__" in Object.create(null)); + + function u(e) { + return e + } + + function l(e) { + if (!e) return !1; + var n = e.length; + if (n < 9) return !1; + if (95 !== e.charCodeAt(n - 1) || 95 !== e.charCodeAt(n - 2) || 111 !== e.charCodeAt(n - 3) || 116 !== e.charCodeAt(n - 4) || 111 !== e.charCodeAt(n - 5) || 114 !== e.charCodeAt(n - 6) || 112 !== e.charCodeAt(n - 7) || 95 !== e.charCodeAt(n - 8) || 95 !== e.charCodeAt(n - 9)) return !1; + for (var r = n - 10; r >= 0; r--) + if (36 !== e.charCodeAt(r)) return !1; + return !0 + } + + function g(e, n) { + return e === n ? 0 : e > n ? 1 : -1 + } + n.toSetString = s ? u : function(e) { + return l(e) ? "$" + e : e + }, n.fromSetString = s ? u : function(e) { + return l(e) ? e.slice(1) : e + }, n.compareByOriginalPositions = function(e, n, r) { + var t = e.source - n.source; + return 0 !== t ? t : 0 != (t = e.originalLine - n.originalLine) ? t : 0 != (t = e.originalColumn - n.originalColumn) || r ? t : 0 != (t = e.generatedColumn - n.generatedColumn) ? t : 0 != (t = e.generatedLine - n.generatedLine) ? t : e.name - n.name + }, n.compareByGeneratedPositionsDeflated = function(e, n, r) { + var t = e.generatedLine - n.generatedLine; + return 0 !== t ? t : 0 != (t = e.generatedColumn - n.generatedColumn) || r ? t : 0 != (t = e.source - n.source) ? t : 0 != (t = e.originalLine - n.originalLine) ? t : 0 != (t = e.originalColumn - n.originalColumn) ? t : e.name - n.name + }, n.compareByGeneratedPositionsInflated = function(e, n) { + var r = e.generatedLine - n.generatedLine; + return 0 !== r ? r : 0 != (r = e.generatedColumn - n.generatedColumn) ? r : 0 !== (r = g(e.source, n.source)) ? r : 0 != (r = e.originalLine - n.originalLine) ? r : 0 != (r = e.originalColumn - n.originalColumn) ? r : g(e.name, n.name) + } + }, function(e, n) { + n.GREATEST_LOWER_BOUND = 1, n.LEAST_UPPER_BOUND = 2, n.search = function(e, r, t, o) { + if (0 === r.length) return -1; + var i = function e(r, t, o, i, a, s) { + var u = Math.floor((t - r) / 2) + r, + l = a(o, i[u], !0); + return 0 === l ? u : l > 0 ? t - u > 1 ? e(u, t, o, i, a, s) : s == n.LEAST_UPPER_BOUND ? t < i.length ? t : -1 : u : u - r > 1 ? e(r, u, o, i, a, s) : s == n.LEAST_UPPER_BOUND ? u : r < 0 ? -1 : r + }(-1, r.length, e, r, t, o || n.GREATEST_LOWER_BOUND); + if (i < 0) return -1; + for (; i - 1 >= 0 && 0 === t(r[i], r[i - 1], !0);) --i; + return i + } + }, function(e, n, r) { + var t = r(1), + o = Object.prototype.hasOwnProperty; + + function i() { + this._array = [], this._set = Object.create(null) + } + i.fromArray = function(e, n) { + for (var r = new i, t = 0, o = e.length; t < o; t++) r.add(e[t], n); + return r + }, i.prototype.size = function() { + return Object.getOwnPropertyNames(this._set).length + }, i.prototype.add = function(e, n) { + var r = t.toSetString(e), + i = o.call(this._set, r), + a = this._array.length; + i && !n || this._array.push(e), i || (this._set[r] = a) + }, i.prototype.has = function(e) { + var n = t.toSetString(e); + return o.call(this._set, n) + }, i.prototype.indexOf = function(e) { + var n = t.toSetString(e); + if (o.call(this._set, n)) return this._set[n]; + throw new Error('"' + e + '" is not in the set.') + }, i.prototype.at = function(e) { + if (e >= 0 && e < this._array.length) return this._array[e]; + throw new Error("No element indexed by " + e) + }, i.prototype.toArray = function() { + return this._array.slice() + }, n.ArraySet = i + }, function(e, n, r) { + var t = r(5); + n.encode = function(e) { + var n, r, o = "", + i = (r = e) < 0 ? 1 + (-r << 1) : 0 + (r << 1); + do { + n = 31 & i, (i >>>= 5) > 0 && (n |= 32), o += t.encode(n) + } while (i > 0); + return o + }, n.decode = function(e, n, r) { + var o, i, a, s, u = e.length, + l = 0, + g = 0; + do { + if (n >= u) throw new Error("Expected more digits in base 64 VLQ value."); + if (-1 === (i = t.decode(e.charCodeAt(n++)))) throw new Error("Invalid base64 digit: " + e.charAt(n - 1)); + o = !!(32 & i), l += (i &= 31) << g, g += 5 + } while (o); + r.value = (s = (a = l) >> 1, 1 == (1 & a) ? -s : s), r.rest = n + } + }, function(e, n) { + var r = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); + n.encode = function(e) { + if (0 <= e && e < r.length) return r[e]; + throw new TypeError("Must be between 0 and 63: " + e) + }, n.decode = function(e) { + return 65 <= e && e <= 90 ? e - 65 : 97 <= e && e <= 122 ? e - 97 + 26 : 48 <= e && e <= 57 ? e - 48 + 52 : 43 == e ? 62 : 47 == e ? 63 : -1 + } + }, function(e, n) { + function r(e, n, r) { + var t = e[n]; + e[n] = e[r], e[r] = t + } + + function t(e, n, o, i) { + if (o < i) { + var a = o - 1; + r(e, (g = o, c = i, Math.round(g + Math.random() * (c - g))), i); + for (var s = e[i], u = o; u < i; u++) n(e[u], s) <= 0 && r(e, a += 1, u); + r(e, a + 1, u); + var l = a + 1; + t(e, n, o, l - 1), t(e, n, l + 1, i) + } + var g, c + } + n.quickSort = function(e, n) { + t(e, n, 0, e.length - 1) + } + }]); + var StackTraceGPS = (function(SourceMap, StackFrame) { + "use strict"; + + function _xdr(url) { + return new Promise(function(resolve, reject) { + var req = new XMLHttpRequest(); + req.open("get", url); + req.onerror = reject; + req.onreadystatechange = function onreadystatechange() { + if (req.readyState === 4) { + if (req.status >= 200 && req.status < 300 || url.substr(0, 7) === "file://" && req.responseText) { + resolve(req.responseText); + } else { + reject(new Error("HTTP status: " + req.status + " retrieving " + url)); + } + } + }; + req.send(); + }); + } + + function _atob(b64str) { + if (typeof window !== "undefined" && window.atob) { + return window.atob(b64str); + } else { + throw new Error("You must supply a polyfill for window.atob in this environment"); + } + } + + function _parseJson(string) { + if (typeof JSON !== "undefined" && JSON.parse) { + return JSON.parse(string); + } else { + throw new Error("You must supply a polyfill for JSON.parse in this environment"); + } + } + + function _findFunctionName(source, lineNumber) { + var syntaxes = [/['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*function\b/, /function\s+([^('"`]*?)\s*\(([^)]*)\)/, /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*(?:eval|new Function)\b/, /\b(?!(?:if|for|switch|while|with|catch)\b)(?:(?:static)\s+)?(\S+)\s*\(.*?\)\s*\{/, /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*\(.*?\)\s*=>/]; + var lines = source.split("\n"); + var code = ""; + var maxLines = Math.min(lineNumber, 20); + for (var i = 0; i < maxLines; ++i) { + var line = lines[lineNumber - i - 1]; + var commentPos = line.indexOf("//"); + if (commentPos >= 0) { + line = line.substr(0, commentPos); + } + if (line) { + code = line + code; + var len = syntaxes.length; + for (var index = 0; index < len; index++) { + var m = syntaxes[index].exec(code); + if (m && m[1]) { + return m[1]; + } + } + } + } + return undefined; + } + + function _ensureSupportedEnvironment() { + if (typeof Object.defineProperty !== "function" || typeof Object.create !== "function") { + throw new Error("Unable to consume source maps in older browsers"); + } + } + + function _ensureStackFrameIsLegit(stackframe) { + if (typeof stackframe !== "object") { + throw new TypeError("Given StackFrame is not an object"); + } else if (typeof stackframe.fileName !== "string") { + throw new TypeError("Given file name is not a String"); + } else if (typeof stackframe.lineNumber !== "number" || stackframe.lineNumber % 1 !== 0 || stackframe.lineNumber < 1) { + throw new TypeError("Given line number must be a positive integer"); + } else if (typeof stackframe.columnNumber !== "number" || stackframe.columnNumber % 1 !== 0 || stackframe.columnNumber < 0) { + throw new TypeError("Given column number must be a non-negative integer"); + } + return true; + } + + function _findSourceMappingURL(source) { + var sourceMappingUrlRegExp = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/gm; + var lastSourceMappingUrl; + var matchSourceMappingUrl; + while (matchSourceMappingUrl = sourceMappingUrlRegExp.exec(source)) { + lastSourceMappingUrl = matchSourceMappingUrl[1]; + } + if (lastSourceMappingUrl) { + return lastSourceMappingUrl; + } else { + throw new Error("sourceMappingURL not found"); + } + } + + function _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache) { + return new Promise(function(resolve, reject) { + var loc = sourceMapConsumer.originalPositionFor({ + line: stackframe.lineNumber, + column: stackframe.columnNumber + }); + if (loc.source) { + var mappedSource = sourceMapConsumer.sourceContentFor(loc.source); + if (mappedSource) { + sourceCache[loc.source] = mappedSource; + } + resolve(new StackFrame({ + functionName: loc.name || stackframe.functionName, + args: stackframe.args, + fileName: loc.source, + lineNumber: loc.line, + columnNumber: loc.column + })); + } else { + reject(new Error("Could not get original source for given stackframe and source map")); + } + }); + } + return function StackTraceGPS(opts) { + if (!(this instanceof StackTraceGPS)) { + return new StackTraceGPS(opts); + } + opts = opts || {}; + this.sourceCache = opts.sourceCache || {}; + this.sourceMapConsumerCache = opts.sourceMapConsumerCache || {}; + this.ajax = opts.ajax || _xdr; + this._atob = opts.atob || _atob; + this._get = function _get(location) { + return new Promise(function(resolve, reject) { + var isDataUrl = location.substr(0, 5) === "data:"; + if (this.sourceCache[location]) { + resolve(this.sourceCache[location]); + } else if (opts.offline && !isDataUrl) { + reject(new Error("Cannot make network requests in offline mode")); + } else { + if (isDataUrl) { + var supportedEncodingRegexp = /^data:application\/json;([\w=:"-]+;)*base64,/; + var match = location.match(supportedEncodingRegexp); + if (match) { + var sourceMapStart = match[0].length; + var encodedSource = location.substr(sourceMapStart); + var source = this._atob(encodedSource); + this.sourceCache[location] = source; + resolve(source); + } else { + reject(new Error("The encoding of the inline sourcemap is not supported")); + } + } else { + var xhrPromise = this.ajax(location, { + method: "get" + }); + this.sourceCache[location] = xhrPromise; + xhrPromise.then(resolve, reject); + } + } + }.bind(this)); + }; + this._getSourceMapConsumer = function _getSourceMapConsumer(sourceMappingURL, defaultSourceRoot) { + return new Promise(function(resolve, reject) { + if (this.sourceMapConsumerCache[sourceMappingURL]) { + resolve(this.sourceMapConsumerCache[sourceMappingURL]); + } else { + var sourceMapConsumerPromise = new Promise(function(resolve, reject) { + return this._get(sourceMappingURL).then(function(sourceMapSource) { + if (typeof sourceMapSource === "string") { + sourceMapSource = _parseJson(sourceMapSource.replace(/^\)\]\}'/, "")); + } + if (typeof sourceMapSource.sourceRoot === "undefined") { + sourceMapSource.sourceRoot = defaultSourceRoot; + } + resolve(new SourceMap.SourceMapConsumer(sourceMapSource)); + }, reject); + }.bind(this)); + this.sourceMapConsumerCache[sourceMappingURL] = sourceMapConsumerPromise; + resolve(sourceMapConsumerPromise); + } + }.bind(this)); + }; + this.pinpoint = function StackTraceGPS$$pinpoint(stackframe) { + return new Promise(function(resolve, reject) { + this.getMappedLocation(stackframe).then(function(mappedStackFrame) { + function resolveMappedStackFrame() { + resolve(mappedStackFrame); + } + this.findFunctionName(mappedStackFrame).then(resolve, resolveMappedStackFrame)["catch"](resolveMappedStackFrame); + }.bind(this), reject); + }.bind(this)); + }; + this.findFunctionName = function StackTraceGPS$$findFunctionName(stackframe) { + return new Promise(function(resolve, reject) { + _ensureStackFrameIsLegit(stackframe); + this._get(stackframe.fileName).then(function getSourceCallback(source) { + var lineNumber = stackframe.lineNumber; + var columnNumber = stackframe.columnNumber; + var guessedFunctionName = _findFunctionName(source, lineNumber, columnNumber); + if (guessedFunctionName) { + resolve(new StackFrame({ + functionName: guessedFunctionName, + args: stackframe.args, + fileName: stackframe.fileName, + lineNumber: lineNumber, + columnNumber: columnNumber + })); + } else { + resolve(stackframe); + } + }, reject)["catch"](reject); + }.bind(this)); + }; + this.getMappedLocation = function StackTraceGPS$$getMappedLocation(stackframe) { + return new Promise(function(resolve, reject) { + _ensureSupportedEnvironment(); + _ensureStackFrameIsLegit(stackframe); + var sourceCache = this.sourceCache; + var fileName = stackframe.fileName; + this._get(fileName).then(function(source) { + var sourceMappingURL = _findSourceMappingURL(source); + var isDataUrl = sourceMappingURL.substr(0, 5) === "data:"; + var defaultSourceRoot = fileName.substring(0, fileName.lastIndexOf("/") + 1); + if (sourceMappingURL[0] !== "/" && !isDataUrl && !/^https?:\/\/|^\/\//i.test(sourceMappingURL)) { + sourceMappingURL = defaultSourceRoot + sourceMappingURL; + } + return this._getSourceMapConsumer(sourceMappingURL, defaultSourceRoot).then(function(sourceMapConsumer) { + return _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache).then(resolve)["catch"](function() { + resolve(stackframe); + }); + }); + }.bind(this), reject)["catch"](reject); + }.bind(this)); + }; + }; + })(SourceMap, StackFrame); + var scriptFile = document.getElementsByTagName('script'); + var scriptIndex = scriptFile.length - 1; + var myScript = scriptFile[scriptIndex]; + var queryString = myScript.src.replace(/^[^\?]+\??/, ''); + var params = parseQuery(queryString); + var paramsLength = objectLength(params); + var debugSettings = { + label: ' elmah.io debugger : On ', + labelCSS: 'background: #06a89c; color: #ffffff; display: inline-block; font-size: 14px;', + successCSS: 'background: #d4edda; color: #155724; display: inline-block; font-size: 13px;', + errorCSS: 'background: #f8d7da; color: #721c24; display: inline-block; font-size: 13px;', + warningCSS: 'background: #fff3cd; color: #856404; display: inline-block; font-size: 13px;', + lightCSS: 'background: #e2e3e5; color: #383d41; display: inline-block; font-size: 13px;' + }; + var defaults = { + apiKey: null, + logId: null, + debug: false, + application: null, + filter: null, + captureConsoleMinimumLevel: 'none' + }; + var extend = function() { + var extended = {}; + var deep = false; + var i = 0; + if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') { + deep = arguments[0]; + i++; + } + var merge = function(obj) { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') { + extended[prop] = extend(extended[prop], obj[prop]); + } else { + extended[prop] = obj[prop]; + } + } + } + }; + for (; i < arguments.length; i++) { + var obj = arguments[i]; + merge(obj); + } + return extended; + }; + + function parseQuery(query) { + var Params = new Object(); + if (!query) return Params; + var Pairs = query.split(/[;&]/); + for (var i = 0; i < Pairs.length; i++) { + var KeyVal = Pairs[i].split('='); + if (!KeyVal || KeyVal.length !== 2) continue; + var key = unescape(KeyVal[0]); + var val = unescape(KeyVal[1]); + val = val.replace(/\+/g, ' '); + Params[key] = val; + } + return Params; + } + + function objectLength(obj) { + var size = 0, + key; + for (key in obj) { + if (obj.hasOwnProperty(key)) size++; + } + return size; + }; + + function getSearchParameters() { + var prmstr = window.location.search.substr(1); + return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {}; + } + + function transformToAssocArray(prmstr) { + var params = []; + var prmarr = prmstr.split("&"); + for (var i = 0; i < prmarr.length; i++) { + var tmparr = prmarr[i].split("="); + params.push({ + 'key': tmparr[0], + 'value': tmparr[1] + }); + } + return params; + } + + function merge_objects(obj1, obj2) { + var obj3 = {}; + for (var attrname1 in obj1) { + obj3[attrname1] = obj1[attrname1]; + } + for (var attrname2 in obj2) { + obj3[attrname2] = obj2[attrname2]; + } + return obj3; + } + var sprintfjs = function() { + 'use strict' + var app = {}; + var re = { + not_string: /[^s]/, + not_bool: /[^t]/, + not_type: /[^T]/, + not_primitive: /[^v]/, + number: /[diefg]/, + numeric_arg: /[bcdiefguxX]/, + json: /[j]/, + not_json: /[^j]/, + text: /^[^\x25]+/, + modulo: /^\x25{2}/, + placeholder: /^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/, + key: /^([a-z_][a-z_\d]*)/i, + key_access: /^\.([a-z_][a-z_\d]*)/i, + index_access: /^\[(\d+)\]/, + sign: /^[+-]/, + mod: /^\x25\s/, + notplaceholder: /^\x25?([^b-gijostTuvxX])/ + } + + function sprintf(key) { + return sprintf_format(sprintf_parse(key), arguments) + } + + function vsprintf(fmt, argv) { + return sprintf.apply(null, [fmt].concat(argv || [])) + } + + function sprintf_format(parse_tree, argv) { + var cursor = 1, + tree_length = parse_tree.length, + arg, output = '', + i, k, ph, pad, pad_character, pad_length, is_positive, sign; + for (i = 0; i < tree_length; i++) { + if (typeof parse_tree[i] === 'string') { + output += parse_tree[i] + } else if (typeof parse_tree[i] === 'object') { + ph = parse_tree[i]; + if (ph.keys) { + arg = argv[cursor] + for (k = 0; k < ph.keys.length; k++) { + if (arg == undefined) { + throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k - 1])) + } + arg = arg[ph.keys[k]] + } + } else if (ph.param_no) { + arg = argv[ph.param_no] + } else { + arg = argv[cursor++] + } + if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) { + arg = arg() + } + if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg) && arg === undefined)) { + arg = ph.placeholder; + ph.type = "s"; + } + if (re.number.test(ph.type)) { + is_positive = typeof arg === "string" ? true : arg >= 0 + } + switch (ph.type) { + case 'b': + arg = parseInt(arg, 10).toString(2) + break + case 'c': + arg = String.fromCharCode(parseInt(arg, 10)) + break + case 'd': + case 'i': + arg = typeof arg === "number" ? parseInt(arg, 10) : NaN + break + case 'j': + arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0) + break + case 'e': + arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential() + break + case 'f': + arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg) + break + case 'g': + arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg) + break + case 'o': + arg = (parseInt(arg, 10) >>> 0).toString(8) + break + case 's': + arg = String(arg) + arg = arg === "undefined" ? ph.placeholder : (ph.precision ? arg.substring(0, ph.precision) : arg) + break + case 't': + arg = String(!!arg) + arg = (ph.precision ? arg.substring(0, ph.precision) : arg) + break + case 'T': + arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase() + arg = (ph.precision ? arg.substring(0, ph.precision) : arg) + break + case 'u': + arg = parseInt(arg, 10) >>> 0 + break + case 'v': + arg = arg.valueOf() + arg = (ph.precision ? arg.substring(0, ph.precision) : arg) + break + case 'x': + arg = (parseInt(arg, 10) >>> 0).toString(16) + break + case 'X': + arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase() + break + } + if (re.json.test(ph.type)) { + output += arg + } else { + if (re.number.test(ph.type) && (!is_positive || ph.sign)) { + sign = is_positive ? '+' : '-' + arg = arg.toString().replace(re.sign, '') + } else { + sign = '' + } + pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' ' + pad_length = ph.width - (sign + arg).length + pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : '' + output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg) + } + } + } + return output + } + var sprintf_cache = Object.create(null) + + function sprintf_parse(fmt) { + var _fmt = fmt, + match, parse_tree = [], + arg_names = 0; + while (_fmt) { + if ((match = re.text.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } else if ((match = re.modulo.exec(_fmt)) !== null) { + parse_tree.push('%'); + } else if ((match = re.placeholder.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1 + var field_list = [], + replacement_field = match[2], + field_match = [] + if ((field_match = re.key.exec(replacement_field)) !== null) { + field_list.push(field_match[1]) + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { + if ((field_match = re.key_access.exec(replacement_field)) !== null) { + field_list.push(field_match[1]) + } else if ((field_match = re.index_access.exec(replacement_field)) !== null) { + field_list.push(field_match[1]) + } else { + throw new SyntaxError('[sprintf] failed to parse named argument key') + } + } + } else { + throw new SyntaxError('[sprintf] failed to parse named argument key') + } + match[2] = field_list + } else { + arg_names |= 2 + } + if (arg_names === 3) { + throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported') + } + parse_tree.push({ + placeholder: match[0], + param_no: match[1], + keys: match[2], + sign: match[3], + pad_char: match[4], + align: match[5], + width: match[6], + precision: match[7], + type: match[8] + }) + } else if ((match = re.mod.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } else if ((match = re.notplaceholder.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } else { + throw new SyntaxError('[sprintf] unexpected placeholder') + } + _fmt = _fmt.substring(match[0].length) + } + return parse_tree + } + app.sprintf = sprintf; + app.vsprintf = vsprintf; + return app; + } + var Constructor = function(options) { + var publicAPIs = {}; + var settings; + + function getPayload() { + var payload = { + "url": document.location.pathname || '/', + "application": settings.application + }; + var payload_data = []; + if (document.documentMode) payload_data.push({ + "key": "Document-Mode", + "value": document.documentMode + }); + if (window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth) payload_data.push({ + "key": "Browser-Width", + "value": window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth + }); + if (window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight) payload_data.push({ + "key": "Browser-Height", + "value": window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight + }); + if ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type) !== undefined) payload_data.push({ + "key": "Screen-Orientation", + "value": ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type).split("-"))[0] + }); + if (screen.width) payload_data.push({ + "key": "Screen-Width", + "value": screen.width + }); + if (screen.height) payload_data.push({ + "key": "Screen-Height", + "value": screen.height + }); + if (screen.colorDepth) payload_data.push({ + "key": "Color-Depth", + "value": screen.colorDepth + }); + payload_data.push({ + "key": "X-ELMAHIO-SEARCH-isClientside", + "value": "true" + }); + payload.data = payload_data; + var payload_serverVariables = []; + if (navigator.language) payload_serverVariables.push({ + "key": "User-Language", + "value": navigator.language + }); + if (navigator.userAgent) payload_serverVariables.push({ + "key": "User-Agent", + "value": navigator.userAgent + }); + if (document.referrer) payload_serverVariables.push({ + "key": "Referer", + "value": document.referrer + }); + if (document.location.protocol === "https:") payload_serverVariables.push({ + "key": "HTTPS", + "value": 'on' + }); + if (document.location.hostname) payload_serverVariables.push({ + "key": "Host", + "value": document.location.hostname + }); + payload.serverVariables = payload_serverVariables; + return payload; + } + + function confirmResponse(status, response) { + if (settings.debug) { + if (status === 'error') { + console.log('%c \u2BC8 Error log: ' + '%c \u2715 Not created ', debugSettings.lightCSS, debugSettings.errorCSS); + } else if (status === 'success') { + console.log('%c \u2BC8 Error log: ' + '%c \u2714 ' + response + ' at ' + new Date().toLocaleString() + ' ', debugSettings.lightCSS, debugSettings.successCSS); + } else { + console.log('%c \u2BC8 Error log: ' + '%c \u2715 Not created. Title should not be undefined, null or empty ! ', debugSettings.lightCSS, debugSettings.errorCSS); + } + } + } + + function stackGPS(error, xhr, jsonData) { + var errorStack = error.toString().split("\n")[0]; + var gps = new StackTraceGPS(); + var promise = new Promise(function(resolve) { + var stackframes = ErrorStackParser.parse(error); + resolve(Promise.all(stackframes.map(function(sf) { + return new Promise(function(resolve) { + function resolveOriginal() { + resolve(sf); + } + gps.pinpoint(sf).then(resolve, resolveOriginal)['catch'](resolveOriginal); + }); + }))); + }); + promise.then(function(newFrames) { + newFrames.forEach(function(stackFrame, i) { + if (stackFrame.functionName) { + var fn = stackFrame.functionName + ' '; + } else { + var fn = ''; + } + var stackString = ' at ' + fn + '(' + stackFrame.fileName + ':' + stackFrame.lineNumber + ':' + stackFrame.columnNumber + ')'; + newFrames[i] = stackString; + }); + newFrames.unshift(errorStack); + jsonData.detail = newFrames.join("\n"); + xhr.send(JSON.stringify(jsonData)); + }); + } + + function stackString(error) { + var typeOF = typeof error.error; + var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1); + return typeOFCapitalized + ': ' + error.error + '\n' + ' at ' + '(' + error.source + ':' + error.lineno + ':' + error.colno + ')'; + } + var sendPayload = function(apiKey, logId, callback, errorLog) { + var api_key = apiKey, + log_id = logId, + error = errorLog, + send = 1, + queryParams = getSearchParameters(), + stack = error.error && objectLength(error.error.stack) !== 0 && typeof error.error === "object" ? ErrorStackParser.parse(error.error) : ''; + if (error && error.colno === 0 && error.lineno === 0 && (!stack || stack === '') && error.message && (error.message === "Script error." || error.message === "Script error")) { + if (settings.debug) { + console.log('%c \u2BC8 Error log: ' + '%c \uD83D\uDEC8 Ignoring error from external script ', debugSettings.lightCSS, debugSettings.warningCSS); + } + return; + } + if ((api_key !== null && log_id !== null) || (paramsLength === 2)) { + if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { + api_key = params['apiKey']; + log_id = params['logId']; + } + var xhr = new XMLHttpRequest(); + xhr.open("POST", "https://api.elmah.io/v3/messages/" + log_id + "?api_key=" + api_key, true); + xhr.setRequestHeader('Content-type', 'application/json'); + xhr.onload = function(e) { + if (xhr.readyState === 4) { + if (xhr.status === 201) { + callback('success', xhr.statusText); + } + } + }; + xhr.onerror = function(e) { + callback('error', xhr.statusText); + publicAPIs.emit('error', xhr.status, xhr.statusText); + } + var jsonData = { + "detail": error.error ? error.error.stack : null, + "title": error.message || 'Unspecified error', + "source": stack && stack.length > 0 ? stack[0].fileName : null, + "severity": "Error", + "type": error.error ? error.error.name : null, + "queryString": JSON.parse(JSON.stringify(queryParams)) + }; + if (error.error && (objectLength(error.error.stack) === 0) && typeof jsonData.detail === "undefined") { + var typeOF = typeof errorLog.error; + var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1); + jsonData.detail = stackString(errorLog); + jsonData.source = errorLog.source; + jsonData.title = "Uncaught " + typeOFCapitalized + ": " + errorLog.error; + } + jsonData = merge_objects(jsonData, getPayload()); + if (settings.filter !== null) { + if (settings.filter(jsonData)) { + send = 0; + } + } + if (send === 1) { + publicAPIs.emit('message', jsonData); + if (error.error && typeof error.error === "object" && objectLength(error.error.stack) !== 0 && typeof Promise !== "undefined" && Promise.toString().indexOf("[native code]") !== -1) { + stackGPS(error.error, xhr, jsonData); + } else { + xhr.send(JSON.stringify(jsonData)); + } + } + } else { + return console.log('Login api error'); + } + }; + var sendManualPayload = function(apiKey, logId, callback, logType, messageLog, errorLog) { + var api_key = apiKey, + log_id = logId, + type = logType, + error = errorLog, + message = messageLog, + send = 1, + queryParams = getSearchParameters(); + if ((api_key !== null && log_id !== null) || (paramsLength === 2)) { + if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { + api_key = params['apiKey']; + log_id = params['logId']; + } + var xhr = new XMLHttpRequest(); + xhr.open("POST", "https://api.elmah.io/v3/messages/" + log_id + "?api_key=" + api_key, true); + xhr.setRequestHeader('Content-type', 'application/json'); + xhr.onload = function(e) { + if (xhr.readyState === 4) { + if (xhr.status === 201) { + callback('success', xhr.statusText); + } + } + }; + xhr.onerror = function(e) { + callback('error', xhr.statusText); + publicAPIs.emit('error', xhr.status, xhr.statusText); + } + if (type !== "Log") { + var stack = error ? ErrorStackParser.parse(error) : null; + var jsonData = { + "title": message, + "source": stack && stack.length > 0 ? stack[0].fileName : null, + "detail": error ? error.stack : null, + "severity": type, + "type": error ? error.name : null, + "queryString": JSON.parse(JSON.stringify(queryParams)) + }; + jsonData = merge_objects(jsonData, getPayload()); + } else { + jsonData = error; + } + if (settings.filter !== null) { + if (settings.filter(jsonData)) { + send = 0; + } + } + if (send === 1) { + if (jsonData.title) { + publicAPIs.emit('message', jsonData); + if (error && type !== "Log" && typeof Promise !== "undefined" && Promise.toString().indexOf("[native code]") !== -1) { + stackGPS(error, xhr, jsonData); + } else { + xhr.send(JSON.stringify(jsonData)); + } + } else { + callback('missing-title', xhr.statusText); + } + } + } else { + return console.log('Login api error'); + } + }; + var sendPayloadFromConsole = function(apiKey, logId, callback, logType, errorLog) { + var api_key = apiKey, + log_id = logId, + message = errorLog.message, + messageTemplate = errorLog.message, + type = logType, + args = Object.values(errorLog.arguments), + send = 1, + queryParams = getSearchParameters(); + if (String(message).match(/(%d|%s)+/ig) && args.length > 1) { + var sprintfJS = new sprintfjs(); + args.shift(); + message = sprintfJS.vsprintf(message, args); + } + if (typeof message !== "string") { + message = message.toString(); + } + if (typeof messageTemplate !== "string") { + messageTemplate = messageTemplate.toString(); + } + if ((api_key !== null && log_id !== null) || (paramsLength === 2)) { + if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { + api_key = params['apiKey']; + log_id = params['logId']; + } + var xhr = new XMLHttpRequest(); + xhr.open("POST", "https://api.elmah.io/v3/messages/" + log_id + "?api_key=" + api_key, true); + xhr.setRequestHeader('Content-type', 'application/json'); + xhr.onload = function(e) { + if (xhr.readyState === 4) { + if (xhr.status === 201) { + callback('success', xhr.statusText); + } + } + }; + xhr.onerror = function(e) { + callback('error', xhr.statusText); + publicAPIs.emit('error', xhr.status, xhr.statusText); + } + + function manipulateStack(errorStack, severity, message) { + var stack = []; + for (var i = 0; i < errorStack.length; i++) { + if (errorStack[i] === "Error") { + stack.push(severity + ": " + message); + } + if (!errorStack[i].match(/elmahio.js|elmahio.min.js/g) && errorStack[i] !== "Error") { + stack.push(errorStack[i]); + } + } + return stack.join('\n'); + } + var jsonData = { + "title": message, + "titleTemplate": messageTemplate, + "detail": manipulateStack(new Error().stack.split('\n'), type, message), + "severity": type, + "type": null, + "queryString": JSON.parse(JSON.stringify(queryParams)) + }; + jsonData = merge_objects(jsonData, getPayload()); + if (settings.filter !== null) { + if (settings.filter(jsonData)) { + send = 0; + } + } + if (send === 1) { + if (jsonData.title) { + publicAPIs.emit('message', jsonData); + xhr.send(JSON.stringify(jsonData)); + } else { + callback('missing-title', xhr.statusText); + } + } + } else { + return console.log('Login api error'); + } + }; + publicAPIs.error = function(msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg); + }; + publicAPIs.error = function(msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg, error); + }; + publicAPIs.verbose = function(msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg); + }; + publicAPIs.verbose = function(msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg, error); + }; + publicAPIs.debug = function(msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg); + }; + publicAPIs.debug = function(msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg, error); + }; + publicAPIs.information = function(msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg); + }; + publicAPIs.information = function(msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg, error); + }; + publicAPIs.warning = function(msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg); + }; + publicAPIs.warning = function(msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg, error); + }; + publicAPIs.fatal = function(msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg); + }; + publicAPIs.fatal = function(msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg, error); + }; + publicAPIs.log = function(obj) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Log', null, obj); + }; + publicAPIs.message = function() { + return getPayload(); + }; + publicAPIs.on = function(name, callback, ctx) { + var e = this.e || (this.e = {}); + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx: ctx + }); + return this; + }; + publicAPIs.emit = function(name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + return this; + }; + publicAPIs.init = function(options) { + settings = extend(defaults, options || {}); + window.onerror = function(message, source, lineno, colno, error) { + var errorLog = { + 'message': message, + 'source': source, + 'lineno': lineno, + 'colno': colno, + 'error': error + } + sendPayload(settings.apiKey, settings.logId, confirmResponse, errorLog); + return false; + } + if (options.captureConsoleMinimumLevel !== "none") { + if (options.captureConsoleMinimumLevel === "info" || options.captureConsoleMinimumLevel === "warn" || options.captureConsoleMinimumLevel === "error" || options.captureConsoleMinimumLevel === "debug") { + var _error = console.error; + console.error = function(errMessage) { + var errorLog = { + 'message': errMessage, + 'arguments': arguments + } + sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Error', errorLog); + _error.apply(console, arguments); + }; + if (options.captureConsoleMinimumLevel !== "error") { + var _warning = console.warn; + console.warn = function(warnMessage) { + var errorLog = { + 'message': warnMessage, + 'arguments': arguments + } + sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Warning', errorLog); + _warning.apply(console, arguments); + }; + } + } + if (options.captureConsoleMinimumLevel === "info" || options.captureConsoleMinimumLevel === "debug") { + var _info = console.info; + console.info = function(infoMessage) { + var errorLog = { + 'message': infoMessage, + 'arguments': arguments + } + sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Information', errorLog); + _info.apply(console, arguments); + }; + } + if (options.captureConsoleMinimumLevel === "debug") { + var _debug = console.debug; + console.debug = function(debugMessage) { + var errorLog = { + 'message': debugMessage, + 'arguments': arguments + } + sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Debug', errorLog); + _debug.apply(console, arguments); + }; + } + } + }; + publicAPIs.init(options); + if (settings.debug) { + console.log('%c' + debugSettings.label, debugSettings.labelCSS); + } + return publicAPIs; + }; + if (paramsLength && params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { + return new Constructor; + } else { + return Constructor; + } +}); +//# sourceMappingURL=elmahio.js.map \ No newline at end of file diff --git a/dist/elmahio.js.map b/dist/elmahio.js.map index f2f8778..fe50ba6 100644 --- a/dist/elmahio.js.map +++ b/dist/elmahio.js.map @@ -1 +1 @@ -{"version":3,"names":[],"mappings":"","sources":["elmahio.js"],"sourcesContent":["/*!\r\n * elmah.io Javascript Logger - version 3.2.0\r\n * (c) 2018-2020 elmah.io, Apache 2.0 License, https://elmah.io\r\n */\r\n\r\n(function (root, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n define([], function () {\r\n return factory(root);\r\n });\r\n } else if (typeof exports === 'object') {\r\n module.exports = factory(root);\r\n } else {\r\n root.Elmahio = factory(root);\r\n }\r\n})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, function (window) {\r\n\r\n 'use strict';\r\n\r\n //\r\n // ==== STACKFRAME ====\r\n //\r\n\r\n var StackFrame = (function () {\r\n \"use strict\";\r\n function _isNumber(n) {\r\n return !isNaN(parseFloat(n)) && isFinite(n);\r\n }\r\n function _capitalize(str) {\r\n return str.charAt(0).toUpperCase() + str.substring(1);\r\n }\r\n function _getter(p) {\r\n return function () {\r\n return this[p];\r\n };\r\n }\r\n var booleanProps = [\"isConstructor\", \"isEval\", \"isNative\", \"isToplevel\"];\r\n var numericProps = [\"columnNumber\", \"lineNumber\"];\r\n var stringProps = [\"fileName\", \"functionName\", \"source\"];\r\n var arrayProps = [\"args\"];\r\n var props = booleanProps.concat(numericProps, stringProps, arrayProps);\r\n function StackFrame(obj) {\r\n if (obj instanceof Object) {\r\n for (var i = 0; i < props.length; i++) {\r\n if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) {\r\n this[\"set\" + _capitalize(props[i])](obj[props[i]]);\r\n }\r\n }\r\n }\r\n }\r\n StackFrame.prototype = {\r\n getArgs: function () {\r\n return this.args;\r\n },\r\n setArgs: function (v) {\r\n if (Object.prototype.toString.call(v) !== \"[object Array]\") {\r\n throw new TypeError(\"Args must be an Array\");\r\n }\r\n this.args = v;\r\n },\r\n getEvalOrigin: function () {\r\n return this.evalOrigin;\r\n },\r\n setEvalOrigin: function (v) {\r\n if (v instanceof StackFrame) {\r\n this.evalOrigin = v;\r\n } else if (v instanceof Object) {\r\n this.evalOrigin = new StackFrame(v);\r\n } else {\r\n throw new TypeError(\"Eval Origin must be an Object or StackFrame\");\r\n }\r\n },\r\n toString: function () {\r\n var functionName = this.getFunctionName() || \"{anonymous}\";\r\n var args = \"(\" + (this.getArgs() || []).join(\",\") + \")\";\r\n var fileName = this.getFileName() ? \"@\" + this.getFileName() : \"\";\r\n var lineNumber = _isNumber(this.getLineNumber()) ? \":\" + this.getLineNumber() : \"\";\r\n var columnNumber = _isNumber(this.getColumnNumber()) ? \":\" + this.getColumnNumber() : \"\";\r\n return functionName + args + fileName + lineNumber + columnNumber;\r\n }\r\n };\r\n StackFrame.fromString = function StackFrame$$fromString(str) {\r\n var argsStartIndex = str.indexOf(\"(\");\r\n var argsEndIndex = str.lastIndexOf(\")\");\r\n var functionName = str.substring(0, argsStartIndex);\r\n var args = str.substring(argsStartIndex + 1, argsEndIndex).split(\",\");\r\n var locationString = str.substring(argsEndIndex + 1);\r\n if (locationString.indexOf(\"@\") === 0) {\r\n var parts = /@(.+?)(?::(\\d+))?(?::(\\d+))?$/.exec(locationString, \"\");\r\n var fileName = parts[1];\r\n var lineNumber = parts[2];\r\n var columnNumber = parts[3];\r\n }\r\n return new StackFrame({\r\n functionName: functionName,\r\n args: args || undefined,\r\n fileName: fileName,\r\n lineNumber: lineNumber || undefined,\r\n columnNumber: columnNumber || undefined\r\n });\r\n };\r\n for (var i = 0; i < booleanProps.length; i++) {\r\n StackFrame.prototype[\"get\" + _capitalize(booleanProps[i])] = _getter(booleanProps[i]);\r\n StackFrame.prototype[\"set\" + _capitalize(booleanProps[i])] = function (p) {\r\n return function (v) {\r\n this[p] = Boolean(v);\r\n };\r\n }(booleanProps[i]);\r\n }\r\n for (var j = 0; j < numericProps.length; j++) {\r\n StackFrame.prototype[\"get\" + _capitalize(numericProps[j])] = _getter(numericProps[j]);\r\n StackFrame.prototype[\"set\" + _capitalize(numericProps[j])] = function (p) {\r\n return function (v) {\r\n if (!_isNumber(v)) {\r\n throw new TypeError(p + \" must be a Number\");\r\n }\r\n this[p] = Number(v);\r\n };\r\n }(numericProps[j]);\r\n }\r\n for (var k = 0; k < stringProps.length; k++) {\r\n StackFrame.prototype[\"get\" + _capitalize(stringProps[k])] = _getter(stringProps[k]);\r\n StackFrame.prototype[\"set\" + _capitalize(stringProps[k])] = function (p) {\r\n return function (v) {\r\n this[p] = String(v);\r\n };\r\n }(stringProps[k]);\r\n }\r\n return StackFrame;\r\n })();\r\n\r\n //\r\n // ==== ERROR STACK PARSER ====\r\n //\r\n\r\n var ErrorStackParser = (function () {\r\n \"use strict\";\r\n var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+\\:\\d+/;\r\n var CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+\\:\\d+|\\(native\\))/m;\r\n var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/;\r\n return {\r\n /**\r\n * Given an Error object, extract the most information from it.\r\n *\r\n * @param {Error} error object\r\n * @return {Array} of StackFrames\r\n */\r\n parse: function ErrorStackParser$$parse(error) {\r\n if (typeof error.stacktrace !== \"undefined\" || typeof error[\"opera#sourceloc\"] !== \"undefined\") {\r\n return this.parseOpera(error);\r\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\r\n return this.parseV8OrIE(error);\r\n } else if (error.stack) {\r\n return this.parseFFOrSafari(error);\r\n } else {\r\n throw new Error(\"Cannot parse given Error object\");\r\n }\r\n },\r\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\r\n extractLocation: function ErrorStackParser$$extractLocation(urlLike) {\r\n // Fail-fast but return locations like \"(native)\"\r\n if (urlLike.indexOf(\":\") === -1) {\r\n return [urlLike];\r\n }\r\n var regExp = /(.+?)(?:\\:(\\d+))?(?:\\:(\\d+))?$/;\r\n var parts = regExp.exec(urlLike.replace(/[\\(\\)]/g, \"\"));\r\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\r\n },\r\n parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !!line.match(CHROME_IE_STACK_REGEXP);\r\n }, this);\r\n return filtered.map(function (line) {\r\n if (line.indexOf(\"(eval \") > -1) {\r\n // Throw away eval information until we implement stacktrace.js/stackframe#8\r\n line = line.replace(/eval code/g, \"eval\").replace(/(\\(eval at [^\\()]*)|(\\)\\,.*$)/g, \"\");\r\n }\r\n var tokens = line.replace(/^\\s+/, \"\").replace(/\\(eval code/g, \"(\").split(/\\s+/).slice(1);\r\n var locationParts = this.extractLocation(tokens.pop());\r\n var functionName = tokens.join(\" \") || undefined;\r\n var fileName = [\"eval\", \"\"].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];\r\n return new StackFrame({\r\n functionName: functionName,\r\n fileName: fileName,\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }, this);\r\n },\r\n parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\r\n }, this);\r\n return filtered.map(function (line) {\r\n // Throw away eval information until we implement stacktrace.js/stackframe#8\r\n if (line.indexOf(\" > eval\") > -1) {\r\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval\\:\\d+\\:\\d+/g, \":$1\");\r\n }\r\n if (line.indexOf(\"@\") === -1 && line.indexOf(\":\") === -1) {\r\n // Safari eval frames only have function names and nothing else\r\n return new StackFrame({\r\n functionName: line\r\n });\r\n } else {\r\n var functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\r\n var matches = line.match(functionNameRegex);\r\n var functionName = matches && matches[1] ? matches[1] : undefined;\r\n var locationParts = this.extractLocation(line.replace(functionNameRegex, \"\"));\r\n return new StackFrame({\r\n functionName: functionName,\r\n fileName: locationParts[0],\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }\r\n }, this);\r\n },\r\n parseOpera: function ErrorStackParser$$parseOpera(e) {\r\n if (!e.stacktrace || e.message.indexOf(\"\\n\") > -1 && e.message.split(\"\\n\").length > e.stacktrace.split(\"\\n\").length) {\r\n return this.parseOpera9(e);\r\n } else if (!e.stack) {\r\n return this.parseOpera10(e);\r\n } else {\r\n return this.parseOpera11(e);\r\n }\r\n },\r\n parseOpera9: function ErrorStackParser$$parseOpera9(e) {\r\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\r\n var lines = e.message.split(\"\\n\");\r\n var result = [];\r\n for (var i = 2, len = lines.length; i < len; i += 2) {\r\n var match = lineRE.exec(lines[i]);\r\n if (match) {\r\n result.push(new StackFrame({\r\n fileName: match[2],\r\n lineNumber: match[1],\r\n source: lines[i]\r\n }));\r\n }\r\n }\r\n return result;\r\n },\r\n parseOpera10: function ErrorStackParser$$parseOpera10(e) {\r\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\r\n var lines = e.stacktrace.split(\"\\n\");\r\n var result = [];\r\n for (var i = 0, len = lines.length; i < len; i += 2) {\r\n var match = lineRE.exec(lines[i]);\r\n if (match) {\r\n result.push(new StackFrame({\r\n functionName: match[3] || undefined,\r\n fileName: match[2],\r\n lineNumber: match[1],\r\n source: lines[i]\r\n }));\r\n }\r\n }\r\n return result;\r\n },\r\n // Opera 10.65+ Error.stack very similar to FF/Safari\r\n parseOpera11: function ErrorStackParser$$parseOpera11(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);\r\n }, this);\r\n return filtered.map(function (line) {\r\n var tokens = line.split(\"@\");\r\n var locationParts = this.extractLocation(tokens.pop());\r\n var functionCall = tokens.shift() || \"\";\r\n var functionName = functionCall.replace(//, \"$2\").replace(/\\([^\\)]*\\)/g, \"\") || undefined;\r\n var argsRaw;\r\n if (functionCall.match(/\\(([^\\)]*)\\)/)) {\r\n argsRaw = functionCall.replace(/^[^\\(]+\\(([^\\)]*)\\)$/, \"$1\");\r\n }\r\n var args = argsRaw === undefined || argsRaw === \"[arguments not available]\" ? undefined : argsRaw.split(\",\");\r\n return new StackFrame({\r\n functionName: functionName,\r\n args: args,\r\n fileName: locationParts[0],\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }, this);\r\n }\r\n };\r\n })();\r\n\r\n //\r\n // ==== STACKTRACE-GPS ====\r\n //\r\n\r\n var SourceMap = function(e){var n={};function r(t){if(n[t])return n[t].exports;var o=n[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}return r.m=e,r.c=n,r.p=\"\",r(0)}([function(e,n,r){var t=r(1),o=r(2),i=r(3).ArraySet,a=r(4),s=r(6).quickSort;function u(e){var n=e;return\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\"))),null!=n.sections?new c(n):new l(n)}function l(e){var n=e;\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\")));var r=t.getArg(n,\"version\"),o=t.getArg(n,\"sources\"),a=t.getArg(n,\"names\",[]),s=t.getArg(n,\"sourceRoot\",null),u=t.getArg(n,\"sourcesContent\",null),l=t.getArg(n,\"mappings\"),g=t.getArg(n,\"file\",null);if(r!=this._version)throw new Error(\"Unsupported version: \"+r);o=o.map(String).map(t.normalize).map(function(e){return s&&t.isAbsolute(s)&&t.isAbsolute(e)?t.relative(s,e):e}),this._names=i.fromArray(a.map(String),!0),this._sources=i.fromArray(o,!0),this.sourceRoot=s,this.sourcesContent=u,this._mappings=l,this.file=g}function g(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function c(e){var n=e;\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\")));var r=t.getArg(n,\"version\"),o=t.getArg(n,\"sections\");if(r!=this._version)throw new Error(\"Unsupported version: \"+r);this._sources=new i,this._names=new i;var a={line:-1,column:0};this._sections=o.map(function(e){if(e.url)throw new Error(\"Support for url field in sections not implemented.\");var n=t.getArg(e,\"offset\"),r=t.getArg(n,\"line\"),o=t.getArg(n,\"column\");if(r=0){var s=this._originalMappings[a];if(void 0===e.column)for(var u=s.originalLine;s&&s.originalLine===u;)i.push({line:t.getArg(s,\"generatedLine\",null),column:t.getArg(s,\"generatedColumn\",null),lastColumn:t.getArg(s,\"lastGeneratedColumn\",null)}),s=this._originalMappings[++a];else for(var l=s.originalColumn;s&&s.originalLine===n&&s.originalColumn==l;)i.push({line:t.getArg(s,\"generatedLine\",null),column:t.getArg(s,\"generatedColumn\",null),lastColumn:t.getArg(s,\"lastGeneratedColumn\",null)}),s=this._originalMappings[++a]}return i},n.SourceMapConsumer=u,l.prototype=Object.create(u.prototype),l.prototype.consumer=u,l.fromSourceMap=function(e){var n=Object.create(l.prototype),r=n._names=i.fromArray(e._names.toArray(),!0),o=n._sources=i.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var a=e._mappings.toArray().slice(),u=n.__generatedMappings=[],c=n.__originalMappings=[],p=0,h=a.length;p1&&(r.source=d+i[1],d+=i[1],r.originalLine=h+i[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+i[3],f=r.originalColumn,i.length>4&&(r.name=m+i[4],m+=i[4])),L.push(r),\"number\"==typeof r.originalLine&&y.push(r)}s(L,t.compareByGeneratedPositionsDeflated),this.__generatedMappings=L,s(y,t.compareByOriginalPositions),this.__originalMappings=y},l.prototype._findMapping=function(e,n,r,t,i,a){if(e[r]<=0)throw new TypeError(\"Line must be greater than or equal to 1, got \"+e[r]);if(e[t]<0)throw new TypeError(\"Column must be greater than or equal to 0, got \"+e[t]);return o.search(e,n,i,a)},l.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=t.getArg(o,\"source\",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=t.join(this.sourceRoot,i)));var a=t.getArg(o,\"name\",null);return null!==a&&(a=this._names.at(a)),{source:i,line:t.getArg(o,\"originalLine\",null),column:t.getArg(o,\"originalColumn\",null),name:a}}}return{source:null,line:null,column:null,name:null}},l.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},l.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=t.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=t.urlParse(this.sourceRoot))){var o=e.replace(/^file:\\/\\//,\"\");if(\"file\"==r.scheme&&this._sources.has(o))return this.sourcesContent[this._sources.indexOf(o)];if((!r.path||\"/\"==r.path)&&this._sources.has(\"/\"+e))return this.sourcesContent[this._sources.indexOf(\"/\"+e)]}if(n)return null;throw new Error('\"'+e+'\" is not in the SourceMap.')},l.prototype.generatedPositionFor=function(e){var n=t.getArg(e,\"source\");if(null!=this.sourceRoot&&(n=t.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};var r={source:n=this._sources.indexOf(n),originalLine:t.getArg(e,\"line\"),originalColumn:t.getArg(e,\"column\")},o=this._findMapping(r,this._originalMappings,\"originalLine\",\"originalColumn\",t.compareByOriginalPositions,t.getArg(e,\"bias\",u.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:t.getArg(i,\"generatedLine\",null),column:t.getArg(i,\"generatedColumn\",null),lastColumn:t.getArg(i,\"lastGeneratedColumn\",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=l,c.prototype=Object.create(u.prototype),c.prototype.constructor=u,c.prototype._version=3,Object.defineProperty(c.prototype,\"sources\",{get:function(){for(var e=[],n=0;n=0;g--)\".\"===(a=u[g])?u.splice(g,1):\"..\"===a?l++:l>0&&(\"\"===a?(u.splice(g+1,l),l=0):(u.splice(g,2),l--));return\"\"===(r=u.join(\"/\"))&&(r=s?\"/\":\".\"),t?(t.path=r,i(t)):r}n.urlParse=o,n.urlGenerate=i,n.normalize=a,n.join=function(e,n){\"\"===e&&(e=\".\"),\"\"===n&&(n=\".\");var r=o(n),s=o(e);if(s&&(e=s.path||\"/\"),r&&!r.scheme)return s&&(r.scheme=s.scheme),i(r);if(r||n.match(t))return n;if(s&&!s.host&&!s.path)return s.host=n,i(s);var u=\"/\"===n.charAt(0)?n:a(e.replace(/\\/+$/,\"\")+\"/\"+n);return s?(s.path=u,i(s)):u},n.isAbsolute=function(e){return\"/\"===e.charAt(0)||!!e.match(r)},n.relative=function(e,n){\"\"===e&&(e=\".\"),e=e.replace(/\\/$/,\"\");for(var r=0;0!==n.indexOf(e+\"/\");){var t=e.lastIndexOf(\"/\");if(t<0)return n;if((e=e.slice(0,t)).match(/^([^\\/]+:\\/)?\\/*$/))return n;++r}return Array(r+1).join(\"../\")+n.substr(e.length+1)};var s=!(\"__proto__\"in Object.create(null));function u(e){return e}function l(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function g(e,n){return e===n?0:e>n?1:-1}n.toSetString=s?u:function(e){return l(e)?\"$\"+e:e},n.fromSetString=s?u:function(e){return l(e)?e.slice(1):e},n.compareByOriginalPositions=function(e,n,r){var t=e.source-n.source;return 0!==t?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)||r?t:0!=(t=e.generatedColumn-n.generatedColumn)?t:0!=(t=e.generatedLine-n.generatedLine)?t:e.name-n.name},n.compareByGeneratedPositionsDeflated=function(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:0!=(t=e.generatedColumn-n.generatedColumn)||r?t:0!=(t=e.source-n.source)?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)?t:e.name-n.name},n.compareByGeneratedPositionsInflated=function(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:0!=(r=e.generatedColumn-n.generatedColumn)?r:0!==(r=g(e.source,n.source))?r:0!=(r=e.originalLine-n.originalLine)?r:0!=(r=e.originalColumn-n.originalColumn)?r:g(e.name,n.name)}},function(e,n){n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,r,t,o){if(0===r.length)return-1;var i=function e(r,t,o,i,a,s){var u=Math.floor((t-r)/2)+r,l=a(o,i[u],!0);return 0===l?u:l>0?t-u>1?e(u,t,o,i,a,s):s==n.LEAST_UPPER_BOUND?t1?e(r,u,o,i,a,s):s==n.LEAST_UPPER_BOUND?u:r<0?-1:r}(-1,r.length,e,r,t,o||n.GREATEST_LOWER_BOUND);if(i<0)return-1;for(;i-1>=0&&0===t(r[i],r[i-1],!0);)--i;return i}},function(e,n,r){var t=r(1),o=Object.prototype.hasOwnProperty;function i(){this._array=[],this._set=Object.create(null)}i.fromArray=function(e,n){for(var r=new i,t=0,o=e.length;t=0&&e>>=5)>0&&(n|=32),o+=t.encode(n)}while(i>0);return o},n.decode=function(e,n,r){var o,i,a,s,u=e.length,l=0,g=0;do{if(n>=u)throw new Error(\"Expected more digits in base 64 VLQ value.\");if(-1===(i=t.decode(e.charCodeAt(n++))))throw new Error(\"Invalid base64 digit: \"+e.charAt(n-1));o=!!(32&i),l+=(i&=31)<>1,1==(1&a)?-s:s),r.rest=n}},function(e,n){var r=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");n.encode=function(e){if(0<=e&&e= 200 && req.status < 300 || url.substr(0, 7) === \"file://\" && req.responseText) {\r\n resolve(req.responseText);\r\n } else {\r\n reject(new Error(\"HTTP status: \" + req.status + \" retrieving \" + url));\r\n }\r\n }\r\n };\r\n req.send();\r\n });\r\n }\r\n /**\r\n * Convert a Base64-encoded string into its original representation.\r\n * Used for inline sourcemaps.\r\n *\r\n * @param {String} b64str Base-64 encoded string\r\n * @returns {String} original representation of the base64-encoded string.\r\n */\r\n function _atob(b64str) {\r\n if (typeof window !== \"undefined\" && window.atob) {\r\n return window.atob(b64str);\r\n } else {\r\n throw new Error(\"You must supply a polyfill for window.atob in this environment\");\r\n }\r\n }\r\n function _parseJson(string) {\r\n if (typeof JSON !== \"undefined\" && JSON.parse) {\r\n return JSON.parse(string);\r\n } else {\r\n throw new Error(\"You must supply a polyfill for JSON.parse in this environment\");\r\n }\r\n }\r\n function _findFunctionName(source, lineNumber) {\r\n var syntaxes = [ // {name} = function ({args}) TODO args capture\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*function\\b/, // function {name}({args}) m[1]=name m[2]=args\r\n /function\\s+([^('\"`]*?)\\s*\\(([^)]*)\\)/, // {name} = eval()\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*(?:eval|new Function)\\b/, // fn_name() {\r\n /\\b(?!(?:if|for|switch|while|with|catch)\\b)(?:(?:static)\\s+)?(\\S+)\\s*\\(.*?\\)\\s*\\{/, // {name} = () => {\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*\\(.*?\\)\\s*=>/];\r\n var lines = source.split(\"\\n\");\r\n // Walk backwards in the source lines until we find the line which matches one of the patterns above\r\n var code = \"\";\r\n var maxLines = Math.min(lineNumber, 20);\r\n for (var i = 0; i < maxLines; ++i) {\r\n // lineNo is 1-based, source[] is 0-based\r\n var line = lines[lineNumber - i - 1];\r\n var commentPos = line.indexOf(\"//\");\r\n if (commentPos >= 0) {\r\n line = line.substr(0, commentPos);\r\n }\r\n if (line) {\r\n code = line + code;\r\n var len = syntaxes.length;\r\n for (var index = 0; index < len; index++) {\r\n var m = syntaxes[index].exec(code);\r\n if (m && m[1]) {\r\n return m[1];\r\n }\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n function _ensureSupportedEnvironment() {\r\n if (typeof Object.defineProperty !== \"function\" || typeof Object.create !== \"function\") {\r\n throw new Error(\"Unable to consume source maps in older browsers\");\r\n }\r\n }\r\n function _ensureStackFrameIsLegit(stackframe) {\r\n if (typeof stackframe !== \"object\") {\r\n throw new TypeError(\"Given StackFrame is not an object\");\r\n } else if (typeof stackframe.fileName !== \"string\") {\r\n throw new TypeError(\"Given file name is not a String\");\r\n } else if (typeof stackframe.lineNumber !== \"number\" || stackframe.lineNumber % 1 !== 0 || stackframe.lineNumber < 1) {\r\n throw new TypeError(\"Given line number must be a positive integer\");\r\n } else if (typeof stackframe.columnNumber !== \"number\" || stackframe.columnNumber % 1 !== 0 || stackframe.columnNumber < 0) {\r\n throw new TypeError(\"Given column number must be a non-negative integer\");\r\n }\r\n return true;\r\n }\r\n function _findSourceMappingURL(source) {\r\n var sourceMappingUrlRegExp = /\\/\\/[#@] ?sourceMappingURL=([^\\s'\"]+)\\s*$/gm;\r\n var lastSourceMappingUrl;\r\n var matchSourceMappingUrl;\r\n while (matchSourceMappingUrl = sourceMappingUrlRegExp.exec(source)) {\r\n // jshint ignore:line\r\n lastSourceMappingUrl = matchSourceMappingUrl[1];\r\n }\r\n if (lastSourceMappingUrl) {\r\n return lastSourceMappingUrl;\r\n } else {\r\n throw new Error(\"sourceMappingURL not found\");\r\n }\r\n }\r\n function _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache) {\r\n return new Promise(function (resolve, reject) {\r\n var loc = sourceMapConsumer.originalPositionFor({\r\n line: stackframe.lineNumber,\r\n column: stackframe.columnNumber\r\n });\r\n if (loc.source) {\r\n // cache mapped sources\r\n var mappedSource = sourceMapConsumer.sourceContentFor(loc.source);\r\n if (mappedSource) {\r\n sourceCache[loc.source] = mappedSource;\r\n }\r\n resolve(// given stackframe and source location, update stackframe\r\n new StackFrame({\r\n functionName: loc.name || stackframe.functionName,\r\n args: stackframe.args,\r\n fileName: loc.source,\r\n lineNumber: loc.line,\r\n columnNumber: loc.column\r\n }));\r\n } else {\r\n reject(new Error(\"Could not get original source for given stackframe and source map\"));\r\n }\r\n });\r\n }\r\n /**\r\n * @constructor\r\n * @param {Object} opts\r\n * opts.sourceCache = {url: \"Source String\"} => preload source cache\r\n * opts.sourceMapConsumerCache = {/path/file.js.map: SourceMapConsumer}\r\n * opts.offline = True to prevent network requests.\r\n * Best effort without sources or source maps.\r\n * opts.ajax = Promise returning function to make X-Domain requests\r\n */\r\n return function StackTraceGPS(opts) {\r\n if (!(this instanceof StackTraceGPS)) {\r\n return new StackTraceGPS(opts);\r\n }\r\n opts = opts || {};\r\n this.sourceCache = opts.sourceCache || {};\r\n this.sourceMapConsumerCache = opts.sourceMapConsumerCache || {};\r\n this.ajax = opts.ajax || _xdr;\r\n this._atob = opts.atob || _atob;\r\n\r\n this._get = function _get(location) {\r\n return new Promise(function (resolve, reject) {\r\n var isDataUrl = location.substr(0, 5) === \"data:\";\r\n if (this.sourceCache[location]) {\r\n resolve(this.sourceCache[location]);\r\n } else if (opts.offline && !isDataUrl) {\r\n reject(new Error(\"Cannot make network requests in offline mode\"));\r\n } else {\r\n if (isDataUrl) {\r\n // data URLs can have parameters.\r\n // see http://tools.ietf.org/html/rfc2397\r\n var supportedEncodingRegexp = /^data:application\\/json;([\\w=:\"-]+;)*base64,/;\r\n var match = location.match(supportedEncodingRegexp);\r\n if (match) {\r\n var sourceMapStart = match[0].length;\r\n var encodedSource = location.substr(sourceMapStart);\r\n var source = this._atob(encodedSource);\r\n this.sourceCache[location] = source;\r\n resolve(source);\r\n } else {\r\n reject(new Error(\"The encoding of the inline sourcemap is not supported\"));\r\n }\r\n } else {\r\n var xhrPromise = this.ajax(location, {\r\n method: \"get\"\r\n });\r\n // Cache the Promise to prevent duplicate in-flight requests\r\n this.sourceCache[location] = xhrPromise;\r\n xhrPromise.then(resolve, reject);\r\n }\r\n }\r\n }.bind(this));\r\n };\r\n /**\r\n * Creating SourceMapConsumers is expensive, so this wraps the creation of a\r\n * SourceMapConsumer in a per-instance cache.\r\n *\r\n * @param {String} sourceMappingURL = URL to fetch source map from\r\n * @param {String} defaultSourceRoot = Default source root for source map if undefined\r\n * @returns {Promise} that resolves a SourceMapConsumer\r\n */\r\n this._getSourceMapConsumer = function _getSourceMapConsumer(sourceMappingURL, defaultSourceRoot) {\r\n return new Promise(function (resolve, reject) {\r\n if (this.sourceMapConsumerCache[sourceMappingURL]) {\r\n resolve(this.sourceMapConsumerCache[sourceMappingURL]);\r\n } else {\r\n var sourceMapConsumerPromise = new Promise(function (resolve, reject) {\r\n return this._get(sourceMappingURL).then(function (sourceMapSource) {\r\n if (typeof sourceMapSource === \"string\") {\r\n sourceMapSource = _parseJson(sourceMapSource.replace(/^\\)\\]\\}'/, \"\"));\r\n }\r\n if (typeof sourceMapSource.sourceRoot === \"undefined\") {\r\n sourceMapSource.sourceRoot = defaultSourceRoot;\r\n }\r\n resolve(new SourceMap.SourceMapConsumer(sourceMapSource));\r\n }, reject);\r\n }.bind(this));\r\n this.sourceMapConsumerCache[sourceMappingURL] = sourceMapConsumerPromise;\r\n resolve(sourceMapConsumerPromise);\r\n }\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, enhance function name and use source maps for a\r\n * better StackFrame.\r\n *\r\n * @param {StackFrame} stackframe object\r\n * @returns {Promise} that resolves with with source-mapped StackFrame\r\n */\r\n this.pinpoint = function StackTraceGPS$$pinpoint(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n this.getMappedLocation(stackframe).then(function (mappedStackFrame) {\r\n function resolveMappedStackFrame() {\r\n resolve(mappedStackFrame);\r\n }\r\n this.findFunctionName(mappedStackFrame).then(resolve, resolveMappedStackFrame)[\"catch\"](resolveMappedStackFrame);\r\n }.bind(this), reject);\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, guess function name from location information.\r\n *\r\n * @param {StackFrame} stackframe\r\n * @returns {Promise} that resolves with enhanced StackFrame.\r\n */\r\n this.findFunctionName = function StackTraceGPS$$findFunctionName(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n _ensureStackFrameIsLegit(stackframe);\r\n this._get(stackframe.fileName).then(function getSourceCallback(source) {\r\n var lineNumber = stackframe.lineNumber;\r\n var columnNumber = stackframe.columnNumber;\r\n var guessedFunctionName = _findFunctionName(source, lineNumber, columnNumber);\r\n // Only replace functionName if we found something\r\n if (guessedFunctionName) {\r\n resolve(new StackFrame({\r\n functionName: guessedFunctionName,\r\n args: stackframe.args,\r\n fileName: stackframe.fileName,\r\n lineNumber: lineNumber,\r\n columnNumber: columnNumber\r\n }));\r\n } else {\r\n resolve(stackframe);\r\n }\r\n }, reject)[\"catch\"](reject);\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, seek source-mapped location and return new enhanced StackFrame.\r\n *\r\n * @param {StackFrame} stackframe\r\n * @returns {Promise} that resolves with enhanced StackFrame.\r\n */\r\n this.getMappedLocation = function StackTraceGPS$$getMappedLocation(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n _ensureSupportedEnvironment();\r\n _ensureStackFrameIsLegit(stackframe);\r\n var sourceCache = this.sourceCache;\r\n var fileName = stackframe.fileName;\r\n this._get(fileName).then(function (source) {\r\n var sourceMappingURL = _findSourceMappingURL(source);\r\n var isDataUrl = sourceMappingURL.substr(0, 5) === \"data:\";\r\n var defaultSourceRoot = fileName.substring(0, fileName.lastIndexOf(\"/\") + 1);\r\n if (sourceMappingURL[0] !== \"/\" && !isDataUrl && !/^https?:\\/\\/|^\\/\\//i.test(sourceMappingURL)) {\r\n sourceMappingURL = defaultSourceRoot + sourceMappingURL;\r\n }\r\n return this._getSourceMapConsumer(sourceMappingURL, defaultSourceRoot).then(function (sourceMapConsumer) {\r\n return _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache).then(resolve)[\"catch\"](function () {\r\n resolve(stackframe);\r\n });\r\n });\r\n }.bind(this), reject)[\"catch\"](reject);\r\n }.bind(this));\r\n };\r\n };\r\n })(SourceMap, StackFrame);\r\n\r\n //\r\n // Shared Variables\r\n //\r\n\r\n var scriptFile = document.getElementsByTagName('script');\r\n var scriptIndex = scriptFile.length - 1;\r\n var myScript = scriptFile[scriptIndex];\r\n var queryString = myScript.src.replace(/^[^\\?]+\\??/, '');\r\n var params = parseQuery(queryString);\r\n var paramsLength = objectLength(params);\r\n\r\n var debugSettings = {\r\n label: ' elmah.io debugger : On ',\r\n labelCSS: 'background: #06a89c; color: #ffffff; display: inline-block; font-size: 14px;',\r\n successCSS: 'background: #d4edda; color: #155724; display: inline-block; font-size: 13px;',\r\n errorCSS: 'background: #f8d7da; color: #721c24; display: inline-block; font-size: 13px;',\r\n warningCSS: 'background: #fff3cd; color: #856404; display: inline-block; font-size: 13px;',\r\n lightCSS: 'background: #e2e3e5; color: #383d41; display: inline-block; font-size: 13px;'\r\n };\r\n\r\n var defaults = {\r\n apiKey: null,\r\n logId: null,\r\n debug: false,\r\n application: null,\r\n filter: null\r\n };\r\n\r\n //\r\n // Shared Methods\r\n //\r\n\r\n var extend = function () {\r\n\r\n // Variables\r\n var extended = {};\r\n var deep = false;\r\n var i = 0;\r\n\r\n // Check if a deep merge\r\n if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') {\r\n deep = arguments[0];\r\n i++;\r\n }\r\n\r\n // Merge the object into the extended object\r\n var merge = function (obj) {\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n // If property is an object, merge properties\r\n if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') {\r\n extended[prop] = extend(extended[prop], obj[prop]);\r\n } else {\r\n extended[prop] = obj[prop];\r\n }\r\n }\r\n }\r\n };\r\n\r\n // Loop through each object and conduct a merge\r\n for (; i < arguments.length; i++) {\r\n var obj = arguments[i];\r\n merge(obj);\r\n }\r\n\r\n return extended;\r\n\r\n };\r\n\r\n //\r\n // Helpers\r\n //\r\n\r\n function parseQuery(query) {\r\n var Params = new Object();\r\n if (!query) return Params; // return empty object\r\n var Pairs = query.split(/[;&]/);\r\n for (var i = 0; i < Pairs.length; i++) {\r\n var KeyVal = Pairs[i].split('=');\r\n if (!KeyVal || KeyVal.length !== 2) continue;\r\n var key = unescape(KeyVal[0]);\r\n var val = unescape(KeyVal[1]);\r\n val = val.replace(/\\+/g, ' ');\r\n Params[key] = val;\r\n }\r\n return Params;\r\n }\r\n\r\n function objectLength(obj) {\r\n var size = 0, key;\r\n for (key in obj) {\r\n if (obj.hasOwnProperty(key)) size++;\r\n }\r\n return size;\r\n };\r\n\r\n function getSearchParameters() {\r\n var prmstr = window.location.search.substr(1);\r\n return prmstr !== null && prmstr !== \"\" ? transformToAssocArray(prmstr) : {};\r\n }\r\n\r\n function transformToAssocArray(prmstr) {\r\n var params = [];\r\n var prmarr = prmstr.split(\"&\");\r\n for (var i = 0; i < prmarr.length; i++) {\r\n var tmparr = prmarr[i].split(\"=\");\r\n params.push({\r\n 'key': tmparr[0],\r\n 'value': tmparr[1]\r\n });\r\n }\r\n return params;\r\n }\r\n\r\n function merge_objects(obj1, obj2) {\r\n var obj3 = {};\r\n for (var attrname1 in obj1) {\r\n obj3[attrname1] = obj1[attrname1];\r\n }\r\n for (var attrname2 in obj2) {\r\n obj3[attrname2] = obj2[attrname2];\r\n }\r\n\r\n return obj3;\r\n }\r\n\r\n //\r\n // Constructor\r\n // Can be named anything you want\r\n //\r\n\r\n var Constructor = function (options) {\r\n\r\n //\r\n // Unique Variables\r\n //\r\n\r\n var publicAPIs = {};\r\n var settings;\r\n\r\n function getPayload() {\r\n var payload = {\r\n \"url\": document.location.pathname || '/',\r\n \"application\": settings.application\r\n };\r\n\r\n var payload_data = [];\r\n\r\n if (document.documentMode) payload_data.push({ \"key\": \"Document-Mode\", \"value\": document.documentMode });\r\n if (window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth) payload_data.push({ \"key\": \"Browser-Width\", \"value\": window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth });\r\n if (window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight) payload_data.push({ \"key\": \"Browser-Height\", \"value\": window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight });\r\n if ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type) !== undefined) payload_data.push({ \"key\": \"Screen-Orientation\", \"value\": ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type).split(\"-\"))[0] });\r\n if (screen.width) payload_data.push({ \"key\": \"Screen-Width\", \"value\": screen.width });\r\n if (screen.height) payload_data.push({ \"key\": \"Screen-Height\", \"value\": screen.height });\r\n if (screen.colorDepth) payload_data.push({ \"key\": \"Color-Depth\", \"value\": screen.colorDepth });\r\n payload_data.push({ \"key\": \"X-ELMAHIO-SEARCH-isClientside\", \"value\": \"true\" });\r\n\r\n payload.data = payload_data;\r\n\r\n var payload_serverVariables = [];\r\n if (navigator.language) payload_serverVariables.push({ \"key\": \"User-Language\", \"value\": navigator.language });\r\n if (navigator.userAgent) payload_serverVariables.push({ \"key\": \"User-Agent\", \"value\": navigator.userAgent });\r\n if (document.referrer) payload_serverVariables.push({ \"key\": \"Referer\", \"value\": document.referrer });\r\n if (document.location.protocol === \"https:\") payload_serverVariables.push({ \"key\": \"HTTPS\", \"value\": 'on' });\r\n if (document.location.hostname) payload_serverVariables.push({ \"key\": \"Host\", \"value\": document.location.hostname });\r\n\r\n payload.serverVariables = payload_serverVariables;\r\n\r\n return payload;\r\n }\r\n\r\n function confirmResponse(status, response) {\r\n if (settings.debug) {\r\n if (status === 'error') {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2715 Not created ', debugSettings.lightCSS, debugSettings.errorCSS);\r\n } else if (status === 'success') {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2714 ' + response + ' at ' + new Date().toLocaleString() + ' ', debugSettings.lightCSS, debugSettings.successCSS);\r\n } else {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2715 Not created. Title should not be undefined, null or empty ! ', debugSettings.lightCSS, debugSettings.errorCSS);\r\n }\r\n }\r\n }\r\n\r\n function stackGPS(error, xhr, jsonData) {\r\n var errorStack = error.toString().split(\"\\n\")[0];\r\n var gps = new StackTraceGPS();\r\n var promise = new Promise(function(resolve) {\r\n var stackframes = ErrorStackParser.parse(error);\r\n resolve(Promise.all(stackframes.map(function(sf) {\r\n return new Promise(function(resolve) {\r\n function resolveOriginal() {\r\n resolve(sf);\r\n }\r\n gps.pinpoint(sf).then(resolve, resolveOriginal)['catch'](resolveOriginal);\r\n });\r\n })));\r\n }\r\n );\r\n\r\n promise.then(function(newFrames){\r\n newFrames.forEach(function(stackFrame, i){\r\n if(stackFrame.functionName) {\r\n var fn = stackFrame.functionName + ' ';\r\n } else {\r\n var fn = '';\r\n }\r\n var stackString = ' at ' + fn + '(' + stackFrame.fileName + ':' + stackFrame.lineNumber + ':' + stackFrame.columnNumber + ')';\r\n newFrames[i] = stackString;\r\n });\r\n newFrames.unshift(errorStack);\r\n jsonData.detail = newFrames.join(\"\\n\");\r\n\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n\r\n xhr.send(JSON.stringify(jsonData));\r\n });\r\n }\r\n\r\n function stackString(error) {\r\n var typeOF = typeof error.error;\r\n var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1);\r\n\r\n return typeOFCapitalized + ': ' + error.error + '\\n' + ' at ' + '(' + error.source + ':' + error.lineno + ':' + error.colno + ')';\r\n }\r\n\r\n // Private methods\r\n\r\n var sendPayload = function (apiKey, logId, callback, errorLog) {\r\n\r\n var api_key = apiKey,\r\n log_id = logId,\r\n error = errorLog,\r\n send = 1,\r\n queryParams = getSearchParameters(),\r\n stack = error.error && objectLength(error.error.stack) !== 0 && typeof error.error === \"object\" ? ErrorStackParser.parse(error.error) : '';\r\n\r\n // Ignoring error from an external script\r\n if (error && error.colno === 0 && error.lineno === 0 && (!stack || stack === '') && error.message && (error.message === \"Script error.\" || error.message === \"Script error\")) {\r\n if (settings.debug) {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\uD83D\\uDEC8 Ignoring error from external script ', debugSettings.lightCSS, debugSettings.warningCSS);\r\n }\r\n return;\r\n }\r\n\r\n if ((api_key !== null && log_id !== null) || (paramsLength === 2)) {\r\n\r\n // Priority for parameters\r\n if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n api_key = params['apiKey'];\r\n log_id = params['logId'];\r\n }\r\n\r\n // get new XHR object\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://api.elmah.io/v3/messages/\" + log_id + \"?api_key=\" + api_key, true);\r\n\r\n xhr.setRequestHeader('Content-type', 'application/json');\r\n\r\n xhr.onload = function (e) {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 201) {\r\n callback('success', xhr.statusText);\r\n }\r\n }\r\n };\r\n\r\n xhr.onerror = function (e) {\r\n callback('error', xhr.statusText);\r\n\r\n // on error event\r\n publicAPIs.emit('error', xhr.status, xhr.statusText);\r\n }\r\n\r\n var jsonData = {\r\n \"detail\": error.error ? error.error.stack : null,\r\n \"title\": error.message || 'Unspecified error',\r\n \"source\": stack && stack.length > 0 ? stack[0].fileName : null,\r\n \"severity\": \"Error\",\r\n \"type\": error.error ? error.error.name : null,\r\n \"queryString\": JSON.parse(JSON.stringify(queryParams))\r\n };\r\n\r\n // Check if error sent is a string and not an object\r\n // Then create the articifial stacktrace and pass source & type of the error\r\n if(error.error && (objectLength(error.error.stack) === 0) && typeof jsonData.detail === \"undefined\") {\r\n var typeOF = typeof errorLog.error;\r\n var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1);\r\n\r\n jsonData.detail = stackString(errorLog);\r\n jsonData.source = errorLog.source;\r\n jsonData.title = \"Uncaught \" + typeOFCapitalized + \": \" + errorLog.error;\r\n }\r\n\r\n // Add payload to jsonData\r\n jsonData = merge_objects(jsonData, getPayload());\r\n\r\n // filter callback\r\n if (settings.filter !== null) {\r\n if (settings.filter(jsonData)) {\r\n send = 0;\r\n }\r\n }\r\n\r\n if (send === 1) {\r\n\r\n if (error.error && typeof error.error === \"object\" && objectLength(error.error.stack) !== 0 && typeof Promise !== \"undefined\" && Promise.toString().indexOf(\"[native code]\") !== -1) {\r\n // send message trying to pinpoint stackframes\r\n stackGPS(error.error, xhr, jsonData);\r\n } else {\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n\r\n // send message\r\n xhr.send(JSON.stringify(jsonData));\r\n }\r\n }\r\n\r\n } else {\r\n return console.log('Login api error');\r\n }\r\n };\r\n\r\n var sendManualPayload = function (apiKey, logId, callback, logType, messageLog, errorLog) {\r\n var api_key = apiKey,\r\n log_id = logId,\r\n type = logType,\r\n error = errorLog,\r\n message = messageLog,\r\n send = 1,\r\n queryParams = getSearchParameters();\r\n\r\n if ((api_key !== null && log_id !== null) || (paramsLength === 2)) {\r\n\r\n // Priority for parameters\r\n if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n api_key = params['apiKey'];\r\n log_id = params['logId'];\r\n }\r\n\r\n // get new XHR object\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://api.elmah.io/v3/messages/\" + log_id + \"?api_key=\" + api_key, true);\r\n xhr.setRequestHeader('Content-type', 'application/json');\r\n\r\n xhr.onload = function (e) {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 201) {\r\n callback('success', xhr.statusText);\r\n }\r\n }\r\n };\r\n\r\n xhr.onerror = function (e) {\r\n callback('error', xhr.statusText);\r\n\r\n // on error event\r\n publicAPIs.emit('error', xhr.status, xhr.statusText);\r\n }\r\n\r\n if (type !== \"Log\") {\r\n\r\n var stack = error ? ErrorStackParser.parse(error) : null;\r\n\r\n var jsonData = {\r\n \"title\": message,\r\n \"source\": stack && stack.length > 0 ? stack[0].fileName : null,\r\n \"detail\": error ? error.stack : null,\r\n \"severity\": type,\r\n \"type\": error ? error.name : null,\r\n \"queryString\": JSON.parse(JSON.stringify(queryParams))\r\n };\r\n\r\n // Add payload to jsonData\r\n jsonData = merge_objects(jsonData, getPayload());\r\n\r\n } else {\r\n\r\n jsonData = error;\r\n\r\n }\r\n\r\n // filter callback\r\n if (settings.filter !== null) {\r\n if (settings.filter(jsonData)) {\r\n send = 0;\r\n }\r\n }\r\n\r\n if (send === 1) {\r\n if (jsonData.title) {\r\n\r\n if (error && type !== \"Log\" && typeof Promise !== \"undefined\" && Promise.toString().indexOf(\"[native code]\") !== -1) {\r\n // send message trying to pinpoint stackframes\r\n stackGPS(error, xhr, jsonData);\r\n } else {\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n\r\n // send message\r\n xhr.send(JSON.stringify(jsonData));\r\n }\r\n\r\n } else {\r\n callback('missing-title', xhr.statusText);\r\n }\r\n }\r\n\r\n } else {\r\n return console.log('Login api error');\r\n }\r\n };\r\n\r\n // Some public methods\r\n\r\n publicAPIs.error = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg);\r\n };\r\n publicAPIs.error = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg, error);\r\n };\r\n\r\n publicAPIs.verbose = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg);\r\n };\r\n publicAPIs.verbose = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg, error);\r\n };\r\n\r\n publicAPIs.debug = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg);\r\n };\r\n publicAPIs.debug = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg, error);\r\n };\r\n\r\n publicAPIs.information = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg);\r\n };\r\n publicAPIs.information = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg, error);\r\n };\r\n\r\n publicAPIs.warning = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg);\r\n };\r\n publicAPIs.warning = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg, error);\r\n };\r\n\r\n publicAPIs.fatal = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg);\r\n };\r\n publicAPIs.fatal = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg, error);\r\n };\r\n\r\n publicAPIs.log = function (obj) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Log', null, obj);\r\n };\r\n\r\n publicAPIs.message = function() {\r\n return getPayload();\r\n };\r\n\r\n publicAPIs.on = function (name, callback, ctx) {\r\n var e = this.e || (this.e = {});\r\n\r\n (e[name] || (e[name] = [])).push({\r\n fn: callback,\r\n ctx: ctx\r\n });\r\n\r\n return this;\r\n };\r\n\r\n publicAPIs.emit = function (name) {\r\n var data = [].slice.call(arguments, 1);\r\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\r\n var i = 0;\r\n var len = evtArr.length;\r\n\r\n for (i; i < len; i++) {\r\n evtArr[i].fn.apply(evtArr[i].ctx, data);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n publicAPIs.init = function (options) {\r\n\r\n // Merge options into defaults\r\n settings = extend(defaults, options || {});\r\n\r\n // Code goes here...\r\n window.onerror = function (message, source, lineno, colno, error) {\r\n\r\n var errorLog = {\r\n 'message': message,\r\n 'source': source,\r\n 'lineno': lineno,\r\n 'colno': colno,\r\n 'error': error\r\n }\r\n\r\n sendPayload(settings.apiKey, settings.logId, confirmResponse, errorLog);\r\n\r\n return false;\r\n }\r\n\r\n };\r\n\r\n // Initialize the plugin\r\n publicAPIs.init(options);\r\n\r\n // If debug is true, show some errors\r\n if (settings.debug) {\r\n console.log('%c' + debugSettings.label, debugSettings.labelCSS);\r\n\r\n if(settings.apiKey) {\r\n if(settings.apiKey.length !== 32) {\r\n console.log('%c \\u26A0 API Key: ' + '%c The API Key must have exactly 32 characters long ', debugSettings.errorCSS, debugSettings.lightCSS);\r\n }\r\n } else {\r\n console.log('%c \\u26A0 API Key: ' + '%c The API Key is not set ', debugSettings.errorCSS, debugSettings.lightCSS);\r\n }\r\n\r\n if(settings.logId) {\r\n if(!settings.logId.match(/^(\\{){0,1}[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}(\\}){0,1}$/gi)) {\r\n console.log('%c \\u26A0 API Key: ' + '%c The Log ID is not valid ', debugSettings.errorCSS, debugSettings.lightCSS);\r\n }\r\n } else {\r\n console.log('%c \\u26A0 Log ID: ' + '%c The Log ID is not set ', debugSettings.errorCSS, debugSettings.lightCSS);\r\n }\r\n }\r\n\r\n // Return the public APIs\r\n return publicAPIs;\r\n\r\n };\r\n\r\n\r\n //\r\n // Return the constructor\r\n //\r\n\r\n if (paramsLength && params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n // Immediately-Invoked Function Expression (IIFE)\r\n return new Constructor;\r\n } else {\r\n // UMD Constructor\r\n return Constructor;\r\n }\r\n\r\n});\r\n"],"file":"elmahio.js"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["elmahio.js"],"sourcesContent":["/*!\r\n * elmah.io Javascript Logger - version 3.3.0\r\n * (c) 2018 elmah.io, Apache 2.0 License, https://elmah.io\r\n */\r\n\r\n(function (root, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n define([], function () {\r\n return factory(root);\r\n });\r\n } else if (typeof exports === 'object') {\r\n module.exports = factory(root);\r\n } else {\r\n root.Elmahio = factory(root);\r\n }\r\n})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, function (window) {\r\n\r\n 'use strict';\r\n\r\n //\r\n // ==== STACKFRAME ====\r\n //\r\n\r\n var StackFrame = (function () {\r\n \"use strict\";\r\n function _isNumber(n) {\r\n return !isNaN(parseFloat(n)) && isFinite(n);\r\n }\r\n function _capitalize(str) {\r\n return str.charAt(0).toUpperCase() + str.substring(1);\r\n }\r\n function _getter(p) {\r\n return function () {\r\n return this[p];\r\n };\r\n }\r\n var booleanProps = [\"isConstructor\", \"isEval\", \"isNative\", \"isToplevel\"];\r\n var numericProps = [\"columnNumber\", \"lineNumber\"];\r\n var stringProps = [\"fileName\", \"functionName\", \"source\"];\r\n var arrayProps = [\"args\"];\r\n var props = booleanProps.concat(numericProps, stringProps, arrayProps);\r\n function StackFrame(obj) {\r\n if (obj instanceof Object) {\r\n for (var i = 0; i < props.length; i++) {\r\n if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) {\r\n this[\"set\" + _capitalize(props[i])](obj[props[i]]);\r\n }\r\n }\r\n }\r\n }\r\n StackFrame.prototype = {\r\n getArgs: function () {\r\n return this.args;\r\n },\r\n setArgs: function (v) {\r\n if (Object.prototype.toString.call(v) !== \"[object Array]\") {\r\n throw new TypeError(\"Args must be an Array\");\r\n }\r\n this.args = v;\r\n },\r\n getEvalOrigin: function () {\r\n return this.evalOrigin;\r\n },\r\n setEvalOrigin: function (v) {\r\n if (v instanceof StackFrame) {\r\n this.evalOrigin = v;\r\n } else if (v instanceof Object) {\r\n this.evalOrigin = new StackFrame(v);\r\n } else {\r\n throw new TypeError(\"Eval Origin must be an Object or StackFrame\");\r\n }\r\n },\r\n toString: function () {\r\n var functionName = this.getFunctionName() || \"{anonymous}\";\r\n var args = \"(\" + (this.getArgs() || []).join(\",\") + \")\";\r\n var fileName = this.getFileName() ? \"@\" + this.getFileName() : \"\";\r\n var lineNumber = _isNumber(this.getLineNumber()) ? \":\" + this.getLineNumber() : \"\";\r\n var columnNumber = _isNumber(this.getColumnNumber()) ? \":\" + this.getColumnNumber() : \"\";\r\n return functionName + args + fileName + lineNumber + columnNumber;\r\n }\r\n };\r\n StackFrame.fromString = function StackFrame$$fromString(str) {\r\n var argsStartIndex = str.indexOf(\"(\");\r\n var argsEndIndex = str.lastIndexOf(\")\");\r\n var functionName = str.substring(0, argsStartIndex);\r\n var args = str.substring(argsStartIndex + 1, argsEndIndex).split(\",\");\r\n var locationString = str.substring(argsEndIndex + 1);\r\n if (locationString.indexOf(\"@\") === 0) {\r\n var parts = /@(.+?)(?::(\\d+))?(?::(\\d+))?$/.exec(locationString, \"\");\r\n var fileName = parts[1];\r\n var lineNumber = parts[2];\r\n var columnNumber = parts[3];\r\n }\r\n return new StackFrame({\r\n functionName: functionName,\r\n args: args || undefined,\r\n fileName: fileName,\r\n lineNumber: lineNumber || undefined,\r\n columnNumber: columnNumber || undefined\r\n });\r\n };\r\n for (var i = 0; i < booleanProps.length; i++) {\r\n StackFrame.prototype[\"get\" + _capitalize(booleanProps[i])] = _getter(booleanProps[i]);\r\n StackFrame.prototype[\"set\" + _capitalize(booleanProps[i])] = function (p) {\r\n return function (v) {\r\n this[p] = Boolean(v);\r\n };\r\n }(booleanProps[i]);\r\n }\r\n for (var j = 0; j < numericProps.length; j++) {\r\n StackFrame.prototype[\"get\" + _capitalize(numericProps[j])] = _getter(numericProps[j]);\r\n StackFrame.prototype[\"set\" + _capitalize(numericProps[j])] = function (p) {\r\n return function (v) {\r\n if (!_isNumber(v)) {\r\n throw new TypeError(p + \" must be a Number\");\r\n }\r\n this[p] = Number(v);\r\n };\r\n }(numericProps[j]);\r\n }\r\n for (var k = 0; k < stringProps.length; k++) {\r\n StackFrame.prototype[\"get\" + _capitalize(stringProps[k])] = _getter(stringProps[k]);\r\n StackFrame.prototype[\"set\" + _capitalize(stringProps[k])] = function (p) {\r\n return function (v) {\r\n this[p] = String(v);\r\n };\r\n }(stringProps[k]);\r\n }\r\n return StackFrame;\r\n })();\r\n\r\n //\r\n // ==== ERROR STACK PARSER ====\r\n //\r\n\r\n var ErrorStackParser = (function () {\r\n \"use strict\";\r\n var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+\\:\\d+/;\r\n var CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+\\:\\d+|\\(native\\))/m;\r\n var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/;\r\n return {\r\n /**\r\n * Given an Error object, extract the most information from it.\r\n *\r\n * @param {Error} error object\r\n * @return {Array} of StackFrames\r\n */\r\n parse: function ErrorStackParser$$parse(error) {\r\n if (typeof error.stacktrace !== \"undefined\" || typeof error[\"opera#sourceloc\"] !== \"undefined\") {\r\n return this.parseOpera(error);\r\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\r\n return this.parseV8OrIE(error);\r\n } else if (error.stack) {\r\n return this.parseFFOrSafari(error);\r\n } else {\r\n throw new Error(\"Cannot parse given Error object\");\r\n }\r\n },\r\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\r\n extractLocation: function ErrorStackParser$$extractLocation(urlLike) {\r\n // Fail-fast but return locations like \"(native)\"\r\n if (urlLike.indexOf(\":\") === -1) {\r\n return [urlLike];\r\n }\r\n var regExp = /(.+?)(?:\\:(\\d+))?(?:\\:(\\d+))?$/;\r\n var parts = regExp.exec(urlLike.replace(/[\\(\\)]/g, \"\"));\r\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\r\n },\r\n parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !!line.match(CHROME_IE_STACK_REGEXP);\r\n }, this);\r\n return filtered.map(function (line) {\r\n if (line.indexOf(\"(eval \") > -1) {\r\n // Throw away eval information until we implement stacktrace.js/stackframe#8\r\n line = line.replace(/eval code/g, \"eval\").replace(/(\\(eval at [^\\()]*)|(\\)\\,.*$)/g, \"\");\r\n }\r\n var tokens = line.replace(/^\\s+/, \"\").replace(/\\(eval code/g, \"(\").split(/\\s+/).slice(1);\r\n var locationParts = this.extractLocation(tokens.pop());\r\n var functionName = tokens.join(\" \") || undefined;\r\n var fileName = [\"eval\", \"\"].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];\r\n return new StackFrame({\r\n functionName: functionName,\r\n fileName: fileName,\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }, this);\r\n },\r\n parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\r\n }, this);\r\n return filtered.map(function (line) {\r\n // Throw away eval information until we implement stacktrace.js/stackframe#8\r\n if (line.indexOf(\" > eval\") > -1) {\r\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval\\:\\d+\\:\\d+/g, \":$1\");\r\n }\r\n if (line.indexOf(\"@\") === -1 && line.indexOf(\":\") === -1) {\r\n // Safari eval frames only have function names and nothing else\r\n return new StackFrame({\r\n functionName: line\r\n });\r\n } else {\r\n var functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\r\n var matches = line.match(functionNameRegex);\r\n var functionName = matches && matches[1] ? matches[1] : undefined;\r\n var locationParts = this.extractLocation(line.replace(functionNameRegex, \"\"));\r\n return new StackFrame({\r\n functionName: functionName,\r\n fileName: locationParts[0],\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }\r\n }, this);\r\n },\r\n parseOpera: function ErrorStackParser$$parseOpera(e) {\r\n if (!e.stacktrace || e.message.indexOf(\"\\n\") > -1 && e.message.split(\"\\n\").length > e.stacktrace.split(\"\\n\").length) {\r\n return this.parseOpera9(e);\r\n } else if (!e.stack) {\r\n return this.parseOpera10(e);\r\n } else {\r\n return this.parseOpera11(e);\r\n }\r\n },\r\n parseOpera9: function ErrorStackParser$$parseOpera9(e) {\r\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\r\n var lines = e.message.split(\"\\n\");\r\n var result = [];\r\n for (var i = 2, len = lines.length; i < len; i += 2) {\r\n var match = lineRE.exec(lines[i]);\r\n if (match) {\r\n result.push(new StackFrame({\r\n fileName: match[2],\r\n lineNumber: match[1],\r\n source: lines[i]\r\n }));\r\n }\r\n }\r\n return result;\r\n },\r\n parseOpera10: function ErrorStackParser$$parseOpera10(e) {\r\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\r\n var lines = e.stacktrace.split(\"\\n\");\r\n var result = [];\r\n for (var i = 0, len = lines.length; i < len; i += 2) {\r\n var match = lineRE.exec(lines[i]);\r\n if (match) {\r\n result.push(new StackFrame({\r\n functionName: match[3] || undefined,\r\n fileName: match[2],\r\n lineNumber: match[1],\r\n source: lines[i]\r\n }));\r\n }\r\n }\r\n return result;\r\n },\r\n // Opera 10.65+ Error.stack very similar to FF/Safari\r\n parseOpera11: function ErrorStackParser$$parseOpera11(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);\r\n }, this);\r\n return filtered.map(function (line) {\r\n var tokens = line.split(\"@\");\r\n var locationParts = this.extractLocation(tokens.pop());\r\n var functionCall = tokens.shift() || \"\";\r\n var functionName = functionCall.replace(//, \"$2\").replace(/\\([^\\)]*\\)/g, \"\") || undefined;\r\n var argsRaw;\r\n if (functionCall.match(/\\(([^\\)]*)\\)/)) {\r\n argsRaw = functionCall.replace(/^[^\\(]+\\(([^\\)]*)\\)$/, \"$1\");\r\n }\r\n var args = argsRaw === undefined || argsRaw === \"[arguments not available]\" ? undefined : argsRaw.split(\",\");\r\n return new StackFrame({\r\n functionName: functionName,\r\n args: args,\r\n fileName: locationParts[0],\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }, this);\r\n }\r\n };\r\n })();\r\n\r\n //\r\n // ==== STACKTRACE-GPS ====\r\n //\r\n\r\n var SourceMap = function(e){var n={};function r(t){if(n[t])return n[t].exports;var o=n[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}return r.m=e,r.c=n,r.p=\"\",r(0)}([function(e,n,r){var t=r(1),o=r(2),i=r(3).ArraySet,a=r(4),s=r(6).quickSort;function u(e){var n=e;return\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\"))),null!=n.sections?new c(n):new l(n)}function l(e){var n=e;\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\")));var r=t.getArg(n,\"version\"),o=t.getArg(n,\"sources\"),a=t.getArg(n,\"names\",[]),s=t.getArg(n,\"sourceRoot\",null),u=t.getArg(n,\"sourcesContent\",null),l=t.getArg(n,\"mappings\"),g=t.getArg(n,\"file\",null);if(r!=this._version)throw new Error(\"Unsupported version: \"+r);o=o.map(String).map(t.normalize).map(function(e){return s&&t.isAbsolute(s)&&t.isAbsolute(e)?t.relative(s,e):e}),this._names=i.fromArray(a.map(String),!0),this._sources=i.fromArray(o,!0),this.sourceRoot=s,this.sourcesContent=u,this._mappings=l,this.file=g}function g(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function c(e){var n=e;\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\")));var r=t.getArg(n,\"version\"),o=t.getArg(n,\"sections\");if(r!=this._version)throw new Error(\"Unsupported version: \"+r);this._sources=new i,this._names=new i;var a={line:-1,column:0};this._sections=o.map(function(e){if(e.url)throw new Error(\"Support for url field in sections not implemented.\");var n=t.getArg(e,\"offset\"),r=t.getArg(n,\"line\"),o=t.getArg(n,\"column\");if(r=0){var s=this._originalMappings[a];if(void 0===e.column)for(var u=s.originalLine;s&&s.originalLine===u;)i.push({line:t.getArg(s,\"generatedLine\",null),column:t.getArg(s,\"generatedColumn\",null),lastColumn:t.getArg(s,\"lastGeneratedColumn\",null)}),s=this._originalMappings[++a];else for(var l=s.originalColumn;s&&s.originalLine===n&&s.originalColumn==l;)i.push({line:t.getArg(s,\"generatedLine\",null),column:t.getArg(s,\"generatedColumn\",null),lastColumn:t.getArg(s,\"lastGeneratedColumn\",null)}),s=this._originalMappings[++a]}return i},n.SourceMapConsumer=u,l.prototype=Object.create(u.prototype),l.prototype.consumer=u,l.fromSourceMap=function(e){var n=Object.create(l.prototype),r=n._names=i.fromArray(e._names.toArray(),!0),o=n._sources=i.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var a=e._mappings.toArray().slice(),u=n.__generatedMappings=[],c=n.__originalMappings=[],p=0,h=a.length;p1&&(r.source=d+i[1],d+=i[1],r.originalLine=h+i[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+i[3],f=r.originalColumn,i.length>4&&(r.name=m+i[4],m+=i[4])),L.push(r),\"number\"==typeof r.originalLine&&y.push(r)}s(L,t.compareByGeneratedPositionsDeflated),this.__generatedMappings=L,s(y,t.compareByOriginalPositions),this.__originalMappings=y},l.prototype._findMapping=function(e,n,r,t,i,a){if(e[r]<=0)throw new TypeError(\"Line must be greater than or equal to 1, got \"+e[r]);if(e[t]<0)throw new TypeError(\"Column must be greater than or equal to 0, got \"+e[t]);return o.search(e,n,i,a)},l.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=t.getArg(o,\"source\",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=t.join(this.sourceRoot,i)));var a=t.getArg(o,\"name\",null);return null!==a&&(a=this._names.at(a)),{source:i,line:t.getArg(o,\"originalLine\",null),column:t.getArg(o,\"originalColumn\",null),name:a}}}return{source:null,line:null,column:null,name:null}},l.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},l.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=t.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=t.urlParse(this.sourceRoot))){var o=e.replace(/^file:\\/\\//,\"\");if(\"file\"==r.scheme&&this._sources.has(o))return this.sourcesContent[this._sources.indexOf(o)];if((!r.path||\"/\"==r.path)&&this._sources.has(\"/\"+e))return this.sourcesContent[this._sources.indexOf(\"/\"+e)]}if(n)return null;throw new Error('\"'+e+'\" is not in the SourceMap.')},l.prototype.generatedPositionFor=function(e){var n=t.getArg(e,\"source\");if(null!=this.sourceRoot&&(n=t.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};var r={source:n=this._sources.indexOf(n),originalLine:t.getArg(e,\"line\"),originalColumn:t.getArg(e,\"column\")},o=this._findMapping(r,this._originalMappings,\"originalLine\",\"originalColumn\",t.compareByOriginalPositions,t.getArg(e,\"bias\",u.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:t.getArg(i,\"generatedLine\",null),column:t.getArg(i,\"generatedColumn\",null),lastColumn:t.getArg(i,\"lastGeneratedColumn\",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=l,c.prototype=Object.create(u.prototype),c.prototype.constructor=u,c.prototype._version=3,Object.defineProperty(c.prototype,\"sources\",{get:function(){for(var e=[],n=0;n=0;g--)\".\"===(a=u[g])?u.splice(g,1):\"..\"===a?l++:l>0&&(\"\"===a?(u.splice(g+1,l),l=0):(u.splice(g,2),l--));return\"\"===(r=u.join(\"/\"))&&(r=s?\"/\":\".\"),t?(t.path=r,i(t)):r}n.urlParse=o,n.urlGenerate=i,n.normalize=a,n.join=function(e,n){\"\"===e&&(e=\".\"),\"\"===n&&(n=\".\");var r=o(n),s=o(e);if(s&&(e=s.path||\"/\"),r&&!r.scheme)return s&&(r.scheme=s.scheme),i(r);if(r||n.match(t))return n;if(s&&!s.host&&!s.path)return s.host=n,i(s);var u=\"/\"===n.charAt(0)?n:a(e.replace(/\\/+$/,\"\")+\"/\"+n);return s?(s.path=u,i(s)):u},n.isAbsolute=function(e){return\"/\"===e.charAt(0)||!!e.match(r)},n.relative=function(e,n){\"\"===e&&(e=\".\"),e=e.replace(/\\/$/,\"\");for(var r=0;0!==n.indexOf(e+\"/\");){var t=e.lastIndexOf(\"/\");if(t<0)return n;if((e=e.slice(0,t)).match(/^([^\\/]+:\\/)?\\/*$/))return n;++r}return Array(r+1).join(\"../\")+n.substr(e.length+1)};var s=!(\"__proto__\"in Object.create(null));function u(e){return e}function l(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function g(e,n){return e===n?0:e>n?1:-1}n.toSetString=s?u:function(e){return l(e)?\"$\"+e:e},n.fromSetString=s?u:function(e){return l(e)?e.slice(1):e},n.compareByOriginalPositions=function(e,n,r){var t=e.source-n.source;return 0!==t?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)||r?t:0!=(t=e.generatedColumn-n.generatedColumn)?t:0!=(t=e.generatedLine-n.generatedLine)?t:e.name-n.name},n.compareByGeneratedPositionsDeflated=function(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:0!=(t=e.generatedColumn-n.generatedColumn)||r?t:0!=(t=e.source-n.source)?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)?t:e.name-n.name},n.compareByGeneratedPositionsInflated=function(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:0!=(r=e.generatedColumn-n.generatedColumn)?r:0!==(r=g(e.source,n.source))?r:0!=(r=e.originalLine-n.originalLine)?r:0!=(r=e.originalColumn-n.originalColumn)?r:g(e.name,n.name)}},function(e,n){n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,r,t,o){if(0===r.length)return-1;var i=function e(r,t,o,i,a,s){var u=Math.floor((t-r)/2)+r,l=a(o,i[u],!0);return 0===l?u:l>0?t-u>1?e(u,t,o,i,a,s):s==n.LEAST_UPPER_BOUND?t1?e(r,u,o,i,a,s):s==n.LEAST_UPPER_BOUND?u:r<0?-1:r}(-1,r.length,e,r,t,o||n.GREATEST_LOWER_BOUND);if(i<0)return-1;for(;i-1>=0&&0===t(r[i],r[i-1],!0);)--i;return i}},function(e,n,r){var t=r(1),o=Object.prototype.hasOwnProperty;function i(){this._array=[],this._set=Object.create(null)}i.fromArray=function(e,n){for(var r=new i,t=0,o=e.length;t=0&&e>>=5)>0&&(n|=32),o+=t.encode(n)}while(i>0);return o},n.decode=function(e,n,r){var o,i,a,s,u=e.length,l=0,g=0;do{if(n>=u)throw new Error(\"Expected more digits in base 64 VLQ value.\");if(-1===(i=t.decode(e.charCodeAt(n++))))throw new Error(\"Invalid base64 digit: \"+e.charAt(n-1));o=!!(32&i),l+=(i&=31)<>1,1==(1&a)?-s:s),r.rest=n}},function(e,n){var r=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");n.encode=function(e){if(0<=e&&e= 200 && req.status < 300 || url.substr(0, 7) === \"file://\" && req.responseText) {\r\n resolve(req.responseText);\r\n } else {\r\n reject(new Error(\"HTTP status: \" + req.status + \" retrieving \" + url));\r\n }\r\n }\r\n };\r\n req.send();\r\n });\r\n }\r\n /**\r\n * Convert a Base64-encoded string into its original representation.\r\n * Used for inline sourcemaps.\r\n *\r\n * @param {String} b64str Base-64 encoded string\r\n * @returns {String} original representation of the base64-encoded string.\r\n */\r\n function _atob(b64str) {\r\n if (typeof window !== \"undefined\" && window.atob) {\r\n return window.atob(b64str);\r\n } else {\r\n throw new Error(\"You must supply a polyfill for window.atob in this environment\");\r\n }\r\n }\r\n function _parseJson(string) {\r\n if (typeof JSON !== \"undefined\" && JSON.parse) {\r\n return JSON.parse(string);\r\n } else {\r\n throw new Error(\"You must supply a polyfill for JSON.parse in this environment\");\r\n }\r\n }\r\n function _findFunctionName(source, lineNumber) {\r\n var syntaxes = [ // {name} = function ({args}) TODO args capture\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*function\\b/, // function {name}({args}) m[1]=name m[2]=args\r\n /function\\s+([^('\"`]*?)\\s*\\(([^)]*)\\)/, // {name} = eval()\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*(?:eval|new Function)\\b/, // fn_name() {\r\n /\\b(?!(?:if|for|switch|while|with|catch)\\b)(?:(?:static)\\s+)?(\\S+)\\s*\\(.*?\\)\\s*\\{/, // {name} = () => {\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*\\(.*?\\)\\s*=>/];\r\n var lines = source.split(\"\\n\");\r\n // Walk backwards in the source lines until we find the line which matches one of the patterns above\r\n var code = \"\";\r\n var maxLines = Math.min(lineNumber, 20);\r\n for (var i = 0; i < maxLines; ++i) {\r\n // lineNo is 1-based, source[] is 0-based\r\n var line = lines[lineNumber - i - 1];\r\n var commentPos = line.indexOf(\"//\");\r\n if (commentPos >= 0) {\r\n line = line.substr(0, commentPos);\r\n }\r\n if (line) {\r\n code = line + code;\r\n var len = syntaxes.length;\r\n for (var index = 0; index < len; index++) {\r\n var m = syntaxes[index].exec(code);\r\n if (m && m[1]) {\r\n return m[1];\r\n }\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n function _ensureSupportedEnvironment() {\r\n if (typeof Object.defineProperty !== \"function\" || typeof Object.create !== \"function\") {\r\n throw new Error(\"Unable to consume source maps in older browsers\");\r\n }\r\n }\r\n function _ensureStackFrameIsLegit(stackframe) {\r\n if (typeof stackframe !== \"object\") {\r\n throw new TypeError(\"Given StackFrame is not an object\");\r\n } else if (typeof stackframe.fileName !== \"string\") {\r\n throw new TypeError(\"Given file name is not a String\");\r\n } else if (typeof stackframe.lineNumber !== \"number\" || stackframe.lineNumber % 1 !== 0 || stackframe.lineNumber < 1) {\r\n throw new TypeError(\"Given line number must be a positive integer\");\r\n } else if (typeof stackframe.columnNumber !== \"number\" || stackframe.columnNumber % 1 !== 0 || stackframe.columnNumber < 0) {\r\n throw new TypeError(\"Given column number must be a non-negative integer\");\r\n }\r\n return true;\r\n }\r\n function _findSourceMappingURL(source) {\r\n var sourceMappingUrlRegExp = /\\/\\/[#@] ?sourceMappingURL=([^\\s'\"]+)\\s*$/gm;\r\n var lastSourceMappingUrl;\r\n var matchSourceMappingUrl;\r\n while (matchSourceMappingUrl = sourceMappingUrlRegExp.exec(source)) {\r\n // jshint ignore:line\r\n lastSourceMappingUrl = matchSourceMappingUrl[1];\r\n }\r\n if (lastSourceMappingUrl) {\r\n return lastSourceMappingUrl;\r\n } else {\r\n throw new Error(\"sourceMappingURL not found\");\r\n }\r\n }\r\n function _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache) {\r\n return new Promise(function (resolve, reject) {\r\n var loc = sourceMapConsumer.originalPositionFor({\r\n line: stackframe.lineNumber,\r\n column: stackframe.columnNumber\r\n });\r\n if (loc.source) {\r\n // cache mapped sources\r\n var mappedSource = sourceMapConsumer.sourceContentFor(loc.source);\r\n if (mappedSource) {\r\n sourceCache[loc.source] = mappedSource;\r\n }\r\n resolve(// given stackframe and source location, update stackframe\r\n new StackFrame({\r\n functionName: loc.name || stackframe.functionName,\r\n args: stackframe.args,\r\n fileName: loc.source,\r\n lineNumber: loc.line,\r\n columnNumber: loc.column\r\n }));\r\n } else {\r\n reject(new Error(\"Could not get original source for given stackframe and source map\"));\r\n }\r\n });\r\n }\r\n /**\r\n * @constructor\r\n * @param {Object} opts\r\n * opts.sourceCache = {url: \"Source String\"} => preload source cache\r\n * opts.sourceMapConsumerCache = {/path/file.js.map: SourceMapConsumer}\r\n * opts.offline = True to prevent network requests.\r\n * Best effort without sources or source maps.\r\n * opts.ajax = Promise returning function to make X-Domain requests\r\n */\r\n return function StackTraceGPS(opts) {\r\n if (!(this instanceof StackTraceGPS)) {\r\n return new StackTraceGPS(opts);\r\n }\r\n opts = opts || {};\r\n this.sourceCache = opts.sourceCache || {};\r\n this.sourceMapConsumerCache = opts.sourceMapConsumerCache || {};\r\n this.ajax = opts.ajax || _xdr;\r\n this._atob = opts.atob || _atob;\r\n\r\n this._get = function _get(location) {\r\n return new Promise(function (resolve, reject) {\r\n var isDataUrl = location.substr(0, 5) === \"data:\";\r\n if (this.sourceCache[location]) {\r\n resolve(this.sourceCache[location]);\r\n } else if (opts.offline && !isDataUrl) {\r\n reject(new Error(\"Cannot make network requests in offline mode\"));\r\n } else {\r\n if (isDataUrl) {\r\n // data URLs can have parameters.\r\n // see http://tools.ietf.org/html/rfc2397\r\n var supportedEncodingRegexp = /^data:application\\/json;([\\w=:\"-]+;)*base64,/;\r\n var match = location.match(supportedEncodingRegexp);\r\n if (match) {\r\n var sourceMapStart = match[0].length;\r\n var encodedSource = location.substr(sourceMapStart);\r\n var source = this._atob(encodedSource);\r\n this.sourceCache[location] = source;\r\n resolve(source);\r\n } else {\r\n reject(new Error(\"The encoding of the inline sourcemap is not supported\"));\r\n }\r\n } else {\r\n var xhrPromise = this.ajax(location, {\r\n method: \"get\"\r\n });\r\n // Cache the Promise to prevent duplicate in-flight requests\r\n this.sourceCache[location] = xhrPromise;\r\n xhrPromise.then(resolve, reject);\r\n }\r\n }\r\n }.bind(this));\r\n };\r\n /**\r\n * Creating SourceMapConsumers is expensive, so this wraps the creation of a\r\n * SourceMapConsumer in a per-instance cache.\r\n *\r\n * @param {String} sourceMappingURL = URL to fetch source map from\r\n * @param {String} defaultSourceRoot = Default source root for source map if undefined\r\n * @returns {Promise} that resolves a SourceMapConsumer\r\n */\r\n this._getSourceMapConsumer = function _getSourceMapConsumer(sourceMappingURL, defaultSourceRoot) {\r\n return new Promise(function (resolve, reject) {\r\n if (this.sourceMapConsumerCache[sourceMappingURL]) {\r\n resolve(this.sourceMapConsumerCache[sourceMappingURL]);\r\n } else {\r\n var sourceMapConsumerPromise = new Promise(function (resolve, reject) {\r\n return this._get(sourceMappingURL).then(function (sourceMapSource) {\r\n if (typeof sourceMapSource === \"string\") {\r\n sourceMapSource = _parseJson(sourceMapSource.replace(/^\\)\\]\\}'/, \"\"));\r\n }\r\n if (typeof sourceMapSource.sourceRoot === \"undefined\") {\r\n sourceMapSource.sourceRoot = defaultSourceRoot;\r\n }\r\n resolve(new SourceMap.SourceMapConsumer(sourceMapSource));\r\n }, reject);\r\n }.bind(this));\r\n this.sourceMapConsumerCache[sourceMappingURL] = sourceMapConsumerPromise;\r\n resolve(sourceMapConsumerPromise);\r\n }\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, enhance function name and use source maps for a\r\n * better StackFrame.\r\n *\r\n * @param {StackFrame} stackframe object\r\n * @returns {Promise} that resolves with with source-mapped StackFrame\r\n */\r\n this.pinpoint = function StackTraceGPS$$pinpoint(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n this.getMappedLocation(stackframe).then(function (mappedStackFrame) {\r\n function resolveMappedStackFrame() {\r\n resolve(mappedStackFrame);\r\n }\r\n this.findFunctionName(mappedStackFrame).then(resolve, resolveMappedStackFrame)[\"catch\"](resolveMappedStackFrame);\r\n }.bind(this), reject);\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, guess function name from location information.\r\n *\r\n * @param {StackFrame} stackframe\r\n * @returns {Promise} that resolves with enhanced StackFrame.\r\n */\r\n this.findFunctionName = function StackTraceGPS$$findFunctionName(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n _ensureStackFrameIsLegit(stackframe);\r\n this._get(stackframe.fileName).then(function getSourceCallback(source) {\r\n var lineNumber = stackframe.lineNumber;\r\n var columnNumber = stackframe.columnNumber;\r\n var guessedFunctionName = _findFunctionName(source, lineNumber, columnNumber);\r\n // Only replace functionName if we found something\r\n if (guessedFunctionName) {\r\n resolve(new StackFrame({\r\n functionName: guessedFunctionName,\r\n args: stackframe.args,\r\n fileName: stackframe.fileName,\r\n lineNumber: lineNumber,\r\n columnNumber: columnNumber\r\n }));\r\n } else {\r\n resolve(stackframe);\r\n }\r\n }, reject)[\"catch\"](reject);\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, seek source-mapped location and return new enhanced StackFrame.\r\n *\r\n * @param {StackFrame} stackframe\r\n * @returns {Promise} that resolves with enhanced StackFrame.\r\n */\r\n this.getMappedLocation = function StackTraceGPS$$getMappedLocation(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n _ensureSupportedEnvironment();\r\n _ensureStackFrameIsLegit(stackframe);\r\n var sourceCache = this.sourceCache;\r\n var fileName = stackframe.fileName;\r\n this._get(fileName).then(function (source) {\r\n var sourceMappingURL = _findSourceMappingURL(source);\r\n var isDataUrl = sourceMappingURL.substr(0, 5) === \"data:\";\r\n var defaultSourceRoot = fileName.substring(0, fileName.lastIndexOf(\"/\") + 1);\r\n if (sourceMappingURL[0] !== \"/\" && !isDataUrl && !/^https?:\\/\\/|^\\/\\//i.test(sourceMappingURL)) {\r\n sourceMappingURL = defaultSourceRoot + sourceMappingURL;\r\n }\r\n return this._getSourceMapConsumer(sourceMappingURL, defaultSourceRoot).then(function (sourceMapConsumer) {\r\n return _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache).then(resolve)[\"catch\"](function () {\r\n resolve(stackframe);\r\n });\r\n });\r\n }.bind(this), reject)[\"catch\"](reject);\r\n }.bind(this));\r\n };\r\n };\r\n })(SourceMap, StackFrame);\r\n\r\n //\r\n // Shared Variables\r\n //\r\n\r\n var scriptFile = document.getElementsByTagName('script');\r\n var scriptIndex = scriptFile.length - 1;\r\n var myScript = scriptFile[scriptIndex];\r\n var queryString = myScript.src.replace(/^[^\\?]+\\??/, '');\r\n var params = parseQuery(queryString);\r\n var paramsLength = objectLength(params);\r\n\r\n var debugSettings = {\r\n label: ' elmah.io debugger : On ',\r\n labelCSS: 'background: #06a89c; color: #ffffff; display: inline-block; font-size: 14px;',\r\n successCSS: 'background: #d4edda; color: #155724; display: inline-block; font-size: 13px;',\r\n errorCSS: 'background: #f8d7da; color: #721c24; display: inline-block; font-size: 13px;',\r\n warningCSS: 'background: #fff3cd; color: #856404; display: inline-block; font-size: 13px;',\r\n lightCSS: 'background: #e2e3e5; color: #383d41; display: inline-block; font-size: 13px;'\r\n };\r\n\r\n var defaults = {\r\n apiKey: null,\r\n logId: null,\r\n debug: false,\r\n application: null,\r\n filter: null,\r\n captureConsoleMinimumLevel: 'none'\r\n };\r\n\r\n //\r\n // Shared Methods\r\n //\r\n\r\n var extend = function () {\r\n\r\n // Variables\r\n var extended = {};\r\n var deep = false;\r\n var i = 0;\r\n\r\n // Check if a deep merge\r\n if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') {\r\n deep = arguments[0];\r\n i++;\r\n }\r\n\r\n // Merge the object into the extended object\r\n var merge = function (obj) {\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n // If property is an object, merge properties\r\n if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') {\r\n extended[prop] = extend(extended[prop], obj[prop]);\r\n } else {\r\n extended[prop] = obj[prop];\r\n }\r\n }\r\n }\r\n };\r\n\r\n // Loop through each object and conduct a merge\r\n for (; i < arguments.length; i++) {\r\n var obj = arguments[i];\r\n merge(obj);\r\n }\r\n\r\n return extended;\r\n\r\n };\r\n\r\n //\r\n // Helpers\r\n //\r\n\r\n function parseQuery(query) {\r\n var Params = new Object();\r\n if (!query) return Params; // return empty object\r\n var Pairs = query.split(/[;&]/);\r\n for (var i = 0; i < Pairs.length; i++) {\r\n var KeyVal = Pairs[i].split('=');\r\n if (!KeyVal || KeyVal.length !== 2) continue;\r\n var key = unescape(KeyVal[0]);\r\n var val = unescape(KeyVal[1]);\r\n val = val.replace(/\\+/g, ' ');\r\n Params[key] = val;\r\n }\r\n return Params;\r\n }\r\n\r\n function objectLength(obj) {\r\n var size = 0, key;\r\n for (key in obj) {\r\n if (obj.hasOwnProperty(key)) size++;\r\n }\r\n return size;\r\n };\r\n\r\n function getSearchParameters() {\r\n var prmstr = window.location.search.substr(1);\r\n return prmstr !== null && prmstr !== \"\" ? transformToAssocArray(prmstr) : {};\r\n }\r\n\r\n function transformToAssocArray(prmstr) {\r\n var params = [];\r\n var prmarr = prmstr.split(\"&\");\r\n for (var i = 0; i < prmarr.length; i++) {\r\n var tmparr = prmarr[i].split(\"=\");\r\n params.push({\r\n 'key': tmparr[0],\r\n 'value': tmparr[1]\r\n });\r\n }\r\n return params;\r\n }\r\n\r\n function merge_objects(obj1, obj2) {\r\n var obj3 = {};\r\n for (var attrname1 in obj1) {\r\n obj3[attrname1] = obj1[attrname1];\r\n }\r\n for (var attrname2 in obj2) {\r\n obj3[attrname2] = obj2[attrname2];\r\n }\r\n\r\n return obj3;\r\n }\r\n\r\n // sprintf-js\r\n var sprintfjs = function() {\r\n 'use strict'\r\n var app = {};\r\n var re = {\r\n not_string: /[^s]/,\r\n not_bool: /[^t]/,\r\n not_type: /[^T]/,\r\n not_primitive: /[^v]/,\r\n number: /[diefg]/,\r\n numeric_arg: /[bcdiefguxX]/,\r\n json: /[j]/,\r\n not_json: /[^j]/,\r\n text: /^[^\\x25]+/,\r\n modulo: /^\\x25{2}/,\r\n placeholder: /^\\x25(?:([1-9]\\d*)\\$|\\(([^)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-gijostTuvxX])/,\r\n key: /^([a-z_][a-z_\\d]*)/i,\r\n key_access: /^\\.([a-z_][a-z_\\d]*)/i,\r\n index_access: /^\\[(\\d+)\\]/,\r\n sign: /^[+-]/,\r\n mod: /^\\x25\\s/,\r\n notplaceholder: /^\\x25?([^b-gijostTuvxX])/\r\n }\r\n\r\n function sprintf(key) {\r\n // `arguments` is not an array, but should be fine for this call\r\n return sprintf_format(sprintf_parse(key), arguments)\r\n }\r\n\r\n function vsprintf(fmt, argv) {\r\n return sprintf.apply(null, [fmt].concat(argv || []))\r\n }\r\n\r\n function sprintf_format(parse_tree, argv) {\r\n var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign;\r\n for (i = 0; i < tree_length; i++) {\r\n if (typeof parse_tree[i] === 'string') {\r\n output += parse_tree[i]\r\n }\r\n else if (typeof parse_tree[i] === 'object') {\r\n ph = parse_tree[i]; // placeholder\r\n if (ph.keys) { // keyword argument\r\n arg = argv[cursor]\r\n for (k = 0; k < ph.keys.length; k++) {\r\n if (arg == undefined) {\r\n throw new Error(sprintf('[sprintf] Cannot access property \"%s\" of undefined value \"%s\"', ph.keys[k], ph.keys[k-1]))\r\n }\r\n arg = arg[ph.keys[k]]\r\n }\r\n }\r\n else if (ph.param_no) { // positional argument (explicit)\r\n arg = argv[ph.param_no]\r\n }\r\n else { // positional argument (implicit)\r\n arg = argv[cursor++]\r\n }\r\n\r\n if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) {\r\n arg = arg()\r\n }\r\n\r\n if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg) && arg === undefined)) { // treat %_d as string if it has no argument\r\n arg = ph.placeholder;\r\n ph.type = \"s\";\r\n }\r\n\r\n if (re.number.test(ph.type)) {\r\n is_positive = typeof arg === \"string\" ? true : arg >= 0\r\n }\r\n\r\n switch (ph.type) {\r\n case 'b':\r\n arg = parseInt(arg, 10).toString(2)\r\n break\r\n case 'c':\r\n arg = String.fromCharCode(parseInt(arg, 10))\r\n break\r\n case 'd':\r\n case 'i':\r\n arg = typeof arg === \"number\" ? parseInt(arg, 10) : NaN\r\n break\r\n case 'j':\r\n arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0)\r\n break\r\n case 'e':\r\n arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential()\r\n break\r\n case 'f':\r\n arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg)\r\n break\r\n case 'g':\r\n arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg)\r\n break\r\n case 'o':\r\n arg = (parseInt(arg, 10) >>> 0).toString(8)\r\n break\r\n case 's':\r\n arg = String(arg)\r\n arg = arg === \"undefined\" ? ph.placeholder : (ph.precision ? arg.substring(0, ph.precision) : arg)\r\n break\r\n case 't':\r\n arg = String(!!arg)\r\n arg = (ph.precision ? arg.substring(0, ph.precision) : arg)\r\n break\r\n case 'T':\r\n arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase()\r\n arg = (ph.precision ? arg.substring(0, ph.precision) : arg)\r\n break\r\n case 'u':\r\n arg = parseInt(arg, 10) >>> 0\r\n break\r\n case 'v':\r\n arg = arg.valueOf()\r\n arg = (ph.precision ? arg.substring(0, ph.precision) : arg)\r\n break\r\n case 'x':\r\n arg = (parseInt(arg, 10) >>> 0).toString(16)\r\n break\r\n case 'X':\r\n arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase()\r\n break\r\n }\r\n if (re.json.test(ph.type)) {\r\n output += arg\r\n }\r\n else {\r\n if (re.number.test(ph.type) && (!is_positive || ph.sign)) {\r\n sign = is_positive ? '+' : '-'\r\n arg = arg.toString().replace(re.sign, '')\r\n }\r\n else {\r\n sign = ''\r\n }\r\n pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' '\r\n pad_length = ph.width - (sign + arg).length\r\n pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : ''\r\n output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg)\r\n }\r\n }\r\n }\r\n return output\r\n }\r\n\r\n var sprintf_cache = Object.create(null)\r\n\r\n function sprintf_parse(fmt) {\r\n var _fmt = fmt, match, parse_tree = [], arg_names = 0;\r\n while (_fmt) {\r\n if ((match = re.text.exec(_fmt)) !== null) {\r\n parse_tree.push(match[0]);\r\n }\r\n else if ((match = re.modulo.exec(_fmt)) !== null) {\r\n parse_tree.push('%');\r\n }\r\n else if ((match = re.placeholder.exec(_fmt)) !== null) {\r\n if (match[2]) {\r\n arg_names |= 1\r\n var field_list = [], replacement_field = match[2], field_match = []\r\n if ((field_match = re.key.exec(replacement_field)) !== null) {\r\n field_list.push(field_match[1])\r\n while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\r\n if ((field_match = re.key_access.exec(replacement_field)) !== null) {\r\n field_list.push(field_match[1])\r\n }\r\n else if ((field_match = re.index_access.exec(replacement_field)) !== null) {\r\n field_list.push(field_match[1])\r\n }\r\n else {\r\n throw new SyntaxError('[sprintf] failed to parse named argument key')\r\n }\r\n }\r\n }\r\n else {\r\n throw new SyntaxError('[sprintf] failed to parse named argument key')\r\n }\r\n match[2] = field_list\r\n }\r\n else {\r\n arg_names |= 2\r\n }\r\n if (arg_names === 3) {\r\n throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported')\r\n }\r\n\r\n parse_tree.push(\r\n {\r\n placeholder: match[0],\r\n param_no: match[1],\r\n keys: match[2],\r\n sign: match[3],\r\n pad_char: match[4],\r\n align: match[5],\r\n width: match[6],\r\n precision: match[7],\r\n type: match[8]\r\n }\r\n )\r\n }\r\n else if ((match = re.mod.exec(_fmt)) !== null) { // treat %_SPACE as a string\r\n parse_tree.push(match[0]);\r\n }\r\n else if ((match = re.notplaceholder.exec(_fmt)) !== null) { // treat %_NOTPLACEHOLDER as a string\r\n parse_tree.push(match[0]);\r\n }\r\n else {\r\n throw new SyntaxError('[sprintf] unexpected placeholder')\r\n }\r\n _fmt = _fmt.substring(match[0].length)\r\n }\r\n return parse_tree\r\n }\r\n\r\n app.sprintf = sprintf;\r\n app.vsprintf = vsprintf;\r\n return app;\r\n }\r\n\r\n //\r\n // Constructor\r\n // Can be named anything you want\r\n //\r\n\r\n var Constructor = function (options) {\r\n\r\n //\r\n // Unique Variables\r\n //\r\n\r\n var publicAPIs = {};\r\n var settings;\r\n\r\n function getPayload() {\r\n var payload = {\r\n \"url\": document.location.pathname || '/',\r\n \"application\": settings.application\r\n };\r\n\r\n var payload_data = [];\r\n\r\n if (document.documentMode) payload_data.push({ \"key\": \"Document-Mode\", \"value\": document.documentMode });\r\n if (window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth) payload_data.push({ \"key\": \"Browser-Width\", \"value\": window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth });\r\n if (window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight) payload_data.push({ \"key\": \"Browser-Height\", \"value\": window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight });\r\n if ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type) !== undefined) payload_data.push({ \"key\": \"Screen-Orientation\", \"value\": ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type).split(\"-\"))[0] });\r\n if (screen.width) payload_data.push({ \"key\": \"Screen-Width\", \"value\": screen.width });\r\n if (screen.height) payload_data.push({ \"key\": \"Screen-Height\", \"value\": screen.height });\r\n if (screen.colorDepth) payload_data.push({ \"key\": \"Color-Depth\", \"value\": screen.colorDepth });\r\n payload_data.push({ \"key\": \"X-ELMAHIO-SEARCH-isClientside\", \"value\": \"true\" });\r\n\r\n payload.data = payload_data;\r\n\r\n var payload_serverVariables = [];\r\n if (navigator.language) payload_serverVariables.push({ \"key\": \"User-Language\", \"value\": navigator.language });\r\n if (navigator.userAgent) payload_serverVariables.push({ \"key\": \"User-Agent\", \"value\": navigator.userAgent });\r\n if (document.referrer) payload_serverVariables.push({ \"key\": \"Referer\", \"value\": document.referrer });\r\n if (document.location.protocol === \"https:\") payload_serverVariables.push({ \"key\": \"HTTPS\", \"value\": 'on' });\r\n if (document.location.hostname) payload_serverVariables.push({ \"key\": \"Host\", \"value\": document.location.hostname });\r\n\r\n payload.serverVariables = payload_serverVariables;\r\n\r\n return payload;\r\n }\r\n\r\n function confirmResponse(status, response) {\r\n if (settings.debug) {\r\n if (status === 'error') {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2715 Not created ', debugSettings.lightCSS, debugSettings.errorCSS);\r\n } else if (status === 'success') {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2714 ' + response + ' at ' + new Date().toLocaleString() + ' ', debugSettings.lightCSS, debugSettings.successCSS);\r\n } else {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2715 Not created. Title should not be undefined, null or empty ! ', debugSettings.lightCSS, debugSettings.errorCSS);\r\n }\r\n }\r\n }\r\n\r\n function stackGPS(error, xhr, jsonData) {\r\n \tvar errorStack = error.toString().split(\"\\n\")[0];\r\n \tvar gps = new StackTraceGPS();\r\n var promise = new Promise(function(resolve) {\r\n\t var stackframes = ErrorStackParser.parse(error);\r\n\t resolve(Promise.all(stackframes.map(function(sf) {\r\n\t return new Promise(function(resolve) {\r\n\t function resolveOriginal() {\r\n\t resolve(sf);\r\n\t }\r\n\t gps.pinpoint(sf).then(resolve, resolveOriginal)['catch'](resolveOriginal);\r\n\t });\r\n\t })));\r\n \t}\r\n );\r\n\r\n promise.then(function(newFrames){\r\n \tnewFrames.forEach(function(stackFrame, i){\r\n\t\t\t\t\tif(stackFrame.functionName) {\r\n \t\t\tvar fn = stackFrame.functionName + ' ';\r\n \t\t} else {\r\n \t\t\tvar fn = '';\r\n \t\t}\r\n \t\tvar stackString = ' at ' + fn + '(' + stackFrame.fileName + ':' + stackFrame.lineNumber + ':' + stackFrame.columnNumber + ')';\r\n \t\tnewFrames[i] = stackString;\r\n \t});\r\n \tnewFrames.unshift(errorStack);\r\n \tjsonData.detail = newFrames.join(\"\\n\");\r\n \txhr.send(JSON.stringify(jsonData));\r\n });\r\n }\r\n\r\n function stackString(error) {\r\n \tvar typeOF = typeof error.error;\r\n \tvar typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1);\r\n\r\n \treturn typeOFCapitalized + ': ' + error.error + '\\n' + ' at ' + '(' + error.source + ':' + error.lineno + ':' + error.colno + ')';\r\n }\r\n\r\n // Private methods\r\n\r\n var sendPayload = function (apiKey, logId, callback, errorLog) {\r\n\r\n var api_key = apiKey,\r\n log_id = logId,\r\n error = errorLog,\r\n send = 1,\r\n queryParams = getSearchParameters(),\r\n stack = error.error && objectLength(error.error.stack) !== 0 && typeof error.error === \"object\" ? ErrorStackParser.parse(error.error) : '';\r\n\r\n // Ignoring error from an external script\r\n if (error && error.colno === 0 && error.lineno === 0 && (!stack || stack === '') && error.message && (error.message === \"Script error.\" || error.message === \"Script error\")) {\r\n\t\t\t if (settings.debug) {\r\n\t\t\t console.log('%c \\u2BC8 Error log: ' + '%c \\uD83D\\uDEC8 Ignoring error from external script ', debugSettings.lightCSS, debugSettings.warningCSS);\r\n\t\t\t }\r\n\t\t\t return;\r\n\t\t\t}\r\n\r\n if ((api_key !== null && log_id !== null) || (paramsLength === 2)) {\r\n\r\n // Priority for parameters\r\n if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n api_key = params['apiKey'];\r\n log_id = params['logId'];\r\n }\r\n\r\n // get new XHR object\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://api.elmah.io/v3/messages/\" + log_id + \"?api_key=\" + api_key, true);\r\n\r\n xhr.setRequestHeader('Content-type', 'application/json');\r\n\r\n xhr.onload = function (e) {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 201) {\r\n callback('success', xhr.statusText);\r\n }\r\n }\r\n };\r\n\r\n xhr.onerror = function (e) {\r\n callback('error', xhr.statusText);\r\n\r\n // on error event\r\n publicAPIs.emit('error', xhr.status, xhr.statusText);\r\n }\r\n\r\n var jsonData = {\r\n \"detail\": error.error ? error.error.stack : null,\r\n \"title\": error.message || 'Unspecified error',\r\n \"source\": stack && stack.length > 0 ? stack[0].fileName : null,\r\n \"severity\": \"Error\",\r\n \"type\": error.error ? error.error.name : null,\r\n \"queryString\": JSON.parse(JSON.stringify(queryParams))\r\n };\r\n\r\n // Check if error sent is a string and not an object\r\n // Then create the articifial stacktrace and pass source & type of the error\r\n if(error.error && (objectLength(error.error.stack) === 0) && typeof jsonData.detail === \"undefined\") {\r\n \tvar typeOF = typeof errorLog.error;\r\n \t\t\tvar typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1);\r\n\r\n \tjsonData.detail = stackString(errorLog);\r\n \tjsonData.source = errorLog.source;\r\n jsonData.title = \"Uncaught \" + typeOFCapitalized + \": \" + errorLog.error;\r\n }\r\n\r\n // Add payload to jsonData\r\n jsonData = merge_objects(jsonData, getPayload());\r\n\r\n // filter callback\r\n if (settings.filter !== null) {\r\n if (settings.filter(jsonData)) {\r\n send = 0;\r\n }\r\n }\r\n\r\n if (send === 1) {\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n\r\n if (error.error && typeof error.error === \"object\" && objectLength(error.error.stack) !== 0 && typeof Promise !== \"undefined\" && Promise.toString().indexOf(\"[native code]\") !== -1) {\r\n \t// send message trying to pinpoint stackframes\r\n \tstackGPS(error.error, xhr, jsonData);\r\n\t } else {\r\n\t \t// send message\r\n \txhr.send(JSON.stringify(jsonData));\r\n\t }\r\n }\r\n\r\n } else {\r\n return console.log('Login api error');\r\n }\r\n };\r\n\r\n var sendManualPayload = function (apiKey, logId, callback, logType, messageLog, errorLog) {\r\n var api_key = apiKey,\r\n log_id = logId,\r\n type = logType,\r\n error = errorLog,\r\n message = messageLog,\r\n send = 1,\r\n queryParams = getSearchParameters();\r\n\r\n if ((api_key !== null && log_id !== null) || (paramsLength === 2)) {\r\n\r\n // Priority for parameters\r\n if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n api_key = params['apiKey'];\r\n log_id = params['logId'];\r\n }\r\n\r\n // get new XHR object\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://api.elmah.io/v3/messages/\" + log_id + \"?api_key=\" + api_key, true);\r\n xhr.setRequestHeader('Content-type', 'application/json');\r\n\r\n xhr.onload = function (e) {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 201) {\r\n callback('success', xhr.statusText);\r\n }\r\n }\r\n };\r\n\r\n xhr.onerror = function (e) {\r\n callback('error', xhr.statusText);\r\n\r\n // on error event\r\n publicAPIs.emit('error', xhr.status, xhr.statusText);\r\n }\r\n\r\n if (type !== \"Log\") {\r\n\r\n var stack = error ? ErrorStackParser.parse(error) : null;\r\n\r\n var jsonData = {\r\n \"title\": message,\r\n \"source\": stack && stack.length > 0 ? stack[0].fileName : null,\r\n \"detail\": error ? error.stack : null,\r\n \"severity\": type,\r\n \"type\": error ? error.name : null,\r\n \"queryString\": JSON.parse(JSON.stringify(queryParams))\r\n };\r\n\r\n // Add payload to jsonData\r\n jsonData = merge_objects(jsonData, getPayload());\r\n\r\n } else {\r\n\r\n jsonData = error;\r\n\r\n }\r\n\r\n // filter callback\r\n if (settings.filter !== null) {\r\n if (settings.filter(jsonData)) {\r\n send = 0;\r\n }\r\n }\r\n\r\n if (send === 1) {\r\n if (jsonData.title) {\r\n\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n\r\n if (error && type !== \"Log\" && typeof Promise !== \"undefined\" && Promise.toString().indexOf(\"[native code]\") !== -1) {\r\n\t \t\t\t\t\t// send message trying to pinpoint stackframes\r\n \t\tstackGPS(error, xhr, jsonData);\r\n\t\t } else {\r\n\t\t \t// send message\r\n\t \txhr.send(JSON.stringify(jsonData));\r\n\t\t }\r\n\r\n } else {\r\n callback('missing-title', xhr.statusText);\r\n }\r\n }\r\n\r\n } else {\r\n return console.log('Login api error');\r\n }\r\n };\r\n\r\n var sendPayloadFromConsole = function (apiKey, logId, callback, logType, errorLog) {\r\n var api_key = apiKey,\r\n log_id = logId,\r\n message = errorLog.message,\r\n messageTemplate = errorLog.message,\r\n type = logType,\r\n args = Object.values(errorLog.arguments),\r\n send = 1,\r\n queryParams = getSearchParameters();\r\n\r\n // If message has placeholders (%s or %d), check for arguments and replace them\r\n \tif(String(message).match(/(%d|%s)+/ig) && args.length > 1) {\r\n \t\tvar sprintfJS = new sprintfjs();\r\n // Remove the first argument from array, which represents the message\r\n \t\targs.shift();\r\n message = sprintfJS.vsprintf(message, args);\r\n }\r\n\r\n if(typeof message !== \"string\"){\r\n message = message.toString();\r\n }\r\n\r\n if(typeof messageTemplate !== \"string\") {\r\n messageTemplate = messageTemplate.toString();\r\n }\r\n\r\n if ((api_key !== null && log_id !== null) || (paramsLength === 2)) {\r\n\r\n // Priority for parameters\r\n if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n api_key = params['apiKey'];\r\n log_id = params['logId'];\r\n }\r\n\r\n // get new XHR object\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://api.elmah.io/v3/messages/\" + log_id + \"?api_key=\" + api_key, true);\r\n xhr.setRequestHeader('Content-type', 'application/json');\r\n\r\n xhr.onload = function (e) {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 201) {\r\n callback('success', xhr.statusText);\r\n }\r\n }\r\n };\r\n\r\n xhr.onerror = function (e) {\r\n callback('error', xhr.statusText);\r\n // on error event\r\n publicAPIs.emit('error', xhr.status, xhr.statusText);\r\n }\r\n\r\n function manipulateStack (errorStack, severity, message) {\r\n var stack = [];\r\n for (var i = 0; i < errorStack.length; i++) {\r\n if(errorStack[i] === \"Error\") {\r\n stack.push(severity + \": \" + message);\r\n }\r\n if(!errorStack[i].match(/elmahio.js|elmahio.min.js/g) && errorStack[i] !== \"Error\") {\r\n stack.push(errorStack[i]);\r\n }\r\n }\r\n return stack.join('\\n');\r\n }\r\n\r\n var jsonData = {\r\n \"title\": message,\r\n \"titleTemplate\": messageTemplate,\r\n \"detail\": manipulateStack(new Error().stack.split('\\n'), type, message),\r\n \"severity\": type,\r\n \"type\": null,\r\n \"queryString\": JSON.parse(JSON.stringify(queryParams))\r\n };\r\n\r\n // Add payload to jsonData\r\n jsonData = merge_objects(jsonData, getPayload());\r\n\r\n // filter callback\r\n if (settings.filter !== null) {\r\n if (settings.filter(jsonData)) {\r\n send = 0;\r\n }\r\n }\r\n\r\n if (send === 1) {\r\n if (jsonData.title) {\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n // send message\r\n xhr.send(JSON.stringify(jsonData));\r\n } else {\r\n callback('missing-title', xhr.statusText);\r\n }\r\n }\r\n\r\n } else {\r\n return console.log('Login api error');\r\n }\r\n };\r\n\r\n // Some public methods\r\n\r\n publicAPIs.error = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg);\r\n };\r\n publicAPIs.error = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg, error);\r\n };\r\n\r\n publicAPIs.verbose = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg);\r\n };\r\n publicAPIs.verbose = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg, error);\r\n };\r\n\r\n publicAPIs.debug = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg);\r\n };\r\n publicAPIs.debug = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg, error);\r\n };\r\n\r\n publicAPIs.information = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg);\r\n };\r\n publicAPIs.information = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg, error);\r\n };\r\n\r\n publicAPIs.warning = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg);\r\n };\r\n publicAPIs.warning = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg, error);\r\n };\r\n\r\n publicAPIs.fatal = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg);\r\n };\r\n publicAPIs.fatal = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg, error);\r\n };\r\n\r\n publicAPIs.log = function (obj) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Log', null, obj);\r\n };\r\n\r\n publicAPIs.message = function() {\r\n return getPayload();\r\n };\r\n\r\n publicAPIs.on = function (name, callback, ctx) {\r\n var e = this.e || (this.e = {});\r\n\r\n (e[name] || (e[name] = [])).push({\r\n fn: callback,\r\n ctx: ctx\r\n });\r\n\r\n return this;\r\n };\r\n\r\n publicAPIs.emit = function (name) {\r\n var data = [].slice.call(arguments, 1);\r\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\r\n var i = 0;\r\n var len = evtArr.length;\r\n\r\n for (i; i < len; i++) {\r\n evtArr[i].fn.apply(evtArr[i].ctx, data);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n publicAPIs.init = function (options) {\r\n\r\n // -- Merge options into defaults\r\n settings = extend(defaults, options || {});\r\n\r\n // -- Log on window error\r\n window.onerror = function (message, source, lineno, colno, error) {\r\n\r\n var errorLog = {\r\n 'message': message,\r\n 'source': source,\r\n 'lineno': lineno,\r\n 'colno': colno,\r\n 'error': error\r\n }\r\n\r\n sendPayload(settings.apiKey, settings.logId, confirmResponse, errorLog);\r\n\r\n return false;\r\n }\r\n\r\n // -- Overriding console methods\r\n // -- Then log messages into the app.elmah.io\r\n if(options.captureConsoleMinimumLevel !== \"none\") {\r\n\r\n // If captureConsoleMinimumLevel: info or debug is set (error, warn)\r\n if(options.captureConsoleMinimumLevel === \"info\" || options.captureConsoleMinimumLevel === \"warn\" || options.captureConsoleMinimumLevel === \"error\" || options.captureConsoleMinimumLevel === \"debug\") {\r\n // Log console errors\r\n var _error = console.error;\r\n console.error = function(errMessage){\r\n var errorLog = {\r\n \t\t'message': errMessage,\r\n \t\t'arguments': arguments\r\n \t}\r\n sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Error', errorLog);\r\n _error.apply(console, arguments);\r\n };\r\n if(options.captureConsoleMinimumLevel !== \"error\") {\r\n // Log console warnings\r\n var _warning = console.warn;\r\n console.warn = function(warnMessage){\r\n var errorLog = {\r\n 'message': warnMessage,\r\n 'arguments': arguments\r\n }\r\n sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Warning', errorLog);\r\n _warning.apply(console, arguments);\r\n };\r\n }\r\n }\r\n if(options.captureConsoleMinimumLevel === \"info\" || options.captureConsoleMinimumLevel === \"debug\") {\r\n // Log console info\r\n var _info = console.info;\r\n console.info = function(infoMessage){\r\n var errorLog = {\r\n \t\t'message': infoMessage,\r\n \t\t'arguments': arguments\r\n \t}\r\n sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Information', errorLog);\r\n _info.apply(console, arguments);\r\n };\r\n }\r\n if(options.captureConsoleMinimumLevel === \"debug\") {\r\n // Log console debug\r\n var _debug = console.debug;\r\n console.debug = function(debugMessage){\r\n var errorLog = {\r\n \t\t'message': debugMessage,\r\n \t\t'arguments': arguments\r\n \t}\r\n sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Debug', errorLog);\r\n _debug.apply(console, arguments);\r\n };\r\n }\r\n }\r\n };\r\n\r\n // Initialize the plugin\r\n publicAPIs.init(options);\r\n\r\n if (settings.debug) {\r\n console.log('%c' + debugSettings.label, debugSettings.labelCSS);\r\n }\r\n\r\n // Return the public APIs\r\n return publicAPIs;\r\n\r\n };\r\n\r\n\r\n //\r\n // Return the constructor\r\n //\r\n\r\n if (paramsLength && params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n // Immediately-Invoked Function Expression (IIFE)\r\n return new Constructor;\r\n } else {\r\n // UMD Constructor\r\n return Constructor;\r\n }\r\n\r\n});\r\n"],"file":"elmahio.js"} diff --git a/dist/elmahio.min.js b/dist/elmahio.min.js index fc17d38..5fc098f 100644 --- a/dist/elmahio.min.js +++ b/dist/elmahio.min.js @@ -1,6 +1,6 @@ /*! - * elmah.io Javascript Logger - version 3.2.0 - * (c) 2018-2020 elmah.io, Apache 2.0 License, https://elmah.io + * elmah.io Javascript Logger - version 3.3.0 + * (c) 2018 elmah.io, Apache 2.0 License, https://elmah.io */ -!function(e,n){"function"==typeof define&&define.amd?define([],function(){return n(e)}):"object"==typeof exports?module.exports=n(e):e.Elmahio=n(e)}("undefined"!=typeof global?global:"undefined"!=typeof window?window:this,function(e){"use strict";var n,r,t,o=function(){function e(e){return!isNaN(parseFloat(e))&&isFinite(e)}function n(e){return e.charAt(0).toUpperCase()+e.substring(1)}function r(e){return function(){return this[e]}}var t=["isConstructor","isEval","isNative","isToplevel"],o=["columnNumber","lineNumber"],i=["fileName","functionName","source"],a=t.concat(o,i,["args"]);function s(e){if(e instanceof Object)for(var r=0;r-1&&(e=e.replace(/eval code/g,"eval").replace(/(\(eval at [^\()]*)|(\)\,.*$)/g,""));var n=e.replace(/^\s+/,"").replace(/\(eval code/g,"(").split(/\s+/).slice(1),r=this.extractLocation(n.pop()),t=n.join(" ")||void 0,i=["eval",""].indexOf(r[0])>-1?void 0:r[0];return new o({functionName:t,fileName:i,lineNumber:r[1],columnNumber:r[2],source:e})},this)},parseFFOrSafari:function(e){return e.stack.split("\n").filter(function(e){return!e.match(t)},this).map(function(e){if(e.indexOf(" > eval")>-1&&(e=e.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g,":$1")),-1===e.indexOf("@")&&-1===e.indexOf(":"))return new o({functionName:e});var n=/((.*".+"[^@]*)?[^@]*)(?:@)/,r=e.match(n),t=r&&r[1]?r[1]:void 0,i=this.extractLocation(e.replace(n,""));return new o({functionName:t,fileName:i[0],lineNumber:i[1],columnNumber:i[2],source:e})},this)},parseOpera:function(e){return!e.stacktrace||e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?this.parseOpera9(e):e.stack?this.parseOpera11(e):this.parseOpera10(e)},parseOpera9:function(e){for(var n=/Line (\d+).*script (?:in )?(\S+)/i,r=e.message.split("\n"),t=[],i=2,a=r.length;i/,"$2").replace(/\([^\)]*\)/g,"")||void 0;i.match(/\(([^\)]*)\)/)&&(n=i.replace(/^[^\(]+\(([^\)]*)\)$/,"$1"));var s=void 0===n||"[arguments not available]"===n?void 0:n.split(",");return new o({functionName:a,args:s,fileName:t[0],lineNumber:t[1],columnNumber:t[2],source:e})},this)}}),a=function(n,r){function t(e){return new Promise(function(n,r){var t=new XMLHttpRequest;t.open("get",e),t.onerror=r,t.onreadystatechange=function(){4===t.readyState&&(t.status>=200&&t.status<300||"file://"===e.substr(0,7)&&t.responseText?n(t.responseText):r(new Error("HTTP status: "+t.status+" retrieving "+e)))},t.send()})}function o(n){if(void 0!==e&&e.atob)return e.atob(n);throw new Error("You must supply a polyfill for window.atob in this environment")}function i(e){if("object"!=typeof e)throw new TypeError("Given StackFrame is not an object");if("string"!=typeof e.fileName)throw new TypeError("Given file name is not a String");if("number"!=typeof e.lineNumber||e.lineNumber%1!=0||e.lineNumber<1)throw new TypeError("Given line number must be a positive integer");if("number"!=typeof e.columnNumber||e.columnNumber%1!=0||e.columnNumber<0)throw new TypeError("Given column number must be a non-negative integer");return!0}return function e(a){if(!(this instanceof e))return new e(a);a=a||{},this.sourceCache=a.sourceCache||{},this.sourceMapConsumerCache=a.sourceMapConsumerCache||{},this.ajax=a.ajax||t,this._atob=a.atob||o,this._get=function(e){return new Promise(function(n,r){var t="data:"===e.substr(0,5);if(this.sourceCache[e])n(this.sourceCache[e]);else if(a.offline&&!t)r(new Error("Cannot make network requests in offline mode"));else if(t){var o=e.match(/^data:application\/json;([\w=:"-]+;)*base64,/);if(o){var i=o[0].length,s=e.substr(i),u=this._atob(s);this.sourceCache[e]=u,n(u)}else r(new Error("The encoding of the inline sourcemap is not supported"))}else{var l=this.ajax(e,{method:"get"});this.sourceCache[e]=l,l.then(n,r)}}.bind(this))},this._getSourceMapConsumer=function(e,r){return new Promise(function(t,o){if(this.sourceMapConsumerCache[e])t(this.sourceMapConsumerCache[e]);else{var i=new Promise(function(t,o){return this._get(e).then(function(e){"string"==typeof e&&(e=function(e){if("undefined"!=typeof JSON&&JSON.parse)return JSON.parse(e);throw new Error("You must supply a polyfill for JSON.parse in this environment")}(e.replace(/^\)\]\}'/,""))),void 0===e.sourceRoot&&(e.sourceRoot=r),t(new n.SourceMapConsumer(e))},o)}.bind(this));this.sourceMapConsumerCache[e]=i,t(i)}}.bind(this))},this.pinpoint=function(e){return new Promise(function(n,r){this.getMappedLocation(e).then(function(e){function r(){n(e)}this.findFunctionName(e).then(n,r).catch(r)}.bind(this),r)}.bind(this))},this.findFunctionName=function(e){return new Promise(function(n,t){i(e),this._get(e.fileName).then(function(t){var o=e.lineNumber,i=e.columnNumber,a=function(e,n){for(var r=[/['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*function\b/,/function\s+([^('"`]*?)\s*\(([^)]*)\)/,/['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*(?:eval|new Function)\b/,/\b(?!(?:if|for|switch|while|with|catch)\b)(?:(?:static)\s+)?(\S+)\s*\(.*?\)\s*\{/,/['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*\(.*?\)\s*=>/],t=e.split("\n"),o="",i=Math.min(n,20),a=0;a=0&&(s=s.substr(0,u)),s){o=s+o;for(var l=r.length,c=0;c=0){var s=this._originalMappings[a];if(void 0===e.column)for(var u=s.originalLine;s&&s.originalLine===u;)i.push({line:t.getArg(s,"generatedLine",null),column:t.getArg(s,"generatedColumn",null),lastColumn:t.getArg(s,"lastGeneratedColumn",null)}),s=this._originalMappings[++a];else for(var l=s.originalColumn;s&&s.originalLine===n&&s.originalColumn==l;)i.push({line:t.getArg(s,"generatedLine",null),column:t.getArg(s,"generatedColumn",null),lastColumn:t.getArg(s,"lastGeneratedColumn",null)}),s=this._originalMappings[++a]}return i},n.SourceMapConsumer=u,l.prototype=Object.create(u.prototype),l.prototype.consumer=u,l.fromSourceMap=function(e){var n=Object.create(l.prototype),r=n._names=i.fromArray(e._names.toArray(),!0),o=n._sources=i.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var a=e._mappings.toArray().slice(),u=n.__generatedMappings=[],g=n.__originalMappings=[],p=0,f=a.length;p1&&(r.source=m+i[1],m+=i[1],r.originalLine=f+i[2],f=r.originalLine,r.originalLine+=1,r.originalColumn=h+i[3],h=r.originalColumn,i.length>4&&(r.name=d+i[4],d+=i[4])),w.push(r),"number"==typeof r.originalLine&&C.push(r)}s(w,t.compareByGeneratedPositionsDeflated),this.__generatedMappings=w,s(C,t.compareByOriginalPositions),this.__originalMappings=C},l.prototype._findMapping=function(e,n,r,t,i,a){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return o.search(e,n,i,a)},l.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=t.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=t.join(this.sourceRoot,i)));var a=t.getArg(o,"name",null);return null!==a&&(a=this._names.at(a)),{source:i,line:t.getArg(o,"originalLine",null),column:t.getArg(o,"originalColumn",null),name:a}}}return{source:null,line:null,column:null,name:null}},l.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e})},l.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=t.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=t.urlParse(this.sourceRoot))){var o=e.replace(/^file:\/\//,"");if("file"==r.scheme&&this._sources.has(o))return this.sourcesContent[this._sources.indexOf(o)];if((!r.path||"/"==r.path)&&this._sources.has("/"+e))return this.sourcesContent[this._sources.indexOf("/"+e)]}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},l.prototype.generatedPositionFor=function(e){var n=t.getArg(e,"source");if(null!=this.sourceRoot&&(n=t.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};var r={source:n=this._sources.indexOf(n),originalLine:t.getArg(e,"line"),originalColumn:t.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",t.compareByOriginalPositions,t.getArg(e,"bias",u.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:t.getArg(i,"generatedLine",null),column:t.getArg(i,"generatedColumn",null),lastColumn:t.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=l,g.prototype=Object.create(u.prototype),g.prototype.constructor=u,g.prototype._version=3,Object.defineProperty(g.prototype,"sources",{get:function(){for(var e=[],n=0;n=0;c--)"."===(a=u[c])?u.splice(c,1):".."===a?l++:l>0&&(""===a?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return""===(r=u.join("/"))&&(r=s?"/":"."),t?(t.path=r,i(t)):r}n.urlParse=o,n.urlGenerate=i,n.normalize=a,n.join=function(e,n){""===e&&(e="."),""===n&&(n=".");var r=o(n),s=o(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),i(r);if(r||n.match(t))return n;if(s&&!s.host&&!s.path)return s.host=n,i(s);var u="/"===n.charAt(0)?n:a(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=u,i(s)):u},n.isAbsolute=function(e){return"/"===e.charAt(0)||!!e.match(r)},n.relative=function(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if((e=e.slice(0,t)).match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)};var s=!("__proto__"in Object.create(null));function u(e){return e}function l(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function c(e,n){return e===n?0:e>n?1:-1}n.toSetString=s?u:function(e){return l(e)?"$"+e:e},n.fromSetString=s?u:function(e){return l(e)?e.slice(1):e},n.compareByOriginalPositions=function(e,n,r){var t=e.source-n.source;return 0!==t?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)||r?t:0!=(t=e.generatedColumn-n.generatedColumn)?t:0!=(t=e.generatedLine-n.generatedLine)?t:e.name-n.name},n.compareByGeneratedPositionsDeflated=function(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:0!=(t=e.generatedColumn-n.generatedColumn)||r?t:0!=(t=e.source-n.source)?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)?t:e.name-n.name},n.compareByGeneratedPositionsInflated=function(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:0!=(r=e.generatedColumn-n.generatedColumn)?r:0!==(r=c(e.source,n.source))?r:0!=(r=e.originalLine-n.originalLine)?r:0!=(r=e.originalColumn-n.originalColumn)?r:c(e.name,n.name)}},function(e,n){n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,r,t,o){if(0===r.length)return-1;var i=function e(r,t,o,i,a,s){var u=Math.floor((t-r)/2)+r,l=a(o,i[u],!0);return 0===l?u:l>0?t-u>1?e(u,t,o,i,a,s):s==n.LEAST_UPPER_BOUND?t1?e(r,u,o,i,a,s):s==n.LEAST_UPPER_BOUND?u:r<0?-1:r}(-1,r.length,e,r,t,o||n.GREATEST_LOWER_BOUND);if(i<0)return-1;for(;i-1>=0&&0===t(r[i],r[i-1],!0);)--i;return i}},function(e,n,r){var t=r(1),o=Object.prototype.hasOwnProperty;function i(){this._array=[],this._set=Object.create(null)}i.fromArray=function(e,n){for(var r=new i,t=0,o=e.length;t=0&&e>>=5)>0&&(n|=32),o+=t.encode(n)}while(i>0);return o},n.decode=function(e,n,r){var o,i,a,s,u=e.length,l=0,c=0;do{if(n>=u)throw new Error("Expected more digits in base 64 VLQ value.");if(-1===(i=t.decode(e.charCodeAt(n++))))throw new Error("Invalid base64 digit: "+e.charAt(n-1));o=!!(32&i),l+=(i&=31)<>1,1==(1&a)?-s:s),r.rest=n}},function(e,n){var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");n.encode=function(e){if(0<=e&&e0?O[0].fileName:null,detail:y?y.stack:null,severity:v,type:y?y.name:null,queryString:JSON.parse(JSON.stringify(C))};S=m(S,o())}else S=y;null!==r.filter&&r.filter(S)&&(b=0),1===b&&(S.title?y&&"Log"!==v&&"undefined"!=typeof Promise&&-1!==Promise.toString().indexOf("[native code]")?d(y,w,S):(t.emit("message",S),w.send(JSON.stringify(S))):a("missing-title",w.statusText))};return t.error=function(e){v(r.apiKey,r.logId,s,"Error",e)},t.error=function(e,n){v(r.apiKey,r.logId,s,"Error",e,n)},t.verbose=function(e){v(r.apiKey,r.logId,s,"Verbose",e)},t.verbose=function(e,n){v(r.apiKey,r.logId,s,"Verbose",e,n)},t.debug=function(e){v(r.apiKey,r.logId,s,"Debug",e)},t.debug=function(e,n){v(r.apiKey,r.logId,s,"Debug",e,n)},t.information=function(e){v(r.apiKey,r.logId,s,"Information",e)},t.information=function(e,n){v(r.apiKey,r.logId,s,"Information",e,n)},t.warning=function(e){v(r.apiKey,r.logId,s,"Warning",e)},t.warning=function(e,n){v(r.apiKey,r.logId,s,"Warning",e,n)},t.fatal=function(e){v(r.apiKey,r.logId,s,"Fatal",e)},t.fatal=function(e,n){v(r.apiKey,r.logId,s,"Fatal",e,n)},t.log=function(e){v(r.apiKey,r.logId,s,"Log",null,e)},t.message=function(){return o()},t.on=function(e,n,r){var t=this.e||(this.e={});return(t[e]||(t[e]=[])).push({fn:n,ctx:r}),this},t.emit=function(e){for(var n=[].slice.call(arguments,1),r=((this.e||(this.e={}))[e]||[]).slice(),t=0,o=r.length;t0?b[0].fileName:null,severity:"Error",type:v.error?v.error.name:null,queryString:JSON.parse(JSON.stringify(_))};if(v.error&&0===f(v.error.stack)&&void 0===w.detail){var O=typeof s.error,S=O.charAt(0).toUpperCase()+O.slice(1);w.detail=function(e){var n=typeof e.error;return n.charAt(0).toUpperCase()+n.slice(1)+": "+e.error+"\n at ("+e.source+":"+e.lineno+":"+e.colno+")"}(s),w.source=s.source,w.title="Uncaught "+S+": "+s.error}w=m(w,o()),null!==r.filter&&r.filter(w)&&(y=0),1===y&&(v.error&&"object"==typeof v.error&&0!==f(v.error.stack)&&"undefined"!=typeof Promise&&-1!==Promise.toString().indexOf("[native code]")?d(v.error,C,w):(t.emit("message",w),C.send(JSON.stringify(w))))}else r.debug&&console.log("%c ⯈ Error log: %c 🛈 Ignoring error from external script ",c.lightCSS,c.warningCSS)}(r.apiKey,r.logId,s,v),!1}},t.init(n),r.debug&&(console.log("%c"+c.label,c.labelCSS),r.apiKey?32!==r.apiKey.length&&console.log("%c ⚠ API Key: %c The API Key must have exactly 32 characters long ",c.errorCSS,c.lightCSS):console.log("%c ⚠ API Key: %c The API Key is not set ",c.errorCSS,c.lightCSS),r.logId?r.logId.match(/^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$/gi)||console.log("%c ⚠ API Key: %c The Log ID is not valid ",c.errorCSS,c.lightCSS):console.log("%c ⚠ Log ID: %c The Log ID is not set ",c.errorCSS,c.lightCSS)),t};return l&&u.hasOwnProperty("apiKey")&&u.hasOwnProperty("logId")?new d:d}); +!function(e,n){"function"==typeof define&&define.amd?define([],function(){return n(e)}):"object"==typeof exports?module.exports=n(e):e.Elmahio=n(e)}("undefined"!=typeof global?global:"undefined"!=typeof window?window:this,function(e){"use strict";var n,r,t,o=function(){function e(e){return!isNaN(parseFloat(e))&&isFinite(e)}function n(e){return e.charAt(0).toUpperCase()+e.substring(1)}function r(e){return function(){return this[e]}}var t=["isConstructor","isEval","isNative","isToplevel"],o=["columnNumber","lineNumber"],i=["fileName","functionName","source"],a=t.concat(o,i,["args"]);function s(e){if(e instanceof Object)for(var r=0;r-1&&(e=e.replace(/eval code/g,"eval").replace(/(\(eval at [^\()]*)|(\)\,.*$)/g,""));var n=e.replace(/^\s+/,"").replace(/\(eval code/g,"(").split(/\s+/).slice(1),r=this.extractLocation(n.pop()),t=n.join(" ")||void 0,i=["eval",""].indexOf(r[0])>-1?void 0:r[0];return new o({functionName:t,fileName:i,lineNumber:r[1],columnNumber:r[2],source:e})},this)},parseFFOrSafari:function(e){return e.stack.split("\n").filter(function(e){return!e.match(t)},this).map(function(e){if(e.indexOf(" > eval")>-1&&(e=e.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g,":$1")),-1===e.indexOf("@")&&-1===e.indexOf(":"))return new o({functionName:e});var n=/((.*".+"[^@]*)?[^@]*)(?:@)/,r=e.match(n),t=r&&r[1]?r[1]:void 0,i=this.extractLocation(e.replace(n,""));return new o({functionName:t,fileName:i[0],lineNumber:i[1],columnNumber:i[2],source:e})},this)},parseOpera:function(e){return!e.stacktrace||e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?this.parseOpera9(e):e.stack?this.parseOpera11(e):this.parseOpera10(e)},parseOpera9:function(e){for(var n=/Line (\d+).*script (?:in )?(\S+)/i,r=e.message.split("\n"),t=[],i=2,a=r.length;i/,"$2").replace(/\([^\)]*\)/g,"")||void 0;i.match(/\(([^\)]*)\)/)&&(n=i.replace(/^[^\(]+\(([^\)]*)\)$/,"$1"));var s=void 0===n||"[arguments not available]"===n?void 0:n.split(",");return new o({functionName:a,args:s,fileName:t[0],lineNumber:t[1],columnNumber:t[2],source:e})},this)}}),a=function(n,r){function t(e){return new Promise(function(n,r){var t=new XMLHttpRequest;t.open("get",e),t.onerror=r,t.onreadystatechange=function(){4===t.readyState&&(t.status>=200&&t.status<300||"file://"===e.substr(0,7)&&t.responseText?n(t.responseText):r(new Error("HTTP status: "+t.status+" retrieving "+e)))},t.send()})}function o(n){if(void 0!==e&&e.atob)return e.atob(n);throw new Error("You must supply a polyfill for window.atob in this environment")}function i(e){if("object"!=typeof e)throw new TypeError("Given StackFrame is not an object");if("string"!=typeof e.fileName)throw new TypeError("Given file name is not a String");if("number"!=typeof e.lineNumber||e.lineNumber%1!=0||e.lineNumber<1)throw new TypeError("Given line number must be a positive integer");if("number"!=typeof e.columnNumber||e.columnNumber%1!=0||e.columnNumber<0)throw new TypeError("Given column number must be a non-negative integer");return!0}return function e(a){if(!(this instanceof e))return new e(a);a=a||{},this.sourceCache=a.sourceCache||{},this.sourceMapConsumerCache=a.sourceMapConsumerCache||{},this.ajax=a.ajax||t,this._atob=a.atob||o,this._get=function(e){return new Promise(function(n,r){var t="data:"===e.substr(0,5);if(this.sourceCache[e])n(this.sourceCache[e]);else if(a.offline&&!t)r(new Error("Cannot make network requests in offline mode"));else if(t){var o=e.match(/^data:application\/json;([\w=:"-]+;)*base64,/);if(o){var i=o[0].length,s=e.substr(i),u=this._atob(s);this.sourceCache[e]=u,n(u)}else r(new Error("The encoding of the inline sourcemap is not supported"))}else{var l=this.ajax(e,{method:"get"});this.sourceCache[e]=l,l.then(n,r)}}.bind(this))},this._getSourceMapConsumer=function(e,r){return new Promise(function(t,o){if(this.sourceMapConsumerCache[e])t(this.sourceMapConsumerCache[e]);else{var i=new Promise(function(t,o){return this._get(e).then(function(e){"string"==typeof e&&(e=function(e){if("undefined"!=typeof JSON&&JSON.parse)return JSON.parse(e);throw new Error("You must supply a polyfill for JSON.parse in this environment")}(e.replace(/^\)\]\}'/,""))),void 0===e.sourceRoot&&(e.sourceRoot=r),t(new n.SourceMapConsumer(e))},o)}.bind(this));this.sourceMapConsumerCache[e]=i,t(i)}}.bind(this))},this.pinpoint=function(e){return new Promise(function(n,r){this.getMappedLocation(e).then(function(e){function r(){n(e)}this.findFunctionName(e).then(n,r).catch(r)}.bind(this),r)}.bind(this))},this.findFunctionName=function(e){return new Promise(function(n,t){i(e),this._get(e.fileName).then(function(t){var o=e.lineNumber,i=e.columnNumber,a=function(e,n){for(var r=[/['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*function\b/,/function\s+([^('"`]*?)\s*\(([^)]*)\)/,/['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*(?:eval|new Function)\b/,/\b(?!(?:if|for|switch|while|with|catch)\b)(?:(?:static)\s+)?(\S+)\s*\(.*?\)\s*\{/,/['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*\(.*?\)\s*=>/],t=e.split("\n"),o="",i=Math.min(n,20),a=0;a=0&&(s=s.substr(0,u)),s){o=s+o;for(var l=r.length,c=0;c=0){var s=this._originalMappings[a];if(void 0===e.column)for(var u=s.originalLine;s&&s.originalLine===u;)i.push({line:t.getArg(s,"generatedLine",null),column:t.getArg(s,"generatedColumn",null),lastColumn:t.getArg(s,"lastGeneratedColumn",null)}),s=this._originalMappings[++a];else for(var l=s.originalColumn;s&&s.originalLine===n&&s.originalColumn==l;)i.push({line:t.getArg(s,"generatedLine",null),column:t.getArg(s,"generatedColumn",null),lastColumn:t.getArg(s,"lastGeneratedColumn",null)}),s=this._originalMappings[++a]}return i},n.SourceMapConsumer=u,l.prototype=Object.create(u.prototype),l.prototype.consumer=u,l.fromSourceMap=function(e){var n=Object.create(l.prototype),r=n._names=i.fromArray(e._names.toArray(),!0),o=n._sources=i.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var a=e._mappings.toArray().slice(),u=n.__generatedMappings=[],p=n.__originalMappings=[],g=0,f=a.length;g1&&(r.source=m+i[1],m+=i[1],r.originalLine=f+i[2],f=r.originalLine,r.originalLine+=1,r.originalColumn=h+i[3],h=r.originalColumn,i.length>4&&(r.name=d+i[4],d+=i[4])),C.push(r),"number"==typeof r.originalLine&&w.push(r)}s(C,t.compareByGeneratedPositionsDeflated),this.__generatedMappings=C,s(w,t.compareByOriginalPositions),this.__originalMappings=w},l.prototype._findMapping=function(e,n,r,t,i,a){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return o.search(e,n,i,a)},l.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=t.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=t.join(this.sourceRoot,i)));var a=t.getArg(o,"name",null);return null!==a&&(a=this._names.at(a)),{source:i,line:t.getArg(o,"originalLine",null),column:t.getArg(o,"originalColumn",null),name:a}}}return{source:null,line:null,column:null,name:null}},l.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e})},l.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=t.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=t.urlParse(this.sourceRoot))){var o=e.replace(/^file:\/\//,"");if("file"==r.scheme&&this._sources.has(o))return this.sourcesContent[this._sources.indexOf(o)];if((!r.path||"/"==r.path)&&this._sources.has("/"+e))return this.sourcesContent[this._sources.indexOf("/"+e)]}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},l.prototype.generatedPositionFor=function(e){var n=t.getArg(e,"source");if(null!=this.sourceRoot&&(n=t.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};var r={source:n=this._sources.indexOf(n),originalLine:t.getArg(e,"line"),originalColumn:t.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",t.compareByOriginalPositions,t.getArg(e,"bias",u.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:t.getArg(i,"generatedLine",null),column:t.getArg(i,"generatedColumn",null),lastColumn:t.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=l,p.prototype=Object.create(u.prototype),p.prototype.constructor=u,p.prototype._version=3,Object.defineProperty(p.prototype,"sources",{get:function(){for(var e=[],n=0;n=0;c--)"."===(a=u[c])?u.splice(c,1):".."===a?l++:l>0&&(""===a?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return""===(r=u.join("/"))&&(r=s?"/":"."),t?(t.path=r,i(t)):r}n.urlParse=o,n.urlGenerate=i,n.normalize=a,n.join=function(e,n){""===e&&(e="."),""===n&&(n=".");var r=o(n),s=o(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),i(r);if(r||n.match(t))return n;if(s&&!s.host&&!s.path)return s.host=n,i(s);var u="/"===n.charAt(0)?n:a(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=u,i(s)):u},n.isAbsolute=function(e){return"/"===e.charAt(0)||!!e.match(r)},n.relative=function(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if((e=e.slice(0,t)).match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)};var s=!("__proto__"in Object.create(null));function u(e){return e}function l(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function c(e,n){return e===n?0:e>n?1:-1}n.toSetString=s?u:function(e){return l(e)?"$"+e:e},n.fromSetString=s?u:function(e){return l(e)?e.slice(1):e},n.compareByOriginalPositions=function(e,n,r){var t=e.source-n.source;return 0!==t?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)||r?t:0!=(t=e.generatedColumn-n.generatedColumn)?t:0!=(t=e.generatedLine-n.generatedLine)?t:e.name-n.name},n.compareByGeneratedPositionsDeflated=function(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:0!=(t=e.generatedColumn-n.generatedColumn)||r?t:0!=(t=e.source-n.source)?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)?t:e.name-n.name},n.compareByGeneratedPositionsInflated=function(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:0!=(r=e.generatedColumn-n.generatedColumn)?r:0!==(r=c(e.source,n.source))?r:0!=(r=e.originalLine-n.originalLine)?r:0!=(r=e.originalColumn-n.originalColumn)?r:c(e.name,n.name)}},function(e,n){n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,r,t,o){if(0===r.length)return-1;var i=function e(r,t,o,i,a,s){var u=Math.floor((t-r)/2)+r,l=a(o,i[u],!0);return 0===l?u:l>0?t-u>1?e(u,t,o,i,a,s):s==n.LEAST_UPPER_BOUND?t1?e(r,u,o,i,a,s):s==n.LEAST_UPPER_BOUND?u:r<0?-1:r}(-1,r.length,e,r,t,o||n.GREATEST_LOWER_BOUND);if(i<0)return-1;for(;i-1>=0&&0===t(r[i],r[i-1],!0);)--i;return i}},function(e,n,r){var t=r(1),o=Object.prototype.hasOwnProperty;function i(){this._array=[],this._set=Object.create(null)}i.fromArray=function(e,n){for(var r=new i,t=0,o=e.length;t=0&&e>>=5)>0&&(n|=32),o+=t.encode(n)}while(i>0);return o},n.decode=function(e,n,r){var o,i,a,s,u=e.length,l=0,c=0;do{if(n>=u)throw new Error("Expected more digits in base 64 VLQ value.");if(-1===(i=t.decode(e.charCodeAt(n++))))throw new Error("Invalid base64 digit: "+e.charAt(n-1));o=!!(32&i),l+=(i&=31)<>1,1==(1&a)?-s:s),r.rest=n}},function(e,n){var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");n.encode=function(e){if(0<=e&&e=0),s.type){case"b":o=parseInt(o,10).toString(2);break;case"c":o=String.fromCharCode(parseInt(o,10));break;case"d":case"i":o="number"==typeof o?parseInt(o,10):NaN;break;case"j":o=JSON.stringify(o,null,s.width?parseInt(s.width):0);break;case"e":o=s.precision?parseFloat(o).toExponential(s.precision):parseFloat(o).toExponential();break;case"f":o=s.precision?parseFloat(o).toFixed(s.precision):parseFloat(o);break;case"g":o=s.precision?String(Number(o.toPrecision(s.precision))):parseFloat(o);break;case"o":o=(parseInt(o,10)>>>0).toString(8);break;case"s":o="undefined"===(o=String(o))?s.placeholder:s.precision?o.substring(0,s.precision):o;break;case"t":o=String(!!o),o=s.precision?o.substring(0,s.precision):o;break;case"T":o=Object.prototype.toString.call(o).slice(8,-1).toLowerCase(),o=s.precision?o.substring(0,s.precision):o;break;case"u":o=parseInt(o,10)>>>0;break;case"v":o=o.valueOf(),o=s.precision?o.substring(0,s.precision):o;break;case"x":o=(parseInt(o,10)>>>0).toString(16);break;case"X":o=(parseInt(o,10)>>>0).toString(16).toUpperCase()}n.json.test(s.type)?m+=o:(!n.number.test(s.type)||p&&!s.sign?g="":(g=p?"+":"-",o=o.toString().replace(n.sign,"")),l=s.pad_char?"0"===s.pad_char?"0":s.pad_char.charAt(1):" ",c=s.width-(g+o).length,u=s.width&&c>0?l.repeat(c):"",m+=s.align?g+o+u:"0"===l?g+u+o:u+g+o)}return m}(function(e){var r,t=e,o=[],i=0;for(;t;){if(null!==(r=n.text.exec(t)))o.push(r[0]);else if(null!==(r=n.modulo.exec(t)))o.push("%");else if(null!==(r=n.placeholder.exec(t))){if(r[2]){i|=1;var a=[],s=r[2],u=[];if(null===(u=n.key.exec(s)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(a.push(u[1]);""!==(s=s.substring(u[0].length));)if(null!==(u=n.key_access.exec(s)))a.push(u[1]);else{if(null===(u=n.index_access.exec(s)))throw new SyntaxError("[sprintf] failed to parse named argument key");a.push(u[1])}r[2]=a}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");o.push({placeholder:r[0],param_no:r[1],keys:r[2],sign:r[3],pad_char:r[4],align:r[5],width:r[6],precision:r[7],type:r[8]})}else if(null!==(r=n.mod.exec(t)))o.push(r[0]);else{if(null===(r=n.notplaceholder.exec(t)))throw new SyntaxError("[sprintf] unexpected placeholder");o.push(r[0])}t=t.substring(r[0].length)}return o}(e),arguments)}Object.create(null);return e.sprintf=r,e.vsprintf=function(e,n){return r.apply(null,[e].concat(n||[]))},e},v=function(n){var r,t={};function o(){var n={url:document.location.pathname||"/",application:r.application},t=[];document.documentMode&&t.push({key:"Document-Mode",value:document.documentMode}),(e.innerWidth||document.documentElement.clientWidth||document.getElementsByTagName("body")[0].clientWidth)&&t.push({key:"Browser-Width",value:e.innerWidth||document.documentElement.clientWidth||document.getElementsByTagName("body")[0].clientWidth}),(e.innerHeight||document.documentElement.clientHeight||document.getElementsByTagName("body")[0].clientHeight)&&t.push({key:"Browser-Height",value:e.innerHeight||document.documentElement.clientHeight||document.getElementsByTagName("body")[0].clientHeight}),void 0!==(screen.msOrientation||(screen.orientation||screen.mozOrientation||{}).type)&&t.push({key:"Screen-Orientation",value:(screen.msOrientation||(screen.orientation||screen.mozOrientation||{}).type).split("-")[0]}),screen.width&&t.push({key:"Screen-Width",value:screen.width}),screen.height&&t.push({key:"Screen-Height",value:screen.height}),screen.colorDepth&&t.push({key:"Color-Depth",value:screen.colorDepth}),t.push({key:"X-ELMAHIO-SEARCH-isClientside",value:"true"}),n.data=t;var o=[];return navigator.language&&o.push({key:"User-Language",value:navigator.language}),navigator.userAgent&&o.push({key:"User-Agent",value:navigator.userAgent}),document.referrer&&o.push({key:"Referer",value:document.referrer}),"https:"===document.location.protocol&&o.push({key:"HTTPS",value:"on"}),document.location.hostname&&o.push({key:"Host",value:document.location.hostname}),n.serverVariables=o,n}function s(e,n){r.debug&&("error"===e?console.log("%c ⯈ Error log: %c ✕ Not created ",c.lightCSS,c.errorCSS):"success"===e?console.log("%c ⯈ Error log: %c ✔ "+n+" at "+(new Date).toLocaleString()+" ",c.lightCSS,c.successCSS):console.log("%c ⯈ Error log: %c ✕ Not created. Title should not be undefined, null or empty ! ",c.lightCSS,c.errorCSS))}function v(e,n,r){var t=e.toString().split("\n")[0],o=new a;new Promise(function(n){var r=i.parse(e);n(Promise.all(r.map(function(e){return new Promise(function(n){function r(){n(e)}o.pinpoint(e).then(n,r).catch(r)})})))}).then(function(e){e.forEach(function(n,r){if(n.functionName)var t=n.functionName+" ";else t="";var o=" at "+t+"("+n.fileName+":"+n.lineNumber+":"+n.columnNumber+")";e[r]=o}),e.unshift(t),r.detail=e.join("\n"),n.send(JSON.stringify(r))})}var y=function(e,n,a,s,c,p){var g=e,f=n,d=s,y=p,b=c,_=1,w=h();if((null===g||null===f)&&2!==l)return console.log("Login api error");u.hasOwnProperty("apiKey")&&u.hasOwnProperty("logId")&&(g=u.apiKey,f=u.logId);var C=new XMLHttpRequest;if(C.open("POST","https://api.elmah.io/v3/messages/"+f+"?api_key="+g,!0),C.setRequestHeader("Content-type","application/json"),C.onload=function(e){4===C.readyState&&201===C.status&&a("success",C.statusText)},C.onerror=function(e){a("error",C.statusText),t.emit("error",C.status,C.statusText)},"Log"!==d){var O=y?i.parse(y):null,S={title:b,source:O&&O.length>0?O[0].fileName:null,detail:y?y.stack:null,severity:d,type:y?y.name:null,queryString:JSON.parse(JSON.stringify(w))};S=m(S,o())}else S=y;null!==r.filter&&r.filter(S)&&(_=0),1===_&&(S.title?(t.emit("message",S),y&&"Log"!==d&&"undefined"!=typeof Promise&&-1!==Promise.toString().indexOf("[native code]")?v(y,C,S):C.send(JSON.stringify(S))):a("missing-title",C.statusText))},b=function(e,n,i,a,s){var c=e,p=n,g=s.message,f=s.message,v=a,y=Object.values(s.arguments),b=1,_=h();if(String(g).match(/(%d|%s)+/gi)&&y.length>1){var w=new d;y.shift(),g=w.vsprintf(g,y)}if("string"!=typeof g&&(g=g.toString()),"string"!=typeof f&&(f=f.toString()),(null===c||null===p)&&2!==l)return console.log("Login api error");u.hasOwnProperty("apiKey")&&u.hasOwnProperty("logId")&&(c=u.apiKey,p=u.logId);var C=new XMLHttpRequest;C.open("POST","https://api.elmah.io/v3/messages/"+p+"?api_key="+c,!0),C.setRequestHeader("Content-type","application/json"),C.onload=function(e){4===C.readyState&&201===C.status&&i("success",C.statusText)},C.onerror=function(e){i("error",C.statusText),t.emit("error",C.status,C.statusText)};var O={title:g,titleTemplate:f,detail:function(e,n,r){for(var t=[],o=0;o0?_[0].fileName:null,severity:"Error",type:d.error?d.error.name:null,queryString:JSON.parse(JSON.stringify(b))};if(d.error&&0===f(d.error.stack)&&void 0===C.detail){var O=typeof s.error,S=O.charAt(0).toUpperCase()+O.slice(1);C.detail=function(e){var n=typeof e.error;return n.charAt(0).toUpperCase()+n.slice(1)+": "+e.error+"\n at ("+e.source+":"+e.lineno+":"+e.colno+")"}(s),C.source=s.source,C.title="Uncaught "+S+": "+s.error}C=m(C,o()),null!==r.filter&&r.filter(C)&&(y=0),1===y&&(t.emit("message",C),d.error&&"object"==typeof d.error&&0!==f(d.error.stack)&&"undefined"!=typeof Promise&&-1!==Promise.toString().indexOf("[native code]")?v(d.error,w,C):w.send(JSON.stringify(C)))}else r.debug&&console.log("%c ⯈ Error log: %c 🛈 Ignoring error from external script ",c.lightCSS,c.warningCSS)}(r.apiKey,r.logId,s,d),!1},"none"!==n.captureConsoleMinimumLevel){if("info"===n.captureConsoleMinimumLevel||"warn"===n.captureConsoleMinimumLevel||"error"===n.captureConsoleMinimumLevel||"debug"===n.captureConsoleMinimumLevel){var a=console.error;if(console.error=function(e){var n={message:e,arguments:arguments};b(r.apiKey,r.logId,s,"Error",n),a.apply(console,arguments)},"error"!==n.captureConsoleMinimumLevel){var d=console.warn;console.warn=function(e){var n={message:e,arguments:arguments};b(r.apiKey,r.logId,s,"Warning",n),d.apply(console,arguments)}}}if("info"===n.captureConsoleMinimumLevel||"debug"===n.captureConsoleMinimumLevel){var y=console.info;console.info=function(e){var n={message:e,arguments:arguments};b(r.apiKey,r.logId,s,"Information",n),y.apply(console,arguments)}}if("debug"===n.captureConsoleMinimumLevel){var _=console.debug;console.debug=function(e){var n={message:e,arguments:arguments};b(r.apiKey,r.logId,s,"Debug",n),_.apply(console,arguments)}}}},t.init(n),r.debug&&console.log("%c"+c.label,c.labelCSS),t};return l&&u.hasOwnProperty("apiKey")&&u.hasOwnProperty("logId")?new v:v}); //# sourceMappingURL=elmahio.min.js.map diff --git a/dist/elmahio.min.js.map b/dist/elmahio.min.js.map index cc3227d..f951b53 100644 --- a/dist/elmahio.min.js.map +++ b/dist/elmahio.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["elmahio.js"],"names":["root","factory","define","amd","exports","module","Elmahio","global","window","this","FIREFOX_SAFARI_STACK_REGEXP","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","StackFrame","_isNumber","n","isNaN","parseFloat","isFinite","_capitalize","str","charAt","toUpperCase","substring","_getter","p","booleanProps","numericProps","stringProps","props","concat","obj","Object","i","length","hasOwnProperty","undefined","prototype","getArgs","args","setArgs","v","toString","call","TypeError","getEvalOrigin","evalOrigin","setEvalOrigin","getFunctionName","join","getFileName","getLineNumber","getColumnNumber","fromString","argsStartIndex","indexOf","argsEndIndex","lastIndexOf","functionName","split","locationString","parts","exec","fileName","lineNumber","columnNumber","Boolean","j","Number","k","String","ErrorStackParser","parse","error","stacktrace","parseOpera","stack","match","parseV8OrIE","parseFFOrSafari","Error","extractLocation","urlLike","replace","filter","line","map","tokens","slice","locationParts","pop","source","functionNameRegex","matches","e","message","parseOpera9","parseOpera11","parseOpera10","lineRE","lines","result","len","push","argsRaw","functionCall","shift","StackTraceGPS","SourceMap","_xdr","url","Promise","resolve","reject","req","XMLHttpRequest","open","onerror","onreadystatechange","readyState","status","substr","responseText","send","_atob","b64str","atob","_ensureStackFrameIsLegit","stackframe","opts","sourceCache","sourceMapConsumerCache","ajax","_get","location","isDataUrl","offline","sourceMapStart","encodedSource","xhrPromise","method","then","bind","_getSourceMapConsumer","sourceMappingURL","defaultSourceRoot","sourceMapConsumerPromise","sourceMapSource","string","JSON","_parseJson","sourceRoot","SourceMapConsumer","pinpoint","getMappedLocation","mappedStackFrame","resolveMappedStackFrame","findFunctionName","guessedFunctionName","syntaxes","code","maxLines","Math","min","commentPos","index","m","_findFunctionName","defineProperty","create","_ensureSupportedEnvironment","lastSourceMappingUrl","matchSourceMappingUrl","sourceMappingUrlRegExp","_findSourceMappingURL","test","sourceMapConsumer","loc","originalPositionFor","column","mappedSource","sourceContentFor","name","_extractLocationInfoFromSourceMapSource","r","t","o","id","loaded","c","ArraySet","a","s","quickSort","u","sections","l","getArg","g","_version","normalize","isAbsolute","relative","_names","fromArray","_sources","sourcesContent","_mappings","file","generatedLine","generatedColumn","originalLine","originalColumn","_sections","generatedOffset","consumer","fromSourceMap","__generatedMappings","get","_parseMappings","__originalMappings","_charIsMappingSeparator","GENERATED_ORDER","ORIGINAL_ORDER","GREATEST_LOWER_BOUND","LEAST_UPPER_BOUND","eachMapping","_generatedMappings","_originalMappings","at","forEach","allGeneratedPositionsFor","has","_findMapping","compareByOriginalPositions","lastColumn","toArray","_sourceRoot","_generateSourcesContent","_file","h","f","d","_","C","A","y","L","decode","value","rest","compareByGeneratedPositionsDeflated","search","computeColumnSpans","lastGeneratedColumn","hasContentsOfAllSources","size","some","urlParse","scheme","path","generatedPositionFor","BasicSourceMapConsumer","constructor","sources","bias","every","add","IndexedSourceMapConsumer","arguments","auth","host","port","splice","urlGenerate","Array","charCodeAt","toSetString","fromSetString","compareByGeneratedPositionsInflated","floor","_array","_set","getOwnPropertyNames","encode","round","random","scriptFile","document","getElementsByTagName","params","query","Params","Pairs","KeyVal","key","unescape","val","parseQuery","src","paramsLength","objectLength","debugSettings","label","labelCSS","successCSS","errorCSS","warningCSS","lightCSS","defaults","apiKey","logId","debug","application","extend","extended","deep","merge","prop","getSearchParameters","prmstr","prmarr","tmparr","transformToAssocArray","merge_objects","obj1","obj2","obj3","attrname1","attrname2","Constructor","options","settings","publicAPIs","getPayload","payload","pathname","payload_data","documentMode","innerWidth","documentElement","clientWidth","innerHeight","clientHeight","screen","msOrientation","orientation","mozOrientation","type","width","height","colorDepth","data","payload_serverVariables","navigator","language","userAgent","referrer","protocol","hostname","serverVariables","confirmResponse","response","console","log","Date","toLocaleString","stackGPS","xhr","jsonData","errorStack","gps","stackframes","all","sf","resolveOriginal","newFrames","stackFrame","fn","stackString","unshift","detail","emit","stringify","sendManualPayload","callback","logType","messageLog","errorLog","api_key","log_id","queryParams","setRequestHeader","onload","statusText","title","severity","queryString","msg","verbose","information","warning","fatal","on","ctx","evtArr","apply","init","lineno","colno","typeOF","typeOFCapitalized","sendPayload"],"mappings":";;;;CAIA,SAAUA,EAAMC,GACQ,mBAAXC,QAAyBA,OAAOC,IACzCD,OAAO,GAAI,WACT,OAAOD,EAAQD,KAEW,iBAAZI,QAChBC,OAAOD,QAAUH,EAAQD,GAEzBA,EAAKM,QAAUL,EAAQD,GAR3B,CAUqB,oBAAXO,OAAyBA,OAA2B,oBAAXC,OAAyBA,OAASC,KAAM,SAASD,GAClG,aACA,IAiHME,EACAC,EACAC,EAnHFC,EAAa,WAGf,SAASC,EAAUC,GACjB,OAAQC,MAAMC,WAAWF,KAAOG,SAASH,GAG3C,SAASI,EAAYC,GACnB,OAAOA,EAAIC,OAAO,GAAGC,cAAgBF,EAAIG,UAAU,GAGrD,SAASC,EAAQC,GACf,OAAO,WACL,OAAOhB,KAAKgB,IAGhB,IAAIC,EAAe,CAAC,gBAAiB,SAAU,WAAY,cACvDC,EAAe,CAAC,eAAgB,cAChCC,EAAc,CAAC,WAAY,eAAgB,UAE3CC,EAAQH,EAAaI,OAAOH,EAAcC,EAD7B,CAAC,SAGlB,SAASf,EAAWkB,GAClB,GAAIA,aAAeC,OACjB,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,EAAMK,OAAQD,IAC5BF,EAAII,eAAeN,EAAMI,UAAyBG,IAAlBL,EAAIF,EAAMI,KAC5CxB,KAAK,MAAQU,EAAYU,EAAMI,KAAKF,EAAIF,EAAMI,KAKtDpB,EAAWwB,UAAY,CACrBC,QAAS,WACP,OAAO7B,KAAK8B,MAEdC,QAAS,SAASC,GAChB,GAA0C,mBAAtCT,OAAOK,UAAUK,SAASC,KAAKF,GACjC,MAAM,IAAIG,UAAU,yBAEtBnC,KAAK8B,KAAOE,GAEdI,cAAe,WACb,OAAOpC,KAAKqC,YAEdC,cAAe,SAASN,GACtB,GAAIA,aAAa5B,EACfJ,KAAKqC,WAAaL,MACb,CAAA,KAAIA,aAAaT,QAGtB,MAAM,IAAIY,UAAU,+CAFpBnC,KAAKqC,WAAa,IAAIjC,EAAW4B,KAKrCC,SAAU,WAMR,OALmBjC,KAAKuC,mBAAqB,gBAClC,KAAOvC,KAAK6B,WAAa,IAAIW,KAAK,KAAO,MACrCxC,KAAKyC,cAAgB,IAAMzC,KAAKyC,cAAgB,KAC9CpC,EAAUL,KAAK0C,iBAAmB,IAAM1C,KAAK0C,gBAAkB,KAC7DrC,EAAUL,KAAK2C,mBAAqB,IAAM3C,KAAK2C,kBAAoB,MAI1FvC,EAAWwC,WAAa,SAAgCjC,GACtD,IAAIkC,EAAiBlC,EAAImC,QAAQ,KAC7BC,EAAepC,EAAIqC,YAAY,KAC/BC,EAAetC,EAAIG,UAAU,EAAG+B,GAChCf,EAAOnB,EAAIG,UAAU+B,EAAiB,EAAGE,GAAcG,MAAM,KAC7DC,EAAiBxC,EAAIG,UAAUiC,EAAe,GAClD,GAAoC,IAAhCI,EAAeL,QAAQ,KACzB,IAAIM,EAAQ,gCAAgCC,KAAKF,EAAgB,IAC7DG,EAAWF,EAAM,GACjBG,EAAaH,EAAM,GACnBI,EAAeJ,EAAM,GAE3B,OAAO,IAAIhD,EAAW,CACpB6C,aAAcA,EACdnB,KAAMA,QAAQH,EACd2B,SAAUA,EACVC,WAAYA,QAAc5B,EAC1B6B,aAAcA,QAAgB7B,KAGlC,IAAK,IAAIH,EAAI,EAAGA,EAAIP,EAAaQ,OAAQD,IACvCpB,EAAWwB,UAAU,MAAQlB,EAAYO,EAAaO,KAAOT,EAAQE,EAAaO,IAClFpB,EAAWwB,UAAU,MAAQlB,EAAYO,EAAaO,KAAO,SAASR,GACpE,OAAO,SAASgB,GACdhC,KAAKgB,GAAKyC,QAAQzB,IAFuC,CAI3Df,EAAaO,IAEjB,IAAK,IAAIkC,EAAI,EAAGA,EAAIxC,EAAaO,OAAQiC,IACvCtD,EAAWwB,UAAU,MAAQlB,EAAYQ,EAAawC,KAAO3C,EAAQG,EAAawC,IAClFtD,EAAWwB,UAAU,MAAQlB,EAAYQ,EAAawC,KAAO,SAAS1C,GACpE,OAAO,SAASgB,GACd,IAAK3B,EAAU2B,GACb,MAAM,IAAIG,UAAUnB,EAAI,qBAE1BhB,KAAKgB,GAAK2C,OAAO3B,IALwC,CAO3Dd,EAAawC,IAEjB,IAAK,IAAIE,EAAI,EAAGA,EAAIzC,EAAYM,OAAQmC,IACtCxD,EAAWwB,UAAU,MAAQlB,EAAYS,EAAYyC,KAAO7C,EAAQI,EAAYyC,IAChFxD,EAAWwB,UAAU,MAAQlB,EAAYS,EAAYyC,KAAO,SAAS5C,GACnE,OAAO,SAASgB,GACdhC,KAAKgB,GAAK6C,OAAO7B,IAFuC,CAI1Db,EAAYyC,IAEhB,OAAOxD,EA7GQ,GA+Gb0D,GAEE7D,EAA8B,gBAC9BC,EAAyB,kCACzBC,EAA4B,+BACzB,CACL4D,MAAO,SAAiCC,GACtC,QAAgC,IAArBA,EAAMC,iBAAkE,IAA7BD,EAAM,mBAC1D,OAAOhE,KAAKkE,WAAWF,GAClB,GAAIA,EAAMG,OAASH,EAAMG,MAAMC,MAAMlE,GAC1C,OAAOF,KAAKqE,YAAYL,GACnB,GAAIA,EAAMG,MACf,OAAOnE,KAAKsE,gBAAgBN,GAE5B,MAAM,IAAIO,MAAM,oCAGpBC,gBAAiB,SAA2CC,GAC1D,IAA8B,IAA1BA,EAAQ3B,QAAQ,KAClB,MAAO,CAAC2B,GAEV,IACIrB,EADS,iCACMC,KAAKoB,EAAQC,QAAQ,UAAW,KACnD,MAAO,CAACtB,EAAM,GAAIA,EAAM,SAAMzB,EAAWyB,EAAM,SAAMzB,IAEvD0C,YAAa,SAAuCL,GAIlD,OAHeA,EAAMG,MAAMjB,MAAM,MAAMyB,OAAO,SAASC,GACrD,QAASA,EAAKR,MAAMlE,IACnBF,MACa6E,IAAI,SAASD,GACvBA,EAAK9B,QAAQ,WAAa,IAC5B8B,EAAOA,EAAKF,QAAQ,aAAc,QAAQA,QAAQ,iCAAkC,KAEtF,IAAII,EAASF,EAAKF,QAAQ,OAAQ,IAAIA,QAAQ,eAAgB,KAAKxB,MAAM,OAAO6B,MAAM,GAClFC,EAAgBhF,KAAKwE,gBAAgBM,EAAOG,OAC5ChC,EAAe6B,EAAOtC,KAAK,WAAQb,EACnC2B,EAAW,CAAC,OAAQ,eAAeR,QAAQkC,EAAc,KAAO,OAAIrD,EAAYqD,EAAc,GAClG,OAAO,IAAI5E,EAAW,CACpB6C,aAAcA,EACdK,SAAUA,EACVC,WAAYyB,EAAc,GAC1BxB,aAAcwB,EAAc,GAC5BE,OAAQN,KAET5E,OAELsE,gBAAiB,SAA2CN,GAI1D,OAHeA,EAAMG,MAAMjB,MAAM,MAAMyB,OAAO,SAASC,GACrD,OAAQA,EAAKR,MAAMjE,IAClBH,MACa6E,IAAI,SAASD,GAI3B,GAHIA,EAAK9B,QAAQ,YAAc,IAC7B8B,EAAOA,EAAKF,QAAQ,qDAAsD,SAEjD,IAAvBE,EAAK9B,QAAQ,OAAsC,IAAvB8B,EAAK9B,QAAQ,KAC3C,OAAO,IAAI1C,EAAW,CACpB6C,aAAc2B,IAGhB,IAAIO,EAAoB,6BACpBC,EAAUR,EAAKR,MAAMe,GACrBlC,EAAemC,GAAWA,EAAQ,GAAKA,EAAQ,QAAKzD,EACpDqD,EAAgBhF,KAAKwE,gBAAgBI,EAAKF,QAAQS,EAAmB,KACzE,OAAO,IAAI/E,EAAW,CACpB6C,aAAcA,EACdK,SAAU0B,EAAc,GACxBzB,WAAYyB,EAAc,GAC1BxB,aAAcwB,EAAc,GAC5BE,OAAQN,KAGX5E,OAELkE,WAAY,SAAsCmB,GAChD,OAAKA,EAAEpB,YAAcoB,EAAEC,QAAQxC,QAAQ,OAAS,GAAKuC,EAAEC,QAAQpC,MAAM,MAAMzB,OAAS4D,EAAEpB,WAAWf,MAAM,MAAMzB,OACpGzB,KAAKuF,YAAYF,GACdA,EAAElB,MAGLnE,KAAKwF,aAAaH,GAFlBrF,KAAKyF,aAAaJ,IAK7BE,YAAa,SAAuCF,GAIlD,IAHA,IAAIK,EAAS,oCACTC,EAAQN,EAAEC,QAAQpC,MAAM,MACxB0C,EAAS,GACJpE,EAAI,EAAGqE,EAAMF,EAAMlE,OAAQD,EAAIqE,EAAKrE,GAAK,EAAG,CACnD,IAAI4C,EAAQsB,EAAOrC,KAAKsC,EAAMnE,IAC1B4C,GACFwB,EAAOE,KAAK,IAAI1F,EAAW,CACzBkD,SAAUc,EAAM,GAChBb,WAAYa,EAAM,GAClBc,OAAQS,EAAMnE,MAIpB,OAAOoE,GAETH,aAAc,SAAwCJ,GAIpD,IAHA,IAAIK,EAAS,6DACTC,EAAQN,EAAEpB,WAAWf,MAAM,MAC3B0C,EAAS,GACJpE,EAAI,EAAGqE,EAAMF,EAAMlE,OAAQD,EAAIqE,EAAKrE,GAAK,EAAG,CACnD,IAAI4C,EAAQsB,EAAOrC,KAAKsC,EAAMnE,IAC1B4C,GACFwB,EAAOE,KAAK,IAAI1F,EAAW,CACzB6C,aAAcmB,EAAM,SAAMzC,EAC1B2B,SAAUc,EAAM,GAChBb,WAAYa,EAAM,GAClBc,OAAQS,EAAMnE,MAIpB,OAAOoE,GAETJ,aAAc,SAAwCxB,GAIpD,OAHeA,EAAMG,MAAMjB,MAAM,MAAMyB,OAAO,SAASC,GACrD,QAASA,EAAKR,MAAMnE,KAAiC2E,EAAKR,MAAM,sBAC/DpE,MACa6E,IAAI,SAASD,GAC3B,IAIImB,EAJAjB,EAASF,EAAK1B,MAAM,KACpB8B,EAAgBhF,KAAKwE,gBAAgBM,EAAOG,OAC5Ce,EAAelB,EAAOmB,SAAW,GACjChD,EAAe+C,EAAatB,QAAQ,iCAAkC,MAAMA,QAAQ,cAAe,UAAO/C,EAE1GqE,EAAa5B,MAAM,kBACrB2B,EAAUC,EAAatB,QAAQ,uBAAwB,OAEzD,IAAI5C,OAAmBH,IAAZoE,GAAqC,8BAAZA,OAA0CpE,EAAYoE,EAAQ7C,MAAM,KACxG,OAAO,IAAI9C,EAAW,CACpB6C,aAAcA,EACdnB,KAAMA,EACNwB,SAAU0B,EAAc,GACxBzB,WAAYyB,EAAc,GAC1BxB,aAAcwB,EAAc,GAC5BE,OAAQN,KAET5E,SA8fLkG,EAAgB,SAAUC,EAAW/F,GAGvC,SAASgG,EAAKC,GACZ,OAAO,IAAIC,QAAQ,SAASC,EAASC,GACnC,IAAIC,EAAM,IAAIC,eACdD,EAAIE,KAAK,MAAON,GAChBI,EAAIG,QAAUJ,EACdC,EAAII,mBAAqB,WACA,IAAnBJ,EAAIK,aACFL,EAAIM,QAAU,KAAON,EAAIM,OAAS,KAA4B,YAArBV,EAAIW,OAAO,EAAG,IAAoBP,EAAIQ,aACjFV,EAAQE,EAAIQ,cAEZT,EAAO,IAAIjC,MAAM,gBAAkBkC,EAAIM,OAAS,eAAiBV,MAIvEI,EAAIS,SAIR,SAASC,EAAMC,GACb,QAAsB,IAAXrH,GAA0BA,EAAOsH,KAC1C,OAAOtH,EAAOsH,KAAKD,GAEnB,MAAM,IAAI7C,MAAM,kEA2CpB,SAAS+C,EAAyBC,GAChC,GAA0B,iBAAfA,EACT,MAAM,IAAIpF,UAAU,qCACf,GAAmC,iBAAxBoF,EAAWjE,SAC3B,MAAM,IAAInB,UAAU,mCACf,GAAqC,iBAA1BoF,EAAWhE,YAA2BgE,EAAWhE,WAAa,GAAM,GAAKgE,EAAWhE,WAAa,EACjH,MAAM,IAAIpB,UAAU,gDACf,GAAuC,iBAA5BoF,EAAW/D,cAA6B+D,EAAW/D,aAAe,GAAM,GAAK+D,EAAW/D,aAAe,EACvH,MAAM,IAAIrB,UAAU,sDAEtB,OAAO,EAwCT,OAAO,SAAS+D,EAAcsB,GAC5B,KAAMxH,gBAAgBkG,GACpB,OAAO,IAAIA,EAAcsB,GAE3BA,EAAOA,GAAQ,GACfxH,KAAKyH,YAAcD,EAAKC,aAAe,GACvCzH,KAAK0H,uBAAyBF,EAAKE,wBAA0B,GAC7D1H,KAAK2H,KAAOH,EAAKG,MAAQvB,EACzBpG,KAAKmH,MAAQK,EAAKH,MAAQF,EAC1BnH,KAAK4H,KAAO,SAAcC,GACxB,OAAO,IAAIvB,QAAQ,SAASC,EAASC,GACnC,IAAIsB,EAAsC,UAA1BD,EAASb,OAAO,EAAG,GACnC,GAAIhH,KAAKyH,YAAYI,GACnBtB,EAAQvG,KAAKyH,YAAYI,SACpB,GAAIL,EAAKO,UAAYD,EAC1BtB,EAAO,IAAIjC,MAAM,sDAEjB,GAAIuD,EAAW,CACb,IACI1D,EAAQyD,EAASzD,MADS,gDAE9B,GAAIA,EAAO,CACT,IAAI4D,EAAiB5D,EAAM,GAAG3C,OAC1BwG,EAAgBJ,EAASb,OAAOgB,GAChC9C,EAASlF,KAAKmH,MAAMc,GACxBjI,KAAKyH,YAAYI,GAAY3C,EAC7BqB,EAAQrB,QAERsB,EAAO,IAAIjC,MAAM,8DAEd,CACL,IAAI2D,EAAalI,KAAK2H,KAAKE,EAAU,CACnCM,OAAQ,QAEVnI,KAAKyH,YAAYI,GAAYK,EAC7BA,EAAWE,KAAK7B,EAASC,KAG7B6B,KAAKrI,QAETA,KAAKsI,sBAAwB,SAA+BC,EAAkBC,GAC5E,OAAO,IAAIlC,QAAQ,SAASC,EAASC,GACnC,GAAIxG,KAAK0H,uBAAuBa,GAC9BhC,EAAQvG,KAAK0H,uBAAuBa,QAC/B,CACL,IAAIE,EAA2B,IAAInC,QAAQ,SAASC,EAASC,GAC3D,OAAOxG,KAAK4H,KAAKW,GAAkBH,KAAK,SAASM,GAChB,iBAApBA,IACTA,EAxId,SAAoBC,GAClB,GAAoB,oBAATC,MAAwBA,KAAK7E,MACtC,OAAO6E,KAAK7E,MAAM4E,GAElB,MAAM,IAAIpE,MAAM,iEAoIYsE,CAAWH,EAAgBhE,QAAQ,WAAY,WAEzB,IAA/BgE,EAAgBI,aACzBJ,EAAgBI,WAAaN,GAE/BjC,EAAQ,IAAIJ,EAAU4C,kBAAkBL,KACvClC,IACH6B,KAAKrI,OACPA,KAAK0H,uBAAuBa,GAAoBE,EAChDlC,EAAQkC,KAEVJ,KAAKrI,QAETA,KAAKgJ,SAAW,SAAiCzB,GAC/C,OAAO,IAAIjB,QAAQ,SAASC,EAASC,GACnCxG,KAAKiJ,kBAAkB1B,GAAYa,KAAK,SAASc,GAC/C,SAASC,IACP5C,EAAQ2C,GAEVlJ,KAAKoJ,iBAAiBF,GAAkBd,KAAK7B,EAAS4C,GAAgC,MAAEA,IACxFd,KAAKrI,MAAOwG,IACd6B,KAAKrI,QAETA,KAAKoJ,iBAAmB,SAAyC7B,GAC/D,OAAO,IAAIjB,QAAQ,SAASC,EAASC,GACnCc,EAAyBC,GACzBvH,KAAK4H,KAAKL,EAAWjE,UAAU8E,KAAK,SAA2BlD,GAC7D,IAAI3B,EAAagE,EAAWhE,WACxBC,EAAe+D,EAAW/D,aAC1B6F,EA7JZ,SAA2BnE,EAAQ3B,GAKjC,IAJA,IAAI+F,EAAW,CAAC,2DAA4D,uCAAwC,wEAAyE,mFAAoF,8DAC7Q3D,EAAQT,EAAOhC,MAAM,MACrBqG,EAAO,GACPC,EAAWC,KAAKC,IAAInG,EAAY,IAC3B/B,EAAI,EAAGA,EAAIgI,IAAYhI,EAAG,CACjC,IAAIoD,EAAOe,EAAMpC,EAAa/B,EAAI,GAC9BmI,EAAa/E,EAAK9B,QAAQ,MAI9B,GAHI6G,GAAc,IAChB/E,EAAOA,EAAKoC,OAAO,EAAG2C,IAEpB/E,EAAM,CACR2E,EAAO3E,EAAO2E,EAEd,IADA,IAAI1D,EAAMyD,EAAS7H,OACVmI,EAAQ,EAAGA,EAAQ/D,EAAK+D,IAAS,CACxC,IAAIC,EAAIP,EAASM,GAAOvG,KAAKkG,GAC7B,GAAIM,GAAKA,EAAE,GACT,OAAOA,EAAE,MA4IeC,CAAkB5E,EAAQ3B,GAElDgD,EADE8C,EACM,IAAIjJ,EAAW,CACrB6C,aAAcoG,EACdvH,KAAMyF,EAAWzF,KACjBwB,SAAUiE,EAAWjE,SACrBC,WAAYA,EACZC,aAAcA,IAGR+D,IAETf,GAAe,MAAEA,IACpB6B,KAAKrI,QAETA,KAAKiJ,kBAAoB,SAA0C1B,GACjE,OAAO,IAAIjB,QAAQ,SAASC,EAASC,IApJzC,WACE,GAAqC,mBAA1BjF,OAAOwI,gBAA0D,mBAAlBxI,OAAOyI,OAC/D,MAAM,IAAIzF,MAAM,mDAmJd0F,GACA3C,EAAyBC,GACzB,IAAIE,EAAczH,KAAKyH,YACnBnE,EAAWiE,EAAWjE,SAC1BtD,KAAK4H,KAAKtE,GAAU8E,KAAK,SAASlD,GAChC,IAAIqD,EAvIZ,SAA+BrD,GAI7B,IAHA,IACIgF,EACAC,EAFAC,EAAyB,8CAGtBD,EAAwBC,EAAuB/G,KAAK6B,IACzDgF,EAAuBC,EAAsB,GAE/C,GAAID,EACF,OAAOA,EAEP,MAAM,IAAI3F,MAAM,8BA6HW8F,CAAsBnF,GACzC4C,EAA8C,UAAlCS,EAAiBvB,OAAO,EAAG,GACvCwB,EAAoBlF,EAASxC,UAAU,EAAGwC,EAASN,YAAY,KAAO,GAI1E,MAH4B,MAAxBuF,EAAiB,IAAeT,GAAc,sBAAsBwC,KAAK/B,KAC3EA,EAAmBC,EAAoBD,GAElCvI,KAAKsI,sBAAsBC,EAAkBC,GAAmBJ,KAAK,SAASmC,GACnF,OAhIV,SAAiDhD,EAAYgD,EAAmB9C,GAC9E,OAAO,IAAInB,QAAQ,SAASC,EAASC,GACnC,IAAIgE,EAAMD,EAAkBE,oBAAoB,CAC9C7F,KAAM2C,EAAWhE,WACjBmH,OAAQnD,EAAW/D,eAErB,GAAIgH,EAAItF,OAAQ,CACd,IAAIyF,EAAeJ,EAAkBK,iBAAiBJ,EAAItF,QACtDyF,IACFlD,EAAY+C,EAAItF,QAAUyF,GAE5BpE,EAAQ,IAAInG,EAAW,CACrB6C,aAAcuH,EAAIK,MAAQtD,EAAWtE,aACrCnB,KAAMyF,EAAWzF,KACjBwB,SAAUkH,EAAItF,OACd3B,WAAYiH,EAAI5F,KAChBpB,aAAcgH,EAAIE,eAGpBlE,EAAO,IAAIjC,MAAM,wEA6GNuG,CAAwCvD,EAAYgD,EAAmB9C,GAAaW,KAAK7B,GAAgB,MAAE,WAChHA,EAAQgB,QAGZc,KAAKrI,MAAOwG,GAAe,MAAEA,IAC/B6B,KAAKrI,SApOO,CA1fJ,SAASqF,GACvB,IAAI/E,EAAI,GAER,SAASyK,EAAEC,GACT,GAAI1K,EAAE0K,GAAI,OAAO1K,EAAE0K,GAAGrL,QACtB,IAAIsL,EAAI3K,EAAE0K,GAAK,CACbrL,QAAS,GACTuL,GAAIF,EACJG,QAAQ,GAEV,OAAO9F,EAAE2F,GAAG9I,KAAK+I,EAAEtL,QAASsL,EAAGA,EAAEtL,QAASoL,GAAIE,EAAEE,QAAS,EAAIF,EAAEtL,QAEjE,OAAOoL,EAAElB,EAAIxE,EAAG0F,EAAEK,EAAI9K,EAAGyK,EAAE/J,EAAI,GAAI+J,EAAE,GAZvB,CAad,CAAC,SAAS1F,EAAG/E,EAAGyK,GAChB,IAAIC,EAAID,EAAE,GACRE,EAAIF,EAAE,GACNvJ,EAAIuJ,EAAE,GAAGM,SACTC,EAAIP,EAAE,GACNQ,EAAIR,EAAE,GAAGS,UAEX,SAASC,EAAEpG,GACT,IAAI/E,EAAI+E,EACR,MAAO,iBAAmBA,IAAM/E,EAAIsI,KAAK7E,MAAMsB,EAAEX,QAAQ,WAAY,MAAO,MAAQpE,EAAEoL,SAAW,IAAIN,EAAE9K,GAAK,IAAIqL,EAAErL,GAGpH,SAASqL,EAAEtG,GACT,IAAI/E,EAAI+E,EACR,iBAAmBA,IAAM/E,EAAIsI,KAAK7E,MAAMsB,EAAEX,QAAQ,WAAY,MAC9D,IAAIqG,EAAIC,EAAEY,OAAOtL,EAAG,WAClB2K,EAAID,EAAEY,OAAOtL,EAAG,WAChBgL,EAAIN,EAAEY,OAAOtL,EAAG,QAAS,IACzBiL,EAAIP,EAAEY,OAAOtL,EAAG,aAAc,MAC9BmL,EAAIT,EAAEY,OAAOtL,EAAG,iBAAkB,MAClCqL,EAAIX,EAAEY,OAAOtL,EAAG,YAChBuL,EAAIb,EAAEY,OAAOtL,EAAG,OAAQ,MAC1B,GAAIyK,GAAK/K,KAAK8L,SAAU,MAAM,IAAIvH,MAAM,wBAA0BwG,GAClEE,EAAIA,EAAEpG,IAAIhB,QAAQgB,IAAImG,EAAEe,WAAWlH,IAAI,SAASQ,GAC9C,OAAOkG,GAAKP,EAAEgB,WAAWT,IAAMP,EAAEgB,WAAW3G,GAAK2F,EAAEiB,SAASV,EAAGlG,GAAKA,IAClErF,KAAKkM,OAAS1K,EAAE2K,UAAUb,EAAEzG,IAAIhB,SAAS,GAAK7D,KAAKoM,SAAW5K,EAAE2K,UAAUlB,GAAG,GAAKjL,KAAK8I,WAAayC,EAAGvL,KAAKqM,eAAiBZ,EAAGzL,KAAKsM,UAAYX,EAAG3L,KAAKuM,KAAOV,EAGtK,SAASA,IACP7L,KAAKwM,cAAgB,EAAGxM,KAAKyM,gBAAkB,EAAGzM,KAAKkF,OAAS,KAAMlF,KAAK0M,aAAe,KAAM1M,KAAK2M,eAAiB,KAAM3M,KAAK6K,KAAO,KAG1I,SAASO,EAAE/F,GACT,IAAI/E,EAAI+E,EACR,iBAAmBA,IAAM/E,EAAIsI,KAAK7E,MAAMsB,EAAEX,QAAQ,WAAY,MAC9D,IAAIqG,EAAIC,EAAEY,OAAOtL,EAAG,WAClB2K,EAAID,EAAEY,OAAOtL,EAAG,YAClB,GAAIyK,GAAK/K,KAAK8L,SAAU,MAAM,IAAIvH,MAAM,wBAA0BwG,GAClE/K,KAAKoM,SAAW,IAAI5K,EAAGxB,KAAKkM,OAAS,IAAI1K,EACzC,IAAI8J,EAAI,CACN1G,MAAO,EACP8F,OAAQ,GAEV1K,KAAK4M,UAAY3B,EAAEpG,IAAI,SAASQ,GAC9B,GAAIA,EAAEgB,IAAK,MAAM,IAAI9B,MAAM,sDAC3B,IAAIjE,EAAI0K,EAAEY,OAAOvG,EAAG,UAClB0F,EAAIC,EAAEY,OAAOtL,EAAG,QAChB2K,EAAID,EAAEY,OAAOtL,EAAG,UAClB,GAAIyK,EAAIO,EAAE1G,MAAQmG,IAAMO,EAAE1G,MAAQqG,EAAIK,EAAEZ,OAAQ,MAAM,IAAInG,MAAM,wDAChE,OAAO+G,EAAIhL,EAAG,CACZuM,gBAAiB,CACfL,cAAezB,EAAI,EACnB0B,gBAAiBxB,EAAI,GAEvB6B,SAAU,IAAIrB,EAAET,EAAEY,OAAOvG,EAAG,WAIlCoG,EAAEsB,cAAgB,SAAS1H,GACzB,OAAOsG,EAAEoB,cAAc1H,IACtBoG,EAAE7J,UAAUkK,SAAW,EAAGL,EAAE7J,UAAUoL,oBAAsB,KAAMzL,OAAOwI,eAAe0B,EAAE7J,UAAW,qBAAsB,CAC5HqL,IAAK,WACH,OAAOjN,KAAKgN,qBAAuBhN,KAAKkN,eAAelN,KAAKsM,UAAWtM,KAAK8I,YAAa9I,KAAKgN,uBAE9FvB,EAAE7J,UAAUuL,mBAAqB,KAAM5L,OAAOwI,eAAe0B,EAAE7J,UAAW,oBAAqB,CACjGqL,IAAK,WACH,OAAOjN,KAAKmN,oBAAsBnN,KAAKkN,eAAelN,KAAKsM,UAAWtM,KAAK8I,YAAa9I,KAAKmN,sBAE7F1B,EAAE7J,UAAUwL,wBAA0B,SAAS/H,EAAG/E,GACpD,IAAIyK,EAAI1F,EAAEzE,OAAON,GACjB,MAAO,MAAQyK,GAAK,MAAQA,GAC3BU,EAAE7J,UAAUsL,eAAiB,SAAS7H,EAAG/E,GAC1C,MAAM,IAAIiE,MAAM,6CACfkH,EAAE4B,gBAAkB,EAAG5B,EAAE6B,eAAiB,EAAG7B,EAAE8B,qBAAuB,EAAG9B,EAAE+B,kBAAoB,EAAG/B,EAAE7J,UAAU6L,YAAc,SAASpI,EAAG/E,EAAGyK,GAC5I,IAAIE,EAAGzJ,EAAIlB,GAAK,KAChB,OAAQyK,GAAKU,EAAE4B,iBACb,KAAK5B,EAAE4B,gBACLpC,EAAIjL,KAAK0N,mBACT,MACF,KAAKjC,EAAE6B,eACLrC,EAAIjL,KAAK2N,kBACT,MACF,QACE,MAAM,IAAIpJ,MAAM,+BAEpB,IAAI+G,EAAItL,KAAK8I,WACbmC,EAAEpG,IAAI,SAASQ,GACb,IAAI/E,EAAI,OAAS+E,EAAEH,OAAS,KAAOlF,KAAKoM,SAASwB,GAAGvI,EAAEH,QACtD,OAAO,MAAQ5E,GAAK,MAAQgL,IAAMhL,EAAI0K,EAAExI,KAAK8I,EAAGhL,IAAK,CACnD4E,OAAQ5E,EACRkM,cAAenH,EAAEmH,cACjBC,gBAAiBpH,EAAEoH,gBACnBC,aAAcrH,EAAEqH,aAChBC,eAAgBtH,EAAEsH,eAClB9B,KAAM,OAASxF,EAAEwF,KAAO,KAAO7K,KAAKkM,OAAO0B,GAAGvI,EAAEwF,QAEjD7K,MAAM6N,QAAQxI,EAAG7D,IACnBiK,EAAE7J,UAAUkM,yBAA2B,SAASzI,GACjD,IAAI/E,EAAI0K,EAAEY,OAAOvG,EAAG,QAClB0F,EAAI,CACF7F,OAAQ8F,EAAEY,OAAOvG,EAAG,UACpBqH,aAAcpM,EACdqM,eAAgB3B,EAAEY,OAAOvG,EAAG,SAAU,IAE1C,GAAI,MAAQrF,KAAK8I,aAAeiC,EAAE7F,OAAS8F,EAAEiB,SAASjM,KAAK8I,WAAYiC,EAAE7F,UAAWlF,KAAKoM,SAAS2B,IAAIhD,EAAE7F,QAAS,MAAO,GACxH6F,EAAE7F,OAASlF,KAAKoM,SAAStJ,QAAQiI,EAAE7F,QACnC,IAAI1D,EAAI,GACN8J,EAAItL,KAAKgO,aAAajD,EAAG/K,KAAK2N,kBAAmB,eAAgB,iBAAkB3C,EAAEiD,2BAA4BhD,EAAEuC,mBACrH,GAAIlC,GAAK,EAAG,CACV,IAAIC,EAAIvL,KAAK2N,kBAAkBrC,GAC/B,QAAI,IAAWjG,EAAEqF,OACf,IAAK,IAAIe,EAAIF,EAAEmB,aAAcnB,GAAKA,EAAEmB,eAAiBjB,GAAIjK,EAAEsE,KAAK,CAC9DlB,KAAMoG,EAAEY,OAAOL,EAAG,gBAAiB,MACnCb,OAAQM,EAAEY,OAAOL,EAAG,kBAAmB,MACvC2C,WAAYlD,EAAEY,OAAOL,EAAG,sBAAuB,QAC7CA,EAAIvL,KAAK2N,oBAAoBrC,QAEjC,IAAK,IAAIK,EAAIJ,EAAEoB,eAAgBpB,GAAKA,EAAEmB,eAAiBpM,GAAKiL,EAAEoB,gBAAkBhB,GAAInK,EAAEsE,KAAK,CACzFlB,KAAMoG,EAAEY,OAAOL,EAAG,gBAAiB,MACnCb,OAAQM,EAAEY,OAAOL,EAAG,kBAAmB,MACvC2C,WAAYlD,EAAEY,OAAOL,EAAG,sBAAuB,QAC7CA,EAAIvL,KAAK2N,oBAAoBrC,GAErC,OAAO9J,GACNlB,EAAEyI,kBAAoB0C,EAAGE,EAAE/J,UAAYL,OAAOyI,OAAOyB,EAAE7J,WAAY+J,EAAE/J,UAAUkL,SAAWrB,EAAGE,EAAEoB,cAAgB,SAAS1H,GACzH,IAAI/E,EAAIiB,OAAOyI,OAAO2B,EAAE/J,WACtBmJ,EAAIzK,EAAE4L,OAAS1K,EAAE2K,UAAU9G,EAAE6G,OAAOiC,WAAW,GAC/ClD,EAAI3K,EAAE8L,SAAW5K,EAAE2K,UAAU9G,EAAE+G,SAAS+B,WAAW,GACrD7N,EAAEwI,WAAazD,EAAE+I,YAAa9N,EAAE+L,eAAiBhH,EAAEgJ,wBAAwB/N,EAAE8L,SAAS+B,UAAW7N,EAAEwI,YAAaxI,EAAEiM,KAAOlH,EAAEiJ,MAC3H,IAAK,IAAIhD,EAAIjG,EAAEiH,UAAU6B,UAAUpJ,QAAS0G,EAAInL,EAAE0M,oBAAsB,GAAI5B,EAAI9K,EAAE6M,mBAAqB,GAAInM,EAAI,EAAGuN,EAAIjD,EAAE7J,OAAQT,EAAIuN,EAAGvN,IAAK,CAC1I,IAAIwN,EAAIlD,EAAEtK,GACRyN,EAAI,IAAI5C,EACV4C,EAAEjC,cAAgBgC,EAAEhC,cAAeiC,EAAEhC,gBAAkB+B,EAAE/B,gBAAiB+B,EAAEtJ,SAAWuJ,EAAEvJ,OAAS+F,EAAEnI,QAAQ0L,EAAEtJ,QAASuJ,EAAE/B,aAAe8B,EAAE9B,aAAc+B,EAAE9B,eAAiB6B,EAAE7B,eAAgB6B,EAAE3D,OAAS4D,EAAE5D,KAAOE,EAAEjI,QAAQ0L,EAAE3D,OAAQO,EAAEtF,KAAK2I,IAAKhD,EAAE3F,KAAK2I,GAE1P,OAAOlD,EAAEjL,EAAE6M,mBAAoBnC,EAAEiD,4BAA6B3N,GAC7DqL,EAAE/J,UAAUkK,SAAW,EAAGvK,OAAOwI,eAAe4B,EAAE/J,UAAW,UAAW,CACzEqL,IAAK,WACH,OAAOjN,KAAKoM,SAAS+B,UAAUtJ,IAAI,SAASQ,GAC1C,OAAO,MAAQrF,KAAK8I,WAAakC,EAAExI,KAAKxC,KAAK8I,WAAYzD,GAAKA,GAC7DrF,SAEH2L,EAAE/J,UAAUsL,eAAiB,SAAS7H,EAAG/E,GAC3C,IAAK,IAAIyK,EAAGE,EAAGzJ,EAAGiK,EAAGE,EAAGP,EAAI,EAAGpK,EAAI,EAAGuN,EAAI,EAAGC,EAAI,EAAGC,EAAI,EAAG5E,EAAI,EAAG6E,EAAIrJ,EAAE5D,OAAQO,EAAI,EAAG2M,EAAI,GAAIC,EAAI,GAAIC,EAAI,GAAIC,EAAI,GAAI9M,EAAI0M,GACzH,GAAI,MAAQrJ,EAAEzE,OAAOoB,GAAIoJ,IAAKpJ,IAAKhB,EAAI,OAClC,GAAI,MAAQqE,EAAEzE,OAAOoB,GAAIA,QAC3B,CACH,KAAM+I,EAAI,IAAIc,GAAGW,cAAgBpB,EAAGK,EAAIzJ,EAAGyJ,EAAIiD,IAAM1O,KAAKoN,wBAAwB/H,EAAGoG,GAAIA,KACzF,GAAIjK,EAAImN,EAAE1D,EAAI5F,EAAEN,MAAM/C,EAAGyJ,IAAKzJ,GAAKiJ,EAAExJ,WAChC,CACH,IAAKD,EAAI,GAAIQ,EAAIyJ,GAAIH,EAAEyD,OAAO1J,EAAGrD,EAAG4M,GAAIjD,EAAIiD,EAAEI,MAAOhN,EAAI4M,EAAEK,KAAMzN,EAAEsE,KAAK6F,GACxE,GAAI,IAAMnK,EAAEC,OAAQ,MAAM,IAAI8C,MAAM,0CACpC,GAAI,IAAM/C,EAAEC,OAAQ,MAAM,IAAI8C,MAAM,0CACpCoK,EAAE1D,GAAKzJ,EAETuJ,EAAE0B,gBAAkBzL,EAAIQ,EAAE,GAAIR,EAAI+J,EAAE0B,gBAAiBjL,EAAEC,OAAS,IAAMsJ,EAAE7F,OAASuJ,EAAIjN,EAAE,GAAIiN,GAAKjN,EAAE,GAAIuJ,EAAE2B,aAAe6B,EAAI/M,EAAE,GAAI+M,EAAIxD,EAAE2B,aAAc3B,EAAE2B,cAAgB,EAAG3B,EAAE4B,eAAiB6B,EAAIhN,EAAE,GAAIgN,EAAIzD,EAAE4B,eAAgBnL,EAAEC,OAAS,IAAMsJ,EAAEF,KAAOhB,EAAIrI,EAAE,GAAIqI,GAAKrI,EAAE,KAAMsN,EAAEhJ,KAAKiF,GAAI,iBAAmBA,EAAE2B,cAAgBmC,EAAE/I,KAAKiF,GAEvUQ,EAAEuD,EAAG9D,EAAEkE,qCAAsClP,KAAKgN,oBAAsB8B,EAAGvD,EAAEsD,EAAG7D,EAAEiD,4BAA6BjO,KAAKmN,mBAAqB0B,GACxIlD,EAAE/J,UAAUoM,aAAe,SAAS3I,EAAG/E,EAAGyK,EAAGC,EAAGxJ,EAAG8J,GACpD,GAAIjG,EAAE0F,IAAM,EAAG,MAAM,IAAI5I,UAAU,gDAAkDkD,EAAE0F,IACvF,GAAI1F,EAAE2F,GAAK,EAAG,MAAM,IAAI7I,UAAU,kDAAoDkD,EAAE2F,IACxF,OAAOC,EAAEkE,OAAO9J,EAAG/E,EAAGkB,EAAG8J,IACxBK,EAAE/J,UAAUwN,mBAAqB,WAClC,IAAK,IAAI/J,EAAI,EAAGA,EAAIrF,KAAK0N,mBAAmBjM,SAAU4D,EAAG,CACvD,IAAI/E,EAAIN,KAAK0N,mBAAmBrI,GAChC,GAAIA,EAAI,EAAIrF,KAAK0N,mBAAmBjM,OAAQ,CAC1C,IAAIsJ,EAAI/K,KAAK0N,mBAAmBrI,EAAI,GACpC,GAAI/E,EAAEkM,gBAAkBzB,EAAEyB,cAAe,CACvClM,EAAE+O,oBAAsBtE,EAAE0B,gBAAkB,EAC5C,UAGJnM,EAAE+O,oBAAsB,EAAA,IAEzB1D,EAAE/J,UAAU6I,oBAAsB,SAASpF,GAC5C,IAAI/E,EAAI,CACJkM,cAAexB,EAAEY,OAAOvG,EAAG,QAC3BoH,gBAAiBzB,EAAEY,OAAOvG,EAAG,WAE/B0F,EAAI/K,KAAKgO,aAAa1N,EAAGN,KAAK0N,mBAAoB,gBAAiB,kBAAmB1C,EAAEkE,oCAAqClE,EAAEY,OAAOvG,EAAG,OAAQoG,EAAE8B,uBACrJ,GAAIxC,GAAK,EAAG,CACV,IAAIE,EAAIjL,KAAK0N,mBAAmB3C,GAChC,GAAIE,EAAEuB,gBAAkBlM,EAAEkM,cAAe,CACvC,IAAIhL,EAAIwJ,EAAEY,OAAOX,EAAG,SAAU,MAC9B,OAASzJ,IAAMA,EAAIxB,KAAKoM,SAASwB,GAAGpM,GAAI,MAAQxB,KAAK8I,aAAetH,EAAIwJ,EAAExI,KAAKxC,KAAK8I,WAAYtH,KAChG,IAAI8J,EAAIN,EAAEY,OAAOX,EAAG,OAAQ,MAC5B,OAAO,OAASK,IAAMA,EAAItL,KAAKkM,OAAO0B,GAAGtC,IAAK,CAC5CpG,OAAQ1D,EACRoD,KAAMoG,EAAEY,OAAOX,EAAG,eAAgB,MAClCP,OAAQM,EAAEY,OAAOX,EAAG,iBAAkB,MACtCJ,KAAMS,IAIZ,MAAO,CACLpG,OAAQ,KACRN,KAAM,KACN8F,OAAQ,KACRG,KAAM,OAEPc,EAAE/J,UAAU0N,wBAA0B,WACvC,QAAStP,KAAKqM,gBAAmBrM,KAAKqM,eAAe5K,QAAUzB,KAAKoM,SAASmD,SAAWvP,KAAKqM,eAAemD,KAAK,SAASnK,GACxH,OAAO,MAAQA,KAEhBsG,EAAE/J,UAAUgJ,iBAAmB,SAASvF,EAAG/E,GAC5C,IAAKN,KAAKqM,eAAgB,OAAO,KACjC,GAAI,MAAQrM,KAAK8I,aAAezD,EAAI2F,EAAEiB,SAASjM,KAAK8I,WAAYzD,IAAKrF,KAAKoM,SAAS2B,IAAI1I,GAAI,OAAOrF,KAAKqM,eAAerM,KAAKoM,SAAStJ,QAAQuC,IAC5I,IAAI0F,EACJ,GAAI,MAAQ/K,KAAK8I,aAAeiC,EAAIC,EAAEyE,SAASzP,KAAK8I,aAAc,CAChE,IAAImC,EAAI5F,EAAEX,QAAQ,aAAc,IAChC,GAAI,QAAUqG,EAAE2E,QAAU1P,KAAKoM,SAAS2B,IAAI9C,GAAI,OAAOjL,KAAKqM,eAAerM,KAAKoM,SAAStJ,QAAQmI,IACjG,KAAMF,EAAE4E,MAAQ,KAAO5E,EAAE4E,OAAS3P,KAAKoM,SAAS2B,IAAI,IAAM1I,GAAI,OAAOrF,KAAKqM,eAAerM,KAAKoM,SAAStJ,QAAQ,IAAMuC,IAEvH,GAAI/E,EAAG,OAAO,KACd,MAAM,IAAIiE,MAAM,IAAMc,EAAI,+BACzBsG,EAAE/J,UAAUgO,qBAAuB,SAASvK,GAC7C,IAAI/E,EAAI0K,EAAEY,OAAOvG,EAAG,UACpB,GAAI,MAAQrF,KAAK8I,aAAexI,EAAI0K,EAAEiB,SAASjM,KAAK8I,WAAYxI,KAAMN,KAAKoM,SAAS2B,IAAIzN,GAAI,MAAO,CACjGsE,KAAM,KACN8F,OAAQ,KACRwD,WAAY,MAEd,IAAInD,EAAI,CACJ7F,OAAQ5E,EAAIN,KAAKoM,SAAStJ,QAAQxC,GAClCoM,aAAc1B,EAAEY,OAAOvG,EAAG,QAC1BsH,eAAgB3B,EAAEY,OAAOvG,EAAG,WAE9B4F,EAAIjL,KAAKgO,aAAajD,EAAG/K,KAAK2N,kBAAmB,eAAgB,iBAAkB3C,EAAEiD,2BAA4BjD,EAAEY,OAAOvG,EAAG,OAAQoG,EAAE8B,uBACzI,GAAItC,GAAK,EAAG,CACV,IAAIzJ,EAAIxB,KAAK2N,kBAAkB1C,GAC/B,GAAIzJ,EAAE0D,SAAW6F,EAAE7F,OAAQ,MAAO,CAChCN,KAAMoG,EAAEY,OAAOpK,EAAG,gBAAiB,MACnCkJ,OAAQM,EAAEY,OAAOpK,EAAG,kBAAmB,MACvC0M,WAAYlD,EAAEY,OAAOpK,EAAG,sBAAuB,OAGnD,MAAO,CACLoD,KAAM,KACN8F,OAAQ,KACRwD,WAAY,OAEb5N,EAAEuP,uBAAyBlE,EAAGP,EAAExJ,UAAYL,OAAOyI,OAAOyB,EAAE7J,WAAYwJ,EAAExJ,UAAUkO,YAAcrE,EAAGL,EAAExJ,UAAUkK,SAAW,EAAGvK,OAAOwI,eAAeqB,EAAExJ,UAAW,UAAW,CAC9KqL,IAAK,WACH,IAAK,IAAI5H,EAAI,GAAI/E,EAAI,EAAGA,EAAIN,KAAK4M,UAAUnL,OAAQnB,IACjD,IAAK,IAAIyK,EAAI,EAAGA,EAAI/K,KAAK4M,UAAUtM,GAAGwM,SAASiD,QAAQtO,OAAQsJ,IAAK1F,EAAES,KAAK9F,KAAK4M,UAAUtM,GAAGwM,SAASiD,QAAQhF,IAChH,OAAO1F,KAEP+F,EAAExJ,UAAU6I,oBAAsB,SAASpF,GAC7C,IAAI/E,EAAI,CACJkM,cAAexB,EAAEY,OAAOvG,EAAG,QAC3BoH,gBAAiBzB,EAAEY,OAAOvG,EAAG,WAE/B0F,EAAIE,EAAEkE,OAAO7O,EAAGN,KAAK4M,UAAW,SAASvH,EAAG/E,GAE1C,OADQ+E,EAAEmH,cAAgBlM,EAAEuM,gBAAgBL,eAChCnH,EAAEoH,gBAAkBnM,EAAEuM,gBAAgBJ,kBAEpDjL,EAAIxB,KAAK4M,UAAU7B,GACrB,OAAOvJ,EAAIA,EAAEsL,SAASrC,oBAAoB,CACxC7F,KAAMtE,EAAEkM,eAAiBhL,EAAEqL,gBAAgBL,cAAgB,GAC3D9B,OAAQpK,EAAEmM,iBAAmBjL,EAAEqL,gBAAgBL,gBAAkBlM,EAAEkM,cAAgBhL,EAAEqL,gBAAgBJ,gBAAkB,EAAI,GAC3HuD,KAAM3K,EAAE2K,OACL,CACH9K,OAAQ,KACRN,KAAM,KACN8F,OAAQ,KACRG,KAAM,OAEPO,EAAExJ,UAAU0N,wBAA0B,WACvC,OAAOtP,KAAK4M,UAAUqD,MAAM,SAAS5K,GACnC,OAAOA,EAAEyH,SAASwC,6BAEnBlE,EAAExJ,UAAUgJ,iBAAmB,SAASvF,EAAG/E,GAC5C,IAAK,IAAIyK,EAAI,EAAGA,EAAI/K,KAAK4M,UAAUnL,OAAQsJ,IAAK,CAC9C,IAAIC,EAAIhL,KAAK4M,UAAU7B,GAAG+B,SAASlC,iBAAiBvF,GAAG,GACvD,GAAI2F,EAAG,OAAOA,EAEhB,GAAI1K,EAAG,OAAO,KACd,MAAM,IAAIiE,MAAM,IAAMc,EAAI,+BACzB+F,EAAExJ,UAAUgO,qBAAuB,SAASvK,GAC7C,IAAK,IAAI/E,EAAI,EAAGA,EAAIN,KAAK4M,UAAUnL,OAAQnB,IAAK,CAC9C,IAAIyK,EAAI/K,KAAK4M,UAAUtM,GACvB,IAAK,IAAMyK,EAAE+B,SAASiD,QAAQjN,QAAQkI,EAAEY,OAAOvG,EAAG,WAAY,CAC5D,IAAI4F,EAAIF,EAAE+B,SAAS8C,qBAAqBvK,GACxC,GAAI4F,EAAG,MAAO,CACZrG,KAAMqG,EAAErG,MAAQmG,EAAE8B,gBAAgBL,cAAgB,GAClD9B,OAAQO,EAAEP,QAAUK,EAAE8B,gBAAgBL,gBAAkBvB,EAAErG,KAAOmG,EAAE8B,gBAAgBJ,gBAAkB,EAAI,KAI/G,MAAO,CACL7H,KAAM,KACN8F,OAAQ,OAETU,EAAExJ,UAAUsL,eAAiB,SAAS7H,EAAG/E,GAC1CN,KAAKgN,oBAAsB,GAAIhN,KAAKmN,mBAAqB,GACzD,IAAK,IAAIpC,EAAI,EAAGA,EAAI/K,KAAK4M,UAAUnL,OAAQsJ,IACzC,IAAK,IAAIE,EAAIjL,KAAK4M,UAAU7B,GAAIvJ,EAAIyJ,EAAE6B,SAASY,mBAAoBpC,EAAI,EAAGA,EAAI9J,EAAEC,OAAQ6J,IAAK,CAC3F,IAAIG,EAAIjK,EAAE8J,GACRK,EAAIV,EAAE6B,SAASV,SAASwB,GAAGnC,EAAEvG,QAC/B,OAAS+F,EAAE6B,SAAShE,aAAe6C,EAAIX,EAAExI,KAAKyI,EAAE6B,SAAShE,WAAY6C,IAAK3L,KAAKoM,SAAS8D,IAAIvE,GAAIA,EAAI3L,KAAKoM,SAAStJ,QAAQ6I,GAC1H,IAAIE,EAAIZ,EAAE6B,SAASZ,OAAO0B,GAAGnC,EAAEZ,MAC/B7K,KAAKkM,OAAOgE,IAAIrE,GAAIA,EAAI7L,KAAKkM,OAAOpJ,QAAQ+I,GAC5C,IAAIT,EAAI,CACNlG,OAAQyG,EACRa,cAAef,EAAEe,eAAiBvB,EAAE4B,gBAAgBL,cAAgB,GACpEC,gBAAiBhB,EAAEgB,iBAAmBxB,EAAE4B,gBAAgBL,gBAAkBf,EAAEe,cAAgBvB,EAAE4B,gBAAgBJ,gBAAkB,EAAI,GACpIC,aAAcjB,EAAEiB,aAChBC,eAAgBlB,EAAEkB,eAClB9B,KAAMgB,GAER7L,KAAKgN,oBAAoBlH,KAAKsF,GAAI,iBAAmBA,EAAEsB,cAAgB1M,KAAKmN,mBAAmBrH,KAAKsF,GAExGG,EAAEvL,KAAKgN,oBAAqBhC,EAAEkE,qCAAsC3D,EAAEvL,KAAKmN,mBAAoBnC,EAAEiD,6BAChG3N,EAAE6P,yBAA2B/E,GAC/B,SAAS/F,EAAG/E,GACbA,EAAEsL,OAAS,SAASvG,EAAG/E,EAAGyK,GACxB,GAAIzK,KAAK+E,EAAG,OAAOA,EAAE/E,GACrB,GAAI,IAAM8P,UAAU3O,OAAQ,OAAOsJ,EACnC,MAAM,IAAIxG,MAAM,IAAMjE,EAAI,8BAE5B,IAAIyK,EAAI,iEACNC,EAAI,gBAEN,SAASC,EAAE5F,GACT,IAAI/E,EAAI+E,EAAEjB,MAAM2G,GAChB,OAAOzK,EAAI,CACToP,OAAQpP,EAAE,GACV+P,KAAM/P,EAAE,GACRgQ,KAAMhQ,EAAE,GACRiQ,KAAMjQ,EAAE,GACRqP,KAAMrP,EAAE,IACN,KAGN,SAASkB,EAAE6D,GACT,IAAI/E,EAAI,GACR,OAAO+E,EAAEqK,SAAWpP,GAAK+E,EAAEqK,OAAS,KAAMpP,GAAK,KAAM+E,EAAEgL,OAAS/P,GAAK+E,EAAEgL,KAAO,KAAMhL,EAAEiL,OAAShQ,GAAK+E,EAAEiL,MAAOjL,EAAEkL,OAASjQ,GAAK,IAAM+E,EAAEkL,MAAOlL,EAAEsK,OAASrP,GAAK+E,EAAEsK,MAAOrP,EAGvK,SAASgL,EAAEjG,GACT,IAAI0F,EAAI1F,EACN2F,EAAIC,EAAE5F,GACR,GAAI2F,EAAG,CACL,IAAKA,EAAE2E,KAAM,OAAOtK,EACpB0F,EAAIC,EAAE2E,KAER,IAAK,IAAIrE,EAAGC,EAAIjL,EAAE0L,WAAWjB,GAAIU,EAAIV,EAAE7H,MAAM,OAAQyI,EAAI,EAAGE,EAAIJ,EAAEhK,OAAS,EAAGoK,GAAK,EAAGA,IAAK,OAASP,EAAIG,EAAEI,IAAMJ,EAAE+E,OAAO3E,EAAG,GAAK,OAASP,EAAIK,IAAMA,EAAI,IAAM,KAAOL,GAAKG,EAAE+E,OAAO3E,EAAI,EAAGF,GAAIA,EAAI,IAAMF,EAAE+E,OAAO3E,EAAG,GAAIF,MACxN,MAAO,MAAQZ,EAAIU,EAAEjJ,KAAK,QAAUuI,EAAIQ,EAAI,IAAM,KAAMP,GAAKA,EAAE2E,KAAO5E,EAAGvJ,EAAEwJ,IAAMD,EAEnFzK,EAAEmP,SAAWxE,EAAG3K,EAAEmQ,YAAcjP,EAAGlB,EAAEyL,UAAYT,EAAGhL,EAAEkC,KAAO,SAAS6C,EAAG/E,GACvE,KAAO+E,IAAMA,EAAI,KAAM,KAAO/E,IAAMA,EAAI,KACxC,IAAIyK,EAAIE,EAAE3K,GACRiL,EAAIN,EAAE5F,GACR,GAAIkG,IAAMlG,EAAIkG,EAAEoE,MAAQ,KAAM5E,IAAMA,EAAE2E,OAAQ,OAAOnE,IAAMR,EAAE2E,OAASnE,EAAEmE,QAASlO,EAAEuJ,GACnF,GAAIA,GAAKzK,EAAE8D,MAAM4G,GAAI,OAAO1K,EAC5B,GAAIiL,IAAMA,EAAE+E,OAAS/E,EAAEoE,KAAM,OAAOpE,EAAE+E,KAAOhQ,EAAGkB,EAAE+J,GAClD,IAAIE,EAAI,MAAQnL,EAAEM,OAAO,GAAKN,EAAIgL,EAAEjG,EAAEX,QAAQ,OAAQ,IAAM,IAAMpE,GAClE,OAAOiL,GAAKA,EAAEoE,KAAOlE,EAAGjK,EAAE+J,IAAME,GAC/BnL,EAAE0L,WAAa,SAAS3G,GACzB,MAAO,MAAQA,EAAEzE,OAAO,MAAQyE,EAAEjB,MAAM2G,IACvCzK,EAAE2L,SAAW,SAAS5G,EAAG/E,GAC1B,KAAO+E,IAAMA,EAAI,KAAMA,EAAIA,EAAEX,QAAQ,MAAO,IAC5C,IAAK,IAAIqG,EAAI,EAAG,IAAMzK,EAAEwC,QAAQuC,EAAI,MAAO,CACzC,IAAI2F,EAAI3F,EAAErC,YAAY,KACtB,GAAIgI,EAAI,EAAG,OAAO1K,EAClB,IAAK+E,EAAIA,EAAEN,MAAM,EAAGiG,IAAI5G,MAAM,qBAAsB,OAAO9D,IACzDyK,EAEJ,OAAO2F,MAAM3F,EAAI,GAAGvI,KAAK,OAASlC,EAAE0G,OAAO3B,EAAE5D,OAAS,IAExD,IAAI8J,IAAM,cAAehK,OAAOyI,OAAO,OAEvC,SAASyB,EAAEpG,GACT,OAAOA,EAGT,SAASsG,EAAEtG,GACT,IAAKA,EAAG,OAAO,EACf,IAAI/E,EAAI+E,EAAE5D,OACV,GAAInB,EAAI,EAAG,OAAO,EAClB,GAAI,KAAO+E,EAAEsL,WAAWrQ,EAAI,IAAM,KAAO+E,EAAEsL,WAAWrQ,EAAI,IAAM,MAAQ+E,EAAEsL,WAAWrQ,EAAI,IAAM,MAAQ+E,EAAEsL,WAAWrQ,EAAI,IAAM,MAAQ+E,EAAEsL,WAAWrQ,EAAI,IAAM,MAAQ+E,EAAEsL,WAAWrQ,EAAI,IAAM,MAAQ+E,EAAEsL,WAAWrQ,EAAI,IAAM,KAAO+E,EAAEsL,WAAWrQ,EAAI,IAAM,KAAO+E,EAAEsL,WAAWrQ,EAAI,GAAI,OAAO,EAC5R,IAAK,IAAIyK,EAAIzK,EAAI,GAAIyK,GAAK,EAAGA,IAC3B,GAAI,KAAO1F,EAAEsL,WAAW5F,GAAI,OAAO,EACrC,OAAO,EAGT,SAASc,EAAExG,EAAG/E,GACZ,OAAO+E,IAAM/E,EAAI,EAAI+E,EAAI/E,EAAI,GAAK,EAEpCA,EAAEsQ,YAAcrF,EAAIE,EAAI,SAASpG,GAC/B,OAAOsG,EAAEtG,GAAK,IAAMA,EAAIA,GACvB/E,EAAEuQ,cAAgBtF,EAAIE,EAAI,SAASpG,GACpC,OAAOsG,EAAEtG,GAAKA,EAAEN,MAAM,GAAKM,GAC1B/E,EAAE2N,2BAA6B,SAAS5I,EAAG/E,EAAGyK,GAC/C,IAAIC,EAAI3F,EAAEH,OAAS5E,EAAE4E,OACrB,OAAO,IAAM8F,EAAIA,EAAI,IAAMA,EAAI3F,EAAEqH,aAAepM,EAAEoM,cAAgB1B,EAAI,IAAMA,EAAI3F,EAAEsH,eAAiBrM,EAAEqM,iBAAmB5B,EAAIC,EAAI,IAAMA,EAAI3F,EAAEoH,gBAAkBnM,EAAEmM,iBAAmBzB,EAAI,IAAMA,EAAI3F,EAAEmH,cAAgBlM,EAAEkM,eAAiBxB,EAAI3F,EAAEwF,KAAOvK,EAAEuK,MACpPvK,EAAE4O,oCAAsC,SAAS7J,EAAG/E,EAAGyK,GACxD,IAAIC,EAAI3F,EAAEmH,cAAgBlM,EAAEkM,cAC5B,OAAO,IAAMxB,EAAIA,EAAI,IAAMA,EAAI3F,EAAEoH,gBAAkBnM,EAAEmM,kBAAoB1B,EAAIC,EAAI,IAAMA,EAAI3F,EAAEH,OAAS5E,EAAE4E,QAAU8F,EAAI,IAAMA,EAAI3F,EAAEqH,aAAepM,EAAEoM,cAAgB1B,EAAI,IAAMA,EAAI3F,EAAEsH,eAAiBrM,EAAEqM,gBAAkB3B,EAAI3F,EAAEwF,KAAOvK,EAAEuK,MACtOvK,EAAEwQ,oCAAsC,SAASzL,EAAG/E,GACrD,IAAIyK,EAAI1F,EAAEmH,cAAgBlM,EAAEkM,cAC5B,OAAO,IAAMzB,EAAIA,EAAI,IAAMA,EAAI1F,EAAEoH,gBAAkBnM,EAAEmM,iBAAmB1B,EAAI,KAAOA,EAAIc,EAAExG,EAAEH,OAAQ5E,EAAE4E,SAAW6F,EAAI,IAAMA,EAAI1F,EAAEqH,aAAepM,EAAEoM,cAAgB3B,EAAI,IAAMA,EAAI1F,EAAEsH,eAAiBrM,EAAEqM,gBAAkB5B,EAAIc,EAAExG,EAAEwF,KAAMvK,EAAEuK,QAEvO,SAASxF,EAAG/E,GACbA,EAAEiN,qBAAuB,EAAGjN,EAAEkN,kBAAoB,EAAGlN,EAAE6O,OAAS,SAAS9J,EAAG0F,EAAGC,EAAGC,GAChF,GAAI,IAAMF,EAAEtJ,OAAQ,OAAQ,EAC5B,IAAID,EAAI,SAAS6D,EAAE0F,EAAGC,EAAGC,EAAGzJ,EAAG8J,EAAGC,GAChC,IAAIE,EAAIhC,KAAKsH,OAAO/F,EAAID,GAAK,GAAKA,EAChCY,EAAIL,EAAEL,EAAGzJ,EAAEiK,IAAI,GACjB,OAAO,IAAME,EAAIF,EAAIE,EAAI,EAAIX,EAAIS,EAAI,EAAIpG,EAAEoG,EAAGT,EAAGC,EAAGzJ,EAAG8J,EAAGC,GAAKA,GAAKjL,EAAEkN,kBAAoBxC,EAAIxJ,EAAEC,OAASuJ,GAAK,EAAIS,EAAIA,EAAIV,EAAI,EAAI1F,EAAE0F,EAAGU,EAAGR,EAAGzJ,EAAG8J,EAAGC,GAAKA,GAAKjL,EAAEkN,kBAAoB/B,EAAIV,EAAI,GAAK,EAAIA,EAH9L,EAIL,EAAGA,EAAEtJ,OAAQ4D,EAAG0F,EAAGC,EAAGC,GAAK3K,EAAEiN,sBAChC,GAAI/L,EAAI,EAAG,OAAQ,EACnB,KAAOA,EAAI,GAAK,GAAK,IAAMwJ,EAAED,EAAEvJ,GAAIuJ,EAAEvJ,EAAI,IAAI,MAAQA,EACrD,OAAOA,IAER,SAAS6D,EAAG/E,EAAGyK,GAChB,IAAIC,EAAID,EAAE,GACRE,EAAI1J,OAAOK,UAAUF,eAEvB,SAASF,IACPxB,KAAKgR,OAAS,GAAIhR,KAAKiR,KAAO1P,OAAOyI,OAAO,MAE9CxI,EAAE2K,UAAY,SAAS9G,EAAG/E,GACxB,IAAK,IAAIyK,EAAI,IAAIvJ,EAAGwJ,EAAI,EAAGC,EAAI5F,EAAE5D,OAAQuJ,EAAIC,EAAGD,IAAKD,EAAEmF,IAAI7K,EAAE2F,GAAI1K,GACjE,OAAOyK,GACNvJ,EAAEI,UAAU2N,KAAO,WACpB,OAAOhO,OAAO2P,oBAAoBlR,KAAKiR,MAAMxP,QAC5CD,EAAEI,UAAUsO,IAAM,SAAS7K,EAAG/E,GAC/B,IAAIyK,EAAIC,EAAE4F,YAAYvL,GACpB7D,EAAIyJ,EAAE/I,KAAKlC,KAAKiR,KAAMlG,GACtBO,EAAItL,KAAKgR,OAAOvP,OAClBD,IAAMlB,GAAKN,KAAKgR,OAAOlL,KAAKT,GAAI7D,IAAMxB,KAAKiR,KAAKlG,GAAKO,IACpD9J,EAAEI,UAAUmM,IAAM,SAAS1I,GAC5B,IAAI/E,EAAI0K,EAAE4F,YAAYvL,GACtB,OAAO4F,EAAE/I,KAAKlC,KAAKiR,KAAM3Q,IACxBkB,EAAEI,UAAUkB,QAAU,SAASuC,GAChC,IAAI/E,EAAI0K,EAAE4F,YAAYvL,GACtB,GAAI4F,EAAE/I,KAAKlC,KAAKiR,KAAM3Q,GAAI,OAAON,KAAKiR,KAAK3Q,GAC3C,MAAM,IAAIiE,MAAM,IAAMc,EAAI,yBACzB7D,EAAEI,UAAUgM,GAAK,SAASvI,GAC3B,GAAIA,GAAK,GAAKA,EAAIrF,KAAKgR,OAAOvP,OAAQ,OAAOzB,KAAKgR,OAAO3L,GACzD,MAAM,IAAId,MAAM,yBAA2Bc,IAC1C7D,EAAEI,UAAUuM,QAAU,WACvB,OAAOnO,KAAKgR,OAAOjM,SAClBzE,EAAE+K,SAAW7J,GACf,SAAS6D,EAAG/E,EAAGyK,GAChB,IAAIC,EAAID,EAAE,GACVzK,EAAE6Q,OAAS,SAAS9L,GAClB,IAAI/E,EAAGyK,EAAGE,EAAI,GACZzJ,GAAKuJ,EAAI1F,GAAK,EAAI,IAAM0F,GAAK,GAAK,GAAKA,GAAK,GAC9C,GACEzK,EAAI,GAAKkB,GAAIA,KAAO,GAAK,IAAMlB,GAAK,IAAK2K,GAAKD,EAAEmG,OAAO7Q,SAChDkB,EAAI,GACb,OAAOyJ,GACN3K,EAAEyO,OAAS,SAAS1J,EAAG/E,EAAGyK,GAC3B,IAAIE,EAAGzJ,EAAG8J,EAAGC,EAAGE,EAAIpG,EAAE5D,OACpBkK,EAAI,EACJE,EAAI,EACN,EAAG,CACD,GAAIvL,GAAKmL,EAAG,MAAM,IAAIlH,MAAM,8CAC5B,IAAK,KAAO/C,EAAIwJ,EAAE+D,OAAO1J,EAAEsL,WAAWrQ,OAAQ,MAAM,IAAIiE,MAAM,yBAA2Bc,EAAEzE,OAAON,EAAI,IACtG2K,KAAO,GAAKzJ,GAAImK,IAAMnK,GAAK,KAAOqK,EAAGA,GAAK,QACnCZ,GACTF,EAAEiE,OAASzD,GAAKD,EAAIK,IAAM,EAAG,IAAM,EAAIL,IAAMC,EAAIA,GAAIR,EAAEkE,KAAO3O,IAE/D,SAAS+E,EAAG/E,GACb,IAAIyK,EAAI,mEAAmE7H,MAAM,IACjF5C,EAAE6Q,OAAS,SAAS9L,GAClB,GAAI,GAAKA,GAAKA,EAAI0F,EAAEtJ,OAAQ,OAAOsJ,EAAE1F,GACrC,MAAM,IAAIlD,UAAU,6BAA+BkD,IAClD/E,EAAEyO,OAAS,SAAS1J,GACrB,OAAO,IAAMA,GAAKA,GAAK,GAAKA,EAAI,GAAK,IAAMA,GAAKA,GAAK,IAAMA,EAAI,GAAK,GAAK,IAAMA,GAAKA,GAAK,GAAKA,EAAI,GAAK,GAAK,IAAMA,EAAI,GAAK,IAAMA,EAAI,IAAM,IAE5I,SAASA,EAAG/E,GACb,SAASyK,EAAE1F,EAAG/E,EAAGyK,GACf,IAAIC,EAAI3F,EAAE/E,GACV+E,EAAE/E,GAAK+E,EAAE0F,GAAI1F,EAAE0F,GAAKC,EActB1K,EAAEkL,UAAY,SAASnG,EAAG/E,IAX1B,SAAS0K,EAAE3F,EAAG/E,EAAG2K,EAAGzJ,GAClB,GAAIyJ,EAAIzJ,EAAG,CACT,IAAI8J,EAAIL,EAAI,EACZF,EAAE1F,GAAIwG,EAAIZ,EAAGG,EAAI5J,EAAGiI,KAAK2H,MAAMvF,EAAIpC,KAAK4H,UAAYjG,EAAIS,KAAMrK,GAC9D,IAAK,IAAI+J,EAAIlG,EAAE7D,GAAIiK,EAAIR,EAAGQ,EAAIjK,EAAGiK,IAAKnL,EAAE+E,EAAEoG,GAAIF,IAAM,GAAKR,EAAE1F,EAAGiG,GAAK,EAAGG,GACtEV,EAAE1F,EAAGiG,EAAI,EAAGG,GACZ,IAAIE,EAAIL,EAAI,EACZN,EAAE3F,EAAG/E,EAAG2K,EAAGU,EAAI,GAAIX,EAAE3F,EAAG/E,EAAGqL,EAAI,EAAGnK,GAEpC,IAAIqK,EAAGT,EAGPJ,CAAE3F,EAAG/E,EAAG,EAAG+E,EAAE5D,OAAS,OA0OZrB,GACVkR,EAAaC,SAASC,qBAAqB,UAI3CC,EA2CJ,SAAoBC,GAClB,IAAIC,EAAS,IAAIpQ,OACjB,IAAKmQ,EAAO,OAAOC,EAEnB,IADA,IAAIC,EAAQF,EAAMxO,MAAM,QACf1B,EAAI,EAAGA,EAAIoQ,EAAMnQ,OAAQD,IAAK,CACrC,IAAIqQ,EAASD,EAAMpQ,GAAG0B,MAAM,KAC5B,GAAK2O,GAA4B,IAAlBA,EAAOpQ,OAAtB,CACA,IAAIqQ,EAAMC,SAASF,EAAO,IACtBG,EAAMD,SAASF,EAAO,IAC1BG,EAAMA,EAAItN,QAAQ,MAAO,KACzBiN,EAAOG,GAAOE,GAEhB,OAAOL,EAvDIM,CAFEX,EADGA,EAAW7P,OAAS,GAEXyQ,IAAIxN,QAAQ,aAAc,KAEjDyN,EAAeC,EAAaX,GAC5BY,EAAgB,CAClBC,MAAO,2BACPC,SAAU,+EACVC,WAAY,+EACZC,SAAU,+EACVC,WAAY,+EACZC,SAAU,gFAERC,EAAW,CACbC,OAAQ,KACRC,MAAO,KACPC,OAAO,EACPC,YAAa,KACbrO,OAAQ,MAENsO,EAAS,WACX,IAAIC,EAAW,GACXC,GAAO,EACP3R,EAAI,EAC6C,qBAAjDD,OAAOK,UAAUK,SAASC,KAAKkO,UAAU,MAC3C+C,EAAO/C,UAAU,GACjB5O,KAaF,IAXA,IAAI4R,EAAQ,SAAS9R,GACnB,IAAK,IAAI+R,KAAQ/R,EACXA,EAAII,eAAe2R,KACjBF,GAAsD,oBAA9C5R,OAAOK,UAAUK,SAASC,KAAKZ,EAAI+R,IAC7CH,EAASG,GAAQJ,EAAOC,EAASG,GAAO/R,EAAI+R,IAE5CH,EAASG,GAAQ/R,EAAI+R,KAKtB7R,EAAI4O,UAAU3O,OAAQD,IAAK,CAEhC4R,EADUhD,UAAU5O,IAGtB,OAAO0R,GAkBT,SAASd,EAAa9Q,GACpB,IACEwQ,EADEvC,EAAO,EAEX,IAAKuC,KAAOxQ,EACNA,EAAII,eAAeoQ,IAAMvC,IAE/B,OAAOA,EAGT,SAAS+D,IACP,IAAIC,EAASxT,EAAO8H,SAASsH,OAAOnI,OAAO,GAC3C,OAAkB,OAAXuM,GAA8B,KAAXA,EAG5B,SAA+BA,GAG7B,IAFA,IAAI9B,EAAS,GACT+B,EAASD,EAAOrQ,MAAM,KACjB1B,EAAI,EAAGA,EAAIgS,EAAO/R,OAAQD,IAAK,CACtC,IAAIiS,EAASD,EAAOhS,GAAG0B,MAAM,KAC7BuO,EAAO3L,KAAK,CACVgM,IAAO2B,EAAO,GACdzE,MAASyE,EAAO,KAGpB,OAAOhC,EAbmCiC,CAAsBH,GAAU,GAgB5E,SAASI,EAAcC,EAAMC,GAC3B,IAAIC,EAAO,GACX,IAAK,IAAIC,KAAaH,EACpBE,EAAKC,GAAaH,EAAKG,GAEzB,IAAK,IAAIC,KAAaH,EACpBC,EAAKE,GAAaH,EAAKG,GAEzB,OAAOF,EAET,IAAIG,EAAc,SAASC,GACzB,IACIC,EADAC,EAAa,GAGjB,SAASC,IACP,IAAIC,EAAU,CACZjO,IAAOkL,SAAS1J,SAAS0M,UAAY,IACrCvB,YAAemB,EAASnB,aAEtBwB,EAAe,GACfjD,SAASkD,cAAcD,EAAa1O,KAAK,CAC3CgM,IAAO,gBACP9C,MAASuC,SAASkD,gBAEhB1U,EAAO2U,YAAcnD,SAASoD,gBAAgBC,aAAerD,SAASC,qBAAqB,QAAQ,GAAGoD,cAAaJ,EAAa1O,KAAK,CACvIgM,IAAO,gBACP9C,MAASjP,EAAO2U,YAAcnD,SAASoD,gBAAgBC,aAAerD,SAASC,qBAAqB,QAAQ,GAAGoD,eAE7G7U,EAAO8U,aAAetD,SAASoD,gBAAgBG,cAAgBvD,SAASC,qBAAqB,QAAQ,GAAGsD,eAAcN,EAAa1O,KAAK,CAC1IgM,IAAO,iBACP9C,MAASjP,EAAO8U,aAAetD,SAASoD,gBAAgBG,cAAgBvD,SAASC,qBAAqB,QAAQ,GAAGsD,oBAExBnT,KAAtFoT,OAAOC,gBAAkBD,OAAOE,aAAeF,OAAOG,gBAAkB,IAAIC,OAAqBX,EAAa1O,KAAK,CACtHgM,IAAO,qBACP9C,OAAW+F,OAAOC,gBAAkBD,OAAOE,aAAeF,OAAOG,gBAAkB,IAAIC,MAAMjS,MAAM,KAAM,KAEvG6R,OAAOK,OAAOZ,EAAa1O,KAAK,CAClCgM,IAAO,eACP9C,MAAS+F,OAAOK,QAEdL,OAAOM,QAAQb,EAAa1O,KAAK,CACnCgM,IAAO,gBACP9C,MAAS+F,OAAOM,SAEdN,OAAOO,YAAYd,EAAa1O,KAAK,CACvCgM,IAAO,cACP9C,MAAS+F,OAAOO,aAElBd,EAAa1O,KAAK,CAChBgM,IAAO,gCACP9C,MAAS,SAEXsF,EAAQiB,KAAOf,EACf,IAAIgB,EAA0B,GAsB9B,OArBIC,UAAUC,UAAUF,EAAwB1P,KAAK,CACnDgM,IAAO,gBACP9C,MAASyG,UAAUC,WAEjBD,UAAUE,WAAWH,EAAwB1P,KAAK,CACpDgM,IAAO,aACP9C,MAASyG,UAAUE,YAEjBpE,SAASqE,UAAUJ,EAAwB1P,KAAK,CAClDgM,IAAO,UACP9C,MAASuC,SAASqE,WAEe,WAA/BrE,SAAS1J,SAASgO,UAAuBL,EAAwB1P,KAAK,CACxEgM,IAAO,QACP9C,MAAS,OAEPuC,SAAS1J,SAASiO,UAAUN,EAAwB1P,KAAK,CAC3DgM,IAAO,OACP9C,MAASuC,SAAS1J,SAASiO,WAE7BxB,EAAQyB,gBAAkBP,EACnBlB,EAGT,SAAS0B,EAAgBjP,EAAQkP,GAC3B9B,EAASpB,QACI,UAAXhM,EACFmP,QAAQC,IAAI,oCAAoD9D,EAAcM,SAAUN,EAAcI,UAClF,YAAX1L,EACTmP,QAAQC,IAAI,wBAAyCF,EAAW,QAAS,IAAIG,MAAOC,iBAAmB,IAAKhE,EAAcM,SAAUN,EAAcG,YAElJ0D,QAAQC,IAAI,oFAAoG9D,EAAcM,SAAUN,EAAcI,WAK5J,SAAS6D,EAAStS,EAAOuS,EAAKC,GAC5B,IAAIC,EAAazS,EAAM/B,WAAWiB,MAAM,MAAM,GAC1CwT,EAAM,IAAIxQ,EACA,IAAII,QAAQ,SAASC,GACjC,IAAIoQ,EAAc7S,EAAiBC,MAAMC,GACzCuC,EAAQD,QAAQsQ,IAAID,EAAY9R,IAAI,SAASgS,GAC3C,OAAO,IAAIvQ,QAAQ,SAASC,GAC1B,SAASuQ,IACPvQ,EAAQsQ,GAEVH,EAAI1N,SAAS6N,GAAIzO,KAAK7B,EAASuQ,GAAwB,MAAEA,WAIvD1O,KAAK,SAAS2O,GACpBA,EAAUlJ,QAAQ,SAASmJ,EAAYxV,GACrC,GAAIwV,EAAW/T,aACb,IAAIgU,EAAKD,EAAW/T,aAAe,SAE/BgU,EAAK,GAEX,IAAIC,EAAc,UAAYD,EAAK,IAAMD,EAAW1T,SAAW,IAAM0T,EAAWzT,WAAa,IAAMyT,EAAWxT,aAAe,IAC7HuT,EAAUvV,GAAK0V,IAEjBH,EAAUI,QAAQV,GAClBD,EAASY,OAASL,EAAUvU,KAAK,MACjC4R,EAAWiD,KAAK,UAAWb,GAC3BD,EAAIrP,KAAK0B,KAAK0O,UAAUd,MAS5B,IAiEIe,EAAoB,SAAS1E,EAAQC,EAAO0E,EAAUC,EAASC,EAAYC,GAC7E,IAAIC,EAAU/E,EACZgF,EAAS/E,EACTqC,EAAOsC,EACPzT,EAAQ2T,EACRrS,EAAUoS,EACVxQ,EAAO,EACP4Q,EAAcxE,IAChB,IAAiB,OAAZsE,GAA+B,OAAXC,IAAsC,IAAjB1F,EAmD5C,OAAO+D,QAAQC,IAAI,mBAlDf1E,EAAO/P,eAAe,WAAa+P,EAAO/P,eAAe,WAC3DkW,EAAUnG,EAAe,OACzBoG,EAASpG,EAAc,OAEzB,IAAI8E,EAAM,IAAI7P,eAcd,GAbA6P,EAAI5P,KAAK,OAAQ,oCAAsCkR,EAAS,YAAcD,GAAS,GACvFrB,EAAIwB,iBAAiB,eAAgB,oBACrCxB,EAAIyB,OAAS,SAAS3S,GACG,IAAnBkR,EAAIzP,YACa,MAAfyP,EAAIxP,QACNyQ,EAAS,UAAWjB,EAAI0B,aAI9B1B,EAAI3P,QAAU,SAASvB,GACrBmS,EAAS,QAASjB,EAAI0B,YACtB7D,EAAWiD,KAAK,QAASd,EAAIxP,OAAQwP,EAAI0B,aAE9B,QAAT9C,EAAgB,CAClB,IAAIhR,EAAQH,EAAQF,EAAiBC,MAAMC,GAAS,KAChDwS,EAAW,CACb0B,MAAS5S,EACTJ,OAAUf,GAASA,EAAM1C,OAAS,EAAI0C,EAAM,GAAGb,SAAW,KAC1D8T,OAAUpT,EAAQA,EAAMG,MAAQ,KAChCgU,SAAYhD,EACZA,KAAQnR,EAAQA,EAAM6G,KAAO,KAC7BuN,YAAexP,KAAK7E,MAAM6E,KAAK0O,UAAUQ,KAE3CtB,EAAW7C,EAAc6C,EAAUnC,UAEnCmC,EAAWxS,EAEW,OAApBmQ,EAASxP,QACPwP,EAASxP,OAAO6R,KAClBtP,EAAO,GAGE,IAATA,IACEsP,EAAS0B,MACPlU,GAAkB,QAATmR,GAAqC,oBAAZ7O,UAA4E,IAAjDA,QAAQrE,WAAWa,QAAQ,iBAC1FwT,EAAStS,EAAOuS,EAAKC,IAErBpC,EAAWiD,KAAK,UAAWb,GAC3BD,EAAIrP,KAAK0B,KAAK0O,UAAUd,KAG1BgB,EAAS,gBAAiBjB,EAAI0B,cAmGtC,OA5FA7D,EAAWpQ,MAAQ,SAASqU,GAC1Bd,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,QAASqC,IAE/EjE,EAAWpQ,MAAQ,SAASqU,EAAKrU,GAC/BuT,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,QAASqC,EAAKrU,IAEpFoQ,EAAWkE,QAAU,SAASD,GAC5Bd,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,UAAWqC,IAEjFjE,EAAWkE,QAAU,SAASD,EAAKrU,GACjCuT,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,UAAWqC,EAAKrU,IAEtFoQ,EAAWrB,MAAQ,SAASsF,GAC1Bd,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,QAASqC,IAE/EjE,EAAWrB,MAAQ,SAASsF,EAAKrU,GAC/BuT,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,QAASqC,EAAKrU,IAEpFoQ,EAAWmE,YAAc,SAASF,GAChCd,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,cAAeqC,IAErFjE,EAAWmE,YAAc,SAASF,EAAKrU,GACrCuT,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,cAAeqC,EAAKrU,IAE1FoQ,EAAWoE,QAAU,SAASH,GAC5Bd,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,UAAWqC,IAEjFjE,EAAWoE,QAAU,SAASH,EAAKrU,GACjCuT,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,UAAWqC,EAAKrU,IAEtFoQ,EAAWqE,MAAQ,SAASJ,GAC1Bd,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,QAASqC,IAE/EjE,EAAWqE,MAAQ,SAASJ,EAAKrU,GAC/BuT,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,QAASqC,EAAKrU,IAEpFoQ,EAAW+B,IAAM,SAAS7U,GACxBiW,EAAkBpD,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB,MAAO,KAAM1U,IAEnF8S,EAAW9O,QAAU,WACnB,OAAO+O,KAETD,EAAWsE,GAAK,SAAS7N,EAAM2M,EAAUmB,GACvC,IAAItT,EAAIrF,KAAKqF,IAAMrF,KAAKqF,EAAI,IAK5B,OAJCA,EAAEwF,KAAUxF,EAAEwF,GAAQ,KAAK/E,KAAK,CAC/BmR,GAAIO,EACJmB,IAAKA,IAEA3Y,MAEToU,EAAWiD,KAAO,SAASxM,GAKzB,IAJA,IAAI0K,EAAO,GAAGxQ,MAAM7C,KAAKkO,UAAW,GAChCwI,IAAW5Y,KAAKqF,IAAMrF,KAAKqF,EAAI,KAAKwF,IAAS,IAAI9F,QACjDvD,EAAI,EACJqE,EAAM+S,EAAOnX,OACTD,EAAIqE,EAAKrE,IACfoX,EAAOpX,GAAGyV,GAAG4B,MAAMD,EAAOpX,GAAGmX,IAAKpD,GAEpC,OAAOvV,MAEToU,EAAW0E,KAAO,SAAS5E,GACzBC,EAAWlB,EAAOL,EAAUsB,GAAW,IACvCnU,EAAO6G,QAAU,SAAStB,EAASJ,EAAQ6T,EAAQC,EAAOhV,GACxD,IAAI2T,EAAW,CACbrS,QAAWA,EACXJ,OAAUA,EACV6T,OAAUA,EACVC,MAASA,EACThV,MAASA,GAGX,OAtMc,SAAS6O,EAAQC,EAAO0E,EAAUG,GAClD,IAAIC,EAAU/E,EACZgF,EAAS/E,EACT9O,EAAQ2T,EACRzQ,EAAO,EACP4Q,EAAcxE,IACdnP,EAAQH,EAAMA,OAA6C,IAApCoO,EAAapO,EAAMA,MAAMG,QAAuC,iBAAhBH,EAAMA,MAAqBF,EAAiBC,MAAMC,EAAMA,OAAS,GAC1I,IAAIA,GAAyB,IAAhBA,EAAMgV,OAAgC,IAAjBhV,EAAM+U,QAAkB5U,GAAmB,KAAVA,IAAiBH,EAAMsB,SAA8B,kBAAlBtB,EAAMsB,SAAiD,iBAAlBtB,EAAMsB,QAAjJ,CAMA,IAAiB,OAAZsS,GAA+B,OAAXC,IAAsC,IAAjB1F,EAiD5C,OAAO+D,QAAQC,IAAI,mBAhDf1E,EAAO/P,eAAe,WAAa+P,EAAO/P,eAAe,WAC3DkW,EAAUnG,EAAe,OACzBoG,EAASpG,EAAc,OAEzB,IAAI8E,EAAM,IAAI7P,eACd6P,EAAI5P,KAAK,OAAQ,oCAAsCkR,EAAS,YAAcD,GAAS,GACvFrB,EAAIwB,iBAAiB,eAAgB,oBACrCxB,EAAIyB,OAAS,SAAS3S,GACG,IAAnBkR,EAAIzP,YACa,MAAfyP,EAAIxP,QACNyQ,EAAS,UAAWjB,EAAI0B,aAI9B1B,EAAI3P,QAAU,SAASvB,GACrBmS,EAAS,QAASjB,EAAI0B,YACtB7D,EAAWiD,KAAK,QAASd,EAAIxP,OAAQwP,EAAI0B,aAE3C,IAAIzB,EAAW,CACbY,OAAUpT,EAAMA,MAAQA,EAAMA,MAAMG,MAAQ,KAC5C+T,MAASlU,EAAMsB,SAAW,oBAC1BJ,OAAUf,GAASA,EAAM1C,OAAS,EAAI0C,EAAM,GAAGb,SAAW,KAC1D6U,SAAY,QACZhD,KAAQnR,EAAMA,MAAQA,EAAMA,MAAM6G,KAAO,KACzCuN,YAAexP,KAAK7E,MAAM6E,KAAK0O,UAAUQ,KAE3C,GAAI9T,EAAMA,OAA8C,IAApCoO,EAAapO,EAAMA,MAAMG,aAA4C,IAApBqS,EAASY,OAAwB,CACpG,IAAI6B,SAAgBtB,EAAS3T,MACzBkV,EAAoBD,EAAOrY,OAAO,GAAGC,cAAgBoY,EAAOlU,MAAM,GACtEyR,EAASY,OAhDf,SAAqBpT,GACnB,IAAIiV,SAAgBjV,EAAMA,MAE1B,OADwBiV,EAAOrY,OAAO,GAAGC,cAAgBoY,EAAOlU,MAAM,GAC3C,KAAOf,EAAMA,MAAQ,aAAyBA,EAAMkB,OAAS,IAAMlB,EAAM+U,OAAS,IAAM/U,EAAMgV,MAAQ,IA6C3G9B,CAAYS,GAC9BnB,EAAStR,OAASyS,EAASzS,OAC3BsR,EAAS0B,MAAQ,YAAcgB,EAAoB,KAAOvB,EAAS3T,MAErEwS,EAAW7C,EAAc6C,EAAUnC,KACX,OAApBF,EAASxP,QACPwP,EAASxP,OAAO6R,KAClBtP,EAAO,GAGE,IAATA,IACElD,EAAMA,OAAgC,iBAAhBA,EAAMA,OAA0D,IAApCoO,EAAapO,EAAMA,MAAMG,QAAmC,oBAAZmC,UAA4E,IAAjDA,QAAQrE,WAAWa,QAAQ,iBAC1JwT,EAAStS,EAAMA,MAAOuS,EAAKC,IAE3BpC,EAAWiD,KAAK,UAAWb,GAC3BD,EAAIrP,KAAK0B,KAAK0O,UAAUd,WAlDxBrC,EAASpB,OACXmD,QAAQC,IAAI,6DAAkF9D,EAAcM,SAAUN,EAAcK,YA4LtIyG,CAAYhF,EAAStB,OAAQsB,EAASrB,MAAOkD,EAAiB2B,IACvD,IAGXvD,EAAW0E,KAAK5E,GACZC,EAASpB,QACXmD,QAAQC,IAAI,KAAO9D,EAAcC,MAAOD,EAAcE,UAClD4B,EAAStB,OACoB,KAA3BsB,EAAStB,OAAOpR,QAClByU,QAAQC,IAAI,qEAAgF9D,EAAcI,SAAUJ,EAAcM,UAGpIuD,QAAQC,IAAI,2CAAsD9D,EAAcI,SAAUJ,EAAcM,UAEtGwB,EAASrB,MACNqB,EAASrB,MAAM1O,MAAM,0GACxB8R,QAAQC,IAAI,4CAAuD9D,EAAcI,SAAUJ,EAAcM,UAG3GuD,QAAQC,IAAI,yCAAoD9D,EAAcI,SAAUJ,EAAcM,WAGnGyB,GAET,OAAIjC,GAAgBV,EAAO/P,eAAe,WAAa+P,EAAO/P,eAAe,SACpE,IAAIuS,EAEJA","sourcesContent":["/*!\r\n * elmah.io Javascript Logger - version 3.2.0\r\n * (c) 2018-2020 elmah.io, Apache 2.0 License, https://elmah.io\r\n */\r\n\r\n(function (root, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n define([], function () {\r\n return factory(root);\r\n });\r\n } else if (typeof exports === 'object') {\r\n module.exports = factory(root);\r\n } else {\r\n root.Elmahio = factory(root);\r\n }\r\n})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, function (window) {\r\n\r\n 'use strict';\r\n\r\n //\r\n // ==== STACKFRAME ====\r\n //\r\n\r\n var StackFrame = (function () {\r\n \"use strict\";\r\n function _isNumber(n) {\r\n return !isNaN(parseFloat(n)) && isFinite(n);\r\n }\r\n function _capitalize(str) {\r\n return str.charAt(0).toUpperCase() + str.substring(1);\r\n }\r\n function _getter(p) {\r\n return function () {\r\n return this[p];\r\n };\r\n }\r\n var booleanProps = [\"isConstructor\", \"isEval\", \"isNative\", \"isToplevel\"];\r\n var numericProps = [\"columnNumber\", \"lineNumber\"];\r\n var stringProps = [\"fileName\", \"functionName\", \"source\"];\r\n var arrayProps = [\"args\"];\r\n var props = booleanProps.concat(numericProps, stringProps, arrayProps);\r\n function StackFrame(obj) {\r\n if (obj instanceof Object) {\r\n for (var i = 0; i < props.length; i++) {\r\n if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) {\r\n this[\"set\" + _capitalize(props[i])](obj[props[i]]);\r\n }\r\n }\r\n }\r\n }\r\n StackFrame.prototype = {\r\n getArgs: function () {\r\n return this.args;\r\n },\r\n setArgs: function (v) {\r\n if (Object.prototype.toString.call(v) !== \"[object Array]\") {\r\n throw new TypeError(\"Args must be an Array\");\r\n }\r\n this.args = v;\r\n },\r\n getEvalOrigin: function () {\r\n return this.evalOrigin;\r\n },\r\n setEvalOrigin: function (v) {\r\n if (v instanceof StackFrame) {\r\n this.evalOrigin = v;\r\n } else if (v instanceof Object) {\r\n this.evalOrigin = new StackFrame(v);\r\n } else {\r\n throw new TypeError(\"Eval Origin must be an Object or StackFrame\");\r\n }\r\n },\r\n toString: function () {\r\n var functionName = this.getFunctionName() || \"{anonymous}\";\r\n var args = \"(\" + (this.getArgs() || []).join(\",\") + \")\";\r\n var fileName = this.getFileName() ? \"@\" + this.getFileName() : \"\";\r\n var lineNumber = _isNumber(this.getLineNumber()) ? \":\" + this.getLineNumber() : \"\";\r\n var columnNumber = _isNumber(this.getColumnNumber()) ? \":\" + this.getColumnNumber() : \"\";\r\n return functionName + args + fileName + lineNumber + columnNumber;\r\n }\r\n };\r\n StackFrame.fromString = function StackFrame$$fromString(str) {\r\n var argsStartIndex = str.indexOf(\"(\");\r\n var argsEndIndex = str.lastIndexOf(\")\");\r\n var functionName = str.substring(0, argsStartIndex);\r\n var args = str.substring(argsStartIndex + 1, argsEndIndex).split(\",\");\r\n var locationString = str.substring(argsEndIndex + 1);\r\n if (locationString.indexOf(\"@\") === 0) {\r\n var parts = /@(.+?)(?::(\\d+))?(?::(\\d+))?$/.exec(locationString, \"\");\r\n var fileName = parts[1];\r\n var lineNumber = parts[2];\r\n var columnNumber = parts[3];\r\n }\r\n return new StackFrame({\r\n functionName: functionName,\r\n args: args || undefined,\r\n fileName: fileName,\r\n lineNumber: lineNumber || undefined,\r\n columnNumber: columnNumber || undefined\r\n });\r\n };\r\n for (var i = 0; i < booleanProps.length; i++) {\r\n StackFrame.prototype[\"get\" + _capitalize(booleanProps[i])] = _getter(booleanProps[i]);\r\n StackFrame.prototype[\"set\" + _capitalize(booleanProps[i])] = function (p) {\r\n return function (v) {\r\n this[p] = Boolean(v);\r\n };\r\n }(booleanProps[i]);\r\n }\r\n for (var j = 0; j < numericProps.length; j++) {\r\n StackFrame.prototype[\"get\" + _capitalize(numericProps[j])] = _getter(numericProps[j]);\r\n StackFrame.prototype[\"set\" + _capitalize(numericProps[j])] = function (p) {\r\n return function (v) {\r\n if (!_isNumber(v)) {\r\n throw new TypeError(p + \" must be a Number\");\r\n }\r\n this[p] = Number(v);\r\n };\r\n }(numericProps[j]);\r\n }\r\n for (var k = 0; k < stringProps.length; k++) {\r\n StackFrame.prototype[\"get\" + _capitalize(stringProps[k])] = _getter(stringProps[k]);\r\n StackFrame.prototype[\"set\" + _capitalize(stringProps[k])] = function (p) {\r\n return function (v) {\r\n this[p] = String(v);\r\n };\r\n }(stringProps[k]);\r\n }\r\n return StackFrame;\r\n })();\r\n\r\n //\r\n // ==== ERROR STACK PARSER ====\r\n //\r\n\r\n var ErrorStackParser = (function () {\r\n \"use strict\";\r\n var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+\\:\\d+/;\r\n var CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+\\:\\d+|\\(native\\))/m;\r\n var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/;\r\n return {\r\n /**\r\n * Given an Error object, extract the most information from it.\r\n *\r\n * @param {Error} error object\r\n * @return {Array} of StackFrames\r\n */\r\n parse: function ErrorStackParser$$parse(error) {\r\n if (typeof error.stacktrace !== \"undefined\" || typeof error[\"opera#sourceloc\"] !== \"undefined\") {\r\n return this.parseOpera(error);\r\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\r\n return this.parseV8OrIE(error);\r\n } else if (error.stack) {\r\n return this.parseFFOrSafari(error);\r\n } else {\r\n throw new Error(\"Cannot parse given Error object\");\r\n }\r\n },\r\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\r\n extractLocation: function ErrorStackParser$$extractLocation(urlLike) {\r\n // Fail-fast but return locations like \"(native)\"\r\n if (urlLike.indexOf(\":\") === -1) {\r\n return [urlLike];\r\n }\r\n var regExp = /(.+?)(?:\\:(\\d+))?(?:\\:(\\d+))?$/;\r\n var parts = regExp.exec(urlLike.replace(/[\\(\\)]/g, \"\"));\r\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\r\n },\r\n parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !!line.match(CHROME_IE_STACK_REGEXP);\r\n }, this);\r\n return filtered.map(function (line) {\r\n if (line.indexOf(\"(eval \") > -1) {\r\n // Throw away eval information until we implement stacktrace.js/stackframe#8\r\n line = line.replace(/eval code/g, \"eval\").replace(/(\\(eval at [^\\()]*)|(\\)\\,.*$)/g, \"\");\r\n }\r\n var tokens = line.replace(/^\\s+/, \"\").replace(/\\(eval code/g, \"(\").split(/\\s+/).slice(1);\r\n var locationParts = this.extractLocation(tokens.pop());\r\n var functionName = tokens.join(\" \") || undefined;\r\n var fileName = [\"eval\", \"\"].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];\r\n return new StackFrame({\r\n functionName: functionName,\r\n fileName: fileName,\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }, this);\r\n },\r\n parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\r\n }, this);\r\n return filtered.map(function (line) {\r\n // Throw away eval information until we implement stacktrace.js/stackframe#8\r\n if (line.indexOf(\" > eval\") > -1) {\r\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval\\:\\d+\\:\\d+/g, \":$1\");\r\n }\r\n if (line.indexOf(\"@\") === -1 && line.indexOf(\":\") === -1) {\r\n // Safari eval frames only have function names and nothing else\r\n return new StackFrame({\r\n functionName: line\r\n });\r\n } else {\r\n var functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\r\n var matches = line.match(functionNameRegex);\r\n var functionName = matches && matches[1] ? matches[1] : undefined;\r\n var locationParts = this.extractLocation(line.replace(functionNameRegex, \"\"));\r\n return new StackFrame({\r\n functionName: functionName,\r\n fileName: locationParts[0],\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }\r\n }, this);\r\n },\r\n parseOpera: function ErrorStackParser$$parseOpera(e) {\r\n if (!e.stacktrace || e.message.indexOf(\"\\n\") > -1 && e.message.split(\"\\n\").length > e.stacktrace.split(\"\\n\").length) {\r\n return this.parseOpera9(e);\r\n } else if (!e.stack) {\r\n return this.parseOpera10(e);\r\n } else {\r\n return this.parseOpera11(e);\r\n }\r\n },\r\n parseOpera9: function ErrorStackParser$$parseOpera9(e) {\r\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\r\n var lines = e.message.split(\"\\n\");\r\n var result = [];\r\n for (var i = 2, len = lines.length; i < len; i += 2) {\r\n var match = lineRE.exec(lines[i]);\r\n if (match) {\r\n result.push(new StackFrame({\r\n fileName: match[2],\r\n lineNumber: match[1],\r\n source: lines[i]\r\n }));\r\n }\r\n }\r\n return result;\r\n },\r\n parseOpera10: function ErrorStackParser$$parseOpera10(e) {\r\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\r\n var lines = e.stacktrace.split(\"\\n\");\r\n var result = [];\r\n for (var i = 0, len = lines.length; i < len; i += 2) {\r\n var match = lineRE.exec(lines[i]);\r\n if (match) {\r\n result.push(new StackFrame({\r\n functionName: match[3] || undefined,\r\n fileName: match[2],\r\n lineNumber: match[1],\r\n source: lines[i]\r\n }));\r\n }\r\n }\r\n return result;\r\n },\r\n // Opera 10.65+ Error.stack very similar to FF/Safari\r\n parseOpera11: function ErrorStackParser$$parseOpera11(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);\r\n }, this);\r\n return filtered.map(function (line) {\r\n var tokens = line.split(\"@\");\r\n var locationParts = this.extractLocation(tokens.pop());\r\n var functionCall = tokens.shift() || \"\";\r\n var functionName = functionCall.replace(//, \"$2\").replace(/\\([^\\)]*\\)/g, \"\") || undefined;\r\n var argsRaw;\r\n if (functionCall.match(/\\(([^\\)]*)\\)/)) {\r\n argsRaw = functionCall.replace(/^[^\\(]+\\(([^\\)]*)\\)$/, \"$1\");\r\n }\r\n var args = argsRaw === undefined || argsRaw === \"[arguments not available]\" ? undefined : argsRaw.split(\",\");\r\n return new StackFrame({\r\n functionName: functionName,\r\n args: args,\r\n fileName: locationParts[0],\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }, this);\r\n }\r\n };\r\n })();\r\n\r\n //\r\n // ==== STACKTRACE-GPS ====\r\n //\r\n\r\n var SourceMap = function(e){var n={};function r(t){if(n[t])return n[t].exports;var o=n[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}return r.m=e,r.c=n,r.p=\"\",r(0)}([function(e,n,r){var t=r(1),o=r(2),i=r(3).ArraySet,a=r(4),s=r(6).quickSort;function u(e){var n=e;return\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\"))),null!=n.sections?new c(n):new l(n)}function l(e){var n=e;\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\")));var r=t.getArg(n,\"version\"),o=t.getArg(n,\"sources\"),a=t.getArg(n,\"names\",[]),s=t.getArg(n,\"sourceRoot\",null),u=t.getArg(n,\"sourcesContent\",null),l=t.getArg(n,\"mappings\"),g=t.getArg(n,\"file\",null);if(r!=this._version)throw new Error(\"Unsupported version: \"+r);o=o.map(String).map(t.normalize).map(function(e){return s&&t.isAbsolute(s)&&t.isAbsolute(e)?t.relative(s,e):e}),this._names=i.fromArray(a.map(String),!0),this._sources=i.fromArray(o,!0),this.sourceRoot=s,this.sourcesContent=u,this._mappings=l,this.file=g}function g(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function c(e){var n=e;\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\")));var r=t.getArg(n,\"version\"),o=t.getArg(n,\"sections\");if(r!=this._version)throw new Error(\"Unsupported version: \"+r);this._sources=new i,this._names=new i;var a={line:-1,column:0};this._sections=o.map(function(e){if(e.url)throw new Error(\"Support for url field in sections not implemented.\");var n=t.getArg(e,\"offset\"),r=t.getArg(n,\"line\"),o=t.getArg(n,\"column\");if(r=0){var s=this._originalMappings[a];if(void 0===e.column)for(var u=s.originalLine;s&&s.originalLine===u;)i.push({line:t.getArg(s,\"generatedLine\",null),column:t.getArg(s,\"generatedColumn\",null),lastColumn:t.getArg(s,\"lastGeneratedColumn\",null)}),s=this._originalMappings[++a];else for(var l=s.originalColumn;s&&s.originalLine===n&&s.originalColumn==l;)i.push({line:t.getArg(s,\"generatedLine\",null),column:t.getArg(s,\"generatedColumn\",null),lastColumn:t.getArg(s,\"lastGeneratedColumn\",null)}),s=this._originalMappings[++a]}return i},n.SourceMapConsumer=u,l.prototype=Object.create(u.prototype),l.prototype.consumer=u,l.fromSourceMap=function(e){var n=Object.create(l.prototype),r=n._names=i.fromArray(e._names.toArray(),!0),o=n._sources=i.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var a=e._mappings.toArray().slice(),u=n.__generatedMappings=[],c=n.__originalMappings=[],p=0,h=a.length;p1&&(r.source=d+i[1],d+=i[1],r.originalLine=h+i[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+i[3],f=r.originalColumn,i.length>4&&(r.name=m+i[4],m+=i[4])),L.push(r),\"number\"==typeof r.originalLine&&y.push(r)}s(L,t.compareByGeneratedPositionsDeflated),this.__generatedMappings=L,s(y,t.compareByOriginalPositions),this.__originalMappings=y},l.prototype._findMapping=function(e,n,r,t,i,a){if(e[r]<=0)throw new TypeError(\"Line must be greater than or equal to 1, got \"+e[r]);if(e[t]<0)throw new TypeError(\"Column must be greater than or equal to 0, got \"+e[t]);return o.search(e,n,i,a)},l.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=t.getArg(o,\"source\",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=t.join(this.sourceRoot,i)));var a=t.getArg(o,\"name\",null);return null!==a&&(a=this._names.at(a)),{source:i,line:t.getArg(o,\"originalLine\",null),column:t.getArg(o,\"originalColumn\",null),name:a}}}return{source:null,line:null,column:null,name:null}},l.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},l.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=t.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=t.urlParse(this.sourceRoot))){var o=e.replace(/^file:\\/\\//,\"\");if(\"file\"==r.scheme&&this._sources.has(o))return this.sourcesContent[this._sources.indexOf(o)];if((!r.path||\"/\"==r.path)&&this._sources.has(\"/\"+e))return this.sourcesContent[this._sources.indexOf(\"/\"+e)]}if(n)return null;throw new Error('\"'+e+'\" is not in the SourceMap.')},l.prototype.generatedPositionFor=function(e){var n=t.getArg(e,\"source\");if(null!=this.sourceRoot&&(n=t.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};var r={source:n=this._sources.indexOf(n),originalLine:t.getArg(e,\"line\"),originalColumn:t.getArg(e,\"column\")},o=this._findMapping(r,this._originalMappings,\"originalLine\",\"originalColumn\",t.compareByOriginalPositions,t.getArg(e,\"bias\",u.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:t.getArg(i,\"generatedLine\",null),column:t.getArg(i,\"generatedColumn\",null),lastColumn:t.getArg(i,\"lastGeneratedColumn\",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=l,c.prototype=Object.create(u.prototype),c.prototype.constructor=u,c.prototype._version=3,Object.defineProperty(c.prototype,\"sources\",{get:function(){for(var e=[],n=0;n=0;g--)\".\"===(a=u[g])?u.splice(g,1):\"..\"===a?l++:l>0&&(\"\"===a?(u.splice(g+1,l),l=0):(u.splice(g,2),l--));return\"\"===(r=u.join(\"/\"))&&(r=s?\"/\":\".\"),t?(t.path=r,i(t)):r}n.urlParse=o,n.urlGenerate=i,n.normalize=a,n.join=function(e,n){\"\"===e&&(e=\".\"),\"\"===n&&(n=\".\");var r=o(n),s=o(e);if(s&&(e=s.path||\"/\"),r&&!r.scheme)return s&&(r.scheme=s.scheme),i(r);if(r||n.match(t))return n;if(s&&!s.host&&!s.path)return s.host=n,i(s);var u=\"/\"===n.charAt(0)?n:a(e.replace(/\\/+$/,\"\")+\"/\"+n);return s?(s.path=u,i(s)):u},n.isAbsolute=function(e){return\"/\"===e.charAt(0)||!!e.match(r)},n.relative=function(e,n){\"\"===e&&(e=\".\"),e=e.replace(/\\/$/,\"\");for(var r=0;0!==n.indexOf(e+\"/\");){var t=e.lastIndexOf(\"/\");if(t<0)return n;if((e=e.slice(0,t)).match(/^([^\\/]+:\\/)?\\/*$/))return n;++r}return Array(r+1).join(\"../\")+n.substr(e.length+1)};var s=!(\"__proto__\"in Object.create(null));function u(e){return e}function l(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function g(e,n){return e===n?0:e>n?1:-1}n.toSetString=s?u:function(e){return l(e)?\"$\"+e:e},n.fromSetString=s?u:function(e){return l(e)?e.slice(1):e},n.compareByOriginalPositions=function(e,n,r){var t=e.source-n.source;return 0!==t?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)||r?t:0!=(t=e.generatedColumn-n.generatedColumn)?t:0!=(t=e.generatedLine-n.generatedLine)?t:e.name-n.name},n.compareByGeneratedPositionsDeflated=function(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:0!=(t=e.generatedColumn-n.generatedColumn)||r?t:0!=(t=e.source-n.source)?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)?t:e.name-n.name},n.compareByGeneratedPositionsInflated=function(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:0!=(r=e.generatedColumn-n.generatedColumn)?r:0!==(r=g(e.source,n.source))?r:0!=(r=e.originalLine-n.originalLine)?r:0!=(r=e.originalColumn-n.originalColumn)?r:g(e.name,n.name)}},function(e,n){n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,r,t,o){if(0===r.length)return-1;var i=function e(r,t,o,i,a,s){var u=Math.floor((t-r)/2)+r,l=a(o,i[u],!0);return 0===l?u:l>0?t-u>1?e(u,t,o,i,a,s):s==n.LEAST_UPPER_BOUND?t1?e(r,u,o,i,a,s):s==n.LEAST_UPPER_BOUND?u:r<0?-1:r}(-1,r.length,e,r,t,o||n.GREATEST_LOWER_BOUND);if(i<0)return-1;for(;i-1>=0&&0===t(r[i],r[i-1],!0);)--i;return i}},function(e,n,r){var t=r(1),o=Object.prototype.hasOwnProperty;function i(){this._array=[],this._set=Object.create(null)}i.fromArray=function(e,n){for(var r=new i,t=0,o=e.length;t=0&&e>>=5)>0&&(n|=32),o+=t.encode(n)}while(i>0);return o},n.decode=function(e,n,r){var o,i,a,s,u=e.length,l=0,g=0;do{if(n>=u)throw new Error(\"Expected more digits in base 64 VLQ value.\");if(-1===(i=t.decode(e.charCodeAt(n++))))throw new Error(\"Invalid base64 digit: \"+e.charAt(n-1));o=!!(32&i),l+=(i&=31)<>1,1==(1&a)?-s:s),r.rest=n}},function(e,n){var r=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");n.encode=function(e){if(0<=e&&e= 200 && req.status < 300 || url.substr(0, 7) === \"file://\" && req.responseText) {\r\n resolve(req.responseText);\r\n } else {\r\n reject(new Error(\"HTTP status: \" + req.status + \" retrieving \" + url));\r\n }\r\n }\r\n };\r\n req.send();\r\n });\r\n }\r\n /**\r\n * Convert a Base64-encoded string into its original representation.\r\n * Used for inline sourcemaps.\r\n *\r\n * @param {String} b64str Base-64 encoded string\r\n * @returns {String} original representation of the base64-encoded string.\r\n */\r\n function _atob(b64str) {\r\n if (typeof window !== \"undefined\" && window.atob) {\r\n return window.atob(b64str);\r\n } else {\r\n throw new Error(\"You must supply a polyfill for window.atob in this environment\");\r\n }\r\n }\r\n function _parseJson(string) {\r\n if (typeof JSON !== \"undefined\" && JSON.parse) {\r\n return JSON.parse(string);\r\n } else {\r\n throw new Error(\"You must supply a polyfill for JSON.parse in this environment\");\r\n }\r\n }\r\n function _findFunctionName(source, lineNumber) {\r\n var syntaxes = [ // {name} = function ({args}) TODO args capture\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*function\\b/, // function {name}({args}) m[1]=name m[2]=args\r\n /function\\s+([^('\"`]*?)\\s*\\(([^)]*)\\)/, // {name} = eval()\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*(?:eval|new Function)\\b/, // fn_name() {\r\n /\\b(?!(?:if|for|switch|while|with|catch)\\b)(?:(?:static)\\s+)?(\\S+)\\s*\\(.*?\\)\\s*\\{/, // {name} = () => {\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*\\(.*?\\)\\s*=>/];\r\n var lines = source.split(\"\\n\");\r\n // Walk backwards in the source lines until we find the line which matches one of the patterns above\r\n var code = \"\";\r\n var maxLines = Math.min(lineNumber, 20);\r\n for (var i = 0; i < maxLines; ++i) {\r\n // lineNo is 1-based, source[] is 0-based\r\n var line = lines[lineNumber - i - 1];\r\n var commentPos = line.indexOf(\"//\");\r\n if (commentPos >= 0) {\r\n line = line.substr(0, commentPos);\r\n }\r\n if (line) {\r\n code = line + code;\r\n var len = syntaxes.length;\r\n for (var index = 0; index < len; index++) {\r\n var m = syntaxes[index].exec(code);\r\n if (m && m[1]) {\r\n return m[1];\r\n }\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n function _ensureSupportedEnvironment() {\r\n if (typeof Object.defineProperty !== \"function\" || typeof Object.create !== \"function\") {\r\n throw new Error(\"Unable to consume source maps in older browsers\");\r\n }\r\n }\r\n function _ensureStackFrameIsLegit(stackframe) {\r\n if (typeof stackframe !== \"object\") {\r\n throw new TypeError(\"Given StackFrame is not an object\");\r\n } else if (typeof stackframe.fileName !== \"string\") {\r\n throw new TypeError(\"Given file name is not a String\");\r\n } else if (typeof stackframe.lineNumber !== \"number\" || stackframe.lineNumber % 1 !== 0 || stackframe.lineNumber < 1) {\r\n throw new TypeError(\"Given line number must be a positive integer\");\r\n } else if (typeof stackframe.columnNumber !== \"number\" || stackframe.columnNumber % 1 !== 0 || stackframe.columnNumber < 0) {\r\n throw new TypeError(\"Given column number must be a non-negative integer\");\r\n }\r\n return true;\r\n }\r\n function _findSourceMappingURL(source) {\r\n var sourceMappingUrlRegExp = /\\/\\/[#@] ?sourceMappingURL=([^\\s'\"]+)\\s*$/gm;\r\n var lastSourceMappingUrl;\r\n var matchSourceMappingUrl;\r\n while (matchSourceMappingUrl = sourceMappingUrlRegExp.exec(source)) {\r\n // jshint ignore:line\r\n lastSourceMappingUrl = matchSourceMappingUrl[1];\r\n }\r\n if (lastSourceMappingUrl) {\r\n return lastSourceMappingUrl;\r\n } else {\r\n throw new Error(\"sourceMappingURL not found\");\r\n }\r\n }\r\n function _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache) {\r\n return new Promise(function (resolve, reject) {\r\n var loc = sourceMapConsumer.originalPositionFor({\r\n line: stackframe.lineNumber,\r\n column: stackframe.columnNumber\r\n });\r\n if (loc.source) {\r\n // cache mapped sources\r\n var mappedSource = sourceMapConsumer.sourceContentFor(loc.source);\r\n if (mappedSource) {\r\n sourceCache[loc.source] = mappedSource;\r\n }\r\n resolve(// given stackframe and source location, update stackframe\r\n new StackFrame({\r\n functionName: loc.name || stackframe.functionName,\r\n args: stackframe.args,\r\n fileName: loc.source,\r\n lineNumber: loc.line,\r\n columnNumber: loc.column\r\n }));\r\n } else {\r\n reject(new Error(\"Could not get original source for given stackframe and source map\"));\r\n }\r\n });\r\n }\r\n /**\r\n * @constructor\r\n * @param {Object} opts\r\n * opts.sourceCache = {url: \"Source String\"} => preload source cache\r\n * opts.sourceMapConsumerCache = {/path/file.js.map: SourceMapConsumer}\r\n * opts.offline = True to prevent network requests.\r\n * Best effort without sources or source maps.\r\n * opts.ajax = Promise returning function to make X-Domain requests\r\n */\r\n return function StackTraceGPS(opts) {\r\n if (!(this instanceof StackTraceGPS)) {\r\n return new StackTraceGPS(opts);\r\n }\r\n opts = opts || {};\r\n this.sourceCache = opts.sourceCache || {};\r\n this.sourceMapConsumerCache = opts.sourceMapConsumerCache || {};\r\n this.ajax = opts.ajax || _xdr;\r\n this._atob = opts.atob || _atob;\r\n\r\n this._get = function _get(location) {\r\n return new Promise(function (resolve, reject) {\r\n var isDataUrl = location.substr(0, 5) === \"data:\";\r\n if (this.sourceCache[location]) {\r\n resolve(this.sourceCache[location]);\r\n } else if (opts.offline && !isDataUrl) {\r\n reject(new Error(\"Cannot make network requests in offline mode\"));\r\n } else {\r\n if (isDataUrl) {\r\n // data URLs can have parameters.\r\n // see http://tools.ietf.org/html/rfc2397\r\n var supportedEncodingRegexp = /^data:application\\/json;([\\w=:\"-]+;)*base64,/;\r\n var match = location.match(supportedEncodingRegexp);\r\n if (match) {\r\n var sourceMapStart = match[0].length;\r\n var encodedSource = location.substr(sourceMapStart);\r\n var source = this._atob(encodedSource);\r\n this.sourceCache[location] = source;\r\n resolve(source);\r\n } else {\r\n reject(new Error(\"The encoding of the inline sourcemap is not supported\"));\r\n }\r\n } else {\r\n var xhrPromise = this.ajax(location, {\r\n method: \"get\"\r\n });\r\n // Cache the Promise to prevent duplicate in-flight requests\r\n this.sourceCache[location] = xhrPromise;\r\n xhrPromise.then(resolve, reject);\r\n }\r\n }\r\n }.bind(this));\r\n };\r\n /**\r\n * Creating SourceMapConsumers is expensive, so this wraps the creation of a\r\n * SourceMapConsumer in a per-instance cache.\r\n *\r\n * @param {String} sourceMappingURL = URL to fetch source map from\r\n * @param {String} defaultSourceRoot = Default source root for source map if undefined\r\n * @returns {Promise} that resolves a SourceMapConsumer\r\n */\r\n this._getSourceMapConsumer = function _getSourceMapConsumer(sourceMappingURL, defaultSourceRoot) {\r\n return new Promise(function (resolve, reject) {\r\n if (this.sourceMapConsumerCache[sourceMappingURL]) {\r\n resolve(this.sourceMapConsumerCache[sourceMappingURL]);\r\n } else {\r\n var sourceMapConsumerPromise = new Promise(function (resolve, reject) {\r\n return this._get(sourceMappingURL).then(function (sourceMapSource) {\r\n if (typeof sourceMapSource === \"string\") {\r\n sourceMapSource = _parseJson(sourceMapSource.replace(/^\\)\\]\\}'/, \"\"));\r\n }\r\n if (typeof sourceMapSource.sourceRoot === \"undefined\") {\r\n sourceMapSource.sourceRoot = defaultSourceRoot;\r\n }\r\n resolve(new SourceMap.SourceMapConsumer(sourceMapSource));\r\n }, reject);\r\n }.bind(this));\r\n this.sourceMapConsumerCache[sourceMappingURL] = sourceMapConsumerPromise;\r\n resolve(sourceMapConsumerPromise);\r\n }\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, enhance function name and use source maps for a\r\n * better StackFrame.\r\n *\r\n * @param {StackFrame} stackframe object\r\n * @returns {Promise} that resolves with with source-mapped StackFrame\r\n */\r\n this.pinpoint = function StackTraceGPS$$pinpoint(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n this.getMappedLocation(stackframe).then(function (mappedStackFrame) {\r\n function resolveMappedStackFrame() {\r\n resolve(mappedStackFrame);\r\n }\r\n this.findFunctionName(mappedStackFrame).then(resolve, resolveMappedStackFrame)[\"catch\"](resolveMappedStackFrame);\r\n }.bind(this), reject);\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, guess function name from location information.\r\n *\r\n * @param {StackFrame} stackframe\r\n * @returns {Promise} that resolves with enhanced StackFrame.\r\n */\r\n this.findFunctionName = function StackTraceGPS$$findFunctionName(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n _ensureStackFrameIsLegit(stackframe);\r\n this._get(stackframe.fileName).then(function getSourceCallback(source) {\r\n var lineNumber = stackframe.lineNumber;\r\n var columnNumber = stackframe.columnNumber;\r\n var guessedFunctionName = _findFunctionName(source, lineNumber, columnNumber);\r\n // Only replace functionName if we found something\r\n if (guessedFunctionName) {\r\n resolve(new StackFrame({\r\n functionName: guessedFunctionName,\r\n args: stackframe.args,\r\n fileName: stackframe.fileName,\r\n lineNumber: lineNumber,\r\n columnNumber: columnNumber\r\n }));\r\n } else {\r\n resolve(stackframe);\r\n }\r\n }, reject)[\"catch\"](reject);\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, seek source-mapped location and return new enhanced StackFrame.\r\n *\r\n * @param {StackFrame} stackframe\r\n * @returns {Promise} that resolves with enhanced StackFrame.\r\n */\r\n this.getMappedLocation = function StackTraceGPS$$getMappedLocation(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n _ensureSupportedEnvironment();\r\n _ensureStackFrameIsLegit(stackframe);\r\n var sourceCache = this.sourceCache;\r\n var fileName = stackframe.fileName;\r\n this._get(fileName).then(function (source) {\r\n var sourceMappingURL = _findSourceMappingURL(source);\r\n var isDataUrl = sourceMappingURL.substr(0, 5) === \"data:\";\r\n var defaultSourceRoot = fileName.substring(0, fileName.lastIndexOf(\"/\") + 1);\r\n if (sourceMappingURL[0] !== \"/\" && !isDataUrl && !/^https?:\\/\\/|^\\/\\//i.test(sourceMappingURL)) {\r\n sourceMappingURL = defaultSourceRoot + sourceMappingURL;\r\n }\r\n return this._getSourceMapConsumer(sourceMappingURL, defaultSourceRoot).then(function (sourceMapConsumer) {\r\n return _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache).then(resolve)[\"catch\"](function () {\r\n resolve(stackframe);\r\n });\r\n });\r\n }.bind(this), reject)[\"catch\"](reject);\r\n }.bind(this));\r\n };\r\n };\r\n })(SourceMap, StackFrame);\r\n\r\n //\r\n // Shared Variables\r\n //\r\n\r\n var scriptFile = document.getElementsByTagName('script');\r\n var scriptIndex = scriptFile.length - 1;\r\n var myScript = scriptFile[scriptIndex];\r\n var queryString = myScript.src.replace(/^[^\\?]+\\??/, '');\r\n var params = parseQuery(queryString);\r\n var paramsLength = objectLength(params);\r\n\r\n var debugSettings = {\r\n label: ' elmah.io debugger : On ',\r\n labelCSS: 'background: #06a89c; color: #ffffff; display: inline-block; font-size: 14px;',\r\n successCSS: 'background: #d4edda; color: #155724; display: inline-block; font-size: 13px;',\r\n errorCSS: 'background: #f8d7da; color: #721c24; display: inline-block; font-size: 13px;',\r\n warningCSS: 'background: #fff3cd; color: #856404; display: inline-block; font-size: 13px;',\r\n lightCSS: 'background: #e2e3e5; color: #383d41; display: inline-block; font-size: 13px;'\r\n };\r\n\r\n var defaults = {\r\n apiKey: null,\r\n logId: null,\r\n debug: false,\r\n application: null,\r\n filter: null\r\n };\r\n\r\n //\r\n // Shared Methods\r\n //\r\n\r\n var extend = function () {\r\n\r\n // Variables\r\n var extended = {};\r\n var deep = false;\r\n var i = 0;\r\n\r\n // Check if a deep merge\r\n if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') {\r\n deep = arguments[0];\r\n i++;\r\n }\r\n\r\n // Merge the object into the extended object\r\n var merge = function (obj) {\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n // If property is an object, merge properties\r\n if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') {\r\n extended[prop] = extend(extended[prop], obj[prop]);\r\n } else {\r\n extended[prop] = obj[prop];\r\n }\r\n }\r\n }\r\n };\r\n\r\n // Loop through each object and conduct a merge\r\n for (; i < arguments.length; i++) {\r\n var obj = arguments[i];\r\n merge(obj);\r\n }\r\n\r\n return extended;\r\n\r\n };\r\n\r\n //\r\n // Helpers\r\n //\r\n\r\n function parseQuery(query) {\r\n var Params = new Object();\r\n if (!query) return Params; // return empty object\r\n var Pairs = query.split(/[;&]/);\r\n for (var i = 0; i < Pairs.length; i++) {\r\n var KeyVal = Pairs[i].split('=');\r\n if (!KeyVal || KeyVal.length !== 2) continue;\r\n var key = unescape(KeyVal[0]);\r\n var val = unescape(KeyVal[1]);\r\n val = val.replace(/\\+/g, ' ');\r\n Params[key] = val;\r\n }\r\n return Params;\r\n }\r\n\r\n function objectLength(obj) {\r\n var size = 0, key;\r\n for (key in obj) {\r\n if (obj.hasOwnProperty(key)) size++;\r\n }\r\n return size;\r\n };\r\n\r\n function getSearchParameters() {\r\n var prmstr = window.location.search.substr(1);\r\n return prmstr !== null && prmstr !== \"\" ? transformToAssocArray(prmstr) : {};\r\n }\r\n\r\n function transformToAssocArray(prmstr) {\r\n var params = [];\r\n var prmarr = prmstr.split(\"&\");\r\n for (var i = 0; i < prmarr.length; i++) {\r\n var tmparr = prmarr[i].split(\"=\");\r\n params.push({\r\n 'key': tmparr[0],\r\n 'value': tmparr[1]\r\n });\r\n }\r\n return params;\r\n }\r\n\r\n function merge_objects(obj1, obj2) {\r\n var obj3 = {};\r\n for (var attrname1 in obj1) {\r\n obj3[attrname1] = obj1[attrname1];\r\n }\r\n for (var attrname2 in obj2) {\r\n obj3[attrname2] = obj2[attrname2];\r\n }\r\n\r\n return obj3;\r\n }\r\n\r\n //\r\n // Constructor\r\n // Can be named anything you want\r\n //\r\n\r\n var Constructor = function (options) {\r\n\r\n //\r\n // Unique Variables\r\n //\r\n\r\n var publicAPIs = {};\r\n var settings;\r\n\r\n function getPayload() {\r\n var payload = {\r\n \"url\": document.location.pathname || '/',\r\n \"application\": settings.application\r\n };\r\n\r\n var payload_data = [];\r\n\r\n if (document.documentMode) payload_data.push({ \"key\": \"Document-Mode\", \"value\": document.documentMode });\r\n if (window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth) payload_data.push({ \"key\": \"Browser-Width\", \"value\": window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth });\r\n if (window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight) payload_data.push({ \"key\": \"Browser-Height\", \"value\": window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight });\r\n if ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type) !== undefined) payload_data.push({ \"key\": \"Screen-Orientation\", \"value\": ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type).split(\"-\"))[0] });\r\n if (screen.width) payload_data.push({ \"key\": \"Screen-Width\", \"value\": screen.width });\r\n if (screen.height) payload_data.push({ \"key\": \"Screen-Height\", \"value\": screen.height });\r\n if (screen.colorDepth) payload_data.push({ \"key\": \"Color-Depth\", \"value\": screen.colorDepth });\r\n payload_data.push({ \"key\": \"X-ELMAHIO-SEARCH-isClientside\", \"value\": \"true\" });\r\n\r\n payload.data = payload_data;\r\n\r\n var payload_serverVariables = [];\r\n if (navigator.language) payload_serverVariables.push({ \"key\": \"User-Language\", \"value\": navigator.language });\r\n if (navigator.userAgent) payload_serverVariables.push({ \"key\": \"User-Agent\", \"value\": navigator.userAgent });\r\n if (document.referrer) payload_serverVariables.push({ \"key\": \"Referer\", \"value\": document.referrer });\r\n if (document.location.protocol === \"https:\") payload_serverVariables.push({ \"key\": \"HTTPS\", \"value\": 'on' });\r\n if (document.location.hostname) payload_serverVariables.push({ \"key\": \"Host\", \"value\": document.location.hostname });\r\n\r\n payload.serverVariables = payload_serverVariables;\r\n\r\n return payload;\r\n }\r\n\r\n function confirmResponse(status, response) {\r\n if (settings.debug) {\r\n if (status === 'error') {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2715 Not created ', debugSettings.lightCSS, debugSettings.errorCSS);\r\n } else if (status === 'success') {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2714 ' + response + ' at ' + new Date().toLocaleString() + ' ', debugSettings.lightCSS, debugSettings.successCSS);\r\n } else {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2715 Not created. Title should not be undefined, null or empty ! ', debugSettings.lightCSS, debugSettings.errorCSS);\r\n }\r\n }\r\n }\r\n\r\n function stackGPS(error, xhr, jsonData) {\r\n var errorStack = error.toString().split(\"\\n\")[0];\r\n var gps = new StackTraceGPS();\r\n var promise = new Promise(function(resolve) {\r\n var stackframes = ErrorStackParser.parse(error);\r\n resolve(Promise.all(stackframes.map(function(sf) {\r\n return new Promise(function(resolve) {\r\n function resolveOriginal() {\r\n resolve(sf);\r\n }\r\n gps.pinpoint(sf).then(resolve, resolveOriginal)['catch'](resolveOriginal);\r\n });\r\n })));\r\n }\r\n );\r\n\r\n promise.then(function(newFrames){\r\n newFrames.forEach(function(stackFrame, i){\r\n if(stackFrame.functionName) {\r\n var fn = stackFrame.functionName + ' ';\r\n } else {\r\n var fn = '';\r\n }\r\n var stackString = ' at ' + fn + '(' + stackFrame.fileName + ':' + stackFrame.lineNumber + ':' + stackFrame.columnNumber + ')';\r\n newFrames[i] = stackString;\r\n });\r\n newFrames.unshift(errorStack);\r\n jsonData.detail = newFrames.join(\"\\n\");\r\n\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n\r\n xhr.send(JSON.stringify(jsonData));\r\n });\r\n }\r\n\r\n function stackString(error) {\r\n var typeOF = typeof error.error;\r\n var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1);\r\n\r\n return typeOFCapitalized + ': ' + error.error + '\\n' + ' at ' + '(' + error.source + ':' + error.lineno + ':' + error.colno + ')';\r\n }\r\n\r\n // Private methods\r\n\r\n var sendPayload = function (apiKey, logId, callback, errorLog) {\r\n\r\n var api_key = apiKey,\r\n log_id = logId,\r\n error = errorLog,\r\n send = 1,\r\n queryParams = getSearchParameters(),\r\n stack = error.error && objectLength(error.error.stack) !== 0 && typeof error.error === \"object\" ? ErrorStackParser.parse(error.error) : '';\r\n\r\n // Ignoring error from an external script\r\n if (error && error.colno === 0 && error.lineno === 0 && (!stack || stack === '') && error.message && (error.message === \"Script error.\" || error.message === \"Script error\")) {\r\n if (settings.debug) {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\uD83D\\uDEC8 Ignoring error from external script ', debugSettings.lightCSS, debugSettings.warningCSS);\r\n }\r\n return;\r\n }\r\n\r\n if ((api_key !== null && log_id !== null) || (paramsLength === 2)) {\r\n\r\n // Priority for parameters\r\n if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n api_key = params['apiKey'];\r\n log_id = params['logId'];\r\n }\r\n\r\n // get new XHR object\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://api.elmah.io/v3/messages/\" + log_id + \"?api_key=\" + api_key, true);\r\n\r\n xhr.setRequestHeader('Content-type', 'application/json');\r\n\r\n xhr.onload = function (e) {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 201) {\r\n callback('success', xhr.statusText);\r\n }\r\n }\r\n };\r\n\r\n xhr.onerror = function (e) {\r\n callback('error', xhr.statusText);\r\n\r\n // on error event\r\n publicAPIs.emit('error', xhr.status, xhr.statusText);\r\n }\r\n\r\n var jsonData = {\r\n \"detail\": error.error ? error.error.stack : null,\r\n \"title\": error.message || 'Unspecified error',\r\n \"source\": stack && stack.length > 0 ? stack[0].fileName : null,\r\n \"severity\": \"Error\",\r\n \"type\": error.error ? error.error.name : null,\r\n \"queryString\": JSON.parse(JSON.stringify(queryParams))\r\n };\r\n\r\n // Check if error sent is a string and not an object\r\n // Then create the articifial stacktrace and pass source & type of the error\r\n if(error.error && (objectLength(error.error.stack) === 0) && typeof jsonData.detail === \"undefined\") {\r\n var typeOF = typeof errorLog.error;\r\n var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1);\r\n\r\n jsonData.detail = stackString(errorLog);\r\n jsonData.source = errorLog.source;\r\n jsonData.title = \"Uncaught \" + typeOFCapitalized + \": \" + errorLog.error;\r\n }\r\n\r\n // Add payload to jsonData\r\n jsonData = merge_objects(jsonData, getPayload());\r\n\r\n // filter callback\r\n if (settings.filter !== null) {\r\n if (settings.filter(jsonData)) {\r\n send = 0;\r\n }\r\n }\r\n\r\n if (send === 1) {\r\n\r\n if (error.error && typeof error.error === \"object\" && objectLength(error.error.stack) !== 0 && typeof Promise !== \"undefined\" && Promise.toString().indexOf(\"[native code]\") !== -1) {\r\n // send message trying to pinpoint stackframes\r\n stackGPS(error.error, xhr, jsonData);\r\n } else {\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n\r\n // send message\r\n xhr.send(JSON.stringify(jsonData));\r\n }\r\n }\r\n\r\n } else {\r\n return console.log('Login api error');\r\n }\r\n };\r\n\r\n var sendManualPayload = function (apiKey, logId, callback, logType, messageLog, errorLog) {\r\n var api_key = apiKey,\r\n log_id = logId,\r\n type = logType,\r\n error = errorLog,\r\n message = messageLog,\r\n send = 1,\r\n queryParams = getSearchParameters();\r\n\r\n if ((api_key !== null && log_id !== null) || (paramsLength === 2)) {\r\n\r\n // Priority for parameters\r\n if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n api_key = params['apiKey'];\r\n log_id = params['logId'];\r\n }\r\n\r\n // get new XHR object\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://api.elmah.io/v3/messages/\" + log_id + \"?api_key=\" + api_key, true);\r\n xhr.setRequestHeader('Content-type', 'application/json');\r\n\r\n xhr.onload = function (e) {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 201) {\r\n callback('success', xhr.statusText);\r\n }\r\n }\r\n };\r\n\r\n xhr.onerror = function (e) {\r\n callback('error', xhr.statusText);\r\n\r\n // on error event\r\n publicAPIs.emit('error', xhr.status, xhr.statusText);\r\n }\r\n\r\n if (type !== \"Log\") {\r\n\r\n var stack = error ? ErrorStackParser.parse(error) : null;\r\n\r\n var jsonData = {\r\n \"title\": message,\r\n \"source\": stack && stack.length > 0 ? stack[0].fileName : null,\r\n \"detail\": error ? error.stack : null,\r\n \"severity\": type,\r\n \"type\": error ? error.name : null,\r\n \"queryString\": JSON.parse(JSON.stringify(queryParams))\r\n };\r\n\r\n // Add payload to jsonData\r\n jsonData = merge_objects(jsonData, getPayload());\r\n\r\n } else {\r\n\r\n jsonData = error;\r\n\r\n }\r\n\r\n // filter callback\r\n if (settings.filter !== null) {\r\n if (settings.filter(jsonData)) {\r\n send = 0;\r\n }\r\n }\r\n\r\n if (send === 1) {\r\n if (jsonData.title) {\r\n\r\n if (error && type !== \"Log\" && typeof Promise !== \"undefined\" && Promise.toString().indexOf(\"[native code]\") !== -1) {\r\n // send message trying to pinpoint stackframes\r\n stackGPS(error, xhr, jsonData);\r\n } else {\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n\r\n // send message\r\n xhr.send(JSON.stringify(jsonData));\r\n }\r\n\r\n } else {\r\n callback('missing-title', xhr.statusText);\r\n }\r\n }\r\n\r\n } else {\r\n return console.log('Login api error');\r\n }\r\n };\r\n\r\n // Some public methods\r\n\r\n publicAPIs.error = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg);\r\n };\r\n publicAPIs.error = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg, error);\r\n };\r\n\r\n publicAPIs.verbose = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg);\r\n };\r\n publicAPIs.verbose = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg, error);\r\n };\r\n\r\n publicAPIs.debug = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg);\r\n };\r\n publicAPIs.debug = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg, error);\r\n };\r\n\r\n publicAPIs.information = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg);\r\n };\r\n publicAPIs.information = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg, error);\r\n };\r\n\r\n publicAPIs.warning = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg);\r\n };\r\n publicAPIs.warning = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg, error);\r\n };\r\n\r\n publicAPIs.fatal = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg);\r\n };\r\n publicAPIs.fatal = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg, error);\r\n };\r\n\r\n publicAPIs.log = function (obj) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Log', null, obj);\r\n };\r\n\r\n publicAPIs.message = function() {\r\n return getPayload();\r\n };\r\n\r\n publicAPIs.on = function (name, callback, ctx) {\r\n var e = this.e || (this.e = {});\r\n\r\n (e[name] || (e[name] = [])).push({\r\n fn: callback,\r\n ctx: ctx\r\n });\r\n\r\n return this;\r\n };\r\n\r\n publicAPIs.emit = function (name) {\r\n var data = [].slice.call(arguments, 1);\r\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\r\n var i = 0;\r\n var len = evtArr.length;\r\n\r\n for (i; i < len; i++) {\r\n evtArr[i].fn.apply(evtArr[i].ctx, data);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n publicAPIs.init = function (options) {\r\n\r\n // Merge options into defaults\r\n settings = extend(defaults, options || {});\r\n\r\n // Code goes here...\r\n window.onerror = function (message, source, lineno, colno, error) {\r\n\r\n var errorLog = {\r\n 'message': message,\r\n 'source': source,\r\n 'lineno': lineno,\r\n 'colno': colno,\r\n 'error': error\r\n }\r\n\r\n sendPayload(settings.apiKey, settings.logId, confirmResponse, errorLog);\r\n\r\n return false;\r\n }\r\n\r\n };\r\n\r\n // Initialize the plugin\r\n publicAPIs.init(options);\r\n\r\n // If debug is true, show some errors\r\n if (settings.debug) {\r\n console.log('%c' + debugSettings.label, debugSettings.labelCSS);\r\n\r\n if(settings.apiKey) {\r\n if(settings.apiKey.length !== 32) {\r\n console.log('%c \\u26A0 API Key: ' + '%c The API Key must have exactly 32 characters long ', debugSettings.errorCSS, debugSettings.lightCSS);\r\n }\r\n } else {\r\n console.log('%c \\u26A0 API Key: ' + '%c The API Key is not set ', debugSettings.errorCSS, debugSettings.lightCSS);\r\n }\r\n\r\n if(settings.logId) {\r\n if(!settings.logId.match(/^(\\{){0,1}[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}(\\}){0,1}$/gi)) {\r\n console.log('%c \\u26A0 API Key: ' + '%c The Log ID is not valid ', debugSettings.errorCSS, debugSettings.lightCSS);\r\n }\r\n } else {\r\n console.log('%c \\u26A0 Log ID: ' + '%c The Log ID is not set ', debugSettings.errorCSS, debugSettings.lightCSS);\r\n }\r\n }\r\n\r\n // Return the public APIs\r\n return publicAPIs;\r\n\r\n };\r\n\r\n\r\n //\r\n // Return the constructor\r\n //\r\n\r\n if (paramsLength && params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n // Immediately-Invoked Function Expression (IIFE)\r\n return new Constructor;\r\n } else {\r\n // UMD Constructor\r\n return Constructor;\r\n }\r\n\r\n});\r\n"],"file":"elmahio.min.js"} \ No newline at end of file +{"version":3,"sources":["elmahio.js"],"names":["root","factory","define","amd","exports","module","Elmahio","global","window","this","FIREFOX_SAFARI_STACK_REGEXP","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","StackFrame","_isNumber","n","isNaN","parseFloat","isFinite","_capitalize","str","charAt","toUpperCase","substring","_getter","p","booleanProps","numericProps","stringProps","props","concat","obj","Object","i","length","hasOwnProperty","undefined","prototype","getArgs","args","setArgs","v","toString","call","TypeError","getEvalOrigin","evalOrigin","setEvalOrigin","getFunctionName","join","getFileName","getLineNumber","getColumnNumber","fromString","argsStartIndex","indexOf","argsEndIndex","lastIndexOf","functionName","split","locationString","parts","exec","fileName","lineNumber","columnNumber","Boolean","j","Number","k","String","ErrorStackParser","parse","error","stacktrace","parseOpera","stack","match","parseV8OrIE","parseFFOrSafari","Error","extractLocation","urlLike","replace","filter","line","map","tokens","slice","locationParts","pop","source","functionNameRegex","matches","e","message","parseOpera9","parseOpera11","parseOpera10","lineRE","lines","result","len","push","argsRaw","functionCall","shift","StackTraceGPS","SourceMap","_xdr","url","Promise","resolve","reject","req","XMLHttpRequest","open","onerror","onreadystatechange","readyState","status","substr","responseText","send","_atob","b64str","atob","_ensureStackFrameIsLegit","stackframe","opts","sourceCache","sourceMapConsumerCache","ajax","_get","location","isDataUrl","offline","sourceMapStart","encodedSource","xhrPromise","method","then","bind","_getSourceMapConsumer","sourceMappingURL","defaultSourceRoot","sourceMapConsumerPromise","sourceMapSource","string","JSON","_parseJson","sourceRoot","SourceMapConsumer","pinpoint","getMappedLocation","mappedStackFrame","resolveMappedStackFrame","findFunctionName","guessedFunctionName","syntaxes","code","maxLines","Math","min","commentPos","index","m","_findFunctionName","defineProperty","create","_ensureSupportedEnvironment","lastSourceMappingUrl","matchSourceMappingUrl","sourceMappingUrlRegExp","_findSourceMappingURL","test","sourceMapConsumer","loc","originalPositionFor","column","mappedSource","sourceContentFor","name","_extractLocationInfoFromSourceMapSource","r","t","o","id","loaded","c","ArraySet","a","s","quickSort","u","sections","l","getArg","g","_version","normalize","isAbsolute","relative","_names","fromArray","_sources","sourcesContent","_mappings","file","generatedLine","generatedColumn","originalLine","originalColumn","_sections","generatedOffset","consumer","fromSourceMap","__generatedMappings","get","_parseMappings","__originalMappings","_charIsMappingSeparator","GENERATED_ORDER","ORIGINAL_ORDER","GREATEST_LOWER_BOUND","LEAST_UPPER_BOUND","eachMapping","_generatedMappings","_originalMappings","at","forEach","allGeneratedPositionsFor","has","_findMapping","compareByOriginalPositions","lastColumn","toArray","_sourceRoot","_generateSourcesContent","_file","h","f","d","_","C","A","y","L","decode","value","rest","compareByGeneratedPositionsDeflated","search","computeColumnSpans","lastGeneratedColumn","hasContentsOfAllSources","size","some","urlParse","scheme","path","generatedPositionFor","BasicSourceMapConsumer","constructor","sources","bias","every","add","IndexedSourceMapConsumer","arguments","auth","host","port","splice","urlGenerate","Array","charCodeAt","toSetString","fromSetString","compareByGeneratedPositionsInflated","floor","_array","_set","getOwnPropertyNames","encode","round","random","scriptFile","document","getElementsByTagName","params","query","Params","Pairs","KeyVal","key","unescape","val","parseQuery","src","paramsLength","objectLength","debugSettings","label","labelCSS","successCSS","errorCSS","warningCSS","lightCSS","defaults","apiKey","logId","debug","application","captureConsoleMinimumLevel","extend","extended","deep","merge","prop","getSearchParameters","prmstr","prmarr","tmparr","transformToAssocArray","merge_objects","obj1","obj2","obj3","attrname1","attrname2","sprintfjs","app","re","not_string","not_bool","not_type","not_primitive","number","numeric_arg","json","not_json","text","modulo","placeholder","key_access","index_access","sign","mod","notplaceholder","sprintf","parse_tree","argv","arg","ph","pad","pad_character","pad_length","is_positive","cursor","tree_length","output","keys","param_no","type","Function","parseInt","fromCharCode","NaN","stringify","width","precision","toExponential","toFixed","toPrecision","toLowerCase","valueOf","pad_char","repeat","align","sprintf_format","fmt","_fmt","arg_names","field_list","replacement_field","field_match","SyntaxError","sprintf_parse","vsprintf","apply","Constructor","options","settings","publicAPIs","getPayload","payload","pathname","payload_data","documentMode","innerWidth","documentElement","clientWidth","innerHeight","clientHeight","screen","msOrientation","orientation","mozOrientation","height","colorDepth","data","payload_serverVariables","navigator","language","userAgent","referrer","protocol","hostname","serverVariables","confirmResponse","response","console","log","Date","toLocaleString","stackGPS","xhr","jsonData","errorStack","gps","stackframes","all","sf","resolveOriginal","newFrames","stackFrame","fn","stackString","unshift","detail","sendManualPayload","callback","logType","messageLog","errorLog","api_key","log_id","queryParams","setRequestHeader","onload","statusText","emit","title","severity","queryString","sendPayloadFromConsole","messageTemplate","values","sprintfJS","titleTemplate","manipulateStack","msg","verbose","information","warning","fatal","on","ctx","evtArr","init","lineno","colno","typeOF","typeOFCapitalized","sendPayload","_error","errMessage","_warning","warn","warnMessage","_info","info","infoMessage","_debug","debugMessage"],"mappings":"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","sourcesContent":["/*!\r\n * elmah.io Javascript Logger - version 3.3.0\r\n * (c) 2018 elmah.io, Apache 2.0 License, https://elmah.io\r\n */\r\n\r\n(function (root, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n define([], function () {\r\n return factory(root);\r\n });\r\n } else if (typeof exports === 'object') {\r\n module.exports = factory(root);\r\n } else {\r\n root.Elmahio = factory(root);\r\n }\r\n})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, function (window) {\r\n\r\n 'use strict';\r\n\r\n //\r\n // ==== STACKFRAME ====\r\n //\r\n\r\n var StackFrame = (function () {\r\n \"use strict\";\r\n function _isNumber(n) {\r\n return !isNaN(parseFloat(n)) && isFinite(n);\r\n }\r\n function _capitalize(str) {\r\n return str.charAt(0).toUpperCase() + str.substring(1);\r\n }\r\n function _getter(p) {\r\n return function () {\r\n return this[p];\r\n };\r\n }\r\n var booleanProps = [\"isConstructor\", \"isEval\", \"isNative\", \"isToplevel\"];\r\n var numericProps = [\"columnNumber\", \"lineNumber\"];\r\n var stringProps = [\"fileName\", \"functionName\", \"source\"];\r\n var arrayProps = [\"args\"];\r\n var props = booleanProps.concat(numericProps, stringProps, arrayProps);\r\n function StackFrame(obj) {\r\n if (obj instanceof Object) {\r\n for (var i = 0; i < props.length; i++) {\r\n if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) {\r\n this[\"set\" + _capitalize(props[i])](obj[props[i]]);\r\n }\r\n }\r\n }\r\n }\r\n StackFrame.prototype = {\r\n getArgs: function () {\r\n return this.args;\r\n },\r\n setArgs: function (v) {\r\n if (Object.prototype.toString.call(v) !== \"[object Array]\") {\r\n throw new TypeError(\"Args must be an Array\");\r\n }\r\n this.args = v;\r\n },\r\n getEvalOrigin: function () {\r\n return this.evalOrigin;\r\n },\r\n setEvalOrigin: function (v) {\r\n if (v instanceof StackFrame) {\r\n this.evalOrigin = v;\r\n } else if (v instanceof Object) {\r\n this.evalOrigin = new StackFrame(v);\r\n } else {\r\n throw new TypeError(\"Eval Origin must be an Object or StackFrame\");\r\n }\r\n },\r\n toString: function () {\r\n var functionName = this.getFunctionName() || \"{anonymous}\";\r\n var args = \"(\" + (this.getArgs() || []).join(\",\") + \")\";\r\n var fileName = this.getFileName() ? \"@\" + this.getFileName() : \"\";\r\n var lineNumber = _isNumber(this.getLineNumber()) ? \":\" + this.getLineNumber() : \"\";\r\n var columnNumber = _isNumber(this.getColumnNumber()) ? \":\" + this.getColumnNumber() : \"\";\r\n return functionName + args + fileName + lineNumber + columnNumber;\r\n }\r\n };\r\n StackFrame.fromString = function StackFrame$$fromString(str) {\r\n var argsStartIndex = str.indexOf(\"(\");\r\n var argsEndIndex = str.lastIndexOf(\")\");\r\n var functionName = str.substring(0, argsStartIndex);\r\n var args = str.substring(argsStartIndex + 1, argsEndIndex).split(\",\");\r\n var locationString = str.substring(argsEndIndex + 1);\r\n if (locationString.indexOf(\"@\") === 0) {\r\n var parts = /@(.+?)(?::(\\d+))?(?::(\\d+))?$/.exec(locationString, \"\");\r\n var fileName = parts[1];\r\n var lineNumber = parts[2];\r\n var columnNumber = parts[3];\r\n }\r\n return new StackFrame({\r\n functionName: functionName,\r\n args: args || undefined,\r\n fileName: fileName,\r\n lineNumber: lineNumber || undefined,\r\n columnNumber: columnNumber || undefined\r\n });\r\n };\r\n for (var i = 0; i < booleanProps.length; i++) {\r\n StackFrame.prototype[\"get\" + _capitalize(booleanProps[i])] = _getter(booleanProps[i]);\r\n StackFrame.prototype[\"set\" + _capitalize(booleanProps[i])] = function (p) {\r\n return function (v) {\r\n this[p] = Boolean(v);\r\n };\r\n }(booleanProps[i]);\r\n }\r\n for (var j = 0; j < numericProps.length; j++) {\r\n StackFrame.prototype[\"get\" + _capitalize(numericProps[j])] = _getter(numericProps[j]);\r\n StackFrame.prototype[\"set\" + _capitalize(numericProps[j])] = function (p) {\r\n return function (v) {\r\n if (!_isNumber(v)) {\r\n throw new TypeError(p + \" must be a Number\");\r\n }\r\n this[p] = Number(v);\r\n };\r\n }(numericProps[j]);\r\n }\r\n for (var k = 0; k < stringProps.length; k++) {\r\n StackFrame.prototype[\"get\" + _capitalize(stringProps[k])] = _getter(stringProps[k]);\r\n StackFrame.prototype[\"set\" + _capitalize(stringProps[k])] = function (p) {\r\n return function (v) {\r\n this[p] = String(v);\r\n };\r\n }(stringProps[k]);\r\n }\r\n return StackFrame;\r\n })();\r\n\r\n //\r\n // ==== ERROR STACK PARSER ====\r\n //\r\n\r\n var ErrorStackParser = (function () {\r\n \"use strict\";\r\n var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+\\:\\d+/;\r\n var CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+\\:\\d+|\\(native\\))/m;\r\n var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/;\r\n return {\r\n /**\r\n * Given an Error object, extract the most information from it.\r\n *\r\n * @param {Error} error object\r\n * @return {Array} of StackFrames\r\n */\r\n parse: function ErrorStackParser$$parse(error) {\r\n if (typeof error.stacktrace !== \"undefined\" || typeof error[\"opera#sourceloc\"] !== \"undefined\") {\r\n return this.parseOpera(error);\r\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\r\n return this.parseV8OrIE(error);\r\n } else if (error.stack) {\r\n return this.parseFFOrSafari(error);\r\n } else {\r\n throw new Error(\"Cannot parse given Error object\");\r\n }\r\n },\r\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\r\n extractLocation: function ErrorStackParser$$extractLocation(urlLike) {\r\n // Fail-fast but return locations like \"(native)\"\r\n if (urlLike.indexOf(\":\") === -1) {\r\n return [urlLike];\r\n }\r\n var regExp = /(.+?)(?:\\:(\\d+))?(?:\\:(\\d+))?$/;\r\n var parts = regExp.exec(urlLike.replace(/[\\(\\)]/g, \"\"));\r\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\r\n },\r\n parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !!line.match(CHROME_IE_STACK_REGEXP);\r\n }, this);\r\n return filtered.map(function (line) {\r\n if (line.indexOf(\"(eval \") > -1) {\r\n // Throw away eval information until we implement stacktrace.js/stackframe#8\r\n line = line.replace(/eval code/g, \"eval\").replace(/(\\(eval at [^\\()]*)|(\\)\\,.*$)/g, \"\");\r\n }\r\n var tokens = line.replace(/^\\s+/, \"\").replace(/\\(eval code/g, \"(\").split(/\\s+/).slice(1);\r\n var locationParts = this.extractLocation(tokens.pop());\r\n var functionName = tokens.join(\" \") || undefined;\r\n var fileName = [\"eval\", \"\"].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];\r\n return new StackFrame({\r\n functionName: functionName,\r\n fileName: fileName,\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }, this);\r\n },\r\n parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\r\n }, this);\r\n return filtered.map(function (line) {\r\n // Throw away eval information until we implement stacktrace.js/stackframe#8\r\n if (line.indexOf(\" > eval\") > -1) {\r\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval\\:\\d+\\:\\d+/g, \":$1\");\r\n }\r\n if (line.indexOf(\"@\") === -1 && line.indexOf(\":\") === -1) {\r\n // Safari eval frames only have function names and nothing else\r\n return new StackFrame({\r\n functionName: line\r\n });\r\n } else {\r\n var functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\r\n var matches = line.match(functionNameRegex);\r\n var functionName = matches && matches[1] ? matches[1] : undefined;\r\n var locationParts = this.extractLocation(line.replace(functionNameRegex, \"\"));\r\n return new StackFrame({\r\n functionName: functionName,\r\n fileName: locationParts[0],\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }\r\n }, this);\r\n },\r\n parseOpera: function ErrorStackParser$$parseOpera(e) {\r\n if (!e.stacktrace || e.message.indexOf(\"\\n\") > -1 && e.message.split(\"\\n\").length > e.stacktrace.split(\"\\n\").length) {\r\n return this.parseOpera9(e);\r\n } else if (!e.stack) {\r\n return this.parseOpera10(e);\r\n } else {\r\n return this.parseOpera11(e);\r\n }\r\n },\r\n parseOpera9: function ErrorStackParser$$parseOpera9(e) {\r\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\r\n var lines = e.message.split(\"\\n\");\r\n var result = [];\r\n for (var i = 2, len = lines.length; i < len; i += 2) {\r\n var match = lineRE.exec(lines[i]);\r\n if (match) {\r\n result.push(new StackFrame({\r\n fileName: match[2],\r\n lineNumber: match[1],\r\n source: lines[i]\r\n }));\r\n }\r\n }\r\n return result;\r\n },\r\n parseOpera10: function ErrorStackParser$$parseOpera10(e) {\r\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\r\n var lines = e.stacktrace.split(\"\\n\");\r\n var result = [];\r\n for (var i = 0, len = lines.length; i < len; i += 2) {\r\n var match = lineRE.exec(lines[i]);\r\n if (match) {\r\n result.push(new StackFrame({\r\n functionName: match[3] || undefined,\r\n fileName: match[2],\r\n lineNumber: match[1],\r\n source: lines[i]\r\n }));\r\n }\r\n }\r\n return result;\r\n },\r\n // Opera 10.65+ Error.stack very similar to FF/Safari\r\n parseOpera11: function ErrorStackParser$$parseOpera11(error) {\r\n var filtered = error.stack.split(\"\\n\").filter(function (line) {\r\n return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);\r\n }, this);\r\n return filtered.map(function (line) {\r\n var tokens = line.split(\"@\");\r\n var locationParts = this.extractLocation(tokens.pop());\r\n var functionCall = tokens.shift() || \"\";\r\n var functionName = functionCall.replace(//, \"$2\").replace(/\\([^\\)]*\\)/g, \"\") || undefined;\r\n var argsRaw;\r\n if (functionCall.match(/\\(([^\\)]*)\\)/)) {\r\n argsRaw = functionCall.replace(/^[^\\(]+\\(([^\\)]*)\\)$/, \"$1\");\r\n }\r\n var args = argsRaw === undefined || argsRaw === \"[arguments not available]\" ? undefined : argsRaw.split(\",\");\r\n return new StackFrame({\r\n functionName: functionName,\r\n args: args,\r\n fileName: locationParts[0],\r\n lineNumber: locationParts[1],\r\n columnNumber: locationParts[2],\r\n source: line\r\n });\r\n }, this);\r\n }\r\n };\r\n })();\r\n\r\n //\r\n // ==== STACKTRACE-GPS ====\r\n //\r\n\r\n var SourceMap = function(e){var n={};function r(t){if(n[t])return n[t].exports;var o=n[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}return r.m=e,r.c=n,r.p=\"\",r(0)}([function(e,n,r){var t=r(1),o=r(2),i=r(3).ArraySet,a=r(4),s=r(6).quickSort;function u(e){var n=e;return\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\"))),null!=n.sections?new c(n):new l(n)}function l(e){var n=e;\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\")));var r=t.getArg(n,\"version\"),o=t.getArg(n,\"sources\"),a=t.getArg(n,\"names\",[]),s=t.getArg(n,\"sourceRoot\",null),u=t.getArg(n,\"sourcesContent\",null),l=t.getArg(n,\"mappings\"),g=t.getArg(n,\"file\",null);if(r!=this._version)throw new Error(\"Unsupported version: \"+r);o=o.map(String).map(t.normalize).map(function(e){return s&&t.isAbsolute(s)&&t.isAbsolute(e)?t.relative(s,e):e}),this._names=i.fromArray(a.map(String),!0),this._sources=i.fromArray(o,!0),this.sourceRoot=s,this.sourcesContent=u,this._mappings=l,this.file=g}function g(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function c(e){var n=e;\"string\"==typeof e&&(n=JSON.parse(e.replace(/^\\)\\]\\}'/,\"\")));var r=t.getArg(n,\"version\"),o=t.getArg(n,\"sections\");if(r!=this._version)throw new Error(\"Unsupported version: \"+r);this._sources=new i,this._names=new i;var a={line:-1,column:0};this._sections=o.map(function(e){if(e.url)throw new Error(\"Support for url field in sections not implemented.\");var n=t.getArg(e,\"offset\"),r=t.getArg(n,\"line\"),o=t.getArg(n,\"column\");if(r=0){var s=this._originalMappings[a];if(void 0===e.column)for(var u=s.originalLine;s&&s.originalLine===u;)i.push({line:t.getArg(s,\"generatedLine\",null),column:t.getArg(s,\"generatedColumn\",null),lastColumn:t.getArg(s,\"lastGeneratedColumn\",null)}),s=this._originalMappings[++a];else for(var l=s.originalColumn;s&&s.originalLine===n&&s.originalColumn==l;)i.push({line:t.getArg(s,\"generatedLine\",null),column:t.getArg(s,\"generatedColumn\",null),lastColumn:t.getArg(s,\"lastGeneratedColumn\",null)}),s=this._originalMappings[++a]}return i},n.SourceMapConsumer=u,l.prototype=Object.create(u.prototype),l.prototype.consumer=u,l.fromSourceMap=function(e){var n=Object.create(l.prototype),r=n._names=i.fromArray(e._names.toArray(),!0),o=n._sources=i.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var a=e._mappings.toArray().slice(),u=n.__generatedMappings=[],c=n.__originalMappings=[],p=0,h=a.length;p1&&(r.source=d+i[1],d+=i[1],r.originalLine=h+i[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+i[3],f=r.originalColumn,i.length>4&&(r.name=m+i[4],m+=i[4])),L.push(r),\"number\"==typeof r.originalLine&&y.push(r)}s(L,t.compareByGeneratedPositionsDeflated),this.__generatedMappings=L,s(y,t.compareByOriginalPositions),this.__originalMappings=y},l.prototype._findMapping=function(e,n,r,t,i,a){if(e[r]<=0)throw new TypeError(\"Line must be greater than or equal to 1, got \"+e[r]);if(e[t]<0)throw new TypeError(\"Column must be greater than or equal to 0, got \"+e[t]);return o.search(e,n,i,a)},l.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=t.getArg(o,\"source\",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=t.join(this.sourceRoot,i)));var a=t.getArg(o,\"name\",null);return null!==a&&(a=this._names.at(a)),{source:i,line:t.getArg(o,\"originalLine\",null),column:t.getArg(o,\"originalColumn\",null),name:a}}}return{source:null,line:null,column:null,name:null}},l.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},l.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=t.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=t.urlParse(this.sourceRoot))){var o=e.replace(/^file:\\/\\//,\"\");if(\"file\"==r.scheme&&this._sources.has(o))return this.sourcesContent[this._sources.indexOf(o)];if((!r.path||\"/\"==r.path)&&this._sources.has(\"/\"+e))return this.sourcesContent[this._sources.indexOf(\"/\"+e)]}if(n)return null;throw new Error('\"'+e+'\" is not in the SourceMap.')},l.prototype.generatedPositionFor=function(e){var n=t.getArg(e,\"source\");if(null!=this.sourceRoot&&(n=t.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};var r={source:n=this._sources.indexOf(n),originalLine:t.getArg(e,\"line\"),originalColumn:t.getArg(e,\"column\")},o=this._findMapping(r,this._originalMappings,\"originalLine\",\"originalColumn\",t.compareByOriginalPositions,t.getArg(e,\"bias\",u.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:t.getArg(i,\"generatedLine\",null),column:t.getArg(i,\"generatedColumn\",null),lastColumn:t.getArg(i,\"lastGeneratedColumn\",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=l,c.prototype=Object.create(u.prototype),c.prototype.constructor=u,c.prototype._version=3,Object.defineProperty(c.prototype,\"sources\",{get:function(){for(var e=[],n=0;n=0;g--)\".\"===(a=u[g])?u.splice(g,1):\"..\"===a?l++:l>0&&(\"\"===a?(u.splice(g+1,l),l=0):(u.splice(g,2),l--));return\"\"===(r=u.join(\"/\"))&&(r=s?\"/\":\".\"),t?(t.path=r,i(t)):r}n.urlParse=o,n.urlGenerate=i,n.normalize=a,n.join=function(e,n){\"\"===e&&(e=\".\"),\"\"===n&&(n=\".\");var r=o(n),s=o(e);if(s&&(e=s.path||\"/\"),r&&!r.scheme)return s&&(r.scheme=s.scheme),i(r);if(r||n.match(t))return n;if(s&&!s.host&&!s.path)return s.host=n,i(s);var u=\"/\"===n.charAt(0)?n:a(e.replace(/\\/+$/,\"\")+\"/\"+n);return s?(s.path=u,i(s)):u},n.isAbsolute=function(e){return\"/\"===e.charAt(0)||!!e.match(r)},n.relative=function(e,n){\"\"===e&&(e=\".\"),e=e.replace(/\\/$/,\"\");for(var r=0;0!==n.indexOf(e+\"/\");){var t=e.lastIndexOf(\"/\");if(t<0)return n;if((e=e.slice(0,t)).match(/^([^\\/]+:\\/)?\\/*$/))return n;++r}return Array(r+1).join(\"../\")+n.substr(e.length+1)};var s=!(\"__proto__\"in Object.create(null));function u(e){return e}function l(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function g(e,n){return e===n?0:e>n?1:-1}n.toSetString=s?u:function(e){return l(e)?\"$\"+e:e},n.fromSetString=s?u:function(e){return l(e)?e.slice(1):e},n.compareByOriginalPositions=function(e,n,r){var t=e.source-n.source;return 0!==t?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)||r?t:0!=(t=e.generatedColumn-n.generatedColumn)?t:0!=(t=e.generatedLine-n.generatedLine)?t:e.name-n.name},n.compareByGeneratedPositionsDeflated=function(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:0!=(t=e.generatedColumn-n.generatedColumn)||r?t:0!=(t=e.source-n.source)?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)?t:e.name-n.name},n.compareByGeneratedPositionsInflated=function(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:0!=(r=e.generatedColumn-n.generatedColumn)?r:0!==(r=g(e.source,n.source))?r:0!=(r=e.originalLine-n.originalLine)?r:0!=(r=e.originalColumn-n.originalColumn)?r:g(e.name,n.name)}},function(e,n){n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,r,t,o){if(0===r.length)return-1;var i=function e(r,t,o,i,a,s){var u=Math.floor((t-r)/2)+r,l=a(o,i[u],!0);return 0===l?u:l>0?t-u>1?e(u,t,o,i,a,s):s==n.LEAST_UPPER_BOUND?t1?e(r,u,o,i,a,s):s==n.LEAST_UPPER_BOUND?u:r<0?-1:r}(-1,r.length,e,r,t,o||n.GREATEST_LOWER_BOUND);if(i<0)return-1;for(;i-1>=0&&0===t(r[i],r[i-1],!0);)--i;return i}},function(e,n,r){var t=r(1),o=Object.prototype.hasOwnProperty;function i(){this._array=[],this._set=Object.create(null)}i.fromArray=function(e,n){for(var r=new i,t=0,o=e.length;t=0&&e>>=5)>0&&(n|=32),o+=t.encode(n)}while(i>0);return o},n.decode=function(e,n,r){var o,i,a,s,u=e.length,l=0,g=0;do{if(n>=u)throw new Error(\"Expected more digits in base 64 VLQ value.\");if(-1===(i=t.decode(e.charCodeAt(n++))))throw new Error(\"Invalid base64 digit: \"+e.charAt(n-1));o=!!(32&i),l+=(i&=31)<>1,1==(1&a)?-s:s),r.rest=n}},function(e,n){var r=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");n.encode=function(e){if(0<=e&&e= 200 && req.status < 300 || url.substr(0, 7) === \"file://\" && req.responseText) {\r\n resolve(req.responseText);\r\n } else {\r\n reject(new Error(\"HTTP status: \" + req.status + \" retrieving \" + url));\r\n }\r\n }\r\n };\r\n req.send();\r\n });\r\n }\r\n /**\r\n * Convert a Base64-encoded string into its original representation.\r\n * Used for inline sourcemaps.\r\n *\r\n * @param {String} b64str Base-64 encoded string\r\n * @returns {String} original representation of the base64-encoded string.\r\n */\r\n function _atob(b64str) {\r\n if (typeof window !== \"undefined\" && window.atob) {\r\n return window.atob(b64str);\r\n } else {\r\n throw new Error(\"You must supply a polyfill for window.atob in this environment\");\r\n }\r\n }\r\n function _parseJson(string) {\r\n if (typeof JSON !== \"undefined\" && JSON.parse) {\r\n return JSON.parse(string);\r\n } else {\r\n throw new Error(\"You must supply a polyfill for JSON.parse in this environment\");\r\n }\r\n }\r\n function _findFunctionName(source, lineNumber) {\r\n var syntaxes = [ // {name} = function ({args}) TODO args capture\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*function\\b/, // function {name}({args}) m[1]=name m[2]=args\r\n /function\\s+([^('\"`]*?)\\s*\\(([^)]*)\\)/, // {name} = eval()\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*(?:eval|new Function)\\b/, // fn_name() {\r\n /\\b(?!(?:if|for|switch|while|with|catch)\\b)(?:(?:static)\\s+)?(\\S+)\\s*\\(.*?\\)\\s*\\{/, // {name} = () => {\r\n /['\"]?([$_A-Za-z][$_A-Za-z0-9]*)['\"]?\\s*[:=]\\s*\\(.*?\\)\\s*=>/];\r\n var lines = source.split(\"\\n\");\r\n // Walk backwards in the source lines until we find the line which matches one of the patterns above\r\n var code = \"\";\r\n var maxLines = Math.min(lineNumber, 20);\r\n for (var i = 0; i < maxLines; ++i) {\r\n // lineNo is 1-based, source[] is 0-based\r\n var line = lines[lineNumber - i - 1];\r\n var commentPos = line.indexOf(\"//\");\r\n if (commentPos >= 0) {\r\n line = line.substr(0, commentPos);\r\n }\r\n if (line) {\r\n code = line + code;\r\n var len = syntaxes.length;\r\n for (var index = 0; index < len; index++) {\r\n var m = syntaxes[index].exec(code);\r\n if (m && m[1]) {\r\n return m[1];\r\n }\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n function _ensureSupportedEnvironment() {\r\n if (typeof Object.defineProperty !== \"function\" || typeof Object.create !== \"function\") {\r\n throw new Error(\"Unable to consume source maps in older browsers\");\r\n }\r\n }\r\n function _ensureStackFrameIsLegit(stackframe) {\r\n if (typeof stackframe !== \"object\") {\r\n throw new TypeError(\"Given StackFrame is not an object\");\r\n } else if (typeof stackframe.fileName !== \"string\") {\r\n throw new TypeError(\"Given file name is not a String\");\r\n } else if (typeof stackframe.lineNumber !== \"number\" || stackframe.lineNumber % 1 !== 0 || stackframe.lineNumber < 1) {\r\n throw new TypeError(\"Given line number must be a positive integer\");\r\n } else if (typeof stackframe.columnNumber !== \"number\" || stackframe.columnNumber % 1 !== 0 || stackframe.columnNumber < 0) {\r\n throw new TypeError(\"Given column number must be a non-negative integer\");\r\n }\r\n return true;\r\n }\r\n function _findSourceMappingURL(source) {\r\n var sourceMappingUrlRegExp = /\\/\\/[#@] ?sourceMappingURL=([^\\s'\"]+)\\s*$/gm;\r\n var lastSourceMappingUrl;\r\n var matchSourceMappingUrl;\r\n while (matchSourceMappingUrl = sourceMappingUrlRegExp.exec(source)) {\r\n // jshint ignore:line\r\n lastSourceMappingUrl = matchSourceMappingUrl[1];\r\n }\r\n if (lastSourceMappingUrl) {\r\n return lastSourceMappingUrl;\r\n } else {\r\n throw new Error(\"sourceMappingURL not found\");\r\n }\r\n }\r\n function _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache) {\r\n return new Promise(function (resolve, reject) {\r\n var loc = sourceMapConsumer.originalPositionFor({\r\n line: stackframe.lineNumber,\r\n column: stackframe.columnNumber\r\n });\r\n if (loc.source) {\r\n // cache mapped sources\r\n var mappedSource = sourceMapConsumer.sourceContentFor(loc.source);\r\n if (mappedSource) {\r\n sourceCache[loc.source] = mappedSource;\r\n }\r\n resolve(// given stackframe and source location, update stackframe\r\n new StackFrame({\r\n functionName: loc.name || stackframe.functionName,\r\n args: stackframe.args,\r\n fileName: loc.source,\r\n lineNumber: loc.line,\r\n columnNumber: loc.column\r\n }));\r\n } else {\r\n reject(new Error(\"Could not get original source for given stackframe and source map\"));\r\n }\r\n });\r\n }\r\n /**\r\n * @constructor\r\n * @param {Object} opts\r\n * opts.sourceCache = {url: \"Source String\"} => preload source cache\r\n * opts.sourceMapConsumerCache = {/path/file.js.map: SourceMapConsumer}\r\n * opts.offline = True to prevent network requests.\r\n * Best effort without sources or source maps.\r\n * opts.ajax = Promise returning function to make X-Domain requests\r\n */\r\n return function StackTraceGPS(opts) {\r\n if (!(this instanceof StackTraceGPS)) {\r\n return new StackTraceGPS(opts);\r\n }\r\n opts = opts || {};\r\n this.sourceCache = opts.sourceCache || {};\r\n this.sourceMapConsumerCache = opts.sourceMapConsumerCache || {};\r\n this.ajax = opts.ajax || _xdr;\r\n this._atob = opts.atob || _atob;\r\n\r\n this._get = function _get(location) {\r\n return new Promise(function (resolve, reject) {\r\n var isDataUrl = location.substr(0, 5) === \"data:\";\r\n if (this.sourceCache[location]) {\r\n resolve(this.sourceCache[location]);\r\n } else if (opts.offline && !isDataUrl) {\r\n reject(new Error(\"Cannot make network requests in offline mode\"));\r\n } else {\r\n if (isDataUrl) {\r\n // data URLs can have parameters.\r\n // see http://tools.ietf.org/html/rfc2397\r\n var supportedEncodingRegexp = /^data:application\\/json;([\\w=:\"-]+;)*base64,/;\r\n var match = location.match(supportedEncodingRegexp);\r\n if (match) {\r\n var sourceMapStart = match[0].length;\r\n var encodedSource = location.substr(sourceMapStart);\r\n var source = this._atob(encodedSource);\r\n this.sourceCache[location] = source;\r\n resolve(source);\r\n } else {\r\n reject(new Error(\"The encoding of the inline sourcemap is not supported\"));\r\n }\r\n } else {\r\n var xhrPromise = this.ajax(location, {\r\n method: \"get\"\r\n });\r\n // Cache the Promise to prevent duplicate in-flight requests\r\n this.sourceCache[location] = xhrPromise;\r\n xhrPromise.then(resolve, reject);\r\n }\r\n }\r\n }.bind(this));\r\n };\r\n /**\r\n * Creating SourceMapConsumers is expensive, so this wraps the creation of a\r\n * SourceMapConsumer in a per-instance cache.\r\n *\r\n * @param {String} sourceMappingURL = URL to fetch source map from\r\n * @param {String} defaultSourceRoot = Default source root for source map if undefined\r\n * @returns {Promise} that resolves a SourceMapConsumer\r\n */\r\n this._getSourceMapConsumer = function _getSourceMapConsumer(sourceMappingURL, defaultSourceRoot) {\r\n return new Promise(function (resolve, reject) {\r\n if (this.sourceMapConsumerCache[sourceMappingURL]) {\r\n resolve(this.sourceMapConsumerCache[sourceMappingURL]);\r\n } else {\r\n var sourceMapConsumerPromise = new Promise(function (resolve, reject) {\r\n return this._get(sourceMappingURL).then(function (sourceMapSource) {\r\n if (typeof sourceMapSource === \"string\") {\r\n sourceMapSource = _parseJson(sourceMapSource.replace(/^\\)\\]\\}'/, \"\"));\r\n }\r\n if (typeof sourceMapSource.sourceRoot === \"undefined\") {\r\n sourceMapSource.sourceRoot = defaultSourceRoot;\r\n }\r\n resolve(new SourceMap.SourceMapConsumer(sourceMapSource));\r\n }, reject);\r\n }.bind(this));\r\n this.sourceMapConsumerCache[sourceMappingURL] = sourceMapConsumerPromise;\r\n resolve(sourceMapConsumerPromise);\r\n }\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, enhance function name and use source maps for a\r\n * better StackFrame.\r\n *\r\n * @param {StackFrame} stackframe object\r\n * @returns {Promise} that resolves with with source-mapped StackFrame\r\n */\r\n this.pinpoint = function StackTraceGPS$$pinpoint(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n this.getMappedLocation(stackframe).then(function (mappedStackFrame) {\r\n function resolveMappedStackFrame() {\r\n resolve(mappedStackFrame);\r\n }\r\n this.findFunctionName(mappedStackFrame).then(resolve, resolveMappedStackFrame)[\"catch\"](resolveMappedStackFrame);\r\n }.bind(this), reject);\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, guess function name from location information.\r\n *\r\n * @param {StackFrame} stackframe\r\n * @returns {Promise} that resolves with enhanced StackFrame.\r\n */\r\n this.findFunctionName = function StackTraceGPS$$findFunctionName(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n _ensureStackFrameIsLegit(stackframe);\r\n this._get(stackframe.fileName).then(function getSourceCallback(source) {\r\n var lineNumber = stackframe.lineNumber;\r\n var columnNumber = stackframe.columnNumber;\r\n var guessedFunctionName = _findFunctionName(source, lineNumber, columnNumber);\r\n // Only replace functionName if we found something\r\n if (guessedFunctionName) {\r\n resolve(new StackFrame({\r\n functionName: guessedFunctionName,\r\n args: stackframe.args,\r\n fileName: stackframe.fileName,\r\n lineNumber: lineNumber,\r\n columnNumber: columnNumber\r\n }));\r\n } else {\r\n resolve(stackframe);\r\n }\r\n }, reject)[\"catch\"](reject);\r\n }.bind(this));\r\n };\r\n /**\r\n * Given a StackFrame, seek source-mapped location and return new enhanced StackFrame.\r\n *\r\n * @param {StackFrame} stackframe\r\n * @returns {Promise} that resolves with enhanced StackFrame.\r\n */\r\n this.getMappedLocation = function StackTraceGPS$$getMappedLocation(stackframe) {\r\n return new Promise(function (resolve, reject) {\r\n _ensureSupportedEnvironment();\r\n _ensureStackFrameIsLegit(stackframe);\r\n var sourceCache = this.sourceCache;\r\n var fileName = stackframe.fileName;\r\n this._get(fileName).then(function (source) {\r\n var sourceMappingURL = _findSourceMappingURL(source);\r\n var isDataUrl = sourceMappingURL.substr(0, 5) === \"data:\";\r\n var defaultSourceRoot = fileName.substring(0, fileName.lastIndexOf(\"/\") + 1);\r\n if (sourceMappingURL[0] !== \"/\" && !isDataUrl && !/^https?:\\/\\/|^\\/\\//i.test(sourceMappingURL)) {\r\n sourceMappingURL = defaultSourceRoot + sourceMappingURL;\r\n }\r\n return this._getSourceMapConsumer(sourceMappingURL, defaultSourceRoot).then(function (sourceMapConsumer) {\r\n return _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache).then(resolve)[\"catch\"](function () {\r\n resolve(stackframe);\r\n });\r\n });\r\n }.bind(this), reject)[\"catch\"](reject);\r\n }.bind(this));\r\n };\r\n };\r\n })(SourceMap, StackFrame);\r\n\r\n //\r\n // Shared Variables\r\n //\r\n\r\n var scriptFile = document.getElementsByTagName('script');\r\n var scriptIndex = scriptFile.length - 1;\r\n var myScript = scriptFile[scriptIndex];\r\n var queryString = myScript.src.replace(/^[^\\?]+\\??/, '');\r\n var params = parseQuery(queryString);\r\n var paramsLength = objectLength(params);\r\n\r\n var debugSettings = {\r\n label: ' elmah.io debugger : On ',\r\n labelCSS: 'background: #06a89c; color: #ffffff; display: inline-block; font-size: 14px;',\r\n successCSS: 'background: #d4edda; color: #155724; display: inline-block; font-size: 13px;',\r\n errorCSS: 'background: #f8d7da; color: #721c24; display: inline-block; font-size: 13px;',\r\n warningCSS: 'background: #fff3cd; color: #856404; display: inline-block; font-size: 13px;',\r\n lightCSS: 'background: #e2e3e5; color: #383d41; display: inline-block; font-size: 13px;'\r\n };\r\n\r\n var defaults = {\r\n apiKey: null,\r\n logId: null,\r\n debug: false,\r\n application: null,\r\n filter: null,\r\n captureConsoleMinimumLevel: 'none'\r\n };\r\n\r\n //\r\n // Shared Methods\r\n //\r\n\r\n var extend = function () {\r\n\r\n // Variables\r\n var extended = {};\r\n var deep = false;\r\n var i = 0;\r\n\r\n // Check if a deep merge\r\n if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') {\r\n deep = arguments[0];\r\n i++;\r\n }\r\n\r\n // Merge the object into the extended object\r\n var merge = function (obj) {\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n // If property is an object, merge properties\r\n if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') {\r\n extended[prop] = extend(extended[prop], obj[prop]);\r\n } else {\r\n extended[prop] = obj[prop];\r\n }\r\n }\r\n }\r\n };\r\n\r\n // Loop through each object and conduct a merge\r\n for (; i < arguments.length; i++) {\r\n var obj = arguments[i];\r\n merge(obj);\r\n }\r\n\r\n return extended;\r\n\r\n };\r\n\r\n //\r\n // Helpers\r\n //\r\n\r\n function parseQuery(query) {\r\n var Params = new Object();\r\n if (!query) return Params; // return empty object\r\n var Pairs = query.split(/[;&]/);\r\n for (var i = 0; i < Pairs.length; i++) {\r\n var KeyVal = Pairs[i].split('=');\r\n if (!KeyVal || KeyVal.length !== 2) continue;\r\n var key = unescape(KeyVal[0]);\r\n var val = unescape(KeyVal[1]);\r\n val = val.replace(/\\+/g, ' ');\r\n Params[key] = val;\r\n }\r\n return Params;\r\n }\r\n\r\n function objectLength(obj) {\r\n var size = 0, key;\r\n for (key in obj) {\r\n if (obj.hasOwnProperty(key)) size++;\r\n }\r\n return size;\r\n };\r\n\r\n function getSearchParameters() {\r\n var prmstr = window.location.search.substr(1);\r\n return prmstr !== null && prmstr !== \"\" ? transformToAssocArray(prmstr) : {};\r\n }\r\n\r\n function transformToAssocArray(prmstr) {\r\n var params = [];\r\n var prmarr = prmstr.split(\"&\");\r\n for (var i = 0; i < prmarr.length; i++) {\r\n var tmparr = prmarr[i].split(\"=\");\r\n params.push({\r\n 'key': tmparr[0],\r\n 'value': tmparr[1]\r\n });\r\n }\r\n return params;\r\n }\r\n\r\n function merge_objects(obj1, obj2) {\r\n var obj3 = {};\r\n for (var attrname1 in obj1) {\r\n obj3[attrname1] = obj1[attrname1];\r\n }\r\n for (var attrname2 in obj2) {\r\n obj3[attrname2] = obj2[attrname2];\r\n }\r\n\r\n return obj3;\r\n }\r\n\r\n // sprintf-js\r\n var sprintfjs = function() {\r\n 'use strict'\r\n var app = {};\r\n var re = {\r\n not_string: /[^s]/,\r\n not_bool: /[^t]/,\r\n not_type: /[^T]/,\r\n not_primitive: /[^v]/,\r\n number: /[diefg]/,\r\n numeric_arg: /[bcdiefguxX]/,\r\n json: /[j]/,\r\n not_json: /[^j]/,\r\n text: /^[^\\x25]+/,\r\n modulo: /^\\x25{2}/,\r\n placeholder: /^\\x25(?:([1-9]\\d*)\\$|\\(([^)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-gijostTuvxX])/,\r\n key: /^([a-z_][a-z_\\d]*)/i,\r\n key_access: /^\\.([a-z_][a-z_\\d]*)/i,\r\n index_access: /^\\[(\\d+)\\]/,\r\n sign: /^[+-]/,\r\n mod: /^\\x25\\s/,\r\n notplaceholder: /^\\x25?([^b-gijostTuvxX])/\r\n }\r\n\r\n function sprintf(key) {\r\n // `arguments` is not an array, but should be fine for this call\r\n return sprintf_format(sprintf_parse(key), arguments)\r\n }\r\n\r\n function vsprintf(fmt, argv) {\r\n return sprintf.apply(null, [fmt].concat(argv || []))\r\n }\r\n\r\n function sprintf_format(parse_tree, argv) {\r\n var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign;\r\n for (i = 0; i < tree_length; i++) {\r\n if (typeof parse_tree[i] === 'string') {\r\n output += parse_tree[i]\r\n }\r\n else if (typeof parse_tree[i] === 'object') {\r\n ph = parse_tree[i]; // placeholder\r\n if (ph.keys) { // keyword argument\r\n arg = argv[cursor]\r\n for (k = 0; k < ph.keys.length; k++) {\r\n if (arg == undefined) {\r\n throw new Error(sprintf('[sprintf] Cannot access property \"%s\" of undefined value \"%s\"', ph.keys[k], ph.keys[k-1]))\r\n }\r\n arg = arg[ph.keys[k]]\r\n }\r\n }\r\n else if (ph.param_no) { // positional argument (explicit)\r\n arg = argv[ph.param_no]\r\n }\r\n else { // positional argument (implicit)\r\n arg = argv[cursor++]\r\n }\r\n\r\n if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) {\r\n arg = arg()\r\n }\r\n\r\n if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg) && arg === undefined)) { // treat %_d as string if it has no argument\r\n arg = ph.placeholder;\r\n ph.type = \"s\";\r\n }\r\n\r\n if (re.number.test(ph.type)) {\r\n is_positive = typeof arg === \"string\" ? true : arg >= 0\r\n }\r\n\r\n switch (ph.type) {\r\n case 'b':\r\n arg = parseInt(arg, 10).toString(2)\r\n break\r\n case 'c':\r\n arg = String.fromCharCode(parseInt(arg, 10))\r\n break\r\n case 'd':\r\n case 'i':\r\n arg = typeof arg === \"number\" ? parseInt(arg, 10) : NaN\r\n break\r\n case 'j':\r\n arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0)\r\n break\r\n case 'e':\r\n arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential()\r\n break\r\n case 'f':\r\n arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg)\r\n break\r\n case 'g':\r\n arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg)\r\n break\r\n case 'o':\r\n arg = (parseInt(arg, 10) >>> 0).toString(8)\r\n break\r\n case 's':\r\n arg = String(arg)\r\n arg = arg === \"undefined\" ? ph.placeholder : (ph.precision ? arg.substring(0, ph.precision) : arg)\r\n break\r\n case 't':\r\n arg = String(!!arg)\r\n arg = (ph.precision ? arg.substring(0, ph.precision) : arg)\r\n break\r\n case 'T':\r\n arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase()\r\n arg = (ph.precision ? arg.substring(0, ph.precision) : arg)\r\n break\r\n case 'u':\r\n arg = parseInt(arg, 10) >>> 0\r\n break\r\n case 'v':\r\n arg = arg.valueOf()\r\n arg = (ph.precision ? arg.substring(0, ph.precision) : arg)\r\n break\r\n case 'x':\r\n arg = (parseInt(arg, 10) >>> 0).toString(16)\r\n break\r\n case 'X':\r\n arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase()\r\n break\r\n }\r\n if (re.json.test(ph.type)) {\r\n output += arg\r\n }\r\n else {\r\n if (re.number.test(ph.type) && (!is_positive || ph.sign)) {\r\n sign = is_positive ? '+' : '-'\r\n arg = arg.toString().replace(re.sign, '')\r\n }\r\n else {\r\n sign = ''\r\n }\r\n pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' '\r\n pad_length = ph.width - (sign + arg).length\r\n pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : ''\r\n output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg)\r\n }\r\n }\r\n }\r\n return output\r\n }\r\n\r\n var sprintf_cache = Object.create(null)\r\n\r\n function sprintf_parse(fmt) {\r\n var _fmt = fmt, match, parse_tree = [], arg_names = 0;\r\n while (_fmt) {\r\n if ((match = re.text.exec(_fmt)) !== null) {\r\n parse_tree.push(match[0]);\r\n }\r\n else if ((match = re.modulo.exec(_fmt)) !== null) {\r\n parse_tree.push('%');\r\n }\r\n else if ((match = re.placeholder.exec(_fmt)) !== null) {\r\n if (match[2]) {\r\n arg_names |= 1\r\n var field_list = [], replacement_field = match[2], field_match = []\r\n if ((field_match = re.key.exec(replacement_field)) !== null) {\r\n field_list.push(field_match[1])\r\n while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {\r\n if ((field_match = re.key_access.exec(replacement_field)) !== null) {\r\n field_list.push(field_match[1])\r\n }\r\n else if ((field_match = re.index_access.exec(replacement_field)) !== null) {\r\n field_list.push(field_match[1])\r\n }\r\n else {\r\n throw new SyntaxError('[sprintf] failed to parse named argument key')\r\n }\r\n }\r\n }\r\n else {\r\n throw new SyntaxError('[sprintf] failed to parse named argument key')\r\n }\r\n match[2] = field_list\r\n }\r\n else {\r\n arg_names |= 2\r\n }\r\n if (arg_names === 3) {\r\n throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported')\r\n }\r\n\r\n parse_tree.push(\r\n {\r\n placeholder: match[0],\r\n param_no: match[1],\r\n keys: match[2],\r\n sign: match[3],\r\n pad_char: match[4],\r\n align: match[5],\r\n width: match[6],\r\n precision: match[7],\r\n type: match[8]\r\n }\r\n )\r\n }\r\n else if ((match = re.mod.exec(_fmt)) !== null) { // treat %_SPACE as a string\r\n parse_tree.push(match[0]);\r\n }\r\n else if ((match = re.notplaceholder.exec(_fmt)) !== null) { // treat %_NOTPLACEHOLDER as a string\r\n parse_tree.push(match[0]);\r\n }\r\n else {\r\n throw new SyntaxError('[sprintf] unexpected placeholder')\r\n }\r\n _fmt = _fmt.substring(match[0].length)\r\n }\r\n return parse_tree\r\n }\r\n\r\n app.sprintf = sprintf;\r\n app.vsprintf = vsprintf;\r\n return app;\r\n }\r\n\r\n //\r\n // Constructor\r\n // Can be named anything you want\r\n //\r\n\r\n var Constructor = function (options) {\r\n\r\n //\r\n // Unique Variables\r\n //\r\n\r\n var publicAPIs = {};\r\n var settings;\r\n\r\n function getPayload() {\r\n var payload = {\r\n \"url\": document.location.pathname || '/',\r\n \"application\": settings.application\r\n };\r\n\r\n var payload_data = [];\r\n\r\n if (document.documentMode) payload_data.push({ \"key\": \"Document-Mode\", \"value\": document.documentMode });\r\n if (window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth) payload_data.push({ \"key\": \"Browser-Width\", \"value\": window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth });\r\n if (window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight) payload_data.push({ \"key\": \"Browser-Height\", \"value\": window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight });\r\n if ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type) !== undefined) payload_data.push({ \"key\": \"Screen-Orientation\", \"value\": ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type).split(\"-\"))[0] });\r\n if (screen.width) payload_data.push({ \"key\": \"Screen-Width\", \"value\": screen.width });\r\n if (screen.height) payload_data.push({ \"key\": \"Screen-Height\", \"value\": screen.height });\r\n if (screen.colorDepth) payload_data.push({ \"key\": \"Color-Depth\", \"value\": screen.colorDepth });\r\n payload_data.push({ \"key\": \"X-ELMAHIO-SEARCH-isClientside\", \"value\": \"true\" });\r\n\r\n payload.data = payload_data;\r\n\r\n var payload_serverVariables = [];\r\n if (navigator.language) payload_serverVariables.push({ \"key\": \"User-Language\", \"value\": navigator.language });\r\n if (navigator.userAgent) payload_serverVariables.push({ \"key\": \"User-Agent\", \"value\": navigator.userAgent });\r\n if (document.referrer) payload_serverVariables.push({ \"key\": \"Referer\", \"value\": document.referrer });\r\n if (document.location.protocol === \"https:\") payload_serverVariables.push({ \"key\": \"HTTPS\", \"value\": 'on' });\r\n if (document.location.hostname) payload_serverVariables.push({ \"key\": \"Host\", \"value\": document.location.hostname });\r\n\r\n payload.serverVariables = payload_serverVariables;\r\n\r\n return payload;\r\n }\r\n\r\n function confirmResponse(status, response) {\r\n if (settings.debug) {\r\n if (status === 'error') {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2715 Not created ', debugSettings.lightCSS, debugSettings.errorCSS);\r\n } else if (status === 'success') {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2714 ' + response + ' at ' + new Date().toLocaleString() + ' ', debugSettings.lightCSS, debugSettings.successCSS);\r\n } else {\r\n console.log('%c \\u2BC8 Error log: ' + '%c \\u2715 Not created. Title should not be undefined, null or empty ! ', debugSettings.lightCSS, debugSettings.errorCSS);\r\n }\r\n }\r\n }\r\n\r\n function stackGPS(error, xhr, jsonData) {\r\n \tvar errorStack = error.toString().split(\"\\n\")[0];\r\n \tvar gps = new StackTraceGPS();\r\n var promise = new Promise(function(resolve) {\r\n\t var stackframes = ErrorStackParser.parse(error);\r\n\t resolve(Promise.all(stackframes.map(function(sf) {\r\n\t return new Promise(function(resolve) {\r\n\t function resolveOriginal() {\r\n\t resolve(sf);\r\n\t }\r\n\t gps.pinpoint(sf).then(resolve, resolveOriginal)['catch'](resolveOriginal);\r\n\t });\r\n\t })));\r\n \t}\r\n );\r\n\r\n promise.then(function(newFrames){\r\n \tnewFrames.forEach(function(stackFrame, i){\r\n\t\t\t\t\tif(stackFrame.functionName) {\r\n \t\t\tvar fn = stackFrame.functionName + ' ';\r\n \t\t} else {\r\n \t\t\tvar fn = '';\r\n \t\t}\r\n \t\tvar stackString = ' at ' + fn + '(' + stackFrame.fileName + ':' + stackFrame.lineNumber + ':' + stackFrame.columnNumber + ')';\r\n \t\tnewFrames[i] = stackString;\r\n \t});\r\n \tnewFrames.unshift(errorStack);\r\n \tjsonData.detail = newFrames.join(\"\\n\");\r\n \txhr.send(JSON.stringify(jsonData));\r\n });\r\n }\r\n\r\n function stackString(error) {\r\n \tvar typeOF = typeof error.error;\r\n \tvar typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1);\r\n\r\n \treturn typeOFCapitalized + ': ' + error.error + '\\n' + ' at ' + '(' + error.source + ':' + error.lineno + ':' + error.colno + ')';\r\n }\r\n\r\n // Private methods\r\n\r\n var sendPayload = function (apiKey, logId, callback, errorLog) {\r\n\r\n var api_key = apiKey,\r\n log_id = logId,\r\n error = errorLog,\r\n send = 1,\r\n queryParams = getSearchParameters(),\r\n stack = error.error && objectLength(error.error.stack) !== 0 && typeof error.error === \"object\" ? ErrorStackParser.parse(error.error) : '';\r\n\r\n // Ignoring error from an external script\r\n if (error && error.colno === 0 && error.lineno === 0 && (!stack || stack === '') && error.message && (error.message === \"Script error.\" || error.message === \"Script error\")) {\r\n\t\t\t if (settings.debug) {\r\n\t\t\t console.log('%c \\u2BC8 Error log: ' + '%c \\uD83D\\uDEC8 Ignoring error from external script ', debugSettings.lightCSS, debugSettings.warningCSS);\r\n\t\t\t }\r\n\t\t\t return;\r\n\t\t\t}\r\n\r\n if ((api_key !== null && log_id !== null) || (paramsLength === 2)) {\r\n\r\n // Priority for parameters\r\n if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n api_key = params['apiKey'];\r\n log_id = params['logId'];\r\n }\r\n\r\n // get new XHR object\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://api.elmah.io/v3/messages/\" + log_id + \"?api_key=\" + api_key, true);\r\n\r\n xhr.setRequestHeader('Content-type', 'application/json');\r\n\r\n xhr.onload = function (e) {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 201) {\r\n callback('success', xhr.statusText);\r\n }\r\n }\r\n };\r\n\r\n xhr.onerror = function (e) {\r\n callback('error', xhr.statusText);\r\n\r\n // on error event\r\n publicAPIs.emit('error', xhr.status, xhr.statusText);\r\n }\r\n\r\n var jsonData = {\r\n \"detail\": error.error ? error.error.stack : null,\r\n \"title\": error.message || 'Unspecified error',\r\n \"source\": stack && stack.length > 0 ? stack[0].fileName : null,\r\n \"severity\": \"Error\",\r\n \"type\": error.error ? error.error.name : null,\r\n \"queryString\": JSON.parse(JSON.stringify(queryParams))\r\n };\r\n\r\n // Check if error sent is a string and not an object\r\n // Then create the articifial stacktrace and pass source & type of the error\r\n if(error.error && (objectLength(error.error.stack) === 0) && typeof jsonData.detail === \"undefined\") {\r\n \tvar typeOF = typeof errorLog.error;\r\n \t\t\tvar typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1);\r\n\r\n \tjsonData.detail = stackString(errorLog);\r\n \tjsonData.source = errorLog.source;\r\n jsonData.title = \"Uncaught \" + typeOFCapitalized + \": \" + errorLog.error;\r\n }\r\n\r\n // Add payload to jsonData\r\n jsonData = merge_objects(jsonData, getPayload());\r\n\r\n // filter callback\r\n if (settings.filter !== null) {\r\n if (settings.filter(jsonData)) {\r\n send = 0;\r\n }\r\n }\r\n\r\n if (send === 1) {\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n\r\n if (error.error && typeof error.error === \"object\" && objectLength(error.error.stack) !== 0 && typeof Promise !== \"undefined\" && Promise.toString().indexOf(\"[native code]\") !== -1) {\r\n \t// send message trying to pinpoint stackframes\r\n \tstackGPS(error.error, xhr, jsonData);\r\n\t } else {\r\n\t \t// send message\r\n \txhr.send(JSON.stringify(jsonData));\r\n\t }\r\n }\r\n\r\n } else {\r\n return console.log('Login api error');\r\n }\r\n };\r\n\r\n var sendManualPayload = function (apiKey, logId, callback, logType, messageLog, errorLog) {\r\n var api_key = apiKey,\r\n log_id = logId,\r\n type = logType,\r\n error = errorLog,\r\n message = messageLog,\r\n send = 1,\r\n queryParams = getSearchParameters();\r\n\r\n if ((api_key !== null && log_id !== null) || (paramsLength === 2)) {\r\n\r\n // Priority for parameters\r\n if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n api_key = params['apiKey'];\r\n log_id = params['logId'];\r\n }\r\n\r\n // get new XHR object\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://api.elmah.io/v3/messages/\" + log_id + \"?api_key=\" + api_key, true);\r\n xhr.setRequestHeader('Content-type', 'application/json');\r\n\r\n xhr.onload = function (e) {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 201) {\r\n callback('success', xhr.statusText);\r\n }\r\n }\r\n };\r\n\r\n xhr.onerror = function (e) {\r\n callback('error', xhr.statusText);\r\n\r\n // on error event\r\n publicAPIs.emit('error', xhr.status, xhr.statusText);\r\n }\r\n\r\n if (type !== \"Log\") {\r\n\r\n var stack = error ? ErrorStackParser.parse(error) : null;\r\n\r\n var jsonData = {\r\n \"title\": message,\r\n \"source\": stack && stack.length > 0 ? stack[0].fileName : null,\r\n \"detail\": error ? error.stack : null,\r\n \"severity\": type,\r\n \"type\": error ? error.name : null,\r\n \"queryString\": JSON.parse(JSON.stringify(queryParams))\r\n };\r\n\r\n // Add payload to jsonData\r\n jsonData = merge_objects(jsonData, getPayload());\r\n\r\n } else {\r\n\r\n jsonData = error;\r\n\r\n }\r\n\r\n // filter callback\r\n if (settings.filter !== null) {\r\n if (settings.filter(jsonData)) {\r\n send = 0;\r\n }\r\n }\r\n\r\n if (send === 1) {\r\n if (jsonData.title) {\r\n\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n\r\n if (error && type !== \"Log\" && typeof Promise !== \"undefined\" && Promise.toString().indexOf(\"[native code]\") !== -1) {\r\n\t \t\t\t\t\t// send message trying to pinpoint stackframes\r\n \t\tstackGPS(error, xhr, jsonData);\r\n\t\t } else {\r\n\t\t \t// send message\r\n\t \txhr.send(JSON.stringify(jsonData));\r\n\t\t }\r\n\r\n } else {\r\n callback('missing-title', xhr.statusText);\r\n }\r\n }\r\n\r\n } else {\r\n return console.log('Login api error');\r\n }\r\n };\r\n\r\n var sendPayloadFromConsole = function (apiKey, logId, callback, logType, errorLog) {\r\n var api_key = apiKey,\r\n log_id = logId,\r\n message = errorLog.message,\r\n messageTemplate = errorLog.message,\r\n type = logType,\r\n args = Object.values(errorLog.arguments),\r\n send = 1,\r\n queryParams = getSearchParameters();\r\n\r\n // If message has placeholders (%s or %d), check for arguments and replace them\r\n \tif(String(message).match(/(%d|%s)+/ig) && args.length > 1) {\r\n \t\tvar sprintfJS = new sprintfjs();\r\n // Remove the first argument from array, which represents the message\r\n \t\targs.shift();\r\n message = sprintfJS.vsprintf(message, args);\r\n }\r\n\r\n if(typeof message !== \"string\"){\r\n message = message.toString();\r\n }\r\n\r\n if(typeof messageTemplate !== \"string\") {\r\n messageTemplate = messageTemplate.toString();\r\n }\r\n\r\n if ((api_key !== null && log_id !== null) || (paramsLength === 2)) {\r\n\r\n // Priority for parameters\r\n if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n api_key = params['apiKey'];\r\n log_id = params['logId'];\r\n }\r\n\r\n // get new XHR object\r\n var xhr = new XMLHttpRequest();\r\n xhr.open(\"POST\", \"https://api.elmah.io/v3/messages/\" + log_id + \"?api_key=\" + api_key, true);\r\n xhr.setRequestHeader('Content-type', 'application/json');\r\n\r\n xhr.onload = function (e) {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 201) {\r\n callback('success', xhr.statusText);\r\n }\r\n }\r\n };\r\n\r\n xhr.onerror = function (e) {\r\n callback('error', xhr.statusText);\r\n // on error event\r\n publicAPIs.emit('error', xhr.status, xhr.statusText);\r\n }\r\n\r\n function manipulateStack (errorStack, severity, message) {\r\n var stack = [];\r\n for (var i = 0; i < errorStack.length; i++) {\r\n if(errorStack[i] === \"Error\") {\r\n stack.push(severity + \": \" + message);\r\n }\r\n if(!errorStack[i].match(/elmahio.js|elmahio.min.js/g) && errorStack[i] !== \"Error\") {\r\n stack.push(errorStack[i]);\r\n }\r\n }\r\n return stack.join('\\n');\r\n }\r\n\r\n var jsonData = {\r\n \"title\": message,\r\n \"titleTemplate\": messageTemplate,\r\n \"detail\": manipulateStack(new Error().stack.split('\\n'), type, message),\r\n \"severity\": type,\r\n \"type\": null,\r\n \"queryString\": JSON.parse(JSON.stringify(queryParams))\r\n };\r\n\r\n // Add payload to jsonData\r\n jsonData = merge_objects(jsonData, getPayload());\r\n\r\n // filter callback\r\n if (settings.filter !== null) {\r\n if (settings.filter(jsonData)) {\r\n send = 0;\r\n }\r\n }\r\n\r\n if (send === 1) {\r\n if (jsonData.title) {\r\n // on message event\r\n publicAPIs.emit('message', jsonData);\r\n // send message\r\n xhr.send(JSON.stringify(jsonData));\r\n } else {\r\n callback('missing-title', xhr.statusText);\r\n }\r\n }\r\n\r\n } else {\r\n return console.log('Login api error');\r\n }\r\n };\r\n\r\n // Some public methods\r\n\r\n publicAPIs.error = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg);\r\n };\r\n publicAPIs.error = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg, error);\r\n };\r\n\r\n publicAPIs.verbose = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg);\r\n };\r\n publicAPIs.verbose = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg, error);\r\n };\r\n\r\n publicAPIs.debug = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg);\r\n };\r\n publicAPIs.debug = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg, error);\r\n };\r\n\r\n publicAPIs.information = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg);\r\n };\r\n publicAPIs.information = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg, error);\r\n };\r\n\r\n publicAPIs.warning = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg);\r\n };\r\n publicAPIs.warning = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg, error);\r\n };\r\n\r\n publicAPIs.fatal = function (msg) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg);\r\n };\r\n publicAPIs.fatal = function (msg, error) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg, error);\r\n };\r\n\r\n publicAPIs.log = function (obj) {\r\n sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Log', null, obj);\r\n };\r\n\r\n publicAPIs.message = function() {\r\n return getPayload();\r\n };\r\n\r\n publicAPIs.on = function (name, callback, ctx) {\r\n var e = this.e || (this.e = {});\r\n\r\n (e[name] || (e[name] = [])).push({\r\n fn: callback,\r\n ctx: ctx\r\n });\r\n\r\n return this;\r\n };\r\n\r\n publicAPIs.emit = function (name) {\r\n var data = [].slice.call(arguments, 1);\r\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\r\n var i = 0;\r\n var len = evtArr.length;\r\n\r\n for (i; i < len; i++) {\r\n evtArr[i].fn.apply(evtArr[i].ctx, data);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n publicAPIs.init = function (options) {\r\n\r\n // -- Merge options into defaults\r\n settings = extend(defaults, options || {});\r\n\r\n // -- Log on window error\r\n window.onerror = function (message, source, lineno, colno, error) {\r\n\r\n var errorLog = {\r\n 'message': message,\r\n 'source': source,\r\n 'lineno': lineno,\r\n 'colno': colno,\r\n 'error': error\r\n }\r\n\r\n sendPayload(settings.apiKey, settings.logId, confirmResponse, errorLog);\r\n\r\n return false;\r\n }\r\n\r\n // -- Overriding console methods\r\n // -- Then log messages into the app.elmah.io\r\n if(options.captureConsoleMinimumLevel !== \"none\") {\r\n\r\n // If captureConsoleMinimumLevel: info or debug is set (error, warn)\r\n if(options.captureConsoleMinimumLevel === \"info\" || options.captureConsoleMinimumLevel === \"warn\" || options.captureConsoleMinimumLevel === \"error\" || options.captureConsoleMinimumLevel === \"debug\") {\r\n // Log console errors\r\n var _error = console.error;\r\n console.error = function(errMessage){\r\n var errorLog = {\r\n \t\t'message': errMessage,\r\n \t\t'arguments': arguments\r\n \t}\r\n sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Error', errorLog);\r\n _error.apply(console, arguments);\r\n };\r\n if(options.captureConsoleMinimumLevel !== \"error\") {\r\n // Log console warnings\r\n var _warning = console.warn;\r\n console.warn = function(warnMessage){\r\n var errorLog = {\r\n 'message': warnMessage,\r\n 'arguments': arguments\r\n }\r\n sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Warning', errorLog);\r\n _warning.apply(console, arguments);\r\n };\r\n }\r\n }\r\n if(options.captureConsoleMinimumLevel === \"info\" || options.captureConsoleMinimumLevel === \"debug\") {\r\n // Log console info\r\n var _info = console.info;\r\n console.info = function(infoMessage){\r\n var errorLog = {\r\n \t\t'message': infoMessage,\r\n \t\t'arguments': arguments\r\n \t}\r\n sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Information', errorLog);\r\n _info.apply(console, arguments);\r\n };\r\n }\r\n if(options.captureConsoleMinimumLevel === \"debug\") {\r\n // Log console debug\r\n var _debug = console.debug;\r\n console.debug = function(debugMessage){\r\n var errorLog = {\r\n \t\t'message': debugMessage,\r\n \t\t'arguments': arguments\r\n \t}\r\n sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Debug', errorLog);\r\n _debug.apply(console, arguments);\r\n };\r\n }\r\n }\r\n };\r\n\r\n // Initialize the plugin\r\n publicAPIs.init(options);\r\n\r\n if (settings.debug) {\r\n console.log('%c' + debugSettings.label, debugSettings.labelCSS);\r\n }\r\n\r\n // Return the public APIs\r\n return publicAPIs;\r\n\r\n };\r\n\r\n\r\n //\r\n // Return the constructor\r\n //\r\n\r\n if (paramsLength && params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) {\r\n // Immediately-Invoked Function Expression (IIFE)\r\n return new Constructor;\r\n } else {\r\n // UMD Constructor\r\n return Constructor;\r\n }\r\n\r\n});\r\n"],"file":"elmahio.min.js"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3c00ba3..bd744b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "elmah.io.javascript", - "version": "3.2.0", + "version": "3.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 59bbf0d..3629aa9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "elmah.io.javascript", "description": "elmah.io javascript logger.", - "version": "3.2.0", + "version": "3.3.0", "repository": "https://github.com/elmahio/elmah.io.javascript", "license": "Apache-2.0", "main": "dist/elmahio.js", diff --git a/src/elmahio.js b/src/elmahio.js index 2f0b62c..c902cb7 100644 --- a/src/elmahio.js +++ b/src/elmahio.js @@ -1,1140 +1,1491 @@ -/*! - * elmah.io Javascript Logger - version 3.2.0 - * (c) 2018-2020 elmah.io, Apache 2.0 License, https://elmah.io - */ - -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - define([], function () { - return factory(root); - }); - } else if (typeof exports === 'object') { - module.exports = factory(root); - } else { - root.Elmahio = factory(root); - } -})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, function (window) { - - 'use strict'; - - // - // ==== STACKFRAME ==== - // - - var StackFrame = (function () { - "use strict"; - function _isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - function _capitalize(str) { - return str.charAt(0).toUpperCase() + str.substring(1); - } - function _getter(p) { - return function () { - return this[p]; - }; - } - var booleanProps = ["isConstructor", "isEval", "isNative", "isToplevel"]; - var numericProps = ["columnNumber", "lineNumber"]; - var stringProps = ["fileName", "functionName", "source"]; - var arrayProps = ["args"]; - var props = booleanProps.concat(numericProps, stringProps, arrayProps); - function StackFrame(obj) { - if (obj instanceof Object) { - for (var i = 0; i < props.length; i++) { - if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) { - this["set" + _capitalize(props[i])](obj[props[i]]); - } - } - } - } - StackFrame.prototype = { - getArgs: function () { - return this.args; - }, - setArgs: function (v) { - if (Object.prototype.toString.call(v) !== "[object Array]") { - throw new TypeError("Args must be an Array"); - } - this.args = v; - }, - getEvalOrigin: function () { - return this.evalOrigin; - }, - setEvalOrigin: function (v) { - if (v instanceof StackFrame) { - this.evalOrigin = v; - } else if (v instanceof Object) { - this.evalOrigin = new StackFrame(v); - } else { - throw new TypeError("Eval Origin must be an Object or StackFrame"); - } - }, - toString: function () { - var functionName = this.getFunctionName() || "{anonymous}"; - var args = "(" + (this.getArgs() || []).join(",") + ")"; - var fileName = this.getFileName() ? "@" + this.getFileName() : ""; - var lineNumber = _isNumber(this.getLineNumber()) ? ":" + this.getLineNumber() : ""; - var columnNumber = _isNumber(this.getColumnNumber()) ? ":" + this.getColumnNumber() : ""; - return functionName + args + fileName + lineNumber + columnNumber; - } - }; - StackFrame.fromString = function StackFrame$$fromString(str) { - var argsStartIndex = str.indexOf("("); - var argsEndIndex = str.lastIndexOf(")"); - var functionName = str.substring(0, argsStartIndex); - var args = str.substring(argsStartIndex + 1, argsEndIndex).split(","); - var locationString = str.substring(argsEndIndex + 1); - if (locationString.indexOf("@") === 0) { - var parts = /@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(locationString, ""); - var fileName = parts[1]; - var lineNumber = parts[2]; - var columnNumber = parts[3]; - } - return new StackFrame({ - functionName: functionName, - args: args || undefined, - fileName: fileName, - lineNumber: lineNumber || undefined, - columnNumber: columnNumber || undefined - }); - }; - for (var i = 0; i < booleanProps.length; i++) { - StackFrame.prototype["get" + _capitalize(booleanProps[i])] = _getter(booleanProps[i]); - StackFrame.prototype["set" + _capitalize(booleanProps[i])] = function (p) { - return function (v) { - this[p] = Boolean(v); - }; - }(booleanProps[i]); - } - for (var j = 0; j < numericProps.length; j++) { - StackFrame.prototype["get" + _capitalize(numericProps[j])] = _getter(numericProps[j]); - StackFrame.prototype["set" + _capitalize(numericProps[j])] = function (p) { - return function (v) { - if (!_isNumber(v)) { - throw new TypeError(p + " must be a Number"); - } - this[p] = Number(v); - }; - }(numericProps[j]); - } - for (var k = 0; k < stringProps.length; k++) { - StackFrame.prototype["get" + _capitalize(stringProps[k])] = _getter(stringProps[k]); - StackFrame.prototype["set" + _capitalize(stringProps[k])] = function (p) { - return function (v) { - this[p] = String(v); - }; - }(stringProps[k]); - } - return StackFrame; - })(); - - // - // ==== ERROR STACK PARSER ==== - // - - var ErrorStackParser = (function () { - "use strict"; - var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\S+\:\d+/; - var CHROME_IE_STACK_REGEXP = /^\s*at .*(\S+\:\d+|\(native\))/m; - var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\[native code\])?$/; - return { - /** - * Given an Error object, extract the most information from it. - * - * @param {Error} error object - * @return {Array} of StackFrames - */ - parse: function ErrorStackParser$$parse(error) { - if (typeof error.stacktrace !== "undefined" || typeof error["opera#sourceloc"] !== "undefined") { - return this.parseOpera(error); - } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) { - return this.parseV8OrIE(error); - } else if (error.stack) { - return this.parseFFOrSafari(error); - } else { - throw new Error("Cannot parse given Error object"); - } - }, - // Separate line and column numbers from a string of the form: (URI:Line:Column) - extractLocation: function ErrorStackParser$$extractLocation(urlLike) { - // Fail-fast but return locations like "(native)" - if (urlLike.indexOf(":") === -1) { - return [urlLike]; - } - var regExp = /(.+?)(?:\:(\d+))?(?:\:(\d+))?$/; - var parts = regExp.exec(urlLike.replace(/[\(\)]/g, "")); - return [parts[1], parts[2] || undefined, parts[3] || undefined]; - }, - parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) { - var filtered = error.stack.split("\n").filter(function (line) { - return !!line.match(CHROME_IE_STACK_REGEXP); - }, this); - return filtered.map(function (line) { - if (line.indexOf("(eval ") > -1) { - // Throw away eval information until we implement stacktrace.js/stackframe#8 - line = line.replace(/eval code/g, "eval").replace(/(\(eval at [^\()]*)|(\)\,.*$)/g, ""); - } - var tokens = line.replace(/^\s+/, "").replace(/\(eval code/g, "(").split(/\s+/).slice(1); - var locationParts = this.extractLocation(tokens.pop()); - var functionName = tokens.join(" ") || undefined; - var fileName = ["eval", ""].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0]; - return new StackFrame({ - functionName: functionName, - fileName: fileName, - lineNumber: locationParts[1], - columnNumber: locationParts[2], - source: line - }); - }, this); - }, - parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) { - var filtered = error.stack.split("\n").filter(function (line) { - return !line.match(SAFARI_NATIVE_CODE_REGEXP); - }, this); - return filtered.map(function (line) { - // Throw away eval information until we implement stacktrace.js/stackframe#8 - if (line.indexOf(" > eval") > -1) { - line = line.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g, ":$1"); - } - if (line.indexOf("@") === -1 && line.indexOf(":") === -1) { - // Safari eval frames only have function names and nothing else - return new StackFrame({ - functionName: line - }); - } else { - var functionNameRegex = /((.*".+"[^@]*)?[^@]*)(?:@)/; - var matches = line.match(functionNameRegex); - var functionName = matches && matches[1] ? matches[1] : undefined; - var locationParts = this.extractLocation(line.replace(functionNameRegex, "")); - return new StackFrame({ - functionName: functionName, - fileName: locationParts[0], - lineNumber: locationParts[1], - columnNumber: locationParts[2], - source: line - }); - } - }, this); - }, - parseOpera: function ErrorStackParser$$parseOpera(e) { - if (!e.stacktrace || e.message.indexOf("\n") > -1 && e.message.split("\n").length > e.stacktrace.split("\n").length) { - return this.parseOpera9(e); - } else if (!e.stack) { - return this.parseOpera10(e); - } else { - return this.parseOpera11(e); - } - }, - parseOpera9: function ErrorStackParser$$parseOpera9(e) { - var lineRE = /Line (\d+).*script (?:in )?(\S+)/i; - var lines = e.message.split("\n"); - var result = []; - for (var i = 2, len = lines.length; i < len; i += 2) { - var match = lineRE.exec(lines[i]); - if (match) { - result.push(new StackFrame({ - fileName: match[2], - lineNumber: match[1], - source: lines[i] - })); - } - } - return result; - }, - parseOpera10: function ErrorStackParser$$parseOpera10(e) { - var lineRE = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i; - var lines = e.stacktrace.split("\n"); - var result = []; - for (var i = 0, len = lines.length; i < len; i += 2) { - var match = lineRE.exec(lines[i]); - if (match) { - result.push(new StackFrame({ - functionName: match[3] || undefined, - fileName: match[2], - lineNumber: match[1], - source: lines[i] - })); - } - } - return result; - }, - // Opera 10.65+ Error.stack very similar to FF/Safari - parseOpera11: function ErrorStackParser$$parseOpera11(error) { - var filtered = error.stack.split("\n").filter(function (line) { - return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/); - }, this); - return filtered.map(function (line) { - var tokens = line.split("@"); - var locationParts = this.extractLocation(tokens.pop()); - var functionCall = tokens.shift() || ""; - var functionName = functionCall.replace(//, "$2").replace(/\([^\)]*\)/g, "") || undefined; - var argsRaw; - if (functionCall.match(/\(([^\)]*)\)/)) { - argsRaw = functionCall.replace(/^[^\(]+\(([^\)]*)\)$/, "$1"); - } - var args = argsRaw === undefined || argsRaw === "[arguments not available]" ? undefined : argsRaw.split(","); - return new StackFrame({ - functionName: functionName, - args: args, - fileName: locationParts[0], - lineNumber: locationParts[1], - columnNumber: locationParts[2], - source: line - }); - }, this); - } - }; - })(); - - // - // ==== STACKTRACE-GPS ==== - // - - var SourceMap = function(e){var n={};function r(t){if(n[t])return n[t].exports;var o=n[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}return r.m=e,r.c=n,r.p="",r(0)}([function(e,n,r){var t=r(1),o=r(2),i=r(3).ArraySet,a=r(4),s=r(6).quickSort;function u(e){var n=e;return"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,""))),null!=n.sections?new c(n):new l(n)}function l(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=t.getArg(n,"version"),o=t.getArg(n,"sources"),a=t.getArg(n,"names",[]),s=t.getArg(n,"sourceRoot",null),u=t.getArg(n,"sourcesContent",null),l=t.getArg(n,"mappings"),g=t.getArg(n,"file",null);if(r!=this._version)throw new Error("Unsupported version: "+r);o=o.map(String).map(t.normalize).map(function(e){return s&&t.isAbsolute(s)&&t.isAbsolute(e)?t.relative(s,e):e}),this._names=i.fromArray(a.map(String),!0),this._sources=i.fromArray(o,!0),this.sourceRoot=s,this.sourcesContent=u,this._mappings=l,this.file=g}function g(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function c(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=t.getArg(n,"version"),o=t.getArg(n,"sections");if(r!=this._version)throw new Error("Unsupported version: "+r);this._sources=new i,this._names=new i;var a={line:-1,column:0};this._sections=o.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var n=t.getArg(e,"offset"),r=t.getArg(n,"line"),o=t.getArg(n,"column");if(r=0){var s=this._originalMappings[a];if(void 0===e.column)for(var u=s.originalLine;s&&s.originalLine===u;)i.push({line:t.getArg(s,"generatedLine",null),column:t.getArg(s,"generatedColumn",null),lastColumn:t.getArg(s,"lastGeneratedColumn",null)}),s=this._originalMappings[++a];else for(var l=s.originalColumn;s&&s.originalLine===n&&s.originalColumn==l;)i.push({line:t.getArg(s,"generatedLine",null),column:t.getArg(s,"generatedColumn",null),lastColumn:t.getArg(s,"lastGeneratedColumn",null)}),s=this._originalMappings[++a]}return i},n.SourceMapConsumer=u,l.prototype=Object.create(u.prototype),l.prototype.consumer=u,l.fromSourceMap=function(e){var n=Object.create(l.prototype),r=n._names=i.fromArray(e._names.toArray(),!0),o=n._sources=i.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var a=e._mappings.toArray().slice(),u=n.__generatedMappings=[],c=n.__originalMappings=[],p=0,h=a.length;p1&&(r.source=d+i[1],d+=i[1],r.originalLine=h+i[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+i[3],f=r.originalColumn,i.length>4&&(r.name=m+i[4],m+=i[4])),L.push(r),"number"==typeof r.originalLine&&y.push(r)}s(L,t.compareByGeneratedPositionsDeflated),this.__generatedMappings=L,s(y,t.compareByOriginalPositions),this.__originalMappings=y},l.prototype._findMapping=function(e,n,r,t,i,a){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return o.search(e,n,i,a)},l.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=t.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=t.join(this.sourceRoot,i)));var a=t.getArg(o,"name",null);return null!==a&&(a=this._names.at(a)),{source:i,line:t.getArg(o,"originalLine",null),column:t.getArg(o,"originalColumn",null),name:a}}}return{source:null,line:null,column:null,name:null}},l.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},l.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=t.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=t.urlParse(this.sourceRoot))){var o=e.replace(/^file:\/\//,"");if("file"==r.scheme&&this._sources.has(o))return this.sourcesContent[this._sources.indexOf(o)];if((!r.path||"/"==r.path)&&this._sources.has("/"+e))return this.sourcesContent[this._sources.indexOf("/"+e)]}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},l.prototype.generatedPositionFor=function(e){var n=t.getArg(e,"source");if(null!=this.sourceRoot&&(n=t.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};var r={source:n=this._sources.indexOf(n),originalLine:t.getArg(e,"line"),originalColumn:t.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",t.compareByOriginalPositions,t.getArg(e,"bias",u.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:t.getArg(i,"generatedLine",null),column:t.getArg(i,"generatedColumn",null),lastColumn:t.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=l,c.prototype=Object.create(u.prototype),c.prototype.constructor=u,c.prototype._version=3,Object.defineProperty(c.prototype,"sources",{get:function(){for(var e=[],n=0;n=0;g--)"."===(a=u[g])?u.splice(g,1):".."===a?l++:l>0&&(""===a?(u.splice(g+1,l),l=0):(u.splice(g,2),l--));return""===(r=u.join("/"))&&(r=s?"/":"."),t?(t.path=r,i(t)):r}n.urlParse=o,n.urlGenerate=i,n.normalize=a,n.join=function(e,n){""===e&&(e="."),""===n&&(n=".");var r=o(n),s=o(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),i(r);if(r||n.match(t))return n;if(s&&!s.host&&!s.path)return s.host=n,i(s);var u="/"===n.charAt(0)?n:a(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=u,i(s)):u},n.isAbsolute=function(e){return"/"===e.charAt(0)||!!e.match(r)},n.relative=function(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if((e=e.slice(0,t)).match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)};var s=!("__proto__"in Object.create(null));function u(e){return e}function l(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function g(e,n){return e===n?0:e>n?1:-1}n.toSetString=s?u:function(e){return l(e)?"$"+e:e},n.fromSetString=s?u:function(e){return l(e)?e.slice(1):e},n.compareByOriginalPositions=function(e,n,r){var t=e.source-n.source;return 0!==t?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)||r?t:0!=(t=e.generatedColumn-n.generatedColumn)?t:0!=(t=e.generatedLine-n.generatedLine)?t:e.name-n.name},n.compareByGeneratedPositionsDeflated=function(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:0!=(t=e.generatedColumn-n.generatedColumn)||r?t:0!=(t=e.source-n.source)?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)?t:e.name-n.name},n.compareByGeneratedPositionsInflated=function(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:0!=(r=e.generatedColumn-n.generatedColumn)?r:0!==(r=g(e.source,n.source))?r:0!=(r=e.originalLine-n.originalLine)?r:0!=(r=e.originalColumn-n.originalColumn)?r:g(e.name,n.name)}},function(e,n){n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,r,t,o){if(0===r.length)return-1;var i=function e(r,t,o,i,a,s){var u=Math.floor((t-r)/2)+r,l=a(o,i[u],!0);return 0===l?u:l>0?t-u>1?e(u,t,o,i,a,s):s==n.LEAST_UPPER_BOUND?t1?e(r,u,o,i,a,s):s==n.LEAST_UPPER_BOUND?u:r<0?-1:r}(-1,r.length,e,r,t,o||n.GREATEST_LOWER_BOUND);if(i<0)return-1;for(;i-1>=0&&0===t(r[i],r[i-1],!0);)--i;return i}},function(e,n,r){var t=r(1),o=Object.prototype.hasOwnProperty;function i(){this._array=[],this._set=Object.create(null)}i.fromArray=function(e,n){for(var r=new i,t=0,o=e.length;t=0&&e>>=5)>0&&(n|=32),o+=t.encode(n)}while(i>0);return o},n.decode=function(e,n,r){var o,i,a,s,u=e.length,l=0,g=0;do{if(n>=u)throw new Error("Expected more digits in base 64 VLQ value.");if(-1===(i=t.decode(e.charCodeAt(n++))))throw new Error("Invalid base64 digit: "+e.charAt(n-1));o=!!(32&i),l+=(i&=31)<>1,1==(1&a)?-s:s),r.rest=n}},function(e,n){var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");n.encode=function(e){if(0<=e&&e= 200 && req.status < 300 || url.substr(0, 7) === "file://" && req.responseText) { - resolve(req.responseText); - } else { - reject(new Error("HTTP status: " + req.status + " retrieving " + url)); - } - } - }; - req.send(); - }); - } - /** - * Convert a Base64-encoded string into its original representation. - * Used for inline sourcemaps. - * - * @param {String} b64str Base-64 encoded string - * @returns {String} original representation of the base64-encoded string. - */ - function _atob(b64str) { - if (typeof window !== "undefined" && window.atob) { - return window.atob(b64str); - } else { - throw new Error("You must supply a polyfill for window.atob in this environment"); - } - } - function _parseJson(string) { - if (typeof JSON !== "undefined" && JSON.parse) { - return JSON.parse(string); - } else { - throw new Error("You must supply a polyfill for JSON.parse in this environment"); - } - } - function _findFunctionName(source, lineNumber) { - var syntaxes = [ // {name} = function ({args}) TODO args capture - /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*function\b/, // function {name}({args}) m[1]=name m[2]=args - /function\s+([^('"`]*?)\s*\(([^)]*)\)/, // {name} = eval() - /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*(?:eval|new Function)\b/, // fn_name() { - /\b(?!(?:if|for|switch|while|with|catch)\b)(?:(?:static)\s+)?(\S+)\s*\(.*?\)\s*\{/, // {name} = () => { - /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*\(.*?\)\s*=>/]; - var lines = source.split("\n"); - // Walk backwards in the source lines until we find the line which matches one of the patterns above - var code = ""; - var maxLines = Math.min(lineNumber, 20); - for (var i = 0; i < maxLines; ++i) { - // lineNo is 1-based, source[] is 0-based - var line = lines[lineNumber - i - 1]; - var commentPos = line.indexOf("//"); - if (commentPos >= 0) { - line = line.substr(0, commentPos); - } - if (line) { - code = line + code; - var len = syntaxes.length; - for (var index = 0; index < len; index++) { - var m = syntaxes[index].exec(code); - if (m && m[1]) { - return m[1]; - } - } - } - } - return undefined; - } - function _ensureSupportedEnvironment() { - if (typeof Object.defineProperty !== "function" || typeof Object.create !== "function") { - throw new Error("Unable to consume source maps in older browsers"); - } - } - function _ensureStackFrameIsLegit(stackframe) { - if (typeof stackframe !== "object") { - throw new TypeError("Given StackFrame is not an object"); - } else if (typeof stackframe.fileName !== "string") { - throw new TypeError("Given file name is not a String"); - } else if (typeof stackframe.lineNumber !== "number" || stackframe.lineNumber % 1 !== 0 || stackframe.lineNumber < 1) { - throw new TypeError("Given line number must be a positive integer"); - } else if (typeof stackframe.columnNumber !== "number" || stackframe.columnNumber % 1 !== 0 || stackframe.columnNumber < 0) { - throw new TypeError("Given column number must be a non-negative integer"); - } - return true; - } - function _findSourceMappingURL(source) { - var sourceMappingUrlRegExp = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/gm; - var lastSourceMappingUrl; - var matchSourceMappingUrl; - while (matchSourceMappingUrl = sourceMappingUrlRegExp.exec(source)) { - // jshint ignore:line - lastSourceMappingUrl = matchSourceMappingUrl[1]; - } - if (lastSourceMappingUrl) { - return lastSourceMappingUrl; - } else { - throw new Error("sourceMappingURL not found"); - } - } - function _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache) { - return new Promise(function (resolve, reject) { - var loc = sourceMapConsumer.originalPositionFor({ - line: stackframe.lineNumber, - column: stackframe.columnNumber - }); - if (loc.source) { - // cache mapped sources - var mappedSource = sourceMapConsumer.sourceContentFor(loc.source); - if (mappedSource) { - sourceCache[loc.source] = mappedSource; - } - resolve(// given stackframe and source location, update stackframe - new StackFrame({ - functionName: loc.name || stackframe.functionName, - args: stackframe.args, - fileName: loc.source, - lineNumber: loc.line, - columnNumber: loc.column - })); - } else { - reject(new Error("Could not get original source for given stackframe and source map")); - } - }); - } - /** - * @constructor - * @param {Object} opts - * opts.sourceCache = {url: "Source String"} => preload source cache - * opts.sourceMapConsumerCache = {/path/file.js.map: SourceMapConsumer} - * opts.offline = True to prevent network requests. - * Best effort without sources or source maps. - * opts.ajax = Promise returning function to make X-Domain requests - */ - return function StackTraceGPS(opts) { - if (!(this instanceof StackTraceGPS)) { - return new StackTraceGPS(opts); - } - opts = opts || {}; - this.sourceCache = opts.sourceCache || {}; - this.sourceMapConsumerCache = opts.sourceMapConsumerCache || {}; - this.ajax = opts.ajax || _xdr; - this._atob = opts.atob || _atob; - - this._get = function _get(location) { - return new Promise(function (resolve, reject) { - var isDataUrl = location.substr(0, 5) === "data:"; - if (this.sourceCache[location]) { - resolve(this.sourceCache[location]); - } else if (opts.offline && !isDataUrl) { - reject(new Error("Cannot make network requests in offline mode")); - } else { - if (isDataUrl) { - // data URLs can have parameters. - // see http://tools.ietf.org/html/rfc2397 - var supportedEncodingRegexp = /^data:application\/json;([\w=:"-]+;)*base64,/; - var match = location.match(supportedEncodingRegexp); - if (match) { - var sourceMapStart = match[0].length; - var encodedSource = location.substr(sourceMapStart); - var source = this._atob(encodedSource); - this.sourceCache[location] = source; - resolve(source); - } else { - reject(new Error("The encoding of the inline sourcemap is not supported")); - } - } else { - var xhrPromise = this.ajax(location, { - method: "get" - }); - // Cache the Promise to prevent duplicate in-flight requests - this.sourceCache[location] = xhrPromise; - xhrPromise.then(resolve, reject); - } - } - }.bind(this)); - }; - /** - * Creating SourceMapConsumers is expensive, so this wraps the creation of a - * SourceMapConsumer in a per-instance cache. - * - * @param {String} sourceMappingURL = URL to fetch source map from - * @param {String} defaultSourceRoot = Default source root for source map if undefined - * @returns {Promise} that resolves a SourceMapConsumer - */ - this._getSourceMapConsumer = function _getSourceMapConsumer(sourceMappingURL, defaultSourceRoot) { - return new Promise(function (resolve, reject) { - if (this.sourceMapConsumerCache[sourceMappingURL]) { - resolve(this.sourceMapConsumerCache[sourceMappingURL]); - } else { - var sourceMapConsumerPromise = new Promise(function (resolve, reject) { - return this._get(sourceMappingURL).then(function (sourceMapSource) { - if (typeof sourceMapSource === "string") { - sourceMapSource = _parseJson(sourceMapSource.replace(/^\)\]\}'/, "")); - } - if (typeof sourceMapSource.sourceRoot === "undefined") { - sourceMapSource.sourceRoot = defaultSourceRoot; - } - resolve(new SourceMap.SourceMapConsumer(sourceMapSource)); - }, reject); - }.bind(this)); - this.sourceMapConsumerCache[sourceMappingURL] = sourceMapConsumerPromise; - resolve(sourceMapConsumerPromise); - } - }.bind(this)); - }; - /** - * Given a StackFrame, enhance function name and use source maps for a - * better StackFrame. - * - * @param {StackFrame} stackframe object - * @returns {Promise} that resolves with with source-mapped StackFrame - */ - this.pinpoint = function StackTraceGPS$$pinpoint(stackframe) { - return new Promise(function (resolve, reject) { - this.getMappedLocation(stackframe).then(function (mappedStackFrame) { - function resolveMappedStackFrame() { - resolve(mappedStackFrame); - } - this.findFunctionName(mappedStackFrame).then(resolve, resolveMappedStackFrame)["catch"](resolveMappedStackFrame); - }.bind(this), reject); - }.bind(this)); - }; - /** - * Given a StackFrame, guess function name from location information. - * - * @param {StackFrame} stackframe - * @returns {Promise} that resolves with enhanced StackFrame. - */ - this.findFunctionName = function StackTraceGPS$$findFunctionName(stackframe) { - return new Promise(function (resolve, reject) { - _ensureStackFrameIsLegit(stackframe); - this._get(stackframe.fileName).then(function getSourceCallback(source) { - var lineNumber = stackframe.lineNumber; - var columnNumber = stackframe.columnNumber; - var guessedFunctionName = _findFunctionName(source, lineNumber, columnNumber); - // Only replace functionName if we found something - if (guessedFunctionName) { - resolve(new StackFrame({ - functionName: guessedFunctionName, - args: stackframe.args, - fileName: stackframe.fileName, - lineNumber: lineNumber, - columnNumber: columnNumber - })); - } else { - resolve(stackframe); - } - }, reject)["catch"](reject); - }.bind(this)); - }; - /** - * Given a StackFrame, seek source-mapped location and return new enhanced StackFrame. - * - * @param {StackFrame} stackframe - * @returns {Promise} that resolves with enhanced StackFrame. - */ - this.getMappedLocation = function StackTraceGPS$$getMappedLocation(stackframe) { - return new Promise(function (resolve, reject) { - _ensureSupportedEnvironment(); - _ensureStackFrameIsLegit(stackframe); - var sourceCache = this.sourceCache; - var fileName = stackframe.fileName; - this._get(fileName).then(function (source) { - var sourceMappingURL = _findSourceMappingURL(source); - var isDataUrl = sourceMappingURL.substr(0, 5) === "data:"; - var defaultSourceRoot = fileName.substring(0, fileName.lastIndexOf("/") + 1); - if (sourceMappingURL[0] !== "/" && !isDataUrl && !/^https?:\/\/|^\/\//i.test(sourceMappingURL)) { - sourceMappingURL = defaultSourceRoot + sourceMappingURL; - } - return this._getSourceMapConsumer(sourceMappingURL, defaultSourceRoot).then(function (sourceMapConsumer) { - return _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache).then(resolve)["catch"](function () { - resolve(stackframe); - }); - }); - }.bind(this), reject)["catch"](reject); - }.bind(this)); - }; - }; - })(SourceMap, StackFrame); - - // - // Shared Variables - // - - var scriptFile = document.getElementsByTagName('script'); - var scriptIndex = scriptFile.length - 1; - var myScript = scriptFile[scriptIndex]; - var queryString = myScript.src.replace(/^[^\?]+\??/, ''); - var params = parseQuery(queryString); - var paramsLength = objectLength(params); - - var debugSettings = { - label: ' elmah.io debugger : On ', - labelCSS: 'background: #06a89c; color: #ffffff; display: inline-block; font-size: 14px;', - successCSS: 'background: #d4edda; color: #155724; display: inline-block; font-size: 13px;', - errorCSS: 'background: #f8d7da; color: #721c24; display: inline-block; font-size: 13px;', - warningCSS: 'background: #fff3cd; color: #856404; display: inline-block; font-size: 13px;', - lightCSS: 'background: #e2e3e5; color: #383d41; display: inline-block; font-size: 13px;' - }; - - var defaults = { - apiKey: null, - logId: null, - debug: false, - application: null, - filter: null - }; - - // - // Shared Methods - // - - var extend = function () { - - // Variables - var extended = {}; - var deep = false; - var i = 0; - - // Check if a deep merge - if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') { - deep = arguments[0]; - i++; - } - - // Merge the object into the extended object - var merge = function (obj) { - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - // If property is an object, merge properties - if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') { - extended[prop] = extend(extended[prop], obj[prop]); - } else { - extended[prop] = obj[prop]; - } - } - } - }; - - // Loop through each object and conduct a merge - for (; i < arguments.length; i++) { - var obj = arguments[i]; - merge(obj); - } - - return extended; - - }; - - // - // Helpers - // - - function parseQuery(query) { - var Params = new Object(); - if (!query) return Params; // return empty object - var Pairs = query.split(/[;&]/); - for (var i = 0; i < Pairs.length; i++) { - var KeyVal = Pairs[i].split('='); - if (!KeyVal || KeyVal.length !== 2) continue; - var key = unescape(KeyVal[0]); - var val = unescape(KeyVal[1]); - val = val.replace(/\+/g, ' '); - Params[key] = val; - } - return Params; - } - - function objectLength(obj) { - var size = 0, key; - for (key in obj) { - if (obj.hasOwnProperty(key)) size++; - } - return size; - }; - - function getSearchParameters() { - var prmstr = window.location.search.substr(1); - return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {}; - } - - function transformToAssocArray(prmstr) { - var params = []; - var prmarr = prmstr.split("&"); - for (var i = 0; i < prmarr.length; i++) { - var tmparr = prmarr[i].split("="); - params.push({ - 'key': tmparr[0], - 'value': tmparr[1] - }); - } - return params; - } - - function merge_objects(obj1, obj2) { - var obj3 = {}; - for (var attrname1 in obj1) { - obj3[attrname1] = obj1[attrname1]; - } - for (var attrname2 in obj2) { - obj3[attrname2] = obj2[attrname2]; - } - - return obj3; - } - - // - // Constructor - // Can be named anything you want - // - - var Constructor = function (options) { - - // - // Unique Variables - // - - var publicAPIs = {}; - var settings; - - function getPayload() { - var payload = { - "url": document.location.pathname || '/', - "application": settings.application - }; - - var payload_data = []; - - if (document.documentMode) payload_data.push({ "key": "Document-Mode", "value": document.documentMode }); - if (window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth) payload_data.push({ "key": "Browser-Width", "value": window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth }); - if (window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight) payload_data.push({ "key": "Browser-Height", "value": window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight }); - if ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type) !== undefined) payload_data.push({ "key": "Screen-Orientation", "value": ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type).split("-"))[0] }); - if (screen.width) payload_data.push({ "key": "Screen-Width", "value": screen.width }); - if (screen.height) payload_data.push({ "key": "Screen-Height", "value": screen.height }); - if (screen.colorDepth) payload_data.push({ "key": "Color-Depth", "value": screen.colorDepth }); - payload_data.push({ "key": "X-ELMAHIO-SEARCH-isClientside", "value": "true" }); - - payload.data = payload_data; - - var payload_serverVariables = []; - if (navigator.language) payload_serverVariables.push({ "key": "User-Language", "value": navigator.language }); - if (navigator.userAgent) payload_serverVariables.push({ "key": "User-Agent", "value": navigator.userAgent }); - if (document.referrer) payload_serverVariables.push({ "key": "Referer", "value": document.referrer }); - if (document.location.protocol === "https:") payload_serverVariables.push({ "key": "HTTPS", "value": 'on' }); - if (document.location.hostname) payload_serverVariables.push({ "key": "Host", "value": document.location.hostname }); - - payload.serverVariables = payload_serverVariables; - - return payload; - } - - function confirmResponse(status, response) { - if (settings.debug) { - if (status === 'error') { - console.log('%c \u2BC8 Error log: ' + '%c \u2715 Not created ', debugSettings.lightCSS, debugSettings.errorCSS); - } else if (status === 'success') { - console.log('%c \u2BC8 Error log: ' + '%c \u2714 ' + response + ' at ' + new Date().toLocaleString() + ' ', debugSettings.lightCSS, debugSettings.successCSS); - } else { - console.log('%c \u2BC8 Error log: ' + '%c \u2715 Not created. Title should not be undefined, null or empty ! ', debugSettings.lightCSS, debugSettings.errorCSS); - } - } - } - - function stackGPS(error, xhr, jsonData) { - var errorStack = error.toString().split("\n")[0]; - var gps = new StackTraceGPS(); - var promise = new Promise(function(resolve) { - var stackframes = ErrorStackParser.parse(error); - resolve(Promise.all(stackframes.map(function(sf) { - return new Promise(function(resolve) { - function resolveOriginal() { - resolve(sf); - } - gps.pinpoint(sf).then(resolve, resolveOriginal)['catch'](resolveOriginal); - }); - }))); - } - ); - - promise.then(function(newFrames){ - newFrames.forEach(function(stackFrame, i){ - if(stackFrame.functionName) { - var fn = stackFrame.functionName + ' '; - } else { - var fn = ''; - } - var stackString = ' at ' + fn + '(' + stackFrame.fileName + ':' + stackFrame.lineNumber + ':' + stackFrame.columnNumber + ')'; - newFrames[i] = stackString; - }); - newFrames.unshift(errorStack); - jsonData.detail = newFrames.join("\n"); - - // on message event - publicAPIs.emit('message', jsonData); - - xhr.send(JSON.stringify(jsonData)); - }); - } - - function stackString(error) { - var typeOF = typeof error.error; - var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1); - - return typeOFCapitalized + ': ' + error.error + '\n' + ' at ' + '(' + error.source + ':' + error.lineno + ':' + error.colno + ')'; - } - - // Private methods - - var sendPayload = function (apiKey, logId, callback, errorLog) { - - var api_key = apiKey, - log_id = logId, - error = errorLog, - send = 1, - queryParams = getSearchParameters(), - stack = error.error && objectLength(error.error.stack) !== 0 && typeof error.error === "object" ? ErrorStackParser.parse(error.error) : ''; - - // Ignoring error from an external script - if (error && error.colno === 0 && error.lineno === 0 && (!stack || stack === '') && error.message && (error.message === "Script error." || error.message === "Script error")) { - if (settings.debug) { - console.log('%c \u2BC8 Error log: ' + '%c \uD83D\uDEC8 Ignoring error from external script ', debugSettings.lightCSS, debugSettings.warningCSS); - } - return; - } - - if ((api_key !== null && log_id !== null) || (paramsLength === 2)) { - - // Priority for parameters - if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { - api_key = params['apiKey']; - log_id = params['logId']; - } - - // get new XHR object - var xhr = new XMLHttpRequest(); - xhr.open("POST", "https://api.elmah.io/v3/messages/" + log_id + "?api_key=" + api_key, true); - - xhr.setRequestHeader('Content-type', 'application/json'); - - xhr.onload = function (e) { - if (xhr.readyState === 4) { - if (xhr.status === 201) { - callback('success', xhr.statusText); - } - } - }; - - xhr.onerror = function (e) { - callback('error', xhr.statusText); - - // on error event - publicAPIs.emit('error', xhr.status, xhr.statusText); - } - - var jsonData = { - "detail": error.error ? error.error.stack : null, - "title": error.message || 'Unspecified error', - "source": stack && stack.length > 0 ? stack[0].fileName : null, - "severity": "Error", - "type": error.error ? error.error.name : null, - "queryString": JSON.parse(JSON.stringify(queryParams)) - }; - - // Check if error sent is a string and not an object - // Then create the articifial stacktrace and pass source & type of the error - if(error.error && (objectLength(error.error.stack) === 0) && typeof jsonData.detail === "undefined") { - var typeOF = typeof errorLog.error; - var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1); - - jsonData.detail = stackString(errorLog); - jsonData.source = errorLog.source; - jsonData.title = "Uncaught " + typeOFCapitalized + ": " + errorLog.error; - } - - // Add payload to jsonData - jsonData = merge_objects(jsonData, getPayload()); - - // filter callback - if (settings.filter !== null) { - if (settings.filter(jsonData)) { - send = 0; - } - } - - if (send === 1) { - - if (error.error && typeof error.error === "object" && objectLength(error.error.stack) !== 0 && typeof Promise !== "undefined" && Promise.toString().indexOf("[native code]") !== -1) { - // send message trying to pinpoint stackframes - stackGPS(error.error, xhr, jsonData); - } else { - // on message event - publicAPIs.emit('message', jsonData); - - // send message - xhr.send(JSON.stringify(jsonData)); - } - } - - } else { - return console.log('Login api error'); - } - }; - - var sendManualPayload = function (apiKey, logId, callback, logType, messageLog, errorLog) { - var api_key = apiKey, - log_id = logId, - type = logType, - error = errorLog, - message = messageLog, - send = 1, - queryParams = getSearchParameters(); - - if ((api_key !== null && log_id !== null) || (paramsLength === 2)) { - - // Priority for parameters - if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { - api_key = params['apiKey']; - log_id = params['logId']; - } - - // get new XHR object - var xhr = new XMLHttpRequest(); - xhr.open("POST", "https://api.elmah.io/v3/messages/" + log_id + "?api_key=" + api_key, true); - xhr.setRequestHeader('Content-type', 'application/json'); - - xhr.onload = function (e) { - if (xhr.readyState === 4) { - if (xhr.status === 201) { - callback('success', xhr.statusText); - } - } - }; - - xhr.onerror = function (e) { - callback('error', xhr.statusText); - - // on error event - publicAPIs.emit('error', xhr.status, xhr.statusText); - } - - if (type !== "Log") { - - var stack = error ? ErrorStackParser.parse(error) : null; - - var jsonData = { - "title": message, - "source": stack && stack.length > 0 ? stack[0].fileName : null, - "detail": error ? error.stack : null, - "severity": type, - "type": error ? error.name : null, - "queryString": JSON.parse(JSON.stringify(queryParams)) - }; - - // Add payload to jsonData - jsonData = merge_objects(jsonData, getPayload()); - - } else { - - jsonData = error; - - } - - // filter callback - if (settings.filter !== null) { - if (settings.filter(jsonData)) { - send = 0; - } - } - - if (send === 1) { - if (jsonData.title) { - - if (error && type !== "Log" && typeof Promise !== "undefined" && Promise.toString().indexOf("[native code]") !== -1) { - // send message trying to pinpoint stackframes - stackGPS(error, xhr, jsonData); - } else { - // on message event - publicAPIs.emit('message', jsonData); - - // send message - xhr.send(JSON.stringify(jsonData)); - } - - } else { - callback('missing-title', xhr.statusText); - } - } - - } else { - return console.log('Login api error'); - } - }; - - // Some public methods - - publicAPIs.error = function (msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg); - }; - publicAPIs.error = function (msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg, error); - }; - - publicAPIs.verbose = function (msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg); - }; - publicAPIs.verbose = function (msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg, error); - }; - - publicAPIs.debug = function (msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg); - }; - publicAPIs.debug = function (msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg, error); - }; - - publicAPIs.information = function (msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg); - }; - publicAPIs.information = function (msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg, error); - }; - - publicAPIs.warning = function (msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg); - }; - publicAPIs.warning = function (msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg, error); - }; - - publicAPIs.fatal = function (msg) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg); - }; - publicAPIs.fatal = function (msg, error) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg, error); - }; - - publicAPIs.log = function (obj) { - sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Log', null, obj); - }; - - publicAPIs.message = function() { - return getPayload(); - }; - - publicAPIs.on = function (name, callback, ctx) { - var e = this.e || (this.e = {}); - - (e[name] || (e[name] = [])).push({ - fn: callback, - ctx: ctx - }); - - return this; - }; - - publicAPIs.emit = function (name) { - var data = [].slice.call(arguments, 1); - var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); - var i = 0; - var len = evtArr.length; - - for (i; i < len; i++) { - evtArr[i].fn.apply(evtArr[i].ctx, data); - } - - return this; - }; - - publicAPIs.init = function (options) { - - // Merge options into defaults - settings = extend(defaults, options || {}); - - // Code goes here... - window.onerror = function (message, source, lineno, colno, error) { - - var errorLog = { - 'message': message, - 'source': source, - 'lineno': lineno, - 'colno': colno, - 'error': error - } - - sendPayload(settings.apiKey, settings.logId, confirmResponse, errorLog); - - return false; - } - - }; - - // Initialize the plugin - publicAPIs.init(options); - - // If debug is true, show some errors - if (settings.debug) { - console.log('%c' + debugSettings.label, debugSettings.labelCSS); - - if(settings.apiKey) { - if(settings.apiKey.length !== 32) { - console.log('%c \u26A0 API Key: ' + '%c The API Key must have exactly 32 characters long ', debugSettings.errorCSS, debugSettings.lightCSS); - } - } else { - console.log('%c \u26A0 API Key: ' + '%c The API Key is not set ', debugSettings.errorCSS, debugSettings.lightCSS); - } - - if(settings.logId) { - if(!settings.logId.match(/^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$/gi)) { - console.log('%c \u26A0 API Key: ' + '%c The Log ID is not valid ', debugSettings.errorCSS, debugSettings.lightCSS); - } - } else { - console.log('%c \u26A0 Log ID: ' + '%c The Log ID is not set ', debugSettings.errorCSS, debugSettings.lightCSS); - } - } - - // Return the public APIs - return publicAPIs; - - }; - - - // - // Return the constructor - // - - if (paramsLength && params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { - // Immediately-Invoked Function Expression (IIFE) - return new Constructor; - } else { - // UMD Constructor - return Constructor; - } - -}); +/*! + * elmah.io Javascript Logger - version 3.3.0 + * (c) 2018 elmah.io, Apache 2.0 License, https://elmah.io + */ + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define([], function () { + return factory(root); + }); + } else if (typeof exports === 'object') { + module.exports = factory(root); + } else { + root.Elmahio = factory(root); + } +})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, function (window) { + + 'use strict'; + + // + // ==== STACKFRAME ==== + // + + var StackFrame = (function () { + "use strict"; + function _isNumber(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + } + function _capitalize(str) { + return str.charAt(0).toUpperCase() + str.substring(1); + } + function _getter(p) { + return function () { + return this[p]; + }; + } + var booleanProps = ["isConstructor", "isEval", "isNative", "isToplevel"]; + var numericProps = ["columnNumber", "lineNumber"]; + var stringProps = ["fileName", "functionName", "source"]; + var arrayProps = ["args"]; + var props = booleanProps.concat(numericProps, stringProps, arrayProps); + function StackFrame(obj) { + if (obj instanceof Object) { + for (var i = 0; i < props.length; i++) { + if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) { + this["set" + _capitalize(props[i])](obj[props[i]]); + } + } + } + } + StackFrame.prototype = { + getArgs: function () { + return this.args; + }, + setArgs: function (v) { + if (Object.prototype.toString.call(v) !== "[object Array]") { + throw new TypeError("Args must be an Array"); + } + this.args = v; + }, + getEvalOrigin: function () { + return this.evalOrigin; + }, + setEvalOrigin: function (v) { + if (v instanceof StackFrame) { + this.evalOrigin = v; + } else if (v instanceof Object) { + this.evalOrigin = new StackFrame(v); + } else { + throw new TypeError("Eval Origin must be an Object or StackFrame"); + } + }, + toString: function () { + var functionName = this.getFunctionName() || "{anonymous}"; + var args = "(" + (this.getArgs() || []).join(",") + ")"; + var fileName = this.getFileName() ? "@" + this.getFileName() : ""; + var lineNumber = _isNumber(this.getLineNumber()) ? ":" + this.getLineNumber() : ""; + var columnNumber = _isNumber(this.getColumnNumber()) ? ":" + this.getColumnNumber() : ""; + return functionName + args + fileName + lineNumber + columnNumber; + } + }; + StackFrame.fromString = function StackFrame$$fromString(str) { + var argsStartIndex = str.indexOf("("); + var argsEndIndex = str.lastIndexOf(")"); + var functionName = str.substring(0, argsStartIndex); + var args = str.substring(argsStartIndex + 1, argsEndIndex).split(","); + var locationString = str.substring(argsEndIndex + 1); + if (locationString.indexOf("@") === 0) { + var parts = /@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(locationString, ""); + var fileName = parts[1]; + var lineNumber = parts[2]; + var columnNumber = parts[3]; + } + return new StackFrame({ + functionName: functionName, + args: args || undefined, + fileName: fileName, + lineNumber: lineNumber || undefined, + columnNumber: columnNumber || undefined + }); + }; + for (var i = 0; i < booleanProps.length; i++) { + StackFrame.prototype["get" + _capitalize(booleanProps[i])] = _getter(booleanProps[i]); + StackFrame.prototype["set" + _capitalize(booleanProps[i])] = function (p) { + return function (v) { + this[p] = Boolean(v); + }; + }(booleanProps[i]); + } + for (var j = 0; j < numericProps.length; j++) { + StackFrame.prototype["get" + _capitalize(numericProps[j])] = _getter(numericProps[j]); + StackFrame.prototype["set" + _capitalize(numericProps[j])] = function (p) { + return function (v) { + if (!_isNumber(v)) { + throw new TypeError(p + " must be a Number"); + } + this[p] = Number(v); + }; + }(numericProps[j]); + } + for (var k = 0; k < stringProps.length; k++) { + StackFrame.prototype["get" + _capitalize(stringProps[k])] = _getter(stringProps[k]); + StackFrame.prototype["set" + _capitalize(stringProps[k])] = function (p) { + return function (v) { + this[p] = String(v); + }; + }(stringProps[k]); + } + return StackFrame; + })(); + + // + // ==== ERROR STACK PARSER ==== + // + + var ErrorStackParser = (function () { + "use strict"; + var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\S+\:\d+/; + var CHROME_IE_STACK_REGEXP = /^\s*at .*(\S+\:\d+|\(native\))/m; + var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\[native code\])?$/; + return { + /** + * Given an Error object, extract the most information from it. + * + * @param {Error} error object + * @return {Array} of StackFrames + */ + parse: function ErrorStackParser$$parse(error) { + if (typeof error.stacktrace !== "undefined" || typeof error["opera#sourceloc"] !== "undefined") { + return this.parseOpera(error); + } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) { + return this.parseV8OrIE(error); + } else if (error.stack) { + return this.parseFFOrSafari(error); + } else { + throw new Error("Cannot parse given Error object"); + } + }, + // Separate line and column numbers from a string of the form: (URI:Line:Column) + extractLocation: function ErrorStackParser$$extractLocation(urlLike) { + // Fail-fast but return locations like "(native)" + if (urlLike.indexOf(":") === -1) { + return [urlLike]; + } + var regExp = /(.+?)(?:\:(\d+))?(?:\:(\d+))?$/; + var parts = regExp.exec(urlLike.replace(/[\(\)]/g, "")); + return [parts[1], parts[2] || undefined, parts[3] || undefined]; + }, + parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) { + var filtered = error.stack.split("\n").filter(function (line) { + return !!line.match(CHROME_IE_STACK_REGEXP); + }, this); + return filtered.map(function (line) { + if (line.indexOf("(eval ") > -1) { + // Throw away eval information until we implement stacktrace.js/stackframe#8 + line = line.replace(/eval code/g, "eval").replace(/(\(eval at [^\()]*)|(\)\,.*$)/g, ""); + } + var tokens = line.replace(/^\s+/, "").replace(/\(eval code/g, "(").split(/\s+/).slice(1); + var locationParts = this.extractLocation(tokens.pop()); + var functionName = tokens.join(" ") || undefined; + var fileName = ["eval", ""].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0]; + return new StackFrame({ + functionName: functionName, + fileName: fileName, + lineNumber: locationParts[1], + columnNumber: locationParts[2], + source: line + }); + }, this); + }, + parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) { + var filtered = error.stack.split("\n").filter(function (line) { + return !line.match(SAFARI_NATIVE_CODE_REGEXP); + }, this); + return filtered.map(function (line) { + // Throw away eval information until we implement stacktrace.js/stackframe#8 + if (line.indexOf(" > eval") > -1) { + line = line.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g, ":$1"); + } + if (line.indexOf("@") === -1 && line.indexOf(":") === -1) { + // Safari eval frames only have function names and nothing else + return new StackFrame({ + functionName: line + }); + } else { + var functionNameRegex = /((.*".+"[^@]*)?[^@]*)(?:@)/; + var matches = line.match(functionNameRegex); + var functionName = matches && matches[1] ? matches[1] : undefined; + var locationParts = this.extractLocation(line.replace(functionNameRegex, "")); + return new StackFrame({ + functionName: functionName, + fileName: locationParts[0], + lineNumber: locationParts[1], + columnNumber: locationParts[2], + source: line + }); + } + }, this); + }, + parseOpera: function ErrorStackParser$$parseOpera(e) { + if (!e.stacktrace || e.message.indexOf("\n") > -1 && e.message.split("\n").length > e.stacktrace.split("\n").length) { + return this.parseOpera9(e); + } else if (!e.stack) { + return this.parseOpera10(e); + } else { + return this.parseOpera11(e); + } + }, + parseOpera9: function ErrorStackParser$$parseOpera9(e) { + var lineRE = /Line (\d+).*script (?:in )?(\S+)/i; + var lines = e.message.split("\n"); + var result = []; + for (var i = 2, len = lines.length; i < len; i += 2) { + var match = lineRE.exec(lines[i]); + if (match) { + result.push(new StackFrame({ + fileName: match[2], + lineNumber: match[1], + source: lines[i] + })); + } + } + return result; + }, + parseOpera10: function ErrorStackParser$$parseOpera10(e) { + var lineRE = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i; + var lines = e.stacktrace.split("\n"); + var result = []; + for (var i = 0, len = lines.length; i < len; i += 2) { + var match = lineRE.exec(lines[i]); + if (match) { + result.push(new StackFrame({ + functionName: match[3] || undefined, + fileName: match[2], + lineNumber: match[1], + source: lines[i] + })); + } + } + return result; + }, + // Opera 10.65+ Error.stack very similar to FF/Safari + parseOpera11: function ErrorStackParser$$parseOpera11(error) { + var filtered = error.stack.split("\n").filter(function (line) { + return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/); + }, this); + return filtered.map(function (line) { + var tokens = line.split("@"); + var locationParts = this.extractLocation(tokens.pop()); + var functionCall = tokens.shift() || ""; + var functionName = functionCall.replace(//, "$2").replace(/\([^\)]*\)/g, "") || undefined; + var argsRaw; + if (functionCall.match(/\(([^\)]*)\)/)) { + argsRaw = functionCall.replace(/^[^\(]+\(([^\)]*)\)$/, "$1"); + } + var args = argsRaw === undefined || argsRaw === "[arguments not available]" ? undefined : argsRaw.split(","); + return new StackFrame({ + functionName: functionName, + args: args, + fileName: locationParts[0], + lineNumber: locationParts[1], + columnNumber: locationParts[2], + source: line + }); + }, this); + } + }; + })(); + + // + // ==== STACKTRACE-GPS ==== + // + + var SourceMap = function(e){var n={};function r(t){if(n[t])return n[t].exports;var o=n[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}return r.m=e,r.c=n,r.p="",r(0)}([function(e,n,r){var t=r(1),o=r(2),i=r(3).ArraySet,a=r(4),s=r(6).quickSort;function u(e){var n=e;return"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,""))),null!=n.sections?new c(n):new l(n)}function l(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=t.getArg(n,"version"),o=t.getArg(n,"sources"),a=t.getArg(n,"names",[]),s=t.getArg(n,"sourceRoot",null),u=t.getArg(n,"sourcesContent",null),l=t.getArg(n,"mappings"),g=t.getArg(n,"file",null);if(r!=this._version)throw new Error("Unsupported version: "+r);o=o.map(String).map(t.normalize).map(function(e){return s&&t.isAbsolute(s)&&t.isAbsolute(e)?t.relative(s,e):e}),this._names=i.fromArray(a.map(String),!0),this._sources=i.fromArray(o,!0),this.sourceRoot=s,this.sourcesContent=u,this._mappings=l,this.file=g}function g(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function c(e){var n=e;"string"==typeof e&&(n=JSON.parse(e.replace(/^\)\]\}'/,"")));var r=t.getArg(n,"version"),o=t.getArg(n,"sections");if(r!=this._version)throw new Error("Unsupported version: "+r);this._sources=new i,this._names=new i;var a={line:-1,column:0};this._sections=o.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var n=t.getArg(e,"offset"),r=t.getArg(n,"line"),o=t.getArg(n,"column");if(r=0){var s=this._originalMappings[a];if(void 0===e.column)for(var u=s.originalLine;s&&s.originalLine===u;)i.push({line:t.getArg(s,"generatedLine",null),column:t.getArg(s,"generatedColumn",null),lastColumn:t.getArg(s,"lastGeneratedColumn",null)}),s=this._originalMappings[++a];else for(var l=s.originalColumn;s&&s.originalLine===n&&s.originalColumn==l;)i.push({line:t.getArg(s,"generatedLine",null),column:t.getArg(s,"generatedColumn",null),lastColumn:t.getArg(s,"lastGeneratedColumn",null)}),s=this._originalMappings[++a]}return i},n.SourceMapConsumer=u,l.prototype=Object.create(u.prototype),l.prototype.consumer=u,l.fromSourceMap=function(e){var n=Object.create(l.prototype),r=n._names=i.fromArray(e._names.toArray(),!0),o=n._sources=i.fromArray(e._sources.toArray(),!0);n.sourceRoot=e._sourceRoot,n.sourcesContent=e._generateSourcesContent(n._sources.toArray(),n.sourceRoot),n.file=e._file;for(var a=e._mappings.toArray().slice(),u=n.__generatedMappings=[],c=n.__originalMappings=[],p=0,h=a.length;p1&&(r.source=d+i[1],d+=i[1],r.originalLine=h+i[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+i[3],f=r.originalColumn,i.length>4&&(r.name=m+i[4],m+=i[4])),L.push(r),"number"==typeof r.originalLine&&y.push(r)}s(L,t.compareByGeneratedPositionsDeflated),this.__generatedMappings=L,s(y,t.compareByOriginalPositions),this.__originalMappings=y},l.prototype._findMapping=function(e,n,r,t,i,a){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return o.search(e,n,i,a)},l.prototype.computeColumnSpans=function(){for(var e=0;e=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=t.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),null!=this.sourceRoot&&(i=t.join(this.sourceRoot,i)));var a=t.getArg(o,"name",null);return null!==a&&(a=this._names.at(a)),{source:i,line:t.getArg(o,"originalLine",null),column:t.getArg(o,"originalColumn",null),name:a}}}return{source:null,line:null,column:null,name:null}},l.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},l.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=t.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var r;if(null!=this.sourceRoot&&(r=t.urlParse(this.sourceRoot))){var o=e.replace(/^file:\/\//,"");if("file"==r.scheme&&this._sources.has(o))return this.sourcesContent[this._sources.indexOf(o)];if((!r.path||"/"==r.path)&&this._sources.has("/"+e))return this.sourcesContent[this._sources.indexOf("/"+e)]}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},l.prototype.generatedPositionFor=function(e){var n=t.getArg(e,"source");if(null!=this.sourceRoot&&(n=t.relative(this.sourceRoot,n)),!this._sources.has(n))return{line:null,column:null,lastColumn:null};var r={source:n=this._sources.indexOf(n),originalLine:t.getArg(e,"line"),originalColumn:t.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",t.compareByOriginalPositions,t.getArg(e,"bias",u.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:t.getArg(i,"generatedLine",null),column:t.getArg(i,"generatedColumn",null),lastColumn:t.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=l,c.prototype=Object.create(u.prototype),c.prototype.constructor=u,c.prototype._version=3,Object.defineProperty(c.prototype,"sources",{get:function(){for(var e=[],n=0;n=0;g--)"."===(a=u[g])?u.splice(g,1):".."===a?l++:l>0&&(""===a?(u.splice(g+1,l),l=0):(u.splice(g,2),l--));return""===(r=u.join("/"))&&(r=s?"/":"."),t?(t.path=r,i(t)):r}n.urlParse=o,n.urlGenerate=i,n.normalize=a,n.join=function(e,n){""===e&&(e="."),""===n&&(n=".");var r=o(n),s=o(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),i(r);if(r||n.match(t))return n;if(s&&!s.host&&!s.path)return s.host=n,i(s);var u="/"===n.charAt(0)?n:a(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=u,i(s)):u},n.isAbsolute=function(e){return"/"===e.charAt(0)||!!e.match(r)},n.relative=function(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if((e=e.slice(0,t)).match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)};var s=!("__proto__"in Object.create(null));function u(e){return e}function l(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function g(e,n){return e===n?0:e>n?1:-1}n.toSetString=s?u:function(e){return l(e)?"$"+e:e},n.fromSetString=s?u:function(e){return l(e)?e.slice(1):e},n.compareByOriginalPositions=function(e,n,r){var t=e.source-n.source;return 0!==t?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)||r?t:0!=(t=e.generatedColumn-n.generatedColumn)?t:0!=(t=e.generatedLine-n.generatedLine)?t:e.name-n.name},n.compareByGeneratedPositionsDeflated=function(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:0!=(t=e.generatedColumn-n.generatedColumn)||r?t:0!=(t=e.source-n.source)?t:0!=(t=e.originalLine-n.originalLine)?t:0!=(t=e.originalColumn-n.originalColumn)?t:e.name-n.name},n.compareByGeneratedPositionsInflated=function(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:0!=(r=e.generatedColumn-n.generatedColumn)?r:0!==(r=g(e.source,n.source))?r:0!=(r=e.originalLine-n.originalLine)?r:0!=(r=e.originalColumn-n.originalColumn)?r:g(e.name,n.name)}},function(e,n){n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,r,t,o){if(0===r.length)return-1;var i=function e(r,t,o,i,a,s){var u=Math.floor((t-r)/2)+r,l=a(o,i[u],!0);return 0===l?u:l>0?t-u>1?e(u,t,o,i,a,s):s==n.LEAST_UPPER_BOUND?t1?e(r,u,o,i,a,s):s==n.LEAST_UPPER_BOUND?u:r<0?-1:r}(-1,r.length,e,r,t,o||n.GREATEST_LOWER_BOUND);if(i<0)return-1;for(;i-1>=0&&0===t(r[i],r[i-1],!0);)--i;return i}},function(e,n,r){var t=r(1),o=Object.prototype.hasOwnProperty;function i(){this._array=[],this._set=Object.create(null)}i.fromArray=function(e,n){for(var r=new i,t=0,o=e.length;t=0&&e>>=5)>0&&(n|=32),o+=t.encode(n)}while(i>0);return o},n.decode=function(e,n,r){var o,i,a,s,u=e.length,l=0,g=0;do{if(n>=u)throw new Error("Expected more digits in base 64 VLQ value.");if(-1===(i=t.decode(e.charCodeAt(n++))))throw new Error("Invalid base64 digit: "+e.charAt(n-1));o=!!(32&i),l+=(i&=31)<>1,1==(1&a)?-s:s),r.rest=n}},function(e,n){var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");n.encode=function(e){if(0<=e&&e= 200 && req.status < 300 || url.substr(0, 7) === "file://" && req.responseText) { + resolve(req.responseText); + } else { + reject(new Error("HTTP status: " + req.status + " retrieving " + url)); + } + } + }; + req.send(); + }); + } + /** + * Convert a Base64-encoded string into its original representation. + * Used for inline sourcemaps. + * + * @param {String} b64str Base-64 encoded string + * @returns {String} original representation of the base64-encoded string. + */ + function _atob(b64str) { + if (typeof window !== "undefined" && window.atob) { + return window.atob(b64str); + } else { + throw new Error("You must supply a polyfill for window.atob in this environment"); + } + } + function _parseJson(string) { + if (typeof JSON !== "undefined" && JSON.parse) { + return JSON.parse(string); + } else { + throw new Error("You must supply a polyfill for JSON.parse in this environment"); + } + } + function _findFunctionName(source, lineNumber) { + var syntaxes = [ // {name} = function ({args}) TODO args capture + /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*function\b/, // function {name}({args}) m[1]=name m[2]=args + /function\s+([^('"`]*?)\s*\(([^)]*)\)/, // {name} = eval() + /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*(?:eval|new Function)\b/, // fn_name() { + /\b(?!(?:if|for|switch|while|with|catch)\b)(?:(?:static)\s+)?(\S+)\s*\(.*?\)\s*\{/, // {name} = () => { + /['"]?([$_A-Za-z][$_A-Za-z0-9]*)['"]?\s*[:=]\s*\(.*?\)\s*=>/]; + var lines = source.split("\n"); + // Walk backwards in the source lines until we find the line which matches one of the patterns above + var code = ""; + var maxLines = Math.min(lineNumber, 20); + for (var i = 0; i < maxLines; ++i) { + // lineNo is 1-based, source[] is 0-based + var line = lines[lineNumber - i - 1]; + var commentPos = line.indexOf("//"); + if (commentPos >= 0) { + line = line.substr(0, commentPos); + } + if (line) { + code = line + code; + var len = syntaxes.length; + for (var index = 0; index < len; index++) { + var m = syntaxes[index].exec(code); + if (m && m[1]) { + return m[1]; + } + } + } + } + return undefined; + } + function _ensureSupportedEnvironment() { + if (typeof Object.defineProperty !== "function" || typeof Object.create !== "function") { + throw new Error("Unable to consume source maps in older browsers"); + } + } + function _ensureStackFrameIsLegit(stackframe) { + if (typeof stackframe !== "object") { + throw new TypeError("Given StackFrame is not an object"); + } else if (typeof stackframe.fileName !== "string") { + throw new TypeError("Given file name is not a String"); + } else if (typeof stackframe.lineNumber !== "number" || stackframe.lineNumber % 1 !== 0 || stackframe.lineNumber < 1) { + throw new TypeError("Given line number must be a positive integer"); + } else if (typeof stackframe.columnNumber !== "number" || stackframe.columnNumber % 1 !== 0 || stackframe.columnNumber < 0) { + throw new TypeError("Given column number must be a non-negative integer"); + } + return true; + } + function _findSourceMappingURL(source) { + var sourceMappingUrlRegExp = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/gm; + var lastSourceMappingUrl; + var matchSourceMappingUrl; + while (matchSourceMappingUrl = sourceMappingUrlRegExp.exec(source)) { + // jshint ignore:line + lastSourceMappingUrl = matchSourceMappingUrl[1]; + } + if (lastSourceMappingUrl) { + return lastSourceMappingUrl; + } else { + throw new Error("sourceMappingURL not found"); + } + } + function _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache) { + return new Promise(function (resolve, reject) { + var loc = sourceMapConsumer.originalPositionFor({ + line: stackframe.lineNumber, + column: stackframe.columnNumber + }); + if (loc.source) { + // cache mapped sources + var mappedSource = sourceMapConsumer.sourceContentFor(loc.source); + if (mappedSource) { + sourceCache[loc.source] = mappedSource; + } + resolve(// given stackframe and source location, update stackframe + new StackFrame({ + functionName: loc.name || stackframe.functionName, + args: stackframe.args, + fileName: loc.source, + lineNumber: loc.line, + columnNumber: loc.column + })); + } else { + reject(new Error("Could not get original source for given stackframe and source map")); + } + }); + } + /** + * @constructor + * @param {Object} opts + * opts.sourceCache = {url: "Source String"} => preload source cache + * opts.sourceMapConsumerCache = {/path/file.js.map: SourceMapConsumer} + * opts.offline = True to prevent network requests. + * Best effort without sources or source maps. + * opts.ajax = Promise returning function to make X-Domain requests + */ + return function StackTraceGPS(opts) { + if (!(this instanceof StackTraceGPS)) { + return new StackTraceGPS(opts); + } + opts = opts || {}; + this.sourceCache = opts.sourceCache || {}; + this.sourceMapConsumerCache = opts.sourceMapConsumerCache || {}; + this.ajax = opts.ajax || _xdr; + this._atob = opts.atob || _atob; + + this._get = function _get(location) { + return new Promise(function (resolve, reject) { + var isDataUrl = location.substr(0, 5) === "data:"; + if (this.sourceCache[location]) { + resolve(this.sourceCache[location]); + } else if (opts.offline && !isDataUrl) { + reject(new Error("Cannot make network requests in offline mode")); + } else { + if (isDataUrl) { + // data URLs can have parameters. + // see http://tools.ietf.org/html/rfc2397 + var supportedEncodingRegexp = /^data:application\/json;([\w=:"-]+;)*base64,/; + var match = location.match(supportedEncodingRegexp); + if (match) { + var sourceMapStart = match[0].length; + var encodedSource = location.substr(sourceMapStart); + var source = this._atob(encodedSource); + this.sourceCache[location] = source; + resolve(source); + } else { + reject(new Error("The encoding of the inline sourcemap is not supported")); + } + } else { + var xhrPromise = this.ajax(location, { + method: "get" + }); + // Cache the Promise to prevent duplicate in-flight requests + this.sourceCache[location] = xhrPromise; + xhrPromise.then(resolve, reject); + } + } + }.bind(this)); + }; + /** + * Creating SourceMapConsumers is expensive, so this wraps the creation of a + * SourceMapConsumer in a per-instance cache. + * + * @param {String} sourceMappingURL = URL to fetch source map from + * @param {String} defaultSourceRoot = Default source root for source map if undefined + * @returns {Promise} that resolves a SourceMapConsumer + */ + this._getSourceMapConsumer = function _getSourceMapConsumer(sourceMappingURL, defaultSourceRoot) { + return new Promise(function (resolve, reject) { + if (this.sourceMapConsumerCache[sourceMappingURL]) { + resolve(this.sourceMapConsumerCache[sourceMappingURL]); + } else { + var sourceMapConsumerPromise = new Promise(function (resolve, reject) { + return this._get(sourceMappingURL).then(function (sourceMapSource) { + if (typeof sourceMapSource === "string") { + sourceMapSource = _parseJson(sourceMapSource.replace(/^\)\]\}'/, "")); + } + if (typeof sourceMapSource.sourceRoot === "undefined") { + sourceMapSource.sourceRoot = defaultSourceRoot; + } + resolve(new SourceMap.SourceMapConsumer(sourceMapSource)); + }, reject); + }.bind(this)); + this.sourceMapConsumerCache[sourceMappingURL] = sourceMapConsumerPromise; + resolve(sourceMapConsumerPromise); + } + }.bind(this)); + }; + /** + * Given a StackFrame, enhance function name and use source maps for a + * better StackFrame. + * + * @param {StackFrame} stackframe object + * @returns {Promise} that resolves with with source-mapped StackFrame + */ + this.pinpoint = function StackTraceGPS$$pinpoint(stackframe) { + return new Promise(function (resolve, reject) { + this.getMappedLocation(stackframe).then(function (mappedStackFrame) { + function resolveMappedStackFrame() { + resolve(mappedStackFrame); + } + this.findFunctionName(mappedStackFrame).then(resolve, resolveMappedStackFrame)["catch"](resolveMappedStackFrame); + }.bind(this), reject); + }.bind(this)); + }; + /** + * Given a StackFrame, guess function name from location information. + * + * @param {StackFrame} stackframe + * @returns {Promise} that resolves with enhanced StackFrame. + */ + this.findFunctionName = function StackTraceGPS$$findFunctionName(stackframe) { + return new Promise(function (resolve, reject) { + _ensureStackFrameIsLegit(stackframe); + this._get(stackframe.fileName).then(function getSourceCallback(source) { + var lineNumber = stackframe.lineNumber; + var columnNumber = stackframe.columnNumber; + var guessedFunctionName = _findFunctionName(source, lineNumber, columnNumber); + // Only replace functionName if we found something + if (guessedFunctionName) { + resolve(new StackFrame({ + functionName: guessedFunctionName, + args: stackframe.args, + fileName: stackframe.fileName, + lineNumber: lineNumber, + columnNumber: columnNumber + })); + } else { + resolve(stackframe); + } + }, reject)["catch"](reject); + }.bind(this)); + }; + /** + * Given a StackFrame, seek source-mapped location and return new enhanced StackFrame. + * + * @param {StackFrame} stackframe + * @returns {Promise} that resolves with enhanced StackFrame. + */ + this.getMappedLocation = function StackTraceGPS$$getMappedLocation(stackframe) { + return new Promise(function (resolve, reject) { + _ensureSupportedEnvironment(); + _ensureStackFrameIsLegit(stackframe); + var sourceCache = this.sourceCache; + var fileName = stackframe.fileName; + this._get(fileName).then(function (source) { + var sourceMappingURL = _findSourceMappingURL(source); + var isDataUrl = sourceMappingURL.substr(0, 5) === "data:"; + var defaultSourceRoot = fileName.substring(0, fileName.lastIndexOf("/") + 1); + if (sourceMappingURL[0] !== "/" && !isDataUrl && !/^https?:\/\/|^\/\//i.test(sourceMappingURL)) { + sourceMappingURL = defaultSourceRoot + sourceMappingURL; + } + return this._getSourceMapConsumer(sourceMappingURL, defaultSourceRoot).then(function (sourceMapConsumer) { + return _extractLocationInfoFromSourceMapSource(stackframe, sourceMapConsumer, sourceCache).then(resolve)["catch"](function () { + resolve(stackframe); + }); + }); + }.bind(this), reject)["catch"](reject); + }.bind(this)); + }; + }; + })(SourceMap, StackFrame); + + // + // Shared Variables + // + + var scriptFile = document.getElementsByTagName('script'); + var scriptIndex = scriptFile.length - 1; + var myScript = scriptFile[scriptIndex]; + var queryString = myScript.src.replace(/^[^\?]+\??/, ''); + var params = parseQuery(queryString); + var paramsLength = objectLength(params); + + var debugSettings = { + label: ' elmah.io debugger : On ', + labelCSS: 'background: #06a89c; color: #ffffff; display: inline-block; font-size: 14px;', + successCSS: 'background: #d4edda; color: #155724; display: inline-block; font-size: 13px;', + errorCSS: 'background: #f8d7da; color: #721c24; display: inline-block; font-size: 13px;', + warningCSS: 'background: #fff3cd; color: #856404; display: inline-block; font-size: 13px;', + lightCSS: 'background: #e2e3e5; color: #383d41; display: inline-block; font-size: 13px;' + }; + + var defaults = { + apiKey: null, + logId: null, + debug: false, + application: null, + filter: null, + captureConsoleMinimumLevel: 'none' + }; + + // + // Shared Methods + // + + var extend = function () { + + // Variables + var extended = {}; + var deep = false; + var i = 0; + + // Check if a deep merge + if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') { + deep = arguments[0]; + i++; + } + + // Merge the object into the extended object + var merge = function (obj) { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + // If property is an object, merge properties + if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') { + extended[prop] = extend(extended[prop], obj[prop]); + } else { + extended[prop] = obj[prop]; + } + } + } + }; + + // Loop through each object and conduct a merge + for (; i < arguments.length; i++) { + var obj = arguments[i]; + merge(obj); + } + + return extended; + + }; + + // + // Helpers + // + + function parseQuery(query) { + var Params = new Object(); + if (!query) return Params; // return empty object + var Pairs = query.split(/[;&]/); + for (var i = 0; i < Pairs.length; i++) { + var KeyVal = Pairs[i].split('='); + if (!KeyVal || KeyVal.length !== 2) continue; + var key = unescape(KeyVal[0]); + var val = unescape(KeyVal[1]); + val = val.replace(/\+/g, ' '); + Params[key] = val; + } + return Params; + } + + function objectLength(obj) { + var size = 0, key; + for (key in obj) { + if (obj.hasOwnProperty(key)) size++; + } + return size; + }; + + function getSearchParameters() { + var prmstr = window.location.search.substr(1); + return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {}; + } + + function transformToAssocArray(prmstr) { + var params = []; + var prmarr = prmstr.split("&"); + for (var i = 0; i < prmarr.length; i++) { + var tmparr = prmarr[i].split("="); + params.push({ + 'key': tmparr[0], + 'value': tmparr[1] + }); + } + return params; + } + + function merge_objects(obj1, obj2) { + var obj3 = {}; + for (var attrname1 in obj1) { + obj3[attrname1] = obj1[attrname1]; + } + for (var attrname2 in obj2) { + obj3[attrname2] = obj2[attrname2]; + } + + return obj3; + } + + // sprintf-js + var sprintfjs = function() { + 'use strict' + var app = {}; + var re = { + not_string: /[^s]/, + not_bool: /[^t]/, + not_type: /[^T]/, + not_primitive: /[^v]/, + number: /[diefg]/, + numeric_arg: /[bcdiefguxX]/, + json: /[j]/, + not_json: /[^j]/, + text: /^[^\x25]+/, + modulo: /^\x25{2}/, + placeholder: /^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/, + key: /^([a-z_][a-z_\d]*)/i, + key_access: /^\.([a-z_][a-z_\d]*)/i, + index_access: /^\[(\d+)\]/, + sign: /^[+-]/, + mod: /^\x25\s/, + notplaceholder: /^\x25?([^b-gijostTuvxX])/ + } + + function sprintf(key) { + // `arguments` is not an array, but should be fine for this call + return sprintf_format(sprintf_parse(key), arguments) + } + + function vsprintf(fmt, argv) { + return sprintf.apply(null, [fmt].concat(argv || [])) + } + + function sprintf_format(parse_tree, argv) { + var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign; + for (i = 0; i < tree_length; i++) { + if (typeof parse_tree[i] === 'string') { + output += parse_tree[i] + } + else if (typeof parse_tree[i] === 'object') { + ph = parse_tree[i]; // placeholder + if (ph.keys) { // keyword argument + arg = argv[cursor] + for (k = 0; k < ph.keys.length; k++) { + if (arg == undefined) { + throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k-1])) + } + arg = arg[ph.keys[k]] + } + } + else if (ph.param_no) { // positional argument (explicit) + arg = argv[ph.param_no] + } + else { // positional argument (implicit) + arg = argv[cursor++] + } + + if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) { + arg = arg() + } + + if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg) && arg === undefined)) { // treat %_d as string if it has no argument + arg = ph.placeholder; + ph.type = "s"; + } + + if (re.number.test(ph.type)) { + is_positive = typeof arg === "string" ? true : arg >= 0 + } + + switch (ph.type) { + case 'b': + arg = parseInt(arg, 10).toString(2) + break + case 'c': + arg = String.fromCharCode(parseInt(arg, 10)) + break + case 'd': + case 'i': + arg = typeof arg === "number" ? parseInt(arg, 10) : NaN + break + case 'j': + arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0) + break + case 'e': + arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential() + break + case 'f': + arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg) + break + case 'g': + arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg) + break + case 'o': + arg = (parseInt(arg, 10) >>> 0).toString(8) + break + case 's': + arg = String(arg) + arg = arg === "undefined" ? ph.placeholder : (ph.precision ? arg.substring(0, ph.precision) : arg) + break + case 't': + arg = String(!!arg) + arg = (ph.precision ? arg.substring(0, ph.precision) : arg) + break + case 'T': + arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase() + arg = (ph.precision ? arg.substring(0, ph.precision) : arg) + break + case 'u': + arg = parseInt(arg, 10) >>> 0 + break + case 'v': + arg = arg.valueOf() + arg = (ph.precision ? arg.substring(0, ph.precision) : arg) + break + case 'x': + arg = (parseInt(arg, 10) >>> 0).toString(16) + break + case 'X': + arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase() + break + } + if (re.json.test(ph.type)) { + output += arg + } + else { + if (re.number.test(ph.type) && (!is_positive || ph.sign)) { + sign = is_positive ? '+' : '-' + arg = arg.toString().replace(re.sign, '') + } + else { + sign = '' + } + pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' ' + pad_length = ph.width - (sign + arg).length + pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : '' + output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg) + } + } + } + return output + } + + var sprintf_cache = Object.create(null) + + function sprintf_parse(fmt) { + var _fmt = fmt, match, parse_tree = [], arg_names = 0; + while (_fmt) { + if ((match = re.text.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } + else if ((match = re.modulo.exec(_fmt)) !== null) { + parse_tree.push('%'); + } + else if ((match = re.placeholder.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1 + var field_list = [], replacement_field = match[2], field_match = [] + if ((field_match = re.key.exec(replacement_field)) !== null) { + field_list.push(field_match[1]) + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { + if ((field_match = re.key_access.exec(replacement_field)) !== null) { + field_list.push(field_match[1]) + } + else if ((field_match = re.index_access.exec(replacement_field)) !== null) { + field_list.push(field_match[1]) + } + else { + throw new SyntaxError('[sprintf] failed to parse named argument key') + } + } + } + else { + throw new SyntaxError('[sprintf] failed to parse named argument key') + } + match[2] = field_list + } + else { + arg_names |= 2 + } + if (arg_names === 3) { + throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported') + } + + parse_tree.push( + { + placeholder: match[0], + param_no: match[1], + keys: match[2], + sign: match[3], + pad_char: match[4], + align: match[5], + width: match[6], + precision: match[7], + type: match[8] + } + ) + } + else if ((match = re.mod.exec(_fmt)) !== null) { // treat %_SPACE as a string + parse_tree.push(match[0]); + } + else if ((match = re.notplaceholder.exec(_fmt)) !== null) { // treat %_NOTPLACEHOLDER as a string + parse_tree.push(match[0]); + } + else { + throw new SyntaxError('[sprintf] unexpected placeholder') + } + _fmt = _fmt.substring(match[0].length) + } + return parse_tree + } + + app.sprintf = sprintf; + app.vsprintf = vsprintf; + return app; + } + + // + // Constructor + // Can be named anything you want + // + + var Constructor = function (options) { + + // + // Unique Variables + // + + var publicAPIs = {}; + var settings; + + function getPayload() { + var payload = { + "url": document.location.pathname || '/', + "application": settings.application + }; + + var payload_data = []; + + if (document.documentMode) payload_data.push({ "key": "Document-Mode", "value": document.documentMode }); + if (window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth) payload_data.push({ "key": "Browser-Width", "value": window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth }); + if (window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight) payload_data.push({ "key": "Browser-Height", "value": window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight }); + if ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type) !== undefined) payload_data.push({ "key": "Screen-Orientation", "value": ((screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type).split("-"))[0] }); + if (screen.width) payload_data.push({ "key": "Screen-Width", "value": screen.width }); + if (screen.height) payload_data.push({ "key": "Screen-Height", "value": screen.height }); + if (screen.colorDepth) payload_data.push({ "key": "Color-Depth", "value": screen.colorDepth }); + payload_data.push({ "key": "X-ELMAHIO-SEARCH-isClientside", "value": "true" }); + + payload.data = payload_data; + + var payload_serverVariables = []; + if (navigator.language) payload_serverVariables.push({ "key": "User-Language", "value": navigator.language }); + if (navigator.userAgent) payload_serverVariables.push({ "key": "User-Agent", "value": navigator.userAgent }); + if (document.referrer) payload_serverVariables.push({ "key": "Referer", "value": document.referrer }); + if (document.location.protocol === "https:") payload_serverVariables.push({ "key": "HTTPS", "value": 'on' }); + if (document.location.hostname) payload_serverVariables.push({ "key": "Host", "value": document.location.hostname }); + + payload.serverVariables = payload_serverVariables; + + return payload; + } + + function confirmResponse(status, response) { + if (settings.debug) { + if (status === 'error') { + console.log('%c \u2BC8 Error log: ' + '%c \u2715 Not created ', debugSettings.lightCSS, debugSettings.errorCSS); + } else if (status === 'success') { + console.log('%c \u2BC8 Error log: ' + '%c \u2714 ' + response + ' at ' + new Date().toLocaleString() + ' ', debugSettings.lightCSS, debugSettings.successCSS); + } else { + console.log('%c \u2BC8 Error log: ' + '%c \u2715 Not created. Title should not be undefined, null or empty ! ', debugSettings.lightCSS, debugSettings.errorCSS); + } + } + } + + function stackGPS(error, xhr, jsonData) { + var errorStack = error.toString().split("\n")[0]; + var gps = new StackTraceGPS(); + var promise = new Promise(function(resolve) { + var stackframes = ErrorStackParser.parse(error); + resolve(Promise.all(stackframes.map(function(sf) { + return new Promise(function(resolve) { + function resolveOriginal() { + resolve(sf); + } + gps.pinpoint(sf).then(resolve, resolveOriginal)['catch'](resolveOriginal); + }); + }))); + } + ); + + promise.then(function(newFrames){ + newFrames.forEach(function(stackFrame, i){ + if(stackFrame.functionName) { + var fn = stackFrame.functionName + ' '; + } else { + var fn = ''; + } + var stackString = ' at ' + fn + '(' + stackFrame.fileName + ':' + stackFrame.lineNumber + ':' + stackFrame.columnNumber + ')'; + newFrames[i] = stackString; + }); + newFrames.unshift(errorStack); + jsonData.detail = newFrames.join("\n"); + xhr.send(JSON.stringify(jsonData)); + }); + } + + function stackString(error) { + var typeOF = typeof error.error; + var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1); + + return typeOFCapitalized + ': ' + error.error + '\n' + ' at ' + '(' + error.source + ':' + error.lineno + ':' + error.colno + ')'; + } + + // Private methods + + var sendPayload = function (apiKey, logId, callback, errorLog) { + + var api_key = apiKey, + log_id = logId, + error = errorLog, + send = 1, + queryParams = getSearchParameters(), + stack = error.error && objectLength(error.error.stack) !== 0 && typeof error.error === "object" ? ErrorStackParser.parse(error.error) : ''; + + // Ignoring error from an external script + if (error && error.colno === 0 && error.lineno === 0 && (!stack || stack === '') && error.message && (error.message === "Script error." || error.message === "Script error")) { + if (settings.debug) { + console.log('%c \u2BC8 Error log: ' + '%c \uD83D\uDEC8 Ignoring error from external script ', debugSettings.lightCSS, debugSettings.warningCSS); + } + return; + } + + if ((api_key !== null && log_id !== null) || (paramsLength === 2)) { + + // Priority for parameters + if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { + api_key = params['apiKey']; + log_id = params['logId']; + } + + // get new XHR object + var xhr = new XMLHttpRequest(); + xhr.open("POST", "https://api.elmah.io/v3/messages/" + log_id + "?api_key=" + api_key, true); + + xhr.setRequestHeader('Content-type', 'application/json'); + + xhr.onload = function (e) { + if (xhr.readyState === 4) { + if (xhr.status === 201) { + callback('success', xhr.statusText); + } + } + }; + + xhr.onerror = function (e) { + callback('error', xhr.statusText); + + // on error event + publicAPIs.emit('error', xhr.status, xhr.statusText); + } + + var jsonData = { + "detail": error.error ? error.error.stack : null, + "title": error.message || 'Unspecified error', + "source": stack && stack.length > 0 ? stack[0].fileName : null, + "severity": "Error", + "type": error.error ? error.error.name : null, + "queryString": JSON.parse(JSON.stringify(queryParams)) + }; + + // Check if error sent is a string and not an object + // Then create the articifial stacktrace and pass source & type of the error + if(error.error && (objectLength(error.error.stack) === 0) && typeof jsonData.detail === "undefined") { + var typeOF = typeof errorLog.error; + var typeOFCapitalized = typeOF.charAt(0).toUpperCase() + typeOF.slice(1); + + jsonData.detail = stackString(errorLog); + jsonData.source = errorLog.source; + jsonData.title = "Uncaught " + typeOFCapitalized + ": " + errorLog.error; + } + + // Add payload to jsonData + jsonData = merge_objects(jsonData, getPayload()); + + // filter callback + if (settings.filter !== null) { + if (settings.filter(jsonData)) { + send = 0; + } + } + + if (send === 1) { + // on message event + publicAPIs.emit('message', jsonData); + + if (error.error && typeof error.error === "object" && objectLength(error.error.stack) !== 0 && typeof Promise !== "undefined" && Promise.toString().indexOf("[native code]") !== -1) { + // send message trying to pinpoint stackframes + stackGPS(error.error, xhr, jsonData); + } else { + // send message + xhr.send(JSON.stringify(jsonData)); + } + } + + } else { + return console.log('Login api error'); + } + }; + + var sendManualPayload = function (apiKey, logId, callback, logType, messageLog, errorLog) { + var api_key = apiKey, + log_id = logId, + type = logType, + error = errorLog, + message = messageLog, + send = 1, + queryParams = getSearchParameters(); + + if ((api_key !== null && log_id !== null) || (paramsLength === 2)) { + + // Priority for parameters + if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { + api_key = params['apiKey']; + log_id = params['logId']; + } + + // get new XHR object + var xhr = new XMLHttpRequest(); + xhr.open("POST", "https://api.elmah.io/v3/messages/" + log_id + "?api_key=" + api_key, true); + xhr.setRequestHeader('Content-type', 'application/json'); + + xhr.onload = function (e) { + if (xhr.readyState === 4) { + if (xhr.status === 201) { + callback('success', xhr.statusText); + } + } + }; + + xhr.onerror = function (e) { + callback('error', xhr.statusText); + + // on error event + publicAPIs.emit('error', xhr.status, xhr.statusText); + } + + if (type !== "Log") { + + var stack = error ? ErrorStackParser.parse(error) : null; + + var jsonData = { + "title": message, + "source": stack && stack.length > 0 ? stack[0].fileName : null, + "detail": error ? error.stack : null, + "severity": type, + "type": error ? error.name : null, + "queryString": JSON.parse(JSON.stringify(queryParams)) + }; + + // Add payload to jsonData + jsonData = merge_objects(jsonData, getPayload()); + + } else { + + jsonData = error; + + } + + // filter callback + if (settings.filter !== null) { + if (settings.filter(jsonData)) { + send = 0; + } + } + + if (send === 1) { + if (jsonData.title) { + + // on message event + publicAPIs.emit('message', jsonData); + + if (error && type !== "Log" && typeof Promise !== "undefined" && Promise.toString().indexOf("[native code]") !== -1) { + // send message trying to pinpoint stackframes + stackGPS(error, xhr, jsonData); + } else { + // send message + xhr.send(JSON.stringify(jsonData)); + } + + } else { + callback('missing-title', xhr.statusText); + } + } + + } else { + return console.log('Login api error'); + } + }; + + var sendPayloadFromConsole = function (apiKey, logId, callback, logType, errorLog) { + var api_key = apiKey, + log_id = logId, + message = errorLog.message, + messageTemplate = errorLog.message, + type = logType, + args = Object.values(errorLog.arguments), + send = 1, + queryParams = getSearchParameters(); + + // If message has placeholders (%s or %d), check for arguments and replace them + if(String(message).match(/(%d|%s)+/ig) && args.length > 1) { + var sprintfJS = new sprintfjs(); + // Remove the first argument from array, which represents the message + args.shift(); + message = sprintfJS.vsprintf(message, args); + } + + if(typeof message !== "string"){ + message = message.toString(); + } + + if(typeof messageTemplate !== "string") { + messageTemplate = messageTemplate.toString(); + } + + if ((api_key !== null && log_id !== null) || (paramsLength === 2)) { + + // Priority for parameters + if (params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { + api_key = params['apiKey']; + log_id = params['logId']; + } + + // get new XHR object + var xhr = new XMLHttpRequest(); + xhr.open("POST", "https://api.elmah.io/v3/messages/" + log_id + "?api_key=" + api_key, true); + xhr.setRequestHeader('Content-type', 'application/json'); + + xhr.onload = function (e) { + if (xhr.readyState === 4) { + if (xhr.status === 201) { + callback('success', xhr.statusText); + } + } + }; + + xhr.onerror = function (e) { + callback('error', xhr.statusText); + // on error event + publicAPIs.emit('error', xhr.status, xhr.statusText); + } + + function manipulateStack (errorStack, severity, message) { + var stack = []; + for (var i = 0; i < errorStack.length; i++) { + if(errorStack[i] === "Error") { + stack.push(severity + ": " + message); + } + if(!errorStack[i].match(/elmahio.js|elmahio.min.js/g) && errorStack[i] !== "Error") { + stack.push(errorStack[i]); + } + } + return stack.join('\n'); + } + + var jsonData = { + "title": message, + "titleTemplate": messageTemplate, + "detail": manipulateStack(new Error().stack.split('\n'), type, message), + "severity": type, + "type": null, + "queryString": JSON.parse(JSON.stringify(queryParams)) + }; + + // Add payload to jsonData + jsonData = merge_objects(jsonData, getPayload()); + + // filter callback + if (settings.filter !== null) { + if (settings.filter(jsonData)) { + send = 0; + } + } + + if (send === 1) { + if (jsonData.title) { + // on message event + publicAPIs.emit('message', jsonData); + // send message + xhr.send(JSON.stringify(jsonData)); + } else { + callback('missing-title', xhr.statusText); + } + } + + } else { + return console.log('Login api error'); + } + }; + + // Some public methods + + publicAPIs.error = function (msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg); + }; + publicAPIs.error = function (msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Error', msg, error); + }; + + publicAPIs.verbose = function (msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg); + }; + publicAPIs.verbose = function (msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Verbose', msg, error); + }; + + publicAPIs.debug = function (msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg); + }; + publicAPIs.debug = function (msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Debug', msg, error); + }; + + publicAPIs.information = function (msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg); + }; + publicAPIs.information = function (msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Information', msg, error); + }; + + publicAPIs.warning = function (msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg); + }; + publicAPIs.warning = function (msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Warning', msg, error); + }; + + publicAPIs.fatal = function (msg) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg); + }; + publicAPIs.fatal = function (msg, error) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Fatal', msg, error); + }; + + publicAPIs.log = function (obj) { + sendManualPayload(settings.apiKey, settings.logId, confirmResponse, 'Log', null, obj); + }; + + publicAPIs.message = function() { + return getPayload(); + }; + + publicAPIs.on = function (name, callback, ctx) { + var e = this.e || (this.e = {}); + + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx: ctx + }); + + return this; + }; + + publicAPIs.emit = function (name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + + return this; + }; + + publicAPIs.init = function (options) { + + // -- Merge options into defaults + settings = extend(defaults, options || {}); + + // -- Log on window error + window.onerror = function (message, source, lineno, colno, error) { + + var errorLog = { + 'message': message, + 'source': source, + 'lineno': lineno, + 'colno': colno, + 'error': error + } + + sendPayload(settings.apiKey, settings.logId, confirmResponse, errorLog); + + return false; + } + + // -- Overriding console methods + // -- Then log messages into the app.elmah.io + if(options.captureConsoleMinimumLevel !== "none") { + + // If captureConsoleMinimumLevel: info or debug is set (error, warn) + if(options.captureConsoleMinimumLevel === "info" || options.captureConsoleMinimumLevel === "warn" || options.captureConsoleMinimumLevel === "error" || options.captureConsoleMinimumLevel === "debug") { + // Log console errors + var _error = console.error; + console.error = function(errMessage){ + var errorLog = { + 'message': errMessage, + 'arguments': arguments + } + sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Error', errorLog); + _error.apply(console, arguments); + }; + if(options.captureConsoleMinimumLevel !== "error") { + // Log console warnings + var _warning = console.warn; + console.warn = function(warnMessage){ + var errorLog = { + 'message': warnMessage, + 'arguments': arguments + } + sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Warning', errorLog); + _warning.apply(console, arguments); + }; + } + } + if(options.captureConsoleMinimumLevel === "info" || options.captureConsoleMinimumLevel === "debug") { + // Log console info + var _info = console.info; + console.info = function(infoMessage){ + var errorLog = { + 'message': infoMessage, + 'arguments': arguments + } + sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Information', errorLog); + _info.apply(console, arguments); + }; + } + if(options.captureConsoleMinimumLevel === "debug") { + // Log console debug + var _debug = console.debug; + console.debug = function(debugMessage){ + var errorLog = { + 'message': debugMessage, + 'arguments': arguments + } + sendPayloadFromConsole(settings.apiKey, settings.logId, confirmResponse, 'Debug', errorLog); + _debug.apply(console, arguments); + }; + } + } + }; + + // Initialize the plugin + publicAPIs.init(options); + + if (settings.debug) { + console.log('%c' + debugSettings.label, debugSettings.labelCSS); + } + + // Return the public APIs + return publicAPIs; + + }; + + + // + // Return the constructor + // + + if (paramsLength && params.hasOwnProperty('apiKey') && params.hasOwnProperty('logId')) { + // Immediately-Invoked Function Expression (IIFE) + return new Constructor; + } else { + // UMD Constructor + return Constructor; + } + +}); \ No newline at end of file diff --git a/typescript/elmahio.d.ts b/typescript/elmahio.d.ts index 36f47b5..22dbcd2 100644 --- a/typescript/elmahio.d.ts +++ b/typescript/elmahio.d.ts @@ -83,6 +83,11 @@ declare namespace Elmahio { * Implement the 'filter' function to be able to ignore messages before they are logged to elmah.io. */ filter?(message: Elmahio.Message): boolean; + /** + * Log console.debug, console.info, console.warn, and console.error to elmah.io. + * Can have one of the following values: 'none', 'debug', 'info', 'warn', 'error'. Default is 'none'. + */ + captureConsoleMinimumLevel?: string; } interface Item {