From cd9082a9f8402cfb1ce566303f471b5f4030a378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Og=C3=B3rek?= Date: Mon, 2 Oct 2017 12:08:36 +0200 Subject: [PATCH] 3.18.0 --- CHANGELOG.md | 15 + bower.json | 2 +- dist/plugins/angular.js | 289 +- dist/plugins/angular.min.js | 138 +- dist/plugins/angular.min.js.map | 2 +- dist/plugins/console.js | 207 +- dist/plugins/console.min.js | 105 +- dist/plugins/console.min.js.map | 2 +- dist/plugins/ember.js | 118 +- dist/plugins/ember.min.js | 81 +- dist/plugins/ember.min.js.map | 2 +- dist/plugins/require.js | 90 +- dist/plugins/require.min.js | 71 +- dist/plugins/require.min.js.map | 2 +- dist/plugins/vue.js | 139 +- dist/plugins/vue.min.js | 83 +- dist/plugins/vue.min.js.map | 2 +- dist/raven.js | 4838 +++++++++++++++++-------------- dist/raven.min.js | 1535 +++++++++- dist/raven.min.js.map | 2 +- dist/sri.json | 12 +- docs/sentry-doc-config.json | 2 +- package.json | 2 +- src/raven.js | 2 +- test/raven.test.js | 2 +- 25 files changed, 5233 insertions(+), 2510 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6ee0fe63be3..7c62e01b596c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## 3.18.0 + +* NEW: All unit and integration tests are now running on CI using SauceLabs, to ensure everything is working correctly on all browsers https://github.com/getsentry/raven-js/pull/1026 +* NEW: `console.assert` is now instrumented in the same way as the rest of `console` methods https://github.com/getsentry/raven-js/pull/1044 +* NEW: Vue.js plugin now provides `lifecycleHook` as the 3rd argument to error handler, to make it in line with v2.2.0 implementation https://github.com/getsentry/raven-js/pull/1053 +* NEW: Updated Errors serialization to store all additional properties and allow for attaching other object instances directly to it https://github.com/getsentry/raven-js/pull/1060 +* NEW: Included exception type in `ignoreErrors` test, which allows for filtering based on error types https://github.com/getsentry/raven-js/pull/1057 +* CHANGE: Raven.js now uses Prettier to format it's code https://github.com/getsentry/raven-js/pull/1020 +* CHANGE: Unit tests are using Headless Chrome instead of PhantomJS https://github.com/getsentry/raven-js/pull/1029 +* CHANGE: Added `setDSN` typing definition for TypeScript https://github.com/getsentry/raven-js/pull/995 +* BUGFIX: Defend against undefined `XMLHttpRequest` while sending events https://github.com/getsentry/raven-js/pull/1024 +* BUGFIX: `lastEventId` won't be overriden when an event was dropped https://github.com/getsentry/raven-js/pull/1041 +* BUGFIX: Make sure that `document` is available before reading `location` https://github.com/getsentry/raven-js/pull/1038 +* BUGFIX: Prevent breadcrumbs with undefined url to throw an error https://github.com/getsentry/raven-js/pull/1018 + ## 3.17.0 * CHANGE: Export TypeScript definitions as a CommonJS module. See: https://github.com/getsentry/raven-js/pull/977 diff --git a/bower.json b/bower.json index b8dbe12f2cdd..ead5d3cdae2c 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "raven-js", - "version": "3.17.0", + "version": "3.18.0", "dependencies": {}, "main": "dist/raven.js", "ignore": [ diff --git a/dist/plugins/angular.js b/dist/plugins/angular.js index 71d846c55baa..499a2bbba9f8 100644 --- a/dist/plugins/angular.js +++ b/dist/plugins/angular.js @@ -1,4 +1,4 @@ -/*! Raven.js 3.17.0 (6384830) | github.com/getsentry/raven-js */ +/*! Raven.js 3.18.0 (b771bb2) | github.com/getsentry/raven-js */ /* * Includes TraceKit @@ -10,115 +10,186 @@ * */ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g=(g.Raven||(g.Raven = {}));g=(g.Plugins||(g.Plugins = {}));g.Angular = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o' : 'anonymous component') + - (vm._isVue && vm.$options.__file ? ' at ' + vm.$options.__file : '') -} - -function vuePlugin(Raven, Vue) { - Vue = Vue || window.Vue; - - // quit if Vue isn't on the page - if (!Vue || !Vue.config) return; - - var _oldOnError = Vue.config.errorHandler; - Vue.config.errorHandler = function VueErrorHandler(error, vm) { - Raven.captureException(error, { - extra: { - componentName: formatComponentName(vm), - propsData: vm.$options.propsData + function formatComponentName(vm) { + if (vm.$root === vm) { + return 'root instance'; + } + var name = vm._isVue + ? vm.$options.name || vm.$options._componentTag + : vm.name; + return ( + (name ? 'component <' + name + '>' : 'anonymous component') + + (vm._isVue && vm.$options.__file ? ' at ' + vm.$options.__file : '') + ); } - }); - if (typeof _oldOnError === 'function') { - _oldOnError.call(this, error, vm); - } - }; -} + function vuePlugin(Raven, Vue) { + Vue = Vue || window.Vue; -module.exports = vuePlugin; + // quit if Vue isn't on the page + if (!Vue || !Vue.config) return; + var _oldOnError = Vue.config.errorHandler; + Vue.config.errorHandler = function VueErrorHandler(error, vm, info) { + var metaData = { + componentName: formatComponentName(vm), + propsData: vm.$options.propsData + }; + + // lifecycleHook is not always available + if (typeof info !== 'undefined') { + metaData.lifecycleHook = info; + } + + Raven.captureException(error, { + extra: metaData + }); + + if (typeof _oldOnError === 'function') { + _oldOnError.call(this, error, vm, info); + } + }; + } -},{}]},{},[1])(1) -}); \ No newline at end of file + module.exports = vuePlugin; + }, + {} + ] + }, + {}, + [1] + )(1); +}); diff --git a/dist/plugins/vue.min.js b/dist/plugins/vue.min.js index 3cf504846c4d..d96f064b94ac 100644 --- a/dist/plugins/vue.min.js +++ b/dist/plugins/vue.min.js @@ -1,3 +1,80 @@ -/*! Raven.js 3.17.0 (6384830) | github.com/getsentry/raven-js */ -!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b=b.Raven||(b.Raven={}),b=b.Plugins||(b.Plugins={}),b.Vue=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g":"anonymous component")+(a._isVue&&a.$options.__file?" at "+a.$options.__file:"")}function e(a,b){if(b=b||window.Vue,b&&b.config){var c=b.config.errorHandler;b.config.errorHandler=function(b,e){a.captureException(b,{extra:{componentName:d(e),propsData:e.$options.propsData}}),"function"==typeof c&&c.call(this,b,e)}}}b.exports=e},{}]},{},[1])(1)}); -//# sourceMappingURL=vue.min.js.map \ No newline at end of file +/*! Raven.js 3.18.0 (b771bb2) | github.com/getsentry/raven-js */ +!(function(a) { + if ('object' == typeof exports && 'undefined' != typeof module) module.exports = a(); + else if ('function' == typeof define && define.amd) define([], a); + else { + var b; + (b = + 'undefined' != typeof window + ? window + : 'undefined' != typeof global + ? global + : 'undefined' != typeof self ? self : this), + (b = b.Raven || (b.Raven = {})), + (b = b.Plugins || (b.Plugins = {})), + (b.Vue = a()); + } +})(function() { + return (function a(b, c, d) { + function e(g, h) { + if (!c[g]) { + if (!b[g]) { + var i = 'function' == typeof require && require; + if (!h && i) return i(g, !0); + if (f) return f(g, !0); + var j = new Error("Cannot find module '" + g + "'"); + throw ((j.code = 'MODULE_NOT_FOUND'), j); + } + var k = (c[g] = {exports: {}}); + b[g][0].call( + k.exports, + function(a) { + var c = b[g][1][a]; + return e(c ? c : a); + }, + k, + k.exports, + a, + b, + c, + d + ); + } + return c[g].exports; + } + for (var f = 'function' == typeof require && require, g = 0; g < d.length; g++) + e(d[g]); + return e; + })( + { + 1: [ + function(a, b, c) { + function d(a) { + if (a.$root === a) return 'root instance'; + var b = a._isVue ? a.$options.name || a.$options._componentTag : a.name; + return ( + (b ? 'component <' + b + '>' : 'anonymous component') + + (a._isVue && a.$options.__file ? ' at ' + a.$options.__file : '') + ); + } + function e(a, b) { + if (((b = b || window.Vue), b && b.config)) { + var c = b.config.errorHandler; + b.config.errorHandler = function(b, e, f) { + var g = {componentName: d(e), propsData: e.$options.propsData}; + 'undefined' != typeof f && (g.lifecycleHook = f), + a.captureException(b, {extra: g}), + 'function' == typeof c && c.call(this, b, e, f); + }; + } + } + b.exports = e; + }, + {} + ] + }, + {}, + [1] + )(1); +}); +//# sourceMappingURL=vue.min.js.map diff --git a/dist/plugins/vue.min.js.map b/dist/plugins/vue.min.js.map index 5c3ef99ecc6f..dd0106322507 100644 --- a/dist/plugins/vue.min.js.map +++ b/dist/plugins/vue.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["vue.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","Raven","Plugins","Vue","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","_dereq_","formatComponentName","vm","$root","name","_isVue","$options","_componentTag","__file","vuePlugin","config","_oldOnError","errorHandler","error","captureException","extra","componentName","propsData"],"mappings":";CAYA,SAAUA,GAAG,GAAoB,gBAAVC,UAAoC,mBAATC,QAAsBA,OAAOD,QAAQD,QAAS,IAAmB,kBAATG,SAAqBA,OAAOC,IAAKD,UAAUH,OAAO,CAAC,GAAIK,EAAkCA,GAAb,mBAATC,QAAwBA,OAA+B,mBAATC,QAAwBA,OAA6B,mBAAPC,MAAsBA,KAAYC,KAAKJ,EAAGA,EAAEK,QAAQL,EAAEK,UAAaL,EAAGA,EAAEM,UAAUN,EAAEM,YAAeN,EAAEO,IAAMZ,MAAO,WAAqC,MAAO,SAAUa,GAAEC,EAAEC,EAAEC,GAAG,QAASC,GAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,GAAIE,GAAkB,kBAATC,UAAqBA,OAAQ,KAAIF,GAAGC,EAAE,MAAOA,GAAEF,GAAE,EAAI,IAAGI,EAAE,MAAOA,GAAEJ,GAAE,EAAI,IAAIlB,GAAE,GAAIuB,OAAM,uBAAuBL,EAAE,IAAK,MAAMlB,GAAEwB,KAAK,mBAAmBxB,EAAE,GAAIyB,GAAEV,EAAEG,IAAIjB,WAAYa,GAAEI,GAAG,GAAGQ,KAAKD,EAAExB,QAAQ,SAASY,GAAG,GAAIE,GAAED,EAAEI,GAAG,GAAGL,EAAG,OAAOI,GAAEF,EAAEA,EAAEF,IAAIY,EAAEA,EAAExB,QAAQY,EAAEC,EAAEC,EAAEC,GAAG,MAAOD,GAAEG,GAAGjB,QAAkD,IAAI,GAA1CqB,GAAkB,kBAATD,UAAqBA,QAAgBH,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,GAAI,OAAOD,KAAKW,GAAG,SAASC,EAAQ3B,EAAOD,GAK93B,YAEA,SAAS6B,GAAqBC,GAC1B,GAAIA,EAAGC,QAAUD,EACb,MAAO,eAEX,IAAIE,GAAOF,EAAGG,OACRH,EAAGI,SAASF,MAAQF,EAAGI,SAASC,cAChCL,EAAGE,IACT,QAAQA,EAAO,cAAgBA,EAAO,IAAM,wBACvCF,EAAGG,QAAUH,EAAGI,SAASE,OAAS,OAASN,EAAGI,SAASE,OAAU,IAG1E,QAASC,GAAU5B,EAAOE,GAItB,GAHAA,EAAMA,GAAON,OAAOM,IAGfA,GAAQA,EAAI2B,OAAjB,CAEA,GAAIC,GAAc5B,EAAI2B,OAAOE,YAC7B7B,GAAI2B,OAAOE,aAAe,SAAyBC,EAAOX,GACtDrB,EAAMiC,iBAAiBD,GACrBE,OACEC,cAAef,EAAoBC,GACnCe,UAAWf,EAAGI,SAASW,aAIA,kBAAhBN,IACPA,EAAYd,KAAKjB,KAAMiC,EAAOX,KAK1C7B,EAAOD,QAAUqC,YAGN,IAAI","file":"vue.min.js"} \ No newline at end of file +{"version":3,"sources":["vue.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","Raven","Plugins","Vue","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","_dereq_","formatComponentName","vm","$root","name","_isVue","$options","_componentTag","__file","vuePlugin","config","_oldOnError","errorHandler","error","info","metaData","componentName","propsData","lifecycleHook","captureException","extra"],"mappings":";CAYA,SAAUA,GAAG,GAAoB,gBAAVC,UAAoC,mBAATC,QAAsBA,OAAOD,QAAQD,QAAS,IAAmB,kBAATG,SAAqBA,OAAOC,IAAKD,UAAUH,OAAO,CAAC,GAAIK,EAAkCA,GAAb,mBAATC,QAAwBA,OAA+B,mBAATC,QAAwBA,OAA6B,mBAAPC,MAAsBA,KAAYC,KAAKJ,EAAGA,EAAEK,QAAQL,EAAEK,UAAaL,EAAGA,EAAEM,UAAUN,EAAEM,YAAeN,EAAEO,IAAMZ,MAAO,WAAqC,MAAO,SAAUa,GAAEC,EAAEC,EAAEC,GAAG,QAASC,GAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,GAAIE,GAAkB,kBAATC,UAAqBA,OAAQ,KAAIF,GAAGC,EAAE,MAAOA,GAAEF,GAAE,EAAI,IAAGI,EAAE,MAAOA,GAAEJ,GAAE,EAAI,IAAIlB,GAAE,GAAIuB,OAAM,uBAAuBL,EAAE,IAAK,MAAMlB,GAAEwB,KAAK,mBAAmBxB,EAAE,GAAIyB,GAAEV,EAAEG,IAAIjB,WAAYa,GAAEI,GAAG,GAAGQ,KAAKD,EAAExB,QAAQ,SAASY,GAAG,GAAIE,GAAED,EAAEI,GAAG,GAAGL,EAAG,OAAOI,GAAEF,EAAEA,EAAEF,IAAIY,EAAEA,EAAExB,QAAQY,EAAEC,EAAEC,EAAEC,GAAG,MAAOD,GAAEG,GAAGjB,QAAkD,IAAI,GAA1CqB,GAAkB,kBAATD,UAAqBA,QAAgBH,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,GAAI,OAAOD,KAAKW,GAAG,SAASC,EAAQ3B,EAAOD,GAM93B,QAAS6B,GAAoBC,GAC3B,GAAIA,EAAGC,QAAUD,EACf,MAAO,eAET,IAAIE,GAAOF,EAAGG,OAASH,EAAGI,SAASF,MAAQF,EAAGI,SAASC,cAAgBL,EAAGE,IAC1E,QACGA,EAAO,cAAgBA,EAAO,IAAM,wBACpCF,EAAGG,QAAUH,EAAGI,SAASE,OAAS,OAASN,EAAGI,SAASE,OAAS,IAIrE,QAASC,GAAU5B,EAAOE,GAIxB,GAHAA,EAAMA,GAAON,OAAOM,IAGfA,GAAQA,EAAI2B,OAAjB,CAEA,GAAIC,GAAc5B,EAAI2B,OAAOE,YAC7B7B,GAAI2B,OAAOE,aAAe,SAAyBC,EAAOX,EAAIY,GAC5D,GAAIC,IACFC,cAAef,EAAoBC,GACnCe,UAAWf,EAAGI,SAASW,UAIL,oBAATH,KACTC,EAASG,cAAgBJ,GAG3BjC,EAAMsC,iBAAiBN,GACrBO,MAAOL,IAGkB,kBAAhBJ,IACTA,EAAYd,KAAKjB,KAAMiC,EAAOX,EAAIY,KAKxCzC,EAAOD,QAAUqC,YAEN,IAAI","file":"vue.min.js"} \ No newline at end of file diff --git a/dist/raven.js b/dist/raven.js index b453c3e08052..591b6767651b 100644 --- a/dist/raven.js +++ b/dist/raven.js @@ -1,4 +1,4 @@ -/*! Raven.js 3.17.0 (6384830) | github.com/getsentry/raven-js */ +/*! Raven.js 3.18.0 (b771bb2) | github.com/getsentry/raven-js */ /* * Includes TraceKit @@ -10,243 +10,322 @@ * */ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Raven = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o this._globalOptions.maxBreadcrumbs) { - this._breadcrumbs.shift(); - } - return this; - }, + this._breadcrumbs.push(crumb); + if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) { + this._breadcrumbs.shift(); + } + return this; + }, - addPlugin: function(plugin /*arg1, arg2, ... argN*/) { - var pluginArgs = [].slice.call(arguments, 1); + addPlugin: function(plugin /*arg1, arg2, ... argN*/) { + var pluginArgs = [].slice.call(arguments, 1); - this._plugins.push([plugin, pluginArgs]); - if (this._isRavenInstalled) { - this._drainPlugins(); - } + this._plugins.push([plugin, pluginArgs]); + if (this._isRavenInstalled) { + this._drainPlugins(); + } - return this; - }, + return this; + }, - /* + /* * Set/clear a user to be sent along with the payload. * * @param {object} user An object representing user data [optional] * @return {Raven} */ - setUserContext: function(user) { - // Intentionally do not merge here since that's an unexpected behavior. - this._globalContext.user = user; + setUserContext: function(user) { + // Intentionally do not merge here since that's an unexpected behavior. + this._globalContext.user = user; - return this; - }, + return this; + }, - /* + /* * Merge extra attributes to be sent along with the payload. * * @param {object} extra An object representing extra data [optional] * @return {Raven} */ - setExtraContext: function(extra) { - this._mergeContext('extra', extra); + setExtraContext: function(extra) { + this._mergeContext('extra', extra); - return this; - }, + return this; + }, - /* + /* * Merge tags to be sent along with the payload. * * @param {object} tags An object representing tags [optional] * @return {Raven} */ - setTagsContext: function(tags) { - this._mergeContext('tags', tags); + setTagsContext: function(tags) { + this._mergeContext('tags', tags); - return this; - }, + return this; + }, - /* + /* * Clear all of the context. * * @return {Raven} */ - clearContext: function() { - this._globalContext = {}; + clearContext: function() { + this._globalContext = {}; - return this; - }, + return this; + }, - /* + /* * Get a copy of the current context. This cannot be mutated. * * @return {object} copy of context */ - getContext: function() { - // lol javascript - return JSON.parse(stringify(this._globalContext)); - }, - + getContext: function() { + // lol javascript + return JSON.parse(stringify(this._globalContext)); + }, - /* + /* * Set environment of application * * @param {string} environment Typically something like 'production'. * @return {Raven} */ - setEnvironment: function(environment) { - this._globalOptions.environment = environment; + setEnvironment: function(environment) { + this._globalOptions.environment = environment; - return this; - }, + return this; + }, - /* + /* * Set release version of application * * @param {string} release Typically something like a git SHA to identify version * @return {Raven} */ - setRelease: function(release) { - this._globalOptions.release = release; + setRelease: function(release) { + this._globalOptions.release = release; - return this; - }, + return this; + }, - /* + /* * Set the dataCallback option * * @param {function} callback The callback to run which allows the * data blob to be mutated before sending * @return {Raven} */ - setDataCallback: function(callback) { - var original = this._globalOptions.dataCallback; - this._globalOptions.dataCallback = - keepOriginalCallback(original, callback); - return this; - }, + setDataCallback: function(callback) { + var original = this._globalOptions.dataCallback; + this._globalOptions.dataCallback = keepOriginalCallback( + original, + callback + ); + return this; + }, - /* + /* * Set the breadcrumbCallback option * * @param {function} callback The callback to run which allows filtering * or mutating breadcrumbs * @return {Raven} */ - setBreadcrumbCallback: function(callback) { - var original = this._globalOptions.breadcrumbCallback; - this._globalOptions.breadcrumbCallback = - keepOriginalCallback(original, callback); - return this; - }, + setBreadcrumbCallback: function(callback) { + var original = this._globalOptions.breadcrumbCallback; + this._globalOptions.breadcrumbCallback = keepOriginalCallback( + original, + callback + ); + return this; + }, - /* + /* * Set the shouldSendCallback option * * @param {function} callback The callback to run which allows * introspecting the blob before sending * @return {Raven} */ - setShouldSendCallback: function(callback) { - var original = this._globalOptions.shouldSendCallback; - this._globalOptions.shouldSendCallback = - keepOriginalCallback(original, callback); - return this; - }, + setShouldSendCallback: function(callback) { + var original = this._globalOptions.shouldSendCallback; + this._globalOptions.shouldSendCallback = keepOriginalCallback( + original, + callback + ); + return this; + }, - /** + /** * Override the default HTTP transport mechanism that transmits data * to the Sentry server. * @@ -687,368 +798,438 @@ Raven.prototype = { * * @return {Raven} */ - setTransport: function(transport) { - this._globalOptions.transport = transport; + setTransport: function(transport) { + this._globalOptions.transport = transport; - return this; - }, + return this; + }, - /* + /* * Get the latest raw exception that was captured by Raven. * * @return {error} */ - lastException: function() { - return this._lastCapturedException; - }, + lastException: function() { + return this._lastCapturedException; + }, - /* + /* * Get the last event id * * @return {string} */ - lastEventId: function() { - return this._lastEventId; - }, + lastEventId: function() { + return this._lastEventId; + }, - /* + /* * Determine if Raven is setup and ready to go. * * @return {boolean} */ - isSetup: function() { - if (!this._hasJSON) return false; // needs JSON support - if (!this._globalServer) { - if (!this.ravenNotConfiguredError) { - this.ravenNotConfiguredError = true; - this._logDebug('error', 'Error: Raven has not been configured.'); - } - return false; - } - return true; - }, - - afterLoad: function () { - // TODO: remove window dependence? + isSetup: function() { + if (!this._hasJSON) return false; // needs JSON support + if (!this._globalServer) { + if (!this.ravenNotConfiguredError) { + this.ravenNotConfiguredError = true; + this._logDebug('error', 'Error: Raven has not been configured.'); + } + return false; + } + return true; + }, - // Attempt to initialize Raven on load - var RavenConfig = _window.RavenConfig; - if (RavenConfig) { - this.config(RavenConfig.dsn, RavenConfig.config).install(); - } - }, + afterLoad: function() { + // TODO: remove window dependence? - showReportDialog: function (options) { - if (!_document) // doesn't work without a document (React native) - return; + // Attempt to initialize Raven on load + var RavenConfig = _window.RavenConfig; + if (RavenConfig) { + this.config(RavenConfig.dsn, RavenConfig.config).install(); + } + }, - options = options || {}; + showReportDialog: function(options) { + if ( + !_document // doesn't work without a document (React native) + ) + return; - var lastEventId = options.eventId || this.lastEventId(); - if (!lastEventId) { - throw new RavenConfigError('Missing eventId'); - } + options = options || {}; - var dsn = options.dsn || this._dsn; - if (!dsn) { - throw new RavenConfigError('Missing DSN'); - } - - var encode = encodeURIComponent; - var qs = ''; - qs += '?eventId=' + encode(lastEventId); - qs += '&dsn=' + encode(dsn); + var lastEventId = options.eventId || this.lastEventId(); + if (!lastEventId) { + throw new RavenConfigError('Missing eventId'); + } - var user = options.user || this._globalContext.user; - if (user) { - if (user.name) qs += '&name=' + encode(user.name); - if (user.email) qs += '&email=' + encode(user.email); - } + var dsn = options.dsn || this._dsn; + if (!dsn) { + throw new RavenConfigError('Missing DSN'); + } - var globalServer = this._getGlobalServer(this._parseDSN(dsn)); + var encode = encodeURIComponent; + var qs = ''; + qs += '?eventId=' + encode(lastEventId); + qs += '&dsn=' + encode(dsn); - var script = _document.createElement('script'); - script.async = true; - script.src = globalServer + '/api/embed/error-page/' + qs; - (_document.head || _document.body).appendChild(script); - }, + var user = options.user || this._globalContext.user; + if (user) { + if (user.name) qs += '&name=' + encode(user.name); + if (user.email) qs += '&email=' + encode(user.email); + } - /**** Private functions ****/ - _ignoreNextOnError: function () { - var self = this; - this._ignoreOnError += 1; - setTimeout(function () { - // onerror should trigger before setTimeout - self._ignoreOnError -= 1; - }); - }, + var globalServer = this._getGlobalServer(this._parseDSN(dsn)); + + var script = _document.createElement('script'); + script.async = true; + script.src = globalServer + '/api/embed/error-page/' + qs; + (_document.head || _document.body).appendChild(script); + }, + + /**** Private functions ****/ + _ignoreNextOnError: function() { + var self = this; + this._ignoreOnError += 1; + setTimeout(function() { + // onerror should trigger before setTimeout + self._ignoreOnError -= 1; + }); + }, - _triggerEvent: function(eventType, options) { - // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it - var evt, key; + _triggerEvent: function(eventType, options) { + // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it + var evt, key; - if (!this._hasDocument) - return; + if (!this._hasDocument) return; - options = options || {}; + options = options || {}; - eventType = 'raven' + eventType.substr(0,1).toUpperCase() + eventType.substr(1); + eventType = + 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1); - if (_document.createEvent) { - evt = _document.createEvent('HTMLEvents'); - evt.initEvent(eventType, true, true); - } else { - evt = _document.createEventObject(); - evt.eventType = eventType; - } + if (_document.createEvent) { + evt = _document.createEvent('HTMLEvents'); + evt.initEvent(eventType, true, true); + } else { + evt = _document.createEventObject(); + evt.eventType = eventType; + } - for (key in options) if (hasKey(options, key)) { - evt[key] = options[key]; - } + for (key in options) + if (hasKey(options, key)) { + evt[key] = options[key]; + } - if (_document.createEvent) { - // IE9 if standards - _document.dispatchEvent(evt); - } else { - // IE8 regardless of Quirks or Standards - // IE9 if quirks - try { - _document.fireEvent('on' + evt.eventType.toLowerCase(), evt); - } catch(e) { - // Do nothing - } - } - }, + if (_document.createEvent) { + // IE9 if standards + _document.dispatchEvent(evt); + } else { + // IE8 regardless of Quirks or Standards + // IE9 if quirks + try { + _document.fireEvent('on' + evt.eventType.toLowerCase(), evt); + } catch (e) { + // Do nothing + } + } + }, - /** + /** * Wraps addEventListener to capture UI breadcrumbs * @param evtName the event name (e.g. "click") * @returns {Function} * @private */ - _breadcrumbEventHandler: function(evtName) { - var self = this; - return function (evt) { - // reset keypress timeout; e.g. triggering a 'click' after - // a 'keypress' will reset the keypress debounce so that a new - // set of keypresses can be recorded - self._keypressTimeout = null; - - // It's possible this handler might trigger multiple times for the same - // event (e.g. event propagation through node ancestors). Ignore if we've - // already captured the event. - if (self._lastCapturedEvent === evt) - return; - - self._lastCapturedEvent = evt; - - // try/catch both: - // - accessing evt.target (see getsentry/raven-js#838, #768) - // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly - // can throw an exception in some circumstances. - var target; - try { - target = htmlTreeAsString(evt.target); - } catch (e) { - target = ''; - } - - self.captureBreadcrumb({ - category: 'ui.' + evtName, // e.g. ui.click, ui.input - message: target - }); - }; - }, + _breadcrumbEventHandler: function(evtName) { + var self = this; + return function(evt) { + // reset keypress timeout; e.g. triggering a 'click' after + // a 'keypress' will reset the keypress debounce so that a new + // set of keypresses can be recorded + self._keypressTimeout = null; + + // It's possible this handler might trigger multiple times for the same + // event (e.g. event propagation through node ancestors). Ignore if we've + // already captured the event. + if (self._lastCapturedEvent === evt) return; + + self._lastCapturedEvent = evt; + + // try/catch both: + // - accessing evt.target (see getsentry/raven-js#838, #768) + // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly + // can throw an exception in some circumstances. + var target; + try { + target = htmlTreeAsString(evt.target); + } catch (e) { + target = ''; + } + + self.captureBreadcrumb({ + category: 'ui.' + evtName, // e.g. ui.click, ui.input + message: target + }); + }; + }, - /** + /** * Wraps addEventListener to capture keypress UI events * @returns {Function} * @private */ - _keypressEventHandler: function() { - var self = this, - debounceDuration = 1000; // milliseconds - - // TODO: if somehow user switches keypress target before - // debounce timeout is triggered, we will only capture - // a single breadcrumb from the FIRST target (acceptable?) - return function (evt) { - var target; - try { - target = evt.target; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - var tagName = target && target.tagName; - - // only consider keypress events on actual input elements - // this will disregard keypresses targeting body (e.g. tabbing - // through elements, hotkeys, etc) - if (!tagName || tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) - return; - - // record first keypress in a series, but ignore subsequent - // keypresses until debounce clears - var timeout = self._keypressTimeout; - if (!timeout) { - self._breadcrumbEventHandler('input')(evt); - } - clearTimeout(timeout); - self._keypressTimeout = setTimeout(function () { - self._keypressTimeout = null; - }, debounceDuration); - }; - }, + _keypressEventHandler: function() { + var self = this, + debounceDuration = 1000; // milliseconds + + // TODO: if somehow user switches keypress target before + // debounce timeout is triggered, we will only capture + // a single breadcrumb from the FIRST target (acceptable?) + return function(evt) { + var target; + try { + target = evt.target; + } catch (e) { + // just accessing event properties can throw an exception in some rare circumstances + // see: https://github.com/getsentry/raven-js/issues/838 + return; + } + var tagName = target && target.tagName; + + // only consider keypress events on actual input elements + // this will disregard keypresses targeting body (e.g. tabbing + // through elements, hotkeys, etc) + if ( + !tagName || + (tagName !== 'INPUT' && + tagName !== 'TEXTAREA' && + !target.isContentEditable) + ) + return; + + // record first keypress in a series, but ignore subsequent + // keypresses until debounce clears + var timeout = self._keypressTimeout; + if (!timeout) { + self._breadcrumbEventHandler('input')(evt); + } + clearTimeout(timeout); + self._keypressTimeout = setTimeout(function() { + self._keypressTimeout = null; + }, debounceDuration); + }; + }, - /** + /** * Captures a breadcrumb of type "navigation", normalizing input URLs * @param to the originating URL * @param from the target URL * @private */ - _captureUrlChange: function(from, to) { - var parsedLoc = parseUrl(this._location.href); - var parsedTo = parseUrl(to); - var parsedFrom = parseUrl(from); - - // because onpopstate only tells you the "new" (to) value of location.href, and - // not the previous (from) value, we need to track the value of the current URL - // state ourselves - this._lastHref = to; - - // Use only the path component of the URL if the URL matches the current - // document (almost all the time when using pushState) - if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) - to = parsedTo.relative; - if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) - from = parsedFrom.relative; - - this.captureBreadcrumb({ - category: 'navigation', - data: { - to: to, - from: from - } - }); - }, + _captureUrlChange: function(from, to) { + var parsedLoc = parseUrl(this._location.href); + var parsedTo = parseUrl(to); + var parsedFrom = parseUrl(from); + + // because onpopstate only tells you the "new" (to) value of location.href, and + // not the previous (from) value, we need to track the value of the current URL + // state ourselves + this._lastHref = to; + + // Use only the path component of the URL if the URL matches the current + // document (almost all the time when using pushState) + if ( + parsedLoc.protocol === parsedTo.protocol && + parsedLoc.host === parsedTo.host + ) + to = parsedTo.relative; + if ( + parsedLoc.protocol === parsedFrom.protocol && + parsedLoc.host === parsedFrom.host + ) + from = parsedFrom.relative; + + this.captureBreadcrumb({ + category: 'navigation', + data: { + to: to, + from: from + } + }); + }, - /** + /** * Wrap timer functions and event targets to catch errors and provide * better metadata. */ - _instrumentTryCatch: function() { - var self = this; + _instrumentTryCatch: function() { + var self = this; - var wrappedBuiltIns = self._wrappedBuiltIns; + var wrappedBuiltIns = self._wrappedBuiltIns; - function wrapTimeFn(orig) { - return function (fn, t) { // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for(var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - var originalCallback = args[0]; - if (isFunction(originalCallback)) { - args[0] = self.wrap(originalCallback); - } + function wrapTimeFn(orig) { + return function(fn, t) { + // preserve arity + // Make a copy of the arguments to prevent deoptimization + // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments + var args = new Array(arguments.length); + for (var i = 0; i < args.length; ++i) { + args[i] = arguments[i]; + } + var originalCallback = args[0]; + if (isFunction(originalCallback)) { + args[0] = self.wrap(originalCallback); + } - // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it - // also supports only two arguments and doesn't care what this is, so we - // can just call the original function directly. - if (orig.apply) { - return orig.apply(this, args); - } else { - return orig(args[0], args[1]); + // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it + // also supports only two arguments and doesn't care what this is, so we + // can just call the original function directly. + if (orig.apply) { + return orig.apply(this, args); + } else { + return orig(args[0], args[1]); + } + }; } - }; - } - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - function wrapEventTarget(global) { - var proto = _window[global] && _window[global].prototype; - if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) { - fill(proto, 'addEventListener', function(orig) { - return function (evtName, fn, capture, secure) { // preserve arity - try { + var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; + + function wrapEventTarget(global) { + var proto = _window[global] && _window[global].prototype; + if ( + proto && + proto.hasOwnProperty && + proto.hasOwnProperty('addEventListener') + ) { + fill( + proto, + 'addEventListener', + function(orig) { + return function(evtName, fn, capture, secure) { + // preserve arity + try { if (fn && fn.handleEvent) { - fn.handleEvent = self.wrap(fn.handleEvent); + fn.handleEvent = self.wrap(fn.handleEvent); } - } catch (err) { + } catch (err) { // can sometimes get 'Permission denied to access property "handle Event' - } + } - // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs` - // so that we don't have more than one wrapper function - var before, - clickHandler, - keypressHandler; + // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs` + // so that we don't have more than one wrapper function + var before, clickHandler, keypressHandler; - if (autoBreadcrumbs && autoBreadcrumbs.dom && (global === 'EventTarget' || global === 'Node')) { + if ( + autoBreadcrumbs && + autoBreadcrumbs.dom && + (global === 'EventTarget' || global === 'Node') + ) { // NOTE: generating multiple handlers per addEventListener invocation, should // revisit and verify we can just use one (almost certainly) clickHandler = self._breadcrumbEventHandler('click'); keypressHandler = self._keypressEventHandler(); - before = function (evt) { - // need to intercept every DOM event in `before` argument, in case that - // same wrapped method is re-used for different events (e.g. mousemove THEN click) - // see #724 - if (!evt) return; - - var eventType; - try { - eventType = evt.type - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - if (eventType === 'click') - return clickHandler(evt); - else if (eventType === 'keypress') - return keypressHandler(evt); + before = function(evt) { + // need to intercept every DOM event in `before` argument, in case that + // same wrapped method is re-used for different events (e.g. mousemove THEN click) + // see #724 + if (!evt) return; + + var eventType; + try { + eventType = evt.type; + } catch (e) { + // just accessing event properties can throw an exception in some rare circumstances + // see: https://github.com/getsentry/raven-js/issues/838 + return; + } + if (eventType === 'click') return clickHandler(evt); + else if (eventType === 'keypress') + return keypressHandler(evt); }; - } - return orig.call(this, evtName, self.wrap(fn, undefined, before), capture, secure); - }; - }, wrappedBuiltIns); - fill(proto, 'removeEventListener', function (orig) { - return function (evt, fn, capture, secure) { - try { - fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn); - } catch (e) { + } + return orig.call( + this, + evtName, + self.wrap(fn, undefined, before), + capture, + secure + ); + }; + }, + wrappedBuiltIns + ); + fill( + proto, + 'removeEventListener', + function(orig) { + return function(evt, fn, capture, secure) { + try { + fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn); + } catch (e) { // ignore, accessing __raven_wrapper__ will throw in some Selenium environments - } - return orig.call(this, evt, fn, capture, secure); - }; - }, wrappedBuiltIns); - } - } - - fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns); - fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns); - if (_window.requestAnimationFrame) { - fill(_window, 'requestAnimationFrame', function (orig) { - return function (cb) { - return orig(self.wrap(cb)); - }; - }, wrappedBuiltIns); - } + } + return orig.call(this, evt, fn, capture, secure); + }; + }, + wrappedBuiltIns + ); + } + } - // event targets borrowed from bugsnag-js: - // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666 - var eventTargets = ['EventTarget', 'Window', 'Node', 'ApplicationCache', 'AudioTrackList', 'ChannelMergerNode', 'CryptoOperation', 'EventSource', 'FileReader', 'HTMLUnknownElement', 'IDBDatabase', 'IDBRequest', 'IDBTransaction', 'KeyOperation', 'MediaController', 'MessagePort', 'ModalWindow', 'Notification', 'SVGElementInstance', 'Screen', 'TextTrack', 'TextTrackCue', 'TextTrackList', 'WebSocket', 'WebSocketWorker', 'Worker', 'XMLHttpRequest', 'XMLHttpRequestEventTarget', 'XMLHttpRequestUpload']; - for (var i = 0; i < eventTargets.length; i++) { - wrapEventTarget(eventTargets[i]); - } - }, + fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns); + fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns); + if (_window.requestAnimationFrame) { + fill( + _window, + 'requestAnimationFrame', + function(orig) { + return function(cb) { + return orig(self.wrap(cb)); + }; + }, + wrappedBuiltIns + ); + } + // event targets borrowed from bugsnag-js: + // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666 + var eventTargets = [ + 'EventTarget', + 'Window', + 'Node', + 'ApplicationCache', + 'AudioTrackList', + 'ChannelMergerNode', + 'CryptoOperation', + 'EventSource', + 'FileReader', + 'HTMLUnknownElement', + 'IDBDatabase', + 'IDBRequest', + 'IDBTransaction', + 'KeyOperation', + 'MediaController', + 'MessagePort', + 'ModalWindow', + 'Notification', + 'SVGElementInstance', + 'Screen', + 'TextTrack', + 'TextTrackCue', + 'TextTrackList', + 'WebSocket', + 'WebSocketWorker', + 'Worker', + 'XMLHttpRequest', + 'XMLHttpRequestEventTarget', + 'XMLHttpRequestUpload' + ]; + for (var i = 0; i < eventTargets.length; i++) { + wrapEventTarget(eventTargets[i]); + } + }, - /** + /** * Instrument browser built-ins w/ breadcrumb capturing * - XMLHttpRequests * - DOM interactions (click/typing) @@ -1057,795 +1238,910 @@ Raven.prototype = { * * Can be disabled or individually configured via the `autoBreadcrumbs` config option */ - _instrumentBreadcrumbs: function () { - var self = this; - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapProp(prop, xhr) { - if (prop in xhr && isFunction(xhr[prop])) { - fill(xhr, prop, function (orig) { - return self.wrap(orig); - }); // intentionally don't track filled methods on XHR instances - } - } - - if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) { - var xhrproto = XMLHttpRequest.prototype; - fill(xhrproto, 'open', function(origOpen) { - return function (method, url) { // preserve arity + _instrumentBreadcrumbs: function() { + var self = this; + var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; + + var wrappedBuiltIns = self._wrappedBuiltIns; + + function wrapProp(prop, xhr) { + if (prop in xhr && isFunction(xhr[prop])) { + fill(xhr, prop, function(orig) { + return self.wrap(orig); + }); // intentionally don't track filled methods on XHR instances + } + } - // if Sentry key appears in URL, don't capture - if (isString(url) && url.indexOf(self._globalKey) === -1) { - this.__raven_xhr = { + if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) { + var xhrproto = XMLHttpRequest.prototype; + fill( + xhrproto, + 'open', + function(origOpen) { + return function(method, url) { + // preserve arity + + // if Sentry key appears in URL, don't capture + if (isString(url) && url.indexOf(self._globalKey) === -1) { + this.__raven_xhr = { method: method, url: url, status_code: null - }; - } - - return origOpen.apply(this, arguments); - }; - }, wrappedBuiltIns); - - fill(xhrproto, 'send', function(origSend) { - return function (data) { // preserve arity - var xhr = this; + }; + } - function onreadystatechangeHandler() { - if (xhr.__raven_xhr && (xhr.readyState === 1 || xhr.readyState === 4)) { + return origOpen.apply(this, arguments); + }; + }, + wrappedBuiltIns + ); + + fill( + xhrproto, + 'send', + function(origSend) { + return function(data) { + // preserve arity + var xhr = this; + + function onreadystatechangeHandler() { + if (xhr.__raven_xhr && xhr.readyState === 4) { try { - // touching statusCode in some platforms throws - // an exception - xhr.__raven_xhr.status_code = xhr.status; - } catch (e) { /* do nothing */ } + // touching statusCode in some platforms throws + // an exception + xhr.__raven_xhr.status_code = xhr.status; + } catch (e) { + /* do nothing */ + } + self.captureBreadcrumb({ - type: 'http', - category: 'xhr', - data: xhr.__raven_xhr + type: 'http', + category: 'xhr', + data: xhr.__raven_xhr }); + } } - } - var props = ['onload', 'onerror', 'onprogress']; - for (var j = 0; j < props.length; j++) { - wrapProp(props[j], xhr); - } + var props = ['onload', 'onerror', 'onprogress']; + for (var j = 0; j < props.length; j++) { + wrapProp(props[j], xhr); + } - if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) { - fill(xhr, 'onreadystatechange', function (orig) { - return self.wrap(orig, undefined, onreadystatechangeHandler); - } /* intentionally don't track this instrumentation */); - } else { - // if onreadystatechange wasn't actually set by the page on this xhr, we - // are free to set our own and capture the breadcrumb - xhr.onreadystatechange = onreadystatechangeHandler; - } + if ( + 'onreadystatechange' in xhr && + isFunction(xhr.onreadystatechange) + ) { + fill( + xhr, + 'onreadystatechange', + function(orig) { + return self.wrap( + orig, + undefined, + onreadystatechangeHandler + ); + } /* intentionally don't track this instrumentation */ + ); + } else { + // if onreadystatechange wasn't actually set by the page on this xhr, we + // are free to set our own and capture the breadcrumb + xhr.onreadystatechange = onreadystatechangeHandler; + } - return origSend.apply(this, arguments); - }; - }, wrappedBuiltIns); - } + return origSend.apply(this, arguments); + }; + }, + wrappedBuiltIns + ); + } - if (autoBreadcrumbs.xhr && 'fetch' in _window) { - fill(_window, 'fetch', function(origFetch) { - return function (fn, t) { // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } + if (autoBreadcrumbs.xhr && 'fetch' in _window) { + fill( + _window, + 'fetch', + function(origFetch) { + return function(fn, t) { + // preserve arity + // Make a copy of the arguments to prevent deoptimization + // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments + var args = new Array(arguments.length); + for (var i = 0; i < args.length; ++i) { + args[i] = arguments[i]; + } - var fetchInput = args[0]; - var method = 'GET'; - var url; + var fetchInput = args[0]; + var method = 'GET'; + var url; - if (typeof fetchInput === 'string') { - url = fetchInput; - } else { - url = fetchInput.url; - if (fetchInput.method) { + if (typeof fetchInput === 'string') { + url = fetchInput; + } else { + url = fetchInput.url; + if (fetchInput.method) { method = fetchInput.method; + } } - } - - if (args[1] && args[1].method) { - method = args[1].method; - } - - var fetchData = { - method: method, - url: url, - status_code: null - }; - - self.captureBreadcrumb({ - type: 'http', - category: 'fetch', - data: fetchData - }); - return origFetch.apply(this, args).then(function (response) { - fetchData.status_code = response.status; - - return response; - }); - }; - }, wrappedBuiltIns); - } + if (args[1] && args[1].method) { + method = args[1].method; + } - // Capture breadcrumbs from any click that is unhandled / bubbled up all the way - // to the document. Do this before we instrument addEventListener. - if (autoBreadcrumbs.dom && this._hasDocument) { - if (_document.addEventListener) { - _document.addEventListener('click', self._breadcrumbEventHandler('click'), false); - _document.addEventListener('keypress', self._keypressEventHandler(), false); - } - else { - // IE8 Compatibility - _document.attachEvent('onclick', self._breadcrumbEventHandler('click')); - _document.attachEvent('onkeypress', self._keypressEventHandler()); - } - } + var fetchData = { + method: method, + url: url, + status_code: null + }; - // record navigation (URL) changes - // NOTE: in Chrome App environment, touching history.pushState, *even inside - // a try/catch block*, will cause Chrome to output an error to console.error - // borrowed from: https://github.com/angular/angular.js/pull/13945/files - var chrome = _window.chrome; - var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; - var hasPushState = !isChromePackagedApp && _window.history && history.pushState; - if (autoBreadcrumbs.location && hasPushState) { - // TODO: remove onpopstate handler on uninstall() - var oldOnPopState = _window.onpopstate; - _window.onpopstate = function () { - var currentHref = self._location.href; - self._captureUrlChange(self._lastHref, currentHref); - - if (oldOnPopState) { - return oldOnPopState.apply(this, arguments); + self.captureBreadcrumb({ + type: 'http', + category: 'fetch', + data: fetchData + }); + + return origFetch.apply(this, args).then(function(response) { + fetchData.status_code = response.status; + + return response; + }); + }; + }, + wrappedBuiltIns + ); } - }; - fill(history, 'pushState', function (origPushState) { - // note history.pushState.length is 0; intentionally not declaring - // params to preserve 0 arity - return function (/* state, title, url */) { - var url = arguments.length > 2 ? arguments[2] : undefined; + // Capture breadcrumbs from any click that is unhandled / bubbled up all the way + // to the document. Do this before we instrument addEventListener. + if (autoBreadcrumbs.dom && this._hasDocument) { + if (_document.addEventListener) { + _document.addEventListener( + 'click', + self._breadcrumbEventHandler('click'), + false + ); + _document.addEventListener( + 'keypress', + self._keypressEventHandler(), + false + ); + } else { + // IE8 Compatibility + _document.attachEvent( + 'onclick', + self._breadcrumbEventHandler('click') + ); + _document.attachEvent('onkeypress', self._keypressEventHandler()); + } + } - // url argument is optional - if (url) { - // coerce to string (this is what pushState does) - self._captureUrlChange(self._lastHref, url + ''); + // record navigation (URL) changes + // NOTE: in Chrome App environment, touching history.pushState, *even inside + // a try/catch block*, will cause Chrome to output an error to console.error + // borrowed from: https://github.com/angular/angular.js/pull/13945/files + var chrome = _window.chrome; + var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; + var hasPushState = + !isChromePackagedApp && _window.history && history.pushState; + if (autoBreadcrumbs.location && hasPushState) { + // TODO: remove onpopstate handler on uninstall() + var oldOnPopState = _window.onpopstate; + _window.onpopstate = function() { + var currentHref = self._location.href; + self._captureUrlChange(self._lastHref, currentHref); + + if (oldOnPopState) { + return oldOnPopState.apply(this, arguments); } + }; + + fill( + history, + 'pushState', + function(origPushState) { + // note history.pushState.length is 0; intentionally not declaring + // params to preserve 0 arity + return function(/* state, title, url */) { + var url = arguments.length > 2 ? arguments[2] : undefined; + + // url argument is optional + if (url) { + // coerce to string (this is what pushState does) + self._captureUrlChange(self._lastHref, url + ''); + } - return origPushState.apply(this, arguments); - }; - }, wrappedBuiltIns); - } - - if (autoBreadcrumbs.console && 'console' in _window && console.log) { - // console - var consoleMethodCallback = function (msg, data) { - self.captureBreadcrumb({ - message: msg, - level: data.level, - category: 'console' - }); - }; - - each(['debug', 'info', 'warn', 'error', 'log'], function (_, level) { - wrapConsoleMethod(console, level, consoleMethodCallback); - }); - } - - }, - - _restoreBuiltIns: function () { - // restore any wrapped builtins - var builtin; - while (this._wrappedBuiltIns.length) { - builtin = this._wrappedBuiltIns.shift(); + return origPushState.apply(this, arguments); + }; + }, + wrappedBuiltIns + ); + } - var obj = builtin[0], - name = builtin[1], - orig = builtin[2]; + if (autoBreadcrumbs.console && 'console' in _window && console.log) { + // console + var consoleMethodCallback = function(msg, data) { + self.captureBreadcrumb({ + message: msg, + level: data.level, + category: 'console' + }); + }; - obj[name] = orig; - } - }, + each(['debug', 'info', 'warn', 'error', 'log'], function(_, level) { + wrapConsoleMethod(console, level, consoleMethodCallback); + }); + } + }, - _drainPlugins: function() { - var self = this; + _restoreBuiltIns: function() { + // restore any wrapped builtins + var builtin; + while (this._wrappedBuiltIns.length) { + builtin = this._wrappedBuiltIns.shift(); - // FIX ME TODO - each(this._plugins, function(_, plugin) { - var installer = plugin[0]; - var args = plugin[1]; - installer.apply(self, [self].concat(args)); - }); - }, + var obj = builtin[0], + name = builtin[1], + orig = builtin[2]; - _parseDSN: function(str) { - var m = dsnPattern.exec(str), - dsn = {}, - i = 7; + obj[name] = orig; + } + }, - try { - while (i--) dsn[dsnKeys[i]] = m[i] || ''; - } catch(e) { - throw new RavenConfigError('Invalid DSN: ' + str); - } + _drainPlugins: function() { + var self = this; - if (dsn.pass && !this._globalOptions.allowSecretKey) { - throw new RavenConfigError('Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'); - } + // FIX ME TODO + each(this._plugins, function(_, plugin) { + var installer = plugin[0]; + var args = plugin[1]; + installer.apply(self, [self].concat(args)); + }); + }, - return dsn; - }, + _parseDSN: function(str) { + var m = dsnPattern.exec(str), + dsn = {}, + i = 7; - _getGlobalServer: function(uri) { - // assemble the endpoint from the uri pieces - var globalServer = '//' + uri.host + - (uri.port ? ':' + uri.port : ''); + try { + while (i--) dsn[dsnKeys[i]] = m[i] || ''; + } catch (e) { + throw new RavenConfigError('Invalid DSN: ' + str); + } - if (uri.protocol) { - globalServer = uri.protocol + ':' + globalServer; - } - return globalServer; - }, + if (dsn.pass && !this._globalOptions.allowSecretKey) { + throw new RavenConfigError( + 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key' + ); + } - _handleOnErrorStackInfo: function() { - // if we are intentionally ignoring errors via onerror, bail out - if (!this._ignoreOnError) { - this._handleStackInfo.apply(this, arguments); - } - }, + return dsn; + }, - _handleStackInfo: function(stackInfo, options) { - var frames = this._prepareFrames(stackInfo, options); - - this._triggerEvent('handle', { - stackInfo: stackInfo, - options: options - }); - - this._processException( - stackInfo.name, - stackInfo.message, - stackInfo.url, - stackInfo.lineno, - frames, - options - ); - }, + _getGlobalServer: function(uri) { + // assemble the endpoint from the uri pieces + var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : ''); - _prepareFrames: function(stackInfo, options) { - var self = this; - var frames = []; - if (stackInfo.stack && stackInfo.stack.length) { - each(stackInfo.stack, function(i, stack) { - var frame = self._normalizeFrame(stack); - if (frame) { - frames.push(frame); + if (uri.protocol) { + globalServer = uri.protocol + ':' + globalServer; } - }); + return globalServer; + }, - // e.g. frames captured via captureMessage throw - if (options && options.trimHeadFrames) { - for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) { - frames[j].in_app = false; + _handleOnErrorStackInfo: function() { + // if we are intentionally ignoring errors via onerror, bail out + if (!this._ignoreOnError) { + this._handleStackInfo.apply(this, arguments); } - } - } - frames = frames.slice(0, this._globalOptions.stackTraceLimit); - return frames; - }, + }, + _handleStackInfo: function(stackInfo, options) { + var frames = this._prepareFrames(stackInfo, options); - _normalizeFrame: function(frame) { - if (!frame.url) return; - - // normalize the frames data - var normalized = { - filename: frame.url, - lineno: frame.line, - colno: frame.column, - 'function': frame.func || '?' - }; - - normalized.in_app = !( // determine if an exception came from outside of our app - // first we check the global includePaths list. - !!this._globalOptions.includePaths.test && !this._globalOptions.includePaths.test(normalized.filename) || - // Now we check for fun, if the function name is Raven or TraceKit - /(Raven|TraceKit)\./.test(normalized['function']) || - // finally, we do a last ditch effort and check for raven.min.js - /raven\.(min\.)?js$/.test(normalized.filename) - ); + this._triggerEvent('handle', { + stackInfo: stackInfo, + options: options + }); - return normalized; - }, + this._processException( + stackInfo.name, + stackInfo.message, + stackInfo.url, + stackInfo.lineno, + frames, + options + ); + }, + + _prepareFrames: function(stackInfo, options) { + var self = this; + var frames = []; + if (stackInfo.stack && stackInfo.stack.length) { + each(stackInfo.stack, function(i, stack) { + var frame = self._normalizeFrame(stack, stackInfo.url); + if (frame) { + frames.push(frame); + } + }); + + // e.g. frames captured via captureMessage throw + if (options && options.trimHeadFrames) { + for ( + var j = 0; + j < options.trimHeadFrames && j < frames.length; + j++ + ) { + frames[j].in_app = false; + } + } + } + frames = frames.slice(0, this._globalOptions.stackTraceLimit); + return frames; + }, + + _normalizeFrame: function(frame, stackInfoUrl) { + // normalize the frames data + var normalized = { + filename: frame.url, + lineno: frame.line, + colno: frame.column, + function: frame.func || '?' + }; - _processException: function(type, message, fileurl, lineno, frames, options) { - var stacktrace; - if (!!this._globalOptions.ignoreErrors.test && this._globalOptions.ignoreErrors.test(message)) return; - - message += ''; - - if (frames && frames.length) { - fileurl = frames[0].filename || fileurl; - // Sentry expects frames oldest to newest - // and JS sends them as newest to oldest - frames.reverse(); - stacktrace = {frames: frames}; - } else if (fileurl) { - stacktrace = { - frames: [{ - filename: fileurl, - lineno: lineno, - in_app: true - }] - }; - } + // Case when we don't have any information about the error + // E.g. throwing a string or raw object, instead of an `Error` in Firefox + // Generating synthetic error doesn't add any value here + // + // We should probably somehow let a user know that they should fix their code + if (!frame.url) { + normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler + } - if (!!this._globalOptions.ignoreUrls.test && this._globalOptions.ignoreUrls.test(fileurl)) return; - if (!!this._globalOptions.whitelistUrls.test && !this._globalOptions.whitelistUrls.test(fileurl)) return; - - var data = objectMerge({ - // sentry.interfaces.Exception - exception: { - values: [{ - type: type, - value: message, - stacktrace: stacktrace - }] - }, - culprit: fileurl - }, options); - - // Fire away! - this._send(data); - }, + normalized.in_app = !// determine if an exception came from outside of our app + // first we check the global includePaths list. + ( + (!!this._globalOptions.includePaths.test && + !this._globalOptions.includePaths.test(normalized.filename)) || + // Now we check for fun, if the function name is Raven or TraceKit + /(Raven|TraceKit)\./.test(normalized['function']) || + // finally, we do a last ditch effort and check for raven.min.js + /raven\.(min\.)?js$/.test(normalized.filename) + ); + + return normalized; + }, + + _processException: function( + type, + message, + fileurl, + lineno, + frames, + options + ) { + var testString = (type || '') + ': ' + (message || ''); + + if ( + !!this._globalOptions.ignoreErrors.test && + this._globalOptions.ignoreErrors.test(testString) + ) + return; + + var stacktrace; + + if (frames && frames.length) { + fileurl = frames[0].filename || fileurl; + // Sentry expects frames oldest to newest + // and JS sends them as newest to oldest + frames.reverse(); + stacktrace = {frames: frames}; + } else if (fileurl) { + stacktrace = { + frames: [ + { + filename: fileurl, + lineno: lineno, + in_app: true + } + ] + }; + } - _trimPacket: function(data) { - // For now, we only want to truncate the two different messages - // but this could/should be expanded to just trim everything - var max = this._globalOptions.maxMessageLength; - if (data.message) { - data.message = truncate(data.message, max); - } - if (data.exception) { - var exception = data.exception.values[0]; - exception.value = truncate(exception.value, max); - } + if ( + !!this._globalOptions.ignoreUrls.test && + this._globalOptions.ignoreUrls.test(fileurl) + ) + return; + if ( + !!this._globalOptions.whitelistUrls.test && + !this._globalOptions.whitelistUrls.test(fileurl) + ) + return; + + var data = objectMerge( + { + // sentry.interfaces.Exception + exception: { + values: [ + { + type: type, + value: message, + stacktrace: stacktrace + } + ] + }, + culprit: fileurl + }, + options + ); + + // Fire away! + this._send(data); + }, + + _trimPacket: function(data) { + // For now, we only want to truncate the two different messages + // but this could/should be expanded to just trim everything + var max = this._globalOptions.maxMessageLength; + if (data.message) { + data.message = truncate(data.message, max); + } + if (data.exception) { + var exception = data.exception.values[0]; + exception.value = truncate(exception.value, max); + } - var request = data.request; - if (request) { - if (request.url) { - request.url = truncate(request.url, this._globalOptions.maxUrlLength); - } - if (request.Referer) { - request.Referer = truncate(request.Referer, this._globalOptions.maxUrlLength); - } - } + var request = data.request; + if (request) { + if (request.url) { + request.url = truncate(request.url, this._globalOptions.maxUrlLength); + } + if (request.Referer) { + request.Referer = truncate( + request.Referer, + this._globalOptions.maxUrlLength + ); + } + } - if (data.breadcrumbs && data.breadcrumbs.values) - this._trimBreadcrumbs(data.breadcrumbs); + if (data.breadcrumbs && data.breadcrumbs.values) + this._trimBreadcrumbs(data.breadcrumbs); - return data; - }, + return data; + }, - /** + /** * Truncate breadcrumb values (right now just URLs) */ - _trimBreadcrumbs: function (breadcrumbs) { - // known breadcrumb properties with urls - // TODO: also consider arbitrary prop values that start with (https?)?:// - var urlProps = ['to', 'from', 'url'], - urlProp, - crumb, - data; - - for (var i = 0; i < breadcrumbs.values.length; ++i) { - crumb = breadcrumbs.values[i]; - if (!crumb.hasOwnProperty('data') || !isObject(crumb.data) || objectFrozen(crumb.data)) - continue; - - data = objectMerge({}, crumb.data); - for (var j = 0; j < urlProps.length; ++j) { - urlProp = urlProps[j]; - if (data.hasOwnProperty(urlProp)) { - data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength); + _trimBreadcrumbs: function(breadcrumbs) { + // known breadcrumb properties with urls + // TODO: also consider arbitrary prop values that start with (https?)?:// + var urlProps = ['to', 'from', 'url'], + urlProp, + crumb, + data; + + for (var i = 0; i < breadcrumbs.values.length; ++i) { + crumb = breadcrumbs.values[i]; + if ( + !crumb.hasOwnProperty('data') || + !isObject(crumb.data) || + objectFrozen(crumb.data) + ) + continue; + + data = objectMerge({}, crumb.data); + for (var j = 0; j < urlProps.length; ++j) { + urlProp = urlProps[j]; + if (data.hasOwnProperty(urlProp) && data[urlProp]) { + data[urlProp] = truncate( + data[urlProp], + this._globalOptions.maxUrlLength + ); + } + } + breadcrumbs.values[i].data = data; } - } - breadcrumbs.values[i].data = data; - } - }, - - _getHttpData: function() { - if (!this._hasNavigator && !this._hasDocument) return; - var httpData = {}; - - if (this._hasNavigator && _navigator.userAgent) { - httpData.headers = { - 'User-Agent': navigator.userAgent - }; - } - - if (this._hasDocument) { - if (_document.location && _document.location.href) { - httpData.url = _document.location.href; - } - if (_document.referrer) { - if (!httpData.headers) httpData.headers = {}; - httpData.headers.Referer = _document.referrer; - } - } - - return httpData; - }, + }, - _resetBackoff: function() { - this._backoffDuration = 0; - this._backoffStart = null; - }, + _getHttpData: function() { + if (!this._hasNavigator && !this._hasDocument) return; + var httpData = {}; - _shouldBackoff: function() { - return this._backoffDuration && now() - this._backoffStart < this._backoffDuration; - }, - - /** - * Returns true if the in-process data payload matches the signature - * of the previously-sent data - * - * NOTE: This has to be done at this level because TraceKit can generate - * data from window.onerror WITHOUT an exception object (IE8, IE9, - * other old browsers). This can take the form of an "exception" - * data object with a single frame (derived from the onerror args). - */ - _isRepeatData: function (current) { - var last = this._lastData; - - if (!last || - current.message !== last.message || // defined for captureMessage - current.culprit !== last.culprit) // defined for captureException/onerror - return false; + if (this._hasNavigator && _navigator.userAgent) { + httpData.headers = { + 'User-Agent': navigator.userAgent + }; + } - // Stacktrace interface (i.e. from captureMessage) - if (current.stacktrace || last.stacktrace) { - return isSameStacktrace(current.stacktrace, last.stacktrace); - } - // Exception interface (i.e. from captureException/onerror) - else if (current.exception || last.exception) { - return isSameException(current.exception, last.exception); - } + if (this._hasDocument) { + if (_document.location && _document.location.href) { + httpData.url = _document.location.href; + } + if (_document.referrer) { + if (!httpData.headers) httpData.headers = {}; + httpData.headers.Referer = _document.referrer; + } + } - return true; - }, + return httpData; + }, - _setBackoffState: function(request) { - // If we are already in a backoff state, don't change anything - if (this._shouldBackoff()) { - return; - } + _resetBackoff: function() { + this._backoffDuration = 0; + this._backoffStart = null; + }, - var status = request.status; - - // 400 - project_id doesn't exist or some other fatal - // 401 - invalid/revoked dsn - // 429 - too many requests - if (!(status === 400 || status === 401 || status === 429)) - return; - - var retry; - try { - // If Retry-After is not in Access-Control-Expose-Headers, most - // browsers will throw an exception trying to access it - retry = request.getResponseHeader('Retry-After'); - retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds - } catch (e) { - /* eslint no-empty:0 */ - } + _shouldBackoff: function() { + return ( + this._backoffDuration && + now() - this._backoffStart < this._backoffDuration + ); + }, + /** + * Returns true if the in-process data payload matches the signature + * of the previously-sent data + * + * NOTE: This has to be done at this level because TraceKit can generate + * data from window.onerror WITHOUT an exception object (IE8, IE9, + * other old browsers). This can take the form of an "exception" + * data object with a single frame (derived from the onerror args). + */ + _isRepeatData: function(current) { + var last = this._lastData; + + if ( + !last || + current.message !== last.message || // defined for captureMessage + current.culprit !== last.culprit // defined for captureException/onerror + ) + return false; + + // Stacktrace interface (i.e. from captureMessage) + if (current.stacktrace || last.stacktrace) { + return isSameStacktrace(current.stacktrace, last.stacktrace); + } else if (current.exception || last.exception) { + // Exception interface (i.e. from captureException/onerror) + return isSameException(current.exception, last.exception); + } - this._backoffDuration = retry - // If Sentry server returned a Retry-After value, use it - ? retry - // Otherwise, double the last backoff duration (starts at 1 sec) - : this._backoffDuration * 2 || 1000; + return true; + }, - this._backoffStart = now(); - }, + _setBackoffState: function(request) { + // If we are already in a backoff state, don't change anything + if (this._shouldBackoff()) { + return; + } - _send: function(data) { - var globalOptions = this._globalOptions; + var status = request.status; - var baseData = { - project: this._globalProject, - logger: globalOptions.logger, - platform: 'javascript' - }, httpData = this._getHttpData(); + // 400 - project_id doesn't exist or some other fatal + // 401 - invalid/revoked dsn + // 429 - too many requests + if (!(status === 400 || status === 401 || status === 429)) return; - if (httpData) { - baseData.request = httpData; - } + var retry; + try { + // If Retry-After is not in Access-Control-Expose-Headers, most + // browsers will throw an exception trying to access it + retry = request.getResponseHeader('Retry-After'); + retry = parseInt(retry, 10) * 1000; // Retry-After is returned in seconds + } catch (e) { + /* eslint no-empty:0 */ + } - // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload - if (data.trimHeadFrames) delete data.trimHeadFrames; + this._backoffDuration = retry + ? // If Sentry server returned a Retry-After value, use it + retry + : // Otherwise, double the last backoff duration (starts at 1 sec) + this._backoffDuration * 2 || 1000; - data = objectMerge(baseData, data); + this._backoffStart = now(); + }, - // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge - data.tags = objectMerge(objectMerge({}, this._globalContext.tags), data.tags); - data.extra = objectMerge(objectMerge({}, this._globalContext.extra), data.extra); + _send: function(data) { + var globalOptions = this._globalOptions; - // Send along our own collected metadata with extra - data.extra['session:duration'] = now() - this._startTime; + var baseData = { + project: this._globalProject, + logger: globalOptions.logger, + platform: 'javascript' + }, + httpData = this._getHttpData(); - if (this._breadcrumbs && this._breadcrumbs.length > 0) { - // intentionally make shallow copy so that additions - // to breadcrumbs aren't accidentally sent in this request - data.breadcrumbs = { - values: [].slice.call(this._breadcrumbs, 0) - }; - } + if (httpData) { + baseData.request = httpData; + } - // If there are no tags/extra, strip the key from the payload alltogther. - if (isEmptyObject(data.tags)) delete data.tags; + // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload + if (data.trimHeadFrames) delete data.trimHeadFrames; + + data = objectMerge(baseData, data); + + // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge + data.tags = objectMerge( + objectMerge({}, this._globalContext.tags), + data.tags + ); + data.extra = objectMerge( + objectMerge({}, this._globalContext.extra), + data.extra + ); + + // Send along our own collected metadata with extra + data.extra['session:duration'] = now() - this._startTime; + + if (this._breadcrumbs && this._breadcrumbs.length > 0) { + // intentionally make shallow copy so that additions + // to breadcrumbs aren't accidentally sent in this request + data.breadcrumbs = { + values: [].slice.call(this._breadcrumbs, 0) + }; + } - if (this._globalContext.user) { - // sentry.interfaces.User - data.user = this._globalContext.user; - } + // If there are no tags/extra, strip the key from the payload alltogther. + if (isEmptyObject(data.tags)) delete data.tags; - // Include the environment if it's defined in globalOptions - if (globalOptions.environment) data.environment = globalOptions.environment; + if (this._globalContext.user) { + // sentry.interfaces.User + data.user = this._globalContext.user; + } - // Include the release if it's defined in globalOptions - if (globalOptions.release) data.release = globalOptions.release; + // Include the environment if it's defined in globalOptions + if (globalOptions.environment) + data.environment = globalOptions.environment; - // Include server_name if it's defined in globalOptions - if (globalOptions.serverName) data.server_name = globalOptions.serverName; + // Include the release if it's defined in globalOptions + if (globalOptions.release) data.release = globalOptions.release; - if (isFunction(globalOptions.dataCallback)) { - data = globalOptions.dataCallback(data) || data; - } + // Include server_name if it's defined in globalOptions + if (globalOptions.serverName) data.server_name = globalOptions.serverName; - // Why?????????? - if (!data || isEmptyObject(data)) { - return; - } + if (isFunction(globalOptions.dataCallback)) { + data = globalOptions.dataCallback(data) || data; + } - // Check if the request should be filtered or not - if (isFunction(globalOptions.shouldSendCallback) && !globalOptions.shouldSendCallback(data)) { - return; - } + // Why?????????? + if (!data || isEmptyObject(data)) { + return; + } - // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests), - // so drop requests until "cool-off" period has elapsed. - if (this._shouldBackoff()) { - this._logDebug('warn', 'Raven dropped error due to backoff: ', data); - return; - } + // Check if the request should be filtered or not + if ( + isFunction(globalOptions.shouldSendCallback) && + !globalOptions.shouldSendCallback(data) + ) { + return; + } - if (typeof globalOptions.sampleRate === 'number') { - if (Math.random() < globalOptions.sampleRate) { - this._sendProcessedPayload(data); - } - } else { - this._sendProcessedPayload(data); - } - }, + // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests), + // so drop requests until "cool-off" period has elapsed. + if (this._shouldBackoff()) { + this._logDebug('warn', 'Raven dropped error due to backoff: ', data); + return; + } - _getUuid: function () { - return uuid4(); - }, + if (typeof globalOptions.sampleRate === 'number') { + if (Math.random() < globalOptions.sampleRate) { + this._sendProcessedPayload(data); + } + } else { + this._sendProcessedPayload(data); + } + }, - _sendProcessedPayload: function(data, callback) { - var self = this; - var globalOptions = this._globalOptions; + _getUuid: function() { + return uuid4(); + }, - if (!this.isSetup()) return; + _sendProcessedPayload: function(data, callback) { + var self = this; + var globalOptions = this._globalOptions; - // Send along an event_id if not explicitly passed. - // This event_id can be used to reference the error within Sentry itself. - // Set lastEventId after we know the error should actually be sent - this._lastEventId = data.event_id || (data.event_id = this._getUuid()); + if (!this.isSetup()) return; - // Try and clean up the packet before sending by truncating long values - data = this._trimPacket(data); + // Try and clean up the packet before sending by truncating long values + data = this._trimPacket(data); - // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback, - // but this would require copying an un-truncated copy of the data packet, which can be - // arbitrarily deep (extra_data) -- could be worthwhile? will revisit - if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) { - this._logDebug('warn', 'Raven dropped repeat event: ', data); - return; - } + // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback, + // but this would require copying an un-truncated copy of the data packet, which can be + // arbitrarily deep (extra_data) -- could be worthwhile? will revisit + if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) { + this._logDebug('warn', 'Raven dropped repeat event: ', data); + return; + } - // Store outbound payload after trim - this._lastData = data; + // Send along an event_id if not explicitly passed. + // This event_id can be used to reference the error within Sentry itself. + // Set lastEventId after we know the error should actually be sent + this._lastEventId = data.event_id || (data.event_id = this._getUuid()); - this._logDebug('debug', 'Raven about to send:', data); + // Store outbound payload after trim + this._lastData = data; - var auth = { - sentry_version: '7', - sentry_client: 'raven-js/' + this.VERSION, - sentry_key: this._globalKey - }; - if (this._globalSecret) { - auth.sentry_secret = this._globalSecret; - } + this._logDebug('debug', 'Raven about to send:', data); - var exception = data.exception && data.exception.values[0]; - this.captureBreadcrumb({ - category: 'sentry', - message: exception - ? (exception.type ? exception.type + ': ' : '') + exception.value - : data.message, - event_id: data.event_id, - level: data.level || 'error' // presume error unless specified - }); - - var url = this._globalEndpoint; - (globalOptions.transport || this._makeRequest).call(this, { - url: url, - auth: auth, - data: data, - options: globalOptions, - onSuccess: function success() { - self._resetBackoff(); - - self._triggerEvent('success', { - data: data, - src: url - }); - callback && callback(); - }, - onError: function failure(error) { - self._logDebug('error', 'Raven transport failed to send: ', error); + var auth = { + sentry_version: '7', + sentry_client: 'raven-js/' + this.VERSION, + sentry_key: this._globalKey + }; - if (error.request) { - self._setBackoffState(error.request); + if (this._globalSecret) { + auth.sentry_secret = this._globalSecret; } - self._triggerEvent('failure', { - data: data, - src: url + var exception = data.exception && data.exception.values[0]; + this.captureBreadcrumb({ + category: 'sentry', + message: exception + ? (exception.type ? exception.type + ': ' : '') + exception.value + : data.message, + event_id: data.event_id, + level: data.level || 'error' // presume error unless specified }); - error = error || new Error('Raven send failed (no additional details provided)'); - callback && callback(error); - } - }); - }, - _makeRequest: function(opts) { - var request = new XMLHttpRequest(); + var url = this._globalEndpoint; + (globalOptions.transport || this._makeRequest).call(this, { + url: url, + auth: auth, + data: data, + options: globalOptions, + onSuccess: function success() { + self._resetBackoff(); + + self._triggerEvent('success', { + data: data, + src: url + }); + callback && callback(); + }, + onError: function failure(error) { + self._logDebug('error', 'Raven transport failed to send: ', error); - // if browser doesn't support CORS (e.g. IE7), we are out of luck - var hasCORS = - 'withCredentials' in request || - typeof XDomainRequest !== 'undefined'; + if (error.request) { + self._setBackoffState(error.request); + } - if (!hasCORS) return; + self._triggerEvent('failure', { + data: data, + src: url + }); + error = + error || + new Error('Raven send failed (no additional details provided)'); + callback && callback(error); + } + }); + }, + + _makeRequest: function(opts) { + var request = _window.XMLHttpRequest && new _window.XMLHttpRequest(); + if (!request) return; + + // if browser doesn't support CORS (e.g. IE7), we are out of luck + var hasCORS = + 'withCredentials' in request || typeof XDomainRequest !== 'undefined'; + + if (!hasCORS) return; + + var url = opts.url; + + if ('withCredentials' in request) { + request.onreadystatechange = function() { + if (request.readyState !== 4) { + return; + } else if (request.status === 200) { + opts.onSuccess && opts.onSuccess(); + } else if (opts.onError) { + var err = new Error('Sentry error code: ' + request.status); + err.request = request; + opts.onError(err); + } + }; + } else { + request = new XDomainRequest(); + // xdomainrequest cannot go http -> https (or vice versa), + // so always use protocol relative + url = url.replace(/^https?:/, ''); + + // onreadystatechange not supported by XDomainRequest + if (opts.onSuccess) { + request.onload = opts.onSuccess; + } + if (opts.onError) { + request.onerror = function() { + var err = new Error('Sentry error code: XDomainRequest'); + err.request = request; + opts.onError(err); + }; + } + } - var url = opts.url; + // NOTE: auth is intentionally sent as part of query string (NOT as custom + // HTTP header) so as to avoid preflight CORS requests + request.open('POST', url + '?' + urlencode(opts.auth)); + request.send(stringify(opts.data)); + }, + + _logDebug: function(level) { + if (this._originalConsoleMethods[level] && this.debug) { + // In IE<10 console methods do not have their own 'apply' method + Function.prototype.apply.call( + this._originalConsoleMethods[level], + this._originalConsole, + [].slice.call(arguments, 1) + ); + } + }, - if ('withCredentials' in request) { - request.onreadystatechange = function () { - if (request.readyState !== 4) { - return; - } else if (request.status === 200) { - opts.onSuccess && opts.onSuccess(); - } else if (opts.onError) { - var err = new Error('Sentry error code: ' + request.status); - err.request = request; - opts.onError(err); + _mergeContext: function(key, context) { + if (isUndefined(context)) { + delete this._globalContext[key]; + } else { + this._globalContext[key] = objectMerge( + this._globalContext[key] || {}, + context + ); } + } }; - } else { - request = new XDomainRequest(); - // xdomainrequest cannot go http -> https (or vice versa), - // so always use protocol relative - url = url.replace(/^https?:/, ''); - - // onreadystatechange not supported by XDomainRequest - if (opts.onSuccess) { - request.onload = opts.onSuccess; - } - if (opts.onError) { - request.onerror = function () { - var err = new Error('Sentry error code: XDomainRequest'); - err.request = request; - opts.onError(err); - } - } - } - - // NOTE: auth is intentionally sent as part of query string (NOT as custom - // HTTP header) so as to avoid preflight CORS requests - request.open('POST', url + '?' + urlencode(opts.auth)); - request.send(stringify(opts.data)); - }, - - _logDebug: function(level) { - if (this._originalConsoleMethods[level] && this.debug) { - // In IE<10 console methods do not have their own 'apply' method - Function.prototype.apply.call( - this._originalConsoleMethods[level], - this._originalConsole, - [].slice.call(arguments, 1) - ); - } - }, - - _mergeContext: function(key, context) { - if (isUndefined(context)) { - delete this._globalContext[key]; - } else { - this._globalContext[key] = objectMerge(this._globalContext[key] || {}, context); - } - } -}; -/*------------------------------------------------ + /*------------------------------------------------ * utils * * conditionally exported for test via Raven.utils ================================================= */ -var objectPrototype = Object.prototype; + var objectPrototype = Object.prototype; -function isUndefined(what) { - return what === void 0; -} - -function isFunction(what) { - return typeof what === 'function'; -} + function isUndefined(what) { + return what === void 0; + } -function isString(what) { - return objectPrototype.toString.call(what) === '[object String]'; -} + function isFunction(what) { + return typeof what === 'function'; + } + function isString(what) { + return objectPrototype.toString.call(what) === '[object String]'; + } -function isEmptyObject(what) { - for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars - return true; -} + function isEmptyObject(what) { + for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars + return true; + } -function each(obj, callback) { - var i, j; + function each(obj, callback) { + var i, j; - if (isUndefined(obj.length)) { - for (i in obj) { - if (hasKey(obj, i)) { - callback.call(null, i, obj[i]); - } - } - } else { - j = obj.length; - if (j) { - for (i = 0; i < j; i++) { - callback.call(null, i, obj[i]); + if (isUndefined(obj.length)) { + for (i in obj) { + if (hasKey(obj, i)) { + callback.call(null, i, obj[i]); + } + } + } else { + j = obj.length; + if (j) { + for (i = 0; i < j; i++) { + callback.call(null, i, obj[i]); + } + } + } } - } - } -} -function objectMerge(obj1, obj2) { - if (!obj2) { - return obj1; - } - each(obj2, function(key, value){ - obj1[key] = value; - }); - return obj1; -} + function objectMerge(obj1, obj2) { + if (!obj2) { + return obj1; + } + each(obj2, function(key, value) { + obj1[key] = value; + }); + return obj1; + } -/** + /** * This function is only used for react-native. * react-native freezes object that have already been sent over the * js bridge. We need this function in order to check if the object is frozen. @@ -1853,363 +2149,398 @@ function objectMerge(obj1, obj2) { * supported because it's not relevant for other "platforms". See related issue: * https://github.com/getsentry/react-native-sentry/issues/57 */ -function objectFrozen(obj) { - if (!Object.isFrozen) { - return false; - } - return Object.isFrozen(obj); -} + function objectFrozen(obj) { + if (!Object.isFrozen) { + return false; + } + return Object.isFrozen(obj); + } -function truncate(str, max) { - return !max || str.length <= max ? str : str.substr(0, max) + '\u2026'; -} + function truncate(str, max) { + return !max || str.length <= max ? str : str.substr(0, max) + '\u2026'; + } -/** + /** * hasKey, a better form of hasOwnProperty * Example: hasKey(MainHostObject, property) === true/false * * @param {Object} host object to check property * @param {string} key to check */ -function hasKey(object, key) { - return objectPrototype.hasOwnProperty.call(object, key); -} - -function joinRegExp(patterns) { - // Combine an array of regular expressions and strings into one large regexp - // Be mad. - var sources = [], - i = 0, len = patterns.length, - pattern; - - for (; i < len; i++) { - pattern = patterns[i]; - if (isString(pattern)) { - // If it's a string, we need to escape it - // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')); - } else if (pattern && pattern.source) { - // If it's a regexp already, we want to extract the source - sources.push(pattern.source); - } - // Intentionally skip other cases - } - return new RegExp(sources.join('|'), 'i'); -} - -function urlencode(o) { - var pairs = []; - each(o, function(key, value) { - pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - }); - return pairs.join('&'); -} - -// borrowed from https://tools.ietf.org/html/rfc3986#appendix-B -// intentionally using regex and not href parsing trick because React Native and other -// environments where DOM might not be available -function parseUrl(url) { - var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); - if (!match) return {}; - - // coerce to undefined values to empty string so we don't get 'undefined' - var query = match[6] || ''; - var fragment = match[8] || ''; - return { - protocol: match[2], - host: match[4], - path: match[5], - relative: match[5] + query + fragment // everything minus origin - }; -} -function uuid4() { - var crypto = _window.crypto || _window.msCrypto; - - if (!isUndefined(crypto) && crypto.getRandomValues) { - // Use window.crypto API if available - var arr = new Uint16Array(8); - crypto.getRandomValues(arr); - - // set 4 in byte 7 - arr[3] = arr[3] & 0xFFF | 0x4000; - // set 2 most significant bits of byte 9 to '10' - arr[4] = arr[4] & 0x3FFF | 0x8000; - - var pad = function(num) { - var v = num.toString(16); - while (v.length < 4) { - v = '0' + v; + function hasKey(object, key) { + return objectPrototype.hasOwnProperty.call(object, key); } - return v; - }; - return pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + - pad(arr[5]) + pad(arr[6]) + pad(arr[7]); - } else { - // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 - return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = Math.random()*16|0, - v = c === 'x' ? r : r&0x3|0x8; - return v.toString(16); - }); - } -} + function joinRegExp(patterns) { + // Combine an array of regular expressions and strings into one large regexp + // Be mad. + var sources = [], + i = 0, + len = patterns.length, + pattern; + + for (; i < len; i++) { + pattern = patterns[i]; + if (isString(pattern)) { + // If it's a string, we need to escape it + // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions + sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')); + } else if (pattern && pattern.source) { + // If it's a regexp already, we want to extract the source + sources.push(pattern.source); + } + // Intentionally skip other cases + } + return new RegExp(sources.join('|'), 'i'); + } + + function urlencode(o) { + var pairs = []; + each(o, function(key, value) { + pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); + }); + return pairs.join('&'); + } + + // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B + // intentionally using regex and not href parsing trick because React Native and other + // environments where DOM might not be available + function parseUrl(url) { + var match = url.match( + /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/ + ); + if (!match) return {}; + + // coerce to undefined values to empty string so we don't get 'undefined' + var query = match[6] || ''; + var fragment = match[8] || ''; + return { + protocol: match[2], + host: match[4], + path: match[5], + relative: match[5] + query + fragment // everything minus origin + }; + } + function uuid4() { + var crypto = _window.crypto || _window.msCrypto; + + if (!isUndefined(crypto) && crypto.getRandomValues) { + // Use window.crypto API if available + // eslint-disable-next-line no-undef + var arr = new Uint16Array(8); + crypto.getRandomValues(arr); + + // set 4 in byte 7 + arr[3] = (arr[3] & 0xfff) | 0x4000; + // set 2 most significant bits of byte 9 to '10' + arr[4] = (arr[4] & 0x3fff) | 0x8000; + + var pad = function(num) { + var v = num.toString(16); + while (v.length < 4) { + v = '0' + v; + } + return v; + }; + + return ( + pad(arr[0]) + + pad(arr[1]) + + pad(arr[2]) + + pad(arr[3]) + + pad(arr[4]) + + pad(arr[5]) + + pad(arr[6]) + + pad(arr[7]) + ); + } else { + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 + return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = (Math.random() * 16) | 0, + v = c === 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); + } + } -/** + /** * Given a child DOM element, returns a query-selector statement describing that * and its ancestors * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz] * @param elem * @returns {string} */ -function htmlTreeAsString(elem) { - /* eslint no-extra-parens:0*/ - var MAX_TRAVERSE_HEIGHT = 5, - MAX_OUTPUT_LEN = 80, - out = [], - height = 0, - len = 0, - separator = ' > ', - sepLength = separator.length, - nextStr; - - while (elem && height++ < MAX_TRAVERSE_HEIGHT) { - - nextStr = htmlElementAsString(elem); - // bail out if - // - nextStr is the 'html' element - // - the length of the string that would be created exceeds MAX_OUTPUT_LEN - // (ignore this limit if we are on the first iteration) - if (nextStr === 'html' || height > 1 && len + (out.length * sepLength) + nextStr.length >= MAX_OUTPUT_LEN) { - break; - } + function htmlTreeAsString(elem) { + /* eslint no-extra-parens:0*/ + var MAX_TRAVERSE_HEIGHT = 5, + MAX_OUTPUT_LEN = 80, + out = [], + height = 0, + len = 0, + separator = ' > ', + sepLength = separator.length, + nextStr; + + while (elem && height++ < MAX_TRAVERSE_HEIGHT) { + nextStr = htmlElementAsString(elem); + // bail out if + // - nextStr is the 'html' element + // - the length of the string that would be created exceeds MAX_OUTPUT_LEN + // (ignore this limit if we are on the first iteration) + if ( + nextStr === 'html' || + (height > 1 && + len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) + ) { + break; + } - out.push(nextStr); + out.push(nextStr); - len += nextStr.length; - elem = elem.parentNode; - } + len += nextStr.length; + elem = elem.parentNode; + } - return out.reverse().join(separator); -} + return out.reverse().join(separator); + } -/** + /** * Returns a simple, query-selector representation of a DOM element * e.g. [HTMLElement] => input#foo.btn[name=baz] * @param HTMLElement * @returns {string} */ -function htmlElementAsString(elem) { - var out = [], - className, - classes, - key, - attr, - i; - - if (!elem || !elem.tagName) { - return ''; - } - - out.push(elem.tagName.toLowerCase()); - if (elem.id) { - out.push('#' + elem.id); - } - - className = elem.className; - if (className && isString(className)) { - classes = className.split(/\s+/); - for (i = 0; i < classes.length; i++) { - out.push('.' + classes[i]); - } - } - var attrWhitelist = ['type', 'name', 'title', 'alt']; - for (i = 0; i < attrWhitelist.length; i++) { - key = attrWhitelist[i]; - attr = elem.getAttribute(key); - if (attr) { - out.push('[' + key + '="' + attr + '"]'); - } - } - return out.join(''); -} + function htmlElementAsString(elem) { + var out = [], + className, + classes, + key, + attr, + i; + + if (!elem || !elem.tagName) { + return ''; + } + + out.push(elem.tagName.toLowerCase()); + if (elem.id) { + out.push('#' + elem.id); + } + + className = elem.className; + if (className && isString(className)) { + classes = className.split(/\s+/); + for (i = 0; i < classes.length; i++) { + out.push('.' + classes[i]); + } + } + var attrWhitelist = ['type', 'name', 'title', 'alt']; + for (i = 0; i < attrWhitelist.length; i++) { + key = attrWhitelist[i]; + attr = elem.getAttribute(key); + if (attr) { + out.push('[' + key + '="' + attr + '"]'); + } + } + return out.join(''); + } -/** + /** * Returns true if either a OR b is truthy, but not both */ -function isOnlyOneTruthy(a, b) { - return !!(!!a ^ !!b); -} + function isOnlyOneTruthy(a, b) { + return !!(!!a ^ !!b); + } -/** + /** * Returns true if the two input exception interfaces have the same content */ -function isSameException(ex1, ex2) { - if (isOnlyOneTruthy(ex1, ex2)) - return false; + function isSameException(ex1, ex2) { + if (isOnlyOneTruthy(ex1, ex2)) return false; - ex1 = ex1.values[0]; - ex2 = ex2.values[0]; + ex1 = ex1.values[0]; + ex2 = ex2.values[0]; - if (ex1.type !== ex2.type || - ex1.value !== ex2.value) - return false; + if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false; - return isSameStacktrace(ex1.stacktrace, ex2.stacktrace); -} + return isSameStacktrace(ex1.stacktrace, ex2.stacktrace); + } -/** + /** * Returns true if the two input stack trace interfaces have the same content */ -function isSameStacktrace(stack1, stack2) { - if (isOnlyOneTruthy(stack1, stack2)) - return false; - - var frames1 = stack1.frames; - var frames2 = stack2.frames; - - // Exit early if frame count differs - if (frames1.length !== frames2.length) - return false; - - // Iterate through every frame; bail out if anything differs - var a, b; - for (var i = 0; i < frames1.length; i++) { - a = frames1[i]; - b = frames2[i]; - if (a.filename !== b.filename || - a.lineno !== b.lineno || - a.colno !== b.colno || - a['function'] !== b['function']) - return false; - } - return true; -} + function isSameStacktrace(stack1, stack2) { + if (isOnlyOneTruthy(stack1, stack2)) return false; + + var frames1 = stack1.frames; + var frames2 = stack2.frames; + + // Exit early if frame count differs + if (frames1.length !== frames2.length) return false; + + // Iterate through every frame; bail out if anything differs + var a, b; + for (var i = 0; i < frames1.length; i++) { + a = frames1[i]; + b = frames2[i]; + if ( + a.filename !== b.filename || + a.lineno !== b.lineno || + a.colno !== b.colno || + a['function'] !== b['function'] + ) + return false; + } + return true; + } -/** + /** * Polyfill a method * @param obj object e.g. `document` * @param name method name present on object e.g. `addEventListener` * @param replacement replacement function * @param track {optional} record instrumentation to an array */ -function fill(obj, name, replacement, track) { - var orig = obj[name]; - obj[name] = replacement(orig); - if (track) { - track.push([obj, name, orig]); - } -} - -if (typeof __DEV__ !== 'undefined' && __DEV__) { - Raven.utils = { - isUndefined: isUndefined, - isFunction: isFunction, - isString: isString, - isObject: isObject, - isEmptyObject: isEmptyObject, - isError: isError, - each: each, - objectMerge: objectMerge, - truncate: truncate, - hasKey: hasKey, - joinRegExp: joinRegExp, - urlencode: urlencode, - uuid4: uuid4, - htmlTreeAsString: htmlTreeAsString, - htmlElementAsString: htmlElementAsString, - parseUrl: parseUrl, - fill: fill - }; -}; - -// Deprecations -Raven.prototype.setUser = Raven.prototype.setUserContext; -Raven.prototype.setReleaseContext = Raven.prototype.setRelease; - -module.exports = Raven; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"1":1,"2":2,"5":5,"6":6,"7":7}],4:[function(_dereq_,module,exports){ -(function (global){ -/** + function fill(obj, name, replacement, track) { + var orig = obj[name]; + obj[name] = replacement(orig); + if (track) { + track.push([obj, name, orig]); + } + } + + if (typeof __DEV__ !== 'undefined' && __DEV__) { + Raven.utils = { + isUndefined: isUndefined, + isFunction: isFunction, + isString: isString, + isObject: isObject, + isEmptyObject: isEmptyObject, + isError: isError, + each: each, + objectMerge: objectMerge, + truncate: truncate, + hasKey: hasKey, + joinRegExp: joinRegExp, + urlencode: urlencode, + uuid4: uuid4, + htmlTreeAsString: htmlTreeAsString, + htmlElementAsString: htmlElementAsString, + parseUrl: parseUrl, + fill: fill + }; + } + + // Deprecations + Raven.prototype.setUser = Raven.prototype.setUserContext; + Raven.prototype.setReleaseContext = Raven.prototype.setRelease; + + module.exports = Raven; + }.call( + this, + typeof global !== 'undefined' + ? global + : typeof self !== 'undefined' + ? self + : typeof window !== 'undefined' ? window : {} + )); + }, + {'1': 1, '2': 2, '5': 5, '6': 6, '7': 7} + ], + 4: [ + function(_dereq_, module, exports) { + (function(global) { + /** * Enforces a single instance of the Raven client, and the * main entry point for Raven. If you are a consumer of the * Raven library, you SHOULD load this file (vs raven.js). **/ -'use strict'; - -var RavenConstructor = _dereq_(3); + var RavenConstructor = _dereq_(3); -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = typeof window !== 'undefined' ? window - : typeof global !== 'undefined' ? global - : typeof self !== 'undefined' ? self - : {}; -var _Raven = _window.Raven; + // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) + var _window = + typeof window !== 'undefined' + ? window + : typeof global !== 'undefined' + ? global + : typeof self !== 'undefined' ? self : {}; + var _Raven = _window.Raven; -var Raven = new RavenConstructor(); + var Raven = new RavenConstructor(); -/* + /* * Allow multiple versions of Raven to be installed. * Strip Raven from the global context and returns the instance. * * @return {Raven} */ -Raven.noConflict = function () { - _window.Raven = _Raven; - return Raven; -}; - -Raven.afterLoad(); - -module.exports = Raven; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"3":3}],5:[function(_dereq_,module,exports){ -'use strict'; - -function isObject(what) { - return typeof what === 'object' && what !== null; -} - -// Yanked from https://git.io/vS8DV re-used under CC0 -// with some tiny modifications -function isError(value) { - switch ({}.toString.call(value)) { - case '[object Error]': return true; - case '[object Exception]': return true; - case '[object DOMException]': return true; - default: return value instanceof Error; - } -} - -function wrappedCallback(callback) { - function dataCallback(data, original) { - var normalizedData = callback(data) || data; - if (original) { - return original(normalizedData) || normalizedData; - } - return normalizedData; - } - - return dataCallback; -} - -module.exports = { - isObject: isObject, - isError: isError, - wrappedCallback: wrappedCallback -}; - -},{}],6:[function(_dereq_,module,exports){ -(function (global){ -'use strict'; + Raven.noConflict = function() { + _window.Raven = _Raven; + return Raven; + }; -var utils = _dereq_(5); + Raven.afterLoad(); + + module.exports = Raven; + }.call( + this, + typeof global !== 'undefined' + ? global + : typeof self !== 'undefined' + ? self + : typeof window !== 'undefined' ? window : {} + )); + }, + {'3': 3} + ], + 5: [ + function(_dereq_, module, exports) { + function isObject(what) { + return typeof what === 'object' && what !== null; + } + + // Yanked from https://git.io/vS8DV re-used under CC0 + // with some tiny modifications + function isError(value) { + switch ({}.toString.call(value)) { + case '[object Error]': + return true; + case '[object Exception]': + return true; + case '[object DOMException]': + return true; + default: + return value instanceof Error; + } + } + + function wrappedCallback(callback) { + function dataCallback(data, original) { + var normalizedData = callback(data) || data; + if (original) { + return original(normalizedData) || normalizedData; + } + return normalizedData; + } -/* + return dataCallback; + } + + module.exports = { + isObject: isObject, + isError: isError, + wrappedCallback: wrappedCallback + }; + }, + {} + ], + 6: [ + function(_dereq_, module, exports) { + (function(global) { + var utils = _dereq_(5); + + /* TraceKit - Cross brower stack traces This was originally forked from github.com/occ/TraceKit, but has since been @@ -2219,33 +2550,33 @@ var utils = _dereq_(5); MIT license */ -var TraceKit = { - collectWindowErrors: true, - debug: false -}; - -// This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) -var _window = typeof window !== 'undefined' ? window - : typeof global !== 'undefined' ? global - : typeof self !== 'undefined' ? self - : {}; + var TraceKit = { + collectWindowErrors: true, + debug: false + }; -// global reference to slice -var _slice = [].slice; -var UNKNOWN_FUNCTION = '?'; + // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) + var _window = + typeof window !== 'undefined' + ? window + : typeof global !== 'undefined' + ? global + : typeof self !== 'undefined' ? self : {}; -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types -var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/; + // global reference to slice + var _slice = [].slice; + var UNKNOWN_FUNCTION = '?'; -function getLocationHref() { - if (typeof document === 'undefined' || typeof document.location === 'undefined') - return ''; + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types + var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/; - return document.location.href; -} + function getLocationHref() { + if (typeof document === 'undefined' || document.location == null) return ''; + return document.location.href; + } -/** + /** * TraceKit.report: cross-browser processing of unhandled exceptions * * Syntax: @@ -2284,68 +2615,68 @@ function getLocationHref() { * Handlers receive a stackInfo object as described in the * TraceKit.computeStackTrace docs. */ -TraceKit.report = (function reportModuleWrapper() { - var handlers = [], - lastArgs = null, - lastException = null, - lastExceptionStack = null; + TraceKit.report = (function reportModuleWrapper() { + var handlers = [], + lastArgs = null, + lastException = null, + lastExceptionStack = null; - /** + /** * Add a crash handler. * @param {Function} handler */ - function subscribe(handler) { - installGlobalHandler(); - handlers.push(handler); - } + function subscribe(handler) { + installGlobalHandler(); + handlers.push(handler); + } - /** + /** * Remove a crash handler. * @param {Function} handler */ - function unsubscribe(handler) { - for (var i = handlers.length - 1; i >= 0; --i) { - if (handlers[i] === handler) { - handlers.splice(i, 1); - } - } - } + function unsubscribe(handler) { + for (var i = handlers.length - 1; i >= 0; --i) { + if (handlers[i] === handler) { + handlers.splice(i, 1); + } + } + } - /** + /** * Remove all crash handlers. */ - function unsubscribeAll() { - uninstallGlobalHandler(); - handlers = []; - } + function unsubscribeAll() { + uninstallGlobalHandler(); + handlers = []; + } - /** + /** * Dispatch stack information to all handlers. * @param {Object.} stack */ - function notifyHandlers(stack, isWindowError) { - var exception = null; - if (isWindowError && !TraceKit.collectWindowErrors) { - return; - } - for (var i in handlers) { - if (handlers.hasOwnProperty(i)) { - try { - handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); - } catch (inner) { - exception = inner; + function notifyHandlers(stack, isWindowError) { + var exception = null; + if (isWindowError && !TraceKit.collectWindowErrors) { + return; + } + for (var i in handlers) { + if (handlers.hasOwnProperty(i)) { + try { + handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); + } catch (inner) { + exception = inner; + } + } } - } - } - if (exception) { - throw exception; - } - } + if (exception) { + throw exception; + } + } - var _oldOnerrorHandler, _onErrorHandlerInstalled; + var _oldOnerrorHandler, _onErrorHandlerInstalled; - /** + /** * Ensures all global unhandled exceptions are recorded. * Supported by Gecko and IE. * @param {string} message Error message. @@ -2356,129 +2687,135 @@ TraceKit.report = (function reportModuleWrapper() { * occurred. * @param {?Error} ex The actual Error object. */ - function traceKitWindowOnError(message, url, lineNo, colNo, ex) { - var stack = null; - - if (lastExceptionStack) { - TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message); - processLastException(); - } else if (ex && utils.isError(ex)) { - // non-string `ex` arg; attempt to extract stack trace - - // New chrome and blink send along a real error object - // Let's just report that like a normal error. - // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror - stack = TraceKit.computeStackTrace(ex); - notifyHandlers(stack, true); - } else { - var location = { - 'url': url, - 'line': lineNo, - 'column': colNo - }; - - var name = undefined; - var msg = message; // must be new var or will modify original `arguments` - var groups; - if ({}.toString.call(message) === '[object String]') { - var groups = message.match(ERROR_TYPES_RE); - if (groups) { - name = groups[1]; - msg = groups[2]; - } - } - - location.func = UNKNOWN_FUNCTION; - - stack = { - 'name': name, - 'message': msg, - 'url': getLocationHref(), - 'stack': [location] - }; - notifyHandlers(stack, true); - } - - if (_oldOnerrorHandler) { - return _oldOnerrorHandler.apply(this, arguments); - } + function traceKitWindowOnError(message, url, lineNo, colNo, ex) { + var stack = null; + + if (lastExceptionStack) { + TraceKit.computeStackTrace.augmentStackTraceWithInitialElement( + lastExceptionStack, + url, + lineNo, + message + ); + processLastException(); + } else if (ex && utils.isError(ex)) { + // non-string `ex` arg; attempt to extract stack trace + + // New chrome and blink send along a real error object + // Let's just report that like a normal error. + // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror + stack = TraceKit.computeStackTrace(ex); + notifyHandlers(stack, true); + } else { + var location = { + url: url, + line: lineNo, + column: colNo + }; + + var name = undefined; + var msg = message; // must be new var or will modify original `arguments` + var groups; + if ({}.toString.call(message) === '[object String]') { + var groups = message.match(ERROR_TYPES_RE); + if (groups) { + name = groups[1]; + msg = groups[2]; + } + } - return false; - } + location.func = UNKNOWN_FUNCTION; - function installGlobalHandler () - { - if (_onErrorHandlerInstalled) { - return; - } - _oldOnerrorHandler = _window.onerror; - _window.onerror = traceKitWindowOnError; - _onErrorHandlerInstalled = true; - } + stack = { + name: name, + message: msg, + url: getLocationHref(), + stack: [location] + }; + notifyHandlers(stack, true); + } - function uninstallGlobalHandler () - { - if (!_onErrorHandlerInstalled) { - return; - } - _window.onerror = _oldOnerrorHandler; - _onErrorHandlerInstalled = false; - _oldOnerrorHandler = undefined; - } + if (_oldOnerrorHandler) { + return _oldOnerrorHandler.apply(this, arguments); + } - function processLastException() { - var _lastExceptionStack = lastExceptionStack, - _lastArgs = lastArgs; - lastArgs = null; - lastExceptionStack = null; - lastException = null; - notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs)); - } + return false; + } - /** + function installGlobalHandler() { + if (_onErrorHandlerInstalled) { + return; + } + _oldOnerrorHandler = _window.onerror; + _window.onerror = traceKitWindowOnError; + _onErrorHandlerInstalled = true; + } + + function uninstallGlobalHandler() { + if (!_onErrorHandlerInstalled) { + return; + } + _window.onerror = _oldOnerrorHandler; + _onErrorHandlerInstalled = false; + _oldOnerrorHandler = undefined; + } + + function processLastException() { + var _lastExceptionStack = lastExceptionStack, + _lastArgs = lastArgs; + lastArgs = null; + lastExceptionStack = null; + lastException = null; + notifyHandlers.apply( + null, + [_lastExceptionStack, false].concat(_lastArgs) + ); + } + + /** * Reports an unhandled Error to TraceKit. * @param {Error} ex * @param {?boolean} rethrow If false, do not re-throw the exception. * Only used for window.onerror to not cause an infinite loop of * rethrowing. */ - function report(ex, rethrow) { - var args = _slice.call(arguments, 1); - if (lastExceptionStack) { - if (lastException === ex) { - return; // already caught by an inner catch block, ignore - } else { - processLastException(); - } - } - - var stack = TraceKit.computeStackTrace(ex); - lastExceptionStack = stack; - lastException = ex; - lastArgs = args; - - // If the stack trace is incomplete, wait for 2 seconds for - // slow slow IE to see if onerror occurs or not before reporting - // this exception; otherwise, we will end up with an incomplete - // stack trace - setTimeout(function () { - if (lastException === ex) { - processLastException(); - } - }, (stack.incomplete ? 2000 : 0)); + function report(ex, rethrow) { + var args = _slice.call(arguments, 1); + if (lastExceptionStack) { + if (lastException === ex) { + return; // already caught by an inner catch block, ignore + } else { + processLastException(); + } + } - if (rethrow !== false) { - throw ex; // re-throw to propagate to the top level (and cause window.onerror) - } - } + var stack = TraceKit.computeStackTrace(ex); + lastExceptionStack = stack; + lastException = ex; + lastArgs = args; + + // If the stack trace is incomplete, wait for 2 seconds for + // slow slow IE to see if onerror occurs or not before reporting + // this exception; otherwise, we will end up with an incomplete + // stack trace + setTimeout(function() { + if (lastException === ex) { + processLastException(); + } + }, stack.incomplete ? 2000 : 0); + + if (rethrow !== false) { + throw ex; // re-throw to propagate to the top level (and cause window.onerror) + } + } - report.subscribe = subscribe; - report.unsubscribe = unsubscribe; - report.uninstall = unsubscribeAll; - return report; -}()); + report.subscribe = subscribe; + report.unsubscribe = unsubscribe; + report.uninstall = unsubscribeAll; + return report; + })(); -/** + /** * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript * * Syntax: @@ -2529,138 +2866,140 @@ TraceKit.report = (function reportModuleWrapper() { * inner function that actually caused the exception). * */ -TraceKit.computeStackTrace = (function computeStackTraceWrapper() { - // Contents of Exception in various browsers. - // - // SAFARI: - // ex.message = Can't find variable: qq - // ex.line = 59 - // ex.sourceId = 580238192 - // ex.sourceURL = http://... - // ex.expressionBeginOffset = 96 - // ex.expressionCaretOffset = 98 - // ex.expressionEndOffset = 98 - // ex.name = ReferenceError - // - // FIREFOX: - // ex.message = qq is not defined - // ex.fileName = http://... - // ex.lineNumber = 59 - // ex.columnNumber = 69 - // ex.stack = ...stack trace... (see the example below) - // ex.name = ReferenceError - // - // CHROME: - // ex.message = qq is not defined - // ex.name = ReferenceError - // ex.type = not_defined - // ex.arguments = ['aa'] - // ex.stack = ...stack trace... - // - // INTERNET EXPLORER: - // ex.message = ... - // ex.name = ReferenceError - // - // OPERA: - // ex.message = ...message... (see the example below) - // ex.name = ReferenceError - // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) - // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' - - /** + TraceKit.computeStackTrace = (function computeStackTraceWrapper() { + // Contents of Exception in various browsers. + // + // SAFARI: + // ex.message = Can't find variable: qq + // ex.line = 59 + // ex.sourceId = 580238192 + // ex.sourceURL = http://... + // ex.expressionBeginOffset = 96 + // ex.expressionCaretOffset = 98 + // ex.expressionEndOffset = 98 + // ex.name = ReferenceError + // + // FIREFOX: + // ex.message = qq is not defined + // ex.fileName = http://... + // ex.lineNumber = 59 + // ex.columnNumber = 69 + // ex.stack = ...stack trace... (see the example below) + // ex.name = ReferenceError + // + // CHROME: + // ex.message = qq is not defined + // ex.name = ReferenceError + // ex.type = not_defined + // ex.arguments = ['aa'] + // ex.stack = ...stack trace... + // + // INTERNET EXPLORER: + // ex.message = ... + // ex.name = ReferenceError + // + // OPERA: + // ex.message = ...message... (see the example below) + // ex.name = ReferenceError + // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) + // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' + + /** * Computes stack trace information from the stack property. * Chrome and Gecko use this property. * @param {Error} ex * @return {?Object.} Stack trace information. */ - function computeStackTraceFromStackProp(ex) { - if (typeof ex.stack === 'undefined' || !ex.stack) return; - - var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, - gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i, - winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, - - // Used to additionally parse URL/line/column from eval frames - geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i, - chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/, - - lines = ex.stack.split('\n'), - stack = [], - submatch, - parts, - element, - reference = /^(.*) is undefined$/.exec(ex.message); - - for (var i = 0, j = lines.length; i < j; ++i) { - if ((parts = chrome.exec(lines[i]))) { - var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line - var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line - if (isEval && (submatch = chromeEval.exec(parts[2]))) { - // throw out eval line/column and use top-most line/column number - parts[2] = submatch[1]; // url - parts[3] = submatch[2]; // line - parts[4] = submatch[3]; // column - } - element = { - 'url': !isNative ? parts[2] : null, - 'func': parts[1] || UNKNOWN_FUNCTION, - 'args': isNative ? [parts[2]] : [], - 'line': parts[3] ? +parts[3] : null, - 'column': parts[4] ? +parts[4] : null - }; - } else if ( parts = winjs.exec(lines[i]) ) { - element = { - 'url': parts[2], - 'func': parts[1] || UNKNOWN_FUNCTION, - 'args': [], - 'line': +parts[3], - 'column': parts[4] ? +parts[4] : null - }; - } else if ((parts = gecko.exec(lines[i]))) { - var isEval = parts[3] && parts[3].indexOf(' > eval') > -1; - if (isEval && (submatch = geckoEval.exec(parts[3]))) { - // throw out eval line/column and use top-most line number - parts[3] = submatch[1]; - parts[4] = submatch[2]; - parts[5] = null; // no column when eval - } else if (i === 0 && !parts[5] && typeof ex.columnNumber !== 'undefined') { - // FireFox uses this awesome columnNumber property for its top frame - // Also note, Firefox's column number is 0-based and everything else expects 1-based, - // so adding 1 - // NOTE: this hack doesn't work if top-most frame is eval - stack[0].column = ex.columnNumber + 1; - } - element = { - 'url': parts[3], - 'func': parts[1] || UNKNOWN_FUNCTION, - 'args': parts[2] ? parts[2].split(',') : [], - 'line': parts[4] ? +parts[4] : null, - 'column': parts[5] ? +parts[5] : null - }; - } else { - continue; - } + function computeStackTraceFromStackProp(ex) { + if (typeof ex.stack === 'undefined' || !ex.stack) return; + + var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, + gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i, + winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, + // Used to additionally parse URL/line/column from eval frames + geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i, + chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/, + lines = ex.stack.split('\n'), + stack = [], + submatch, + parts, + element, + reference = /^(.*) is undefined$/.exec(ex.message); + + for (var i = 0, j = lines.length; i < j; ++i) { + if ((parts = chrome.exec(lines[i]))) { + var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line + var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line + if (isEval && (submatch = chromeEval.exec(parts[2]))) { + // throw out eval line/column and use top-most line/column number + parts[2] = submatch[1]; // url + parts[3] = submatch[2]; // line + parts[4] = submatch[3]; // column + } + element = { + url: !isNative ? parts[2] : null, + func: parts[1] || UNKNOWN_FUNCTION, + args: isNative ? [parts[2]] : [], + line: parts[3] ? +parts[3] : null, + column: parts[4] ? +parts[4] : null + }; + } else if ((parts = winjs.exec(lines[i]))) { + element = { + url: parts[2], + func: parts[1] || UNKNOWN_FUNCTION, + args: [], + line: +parts[3], + column: parts[4] ? +parts[4] : null + }; + } else if ((parts = gecko.exec(lines[i]))) { + var isEval = parts[3] && parts[3].indexOf(' > eval') > -1; + if (isEval && (submatch = geckoEval.exec(parts[3]))) { + // throw out eval line/column and use top-most line number + parts[3] = submatch[1]; + parts[4] = submatch[2]; + parts[5] = null; // no column when eval + } else if ( + i === 0 && + !parts[5] && + typeof ex.columnNumber !== 'undefined' + ) { + // FireFox uses this awesome columnNumber property for its top frame + // Also note, Firefox's column number is 0-based and everything else expects 1-based, + // so adding 1 + // NOTE: this hack doesn't work if top-most frame is eval + stack[0].column = ex.columnNumber + 1; + } + element = { + url: parts[3], + func: parts[1] || UNKNOWN_FUNCTION, + args: parts[2] ? parts[2].split(',') : [], + line: parts[4] ? +parts[4] : null, + column: parts[5] ? +parts[5] : null + }; + } else { + continue; + } - if (!element.func && element.line) { - element.func = UNKNOWN_FUNCTION; - } + if (!element.func && element.line) { + element.func = UNKNOWN_FUNCTION; + } - stack.push(element); - } + stack.push(element); + } - if (!stack.length) { - return null; - } + if (!stack.length) { + return null; + } - return { - 'name': ex.name, - 'message': ex.message, - 'url': getLocationHref(), - 'stack': stack - }; - } + return { + name: ex.name, + message: ex.message, + url: getLocationHref(), + stack: stack + }; + } - /** + /** * Adds information about the first frame to incomplete stack traces. * Safari and IE require this to get complete data on the first frame. * @param {Object.} stackInfo Stack trace information from @@ -2673,41 +3012,49 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { * @return {boolean} Whether or not the stack information was * augmented. */ - function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) { - var initial = { - 'url': url, - 'line': lineNo - }; + function augmentStackTraceWithInitialElement( + stackInfo, + url, + lineNo, + message + ) { + var initial = { + url: url, + line: lineNo + }; - if (initial.url && initial.line) { - stackInfo.incomplete = false; + if (initial.url && initial.line) { + stackInfo.incomplete = false; - if (!initial.func) { - initial.func = UNKNOWN_FUNCTION; - } + if (!initial.func) { + initial.func = UNKNOWN_FUNCTION; + } - if (stackInfo.stack.length > 0) { - if (stackInfo.stack[0].url === initial.url) { - if (stackInfo.stack[0].line === initial.line) { + if (stackInfo.stack.length > 0) { + if (stackInfo.stack[0].url === initial.url) { + if (stackInfo.stack[0].line === initial.line) { return false; // already in stack trace - } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) { + } else if ( + !stackInfo.stack[0].line && + stackInfo.stack[0].func === initial.func + ) { stackInfo.stack[0].line = initial.line; return false; + } } - } - } + } - stackInfo.stack.unshift(initial); - stackInfo.partial = true; - return true; - } else { - stackInfo.incomplete = true; - } + stackInfo.stack.unshift(initial); + stackInfo.partial = true; + return true; + } else { + stackInfo.incomplete = true; + } - return false; - } + return false; + } - /** + /** * Computes stack trace information by walking the arguments.caller * chain at the time the exception occurred. This will cause earlier * frames to be missed but is the only way to get any stack trace in @@ -2716,159 +3063,212 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() { * @param {Error} ex * @return {?Object.} Stack trace information. */ - function computeStackTraceByWalkingCallerChain(ex, depth) { - var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, - stack = [], - funcs = {}, - recursion = false, - parts, - item, - source; - - for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) { - if (curr === computeStackTrace || curr === TraceKit.report) { - // console.log('skipping internal function'); - continue; - } - - item = { - 'url': null, - 'func': UNKNOWN_FUNCTION, - 'line': null, - 'column': null - }; - - if (curr.name) { - item.func = curr.name; - } else if ((parts = functionName.exec(curr.toString()))) { - item.func = parts[1]; - } - - if (typeof item.func === 'undefined') { - try { - item.func = parts.input.substring(0, parts.input.indexOf('{')); - } catch (e) { } - } - - if (funcs['' + curr]) { - recursion = true; - }else{ - funcs['' + curr] = true; - } - - stack.push(item); - } - - if (depth) { - // console.log('depth is ' + depth); - // console.log('stack is ' + stack.length); - stack.splice(0, depth); - } + function computeStackTraceByWalkingCallerChain(ex, depth) { + var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, + stack = [], + funcs = {}, + recursion = false, + parts, + item, + source; + + for ( + var curr = computeStackTraceByWalkingCallerChain.caller; + curr && !recursion; + curr = curr.caller + ) { + if (curr === computeStackTrace || curr === TraceKit.report) { + // console.log('skipping internal function'); + continue; + } + + item = { + url: null, + func: UNKNOWN_FUNCTION, + line: null, + column: null + }; + + if (curr.name) { + item.func = curr.name; + } else if ((parts = functionName.exec(curr.toString()))) { + item.func = parts[1]; + } + + if (typeof item.func === 'undefined') { + try { + item.func = parts.input.substring(0, parts.input.indexOf('{')); + } catch (e) {} + } + + if (funcs['' + curr]) { + recursion = true; + } else { + funcs['' + curr] = true; + } + + stack.push(item); + } - var result = { - 'name': ex.name, - 'message': ex.message, - 'url': getLocationHref(), - 'stack': stack - }; - augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description); - return result; - } + if (depth) { + // console.log('depth is ' + depth); + // console.log('stack is ' + stack.length); + stack.splice(0, depth); + } - /** + var result = { + name: ex.name, + message: ex.message, + url: getLocationHref(), + stack: stack + }; + augmentStackTraceWithInitialElement( + result, + ex.sourceURL || ex.fileName, + ex.line || ex.lineNumber, + ex.message || ex.description + ); + return result; + } + + /** * Computes a stack trace for an exception. * @param {Error} ex * @param {(string|number)=} depth */ - function computeStackTrace(ex, depth) { - var stack = null; - depth = (depth == null ? 0 : +depth); - - try { - stack = computeStackTraceFromStackProp(ex); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - - try { - stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - return { - 'name': ex.name, - 'message': ex.message, - 'url': getLocationHref() - }; - } - - computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; - computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp; - - return computeStackTrace; -}()); + function computeStackTrace(ex, depth) { + var stack = null; + depth = depth == null ? 0 : +depth; -module.exports = TraceKit; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"5":5}],7:[function(_dereq_,module,exports){ -'use strict'; + try { + stack = computeStackTraceFromStackProp(ex); + if (stack) { + return stack; + } + } catch (e) { + if (TraceKit.debug) { + throw e; + } + } -/* + try { + stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); + if (stack) { + return stack; + } + } catch (e) { + if (TraceKit.debug) { + throw e; + } + } + return { + name: ex.name, + message: ex.message, + url: getLocationHref() + }; + } + + computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; + computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp; + + return computeStackTrace; + })(); + + module.exports = TraceKit; + }.call( + this, + typeof global !== 'undefined' + ? global + : typeof self !== 'undefined' + ? self + : typeof window !== 'undefined' ? window : {} + )); + }, + {'5': 5} + ], + 7: [ + function(_dereq_, module, exports) { + /* json-stringify-safe Like JSON.stringify, but doesn't throw on circular references. Originally forked from https://github.com/isaacs/json-stringify-safe - version 5.0.1 on 3/8/2017 and modified for IE8 compatibility. - Tests for this are in test/vendor. + version 5.0.1 on 3/8/2017 and modified to handle Errors serialization + and IE8 compatibility. Tests for this are in test/vendor. ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE */ -exports = module.exports = stringify -exports.getSerialize = serializer + exports = module.exports = stringify; + exports.getSerialize = serializer; -function indexOf(haystack, needle) { - for (var i = 0; i < haystack.length; ++i) { - if (haystack[i] === needle) return i; - } - return -1; -} + function indexOf(haystack, needle) { + for (var i = 0; i < haystack.length; ++i) { + if (haystack[i] === needle) return i; + } + return -1; + } + + function stringify(obj, replacer, spaces, cycleReplacer) { + return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces); + } + + // https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106 + function stringifyError(value) { + var err = { + // These properties are implemented as magical getters and don't show up in for in + stack: value.stack, + message: value.message, + name: value.name + }; -function stringify(obj, replacer, spaces, cycleReplacer) { - return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces) -} + for (var i in value) { + if (Object.prototype.hasOwnProperty.call(value, i)) { + err[i] = value[i]; + } + } -function serializer(replacer, cycleReplacer) { - var stack = [], keys = [] + return err; + } - if (cycleReplacer == null) cycleReplacer = function(key, value) { - if (stack[0] === value) return '[Circular ~]' - return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']' - } + function serializer(replacer, cycleReplacer) { + var stack = []; + var keys = []; - return function(key, value) { - if (stack.length > 0) { - var thisPos = indexOf(stack, this); - ~thisPos ? stack.splice(thisPos + 1) : stack.push(this) - ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key) - if (~indexOf(stack, value)) value = cycleReplacer.call(this, key, value) - } - else stack.push(value) + if (cycleReplacer == null) { + cycleReplacer = function(key, value) { + if (stack[0] === value) { + return '[Circular ~]'; + } + return ( + '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']' + ); + }; + } - return replacer == null ? value : replacer.call(this, key, value) - } -} + return function(key, value) { + if (stack.length > 0) { + var thisPos = indexOf(stack, this); + ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); + ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); -},{}]},{},[4])(4) -}); \ No newline at end of file + if (~indexOf(stack, value)) { + value = cycleReplacer.call(this, key, value); + } + } else { + stack.push(value); + } + + return replacer == null + ? value instanceof Error ? stringifyError(value) : value + : replacer.call(this, key, value); + }; + } + }, + {} + ] + }, + {}, + [4] + )(4); +}); diff --git a/dist/raven.min.js b/dist/raven.min.js index 13a44854d19d..b4c7cd21d1e1 100644 --- a/dist/raven.min.js +++ b/dist/raven.min.js @@ -1,3 +1,1532 @@ -/*! Raven.js 3.17.0 (6384830) | github.com/getsentry/raven-js */ -!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.Raven=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g ",i=h.length;a&&f++1&&g+e.length*i+b.length>=d));)e.push(b),g+=b.length,a=a.parentNode;return e.reverse().join(h)}function u(a){var b,c,d,e,f,g=[];if(!a||!a.tagName)return"";if(g.push(a.tagName.toLowerCase()),a.id&&g.push("#"+a.id),b=a.className,b&&i(b))for(c=b.split(/\s+/),f=0;fthis.k.maxBreadcrumbs&&this.t.shift(),this},addPlugin:function(a){var b=[].slice.call(arguments,1);return this.q.push([a,b]),this.m&&this.C(),this},setUserContext:function(a){return this.j.user=a,this},setExtraContext:function(a){return this.Q("extra",a),this},setTagsContext:function(a){return this.Q("tags",a),this},clearContext:function(){return this.j={},this},getContext:function(){return JSON.parse(A(this.j))},setEnvironment:function(a){return this.k.environment=a,this},setRelease:function(a){return this.k.release=a,this},setDataCallback:function(a){var b=this.k.dataCallback;return this.k.dataCallback=e(b,a),this},setBreadcrumbCallback:function(a){var b=this.k.breadcrumbCallback;return this.k.breadcrumbCallback=e(b,a),this},setShouldSendCallback:function(a){var b=this.k.shouldSendCallback;return this.k.shouldSendCallback=e(b,a),this},setTransport:function(a){return this.k.transport=a,this},lastException:function(){return this.d},lastEventId:function(){return this.f},isSetup:function(){return!!this.a&&(!!this.g||(this.ravenNotConfiguredError||(this.ravenNotConfiguredError=!0,this.y("error","Error: Raven has not been configured.")),!1))},afterLoad:function(){var a=I.RavenConfig;a&&this.config(a.dsn,a.config).install()},showReportDialog:function(a){if(J){a=a||{};var b=a.eventId||this.lastEventId();if(!b)throw new B("Missing eventId");var c=a.dsn||this.E;if(!c)throw new B("Missing DSN");var d=encodeURIComponent,e="";e+="?eventId="+d(b),e+="&dsn="+d(c);var f=a.user||this.j.user;f&&(f.name&&(e+="&name="+d(f.name)),f.email&&(e+="&email="+d(f.email)));var g=this.G(this.D(c)),h=J.createElement("script");h.async=!0,h.src=g+"/api/embed/error-page/"+e,(J.head||J.body).appendChild(h)}},I:function(){var a=this;this.l+=1,setTimeout(function(){a.l-=1})},R:function(a,b){var c,d;if(this.b){b=b||{},a="raven"+a.substr(0,1).toUpperCase()+a.substr(1),J.createEvent?(c=J.createEvent("HTMLEvents"),c.initEvent(a,!0,!0)):(c=J.createEventObject(),c.eventType=a);for(d in b)o(b,d)&&(c[d]=b[d]);if(J.createEvent)J.dispatchEvent(c);else try{J.fireEvent("on"+c.eventType.toLowerCase(),c)}catch(e){}}},S:function(a){var b=this;return function(c){if(b.T=null,b.u!==c){b.u=c;var d;try{d=t(c.target)}catch(e){d=""}b.captureBreadcrumb({category:"ui."+a,message:d})}}},U:function(){var a=this,b=1e3;return function(c){var d;try{d=c.target}catch(e){return}var f=d&&d.tagName;if(f&&("INPUT"===f||"TEXTAREA"===f||d.isContentEditable)){var g=a.T;g||a.S("input")(c),clearTimeout(g),a.T=setTimeout(function(){a.T=null},b)}}},V:function(a,b){var c=r(this.v.href),d=r(b),e=r(a);this.w=b,c.protocol===d.protocol&&c.host===d.host&&(b=d.relative),c.protocol===e.protocol&&c.host===e.host&&(a=e.relative),this.captureBreadcrumb({category:"navigation",data:{to:b,from:a}})},A:function(){function a(a){return function(b,d){for(var e=new Array(arguments.length),f=0;f2?arguments[2]:void 0;return c&&b.V(b.w,c+""),a.apply(this,arguments)}},d)}if(c.console&&"console"in I&&console.log){var m=function(a,c){b.captureBreadcrumb({message:a,level:c.level,category:"console"})};k(["debug","info","warn","error","log"],function(a,b){F(console,b,m)})}},M:function(){for(var a;this.s.length;){a=this.s.shift();var b=a[0],c=a[1],d=a[2];b[c]=d}},C:function(){var a=this;k(this.q,function(b,c){var d=c[0],e=c[1];d.apply(a,[a].concat(e))})},D:function(a){var b=H.exec(a),c={},d=7;try{for(;d--;)c[G[d]]=b[d]||""}catch(e){throw new B("Invalid DSN: "+a)}if(c.pass&&!this.k.allowSecretKey)throw new B("Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key");return c},G:function(a){var b="//"+a.host+(a.port?":"+a.port:"");return a.protocol&&(b=a.protocol+":"+b),b},z:function(){this.l||this.N.apply(this,arguments)},N:function(a,b){var c=this.O(a,b);this.R("handle",{stackInfo:a,options:b}),this.X(a.name,a.message,a.url,a.lineno,c,b)},O:function(a,b){var c=this,d=[];if(a.stack&&a.stack.length&&(k(a.stack,function(a,b){var e=c.Y(b);e&&d.push(e)}),b&&b.trimHeadFrames))for(var e=0;e0&&(a.breadcrumbs={values:[].slice.call(this.t,0)}),j(a.tags)&&delete a.tags,this.j.user&&(a.user=this.j.user),b.environment&&(a.environment=b.environment),b.release&&(a.release=b.release),b.serverName&&(a.server_name=b.serverName),h(b.dataCallback)&&(a=b.dataCallback(a)||a),a&&!j(a)&&(!h(b.shouldSendCallback)||b.shouldSendCallback(a)))return this.ca()?void this.y("warn","Raven dropped error due to backoff: ",a):void("number"==typeof b.sampleRate?Math.random()=0;--b)s[b]===a&&s.splice(b,1)}function c(){n(),s=[]}function k(a,b){var c=null;if(!b||f.collectWindowErrors){for(var d in s)if(s.hasOwnProperty(d))try{s[d].apply(null,[a].concat(h.call(arguments,2)))}catch(e){c=e}if(c)throw c}}function l(a,b,c,g,h){var l=null;if(v)f.computeStackTrace.augmentStackTraceWithInitialElement(v,b,c,a),o();else if(h&&e.isError(h))l=f.computeStackTrace(h),k(l,!0);else{var m,n={url:b,line:c,column:g},p=void 0,r=a;if("[object String]"==={}.toString.call(a)){var m=a.match(j);m&&(p=m[1],r=m[2])}n.func=i,l={name:p,message:r,url:d(),stack:[n]},k(l,!0)}return!!q&&q.apply(this,arguments)}function m(){r||(q=g.onerror,g.onerror=l,r=!0)}function n(){r&&(g.onerror=q,r=!1,q=void 0)}function o(){var a=v,b=t;t=null,v=null,u=null,k.apply(null,[a,!1].concat(b))}function p(a,b){var c=h.call(arguments,1);if(v){if(u===a)return;o()}var d=f.computeStackTrace(a);if(v=d,u=a,t=c,setTimeout(function(){u===a&&o()},d.incomplete?2e3:0),b!==!1)throw a}var q,r,s=[],t=null,u=null,v=null;return p.subscribe=a,p.unsubscribe=b,p.uninstall=c,p}(),f.computeStackTrace=function(){function a(a){if("undefined"!=typeof a.stack&&a.stack){for(var b,c,e,f=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,g=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i,h=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,j=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,k=/\((\S*)(?::(\d+))(?::(\d+))\)/,l=a.stack.split("\n"),m=[],n=(/^(.*) is undefined$/.exec(a.message),0),o=l.length;n eval")>-1;q&&(b=j.exec(c[3]))?(c[3]=b[1],c[4]=b[2],c[5]=null):0!==n||c[5]||"undefined"==typeof a.columnNumber||(m[0].column=a.columnNumber+1),e={url:c[3],func:c[1]||i,args:c[2]?c[2].split(","):[],line:c[4]?+c[4]:null,column:c[5]?+c[5]:null}}!e.func&&e.line&&(e.func=i),m.push(e)}return m.length?{name:a.name,message:a.message,url:d(),stack:m}:null}}function b(a,b,c,d){var e={url:b,line:c};if(e.url&&e.line){if(a.incomplete=!1,e.func||(e.func=i),a.stack.length>0&&a.stack[0].url===e.url){if(a.stack[0].line===e.line)return!1;if(!a.stack[0].line&&a.stack[0].func===e.func)return a.stack[0].line=e.line,!1}return a.stack.unshift(e),a.partial=!0,!0}return a.incomplete=!0,!1}function c(a,g){for(var h,j,k=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,l=[],m={},n=!1,o=c.caller;o&&!n;o=o.caller)if(o!==e&&o!==f.report){if(j={url:null,func:i,line:null,column:null},o.name?j.func=o.name:(h=k.exec(o.toString()))&&(j.func=h[1]),"undefined"==typeof j.func)try{j.func=h.input.substring(0,h.input.indexOf("{"))}catch(p){}m[""+o]?n=!0:m[""+o]=!0,l.push(j)}g&&l.splice(0,g);var q={name:a.name,message:a.message,url:d(),stack:l};return b(q,a.sourceURL||a.fileName,a.line||a.lineNumber,a.message||a.description),q}function e(b,e){var g=null;e=null==e?0:+e;try{if(g=a(b))return g}catch(h){if(f.debug)throw h}try{if(g=c(b,e+1))return g}catch(h){if(f.debug)throw h}return{name:b.name,message:b.message,url:d()}}return e.augmentStackTraceWithInitialElement=b,e.computeStackTraceFromStackProp=a,e}(),b.exports=f}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{5:5}],7:[function(a,b,c){"use strict";function d(a,b){for(var c=0;c0){var h=d(c,this);~h?c.splice(h+1):c.push(this),~h?e.splice(h,1/0,f):e.push(f),~d(c,g)&&(g=b.call(this,f,g))}else c.push(g);return null==a?g:a.call(this,f,g)}}c=b.exports=e,c.getSerialize=f},{}]},{},[4])(4)}); -//# sourceMappingURL=raven.min.js.map \ No newline at end of file +/*! Raven.js 3.18.0 (b771bb2) | github.com/getsentry/raven-js */ +!(function(a) { + if ('object' == typeof exports && 'undefined' != typeof module) module.exports = a(); + else if ('function' == typeof define && define.amd) define([], a); + else { + var b; + (b = + 'undefined' != typeof window + ? window + : 'undefined' != typeof global + ? global + : 'undefined' != typeof self ? self : this), + (b.Raven = a()); + } +})(function() { + return (function a(b, c, d) { + function e(g, h) { + if (!c[g]) { + if (!b[g]) { + var i = 'function' == typeof require && require; + if (!h && i) return i(g, !0); + if (f) return f(g, !0); + var j = new Error("Cannot find module '" + g + "'"); + throw ((j.code = 'MODULE_NOT_FOUND'), j); + } + var k = (c[g] = {exports: {}}); + b[g][0].call( + k.exports, + function(a) { + var c = b[g][1][a]; + return e(c ? c : a); + }, + k, + k.exports, + a, + b, + c, + d + ); + } + return c[g].exports; + } + for (var f = 'function' == typeof require && require, g = 0; g < d.length; g++) + e(d[g]); + return e; + })( + { + 1: [ + function(a, b, c) { + function d(a) { + (this.name = 'RavenConfigError'), (this.message = a); + } + (d.prototype = new Error()), (d.prototype.constructor = d), (b.exports = d); + }, + {} + ], + 2: [ + function(a, b, c) { + var d = function(a, b, c) { + var d = a[b], + e = a; + if (b in a) { + var f = 'warn' === b ? 'warning' : b; + a[b] = function() { + var a = [].slice.call(arguments), + g = '' + a.join(' '), + h = {level: f, logger: 'console', extra: {arguments: a}}; + 'assert' === b + ? a[0] === !1 && + ((g = + 'Assertion failed: ' + (a.slice(1).join(' ') || 'console.assert')), + (h.extra.arguments = a.slice(1)), + c && c(g, h)) + : c && c(g, h), + d && Function.prototype.apply.call(d, e, a); + }; + } + }; + b.exports = {wrapMethod: d}; + }, + {} + ], + 3: [ + function(a, b, c) { + (function(c) { + function d() { + return +new Date(); + } + function e(a, b) { + return h(b) + ? function(c) { + return b(c, a); + } + : b; + } + function f() { + (this.a = !('object' != typeof JSON || !JSON.stringify)), + (this.b = !g(J)), + (this.c = !g(K)), + (this.d = null), + (this.e = null), + (this.f = null), + (this.g = null), + (this.h = null), + (this.i = null), + (this.j = {}), + (this.k = { + logger: 'javascript', + ignoreErrors: [], + ignoreUrls: [], + whitelistUrls: [], + includePaths: [], + collectWindowErrors: !0, + maxMessageLength: 0, + maxUrlLength: 250, + stackTraceLimit: 50, + autoBreadcrumbs: !0, + instrument: !0, + sampleRate: 1 + }), + (this.l = 0), + (this.m = !1), + (this.n = Error.stackTraceLimit), + (this.o = I.console || {}), + (this.p = {}), + (this.q = []), + (this.r = d()), + (this.s = []), + (this.t = []), + (this.u = null), + (this.v = I.location), + (this.w = this.v && this.v.href), + this.x(); + for (var a in this.o) this.p[a] = this.o[a]; + } + function g(a) { + return void 0 === a; + } + function h(a) { + return 'function' == typeof a; + } + function i(a) { + return '[object String]' === L.toString.call(a); + } + function j(a) { + for (var b in a) return !1; + return !0; + } + function k(a, b) { + var c, d; + if (g(a.length)) for (c in a) o(a, c) && b.call(null, c, a[c]); + else if ((d = a.length)) for (c = 0; c < d; c++) b.call(null, c, a[c]); + } + function l(a, b) { + return b + ? (k(b, function(b, c) { + a[b] = c; + }), + a) + : a; + } + function m(a) { + return !!Object.isFrozen && Object.isFrozen(a); + } + function n(a, b) { + return !b || a.length <= b ? a : a.substr(0, b) + '…'; + } + function o(a, b) { + return L.hasOwnProperty.call(a, b); + } + function p(a) { + for (var b, c = [], d = 0, e = a.length; d < e; d++) + (b = a[d]), + i(b) + ? c.push(b.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')) + : b && b.source && c.push(b.source); + return new RegExp(c.join('|'), 'i'); + } + function q(a) { + var b = []; + return ( + k(a, function(a, c) { + b.push(encodeURIComponent(a) + '=' + encodeURIComponent(c)); + }), + b.join('&') + ); + } + function r(a) { + var b = a.match( + /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/ + ); + if (!b) return {}; + var c = b[6] || '', + d = b[8] || ''; + return {protocol: b[2], host: b[4], path: b[5], relative: b[5] + c + d}; + } + function s() { + var a = I.crypto || I.msCrypto; + if (!g(a) && a.getRandomValues) { + var b = new Uint16Array(8); + a.getRandomValues(b), + (b[3] = (4095 & b[3]) | 16384), + (b[4] = (16383 & b[4]) | 32768); + var c = function(a) { + for (var b = a.toString(16); b.length < 4; ) b = '0' + b; + return b; + }; + return ( + c(b[0]) + + c(b[1]) + + c(b[2]) + + c(b[3]) + + c(b[4]) + + c(b[5]) + + c(b[6]) + + c(b[7]) + ); + } + return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(a) { + var b = (16 * Math.random()) | 0, + c = 'x' === a ? b : (3 & b) | 8; + return c.toString(16); + }); + } + function t(a) { + for ( + var b, c = 5, d = 80, e = [], f = 0, g = 0, h = ' > ', i = h.length; + a && + f++ < c && + ((b = u(a)), + !('html' === b || (f > 1 && g + e.length * i + b.length >= d))); + + ) + e.push(b), (g += b.length), (a = a.parentNode); + return e.reverse().join(h); + } + function u(a) { + var b, + c, + d, + e, + f, + g = []; + if (!a || !a.tagName) return ''; + if ( + (g.push(a.tagName.toLowerCase()), + a.id && g.push('#' + a.id), + (b = a.className), + b && i(b)) + ) + for (c = b.split(/\s+/), f = 0; f < c.length; f++) g.push('.' + c[f]); + var h = ['type', 'name', 'title', 'alt']; + for (f = 0; f < h.length; f++) + (d = h[f]), + (e = a.getAttribute(d)), + e && g.push('[' + d + '="' + e + '"]'); + return g.join(''); + } + function v(a, b) { + return !!(!!a ^ !!b); + } + function w(a, b) { + return ( + !v(a, b) && + ((a = a.values[0]), + (b = b.values[0]), + a.type === b.type && a.value === b.value && x(a.stacktrace, b.stacktrace)) + ); + } + function x(a, b) { + if (v(a, b)) return !1; + var c = a.frames, + d = b.frames; + if (c.length !== d.length) return !1; + for (var e, f, g = 0; g < c.length; g++) + if ( + ((e = c[g]), + (f = d[g]), + e.filename !== f.filename || + e.lineno !== f.lineno || + e.colno !== f.colno || + e['function'] !== f['function']) + ) + return !1; + return !0; + } + function y(a, b, c, d) { + var e = a[b]; + (a[b] = c(e)), d && d.push([a, b, e]); + } + var z = a(6), + A = a(7), + B = a(1), + C = a(5), + D = C.isError, + E = C.isObject, + F = a(2).wrapMethod, + G = 'source protocol user pass host port path'.split(' '), + H = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/, + I = + 'undefined' != typeof window + ? window + : 'undefined' != typeof c ? c : 'undefined' != typeof self ? self : {}, + J = I.document, + K = I.navigator; + f.prototype = { + VERSION: '3.18.0', + debug: !1, + TraceKit: z, + config: function(a, b) { + var c = this; + if (c.g) + return this.y('error', 'Error: Raven has already been configured'), c; + if (!a) return c; + var d = c.k; + b && + k(b, function(a, b) { + 'tags' === a || 'extra' === a || 'user' === a + ? (c.j[a] = b) + : (d[a] = b); + }), + c.setDSN(a), + d.ignoreErrors.push(/^Script error\.?$/), + d.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/), + (d.ignoreErrors = p(d.ignoreErrors)), + (d.ignoreUrls = !!d.ignoreUrls.length && p(d.ignoreUrls)), + (d.whitelistUrls = !!d.whitelistUrls.length && p(d.whitelistUrls)), + (d.includePaths = p(d.includePaths)), + (d.maxBreadcrumbs = Math.max( + 0, + Math.min(d.maxBreadcrumbs || 100, 100) + )); + var e = {xhr: !0, console: !0, dom: !0, location: !0}, + f = d.autoBreadcrumbs; + '[object Object]' === {}.toString.call(f) + ? (f = l(e, f)) + : f !== !1 && (f = e), + (d.autoBreadcrumbs = f); + var g = {tryCatch: !0}, + h = d.instrument; + return ( + '[object Object]' === {}.toString.call(h) + ? (h = l(g, h)) + : h !== !1 && (h = g), + (d.instrument = h), + (z.collectWindowErrors = !!d.collectWindowErrors), + c + ); + }, + install: function() { + var a = this; + return ( + a.isSetup() && + !a.m && + (z.report.subscribe(function() { + a.z.apply(a, arguments); + }), + a.k.instrument && a.k.instrument.tryCatch && a.A(), + a.k.autoBreadcrumbs && a.B(), + a.C(), + (a.m = !0)), + (Error.stackTraceLimit = a.k.stackTraceLimit), + this + ); + }, + setDSN: function(a) { + var b = this, + c = b.D(a), + d = c.path.lastIndexOf('/'), + e = c.path.substr(1, d); + (b.E = a), + (b.h = c.user), + (b.F = c.pass && c.pass.substr(1)), + (b.i = c.path.substr(d + 1)), + (b.g = b.G(c)), + (b.H = b.g + '/' + e + 'api/' + b.i + '/store/'), + this.x(); + }, + context: function(a, b, c) { + return ( + h(a) && ((c = b || []), (b = a), (a = void 0)), + this.wrap(a, b).apply(this, c) + ); + }, + wrap: function(a, b, c) { + function d() { + var d = [], + f = arguments.length, + g = !a || (a && a.deep !== !1); + for (c && h(c) && c.apply(this, arguments); f--; ) + d[f] = g ? e.wrap(a, arguments[f]) : arguments[f]; + try { + return b.apply(this, d); + } catch (i) { + throw (e.I(), e.captureException(i, a), i); + } + } + var e = this; + if (g(b) && !h(a)) return a; + if ((h(a) && ((b = a), (a = void 0)), !h(b))) return b; + try { + if (b.J) return b; + if (b.K) return b.K; + } catch (f) { + return b; + } + for (var i in b) o(b, i) && (d[i] = b[i]); + return (d.prototype = b.prototype), (b.K = d), (d.J = !0), (d.L = b), d; + }, + uninstall: function() { + return ( + z.report.uninstall(), + this.M(), + (Error.stackTraceLimit = this.n), + (this.m = !1), + this + ); + }, + captureException: function(a, b) { + if (!D(a)) + return this.captureMessage( + a, + l({trimHeadFrames: 1, stacktrace: !0}, b) + ); + this.d = a; + try { + var c = z.computeStackTrace(a); + this.N(c, b); + } catch (d) { + if (a !== d) throw d; + } + return this; + }, + captureMessage: function(a, b) { + if (!this.k.ignoreErrors.test || !this.k.ignoreErrors.test(a)) { + b = b || {}; + var c = l({message: a + ''}, b); + if (this.k.stacktrace || (b && b.stacktrace)) { + var d; + try { + throw new Error(a); + } catch (e) { + d = e; + } + (d.name = null), + (b = l( + {fingerprint: a, trimHeadFrames: (b.trimHeadFrames || 0) + 1}, + b + )); + var f = z.computeStackTrace(d), + g = this.O(f, b); + c.stacktrace = {frames: g.reverse()}; + } + return this.P(c), this; + } + }, + captureBreadcrumb: function(a) { + var b = l({timestamp: d() / 1e3}, a); + if (h(this.k.breadcrumbCallback)) { + var c = this.k.breadcrumbCallback(b); + if (E(c) && !j(c)) b = c; + else if (c === !1) return this; + } + return ( + this.t.push(b), + this.t.length > this.k.maxBreadcrumbs && this.t.shift(), + this + ); + }, + addPlugin: function(a) { + var b = [].slice.call(arguments, 1); + return this.q.push([a, b]), this.m && this.C(), this; + }, + setUserContext: function(a) { + return (this.j.user = a), this; + }, + setExtraContext: function(a) { + return this.Q('extra', a), this; + }, + setTagsContext: function(a) { + return this.Q('tags', a), this; + }, + clearContext: function() { + return (this.j = {}), this; + }, + getContext: function() { + return JSON.parse(A(this.j)); + }, + setEnvironment: function(a) { + return (this.k.environment = a), this; + }, + setRelease: function(a) { + return (this.k.release = a), this; + }, + setDataCallback: function(a) { + var b = this.k.dataCallback; + return (this.k.dataCallback = e(b, a)), this; + }, + setBreadcrumbCallback: function(a) { + var b = this.k.breadcrumbCallback; + return (this.k.breadcrumbCallback = e(b, a)), this; + }, + setShouldSendCallback: function(a) { + var b = this.k.shouldSendCallback; + return (this.k.shouldSendCallback = e(b, a)), this; + }, + setTransport: function(a) { + return (this.k.transport = a), this; + }, + lastException: function() { + return this.d; + }, + lastEventId: function() { + return this.f; + }, + isSetup: function() { + return ( + !!this.a && + (!!this.g || + (this.ravenNotConfiguredError || + ((this.ravenNotConfiguredError = !0), + this.y('error', 'Error: Raven has not been configured.')), + !1)) + ); + }, + afterLoad: function() { + var a = I.RavenConfig; + a && this.config(a.dsn, a.config).install(); + }, + showReportDialog: function(a) { + if (J) { + a = a || {}; + var b = a.eventId || this.lastEventId(); + if (!b) throw new B('Missing eventId'); + var c = a.dsn || this.E; + if (!c) throw new B('Missing DSN'); + var d = encodeURIComponent, + e = ''; + (e += '?eventId=' + d(b)), (e += '&dsn=' + d(c)); + var f = a.user || this.j.user; + f && + (f.name && (e += '&name=' + d(f.name)), + f.email && (e += '&email=' + d(f.email))); + var g = this.G(this.D(c)), + h = J.createElement('script'); + (h.async = !0), + (h.src = g + '/api/embed/error-page/' + e), + (J.head || J.body).appendChild(h); + } + }, + I: function() { + var a = this; + (this.l += 1), + setTimeout(function() { + a.l -= 1; + }); + }, + R: function(a, b) { + var c, d; + if (this.b) { + (b = b || {}), + (a = 'raven' + a.substr(0, 1).toUpperCase() + a.substr(1)), + J.createEvent + ? ((c = J.createEvent('HTMLEvents')), c.initEvent(a, !0, !0)) + : ((c = J.createEventObject()), (c.eventType = a)); + for (d in b) o(b, d) && (c[d] = b[d]); + if (J.createEvent) J.dispatchEvent(c); + else + try { + J.fireEvent('on' + c.eventType.toLowerCase(), c); + } catch (e) {} + } + }, + S: function(a) { + var b = this; + return function(c) { + if (((b.T = null), b.u !== c)) { + b.u = c; + var d; + try { + d = t(c.target); + } catch (e) { + d = ''; + } + b.captureBreadcrumb({category: 'ui.' + a, message: d}); + } + }; + }, + U: function() { + var a = this, + b = 1e3; + return function(c) { + var d; + try { + d = c.target; + } catch (e) { + return; + } + var f = d && d.tagName; + if (f && ('INPUT' === f || 'TEXTAREA' === f || d.isContentEditable)) { + var g = a.T; + g || a.S('input')(c), + clearTimeout(g), + (a.T = setTimeout(function() { + a.T = null; + }, b)); + } + }; + }, + V: function(a, b) { + var c = r(this.v.href), + d = r(b), + e = r(a); + (this.w = b), + c.protocol === d.protocol && c.host === d.host && (b = d.relative), + c.protocol === e.protocol && c.host === e.host && (a = e.relative), + this.captureBreadcrumb({ + category: 'navigation', + data: {to: b, from: a} + }); + }, + A: function() { + function a(a) { + return function(b, d) { + for (var e = new Array(arguments.length), f = 0; f < e.length; ++f) + e[f] = arguments[f]; + var g = e[0]; + return ( + h(g) && (e[0] = c.wrap(g)), + a.apply ? a.apply(this, e) : a(e[0], e[1]) + ); + }; + } + function b(a) { + var b = I[a] && I[a].prototype; + b && + b.hasOwnProperty && + b.hasOwnProperty('addEventListener') && + (y( + b, + 'addEventListener', + function(b) { + return function(d, f, g, h) { + try { + f && f.handleEvent && (f.handleEvent = c.wrap(f.handleEvent)); + } catch (i) {} + var j, k, l; + return ( + e && + e.dom && + ('EventTarget' === a || 'Node' === a) && + ((k = c.S('click')), + (l = c.U()), + (j = function(a) { + if (a) { + var b; + try { + b = a.type; + } catch (c) { + return; + } + return 'click' === b + ? k(a) + : 'keypress' === b ? l(a) : void 0; + } + })), + b.call(this, d, c.wrap(f, void 0, j), g, h) + ); + }; + }, + d + ), + y( + b, + 'removeEventListener', + function(a) { + return function(b, c, d, e) { + try { + c = c && (c.K ? c.K : c); + } catch (f) {} + return a.call(this, b, c, d, e); + }; + }, + d + )); + } + var c = this, + d = c.s, + e = this.k.autoBreadcrumbs; + y(I, 'setTimeout', a, d), + y(I, 'setInterval', a, d), + I.requestAnimationFrame && + y( + I, + 'requestAnimationFrame', + function(a) { + return function(b) { + return a(c.wrap(b)); + }; + }, + d + ); + for ( + var f = [ + 'EventTarget', + 'Window', + 'Node', + 'ApplicationCache', + 'AudioTrackList', + 'ChannelMergerNode', + 'CryptoOperation', + 'EventSource', + 'FileReader', + 'HTMLUnknownElement', + 'IDBDatabase', + 'IDBRequest', + 'IDBTransaction', + 'KeyOperation', + 'MediaController', + 'MessagePort', + 'ModalWindow', + 'Notification', + 'SVGElementInstance', + 'Screen', + 'TextTrack', + 'TextTrackCue', + 'TextTrackList', + 'WebSocket', + 'WebSocketWorker', + 'Worker', + 'XMLHttpRequest', + 'XMLHttpRequestEventTarget', + 'XMLHttpRequestUpload' + ], + g = 0; + g < f.length; + g++ + ) + b(f[g]); + }, + B: function() { + function a(a, c) { + a in c && + h(c[a]) && + y(c, a, function(a) { + return b.wrap(a); + }); + } + var b = this, + c = this.k.autoBreadcrumbs, + d = b.s; + if (c.xhr && 'XMLHttpRequest' in I) { + var e = XMLHttpRequest.prototype; + y( + e, + 'open', + function(a) { + return function(c, d) { + return ( + i(d) && + d.indexOf(b.h) === -1 && + (this.W = {method: c, url: d, status_code: null}), + a.apply(this, arguments) + ); + }; + }, + d + ), + y( + e, + 'send', + function(c) { + return function(d) { + function e() { + if (f.W && 4 === f.readyState) { + try { + f.W.status_code = f.status; + } catch (a) {} + b.captureBreadcrumb({ + type: 'http', + category: 'xhr', + data: f.W + }); + } + } + for ( + var f = this, g = ['onload', 'onerror', 'onprogress'], i = 0; + i < g.length; + i++ + ) + a(g[i], f); + return ( + 'onreadystatechange' in f && h(f.onreadystatechange) + ? y(f, 'onreadystatechange', function(a) { + return b.wrap(a, void 0, e); + }) + : (f.onreadystatechange = e), + c.apply(this, arguments) + ); + }; + }, + d + ); + } + c.xhr && + 'fetch' in I && + y( + I, + 'fetch', + function(a) { + return function(c, d) { + for ( + var e = new Array(arguments.length), f = 0; + f < e.length; + ++f + ) + e[f] = arguments[f]; + var g, + h = e[0], + i = 'GET'; + 'string' == typeof h + ? (g = h) + : ((g = h.url), h.method && (i = h.method)), + e[1] && e[1].method && (i = e[1].method); + var j = {method: i, url: g, status_code: null}; + return ( + b.captureBreadcrumb({type: 'http', category: 'fetch', data: j}), + a.apply(this, e).then(function(a) { + return (j.status_code = a.status), a; + }) + ); + }; + }, + d + ), + c.dom && + this.b && + (J.addEventListener + ? (J.addEventListener('click', b.S('click'), !1), + J.addEventListener('keypress', b.U(), !1)) + : (J.attachEvent('onclick', b.S('click')), + J.attachEvent('onkeypress', b.U()))); + var f = I.chrome, + g = f && f.app && f.app.runtime, + j = !g && I.history && history.pushState; + if (c.location && j) { + var l = I.onpopstate; + (I.onpopstate = function() { + var a = b.v.href; + if ((b.V(b.w, a), l)) return l.apply(this, arguments); + }), + y( + history, + 'pushState', + function(a) { + return function() { + var c = arguments.length > 2 ? arguments[2] : void 0; + return c && b.V(b.w, c + ''), a.apply(this, arguments); + }; + }, + d + ); + } + if (c.console && 'console' in I && console.log) { + var m = function(a, c) { + b.captureBreadcrumb({ + message: a, + level: c.level, + category: 'console' + }); + }; + k(['debug', 'info', 'warn', 'error', 'log'], function(a, b) { + F(console, b, m); + }); + } + }, + M: function() { + for (var a; this.s.length; ) { + a = this.s.shift(); + var b = a[0], + c = a[1], + d = a[2]; + b[c] = d; + } + }, + C: function() { + var a = this; + k(this.q, function(b, c) { + var d = c[0], + e = c[1]; + d.apply(a, [a].concat(e)); + }); + }, + D: function(a) { + var b = H.exec(a), + c = {}, + d = 7; + try { + for (; d--; ) c[G[d]] = b[d] || ''; + } catch (e) { + throw new B('Invalid DSN: ' + a); + } + if (c.pass && !this.k.allowSecretKey) + throw new B( + 'Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key' + ); + return c; + }, + G: function(a) { + var b = '//' + a.host + (a.port ? ':' + a.port : ''); + return a.protocol && (b = a.protocol + ':' + b), b; + }, + z: function() { + this.l || this.N.apply(this, arguments); + }, + N: function(a, b) { + var c = this.O(a, b); + this.R('handle', {stackInfo: a, options: b}), + this.X(a.name, a.message, a.url, a.lineno, c, b); + }, + O: function(a, b) { + var c = this, + d = []; + if ( + a.stack && + a.stack.length && + (k(a.stack, function(b, e) { + var f = c.Y(e, a.url); + f && d.push(f); + }), + b && b.trimHeadFrames) + ) + for (var e = 0; e < b.trimHeadFrames && e < d.length; e++) + d[e].in_app = !1; + return (d = d.slice(0, this.k.stackTraceLimit)); + }, + Y: function(a, b) { + var c = { + filename: a.url, + lineno: a.line, + colno: a.column, + function: a.func || '?' + }; + return ( + a.url || (c.filename = b), + (c.in_app = !( + (this.k.includePaths.test && !this.k.includePaths.test(c.filename)) || + /(Raven|TraceKit)\./.test(c['function']) || + /raven\.(min\.)?js$/.test(c.filename) + )), + c + ); + }, + X: function(a, b, c, d, e, f) { + var g = (a || '') + ': ' + (b || ''); + if (!this.k.ignoreErrors.test || !this.k.ignoreErrors.test(g)) { + var h; + if ( + (e && e.length + ? ((c = e[0].filename || c), e.reverse(), (h = {frames: e})) + : c && (h = {frames: [{filename: c, lineno: d, in_app: !0}]}), + (!this.k.ignoreUrls.test || !this.k.ignoreUrls.test(c)) && + (!this.k.whitelistUrls.test || this.k.whitelistUrls.test(c))) + ) { + var i = l( + { + exception: {values: [{type: a, value: b, stacktrace: h}]}, + culprit: c + }, + f + ); + this.P(i); + } + } + }, + Z: function(a) { + var b = this.k.maxMessageLength; + if ((a.message && (a.message = n(a.message, b)), a.exception)) { + var c = a.exception.values[0]; + c.value = n(c.value, b); + } + var d = a.request; + return ( + d && + (d.url && (d.url = n(d.url, this.k.maxUrlLength)), + d.Referer && (d.Referer = n(d.Referer, this.k.maxUrlLength))), + a.breadcrumbs && a.breadcrumbs.values && this.$(a.breadcrumbs), + a + ); + }, + $: function(a) { + for ( + var b, c, d, e = ['to', 'from', 'url'], f = 0; + f < a.values.length; + ++f + ) + if ( + ((c = a.values[f]), + c.hasOwnProperty('data') && E(c.data) && !m(c.data)) + ) { + d = l({}, c.data); + for (var g = 0; g < e.length; ++g) + (b = e[g]), + d.hasOwnProperty(b) && + d[b] && + (d[b] = n(d[b], this.k.maxUrlLength)); + a.values[f].data = d; + } + }, + _: function() { + if (this.c || this.b) { + var a = {}; + return ( + this.c && + K.userAgent && + (a.headers = {'User-Agent': navigator.userAgent}), + this.b && + (J.location && J.location.href && (a.url = J.location.href), + J.referrer && + (a.headers || (a.headers = {}), + (a.headers.Referer = J.referrer))), + a + ); + } + }, + x: function() { + (this.aa = 0), (this.ba = null); + }, + ca: function() { + return this.aa && d() - this.ba < this.aa; + }, + da: function(a) { + var b = this.e; + return ( + !(!b || a.message !== b.message || a.culprit !== b.culprit) && + (a.stacktrace || b.stacktrace + ? x(a.stacktrace, b.stacktrace) + : (!a.exception && !b.exception) || w(a.exception, b.exception)) + ); + }, + ea: function(a) { + if (!this.ca()) { + var b = a.status; + if (400 === b || 401 === b || 429 === b) { + var c; + try { + (c = a.getResponseHeader('Retry-After')), + (c = 1e3 * parseInt(c, 10)); + } catch (e) {} + (this.aa = c ? c : 2 * this.aa || 1e3), (this.ba = d()); + } + } + }, + P: function(a) { + var b = this.k, + c = {project: this.i, logger: b.logger, platform: 'javascript'}, + e = this._(); + if ( + (e && (c.request = e), + a.trimHeadFrames && delete a.trimHeadFrames, + (a = l(c, a)), + (a.tags = l(l({}, this.j.tags), a.tags)), + (a.extra = l(l({}, this.j.extra), a.extra)), + (a.extra['session:duration'] = d() - this.r), + this.t && + this.t.length > 0 && + (a.breadcrumbs = {values: [].slice.call(this.t, 0)}), + j(a.tags) && delete a.tags, + this.j.user && (a.user = this.j.user), + b.environment && (a.environment = b.environment), + b.release && (a.release = b.release), + b.serverName && (a.server_name = b.serverName), + h(b.dataCallback) && (a = b.dataCallback(a) || a), + a && !j(a) && (!h(b.shouldSendCallback) || b.shouldSendCallback(a))) + ) + return this.ca() + ? void this.y('warn', 'Raven dropped error due to backoff: ', a) + : void ('number' == typeof b.sampleRate + ? Math.random() < b.sampleRate && this.fa(a) + : this.fa(a)); + }, + ga: function() { + return s(); + }, + fa: function(a, b) { + var c = this, + d = this.k; + if (this.isSetup()) { + if (((a = this.Z(a)), !this.k.allowDuplicates && this.da(a))) + return void this.y('warn', 'Raven dropped repeat event: ', a); + (this.f = a.event_id || (a.event_id = this.ga())), + (this.e = a), + this.y('debug', 'Raven about to send:', a); + var e = { + sentry_version: '7', + sentry_client: 'raven-js/' + this.VERSION, + sentry_key: this.h + }; + this.F && (e.sentry_secret = this.F); + var f = a.exception && a.exception.values[0]; + this.captureBreadcrumb({ + category: 'sentry', + message: f ? (f.type ? f.type + ': ' : '') + f.value : a.message, + event_id: a.event_id, + level: a.level || 'error' + }); + var g = this.H; + (d.transport || this.ha).call(this, { + url: g, + auth: e, + data: a, + options: d, + onSuccess: function() { + c.x(), c.R('success', {data: a, src: g}), b && b(); + }, + onError: function(d) { + c.y('error', 'Raven transport failed to send: ', d), + d.request && c.ea(d.request), + c.R('failure', {data: a, src: g}), + (d = + d || + new Error( + 'Raven send failed (no additional details provided)' + )), + b && b(d); + } + }); + } + }, + ha: function(a) { + var b = I.XMLHttpRequest && new I.XMLHttpRequest(); + if (b) { + var c = 'withCredentials' in b || 'undefined' != typeof XDomainRequest; + if (c) { + var d = a.url; + 'withCredentials' in b + ? (b.onreadystatechange = function() { + if (4 === b.readyState) + if (200 === b.status) a.onSuccess && a.onSuccess(); + else if (a.onError) { + var c = new Error('Sentry error code: ' + b.status); + (c.request = b), a.onError(c); + } + }) + : ((b = new XDomainRequest()), + (d = d.replace(/^https?:/, '')), + a.onSuccess && (b.onload = a.onSuccess), + a.onError && + (b.onerror = function() { + var c = new Error('Sentry error code: XDomainRequest'); + (c.request = b), a.onError(c); + })), + b.open('POST', d + '?' + q(a.auth)), + b.send(A(a.data)); + } + } + }, + y: function(a) { + this.p[a] && + this.debug && + Function.prototype.apply.call( + this.p[a], + this.o, + [].slice.call(arguments, 1) + ); + }, + Q: function(a, b) { + g(b) ? delete this.j[a] : (this.j[a] = l(this.j[a] || {}, b)); + } + }; + var L = Object.prototype; + (f.prototype.setUser = f.prototype.setUserContext), + (f.prototype.setReleaseContext = f.prototype.setRelease), + (b.exports = f); + }.call( + this, + 'undefined' != typeof global + ? global + : 'undefined' != typeof self + ? self + : 'undefined' != typeof window ? window : {} + )); + }, + {1: 1, 2: 2, 5: 5, 6: 6, 7: 7} + ], + 4: [ + function(a, b, c) { + (function(c) { + var d = a(3), + e = + 'undefined' != typeof window + ? window + : 'undefined' != typeof c ? c : 'undefined' != typeof self ? self : {}, + f = e.Raven, + g = new d(); + (g.noConflict = function() { + return (e.Raven = f), g; + }), + g.afterLoad(), + (b.exports = g); + }.call( + this, + 'undefined' != typeof global + ? global + : 'undefined' != typeof self + ? self + : 'undefined' != typeof window ? window : {} + )); + }, + {3: 3} + ], + 5: [ + function(a, b, c) { + function d(a) { + return 'object' == typeof a && null !== a; + } + function e(a) { + switch ({}.toString.call(a)) { + case '[object Error]': + return !0; + case '[object Exception]': + return !0; + case '[object DOMException]': + return !0; + default: + return a instanceof Error; + } + } + function f(a) { + function b(b, c) { + var d = a(b) || b; + return c ? c(d) || d : d; + } + return b; + } + b.exports = {isObject: d, isError: e, wrappedCallback: f}; + }, + {} + ], + 6: [ + function(a, b, c) { + (function(c) { + function d() { + return 'undefined' == typeof document || null == document.location + ? '' + : document.location.href; + } + var e = a(5), + f = {collectWindowErrors: !0, debug: !1}, + g = + 'undefined' != typeof window + ? window + : 'undefined' != typeof c ? c : 'undefined' != typeof self ? self : {}, + h = [].slice, + i = '?', + j = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/; + (f.report = (function() { + function a(a) { + m(), s.push(a); + } + function b(a) { + for (var b = s.length - 1; b >= 0; --b) s[b] === a && s.splice(b, 1); + } + function c() { + n(), (s = []); + } + function k(a, b) { + var c = null; + if (!b || f.collectWindowErrors) { + for (var d in s) + if (s.hasOwnProperty(d)) + try { + s[d].apply(null, [a].concat(h.call(arguments, 2))); + } catch (e) { + c = e; + } + if (c) throw c; + } + } + function l(a, b, c, g, h) { + var l = null; + if (v) + f.computeStackTrace.augmentStackTraceWithInitialElement(v, b, c, a), + o(); + else if (h && e.isError(h)) (l = f.computeStackTrace(h)), k(l, !0); + else { + var m, + n = {url: b, line: c, column: g}, + p = void 0, + r = a; + if ('[object String]' === {}.toString.call(a)) { + var m = a.match(j); + m && ((p = m[1]), (r = m[2])); + } + (n.func = i), + (l = {name: p, message: r, url: d(), stack: [n]}), + k(l, !0); + } + return !!q && q.apply(this, arguments); + } + function m() { + r || ((q = g.onerror), (g.onerror = l), (r = !0)); + } + function n() { + r && ((g.onerror = q), (r = !1), (q = void 0)); + } + function o() { + var a = v, + b = t; + (t = null), (v = null), (u = null), k.apply(null, [a, !1].concat(b)); + } + function p(a, b) { + var c = h.call(arguments, 1); + if (v) { + if (u === a) return; + o(); + } + var d = f.computeStackTrace(a); + if ( + ((v = d), + (u = a), + (t = c), + setTimeout(function() { + u === a && o(); + }, d.incomplete ? 2e3 : 0), + b !== !1) + ) + throw a; + } + var q, + r, + s = [], + t = null, + u = null, + v = null; + return (p.subscribe = a), (p.unsubscribe = b), (p.uninstall = c), p; + })()), + (f.computeStackTrace = (function() { + function a(a) { + if ('undefined' != typeof a.stack && a.stack) { + for ( + var b, + c, + e, + f = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, + g = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i, + h = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, + j = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i, + k = /\((\S*)(?::(\d+))(?::(\d+))\)/, + l = a.stack.split('\n'), + m = [], + n = (/^(.*) is undefined$/.exec(a.message), 0), + o = l.length; + n < o; + ++n + ) { + if ((c = f.exec(l[n]))) { + var p = c[2] && 0 === c[2].indexOf('native'), + q = c[2] && 0 === c[2].indexOf('eval'); + q && + (b = k.exec(c[2])) && + ((c[2] = b[1]), (c[3] = b[2]), (c[4] = b[3])), + (e = { + url: p ? null : c[2], + func: c[1] || i, + args: p ? [c[2]] : [], + line: c[3] ? +c[3] : null, + column: c[4] ? +c[4] : null + }); + } else if ((c = h.exec(l[n]))) + e = { + url: c[2], + func: c[1] || i, + args: [], + line: +c[3], + column: c[4] ? +c[4] : null + }; + else { + if (!(c = g.exec(l[n]))) continue; + var q = c[3] && c[3].indexOf(' > eval') > -1; + q && (b = j.exec(c[3])) + ? ((c[3] = b[1]), (c[4] = b[2]), (c[5] = null)) + : 0 !== n || + c[5] || + 'undefined' == typeof a.columnNumber || + (m[0].column = a.columnNumber + 1), + (e = { + url: c[3], + func: c[1] || i, + args: c[2] ? c[2].split(',') : [], + line: c[4] ? +c[4] : null, + column: c[5] ? +c[5] : null + }); + } + !e.func && e.line && (e.func = i), m.push(e); + } + return m.length + ? {name: a.name, message: a.message, url: d(), stack: m} + : null; + } + } + function b(a, b, c, d) { + var e = {url: b, line: c}; + if (e.url && e.line) { + if ( + ((a.incomplete = !1), + e.func || (e.func = i), + a.stack.length > 0 && a.stack[0].url === e.url) + ) { + if (a.stack[0].line === e.line) return !1; + if (!a.stack[0].line && a.stack[0].func === e.func) + return (a.stack[0].line = e.line), !1; + } + return a.stack.unshift(e), (a.partial = !0), !0; + } + return (a.incomplete = !0), !1; + } + function c(a, g) { + for ( + var h, + j, + k = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, + l = [], + m = {}, + n = !1, + o = c.caller; + o && !n; + o = o.caller + ) + if (o !== e && o !== f.report) { + if ( + ((j = {url: null, func: i, line: null, column: null}), + o.name + ? (j.func = o.name) + : (h = k.exec(o.toString())) && (j.func = h[1]), + 'undefined' == typeof j.func) + ) + try { + j.func = h.input.substring(0, h.input.indexOf('{')); + } catch (p) {} + m['' + o] ? (n = !0) : (m['' + o] = !0), l.push(j); + } + g && l.splice(0, g); + var q = {name: a.name, message: a.message, url: d(), stack: l}; + return ( + b( + q, + a.sourceURL || a.fileName, + a.line || a.lineNumber, + a.message || a.description + ), + q + ); + } + function e(b, e) { + var g = null; + e = null == e ? 0 : +e; + try { + if ((g = a(b))) return g; + } catch (h) { + if (f.debug) throw h; + } + try { + if ((g = c(b, e + 1))) return g; + } catch (h) { + if (f.debug) throw h; + } + return {name: b.name, message: b.message, url: d()}; + } + return ( + (e.augmentStackTraceWithInitialElement = b), + (e.computeStackTraceFromStackProp = a), + e + ); + })()), + (b.exports = f); + }.call( + this, + 'undefined' != typeof global + ? global + : 'undefined' != typeof self + ? self + : 'undefined' != typeof window ? window : {} + )); + }, + {5: 5} + ], + 7: [ + function(a, b, c) { + function d(a, b) { + for (var c = 0; c < a.length; ++c) if (a[c] === b) return c; + return -1; + } + function e(a, b, c, d) { + return JSON.stringify(a, g(b, d), c); + } + function f(a) { + var b = {stack: a.stack, message: a.message, name: a.name}; + for (var c in a) Object.prototype.hasOwnProperty.call(a, c) && (b[c] = a[c]); + return b; + } + function g(a, b) { + var c = [], + e = []; + return ( + null == b && + (b = function(a, b) { + return c[0] === b + ? '[Circular ~]' + : '[Circular ~.' + e.slice(0, d(c, b)).join('.') + ']'; + }), + function(g, h) { + if (c.length > 0) { + var i = d(c, this); + ~i ? c.splice(i + 1) : c.push(this), + ~i ? e.splice(i, 1 / 0, g) : e.push(g), + ~d(c, h) && (h = b.call(this, g, h)); + } else c.push(h); + return null == a ? (h instanceof Error ? f(h) : h) : a.call(this, g, h); + } + ); + } + (c = b.exports = e), (c.getSerialize = g); + }, + {} + ] + }, + {}, + [4] + )(4); +}); +//# sourceMappingURL=raven.min.js.map diff --git a/dist/raven.min.js.map b/dist/raven.min.js.map index e77e487eab38..8d53e4d4ffb6 100644 --- a/dist/raven.min.js.map +++ b/dist/raven.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["raven.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","Raven","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","_dereq_","RavenConfigError","message","name","prototype","constructor","2","wrapMethod","console","level","callback","originalConsoleLevel","originalConsole","sentryLevel","args","slice","arguments","msg","join","data","logger","extra","Function","apply","3","now","Date","keepOriginalCallback","original","isFunction","_hasJSON","JSON","stringify","_hasDocument","isUndefined","_document","_hasNavigator","_navigator","_lastCapturedException","_lastData","_lastEventId","_globalServer","_globalKey","_globalProject","_globalContext","_globalOptions","ignoreErrors","ignoreUrls","whitelistUrls","includePaths","crossOrigin","collectWindowErrors","maxMessageLength","maxUrlLength","stackTraceLimit","autoBreadcrumbs","instrument","sampleRate","_ignoreOnError","_isRavenInstalled","_originalErrorStackTraceLimit","_originalConsole","_window","_originalConsoleMethods","_plugins","_startTime","_wrappedBuiltIns","_breadcrumbs","_lastCapturedEvent","_location","location","_lastHref","href","_resetBackoff","method","what","isString","objectPrototype","toString","isEmptyObject","_","each","obj","j","hasKey","objectMerge","obj1","obj2","key","value","objectFrozen","Object","isFrozen","truncate","str","max","substr","object","hasOwnProperty","joinRegExp","patterns","pattern","sources","len","push","replace","source","RegExp","urlencode","pairs","encodeURIComponent","parseUrl","url","match","query","fragment","protocol","host","path","relative","uuid4","crypto","msCrypto","getRandomValues","arr","Uint16Array","pad","num","v","c","Math","random","htmlTreeAsString","elem","nextStr","MAX_TRAVERSE_HEIGHT","MAX_OUTPUT_LEN","out","height","separator","sepLength","htmlElementAsString","parentNode","reverse","className","classes","attr","tagName","toLowerCase","id","split","attrWhitelist","getAttribute","isOnlyOneTruthy","b","isSameException","ex1","ex2","values","type","isSameStacktrace","stacktrace","stack1","stack2","frames1","frames","frames2","filename","lineno","colno","fill","replacement","track","orig","TraceKit","utils","isError","isObject","wrapConsoleMethod","dsnKeys","dsnPattern","document","navigator","VERSION","debug","config","dsn","options","_logDebug","globalOptions","setDSN","maxBreadcrumbs","min","autoBreadcrumbDefaults","xhr","dom","instrumentDefaults","tryCatch","install","isSetup","report","subscribe","_handleOnErrorStackInfo","_instrumentTryCatch","_instrumentBreadcrumbs","_drainPlugins","uri","_parseDSN","lastSlash","lastIndexOf","_dsn","user","_globalSecret","pass","_getGlobalServer","_globalEndpoint","context","func","undefined","wrap","_before","wrapped","deep","_ignoreNextOnError","captureException","__raven__","__raven_wrapper__","property","__inner__","uninstall","_restoreBuiltIns","ex","captureMessage","trimHeadFrames","stack","computeStackTrace","_handleStackInfo","test","fingerprint","_prepareFrames","_send","captureBreadcrumb","crumb","timestamp","breadcrumbCallback","result","shift","addPlugin","plugin","pluginArgs","setUserContext","setExtraContext","_mergeContext","setTagsContext","tags","clearContext","getContext","parse","setEnvironment","environment","setRelease","release","setDataCallback","dataCallback","setBreadcrumbCallback","setShouldSendCallback","shouldSendCallback","setTransport","transport","lastException","lastEventId","ravenNotConfiguredError","afterLoad","RavenConfig","showReportDialog","eventId","encode","qs","email","globalServer","script","createElement","async","src","head","body","appendChild","I","setTimeout","R","eventType","evt","toUpperCase","createEvent","initEvent","createEventObject","dispatchEvent","fireEvent","S","evtName","_keypressTimeout","target","category","U","debounceDuration","isContentEditable","timeout","_breadcrumbEventHandler","clearTimeout","V","from","to","parsedLoc","parsedTo","parsedFrom","A","wrapTimeFn","fn","Array","originalCallback","wrapEventTarget","proto","capture","secure","handleEvent","err","before","clickHandler","keypressHandler","_keypressEventHandler","wrappedBuiltIns","requestAnimationFrame","cb","eventTargets","B","wrapProp","prop","xhrproto","XMLHttpRequest","origOpen","indexOf","__raven_xhr","status_code","origSend","onreadystatechangeHandler","readyState","status","props","onreadystatechange","origFetch","fetchInput","fetchData","then","response","addEventListener","attachEvent","chrome","isChromePackagedApp","app","runtime","hasPushState","history","pushState","oldOnPopState","onpopstate","currentHref","_captureUrlChange","origPushState","log","consoleMethodCallback","M","builtin","C","installer","concat","D","m","exec","allowSecretKey","G","port","z","N","stackInfo","_triggerEvent","_processException","O","frame","_normalizeFrame","in_app","Y","normalized","line","column","function","X","fileurl","exception","culprit","Z","request","Referer","breadcrumbs","_trimBreadcrumbs","$","urlProp","urlProps","httpData","userAgent","headers","User-Agent","referrer","x","_backoffDuration","_backoffStart","ca","da","current","last","ea","_shouldBackoff","retry","getResponseHeader","parseInt","P","baseData","project","platform","_getHttpData","serverName","server_name","_sendProcessedPayload","ga","fa","event_id","_getUuid","_trimPacket","allowDuplicates","_isRepeatData","auth","sentry_version","sentry_client","sentry_key","sentry_secret","_makeRequest","onSuccess","onError","error","_setBackoffState","ha","opts","hasCORS","XDomainRequest","onload","onerror","open","send","y","Q","setUser","setReleaseContext","5","6","7","4","RavenConstructor","_Raven","noConflict","wrappedCallback","normalizedData","getLocationHref","_slice","UNKNOWN_FUNCTION","ERROR_TYPES_RE","handler","installGlobalHandler","handlers","unsubscribe","splice","unsubscribeAll","uninstallGlobalHandler","notifyHandlers","isWindowError","inner","traceKitWindowOnError","lineNo","colNo","lastExceptionStack","augmentStackTraceWithInitialElement","processLastException","groups","_oldOnerrorHandler","_onErrorHandlerInstalled","_lastExceptionStack","_lastArgs","lastArgs","rethrow","incomplete","computeStackTraceFromStackProp","submatch","parts","element","gecko","winjs","geckoEval","chromeEval","lines","isNative","isEval","columnNumber","initial","unshift","partial","computeStackTraceByWalkingCallerChain","depth","item","functionName","funcs","recursion","curr","caller","input","substring","sourceURL","fileName","lineNumber","description","haystack","needle","replacer","spaces","cycleReplacer","serializer","keys","thisPos","Infinity","getSerialize"],"mappings":";CAYA,SAAUA,GAAG,GAAoB,gBAAVC,UAAoC,mBAATC,QAAsBA,OAAOD,QAAQD,QAAS,IAAmB,kBAATG,SAAqBA,OAAOC,IAAKD,UAAUH,OAAO,CAAC,GAAIK,EAAkCA,GAAb,mBAATC,QAAwBA,OAA+B,mBAATC,QAAwBA,OAA6B,mBAAPC,MAAsBA,KAAYC,KAAKJ,EAAEK,MAAQV,MAAO,WAAqC,MAAO,SAAUW,GAAEC,EAAEC,EAAEC,GAAG,QAASC,GAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,GAAIE,GAAkB,kBAATC,UAAqBA,OAAQ,KAAIF,GAAGC,EAAE,MAAOA,GAAEF,GAAE,EAAI,IAAGI,EAAE,MAAOA,GAAEJ,GAAE,EAAI,IAAIhB,GAAE,GAAIqB,OAAM,uBAAuBL,EAAE,IAAK,MAAMhB,GAAEsB,KAAK,mBAAmBtB,EAAE,GAAIuB,GAAEV,EAAEG,IAAIf,WAAYW,GAAEI,GAAG,GAAGQ,KAAKD,EAAEtB,QAAQ,SAASU,GAAG,GAAIE,GAAED,EAAEI,GAAG,GAAGL,EAAG,OAAOI,GAAEF,EAAEA,EAAEF,IAAIY,EAAEA,EAAEtB,QAAQU,EAAEC,EAAEC,EAAEC,GAAG,MAAOD,GAAEG,GAAGf,QAAkD,IAAI,GAA1CmB,GAAkB,kBAATD,UAAqBA,QAAgBH,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,GAAI,OAAOD,KAAKW,GAAG,SAASC,EAAQzB,EAAOD,GACp0B,YAEA,SAAS2B,GAAiBC,GACtBpB,KAAKqB,KAAO,mBACZrB,KAAKoB,QAAUA,EAEnBD,EAAiBG,UAAY,GAAIV,OACjCO,EAAiBG,UAAUC,YAAcJ,EAEzC1B,EAAOD,QAAU2B,OAEXK,GAAG,SAASN,EAAQzB,EAAOD,GACjC,YAEA,IAAIiC,GAAa,SAASC,EAASC,EAAOC,GACtC,GAAIC,GAAuBH,EAAQC,GAC/BG,EAAkBJ,CAEtB,IAAMC,IAASD,GAAf,CAIA,GAAIK,GAAwB,SAAVJ,EACZ,UACAA,CAEND,GAAQC,GAAS,WACb,GAAIK,MAAUC,MAAMlB,KAAKmB,WAErBC,EAAM,GAAKH,EAAKI,KAAK,KACrBC,GAAQV,MAAOI,EAAaO,OAAQ,UAAWC,OAAQL,UAAaF,GACxEJ,IAAYA,EAASO,EAAKE,GAGtBR,GAGAW,SAASlB,UAAUmB,MAAM1B,KACrBc,EACAC,EACAE,KAMhBvC,GAAOD,SACHiC,WAAYA,QAGViB,GAAG,SAASxB,EAAQzB,EAAOD,IACjC,SAAWM,GAEX,YAeA,SAAS6C,KACL,OAAQ,GAAIC,MAYhB,QAASC,GAAqBC,EAAUlB,GACpC,MAAOmB,GAAWnB,GAClB,SAAUS,GAAQ,MAAOT,GAASS,EAAMS,IACxClB,EAMJ,QAAS3B,KACLD,KAAKgD,IAA8B,gBAATC,QAAqBA,KAAKC,WAEpDlD,KAAKmD,GAAgBC,EAAYC,GACjCrD,KAAKsD,GAAiBF,EAAYG,GAClCvD,KAAKwD,EAAyB,KAC9BxD,KAAKyD,EAAY,KACjBzD,KAAK0D,EAAe,KACpB1D,KAAK2D,EAAgB,KACrB3D,KAAK4D,EAAa,KAClB5D,KAAK6D,EAAiB,KACtB7D,KAAK8D,KACL9D,KAAK+D,GACDzB,OAAQ,aACR0B,gBACAC,cACAC,iBACAC,gBACAC,YAAa,YACbC,qBAAqB,EACrBC,iBAAkB,EAGlBC,aAAc,IACdC,gBAAiB,GACjBC,iBAAiB,EACjBC,YAAY,EACZC,WAAY,GAEhB3E,KAAK4E,EAAiB,EACtB5E,KAAK6E,GAAoB,EACzB7E,KAAK8E,EAAgClE,MAAM4D,gBAG3CxE,KAAK+E,EAAmBC,EAAQtD,YAChC1B,KAAKiF,KACLjF,KAAKkF,KACLlF,KAAKmF,EAAaxC,IAClB3C,KAAKoF,KACLpF,KAAKqF,KACLrF,KAAKsF,EAAqB,KAE1BtF,KAAKuF,EAAYP,EAAQQ,SACzBxF,KAAKyF,EAAYzF,KAAKuF,GAAavF,KAAKuF,EAAUG,KAClD1F,KAAK2F,GAEL,KAAK,GAAIC,KAAU5F,MAAK+E,EACtB/E,KAAKiF,EAAwBW,GAAU5F,KAAK+E,EAAiBa,GAknDnE,QAASxC,GAAYyC,GACjB,MAAgB,UAATA,EAGX,QAAS9C,GAAW8C,GAChB,MAAuB,kBAATA,GAGlB,QAASC,GAASD,GACd,MAA+C,oBAAxCE,EAAgBC,SAASjF,KAAK8E,GAIzC,QAASI,GAAcJ,GACnB,IAAK,GAAIK,KAAKL,GAAM,OAAO,CAC3B,QAAO,EAGX,QAASM,GAAKC,EAAKxE,GACf,GAAIjB,GAAG0F,CAEP,IAAIjD,EAAYgD,EAAIpF,QAChB,IAAKL,IAAKyF,GACFE,EAAOF,EAAKzF,IACZiB,EAASb,KAAK,KAAMJ,EAAGyF,EAAIzF,QAKnC,IADA0F,EAAID,EAAIpF,OAEJ,IAAKL,EAAI,EAAGA,EAAI0F,EAAG1F,IACfiB,EAASb,KAAK,KAAMJ,EAAGyF,EAAIzF,IAM3C,QAAS4F,GAAYC,EAAMC,GACvB,MAAKA,IAGLN,EAAKM,EAAM,SAASC,EAAKC,GACrBH,EAAKE,GAAOC,IAETH,GALIA,EAgBf,QAASI,GAAaR,GAClB,QAAKS,OAAOC,UAGLD,OAAOC,SAASV,GAG3B,QAASW,GAASC,EAAKC,GACnB,OAAQA,GAAOD,EAAIhG,QAAUiG,EAAMD,EAAMA,EAAIE,OAAO,EAAGD,GAAO,IAUlE,QAASX,GAAOa,EAAQT,GACpB,MAAOX,GAAgBqB,eAAerG,KAAKoG,EAAQT,GAGvD,QAASW,GAAWC,GAOhB,IAJA,GAEIC,GAFAC,KACA7G,EAAI,EAAG8G,EAAMH,EAAStG,OAGnBL,EAAI8G,EAAK9G,IACZ4G,EAAUD,EAAS3G,GACfmF,EAASyB,GAGTC,EAAQE,KAAKH,EAAQI,QAAQ,8BAA+B,SACrDJ,GAAWA,EAAQK,QAE1BJ,EAAQE,KAAKH,EAAQK,OAI7B,OAAO,IAAIC,QAAOL,EAAQpF,KAAK,KAAM,KAGzC,QAAS0F,GAAUvH,GACf,GAAIwH,KAIJ,OAHA5B,GAAK5F,EAAG,SAASmG,EAAKC,GAClBoB,EAAML,KAAKM,mBAAmBtB,GAAO,IAAMsB,mBAAmBrB,MAE3DoB,EAAM3F,KAAK,KAMtB,QAAS6F,GAASC,GACd,GAAIC,GAAQD,EAAIC,MAAM,iEACtB,KAAKA,EAAO,QAGZ,IAAIC,GAAQD,EAAM,IAAM,GACpBE,EAAWF,EAAM,IAAM,EAC3B,QACIG,SAAUH,EAAM,GAChBI,KAAMJ,EAAM,GACZK,KAAML,EAAM,GACZM,SAAUN,EAAM,GAAKC,EAAQC,GAGrC,QAASK,KACL,GAAIC,GAAS3D,EAAQ2D,QAAU3D,EAAQ4D,QAEvC,KAAKxF,EAAYuF,IAAWA,EAAOE,gBAAiB,CAEhD,GAAIC,GAAM,GAAIC,aAAY,EAC1BJ,GAAOE,gBAAgBC,GAGvBA,EAAI,GAAc,KAATA,EAAI,GAAa,MAE1BA,EAAI,GAAc,MAATA,EAAI,GAAc,KAE3B,IAAIE,GAAM,SAASC,GAEf,IADA,GAAIC,GAAID,EAAIjD,SAAS,IACdkD,EAAElI,OAAS,GACdkI,EAAI,IAAMA,CAEd,OAAOA,GAGX,OAAOF,GAAIF,EAAI,IAAME,EAAIF,EAAI,IAAME,EAAIF,EAAI,IAAME,EAAIF,EAAI,IAAME,EAAIF,EAAI,IACvEE,EAAIF,EAAI,IAAME,EAAIF,EAAI,IAAME,EAAIF,EAAI,IAGpC,MAAO,mCAAmCnB,QAAQ,QAAS,SAASwB,GAChE,GAAI9I,GAAkB,GAAd+I,KAAKC,SAAY,EACrBH,EAAU,MAANC,EAAY9I,EAAM,EAAFA,EAAM,CAC9B,OAAO6I,GAAElD,SAAS,MAY9B,QAASsD,GAAiBC,GAWtB,IATA,GAOIC,GAPAC,EAAsB,EACtBC,EAAiB,GACjBC,KACAC,EAAS,EACTnC,EAAM,EACNoC,EAAY,MACZC,EAAYD,EAAU7I,OAGnBuI,GAAQK,IAAWH,IAEtBD,EAAUO,EAAoBR,KAKd,SAAZC,GAAsBI,EAAS,GAAKnC,EAAOkC,EAAI3I,OAAS8I,EAAaN,EAAQxI,QAAU0I,KAI3FC,EAAIjC,KAAK8B,GAET/B,GAAO+B,EAAQxI,OACfuI,EAAOA,EAAKS,UAGhB,OAAOL,GAAIM,UAAU7H,KAAKyH,GAS9B,QAASE,GAAoBR,GACzB,GACIW,GACAC,EACAzD,EACA0D,EACAzJ,EALAgJ,IAOJ,KAAKJ,IAASA,EAAKc,QACf,MAAO,EASX,IANAV,EAAIjC,KAAK6B,EAAKc,QAAQC,eAClBf,EAAKgB,IACLZ,EAAIjC,KAAK,IAAM6B,EAAKgB,IAGxBL,EAAYX,EAAKW,UACbA,GAAapE,EAASoE,GAEtB,IADAC,EAAUD,EAAUM,MAAM,OACrB7J,EAAI,EAAGA,EAAIwJ,EAAQnJ,OAAQL,IAC5BgJ,EAAIjC,KAAK,IAAMyC,EAAQxJ,GAG/B,IAAI8J,IAAiB,OAAQ,OAAQ,QAAS,MAC9C,KAAK9J,EAAI,EAAGA,EAAI8J,EAAczJ,OAAQL,IAClC+F,EAAM+D,EAAc9J,GACpByJ,EAAOb,EAAKmB,aAAahE,GACrB0D,GACAT,EAAIjC,KAAK,IAAMhB,EAAM,KAAO0D,EAAO,KAG3C,OAAOT,GAAIvH,KAAK,IAMpB,QAASuI,GAAgBlK,EAAGmK,GACxB,WAAYnK,IAAMmK,GAMtB,QAASC,GAAgBC,EAAKC,GAC1B,OAAIJ,EAAgBG,EAAKC,KAGzBD,EAAMA,EAAIE,OAAO,GACjBD,EAAMA,EAAIC,OAAO,GAEbF,EAAIG,OAASF,EAAIE,MACjBH,EAAInE,QAAUoE,EAAIpE,OAGfuE,EAAiBJ,EAAIK,WAAYJ,EAAII,aAMhD,QAASD,GAAiBE,EAAQC,GAC9B,GAAIV,EAAgBS,EAAQC,GACxB,OAAO,CAEX,IAAIC,GAAUF,EAAOG,OACjBC,EAAUH,EAAOE,MAGrB,IAAID,EAAQtK,SAAWwK,EAAQxK,OAC3B,OAAO,CAIX,KAAK,GADDP,GAAGmK,EACEjK,EAAI,EAAGA,EAAI2K,EAAQtK,OAAQL,IAGhC,GAFAF,EAAI6K,EAAQ3K,GACZiK,EAAIY,EAAQ7K,GACRF,EAAEgL,WAAab,EAAEa,UACjBhL,EAAEiL,SAAWd,EAAEc,QACfjL,EAAEkL,QAAUf,EAAEe,OACdlL,EAAE,cAAgBmK,EAAE,YACpB,OAAO,CAEf,QAAO,EAUX,QAASgB,GAAKxF,EAAK/E,EAAMwK,EAAaC,GAClC,GAAIC,GAAO3F,EAAI/E,EACf+E,GAAI/E,GAAQwK,EAAYE,GACpBD,GACAA,EAAMpE,MAAMtB,EAAK/E,EAAM0K,IA/+D/B,GAAIC,GAAW9K,EAAQ,GACnBgC,EAAYhC,EAAQ,GACpBC,EAAmBD,EAAQ,GAC3B+K,EAAQ/K,EAAQ,GAEhBgL,EAAUD,EAAMC,QAChBC,EAAWF,EAAME,SAEjBC,EAAoBlL,EAAQ,GAAGO,WAE/B4K,EAAU,2CAA2C7B,MAAM,KAC3D8B,EAAa,gEAObtH,EAA4B,mBAAXnF,QAAyBA,OACd,mBAAXC,GAAyBA,EAChB,mBAATC,MAAuBA,QAExCsD,EAAY2B,EAAQuH,SACpBhJ,EAAayB,EAAQwH,SAqEzBvM,GAAMqB,WAKFmL,QAAS,SAETC,OAAO,EAEPV,SAAUA,EASVW,OAAQ,SAASC,EAAKC,GAClB,GAAI9M,GAAOC,IAEX,IAAID,EAAK4D,EAEL,MADI3D,MAAK8M,EAAU,QAAS,4CACrB/M,CAEX,KAAK6M,EAAK,MAAO7M,EAEjB,IAAIgN,GAAgBhN,EAAKgE,CAGrB8I,IACA1G,EAAK0G,EAAS,SAASnG,EAAKC,GAEZ,SAARD,GAA0B,UAARA,GAA2B,SAARA,EACrC3G,EAAK+D,EAAe4C,GAAOC,EAE3BoG,EAAcrG,GAAOC,IAKjC5G,EAAKiN,OAAOJ,GAIZG,EAAc/I,aAAa0D,KAAK,qBAChCqF,EAAc/I,aAAa0D,KAAK,iDAGhCqF,EAAc/I,aAAeqD,EAAW0F,EAAc/I,cACtD+I,EAAc9I,aAAa8I,EAAc9I,WAAWjD,QAASqG,EAAW0F,EAAc9I,YACtF8I,EAAc7I,gBAAgB6I,EAAc7I,cAAclD,QAASqG,EAAW0F,EAAc7I,eAC5F6I,EAAc5I,aAAekD,EAAW0F,EAAc5I,cACtD4I,EAAcE,eAAiB7D,KAAKnC,IAAI,EAAGmC,KAAK8D,IAAIH,EAAcE,gBAAkB,IAAK,KAEzF,IAAIE,IACAC,KAAK,EACL1L,SAAS,EACT2L,KAAK,EACL7H,UAAU,GAGVf,EAAkBsI,EAActI,eACM,wBAAnCuB,SAASjF,KAAK0D,GACjBA,EAAkB8B,EAAY4G,EAAwB1I,GAC/CA,KAAoB,IAC3BA,EAAkB0I,GAEtBJ,EAActI,gBAAkBA,CAEhC,IAAI6I,IACAC,UAAU,GAGV7I,EAAaqI,EAAcrI,UAW/B,OAVqC,uBAA9BsB,SAASjF,KAAK2D,GACjBA,EAAa6B,EAAY+G,EAAoB5I,GACtCA,KAAe,IACtBA,EAAa4I,GAEjBP,EAAcrI,WAAaA,EAE3BsH,EAAS3H,sBAAwB0I,EAAc1I,oBAGxCtE,GAWXyN,QAAS,WACL,GAAIzN,GAAOC,IAmBX,OAlBID,GAAK0N,YAAc1N,EAAK8E,IACxBmH,EAAS0B,OAAOC,UAAU,WACtB5N,EAAK6N,EAAwBnL,MAAM1C,EAAMmC,aAEzCnC,EAAKgE,EAAeW,YAAc3E,EAAKgE,EAAeW,WAAW6I,UACnExN,EAAK8N,IAGH9N,EAAKgE,EAAeU,iBACpB1E,EAAK+N,IAGT/N,EAAKgO,IAELhO,EAAK8E,GAAoB,GAG7BjE,MAAM4D,gBAAkBzE,EAAKgE,EAAeS,gBACrCxE,MAQXgN,OAAQ,SAASJ,GACb,GAAI7M,GAAOC,KACPgO,EAAMjO,EAAKkO,EAAUrB,GACvBsB,EAAYF,EAAIxF,KAAK2F,YAAY,KACjC3F,EAAOwF,EAAIxF,KAAKtB,OAAO,EAAGgH,EAE5BnO,GAAKqO,EAAOxB,EACZ7M,EAAK6D,EAAaoK,EAAIK,KACtBtO,EAAKuO,EAAgBN,EAAIO,MAAQP,EAAIO,KAAKrH,OAAO,GACjDnH,EAAK8D,EAAiBmK,EAAIxF,KAAKtB,OAAOgH,EAAY,GAElDnO,EAAK4D,EAAgB5D,EAAKyO,EAAiBR,GAE3CjO,EAAK0O,EAAkB1O,EAAK4D,EACxB,IAAM6E,EAAO,OAASzI,EAAK8D,EAAiB,UAIhD7D,KAAK2F,KAWT+I,QAAS,SAAS7B,EAAS8B,EAAM3M,GAO7B,MANIe,GAAW8J,KACX7K,EAAO2M,MACPA,EAAO9B,EACPA,EAAU+B,QAGP5O,KAAK6O,KAAKhC,EAAS8B,GAAMlM,MAAMzC,KAAMgC,IAWhD6M,KAAM,SAAShC,EAAS8B,EAAMG,GAqC1B,QAASC,KACL,GAAI/M,MAAWrB,EAAIuB,UAAUlB,OACzBgO,GAAQnC,GAAWA,GAAWA,EAAQmC,QAAS,CAQnD,KANIF,GAAW/L,EAAW+L,IACtBA,EAAQrM,MAAMzC,KAAMkC,WAKlBvB,KAAKqB,EAAKrB,GAAKqO,EAAOjP,EAAK8O,KAAKhC,EAAS3K,UAAUvB,IAAMuB,UAAUvB,EAEzE,KAKI,MAAOgO,GAAKlM,MAAMzC,KAAMgC,GAC1B,MAAM9B,GAGJ,KAFAH,GAAKkP,IACLlP,EAAKmP,iBAAiBhP,EAAG2M,GACnB3M,GAzDd,GAAIH,GAAOC,IAGX,IAAIoD,EAAYuL,KAAU5L,EAAW8J,GACjC,MAAOA,EAWX,IAPI9J,EAAW8J,KACX8B,EAAO9B,EACPA,EAAU+B,SAKT7L,EAAW4L,GACZ,MAAOA,EAIX,KACI,GAAIA,EAAKQ,EACL,MAAOR,EAIX,IAAIA,EAAKS,EACL,MAAOT,GAAKS,EAElB,MAAOlP,GAIL,MAAOyO,GA6BX,IAAK,GAAIU,KAAYV,GACbrI,EAAOqI,EAAMU,KACbN,EAAQM,GAAYV,EAAKU,GAWjC,OARAN,GAAQzN,UAAYqN,EAAKrN,UAEzBqN,EAAKS,EAAoBL,EAGzBA,EAAQI,GAAY,EACpBJ,EAAQO,EAAYX,EAEbI,GAQXQ,UAAW,WAQP,MAPAvD,GAAS0B,OAAO6B,YAEhBvP,KAAKwP,IAEL5O,MAAM4D,gBAAkBxE,KAAK8E,EAC7B9E,KAAK6E,GAAoB,EAElB7E,MAUXkP,iBAAkB,SAASO,EAAI5C,GAE3B,IAAKX,EAAQuD,GACT,MAAOzP,MAAK0P,eAAeD,EAAIlJ,GAC3BoJ,eAAgB,EAChBxE,YAAY,GACb0B,GAIP7M,MAAKwD,EAAyBiM,CAO9B,KACI,GAAIG,GAAQ5D,EAAS6D,kBAAkBJ,EACvCzP,MAAK8P,EAAiBF,EAAO/C,GAC/B,MAAM/B,GACJ,GAAG2E,IAAO3E,EACN,KAAMA,GAId,MAAO9K,OAUX0P,eAAgB,SAASvN,EAAK0K,GAI1B,IAAM7M,KAAK+D,EAAeC,aAAa+L,OAAQ/P,KAAK+D,EAAeC,aAAa+L,KAAK5N,GAArF,CAIA0K,EAAUA,KAEV,IAAIxK,GAAOkE,GACPnF,QAASe,EAAM,IAChB0K,EAEH,IAAI7M,KAAK+D,EAAeoH,YAAe0B,GAAWA,EAAQ1B,WAAa,CACnE,GAAIsE,EAKJ,KACI,KAAM,IAAI7O,OAAMuB,GAClB,MAAO2I,GACL2E,EAAK3E,EAIT2E,EAAGpO,KAAO,KAEVwL,EAAUtG,GAGNyJ,YAAa7N,EAIbwN,gBAAiB9C,EAAQ8C,gBAAkB,GAAK,GACjD9C,EAEH,IAAI+C,GAAQ5D,EAAS6D,kBAAkBJ,GACnClE,EAASvL,KAAKiQ,EAAeL,EAAO/C,EACxCxK,GAAK8I,YAEDI,OAAQA,EAAOtB,WAOvB,MAFAjK,MAAKkQ,EAAM7N,GAEJrC,OAGXmQ,kBAAmB,SAAU/J,GACzB,GAAIgK,GAAQ7J,GACR8J,UAAW1N,IAAQ,KACpByD,EAEH,IAAIrD,EAAW/C,KAAK+D,EAAeuM,oBAAqB,CACpD,GAAIC,GAASvQ,KAAK+D,EAAeuM,mBAAmBF,EAEpD,IAAIjE,EAASoE,KAAYtK,EAAcsK,GACnCH,EAAQG,MACL,IAAIA,KAAW,EAClB,MAAOvQ,MAQf,MAJAA,MAAKqF,EAAaqC,KAAK0I,GACnBpQ,KAAKqF,EAAarE,OAAShB,KAAK+D,EAAekJ,gBAC/CjN,KAAKqF,EAAamL,QAEfxQ,MAGXyQ,UAAW,SAASC,GAChB,GAAIC,MAAgB1O,MAAMlB,KAAKmB,UAAW,EAO1C,OALAlC,MAAKkF,EAASwC,MAAMgJ,EAAQC,IACxB3Q,KAAK6E,GACL7E,KAAK+N,IAGF/N,MASX4Q,eAAgB,SAASvC,GAIrB,MAFArO,MAAK8D,EAAeuK,KAAOA,EAEpBrO,MASX6Q,gBAAiB,SAAStO,GAGtB,MAFAvC,MAAK8Q,EAAc,QAASvO,GAErBvC,MASX+Q,eAAgB,SAASC,GAGrB,MAFAhR,MAAK8Q,EAAc,OAAQE,GAEpBhR,MAQXiR,aAAc,WAGV,MAFAjR,MAAK8D,KAEE9D,MAQXkR,WAAY,WAER,MAAOjO,MAAKkO,MAAMjO,EAAUlD,KAAK8D,KAUrCsN,eAAgB,SAASC,GAGrB,MAFArR,MAAK+D,EAAesN,YAAcA,EAE3BrR,MASXsR,WAAY,SAASC,GAGjB,MAFAvR,MAAK+D,EAAewN,QAAUA,EAEvBvR,MAUXwR,gBAAiB,SAAS5P,GACtB,GAAIkB,GAAW9C,KAAK+D,EAAe0N,YAGnC,OAFAzR,MAAK+D,EAAe0N,aAClB5O,EAAqBC,EAAUlB,GAC1B5B,MAUX0R,sBAAuB,SAAS9P,GAC5B,GAAIkB,GAAW9C,KAAK+D,EAAeuM,kBAGnC,OAFAtQ,MAAK+D,EAAeuM,mBAClBzN,EAAqBC,EAAUlB,GAC1B5B,MAUX2R,sBAAuB,SAAS/P,GAC5B,GAAIkB,GAAW9C,KAAK+D,EAAe6N,kBAGnC,OAFA5R,MAAK+D,EAAe6N,mBAClB/O,EAAqBC,EAAUlB,GAC1B5B,MAYX6R,aAAc,SAASC,GAGnB,MAFA9R,MAAK+D,EAAe+N,UAAYA,EAEzB9R,MAQX+R,cAAe,WACX,MAAO/R,MAAKwD,GAQhBwO,YAAa,WACT,MAAOhS,MAAK0D,GAQhB+J,QAAS,WACL,QAAKzN,KAAKgD,MACLhD,KAAK2D,IACD3D,KAAKiS,0BACRjS,KAAKiS,yBAA0B,EAC/BjS,KAAK8M,EAAU,QAAS,2CAEnB,KAKfoF,UAAW,WAIP,GAAIC,GAAcnN,EAAQmN,WACtBA,IACAnS,KAAK2M,OAAOwF,EAAYvF,IAAKuF,EAAYxF,QAAQa,WAIzD4E,iBAAkB,SAAUvF,GACxB,GAAKxJ,EAAL,CAGAwJ,EAAUA,KAEV,IAAImF,GAAcnF,EAAQwF,SAAWrS,KAAKgS,aAC1C,KAAKA,EACD,KAAM,IAAI7Q,GAAiB,kBAG/B,IAAIyL,GAAMC,EAAQD,KAAO5M,KAAKoO,CAC9B,KAAKxB,EACD,KAAM,IAAIzL,GAAiB,cAG/B,IAAImR,GAAStK,mBACTuK,EAAK,EACTA,IAAM,YAAcD,EAAON,GAC3BO,GAAM,QAAUD,EAAO1F,EAEvB,IAAIyB,GAAOxB,EAAQwB,MAAQrO,KAAK8D,EAAeuK,IAC3CA,KACIA,EAAKhN,OAAOkR,GAAM,SAAWD,EAAOjE,EAAKhN,OACzCgN,EAAKmE,QAAOD,GAAM,UAAYD,EAAOjE,EAAKmE,QAGlD,IAAIC,GAAezS,KAAKwO,EAAiBxO,KAAKiO,EAAUrB,IAEpD8F,EAASrP,EAAUsP,cAAc,SACrCD,GAAOE,OAAQ,EACfF,EAAOG,IAAMJ,EAAe,yBAA2BF,GACtDlP,EAAUyP,MAAQzP,EAAU0P,MAAMC,YAAYN,KAInDO,EAAoB,WAChB,GAAIlT,GAAOC,IACXA,MAAK4E,GAAkB,EACvBsO,WAAW,WAEPnT,EAAK6E,GAAkB,KAI/BuO,EAAe,SAASC,EAAWvG,GAE/B,GAAIwG,GAAK3M,CAET,IAAK1G,KAAKmD,EAAV,CAGA0J,EAAUA,MAEVuG,EAAY,QAAUA,EAAUlM,OAAO,EAAE,GAAGoM,cAAgBF,EAAUlM,OAAO,GAEzE7D,EAAUkQ,aACVF,EAAMhQ,EAAUkQ,YAAY,cAC5BF,EAAIG,UAAUJ,GAAW,GAAM,KAE/BC,EAAMhQ,EAAUoQ,oBAChBJ,EAAID,UAAYA,EAGpB,KAAK1M,IAAOmG,GAAavG,EAAOuG,EAASnG,KACrC2M,EAAI3M,GAAOmG,EAAQnG,GAGvB,IAAIrD,EAAUkQ,YAEVlQ,EAAUqQ,cAAcL,OAIxB,KACIhQ,EAAUsQ,UAAU,KAAON,EAAID,UAAU9I,cAAe+I,GAC1D,MAAMnT,OAYhB0T,EAAyB,SAASC,GAC9B,GAAI9T,GAAOC,IACX,OAAO,UAAUqT,GASb,GALAtT,EAAK+T,EAAmB,KAKpB/T,EAAKuF,IAAuB+N,EAAhC,CAGAtT,EAAKuF,EAAqB+N,CAM1B,IAAIU,EACJ,KACIA,EAASzK,EAAiB+J,EAAIU,QAChC,MAAO7T,GACL6T,EAAS,YAGbhU,EAAKoQ,mBACD6D,SAAU,MAAQH,EAClBzS,QAAS2S,OAUrBE,EAAuB,WACnB,GAAIlU,GAAOC,KACPkU,EAAmB,GAKvB,OAAO,UAAUb,GACb,GAAIU,EACJ,KACIA,EAASV,EAAIU,OACf,MAAO7T,GAGL,OAEJ,GAAImK,GAAU0J,GAAUA,EAAO1J,OAK/B,IAAKA,IAAuB,UAAZA,GAAmC,aAAZA,GAA2B0J,EAAOI,mBAAzE,CAKA,GAAIC,GAAUrU,EAAK+T,CACdM,IACDrU,EAAKsU,EAAwB,SAAShB,GAE1CiB,aAAaF,GACbrU,EAAK+T,EAAmBZ,WAAW,WAC/BnT,EAAK+T,EAAmB,MACzBI,MAUXK,EAAmB,SAASC,EAAMC,GAC9B,GAAIC,GAAYzM,EAASjI,KAAKuF,EAAUG,MACpCiP,EAAW1M,EAASwM,GACpBG,EAAa3M,EAASuM,EAK1BxU,MAAKyF,EAAYgP,EAIbC,EAAUpM,WAAaqM,EAASrM,UAAYoM,EAAUnM,OAASoM,EAASpM,OACxEkM,EAAKE,EAASlM,UACdiM,EAAUpM,WAAasM,EAAWtM,UAAYoM,EAAUnM,OAASqM,EAAWrM,OAC5EiM,EAAOI,EAAWnM,UAEtBzI,KAAKmQ,mBACD6D,SAAU,aACV3R,MACIoS,GAAIA,EACJD,KAAMA,MASlBK,EAAqB,WAKjB,QAASC,GAAW/I,GAChB,MAAO,UAAUgJ,EAAI5U,GAIjB,IAAI,GADA6B,GAAO,GAAIgT,OAAM9S,UAAUlB,QACvBL,EAAI,EAAGA,EAAIqB,EAAKhB,SAAUL,EAC9BqB,EAAKrB,GAAKuB,UAAUvB,EAExB,IAAIsU,GAAmBjT,EAAK,EAQ5B,OAPIe,GAAWkS,KACXjT,EAAK,GAAKjC,EAAK8O,KAAKoG,IAMpBlJ,EAAKtJ,MACEsJ,EAAKtJ,MAAMzC,KAAMgC,GAEjB+J,EAAK/J,EAAK,GAAIA,EAAK,KAOtC,QAASkT,GAAgBpV,GACrB,GAAIqV,GAAQnQ,EAAQlF,IAAWkF,EAAQlF,GAAQwB,SAC3C6T,IAASA,EAAM/N,gBAAkB+N,EAAM/N,eAAe,sBACtDwE,EAAKuJ,EAAO,mBAAoB,SAASpJ,GACrC,MAAO,UAAU8H,EAASkB,EAAIK,EAASC,GACnC,IACQN,GAAMA,EAAGO,cACTP,EAAGO,YAAcvV,EAAK8O,KAAKkG,EAAGO,cAEpC,MAAOC,IAMT,GAAIC,GACAC,EACAC,CA2BJ,OAzBIjR,IAAmBA,EAAgB4I,MAAmB,gBAAXvN,GAAuC,SAAXA,KAGvE2V,EAAe1V,EAAKsU,EAAwB,SAC5CqB,EAAkB3V,EAAK4V,IACvBH,EAAS,SAAUnC,GAIf,GAAKA,EAAL,CAEA,GAAID,EACJ,KACIA,EAAYC,EAAIpI,KAClB,MAAO/K,GAGL,OAEJ,MAAkB,UAAdkT,EACOqC,EAAapC,GACD,aAAdD,EACEsC,EAAgBrC,GADtB,UAINtH,EAAKhL,KAAKf,KAAM6T,EAAS9T,EAAK8O,KAAKkG,EAAInG,OAAW4G,GAASJ,EAASC,KAEhFO,GACHhK,EAAKuJ,EAAO,sBAAuB,SAAUpJ,GACzC,MAAO,UAAUsH,EAAK0B,EAAIK,EAASC,GAC/B,IACIN,EAAKA,IAAOA,EAAG3F,EAAoB2F,EAAG3F,EAAqB2F,GAC7D,MAAO7U,IAGT,MAAO6L,GAAKhL,KAAKf,KAAMqT,EAAK0B,EAAIK,EAASC,KAE9CO,IAtFX,GAAI7V,GAAOC,KAEP4V,EAAkB7V,EAAKqF,EA0BvBX,EAAkBzE,KAAK+D,EAAeU,eA8D1CmH,GAAK5G,EAAS,aAAc8P,EAAYc,GACxChK,EAAK5G,EAAS,cAAe8P,EAAYc,GACrC5Q,EAAQ6Q,uBACRjK,EAAK5G,EAAS,wBAAyB,SAAU+G,GAC7C,MAAO,UAAU+J,GACb,MAAO/J,GAAKhM,EAAK8O,KAAKiH,MAE3BF,EAMP,KAAK,GADDG,IAAgB,cAAe,SAAU,OAAQ,mBAAoB,iBAAkB,oBAAqB,kBAAmB,cAAe,aAAc,qBAAsB,cAAe,aAAc,iBAAkB,eAAgB,kBAAmB,cAAe,cAAe,eAAgB,qBAAsB,SAAU,YAAa,eAAgB,gBAAiB,YAAa,kBAAmB,SAAU,iBAAkB,4BAA6B,wBACpdpV,EAAI,EAAGA,EAAIoV,EAAa/U,OAAQL,IACrCuU,EAAgBa,EAAapV,KAcrCqV,EAAwB,WAMpB,QAASC,GAASC,EAAM9I,GAChB8I,IAAQ9I,IAAOrK,EAAWqK,EAAI8I,KAC9BtK,EAAKwB,EAAK8I,EAAM,SAAUnK,GACtB,MAAOhM,GAAK8O,KAAK9C,KAR7B,GAAIhM,GAAOC,KACPyE,EAAkBzE,KAAK+D,EAAeU,gBAEtCmR,EAAkB7V,EAAKqF,CAU3B,IAAIX,EAAgB2I,KAAO,kBAAoBpI,GAAS,CACpD,GAAImR,GAAWC,eAAe9U,SAC9BsK,GAAKuK,EAAU,OAAQ,SAASE,GAC5B,MAAO,UAAUzQ,EAAQsC,GAWrB,MARIpC,GAASoC,IAAQA,EAAIoO,QAAQvW,EAAK6D,UAClC5D,KAAKuW,GACD3Q,OAAQA,EACRsC,IAAKA,EACLsO,YAAa,OAIdH,EAAS5T,MAAMzC,KAAMkC,aAEjC0T,GAEHhK,EAAKuK,EAAU,OAAQ,SAASM,GAC5B,MAAO,UAAUpU,GAGb,QAASqU,KACL,GAAItJ,EAAImJ,IAAmC,IAAnBnJ,EAAIuJ,YAAuC,IAAnBvJ,EAAIuJ,YAAmB,CACnE,IAGIvJ,EAAImJ,EAAYC,YAAcpJ,EAAIwJ,OACpC,MAAO1W,IACTH,EAAKoQ,mBACDlF,KAAM,OACN+I,SAAU,MACV3R,KAAM+K,EAAImJ,KAMtB,IAAK,GAlBDnJ,GAAMpN,KAiBN6W,GAAS,SAAU,UAAW,cACzBxQ,EAAI,EAAGA,EAAIwQ,EAAM7V,OAAQqF,IAC9B4P,EAASY,EAAMxQ,GAAI+G,EAavB,OAVI,sBAAwBA,IAAOrK,EAAWqK,EAAI0J,oBAC9ClL,EAAKwB,EAAK,qBAAsB,SAAUrB,GACtC,MAAOhM,GAAK8O,KAAK9C,EAAM6C,OAAW8H,KAKtCtJ,EAAI0J,mBAAqBJ,EAGtBD,EAAShU,MAAMzC,KAAMkC,aAEjC0T,GAGHnR,EAAgB2I,KAAO,SAAWpI,IAClC4G,EAAK5G,EAAS,QAAS,SAAS+R,GAC5B,MAAO,UAAUhC,EAAI5U,GAIjB,IAAK,GADD6B,GAAO,GAAIgT,OAAM9S,UAAUlB,QACtBL,EAAI,EAAGA,EAAIqB,EAAKhB,SAAUL,EAC/BqB,EAAKrB,GAAKuB,UAAUvB,EAGxB,IAEIuH,GAFA8O,EAAahV,EAAK,GAClB4D,EAAS,KAGa,iBAAfoR,GACP9O,EAAM8O,GAEN9O,EAAM8O,EAAW9O,IACb8O,EAAWpR,SACXA,EAASoR,EAAWpR,SAIxB5D,EAAK,IAAMA,EAAK,GAAG4D,SACnBA,EAAS5D,EAAK,GAAG4D,OAGrB,IAAIqR,IACArR,OAAQA,EACRsC,IAAKA,EACLsO,YAAa,KASjB,OANAzW,GAAKoQ,mBACDlF,KAAM,OACN+I,SAAU,QACV3R,KAAM4U,IAGHF,EAAUtU,MAAMzC,KAAMgC,GAAMkV,KAAK,SAAUC,GAG9C,MAFAF,GAAUT,YAAcW,EAASP,OAE1BO,MAGhBvB,GAKHnR,EAAgB4I,KAAOrN,KAAKmD,IACxBE,EAAU+T,kBACV/T,EAAU+T,iBAAiB,QAASrX,EAAKsU,EAAwB,UAAU,GAC3EhR,EAAU+T,iBAAiB,WAAYrX,EAAK4V,KAAyB,KAIrEtS,EAAUgU,YAAY,UAAWtX,EAAKsU,EAAwB,UAC9DhR,EAAUgU,YAAY,aAActX,EAAK4V,MAQjD,IAAI2B,GAAStS,EAAQsS,OACjBC,EAAsBD,GAAUA,EAAOE,KAAOF,EAAOE,IAAIC,QACzDC,GAAgBH,GAAuBvS,EAAQ2S,SAAWA,QAAQC,SACtE,IAAInT,EAAgBe,UAAYkS,EAAc,CAE1C,GAAIG,GAAgB7S,EAAQ8S,UAC5B9S,GAAQ8S,WAAa,WACjB,GAAIC,GAAchY,EAAKwF,EAAUG,IAGjC,IAFA3F,EAAKiY,EAAkBjY,EAAK0F,EAAWsS,GAEnCF,EACA,MAAOA,GAAcpV,MAAMzC,KAAMkC,YAIzC0J,EAAK+L,QAAS,YAAa,SAAUM,GAGjC,MAAO,YACH,GAAI/P,GAAMhG,UAAUlB,OAAS,EAAIkB,UAAU,GAAK0M,MAQhD,OALI1G,IAEAnI,EAAKiY,EAAkBjY,EAAK0F,EAAWyC,EAAM,IAG1C+P,EAAcxV,MAAMzC,KAAMkC,aAEtC0T,GAGP,GAAInR,EAAgB/C,SAAW,WAAasD,IAAWtD,QAAQwW,IAAK,CAEhE,GAAIC,GAAwB,SAAUhW,EAAKE,GACvCtC,EAAKoQ,mBACD/O,QAASe,EACTR,MAAOU,EAAKV,MACZqS,SAAU,YAIlB7N,IAAM,QAAS,OAAQ,OAAQ,QAAS,OAAQ,SAAUD,EAAGvE,GACzDyK,EAAkB1K,QAASC,EAAOwW,OAM9CC,EAAkB,WAGd,IADA,GAAIC,GACGrY,KAAKoF,EAAiBpE,QAAQ,CACjCqX,EAAUrY,KAAKoF,EAAiBoL,OAEhC,IAAIpK,GAAMiS,EAAQ,GAChBhX,EAAOgX,EAAQ,GACftM,EAAOsM,EAAQ,EAEjBjS,GAAI/E,GAAQ0K,IAIpBuM,EAAe,WACX,GAAIvY,GAAOC,IAGXmG,GAAKnG,KAAKkF,EAAU,SAASgB,EAAGwK,GAC5B,GAAI6H,GAAY7H,EAAO,GACnB1O,EAAO0O,EAAO,EAClB6H,GAAU9V,MAAM1C,GAAOA,GAAMyY,OAAOxW,OAI5CyW,EAAW,SAASzR,GAChB,GAAI0R,GAAIpM,EAAWqM,KAAK3R,GACpB4F,KACAjM,EAAI,CAER,KACI,KAAOA,KAAKiM,EAAIP,EAAQ1L,IAAM+X,EAAE/X,IAAM,GACxC,MAAMT,GACJ,KAAM,IAAIiB,GAAiB,gBAAkB6F,GAGjD,GAAI4F,EAAI2B,OAASvO,KAAK+D,EAAe6U,eACjC,KAAM,IAAIzX,GAAiB,iFAG/B,OAAOyL,IAGXiM,EAAkB,SAAS7K,GAEvB,GAAIyE,GAAe,KAAOzE,EAAIzF,MACzByF,EAAI8K,KAAO,IAAM9K,EAAI8K,KAAO,GAKjC,OAHI9K,GAAI1F,WACJmK,EAAezE,EAAI1F,SAAW,IAAMmK,GAEjCA,GAGXsG,EAAyB,WAEhB/Y,KAAK4E,GACN5E,KAAK8P,EAAiBrN,MAAMzC,KAAMkC,YAI1C8W,EAAkB,SAASC,EAAWpM,GAClC,GAAItB,GAASvL,KAAKiQ,EAAegJ,EAAWpM,EAE5C7M,MAAKkZ,EAAc,UACfD,UAAWA,EACXpM,QAASA,IAGb7M,KAAKmZ,EACDF,EAAU5X,KACV4X,EAAU7X,QACV6X,EAAU/Q,IACV+Q,EAAUvN,OACVH,EACAsB,IAIRuM,EAAgB,SAASH,EAAWpM,GAChC,GAAI9M,GAAOC,KACPuL,IACJ,IAAI0N,EAAUrJ,OAASqJ,EAAUrJ,MAAM5O,SACnCmF,EAAK8S,EAAUrJ,MAAO,SAASjP,EAAGiP,GAC9B,GAAIyJ,GAAQtZ,EAAKuZ,EAAgB1J,EAC7ByJ,IACA9N,EAAO7D,KAAK2R,KAKhBxM,GAAWA,EAAQ8C,gBACnB,IAAK,GAAItJ,GAAI,EAAGA,EAAIwG,EAAQ8C,gBAAkBtJ,EAAIkF,EAAOvK,OAAQqF,IAC7DkF,EAAOlF,GAAGkT,QAAS,CAK/B,OADAhO,GAASA,EAAOtJ,MAAM,EAAGjC,KAAK+D,EAAeS,kBAKjDgV,EAAiB,SAASH,GACtB,GAAKA,EAAMnR,IAAX,CAGA,GAAIuR,IACAhO,SAAY4N,EAAMnR,IAClBwD,OAAY2N,EAAMK,KAClB/N,MAAY0N,EAAMM,OAClBC,WAAYP,EAAM1K,MAAQ,IAY9B,OATA8K,GAAWF,SAELvZ,KAAK+D,EAAeI,aAAa4L,OAAS/P,KAAK+D,EAAeI,aAAa4L,KAAK0J,EAAWhO,WAE7F,qBAAqBsE,KAAK0J,EAAW,cAErC,qBAAqB1J,KAAK0J,EAAWhO,WAGlCgO,IAGXI,EAAmB,SAAS5O,EAAM7J,EAAS0Y,EAASpO,EAAQH,EAAQsB,GAChE,GAAI1B,EACJ,MAAMnL,KAAK+D,EAAeC,aAAa+L,OAAQ/P,KAAK+D,EAAeC,aAAa+L,KAAK3O,MAErFA,GAAW,GAEPmK,GAAUA,EAAOvK,QACjB8Y,EAAUvO,EAAO,GAAGE,UAAYqO,EAGhCvO,EAAOtB,UACPkB,GAAcI,OAAQA,IACfuO,IACP3O,GACII,SACIE,SAAUqO,EACVpO,OAAQA,EACR6N,QAAQ,QAKdvZ,KAAK+D,EAAeE,WAAW8L,OAAQ/P,KAAK+D,EAAeE,WAAW8L,KAAK+J,OAC3E9Z,KAAK+D,EAAeG,cAAc6L,MAAS/P,KAAK+D,EAAeG,cAAc6L,KAAK+J,KAAxF,CAEA,GAAIzX,GAAOkE,GAEPwT,WACI/O,SACIC,KAAMA,EACNtE,MAAOvF,EACP+J,WAAYA,KAGpB6O,QAASF,GACVjN,EAGH7M,MAAKkQ,EAAM7N,KAGf4X,EAAa,SAAS5X,GAGlB,GAAI4E,GAAMjH,KAAK+D,EAAeO,gBAI9B,IAHIjC,EAAKjB,UACLiB,EAAKjB,QAAU2F,EAAS1E,EAAKjB,QAAS6F,IAEtC5E,EAAK0X,UAAW,CAChB,GAAIA,GAAY1X,EAAK0X,UAAU/O,OAAO,EACtC+O,GAAUpT,MAAQI,EAASgT,EAAUpT,MAAOM,GAGhD,GAAIiT,GAAU7X,EAAK6X,OAanB,OAZIA,KACIA,EAAQhS,MACRgS,EAAQhS,IAAMnB,EAASmT,EAAQhS,IAAKlI,KAAK+D,EAAeQ,eAExD2V,EAAQC,UACRD,EAAQC,QAAUpT,EAASmT,EAAQC,QAASna,KAAK+D,EAAeQ,gBAIpElC,EAAK+X,aAAe/X,EAAK+X,YAAYpP,QACrChL,KAAKqa,EAAiBhY,EAAK+X,aAExB/X,GAMXiY,EAAkB,SAAUF,GAQxB,IAAK,GAJDG,GACAnK,EACA/N,EAHAmY,GAAY,KAAM,OAAQ,OAKrB7Z,EAAI,EAAGA,EAAIyZ,EAAYpP,OAAOhK,SAAUL,EAE7C,GADAyP,EAAQgK,EAAYpP,OAAOrK,GACtByP,EAAMhJ,eAAe,SAAY+E,EAASiE,EAAM/N,QAASuE,EAAawJ,EAAM/N,MAAjF,CAGAA,EAAOkE,KAAgB6J,EAAM/N,KAC7B,KAAK,GAAIgE,GAAI,EAAGA,EAAImU,EAASxZ,SAAUqF,EACnCkU,EAAUC,EAASnU,GACfhE,EAAK+E,eAAemT,KACpBlY,EAAKkY,GAAWxT,EAAS1E,EAAKkY,GAAUva,KAAK+D,EAAeQ,cAGpE6V,GAAYpP,OAAOrK,GAAG0B,KAAOA,IAIrC6D,EAAc,WACV,GAAKlG,KAAKsD,GAAkBtD,KAAKmD,EAAjC,CACA,GAAIsX,KAkBJ,OAhBIza,MAAKsD,GAAiBC,EAAWmX,YACjCD,EAASE,SACPC,aAAcpO,UAAUkO,YAI1B1a,KAAKmD,IACDE,EAAUmC,UAAYnC,EAAUmC,SAASE,OACzC+U,EAASvS,IAAM7E,EAAUmC,SAASE,MAElCrC,EAAUwX,WACLJ,EAASE,UAASF,EAASE,YAChCF,EAASE,QAAQR,QAAU9W,EAAUwX,WAItCJ,IAGXK,EAAe,WACX9a,KAAK+a,GAAmB,EACxB/a,KAAKgb,GAAgB,MAGzBC,GAAgB,WACZ,MAAOjb,MAAK+a,IAAoBpY,IAAQ3C,KAAKgb,GAAgBhb,KAAK+a,IAYtEG,GAAe,SAAUC,GACrB,GAAIC,GAAOpb,KAAKyD,CAEhB,UAAK2X,GACDD,EAAQ/Z,UAAYga,EAAKha,SACzB+Z,EAAQnB,UAAYoB,EAAKpB,WAIzBmB,EAAQhQ,YAAciQ,EAAKjQ,WACpBD,EAAiBiQ,EAAQhQ,WAAYiQ,EAAKjQ,aAG5CgQ,EAAQpB,YAAaqB,EAAKrB,WACxBlP,EAAgBsQ,EAAQpB,UAAWqB,EAAKrB,aAMvDsB,GAAkB,SAASnB,GAEvB,IAAIla,KAAKsb,KAAT,CAIA,GAAI1E,GAASsD,EAAQtD,MAKrB,IAAiB,MAAXA,GAA6B,MAAXA,GAA6B,MAAXA,EAA1C,CAGA,GAAI2E,EACJ,KAGIA,EAAQrB,EAAQsB,kBAAkB,eAClCD,EAA8B,IAAtBE,SAASF,EAAO,IAC1B,MAAOrb,IAKTF,KAAK+a,GAAmBQ,EAElBA,EAEwB,EAAxBvb,KAAK+a,IAAwB,IAEnC/a,KAAKgb,GAAgBrY,OAGzB+Y,EAAO,SAASrZ,GACZ,GAAI0K,GAAgB/M,KAAK+D,EAErB4X,GACAC,QAAS5b,KAAK6D,EACdvB,OAAQyK,EAAczK,OACtBuZ,SAAU,cACXpB,EAAWza,KAAK8b,GAgDnB,IA9CIrB,IACAkB,EAASzB,QAAUO,GAInBpY,EAAKsN,sBAAuBtN,GAAKsN,eAErCtN,EAAOkE,EAAYoV,EAAUtZ,GAG7BA,EAAK2O,KAAOzK,EAAYA,KAAgBvG,KAAK8D,EAAekN,MAAO3O,EAAK2O,MACxE3O,EAAKE,MAAQgE,EAAYA,KAAgBvG,KAAK8D,EAAevB,OAAQF,EAAKE,OAG1EF,EAAKE,MAAM,oBAAsBI,IAAQ3C,KAAKmF,EAE1CnF,KAAKqF,GAAgBrF,KAAKqF,EAAarE,OAAS,IAGhDqB,EAAK+X,aACDpP,UAAW/I,MAAMlB,KAAKf,KAAKqF,EAAc,KAK7CY,EAAc5D,EAAK2O,aAAc3O,GAAK2O,KAEtChR,KAAK8D,EAAeuK,OAEpBhM,EAAKgM,KAAOrO,KAAK8D,EAAeuK,MAIhCtB,EAAcsE,cAAahP,EAAKgP,YAActE,EAAcsE,aAG5DtE,EAAcwE,UAASlP,EAAKkP,QAAUxE,EAAcwE,SAGpDxE,EAAcgP,aAAY1Z,EAAK2Z,YAAcjP,EAAcgP,YAE3DhZ,EAAWgK,EAAc0E,gBACzBpP,EAAO0K,EAAc0E,aAAapP,IAASA,GAI1CA,IAAQ4D,EAAc5D,MAKvBU,EAAWgK,EAAc6E,qBAAwB7E,EAAc6E,mBAAmBvP,IAMtF,MAAIrC,MAAKsb,SACLtb,MAAK8M,EAAU,OAAQ,uCAAwCzK,QAI3B,gBAA7B0K,GAAcpI,WACjByE,KAAKC,SAAW0D,EAAcpI,YAC9B3E,KAAKic,GAAsB5Z,GAG/BrC,KAAKic,GAAsB5Z,KAInC6Z,GAAU,WACR,MAAOxT,MAGTyT,GAAuB,SAAS9Z,EAAMT,GAClC,GAAI7B,GAAOC,KACP+M,EAAgB/M,KAAK+D,CAEzB,IAAK/D,KAAKyN,UAAV,CAaA,GARAzN,KAAK0D,EAAerB,EAAK+Z,WAAa/Z,EAAK+Z,SAAWpc,KAAKqc,MAG3Dha,EAAOrC,KAAKsc,EAAYja,IAKnBrC,KAAK+D,EAAewY,iBAAmBvc,KAAKwc,GAAcna,GAE3D,WADArC,MAAK8M,EAAU,OAAQ,+BAAgCzK,EAK3DrC,MAAKyD,EAAYpB,EAEjBrC,KAAK8M,EAAU,QAAS,uBAAwBzK,EAEhD,IAAIoa,IACAC,eAAgB,IAChBC,cAAe,YAAc3c,KAAKyM,QAClCmQ,WAAY5c,KAAK4D,EAEjB5D,MAAKsO,IACLmO,EAAKI,cAAgB7c,KAAKsO,EAG9B,IAAIyL,GAAY1X,EAAK0X,WAAa1X,EAAK0X,UAAU/O,OAAO,EACxDhL,MAAKmQ,mBACD6D,SAAU,SACV5S,QAAS2Y,GACFA,EAAU9O,KAAO8O,EAAU9O,KAAO,KAAO,IAAM8O,EAAUpT,MAC1DtE,EAAKjB,QACXgb,SAAU/Z,EAAK+Z,SACfza,MAAOU,EAAKV,OAAS,SAGzB,IAAIuG,GAAMlI,KAAKyO,GACd1B,EAAc+E,WAAa9R,KAAK8c,IAAc/b,KAAKf,MAChDkI,IAAKA,EACLuU,KAAMA,EACNpa,KAAMA,EACNwK,QAASE,EACTgQ,UAAW,WACPhd,EAAK4F,IAEL5F,EAAKmZ,EAAc,WACf7W,KAAMA,EACNwQ,IAAK3K,IAETtG,GAAYA,KAEhBob,QAAS,SAAiBC,GACtBld,EAAK+M,EAAU,QAAS,mCAAoCmQ,GAExDA,EAAM/C,SACNna,EAAKmd,GAAiBD,EAAM/C,SAGhCna,EAAKmZ,EAAc,WACf7W,KAAMA,EACNwQ,IAAK3K,IAET+U,EAAQA,GAAS,GAAIrc,OAAM,sDAC3BgB,GAAYA,EAASqb,QAKjCE,GAAc,SAASC,GACnB,GAAIlD,GAAU,GAAI9D,gBAGdiH,EACA,mBAAqBnD,IACK,mBAAnBoD,eAEX,IAAKD,EAAL,CAEA,GAAInV,GAAMkV,EAAKlV,GAEX,oBAAqBgS,GACrBA,EAAQpD,mBAAqB,WACzB,GAA2B,IAAvBoD,EAAQvD,WAEL,GAAuB,MAAnBuD,EAAQtD,OACfwG,EAAKL,WAAaK,EAAKL,gBACpB,IAAIK,EAAKJ,QAAS,CACrB,GAAIzH,GAAM,GAAI3U,OAAM,sBAAwBsZ,EAAQtD,OACpDrB,GAAI2E,QAAUA,EACdkD,EAAKJ,QAAQzH,MAIrB2E,EAAU,GAAIoD,gBAGdpV,EAAMA,EAAIP,QAAQ,WAAY,IAG1ByV,EAAKL,YACL7C,EAAQqD,OAASH,EAAKL,WAEtBK,EAAKJ,UACL9C,EAAQsD,QAAU,WACd,GAAIjI,GAAM,GAAI3U,OAAM,oCACpB2U,GAAI2E,QAAUA,EACdkD,EAAKJ,QAAQzH,MAOzB2E,EAAQuD,KAAK,OAAQvV,EAAM,IAAMJ,EAAUsV,EAAKX,OAChDvC,EAAQwD,KAAKxa,EAAUka,EAAK/a,SAGhCsb,EAAW,SAAShc,GACZ3B,KAAKiF,EAAwBtD,IAAU3B,KAAK0M,OAE5ClK,SAASlB,UAAUmB,MAAM1B,KACrBf,KAAKiF,EAAwBtD,GAC7B3B,KAAK+E,KACF9C,MAAMlB,KAAKmB,UAAW,KAKrC0b,EAAe,SAASlX,EAAKgI,GACrBtL,EAAYsL,SACL1O,MAAK8D,EAAe4C,GAE3B1G,KAAK8D,EAAe4C,GAAOH,EAAYvG,KAAK8D,EAAe4C,OAAYgI,IAWnF,IAAI3I,GAAkBc,OAAOvF,SAwU7BrB,GAAMqB,UAAUuc,QAAU5d,EAAMqB,UAAUsP,eAC1C3Q,EAAMqB,UAAUwc,kBAAoB7d,EAAMqB,UAAUgQ,WAEpD7R,EAAOD,QAAUS,IAEdc,KAAKf,KAAuB,mBAAXF,QAAyBA,OAAyB,mBAATC,MAAuBA,KAAyB,mBAAXF,QAAyBA,aACxHoB,EAAI,EAAEO,EAAI,EAAEuc,EAAI,EAAEC,EAAI,EAAEC,EAAI,IAAIC,GAAG,SAAShd,EAAQzB,EAAOD,IAC9D,SAAWM,GAOX,YAEA,IAAIqe,GAAmBjd,EAAQ,GAG3B8D,EAA4B,mBAAXnF,QAAyBA,OACd,mBAAXC,GAAyBA,EAChB,mBAATC,MAAuBA,QAExCqe,EAASpZ,EAAQ/E,MAEjBA,EAAQ,GAAIke,EAQhBle,GAAMoe,WAAa,WAElB,MADArZ,GAAQ/E,MAAQme,EACTne,GAGRA,EAAMiS,YAENzS,EAAOD,QAAUS,IAEdc,KAAKf,KAAuB,mBAAXF,QAAyBA,OAAyB,mBAATC,MAAuBA,KAAyB,mBAAXF,QAAyBA,aACxH6C,EAAI,IAAIqb,GAAG,SAAS7c,EAAQzB,EAAOD,GACtC,YAEA,SAAS2M,GAAStG,GACd,MAAuB,gBAATA,IAA8B,OAATA,EAKvC,QAASqG,GAAQvF,GACf,UAAWX,SAASjF,KAAK4F,IACvB,IAAK,iBAAkB,OAAO,CAC9B,KAAK,qBAAsB,OAAO,CAClC,KAAK,wBAAyB,OAAO,CACrC,SAAS,MAAOA,aAAiB/F,QAIrC,QAAS0d,GAAgB1c,GACrB,QAAS6P,GAAapP,EAAMS,GAC1B,GAAIyb,GAAiB3c,EAASS,IAASA,CACvC,OAAIS,GACOA,EAASyb,IAAmBA,EAEhCA,EAGT,MAAO9M,GAGXhS,EAAOD,SACH2M,SAAUA,EACVD,QAASA,EACToS,gBAAiBA,QAGfN,GAAG,SAAS9c,EAAQzB,EAAOD,IACjC,SAAWM,GACX,YAgCA,SAAS0e,KACL,MAAwB,mBAAbjS,WAAyD,mBAAtBA,UAAS/G,SAC5C,GAEJ+G,SAAS/G,SAASE,KAlC7B,GAAIuG,GAAQ/K,EAAQ,GAYhB8K,GACA3H,qBAAqB,EACrBqI,OAAO,GAIP1H,EAA4B,mBAAXnF,QAAyBA,OACd,mBAAXC,GAAyBA,EAChB,mBAATC,MAAuBA,QAIxC0e,KAAYxc,MACZyc,EAAmB,IAGnBC,EAAiB,yGAiDrB3S,GAAS0B,OAAU,WAUf,QAASC,GAAUiR,GACfC,IACAC,EAASpX,KAAKkX,GAOlB,QAASG,GAAYH,GACjB,IAAK,GAAIje,GAAIme,EAAS9d,OAAS,EAAGL,GAAK,IAAKA,EACpCme,EAASne,KAAOie,GAChBE,EAASE,OAAOre,EAAG,GAQ/B,QAASse,KACLC,IACAJ,KAOJ,QAASK,GAAevP,EAAOwP,GAC3B,GAAIrF,GAAY,IAChB,KAAIqF,GAAkBpT,EAAS3H,oBAA/B,CAGA,IAAK,GAAI1D,KAAKme,GACV,GAAIA,EAAS1X,eAAezG,GACxB,IACIme,EAASne,GAAG8B,MAAM,MAAOmN,GAAO4I,OAAOiG,EAAO1d,KAAKmB,UAAW,KAChE,MAAOmd,GACLtF,EAAYsF,EAKxB,GAAItF,EACA,KAAMA,IAiBd,QAASuF,GAAsBle,EAAS8G,EAAKqX,EAAQC,EAAO/P,GACxD,GAAIG,GAAQ,IAEZ,IAAI6P,EACAzT,EAAS6D,kBAAkB6P,oCAAoCD,EAAoBvX,EAAKqX,EAAQne,GAChGue,QACG,IAAIlQ,GAAMxD,EAAMC,QAAQuD,GAM3BG,EAAQ5D,EAAS6D,kBAAkBJ,GACnC0P,EAAevP,GAAO,OACnB,CACH,GAQIgQ,GARApa,GACA0C,IAAOA,EACPwR,KAAQ6F,EACR5F,OAAU6F,GAGVne,EAAOuN,OACPzM,EAAMf,CAEV,IAAkC,uBAA3B4E,SAASjF,KAAKK,GAAgC,CACjD,GAAIwe,GAASxe,EAAQ+G,MAAMwW,EACvBiB,KACAve,EAAOue,EAAO,GACdzd,EAAMyd,EAAO,IAIrBpa,EAASmJ,KAAO+P,EAEhB9O,GACIvO,KAAQA,EACRD,QAAWe,EACX+F,IAAOsW,IACP5O,OAAUpK,IAEd2Z,EAAevP,GAAO,GAG1B,QAAIiQ,GACOA,EAAmBpd,MAAMzC,KAAMkC,WAM9C,QAAS2c,KAEDiB,IAGJD,EAAqB7a,EAAQwY,QAC7BxY,EAAQwY,QAAU8B,EAClBQ,GAA2B,GAG/B,QAASZ,KAEAY,IAGL9a,EAAQwY,QAAUqC,EAClBC,GAA2B,EAC3BD,EAAqBjR,QAGzB,QAAS+Q,KACL,GAAII,GAAsBN,EACtBO,EAAYC,CAChBA,GAAW,KACXR,EAAqB,KACrB1N,EAAgB,KAChBoN,EAAe1c,MAAM,MAAOsd,GAAqB,GAAOvH,OAAOwH,IAUnE,QAAStS,GAAO+B,EAAIyQ,GAChB,GAAIle,GAAOyc,EAAO1d,KAAKmB,UAAW,EAClC,IAAIud,EAAoB,CACpB,GAAI1N,IAAkBtC,EAClB,MAEFkQ,KAIN,GAAI/P,GAAQ5D,EAAS6D,kBAAkBJ,EAevC,IAdAgQ,EAAqB7P,EACrBmC,EAAgBtC,EAChBwQ,EAAWje,EAMXkR,WAAW,WACHnB,IAAkBtC,GAClBkQ,KAEJ/P,EAAMuQ,WAAa,IAAO,GAE1BD,KAAY,EACZ,KAAMzQ,GAvLd,GA0DIoQ,GAAoBC,EA1DpBhB,KACAmB,EAAW,KACXlO,EAAgB,KAChB0N,EAAqB,IA2LzB,OAHA/R,GAAOC,UAAYA,EACnBD,EAAOqR,YAAcA,EACrBrR,EAAO6B,UAAY0P,EACZvR,KAsDX1B,EAAS6D,kBAAqB,WA4C1B,QAASuQ,GAA+B3Q,GACpC,GAAwB,mBAAbA,GAAGG,OAA0BH,EAAGG,MAA3C,CAiBA,IAAK,GALDyQ,GACAC,EACAC,EAZAjJ,EAAS,8HACTkJ,EAAQ,kIACRC,EAAQ,gHAGRC,EAAY,gDACZC,EAAa,gCAEbC,EAAQnR,EAAGG,MAAMpF,MAAM,MACvBoF,KAMKjP,GAFO,sBAAsBgY,KAAKlJ,EAAGrO,SAEjC,GAAGiF,EAAIua,EAAM5f,OAAQL,EAAI0F,IAAK1F,EAAG,CAC1C,GAAK2f,EAAQhJ,EAAOqB,KAAKiI,EAAMjgB,IAAM,CACjC,GAAIkgB,GAAWP,EAAM,IAAqC,IAA/BA,EAAM,GAAGhK,QAAQ,UACxCwK,EAASR,EAAM,IAAmC,IAA7BA,EAAM,GAAGhK,QAAQ,OACtCwK,KAAWT,EAAWM,EAAWhI,KAAK2H,EAAM,OAE5CA,EAAM,GAAKD,EAAS,GACpBC,EAAM,GAAKD,EAAS,GACpBC,EAAM,GAAKD,EAAS,IAExBE,GACIrY,IAAQ2Y,EAAsB,KAAXP,EAAM,GACzB3R,KAAQ2R,EAAM,IAAM5B,EACpB1c,KAAQ6e,GAAYP,EAAM,OAC1B5G,KAAQ4G,EAAM,IAAMA,EAAM,GAAK,KAC/B3G,OAAU2G,EAAM,IAAMA,EAAM,GAAK,UAElC,IAAKA,EAAQG,EAAM9H,KAAKiI,EAAMjgB,IACjC4f,GACIrY,IAAOoY,EAAM,GACb3R,KAAQ2R,EAAM,IAAM5B,EACpB1c,QACA0X,MAAS4G,EAAM,GACf3G,OAAU2G,EAAM,IAAMA,EAAM,GAAK,UAElC,CAAA,KAAKA,EAAQE,EAAM7H,KAAKiI,EAAMjgB,KAsBjC,QArBA,IAAImgB,GAASR,EAAM,IAAMA,EAAM,GAAGhK,QAAQ,aACtCwK,KAAWT,EAAWK,EAAU/H,KAAK2H,EAAM,MAE3CA,EAAM,GAAKD,EAAS,GACpBC,EAAM,GAAKD,EAAS,GACpBC,EAAM,GAAK,MACE,IAAN3f,GAAY2f,EAAM,IAAiC,mBAApB7Q,GAAGsR,eAKzCnR,EAAM,GAAG+J,OAASlK,EAAGsR,aAAe,GAExCR,GACIrY,IAAOoY,EAAM,GACb3R,KAAQ2R,EAAM,IAAM5B,EACpB1c,KAAQse,EAAM,GAAKA,EAAM,GAAG9V,MAAM,QAClCkP,KAAQ4G,EAAM,IAAMA,EAAM,GAAK,KAC/B3G,OAAU2G,EAAM,IAAMA,EAAM,GAAK,OAMpCC,EAAQ5R,MAAQ4R,EAAQ7G,OACzB6G,EAAQ5R,KAAO+P,GAGnB9O,EAAMlI,KAAK6Y,GAGf,MAAK3Q,GAAM5O,QAKPK,KAAQoO,EAAGpO,KACXD,QAAWqO,EAAGrO,QACd8G,IAAOsW,IACP5O,MAASA,GAPF,MAwBf,QAAS8P,GAAoCzG,EAAW/Q,EAAKqX,EAAQne,GACjE,GAAI4f,IACA9Y,IAAOA,EACPwR,KAAQ6F,EAGZ,IAAIyB,EAAQ9Y,KAAO8Y,EAAQtH,KAAM,CAO7B,GANAT,EAAUkH,YAAa,EAElBa,EAAQrS,OACTqS,EAAQrS,KAAO+P,GAGfzF,EAAUrJ,MAAM5O,OAAS,GACrBiY,EAAUrJ,MAAM,GAAG1H,MAAQ8Y,EAAQ9Y,IAAK,CACxC,GAAI+Q,EAAUrJ,MAAM,GAAG8J,OAASsH,EAAQtH,KACpC,OAAO,CACJ,KAAKT,EAAUrJ,MAAM,GAAG8J,MAAQT,EAAUrJ,MAAM,GAAGjB,OAASqS,EAAQrS,KAEvE,MADAsK,GAAUrJ,MAAM,GAAG8J,KAAOsH,EAAQtH,MAC3B,EAOnB,MAFAT,GAAUrJ,MAAMqR,QAAQD,GACxB/H,EAAUiI,SAAU,GACb,EAKX,MAHIjI,GAAUkH,YAAa,GAGpB,EAYX,QAASgB,GAAsC1R,EAAI2R,GAS/C,IAAK,GAJDd,GACAe,EALAC,EAAe,qEACf1R,KACA2R,KACAC,GAAY,EAKPC,EAAON,EAAsCO,OAAQD,IAASD,EAAWC,EAAOA,EAAKC,OAC1F,GAAID,IAAS5R,GAAqB4R,IAASzV,EAAS0B,OAApD,CAkBA,GAbA2T,GACInZ,IAAO,KACPyG,KAAQ+P,EACRhF,KAAQ,KACRC,OAAU,MAGV8H,EAAKpgB,KACLggB,EAAK1S,KAAO8S,EAAKpgB,MACTif,EAAQgB,EAAa3I,KAAK8I,EAAKzb,eACvCqb,EAAK1S,KAAO2R,EAAM,IAGG,mBAAde,GAAK1S,KACd,IACE0S,EAAK1S,KAAO2R,EAAMqB,MAAMC,UAAU,EAAGtB,EAAMqB,MAAMrL,QAAQ,MACzD,MAAOpW,IAGPqhB,EAAM,GAAKE,GACXD,GAAY,EAEZD,EAAM,GAAKE,IAAQ,EAGvB7R,EAAMlI,KAAK2Z,GAGXD,GAGAxR,EAAMoP,OAAO,EAAGoC,EAGpB,IAAI7Q,IACAlP,KAAQoO,EAAGpO,KACXD,QAAWqO,EAAGrO,QACd8G,IAAOsW,IACP5O,MAASA,EAGb,OADA8P,GAAoCnP,EAAQd,EAAGoS,WAAapS,EAAGqS,SAAUrS,EAAGiK,MAAQjK,EAAGsS,WAAYtS,EAAGrO,SAAWqO,EAAGuS,aAC7GzR,EAQX,QAASV,GAAkBJ,EAAI2R,GAC3B,GAAIxR,GAAQ,IACZwR,GAAkB,MAATA,EAAgB,GAAKA,CAE9B,KAEI,GADAxR,EAAQwQ,EAA+B3Q,GAEnC,MAAOG,GAEb,MAAO1P,GACL,GAAI8L,EAASU,MACT,KAAMxM,GAId,IAEI,GADA0P,EAAQuR,EAAsC1R,EAAI2R,EAAQ,GAEtD,MAAOxR,GAEb,MAAO1P,GACL,GAAI8L,EAASU,MACT,KAAMxM,GAGd,OACImB,KAAQoO,EAAGpO,KACXD,QAAWqO,EAAGrO,QACd8G,IAAOsW,KAOf,MAHA3O,GAAkB6P,oCAAsCA,EACxD7P,EAAkBuQ,+BAAiCA,EAE5CvQ,KAGXpQ,EAAOD,QAAUwM,IAEdjL,KAAKf,KAAuB,mBAAXF,QAAyBA,OAAyB,mBAATC,MAAuBA,KAAyB,mBAAXF,QAAyBA,aACxHke,EAAI,IAAIE,GAAG,SAAS/c,EAAQzB,EAAOD,GACtC,YAgBA,SAAS8W,GAAQ2L,EAAUC,GACzB,IAAK,GAAIvhB,GAAI,EAAGA,EAAIshB,EAASjhB,SAAUL,EACrC,GAAIshB,EAASthB,KAAOuhB,EAAQ,MAAOvhB,EAErC,UAGF,QAASuC,GAAUkD,EAAK+b,EAAUC,EAAQC,GACxC,MAAOpf,MAAKC,UAAUkD,EAAKkc,EAAWH,EAAUE,GAAgBD,GAGlE,QAASE,GAAWH,EAAUE,GAC5B,GAAIzS,MAAY2S,IAOhB,OALqB,OAAjBF,IAAuBA,EAAgB,SAAS3b,EAAKC,GACvD,MAAIiJ,GAAM,KAAOjJ,EAAc,eACxB,eAAiB4b,EAAKtgB,MAAM,EAAGqU,EAAQ1G,EAAOjJ,IAAQvE,KAAK,KAAO,MAGpE,SAASsE,EAAKC,GACnB,GAAIiJ,EAAM5O,OAAS,EAAG,CACpB,GAAIwhB,GAAUlM,EAAQ1G,EAAO5P,OAC5BwiB,EAAU5S,EAAMoP,OAAOwD,EAAU,GAAK5S,EAAMlI,KAAK1H,OACjDwiB,EAAUD,EAAKvD,OAAOwD,EAASC,EAAAA,EAAU/b,GAAO6b,EAAK7a,KAAKhB,IACtD4P,EAAQ1G,EAAOjJ,KAAQA,EAAQ0b,EAActhB,KAAKf,KAAM0G,EAAKC,QAE/DiJ,GAAMlI,KAAKf,EAEhB,OAAmB,OAAZwb,EAAmBxb,EAAQwb,EAASphB,KAAKf,KAAM0G,EAAKC,IA/B/DnH,EAAUC,EAAOD,QAAU0D,EAC3B1D,EAAQkjB,aAAeJ,YAkCZ,IAAI","file":"raven.min.js"} \ No newline at end of file +{"version":3,"sources":["raven.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","Raven","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","_dereq_","RavenConfigError","message","name","prototype","constructor","2","wrapMethod","console","level","callback","originalConsoleLevel","originalConsole","sentryLevel","args","slice","arguments","msg","join","data","logger","extra","Function","apply","3","now","Date","keepOriginalCallback","original","isFunction","_hasJSON","JSON","stringify","_hasDocument","isUndefined","_document","_hasNavigator","_navigator","_lastCapturedException","_lastData","_lastEventId","_globalServer","_globalKey","_globalProject","_globalContext","_globalOptions","ignoreErrors","ignoreUrls","whitelistUrls","includePaths","collectWindowErrors","maxMessageLength","maxUrlLength","stackTraceLimit","autoBreadcrumbs","instrument","sampleRate","_ignoreOnError","_isRavenInstalled","_originalErrorStackTraceLimit","_originalConsole","_window","_originalConsoleMethods","_plugins","_startTime","_wrappedBuiltIns","_breadcrumbs","_lastCapturedEvent","_location","location","_lastHref","href","_resetBackoff","method","what","isString","objectPrototype","toString","isEmptyObject","_","each","obj","j","hasKey","objectMerge","obj1","obj2","key","value","objectFrozen","Object","isFrozen","truncate","str","max","substr","object","hasOwnProperty","joinRegExp","patterns","pattern","sources","len","push","replace","source","RegExp","urlencode","pairs","encodeURIComponent","parseUrl","url","match","query","fragment","protocol","host","path","relative","uuid4","crypto","msCrypto","getRandomValues","arr","Uint16Array","pad","num","v","c","Math","random","htmlTreeAsString","elem","nextStr","MAX_TRAVERSE_HEIGHT","MAX_OUTPUT_LEN","out","height","separator","sepLength","htmlElementAsString","parentNode","reverse","className","classes","attr","tagName","toLowerCase","id","split","attrWhitelist","getAttribute","isOnlyOneTruthy","b","isSameException","ex1","ex2","values","type","isSameStacktrace","stacktrace","stack1","stack2","frames1","frames","frames2","filename","lineno","colno","fill","replacement","track","orig","TraceKit","utils","isError","isObject","wrapConsoleMethod","dsnKeys","dsnPattern","document","navigator","VERSION","debug","config","dsn","options","_logDebug","globalOptions","setDSN","maxBreadcrumbs","min","autoBreadcrumbDefaults","xhr","dom","instrumentDefaults","tryCatch","install","isSetup","report","subscribe","_handleOnErrorStackInfo","_instrumentTryCatch","_instrumentBreadcrumbs","_drainPlugins","uri","_parseDSN","lastSlash","lastIndexOf","_dsn","user","_globalSecret","pass","_getGlobalServer","_globalEndpoint","context","func","undefined","wrap","_before","wrapped","deep","_ignoreNextOnError","captureException","__raven__","__raven_wrapper__","property","__inner__","uninstall","_restoreBuiltIns","ex","captureMessage","trimHeadFrames","stack","computeStackTrace","_handleStackInfo","test","fingerprint","_prepareFrames","_send","captureBreadcrumb","crumb","timestamp","breadcrumbCallback","result","shift","addPlugin","plugin","pluginArgs","setUserContext","setExtraContext","_mergeContext","setTagsContext","tags","clearContext","getContext","parse","setEnvironment","environment","setRelease","release","setDataCallback","dataCallback","setBreadcrumbCallback","setShouldSendCallback","shouldSendCallback","setTransport","transport","lastException","lastEventId","ravenNotConfiguredError","afterLoad","RavenConfig","showReportDialog","eventId","encode","qs","email","globalServer","script","createElement","async","src","head","body","appendChild","I","setTimeout","R","eventType","evt","toUpperCase","createEvent","initEvent","createEventObject","dispatchEvent","fireEvent","S","evtName","_keypressTimeout","target","category","U","debounceDuration","isContentEditable","timeout","_breadcrumbEventHandler","clearTimeout","V","from","to","parsedLoc","parsedTo","parsedFrom","A","wrapTimeFn","fn","Array","originalCallback","wrapEventTarget","proto","capture","secure","handleEvent","err","before","clickHandler","keypressHandler","_keypressEventHandler","wrappedBuiltIns","requestAnimationFrame","cb","eventTargets","B","wrapProp","prop","xhrproto","XMLHttpRequest","origOpen","indexOf","__raven_xhr","status_code","origSend","onreadystatechangeHandler","readyState","status","props","onreadystatechange","origFetch","fetchInput","fetchData","then","response","addEventListener","attachEvent","chrome","isChromePackagedApp","app","runtime","hasPushState","history","pushState","oldOnPopState","onpopstate","currentHref","_captureUrlChange","origPushState","log","consoleMethodCallback","M","builtin","C","installer","concat","D","m","exec","allowSecretKey","G","port","z","N","stackInfo","_triggerEvent","_processException","O","frame","_normalizeFrame","in_app","Y","stackInfoUrl","normalized","line","column","function","X","fileurl","testString","exception","culprit","Z","request","Referer","breadcrumbs","_trimBreadcrumbs","$","urlProp","urlProps","httpData","userAgent","headers","User-Agent","referrer","x","_backoffDuration","_backoffStart","ca","da","current","last","ea","_shouldBackoff","retry","getResponseHeader","parseInt","P","baseData","project","platform","_getHttpData","serverName","server_name","_sendProcessedPayload","ga","fa","_trimPacket","allowDuplicates","_isRepeatData","event_id","_getUuid","auth","sentry_version","sentry_client","sentry_key","sentry_secret","_makeRequest","onSuccess","onError","error","_setBackoffState","ha","opts","hasCORS","XDomainRequest","onload","onerror","open","send","y","Q","setUser","setReleaseContext","5","6","7","4","RavenConstructor","_Raven","noConflict","wrappedCallback","normalizedData","getLocationHref","_slice","UNKNOWN_FUNCTION","ERROR_TYPES_RE","handler","installGlobalHandler","handlers","unsubscribe","splice","unsubscribeAll","uninstallGlobalHandler","notifyHandlers","isWindowError","inner","traceKitWindowOnError","lineNo","colNo","lastExceptionStack","augmentStackTraceWithInitialElement","processLastException","groups","_oldOnerrorHandler","_onErrorHandlerInstalled","_lastExceptionStack","_lastArgs","lastArgs","rethrow","incomplete","computeStackTraceFromStackProp","submatch","parts","element","gecko","winjs","geckoEval","chromeEval","lines","isNative","isEval","columnNumber","initial","unshift","partial","computeStackTraceByWalkingCallerChain","depth","item","functionName","funcs","recursion","curr","caller","input","substring","sourceURL","fileName","lineNumber","description","haystack","needle","replacer","spaces","cycleReplacer","serializer","stringifyError","keys","thisPos","Infinity","getSerialize"],"mappings":";CAYA,SAAUA,GAAG,GAAoB,gBAAVC,UAAoC,mBAATC,QAAsBA,OAAOD,QAAQD,QAAS,IAAmB,kBAATG,SAAqBA,OAAOC,IAAKD,UAAUH,OAAO,CAAC,GAAIK,EAAkCA,GAAb,mBAATC,QAAwBA,OAA+B,mBAATC,QAAwBA,OAA6B,mBAAPC,MAAsBA,KAAYC,KAAKJ,EAAEK,MAAQV,MAAO,WAAqC,MAAO,SAAUW,GAAEC,EAAEC,EAAEC,GAAG,QAASC,GAAEC,EAAEC,GAAG,IAAIJ,EAAEG,GAAG,CAAC,IAAIJ,EAAEI,GAAG,CAAC,GAAIE,GAAkB,kBAATC,UAAqBA,OAAQ,KAAIF,GAAGC,EAAE,MAAOA,GAAEF,GAAE,EAAI,IAAGI,EAAE,MAAOA,GAAEJ,GAAE,EAAI,IAAIhB,GAAE,GAAIqB,OAAM,uBAAuBL,EAAE,IAAK,MAAMhB,GAAEsB,KAAK,mBAAmBtB,EAAE,GAAIuB,GAAEV,EAAEG,IAAIf,WAAYW,GAAEI,GAAG,GAAGQ,KAAKD,EAAEtB,QAAQ,SAASU,GAAG,GAAIE,GAAED,EAAEI,GAAG,GAAGL,EAAG,OAAOI,GAAEF,EAAEA,EAAEF,IAAIY,EAAEA,EAAEtB,QAAQU,EAAEC,EAAEC,EAAEC,GAAG,MAAOD,GAAEG,GAAGf,QAAkD,IAAI,GAA1CmB,GAAkB,kBAATD,UAAqBA,QAAgBH,EAAE,EAAEA,EAAEF,EAAEW,OAAOT,IAAID,EAAED,EAAEE,GAAI,OAAOD,KAAKW,GAAG,SAASC,EAAQzB,EAAOD,GACp0B,QAAS2B,GAAiBC,GACxBpB,KAAKqB,KAAO,mBACZrB,KAAKoB,QAAUA,EAEjBD,EAAiBG,UAAY,GAAIV,OACjCO,EAAiBG,UAAUC,YAAcJ,EAEzC1B,EAAOD,QAAU2B,OAEXK,GAAG,SAASN,EAAQzB,EAAOD,GACjC,GAAIiC,GAAa,SAASC,EAASC,EAAOC,GACxC,GAAIC,GAAuBH,EAAQC,GAC/BG,EAAkBJ,CAEtB,IAAMC,IAASD,GAAf,CAIA,GAAIK,GAAwB,SAAVJ,EAAmB,UAAYA,CAEjDD,GAAQC,GAAS,WACf,GAAIK,MAAUC,MAAMlB,KAAKmB,WAErBC,EAAM,GAAKH,EAAKI,KAAK,KACrBC,GAAQV,MAAOI,EAAaO,OAAQ,UAAWC,OAAQL,UAAWF,GAExD,YAAVL,EACEK,EAAK,MAAO,IAEdG,EAAM,sBAAwBH,EAAKC,MAAM,GAAGG,KAAK,MAAQ,kBACzDC,EAAKE,MAAML,UAAYF,EAAKC,MAAM,GAClCL,GAAYA,EAASO,EAAKE,IAG5BT,GAAYA,EAASO,EAAKE,GAIxBR,GAGFW,SAASlB,UAAUmB,MAAM1B,KAAKc,EAAsBC,EAAiBE,KAK3EvC,GAAOD,SACLiC,WAAYA,QAGRiB,GAAG,SAASxB,EAAQzB,EAAOD,IACjC,SAAWM,GAgBX,QAAS6C,KACP,OAAQ,GAAIC,MAWd,QAASC,GAAqBC,EAAUlB,GACtC,MAAOmB,GAAWnB,GACd,SAASS,GACP,MAAOT,GAASS,EAAMS,IAExBlB,EAMN,QAAS3B,KACPD,KAAKgD,IAA8B,gBAATC,QAAqBA,KAAKC,WAEpDlD,KAAKmD,GAAgBC,EAAYC,GACjCrD,KAAKsD,GAAiBF,EAAYG,GAClCvD,KAAKwD,EAAyB,KAC9BxD,KAAKyD,EAAY,KACjBzD,KAAK0D,EAAe,KACpB1D,KAAK2D,EAAgB,KACrB3D,KAAK4D,EAAa,KAClB5D,KAAK6D,EAAiB,KACtB7D,KAAK8D,KACL9D,KAAK+D,GACHzB,OAAQ,aACR0B,gBACAC,cACAC,iBACAC,gBACAC,qBAAqB,EACrBC,iBAAkB,EAGlBC,aAAc,IACdC,gBAAiB,GACjBC,iBAAiB,EACjBC,YAAY,EACZC,WAAY,GAEd1E,KAAK2E,EAAiB,EACtB3E,KAAK4E,GAAoB,EACzB5E,KAAK6E,EAAgCjE,MAAM2D,gBAG3CvE,KAAK8E,EAAmBC,EAAQrD,YAChC1B,KAAKgF,KACLhF,KAAKiF,KACLjF,KAAKkF,EAAavC,IAClB3C,KAAKmF,KACLnF,KAAKoF,KACLpF,KAAKqF,EAAqB,KAE1BrF,KAAKsF,EAAYP,EAAQQ,SACzBvF,KAAKwF,EAAYxF,KAAKsF,GAAatF,KAAKsF,EAAUG,KAClDzF,KAAK0F,GAGL,KAAK,GAAIC,KAAU3F,MAAK8E,EACtB9E,KAAKgF,EAAwBW,GAAU3F,KAAK8E,EAAiBa,GA+vDjE,QAASvC,GAAYwC,GACnB,MAAgB,UAATA,EAGT,QAAS7C,GAAW6C,GAClB,MAAuB,kBAATA,GAGhB,QAASC,GAASD,GAChB,MAA+C,oBAAxCE,EAAgBC,SAAShF,KAAK6E,GAGvC,QAASI,GAAcJ,GACrB,IAAK,GAAIK,KAAKL,GAAM,OAAO,CAC3B,QAAO,EAGT,QAASM,GAAKC,EAAKvE,GACjB,GAAIjB,GAAGyF,CAEP,IAAIhD,EAAY+C,EAAInF,QAClB,IAAKL,IAAKwF,GACJE,EAAOF,EAAKxF,IACdiB,EAASb,KAAK,KAAMJ,EAAGwF,EAAIxF,QAK/B,IADAyF,EAAID,EAAInF,OAEN,IAAKL,EAAI,EAAGA,EAAIyF,EAAGzF,IACjBiB,EAASb,KAAK,KAAMJ,EAAGwF,EAAIxF,IAMnC,QAAS2F,GAAYC,EAAMC,GACzB,MAAKA,IAGLN,EAAKM,EAAM,SAASC,EAAKC,GACvBH,EAAKE,GAAOC,IAEPH,GALEA,EAgBX,QAASI,GAAaR,GACpB,QAAKS,OAAOC,UAGLD,OAAOC,SAASV,GAGzB,QAASW,GAASC,EAAKC,GACrB,OAAQA,GAAOD,EAAI/F,QAAUgG,EAAMD,EAAMA,EAAIE,OAAO,EAAGD,GAAO,IAUhE,QAASX,GAAOa,EAAQT,GACtB,MAAOX,GAAgBqB,eAAepG,KAAKmG,EAAQT,GAGrD,QAASW,GAAWC,GAQlB,IALA,GAGEC,GAHEC,KACF5G,EAAI,EACJ6G,EAAMH,EAASrG,OAGVL,EAAI6G,EAAK7G,IACd2G,EAAUD,EAAS1G,GACfkF,EAASyB,GAGXC,EAAQE,KAAKH,EAAQI,QAAQ,8BAA+B,SACnDJ,GAAWA,EAAQK,QAE5BJ,EAAQE,KAAKH,EAAQK,OAIzB,OAAO,IAAIC,QAAOL,EAAQnF,KAAK,KAAM,KAGvC,QAASyF,GAAUtH,GACjB,GAAIuH,KAIJ,OAHA5B,GAAK3F,EAAG,SAASkG,EAAKC,GACpBoB,EAAML,KAAKM,mBAAmBtB,GAAO,IAAMsB,mBAAmBrB,MAEzDoB,EAAM1F,KAAK,KAMpB,QAAS4F,GAASC,GAChB,GAAIC,GAAQD,EAAIC,MAAM,iEACtB,KAAKA,EAAO,QAGZ,IAAIC,GAAQD,EAAM,IAAM,GACpBE,EAAWF,EAAM,IAAM,EAC3B,QACEG,SAAUH,EAAM,GAChBI,KAAMJ,EAAM,GACZK,KAAML,EAAM,GACZM,SAAUN,EAAM,GAAKC,EAAQC,GAGjC,QAASK,KACP,GAAIC,GAAS3D,EAAQ2D,QAAU3D,EAAQ4D,QAEvC,KAAKvF,EAAYsF,IAAWA,EAAOE,gBAAiB,CAGlD,GAAIC,GAAM,GAAIC,aAAY,EAC1BJ,GAAOE,gBAAgBC,GAGvBA,EAAI,GAAe,KAATA,EAAI,GAAc,MAE5BA,EAAI,GAAe,MAATA,EAAI,GAAe,KAE7B,IAAIE,GAAM,SAASC,GAEjB,IADA,GAAIC,GAAID,EAAIjD,SAAS,IACdkD,EAAEjI,OAAS,GAChBiI,EAAI,IAAMA,CAEZ,OAAOA,GAGT,OACEF,GAAIF,EAAI,IACRE,EAAIF,EAAI,IACRE,EAAIF,EAAI,IACRE,EAAIF,EAAI,IACRE,EAAIF,EAAI,IACRE,EAAIF,EAAI,IACRE,EAAIF,EAAI,IACRE,EAAIF,EAAI,IAIV,MAAO,mCAAmCnB,QAAQ,QAAS,SAASwB,GAClE,GAAI7I,GAAqB,GAAhB8I,KAAKC,SAAiB,EAC7BH,EAAU,MAANC,EAAY7I,EAAS,EAAJA,EAAW,CAClC,OAAO4I,GAAElD,SAAS,MAYxB,QAASsD,GAAiBC,GAWxB,IATA,GAOEC,GAPEC,EAAsB,EACxBC,EAAiB,GACjBC,KACAC,EAAS,EACTnC,EAAM,EACNoC,EAAY,MACZC,EAAYD,EAAU5I,OAGjBsI,GAAQK,IAAWH,IACxBD,EAAUO,EAAoBR,KAMhB,SAAZC,GACCI,EAAS,GAAKnC,EAAMkC,EAAI1I,OAAS6I,EAAYN,EAAQvI,QAAUyI,KAKlEC,EAAIjC,KAAK8B,GAET/B,GAAO+B,EAAQvI,OACfsI,EAAOA,EAAKS,UAGd,OAAOL,GAAIM,UAAU5H,KAAKwH,GAS5B,QAASE,GAAoBR,GAC3B,GACEW,GACAC,EACAzD,EACA0D,EACAxJ,EALE+I,IAOJ,KAAKJ,IAASA,EAAKc,QACjB,MAAO,EAST,IANAV,EAAIjC,KAAK6B,EAAKc,QAAQC,eAClBf,EAAKgB,IACPZ,EAAIjC,KAAK,IAAM6B,EAAKgB,IAGtBL,EAAYX,EAAKW,UACbA,GAAapE,EAASoE,GAExB,IADAC,EAAUD,EAAUM,MAAM,OACrB5J,EAAI,EAAGA,EAAIuJ,EAAQlJ,OAAQL,IAC9B+I,EAAIjC,KAAK,IAAMyC,EAAQvJ,GAG3B,IAAI6J,IAAiB,OAAQ,OAAQ,QAAS,MAC9C,KAAK7J,EAAI,EAAGA,EAAI6J,EAAcxJ,OAAQL,IACpC8F,EAAM+D,EAAc7J,GACpBwJ,EAAOb,EAAKmB,aAAahE,GACrB0D,GACFT,EAAIjC,KAAK,IAAMhB,EAAM,KAAO0D,EAAO,KAGvC,OAAOT,GAAItH,KAAK,IAMlB,QAASsI,GAAgBjK,EAAGkK,GAC1B,WAAYlK,IAAMkK,GAMpB,QAASC,GAAgBC,EAAKC,GAC5B,OAAIJ,EAAgBG,EAAKC,KAEzBD,EAAMA,EAAIE,OAAO,GACjBD,EAAMA,EAAIC,OAAO,GAEbF,EAAIG,OAASF,EAAIE,MAAQH,EAAInE,QAAUoE,EAAIpE,OAExCuE,EAAiBJ,EAAIK,WAAYJ,EAAII,aAM9C,QAASD,GAAiBE,EAAQC,GAChC,GAAIV,EAAgBS,EAAQC,GAAS,OAAO,CAE5C,IAAIC,GAAUF,EAAOG,OACjBC,EAAUH,EAAOE,MAGrB,IAAID,EAAQrK,SAAWuK,EAAQvK,OAAQ,OAAO,CAI9C,KAAK,GADDP,GAAGkK,EACEhK,EAAI,EAAGA,EAAI0K,EAAQrK,OAAQL,IAGlC,GAFAF,EAAI4K,EAAQ1K,GACZgK,EAAIY,EAAQ5K,GAEVF,EAAE+K,WAAab,EAAEa,UACjB/K,EAAEgL,SAAWd,EAAEc,QACfhL,EAAEiL,QAAUf,EAAEe,OACdjL,EAAE,cAAgBkK,EAAE,YAEpB,OAAO,CAEX,QAAO,EAUT,QAASgB,GAAKxF,EAAK9E,EAAMuK,EAAaC,GACpC,GAAIC,GAAO3F,EAAI9E,EACf8E,GAAI9E,GAAQuK,EAAYE,GACpBD,GACFA,EAAMpE,MAAMtB,EAAK9E,EAAMyK,IAroE3B,GAAIC,GAAW7K,EAAQ,GACnBgC,EAAYhC,EAAQ,GACpBC,EAAmBD,EAAQ,GAC3B8K,EAAQ9K,EAAQ,GAEhB+K,EAAUD,EAAMC,QAClBC,EAAWF,EAAME,SAEfC,EAAoBjL,EAAQ,GAAGO,WAE/B2K,EAAU,2CAA2C7B,MAAM,KAC7D8B,EAAa,gEAOXtH,EACgB,mBAAXlF,QACHA,OACkB,mBAAXC,GAAyBA,EAAyB,mBAATC,MAAuBA,QACzEsD,EAAY0B,EAAQuH,SACpB/I,EAAawB,EAAQwH,SAsEzBtM,GAAMqB,WAKJkL,QAAS,SAETC,OAAO,EAEPV,SAAUA,EASVW,OAAQ,SAASC,EAAKC,GACpB,GAAI7M,GAAOC,IAEX,IAAID,EAAK4D,EAEP,MADA3D,MAAK6M,EAAU,QAAS,4CACjB9M,CAET,KAAK4M,EAAK,MAAO5M,EAEjB,IAAI+M,GAAgB/M,EAAKgE,CAGrB6I,IACF1G,EAAK0G,EAAS,SAASnG,EAAKC,GAEd,SAARD,GAA0B,UAARA,GAA2B,SAARA,EACvC1G,EAAK+D,EAAe2C,GAAOC,EAE3BoG,EAAcrG,GAAOC,IAK3B3G,EAAKgN,OAAOJ,GAIZG,EAAc9I,aAAayD,KAAK,qBAChCqF,EAAc9I,aAAayD,KAAK,iDAGhCqF,EAAc9I,aAAeoD,EAAW0F,EAAc9I,cACtD8I,EAAc7I,aAAa6I,EAAc7I,WAAWjD,QAChDoG,EAAW0F,EAAc7I,YAE7B6I,EAAc5I,gBAAgB4I,EAAc5I,cAAclD,QACtDoG,EAAW0F,EAAc5I,eAE7B4I,EAAc3I,aAAeiD,EAAW0F,EAAc3I,cACtD2I,EAAcE,eAAiB7D,KAAKnC,IAClC,EACAmC,KAAK8D,IAAIH,EAAcE,gBAAkB,IAAK,KAGhD,IAAIE,IACFC,KAAK,EACLzL,SAAS,EACT0L,KAAK,EACL7H,UAAU,GAGRf,EAAkBsI,EAActI,eACM,wBAAnCuB,SAAShF,KAAKyD,GACnBA,EAAkB8B,EAAY4G,EAAwB1I,GAC7CA,KAAoB,IAC7BA,EAAkB0I,GAEpBJ,EAActI,gBAAkBA,CAEhC,IAAI6I,IACFC,UAAU,GAGR7I,EAAaqI,EAAcrI,UAW/B,OAVqC,uBAA9BsB,SAAShF,KAAK0D,GACnBA,EAAa6B,EAAY+G,EAAoB5I,GACpCA,KAAe,IACxBA,EAAa4I,GAEfP,EAAcrI,WAAaA,EAE3BsH,EAAS3H,sBAAwB0I,EAAc1I,oBAGxCrE,GAWTwN,QAAS,WACP,GAAIxN,GAAOC,IAkBX,OAjBID,GAAKyN,YAAczN,EAAK6E,IAC1BmH,EAAS0B,OAAOC,UAAU,WACxB3N,EAAK4N,EAAwBlL,MAAM1C,EAAMmC,aAEvCnC,EAAKgE,EAAeU,YAAc1E,EAAKgE,EAAeU,WAAW6I,UACnEvN,EAAK6N,IAGH7N,EAAKgE,EAAeS,iBAAiBzE,EAAK8N,IAG9C9N,EAAK+N,IAEL/N,EAAK6E,GAAoB,GAG3BhE,MAAM2D,gBAAkBxE,EAAKgE,EAAeQ,gBACrCvE,MAQT+M,OAAQ,SAASJ,GACf,GAAI5M,GAAOC,KACT+N,EAAMhO,EAAKiO,EAAUrB,GACrBsB,EAAYF,EAAIxF,KAAK2F,YAAY,KACjC3F,EAAOwF,EAAIxF,KAAKtB,OAAO,EAAGgH,EAE5BlO,GAAKoO,EAAOxB,EACZ5M,EAAK6D,EAAamK,EAAIK,KACtBrO,EAAKsO,EAAgBN,EAAIO,MAAQP,EAAIO,KAAKrH,OAAO,GACjDlH,EAAK8D,EAAiBkK,EAAIxF,KAAKtB,OAAOgH,EAAY,GAElDlO,EAAK4D,EAAgB5D,EAAKwO,EAAiBR,GAE3ChO,EAAKyO,EACHzO,EAAK4D,EAAgB,IAAM4E,EAAO,OAASxI,EAAK8D,EAAiB,UAInE7D,KAAK0F,KAWP+I,QAAS,SAAS7B,EAAS8B,EAAM1M,GAO/B,MANIe,GAAW6J,KACb5K,EAAO0M,MACPA,EAAO9B,EACPA,EAAU+B,QAGL3O,KAAK4O,KAAKhC,EAAS8B,GAAMjM,MAAMzC,KAAMgC,IAW9C4M,KAAM,SAAShC,EAAS8B,EAAMG,GAqC5B,QAASC,KACP,GAAI9M,MACFrB,EAAIuB,UAAUlB,OACd+N,GAAQnC,GAAYA,GAAWA,EAAQmC,QAAS,CAQlD,KANIF,GAAW9L,EAAW8L,IACxBA,EAAQpM,MAAMzC,KAAMkC,WAKfvB,KAAKqB,EAAKrB,GAAKoO,EAAOhP,EAAK6O,KAAKhC,EAAS1K,UAAUvB,IAAMuB,UAAUvB,EAE1E,KAKE,MAAO+N,GAAKjM,MAAMzC,KAAMgC,GACxB,MAAO9B,GAGP,KAFAH,GAAKiP,IACLjP,EAAKkP,iBAAiB/O,EAAG0M,GACnB1M,GA1DV,GAAIH,GAAOC,IAGX,IAAIoD,EAAYsL,KAAU3L,EAAW6J,GACnC,MAAOA,EAWT,IAPI7J,EAAW6J,KACb8B,EAAO9B,EACPA,EAAU+B,SAKP5L,EAAW2L,GACd,MAAOA,EAIT,KACE,GAAIA,EAAKQ,EACP,MAAOR,EAIT,IAAIA,EAAKS,EACP,MAAOT,GAAKS,EAEd,MAAOjP,GAIP,MAAOwO,GA8BT,IAAK,GAAIU,KAAYV,GACfrI,EAAOqI,EAAMU,KACfN,EAAQM,GAAYV,EAAKU,GAW7B,OARAN,GAAQxN,UAAYoN,EAAKpN,UAEzBoN,EAAKS,EAAoBL,EAGzBA,EAAQI,GAAY,EACpBJ,EAAQO,EAAYX,EAEbI,GAQTQ,UAAW,WAQT,MAPAvD,GAAS0B,OAAO6B,YAEhBtP,KAAKuP,IAEL3O,MAAM2D,gBAAkBvE,KAAK6E,EAC7B7E,KAAK4E,GAAoB,EAElB5E,MAUTiP,iBAAkB,SAASO,EAAI5C,GAE7B,IAAKX,EAAQuD,GACX,MAAOxP,MAAKyP,eACVD,EACAlJ,GAEIoJ,eAAgB,EAChBxE,YAAY,GAEd0B,GAMN5M,MAAKwD,EAAyBgM,CAO9B,KACE,GAAIG,GAAQ5D,EAAS6D,kBAAkBJ,EACvCxP,MAAK6P,EAAiBF,EAAO/C,GAC7B,MAAO/B,GACP,GAAI2E,IAAO3E,EACT,KAAMA,GAIV,MAAO7K,OAUTyP,eAAgB,SAAStN,EAAKyK,GAI5B,IACI5M,KAAK+D,EAAeC,aAAa8L,OACnC9P,KAAK+D,EAAeC,aAAa8L,KAAK3N,GAFxC,CAOAyK,EAAUA,KAEV,IAAIvK,GAAOiE,GAEPlF,QAASe,EAAM,IAEjByK,EAGF,IAAI5M,KAAK+D,EAAemH,YAAe0B,GAAWA,EAAQ1B,WAAa,CACrE,GAAIsE,EAKJ,KACE,KAAM,IAAI5O,OAAMuB,GAChB,MAAO0I,GACP2E,EAAK3E,EAIP2E,EAAGnO,KAAO,KAEVuL,EAAUtG,GAINyJ,YAAa5N,EAIbuN,gBAAiB9C,EAAQ8C,gBAAkB,GAAK,GAElD9C,EAGF,IAAI+C,GAAQ5D,EAAS6D,kBAAkBJ,GACnClE,EAAStL,KAAKgQ,EAAeL,EAAO/C,EACxCvK,GAAK6I,YAEHI,OAAQA,EAAOtB,WAOnB,MAFAhK,MAAKiQ,EAAM5N,GAEJrC,OAGTkQ,kBAAmB,SAAS/J,GAC1B,GAAIgK,GAAQ7J,GAER8J,UAAWzN,IAAQ,KAErBwD,EAGF,IAAIpD,EAAW/C,KAAK+D,EAAesM,oBAAqB,CACtD,GAAIC,GAAStQ,KAAK+D,EAAesM,mBAAmBF,EAEpD,IAAIjE,EAASoE,KAAYtK,EAAcsK,GACrCH,EAAQG,MACH,IAAIA,KAAW,EACpB,MAAOtQ,MAQX,MAJAA,MAAKoF,EAAaqC,KAAK0I,GACnBnQ,KAAKoF,EAAapE,OAAShB,KAAK+D,EAAeiJ,gBACjDhN,KAAKoF,EAAamL,QAEbvQ,MAGTwQ,UAAW,SAASC,GAClB,GAAIC,MAAgBzO,MAAMlB,KAAKmB,UAAW,EAO1C,OALAlC,MAAKiF,EAASwC,MAAMgJ,EAAQC,IACxB1Q,KAAK4E,GACP5E,KAAK8N,IAGA9N,MAST2Q,eAAgB,SAASvC,GAIvB,MAFApO,MAAK8D,EAAesK,KAAOA,EAEpBpO,MAST4Q,gBAAiB,SAASrO,GAGxB,MAFAvC,MAAK6Q,EAAc,QAAStO,GAErBvC,MAST8Q,eAAgB,SAASC,GAGvB,MAFA/Q,MAAK6Q,EAAc,OAAQE,GAEpB/Q,MAQTgR,aAAc,WAGZ,MAFAhR,MAAK8D,KAEE9D,MAQTiR,WAAY,WAEV,MAAOhO,MAAKiO,MAAMhO,EAAUlD,KAAK8D,KASnCqN,eAAgB,SAASC,GAGvB,MAFApR,MAAK+D,EAAeqN,YAAcA,EAE3BpR,MASTqR,WAAY,SAASC,GAGnB,MAFAtR,MAAK+D,EAAeuN,QAAUA,EAEvBtR,MAUTuR,gBAAiB,SAAS3P,GACxB,GAAIkB,GAAW9C,KAAK+D,EAAeyN,YAEnC,OADAxR,MAAK+D,EAAeyN,aAAe3O,EAAqBC,EAAUlB,GAC3D5B,MAUTyR,sBAAuB,SAAS7P,GAC9B,GAAIkB,GAAW9C,KAAK+D,EAAesM,kBAEnC,OADArQ,MAAK+D,EAAesM,mBAAqBxN,EAAqBC,EAAUlB,GACjE5B,MAUT0R,sBAAuB,SAAS9P,GAC9B,GAAIkB,GAAW9C,KAAK+D,EAAe4N,kBAEnC,OADA3R,MAAK+D,EAAe4N,mBAAqB9O,EAAqBC,EAAUlB,GACjE5B,MAYT4R,aAAc,SAASC,GAGrB,MAFA7R,MAAK+D,EAAe8N,UAAYA,EAEzB7R,MAQT8R,cAAe,WACb,MAAO9R,MAAKwD,GAQduO,YAAa,WACX,MAAO/R,MAAK0D,GAQd8J,QAAS,WACP,QAAKxN,KAAKgD,MACLhD,KAAK2D,IACH3D,KAAKgS,0BACRhS,KAAKgS,yBAA0B,EAC/BhS,KAAK6M,EAAU,QAAS,2CAEnB,KAKXoF,UAAW,WAIT,GAAIC,GAAcnN,EAAQmN,WACtBA,IACFlS,KAAK0M,OAAOwF,EAAYvF,IAAKuF,EAAYxF,QAAQa,WAIrD4E,iBAAkB,SAASvF,GACzB,GACGvJ,EADH,CAKAuJ,EAAUA,KAEV,IAAImF,GAAcnF,EAAQwF,SAAWpS,KAAK+R,aAC1C,KAAKA,EACH,KAAM,IAAI5Q,GAAiB,kBAG7B,IAAIwL,GAAMC,EAAQD,KAAO3M,KAAKmO,CAC9B,KAAKxB,EACH,KAAM,IAAIxL,GAAiB,cAG7B,IAAIkR,GAAStK,mBACTuK,EAAK,EACTA,IAAM,YAAcD,EAAON,GAC3BO,GAAM,QAAUD,EAAO1F,EAEvB,IAAIyB,GAAOxB,EAAQwB,MAAQpO,KAAK8D,EAAesK,IAC3CA,KACEA,EAAK/M,OAAMiR,GAAM,SAAWD,EAAOjE,EAAK/M,OACxC+M,EAAKmE,QAAOD,GAAM,UAAYD,EAAOjE,EAAKmE,QAGhD,IAAIC,GAAexS,KAAKuO,EAAiBvO,KAAKgO,EAAUrB,IAEpD8F,EAASpP,EAAUqP,cAAc,SACrCD,GAAOE,OAAQ,EACfF,EAAOG,IAAMJ,EAAe,yBAA2BF,GACtDjP,EAAUwP,MAAQxP,EAAUyP,MAAMC,YAAYN,KAIjDO,EAAoB,WAClB,GAAIjT,GAAOC,IACXA,MAAK2E,GAAkB,EACvBsO,WAAW,WAETlT,EAAK4E,GAAkB,KAI3BuO,EAAe,SAASC,EAAWvG,GAEjC,GAAIwG,GAAK3M,CAET,IAAKzG,KAAKmD,EAAV,CAEAyJ,EAAUA,MAEVuG,EAAY,QAAUA,EAAUlM,OAAO,EAAG,GAAGoM,cAAgBF,EAAUlM,OAAO,GAE1E5D,EAAUiQ,aACZF,EAAM/P,EAAUiQ,YAAY,cAC5BF,EAAIG,UAAUJ,GAAW,GAAM,KAE/BC,EAAM/P,EAAUmQ,oBAChBJ,EAAID,UAAYA,EAGlB,KAAK1M,IAAOmG,GACNvG,EAAOuG,EAASnG,KAClB2M,EAAI3M,GAAOmG,EAAQnG,GAGvB,IAAIpD,EAAUiQ,YAEZjQ,EAAUoQ,cAAcL,OAIxB,KACE/P,EAAUqQ,UAAU,KAAON,EAAID,UAAU9I,cAAe+I,GACxD,MAAOlT,OAYbyT,EAAyB,SAASC,GAChC,GAAI7T,GAAOC,IACX,OAAO,UAASoT,GASd,GALArT,EAAK8T,EAAmB,KAKpB9T,EAAKsF,IAAuB+N,EAAhC,CAEArT,EAAKsF,EAAqB+N,CAM1B,IAAIU,EACJ,KACEA,EAASzK,EAAiB+J,EAAIU,QAC9B,MAAO5T,GACP4T,EAAS,YAGX/T,EAAKmQ,mBACH6D,SAAU,MAAQH,EAClBxS,QAAS0S,OAUfE,EAAuB,WACrB,GAAIjU,GAAOC,KACTiU,EAAmB,GAKrB,OAAO,UAASb,GACd,GAAIU,EACJ,KACEA,EAASV,EAAIU,OACb,MAAO5T,GAGP,OAEF,GAAIkK,GAAU0J,GAAUA,EAAO1J,OAK/B,IACGA,IACY,UAAZA,GAAmC,aAAZA,GAA2B0J,EAAOI,mBAF5D,CAQA,GAAIC,GAAUpU,EAAK8T,CACdM,IACHpU,EAAKqU,EAAwB,SAAShB,GAExCiB,aAAaF,GACbpU,EAAK8T,EAAmBZ,WAAW,WACjClT,EAAK8T,EAAmB,MACvBI,MAUPK,EAAmB,SAASC,EAAMC,GAChC,GAAIC,GAAYzM,EAAShI,KAAKsF,EAAUG,MACpCiP,EAAW1M,EAASwM,GACpBG,EAAa3M,EAASuM,EAK1BvU,MAAKwF,EAAYgP,EAIbC,EAAUpM,WAAaqM,EAASrM,UAAYoM,EAAUnM,OAASoM,EAASpM,OAC1EkM,EAAKE,EAASlM,UACZiM,EAAUpM,WAAasM,EAAWtM,UAAYoM,EAAUnM,OAASqM,EAAWrM,OAC9EiM,EAAOI,EAAWnM,UAEpBxI,KAAKkQ,mBACH6D,SAAU,aACV1R,MACEmS,GAAIA,EACJD,KAAMA,MASZK,EAAqB,WAKnB,QAASC,GAAW/I,GAClB,MAAO,UAASgJ,EAAI3U,GAKlB,IAAK,GADD6B,GAAO,GAAI+S,OAAM7S,UAAUlB,QACtBL,EAAI,EAAGA,EAAIqB,EAAKhB,SAAUL,EACjCqB,EAAKrB,GAAKuB,UAAUvB,EAEtB,IAAIqU,GAAmBhT,EAAK,EAQ5B,OAPIe,GAAWiS,KACbhT,EAAK,GAAKjC,EAAK6O,KAAKoG,IAMlBlJ,EAAKrJ,MACAqJ,EAAKrJ,MAAMzC,KAAMgC,GAEjB8J,EAAK9J,EAAK,GAAIA,EAAK,KAOhC,QAASiT,GAAgBnV,GACvB,GAAIoV,GAAQnQ,EAAQjF,IAAWiF,EAAQjF,GAAQwB,SAC3C4T,IAASA,EAAM/N,gBAAkB+N,EAAM/N,eAAe,sBACxDwE,EACEuJ,EACA,mBACA,SAASpJ,GACP,MAAO,UAAS8H,EAASkB,EAAIK,EAASC,GAEpC,IACMN,GAAMA,EAAGO,cACXP,EAAGO,YAActV,EAAK6O,KAAKkG,EAAGO,cAEhC,MAAOC,IAMT,GAAIC,GAAQC,EAAcC,CA6B1B,OA1BEjR,IACAA,EAAgB4I,MACJ,gBAAXtN,GAAuC,SAAXA,KAI7B0V,EAAezV,EAAKqU,EAAwB,SAC5CqB,EAAkB1V,EAAK2V,IACvBH,EAAS,SAASnC,GAIhB,GAAKA,EAAL,CAEA,GAAID,EACJ,KACEA,EAAYC,EAAIpI,KAChB,MAAO9K,GAGP,OAEF,MAAkB,UAAdiT,EAA8BqC,EAAapC,GACxB,aAAdD,EAAiCsC,EAAgBrC,GAArD,UAGFtH,EAAK/K,KACVf,KACA4T,EACA7T,EAAK6O,KAAKkG,EAAInG,OAAW4G,GACzBJ,EACAC,KAINO,GAEFhK,EACEuJ,EACA,sBACA,SAASpJ,GACP,MAAO,UAASsH,EAAK0B,EAAIK,EAASC,GAChC,IACEN,EAAKA,IAAOA,EAAG3F,EAAoB2F,EAAG3F,EAAoB2F,GAC1D,MAAO5U,IAGT,MAAO4L,GAAK/K,KAAKf,KAAMoT,EAAK0B,EAAIK,EAASC,KAG7CO,IAvGN,GAAI5V,GAAOC,KAEP2V,EAAkB5V,EAAKoF,EA2BvBX,EAAkBxE,KAAK+D,EAAeS,eA+E1CmH,GAAK5G,EAAS,aAAc8P,EAAYc,GACxChK,EAAK5G,EAAS,cAAe8P,EAAYc,GACrC5Q,EAAQ6Q,uBACVjK,EACE5G,EACA,wBACA,SAAS+G,GACP,MAAO,UAAS+J,GACd,MAAO/J,GAAK/L,EAAK6O,KAAKiH,MAG1BF,EAqCJ,KAAK,GA/BDG,IACF,cACA,SACA,OACA,mBACA,iBACA,oBACA,kBACA,cACA,aACA,qBACA,cACA,aACA,iBACA,eACA,kBACA,cACA,cACA,eACA,qBACA,SACA,YACA,eACA,gBACA,YACA,kBACA,SACA,iBACA,4BACA,wBAEOnV,EAAI,EAAGA,EAAImV,EAAa9U,OAAQL,IACvCsU,EAAgBa,EAAanV,KAajCoV,EAAwB,WAMtB,QAASC,GAASC,EAAM9I,GAClB8I,IAAQ9I,IAAOpK,EAAWoK,EAAI8I,KAChCtK,EAAKwB,EAAK8I,EAAM,SAASnK,GACvB,MAAO/L,GAAK6O,KAAK9C,KARvB,GAAI/L,GAAOC,KACPwE,EAAkBxE,KAAK+D,EAAeS,gBAEtCmR,EAAkB5V,EAAKoF,CAU3B,IAAIX,EAAgB2I,KAAO,kBAAoBpI,GAAS,CACtD,GAAImR,GAAWC,eAAe7U,SAC9BqK,GACEuK,EACA,OACA,SAASE,GACP,MAAO,UAASzQ,EAAQsC,GAYtB,MARIpC,GAASoC,IAAQA,EAAIoO,QAAQtW,EAAK6D,UACpC5D,KAAKsW,GACH3Q,OAAQA,EACRsC,IAAKA,EACLsO,YAAa,OAIVH,EAAS3T,MAAMzC,KAAMkC,aAGhCyT,GAGFhK,EACEuK,EACA,OACA,SAASM,GACP,MAAO,UAASnU,GAId,QAASoU,KACP,GAAItJ,EAAImJ,GAAkC,IAAnBnJ,EAAIuJ,WAAkB,CAC3C,IAGEvJ,EAAImJ,EAAYC,YAAcpJ,EAAIwJ,OAClC,MAAOzW,IAITH,EAAKmQ,mBACHlF,KAAM,OACN+I,SAAU,MACV1R,KAAM8K,EAAImJ,KAMhB,IAAK,GArBDnJ,GAAMnN,KAoBN4W,GAAS,SAAU,UAAW,cACzBxQ,EAAI,EAAGA,EAAIwQ,EAAM5V,OAAQoF,IAChC4P,EAASY,EAAMxQ,GAAI+G,EAiBrB,OAdI,sBAAwBA,IAAOpK,EAAWoK,EAAI0J,oBAChDlL,EACEwB,EACA,qBACA,SAASrB,GACP,MAAO/L,GAAK6O,KAAK9C,EAAM6C,OAAW8H,KAMtCtJ,EAAI0J,mBAAqBJ,EAGpBD,EAAS/T,MAAMzC,KAAMkC,aAGhCyT,GAIAnR,EAAgB2I,KAAO,SAAWpI,IACpC4G,EACE5G,EACA,QACA,SAAS+R,GACP,MAAO,UAAShC,EAAI3U,GAKlB,IAAK,GADD6B,GAAO,GAAI+S,OAAM7S,UAAUlB,QACtBL,EAAI,EAAGA,EAAIqB,EAAKhB,SAAUL,EACjCqB,EAAKrB,GAAKuB,UAAUvB,EAGtB,IAEIsH,GAFA8O,EAAa/U,EAAK,GAClB2D,EAAS,KAGa,iBAAfoR,GACT9O,EAAM8O,GAEN9O,EAAM8O,EAAW9O,IACb8O,EAAWpR,SACbA,EAASoR,EAAWpR,SAIpB3D,EAAK,IAAMA,EAAK,GAAG2D,SACrBA,EAAS3D,EAAK,GAAG2D,OAGnB,IAAIqR,IACFrR,OAAQA,EACRsC,IAAKA,EACLsO,YAAa,KASf,OANAxW,GAAKmQ,mBACHlF,KAAM,OACN+I,SAAU,QACV1R,KAAM2U,IAGDF,EAAUrU,MAAMzC,KAAMgC,GAAMiV,KAAK,SAASC,GAG/C,MAFAF,GAAUT,YAAcW,EAASP,OAE1BO,MAIbvB,GAMAnR,EAAgB4I,KAAOpN,KAAKmD,IAC1BE,EAAU8T,kBACZ9T,EAAU8T,iBAAiB,QAASpX,EAAKqU,EAAwB,UAAU,GAC3E/Q,EAAU8T,iBAAiB,WAAYpX,EAAK2V,KAAyB,KAGrErS,EAAU+T,YAAY,UAAWrX,EAAKqU,EAAwB,UAC9D/Q,EAAU+T,YAAY,aAAcrX,EAAK2V,MAQ7C,IAAI2B,GAAStS,EAAQsS,OACjBC,EAAsBD,GAAUA,EAAOE,KAAOF,EAAOE,IAAIC,QACzDC,GAAgBH,GAAuBvS,EAAQ2S,SAAWA,QAAQC,SACtE,IAAInT,EAAgBe,UAAYkS,EAAc,CAE5C,GAAIG,GAAgB7S,EAAQ8S,UAC5B9S,GAAQ8S,WAAa,WACnB,GAAIC,GAAc/X,EAAKuF,EAAUG,IAGjC,IAFA1F,EAAKgY,EAAkBhY,EAAKyF,EAAWsS,GAEnCF,EACF,MAAOA,GAAcnV,MAAMzC,KAAMkC,YAIrCyJ,EACE+L,QACA,YACA,SAASM,GAGP,MAAO,YACL,GAAI/P,GAAM/F,UAAUlB,OAAS,EAAIkB,UAAU,GAAKyM,MAQhD,OALI1G,IAEFlI,EAAKgY,EAAkBhY,EAAKyF,EAAWyC,EAAM,IAGxC+P,EAAcvV,MAAMzC,KAAMkC,aAGrCyT,GAIJ,GAAInR,EAAgB9C,SAAW,WAAaqD,IAAWrD,QAAQuW,IAAK,CAElE,GAAIC,GAAwB,SAAS/V,EAAKE,GACxCtC,EAAKmQ,mBACH9O,QAASe,EACTR,MAAOU,EAAKV,MACZoS,SAAU,YAId7N,IAAM,QAAS,OAAQ,OAAQ,QAAS,OAAQ,SAASD,EAAGtE,GAC1DwK,EAAkBzK,QAASC,EAAOuW,OAKxCC,EAAkB,WAGhB,IADA,GAAIC,GACGpY,KAAKmF,EAAiBnE,QAAQ,CACnCoX,EAAUpY,KAAKmF,EAAiBoL,OAEhC,IAAIpK,GAAMiS,EAAQ,GAChB/W,EAAO+W,EAAQ,GACftM,EAAOsM,EAAQ,EAEjBjS,GAAI9E,GAAQyK,IAIhBuM,EAAe,WACb,GAAItY,GAAOC,IAGXkG,GAAKlG,KAAKiF,EAAU,SAASgB,EAAGwK,GAC9B,GAAI6H,GAAY7H,EAAO,GACnBzO,EAAOyO,EAAO,EAClB6H,GAAU7V,MAAM1C,GAAOA,GAAMwY,OAAOvW,OAIxCwW,EAAW,SAASzR,GAClB,GAAI0R,GAAIpM,EAAWqM,KAAK3R,GACtB4F,KACAhM,EAAI,CAEN,KACE,KAAOA,KAAKgM,EAAIP,EAAQzL,IAAM8X,EAAE9X,IAAM,GACtC,MAAOT,GACP,KAAM,IAAIiB,GAAiB,gBAAkB4F,GAG/C,GAAI4F,EAAI2B,OAAStO,KAAK+D,EAAe4U,eACnC,KAAM,IAAIxX,GACR,iFAIJ,OAAOwL,IAGTiM,EAAkB,SAAS7K,GAEzB,GAAIyE,GAAe,KAAOzE,EAAIzF,MAAQyF,EAAI8K,KAAO,IAAM9K,EAAI8K,KAAO,GAKlE,OAHI9K,GAAI1F,WACNmK,EAAezE,EAAI1F,SAAW,IAAMmK,GAE/BA,GAGTsG,EAAyB,WAElB9Y,KAAK2E,GACR3E,KAAK6P,EAAiBpN,MAAMzC,KAAMkC,YAItC6W,EAAkB,SAASC,EAAWpM,GACpC,GAAItB,GAAStL,KAAKgQ,EAAegJ,EAAWpM,EAE5C5M,MAAKiZ,EAAc,UACjBD,UAAWA,EACXpM,QAASA,IAGX5M,KAAKkZ,EACHF,EAAU3X,KACV2X,EAAU5X,QACV4X,EAAU/Q,IACV+Q,EAAUvN,OACVH,EACAsB,IAIJuM,EAAgB,SAASH,EAAWpM,GAClC,GAAI7M,GAAOC,KACPsL,IACJ,IAAI0N,EAAUrJ,OAASqJ,EAAUrJ,MAAM3O,SACrCkF,EAAK8S,EAAUrJ,MAAO,SAAShP,EAAGgP,GAChC,GAAIyJ,GAAQrZ,EAAKsZ,EAAgB1J,EAAOqJ,EAAU/Q,IAC9CmR,IACF9N,EAAO7D,KAAK2R,KAKZxM,GAAWA,EAAQ8C,gBACrB,IAAK,GAAItJ,GAAI,EAAGA,EAAIwG,EAAQ8C,gBAAkBtJ,EAAIkF,EAAOtK,OAAQoF,IAC/DkF,EAAOlF,GAAGkT,QAAS,CAKzB,OADAhO,GAASA,EAAOrJ,MAAM,EAAGjC,KAAK+D,EAAeQ,kBAI/CgV,EAAiB,SAASH,EAAOI,GAE/B,GAAIC,IACFjO,SAAU4N,EAAMnR,IAChBwD,OAAQ2N,EAAMM,KACdhO,MAAO0N,EAAMO,OACbC,WAAUR,EAAM1K,MAAQ,IAuB1B,OAfK0K,GAAMnR,MACTwR,EAAWjO,SAAWgO,GAGxBC,EAAWH,SAGNtZ,KAAK+D,EAAeI,aAAa2L,OACjC9P,KAAK+D,EAAeI,aAAa2L,KAAK2J,EAAWjO,WAEpD,qBAAqBsE,KAAK2J,EAAW,cAErC,qBAAqB3J,KAAK2J,EAAWjO,WAGhCiO,GAGTI,EAAmB,SAAS7O,EAAM5J,EAAS0Y,EAASrO,EAAQH,EAAQsB,GAClE,GAAImN,IAAc/O,GAAQ,IAAM,MAAQ5J,GAAW,GAEnD,KACIpB,KAAK+D,EAAeC,aAAa8L,OACnC9P,KAAK+D,EAAeC,aAAa8L,KAAKiK,GAFxC,CAMA,GAAI7O,EAoBJ,IAlBII,GAAUA,EAAOtK,QACnB8Y,EAAUxO,EAAO,GAAGE,UAAYsO,EAGhCxO,EAAOtB,UACPkB,GAAcI,OAAQA,IACbwO,IACT5O,GACEI,SAEIE,SAAUsO,EACVrO,OAAQA,EACR6N,QAAQ,QAOZtZ,KAAK+D,EAAeE,WAAW6L,OACjC9P,KAAK+D,EAAeE,WAAW6L,KAAKgK,OAIlC9Z,KAAK+D,EAAeG,cAAc4L,MACnC9P,KAAK+D,EAAeG,cAAc4L,KAAKgK,IAF1C,CAMA,GAAIzX,GAAOiE,GAGP0T,WACEjP,SAEIC,KAAMA,EACNtE,MAAOtF,EACP8J,WAAYA,KAIlB+O,QAASH,GAEXlN,EAIF5M,MAAKiQ,EAAM5N,MAGb6X,EAAa,SAAS7X,GAGpB,GAAI2E,GAAMhH,KAAK+D,EAAeM,gBAI9B,IAHIhC,EAAKjB,UACPiB,EAAKjB,QAAU0F,EAASzE,EAAKjB,QAAS4F,IAEpC3E,EAAK2X,UAAW,CAClB,GAAIA,GAAY3X,EAAK2X,UAAUjP,OAAO,EACtCiP,GAAUtT,MAAQI,EAASkT,EAAUtT,MAAOM,GAG9C,GAAImT,GAAU9X,EAAK8X,OAanB,OAZIA,KACEA,EAAQlS,MACVkS,EAAQlS,IAAMnB,EAASqT,EAAQlS,IAAKjI,KAAK+D,EAAeO,eAEtD6V,EAAQC,UACVD,EAAQC,QAAUtT,EAASqT,EAAQC,QAASpa,KAAK+D,EAAeO,gBAIhEjC,EAAKgY,aAAehY,EAAKgY,YAAYtP,QACvC/K,KAAKsa,EAAiBjY,EAAKgY,aAEtBhY,GAMTkY,EAAkB,SAASF,GAQzB,IAAK,GAJHG,GACArK,EACA9N,EAHEoY,GAAY,KAAM,OAAQ,OAKrB9Z,EAAI,EAAGA,EAAI0Z,EAAYtP,OAAO/J,SAAUL,EAE/C,GADAwP,EAAQkK,EAAYtP,OAAOpK,GAExBwP,EAAMhJ,eAAe,SACrB+E,EAASiE,EAAM9N,QAChBsE,EAAawJ,EAAM9N,MAHrB,CAOAA,EAAOiE,KAAgB6J,EAAM9N,KAC7B,KAAK,GAAI+D,GAAI,EAAGA,EAAIqU,EAASzZ,SAAUoF,EACrCoU,EAAUC,EAASrU,GACf/D,EAAK8E,eAAeqT,IAAYnY,EAAKmY,KACvCnY,EAAKmY,GAAW1T,EAASzE,EAAKmY,GAAUxa,KAAK+D,EAAeO,cAGhE+V,GAAYtP,OAAOpK,GAAG0B,KAAOA,IAIjC4D,EAAc,WACZ,GAAKjG,KAAKsD,GAAkBtD,KAAKmD,EAAjC,CACA,GAAIuX,KAkBJ,OAhBI1a,MAAKsD,GAAiBC,EAAWoX,YACnCD,EAASE,SACPC,aAActO,UAAUoO,YAIxB3a,KAAKmD,IACHE,EAAUkC,UAAYlC,EAAUkC,SAASE,OAC3CiV,EAASzS,IAAM5E,EAAUkC,SAASE,MAEhCpC,EAAUyX,WACPJ,EAASE,UAASF,EAASE,YAChCF,EAASE,QAAQR,QAAU/W,EAAUyX,WAIlCJ,IAGTK,EAAe,WACb/a,KAAKgb,GAAmB,EACxBhb,KAAKib,GAAgB,MAGvBC,GAAgB,WACd,MAAOlb,MAAKgb,IAAoBrY,IAAQ3C,KAAKib,GAAgBjb,KAAKgb,IAYpEG,GAAe,SAASC,GACtB,GAAIC,GAAOrb,KAAKyD,CAEhB,UACG4X,GACDD,EAAQha,UAAYia,EAAKja,SACzBga,EAAQnB,UAAYoB,EAAKpB,WAKvBmB,EAAQlQ,YAAcmQ,EAAKnQ,WACtBD,EAAiBmQ,EAAQlQ,WAAYmQ,EAAKnQ,aACxCkQ,EAAQpB,YAAaqB,EAAKrB,WAE5BpP,EAAgBwQ,EAAQpB,UAAWqB,EAAKrB,aAMnDsB,GAAkB,SAASnB,GAEzB,IAAIna,KAAKub,KAAT,CAIA,GAAI5E,GAASwD,EAAQxD,MAKrB,IAAiB,MAAXA,GAA6B,MAAXA,GAA6B,MAAXA,EAA1C,CAEA,GAAI6E,EACJ,KAGEA,EAAQrB,EAAQsB,kBAAkB,eAClCD,EAA8B,IAAtBE,SAASF,EAAO,IACxB,MAAOtb,IAITF,KAAKgb,GAAmBQ,EAEpBA,EAEwB,EAAxBxb,KAAKgb,IAAwB,IAEjChb,KAAKib,GAAgBtY,OAGvBgZ,EAAO,SAAStZ,GACd,GAAIyK,GAAgB9M,KAAK+D,EAErB6X,GACAC,QAAS7b,KAAK6D,EACdvB,OAAQwK,EAAcxK,OACtBwZ,SAAU,cAEZpB,EAAW1a,KAAK+b,GAgDlB,IA9CIrB,IACFkB,EAASzB,QAAUO,GAIjBrY,EAAKqN,sBAAuBrN,GAAKqN,eAErCrN,EAAOiE,EAAYsV,EAAUvZ,GAG7BA,EAAK0O,KAAOzK,EAAYA,KAAgBtG,KAAK8D,EAAeiN,MAAO1O,EAAK0O,MACxE1O,EAAKE,MAAQ+D,EAAYA,KAAgBtG,KAAK8D,EAAevB,OAAQF,EAAKE,OAG1EF,EAAKE,MAAM,oBAAsBI,IAAQ3C,KAAKkF,EAE1ClF,KAAKoF,GAAgBpF,KAAKoF,EAAapE,OAAS,IAGlDqB,EAAKgY,aACHtP,UAAW9I,MAAMlB,KAAKf,KAAKoF,EAAc,KAKzCY,EAAc3D,EAAK0O,aAAc1O,GAAK0O,KAEtC/Q,KAAK8D,EAAesK,OAEtB/L,EAAK+L,KAAOpO,KAAK8D,EAAesK,MAI9BtB,EAAcsE,cAAa/O,EAAK+O,YAActE,EAAcsE,aAG5DtE,EAAcwE,UAASjP,EAAKiP,QAAUxE,EAAcwE,SAGpDxE,EAAckP,aAAY3Z,EAAK4Z,YAAcnP,EAAckP,YAE3DjZ,EAAW+J,EAAc0E,gBAC3BnP,EAAOyK,EAAc0E,aAAanP,IAASA,GAIxCA,IAAQ2D,EAAc3D,MAMzBU,EAAW+J,EAAc6E,qBACxB7E,EAAc6E,mBAAmBtP,IAOpC,MAAIrC,MAAKub,SACPvb,MAAK6M,EAAU,OAAQ,uCAAwCxK,QAIzB,gBAA7ByK,GAAcpI,WACnByE,KAAKC,SAAW0D,EAAcpI,YAChC1E,KAAKkc,GAAsB7Z,GAG7BrC,KAAKkc,GAAsB7Z,KAI/B8Z,GAAU,WACR,MAAO1T,MAGT2T,GAAuB,SAAS/Z,EAAMT,GACpC,GAAI7B,GAAOC,KACP8M,EAAgB9M,KAAK+D,CAEzB,IAAK/D,KAAKwN,UAAV,CAQA,GALAnL,EAAOrC,KAAKqc,EAAYha,IAKnBrC,KAAK+D,EAAeuY,iBAAmBtc,KAAKuc,GAAcla,GAE7D,WADArC,MAAK6M,EAAU,OAAQ,+BAAgCxK,EAOzDrC,MAAK0D,EAAerB,EAAKma,WAAana,EAAKma,SAAWxc,KAAKyc,MAG3Dzc,KAAKyD,EAAYpB,EAEjBrC,KAAK6M,EAAU,QAAS,uBAAwBxK,EAEhD,IAAIqa,IACFC,eAAgB,IAChBC,cAAe,YAAc5c,KAAKwM,QAClCqQ,WAAY7c,KAAK4D,EAGf5D,MAAKqO,IACPqO,EAAKI,cAAgB9c,KAAKqO,EAG5B,IAAI2L,GAAY3X,EAAK2X,WAAa3X,EAAK2X,UAAUjP,OAAO,EACxD/K,MAAKkQ,mBACH6D,SAAU,SACV3S,QAAS4Y,GACJA,EAAUhP,KAAOgP,EAAUhP,KAAO,KAAO,IAAMgP,EAAUtT,MAC1DrE,EAAKjB,QACTob,SAAUna,EAAKma,SACf7a,MAAOU,EAAKV,OAAS,SAGvB,IAAIsG,GAAMjI,KAAKwO,GACd1B,EAAc+E,WAAa7R,KAAK+c,IAAchc,KAAKf,MAClDiI,IAAKA,EACLyU,KAAMA,EACNra,KAAMA,EACNuK,QAASE,EACTkQ,UAAW,WACTjd,EAAK2F,IAEL3F,EAAKkZ,EAAc,WACjB5W,KAAMA,EACNuQ,IAAK3K,IAEPrG,GAAYA,KAEdqb,QAAS,SAAiBC,GACxBnd,EAAK8M,EAAU,QAAS,mCAAoCqQ,GAExDA,EAAM/C,SACRpa,EAAKod,GAAiBD,EAAM/C,SAG9Bpa,EAAKkZ,EAAc,WACjB5W,KAAMA,EACNuQ,IAAK3K,IAEPiV,EAAQA,GAAS,GAAItc,OAAM,sDAC3BgB,GAAYA,EAASsb,QAK3BE,GAAc,SAASC,GACrB,GAAIlD,GAAUpV,EAAQoR,gBAAkB,GAAIpR,GAAQoR,cACpD,IAAKgE,EAAL,CAGA,GAAImD,GAAU,mBAAqBnD,IAAqC,mBAAnBoD,eAErD,IAAKD,EAAL,CAEA,GAAIrV,GAAMoV,EAAKpV,GAEX,oBAAqBkS,GACvBA,EAAQtD,mBAAqB,WAC3B,GAA2B,IAAvBsD,EAAQzD,WAEL,GAAuB,MAAnByD,EAAQxD,OACjB0G,EAAKL,WAAaK,EAAKL,gBAClB,IAAIK,EAAKJ,QAAS,CACvB,GAAI3H,GAAM,GAAI1U,OAAM,sBAAwBuZ,EAAQxD,OACpDrB,GAAI6E,QAAUA,EACdkD,EAAKJ,QAAQ3H,MAIjB6E,EAAU,GAAIoD,gBAGdtV,EAAMA,EAAIP,QAAQ,WAAY,IAG1B2V,EAAKL,YACP7C,EAAQqD,OAASH,EAAKL,WAEpBK,EAAKJ,UACP9C,EAAQsD,QAAU,WAChB,GAAInI,GAAM,GAAI1U,OAAM,oCACpB0U,GAAI6E,QAAUA,EACdkD,EAAKJ,QAAQ3H,MAOnB6E,EAAQuD,KAAK,OAAQzV,EAAM,IAAMJ,EAAUwV,EAAKX,OAChDvC,EAAQwD,KAAKza,EAAUma,EAAKhb,UAG9Bub,EAAW,SAASjc,GACd3B,KAAKgF,EAAwBrD,IAAU3B,KAAKyM,OAE9CjK,SAASlB,UAAUmB,MAAM1B,KACvBf,KAAKgF,EAAwBrD,GAC7B3B,KAAK8E,KACF7C,MAAMlB,KAAKmB,UAAW,KAK/B2b,EAAe,SAASpX,EAAKgI,GACvBrL,EAAYqL,SACPzO,MAAK8D,EAAe2C,GAE3BzG,KAAK8D,EAAe2C,GAAOH,EAAYtG,KAAK8D,EAAe2C,OAAYgI,IAW7E,IAAI3I,GAAkBc,OAAOtF,SAgV7BrB,GAAMqB,UAAUwc,QAAU7d,EAAMqB,UAAUqP,eAC1C1Q,EAAMqB,UAAUyc,kBAAoB9d,EAAMqB,UAAU+P,WAEpD5R,EAAOD,QAAUS,IAEdc,KAAKf,KAAuB,mBAAXF,QAAyBA,OAAyB,mBAATC,MAAuBA,KAAyB,mBAAXF,QAAyBA,aACxHoB,EAAI,EAAEO,EAAI,EAAEwc,EAAI,EAAEC,EAAI,EAAEC,EAAI,IAAIC,GAAG,SAASjd,EAAQzB,EAAOD,IAC9D,SAAWM,GAOX,GAAIse,GAAmBld,EAAQ,GAG3B6D,EACgB,mBAAXlF,QACHA,OACkB,mBAAXC,GAAyBA,EAAyB,mBAATC,MAAuBA,QACzEse,EAAStZ,EAAQ9E,MAEjBA,EAAQ,GAAIme,EAQhBne,GAAMqe,WAAa,WAEjB,MADAvZ,GAAQ9E,MAAQoe,EACTpe,GAGTA,EAAMgS,YAENxS,EAAOD,QAAUS,IAEdc,KAAKf,KAAuB,mBAAXF,QAAyBA,OAAyB,mBAATC,MAAuBA,KAAyB,mBAAXF,QAAyBA,aACxH6C,EAAI,IAAIsb,GAAG,SAAS9c,EAAQzB,EAAOD,GACtC,QAAS0M,GAAStG,GAChB,MAAuB,gBAATA,IAA8B,OAATA,EAKrC,QAASqG,GAAQvF,GACf,UAAWX,SAAShF,KAAK2F,IACvB,IAAK,iBACH,OAAO,CACT,KAAK,qBACH,OAAO,CACT,KAAK,wBACH,OAAO,CACT,SACE,MAAOA,aAAiB9F,QAI9B,QAAS2d,GAAgB3c,GACvB,QAAS4P,GAAanP,EAAMS,GAC1B,GAAI0b,GAAiB5c,EAASS,IAASA,CACvC,OAAIS,GACKA,EAAS0b,IAAmBA,EAE9BA,EAGT,MAAOhN,GAGT/R,EAAOD,SACL0M,SAAUA,EACVD,QAASA,EACTsS,gBAAiBA,QAGbN,GAAG,SAAS/c,EAAQzB,EAAOD,IACjC,SAAWM,GA+BX,QAAS2e,KACP,MAAwB,mBAAbnS,WAAiD,MAArBA,SAAS/G,SAAyB,GAElE+G,SAAS/G,SAASE,KAjC3B,GAAIuG,GAAQ9K,EAAQ,GAYhB6K,GACF3H,qBAAqB,EACrBqI,OAAO,GAIL1H,EACgB,mBAAXlF,QACHA,OACkB,mBAAXC,GAAyBA,EAAyB,mBAATC,MAAuBA,QAGzE2e,KAAYzc,MACZ0c,EAAmB,IAGnBC,EAAiB,yGA+CrB7S,GAAS0B,OAAS,WAUhB,QAASC,GAAUmR,GACjBC,IACAC,EAAStX,KAAKoX,GAOhB,QAASG,GAAYH,GACnB,IAAK,GAAIle,GAAIoe,EAAS/d,OAAS,EAAGL,GAAK,IAAKA,EACtCoe,EAASpe,KAAOke,GAClBE,EAASE,OAAOte,EAAG,GAQzB,QAASue,KACPC,IACAJ,KAOF,QAASK,GAAezP,EAAO0P,GAC7B,GAAIrF,GAAY,IAChB,KAAIqF,GAAkBtT,EAAS3H,oBAA/B,CAGA,IAAK,GAAIzD,KAAKoe,GACZ,GAAIA,EAAS5X,eAAexG,GAC1B,IACEoe,EAASpe,GAAG8B,MAAM,MAAOkN,GAAO4I,OAAOmG,EAAO3d,KAAKmB,UAAW,KAC9D,MAAOod,GACPtF,EAAYsF,EAKlB,GAAItF,EACF,KAAMA,IAiBV,QAASuF,GAAsBne,EAAS6G,EAAKuX,EAAQC,EAAOjQ,GAC1D,GAAIG,GAAQ,IAEZ,IAAI+P,EACF3T,EAAS6D,kBAAkB+P,oCACzBD,EACAzX,EACAuX,EACApe,GAEFwe,QACK,IAAIpQ,GAAMxD,EAAMC,QAAQuD,GAM7BG,EAAQ5D,EAAS6D,kBAAkBJ,GACnC4P,EAAezP,GAAO,OACjB,CACL,GAQIkQ,GARAta,GACF0C,IAAKA,EACLyR,KAAM8F,EACN7F,OAAQ8F,GAGNpe,EAAOsN,OACPxM,EAAMf,CAEV,IAAkC,uBAA3B2E,SAAShF,KAAKK,GAAgC,CACnD,GAAIye,GAASze,EAAQ8G,MAAM0W,EACvBiB,KACFxe,EAAOwe,EAAO,GACd1d,EAAM0d,EAAO,IAIjBta,EAASmJ,KAAOiQ,EAEhBhP,GACEtO,KAAMA,EACND,QAASe,EACT8F,IAAKwW,IACL9O,OAAQpK,IAEV6Z,EAAezP,GAAO,GAGxB,QAAImQ,GACKA,EAAmBrd,MAAMzC,KAAMkC,WAM1C,QAAS4c,KACHiB,IAGJD,EAAqB/a,EAAQ0Y,QAC7B1Y,EAAQ0Y,QAAU8B,EAClBQ,GAA2B,GAG7B,QAASZ,KACFY,IAGLhb,EAAQ0Y,QAAUqC,EAClBC,GAA2B,EAC3BD,EAAqBnR,QAGvB,QAASiR,KACP,GAAII,GAAsBN,EACxBO,EAAYC,CACdA,GAAW,KACXR,EAAqB,KACrB5N,EAAgB,KAChBsN,EAAe3c,MAAM,MAAOud,GAAqB,GAAOzH,OAAO0H,IAUjE,QAASxS,GAAO+B,EAAI2Q,GAClB,GAAIne,GAAO0c,EAAO3d,KAAKmB,UAAW,EAClC,IAAIwd,EAAoB,CACtB,GAAI5N,IAAkBtC,EACpB,MAEAoQ,KAIJ,GAAIjQ,GAAQ5D,EAAS6D,kBAAkBJ,EAevC,IAdAkQ,EAAqB/P,EACrBmC,EAAgBtC,EAChB0Q,EAAWle,EAMXiR,WAAW,WACLnB,IAAkBtC,GACpBoQ,KAEDjQ,EAAMyQ,WAAa,IAAO,GAEzBD,KAAY,EACd,KAAM3Q,GA1LV,GA0DIsQ,GAAoBC,EA1DpBhB,KACFmB,EAAW,KACXpO,EAAgB,KAChB4N,EAAqB,IA8LvB,OAHAjS,GAAOC,UAAYA,EACnBD,EAAOuR,YAAcA,EACrBvR,EAAO6B,UAAY4P,EACZzR,KAsDT1B,EAAS6D,kBAAoB,WA4C3B,QAASyQ,GAA+B7Q,GACtC,GAAwB,mBAAbA,GAAGG,OAA0BH,EAAGG,MAA3C,CAeA,IAAK,GALH2Q,GACAC,EACAC,EAVEnJ,EAAS,8HACXoJ,EAAQ,kIACRC,EAAQ,gHAERC,EAAY,gDACZC,EAAa,gCACbC,EAAQrR,EAAGG,MAAMpF,MAAM,MACvBoF,KAMOhP,GAFK,sBAAsB+X,KAAKlJ,EAAGpO,SAE/B,GAAGgF,EAAIya,EAAM7f,OAAQL,EAAIyF,IAAKzF,EAAG,CAC5C,GAAK4f,EAAQlJ,EAAOqB,KAAKmI,EAAMlgB,IAAM,CACnC,GAAImgB,GAAWP,EAAM,IAAqC,IAA/BA,EAAM,GAAGlK,QAAQ,UACxC0K,EAASR,EAAM,IAAmC,IAA7BA,EAAM,GAAGlK,QAAQ,OACtC0K,KAAWT,EAAWM,EAAWlI,KAAK6H,EAAM,OAE9CA,EAAM,GAAKD,EAAS,GACpBC,EAAM,GAAKD,EAAS,GACpBC,EAAM,GAAKD,EAAS,IAEtBE,GACEvY,IAAM6Y,EAAsB,KAAXP,EAAM,GACvB7R,KAAM6R,EAAM,IAAM5B,EAClB3c,KAAM8e,GAAYP,EAAM,OACxB7G,KAAM6G,EAAM,IAAMA,EAAM,GAAK,KAC7B5G,OAAQ4G,EAAM,IAAMA,EAAM,GAAK,UAE5B,IAAKA,EAAQG,EAAMhI,KAAKmI,EAAMlgB,IACnC6f,GACEvY,IAAKsY,EAAM,GACX7R,KAAM6R,EAAM,IAAM5B,EAClB3c,QACA0X,MAAO6G,EAAM,GACb5G,OAAQ4G,EAAM,IAAMA,EAAM,GAAK,UAE5B,CAAA,KAAKA,EAAQE,EAAM/H,KAAKmI,EAAMlgB,KAsBnC,QArBA,IAAIogB,GAASR,EAAM,IAAMA,EAAM,GAAGlK,QAAQ,aACtC0K,KAAWT,EAAWK,EAAUjI,KAAK6H,EAAM,MAE7CA,EAAM,GAAKD,EAAS,GACpBC,EAAM,GAAKD,EAAS,GACpBC,EAAM,GAAK,MACI,IAAN5f,GAAY4f,EAAM,IAAiC,mBAApB/Q,GAAGwR,eAK3CrR,EAAM,GAAGgK,OAASnK,EAAGwR,aAAe,GAEtCR,GACEvY,IAAKsY,EAAM,GACX7R,KAAM6R,EAAM,IAAM5B,EAClB3c,KAAMue,EAAM,GAAKA,EAAM,GAAGhW,MAAM,QAChCmP,KAAM6G,EAAM,IAAMA,EAAM,GAAK,KAC7B5G,OAAQ4G,EAAM,IAAMA,EAAM,GAAK,OAM9BC,EAAQ9R,MAAQ8R,EAAQ9G,OAC3B8G,EAAQ9R,KAAOiQ,GAGjBhP,EAAMlI,KAAK+Y,GAGb,MAAK7Q,GAAM3O,QAKTK,KAAMmO,EAAGnO,KACTD,QAASoO,EAAGpO,QACZ6G,IAAKwW,IACL9O,MAAOA,GAPA,MAwBX,QAASgQ,GAAoC3G,EAAW/Q,EAAKuX,EAAQpe,GACnE,GAAI6f,IACFhZ,IAAKA,EACLyR,KAAM8F,EAGR,IAAIyB,EAAQhZ,KAAOgZ,EAAQvH,KAAM,CAO/B,GANAV,EAAUoH,YAAa,EAElBa,EAAQvS,OACXuS,EAAQvS,KAAOiQ,GAGb3F,EAAUrJ,MAAM3O,OAAS,GACvBgY,EAAUrJ,MAAM,GAAG1H,MAAQgZ,EAAQhZ,IAAK,CAC1C,GAAI+Q,EAAUrJ,MAAM,GAAG+J,OAASuH,EAAQvH,KACtC,OAAO,CACF,KACJV,EAAUrJ,MAAM,GAAG+J,MACpBV,EAAUrJ,MAAM,GAAGjB,OAASuS,EAAQvS,KAGpC,MADAsK,GAAUrJ,MAAM,GAAG+J,KAAOuH,EAAQvH,MAC3B,EAOb,MAFAV,GAAUrJ,MAAMuR,QAAQD,GACxBjI,EAAUmI,SAAU,GACb,EAKT,MAHEnI,GAAUoH,YAAa,GAGlB,EAYT,QAASgB,GAAsC5R,EAAI6R,GASjD,IACE,GALAd,GACAe,EALEC,EAAe,qEACjB5R,KACA6R,KACAC,GAAY,EAMRC,EAAON,EAAsCO,OACjDD,IAASD,EACTC,EAAOA,EAAKC,OAEZ,GAAID,IAAS9R,GAAqB8R,IAAS3V,EAAS0B,OAApD,CAkBA,GAbA6T,GACErZ,IAAK,KACLyG,KAAMiQ,EACNjF,KAAM,KACNC,OAAQ,MAGN+H,EAAKrgB,KACPigB,EAAK5S,KAAOgT,EAAKrgB,MACPkf,EAAQgB,EAAa7I,KAAKgJ,EAAK3b,eACzCub,EAAK5S,KAAO6R,EAAM,IAGK,mBAAde,GAAK5S,KACd,IACE4S,EAAK5S,KAAO6R,EAAMqB,MAAMC,UAAU,EAAGtB,EAAMqB,MAAMvL,QAAQ,MACzD,MAAOnW,IAGPshB,EAAM,GAAKE,GACbD,GAAY,EAEZD,EAAM,GAAKE,IAAQ,EAGrB/R,EAAMlI,KAAK6Z,GAGTD,GAGF1R,EAAMsP,OAAO,EAAGoC,EAGlB,IAAI/Q,IACFjP,KAAMmO,EAAGnO,KACTD,QAASoO,EAAGpO,QACZ6G,IAAKwW,IACL9O,MAAOA,EAQT,OANAgQ,GACErP,EACAd,EAAGsS,WAAatS,EAAGuS,SACnBvS,EAAGkK,MAAQlK,EAAGwS,WACdxS,EAAGpO,SAAWoO,EAAGyS,aAEZ3R,EAQT,QAASV,GAAkBJ,EAAI6R,GAC7B,GAAI1R,GAAQ,IACZ0R,GAAiB,MAATA,EAAgB,GAAKA,CAE7B,KAEE,GADA1R,EAAQ0Q,EAA+B7Q,GAErC,MAAOG,GAET,MAAOzP,GACP,GAAI6L,EAASU,MACX,KAAMvM,GAIV,IAEE,GADAyP,EAAQyR,EAAsC5R,EAAI6R,EAAQ,GAExD,MAAO1R,GAET,MAAOzP,GACP,GAAI6L,EAASU,MACX,KAAMvM,GAGV,OACEmB,KAAMmO,EAAGnO,KACTD,QAASoO,EAAGpO,QACZ6G,IAAKwW,KAOT,MAHA7O,GAAkB+P,oCAAsCA,EACxD/P,EAAkByQ,+BAAiCA,EAE5CzQ,KAGTnQ,EAAOD,QAAUuM,IAEdhL,KAAKf,KAAuB,mBAAXF,QAAyBA,OAAyB,mBAATC,MAAuBA,KAAyB,mBAAXF,QAAyBA,aACxHme,EAAI,IAAIE,GAAG,SAAShd,EAAQzB,EAAOD,GAetC,QAAS6W,GAAQ6L,EAAUC,GACzB,IAAK,GAAIxhB,GAAI,EAAGA,EAAIuhB,EAASlhB,SAAUL,EACrC,GAAIuhB,EAASvhB,KAAOwhB,EAAQ,MAAOxhB,EAErC,UAGF,QAASuC,GAAUiD,EAAKic,EAAUC,EAAQC,GACxC,MAAOrf,MAAKC,UAAUiD,EAAKoc,EAAWH,EAAUE,GAAgBD,GAIlE,QAASG,GAAe9b,GACtB,GAAI4O,IAEF3F,MAAOjJ,EAAMiJ,MACbvO,QAASsF,EAAMtF,QACfC,KAAMqF,EAAMrF,KAGd,KAAK,GAAIV,KAAK+F,GACRE,OAAOtF,UAAU6F,eAAepG,KAAK2F,EAAO/F,KAC9C2U,EAAI3U,GAAK+F,EAAM/F,GAInB,OAAO2U,GAGT,QAASiN,GAAWH,EAAUE,GAC5B,GAAI3S,MACA8S,IAWJ,OATqB,OAAjBH,IACFA,EAAgB,SAAS7b,EAAKC,GAC5B,MAAIiJ,GAAM,KAAOjJ,EACR,eAEF,eAAiB+b,EAAKxgB,MAAM,EAAGoU,EAAQ1G,EAAOjJ,IAAQtE,KAAK,KAAO,MAItE,SAASqE,EAAKC,GACnB,GAAIiJ,EAAM3O,OAAS,EAAG,CACpB,GAAI0hB,GAAUrM,EAAQ1G,EAAO3P,OAC5B0iB,EAAU/S,EAAMsP,OAAOyD,EAAU,GAAK/S,EAAMlI,KAAKzH,OACjD0iB,EAAUD,EAAKxD,OAAOyD,EAASC,EAAAA,EAAUlc,GAAOgc,EAAKhb,KAAKhB,IAEtD4P,EAAQ1G,EAAOjJ,KAClBA,EAAQ4b,EAAcvhB,KAAKf,KAAMyG,EAAKC,QAGxCiJ,GAAMlI,KAAKf,EAGb,OAAmB,OAAZ0b,EACH1b,YAAiB9F,OAAQ4hB,EAAe9b,GAASA,EACjD0b,EAASrhB,KAAKf,KAAMyG,EAAKC,IA5DjClH,EAAUC,EAAOD,QAAU0D,EAC3B1D,EAAQojB,aAAeL,YA+DZ,IAAI","file":"raven.min.js"} \ No newline at end of file diff --git a/dist/sri.json b/dist/sri.json index 75f046a98aa8..f610ab8f8230 100644 --- a/dist/sri.json +++ b/dist/sri.json @@ -1,20 +1,20 @@ { "@dist/raven.js": { "hashes": { - "sha256": "uz9eR4ySSk3xSoQY0l0r/b8aFu8cLppxENUjUyvOpDk=", - "sha512": "F1AlfFsiuzZJ5cYCVB07pzcGXF5EsP/vI+qKv4PpdaSVGjRvibz1T4Wp3VP2QARSWHGWvYg96QQn4SWoOmCprw==" + "sha256": "WO3GuSzH9fxij7uo2mN5d1jn6Nz18zYA2gIEZeS0BOs=", + "sha512": "Rv6p5xvYLjr1dgjAXSb9vVMHVrgJeGCRfpKZqo/S4FRftAOqpu3X7FAVB2h9wC9sk3SCSmOZa+TDc2axofPgGg==" }, "type": null, - "integrity": "sha256-uz9eR4ySSk3xSoQY0l0r/b8aFu8cLppxENUjUyvOpDk= sha512-F1AlfFsiuzZJ5cYCVB07pzcGXF5EsP/vI+qKv4PpdaSVGjRvibz1T4Wp3VP2QARSWHGWvYg96QQn4SWoOmCprw==", + "integrity": "sha256-WO3GuSzH9fxij7uo2mN5d1jn6Nz18zYA2gIEZeS0BOs= sha512-Rv6p5xvYLjr1dgjAXSb9vVMHVrgJeGCRfpKZqo/S4FRftAOqpu3X7FAVB2h9wC9sk3SCSmOZa+TDc2axofPgGg==", "path": "dist/raven.js" }, "@dist/raven.min.js": { "hashes": { - "sha256": "wgk7KqIUZXtAix1eFIrX0lJMrrWMNBfqXDelERqscTY=", - "sha512": "9CVtq9zK5kebkOkXRj/UTYdpQrUogxRYlTWweSXNglJ5XEnQ9JfL/RC6/nqxDC3SFdZtnGqWXyEkQN1vzFa5FA==" + "sha256": "70q93zrP4Zr0F6qxLZioyW91aNaKfNGwQQavob94AXY=", + "sha512": "3qQVNk/cOwGZDHwH9sqdxScio1jA8bHP0cnZ1cZdDBLD6dkXXqei6VsEvf8g7ROF+TX9l/zhT0HY2zSnPWiKRg==" }, "type": null, - "integrity": "sha256-wgk7KqIUZXtAix1eFIrX0lJMrrWMNBfqXDelERqscTY= sha512-9CVtq9zK5kebkOkXRj/UTYdpQrUogxRYlTWweSXNglJ5XEnQ9JfL/RC6/nqxDC3SFdZtnGqWXyEkQN1vzFa5FA==", + "integrity": "sha256-70q93zrP4Zr0F6qxLZioyW91aNaKfNGwQQavob94AXY= sha512-3qQVNk/cOwGZDHwH9sqdxScio1jA8bHP0cnZ1cZdDBLD6dkXXqei6VsEvf8g7ROF+TX9l/zhT0HY2zSnPWiKRg==", "path": "dist/raven.min.js" } } \ No newline at end of file diff --git a/docs/sentry-doc-config.json b/docs/sentry-doc-config.json index 123036a9989a..bb2178ef5551 100644 --- a/docs/sentry-doc-config.json +++ b/docs/sentry-doc-config.json @@ -66,6 +66,6 @@ } }, "vars": { - "RAVEN_VERSION": "3.17.0" + "RAVEN_VERSION": "3.18.0" } } diff --git a/package.json b/package.json index 5ec424153b1b..3e477944ca99 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "raven", "sentry" ], - "version": "3.17.0", + "version": "3.18.0", "repository": "git://github.com/getsentry/raven-js.git", "license": "BSD-2-Clause", "homepage": "https://github.com/getsentry/raven-js", diff --git a/src/raven.js b/src/raven.js index 9aeb8c84c703..3efa2fff5553 100644 --- a/src/raven.js +++ b/src/raven.js @@ -98,7 +98,7 @@ Raven.prototype = { // webpack (using a build step causes webpack #1617). Grunt verifies that // this value matches package.json during build. // See: https://github.com/getsentry/raven-js/issues/465 - VERSION: '3.17.0', + VERSION: '3.18.0', debug: false, diff --git a/test/raven.test.js b/test/raven.test.js index db143e87d05a..0ca6bdcb3665 100644 --- a/test/raven.test.js +++ b/test/raven.test.js @@ -1230,7 +1230,7 @@ describe('globals', function() { extra: {'session:duration': 100} }); assert.deepEqual(opts.auth, { - sentry_client: 'raven-js/3.17.0', + sentry_client: 'raven-js/3.18.0', sentry_key: 'abc', sentry_version: '7' });