UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

103 lines 18.9 kB
import { Component, EventEmitter, forwardRef, inject, Output, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { BehaviorSubject, Subject } from 'rxjs'; import { filter, takeUntil, tap } from 'rxjs/operators'; import { CountdownIntervalComponent } from '../../countdown-interval'; import { gettext } from '../../i18n'; import { DEFAULT_INTERVAL_VALUE } from './widget-auto-refresh-context.model'; import { WidgetGlobalAutoRefreshService } from './widget-global-auto-refresh.service'; import * as i0 from "@angular/core"; import * as i1 from "../../common/icon.directive"; import * as i2 from "@angular/common"; import * as i3 from "ngx-bootstrap/tooltip"; import * as i4 from "../../countdown-interval/countdown-interval.component"; import * as i5 from "@ngx-translate/core"; export class AutoRefreshControlComponent { constructor() { this.DISABLE_AUTO_REFRESH = gettext('Disable auto refresh'); this.ENABLE_AUTO_REFRESH = gettext('Enable auto refresh'); this.DEFAULT_INTERVAL_VALUE = DEFAULT_INTERVAL_VALUE; this.loading = new EventEmitter(); this.widgetGlobalAutoRefresh = inject(WidgetGlobalAutoRefreshService); this.showIntervalRefresh$ = new BehaviorSubject(this.widgetGlobalAutoRefresh.autoRefreshSettings.isEnabled$.getValue()); this.isBtnDisabledSubject = new BehaviorSubject(false); this.isBtnDisabled$ = this.isBtnDisabledSubject.asObservable(); this.destroy$ = new Subject(); // eslint-disable-next-line @typescript-eslint/no-empty-function this.onTouched = () => { }; } ngAfterViewInit() { this.subscribeOnCountdownChangeState(); this.setUpOnCountdownEndedListener(); this.autoRefreshSeconds$ = this.widgetGlobalAutoRefresh.autoRefreshSettings.refreshInterval$; } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } toggleIntervalRefresh() { this.showIntervalRefresh$.next(!this.showIntervalRefresh$.getValue()); this.onChange(this.showIntervalRefresh$.getValue()); this.widgetGlobalAutoRefresh.autoRefreshSettings.userDisabledManually$.next(!this.showIntervalRefresh$.getValue()); } registerOnChange(fn) { this.onChange = fn; } writeValue(showIntervalRefresh) { if (!this.showIntervalRefresh$) { return; } this.showIntervalRefresh$.next(showIntervalRefresh); } registerOnTouched(fn) { this.onTouched = fn; } subscribeOnCountdownChangeState() { this.widgetGlobalAutoRefresh.countdownActions.reset$ .pipe(tap(() => { this.isBtnDisabledSubject.next(false); this.loading.emit(false); this.countdownIntervalComponent?.reset(); }), takeUntil(this.destroy$)) .subscribe(); this.widgetGlobalAutoRefresh.countdownActions.stop$ .pipe(tap(() => { this.isBtnDisabledSubject.next(true); this.loading.emit(true); this.countdownIntervalComponent?.stop(true); }), takeUntil(this.destroy$)) .subscribe(); } setUpOnCountdownEndedListener() { this.countdownIntervalComponent.countdownEnded .pipe(filter(() => this.showIntervalRefresh$.getValue()), tap(() => this.handleCountdownEnded()), takeUntil(this.destroy$)) .subscribe(); } handleCountdownEnded() { this.widgetGlobalAutoRefresh.countdownActions.countdownEnded$.next(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutoRefreshControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AutoRefreshControlComponent, selector: "c8y-auto-refresh-control", outputs: { loading: "loading" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AutoRefreshControlComponent), multi: true } ], viewQueries: [{ propertyName: "countdownIntervalComponent", first: true, predicate: CountdownIntervalComponent, descendants: true }], ngImport: i0, template: "<div class=\"input-group\">\n <button\n class=\"toggle-countdown\"\n [attr.aria-label]=\"\n ((showIntervalRefresh$ | async) ? DISABLE_AUTO_REFRESH : ENABLE_AUTO_REFRESH) | translate\n \"\n [tooltip]=\"\n ((showIntervalRefresh$ | async) ? DISABLE_AUTO_REFRESH : ENABLE_AUTO_REFRESH) | translate\n \"\n placement=\"bottom\"\n (click)=\"toggleIntervalRefresh()\"\n [adaptivePosition]=\"false\"\n mode\n [delay]=\"500\"\n [disabled]=\"isBtnDisabled$ | async\"\n >\n <c8y-countdown-interval\n [hidden]=\"!(showIntervalRefresh$ | async)\"\n [countdownInterval]=\"(autoRefreshSeconds$ | async) ?? DEFAULT_INTERVAL_VALUE\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!(showIntervalRefresh$ | async)\"\n ></i>\n </button>\n <span></span>\n</div>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i4.CountdownIntervalComponent, selector: "c8y-countdown-interval", inputs: ["countdownInterval"], outputs: ["countdownEnded"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutoRefreshControlComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-auto-refresh-control', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AutoRefreshControlComponent), multi: true } ], template: "<div class=\"input-group\">\n <button\n class=\"toggle-countdown\"\n [attr.aria-label]=\"\n ((showIntervalRefresh$ | async) ? DISABLE_AUTO_REFRESH : ENABLE_AUTO_REFRESH) | translate\n \"\n [tooltip]=\"\n ((showIntervalRefresh$ | async) ? DISABLE_AUTO_REFRESH : ENABLE_AUTO_REFRESH) | translate\n \"\n placement=\"bottom\"\n (click)=\"toggleIntervalRefresh()\"\n [adaptivePosition]=\"false\"\n mode\n [delay]=\"500\"\n [disabled]=\"isBtnDisabled$ | async\"\n >\n <c8y-countdown-interval\n [hidden]=\"!(showIntervalRefresh$ | async)\"\n [countdownInterval]=\"(autoRefreshSeconds$ | async) ?? DEFAULT_INTERVAL_VALUE\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!(showIntervalRefresh$ | async)\"\n ></i>\n </button>\n <span></span>\n</div>\n" }] }], propDecorators: { countdownIntervalComponent: [{ type: ViewChild, args: [CountdownIntervalComponent] }], loading: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1yZWZyZXNoLWNvbnRyb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lkZ2V0LWF1dG8tcmVmcmVzaC1jb250ZXh0L2F1dG8tcmVmcmVzaC1jb250cm9sLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2NvcmUvZGFzaGJvYXJkL3dpZGdldC1hdXRvLXJlZnJlc2gtY29udGV4dC9hdXRvLXJlZnJlc2gtY29udHJvbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUVOLE1BQU0sRUFDTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDN0UsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7QUFhdEYsTUFBTSxPQUFPLDJCQUEyQjtJQVh4QztRQVlXLHlCQUFvQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3ZELHdCQUFtQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELDJCQUFzQixHQUFHLHNCQUFzQixDQUFDO1FBTXpELFlBQU8sR0FBRyxJQUFJLFlB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Q3pCO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVPLDZCQUE2QjtRQUNuQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYzthQUMzQyxJQUFJLENBQ0gsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUNsRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsRUFDdEMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekI7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkUsQ0FBQzsrR0FsR1UsMkJBQTJCO21HQUEzQiwyQkFBMkIsb0ZBVDNCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztnQkFDMUQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLHNGQVFVLDBCQUEwQixnRENsQ3ZDLHUwQkEyQkE7OzRGREVhLDJCQUEyQjtrQkFYdkMsU0FBUzsrQkFDRSwwQkFBMEIsYUFDekI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLENBQUM7NEJBQzFELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhCQVNELDBCQUEwQjtzQkFEekIsU0FBUzt1QkFBQywwQkFBMEI7Z0JBSXJDLE9BQU87c0JBRE4sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3QsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvdW50ZG93bi1pbnRlcnZhbCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vLi4vaTE4bic7XG5pbXBvcnQgeyBERUZBVUxUX0lOVEVSVkFMX1ZBTFVFIH0gZnJvbSAnLi93aWRnZXQtYXV0by1yZWZyZXNoLWNvbnRleHQubW9kZWwnO1xuaW1wb3J0IHsgV2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hTZXJ2aWNlIH0gZnJvbSAnLi93aWRnZXQtZ2xvYmFsLWF1dG8tcmVmcmVzaC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWF1dG8tcmVmcmVzaC1jb250cm9sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBdXRvUmVmcmVzaENvbnRyb2xDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvLXJlZnJlc2gtY29udHJvbC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQXV0b1JlZnJlc2hDb250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHJlYWRvbmx5IERJU0FCTEVfQVVUT19SRUZSRVNIID0gZ2V0dGV4dCgnRGlzYWJsZSBhdXRvIHJlZnJlc2gnKTtcbiAgcmVhZG9ubHkgRU5BQkxFX0FVVE9fUkVGUkVTSCA9IGdldHRleHQoJ0VuYWJsZSBhdXRvIHJlZnJlc2gnKTtcbiAgcmVhZG9ubHkgREVGQVVMVF9JTlRFUlZBTF9WQUxVRSA9IERFRkFVTFRfSU5URVJWQUxfVkFMVUU7XG5cbiAgQFZpZXdDaGlsZChDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudClcbiAgY291bnRkb3duSW50ZXJ2YWxDb21wb25lbnQ6IENvdW50ZG93bkludGVydmFsQ29tcG9uZW50O1xuXG4gIEBPdXRwdXQoKVxuICBsb2FkaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2ggPSBpbmplY3QoV2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hTZXJ2aWNlKTtcblxuICBzaG93SW50ZXJ2YWxSZWZyZXNoJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihcbiAgICB0aGlzLndpZGdldEdsb2JhbEF1dG9SZWZyZXNoLmF1dG9SZWZyZXNoU2V0dGluZ3MuaXNFbmFibGVkJC5nZXRWYWx1ZSgpXG4gICk7XG4gIGF1dG9SZWZyZXNoU2Vjb25kcyQ6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+O1xuXG4gIHByaXZhdGUgaXNCdG5EaXNhYmxlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgaXNCdG5EaXNhYmxlZCQgPSB0aGlzLmlzQnRuRGlzYWJsZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuICBvbkNoYW5nZTogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc3Vic2NyaWJlT25Db3VudGRvd25DaGFuZ2VTdGF0ZSgpO1xuXG4gICAgdGhpcy5zZXRVcE9uQ291bnRkb3duRW5kZWRMaXN0ZW5lcigpO1xuICAgIHRoaXMuYXV0b1JlZnJlc2hTZWNvbmRzJCA9IHRoaXMud2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2guYXV0b1JlZnJlc2hTZXR0aW5ncy5yZWZyZXNoSW50ZXJ2YWwkO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgdG9nZ2xlSW50ZXJ2YWxSZWZyZXNoKCkge1xuICAgIHRoaXMuc2hvd0ludGVydmFsUmVmcmVzaCQubmV4dCghdGhpcy5zaG93SW50ZXJ2YWxSZWZyZXNoJC5nZXRWYWx1ZSgpKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2hvd0ludGVydmFsUmVmcmVzaCQuZ2V0VmFsdWUoKSk7XG4gICAgdGhpcy53aWRnZXRHbG9iYWxBdXRvUmVmcmVzaC5hdXRvUmVmcmVzaFNldHRpbmdzLnVzZXJEaXNhYmxlZE1hbnVhbGx5JC5uZXh0KFxuICAgICAgIXRoaXMuc2hvd0ludGVydmFsUmVmcmVzaCQuZ2V0VmFsdWUoKVxuICAgICk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICB3cml0ZVZhbHVlKHNob3dJbnRlcnZhbFJlZnJlc2g6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd0ludGVydmFsUmVmcmVzaCQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93SW50ZXJ2YWxSZWZyZXNoJC5uZXh0KHNob3dJbnRlcnZhbFJlZnJlc2gpO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZU9uQ291bnRkb3duQ2hhbmdlU3RhdGUoKSB7XG4gICAgdGhpcy53aWRnZXRHbG9iYWxBdXRvUmVmcmVzaC5jb3VudGRvd25BY3Rpb25zLnJlc2V0JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0J0bkRpc2FibGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuZW1pdChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5jb3VudGRvd25JbnRlcnZhbENvbXBvbmVudD8ucmVzZXQoKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy53aWRnZXRHbG9iYWxBdXRvUmVmcmVzaC5jb3VudGRvd25BY3Rpb25zLnN0b3AkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmlzQnRuRGlzYWJsZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLmVtaXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5jb3VudGRvd25JbnRlcnZhbENvbXBvbmVudD8uc3RvcCh0cnVlKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRVcE9uQ291bnRkb3duRW5kZWRMaXN0ZW5lcigpIHtcbiAgICB0aGlzLmNvdW50ZG93bkludGVydmFsQ29tcG9uZW50LmNvdW50ZG93bkVuZGVkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuc2hvd0ludGVydmFsUmVmcmVzaCQuZ2V0VmFsdWUoKSksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmhhbmRsZUNvdW50ZG93bkVuZGVkKCkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ291bnRkb3duRW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy53aWRnZXRHbG9iYWxBdXRvUmVmcmVzaC5jb3VudGRvd25BY3Rpb25zLmNvdW50ZG93bkVuZGVkJC5uZXh0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJ0b2dnbGUtY291bnRkb3duXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgKChzaG93SW50ZXJ2YWxSZWZyZXNoJCB8IGFzeW5jKSA/IERJU0FCTEVfQVVUT19SRUZSRVNIIDogRU5BQkxFX0FVVE9fUkVGUkVTSCkgfCB0cmFuc2xhdGVcbiAgICBcIlxuICAgIFt0b29sdGlwXT1cIlxuICAgICAgKChzaG93SW50ZXJ2YWxSZWZyZXNoJCB8IGFzeW5jKSA/IERJU0FCTEVfQVVUT19SRUZSRVNIIDogRU5BQkxFX0FVVE9fUkVGUkVTSCkgfCB0cmFuc2xhdGVcbiAgICBcIlxuICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZUludGVydmFsUmVmcmVzaCgpXCJcbiAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgbW9kZVxuICAgIFtkZWxheV09XCI1MDBcIlxuICAgIFtkaXNhYmxlZF09XCJpc0J0bkRpc2FibGVkJCB8IGFzeW5jXCJcbiAgPlxuICAgIDxjOHktY291bnRkb3duLWludGVydmFsXG4gICAgICBbaGlkZGVuXT1cIiEoc2hvd0ludGVydmFsUmVmcmVzaCQgfCBhc3luYylcIlxuICAgICAgW2NvdW50ZG93bkludGVydmFsXT1cIihhdXRvUmVmcmVzaFNlY29uZHMkIHwgYXN5bmMpID8/IERFRkFVTFRfSU5URVJWQUxfVkFMVUVcIlxuICAgID48L2M4eS1jb3VudGRvd24taW50ZXJ2YWw+XG4gICAgPGlcbiAgICAgIGM4eUljb249XCJwYXVzZVwiXG4gICAgICAqbmdJZj1cIiEoc2hvd0ludGVydmFsUmVmcmVzaCQgfCBhc3luYylcIlxuICAgID48L2k+XG4gIDwvYnV0dG9uPlxuICA8c3Bhbj48L3NwYW4+XG48L2Rpdj5cbiJdfQ==