UNPKG

angular-duo-pane

Version:

A library for Angular projects to easily add a two pane view for desktops, foldables and dual screen devices.

221 lines 29.4 kB
import { __decorate } from "tslib"; import { ComponentFactoryResolver, ComponentRef, Directive, EventEmitter, Input, Output, TemplateRef, ViewContainerRef } from '@angular/core'; import { DuoPaneComponent } from '../components/duo-pane/duo-pane.component'; import { DuoPaneInformationService } from '../services/duo-pane-information.service'; import { Segment } from '../models/Segment'; let DuoPaneDirective = class DuoPaneDirective { constructor(componentfactoryResolver, templateRef, viewContainer, dualScreenInformationService) { this.componentfactoryResolver = componentfactoryResolver; this.templateRef = templateRef; this.viewContainer = viewContainer; this.dualScreenInformationService = dualScreenInformationService; this.secondaryPaneTemplateRef = null; this.EnsureSecondaryPaneVisible = false; /* Variables set to control two pane if only one window segment is available-*/ this.TwoPaneMinWidthSingleSegment = 0; this.TwoPaneMinHeightSingleSegment = 0; this.TwoPaneSpanningModeSingleSegment = 'none'; this.PrimaryPanePercentageSingleSegment = 50; this.paneFactory = this.componentfactoryResolver.resolveComponentFactory(DuoPaneComponent); this.primaryPaneRef = null; this.secondaryPaneRef = null; this.secondaryPaneVisibilityHandler = new EventEmitter(); this.secondaryPaneVisible = undefined; dualScreenInformationService.addEventListener('change', () => { this.updateView(); }); this.updateView(); } get primaryPanePercentageSingleSegment() { return this.PrimaryPanePercentageSingleSegment; } set primaryPanePercentageSingleSegment(value) { if (typeof value === 'string') { const fractionValue = Number(value); if (!isNaN(fractionValue) && fractionValue >= 0 && fractionValue <= 100) { this.PrimaryPanePercentageSingleSegment = fractionValue; this.updateView(); } } else if (typeof value === 'number') { if (value >= 0 && value <= 100) { this.PrimaryPanePercentageSingleSegment = value; this.updateView(); } } } set secondaryPane(secondaryPane) { this.secondaryPaneTemplateRef = secondaryPane; this.destroySecondaryPaneRef(); this.updateView(); } destroySecondaryPaneRef() { if (this.secondaryPaneRef) { const secondaryPaneIndex = this.viewContainer.indexOf(this.secondaryPaneRef.hostView); if (secondaryPaneIndex >= 0) { this.viewContainer.remove(secondaryPaneIndex); } this.secondaryPaneRef.destroy(); this.secondaryPaneRef = null; } } destroyPrimaryPaneRef() { if (this.primaryPaneRef) { const primaryPaneIndex = this.viewContainer.indexOf(this.primaryPaneRef.hostView); if (primaryPaneIndex >= 0) { this.viewContainer.remove(primaryPaneIndex); } this.primaryPaneRef.destroy(); this.primaryPaneRef = null; } } set ensureSecondaryPaneVisible(value) { this.EnsureSecondaryPaneVisible = value; this.updateView(); } set twoPaneMinWidthSingleSegment(minWidth) { if (typeof minWidth === 'string') { const minWidthValue = Number(minWidth); if (minWidthValue >= 0 && !isNaN(minWidthValue)) { this.TwoPaneMinWidthSingleSegment = minWidthValue; this.updateView(); } } else if (typeof minWidth === 'number' && minWidth >= 0) { this.TwoPaneMinWidthSingleSegment = minWidth; this.updateView(); } } set twoPaneMinHeightSingleSegment(minHeight) { if (typeof minHeight === 'string') { const minHeightValue = Number(minHeight); if (minHeightValue >= 0 && !isNaN(minHeightValue)) { this.TwoPaneMinHeightSingleSegment = minHeightValue; this.updateView(); } } else if (typeof minHeight === 'number' && minHeight >= 0) { this.TwoPaneMinHeightSingleSegment = minHeight; this.updateView(); } } set twoPaneSpanningModeSingleSegment(spanningMode) { if (spanningMode) { this.TwoPaneSpanningModeSingleSegment = spanningMode; this.updateView(); } } emitSecondaryPaneVisibility(visible) { if (this.secondaryPaneVisible === undefined || this.secondaryPaneVisible === null || visible !== this.secondaryPaneVisible) { this.secondaryPaneVisible = visible; this.secondaryPaneVisibilityHandler.emit(visible); } } updateView() { /*this.viewContainer.createEmbeddedView(this.templateRef); if(this.secondaryPaneTemplateRef != null) { this.viewContainer.createEmbeddedView(this.secondaryPaneTemplateRef); }*/ const windowSegements = this.dualScreenInformationService.windowSegments; if (windowSegements.length > 0) { if (windowSegements.length > 1) { this.renderDualPanes(this.dualScreenInformationService.getTwoLargestSegments()); } else if (windowSegements[0].height >= this.TwoPaneMinHeightSingleSegment && windowSegements[0].width >= this.TwoPaneMinWidthSingleSegment && this.TwoPaneSpanningModeSingleSegment !== 'none') { this.renderBothPanes(windowSegements[0]); } else { if (this.EnsureSecondaryPaneVisible) { this.destroyPrimaryPaneRef(); this.renderSecondaryPane(windowSegements[0]); } else { this.destroySecondaryPaneRef(); this.renderPrimaryPane(windowSegements[0]); this.emitSecondaryPaneVisibility(false); } } } } renderBothPanes(windowSegment) { let primarySegment; let secondarySegment; if (this.TwoPaneSpanningModeSingleSegment === 'single-fold-horizontal') { const fraction = this.PrimaryPanePercentageSingleSegment / 100; primarySegment = new Segment(windowSegment.width, windowSegment.height * fraction, 0, 0); secondarySegment = new Segment(windowSegment.width, windowSegment.height * (1 - fraction), windowSegment.height * fraction, 0); } else if (this.TwoPaneSpanningModeSingleSegment === 'single-fold-vertical') { const fraction = this.PrimaryPanePercentageSingleSegment / 100; primarySegment = new Segment(windowSegment.width * fraction, windowSegment.height, 0, 0); secondarySegment = new Segment(windowSegment.width * (1 - fraction), windowSegment.height, 0, windowSegment.width * fraction); } else { return; } this.renderDualPanes([primarySegment, secondarySegment]); } renderDualPanes(windowSegments) { if (windowSegments.length > 0) { this.renderPrimaryPane(windowSegments[0]); } if (windowSegments.length > 1) { this.renderSecondaryPane(windowSegments[1]); } } renderPrimaryPane(segment) { // const paneFactory = this.componentfactoryResolver.resolveComponentFactory(PrimaryPaneComponent); if (!this.primaryPaneRef) { this.primaryPaneRef = this.viewContainer.createComponent(this.paneFactory); } this.primaryPaneRef.instance.segment = segment; this.primaryPaneRef.instance.contentTemplateRef = this.templateRef; } renderSecondaryPane(segment) { if (this.secondaryPaneTemplateRef !== null && this.secondaryPaneTemplateRef !== undefined) { // const paneFactory = this.componentfactoryResolver.resolveComponentFactory(PrimaryPaneComponent); if (!this.secondaryPaneRef) { this.secondaryPaneRef = this.viewContainer.createComponent(this.paneFactory); } this.secondaryPaneRef.instance.segment = segment; this.secondaryPaneRef.instance.contentTemplateRef = this.secondaryPaneTemplateRef; this.emitSecondaryPaneVisibility(true); } } }; DuoPaneDirective.ctorParameters = () => [ { type: ComponentFactoryResolver }, { type: TemplateRef }, { type: ViewContainerRef }, { type: DuoPaneInformationService } ]; __decorate([ Input() ], DuoPaneDirective.prototype, "primaryPanePercentageSingleSegment", null); __decorate([ Output() ], DuoPaneDirective.prototype, "secondaryPaneVisibilityHandler", void 0); __decorate([ Input() ], DuoPaneDirective.prototype, "secondaryPane", null); __decorate([ Input() ], DuoPaneDirective.prototype, "ensureSecondaryPaneVisible", null); __decorate([ Input() ], DuoPaneDirective.prototype, "twoPaneMinWidthSingleSegment", null); __decorate([ Input() ], DuoPaneDirective.prototype, "twoPaneMinHeightSingleSegment", null); __decorate([ Input() ], DuoPaneDirective.prototype, "twoPaneSpanningModeSingleSegment", null); DuoPaneDirective = __decorate([ Directive({ selector: '[duoPane]' }) ], DuoPaneDirective); export { DuoPaneDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVvLXBhbmUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1kdW8tcGFuZS8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2R1by1wYW5lLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlJLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBR3JGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUs1QyxJQUFhLGdCQUFnQixHQUE3QixNQUFhLGdCQUFnQjtJQW1DM0IsWUFDVSx3QkFBa0QsRUFDbEQsV0FBNkIsRUFDN0IsYUFBK0IsRUFDL0IsNEJBQXVEO1FBSHZELDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixpQ0FBNEIsR0FBNUIsNEJBQTRCLENBQTJCO1FBckN6RCw2QkFBd0IsR0FBcUIsSUFBSSxDQUFDO1FBQ2xELCtCQUEwQixHQUFHLEtBQUssQ0FBQztRQUUzQywrRUFBK0U7UUFDdkUsaUNBQTRCLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLGtDQUE2QixHQUFHLENBQUMsQ0FBQztRQUNsQyxxQ0FBZ0MsR0FBRyxNQUFNLENBQUM7UUFDMUMsdUNBQWtDLEdBQUcsRUFBRSxDQUFDO1FBcUIvQixnQkFBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQy9GLG1CQUFjLEdBQW1DLElBQUksQ0FBQztRQUN0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OztZQTFMcUMsd0JBQXdCO1lBQ3JDLFdBQVc7WUFDVCxnQkFBZ0I7WUFDRCx5QkFBeUI7O0FBMUJ4RDtJQUFSLEtBQUssRUFBRTswRUFnQlA7QUFtQlM7SUFBVCxNQUFNLEVBQUU7d0VBQXFFO0FBUXJFO0lBQVIsS0FBSyxFQUFFO3FEQUlQO0FBd0JRO0lBQVIsS0FBSyxFQUFFO2tFQUdQO0FBRVE7SUFBUixLQUFLLEVBQUU7b0VBYVA7QUFFUTtJQUFSLEtBQUssRUFBRTtxRUFZUDtBQUlRO0lBQVIsS0FBSyxFQUFFO3dFQUtQO0FBN0hVLGdCQUFnQjtJQUg1QixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsV0FBVztLQUN0QixDQUFDO0dBQ1csZ0JBQWdCLENBOE41QjtTQTlOWSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZiwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEdW9QYW5lQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9kdW8tcGFuZS9kdW8tcGFuZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHVvUGFuZUluZm9ybWF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2R1by1wYW5lLWluZm9ybWF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Bhbm5pbmdNb2RlIH0gZnJvbSAnLi4vbW9kZWxzL1NwYW5uaW5nTW9kZSc7XG5pbXBvcnQgeyBJU2VnbWVudCB9IGZyb20gJy4uL21vZGVscy9JU2VnbWVudCc7XG5pbXBvcnQgeyBTZWdtZW50IH0gZnJvbSAnLi4vbW9kZWxzL1NlZ21lbnQnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZHVvUGFuZV0nXG59KVxuZXhwb3J0IGNsYXNzIER1b1BhbmVEaXJlY3RpdmUge1xuXG4gIHByaXZhdGUgc2Vjb25kYXJ5UGFuZVRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcbiAgcHJpdmF0ZSBFbnN1cmVTZWNvbmRhcnlQYW5lVmlzaWJsZSA9IGZhbHNlO1xuXG4gIC8qIFZhcmlhYmxlcyBzZXQgdG8gY29udHJvbCB0d28gcGFuZSBpZiBvbmx5IG9uZSB3aW5kb3cgc2VnbWVudCBpcyBhdmFpbGFibGUtKi9cbiAgcHJpdmF0ZSBUd29QYW5lTWluV2lkdGhTaW5nbGVTZWdtZW50ID0gMDtcbiAgcHJpdmF0ZSBUd29QYW5lTWluSGVpZ2h0U2luZ2xlU2VnbWVudCA9IDA7XG4gIHByaXZhdGUgVHdvUGFuZVNwYW5uaW5nTW9kZVNpbmdsZVNlZ21lbnQgPSAnbm9uZSc7XG4gIHByaXZhdGUgUHJpbWFyeVBhbmVQZXJjZW50YWdlU2luZ2xlU2VnbWVudCA9IDUwO1xuICBwdWJsaWMgZ2V0IHByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuUHJpbWFyeVBhbmVQZXJjZW50YWdlU2luZ2xlU2VnbWVudDtcbiAgfVxuICBASW5wdXQoKSBwdWJsaWMgc2V0IHByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBmcmFjdGlvblZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICghaXNOYU4oZnJhY3Rpb25WYWx1ZSkgJiYgZnJhY3Rpb25WYWx1ZSA+PSAwICYmIGZyYWN0aW9uVmFsdWUgPD0gMTAwKSB7XG4gICAgICAgIHRoaXMuUHJpbWFyeVBhbmVQZXJjZW50YWdlU2luZ2xlU2VnbWVudCA9IGZyYWN0aW9uVmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDEwMCkge1xuICAgICAgICB0aGlzLlByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG5cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBwYW5lRmFjdG9yeSA9IHRoaXMuY29tcG9uZW50ZmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KER1b1BhbmVDb21wb25lbnQpO1xuICBwcml2YXRlIHByaW1hcnlQYW5lUmVmOiBDb21wb25lbnRSZWY8RHVvUGFuZUNvbXBvbmVudD4gPSBudWxsO1xuICBwcml2YXRlIHNlY29uZGFyeVBhbmVSZWY6IENvbXBvbmVudFJlZjxEdW9QYW5lQ29tcG9uZW50PiA9IG51bGw7XG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbXBvbmVudGZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgZHVhbFNjcmVlbkluZm9ybWF0aW9uU2VydmljZTogRHVvUGFuZUluZm9ybWF0aW9uU2VydmljZSkge1xuICAgIGR1YWxTY3JlZW5JbmZvcm1hdGlvblNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcblxuICB9XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBzZWNvbmRhcnlQYW5lVmlzaWJpbGl0eUhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cblxuXG4gIHByaXZhdGUgc2Vjb25kYXJ5UGFuZVZpc2libGU6IGJvb2xlYW4gPSB1bmRlZmluZWQ7XG5cblxuXG4gIEBJbnB1dCgpIHNldCBzZWNvbmRhcnlQYW5lKHNlY29uZGFyeVBhbmU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICB0aGlzLnNlY29uZGFyeVBhbmVUZW1wbGF0ZVJlZiA9IHNlY29uZGFyeVBhbmU7XG4gICAgdGhpcy5kZXN0cm95U2Vjb25kYXJ5UGFuZVJlZigpO1xuICAgIHRoaXMudXBkYXRlVmlldygpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95U2Vjb25kYXJ5UGFuZVJlZigpIHtcbiAgICBpZiAodGhpcy5zZWNvbmRhcnlQYW5lUmVmKSB7XG4gICAgICBjb25zdCBzZWNvbmRhcnlQYW5lSW5kZXggPSB0aGlzLnZpZXdDb250YWluZXIuaW5kZXhPZih0aGlzLnNlY29uZGFyeVBhbmVSZWYuaG9zdFZpZXcpO1xuICAgICAgaWYgKHNlY29uZGFyeVBhbmVJbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5yZW1vdmUoc2Vjb25kYXJ5UGFuZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2Vjb25kYXJ5UGFuZVJlZi5kZXN0cm95KCk7XG4gICAgICB0aGlzLnNlY29uZGFyeVBhbmVSZWYgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVByaW1hcnlQYW5lUmVmKCkge1xuICAgIGlmICh0aGlzLnByaW1hcnlQYW5lUmVmKSB7XG4gICAgICBjb25zdCBwcmltYXJ5UGFuZUluZGV4ID0gdGhpcy52aWV3Q29udGFpbmVyLmluZGV4T2YodGhpcy5wcmltYXJ5UGFuZVJlZi5ob3N0Vmlldyk7XG4gICAgICBpZiAocHJpbWFyeVBhbmVJbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5yZW1vdmUocHJpbWFyeVBhbmVJbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLnByaW1hcnlQYW5lUmVmLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMucHJpbWFyeVBhbmVSZWYgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBlbnN1cmVTZWNvbmRhcnlQYW5lVmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuRW5zdXJlU2Vjb25kYXJ5UGFuZVZpc2libGUgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0d29QYW5lTWluV2lkdGhTaW5nbGVTZWdtZW50KG1pbldpZHRoOiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIG1pbldpZHRoID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbWluV2lkdGhWYWx1ZSA9IE51bWJlcihtaW5XaWR0aCk7XG4gICAgICBpZiAobWluV2lkdGhWYWx1ZSA+PSAwICYmICFpc05hTihtaW5XaWR0aFZhbHVlKSkge1xuICAgICAgICB0aGlzLlR3b1BhbmVNaW5XaWR0aFNpbmdsZVNlZ21lbnQgPSBtaW5XaWR0aFZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1pbldpZHRoID09PSAnbnVtYmVyJyAmJiBtaW5XaWR0aCA+PSAwKSB7XG4gICAgICB0aGlzLlR3b1BhbmVNaW5XaWR0aFNpbmdsZVNlZ21lbnQgPSBtaW5XaWR0aDtcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIH1cblxuICB9XG5cbiAgQElucHV0KCkgc2V0IHR3b1BhbmVNaW5IZWlnaHRTaW5nbGVTZWdtZW50KG1pbkhlaWdodDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBtaW5IZWlnaHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBtaW5IZWlnaHRWYWx1ZSA9IE51bWJlcihtaW5IZWlnaHQpO1xuICAgICAgaWYgKG1pbkhlaWdodFZhbHVlID49IDAgJiYgIWlzTmFOKG1pbkhlaWdodFZhbHVlKSkge1xuICAgICAgICB0aGlzLlR3b1BhbmVNaW5IZWlnaHRTaW5nbGVTZWdtZW50ID0gbWluSGVpZ2h0VmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWluSGVpZ2h0ID09PSAnbnVtYmVyJyAmJiBtaW5IZWlnaHQgPj0gMCkge1xuICAgICAgdGhpcy5Ud29QYW5lTWluSGVpZ2h0U2luZ2xlU2VnbWVudCA9IG1pbkhlaWdodDtcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIH1cbiAgfVxuXG5cblxuICBASW5wdXQoKSBzZXQgdHdvUGFuZVNwYW5uaW5nTW9kZVNpbmdsZVNlZ21lbnQoc3Bhbm5pbmdNb2RlOiBTcGFubmluZ01vZGUpIHtcbiAgICBpZiAoc3Bhbm5pbmdNb2RlKSB7XG4gICAgICB0aGlzLlR3b1BhbmVTcGFubmluZ01vZGVTaW5nbGVTZWdtZW50ID0gc3Bhbm5pbmdNb2RlO1xuICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2Vjb25kYXJ5UGFuZVZpc2liaWxpdHkodmlzaWJsZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLnNlY29uZGFyeVBhbmVWaXNpYmxlID09PSB1bmRlZmluZWQgfHwgdGhpcy5zZWNvbmRhcnlQYW5lVmlzaWJsZSA9PT0gbnVsbCB8fCB2aXNpYmxlICE9PSB0aGlzLnNlY29uZGFyeVBhbmVWaXNpYmxlKSB7XG4gICAgICB0aGlzLnNlY29uZGFyeVBhbmVWaXNpYmxlID0gdmlzaWJsZTtcbiAgICAgIHRoaXMuc2Vjb25kYXJ5UGFuZVZpc2liaWxpdHlIYW5kbGVyLmVtaXQodmlzaWJsZSk7XG4gICAgfVxuICB9XG5cblxuXG4gIHByaXZhdGUgdXBkYXRlVmlldygpIHtcblxuICAgIC8qdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlUmVmKTtcbiAgICBpZih0aGlzLnNlY29uZGFyeVBhbmVUZW1wbGF0ZVJlZiAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5zZWNvbmRhcnlQYW5lVGVtcGxhdGVSZWYpO1xuICAgIH0qL1xuICAgIGNvbnN0IHdpbmRvd1NlZ2VtZW50cyA9IHRoaXMuZHVhbFNjcmVlbkluZm9ybWF0aW9uU2VydmljZS53aW5kb3dTZWdtZW50cztcbiAgICBpZiAod2luZG93U2VnZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh3aW5kb3dTZWdlbWVudHMubGVuZ3RoID4gMSkge1xuXG4gICAgICAgIHRoaXMucmVuZGVyRHVhbFBhbmVzKHRoaXMuZHVhbFNjcmVlbkluZm9ybWF0aW9uU2VydmljZS5nZXRUd29MYXJnZXN0U2VnbWVudHMoKSk7XG5cbiAgICAgIH0gZWxzZSBpZiAod2luZG93U2VnZW1lbnRzWzBdLmhlaWdodCA+PSB0aGlzLlR3b1BhbmVNaW5IZWlnaHRTaW5nbGVTZWdtZW50XG4gICAgICAgICYmIHdpbmRvd1NlZ2VtZW50c1swXS53aWR0aCA+PSB0aGlzLlR3b1BhbmVNaW5XaWR0aFNpbmdsZVNlZ21lbnRcbiAgICAgICAgJiYgdGhpcy5Ud29QYW5lU3Bhbm5pbmdNb2RlU2luZ2xlU2VnbWVudCAhPT0gJ25vbmUnKSB7XG4gICAgICAgIHRoaXMucmVuZGVyQm90aFBhbmVzKHdpbmRvd1NlZ2VtZW50c1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5FbnN1cmVTZWNvbmRhcnlQYW5lVmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMuZGVzdHJveVByaW1hcnlQYW5lUmVmKCk7XG4gICAgICAgICAgdGhpcy5yZW5kZXJTZWNvbmRhcnlQYW5lKHdpbmRvd1NlZ2VtZW50c1swXSk7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICB0aGlzLmRlc3Ryb3lTZWNvbmRhcnlQYW5lUmVmKCk7XG4gICAgICAgICAgdGhpcy5yZW5kZXJQcmltYXJ5UGFuZSh3aW5kb3dTZWdlbWVudHNbMF0pO1xuICAgICAgICAgIHRoaXMuZW1pdFNlY29uZGFyeVBhbmVWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJCb3RoUGFuZXMod2luZG93U2VnbWVudDogSVNlZ21lbnQpIHtcbiAgICBsZXQgcHJpbWFyeVNlZ21lbnQ6IElTZWdtZW50O1xuICAgIGxldCBzZWNvbmRhcnlTZWdtZW50OiBJU2VnbWVudDtcbiAgICBpZiAodGhpcy5Ud29QYW5lU3Bhbm5pbmdNb2RlU2luZ2xlU2VnbWVudCA9PT0gJ3NpbmdsZS1mb2xkLWhvcml6b250YWwnKSB7XG4gICAgICBjb25zdCBmcmFjdGlvbiA9IHRoaXMuUHJpbWFyeVBhbmVQZXJjZW50YWdlU2luZ2xlU2VnbWVudCAvIDEwMDtcbiAgICAgIHByaW1hcnlTZWdtZW50ID0gbmV3IFNlZ21lbnQod2luZG93U2VnbWVudC53aWR0aCwgd2luZG93U2VnbWVudC5oZWlnaHQgKiBmcmFjdGlvbiwgMCwgMCk7XG4gICAgICBzZWNvbmRhcnlTZWdtZW50ID0gbmV3IFNlZ21lbnQod2luZG93U2VnbWVudC53aWR0aCwgd2luZG93U2VnbWVudC5oZWlnaHQgKiAoMSAtIGZyYWN0aW9uKSwgd2luZG93U2VnbWVudC5oZWlnaHQgKiBmcmFjdGlvbiwgMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLlR3b1BhbmVTcGFubmluZ01vZGVTaW5nbGVTZWdtZW50ID09PSAnc2luZ2xlLWZvbGQtdmVydGljYWwnKSB7XG4gICAgICBjb25zdCBmcmFjdGlvbiA9IHRoaXMuUHJpbWFyeVBhbmVQZXJjZW50YWdlU2luZ2xlU2VnbWVudCAvIDEwMDtcbiAgICAgIHByaW1hcnlTZWdtZW50ID0gbmV3IFNlZ21lbnQod2luZG93U2VnbWVudC53aWR0aCAqIGZyYWN0aW9uLCB3aW5kb3dTZWdtZW50LmhlaWdodCwgMCwgMCk7XG4gICAgICBzZWNvbmRhcnlTZWdtZW50ID0gbmV3IFNlZ21lbnQod2luZG93U2VnbWVudC53aWR0aCAqICgxIC0gZnJhY3Rpb24pLCB3aW5kb3dTZWdtZW50LmhlaWdodCwgMCwgd2luZG93U2VnbWVudC53aWR0aCAqIGZyYWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyRHVhbFBhbmVzKFtwcmltYXJ5U2VnbWVudCwgc2Vjb25kYXJ5U2VnbWVudF0pO1xuXG4gIH1cblxuICBwcml2YXRlIHJlbmRlckR1YWxQYW5lcyh3aW5kb3dTZWdtZW50czogSVNlZ21lbnRbXSkge1xuICAgIGlmICh3aW5kb3dTZWdtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlbmRlclByaW1hcnlQYW5lKHdpbmRvd1NlZ21lbnRzWzBdKTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93U2VnbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5yZW5kZXJTZWNvbmRhcnlQYW5lKHdpbmRvd1NlZ21lbnRzWzFdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclByaW1hcnlQYW5lKHNlZ21lbnQ6IElTZWdtZW50KSB7XG4gICAgLy8gY29uc3QgcGFuZUZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudGZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShQcmltYXJ5UGFuZUNvbXBvbmVudCk7XG4gICAgaWYgKCF0aGlzLnByaW1hcnlQYW5lUmVmKSB7XG4gICAgICB0aGlzLnByaW1hcnlQYW5lUmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudCh0aGlzLnBhbmVGYWN0b3J5KTtcblxuICAgIH1cblxuICAgIHRoaXMucHJpbWFyeVBhbmVSZWYuaW5zdGFuY2Uuc2VnbWVudCA9IHNlZ21lbnQ7XG4gICAgdGhpcy5wcmltYXJ5UGFuZVJlZi5pbnN0YW5jZS5jb250ZW50VGVtcGxhdGVSZWYgPSB0aGlzLnRlbXBsYXRlUmVmO1xuXG4gIH1cblxuICBwcml2YXRlIHJlbmRlclNlY29uZGFyeVBhbmUoc2VnbWVudDogSVNlZ21lbnQpIHtcbiAgICBpZiAodGhpcy5zZWNvbmRhcnlQYW5lVGVtcGxhdGVSZWYgIT09IG51bGwgJiYgdGhpcy5zZWNvbmRhcnlQYW5lVGVtcGxhdGVSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gY29uc3QgcGFuZUZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudGZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShQcmltYXJ5UGFuZUNvbXBvbmVudCk7XG4gICAgICBpZiAoIXRoaXMuc2Vjb25kYXJ5UGFuZVJlZikge1xuICAgICAgICB0aGlzLnNlY29uZGFyeVBhbmVSZWYgPSB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KHRoaXMucGFuZUZhY3RvcnkpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWNvbmRhcnlQYW5lUmVmLmluc3RhbmNlLnNlZ21lbnQgPSBzZWdtZW50O1xuICAgICAgdGhpcy5zZWNvbmRhcnlQYW5lUmVmLmluc3RhbmNlLmNvbnRlbnRUZW1wbGF0ZVJlZiA9IHRoaXMuc2Vjb25kYXJ5UGFuZVRlbXBsYXRlUmVmO1xuICAgICAgdGhpcy5lbWl0U2Vjb25kYXJ5UGFuZVZpc2liaWxpdHkodHJ1ZSk7XG4gICAgfVxuICB9XG5cblxuXG59XG4iXX0=