UNPKG

adal-angular4

Version:
251 lines 33 kB
import { __decorate } from "tslib"; // tslint:disable-next-line: no-reference /// <reference path="adal-angular.d.ts" /> import { Injectable, NgZone } from '@angular/core'; import { bindCallback, timer } from 'rxjs'; import { map } from 'rxjs/operators'; import * as lib from 'adal-angular'; import * as i0 from "@angular/core"; var AdalService = /** @class */ (function () { function AdalService(ngZone) { this.ngZone = ngZone; this.context = null; this.loginRefreshTimer = null; this.user = { authenticated: false, userName: '', error: '', token: '', profile: {}, loginCached: false }; } AdalService.prototype.init = function (configOptions) { if (!configOptions) { throw new Error('You must set config, when calling init.'); } // redirect and logout_redirect are set to current location by default var existingHash = window.location.hash; var pathDefault = window.location.href; if (existingHash) { pathDefault = pathDefault.replace(existingHash, ''); } configOptions.redirectUri = configOptions.redirectUri || pathDefault; configOptions.postLogoutRedirectUri = configOptions.postLogoutRedirectUri || pathDefault; // create instance with given config this.context = lib.inject(configOptions); this.updateDataFromCache(); if (this.user.loginCached && !this.user.authenticated && window.self === window.top && !this.isInCallbackRedirectMode) { this.refreshLoginToken(); } else if (this.user.loginCached && this.user.authenticated && !this.loginRefreshTimer && window.self === window.top) { this.setupLoginTokenRefreshTimer(); } }; Object.defineProperty(AdalService.prototype, "config", { get: function () { return this.context.config; }, enumerable: true, configurable: true }); Object.defineProperty(AdalService.prototype, "userInfo", { get: function () { return this.user; }, enumerable: true, configurable: true }); AdalService.prototype.login = function () { this.context.login(); }; AdalService.prototype.loginInProgress = function () { return this.context.loginInProgress(); }; AdalService.prototype.logOut = function () { this.context.logOut(); }; AdalService.prototype.handleWindowCallback = function (removeHash) { if (removeHash === void 0) { removeHash = true; } var hash = window.location.hash; if (this.context.isCallback(hash)) { var isPopup = false; if (this.context._openedWindows.length > 0 && this.context._openedWindows[this.context._openedWindows.length - 1].opener && this.context._openedWindows[this.context._openedWindows.length - 1].opener._adalInstance) { this.context = this.context._openedWindows[this.context._openedWindows.length - 1].opener._adalInstance; isPopup = true; } else if (window.parent && window.parent._adalInstance) { this.context = window.parent._adalInstance; } var requestInfo = this.context.getRequestInfo(hash); this.context.saveTokenFromHash(requestInfo); var callback = this.context._callBackMappedToRenewStates[requestInfo.stateResponse] || this.context.callback; if (requestInfo.requestType === this.context.REQUEST_TYPE.LOGIN) { this.updateDataFromCache(); this.setupLoginTokenRefreshTimer(); } if (requestInfo.stateMatch) { if (typeof callback === 'function') { if (requestInfo.requestType === this.context.REQUEST_TYPE.RENEW_TOKEN) { // Idtoken or Accestoken can be renewed if (requestInfo.parameters.access_token) { callback(this.context._getItem(this.context.CONSTANTS.STORAGE.ERROR_DESCRIPTION), requestInfo.parameters.access_token); } else if (requestInfo.parameters.id_token) { callback(this.context._getItem(this.context.CONSTANTS.STORAGE.ERROR_DESCRIPTION), requestInfo.parameters.id_token); } else if (requestInfo.parameters.error) { callback(this.context._getItem(this.context.CONSTANTS.STORAGE.ERROR_DESCRIPTION), null); this.context._renewFailed = true; } } } } } // Remove hash from url if (removeHash) { if (window.location.hash) { if (window.history.replaceState) { window.history.replaceState('', '/', window.location.pathname); } else { window.location.hash = ''; } } } }; AdalService.prototype.getCachedToken = function (resource) { return this.context.getCachedToken(resource); }; AdalService.prototype.acquireToken = function (resource) { var _this = this; return bindCallback(function (callback) { _this.context.acquireToken(resource, function (error, tokenOut) { if (error) { _this.context.error('Error when acquiring token for resource: ' + resource, error); callback(null, error); } else { callback(tokenOut, null); } }); })() .pipe(map(function (result) { if (!result[0] && result[1]) { throw (result[1]); } return result[0]; })); }; AdalService.prototype.getUser = function () { var _this = this; return bindCallback(function (callback) { _this.context.getUser(function (error, user) { if (error) { _this.context.error('Error when getting user', error); callback(null); } else { callback(user || null); } }); })(); }; AdalService.prototype.clearCache = function () { this.context.clearCache(); }; AdalService.prototype.clearCacheForResource = function (resource) { this.context.clearCacheForResource(resource); }; AdalService.prototype.info = function (message) { this.context.info(message); }; AdalService.prototype.verbose = function (message) { this.context.verbose(message); }; AdalService.prototype.getResourceForEndpoint = function (url) { return this.context.getResourceForEndpoint(url); }; AdalService.prototype.refreshDataFromCache = function () { this.updateDataFromCache(); }; AdalService.prototype.updateDataFromCache = function () { var token = this.context.getCachedToken(this.context.config.loginResource); this.user.authenticated = token !== null && token.length > 0; var user = this.context.getCachedUser(); if (user) { this.user.userName = user.userName; this.user.profile = user.profile; this.user.token = token; this.user.error = this.context.getLoginError(); this.user.loginCached = true; } else { this.user.userName = ''; this.user.profile = {}; this.user.token = ''; this.user.error = this.context.getLoginError(); this.user.loginCached = false; } }; AdalService.prototype.refreshLoginToken = function () { var _this = this; if (!this.user.loginCached) { throw new Error('User not logged in'); } this.acquireToken(this.context.config.loginResource).subscribe(function (token) { _this.user.token = token; if (_this.user.authenticated === false) { _this.user.authenticated = true; _this.user.error = ''; window.location.reload(); } else { _this.setupLoginTokenRefreshTimer(); } }, function (error) { _this.user.authenticated = false; _this.user.error = _this.context.getLoginError(); }); }; AdalService.prototype.now = function () { return Math.round(new Date().getTime() / 1000.0); }; Object.defineProperty(AdalService.prototype, "isInCallbackRedirectMode", { get: function () { return window.location.href.indexOf('#access_token') !== -1 || window.location.href.indexOf('#id_token') !== -1; }, enumerable: true, configurable: true }); AdalService.prototype.setupLoginTokenRefreshTimer = function () { var _this = this; // Get expiration of login token var exp = this.context._getItem(this.context.CONSTANTS.STORAGE.EXPIRATION_KEY + this.context.config.loginResource); // Either wait until the refresh window is valid or refresh in 1 second (measured in seconds) var timerDelay = exp - this.now() - (this.context.config.expireOffsetSeconds || 300) > 0 ? exp - this.now() - (this.context.config.expireOffsetSeconds || 300) : 1; if (this.loginRefreshTimer) { this.loginRefreshTimer.unsubscribe(); } this.ngZone.runOutsideAngular(function () { _this.loginRefreshTimer = timer(timerDelay * 1000).subscribe(function (x) { _this.refreshLoginToken(); }); }); }; AdalService.ctorParameters = function () { return [ { type: NgZone } ]; }; AdalService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AdalService_Factory() { return new AdalService(i0.ɵɵinject(i0.NgZone)); }, token: AdalService, providedIn: "root" }); AdalService = __decorate([ Injectable({ providedIn: 'root' }) ], AdalService); return AdalService; }()); export { AdalService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWRhbC1hbmd1bGFyNC8iLCJzb3VyY2VzIjpbImxpYi9hZGFsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlDQUF5QztBQUN6QywwQ0FBMEM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDOztBQUtwQztJQWVFLHFCQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQWIxQixZQUFPLEdBQStCLElBQVcsQ0FBQztRQUNsRCxzQkFBaUIsR0FBRyxJQUFXLENBQUM7UUFHaEMsU0FBSSxHQUFjO1lBQ3hCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFFBQVEsRUFBRSxFQUFFO1lBQ1osS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULE9BQU8sRUFBRSxFQUFFO1lBQ1gsV0FBVyxFQUFFLEtBQUs7U0FDbkIsQ0FBQztJQUVvQyxDQUFDO0lBRWhDLDBCQUFJLEdBQVgsVUFBWSxhQUEwQjtRQUNwQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztTQUM1RDtRQUVELHNFQUFzRTtRQUN0RSxJQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUUxQyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QyxJQUFJLFlBQVksRUFBRTtZQUNoQixXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDckQ7UUFFRCxhQUFhLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDO1FBQ3JFLGFBQWEsQ0FBQyxxQkFBcUIsR0FBRyxhQUFhLENBQUMscUJBQXFCLElBQUksV0FBVyxDQUFDO1FBRXpGLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFM0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNySCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ3BILElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1NBQ3BDO0lBRUgsQ0FBQztJQUVELHNCQUFXLCtCQUFNO2FBQWpCO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM3QixDQUFDOzs7T0FBQTtJQUVELHNCQUFXLGlDQUFRO2FBQW5CO1lBQ0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ25CLENBQUM7OztPQUFBO0lBRU0sMkJBQUssR0FBWjtRQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVNLHFDQUFlLEdBQXRCO1FBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFTSw0QkFBTSxHQUFiO1FBQ0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU0sMENBQW9CLEdBQTNCLFVBQTRCLFVBQTBCO1FBQTFCLDJCQUFBLEVBQUEsaUJBQTBCO1FBQ3BELElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDakMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBRXBCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7bUJBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNO21CQUMxRSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtnQkFFN0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDeEcsT0FBTyxHQUFHLElBQUksQ0FBQzthQUVoQjtpQkFDSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7Z0JBRXJELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7YUFDNUM7WUFFRCxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV0RCxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTVDLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBRS9HLElBQUksV0FBVyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7Z0JBQy9ELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQzthQUNwQztZQUVELElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRTtnQkFDMUIsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7b0JBQ2xDLElBQUksV0FBVyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUU7d0JBQ3JFLHVDQUF1Qzt3QkFDdkMsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRTs0QkFDdkMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUM1RSxXQUFXLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO3lCQUMxQzs2QkFBTSxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFOzRCQUMxQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQzVFLFdBQVcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQ3RDOzZCQUFNLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUU7NEJBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzs0QkFDeEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO3lCQUNsQztxQkFDRjtpQkFDRjthQUNGO1NBQ0Y7UUFFRCx1QkFBdUI7UUFDdkIsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO2dCQUN4QixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO29CQUMvQixNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ2hFO3FCQUFNO29CQUNMLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztpQkFDM0I7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVNLG9DQUFjLEdBQXJCLFVBQXNCLFFBQWdCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLGtDQUFZLEdBQW5CLFVBQW9CLFFBQWdCO1FBQXBDLGlCQW9CQztRQW5CQyxPQUFPLFlBQVksQ0FBK0IsVUFBQyxRQUFRO1lBQ3pELEtBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxVQUFDLEtBQWEsRUFBRSxRQUFnQjtnQkFDbEUsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsS0FBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLEdBQUcsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNsRixRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN2QjtxQkFBTTtvQkFDTCxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUMxQjtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQUU7YUFDRCxJQUFJLENBQ0gsR0FBRyxDQUFDLFVBQUMsTUFBTTtZQUNULElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUMzQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbkI7WUFFRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVNLDZCQUFPLEdBQWQ7UUFBQSxpQkFXQztRQVZDLE9BQU8sWUFBWSxDQUFtQixVQUFDLFFBQVE7WUFDN0MsS0FBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBQyxLQUFhLEVBQUUsSUFBZ0I7Z0JBQ25ELElBQUksS0FBSyxFQUFFO29CQUNULEtBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNyRCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2hCO3FCQUFNO29CQUNMLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7aUJBQ3hCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsQ0FBQztJQUVNLGdDQUFVLEdBQWpCO1FBQ0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sMkNBQXFCLEdBQTVCLFVBQTZCLFFBQWdCO1FBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVNLDBCQUFJLEdBQVgsVUFBWSxPQUFlO1FBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTSw2QkFBTyxHQUFkLFVBQWUsT0FBZTtRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU0sNENBQXNCLEdBQTdCLFVBQThCLEdBQVc7UUFDdkMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFHTSwwQ0FBb0IsR0FBM0I7UUFDRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUU3QixDQUFDO0lBRU8seUNBQW1CLEdBQTNCO1FBQ0UsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBb0IsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFN0QsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUUxQyxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7U0FDOUI7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVPLHVDQUFpQixHQUF6QjtRQUFBLGlCQTZCQztRQTNCQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFFMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFvQixDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUMsS0FBYTtZQUVsRixLQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFFeEIsSUFBSSxLQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLEVBQUU7Z0JBRXJDLEtBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFFL0IsS0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUVyQixNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBRTFCO2lCQUFNO2dCQUVMLEtBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2FBQ3BDO1FBQ0gsQ0FBQyxFQUFFLFVBQUMsS0FBYTtZQUVmLEtBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUVoQyxLQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHlCQUFHLEdBQVg7UUFDRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsc0JBQVksaURBQXdCO2FBQXBDO1lBQ0UsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xILENBQUM7OztPQUFBO0lBRU8saURBQTJCLEdBQW5DO1FBQUEsaUJBaUJDO1FBaEJDLGdDQUFnQztRQUNoQyxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQXFCLENBQUMsQ0FBQztRQUU5SCw2RkFBNkY7UUFDN0YsSUFBTSxVQUFVLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLG1CQUFtQixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDeEYsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVFLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQUU7UUFFckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUU1QixLQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQyxDQUFDO2dCQUU1RCxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0JBN1AyQixNQUFNOzs7SUFmdkIsV0FBVztRQUh2QixVQUFVLENBQUM7WUFDVixVQUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDO09BQ1csV0FBVyxDQTZRdkI7c0JBdlJEO0NBdVJDLEFBN1FELElBNlFDO1NBN1FZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXJlZmVyZW5jZVxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cImFkYWwtYW5ndWxhci5kLnRzXCIgLz5cbmltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgYmluZENhbGxiYWNrLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0ICogYXMgbGliIGZyb20gJ2FkYWwtYW5ndWxhcic7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFkYWxTZXJ2aWNlIHtcblxuICBwcml2YXRlIGNvbnRleHQ6IGFkYWwuQXV0aGVudGljYXRpb25Db250ZXh0ID0gbnVsbCBhcyBhbnk7XG4gIHByaXZhdGUgbG9naW5SZWZyZXNoVGltZXIgPSBudWxsIGFzIGFueTtcblxuXG4gIHByaXZhdGUgdXNlcjogYWRhbC5Vc2VyID0ge1xuICAgIGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgIHVzZXJOYW1lOiAnJyxcbiAgICBlcnJvcjogJycsXG4gICAgdG9rZW46ICcnLFxuICAgIHByb2ZpbGU6IHt9LFxuICAgIGxvZ2luQ2FjaGVkOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxuXG4gIHB1YmxpYyBpbml0KGNvbmZpZ09wdGlvbnM6IGFkYWwuQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKCFjb25maWdPcHRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHNldCBjb25maWcsIHdoZW4gY2FsbGluZyBpbml0LicpO1xuICAgIH1cblxuICAgIC8vIHJlZGlyZWN0IGFuZCBsb2dvdXRfcmVkaXJlY3QgYXJlIHNldCB0byBjdXJyZW50IGxvY2F0aW9uIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBleGlzdGluZ0hhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaDtcblxuICAgIGxldCBwYXRoRGVmYXVsdCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIGlmIChleGlzdGluZ0hhc2gpIHtcbiAgICAgIHBhdGhEZWZhdWx0ID0gcGF0aERlZmF1bHQucmVwbGFjZShleGlzdGluZ0hhc2gsICcnKTtcbiAgICB9XG5cbiAgICBjb25maWdPcHRpb25zLnJlZGlyZWN0VXJpID0gY29uZmlnT3B0aW9ucy5yZWRpcmVjdFVyaSB8fCBwYXRoRGVmYXVsdDtcbiAgICBjb25maWdPcHRpb25zLnBvc3RMb2dvdXRSZWRpcmVjdFVyaSA9IGNvbmZpZ09wdGlvbnMucG9zdExvZ291dFJlZGlyZWN0VXJpIHx8IHBhdGhEZWZhdWx0O1xuXG4gICAgLy8gY3JlYXRlIGluc3RhbmNlIHdpdGggZ2l2ZW4gY29uZmlnXG4gICAgdGhpcy5jb250ZXh0ID0gbGliLmluamVjdChjb25maWdPcHRpb25zKTtcblxuICAgIHRoaXMudXBkYXRlRGF0YUZyb21DYWNoZSgpO1xuXG4gICAgaWYgKHRoaXMudXNlci5sb2dpbkNhY2hlZCAmJiAhdGhpcy51c2VyLmF1dGhlbnRpY2F0ZWQgJiYgd2luZG93LnNlbGYgPT09IHdpbmRvdy50b3AgJiYgIXRoaXMuaXNJbkNhbGxiYWNrUmVkaXJlY3RNb2RlKSB7XG4gICAgICB0aGlzLnJlZnJlc2hMb2dpblRva2VuKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnVzZXIubG9naW5DYWNoZWQgJiYgdGhpcy51c2VyLmF1dGhlbnRpY2F0ZWQgJiYgIXRoaXMubG9naW5SZWZyZXNoVGltZXIgJiYgd2luZG93LnNlbGYgPT09IHdpbmRvdy50b3ApIHtcbiAgICAgIHRoaXMuc2V0dXBMb2dpblRva2VuUmVmcmVzaFRpbWVyKCk7XG4gICAgfVxuXG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBhZGFsLkNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25maWc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVzZXJJbmZvKCk6IGFkYWwuVXNlciB7XG4gICAgcmV0dXJuIHRoaXMudXNlcjtcbiAgfVxuXG4gIHB1YmxpYyBsb2dpbigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHQubG9naW4oKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2dpbkluUHJvZ3Jlc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5sb2dpbkluUHJvZ3Jlc3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2dPdXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0LmxvZ091dCgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVdpbmRvd0NhbGxiYWNrKHJlbW92ZUhhc2g6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgY29uc3QgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuICAgIGlmICh0aGlzLmNvbnRleHQuaXNDYWxsYmFjayhoYXNoKSkge1xuICAgICAgbGV0IGlzUG9wdXAgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuY29udGV4dC5fb3BlbmVkV2luZG93cy5sZW5ndGggPiAwXG4gICAgICAgICYmIHRoaXMuY29udGV4dC5fb3BlbmVkV2luZG93c1t0aGlzLmNvbnRleHQuX29wZW5lZFdpbmRvd3MubGVuZ3RoIC0gMV0ub3BlbmVyXG4gICAgICAgICYmIHRoaXMuY29udGV4dC5fb3BlbmVkV2luZG93c1t0aGlzLmNvbnRleHQuX29wZW5lZFdpbmRvd3MubGVuZ3RoIC0gMV0ub3BlbmVyLl9hZGFsSW5zdGFuY2UpIHtcblxuICAgICAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmNvbnRleHQuX29wZW5lZFdpbmRvd3NbdGhpcy5jb250ZXh0Ll9vcGVuZWRXaW5kb3dzLmxlbmd0aCAtIDFdLm9wZW5lci5fYWRhbEluc3RhbmNlO1xuICAgICAgICBpc1BvcHVwID0gdHJ1ZTtcblxuICAgICAgfVxuICAgICAgZWxzZSBpZiAod2luZG93LnBhcmVudCAmJiB3aW5kb3cucGFyZW50Ll9hZGFsSW5zdGFuY2UpIHtcblxuICAgICAgICB0aGlzLmNvbnRleHQgPSB3aW5kb3cucGFyZW50Ll9hZGFsSW5zdGFuY2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RJbmZvID0gdGhpcy5jb250ZXh0LmdldFJlcXVlc3RJbmZvKGhhc2gpO1xuXG4gICAgICB0aGlzLmNvbnRleHQuc2F2ZVRva2VuRnJvbUhhc2gocmVxdWVzdEluZm8pO1xuXG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY29udGV4dC5fY2FsbEJhY2tNYXBwZWRUb1JlbmV3U3RhdGVzW3JlcXVlc3RJbmZvLnN0YXRlUmVzcG9uc2VdIHx8IHRoaXMuY29udGV4dC5jYWxsYmFjaztcblxuICAgICAgaWYgKHJlcXVlc3RJbmZvLnJlcXVlc3RUeXBlID09PSB0aGlzLmNvbnRleHQuUkVRVUVTVF9UWVBFLkxPR0lOKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGF0YUZyb21DYWNoZSgpO1xuICAgICAgICB0aGlzLnNldHVwTG9naW5Ub2tlblJlZnJlc2hUaW1lcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWVzdEluZm8uc3RhdGVNYXRjaCkge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWYgKHJlcXVlc3RJbmZvLnJlcXVlc3RUeXBlID09PSB0aGlzLmNvbnRleHQuUkVRVUVTVF9UWVBFLlJFTkVXX1RPS0VOKSB7XG4gICAgICAgICAgICAvLyBJZHRva2VuIG9yIEFjY2VzdG9rZW4gY2FuIGJlIHJlbmV3ZWRcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0SW5mby5wYXJhbWV0ZXJzLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzLmNvbnRleHQuX2dldEl0ZW0odGhpcy5jb250ZXh0LkNPTlNUQU5UUy5TVE9SQUdFLkVSUk9SX0RFU0NSSVBUSU9OKVxuICAgICAgICAgICAgICAgICwgcmVxdWVzdEluZm8ucGFyYW1ldGVycy5hY2Nlc3NfdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0SW5mby5wYXJhbWV0ZXJzLmlkX3Rva2VuKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMuY29udGV4dC5fZ2V0SXRlbSh0aGlzLmNvbnRleHQuQ09OU1RBTlRTLlNUT1JBR0UuRVJST1JfREVTQ1JJUFRJT04pXG4gICAgICAgICAgICAgICAgLCByZXF1ZXN0SW5mby5wYXJhbWV0ZXJzLmlkX3Rva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdEluZm8ucGFyYW1ldGVycy5lcnJvcikge1xuICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzLmNvbnRleHQuX2dldEl0ZW0odGhpcy5jb250ZXh0LkNPTlNUQU5UUy5TVE9SQUdFLkVSUk9SX0RFU0NSSVBUSU9OKSwgbnVsbCk7XG4gICAgICAgICAgICAgIHRoaXMuY29udGV4dC5fcmVuZXdGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBoYXNoIGZyb20gdXJsXG4gICAgaWYgKHJlbW92ZUhhc2gpIHtcbiAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaGFzaCkge1xuICAgICAgICBpZiAod2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKSB7XG4gICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCcnLCAnLycsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDYWNoZWRUb2tlbihyZXNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRDYWNoZWRUb2tlbihyZXNvdXJjZSk7XG4gIH1cblxuICBwdWJsaWMgYWNxdWlyZVRva2VuKHJlc291cmNlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHtcbiAgICByZXR1cm4gYmluZENhbGxiYWNrPHN0cmluZyB8IG51bGwsIHN0cmluZyB8IG51bGw+KChjYWxsYmFjaykgPT4ge1xuICAgICAgdGhpcy5jb250ZXh0LmFjcXVpcmVUb2tlbihyZXNvdXJjZSwgKGVycm9yOiBzdHJpbmcsIHRva2VuT3V0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0LmVycm9yKCdFcnJvciB3aGVuIGFjcXVpcmluZyB0b2tlbiBmb3IgcmVzb3VyY2U6ICcgKyByZXNvdXJjZSwgZXJyb3IpO1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayh0b2tlbk91dCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pKClcbiAgICAgIC5waXBlPHN0cmluZyB8IG51bGw+KFxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICghcmVzdWx0WzBdICYmIHJlc3VsdFsxXSkge1xuICAgICAgICAgICAgdGhyb3cgKHJlc3VsdFsxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFswXTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VXNlcigpOiBPYnNlcnZhYmxlPGFkYWwuVXNlciB8IG51bGw+IHtcbiAgICByZXR1cm4gYmluZENhbGxiYWNrPGFkYWwuVXNlciB8IG51bGw+KChjYWxsYmFjaykgPT4ge1xuICAgICAgdGhpcy5jb250ZXh0LmdldFVzZXIoKGVycm9yOiBzdHJpbmcsIHVzZXI/OiBhZGFsLlVzZXIpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0LmVycm9yKCdFcnJvciB3aGVuIGdldHRpbmcgdXNlcicsIGVycm9yKTtcbiAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayh1c2VyIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KSgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0LmNsZWFyQ2FjaGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckNhY2hlRm9yUmVzb3VyY2UocmVzb3VyY2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dC5jbGVhckNhY2hlRm9yUmVzb3VyY2UocmVzb3VyY2UpO1xuICB9XG5cbiAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0LmluZm8obWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgdmVyYm9zZShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHQudmVyYm9zZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNvdXJjZUZvckVuZHBvaW50KHVybDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRSZXNvdXJjZUZvckVuZHBvaW50KHVybCk7XG4gIH1cblxuXG4gIHB1YmxpYyByZWZyZXNoRGF0YUZyb21DYWNoZSgpIHtcbiAgICB0aGlzLnVwZGF0ZURhdGFGcm9tQ2FjaGUoKTtcblxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEYXRhRnJvbUNhY2hlKCk6IHZvaWQge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5jb250ZXh0LmdldENhY2hlZFRva2VuKHRoaXMuY29udGV4dC5jb25maWcubG9naW5SZXNvdXJjZSBhcyBhbnkpO1xuICAgIHRoaXMudXNlci5hdXRoZW50aWNhdGVkID0gdG9rZW4gIT09IG51bGwgJiYgdG9rZW4ubGVuZ3RoID4gMDtcblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNvbnRleHQuZ2V0Q2FjaGVkVXNlcigpO1xuXG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHRoaXMudXNlci51c2VyTmFtZSA9IHVzZXIudXNlck5hbWU7XG4gICAgICB0aGlzLnVzZXIucHJvZmlsZSA9IHVzZXIucHJvZmlsZTtcbiAgICAgIHRoaXMudXNlci50b2tlbiA9IHRva2VuO1xuICAgICAgdGhpcy51c2VyLmVycm9yID0gdGhpcy5jb250ZXh0LmdldExvZ2luRXJyb3IoKTtcbiAgICAgIHRoaXMudXNlci5sb2dpbkNhY2hlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXNlci51c2VyTmFtZSA9ICcnO1xuICAgICAgdGhpcy51c2VyLnByb2ZpbGUgPSB7fTtcbiAgICAgIHRoaXMudXNlci50b2tlbiA9ICcnO1xuICAgICAgdGhpcy51c2VyLmVycm9yID0gdGhpcy5jb250ZXh0LmdldExvZ2luRXJyb3IoKTtcbiAgICAgIHRoaXMudXNlci5sb2dpbkNhY2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaExvZ2luVG9rZW4oKTogdm9pZCB7XG5cbiAgICBpZiAoIXRoaXMudXNlci5sb2dpbkNhY2hlZCkge1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGxvZ2dlZCBpbicpO1xuICAgIH1cblxuICAgIHRoaXMuYWNxdWlyZVRva2VuKHRoaXMuY29udGV4dC5jb25maWcubG9naW5SZXNvdXJjZSBhcyBhbnkpLnN1YnNjcmliZSgodG9rZW46IHN0cmluZykgPT4ge1xuXG4gICAgICB0aGlzLnVzZXIudG9rZW4gPSB0b2tlbjtcblxuICAgICAgaWYgKHRoaXMudXNlci5hdXRoZW50aWNhdGVkID09PSBmYWxzZSkge1xuXG4gICAgICAgIHRoaXMudXNlci5hdXRoZW50aWNhdGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnVzZXIuZXJyb3IgPSAnJztcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgdGhpcy5zZXR1cExvZ2luVG9rZW5SZWZyZXNoVGltZXIoKTtcbiAgICAgIH1cbiAgICB9LCAoZXJyb3I6IHN0cmluZykgPT4ge1xuXG4gICAgICB0aGlzLnVzZXIuYXV0aGVudGljYXRlZCA9IGZhbHNlO1xuXG4gICAgICB0aGlzLnVzZXIuZXJyb3IgPSB0aGlzLmNvbnRleHQuZ2V0TG9naW5FcnJvcigpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBub3coKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDAuMCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc0luQ2FsbGJhY2tSZWRpcmVjdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJyNhY2Nlc3NfdG9rZW4nKSAhPT0gLTEgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignI2lkX3Rva2VuJykgIT09IC0xO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExvZ2luVG9rZW5SZWZyZXNoVGltZXIoKTogdm9pZCB7XG4gICAgLy8gR2V0IGV4cGlyYXRpb24gb2YgbG9naW4gdG9rZW5cbiAgICBjb25zdCBleHAgPSB0aGlzLmNvbnRleHQuX2dldEl0ZW0odGhpcy5jb250ZXh0LkNPTlNUQU5UUy5TVE9SQUdFLkVYUElSQVRJT05fS0VZICsgKHRoaXMuY29udGV4dC5jb25maWcubG9naW5SZXNvdXJjZSBhcyBhbnkpKTtcblxuICAgIC8vIEVpdGhlciB3YWl0IHVudGlsIHRoZSByZWZyZXNoIHdpbmRvdyBpcyB2YWxpZCBvciByZWZyZXNoIGluIDEgc2Vjb25kIChtZWFzdXJlZCBpbiBzZWNvbmRzKVxuICAgIGNvbnN0IHRpbWVyRGVsYXkgPSBleHAgLSB0aGlzLm5vdygpIC0gKHRoaXMuY29udGV4dC5jb25maWcuZXhwaXJlT2Zmc2V0U2Vjb25kcyB8fCAzMDApID4gMFxuICAgICAgPyBleHAgLSB0aGlzLm5vdygpIC0gKHRoaXMuY29udGV4dC5jb25maWcuZXhwaXJlT2Zmc2V0U2Vjb25kcyB8fCAzMDApIDogMTtcblxuICAgIGlmICh0aGlzLmxvZ2luUmVmcmVzaFRpbWVyKSB7IHRoaXMubG9naW5SZWZyZXNoVGltZXIudW5zdWJzY3JpYmUoKTsgfVxuXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuXG4gICAgICB0aGlzLmxvZ2luUmVmcmVzaFRpbWVyID0gdGltZXIodGltZXJEZWxheSAqIDEwMDApLnN1YnNjcmliZSgoeCkgPT4ge1xuXG4gICAgICAgIHRoaXMucmVmcmVzaExvZ2luVG9rZW4oKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=