UNPKG

ngx-guided-tour

Version:

Guided tour for your Angular6+ applications.

401 lines 35.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { debounceTime } from 'rxjs/internal/operators'; import { ErrorHandler, Injectable } from '@angular/core'; import { Subject, fromEvent } from 'rxjs'; import { Orientation } from './guided-tour.constants'; import { cloneDeep } from 'lodash'; var GuidedTourService = /** @class */ (function () { function GuidedTourService(errorHandler) { var _this = this; this.errorHandler = errorHandler; this._guidedTourCurrentStepSubject = new Subject(); this._guidedTourOrbShowingSubject = new Subject(); this._currentTourStepIndex = 0; this._currentTour = null; this._onFirstStep = true; this._onLastStep = true; this._onResizeMessage = false; this.guidedTourCurrentStepStream = this._guidedTourCurrentStepSubject.asObservable(); this.guidedTourOrbShowingStream = this._guidedTourOrbShowingSubject.asObservable(); fromEvent(window, 'resize').pipe(debounceTime(200)).subscribe((/** * @return {?} */ function () { if (_this._currentTour && _this._currentTourStepIndex > -1) { if (_this._currentTour.minimumScreenSize && _this._currentTour.minimumScreenSize >= window.innerWidth) { _this._onResizeMessage = true; _this._guidedTourCurrentStepSubject.next({ title: 'Please resize', content: 'You have resized the tour to a size that is too small to continue. Please resize the browser to a larger size to continue the tour or close the tour.' }); } else { _this._onResizeMessage = false; _this._guidedTourCurrentStepSubject.next(_this.getPreparedTourStep(_this._currentTourStepIndex)); } } })); } /** * @return {?} */ GuidedTourService.prototype.nextStep = /** * @return {?} */ function () { var _this = this; if (this._currentTour.steps[this._currentTourStepIndex].closeAction) { this._currentTour.steps[this._currentTourStepIndex].closeAction(); } if (this._currentTour.steps[this._currentTourStepIndex + 1]) { this._currentTourStepIndex++; this._setFirstAndLast(); if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); // Usually an action is opening something so we need to give it time to render. setTimeout((/** * @return {?} */ function () { if (_this._checkSelectorValidity()) { _this._guidedTourCurrentStepSubject.next(_this.getPreparedTourStep(_this._currentTourStepIndex)); } else { _this.nextStep(); } })); } else { if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.nextStep(); } } } else { if (this._currentTour.completeCallback) { this._currentTour.completeCallback(); } this.resetTour(); } }; /** * @return {?} */ GuidedTourService.prototype.backStep = /** * @return {?} */ function () { var _this = this; if (this._currentTour.steps[this._currentTourStepIndex].closeAction) { this._currentTour.steps[this._currentTourStepIndex].closeAction(); } if (this._currentTour.steps[this._currentTourStepIndex - 1]) { this._currentTourStepIndex--; this._setFirstAndLast(); if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); setTimeout((/** * @return {?} */ function () { if (_this._checkSelectorValidity()) { _this._guidedTourCurrentStepSubject.next(_this.getPreparedTourStep(_this._currentTourStepIndex)); } else { _this.backStep(); } })); } else { if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.backStep(); } } } else { this.resetTour(); } }; /** * @return {?} */ GuidedTourService.prototype.skipTour = /** * @return {?} */ function () { if (this._currentTour.skipCallback) { this._currentTour.skipCallback(this._currentTourStepIndex); } this.resetTour(); }; /** * @return {?} */ GuidedTourService.prototype.resetTour = /** * @return {?} */ function () { document.body.classList.remove('tour-open'); this._currentTour = null; this._currentTourStepIndex = 0; this._guidedTourCurrentStepSubject.next(null); }; /** * @param {?} tour * @return {?} */ GuidedTourService.prototype.startTour = /** * @param {?} tour * @return {?} */ function (tour) { this._currentTour = cloneDeep(tour); this._currentTour.steps = this._currentTour.steps.filter((/** * @param {?} step * @return {?} */ function (step) { return !step.skipStep; })); this._currentTourStepIndex = 0; this._setFirstAndLast(); this._guidedTourOrbShowingSubject.next(this._currentTour.useOrb); if (this._currentTour.steps.length > 0 && (!this._currentTour.minimumScreenSize || (window.innerWidth >= this._currentTour.minimumScreenSize))) { if (!this._currentTour.useOrb) { document.body.classList.add('tour-open'); } if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); } if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.nextStep(); } } }; /** * @return {?} */ GuidedTourService.prototype.activateOrb = /** * @return {?} */ function () { this._guidedTourOrbShowingSubject.next(false); document.body.classList.add('tour-open'); }; /** * @private * @return {?} */ GuidedTourService.prototype._setFirstAndLast = /** * @private * @return {?} */ function () { this._onLastStep = (this._currentTour.steps.length - 1) === this._currentTourStepIndex; this._onFirstStep = this._currentTourStepIndex === 0; }; /** * @private * @return {?} */ GuidedTourService.prototype._checkSelectorValidity = /** * @private * @return {?} */ function () { if (this._currentTour.steps[this._currentTourStepIndex].selector) { /** @type {?} */ var selectedElement = document.querySelector(this._currentTour.steps[this._currentTourStepIndex].selector); if (!selectedElement) { this.errorHandler.handleError( // If error handler is configured this should not block the browser. new Error("Error finding selector " + this._currentTour.steps[this._currentTourStepIndex].selector + " on step " + (this._currentTourStepIndex + 1) + " during guided tour: " + this._currentTour.tourId)); return false; } } return true; }; Object.defineProperty(GuidedTourService.prototype, "onLastStep", { get: /** * @return {?} */ function () { return this._onLastStep; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "onFirstStep", { get: /** * @return {?} */ function () { return this._onFirstStep; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "onResizeMessage", { get: /** * @return {?} */ function () { return this._onResizeMessage; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "currentTourStepDisplay", { get: /** * @return {?} */ function () { return this._currentTourStepIndex + 1; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "currentTourStepCount", { get: /** * @return {?} */ function () { return this._currentTour && this._currentTour.steps ? this._currentTour.steps.length : 0; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "preventBackdropFromAdvancing", { get: /** * @return {?} */ function () { return this._currentTour && this._currentTour.preventBackdropFromAdvancing; }, enumerable: true, configurable: true }); /** * @private * @param {?} index * @return {?} */ GuidedTourService.prototype.getPreparedTourStep = /** * @private * @param {?} index * @return {?} */ function (index) { return this.setTourOrientation(this._currentTour.steps[index]); }; /** * @private * @param {?} step * @return {?} */ GuidedTourService.prototype.setTourOrientation = /** * @private * @param {?} step * @return {?} */ function (step) { /** @type {?} */ var convertedStep = cloneDeep(step); if (convertedStep.orientation && !(typeof convertedStep.orientation === 'string') && ((/** @type {?} */ (convertedStep.orientation))).length) { ((/** @type {?} */ (convertedStep.orientation))).sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { if (!b.maximumSize) { return 1; } if (!a.maximumSize) { return -1; } return b.maximumSize - a.maximumSize; })); /** @type {?} */ var currentOrientation_1 = Orientation.Top; ((/** @type {?} */ (convertedStep.orientation))).forEach((/** * @param {?} orientationConfig * @return {?} */ function (orientationConfig) { if (!orientationConfig.maximumSize || window.innerWidth <= orientationConfig.maximumSize) { currentOrientation_1 = orientationConfig.orientationDirection; } })); convertedStep.orientation = currentOrientation_1; } return convertedStep; }; GuidedTourService.decorators = [ { type: Injectable } ]; /** @nocollapse */ GuidedTourService.ctorParameters = function () { return [ { type: ErrorHandler } ]; }; return GuidedTourService; }()); export { GuidedTourService }; if (false) { /** @type {?} */ GuidedTourService.prototype.guidedTourCurrentStepStream; /** @type {?} */ GuidedTourService.prototype.guidedTourOrbShowingStream; /** * @type {?} * @private */ GuidedTourService.prototype._guidedTourCurrentStepSubject; /** * @type {?} * @private */ GuidedTourService.prototype._guidedTourOrbShowingSubject; /** * @type {?} * @private */ GuidedTourService.prototype._currentTourStepIndex; /** * @type {?} * @private */ GuidedTourService.prototype._currentTour; /** * @type {?} * @private */ GuidedTourService.prototype._onFirstStep; /** * @type {?} * @private */ GuidedTourService.prototype._onLastStep; /** * @type {?} * @private */ GuidedTourService.prototype._onResizeMessage; /** @type {?} */ GuidedTourService.prototype.errorHandler; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGVkLXRvdXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1ndWlkZWQtdG91ci8iLCJzb3VyY2VzIjpbImxpYi9ndWlkZWQtdG91ci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUF3QixXQUFXLEVBQTRCLE1BQU0seUJBQXlCLENBQUM7QUFDdEcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVuQztJQWFJLDJCQUNXLFlBQTBCO1FBRHJDLGlCQW9CQztRQW5CVSxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQVQ3QixrQ0FBNkIsR0FBRyxJQUFJLE9BQU8sRUFBWSxDQUFDO1FBQ3hELGlDQUE0QixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDdEQsMEJBQXFCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLGlCQUFZLEdBQWUsSUFBSSxDQUFDO1FBQ2hDLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ25CLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUs3QixJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JGLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFbkYsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUzs7O1FBQUM7WUFDMUQsSUFBSSxLQUFJLENBQUMs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LENBQUM7U0FDbEQ7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDOztnQkF2TkosVUFBVTs7OztnQkFMRixZQUFZOztJQTZOckIsd0JBQUM7Q0FBQSxBQXhORCxJQXdOQztTQXZOWSxpQkFBaUI7OztJQUMxQix3REFBeUQ7O0lBQ3pELHVEQUF1RDs7Ozs7SUFFdkQsMERBQWdFOzs7OztJQUNoRSx5REFBOEQ7Ozs7O0lBQzlELGtEQUFrQzs7Ozs7SUFDbEMseUNBQXdDOzs7OztJQUN4Qyx5Q0FBNEI7Ozs7O0lBQzVCLHdDQUEyQjs7Ozs7SUFDM0IsNkNBQWlDOztJQUc3Qix5Q0FBaUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL2ludGVybmFsL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR3VpZGVkVG91ciwgVG91clN0ZXAsIE9yaWVudGF0aW9uLCBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2d1aWRlZC10b3VyLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR3VpZGVkVG91clNlcnZpY2Uge1xuICAgIHB1YmxpYyBndWlkZWRUb3VyQ3VycmVudFN0ZXBTdHJlYW06IE9ic2VydmFibGU8VG91clN0ZXA+O1xuICAgIHB1YmxpYyBndWlkZWRUb3VyT3JiU2hvd2luZ1N0cmVhbTogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIHByaXZhdGUgX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QgPSBuZXcgU3ViamVjdDxUb3VyU3RlcD4oKTtcbiAgICBwcml2YXRlIF9ndWlkZWRUb3VyT3JiU2hvd2luZ1N1YmplY3QgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIHByaXZhdGUgX2N1cnJlbnRUb3VyU3RlcEluZGV4ID0gMDtcbiAgICBwcml2YXRlIF9jdXJyZW50VG91cjogR3VpZGVkVG91ciA9IG51bGw7XG4gICAgcHJpdmF0ZSBfb25GaXJzdFN0ZXAgPSB0cnVlO1xuICAgIHByaXZhdGUgX29uTGFzdFN0ZXAgPSB0cnVlO1xuICAgIHByaXZhdGUgX29uUmVzaXplTWVzc2FnZSA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlclxuICAgICkge1xuICAgICAgICB0aGlzLmd1aWRlZFRvdXJDdXJyZW50U3RlcFN0cmVhbSA9IHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMuZ3VpZGVkVG91ck9yYlNob3dpbmdTdHJlYW0gPSB0aGlzLl9ndWlkZWRUb3VyT3JiU2hvd2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpLnBpcGUoZGVib3VuY2VUaW1lKDIwMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIgJiYgdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5taW5pbXVtU2NyZWVuU2l6ZSAmJiB0aGlzLl9jdXJyZW50VG91ci5taW5pbXVtU2NyZWVuU2l6ZSA+PSB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblJlc2l6ZU1lc3NhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdQbGVhc2UgcmVzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdZb3UgaGF2ZSByZXNpemVkIHRoZSB0b3VyIHRvIGEgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbCB0byBjb250aW51ZS4gUGxlYXNlIHJlc2l6ZSB0aGUgYnJvd3NlciB0byBhIGxhcmdlciBzaXplIHRvIGNvbnRpbnVlIHRoZSB0b3VyIG9yIGNsb3NlIHRoZSB0b3VyLidcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25SZXNpemVNZXNzYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dCh0aGlzLmdldFByZXBhcmVkVG91clN0ZXAodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0U3RlcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5jbG9zZUFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmNsb3NlQWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ICsgMV0pIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4Kys7XG4gICAgICAgICAgICB0aGlzLl9zZXRGaXJzdEFuZExhc3QoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmFjdGlvbigpO1xuICAgICAgICAgICAgICAgIC8vIFVzdWFsbHkgYW4gYWN0aW9uIGlzIG9wZW5pbmcgc29tZXRoaW5nIHNvIHdlIG5lZWQgdG8gZ2l2ZSBpdCB0aW1lIHRvIHJlbmRlci5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQodGhpcy5nZXRQcmVwYXJlZFRvdXJTdGVwKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dCh0aGlzLmdldFByZXBhcmVkVG91clN0ZXAodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLmNvbXBsZXRlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5jb21wbGV0ZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc2V0VG91cigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGJhY2tTdGVwKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmNsb3NlQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uY2xvc2VBY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggLSAxXSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgtLTtcbiAgICAgICAgICAgIHRoaXMuX3NldEZpcnN0QW5kTGFzdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1NlbGVjdG9yVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KHRoaXMuZ2V0UHJlcGFyZWRUb3VyU3RlcCh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrU3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1NlbGVjdG9yVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQodGhpcy5nZXRQcmVwYXJlZFRvdXJTdGVwKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrU3RlcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRUb3VyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2tpcFRvdXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5za2lwQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnNraXBDYWxsYmFjayh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldFRvdXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRUb3VyKCk6IHZvaWQge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3RvdXItb3BlbicpO1xuICAgICAgICB0aGlzLl9jdXJyZW50VG91ciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydFRvdXIodG91cjogR3VpZGVkVG91cik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50VG91ciA9IGNsb25lRGVlcCh0b3VyKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHMgPSB0aGlzLl9jdXJyZW50VG91ci5zdGVwcy5maWx0ZXIoc3RlcCA9PiAhc3RlcC5za2lwU3RlcCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRMYXN0KCk7XG4gICAgICAgIHRoaXMuX2d1aWRlZFRvdXJPcmJTaG93aW5nU3ViamVjdC5uZXh0KHRoaXMuX2N1cnJlbnRUb3VyLnVzZU9yYik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICYmICghdGhpcy5fY3VycmVudFRvdXIubWluaW11bVNjcmVlblNpemVcbiAgICAgICAgICAgICAgICB8fCAod2luZG93LmlubmVyV2lkdGggPj0gdGhpcy5fY3VycmVudFRvdXIubWluaW11bVNjcmVlblNpemUpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fY3VycmVudFRvdXIudXNlT3JiKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd0b3VyLW9wZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmFjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KHRoaXMuZ2V0UHJlcGFyZWRUb3VyU3RlcCh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVPcmIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2d1aWRlZFRvdXJPcmJTaG93aW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd0b3VyLW9wZW4nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRGaXJzdEFuZExhc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uTGFzdFN0ZXAgPSAodGhpcy5fY3VycmVudFRvdXIuc3RlcHMubGVuZ3RoIC0gMSkgPT09IHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4O1xuICAgICAgICB0aGlzLl9vbkZpcnN0U3RlcCA9IHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID09PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uc2VsZWN0b3IpO1xuICAgICAgICAgICAgaWYgKCFzZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZXJyb3IgaGFuZGxlciBpcyBjb25maWd1cmVkIHRoaXMgc2hvdWxkIG5vdCBibG9jayB0aGUgYnJvd3Nlci5cbiAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yKGBFcnJvciBmaW5kaW5nIHNlbGVjdG9yICR7dGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLnNlbGVjdG9yfSBvbiBzdGVwICR7dGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggKyAxfSBkdXJpbmcgZ3VpZGVkIHRvdXI6ICR7dGhpcy5fY3VycmVudFRvdXIudG91cklkfWApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvbkxhc3RTdGVwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25MYXN0U3RlcDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG9uRmlyc3RTdGVwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25GaXJzdFN0ZXA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvblJlc2l6ZU1lc3NhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vblJlc2l6ZU1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VG91clN0ZXBEaXNwbGF5KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCArIDE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VG91clN0ZXBDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFRvdXIgJiYgdGhpcy5fY3VycmVudFRvdXIuc3RlcHMgPyB0aGlzLl9jdXJyZW50VG91ci5zdGVwcy5sZW5ndGggOiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcHJldmVudEJhY2tkcm9wRnJvbUFkdmFuY2luZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUb3VyICYmIHRoaXMuX2N1cnJlbnRUb3VyLnByZXZlbnRCYWNrZHJvcEZyb21BZHZhbmNpbmc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcmVwYXJlZFRvdXJTdGVwKGluZGV4OiBudW1iZXIpOiBUb3VyU3RlcCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFRvdXJPcmllbnRhdGlvbih0aGlzLl9jdXJyZW50VG91ci5zdGVwc1tpbmRleF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VG91ck9yaWVudGF0aW9uKHN0ZXA6IFRvdXJTdGVwKTogVG91clN0ZXAge1xuICAgICAgICBjb25zdCBjb252ZXJ0ZWRTdGVwID0gY2xvbmVEZWVwKHN0ZXApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uXG4gICAgICAgICAgICAmJiAhKHR5cGVvZiBjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICYmIChjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uIGFzIE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbltdKS5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAoY29udmVydGVkU3RlcC5vcmllbnRhdGlvbiBhcyBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb25bXSkuc29ydCgoYTogT3JpZW50YXRpb25Db25maWd1cmF0aW9uLCBiOiBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWIubWF4aW11bVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYS5tYXhpbXVtU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiLm1heGltdW1TaXplIC0gYS5tYXhpbXVtU2l6ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgY3VycmVudE9yaWVudGF0aW9uOiBPcmllbnRhdGlvbiA9IE9yaWVudGF0aW9uLlRvcDtcbiAgICAgICAgICAgIChjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uIGFzIE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbltdKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChvcmllbnRhdGlvbkNvbmZpZzogT3JpZW50YXRpb25Db25maWd1cmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3JpZW50YXRpb25Db25maWcubWF4aW11bVNpemUgfHwgd2luZG93LmlubmVyV2lkdGggPD0gb3JpZW50YXRpb25Db25maWcubWF4aW11bVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uQ29uZmlnLm9yaWVudGF0aW9uRGlyZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29udmVydGVkU3RlcC5vcmllbnRhdGlvbiA9IGN1cnJlbnRPcmllbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydGVkU3RlcDtcbiAgICB9XG59XG4iXX0=