UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

175 lines 25.8 kB
import { __decorate, __metadata } from "tslib"; import { Component, EventEmitter, HostListener, Injector, Input, Output, ViewChild } from '@angular/core'; import { Yield } from '@microsoft/windows-admin-center-sdk/core/base/decorators/yield.decorator'; import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom'; import { mergeMap, take } from 'rxjs/operators'; import { ExtensionBrokerService } from '../../service/extension-broker.service'; import { CoreBaseComponent } from '../common/base.component'; import { SME_LAYOUT_PROVIDER } from '../common/layout'; import * as i0 from "@angular/core"; import * as i1 from "../../service/extension-broker.service"; import * as i2 from "@angular/common"; import * as i3 from "../loading-wheel/loading-wheel.component"; const _c0 = ["placeholder"]; function SnapInExtensionComponent_sme_loading_wheel_2_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-loading-wheel"); } } export class SnapInExtensionComponent extends CoreBaseComponent { constructor(injector, extensionBrokerService) { super(injector); this.extensionBrokerService = extensionBrokerService; this.output = new EventEmitter(); this.layout = injector.get(SME_LAYOUT_PROVIDER, null, { optional: true }); this.loading = true; } onScroll() { this.onLayoutChanged(); } /** * The source name to use for logging */ get logSourceName() { return 'SnapInExtensionComponent'; } ngAfterViewInit() { this.subscriptions.push(this.extensionBrokerService.createSnapIn(this.extensionId).pipe(mergeMap((instance) => { this.instance = instance; if (this.input) { this.instance.call('input', 0, [this.input]).pipe(take(1)).subscribe(); } this.loading = false; // TODO: figure out if we need the timeout setTimeout(() => this.onLayoutChanged(), 200); this.scrollEventHandler = this.onLayoutChanged.bind(this); this.subscriptions.push(this.layout.layoutChanged.subscribe(() => this.onLayoutChanged())); return this.instance.listen('output'); })).subscribe(output => { if (output) { this.processEventOutput(output.data); this.output.emit(output); } })); super.ngAfterViewInit(); } ngOnDestroy() { if (this.instance) { this.instance.destroy(); } super.ngOnDestroy(); } /** * On layout changed event handler, occurs every time the layout has been changed. */ onLayoutChanged() { if (this.instance) { if (this.overflowElement) { this.overflowElement.removeEventListener('scroll', this.scrollEventHandler); } const element = this.placeholder.nativeElement; const placeholderRect = element.getBoundingClientRect(); const extensionRect = { bottom: placeholderRect.bottom, height: placeholderRect.height, left: placeholderRect.left, right: placeholderRect.right, top: placeholderRect.top, width: placeholderRect.width }; const overflowParent = Dom.getOverflowAncestor(element); if (overflowParent) { const overflowParentRect = overflowParent.getBoundingClientRect(); extensionRect.overflowParent = { scrollHeight: overflowParent.scrollHeight, scrollWidth: overflowParent.scrollWidth, clientHeight: overflowParent.clientHeight, clientWidth: overflowParent.clientWidth, top: overflowParentRect.top, right: overflowParentRect.right, bottom: overflowParentRect.bottom, left: overflowParentRect.left }; this.overflowElement = overflowParent; this.overflowElement.addEventListener('scroll', this.scrollEventHandler); } this.instance.move(extensionRect).pipe(take(1)).subscribe(); } } processEventOutput(outputData) { if (outputData) { if (outputData.deltaY) { this.overflowElement.scrollTop += outputData.deltaY; } else if (outputData.focusedElementRect) { this.handleFocusEvent(outputData.focusedElementRect); } } } handleFocusEvent(focusedRect) { const element = this.placeholder.nativeElement; const placeholderRect = element.getBoundingClientRect(); const overflowParentRect = this.overflowElement.getBoundingClientRect(); // get the focused elements location relative to the placeholder's frame const top = placeholderRect.top + focusedRect.top; const bottom = placeholderRect.top + focusedRect.bottom; const left = placeholderRect.left + focusedRect.left; const right = placeholderRect.left + focusedRect.right; // TODO: edge cases for these for example, focusRect is bigger than overflowParent if (top < overflowParentRect.top) { // above viewport, move to be under view port const deltaY = top - overflowParentRect.top; this.overflowElement.scrollTop += deltaY; } if (bottom > overflowParentRect.bottom) { // below viewport const deltaY = bottom - overflowParentRect.bottom; this.overflowElement.scrollTop += deltaY; } if (left < overflowParentRect.left) { const deltaX = left - overflowParentRect.left; this.overflowElement.scrollLeft += deltaX; } if (right > overflowParentRect.right) { const deltaX = right - overflowParentRect.right; this.overflowElement.scrollLeft += deltaX; } } } /** @nocollapse */ SnapInExtensionComponent.ɵfac = function SnapInExtensionComponent_Factory(t) { return new (t || SnapInExtensionComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.ExtensionBrokerService)); }; /** @nocollapse */ SnapInExtensionComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: SnapInExtensionComponent, selectors: [["sme-snap-in-extension"]], viewQuery: function SnapInExtensionComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.placeholder = _t.first); } }, hostBindings: function SnapInExtensionComponent_HostBindings(rf, ctx) { if (rf & 1) { i0.ɵɵlistener("scroll", function SnapInExtensionComponent_scroll_HostBindingHandler() { return ctx.onScroll(); }, false, i0.ɵɵresolveWindow); } }, inputs: { extensionId: "extensionId", input: "input" }, outputs: { output: "output" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "sme-position-stretch-v", "sme-position-stretch-h"], ["placeholder", ""], [4, "ngIf"]], template: function SnapInExtensionComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 0, 1); i0.ɵɵtemplate(2, SnapInExtensionComponent_sme_loading_wheel_2_Template, 1, 0, "sme-loading-wheel", 2); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx.loading); } }, dependencies: [i2.NgIf, i3.LoadingWheelComponent], encapsulation: 2 }); __decorate([ Yield(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], SnapInExtensionComponent.prototype, "onLayoutChanged", null); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SnapInExtensionComponent, [{ type: Component, args: [{ selector: 'sme-snap-in-extension', template: "<div #placeholder class=\"sme-position-stretch-v sme-position-stretch-h\">\r\n <sme-loading-wheel *ngIf=\"loading\"></sme-loading-wheel>\r\n</div>\r\n" }] }], function () { return [{ type: i0.Injector }, { type: i1.ExtensionBrokerService }]; }, { placeholder: [{ type: ViewChild, args: ['placeholder'] }], extensionId: [{ type: Input }], input: [{ type: Input }], output: [{ type: Output }], onScroll: [{ type: HostListener, args: ['window:scroll'] }], onLayoutChanged: [] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcC1pbi1leHRlbnNpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc25hcC1pbi1leHRlbnNpb24vc25hcC1pbi1leHRlbnNpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc25hcC1pbi1leHRlbnNpb24vc25hcC1pbi1leHRlbnNpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDWSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUM5RyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFHakcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFVLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7SUNWN0Qsb0NBQXVEOztBRGdCekQsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGlCQUFpQjtJQXFDM0QsWUFBWSxRQUFrQixFQUFVLHNCQUE4QztRQUNsRixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFEb0IsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQXJCL0UsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBd0J2RCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQWhCOEIsUUFBUTtRQUNuQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYyxhQUFhO1FBQ3ZCLE9BQU8sMEJBQTBCLENBQUM7SUFDdEMsQ0FBQztJQVNNLGVBQWU7UUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUNuRixRQUFRLENBQUMsQ0FBQyxRQUFpQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFFekIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDMUU7WUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQiwwQ0FBMEM7WUFDMUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUNaLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFDdEIsR0FBRyxDQUNOLENBQUM7WUFDRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQixJQUFJLE1BQU0sRUFBRTtnQkFDUixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1QjtRQUNMLENBQUMsQ0FDQSxDQUFDLENBQUM7UUFDUCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzNCO1FBQ0QsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUVLLGVBQWU7UUFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBRWYsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUMvRTtZQUNELE1BQU0sT0FBTyxHQUFnQixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztZQUM1RCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN4RCxNQUFNLGFBQWEsR0FBa0I7Z0JBQ2pDLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTTtnQkFDOUIsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNO2dCQUM5QixJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUk7Z0JBQzFCLEtBQUssRUFBRSxlQUFlLENBQUMsS0FBSztnQkFDNUIsR0FBRyxFQUFFLGVBQWUsQ0FBQyxHQUFHO2dCQUN4QixLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUs7YUFDL0IsQ0FBQztZQUVGLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RCxJQUFJLGNBQWMsRUFBRTtnQkFDaEIsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDbEUsYUFBYSxDQUFDLGNBQWMsR0FBRztvQkFDM0IsWUFBWSxFQUFFLGNBQWMsQ0FBQyxZQUFZO29CQUN6QyxXQUFXLEVBQUUsY0FBYyxDQUFDLFdBQVc7b0JBQ3ZDLFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWTtvQkFDekMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxXQUFXO29CQUN2QyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsR0FBRztvQkFDM0IsS0FBSyxFQUFFLGtCQUFrQixDQUFDLEtBQUs7b0JBQy9CLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNO29CQUNqQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsSUFBSTtpQkFDaEMsQ0FBQztnQkFDRixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDNUU7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDL0Q7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsVUFBd0I7UUFDL0MsSUFBSSxVQUFVLEVBQUU7WUFDWixJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDdkQ7aUJBQU0sSUFBSSxVQUFVLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUN4RDtTQUNKO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFdBQW9CO1FBQ3pDLE1BQU0sT0FBTyxHQUFnQixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUM1RCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN4RCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUV4RSx3RUFBd0U7UUFDeEUsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUN4RCxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDckQsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBRXZELGtGQUFrRjtRQUNsRixJQUFJLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsNkNBQTZDO1lBQzdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7WUFDNUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDO1NBQzVDO1FBRUQsSUFBSSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFO1lBQ3BDLGlCQUFpQjtZQUNqQixNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1lBQ2xELElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQztTQUM1QztRQUVELElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLElBQUksRUFBRTtZQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztTQUM3QztRQUVELElBQUksS0FBSyxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRTtZQUNsQyxNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1lBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztTQUM3QztJQUNMLENBQUM7O21IQW5LUSx3QkFBd0I7MEdBQXhCLHdCQUF3Qjs7Ozs7O3VHQUF4QixjQUFVOztRQ2pCdkIsaUNBQXdFO1FBQ3RFLHFHQUF1RDtRQUN6RCxpQkFBTTs7UUFEZ0IsZUFBYTtRQUFiLGtDQUFhOztBRGtHL0I7SUFBQyxLQUFLLEVBQUU7Ozs7K0RBb0NQO3VGQXRIUSx3QkFBd0I7Y0FKcEMsU0FBUzsyQkFDSSx1QkFBdUI7Z0dBVTFCLFdBQVc7a0JBRGpCLFNBQVM7bUJBQUMsYUFBYTtZQUlqQixXQUFXO2tCQURqQixLQUFLO1lBSUMsS0FBSztrQkFEWCxLQUFLO1lBSUMsTUFBTTtrQkFEWixNQUFNO1lBV3dCLFFBQVE7a0JBQXRDLFlBQVk7bUJBQUMsZUFBZTtZQXlEckIsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBZaWVsZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL3lpZWxkLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IFNuYXBJbkV4dGVuc2lvbkluc3RhbmNlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2V4dGVuc2lvbi1icm9rZXIvbW9kZWwvZXh0ZW5zaW9uLWluc3RhbmNlJztcclxuaW1wb3J0IHsgRXh0ZW5zaW9uUmVjdCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9leHRlbnNpb24tYnJva2VyL21vZGVsL2V4dGVuc2lvbi1yZWN0JztcclxuaW1wb3J0IHsgRG9tIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kb20vZG9tJztcclxuaW1wb3J0IHsgbWVyZ2VNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFNuYXBJbk91dHB1dCB9IGZyb20gJy4uLy4uL2RhdGEvZXh0ZW5zaW9uLWJyb2tlci9zbmFwLWluLWxpc3RlbmVyJztcclxuaW1wb3J0IHsgRXh0ZW5zaW9uQnJva2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvZXh0ZW5zaW9uLWJyb2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYXlvdXQsIFNNRV9MQVlPVVRfUFJPVklERVIgfSBmcm9tICcuLi9jb21tb24vbGF5b3V0JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtc25hcC1pbi1leHRlbnNpb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NuYXAtaW4tZXh0ZW5zaW9uLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU25hcEluRXh0ZW5zaW9uQ29tcG9uZW50IGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uSW5pdCB7XHJcbiAgICAvKipcclxuICAgICogSW5qZWN0ZWQgQHNlZSBMYXlvdXQgcGFyZW50IGluc3RhbmNlIGJvdW5kIHRvIHRoaXMgY29tcG9uZW50LlxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgbGF5b3V0OiBMYXlvdXQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgncGxhY2Vob2xkZXInKVxyXG4gICAgcHVibGljIHBsYWNlaG9sZGVyOiBhbnk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBleHRlbnNpb25JZDogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaW5wdXQ6IGFueTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBvdXRwdXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgcHVibGljIGluc3RhbmNlOiBTbmFwSW5FeHRlbnNpb25JbnN0YW5jZTtcclxuXHJcbiAgICBwdWJsaWMgbG9hZGluZzogYm9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgb3ZlcmZsb3dFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBwdWJsaWMgc2Nyb2xsRXZlbnRIYW5kbGVyOiAoKSA9PiB2b2lkO1xyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKSBvblNjcm9sbCgpIHtcclxuICAgICAgICB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdTbmFwSW5FeHRlbnNpb25Db21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSBleHRlbnNpb25Ccm9rZXJTZXJ2aWNlOiBFeHRlbnNpb25Ccm9rZXJTZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLmxheW91dCA9IGluamVjdG9yLmdldChTTUVfTEFZT1VUX1BST1ZJREVSLCBudWxsLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmV4dGVuc2lvbkJyb2tlclNlcnZpY2UuY3JlYXRlU25hcEluKHRoaXMuZXh0ZW5zaW9uSWQpLnBpcGUoXHJcbiAgICAgICAgICAgIG1lcmdlTWFwKChpbnN0YW5jZTogU25hcEluRXh0ZW5zaW9uSW5zdGFuY2UpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuY2FsbCgnaW5wdXQnLCAwLCBbdGhpcy5pbnB1dF0pLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGlmIHdlIG5lZWQgdGhlIHRpbWVvdXRcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIDIwMFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRXZlbnRIYW5kbGVyID0gdGhpcy5vbkxheW91dENoYW5nZWQuYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0LmxheW91dENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMub25MYXlvdXRDaGFuZ2VkKCkpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLmxpc3Rlbignb3V0cHV0Jyk7XHJcbiAgICAgICAgICAgIH0pKS5zdWJzY3JpYmUob3V0cHV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvdXRwdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFdmVudE91dHB1dChvdXRwdXQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRwdXQuZW1pdChvdXRwdXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICkpO1xyXG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9uIGxheW91dCBjaGFuZ2VkIGV2ZW50IGhhbmRsZXIsIG9jY3VycyBldmVyeSB0aW1lIHRoZSBsYXlvdXQgaGFzIGJlZW4gY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgb25MYXlvdXRDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vdmVyZmxvd0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gPEhUTUxFbGVtZW50PnRoaXMucGxhY2Vob2xkZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uUmVjdDogRXh0ZW5zaW9uUmVjdCA9IHtcclxuICAgICAgICAgICAgICAgIGJvdHRvbTogcGxhY2Vob2xkZXJSZWN0LmJvdHRvbSxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcGxhY2Vob2xkZXJSZWN0LmhlaWdodCxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IHBsYWNlaG9sZGVyUmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgcmlnaHQ6IHBsYWNlaG9sZGVyUmVjdC5yaWdodCxcclxuICAgICAgICAgICAgICAgIHRvcDogcGxhY2Vob2xkZXJSZWN0LnRvcCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiBwbGFjZWhvbGRlclJlY3Qud2lkdGhcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG92ZXJmbG93UGFyZW50ID0gRG9tLmdldE92ZXJmbG93QW5jZXN0b3IoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChvdmVyZmxvd1BhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmZsb3dQYXJlbnRSZWN0ID0gb3ZlcmZsb3dQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBleHRlbnNpb25SZWN0Lm92ZXJmbG93UGFyZW50ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbEhlaWdodDogb3ZlcmZsb3dQYXJlbnQuc2Nyb2xsSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFdpZHRoOiBvdmVyZmxvd1BhcmVudC5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRIZWlnaHQ6IG92ZXJmbG93UGFyZW50LmNsaWVudEhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRXaWR0aDogb3ZlcmZsb3dQYXJlbnQuY2xpZW50V2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBvdmVyZmxvd1BhcmVudFJlY3QudG9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBvdmVyZmxvd1BhcmVudFJlY3QucmlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiBvdmVyZmxvd1BhcmVudFJlY3QuYm90dG9tLFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IG92ZXJmbG93UGFyZW50UmVjdC5sZWZ0XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVyZmxvd0VsZW1lbnQgPSBvdmVyZmxvd1BhcmVudDtcclxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLm1vdmUoZXh0ZW5zaW9uUmVjdCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzRXZlbnRPdXRwdXQob3V0cHV0RGF0YTogU25hcEluT3V0cHV0KSB7XHJcbiAgICAgICAgaWYgKG91dHB1dERhdGEpIHtcclxuICAgICAgICAgICAgaWYgKG91dHB1dERhdGEuZGVsdGFZKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJmbG93RWxlbWVudC5zY3JvbGxUb3AgKz0gb3V0cHV0RGF0YS5kZWx0YVk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0RGF0YS5mb2N1c2VkRWxlbWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRm9jdXNFdmVudChvdXRwdXREYXRhLmZvY3VzZWRFbGVtZW50UmVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVGb2N1c0V2ZW50KGZvY3VzZWRSZWN0OiBET01SZWN0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IDxIVE1MRWxlbWVudD50aGlzLnBsYWNlaG9sZGVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBvdmVyZmxvd1BhcmVudFJlY3QgPSB0aGlzLm92ZXJmbG93RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgLy8gZ2V0IHRoZSBmb2N1c2VkIGVsZW1lbnRzIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBwbGFjZWhvbGRlcidzIGZyYW1lXHJcbiAgICAgICAgY29uc3QgdG9wID0gcGxhY2Vob2xkZXJSZWN0LnRvcCArIGZvY3VzZWRSZWN0LnRvcDtcclxuICAgICAgICBjb25zdCBib3R0b20gPSBwbGFjZWhvbGRlclJlY3QudG9wICsgZm9jdXNlZFJlY3QuYm90dG9tO1xyXG4gICAgICAgIGNvbnN0IGxlZnQgPSBwbGFjZWhvbGRlclJlY3QubGVmdCArIGZvY3VzZWRSZWN0LmxlZnQ7XHJcbiAgICAgICAgY29uc3QgcmlnaHQgPSBwbGFjZWhvbGRlclJlY3QubGVmdCArIGZvY3VzZWRSZWN0LnJpZ2h0O1xyXG5cclxuICAgICAgICAvLyBUT0RPOiBlZGdlIGNhc2VzIGZvciB0aGVzZSBmb3IgZXhhbXBsZSwgZm9jdXNSZWN0IGlzIGJpZ2dlciB0aGFuIG92ZXJmbG93UGFyZW50XHJcbiAgICAgICAgaWYgKHRvcCA8IG92ZXJmbG93UGFyZW50UmVjdC50b3ApIHtcclxuICAgICAgICAgICAgLy8gYWJvdmUgdmlld3BvcnQsIG1vdmUgdG8gYmUgdW5kZXIgdmlldyBwb3J0XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IHRvcCAtIG92ZXJmbG93UGFyZW50UmVjdC50b3A7XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LnNjcm9sbFRvcCArPSBkZWx0YVk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYm90dG9tID4gb3ZlcmZsb3dQYXJlbnRSZWN0LmJvdHRvbSkge1xyXG4gICAgICAgICAgICAvLyBiZWxvdyB2aWV3cG9ydFxyXG4gICAgICAgICAgICBjb25zdCBkZWx0YVkgPSBib3R0b20gLSBvdmVyZmxvd1BhcmVudFJlY3QuYm90dG9tO1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJmbG93RWxlbWVudC5zY3JvbGxUb3AgKz0gZGVsdGFZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxlZnQgPCBvdmVyZmxvd1BhcmVudFJlY3QubGVmdCkge1xyXG4gICAgICAgICAgICBjb25zdCBkZWx0YVggPSBsZWZ0IC0gb3ZlcmZsb3dQYXJlbnRSZWN0LmxlZnQ7XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LnNjcm9sbExlZnQgKz0gZGVsdGFYO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJpZ2h0ID4gb3ZlcmZsb3dQYXJlbnRSZWN0LnJpZ2h0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWCA9IHJpZ2h0IC0gb3ZlcmZsb3dQYXJlbnRSZWN0LnJpZ2h0O1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJmbG93RWxlbWVudC5zY3JvbGxMZWZ0ICs9IGRlbHRhWDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjcGxhY2Vob2xkZXIgY2xhc3M9XCJzbWUtcG9zaXRpb24tc3RyZXRjaC12IHNtZS1wb3NpdGlvbi1zdHJldGNoLWhcIj5cclxuICA8c21lLWxvYWRpbmctd2hlZWwgKm5nSWY9XCJsb2FkaW5nXCI+PC9zbWUtbG9hZGluZy13aGVlbD5cclxuPC9kaXY+XHJcbiJdfQ==