UNPKG

ngx-slick-carousel

Version:

[![npm version](https://badge.fury.io/js/ngx-slick-carousel.svg)](https://badge.fury.io/js/ngx-slick-carousel) [![Build Status](https://travis-ci.com/leo6104/ngx-slick-carousel.svg?branch=master)](https://travis-ci.com/leo6104/ngx-slick-carousel)

450 lines 32 kB
/** * @fileoverview added by tsickle * Generated from: slick.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { isPlatformBrowser, isPlatformServer } from '@angular/common'; import { Component, Directive, ElementRef, EventEmitter, forwardRef, Host, Inject, Input, NgZone, Output, PLATFORM_ID } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; /** * Slick component */ export class SlickCarouselComponent { /** * Constructor * @param {?} el * @param {?} zone * @param {?} platformId */ constructor(el, zone, platformId) { this.el = el; this.zone = zone; this.platformId = platformId; this.afterChange = new EventEmitter(); this.beforeChange = new EventEmitter(); this.breakpoint = new EventEmitter(); this.destroy = new EventEmitter(); this.init = new EventEmitter(); // access from parent component can be a problem with change detection timing. Please use afterChange output this.currentIndex = 0; this.slides = []; this.initialized = false; this._removedSlides = []; this._addedSlides = []; } /** * On component destroy * @return {?} */ ngOnDestroy() { this.unslick(); } /** * @return {?} */ ngAfterViewInit() { this.ngAfterViewChecked(); } /** * On component view checked * @return {?} */ ngAfterViewChecked() { if (isPlatformServer(this.platformId)) { return; } if (this._addedSlides.length > 0 || this._removedSlides.length > 0) { /** @type {?} */ const nextSlidesLength = this.slides.length - this._removedSlides.length + this._addedSlides.length; if (!this.initialized) { if (nextSlidesLength > 0) { this.initSlick(); } // if nextSlidesLength is zere, do nothing } else if (nextSlidesLength === 0) { // unslick case this.unslick(); } else { this._addedSlides.forEach((/** * @param {?} slickItem * @return {?} */ slickItem => { this.slides.push(slickItem); this.zone.runOutsideAngular((/** * @return {?} */ () => { this.$instance.slick('slickAdd', slickItem.el.nativeElement); })); })); this._addedSlides = []; this._removedSlides.forEach((/** * @param {?} slickItem * @return {?} */ slickItem => { /** @type {?} */ const idx = this.slides.indexOf(slickItem); this.slides = this.slides.filter((/** * @param {?} s * @return {?} */ s => s !== slickItem)); this.zone.runOutsideAngular((/** * @return {?} */ () => { this.$instance.slick('slickRemove', idx); })); })); this._removedSlides = []; } } } /** * init slick * @return {?} */ initSlick() { this.slides = this._addedSlides; this._addedSlides = []; this._removedSlides = []; this.zone.runOutsideAngular((/** * @return {?} */ () => { this.$instance = jQuery(this.el.nativeElement); this.$instance.on('init', (/** * @param {?} event * @param {?} slick * @return {?} */ (event, slick) => { this.zone.run((/** * @return {?} */ () => { this.init.emit({ event, slick }); })); })); this.$instance.slick(this.config); this.zone.run((/** * @return {?} */ () => { var _a; this.initialized = true; this.currentIndex = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.initialSlide) || 0; })); this.$instance.on('afterChange', (/** * @param {?} event * @param {?} slick * @param {?} currentSlide * @return {?} */ (event, slick, currentSlide) => { this.zone.run((/** * @return {?} */ () => { this.afterChange.emit({ event, slick, currentSlide, first: currentSlide === 0, last: slick.$slides.length === currentSlide + slick.options.slidesToScroll }); this.currentIndex = currentSlide; })); })); this.$instance.on('beforeChange', (/** * @param {?} event * @param {?} slick * @param {?} currentSlide * @param {?} nextSlide * @return {?} */ (event, slick, currentSlide, nextSlide) => { this.zone.run((/** * @return {?} */ () => { this.beforeChange.emit({ event, slick, currentSlide, nextSlide }); this.currentIndex = nextSlide; })); })); this.$instance.on('breakpoint', (/** * @param {?} event * @param {?} slick * @param {?} breakpoint * @return {?} */ (event, slick, breakpoint) => { this.zone.run((/** * @return {?} */ () => { this.breakpoint.emit({ event, slick, breakpoint }); })); })); this.$instance.on('destroy', (/** * @param {?} event * @param {?} slick * @return {?} */ (event, slick) => { this.zone.run((/** * @return {?} */ () => { this.destroy.emit({ event, slick }); this.initialized = false; })); })); })); } /** * @param {?} slickItem * @return {?} */ addSlide(slickItem) { this._addedSlides.push(slickItem); } /** * @param {?} slickItem * @return {?} */ removeSlide(slickItem) { this._removedSlides.push(slickItem); } /** * Slick Method * @param {?} index * @return {?} */ slickGoTo(index) { this.zone.runOutsideAngular((/** * @return {?} */ () => { this.$instance.slick('slickGoTo', index); })); } /** * @return {?} */ slickNext() { this.zone.runOutsideAngular((/** * @return {?} */ () => { this.$instance.slick('slickNext'); })); } /** * @return {?} */ slickPrev() { this.zone.runOutsideAngular((/** * @return {?} */ () => { this.$instance.slick('slickPrev'); })); } /** * @return {?} */ slickPause() { this.zone.runOutsideAngular((/** * @return {?} */ () => { this.$instance.slick('slickPause'); })); } /** * @return {?} */ slickPlay() { this.zone.runOutsideAngular((/** * @return {?} */ () => { this.$instance.slick('slickPlay'); })); } /** * @return {?} */ unslick() { if (this.$instance) { this.zone.runOutsideAngular((/** * @return {?} */ () => { this.$instance.slick('unslick'); })); this.$instance = undefined; } this.initialized = false; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (this.initialized) { /** @type {?} */ const config = changes['config']; if (config.previousValue !== config.currentValue && config.currentValue !== undefined) { /** @type {?} */ const refresh = config.currentValue['refresh']; /** @type {?} */ const newOptions = Object.assign({}, config.currentValue); delete newOptions['refresh']; this.zone.runOutsideAngular((/** * @return {?} */ () => { this.$instance.slick('slickSetOption', newOptions, refresh); })); } } } } SlickCarouselComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-slick-carousel', exportAs: 'slick-carousel', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => SlickCarouselComponent)), multi: true }], template: '<ng-content></ng-content>' }] } ]; /** @nocollapse */ SlickCarouselComponent.ctorParameters = () => [ { type: ElementRef }, { type: NgZone }, { type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] } ]; SlickCarouselComponent.propDecorators = { config: [{ type: Input }], afterChange: [{ type: Output }], beforeChange: [{ type: Output }], breakpoint: [{ type: Output }], destroy: [{ type: Output }], init: [{ type: Output }] }; if (false) { /** @type {?} */ SlickCarouselComponent.prototype.config; /** @type {?} */ SlickCarouselComponent.prototype.afterChange; /** @type {?} */ SlickCarouselComponent.prototype.beforeChange; /** @type {?} */ SlickCarouselComponent.prototype.breakpoint; /** @type {?} */ SlickCarouselComponent.prototype.destroy; /** @type {?} */ SlickCarouselComponent.prototype.init; /** @type {?} */ SlickCarouselComponent.prototype.$instance; /** * @type {?} * @private */ SlickCarouselComponent.prototype.currentIndex; /** @type {?} */ SlickCarouselComponent.prototype.slides; /** @type {?} */ SlickCarouselComponent.prototype.initialized; /** * @type {?} * @private */ SlickCarouselComponent.prototype._removedSlides; /** * @type {?} * @private */ SlickCarouselComponent.prototype._addedSlides; /** * @type {?} * @private */ SlickCarouselComponent.prototype.el; /** * @type {?} * @private */ SlickCarouselComponent.prototype.zone; /** * @type {?} * @private */ SlickCarouselComponent.prototype.platformId; } export class SlickItemDirective { /** * @param {?} el * @param {?} platformId * @param {?} carousel */ constructor(el, platformId, carousel) { this.el = el; this.platformId = platformId; this.carousel = carousel; } /** * @return {?} */ ngOnInit() { if (isPlatformBrowser(this.platformId)) { this.carousel.addSlide(this); } } /** * @return {?} */ ngOnDestroy() { if (isPlatformBrowser(this.platformId)) { this.carousel.removeSlide(this); } } } SlickItemDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxSlickItem]', },] } ]; /** @nocollapse */ SlickItemDirective.ctorParameters = () => [ { type: ElementRef }, { type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: SlickCarouselComponent, decorators: [{ type: Host }] } ]; if (false) { /** @type {?} */ SlickItemDirective.prototype.el; /** * @type {?} * @private */ SlickItemDirective.prototype.platformId; /** * @type {?} * @private */ SlickItemDirective.prototype.carousel; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNsaWNrLWNhcm91c2VsLyIsInNvdXJjZXMiOlsic2xpY2suY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEUsT0FBTyxFQUdMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEVBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFpQm5ELE1BQU0sT0FBTyxzQkFBc0I7Ozs7Ozs7SUFzQmpDLFlBQW9CLEVBQWMsRUFDZCxJQUFZLEVBQ1MsVUFBa0I7UUFGdkMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVE7UUFDUyxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBckIvQyxnQkFBVyxHQUFrRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hJLGlCQUFZLEdBQXNGLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckgsZUFBVSxHQUE4RCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNGLFlBQU8sR0FBNkMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2RSxTQUFJLEdBQTZDLElBQUksWUFBWSxFQUFFLENBQUM7O1FBS3hFLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLFdBQU0sR0FBVSxFQUFFLENBQUM7UUFDbkIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDbkIsbUJBQWMsR0FBeUIsRUFBRSxDQUFDO1FBQzFDLGlCQUFZLEdBQXlCLEVBQUUsQ0FBQztJQVFoRCxDQUFDOzs7OztJQUtELFdBQVc7UUFDVCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQzs7OztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDOzs7OztJQUtELGtCQUFrQjtRQUNoQixJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNyQyxPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O2tCQUM1RCxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07WUFDbkcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3JCLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFO29CQUN4QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7aUJBQ2xCO2dCQUNELDBDQUEwQzthQUMzQztpQkFBTSxJQUFJLGdCQUFnQixLQUFLLENBQUMsRUFBRSxFQUFFLGVBQWU7Z0JBQ2xELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNoQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU87Ozs7Z0JBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O29CQUFDLEdBQUcsRUFBRTt3QkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQy9ELENBQUMsRUFBQyxDQUFDO2dCQUNMLENBQUMsRUFBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO2dCQUV2QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU87Ozs7Z0JBQUMsU0FBUyxDQUFDLEVBQUU7OzBCQUNoQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO29CQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTs7OztvQkFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUMsQ0FBQztvQkFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7OztvQkFBQyxHQUFHLEVBQUU7d0JBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDM0MsQ0FBQyxFQUFDLENBQUM7Z0JBQ0wsQ0FBQyxFQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7YUFDMUI7U0FDRjtJQUNILENBQUM7Ozs7O0lBS0QsU0FBUztRQUNQLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O1FBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTTs7Ozs7WUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHOzs7Z0JBQUMsR0FBRyxFQUFFO29CQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDLEVBQUMsQ0FBQztZQUNMLENBQUMsRUFBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRzs7O1lBQUMsR0FBRyxFQUFFOztnQkFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0JBRXhCLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxZQUFZLEtBQUksQ0FBQyxDQUFDO1lBQ3JELENBQUMsRUFBQyxDQUFDO1lBRUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsYUFBYTs7Ozs7O1lBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFO2dCQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7OztnQkFBQyxHQUFHLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7d0JBQ2xCLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxZQUFZO3dCQUNaLEtBQUssRUFBRSxZQUFZLEtBQUssQ0FBQzt3QkFDekIsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWM7cUJBQzdFLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztnQkFDckMsQ0FBQyxFQUFDLENBQUM7WUFDUCxDQUFDLEVBQUMsQ0FBQztZQUVULElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGNBQWM7Ozs7Ozs7WUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxFQUFFO2dCQUMxRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7OztnQkFBQyxHQUFHLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztvQkFDbEUsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7Z0JBQ2hDLENBQUMsRUFBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZOzs7Ozs7WUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7Z0JBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRzs7O2dCQUFDLEdBQUcsRUFBRTtvQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JELENBQUMsRUFBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTOzs7OztZQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7OztnQkFBQyxHQUFHLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUMzQixDQUFDLEVBQUMsQ0FBQztZQUNMLENBQUMsRUFBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7OztJQUVELFFBQVEsQ0FBQyxTQUE2QjtRQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxTQUE2QjtRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxDQUFDOzs7Ozs7SUFLTSxTQUFTLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O1FBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFTSxTQUFTO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7OztRQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwQyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFTSxTQUFTO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7OztRQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwQyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFTSxVQUFVO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7OztRQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFTSxTQUFTO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7OztRQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwQyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFTSxPQUFPO1FBQ1osSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCOzs7WUFBQyxHQUFHLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xDLENBQUMsRUFBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7U0FDNUI7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7O2tCQUNkLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ2hDLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxNQUFNLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFOztzQkFDL0UsT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDOztzQkFDeEMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUM7Z0JBQ3pELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjs7O2dCQUFDLEdBQUcsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM5RCxDQUFDLEVBQUMsQ0FBQzthQUNKO1NBQ0Y7SUFDSCxDQUFDOzs7WUFoTkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLFNBQVMsRUFBRSxDQUFDO3dCQUNWLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVOzs7d0JBQUMsR0FBRyxFQUFFLENBQUMsc0JBQXNCLEVBQUM7d0JBQ3JELEtBQUssRUFBRSxJQUFJO3FCQUNaLENBQUM7Z0JBQ0YsUUFBUSxFQUFFLDJCQUEyQjthQUN0Qzs7OztZQTlCQyxVQUFVO1lBTVYsTUFBTTt5Q0FpRE8sTUFBTSxTQUFDLFdBQVc7OztxQkF0QjVCLEtBQUs7MEJBQ0wsTUFBTTsyQkFDTixNQUFNO3lCQUNOLE1BQU07c0JBQ04sTUFBTTttQkFDTixNQUFNOzs7O0lBTFAsd0NBQXFCOztJQUNyQiw2Q0FBMEk7O0lBQzFJLDhDQUErSDs7SUFDL0gsNENBQXFHOztJQUNyRyx5Q0FBaUY7O0lBQ2pGLHNDQUE4RTs7SUFFaEYsMkNBQXNCOzs7OztJQUd0Qiw4Q0FBeUI7O0lBRXpCLHdDQUEwQjs7SUFDMUIsNkNBQTJCOzs7OztJQUMzQixnREFBa0Q7Ozs7O0lBQ2xELDhDQUFnRDs7Ozs7SUFLcEMsb0NBQXNCOzs7OztJQUN0QixzQ0FBb0I7Ozs7O0lBQ3BCLDRDQUErQzs7QUFxTDdELE1BQU0sT0FBTyxrQkFBa0I7Ozs7OztJQUM3QixZQUFtQixFQUFjLEVBQ1EsVUFBa0IsRUFDL0IsUUFBZ0M7UUFGekMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNRLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDL0IsYUFBUSxHQUFSLFFBQVEsQ0FBd0I7SUFDNUQsQ0FBQzs7OztJQUVELFFBQVE7UUFDTixJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtJQUNILENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDOzs7WUFuQkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxnQkFBZ0I7YUFDM0I7Ozs7WUEzT0MsVUFBVTt5Q0E4T0csTUFBTSxTQUFDLFdBQVc7WUFDTyxzQkFBc0IsdUJBQS9DLElBQUk7Ozs7SUFGTCxnQ0FBcUI7Ozs7O0lBQ3JCLHdDQUErQzs7Ozs7SUFDL0Msc0NBQWdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIsIGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdCxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFBMQVRGT1JNX0lELFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmRlY2xhcmUgY29uc3QgalF1ZXJ5OiBhbnk7XG5cbi8qKlxuICogU2xpY2sgY29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zbGljay1jYXJvdXNlbCcsXG4gIGV4cG9ydEFzOiAnc2xpY2stY2Fyb3VzZWwnLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2xpY2tDYXJvdXNlbENvbXBvbmVudCksXG4gICAgbXVsdGk6IHRydWVcbiAgfV0sXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXG59KVxuZXhwb3J0IGNsYXNzIFNsaWNrQ2Fyb3VzZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG5cbiAgICBASW5wdXQoKSBjb25maWc6IGFueTtcbiAgICBAT3V0cHV0KCkgYWZ0ZXJDaGFuZ2U6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBhbnksIHNsaWNrOiBhbnksIGN1cnJlbnRTbGlkZTogbnVtYmVyLCBmaXJzdDogYm9vbGVhbiwgbGFzdDogYm9vbGVhbiB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgYmVmb3JlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8eyBldmVudDogYW55LCBzbGljazogYW55LCBjdXJyZW50U2xpZGU6IG51bWJlciwgbmV4dFNsaWRlOiBudW1iZXIgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGJyZWFrcG9pbnQ6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBhbnksIHNsaWNrOiBhbnksIGJyZWFrcG9pbnQ6IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgZGVzdHJveTogRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IGFueSwgc2xpY2s6IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgaW5pdDogRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IGFueSwgc2xpY2s6IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgJGluc3RhbmNlOiBhbnk7XG5cbiAgLy8gYWNjZXNzIGZyb20gcGFyZW50IGNvbXBvbmVudCBjYW4gYmUgYSBwcm9ibGVtIHdpdGggY2hhbmdlIGRldGVjdGlvbiB0aW1pbmcuIFBsZWFzZSB1c2UgYWZ0ZXJDaGFuZ2Ugb3V0cHV0XG4gIHByaXZhdGUgY3VycmVudEluZGV4ID0gMDtcblxuICBwdWJsaWMgc2xpZGVzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcmVtb3ZlZFNsaWRlczogU2xpY2tJdGVtRGlyZWN0aXZlW10gPSBbXTtcbiAgcHJpdmF0ZSBfYWRkZWRTbGlkZXM6IFNsaWNrSXRlbURpcmVjdGl2ZVtdID0gW107XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBzdHJpbmcpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21wb25lbnQgZGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnNsaWNrKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0FmdGVyVmlld0NoZWNrZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21wb25lbnQgdmlldyBjaGVja2VkXG4gICAqL1xuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKGlzUGxhdGZvcm1TZXJ2ZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYWRkZWRTbGlkZXMubGVuZ3RoID4gMCB8fCB0aGlzLl9yZW1vdmVkU2xpZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5leHRTbGlkZXNMZW5ndGggPSB0aGlzLnNsaWRlcy5sZW5ndGggLSB0aGlzLl9yZW1vdmVkU2xpZGVzLmxlbmd0aCArIHRoaXMuX2FkZGVkU2xpZGVzLmxlbmd0aDtcbiAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICBpZiAobmV4dFNsaWRlc0xlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmluaXRTbGljaygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIG5leHRTbGlkZXNMZW5ndGggaXMgemVyZSwgZG8gbm90aGluZ1xuICAgICAgfSBlbHNlIGlmIChuZXh0U2xpZGVzTGVuZ3RoID09PSAwKSB7IC8vIHVuc2xpY2sgY2FzZVxuICAgICAgICB0aGlzLnVuc2xpY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2FkZGVkU2xpZGVzLmZvckVhY2goc2xpY2tJdGVtID0+IHtcbiAgICAgICAgICB0aGlzLnNsaWRlcy5wdXNoKHNsaWNrSXRlbSk7XG4gICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCdzbGlja0FkZCcsIHNsaWNrSXRlbS5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2FkZGVkU2xpZGVzID0gW107XG5cbiAgICAgICAgdGhpcy5fcmVtb3ZlZFNsaWRlcy5mb3JFYWNoKHNsaWNrSXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5zbGlkZXMuaW5kZXhPZihzbGlja0l0ZW0pO1xuICAgICAgICAgIHRoaXMuc2xpZGVzID0gdGhpcy5zbGlkZXMuZmlsdGVyKHMgPT4gcyAhPT0gc2xpY2tJdGVtKTtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrUmVtb3ZlJywgaWR4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlbW92ZWRTbGlkZXMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaW5pdCBzbGlja1xuICAgKi9cbiAgaW5pdFNsaWNrKCkge1xuICAgIHRoaXMuc2xpZGVzID0gdGhpcy5fYWRkZWRTbGlkZXM7XG4gICAgdGhpcy5fYWRkZWRTbGlkZXMgPSBbXTtcbiAgICB0aGlzLl9yZW1vdmVkU2xpZGVzID0gW107XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuJGluc3RhbmNlID0galF1ZXJ5KHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgIHRoaXMuJGluc3RhbmNlLm9uKCdpbml0JywgKGV2ZW50LCBzbGljaykgPT4ge1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmluaXQuZW1pdCh7IGV2ZW50LCBzbGljayB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2sodGhpcy5jb25maWcpO1xuXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLmNvbmZpZz8uaW5pdGlhbFNsaWRlIHx8IDA7XG4gICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy4kaW5zdGFuY2Uub24oJ2FmdGVyQ2hhbmdlJywgKGV2ZW50LCBzbGljaywgY3VycmVudFNsaWRlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNsaWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Q6IGN1cnJlbnRTbGlkZSA9PT0gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q6IHNsaWNrLiRzbGlkZXMubGVuZ3RoID09PSBjdXJyZW50U2xpZGUgKyBzbGljay5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IGN1cnJlbnRTbGlkZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICB0aGlzLiRpbnN0YW5jZS5vbignYmVmb3JlQ2hhbmdlJywgKGV2ZW50LCBzbGljaywgY3VycmVudFNsaWRlLCBuZXh0U2xpZGUpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5iZWZvcmVDaGFuZ2UuZW1pdCh7IGV2ZW50LCBzbGljaywgY3VycmVudFNsaWRlLCBuZXh0U2xpZGUgfSk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBuZXh0U2xpZGU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuJGluc3RhbmNlLm9uKCdicmVha3BvaW50JywgKGV2ZW50LCBzbGljaywgYnJlYWtwb2ludCkgPT4ge1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmJyZWFrcG9pbnQuZW1pdCh7IGV2ZW50LCBzbGljaywgYnJlYWtwb2ludCB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy4kaW5zdGFuY2Uub24oJ2Rlc3Ryb3knLCAoZXZlbnQsIHNsaWNrKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVzdHJveS5lbWl0KHsgZXZlbnQsIHNsaWNrIH0pO1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFNsaWRlKHNsaWNrSXRlbTogU2xpY2tJdGVtRGlyZWN0aXZlKSB7XG4gICAgdGhpcy5fYWRkZWRTbGlkZXMucHVzaChzbGlja0l0ZW0pO1xuICB9XG5cbiAgcmVtb3ZlU2xpZGUoc2xpY2tJdGVtOiBTbGlja0l0ZW1EaXJlY3RpdmUpIHtcbiAgICB0aGlzLl9yZW1vdmVkU2xpZGVzLnB1c2goc2xpY2tJdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTbGljayBNZXRob2RcbiAgICovXG4gIHB1YmxpYyBzbGlja0dvVG8oaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygnc2xpY2tHb1RvJywgaW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNsaWNrTmV4dCgpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrTmV4dCcpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNsaWNrUHJldigpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy4kaW5zdGFuY2Uuc2xpY2soJ3NsaWNrUHJldicpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNsaWNrUGF1c2UoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCdzbGlja1BhdXNlJyk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2xpY2tQbGF5KCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygnc2xpY2tQbGF5Jyk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5zbGljaygpIHtcbiAgICBpZiAodGhpcy4kaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuJGluc3RhbmNlLnNsaWNrKCd1bnNsaWNrJyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuJGluc3RhbmNlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGNoYW5nZXNbJ2NvbmZpZyddO1xuICAgICAgaWYgKGNvbmZpZy5wcmV2aW91c1ZhbHVlICE9PSBjb25maWcuY3VycmVudFZhbHVlICYmIGNvbmZpZy5jdXJyZW50VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWZyZXNoID0gY29uZmlnLmN1cnJlbnRWYWx1ZVsncmVmcmVzaCddO1xuICAgICAgICBjb25zdCBuZXdPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBuZXdPcHRpb25zWydyZWZyZXNoJ107XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLiRpbnN0YW5jZS5zbGljaygnc2xpY2tTZXRPcHRpb24nLCBuZXdPcHRpb25zLCByZWZyZXNoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neFNsaWNrSXRlbV0nLFxufSlcbmV4cG9ydCBjbGFzcyBTbGlja0l0ZW1EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbDogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgIEBIb3N0KCkgcHJpdmF0ZSBjYXJvdXNlbDogU2xpY2tDYXJvdXNlbENvbXBvbmVudCkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHRoaXMuY2Fyb3VzZWwuYWRkU2xpZGUodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHRoaXMuY2Fyb3VzZWwucmVtb3ZlU2xpZGUodGhpcyk7XG4gICAgfVxuICB9XG59XG4iXX0=