HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/reiskick.komma.nl/wwwroot/js/app.js
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["/js/app"],{

/***/ "./node_modules/@sentry/browser/esm/backend.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/backend.js ***!
  \*****************************************************/
/*! exports provided: BrowserBackend */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserBackend", function() { return BrowserBackend; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _eventbuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./eventbuilder */ "./node_modules/@sentry/browser/esm/eventbuilder.js");
/* harmony import */ var _transports__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transports */ "./node_modules/@sentry/browser/esm/transports/index.js");






/**
 * The Sentry Browser SDK Backend.
 * @hidden
 */
var BrowserBackend = /** @class */ (function (_super) {
    tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BrowserBackend, _super);
    function BrowserBackend() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * @inheritDoc
     */
    BrowserBackend.prototype._setupTransport = function () {
        if (!this._options.dsn) {
            // We return the noop transport here in case there is no Dsn.
            return _super.prototype._setupTransport.call(this);
        }
        var transportOptions = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._options.transportOptions, { dsn: this._options.dsn });
        if (this._options.transport) {
            return new this._options.transport(transportOptions);
        }
        if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["supportsFetch"])()) {
            return new _transports__WEBPACK_IMPORTED_MODULE_5__["FetchTransport"](transportOptions);
        }
        return new _transports__WEBPACK_IMPORTED_MODULE_5__["XHRTransport"](transportOptions);
    };
    /**
     * @inheritDoc
     */
    BrowserBackend.prototype.eventFromException = function (exception, hint) {
        var syntheticException = (hint && hint.syntheticException) || undefined;
        var event = Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromUnknownInput"])(exception, syntheticException, {
            attachStacktrace: this._options.attachStacktrace,
        });
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addExceptionMechanism"])(event, {
            handled: true,
            type: 'generic',
        });
        event.level = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Error;
        if (hint && hint.event_id) {
            event.event_id = hint.event_id;
        }
        return _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"].resolve(event);
    };
    /**
     * @inheritDoc
     */
    BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {
        if (level === void 0) { level = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Info; }
        var syntheticException = (hint && hint.syntheticException) || undefined;
        var event = Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromString"])(message, syntheticException, {
            attachStacktrace: this._options.attachStacktrace,
        });
        event.level = level;
        if (hint && hint.event_id) {
            event.event_id = hint.event_id;
        }
        return _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"].resolve(event);
    };
    return BrowserBackend;
}(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["BaseBackend"]));

//# sourceMappingURL=backend.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/client.js":
/*!****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/client.js ***!
  \****************************************************/
/*! exports provided: BrowserClient */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserClient", function() { return BrowserClient; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend */ "./node_modules/@sentry/browser/esm/backend.js");
/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/browser/esm/integrations/index.js");
/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version */ "./node_modules/@sentry/browser/esm/version.js");






/**
 * The Sentry Browser SDK Client.
 *
 * @see BrowserOptions for documentation on configuration options.
 * @see SentryClient for usage documentation.
 */
var BrowserClient = /** @class */ (function (_super) {
    tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BrowserClient, _super);
    /**
     * Creates a new Browser SDK instance.
     *
     * @param options Configuration options for this SDK.
     */
    function BrowserClient(options) {
        if (options === void 0) { options = {}; }
        return _super.call(this, _backend__WEBPACK_IMPORTED_MODULE_3__["BrowserBackend"], options) || this;
    }
    /**
     * @inheritDoc
     */
    BrowserClient.prototype._prepareEvent = function (event, scope, hint) {
        event.platform = event.platform || 'javascript';
        event.sdk = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event.sdk, { name: _version__WEBPACK_IMPORTED_MODULE_5__["SDK_NAME"], packages: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](((event.sdk && event.sdk.packages) || []), [
                {
                    name: 'npm:@sentry/browser',
                    version: _version__WEBPACK_IMPORTED_MODULE_5__["SDK_VERSION"],
                },
            ]), version: _version__WEBPACK_IMPORTED_MODULE_5__["SDK_VERSION"] });
        return _super.prototype._prepareEvent.call(this, event, scope, hint);
    };
    /**
     * @inheritDoc
     */
    BrowserClient.prototype._sendEvent = function (event) {
        var integration = this.getIntegration(_integrations__WEBPACK_IMPORTED_MODULE_4__["Breadcrumbs"]);
        if (integration) {
            integration.addSentryBreadcrumb(event);
        }
        _super.prototype._sendEvent.call(this, event);
    };
    /**
     * Show a report dialog to the user to send feedback to a specific event.
     *
     * @param options Set individual options for the dialog
     */
    BrowserClient.prototype.showReportDialog = function (options) {
        if (options === void 0) { options = {}; }
        // doesn't work without a document (React Native)
        var document = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getGlobalObject"])().document;
        if (!document) {
            return;
        }
        if (!this._isEnabled()) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Trying to call showReportDialog with Sentry Client is disabled');
            return;
        }
        var dsn = options.dsn || this.getDsn();
        if (!options.eventId) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Missing `eventId` option in showReportDialog call');
            return;
        }
        if (!dsn) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Missing `Dsn` option in showReportDialog call');
            return;
        }
        var script = document.createElement('script');
        script.async = true;
        script.src = new _sentry_core__WEBPACK_IMPORTED_MODULE_1__["API"](dsn).getReportDialogEndpoint(options);
        if (options.onLoad) {
            script.onload = options.onLoad;
        }
        (document.head || document.body).appendChild(script);
    };
    return BrowserClient;
}(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["BaseClient"]));

//# sourceMappingURL=client.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/eventbuilder.js":
/*!**********************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/eventbuilder.js ***!
  \**********************************************************/
/*! exports provided: eventFromUnknownInput, eventFromString */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromUnknownInput", function() { return eventFromUnknownInput; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromString", function() { return eventFromString; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _parsers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parsers */ "./node_modules/@sentry/browser/esm/parsers.js");
/* harmony import */ var _tracekit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tracekit */ "./node_modules/@sentry/browser/esm/tracekit.js");



/** JSDoc */
function eventFromUnknownInput(exception, syntheticException, options) {
    if (options === void 0) { options = {}; }
    var event;
    if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isErrorEvent"])(exception) && exception.error) {
        // If it is an ErrorEvent with `error` property, extract it to get actual Error
        var errorEvent = exception;
        exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment
        event = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["eventFromStacktrace"])(Object(_tracekit__WEBPACK_IMPORTED_MODULE_2__["computeStackTrace"])(exception));
        return event;
    }
    if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isDOMError"])(exception) || Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isDOMException"])(exception)) {
        // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)
        // then we just extract the name and message, as they don't provide anything else
        // https://developer.mozilla.org/en-US/docs/Web/API/DOMError
        // https://developer.mozilla.org/en-US/docs/Web/API/DOMException
        var domException = exception;
        var name_1 = domException.name || (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isDOMError"])(domException) ? 'DOMError' : 'DOMException');
        var message = domException.message ? name_1 + ": " + domException.message : name_1;
        event = eventFromString(message, syntheticException, options);
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionTypeValue"])(event, message);
        return event;
    }
    if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isError"])(exception)) {
        // we have a real Error object, do nothing
        event = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["eventFromStacktrace"])(Object(_tracekit__WEBPACK_IMPORTED_MODULE_2__["computeStackTrace"])(exception));
        return event;
    }
    if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isPlainObject"])(exception) || Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isEvent"])(exception)) {
        // If it is plain Object or Event, serialize it manually and extract options
        // This will allow us to group events based on top-level keys
        // which is much better than creating new group when any key/value change
        var objectException = exception;
        event = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["eventFromPlainObject"])(objectException, syntheticException, options.rejection);
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionMechanism"])(event, {
            synthetic: true,
        });
        return event;
    }
    // If none of previous checks were valid, then it means that it's not:
    // - an instance of DOMError
    // - an instance of DOMException
    // - an instance of Event
    // - an instance of Error
    // - a valid ErrorEvent (one with an error property)
    // - a plain Object
    //
    // So bail out and capture it as a simple message:
    event = eventFromString(exception, syntheticException, options);
    Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionTypeValue"])(event, "" + exception, undefined);
    Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionMechanism"])(event, {
        synthetic: true,
    });
    return event;
}
// this._options.attachStacktrace
/** JSDoc */
function eventFromString(input, syntheticException, options) {
    if (options === void 0) { options = {}; }
    var event = {
        message: input,
    };
    if (options.attachStacktrace && syntheticException) {
        var stacktrace = Object(_tracekit__WEBPACK_IMPORTED_MODULE_2__["computeStackTrace"])(syntheticException);
        var frames_1 = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["prepareFramesForEvent"])(stacktrace.stack);
        event.stacktrace = {
            frames: frames_1,
        };
    }
    return event;
}
//# sourceMappingURL=eventbuilder.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/exports.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/exports.js ***!
  \*****************************************************/
/*! exports provided: Severity, Status, addGlobalEventProcessor, addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, getHubFromCarrier, getCurrentHub, Hub, makeMain, Scope, startTransaction, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, BrowserClient, defaultIntegrations, forceLoad, init, lastEventId, onLoad, showReportDialog, flush, close, wrap, SDK_NAME, SDK_VERSION */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return _sentry_types__WEBPACK_IMPORTED_MODULE_0__["Severity"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return _sentry_types__WEBPACK_IMPORTED_MODULE_0__["Status"]; });

/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["addBreadcrumb"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureException"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureMessage"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["configureScope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "makeMain", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["makeMain"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["Scope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["startTransaction"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setContext"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setExtra"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setExtras"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setTag"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setTags"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setUser"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["withScope"]; });

/* harmony import */ var _client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./client */ "./node_modules/@sentry/browser/esm/client.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrowserClient", function() { return _client__WEBPACK_IMPORTED_MODULE_2__["BrowserClient"]; });

/* harmony import */ var _sdk__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdk */ "./node_modules/@sentry/browser/esm/sdk.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIntegrations", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["defaultIntegrations"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceLoad", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["forceLoad"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "init", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["init"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lastEventId", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["lastEventId"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onLoad", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["onLoad"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "showReportDialog", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["showReportDialog"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flush", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["flush"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "close", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["close"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["wrap"]; });

/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./version */ "./node_modules/@sentry/browser/esm/version.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_NAME", function() { return _version__WEBPACK_IMPORTED_MODULE_4__["SDK_NAME"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_VERSION", function() { return _version__WEBPACK_IMPORTED_MODULE_4__["SDK_VERSION"]; });






//# sourceMappingURL=exports.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/helpers.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/helpers.js ***!
  \*****************************************************/
/*! exports provided: shouldIgnoreOnError, ignoreNextOnError, wrap */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shouldIgnoreOnError", function() { return shouldIgnoreOnError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreNextOnError", function() { return ignoreNextOnError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return wrap; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");



var ignoreOnError = 0;
/**
 * @hidden
 */
function shouldIgnoreOnError() {
    return ignoreOnError > 0;
}
/**
 * @hidden
 */
function ignoreNextOnError() {
    // onerror should trigger before setTimeout
    ignoreOnError += 1;
    setTimeout(function () {
        ignoreOnError -= 1;
    });
}
/**
 * Instruments the given function and sends an event to Sentry every time the
 * function throws an exception.
 *
 * @param fn A function to wrap.
 * @returns The wrapped function.
 * @hidden
 */
function wrap(fn, options, before) {
    if (options === void 0) { options = {}; }
    // tslint:disable-next-line:strict-type-predicates
    if (typeof fn !== 'function') {
        return fn;
    }
    try {
        // We don't wanna wrap it twice
        if (fn.__sentry__) {
            return fn;
        }
        // If this has already been wrapped in the past, return that wrapped function
        if (fn.__sentry_wrapped__) {
            return fn.__sentry_wrapped__;
        }
    }
    catch (e) {
        // Just accessing custom props in some Selenium environments
        // can cause a "Permission denied" exception (see raven-js#495).
        // Bail on wrapping and return the function as-is (defers to window.onerror).
        return fn;
    }
    var sentryWrapped = function () {
        var args = Array.prototype.slice.call(arguments);
        // tslint:disable:no-unsafe-any
        try {
            // tslint:disable-next-line:strict-type-predicates
            if (before && typeof before === 'function') {
                before.apply(this, arguments);
            }
            var wrappedArguments = args.map(function (arg) { return wrap(arg, options); });
            if (fn.handleEvent) {
                // Attempt to invoke user-land function
                // NOTE: If you are a Sentry user, and you are seeing this stack frame, it
                //       means the sentry.javascript SDK caught an error invoking your application code. This
                //       is expected behavior and NOT indicative of a bug with sentry.javascript.
                return fn.handleEvent.apply(this, wrappedArguments);
            }
            // Attempt to invoke user-land function
            // NOTE: If you are a Sentry user, and you are seeing this stack frame, it
            //       means the sentry.javascript SDK caught an error invoking your application code. This
            //       is expected behavior and NOT indicative of a bug with sentry.javascript.
            return fn.apply(this, wrappedArguments);
            // tslint:enable:no-unsafe-any
        }
        catch (ex) {
            ignoreNextOnError();
            Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["withScope"])(function (scope) {
                scope.addEventProcessor(function (event) {
                    var processedEvent = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event);
                    if (options.mechanism) {
                        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["addExceptionTypeValue"])(processedEvent, undefined, undefined);
                        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["addExceptionMechanism"])(processedEvent, options.mechanism);
                    }
                    processedEvent.extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, processedEvent.extra, { arguments: args });
                    return processedEvent;
                });
                Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureException"])(ex);
            });
            throw ex;
        }
    };
    // Accessing some objects may throw
    // ref: https://github.com/getsentry/sentry-javascript/issues/1168
    try {
        for (var property in fn) {
            if (Object.prototype.hasOwnProperty.call(fn, property)) {
                sentryWrapped[property] = fn[property];
            }
        }
    }
    catch (_oO) { } // tslint:disable-line:no-empty
    fn.prototype = fn.prototype || {};
    sentryWrapped.prototype = fn.prototype;
    Object.defineProperty(fn, '__sentry_wrapped__', {
        enumerable: false,
        value: sentryWrapped,
    });
    // Signal that this function has been wrapped/filled already
    // for both debugging and to prevent it to being wrapped/filled twice
    Object.defineProperties(sentryWrapped, {
        __sentry__: {
            enumerable: false,
            value: true,
        },
        __sentry_original__: {
            enumerable: false,
            value: fn,
        },
    });
    // Restore original function name (not all browsers allow that)
    try {
        var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');
        if (descriptor.configurable) {
            Object.defineProperty(sentryWrapped, 'name', {
                get: function () {
                    return fn.name;
                },
            });
        }
    }
    catch (_oO) {
        /*no-empty*/
    }
    return sentryWrapped;
}
//# sourceMappingURL=helpers.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/index.js":
/*!***************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/index.js ***!
  \***************************************************/
/*! exports provided: Severity, Status, addGlobalEventProcessor, addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, getHubFromCarrier, getCurrentHub, Hub, makeMain, Scope, startTransaction, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, BrowserClient, defaultIntegrations, forceLoad, init, lastEventId, onLoad, showReportDialog, flush, close, wrap, SDK_NAME, SDK_VERSION, Integrations, Transports */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Integrations", function() { return INTEGRATIONS; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _exports__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./exports */ "./node_modules/@sentry/browser/esm/exports.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Severity"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Status"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["addBreadcrumb"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["captureException"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["captureEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["captureMessage"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["configureScope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "makeMain", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["makeMain"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Scope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["startTransaction"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setContext"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setExtra"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setExtras"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setTag"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setTags"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setUser"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["withScope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrowserClient", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["BrowserClient"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIntegrations", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["defaultIntegrations"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceLoad", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["forceLoad"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "init", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["init"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lastEventId", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["lastEventId"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onLoad", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["onLoad"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "showReportDialog", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["showReportDialog"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flush", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["flush"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "close", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["close"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["wrap"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_NAME", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["SDK_NAME"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_VERSION", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["SDK_VERSION"]; });

/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/browser/esm/integrations/index.js");
/* harmony import */ var _transports__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transports */ "./node_modules/@sentry/browser/esm/transports/index.js");
/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "Transports", function() { return _transports__WEBPACK_IMPORTED_MODULE_5__; });






var windowIntegrations = {};
// This block is needed to add compatibility with the integrations packages when used with a CDN
// tslint:disable: no-unsafe-any
var _window = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
if (_window.Sentry && _window.Sentry.Integrations) {
    windowIntegrations = _window.Sentry.Integrations;
}
// tslint:enable: no-unsafe-any
var INTEGRATIONS = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, windowIntegrations, _sentry_core__WEBPACK_IMPORTED_MODULE_2__["Integrations"], _integrations__WEBPACK_IMPORTED_MODULE_4__);

//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js":
/*!**********************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js ***!
  \**********************************************************************/
/*! exports provided: Breadcrumbs */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Breadcrumbs", function() { return Breadcrumbs; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");




/**
 * Default Breadcrumbs instrumentations
 * TODO: Deprecated - with v6, this will be renamed to `Instrument`
 */
var Breadcrumbs = /** @class */ (function () {
    /**
     * @inheritDoc
     */
    function Breadcrumbs(options) {
        /**
         * @inheritDoc
         */
        this.name = Breadcrumbs.id;
        this._options = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options);
    }
    /**
     * Create a breadcrumb of `sentry` from the events themselves
     */
    Breadcrumbs.prototype.addSentryBreadcrumb = function (event) {
        if (!this._options.sentry) {
            return;
        }
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
            category: "sentry." + (event.type === 'transaction' ? 'transaction' : 'event'),
            event_id: event.event_id,
            level: event.level,
            message: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getEventDescription"])(event),
        }, {
            event: event,
        });
    };
    /**
     * Creates breadcrumbs from console API calls
     */
    Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {
        var breadcrumb = {
            category: 'console',
            data: {
                arguments: handlerData.args,
                logger: 'console',
            },
            level: _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].fromString(handlerData.level),
            message: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["safeJoin"])(handlerData.args, ' '),
        };
        if (handlerData.level === 'assert') {
            if (handlerData.args[0] === false) {
                breadcrumb.message = "Assertion failed: " + (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["safeJoin"])(handlerData.args.slice(1), ' ') || 'console.assert');
                breadcrumb.data.arguments = handlerData.args.slice(1);
            }
            else {
                // Don't capture a breadcrumb for passed assertions
                return;
            }
        }
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb(breadcrumb, {
            input: handlerData.args,
            level: handlerData.level,
        });
    };
    /**
     * Creates breadcrumbs from DOM API calls
     */
    Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {
        var target;
        // Accessing event.target can throw (see getsentry/raven-js#838, #768)
        try {
            target = handlerData.event.target
                ? Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(handlerData.event.target)
                : Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(handlerData.event);
        }
        catch (e) {
            target = '<unknown>';
        }
        if (target.length === 0) {
            return;
        }
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
            category: "ui." + handlerData.name,
            message: target,
        }, {
            event: handlerData.event,
            name: handlerData.name,
        });
    };
    /**
     * Creates breadcrumbs from XHR API calls
     */
    Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {
        if (handlerData.endTimestamp) {
            // We only capture complete, non-sentry requests
            if (handlerData.xhr.__sentry_own_request__) {
                return;
            }
            Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
                category: 'xhr',
                data: handlerData.xhr.__sentry_xhr__,
                type: 'http',
            }, {
                xhr: handlerData.xhr,
            });
            return;
        }
    };
    /**
     * Creates breadcrumbs from fetch API calls
     */
    Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {
        // We only capture complete fetch requests
        if (!handlerData.endTimestamp) {
            return;
        }
        if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {
            // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)
            return;
        }
        if (handlerData.error) {
            Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
                category: 'fetch',
                data: handlerData.fetchData,
                level: _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Error,
                type: 'http',
            }, {
                data: handlerData.error,
                input: handlerData.args,
            });
        }
        else {
            Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
                category: 'fetch',
                data: tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, handlerData.fetchData, { status_code: handlerData.response.status }),
                type: 'http',
            }, {
                input: handlerData.args,
                response: handlerData.response,
            });
        }
    };
    /**
     * Creates breadcrumbs from history API calls
     */
    Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {
        var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
        var from = handlerData.from;
        var to = handlerData.to;
        var parsedLoc = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseUrl"])(global.location.href);
        var parsedFrom = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseUrl"])(from);
        var parsedTo = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseUrl"])(to);
        // Initial pushState doesn't provide `from` information
        if (!parsedFrom.path) {
            parsedFrom = parsedLoc;
        }
        // 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) {
            // tslint:disable-next-line:no-parameter-reassignment
            to = parsedTo.relative;
        }
        if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {
            // tslint:disable-next-line:no-parameter-reassignment
            from = parsedFrom.relative;
        }
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
            category: 'navigation',
            data: {
                from: from,
                to: to,
            },
        });
    };
    /**
     * Instrument browser built-ins w/ breadcrumb capturing
     *  - Console API
     *  - DOM API (click/typing)
     *  - XMLHttpRequest API
     *  - Fetch API
     *  - History API
     */
    Breadcrumbs.prototype.setupOnce = function () {
        var _this = this;
        if (this._options.console) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
                callback: function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    _this._consoleBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
                },
                type: 'console',
            });
        }
        if (this._options.dom) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
                callback: function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    _this._domBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
                },
                type: 'dom',
            });
        }
        if (this._options.xhr) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
                callback: function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    _this._xhrBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
                },
                type: 'xhr',
            });
        }
        if (this._options.fetch) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
                callback: function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    _this._fetchBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
                },
                type: 'fetch',
            });
        }
        if (this._options.history) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
                callback: function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    _this._historyBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
                },
                type: 'history',
            });
        }
    };
    /**
     * @inheritDoc
     */
    Breadcrumbs.id = 'Breadcrumbs';
    return Breadcrumbs;
}());

//# sourceMappingURL=breadcrumbs.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/globalhandlers.js":
/*!*************************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/globalhandlers.js ***!
  \*************************************************************************/
/*! exports provided: GlobalHandlers */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GlobalHandlers", function() { return GlobalHandlers; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _eventbuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../eventbuilder */ "./node_modules/@sentry/browser/esm/eventbuilder.js");
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../helpers */ "./node_modules/@sentry/browser/esm/helpers.js");






/** Global handlers */
var GlobalHandlers = /** @class */ (function () {
    /** JSDoc */
    function GlobalHandlers(options) {
        /**
         * @inheritDoc
         */
        this.name = GlobalHandlers.id;
        /** JSDoc */
        this._onErrorHandlerInstalled = false;
        /** JSDoc */
        this._onUnhandledRejectionHandlerInstalled = false;
        this._options = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ onerror: true, onunhandledrejection: true }, options);
    }
    /**
     * @inheritDoc
     */
    GlobalHandlers.prototype.setupOnce = function () {
        Error.stackTraceLimit = 50;
        if (this._options.onerror) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].log('Global Handler attached: onerror');
            this._installGlobalOnErrorHandler();
        }
        if (this._options.onunhandledrejection) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].log('Global Handler attached: onunhandledrejection');
            this._installGlobalOnUnhandledRejectionHandler();
        }
    };
    /** JSDoc */
    GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {
        var _this = this;
        if (this._onErrorHandlerInstalled) {
            return;
        }
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
            callback: function (data) {
                var error = data.error;
                var currentHub = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
                var hasIntegration = currentHub.getIntegration(GlobalHandlers);
                var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;
                if (!hasIntegration || Object(_helpers__WEBPACK_IMPORTED_MODULE_5__["shouldIgnoreOnError"])() || isFailedOwnDelivery) {
                    return;
                }
                var client = currentHub.getClient();
                var event = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isPrimitive"])(error)
                    ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)
                    : _this._enhanceEventWithInitialFrame(Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromUnknownInput"])(error, undefined, {
                        attachStacktrace: client && client.getOptions().attachStacktrace,
                        rejection: false,
                    }), data.url, data.line, data.column);
                Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addExceptionMechanism"])(event, {
                    handled: false,
                    type: 'onerror',
                });
                currentHub.captureEvent(event, {
                    originalException: error,
                });
            },
            type: 'error',
        });
        this._onErrorHandlerInstalled = true;
    };
    /** JSDoc */
    GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {
        var _this = this;
        if (this._onUnhandledRejectionHandlerInstalled) {
            return;
        }
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
            callback: function (e) {
                var error = e;
                // dig the object of the rejection out of known event types
                try {
                    // PromiseRejectionEvents store the object of the rejection under 'reason'
                    // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent
                    if ('reason' in e) {
                        error = e.reason;
                    }
                    // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents
                    // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into
                    // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec
                    // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and
                    // https://github.com/getsentry/sentry-javascript/issues/2380
                    else if ('detail' in e && 'reason' in e.detail) {
                        error = e.detail.reason;
                    }
                }
                catch (_oO) {
                    // no-empty
                }
                var currentHub = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
                var hasIntegration = currentHub.getIntegration(GlobalHandlers);
                var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;
                if (!hasIntegration || Object(_helpers__WEBPACK_IMPORTED_MODULE_5__["shouldIgnoreOnError"])() || isFailedOwnDelivery) {
                    return true;
                }
                var client = currentHub.getClient();
                var event = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isPrimitive"])(error)
                    ? _this._eventFromIncompleteRejection(error)
                    : Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromUnknownInput"])(error, undefined, {
                        attachStacktrace: client && client.getOptions().attachStacktrace,
                        rejection: true,
                    });
                event.level = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Error;
                Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addExceptionMechanism"])(event, {
                    handled: false,
                    type: 'onunhandledrejection',
                });
                currentHub.captureEvent(event, {
                    originalException: error,
                });
                return;
            },
            type: 'unhandledrejection',
        });
        this._onUnhandledRejectionHandlerInstalled = true;
    };
    /**
     * This function creates a stack from an old, error-less onerror handler.
     */
    GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {
        var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;
        // If 'message' is ErrorEvent, get real message from inside
        var message = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isErrorEvent"])(msg) ? msg.message : msg;
        var name;
        if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isString"])(message)) {
            var groups = message.match(ERROR_TYPES_RE);
            if (groups) {
                name = groups[1];
                message = groups[2];
            }
        }
        var event = {
            exception: {
                values: [
                    {
                        type: name || 'Error',
                        value: message,
                    },
                ],
            },
        };
        return this._enhanceEventWithInitialFrame(event, url, line, column);
    };
    /**
     * This function creates an Event from an TraceKitStackTrace that has part of it missing.
     */
    GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {
        return {
            exception: {
                values: [
                    {
                        type: 'UnhandledRejection',
                        value: "Non-Error promise rejection captured with value: " + error,
                    },
                ],
            },
        };
    };
    /** JSDoc */
    GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {
        event.exception = event.exception || {};
        event.exception.values = event.exception.values || [];
        event.exception.values[0] = event.exception.values[0] || {};
        event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};
        event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];
        var colno = isNaN(parseInt(column, 10)) ? undefined : column;
        var lineno = isNaN(parseInt(line, 10)) ? undefined : line;
        var filename = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isString"])(url) && url.length > 0 ? url : Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getLocationHref"])();
        if (event.exception.values[0].stacktrace.frames.length === 0) {
            event.exception.values[0].stacktrace.frames.push({
                colno: colno,
                filename: filename,
                function: '?',
                in_app: true,
                lineno: lineno,
            });
        }
        return event;
    };
    /**
     * @inheritDoc
     */
    GlobalHandlers.id = 'GlobalHandlers';
    return GlobalHandlers;
}());

//# sourceMappingURL=globalhandlers.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/index.js":
/*!****************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/index.js ***!
  \****************************************************************/
/*! exports provided: GlobalHandlers, TryCatch, Breadcrumbs, LinkedErrors, UserAgent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _globalhandlers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./globalhandlers */ "./node_modules/@sentry/browser/esm/integrations/globalhandlers.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GlobalHandlers", function() { return _globalhandlers__WEBPACK_IMPORTED_MODULE_0__["GlobalHandlers"]; });

/* harmony import */ var _trycatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./trycatch */ "./node_modules/@sentry/browser/esm/integrations/trycatch.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TryCatch", function() { return _trycatch__WEBPACK_IMPORTED_MODULE_1__["TryCatch"]; });

/* harmony import */ var _breadcrumbs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./breadcrumbs */ "./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Breadcrumbs", function() { return _breadcrumbs__WEBPACK_IMPORTED_MODULE_2__["Breadcrumbs"]; });

/* harmony import */ var _linkederrors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./linkederrors */ "./node_modules/@sentry/browser/esm/integrations/linkederrors.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LinkedErrors", function() { return _linkederrors__WEBPACK_IMPORTED_MODULE_3__["LinkedErrors"]; });

/* harmony import */ var _useragent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./useragent */ "./node_modules/@sentry/browser/esm/integrations/useragent.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UserAgent", function() { return _useragent__WEBPACK_IMPORTED_MODULE_4__["UserAgent"]; });






//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/linkederrors.js":
/*!***********************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/linkederrors.js ***!
  \***********************************************************************/
/*! exports provided: LinkedErrors */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkedErrors", function() { return LinkedErrors; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _parsers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../parsers */ "./node_modules/@sentry/browser/esm/parsers.js");
/* harmony import */ var _tracekit__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tracekit */ "./node_modules/@sentry/browser/esm/tracekit.js");





var DEFAULT_KEY = 'cause';
var DEFAULT_LIMIT = 5;
/** Adds SDK info to an event. */
var LinkedErrors = /** @class */ (function () {
    /**
     * @inheritDoc
     */
    function LinkedErrors(options) {
        if (options === void 0) { options = {}; }
        /**
         * @inheritDoc
         */
        this.name = LinkedErrors.id;
        this._key = options.key || DEFAULT_KEY;
        this._limit = options.limit || DEFAULT_LIMIT;
    }
    /**
     * @inheritDoc
     */
    LinkedErrors.prototype.setupOnce = function () {
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"])(function (event, hint) {
            var self = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().getIntegration(LinkedErrors);
            if (self) {
                return self._handler(event, hint);
            }
            return event;
        });
    };
    /**
     * @inheritDoc
     */
    LinkedErrors.prototype._handler = function (event, hint) {
        if (!event.exception || !event.exception.values || !hint || !Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isInstanceOf"])(hint.originalException, Error)) {
            return event;
        }
        var linkedErrors = this._walkErrorTree(hint.originalException, this._key);
        event.exception.values = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](linkedErrors, event.exception.values);
        return event;
    };
    /**
     * @inheritDoc
     */
    LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {
        if (stack === void 0) { stack = []; }
        if (!Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isInstanceOf"])(error[key], Error) || stack.length + 1 >= this._limit) {
            return stack;
        }
        var stacktrace = Object(_tracekit__WEBPACK_IMPORTED_MODULE_4__["computeStackTrace"])(error[key]);
        var exception = Object(_parsers__WEBPACK_IMPORTED_MODULE_3__["exceptionFromStacktrace"])(stacktrace);
        return this._walkErrorTree(error[key], key, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]([exception], stack));
    };
    /**
     * @inheritDoc
     */
    LinkedErrors.id = 'LinkedErrors';
    return LinkedErrors;
}());

//# sourceMappingURL=linkederrors.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/trycatch.js":
/*!*******************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/trycatch.js ***!
  \*******************************************************************/
/*! exports provided: TryCatch */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TryCatch", function() { return TryCatch; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../helpers */ "./node_modules/@sentry/browser/esm/helpers.js");



var DEFAULT_EVENT_TARGET = [
    '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',
];
/** Wrap timer functions and event targets to catch errors and provide better meta data */
var TryCatch = /** @class */ (function () {
    /**
     * @inheritDoc
     */
    function TryCatch(options) {
        /**
         * @inheritDoc
         */
        this.name = TryCatch.id;
        this._options = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ XMLHttpRequest: true, eventTarget: true, requestAnimationFrame: true, setInterval: true, setTimeout: true }, options);
    }
    /** JSDoc */
    TryCatch.prototype._wrapTimeFunction = function (original) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var originalCallback = args[0];
            args[0] = Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(originalCallback, {
                mechanism: {
                    data: { function: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original) },
                    handled: true,
                    type: 'instrument',
                },
            });
            return original.apply(this, args);
        };
    };
    /** JSDoc */
    TryCatch.prototype._wrapRAF = function (original) {
        return function (callback) {
            return original.call(this, Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(callback, {
                mechanism: {
                    data: {
                        function: 'requestAnimationFrame',
                        handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original),
                    },
                    handled: true,
                    type: 'instrument',
                },
            }));
        };
    };
    /** JSDoc */
    TryCatch.prototype._wrapEventTarget = function (target) {
        var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
        var proto = global[target] && global[target].prototype;
        if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {
            return;
        }
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(proto, 'addEventListener', function (original) {
            return function (eventName, fn, options) {
                try {
                    // tslint:disable-next-line:no-unbound-method strict-type-predicates
                    if (typeof fn.handleEvent === 'function') {
                        fn.handleEvent = Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(fn.handleEvent.bind(fn), {
                            mechanism: {
                                data: {
                                    function: 'handleEvent',
                                    handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(fn),
                                    target: target,
                                },
                                handled: true,
                                type: 'instrument',
                            },
                        });
                    }
                }
                catch (err) {
                    // can sometimes get 'Permission denied to access property "handle Event'
                }
                return original.call(this, eventName, Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(fn, {
                    mechanism: {
                        data: {
                            function: 'addEventListener',
                            handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(fn),
                            target: target,
                        },
                        handled: true,
                        type: 'instrument',
                    },
                }), options);
            };
        });
        Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(proto, 'removeEventListener', function (original) {
            return function (eventName, fn, options) {
                var callback = fn;
                try {
                    callback = callback && (callback.__sentry_wrapped__ || callback);
                }
                catch (e) {
                    // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments
                }
                return original.call(this, eventName, callback, options);
            };
        });
    };
    /** JSDoc */
    TryCatch.prototype._wrapXHR = function (originalSend) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var xhr = this; // tslint:disable-line:no-this-assignment
            var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];
            xmlHttpRequestProps.forEach(function (prop) {
                if (prop in xhr && typeof xhr[prop] === 'function') {
                    Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(xhr, prop, function (original) {
                        var wrapOptions = {
                            mechanism: {
                                data: {
                                    function: prop,
                                    handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original),
                                },
                                handled: true,
                                type: 'instrument',
                            },
                        };
                        // If Instrument integration has been called before TryCatch, get the name of original function
                        if (original.__sentry_original__) {
                            wrapOptions.mechanism.data.handler = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original.__sentry_original__);
                        }
                        // Otherwise wrap directly
                        return Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(original, wrapOptions);
                    });
                }
            });
            return originalSend.apply(this, args);
        };
    };
    /**
     * Wrap timer functions and event targets to catch errors
     * and provide better metadata.
     */
    TryCatch.prototype.setupOnce = function () {
        var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
        if (this._options.setTimeout) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(global, 'setTimeout', this._wrapTimeFunction.bind(this));
        }
        if (this._options.setInterval) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(global, 'setInterval', this._wrapTimeFunction.bind(this));
        }
        if (this._options.requestAnimationFrame) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(global, 'requestAnimationFrame', this._wrapRAF.bind(this));
        }
        if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {
            Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));
        }
        if (this._options.eventTarget) {
            var eventTarget = Array.isArray(this._options.eventTarget) ? this._options.eventTarget : DEFAULT_EVENT_TARGET;
            eventTarget.forEach(this._wrapEventTarget.bind(this));
        }
    };
    /**
     * @inheritDoc
     */
    TryCatch.id = 'TryCatch';
    return TryCatch;
}());

//# sourceMappingURL=trycatch.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/integrations/useragent.js":
/*!********************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/integrations/useragent.js ***!
  \********************************************************************/
/*! exports provided: UserAgent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UserAgent", function() { return UserAgent; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");



var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getGlobalObject"])();
/** UserAgent */
var UserAgent = /** @class */ (function () {
    function UserAgent() {
        /**
         * @inheritDoc
         */
        this.name = UserAgent.id;
    }
    /**
     * @inheritDoc
     */
    UserAgent.prototype.setupOnce = function () {
        Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"])(function (event) {
            if (Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().getIntegration(UserAgent)) {
                if (!global.navigator || !global.location) {
                    return event;
                }
                var request = event.request || {};
                request.url = request.url || global.location.href;
                request.headers = request.headers || {};
                request.headers['User-Agent'] = global.navigator.userAgent;
                return tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event, { request: request });
            }
            return event;
        });
    };
    /**
     * @inheritDoc
     */
    UserAgent.id = 'UserAgent';
    return UserAgent;
}());

//# sourceMappingURL=useragent.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/parsers.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/parsers.js ***!
  \*****************************************************/
/*! exports provided: exceptionFromStacktrace, eventFromPlainObject, eventFromStacktrace, prepareFramesForEvent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exceptionFromStacktrace", function() { return exceptionFromStacktrace; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromPlainObject", function() { return eventFromPlainObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromStacktrace", function() { return eventFromStacktrace; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prepareFramesForEvent", function() { return prepareFramesForEvent; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _tracekit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tracekit */ "./node_modules/@sentry/browser/esm/tracekit.js");


var STACKTRACE_LIMIT = 50;
/**
 * This function creates an exception from an TraceKitStackTrace
 * @param stacktrace TraceKitStackTrace that will be converted to an exception
 * @hidden
 */
function exceptionFromStacktrace(stacktrace) {
    var frames = prepareFramesForEvent(stacktrace.stack);
    var exception = {
        type: stacktrace.name,
        value: stacktrace.message,
    };
    if (frames && frames.length) {
        exception.stacktrace = { frames: frames };
    }
    // tslint:disable-next-line:strict-type-predicates
    if (exception.type === undefined && exception.value === '') {
        exception.value = 'Unrecoverable error caught';
    }
    return exception;
}
/**
 * @hidden
 */
function eventFromPlainObject(exception, syntheticException, rejection) {
    var event = {
        exception: {
            values: [
                {
                    type: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isEvent"])(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',
                    value: "Non-Error " + (rejection ? 'promise rejection' : 'exception') + " captured with keys: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["extractExceptionKeysForMessage"])(exception),
                },
            ],
        },
        extra: {
            __serialized__: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["normalizeToSize"])(exception),
        },
    };
    if (syntheticException) {
        var stacktrace = Object(_tracekit__WEBPACK_IMPORTED_MODULE_1__["computeStackTrace"])(syntheticException);
        var frames_1 = prepareFramesForEvent(stacktrace.stack);
        event.stacktrace = {
            frames: frames_1,
        };
    }
    return event;
}
/**
 * @hidden
 */
function eventFromStacktrace(stacktrace) {
    var exception = exceptionFromStacktrace(stacktrace);
    return {
        exception: {
            values: [exception],
        },
    };
}
/**
 * @hidden
 */
function prepareFramesForEvent(stack) {
    if (!stack || !stack.length) {
        return [];
    }
    var localStack = stack;
    var firstFrameFunction = localStack[0].func || '';
    var lastFrameFunction = localStack[localStack.length - 1].func || '';
    // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)
    if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {
        localStack = localStack.slice(1);
    }
    // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)
    if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {
        localStack = localStack.slice(0, -1);
    }
    // The frame where the crash happened, should be the last entry in the array
    return localStack
        .slice(0, STACKTRACE_LIMIT)
        .map(function (frame) { return ({
        colno: frame.column === null ? undefined : frame.column,
        filename: frame.url || localStack[0].url,
        function: frame.func || '?',
        in_app: true,
        lineno: frame.line === null ? undefined : frame.line,
    }); })
        .reverse();
}
//# sourceMappingURL=parsers.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/sdk.js":
/*!*************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/sdk.js ***!
  \*************************************************/
/*! exports provided: defaultIntegrations, init, showReportDialog, lastEventId, forceLoad, onLoad, flush, close, wrap */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIntegrations", function() { return defaultIntegrations; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "init", function() { return init; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showReportDialog", function() { return showReportDialog; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lastEventId", function() { return lastEventId; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forceLoad", function() { return forceLoad; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onLoad", function() { return onLoad; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flush", function() { return flush; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "close", function() { return close; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return wrap; });
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./client */ "./node_modules/@sentry/browser/esm/client.js");
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./node_modules/@sentry/browser/esm/helpers.js");
/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/browser/esm/integrations/index.js");





var defaultIntegrations = [
    new _sentry_core__WEBPACK_IMPORTED_MODULE_0__["Integrations"].InboundFilters(),
    new _sentry_core__WEBPACK_IMPORTED_MODULE_0__["Integrations"].FunctionToString(),
    new _integrations__WEBPACK_IMPORTED_MODULE_4__["TryCatch"](),
    new _integrations__WEBPACK_IMPORTED_MODULE_4__["Breadcrumbs"](),
    new _integrations__WEBPACK_IMPORTED_MODULE_4__["GlobalHandlers"](),
    new _integrations__WEBPACK_IMPORTED_MODULE_4__["LinkedErrors"](),
    new _integrations__WEBPACK_IMPORTED_MODULE_4__["UserAgent"](),
];
/**
 * The Sentry Browser SDK Client.
 *
 * To use this SDK, call the {@link init} function as early as possible when
 * loading the web page. To set context information or send manual events, use
 * the provided methods.
 *
 * @example
 *
 * ```
 *
 * import { init } from '@sentry/browser';
 *
 * init({
 *   dsn: '__DSN__',
 *   // ...
 * });
 * ```
 *
 * @example
 * ```
 *
 * import { configureScope } from '@sentry/browser';
 * configureScope((scope: Scope) => {
 *   scope.setExtra({ battery: 0.7 });
 *   scope.setTag({ user_mode: 'admin' });
 *   scope.setUser({ id: '4711' });
 * });
 * ```
 *
 * @example
 * ```
 *
 * import { addBreadcrumb } from '@sentry/browser';
 * addBreadcrumb({
 *   message: 'My Breadcrumb',
 *   // ...
 * });
 * ```
 *
 * @example
 *
 * ```
 *
 * import * as Sentry from '@sentry/browser';
 * Sentry.captureMessage('Hello, world!');
 * Sentry.captureException(new Error('Good bye'));
 * Sentry.captureEvent({
 *   message: 'Manual',
 *   stacktrace: [
 *     // ...
 *   ],
 * });
 * ```
 *
 * @see {@link BrowserOptions} for documentation on configuration options.
 */
function init(options) {
    if (options === void 0) { options = {}; }
    if (options.defaultIntegrations === undefined) {
        options.defaultIntegrations = defaultIntegrations;
    }
    if (options.release === undefined) {
        var window_1 = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
        // This supports the variable that sentry-webpack-plugin injects
        if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {
            options.release = window_1.SENTRY_RELEASE.id;
        }
    }
    Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["initAndBind"])(_client__WEBPACK_IMPORTED_MODULE_2__["BrowserClient"], options);
}
/**
 * Present the user with a report dialog.
 *
 * @param options Everything is optional, we try to fetch all info need from the global scope.
 */
function showReportDialog(options) {
    if (options === void 0) { options = {}; }
    if (!options.eventId) {
        options.eventId = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().lastEventId();
    }
    var client = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().getClient();
    if (client) {
        client.showReportDialog(options);
    }
}
/**
 * This is the getter for lastEventId.
 *
 * @returns The last event id of a captured event.
 */
function lastEventId() {
    return Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().lastEventId();
}
/**
 * This function is here to be API compatible with the loader.
 * @hidden
 */
function forceLoad() {
    // Noop
}
/**
 * This function is here to be API compatible with the loader.
 * @hidden
 */
function onLoad(callback) {
    callback();
}
/**
 * A promise that resolves when all current events have been sent.
 * If you provide a timeout and the queue takes longer to drain the promise returns false.
 *
 * @param timeout Maximum time in ms the client should wait.
 */
function flush(timeout) {
    var client = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().getClient();
    if (client) {
        return client.flush(timeout);
    }
    return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].reject(false);
}
/**
 * A promise that resolves when all current events have been sent.
 * If you provide a timeout and the queue takes longer to drain the promise returns false.
 *
 * @param timeout Maximum time in ms the client should wait.
 */
function close(timeout) {
    var client = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().getClient();
    if (client) {
        return client.close(timeout);
    }
    return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].reject(false);
}
/**
 * Wrap code within a try/catch block so the SDK is able to capture errors.
 *
 * @param fn A function to wrap.
 *
 * @returns The result of wrapped function call.
 */
function wrap(fn) {
    return Object(_helpers__WEBPACK_IMPORTED_MODULE_3__["wrap"])(fn)(); // tslint:disable-line:no-unsafe-any
}
//# sourceMappingURL=sdk.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/tracekit.js":
/*!******************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/tracekit.js ***!
  \******************************************************/
/*! exports provided: computeStackTrace */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeStackTrace", function() { return computeStackTrace; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
// tslint:disable:object-literal-sort-keys

// global reference to slice
var UNKNOWN_FUNCTION = '?';
// Chromium based browsers: Chrome, Brave, new Opera, new Edge
var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
// gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it
// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js
// We need this specific case for now because we want no other regex to match.
var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js))(?::(\d+))?(?::(\d+))?\s*$/i;
var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/;
/** JSDoc */
function computeStackTrace(ex) {
    // tslint:disable:no-unsafe-any
    var stack = null;
    var popSize = ex && ex.framesToPop;
    try {
        // This must be tried first because Opera 10 *destroys*
        // its stacktrace property if you try to access the stack
        // property first!!
        stack = computeStackTraceFromStacktraceProp(ex);
        if (stack) {
            return popFrames(stack, popSize);
        }
    }
    catch (e) {
        // no-empty
    }
    try {
        stack = computeStackTraceFromStackProp(ex);
        if (stack) {
            return popFrames(stack, popSize);
        }
    }
    catch (e) {
        // no-empty
    }
    return {
        message: extractMessage(ex),
        name: ex && ex.name,
        stack: [],
        failed: true,
    };
}
/** JSDoc */
// tslint:disable-next-line:cyclomatic-complexity
function computeStackTraceFromStackProp(ex) {
    // tslint:disable:no-conditional-assignment
    if (!ex || !ex.stack) {
        return null;
    }
    var stack = [];
    var lines = ex.stack.split('\n');
    var isEval;
    var submatch;
    var parts;
    var element;
    for (var i = 0; i < lines.length; ++i) {
        if ((parts = chrome.exec(lines[i]))) {
            var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
            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 = {
                // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `
                // prefix here seems like the quickest solution for now.
                url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2],
                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]))) {
            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[1] = parts[1] || "eval";
                parts[3] = submatch[1];
                parts[4] = submatch[2];
                parts[5] = ''; // no column when eval
            }
            else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {
                // 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;
        }
        stack.push(element);
    }
    if (!stack.length) {
        return null;
    }
    return {
        message: extractMessage(ex),
        name: ex.name,
        stack: stack,
    };
}
/** JSDoc */
function computeStackTraceFromStacktraceProp(ex) {
    if (!ex || !ex.stacktrace) {
        return null;
    }
    // Access and store the stacktrace property before doing ANYTHING
    // else to it because Opera is not very good at providing it
    // reliably in other circumstances.
    var stacktrace = ex.stacktrace;
    var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i;
    var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i;
    var lines = stacktrace.split('\n');
    var stack = [];
    var parts;
    for (var line = 0; line < lines.length; line += 2) {
        // tslint:disable:no-conditional-assignment
        var element = null;
        if ((parts = opera10Regex.exec(lines[line]))) {
            element = {
                url: parts[2],
                func: parts[3],
                args: [],
                line: +parts[1],
                column: null,
            };
        }
        else if ((parts = opera11Regex.exec(lines[line]))) {
            element = {
                url: parts[6],
                func: parts[3] || parts[4],
                args: parts[5] ? parts[5].split(',') : [],
                line: +parts[1],
                column: +parts[2],
            };
        }
        if (element) {
            if (!element.func && element.line) {
                element.func = UNKNOWN_FUNCTION;
            }
            stack.push(element);
        }
    }
    if (!stack.length) {
        return null;
    }
    return {
        message: extractMessage(ex),
        name: ex.name,
        stack: stack,
    };
}
/** Remove N number of frames from the stack */
function popFrames(stacktrace, popSize) {
    try {
        return tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, stacktrace, { stack: stacktrace.stack.slice(popSize) });
    }
    catch (e) {
        return stacktrace;
    }
}
/**
 * There are cases where stacktrace.message is an Event object
 * https://github.com/getsentry/sentry-javascript/issues/1949
 * In this specific case we try to extract stacktrace.message.error.message
 */
function extractMessage(ex) {
    var message = ex && ex.message;
    if (!message) {
        return 'No error message';
    }
    if (message.error && typeof message.error.message === 'string') {
        return message.error.message;
    }
    return message;
}
//# sourceMappingURL=tracekit.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/transports/base.js":
/*!*************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/transports/base.js ***!
  \*************************************************************/
/*! exports provided: BaseTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseTransport", function() { return BaseTransport; });
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");


/** Base Transport class implementation */
var BaseTransport = /** @class */ (function () {
    function BaseTransport(options) {
        this.options = options;
        /** A simple buffer holding all requests. */
        this._buffer = new _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["PromiseBuffer"](30);
        this._api = new _sentry_core__WEBPACK_IMPORTED_MODULE_0__["API"](this.options.dsn);
        // tslint:disable-next-line:deprecation
        this.url = this._api.getStoreEndpointWithUrlEncodedAuth();
    }
    /**
     * @inheritDoc
     */
    BaseTransport.prototype.sendEvent = function (_) {
        throw new _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SentryError"]('Transport Class has to implement `sendEvent` method');
    };
    /**
     * @inheritDoc
     */
    BaseTransport.prototype.close = function (timeout) {
        return this._buffer.drain(timeout);
    };
    return BaseTransport;
}());

//# sourceMappingURL=base.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/transports/fetch.js":
/*!**************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/transports/fetch.js ***!
  \**************************************************************/
/*! exports provided: FetchTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FetchTransport", function() { return FetchTransport; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "./node_modules/@sentry/browser/esm/transports/base.js");





var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
/** `fetch` based transport */
var FetchTransport = /** @class */ (function (_super) {
    tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FetchTransport, _super);
    function FetchTransport() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        /** Locks transport after receiving 429 response */
        _this._disabledUntil = new Date(Date.now());
        return _this;
    }
    /**
     * @inheritDoc
     */
    FetchTransport.prototype.sendEvent = function (event) {
        var _this = this;
        if (new Date(Date.now()) < this._disabledUntil) {
            return Promise.reject({
                event: event,
                reason: "Transport locked till " + this._disabledUntil + " due to too many requests.",
                status: 429,
            });
        }
        var sentryReq = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["eventToSentryRequest"])(event, this._api);
        var options = {
            body: sentryReq.body,
            method: 'POST',
            // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
            // https://caniuse.com/#feat=referrer-policy
            // It doesn't. And it throw exception instead of ignoring this parameter...
            // REF: https://github.com/getsentry/raven-js/issues/1233
            referrerPolicy: (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["supportsReferrerPolicy"])() ? 'origin' : ''),
        };
        if (this.options.fetchParameters !== undefined) {
            Object.assign(options, this.options.fetchParameters);
        }
        if (this.options.headers !== undefined) {
            options.headers = this.options.headers;
        }
        return this._buffer.add(new _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"](function (resolve, reject) {
            global
                .fetch(sentryReq.url, options)
                .then(function (response) {
                var status = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].fromHttpCode(response.status);
                if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].Success) {
                    resolve({ status: status });
                    return;
                }
                if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].RateLimit) {
                    var now = Date.now();
                    _this._disabledUntil = new Date(now + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseRetryAfterHeader"])(now, response.headers.get('Retry-After')));
                    _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("Too many requests, backing off till: " + _this._disabledUntil);
                }
                reject(response);
            })
                .catch(reject);
        }));
    };
    return FetchTransport;
}(_base__WEBPACK_IMPORTED_MODULE_4__["BaseTransport"]));

//# sourceMappingURL=fetch.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/transports/index.js":
/*!**************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/transports/index.js ***!
  \**************************************************************/
/*! exports provided: BaseTransport, FetchTransport, XHRTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./node_modules/@sentry/browser/esm/transports/base.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseTransport", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["BaseTransport"]; });

/* harmony import */ var _fetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fetch */ "./node_modules/@sentry/browser/esm/transports/fetch.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FetchTransport", function() { return _fetch__WEBPACK_IMPORTED_MODULE_1__["FetchTransport"]; });

/* harmony import */ var _xhr__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./xhr */ "./node_modules/@sentry/browser/esm/transports/xhr.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "XHRTransport", function() { return _xhr__WEBPACK_IMPORTED_MODULE_2__["XHRTransport"]; });




//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/transports/xhr.js":
/*!************************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/transports/xhr.js ***!
  \************************************************************/
/*! exports provided: XHRTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "XHRTransport", function() { return XHRTransport; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "./node_modules/@sentry/browser/esm/transports/base.js");





/** `XHR` based transport */
var XHRTransport = /** @class */ (function (_super) {
    tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](XHRTransport, _super);
    function XHRTransport() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        /** Locks transport after receiving 429 response */
        _this._disabledUntil = new Date(Date.now());
        return _this;
    }
    /**
     * @inheritDoc
     */
    XHRTransport.prototype.sendEvent = function (event) {
        var _this = this;
        if (new Date(Date.now()) < this._disabledUntil) {
            return Promise.reject({
                event: event,
                reason: "Transport locked till " + this._disabledUntil + " due to too many requests.",
                status: 429,
            });
        }
        var sentryReq = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["eventToSentryRequest"])(event, this._api);
        return this._buffer.add(new _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"](function (resolve, reject) {
            var request = new XMLHttpRequest();
            request.onreadystatechange = function () {
                if (request.readyState !== 4) {
                    return;
                }
                var status = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].fromHttpCode(request.status);
                if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].Success) {
                    resolve({ status: status });
                    return;
                }
                if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].RateLimit) {
                    var now = Date.now();
                    _this._disabledUntil = new Date(now + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseRetryAfterHeader"])(now, request.getResponseHeader('Retry-After')));
                    _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("Too many requests, backing off till: " + _this._disabledUntil);
                }
                reject(request);
            };
            request.open('POST', sentryReq.url);
            for (var header in _this.options.headers) {
                if (_this.options.headers.hasOwnProperty(header)) {
                    request.setRequestHeader(header, _this.options.headers[header]);
                }
            }
            request.send(sentryReq.body);
        }));
    };
    return XHRTransport;
}(_base__WEBPACK_IMPORTED_MODULE_4__["BaseTransport"]));

//# sourceMappingURL=xhr.js.map

/***/ }),

/***/ "./node_modules/@sentry/browser/esm/version.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/browser/esm/version.js ***!
  \*****************************************************/
/*! exports provided: SDK_NAME, SDK_VERSION */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SDK_NAME", function() { return SDK_NAME; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SDK_VERSION", function() { return SDK_VERSION; });
var SDK_NAME = 'sentry.javascript.browser';
var SDK_VERSION = '5.19.0';
//# sourceMappingURL=version.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/api.js":
/*!**********************************************!*\
  !*** ./node_modules/@sentry/core/esm/api.js ***!
  \**********************************************/
/*! exports provided: API */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "API", function() { return API; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");

var SENTRY_API_VERSION = '7';
/** Helper class to provide urls to different Sentry endpoints. */
var API = /** @class */ (function () {
    /** Create a new instance of API */
    function API(dsn) {
        this.dsn = dsn;
        this._dsnObject = new _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["Dsn"](dsn);
    }
    /** Returns the Dsn object. */
    API.prototype.getDsn = function () {
        return this._dsnObject;
    };
    /** Returns the prefix to construct Sentry ingestion API endpoints. */
    API.prototype.getBaseApiEndpoint = function () {
        var dsn = this._dsnObject;
        var protocol = dsn.protocol ? dsn.protocol + ":" : '';
        var port = dsn.port ? ":" + dsn.port : '';
        return protocol + "//" + dsn.host + port + (dsn.path ? "/" + dsn.path : '') + "/api/";
    };
    /** Returns the store endpoint URL. */
    API.prototype.getStoreEndpoint = function () {
        return this._getIngestEndpoint('store');
    };
    /** Returns the envelope endpoint URL. */
    API.prototype._getEnvelopeEndpoint = function () {
        return this._getIngestEndpoint('envelope');
    };
    /** Returns the ingest API endpoint for target. */
    API.prototype._getIngestEndpoint = function (target) {
        var base = this.getBaseApiEndpoint();
        var dsn = this._dsnObject;
        return "" + base + dsn.projectId + "/" + target + "/";
    };
    /**
     * Returns the store endpoint URL with auth in the query string.
     *
     * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.
     */
    API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {
        return this.getStoreEndpoint() + "?" + this._encodedAuth();
    };
    /**
     * Returns the envelope endpoint URL with auth in the query string.
     *
     * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.
     */
    API.prototype.getEnvelopeEndpointWithUrlEncodedAuth = function () {
        return this._getEnvelopeEndpoint() + "?" + this._encodedAuth();
    };
    /** Returns a URL-encoded string with auth config suitable for a query string. */
    API.prototype._encodedAuth = function () {
        var dsn = this._dsnObject;
        var auth = {
            // We send only the minimum set of required information. See
            // https://github.com/getsentry/sentry-javascript/issues/2572.
            sentry_key: dsn.user,
            sentry_version: SENTRY_API_VERSION,
        };
        return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["urlEncode"])(auth);
    };
    /** Returns only the path component for the store endpoint. */
    API.prototype.getStoreEndpointPath = function () {
        var dsn = this._dsnObject;
        return (dsn.path ? "/" + dsn.path : '') + "/api/" + dsn.projectId + "/store/";
    };
    /**
     * Returns an object that can be used in request headers.
     * This is needed for node and the old /store endpoint in sentry
     */
    API.prototype.getRequestHeaders = function (clientName, clientVersion) {
        var dsn = this._dsnObject;
        var header = ["Sentry sentry_version=" + SENTRY_API_VERSION];
        header.push("sentry_client=" + clientName + "/" + clientVersion);
        header.push("sentry_key=" + dsn.user);
        if (dsn.pass) {
            header.push("sentry_secret=" + dsn.pass);
        }
        return {
            'Content-Type': 'application/json',
            'X-Sentry-Auth': header.join(', '),
        };
    };
    /** Returns the url to the report dialog endpoint. */
    API.prototype.getReportDialogEndpoint = function (dialogOptions) {
        if (dialogOptions === void 0) { dialogOptions = {}; }
        var dsn = this._dsnObject;
        var endpoint = this.getBaseApiEndpoint() + "embed/error-page/";
        var encodedOptions = [];
        encodedOptions.push("dsn=" + dsn.toString());
        for (var key in dialogOptions) {
            if (key === 'user') {
                if (!dialogOptions.user) {
                    continue;
                }
                if (dialogOptions.user.name) {
                    encodedOptions.push("name=" + encodeURIComponent(dialogOptions.user.name));
                }
                if (dialogOptions.user.email) {
                    encodedOptions.push("email=" + encodeURIComponent(dialogOptions.user.email));
                }
            }
            else {
                encodedOptions.push(encodeURIComponent(key) + "=" + encodeURIComponent(dialogOptions[key]));
            }
        }
        if (encodedOptions.length) {
            return endpoint + "?" + encodedOptions.join('&');
        }
        return endpoint;
    };
    return API;
}());

//# sourceMappingURL=api.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/basebackend.js":
/*!******************************************************!*\
  !*** ./node_modules/@sentry/core/esm/basebackend.js ***!
  \******************************************************/
/*! exports provided: BaseBackend */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseBackend", function() { return BaseBackend; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _transports_noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transports/noop */ "./node_modules/@sentry/core/esm/transports/noop.js");


/**
 * This is the base implemention of a Backend.
 * @hidden
 */
var BaseBackend = /** @class */ (function () {
    /** Creates a new backend instance. */
    function BaseBackend(options) {
        this._options = options;
        if (!this._options.dsn) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('No DSN provided, backend will not do anything.');
        }
        this._transport = this._setupTransport();
    }
    /**
     * Sets up the transport so it can be used later to send requests.
     */
    BaseBackend.prototype._setupTransport = function () {
        return new _transports_noop__WEBPACK_IMPORTED_MODULE_1__["NoopTransport"]();
    };
    /**
     * @inheritDoc
     */
    BaseBackend.prototype.eventFromException = function (_exception, _hint) {
        throw new _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["SentryError"]('Backend has to implement `eventFromException` method');
    };
    /**
     * @inheritDoc
     */
    BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {
        throw new _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["SentryError"]('Backend has to implement `eventFromMessage` method');
    };
    /**
     * @inheritDoc
     */
    BaseBackend.prototype.sendEvent = function (event) {
        this._transport.sendEvent(event).then(null, function (reason) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["logger"].error("Error while sending event: " + reason);
        });
    };
    /**
     * @inheritDoc
     */
    BaseBackend.prototype.getTransport = function () {
        return this._transport;
    };
    return BaseBackend;
}());

//# sourceMappingURL=basebackend.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/baseclient.js":
/*!*****************************************************!*\
  !*** ./node_modules/@sentry/core/esm/baseclient.js ***!
  \*****************************************************/
/*! exports provided: BaseClient */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseClient", function() { return BaseClient; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _integration__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./integration */ "./node_modules/@sentry/core/esm/integration.js");




/**
 * Base implementation for all JavaScript SDK clients.
 *
 * Call the constructor with the corresponding backend constructor and options
 * specific to the client subclass. To access these options later, use
 * {@link Client.getOptions}. Also, the Backend instance is available via
 * {@link Client.getBackend}.
 *
 * If a Dsn is specified in the options, it will be parsed and stored. Use
 * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is
 * invalid, the constructor will throw a {@link SentryException}. Note that
 * without a valid Dsn, the SDK will not send any events to Sentry.
 *
 * Before sending an event via the backend, it is passed through
 * {@link BaseClient.prepareEvent} to add SDK information and scope data
 * (breadcrumbs and context). To add more custom information, override this
 * method and extend the resulting prepared event.
 *
 * To issue automatically created events (e.g. via instrumentation), use
 * {@link Client.captureEvent}. It will prepare the event and pass it through
 * the callback lifecycle. To issue auto-breadcrumbs, use
 * {@link Client.addBreadcrumb}.
 *
 * @example
 * class NodeClient extends BaseClient<NodeBackend, NodeOptions> {
 *   public constructor(options: NodeOptions) {
 *     super(NodeBackend, options);
 *   }
 *
 *   // ...
 * }
 */
var BaseClient = /** @class */ (function () {
    /**
     * Initializes this client instance.
     *
     * @param backendClass A constructor function to create the backend.
     * @param options Options for the client.
     */
    function BaseClient(backendClass, options) {
        /** Array of used integrations. */
        this._integrations = {};
        /** Is the client still processing a call? */
        this._processing = false;
        this._backend = new backendClass(options);
        this._options = options;
        if (options.dsn) {
            this._dsn = new _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["Dsn"](options.dsn);
        }
    }
    /**
     * @inheritDoc
     */
    BaseClient.prototype.captureException = function (exception, hint, scope) {
        var _this = this;
        var eventId = hint && hint.event_id;
        this._processing = true;
        this._getBackend()
            .eventFromException(exception, hint)
            .then(function (event) {
            eventId = _this.captureEvent(event, hint, scope);
        });
        return eventId;
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.captureMessage = function (message, level, hint, scope) {
        var _this = this;
        var eventId = hint && hint.event_id;
        this._processing = true;
        var promisedEvent = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isPrimitive"])(message)
            ? this._getBackend().eventFromMessage("" + message, level, hint)
            : this._getBackend().eventFromException(message, hint);
        promisedEvent.then(function (event) {
            eventId = _this.captureEvent(event, hint, scope);
        });
        return eventId;
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.captureEvent = function (event, hint, scope) {
        var _this = this;
        var eventId = hint && hint.event_id;
        this._processing = true;
        this._processEvent(event, hint, scope)
            .then(function (finalEvent) {
            // We need to check for finalEvent in case beforeSend returned null
            eventId = finalEvent && finalEvent.event_id;
            _this._processing = false;
        })
            .then(null, function (reason) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error(reason);
            _this._processing = false;
        });
        return eventId;
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.getDsn = function () {
        return this._dsn;
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.getOptions = function () {
        return this._options;
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.flush = function (timeout) {
        var _this = this;
        return this._isClientProcessing(timeout).then(function (status) {
            clearInterval(status.interval);
            return _this._getBackend()
                .getTransport()
                .close(timeout)
                .then(function (transportFlushed) { return status.ready && transportFlushed; });
        });
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.close = function (timeout) {
        var _this = this;
        return this.flush(timeout).then(function (result) {
            _this.getOptions().enabled = false;
            return result;
        });
    };
    /**
     * Sets up the integrations
     */
    BaseClient.prototype.setupIntegrations = function () {
        if (this._isEnabled()) {
            this._integrations = Object(_integration__WEBPACK_IMPORTED_MODULE_3__["setupIntegrations"])(this._options);
        }
    };
    /**
     * @inheritDoc
     */
    BaseClient.prototype.getIntegration = function (integration) {
        try {
            return this._integrations[integration.id] || null;
        }
        catch (_oO) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Cannot retrieve integration " + integration.id + " from the current Client");
            return null;
        }
    };
    /** Waits for the client to be done with processing. */
    BaseClient.prototype._isClientProcessing = function (timeout) {
        var _this = this;
        return new _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"](function (resolve) {
            var ticked = 0;
            var tick = 1;
            var interval = 0;
            clearInterval(interval);
            interval = setInterval(function () {
                if (!_this._processing) {
                    resolve({
                        interval: interval,
                        ready: true,
                    });
                }
                else {
                    ticked += tick;
                    if (timeout && ticked >= timeout) {
                        resolve({
                            interval: interval,
                            ready: false,
                        });
                    }
                }
            }, tick);
        });
    };
    /** Returns the current backend. */
    BaseClient.prototype._getBackend = function () {
        return this._backend;
    };
    /** Determines whether this SDK is enabled and a valid Dsn is present. */
    BaseClient.prototype._isEnabled = function () {
        return this.getOptions().enabled !== false && this._dsn !== undefined;
    };
    /**
     * Adds common information to events.
     *
     * The information includes release and environment from `options`,
     * breadcrumbs and context (extra, tags and user) from the scope.
     *
     * Information that is already present in the event is never overwritten. For
     * nested objects, such as the context, keys are merged.
     *
     * @param event The original event.
     * @param hint May contain additional information about the original exception.
     * @param scope A scope containing event metadata.
     * @returns A new event with more information.
     */
    BaseClient.prototype._prepareEvent = function (event, scope, hint) {
        var _this = this;
        var _a = this.getOptions().normalizeDepth, normalizeDepth = _a === void 0 ? 3 : _a;
        var prepared = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event, { event_id: event.event_id || (hint && hint.event_id ? hint.event_id : Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["uuid4"])()), timestamp: event.timestamp || Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["timestampWithMs"])() });
        this._applyClientOptions(prepared);
        this._applyIntegrationsMetadata(prepared);
        // If we have scope given to us, use it as the base for further modifications.
        // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.
        var finalScope = scope;
        if (hint && hint.captureContext) {
            finalScope = _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["Scope"].clone(finalScope).update(hint.captureContext);
        }
        // We prepare the result here with a resolved Event.
        var result = _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"].resolve(prepared);
        // This should be the last thing called, since we want that
        // {@link Hub.addEventProcessor} gets the finished prepared event.
        if (finalScope) {
            // In case we have a hub we reassign it.
            result = finalScope.applyToEvent(prepared, hint);
        }
        return result.then(function (evt) {
            // tslint:disable-next-line:strict-type-predicates
            if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {
                return _this._normalizeEvent(evt, normalizeDepth);
            }
            return evt;
        });
    };
    /**
     * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.
     * Normalized keys:
     * - `breadcrumbs.data`
     * - `user`
     * - `contexts`
     * - `extra`
     * @param event Event
     * @returns Normalized event
     */
    BaseClient.prototype._normalizeEvent = function (event, depth) {
        if (!event) {
            return null;
        }
        // tslint:disable:no-unsafe-any
        var normalized = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event, (event.breadcrumbs && {
            breadcrumbs: event.breadcrumbs.map(function (b) { return (tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, b, (b.data && {
                data: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(b.data, depth),
            }))); }),
        }), (event.user && {
            user: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(event.user, depth),
        }), (event.contexts && {
            contexts: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(event.contexts, depth),
        }), (event.extra && {
            extra: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(event.extra, depth),
        }));
        // event.contexts.trace stores information about a Transaction. Similarly,
        // event.spans[] stores information about child Spans. Given that a
        // Transaction is conceptually a Span, normalization should apply to both
        // Transactions and Spans consistently.
        // For now the decision is to skip normalization of Transactions and Spans,
        // so this block overwrites the normalized event to add back the original
        // Transaction information prior to normalization.
        if (event.contexts && event.contexts.trace) {
            normalized.contexts.trace = event.contexts.trace;
        }
        return normalized;
    };
    /**
     *  Enhances event using the client configuration.
     *  It takes care of all "static" values like environment, release and `dist`,
     *  as well as truncating overly long values.
     * @param event event instance to be enhanced
     */
    BaseClient.prototype._applyClientOptions = function (event) {
        var _a = this.getOptions(), environment = _a.environment, release = _a.release, dist = _a.dist, _b = _a.maxValueLength, maxValueLength = _b === void 0 ? 250 : _b;
        if (event.environment === undefined && environment !== undefined) {
            event.environment = environment;
        }
        if (event.release === undefined && release !== undefined) {
            event.release = release;
        }
        if (event.dist === undefined && dist !== undefined) {
            event.dist = dist;
        }
        if (event.message) {
            event.message = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["truncate"])(event.message, maxValueLength);
        }
        var exception = event.exception && event.exception.values && event.exception.values[0];
        if (exception && exception.value) {
            exception.value = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["truncate"])(exception.value, maxValueLength);
        }
        var request = event.request;
        if (request && request.url) {
            request.url = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["truncate"])(request.url, maxValueLength);
        }
    };
    /**
     * This function adds all used integrations to the SDK info in the event.
     * @param sdkInfo The sdkInfo of the event that will be filled with all integrations.
     */
    BaseClient.prototype._applyIntegrationsMetadata = function (event) {
        var sdkInfo = event.sdk;
        var integrationsArray = Object.keys(this._integrations);
        if (sdkInfo && integrationsArray.length > 0) {
            sdkInfo.integrations = integrationsArray;
        }
    };
    /**
     * Tells the backend to send this event
     * @param event The Sentry event to send
     */
    BaseClient.prototype._sendEvent = function (event) {
        this._getBackend().sendEvent(event);
    };
    /**
     * Processes an event (either error or message) and sends it to Sentry.
     *
     * This also adds breadcrumbs and context information to the event. However,
     * platform specific meta data (such as the User's IP address) must be added
     * by the SDK implementor.
     *
     *
     * @param event The event to send to Sentry.
     * @param hint May contain additional information about the original exception.
     * @param scope A scope containing event metadata.
     * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.
     */
    BaseClient.prototype._processEvent = function (event, hint, scope) {
        var _this = this;
        var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate;
        if (!this._isEnabled()) {
            return _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"].reject('SDK not enabled, will not send event.');
        }
        var isTransaction = event.type === 'transaction';
        // 1.0 === 100% events are sent
        // 0.0 === 0% events are sent
        // Sampling for transaction happens somewhere else
        if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {
            return _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"].reject('This event has been sampled, will not send event.');
        }
        return new _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"](function (resolve, reject) {
            _this._prepareEvent(event, scope, hint)
                .then(function (prepared) {
                if (prepared === null) {
                    reject('An event processor returned null, will not send event.');
                    return;
                }
                var finalEvent = prepared;
                var isInternalException = hint && hint.data && hint.data.__sentry__ === true;
                // We skip beforeSend in case of transactions
                if (isInternalException || !beforeSend || isTransaction) {
                    _this._sendEvent(finalEvent);
                    resolve(finalEvent);
                    return;
                }
                var beforeSendResult = beforeSend(prepared, hint);
                // tslint:disable-next-line:strict-type-predicates
                if (typeof beforeSendResult === 'undefined') {
                    _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('`beforeSend` method has to return `null` or a valid event.');
                }
                else if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isThenable"])(beforeSendResult)) {
                    _this._handleAsyncBeforeSend(beforeSendResult, resolve, reject);
                }
                else {
                    finalEvent = beforeSendResult;
                    if (finalEvent === null) {
                        _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].log('`beforeSend` returned `null`, will not send event.');
                        resolve(null);
                        return;
                    }
                    // From here on we are really async
                    _this._sendEvent(finalEvent);
                    resolve(finalEvent);
                }
            })
                .then(null, function (reason) {
                _this.captureException(reason, {
                    data: {
                        __sentry__: true,
                    },
                    originalException: reason,
                });
                reject("Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: " + reason);
            });
        });
    };
    /**
     * Resolves before send Promise and calls resolve/reject on parent SyncPromise.
     */
    BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) {
        var _this = this;
        beforeSend
            .then(function (processedEvent) {
            if (processedEvent === null) {
                reject('`beforeSend` returned `null`, will not send event.');
                return;
            }
            // From here on we are really async
            _this._sendEvent(processedEvent);
            resolve(processedEvent);
        })
            .then(null, function (e) {
            reject("beforeSend rejected with " + e);
        });
    };
    return BaseClient;
}());

//# sourceMappingURL=baseclient.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/index.js":
/*!************************************************!*\
  !*** ./node_modules/@sentry/core/esm/index.js ***!
  \************************************************/
/*! exports provided: addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, startTransaction, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, addGlobalEventProcessor, getCurrentHub, getHubFromCarrier, Hub, makeMain, Scope, API, BaseClient, BaseBackend, eventToSentryRequest, initAndBind, NoopTransport, Integrations */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/minimal */ "./node_modules/@sentry/minimal/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["addBreadcrumb"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["captureException"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["captureEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["captureMessage"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["configureScope"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["startTransaction"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setContext"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setExtra"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setExtras"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setTag"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setTags"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setUser"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["withScope"]; });

/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "makeMain", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["makeMain"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["Scope"]; });

/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./api */ "./node_modules/@sentry/core/esm/api.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "API", function() { return _api__WEBPACK_IMPORTED_MODULE_2__["API"]; });

/* harmony import */ var _baseclient__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./baseclient */ "./node_modules/@sentry/core/esm/baseclient.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseClient", function() { return _baseclient__WEBPACK_IMPORTED_MODULE_3__["BaseClient"]; });

/* harmony import */ var _basebackend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./basebackend */ "./node_modules/@sentry/core/esm/basebackend.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseBackend", function() { return _basebackend__WEBPACK_IMPORTED_MODULE_4__["BaseBackend"]; });

/* harmony import */ var _request__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./request */ "./node_modules/@sentry/core/esm/request.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eventToSentryRequest", function() { return _request__WEBPACK_IMPORTED_MODULE_5__["eventToSentryRequest"]; });

/* harmony import */ var _sdk__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdk */ "./node_modules/@sentry/core/esm/sdk.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "initAndBind", function() { return _sdk__WEBPACK_IMPORTED_MODULE_6__["initAndBind"]; });

/* harmony import */ var _transports_noop__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transports/noop */ "./node_modules/@sentry/core/esm/transports/noop.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NoopTransport", function() { return _transports_noop__WEBPACK_IMPORTED_MODULE_7__["NoopTransport"]; });

/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/core/esm/integrations/index.js");
/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "Integrations", function() { return _integrations__WEBPACK_IMPORTED_MODULE_8__; });










//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/integration.js":
/*!******************************************************!*\
  !*** ./node_modules/@sentry/core/esm/integration.js ***!
  \******************************************************/
/*! exports provided: installedIntegrations, getIntegrationsToSetup, setupIntegration, setupIntegrations */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installedIntegrations", function() { return installedIntegrations; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIntegrationsToSetup", function() { return getIntegrationsToSetup; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setupIntegration", function() { return setupIntegration; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setupIntegrations", function() { return setupIntegrations; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");



var installedIntegrations = [];
/** Gets integration to install */
function getIntegrationsToSetup(options) {
    var defaultIntegrations = (options.defaultIntegrations && tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](options.defaultIntegrations)) || [];
    var userIntegrations = options.integrations;
    var integrations = [];
    if (Array.isArray(userIntegrations)) {
        var userIntegrationsNames_1 = userIntegrations.map(function (i) { return i.name; });
        var pickedIntegrationsNames_1 = [];
        // Leave only unique default integrations, that were not overridden with provided user integrations
        defaultIntegrations.forEach(function (defaultIntegration) {
            if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 &&
                pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) {
                integrations.push(defaultIntegration);
                pickedIntegrationsNames_1.push(defaultIntegration.name);
            }
        });
        // Don't add same user integration twice
        userIntegrations.forEach(function (userIntegration) {
            if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) {
                integrations.push(userIntegration);
                pickedIntegrationsNames_1.push(userIntegration.name);
            }
        });
    }
    else if (typeof userIntegrations === 'function') {
        integrations = userIntegrations(defaultIntegrations);
        integrations = Array.isArray(integrations) ? integrations : [integrations];
    }
    else {
        integrations = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](defaultIntegrations);
    }
    // Make sure that if present, `Debug` integration will always run last
    var integrationsNames = integrations.map(function (i) { return i.name; });
    var alwaysLastToRun = 'Debug';
    if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {
        integrations.push.apply(integrations, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));
    }
    return integrations;
}
/** Setup given integration */
function setupIntegration(integration) {
    if (installedIntegrations.indexOf(integration.name) !== -1) {
        return;
    }
    integration.setupOnce(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"], _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]);
    installedIntegrations.push(integration.name);
    _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].log("Integration installed: " + integration.name);
}
/**
 * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default
 * integrations are added unless they were already provided before.
 * @param integrations array of integration instances
 * @param withDefault should enable default integrations
 */
function setupIntegrations(options) {
    var integrations = {};
    getIntegrationsToSetup(options).forEach(function (integration) {
        integrations[integration.name] = integration;
        setupIntegration(integration);
    });
    return integrations;
}
//# sourceMappingURL=integration.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/integrations/functiontostring.js":
/*!************************************************************************!*\
  !*** ./node_modules/@sentry/core/esm/integrations/functiontostring.js ***!
  \************************************************************************/
/*! exports provided: FunctionToString */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FunctionToString", function() { return FunctionToString; });
var originalFunctionToString;
/** Patch toString calls to return proper name for wrapped functions */
var FunctionToString = /** @class */ (function () {
    function FunctionToString() {
        /**
         * @inheritDoc
         */
        this.name = FunctionToString.id;
    }
    /**
     * @inheritDoc
     */
    FunctionToString.prototype.setupOnce = function () {
        originalFunctionToString = Function.prototype.toString;
        Function.prototype.toString = function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var context = this.__sentry_original__ || this;
            // tslint:disable-next-line:no-unsafe-any
            return originalFunctionToString.apply(context, args);
        };
    };
    /**
     * @inheritDoc
     */
    FunctionToString.id = 'FunctionToString';
    return FunctionToString;
}());

//# sourceMappingURL=functiontostring.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/integrations/inboundfilters.js":
/*!**********************************************************************!*\
  !*** ./node_modules/@sentry/core/esm/integrations/inboundfilters.js ***!
  \**********************************************************************/
/*! exports provided: InboundFilters */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InboundFilters", function() { return InboundFilters; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");



// "Script error." is hard coded into browsers for errors that it can't read.
// this is the result of a script being pulled in from an external domain and CORS.
var DEFAULT_IGNORE_ERRORS = [/^Script error\.?$/, /^Javascript error: Script error\.? on line 0$/];
/** Inbound filters configurable by the user */
var InboundFilters = /** @class */ (function () {
    function InboundFilters(_options) {
        if (_options === void 0) { _options = {}; }
        this._options = _options;
        /**
         * @inheritDoc
         */
        this.name = InboundFilters.id;
    }
    /**
     * @inheritDoc
     */
    InboundFilters.prototype.setupOnce = function () {
        Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"])(function (event) {
            var hub = Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
            if (!hub) {
                return event;
            }
            var self = hub.getIntegration(InboundFilters);
            if (self) {
                var client = hub.getClient();
                var clientOptions = client ? client.getOptions() : {};
                var options = self._mergeOptions(clientOptions);
                if (self._shouldDropEvent(event, options)) {
                    return null;
                }
            }
            return event;
        });
    };
    /** JSDoc */
    InboundFilters.prototype._shouldDropEvent = function (event, options) {
        if (this._isSentryError(event, options)) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to being internal Sentry Error.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
            return true;
        }
        if (this._isIgnoredError(event, options)) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
            return true;
        }
        if (this._isDeniedUrl(event, options)) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to being matched by `denyUrls` option.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event) + ".\nUrl: " + this._getEventFilterUrl(event));
            return true;
        }
        if (!this._isAllowedUrl(event, options)) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to not being matched by `allowUrls` option.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event) + ".\nUrl: " + this._getEventFilterUrl(event));
            return true;
        }
        return false;
    };
    /** JSDoc */
    InboundFilters.prototype._isSentryError = function (event, options) {
        if (!options.ignoreInternal) {
            return false;
        }
        try {
            return ((event &&
                event.exception &&
                event.exception.values &&
                event.exception.values[0] &&
                event.exception.values[0].type === 'SentryError') ||
                false);
        }
        catch (_oO) {
            return false;
        }
    };
    /** JSDoc */
    InboundFilters.prototype._isIgnoredError = function (event, options) {
        if (!options.ignoreErrors || !options.ignoreErrors.length) {
            return false;
        }
        return this._getPossibleEventMessages(event).some(function (message) {
            // Not sure why TypeScript complains here...
            return options.ignoreErrors.some(function (pattern) { return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isMatchingPattern"])(message, pattern); });
        });
    };
    /** JSDoc */
    InboundFilters.prototype._isDeniedUrl = function (event, options) {
        // TODO: Use Glob instead?
        if (!options.denyUrls || !options.denyUrls.length) {
            return false;
        }
        var url = this._getEventFilterUrl(event);
        return !url ? false : options.denyUrls.some(function (pattern) { return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isMatchingPattern"])(url, pattern); });
    };
    /** JSDoc */
    InboundFilters.prototype._isAllowedUrl = function (event, options) {
        // TODO: Use Glob instead?
        if (!options.allowUrls || !options.allowUrls.length) {
            return true;
        }
        var url = this._getEventFilterUrl(event);
        return !url ? true : options.allowUrls.some(function (pattern) { return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isMatchingPattern"])(url, pattern); });
    };
    /** JSDoc */
    InboundFilters.prototype._mergeOptions = function (clientOptions) {
        if (clientOptions === void 0) { clientOptions = {}; }
        // tslint:disable:deprecation
        return {
            allowUrls: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((this._options.whitelistUrls || []), (this._options.allowUrls || []), (clientOptions.whitelistUrls || []), (clientOptions.allowUrls || [])),
            denyUrls: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((this._options.blacklistUrls || []), (this._options.denyUrls || []), (clientOptions.blacklistUrls || []), (clientOptions.denyUrls || [])),
            ignoreErrors: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((this._options.ignoreErrors || []), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS),
            ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,
        };
    };
    /** JSDoc */
    InboundFilters.prototype._getPossibleEventMessages = function (event) {
        if (event.message) {
            return [event.message];
        }
        if (event.exception) {
            try {
                var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c;
                return ["" + value, type + ": " + value];
            }
            catch (oO) {
                _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Cannot extract message for event " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
                return [];
            }
        }
        return [];
    };
    /** JSDoc */
    InboundFilters.prototype._getEventFilterUrl = function (event) {
        try {
            if (event.stacktrace) {
                var frames_1 = event.stacktrace.frames;
                return (frames_1 && frames_1[frames_1.length - 1].filename) || null;
            }
            if (event.exception) {
                var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;
                return (frames_2 && frames_2[frames_2.length - 1].filename) || null;
            }
            return null;
        }
        catch (oO) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Cannot extract url for event " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
            return null;
        }
    };
    /**
     * @inheritDoc
     */
    InboundFilters.id = 'InboundFilters';
    return InboundFilters;
}());

//# sourceMappingURL=inboundfilters.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/integrations/index.js":
/*!*************************************************************!*\
  !*** ./node_modules/@sentry/core/esm/integrations/index.js ***!
  \*************************************************************/
/*! exports provided: FunctionToString, InboundFilters */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _functiontostring__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functiontostring */ "./node_modules/@sentry/core/esm/integrations/functiontostring.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FunctionToString", function() { return _functiontostring__WEBPACK_IMPORTED_MODULE_0__["FunctionToString"]; });

/* harmony import */ var _inboundfilters__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./inboundfilters */ "./node_modules/@sentry/core/esm/integrations/inboundfilters.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "InboundFilters", function() { return _inboundfilters__WEBPACK_IMPORTED_MODULE_1__["InboundFilters"]; });



//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/request.js":
/*!**************************************************!*\
  !*** ./node_modules/@sentry/core/esm/request.js ***!
  \**************************************************/
/*! exports provided: eventToSentryRequest */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventToSentryRequest", function() { return eventToSentryRequest; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");

/** Creates a SentryRequest from an event. */
function eventToSentryRequest(event, api) {
    var useEnvelope = event.type === 'transaction';
    var req = {
        body: JSON.stringify(event),
        url: useEnvelope ? api.getEnvelopeEndpointWithUrlEncodedAuth() : api.getStoreEndpointWithUrlEncodedAuth(),
    };
    // https://develop.sentry.dev/sdk/envelopes/
    // Since we don't need to manipulate envelopes nor store them, there is no
    // exported concept of an Envelope with operations including serialization and
    // deserialization. Instead, we only implement a minimal subset of the spec to
    // serialize events inline here.
    if (useEnvelope) {
        var envelopeHeaders = JSON.stringify({
            event_id: event.event_id,
            // We need to add * 1000 since we divide it by 1000 by default but JS works with ms precision
            // The reason we use timestampWithMs here is that all clocks across the SDK use the same clock
            sent_at: new Date(Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["timestampWithMs"])() * 1000).toISOString(),
        });
        var itemHeaders = JSON.stringify({
            type: event.type,
        });
        // The trailing newline is optional. We intentionally don't send it to avoid
        // sending unnecessary bytes.
        //
        // const envelope = `${envelopeHeaders}\n${itemHeaders}\n${req.body}\n`;
        var envelope = envelopeHeaders + "\n" + itemHeaders + "\n" + req.body;
        req.body = envelope;
    }
    return req;
}
//# sourceMappingURL=request.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/sdk.js":
/*!**********************************************!*\
  !*** ./node_modules/@sentry/core/esm/sdk.js ***!
  \**********************************************/
/*! exports provided: initAndBind */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initAndBind", function() { return initAndBind; });
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");


/**
 * Internal function to create a new SDK client instance. The client is
 * installed and then bound to the current scope.
 *
 * @param clientClass The client class to instanciate.
 * @param options Options to pass to the client.
 */
function initAndBind(clientClass, options) {
    if (options.debug === true) {
        _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["logger"].enable();
    }
    var hub = Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])();
    var client = new clientClass(options);
    hub.bindClient(client);
}
//# sourceMappingURL=sdk.js.map

/***/ }),

/***/ "./node_modules/@sentry/core/esm/transports/noop.js":
/*!**********************************************************!*\
  !*** ./node_modules/@sentry/core/esm/transports/noop.js ***!
  \**********************************************************/
/*! exports provided: NoopTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NoopTransport", function() { return NoopTransport; });
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");


/** Noop transport */
var NoopTransport = /** @class */ (function () {
    function NoopTransport() {
    }
    /**
     * @inheritDoc
     */
    NoopTransport.prototype.sendEvent = function (_) {
        return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].resolve({
            reason: "NoopTransport: Event has been skipped because no Dsn is configured.",
            status: _sentry_types__WEBPACK_IMPORTED_MODULE_0__["Status"].Skipped,
        });
    };
    /**
     * @inheritDoc
     */
    NoopTransport.prototype.close = function (_) {
        return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].resolve(true);
    };
    return NoopTransport;
}());

//# sourceMappingURL=noop.js.map

/***/ }),

/***/ "./node_modules/@sentry/hub/esm/hub.js":
/*!*********************************************!*\
  !*** ./node_modules/@sentry/hub/esm/hub.js ***!
  \*********************************************/
/*! exports provided: API_VERSION, Hub, getMainCarrier, makeMain, getCurrentHub, getHubFromCarrier, setHubOnCarrier */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "API_VERSION", function() { return API_VERSION; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return Hub; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMainCarrier", function() { return getMainCarrier; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "makeMain", function() { return makeMain; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return getCurrentHub; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return getHubFromCarrier; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setHubOnCarrier", function() { return setHubOnCarrier; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _scope__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./scope */ "./node_modules/@sentry/hub/esm/scope.js");



/**
 * API compatibility version of this hub.
 *
 * WARNING: This number should only be incresed when the global interface
 * changes a and new methods are introduced.
 *
 * @hidden
 */
var API_VERSION = 3;
/**
 * Default maximum number of breadcrumbs added to an event. Can be overwritten
 * with {@link Options.maxBreadcrumbs}.
 */
var DEFAULT_BREADCRUMBS = 100;
/**
 * Absolute maximum number of breadcrumbs added to an event. The
 * `maxBreadcrumbs` option cannot be higher than this value.
 */
var MAX_BREADCRUMBS = 100;
/**
 * @inheritDoc
 */
var Hub = /** @class */ (function () {
    /**
     * Creates a new instance of the hub, will push one {@link Layer} into the
     * internal stack on creation.
     *
     * @param client bound to the hub.
     * @param scope bound to the hub.
     * @param version number, higher number means higher priority.
     */
    function Hub(client, scope, _version) {
        if (scope === void 0) { scope = new _scope__WEBPACK_IMPORTED_MODULE_2__["Scope"](); }
        if (_version === void 0) { _version = API_VERSION; }
        this._version = _version;
        /** Is a {@link Layer}[] containing the client and scope */
        this._stack = [];
        this._stack.push({ client: client, scope: scope });
        this.bindClient(client);
    }
    /**
     * Internal helper function to call a method on the top client if it exists.
     *
     * @param method The method to call on the client.
     * @param args Arguments to pass to the client function.
     */
    Hub.prototype._invokeClient = function (method) {
        var _a;
        var args = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            args[_i - 1] = arguments[_i];
        }
        var top = this.getStackTop();
        if (top && top.client && top.client[method]) {
            (_a = top.client)[method].apply(_a, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args, [top.scope]));
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.isOlderThan = function (version) {
        return this._version < version;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.bindClient = function (client) {
        var top = this.getStackTop();
        top.client = client;
        if (client && client.setupIntegrations) {
            client.setupIntegrations();
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.pushScope = function () {
        // We want to clone the content of prev scope
        var stack = this.getStack();
        var parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined;
        var scope = _scope__WEBPACK_IMPORTED_MODULE_2__["Scope"].clone(parentScope);
        this.getStack().push({
            client: this.getClient(),
            scope: scope,
        });
        return scope;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.popScope = function () {
        return this.getStack().pop() !== undefined;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.withScope = function (callback) {
        var scope = this.pushScope();
        try {
            callback(scope);
        }
        finally {
            this.popScope();
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.getClient = function () {
        return this.getStackTop().client;
    };
    /** Returns the scope of the top stack. */
    Hub.prototype.getScope = function () {
        return this.getStackTop().scope;
    };
    /** Returns the scope stack for domains or the process. */
    Hub.prototype.getStack = function () {
        return this._stack;
    };
    /** Returns the topmost scope layer in the order domain > local > process. */
    Hub.prototype.getStackTop = function () {
        return this._stack[this._stack.length - 1];
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.captureException = function (exception, hint) {
        var eventId = (this._lastEventId = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["uuid4"])());
        var finalHint = hint;
        // If there's no explicit hint provided, mimick the same thing that would happen
        // in the minimal itself to create a consistent behavior.
        // We don't do this in the client, as it's the lowest level API, and doing this,
        // would prevent user from having full control over direct calls.
        if (!hint) {
            var syntheticException = void 0;
            try {
                throw new Error('Sentry syntheticException');
            }
            catch (exception) {
                syntheticException = exception;
            }
            finalHint = {
                originalException: exception,
                syntheticException: syntheticException,
            };
        }
        this._invokeClient('captureException', exception, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, finalHint, { event_id: eventId }));
        return eventId;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.captureMessage = function (message, level, hint) {
        var eventId = (this._lastEventId = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["uuid4"])());
        var finalHint = hint;
        // If there's no explicit hint provided, mimick the same thing that would happen
        // in the minimal itself to create a consistent behavior.
        // We don't do this in the client, as it's the lowest level API, and doing this,
        // would prevent user from having full control over direct calls.
        if (!hint) {
            var syntheticException = void 0;
            try {
                throw new Error(message);
            }
            catch (exception) {
                syntheticException = exception;
            }
            finalHint = {
                originalException: message,
                syntheticException: syntheticException,
            };
        }
        this._invokeClient('captureMessage', message, level, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, finalHint, { event_id: eventId }));
        return eventId;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.captureEvent = function (event, hint) {
        var eventId = (this._lastEventId = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["uuid4"])());
        this._invokeClient('captureEvent', event, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, hint, { event_id: eventId }));
        return eventId;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.lastEventId = function () {
        return this._lastEventId;
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {
        var top = this.getStackTop();
        if (!top.scope || !top.client) {
            return;
        }
        var _a = (top.client.getOptions && top.client.getOptions()) || {}, _b = _a.beforeBreadcrumb, beforeBreadcrumb = _b === void 0 ? null : _b, _c = _a.maxBreadcrumbs, maxBreadcrumbs = _c === void 0 ? DEFAULT_BREADCRUMBS : _c;
        if (maxBreadcrumbs <= 0) {
            return;
        }
        var timestamp = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["timestampWithMs"])();
        var mergedBreadcrumb = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ timestamp: timestamp }, breadcrumb);
        var finalBreadcrumb = beforeBreadcrumb
            ? Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["consoleSandbox"])(function () { return beforeBreadcrumb(mergedBreadcrumb, hint); })
            : mergedBreadcrumb;
        if (finalBreadcrumb === null) {
            return;
        }
        top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setUser = function (user) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setUser(user);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setTags = function (tags) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setTags(tags);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setExtras = function (extras) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setExtras(extras);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setTag = function (key, value) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setTag(key, value);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setExtra = function (key, extra) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setExtra(key, extra);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.setContext = function (name, context) {
        var top = this.getStackTop();
        if (!top.scope) {
            return;
        }
        top.scope.setContext(name, context);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.configureScope = function (callback) {
        var top = this.getStackTop();
        if (top.scope && top.client) {
            callback(top.scope);
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.run = function (callback) {
        var oldHub = makeMain(this);
        try {
            callback(this);
        }
        finally {
            makeMain(oldHub);
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.getIntegration = function (integration) {
        var client = this.getClient();
        if (!client) {
            return null;
        }
        try {
            return client.getIntegration(integration);
        }
        catch (_oO) {
            _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["logger"].warn("Cannot retrieve integration " + integration.id + " from the current Hub");
            return null;
        }
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.startSpan = function (context) {
        return this._callExtensionMethod('startSpan', context);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.startTransaction = function (context) {
        return this._callExtensionMethod('startTransaction', context);
    };
    /**
     * @inheritDoc
     */
    Hub.prototype.traceHeaders = function () {
        return this._callExtensionMethod('traceHeaders');
    };
    /**
     * Calls global extension method and binding current instance to the function call
     */
    // @ts-ignore
    Hub.prototype._callExtensionMethod = function (method) {
        var args = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            args[_i - 1] = arguments[_i];
        }
        var carrier = getMainCarrier();
        var sentry = carrier.__SENTRY__;
        // tslint:disable-next-line: strict-type-predicates
        if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {
            return sentry.extensions[method].apply(this, args);
        }
        _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["logger"].warn("Extension method " + method + " couldn't be found, doing nothing.");
    };
    return Hub;
}());

/** Returns the global shim registry. */
function getMainCarrier() {
    var carrier = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
    carrier.__SENTRY__ = carrier.__SENTRY__ || {
        extensions: {},
        hub: undefined,
    };
    return carrier;
}
/**
 * Replaces the current main hub with the passed one on the global object
 *
 * @returns The old replaced hub
 */
function makeMain(hub) {
    var registry = getMainCarrier();
    var oldHub = getHubFromCarrier(registry);
    setHubOnCarrier(registry, hub);
    return oldHub;
}
/**
 * Returns the default hub instance.
 *
 * If a hub is already registered in the global carrier but this module
 * contains a more recent version, it replaces the registered version.
 * Otherwise, the currently registered hub will be returned.
 */
function getCurrentHub() {
    // Get main carrier (global for every environment)
    var registry = getMainCarrier();
    // If there's no hub, or its an old API, assign a new one
    if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {
        setHubOnCarrier(registry, new Hub());
    }
    // Prefer domains over global if they are there (applicable only to Node environment)
    if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["isNodeEnv"])()) {
        return getHubFromActiveDomain(registry);
    }
    // Return hub that lives on a global object
    return getHubFromCarrier(registry);
}
/**
 * Try to read the hub from an active domain, fallback to the registry if one doesnt exist
 * @returns discovered hub
 */
function getHubFromActiveDomain(registry) {
    try {
        var property = 'domain';
        var carrier = getMainCarrier();
        var sentry = carrier.__SENTRY__;
        // tslint:disable-next-line: strict-type-predicates
        if (!sentry || !sentry.extensions || !sentry.extensions[property]) {
            return getHubFromCarrier(registry);
        }
        var domain = sentry.extensions[property];
        var activeDomain = domain.active;
        // If there no active domain, just return global hub
        if (!activeDomain) {
            return getHubFromCarrier(registry);
        }
        // If there's no hub on current domain, or its an old API, assign a new one
        if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {
            var registryHubTopStack = getHubFromCarrier(registry).getStackTop();
            setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, _scope__WEBPACK_IMPORTED_MODULE_2__["Scope"].clone(registryHubTopStack.scope)));
        }
        // Return hub that lives on a domain
        return getHubFromCarrier(activeDomain);
    }
    catch (_Oo) {
        // Return hub that lives on a global object
        return getHubFromCarrier(registry);
    }
}
/**
 * This will tell whether a carrier has a hub on it or not
 * @param carrier object
 */
function hasHubOnCarrier(carrier) {
    if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {
        return true;
    }
    return false;
}
/**
 * This will create a new {@link Hub} and add to the passed object on
 * __SENTRY__.hub.
 * @param carrier object
 * @hidden
 */
function getHubFromCarrier(carrier) {
    if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {
        return carrier.__SENTRY__.hub;
    }
    carrier.__SENTRY__ = carrier.__SENTRY__ || {};
    carrier.__SENTRY__.hub = new Hub();
    return carrier.__SENTRY__.hub;
}
/**
 * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute
 * @param carrier object
 * @param hub Hub
 */
function setHubOnCarrier(carrier, hub) {
    if (!carrier) {
        return false;
    }
    carrier.__SENTRY__ = carrier.__SENTRY__ || {};
    carrier.__SENTRY__.hub = hub;
    return true;
}
//# sourceMappingURL=hub.js.map

/***/ }),

/***/ "./node_modules/@sentry/hub/esm/index.js":
/*!***********************************************!*\
  !*** ./node_modules/@sentry/hub/esm/index.js ***!
  \***********************************************/
/*! exports provided: addGlobalEventProcessor, Scope, getCurrentHub, getHubFromCarrier, getMainCarrier, Hub, makeMain, setHubOnCarrier */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _scope__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scope */ "./node_modules/@sentry/hub/esm/scope.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _scope__WEBPACK_IMPORTED_MODULE_0__["addGlobalEventProcessor"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _scope__WEBPACK_IMPORTED_MODULE_0__["Scope"]; });

/* harmony import */ var _hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hub */ "./node_modules/@sentry/hub/esm/hub.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getMainCarrier", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["getMainCarrier"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "makeMain", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["makeMain"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setHubOnCarrier", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["setHubOnCarrier"]; });



//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/hub/esm/scope.js":
/*!***********************************************!*\
  !*** ./node_modules/@sentry/hub/esm/scope.js ***!
  \***********************************************/
/*! exports provided: Scope, addGlobalEventProcessor */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return Scope; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return addGlobalEventProcessor; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");


/**
 * Holds additional event information. {@link Scope.applyToEvent} will be
 * called by the client before an event will be sent.
 */
var Scope = /** @class */ (function () {
    function Scope() {
        /** Flag if notifiying is happening. */
        this._notifyingListeners = false;
        /** Callback for client to receive scope changes. */
        this._scopeListeners = [];
        /** Callback list that will be called after {@link applyToEvent}. */
        this._eventProcessors = [];
        /** Array of breadcrumbs. */
        this._breadcrumbs = [];
        /** User */
        this._user = {};
        /** Tags */
        this._tags = {};
        /** Extra */
        this._extra = {};
        /** Contexts */
        this._contexts = {};
    }
    /**
     * Add internal on change listener. Used for sub SDKs that need to store the scope.
     * @hidden
     */
    Scope.prototype.addScopeListener = function (callback) {
        this._scopeListeners.push(callback);
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.addEventProcessor = function (callback) {
        this._eventProcessors.push(callback);
        return this;
    };
    /**
     * This will be called on every set call.
     */
    Scope.prototype._notifyScopeListeners = function () {
        var _this = this;
        if (!this._notifyingListeners) {
            this._notifyingListeners = true;
            setTimeout(function () {
                _this._scopeListeners.forEach(function (callback) {
                    callback(_this);
                });
                _this._notifyingListeners = false;
            });
        }
    };
    /**
     * This will be called after {@link applyToEvent} is finished.
     */
    Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {
        var _this = this;
        if (index === void 0) { index = 0; }
        return new _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"](function (resolve, reject) {
            var processor = processors[index];
            // tslint:disable-next-line:strict-type-predicates
            if (event === null || typeof processor !== 'function') {
                resolve(event);
            }
            else {
                var result = processor(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event), hint);
                if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["isThenable"])(result)) {
                    result
                        .then(function (final) { return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); })
                        .then(null, reject);
                }
                else {
                    _this._notifyEventProcessors(processors, result, hint, index + 1)
                        .then(resolve)
                        .then(null, reject);
                }
            }
        });
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setUser = function (user) {
        this._user = user || {};
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setTags = function (tags) {
        this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, tags);
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setTag = function (key, value) {
        var _a;
        this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, (_a = {}, _a[key] = value, _a));
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setExtras = function (extras) {
        this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, extras);
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setExtra = function (key, extra) {
        var _a;
        this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, (_a = {}, _a[key] = extra, _a));
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setFingerprint = function (fingerprint) {
        this._fingerprint = fingerprint;
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setLevel = function (level) {
        this._level = level;
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setTransactionName = function (name) {
        this._transactionName = name;
        this._notifyScopeListeners();
        return this;
    };
    /**
     * Can be removed in major version.
     * @deprecated in favor of {@link this.setTransactionName}
     */
    Scope.prototype.setTransaction = function (name) {
        return this.setTransactionName(name);
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setContext = function (key, context) {
        var _a;
        this._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, (_a = {}, _a[key] = context, _a));
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.setSpan = function (span) {
        this._span = span;
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.getSpan = function () {
        return this._span;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.getTransaction = function () {
        var span = this.getSpan();
        if (span && span.spanRecorder && span.spanRecorder.spans[0]) {
            return span.spanRecorder.spans[0];
        }
        return undefined;
    };
    /**
     * Inherit values from the parent scope.
     * @param scope to clone.
     */
    Scope.clone = function (scope) {
        var newScope = new Scope();
        if (scope) {
            newScope._breadcrumbs = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](scope._breadcrumbs);
            newScope._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, scope._tags);
            newScope._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, scope._extra);
            newScope._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, scope._contexts);
            newScope._user = scope._user;
            newScope._level = scope._level;
            newScope._span = scope._span;
            newScope._transactionName = scope._transactionName;
            newScope._fingerprint = scope._fingerprint;
            newScope._eventProcessors = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](scope._eventProcessors);
        }
        return newScope;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.update = function (captureContext) {
        if (!captureContext) {
            return this;
        }
        if (typeof captureContext === 'function') {
            var updatedScope = captureContext(this);
            return updatedScope instanceof Scope ? updatedScope : this;
        }
        if (captureContext instanceof Scope) {
            this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, captureContext._tags);
            this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, captureContext._extra);
            this._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, captureContext._contexts);
            if (captureContext._user) {
                this._user = captureContext._user;
            }
            if (captureContext._level) {
                this._level = captureContext._level;
            }
            if (captureContext._fingerprint) {
                this._fingerprint = captureContext._fingerprint;
            }
        }
        else if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["isPlainObject"])(captureContext)) {
            // tslint:disable-next-line:no-parameter-reassignment
            captureContext = captureContext;
            this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, captureContext.tags);
            this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, captureContext.extra);
            this._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, captureContext.contexts);
            if (captureContext.user) {
                this._user = captureContext.user;
            }
            if (captureContext.level) {
                this._level = captureContext.level;
            }
            if (captureContext.fingerprint) {
                this._fingerprint = captureContext.fingerprint;
            }
        }
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.clear = function () {
        this._breadcrumbs = [];
        this._tags = {};
        this._extra = {};
        this._user = {};
        this._contexts = {};
        this._level = undefined;
        this._transactionName = undefined;
        this._fingerprint = undefined;
        this._span = undefined;
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {
        var mergedBreadcrumb = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ timestamp: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["timestampWithMs"])() }, breadcrumb);
        this._breadcrumbs =
            maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0
                ? tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](this._breadcrumbs, [mergedBreadcrumb]).slice(-maxBreadcrumbs)
                : tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](this._breadcrumbs, [mergedBreadcrumb]);
        this._notifyScopeListeners();
        return this;
    };
    /**
     * @inheritDoc
     */
    Scope.prototype.clearBreadcrumbs = function () {
        this._breadcrumbs = [];
        this._notifyScopeListeners();
        return this;
    };
    /**
     * Applies fingerprint from the scope to the event if there's one,
     * uses message if there's one instead or get rid of empty fingerprint
     */
    Scope.prototype._applyFingerprint = function (event) {
        // Make sure it's an array first and we actually have something in place
        event.fingerprint = event.fingerprint
            ? Array.isArray(event.fingerprint)
                ? event.fingerprint
                : [event.fingerprint]
            : [];
        // If we have something on the scope, then merge it with event
        if (this._fingerprint) {
            event.fingerprint = event.fingerprint.concat(this._fingerprint);
        }
        // If we have no data at all, remove empty array default
        if (event.fingerprint && !event.fingerprint.length) {
            delete event.fingerprint;
        }
    };
    /**
     * Applies the current context and fingerprint to the event.
     * Note that breadcrumbs will be added by the client.
     * Also if the event has already breadcrumbs on it, we do not merge them.
     * @param event Event
     * @param hint May contain additional informartion about the original exception.
     * @hidden
     */
    Scope.prototype.applyToEvent = function (event, hint) {
        if (this._extra && Object.keys(this._extra).length) {
            event.extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, event.extra);
        }
        if (this._tags && Object.keys(this._tags).length) {
            event.tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, event.tags);
        }
        if (this._user && Object.keys(this._user).length) {
            event.user = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._user, event.user);
        }
        if (this._contexts && Object.keys(this._contexts).length) {
            event.contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, event.contexts);
        }
        if (this._level) {
            event.level = this._level;
        }
        if (this._transactionName) {
            event.transaction = this._transactionName;
        }
        // We want to set the trace context for normal events only if there isn't already
        // a trace context on the event. There is a product feature in place where we link
        // errors with transaction and it relys on that.
        if (this._span) {
            event.contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ trace: this._span.getTraceContext() }, event.contexts);
        }
        this._applyFingerprint(event);
        event.breadcrumbs = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((event.breadcrumbs || []), this._breadcrumbs);
        event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;
        return this._notifyEventProcessors(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](getGlobalEventProcessors(), this._eventProcessors), event, hint);
    };
    return Scope;
}());

/**
 * Retruns the global event processors.
 */
function getGlobalEventProcessors() {
    var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
    global.__SENTRY__ = global.__SENTRY__ || {};
    global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];
    return global.__SENTRY__.globalEventProcessors;
}
/**
 * Add a EventProcessor to be kept globally.
 * @param callback EventProcessor to add
 */
function addGlobalEventProcessor(callback) {
    getGlobalEventProcessors().push(callback);
}
//# sourceMappingURL=scope.js.map

/***/ }),

/***/ "./node_modules/@sentry/minimal/esm/index.js":
/*!***************************************************!*\
  !*** ./node_modules/@sentry/minimal/esm/index.js ***!
  \***************************************************/
/*! exports provided: captureException, captureMessage, captureEvent, configureScope, addBreadcrumb, setContext, setExtras, setTags, setExtra, setTag, setUser, withScope, _callOnClient, startTransaction */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return captureException; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return captureMessage; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return captureEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return configureScope; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return addBreadcrumb; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return setContext; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return setExtras; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return setTags; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return setExtra; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return setTag; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return setUser; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return withScope; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_callOnClient", function() { return _callOnClient; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return startTransaction; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");


/**
 * This calls a function on the current hub.
 * @param method function to call on hub.
 * @param args to pass to function.
 */
function callOnHub(method) {
    var args = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        args[_i - 1] = arguments[_i];
    }
    var hub = Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
    if (hub && hub[method]) {
        // tslint:disable-next-line:no-unsafe-any
        return hub[method].apply(hub, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
    }
    throw new Error("No hub defined or " + method + " was not found on the hub, please open a bug report.");
}
/**
 * Captures an exception event and sends it to Sentry.
 *
 * @param exception An exception-like object.
 * @returns The generated eventId.
 */
function captureException(exception, captureContext) {
    var syntheticException;
    try {
        throw new Error('Sentry syntheticException');
    }
    catch (exception) {
        syntheticException = exception;
    }
    return callOnHub('captureException', exception, {
        captureContext: captureContext,
        originalException: exception,
        syntheticException: syntheticException,
    });
}
/**
 * Captures a message event and sends it to Sentry.
 *
 * @param message The message to send to Sentry.
 * @param level Define the level of the message.
 * @returns The generated eventId.
 */
function captureMessage(message, captureContext) {
    var syntheticException;
    try {
        throw new Error(message);
    }
    catch (exception) {
        syntheticException = exception;
    }
    // This is necessary to provide explicit scopes upgrade, without changing the original
    // arrity of the `captureMessage(message, level)` method.
    var level = typeof captureContext === 'string' ? captureContext : undefined;
    var context = typeof captureContext !== 'string' ? { captureContext: captureContext } : undefined;
    return callOnHub('captureMessage', message, level, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ originalException: message, syntheticException: syntheticException }, context));
}
/**
 * Captures a manually created event and sends it to Sentry.
 *
 * @param event The event to send to Sentry.
 * @returns The generated eventId.
 */
function captureEvent(event) {
    return callOnHub('captureEvent', event);
}
/**
 * Callback to set context information onto the scope.
 * @param callback Callback function that receives Scope.
 */
function configureScope(callback) {
    callOnHub('configureScope', callback);
}
/**
 * Records a new breadcrumb which will be attached to future events.
 *
 * Breadcrumbs will be added to subsequent events to provide more context on
 * user's actions prior to an error or crash.
 *
 * @param breadcrumb The breadcrumb to record.
 */
function addBreadcrumb(breadcrumb) {
    callOnHub('addBreadcrumb', breadcrumb);
}
/**
 * Sets context data with the given name.
 * @param name of the context
 * @param context Any kind of data. This data will be normalized.
 */
function setContext(name, context) {
    callOnHub('setContext', name, context);
}
/**
 * Set an object that will be merged sent as extra data with the event.
 * @param extras Extras object to merge into current context.
 */
function setExtras(extras) {
    callOnHub('setExtras', extras);
}
/**
 * Set an object that will be merged sent as tags data with the event.
 * @param tags Tags context object to merge into current context.
 */
function setTags(tags) {
    callOnHub('setTags', tags);
}
/**
 * Set key:value that will be sent as extra data with the event.
 * @param key String of extra
 * @param extra Any kind of data. This data will be normalized.
 */
function setExtra(key, extra) {
    callOnHub('setExtra', key, extra);
}
/**
 * Set key:value that will be sent as tags data with the event.
 * @param key String key of tag
 * @param value String value of tag
 */
function setTag(key, value) {
    callOnHub('setTag', key, value);
}
/**
 * Updates user context information for future events.
 *
 * @param user User context object to be set in the current context. Pass `null` to unset the user.
 */
function setUser(user) {
    callOnHub('setUser', user);
}
/**
 * Creates a new scope with and executes the given operation within.
 * The scope is automatically removed once the operation
 * finishes or throws.
 *
 * This is essentially a convenience function for:
 *
 *     pushScope();
 *     callback();
 *     popScope();
 *
 * @param callback that will be enclosed into push/popScope.
 */
function withScope(callback) {
    callOnHub('withScope', callback);
}
/**
 * Calls a function on the latest client. Use this with caution, it's meant as
 * in "internal" helper so we don't need to expose every possible function in
 * the shim. It is not guaranteed that the client actually implements the
 * function.
 *
 * @param method The method to call on the client/client.
 * @param args Arguments to pass to the client/fontend.
 * @hidden
 */
function _callOnClient(method) {
    var args = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        args[_i - 1] = arguments[_i];
    }
    callOnHub.apply(void 0, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](['_invokeClient', method], args));
}
/**
 * Starts a new `Transaction` and returns it. This is the entry point to manual
 * tracing instrumentation.
 *
 * A tree structure can be built by adding child spans to the transaction, and
 * child spans to other spans. To start a new child span within the transaction
 * or any span, call the respective `.startChild()` method.
 *
 * Every child span must be finished before the transaction is finished,
 * otherwise the unfinished spans are discarded.
 *
 * The transaction must be finished with a call to its `.finish()` method, at
 * which point the transaction with all its finished child spans will be sent to
 * Sentry.
 *
 * @param context Properties of the new `Transaction`.
 */
function startTransaction(context) {
    return callOnHub('startTransaction', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, context));
}
//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/types/esm/index.js":
/*!*************************************************!*\
  !*** ./node_modules/@sentry/types/esm/index.js ***!
  \*************************************************/
/*! exports provided: LogLevel, Severity, Status */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loglevel */ "./node_modules/@sentry/types/esm/loglevel.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return _loglevel__WEBPACK_IMPORTED_MODULE_0__["LogLevel"]; });

/* harmony import */ var _severity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./severity */ "./node_modules/@sentry/types/esm/severity.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return _severity__WEBPACK_IMPORTED_MODULE_1__["Severity"]; });

/* harmony import */ var _status__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./status */ "./node_modules/@sentry/types/esm/status.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return _status__WEBPACK_IMPORTED_MODULE_2__["Status"]; });




//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/types/esm/loglevel.js":
/*!****************************************************!*\
  !*** ./node_modules/@sentry/types/esm/loglevel.js ***!
  \****************************************************/
/*! exports provided: LogLevel */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return LogLevel; });
/** Console logging verbosity for the SDK. */
var LogLevel;
(function (LogLevel) {
    /** No logs will be generated. */
    LogLevel[LogLevel["None"] = 0] = "None";
    /** Only SDK internal errors will be logged. */
    LogLevel[LogLevel["Error"] = 1] = "Error";
    /** Information useful for debugging the SDK will be logged. */
    LogLevel[LogLevel["Debug"] = 2] = "Debug";
    /** All SDK actions will be logged. */
    LogLevel[LogLevel["Verbose"] = 3] = "Verbose";
})(LogLevel || (LogLevel = {}));
//# sourceMappingURL=loglevel.js.map

/***/ }),

/***/ "./node_modules/@sentry/types/esm/severity.js":
/*!****************************************************!*\
  !*** ./node_modules/@sentry/types/esm/severity.js ***!
  \****************************************************/
/*! exports provided: Severity */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return Severity; });
/** JSDoc */
var Severity;
(function (Severity) {
    /** JSDoc */
    Severity["Fatal"] = "fatal";
    /** JSDoc */
    Severity["Error"] = "error";
    /** JSDoc */
    Severity["Warning"] = "warning";
    /** JSDoc */
    Severity["Log"] = "log";
    /** JSDoc */
    Severity["Info"] = "info";
    /** JSDoc */
    Severity["Debug"] = "debug";
    /** JSDoc */
    Severity["Critical"] = "critical";
})(Severity || (Severity = {}));
// tslint:disable:completed-docs
// tslint:disable:no-unnecessary-qualifier no-namespace
(function (Severity) {
    /**
     * Converts a string-based level into a {@link Severity}.
     *
     * @param level string representation of Severity
     * @returns Severity
     */
    function fromString(level) {
        switch (level) {
            case 'debug':
                return Severity.Debug;
            case 'info':
                return Severity.Info;
            case 'warn':
            case 'warning':
                return Severity.Warning;
            case 'error':
                return Severity.Error;
            case 'fatal':
                return Severity.Fatal;
            case 'critical':
                return Severity.Critical;
            case 'log':
            default:
                return Severity.Log;
        }
    }
    Severity.fromString = fromString;
})(Severity || (Severity = {}));
//# sourceMappingURL=severity.js.map

/***/ }),

/***/ "./node_modules/@sentry/types/esm/status.js":
/*!**************************************************!*\
  !*** ./node_modules/@sentry/types/esm/status.js ***!
  \**************************************************/
/*! exports provided: Status */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return Status; });
/** The status of an event. */
var Status;
(function (Status) {
    /** The status could not be determined. */
    Status["Unknown"] = "unknown";
    /** The event was skipped due to configuration or callbacks. */
    Status["Skipped"] = "skipped";
    /** The event was sent to Sentry successfully. */
    Status["Success"] = "success";
    /** The client is currently rate limited and will try again later. */
    Status["RateLimit"] = "rate_limit";
    /** The event could not be processed. */
    Status["Invalid"] = "invalid";
    /** A server-side error ocurred during submission. */
    Status["Failed"] = "failed";
})(Status || (Status = {}));
// tslint:disable:completed-docs
// tslint:disable:no-unnecessary-qualifier no-namespace
(function (Status) {
    /**
     * Converts a HTTP status code into a {@link Status}.
     *
     * @param code The HTTP response status code.
     * @returns The send status or {@link Status.Unknown}.
     */
    function fromHttpCode(code) {
        if (code >= 200 && code < 300) {
            return Status.Success;
        }
        if (code === 429) {
            return Status.RateLimit;
        }
        if (code >= 400 && code < 500) {
            return Status.Invalid;
        }
        if (code >= 500) {
            return Status.Failed;
        }
        return Status.Unknown;
    }
    Status.fromHttpCode = fromHttpCode;
})(Status || (Status = {}));
//# sourceMappingURL=status.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/async.js":
/*!*************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/async.js ***!
  \*************************************************/
/*! exports provided: forget */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forget", function() { return forget; });
/**
 * Consumes the promise and logs the error when it rejects.
 * @param promise A promise to forget.
 */
function forget(promise) {
    promise.then(null, function (e) {
        // TODO: Use a better logging mechanism
        console.error(e);
    });
}
//# sourceMappingURL=async.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/dsn.js":
/*!***********************************************!*\
  !*** ./node_modules/@sentry/utils/esm/dsn.js ***!
  \***********************************************/
/*! exports provided: Dsn */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Dsn", function() { return Dsn; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ "./node_modules/@sentry/utils/esm/error.js");


/** Regular expression used to parse a Dsn. */
var DSN_REGEX = /^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w\.-]+)(?::(\d+))?\/(.+)/;
/** Error message */
var ERROR_MESSAGE = 'Invalid Dsn';
/** The Sentry Dsn, identifying a Sentry instance and project. */
var Dsn = /** @class */ (function () {
    /** Creates a new Dsn component */
    function Dsn(from) {
        if (typeof from === 'string') {
            this._fromString(from);
        }
        else {
            this._fromComponents(from);
        }
        this._validate();
    }
    /**
     * Renders the string representation of this Dsn.
     *
     * By default, this will render the public representation without the password
     * component. To get the deprecated private representation, set `withPassword`
     * to true.
     *
     * @param withPassword When set to true, the password will be included.
     */
    Dsn.prototype.toString = function (withPassword) {
        if (withPassword === void 0) { withPassword = false; }
        // tslint:disable-next-line:no-this-assignment
        var _a = this, host = _a.host, path = _a.path, pass = _a.pass, port = _a.port, projectId = _a.projectId, protocol = _a.protocol, user = _a.user;
        return (protocol + "://" + user + (withPassword && pass ? ":" + pass : '') +
            ("@" + host + (port ? ":" + port : '') + "/" + (path ? path + "/" : path) + projectId));
    };
    /** Parses a string into this Dsn. */
    Dsn.prototype._fromString = function (str) {
        var match = DSN_REGEX.exec(str);
        if (!match) {
            throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE);
        }
        var _a = tslib__WEBPACK_IMPORTED_MODULE_0__["__read"](match.slice(1), 6), protocol = _a[0], user = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];
        var path = '';
        var projectId = lastPath;
        var split = projectId.split('/');
        if (split.length > 1) {
            path = split.slice(0, -1).join('/');
            projectId = split.pop();
        }
        if (projectId) {
            var projectMatch = projectId.match(/^\d+/);
            if (projectMatch) {
                projectId = projectMatch[0];
            }
        }
        this._fromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, user: user });
    };
    /** Maps Dsn components into this instance. */
    Dsn.prototype._fromComponents = function (components) {
        this.protocol = components.protocol;
        this.user = components.user;
        this.pass = components.pass || '';
        this.host = components.host;
        this.port = components.port || '';
        this.path = components.path || '';
        this.projectId = components.projectId;
    };
    /** Validates this Dsn and throws on error. */
    Dsn.prototype._validate = function () {
        var _this = this;
        ['protocol', 'user', 'host', 'projectId'].forEach(function (component) {
            if (!_this[component]) {
                throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE + ": " + component + " missing");
            }
        });
        if (!this.projectId.match(/^\d+$/)) {
            throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE + ": Invalid projectId " + this.projectId);
        }
        if (this.protocol !== 'http' && this.protocol !== 'https') {
            throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE + ": Invalid protocol " + this.protocol);
        }
        if (this.port && isNaN(parseInt(this.port, 10))) {
            throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE + ": Invalid port " + this.port);
        }
    };
    return Dsn;
}());

//# sourceMappingURL=dsn.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/error.js":
/*!*************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/error.js ***!
  \*************************************************/
/*! exports provided: SentryError */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SentryError", function() { return SentryError; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _polyfill__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./polyfill */ "./node_modules/@sentry/utils/esm/polyfill.js");


/** An error emitted by Sentry SDKs and related utilities. */
var SentryError = /** @class */ (function (_super) {
    tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SentryError, _super);
    function SentryError(message) {
        var _newTarget = this.constructor;
        var _this = _super.call(this, message) || this;
        _this.message = message;
        // tslint:disable:no-unsafe-any
        _this.name = _newTarget.prototype.constructor.name;
        Object(_polyfill__WEBPACK_IMPORTED_MODULE_1__["setPrototypeOf"])(_this, _newTarget.prototype);
        return _this;
    }
    return SentryError;
}(Error));

//# sourceMappingURL=error.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/index.js":
/*!*************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/index.js ***!
  \*************************************************/
/*! exports provided: forget, SentryError, isError, isErrorEvent, isDOMError, isDOMException, isString, isPrimitive, isPlainObject, isEvent, isElement, isRegExp, isThenable, isSyntheticEvent, isInstanceOf, logger, Memo, dynamicRequire, isNodeEnv, getGlobalObject, uuid4, parseUrl, getEventDescription, consoleSandbox, addExceptionTypeValue, addExceptionMechanism, getLocationHref, htmlTreeAsString, crossPlatformPerformance, timestampWithMs, parseSemver, parseRetryAfterHeader, getFunctionName, addContextToFrame, fill, urlEncode, normalizeToSize, walk, normalize, extractExceptionKeysForMessage, dropUndefinedKeys, resolve, relative, normalizePath, isAbsolute, join, dirname, basename, PromiseBuffer, truncate, snipLine, safeJoin, isMatchingPattern, supportsErrorEvent, supportsDOMError, supportsDOMException, supportsFetch, supportsNativeFetch, supportsReportingObserver, supportsReferrerPolicy, supportsHistory, SyncPromise, addInstrumentationHandler, Dsn */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./async */ "./node_modules/@sentry/utils/esm/async.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forget", function() { return _async__WEBPACK_IMPORTED_MODULE_0__["forget"]; });

/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ "./node_modules/@sentry/utils/esm/error.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SentryError", function() { return _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"]; });

/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isError", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isError"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isErrorEvent", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isErrorEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isDOMError", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isDOMError"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isDOMException", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isDOMException"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isString", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isString"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isPrimitive", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isPrimitive"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isPlainObject", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isPlainObject"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEvent", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isElement", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isElement"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isRegExp", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isRegExp"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isThenable", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isThenable"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isSyntheticEvent", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isSyntheticEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isInstanceOf", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isInstanceOf"]; });

/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./logger */ "./node_modules/@sentry/utils/esm/logger.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return _logger__WEBPACK_IMPORTED_MODULE_3__["logger"]; });

/* harmony import */ var _memo__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./memo */ "./node_modules/@sentry/utils/esm/memo.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Memo", function() { return _memo__WEBPACK_IMPORTED_MODULE_4__["Memo"]; });

/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dynamicRequire", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["dynamicRequire"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isNodeEnv", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["isNodeEnv"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getGlobalObject", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getGlobalObject"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "uuid4", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["uuid4"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseUrl", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["parseUrl"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getEventDescription", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getEventDescription"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "consoleSandbox", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["consoleSandbox"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addExceptionTypeValue", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["addExceptionTypeValue"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addExceptionMechanism", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["addExceptionMechanism"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getLocationHref", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getLocationHref"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "htmlTreeAsString", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["htmlTreeAsString"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "crossPlatformPerformance", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["crossPlatformPerformance"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestampWithMs", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["timestampWithMs"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseSemver", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["parseSemver"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseRetryAfterHeader", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["parseRetryAfterHeader"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getFunctionName", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getFunctionName"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addContextToFrame", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["addContextToFrame"]; });

/* harmony import */ var _object__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./object */ "./node_modules/@sentry/utils/esm/object.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fill", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["fill"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "urlEncode", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["urlEncode"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalizeToSize", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["normalizeToSize"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "walk", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["walk"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["normalize"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "extractExceptionKeysForMessage", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["extractExceptionKeysForMessage"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dropUndefinedKeys", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["dropUndefinedKeys"]; });

/* harmony import */ var _path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./path */ "./node_modules/@sentry/utils/esm/path.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "resolve", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["resolve"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "relative", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["relative"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalizePath", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["normalizePath"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isAbsolute", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["isAbsolute"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "join", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["join"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dirname", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["dirname"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "basename", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["basename"]; });

/* harmony import */ var _promisebuffer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./promisebuffer */ "./node_modules/@sentry/utils/esm/promisebuffer.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PromiseBuffer", function() { return _promisebuffer__WEBPACK_IMPORTED_MODULE_8__["PromiseBuffer"]; });

/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./string */ "./node_modules/@sentry/utils/esm/string.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "truncate", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["truncate"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "snipLine", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["snipLine"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "safeJoin", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["safeJoin"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isMatchingPattern", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["isMatchingPattern"]; });

/* harmony import */ var _supports__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./supports */ "./node_modules/@sentry/utils/esm/supports.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsErrorEvent", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsErrorEvent"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsDOMError", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsDOMError"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsDOMException", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsDOMException"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsFetch", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsFetch"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsNativeFetch", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsNativeFetch"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsReportingObserver", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsReportingObserver"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsReferrerPolicy", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsReferrerPolicy"]; });

/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsHistory", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsHistory"]; });

/* harmony import */ var _syncpromise__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./syncpromise */ "./node_modules/@sentry/utils/esm/syncpromise.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SyncPromise", function() { return _syncpromise__WEBPACK_IMPORTED_MODULE_11__["SyncPromise"]; });

/* harmony import */ var _instrument__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./instrument */ "./node_modules/@sentry/utils/esm/instrument.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addInstrumentationHandler", function() { return _instrument__WEBPACK_IMPORTED_MODULE_12__["addInstrumentationHandler"]; });

/* harmony import */ var _dsn__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./dsn */ "./node_modules/@sentry/utils/esm/dsn.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dsn", function() { return _dsn__WEBPACK_IMPORTED_MODULE_13__["Dsn"]; });















//# sourceMappingURL=index.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/instrument.js":
/*!******************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/instrument.js ***!
  \******************************************************/
/*! exports provided: addInstrumentationHandler */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addInstrumentationHandler", function() { return addInstrumentationHandler; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./logger */ "./node_modules/@sentry/utils/esm/logger.js");
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
/* harmony import */ var _object__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./object */ "./node_modules/@sentry/utils/esm/object.js");
/* harmony import */ var _supports__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./supports */ "./node_modules/@sentry/utils/esm/supports.js");
/* tslint:disable:only-arrow-functions no-unsafe-any */






var global = Object(_misc__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
/**
 * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.
 *  - Console API
 *  - Fetch API
 *  - XHR API
 *  - History API
 *  - DOM API (click/typing)
 *  - Error API
 *  - UnhandledRejection API
 */
var handlers = {};
var instrumented = {};
/** Instruments given API */
function instrument(type) {
    if (instrumented[type]) {
        return;
    }
    instrumented[type] = true;
    switch (type) {
        case 'console':
            instrumentConsole();
            break;
        case 'dom':
            instrumentDOM();
            break;
        case 'xhr':
            instrumentXHR();
            break;
        case 'fetch':
            instrumentFetch();
            break;
        case 'history':
            instrumentHistory();
            break;
        case 'error':
            instrumentError();
            break;
        case 'unhandledrejection':
            instrumentUnhandledRejection();
            break;
        default:
            _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('unknown instrumentation type:', type);
    }
}
/**
 * Add handler that will be called when given type of instrumentation triggers.
 * Use at your own risk, this might break without changelog notice, only used internally.
 * @hidden
 */
function addInstrumentationHandler(handler) {
    // tslint:disable-next-line:strict-type-predicates
    if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {
        return;
    }
    handlers[handler.type] = handlers[handler.type] || [];
    handlers[handler.type].push(handler.callback);
    instrument(handler.type);
}
/** JSDoc */
function triggerHandlers(type, data) {
    var e_1, _a;
    if (!type || !handlers[type]) {
        return;
    }
    try {
        for (var _b = tslib__WEBPACK_IMPORTED_MODULE_0__["__values"](handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {
            var handler = _c.value;
            try {
                handler(data);
            }
            catch (e) {
                _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Error while triggering instrumentation handler.\nType: " + type + "\nName: " + Object(_misc__WEBPACK_IMPORTED_MODULE_3__["getFunctionName"])(handler) + "\nError: " + e);
            }
        }
    }
    catch (e_1_1) { e_1 = { error: e_1_1 }; }
    finally {
        try {
            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
        }
        finally { if (e_1) throw e_1.error; }
    }
}
/** JSDoc */
function instrumentConsole() {
    if (!('console' in global)) {
        return;
    }
    ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {
        if (!(level in global.console)) {
            return;
        }
        Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global.console, level, function (originalConsoleLevel) {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                triggerHandlers('console', { args: args, level: level });
                // this fails for some browsers. :(
                if (originalConsoleLevel) {
                    Function.prototype.apply.call(originalConsoleLevel, global.console, args);
                }
            };
        });
    });
}
/** JSDoc */
function instrumentFetch() {
    if (!Object(_supports__WEBPACK_IMPORTED_MODULE_5__["supportsNativeFetch"])()) {
        return;
    }
    Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global, 'fetch', function (originalFetch) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var commonHandlerData = {
                args: args,
                fetchData: {
                    method: getFetchMethod(args),
                    url: getFetchUrl(args),
                },
                startTimestamp: Date.now(),
            };
            triggerHandlers('fetch', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData));
            return originalFetch.apply(global, args).then(function (response) {
                triggerHandlers('fetch', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData, { endTimestamp: Date.now(), response: response }));
                return response;
            }, function (error) {
                triggerHandlers('fetch', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData, { endTimestamp: Date.now(), error: error }));
                throw error;
            });
        };
    });
}
/** Extract `method` from fetch call arguments */
function getFetchMethod(fetchArgs) {
    if (fetchArgs === void 0) { fetchArgs = []; }
    if ('Request' in global && Object(_is__WEBPACK_IMPORTED_MODULE_1__["isInstanceOf"])(fetchArgs[0], Request) && fetchArgs[0].method) {
        return String(fetchArgs[0].method).toUpperCase();
    }
    if (fetchArgs[1] && fetchArgs[1].method) {
        return String(fetchArgs[1].method).toUpperCase();
    }
    return 'GET';
}
/** Extract `url` from fetch call arguments */
function getFetchUrl(fetchArgs) {
    if (fetchArgs === void 0) { fetchArgs = []; }
    if (typeof fetchArgs[0] === 'string') {
        return fetchArgs[0];
    }
    if ('Request' in global && Object(_is__WEBPACK_IMPORTED_MODULE_1__["isInstanceOf"])(fetchArgs[0], Request)) {
        return fetchArgs[0].url;
    }
    return String(fetchArgs[0]);
}
/** JSDoc */
function instrumentXHR() {
    if (!('XMLHttpRequest' in global)) {
        return;
    }
    var xhrproto = XMLHttpRequest.prototype;
    Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(xhrproto, 'open', function (originalOpen) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var xhr = this; // tslint:disable-line:no-this-assignment
            var url = args[1];
            xhr.__sentry_xhr__ = {
                method: Object(_is__WEBPACK_IMPORTED_MODULE_1__["isString"])(args[0]) ? args[0].toUpperCase() : args[0],
                url: args[1],
            };
            // if Sentry key appears in URL, don't capture it as a request
            if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isString"])(url) && xhr.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {
                xhr.__sentry_own_request__ = true;
            }
            var onreadystatechangeHandler = function () {
                if (xhr.readyState === 4) {
                    try {
                        // touching statusCode in some platforms throws
                        // an exception
                        if (xhr.__sentry_xhr__) {
                            xhr.__sentry_xhr__.status_code = xhr.status;
                        }
                    }
                    catch (e) {
                        /* do nothing */
                    }
                    triggerHandlers('xhr', {
                        args: args,
                        endTimestamp: Date.now(),
                        startTimestamp: Date.now(),
                        xhr: xhr,
                    });
                }
            };
            if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {
                Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(xhr, 'onreadystatechange', function (original) {
                    return function () {
                        var readyStateArgs = [];
                        for (var _i = 0; _i < arguments.length; _i++) {
                            readyStateArgs[_i] = arguments[_i];
                        }
                        onreadystatechangeHandler();
                        return original.apply(xhr, readyStateArgs);
                    };
                });
            }
            else {
                xhr.addEventListener('readystatechange', onreadystatechangeHandler);
            }
            return originalOpen.apply(xhr, args);
        };
    });
    Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(xhrproto, 'send', function (originalSend) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            triggerHandlers('xhr', {
                args: args,
                startTimestamp: Date.now(),
                xhr: this,
            });
            return originalSend.apply(this, args);
        };
    });
}
var lastHref;
/** JSDoc */
function instrumentHistory() {
    if (!Object(_supports__WEBPACK_IMPORTED_MODULE_5__["supportsHistory"])()) {
        return;
    }
    var oldOnPopState = global.onpopstate;
    global.onpopstate = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var to = global.location.href;
        // keep track of the current URL state, as we always receive only the updated state
        var from = lastHref;
        lastHref = to;
        triggerHandlers('history', {
            from: from,
            to: to,
        });
        if (oldOnPopState) {
            return oldOnPopState.apply(this, args);
        }
    };
    /** @hidden */
    function historyReplacementFunction(originalHistoryFunction) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var url = args.length > 2 ? args[2] : undefined;
            if (url) {
                // coerce to string (this is what pushState does)
                var from = lastHref;
                var to = String(url);
                // keep track of the current URL state, as we always receive only the updated state
                lastHref = to;
                triggerHandlers('history', {
                    from: from,
                    to: to,
                });
            }
            return originalHistoryFunction.apply(this, args);
        };
    }
    Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global.history, 'pushState', historyReplacementFunction);
    Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global.history, 'replaceState', historyReplacementFunction);
}
/** JSDoc */
function instrumentDOM() {
    if (!('document' in global)) {
        return;
    }
    // Capture breadcrumbs from any click that is unhandled / bubbled up all the way
    // to the document. Do this before we instrument addEventListener.
    global.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false);
    global.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false);
    // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.
    ['EventTarget', 'Node'].forEach(function (target) {
        var proto = global[target] && global[target].prototype;
        if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {
            return;
        }
        Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(proto, 'addEventListener', function (original) {
            return function (eventName, fn, options) {
                if (fn && fn.handleEvent) {
                    if (eventName === 'click') {
                        Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(fn, 'handleEvent', function (innerOriginal) {
                            return function (event) {
                                domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event);
                                return innerOriginal.call(this, event);
                            };
                        });
                    }
                    if (eventName === 'keypress') {
                        Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(fn, 'handleEvent', function (innerOriginal) {
                            return function (event) {
                                keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event);
                                return innerOriginal.call(this, event);
                            };
                        });
                    }
                }
                else {
                    if (eventName === 'click') {
                        domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this);
                    }
                    if (eventName === 'keypress') {
                        keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this);
                    }
                }
                return original.call(this, eventName, fn, options);
            };
        });
        Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(proto, 'removeEventListener', function (original) {
            return function (eventName, fn, options) {
                var callback = fn;
                try {
                    callback = callback && (callback.__sentry_wrapped__ || callback);
                }
                catch (e) {
                    // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments
                }
                return original.call(this, eventName, callback, options);
            };
        });
    });
}
var debounceDuration = 1000;
var debounceTimer = 0;
var keypressTimeout;
var lastCapturedEvent;
/**
 * Wraps addEventListener to capture UI breadcrumbs
 * @param name the event name (e.g. "click")
 * @param handler function that will be triggered
 * @param debounce decides whether it should wait till another event loop
 * @returns wrapped breadcrumb events handler
 * @hidden
 */
function domEventHandler(name, handler, debounce) {
    if (debounce === void 0) { debounce = false; }
    return function (event) {
        // 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
        keypressTimeout = undefined;
        // 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 (!event || lastCapturedEvent === event) {
            return;
        }
        lastCapturedEvent = event;
        if (debounceTimer) {
            clearTimeout(debounceTimer);
        }
        if (debounce) {
            debounceTimer = setTimeout(function () {
                handler({ event: event, name: name });
            });
        }
        else {
            handler({ event: event, name: name });
        }
    };
}
/**
 * Wraps addEventListener to capture keypress UI events
 * @param handler function that will be triggered
 * @returns wrapped keypress events handler
 * @hidden
 */
function keypressEventHandler(handler) {
    // 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 (event) {
        var target;
        try {
            target = event.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
        if (!keypressTimeout) {
            domEventHandler('input', handler)(event);
        }
        clearTimeout(keypressTimeout);
        keypressTimeout = setTimeout(function () {
            keypressTimeout = undefined;
        }, debounceDuration);
    };
}
var _oldOnErrorHandler = null;
/** JSDoc */
function instrumentError() {
    _oldOnErrorHandler = global.onerror;
    global.onerror = function (msg, url, line, column, error) {
        triggerHandlers('error', {
            column: column,
            error: error,
            line: line,
            msg: msg,
            url: url,
        });
        if (_oldOnErrorHandler) {
            return _oldOnErrorHandler.apply(this, arguments);
        }
        return false;
    };
}
var _oldOnUnhandledRejectionHandler = null;
/** JSDoc */
function instrumentUnhandledRejection() {
    _oldOnUnhandledRejectionHandler = global.onunhandledrejection;
    global.onunhandledrejection = function (e) {
        triggerHandlers('unhandledrejection', e);
        if (_oldOnUnhandledRejectionHandler) {
            return _oldOnUnhandledRejectionHandler.apply(this, arguments);
        }
        return true;
    };
}
//# sourceMappingURL=instrument.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/is.js":
/*!**********************************************!*\
  !*** ./node_modules/@sentry/utils/esm/is.js ***!
  \**********************************************/
/*! exports provided: isError, isErrorEvent, isDOMError, isDOMException, isString, isPrimitive, isPlainObject, isEvent, isElement, isRegExp, isThenable, isSyntheticEvent, isInstanceOf */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isError", function() { return isError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isErrorEvent", function() { return isErrorEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDOMError", function() { return isDOMError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDOMException", function() { return isDOMException; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isString", function() { return isString; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPrimitive", function() { return isPrimitive; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPlainObject", function() { return isPlainObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEvent", function() { return isEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isElement", function() { return isElement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isRegExp", function() { return isRegExp; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isThenable", function() { return isThenable; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSyntheticEvent", function() { return isSyntheticEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInstanceOf", function() { return isInstanceOf; });
/**
 * Checks whether given value's type is one of a few Error or Error-like
 * {@link isError}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isError(wat) {
    switch (Object.prototype.toString.call(wat)) {
        case '[object Error]':
            return true;
        case '[object Exception]':
            return true;
        case '[object DOMException]':
            return true;
        default:
            return isInstanceOf(wat, Error);
    }
}
/**
 * Checks whether given value's type is ErrorEvent
 * {@link isErrorEvent}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isErrorEvent(wat) {
    return Object.prototype.toString.call(wat) === '[object ErrorEvent]';
}
/**
 * Checks whether given value's type is DOMError
 * {@link isDOMError}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isDOMError(wat) {
    return Object.prototype.toString.call(wat) === '[object DOMError]';
}
/**
 * Checks whether given value's type is DOMException
 * {@link isDOMException}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isDOMException(wat) {
    return Object.prototype.toString.call(wat) === '[object DOMException]';
}
/**
 * Checks whether given value's type is a string
 * {@link isString}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isString(wat) {
    return Object.prototype.toString.call(wat) === '[object String]';
}
/**
 * Checks whether given value's is a primitive (undefined, null, number, boolean, string)
 * {@link isPrimitive}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isPrimitive(wat) {
    return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');
}
/**
 * Checks whether given value's type is an object literal
 * {@link isPlainObject}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isPlainObject(wat) {
    return Object.prototype.toString.call(wat) === '[object Object]';
}
/**
 * Checks whether given value's type is an Event instance
 * {@link isEvent}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isEvent(wat) {
    // tslint:disable-next-line:strict-type-predicates
    return typeof Event !== 'undefined' && isInstanceOf(wat, Event);
}
/**
 * Checks whether given value's type is an Element instance
 * {@link isElement}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isElement(wat) {
    // tslint:disable-next-line:strict-type-predicates
    return typeof Element !== 'undefined' && isInstanceOf(wat, Element);
}
/**
 * Checks whether given value's type is an regexp
 * {@link isRegExp}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isRegExp(wat) {
    return Object.prototype.toString.call(wat) === '[object RegExp]';
}
/**
 * Checks whether given value has a then function.
 * @param wat A value to be checked.
 */
function isThenable(wat) {
    // tslint:disable:no-unsafe-any
    return Boolean(wat && wat.then && typeof wat.then === 'function');
    // tslint:enable:no-unsafe-any
}
/**
 * Checks whether given value's type is a SyntheticEvent
 * {@link isSyntheticEvent}.
 *
 * @param wat A value to be checked.
 * @returns A boolean representing the result.
 */
function isSyntheticEvent(wat) {
    // tslint:disable-next-line:no-unsafe-any
    return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;
}
/**
 * Checks whether given value's type is an instance of provided constructor.
 * {@link isInstanceOf}.
 *
 * @param wat A value to be checked.
 * @param base A constructor to be used in a check.
 * @returns A boolean representing the result.
 */
function isInstanceOf(wat, base) {
    try {
        // tslint:disable-next-line:no-unsafe-any
        return wat instanceof base;
    }
    catch (_e) {
        return false;
    }
}
//# sourceMappingURL=is.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/logger.js":
/*!**************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/logger.js ***!
  \**************************************************/
/*! exports provided: logger */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return logger; });
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");

// TODO: Implement different loggers for different environments
var global = Object(_misc__WEBPACK_IMPORTED_MODULE_0__["getGlobalObject"])();
/** Prefix for logging strings */
var PREFIX = 'Sentry Logger ';
/** JSDoc */
var Logger = /** @class */ (function () {
    /** JSDoc */
    function Logger() {
        this._enabled = false;
    }
    /** JSDoc */
    Logger.prototype.disable = function () {
        this._enabled = false;
    };
    /** JSDoc */
    Logger.prototype.enable = function () {
        this._enabled = true;
    };
    /** JSDoc */
    Logger.prototype.log = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        if (!this._enabled) {
            return;
        }
        Object(_misc__WEBPACK_IMPORTED_MODULE_0__["consoleSandbox"])(function () {
            global.console.log(PREFIX + "[Log]: " + args.join(' ')); // tslint:disable-line:no-console
        });
    };
    /** JSDoc */
    Logger.prototype.warn = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        if (!this._enabled) {
            return;
        }
        Object(_misc__WEBPACK_IMPORTED_MODULE_0__["consoleSandbox"])(function () {
            global.console.warn(PREFIX + "[Warn]: " + args.join(' ')); // tslint:disable-line:no-console
        });
    };
    /** JSDoc */
    Logger.prototype.error = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        if (!this._enabled) {
            return;
        }
        Object(_misc__WEBPACK_IMPORTED_MODULE_0__["consoleSandbox"])(function () {
            global.console.error(PREFIX + "[Error]: " + args.join(' ')); // tslint:disable-line:no-console
        });
    };
    return Logger;
}());
// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used
global.__SENTRY__ = global.__SENTRY__ || {};
var logger = global.__SENTRY__.logger || (global.__SENTRY__.logger = new Logger());

//# sourceMappingURL=logger.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/memo.js":
/*!************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/memo.js ***!
  \************************************************/
/*! exports provided: Memo */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Memo", function() { return Memo; });
// tslint:disable:no-unsafe-any
/**
 * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.
 */
var Memo = /** @class */ (function () {
    function Memo() {
        // tslint:disable-next-line
        this._hasWeakSet = typeof WeakSet === 'function';
        this._inner = this._hasWeakSet ? new WeakSet() : [];
    }
    /**
     * Sets obj to remember.
     * @param obj Object to remember
     */
    Memo.prototype.memoize = function (obj) {
        if (this._hasWeakSet) {
            if (this._inner.has(obj)) {
                return true;
            }
            this._inner.add(obj);
            return false;
        }
        // tslint:disable-next-line:prefer-for-of
        for (var i = 0; i < this._inner.length; i++) {
            var value = this._inner[i];
            if (value === obj) {
                return true;
            }
        }
        this._inner.push(obj);
        return false;
    };
    /**
     * Removes object from internal storage.
     * @param obj Object to forget
     */
    Memo.prototype.unmemoize = function (obj) {
        if (this._hasWeakSet) {
            this._inner.delete(obj);
        }
        else {
            for (var i = 0; i < this._inner.length; i++) {
                if (this._inner[i] === obj) {
                    this._inner.splice(i, 1);
                    break;
                }
            }
        }
    };
    return Memo;
}());

//# sourceMappingURL=memo.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/misc.js":
/*!************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/misc.js ***!
  \************************************************/
/*! exports provided: dynamicRequire, isNodeEnv, getGlobalObject, uuid4, parseUrl, getEventDescription, consoleSandbox, addExceptionTypeValue, addExceptionMechanism, getLocationHref, htmlTreeAsString, crossPlatformPerformance, timestampWithMs, parseSemver, parseRetryAfterHeader, getFunctionName, addContextToFrame */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(process, global, module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dynamicRequire", function() { return dynamicRequire; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNodeEnv", function() { return isNodeEnv; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getGlobalObject", function() { return getGlobalObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuid4", function() { return uuid4; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseUrl", function() { return parseUrl; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEventDescription", function() { return getEventDescription; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "consoleSandbox", function() { return consoleSandbox; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addExceptionTypeValue", function() { return addExceptionTypeValue; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addExceptionMechanism", function() { return addExceptionMechanism; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocationHref", function() { return getLocationHref; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "htmlTreeAsString", function() { return htmlTreeAsString; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "crossPlatformPerformance", function() { return crossPlatformPerformance; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestampWithMs", function() { return timestampWithMs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseSemver", function() { return parseSemver; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseRetryAfterHeader", function() { return parseRetryAfterHeader; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFunctionName", function() { return getFunctionName; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addContextToFrame", function() { return addContextToFrame; });
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./string */ "./node_modules/@sentry/utils/esm/string.js");


/**
 * Requires a module which is protected against bundler minification.
 *
 * @param request The module path to resolve
 */
function dynamicRequire(mod, request) {
    // tslint:disable-next-line: no-unsafe-any
    return mod.require(request);
}
/**
 * Checks whether we're in the Node.js or Browser environment
 *
 * @returns Answer to given question
 */
function isNodeEnv() {
    // tslint:disable:strict-type-predicates
    return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';
}
var fallbackGlobalObject = {};
/**
 * Safely get global scope object
 *
 * @returns Global scope object
 */
function getGlobalObject() {
    return (isNodeEnv()
        ? global
        : typeof window !== 'undefined'
            ? window
            : typeof self !== 'undefined'
                ? self
                : fallbackGlobalObject);
}
/**
 * UUID4 generator
 *
 * @returns string Generated UUID4.
 */
function uuid4() {
    var global = getGlobalObject();
    var crypto = global.crypto || global.msCrypto;
    if (!(crypto === void 0) && crypto.getRandomValues) {
        // Use window.crypto API if available
        var arr = new Uint16Array(8);
        crypto.getRandomValues(arr);
        // set 4 in byte 7
        // tslint:disable-next-line:no-bitwise
        arr[3] = (arr[3] & 0xfff) | 0x4000;
        // set 2 most significant bits of byte 9 to '10'
        // tslint:disable-next-line:no-bitwise
        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]));
    }
    // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
    return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        // tslint:disable-next-line:no-bitwise
        var r = (Math.random() * 16) | 0;
        // tslint:disable-next-line:no-bitwise
        var v = c === 'x' ? r : (r & 0x3) | 0x8;
        return v.toString(16);
    });
}
/**
 * Parses string form of URL into an object
 * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B
 * // intentionally using regex and not <a/> href parsing trick because React Native and other
 * // environments where DOM might not be available
 * @returns parsed URL object
 */
function parseUrl(url) {
    if (!url) {
        return {};
    }
    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 {
        host: match[4],
        path: match[5],
        protocol: match[2],
        relative: match[5] + query + fragment,
    };
}
/**
 * Extracts either message or type+value from an event that can be used for user-facing logs
 * @returns event's description
 */
function getEventDescription(event) {
    if (event.message) {
        return event.message;
    }
    if (event.exception && event.exception.values && event.exception.values[0]) {
        var exception = event.exception.values[0];
        if (exception.type && exception.value) {
            return exception.type + ": " + exception.value;
        }
        return exception.type || exception.value || event.event_id || '<unknown>';
    }
    return event.event_id || '<unknown>';
}
/** JSDoc */
function consoleSandbox(callback) {
    var global = getGlobalObject();
    var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];
    if (!('console' in global)) {
        return callback();
    }
    var originalConsole = global.console;
    var wrappedLevels = {};
    // Restore all wrapped console methods
    levels.forEach(function (level) {
        if (level in global.console && originalConsole[level].__sentry_original__) {
            wrappedLevels[level] = originalConsole[level];
            originalConsole[level] = originalConsole[level].__sentry_original__;
        }
    });
    // Perform callback manipulations
    var result = callback();
    // Revert restoration to wrapped state
    Object.keys(wrappedLevels).forEach(function (level) {
        originalConsole[level] = wrappedLevels[level];
    });
    return result;
}
/**
 * Adds exception values, type and value to an synthetic Exception.
 * @param event The event to modify.
 * @param value Value of the exception.
 * @param type Type of the exception.
 * @hidden
 */
function addExceptionTypeValue(event, value, type) {
    event.exception = event.exception || {};
    event.exception.values = event.exception.values || [];
    event.exception.values[0] = event.exception.values[0] || {};
    event.exception.values[0].value = event.exception.values[0].value || value || '';
    event.exception.values[0].type = event.exception.values[0].type || type || 'Error';
}
/**
 * Adds exception mechanism to a given event.
 * @param event The event to modify.
 * @param mechanism Mechanism of the mechanism.
 * @hidden
 */
function addExceptionMechanism(event, mechanism) {
    if (mechanism === void 0) { mechanism = {}; }
    // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?
    try {
        // @ts-ignore
        // tslint:disable:no-non-null-assertion
        event.exception.values[0].mechanism = event.exception.values[0].mechanism || {};
        Object.keys(mechanism).forEach(function (key) {
            // @ts-ignore
            event.exception.values[0].mechanism[key] = mechanism[key];
        });
    }
    catch (_oO) {
        // no-empty
    }
}
/**
 * A safe form of location.href
 */
function getLocationHref() {
    try {
        return document.location.href;
    }
    catch (oO) {
        return '';
    }
}
/**
 * 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]
 * @returns generated DOM path
 */
function htmlTreeAsString(elem) {
    // try/catch both:
    // - accessing event.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.
    try {
        var currentElem = elem;
        var MAX_TRAVERSE_HEIGHT = 5;
        var MAX_OUTPUT_LEN = 80;
        var out = [];
        var height = 0;
        var len = 0;
        var separator = ' > ';
        var sepLength = separator.length;
        var nextStr = void 0;
        while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {
            nextStr = _htmlElementAsString(currentElem);
            // 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);
            len += nextStr.length;
            currentElem = currentElem.parentNode;
        }
        return out.reverse().join(separator);
    }
    catch (_oO) {
        return '<unknown>';
    }
}
/**
 * Returns a simple, query-selector representation of a DOM element
 * e.g. [HTMLElement] => input#foo.btn[name=baz]
 * @returns generated DOM path
 */
function _htmlElementAsString(el) {
    var elem = el;
    var out = [];
    var className;
    var classes;
    var key;
    var attr;
    var i;
    if (!elem || !elem.tagName) {
        return '';
    }
    out.push(elem.tagName.toLowerCase());
    if (elem.id) {
        out.push("#" + elem.id);
    }
    className = elem.className;
    if (className && Object(_is__WEBPACK_IMPORTED_MODULE_0__["isString"])(className)) {
        classes = className.split(/\s+/);
        for (i = 0; i < classes.length; i++) {
            out.push("." + classes[i]);
        }
    }
    var allowedAttrs = ['type', 'name', 'title', 'alt'];
    for (i = 0; i < allowedAttrs.length; i++) {
        key = allowedAttrs[i];
        attr = elem.getAttribute(key);
        if (attr) {
            out.push("[" + key + "=\"" + attr + "\"]");
        }
    }
    return out.join('');
}
var INITIAL_TIME = Date.now();
var prevNow = 0;
var performanceFallback = {
    now: function () {
        var now = Date.now() - INITIAL_TIME;
        if (now < prevNow) {
            now = prevNow;
        }
        prevNow = now;
        return now;
    },
    timeOrigin: INITIAL_TIME,
};
var crossPlatformPerformance = (function () {
    if (isNodeEnv()) {
        try {
            var perfHooks = dynamicRequire(module, 'perf_hooks');
            return perfHooks.performance;
        }
        catch (_) {
            return performanceFallback;
        }
    }
    var performance = getGlobalObject().performance;
    if (!performance || !performance.now) {
        return performanceFallback;
    }
    // Polyfill for performance.timeOrigin.
    //
    // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin
    // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.
    // tslint:disable-next-line:strict-type-predicates
    if (performance.timeOrigin === undefined) {
        // As of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always a
        // valid fallback. In the absence of a initial time provided by the browser, fallback to INITIAL_TIME.
        // @ts-ignore
        // tslint:disable-next-line:deprecation
        performance.timeOrigin = (performance.timing && performance.timing.navigationStart) || INITIAL_TIME;
    }
    return performance;
})();
/**
 * Returns a timestamp in seconds with milliseconds precision since the UNIX epoch calculated with the monotonic clock.
 */
function timestampWithMs() {
    return (crossPlatformPerformance.timeOrigin + crossPlatformPerformance.now()) / 1000;
}
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
var SEMVER_REGEXP = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
/**
 * Parses input into a SemVer interface
 * @param input string representation of a semver version
 */
function parseSemver(input) {
    var match = input.match(SEMVER_REGEXP) || [];
    var major = parseInt(match[1], 10);
    var minor = parseInt(match[2], 10);
    var patch = parseInt(match[3], 10);
    return {
        buildmetadata: match[5],
        major: isNaN(major) ? undefined : major,
        minor: isNaN(minor) ? undefined : minor,
        patch: isNaN(patch) ? undefined : patch,
        prerelease: match[4],
    };
}
var defaultRetryAfter = 60 * 1000; // 60 seconds
/**
 * Extracts Retry-After value from the request header or returns default value
 * @param now current unix timestamp
 * @param header string representation of 'Retry-After' header
 */
function parseRetryAfterHeader(now, header) {
    if (!header) {
        return defaultRetryAfter;
    }
    var headerDelay = parseInt("" + header, 10);
    if (!isNaN(headerDelay)) {
        return headerDelay * 1000;
    }
    var headerDate = Date.parse("" + header);
    if (!isNaN(headerDate)) {
        return headerDate - now;
    }
    return defaultRetryAfter;
}
var defaultFunctionName = '<anonymous>';
/**
 * Safely extract function name from itself
 */
function getFunctionName(fn) {
    try {
        if (!fn || typeof fn !== 'function') {
            return defaultFunctionName;
        }
        return fn.name || defaultFunctionName;
    }
    catch (e) {
        // Just accessing custom props in some Selenium environments
        // can cause a "Permission denied" exception (see raven-js#495).
        return defaultFunctionName;
    }
}
/**
 * This function adds context (pre/post/line) lines to the provided frame
 *
 * @param lines string[] containing all lines
 * @param frame StackFrame that will be mutated
 * @param linesOfContext number of context lines we want to add pre/post
 */
function addContextToFrame(lines, frame, linesOfContext) {
    if (linesOfContext === void 0) { linesOfContext = 5; }
    var lineno = frame.lineno || 0;
    var maxLines = lines.length;
    var sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0);
    frame.pre_context = lines
        .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)
        .map(function (line) { return Object(_string__WEBPACK_IMPORTED_MODULE_1__["snipLine"])(line, 0); });
    frame.context_line = Object(_string__WEBPACK_IMPORTED_MODULE_1__["snipLine"])(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);
    frame.post_context = lines
        .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)
        .map(function (line) { return Object(_string__WEBPACK_IMPORTED_MODULE_1__["snipLine"])(line, 0); });
}
//# sourceMappingURL=misc.js.map
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../../webpack/buildin/harmony-module.js */ "./node_modules/webpack/buildin/harmony-module.js")(module)))

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/object.js":
/*!**************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/object.js ***!
  \**************************************************/
/*! exports provided: fill, urlEncode, normalizeToSize, walk, normalize, extractExceptionKeysForMessage, dropUndefinedKeys */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fill", function() { return fill; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "urlEncode", function() { return urlEncode; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalizeToSize", function() { return normalizeToSize; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "walk", function() { return walk; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return normalize; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractExceptionKeysForMessage", function() { return extractExceptionKeysForMessage; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dropUndefinedKeys", function() { return dropUndefinedKeys; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony import */ var _memo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./memo */ "./node_modules/@sentry/utils/esm/memo.js");
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./string */ "./node_modules/@sentry/utils/esm/string.js");





/**
 * Wrap a given object method with a higher-order function
 *
 * @param source An object that contains a method to be wrapped.
 * @param name A name of method to be wrapped.
 * @param replacement A function that should be used to wrap a given method.
 * @returns void
 */
function fill(source, name, replacement) {
    if (!(name in source)) {
        return;
    }
    var original = source[name];
    var wrapped = replacement(original);
    // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work
    // otherwise it'll throw "TypeError: Object.defineProperties called on non-object"
    // tslint:disable-next-line:strict-type-predicates
    if (typeof wrapped === 'function') {
        try {
            wrapped.prototype = wrapped.prototype || {};
            Object.defineProperties(wrapped, {
                __sentry_original__: {
                    enumerable: false,
                    value: original,
                },
            });
        }
        catch (_Oo) {
            // This can throw if multiple fill happens on a global object like XMLHttpRequest
            // Fixes https://github.com/getsentry/sentry-javascript/issues/2043
        }
    }
    source[name] = wrapped;
}
/**
 * Encodes given object into url-friendly format
 *
 * @param object An object that contains serializable values
 * @returns string Encoded
 */
function urlEncode(object) {
    return Object.keys(object)
        .map(
    // tslint:disable-next-line:no-unsafe-any
    function (key) { return encodeURIComponent(key) + "=" + encodeURIComponent(object[key]); })
        .join('&');
}
/**
 * Transforms any object into an object literal with all it's attributes
 * attached to it.
 *
 * @param value Initial source that we have to transform in order to be usable by the serializer
 */
function getWalkSource(value) {
    if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isError"])(value)) {
        var error = value;
        var err = {
            message: error.message,
            name: error.name,
            stack: error.stack,
        };
        for (var i in error) {
            if (Object.prototype.hasOwnProperty.call(error, i)) {
                err[i] = error[i];
            }
        }
        return err;
    }
    if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isEvent"])(value)) {
        var event_1 = value;
        var source = {};
        source.type = event_1.type;
        // Accessing event.target can throw (see getsentry/raven-js#838, #768)
        try {
            source.target = Object(_is__WEBPACK_IMPORTED_MODULE_1__["isElement"])(event_1.target)
                ? Object(_misc__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(event_1.target)
                : Object.prototype.toString.call(event_1.target);
        }
        catch (_oO) {
            source.target = '<unknown>';
        }
        try {
            source.currentTarget = Object(_is__WEBPACK_IMPORTED_MODULE_1__["isElement"])(event_1.currentTarget)
                ? Object(_misc__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(event_1.currentTarget)
                : Object.prototype.toString.call(event_1.currentTarget);
        }
        catch (_oO) {
            source.currentTarget = '<unknown>';
        }
        // tslint:disable-next-line:strict-type-predicates
        if (typeof CustomEvent !== 'undefined' && Object(_is__WEBPACK_IMPORTED_MODULE_1__["isInstanceOf"])(value, CustomEvent)) {
            source.detail = event_1.detail;
        }
        for (var i in event_1) {
            if (Object.prototype.hasOwnProperty.call(event_1, i)) {
                source[i] = event_1;
            }
        }
        return source;
    }
    return value;
}
/** Calculates bytes size of input string */
function utf8Length(value) {
    // tslint:disable-next-line:no-bitwise
    return ~-encodeURI(value).split(/%..|./).length;
}
/** Calculates bytes size of input object */
function jsonSize(value) {
    return utf8Length(JSON.stringify(value));
}
/** JSDoc */
function normalizeToSize(object, 
// Default Node.js REPL depth
depth, 
// 100kB, as 200kB is max payload size, so half sounds reasonable
maxSize) {
    if (depth === void 0) { depth = 3; }
    if (maxSize === void 0) { maxSize = 100 * 1024; }
    var serialized = normalize(object, depth);
    if (jsonSize(serialized) > maxSize) {
        return normalizeToSize(object, depth - 1, maxSize);
    }
    return serialized;
}
/** Transforms any input value into a string form, either primitive value or a type of the input */
function serializeValue(value) {
    var type = Object.prototype.toString.call(value);
    // Node.js REPL notation
    if (typeof value === 'string') {
        return value;
    }
    if (type === '[object Object]') {
        return '[Object]';
    }
    if (type === '[object Array]') {
        return '[Array]';
    }
    var normalized = normalizeValue(value);
    return Object(_is__WEBPACK_IMPORTED_MODULE_1__["isPrimitive"])(normalized) ? normalized : type;
}
/**
 * normalizeValue()
 *
 * Takes unserializable input and make it serializable friendly
 *
 * - translates undefined/NaN values to "[undefined]"/"[NaN]" respectively,
 * - serializes Error objects
 * - filter global objects
 */
// tslint:disable-next-line:cyclomatic-complexity
function normalizeValue(value, key) {
    if (key === 'domain' && value && typeof value === 'object' && value._events) {
        return '[Domain]';
    }
    if (key === 'domainEmitter') {
        return '[DomainEmitter]';
    }
    if (typeof global !== 'undefined' && value === global) {
        return '[Global]';
    }
    if (typeof window !== 'undefined' && value === window) {
        return '[Window]';
    }
    if (typeof document !== 'undefined' && value === document) {
        return '[Document]';
    }
    // React's SyntheticEvent thingy
    if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isSyntheticEvent"])(value)) {
        return '[SyntheticEvent]';
    }
    // tslint:disable-next-line:no-tautology-expression
    if (typeof value === 'number' && value !== value) {
        return '[NaN]';
    }
    if (value === void 0) {
        return '[undefined]';
    }
    if (typeof value === 'function') {
        return "[Function: " + Object(_misc__WEBPACK_IMPORTED_MODULE_3__["getFunctionName"])(value) + "]";
    }
    return value;
}
/**
 * Walks an object to perform a normalization on it
 *
 * @param key of object that's walked in current iteration
 * @param value object to be walked
 * @param depth Optional number indicating how deep should walking be performed
 * @param memo Optional Memo class handling decycling
 */
function walk(key, value, depth, memo) {
    if (depth === void 0) { depth = +Infinity; }
    if (memo === void 0) { memo = new _memo__WEBPACK_IMPORTED_MODULE_2__["Memo"](); }
    // If we reach the maximum depth, serialize whatever has left
    if (depth === 0) {
        return serializeValue(value);
    }
    // If value implements `toJSON` method, call it and return early
    // tslint:disable:no-unsafe-any
    if (value !== null && value !== undefined && typeof value.toJSON === 'function') {
        return value.toJSON();
    }
    // tslint:enable:no-unsafe-any
    // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further
    var normalized = normalizeValue(value, key);
    if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isPrimitive"])(normalized)) {
        return normalized;
    }
    // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself
    var source = getWalkSource(value);
    // Create an accumulator that will act as a parent for all future itterations of that branch
    var acc = Array.isArray(value) ? [] : {};
    // If we already walked that branch, bail out, as it's circular reference
    if (memo.memoize(value)) {
        return '[Circular ~]';
    }
    // Walk all keys of the source
    for (var innerKey in source) {
        // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.
        if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {
            continue;
        }
        // Recursively walk through all the child nodes
        acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);
    }
    // Once walked through all the branches, remove the parent from memo storage
    memo.unmemoize(value);
    // Return accumulated values
    return acc;
}
/**
 * normalize()
 *
 * - Creates a copy to prevent original input mutation
 * - Skip non-enumerablers
 * - Calls `toJSON` if implemented
 * - Removes circular references
 * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format
 * - Translates known global objects/Classes to a string representations
 * - Takes care of Error objects serialization
 * - Optionally limit depth of final output
 */
function normalize(input, depth) {
    try {
        // tslint:disable-next-line:no-unsafe-any
        return JSON.parse(JSON.stringify(input, function (key, value) { return walk(key, value, depth); }));
    }
    catch (_oO) {
        return '**non-serializable**';
    }
}
/**
 * Given any captured exception, extract its keys and create a sorted
 * and truncated list that will be used inside the event message.
 * eg. `Non-error exception captured with keys: foo, bar, baz`
 */
function extractExceptionKeysForMessage(exception, maxLength) {
    if (maxLength === void 0) { maxLength = 40; }
    // tslint:disable:strict-type-predicates
    var keys = Object.keys(getWalkSource(exception));
    keys.sort();
    if (!keys.length) {
        return '[object has no keys]';
    }
    if (keys[0].length >= maxLength) {
        return Object(_string__WEBPACK_IMPORTED_MODULE_4__["truncate"])(keys[0], maxLength);
    }
    for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {
        var serialized = keys.slice(0, includedKeys).join(', ');
        if (serialized.length > maxLength) {
            continue;
        }
        if (includedKeys === keys.length) {
            return serialized;
        }
        return Object(_string__WEBPACK_IMPORTED_MODULE_4__["truncate"])(serialized, maxLength);
    }
    return '';
}
/**
 * Given any object, return the new object with removed keys that value was `undefined`.
 * Works recursively on objects and arrays.
 */
function dropUndefinedKeys(val) {
    var e_1, _a;
    if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isPlainObject"])(val)) {
        var obj = val;
        var rv = {};
        try {
            for (var _b = tslib__WEBPACK_IMPORTED_MODULE_0__["__values"](Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) {
                var key = _c.value;
                if (typeof obj[key] !== 'undefined') {
                    rv[key] = dropUndefinedKeys(obj[key]);
                }
            }
        }
        catch (e_1_1) { e_1 = { error: e_1_1 }; }
        finally {
            try {
                if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
            }
            finally { if (e_1) throw e_1.error; }
        }
        return rv;
    }
    if (Array.isArray(val)) {
        return val.map(dropUndefinedKeys);
    }
    return val;
}
//# sourceMappingURL=object.js.map
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/path.js":
/*!************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/path.js ***!
  \************************************************/
/*! exports provided: resolve, relative, normalizePath, isAbsolute, join, dirname, basename */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resolve", function() { return resolve; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relative", function() { return relative; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalizePath", function() { return normalizePath; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isAbsolute", function() { return isAbsolute; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "join", function() { return join; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dirname", function() { return dirname; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basename", function() { return basename; });
// Slightly modified (no IE8 support, ES6) and transcribed to TypeScript
// https://raw.githubusercontent.com/calvinmetcalf/rollup-plugin-node-builtins/master/src/es6/path.js
/** JSDoc */
function normalizeArray(parts, allowAboveRoot) {
    // if the path tries to go above the root, `up` ends up > 0
    var up = 0;
    for (var i = parts.length - 1; i >= 0; i--) {
        var last = parts[i];
        if (last === '.') {
            parts.splice(i, 1);
        }
        else if (last === '..') {
            parts.splice(i, 1);
            up++;
        }
        else if (up) {
            parts.splice(i, 1);
            up--;
        }
    }
    // if the path is allowed to go above the root, restore leading ..s
    if (allowAboveRoot) {
        for (; up--; up) {
            parts.unshift('..');
        }
    }
    return parts;
}
// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
/** JSDoc */
function splitPath(filename) {
    var parts = splitPathRe.exec(filename);
    return parts ? parts.slice(1) : [];
}
// path.resolve([from ...], to)
// posix version
/** JSDoc */
function resolve() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resolvedPath = '';
    var resolvedAbsolute = false;
    for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
        var path = i >= 0 ? args[i] : '/';
        // Skip empty entries
        if (!path) {
            continue;
        }
        resolvedPath = path + "/" + resolvedPath;
        resolvedAbsolute = path.charAt(0) === '/';
    }
    // At this point the path should be resolved to a full absolute path, but
    // handle relative paths to be safe (might happen when process.cwd() fails)
    // Normalize the path
    resolvedPath = normalizeArray(resolvedPath.split('/').filter(function (p) { return !!p; }), !resolvedAbsolute).join('/');
    return (resolvedAbsolute ? '/' : '') + resolvedPath || '.';
}
/** JSDoc */
function trim(arr) {
    var start = 0;
    for (; start < arr.length; start++) {
        if (arr[start] !== '') {
            break;
        }
    }
    var end = arr.length - 1;
    for (; end >= 0; end--) {
        if (arr[end] !== '') {
            break;
        }
    }
    if (start > end) {
        return [];
    }
    return arr.slice(start, end - start + 1);
}
// path.relative(from, to)
// posix version
/** JSDoc */
function relative(from, to) {
    // tslint:disable:no-parameter-reassignment
    from = resolve(from).substr(1);
    to = resolve(to).substr(1);
    var fromParts = trim(from.split('/'));
    var toParts = trim(to.split('/'));
    var length = Math.min(fromParts.length, toParts.length);
    var samePartsLength = length;
    for (var i = 0; i < length; i++) {
        if (fromParts[i] !== toParts[i]) {
            samePartsLength = i;
            break;
        }
    }
    var outputParts = [];
    for (var i = samePartsLength; i < fromParts.length; i++) {
        outputParts.push('..');
    }
    outputParts = outputParts.concat(toParts.slice(samePartsLength));
    return outputParts.join('/');
}
// path.normalize(path)
// posix version
/** JSDoc */
function normalizePath(path) {
    var isPathAbsolute = isAbsolute(path);
    var trailingSlash = path.substr(-1) === '/';
    // Normalize the path
    var normalizedPath = normalizeArray(path.split('/').filter(function (p) { return !!p; }), !isPathAbsolute).join('/');
    if (!normalizedPath && !isPathAbsolute) {
        normalizedPath = '.';
    }
    if (normalizedPath && trailingSlash) {
        normalizedPath += '/';
    }
    return (isPathAbsolute ? '/' : '') + normalizedPath;
}
// posix version
/** JSDoc */
function isAbsolute(path) {
    return path.charAt(0) === '/';
}
// posix version
/** JSDoc */
function join() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    return normalizePath(args.join('/'));
}
/** JSDoc */
function dirname(path) {
    var result = splitPath(path);
    var root = result[0];
    var dir = result[1];
    if (!root && !dir) {
        // No dirname whatsoever
        return '.';
    }
    if (dir) {
        // It has a dirname, strip trailing slash
        dir = dir.substr(0, dir.length - 1);
    }
    return root + dir;
}
/** JSDoc */
function basename(path, ext) {
    var f = splitPath(path)[2];
    if (ext && f.substr(ext.length * -1) === ext) {
        f = f.substr(0, f.length - ext.length);
    }
    return f;
}
//# sourceMappingURL=path.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/polyfill.js":
/*!****************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/polyfill.js ***!
  \****************************************************/
/*! exports provided: setPrototypeOf */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setPrototypeOf", function() { return setPrototypeOf; });
var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties); // tslint:disable-line:no-unbound-method
/**
 * setPrototypeOf polyfill using __proto__
 */
function setProtoOf(obj, proto) {
    // @ts-ignore
    obj.__proto__ = proto;
    return obj;
}
/**
 * setPrototypeOf polyfill using mixin
 */
function mixinProperties(obj, proto) {
    for (var prop in proto) {
        if (!obj.hasOwnProperty(prop)) {
            // @ts-ignore
            obj[prop] = proto[prop];
        }
    }
    return obj;
}
//# sourceMappingURL=polyfill.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/promisebuffer.js":
/*!*********************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/promisebuffer.js ***!
  \*********************************************************/
/*! exports provided: PromiseBuffer */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PromiseBuffer", function() { return PromiseBuffer; });
/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./error */ "./node_modules/@sentry/utils/esm/error.js");
/* harmony import */ var _syncpromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./syncpromise */ "./node_modules/@sentry/utils/esm/syncpromise.js");


/** A simple queue that holds promises. */
var PromiseBuffer = /** @class */ (function () {
    function PromiseBuffer(_limit) {
        this._limit = _limit;
        /** Internal set of queued Promises */
        this._buffer = [];
    }
    /**
     * Says if the buffer is ready to take more requests
     */
    PromiseBuffer.prototype.isReady = function () {
        return this._limit === undefined || this.length() < this._limit;
    };
    /**
     * Add a promise to the queue.
     *
     * @param task Can be any PromiseLike<T>
     * @returns The original promise.
     */
    PromiseBuffer.prototype.add = function (task) {
        var _this = this;
        if (!this.isReady()) {
            return _syncpromise__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].reject(new _error__WEBPACK_IMPORTED_MODULE_0__["SentryError"]('Not adding Promise due to buffer limit reached.'));
        }
        if (this._buffer.indexOf(task) === -1) {
            this._buffer.push(task);
        }
        task
            .then(function () { return _this.remove(task); })
            .then(null, function () {
            return _this.remove(task).then(null, function () {
                // We have to add this catch here otherwise we have an unhandledPromiseRejection
                // because it's a new Promise chain.
            });
        });
        return task;
    };
    /**
     * Remove a promise to the queue.
     *
     * @param task Can be any PromiseLike<T>
     * @returns Removed promise.
     */
    PromiseBuffer.prototype.remove = function (task) {
        var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];
        return removedTask;
    };
    /**
     * This function returns the number of unresolved promises in the queue.
     */
    PromiseBuffer.prototype.length = function () {
        return this._buffer.length;
    };
    /**
     * This will drain the whole queue, returns true if queue is empty or drained.
     * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.
     *
     * @param timeout Number in ms to wait until it resolves with false.
     */
    PromiseBuffer.prototype.drain = function (timeout) {
        var _this = this;
        return new _syncpromise__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"](function (resolve) {
            var capturedSetTimeout = setTimeout(function () {
                if (timeout && timeout > 0) {
                    resolve(false);
                }
            }, timeout);
            _syncpromise__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].all(_this._buffer)
                .then(function () {
                clearTimeout(capturedSetTimeout);
                resolve(true);
            })
                .then(null, function () {
                resolve(true);
            });
        });
    };
    return PromiseBuffer;
}());

//# sourceMappingURL=promisebuffer.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/string.js":
/*!**************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/string.js ***!
  \**************************************************/
/*! exports provided: truncate, snipLine, safeJoin, isMatchingPattern */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "truncate", function() { return truncate; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "snipLine", function() { return snipLine; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "safeJoin", function() { return safeJoin; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isMatchingPattern", function() { return isMatchingPattern; });
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");

/**
 * Truncates given string to the maximum characters count
 *
 * @param str An object that contains serializable values
 * @param max Maximum number of characters in truncated string
 * @returns string Encoded
 */
function truncate(str, max) {
    if (max === void 0) { max = 0; }
    // tslint:disable-next-line:strict-type-predicates
    if (typeof str !== 'string' || max === 0) {
        return str;
    }
    return str.length <= max ? str : str.substr(0, max) + "...";
}
/**
 * This is basically just `trim_line` from
 * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67
 *
 * @param str An object that contains serializable values
 * @param max Maximum number of characters in truncated string
 * @returns string Encoded
 */
function snipLine(line, colno) {
    var newLine = line;
    var ll = newLine.length;
    if (ll <= 150) {
        return newLine;
    }
    if (colno > ll) {
        colno = ll; // tslint:disable-line:no-parameter-reassignment
    }
    var start = Math.max(colno - 60, 0);
    if (start < 5) {
        start = 0;
    }
    var end = Math.min(start + 140, ll);
    if (end > ll - 5) {
        end = ll;
    }
    if (end === ll) {
        start = Math.max(end - 140, 0);
    }
    newLine = newLine.slice(start, end);
    if (start > 0) {
        newLine = "'{snip} " + newLine;
    }
    if (end < ll) {
        newLine += ' {snip}';
    }
    return newLine;
}
/**
 * Join values in array
 * @param input array of values to be joined together
 * @param delimiter string to be placed in-between values
 * @returns Joined values
 */
function safeJoin(input, delimiter) {
    if (!Array.isArray(input)) {
        return '';
    }
    var output = [];
    // tslint:disable-next-line:prefer-for-of
    for (var i = 0; i < input.length; i++) {
        var value = input[i];
        try {
            output.push(String(value));
        }
        catch (e) {
            output.push('[value cannot be serialized]');
        }
    }
    return output.join(delimiter);
}
/**
 * Checks if the value matches a regex or includes the string
 * @param value The string value to be checked against
 * @param pattern Either a regex or a string that must be contained in value
 */
function isMatchingPattern(value, pattern) {
    if (!Object(_is__WEBPACK_IMPORTED_MODULE_0__["isString"])(value)) {
        return false;
    }
    if (Object(_is__WEBPACK_IMPORTED_MODULE_0__["isRegExp"])(pattern)) {
        return pattern.test(value);
    }
    if (typeof pattern === 'string') {
        return value.indexOf(pattern) !== -1;
    }
    return false;
}
//# sourceMappingURL=string.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/supports.js":
/*!****************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/supports.js ***!
  \****************************************************/
/*! exports provided: supportsErrorEvent, supportsDOMError, supportsDOMException, supportsFetch, supportsNativeFetch, supportsReportingObserver, supportsReferrerPolicy, supportsHistory */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsErrorEvent", function() { return supportsErrorEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsDOMError", function() { return supportsDOMError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsDOMException", function() { return supportsDOMException; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsFetch", function() { return supportsFetch; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsNativeFetch", function() { return supportsNativeFetch; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsReportingObserver", function() { return supportsReportingObserver; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsReferrerPolicy", function() { return supportsReferrerPolicy; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsHistory", function() { return supportsHistory; });
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./logger */ "./node_modules/@sentry/utils/esm/logger.js");
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");


/**
 * Tells whether current environment supports ErrorEvent objects
 * {@link supportsErrorEvent}.
 *
 * @returns Answer to the given question.
 */
function supportsErrorEvent() {
    try {
        // tslint:disable:no-unused-expression
        new ErrorEvent('');
        return true;
    }
    catch (e) {
        return false;
    }
}
/**
 * Tells whether current environment supports DOMError objects
 * {@link supportsDOMError}.
 *
 * @returns Answer to the given question.
 */
function supportsDOMError() {
    try {
        // It really needs 1 argument, not 0.
        // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':
        // 1 argument required, but only 0 present.
        // @ts-ignore
        // tslint:disable:no-unused-expression
        new DOMError('');
        return true;
    }
    catch (e) {
        return false;
    }
}
/**
 * Tells whether current environment supports DOMException objects
 * {@link supportsDOMException}.
 *
 * @returns Answer to the given question.
 */
function supportsDOMException() {
    try {
        // tslint:disable:no-unused-expression
        new DOMException('');
        return true;
    }
    catch (e) {
        return false;
    }
}
/**
 * Tells whether current environment supports Fetch API
 * {@link supportsFetch}.
 *
 * @returns Answer to the given question.
 */
function supportsFetch() {
    if (!('fetch' in Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])())) {
        return false;
    }
    try {
        // tslint:disable-next-line:no-unused-expression
        new Headers();
        // tslint:disable-next-line:no-unused-expression
        new Request('');
        // tslint:disable-next-line:no-unused-expression
        new Response();
        return true;
    }
    catch (e) {
        return false;
    }
}
/**
 * isNativeFetch checks if the given function is a native implementation of fetch()
 */
function isNativeFetch(func) {
    return func && /^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString());
}
/**
 * Tells whether current environment supports Fetch API natively
 * {@link supportsNativeFetch}.
 *
 * @returns true if `window.fetch` is natively implemented, false otherwise
 */
function supportsNativeFetch() {
    if (!supportsFetch()) {
        return false;
    }
    var global = Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
    // Fast path to avoid DOM I/O
    // tslint:disable-next-line:no-unbound-method
    if (isNativeFetch(global.fetch)) {
        return true;
    }
    // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)
    // so create a "pure" iframe to see if that has native fetch
    var result = false;
    var doc = global.document;
    // tslint:disable-next-line:no-unbound-method deprecation
    if (doc && typeof doc.createElement === "function") {
        try {
            var sandbox = doc.createElement('iframe');
            sandbox.hidden = true;
            doc.head.appendChild(sandbox);
            if (sandbox.contentWindow && sandbox.contentWindow.fetch) {
                // tslint:disable-next-line:no-unbound-method
                result = isNativeFetch(sandbox.contentWindow.fetch);
            }
            doc.head.removeChild(sandbox);
        }
        catch (err) {
            _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);
        }
    }
    return result;
}
/**
 * Tells whether current environment supports ReportingObserver API
 * {@link supportsReportingObserver}.
 *
 * @returns Answer to the given question.
 */
function supportsReportingObserver() {
    // tslint:disable-next-line: no-unsafe-any
    return 'ReportingObserver' in Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
}
/**
 * Tells whether current environment supports Referrer Policy API
 * {@link supportsReferrerPolicy}.
 *
 * @returns Answer to the given question.
 */
function supportsReferrerPolicy() {
    // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
    // https://caniuse.com/#feat=referrer-policy
    // It doesn't. And it throw exception instead of ignoring this parameter...
    // REF: https://github.com/getsentry/raven-js/issues/1233
    if (!supportsFetch()) {
        return false;
    }
    try {
        // tslint:disable:no-unused-expression
        new Request('_', {
            referrerPolicy: 'origin',
        });
        return true;
    }
    catch (e) {
        return false;
    }
}
/**
 * Tells whether current environment supports History API
 * {@link supportsHistory}.
 *
 * @returns Answer to the given question.
 */
function supportsHistory() {
    // 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 global = Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
    var chrome = global.chrome;
    // tslint:disable-next-line:no-unsafe-any
    var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;
    var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;
    return !isChromePackagedApp && hasHistoryApi;
}
//# sourceMappingURL=supports.js.map

/***/ }),

/***/ "./node_modules/@sentry/utils/esm/syncpromise.js":
/*!*******************************************************!*\
  !*** ./node_modules/@sentry/utils/esm/syncpromise.js ***!
  \*******************************************************/
/*! exports provided: SyncPromise */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SyncPromise", function() { return SyncPromise; });
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");

/** SyncPromise internal states */
var States;
(function (States) {
    /** Pending */
    States["PENDING"] = "PENDING";
    /** Resolved / OK */
    States["RESOLVED"] = "RESOLVED";
    /** Rejected / Error */
    States["REJECTED"] = "REJECTED";
})(States || (States = {}));
/**
 * Thenable class that behaves like a Promise and follows it's interface
 * but is not async internally
 */
var SyncPromise = /** @class */ (function () {
    function SyncPromise(executor) {
        var _this = this;
        this._state = States.PENDING;
        this._handlers = [];
        /** JSDoc */
        this._resolve = function (value) {
            _this._setResult(States.RESOLVED, value);
        };
        /** JSDoc */
        this._reject = function (reason) {
            _this._setResult(States.REJECTED, reason);
        };
        /** JSDoc */
        this._setResult = function (state, value) {
            if (_this._state !== States.PENDING) {
                return;
            }
            if (Object(_is__WEBPACK_IMPORTED_MODULE_0__["isThenable"])(value)) {
                value.then(_this._resolve, _this._reject);
                return;
            }
            _this._state = state;
            _this._value = value;
            _this._executeHandlers();
        };
        // TODO: FIXME
        /** JSDoc */
        this._attachHandler = function (handler) {
            _this._handlers = _this._handlers.concat(handler);
            _this._executeHandlers();
        };
        /** JSDoc */
        this._executeHandlers = function () {
            if (_this._state === States.PENDING) {
                return;
            }
            var cachedHandlers = _this._handlers.slice();
            _this._handlers = [];
            cachedHandlers.forEach(function (handler) {
                if (handler.done) {
                    return;
                }
                if (_this._state === States.RESOLVED) {
                    if (handler.onfulfilled) {
                        handler.onfulfilled(_this._value);
                    }
                }
                if (_this._state === States.REJECTED) {
                    if (handler.onrejected) {
                        handler.onrejected(_this._value);
                    }
                }
                handler.done = true;
            });
        };
        try {
            executor(this._resolve, this._reject);
        }
        catch (e) {
            this._reject(e);
        }
    }
    /** JSDoc */
    SyncPromise.prototype.toString = function () {
        return '[object SyncPromise]';
    };
    /** JSDoc */
    SyncPromise.resolve = function (value) {
        return new SyncPromise(function (resolve) {
            resolve(value);
        });
    };
    /** JSDoc */
    SyncPromise.reject = function (reason) {
        return new SyncPromise(function (_, reject) {
            reject(reason);
        });
    };
    /** JSDoc */
    SyncPromise.all = function (collection) {
        return new SyncPromise(function (resolve, reject) {
            if (!Array.isArray(collection)) {
                reject(new TypeError("Promise.all requires an array as input."));
                return;
            }
            if (collection.length === 0) {
                resolve([]);
                return;
            }
            var counter = collection.length;
            var resolvedCollection = [];
            collection.forEach(function (item, index) {
                SyncPromise.resolve(item)
                    .then(function (value) {
                    resolvedCollection[index] = value;
                    counter -= 1;
                    if (counter !== 0) {
                        return;
                    }
                    resolve(resolvedCollection);
                })
                    .then(null, reject);
            });
        });
    };
    /** JSDoc */
    SyncPromise.prototype.then = function (onfulfilled, onrejected) {
        var _this = this;
        return new SyncPromise(function (resolve, reject) {
            _this._attachHandler({
                done: false,
                onfulfilled: function (result) {
                    if (!onfulfilled) {
                        // TODO: ¯\_(ツ)_/¯
                        // TODO: FIXME
                        resolve(result);
                        return;
                    }
                    try {
                        resolve(onfulfilled(result));
                        return;
                    }
                    catch (e) {
                        reject(e);
                        return;
                    }
                },
                onrejected: function (reason) {
                    if (!onrejected) {
                        reject(reason);
                        return;
                    }
                    try {
                        resolve(onrejected(reason));
                        return;
                    }
                    catch (e) {
                        reject(e);
                        return;
                    }
                },
            });
        });
    };
    /** JSDoc */
    SyncPromise.prototype.catch = function (onrejected) {
        return this.then(function (val) { return val; }, onrejected);
    };
    /** JSDoc */
    SyncPromise.prototype.finally = function (onfinally) {
        var _this = this;
        return new SyncPromise(function (resolve, reject) {
            var val;
            var isRejected;
            return _this.then(function (value) {
                isRejected = false;
                val = value;
                if (onfinally) {
                    onfinally();
                }
            }, function (reason) {
                isRejected = true;
                val = reason;
                if (onfinally) {
                    onfinally();
                }
            }).then(function () {
                if (isRejected) {
                    reject(val);
                    return;
                }
                resolve(val);
            });
        });
    };
    return SyncPromise;
}());

//# sourceMappingURL=syncpromise.js.map

/***/ }),

/***/ "./node_modules/process/browser.js":
/*!*****************************************!*\
  !*** ./node_modules/process/browser.js ***!
  \*****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };


/***/ }),

/***/ "./node_modules/tslib/tslib.es6.js":
/*!*****************************************!*\
  !*** ./node_modules/tslib/tslib.es6.js ***!
  \*****************************************/
/*! exports provided: __extends, __assign, __rest, __decorate, __param, __metadata, __awaiter, __generator, __exportStar, __values, __read, __spread, __spreadArrays, __await, __asyncGenerator, __asyncDelegator, __asyncValues, __makeTemplateObject, __importStar, __importDefault */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __extends; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __assign; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__rest", function() { return __rest; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __decorate; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__param", function() { return __param; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__metadata", function() { return __metadata; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__awaiter", function() { return __awaiter; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__generator", function() { return __generator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__exportStar", function() { return __exportStar; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__values", function() { return __values; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__read", function() { return __read; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spread", function() { return __spread; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spreadArrays", function() { return __spreadArrays; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__await", function() { return __await; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncGenerator", function() { return __asyncGenerator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncDelegator", function() { return __asyncDelegator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncValues", function() { return __asyncValues; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__makeTemplateObject", function() { return __makeTemplateObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importStar", function() { return __importStar; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importDefault", function() { return __importDefault; });
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */

var extendStatics = function(d, b) {
    extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return extendStatics(d, b);
};

function __extends(d, b) {
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

var __assign = function() {
    __assign = Object.assign || function __assign(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    }
    return __assign.apply(this, arguments);
}

function __rest(s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
}

function __decorate(decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
}

function __param(paramIndex, decorator) {
    return function (target, key) { decorator(target, key, paramIndex); }
}

function __metadata(metadataKey, metadataValue) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
}

function __awaiter(thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
}

function __generator(thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
}

function __exportStar(m, exports) {
    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}

function __values(o) {
    var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
    if (m) return m.call(o);
    return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
}

function __read(o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
}

function __spread() {
    for (var ar = [], i = 0; i < arguments.length; i++)
        ar = ar.concat(__read(arguments[i]));
    return ar;
}

function __spreadArrays() {
    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
    for (var r = Array(s), k = 0, i = 0; i < il; i++)
        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
            r[k] = a[j];
    return r;
};

function __await(v) {
    return this instanceof __await ? (this.v = v, this) : new __await(v);
}

function __asyncGenerator(thisArg, _arguments, generator) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var g = generator.apply(thisArg, _arguments || []), i, q = [];
    return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
    function fulfill(value) { resume("next", value); }
    function reject(value) { resume("throw", value); }
    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
}

function __asyncDelegator(o) {
    var i, p;
    return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
}

function __asyncValues(o) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var m = o[Symbol.asyncIterator], i;
    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
}

function __makeTemplateObject(cooked, raw) {
    if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
    return cooked;
};

function __importStar(mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
    result.default = mod;
    return result;
}

function __importDefault(mod) {
    return (mod && mod.__esModule) ? mod : { default: mod };
}


/***/ }),

/***/ "./node_modules/vanilla-lazyload/dist/lazyload.min.js":
/*!************************************************************!*\
  !*** ./node_modules/vanilla-lazyload/dist/lazyload.min.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

!function(n,t){ true?module.exports=t():undefined}(this,(function(){"use strict";function n(){return(n=Object.assign||function(n){for(var t=1;t<arguments.length;t++){var e=arguments[t];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(n[i]=e[i])}return n}).apply(this,arguments)}var t="undefined"!=typeof window,e=t&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),i=t&&"IntersectionObserver"in window,a=t&&"classList"in document.createElement("p"),o=t&&window.devicePixelRatio>1,r={elements_selector:".lazy",container:e||t?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"loading",class_loaded:"loaded",class_error:"error",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1},c=function(t){return n({},r,t)},l=function(n,t){var e,i=new n(t);try{e=new CustomEvent("LazyLoad::Initialized",{detail:{instance:i}})}catch(n){(e=document.createEvent("CustomEvent")).initCustomEvent("LazyLoad::Initialized",!1,!1,{instance:i})}window.dispatchEvent(e)},s=function(n,t){return n.getAttribute("data-"+t)},u=function(n,t,e){var i="data-"+t;null!==e?n.setAttribute(i,e):n.removeAttribute(i)},d=function(n){return s(n,"ll-status")},f=function(n,t){return u(n,"ll-status",t)},_=function(n){return f(n,null)},g=function(n){return null===d(n)},v=function(n){return"native"===d(n)},p=["loading","loaded","applied","error"],b=function(n,t,e,i){n&&(void 0===i?void 0===e?n(t):n(t,e):n(t,e,i))},h=function(n,t){a?n.classList.add(t):n.className+=(n.className?" ":"")+t},m=function(n,t){a?n.classList.remove(t):n.className=n.className.replace(new RegExp("(^|\\s+)"+t+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")},E=function(n){return n.llTempImage},I=function(n,t){if(t){var e=t._observer;e&&e.unobserve(n)}},y=function(n,t){n&&(n.loadingCount+=t)},A=function(n,t){n&&(n.toLoadCount=t)},L=function(n){for(var t,e=[],i=0;t=n.children[i];i+=1)"SOURCE"===t.tagName&&e.push(t);return e},w=function(n,t,e){e&&n.setAttribute(t,e)},z=function(n,t){n.removeAttribute(t)},k=function(n){return!!n.llOriginalAttrs},O=function(n){if(!k(n)){var t={};t.src=n.getAttribute("src"),t.srcset=n.getAttribute("srcset"),t.sizes=n.getAttribute("sizes"),n.llOriginalAttrs=t}},C=function(n){if(k(n)){var t=n.llOriginalAttrs;w(n,"src",t.src),w(n,"srcset",t.srcset),w(n,"sizes",t.sizes)}},N=function(n,t){w(n,"sizes",s(n,t.data_sizes)),w(n,"srcset",s(n,t.data_srcset)),w(n,"src",s(n,t.data_src))},x=function(n){z(n,"src"),z(n,"srcset"),z(n,"sizes")},M=function(n,t){var e=n.parentNode;e&&"PICTURE"===e.tagName&&L(e).forEach(t)},R=function(n,t){L(n).forEach(t)},G={IMG:function(n,t){M(n,(function(n){O(n),N(n,t)})),O(n),N(n,t)},IFRAME:function(n,t){w(n,"src",s(n,t.data_src))},VIDEO:function(n,t){R(n,(function(n){w(n,"src",s(n,t.data_src))})),w(n,"poster",s(n,t.data_poster)),w(n,"src",s(n,t.data_src)),n.load()}},T=function(n,t){var e=G[n.tagName];e&&e(n,t)},D=function(n,t,e){y(e,1),h(n,t.class_loading),f(n,"loading"),b(t.callback_loading,n,e)},F={IMG:function(n,t){u(n,t.data_src,null),u(n,t.data_srcset,null),u(n,t.data_sizes,null),M(n,(function(n){u(n,t.data_srcset,null),u(n,t.data_sizes,null)}))},IFRAME:function(n,t){u(n,t.data_src,null)},VIDEO:function(n,t){u(n,t.data_src,null),u(n,t.data_poster,null),R(n,(function(n){u(n,t.data_src,null)}))}},V=function(n,t){u(n,t.data_bg_multi,null),u(n,t.data_bg_multi_hidpi,null)},j=function(n,t){var e=F[n.tagName];e?e(n,t):function(n,t){u(n,t.data_bg,null),u(n,t.data_bg_hidpi,null)}(n,t)},P=["IMG","IFRAME","VIDEO"],S=function(n,t){!t||function(n){return n.loadingCount>0}(t)||function(n){return n.toLoadCount>0}(t)||b(n.callback_finish,t)},U=function(n,t,e){n.addEventListener(t,e),n.llEvLisnrs[t]=e},$=function(n,t,e){n.removeEventListener(t,e)},q=function(n){return!!n.llEvLisnrs},H=function(n){if(q(n)){var t=n.llEvLisnrs;for(var e in t){var i=t[e];$(n,e,i)}delete n.llEvLisnrs}},B=function(n,t,e){!function(n){delete n.llTempImage}(n),y(e,-1),function(n){n&&(n.toLoadCount-=1)}(e),m(n,t.class_loading),t.unobserve_completed&&I(n,e)},J=function(n,t,e){var i=E(n)||n;q(i)||function(n,t,e){q(n)||(n.llEvLisnrs={});var i="VIDEO"===n.tagName?"loadeddata":"load";U(n,i,t),U(n,"error",e)}(i,(function(a){!function(n,t,e,i){var a=v(t);B(t,e,i),h(t,e.class_loaded),f(t,"loaded"),j(t,e),b(e.callback_loaded,t,i),a||S(e,i)}(0,n,t,e),H(i)}),(function(a){!function(n,t,e,i){var a=v(t);B(t,e,i),h(t,e.class_error),f(t,"error"),b(e.callback_error,t,i),a||S(e,i)}(0,n,t,e),H(i)}))},K=function(n,t,e){!function(n){n.llTempImage=document.createElement("IMG")}(n),J(n,t,e),function(n,t,e){var i=s(n,t.data_bg),a=s(n,t.data_bg_hidpi),r=o&&a?a:i;r&&(n.style.backgroundImage='url("'.concat(r,'")'),E(n).setAttribute("src",r),D(n,t,e))}(n,t,e),function(n,t,e){var i=s(n,t.data_bg_multi),a=s(n,t.data_bg_multi_hidpi),r=o&&a?a:i;r&&(n.style.backgroundImage=r,function(n,t,e){h(n,t.class_applied),f(n,"applied"),V(n,t),t.unobserve_completed&&I(n,t),b(t.callback_applied,n,e)}(n,t,e))}(n,t,e)},Q=function(n,t,e){!function(n){return P.indexOf(n.tagName)>-1}(n)?K(n,t,e):function(n,t,e){J(n,t,e),T(n,t),D(n,t,e)}(n,t,e)},W=["IMG","IFRAME"],X=function(n){return n.use_native&&"loading"in HTMLImageElement.prototype},Y=function(n,t,e){n.forEach((function(n){return function(n){return n.isIntersecting||n.intersectionRatio>0}(n)?function(n,t,e,i){f(n,"entered"),function(n,t,e){t.unobserve_entered&&I(n,e)}(n,e,i),b(e.callback_enter,n,t,i),function(n){return p.indexOf(d(n))>=0}(n)||Q(n,e,i)}(n.target,n,t,e):function(n,t,e,i){g(n)||(function(n,t,e,i){e.cancel_on_exit&&function(n){return"loading"===d(n)}(n)&&"IMG"===n.tagName&&(H(n),function(n){M(n,(function(n){x(n)})),x(n)}(n),function(n){M(n,(function(n){C(n)})),C(n)}(n),m(n,e.class_loading),y(i,-1),_(n),b(e.callback_cancel,n,t,i))}(n,t,e,i),b(e.callback_exit,n,t,i))}(n.target,n,t,e)}))},Z=function(n){return Array.prototype.slice.call(n)},nn=function(n){return n.container.querySelectorAll(n.elements_selector)},tn=function(n){return function(n){return"error"===d(n)}(n)},en=function(n,t){return function(n){return Z(n).filter(g)}(n||nn(t))},an=function(n,e){var a=c(n);this._settings=a,this.loadingCount=0,function(n,t){i&&!X(n)&&(t._observer=new IntersectionObserver((function(e){Y(e,n,t)}),function(n){return{root:n.container===document?null:n.container,rootMargin:n.thresholds||n.threshold+"px"}}(n)))}(a,this),function(n,e){t&&window.addEventListener("online",(function(){!function(n,t){var e;(e=nn(n),Z(e).filter(tn)).forEach((function(t){m(t,n.class_error),_(t)})),t.update()}(n,e)}))}(a,this),this.update(e)};return an.prototype={update:function(n){var t,a,o=this._settings,r=en(n,o);A(this,r.length),!e&&i?X(o)?function(n,t,e){n.forEach((function(n){-1!==W.indexOf(n.tagName)&&(n.setAttribute("loading","lazy"),function(n,t,e){J(n,t,e),T(n,t),j(n,t),f(n,"native")}(n,t,e))})),A(e,0)}(r,o,this):(a=r,function(n){n.disconnect()}(t=this._observer),function(n,t){t.forEach((function(t){n.observe(t)}))}(t,a)):this.loadAll(r)},destroy:function(){this._observer&&this._observer.disconnect(),nn(this._settings).forEach((function(n){delete n.llOriginalAttrs})),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(n){var t=this,e=this._settings;en(n,e).forEach((function(n){I(n,t),Q(n,e,t)}))}},an.load=function(n,t){var e=c(t);Q(n,e)},an.resetStatus=function(n){_(n)},t&&function(n,t){if(t)if(t.length)for(var e,i=0;e=t[i];i+=1)l(n,e);else l(n,t)}(an,window.lazyLoadOptions),an}));


/***/ }),

/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
  !*** (webpack)/buildin/global.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

var g;

// This works in non-strict mode
g = (function() {
	return this;
})();

try {
	// This works if eval is allowed (see CSP)
	g = g || new Function("return this")();
} catch (e) {
	// This works if the window reference is available
	if (typeof window === "object") g = window;
}

// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}

module.exports = g;


/***/ }),

/***/ "./node_modules/webpack/buildin/harmony-module.js":
/*!*******************************************!*\
  !*** (webpack)/buildin/harmony-module.js ***!
  \*******************************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = function(originalModule) {
	if (!originalModule.webpackPolyfill) {
		var module = Object.create(originalModule);
		// module.parent = undefined by default
		if (!module.children) module.children = [];
		Object.defineProperty(module, "loaded", {
			enumerable: true,
			get: function() {
				return module.l;
			}
		});
		Object.defineProperty(module, "id", {
			enumerable: true,
			get: function() {
				return module.i;
			}
		});
		Object.defineProperty(module, "exports", {
			enumerable: true
		});
		module.webpackPolyfill = 1;
	}
	return module;
};


/***/ }),

/***/ "./resources/js/app.js":
/*!*****************************!*\
  !*** ./resources/js/app.js ***!
  \*****************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sentry_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/browser */ "./node_modules/@sentry/browser/esm/index.js");
/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vanilla-lazyload */ "./node_modules/vanilla-lazyload/dist/lazyload.min.js");
/* harmony import */ var vanilla_lazyload__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(vanilla_lazyload__WEBPACK_IMPORTED_MODULE_1__);
/** ==========================================================================
 *  Dependencies
 *  =========================================================================*/
// We first import Sentry and trigger it if the sentry dsn is defined
// Because then all errors are logged

if (window.sentry_dsn !== undefined) _sentry_browser__WEBPACK_IMPORTED_MODULE_0__["init"]({
  dsn: window.sentry_dsn
});
/**
 * External
 */

__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");

__webpack_require__(/*! objectFitPolyfill */ "./node_modules/objectFitPolyfill/dist/objectFitPolyfill.min.js");


var lazyLoadInstance = new vanilla_lazyload__WEBPACK_IMPORTED_MODULE_1___default.a({// Your custom settings go here
});
/** ==========================================================================
 *  Global functionalities
 *  =========================================================================*/

__webpack_require__(/*! ./global/helpers */ "./resources/js/global/helpers.js"); // Should be first


__webpack_require__(/*! ./global/browserHandler */ "./resources/js/global/browserHandler.js");

__webpack_require__(/*! ./global/scrollHandler */ "./resources/js/global/scrollHandler.js");
/** ==========================================================================
 *  Component functionalities
 *  =========================================================================*/


__webpack_require__(/*! ./components/articleSliderHandler */ "./resources/js/components/articleSliderHandler.js");

__webpack_require__(/*! ./components/chocolateFactory */ "./resources/js/components/chocolateFactory.js");

__webpack_require__(/*! ./components/cookieHandler */ "./resources/js/components/cookieHandler.js"); // require('./components/InputHandler');


__webpack_require__(/*! ./components/mapsHandler */ "./resources/js/components/mapsHandler.js");

__webpack_require__(/*! ./components/overlayMenuHandler */ "./resources/js/components/overlayMenuHandler.js");

__webpack_require__(/*! ./components/scrollToHandler */ "./resources/js/components/scrollToHandler.js");

__webpack_require__(/*! ./components/sliderHandler */ "./resources/js/components/sliderHandler.js");

__webpack_require__(/*! ./components/tabsHandler */ "./resources/js/components/tabsHandler.js");

__webpack_require__(/*! ./components/worldMapHandler */ "./resources/js/components/worldMapHandler.js");

__webpack_require__(/*! ./components/youtubeHandler */ "./resources/js/components/youtubeHandler.js");

/***/ }),

/***/ "./resources/js/components/articleSliderHandler.js":
/*!*********************************************************!*\
  !*** ./resources/js/components/articleSliderHandler.js ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

var ArticleSliderHandler = {
  articles: null,
  currentIndex: 0,
  // Initialize cookie handler
  init: function init() {
    var articleSlider = document.querySelector('.js-article-slides');
    if (!isset(articleSlider)) return;
    ArticleSliderHandler.articles = articleSlider.querySelectorAll('.js-article-item');
    var previousButton = articleSlider.querySelector('.js-previous-article');
    var nextButton = articleSlider.querySelector('.js-next-article');
    nextButton.addEventListener('click', function () {
      ArticleSliderHandler.currentIndex++;
      if (ArticleSliderHandler.articles.length <= ArticleSliderHandler.currentIndex) ArticleSliderHandler.currentIndex = 0;
      ArticleSliderHandler.setActiveArticle();
    });
    previousButton.addEventListener('click', function () {
      ArticleSliderHandler.currentIndex--;
      if (ArticleSliderHandler.currentIndex < 0) ArticleSliderHandler.currentIndex = ArticleSliderHandler.articles.length - 1;
      ArticleSliderHandler.setActiveArticle();
    });
  },
  setActiveArticle: function setActiveArticle() {
    for (var i = 0; i < ArticleSliderHandler.articles.length; i++) {
      var article = ArticleSliderHandler.articles[i];

      if (i === ArticleSliderHandler.currentIndex) {
        article.classList.add('is-active');
      } else {
        article.classList.remove('is-active');
      }
    }
  }
};
ArticleSliderHandler.init();

/***/ }),

/***/ "./resources/js/components/chocolateFactory.js":
/*!*****************************************************!*\
  !*** ./resources/js/components/chocolateFactory.js ***!
  \*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
 | Prevent Bots handler
 |
 | We named this chocolate factory and belonging confusing js hooks
 | to prevent smart bots from blocking these variable or functions.
 |
 ========================================================================== */
var ChocolateFactory = {
  bannedVisitor: [],

  /** Get all the chocolate factory and start
   *  Looping through those start flashing tickets
   */
  enter: function enter() {
    var chocolateFactories = document.querySelectorAll('.js-chocolate-factory');

    if (isset(chocolateFactories)) {
      var amountOfChocolateFactories = chocolateFactories.length;

      for (var i = 0; i < amountOfChocolateFactories; i++) {
        var ChocolateBar = chocolateFactories[i];

        ChocolateFactory._flashTicket(ChocolateBar);
      }
    }
  },

  /**
   * If factory has a golden ticket
   * Then we can make them go on the tour if there has been click on the ticket
   *
   * @param chocolateBar
   * @private
   */
  _flashTicket: function _flashTicket(chocolateBar) {
    // Try get the ticket from the chocolateBar
    var goldenTicket = chocolateBar.querySelector('.js-golden-ticket'); // Only continue if chocolate bar has a golden ticket

    if (isset(goldenTicket)) {
      goldenTicket.addEventListener('click', function () {
        ChocolateFactory.enjoyTheTour(chocolateBar);
      });
    } else {
      console.log('To bad, no golden tickets has been found.');
    }
  },

  /**
   * Start the tour through the factory
   * And get the names and properties of the members of the group
   * If there are members in the group of course
   *
   * @param chocolateFactory
   */
  enjoyTheTour: function enjoyTheTour(chocolateFactory) {
    // Ask for the tour group
    var tourGroup = chocolateFactory.querySelectorAll('input, textarea');

    if (isset(tourGroup)) {
      // For each visitor we want a belonging Oompa Loompa
      var oompaLoompas = {};
      var amountOfOompaLoompas = 0;
      var tourGroupSize = tourGroup.length;

      for (var i = 0; i < tourGroupSize; i++) {
        // Get the visitor from the group
        var visitor = tourGroup[i]; // Ask for its name

        var visitorName = visitor.getAttribute('name'); // Check if the visitor is banned

        if (ChocolateFactory._isVisitorBanned(visitorName)) continue;
        oompaLoompas[visitorName] = ChocolateFactory._getArrangement(visitor);
        amountOfOompaLoompas++;
      } // Check for insurance that there are oompa loompas


      if (amountOfOompaLoompas === 0) return; // Send submit request

      ChocolateFactory._finishTour(oompaLoompas, chocolateFactory);
    } else {
      console.log('To bad, no members to visit this factory');
    }
  },

  /**
   * Check if the visitor name isn't allow
   *
   * @param visitorName
   * @returns {boolean}
   * @private
   */
  _isVisitorBanned: function _isVisitorBanned(visitorName) {
    if (ChocolateFactory.bannedVisitor.indexOf(visitorName) !== -1) {
      return true;
    }

    return false;
  },

  /**
   * Most get visitor have a normal arrangement
   * But sometimes there are special cases
   * Like a Selector or checkbox
   *
   * @param visitor
   * @returns {*}
   * @private
   */
  _getArrangement: function _getArrangement(visitor) {
    var visitorType = visitor.nodeName;

    switch (visitorType) {
      default:
        return visitor.value;
    }
  },

  /**
   * Finish the tour
   * If successful show thanks message
   * Or show defined error message or fallback
   *
   * @param group
   * @param chocolateFactory
   * @returns {*|void}
   * @private
   */
  _finishTour: function _finishTour(group, chocolateFactory) {
    // Add willie to the group
    group = ChocolateFactory._addWillieWonka(group); // Get the gate for finish the tour

    var gate = '/contact/process';

    try {
      Ajax.post(gate, group, function (HttpRequest) {
        var response = JSON.parse(HttpRequest.response);

        switch (HttpRequest.status) {
          case 200:
            return ChocolateFactory._thanksForVisiting(response.redirectUrl);

          case 422:
            return ChocolateFactory._giveFeedbackToMembers(response.errors, chocolateFactory);

          default:
            break;
        }

        return ChocolateFactory._unknownGapInFactory(chocolateFactory);
      });
    } catch (e) {
      return ChocolateFactory._unknownGapInFactory(chocolateFactory);
    }
  },

  /**
   * Add willie wonka to the group
   * Ps... it actually the secret code!
   *
   * @param group
   * @returns {*}
   * @private
   */
  _addWillieWonka: function _addWillieWonka(group) {
    group._willie = 'wonka';
    return group;
  },

  /**
   * Add the feedback to the desired area.
   * Most likely to the visitor directly, but sometime to the factory desired feedback area
   *
   * @param errors
   * @param chocolateFactory
   * @private
   */
  _giveFeedbackToMembers: function _giveFeedbackToMembers(errors, chocolateFactory) {
    // Grab the factory feedback area
    var feedbackArea = chocolateFactory.querySelector('.js-error-area'); // Clear the current html

    if (isset(feedbackArea)) feedbackArea.innerHTML = ''; // Clear the previous marked jackets

    ChocolateFactory._clearPreviousMarkedJackets(chocolateFactory);

    Object.keys(errors).forEach(function (visitor) {
      var jacket = null;
      var visitorFeedbackArea = null; // Honey elements doesn't has a accessible element

      if (visitor !== '_honey' && visitor !== '_secretCode') {
        // Grab the visitor
        var visitorNode = chocolateFactory.querySelector('#' + visitor); // Find the jacket of a visitor

        jacket = ChocolateFactory._grabVisitorJacket(visitorNode); // If found get the desired area

        if (isset(jacket)) visitorFeedbackArea = jacket.querySelector('.js-form-group-error'); // Clear the current html

        if (isset(visitorFeedbackArea)) visitorFeedbackArea.innerHTML = '';
      } // Get the feedback for this visitor


      var visitorFeedback = errors[visitor]; // Spit out each line

      var visitorFeedbackAmount = visitorFeedback.length;

      for (var i = 0; i < visitorFeedbackAmount; i++) {
        var visitorFeedbackLine = visitorFeedback[i]; // console.log(visitor, visitorFeedbackLine);
        // Honey elements doesn't has a accessible element area

        if (visitor !== '_honey' && visitor !== '_secretCode') {
          // Mark the jacket
          if (isset(jacket)) jacket.classList.add('has-error'); // Append feedback to visitor feedback area if defined

          if (isset(visitorFeedbackArea) && visitorFeedbackLine.length > 0) {
            var currentFeedbackArea = visitorFeedbackArea.innerHTML;
            currentFeedbackArea += '<span>' + capitalizeFirstLetter(visitorFeedbackLine) + '</span>';
            visitorFeedbackArea.innerHTML = currentFeedbackArea;
          }
        } // Append feedback to factory feedback area if defined


        if (isset(feedbackArea) && visitorFeedbackLine.length > 0) {
          var _currentFeedbackArea = feedbackArea.innerHTML;
          _currentFeedbackArea += '<li>' + capitalizeFirstLetter(visitorFeedbackLine) + '</li>';
          feedbackArea.innerHTML = _currentFeedbackArea;
        }
      }
    });
  },

  /**
   * Clear the previous marked jackets
   *
   * @param chocolateFactory
   * @private
   */
  _clearPreviousMarkedJackets: function _clearPreviousMarkedJackets(chocolateFactory) {
    var markedJackets = chocolateFactory.querySelectorAll('.has-error');
    var markedJacketsAmount = markedJackets.length;

    for (var i = 0; i < markedJacketsAmount; i++) {
      markedJackets[i].classList.remove('has-error');
    }
  },

  /**
   * Grab the jacket of the visitor
   *
   * @param visitor
   * @returns {null|*|(() => (Node | null))|ActiveX.IXMLDOMNode|(Node & ParentNode)}
   * @private
   */
  _grabVisitorJacket: function _grabVisitorJacket(visitor) {
    // Check if visitor is defined
    if (!isset(visitor)) return null; // Do loop settings

    currentLayer = visitor;
    safetyBreak = 0; // Grab the next layer till it is the jacket (or safetyBreak has been reached

    do {
      safetyBreak++;
      currentLayer = currentLayer.parentNode;
      if (currentLayer.classList.contains('js-form-group')) return currentLayer;
    } while (currentLayer.tagName !== 'BODY' && safetyBreak <= 10);

    return null;
  },

  /**
   * Redirect the visitor to the thanks page
   *
   * @param nextStop
   * @private
   */
  _thanksForVisiting: function _thanksForVisiting(nextStop) {
    window.location = nextStop;
  },

  /**
   * Unknown error occurred, log the error
   *
   * @param chocolateFactory
   * @private
   */
  _unknownGapInFactory: function _unknownGapInFactory(chocolateFactory) {
    console.log(chocolateFactory);
    console.log('ChocolateFactory: Unkown Error');
  }
};
ChocolateFactory.enter();

/***/ }),

/***/ "./resources/js/components/cookieHandler.js":
/*!**************************************************!*\
  !*** ./resources/js/components/cookieHandler.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Cookie handler
   - Primary usage for toggling the cookie message and/or switch
 ========================================================================== */
var CookieHandler = {
  cookieBar: null,
  cookieMessage: null,
  cookieFadeOutAnimationDuration: 400,
  acceptTracking: false,
  // Initialize cookie handler
  init: function init() {
    // Bind cookie bar to cookieMessage
    CookieHandler.cookieMessage = document.querySelector('.js-cookie-bar'); // Bind cookie bar to cookieBar

    CookieHandler.cookieBar = document.querySelector('.js-cookie-bar'); // If isset init the functions for cookie bar

    if (isset(CookieHandler.cookieBar)) {
      CookieHandler.initCookieBar();
    } // If either type of cookie has been found check if settings are defined


    if (isset(CookieHandler.cookieMessage)) {
      CookieHandler.checkForCookieSettings();
    }
  },
  // Init the cookie bar actions
  initCookieBar: function initCookieBar() {
    var closeButton = CookieHandler.cookieBar.querySelector('.js-disable-cookie-bar');

    if (isset(closeButton)) {
      closeButton.addEventListener('click', CookieHandler.closeCookieMessage);
    }
  },
  checkForCookieSettings: function checkForCookieSettings() {
    if (Cookie.get('cookieMessage')) {
      document.body.classList.add('is-cookies-accepted');
    } else {
      document.body.classList.remove('is-cookies-accepted');
    }
  },
  closeCookieMessage: function closeCookieMessage() {
    Cookie.set('cookieMessage', true, 90);
    CookieHandler.cookieMessage.classList.add('is-transitioning-out');
    document.body.classList.add('is-cookies-accepted');
  }
};
CookieHandler.init();

/***/ }),

/***/ "./resources/js/components/mapsHandler.js":
/*!************************************************!*\
  !*** ./resources/js/components/mapsHandler.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Google Maps handler
    - https://developers.google.com/maps/documentation/javascript/adding-a-google-map
 ========================================================================== */
var MapsHandler = {
  map: '',
  key: 'AIzaSyCVGPUmRmQRxXvzzWu3Xyu77XebQxQ-f4Y',
  location: {
    lat: 51.261089,
    lng: 5.598172
  },
  styling: '',
  init: function init() {
    // Get map by id
    MapsHandler.map = document.querySelector('.js-google-map'); // Check if a map is defined

    if (isset(MapsHandler.map)) {
      if (MapsHandler.map.hasAttribute('data-google-lat')) MapsHandler.location.lat = parseFloat(MapsHandler.map.getAttribute('data-google-lat'));
      if (MapsHandler.map.hasAttribute('data-google-lng')) MapsHandler.location.lng = parseFloat(MapsHandler.map.getAttribute('data-google-lng'));
      MapsHandler.setCustomStyling(); // See if google variable exists

      if (typeof google == 'undefined' || typeof google.maps == 'undefined') {
        // Load external script
        getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMap);
      } else {
        MapsHandler.drawMap();
      }
    }
  },
  drawMap: function drawMap() {
    // Create a map
    var map = new google.maps.Map(MapsHandler.map, {
      zoom: 14,
      center: MapsHandler.location,
      disableDefaultUI: true,
      styles: MapsHandler.styling
    });
    var contentString = '<div><p>Plan een route op ' + '<a target="_blank" href="https://www.google.com/maps/dir/?api=1&destination=' + MapsHandler.location.lat + ',' + MapsHandler.location.lng + '" class="link">' + 'google maps</a> ' + '</p></div>';
    var infowindow = new google.maps.InfoWindow({
      content: contentString
    }); // Add a marker

    var marker = new google.maps.Marker({
      position: MapsHandler.location,
      map: map // label: 'A'

    });
    marker.addListener('click', function () {
      infowindow.open(map, marker);
    });
  },
  setCustomStyling: function setCustomStyling() {
    MapsHandler.styling = [{
      "featureType": "water",
      "elementType": "geometry",
      "stylers": [{
        "color": "#e9e9e9"
      }, {
        "lightness": 17
      }]
    }, {
      "featureType": "landscape",
      "elementType": "geometry",
      "stylers": [{
        "color": "#f5f5f5"
      }, {
        "lightness": 20
      }]
    }, {
      "featureType": "road.highway",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#ffffff"
      }, {
        "lightness": 17
      }]
    }, {
      "featureType": "road.highway",
      "elementType": "geometry.stroke",
      "stylers": [{
        "color": "#ffffff"
      }, {
        "lightness": 29
      }, {
        "weight": 0.2
      }]
    }, {
      "featureType": "road.arterial",
      "elementType": "geometry",
      "stylers": [{
        "color": "#ffffff"
      }, {
        "lightness": 18
      }]
    }, {
      "featureType": "road.local",
      "elementType": "geometry",
      "stylers": [{
        "color": "#ffffff"
      }, {
        "lightness": 16
      }]
    }, {
      "featureType": "poi",
      "elementType": "geometry",
      "stylers": [{
        "color": "#f5f5f5"
      }, {
        "lightness": 21
      }]
    }, {
      "featureType": "poi.park",
      "elementType": "geometry",
      "stylers": [{
        "color": "#dedede"
      }, {
        "lightness": 21
      }]
    }, {
      "elementType": "labels.text.stroke",
      "stylers": [{
        "visibility": "on"
      }, {
        "color": "#ffffff"
      }, {
        "lightness": 16
      }]
    }, {
      "elementType": "labels.text.fill",
      "stylers": [{
        "saturation": 36
      }, {
        "color": "#333333"
      }, {
        "lightness": 40
      }]
    }, {
      "elementType": "labels.icon",
      "stylers": [{
        "visibility": "off"
      }]
    }, {
      "featureType": "transit",
      "elementType": "geometry",
      "stylers": [{
        "color": "#f2f2f2"
      }, {
        "lightness": 19
      }]
    }, {
      "featureType": "administrative",
      "elementType": "geometry.fill",
      "stylers": [{
        "color": "#fefefe"
      }, {
        "lightness": 20
      }]
    }, {
      "featureType": "administrative",
      "elementType": "geometry.stroke",
      "stylers": [{
        "color": "#fefefe"
      }, {
        "lightness": 17
      }, {
        "weight": 1.2
      }]
    }];
  }
};
MapsHandler.init();

/***/ }),

/***/ "./resources/js/components/overlayMenuHandler.js":
/*!*******************************************************!*\
  !*** ./resources/js/components/overlayMenuHandler.js ***!
  \*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* ==========================================================================
   Navigation handler
   - Handles the showing and hiding of the overlay-menu component which has the proper classes.
 ========================================================================== */
var bodyScrollLock = __webpack_require__(/*! body-scroll-lock */ "./node_modules/body-scroll-lock/lib/bodyScrollLock.min.js");

var OverlayMenuHandler = {
  // init: function () {
  //     const overlayMenuTrigger = document.querySelector('.js-overlay-menu-trigger');
  //     OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);
  // },
  init: function init() {
    var overlayMenuTriggerList = document.querySelectorAll('.js-overlay-menu-trigger');
    var overlayMenuTriggerListCount = overlayMenuTriggerList.length;

    if (isset(overlayMenuTriggerList) && overlayMenuTriggerListCount !== 0) {
      for (var i = 0; i < overlayMenuTriggerListCount; i++) {
        var overlayMenuTrigger = overlayMenuTriggerList[i];
        OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);
      }
    }
  },
  initOverlayMenu: function initOverlayMenu(overlayMenuTrigger) {
    overlayMenuTrigger.addEventListener('click', OverlayMenuHandler.toggleOverlayMenu, false);
  },
  toggleOverlayMenu: function toggleOverlayMenu(event) {
    var overlayMenuNav = document.querySelector('.js-overlay-menu'); // const overlayMenuBody = overlayMenu.querySelector('.js-overlay-menu-persist-scrolling');
    // Bail if overlayMenu doesn't exist

    if (!overlayMenuNav) return; // Clear previously locked scroll on the body

    bodyScrollLock.enableBodyScroll(overlayMenuNav); // If the overlayMenu is already active, collapse it and quit

    if (document.body.classList.contains('is-overlay-menu-active')) {
      overlayMenuNav.querySelectorAll('[tabindex="0"]').forEach(function (elem) {
        elem.tabIndex = -1;
      });
      document.body.classList.remove('is-overlay-menu-active');
      return;
    } // Lock scrolling on the body


    bodyScrollLock.disableBodyScroll(overlayMenuNav);
    overlayMenuNav.querySelectorAll('[tabindex="-1"]').forEach(function (elem) {
      elem.tabIndex = 0;
    }); // Toggle active overlayMenu by setting a class on the body

    document.body.classList.toggle('is-overlay-menu-active');
    overlayMenuNav.hidden = false;
  }
};
OverlayMenuHandler.init();

/***/ }),

/***/ "./resources/js/components/scrollToHandler.js":
/*!****************************************************!*\
  !*** ./resources/js/components/scrollToHandler.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Scroll To Click handler
 ========================================================================== */
var ScrollToHandler = {
  // Animation settings
  offset: 60,
  //pixel
  duration: 1400,
  //ms
  // Animation variables
  body: null,
  start: 0,
  change: 0,
  currentTime: 0,
  allowAnimation: false,
  scrollToAnimation: null,
  // Watch the EasingFunction helper for the available methods
  easing: 'easeInOutQuad',
  init: function init() {
    var anchorLinks = document.querySelectorAll('.js-scroll-to-target');
    var anchorLinksAmount = anchorLinks.length;

    for (var i = 0; i < anchorLinksAmount; i++) {
      var anchorLink = anchorLinks[i];
      anchorLink.addEventListener('click', function (event) {
        ScrollToHandler.prepareScrollTo(this.getAttribute('href'));
        event.preventDefault();
      });
    }
  },

  /**
   * Prepare the Handler for the animation
   */
  prepareScrollTo: function prepareScrollTo(elementId) {
    // Get the scroll to element
    elementId = elementId.substr(elementId.indexOf('#') + 1);
    var scrollToElement = document.getElementById(elementId);
    if (scrollToElement == null) return;
    var scrollToElementPosition = scrollToElement.getBoundingClientRect(); // Reset or define the Handler variables

    ScrollToHandler.body = document.documentElement;
    ScrollToHandler.start = Math.max(ScrollToHandler.body.scrollTop, document.body.scrollTop, window.pageYOffset); //Use Math.max because safari doesn't support document.documentElement.scrollTop

    ScrollToHandler.change = scrollToElementPosition.top + ScrollToHandler.start - ScrollToHandler.start - ScrollToHandler.offset;
    ScrollToHandler.startTime = 'now' in window.performance ? performance.now() : new Date().getTime();
    ScrollToHandler.allowAnimation = true; // Trigger animation

    scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll); // Stop on scroll

    window.addEventListener('mousedown', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('wheel', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('DOMMouseScroll', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('mousewheel', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('keyup', ScrollToHandler.abortScrollAnimation);
    window.addEventListener('touchmove', ScrollToHandler.abortScrollAnimation);
  },

  /*
   * Animate the scroll position
   */
  animateScroll: function animateScroll(timestamp) {
    // Calculate progress from 0 - 1
    var progress = Math.min(1, (timestamp - ScrollToHandler.startTime) / ScrollToHandler.duration);
    if (progress < 0) progress = 0; // Convert progress with easing function

    progress = EasingFunctions[ScrollToHandler.easing](progress);
    var newScrollTop = ScrollToHandler.start + ScrollToHandler.change * progress;
    ScrollToHandler.body.scrollTop = newScrollTop;
    if (ScrollToHandler.body.scrollTop === 0) document.body.scrollTop = newScrollTop; // Safari doesn't support so if ScrollToHandler.body.scrollTop is 0 force the scroll position through document.body.scrollTop

    if (progress < 1 && ScrollToHandler.allowAnimation) {
      scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);
    }
  },

  /*
   * Abort the scroll animation
   */
  abortScrollAnimation: function abortScrollAnimation(event) {
    ScrollToHandler.allowAnimation = false;
    cancelAnimationFrame(ScrollToHandler.scrollToAnimation);
  }
};
ScrollToHandler.init();

/***/ }),

/***/ "./resources/js/components/sliderHandler.js":
/*!**************************************************!*\
  !*** ./resources/js/components/sliderHandler.js ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* Example

const headerImageSliderSetting = new SliderProjectorSetting({
    sliderProjectorId: 'header-image-slider',
    slideQuery: '#header-image-slider .placeholder figure',
    dots: '#header-image-slider .slider-navigation-labels .navigation span',
    autoSlider: true,
    sliderInterval: 4000
});
headerImageSliderSetting = headerImageSliderSetting.prepareParameters();

const headerImageSlider = new SliderProjector(headerImageSliderSetting).init();

 */
var Sliders = [];
var sliderContainers = document.querySelectorAll('.js-slider');
var sliderContainersLength = sliderContainers.length;

for (var i = 0; i < sliderContainersLength; i++) {
  var slider = sliderContainers[i];
  var sliderId = slider.getAttribute('id');

  if (sliderId !== null) {
    var Slidersetting = new SliderSetting({
      sliderId: sliderId,
      autoSlider: slider.getAttribute('data-auto-slide'),
      slideQuery: '#' + sliderId + ' .js-slider-slide',
      navigationButtons: '#' + sliderId + ' .js-slider-button',
      dots: '#' + sliderId + ' .js-slider-indicator'
    });
    Sliders.push(new Slider(Slidersetting.prepareParameters()).init());
  } else console.log('An image slider has no id...');
}

function SliderSetting(settingsObject) {
  var self = this;
  this.sliderId = '';
  this.autoSlider = false;
  this.sliderInterval = 4000;
  this.navigationButtons = '';
  this.dots = '';
  this.slideQuery = '';

  this.setSliderId = function (string) {
    this.sliderId = string;
    return this;
  };

  this.setAutoSlider = function (_boolean) {
    this.autoSlider = _boolean;
    return this;
  };

  this.setSliderInterval = function (integer) {
    this.sliderInterval = integer;
    return this;
  };

  this.setSlideQuery = function (string) {
    this.slideQuery = string;
    return this;
  };

  this.setNavigationButtons = function (string) {
    this.navigationButtons = string;
    return this;
  };

  this.setDots = function (string) {
    this.dots = string;
    return this;
  };

  this.getSliderId = function () {
    return this.sliderId;
  };

  this.getAutoSlider = function () {
    var autoSlide = this.autoSlider;

    if (!Number.isInteger(autoSlide)) {
      if (autoSlide == false) autoSlide = false;else autoSlide = true;
    }

    return autoSlide;
  };

  this.getSliderInterval = function () {
    return this.sliderInterval;
  };

  this.getSlideQuery = function () {
    return this.slideQuery;
  };

  this.getNavigationButtons = function () {
    return this.navigationButtons;
  };

  this.getDots = function () {
    return this.dots;
  }; // Invert setters to getters


  this.prepareParameters = function () {
    return {
      sliderId: self.getSliderId(),
      autoSlider: self.getAutoSlider(),
      sliderInterval: self.getSliderInterval(),
      navigationButtons: self.getNavigationButtons(),
      dots: self.getDots(),
      slideQuery: self.getSlideQuery()
    };
  }; // Mass assign settings


  this.fill = function () {
    // Object.keys(settingsObject).forEach(function (key) {
    //     self[key] = settingsObject[key];
    // });
    var settingsObjectKeys = Object.keys(settingsObject);
    var settingsObjectLength = settingsObjectKeys.length;

    for (var _i = 0; _i < settingsObjectLength; _i++) {
      var key = settingsObjectKeys[_i];
      self[key] = settingsObject[key];
    }
  };

  this.fill();
  return {
    sliderId: self.setSliderId,
    autoSlider: self.setAutoSlider,
    sliderInterval: self.setSliderInterval,
    navigationButtons: self.setNavigationButtons,
    dots: self.setDots,
    slideQuery: self.setSlideQuery,
    prepareParameters: self.prepareParameters
  };
}

function Slider(settings) {
  //Define Slider object
  var self = this;
  this.sliderObject = ''; //SlideParameters

  this.activeSlideId = 0;
  this.previousSlideId = 0;
  this.nextSlideId = 0;
  this.availableSlides = 1;
  this.slides = [];
  this.autoSliderInterval = null;
  this.settings = {};

  this.init = function () {
    //Append settings to self
    this.settings = settings; //Assign needed elements and calculations

    this.sliderObject = document.getElementById(this.settings.sliderId);
    this.slides = document.querySelectorAll(this.settings.slideQuery);
    this.availableSlides = this.slides.length;
    this.activeSlideId = 0; // Set active slide (and possible previous and next classes)

    this.setSlide(); // Swipe interaction

    var swipeGestures = new Hammer(this.sliderObject);
    swipeGestures.on('swipeleft', function () {
      self.resetAutoSlider();
      self.nextSlide();
      self.setSlide();
    });
    swipeGestures.on('swiperight', function () {
      self.resetAutoSlider();
      self.previousSlide();
      self.setSlide();
    });

    if (this.settings.navigationButtons !== '') {
      // Click interaction
      var navigationButtons = document.querySelectorAll(this.settings.navigationButtons);
      var navigationButtonsLength = navigationButtons.length;

      for (var _i2 = 0; _i2 < navigationButtonsLength; _i2++) {
        var navigationButton = navigationButtons[_i2];
        navigationButton.addEventListener('click', function () {
          self.clickNavigationButton(this);
        });
      }
    }

    if (this.settings.dots !== '') {
      // Click interaction
      var dots = document.querySelectorAll(this.settings.dots);
      var dotsLength = dots.length; // console.log(this.settings.dots);
      // console.log(dots);

      for (var _i3 = 0; _i3 < dotsLength; _i3++) {
        var dot = dots[_i3];
        dot.addEventListener('click', function () {
          self.clickDot(this);
        });
      }
    }

    self.autoSlider();
  };

  this.autoSlider = function () {
    // Reset the interval if defined
    if (this.autoSliderInterval !== null) clearInterval(this.autoSliderInterval); // Check if should auto slide before creating the interval
    // We do this inhere, because the autoslide function is also called by other functionality

    if (this.settings.autoSlider !== false && Number.isInteger(this.settings.sliderInterval)) {
      this.autoSliderInterval = setInterval(function () {
        self.nextSlide();
        self.setSlide();
      }, this.settings.sliderInterval);
    }
  };

  this.resetAutoSlider = self.autoSlider;

  this.nextSlide = function () {
    this.activeSlideId++;
    if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;
  };

  this.previousSlide = function () {
    this.activeSlideId--;
    if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;
  };

  this.setSlide = function () {
    // Loop through the form elements
    var slidesLength = self.slides.length;

    for (var _i4 = 0; _i4 < slidesLength; _i4++) {
      var slide = self.slides[_i4];
      slide.style.pointerEvents = "none"; // Needed for swipe functionality
      // Convert data set attribute to desired type

      var slideOrder = parseInt(slide.getAttribute('data-order')); // Remove and set active for all slides

      if (slideOrder !== self.activeSlideId) slide.classList.remove('is-active');else slide.classList.add('is-active');
    }

    if (self.settings.dots !== '') {
      self.setActiveDot();
    }
  };

  this.clickNavigationButton = function (navButton) {
    var navButtonDirection = navButton.getAttribute('aria-label');
    if (navButtonDirection === 'next') this.nextSlide();else if (navButtonDirection === 'previous') this.previousSlide();
    self.setSlide();
    self.resetAutoSlider();
  };

  this.clickDot = function (clickedDot) {
    self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));
    self.setSlide();
    self.resetAutoSlider();
  };

  this.setActiveDot = function () {
    var dots = document.querySelectorAll(this.settings.dots);
    var dotsLength = dots.length;

    for (var _i5 = 0; _i5 < dotsLength; _i5++) {
      var dot = dots[_i5];
      dotOrder = parseInt(dot.getAttribute('data-order'));

      if (dotOrder !== self.activeSlideId) {
        dot.classList.remove('is-active');
        dot.tabIndex = 0;
      } else {
        dot.classList.add('is-active');
        dot.tabIndex = -1;
      }
    }
  };
}

/***/ }),

/***/ "./resources/js/components/tabsHandler.js":
/*!************************************************!*\
  !*** ./resources/js/components/tabsHandler.js ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Tabs handler
   - Handles the tabs component which has the proper classes.
 ========================================================================== */
var TabsHandler = {
  tabsList: null,
  tabs: null,
  init: function init() {
    TabsHandler.tabsList = document.querySelectorAll('.js-tabs');
    var tabsListCount = TabsHandler.tabsList.length;

    if (isset(TabsHandler.tabsList) && tabsListCount !== 0) {
      for (var i = 0; i < tabsListCount; i++) {
        var _tabs = TabsHandler.tabsList[i];
        TabsHandler.initTabs(_tabs);
      }
    }
  },
  initTabs: function initTabs(tabs) {
    var container = tabs.querySelector('.js-tabs-container'); // Check if container element exists

    if (container == null) {
      console.error("There is no container for the content tabs defined.");
      return;
    }

    var triggers = tabs.querySelectorAll('.js-tabs-trigger');
    var tabsContent = container.querySelectorAll('.js-tabs-content'); // Check if number of triggers and tabs match

    if (triggers.length !== tabs.length) {
      console.error("There are ".concat(triggers.length, " trigger buttons and ").concat(tabs.length, " tabs. These must match."));
    }

    tabs.addEventListener('click', function (event) {
      // Check if clicked on a step button (prev or next)
      if (event.target.closest('.js-tabs-step')) {
        var dir = event.target.closest('.js-tabs-step').getAttribute('data-step');
        TabsHandler.stepTabs(dir, triggers, tabsContent);
      } // Bail if we didn't click on the trigger element


      if (!event.target.classList.contains('js-tabs-trigger')) return; // Bail if already active

      if (event.target.classList.contains('is-active')) {
        return;
      }

      TabsHandler.toggleTabs(event.target.dataset.tabId, triggers, tabsContent);
    });
  },
  toggleTabs: function toggleTabs(tabId, triggers, tabsContent) {
    if (isset(triggers) && triggers.length > 0) {
      // Loop through all tabs
      for (var i = 0; i < triggers.length; i++) {
        var tabsTab = tabsContent[i];
        var tabsTrigger = triggers[i];
        tabsTrigger.classList.remove('is-active');
        tabsTrigger.tabIndex = 0;
        tabsTab.classList.remove('is-active');

        if (tabsTab.dataset.tabId === tabId) {
          tabsTrigger.classList.add('is-active');
          tabsTrigger.tabIndex = -1;
          tabsTab.classList.add('is-active');
        }
      }
    }
  },
  stepTabs: function stepTabs(dir, triggers, tabsContent) {
    var triggerCount = triggers.length;
    var activeId = 1;
    var newId = 0;

    if (isset(triggers) && triggerCount > 0) {
      // Loop through all tabs
      for (var i = 0; i < triggerCount; i++) {
        var tabsTab = tabsContent[i];
        var tabsTrigger = triggers[i]; // Set activeId

        if (tabsTab.classList.contains('is-active')) {
          activeId = Number(tabsTab.getAttribute('data-tab-id'));
        } // Check what next Id will be


        if (dir === 'next') {
          if (activeId === triggerCount) {
            newId = 0;
          } else {
            newId = activeId;
          }
        } else if (dir === 'prev') {
          if (activeId === 1) {
            newId = triggerCount - 1;
          } else {
            newId = activeId - 2;
          }
        } // Remove active class


        tabsTrigger.tabIndex = 0;
        tabsTab.classList.remove('is-active');
        tabsTrigger.classList.remove('is-active');
      }

      triggers[newId].tabIndex = -1;
      triggers[newId].classList.add('is-active');
      tabs[newId].classList.add('is-active');
    }
  }
};
TabsHandler.init();

/***/ }),

/***/ "./resources/js/components/worldMapHandler.js":
/*!****************************************************!*\
  !*** ./resources/js/components/worldMapHandler.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

var WorldMapHandler = {
  worldMap: null,
  visitedCountries: null,
  marker: null,
  timeoutFunction: null,
  init: function init() {
    WorldMapHandler.worldMap = document.querySelector('.js-world-map');
    WorldMapHandler.marker = document.querySelector('.js-world-map-marker');
    WorldMapHandler.visitedCountries = document.querySelectorAll('.js-world-map-items li');
    if (!isset(WorldMapHandler.worldMap) || !isset(WorldMapHandler.visitedCountries)) return;
    WorldMapHandler.worldMap.addEventListener('mousemove', function (e) {
      WorldMapHandler.marker.style.top = e.clientY + 'px';
      WorldMapHandler.marker.style.left = e.clientX + 'px';
    });
    var visitedCountriesLength = WorldMapHandler.visitedCountries.length;

    for (var i = 0; i < visitedCountriesLength; i++) {
      var visitedCountry = WorldMapHandler.visitedCountries[i];
      var iso = visitedCountry.getAttribute('data-iso');
      if (!isset(iso) || iso === '') continue;
      var svgNode = WorldMapHandler.worldMap.querySelector('#' + iso);
      if (isset(svgNode)) WorldMapHandler.initEventListeners(svgNode, visitedCountry);
    }
  },
  initEventListeners: function initEventListeners(svgNode, visitedCountry) {
    svgNode.addEventListener('mouseenter', function () {
      var visitedCountry = document.querySelector('.js-world-map-items li[data-iso="' + this.id + '"]');
      var visitedCountryName = visitedCountry.getAttribute('data-name');

      if (WorldMapHandler.marker.getAttribute('data-name') !== visitedCountryName) {
        WorldMapHandler.marker.setAttribute('data-name', visitedCountryName);
        WorldMapHandler.marker.classList.remove('fade-out');
        clearTimeout(WorldMapHandler.timeoutFunction);
      }
    });
    svgNode.addEventListener('mouseleave', function () {
      var visitedCountry = document.querySelector('.js-world-map-items li[data-iso="' + this.id + '"]');
      var visitedCountryName = visitedCountry.getAttribute('data-name');

      if (WorldMapHandler.marker.getAttribute('data-name') === visitedCountryName) {
        WorldMapHandler.marker.classList.add('fade-out');
        WorldMapHandler.timeoutFunction = setTimeout(function () {
          WorldMapHandler.marker.setAttribute('data-name', '');
          WorldMapHandler.marker.classList.remove('fade-out');
        }, 300);
      }
    });

    if (visitedCountry.getAttribute('data-href') !== null) {
      svgNode.classList.add('clickable');
      svgNode.addEventListener('click', function () {
        window.location = visitedCountry.getAttribute('data-href');
      });
    }
  },
  clearMarker: function clearMarker() {
    WorldMapHandler.marker.setAttribute('data-name', '');
    WorldMapHandler.marker.classList.remove('fade-out');
    WorldMapHandler.marker.classList.remove('is-clickable');
  }
};
WorldMapHandler.init();

/***/ }),

/***/ "./resources/js/components/youtubeHandler.js":
/*!***************************************************!*\
  !*** ./resources/js/components/youtubeHandler.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Youtube handler
 ========================================================================== */
var YoutubeHandler = {
  youtubeClass: '.js-youtube-player',
  players: [],
  init: function init() {
    // Get the youtube players containers
    var youtubePlayers = document.querySelectorAll(YoutubeHandler.youtubeClass);
    var youtubePlayersAmount = youtubePlayers.length;

    for (var i = 0; i < youtubePlayersAmount; i++) {
      var youtubePlayer = youtubePlayers[i];
      var youtubePlayerId = youtubePlayer.getAttribute('id');

      if (youtubePlayerId !== null) {
        // Strip the necessary data from the html and create objects from it
        var youtubeElement = {
          id: youtubePlayer.getAttribute('id'),
          link: youtubePlayer.getAttribute('data-youtube-link'),
          autoPlay: parseInt(youtubePlayer.getAttribute('data-auto-play'))
        };
        YoutubeHandler.players.push(youtubeElement);
      } else {
        console.log("Element not include because there isn't a id on the player");
        console.log(youtubePlayer);
      }
    }

    if (youtubePlayersAmount >= 1) YoutubeHandler.initYoutube();
  },

  /**
   * Check if external script is loaded
   *
   */
  initYoutube: function initYoutube() {
    // See if YT variable exists
    if (typeof YT == 'undefined' || typeof YT.Player == 'undefined') {
      // Setup API ready function
      window.onYouTubePlayerAPIReady = function () {
        YoutubeHandler.loadPlayers();
      }; // Load external script


      getScript('https://www.youtube.com/iframe_api'); // If YT already exists load player
    } else {
      YoutubeHandler.loadPlayers();
    }
  },

  /**
   * Create the Youtube player(s) with parameters
   * And rewrite the players to key them by the element id
   *
   */
  loadPlayers: function loadPlayers() {
    var players = [];
    var youtubePlayersAmount = YoutubeHandler.players.length;

    for (var i = 0; i < youtubePlayersAmount; i++) {
      var youtubePlayer = YoutubeHandler.players[i]; // Load player

      youtubePlayer.player = new YT.Player(youtubePlayer.id, {
        height: 200,
        width: 200,
        videoId: youtubePlayer.link,
        host: 'https://www.youtube-nocookie.com',
        playerVars: {
          modestbranding: 0,
          rel: 0,
          disablekb: 1,
          autoplay: youtubePlayer.autoPlay
        },
        events: {
          // 'onReady': YoutubeHandler.onReady,
          'onStateChange': YoutubeHandler.onStateChange
        }
      });
      players[youtubePlayer.id] = youtubePlayer;
    }

    YoutubeHandler.players = players;
  },

  /**
   * When player is ready to play
   */
  onReady: function onReady(event) {
    var playerContainerId = event.target.getIframe().getAttribute('id');
    var player = YoutubeHandler.players[playerContainerId].player; // Show video
    // setTimeout(function(){ $('#' + playerContainerId).stop().animate({ opacity: 1 },1000) },800);
    // If not on tablet or mobile, play on high quality
    // player.mute();
    // player.playVideo();
    // player.setPlaybackQuality('hd1080');
  },

  /**
   * Listener for Youtube state change
   */
  onStateChange: function onStateChange(event) {
    var playerContainerId = event.target.getIframe().getAttribute('id');
    var player = YoutubeHandler.players[playerContainerId].player;
    var videoState = event.data; // Loop video

    if (event.data === YT.PlayerState.ENDED) {
      player.playVideo();
    }
  }
};
YoutubeHandler.init();

/***/ }),

/***/ "./resources/js/global/browserHandler.js":
/*!***********************************************!*\
  !*** ./resources/js/global/browserHandler.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Browser Handler
 ========================================================================== */
var BrowserHandler = {
  userAgent: '',
  browserInfo: '',
  init: function init() {
    BrowserHandler.userAgent = window.navigator.userAgent;
    BrowserHandler.browserInfo = BrowserHandler.getBrowserInfo();
    BrowserHandler.handleIE();
    BrowserHandler.handleSafari();
  },
  handleIE: function handleIE() {
    // Detect versions below ie11
    var msie = BrowserHandler.userAgent.indexOf('MSIE ');
    var ielt11 = msie > 0; // Detect ie11

    var ie11 = !!navigator.userAgent.match(/Trident.*rv\:11\./); // If Internet Explorer

    if (ielt11 || ie11) {
      // Default version
      var version = '11'; // Way to detect version < 11

      if (ielt11) version = parseInt(BrowserHandler.userAgent.substring(msie + 5, BrowserHandler.userAgent.indexOf(".", msie))); // Append classes to HTML (we have to do this separately because else ie will fail)

      document.body.classList.add('ie');
      document.body.classList.add('v' + version);
    }
  },
  // Fallback for older safari version
  handleSafari: function handleSafari() {
    if (BrowserHandler.browserInfo.name === 'Safari' && BrowserHandler.browserInfo.version <= 10) {
      document.getElementsByTagName('html')[0].classList.add('ie');
    }
  },
  getBrowserInfo: function getBrowserInfo() {
    var ua = navigator.userAgent,
        tem,
        M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];

    if (/trident/i.test(M[1])) {
      tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
      return {
        name: 'IE ',
        version: tem[1] || ''
      };
    }

    if (M[1] === 'Chrome') {
      tem = ua.match(/\bOPR\/(\d+)/);

      if (tem != null) {
        return {
          name: 'Opera',
          version: tem[1]
        };
      }
    }

    M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];

    if ((tem = ua.match(/version\/(\d+)/i)) != null) {
      M.splice(1, 1, tem[1]);
    }

    return {
      name: M[0],
      version: M[1]
    };
  }
};
BrowserHandler.init();

/***/ }),

/***/ "./resources/js/global/helpers.js":
/*!****************************************!*\
  !*** ./resources/js/global/helpers.js ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
    Helper functions
 ========================================================================== */

/*
 * Simple isset method for this does not exist in javascript
 */
window.isset = function (obj) {
  return typeof obj !== 'undefined' && obj !== null;
};
/*
 * Easing Functions - inspired from http://gizma.com/easing/
 * only considering the t value for the range [0, 1] => [0, 1]
 */


window.EasingFunctions = {
  // no easing, no acceleration
  linear: function linear(t) {
    return t;
  },
  // accelerating from zero velocity
  easeInQuad: function easeInQuad(t) {
    return t * t;
  },
  // decelerating to zero velocity
  easeOutQuad: function easeOutQuad(t) {
    return t * (2 - t);
  },
  // acceleration until halfway, then deceleration
  easeInOutQuad: function easeInOutQuad(t) {
    return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
  },
  // accelerating from zero velocity
  easeInCubic: function easeInCubic(t) {
    return t * t * t;
  },
  // decelerating to zero velocity
  easeOutCubic: function easeOutCubic(t) {
    return --t * t * t + 1;
  },
  // acceleration until halfway, then deceleration
  easeInOutCubic: function easeInOutCubic(t) {
    return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
  },
  // accelerating from zero velocity
  easeInQuart: function easeInQuart(t) {
    return t * t * t * t;
  },
  // decelerating to zero velocity
  easeOutQuart: function easeOutQuart(t) {
    return 1 - --t * t * t * t;
  },
  // acceleration until halfway, then deceleration
  easeInOutQuart: function easeInOutQuart(t) {
    return t < .5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;
  },
  // accelerating from zero velocity
  easeInQuint: function easeInQuint(t) {
    return t * t * t * t * t;
  },
  // decelerating to zero velocity
  easeOutQuint: function easeOutQuint(t) {
    return 1 + --t * t * t * t * t;
  },
  // acceleration until halfway, then deceleration
  easeInOutQuint: function easeInOutQuint(t) {
    return t < .5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;
  }
};
/*
 * Vanilla version of the $.getScript
 */

window.getScript = function (source, callback) {
  var script = document.createElement('script');
  script.async = 1;
  window.scripts = document.getElementsByTagName('script');
  var prior = scripts[scripts.length - 1];

  script.onload = script.onreadystatechange = function (_, isAbort) {
    if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
      script.onload = script.onreadystatechange = null;
      script = undefined;

      if (!isAbort) {
        if (callback) callback();
      }
    }
  };

  script.src = source;
  prior.parentNode.insertBefore(script, prior);
};
/**
 * Returns a function, that, as long as it continues to be invoked, will not
 * be triggered. The function will be called after it stops being called for
 * N milliseconds. If `immediate` is passed, trigger the function on the
 * leading edge, instead of the trailing.
 * @param func
 * @param wait
 * @param immediate
 * @returns {Function}
 */


window.debounce = function (func, wait, immediate) {
  var timeout;
  return function () {
    var context = this,
        args = arguments;

    var later = function later() {
      timeout = null;
      if (!immediate) func.apply(context, args);
    };

    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
};
/*
 * Cookie helper class
 */


window.Cookie = {
  set: function set(name, value, days) {
    var domain, domainParts, date, expires, host;

    if (days) {
      date = new Date();
      date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
      expires = "; expires=" + date.toGMTString();
    } else {
      expires = "";
    }

    host = location.host;

    if (isIPOrLocalHost(location.hostname)) {
      document.cookie = name + "=" + value + expires + "; path=/";
    } else {
      // Remember the cookie on all sub domains.
      //
      // Start with trying to set cookie to the top domain.
      // (example: if user is on foo.com, try to set
      //  cookie to domain ".com")
      //
      // If the cookie will not be set, it means ".com"
      // is a top level domain and we need to
      // set the cookie to ".foo.com"
      domainParts = host.split('.');
      domainParts.shift();
      domain = '.' + domainParts.join('.'); // For development purpose, remove this when moving to production
      // domain = '.komma.pro';

      document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain; // check if cookie was successfuly set to the given domain
      // (otherwise it was a Top-Level Domain)

      if (Cookie.get(name) == null || Cookie.get(name) != value) {
        // append "." to current domain
        domain = '.' + host;
        document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain;
      }
    }
  },
  get: function get(name) {
    window.nameEQ = name + "=";
    window.ca = document.cookie.split(';');

    for (var i = 0; i < ca.length; i++) {
      var c = ca[i];

      while (c.charAt(0) === ' ') {
        c = c.substring(1, c.length);
      }

      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
    }

    return null;
  },
  erase: function erase(name) {
    Cookie.set(name, '', -1);
  }
};

window.isIPOrLocalHost = function (value) {
  return isIpAddress(value) || value === 'localhost';
};

window.isIpAddress = function (ipaddress) {
  return /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress);
};
/*
 * Javascript version of the number_format method of PHP
 */


window.number_format = function (number, decimals, dec_point, thousands_sep) {
  // Strip all characters but numerical ones.
  number = (number + '').replace(/[^0-9+\-Ee.]/g, '');

  var n = !isFinite(+number) ? 0 : +number,
      prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
      sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep,
      dec = typeof dec_point === 'undefined' ? '.' : dec_point,
      s = '',
      toFixedFix = function toFixedFix(n, prec) {
    var k = Math.pow(10, prec);
    return '' + Math.round(n * k) / k;
  }; // Fix for IE parseFloat(0.55).toFixed(0) = 0;


  s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');

  if (s[0].length > 3) {
    s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
  }

  if ((s[1] || '').length < prec) {
    s[1] = s[1] || '';
    s[1] += new Array(prec - s[1].length + 1).join('0');
  }

  return s.join(dec);
};
/**
 * Element.closest() polyfill
 * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
 */


if (!Element.prototype.closest) {
  if (!Element.prototype.matches) {
    Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
  }

  Element.prototype.closest = function (s) {
    var el = this;
    var ancestor = this;
    if (!document.documentElement.contains(el)) return null;

    do {
      if (ancestor.matches(s)) return ancestor;
      ancestor = ancestor.parentElement;
    } while (ancestor !== null);

    return null;
  };
}

window.Ajax = {
  //TODO: Can we create a prepare request function ??
  get: function get(url, callback) {
    var xhr = new XMLHttpRequest();
    var token = document.querySelector('meta[name="csrf-token"]').content;
    xhr.open('get', url, true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.setRequestHeader('X-CSRF-TOKEN', token);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        callback(xhr);
      }
    };

    xhr.send();
  },
  post: function post(url, data, callback) {
    var xhr = new XMLHttpRequest();
    var token = document.querySelector('meta[name="csrf-token"]').content;
    xhr.open('post', url, true);
    xhr.setRequestHeader('Content-Type', 'application/json');
    xhr.setRequestHeader('X-CSRF-TOKEN', token);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4) {
        callback(xhr);
      }
    };

    xhr.send(JSON.stringify(data));
  }
};
/**
 * Capitalize the first letter of the string
 * @param string
 * @returns {string}
 */

window.capitalizeFirstLetter = function (string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
};
/**
 * Convert snake case into camelcase
 *
 * @param string
 * @returns {*}
 */


function snakeToCamel(string) {
  return string.replace(/(\-\w)/g, function (m) {
    return m[1].toUpperCase();
  });
}
/**
 * Get the index of an element inside its parent
 */


function indexInParent(node) {
  window.children = node.parentNode.childNodes;
  var num = 0;

  for (var i = 0; i < children.length; i++) {
    if (children[i] == node) return num;
    if (children[i].nodeType == 1) num++;
  }

  return -1;
}
/**
 * For security reasons iOS Safari only allows document.execCommand('copy') for text within a contentEditable container.
 * The workaround is to detect iOS Safari and quickly toggle contentEditable before executing document.execCommand('copy').
 * Wheb input or textarea is READONLY you can prevent the unwanted popup with copy/paste functions and the input keyboard
 * Code from: https://stackoverflow.com/a/46981847
 */


function copyToClipboard(el) {
  // resolve the element
  el = typeof el === 'string' ? document.querySelector(el) : el; // handle iOS as a special case

  if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
    // save current contentEditable/readOnly status
    window.editable = el.contentEditable;
    window.readOnly = el.readOnly; // convert to editable with readonly to stop iOS keyboard opening

    el.contentEditable = true;
    el.readOnly = true; // create a selectable range

    var range = document.createRange();
    range.selectNodeContents(el); // select the range

    window.selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange(range);
    el.setSelectionRange(0, 999999); // restore contentEditable/readOnly to original state

    el.contentEditable = editable;
    el.readOnly = readOnly;
  } else {
    el.select();
  } // execute copy command


  document.execCommand('copy');
}

/***/ }),

/***/ "./resources/js/global/scrollHandler.js":
/*!**********************************************!*\
  !*** ./resources/js/global/scrollHandler.js ***!
  \**********************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/* ==========================================================================
   Scroll handler
   - Handler the objects which are bind on scroll events or visible in viewport
 ========================================================================== */
var ScrollHandler = {
  // Variables for debounce and throttle effects
  time: Date.now(),
  timeout: null,
  waitThrottle: 1000,
  waitDebounce: 300,
  // Variables for scroll direction
  lastScrollTopPosition: 0,
  scrollDirectionDown: true,
  scrollDirectionUp: false,
  //Initialisation
  init: function init() {
    // Trigger start on start up
    ScrollHandler.triggerOnInit(); // Throttle scroll

    window.addEventListener('scroll', function () {
      if (ScrollHandler.time + ScrollHandler.waitThrottle - Date.now() < 0) {
        ScrollHandler.triggerThrottle();
        ScrollHandler.time = Date.now();
      }
    }); // Smooth scroll

    window.addEventListener('scroll', function () {
      ScrollHandler.triggerSmooth();
    }); // Debounce scroll

    window.addEventListener('scroll', function () {
      if (isset(ScrollHandler.timeout)) clearTimeout(ScrollHandler.timeout);
      ScrollHandler.timeout = setTimeout(ScrollHandler.triggerDebounce, ScrollHandler.waitDebounce);
    });
  },
  // Trigger on start up
  triggerOnInit: function triggerOnInit() {
    ScrollHandler.triggerElementInViewportAnimation();
  },
  // Trigger scroll functions with throttle (preferred)
  triggerThrottle: function triggerThrottle() {
    // console.log('Throttled scroll');
    ScrollHandler.triggerElementInViewportAnimation();
  },
  // Trigger scroll on debounce
  triggerDebounce: function triggerDebounce() {// console.log('Debounce scroll');
  },
  // Trigger scroll on the flight
  triggerSmooth: function triggerSmooth() {
    // console.log('Smooth scroll');
    ScrollHandler.detectScrollDirection();
    ScrollHandler.toggleStickyHeader();
  },
  // Detect if part of a given element is visible in the viewport
  // El must be a node element
  detectIfElementIsPartlyInViewport: function detectIfElementIsPartlyInViewport(el) {
    if (isset(el)) {
      var rect = el.getBoundingClientRect(); // DOMRect { x: 8, y: 8, width: 100, height: 100, top: 8, right: 108, bottom: 108, left: 8 }

      var windowHeight = window.innerHeight || document.documentElement.clientHeight;
      var windowWidth = window.innerWidth || document.documentElement.clientWidth;
      var verticalInView = rect.top <= windowHeight && rect.top + rect.height >= 0;
      var horizontalInView = rect.left <= windowWidth && rect.left + rect.width >= 0;
      return verticalInView && horizontalInView;
    }
  },
  // Detect if a given element is fully visible in the viewport
  // El must be a node element
  detectIfElementIsFullyInViewport: function detectIfElementIsFullyInViewport(el) {
    if (isset(el)) {
      var rect = el.getBoundingClientRect();
      return rect.top >= 0 && rect.bottom <= window.innerHeight;
    }
  },
  detectScrollDirection: function detectScrollDirection() {
    var scrollTopPosition = window.pageYOffset || document.documentElement.scrollTop; // Credits: "https://github.com/qeremy/so/blob/master/so.dom.js#L426"

    if (scrollTopPosition >= ScrollHandler.lastScrollTopPosition) {
      ScrollHandler.scrollDirectionDown = true;
      ScrollHandler.scrollDirectionUp = false;
    } else {
      ScrollHandler.scrollDirectionDown = false;
      ScrollHandler.scrollDirectionUp = true;
    }

    ScrollHandler.lastScrollTopPosition = scrollTopPosition;
  },
  // Trigger animation on elements that have 'element-in-viewport' and that are in the viewport
  // These animation can only be triggered once, if you want more then that you should write an specific function for this
  triggerElementInViewportAnimation: function triggerElementInViewportAnimation() {
    var elements = document.querySelectorAll('.element-in-viewport');
    var elementsLength = elements.length;

    for (var e = 0; e < elementsLength; e++) {
      var element = elements[e];

      if (ScrollHandler.detectIfElementIsPartlyInViewport(element)) {
        element.classList.remove('element-in-viewport');
      }
    }
  },
  // ------------------------------ CUSTOM SCROLL HANDLERS ------------------------------------
  // Hide or show sticky navigation when header isn't visible
  toggleStickyHeader: function toggleStickyHeader() {
    var stickyHeader = document.querySelector('.js-sticky-header');
    var visibleStickyHeaderClass = 'is-sticky-header-visible';
    var subnavList = document.querySelectorAll('.js-subnav');
    var subNavIsVisible = false;
    if (stickyHeader) stickyHeader.hidden = false;

    for (var i = 0; i < subnavList.length; i++) {
      if (window.getComputedStyle(subnavList[i], null).visibility == "visible") {
        return subNavIsVisible = true;
      }
    }

    if (isset(stickyHeader) && !subNavIsVisible) {
      // Hide when scrolling DOWN (OR within offset)
      if (ScrollHandler.scrollDirectionDown || ScrollHandler.lastScrollTopPosition < 110) {
        document.body.classList.remove(visibleStickyHeaderClass);
      } // Show when scrolling UP and outside of offset
      else {
          document.body.classList.add(visibleStickyHeaderClass);
        }
    }
  }
};
ScrollHandler.init();

/***/ }),

/***/ "./resources/sass/style.scss":
/*!***********************************!*\
  !*** ./resources/sass/style.scss ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports) {

// removed by extract-text-webpack-plugin

/***/ }),

/***/ 0:
/*!***************************************************************!*\
  !*** multi ./resources/js/app.js ./resources/sass/style.scss ***!
  \***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

__webpack_require__(/*! /Users/pascallemmen/Development/Reiskick/resources/js/app.js */"./resources/js/app.js");
module.exports = __webpack_require__(/*! /Users/pascallemmen/Development/Reiskick/resources/sass/style.scss */"./resources/sass/style.scss");


/***/ })

},[[0,"/js/manifest","/js/vendor"]]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9iYWNrZW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2NsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9ldmVudGJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vZXhwb3J0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9oZWxwZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy9icmVhZGNydW1icy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9pbnRlZ3JhdGlvbnMvZ2xvYmFsaGFuZGxlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vaW50ZWdyYXRpb25zL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy9saW5rZWRlcnJvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vaW50ZWdyYXRpb25zL3RyeWNhdGNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy91c2VyYWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vcGFyc2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9zZGsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhY2VraXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhbnNwb3J0cy9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL3RyYW5zcG9ydHMvZmV0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhbnNwb3J0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS90cmFuc3BvcnRzL3hoci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2FwaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9iYXNlYmFja2VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9iYXNlY2xpZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2ludGVncmF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2ludGVncmF0aW9ucy9mdW5jdGlvbnRvc3RyaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2ludGVncmF0aW9ucy9pbmJvdW5kZmlsdGVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9pbnRlZ3JhdGlvbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vcmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9zZGsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vdHJhbnNwb3J0cy9ub29wLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9lc20vaHViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaHViL2VzbS9zY29wZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9taW5pbWFsL2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHlwZXMvZXNtL2xvZ2xldmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL2VzbS9zZXZlcml0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9lc20vc3RhdHVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vZHNuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9lcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL2luc3RydW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL2lzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9sb2dnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL21lbW8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL21pc2MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL29iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vcGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL3Byb21pc2VidWZmZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL3N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vc3VwcG9ydHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL3N5bmNwcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdmFuaWxsYS1sYXp5bG9hZC9kaXN0L2xhenlsb2FkLm1pbi5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9oYXJtb255LW1vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYXBwLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb21wb25lbnRzL2FydGljbGVTbGlkZXJIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb21wb25lbnRzL2Nob2NvbGF0ZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvY29va2llSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tcG9uZW50cy9tYXBzSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tcG9uZW50cy9vdmVybGF5TWVudUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvc2Nyb2xsVG9IYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb21wb25lbnRzL3NsaWRlckhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvdGFic0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvd29ybGRNYXBIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb21wb25lbnRzL3lvdXR1YmVIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvYnJvd3NlckhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9oZWxwZXJzLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9nbG9iYWwvc2Nyb2xsSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvc2Fzcy9zdHlsZS5zY3NzP2M2NGQiXSwibmFtZXMiOlsid2luZG93Iiwic2VudHJ5X2RzbiIsInVuZGVmaW5lZCIsIlNlbnRyeSIsImRzbiIsInJlcXVpcmUiLCJsYXp5TG9hZEluc3RhbmNlIiwiTGF6eUxvYWQiLCJBcnRpY2xlU2xpZGVySGFuZGxlciIsImFydGljbGVzIiwiY3VycmVudEluZGV4IiwiaW5pdCIsImFydGljbGVTbGlkZXIiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJpc3NldCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJwcmV2aW91c0J1dHRvbiIsIm5leHRCdXR0b24iLCJhZGRFdmVudExpc3RlbmVyIiwibGVuZ3RoIiwic2V0QWN0aXZlQXJ0aWNsZSIsImkiLCJhcnRpY2xlIiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlIiwiQ2hvY29sYXRlRmFjdG9yeSIsImJhbm5lZFZpc2l0b3IiLCJlbnRlciIsImNob2NvbGF0ZUZhY3RvcmllcyIsImFtb3VudE9mQ2hvY29sYXRlRmFjdG9yaWVzIiwiQ2hvY29sYXRlQmFyIiwiX2ZsYXNoVGlja2V0IiwiY2hvY29sYXRlQmFyIiwiZ29sZGVuVGlja2V0IiwiZW5qb3lUaGVUb3VyIiwiY29uc29sZSIsImxvZyIsImNob2NvbGF0ZUZhY3RvcnkiLCJ0b3VyR3JvdXAiLCJvb21wYUxvb21wYXMiLCJhbW91bnRPZk9vbXBhTG9vbXBhcyIsInRvdXJHcm91cFNpemUiLCJ2aXNpdG9yIiwidmlzaXRvck5hbWUiLCJnZXRBdHRyaWJ1dGUiLCJfaXNWaXNpdG9yQmFubmVkIiwiX2dldEFycmFuZ2VtZW50IiwiX2ZpbmlzaFRvdXIiLCJpbmRleE9mIiwidmlzaXRvclR5cGUiLCJub2RlTmFtZSIsInZhbHVlIiwiZ3JvdXAiLCJfYWRkV2lsbGllV29ua2EiLCJnYXRlIiwiQWpheCIsInBvc3QiLCJIdHRwUmVxdWVzdCIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwic3RhdHVzIiwiX3RoYW5rc0ZvclZpc2l0aW5nIiwicmVkaXJlY3RVcmwiLCJfZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzIiwiZXJyb3JzIiwiX3Vua25vd25HYXBJbkZhY3RvcnkiLCJlIiwiX3dpbGxpZSIsImZlZWRiYWNrQXJlYSIsImlubmVySFRNTCIsIl9jbGVhclByZXZpb3VzTWFya2VkSmFja2V0cyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiamFja2V0IiwidmlzaXRvckZlZWRiYWNrQXJlYSIsInZpc2l0b3JOb2RlIiwiX2dyYWJWaXNpdG9ySmFja2V0IiwidmlzaXRvckZlZWRiYWNrIiwidmlzaXRvckZlZWRiYWNrQW1vdW50IiwidmlzaXRvckZlZWRiYWNrTGluZSIsImN1cnJlbnRGZWVkYmFja0FyZWEiLCJjYXBpdGFsaXplRmlyc3RMZXR0ZXIiLCJtYXJrZWRKYWNrZXRzIiwibWFya2VkSmFja2V0c0Ftb3VudCIsImN1cnJlbnRMYXllciIsInNhZmV0eUJyZWFrIiwicGFyZW50Tm9kZSIsImNvbnRhaW5zIiwidGFnTmFtZSIsIm5leHRTdG9wIiwibG9jYXRpb24iLCJDb29raWVIYW5kbGVyIiwiY29va2llQmFyIiwiY29va2llTWVzc2FnZSIsImNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbiIsImFjY2VwdFRyYWNraW5nIiwiaW5pdENvb2tpZUJhciIsImNoZWNrRm9yQ29va2llU2V0dGluZ3MiLCJjbG9zZUJ1dHRvbiIsImNsb3NlQ29va2llTWVzc2FnZSIsIkNvb2tpZSIsImdldCIsImJvZHkiLCJzZXQiLCJNYXBzSGFuZGxlciIsIm1hcCIsImtleSIsImxhdCIsImxuZyIsInN0eWxpbmciLCJoYXNBdHRyaWJ1dGUiLCJwYXJzZUZsb2F0Iiwic2V0Q3VzdG9tU3R5bGluZyIsImdvb2dsZSIsIm1hcHMiLCJnZXRTY3JpcHQiLCJkcmF3TWFwIiwiTWFwIiwiem9vbSIsImNlbnRlciIsImRpc2FibGVEZWZhdWx0VUkiLCJzdHlsZXMiLCJjb250ZW50U3RyaW5nIiwiaW5mb3dpbmRvdyIsIkluZm9XaW5kb3ciLCJjb250ZW50IiwibWFya2VyIiwiTWFya2VyIiwicG9zaXRpb24iLCJhZGRMaXN0ZW5lciIsIm9wZW4iLCJib2R5U2Nyb2xsTG9jayIsIk92ZXJsYXlNZW51SGFuZGxlciIsIm92ZXJsYXlNZW51VHJpZ2dlckxpc3QiLCJvdmVybGF5TWVudVRyaWdnZXJMaXN0Q291bnQiLCJvdmVybGF5TWVudVRyaWdnZXIiLCJpbml0T3ZlcmxheU1lbnUiLCJ0b2dnbGVPdmVybGF5TWVudSIsImV2ZW50Iiwib3ZlcmxheU1lbnVOYXYiLCJlbmFibGVCb2R5U2Nyb2xsIiwiZWxlbSIsInRhYkluZGV4IiwiZGlzYWJsZUJvZHlTY3JvbGwiLCJ0b2dnbGUiLCJoaWRkZW4iLCJTY3JvbGxUb0hhbmRsZXIiLCJvZmZzZXQiLCJkdXJhdGlvbiIsInN0YXJ0IiwiY2hhbmdlIiwiY3VycmVudFRpbWUiLCJhbGxvd0FuaW1hdGlvbiIsInNjcm9sbFRvQW5pbWF0aW9uIiwiZWFzaW5nIiwiYW5jaG9yTGlua3MiLCJhbmNob3JMaW5rc0Ftb3VudCIsImFuY2hvckxpbmsiLCJwcmVwYXJlU2Nyb2xsVG8iLCJwcmV2ZW50RGVmYXVsdCIsImVsZW1lbnRJZCIsInN1YnN0ciIsInNjcm9sbFRvRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwic2Nyb2xsVG9FbGVtZW50UG9zaXRpb24iLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJkb2N1bWVudEVsZW1lbnQiLCJNYXRoIiwibWF4Iiwic2Nyb2xsVG9wIiwicGFnZVlPZmZzZXQiLCJ0b3AiLCJzdGFydFRpbWUiLCJwZXJmb3JtYW5jZSIsIm5vdyIsIkRhdGUiLCJnZXRUaW1lIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0ZVNjcm9sbCIsImFib3J0U2Nyb2xsQW5pbWF0aW9uIiwidGltZXN0YW1wIiwicHJvZ3Jlc3MiLCJtaW4iLCJFYXNpbmdGdW5jdGlvbnMiLCJuZXdTY3JvbGxUb3AiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsIlNsaWRlcnMiLCJzbGlkZXJDb250YWluZXJzIiwic2xpZGVyQ29udGFpbmVyc0xlbmd0aCIsInNsaWRlciIsInNsaWRlcklkIiwiU2xpZGVyc2V0dGluZyIsIlNsaWRlclNldHRpbmciLCJhdXRvU2xpZGVyIiwic2xpZGVRdWVyeSIsIm5hdmlnYXRpb25CdXR0b25zIiwiZG90cyIsInB1c2giLCJTbGlkZXIiLCJwcmVwYXJlUGFyYW1ldGVycyIsInNldHRpbmdzT2JqZWN0Iiwic2VsZiIsInNsaWRlckludGVydmFsIiwic2V0U2xpZGVySWQiLCJzdHJpbmciLCJzZXRBdXRvU2xpZGVyIiwiYm9vbGVhbiIsInNldFNsaWRlckludGVydmFsIiwiaW50ZWdlciIsInNldFNsaWRlUXVlcnkiLCJzZXROYXZpZ2F0aW9uQnV0dG9ucyIsInNldERvdHMiLCJnZXRTbGlkZXJJZCIsImdldEF1dG9TbGlkZXIiLCJhdXRvU2xpZGUiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJnZXRTbGlkZXJJbnRlcnZhbCIsImdldFNsaWRlUXVlcnkiLCJnZXROYXZpZ2F0aW9uQnV0dG9ucyIsImdldERvdHMiLCJmaWxsIiwic2V0dGluZ3NPYmplY3RLZXlzIiwic2V0dGluZ3NPYmplY3RMZW5ndGgiLCJzZXR0aW5ncyIsInNsaWRlck9iamVjdCIsImFjdGl2ZVNsaWRlSWQiLCJwcmV2aW91c1NsaWRlSWQiLCJuZXh0U2xpZGVJZCIsImF2YWlsYWJsZVNsaWRlcyIsInNsaWRlcyIsImF1dG9TbGlkZXJJbnRlcnZhbCIsInNldFNsaWRlIiwic3dpcGVHZXN0dXJlcyIsIkhhbW1lciIsIm9uIiwicmVzZXRBdXRvU2xpZGVyIiwibmV4dFNsaWRlIiwicHJldmlvdXNTbGlkZSIsIm5hdmlnYXRpb25CdXR0b25zTGVuZ3RoIiwibmF2aWdhdGlvbkJ1dHRvbiIsImNsaWNrTmF2aWdhdGlvbkJ1dHRvbiIsImRvdHNMZW5ndGgiLCJkb3QiLCJjbGlja0RvdCIsImNsZWFySW50ZXJ2YWwiLCJzZXRJbnRlcnZhbCIsInNsaWRlc0xlbmd0aCIsInNsaWRlIiwic3R5bGUiLCJwb2ludGVyRXZlbnRzIiwic2xpZGVPcmRlciIsInBhcnNlSW50Iiwic2V0QWN0aXZlRG90IiwibmF2QnV0dG9uIiwibmF2QnV0dG9uRGlyZWN0aW9uIiwiY2xpY2tlZERvdCIsImRvdE9yZGVyIiwiVGFic0hhbmRsZXIiLCJ0YWJzTGlzdCIsInRhYnMiLCJ0YWJzTGlzdENvdW50IiwiaW5pdFRhYnMiLCJjb250YWluZXIiLCJlcnJvciIsInRyaWdnZXJzIiwidGFic0NvbnRlbnQiLCJ0YXJnZXQiLCJjbG9zZXN0IiwiZGlyIiwic3RlcFRhYnMiLCJ0b2dnbGVUYWJzIiwiZGF0YXNldCIsInRhYklkIiwidGFic1RhYiIsInRhYnNUcmlnZ2VyIiwidHJpZ2dlckNvdW50IiwiYWN0aXZlSWQiLCJuZXdJZCIsIldvcmxkTWFwSGFuZGxlciIsIndvcmxkTWFwIiwidmlzaXRlZENvdW50cmllcyIsInRpbWVvdXRGdW5jdGlvbiIsImNsaWVudFkiLCJsZWZ0IiwiY2xpZW50WCIsInZpc2l0ZWRDb3VudHJpZXNMZW5ndGgiLCJ2aXNpdGVkQ291bnRyeSIsImlzbyIsInN2Z05vZGUiLCJpbml0RXZlbnRMaXN0ZW5lcnMiLCJpZCIsInZpc2l0ZWRDb3VudHJ5TmFtZSIsInNldEF0dHJpYnV0ZSIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJjbGVhck1hcmtlciIsIllvdXR1YmVIYW5kbGVyIiwieW91dHViZUNsYXNzIiwicGxheWVycyIsInlvdXR1YmVQbGF5ZXJzIiwieW91dHViZVBsYXllcnNBbW91bnQiLCJ5b3V0dWJlUGxheWVyIiwieW91dHViZVBsYXllcklkIiwieW91dHViZUVsZW1lbnQiLCJsaW5rIiwiYXV0b1BsYXkiLCJpbml0WW91dHViZSIsIllUIiwiUGxheWVyIiwib25Zb3VUdWJlUGxheWVyQVBJUmVhZHkiLCJsb2FkUGxheWVycyIsInBsYXllciIsImhlaWdodCIsIndpZHRoIiwidmlkZW9JZCIsImhvc3QiLCJwbGF5ZXJWYXJzIiwibW9kZXN0YnJhbmRpbmciLCJyZWwiLCJkaXNhYmxla2IiLCJhdXRvcGxheSIsImV2ZW50cyIsIm9uU3RhdGVDaGFuZ2UiLCJvblJlYWR5IiwicGxheWVyQ29udGFpbmVySWQiLCJnZXRJZnJhbWUiLCJ2aWRlb1N0YXRlIiwiZGF0YSIsIlBsYXllclN0YXRlIiwiRU5ERUQiLCJwbGF5VmlkZW8iLCJCcm93c2VySGFuZGxlciIsInVzZXJBZ2VudCIsImJyb3dzZXJJbmZvIiwibmF2aWdhdG9yIiwiZ2V0QnJvd3NlckluZm8iLCJoYW5kbGVJRSIsImhhbmRsZVNhZmFyaSIsIm1zaWUiLCJpZWx0MTEiLCJpZTExIiwibWF0Y2giLCJ2ZXJzaW9uIiwic3Vic3RyaW5nIiwibmFtZSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwidWEiLCJ0ZW0iLCJNIiwidGVzdCIsImV4ZWMiLCJhcHBOYW1lIiwiYXBwVmVyc2lvbiIsInNwbGljZSIsIm9iaiIsImxpbmVhciIsInQiLCJlYXNlSW5RdWFkIiwiZWFzZU91dFF1YWQiLCJlYXNlSW5PdXRRdWFkIiwiZWFzZUluQ3ViaWMiLCJlYXNlT3V0Q3ViaWMiLCJlYXNlSW5PdXRDdWJpYyIsImVhc2VJblF1YXJ0IiwiZWFzZU91dFF1YXJ0IiwiZWFzZUluT3V0UXVhcnQiLCJlYXNlSW5RdWludCIsImVhc2VPdXRRdWludCIsImVhc2VJbk91dFF1aW50Iiwic291cmNlIiwiY2FsbGJhY2siLCJzY3JpcHQiLCJjcmVhdGVFbGVtZW50IiwiYXN5bmMiLCJzY3JpcHRzIiwicHJpb3IiLCJvbmxvYWQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJfIiwiaXNBYm9ydCIsInJlYWR5U3RhdGUiLCJzcmMiLCJpbnNlcnRCZWZvcmUiLCJkZWJvdW5jZSIsImZ1bmMiLCJ3YWl0IiwiaW1tZWRpYXRlIiwidGltZW91dCIsImNvbnRleHQiLCJhcmdzIiwiYXJndW1lbnRzIiwibGF0ZXIiLCJhcHBseSIsImNhbGxOb3ciLCJkYXlzIiwiZG9tYWluIiwiZG9tYWluUGFydHMiLCJkYXRlIiwiZXhwaXJlcyIsInNldFRpbWUiLCJ0b0dNVFN0cmluZyIsImlzSVBPckxvY2FsSG9zdCIsImhvc3RuYW1lIiwiY29va2llIiwic3BsaXQiLCJzaGlmdCIsImpvaW4iLCJuYW1lRVEiLCJjYSIsImMiLCJjaGFyQXQiLCJlcmFzZSIsImlzSXBBZGRyZXNzIiwiaXBhZGRyZXNzIiwibnVtYmVyX2Zvcm1hdCIsIm51bWJlciIsImRlY2ltYWxzIiwiZGVjX3BvaW50IiwidGhvdXNhbmRzX3NlcCIsInJlcGxhY2UiLCJuIiwiaXNGaW5pdGUiLCJwcmVjIiwiYWJzIiwic2VwIiwiZGVjIiwicyIsInRvRml4ZWRGaXgiLCJrIiwicG93Iiwicm91bmQiLCJBcnJheSIsIkVsZW1lbnQiLCJwcm90b3R5cGUiLCJtYXRjaGVzIiwibXNNYXRjaGVzU2VsZWN0b3IiLCJ3ZWJraXRNYXRjaGVzU2VsZWN0b3IiLCJlbCIsImFuY2VzdG9yIiwicGFyZW50RWxlbWVudCIsInVybCIsInhociIsIlhNTEh0dHBSZXF1ZXN0IiwidG9rZW4iLCJzZXRSZXF1ZXN0SGVhZGVyIiwic2VuZCIsInN0cmluZ2lmeSIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJzbmFrZVRvQ2FtZWwiLCJtIiwiaW5kZXhJblBhcmVudCIsIm5vZGUiLCJjaGlsZHJlbiIsImNoaWxkTm9kZXMiLCJudW0iLCJub2RlVHlwZSIsImNvcHlUb0NsaXBib2FyZCIsImVkaXRhYmxlIiwiY29udGVudEVkaXRhYmxlIiwicmVhZE9ubHkiLCJyYW5nZSIsImNyZWF0ZVJhbmdlIiwic2VsZWN0Tm9kZUNvbnRlbnRzIiwic2VsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uIiwicmVtb3ZlQWxsUmFuZ2VzIiwiYWRkUmFuZ2UiLCJzZXRTZWxlY3Rpb25SYW5nZSIsInNlbGVjdCIsImV4ZWNDb21tYW5kIiwiU2Nyb2xsSGFuZGxlciIsInRpbWUiLCJ3YWl0VGhyb3R0bGUiLCJ3YWl0RGVib3VuY2UiLCJsYXN0U2Nyb2xsVG9wUG9zaXRpb24iLCJzY3JvbGxEaXJlY3Rpb25Eb3duIiwic2Nyb2xsRGlyZWN0aW9uVXAiLCJ0cmlnZ2VyT25Jbml0IiwidHJpZ2dlclRocm90dGxlIiwidHJpZ2dlclNtb290aCIsInRyaWdnZXJEZWJvdW5jZSIsInRyaWdnZXJFbGVtZW50SW5WaWV3cG9ydEFuaW1hdGlvbiIsImRldGVjdFNjcm9sbERpcmVjdGlvbiIsInRvZ2dsZVN0aWNreUhlYWRlciIsImRldGVjdElmRWxlbWVudElzUGFydGx5SW5WaWV3cG9ydCIsInJlY3QiLCJ3aW5kb3dIZWlnaHQiLCJpbm5lckhlaWdodCIsImNsaWVudEhlaWdodCIsIndpbmRvd1dpZHRoIiwiaW5uZXJXaWR0aCIsImNsaWVudFdpZHRoIiwidmVydGljYWxJblZpZXciLCJob3Jpem9udGFsSW5WaWV3IiwiZGV0ZWN0SWZFbGVtZW50SXNGdWxseUluVmlld3BvcnQiLCJib3R0b20iLCJzY3JvbGxUb3BQb3NpdGlvbiIsImVsZW1lbnRzIiwiZWxlbWVudHNMZW5ndGgiLCJlbGVtZW50Iiwic3RpY2t5SGVhZGVyIiwidmlzaWJsZVN0aWNreUhlYWRlckNsYXNzIiwic3VibmF2TGlzdCIsInN1Yk5hdklzVmlzaWJsZSIsImdldENvbXB1dGVkU3R5bGUiLCJ2aXNpYmlsaXR5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFpQztBQUNVO0FBQ0Y7QUFDeUM7QUFDVjtBQUNaO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLCtDQUFpQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLDhDQUFnQixHQUFHLG1DQUFtQyx5QkFBeUI7QUFDOUc7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtRUFBYTtBQUN6Qix1QkFBdUIsMERBQWM7QUFDckM7QUFDQSxtQkFBbUIsd0RBQVk7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDJFQUFxQjtBQUN6QztBQUNBLFNBQVM7QUFDVCxRQUFRLDJFQUFxQjtBQUM3QjtBQUNBO0FBQ0EsU0FBUztBQUNULHNCQUFzQixzREFBUTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxlQUFlLHlEQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsU0FBUyxzREFBUSxNQUFNO0FBQ3REO0FBQ0Esb0JBQW9CLHFFQUFlO0FB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O0FBQzVDO0FBQ0E7QUFDQSxJQUFJLCtDQUFpQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdFQUFjO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDc0I7QUFDdkIsaUM7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXdCO0FBQ0E7QUFDSDtBQUNJO0FBQ0Y7QUFDQTtBQUNFO0FBQ0Y7QUFDUztBQUNQO0FBQ0U7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLCtCQUErQixnQkFBZ0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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TTZlLHdCQUF3QixHQUFHLDBCQUFqQztBQUNBLFFBQU1DLFVBQVUsR0FBRy9lLFFBQVEsQ0FBQ0csZ0JBQVQsQ0FBMEIsWUFBMUIsQ0FBbkI7QUFDQSxRQUFJNmUsZUFBZSxHQUFHLEtBQXRCO0FBQ0EsUUFBR0gsWUFBSCxFQUFpQkEsWUFBWSxDQUFDclcsTUFBYixHQUFzQixLQUF0Qjs7QUFFakIsU0FBSyxJQUFJL0gsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR3NlLFVBQVUsQ0FBQ3hlLE1BQS9CLEVBQXVDRSxDQUFDLEVBQXhDLEVBQTRDO0FBQ3hDLFVBQUl0QixNQUFNLENBQUM4ZixnQkFBUCxDQUF3QkYsVUFBVSxDQUFDdGUsQ0FBRCxDQUFsQyxFQUF1QyxJQUF2QyxFQUE2Q3llLFVBQTdDLElBQTJELFNBQS9ELEVBQTBFO0FBQ3RFLGVBQU9GLGVBQWUsR0FBRyxJQUF6QjtBQUNIO0FBQ0o7O0FBRUQsUUFBRzllLEtBQUssQ0FBQzJlLFlBQUQsQ0FBTCxJQUF1QixDQUFDRyxlQUEzQixFQUEyQztBQUN2QztBQUNBLFVBQUdqQyxhQUFhLENBQUNLLG1CQUFkLElBQXFDTCxhQUFhLENBQUNJLHFCQUFkLEdBQXNDLEdBQTlFLEVBQWtGO0FBQzlFbmQsZ0JBQVEsQ0FBQzZGLElBQVQsQ0FBY2xGLFNBQWQsQ0FBd0JFLE1BQXhCLENBQStCaWUsd0JBQS9CO0FBQ0gsT0FGRCxDQUdBO0FBSEEsV0FJSztBQUNEOWUsa0JBQVEsQ0FBQzZGLElBQVQsQ0FBY2xGLFNBQWQsQ0FBd0JDLEdBQXhCLENBQTRCa2Usd0JBQTVCO0FBQ0g7QUFDSjtBQUNKO0FBcEppQixDQUF0QjtBQXdKQS9CLGFBQWEsQ0FBQ2pkLElBQWQsRzs7Ozs7Ozs7Ozs7QUM3SkEseUMiLCJmaWxlIjoiL2pzL2FwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBCYXNlQmFja2VuZCB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBTZXZlcml0eSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYWRkRXhjZXB0aW9uTWVjaGFuaXNtLCBzdXBwb3J0c0ZldGNoLCBTeW5jUHJvbWlzZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgZXZlbnRGcm9tU3RyaW5nLCBldmVudEZyb21Vbmtub3duSW5wdXQgfSBmcm9tICcuL2V2ZW50YnVpbGRlcic7XG5pbXBvcnQgeyBGZXRjaFRyYW5zcG9ydCwgWEhSVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnRzJztcbi8qKlxuICogVGhlIFNlbnRyeSBCcm93c2VyIFNESyBCYWNrZW5kLlxuICogQGhpZGRlblxuICovXG52YXIgQnJvd3NlckJhY2tlbmQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoQnJvd3NlckJhY2tlbmQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQnJvd3NlckJhY2tlbmQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCcm93c2VyQmFja2VuZC5wcm90b3R5cGUuX3NldHVwVHJhbnNwb3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX29wdGlvbnMuZHNuKSB7XG4gICAgICAgICAgICAvLyBXZSByZXR1cm4gdGhlIG5vb3AgdHJhbnNwb3J0IGhlcmUgaW4gY2FzZSB0aGVyZSBpcyBubyBEc24uXG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fc2V0dXBUcmFuc3BvcnQuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHJhbnNwb3J0T3B0aW9ucyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX29wdGlvbnMudHJhbnNwb3J0T3B0aW9ucywgeyBkc246IHRoaXMuX29wdGlvbnMuZHNuIH0pO1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy50cmFuc3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5fb3B0aW9ucy50cmFuc3BvcnQodHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1cHBvcnRzRmV0Y2goKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGZXRjaFRyYW5zcG9ydCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFhIUlRyYW5zcG9ydCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQnJvd3NlckJhY2tlbmQucHJvdG90eXBlLmV2ZW50RnJvbUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChleGNlcHRpb24sIGhpbnQpIHtcbiAgICAgICAgdmFyIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IChoaW50ICYmIGhpbnQuc3ludGhldGljRXhjZXB0aW9uKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBldmVudCA9IGV2ZW50RnJvbVVua25vd25JbnB1dChleGNlcHRpb24sIHN5bnRoZXRpY0V4Y2VwdGlvbiwge1xuICAgICAgICAgICAgYXR0YWNoU3RhY2t0cmFjZTogdGhpcy5fb3B0aW9ucy5hdHRhY2hTdGFja3RyYWNlLFxuICAgICAgICB9KTtcbiAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCB7XG4gICAgICAgICAgICBoYW5kbGVkOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogJ2dlbmVyaWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnQubGV2ZWwgPSBTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgaWYgKGhpbnQgJiYgaGludC5ldmVudF9pZCkge1xuICAgICAgICAgICAgZXZlbnQuZXZlbnRfaWQgPSBoaW50LmV2ZW50X2lkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKGV2ZW50KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQnJvd3NlckJhY2tlbmQucHJvdG90eXBlLmV2ZW50RnJvbU1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSwgbGV2ZWwsIGhpbnQpIHtcbiAgICAgICAgaWYgKGxldmVsID09PSB2b2lkIDApIHsgbGV2ZWwgPSBTZXZlcml0eS5JbmZvOyB9XG4gICAgICAgIHZhciBzeW50aGV0aWNFeGNlcHRpb24gPSAoaGludCAmJiBoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbikgfHwgdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZXZlbnQgPSBldmVudEZyb21TdHJpbmcobWVzc2FnZSwgc3ludGhldGljRXhjZXB0aW9uLCB7XG4gICAgICAgICAgICBhdHRhY2hTdGFja3RyYWNlOiB0aGlzLl9vcHRpb25zLmF0dGFjaFN0YWNrdHJhY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBldmVudC5sZXZlbCA9IGxldmVsO1xuICAgICAgICBpZiAoaGludCAmJiBoaW50LmV2ZW50X2lkKSB7XG4gICAgICAgICAgICBldmVudC5ldmVudF9pZCA9IGhpbnQuZXZlbnRfaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUoZXZlbnQpO1xuICAgIH07XG4gICAgcmV0dXJuIEJyb3dzZXJCYWNrZW5kO1xufShCYXNlQmFja2VuZCkpO1xuZXhwb3J0IHsgQnJvd3NlckJhY2tlbmQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhY2tlbmQuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEFQSSwgQmFzZUNsaWVudCB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgQnJvd3NlckJhY2tlbmQgfSBmcm9tICcuL2JhY2tlbmQnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnMgfSBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5pbXBvcnQgeyBTREtfTkFNRSwgU0RLX1ZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuLyoqXG4gKiBUaGUgU2VudHJ5IEJyb3dzZXIgU0RLIENsaWVudC5cbiAqXG4gKiBAc2VlIEJyb3dzZXJPcHRpb25zIGZvciBkb2N1bWVudGF0aW9uIG9uIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBzZWUgU2VudHJ5Q2xpZW50IGZvciB1c2FnZSBkb2N1bWVudGF0aW9uLlxuICovXG52YXIgQnJvd3NlckNsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhCcm93c2VyQ2xpZW50LCBfc3VwZXIpO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQnJvd3NlciBTREsgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgU0RLLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEJyb3dzZXJDbGllbnQob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgQnJvd3NlckJhY2tlbmQsIG9wdGlvbnMpIHx8IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQnJvd3NlckNsaWVudC5wcm90b3R5cGUuX3ByZXBhcmVFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgc2NvcGUsIGhpbnQpIHtcbiAgICAgICAgZXZlbnQucGxhdGZvcm0gPSBldmVudC5wbGF0Zm9ybSB8fCAnamF2YXNjcmlwdCc7XG4gICAgICAgIGV2ZW50LnNkayA9IHRzbGliXzEuX19hc3NpZ24oe30sIGV2ZW50LnNkaywgeyBuYW1lOiBTREtfTkFNRSwgcGFja2FnZXM6IHRzbGliXzEuX19zcHJlYWQoKChldmVudC5zZGsgJiYgZXZlbnQuc2RrLnBhY2thZ2VzKSB8fCBbXSksIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICducG06QHNlbnRyeS9icm93c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogU0RLX1ZFUlNJT04sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pLCB2ZXJzaW9uOiBTREtfVkVSU0lPTiB9KTtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuX3ByZXBhcmVFdmVudC5jYWxsKHRoaXMsIGV2ZW50LCBzY29wZSwgaGludCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJyb3dzZXJDbGllbnQucHJvdG90eXBlLl9zZW5kRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGludGVncmF0aW9uID0gdGhpcy5nZXRJbnRlZ3JhdGlvbihCcmVhZGNydW1icyk7XG4gICAgICAgIGlmIChpbnRlZ3JhdGlvbikge1xuICAgICAgICAgICAgaW50ZWdyYXRpb24uYWRkU2VudHJ5QnJlYWRjcnVtYihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fc2VuZEV2ZW50LmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2hvdyBhIHJlcG9ydCBkaWFsb2cgdG8gdGhlIHVzZXIgdG8gc2VuZCBmZWVkYmFjayB0byBhIHNwZWNpZmljIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgU2V0IGluZGl2aWR1YWwgb3B0aW9ucyBmb3IgdGhlIGRpYWxvZ1xuICAgICAqL1xuICAgIEJyb3dzZXJDbGllbnQucHJvdG90eXBlLnNob3dSZXBvcnREaWFsb2cgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvLyBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIGRvY3VtZW50IChSZWFjdCBOYXRpdmUpXG4gICAgICAgIHZhciBkb2N1bWVudCA9IGdldEdsb2JhbE9iamVjdCgpLmRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvY3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdUcnlpbmcgdG8gY2FsbCBzaG93UmVwb3J0RGlhbG9nIHdpdGggU2VudHJ5IENsaWVudCBpcyBkaXNhYmxlZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkc24gPSBvcHRpb25zLmRzbiB8fCB0aGlzLmdldERzbigpO1xuICAgICAgICBpZiAoIW9wdGlvbnMuZXZlbnRJZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdNaXNzaW5nIGBldmVudElkYCBvcHRpb24gaW4gc2hvd1JlcG9ydERpYWxvZyBjYWxsJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkc24pIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTWlzc2luZyBgRHNuYCBvcHRpb24gaW4gc2hvd1JlcG9ydERpYWxvZyBjYWxsJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuICAgICAgICBzY3JpcHQuc3JjID0gbmV3IEFQSShkc24pLmdldFJlcG9ydERpYWxvZ0VuZHBvaW50KG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5vbkxvYWQpIHtcbiAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSBvcHRpb25zLm9uTG9hZDtcbiAgICAgICAgfVxuICAgICAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5ib2R5KS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEJyb3dzZXJDbGllbnQ7XG59KEJhc2VDbGllbnQpKTtcbmV4cG9ydCB7IEJyb3dzZXJDbGllbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaWVudC5qcy5tYXAiLCJpbXBvcnQgeyBhZGRFeGNlcHRpb25NZWNoYW5pc20sIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZSwgaXNET01FcnJvciwgaXNET01FeGNlcHRpb24sIGlzRXJyb3IsIGlzRXJyb3JFdmVudCwgaXNFdmVudCwgaXNQbGFpbk9iamVjdCwgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IGV2ZW50RnJvbVBsYWluT2JqZWN0LCBldmVudEZyb21TdGFja3RyYWNlLCBwcmVwYXJlRnJhbWVzRm9yRXZlbnQgfSBmcm9tICcuL3BhcnNlcnMnO1xuaW1wb3J0IHsgY29tcHV0ZVN0YWNrVHJhY2UgfSBmcm9tICcuL3RyYWNla2l0Jztcbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50RnJvbVVua25vd25JbnB1dChleGNlcHRpb24sIHN5bnRoZXRpY0V4Y2VwdGlvbiwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIGV2ZW50O1xuICAgIGlmIChpc0Vycm9yRXZlbnQoZXhjZXB0aW9uKSAmJiBleGNlcHRpb24uZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgaXQgaXMgYW4gRXJyb3JFdmVudCB3aXRoIGBlcnJvcmAgcHJvcGVydHksIGV4dHJhY3QgaXQgdG8gZ2V0IGFjdHVhbCBFcnJvclxuICAgICAgICB2YXIgZXJyb3JFdmVudCA9IGV4Y2VwdGlvbjtcbiAgICAgICAgZXhjZXB0aW9uID0gZXJyb3JFdmVudC5lcnJvcjsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1wYXJhbWV0ZXItcmVhc3NpZ25tZW50XG4gICAgICAgIGV2ZW50ID0gZXZlbnRGcm9tU3RhY2t0cmFjZShjb21wdXRlU3RhY2tUcmFjZShleGNlcHRpb24pKTtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH1cbiAgICBpZiAoaXNET01FcnJvcihleGNlcHRpb24pIHx8IGlzRE9NRXhjZXB0aW9uKGV4Y2VwdGlvbikpIHtcbiAgICAgICAgLy8gSWYgaXQgaXMgYSBET01FcnJvciBvciBET01FeGNlcHRpb24gKHdoaWNoIGFyZSBsZWdhY3kgQVBJcywgYnV0IHN0aWxsIHN1cHBvcnRlZCBpbiBzb21lIGJyb3dzZXJzKVxuICAgICAgICAvLyB0aGVuIHdlIGp1c3QgZXh0cmFjdCB0aGUgbmFtZSBhbmQgbWVzc2FnZSwgYXMgdGhleSBkb24ndCBwcm92aWRlIGFueXRoaW5nIGVsc2VcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTUVycm9yXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9ET01FeGNlcHRpb25cbiAgICAgICAgdmFyIGRvbUV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjtcbiAgICAgICAgdmFyIG5hbWVfMSA9IGRvbUV4Y2VwdGlvbi5uYW1lIHx8IChpc0RPTUVycm9yKGRvbUV4Y2VwdGlvbikgPyAnRE9NRXJyb3InIDogJ0RPTUV4Y2VwdGlvbicpO1xuICAgICAgICB2YXIgbWVzc2FnZSA9IGRvbUV4Y2VwdGlvbi5tZXNzYWdlID8gbmFtZV8xICsgXCI6IFwiICsgZG9tRXhjZXB0aW9uLm1lc3NhZ2UgOiBuYW1lXzE7XG4gICAgICAgIGV2ZW50ID0gZXZlbnRGcm9tU3RyaW5nKG1lc3NhZ2UsIHN5bnRoZXRpY0V4Y2VwdGlvbiwgb3B0aW9ucyk7XG4gICAgICAgIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZShldmVudCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IoZXhjZXB0aW9uKSkge1xuICAgICAgICAvLyB3ZSBoYXZlIGEgcmVhbCBFcnJvciBvYmplY3QsIGRvIG5vdGhpbmdcbiAgICAgICAgZXZlbnQgPSBldmVudEZyb21TdGFja3RyYWNlKGNvbXB1dGVTdGFja1RyYWNlKGV4Y2VwdGlvbikpO1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICAgIGlmIChpc1BsYWluT2JqZWN0KGV4Y2VwdGlvbikgfHwgaXNFdmVudChleGNlcHRpb24pKSB7XG4gICAgICAgIC8vIElmIGl0IGlzIHBsYWluIE9iamVjdCBvciBFdmVudCwgc2VyaWFsaXplIGl0IG1hbnVhbGx5IGFuZCBleHRyYWN0IG9wdGlvbnNcbiAgICAgICAgLy8gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGdyb3VwIGV2ZW50cyBiYXNlZCBvbiB0b3AtbGV2ZWwga2V5c1xuICAgICAgICAvLyB3aGljaCBpcyBtdWNoIGJldHRlciB0aGFuIGNyZWF0aW5nIG5ldyBncm91cCB3aGVuIGFueSBrZXkvdmFsdWUgY2hhbmdlXG4gICAgICAgIHZhciBvYmplY3RFeGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgICAgIGV2ZW50ID0gZXZlbnRGcm9tUGxhaW5PYmplY3Qob2JqZWN0RXhjZXB0aW9uLCBzeW50aGV0aWNFeGNlcHRpb24sIG9wdGlvbnMucmVqZWN0aW9uKTtcbiAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCB7XG4gICAgICAgICAgICBzeW50aGV0aWM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICAgIC8vIElmIG5vbmUgb2YgcHJldmlvdXMgY2hlY2tzIHdlcmUgdmFsaWQsIHRoZW4gaXQgbWVhbnMgdGhhdCBpdCdzIG5vdDpcbiAgICAvLyAtIGFuIGluc3RhbmNlIG9mIERPTUVycm9yXG4gICAgLy8gLSBhbiBpbnN0YW5jZSBvZiBET01FeGNlcHRpb25cbiAgICAvLyAtIGFuIGluc3RhbmNlIG9mIEV2ZW50XG4gICAgLy8gLSBhbiBpbnN0YW5jZSBvZiBFcnJvclxuICAgIC8vIC0gYSB2YWxpZCBFcnJvckV2ZW50IChvbmUgd2l0aCBhbiBlcnJvciBwcm9wZXJ0eSlcbiAgICAvLyAtIGEgcGxhaW4gT2JqZWN0XG4gICAgLy9cbiAgICAvLyBTbyBiYWlsIG91dCBhbmQgY2FwdHVyZSBpdCBhcyBhIHNpbXBsZSBtZXNzYWdlOlxuICAgIGV2ZW50ID0gZXZlbnRGcm9tU3RyaW5nKGV4Y2VwdGlvbiwgc3ludGhldGljRXhjZXB0aW9uLCBvcHRpb25zKTtcbiAgICBhZGRFeGNlcHRpb25UeXBlVmFsdWUoZXZlbnQsIFwiXCIgKyBleGNlcHRpb24sIHVuZGVmaW5lZCk7XG4gICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCB7XG4gICAgICAgIHN5bnRoZXRpYzogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gZXZlbnQ7XG59XG4vLyB0aGlzLl9vcHRpb25zLmF0dGFjaFN0YWNrdHJhY2Vcbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50RnJvbVN0cmluZyhpbnB1dCwgc3ludGhldGljRXhjZXB0aW9uLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgZXZlbnQgPSB7XG4gICAgICAgIG1lc3NhZ2U6IGlucHV0LFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuYXR0YWNoU3RhY2t0cmFjZSAmJiBzeW50aGV0aWNFeGNlcHRpb24pIHtcbiAgICAgICAgdmFyIHN0YWNrdHJhY2UgPSBjb21wdXRlU3RhY2tUcmFjZShzeW50aGV0aWNFeGNlcHRpb24pO1xuICAgICAgICB2YXIgZnJhbWVzXzEgPSBwcmVwYXJlRnJhbWVzRm9yRXZlbnQoc3RhY2t0cmFjZS5zdGFjayk7XG4gICAgICAgIGV2ZW50LnN0YWNrdHJhY2UgPSB7XG4gICAgICAgICAgICBmcmFtZXM6IGZyYW1lc18xLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ldmVudGJ1aWxkZXIuanMubWFwIiwiZXhwb3J0IHsgU2V2ZXJpdHksIFN0YXR1cywgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmV4cG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBhZGRCcmVhZGNydW1iLCBjYXB0dXJlRXhjZXB0aW9uLCBjYXB0dXJlRXZlbnQsIGNhcHR1cmVNZXNzYWdlLCBjb25maWd1cmVTY29wZSwgZ2V0SHViRnJvbUNhcnJpZXIsIGdldEN1cnJlbnRIdWIsIEh1YiwgbWFrZU1haW4sIFNjb3BlLCBzdGFydFRyYW5zYWN0aW9uLCBzZXRDb250ZXh0LCBzZXRFeHRyYSwgc2V0RXh0cmFzLCBzZXRUYWcsIHNldFRhZ3MsIHNldFVzZXIsIHdpdGhTY29wZSwgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuZXhwb3J0IHsgQnJvd3NlckNsaWVudCB9IGZyb20gJy4vY2xpZW50JztcbmV4cG9ydCB7IGRlZmF1bHRJbnRlZ3JhdGlvbnMsIGZvcmNlTG9hZCwgaW5pdCwgbGFzdEV2ZW50SWQsIG9uTG9hZCwgc2hvd1JlcG9ydERpYWxvZywgZmx1c2gsIGNsb3NlLCB3cmFwIH0gZnJvbSAnLi9zZGsnO1xuZXhwb3J0IHsgU0RLX05BTUUsIFNES19WRVJTSU9OIH0gZnJvbSAnLi92ZXJzaW9uJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV4cG9ydHMuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGNhcHR1cmVFeGNlcHRpb24sIHdpdGhTY29wZSB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBhZGRFeGNlcHRpb25NZWNoYW5pc20sIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xudmFyIGlnbm9yZU9uRXJyb3IgPSAwO1xuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRJZ25vcmVPbkVycm9yKCkge1xuICAgIHJldHVybiBpZ25vcmVPbkVycm9yID4gMDtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlTmV4dE9uRXJyb3IoKSB7XG4gICAgLy8gb25lcnJvciBzaG91bGQgdHJpZ2dlciBiZWZvcmUgc2V0VGltZW91dFxuICAgIGlnbm9yZU9uRXJyb3IgKz0gMTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWdub3JlT25FcnJvciAtPSAxO1xuICAgIH0pO1xufVxuLyoqXG4gKiBJbnN0cnVtZW50cyB0aGUgZ2l2ZW4gZnVuY3Rpb24gYW5kIHNlbmRzIGFuIGV2ZW50IHRvIFNlbnRyeSBldmVyeSB0aW1lIHRoZVxuICogZnVuY3Rpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAqXG4gKiBAcGFyYW0gZm4gQSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHJldHVybnMgVGhlIHdyYXBwZWQgZnVuY3Rpb24uXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKGZuLCBvcHRpb25zLCBiZWZvcmUpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbm5hIHdyYXAgaXQgdHdpY2VcbiAgICAgICAgaWYgKGZuLl9fc2VudHJ5X18pIHtcbiAgICAgICAgICAgIHJldHVybiBmbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gd3JhcHBlZCBpbiB0aGUgcGFzdCwgcmV0dXJuIHRoYXQgd3JhcHBlZCBmdW5jdGlvblxuICAgICAgICBpZiAoZm4uX19zZW50cnlfd3JhcHBlZF9fKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uX19zZW50cnlfd3JhcHBlZF9fO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIEp1c3QgYWNjZXNzaW5nIGN1c3RvbSBwcm9wcyBpbiBzb21lIFNlbGVuaXVtIGVudmlyb25tZW50c1xuICAgICAgICAvLyBjYW4gY2F1c2UgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXhjZXB0aW9uIChzZWUgcmF2ZW4tanMjNDk1KS5cbiAgICAgICAgLy8gQmFpbCBvbiB3cmFwcGluZyBhbmQgcmV0dXJuIHRoZSBmdW5jdGlvbiBhcy1pcyAoZGVmZXJzIHRvIHdpbmRvdy5vbmVycm9yKS5cbiAgICAgICAgcmV0dXJuIGZuO1xuICAgIH1cbiAgICB2YXIgc2VudHJ5V3JhcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICAgICAgaWYgKGJlZm9yZSAmJiB0eXBlb2YgYmVmb3JlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgd3JhcHBlZEFyZ3VtZW50cyA9IGFyZ3MubWFwKGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIHdyYXAoYXJnLCBvcHRpb25zKTsgfSk7XG4gICAgICAgICAgICBpZiAoZm4uaGFuZGxlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGludm9rZSB1c2VyLWxhbmQgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBJZiB5b3UgYXJlIGEgU2VudHJ5IHVzZXIsIGFuZCB5b3UgYXJlIHNlZWluZyB0aGlzIHN0YWNrIGZyYW1lLCBpdFxuICAgICAgICAgICAgICAgIC8vICAgICAgIG1lYW5zIHRoZSBzZW50cnkuamF2YXNjcmlwdCBTREsgY2F1Z2h0IGFuIGVycm9yIGludm9raW5nIHlvdXIgYXBwbGljYXRpb24gY29kZS4gVGhpc1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGlzIGV4cGVjdGVkIGJlaGF2aW9yIGFuZCBOT1QgaW5kaWNhdGl2ZSBvZiBhIGJ1ZyB3aXRoIHNlbnRyeS5qYXZhc2NyaXB0LlxuICAgICAgICAgICAgICAgIHJldHVybiBmbi5oYW5kbGVFdmVudC5hcHBseSh0aGlzLCB3cmFwcGVkQXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gaW52b2tlIHVzZXItbGFuZCBmdW5jdGlvblxuICAgICAgICAgICAgLy8gTk9URTogSWYgeW91IGFyZSBhIFNlbnRyeSB1c2VyLCBhbmQgeW91IGFyZSBzZWVpbmcgdGhpcyBzdGFjayBmcmFtZSwgaXRcbiAgICAgICAgICAgIC8vICAgICAgIG1lYW5zIHRoZSBzZW50cnkuamF2YXNjcmlwdCBTREsgY2F1Z2h0IGFuIGVycm9yIGludm9raW5nIHlvdXIgYXBwbGljYXRpb24gY29kZS4gVGhpc1xuICAgICAgICAgICAgLy8gICAgICAgaXMgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIE5PVCBpbmRpY2F0aXZlIG9mIGEgYnVnIHdpdGggc2VudHJ5LmphdmFzY3JpcHQuXG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgd3JhcHBlZEFyZ3VtZW50cyk7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZW5hYmxlOm5vLXVuc2FmZS1hbnlcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGlnbm9yZU5leHRPbkVycm9yKCk7XG4gICAgICAgICAgICB3aXRoU2NvcGUoZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuYWRkRXZlbnRQcm9jZXNzb3IoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9jZXNzZWRFdmVudCA9IHRzbGliXzEuX19hc3NpZ24oe30sIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubWVjaGFuaXNtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRFeGNlcHRpb25UeXBlVmFsdWUocHJvY2Vzc2VkRXZlbnQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShwcm9jZXNzZWRFdmVudCwgb3B0aW9ucy5tZWNoYW5pc20pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEV2ZW50LmV4dHJhID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgcHJvY2Vzc2VkRXZlbnQuZXh0cmEsIHsgYXJndW1lbnRzOiBhcmdzIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkRXZlbnQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2FwdHVyZUV4Y2VwdGlvbihleCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBBY2Nlc3Npbmcgc29tZSBvYmplY3RzIG1heSB0aHJvd1xuICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMTE2OFxuICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGZuKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZuLCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBzZW50cnlXcmFwcGVkW3Byb3BlcnR5XSA9IGZuW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoX29PKSB7IH0gLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1lbXB0eVxuICAgIGZuLnByb3RvdHlwZSA9IGZuLnByb3RvdHlwZSB8fCB7fTtcbiAgICBzZW50cnlXcmFwcGVkLnByb3RvdHlwZSA9IGZuLnByb3RvdHlwZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICdfX3NlbnRyeV93cmFwcGVkX18nLCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogc2VudHJ5V3JhcHBlZCxcbiAgICB9KTtcbiAgICAvLyBTaWduYWwgdGhhdCB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHdyYXBwZWQvZmlsbGVkIGFscmVhZHlcbiAgICAvLyBmb3IgYm90aCBkZWJ1Z2dpbmcgYW5kIHRvIHByZXZlbnQgaXQgdG8gYmVpbmcgd3JhcHBlZC9maWxsZWQgdHdpY2VcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzZW50cnlXcmFwcGVkLCB7XG4gICAgICAgIF9fc2VudHJ5X186IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIF9fc2VudHJ5X29yaWdpbmFsX186IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IGZuLFxuICAgICAgICB9LFxuICAgIH0pO1xuICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgZnVuY3Rpb24gbmFtZSAobm90IGFsbCBicm93c2VycyBhbGxvdyB0aGF0KVxuICAgIHRyeSB7XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZW50cnlXcmFwcGVkLCAnbmFtZScpO1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZW50cnlXcmFwcGVkLCAnbmFtZScsIHtcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuLm5hbWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChfb08pIHtcbiAgICAgICAgLypuby1lbXB0eSovXG4gICAgfVxuICAgIHJldHVybiBzZW50cnlXcmFwcGVkO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuZXhwb3J0ICogZnJvbSAnLi9leHBvcnRzJztcbmltcG9ydCB7IEludGVncmF0aW9ucyBhcyBDb3JlSW50ZWdyYXRpb25zIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0ICogYXMgQnJvd3NlckludGVncmF0aW9ucyBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBUcmFuc3BvcnRzIGZyb20gJy4vdHJhbnNwb3J0cyc7XG52YXIgd2luZG93SW50ZWdyYXRpb25zID0ge307XG4vLyBUaGlzIGJsb2NrIGlzIG5lZWRlZCB0byBhZGQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBpbnRlZ3JhdGlvbnMgcGFja2FnZXMgd2hlbiB1c2VkIHdpdGggYSBDRE5cbi8vIHRzbGludDpkaXNhYmxlOiBuby11bnNhZmUtYW55XG52YXIgX3dpbmRvdyA9IGdldEdsb2JhbE9iamVjdCgpO1xuaWYgKF93aW5kb3cuU2VudHJ5ICYmIF93aW5kb3cuU2VudHJ5LkludGVncmF0aW9ucykge1xuICAgIHdpbmRvd0ludGVncmF0aW9ucyA9IF93aW5kb3cuU2VudHJ5LkludGVncmF0aW9ucztcbn1cbi8vIHRzbGludDplbmFibGU6IG5vLXVuc2FmZS1hbnlcbnZhciBJTlRFR1JBVElPTlMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB3aW5kb3dJbnRlZ3JhdGlvbnMsIENvcmVJbnRlZ3JhdGlvbnMsIEJyb3dzZXJJbnRlZ3JhdGlvbnMpO1xuZXhwb3J0IHsgSU5URUdSQVRJT05TIGFzIEludGVncmF0aW9ucywgVHJhbnNwb3J0cyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgU2V2ZXJpdHkgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIsIGdldEV2ZW50RGVzY3JpcHRpb24sIGdldEdsb2JhbE9iamVjdCwgaHRtbFRyZWVBc1N0cmluZywgcGFyc2VVcmwsIHNhZmVKb2luLCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuLyoqXG4gKiBEZWZhdWx0IEJyZWFkY3J1bWJzIGluc3RydW1lbnRhdGlvbnNcbiAqIFRPRE86IERlcHJlY2F0ZWQgLSB3aXRoIHY2LCB0aGlzIHdpbGwgYmUgcmVuYW1lZCB0byBgSW5zdHJ1bWVudGBcbiAqL1xudmFyIEJyZWFkY3J1bWJzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgZnVuY3Rpb24gQnJlYWRjcnVtYnMob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGluaGVyaXREb2NcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmFtZSA9IEJyZWFkY3J1bWJzLmlkO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gdHNsaWJfMS5fX2Fzc2lnbih7IGNvbnNvbGU6IHRydWUsIGRvbTogdHJ1ZSwgZmV0Y2g6IHRydWUsIGhpc3Rvcnk6IHRydWUsIHNlbnRyeTogdHJ1ZSwgeGhyOiB0cnVlIH0sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBicmVhZGNydW1iIG9mIGBzZW50cnlgIGZyb20gdGhlIGV2ZW50cyB0aGVtc2VsdmVzXG4gICAgICovXG4gICAgQnJlYWRjcnVtYnMucHJvdG90eXBlLmFkZFNlbnRyeUJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLnNlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiBcInNlbnRyeS5cIiArIChldmVudC50eXBlID09PSAndHJhbnNhY3Rpb24nID8gJ3RyYW5zYWN0aW9uJyA6ICdldmVudCcpLFxuICAgICAgICAgICAgZXZlbnRfaWQ6IGV2ZW50LmV2ZW50X2lkLFxuICAgICAgICAgICAgbGV2ZWw6IGV2ZW50LmxldmVsLFxuICAgICAgICAgICAgbWVzc2FnZTogZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJyZWFkY3J1bWJzIGZyb20gY29uc29sZSBBUEkgY2FsbHNcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5wcm90b3R5cGUuX2NvbnNvbGVCcmVhZGNydW1iID0gZnVuY3Rpb24gKGhhbmRsZXJEYXRhKSB7XG4gICAgICAgIHZhciBicmVhZGNydW1iID0ge1xuICAgICAgICAgICAgY2F0ZWdvcnk6ICdjb25zb2xlJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBhcmd1bWVudHM6IGhhbmRsZXJEYXRhLmFyZ3MsXG4gICAgICAgICAgICAgICAgbG9nZ2VyOiAnY29uc29sZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGV2ZWw6IFNldmVyaXR5LmZyb21TdHJpbmcoaGFuZGxlckRhdGEubGV2ZWwpLFxuICAgICAgICAgICAgbWVzc2FnZTogc2FmZUpvaW4oaGFuZGxlckRhdGEuYXJncywgJyAnKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGhhbmRsZXJEYXRhLmxldmVsID09PSAnYXNzZXJ0Jykge1xuICAgICAgICAgICAgaWYgKGhhbmRsZXJEYXRhLmFyZ3NbMF0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgYnJlYWRjcnVtYi5tZXNzYWdlID0gXCJBc3NlcnRpb24gZmFpbGVkOiBcIiArIChzYWZlSm9pbihoYW5kbGVyRGF0YS5hcmdzLnNsaWNlKDEpLCAnICcpIHx8ICdjb25zb2xlLmFzc2VydCcpO1xuICAgICAgICAgICAgICAgIGJyZWFkY3J1bWIuZGF0YS5hcmd1bWVudHMgPSBoYW5kbGVyRGF0YS5hcmdzLnNsaWNlKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2FwdHVyZSBhIGJyZWFkY3J1bWIgZm9yIHBhc3NlZCBhc3NlcnRpb25zXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKGJyZWFkY3J1bWIsIHtcbiAgICAgICAgICAgIGlucHV0OiBoYW5kbGVyRGF0YS5hcmdzLFxuICAgICAgICAgICAgbGV2ZWw6IGhhbmRsZXJEYXRhLmxldmVsLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYnJlYWRjcnVtYnMgZnJvbSBET00gQVBJIGNhbGxzXG4gICAgICovXG4gICAgQnJlYWRjcnVtYnMucHJvdG90eXBlLl9kb21CcmVhZGNydW1iID0gZnVuY3Rpb24gKGhhbmRsZXJEYXRhKSB7XG4gICAgICAgIHZhciB0YXJnZXQ7XG4gICAgICAgIC8vIEFjY2Vzc2luZyBldmVudC50YXJnZXQgY2FuIHRocm93IChzZWUgZ2V0c2VudHJ5L3JhdmVuLWpzIzgzOCwgIzc2OClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRhcmdldCA9IGhhbmRsZXJEYXRhLmV2ZW50LnRhcmdldFxuICAgICAgICAgICAgICAgID8gaHRtbFRyZWVBc1N0cmluZyhoYW5kbGVyRGF0YS5ldmVudC50YXJnZXQpXG4gICAgICAgICAgICAgICAgOiBodG1sVHJlZUFzU3RyaW5nKGhhbmRsZXJEYXRhLmV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gJzx1bmtub3duPic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnZXRDdXJyZW50SHViKCkuYWRkQnJlYWRjcnVtYih7XG4gICAgICAgICAgICBjYXRlZ29yeTogXCJ1aS5cIiArIGhhbmRsZXJEYXRhLm5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0YXJnZXQsXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGV2ZW50OiBoYW5kbGVyRGF0YS5ldmVudCxcbiAgICAgICAgICAgIG5hbWU6IGhhbmRsZXJEYXRhLm5hbWUsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBicmVhZGNydW1icyBmcm9tIFhIUiBBUEkgY2FsbHNcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5wcm90b3R5cGUuX3hockJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoaGFuZGxlckRhdGEpIHtcbiAgICAgICAgaWYgKGhhbmRsZXJEYXRhLmVuZFRpbWVzdGFtcCkge1xuICAgICAgICAgICAgLy8gV2Ugb25seSBjYXB0dXJlIGNvbXBsZXRlLCBub24tc2VudHJ5IHJlcXVlc3RzXG4gICAgICAgICAgICBpZiAoaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X293bl9yZXF1ZXN0X18pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnZXRDdXJyZW50SHViKCkuYWRkQnJlYWRjcnVtYih7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICd4aHInLFxuICAgICAgICAgICAgICAgIGRhdGE6IGhhbmRsZXJEYXRhLnhoci5fX3NlbnRyeV94aHJfXyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnaHR0cCcsXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgeGhyOiBoYW5kbGVyRGF0YS54aHIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBicmVhZGNydW1icyBmcm9tIGZldGNoIEFQSSBjYWxsc1xuICAgICAqL1xuICAgIEJyZWFkY3J1bWJzLnByb3RvdHlwZS5fZmV0Y2hCcmVhZGNydW1iID0gZnVuY3Rpb24gKGhhbmRsZXJEYXRhKSB7XG4gICAgICAgIC8vIFdlIG9ubHkgY2FwdHVyZSBjb21wbGV0ZSBmZXRjaCByZXF1ZXN0c1xuICAgICAgICBpZiAoIWhhbmRsZXJEYXRhLmVuZFRpbWVzdGFtcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyRGF0YS5mZXRjaERhdGEudXJsLm1hdGNoKC9zZW50cnlfa2V5LykgJiYgaGFuZGxlckRhdGEuZmV0Y2hEYXRhLm1ldGhvZCA9PT0gJ1BPU1QnKSB7XG4gICAgICAgICAgICAvLyBXZSB3aWxsIG5vdCBjcmVhdGUgYnJlYWRjcnVtYnMgZm9yIGZldGNoIHJlcXVlc3RzIHRoYXQgY29udGFpbiBgc2VudHJ5X2tleWAgKGludGVybmFsIHNlbnRyeSByZXF1ZXN0cylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlckRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKHtcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogJ2ZldGNoJyxcbiAgICAgICAgICAgICAgICBkYXRhOiBoYW5kbGVyRGF0YS5mZXRjaERhdGEsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IFNldmVyaXR5LkVycm9yLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBoYW5kbGVyRGF0YS5lcnJvcixcbiAgICAgICAgICAgICAgICBpbnB1dDogaGFuZGxlckRhdGEuYXJncyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoe1xuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiAnZmV0Y2gnLFxuICAgICAgICAgICAgICAgIGRhdGE6IHRzbGliXzEuX19hc3NpZ24oe30sIGhhbmRsZXJEYXRhLmZldGNoRGF0YSwgeyBzdGF0dXNfY29kZTogaGFuZGxlckRhdGEucmVzcG9uc2Uuc3RhdHVzIH0pLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBpbnB1dDogaGFuZGxlckRhdGEuYXJncyxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogaGFuZGxlckRhdGEucmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBicmVhZGNydW1icyBmcm9tIGhpc3RvcnkgQVBJIGNhbGxzXG4gICAgICovXG4gICAgQnJlYWRjcnVtYnMucHJvdG90eXBlLl9oaXN0b3J5QnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChoYW5kbGVyRGF0YSkge1xuICAgICAgICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gICAgICAgIHZhciBmcm9tID0gaGFuZGxlckRhdGEuZnJvbTtcbiAgICAgICAgdmFyIHRvID0gaGFuZGxlckRhdGEudG87XG4gICAgICAgIHZhciBwYXJzZWRMb2MgPSBwYXJzZVVybChnbG9iYWwubG9jYXRpb24uaHJlZik7XG4gICAgICAgIHZhciBwYXJzZWRGcm9tID0gcGFyc2VVcmwoZnJvbSk7XG4gICAgICAgIHZhciBwYXJzZWRUbyA9IHBhcnNlVXJsKHRvKTtcbiAgICAgICAgLy8gSW5pdGlhbCBwdXNoU3RhdGUgZG9lc24ndCBwcm92aWRlIGBmcm9tYCBpbmZvcm1hdGlvblxuICAgICAgICBpZiAoIXBhcnNlZEZyb20ucGF0aCkge1xuICAgICAgICAgICAgcGFyc2VkRnJvbSA9IHBhcnNlZExvYztcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2Ugb25seSB0aGUgcGF0aCBjb21wb25lbnQgb2YgdGhlIFVSTCBpZiB0aGUgVVJMIG1hdGNoZXMgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gZG9jdW1lbnQgKGFsbW9zdCBhbGwgdGhlIHRpbWUgd2hlbiB1c2luZyBwdXNoU3RhdGUpXG4gICAgICAgIGlmIChwYXJzZWRMb2MucHJvdG9jb2wgPT09IHBhcnNlZFRvLnByb3RvY29sICYmIHBhcnNlZExvYy5ob3N0ID09PSBwYXJzZWRUby5ob3N0KSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgICAgICAgICAgdG8gPSBwYXJzZWRUby5yZWxhdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkTG9jLnByb3RvY29sID09PSBwYXJzZWRGcm9tLnByb3RvY29sICYmIHBhcnNlZExvYy5ob3N0ID09PSBwYXJzZWRGcm9tLmhvc3QpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1wYXJhbWV0ZXItcmVhc3NpZ25tZW50XG4gICAgICAgICAgICBmcm9tID0gcGFyc2VkRnJvbS5yZWxhdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICBnZXRDdXJyZW50SHViKCkuYWRkQnJlYWRjcnVtYih7XG4gICAgICAgICAgICBjYXRlZ29yeTogJ25hdmlnYXRpb24nLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZyb206IGZyb20sXG4gICAgICAgICAgICAgICAgdG86IHRvLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnN0cnVtZW50IGJyb3dzZXIgYnVpbHQtaW5zIHcvIGJyZWFkY3J1bWIgY2FwdHVyaW5nXG4gICAgICogIC0gQ29uc29sZSBBUElcbiAgICAgKiAgLSBET00gQVBJIChjbGljay90eXBpbmcpXG4gICAgICogIC0gWE1MSHR0cFJlcXVlc3QgQVBJXG4gICAgICogIC0gRmV0Y2ggQVBJXG4gICAgICogIC0gSGlzdG9yeSBBUElcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jb25zb2xlKSB7XG4gICAgICAgICAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9jb25zb2xlQnJlYWRjcnVtYi5hcHBseShfdGhpcywgdHNsaWJfMS5fX3NwcmVhZChhcmdzKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29uc29sZScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5kb20pIHtcbiAgICAgICAgICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2RvbUJyZWFkY3J1bWIuYXBwbHkoX3RoaXMsIHRzbGliXzEuX19zcHJlYWQoYXJncykpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RvbScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy54aHIpIHtcbiAgICAgICAgICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3hockJyZWFkY3J1bWIuYXBwbHkoX3RoaXMsIHRzbGliXzEuX19zcHJlYWQoYXJncykpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogJ3hocicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5mZXRjaCkge1xuICAgICAgICAgICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZmV0Y2hCcmVhZGNydW1iLmFwcGx5KF90aGlzLCB0c2xpYl8xLl9fc3ByZWFkKGFyZ3MpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmZXRjaCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5oaXN0b3J5KSB7XG4gICAgICAgICAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9oaXN0b3J5QnJlYWRjcnVtYi5hcHBseShfdGhpcywgdHNsaWJfMS5fX3NwcmVhZChhcmdzKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnaGlzdG9yeScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5pZCA9ICdCcmVhZGNydW1icyc7XG4gICAgcmV0dXJuIEJyZWFkY3J1bWJzO1xufSgpKTtcbmV4cG9ydCB7IEJyZWFkY3J1bWJzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icmVhZGNydW1icy5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBTZXZlcml0eSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYWRkRXhjZXB0aW9uTWVjaGFuaXNtLCBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyLCBnZXRMb2NhdGlvbkhyZWYsIGlzRXJyb3JFdmVudCwgaXNQcmltaXRpdmUsIGlzU3RyaW5nLCBsb2dnZXIsIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBldmVudEZyb21Vbmtub3duSW5wdXQgfSBmcm9tICcuLi9ldmVudGJ1aWxkZXInO1xuaW1wb3J0IHsgc2hvdWxkSWdub3JlT25FcnJvciB9IGZyb20gJy4uL2hlbHBlcnMnO1xuLyoqIEdsb2JhbCBoYW5kbGVycyAqL1xudmFyIEdsb2JhbEhhbmRsZXJzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIGZ1bmN0aW9uIEdsb2JhbEhhbmRsZXJzKG9wdGlvbnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5hbWUgPSBHbG9iYWxIYW5kbGVycy5pZDtcbiAgICAgICAgLyoqIEpTRG9jICovXG4gICAgICAgIHRoaXMuX29uRXJyb3JIYW5kbGVySW5zdGFsbGVkID0gZmFsc2U7XG4gICAgICAgIC8qKiBKU0RvYyAqL1xuICAgICAgICB0aGlzLl9vblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXJJbnN0YWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHRzbGliXzEuX19hc3NpZ24oeyBvbmVycm9yOiB0cnVlLCBvbnVuaGFuZGxlZHJlamVjdGlvbjogdHJ1ZSB9LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBHbG9iYWxIYW5kbGVycy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBFcnJvci5zdGFja1RyYWNlTGltaXQgPSA1MDtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMub25lcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZygnR2xvYmFsIEhhbmRsZXIgYXR0YWNoZWQ6IG9uZXJyb3InKTtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbGxHbG9iYWxPbkVycm9ySGFuZGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLm9udW5oYW5kbGVkcmVqZWN0aW9uKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKCdHbG9iYWwgSGFuZGxlciBhdHRhY2hlZDogb251bmhhbmRsZWRyZWplY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbGxHbG9iYWxPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgR2xvYmFsSGFuZGxlcnMucHJvdG90eXBlLl9pbnN0YWxsR2xvYmFsT25FcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLl9vbkVycm9ySGFuZGxlckluc3RhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVycm9yID0gZGF0YS5lcnJvcjtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudEh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzSW50ZWdyYXRpb24gPSBjdXJyZW50SHViLmdldEludGVncmF0aW9uKEdsb2JhbEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNGYWlsZWRPd25EZWxpdmVyeSA9IGVycm9yICYmIGVycm9yLl9fc2VudHJ5X293bl9yZXF1ZXN0X18gPT09IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNJbnRlZ3JhdGlvbiB8fCBzaG91bGRJZ25vcmVPbkVycm9yKCkgfHwgaXNGYWlsZWRPd25EZWxpdmVyeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBjdXJyZW50SHViLmdldENsaWVudCgpO1xuICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGlzUHJpbWl0aXZlKGVycm9yKVxuICAgICAgICAgICAgICAgICAgICA/IF90aGlzLl9ldmVudEZyb21JbmNvbXBsZXRlT25FcnJvcihkYXRhLm1zZywgZGF0YS51cmwsIGRhdGEubGluZSwgZGF0YS5jb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgIDogX3RoaXMuX2VuaGFuY2VFdmVudFdpdGhJbml0aWFsRnJhbWUoZXZlbnRGcm9tVW5rbm93bklucHV0KGVycm9yLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaFN0YWNrdHJhY2U6IGNsaWVudCAmJiBjbGllbnQuZ2V0T3B0aW9ucygpLmF0dGFjaFN0YWNrdHJhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9KSwgZGF0YS51cmwsIGRhdGEubGluZSwgZGF0YS5jb2x1bW4pO1xuICAgICAgICAgICAgICAgIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudCwge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29uZXJyb3InLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRIdWIuY2FwdHVyZUV2ZW50KGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fb25FcnJvckhhbmRsZXJJbnN0YWxsZWQgPSB0cnVlO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgR2xvYmFsSGFuZGxlcnMucHJvdG90eXBlLl9pbnN0YWxsR2xvYmFsT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5fb25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVySW5zdGFsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBlO1xuICAgICAgICAgICAgICAgIC8vIGRpZyB0aGUgb2JqZWN0IG9mIHRoZSByZWplY3Rpb24gb3V0IG9mIGtub3duIGV2ZW50IHR5cGVzXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJvbWlzZVJlamVjdGlvbkV2ZW50cyBzdG9yZSB0aGUgb2JqZWN0IG9mIHRoZSByZWplY3Rpb24gdW5kZXIgJ3JlYXNvbidcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qcm9taXNlUmVqZWN0aW9uRXZlbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCdyZWFzb24nIGluIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZS5yZWFzb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nLCBzb21ld2hlcmUsIChsaWtlbHkgYSBicm93c2VyIGV4dGVuc2lvbikgZWZmZWN0aXZlbHkgY2FzdHMgUHJvbWlzZVJlamVjdGlvbkV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAvLyB0byBDdXN0b21FdmVudHMsIG1vdmluZyB0aGUgYHByb21pc2VgIGFuZCBgcmVhc29uYCBhdHRyaWJ1dGVzIG9mIHRoZSBQUkUgaW50b1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgQ3VzdG9tRXZlbnQncyBgZGV0YWlsYCBhdHRyaWJ1dGUsIHNpbmNlIHRoZXkncmUgbm90IHBhcnQgb2YgQ3VzdG9tRXZlbnQncyBzcGVjXG4gICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3VzdG9tRXZlbnQgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzIzODBcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ2RldGFpbCcgaW4gZSAmJiAncmVhc29uJyBpbiBlLmRldGFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlLmRldGFpbC5yZWFzb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF9vTykge1xuICAgICAgICAgICAgICAgICAgICAvLyBuby1lbXB0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudEh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzSW50ZWdyYXRpb24gPSBjdXJyZW50SHViLmdldEludGVncmF0aW9uKEdsb2JhbEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNGYWlsZWRPd25EZWxpdmVyeSA9IGVycm9yICYmIGVycm9yLl9fc2VudHJ5X293bl9yZXF1ZXN0X18gPT09IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNJbnRlZ3JhdGlvbiB8fCBzaG91bGRJZ25vcmVPbkVycm9yKCkgfHwgaXNGYWlsZWRPd25EZWxpdmVyeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGNsaWVudCA9IGN1cnJlbnRIdWIuZ2V0Q2xpZW50KCk7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gaXNQcmltaXRpdmUoZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgID8gX3RoaXMuX2V2ZW50RnJvbUluY29tcGxldGVSZWplY3Rpb24oZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIDogZXZlbnRGcm9tVW5rbm93bklucHV0KGVycm9yLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaFN0YWNrdHJhY2U6IGNsaWVudCAmJiBjbGllbnQuZ2V0T3B0aW9ucygpLmF0dGFjaFN0YWNrdHJhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Rpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGV2ZW50LmxldmVsID0gU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgICAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb251bmhhbmRsZWRyZWplY3Rpb24nLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRIdWIuY2FwdHVyZUV2ZW50KGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZTogJ3VuaGFuZGxlZHJlamVjdGlvbicsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXJJbnN0YWxsZWQgPSB0cnVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc3RhY2sgZnJvbSBhbiBvbGQsIGVycm9yLWxlc3Mgb25lcnJvciBoYW5kbGVyLlxuICAgICAqL1xuICAgIEdsb2JhbEhhbmRsZXJzLnByb3RvdHlwZS5fZXZlbnRGcm9tSW5jb21wbGV0ZU9uRXJyb3IgPSBmdW5jdGlvbiAobXNnLCB1cmwsIGxpbmUsIGNvbHVtbikge1xuICAgICAgICB2YXIgRVJST1JfVFlQRVNfUkUgPSAvXig/OltVdV1uY2F1Z2h0ICg/OmV4Y2VwdGlvbjogKT8pPyg/OigoPzpFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkl8KUVycm9yKTogKT8oLiopJC9pO1xuICAgICAgICAvLyBJZiAnbWVzc2FnZScgaXMgRXJyb3JFdmVudCwgZ2V0IHJlYWwgbWVzc2FnZSBmcm9tIGluc2lkZVxuICAgICAgICB2YXIgbWVzc2FnZSA9IGlzRXJyb3JFdmVudChtc2cpID8gbXNnLm1lc3NhZ2UgOiBtc2c7XG4gICAgICAgIHZhciBuYW1lO1xuICAgICAgICBpZiAoaXNTdHJpbmcobWVzc2FnZSkpIHtcbiAgICAgICAgICAgIHZhciBncm91cHMgPSBtZXNzYWdlLm1hdGNoKEVSUk9SX1RZUEVTX1JFKTtcbiAgICAgICAgICAgIGlmIChncm91cHMpIHtcbiAgICAgICAgICAgICAgICBuYW1lID0gZ3JvdXBzWzFdO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBncm91cHNbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGV2ZW50ID0ge1xuICAgICAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG5hbWUgfHwgJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZUV2ZW50V2l0aEluaXRpYWxGcmFtZShldmVudCwgdXJsLCBsaW5lLCBjb2x1bW4pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuIEV2ZW50IGZyb20gYW4gVHJhY2VLaXRTdGFja1RyYWNlIHRoYXQgaGFzIHBhcnQgb2YgaXQgbWlzc2luZy5cbiAgICAgKi9cbiAgICBHbG9iYWxIYW5kbGVycy5wcm90b3R5cGUuX2V2ZW50RnJvbUluY29tcGxldGVSZWplY3Rpb24gPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4Y2VwdGlvbjoge1xuICAgICAgICAgICAgICAgIHZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVW5oYW5kbGVkUmVqZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIk5vbi1FcnJvciBwcm9taXNlIHJlamVjdGlvbiBjYXB0dXJlZCB3aXRoIHZhbHVlOiBcIiArIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgR2xvYmFsSGFuZGxlcnMucHJvdG90eXBlLl9lbmhhbmNlRXZlbnRXaXRoSW5pdGlhbEZyYW1lID0gZnVuY3Rpb24gKGV2ZW50LCB1cmwsIGxpbmUsIGNvbHVtbikge1xuICAgICAgICBldmVudC5leGNlcHRpb24gPSBldmVudC5leGNlcHRpb24gfHwge307XG4gICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgPSBldmVudC5leGNlcHRpb24udmFsdWVzIHx8IFtdO1xuICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSB8fCB7fTtcbiAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlIHx8IHt9O1xuICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UuZnJhbWVzID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlLmZyYW1lcyB8fCBbXTtcbiAgICAgICAgdmFyIGNvbG5vID0gaXNOYU4ocGFyc2VJbnQoY29sdW1uLCAxMCkpID8gdW5kZWZpbmVkIDogY29sdW1uO1xuICAgICAgICB2YXIgbGluZW5vID0gaXNOYU4ocGFyc2VJbnQobGluZSwgMTApKSA/IHVuZGVmaW5lZCA6IGxpbmU7XG4gICAgICAgIHZhciBmaWxlbmFtZSA9IGlzU3RyaW5nKHVybCkgJiYgdXJsLmxlbmd0aCA+IDAgPyB1cmwgOiBnZXRMb2NhdGlvbkhyZWYoKTtcbiAgICAgICAgaWYgKGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZS5mcmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UuZnJhbWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNvbG5vOiBjb2xubyxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb246ICc/JyxcbiAgICAgICAgICAgICAgICBpbl9hcHA6IHRydWUsXG4gICAgICAgICAgICAgICAgbGluZW5vOiBsaW5lbm8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEdsb2JhbEhhbmRsZXJzLmlkID0gJ0dsb2JhbEhhbmRsZXJzJztcbiAgICByZXR1cm4gR2xvYmFsSGFuZGxlcnM7XG59KCkpO1xuZXhwb3J0IHsgR2xvYmFsSGFuZGxlcnMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdsb2JhbGhhbmRsZXJzLmpzLm1hcCIsImV4cG9ydCB7IEdsb2JhbEhhbmRsZXJzIH0gZnJvbSAnLi9nbG9iYWxoYW5kbGVycyc7XG5leHBvcnQgeyBUcnlDYXRjaCB9IGZyb20gJy4vdHJ5Y2F0Y2gnO1xuZXhwb3J0IHsgQnJlYWRjcnVtYnMgfSBmcm9tICcuL2JyZWFkY3J1bWJzJztcbmV4cG9ydCB7IExpbmtlZEVycm9ycyB9IGZyb20gJy4vbGlua2VkZXJyb3JzJztcbmV4cG9ydCB7IFVzZXJBZ2VudCB9IGZyb20gJy4vdXNlcmFnZW50Jztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBpc0luc3RhbmNlT2YgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IGV4Y2VwdGlvbkZyb21TdGFja3RyYWNlIH0gZnJvbSAnLi4vcGFyc2Vycyc7XG5pbXBvcnQgeyBjb21wdXRlU3RhY2tUcmFjZSB9IGZyb20gJy4uL3RyYWNla2l0JztcbnZhciBERUZBVUxUX0tFWSA9ICdjYXVzZSc7XG52YXIgREVGQVVMVF9MSU1JVCA9IDU7XG4vKiogQWRkcyBTREsgaW5mbyB0byBhbiBldmVudC4gKi9cbnZhciBMaW5rZWRFcnJvcnMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaW5rZWRFcnJvcnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGluaGVyaXREb2NcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmFtZSA9IExpbmtlZEVycm9ycy5pZDtcbiAgICAgICAgdGhpcy5fa2V5ID0gb3B0aW9ucy5rZXkgfHwgREVGQVVMVF9LRVk7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gb3B0aW9ucy5saW1pdCB8fCBERUZBVUxUX0xJTUlUO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIExpbmtlZEVycm9ycy5wcm90b3R5cGUuc2V0dXBPbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihmdW5jdGlvbiAoZXZlbnQsIGhpbnQpIHtcbiAgICAgICAgICAgIHZhciBzZWxmID0gZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKExpbmtlZEVycm9ycyk7XG4gICAgICAgICAgICBpZiAoc2VsZikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9oYW5kbGVyKGV2ZW50LCBoaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIExpbmtlZEVycm9ycy5wcm90b3R5cGUuX2hhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGhpbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC5leGNlcHRpb24gfHwgIWV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgfHwgIWhpbnQgfHwgIWlzSW5zdGFuY2VPZihoaW50Lm9yaWdpbmFsRXhjZXB0aW9uLCBFcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGlua2VkRXJyb3JzID0gdGhpcy5fd2Fsa0Vycm9yVHJlZShoaW50Lm9yaWdpbmFsRXhjZXB0aW9uLCB0aGlzLl9rZXkpO1xuICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzID0gdHNsaWJfMS5fX3NwcmVhZChsaW5rZWRFcnJvcnMsIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMpO1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIExpbmtlZEVycm9ycy5wcm90b3R5cGUuX3dhbGtFcnJvclRyZWUgPSBmdW5jdGlvbiAoZXJyb3IsIGtleSwgc3RhY2spIHtcbiAgICAgICAgaWYgKHN0YWNrID09PSB2b2lkIDApIHsgc3RhY2sgPSBbXTsgfVxuICAgICAgICBpZiAoIWlzSW5zdGFuY2VPZihlcnJvcltrZXldLCBFcnJvcikgfHwgc3RhY2subGVuZ3RoICsgMSA+PSB0aGlzLl9saW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdGFja3RyYWNlID0gY29tcHV0ZVN0YWNrVHJhY2UoZXJyb3Jba2V5XSk7XG4gICAgICAgIHZhciBleGNlcHRpb24gPSBleGNlcHRpb25Gcm9tU3RhY2t0cmFjZShzdGFja3RyYWNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGtFcnJvclRyZWUoZXJyb3Jba2V5XSwga2V5LCB0c2xpYl8xLl9fc3ByZWFkKFtleGNlcHRpb25dLCBzdGFjaykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBMaW5rZWRFcnJvcnMuaWQgPSAnTGlua2VkRXJyb3JzJztcbiAgICByZXR1cm4gTGlua2VkRXJyb3JzO1xufSgpKTtcbmV4cG9ydCB7IExpbmtlZEVycm9ycyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGlua2VkZXJyb3JzLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBmaWxsLCBnZXRGdW5jdGlvbk5hbWUsIGdldEdsb2JhbE9iamVjdCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgd3JhcCB9IGZyb20gJy4uL2hlbHBlcnMnO1xudmFyIERFRkFVTFRfRVZFTlRfVEFSR0VUID0gW1xuICAgICdFdmVudFRhcmdldCcsXG4gICAgJ1dpbmRvdycsXG4gICAgJ05vZGUnLFxuICAgICdBcHBsaWNhdGlvbkNhY2hlJyxcbiAgICAnQXVkaW9UcmFja0xpc3QnLFxuICAgICdDaGFubmVsTWVyZ2VyTm9kZScsXG4gICAgJ0NyeXB0b09wZXJhdGlvbicsXG4gICAgJ0V2ZW50U291cmNlJyxcbiAgICAnRmlsZVJlYWRlcicsXG4gICAgJ0hUTUxVbmtub3duRWxlbWVudCcsXG4gICAgJ0lEQkRhdGFiYXNlJyxcbiAgICAnSURCUmVxdWVzdCcsXG4gICAgJ0lEQlRyYW5zYWN0aW9uJyxcbiAgICAnS2V5T3BlcmF0aW9uJyxcbiAgICAnTWVkaWFDb250cm9sbGVyJyxcbiAgICAnTWVzc2FnZVBvcnQnLFxuICAgICdNb2RhbFdpbmRvdycsXG4gICAgJ05vdGlmaWNhdGlvbicsXG4gICAgJ1NWR0VsZW1lbnRJbnN0YW5jZScsXG4gICAgJ1NjcmVlbicsXG4gICAgJ1RleHRUcmFjaycsXG4gICAgJ1RleHRUcmFja0N1ZScsXG4gICAgJ1RleHRUcmFja0xpc3QnLFxuICAgICdXZWJTb2NrZXQnLFxuICAgICdXZWJTb2NrZXRXb3JrZXInLFxuICAgICdXb3JrZXInLFxuICAgICdYTUxIdHRwUmVxdWVzdCcsXG4gICAgJ1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQnLFxuICAgICdYTUxIdHRwUmVxdWVzdFVwbG9hZCcsXG5dO1xuLyoqIFdyYXAgdGltZXIgZnVuY3Rpb25zIGFuZCBldmVudCB0YXJnZXRzIHRvIGNhdGNoIGVycm9ycyBhbmQgcHJvdmlkZSBiZXR0ZXIgbWV0YSBkYXRhICovXG52YXIgVHJ5Q2F0Y2ggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBUcnlDYXRjaChvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uYW1lID0gVHJ5Q2F0Y2guaWQ7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB0c2xpYl8xLl9fYXNzaWduKHsgWE1MSHR0cFJlcXVlc3Q6IHRydWUsIGV2ZW50VGFyZ2V0OiB0cnVlLCByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IHRydWUsIHNldEludGVydmFsOiB0cnVlLCBzZXRUaW1lb3V0OiB0cnVlIH0sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKiogSlNEb2MgKi9cbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuX3dyYXBUaW1lRnVuY3Rpb24gPSBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgICAgIGFyZ3NbMF0gPSB3cmFwKG9yaWdpbmFsQ2FsbGJhY2ssIHtcbiAgICAgICAgICAgICAgICBtZWNoYW5pc206IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyBmdW5jdGlvbjogZ2V0RnVuY3Rpb25OYW1lKG9yaWdpbmFsKSB9LFxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW5zdHJ1bWVudCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLl93cmFwUkFGID0gZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIHdyYXAoY2FsbGJhY2ssIHtcbiAgICAgICAgICAgICAgICBtZWNoYW5pc206IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb246ICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogZ2V0RnVuY3Rpb25OYW1lKG9yaWdpbmFsKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2luc3RydW1lbnQnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuX3dyYXBFdmVudFRhcmdldCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICAgICAgICB2YXIgcHJvdG8gPSBnbG9iYWxbdGFyZ2V0XSAmJiBnbG9iYWxbdGFyZ2V0XS5wcm90b3R5cGU7XG4gICAgICAgIGlmICghcHJvdG8gfHwgIXByb3RvLmhhc093blByb3BlcnR5IHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eSgnYWRkRXZlbnRMaXN0ZW5lcicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmlsbChwcm90bywgJ2FkZEV2ZW50TGlzdGVuZXInLCBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnROYW1lLCBmbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bmJvdW5kLW1ldGhvZCBzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4uaGFuZGxlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuLmhhbmRsZUV2ZW50ID0gd3JhcChmbi5oYW5kbGVFdmVudC5iaW5kKGZuKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjogJ2hhbmRsZUV2ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IGdldEZ1bmN0aW9uTmFtZShmbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2luc3RydW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBzb21ldGltZXMgZ2V0ICdQZXJtaXNzaW9uIGRlbmllZCB0byBhY2Nlc3MgcHJvcGVydHkgXCJoYW5kbGUgRXZlbnQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgd3JhcChmbiwge1xuICAgICAgICAgICAgICAgICAgICBtZWNoYW5pc206IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjogJ2FkZEV2ZW50TGlzdGVuZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IGdldEZ1bmN0aW9uTmFtZShmbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnN0cnVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgZmlsbChwcm90bywgJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnROYW1lLCBmbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZuO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgKGNhbGxiYWNrLl9fc2VudHJ5X3dyYXBwZWRfXyB8fCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgYWNjZXNzaW5nIF9fc2VudHJ5X3dyYXBwZWRfXyB3aWxsIHRocm93IGluIHNvbWUgU2VsZW5pdW0gZW52aXJvbm1lbnRzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIG9wdGlvbnMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuX3dyYXBYSFIgPSBmdW5jdGlvbiAob3JpZ2luYWxTZW5kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeGhyID0gdGhpczsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby10aGlzLWFzc2lnbm1lbnRcbiAgICAgICAgICAgIHZhciB4bWxIdHRwUmVxdWVzdFByb3BzID0gWydvbmxvYWQnLCAnb25lcnJvcicsICdvbnByb2dyZXNzJywgJ29ucmVhZHlzdGF0ZWNoYW5nZSddO1xuICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3RQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgaW4geGhyICYmIHR5cGVvZiB4aHJbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsbCh4aHIsIHByb3AsIGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdyYXBPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IGdldEZ1bmN0aW9uTmFtZShvcmlnaW5hbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnN0cnVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIEluc3RydW1lbnQgaW50ZWdyYXRpb24gaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSBUcnlDYXRjaCwgZ2V0IHRoZSBuYW1lIG9mIG9yaWdpbmFsIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWwuX19zZW50cnlfb3JpZ2luYWxfXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBPcHRpb25zLm1lY2hhbmlzbS5kYXRhLmhhbmRsZXIgPSBnZXRGdW5jdGlvbk5hbWUob3JpZ2luYWwuX19zZW50cnlfb3JpZ2luYWxfXyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd3JhcCBkaXJlY3RseVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAob3JpZ2luYWwsIHdyYXBPcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTZW5kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV3JhcCB0aW1lciBmdW5jdGlvbnMgYW5kIGV2ZW50IHRhcmdldHMgdG8gY2F0Y2ggZXJyb3JzXG4gICAgICogYW5kIHByb3ZpZGUgYmV0dGVyIG1ldGFkYXRhLlxuICAgICAqL1xuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuc2V0VGltZW91dCkge1xuICAgICAgICAgICAgZmlsbChnbG9iYWwsICdzZXRUaW1lb3V0JywgdGhpcy5fd3JhcFRpbWVGdW5jdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXRJbnRlcnZhbCkge1xuICAgICAgICAgICAgZmlsbChnbG9iYWwsICdzZXRJbnRlcnZhbCcsIHRoaXMuX3dyYXBUaW1lRnVuY3Rpb24uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgICBmaWxsKGdsb2JhbCwgJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsIHRoaXMuX3dyYXBSQUYuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuWE1MSHR0cFJlcXVlc3QgJiYgJ1hNTEh0dHBSZXF1ZXN0JyBpbiBnbG9iYWwpIHtcbiAgICAgICAgICAgIGZpbGwoWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLCAnc2VuZCcsIHRoaXMuX3dyYXBYSFIuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZXZlbnRUYXJnZXQpIHtcbiAgICAgICAgICAgIHZhciBldmVudFRhcmdldCA9IEFycmF5LmlzQXJyYXkodGhpcy5fb3B0aW9ucy5ldmVudFRhcmdldCkgPyB0aGlzLl9vcHRpb25zLmV2ZW50VGFyZ2V0IDogREVGQVVMVF9FVkVOVF9UQVJHRVQ7XG4gICAgICAgICAgICBldmVudFRhcmdldC5mb3JFYWNoKHRoaXMuX3dyYXBFdmVudFRhcmdldC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBUcnlDYXRjaC5pZCA9ICdUcnlDYXRjaCc7XG4gICAgcmV0dXJuIFRyeUNhdGNoO1xufSgpKTtcbmV4cG9ydCB7IFRyeUNhdGNoIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cnljYXRjaC5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG52YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4vKiogVXNlckFnZW50ICovXG52YXIgVXNlckFnZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFVzZXJBZ2VudCgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5hbWUgPSBVc2VyQWdlbnQuaWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgVXNlckFnZW50LnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihVc2VyQWdlbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFnbG9iYWwubmF2aWdhdG9yIHx8ICFnbG9iYWwubG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3QgfHwge307XG4gICAgICAgICAgICAgICAgcmVxdWVzdC51cmwgPSByZXF1ZXN0LnVybCB8fCBnbG9iYWwubG9jYXRpb24uaHJlZjtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMgPSByZXF1ZXN0LmhlYWRlcnMgfHwge307XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzWydVc2VyLUFnZW50J10gPSBnbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2Fzc2lnbih7fSwgZXZlbnQsIHsgcmVxdWVzdDogcmVxdWVzdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFVzZXJBZ2VudC5pZCA9ICdVc2VyQWdlbnQnO1xuICAgIHJldHVybiBVc2VyQWdlbnQ7XG59KCkpO1xuZXhwb3J0IHsgVXNlckFnZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VyYWdlbnQuanMubWFwIiwiaW1wb3J0IHsgZXh0cmFjdEV4Y2VwdGlvbktleXNGb3JNZXNzYWdlLCBpc0V2ZW50LCBub3JtYWxpemVUb1NpemUgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IGNvbXB1dGVTdGFja1RyYWNlIH0gZnJvbSAnLi90cmFjZWtpdCc7XG52YXIgU1RBQ0tUUkFDRV9MSU1JVCA9IDUwO1xuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gZXhjZXB0aW9uIGZyb20gYW4gVHJhY2VLaXRTdGFja1RyYWNlXG4gKiBAcGFyYW0gc3RhY2t0cmFjZSBUcmFjZUtpdFN0YWNrVHJhY2UgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBleGNlcHRpb25cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2VwdGlvbkZyb21TdGFja3RyYWNlKHN0YWNrdHJhY2UpIHtcbiAgICB2YXIgZnJhbWVzID0gcHJlcGFyZUZyYW1lc0ZvckV2ZW50KHN0YWNrdHJhY2Uuc3RhY2spO1xuICAgIHZhciBleGNlcHRpb24gPSB7XG4gICAgICAgIHR5cGU6IHN0YWNrdHJhY2UubmFtZSxcbiAgICAgICAgdmFsdWU6IHN0YWNrdHJhY2UubWVzc2FnZSxcbiAgICB9O1xuICAgIGlmIChmcmFtZXMgJiYgZnJhbWVzLmxlbmd0aCkge1xuICAgICAgICBleGNlcHRpb24uc3RhY2t0cmFjZSA9IHsgZnJhbWVzOiBmcmFtZXMgfTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICBpZiAoZXhjZXB0aW9uLnR5cGUgPT09IHVuZGVmaW5lZCAmJiBleGNlcHRpb24udmFsdWUgPT09ICcnKSB7XG4gICAgICAgIGV4Y2VwdGlvbi52YWx1ZSA9ICdVbnJlY292ZXJhYmxlIGVycm9yIGNhdWdodCc7XG4gICAgfVxuICAgIHJldHVybiBleGNlcHRpb247XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50RnJvbVBsYWluT2JqZWN0KGV4Y2VwdGlvbiwgc3ludGhldGljRXhjZXB0aW9uLCByZWplY3Rpb24pIHtcbiAgICB2YXIgZXZlbnQgPSB7XG4gICAgICAgIGV4Y2VwdGlvbjoge1xuICAgICAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBpc0V2ZW50KGV4Y2VwdGlvbikgPyBleGNlcHRpb24uY29uc3RydWN0b3IubmFtZSA6IHJlamVjdGlvbiA/ICdVbmhhbmRsZWRSZWplY3Rpb24nIDogJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiTm9uLUVycm9yIFwiICsgKHJlamVjdGlvbiA/ICdwcm9taXNlIHJlamVjdGlvbicgOiAnZXhjZXB0aW9uJykgKyBcIiBjYXB0dXJlZCB3aXRoIGtleXM6IFwiICsgZXh0cmFjdEV4Y2VwdGlvbktleXNGb3JNZXNzYWdlKGV4Y2VwdGlvbiksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICBfX3NlcmlhbGl6ZWRfXzogbm9ybWFsaXplVG9TaXplKGV4Y2VwdGlvbiksXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoc3ludGhldGljRXhjZXB0aW9uKSB7XG4gICAgICAgIHZhciBzdGFja3RyYWNlID0gY29tcHV0ZVN0YWNrVHJhY2Uoc3ludGhldGljRXhjZXB0aW9uKTtcbiAgICAgICAgdmFyIGZyYW1lc18xID0gcHJlcGFyZUZyYW1lc0ZvckV2ZW50KHN0YWNrdHJhY2Uuc3RhY2spO1xuICAgICAgICBldmVudC5zdGFja3RyYWNlID0ge1xuICAgICAgICAgICAgZnJhbWVzOiBmcmFtZXNfMSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50O1xufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudEZyb21TdGFja3RyYWNlKHN0YWNrdHJhY2UpIHtcbiAgICB2YXIgZXhjZXB0aW9uID0gZXhjZXB0aW9uRnJvbVN0YWNrdHJhY2Uoc3RhY2t0cmFjZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgICB2YWx1ZXM6IFtleGNlcHRpb25dLFxuICAgICAgICB9LFxuICAgIH07XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVGcmFtZXNGb3JFdmVudChzdGFjaykge1xuICAgIGlmICghc3RhY2sgfHwgIXN0YWNrLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciBsb2NhbFN0YWNrID0gc3RhY2s7XG4gICAgdmFyIGZpcnN0RnJhbWVGdW5jdGlvbiA9IGxvY2FsU3RhY2tbMF0uZnVuYyB8fCAnJztcbiAgICB2YXIgbGFzdEZyYW1lRnVuY3Rpb24gPSBsb2NhbFN0YWNrW2xvY2FsU3RhY2subGVuZ3RoIC0gMV0uZnVuYyB8fCAnJztcbiAgICAvLyBJZiBzdGFjayBzdGFydHMgd2l0aCBvbmUgb2Ygb3VyIEFQSSBjYWxscywgcmVtb3ZlIGl0IChzdGFydHMsIG1lYW5pbmcgaXQncyB0aGUgdG9wIG9mIHRoZSBzdGFjayAtIGFrYSBsYXN0IGNhbGwpXG4gICAgaWYgKGZpcnN0RnJhbWVGdW5jdGlvbi5pbmRleE9mKCdjYXB0dXJlTWVzc2FnZScpICE9PSAtMSB8fCBmaXJzdEZyYW1lRnVuY3Rpb24uaW5kZXhPZignY2FwdHVyZUV4Y2VwdGlvbicpICE9PSAtMSkge1xuICAgICAgICBsb2NhbFN0YWNrID0gbG9jYWxTdGFjay5zbGljZSgxKTtcbiAgICB9XG4gICAgLy8gSWYgc3RhY2sgZW5kcyB3aXRoIG9uZSBvZiBvdXIgaW50ZXJuYWwgQVBJIGNhbGxzLCByZW1vdmUgaXQgKGVuZHMsIG1lYW5pbmcgaXQncyB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAtIGFrYSB0b3AtbW9zdCBjYWxsKVxuICAgIGlmIChsYXN0RnJhbWVGdW5jdGlvbi5pbmRleE9mKCdzZW50cnlXcmFwcGVkJykgIT09IC0xKSB7XG4gICAgICAgIGxvY2FsU3RhY2sgPSBsb2NhbFN0YWNrLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gICAgLy8gVGhlIGZyYW1lIHdoZXJlIHRoZSBjcmFzaCBoYXBwZW5lZCwgc2hvdWxkIGJlIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheVxuICAgIHJldHVybiBsb2NhbFN0YWNrXG4gICAgICAgIC5zbGljZSgwLCBTVEFDS1RSQUNFX0xJTUlUKVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChmcmFtZSkgeyByZXR1cm4gKHtcbiAgICAgICAgY29sbm86IGZyYW1lLmNvbHVtbiA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZyYW1lLmNvbHVtbixcbiAgICAgICAgZmlsZW5hbWU6IGZyYW1lLnVybCB8fCBsb2NhbFN0YWNrWzBdLnVybCxcbiAgICAgICAgZnVuY3Rpb246IGZyYW1lLmZ1bmMgfHwgJz8nLFxuICAgICAgICBpbl9hcHA6IHRydWUsXG4gICAgICAgIGxpbmVubzogZnJhbWUubGluZSA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZyYW1lLmxpbmUsXG4gICAgfSk7IH0pXG4gICAgICAgIC5yZXZlcnNlKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZXJzLmpzLm1hcCIsImltcG9ydCB7IGdldEN1cnJlbnRIdWIsIGluaXRBbmRCaW5kLCBJbnRlZ3JhdGlvbnMgYXMgQ29yZUludGVncmF0aW9ucyB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBCcm93c2VyQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuaW1wb3J0IHsgd3JhcCBhcyBpbnRlcm5hbFdyYXAgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnMsIEdsb2JhbEhhbmRsZXJzLCBMaW5rZWRFcnJvcnMsIFRyeUNhdGNoLCBVc2VyQWdlbnQgfSBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5leHBvcnQgdmFyIGRlZmF1bHRJbnRlZ3JhdGlvbnMgPSBbXG4gICAgbmV3IENvcmVJbnRlZ3JhdGlvbnMuSW5ib3VuZEZpbHRlcnMoKSxcbiAgICBuZXcgQ29yZUludGVncmF0aW9ucy5GdW5jdGlvblRvU3RyaW5nKCksXG4gICAgbmV3IFRyeUNhdGNoKCksXG4gICAgbmV3IEJyZWFkY3J1bWJzKCksXG4gICAgbmV3IEdsb2JhbEhhbmRsZXJzKCksXG4gICAgbmV3IExpbmtlZEVycm9ycygpLFxuICAgIG5ldyBVc2VyQWdlbnQoKSxcbl07XG4vKipcbiAqIFRoZSBTZW50cnkgQnJvd3NlciBTREsgQ2xpZW50LlxuICpcbiAqIFRvIHVzZSB0aGlzIFNESywgY2FsbCB0aGUge0BsaW5rIGluaXR9IGZ1bmN0aW9uIGFzIGVhcmx5IGFzIHBvc3NpYmxlIHdoZW5cbiAqIGxvYWRpbmcgdGhlIHdlYiBwYWdlLiBUbyBzZXQgY29udGV4dCBpbmZvcm1hdGlvbiBvciBzZW5kIG1hbnVhbCBldmVudHMsIHVzZVxuICogdGhlIHByb3ZpZGVkIG1ldGhvZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqXG4gKiBpbXBvcnQgeyBpbml0IH0gZnJvbSAnQHNlbnRyeS9icm93c2VyJztcbiAqXG4gKiBpbml0KHtcbiAqICAgZHNuOiAnX19EU05fXycsXG4gKiAgIC8vIC4uLlxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKlxuICogaW1wb3J0IHsgY29uZmlndXJlU2NvcGUgfSBmcm9tICdAc2VudHJ5L2Jyb3dzZXInO1xuICogY29uZmlndXJlU2NvcGUoKHNjb3BlOiBTY29wZSkgPT4ge1xuICogICBzY29wZS5zZXRFeHRyYSh7IGJhdHRlcnk6IDAuNyB9KTtcbiAqICAgc2NvcGUuc2V0VGFnKHsgdXNlcl9tb2RlOiAnYWRtaW4nIH0pO1xuICogICBzY29wZS5zZXRVc2VyKHsgaWQ6ICc0NzExJyB9KTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGltcG9ydCB7IGFkZEJyZWFkY3J1bWIgfSBmcm9tICdAc2VudHJ5L2Jyb3dzZXInO1xuICogYWRkQnJlYWRjcnVtYih7XG4gKiAgIG1lc3NhZ2U6ICdNeSBCcmVhZGNydW1iJyxcbiAqICAgLy8gLi4uXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgXG4gKlxuICogaW1wb3J0ICogYXMgU2VudHJ5IGZyb20gJ0BzZW50cnkvYnJvd3Nlcic7XG4gKiBTZW50cnkuY2FwdHVyZU1lc3NhZ2UoJ0hlbGxvLCB3b3JsZCEnKTtcbiAqIFNlbnRyeS5jYXB0dXJlRXhjZXB0aW9uKG5ldyBFcnJvcignR29vZCBieWUnKSk7XG4gKiBTZW50cnkuY2FwdHVyZUV2ZW50KHtcbiAqICAgbWVzc2FnZTogJ01hbnVhbCcsXG4gKiAgIHN0YWNrdHJhY2U6IFtcbiAqICAgICAvLyAuLi5cbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHNlZSB7QGxpbmsgQnJvd3Nlck9wdGlvbnN9IGZvciBkb2N1bWVudGF0aW9uIG9uIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXQob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucyA9IGRlZmF1bHRJbnRlZ3JhdGlvbnM7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnJlbGVhc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgd2luZG93XzEgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICAgICAgLy8gVGhpcyBzdXBwb3J0cyB0aGUgdmFyaWFibGUgdGhhdCBzZW50cnktd2VicGFjay1wbHVnaW4gaW5qZWN0c1xuICAgICAgICBpZiAod2luZG93XzEuU0VOVFJZX1JFTEVBU0UgJiYgd2luZG93XzEuU0VOVFJZX1JFTEVBU0UuaWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucmVsZWFzZSA9IHdpbmRvd18xLlNFTlRSWV9SRUxFQVNFLmlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRBbmRCaW5kKEJyb3dzZXJDbGllbnQsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBQcmVzZW50IHRoZSB1c2VyIHdpdGggYSByZXBvcnQgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIEV2ZXJ5dGhpbmcgaXMgb3B0aW9uYWwsIHdlIHRyeSB0byBmZXRjaCBhbGwgaW5mbyBuZWVkIGZyb20gdGhlIGdsb2JhbCBzY29wZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dSZXBvcnREaWFsb2cob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgaWYgKCFvcHRpb25zLmV2ZW50SWQpIHtcbiAgICAgICAgb3B0aW9ucy5ldmVudElkID0gZ2V0Q3VycmVudEh1YigpLmxhc3RFdmVudElkKCk7XG4gICAgfVxuICAgIHZhciBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50KCk7XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgICBjbGllbnQuc2hvd1JlcG9ydERpYWxvZyhvcHRpb25zKTtcbiAgICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGdldHRlciBmb3IgbGFzdEV2ZW50SWQuXG4gKlxuICogQHJldHVybnMgVGhlIGxhc3QgZXZlbnQgaWQgb2YgYSBjYXB0dXJlZCBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhc3RFdmVudElkKCkge1xuICAgIHJldHVybiBnZXRDdXJyZW50SHViKCkubGFzdEV2ZW50SWQoKTtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBoZXJlIHRvIGJlIEFQSSBjb21wYXRpYmxlIHdpdGggdGhlIGxvYWRlci5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcmNlTG9hZCgpIHtcbiAgICAvLyBOb29wXG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSB0byBiZSBBUEkgY29tcGF0aWJsZSB3aXRoIHRoZSBsb2FkZXIuXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkxvYWQoY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xufVxuLyoqXG4gKiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjdXJyZW50IGV2ZW50cyBoYXZlIGJlZW4gc2VudC5cbiAqIElmIHlvdSBwcm92aWRlIGEgdGltZW91dCBhbmQgdGhlIHF1ZXVlIHRha2VzIGxvbmdlciB0byBkcmFpbiB0aGUgcHJvbWlzZSByZXR1cm5zIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IE1heGltdW0gdGltZSBpbiBtcyB0aGUgY2xpZW50IHNob3VsZCB3YWl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2godGltZW91dCkge1xuICAgIHZhciBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50KCk7XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgICByZXR1cm4gY2xpZW50LmZsdXNoKHRpbWVvdXQpO1xuICAgIH1cbiAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KGZhbHNlKTtcbn1cbi8qKlxuICogQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgY3VycmVudCBldmVudHMgaGF2ZSBiZWVuIHNlbnQuXG4gKiBJZiB5b3UgcHJvdmlkZSBhIHRpbWVvdXQgYW5kIHRoZSBxdWV1ZSB0YWtlcyBsb25nZXIgdG8gZHJhaW4gdGhlIHByb21pc2UgcmV0dXJucyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBNYXhpbXVtIHRpbWUgaW4gbXMgdGhlIGNsaWVudCBzaG91bGQgd2FpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlKHRpbWVvdXQpIHtcbiAgICB2YXIgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudCgpO1xuICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgcmV0dXJuIGNsaWVudC5jbG9zZSh0aW1lb3V0KTtcbiAgICB9XG4gICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlamVjdChmYWxzZSk7XG59XG4vKipcbiAqIFdyYXAgY29kZSB3aXRoaW4gYSB0cnkvY2F0Y2ggYmxvY2sgc28gdGhlIFNESyBpcyBhYmxlIHRvIGNhcHR1cmUgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSBmbiBBIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB3cmFwcGVkIGZ1bmN0aW9uIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKGZuKSB7XG4gICAgcmV0dXJuIGludGVybmFsV3JhcChmbikoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby11bnNhZmUtYW55XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZGsuanMubWFwIiwiLy8gdHNsaW50OmRpc2FibGU6b2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuLy8gZ2xvYmFsIHJlZmVyZW5jZSB0byBzbGljZVxudmFyIFVOS05PV05fRlVOQ1RJT04gPSAnPyc7XG4vLyBDaHJvbWl1bSBiYXNlZCBicm93c2VyczogQ2hyb21lLCBCcmF2ZSwgbmV3IE9wZXJhLCBuZXcgRWRnZVxudmFyIGNocm9tZSA9IC9eXFxzKmF0ICg/OiguKj8pID9cXCgpPygoPzpmaWxlfGh0dHBzP3xibG9ifGNocm9tZS1leHRlbnNpb258YWRkcmVzc3xuYXRpdmV8ZXZhbHx3ZWJwYWNrfDxhbm9ueW1vdXM+fFstYS16XSs6fC4qYnVuZGxlfFxcLykuKj8pKD86OihcXGQrKSk/KD86OihcXGQrKSk/XFwpP1xccyokL2k7XG4vLyBnZWNrbyByZWdleDogYCg/OmJ1bmRsZXxcXGQrXFwuanMpYDogYGJ1bmRsZWAgaXMgZm9yIHJlYWN0IG5hdGl2ZSwgYFxcZCtcXC5qc2AgYWxzbyBidXQgc3BlY2lmaWNhbGx5IGZvciByYW0gYnVuZGxlcyBiZWNhdXNlIGl0XG4vLyBnZW5lcmF0ZXMgZmlsZW5hbWVzIHdpdGhvdXQgYSBwcmVmaXggbGlrZSBgZmlsZTovL2AgdGhlIGZpbGVuYW1lcyBpbiB0aGUgc3RhY2t0cmFjZSBhcmUganVzdCA0Mi5qc1xuLy8gV2UgbmVlZCB0aGlzIHNwZWNpZmljIGNhc2UgZm9yIG5vdyBiZWNhdXNlIHdlIHdhbnQgbm8gb3RoZXIgcmVnZXggdG8gbWF0Y2guXG52YXIgZ2Vja28gPSAvXlxccyooLio/KSg/OlxcKCguKj8pXFwpKT8oPzpefEApPygoPzpmaWxlfGh0dHBzP3xibG9ifGNocm9tZXx3ZWJwYWNrfHJlc291cmNlfG1vei1leHRlbnNpb24pLio/OlxcLy4qP3xcXFtuYXRpdmUgY29kZVxcXXxbXkBdKig/OmJ1bmRsZXxcXGQrXFwuanMpKSg/OjooXFxkKykpPyg/OjooXFxkKykpP1xccyokL2k7XG52YXIgd2luanMgPSAvXlxccyphdCAoPzooKD86XFxbb2JqZWN0IG9iamVjdFxcXSk/LispICk/XFwoPygoPzpmaWxlfG1zLWFwcHh8aHR0cHM/fHdlYnBhY2t8YmxvYik6Lio/KTooXFxkKykoPzo6KFxcZCspKT9cXCk/XFxzKiQvaTtcbnZhciBnZWNrb0V2YWwgPSAvKFxcUyspIGxpbmUgKFxcZCspKD86ID4gZXZhbCBsaW5lIFxcZCspKiA+IGV2YWwvaTtcbnZhciBjaHJvbWVFdmFsID0gL1xcKChcXFMqKSg/OjooXFxkKykpKD86OihcXGQrKSlcXCkvO1xuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVN0YWNrVHJhY2UoZXgpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG4gICAgdmFyIHN0YWNrID0gbnVsbDtcbiAgICB2YXIgcG9wU2l6ZSA9IGV4ICYmIGV4LmZyYW1lc1RvUG9wO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgbXVzdCBiZSB0cmllZCBmaXJzdCBiZWNhdXNlIE9wZXJhIDEwICpkZXN0cm95cypcbiAgICAgICAgLy8gaXRzIHN0YWNrdHJhY2UgcHJvcGVydHkgaWYgeW91IHRyeSB0byBhY2Nlc3MgdGhlIHN0YWNrXG4gICAgICAgIC8vIHByb3BlcnR5IGZpcnN0ISFcbiAgICAgICAgc3RhY2sgPSBjb21wdXRlU3RhY2tUcmFjZUZyb21TdGFja3RyYWNlUHJvcChleCk7XG4gICAgICAgIGlmIChzdGFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHBvcEZyYW1lcyhzdGFjaywgcG9wU2l6ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gbm8tZW1wdHlcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc3RhY2sgPSBjb21wdXRlU3RhY2tUcmFjZUZyb21TdGFja1Byb3AoZXgpO1xuICAgICAgICBpZiAoc3RhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBwb3BGcmFtZXMoc3RhY2ssIHBvcFNpemUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIG5vLWVtcHR5XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2U6IGV4dHJhY3RNZXNzYWdlKGV4KSxcbiAgICAgICAgbmFtZTogZXggJiYgZXgubmFtZSxcbiAgICAgICAgc3RhY2s6IFtdLFxuICAgICAgICBmYWlsZWQ6IHRydWUsXG4gICAgfTtcbn1cbi8qKiBKU0RvYyAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmN5Y2xvbWF0aWMtY29tcGxleGl0eVxuZnVuY3Rpb24gY29tcHV0ZVN0YWNrVHJhY2VGcm9tU3RhY2tQcm9wKGV4KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxuICAgIGlmICghZXggfHwgIWV4LnN0YWNrKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICB2YXIgbGluZXMgPSBleC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgdmFyIGlzRXZhbDtcbiAgICB2YXIgc3VibWF0Y2g7XG4gICAgdmFyIHBhcnRzO1xuICAgIHZhciBlbGVtZW50O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKChwYXJ0cyA9IGNocm9tZS5leGVjKGxpbmVzW2ldKSkpIHtcbiAgICAgICAgICAgIHZhciBpc05hdGl2ZSA9IHBhcnRzWzJdICYmIHBhcnRzWzJdLmluZGV4T2YoJ25hdGl2ZScpID09PSAwOyAvLyBzdGFydCBvZiBsaW5lXG4gICAgICAgICAgICBpc0V2YWwgPSBwYXJ0c1syXSAmJiBwYXJ0c1syXS5pbmRleE9mKCdldmFsJykgPT09IDA7IC8vIHN0YXJ0IG9mIGxpbmVcbiAgICAgICAgICAgIGlmIChpc0V2YWwgJiYgKHN1Ym1hdGNoID0gY2hyb21lRXZhbC5leGVjKHBhcnRzWzJdKSkpIHtcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBvdXQgZXZhbCBsaW5lL2NvbHVtbiBhbmQgdXNlIHRvcC1tb3N0IGxpbmUvY29sdW1uIG51bWJlclxuICAgICAgICAgICAgICAgIHBhcnRzWzJdID0gc3VibWF0Y2hbMV07IC8vIHVybFxuICAgICAgICAgICAgICAgIHBhcnRzWzNdID0gc3VibWF0Y2hbMl07IC8vIGxpbmVcbiAgICAgICAgICAgICAgICBwYXJ0c1s0XSA9IHN1Ym1hdGNoWzNdOyAvLyBjb2x1bW5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgLy8gd29ya2luZyB3aXRoIHRoZSByZWdleHAgYWJvdmUgaXMgc3VwZXIgcGFpbmZ1bC4gaXQgaXMgcXVpdGUgYSBoYWNrLCBidXQganVzdCBzdHJpcHBpbmcgdGhlIGBhZGRyZXNzIGF0IGBcbiAgICAgICAgICAgICAgICAvLyBwcmVmaXggaGVyZSBzZWVtcyBsaWtlIHRoZSBxdWlja2VzdCBzb2x1dGlvbiBmb3Igbm93LlxuICAgICAgICAgICAgICAgIHVybDogcGFydHNbMl0gJiYgcGFydHNbMl0uaW5kZXhPZignYWRkcmVzcyBhdCAnKSA9PT0gMCA/IHBhcnRzWzJdLnN1YnN0cignYWRkcmVzcyBhdCAnLmxlbmd0aCkgOiBwYXJ0c1syXSxcbiAgICAgICAgICAgICAgICBmdW5jOiBwYXJ0c1sxXSB8fCBVTktOT1dOX0ZVTkNUSU9OLFxuICAgICAgICAgICAgICAgIGFyZ3M6IGlzTmF0aXZlID8gW3BhcnRzWzJdXSA6IFtdLFxuICAgICAgICAgICAgICAgIGxpbmU6IHBhcnRzWzNdID8gK3BhcnRzWzNdIDogbnVsbCxcbiAgICAgICAgICAgICAgICBjb2x1bW46IHBhcnRzWzRdID8gK3BhcnRzWzRdIDogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHBhcnRzID0gd2luanMuZXhlYyhsaW5lc1tpXSkpKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgIHVybDogcGFydHNbMl0sXG4gICAgICAgICAgICAgICAgZnVuYzogcGFydHNbMV0gfHwgVU5LTk9XTl9GVU5DVElPTixcbiAgICAgICAgICAgICAgICBhcmdzOiBbXSxcbiAgICAgICAgICAgICAgICBsaW5lOiArcGFydHNbM10sXG4gICAgICAgICAgICAgICAgY29sdW1uOiBwYXJ0c1s0XSA/ICtwYXJ0c1s0XSA6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChwYXJ0cyA9IGdlY2tvLmV4ZWMobGluZXNbaV0pKSkge1xuICAgICAgICAgICAgaXNFdmFsID0gcGFydHNbM10gJiYgcGFydHNbM10uaW5kZXhPZignID4gZXZhbCcpID4gLTE7XG4gICAgICAgICAgICBpZiAoaXNFdmFsICYmIChzdWJtYXRjaCA9IGdlY2tvRXZhbC5leGVjKHBhcnRzWzNdKSkpIHtcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBvdXQgZXZhbCBsaW5lL2NvbHVtbiBhbmQgdXNlIHRvcC1tb3N0IGxpbmUgbnVtYmVyXG4gICAgICAgICAgICAgICAgcGFydHNbMV0gPSBwYXJ0c1sxXSB8fCBcImV2YWxcIjtcbiAgICAgICAgICAgICAgICBwYXJ0c1szXSA9IHN1Ym1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIHBhcnRzWzRdID0gc3VibWF0Y2hbMl07XG4gICAgICAgICAgICAgICAgcGFydHNbNV0gPSAnJzsgLy8gbm8gY29sdW1uIHdoZW4gZXZhbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaSA9PT0gMCAmJiAhcGFydHNbNV0gJiYgZXguY29sdW1uTnVtYmVyICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICAvLyBGaXJlRm94IHVzZXMgdGhpcyBhd2Vzb21lIGNvbHVtbk51bWJlciBwcm9wZXJ0eSBmb3IgaXRzIHRvcCBmcmFtZVxuICAgICAgICAgICAgICAgIC8vIEFsc28gbm90ZSwgRmlyZWZveCdzIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZCBhbmQgZXZlcnl0aGluZyBlbHNlIGV4cGVjdHMgMS1iYXNlZCxcbiAgICAgICAgICAgICAgICAvLyBzbyBhZGRpbmcgMVxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgaGFjayBkb2Vzbid0IHdvcmsgaWYgdG9wLW1vc3QgZnJhbWUgaXMgZXZhbFxuICAgICAgICAgICAgICAgIHN0YWNrWzBdLmNvbHVtbiA9IGV4LmNvbHVtbk51bWJlciArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgIHVybDogcGFydHNbM10sXG4gICAgICAgICAgICAgICAgZnVuYzogcGFydHNbMV0gfHwgVU5LTk9XTl9GVU5DVElPTixcbiAgICAgICAgICAgICAgICBhcmdzOiBwYXJ0c1syXSA/IHBhcnRzWzJdLnNwbGl0KCcsJykgOiBbXSxcbiAgICAgICAgICAgICAgICBsaW5lOiBwYXJ0c1s0XSA/ICtwYXJ0c1s0XSA6IG51bGwsXG4gICAgICAgICAgICAgICAgY29sdW1uOiBwYXJ0c1s1XSA/ICtwYXJ0c1s1XSA6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbGVtZW50LmZ1bmMgJiYgZWxlbWVudC5saW5lKSB7XG4gICAgICAgICAgICBlbGVtZW50LmZ1bmMgPSBVTktOT1dOX0ZVTkNUSU9OO1xuICAgICAgICB9XG4gICAgICAgIHN0YWNrLnB1c2goZWxlbWVudCk7XG4gICAgfVxuICAgIGlmICghc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtZXNzYWdlOiBleHRyYWN0TWVzc2FnZShleCksXG4gICAgICAgIG5hbWU6IGV4Lm5hbWUsXG4gICAgICAgIHN0YWNrOiBzdGFjayxcbiAgICB9O1xufVxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBjb21wdXRlU3RhY2tUcmFjZUZyb21TdGFja3RyYWNlUHJvcChleCkge1xuICAgIGlmICghZXggfHwgIWV4LnN0YWNrdHJhY2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEFjY2VzcyBhbmQgc3RvcmUgdGhlIHN0YWNrdHJhY2UgcHJvcGVydHkgYmVmb3JlIGRvaW5nIEFOWVRISU5HXG4gICAgLy8gZWxzZSB0byBpdCBiZWNhdXNlIE9wZXJhIGlzIG5vdCB2ZXJ5IGdvb2QgYXQgcHJvdmlkaW5nIGl0XG4gICAgLy8gcmVsaWFibHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy5cbiAgICB2YXIgc3RhY2t0cmFjZSA9IGV4LnN0YWNrdHJhY2U7XG4gICAgdmFyIG9wZXJhMTBSZWdleCA9IC8gbGluZSAoXFxkKykuKnNjcmlwdCAoPzppbiApPyhcXFMrKSg/OjogaW4gZnVuY3Rpb24gKFxcUyspKT8kL2k7XG4gICAgdmFyIG9wZXJhMTFSZWdleCA9IC8gbGluZSAoXFxkKyksIGNvbHVtbiAoXFxkKylcXHMqKD86aW4gKD86PGFub255bW91cyBmdW5jdGlvbjogKFtePl0rKT58KFteXFwpXSspKVxcKCguKilcXCkpPyBpbiAoLiopOlxccyokL2k7XG4gICAgdmFyIGxpbmVzID0gc3RhY2t0cmFjZS5zcGxpdCgnXFxuJyk7XG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgdmFyIHBhcnRzO1xuICAgIGZvciAodmFyIGxpbmUgPSAwOyBsaW5lIDwgbGluZXMubGVuZ3RoOyBsaW5lICs9IDIpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6bm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxuICAgICAgICB2YXIgZWxlbWVudCA9IG51bGw7XG4gICAgICAgIGlmICgocGFydHMgPSBvcGVyYTEwUmVnZXguZXhlYyhsaW5lc1tsaW5lXSkpKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgIHVybDogcGFydHNbMl0sXG4gICAgICAgICAgICAgICAgZnVuYzogcGFydHNbM10sXG4gICAgICAgICAgICAgICAgYXJnczogW10sXG4gICAgICAgICAgICAgICAgbGluZTogK3BhcnRzWzFdLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHBhcnRzID0gb3BlcmExMVJlZ2V4LmV4ZWMobGluZXNbbGluZV0pKSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICB1cmw6IHBhcnRzWzZdLFxuICAgICAgICAgICAgICAgIGZ1bmM6IHBhcnRzWzNdIHx8IHBhcnRzWzRdLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHBhcnRzWzVdID8gcGFydHNbNV0uc3BsaXQoJywnKSA6IFtdLFxuICAgICAgICAgICAgICAgIGxpbmU6ICtwYXJ0c1sxXSxcbiAgICAgICAgICAgICAgICBjb2x1bW46ICtwYXJ0c1syXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudC5mdW5jICYmIGVsZW1lbnQubGluZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZnVuYyA9IFVOS05PV05fRlVOQ1RJT047XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFjay5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtZXNzYWdlOiBleHRyYWN0TWVzc2FnZShleCksXG4gICAgICAgIG5hbWU6IGV4Lm5hbWUsXG4gICAgICAgIHN0YWNrOiBzdGFjayxcbiAgICB9O1xufVxuLyoqIFJlbW92ZSBOIG51bWJlciBvZiBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgKi9cbmZ1bmN0aW9uIHBvcEZyYW1lcyhzdGFja3RyYWNlLCBwb3BTaXplKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hc3NpZ24oe30sIHN0YWNrdHJhY2UsIHsgc3RhY2s6IHN0YWNrdHJhY2Uuc3RhY2suc2xpY2UocG9wU2l6ZSkgfSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdGFja3RyYWNlO1xuICAgIH1cbn1cbi8qKlxuICogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHN0YWNrdHJhY2UubWVzc2FnZSBpcyBhbiBFdmVudCBvYmplY3RcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzE5NDlcbiAqIEluIHRoaXMgc3BlY2lmaWMgY2FzZSB3ZSB0cnkgdG8gZXh0cmFjdCBzdGFja3RyYWNlLm1lc3NhZ2UuZXJyb3IubWVzc2FnZVxuICovXG5mdW5jdGlvbiBleHRyYWN0TWVzc2FnZShleCkge1xuICAgIHZhciBtZXNzYWdlID0gZXggJiYgZXgubWVzc2FnZTtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuICdObyBlcnJvciBtZXNzYWdlJztcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgdHlwZW9mIG1lc3NhZ2UuZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZXJyb3IubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZWtpdC5qcy5tYXAiLCJpbXBvcnQgeyBBUEkgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgUHJvbWlzZUJ1ZmZlciwgU2VudHJ5RXJyb3IgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKiBCYXNlIFRyYW5zcG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbiAqL1xudmFyIEJhc2VUcmFuc3BvcnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzZVRyYW5zcG9ydChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIC8qKiBBIHNpbXBsZSBidWZmZXIgaG9sZGluZyBhbGwgcmVxdWVzdHMuICovXG4gICAgICAgIHRoaXMuX2J1ZmZlciA9IG5ldyBQcm9taXNlQnVmZmVyKDMwKTtcbiAgICAgICAgdGhpcy5fYXBpID0gbmV3IEFQSSh0aGlzLm9wdGlvbnMuZHNuKTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRlcHJlY2F0aW9uXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5fYXBpLmdldFN0b3JlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGgoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlVHJhbnNwb3J0LnByb3RvdHlwZS5zZW5kRXZlbnQgPSBmdW5jdGlvbiAoXykge1xuICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ1RyYW5zcG9ydCBDbGFzcyBoYXMgdG8gaW1wbGVtZW50IGBzZW5kRXZlbnRgIG1ldGhvZCcpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlVHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIuZHJhaW4odGltZW91dCk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZVRyYW5zcG9ydDtcbn0oKSk7XG5leHBvcnQgeyBCYXNlVHJhbnNwb3J0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBldmVudFRvU2VudHJ5UmVxdWVzdCB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBTdGF0dXMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCwgbG9nZ2VyLCBwYXJzZVJldHJ5QWZ0ZXJIZWFkZXIsIHN1cHBvcnRzUmVmZXJyZXJQb2xpY3ksIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcbnZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbi8qKiBgZmV0Y2hgIGJhc2VkIHRyYW5zcG9ydCAqL1xudmFyIEZldGNoVHJhbnNwb3J0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKEZldGNoVHJhbnNwb3J0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZldGNoVHJhbnNwb3J0KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgLyoqIExvY2tzIHRyYW5zcG9ydCBhZnRlciByZWNlaXZpbmcgNDI5IHJlc3BvbnNlICovXG4gICAgICAgIF90aGlzLl9kaXNhYmxlZFVudGlsID0gbmV3IERhdGUoRGF0ZS5ub3coKSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBGZXRjaFRyYW5zcG9ydC5wcm90b3R5cGUuc2VuZEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChuZXcgRGF0ZShEYXRlLm5vdygpKSA8IHRoaXMuX2Rpc2FibGVkVW50aWwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgIHJlYXNvbjogXCJUcmFuc3BvcnQgbG9ja2VkIHRpbGwgXCIgKyB0aGlzLl9kaXNhYmxlZFVudGlsICsgXCIgZHVlIHRvIHRvbyBtYW55IHJlcXVlc3RzLlwiLFxuICAgICAgICAgICAgICAgIHN0YXR1czogNDI5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlbnRyeVJlcSA9IGV2ZW50VG9TZW50cnlSZXF1ZXN0KGV2ZW50LCB0aGlzLl9hcGkpO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGJvZHk6IHNlbnRyeVJlcS5ib2R5LFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAvLyBEZXNwaXRlIGFsbCBzdGFycyBpbiB0aGUgc2t5IHNheWluZyB0aGF0IEVkZ2Ugc3VwcG9ydHMgb2xkIGRyYWZ0IHN5bnRheCwgYWthICduZXZlcicsICdhbHdheXMnLCAnb3JpZ2luJyBhbmQgJ2RlZmF1bHRcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vI2ZlYXQ9cmVmZXJyZXItcG9saWN5XG4gICAgICAgICAgICAvLyBJdCBkb2Vzbid0LiBBbmQgaXQgdGhyb3cgZXhjZXB0aW9uIGluc3RlYWQgb2YgaWdub3JpbmcgdGhpcyBwYXJhbWV0ZXIuLi5cbiAgICAgICAgICAgIC8vIFJFRjogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9yYXZlbi1qcy9pc3N1ZXMvMTIzM1xuICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6IChzdXBwb3J0c1JlZmVycmVyUG9saWN5KCkgPyAnb3JpZ2luJyA6ICcnKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mZXRjaFBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCB0aGlzLm9wdGlvbnMuZmV0Y2hQYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlYWRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gdGhpcy5vcHRpb25zLmhlYWRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlci5hZGQobmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGdsb2JhbFxuICAgICAgICAgICAgICAgIC5mZXRjaChzZW50cnlSZXEudXJsLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBTdGF0dXMuZnJvbUh0dHBDb2RlKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gU3RhdHVzLlN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHN0YXR1czogc3RhdHVzIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFN0YXR1cy5SYXRlTGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9kaXNhYmxlZFVudGlsID0gbmV3IERhdGUobm93ICsgcGFyc2VSZXRyeUFmdGVySGVhZGVyKG5vdywgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1JldHJ5LUFmdGVyJykpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJUb28gbWFueSByZXF1ZXN0cywgYmFja2luZyBvZmYgdGlsbDogXCIgKyBfdGhpcy5fZGlzYWJsZWRVbnRpbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gRmV0Y2hUcmFuc3BvcnQ7XG59KEJhc2VUcmFuc3BvcnQpKTtcbmV4cG9ydCB7IEZldGNoVHJhbnNwb3J0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZXRjaC5qcy5tYXAiLCJleHBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcbmV4cG9ydCB7IEZldGNoVHJhbnNwb3J0IH0gZnJvbSAnLi9mZXRjaCc7XG5leHBvcnQgeyBYSFJUcmFuc3BvcnQgfSBmcm9tICcuL3hocic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZXZlbnRUb1NlbnRyeVJlcXVlc3QgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIsIHBhcnNlUmV0cnlBZnRlckhlYWRlciwgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IEJhc2VUcmFuc3BvcnQgfSBmcm9tICcuL2Jhc2UnO1xuLyoqIGBYSFJgIGJhc2VkIHRyYW5zcG9ydCAqL1xudmFyIFhIUlRyYW5zcG9ydCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhYSFJUcmFuc3BvcnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gWEhSVHJhbnNwb3J0KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgLyoqIExvY2tzIHRyYW5zcG9ydCBhZnRlciByZWNlaXZpbmcgNDI5IHJlc3BvbnNlICovXG4gICAgICAgIF90aGlzLl9kaXNhYmxlZFVudGlsID0gbmV3IERhdGUoRGF0ZS5ub3coKSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBYSFJUcmFuc3BvcnQucHJvdG90eXBlLnNlbmRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAobmV3IERhdGUoRGF0ZS5ub3coKSkgPCB0aGlzLl9kaXNhYmxlZFVudGlsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICAgICAgICByZWFzb246IFwiVHJhbnNwb3J0IGxvY2tlZCB0aWxsIFwiICsgdGhpcy5fZGlzYWJsZWRVbnRpbCArIFwiIGR1ZSB0byB0b28gbWFueSByZXF1ZXN0cy5cIixcbiAgICAgICAgICAgICAgICBzdGF0dXM6IDQyOSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzZW50cnlSZXEgPSBldmVudFRvU2VudHJ5UmVxdWVzdChldmVudCwgdGhpcy5fYXBpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlci5hZGQobmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IFN0YXR1cy5mcm9tSHR0cENvZGUocmVxdWVzdC5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFN0YXR1cy5TdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBzdGF0dXM6IHN0YXR1cyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBTdGF0dXMuUmF0ZUxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZGlzYWJsZWRVbnRpbCA9IG5ldyBEYXRlKG5vdyArIHBhcnNlUmV0cnlBZnRlckhlYWRlcihub3csIHJlcXVlc3QuZ2V0UmVzcG9uc2VIZWFkZXIoJ1JldHJ5LUFmdGVyJykpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJUb28gbWFueSByZXF1ZXN0cywgYmFja2luZyBvZmYgdGlsbDogXCIgKyBfdGhpcy5fZGlzYWJsZWRVbnRpbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdChyZXF1ZXN0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0Lm9wZW4oJ1BPU1QnLCBzZW50cnlSZXEudXJsKTtcbiAgICAgICAgICAgIGZvciAodmFyIGhlYWRlciBpbiBfdGhpcy5vcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5oZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgX3RoaXMub3B0aW9ucy5oZWFkZXJzW2hlYWRlcl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcXVlc3Quc2VuZChzZW50cnlSZXEuYm9keSk7XG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBYSFJUcmFuc3BvcnQ7XG59KEJhc2VUcmFuc3BvcnQpKTtcbmV4cG9ydCB7IFhIUlRyYW5zcG9ydCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9eGhyLmpzLm1hcCIsImV4cG9ydCB2YXIgU0RLX05BTUUgPSAnc2VudHJ5LmphdmFzY3JpcHQuYnJvd3Nlcic7XG5leHBvcnQgdmFyIFNES19WRVJTSU9OID0gJzUuMTkuMCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCIsImltcG9ydCB7IERzbiwgdXJsRW5jb2RlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG52YXIgU0VOVFJZX0FQSV9WRVJTSU9OID0gJzcnO1xuLyoqIEhlbHBlciBjbGFzcyB0byBwcm92aWRlIHVybHMgdG8gZGlmZmVyZW50IFNlbnRyeSBlbmRwb2ludHMuICovXG52YXIgQVBJID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQVBJICovXG4gICAgZnVuY3Rpb24gQVBJKGRzbikge1xuICAgICAgICB0aGlzLmRzbiA9IGRzbjtcbiAgICAgICAgdGhpcy5fZHNuT2JqZWN0ID0gbmV3IERzbihkc24pO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgRHNuIG9iamVjdC4gKi9cbiAgICBBUEkucHJvdG90eXBlLmdldERzbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rzbk9iamVjdDtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBwcmVmaXggdG8gY29uc3RydWN0IFNlbnRyeSBpbmdlc3Rpb24gQVBJIGVuZHBvaW50cy4gKi9cbiAgICBBUEkucHJvdG90eXBlLmdldEJhc2VBcGlFbmRwb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRzbiA9IHRoaXMuX2Rzbk9iamVjdDtcbiAgICAgICAgdmFyIHByb3RvY29sID0gZHNuLnByb3RvY29sID8gZHNuLnByb3RvY29sICsgXCI6XCIgOiAnJztcbiAgICAgICAgdmFyIHBvcnQgPSBkc24ucG9ydCA/IFwiOlwiICsgZHNuLnBvcnQgOiAnJztcbiAgICAgICAgcmV0dXJuIHByb3RvY29sICsgXCIvL1wiICsgZHNuLmhvc3QgKyBwb3J0ICsgKGRzbi5wYXRoID8gXCIvXCIgKyBkc24ucGF0aCA6ICcnKSArIFwiL2FwaS9cIjtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBzdG9yZSBlbmRwb2ludCBVUkwuICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRTdG9yZUVuZHBvaW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW5nZXN0RW5kcG9pbnQoJ3N0b3JlJyk7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgZW52ZWxvcGUgZW5kcG9pbnQgVVJMLiAqL1xuICAgIEFQSS5wcm90b3R5cGUuX2dldEVudmVsb3BlRW5kcG9pbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRJbmdlc3RFbmRwb2ludCgnZW52ZWxvcGUnKTtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBpbmdlc3QgQVBJIGVuZHBvaW50IGZvciB0YXJnZXQuICovXG4gICAgQVBJLnByb3RvdHlwZS5fZ2V0SW5nZXN0RW5kcG9pbnQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBiYXNlID0gdGhpcy5nZXRCYXNlQXBpRW5kcG9pbnQoKTtcbiAgICAgICAgdmFyIGRzbiA9IHRoaXMuX2Rzbk9iamVjdDtcbiAgICAgICAgcmV0dXJuIFwiXCIgKyBiYXNlICsgZHNuLnByb2plY3RJZCArIFwiL1wiICsgdGFyZ2V0ICsgXCIvXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdG9yZSBlbmRwb2ludCBVUkwgd2l0aCBhdXRoIGluIHRoZSBxdWVyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBTZW5kaW5nIGF1dGggYXMgcGFydCBvZiB0aGUgcXVlcnkgc3RyaW5nIGFuZCBub3QgYXMgY3VzdG9tIEhUVFAgaGVhZGVycyBhdm9pZHMgQ09SUyBwcmVmbGlnaHQgcmVxdWVzdHMuXG4gICAgICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRTdG9yZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdG9yZUVuZHBvaW50KCkgKyBcIj9cIiArIHRoaXMuX2VuY29kZWRBdXRoKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBlbnZlbG9wZSBlbmRwb2ludCBVUkwgd2l0aCBhdXRoIGluIHRoZSBxdWVyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBTZW5kaW5nIGF1dGggYXMgcGFydCBvZiB0aGUgcXVlcnkgc3RyaW5nIGFuZCBub3QgYXMgY3VzdG9tIEhUVFAgaGVhZGVycyBhdm9pZHMgQ09SUyBwcmVmbGlnaHQgcmVxdWVzdHMuXG4gICAgICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRFbnZlbG9wZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RW52ZWxvcGVFbmRwb2ludCgpICsgXCI/XCIgKyB0aGlzLl9lbmNvZGVkQXV0aCgpO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgYSBVUkwtZW5jb2RlZCBzdHJpbmcgd2l0aCBhdXRoIGNvbmZpZyBzdWl0YWJsZSBmb3IgYSBxdWVyeSBzdHJpbmcuICovXG4gICAgQVBJLnByb3RvdHlwZS5fZW5jb2RlZEF1dGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkc24gPSB0aGlzLl9kc25PYmplY3Q7XG4gICAgICAgIHZhciBhdXRoID0ge1xuICAgICAgICAgICAgLy8gV2Ugc2VuZCBvbmx5IHRoZSBtaW5pbXVtIHNldCBvZiByZXF1aXJlZCBpbmZvcm1hdGlvbi4gU2VlXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy8yNTcyLlxuICAgICAgICAgICAgc2VudHJ5X2tleTogZHNuLnVzZXIsXG4gICAgICAgICAgICBzZW50cnlfdmVyc2lvbjogU0VOVFJZX0FQSV9WRVJTSU9OLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGF1dGgpO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgb25seSB0aGUgcGF0aCBjb21wb25lbnQgZm9yIHRoZSBzdG9yZSBlbmRwb2ludC4gKi9cbiAgICBBUEkucHJvdG90eXBlLmdldFN0b3JlRW5kcG9pbnRQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZHNuID0gdGhpcy5fZHNuT2JqZWN0O1xuICAgICAgICByZXR1cm4gKGRzbi5wYXRoID8gXCIvXCIgKyBkc24ucGF0aCA6ICcnKSArIFwiL2FwaS9cIiArIGRzbi5wcm9qZWN0SWQgKyBcIi9zdG9yZS9cIjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gcmVxdWVzdCBoZWFkZXJzLlxuICAgICAqIFRoaXMgaXMgbmVlZGVkIGZvciBub2RlIGFuZCB0aGUgb2xkIC9zdG9yZSBlbmRwb2ludCBpbiBzZW50cnlcbiAgICAgKi9cbiAgICBBUEkucHJvdG90eXBlLmdldFJlcXVlc3RIZWFkZXJzID0gZnVuY3Rpb24gKGNsaWVudE5hbWUsIGNsaWVudFZlcnNpb24pIHtcbiAgICAgICAgdmFyIGRzbiA9IHRoaXMuX2Rzbk9iamVjdDtcbiAgICAgICAgdmFyIGhlYWRlciA9IFtcIlNlbnRyeSBzZW50cnlfdmVyc2lvbj1cIiArIFNFTlRSWV9BUElfVkVSU0lPTl07XG4gICAgICAgIGhlYWRlci5wdXNoKFwic2VudHJ5X2NsaWVudD1cIiArIGNsaWVudE5hbWUgKyBcIi9cIiArIGNsaWVudFZlcnNpb24pO1xuICAgICAgICBoZWFkZXIucHVzaChcInNlbnRyeV9rZXk9XCIgKyBkc24udXNlcik7XG4gICAgICAgIGlmIChkc24ucGFzcykge1xuICAgICAgICAgICAgaGVhZGVyLnB1c2goXCJzZW50cnlfc2VjcmV0PVwiICsgZHNuLnBhc3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ1gtU2VudHJ5LUF1dGgnOiBoZWFkZXIuam9pbignLCAnKSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSB1cmwgdG8gdGhlIHJlcG9ydCBkaWFsb2cgZW5kcG9pbnQuICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRSZXBvcnREaWFsb2dFbmRwb2ludCA9IGZ1bmN0aW9uIChkaWFsb2dPcHRpb25zKSB7XG4gICAgICAgIGlmIChkaWFsb2dPcHRpb25zID09PSB2b2lkIDApIHsgZGlhbG9nT3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBkc24gPSB0aGlzLl9kc25PYmplY3Q7XG4gICAgICAgIHZhciBlbmRwb2ludCA9IHRoaXMuZ2V0QmFzZUFwaUVuZHBvaW50KCkgKyBcImVtYmVkL2Vycm9yLXBhZ2UvXCI7XG4gICAgICAgIHZhciBlbmNvZGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKFwiZHNuPVwiICsgZHNuLnRvU3RyaW5nKCkpO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGlhbG9nT3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3VzZXInKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkaWFsb2dPcHRpb25zLnVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaWFsb2dPcHRpb25zLnVzZXIubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKFwibmFtZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChkaWFsb2dPcHRpb25zLnVzZXIubmFtZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlhbG9nT3B0aW9ucy51c2VyLmVtYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kZWRPcHRpb25zLnB1c2goXCJlbWFpbD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChkaWFsb2dPcHRpb25zLnVzZXIuZW1haWwpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoZGlhbG9nT3B0aW9uc1trZXldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuY29kZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50ICsgXCI/XCIgKyBlbmNvZGVkT3B0aW9ucy5qb2luKCcmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuZHBvaW50O1xuICAgIH07XG4gICAgcmV0dXJuIEFQSTtcbn0oKSk7XG5leHBvcnQgeyBBUEkgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwaS5qcy5tYXAiLCJpbXBvcnQgeyBsb2dnZXIsIFNlbnRyeUVycm9yIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBOb29wVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnRzL25vb3AnO1xuLyoqXG4gKiBUaGlzIGlzIHRoZSBiYXNlIGltcGxlbWVudGlvbiBvZiBhIEJhY2tlbmQuXG4gKiBAaGlkZGVuXG4gKi9cbnZhciBCYXNlQmFja2VuZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKiogQ3JlYXRlcyBhIG5ldyBiYWNrZW5kIGluc3RhbmNlLiAqL1xuICAgIGZ1bmN0aW9uIEJhc2VCYWNrZW5kKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGlmICghdGhpcy5fb3B0aW9ucy5kc24pIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdObyBEU04gcHJvdmlkZWQsIGJhY2tlbmQgd2lsbCBub3QgZG8gYW55dGhpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0ID0gdGhpcy5fc2V0dXBUcmFuc3BvcnQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB1cCB0aGUgdHJhbnNwb3J0IHNvIGl0IGNhbiBiZSB1c2VkIGxhdGVyIHRvIHNlbmQgcmVxdWVzdHMuXG4gICAgICovXG4gICAgQmFzZUJhY2tlbmQucHJvdG90eXBlLl9zZXR1cFRyYW5zcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wVHJhbnNwb3J0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VCYWNrZW5kLnByb3RvdHlwZS5ldmVudEZyb21FeGNlcHRpb24gPSBmdW5jdGlvbiAoX2V4Y2VwdGlvbiwgX2hpbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKCdCYWNrZW5kIGhhcyB0byBpbXBsZW1lbnQgYGV2ZW50RnJvbUV4Y2VwdGlvbmAgbWV0aG9kJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VCYWNrZW5kLnByb3RvdHlwZS5ldmVudEZyb21NZXNzYWdlID0gZnVuY3Rpb24gKF9tZXNzYWdlLCBfbGV2ZWwsIF9oaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignQmFja2VuZCBoYXMgdG8gaW1wbGVtZW50IGBldmVudEZyb21NZXNzYWdlYCBtZXRob2QnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUJhY2tlbmQucHJvdG90eXBlLnNlbmRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQuc2VuZEV2ZW50KGV2ZW50KS50aGVuKG51bGwsIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIHdoaWxlIHNlbmRpbmcgZXZlbnQ6IFwiICsgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VCYWNrZW5kLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQ7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZUJhY2tlbmQ7XG59KCkpO1xuZXhwb3J0IHsgQmFzZUJhY2tlbmQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2ViYWNrZW5kLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IERzbiwgaXNQcmltaXRpdmUsIGlzVGhlbmFibGUsIGxvZ2dlciwgbm9ybWFsaXplLCBTeW5jUHJvbWlzZSwgdGltZXN0YW1wV2l0aE1zLCB0cnVuY2F0ZSwgdXVpZDQsIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBzZXR1cEludGVncmF0aW9ucyB9IGZyb20gJy4vaW50ZWdyYXRpb24nO1xuLyoqXG4gKiBCYXNlIGltcGxlbWVudGF0aW9uIGZvciBhbGwgSmF2YVNjcmlwdCBTREsgY2xpZW50cy5cbiAqXG4gKiBDYWxsIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGJhY2tlbmQgY29uc3RydWN0b3IgYW5kIG9wdGlvbnNcbiAqIHNwZWNpZmljIHRvIHRoZSBjbGllbnQgc3ViY2xhc3MuIFRvIGFjY2VzcyB0aGVzZSBvcHRpb25zIGxhdGVyLCB1c2VcbiAqIHtAbGluayBDbGllbnQuZ2V0T3B0aW9uc30uIEFsc28sIHRoZSBCYWNrZW5kIGluc3RhbmNlIGlzIGF2YWlsYWJsZSB2aWFcbiAqIHtAbGluayBDbGllbnQuZ2V0QmFja2VuZH0uXG4gKlxuICogSWYgYSBEc24gaXMgc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLCBpdCB3aWxsIGJlIHBhcnNlZCBhbmQgc3RvcmVkLiBVc2VcbiAqIHtAbGluayBDbGllbnQuZ2V0RHNufSB0byByZXRyaWV2ZSB0aGUgRHNuIGF0IGFueSBtb21lbnQuIEluIGNhc2UgdGhlIERzbiBpc1xuICogaW52YWxpZCwgdGhlIGNvbnN0cnVjdG9yIHdpbGwgdGhyb3cgYSB7QGxpbmsgU2VudHJ5RXhjZXB0aW9ufS4gTm90ZSB0aGF0XG4gKiB3aXRob3V0IGEgdmFsaWQgRHNuLCB0aGUgU0RLIHdpbGwgbm90IHNlbmQgYW55IGV2ZW50cyB0byBTZW50cnkuXG4gKlxuICogQmVmb3JlIHNlbmRpbmcgYW4gZXZlbnQgdmlhIHRoZSBiYWNrZW5kLCBpdCBpcyBwYXNzZWQgdGhyb3VnaFxuICoge0BsaW5rIEJhc2VDbGllbnQucHJlcGFyZUV2ZW50fSB0byBhZGQgU0RLIGluZm9ybWF0aW9uIGFuZCBzY29wZSBkYXRhXG4gKiAoYnJlYWRjcnVtYnMgYW5kIGNvbnRleHQpLiBUbyBhZGQgbW9yZSBjdXN0b20gaW5mb3JtYXRpb24sIG92ZXJyaWRlIHRoaXNcbiAqIG1ldGhvZCBhbmQgZXh0ZW5kIHRoZSByZXN1bHRpbmcgcHJlcGFyZWQgZXZlbnQuXG4gKlxuICogVG8gaXNzdWUgYXV0b21hdGljYWxseSBjcmVhdGVkIGV2ZW50cyAoZS5nLiB2aWEgaW5zdHJ1bWVudGF0aW9uKSwgdXNlXG4gKiB7QGxpbmsgQ2xpZW50LmNhcHR1cmVFdmVudH0uIEl0IHdpbGwgcHJlcGFyZSB0aGUgZXZlbnQgYW5kIHBhc3MgaXQgdGhyb3VnaFxuICogdGhlIGNhbGxiYWNrIGxpZmVjeWNsZS4gVG8gaXNzdWUgYXV0by1icmVhZGNydW1icywgdXNlXG4gKiB7QGxpbmsgQ2xpZW50LmFkZEJyZWFkY3J1bWJ9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBOb2RlQ2xpZW50IGV4dGVuZHMgQmFzZUNsaWVudDxOb2RlQmFja2VuZCwgTm9kZU9wdGlvbnM+IHtcbiAqICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE5vZGVPcHRpb25zKSB7XG4gKiAgICAgc3VwZXIoTm9kZUJhY2tlbmQsIG9wdGlvbnMpO1xuICogICB9XG4gKlxuICogICAvLyAuLi5cbiAqIH1cbiAqL1xudmFyIEJhc2VDbGllbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgdGhpcyBjbGllbnQgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmFja2VuZENsYXNzIEEgY29uc3RydWN0b3IgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBiYWNrZW5kLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBjbGllbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gQmFzZUNsaWVudChiYWNrZW5kQ2xhc3MsIG9wdGlvbnMpIHtcbiAgICAgICAgLyoqIEFycmF5IG9mIHVzZWQgaW50ZWdyYXRpb25zLiAqL1xuICAgICAgICB0aGlzLl9pbnRlZ3JhdGlvbnMgPSB7fTtcbiAgICAgICAgLyoqIElzIHRoZSBjbGllbnQgc3RpbGwgcHJvY2Vzc2luZyBhIGNhbGw/ICovXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYmFja2VuZCA9IG5ldyBiYWNrZW5kQ2xhc3Mob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBpZiAob3B0aW9ucy5kc24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RzbiA9IG5ldyBEc24ob3B0aW9ucy5kc24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuY2FwdHVyZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChleGNlcHRpb24sIGhpbnQsIHNjb3BlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBldmVudElkID0gaGludCAmJiBoaW50LmV2ZW50X2lkO1xuICAgICAgICB0aGlzLl9wcm9jZXNzaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZ2V0QmFja2VuZCgpXG4gICAgICAgICAgICAuZXZlbnRGcm9tRXhjZXB0aW9uKGV4Y2VwdGlvbiwgaGludClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnRJZCA9IF90aGlzLmNhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV2ZW50SWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmNhcHR1cmVNZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGxldmVsLCBoaW50LCBzY29wZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZXZlbnRJZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgIHZhciBwcm9taXNlZEV2ZW50ID0gaXNQcmltaXRpdmUobWVzc2FnZSlcbiAgICAgICAgICAgID8gdGhpcy5fZ2V0QmFja2VuZCgpLmV2ZW50RnJvbU1lc3NhZ2UoXCJcIiArIG1lc3NhZ2UsIGxldmVsLCBoaW50KVxuICAgICAgICAgICAgOiB0aGlzLl9nZXRCYWNrZW5kKCkuZXZlbnRGcm9tRXhjZXB0aW9uKG1lc3NhZ2UsIGhpbnQpO1xuICAgICAgICBwcm9taXNlZEV2ZW50LnRoZW4oZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudElkID0gX3RoaXMuY2FwdHVyZUV2ZW50KGV2ZW50LCBoaW50LCBzY29wZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXZlbnRJZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuY2FwdHVyZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBoaW50LCBzY29wZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZXZlbnRJZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NFdmVudChldmVudCwgaGludCwgc2NvcGUpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZmluYWxFdmVudCkge1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBmb3IgZmluYWxFdmVudCBpbiBjYXNlIGJlZm9yZVNlbmQgcmV0dXJuZWQgbnVsbFxuICAgICAgICAgICAgZXZlbnRJZCA9IGZpbmFsRXZlbnQgJiYgZmluYWxFdmVudC5ldmVudF9pZDtcbiAgICAgICAgICAgIF90aGlzLl9wcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihudWxsLCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IocmVhc29uKTtcbiAgICAgICAgICAgIF90aGlzLl9wcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXZlbnRJZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuZ2V0RHNuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHNuO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAodGltZW91dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5faXNDbGllbnRQcm9jZXNzaW5nKHRpbWVvdXQpLnRoZW4oZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChzdGF0dXMuaW50ZXJ2YWwpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9nZXRCYWNrZW5kKClcbiAgICAgICAgICAgICAgICAuZ2V0VHJhbnNwb3J0KClcbiAgICAgICAgICAgICAgICAuY2xvc2UodGltZW91dClcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodHJhbnNwb3J0Rmx1c2hlZCkgeyByZXR1cm4gc3RhdHVzLnJlYWR5ICYmIHRyYW5zcG9ydEZsdXNoZWQ7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAodGltZW91dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5mbHVzaCh0aW1lb3V0KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIF90aGlzLmdldE9wdGlvbnMoKS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgdXAgdGhlIGludGVncmF0aW9uc1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLnNldHVwSW50ZWdyYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5faXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2ludGVncmF0aW9ucyA9IHNldHVwSW50ZWdyYXRpb25zKHRoaXMuX29wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmdldEludGVncmF0aW9uID0gZnVuY3Rpb24gKGludGVncmF0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW50ZWdyYXRpb25zW2ludGVncmF0aW9uLmlkXSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfb08pIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQ2Fubm90IHJldHJpZXZlIGludGVncmF0aW9uIFwiICsgaW50ZWdyYXRpb24uaWQgKyBcIiBmcm9tIHRoZSBjdXJyZW50IENsaWVudFwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogV2FpdHMgZm9yIHRoZSBjbGllbnQgdG8gYmUgZG9uZSB3aXRoIHByb2Nlc3NpbmcuICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX2lzQ2xpZW50UHJvY2Vzc2luZyA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHZhciB0aWNrZWQgPSAwO1xuICAgICAgICAgICAgdmFyIHRpY2sgPSAxO1xuICAgICAgICAgICAgdmFyIGludGVydmFsID0gMDtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfdGhpcy5fcHJvY2Vzc2luZykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsOiBpbnRlcnZhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2tlZCArPSB0aWNrO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dCAmJiB0aWNrZWQgPj0gdGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWw6IGludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGljayk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgYmFja2VuZC4gKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fZ2V0QmFja2VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JhY2tlbmQ7XG4gICAgfTtcbiAgICAvKiogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgU0RLIGlzIGVuYWJsZWQgYW5kIGEgdmFsaWQgRHNuIGlzIHByZXNlbnQuICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX2lzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9ucygpLmVuYWJsZWQgIT09IGZhbHNlICYmIHRoaXMuX2RzbiAhPT0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBjb21tb24gaW5mb3JtYXRpb24gdG8gZXZlbnRzLlxuICAgICAqXG4gICAgICogVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIHJlbGVhc2UgYW5kIGVudmlyb25tZW50IGZyb20gYG9wdGlvbnNgLFxuICAgICAqIGJyZWFkY3J1bWJzIGFuZCBjb250ZXh0IChleHRyYSwgdGFncyBhbmQgdXNlcikgZnJvbSB0aGUgc2NvcGUuXG4gICAgICpcbiAgICAgKiBJbmZvcm1hdGlvbiB0aGF0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgZXZlbnQgaXMgbmV2ZXIgb3ZlcndyaXR0ZW4uIEZvclxuICAgICAqIG5lc3RlZCBvYmplY3RzLCBzdWNoIGFzIHRoZSBjb250ZXh0LCBrZXlzIGFyZSBtZXJnZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50LlxuICAgICAqIEBwYXJhbSBoaW50IE1heSBjb250YWluIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi5cbiAgICAgKiBAcGFyYW0gc2NvcGUgQSBzY29wZSBjb250YWluaW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IGV2ZW50IHdpdGggbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fcHJlcGFyZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBzY29wZSwgaGludCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE9wdGlvbnMoKS5ub3JtYWxpemVEZXB0aCwgbm9ybWFsaXplRGVwdGggPSBfYSA9PT0gdm9pZCAwID8gMyA6IF9hO1xuICAgICAgICB2YXIgcHJlcGFyZWQgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCBldmVudCwgeyBldmVudF9pZDogZXZlbnQuZXZlbnRfaWQgfHwgKGhpbnQgJiYgaGludC5ldmVudF9pZCA/IGhpbnQuZXZlbnRfaWQgOiB1dWlkNCgpKSwgdGltZXN0YW1wOiBldmVudC50aW1lc3RhbXAgfHwgdGltZXN0YW1wV2l0aE1zKCkgfSk7XG4gICAgICAgIHRoaXMuX2FwcGx5Q2xpZW50T3B0aW9ucyhwcmVwYXJlZCk7XG4gICAgICAgIHRoaXMuX2FwcGx5SW50ZWdyYXRpb25zTWV0YWRhdGEocHJlcGFyZWQpO1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIHNjb3BlIGdpdmVuIHRvIHVzLCB1c2UgaXQgYXMgdGhlIGJhc2UgZm9yIGZ1cnRoZXIgbW9kaWZpY2F0aW9ucy5cbiAgICAgICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBjb3B5aW5nIG9mIGRhdGEgaWYgYGNhcHR1cmVDb250ZXh0YCBpcyBub3QgcHJvdmlkZWQuXG4gICAgICAgIHZhciBmaW5hbFNjb3BlID0gc2NvcGU7XG4gICAgICAgIGlmIChoaW50ICYmIGhpbnQuY2FwdHVyZUNvbnRleHQpIHtcbiAgICAgICAgICAgIGZpbmFsU2NvcGUgPSBTY29wZS5jbG9uZShmaW5hbFNjb3BlKS51cGRhdGUoaGludC5jYXB0dXJlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgcHJlcGFyZSB0aGUgcmVzdWx0IGhlcmUgd2l0aCBhIHJlc29sdmVkIEV2ZW50LlxuICAgICAgICB2YXIgcmVzdWx0ID0gU3luY1Byb21pc2UucmVzb2x2ZShwcmVwYXJlZCk7XG4gICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIGNhbGxlZCwgc2luY2Ugd2Ugd2FudCB0aGF0XG4gICAgICAgIC8vIHtAbGluayBIdWIuYWRkRXZlbnRQcm9jZXNzb3J9IGdldHMgdGhlIGZpbmlzaGVkIHByZXBhcmVkIGV2ZW50LlxuICAgICAgICBpZiAoZmluYWxTY29wZSkge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSB3ZSBoYXZlIGEgaHViIHdlIHJlYXNzaWduIGl0LlxuICAgICAgICAgICAgcmVzdWx0ID0gZmluYWxTY29wZS5hcHBseVRvRXZlbnQocHJlcGFyZWQsIGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudGhlbihmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub3JtYWxpemVEZXB0aCA9PT0gJ251bWJlcicgJiYgbm9ybWFsaXplRGVwdGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9ub3JtYWxpemVFdmVudChldnQsIG5vcm1hbGl6ZURlcHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldnQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBgbm9ybWFsaXplYCBmdW5jdGlvbiBvbiBuZWNlc3NhcnkgYEV2ZW50YCBhdHRyaWJ1dGVzIHRvIG1ha2UgdGhlbSBzYWZlIGZvciBzZXJpYWxpemF0aW9uLlxuICAgICAqIE5vcm1hbGl6ZWQga2V5czpcbiAgICAgKiAtIGBicmVhZGNydW1icy5kYXRhYFxuICAgICAqIC0gYHVzZXJgXG4gICAgICogLSBgY29udGV4dHNgXG4gICAgICogLSBgZXh0cmFgXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50XG4gICAgICogQHJldHVybnMgTm9ybWFsaXplZCBldmVudFxuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLl9ub3JtYWxpemVFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgZGVwdGgpIHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6bm8tdW5zYWZlLWFueVxuICAgICAgICB2YXIgbm9ybWFsaXplZCA9IHRzbGliXzEuX19hc3NpZ24oe30sIGV2ZW50LCAoZXZlbnQuYnJlYWRjcnVtYnMgJiYge1xuICAgICAgICAgICAgYnJlYWRjcnVtYnM6IGV2ZW50LmJyZWFkY3J1bWJzLm1hcChmdW5jdGlvbiAoYikgeyByZXR1cm4gKHRzbGliXzEuX19hc3NpZ24oe30sIGIsIChiLmRhdGEgJiYge1xuICAgICAgICAgICAgICAgIGRhdGE6IG5vcm1hbGl6ZShiLmRhdGEsIGRlcHRoKSxcbiAgICAgICAgICAgIH0pKSk7IH0pLFxuICAgICAgICB9KSwgKGV2ZW50LnVzZXIgJiYge1xuICAgICAgICAgICAgdXNlcjogbm9ybWFsaXplKGV2ZW50LnVzZXIsIGRlcHRoKSxcbiAgICAgICAgfSksIChldmVudC5jb250ZXh0cyAmJiB7XG4gICAgICAgICAgICBjb250ZXh0czogbm9ybWFsaXplKGV2ZW50LmNvbnRleHRzLCBkZXB0aCksXG4gICAgICAgIH0pLCAoZXZlbnQuZXh0cmEgJiYge1xuICAgICAgICAgICAgZXh0cmE6IG5vcm1hbGl6ZShldmVudC5leHRyYSwgZGVwdGgpLFxuICAgICAgICB9KSk7XG4gICAgICAgIC8vIGV2ZW50LmNvbnRleHRzLnRyYWNlIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhIFRyYW5zYWN0aW9uLiBTaW1pbGFybHksXG4gICAgICAgIC8vIGV2ZW50LnNwYW5zW10gc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGNoaWxkIFNwYW5zLiBHaXZlbiB0aGF0IGFcbiAgICAgICAgLy8gVHJhbnNhY3Rpb24gaXMgY29uY2VwdHVhbGx5IGEgU3Bhbiwgbm9ybWFsaXphdGlvbiBzaG91bGQgYXBwbHkgdG8gYm90aFxuICAgICAgICAvLyBUcmFuc2FjdGlvbnMgYW5kIFNwYW5zIGNvbnNpc3RlbnRseS5cbiAgICAgICAgLy8gRm9yIG5vdyB0aGUgZGVjaXNpb24gaXMgdG8gc2tpcCBub3JtYWxpemF0aW9uIG9mIFRyYW5zYWN0aW9ucyBhbmQgU3BhbnMsXG4gICAgICAgIC8vIHNvIHRoaXMgYmxvY2sgb3ZlcndyaXRlcyB0aGUgbm9ybWFsaXplZCBldmVudCB0byBhZGQgYmFjayB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gVHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gcHJpb3IgdG8gbm9ybWFsaXphdGlvbi5cbiAgICAgICAgaWYgKGV2ZW50LmNvbnRleHRzICYmIGV2ZW50LmNvbnRleHRzLnRyYWNlKSB7XG4gICAgICAgICAgICBub3JtYWxpemVkLmNvbnRleHRzLnRyYWNlID0gZXZlbnQuY29udGV4dHMudHJhY2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiAgRW5oYW5jZXMgZXZlbnQgdXNpbmcgdGhlIGNsaWVudCBjb25maWd1cmF0aW9uLlxuICAgICAqICBJdCB0YWtlcyBjYXJlIG9mIGFsbCBcInN0YXRpY1wiIHZhbHVlcyBsaWtlIGVudmlyb25tZW50LCByZWxlYXNlIGFuZCBgZGlzdGAsXG4gICAgICogIGFzIHdlbGwgYXMgdHJ1bmNhdGluZyBvdmVybHkgbG9uZyB2YWx1ZXMuXG4gICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IGluc3RhbmNlIHRvIGJlIGVuaGFuY2VkXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX2FwcGx5Q2xpZW50T3B0aW9ucyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE9wdGlvbnMoKSwgZW52aXJvbm1lbnQgPSBfYS5lbnZpcm9ubWVudCwgcmVsZWFzZSA9IF9hLnJlbGVhc2UsIGRpc3QgPSBfYS5kaXN0LCBfYiA9IF9hLm1heFZhbHVlTGVuZ3RoLCBtYXhWYWx1ZUxlbmd0aCA9IF9iID09PSB2b2lkIDAgPyAyNTAgOiBfYjtcbiAgICAgICAgaWYgKGV2ZW50LmVudmlyb25tZW50ID09PSB1bmRlZmluZWQgJiYgZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXZlbnQuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQucmVsZWFzZSA9PT0gdW5kZWZpbmVkICYmIHJlbGVhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXZlbnQucmVsZWFzZSA9IHJlbGVhc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmRpc3QgPT09IHVuZGVmaW5lZCAmJiBkaXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV2ZW50LmRpc3QgPSBkaXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5tZXNzYWdlKSB7XG4gICAgICAgICAgICBldmVudC5tZXNzYWdlID0gdHJ1bmNhdGUoZXZlbnQubWVzc2FnZSwgbWF4VmFsdWVMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBleGNlcHRpb24gPSBldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdO1xuICAgICAgICBpZiAoZXhjZXB0aW9uICYmIGV4Y2VwdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgZXhjZXB0aW9uLnZhbHVlID0gdHJ1bmNhdGUoZXhjZXB0aW9uLnZhbHVlLCBtYXhWYWx1ZUxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlcXVlc3QgPSBldmVudC5yZXF1ZXN0O1xuICAgICAgICBpZiAocmVxdWVzdCAmJiByZXF1ZXN0LnVybCkge1xuICAgICAgICAgICAgcmVxdWVzdC51cmwgPSB0cnVuY2F0ZShyZXF1ZXN0LnVybCwgbWF4VmFsdWVMZW5ndGgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYWxsIHVzZWQgaW50ZWdyYXRpb25zIHRvIHRoZSBTREsgaW5mbyBpbiB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHNka0luZm8gVGhlIHNka0luZm8gb2YgdGhlIGV2ZW50IHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBhbGwgaW50ZWdyYXRpb25zLlxuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLl9hcHBseUludGVncmF0aW9uc01ldGFkYXRhID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBzZGtJbmZvID0gZXZlbnQuc2RrO1xuICAgICAgICB2YXIgaW50ZWdyYXRpb25zQXJyYXkgPSBPYmplY3Qua2V5cyh0aGlzLl9pbnRlZ3JhdGlvbnMpO1xuICAgICAgICBpZiAoc2RrSW5mbyAmJiBpbnRlZ3JhdGlvbnNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZGtJbmZvLmludGVncmF0aW9ucyA9IGludGVncmF0aW9uc0FycmF5O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUZWxscyB0aGUgYmFja2VuZCB0byBzZW5kIHRoaXMgZXZlbnRcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIFNlbnRyeSBldmVudCB0byBzZW5kXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX3NlbmRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB0aGlzLl9nZXRCYWNrZW5kKCkuc2VuZEV2ZW50KGV2ZW50KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBldmVudCAoZWl0aGVyIGVycm9yIG9yIG1lc3NhZ2UpIGFuZCBzZW5kcyBpdCB0byBTZW50cnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGFsc28gYWRkcyBicmVhZGNydW1icyBhbmQgY29udGV4dCBpbmZvcm1hdGlvbiB0byB0aGUgZXZlbnQuIEhvd2V2ZXIsXG4gICAgICogcGxhdGZvcm0gc3BlY2lmaWMgbWV0YSBkYXRhIChzdWNoIGFzIHRoZSBVc2VyJ3MgSVAgYWRkcmVzcykgbXVzdCBiZSBhZGRlZFxuICAgICAqIGJ5IHRoZSBTREsgaW1wbGVtZW50b3IuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCB0byBTZW50cnkuXG4gICAgICogQHBhcmFtIGhpbnQgTWF5IGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLlxuICAgICAqIEBwYXJhbSBzY29wZSBBIHNjb3BlIGNvbnRhaW5pbmcgZXZlbnQgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMgQSBTeW5jUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGV2ZW50IG9yIHJlamVjdHMgaW4gY2FzZSBldmVudCB3YXMvd2lsbCBub3QgYmUgc2VuZC5cbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fcHJvY2Vzc0V2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBoaW50LCBzY29wZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE9wdGlvbnMoKSwgYmVmb3JlU2VuZCA9IF9hLmJlZm9yZVNlbmQsIHNhbXBsZVJhdGUgPSBfYS5zYW1wbGVSYXRlO1xuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KCdTREsgbm90IGVuYWJsZWQsIHdpbGwgbm90IHNlbmQgZXZlbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlzVHJhbnNhY3Rpb24gPSBldmVudC50eXBlID09PSAndHJhbnNhY3Rpb24nO1xuICAgICAgICAvLyAxLjAgPT09IDEwMCUgZXZlbnRzIGFyZSBzZW50XG4gICAgICAgIC8vIDAuMCA9PT0gMCUgZXZlbnRzIGFyZSBzZW50XG4gICAgICAgIC8vIFNhbXBsaW5nIGZvciB0cmFuc2FjdGlvbiBoYXBwZW5zIHNvbWV3aGVyZSBlbHNlXG4gICAgICAgIGlmICghaXNUcmFuc2FjdGlvbiAmJiB0eXBlb2Ygc2FtcGxlUmF0ZSA9PT0gJ251bWJlcicgJiYgTWF0aC5yYW5kb20oKSA+IHNhbXBsZVJhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZWplY3QoJ1RoaXMgZXZlbnQgaGFzIGJlZW4gc2FtcGxlZCwgd2lsbCBub3Qgc2VuZCBldmVudC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIF90aGlzLl9wcmVwYXJlRXZlbnQoZXZlbnQsIHNjb3BlLCBoaW50KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChwcmVwYXJlZCkge1xuICAgICAgICAgICAgICAgIGlmIChwcmVwYXJlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0FuIGV2ZW50IHByb2Nlc3NvciByZXR1cm5lZCBudWxsLCB3aWxsIG5vdCBzZW5kIGV2ZW50LicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBmaW5hbEV2ZW50ID0gcHJlcGFyZWQ7XG4gICAgICAgICAgICAgICAgdmFyIGlzSW50ZXJuYWxFeGNlcHRpb24gPSBoaW50ICYmIGhpbnQuZGF0YSAmJiBoaW50LmRhdGEuX19zZW50cnlfXyA9PT0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyBXZSBza2lwIGJlZm9yZVNlbmQgaW4gY2FzZSBvZiB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgICAgICBpZiAoaXNJbnRlcm5hbEV4Y2VwdGlvbiB8fCAhYmVmb3JlU2VuZCB8fCBpc1RyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9zZW5kRXZlbnQoZmluYWxFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmluYWxFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJlZm9yZVNlbmRSZXN1bHQgPSBiZWZvcmVTZW5kKHByZXBhcmVkLCBoaW50KTtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYmVmb3JlU2VuZFJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdgYmVmb3JlU2VuZGAgbWV0aG9kIGhhcyB0byByZXR1cm4gYG51bGxgIG9yIGEgdmFsaWQgZXZlbnQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzVGhlbmFibGUoYmVmb3JlU2VuZFJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2hhbmRsZUFzeW5jQmVmb3JlU2VuZChiZWZvcmVTZW5kUmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxFdmVudCA9IGJlZm9yZVNlbmRSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbEV2ZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKCdgYmVmb3JlU2VuZGAgcmV0dXJuZWQgYG51bGxgLCB3aWxsIG5vdCBzZW5kIGV2ZW50LicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIGhlcmUgb24gd2UgYXJlIHJlYWxseSBhc3luY1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fc2VuZEV2ZW50KGZpbmFsRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZpbmFsRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4obnVsbCwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIF90aGlzLmNhcHR1cmVFeGNlcHRpb24ocmVhc29uLCB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fc2VudHJ5X186IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiByZWFzb24sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KFwiRXZlbnQgcHJvY2Vzc2luZyBwaXBlbGluZSB0aHJldyBhbiBlcnJvciwgb3JpZ2luYWwgZXZlbnQgd2lsbCBub3QgYmUgc2VudC4gRGV0YWlscyBoYXZlIGJlZW4gc2VudCBhcyBhIG5ldyBldmVudC5cXG5SZWFzb246IFwiICsgcmVhc29uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIGJlZm9yZSBzZW5kIFByb21pc2UgYW5kIGNhbGxzIHJlc29sdmUvcmVqZWN0IG9uIHBhcmVudCBTeW5jUHJvbWlzZS5cbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5faGFuZGxlQXN5bmNCZWZvcmVTZW5kID0gZnVuY3Rpb24gKGJlZm9yZVNlbmQsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBiZWZvcmVTZW5kXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocHJvY2Vzc2VkRXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzZWRFdmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlamVjdCgnYGJlZm9yZVNlbmRgIHJldHVybmVkIGBudWxsYCwgd2lsbCBub3Qgc2VuZCBldmVudC4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGcm9tIGhlcmUgb24gd2UgYXJlIHJlYWxseSBhc3luY1xuICAgICAgICAgICAgX3RoaXMuX3NlbmRFdmVudChwcm9jZXNzZWRFdmVudCk7XG4gICAgICAgICAgICByZXNvbHZlKHByb2Nlc3NlZEV2ZW50KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKG51bGwsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZWplY3QoXCJiZWZvcmVTZW5kIHJlamVjdGVkIHdpdGggXCIgKyBlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZUNsaWVudDtcbn0oKSk7XG5leHBvcnQgeyBCYXNlQ2xpZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlY2xpZW50LmpzLm1hcCIsImV4cG9ydCB7IGFkZEJyZWFkY3J1bWIsIGNhcHR1cmVFeGNlcHRpb24sIGNhcHR1cmVFdmVudCwgY2FwdHVyZU1lc3NhZ2UsIGNvbmZpZ3VyZVNjb3BlLCBzdGFydFRyYW5zYWN0aW9uLCBzZXRDb250ZXh0LCBzZXRFeHRyYSwgc2V0RXh0cmFzLCBzZXRUYWcsIHNldFRhZ3MsIHNldFVzZXIsIHdpdGhTY29wZSwgfSBmcm9tICdAc2VudHJ5L21pbmltYWwnO1xuZXhwb3J0IHsgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIsIGdldEh1YkZyb21DYXJyaWVyLCBIdWIsIG1ha2VNYWluLCBTY29wZSB9IGZyb20gJ0BzZW50cnkvaHViJztcbmV4cG9ydCB7IEFQSSB9IGZyb20gJy4vYXBpJztcbmV4cG9ydCB7IEJhc2VDbGllbnQgfSBmcm9tICcuL2Jhc2VjbGllbnQnO1xuZXhwb3J0IHsgQmFzZUJhY2tlbmQgfSBmcm9tICcuL2Jhc2ViYWNrZW5kJztcbmV4cG9ydCB7IGV2ZW50VG9TZW50cnlSZXF1ZXN0IH0gZnJvbSAnLi9yZXF1ZXN0JztcbmV4cG9ydCB7IGluaXRBbmRCaW5kIH0gZnJvbSAnLi9zZGsnO1xuZXhwb3J0IHsgTm9vcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0cy9ub29wJztcbmltcG9ydCAqIGFzIEludGVncmF0aW9ucyBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5leHBvcnQgeyBJbnRlZ3JhdGlvbnMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuZXhwb3J0IHZhciBpbnN0YWxsZWRJbnRlZ3JhdGlvbnMgPSBbXTtcbi8qKiBHZXRzIGludGVncmF0aW9uIHRvIGluc3RhbGwgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlZ3JhdGlvbnNUb1NldHVwKG9wdGlvbnMpIHtcbiAgICB2YXIgZGVmYXVsdEludGVncmF0aW9ucyA9IChvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMgJiYgdHNsaWJfMS5fX3NwcmVhZChvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMpKSB8fCBbXTtcbiAgICB2YXIgdXNlckludGVncmF0aW9ucyA9IG9wdGlvbnMuaW50ZWdyYXRpb25zO1xuICAgIHZhciBpbnRlZ3JhdGlvbnMgPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh1c2VySW50ZWdyYXRpb25zKSkge1xuICAgICAgICB2YXIgdXNlckludGVncmF0aW9uc05hbWVzXzEgPSB1c2VySW50ZWdyYXRpb25zLm1hcChmdW5jdGlvbiAoaSkgeyByZXR1cm4gaS5uYW1lOyB9KTtcbiAgICAgICAgdmFyIHBpY2tlZEludGVncmF0aW9uc05hbWVzXzEgPSBbXTtcbiAgICAgICAgLy8gTGVhdmUgb25seSB1bmlxdWUgZGVmYXVsdCBpbnRlZ3JhdGlvbnMsIHRoYXQgd2VyZSBub3Qgb3ZlcnJpZGRlbiB3aXRoIHByb3ZpZGVkIHVzZXIgaW50ZWdyYXRpb25zXG4gICAgICAgIGRlZmF1bHRJbnRlZ3JhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoZGVmYXVsdEludGVncmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAodXNlckludGVncmF0aW9uc05hbWVzXzEuaW5kZXhPZihkZWZhdWx0SW50ZWdyYXRpb24ubmFtZSkgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgcGlja2VkSW50ZWdyYXRpb25zTmFtZXNfMS5pbmRleE9mKGRlZmF1bHRJbnRlZ3JhdGlvbi5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvbnMucHVzaChkZWZhdWx0SW50ZWdyYXRpb24pO1xuICAgICAgICAgICAgICAgIHBpY2tlZEludGVncmF0aW9uc05hbWVzXzEucHVzaChkZWZhdWx0SW50ZWdyYXRpb24ubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBEb24ndCBhZGQgc2FtZSB1c2VyIGludGVncmF0aW9uIHR3aWNlXG4gICAgICAgIHVzZXJJbnRlZ3JhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAodXNlckludGVncmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAocGlja2VkSW50ZWdyYXRpb25zTmFtZXNfMS5pbmRleE9mKHVzZXJJbnRlZ3JhdGlvbi5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvbnMucHVzaCh1c2VySW50ZWdyYXRpb24pO1xuICAgICAgICAgICAgICAgIHBpY2tlZEludGVncmF0aW9uc05hbWVzXzEucHVzaCh1c2VySW50ZWdyYXRpb24ubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdXNlckludGVncmF0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnRlZ3JhdGlvbnMgPSB1c2VySW50ZWdyYXRpb25zKGRlZmF1bHRJbnRlZ3JhdGlvbnMpO1xuICAgICAgICBpbnRlZ3JhdGlvbnMgPSBBcnJheS5pc0FycmF5KGludGVncmF0aW9ucykgPyBpbnRlZ3JhdGlvbnMgOiBbaW50ZWdyYXRpb25zXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGludGVncmF0aW9ucyA9IHRzbGliXzEuX19zcHJlYWQoZGVmYXVsdEludGVncmF0aW9ucyk7XG4gICAgfVxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGlmIHByZXNlbnQsIGBEZWJ1Z2AgaW50ZWdyYXRpb24gd2lsbCBhbHdheXMgcnVuIGxhc3RcbiAgICB2YXIgaW50ZWdyYXRpb25zTmFtZXMgPSBpbnRlZ3JhdGlvbnMubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBpLm5hbWU7IH0pO1xuICAgIHZhciBhbHdheXNMYXN0VG9SdW4gPSAnRGVidWcnO1xuICAgIGlmIChpbnRlZ3JhdGlvbnNOYW1lcy5pbmRleE9mKGFsd2F5c0xhc3RUb1J1bikgIT09IC0xKSB7XG4gICAgICAgIGludGVncmF0aW9ucy5wdXNoLmFwcGx5KGludGVncmF0aW9ucywgdHNsaWJfMS5fX3NwcmVhZChpbnRlZ3JhdGlvbnMuc3BsaWNlKGludGVncmF0aW9uc05hbWVzLmluZGV4T2YoYWx3YXlzTGFzdFRvUnVuKSwgMSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGludGVncmF0aW9ucztcbn1cbi8qKiBTZXR1cCBnaXZlbiBpbnRlZ3JhdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW50ZWdyYXRpb24oaW50ZWdyYXRpb24pIHtcbiAgICBpZiAoaW5zdGFsbGVkSW50ZWdyYXRpb25zLmluZGV4T2YoaW50ZWdyYXRpb24ubmFtZSkgIT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW50ZWdyYXRpb24uc2V0dXBPbmNlKGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViKTtcbiAgICBpbnN0YWxsZWRJbnRlZ3JhdGlvbnMucHVzaChpbnRlZ3JhdGlvbi5uYW1lKTtcbiAgICBsb2dnZXIubG9nKFwiSW50ZWdyYXRpb24gaW5zdGFsbGVkOiBcIiArIGludGVncmF0aW9uLm5hbWUpO1xufVxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgaW50ZWdyYXRpb24gaW5zdGFuY2VzIHRoaXMgaW5zdGFsbHMgdGhlbSBhbGwuIFdoZW4gYHdpdGhEZWZhdWx0c2AgaXMgc2V0IHRvIGB0cnVlYCB0aGVuIGFsbCBkZWZhdWx0XG4gKiBpbnRlZ3JhdGlvbnMgYXJlIGFkZGVkIHVubGVzcyB0aGV5IHdlcmUgYWxyZWFkeSBwcm92aWRlZCBiZWZvcmUuXG4gKiBAcGFyYW0gaW50ZWdyYXRpb25zIGFycmF5IG9mIGludGVncmF0aW9uIGluc3RhbmNlc1xuICogQHBhcmFtIHdpdGhEZWZhdWx0IHNob3VsZCBlbmFibGUgZGVmYXVsdCBpbnRlZ3JhdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW50ZWdyYXRpb25zKG9wdGlvbnMpIHtcbiAgICB2YXIgaW50ZWdyYXRpb25zID0ge307XG4gICAgZ2V0SW50ZWdyYXRpb25zVG9TZXR1cChvcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlZ3JhdGlvbikge1xuICAgICAgICBpbnRlZ3JhdGlvbnNbaW50ZWdyYXRpb24ubmFtZV0gPSBpbnRlZ3JhdGlvbjtcbiAgICAgICAgc2V0dXBJbnRlZ3JhdGlvbihpbnRlZ3JhdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGludGVncmF0aW9ucztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVncmF0aW9uLmpzLm1hcCIsInZhciBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmc7XG4vKiogUGF0Y2ggdG9TdHJpbmcgY2FsbHMgdG8gcmV0dXJuIHByb3BlciBuYW1lIGZvciB3cmFwcGVkIGZ1bmN0aW9ucyAqL1xudmFyIEZ1bmN0aW9uVG9TdHJpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRnVuY3Rpb25Ub1N0cmluZygpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5hbWUgPSBGdW5jdGlvblRvU3RyaW5nLmlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEZ1bmN0aW9uVG9TdHJpbmcucHJvdG90eXBlLnNldHVwT25jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgICAgICBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX19zZW50cnlfb3JpZ2luYWxfXyB8fCB0aGlzO1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVuc2FmZS1hbnlcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEZ1bmN0aW9uVG9TdHJpbmcuaWQgPSAnRnVuY3Rpb25Ub1N0cmluZyc7XG4gICAgcmV0dXJuIEZ1bmN0aW9uVG9TdHJpbmc7XG59KCkpO1xuZXhwb3J0IHsgRnVuY3Rpb25Ub1N0cmluZyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnVuY3Rpb250b3N0cmluZy5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBnZXRFdmVudERlc2NyaXB0aW9uLCBpc01hdGNoaW5nUGF0dGVybiwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG4vLyBcIlNjcmlwdCBlcnJvci5cIiBpcyBoYXJkIGNvZGVkIGludG8gYnJvd3NlcnMgZm9yIGVycm9ycyB0aGF0IGl0IGNhbid0IHJlYWQuXG4vLyB0aGlzIGlzIHRoZSByZXN1bHQgb2YgYSBzY3JpcHQgYmVpbmcgcHVsbGVkIGluIGZyb20gYW4gZXh0ZXJuYWwgZG9tYWluIGFuZCBDT1JTLlxudmFyIERFRkFVTFRfSUdOT1JFX0VSUk9SUyA9IFsvXlNjcmlwdCBlcnJvclxcLj8kLywgL15KYXZhc2NyaXB0IGVycm9yOiBTY3JpcHQgZXJyb3JcXC4/IG9uIGxpbmUgMCQvXTtcbi8qKiBJbmJvdW5kIGZpbHRlcnMgY29uZmlndXJhYmxlIGJ5IHRoZSB1c2VyICovXG52YXIgSW5ib3VuZEZpbHRlcnMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSW5ib3VuZEZpbHRlcnMoX29wdGlvbnMpIHtcbiAgICAgICAgaWYgKF9vcHRpb25zID09PSB2b2lkIDApIHsgX29wdGlvbnMgPSB7fTsgfVxuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uYW1lID0gSW5ib3VuZEZpbHRlcnMuaWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSW5ib3VuZEZpbHRlcnMucHJvdG90eXBlLnNldHVwT25jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuICAgICAgICAgICAgaWYgKCFodWIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc2VsZiA9IGh1Yi5nZXRJbnRlZ3JhdGlvbihJbmJvdW5kRmlsdGVycyk7XG4gICAgICAgICAgICBpZiAoc2VsZikge1xuICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBodWIuZ2V0Q2xpZW50KCk7XG4gICAgICAgICAgICAgICAgdmFyIGNsaWVudE9wdGlvbnMgPSBjbGllbnQgPyBjbGllbnQuZ2V0T3B0aW9ucygpIDoge307XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBzZWxmLl9tZXJnZU9wdGlvbnMoY2xpZW50T3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuX3Nob3VsZERyb3BFdmVudChldmVudCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5fc2hvdWxkRHJvcEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NlbnRyeUVycm9yKGV2ZW50LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJFdmVudCBkcm9wcGVkIGR1ZSB0byBiZWluZyBpbnRlcm5hbCBTZW50cnkgRXJyb3IuXFxuRXZlbnQ6IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzSWdub3JlZEVycm9yKGV2ZW50LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJFdmVudCBkcm9wcGVkIGR1ZSB0byBiZWluZyBtYXRjaGVkIGJ5IGBpZ25vcmVFcnJvcnNgIG9wdGlvbi5cXG5FdmVudDogXCIgKyBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNEZW5pZWRVcmwoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkV2ZW50IGRyb3BwZWQgZHVlIHRvIGJlaW5nIG1hdGNoZWQgYnkgYGRlbnlVcmxzYCBvcHRpb24uXFxuRXZlbnQ6IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkgKyBcIi5cXG5Vcmw6IFwiICsgdGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5faXNBbGxvd2VkVXJsKGV2ZW50LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJFdmVudCBkcm9wcGVkIGR1ZSB0byBub3QgYmVpbmcgbWF0Y2hlZCBieSBgYWxsb3dVcmxzYCBvcHRpb24uXFxuRXZlbnQ6IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkgKyBcIi5cXG5Vcmw6IFwiICsgdGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5faXNTZW50cnlFcnJvciA9IGZ1bmN0aW9uIChldmVudCwgb3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlSW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuICgoZXZlbnQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5leGNlcHRpb24gJiZcbiAgICAgICAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udHlwZSA9PT0gJ1NlbnRyeUVycm9yJykgfHxcbiAgICAgICAgICAgICAgICBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9vTykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX2lzSWdub3JlZEVycm9yID0gZnVuY3Rpb24gKGV2ZW50LCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVFcnJvcnMgfHwgIW9wdGlvbnMuaWdub3JlRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQb3NzaWJsZUV2ZW50TWVzc2FnZXMoZXZlbnQpLnNvbWUoZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIHdoeSBUeXBlU2NyaXB0IGNvbXBsYWlucyBoZXJlLi4uXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pZ25vcmVFcnJvcnMuc29tZShmdW5jdGlvbiAocGF0dGVybikgeyByZXR1cm4gaXNNYXRjaGluZ1BhdHRlcm4obWVzc2FnZSwgcGF0dGVybik7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5faXNEZW5pZWRVcmwgPSBmdW5jdGlvbiAoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gVE9ETzogVXNlIEdsb2IgaW5zdGVhZD9cbiAgICAgICAgaWYgKCFvcHRpb25zLmRlbnlVcmxzIHx8ICFvcHRpb25zLmRlbnlVcmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1cmwgPSB0aGlzLl9nZXRFdmVudEZpbHRlclVybChldmVudCk7XG4gICAgICAgIHJldHVybiAhdXJsID8gZmFsc2UgOiBvcHRpb25zLmRlbnlVcmxzLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHsgcmV0dXJuIGlzTWF0Y2hpbmdQYXR0ZXJuKHVybCwgcGF0dGVybik7IH0pO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgSW5ib3VuZEZpbHRlcnMucHJvdG90eXBlLl9pc0FsbG93ZWRVcmwgPSBmdW5jdGlvbiAoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gVE9ETzogVXNlIEdsb2IgaW5zdGVhZD9cbiAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93VXJscyB8fCAhb3B0aW9ucy5hbGxvd1VybHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXJsID0gdGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpO1xuICAgICAgICByZXR1cm4gIXVybCA/IHRydWUgOiBvcHRpb25zLmFsbG93VXJscy5zb21lKGZ1bmN0aW9uIChwYXR0ZXJuKSB7IHJldHVybiBpc01hdGNoaW5nUGF0dGVybih1cmwsIHBhdHRlcm4pOyB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5fbWVyZ2VPcHRpb25zID0gZnVuY3Rpb24gKGNsaWVudE9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGNsaWVudE9wdGlvbnMgPT09IHZvaWQgMCkgeyBjbGllbnRPcHRpb25zID0ge307IH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6ZGVwcmVjYXRpb25cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFsbG93VXJsczogdHNsaWJfMS5fX3NwcmVhZCgodGhpcy5fb3B0aW9ucy53aGl0ZWxpc3RVcmxzIHx8IFtdKSwgKHRoaXMuX29wdGlvbnMuYWxsb3dVcmxzIHx8IFtdKSwgKGNsaWVudE9wdGlvbnMud2hpdGVsaXN0VXJscyB8fCBbXSksIChjbGllbnRPcHRpb25zLmFsbG93VXJscyB8fCBbXSkpLFxuICAgICAgICAgICAgZGVueVVybHM6IHRzbGliXzEuX19zcHJlYWQoKHRoaXMuX29wdGlvbnMuYmxhY2tsaXN0VXJscyB8fCBbXSksICh0aGlzLl9vcHRpb25zLmRlbnlVcmxzIHx8IFtdKSwgKGNsaWVudE9wdGlvbnMuYmxhY2tsaXN0VXJscyB8fCBbXSksIChjbGllbnRPcHRpb25zLmRlbnlVcmxzIHx8IFtdKSksXG4gICAgICAgICAgICBpZ25vcmVFcnJvcnM6IHRzbGliXzEuX19zcHJlYWQoKHRoaXMuX29wdGlvbnMuaWdub3JlRXJyb3JzIHx8IFtdKSwgKGNsaWVudE9wdGlvbnMuaWdub3JlRXJyb3JzIHx8IFtdKSwgREVGQVVMVF9JR05PUkVfRVJST1JTKSxcbiAgICAgICAgICAgIGlnbm9yZUludGVybmFsOiB0eXBlb2YgdGhpcy5fb3B0aW9ucy5pZ25vcmVJbnRlcm5hbCAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLl9vcHRpb25zLmlnbm9yZUludGVybmFsIDogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5fZ2V0UG9zc2libGVFdmVudE1lc3NhZ2VzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5tZXNzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gW2V2ZW50Lm1lc3NhZ2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5leGNlcHRpb24pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gKGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSkgfHwge30sIF9iID0gX2EudHlwZSwgdHlwZSA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iLCBfYyA9IF9hLnZhbHVlLCB2YWx1ZSA9IF9jID09PSB2b2lkIDAgPyAnJyA6IF9jO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXCJcIiArIHZhbHVlLCB0eXBlICsgXCI6IFwiICsgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKG9PKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQ2Fubm90IGV4dHJhY3QgbWVzc2FnZSBmb3IgZXZlbnQgXCIgKyBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5fZ2V0RXZlbnRGaWx0ZXJVcmwgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChldmVudC5zdGFja3RyYWNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyYW1lc18xID0gZXZlbnQuc3RhY2t0cmFjZS5mcmFtZXM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChmcmFtZXNfMSAmJiBmcmFtZXNfMVtmcmFtZXNfMS5sZW5ndGggLSAxXS5maWxlbmFtZSkgfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChldmVudC5leGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJhbWVzXzIgPSBldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZSAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UuZnJhbWVzO1xuICAgICAgICAgICAgICAgIHJldHVybiAoZnJhbWVzXzIgJiYgZnJhbWVzXzJbZnJhbWVzXzIubGVuZ3RoIC0gMV0uZmlsZW5hbWUpIHx8IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAob08pIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkNhbm5vdCBleHRyYWN0IHVybCBmb3IgZXZlbnQgXCIgKyBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBJbmJvdW5kRmlsdGVycy5pZCA9ICdJbmJvdW5kRmlsdGVycyc7XG4gICAgcmV0dXJuIEluYm91bmRGaWx0ZXJzO1xufSgpKTtcbmV4cG9ydCB7IEluYm91bmRGaWx0ZXJzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmJvdW5kZmlsdGVycy5qcy5tYXAiLCJleHBvcnQgeyBGdW5jdGlvblRvU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbnRvc3RyaW5nJztcbmV4cG9ydCB7IEluYm91bmRGaWx0ZXJzIH0gZnJvbSAnLi9pbmJvdW5kZmlsdGVycyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyB0aW1lc3RhbXBXaXRoTXMgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKiBDcmVhdGVzIGEgU2VudHJ5UmVxdWVzdCBmcm9tIGFuIGV2ZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50VG9TZW50cnlSZXF1ZXN0KGV2ZW50LCBhcGkpIHtcbiAgICB2YXIgdXNlRW52ZWxvcGUgPSBldmVudC50eXBlID09PSAndHJhbnNhY3Rpb24nO1xuICAgIHZhciByZXEgPSB7XG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGV2ZW50KSxcbiAgICAgICAgdXJsOiB1c2VFbnZlbG9wZSA/IGFwaS5nZXRFbnZlbG9wZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoKCkgOiBhcGkuZ2V0U3RvcmVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCgpLFxuICAgIH07XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wLnNlbnRyeS5kZXYvc2RrL2VudmVsb3Blcy9cbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBuZWVkIHRvIG1hbmlwdWxhdGUgZW52ZWxvcGVzIG5vciBzdG9yZSB0aGVtLCB0aGVyZSBpcyBub1xuICAgIC8vIGV4cG9ydGVkIGNvbmNlcHQgb2YgYW4gRW52ZWxvcGUgd2l0aCBvcGVyYXRpb25zIGluY2x1ZGluZyBzZXJpYWxpemF0aW9uIGFuZFxuICAgIC8vIGRlc2VyaWFsaXphdGlvbi4gSW5zdGVhZCwgd2Ugb25seSBpbXBsZW1lbnQgYSBtaW5pbWFsIHN1YnNldCBvZiB0aGUgc3BlYyB0b1xuICAgIC8vIHNlcmlhbGl6ZSBldmVudHMgaW5saW5lIGhlcmUuXG4gICAgaWYgKHVzZUVudmVsb3BlKSB7XG4gICAgICAgIHZhciBlbnZlbG9wZUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudF9pZDogZXZlbnQuZXZlbnRfaWQsXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkZCAqIDEwMDAgc2luY2Ugd2UgZGl2aWRlIGl0IGJ5IDEwMDAgYnkgZGVmYXVsdCBidXQgSlMgd29ya3Mgd2l0aCBtcyBwcmVjaXNpb25cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gd2UgdXNlIHRpbWVzdGFtcFdpdGhNcyBoZXJlIGlzIHRoYXQgYWxsIGNsb2NrcyBhY3Jvc3MgdGhlIFNESyB1c2UgdGhlIHNhbWUgY2xvY2tcbiAgICAgICAgICAgIHNlbnRfYXQ6IG5ldyBEYXRlKHRpbWVzdGFtcFdpdGhNcygpICogMTAwMCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBpdGVtSGVhZGVycyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUaGUgdHJhaWxpbmcgbmV3bGluZSBpcyBvcHRpb25hbC4gV2UgaW50ZW50aW9uYWxseSBkb24ndCBzZW5kIGl0IHRvIGF2b2lkXG4gICAgICAgIC8vIHNlbmRpbmcgdW5uZWNlc3NhcnkgYnl0ZXMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGNvbnN0IGVudmVsb3BlID0gYCR7ZW52ZWxvcGVIZWFkZXJzfVxcbiR7aXRlbUhlYWRlcnN9XFxuJHtyZXEuYm9keX1cXG5gO1xuICAgICAgICB2YXIgZW52ZWxvcGUgPSBlbnZlbG9wZUhlYWRlcnMgKyBcIlxcblwiICsgaXRlbUhlYWRlcnMgKyBcIlxcblwiICsgcmVxLmJvZHk7XG4gICAgICAgIHJlcS5ib2R5ID0gZW52ZWxvcGU7XG4gICAgfVxuICAgIHJldHVybiByZXE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXF1ZXN0LmpzLm1hcCIsImltcG9ydCB7IGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKlxuICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IFNESyBjbGllbnQgaW5zdGFuY2UuIFRoZSBjbGllbnQgaXNcbiAqIGluc3RhbGxlZCBhbmQgdGhlbiBib3VuZCB0byB0aGUgY3VycmVudCBzY29wZS5cbiAqXG4gKiBAcGFyYW0gY2xpZW50Q2xhc3MgVGhlIGNsaWVudCBjbGFzcyB0byBpbnN0YW5jaWF0ZS5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY2xpZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEFuZEJpbmQoY2xpZW50Q2xhc3MsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5kZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgICAgICBsb2dnZXIuZW5hYmxlKCk7XG4gICAgfVxuICAgIHZhciBodWIgPSBnZXRDdXJyZW50SHViKCk7XG4gICAgdmFyIGNsaWVudCA9IG5ldyBjbGllbnRDbGFzcyhvcHRpb25zKTtcbiAgICBodWIuYmluZENsaWVudChjbGllbnQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2RrLmpzLm1hcCIsImltcG9ydCB7IFN0YXR1cyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKiBOb29wIHRyYW5zcG9ydCAqL1xudmFyIE5vb3BUcmFuc3BvcnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9vcFRyYW5zcG9ydCgpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBOb29wVHJhbnNwb3J0LnByb3RvdHlwZS5zZW5kRXZlbnQgPSBmdW5jdGlvbiAoXykge1xuICAgICAgICByZXR1cm4gU3luY1Byb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICByZWFzb246IFwiTm9vcFRyYW5zcG9ydDogRXZlbnQgaGFzIGJlZW4gc2tpcHBlZCBiZWNhdXNlIG5vIERzbiBpcyBjb25maWd1cmVkLlwiLFxuICAgICAgICAgICAgc3RhdHVzOiBTdGF0dXMuU2tpcHBlZCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIE5vb3BUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKF8pIHtcbiAgICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gTm9vcFRyYW5zcG9ydDtcbn0oKSk7XG5leHBvcnQgeyBOb29wVHJhbnNwb3J0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub29wLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBjb25zb2xlU2FuZGJveCwgZ2V0R2xvYmFsT2JqZWN0LCBpc05vZGVFbnYsIGxvZ2dlciwgdGltZXN0YW1wV2l0aE1zLCB1dWlkNCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgU2NvcGUgfSBmcm9tICcuL3Njb3BlJztcbi8qKlxuICogQVBJIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBvZiB0aGlzIGh1Yi5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIG51bWJlciBzaG91bGQgb25seSBiZSBpbmNyZXNlZCB3aGVuIHRoZSBnbG9iYWwgaW50ZXJmYWNlXG4gKiBjaGFuZ2VzIGEgYW5kIG5ldyBtZXRob2RzIGFyZSBpbnRyb2R1Y2VkLlxuICpcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IHZhciBBUElfVkVSU0lPTiA9IDM7XG4vKipcbiAqIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgYnJlYWRjcnVtYnMgYWRkZWQgdG8gYW4gZXZlbnQuIENhbiBiZSBvdmVyd3JpdHRlblxuICogd2l0aCB7QGxpbmsgT3B0aW9ucy5tYXhCcmVhZGNydW1ic30uXG4gKi9cbnZhciBERUZBVUxUX0JSRUFEQ1JVTUJTID0gMTAwO1xuLyoqXG4gKiBBYnNvbHV0ZSBtYXhpbXVtIG51bWJlciBvZiBicmVhZGNydW1icyBhZGRlZCB0byBhbiBldmVudC4gVGhlXG4gKiBgbWF4QnJlYWRjcnVtYnNgIG9wdGlvbiBjYW5ub3QgYmUgaGlnaGVyIHRoYW4gdGhpcyB2YWx1ZS5cbiAqL1xudmFyIE1BWF9CUkVBRENSVU1CUyA9IDEwMDtcbi8qKlxuICogQGluaGVyaXREb2NcbiAqL1xudmFyIEh1YiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBodWIsIHdpbGwgcHVzaCBvbmUge0BsaW5rIExheWVyfSBpbnRvIHRoZVxuICAgICAqIGludGVybmFsIHN0YWNrIG9uIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNsaWVudCBib3VuZCB0byB0aGUgaHViLlxuICAgICAqIEBwYXJhbSBzY29wZSBib3VuZCB0byB0aGUgaHViLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIG51bWJlciwgaGlnaGVyIG51bWJlciBtZWFucyBoaWdoZXIgcHJpb3JpdHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSHViKGNsaWVudCwgc2NvcGUsIF92ZXJzaW9uKSB7XG4gICAgICAgIGlmIChzY29wZSA9PT0gdm9pZCAwKSB7IHNjb3BlID0gbmV3IFNjb3BlKCk7IH1cbiAgICAgICAgaWYgKF92ZXJzaW9uID09PSB2b2lkIDApIHsgX3ZlcnNpb24gPSBBUElfVkVSU0lPTjsgfVxuICAgICAgICB0aGlzLl92ZXJzaW9uID0gX3ZlcnNpb247XG4gICAgICAgIC8qKiBJcyBhIHtAbGluayBMYXllcn1bXSBjb250YWluaW5nIHRoZSBjbGllbnQgYW5kIHNjb3BlICovXG4gICAgICAgIHRoaXMuX3N0YWNrID0gW107XG4gICAgICAgIHRoaXMuX3N0YWNrLnB1c2goeyBjbGllbnQ6IGNsaWVudCwgc2NvcGU6IHNjb3BlIH0pO1xuICAgICAgICB0aGlzLmJpbmRDbGllbnQoY2xpZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIHRvIGNhbGwgYSBtZXRob2Qgb24gdGhlIHRvcCBjbGllbnQgaWYgaXQgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIGNsaWVudC5cbiAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2xpZW50IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuX2ludm9rZUNsaWVudCA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAodG9wICYmIHRvcC5jbGllbnQgJiYgdG9wLmNsaWVudFttZXRob2RdKSB7XG4gICAgICAgICAgICAoX2EgPSB0b3AuY2xpZW50KVttZXRob2RdLmFwcGx5KF9hLCB0c2xpYl8xLl9fc3ByZWFkKGFyZ3MsIFt0b3Auc2NvcGVdKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5pc09sZGVyVGhhbiA9IGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uIDwgdmVyc2lvbjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5iaW5kQ2xpZW50ID0gZnVuY3Rpb24gKGNsaWVudCkge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICB0b3AuY2xpZW50ID0gY2xpZW50O1xuICAgICAgICBpZiAoY2xpZW50ICYmIGNsaWVudC5zZXR1cEludGVncmF0aW9ucykge1xuICAgICAgICAgICAgY2xpZW50LnNldHVwSW50ZWdyYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5wdXNoU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gY2xvbmUgdGhlIGNvbnRlbnQgb2YgcHJldiBzY29wZVxuICAgICAgICB2YXIgc3RhY2sgPSB0aGlzLmdldFN0YWNrKCk7XG4gICAgICAgIHZhciBwYXJlbnRTY29wZSA9IHN0YWNrLmxlbmd0aCA+IDAgPyBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5zY29wZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHNjb3BlID0gU2NvcGUuY2xvbmUocGFyZW50U2NvcGUpO1xuICAgICAgICB0aGlzLmdldFN0YWNrKCkucHVzaCh7XG4gICAgICAgICAgICBjbGllbnQ6IHRoaXMuZ2V0Q2xpZW50KCksXG4gICAgICAgICAgICBzY29wZTogc2NvcGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUucG9wU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0YWNrKCkucG9wKCkgIT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS53aXRoU2NvcGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5wdXNoU2NvcGUoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMucG9wU2NvcGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmdldENsaWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5jbGllbnQ7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgc2NvcGUgb2YgdGhlIHRvcCBzdGFjay4gKi9cbiAgICBIdWIucHJvdG90eXBlLmdldFNjb3BlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLnNjb3BlO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIHNjb3BlIHN0YWNrIGZvciBkb21haW5zIG9yIHRoZSBwcm9jZXNzLiAqL1xuICAgIEh1Yi5wcm90b3R5cGUuZ2V0U3RhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFjaztcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSB0b3Btb3N0IHNjb3BlIGxheWVyIGluIHRoZSBvcmRlciBkb21haW4gPiBsb2NhbCA+IHByb2Nlc3MuICovXG4gICAgSHViLnByb3RvdHlwZS5nZXRTdGFja1RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YWNrW3RoaXMuX3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmNhcHR1cmVFeGNlcHRpb24gPSBmdW5jdGlvbiAoZXhjZXB0aW9uLCBoaW50KSB7XG4gICAgICAgIHZhciBldmVudElkID0gKHRoaXMuX2xhc3RFdmVudElkID0gdXVpZDQoKSk7XG4gICAgICAgIHZhciBmaW5hbEhpbnQgPSBoaW50O1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIGV4cGxpY2l0IGhpbnQgcHJvdmlkZWQsIG1pbWljayB0aGUgc2FtZSB0aGluZyB0aGF0IHdvdWxkIGhhcHBlblxuICAgICAgICAvLyBpbiB0aGUgbWluaW1hbCBpdHNlbGYgdG8gY3JlYXRlIGEgY29uc2lzdGVudCBiZWhhdmlvci5cbiAgICAgICAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgY2xpZW50LCBhcyBpdCdzIHRoZSBsb3dlc3QgbGV2ZWwgQVBJLCBhbmQgZG9pbmcgdGhpcyxcbiAgICAgICAgLy8gd291bGQgcHJldmVudCB1c2VyIGZyb20gaGF2aW5nIGZ1bGwgY29udHJvbCBvdmVyIGRpcmVjdCBjYWxscy5cbiAgICAgICAgaWYgKCFoaW50KSB7XG4gICAgICAgICAgICB2YXIgc3ludGhldGljRXhjZXB0aW9uID0gdm9pZCAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbnRyeSBzeW50aGV0aWNFeGNlcHRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbEhpbnQgPSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IGV4Y2VwdGlvbixcbiAgICAgICAgICAgICAgICBzeW50aGV0aWNFeGNlcHRpb246IHN5bnRoZXRpY0V4Y2VwdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW52b2tlQ2xpZW50KCdjYXB0dXJlRXhjZXB0aW9uJywgZXhjZXB0aW9uLCB0c2xpYl8xLl9fYXNzaWduKHt9LCBmaW5hbEhpbnQsIHsgZXZlbnRfaWQ6IGV2ZW50SWQgfSkpO1xuICAgICAgICByZXR1cm4gZXZlbnRJZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5jYXB0dXJlTWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlLCBsZXZlbCwgaGludCkge1xuICAgICAgICB2YXIgZXZlbnRJZCA9ICh0aGlzLl9sYXN0RXZlbnRJZCA9IHV1aWQ0KCkpO1xuICAgICAgICB2YXIgZmluYWxIaW50ID0gaGludDtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBleHBsaWNpdCBoaW50IHByb3ZpZGVkLCBtaW1pY2sgdGhlIHNhbWUgdGhpbmcgdGhhdCB3b3VsZCBoYXBwZW5cbiAgICAgICAgLy8gaW4gdGhlIG1pbmltYWwgaXRzZWxmIHRvIGNyZWF0ZSBhIGNvbnNpc3RlbnQgYmVoYXZpb3IuXG4gICAgICAgIC8vIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlIGNsaWVudCwgYXMgaXQncyB0aGUgbG93ZXN0IGxldmVsIEFQSSwgYW5kIGRvaW5nIHRoaXMsXG4gICAgICAgIC8vIHdvdWxkIHByZXZlbnQgdXNlciBmcm9tIGhhdmluZyBmdWxsIGNvbnRyb2wgb3ZlciBkaXJlY3QgY2FsbHMuXG4gICAgICAgIGlmICghaGludCkge1xuICAgICAgICAgICAgdmFyIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IHZvaWQgMDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsSGludCA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBzeW50aGV0aWNFeGNlcHRpb246IHN5bnRoZXRpY0V4Y2VwdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW52b2tlQ2xpZW50KCdjYXB0dXJlTWVzc2FnZScsIG1lc3NhZ2UsIGxldmVsLCB0c2xpYl8xLl9fYXNzaWduKHt9LCBmaW5hbEhpbnQsIHsgZXZlbnRfaWQ6IGV2ZW50SWQgfSkpO1xuICAgICAgICByZXR1cm4gZXZlbnRJZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5jYXB0dXJlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGhpbnQpIHtcbiAgICAgICAgdmFyIGV2ZW50SWQgPSAodGhpcy5fbGFzdEV2ZW50SWQgPSB1dWlkNCgpKTtcbiAgICAgICAgdGhpcy5faW52b2tlQ2xpZW50KCdjYXB0dXJlRXZlbnQnLCBldmVudCwgdHNsaWJfMS5fX2Fzc2lnbih7fSwgaGludCwgeyBldmVudF9pZDogZXZlbnRJZCB9KSk7XG4gICAgICAgIHJldHVybiBldmVudElkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmxhc3RFdmVudElkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdEV2ZW50SWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuYWRkQnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChicmVhZGNydW1iLCBoaW50KSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICghdG9wLnNjb3BlIHx8ICF0b3AuY2xpZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gKHRvcC5jbGllbnQuZ2V0T3B0aW9ucyAmJiB0b3AuY2xpZW50LmdldE9wdGlvbnMoKSkgfHwge30sIF9iID0gX2EuYmVmb3JlQnJlYWRjcnVtYiwgYmVmb3JlQnJlYWRjcnVtYiA9IF9iID09PSB2b2lkIDAgPyBudWxsIDogX2IsIF9jID0gX2EubWF4QnJlYWRjcnVtYnMsIG1heEJyZWFkY3J1bWJzID0gX2MgPT09IHZvaWQgMCA/IERFRkFVTFRfQlJFQURDUlVNQlMgOiBfYztcbiAgICAgICAgaWYgKG1heEJyZWFkY3J1bWJzIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGltZXN0YW1wID0gdGltZXN0YW1wV2l0aE1zKCk7XG4gICAgICAgIHZhciBtZXJnZWRCcmVhZGNydW1iID0gdHNsaWJfMS5fX2Fzc2lnbih7IHRpbWVzdGFtcDogdGltZXN0YW1wIH0sIGJyZWFkY3J1bWIpO1xuICAgICAgICB2YXIgZmluYWxCcmVhZGNydW1iID0gYmVmb3JlQnJlYWRjcnVtYlxuICAgICAgICAgICAgPyBjb25zb2xlU2FuZGJveChmdW5jdGlvbiAoKSB7IHJldHVybiBiZWZvcmVCcmVhZGNydW1iKG1lcmdlZEJyZWFkY3J1bWIsIGhpbnQpOyB9KVxuICAgICAgICAgICAgOiBtZXJnZWRCcmVhZGNydW1iO1xuICAgICAgICBpZiAoZmluYWxCcmVhZGNydW1iID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdG9wLnNjb3BlLmFkZEJyZWFkY3J1bWIoZmluYWxCcmVhZGNydW1iLCBNYXRoLm1pbihtYXhCcmVhZGNydW1icywgTUFYX0JSRUFEQ1JVTUJTKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuc2V0VXNlciA9IGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICghdG9wLnNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdG9wLnNjb3BlLnNldFVzZXIodXNlcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuc2V0VGFncyA9IGZ1bmN0aW9uICh0YWdzKSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICghdG9wLnNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdG9wLnNjb3BlLnNldFRhZ3ModGFncyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuc2V0RXh0cmFzID0gZnVuY3Rpb24gKGV4dHJhcykge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAoIXRvcC5zY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRvcC5zY29wZS5zZXRFeHRyYXMoZXh0cmFzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zZXRUYWcgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAoIXRvcC5zY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRvcC5zY29wZS5zZXRUYWcoa2V5LCB2YWx1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuc2V0RXh0cmEgPSBmdW5jdGlvbiAoa2V5LCBleHRyYSkge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAoIXRvcC5zY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRvcC5zY29wZS5zZXRFeHRyYShrZXksIGV4dHJhKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zZXRDb250ZXh0ID0gZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHRvcCA9IHRoaXMuZ2V0U3RhY2tUb3AoKTtcbiAgICAgICAgaWYgKCF0b3Auc2NvcGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0b3Auc2NvcGUuc2V0Q29udGV4dChuYW1lLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5jb25maWd1cmVTY29wZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAodG9wLnNjb3BlICYmIHRvcC5jbGllbnQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHRvcC5zY29wZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIG9sZEh1YiA9IG1ha2VNYWluKHRoaXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2FsbGJhY2sodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBtYWtlTWFpbihvbGRIdWIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuZ2V0SW50ZWdyYXRpb24gPSBmdW5jdGlvbiAoaW50ZWdyYXRpb24pIHtcbiAgICAgICAgdmFyIGNsaWVudCA9IHRoaXMuZ2V0Q2xpZW50KCk7XG4gICAgICAgIGlmICghY2xpZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5nZXRJbnRlZ3JhdGlvbihpbnRlZ3JhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9vTykge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJDYW5ub3QgcmV0cmlldmUgaW50ZWdyYXRpb24gXCIgKyBpbnRlZ3JhdGlvbi5pZCArIFwiIGZyb20gdGhlIGN1cnJlbnQgSHViXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zdGFydFNwYW4gPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbEV4dGVuc2lvbk1ldGhvZCgnc3RhcnRTcGFuJywgY29udGV4dCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuc3RhcnRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsRXh0ZW5zaW9uTWV0aG9kKCdzdGFydFRyYW5zYWN0aW9uJywgY29udGV4dCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUudHJhY2VIZWFkZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbEV4dGVuc2lvbk1ldGhvZCgndHJhY2VIZWFkZXJzJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDYWxscyBnbG9iYWwgZXh0ZW5zaW9uIG1ldGhvZCBhbmQgYmluZGluZyBjdXJyZW50IGluc3RhbmNlIHRvIHRoZSBmdW5jdGlvbiBjYWxsXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIEh1Yi5wcm90b3R5cGUuX2NhbGxFeHRlbnNpb25NZXRob2QgPSBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYXJyaWVyID0gZ2V0TWFpbkNhcnJpZXIoKTtcbiAgICAgICAgdmFyIHNlbnRyeSA9IGNhcnJpZXIuX19TRU5UUllfXztcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgICAgIGlmIChzZW50cnkgJiYgc2VudHJ5LmV4dGVuc2lvbnMgJiYgdHlwZW9mIHNlbnRyeS5leHRlbnNpb25zW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBzZW50cnkuZXh0ZW5zaW9uc1ttZXRob2RdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci53YXJuKFwiRXh0ZW5zaW9uIG1ldGhvZCBcIiArIG1ldGhvZCArIFwiIGNvdWxkbid0IGJlIGZvdW5kLCBkb2luZyBub3RoaW5nLlwiKTtcbiAgICB9O1xuICAgIHJldHVybiBIdWI7XG59KCkpO1xuZXhwb3J0IHsgSHViIH07XG4vKiogUmV0dXJucyB0aGUgZ2xvYmFsIHNoaW0gcmVnaXN0cnkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbkNhcnJpZXIoKSB7XG4gICAgdmFyIGNhcnJpZXIgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICBjYXJyaWVyLl9fU0VOVFJZX18gPSBjYXJyaWVyLl9fU0VOVFJZX18gfHwge1xuICAgICAgICBleHRlbnNpb25zOiB7fSxcbiAgICAgICAgaHViOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICByZXR1cm4gY2Fycmllcjtcbn1cbi8qKlxuICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgbWFpbiBodWIgd2l0aCB0aGUgcGFzc2VkIG9uZSBvbiB0aGUgZ2xvYmFsIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIFRoZSBvbGQgcmVwbGFjZWQgaHViXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTWFpbihodWIpIHtcbiAgICB2YXIgcmVnaXN0cnkgPSBnZXRNYWluQ2FycmllcigpO1xuICAgIHZhciBvbGRIdWIgPSBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gICAgc2V0SHViT25DYXJyaWVyKHJlZ2lzdHJ5LCBodWIpO1xuICAgIHJldHVybiBvbGRIdWI7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGRlZmF1bHQgaHViIGluc3RhbmNlLlxuICpcbiAqIElmIGEgaHViIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBpbiB0aGUgZ2xvYmFsIGNhcnJpZXIgYnV0IHRoaXMgbW9kdWxlXG4gKiBjb250YWlucyBhIG1vcmUgcmVjZW50IHZlcnNpb24sIGl0IHJlcGxhY2VzIHRoZSByZWdpc3RlcmVkIHZlcnNpb24uXG4gKiBPdGhlcndpc2UsIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBodWIgd2lsbCBiZSByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRIdWIoKSB7XG4gICAgLy8gR2V0IG1haW4gY2FycmllciAoZ2xvYmFsIGZvciBldmVyeSBlbnZpcm9ubWVudClcbiAgICB2YXIgcmVnaXN0cnkgPSBnZXRNYWluQ2FycmllcigpO1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gaHViLCBvciBpdHMgYW4gb2xkIEFQSSwgYXNzaWduIGEgbmV3IG9uZVxuICAgIGlmICghaGFzSHViT25DYXJyaWVyKHJlZ2lzdHJ5KSB8fCBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSkuaXNPbGRlclRoYW4oQVBJX1ZFUlNJT04pKSB7XG4gICAgICAgIHNldEh1Yk9uQ2FycmllcihyZWdpc3RyeSwgbmV3IEh1YigpKTtcbiAgICB9XG4gICAgLy8gUHJlZmVyIGRvbWFpbnMgb3ZlciBnbG9iYWwgaWYgdGhleSBhcmUgdGhlcmUgKGFwcGxpY2FibGUgb25seSB0byBOb2RlIGVudmlyb25tZW50KVxuICAgIGlmIChpc05vZGVFbnYoKSkge1xuICAgICAgICByZXR1cm4gZ2V0SHViRnJvbUFjdGl2ZURvbWFpbihyZWdpc3RyeSk7XG4gICAgfVxuICAgIC8vIFJldHVybiBodWIgdGhhdCBsaXZlcyBvbiBhIGdsb2JhbCBvYmplY3RcbiAgICByZXR1cm4gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpO1xufVxuLyoqXG4gKiBUcnkgdG8gcmVhZCB0aGUgaHViIGZyb20gYW4gYWN0aXZlIGRvbWFpbiwgZmFsbGJhY2sgdG8gdGhlIHJlZ2lzdHJ5IGlmIG9uZSBkb2VzbnQgZXhpc3RcbiAqIEByZXR1cm5zIGRpc2NvdmVyZWQgaHViXG4gKi9cbmZ1bmN0aW9uIGdldEh1YkZyb21BY3RpdmVEb21haW4ocmVnaXN0cnkpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgcHJvcGVydHkgPSAnZG9tYWluJztcbiAgICAgICAgdmFyIGNhcnJpZXIgPSBnZXRNYWluQ2FycmllcigpO1xuICAgICAgICB2YXIgc2VudHJ5ID0gY2Fycmllci5fX1NFTlRSWV9fO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICAgICAgaWYgKCFzZW50cnkgfHwgIXNlbnRyeS5leHRlbnNpb25zIHx8ICFzZW50cnkuZXh0ZW5zaW9uc1twcm9wZXJ0eV0pIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRvbWFpbiA9IHNlbnRyeS5leHRlbnNpb25zW3Byb3BlcnR5XTtcbiAgICAgICAgdmFyIGFjdGl2ZURvbWFpbiA9IGRvbWFpbi5hY3RpdmU7XG4gICAgICAgIC8vIElmIHRoZXJlIG5vIGFjdGl2ZSBkb21haW4sIGp1c3QgcmV0dXJuIGdsb2JhbCBodWJcbiAgICAgICAgaWYgKCFhY3RpdmVEb21haW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBodWIgb24gY3VycmVudCBkb21haW4sIG9yIGl0cyBhbiBvbGQgQVBJLCBhc3NpZ24gYSBuZXcgb25lXG4gICAgICAgIGlmICghaGFzSHViT25DYXJyaWVyKGFjdGl2ZURvbWFpbikgfHwgZ2V0SHViRnJvbUNhcnJpZXIoYWN0aXZlRG9tYWluKS5pc09sZGVyVGhhbihBUElfVkVSU0lPTikpIHtcbiAgICAgICAgICAgIHZhciByZWdpc3RyeUh1YlRvcFN0YWNrID0gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpLmdldFN0YWNrVG9wKCk7XG4gICAgICAgICAgICBzZXRIdWJPbkNhcnJpZXIoYWN0aXZlRG9tYWluLCBuZXcgSHViKHJlZ2lzdHJ5SHViVG9wU3RhY2suY2xpZW50LCBTY29wZS5jbG9uZShyZWdpc3RyeUh1YlRvcFN0YWNrLnNjb3BlKSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiBodWIgdGhhdCBsaXZlcyBvbiBhIGRvbWFpblxuICAgICAgICByZXR1cm4gZ2V0SHViRnJvbUNhcnJpZXIoYWN0aXZlRG9tYWluKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9Pbykge1xuICAgICAgICAvLyBSZXR1cm4gaHViIHRoYXQgbGl2ZXMgb24gYSBnbG9iYWwgb2JqZWN0XG4gICAgICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIHdpbGwgdGVsbCB3aGV0aGVyIGEgY2FycmllciBoYXMgYSBodWIgb24gaXQgb3Igbm90XG4gKiBAcGFyYW0gY2FycmllciBvYmplY3RcbiAqL1xuZnVuY3Rpb24gaGFzSHViT25DYXJyaWVyKGNhcnJpZXIpIHtcbiAgICBpZiAoY2FycmllciAmJiBjYXJyaWVyLl9fU0VOVFJZX18gJiYgY2Fycmllci5fX1NFTlRSWV9fLmh1Yikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHtAbGluayBIdWJ9IGFuZCBhZGQgdG8gdGhlIHBhc3NlZCBvYmplY3Qgb25cbiAqIF9fU0VOVFJZX18uaHViLlxuICogQHBhcmFtIGNhcnJpZXIgb2JqZWN0XG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIdWJGcm9tQ2FycmllcihjYXJyaWVyKSB7XG4gICAgaWYgKGNhcnJpZXIgJiYgY2Fycmllci5fX1NFTlRSWV9fICYmIGNhcnJpZXIuX19TRU5UUllfXy5odWIpIHtcbiAgICAgICAgcmV0dXJuIGNhcnJpZXIuX19TRU5UUllfXy5odWI7XG4gICAgfVxuICAgIGNhcnJpZXIuX19TRU5UUllfXyA9IGNhcnJpZXIuX19TRU5UUllfXyB8fCB7fTtcbiAgICBjYXJyaWVyLl9fU0VOVFJZX18uaHViID0gbmV3IEh1YigpO1xuICAgIHJldHVybiBjYXJyaWVyLl9fU0VOVFJZX18uaHViO1xufVxuLyoqXG4gKiBUaGlzIHdpbGwgc2V0IHBhc3NlZCB7QGxpbmsgSHVifSBvbiB0aGUgcGFzc2VkIG9iamVjdCdzIF9fU0VOVFJZX18uaHViIGF0dHJpYnV0ZVxuICogQHBhcmFtIGNhcnJpZXIgb2JqZWN0XG4gKiBAcGFyYW0gaHViIEh1YlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SHViT25DYXJyaWVyKGNhcnJpZXIsIGh1Yikge1xuICAgIGlmICghY2Fycmllcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNhcnJpZXIuX19TRU5UUllfXyA9IGNhcnJpZXIuX19TRU5UUllfXyB8fCB7fTtcbiAgICBjYXJyaWVyLl9fU0VOVFJZX18uaHViID0gaHViO1xuICAgIHJldHVybiB0cnVlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHViLmpzLm1hcCIsImV4cG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBTY29wZSB9IGZyb20gJy4vc2NvcGUnO1xuZXhwb3J0IHsgZ2V0Q3VycmVudEh1YiwgZ2V0SHViRnJvbUNhcnJpZXIsIGdldE1haW5DYXJyaWVyLCBIdWIsIG1ha2VNYWluLCBzZXRIdWJPbkNhcnJpZXIgfSBmcm9tICcuL2h1Yic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBpc1BsYWluT2JqZWN0LCBpc1RoZW5hYmxlLCBTeW5jUHJvbWlzZSwgdGltZXN0YW1wV2l0aE1zIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG4vKipcbiAqIEhvbGRzIGFkZGl0aW9uYWwgZXZlbnQgaW5mb3JtYXRpb24uIHtAbGluayBTY29wZS5hcHBseVRvRXZlbnR9IHdpbGwgYmVcbiAqIGNhbGxlZCBieSB0aGUgY2xpZW50IGJlZm9yZSBhbiBldmVudCB3aWxsIGJlIHNlbnQuXG4gKi9cbnZhciBTY29wZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTY29wZSgpIHtcbiAgICAgICAgLyoqIEZsYWcgaWYgbm90aWZpeWluZyBpcyBoYXBwZW5pbmcuICovXG4gICAgICAgIHRoaXMuX25vdGlmeWluZ0xpc3RlbmVycyA9IGZhbHNlO1xuICAgICAgICAvKiogQ2FsbGJhY2sgZm9yIGNsaWVudCB0byByZWNlaXZlIHNjb3BlIGNoYW5nZXMuICovXG4gICAgICAgIHRoaXMuX3Njb3BlTGlzdGVuZXJzID0gW107XG4gICAgICAgIC8qKiBDYWxsYmFjayBsaXN0IHRoYXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rIGFwcGx5VG9FdmVudH0uICovXG4gICAgICAgIHRoaXMuX2V2ZW50UHJvY2Vzc29ycyA9IFtdO1xuICAgICAgICAvKiogQXJyYXkgb2YgYnJlYWRjcnVtYnMuICovXG4gICAgICAgIHRoaXMuX2JyZWFkY3J1bWJzID0gW107XG4gICAgICAgIC8qKiBVc2VyICovXG4gICAgICAgIHRoaXMuX3VzZXIgPSB7fTtcbiAgICAgICAgLyoqIFRhZ3MgKi9cbiAgICAgICAgdGhpcy5fdGFncyA9IHt9O1xuICAgICAgICAvKiogRXh0cmEgKi9cbiAgICAgICAgdGhpcy5fZXh0cmEgPSB7fTtcbiAgICAgICAgLyoqIENvbnRleHRzICovXG4gICAgICAgIHRoaXMuX2NvbnRleHRzID0ge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBpbnRlcm5hbCBvbiBjaGFuZ2UgbGlzdGVuZXIuIFVzZWQgZm9yIHN1YiBTREtzIHRoYXQgbmVlZCB0byBzdG9yZSB0aGUgc2NvcGUuXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5hZGRTY29wZUxpc3RlbmVyID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX3Njb3BlTGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuYWRkRXZlbnRQcm9jZXNzb3IgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZXZlbnRQcm9jZXNzb3JzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgb24gZXZlcnkgc2V0IGNhbGwuXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLl9ub3RpZnlTY29wZUxpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeWluZ0xpc3RlbmVycyA9IHRydWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fc2NvcGVMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soX3RoaXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIF90aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHtAbGluayBhcHBseVRvRXZlbnR9IGlzIGZpbmlzaGVkLlxuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5fbm90aWZ5RXZlbnRQcm9jZXNzb3JzID0gZnVuY3Rpb24gKHByb2Nlc3NvcnMsIGV2ZW50LCBoaW50LCBpbmRleCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQgMCkgeyBpbmRleCA9IDA7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcHJvY2Vzc29yID0gcHJvY2Vzc29yc1tpbmRleF07XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICAgICAgaWYgKGV2ZW50ID09PSBudWxsIHx8IHR5cGVvZiBwcm9jZXNzb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBwcm9jZXNzb3IodHNsaWJfMS5fX2Fzc2lnbih7fSwgZXZlbnQpLCBoaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZpbmFsKSB7IHJldHVybiBfdGhpcy5fbm90aWZ5RXZlbnRQcm9jZXNzb3JzKHByb2Nlc3NvcnMsIGZpbmFsLCBoaW50LCBpbmRleCArIDEpLnRoZW4ocmVzb2x2ZSk7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX25vdGlmeUV2ZW50UHJvY2Vzc29ycyhwcm9jZXNzb3JzLCByZXN1bHQsIGhpbnQsIGluZGV4ICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRVc2VyID0gZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdGhpcy5fdXNlciA9IHVzZXIgfHwge307XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuc2V0VGFncyA9IGZ1bmN0aW9uICh0YWdzKSB7XG4gICAgICAgIHRoaXMuX3RhZ3MgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl90YWdzLCB0YWdzKTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRUYWcgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX3RhZ3MgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl90YWdzLCAoX2EgPSB7fSwgX2Fba2V5XSA9IHZhbHVlLCBfYSkpO1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnNldEV4dHJhcyA9IGZ1bmN0aW9uIChleHRyYXMpIHtcbiAgICAgICAgdGhpcy5fZXh0cmEgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSwgZXh0cmFzKTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRFeHRyYSA9IGZ1bmN0aW9uIChrZXksIGV4dHJhKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5fZXh0cmEgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSwgKF9hID0ge30sIF9hW2tleV0gPSBleHRyYSwgX2EpKTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRGaW5nZXJwcmludCA9IGZ1bmN0aW9uIChmaW5nZXJwcmludCkge1xuICAgICAgICB0aGlzLl9maW5nZXJwcmludCA9IGZpbmdlcnByaW50O1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgIHRoaXMuX2xldmVsID0gbGV2ZWw7XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuc2V0VHJhbnNhY3Rpb25OYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDYW4gYmUgcmVtb3ZlZCBpbiBtYWpvciB2ZXJzaW9uLlxuICAgICAqIEBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHtAbGluayB0aGlzLnNldFRyYW5zYWN0aW9uTmFtZX1cbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuc2V0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRUcmFuc2FjdGlvbk5hbWUobmFtZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRDb250ZXh0ID0gZnVuY3Rpb24gKGtleSwgY29udGV4dCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fY29udGV4dHMsIChfYSA9IHt9LCBfYVtrZXldID0gY29udGV4dCwgX2EpKTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRTcGFuID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgdGhpcy5fc3BhbiA9IHNwYW47XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuZ2V0U3BhbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwYW47XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNwYW4gPSB0aGlzLmdldFNwYW4oKTtcbiAgICAgICAgaWYgKHNwYW4gJiYgc3Bhbi5zcGFuUmVjb3JkZXIgJiYgc3Bhbi5zcGFuUmVjb3JkZXIuc3BhbnNbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiBzcGFuLnNwYW5SZWNvcmRlci5zcGFuc1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5oZXJpdCB2YWx1ZXMgZnJvbSB0aGUgcGFyZW50IHNjb3BlLlxuICAgICAqIEBwYXJhbSBzY29wZSB0byBjbG9uZS5cbiAgICAgKi9cbiAgICBTY29wZS5jbG9uZSA9IGZ1bmN0aW9uIChzY29wZSkge1xuICAgICAgICB2YXIgbmV3U2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgICAgICBuZXdTY29wZS5fYnJlYWRjcnVtYnMgPSB0c2xpYl8xLl9fc3ByZWFkKHNjb3BlLl9icmVhZGNydW1icyk7XG4gICAgICAgICAgICBuZXdTY29wZS5fdGFncyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHNjb3BlLl90YWdzKTtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9leHRyYSA9IHRzbGliXzEuX19hc3NpZ24oe30sIHNjb3BlLl9leHRyYSk7XG4gICAgICAgICAgICBuZXdTY29wZS5fY29udGV4dHMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCBzY29wZS5fY29udGV4dHMpO1xuICAgICAgICAgICAgbmV3U2NvcGUuX3VzZXIgPSBzY29wZS5fdXNlcjtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9sZXZlbCA9IHNjb3BlLl9sZXZlbDtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9zcGFuID0gc2NvcGUuX3NwYW47XG4gICAgICAgICAgICBuZXdTY29wZS5fdHJhbnNhY3Rpb25OYW1lID0gc2NvcGUuX3RyYW5zYWN0aW9uTmFtZTtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9maW5nZXJwcmludCA9IHNjb3BlLl9maW5nZXJwcmludDtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9ldmVudFByb2Nlc3NvcnMgPSB0c2xpYl8xLl9fc3ByZWFkKHNjb3BlLl9ldmVudFByb2Nlc3NvcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdTY29wZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChjYXB0dXJlQ29udGV4dCkge1xuICAgICAgICBpZiAoIWNhcHR1cmVDb250ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNhcHR1cmVDb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgdXBkYXRlZFNjb3BlID0gY2FwdHVyZUNvbnRleHQodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlZFNjb3BlIGluc3RhbmNlb2YgU2NvcGUgPyB1cGRhdGVkU2NvcGUgOiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXB0dXJlQ29udGV4dCBpbnN0YW5jZW9mIFNjb3BlKSB7XG4gICAgICAgICAgICB0aGlzLl90YWdzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fdGFncywgY2FwdHVyZUNvbnRleHQuX3RhZ3MpO1xuICAgICAgICAgICAgdGhpcy5fZXh0cmEgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSwgY2FwdHVyZUNvbnRleHQuX2V4dHJhKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHRzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fY29udGV4dHMsIGNhcHR1cmVDb250ZXh0Ll9jb250ZXh0cyk7XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX3VzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyID0gY2FwdHVyZUNvbnRleHQuX3VzZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX2xldmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGV2ZWwgPSBjYXB0dXJlQ29udGV4dC5fbGV2ZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX2ZpbmdlcnByaW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmluZ2VycHJpbnQgPSBjYXB0dXJlQ29udGV4dC5fZmluZ2VycHJpbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChjYXB0dXJlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1wYXJhbWV0ZXItcmVhc3NpZ25tZW50XG4gICAgICAgICAgICBjYXB0dXJlQ29udGV4dCA9IGNhcHR1cmVDb250ZXh0O1xuICAgICAgICAgICAgdGhpcy5fdGFncyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX3RhZ3MsIGNhcHR1cmVDb250ZXh0LnRhZ3MpO1xuICAgICAgICAgICAgdGhpcy5fZXh0cmEgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSwgY2FwdHVyZUNvbnRleHQuZXh0cmEpO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9jb250ZXh0cywgY2FwdHVyZUNvbnRleHQuY29udGV4dHMpO1xuICAgICAgICAgICAgaWYgKGNhcHR1cmVDb250ZXh0LnVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyID0gY2FwdHVyZUNvbnRleHQudXNlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5sZXZlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xldmVsID0gY2FwdHVyZUNvbnRleHQubGV2ZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUNvbnRleHQuZmluZ2VycHJpbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maW5nZXJwcmludCA9IGNhcHR1cmVDb250ZXh0LmZpbmdlcnByaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2JyZWFkY3J1bWJzID0gW107XG4gICAgICAgIHRoaXMuX3RhZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5fZXh0cmEgPSB7fTtcbiAgICAgICAgdGhpcy5fdXNlciA9IHt9O1xuICAgICAgICB0aGlzLl9jb250ZXh0cyA9IHt9O1xuICAgICAgICB0aGlzLl9sZXZlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9maW5nZXJwcmludCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc3BhbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5hZGRCcmVhZGNydW1iID0gZnVuY3Rpb24gKGJyZWFkY3J1bWIsIG1heEJyZWFkY3J1bWJzKSB7XG4gICAgICAgIHZhciBtZXJnZWRCcmVhZGNydW1iID0gdHNsaWJfMS5fX2Fzc2lnbih7IHRpbWVzdGFtcDogdGltZXN0YW1wV2l0aE1zKCkgfSwgYnJlYWRjcnVtYik7XG4gICAgICAgIHRoaXMuX2JyZWFkY3J1bWJzID1cbiAgICAgICAgICAgIG1heEJyZWFkY3J1bWJzICE9PSB1bmRlZmluZWQgJiYgbWF4QnJlYWRjcnVtYnMgPj0gMFxuICAgICAgICAgICAgICAgID8gdHNsaWJfMS5fX3NwcmVhZCh0aGlzLl9icmVhZGNydW1icywgW21lcmdlZEJyZWFkY3J1bWJdKS5zbGljZSgtbWF4QnJlYWRjcnVtYnMpXG4gICAgICAgICAgICAgICAgOiB0c2xpYl8xLl9fc3ByZWFkKHRoaXMuX2JyZWFkY3J1bWJzLCBbbWVyZ2VkQnJlYWRjcnVtYl0pO1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLmNsZWFyQnJlYWRjcnVtYnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2JyZWFkY3J1bWJzID0gW107XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBmaW5nZXJwcmludCBmcm9tIHRoZSBzY29wZSB0byB0aGUgZXZlbnQgaWYgdGhlcmUncyBvbmUsXG4gICAgICogdXNlcyBtZXNzYWdlIGlmIHRoZXJlJ3Mgb25lIGluc3RlYWQgb3IgZ2V0IHJpZCBvZiBlbXB0eSBmaW5nZXJwcmludFxuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5fYXBwbHlGaW5nZXJwcmludCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBhbiBhcnJheSBmaXJzdCBhbmQgd2UgYWN0dWFsbHkgaGF2ZSBzb21ldGhpbmcgaW4gcGxhY2VcbiAgICAgICAgZXZlbnQuZmluZ2VycHJpbnQgPSBldmVudC5maW5nZXJwcmludFxuICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGV2ZW50LmZpbmdlcnByaW50KVxuICAgICAgICAgICAgICAgID8gZXZlbnQuZmluZ2VycHJpbnRcbiAgICAgICAgICAgICAgICA6IFtldmVudC5maW5nZXJwcmludF1cbiAgICAgICAgICAgIDogW107XG4gICAgICAgIC8vIElmIHdlIGhhdmUgc29tZXRoaW5nIG9uIHRoZSBzY29wZSwgdGhlbiBtZXJnZSBpdCB3aXRoIGV2ZW50XG4gICAgICAgIGlmICh0aGlzLl9maW5nZXJwcmludCkge1xuICAgICAgICAgICAgZXZlbnQuZmluZ2VycHJpbnQgPSBldmVudC5maW5nZXJwcmludC5jb25jYXQodGhpcy5fZmluZ2VycHJpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGhhdmUgbm8gZGF0YSBhdCBhbGwsIHJlbW92ZSBlbXB0eSBhcnJheSBkZWZhdWx0XG4gICAgICAgIGlmIChldmVudC5maW5nZXJwcmludCAmJiAhZXZlbnQuZmluZ2VycHJpbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkZWxldGUgZXZlbnQuZmluZ2VycHJpbnQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgZmluZ2VycHJpbnQgdG8gdGhlIGV2ZW50LlxuICAgICAqIE5vdGUgdGhhdCBicmVhZGNydW1icyB3aWxsIGJlIGFkZGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQWxzbyBpZiB0aGUgZXZlbnQgaGFzIGFscmVhZHkgYnJlYWRjcnVtYnMgb24gaXQsIHdlIGRvIG5vdCBtZXJnZSB0aGVtLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudFxuICAgICAqIEBwYXJhbSBoaW50IE1heSBjb250YWluIGFkZGl0aW9uYWwgaW5mb3JtYXJ0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24uXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5hcHBseVRvRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGhpbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2V4dHJhICYmIE9iamVjdC5rZXlzKHRoaXMuX2V4dHJhKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV2ZW50LmV4dHJhID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fZXh0cmEsIGV2ZW50LmV4dHJhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdGFncyAmJiBPYmplY3Qua2V5cyh0aGlzLl90YWdzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV2ZW50LnRhZ3MgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl90YWdzLCBldmVudC50YWdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdXNlciAmJiBPYmplY3Qua2V5cyh0aGlzLl91c2VyKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV2ZW50LnVzZXIgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl91c2VyLCBldmVudC51c2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY29udGV4dHMgJiYgT2JqZWN0LmtleXModGhpcy5fY29udGV4dHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgZXZlbnQuY29udGV4dHMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9jb250ZXh0cywgZXZlbnQuY29udGV4dHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9sZXZlbCkge1xuICAgICAgICAgICAgZXZlbnQubGV2ZWwgPSB0aGlzLl9sZXZlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb25OYW1lKSB7XG4gICAgICAgICAgICBldmVudC50cmFuc2FjdGlvbiA9IHRoaXMuX3RyYW5zYWN0aW9uTmFtZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSB3YW50IHRvIHNldCB0aGUgdHJhY2UgY29udGV4dCBmb3Igbm9ybWFsIGV2ZW50cyBvbmx5IGlmIHRoZXJlIGlzbid0IGFscmVhZHlcbiAgICAgICAgLy8gYSB0cmFjZSBjb250ZXh0IG9uIHRoZSBldmVudC4gVGhlcmUgaXMgYSBwcm9kdWN0IGZlYXR1cmUgaW4gcGxhY2Ugd2hlcmUgd2UgbGlua1xuICAgICAgICAvLyBlcnJvcnMgd2l0aCB0cmFuc2FjdGlvbiBhbmQgaXQgcmVseXMgb24gdGhhdC5cbiAgICAgICAgaWYgKHRoaXMuX3NwYW4pIHtcbiAgICAgICAgICAgIGV2ZW50LmNvbnRleHRzID0gdHNsaWJfMS5fX2Fzc2lnbih7IHRyYWNlOiB0aGlzLl9zcGFuLmdldFRyYWNlQ29udGV4dCgpIH0sIGV2ZW50LmNvbnRleHRzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcHBseUZpbmdlcnByaW50KGV2ZW50KTtcbiAgICAgICAgZXZlbnQuYnJlYWRjcnVtYnMgPSB0c2xpYl8xLl9fc3ByZWFkKChldmVudC5icmVhZGNydW1icyB8fCBbXSksIHRoaXMuX2JyZWFkY3J1bWJzKTtcbiAgICAgICAgZXZlbnQuYnJlYWRjcnVtYnMgPSBldmVudC5icmVhZGNydW1icy5sZW5ndGggPiAwID8gZXZlbnQuYnJlYWRjcnVtYnMgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub3RpZnlFdmVudFByb2Nlc3NvcnModHNsaWJfMS5fX3NwcmVhZChnZXRHbG9iYWxFdmVudFByb2Nlc3NvcnMoKSwgdGhpcy5fZXZlbnRQcm9jZXNzb3JzKSwgZXZlbnQsIGhpbnQpO1xuICAgIH07XG4gICAgcmV0dXJuIFNjb3BlO1xufSgpKTtcbmV4cG9ydCB7IFNjb3BlIH07XG4vKipcbiAqIFJldHJ1bnMgdGhlIGdsb2JhbCBldmVudCBwcm9jZXNzb3JzLlxuICovXG5mdW5jdGlvbiBnZXRHbG9iYWxFdmVudFByb2Nlc3NvcnMoKSB7XG4gICAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICAgIGdsb2JhbC5fX1NFTlRSWV9fID0gZ2xvYmFsLl9fU0VOVFJZX18gfHwge307XG4gICAgZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzID0gZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzIHx8IFtdO1xuICAgIHJldHVybiBnbG9iYWwuX19TRU5UUllfXy5nbG9iYWxFdmVudFByb2Nlc3NvcnM7XG59XG4vKipcbiAqIEFkZCBhIEV2ZW50UHJvY2Vzc29yIHRvIGJlIGtlcHQgZ2xvYmFsbHkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgRXZlbnRQcm9jZXNzb3IgdG8gYWRkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihjYWxsYmFjaykge1xuICAgIGdldEdsb2JhbEV2ZW50UHJvY2Vzc29ycygpLnB1c2goY2FsbGJhY2spO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2NvcGUuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG4vKipcbiAqIFRoaXMgY2FsbHMgYSBmdW5jdGlvbiBvbiB0aGUgY3VycmVudCBodWIuXG4gKiBAcGFyYW0gbWV0aG9kIGZ1bmN0aW9uIHRvIGNhbGwgb24gaHViLlxuICogQHBhcmFtIGFyZ3MgdG8gcGFzcyB0byBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FsbE9uSHViKG1ldGhvZCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgICBpZiAoaHViICYmIGh1YlttZXRob2RdKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnNhZmUtYW55XG4gICAgICAgIHJldHVybiBodWJbbWV0aG9kXS5hcHBseShodWIsIHRzbGliXzEuX19zcHJlYWQoYXJncykpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBodWIgZGVmaW5lZCBvciBcIiArIG1ldGhvZCArIFwiIHdhcyBub3QgZm91bmQgb24gdGhlIGh1YiwgcGxlYXNlIG9wZW4gYSBidWcgcmVwb3J0LlwiKTtcbn1cbi8qKlxuICogQ2FwdHVyZXMgYW4gZXhjZXB0aW9uIGV2ZW50IGFuZCBzZW5kcyBpdCB0byBTZW50cnkuXG4gKlxuICogQHBhcmFtIGV4Y2VwdGlvbiBBbiBleGNlcHRpb24tbGlrZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIGV2ZW50SWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlRXhjZXB0aW9uKGV4Y2VwdGlvbiwgY2FwdHVyZUNvbnRleHQpIHtcbiAgICB2YXIgc3ludGhldGljRXhjZXB0aW9uO1xuICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbicpO1xuICAgIH1cbiAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZUV4Y2VwdGlvbicsIGV4Y2VwdGlvbiwge1xuICAgICAgICBjYXB0dXJlQ29udGV4dDogY2FwdHVyZUNvbnRleHQsXG4gICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBleGNlcHRpb24sXG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbjogc3ludGhldGljRXhjZXB0aW9uLFxuICAgIH0pO1xufVxuLyoqXG4gKiBDYXB0dXJlcyBhIG1lc3NhZ2UgZXZlbnQgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIFNlbnRyeS5cbiAqIEBwYXJhbSBsZXZlbCBEZWZpbmUgdGhlIGxldmVsIG9mIHRoZSBtZXNzYWdlLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBldmVudElkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZU1lc3NhZ2UobWVzc2FnZSwgY2FwdHVyZUNvbnRleHQpIHtcbiAgICB2YXIgc3ludGhldGljRXhjZXB0aW9uO1xuICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgZXhwbGljaXQgc2NvcGVzIHVwZ3JhZGUsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG9yaWdpbmFsXG4gICAgLy8gYXJyaXR5IG9mIHRoZSBgY2FwdHVyZU1lc3NhZ2UobWVzc2FnZSwgbGV2ZWwpYCBtZXRob2QuXG4gICAgdmFyIGxldmVsID0gdHlwZW9mIGNhcHR1cmVDb250ZXh0ID09PSAnc3RyaW5nJyA/IGNhcHR1cmVDb250ZXh0IDogdW5kZWZpbmVkO1xuICAgIHZhciBjb250ZXh0ID0gdHlwZW9mIGNhcHR1cmVDb250ZXh0ICE9PSAnc3RyaW5nJyA/IHsgY2FwdHVyZUNvbnRleHQ6IGNhcHR1cmVDb250ZXh0IH0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZU1lc3NhZ2UnLCBtZXNzYWdlLCBsZXZlbCwgdHNsaWJfMS5fX2Fzc2lnbih7IG9yaWdpbmFsRXhjZXB0aW9uOiBtZXNzYWdlLCBzeW50aGV0aWNFeGNlcHRpb246IHN5bnRoZXRpY0V4Y2VwdGlvbiB9LCBjb250ZXh0KSk7XG59XG4vKipcbiAqIENhcHR1cmVzIGEgbWFudWFsbHkgY3JlYXRlZCBldmVudCBhbmQgc2VuZHMgaXQgdG8gU2VudHJ5LlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCB0byBTZW50cnkuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIGV2ZW50SWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlRXZlbnQoZXZlbnQpIHtcbiAgICByZXR1cm4gY2FsbE9uSHViKCdjYXB0dXJlRXZlbnQnLCBldmVudCk7XG59XG4vKipcbiAqIENhbGxiYWNrIHRvIHNldCBjb250ZXh0IGluZm9ybWF0aW9uIG9udG8gdGhlIHNjb3BlLlxuICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgU2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVTY29wZShjYWxsYmFjaykge1xuICAgIGNhbGxPbkh1YignY29uZmlndXJlU2NvcGUnLCBjYWxsYmFjayk7XG59XG4vKipcbiAqIFJlY29yZHMgYSBuZXcgYnJlYWRjcnVtYiB3aGljaCB3aWxsIGJlIGF0dGFjaGVkIHRvIGZ1dHVyZSBldmVudHMuXG4gKlxuICogQnJlYWRjcnVtYnMgd2lsbCBiZSBhZGRlZCB0byBzdWJzZXF1ZW50IGV2ZW50cyB0byBwcm92aWRlIG1vcmUgY29udGV4dCBvblxuICogdXNlcidzIGFjdGlvbnMgcHJpb3IgdG8gYW4gZXJyb3Igb3IgY3Jhc2guXG4gKlxuICogQHBhcmFtIGJyZWFkY3J1bWIgVGhlIGJyZWFkY3J1bWIgdG8gcmVjb3JkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQnJlYWRjcnVtYihicmVhZGNydW1iKSB7XG4gICAgY2FsbE9uSHViKCdhZGRCcmVhZGNydW1iJywgYnJlYWRjcnVtYik7XG59XG4vKipcbiAqIFNldHMgY29udGV4dCBkYXRhIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gKiBAcGFyYW0gbmFtZSBvZiB0aGUgY29udGV4dFxuICogQHBhcmFtIGNvbnRleHQgQW55IGtpbmQgb2YgZGF0YS4gVGhpcyBkYXRhIHdpbGwgYmUgbm9ybWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRleHQobmFtZSwgY29udGV4dCkge1xuICAgIGNhbGxPbkh1Yignc2V0Q29udGV4dCcsIG5hbWUsIGNvbnRleHQpO1xufVxuLyoqXG4gKiBTZXQgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBtZXJnZWQgc2VudCBhcyBleHRyYSBkYXRhIHdpdGggdGhlIGV2ZW50LlxuICogQHBhcmFtIGV4dHJhcyBFeHRyYXMgb2JqZWN0IHRvIG1lcmdlIGludG8gY3VycmVudCBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RXh0cmFzKGV4dHJhcykge1xuICAgIGNhbGxPbkh1Yignc2V0RXh0cmFzJywgZXh0cmFzKTtcbn1cbi8qKlxuICogU2V0IGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgbWVyZ2VkIHNlbnQgYXMgdGFncyBkYXRhIHdpdGggdGhlIGV2ZW50LlxuICogQHBhcmFtIHRhZ3MgVGFncyBjb250ZXh0IG9iamVjdCB0byBtZXJnZSBpbnRvIGN1cnJlbnQgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRhZ3ModGFncykge1xuICAgIGNhbGxPbkh1Yignc2V0VGFncycsIHRhZ3MpO1xufVxuLyoqXG4gKiBTZXQga2V5OnZhbHVlIHRoYXQgd2lsbCBiZSBzZW50IGFzIGV4dHJhIGRhdGEgd2l0aCB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ga2V5IFN0cmluZyBvZiBleHRyYVxuICogQHBhcmFtIGV4dHJhIEFueSBraW5kIG9mIGRhdGEuIFRoaXMgZGF0YSB3aWxsIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRFeHRyYShrZXksIGV4dHJhKSB7XG4gICAgY2FsbE9uSHViKCdzZXRFeHRyYScsIGtleSwgZXh0cmEpO1xufVxuLyoqXG4gKiBTZXQga2V5OnZhbHVlIHRoYXQgd2lsbCBiZSBzZW50IGFzIHRhZ3MgZGF0YSB3aXRoIHRoZSBldmVudC5cbiAqIEBwYXJhbSBrZXkgU3RyaW5nIGtleSBvZiB0YWdcbiAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcgdmFsdWUgb2YgdGFnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUYWcoa2V5LCB2YWx1ZSkge1xuICAgIGNhbGxPbkh1Yignc2V0VGFnJywga2V5LCB2YWx1ZSk7XG59XG4vKipcbiAqIFVwZGF0ZXMgdXNlciBjb250ZXh0IGluZm9ybWF0aW9uIGZvciBmdXR1cmUgZXZlbnRzLlxuICpcbiAqIEBwYXJhbSB1c2VyIFVzZXIgY29udGV4dCBvYmplY3QgdG8gYmUgc2V0IGluIHRoZSBjdXJyZW50IGNvbnRleHQuIFBhc3MgYG51bGxgIHRvIHVuc2V0IHRoZSB1c2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VXNlcih1c2VyKSB7XG4gICAgY2FsbE9uSHViKCdzZXRVc2VyJywgdXNlcik7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgc2NvcGUgd2l0aCBhbmQgZXhlY3V0ZXMgdGhlIGdpdmVuIG9wZXJhdGlvbiB3aXRoaW4uXG4gKiBUaGUgc2NvcGUgaXMgYXV0b21hdGljYWxseSByZW1vdmVkIG9uY2UgdGhlIG9wZXJhdGlvblxuICogZmluaXNoZXMgb3IgdGhyb3dzLlxuICpcbiAqIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3I6XG4gKlxuICogICAgIHB1c2hTY29wZSgpO1xuICogICAgIGNhbGxiYWNrKCk7XG4gKiAgICAgcG9wU2NvcGUoKTtcbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGVuY2xvc2VkIGludG8gcHVzaC9wb3BTY29wZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTY29wZShjYWxsYmFjaykge1xuICAgIGNhbGxPbkh1Yignd2l0aFNjb3BlJywgY2FsbGJhY2spO1xufVxuLyoqXG4gKiBDYWxscyBhIGZ1bmN0aW9uIG9uIHRoZSBsYXRlc3QgY2xpZW50LiBVc2UgdGhpcyB3aXRoIGNhdXRpb24sIGl0J3MgbWVhbnQgYXNcbiAqIGluIFwiaW50ZXJuYWxcIiBoZWxwZXIgc28gd2UgZG9uJ3QgbmVlZCB0byBleHBvc2UgZXZlcnkgcG9zc2libGUgZnVuY3Rpb24gaW5cbiAqIHRoZSBzaGltLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZSBjbGllbnQgYWN0dWFsbHkgaW1wbGVtZW50cyB0aGVcbiAqIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSBjbGllbnQvY2xpZW50LlxuICogQHBhcmFtIGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNsaWVudC9mb250ZW5kLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gX2NhbGxPbkNsaWVudChtZXRob2QpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIGNhbGxPbkh1Yi5hcHBseSh2b2lkIDAsIHRzbGliXzEuX19zcHJlYWQoWydfaW52b2tlQ2xpZW50JywgbWV0aG9kXSwgYXJncykpO1xufVxuLyoqXG4gKiBTdGFydHMgYSBuZXcgYFRyYW5zYWN0aW9uYCBhbmQgcmV0dXJucyBpdC4gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgdG8gbWFudWFsXG4gKiB0cmFjaW5nIGluc3RydW1lbnRhdGlvbi5cbiAqXG4gKiBBIHRyZWUgc3RydWN0dXJlIGNhbiBiZSBidWlsdCBieSBhZGRpbmcgY2hpbGQgc3BhbnMgdG8gdGhlIHRyYW5zYWN0aW9uLCBhbmRcbiAqIGNoaWxkIHNwYW5zIHRvIG90aGVyIHNwYW5zLiBUbyBzdGFydCBhIG5ldyBjaGlsZCBzcGFuIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAqIG9yIGFueSBzcGFuLCBjYWxsIHRoZSByZXNwZWN0aXZlIGAuc3RhcnRDaGlsZCgpYCBtZXRob2QuXG4gKlxuICogRXZlcnkgY2hpbGQgc3BhbiBtdXN0IGJlIGZpbmlzaGVkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsXG4gKiBvdGhlcndpc2UgdGhlIHVuZmluaXNoZWQgc3BhbnMgYXJlIGRpc2NhcmRlZC5cbiAqXG4gKiBUaGUgdHJhbnNhY3Rpb24gbXVzdCBiZSBmaW5pc2hlZCB3aXRoIGEgY2FsbCB0byBpdHMgYC5maW5pc2goKWAgbWV0aG9kLCBhdFxuICogd2hpY2ggcG9pbnQgdGhlIHRyYW5zYWN0aW9uIHdpdGggYWxsIGl0cyBmaW5pc2hlZCBjaGlsZCBzcGFucyB3aWxsIGJlIHNlbnQgdG9cbiAqIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCBQcm9wZXJ0aWVzIG9mIHRoZSBuZXcgYFRyYW5zYWN0aW9uYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oY29udGV4dCkge1xuICAgIHJldHVybiBjYWxsT25IdWIoJ3N0YXJ0VHJhbnNhY3Rpb24nLCB0c2xpYl8xLl9fYXNzaWduKHt9LCBjb250ZXh0KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJy4vbG9nbGV2ZWwnO1xuZXhwb3J0IHsgU2V2ZXJpdHkgfSBmcm9tICcuL3NldmVyaXR5JztcbmV4cG9ydCB7IFN0YXR1cyB9IGZyb20gJy4vc3RhdHVzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKiBDb25zb2xlIGxvZ2dpbmcgdmVyYm9zaXR5IGZvciB0aGUgU0RLLiAqL1xuZXhwb3J0IHZhciBMb2dMZXZlbDtcbihmdW5jdGlvbiAoTG9nTGV2ZWwpIHtcbiAgICAvKiogTm8gbG9ncyB3aWxsIGJlIGdlbmVyYXRlZC4gKi9cbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIk5vbmVcIl0gPSAwXSA9IFwiTm9uZVwiO1xuICAgIC8qKiBPbmx5IFNESyBpbnRlcm5hbCBlcnJvcnMgd2lsbCBiZSBsb2dnZWQuICovXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJFcnJvclwiXSA9IDFdID0gXCJFcnJvclwiO1xuICAgIC8qKiBJbmZvcm1hdGlvbiB1c2VmdWwgZm9yIGRlYnVnZ2luZyB0aGUgU0RLIHdpbGwgYmUgbG9nZ2VkLiAqL1xuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiRGVidWdcIl0gPSAyXSA9IFwiRGVidWdcIjtcbiAgICAvKiogQWxsIFNESyBhY3Rpb25zIHdpbGwgYmUgbG9nZ2VkLiAqL1xuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShMb2dMZXZlbCB8fCAoTG9nTGV2ZWwgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nbGV2ZWwuanMubWFwIiwiLyoqIEpTRG9jICovXG5leHBvcnQgdmFyIFNldmVyaXR5O1xuKGZ1bmN0aW9uIChTZXZlcml0eSkge1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFNldmVyaXR5W1wiRmF0YWxcIl0gPSBcImZhdGFsXCI7XG4gICAgLyoqIEpTRG9jICovXG4gICAgU2V2ZXJpdHlbXCJFcnJvclwiXSA9IFwiZXJyb3JcIjtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTZXZlcml0eVtcIldhcm5pbmdcIl0gPSBcIndhcm5pbmdcIjtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTZXZlcml0eVtcIkxvZ1wiXSA9IFwibG9nXCI7XG4gICAgLyoqIEpTRG9jICovXG4gICAgU2V2ZXJpdHlbXCJJbmZvXCJdID0gXCJpbmZvXCI7XG4gICAgLyoqIEpTRG9jICovXG4gICAgU2V2ZXJpdHlbXCJEZWJ1Z1wiXSA9IFwiZGVidWdcIjtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTZXZlcml0eVtcIkNyaXRpY2FsXCJdID0gXCJjcml0aWNhbFwiO1xufSkoU2V2ZXJpdHkgfHwgKFNldmVyaXR5ID0ge30pKTtcbi8vIHRzbGludDpkaXNhYmxlOmNvbXBsZXRlZC1kb2NzXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby11bm5lY2Vzc2FyeS1xdWFsaWZpZXIgbm8tbmFtZXNwYWNlXG4oZnVuY3Rpb24gKFNldmVyaXR5KSB7XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSBzdHJpbmctYmFzZWQgbGV2ZWwgaW50byBhIHtAbGluayBTZXZlcml0eX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFNldmVyaXR5XG4gICAgICogQHJldHVybnMgU2V2ZXJpdHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKGxldmVsKSB7XG4gICAgICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RlYnVnJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V2ZXJpdHkuRGVidWc7XG4gICAgICAgICAgICBjYXNlICdpbmZvJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V2ZXJpdHkuSW5mbztcbiAgICAgICAgICAgIGNhc2UgJ3dhcm4nOlxuICAgICAgICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldmVyaXR5LkVycm9yO1xuICAgICAgICAgICAgY2FzZSAnZmF0YWwnOlxuICAgICAgICAgICAgICAgIHJldHVybiBTZXZlcml0eS5GYXRhbDtcbiAgICAgICAgICAgIGNhc2UgJ2NyaXRpY2FsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V2ZXJpdHkuQ3JpdGljYWw7XG4gICAgICAgICAgICBjYXNlICdsb2cnOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V2ZXJpdHkuTG9nO1xuICAgICAgICB9XG4gICAgfVxuICAgIFNldmVyaXR5LmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xufSkoU2V2ZXJpdHkgfHwgKFNldmVyaXR5ID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNldmVyaXR5LmpzLm1hcCIsIi8qKiBUaGUgc3RhdHVzIG9mIGFuIGV2ZW50LiAqL1xuZXhwb3J0IHZhciBTdGF0dXM7XG4oZnVuY3Rpb24gKFN0YXR1cykge1xuICAgIC8qKiBUaGUgc3RhdHVzIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLiAqL1xuICAgIFN0YXR1c1tcIlVua25vd25cIl0gPSBcInVua25vd25cIjtcbiAgICAvKiogVGhlIGV2ZW50IHdhcyBza2lwcGVkIGR1ZSB0byBjb25maWd1cmF0aW9uIG9yIGNhbGxiYWNrcy4gKi9cbiAgICBTdGF0dXNbXCJTa2lwcGVkXCJdID0gXCJza2lwcGVkXCI7XG4gICAgLyoqIFRoZSBldmVudCB3YXMgc2VudCB0byBTZW50cnkgc3VjY2Vzc2Z1bGx5LiAqL1xuICAgIFN0YXR1c1tcIlN1Y2Nlc3NcIl0gPSBcInN1Y2Nlc3NcIjtcbiAgICAvKiogVGhlIGNsaWVudCBpcyBjdXJyZW50bHkgcmF0ZSBsaW1pdGVkIGFuZCB3aWxsIHRyeSBhZ2FpbiBsYXRlci4gKi9cbiAgICBTdGF0dXNbXCJSYXRlTGltaXRcIl0gPSBcInJhdGVfbGltaXRcIjtcbiAgICAvKiogVGhlIGV2ZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuICovXG4gICAgU3RhdHVzW1wiSW52YWxpZFwiXSA9IFwiaW52YWxpZFwiO1xuICAgIC8qKiBBIHNlcnZlci1zaWRlIGVycm9yIG9jdXJyZWQgZHVyaW5nIHN1Ym1pc3Npb24uICovXG4gICAgU3RhdHVzW1wiRmFpbGVkXCJdID0gXCJmYWlsZWRcIjtcbn0pKFN0YXR1cyB8fCAoU3RhdHVzID0ge30pKTtcbi8vIHRzbGludDpkaXNhYmxlOmNvbXBsZXRlZC1kb2NzXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby11bm5lY2Vzc2FyeS1xdWFsaWZpZXIgbm8tbmFtZXNwYWNlXG4oZnVuY3Rpb24gKFN0YXR1cykge1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgSFRUUCBzdGF0dXMgY29kZSBpbnRvIGEge0BsaW5rIFN0YXR1c30uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29kZSBUaGUgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgc2VuZCBzdGF0dXMgb3Ige0BsaW5rIFN0YXR1cy5Vbmtub3dufS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tSHR0cENvZGUoY29kZSkge1xuICAgICAgICBpZiAoY29kZSA+PSAyMDAgJiYgY29kZSA8IDMwMCkge1xuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5TdWNjZXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID09PSA0MjkpIHtcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuUmF0ZUxpbWl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID49IDQwMCAmJiBjb2RlIDwgNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkludmFsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUgPj0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZhaWxlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RhdHVzLlVua25vd247XG4gICAgfVxuICAgIFN0YXR1cy5mcm9tSHR0cENvZGUgPSBmcm9tSHR0cENvZGU7XG59KShTdGF0dXMgfHwgKFN0YXR1cyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGF0dXMuanMubWFwIiwiLyoqXG4gKiBDb25zdW1lcyB0aGUgcHJvbWlzZSBhbmQgbG9ncyB0aGUgZXJyb3Igd2hlbiBpdCByZWplY3RzLlxuICogQHBhcmFtIHByb21pc2UgQSBwcm9taXNlIHRvIGZvcmdldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcmdldChwcm9taXNlKSB7XG4gICAgcHJvbWlzZS50aGVuKG51bGwsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIC8vIFRPRE86IFVzZSBhIGJldHRlciBsb2dnaW5nIG1lY2hhbmlzbVxuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXN5bmMuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFNlbnRyeUVycm9yIH0gZnJvbSAnLi9lcnJvcic7XG4vKiogUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gcGFyc2UgYSBEc24uICovXG52YXIgRFNOX1JFR0VYID0gL14oPzooXFx3Kyk6KVxcL1xcLyg/OihcXHcrKSg/OjooXFx3KykpP0ApKFtcXHdcXC4tXSspKD86OihcXGQrKSk/XFwvKC4rKS87XG4vKiogRXJyb3IgbWVzc2FnZSAqL1xudmFyIEVSUk9SX01FU1NBR0UgPSAnSW52YWxpZCBEc24nO1xuLyoqIFRoZSBTZW50cnkgRHNuLCBpZGVudGlmeWluZyBhIFNlbnRyeSBpbnN0YW5jZSBhbmQgcHJvamVjdC4gKi9cbnZhciBEc24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgRHNuIGNvbXBvbmVudCAqL1xuICAgIGZ1bmN0aW9uIERzbihmcm9tKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zyb21TdHJpbmcoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mcm9tQ29tcG9uZW50cyhmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92YWxpZGF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEc24uXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgcmVuZGVyIHRoZSBwdWJsaWMgcmVwcmVzZW50YXRpb24gd2l0aG91dCB0aGUgcGFzc3dvcmRcbiAgICAgKiBjb21wb25lbnQuIFRvIGdldCB0aGUgZGVwcmVjYXRlZCBwcml2YXRlIHJlcHJlc2VudGF0aW9uLCBzZXQgYHdpdGhQYXNzd29yZGBcbiAgICAgKiB0byB0cnVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpdGhQYXNzd29yZCBXaGVuIHNldCB0byB0cnVlLCB0aGUgcGFzc3dvcmQgd2lsbCBiZSBpbmNsdWRlZC5cbiAgICAgKi9cbiAgICBEc24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKHdpdGhQYXNzd29yZCkge1xuICAgICAgICBpZiAod2l0aFBhc3N3b3JkID09PSB2b2lkIDApIHsgd2l0aFBhc3N3b3JkID0gZmFsc2U7IH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXRoaXMtYXNzaWdubWVudFxuICAgICAgICB2YXIgX2EgPSB0aGlzLCBob3N0ID0gX2EuaG9zdCwgcGF0aCA9IF9hLnBhdGgsIHBhc3MgPSBfYS5wYXNzLCBwb3J0ID0gX2EucG9ydCwgcHJvamVjdElkID0gX2EucHJvamVjdElkLCBwcm90b2NvbCA9IF9hLnByb3RvY29sLCB1c2VyID0gX2EudXNlcjtcbiAgICAgICAgcmV0dXJuIChwcm90b2NvbCArIFwiOi8vXCIgKyB1c2VyICsgKHdpdGhQYXNzd29yZCAmJiBwYXNzID8gXCI6XCIgKyBwYXNzIDogJycpICtcbiAgICAgICAgICAgIChcIkBcIiArIGhvc3QgKyAocG9ydCA/IFwiOlwiICsgcG9ydCA6ICcnKSArIFwiL1wiICsgKHBhdGggPyBwYXRoICsgXCIvXCIgOiBwYXRoKSArIHByb2plY3RJZCkpO1xuICAgIH07XG4gICAgLyoqIFBhcnNlcyBhIHN0cmluZyBpbnRvIHRoaXMgRHNuLiAqL1xuICAgIERzbi5wcm90b3R5cGUuX2Zyb21TdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IERTTl9SRUdFWC5leGVjKHN0cik7XG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihFUlJPUl9NRVNTQUdFKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSB0c2xpYl8xLl9fcmVhZChtYXRjaC5zbGljZSgxKSwgNiksIHByb3RvY29sID0gX2FbMF0sIHVzZXIgPSBfYVsxXSwgX2IgPSBfYVsyXSwgcGFzcyA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iLCBob3N0ID0gX2FbM10sIF9jID0gX2FbNF0sIHBvcnQgPSBfYyA9PT0gdm9pZCAwID8gJycgOiBfYywgbGFzdFBhdGggPSBfYVs1XTtcbiAgICAgICAgdmFyIHBhdGggPSAnJztcbiAgICAgICAgdmFyIHByb2plY3RJZCA9IGxhc3RQYXRoO1xuICAgICAgICB2YXIgc3BsaXQgPSBwcm9qZWN0SWQuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHBhdGggPSBzcGxpdC5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgICAgICAgcHJvamVjdElkID0gc3BsaXQucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3RJZCkge1xuICAgICAgICAgICAgdmFyIHByb2plY3RNYXRjaCA9IHByb2plY3RJZC5tYXRjaCgvXlxcZCsvKTtcbiAgICAgICAgICAgIGlmIChwcm9qZWN0TWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0SWQgPSBwcm9qZWN0TWF0Y2hbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZnJvbUNvbXBvbmVudHMoeyBob3N0OiBob3N0LCBwYXNzOiBwYXNzLCBwYXRoOiBwYXRoLCBwcm9qZWN0SWQ6IHByb2plY3RJZCwgcG9ydDogcG9ydCwgcHJvdG9jb2w6IHByb3RvY29sLCB1c2VyOiB1c2VyIH0pO1xuICAgIH07XG4gICAgLyoqIE1hcHMgRHNuIGNvbXBvbmVudHMgaW50byB0aGlzIGluc3RhbmNlLiAqL1xuICAgIERzbi5wcm90b3R5cGUuX2Zyb21Db21wb25lbnRzID0gZnVuY3Rpb24gKGNvbXBvbmVudHMpIHtcbiAgICAgICAgdGhpcy5wcm90b2NvbCA9IGNvbXBvbmVudHMucHJvdG9jb2w7XG4gICAgICAgIHRoaXMudXNlciA9IGNvbXBvbmVudHMudXNlcjtcbiAgICAgICAgdGhpcy5wYXNzID0gY29tcG9uZW50cy5wYXNzIHx8ICcnO1xuICAgICAgICB0aGlzLmhvc3QgPSBjb21wb25lbnRzLmhvc3Q7XG4gICAgICAgIHRoaXMucG9ydCA9IGNvbXBvbmVudHMucG9ydCB8fCAnJztcbiAgICAgICAgdGhpcy5wYXRoID0gY29tcG9uZW50cy5wYXRoIHx8ICcnO1xuICAgICAgICB0aGlzLnByb2plY3RJZCA9IGNvbXBvbmVudHMucHJvamVjdElkO1xuICAgIH07XG4gICAgLyoqIFZhbGlkYXRlcyB0aGlzIERzbiBhbmQgdGhyb3dzIG9uIGVycm9yLiAqL1xuICAgIERzbi5wcm90b3R5cGUuX3ZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBbJ3Byb3RvY29sJywgJ3VzZXInLCAnaG9zdCcsICdwcm9qZWN0SWQnXS5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGlmICghX3RoaXNbY29tcG9uZW50XSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihFUlJPUl9NRVNTQUdFICsgXCI6IFwiICsgY29tcG9uZW50ICsgXCIgbWlzc2luZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5wcm9qZWN0SWQubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoRVJST1JfTUVTU0FHRSArIFwiOiBJbnZhbGlkIHByb2plY3RJZCBcIiArIHRoaXMucHJvamVjdElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm90b2NvbCAhPT0gJ2h0dHAnICYmIHRoaXMucHJvdG9jb2wgIT09ICdodHRwcycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihFUlJPUl9NRVNTQUdFICsgXCI6IEludmFsaWQgcHJvdG9jb2wgXCIgKyB0aGlzLnByb3RvY29sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3J0ICYmIGlzTmFOKHBhcnNlSW50KHRoaXMucG9ydCwgMTApKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKEVSUk9SX01FU1NBR0UgKyBcIjogSW52YWxpZCBwb3J0IFwiICsgdGhpcy5wb3J0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERzbjtcbn0oKSk7XG5leHBvcnQgeyBEc24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRzbi5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgc2V0UHJvdG90eXBlT2YgfSBmcm9tICcuL3BvbHlmaWxsJztcbi8qKiBBbiBlcnJvciBlbWl0dGVkIGJ5IFNlbnRyeSBTREtzIGFuZCByZWxhdGVkIHV0aWxpdGllcy4gKi9cbnZhciBTZW50cnlFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhTZW50cnlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTZW50cnlFcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXVuc2FmZS1hbnlcbiAgICAgICAgX3RoaXMubmFtZSA9IF9uZXdUYXJnZXQucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIHNldFByb3RvdHlwZU9mKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFNlbnRyeUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgU2VudHJ5RXJyb3IgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9yLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vYXN5bmMnO1xuZXhwb3J0ICogZnJvbSAnLi9lcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL2lzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVtbyc7XG5leHBvcnQgKiBmcm9tICcuL21pc2MnO1xuZXhwb3J0ICogZnJvbSAnLi9vYmplY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXRoJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvbWlzZWJ1ZmZlcic7XG5leHBvcnQgKiBmcm9tICcuL3N0cmluZyc7XG5leHBvcnQgKiBmcm9tICcuL3N1cHBvcnRzJztcbmV4cG9ydCAqIGZyb20gJy4vc3luY3Byb21pc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnN0cnVtZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZHNuJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qIHRzbGludDpkaXNhYmxlOm9ubHktYXJyb3ctZnVuY3Rpb25zIG5vLXVuc2FmZS1hbnkgKi9cbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBpc0luc3RhbmNlT2YsIGlzU3RyaW5nIH0gZnJvbSAnLi9pcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbk5hbWUsIGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vbWlzYyc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9vYmplY3QnO1xuaW1wb3J0IHsgc3VwcG9ydHNIaXN0b3J5LCBzdXBwb3J0c05hdGl2ZUZldGNoIH0gZnJvbSAnLi9zdXBwb3J0cyc7XG52YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4vKipcbiAqIEluc3RydW1lbnQgbmF0aXZlIEFQSXMgdG8gY2FsbCBoYW5kbGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBicmVhZGNydW1icywgQVBNIHNwYW5zIGV0Yy5cbiAqICAtIENvbnNvbGUgQVBJXG4gKiAgLSBGZXRjaCBBUElcbiAqICAtIFhIUiBBUElcbiAqICAtIEhpc3RvcnkgQVBJXG4gKiAgLSBET00gQVBJIChjbGljay90eXBpbmcpXG4gKiAgLSBFcnJvciBBUElcbiAqICAtIFVuaGFuZGxlZFJlamVjdGlvbiBBUElcbiAqL1xudmFyIGhhbmRsZXJzID0ge307XG52YXIgaW5zdHJ1bWVudGVkID0ge307XG4vKiogSW5zdHJ1bWVudHMgZ2l2ZW4gQVBJICovXG5mdW5jdGlvbiBpbnN0cnVtZW50KHR5cGUpIHtcbiAgICBpZiAoaW5zdHJ1bWVudGVkW3R5cGVdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5zdHJ1bWVudGVkW3R5cGVdID0gdHJ1ZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnY29uc29sZSc6XG4gICAgICAgICAgICBpbnN0cnVtZW50Q29uc29sZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RvbSc6XG4gICAgICAgICAgICBpbnN0cnVtZW50RE9NKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneGhyJzpcbiAgICAgICAgICAgIGluc3RydW1lbnRYSFIoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmZXRjaCc6XG4gICAgICAgICAgICBpbnN0cnVtZW50RmV0Y2goKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdoaXN0b3J5JzpcbiAgICAgICAgICAgIGluc3RydW1lbnRIaXN0b3J5KCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgaW5zdHJ1bWVudEVycm9yKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndW5oYW5kbGVkcmVqZWN0aW9uJzpcbiAgICAgICAgICAgIGluc3RydW1lbnRVbmhhbmRsZWRSZWplY3Rpb24oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ3Vua25vd24gaW5zdHJ1bWVudGF0aW9uIHR5cGU6JywgdHlwZSk7XG4gICAgfVxufVxuLyoqXG4gKiBBZGQgaGFuZGxlciB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gZ2l2ZW4gdHlwZSBvZiBpbnN0cnVtZW50YXRpb24gdHJpZ2dlcnMuXG4gKiBVc2UgYXQgeW91ciBvd24gcmlzaywgdGhpcyBtaWdodCBicmVhayB3aXRob3V0IGNoYW5nZWxvZyBub3RpY2UsIG9ubHkgdXNlZCBpbnRlcm5hbGx5LlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICBpZiAoIWhhbmRsZXIgfHwgdHlwZW9mIGhhbmRsZXIudHlwZSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGhhbmRsZXIuY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoYW5kbGVyc1toYW5kbGVyLnR5cGVdID0gaGFuZGxlcnNbaGFuZGxlci50eXBlXSB8fCBbXTtcbiAgICBoYW5kbGVyc1toYW5kbGVyLnR5cGVdLnB1c2goaGFuZGxlci5jYWxsYmFjayk7XG4gICAgaW5zdHJ1bWVudChoYW5kbGVyLnR5cGUpO1xufVxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiB0cmlnZ2VySGFuZGxlcnModHlwZSwgZGF0YSkge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIGlmICghdHlwZSB8fCAhaGFuZGxlcnNbdHlwZV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfYiA9IHRzbGliXzEuX192YWx1ZXMoaGFuZGxlcnNbdHlwZV0gfHwgW10pLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciB3aGlsZSB0cmlnZ2VyaW5nIGluc3RydW1lbnRhdGlvbiBoYW5kbGVyLlxcblR5cGU6IFwiICsgdHlwZSArIFwiXFxuTmFtZTogXCIgKyBnZXRGdW5jdGlvbk5hbWUoaGFuZGxlcikgKyBcIlxcbkVycm9yOiBcIiArIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgIH1cbn1cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudENvbnNvbGUoKSB7XG4gICAgaWYgKCEoJ2NvbnNvbGUnIGluIGdsb2JhbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBbJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvcicsICdsb2cnLCAnYXNzZXJ0J10uZm9yRWFjaChmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgaWYgKCEobGV2ZWwgaW4gZ2xvYmFsLmNvbnNvbGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmlsbChnbG9iYWwuY29uc29sZSwgbGV2ZWwsIGZ1bmN0aW9uIChvcmlnaW5hbENvbnNvbGVMZXZlbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCdjb25zb2xlJywgeyBhcmdzOiBhcmdzLCBsZXZlbDogbGV2ZWwgfSk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBmYWlscyBmb3Igc29tZSBicm93c2Vycy4gOihcbiAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxDb25zb2xlTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwob3JpZ2luYWxDb25zb2xlTGV2ZWwsIGdsb2JhbC5jb25zb2xlLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudEZldGNoKCkge1xuICAgIGlmICghc3VwcG9ydHNOYXRpdmVGZXRjaCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmlsbChnbG9iYWwsICdmZXRjaCcsIGZ1bmN0aW9uIChvcmlnaW5hbEZldGNoKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29tbW9uSGFuZGxlckRhdGEgPSB7XG4gICAgICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgICAgICBmZXRjaERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBnZXRGZXRjaE1ldGhvZChhcmdzKSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBnZXRGZXRjaFVybChhcmdzKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygnZmV0Y2gnLCB0c2xpYl8xLl9fYXNzaWduKHt9LCBjb21tb25IYW5kbGVyRGF0YSkpO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRmV0Y2guYXBwbHkoZ2xvYmFsLCBhcmdzKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygnZmV0Y2gnLCB0c2xpYl8xLl9fYXNzaWduKHt9LCBjb21tb25IYW5kbGVyRGF0YSwgeyBlbmRUaW1lc3RhbXA6IERhdGUubm93KCksIHJlc3BvbnNlOiByZXNwb25zZSB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCdmZXRjaCcsIHRzbGliXzEuX19hc3NpZ24oe30sIGNvbW1vbkhhbmRsZXJEYXRhLCB7IGVuZFRpbWVzdGFtcDogRGF0ZS5ub3coKSwgZXJyb3I6IGVycm9yIH0pKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH0pO1xufVxuLyoqIEV4dHJhY3QgYG1ldGhvZGAgZnJvbSBmZXRjaCBjYWxsIGFyZ3VtZW50cyAqL1xuZnVuY3Rpb24gZ2V0RmV0Y2hNZXRob2QoZmV0Y2hBcmdzKSB7XG4gICAgaWYgKGZldGNoQXJncyA9PT0gdm9pZCAwKSB7IGZldGNoQXJncyA9IFtdOyB9XG4gICAgaWYgKCdSZXF1ZXN0JyBpbiBnbG9iYWwgJiYgaXNJbnN0YW5jZU9mKGZldGNoQXJnc1swXSwgUmVxdWVzdCkgJiYgZmV0Y2hBcmdzWzBdLm1ldGhvZCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGZldGNoQXJnc1swXS5tZXRob2QpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChmZXRjaEFyZ3NbMV0gJiYgZmV0Y2hBcmdzWzFdLm1ldGhvZCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGZldGNoQXJnc1sxXS5tZXRob2QpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiAnR0VUJztcbn1cbi8qKiBFeHRyYWN0IGB1cmxgIGZyb20gZmV0Y2ggY2FsbCBhcmd1bWVudHMgKi9cbmZ1bmN0aW9uIGdldEZldGNoVXJsKGZldGNoQXJncykge1xuICAgIGlmIChmZXRjaEFyZ3MgPT09IHZvaWQgMCkgeyBmZXRjaEFyZ3MgPSBbXTsgfVxuICAgIGlmICh0eXBlb2YgZmV0Y2hBcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmV0Y2hBcmdzWzBdO1xuICAgIH1cbiAgICBpZiAoJ1JlcXVlc3QnIGluIGdsb2JhbCAmJiBpc0luc3RhbmNlT2YoZmV0Y2hBcmdzWzBdLCBSZXF1ZXN0KSkge1xuICAgICAgICByZXR1cm4gZmV0Y2hBcmdzWzBdLnVybDtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhmZXRjaEFyZ3NbMF0pO1xufVxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50WEhSKCkge1xuICAgIGlmICghKCdYTUxIdHRwUmVxdWVzdCcgaW4gZ2xvYmFsKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB4aHJwcm90byA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZTtcbiAgICBmaWxsKHhocnByb3RvLCAnb3BlbicsIGZ1bmN0aW9uIChvcmlnaW5hbE9wZW4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB4aHIgPSB0aGlzOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXRoaXMtYXNzaWdubWVudFxuICAgICAgICAgICAgdmFyIHVybCA9IGFyZ3NbMV07XG4gICAgICAgICAgICB4aHIuX19zZW50cnlfeGhyX18gPSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBpc1N0cmluZyhhcmdzWzBdKSA/IGFyZ3NbMF0udG9VcHBlckNhc2UoKSA6IGFyZ3NbMF0sXG4gICAgICAgICAgICAgICAgdXJsOiBhcmdzWzFdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGlmIFNlbnRyeSBrZXkgYXBwZWFycyBpbiBVUkwsIGRvbid0IGNhcHR1cmUgaXQgYXMgYSByZXF1ZXN0XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcodXJsKSAmJiB4aHIuX19zZW50cnlfeGhyX18ubWV0aG9kID09PSAnUE9TVCcgJiYgdXJsLm1hdGNoKC9zZW50cnlfa2V5LykpIHtcbiAgICAgICAgICAgICAgICB4aHIuX19zZW50cnlfb3duX3JlcXVlc3RfXyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb25yZWFkeXN0YXRlY2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvdWNoaW5nIHN0YXR1c0NvZGUgaW4gc29tZSBwbGF0Zm9ybXMgdGhyb3dzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBleGNlcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4aHIuX19zZW50cnlfeGhyX18pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuX19zZW50cnlfeGhyX18uc3RhdHVzX2NvZGUgPSB4aHIuc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCd4aHInLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICB4aHI6IHhocixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICgnb25yZWFkeXN0YXRlY2hhbmdlJyBpbiB4aHIgJiYgdHlwZW9mIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBmaWxsKHhociwgJ29ucmVhZHlzdGF0ZWNoYW5nZScsIGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlYWR5U3RhdGVBcmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5U3RhdGVBcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbnJlYWR5c3RhdGVjaGFuZ2VIYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkoeGhyLCByZWFkeVN0YXRlQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIG9ucmVhZHlzdGF0ZWNoYW5nZUhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsT3Blbi5hcHBseSh4aHIsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGZpbGwoeGhycHJvdG8sICdzZW5kJywgZnVuY3Rpb24gKG9yaWdpbmFsU2VuZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCd4aHInLCB7XG4gICAgICAgICAgICAgICAgYXJnczogYXJncyxcbiAgICAgICAgICAgICAgICBzdGFydFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICB4aHI6IHRoaXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFNlbmQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgfSk7XG59XG52YXIgbGFzdEhyZWY7XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnRIaXN0b3J5KCkge1xuICAgIGlmICghc3VwcG9ydHNIaXN0b3J5KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgb2xkT25Qb3BTdGF0ZSA9IGdsb2JhbC5vbnBvcHN0YXRlO1xuICAgIGdsb2JhbC5vbnBvcHN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0byA9IGdsb2JhbC5sb2NhdGlvbi5ocmVmO1xuICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IFVSTCBzdGF0ZSwgYXMgd2UgYWx3YXlzIHJlY2VpdmUgb25seSB0aGUgdXBkYXRlZCBzdGF0ZVxuICAgICAgICB2YXIgZnJvbSA9IGxhc3RIcmVmO1xuICAgICAgICBsYXN0SHJlZiA9IHRvO1xuICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2hpc3RvcnknLCB7XG4gICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgdG86IHRvLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9sZE9uUG9wU3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBvbGRPblBvcFN0YXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGZ1bmN0aW9uIGhpc3RvcnlSZXBsYWNlbWVudEZ1bmN0aW9uKG9yaWdpbmFsSGlzdG9yeUZ1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdXJsID0gYXJncy5sZW5ndGggPiAyID8gYXJnc1syXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICAgICAgICAvLyBjb2VyY2UgdG8gc3RyaW5nICh0aGlzIGlzIHdoYXQgcHVzaFN0YXRlIGRvZXMpXG4gICAgICAgICAgICAgICAgdmFyIGZyb20gPSBsYXN0SHJlZjtcbiAgICAgICAgICAgICAgICB2YXIgdG8gPSBTdHJpbmcodXJsKTtcbiAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IFVSTCBzdGF0ZSwgYXMgd2UgYWx3YXlzIHJlY2VpdmUgb25seSB0aGUgdXBkYXRlZCBzdGF0ZVxuICAgICAgICAgICAgICAgIGxhc3RIcmVmID0gdG87XG4gICAgICAgICAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCdoaXN0b3J5Jywge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICAgICAgICAgICAgICB0bzogdG8sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxIaXN0b3J5RnVuY3Rpb24uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZpbGwoZ2xvYmFsLmhpc3RvcnksICdwdXNoU3RhdGUnLCBoaXN0b3J5UmVwbGFjZW1lbnRGdW5jdGlvbik7XG4gICAgZmlsbChnbG9iYWwuaGlzdG9yeSwgJ3JlcGxhY2VTdGF0ZScsIGhpc3RvcnlSZXBsYWNlbWVudEZ1bmN0aW9uKTtcbn1cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudERPTSgpIHtcbiAgICBpZiAoISgnZG9jdW1lbnQnIGluIGdsb2JhbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDYXB0dXJlIGJyZWFkY3J1bWJzIGZyb20gYW55IGNsaWNrIHRoYXQgaXMgdW5oYW5kbGVkIC8gYnViYmxlZCB1cCBhbGwgdGhlIHdheVxuICAgIC8vIHRvIHRoZSBkb2N1bWVudC4gRG8gdGhpcyBiZWZvcmUgd2UgaW5zdHJ1bWVudCBhZGRFdmVudExpc3RlbmVyLlxuICAgIGdsb2JhbC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGRvbUV2ZW50SGFuZGxlcignY2xpY2snLCB0cmlnZ2VySGFuZGxlcnMuYmluZChudWxsLCAnZG9tJykpLCBmYWxzZSk7XG4gICAgZ2xvYmFsLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywga2V5cHJlc3NFdmVudEhhbmRsZXIodHJpZ2dlckhhbmRsZXJzLmJpbmQobnVsbCwgJ2RvbScpKSwgZmFsc2UpO1xuICAgIC8vIEFmdGVyIGhvb2tpbmcgaW50byBkb2N1bWVudCBidWJibGVkIHVwIGNsaWNrIGFuZCBrZXlwcmVzc2VzIGV2ZW50cywgd2UgYWxzbyBob29rIGludG8gdXNlciBoYW5kbGVkIGNsaWNrICYga2V5cHJlc3Nlcy5cbiAgICBbJ0V2ZW50VGFyZ2V0JywgJ05vZGUnXS5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgdmFyIHByb3RvID0gZ2xvYmFsW3RhcmdldF0gJiYgZ2xvYmFsW3RhcmdldF0ucHJvdG90eXBlO1xuICAgICAgICBpZiAoIXByb3RvIHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eSB8fCAhcHJvdG8uaGFzT3duUHJvcGVydHkoJ2FkZEV2ZW50TGlzdGVuZXInKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZpbGwocHJvdG8sICdhZGRFdmVudExpc3RlbmVyJywgZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm4gJiYgZm4uaGFuZGxlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbChmbiwgJ2hhbmRsZUV2ZW50JywgZnVuY3Rpb24gKGlubmVyT3JpZ2luYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbUV2ZW50SGFuZGxlcignY2xpY2snLCB0cmlnZ2VySGFuZGxlcnMuYmluZChudWxsLCAnZG9tJykpKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubmVyT3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudE5hbWUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwoZm4sICdoYW5kbGVFdmVudCcsIGZ1bmN0aW9uIChpbm5lck9yaWdpbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlwcmVzc0V2ZW50SGFuZGxlcih0cmlnZ2VySGFuZGxlcnMuYmluZChudWxsLCAnZG9tJykpKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubmVyT3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSAnY2xpY2snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb21FdmVudEhhbmRsZXIoJ2NsaWNrJywgdHJpZ2dlckhhbmRsZXJzLmJpbmQobnVsbCwgJ2RvbScpLCB0cnVlKSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlwcmVzc0V2ZW50SGFuZGxlcih0cmlnZ2VySGFuZGxlcnMuYmluZChudWxsLCAnZG9tJykpKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgZm4sIG9wdGlvbnMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbGwocHJvdG8sICdyZW1vdmVFdmVudExpc3RlbmVyJywgZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBmbjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIChjYWxsYmFjay5fX3NlbnRyeV93cmFwcGVkX18gfHwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIGFjY2Vzc2luZyBfX3NlbnRyeV93cmFwcGVkX18gd2lsbCB0aHJvdyBpbiBzb21lIFNlbGVuaXVtIGVudmlyb25tZW50c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudE5hbWUsIGNhbGxiYWNrLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxudmFyIGRlYm91bmNlRHVyYXRpb24gPSAxMDAwO1xudmFyIGRlYm91bmNlVGltZXIgPSAwO1xudmFyIGtleXByZXNzVGltZW91dDtcbnZhciBsYXN0Q2FwdHVyZWRFdmVudDtcbi8qKlxuICogV3JhcHMgYWRkRXZlbnRMaXN0ZW5lciB0byBjYXB0dXJlIFVJIGJyZWFkY3J1bWJzXG4gKiBAcGFyYW0gbmFtZSB0aGUgZXZlbnQgbmFtZSAoZS5nLiBcImNsaWNrXCIpXG4gKiBAcGFyYW0gaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkXG4gKiBAcGFyYW0gZGVib3VuY2UgZGVjaWRlcyB3aGV0aGVyIGl0IHNob3VsZCB3YWl0IHRpbGwgYW5vdGhlciBldmVudCBsb29wXG4gKiBAcmV0dXJucyB3cmFwcGVkIGJyZWFkY3J1bWIgZXZlbnRzIGhhbmRsZXJcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gZG9tRXZlbnRIYW5kbGVyKG5hbWUsIGhhbmRsZXIsIGRlYm91bmNlKSB7XG4gICAgaWYgKGRlYm91bmNlID09PSB2b2lkIDApIHsgZGVib3VuY2UgPSBmYWxzZTsgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gcmVzZXQga2V5cHJlc3MgdGltZW91dDsgZS5nLiB0cmlnZ2VyaW5nIGEgJ2NsaWNrJyBhZnRlclxuICAgICAgICAvLyBhICdrZXlwcmVzcycgd2lsbCByZXNldCB0aGUga2V5cHJlc3MgZGVib3VuY2Ugc28gdGhhdCBhIG5ld1xuICAgICAgICAvLyBzZXQgb2Yga2V5cHJlc3NlcyBjYW4gYmUgcmVjb3JkZWRcbiAgICAgICAga2V5cHJlc3NUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoaXMgaGFuZGxlciBtaWdodCB0cmlnZ2VyIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZVxuICAgICAgICAvLyBldmVudCAoZS5nLiBldmVudCBwcm9wYWdhdGlvbiB0aHJvdWdoIG5vZGUgYW5jZXN0b3JzKS4gSWdub3JlIGlmIHdlJ3ZlXG4gICAgICAgIC8vIGFscmVhZHkgY2FwdHVyZWQgdGhlIGV2ZW50LlxuICAgICAgICBpZiAoIWV2ZW50IHx8IGxhc3RDYXB0dXJlZEV2ZW50ID09PSBldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RDYXB0dXJlZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIGlmIChkZWJvdW5jZVRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlYm91bmNlKSB7XG4gICAgICAgICAgICBkZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcih7IGV2ZW50OiBldmVudCwgbmFtZTogbmFtZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlcih7IGV2ZW50OiBldmVudCwgbmFtZTogbmFtZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIFdyYXBzIGFkZEV2ZW50TGlzdGVuZXIgdG8gY2FwdHVyZSBrZXlwcmVzcyBVSSBldmVudHNcbiAqIEBwYXJhbSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWRcbiAqIEByZXR1cm5zIHdyYXBwZWQga2V5cHJlc3MgZXZlbnRzIGhhbmRsZXJcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24ga2V5cHJlc3NFdmVudEhhbmRsZXIoaGFuZGxlcikge1xuICAgIC8vIFRPRE86IGlmIHNvbWVob3cgdXNlciBzd2l0Y2hlcyBrZXlwcmVzcyB0YXJnZXQgYmVmb3JlXG4gICAgLy8gICAgICAgZGVib3VuY2UgdGltZW91dCBpcyB0cmlnZ2VyZWQsIHdlIHdpbGwgb25seSBjYXB0dXJlXG4gICAgLy8gICAgICAgYSBzaW5nbGUgYnJlYWRjcnVtYiBmcm9tIHRoZSBGSVJTVCB0YXJnZXQgKGFjY2VwdGFibGU/KVxuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIHRhcmdldDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8ganVzdCBhY2Nlc3NpbmcgZXZlbnQgcHJvcGVydGllcyBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIGluIHNvbWUgcmFyZSBjaXJjdW1zdGFuY2VzXG4gICAgICAgICAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvcmF2ZW4tanMvaXNzdWVzLzgzOFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0YWdOYW1lID0gdGFyZ2V0ICYmIHRhcmdldC50YWdOYW1lO1xuICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIGtleXByZXNzIGV2ZW50cyBvbiBhY3R1YWwgaW5wdXQgZWxlbWVudHNcbiAgICAgICAgLy8gdGhpcyB3aWxsIGRpc3JlZ2FyZCBrZXlwcmVzc2VzIHRhcmdldGluZyBib2R5IChlLmcuIHRhYmJpbmdcbiAgICAgICAgLy8gdGhyb3VnaCBlbGVtZW50cywgaG90a2V5cywgZXRjKVxuICAgICAgICBpZiAoIXRhZ05hbWUgfHwgKHRhZ05hbWUgIT09ICdJTlBVVCcgJiYgdGFnTmFtZSAhPT0gJ1RFWFRBUkVBJyAmJiAhdGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlY29yZCBmaXJzdCBrZXlwcmVzcyBpbiBhIHNlcmllcywgYnV0IGlnbm9yZSBzdWJzZXF1ZW50XG4gICAgICAgIC8vIGtleXByZXNzZXMgdW50aWwgZGVib3VuY2UgY2xlYXJzXG4gICAgICAgIGlmICgha2V5cHJlc3NUaW1lb3V0KSB7XG4gICAgICAgICAgICBkb21FdmVudEhhbmRsZXIoJ2lucHV0JywgaGFuZGxlcikoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyVGltZW91dChrZXlwcmVzc1RpbWVvdXQpO1xuICAgICAgICBrZXlwcmVzc1RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGtleXByZXNzVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSwgZGVib3VuY2VEdXJhdGlvbik7XG4gICAgfTtcbn1cbnZhciBfb2xkT25FcnJvckhhbmRsZXIgPSBudWxsO1xuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50RXJyb3IoKSB7XG4gICAgX29sZE9uRXJyb3JIYW5kbGVyID0gZ2xvYmFsLm9uZXJyb3I7XG4gICAgZ2xvYmFsLm9uZXJyb3IgPSBmdW5jdGlvbiAobXNnLCB1cmwsIGxpbmUsIGNvbHVtbiwgZXJyb3IpIHtcbiAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCdlcnJvcicsIHtcbiAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbGluZTogbGluZSxcbiAgICAgICAgICAgIG1zZzogbXNnLFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoX29sZE9uRXJyb3JIYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gX29sZE9uRXJyb3JIYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG59XG52YXIgX29sZE9uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlciA9IG51bGw7XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnRVbmhhbmRsZWRSZWplY3Rpb24oKSB7XG4gICAgX29sZE9uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbjtcbiAgICBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ3VuaGFuZGxlZHJlamVjdGlvbicsIGUpO1xuICAgICAgICBpZiAoX29sZE9uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9vbGRPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5zdHJ1bWVudC5qcy5tYXAiLCIvKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBvbmUgb2YgYSBmZXcgRXJyb3Igb3IgRXJyb3ItbGlrZVxuICoge0BsaW5rIGlzRXJyb3J9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvcih3YXQpIHtcbiAgICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpKSB7XG4gICAgICAgIGNhc2UgJ1tvYmplY3QgRXJyb3JdJzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdbb2JqZWN0IEV4Y2VwdGlvbl0nOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ1tvYmplY3QgRE9NRXhjZXB0aW9uXSc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBpc0luc3RhbmNlT2Yod2F0LCBFcnJvcik7XG4gICAgfVxufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgRXJyb3JFdmVudFxuICoge0BsaW5rIGlzRXJyb3JFdmVudH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm9yRXZlbnQod2F0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBFcnJvckV2ZW50XSc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBET01FcnJvclxuICoge0BsaW5rIGlzRE9NRXJyb3J9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNET01FcnJvcih3YXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IERPTUVycm9yXSc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBET01FeGNlcHRpb25cbiAqIHtAbGluayBpc0RPTUV4Y2VwdGlvbn0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RPTUV4Y2VwdGlvbih3YXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYSBzdHJpbmdcbiAqIHtAbGluayBpc1N0cmluZ30uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh3YXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIGlzIGEgcHJpbWl0aXZlICh1bmRlZmluZWQsIG51bGwsIG51bWJlciwgYm9vbGVhbiwgc3RyaW5nKVxuICoge0BsaW5rIGlzUHJpbWl0aXZlfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHdhdCkge1xuICAgIHJldHVybiB3YXQgPT09IG51bGwgfHwgKHR5cGVvZiB3YXQgIT09ICdvYmplY3QnICYmIHR5cGVvZiB3YXQgIT09ICdmdW5jdGlvbicpO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHtAbGluayBpc1BsYWluT2JqZWN0fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qod2F0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIEV2ZW50IGluc3RhbmNlXG4gKiB7QGxpbmsgaXNFdmVudH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V2ZW50KHdhdCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgcmV0dXJuIHR5cGVvZiBFdmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNJbnN0YW5jZU9mKHdhdCwgRXZlbnQpO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gRWxlbWVudCBpbnN0YW5jZVxuICoge0BsaW5rIGlzRWxlbWVudH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnQod2F0KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICByZXR1cm4gdHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGlzSW5zdGFuY2VPZih3YXQsIEVsZW1lbnQpO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gcmVnZXhwXG4gKiB7QGxpbmsgaXNSZWdFeHB9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWdFeHAod2F0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUgaGFzIGEgdGhlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUaGVuYWJsZSh3YXQpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG4gICAgcmV0dXJuIEJvb2xlYW4od2F0ICYmIHdhdC50aGVuICYmIHR5cGVvZiB3YXQudGhlbiA9PT0gJ2Z1bmN0aW9uJyk7XG4gICAgLy8gdHNsaW50OmVuYWJsZTpuby11bnNhZmUtYW55XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhIFN5bnRoZXRpY0V2ZW50XG4gKiB7QGxpbmsgaXNTeW50aGV0aWNFdmVudH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5bnRoZXRpY0V2ZW50KHdhdCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnNhZmUtYW55XG4gICAgcmV0dXJuIGlzUGxhaW5PYmplY3Qod2F0KSAmJiAnbmF0aXZlRXZlbnQnIGluIHdhdCAmJiAncHJldmVudERlZmF1bHQnIGluIHdhdCAmJiAnc3RvcFByb3BhZ2F0aW9uJyBpbiB3YXQ7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiBpbnN0YW5jZSBvZiBwcm92aWRlZCBjb25zdHJ1Y3Rvci5cbiAqIHtAbGluayBpc0luc3RhbmNlT2Z9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHBhcmFtIGJhc2UgQSBjb25zdHJ1Y3RvciB0byBiZSB1c2VkIGluIGEgY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luc3RhbmNlT2Yod2F0LCBiYXNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVuc2FmZS1hbnlcbiAgICAgICAgcmV0dXJuIHdhdCBpbnN0YW5jZW9mIGJhc2U7XG4gICAgfVxuICAgIGNhdGNoIChfZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMuanMubWFwIiwiaW1wb3J0IHsgY29uc29sZVNhbmRib3gsIGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vbWlzYyc7XG4vLyBUT0RPOiBJbXBsZW1lbnQgZGlmZmVyZW50IGxvZ2dlcnMgZm9yIGRpZmZlcmVudCBlbnZpcm9ubWVudHNcbnZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbi8qKiBQcmVmaXggZm9yIGxvZ2dpbmcgc3RyaW5ncyAqL1xudmFyIFBSRUZJWCA9ICdTZW50cnkgTG9nZ2VyICc7XG4vKiogSlNEb2MgKi9cbnZhciBMb2dnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqIEpTRG9jICovXG4gICAgZnVuY3Rpb24gTG9nZ2VyKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKiBKU0RvYyAqL1xuICAgIExvZ2dlci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgTG9nZ2VyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgTG9nZ2VyLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZVNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZ2xvYmFsLmNvbnNvbGUubG9nKFBSRUZJWCArIFwiW0xvZ106IFwiICsgYXJncy5qb2luKCcgJykpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWNvbnNvbGVcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBMb2dnZXIucHJvdG90eXBlLndhcm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZVNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZ2xvYmFsLmNvbnNvbGUud2FybihQUkVGSVggKyBcIltXYXJuXTogXCIgKyBhcmdzLmpvaW4oJyAnKSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tY29uc29sZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIExvZ2dlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZVNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZ2xvYmFsLmNvbnNvbGUuZXJyb3IoUFJFRklYICsgXCJbRXJyb3JdOiBcIiArIGFyZ3Muam9pbignICcpKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1jb25zb2xlXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIExvZ2dlcjtcbn0oKSk7XG4vLyBFbnN1cmUgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGxvZ2dlciBpbnN0YW5jZSwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBAc2VudHJ5L3V0aWxzIGFyZSBiZWluZyB1c2VkXG5nbG9iYWwuX19TRU5UUllfXyA9IGdsb2JhbC5fX1NFTlRSWV9fIHx8IHt9O1xudmFyIGxvZ2dlciA9IGdsb2JhbC5fX1NFTlRSWV9fLmxvZ2dlciB8fCAoZ2xvYmFsLl9fU0VOVFJZX18ubG9nZ2VyID0gbmV3IExvZ2dlcigpKTtcbmV4cG9ydCB7IGxvZ2dlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nZ2VyLmpzLm1hcCIsIi8vIHRzbGludDpkaXNhYmxlOm5vLXVuc2FmZS1hbnlcbi8qKlxuICogTWVtbyBjbGFzcyB1c2VkIGZvciBkZWN5Y2xlIGpzb24gb2JqZWN0cy4gVXNlcyBXZWFrU2V0IGlmIGF2YWlsYWJsZSBvdGhlcndpc2UgYXJyYXkuXG4gKi9cbnZhciBNZW1vID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1lbW8oKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB0aGlzLl9oYXNXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbic7XG4gICAgICAgIHRoaXMuX2lubmVyID0gdGhpcy5faGFzV2Vha1NldCA/IG5ldyBXZWFrU2V0KCkgOiBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBvYmogdG8gcmVtZW1iZXIuXG4gICAgICogQHBhcmFtIG9iaiBPYmplY3QgdG8gcmVtZW1iZXJcbiAgICAgKi9cbiAgICBNZW1vLnByb3RvdHlwZS5tZW1vaXplID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICBpZiAodGhpcy5faGFzV2Vha1NldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lubmVyLmhhcyhvYmopKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9pbm5lci5hZGQob2JqKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cHJlZmVyLWZvci1vZlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2lubmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9pbm5lcltpXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gb2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5uZXIucHVzaChvYmopO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIG9iamVjdCBmcm9tIGludGVybmFsIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIG9iaiBPYmplY3QgdG8gZm9yZ2V0XG4gICAgICovXG4gICAgTWVtby5wcm90b3R5cGUudW5tZW1vaXplID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICBpZiAodGhpcy5faGFzV2Vha1NldCkge1xuICAgICAgICAgICAgdGhpcy5faW5uZXIuZGVsZXRlKG9iaik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2lubmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lubmVyW2ldID09PSBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5uZXIuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBNZW1vO1xufSgpKTtcbmV4cG9ydCB7IE1lbW8gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW8uanMubWFwIiwiaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuL2lzJztcbmltcG9ydCB7IHNuaXBMaW5lIH0gZnJvbSAnLi9zdHJpbmcnO1xuLyoqXG4gKiBSZXF1aXJlcyBhIG1vZHVsZSB3aGljaCBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBidW5kbGVyIG1pbmlmaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCBUaGUgbW9kdWxlIHBhdGggdG8gcmVzb2x2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZHluYW1pY1JlcXVpcmUobW9kLCByZXF1ZXN0KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bnNhZmUtYW55XG4gICAgcmV0dXJuIG1vZC5yZXF1aXJlKHJlcXVlc3QpO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB3ZSdyZSBpbiB0aGUgTm9kZS5qcyBvciBCcm93c2VyIGVudmlyb25tZW50XG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIGdpdmVuIHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVFbnYoKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnID8gcHJvY2VzcyA6IDApID09PSAnW29iamVjdCBwcm9jZXNzXSc7XG59XG52YXIgZmFsbGJhY2tHbG9iYWxPYmplY3QgPSB7fTtcbi8qKlxuICogU2FmZWx5IGdldCBnbG9iYWwgc2NvcGUgb2JqZWN0XG4gKlxuICogQHJldHVybnMgR2xvYmFsIHNjb3BlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsT2JqZWN0KCkge1xuICAgIHJldHVybiAoaXNOb2RlRW52KClcbiAgICAgICAgPyBnbG9iYWxcbiAgICAgICAgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyB3aW5kb3dcbiAgICAgICAgICAgIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyBzZWxmXG4gICAgICAgICAgICAgICAgOiBmYWxsYmFja0dsb2JhbE9iamVjdCk7XG59XG4vKipcbiAqIFVVSUQ0IGdlbmVyYXRvclxuICpcbiAqIEByZXR1cm5zIHN0cmluZyBHZW5lcmF0ZWQgVVVJRDQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dWlkNCgpIHtcbiAgICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gICAgdmFyIGNyeXB0byA9IGdsb2JhbC5jcnlwdG8gfHwgZ2xvYmFsLm1zQ3J5cHRvO1xuICAgIGlmICghKGNyeXB0byA9PT0gdm9pZCAwKSAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICAgIC8vIFVzZSB3aW5kb3cuY3J5cHRvIEFQSSBpZiBhdmFpbGFibGVcbiAgICAgICAgdmFyIGFyciA9IG5ldyBVaW50MTZBcnJheSg4KTtcbiAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xuICAgICAgICAvLyBzZXQgNCBpbiBieXRlIDdcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgYXJyWzNdID0gKGFyclszXSAmIDB4ZmZmKSB8IDB4NDAwMDtcbiAgICAgICAgLy8gc2V0IDIgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGJ5dGUgOSB0byAnMTAnXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgICAgIGFycls0XSA9IChhcnJbNF0gJiAweDNmZmYpIHwgMHg4MDAwO1xuICAgICAgICB2YXIgcGFkID0gZnVuY3Rpb24gKG51bSkge1xuICAgICAgICAgICAgdmFyIHYgPSBudW0udG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgd2hpbGUgKHYubGVuZ3RoIDwgNCkge1xuICAgICAgICAgICAgICAgIHYgPSBcIjBcIiArIHY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChwYWQoYXJyWzBdKSArIHBhZChhcnJbMV0pICsgcGFkKGFyclsyXSkgKyBwYWQoYXJyWzNdKSArIHBhZChhcnJbNF0pICsgcGFkKGFycls1XSkgKyBwYWQoYXJyWzZdKSArIHBhZChhcnJbN10pKTtcbiAgICB9XG4gICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDUwMzQvaG93LXRvLWNyZWF0ZS1hLWd1aWQtdXVpZC1pbi1qYXZhc2NyaXB0LzIxMTc1MjMjMjExNzUyM1xuICAgIHJldHVybiAneHh4eHh4eHh4eHh4NHh4eHl4eHh4eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgdmFyIHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgICAgIHZhciB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBQYXJzZXMgc3RyaW5nIGZvcm0gb2YgVVJMIGludG8gYW4gb2JqZWN0XG4gKiAvLyBib3Jyb3dlZCBmcm9tIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I2FwcGVuZGl4LUJcbiAqIC8vIGludGVudGlvbmFsbHkgdXNpbmcgcmVnZXggYW5kIG5vdCA8YS8+IGhyZWYgcGFyc2luZyB0cmljayBiZWNhdXNlIFJlYWN0IE5hdGl2ZSBhbmQgb3RoZXJcbiAqIC8vIGVudmlyb25tZW50cyB3aGVyZSBET00gbWlnaHQgbm90IGJlIGF2YWlsYWJsZVxuICogQHJldHVybnMgcGFyc2VkIFVSTCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsKHVybCkge1xuICAgIGlmICghdXJsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgdmFyIG1hdGNoID0gdXJsLm1hdGNoKC9eKChbXjpcXC8/I10rKTopPyhcXC9cXC8oW15cXC8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8kLyk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIC8vIGNvZXJjZSB0byB1bmRlZmluZWQgdmFsdWVzIHRvIGVtcHR5IHN0cmluZyBzbyB3ZSBkb24ndCBnZXQgJ3VuZGVmaW5lZCdcbiAgICB2YXIgcXVlcnkgPSBtYXRjaFs2XSB8fCAnJztcbiAgICB2YXIgZnJhZ21lbnQgPSBtYXRjaFs4XSB8fCAnJztcbiAgICByZXR1cm4ge1xuICAgICAgICBob3N0OiBtYXRjaFs0XSxcbiAgICAgICAgcGF0aDogbWF0Y2hbNV0sXG4gICAgICAgIHByb3RvY29sOiBtYXRjaFsyXSxcbiAgICAgICAgcmVsYXRpdmU6IG1hdGNoWzVdICsgcXVlcnkgKyBmcmFnbWVudCxcbiAgICB9O1xufVxuLyoqXG4gKiBFeHRyYWN0cyBlaXRoZXIgbWVzc2FnZSBvciB0eXBlK3ZhbHVlIGZyb20gYW4gZXZlbnQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdXNlci1mYWNpbmcgbG9nc1xuICogQHJldHVybnMgZXZlbnQncyBkZXNjcmlwdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkge1xuICAgIGlmIChldmVudC5tZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBldmVudC5tZXNzYWdlO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSkge1xuICAgICAgICB2YXIgZXhjZXB0aW9uID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXTtcbiAgICAgICAgaWYgKGV4Y2VwdGlvbi50eXBlICYmIGV4Y2VwdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbi50eXBlICsgXCI6IFwiICsgZXhjZXB0aW9uLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleGNlcHRpb24udHlwZSB8fCBleGNlcHRpb24udmFsdWUgfHwgZXZlbnQuZXZlbnRfaWQgfHwgJzx1bmtub3duPic7XG4gICAgfVxuICAgIHJldHVybiBldmVudC5ldmVudF9pZCB8fCAnPHVua25vd24+Jztcbn1cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnNvbGVTYW5kYm94KGNhbGxiYWNrKSB7XG4gICAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICAgIHZhciBsZXZlbHMgPSBbJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvcicsICdsb2cnLCAnYXNzZXJ0J107XG4gICAgaWYgKCEoJ2NvbnNvbGUnIGluIGdsb2JhbCkpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHZhciBvcmlnaW5hbENvbnNvbGUgPSBnbG9iYWwuY29uc29sZTtcbiAgICB2YXIgd3JhcHBlZExldmVscyA9IHt9O1xuICAgIC8vIFJlc3RvcmUgYWxsIHdyYXBwZWQgY29uc29sZSBtZXRob2RzXG4gICAgbGV2ZWxzLmZvckVhY2goZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgIGlmIChsZXZlbCBpbiBnbG9iYWwuY29uc29sZSAmJiBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdLl9fc2VudHJ5X29yaWdpbmFsX18pIHtcbiAgICAgICAgICAgIHdyYXBwZWRMZXZlbHNbbGV2ZWxdID0gb3JpZ2luYWxDb25zb2xlW2xldmVsXTtcbiAgICAgICAgICAgIG9yaWdpbmFsQ29uc29sZVtsZXZlbF0gPSBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdLl9fc2VudHJ5X29yaWdpbmFsX187XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBQZXJmb3JtIGNhbGxiYWNrIG1hbmlwdWxhdGlvbnNcbiAgICB2YXIgcmVzdWx0ID0gY2FsbGJhY2soKTtcbiAgICAvLyBSZXZlcnQgcmVzdG9yYXRpb24gdG8gd3JhcHBlZCBzdGF0ZVxuICAgIE9iamVjdC5rZXlzKHdyYXBwZWRMZXZlbHMpLmZvckVhY2goZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgIG9yaWdpbmFsQ29uc29sZVtsZXZlbF0gPSB3cmFwcGVkTGV2ZWxzW2xldmVsXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBBZGRzIGV4Y2VwdGlvbiB2YWx1ZXMsIHR5cGUgYW5kIHZhbHVlIHRvIGFuIHN5bnRoZXRpYyBFeGNlcHRpb24uXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0aGUgZXhjZXB0aW9uLlxuICogQHBhcmFtIHR5cGUgVHlwZSBvZiB0aGUgZXhjZXB0aW9uLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRXhjZXB0aW9uVHlwZVZhbHVlKGV2ZW50LCB2YWx1ZSwgdHlwZSkge1xuICAgIGV2ZW50LmV4Y2VwdGlvbiA9IGV2ZW50LmV4Y2VwdGlvbiB8fCB7fTtcbiAgICBldmVudC5leGNlcHRpb24udmFsdWVzID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyB8fCBbXTtcbiAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSB8fCB7fTtcbiAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnZhbHVlID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS52YWx1ZSB8fCB2YWx1ZSB8fCAnJztcbiAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnR5cGUgPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnR5cGUgfHwgdHlwZSB8fCAnRXJyb3InO1xufVxuLyoqXG4gKiBBZGRzIGV4Y2VwdGlvbiBtZWNoYW5pc20gdG8gYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIG1lY2hhbmlzbSBNZWNoYW5pc20gb2YgdGhlIG1lY2hhbmlzbS5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudCwgbWVjaGFuaXNtKSB7XG4gICAgaWYgKG1lY2hhbmlzbSA9PT0gdm9pZCAwKSB7IG1lY2hhbmlzbSA9IHt9OyB9XG4gICAgLy8gVE9ETzogVXNlIHJlYWwgdHlwZSB3aXRoIGBrZXlvZiBNZWNoYW5pc21gIHRoaW5neSBhbmQgbWF5YmUgbWFrZSBpdCBiZXR0ZXI/XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5tZWNoYW5pc20gPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLm1lY2hhbmlzbSB8fCB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMobWVjaGFuaXNtKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0ubWVjaGFuaXNtW2tleV0gPSBtZWNoYW5pc21ba2V5XTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoIChfb08pIHtcbiAgICAgICAgLy8gbm8tZW1wdHlcbiAgICB9XG59XG4vKipcbiAqIEEgc2FmZSBmb3JtIG9mIGxvY2F0aW9uLmhyZWZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2F0aW9uSHJlZigpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gICAgY2F0Y2ggKG9PKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG59XG4vKipcbiAqIEdpdmVuIGEgY2hpbGQgRE9NIGVsZW1lbnQsIHJldHVybnMgYSBxdWVyeS1zZWxlY3RvciBzdGF0ZW1lbnQgZGVzY3JpYmluZyB0aGF0XG4gKiBhbmQgaXRzIGFuY2VzdG9yc1xuICogZS5nLiBbSFRNTEVsZW1lbnRdID0+IGJvZHkgPiBkaXYgPiBpbnB1dCNmb28uYnRuW25hbWU9YmF6XVxuICogQHJldHVybnMgZ2VuZXJhdGVkIERPTSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBodG1sVHJlZUFzU3RyaW5nKGVsZW0pIHtcbiAgICAvLyB0cnkvY2F0Y2ggYm90aDpcbiAgICAvLyAtIGFjY2Vzc2luZyBldmVudC50YXJnZXQgKHNlZSBnZXRzZW50cnkvcmF2ZW4tanMjODM4LCAjNzY4KVxuICAgIC8vIC0gYGh0bWxUcmVlQXNTdHJpbmdgIGJlY2F1c2UgaXQncyBjb21wbGV4LCBhbmQganVzdCBhY2Nlc3NpbmcgdGhlIERPTSBpbmNvcnJlY3RseVxuICAgIC8vIC0gY2FuIHRocm93IGFuIGV4Y2VwdGlvbiBpbiBzb21lIGNpcmN1bXN0YW5jZXMuXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIGN1cnJlbnRFbGVtID0gZWxlbTtcbiAgICAgICAgdmFyIE1BWF9UUkFWRVJTRV9IRUlHSFQgPSA1O1xuICAgICAgICB2YXIgTUFYX09VVFBVVF9MRU4gPSA4MDtcbiAgICAgICAgdmFyIG91dCA9IFtdO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gMDtcbiAgICAgICAgdmFyIGxlbiA9IDA7XG4gICAgICAgIHZhciBzZXBhcmF0b3IgPSAnID4gJztcbiAgICAgICAgdmFyIHNlcExlbmd0aCA9IHNlcGFyYXRvci5sZW5ndGg7XG4gICAgICAgIHZhciBuZXh0U3RyID0gdm9pZCAwO1xuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW0gJiYgaGVpZ2h0KysgPCBNQVhfVFJBVkVSU0VfSEVJR0hUKSB7XG4gICAgICAgICAgICBuZXh0U3RyID0gX2h0bWxFbGVtZW50QXNTdHJpbmcoY3VycmVudEVsZW0pO1xuICAgICAgICAgICAgLy8gYmFpbCBvdXQgaWZcbiAgICAgICAgICAgIC8vIC0gbmV4dFN0ciBpcyB0aGUgJ2h0bWwnIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIC0gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRoYXQgd291bGQgYmUgY3JlYXRlZCBleGNlZWRzIE1BWF9PVVRQVVRfTEVOXG4gICAgICAgICAgICAvLyAgIChpZ25vcmUgdGhpcyBsaW1pdCBpZiB3ZSBhcmUgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbilcbiAgICAgICAgICAgIGlmIChuZXh0U3RyID09PSAnaHRtbCcgfHwgKGhlaWdodCA+IDEgJiYgbGVuICsgb3V0Lmxlbmd0aCAqIHNlcExlbmd0aCArIG5leHRTdHIubGVuZ3RoID49IE1BWF9PVVRQVVRfTEVOKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0LnB1c2gobmV4dFN0cik7XG4gICAgICAgICAgICBsZW4gKz0gbmV4dFN0ci5sZW5ndGg7XG4gICAgICAgICAgICBjdXJyZW50RWxlbSA9IGN1cnJlbnRFbGVtLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5yZXZlcnNlKCkuam9pbihzZXBhcmF0b3IpO1xuICAgIH1cbiAgICBjYXRjaCAoX29PKSB7XG4gICAgICAgIHJldHVybiAnPHVua25vd24+JztcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgYSBzaW1wbGUsIHF1ZXJ5LXNlbGVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIGEgRE9NIGVsZW1lbnRcbiAqIGUuZy4gW0hUTUxFbGVtZW50XSA9PiBpbnB1dCNmb28uYnRuW25hbWU9YmF6XVxuICogQHJldHVybnMgZ2VuZXJhdGVkIERPTSBwYXRoXG4gKi9cbmZ1bmN0aW9uIF9odG1sRWxlbWVudEFzU3RyaW5nKGVsKSB7XG4gICAgdmFyIGVsZW0gPSBlbDtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgdmFyIGNsYXNzTmFtZTtcbiAgICB2YXIgY2xhc3NlcztcbiAgICB2YXIga2V5O1xuICAgIHZhciBhdHRyO1xuICAgIHZhciBpO1xuICAgIGlmICghZWxlbSB8fCAhZWxlbS50YWdOYW1lKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgb3V0LnB1c2goZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmIChlbGVtLmlkKSB7XG4gICAgICAgIG91dC5wdXNoKFwiI1wiICsgZWxlbS5pZCk7XG4gICAgfVxuICAgIGNsYXNzTmFtZSA9IGVsZW0uY2xhc3NOYW1lO1xuICAgIGlmIChjbGFzc05hbWUgJiYgaXNTdHJpbmcoY2xhc3NOYW1lKSkge1xuICAgICAgICBjbGFzc2VzID0gY2xhc3NOYW1lLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBvdXQucHVzaChcIi5cIiArIGNsYXNzZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBhbGxvd2VkQXR0cnMgPSBbJ3R5cGUnLCAnbmFtZScsICd0aXRsZScsICdhbHQnXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWxsb3dlZEF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGFsbG93ZWRBdHRyc1tpXTtcbiAgICAgICAgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICAgIGlmIChhdHRyKSB7XG4gICAgICAgICAgICBvdXQucHVzaChcIltcIiArIGtleSArIFwiPVxcXCJcIiArIGF0dHIgKyBcIlxcXCJdXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQuam9pbignJyk7XG59XG52YXIgSU5JVElBTF9USU1FID0gRGF0ZS5ub3coKTtcbnZhciBwcmV2Tm93ID0gMDtcbnZhciBwZXJmb3JtYW5jZUZhbGxiYWNrID0ge1xuICAgIG5vdzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKSAtIElOSVRJQUxfVElNRTtcbiAgICAgICAgaWYgKG5vdyA8IHByZXZOb3cpIHtcbiAgICAgICAgICAgIG5vdyA9IHByZXZOb3c7XG4gICAgICAgIH1cbiAgICAgICAgcHJldk5vdyA9IG5vdztcbiAgICAgICAgcmV0dXJuIG5vdztcbiAgICB9LFxuICAgIHRpbWVPcmlnaW46IElOSVRJQUxfVElNRSxcbn07XG5leHBvcnQgdmFyIGNyb3NzUGxhdGZvcm1QZXJmb3JtYW5jZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzTm9kZUVudigpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcGVyZkhvb2tzID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAncGVyZl9ob29rcycpO1xuICAgICAgICAgICAgcmV0dXJuIHBlcmZIb29rcy5wZXJmb3JtYW5jZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlRmFsbGJhY2s7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHBlcmZvcm1hbmNlID0gZ2V0R2xvYmFsT2JqZWN0KCkucGVyZm9ybWFuY2U7XG4gICAgaWYgKCFwZXJmb3JtYW5jZSB8fCAhcGVyZm9ybWFuY2Uubm93KSB7XG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZUZhbGxiYWNrO1xuICAgIH1cbiAgICAvLyBQb2x5ZmlsbCBmb3IgcGVyZm9ybWFuY2UudGltZU9yaWdpbi5cbiAgICAvL1xuICAgIC8vIFdoaWxlIHBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBwZXJmb3JtYW5jZS50aW1lT3JpZ2luLCBwZXJmb3JtYW5jZS50aW1lT3JpZ2luXG4gICAgLy8gaXMgbm90IGFzIHdpZGVseSBzdXBwb3J0ZWQuIE5hbWVseSwgcGVyZm9ybWFuY2UudGltZU9yaWdpbiBpcyB1bmRlZmluZWQgaW4gU2FmYXJpIGFzIG9mIHdyaXRpbmcuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICBpZiAocGVyZm9ybWFuY2UudGltZU9yaWdpbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEFzIG9mIHdyaXRpbmcsIHBlcmZvcm1hbmNlLnRpbWluZyBpcyBub3QgYXZhaWxhYmxlIGluIFdlYiBXb3JrZXJzIGluIG1haW5zdHJlYW0gYnJvd3NlcnMsIHNvIGl0IGlzIG5vdCBhbHdheXMgYVxuICAgICAgICAvLyB2YWxpZCBmYWxsYmFjay4gSW4gdGhlIGFic2VuY2Ugb2YgYSBpbml0aWFsIHRpbWUgcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIsIGZhbGxiYWNrIHRvIElOSVRJQUxfVElNRS5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGVwcmVjYXRpb25cbiAgICAgICAgcGVyZm9ybWFuY2UudGltZU9yaWdpbiA9IChwZXJmb3JtYW5jZS50aW1pbmcgJiYgcGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCkgfHwgSU5JVElBTF9USU1FO1xuICAgIH1cbiAgICByZXR1cm4gcGVyZm9ybWFuY2U7XG59KSgpO1xuLyoqXG4gKiBSZXR1cm5zIGEgdGltZXN0YW1wIGluIHNlY29uZHMgd2l0aCBtaWxsaXNlY29uZHMgcHJlY2lzaW9uIHNpbmNlIHRoZSBVTklYIGVwb2NoIGNhbGN1bGF0ZWQgd2l0aCB0aGUgbW9ub3RvbmljIGNsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZXN0YW1wV2l0aE1zKCkge1xuICAgIHJldHVybiAoY3Jvc3NQbGF0Zm9ybVBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBjcm9zc1BsYXRmb3JtUGVyZm9ybWFuY2Uubm93KCkpIC8gMTAwMDtcbn1cbi8vIGh0dHBzOi8vc2VtdmVyLm9yZy8jaXMtdGhlcmUtYS1zdWdnZXN0ZWQtcmVndWxhci1leHByZXNzaW9uLXJlZ2V4LXRvLWNoZWNrLWEtc2VtdmVyLXN0cmluZ1xudmFyIFNFTVZFUl9SRUdFWFAgPSAvXigwfFsxLTldXFxkKilcXC4oMHxbMS05XVxcZCopXFwuKDB8WzEtOV1cXGQqKSg/Oi0oKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKD86XFwuKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKSopKT8oPzpcXCsoWzAtOWEtekEtWi1dKyg/OlxcLlswLTlhLXpBLVotXSspKikpPyQvO1xuLyoqXG4gKiBQYXJzZXMgaW5wdXQgaW50byBhIFNlbVZlciBpbnRlcmZhY2VcbiAqIEBwYXJhbSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzZW12ZXIgdmVyc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZW12ZXIoaW5wdXQpIHtcbiAgICB2YXIgbWF0Y2ggPSBpbnB1dC5tYXRjaChTRU1WRVJfUkVHRVhQKSB8fCBbXTtcbiAgICB2YXIgbWFqb3IgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICAgIHZhciBtaW5vciA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG4gICAgdmFyIHBhdGNoID0gcGFyc2VJbnQobWF0Y2hbM10sIDEwKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBidWlsZG1ldGFkYXRhOiBtYXRjaFs1XSxcbiAgICAgICAgbWFqb3I6IGlzTmFOKG1ham9yKSA/IHVuZGVmaW5lZCA6IG1ham9yLFxuICAgICAgICBtaW5vcjogaXNOYU4obWlub3IpID8gdW5kZWZpbmVkIDogbWlub3IsXG4gICAgICAgIHBhdGNoOiBpc05hTihwYXRjaCkgPyB1bmRlZmluZWQgOiBwYXRjaCxcbiAgICAgICAgcHJlcmVsZWFzZTogbWF0Y2hbNF0sXG4gICAgfTtcbn1cbnZhciBkZWZhdWx0UmV0cnlBZnRlciA9IDYwICogMTAwMDsgLy8gNjAgc2Vjb25kc1xuLyoqXG4gKiBFeHRyYWN0cyBSZXRyeS1BZnRlciB2YWx1ZSBmcm9tIHRoZSByZXF1ZXN0IGhlYWRlciBvciByZXR1cm5zIGRlZmF1bHQgdmFsdWVcbiAqIEBwYXJhbSBub3cgY3VycmVudCB1bml4IHRpbWVzdGFtcFxuICogQHBhcmFtIGhlYWRlciBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgJ1JldHJ5LUFmdGVyJyBoZWFkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmV0cnlBZnRlckhlYWRlcihub3csIGhlYWRlcikge1xuICAgIGlmICghaGVhZGVyKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0UmV0cnlBZnRlcjtcbiAgICB9XG4gICAgdmFyIGhlYWRlckRlbGF5ID0gcGFyc2VJbnQoXCJcIiArIGhlYWRlciwgMTApO1xuICAgIGlmICghaXNOYU4oaGVhZGVyRGVsYXkpKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXJEZWxheSAqIDEwMDA7XG4gICAgfVxuICAgIHZhciBoZWFkZXJEYXRlID0gRGF0ZS5wYXJzZShcIlwiICsgaGVhZGVyKTtcbiAgICBpZiAoIWlzTmFOKGhlYWRlckRhdGUpKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXJEYXRlIC0gbm93O1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFJldHJ5QWZ0ZXI7XG59XG52YXIgZGVmYXVsdEZ1bmN0aW9uTmFtZSA9ICc8YW5vbnltb3VzPic7XG4vKipcbiAqIFNhZmVseSBleHRyYWN0IGZ1bmN0aW9uIG5hbWUgZnJvbSBpdHNlbGZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uTmFtZShmbikge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICghZm4gfHwgdHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdEZ1bmN0aW9uTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4ubmFtZSB8fCBkZWZhdWx0RnVuY3Rpb25OYW1lO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBKdXN0IGFjY2Vzc2luZyBjdXN0b20gcHJvcHMgaW4gc29tZSBTZWxlbml1bSBlbnZpcm9ubWVudHNcbiAgICAgICAgLy8gY2FuIGNhdXNlIGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGV4Y2VwdGlvbiAoc2VlIHJhdmVuLWpzIzQ5NSkuXG4gICAgICAgIHJldHVybiBkZWZhdWx0RnVuY3Rpb25OYW1lO1xuICAgIH1cbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGNvbnRleHQgKHByZS9wb3N0L2xpbmUpIGxpbmVzIHRvIHRoZSBwcm92aWRlZCBmcmFtZVxuICpcbiAqIEBwYXJhbSBsaW5lcyBzdHJpbmdbXSBjb250YWluaW5nIGFsbCBsaW5lc1xuICogQHBhcmFtIGZyYW1lIFN0YWNrRnJhbWUgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAqIEBwYXJhbSBsaW5lc09mQ29udGV4dCBudW1iZXIgb2YgY29udGV4dCBsaW5lcyB3ZSB3YW50IHRvIGFkZCBwcmUvcG9zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQ29udGV4dFRvRnJhbWUobGluZXMsIGZyYW1lLCBsaW5lc09mQ29udGV4dCkge1xuICAgIGlmIChsaW5lc09mQ29udGV4dCA9PT0gdm9pZCAwKSB7IGxpbmVzT2ZDb250ZXh0ID0gNTsgfVxuICAgIHZhciBsaW5lbm8gPSBmcmFtZS5saW5lbm8gfHwgMDtcbiAgICB2YXIgbWF4TGluZXMgPSBsaW5lcy5sZW5ndGg7XG4gICAgdmFyIHNvdXJjZUxpbmUgPSBNYXRoLm1heChNYXRoLm1pbihtYXhMaW5lcywgbGluZW5vIC0gMSksIDApO1xuICAgIGZyYW1lLnByZV9jb250ZXh0ID0gbGluZXNcbiAgICAgICAgLnNsaWNlKE1hdGgubWF4KDAsIHNvdXJjZUxpbmUgLSBsaW5lc09mQ29udGV4dCksIHNvdXJjZUxpbmUpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGxpbmUpIHsgcmV0dXJuIHNuaXBMaW5lKGxpbmUsIDApOyB9KTtcbiAgICBmcmFtZS5jb250ZXh0X2xpbmUgPSBzbmlwTGluZShsaW5lc1tNYXRoLm1pbihtYXhMaW5lcyAtIDEsIHNvdXJjZUxpbmUpXSwgZnJhbWUuY29sbm8gfHwgMCk7XG4gICAgZnJhbWUucG9zdF9jb250ZXh0ID0gbGluZXNcbiAgICAgICAgLnNsaWNlKE1hdGgubWluKHNvdXJjZUxpbmUgKyAxLCBtYXhMaW5lcyksIHNvdXJjZUxpbmUgKyAxICsgbGluZXNPZkNvbnRleHQpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGxpbmUpIHsgcmV0dXJuIHNuaXBMaW5lKGxpbmUsIDApOyB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pc2MuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNFcnJvciwgaXNFdmVudCwgaXNJbnN0YW5jZU9mLCBpc1BsYWluT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNTeW50aGV0aWNFdmVudCB9IGZyb20gJy4vaXMnO1xuaW1wb3J0IHsgTWVtbyB9IGZyb20gJy4vbWVtbyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbk5hbWUsIGh0bWxUcmVlQXNTdHJpbmcgfSBmcm9tICcuL21pc2MnO1xuaW1wb3J0IHsgdHJ1bmNhdGUgfSBmcm9tICcuL3N0cmluZyc7XG4vKipcbiAqIFdyYXAgYSBnaXZlbiBvYmplY3QgbWV0aG9kIHdpdGggYSBoaWdoZXItb3JkZXIgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0gc291cmNlIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbWV0aG9kIHRvIGJlIHdyYXBwZWQuXG4gKiBAcGFyYW0gbmFtZSBBIG5hbWUgb2YgbWV0aG9kIHRvIGJlIHdyYXBwZWQuXG4gKiBAcGFyYW0gcmVwbGFjZW1lbnQgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHdyYXAgYSBnaXZlbiBtZXRob2QuXG4gKiBAcmV0dXJucyB2b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsKHNvdXJjZSwgbmFtZSwgcmVwbGFjZW1lbnQpIHtcbiAgICBpZiAoIShuYW1lIGluIHNvdXJjZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgb3JpZ2luYWwgPSBzb3VyY2VbbmFtZV07XG4gICAgdmFyIHdyYXBwZWQgPSByZXBsYWNlbWVudChvcmlnaW5hbCk7XG4gICAgLy8gTWFrZSBzdXJlIGl0J3MgYSBmdW5jdGlvbiBmaXJzdCwgYXMgd2UgbmVlZCB0byBhdHRhY2ggYW4gZW1wdHkgcHJvdG90eXBlIGZvciBgZGVmaW5lUHJvcGVydGllc2AgdG8gd29ya1xuICAgIC8vIG90aGVyd2lzZSBpdCdsbCB0aHJvdyBcIlR5cGVFcnJvcjogT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgY2FsbGVkIG9uIG5vbi1vYmplY3RcIlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgaWYgKHR5cGVvZiB3cmFwcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3cmFwcGVkLnByb3RvdHlwZSA9IHdyYXBwZWQucHJvdG90eXBlIHx8IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod3JhcHBlZCwge1xuICAgICAgICAgICAgICAgIF9fc2VudHJ5X29yaWdpbmFsX186IHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcmlnaW5hbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9Pbykge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gdGhyb3cgaWYgbXVsdGlwbGUgZmlsbCBoYXBwZW5zIG9uIGEgZ2xvYmFsIG9iamVjdCBsaWtlIFhNTEh0dHBSZXF1ZXN0XG4gICAgICAgICAgICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy8yMDQzXG4gICAgICAgIH1cbiAgICB9XG4gICAgc291cmNlW25hbWVdID0gd3JhcHBlZDtcbn1cbi8qKlxuICogRW5jb2RlcyBnaXZlbiBvYmplY3QgaW50byB1cmwtZnJpZW5kbHkgZm9ybWF0XG4gKlxuICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3QgdGhhdCBjb250YWlucyBzZXJpYWxpemFibGUgdmFsdWVzXG4gKiBAcmV0dXJucyBzdHJpbmcgRW5jb2RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsRW5jb2RlKG9iamVjdCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgICAgIC5tYXAoXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVuc2FmZS1hbnlcbiAgICBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG9iamVjdFtrZXldKTsgfSlcbiAgICAgICAgLmpvaW4oJyYnKTtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyBhbnkgb2JqZWN0IGludG8gYW4gb2JqZWN0IGxpdGVyYWwgd2l0aCBhbGwgaXQncyBhdHRyaWJ1dGVzXG4gKiBhdHRhY2hlZCB0byBpdC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgSW5pdGlhbCBzb3VyY2UgdGhhdCB3ZSBoYXZlIHRvIHRyYW5zZm9ybSBpbiBvcmRlciB0byBiZSB1c2FibGUgYnkgdGhlIHNlcmlhbGl6ZXJcbiAqL1xuZnVuY3Rpb24gZ2V0V2Fsa1NvdXJjZSh2YWx1ZSkge1xuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgICB2YXIgZXJyb3IgPSB2YWx1ZTtcbiAgICAgICAgdmFyIGVyciA9IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBpIGluIGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCBpKSkge1xuICAgICAgICAgICAgICAgIGVycltpXSA9IGVycm9yW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGlmIChpc0V2ZW50KHZhbHVlKSkge1xuICAgICAgICB2YXIgZXZlbnRfMSA9IHZhbHVlO1xuICAgICAgICB2YXIgc291cmNlID0ge307XG4gICAgICAgIHNvdXJjZS50eXBlID0gZXZlbnRfMS50eXBlO1xuICAgICAgICAvLyBBY2Nlc3NpbmcgZXZlbnQudGFyZ2V0IGNhbiB0aHJvdyAoc2VlIGdldHNlbnRyeS9yYXZlbi1qcyM4MzgsICM3NjgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzb3VyY2UudGFyZ2V0ID0gaXNFbGVtZW50KGV2ZW50XzEudGFyZ2V0KVxuICAgICAgICAgICAgICAgID8gaHRtbFRyZWVBc1N0cmluZyhldmVudF8xLnRhcmdldClcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChldmVudF8xLnRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9vTykge1xuICAgICAgICAgICAgc291cmNlLnRhcmdldCA9ICc8dW5rbm93bj4nO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzb3VyY2UuY3VycmVudFRhcmdldCA9IGlzRWxlbWVudChldmVudF8xLmN1cnJlbnRUYXJnZXQpXG4gICAgICAgICAgICAgICAgPyBodG1sVHJlZUFzU3RyaW5nKGV2ZW50XzEuY3VycmVudFRhcmdldClcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChldmVudF8xLmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfb08pIHtcbiAgICAgICAgICAgIHNvdXJjZS5jdXJyZW50VGFyZ2V0ID0gJzx1bmtub3duPic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICAgICAgaWYgKHR5cGVvZiBDdXN0b21FdmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNJbnN0YW5jZU9mKHZhbHVlLCBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHNvdXJjZS5kZXRhaWwgPSBldmVudF8xLmRldGFpbDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpIGluIGV2ZW50XzEpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXZlbnRfMSwgaSkpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VbaV0gPSBldmVudF8xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbi8qKiBDYWxjdWxhdGVzIGJ5dGVzIHNpemUgb2YgaW5wdXQgc3RyaW5nICovXG5mdW5jdGlvbiB1dGY4TGVuZ3RoKHZhbHVlKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICByZXR1cm4gfi1lbmNvZGVVUkkodmFsdWUpLnNwbGl0KC8lLi58Li8pLmxlbmd0aDtcbn1cbi8qKiBDYWxjdWxhdGVzIGJ5dGVzIHNpemUgb2YgaW5wdXQgb2JqZWN0ICovXG5mdW5jdGlvbiBqc29uU2l6ZSh2YWx1ZSkge1xuICAgIHJldHVybiB1dGY4TGVuZ3RoKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG59XG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUb1NpemUob2JqZWN0LCBcbi8vIERlZmF1bHQgTm9kZS5qcyBSRVBMIGRlcHRoXG5kZXB0aCwgXG4vLyAxMDBrQiwgYXMgMjAwa0IgaXMgbWF4IHBheWxvYWQgc2l6ZSwgc28gaGFsZiBzb3VuZHMgcmVhc29uYWJsZVxubWF4U2l6ZSkge1xuICAgIGlmIChkZXB0aCA9PT0gdm9pZCAwKSB7IGRlcHRoID0gMzsgfVxuICAgIGlmIChtYXhTaXplID09PSB2b2lkIDApIHsgbWF4U2l6ZSA9IDEwMCAqIDEwMjQ7IH1cbiAgICB2YXIgc2VyaWFsaXplZCA9IG5vcm1hbGl6ZShvYmplY3QsIGRlcHRoKTtcbiAgICBpZiAoanNvblNpemUoc2VyaWFsaXplZCkgPiBtYXhTaXplKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVUb1NpemUob2JqZWN0LCBkZXB0aCAtIDEsIG1heFNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZDtcbn1cbi8qKiBUcmFuc2Zvcm1zIGFueSBpbnB1dCB2YWx1ZSBpbnRvIGEgc3RyaW5nIGZvcm0sIGVpdGhlciBwcmltaXRpdmUgdmFsdWUgb3IgYSB0eXBlIG9mIHRoZSBpbnB1dCAqL1xuZnVuY3Rpb24gc2VyaWFsaXplVmFsdWUodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgLy8gTm9kZS5qcyBSRVBMIG5vdGF0aW9uXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgcmV0dXJuICdbT2JqZWN0XSc7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgICAgIHJldHVybiAnW0FycmF5XSc7XG4gICAgfVxuICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICAgIHJldHVybiBpc1ByaW1pdGl2ZShub3JtYWxpemVkKSA/IG5vcm1hbGl6ZWQgOiB0eXBlO1xufVxuLyoqXG4gKiBub3JtYWxpemVWYWx1ZSgpXG4gKlxuICogVGFrZXMgdW5zZXJpYWxpemFibGUgaW5wdXQgYW5kIG1ha2UgaXQgc2VyaWFsaXphYmxlIGZyaWVuZGx5XG4gKlxuICogLSB0cmFuc2xhdGVzIHVuZGVmaW5lZC9OYU4gdmFsdWVzIHRvIFwiW3VuZGVmaW5lZF1cIi9cIltOYU5dXCIgcmVzcGVjdGl2ZWx5LFxuICogLSBzZXJpYWxpemVzIEVycm9yIG9iamVjdHNcbiAqIC0gZmlsdGVyIGdsb2JhbCBvYmplY3RzXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjeWNsb21hdGljLWNvbXBsZXhpdHlcbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoa2V5ID09PSAnZG9tYWluJyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLl9ldmVudHMpIHtcbiAgICAgICAgcmV0dXJuICdbRG9tYWluXSc7XG4gICAgfVxuICAgIGlmIChrZXkgPT09ICdkb21haW5FbWl0dGVyJykge1xuICAgICAgICByZXR1cm4gJ1tEb21haW5FbWl0dGVyXSc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSA9PT0gZ2xvYmFsKSB7XG4gICAgICAgIHJldHVybiAnW0dsb2JhbF0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgPT09IHdpbmRvdykge1xuICAgICAgICByZXR1cm4gJ1tXaW5kb3ddJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgPT09IGRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiAnW0RvY3VtZW50XSc7XG4gICAgfVxuICAgIC8vIFJlYWN0J3MgU3ludGhldGljRXZlbnQgdGhpbmd5XG4gICAgaWYgKGlzU3ludGhldGljRXZlbnQodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAnW1N5bnRoZXRpY0V2ZW50XSc7XG4gICAgfVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10YXV0b2xvZ3ktZXhwcmVzc2lvblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gJ1tOYU5dJztcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuICdbdW5kZWZpbmVkXSc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFwiW0Z1bmN0aW9uOiBcIiArIGdldEZ1bmN0aW9uTmFtZSh2YWx1ZSkgKyBcIl1cIjtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuLyoqXG4gKiBXYWxrcyBhbiBvYmplY3QgdG8gcGVyZm9ybSBhIG5vcm1hbGl6YXRpb24gb24gaXRcbiAqXG4gKiBAcGFyYW0ga2V5IG9mIG9iamVjdCB0aGF0J3Mgd2Fsa2VkIGluIGN1cnJlbnQgaXRlcmF0aW9uXG4gKiBAcGFyYW0gdmFsdWUgb2JqZWN0IHRvIGJlIHdhbGtlZFxuICogQHBhcmFtIGRlcHRoIE9wdGlvbmFsIG51bWJlciBpbmRpY2F0aW5nIGhvdyBkZWVwIHNob3VsZCB3YWxraW5nIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG1lbW8gT3B0aW9uYWwgTWVtbyBjbGFzcyBoYW5kbGluZyBkZWN5Y2xpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhbGsoa2V5LCB2YWx1ZSwgZGVwdGgsIG1lbW8pIHtcbiAgICBpZiAoZGVwdGggPT09IHZvaWQgMCkgeyBkZXB0aCA9ICtJbmZpbml0eTsgfVxuICAgIGlmIChtZW1vID09PSB2b2lkIDApIHsgbWVtbyA9IG5ldyBNZW1vKCk7IH1cbiAgICAvLyBJZiB3ZSByZWFjaCB0aGUgbWF4aW11bSBkZXB0aCwgc2VyaWFsaXplIHdoYXRldmVyIGhhcyBsZWZ0XG4gICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIC8vIElmIHZhbHVlIGltcGxlbWVudHMgYHRvSlNPTmAgbWV0aG9kLCBjYWxsIGl0IGFuZCByZXR1cm4gZWFybHlcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9KU09OKCk7XG4gICAgfVxuICAgIC8vIHRzbGludDplbmFibGU6bm8tdW5zYWZlLWFueVxuICAgIC8vIElmIG5vcm1hbGl6ZWQgdmFsdWUgaXMgYSBwcmltaXRpdmUsIHRoZXJlIGFyZSBubyBicmFuY2hlcyBsZWZ0IHRvIHdhbGssIHNvIHdlIGNhbiBqdXN0IGJhaWwgb3V0LCBhcyB0aGVyZXMgbm8gcG9pbnQgaW4gZ29pbmcgZG93biB0aGF0IGJyYW5jaCBhbnkgZnVydGhlclxuICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUodmFsdWUsIGtleSk7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG5vcm1hbGl6ZWQpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgc291cmNlIHRoYXQgd2Ugd2lsbCB1c2UgZm9yIG5leHQgaXR0ZXJhdGlvbnMsIGVpdGhlciBvYmplY3RpZmllZCBlcnJvciBvYmplY3QgKEVycm9yIHR5cGUgd2l0aCBleHRyYWN0ZWQga2V5czp2YWx1ZSBwYWlycykgb3IgdGhlIGlucHV0IGl0c2VsZlxuICAgIHZhciBzb3VyY2UgPSBnZXRXYWxrU291cmNlKHZhbHVlKTtcbiAgICAvLyBDcmVhdGUgYW4gYWNjdW11bGF0b3IgdGhhdCB3aWxsIGFjdCBhcyBhIHBhcmVudCBmb3IgYWxsIGZ1dHVyZSBpdHRlcmF0aW9ucyBvZiB0aGF0IGJyYW5jaFxuICAgIHZhciBhY2MgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFtdIDoge307XG4gICAgLy8gSWYgd2UgYWxyZWFkeSB3YWxrZWQgdGhhdCBicmFuY2gsIGJhaWwgb3V0LCBhcyBpdCdzIGNpcmN1bGFyIHJlZmVyZW5jZVxuICAgIGlmIChtZW1vLm1lbW9pemUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAnW0NpcmN1bGFyIH5dJztcbiAgICB9XG4gICAgLy8gV2FsayBhbGwga2V5cyBvZiB0aGUgc291cmNlXG4gICAgZm9yICh2YXIgaW5uZXJLZXkgaW4gc291cmNlKSB7XG4gICAgICAgIC8vIEF2b2lkIGl0ZXJhdGluZyBvdmVyIGZpZWxkcyBpbiB0aGUgcHJvdG90eXBlIGlmIHRoZXkndmUgc29tZWhvdyBiZWVuIGV4cG9zZWQgdG8gZW51bWVyYXRpb24uXG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwgaW5uZXJLZXkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSB3YWxrIHRocm91Z2ggYWxsIHRoZSBjaGlsZCBub2Rlc1xuICAgICAgICBhY2NbaW5uZXJLZXldID0gd2Fsayhpbm5lcktleSwgc291cmNlW2lubmVyS2V5XSwgZGVwdGggLSAxLCBtZW1vKTtcbiAgICB9XG4gICAgLy8gT25jZSB3YWxrZWQgdGhyb3VnaCBhbGwgdGhlIGJyYW5jaGVzLCByZW1vdmUgdGhlIHBhcmVudCBmcm9tIG1lbW8gc3RvcmFnZVxuICAgIG1lbW8udW5tZW1vaXplKHZhbHVlKTtcbiAgICAvLyBSZXR1cm4gYWNjdW11bGF0ZWQgdmFsdWVzXG4gICAgcmV0dXJuIGFjYztcbn1cbi8qKlxuICogbm9ybWFsaXplKClcbiAqXG4gKiAtIENyZWF0ZXMgYSBjb3B5IHRvIHByZXZlbnQgb3JpZ2luYWwgaW5wdXQgbXV0YXRpb25cbiAqIC0gU2tpcCBub24tZW51bWVyYWJsZXJzXG4gKiAtIENhbGxzIGB0b0pTT05gIGlmIGltcGxlbWVudGVkXG4gKiAtIFJlbW92ZXMgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICogLSBUcmFuc2xhdGVzIG5vbi1zZXJpYWxpemVhYmxlIHZhbHVlcyAodW5kZWZpbmVkL05hTi9GdW5jdGlvbnMpIHRvIHNlcmlhbGl6YWJsZSBmb3JtYXRcbiAqIC0gVHJhbnNsYXRlcyBrbm93biBnbG9iYWwgb2JqZWN0cy9DbGFzc2VzIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uc1xuICogLSBUYWtlcyBjYXJlIG9mIEVycm9yIG9iamVjdHMgc2VyaWFsaXphdGlvblxuICogLSBPcHRpb25hbGx5IGxpbWl0IGRlcHRoIG9mIGZpbmFsIG91dHB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKGlucHV0LCBkZXB0aCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnNhZmUtYW55XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGlucHV0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeyByZXR1cm4gd2FsayhrZXksIHZhbHVlLCBkZXB0aCk7IH0pKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9vTykge1xuICAgICAgICByZXR1cm4gJyoqbm9uLXNlcmlhbGl6YWJsZSoqJztcbiAgICB9XG59XG4vKipcbiAqIEdpdmVuIGFueSBjYXB0dXJlZCBleGNlcHRpb24sIGV4dHJhY3QgaXRzIGtleXMgYW5kIGNyZWF0ZSBhIHNvcnRlZFxuICogYW5kIHRydW5jYXRlZCBsaXN0IHRoYXQgd2lsbCBiZSB1c2VkIGluc2lkZSB0aGUgZXZlbnQgbWVzc2FnZS5cbiAqIGVnLiBgTm9uLWVycm9yIGV4Y2VwdGlvbiBjYXB0dXJlZCB3aXRoIGtleXM6IGZvbywgYmFyLCBiYXpgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXhjZXB0aW9uS2V5c0Zvck1lc3NhZ2UoZXhjZXB0aW9uLCBtYXhMZW5ndGgpIHtcbiAgICBpZiAobWF4TGVuZ3RoID09PSB2b2lkIDApIHsgbWF4TGVuZ3RoID0gNDA7IH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhnZXRXYWxrU291cmNlKGV4Y2VwdGlvbikpO1xuICAgIGtleXMuc29ydCgpO1xuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuICdbb2JqZWN0IGhhcyBubyBrZXlzXSc7XG4gICAgfVxuICAgIGlmIChrZXlzWzBdLmxlbmd0aCA+PSBtYXhMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRydW5jYXRlKGtleXNbMF0sIG1heExlbmd0aCk7XG4gICAgfVxuICAgIGZvciAodmFyIGluY2x1ZGVkS2V5cyA9IGtleXMubGVuZ3RoOyBpbmNsdWRlZEtleXMgPiAwOyBpbmNsdWRlZEtleXMtLSkge1xuICAgICAgICB2YXIgc2VyaWFsaXplZCA9IGtleXMuc2xpY2UoMCwgaW5jbHVkZWRLZXlzKS5qb2luKCcsICcpO1xuICAgICAgICBpZiAoc2VyaWFsaXplZC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlZEtleXMgPT09IGtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1bmNhdGUoc2VyaWFsaXplZCwgbWF4TGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBHaXZlbiBhbnkgb2JqZWN0LCByZXR1cm4gdGhlIG5ldyBvYmplY3Qgd2l0aCByZW1vdmVkIGtleXMgdGhhdCB2YWx1ZSB3YXMgYHVuZGVmaW5lZGAuXG4gKiBXb3JrcyByZWN1cnNpdmVseSBvbiBvYmplY3RzIGFuZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcm9wVW5kZWZpbmVkS2V5cyh2YWwpIHtcbiAgICB2YXIgZV8xLCBfYTtcbiAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICAgIHZhciBvYmogPSB2YWw7XG4gICAgICAgIHZhciBydiA9IHt9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSB0c2xpYl8xLl9fdmFsdWVzKE9iamVjdC5rZXlzKG9iaikpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ2W2tleV0gPSBkcm9wVW5kZWZpbmVkS2V5cyhvYmpba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ2O1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiB2YWwubWFwKGRyb3BVbmRlZmluZWRLZXlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdC5qcy5tYXAiLCIvLyBTbGlnaHRseSBtb2RpZmllZCAobm8gSUU4IHN1cHBvcnQsIEVTNikgYW5kIHRyYW5zY3JpYmVkIHRvIFR5cGVTY3JpcHRcbi8vIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jYWx2aW5tZXRjYWxmL3JvbGx1cC1wbHVnaW4tbm9kZS1idWlsdGlucy9tYXN0ZXIvc3JjL2VzNi9wYXRoLmpzXG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAgIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gICAgdmFyIHVwID0gMDtcbiAgICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGxhc3QgPSBwYXJ0c1tpXTtcbiAgICAgICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIHVwKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXApIHtcbiAgICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIHVwLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICAgIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgICAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgICAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzO1xufVxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPSAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gc3BsaXRQYXRoKGZpbGVuYW1lKSB7XG4gICAgdmFyIHBhcnRzID0gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSk7XG4gICAgcmV0dXJuIHBhcnRzID8gcGFydHMuc2xpY2UoMSkgOiBbXTtcbn1cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciByZXNvbHZlZFBhdGggPSAnJztcbiAgICB2YXIgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgICAgICB2YXIgcGF0aCA9IGkgPj0gMCA/IGFyZ3NbaV0gOiAnLyc7XG4gICAgICAgIC8vIFNraXAgZW1wdHkgZW50cmllc1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyBcIi9cIiArIHJlc29sdmVkUGF0aDtcbiAgICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gICAgfVxuICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcbiAgICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShyZXNvbHZlZFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuICEhcDsgfSksICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCcvJyk7XG4gICAgcmV0dXJuIChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoIHx8ICcuJztcbn1cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xufVxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlKGZyb20sIHRvKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgIGZyb20gPSByZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgICB0byA9IHJlc29sdmUodG8pLnN1YnN0cigxKTtcbiAgICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICAgIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcbiAgICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICAgIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XG4gICAgICAgICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIG91dHB1dFBhcnRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xuICAgIH1cbiAgICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuICAgIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59XG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdmFyIGlzUGF0aEFic29sdXRlID0gaXNBYnNvbHV0ZShwYXRoKTtcbiAgICB2YXIgdHJhaWxpbmdTbGFzaCA9IHBhdGguc3Vic3RyKC0xKSA9PT0gJy8nO1xuICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICAgIHZhciBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KHBhdGguc3BsaXQoJy8nKS5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuICEhcDsgfSksICFpc1BhdGhBYnNvbHV0ZSkuam9pbignLycpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGggJiYgIWlzUGF0aEFic29sdXRlKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRQYXRoID0gJy4nO1xuICAgIH1cbiAgICBpZiAobm9ybWFsaXplZFBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgICAgICBub3JtYWxpemVkUGF0aCArPSAnLyc7XG4gICAgfVxuICAgIHJldHVybiAoaXNQYXRoQWJzb2x1dGUgPyAnLycgOiAnJykgKyBub3JtYWxpemVkUGF0aDtcbn1cbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJzb2x1dGUocGF0aCkge1xuICAgIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufVxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gam9pbigpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgoYXJncy5qb2luKCcvJykpO1xufVxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gZGlybmFtZShwYXRoKSB7XG4gICAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKTtcbiAgICB2YXIgcm9vdCA9IHJlc3VsdFswXTtcbiAgICB2YXIgZGlyID0gcmVzdWx0WzFdO1xuICAgIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxuICAgICAgICByZXR1cm4gJy4nO1xuICAgIH1cbiAgICBpZiAoZGlyKSB7XG4gICAgICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gcm9vdCArIGRpcjtcbn1cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2VuYW1lKHBhdGgsIGV4dCkge1xuICAgIHZhciBmID0gc3BsaXRQYXRoKHBhdGgpWzJdO1xuICAgIGlmIChleHQgJiYgZi5zdWJzdHIoZXh0Lmxlbmd0aCAqIC0xKSA9PT0gZXh0KSB7XG4gICAgICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gZjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdGguanMubWFwIiwiZXhwb3J0IHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSA/IHNldFByb3RvT2YgOiBtaXhpblByb3BlcnRpZXMpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXVuYm91bmQtbWV0aG9kXG4vKipcbiAqIHNldFByb3RvdHlwZU9mIHBvbHlmaWxsIHVzaW5nIF9fcHJvdG9fX1xuICovXG5mdW5jdGlvbiBzZXRQcm90b09mKG9iaiwgcHJvdG8pIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb2JqLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBvYmo7XG59XG4vKipcbiAqIHNldFByb3RvdHlwZU9mIHBvbHlmaWxsIHVzaW5nIG1peGluXG4gKi9cbmZ1bmN0aW9uIG1peGluUHJvcGVydGllcyhvYmosIHByb3RvKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBwcm90bykge1xuICAgICAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgb2JqW3Byb3BdID0gcHJvdG9bcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbHlmaWxsLmpzLm1hcCIsImltcG9ydCB7IFNlbnRyeUVycm9yIH0gZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQgeyBTeW5jUHJvbWlzZSB9IGZyb20gJy4vc3luY3Byb21pc2UnO1xuLyoqIEEgc2ltcGxlIHF1ZXVlIHRoYXQgaG9sZHMgcHJvbWlzZXMuICovXG52YXIgUHJvbWlzZUJ1ZmZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQcm9taXNlQnVmZmVyKF9saW1pdCkge1xuICAgICAgICB0aGlzLl9saW1pdCA9IF9saW1pdDtcbiAgICAgICAgLyoqIEludGVybmFsIHNldCBvZiBxdWV1ZWQgUHJvbWlzZXMgKi9cbiAgICAgICAgdGhpcy5fYnVmZmVyID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNheXMgaWYgdGhlIGJ1ZmZlciBpcyByZWFkeSB0byB0YWtlIG1vcmUgcmVxdWVzdHNcbiAgICAgKi9cbiAgICBQcm9taXNlQnVmZmVyLnByb3RvdHlwZS5pc1JlYWR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGltaXQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxlbmd0aCgpIDwgdGhpcy5fbGltaXQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBwcm9taXNlIHRvIHRoZSBxdWV1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXNrIENhbiBiZSBhbnkgUHJvbWlzZUxpa2U8VD5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3JpZ2luYWwgcHJvbWlzZS5cbiAgICAgKi9cbiAgICBQcm9taXNlQnVmZmVyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuaXNSZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KG5ldyBTZW50cnlFcnJvcignTm90IGFkZGluZyBQcm9taXNlIGR1ZSB0byBidWZmZXIgbGltaXQgcmVhY2hlZC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlci5pbmRleE9mKHRhc2spID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fYnVmZmVyLnB1c2godGFzayk7XG4gICAgICAgIH1cbiAgICAgICAgdGFza1xuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMucmVtb3ZlKHRhc2spOyB9KVxuICAgICAgICAgICAgLnRoZW4obnVsbCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJlbW92ZSh0YXNrKS50aGVuKG51bGwsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGFkZCB0aGlzIGNhdGNoIGhlcmUgb3RoZXJ3aXNlIHdlIGhhdmUgYW4gdW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvblxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyBhIG5ldyBQcm9taXNlIGNoYWluLlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGFzaztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHByb21pc2UgdG8gdGhlIHF1ZXVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhc2sgQ2FuIGJlIGFueSBQcm9taXNlTGlrZTxUPlxuICAgICAqIEByZXR1cm5zIFJlbW92ZWQgcHJvbWlzZS5cbiAgICAgKi9cbiAgICBQcm9taXNlQnVmZmVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICB2YXIgcmVtb3ZlZFRhc2sgPSB0aGlzLl9idWZmZXIuc3BsaWNlKHRoaXMuX2J1ZmZlci5pbmRleE9mKHRhc2spLCAxKVswXTtcbiAgICAgICAgcmV0dXJuIHJlbW92ZWRUYXNrO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5yZXNvbHZlZCBwcm9taXNlcyBpbiB0aGUgcXVldWUuXG4gICAgICovXG4gICAgUHJvbWlzZUJ1ZmZlci5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmxlbmd0aDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBkcmFpbiB0aGUgd2hvbGUgcXVldWUsIHJldHVybnMgdHJ1ZSBpZiBxdWV1ZSBpcyBlbXB0eSBvciBkcmFpbmVkLlxuICAgICAqIElmIHRpbWVvdXQgaXMgcHJvdmlkZWQgYW5kIHRoZSBxdWV1ZSB0YWtlcyBsb25nZXIgdG8gZHJhaW4sIHRoZSBwcm9taXNlIHN0aWxsIHJlc29sdmVzIGJ1dCB3aXRoIGZhbHNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRpbWVvdXQgTnVtYmVyIGluIG1zIHRvIHdhaXQgdW50aWwgaXQgcmVzb2x2ZXMgd2l0aCBmYWxzZS5cbiAgICAgKi9cbiAgICBQcm9taXNlQnVmZmVyLnByb3RvdHlwZS5kcmFpbiA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHZhciBjYXB0dXJlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCAmJiB0aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIFN5bmNQcm9taXNlLmFsbChfdGhpcy5fYnVmZmVyKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY2FwdHVyZWRTZXRUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbihudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBQcm9taXNlQnVmZmVyO1xufSgpKTtcbmV4cG9ydCB7IFByb21pc2VCdWZmZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb21pc2VidWZmZXIuanMubWFwIiwiaW1wb3J0IHsgaXNSZWdFeHAsIGlzU3RyaW5nIH0gZnJvbSAnLi9pcyc7XG4vKipcbiAqIFRydW5jYXRlcyBnaXZlbiBzdHJpbmcgdG8gdGhlIG1heGltdW0gY2hhcmFjdGVycyBjb3VudFxuICpcbiAqIEBwYXJhbSBzdHIgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgc2VyaWFsaXphYmxlIHZhbHVlc1xuICogQHBhcmFtIG1heCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRydW5jYXRlZCBzdHJpbmdcbiAqIEByZXR1cm5zIHN0cmluZyBFbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZShzdHIsIG1heCkge1xuICAgIGlmIChtYXggPT09IHZvaWQgMCkgeyBtYXggPSAwOyB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgbWF4ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHIubGVuZ3RoIDw9IG1heCA/IHN0ciA6IHN0ci5zdWJzdHIoMCwgbWF4KSArIFwiLi4uXCI7XG59XG4vKipcbiAqIFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgYHRyaW1fbGluZWAgZnJvbVxuICogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnkvYmxvYi9tYXN0ZXIvc3JjL3NlbnRyeS9sYW5nL2phdmFzY3JpcHQvcHJvY2Vzc29yLnB5I0w2N1xuICpcbiAqIEBwYXJhbSBzdHIgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgc2VyaWFsaXphYmxlIHZhbHVlc1xuICogQHBhcmFtIG1heCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRydW5jYXRlZCBzdHJpbmdcbiAqIEByZXR1cm5zIHN0cmluZyBFbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbmlwTGluZShsaW5lLCBjb2xubykge1xuICAgIHZhciBuZXdMaW5lID0gbGluZTtcbiAgICB2YXIgbGwgPSBuZXdMaW5lLmxlbmd0aDtcbiAgICBpZiAobGwgPD0gMTUwKSB7XG4gICAgICAgIHJldHVybiBuZXdMaW5lO1xuICAgIH1cbiAgICBpZiAoY29sbm8gPiBsbCkge1xuICAgICAgICBjb2xubyA9IGxsOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXBhcmFtZXRlci1yZWFzc2lnbm1lbnRcbiAgICB9XG4gICAgdmFyIHN0YXJ0ID0gTWF0aC5tYXgoY29sbm8gLSA2MCwgMCk7XG4gICAgaWYgKHN0YXJ0IDwgNSkge1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgfVxuICAgIHZhciBlbmQgPSBNYXRoLm1pbihzdGFydCArIDE0MCwgbGwpO1xuICAgIGlmIChlbmQgPiBsbCAtIDUpIHtcbiAgICAgICAgZW5kID0gbGw7XG4gICAgfVxuICAgIGlmIChlbmQgPT09IGxsKSB7XG4gICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoZW5kIC0gMTQwLCAwKTtcbiAgICB9XG4gICAgbmV3TGluZSA9IG5ld0xpbmUuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgaWYgKHN0YXJ0ID4gMCkge1xuICAgICAgICBuZXdMaW5lID0gXCIne3NuaXB9IFwiICsgbmV3TGluZTtcbiAgICB9XG4gICAgaWYgKGVuZCA8IGxsKSB7XG4gICAgICAgIG5ld0xpbmUgKz0gJyB7c25pcH0nO1xuICAgIH1cbiAgICByZXR1cm4gbmV3TGluZTtcbn1cbi8qKlxuICogSm9pbiB2YWx1ZXMgaW4gYXJyYXlcbiAqIEBwYXJhbSBpbnB1dCBhcnJheSBvZiB2YWx1ZXMgdG8gYmUgam9pbmVkIHRvZ2V0aGVyXG4gKiBAcGFyYW0gZGVsaW1pdGVyIHN0cmluZyB0byBiZSBwbGFjZWQgaW4tYmV0d2VlbiB2YWx1ZXNcbiAqIEByZXR1cm5zIEpvaW5lZCB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVKb2luKGlucHV0LCBkZWxpbWl0ZXIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgdmFyIG91dHB1dCA9IFtdO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCgnW3ZhbHVlIGNhbm5vdCBiZSBzZXJpYWxpemVkXScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQuam9pbihkZWxpbWl0ZXIpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHZhbHVlIG1hdGNoZXMgYSByZWdleCBvciBpbmNsdWRlcyB0aGUgc3RyaW5nXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB2YWx1ZSB0byBiZSBjaGVja2VkIGFnYWluc3RcbiAqIEBwYXJhbSBwYXR0ZXJuIEVpdGhlciBhIHJlZ2V4IG9yIGEgc3RyaW5nIHRoYXQgbXVzdCBiZSBjb250YWluZWQgaW4gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hpbmdQYXR0ZXJuKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgaWYgKCFpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCh2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmluZGV4T2YocGF0dGVybikgIT09IC0xO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmcuanMubWFwIiwiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnLi9taXNjJztcbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIEVycm9yRXZlbnQgb2JqZWN0c1xuICoge0BsaW5rIHN1cHBvcnRzRXJyb3JFdmVudH0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzRXJyb3JFdmVudCgpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgRXJyb3JFdmVudCgnJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRE9NRXJyb3Igb2JqZWN0c1xuICoge0BsaW5rIHN1cHBvcnRzRE9NRXJyb3J9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0RPTUVycm9yKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEl0IHJlYWxseSBuZWVkcyAxIGFyZ3VtZW50LCBub3QgMC5cbiAgICAgICAgLy8gQ2hyb21lOiBWTTg5OjEgVW5jYXVnaHQgVHlwZUVycm9yOiBGYWlsZWQgdG8gY29uc3RydWN0ICdET01FcnJvcic6XG4gICAgICAgIC8vIDEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgRE9NRXJyb3IoJycpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIERPTUV4Y2VwdGlvbiBvYmplY3RzXG4gKiB7QGxpbmsgc3VwcG9ydHNET01FeGNlcHRpb259LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0RPTUV4Y2VwdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgRE9NRXhjZXB0aW9uKCcnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBGZXRjaCBBUElcbiAqIHtAbGluayBzdXBwb3J0c0ZldGNofS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNGZXRjaCgpIHtcbiAgICBpZiAoISgnZmV0Y2gnIGluIGdldEdsb2JhbE9iamVjdCgpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgSGVhZGVycygpO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgbmV3IFJlcXVlc3QoJycpO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgbmV3IFJlc3BvbnNlKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBpc05hdGl2ZUZldGNoIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZmV0Y2goKVxuICovXG5mdW5jdGlvbiBpc05hdGl2ZUZldGNoKGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuYyAmJiAvXmZ1bmN0aW9uIGZldGNoXFwoXFwpXFxzK1xce1xccytcXFtuYXRpdmUgY29kZVxcXVxccytcXH0kLy50ZXN0KGZ1bmMudG9TdHJpbmcoKSk7XG59XG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBGZXRjaCBBUEkgbmF0aXZlbHlcbiAqIHtAbGluayBzdXBwb3J0c05hdGl2ZUZldGNofS5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGB3aW5kb3cuZmV0Y2hgIGlzIG5hdGl2ZWx5IGltcGxlbWVudGVkLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzTmF0aXZlRmV0Y2goKSB7XG4gICAgaWYgKCFzdXBwb3J0c0ZldGNoKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gICAgLy8gRmFzdCBwYXRoIHRvIGF2b2lkIERPTSBJL09cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5ib3VuZC1tZXRob2RcbiAgICBpZiAoaXNOYXRpdmVGZXRjaChnbG9iYWwuZmV0Y2gpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyB3aW5kb3cuZmV0Y2ggaXMgaW1wbGVtZW50ZWQsIGJ1dCBpcyBwb2x5ZmlsbGVkIG9yIGFscmVhZHkgd3JhcHBlZCAoZS5nOiBieSBhIGNocm9tZSBleHRlbnNpb24pXG4gICAgLy8gc28gY3JlYXRlIGEgXCJwdXJlXCIgaWZyYW1lIHRvIHNlZSBpZiB0aGF0IGhhcyBuYXRpdmUgZmV0Y2hcbiAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5ib3VuZC1tZXRob2QgZGVwcmVjYXRpb25cbiAgICBpZiAoZG9jICYmIHR5cGVvZiBkb2MuY3JlYXRlRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgc2FuZGJveCA9IGRvYy5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIHNhbmRib3guaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNhbmRib3gpO1xuICAgICAgICAgICAgaWYgKHNhbmRib3guY29udGVudFdpbmRvdyAmJiBzYW5kYm94LmNvbnRlbnRXaW5kb3cuZmV0Y2gpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5ib3VuZC1tZXRob2RcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc05hdGl2ZUZldGNoKHNhbmRib3guY29udGVudFdpbmRvdy5mZXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzYW5kYm94KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignQ291bGQgbm90IGNyZWF0ZSBzYW5kYm94IGlmcmFtZSBmb3IgcHVyZSBmZXRjaCBjaGVjaywgYmFpbGluZyB0byB3aW5kb3cuZmV0Y2g6ICcsIGVycik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIFJlcG9ydGluZ09ic2VydmVyIEFQSVxuICoge0BsaW5rIHN1cHBvcnRzUmVwb3J0aW5nT2JzZXJ2ZXJ9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1JlcG9ydGluZ09ic2VydmVyKCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5zYWZlLWFueVxuICAgIHJldHVybiAnUmVwb3J0aW5nT2JzZXJ2ZXInIGluIGdldEdsb2JhbE9iamVjdCgpO1xufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgUmVmZXJyZXIgUG9saWN5IEFQSVxuICoge0BsaW5rIHN1cHBvcnRzUmVmZXJyZXJQb2xpY3l9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1JlZmVycmVyUG9saWN5KCkge1xuICAgIC8vIERlc3BpdGUgYWxsIHN0YXJzIGluIHRoZSBza3kgc2F5aW5nIHRoYXQgRWRnZSBzdXBwb3J0cyBvbGQgZHJhZnQgc3ludGF4LCBha2EgJ25ldmVyJywgJ2Fsd2F5cycsICdvcmlnaW4nIGFuZCAnZGVmYXVsdFxuICAgIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vI2ZlYXQ9cmVmZXJyZXItcG9saWN5XG4gICAgLy8gSXQgZG9lc24ndC4gQW5kIGl0IHRocm93IGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIGlnbm9yaW5nIHRoaXMgcGFyYW1ldGVyLi4uXG4gICAgLy8gUkVGOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3JhdmVuLWpzL2lzc3Vlcy8xMjMzXG4gICAgaWYgKCFzdXBwb3J0c0ZldGNoKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgUmVxdWVzdCgnXycsIHtcbiAgICAgICAgICAgIHJlZmVycmVyUG9saWN5OiAnb3JpZ2luJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgSGlzdG9yeSBBUElcbiAqIHtAbGluayBzdXBwb3J0c0hpc3Rvcnl9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0hpc3RvcnkoKSB7XG4gICAgLy8gTk9URTogaW4gQ2hyb21lIEFwcCBlbnZpcm9ubWVudCwgdG91Y2hpbmcgaGlzdG9yeS5wdXNoU3RhdGUsICpldmVuIGluc2lkZVxuICAgIC8vICAgICAgIGEgdHJ5L2NhdGNoIGJsb2NrKiwgd2lsbCBjYXVzZSBDaHJvbWUgdG8gb3V0cHV0IGFuIGVycm9yIHRvIGNvbnNvbGUuZXJyb3JcbiAgICAvLyBib3Jyb3dlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3B1bGwvMTM5NDUvZmlsZXNcbiAgICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gICAgdmFyIGNocm9tZSA9IGdsb2JhbC5jaHJvbWU7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVuc2FmZS1hbnlcbiAgICB2YXIgaXNDaHJvbWVQYWNrYWdlZEFwcCA9IGNocm9tZSAmJiBjaHJvbWUuYXBwICYmIGNocm9tZS5hcHAucnVudGltZTtcbiAgICB2YXIgaGFzSGlzdG9yeUFwaSA9ICdoaXN0b3J5JyBpbiBnbG9iYWwgJiYgISFnbG9iYWwuaGlzdG9yeS5wdXNoU3RhdGUgJiYgISFnbG9iYWwuaGlzdG9yeS5yZXBsYWNlU3RhdGU7XG4gICAgcmV0dXJuICFpc0Nocm9tZVBhY2thZ2VkQXBwICYmIGhhc0hpc3RvcnlBcGk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdXBwb3J0cy5qcy5tYXAiLCJpbXBvcnQgeyBpc1RoZW5hYmxlIH0gZnJvbSAnLi9pcyc7XG4vKiogU3luY1Byb21pc2UgaW50ZXJuYWwgc3RhdGVzICovXG52YXIgU3RhdGVzO1xuKGZ1bmN0aW9uIChTdGF0ZXMpIHtcbiAgICAvKiogUGVuZGluZyAqL1xuICAgIFN0YXRlc1tcIlBFTkRJTkdcIl0gPSBcIlBFTkRJTkdcIjtcbiAgICAvKiogUmVzb2x2ZWQgLyBPSyAqL1xuICAgIFN0YXRlc1tcIlJFU09MVkVEXCJdID0gXCJSRVNPTFZFRFwiO1xuICAgIC8qKiBSZWplY3RlZCAvIEVycm9yICovXG4gICAgU3RhdGVzW1wiUkVKRUNURURcIl0gPSBcIlJFSkVDVEVEXCI7XG59KShTdGF0ZXMgfHwgKFN0YXRlcyA9IHt9KSk7XG4vKipcbiAqIFRoZW5hYmxlIGNsYXNzIHRoYXQgYmVoYXZlcyBsaWtlIGEgUHJvbWlzZSBhbmQgZm9sbG93cyBpdCdzIGludGVyZmFjZVxuICogYnV0IGlzIG5vdCBhc3luYyBpbnRlcm5hbGx5XG4gKi9cbnZhciBTeW5jUHJvbWlzZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTeW5jUHJvbWlzZShleGVjdXRvcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IFN0YXRlcy5QRU5ESU5HO1xuICAgICAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuICAgICAgICAvKiogSlNEb2MgKi9cbiAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgX3RoaXMuX3NldFJlc3VsdChTdGF0ZXMuUkVTT0xWRUQsIHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEpTRG9jICovXG4gICAgICAgIHRoaXMuX3JlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIF90aGlzLl9zZXRSZXN1bHQoU3RhdGVzLlJFSkVDVEVELCByZWFzb24pO1xuICAgICAgICB9O1xuICAgICAgICAvKiogSlNEb2MgKi9cbiAgICAgICAgdGhpcy5fc2V0UmVzdWx0ID0gZnVuY3Rpb24gKHN0YXRlLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKF90aGlzLl9zdGF0ZSAhPT0gU3RhdGVzLlBFTkRJTkcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKF90aGlzLl9yZXNvbHZlLCBfdGhpcy5fcmVqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgIF90aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgX3RoaXMuX2V4ZWN1dGVIYW5kbGVycygpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBUT0RPOiBGSVhNRVxuICAgICAgICAvKiogSlNEb2MgKi9cbiAgICAgICAgdGhpcy5fYXR0YWNoSGFuZGxlciA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBfdGhpcy5faGFuZGxlcnMgPSBfdGhpcy5faGFuZGxlcnMuY29uY2F0KGhhbmRsZXIpO1xuICAgICAgICAgICAgX3RoaXMuX2V4ZWN1dGVIYW5kbGVycygpO1xuICAgICAgICB9O1xuICAgICAgICAvKiogSlNEb2MgKi9cbiAgICAgICAgdGhpcy5fZXhlY3V0ZUhhbmRsZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLl9zdGF0ZSA9PT0gU3RhdGVzLlBFTkRJTkcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2FjaGVkSGFuZGxlcnMgPSBfdGhpcy5faGFuZGxlcnMuc2xpY2UoKTtcbiAgICAgICAgICAgIF90aGlzLl9oYW5kbGVycyA9IFtdO1xuICAgICAgICAgICAgY2FjaGVkSGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX3N0YXRlID09PSBTdGF0ZXMuUkVTT0xWRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIub25mdWxmaWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIub25mdWxmaWxsZWQoX3RoaXMuX3ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX3N0YXRlID09PSBTdGF0ZXMuUkVKRUNURUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIub25yZWplY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5vbnJlamVjdGVkKF90aGlzLl92YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlci5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhlY3V0b3IodGhpcy5fcmVzb2x2ZSwgdGhpcy5fcmVqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBKU0RvYyAqL1xuICAgIFN5bmNQcm9taXNlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICdbb2JqZWN0IFN5bmNQcm9taXNlXSc7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTeW5jUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFN5bmNQcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAoXywgcmVqZWN0KSB7XG4gICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTeW5jUHJvbWlzZS5hbGwgPSBmdW5jdGlvbiAoY29sbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKFwiUHJvbWlzZS5hbGwgcmVxdWlyZXMgYW4gYXJyYXkgYXMgaW5wdXQuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY291bnRlciA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHJlc29sdmVkQ29sbGVjdGlvbiA9IFtdO1xuICAgICAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIFN5bmNQcm9taXNlLnJlc29sdmUoaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkQ29sbGVjdGlvbltpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlciAtPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlciAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZWRDb2xsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgU3luY1Byb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBfdGhpcy5fYXR0YWNoSGFuZGxlcih7XG4gICAgICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgb25mdWxmaWxsZWQ6IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvbmZ1bGZpbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogwq9cXF8o44OEKV8vwq9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEZJWE1FXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25mdWxmaWxsZWQocmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25yZWplY3RlZDogZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9ucmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9ucmVqZWN0ZWQocmVhc29uKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTeW5jUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2ggPSBmdW5jdGlvbiAob25yZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIHZhbDsgfSwgb25yZWplY3RlZCk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTeW5jUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseSA9IGZ1bmN0aW9uIChvbmZpbmFsbHkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgdmFsO1xuICAgICAgICAgICAgdmFyIGlzUmVqZWN0ZWQ7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpc1JlamVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFsID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG9uZmluYWxseSkge1xuICAgICAgICAgICAgICAgICAgICBvbmZpbmFsbHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgaXNSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFsID0gcmVhc29uO1xuICAgICAgICAgICAgICAgIGlmIChvbmZpbmFsbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgb25maW5hbGx5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFN5bmNQcm9taXNlO1xufSgpKTtcbmV4cG9ydCB7IFN5bmNQcm9taXNlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zeW5jcHJvbWlzZS5qcy5tYXAiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAoIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwiIWZ1bmN0aW9uKG4sdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KG49bnx8c2VsZikuTGF6eUxvYWQ9dCgpfSh0aGlzLChmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4oKXtyZXR1cm4obj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihuKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgZT1hcmd1bWVudHNbdF07Zm9yKHZhciBpIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaSkmJihuW2ldPWVbaV0pfXJldHVybiBufSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciB0PVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3csZT10JiYhKFwib25zY3JvbGxcImluIHdpbmRvdyl8fFwidW5kZWZpbmVkXCIhPXR5cGVvZiBuYXZpZ2F0b3ImJi8oZ2xlfGluZ3xybylib3R8Y3Jhd2x8c3BpZGVyL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxpPXQmJlwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcImluIHdpbmRvdyxhPXQmJlwiY2xhc3NMaXN0XCJpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSxvPXQmJndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvPjEscj17ZWxlbWVudHNfc2VsZWN0b3I6XCIubGF6eVwiLGNvbnRhaW5lcjplfHx0P2RvY3VtZW50Om51bGwsdGhyZXNob2xkOjMwMCx0aHJlc2hvbGRzOm51bGwsZGF0YV9zcmM6XCJzcmNcIixkYXRhX3NyY3NldDpcInNyY3NldFwiLGRhdGFfc2l6ZXM6XCJzaXplc1wiLGRhdGFfYmc6XCJiZ1wiLGRhdGFfYmdfaGlkcGk6XCJiZy1oaWRwaVwiLGRhdGFfYmdfbXVsdGk6XCJiZy1tdWx0aVwiLGRhdGFfYmdfbXVsdGlfaGlkcGk6XCJiZy1tdWx0aS1oaWRwaVwiLGRhdGFfcG9zdGVyOlwicG9zdGVyXCIsY2xhc3NfYXBwbGllZDpcImFwcGxpZWRcIixjbGFzc19sb2FkaW5nOlwibG9hZGluZ1wiLGNsYXNzX2xvYWRlZDpcImxvYWRlZFwiLGNsYXNzX2Vycm9yOlwiZXJyb3JcIix1bm9ic2VydmVfY29tcGxldGVkOiEwLHVub2JzZXJ2ZV9lbnRlcmVkOiExLGNhbmNlbF9vbl9leGl0OiEwLGNhbGxiYWNrX2VudGVyOm51bGwsY2FsbGJhY2tfZXhpdDpudWxsLGNhbGxiYWNrX2FwcGxpZWQ6bnVsbCxjYWxsYmFja19sb2FkaW5nOm51bGwsY2FsbGJhY2tfbG9hZGVkOm51bGwsY2FsbGJhY2tfZXJyb3I6bnVsbCxjYWxsYmFja19maW5pc2g6bnVsbCxjYWxsYmFja19jYW5jZWw6bnVsbCx1c2VfbmF0aXZlOiExfSxjPWZ1bmN0aW9uKHQpe3JldHVybiBuKHt9LHIsdCl9LGw9ZnVuY3Rpb24obix0KXt2YXIgZSxpPW5ldyBuKHQpO3RyeXtlPW5ldyBDdXN0b21FdmVudChcIkxhenlMb2FkOjpJbml0aWFsaXplZFwiLHtkZXRhaWw6e2luc3RhbmNlOml9fSl9Y2F0Y2gobil7KGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKSkuaW5pdEN1c3RvbUV2ZW50KFwiTGF6eUxvYWQ6OkluaXRpYWxpemVkXCIsITEsITEse2luc3RhbmNlOml9KX13aW5kb3cuZGlzcGF0Y2hFdmVudChlKX0scz1mdW5jdGlvbihuLHQpe3JldHVybiBuLmdldEF0dHJpYnV0ZShcImRhdGEtXCIrdCl9LHU9ZnVuY3Rpb24obix0LGUpe3ZhciBpPVwiZGF0YS1cIit0O251bGwhPT1lP24uc2V0QXR0cmlidXRlKGksZSk6bi5yZW1vdmVBdHRyaWJ1dGUoaSl9LGQ9ZnVuY3Rpb24obil7cmV0dXJuIHMobixcImxsLXN0YXR1c1wiKX0sZj1mdW5jdGlvbihuLHQpe3JldHVybiB1KG4sXCJsbC1zdGF0dXNcIix0KX0sXz1mdW5jdGlvbihuKXtyZXR1cm4gZihuLG51bGwpfSxnPWZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT09ZChuKX0sdj1mdW5jdGlvbihuKXtyZXR1cm5cIm5hdGl2ZVwiPT09ZChuKX0scD1bXCJsb2FkaW5nXCIsXCJsb2FkZWRcIixcImFwcGxpZWRcIixcImVycm9yXCJdLGI9ZnVuY3Rpb24obix0LGUsaSl7biYmKHZvaWQgMD09PWk/dm9pZCAwPT09ZT9uKHQpOm4odCxlKTpuKHQsZSxpKSl9LGg9ZnVuY3Rpb24obix0KXthP24uY2xhc3NMaXN0LmFkZCh0KTpuLmNsYXNzTmFtZSs9KG4uY2xhc3NOYW1lP1wiIFwiOlwiXCIpK3R9LG09ZnVuY3Rpb24obix0KXthP24uY2xhc3NMaXN0LnJlbW92ZSh0KTpuLmNsYXNzTmFtZT1uLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXnxcXFxccyspXCIrdCtcIihcXFxccyt8JClcIiksXCIgXCIpLnJlcGxhY2UoL15cXHMrLyxcIlwiKS5yZXBsYWNlKC9cXHMrJC8sXCJcIil9LEU9ZnVuY3Rpb24obil7cmV0dXJuIG4ubGxUZW1wSW1hZ2V9LEk9ZnVuY3Rpb24obix0KXtpZih0KXt2YXIgZT10Ll9vYnNlcnZlcjtlJiZlLnVub2JzZXJ2ZShuKX19LHk9ZnVuY3Rpb24obix0KXtuJiYobi5sb2FkaW5nQ291bnQrPXQpfSxBPWZ1bmN0aW9uKG4sdCl7biYmKG4udG9Mb2FkQ291bnQ9dCl9LEw9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGU9W10saT0wO3Q9bi5jaGlsZHJlbltpXTtpKz0xKVwiU09VUkNFXCI9PT10LnRhZ05hbWUmJmUucHVzaCh0KTtyZXR1cm4gZX0sdz1mdW5jdGlvbihuLHQsZSl7ZSYmbi5zZXRBdHRyaWJ1dGUodCxlKX0sej1mdW5jdGlvbihuLHQpe24ucmVtb3ZlQXR0cmlidXRlKHQpfSxrPWZ1bmN0aW9uKG4pe3JldHVybiEhbi5sbE9yaWdpbmFsQXR0cnN9LE89ZnVuY3Rpb24obil7aWYoIWsobikpe3ZhciB0PXt9O3Quc3JjPW4uZ2V0QXR0cmlidXRlKFwic3JjXCIpLHQuc3Jjc2V0PW4uZ2V0QXR0cmlidXRlKFwic3Jjc2V0XCIpLHQuc2l6ZXM9bi5nZXRBdHRyaWJ1dGUoXCJzaXplc1wiKSxuLmxsT3JpZ2luYWxBdHRycz10fX0sQz1mdW5jdGlvbihuKXtpZihrKG4pKXt2YXIgdD1uLmxsT3JpZ2luYWxBdHRyczt3KG4sXCJzcmNcIix0LnNyYyksdyhuLFwic3Jjc2V0XCIsdC5zcmNzZXQpLHcobixcInNpemVzXCIsdC5zaXplcyl9fSxOPWZ1bmN0aW9uKG4sdCl7dyhuLFwic2l6ZXNcIixzKG4sdC5kYXRhX3NpemVzKSksdyhuLFwic3Jjc2V0XCIscyhuLHQuZGF0YV9zcmNzZXQpKSx3KG4sXCJzcmNcIixzKG4sdC5kYXRhX3NyYykpfSx4PWZ1bmN0aW9uKG4pe3oobixcInNyY1wiKSx6KG4sXCJzcmNzZXRcIikseihuLFwic2l6ZXNcIil9LE09ZnVuY3Rpb24obix0KXt2YXIgZT1uLnBhcmVudE5vZGU7ZSYmXCJQSUNUVVJFXCI9PT1lLnRhZ05hbWUmJkwoZSkuZm9yRWFjaCh0KX0sUj1mdW5jdGlvbihuLHQpe0wobikuZm9yRWFjaCh0KX0sRz17SU1HOmZ1bmN0aW9uKG4sdCl7TShuLChmdW5jdGlvbihuKXtPKG4pLE4obix0KX0pKSxPKG4pLE4obix0KX0sSUZSQU1FOmZ1bmN0aW9uKG4sdCl7dyhuLFwic3JjXCIscyhuLHQuZGF0YV9zcmMpKX0sVklERU86ZnVuY3Rpb24obix0KXtSKG4sKGZ1bmN0aW9uKG4pe3cobixcInNyY1wiLHMobix0LmRhdGFfc3JjKSl9KSksdyhuLFwicG9zdGVyXCIscyhuLHQuZGF0YV9wb3N0ZXIpKSx3KG4sXCJzcmNcIixzKG4sdC5kYXRhX3NyYykpLG4ubG9hZCgpfX0sVD1mdW5jdGlvbihuLHQpe3ZhciBlPUdbbi50YWdOYW1lXTtlJiZlKG4sdCl9LEQ9ZnVuY3Rpb24obix0LGUpe3koZSwxKSxoKG4sdC5jbGFzc19sb2FkaW5nKSxmKG4sXCJsb2FkaW5nXCIpLGIodC5jYWxsYmFja19sb2FkaW5nLG4sZSl9LEY9e0lNRzpmdW5jdGlvbihuLHQpe3Uobix0LmRhdGFfc3JjLG51bGwpLHUobix0LmRhdGFfc3Jjc2V0LG51bGwpLHUobix0LmRhdGFfc2l6ZXMsbnVsbCksTShuLChmdW5jdGlvbihuKXt1KG4sdC5kYXRhX3NyY3NldCxudWxsKSx1KG4sdC5kYXRhX3NpemVzLG51bGwpfSkpfSxJRlJBTUU6ZnVuY3Rpb24obix0KXt1KG4sdC5kYXRhX3NyYyxudWxsKX0sVklERU86ZnVuY3Rpb24obix0KXt1KG4sdC5kYXRhX3NyYyxudWxsKSx1KG4sdC5kYXRhX3Bvc3RlcixudWxsKSxSKG4sKGZ1bmN0aW9uKG4pe3Uobix0LmRhdGFfc3JjLG51bGwpfSkpfX0sVj1mdW5jdGlvbihuLHQpe3Uobix0LmRhdGFfYmdfbXVsdGksbnVsbCksdShuLHQuZGF0YV9iZ19tdWx0aV9oaWRwaSxudWxsKX0saj1mdW5jdGlvbihuLHQpe3ZhciBlPUZbbi50YWdOYW1lXTtlP2Uobix0KTpmdW5jdGlvbihuLHQpe3Uobix0LmRhdGFfYmcsbnVsbCksdShuLHQuZGF0YV9iZ19oaWRwaSxudWxsKX0obix0KX0sUD1bXCJJTUdcIixcIklGUkFNRVwiLFwiVklERU9cIl0sUz1mdW5jdGlvbihuLHQpeyF0fHxmdW5jdGlvbihuKXtyZXR1cm4gbi5sb2FkaW5nQ291bnQ+MH0odCl8fGZ1bmN0aW9uKG4pe3JldHVybiBuLnRvTG9hZENvdW50PjB9KHQpfHxiKG4uY2FsbGJhY2tfZmluaXNoLHQpfSxVPWZ1bmN0aW9uKG4sdCxlKXtuLmFkZEV2ZW50TGlzdGVuZXIodCxlKSxuLmxsRXZMaXNucnNbdF09ZX0sJD1mdW5jdGlvbihuLHQsZSl7bi5yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl9LHE9ZnVuY3Rpb24obil7cmV0dXJuISFuLmxsRXZMaXNucnN9LEg9ZnVuY3Rpb24obil7aWYocShuKSl7dmFyIHQ9bi5sbEV2TGlzbnJzO2Zvcih2YXIgZSBpbiB0KXt2YXIgaT10W2VdOyQobixlLGkpfWRlbGV0ZSBuLmxsRXZMaXNucnN9fSxCPWZ1bmN0aW9uKG4sdCxlKXshZnVuY3Rpb24obil7ZGVsZXRlIG4ubGxUZW1wSW1hZ2V9KG4pLHkoZSwtMSksZnVuY3Rpb24obil7biYmKG4udG9Mb2FkQ291bnQtPTEpfShlKSxtKG4sdC5jbGFzc19sb2FkaW5nKSx0LnVub2JzZXJ2ZV9jb21wbGV0ZWQmJkkobixlKX0sSj1mdW5jdGlvbihuLHQsZSl7dmFyIGk9RShuKXx8bjtxKGkpfHxmdW5jdGlvbihuLHQsZSl7cShuKXx8KG4ubGxFdkxpc25ycz17fSk7dmFyIGk9XCJWSURFT1wiPT09bi50YWdOYW1lP1wibG9hZGVkZGF0YVwiOlwibG9hZFwiO1UobixpLHQpLFUobixcImVycm9yXCIsZSl9KGksKGZ1bmN0aW9uKGEpeyFmdW5jdGlvbihuLHQsZSxpKXt2YXIgYT12KHQpO0IodCxlLGkpLGgodCxlLmNsYXNzX2xvYWRlZCksZih0LFwibG9hZGVkXCIpLGoodCxlKSxiKGUuY2FsbGJhY2tfbG9hZGVkLHQsaSksYXx8UyhlLGkpfSgwLG4sdCxlKSxIKGkpfSksKGZ1bmN0aW9uKGEpeyFmdW5jdGlvbihuLHQsZSxpKXt2YXIgYT12KHQpO0IodCxlLGkpLGgodCxlLmNsYXNzX2Vycm9yKSxmKHQsXCJlcnJvclwiKSxiKGUuY2FsbGJhY2tfZXJyb3IsdCxpKSxhfHxTKGUsaSl9KDAsbix0LGUpLEgoaSl9KSl9LEs9ZnVuY3Rpb24obix0LGUpeyFmdW5jdGlvbihuKXtuLmxsVGVtcEltYWdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJJTUdcIil9KG4pLEoobix0LGUpLGZ1bmN0aW9uKG4sdCxlKXt2YXIgaT1zKG4sdC5kYXRhX2JnKSxhPXMobix0LmRhdGFfYmdfaGlkcGkpLHI9byYmYT9hOmk7ciYmKG4uc3R5bGUuYmFja2dyb3VuZEltYWdlPSd1cmwoXCInLmNvbmNhdChyLCdcIiknKSxFKG4pLnNldEF0dHJpYnV0ZShcInNyY1wiLHIpLEQobix0LGUpKX0obix0LGUpLGZ1bmN0aW9uKG4sdCxlKXt2YXIgaT1zKG4sdC5kYXRhX2JnX211bHRpKSxhPXMobix0LmRhdGFfYmdfbXVsdGlfaGlkcGkpLHI9byYmYT9hOmk7ciYmKG4uc3R5bGUuYmFja2dyb3VuZEltYWdlPXIsZnVuY3Rpb24obix0LGUpe2gobix0LmNsYXNzX2FwcGxpZWQpLGYobixcImFwcGxpZWRcIiksVihuLHQpLHQudW5vYnNlcnZlX2NvbXBsZXRlZCYmSShuLHQpLGIodC5jYWxsYmFja19hcHBsaWVkLG4sZSl9KG4sdCxlKSl9KG4sdCxlKX0sUT1mdW5jdGlvbihuLHQsZSl7IWZ1bmN0aW9uKG4pe3JldHVybiBQLmluZGV4T2Yobi50YWdOYW1lKT4tMX0obik/SyhuLHQsZSk6ZnVuY3Rpb24obix0LGUpe0oobix0LGUpLFQobix0KSxEKG4sdCxlKX0obix0LGUpfSxXPVtcIklNR1wiLFwiSUZSQU1FXCJdLFg9ZnVuY3Rpb24obil7cmV0dXJuIG4udXNlX25hdGl2ZSYmXCJsb2FkaW5nXCJpbiBIVE1MSW1hZ2VFbGVtZW50LnByb3RvdHlwZX0sWT1mdW5jdGlvbihuLHQsZSl7bi5mb3JFYWNoKChmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4uaXNJbnRlcnNlY3Rpbmd8fG4uaW50ZXJzZWN0aW9uUmF0aW8+MH0obik/ZnVuY3Rpb24obix0LGUsaSl7ZihuLFwiZW50ZXJlZFwiKSxmdW5jdGlvbihuLHQsZSl7dC51bm9ic2VydmVfZW50ZXJlZCYmSShuLGUpfShuLGUsaSksYihlLmNhbGxiYWNrX2VudGVyLG4sdCxpKSxmdW5jdGlvbihuKXtyZXR1cm4gcC5pbmRleE9mKGQobikpPj0wfShuKXx8UShuLGUsaSl9KG4udGFyZ2V0LG4sdCxlKTpmdW5jdGlvbihuLHQsZSxpKXtnKG4pfHwoZnVuY3Rpb24obix0LGUsaSl7ZS5jYW5jZWxfb25fZXhpdCYmZnVuY3Rpb24obil7cmV0dXJuXCJsb2FkaW5nXCI9PT1kKG4pfShuKSYmXCJJTUdcIj09PW4udGFnTmFtZSYmKEgobiksZnVuY3Rpb24obil7TShuLChmdW5jdGlvbihuKXt4KG4pfSkpLHgobil9KG4pLGZ1bmN0aW9uKG4pe00obiwoZnVuY3Rpb24obil7QyhuKX0pKSxDKG4pfShuKSxtKG4sZS5jbGFzc19sb2FkaW5nKSx5KGksLTEpLF8obiksYihlLmNhbGxiYWNrX2NhbmNlbCxuLHQsaSkpfShuLHQsZSxpKSxiKGUuY2FsbGJhY2tfZXhpdCxuLHQsaSkpfShuLnRhcmdldCxuLHQsZSl9KSl9LFo9ZnVuY3Rpb24obil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG4pfSxubj1mdW5jdGlvbihuKXtyZXR1cm4gbi5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbChuLmVsZW1lbnRzX3NlbGVjdG9yKX0sdG49ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVyblwiZXJyb3JcIj09PWQobil9KG4pfSxlbj1mdW5jdGlvbihuLHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gWihuKS5maWx0ZXIoZyl9KG58fG5uKHQpKX0sYW49ZnVuY3Rpb24obixlKXt2YXIgYT1jKG4pO3RoaXMuX3NldHRpbmdzPWEsdGhpcy5sb2FkaW5nQ291bnQ9MCxmdW5jdGlvbihuLHQpe2kmJiFYKG4pJiYodC5fb2JzZXJ2ZXI9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtZKGUsbix0KX0pLGZ1bmN0aW9uKG4pe3JldHVybntyb290Om4uY29udGFpbmVyPT09ZG9jdW1lbnQ/bnVsbDpuLmNvbnRhaW5lcixyb290TWFyZ2luOm4udGhyZXNob2xkc3x8bi50aHJlc2hvbGQrXCJweFwifX0obikpKX0oYSx0aGlzKSxmdW5jdGlvbihuLGUpe3QmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwib25saW5lXCIsKGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKG4sdCl7dmFyIGU7KGU9bm4obiksWihlKS5maWx0ZXIodG4pKS5mb3JFYWNoKChmdW5jdGlvbih0KXttKHQsbi5jbGFzc19lcnJvciksXyh0KX0pKSx0LnVwZGF0ZSgpfShuLGUpfSkpfShhLHRoaXMpLHRoaXMudXBkYXRlKGUpfTtyZXR1cm4gYW4ucHJvdG90eXBlPXt1cGRhdGU6ZnVuY3Rpb24obil7dmFyIHQsYSxvPXRoaXMuX3NldHRpbmdzLHI9ZW4obixvKTtBKHRoaXMsci5sZW5ndGgpLCFlJiZpP1gobyk/ZnVuY3Rpb24obix0LGUpe24uZm9yRWFjaCgoZnVuY3Rpb24obil7LTEhPT1XLmluZGV4T2Yobi50YWdOYW1lKSYmKG4uc2V0QXR0cmlidXRlKFwibG9hZGluZ1wiLFwibGF6eVwiKSxmdW5jdGlvbihuLHQsZSl7SihuLHQsZSksVChuLHQpLGoobix0KSxmKG4sXCJuYXRpdmVcIil9KG4sdCxlKSl9KSksQShlLDApfShyLG8sdGhpcyk6KGE9cixmdW5jdGlvbihuKXtuLmRpc2Nvbm5lY3QoKX0odD10aGlzLl9vYnNlcnZlciksZnVuY3Rpb24obix0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe24ub2JzZXJ2ZSh0KX0pKX0odCxhKSk6dGhpcy5sb2FkQWxsKHIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJnRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKSxubih0aGlzLl9zZXR0aW5ncykuZm9yRWFjaCgoZnVuY3Rpb24obil7ZGVsZXRlIG4ubGxPcmlnaW5hbEF0dHJzfSkpLGRlbGV0ZSB0aGlzLl9vYnNlcnZlcixkZWxldGUgdGhpcy5fc2V0dGluZ3MsZGVsZXRlIHRoaXMubG9hZGluZ0NvdW50LGRlbGV0ZSB0aGlzLnRvTG9hZENvdW50fSxsb2FkQWxsOmZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMsZT10aGlzLl9zZXR0aW5ncztlbihuLGUpLmZvckVhY2goKGZ1bmN0aW9uKG4pe0kobix0KSxRKG4sZSx0KX0pKX19LGFuLmxvYWQ9ZnVuY3Rpb24obix0KXt2YXIgZT1jKHQpO1EobixlKX0sYW4ucmVzZXRTdGF0dXM9ZnVuY3Rpb24obil7XyhuKX0sdCYmZnVuY3Rpb24obix0KXtpZih0KWlmKHQubGVuZ3RoKWZvcih2YXIgZSxpPTA7ZT10W2ldO2krPTEpbChuLGUpO2Vsc2UgbChuLHQpfShhbix3aW5kb3cubGF6eUxvYWRPcHRpb25zKSxhbn0pKTtcclxuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcmlnaW5hbE1vZHVsZSkge1xuXHRpZiAoIW9yaWdpbmFsTW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdHZhciBtb2R1bGUgPSBPYmplY3QuY3JlYXRlKG9yaWdpbmFsTW9kdWxlKTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJleHBvcnRzXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWVcblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiIsIi8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogIERlcGVuZGVuY2llc1xuICogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG4vLyBXZSBmaXJzdCBpbXBvcnQgU2VudHJ5IGFuZCB0cmlnZ2VyIGl0IGlmIHRoZSBzZW50cnkgZHNuIGlzIGRlZmluZWRcbi8vIEJlY2F1c2UgdGhlbiBhbGwgZXJyb3JzIGFyZSBsb2dnZWRcbmltcG9ydCAqIGFzIFNlbnRyeSBmcm9tICdAc2VudHJ5L2Jyb3dzZXInO1xuaWYod2luZG93LnNlbnRyeV9kc24gIT09IHVuZGVmaW5lZCkgU2VudHJ5LmluaXQoeyBkc246IHdpbmRvdy5zZW50cnlfZHNuIH0pO1xuXG4vKipcbiAqIEV4dGVybmFsXG4gKi9cbnJlcXVpcmUoJ2hhbW1lcmpzJyk7XG5yZXF1aXJlKCdvYmplY3RGaXRQb2x5ZmlsbCcpO1xuXG5pbXBvcnQgTGF6eUxvYWQgZnJvbSBcInZhbmlsbGEtbGF6eWxvYWRcIjtcbmNvbnN0IGxhenlMb2FkSW5zdGFuY2UgPSBuZXcgTGF6eUxvYWQoe1xuICAgIC8vIFlvdXIgY3VzdG9tIHNldHRpbmdzIGdvIGhlcmVcbn0pO1xuXG5cbi8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogIEdsb2JhbCBmdW5jdGlvbmFsaXRpZXNcbiAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxucmVxdWlyZSgnLi9nbG9iYWwvaGVscGVycycpOyAvLyBTaG91bGQgYmUgZmlyc3RcbnJlcXVpcmUoJy4vZ2xvYmFsL2Jyb3dzZXJIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2dsb2JhbC9zY3JvbGxIYW5kbGVyJyk7XG5cblxuLyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiAgQ29tcG9uZW50IGZ1bmN0aW9uYWxpdGllc1xuICogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvYXJ0aWNsZVNsaWRlckhhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jaG9jb2xhdGVGYWN0b3J5Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY29va2llSGFuZGxlcicpO1xuLy8gcmVxdWlyZSgnLi9jb21wb25lbnRzL0lucHV0SGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL21hcHNIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvb3ZlcmxheU1lbnVIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvc2Nyb2xsVG9IYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvc2xpZGVySGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3RhYnNIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvd29ybGRNYXBIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMveW91dHViZUhhbmRsZXInKTsiLCJjb25zdCBBcnRpY2xlU2xpZGVySGFuZGxlciA9IHtcblxuICAgIGFydGljbGVzIDogbnVsbCxcbiAgICBjdXJyZW50SW5kZXg6IDAsXG5cbiAgICAvLyBJbml0aWFsaXplIGNvb2tpZSBoYW5kbGVyXG4gICAgaW5pdCA6IGZ1bmN0aW9uKClcbiAgICB7XG4gICAgICAgIGNvbnN0IGFydGljbGVTbGlkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtYXJ0aWNsZS1zbGlkZXMnKTtcbiAgICAgICAgaWYoIWlzc2V0KGFydGljbGVTbGlkZXIpKSByZXR1cm4gO1xuXG4gICAgICAgIEFydGljbGVTbGlkZXJIYW5kbGVyLmFydGljbGVzID0gYXJ0aWNsZVNsaWRlci5xdWVyeVNlbGVjdG9yQWxsKCcuanMtYXJ0aWNsZS1pdGVtJyk7XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNCdXR0b24gPSBhcnRpY2xlU2xpZGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1wcmV2aW91cy1hcnRpY2xlJyk7XG4gICAgICAgIGNvbnN0IG5leHRCdXR0b24gPSBhcnRpY2xlU2xpZGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1uZXh0LWFydGljbGUnKTtcblxuICAgICAgICBuZXh0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBBcnRpY2xlU2xpZGVySGFuZGxlci5jdXJyZW50SW5kZXgrKztcbiAgICAgICAgICAgIGlmKEFydGljbGVTbGlkZXJIYW5kbGVyLmFydGljbGVzLmxlbmd0aCA8PSBBcnRpY2xlU2xpZGVySGFuZGxlci5jdXJyZW50SW5kZXgpIEFydGljbGVTbGlkZXJIYW5kbGVyLmN1cnJlbnRJbmRleCA9IDA7XG4gICAgICAgICAgICBBcnRpY2xlU2xpZGVySGFuZGxlci5zZXRBY3RpdmVBcnRpY2xlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByZXZpb3VzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICBBcnRpY2xlU2xpZGVySGFuZGxlci5jdXJyZW50SW5kZXgtLTtcbiAgICAgICAgICAgIGlmKEFydGljbGVTbGlkZXJIYW5kbGVyLmN1cnJlbnRJbmRleCA8IDApIEFydGljbGVTbGlkZXJIYW5kbGVyLmN1cnJlbnRJbmRleCA9IChBcnRpY2xlU2xpZGVySGFuZGxlci5hcnRpY2xlcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIEFydGljbGVTbGlkZXJIYW5kbGVyLnNldEFjdGl2ZUFydGljbGUoKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHNldEFjdGl2ZUFydGljbGU6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IEFydGljbGVTbGlkZXJIYW5kbGVyLmFydGljbGVzLmxlbmd0aDsgaSArKykge1xuICAgICAgICAgICAgY29uc3QgYXJ0aWNsZSA9IEFydGljbGVTbGlkZXJIYW5kbGVyLmFydGljbGVzW2ldO1xuXG4gICAgICAgICAgICBpZihpID09PSBBcnRpY2xlU2xpZGVySGFuZGxlci5jdXJyZW50SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBhcnRpY2xlLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJ0aWNsZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSxcbn07XG5cbkFydGljbGVTbGlkZXJIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIHwgUHJldmVudCBCb3RzIGhhbmRsZXJcbiB8XG4gfCBXZSBuYW1lZCB0aGlzIGNob2NvbGF0ZSBmYWN0b3J5IGFuZCBiZWxvbmdpbmcgY29uZnVzaW5nIGpzIGhvb2tzXG4gfCB0byBwcmV2ZW50IHNtYXJ0IGJvdHMgZnJvbSBibG9ja2luZyB0aGVzZSB2YXJpYWJsZSBvciBmdW5jdGlvbnMuXG4gfFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IENob2NvbGF0ZUZhY3RvcnkgPSB7XG5cbiAgICBiYW5uZWRWaXNpdG9yOiBbXSxcblxuICAgIC8qKiBHZXQgYWxsIHRoZSBjaG9jb2xhdGUgZmFjdG9yeSBhbmQgc3RhcnRcbiAgICAgKiAgTG9vcGluZyB0aHJvdWdoIHRob3NlIHN0YXJ0IGZsYXNoaW5nIHRpY2tldHNcbiAgICAgKi9cbiAgICBlbnRlcjogZnVuY3Rpb24oKVxuICAgIHtcblxuICAgICAgICBjb25zdCBjaG9jb2xhdGVGYWN0b3JpZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtY2hvY29sYXRlLWZhY3RvcnknKTtcblxuICAgICAgICBpZihpc3NldChjaG9jb2xhdGVGYWN0b3JpZXMpKXtcblxuICAgICAgICAgICAgY29uc3QgYW1vdW50T2ZDaG9jb2xhdGVGYWN0b3JpZXMgPSBjaG9jb2xhdGVGYWN0b3JpZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGFtb3VudE9mQ2hvY29sYXRlRmFjdG9yaWVzOyBpKyspe1xuXG4gICAgICAgICAgICAgICAgY29uc3QgQ2hvY29sYXRlQmFyID0gY2hvY29sYXRlRmFjdG9yaWVzW2ldO1xuICAgICAgICAgICAgICAgIENob2NvbGF0ZUZhY3RvcnkuX2ZsYXNoVGlja2V0KENob2NvbGF0ZUJhcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSWYgZmFjdG9yeSBoYXMgYSBnb2xkZW4gdGlja2V0XG4gICAgICogVGhlbiB3ZSBjYW4gbWFrZSB0aGVtIGdvIG9uIHRoZSB0b3VyIGlmIHRoZXJlIGhhcyBiZWVuIGNsaWNrIG9uIHRoZSB0aWNrZXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVCYXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9mbGFzaFRpY2tldDogZnVuY3Rpb24gKGNob2NvbGF0ZUJhcikge1xuXG4gICAgICAgIC8vIFRyeSBnZXQgdGhlIHRpY2tldCBmcm9tIHRoZSBjaG9jb2xhdGVCYXJcbiAgICAgICAgY29uc3QgZ29sZGVuVGlja2V0ID0gY2hvY29sYXRlQmFyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1nb2xkZW4tdGlja2V0Jyk7XG5cbiAgICAgICAgLy8gT25seSBjb250aW51ZSBpZiBjaG9jb2xhdGUgYmFyIGhhcyBhIGdvbGRlbiB0aWNrZXRcbiAgICAgICAgaWYoaXNzZXQoZ29sZGVuVGlja2V0KSl7XG5cbiAgICAgICAgICAgIGdvbGRlblRpY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBDaG9jb2xhdGVGYWN0b3J5LmVuam95VGhlVG91cihjaG9jb2xhdGVCYXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUbyBiYWQsIG5vIGdvbGRlbiB0aWNrZXRzIGhhcyBiZWVuIGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRoZSB0b3VyIHRocm91Z2ggdGhlIGZhY3RvcnlcbiAgICAgKiBBbmQgZ2V0IHRoZSBuYW1lcyBhbmQgcHJvcGVydGllcyBvZiB0aGUgbWVtYmVycyBvZiB0aGUgZ3JvdXBcbiAgICAgKiBJZiB0aGVyZSBhcmUgbWVtYmVycyBpbiB0aGUgZ3JvdXAgb2YgY291cnNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqL1xuICAgIGVuam95VGhlVG91cihjaG9jb2xhdGVGYWN0b3J5KXtcblxuICAgICAgICAvLyBBc2sgZm9yIHRoZSB0b3VyIGdyb3VwXG4gICAgICAgIGNvbnN0IHRvdXJHcm91cCA9IGNob2NvbGF0ZUZhY3RvcnkucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHRleHRhcmVhJyk7XG5cbiAgICAgICAgaWYoaXNzZXQodG91ckdyb3VwKSl7XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIHZpc2l0b3Igd2Ugd2FudCBhIGJlbG9uZ2luZyBPb21wYSBMb29tcGFcbiAgICAgICAgICAgIGxldCBvb21wYUxvb21wYXMgPSB7fTtcbiAgICAgICAgICAgIGxldCBhbW91bnRPZk9vbXBhTG9vbXBhcyA9IDA7XG5cbiAgICAgICAgICAgIGNvbnN0IHRvdXJHcm91cFNpemUgPSB0b3VyR3JvdXAubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRvdXJHcm91cFNpemU7IGkrKyl7XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHZpc2l0b3IgZnJvbSB0aGUgZ3JvdXBcbiAgICAgICAgICAgICAgICBjb25zdCB2aXNpdG9yID0gdG91ckdyb3VwW2ldO1xuXG4gICAgICAgICAgICAgICAgLy8gQXNrIGZvciBpdHMgbmFtZVxuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JOYW1lID0gdmlzaXRvci5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB2aXNpdG9yIGlzIGJhbm5lZFxuICAgICAgICAgICAgICAgIGlmKCBDaG9jb2xhdGVGYWN0b3J5Ll9pc1Zpc2l0b3JCYW5uZWQodmlzaXRvck5hbWUpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIG9vbXBhTG9vbXBhc1sgdmlzaXRvck5hbWUgXSA9IENob2NvbGF0ZUZhY3RvcnkuX2dldEFycmFuZ2VtZW50KHZpc2l0b3IpO1xuICAgICAgICAgICAgICAgIGFtb3VudE9mT29tcGFMb29tcGFzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbnN1cmFuY2UgdGhhdCB0aGVyZSBhcmUgb29tcGEgbG9vbXBhc1xuICAgICAgICAgICAgaWYoYW1vdW50T2ZPb21wYUxvb21wYXMgPT09IDApIHJldHVybjtcblxuICAgICAgICAgICAgLy8gU2VuZCBzdWJtaXQgcmVxdWVzdFxuICAgICAgICAgICAgQ2hvY29sYXRlRmFjdG9yeS5fZmluaXNoVG91cihvb21wYUxvb21wYXMsIGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVG8gYmFkLCBubyBtZW1iZXJzIHRvIHZpc2l0IHRoaXMgZmFjdG9yeScpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHZpc2l0b3IgbmFtZSBpc24ndCBhbGxvd1xuICAgICAqXG4gICAgICogQHBhcmFtIHZpc2l0b3JOYW1lXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaXNWaXNpdG9yQmFubmVkOiBmdW5jdGlvbih2aXNpdG9yTmFtZSl7XG4gICAgICAgIGlmKENob2NvbGF0ZUZhY3RvcnkuYmFubmVkVmlzaXRvci5pbmRleE9mKHZpc2l0b3JOYW1lKSAhPT0gLTEpe1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNb3N0IGdldCB2aXNpdG9yIGhhdmUgYSBub3JtYWwgYXJyYW5nZW1lbnRcbiAgICAgKiBCdXQgc29tZXRpbWVzIHRoZXJlIGFyZSBzcGVjaWFsIGNhc2VzXG4gICAgICogTGlrZSBhIFNlbGVjdG9yIG9yIGNoZWNrYm94XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlzaXRvclxuICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dldEFycmFuZ2VtZW50OiBmdW5jdGlvbih2aXNpdG9yKVxuICAgIHtcblxuICAgICAgICBjb25zdCB2aXNpdG9yVHlwZSA9IHZpc2l0b3Iubm9kZU5hbWU7XG5cbiAgICAgICAgc3dpdGNoICh2aXNpdG9yVHlwZSkge1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci52YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5pc2ggdGhlIHRvdXJcbiAgICAgKiBJZiBzdWNjZXNzZnVsIHNob3cgdGhhbmtzIG1lc3NhZ2VcbiAgICAgKiBPciBzaG93IGRlZmluZWQgZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFja1xuICAgICAqXG4gICAgICogQHBhcmFtIGdyb3VwXG4gICAgICogQHBhcmFtIGNob2NvbGF0ZUZhY3RvcnlcbiAgICAgKiBAcmV0dXJucyB7Knx2b2lkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2ZpbmlzaFRvdXI6IGZ1bmN0aW9uKGdyb3VwLCBjaG9jb2xhdGVGYWN0b3J5KVxuICAgIHtcbiAgICAgICAgLy8gQWRkIHdpbGxpZSB0byB0aGUgZ3JvdXBcbiAgICAgICAgZ3JvdXAgPSBDaG9jb2xhdGVGYWN0b3J5Ll9hZGRXaWxsaWVXb25rYShncm91cCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBnYXRlIGZvciBmaW5pc2ggdGhlIHRvdXJcbiAgICAgICAgY29uc3QgZ2F0ZSA9ICcvY29udGFjdC9wcm9jZXNzJztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgQWpheC5wb3N0KGdhdGUsIGdyb3VwLCBmdW5jdGlvbiAoSHR0cFJlcXVlc3QpIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShIdHRwUmVxdWVzdC5yZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEh0dHBSZXF1ZXN0LnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIwMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaG9jb2xhdGVGYWN0b3J5Ll90aGFua3NGb3JWaXNpdGluZyhyZXNwb25zZS5yZWRpcmVjdFVybCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDIyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX2dpdmVGZWVkYmFja1RvTWVtYmVycyhyZXNwb25zZS5lcnJvcnMsIGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX3Vua25vd25HYXBJbkZhY3RvcnkoY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIENob2NvbGF0ZUZhY3RvcnkuX3Vua25vd25HYXBJbkZhY3RvcnkoY2hvY29sYXRlRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIHdpbGxpZSB3b25rYSB0byB0aGUgZ3JvdXBcbiAgICAgKiBQcy4uLiBpdCBhY3R1YWxseSB0aGUgc2VjcmV0IGNvZGUhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRXaWxsaWVXb25rYTogZnVuY3Rpb24oZ3JvdXApe1xuICAgICAgICBncm91cC5fd2lsbGllID0gJ3dvbmthJztcbiAgICAgICAgcmV0dXJuIGdyb3VwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIGZlZWRiYWNrIHRvIHRoZSBkZXNpcmVkIGFyZWEuXG4gICAgICogTW9zdCBsaWtlbHkgdG8gdGhlIHZpc2l0b3IgZGlyZWN0bHksIGJ1dCBzb21ldGltZSB0byB0aGUgZmFjdG9yeSBkZXNpcmVkIGZlZWRiYWNrIGFyZWFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcnJvcnNcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dpdmVGZWVkYmFja1RvTWVtYmVyczogZnVuY3Rpb24oZXJyb3JzLCBjaG9jb2xhdGVGYWN0b3J5KXtcblxuICAgICAgICAvLyBHcmFiIHRoZSBmYWN0b3J5IGZlZWRiYWNrIGFyZWFcbiAgICAgICAgY29uc3QgZmVlZGJhY2tBcmVhID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yKCcuanMtZXJyb3ItYXJlYScpO1xuXG4gICAgICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IGh0bWxcbiAgICAgICAgaWYoaXNzZXQoZmVlZGJhY2tBcmVhKSkgZmVlZGJhY2tBcmVhLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vIENsZWFyIHRoZSBwcmV2aW91cyBtYXJrZWQgamFja2V0c1xuICAgICAgICBDaG9jb2xhdGVGYWN0b3J5Ll9jbGVhclByZXZpb3VzTWFya2VkSmFja2V0cyhjaG9jb2xhdGVGYWN0b3J5KTtcblxuICAgICAgICBPYmplY3Qua2V5cyhlcnJvcnMpLmZvckVhY2goZnVuY3Rpb24odmlzaXRvcikge1xuXG4gICAgICAgICAgICBsZXQgamFja2V0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB2aXNpdG9yRmVlZGJhY2tBcmVhID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gSG9uZXkgZWxlbWVudHMgZG9lc24ndCBoYXMgYSBhY2Nlc3NpYmxlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmKHZpc2l0b3IgIT09ICdfaG9uZXknICYmIHZpc2l0b3IgIT09ICdfc2VjcmV0Q29kZScpIHtcblxuICAgICAgICAgICAgICAgIC8vIEdyYWIgdGhlIHZpc2l0b3JcbiAgICAgICAgICAgICAgICBjb25zdCB2aXNpdG9yTm9kZSA9IGNob2NvbGF0ZUZhY3RvcnkucXVlcnlTZWxlY3RvcignIycgKyB2aXNpdG9yKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGphY2tldCBvZiBhIHZpc2l0b3JcbiAgICAgICAgICAgICAgICBqYWNrZXQgPSBDaG9jb2xhdGVGYWN0b3J5Ll9ncmFiVmlzaXRvckphY2tldCh2aXNpdG9yTm9kZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBmb3VuZCBnZXQgdGhlIGRlc2lyZWQgYXJlYVxuICAgICAgICAgICAgICAgIGlmKGlzc2V0KGphY2tldCkpIHZpc2l0b3JGZWVkYmFja0FyZWEgPSBqYWNrZXQucXVlcnlTZWxlY3RvcignLmpzLWZvcm0tZ3JvdXAtZXJyb3InKTtcblxuICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IGh0bWxcbiAgICAgICAgICAgICAgICBpZihpc3NldCh2aXNpdG9yRmVlZGJhY2tBcmVhKSkgdmlzaXRvckZlZWRiYWNrQXJlYS5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGZlZWRiYWNrIGZvciB0aGlzIHZpc2l0b3JcbiAgICAgICAgICAgIGNvbnN0IHZpc2l0b3JGZWVkYmFjayA9IGVycm9yc1t2aXNpdG9yXTtcblxuICAgICAgICAgICAgLy8gU3BpdCBvdXQgZWFjaCBsaW5lXG4gICAgICAgICAgICBjb25zdCB2aXNpdG9yRmVlZGJhY2tBbW91bnQgPSB2aXNpdG9yRmVlZGJhY2subGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHZpc2l0b3JGZWVkYmFja0Ftb3VudDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCB2aXNpdG9yRmVlZGJhY2tMaW5lID0gdmlzaXRvckZlZWRiYWNrW2ldO1xuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codmlzaXRvciwgdmlzaXRvckZlZWRiYWNrTGluZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBIb25leSBlbGVtZW50cyBkb2Vzbid0IGhhcyBhIGFjY2Vzc2libGUgZWxlbWVudCBhcmVhXG4gICAgICAgICAgICAgICAgaWYodmlzaXRvciAhPT0gJ19ob25leScgJiYgdmlzaXRvciAhPT0gJ19zZWNyZXRDb2RlJykge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhlIGphY2tldFxuICAgICAgICAgICAgICAgICAgICBpZihpc3NldChqYWNrZXQpKSBqYWNrZXQuY2xhc3NMaXN0LmFkZCgnaGFzLWVycm9yJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGZlZWRiYWNrIHRvIHZpc2l0b3IgZmVlZGJhY2sgYXJlYSBpZiBkZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KHZpc2l0b3JGZWVkYmFja0FyZWEpICYmIHZpc2l0b3JGZWVkYmFja0xpbmUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRGZWVkYmFja0FyZWEgPSB2aXNpdG9yRmVlZGJhY2tBcmVhLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGZWVkYmFja0FyZWEgKz0gJzxzcGFuPicgKyBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmlzaXRvckZlZWRiYWNrTGluZSkgKyAnPC9zcGFuPic7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpdG9yRmVlZGJhY2tBcmVhLmlubmVySFRNTCA9IGN1cnJlbnRGZWVkYmFja0FyZWE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZmVlZGJhY2sgdG8gZmFjdG9yeSBmZWVkYmFjayBhcmVhIGlmIGRlZmluZWRcbiAgICAgICAgICAgICAgICBpZihpc3NldChmZWVkYmFja0FyZWEpICYmIHZpc2l0b3JGZWVkYmFja0xpbmUubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RmVlZGJhY2tBcmVhID0gZmVlZGJhY2tBcmVhLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEZlZWRiYWNrQXJlYSArPSAnPGxpPicgKyBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmlzaXRvckZlZWRiYWNrTGluZSkgKyAnPC9saT4nO1xuICAgICAgICAgICAgICAgICAgICBmZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gY3VycmVudEZlZWRiYWNrQXJlYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgcHJldmlvdXMgbWFya2VkIGphY2tldHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xlYXJQcmV2aW91c01hcmtlZEphY2tldHMoY2hvY29sYXRlRmFjdG9yeSkge1xuXG4gICAgICAgIGNvbnN0IG1hcmtlZEphY2tldHMgPSBjaG9jb2xhdGVGYWN0b3J5LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oYXMtZXJyb3InKTtcbiAgICAgICAgY29uc3QgbWFya2VkSmFja2V0c0Ftb3VudCA9IG1hcmtlZEphY2tldHMubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBtYXJrZWRKYWNrZXRzQW1vdW50OyBpKyspe1xuICAgICAgICAgICAgbWFya2VkSmFja2V0c1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtZXJyb3InKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHcmFiIHRoZSBqYWNrZXQgb2YgdGhlIHZpc2l0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aXNpdG9yXG4gICAgICogQHJldHVybnMge251bGx8KnwoKCkgPT4gKE5vZGUgfCBudWxsKSl8QWN0aXZlWC5JWE1MRE9NTm9kZXwoTm9kZSAmIFBhcmVudE5vZGUpfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2dyYWJWaXNpdG9ySmFja2V0OiBmdW5jdGlvbih2aXNpdG9yKXtcblxuICAgICAgICAvLyBDaGVjayBpZiB2aXNpdG9yIGlzIGRlZmluZWRcbiAgICAgICAgaWYgKCFpc3NldCh2aXNpdG9yKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gRG8gbG9vcCBzZXR0aW5nc1xuICAgICAgICBjdXJyZW50TGF5ZXIgPSB2aXNpdG9yO1xuICAgICAgICBzYWZldHlCcmVhayA9IDA7XG5cbiAgICAgICAgLy8gR3JhYiB0aGUgbmV4dCBsYXllciB0aWxsIGl0IGlzIHRoZSBqYWNrZXQgKG9yIHNhZmV0eUJyZWFrIGhhcyBiZWVuIHJlYWNoZWRcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgc2FmZXR5QnJlYWsrKztcbiAgICAgICAgICAgIGN1cnJlbnRMYXllciA9IGN1cnJlbnRMYXllci5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYoY3VycmVudExheWVyLmNsYXNzTGlzdC5jb250YWlucygnanMtZm9ybS1ncm91cCcpKSByZXR1cm4gY3VycmVudExheWVyO1xuICAgICAgICB9IHdoaWxlIChjdXJyZW50TGF5ZXIudGFnTmFtZSAhPT0gJ0JPRFknICYmIHNhZmV0eUJyZWFrIDw9IDEwKTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVkaXJlY3QgdGhlIHZpc2l0b3IgdG8gdGhlIHRoYW5rcyBwYWdlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFN0b3BcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF90aGFua3NGb3JWaXNpdGluZzogZnVuY3Rpb24gKG5leHRTdG9wKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IG5leHRTdG9wO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbmtub3duIGVycm9yIG9jY3VycmVkLCBsb2cgdGhlIGVycm9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3Vua25vd25HYXBJbkZhY3Rvcnk6IGZ1bmN0aW9uIChjaG9jb2xhdGVGYWN0b3J5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hvY29sYXRlRmFjdG9yeTogVW5rb3duIEVycm9yJyk7XG4gICAgfSxcbn07XG5cbkNob2NvbGF0ZUZhY3RvcnkuZW50ZXIoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQ29va2llIGhhbmRsZXJcbiAgIC0gUHJpbWFyeSB1c2FnZSBmb3IgdG9nZ2xpbmcgdGhlIGNvb2tpZSBtZXNzYWdlIGFuZC9vciBzd2l0Y2hcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBDb29raWVIYW5kbGVyID0ge1xuICAgIGNvb2tpZUJhciA6IG51bGwsXG4gICAgY29va2llTWVzc2FnZSA6IG51bGwsXG4gICAgY29va2llRmFkZU91dEFuaW1hdGlvbkR1cmF0aW9uIDogNDAwLFxuICAgIGFjY2VwdFRyYWNraW5nIDogZmFsc2UsXG5cbiAgICAvLyBJbml0aWFsaXplIGNvb2tpZSBoYW5kbGVyXG4gICAgaW5pdCA6IGZ1bmN0aW9uKClcbiAgICB7XG4gICAgICAgIC8vIEJpbmQgY29va2llIGJhciB0byBjb29raWVNZXNzYWdlXG4gICAgICAgIENvb2tpZUhhbmRsZXIuY29va2llTWVzc2FnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jb29raWUtYmFyJyk7XG5cbiAgICAgICAgLy8gQmluZCBjb29raWUgYmFyIHRvIGNvb2tpZUJhclxuICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZUJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1jb29raWUtYmFyJyk7XG5cbiAgICAgICAgLy8gSWYgaXNzZXQgaW5pdCB0aGUgZnVuY3Rpb25zIGZvciBjb29raWUgYmFyXG4gICAgICAgIGlmKGlzc2V0KENvb2tpZUhhbmRsZXIuY29va2llQmFyKSl7XG4gICAgICAgICAgICBDb29raWVIYW5kbGVyLmluaXRDb29raWVCYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGVpdGhlciB0eXBlIG9mIGNvb2tpZSBoYXMgYmVlbiBmb3VuZCBjaGVjayBpZiBzZXR0aW5ncyBhcmUgZGVmaW5lZFxuICAgICAgICBpZihpc3NldChDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UpKXtcbiAgICAgICAgICAgIENvb2tpZUhhbmRsZXIuY2hlY2tGb3JDb29raWVTZXR0aW5ncygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGNvb2tpZSBiYXIgYWN0aW9uc1xuICAgIGluaXRDb29raWVCYXI6IGZ1bmN0aW9uKCl7XG4gICAgICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gQ29va2llSGFuZGxlci5jb29raWVCYXIucXVlcnlTZWxlY3RvcignLmpzLWRpc2FibGUtY29va2llLWJhcicpO1xuICAgICAgICBpZihpc3NldChjbG9zZUJ1dHRvbikpe1xuICAgICAgICAgICAgY2xvc2VCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBDb29raWVIYW5kbGVyLmNsb3NlQ29va2llTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hlY2tGb3JDb29raWVTZXR0aW5nczogZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKENvb2tpZS5nZXQoJ2Nvb2tpZU1lc3NhZ2UnKSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpcy1jb29raWVzLWFjY2VwdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWNvb2tpZXMtYWNjZXB0ZWQnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjbG9zZUNvb2tpZU1lc3NhZ2U6IGZ1bmN0aW9uICgpe1xuICAgICAgICBDb29raWUuc2V0KCdjb29raWVNZXNzYWdlJywgdHJ1ZSwgOTApO1xuICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgnaXMtdHJhbnNpdGlvbmluZy1vdXQnKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpcy1jb29raWVzLWFjY2VwdGVkJyk7XG4gICAgfSxcbn07XG5cbkNvb2tpZUhhbmRsZXIuaW5pdCgpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgR29vZ2xlIE1hcHMgaGFuZGxlclxuICAgIC0gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vbWFwcy9kb2N1bWVudGF0aW9uL2phdmFzY3JpcHQvYWRkaW5nLWEtZ29vZ2xlLW1hcFxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IE1hcHNIYW5kbGVyID0ge1xuXG4gICAgbWFwOiAnJyxcbiAgICBrZXk6ICdBSXphU3lDVkdQVW1SbVFSeFh2enpXdTNYeXU3N1hlYlF4US1mNFknLFxuICAgIGxvY2F0aW9uOiB7bGF0OiA1MS4yNjEwODksIGxuZzogNS41OTgxNzJ9LFxuICAgIHN0eWxpbmc6ICcnLFxuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBHZXQgbWFwIGJ5IGlkXG4gICAgICAgIE1hcHNIYW5kbGVyLm1hcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1nb29nbGUtbWFwJyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBtYXAgaXMgZGVmaW5lZFxuICAgICAgICBpZiAoaXNzZXQoTWFwc0hhbmRsZXIubWFwKSkge1xuXG4gICAgICAgICAgICBpZihNYXBzSGFuZGxlci5tYXAuaGFzQXR0cmlidXRlKCdkYXRhLWdvb2dsZS1sYXQnKSkgTWFwc0hhbmRsZXIubG9jYXRpb24ubGF0ID0gcGFyc2VGbG9hdChNYXBzSGFuZGxlci5tYXAuZ2V0QXR0cmlidXRlKCdkYXRhLWdvb2dsZS1sYXQnKSk7XG4gICAgICAgICAgICBpZihNYXBzSGFuZGxlci5tYXAuaGFzQXR0cmlidXRlKCdkYXRhLWdvb2dsZS1sbmcnKSkgTWFwc0hhbmRsZXIubG9jYXRpb24ubG5nID0gcGFyc2VGbG9hdChNYXBzSGFuZGxlci5tYXAuZ2V0QXR0cmlidXRlKCdkYXRhLWdvb2dsZS1sbmcnKSk7XG5cbiAgICAgICAgICAgIE1hcHNIYW5kbGVyLnNldEN1c3RvbVN0eWxpbmcoKTtcblxuICAgICAgICAgICAgLy8gU2VlIGlmIGdvb2dsZSB2YXJpYWJsZSBleGlzdHNcbiAgICAgICAgICAgIGlmICh0eXBlb2YoZ29vZ2xlKSA9PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YoZ29vZ2xlLm1hcHMpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9hZCBleHRlcm5hbCBzY3JpcHRcbiAgICAgICAgICAgICAgICBnZXRTY3JpcHQoJ2h0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9qcz9rZXk9JyArIE1hcHNIYW5kbGVyLmtleSwgTWFwc0hhbmRsZXIuZHJhd01hcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIE1hcHNIYW5kbGVyLmRyYXdNYXAoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZHJhd01hcDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBtYXBcbiAgICAgICAgbGV0IG1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoTWFwc0hhbmRsZXIubWFwLCB7XG4gICAgICAgICAgICB6b29tOiAxNCxcbiAgICAgICAgICAgIGNlbnRlcjogTWFwc0hhbmRsZXIubG9jYXRpb24sXG4gICAgICAgICAgICBkaXNhYmxlRGVmYXVsdFVJOiB0cnVlLFxuICAgICAgICAgICAgc3R5bGVzOiBNYXBzSGFuZGxlci5zdHlsaW5nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBjb250ZW50U3RyaW5nID0gJzxkaXY+PHA+UGxhbiBlZW4gcm91dGUgb3AgJytcbiAgICAgICAgICAgICc8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL2Rpci8/YXBpPTEmZGVzdGluYXRpb249JyArIE1hcHNIYW5kbGVyLmxvY2F0aW9uLmxhdCArICcsJyArIE1hcHNIYW5kbGVyLmxvY2F0aW9uLmxuZyArJ1wiIGNsYXNzPVwibGlua1wiPicrXG4gICAgICAgICAgICAnZ29vZ2xlIG1hcHM8L2E+ICcrXG4gICAgICAgICAgICAnPC9wPjwvZGl2Pic7XG5cbiAgICAgICAgdmFyIGluZm93aW5kb3cgPSBuZXcgZ29vZ2xlLm1hcHMuSW5mb1dpbmRvdyh7XG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50U3RyaW5nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCBhIG1hcmtlclxuICAgICAgICBsZXQgbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICAgICAgICBwb3NpdGlvbjogTWFwc0hhbmRsZXIubG9jYXRpb24sXG4gICAgICAgICAgICBtYXA6IG1hcCxcbiAgICAgICAgICAgIC8vIGxhYmVsOiAnQSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbWFya2VyLmFkZExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5mb3dpbmRvdy5vcGVuKG1hcCwgbWFya2VyKTtcbiAgICAgICAgfSk7XG5cbiAgICB9LFxuXG4gICAgc2V0Q3VzdG9tU3R5bGluZzogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIE1hcHNIYW5kbGVyLnN0eWxpbmcgPVxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcIndhdGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZTllOWU5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMTdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwibGFuZHNjYXBlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZjVmNWY1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMjBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5oaWdod2F5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmZmZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAxN1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmhpZ2h3YXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LnN0cm9rZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZmZmZmZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMjlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogMC4yXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQuYXJ0ZXJpYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZmZmZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAxOFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmxvY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZmZmZmZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMTZcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZjVmNWY1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMjFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicG9pLnBhcmtcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNkZWRlZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAyMVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJsYWJlbHMudGV4dC5zdHJva2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZpc2liaWxpdHlcIjogXCJvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZmZmZmZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMTZcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzLnRleHQuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic2F0dXJhdGlvblwiOiAzNlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiIzMzMzMzM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDQwXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVscy5pY29uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2aXNpYmlsaXR5XCI6IFwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwidHJhbnNpdFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2YyZjJmMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDE5XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcImFkbWluaXN0cmF0aXZlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5maWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZWZlZmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAyMFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJhZG1pbmlzdHJhdGl2ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuc3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmZWZlZmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAxN1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIndlaWdodFwiOiAxLjJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG5cbiAgICB9XG59O1xuXG5NYXBzSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIE5hdmlnYXRpb24gaGFuZGxlclxuICAgLSBIYW5kbGVzIHRoZSBzaG93aW5nIGFuZCBoaWRpbmcgb2YgdGhlIG92ZXJsYXktbWVudSBjb21wb25lbnQgd2hpY2ggaGFzIHRoZSBwcm9wZXIgY2xhc3Nlcy5cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBib2R5U2Nyb2xsTG9jayA9IHJlcXVpcmUoJ2JvZHktc2Nyb2xsLWxvY2snKTtcblxuY29uc3QgT3ZlcmxheU1lbnVIYW5kbGVyID0ge1xuXG4gICAgLy8gaW5pdDogZnVuY3Rpb24gKCkge1xuICAgIC8vICAgICBjb25zdCBvdmVybGF5TWVudVRyaWdnZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtb3ZlcmxheS1tZW51LXRyaWdnZXInKTtcbiAgICAvLyAgICAgT3ZlcmxheU1lbnVIYW5kbGVyLmluaXRPdmVybGF5TWVudShvdmVybGF5TWVudVRyaWdnZXIpO1xuICAgIC8vIH0sXG5cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgY29uc3Qgb3ZlcmxheU1lbnVUcmlnZ2VyTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1vdmVybGF5LW1lbnUtdHJpZ2dlcicpO1xuICAgICAgICBjb25zdCBvdmVybGF5TWVudVRyaWdnZXJMaXN0Q291bnQgPSBvdmVybGF5TWVudVRyaWdnZXJMaXN0Lmxlbmd0aDtcblxuICAgICAgICBpZihpc3NldChvdmVybGF5TWVudVRyaWdnZXJMaXN0KSAmJiBvdmVybGF5TWVudVRyaWdnZXJMaXN0Q291bnQgIT09IDApe1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG92ZXJsYXlNZW51VHJpZ2dlckxpc3RDb3VudDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVybGF5TWVudVRyaWdnZXIgPSBvdmVybGF5TWVudVRyaWdnZXJMaXN0W2ldO1xuICAgICAgICAgICAgICAgIE92ZXJsYXlNZW51SGFuZGxlci5pbml0T3ZlcmxheU1lbnUob3ZlcmxheU1lbnVUcmlnZ2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBpbml0T3ZlcmxheU1lbnU6IGZ1bmN0aW9uIChvdmVybGF5TWVudVRyaWdnZXIpIHtcbiAgICAgICAgb3ZlcmxheU1lbnVUcmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgT3ZlcmxheU1lbnVIYW5kbGVyLnRvZ2dsZU92ZXJsYXlNZW51LCBmYWxzZSk7XG4gICAgfSxcblxuICAgIHRvZ2dsZU92ZXJsYXlNZW51OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheU1lbnVOYXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtb3ZlcmxheS1tZW51Jyk7XG4gICAgICAgIC8vIGNvbnN0IG92ZXJsYXlNZW51Qm9keSA9IG92ZXJsYXlNZW51LnF1ZXJ5U2VsZWN0b3IoJy5qcy1vdmVybGF5LW1lbnUtcGVyc2lzdC1zY3JvbGxpbmcnKTtcblxuICAgICAgICAvLyBCYWlsIGlmIG92ZXJsYXlNZW51IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgaWYgKCFvdmVybGF5TWVudU5hdikgcmV0dXJuO1xuXG4gICAgICAgIC8vIENsZWFyIHByZXZpb3VzbHkgbG9ja2VkIHNjcm9sbCBvbiB0aGUgYm9keVxuICAgICAgICBib2R5U2Nyb2xsTG9jay5lbmFibGVCb2R5U2Nyb2xsKG92ZXJsYXlNZW51TmF2KTtcblxuICAgICAgICAvLyBJZiB0aGUgb3ZlcmxheU1lbnUgaXMgYWxyZWFkeSBhY3RpdmUsIGNvbGxhcHNlIGl0IGFuZCBxdWl0XG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygnaXMtb3ZlcmxheS1tZW51LWFjdGl2ZScpKSB7XG4gICAgICAgICAgICBvdmVybGF5TWVudU5hdi5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiaW5kZXg9XCIwXCJdJykuZm9yRWFjaChmdW5jdGlvbihlbGVtKSB7XG4gICAgICAgICAgICAgICAgZWxlbS50YWJJbmRleCA9IC0xO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnaXMtb3ZlcmxheS1tZW51LWFjdGl2ZScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9jayBzY3JvbGxpbmcgb24gdGhlIGJvZHlcbiAgICAgICAgYm9keVNjcm9sbExvY2suZGlzYWJsZUJvZHlTY3JvbGwob3ZlcmxheU1lbnVOYXYpO1xuXG4gICAgICAgIG92ZXJsYXlNZW51TmF2LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0YWJpbmRleD1cIi0xXCJdJykuZm9yRWFjaChmdW5jdGlvbihlbGVtKSB7XG4gICAgICAgICAgICBlbGVtLnRhYkluZGV4ID0gMDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVG9nZ2xlIGFjdGl2ZSBvdmVybGF5TWVudSBieSBzZXR0aW5nIGEgY2xhc3Mgb24gdGhlIGJvZHlcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCdpcy1vdmVybGF5LW1lbnUtYWN0aXZlJyk7XG4gICAgICAgIG92ZXJsYXlNZW51TmF2LmhpZGRlbiA9IGZhbHNlO1xuICAgIH1cbn07XG5cbk92ZXJsYXlNZW51SGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBTY3JvbGwgVG8gQ2xpY2sgaGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFNjcm9sbFRvSGFuZGxlciA9IHtcblxuICAgIC8vIEFuaW1hdGlvbiBzZXR0aW5nc1xuICAgIG9mZnNldCA6IDYwLCAvL3BpeGVsXG4gICAgZHVyYXRpb24gOiAxNDAwLCAvL21zXG5cbiAgICAvLyBBbmltYXRpb24gdmFyaWFibGVzXG4gICAgYm9keSA6IG51bGwsXG4gICAgc3RhcnQgOiAwLFxuICAgIGNoYW5nZSA6IDAsXG4gICAgY3VycmVudFRpbWUgOiAwLFxuICAgIGFsbG93QW5pbWF0aW9uIDogZmFsc2UsXG4gICAgc2Nyb2xsVG9BbmltYXRpb24gOiBudWxsLFxuXG4gICAgLy8gV2F0Y2ggdGhlIEVhc2luZ0Z1bmN0aW9uIGhlbHBlciBmb3IgdGhlIGF2YWlsYWJsZSBtZXRob2RzXG4gICAgZWFzaW5nOiAnZWFzZUluT3V0UXVhZCcsXG5cbiAgICBpbml0IDogZnVuY3Rpb24oKXtcblxuICAgICAgICBjb25zdCBhbmNob3JMaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1zY3JvbGwtdG8tdGFyZ2V0Jyk7XG4gICAgICAgIGNvbnN0IGFuY2hvckxpbmtzQW1vdW50ID0gYW5jaG9yTGlua3MubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBhbmNob3JMaW5rc0Ftb3VudDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGFuY2hvckxpbmsgPSBhbmNob3JMaW5rc1tpXTtcblxuICAgICAgICAgICAgYW5jaG9yTGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIFNjcm9sbFRvSGFuZGxlci5wcmVwYXJlU2Nyb2xsVG8odGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIEhhbmRsZXIgZm9yIHRoZSBhbmltYXRpb25cbiAgICAgKi9cbiAgICBwcmVwYXJlU2Nyb2xsVG8gOiBmdW5jdGlvbihlbGVtZW50SWQpe1xuXG4gICAgICAgIC8vIEdldCB0aGUgc2Nyb2xsIHRvIGVsZW1lbnRcbiAgICAgICAgZWxlbWVudElkID0gZWxlbWVudElkLnN1YnN0cihlbGVtZW50SWQuaW5kZXhPZignIycpKzEpO1xuICAgICAgICBjb25zdCBzY3JvbGxUb0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgICAgICBpZihzY3JvbGxUb0VsZW1lbnQgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbiA9IHNjcm9sbFRvRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBSZXNldCBvciBkZWZpbmUgdGhlIEhhbmRsZXIgdmFyaWFibGVzXG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5ib2R5ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuc3RhcnQgPSBNYXRoLm1heChTY3JvbGxUb0hhbmRsZXIuYm9keS5zY3JvbGxUb3AsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLCB3aW5kb3cucGFnZVlPZmZzZXQpOyAvL1VzZSBNYXRoLm1heCBiZWNhdXNlIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcFxuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuY2hhbmdlID0gKChzY3JvbGxUb0VsZW1lbnRQb3NpdGlvbi50b3AgKyBTY3JvbGxUb0hhbmRsZXIuc3RhcnQpIC0gU2Nyb2xsVG9IYW5kbGVyLnN0YXJ0KSAtIFNjcm9sbFRvSGFuZGxlci5vZmZzZXQ7XG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5zdGFydFRpbWUgPSAnbm93JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UgPyBwZXJmb3JtYW5jZS5ub3coKSA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuYWxsb3dBbmltYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgYW5pbWF0aW9uXG4gICAgICAgIHNjcm9sbFRvQW5pbWF0aW9uID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5hbmltYXRlU2Nyb2xsKTtcblxuICAgICAgICAvLyBTdG9wIG9uIHNjcm9sbFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU1vdXNlU2Nyb2xsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBTY3JvbGxUb0hhbmRsZXIuYWJvcnRTY3JvbGxBbmltYXRpb24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcblxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEFuaW1hdGUgdGhlIHNjcm9sbCBwb3NpdGlvblxuICAgICAqL1xuICAgIGFuaW1hdGVTY3JvbGwgOiBmdW5jdGlvbiAodGltZXN0YW1wKSB7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHByb2dyZXNzIGZyb20gMCAtIDFcbiAgICAgICAgbGV0IHByb2dyZXNzID0gTWF0aC5taW4oMSwgKHRpbWVzdGFtcCAtICBTY3JvbGxUb0hhbmRsZXIuc3RhcnRUaW1lKSAvIFNjcm9sbFRvSGFuZGxlci5kdXJhdGlvbik7XG4gICAgICAgIGlmKHByb2dyZXNzIDwgMCkgcHJvZ3Jlc3MgPSAwO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcHJvZ3Jlc3Mgd2l0aCBlYXNpbmcgZnVuY3Rpb25cbiAgICAgICAgcHJvZ3Jlc3MgPSBFYXNpbmdGdW5jdGlvbnNbU2Nyb2xsVG9IYW5kbGVyLmVhc2luZ10ocHJvZ3Jlc3MpO1xuXG4gICAgICAgIGNvbnN0IG5ld1Njcm9sbFRvcCA9IFNjcm9sbFRvSGFuZGxlci5zdGFydCArICggU2Nyb2xsVG9IYW5kbGVyLmNoYW5nZSAqIHByb2dyZXNzICk7XG5cbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wID0gbmV3U2Nyb2xsVG9wO1xuICAgICAgICBpZiggU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wID09PSAwICkgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBuZXdTY3JvbGxUb3A7IC8vIFNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgc28gaWYgU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wIGlzIDAgZm9yY2UgdGhlIHNjcm9sbCBwb3NpdGlvbiB0aHJvdWdoIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXG5cbiAgICAgICAgaWYocHJvZ3Jlc3MgPCAxICYmIFNjcm9sbFRvSGFuZGxlci5hbGxvd0FuaW1hdGlvbil7XG4gICAgICAgICAgICBzY3JvbGxUb0FuaW1hdGlvbiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShTY3JvbGxUb0hhbmRsZXIuYW5pbWF0ZVNjcm9sbCk7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEFib3J0IHRoZSBzY3JvbGwgYW5pbWF0aW9uXG4gICAgICovXG4gICAgYWJvcnRTY3JvbGxBbmltYXRpb24gOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmFsbG93QW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKFNjcm9sbFRvSGFuZGxlci5zY3JvbGxUb0FuaW1hdGlvbik7XG4gICAgfVxuXG59O1xuXG5TY3JvbGxUb0hhbmRsZXIuaW5pdCgpOyIsIlxuLyogRXhhbXBsZVxuXG5jb25zdCBoZWFkZXJJbWFnZVNsaWRlclNldHRpbmcgPSBuZXcgU2xpZGVyUHJvamVjdG9yU2V0dGluZyh7XG4gICAgc2xpZGVyUHJvamVjdG9ySWQ6ICdoZWFkZXItaW1hZ2Utc2xpZGVyJyxcbiAgICBzbGlkZVF1ZXJ5OiAnI2hlYWRlci1pbWFnZS1zbGlkZXIgLnBsYWNlaG9sZGVyIGZpZ3VyZScsXG4gICAgZG90czogJyNoZWFkZXItaW1hZ2Utc2xpZGVyIC5zbGlkZXItbmF2aWdhdGlvbi1sYWJlbHMgLm5hdmlnYXRpb24gc3BhbicsXG4gICAgYXV0b1NsaWRlcjogdHJ1ZSxcbiAgICBzbGlkZXJJbnRlcnZhbDogNDAwMFxufSk7XG5oZWFkZXJJbWFnZVNsaWRlclNldHRpbmcgPSBoZWFkZXJJbWFnZVNsaWRlclNldHRpbmcucHJlcGFyZVBhcmFtZXRlcnMoKTtcblxuY29uc3QgaGVhZGVySW1hZ2VTbGlkZXIgPSBuZXcgU2xpZGVyUHJvamVjdG9yKGhlYWRlckltYWdlU2xpZGVyU2V0dGluZykuaW5pdCgpO1xuXG4gKi9cblxubGV0IFNsaWRlcnMgPSBbXTtcblxuY29uc3Qgc2xpZGVyQ29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1zbGlkZXInKTtcbmNvbnN0IHNsaWRlckNvbnRhaW5lcnNMZW5ndGggPSBzbGlkZXJDb250YWluZXJzLmxlbmd0aDtcblxuZm9yKGxldCBpID0wOyBpIDwgc2xpZGVyQ29udGFpbmVyc0xlbmd0aDsgaSsrKXtcblxuICAgIGNvbnN0IHNsaWRlciA9IHNsaWRlckNvbnRhaW5lcnNbaV07XG4gICAgY29uc3Qgc2xpZGVySWQgPSBzbGlkZXIuZ2V0QXR0cmlidXRlKCdpZCcpO1xuXG4gICAgaWYoc2xpZGVySWQgIT09IG51bGwpe1xuXG4gICAgICAgIGNvbnN0IFNsaWRlcnNldHRpbmcgPSBuZXcgU2xpZGVyU2V0dGluZyh7XG4gICAgICAgICAgICBzbGlkZXJJZDogc2xpZGVySWQsXG4gICAgICAgICAgICBhdXRvU2xpZGVyOiBzbGlkZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWF1dG8tc2xpZGUnKSxcbiAgICAgICAgICAgIHNsaWRlUXVlcnk6ICcjJyArIHNsaWRlcklkICsnIC5qcy1zbGlkZXItc2xpZGUnLFxuICAgICAgICAgICAgbmF2aWdhdGlvbkJ1dHRvbnM6ICcjJyArIHNsaWRlcklkICsnIC5qcy1zbGlkZXItYnV0dG9uJyxcbiAgICAgICAgICAgIGRvdHM6ICcjJyArIHNsaWRlcklkICsnIC5qcy1zbGlkZXItaW5kaWNhdG9yJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgU2xpZGVycy5wdXNoKCBuZXcgU2xpZGVyKFNsaWRlcnNldHRpbmcucHJlcGFyZVBhcmFtZXRlcnMoKSkuaW5pdCgpICk7XG4gICAgfVxuICAgIGVsc2UgY29uc29sZS5sb2coJ0FuIGltYWdlIHNsaWRlciBoYXMgbm8gaWQuLi4nKTtcbn1cblxuXG5mdW5jdGlvbiBTbGlkZXJTZXR0aW5nKHNldHRpbmdzT2JqZWN0KSB7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIHRoaXMuc2xpZGVySWQgPSAnJztcbiAgICB0aGlzLmF1dG9TbGlkZXIgPSBmYWxzZTtcbiAgICB0aGlzLnNsaWRlckludGVydmFsID0gNDAwMDtcbiAgICB0aGlzLm5hdmlnYXRpb25CdXR0b25zID0gJyc7XG4gICAgdGhpcy5kb3RzID0gJyc7XG4gICAgdGhpcy5zbGlkZVF1ZXJ5ID0gJyc7XG5cbiAgICB0aGlzLnNldFNsaWRlcklkID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLnNsaWRlcklkID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0QXV0b1NsaWRlciA9IGZ1bmN0aW9uIChib29sZWFuKSB7XG4gICAgICAgIHRoaXMuYXV0b1NsaWRlciA9IGJvb2xlYW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXRTbGlkZXJJbnRlcnZhbCA9IGZ1bmN0aW9uIChpbnRlZ2VyKSB7XG4gICAgICAgIHRoaXMuc2xpZGVySW50ZXJ2YWwgPSBpbnRlZ2VyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0U2xpZGVRdWVyeSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zbGlkZVF1ZXJ5ID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0TmF2aWdhdGlvbkJ1dHRvbnMgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkJ1dHRvbnMgPSBzdHJpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5zZXREb3RzID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLmRvdHMgPSBzdHJpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgdGhpcy5nZXRTbGlkZXJJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVySWQ7XG4gICAgfTtcbiAgICB0aGlzLmdldEF1dG9TbGlkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBhdXRvU2xpZGUgPSB0aGlzLmF1dG9TbGlkZXI7XG4gICAgICAgIGlmKCFOdW1iZXIuaXNJbnRlZ2VyKGF1dG9TbGlkZSkpe1xuICAgICAgICAgICAgaWYoYXV0b1NsaWRlID09IGZhbHNlKSBhdXRvU2xpZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGVsc2UgYXV0b1NsaWRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXV0b1NsaWRlO1xuICAgIH07XG4gICAgdGhpcy5nZXRTbGlkZXJJbnRlcnZhbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVySW50ZXJ2YWw7XG4gICAgfTtcbiAgICB0aGlzLmdldFNsaWRlUXVlcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsaWRlUXVlcnk7XG4gICAgfTtcbiAgICB0aGlzLmdldE5hdmlnYXRpb25CdXR0b25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uQnV0dG9ucztcbiAgICB9O1xuICAgIHRoaXMuZ2V0RG90cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG90cztcbiAgICB9O1xuXG4gICAgLy8gSW52ZXJ0IHNldHRlcnMgdG8gZ2V0dGVyc1xuICAgIHRoaXMucHJlcGFyZVBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNsaWRlcklkOiBzZWxmLmdldFNsaWRlcklkKCksXG4gICAgICAgICAgICBhdXRvU2xpZGVyOiBzZWxmLmdldEF1dG9TbGlkZXIoKSxcbiAgICAgICAgICAgIHNsaWRlckludGVydmFsOiBzZWxmLmdldFNsaWRlckludGVydmFsKCksXG4gICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogc2VsZi5nZXROYXZpZ2F0aW9uQnV0dG9ucygpLFxuICAgICAgICAgICAgZG90czogc2VsZi5nZXREb3RzKCksXG4gICAgICAgICAgICBzbGlkZVF1ZXJ5OiBzZWxmLmdldFNsaWRlUXVlcnkoKVxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgLy8gTWFzcyBhc3NpZ24gc2V0dGluZ3NcbiAgICB0aGlzLmZpbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIE9iamVjdC5rZXlzKHNldHRpbmdzT2JqZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgLy8gICAgIHNlbGZba2V5XSA9IHNldHRpbmdzT2JqZWN0W2tleV07XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIGNvbnN0IHNldHRpbmdzT2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzKHNldHRpbmdzT2JqZWN0KTtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3NPYmplY3RMZW5ndGggPSBzZXR0aW5nc09iamVjdEtleXMubGVuZ3RoO1xuXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBzZXR0aW5nc09iamVjdExlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHNldHRpbmdzT2JqZWN0S2V5c1tpXTtcbiAgICAgICAgICAgIHNlbGZba2V5XSA9IHNldHRpbmdzT2JqZWN0W2tleV07XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB0aGlzLmZpbGwoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHNsaWRlcklkOiBzZWxmLnNldFNsaWRlcklkLFxuICAgICAgICBhdXRvU2xpZGVyOiBzZWxmLnNldEF1dG9TbGlkZXIsXG4gICAgICAgIHNsaWRlckludGVydmFsOiBzZWxmLnNldFNsaWRlckludGVydmFsLFxuICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uczogc2VsZi5zZXROYXZpZ2F0aW9uQnV0dG9ucyxcbiAgICAgICAgZG90czogc2VsZi5zZXREb3RzLFxuICAgICAgICBzbGlkZVF1ZXJ5OiBzZWxmLnNldFNsaWRlUXVlcnksXG4gICAgICAgIHByZXBhcmVQYXJhbWV0ZXJzOiBzZWxmLnByZXBhcmVQYXJhbWV0ZXJzXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gU2xpZGVyKHNldHRpbmdzKSB7XG5cbiAgICAvL0RlZmluZSBTbGlkZXIgb2JqZWN0XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5zbGlkZXJPYmplY3QgPSAnJztcblxuICAgIC8vU2xpZGVQYXJhbWV0ZXJzXG4gICAgdGhpcy5hY3RpdmVTbGlkZUlkID0gMDtcbiAgICB0aGlzLnByZXZpb3VzU2xpZGVJZCA9IDA7XG4gICAgdGhpcy5uZXh0U2xpZGVJZCA9IDA7XG4gICAgdGhpcy5hdmFpbGFibGVTbGlkZXMgPSAxO1xuICAgIHRoaXMuc2xpZGVzID0gW107XG4gICAgdGhpcy5hdXRvU2xpZGVySW50ZXJ2YWwgPSBudWxsO1xuXG4gICAgdGhpcy5zZXR0aW5ncyA9IHt9O1xuXG4gICAgdGhpcy5pbml0ID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vQXBwZW5kIHNldHRpbmdzIHRvIHNlbGZcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuXG4gICAgICAgIC8vQXNzaWduIG5lZWRlZCBlbGVtZW50cyBhbmQgY2FsY3VsYXRpb25zXG4gICAgICAgIHRoaXMuc2xpZGVyT2JqZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZXR0aW5ncy5zbGlkZXJJZCk7XG4gICAgICAgIHRoaXMuc2xpZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLnNsaWRlUXVlcnkpO1xuICAgICAgICB0aGlzLmF2YWlsYWJsZVNsaWRlcyA9IHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5hY3RpdmVTbGlkZUlkID0gMDtcblxuICAgICAgICAvLyBTZXQgYWN0aXZlIHNsaWRlIChhbmQgcG9zc2libGUgcHJldmlvdXMgYW5kIG5leHQgY2xhc3NlcylcbiAgICAgICAgdGhpcy5zZXRTbGlkZSgpO1xuXG4gICAgICAgIC8vIFN3aXBlIGludGVyYWN0aW9uXG4gICAgICAgIGNvbnN0IHN3aXBlR2VzdHVyZXMgPSBuZXcgSGFtbWVyKHRoaXMuc2xpZGVyT2JqZWN0KTtcbiAgICAgICAgc3dpcGVHZXN0dXJlcy5vbignc3dpcGVsZWZ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5yZXNldEF1dG9TbGlkZXIoKTtcbiAgICAgICAgICAgIHNlbGYubmV4dFNsaWRlKCk7XG4gICAgICAgICAgICBzZWxmLnNldFNsaWRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzd2lwZUdlc3R1cmVzLm9uKCdzd2lwZXJpZ2h0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5yZXNldEF1dG9TbGlkZXIoKTtcbiAgICAgICAgICAgIHNlbGYucHJldmlvdXNTbGlkZSgpO1xuICAgICAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zICE9PSAnJykge1xuXG4gICAgICAgICAgICAvLyBDbGljayBpbnRlcmFjdGlvblxuICAgICAgICAgICAgY29uc3QgbmF2aWdhdGlvbkJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuc2V0dGluZ3MubmF2aWdhdGlvbkJ1dHRvbnMpO1xuICAgICAgICAgICAgY29uc3QgbmF2aWdhdGlvbkJ1dHRvbnNMZW5ndGggPSBuYXZpZ2F0aW9uQnV0dG9ucy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbmF2aWdhdGlvbkJ1dHRvbnNMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgbmF2aWdhdGlvbkJ1dHRvbiA9IG5hdmlnYXRpb25CdXR0b25zW2ldO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpY2tOYXZpZ2F0aW9uQnV0dG9uKHRoaXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZG90cyAhPT0gJycpIHtcbiAgICAgICAgICAgIC8vIENsaWNrIGludGVyYWN0aW9uXG4gICAgICAgICAgICBjb25zdCBkb3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmRvdHMpO1xuICAgICAgICAgICAgY29uc3QgZG90c0xlbmd0aCA9IGRvdHMubGVuZ3RoO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zZXR0aW5ncy5kb3RzKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRvdHMpO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGRvdHNMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgZG90ID0gZG90c1tpXTtcbiAgICAgICAgICAgICAgICBkb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpY2tEb3QodGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuYXV0b1NsaWRlcigpO1xuICAgIH07XG5cblxuICAgIHRoaXMuYXV0b1NsaWRlciA9IGZ1bmN0aW9uICgpe1xuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBpbnRlcnZhbCBpZiBkZWZpbmVkXG4gICAgICAgIGlmKHRoaXMuYXV0b1NsaWRlckludGVydmFsICE9PSBudWxsKSBjbGVhckludGVydmFsKHRoaXMuYXV0b1NsaWRlckludGVydmFsKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBzaG91bGQgYXV0byBzbGlkZSBiZWZvcmUgY3JlYXRpbmcgdGhlIGludGVydmFsXG4gICAgICAgIC8vIFdlIGRvIHRoaXMgaW5oZXJlLCBiZWNhdXNlIHRoZSBhdXRvc2xpZGUgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgYnkgb3RoZXIgZnVuY3Rpb25hbGl0eVxuICAgICAgICBpZih0aGlzLnNldHRpbmdzLmF1dG9TbGlkZXIgIT09IGZhbHNlICYmIE51bWJlci5pc0ludGVnZXIodGhpcy5zZXR0aW5ncy5zbGlkZXJJbnRlcnZhbCkgICl7XG5cbiAgICAgICAgICAgIHRoaXMuYXV0b1NsaWRlckludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYubmV4dFNsaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzLnNldHRpbmdzLnNsaWRlckludGVydmFsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMucmVzZXRBdXRvU2xpZGVyID0gc2VsZi5hdXRvU2xpZGVyO1xuXG4gICAgdGhpcy5uZXh0U2xpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJZCsrO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVTbGlkZUlkID49IHRoaXMuYXZhaWxhYmxlU2xpZGVzKSB0aGlzLmFjdGl2ZVNsaWRlSWQgPSAwO1xuICAgIH07XG5cbiAgICB0aGlzLnByZXZpb3VzU2xpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJZC0tO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVTbGlkZUlkIDwgMCkgdGhpcy5hY3RpdmVTbGlkZUlkID0gdGhpcy5hdmFpbGFibGVTbGlkZXMgLSAxO1xuICAgIH07XG5cblxuICAgIHRoaXMuc2V0U2xpZGUgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBmb3JtIGVsZW1lbnRzXG4gICAgICAgIGNvbnN0IHNsaWRlc0xlbmd0aCA9IHNlbGYuc2xpZGVzLmxlbmd0aDtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHNsaWRlc0xlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGNvbnN0IHNsaWRlID0gc2VsZi5zbGlkZXNbaV07XG5cbiAgICAgICAgICAgIHNsaWRlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjsgLy8gTmVlZGVkIGZvciBzd2lwZSBmdW5jdGlvbmFsaXR5XG5cbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSBzZXQgYXR0cmlidXRlIHRvIGRlc2lyZWQgdHlwZVxuICAgICAgICAgICAgY29uc3Qgc2xpZGVPcmRlciA9IHBhcnNlSW50KHNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFuZCBzZXQgYWN0aXZlIGZvciBhbGwgc2xpZGVzXG4gICAgICAgICAgICBpZiAoc2xpZGVPcmRlciAhPT0gc2VsZi5hY3RpdmVTbGlkZUlkKSBzbGlkZS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIGVsc2Ugc2xpZGUuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kb3RzICE9PSAnJykgeyBzZWxmLnNldEFjdGl2ZURvdCgpOyB9XG4gICAgfTtcblxuICAgIHRoaXMuY2xpY2tOYXZpZ2F0aW9uQnV0dG9uID0gZnVuY3Rpb24gKG5hdkJ1dHRvbikge1xuXG4gICAgICAgIGNvbnN0IG5hdkJ1dHRvbkRpcmVjdGlvbiA9IG5hdkJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcblxuICAgICAgICBpZihuYXZCdXR0b25EaXJlY3Rpb24gPT09ICduZXh0JykgdGhpcy5uZXh0U2xpZGUoKTtcbiAgICAgICAgZWxzZSBpZihuYXZCdXR0b25EaXJlY3Rpb24gPT09ICdwcmV2aW91cycpIHRoaXMucHJldmlvdXNTbGlkZSgpO1xuXG4gICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgc2VsZi5yZXNldEF1dG9TbGlkZXIoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jbGlja0RvdCA9IGZ1bmN0aW9uIChjbGlja2VkRG90KSB7XG4gICAgICAgIHNlbGYuYWN0aXZlU2xpZGVJZCA9IHBhcnNlSW50KGNsaWNrZWREb3QuZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuICAgICAgICBzZWxmLnNldFNsaWRlKCk7XG4gICAgICAgIHNlbGYucmVzZXRBdXRvU2xpZGVyKCk7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0QWN0aXZlRG90ID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGNvbnN0IGRvdHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuc2V0dGluZ3MuZG90cyk7XG4gICAgICAgIGNvbnN0IGRvdHNMZW5ndGggPSBkb3RzLmxlbmd0aDtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGRvdHNMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBkb3QgPSBkb3RzW2ldO1xuICAgICAgICAgICAgZG90T3JkZXIgPSBwYXJzZUludChkb3QuZ2V0QXR0cmlidXRlKCdkYXRhLW9yZGVyJykpO1xuXG4gICAgICAgICAgICBpZihkb3RPcmRlciAhPT0gc2VsZi5hY3RpdmVTbGlkZUlkKSB7XG4gICAgICAgICAgICAgICAgZG90LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIGRvdC50YWJJbmRleCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb3QuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgZG90LnRhYkluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBUYWJzIGhhbmRsZXJcbiAgIC0gSGFuZGxlcyB0aGUgdGFicyBjb21wb25lbnQgd2hpY2ggaGFzIHRoZSBwcm9wZXIgY2xhc3Nlcy5cbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBUYWJzSGFuZGxlciA9IHtcbiAgICB0YWJzTGlzdCA6IG51bGwsXG4gICAgdGFicyA6IG51bGwsXG5cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFRhYnNIYW5kbGVyLnRhYnNMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLXRhYnMnKTtcbiAgICAgICAgY29uc3QgdGFic0xpc3RDb3VudCA9IFRhYnNIYW5kbGVyLnRhYnNMaXN0Lmxlbmd0aDtcblxuICAgICAgICBpZihpc3NldChUYWJzSGFuZGxlci50YWJzTGlzdCkgJiYgdGFic0xpc3RDb3VudCAhPT0gMCl7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGFic0xpc3RDb3VudDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJzID0gVGFic0hhbmRsZXIudGFic0xpc3RbaV07XG4gICAgICAgICAgICAgICAgVGFic0hhbmRsZXIuaW5pdFRhYnModGFicyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaW5pdFRhYnM6IGZ1bmN0aW9uICh0YWJzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRhYnMucXVlcnlTZWxlY3RvcignLmpzLXRhYnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgY29udGFpbmVyIGVsZW1lbnQgZXhpc3RzXG4gICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgVGhlcmUgaXMgbm8gY29udGFpbmVyIGZvciB0aGUgY29udGVudCB0YWJzIGRlZmluZWQuYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmlnZ2VycyA9IHRhYnMucXVlcnlTZWxlY3RvckFsbCgnLmpzLXRhYnMtdHJpZ2dlcicpO1xuICAgICAgICBjb25zdCB0YWJzQ29udGVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuanMtdGFicy1jb250ZW50Jyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgbnVtYmVyIG9mIHRyaWdnZXJzIGFuZCB0YWJzIG1hdGNoXG4gICAgICAgIGlmKHRyaWdnZXJzLmxlbmd0aCAhPT0gdGFicy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZXJlIGFyZSAke3RyaWdnZXJzLmxlbmd0aH0gdHJpZ2dlciBidXR0b25zIGFuZCAke3RhYnMubGVuZ3RofSB0YWJzLiBUaGVzZSBtdXN0IG1hdGNoLmApXG4gICAgICAgIH1cblxuICAgICAgICB0YWJzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGNsaWNrZWQgb24gYSBzdGVwIGJ1dHRvbiAocHJldiBvciBuZXh0KVxuICAgICAgICAgICAgaWYoZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5qcy10YWJzLXN0ZXAnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpciA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuanMtdGFicy1zdGVwJykuZ2V0QXR0cmlidXRlKCdkYXRhLXN0ZXAnKTtcbiAgICAgICAgICAgICAgICBUYWJzSGFuZGxlci5zdGVwVGFicyhkaXIsIHRyaWdnZXJzLCB0YWJzQ29udGVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJhaWwgaWYgd2UgZGlkbid0IGNsaWNrIG9uIHRoZSB0cmlnZ2VyIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnanMtdGFicy10cmlnZ2VyJykpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gQmFpbCBpZiBhbHJlYWR5IGFjdGl2ZVxuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICBUYWJzSGFuZGxlci50b2dnbGVUYWJzKGV2ZW50LnRhcmdldC5kYXRhc2V0LnRhYklkLCB0cmlnZ2VycywgdGFic0NvbnRlbnQpO1xuXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICB0b2dnbGVUYWJzOiBmdW5jdGlvbiAodGFiSWQsIHRyaWdnZXJzLCB0YWJzQ29udGVudCkge1xuXG4gICAgICAgIGlmKGlzc2V0KHRyaWdnZXJzKSAmJiB0cmlnZ2Vycy5sZW5ndGggPiAwKXtcblxuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0YWJzXG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdHJpZ2dlcnMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYnNUYWIgPSB0YWJzQ29udGVudFtpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJzVHJpZ2dlciA9IHRyaWdnZXJzW2ldO1xuXG4gICAgICAgICAgICAgICAgdGFic1RyaWdnZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgdGFic1RyaWdnZXIudGFiSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIHRhYnNUYWIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGFic1RhYi5kYXRhc2V0LnRhYklkID09PSB0YWJJZCkge1xuICAgICAgICAgICAgICAgICAgICB0YWJzVHJpZ2dlci5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgdGFic1RyaWdnZXIudGFiSW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgdGFic1RhYi5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RlcFRhYnM6IGZ1bmN0aW9uIChkaXIsIHRyaWdnZXJzLCB0YWJzQ29udGVudCkge1xuICAgICAgICBjb25zdCB0cmlnZ2VyQ291bnQgPSB0cmlnZ2Vycy5sZW5ndGg7XG4gICAgICAgIGxldCBhY3RpdmVJZCA9IDE7XG4gICAgICAgIGxldCBuZXdJZCA9IDA7XG5cbiAgICAgICAgaWYoaXNzZXQodHJpZ2dlcnMpICYmIHRyaWdnZXJDb3VudCA+IDApe1xuXG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRhYnNcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0cmlnZ2VyQ291bnQ7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFic1RhYiA9IHRhYnNDb250ZW50W2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYnNUcmlnZ2VyID0gdHJpZ2dlcnNbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgYWN0aXZlSWRcbiAgICAgICAgICAgICAgICBpZih0YWJzVGFiLmNsYXNzTGlzdC5jb250YWlucygnaXMtYWN0aXZlJykpe1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmVJZCA9IE51bWJlcih0YWJzVGFiLmdldEF0dHJpYnV0ZSgnZGF0YS10YWItaWQnKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2hhdCBuZXh0IElkIHdpbGwgYmVcbiAgICAgICAgICAgICAgICBpZihkaXIgPT09ICduZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSWQgPT09IHRyaWdnZXJDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SWQgPSBhY3RpdmVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyID09PSAncHJldicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUlkID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJZCA9IHRyaWdnZXJDb3VudCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJZCA9IGFjdGl2ZUlkIC0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhY3RpdmUgY2xhc3NcbiAgICAgICAgICAgICAgICB0YWJzVHJpZ2dlci50YWJJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgdGFic1RhYi5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0YWJzVHJpZ2dlci5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJpZ2dlcnNbbmV3SWRdLnRhYkluZGV4ID0gLTE7XG4gICAgICAgICAgICB0cmlnZ2Vyc1tuZXdJZF0uY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICB0YWJzW25ld0lkXS5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcblxuICAgICAgICB9XG4gICAgfVxufTtcblxuVGFic0hhbmRsZXIuaW5pdCgpOyIsImNvbnN0IFdvcmxkTWFwSGFuZGxlciA9IHtcblxuICAgIHdvcmxkTWFwOiBudWxsLFxuICAgIHZpc2l0ZWRDb3VudHJpZXM6IG51bGwsXG4gICAgbWFya2VyOiBudWxsLFxuICAgIHRpbWVvdXRGdW5jdGlvbjogbnVsbCxcblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgV29ybGRNYXBIYW5kbGVyLndvcmxkTWFwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLXdvcmxkLW1hcCcpO1xuICAgICAgICBXb3JsZE1hcEhhbmRsZXIubWFya2VyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLXdvcmxkLW1hcC1tYXJrZXInKTtcbiAgICAgICAgV29ybGRNYXBIYW5kbGVyLnZpc2l0ZWRDb3VudHJpZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtd29ybGQtbWFwLWl0ZW1zIGxpJyk7XG5cbiAgICAgICAgaWYoIWlzc2V0KFdvcmxkTWFwSGFuZGxlci53b3JsZE1hcCkgfHwgIWlzc2V0KFdvcmxkTWFwSGFuZGxlci52aXNpdGVkQ291bnRyaWVzKSkgcmV0dXJuO1xuXG4gICAgICAgIFdvcmxkTWFwSGFuZGxlci53b3JsZE1hcC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgV29ybGRNYXBIYW5kbGVyLm1hcmtlci5zdHlsZS50b3AgPSBlLmNsaWVudFkgKyAncHgnO1xuICAgICAgICAgICAgV29ybGRNYXBIYW5kbGVyLm1hcmtlci5zdHlsZS5sZWZ0ID0gZS5jbGllbnRYICsgJ3B4JztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdmlzaXRlZENvdW50cmllc0xlbmd0aCA9IFdvcmxkTWFwSGFuZGxlci52aXNpdGVkQ291bnRyaWVzLmxlbmd0aDtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHZpc2l0ZWRDb3VudHJpZXNMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCB2aXNpdGVkQ291bnRyeSA9IFdvcmxkTWFwSGFuZGxlci52aXNpdGVkQ291bnRyaWVzW2ldO1xuXG4gICAgICAgICAgICBjb25zdCBpc28gPSB2aXNpdGVkQ291bnRyeS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaXNvJyk7XG4gICAgICAgICAgICBpZighaXNzZXQoaXNvKSB8fCBpc28gPT09ICcnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3Qgc3ZnTm9kZSA9IFdvcmxkTWFwSGFuZGxlci53b3JsZE1hcC5xdWVyeVNlbGVjdG9yKCcjJyArIGlzbyk7IFxuICAgICAgICAgICAgaWYoaXNzZXQoc3ZnTm9kZSkpIFdvcmxkTWFwSGFuZGxlci5pbml0RXZlbnRMaXN0ZW5lcnMoc3ZnTm9kZSwgdmlzaXRlZENvdW50cnkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGluaXRFdmVudExpc3RlbmVyczogZnVuY3Rpb24gKHN2Z05vZGUsIHZpc2l0ZWRDb3VudHJ5KSB7XG5cbiAgICAgICAgc3ZnTm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgdmlzaXRlZENvdW50cnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtd29ybGQtbWFwLWl0ZW1zIGxpW2RhdGEtaXNvPVwiJyArIHRoaXMuaWQgKyAnXCJdJylcbiAgICAgICAgICAgIGNvbnN0IHZpc2l0ZWRDb3VudHJ5TmFtZSA9IHZpc2l0ZWRDb3VudHJ5LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XG5cbiAgICAgICAgICAgIGlmKFdvcmxkTWFwSGFuZGxlci5tYXJrZXIuZ2V0QXR0cmlidXRlKCdkYXRhLW5hbWUnKSAhPT0gdmlzaXRlZENvdW50cnlOYW1lKSB7XG4gICAgICAgICAgICAgICAgV29ybGRNYXBIYW5kbGVyLm1hcmtlci5zZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScsIHZpc2l0ZWRDb3VudHJ5TmFtZSk7XG4gICAgICAgICAgICAgICAgV29ybGRNYXBIYW5kbGVyLm1hcmtlci5jbGFzc0xpc3QucmVtb3ZlKCdmYWRlLW91dCcpO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChXb3JsZE1hcEhhbmRsZXIudGltZW91dEZ1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3ZnTm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgdmlzaXRlZENvdW50cnkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtd29ybGQtbWFwLWl0ZW1zIGxpW2RhdGEtaXNvPVwiJyArIHRoaXMuaWQgKyAnXCJdJylcbiAgICAgICAgICAgIGNvbnN0IHZpc2l0ZWRDb3VudHJ5TmFtZSA9IHZpc2l0ZWRDb3VudHJ5LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XG5cbiAgICAgICAgICAgIGlmKFdvcmxkTWFwSGFuZGxlci5tYXJrZXIuZ2V0QXR0cmlidXRlKCdkYXRhLW5hbWUnKSA9PT0gdmlzaXRlZENvdW50cnlOYW1lKSB7XG4gICAgICAgICAgICAgICAgV29ybGRNYXBIYW5kbGVyLm1hcmtlci5jbGFzc0xpc3QuYWRkKCdmYWRlLW91dCcpO1xuICAgICAgICAgICAgICAgIFdvcmxkTWFwSGFuZGxlci50aW1lb3V0RnVuY3Rpb24gPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgV29ybGRNYXBIYW5kbGVyLm1hcmtlci5zZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgV29ybGRNYXBIYW5kbGVyLm1hcmtlci5jbGFzc0xpc3QucmVtb3ZlKCdmYWRlLW91dCcpO1xuICAgICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmKHZpc2l0ZWRDb3VudHJ5LmdldEF0dHJpYnV0ZSgnZGF0YS1ocmVmJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN2Z05vZGUuY2xhc3NMaXN0LmFkZCgnY2xpY2thYmxlJyk7XG4gICAgICAgICAgICBzdmdOb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHZpc2l0ZWRDb3VudHJ5LmdldEF0dHJpYnV0ZSgnZGF0YS1ocmVmJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjbGVhck1hcmtlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICBXb3JsZE1hcEhhbmRsZXIubWFya2VyLnNldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJywgJycpO1xuICAgICAgICBXb3JsZE1hcEhhbmRsZXIubWFya2VyLmNsYXNzTGlzdC5yZW1vdmUoJ2ZhZGUtb3V0Jyk7XG4gICAgICAgIFdvcmxkTWFwSGFuZGxlci5tYXJrZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtY2xpY2thYmxlJyk7XG4gICAgfVxuXG59O1xuXG5Xb3JsZE1hcEhhbmRsZXIuaW5pdCgpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgWW91dHViZSBoYW5kbGVyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgWW91dHViZUhhbmRsZXIgPSB7XG5cbiAgICB5b3V0dWJlQ2xhc3MgOiAnLmpzLXlvdXR1YmUtcGxheWVyJyxcbiAgICBwbGF5ZXJzOiBbXSxcblxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBHZXQgdGhlIHlvdXR1YmUgcGxheWVycyBjb250YWluZXJzXG4gICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChZb3V0dWJlSGFuZGxlci55b3V0dWJlQ2xhc3MpO1xuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyc0Ftb3VudCA9IHlvdXR1YmVQbGF5ZXJzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgeW91dHViZVBsYXllcnNBbW91bnQ7IGkrKyl7XG5cbiAgICAgICAgICAgIGNvbnN0IHlvdXR1YmVQbGF5ZXIgPSB5b3V0dWJlUGxheWVyc1tpXTtcblxuXG4gICAgICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVySWQgPSB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgICAgIGlmKHlvdXR1YmVQbGF5ZXJJZCAhPT0gbnVsbCApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gU3RyaXAgdGhlIG5lY2Vzc2FyeSBkYXRhIGZyb20gdGhlIGh0bWwgYW5kIGNyZWF0ZSBvYmplY3RzIGZyb20gaXRcbiAgICAgICAgICAgICAgICBjb25zdCB5b3V0dWJlRWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdpZCcpLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOiB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnZGF0YS15b3V0dWJlLWxpbmsnKSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b1BsYXk6IHBhcnNlSW50KHlvdXR1YmVQbGF5ZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWF1dG8tcGxheScpKSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgWW91dHViZUhhbmRsZXIucGxheWVycy5wdXNoKHlvdXR1YmVFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFbGVtZW50IG5vdCBpbmNsdWRlIGJlY2F1c2UgdGhlcmUgaXNuJ3QgYSBpZCBvbiB0aGUgcGxheWVyXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHlvdXR1YmVQbGF5ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoeW91dHViZVBsYXllcnNBbW91bnQgPj0gMSkgWW91dHViZUhhbmRsZXIuaW5pdFlvdXR1YmUoKTtcblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBleHRlcm5hbCBzY3JpcHQgaXMgbG9hZGVkXG4gICAgICpcbiAgICAgKi9cbiAgICBpbml0WW91dHViZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFNlZSBpZiBZVCB2YXJpYWJsZSBleGlzdHNcbiAgICAgICAgaWYgKHR5cGVvZihZVCkgPT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mKFlULlBsYXllcikgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFNldHVwIEFQSSByZWFkeSBmdW5jdGlvblxuICAgICAgICAgICAgd2luZG93Lm9uWW91VHViZVBsYXllckFQSVJlYWR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgWW91dHViZUhhbmRsZXIubG9hZFBsYXllcnMoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBMb2FkIGV4dGVybmFsIHNjcmlwdFxuICAgICAgICAgICAgZ2V0U2NyaXB0KCdodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpJyk7XG4gICAgICAgICAgICAvLyBJZiBZVCBhbHJlYWR5IGV4aXN0cyBsb2FkIHBsYXllclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgWW91dHViZUhhbmRsZXIubG9hZFBsYXllcnMoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdGhlIFlvdXR1YmUgcGxheWVyKHMpIHdpdGggcGFyYW1ldGVyc1xuICAgICAqIEFuZCByZXdyaXRlIHRoZSBwbGF5ZXJzIHRvIGtleSB0aGVtIGJ5IHRoZSBlbGVtZW50IGlkXG4gICAgICpcbiAgICAgKi9cbiAgICBsb2FkUGxheWVyczogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgbGV0IHBsYXllcnMgPSBbXTtcblxuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyc0Ftb3VudCA9IFlvdXR1YmVIYW5kbGVyLnBsYXllcnMubGVuZ3RoO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgeW91dHViZVBsYXllcnNBbW91bnQ7IGkrKyl7XG5cbiAgICAgICAgICAgIGxldCB5b3V0dWJlUGxheWVyID0gWW91dHViZUhhbmRsZXIucGxheWVyc1tpXTtcblxuICAgICAgICAgICAgLy8gTG9hZCBwbGF5ZXJcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5ZXIucGxheWVyID0gbmV3IFlULlBsYXllcih5b3V0dWJlUGxheWVyLmlkLHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwMCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgIHZpZGVvSWQ6IHlvdXR1YmVQbGF5ZXIubGluayxcbiAgICAgICAgICAgICAgICBob3N0OiAnaHR0cHM6Ly93d3cueW91dHViZS1ub2Nvb2tpZS5jb20nLFxuICAgICAgICAgICAgICAgIHBsYXllclZhcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZXN0YnJhbmRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlbDogMCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWtiOiAxLFxuICAgICAgICAgICAgICAgICAgICBhdXRvcGxheTogeW91dHViZVBsYXllci5hdXRvUGxheVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICdvblJlYWR5JzogWW91dHViZUhhbmRsZXIub25SZWFkeSxcbiAgICAgICAgICAgICAgICAgICAgJ29uU3RhdGVDaGFuZ2UnOiBZb3V0dWJlSGFuZGxlci5vblN0YXRlQ2hhbmdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBsYXllcnNbeW91dHViZVBsYXllci5pZF0gPSB5b3V0dWJlUGxheWVyO1xuXG4gICAgICAgIH1cblxuICAgICAgICBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzID0gcGxheWVycztcblxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHBsYXllciBpcyByZWFkeSB0byBwbGF5XG4gICAgICovXG4gICAgb25SZWFkeSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVySWQgPSBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW3BsYXllckNvbnRhaW5lcklkXS5wbGF5ZXI7XG5cbiAgICAgICAgLy8gU2hvdyB2aWRlb1xuICAgICAgICAvLyBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ICQoJyMnICsgcGxheWVyQ29udGFpbmVySWQpLnN0b3AoKS5hbmltYXRlKHsgb3BhY2l0eTogMSB9LDEwMDApIH0sODAwKTtcblxuICAgICAgICAvLyBJZiBub3Qgb24gdGFibGV0IG9yIG1vYmlsZSwgcGxheSBvbiBoaWdoIHF1YWxpdHlcbiAgICAgICAgLy8gcGxheWVyLm11dGUoKTtcbiAgICAgICAgLy8gcGxheWVyLnBsYXlWaWRlbygpO1xuICAgICAgICAvLyBwbGF5ZXIuc2V0UGxheWJhY2tRdWFsaXR5KCdoZDEwODAnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIFlvdXR1YmUgc3RhdGUgY2hhbmdlXG4gICAgICovXG4gICAgb25TdGF0ZUNoYW5nZSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgcGxheWVyQ29udGFpbmVySWQgPSBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzW3BsYXllckNvbnRhaW5lcklkXS5wbGF5ZXI7XG5cbiAgICAgICAgY29uc3QgdmlkZW9TdGF0ZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgLy8gTG9vcCB2aWRlb1xuICAgICAgICBpZiAoZXZlbnQuZGF0YSA9PT0gWVQuUGxheWVyU3RhdGUuRU5ERUQgKSB7XG4gICAgICAgICAgICBwbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5Zb3V0dWJlSGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIEJyb3dzZXIgSGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IEJyb3dzZXJIYW5kbGVyID0ge1xuXG4gICAgdXNlckFnZW50OiAnJyxcbiAgICBicm93c2VySW5mbzogJycsXG5cblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIudXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICAgIEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvID0gQnJvd3NlckhhbmRsZXIuZ2V0QnJvd3NlckluZm8oKTtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuaGFuZGxlSUUoKTtcbiAgICAgICAgQnJvd3NlckhhbmRsZXIuaGFuZGxlU2FmYXJpKCk7XG4gICAgfSxcblxuICAgIGhhbmRsZUlFOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gRGV0ZWN0IHZlcnNpb25zIGJlbG93IGllMTFcbiAgICAgICAgbGV0IG1zaWUgPSBCcm93c2VySGFuZGxlci51c2VyQWdlbnQuaW5kZXhPZignTVNJRSAnKTtcbiAgICAgICAgY29uc3QgaWVsdDExID0gbXNpZSA+IDA7XG5cbiAgICAgICAgLy8gRGV0ZWN0IGllMTFcbiAgICAgICAgY29uc3QgaWUxMSA9ICEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVHJpZGVudC4qcnZcXDoxMVxcLi8pO1xuXG4gICAgICAgIC8vIElmIEludGVybmV0IEV4cGxvcmVyXG4gICAgICAgIGlmIChpZWx0MTEgfHwgaWUxMSkge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCB2ZXJzaW9uXG4gICAgICAgICAgICBsZXQgdmVyc2lvbiA9ICcxMSc7XG5cbiAgICAgICAgICAgIC8vIFdheSB0byBkZXRlY3QgdmVyc2lvbiA8IDExXG4gICAgICAgICAgICBpZiAoaWVsdDExKSB2ZXJzaW9uID0gcGFyc2VJbnQoQnJvd3NlckhhbmRsZXIudXNlckFnZW50LnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICBtc2llICsgNSxcbiAgICAgICAgICAgICAgICBCcm93c2VySGFuZGxlci51c2VyQWdlbnQuaW5kZXhPZihcIi5cIiwgbXNpZSlcbiAgICAgICAgICAgICkpO1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgY2xhc3NlcyB0byBIVE1MICh3ZSBoYXZlIHRvIGRvIHRoaXMgc2VwYXJhdGVseSBiZWNhdXNlIGVsc2UgaWUgd2lsbCBmYWlsKVxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdpZScpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd2Jyt2ZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBzYWZhcmkgdmVyc2lvblxuICAgIGhhbmRsZVNhZmFyaTogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGlmKEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvLm5hbWUgPT09ICdTYWZhcmknICYmIEJyb3dzZXJIYW5kbGVyLmJyb3dzZXJJbmZvLnZlcnNpb24gPD0gMTApe1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5jbGFzc0xpc3QuYWRkKCdpZScpO1xuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgZ2V0QnJvd3NlckluZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IHVhPW5hdmlnYXRvci51c2VyQWdlbnQsdGVtLE09dWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XFwvKSlcXC8/XFxzKihcXGQrKS9pKSB8fCBbXTtcbiAgICAgICAgaWYoL3RyaWRlbnQvaS50ZXN0KE1bMV0pKXtcbiAgICAgICAgICAgIHRlbT0vXFxicnZbIDpdKyhcXGQrKS9nLmV4ZWModWEpIHx8IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHtuYW1lOidJRSAnLHZlcnNpb246KHRlbVsxXXx8JycpfTtcbiAgICAgICAgfVxuICAgICAgICBpZihNWzFdPT09J0Nocm9tZScpe1xuICAgICAgICAgICAgdGVtPXVhLm1hdGNoKC9cXGJPUFJcXC8oXFxkKykvKVxuICAgICAgICAgICAgaWYodGVtIT1udWxsKSAgIHtyZXR1cm4ge25hbWU6J09wZXJhJywgdmVyc2lvbjp0ZW1bMV19O31cbiAgICAgICAgfVxuICAgICAgICBNPU1bMl0/IFtNWzFdLCBNWzJdXTogW25hdmlnYXRvci5hcHBOYW1lLCBuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgJy0/J107XG4gICAgICAgIGlmKCh0ZW09dWEubWF0Y2goL3ZlcnNpb25cXC8oXFxkKykvaSkpIT1udWxsKSB7TS5zcGxpY2UoMSwxLHRlbVsxXSk7fVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogTVswXSxcbiAgICAgICAgICAgIHZlcnNpb246IE1bMV1cbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5Ccm93c2VySGFuZGxlci5pbml0KCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBIZWxwZXIgZnVuY3Rpb25zXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLypcbiAqIFNpbXBsZSBpc3NldCBtZXRob2QgZm9yIHRoaXMgZG9lcyBub3QgZXhpc3QgaW4gamF2YXNjcmlwdFxuICovXG53aW5kb3cuaXNzZXQgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogIT09ICd1bmRlZmluZWQnICYmIG9iaiAhPT0gbnVsbDtcbn07XG5cbi8qXG4gKiBFYXNpbmcgRnVuY3Rpb25zIC0gaW5zcGlyZWQgZnJvbSBodHRwOi8vZ2l6bWEuY29tL2Vhc2luZy9cbiAqIG9ubHkgY29uc2lkZXJpbmcgdGhlIHQgdmFsdWUgZm9yIHRoZSByYW5nZSBbMCwgMV0gPT4gWzAsIDFdXG4gKi9cbndpbmRvdy5FYXNpbmdGdW5jdGlvbnMgPSB7XG4gICAgLy8gbm8gZWFzaW5nLCBubyBhY2NlbGVyYXRpb25cbiAgICBsaW5lYXI6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpbmcgZnJvbSB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZUluUXVhZDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRRdWFkOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqICgyIC0gdClcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGlvbiB1bnRpbCBoYWxmd2F5LCB0aGVuIGRlY2VsZXJhdGlvblxuICAgIGVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyAyICogdCAqIHQgOiAtMSArICg0IC0gMiAqIHQpICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJbkN1YmljOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRDdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuICgtLXQpICogdCAqIHQgKyAxXG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDQgKiB0ICogdCAqIHQgOiAodCAtIDEpICogKDIgKiB0IC0gMikgKiAoMiAqIHQgLSAyKSArIDFcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGluZyBmcm9tIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlSW5RdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1YXJ0OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gMSAtICgtLXQpICogdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRRdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPCAuNSA/IDggKiB0ICogdCAqIHQgKiB0IDogMSAtIDggKiAoLS10KSAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJblF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCAqIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGRlY2VsZXJhdGluZyB0byB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZU91dFF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gMSArICgtLXQpICogdCAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW9uIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0aW9uXG4gICAgZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyAxNiAqIHQgKiB0ICogdCAqIHQgKiB0IDogMSArIDE2ICogKC0tdCkgKiB0ICogdCAqIHQgKiB0XG4gICAgfVxufTtcblxuLypcbiAqIFZhbmlsbGEgdmVyc2lvbiBvZiB0aGUgJC5nZXRTY3JpcHRcbiAqL1xud2luZG93LmdldFNjcmlwdCA9IGZ1bmN0aW9uIChzb3VyY2UsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC5hc3luYyA9IDE7XG5cbiAgICB3aW5kb3cuc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcbiAgICBsZXQgcHJpb3IgPSBzY3JpcHRzW3NjcmlwdHMubGVuZ3RoIC0gMV07XG5cbiAgICBzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIChfLCBpc0Fib3J0KSB7XG4gICAgICAgIGlmIChpc0Fib3J0IHx8ICFzY3JpcHQucmVhZHlTdGF0ZSB8fCAvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KHNjcmlwdC5yZWFkeVN0YXRlKSkge1xuICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgc2NyaXB0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBpZiAoIWlzQWJvcnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgc2NyaXB0LnNyYyA9IHNvdXJjZTtcbiAgICBwcmlvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHQsIHByaW9yKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uLCB0aGF0LCBhcyBsb25nIGFzIGl0IGNvbnRpbnVlcyB0byBiZSBpbnZva2VkLCB3aWxsIG5vdFxuICogYmUgdHJpZ2dlcmVkLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvclxuICogTiBtaWxsaXNlY29uZHMuIElmIGBpbW1lZGlhdGVgIGlzIHBhc3NlZCwgdHJpZ2dlciB0aGUgZnVuY3Rpb24gb24gdGhlXG4gKiBsZWFkaW5nIGVkZ2UsIGluc3RlYWQgb2YgdGhlIHRyYWlsaW5nLlxuICogQHBhcmFtIGZ1bmNcbiAqIEBwYXJhbSB3YWl0XG4gKiBAcGFyYW0gaW1tZWRpYXRlXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbndpbmRvdy5kZWJvdW5jZSA9IGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkge1xuICAgIGxldCB0aW1lb3V0O1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgbGV0IGxhdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoIWltbWVkaWF0ZSkgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdykgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9O1xufTtcblxuLypcbiAqIENvb2tpZSBoZWxwZXIgY2xhc3NcbiAqL1xud2luZG93LkNvb2tpZSA9IHtcbiAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgZGF5cykge1xuICAgICAgICBsZXQgZG9tYWluLCBkb21haW5QYXJ0cywgZGF0ZSwgZXhwaXJlcywgaG9zdDtcblxuICAgICAgICBpZiAoZGF5cykge1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAoZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApKTtcbiAgICAgICAgICAgIGV4cGlyZXMgPSBcIjsgZXhwaXJlcz1cIiArIGRhdGUudG9HTVRTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGV4cGlyZXMgPSBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaG9zdCA9IGxvY2F0aW9uLmhvc3Q7XG4gICAgICAgIGlmIChpc0lQT3JMb2NhbEhvc3QobG9jYXRpb24uaG9zdG5hbWUpKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgXCI9XCIgKyB2YWx1ZSArIGV4cGlyZXMgKyBcIjsgcGF0aD0vXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY29va2llIG9uIGFsbCBzdWIgZG9tYWlucy5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBTdGFydCB3aXRoIHRyeWluZyB0byBzZXQgY29va2llIHRvIHRoZSB0b3AgZG9tYWluLlxuICAgICAgICAgICAgLy8gKGV4YW1wbGU6IGlmIHVzZXIgaXMgb24gZm9vLmNvbSwgdHJ5IHRvIHNldFxuICAgICAgICAgICAgLy8gIGNvb2tpZSB0byBkb21haW4gXCIuY29tXCIpXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNvb2tpZSB3aWxsIG5vdCBiZSBzZXQsIGl0IG1lYW5zIFwiLmNvbVwiXG4gICAgICAgICAgICAvLyBpcyBhIHRvcCBsZXZlbCBkb21haW4gYW5kIHdlIG5lZWQgdG9cbiAgICAgICAgICAgIC8vIHNldCB0aGUgY29va2llIHRvIFwiLmZvby5jb21cIlxuICAgICAgICAgICAgZG9tYWluUGFydHMgPSBob3N0LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBkb21haW5QYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgZG9tYWluID0gJy4nICsgZG9tYWluUGFydHMuam9pbignLicpO1xuXG4gICAgICAgICAgICAvLyBGb3IgZGV2ZWxvcG1lbnQgcHVycG9zZSwgcmVtb3ZlIHRoaXMgd2hlbiBtb3ZpbmcgdG8gcHJvZHVjdGlvblxuICAgICAgICAgICAgLy8gZG9tYWluID0gJy5rb21tYS5wcm8nO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBuYW1lICsgXCI9XCIgKyB2YWx1ZSArIGV4cGlyZXMgKyBcIjsgcGF0aD0vOyBkb21haW49XCIgKyBkb21haW47XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGNvb2tpZSB3YXMgc3VjY2Vzc2Z1bHkgc2V0IHRvIHRoZSBnaXZlbiBkb21haW5cbiAgICAgICAgICAgIC8vIChvdGhlcndpc2UgaXQgd2FzIGEgVG9wLUxldmVsIERvbWFpbilcbiAgICAgICAgICAgIGlmIChDb29raWUuZ2V0KG5hbWUpID09IG51bGwgfHwgQ29va2llLmdldChuYW1lKSAhPSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBcIi5cIiB0byBjdXJyZW50IGRvbWFpblxuICAgICAgICAgICAgICAgIGRvbWFpbiA9ICcuJyArIGhvc3Q7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gbmFtZSArIFwiPVwiICsgdmFsdWUgKyBleHBpcmVzICsgXCI7IHBhdGg9LzsgZG9tYWluPVwiICsgZG9tYWluO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgd2luZG93Lm5hbWVFUSA9IG5hbWUgKyBcIj1cIjtcbiAgICAgICAgd2luZG93LmNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2EubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjID0gY2FbaV07XG4gICAgICAgICAgICB3aGlsZSAoYy5jaGFyQXQoMCkgPT09ICcgJykge1xuICAgICAgICAgICAgICAgIGMgPSBjLnN1YnN0cmluZygxLCBjLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgZXJhc2U6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIENvb2tpZS5zZXQobmFtZSwgJycsIC0xKTtcbiAgICB9LFxuXG5cbn07XG5cbndpbmRvdy5pc0lQT3JMb2NhbEhvc3QgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiAoXG4gICAgICAgIGlzSXBBZGRyZXNzKHZhbHVlKSB8fFxuICAgICAgICAodmFsdWUgPT09ICdsb2NhbGhvc3QnKVxuICAgIClcbn07XG5cbndpbmRvdy5pc0lwQWRkcmVzcyA9IGZ1bmN0aW9uIChpcGFkZHJlc3MpIHtcbiAgICByZXR1cm4gKC9eKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPykkLy50ZXN0KGlwYWRkcmVzcykpXG59O1xuXG4vKlxuICogSmF2YXNjcmlwdCB2ZXJzaW9uIG9mIHRoZSBudW1iZXJfZm9ybWF0IG1ldGhvZCBvZiBQSFBcbiAqL1xud2luZG93Lm51bWJlcl9mb3JtYXQgPSBmdW5jdGlvbiAobnVtYmVyLCBkZWNpbWFscywgZGVjX3BvaW50LCB0aG91c2FuZHNfc2VwKSB7XG4gICAgLy8gU3RyaXAgYWxsIGNoYXJhY3RlcnMgYnV0IG51bWVyaWNhbCBvbmVzLlxuICAgIG51bWJlciA9IChudW1iZXIgKyAnJykucmVwbGFjZSgvW14wLTkrXFwtRWUuXS9nLCAnJyk7XG4gICAgbGV0IG4gPSAhaXNGaW5pdGUoK251bWJlcikgPyAwIDogK251bWJlcixcbiAgICAgICAgcHJlYyA9ICFpc0Zpbml0ZSgrZGVjaW1hbHMpID8gMCA6IE1hdGguYWJzKGRlY2ltYWxzKSxcbiAgICAgICAgc2VwID0gKHR5cGVvZiB0aG91c2FuZHNfc2VwID09PSAndW5kZWZpbmVkJykgPyAnLCcgOiB0aG91c2FuZHNfc2VwLFxuICAgICAgICBkZWMgPSAodHlwZW9mIGRlY19wb2ludCA9PT0gJ3VuZGVmaW5lZCcpID8gJy4nIDogZGVjX3BvaW50LFxuICAgICAgICBzID0gJycsXG4gICAgICAgIHRvRml4ZWRGaXggPSBmdW5jdGlvbiAobiwgcHJlYykge1xuICAgICAgICAgICAgdmFyIGsgPSBNYXRoLnBvdygxMCwgcHJlYyk7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBNYXRoLnJvdW5kKG4gKiBrKSAvIGs7XG4gICAgICAgIH07XG4gICAgLy8gRml4IGZvciBJRSBwYXJzZUZsb2F0KDAuNTUpLnRvRml4ZWQoMCkgPSAwO1xuICAgIHMgPSAocHJlYyA/IHRvRml4ZWRGaXgobiwgcHJlYykgOiAnJyArIE1hdGgucm91bmQobikpLnNwbGl0KCcuJyk7XG4gICAgaWYgKHNbMF0ubGVuZ3RoID4gMykge1xuICAgICAgICBzWzBdID0gc1swXS5yZXBsYWNlKC9cXEIoPz0oPzpcXGR7M30pKyg/IVxcZCkpL2csIHNlcCk7XG4gICAgfVxuICAgIGlmICgoc1sxXSB8fCAnJykubGVuZ3RoIDwgcHJlYykge1xuICAgICAgICBzWzFdID0gc1sxXSB8fCAnJztcbiAgICAgICAgc1sxXSArPSBuZXcgQXJyYXkocHJlYyAtIHNbMV0ubGVuZ3RoICsgMSkuam9pbignMCcpO1xuICAgIH1cbiAgICByZXR1cm4gcy5qb2luKGRlYyk7XG59O1xuXG5cbi8qKlxuICogRWxlbWVudC5jbG9zZXN0KCkgcG9seWZpbGxcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2Nsb3Nlc3QjUG9seWZpbGxcbiAqL1xuaWYgKCFFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0KSB7XG4gICAgaWYgKCFFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKSB7XG4gICAgICAgIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgPSBFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG4gICAgfVxuICAgIEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3QgPSBmdW5jdGlvbiAocykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzO1xuICAgICAgICB2YXIgYW5jZXN0b3IgPSB0aGlzO1xuICAgICAgICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyhlbCkpIHJldHVybiBudWxsO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoYW5jZXN0b3IubWF0Y2hlcyhzKSkgcmV0dXJuIGFuY2VzdG9yO1xuICAgICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChhbmNlc3RvciAhPT0gbnVsbCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG5cbndpbmRvdy5BamF4ID0ge1xuXG4gICAgLy9UT0RPOiBDYW4gd2UgY3JlYXRlIGEgcHJlcGFyZSByZXF1ZXN0IGZ1bmN0aW9uID8/XG5cbiAgICBnZXQ6IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbignZ2V0JywgdXJsLCB0cnVlKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLUNTUkYtVE9LRU4nLCB0b2tlbik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0Jyk7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHhocik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfSxcblxuICAgIHBvc3Q6IGZ1bmN0aW9uKHVybCwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBsZXQgdG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuY29udGVudDtcblxuICAgICAgICB4aHIub3BlbigncG9zdCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1DU1JGLVRPS0VOJywgdG9rZW4pO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh4aHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIuc2VuZCggSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBzdHJpbmdcbiAqIEBwYXJhbSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbndpbmRvdy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn07XG5cbi8qKlxuICogQ29udmVydCBzbmFrZSBjYXNlIGludG8gY2FtZWxjYXNlXG4gKlxuICogQHBhcmFtIHN0cmluZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIHNuYWtlVG9DYW1lbChzdHJpbmcpe1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvKFxcLVxcdykvZywgZnVuY3Rpb24obSl7cmV0dXJuIG1bMV0udG9VcHBlckNhc2UoKTt9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGluZGV4IG9mIGFuIGVsZW1lbnQgaW5zaWRlIGl0cyBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gaW5kZXhJblBhcmVudChub2RlKSB7XG4gICAgd2luZG93LmNoaWxkcmVuID0gbm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXM7XG4gICAgbGV0IG51bSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY2hpbGRyZW5baV0gPT0gbm9kZSkgcmV0dXJuIG51bTtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09IDEpIG51bSsrO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogRm9yIHNlY3VyaXR5IHJlYXNvbnMgaU9TIFNhZmFyaSBvbmx5IGFsbG93cyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpIGZvciB0ZXh0IHdpdGhpbiBhIGNvbnRlbnRFZGl0YWJsZSBjb250YWluZXIuXG4gKiBUaGUgd29ya2Fyb3VuZCBpcyB0byBkZXRlY3QgaU9TIFNhZmFyaSBhbmQgcXVpY2tseSB0b2dnbGUgY29udGVudEVkaXRhYmxlIGJlZm9yZSBleGVjdXRpbmcgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKS5cbiAqIFdoZWIgaW5wdXQgb3IgdGV4dGFyZWEgaXMgUkVBRE9OTFkgeW91IGNhbiBwcmV2ZW50IHRoZSB1bndhbnRlZCBwb3B1cCB3aXRoIGNvcHkvcGFzdGUgZnVuY3Rpb25zIGFuZCB0aGUgaW5wdXQga2V5Ym9hcmRcbiAqIENvZGUgZnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2OTgxODQ3XG4gKi9cbmZ1bmN0aW9uIGNvcHlUb0NsaXBib2FyZChlbCkge1xuXG4gICAgLy8gcmVzb2x2ZSB0aGUgZWxlbWVudFxuICAgIGVsID0gKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCkgOiBlbDtcblxuICAgIC8vIGhhbmRsZSBpT1MgYXMgYSBzcGVjaWFsIGNhc2VcbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaXBhZHxpcG9kfGlwaG9uZS9pKSkge1xuXG4gICAgICAgIC8vIHNhdmUgY3VycmVudCBjb250ZW50RWRpdGFibGUvcmVhZE9ubHkgc3RhdHVzXG4gICAgICAgIHdpbmRvdy5lZGl0YWJsZSA9IGVsLmNvbnRlbnRFZGl0YWJsZTtcbiAgICAgICAgd2luZG93LnJlYWRPbmx5ID0gZWwucmVhZE9ubHk7XG5cbiAgICAgICAgLy8gY29udmVydCB0byBlZGl0YWJsZSB3aXRoIHJlYWRvbmx5IHRvIHN0b3AgaU9TIGtleWJvYXJkIG9wZW5pbmdcbiAgICAgICAgZWwuY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgZWwucmVhZE9ubHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBhIHNlbGVjdGFibGUgcmFuZ2VcbiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcblxuICAgICAgICAvLyBzZWxlY3QgdGhlIHJhbmdlXG4gICAgICAgIHdpbmRvdy5zZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgOTk5OTk5KTtcblxuICAgICAgICAvLyByZXN0b3JlIGNvbnRlbnRFZGl0YWJsZS9yZWFkT25seSB0byBvcmlnaW5hbCBzdGF0ZVxuICAgICAgICBlbC5jb250ZW50RWRpdGFibGUgPSBlZGl0YWJsZTtcbiAgICAgICAgZWwucmVhZE9ubHkgPSByZWFkT25seTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsLnNlbGVjdCgpO1xuICAgIH1cblxuICAgIC8vIGV4ZWN1dGUgY29weSBjb21tYW5kXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbn0iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgU2Nyb2xsIGhhbmRsZXJcbiAgIC0gSGFuZGxlciB0aGUgb2JqZWN0cyB3aGljaCBhcmUgYmluZCBvbiBzY3JvbGwgZXZlbnRzIG9yIHZpc2libGUgaW4gdmlld3BvcnRcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBTY3JvbGxIYW5kbGVyID0ge1xuXG4gICAgLy8gVmFyaWFibGVzIGZvciBkZWJvdW5jZSBhbmQgdGhyb3R0bGUgZWZmZWN0c1xuICAgIHRpbWU6IERhdGUubm93KCksXG4gICAgdGltZW91dDogbnVsbCxcbiAgICB3YWl0VGhyb3R0bGU6IDEwMDAsXG4gICAgd2FpdERlYm91bmNlOiAzMDAsXG5cbiAgICAvLyBWYXJpYWJsZXMgZm9yIHNjcm9sbCBkaXJlY3Rpb25cbiAgICBsYXN0U2Nyb2xsVG9wUG9zaXRpb246IDAsXG4gICAgc2Nyb2xsRGlyZWN0aW9uRG93bjogdHJ1ZSxcbiAgICBzY3JvbGxEaXJlY3Rpb25VcDogZmFsc2UsXG5cbiAgICAvL0luaXRpYWxpc2F0aW9uXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIFRyaWdnZXIgc3RhcnQgb24gc3RhcnQgdXBcbiAgICAgICAgU2Nyb2xsSGFuZGxlci50cmlnZ2VyT25Jbml0KCk7XG5cbiAgICAgICAgLy8gVGhyb3R0bGUgc2Nyb2xsXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoKFNjcm9sbEhhbmRsZXIudGltZSArIFNjcm9sbEhhbmRsZXIud2FpdFRocm90dGxlIC0gRGF0ZS5ub3coKSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgU2Nyb2xsSGFuZGxlci50cmlnZ2VyVGhyb3R0bGUoKTtcbiAgICAgICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTbW9vdGggc2Nyb2xsXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnRyaWdnZXJTbW9vdGgoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGVib3VuY2Ugc2Nyb2xsXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZihpc3NldChTY3JvbGxIYW5kbGVyLnRpbWVvdXQpKSBjbGVhclRpbWVvdXQoU2Nyb2xsSGFuZGxlci50aW1lb3V0KTtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIudGltZW91dCA9IHNldFRpbWVvdXQoU2Nyb2xsSGFuZGxlci50cmlnZ2VyRGVib3VuY2UsIFNjcm9sbEhhbmRsZXIud2FpdERlYm91bmNlKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFRyaWdnZXIgb24gc3RhcnQgdXBcbiAgICB0cmlnZ2VyT25Jbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFNjcm9sbEhhbmRsZXIudHJpZ2dlckVsZW1lbnRJblZpZXdwb3J0QW5pbWF0aW9uKCk7XG4gICAgfSxcblxuICAgIC8vIFRyaWdnZXIgc2Nyb2xsIGZ1bmN0aW9ucyB3aXRoIHRocm90dGxlIChwcmVmZXJyZWQpXG4gICAgdHJpZ2dlclRocm90dGxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdUaHJvdHRsZWQgc2Nyb2xsJyk7XG4gICAgICAgIFNjcm9sbEhhbmRsZXIudHJpZ2dlckVsZW1lbnRJblZpZXdwb3J0QW5pbWF0aW9uKCk7XG4gICAgfSxcblxuICAgIC8vIFRyaWdnZXIgc2Nyb2xsIG9uIGRlYm91bmNlXG4gICAgdHJpZ2dlckRlYm91bmNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdEZWJvdW5jZSBzY3JvbGwnKTtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBzY3JvbGwgb24gdGhlIGZsaWdodFxuICAgIHRyaWdnZXJTbW9vdGg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1Ntb290aCBzY3JvbGwnKTtcbiAgICAgICAgU2Nyb2xsSGFuZGxlci5kZXRlY3RTY3JvbGxEaXJlY3Rpb24oKTtcbiAgICAgICAgU2Nyb2xsSGFuZGxlci50b2dnbGVTdGlja3lIZWFkZXIoKTtcbiAgICB9LFxuXG4gICAgLy8gRGV0ZWN0IGlmIHBhcnQgb2YgYSBnaXZlbiBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIHZpZXdwb3J0XG4gICAgLy8gRWwgbXVzdCBiZSBhIG5vZGUgZWxlbWVudFxuICAgIGRldGVjdElmRWxlbWVudElzUGFydGx5SW5WaWV3cG9ydDogZnVuY3Rpb24oZWwpXG4gICAge1xuICAgICAgICBpZihpc3NldChlbCkpe1xuXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAvLyBET01SZWN0IHsgeDogOCwgeTogOCwgd2lkdGg6IDEwMCwgaGVpZ2h0OiAxMDAsIHRvcDogOCwgcmlnaHQ6IDEwOCwgYm90dG9tOiAxMDgsIGxlZnQ6IDggfVxuICAgICAgICAgICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd1dpZHRoID0gKHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsSW5WaWV3ID0gKHJlY3QudG9wIDw9ICh3aW5kb3dIZWlnaHQpKSAmJiAoKHJlY3QudG9wICsgcmVjdC5oZWlnaHQpID49IDApO1xuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbEluVmlldyA9IChyZWN0LmxlZnQgPD0gd2luZG93V2lkdGgpICYmICgocmVjdC5sZWZ0ICsgcmVjdC53aWR0aCkgPj0gMCk7XG5cbiAgICAgICAgICAgIHJldHVybiAodmVydGljYWxJblZpZXcgJiYgaG9yaXpvbnRhbEluVmlldyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gRGV0ZWN0IGlmIGEgZ2l2ZW4gZWxlbWVudCBpcyBmdWxseSB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydFxuICAgIC8vIEVsIG11c3QgYmUgYSBub2RlIGVsZW1lbnRcbiAgICBkZXRlY3RJZkVsZW1lbnRJc0Z1bGx5SW5WaWV3cG9ydDogZnVuY3Rpb24oZWwpXG4gICAge1xuICAgICAgICBpZihpc3NldChlbCkpe1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHJlY3QudG9wID49IDAgJiZcbiAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSA8PSB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGV0ZWN0U2Nyb2xsRGlyZWN0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcFBvc2l0aW9uID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7IC8vIENyZWRpdHM6IFwiaHR0cHM6Ly9naXRodWIuY29tL3FlcmVteS9zby9ibG9iL21hc3Rlci9zby5kb20uanMjTDQyNlwiXG4gICAgICAgIGlmIChzY3JvbGxUb3BQb3NpdGlvbiA+PSBTY3JvbGxIYW5kbGVyLmxhc3RTY3JvbGxUb3BQb3NpdGlvbil7XG4gICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnNjcm9sbERpcmVjdGlvbkRvd24gPSB0cnVlO1xuICAgICAgICAgICAgU2Nyb2xsSGFuZGxlci5zY3JvbGxEaXJlY3Rpb25VcCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2Nyb2xsSGFuZGxlci5zY3JvbGxEaXJlY3Rpb25Eb3duID0gZmFsc2U7XG4gICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnNjcm9sbERpcmVjdGlvblVwID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBTY3JvbGxIYW5kbGVyLmxhc3RTY3JvbGxUb3BQb3NpdGlvbiA9IHNjcm9sbFRvcFBvc2l0aW9uO1xuICAgIH0sXG5cbiAgICAvLyBUcmlnZ2VyIGFuaW1hdGlvbiBvbiBlbGVtZW50cyB0aGF0IGhhdmUgJ2VsZW1lbnQtaW4tdmlld3BvcnQnIGFuZCB0aGF0IGFyZSBpbiB0aGUgdmlld3BvcnRcbiAgICAvLyBUaGVzZSBhbmltYXRpb24gY2FuIG9ubHkgYmUgdHJpZ2dlcmVkIG9uY2UsIGlmIHlvdSB3YW50IG1vcmUgdGhlbiB0aGF0IHlvdSBzaG91bGQgd3JpdGUgYW4gc3BlY2lmaWMgZnVuY3Rpb24gZm9yIHRoaXNcbiAgICB0cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZWxlbWVudC1pbi12aWV3cG9ydCcpO1xuICAgICAgICBjb25zdCBlbGVtZW50c0xlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGUgPSAwOyBlIDwgZWxlbWVudHNMZW5ndGg7IGUrKyl7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tlXTtcbiAgICAgICAgICAgIGlmKFNjcm9sbEhhbmRsZXIuZGV0ZWN0SWZFbGVtZW50SXNQYXJ0bHlJblZpZXdwb3J0KGVsZW1lbnQpKXtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2VsZW1lbnQtaW4tdmlld3BvcnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDVVNUT00gU0NST0xMIEhBTkRMRVJTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLy8gSGlkZSBvciBzaG93IHN0aWNreSBuYXZpZ2F0aW9uIHdoZW4gaGVhZGVyIGlzbid0IHZpc2libGVcbiAgICB0b2dnbGVTdGlja3lIZWFkZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc3RpY2t5SGVhZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLXN0aWNreS1oZWFkZXInKTtcbiAgICAgICAgY29uc3QgdmlzaWJsZVN0aWNreUhlYWRlckNsYXNzID0gJ2lzLXN0aWNreS1oZWFkZXItdmlzaWJsZSc7XG4gICAgICAgIGNvbnN0IHN1Ym5hdkxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtc3VibmF2Jyk7XG4gICAgICAgIHZhciBzdWJOYXZJc1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgaWYoc3RpY2t5SGVhZGVyKSBzdGlja3lIZWFkZXIuaGlkZGVuID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJuYXZMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUoc3VibmF2TGlzdFtpXSwgbnVsbCkudmlzaWJpbGl0eSA9PSBcInZpc2libGVcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJOYXZJc1Zpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoaXNzZXQoc3RpY2t5SGVhZGVyKSAmJiAhc3ViTmF2SXNWaXNpYmxlKXtcbiAgICAgICAgICAgIC8vIEhpZGUgd2hlbiBzY3JvbGxpbmcgRE9XTiAoT1Igd2l0aGluIG9mZnNldClcbiAgICAgICAgICAgIGlmKFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uRG93biB8fCBTY3JvbGxIYW5kbGVyLmxhc3RTY3JvbGxUb3BQb3NpdGlvbiA8IDExMCl7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKHZpc2libGVTdGlja3lIZWFkZXJDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTaG93IHdoZW4gc2Nyb2xsaW5nIFVQIGFuZCBvdXRzaWRlIG9mIG9mZnNldFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKHZpc2libGVTdGlja3lIZWFkZXJDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG59O1xuXG5TY3JvbGxIYW5kbGVyLmluaXQoKTsiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpbiJdLCJzb3VyY2VSb290IjoiIn0=