@firestitch/report 18.2.0 → 18.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/option-builder.d.ts +1 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +3 -3
- package/esm2022/app/reports/option-builder.mjs +32 -3
- package/fesm2022/{firestitch-report-echarts-Id_HJuQO.mjs → firestitch-report-echarts-BLtDCank.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-Id_HJuQO.mjs.map → firestitch-report-echarts-BLtDCank.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CfSwIwzw.mjs → firestitch-report-firestitch-report-eTeJyMPo.mjs} +39 -10
- package/fesm2022/firestitch-report-firestitch-report-eTeJyMPo.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/firestitch-report-firestitch-report-CfSwIwzw.mjs.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { EChartsOption } from 'echarts';
|
|
2
2
|
import { ChartConfig, ChartGranularity, ComponentData, LegendPosition, ReportComponent } from './interfaces/report.interface';
|
|
3
3
|
export declare function isColorBy(config: ChartConfig): boolean;
|
|
4
|
+
export declare function colorByColumn(config: ChartConfig): string | undefined;
|
|
4
5
|
export interface ExtractedChartSeries {
|
|
5
6
|
categories: string[];
|
|
6
7
|
series: {
|
|
@@ -435,7 +435,7 @@ export class ReportCanvasComponent {
|
|
|
435
435
|
this._guides?.nativeElement?.replaceChildren();
|
|
436
436
|
}
|
|
437
437
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
438
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportCanvasComponent, isStandalone: true, selector: "app-report-canvas", inputs: { report: "report", editMode: "editMode", pageId: "pageId" }, outputs: { componentSettings: "componentSettings", reportChanged: "reportChanged", editDone: "editDone", pageChanged: "pageChanged" }, viewQueries: [{ propertyName: "zoomPan", first: true, predicate: FsZoomPanComponent, descendants: true }, { propertyName: "_viewport", first: true, predicate: ["viewport"], descendants: true, static: true }, { propertyName: "_guides", first: true, predicate: ["guides"], descendants: true }, { propertyName: "_renderedComponents", predicate: ReportComponentComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage; as page) {\n <div\n class=\"page\"\n [class.flow]=\"isFlow\"\n [class.editing]=\"editMode\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.padding.px]=\"isFlow ? flowPadding * PX : 0\"\n [style.--canvas-zoom]=\"zoom\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n @if (isFlow) {\n @for (component of flowComponents; track component.id) {\n <app-report-component\n class=\"flow-item\"\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'flow'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.width.%]=\"component.flowWidth\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (flowReorder)=\"onFlowReorder($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n } @else {\n @for (component of page.components; track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'freeform'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!page.components.length) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n\n @if (editMode) {\n <button\n mat-flat-button\n type=\"button\"\n color=\"primary\"\n class=\"edit-done\"\n matTooltip=\"Exit layout editing\"\n (click)=\"editDone.emit()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n </div>\n\n <div class=\"canvas-toolbar\">\n <!-- Tabs are one horizontal drop list: dragging a chip reorders the pages.\n The drop INDEX is computed along X (orientation), but the preview is\n deliberately left unbounded on both axes \u2014 pinning it to the row with\n cdkDragBoundary means the chip you are dragging covers the chips you\n are dragging it past, and you cannot see where it is going to land. -->\n <div\n class=\"page-tabs\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onPageDropped($event)\">\n @if ((report?.pages?.length ?? 0) > 1) {\n @for (page of report.pages; track page.id; let index = $index) {\n <!-- The chip is the drag handle AND the tab: clicking selects,\n dragging reorders. The kebab lives inside it, so the whole\n control stays one chip instead of growing a second button. -->\n <div\n cdkDrag\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex\"\n (click)=\"selectPage(index)\">\n <span class=\"page-tab-label\">{{ pageLabel(page, index) }}</span>\n <!-- The kebab opens the menu rather than starting a drag or\n switching pages, so it swallows its own click. -->\n <span\n class=\"page-tab-menu\"\n [fsMenuTriggerFor]=\"pageMenu\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </span>\n </div>\n <!-- Outside the chip: cdkDrag clones its host into the drag preview,\n and a menu overlay anchored to a cloned trigger opens detached\n from the real tab. -->\n <fs-menu #pageMenu>\n <ng-template\n fs-menu-item\n (click)=\"renamePage(page)\">\n Edit name\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"deletePage(page)\">\n Delete\n </ng-template>\n </fs-menu>\n }\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <div class=\"zoom-controls\">\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom out\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom in\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;margin-top:10px}.canvas{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.canvas-toolbar .page-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.canvas-toolbar .page-tabs fs-menu{display:none}.canvas-toolbar .page-tabs .page-tab{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;cursor:pointer}.canvas-toolbar .page-tabs .page-tab.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.canvas-toolbar .page-tabs .page-tab .page-tab-label{white-space:nowrap}.canvas-toolbar .page-tabs .page-tab .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.canvas-toolbar .page-tabs .page-tab .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.canvas-toolbar .page-tabs .page-tab .page-tab-menu:hover{background:#0f172a14;opacity:1}.canvas-toolbar .page-tabs .page-tab.active .page-tab-menu:hover{background:#ffffff38}.canvas-toolbar .page-tabs .page-tab.add-page{gap:2px;padding:4px 14px 4px 8px;border-style:dashed;color:#52606d}.canvas-toolbar .page-tabs .page-tab.add-page mat-icon{font-size:16px;width:16px;height:16px}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder{background:transparent;border-style:dashed;border-color:#cbd2d9}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-label,.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-menu{visibility:hidden}.canvas-toolbar .page-tabs .cdk-drag-animating,.canvas-toolbar .page-tabs.cdk-drop-list-dragging .page-tab:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.canvas-toolbar .zoom-controls{display:flex;align-items:center;gap:2px;margin-left:auto;border:1px solid #e4e7eb;border-radius:18px;background:#fff;padding:2px 6px}.canvas-toolbar .zoom-controls .zoom-button{display:flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:#52606d;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-button:hover{background:#f0f4f8}.canvas-toolbar .zoom-controls .zoom-button mat-icon{font-size:18px;width:18px;height:18px}.canvas-toolbar .zoom-controls .zoom-label{border:none;background:transparent;font-size:12px;color:#52606d;min-width:44px;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-label:hover{color:#1f2933}.page-tab.cdk-drag-preview{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;box-shadow:0 3px 10px #0f172a3d}.page-tab.cdk-drag-preview.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.page-tab.cdk-drag-preview .page-tab-label{white-space:nowrap}.page-tab.cdk-drag-preview .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.page-tab.cdk-drag-preview .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.page-viewport{position:relative;flex:1;min-height:420px;border:1px solid #e4e7eb;border-radius:8px;background:#eef1f5;overflow:hidden}.page-viewport fs-zoom-pan{width:100%;height:100%}.edit-done{position:absolute;top:12px;right:12px;z-index:40;border-radius:999px;box-shadow:0 2px 10px #0f172a2e}.page{position:relative;background:#fff;border-radius:2px;box-shadow:0 2px 12px #0f172a1f,0 0 0 1px #0f172a0a;box-sizing:border-box}.page.flow{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:flex-start}.page.editing{background-image:radial-gradient(circle,#d8dee6 1px,transparent 1px);background-size:24px 24px}.guides{position:absolute;inset:0;pointer-events:none;z-index:30}.guides ::ng-deep .guide{position:absolute;background:#2196f3}.guides ::ng-deep .guide.guide-v{top:0;bottom:0;width:calc(1.25px / var(--canvas-zoom, 1))}.guides ::ng-deep .guide.guide-h{left:0;right:0;height:calc(1.25px / var(--canvas-zoom, 1))}.page-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#9aa5b1;font-size:14px;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "ngmodule", type: FsZoomPanModule }, { kind: "component", type: i3.FsZoomPanComponent, selector: "fs-zoom-pan", inputs: ["zoomMax", "zoomMin", "zoomScale", "zoomDefault", "zoomFactor", "top", "left"], outputs: ["moved", "zoomed"] }, { kind: "component", type: ReportComponentComponent, selector: "app-report-component", inputs: ["reportId", "component", "groups", "editMode", "layout", "zoom", "snapper", "selected"], outputs: ["selectComponent", "positionChanged", "flowReorder", "openSettings"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
438
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportCanvasComponent, isStandalone: true, selector: "app-report-canvas", inputs: { report: "report", editMode: "editMode", pageId: "pageId" }, outputs: { componentSettings: "componentSettings", reportChanged: "reportChanged", editDone: "editDone", pageChanged: "pageChanged" }, viewQueries: [{ propertyName: "zoomPan", first: true, predicate: FsZoomPanComponent, descendants: true }, { propertyName: "_viewport", first: true, predicate: ["viewport"], descendants: true, static: true }, { propertyName: "_guides", first: true, predicate: ["guides"], descendants: true }, { propertyName: "_renderedComponents", predicate: ReportComponentComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage; as page) {\n <div\n class=\"page\"\n [class.flow]=\"isFlow\"\n [class.editing]=\"editMode\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.padding.px]=\"isFlow ? flowPadding * PX : 0\"\n [style.--canvas-zoom]=\"zoom\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n @if (isFlow) {\n @for (component of flowComponents; track component.id) {\n <app-report-component\n class=\"flow-item\"\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'flow'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.width.%]=\"component.flowWidth\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (flowReorder)=\"onFlowReorder($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n } @else {\n @for (component of page.components; track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'freeform'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!page.components.length) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n\n @if (editMode) {\n <button\n mat-flat-button\n type=\"button\"\n color=\"primary\"\n class=\"edit-done\"\n matTooltip=\"Exit layout editing\"\n (click)=\"editDone.emit()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n </div>\n\n <div class=\"canvas-toolbar\">\n <!-- Tabs are one horizontal drop list: dragging a chip reorders the pages.\n The drop INDEX is computed along X (orientation), but the preview is\n deliberately left unbounded on both axes \u2014 pinning it to the row with\n cdkDragBoundary means the chip you are dragging covers the chips you\n are dragging it past, and you cannot see where it is going to land.\n Every page gets a chip, including a lone one: the chip is what tells\n you which page you are on, and a report that hid it left you unable to\n tell page 1 of 1 from a page that failed to load. Deleting the last\n page is refused server-side, so the kebab is safe to expose here. -->\n <div\n class=\"page-tabs\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onPageDropped($event)\">\n @for (page of report?.pages ?? []; track page.id; let index = $index) {\n <!-- The chip is the drag handle AND the tab: clicking selects,\n dragging reorders. The kebab lives inside it, so the whole\n control stays one chip instead of growing a second button. -->\n <div\n cdkDrag\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex\"\n (click)=\"selectPage(index)\">\n <span class=\"page-tab-label\">{{ pageLabel(page, index) }}</span>\n <!-- The kebab opens the menu rather than starting a drag or\n switching pages, so it swallows its own click. -->\n <span\n class=\"page-tab-menu\"\n [fsMenuTriggerFor]=\"pageMenu\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </span>\n </div>\n <!-- Outside the chip: cdkDrag clones its host into the drag preview,\n and a menu overlay anchored to a cloned trigger opens detached\n from the real tab. -->\n <fs-menu #pageMenu>\n <ng-template\n fs-menu-item\n (click)=\"renamePage(page)\">\n Edit name\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"deletePage(page)\">\n Delete\n </ng-template>\n </fs-menu>\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <div class=\"zoom-controls\">\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom out\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom in\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;margin-top:10px}.canvas{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.canvas-toolbar .page-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.canvas-toolbar .page-tabs fs-menu{display:none}.canvas-toolbar .page-tabs .page-tab{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;cursor:pointer}.canvas-toolbar .page-tabs .page-tab.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.canvas-toolbar .page-tabs .page-tab .page-tab-label{white-space:nowrap}.canvas-toolbar .page-tabs .page-tab .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.canvas-toolbar .page-tabs .page-tab .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.canvas-toolbar .page-tabs .page-tab .page-tab-menu:hover{background:#0f172a14;opacity:1}.canvas-toolbar .page-tabs .page-tab.active .page-tab-menu:hover{background:#ffffff38}.canvas-toolbar .page-tabs .page-tab.add-page{gap:2px;padding:4px 14px 4px 8px;border-style:dashed;color:#52606d}.canvas-toolbar .page-tabs .page-tab.add-page mat-icon{font-size:16px;width:16px;height:16px}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder{background:transparent;border-style:dashed;border-color:#cbd2d9}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-label,.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-menu{visibility:hidden}.canvas-toolbar .page-tabs .cdk-drag-animating,.canvas-toolbar .page-tabs.cdk-drop-list-dragging .page-tab:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.canvas-toolbar .zoom-controls{display:flex;align-items:center;gap:2px;margin-left:auto;border:1px solid #e4e7eb;border-radius:18px;background:#fff;padding:2px 6px}.canvas-toolbar .zoom-controls .zoom-button{display:flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:#52606d;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-button:hover{background:#f0f4f8}.canvas-toolbar .zoom-controls .zoom-button mat-icon{font-size:18px;width:18px;height:18px}.canvas-toolbar .zoom-controls .zoom-label{border:none;background:transparent;font-size:12px;color:#52606d;min-width:44px;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-label:hover{color:#1f2933}.page-tab.cdk-drag-preview{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;box-shadow:0 3px 10px #0f172a3d}.page-tab.cdk-drag-preview.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.page-tab.cdk-drag-preview .page-tab-label{white-space:nowrap}.page-tab.cdk-drag-preview .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.page-tab.cdk-drag-preview .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.page-viewport{position:relative;flex:1;min-height:420px;border:1px solid #e4e7eb;border-radius:8px;background:#eef1f5;overflow:hidden}.page-viewport fs-zoom-pan{width:100%;height:100%}.edit-done{position:absolute;top:12px;right:12px;z-index:40;border-radius:999px;box-shadow:0 2px 10px #0f172a2e}.page{position:relative;background:#fff;border-radius:2px;box-shadow:0 2px 12px #0f172a1f,0 0 0 1px #0f172a0a;box-sizing:border-box}.page.flow{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:flex-start}.page.editing{background-image:radial-gradient(circle,#d8dee6 1px,transparent 1px);background-size:24px 24px}.guides{position:absolute;inset:0;pointer-events:none;z-index:30}.guides ::ng-deep .guide{position:absolute;background:#2196f3}.guides ::ng-deep .guide.guide-v{top:0;bottom:0;width:calc(1.25px / var(--canvas-zoom, 1))}.guides ::ng-deep .guide.guide-h{left:0;right:0;height:calc(1.25px / var(--canvas-zoom, 1))}.page-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#9aa5b1;font-size:14px;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i2.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "ngmodule", type: FsZoomPanModule }, { kind: "component", type: i3.FsZoomPanComponent, selector: "fs-zoom-pan", inputs: ["zoomMax", "zoomMin", "zoomScale", "zoomDefault", "zoomFactor", "top", "left"], outputs: ["moved", "zoomed"] }, { kind: "component", type: ReportComponentComponent, selector: "app-report-component", inputs: ["reportId", "component", "groups", "editMode", "layout", "zoom", "snapper", "selected"], outputs: ["selectComponent", "positionChanged", "flowReorder", "openSettings"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
439
439
|
}
|
|
440
440
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportCanvasComponent, decorators: [{
|
|
441
441
|
type: Component,
|
|
@@ -447,7 +447,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
447
447
|
FsMenuModule,
|
|
448
448
|
FsZoomPanModule,
|
|
449
449
|
ReportComponentComponent,
|
|
450
|
-
], template: "<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage; as page) {\n <div\n class=\"page\"\n [class.flow]=\"isFlow\"\n [class.editing]=\"editMode\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.padding.px]=\"isFlow ? flowPadding * PX : 0\"\n [style.--canvas-zoom]=\"zoom\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n @if (isFlow) {\n @for (component of flowComponents; track component.id) {\n <app-report-component\n class=\"flow-item\"\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'flow'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.width.%]=\"component.flowWidth\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (flowReorder)=\"onFlowReorder($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n } @else {\n @for (component of page.components; track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'freeform'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!page.components.length) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n\n @if (editMode) {\n <button\n mat-flat-button\n type=\"button\"\n color=\"primary\"\n class=\"edit-done\"\n matTooltip=\"Exit layout editing\"\n (click)=\"editDone.emit()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n </div>\n\n <div class=\"canvas-toolbar\">\n <!-- Tabs are one horizontal drop list: dragging a chip reorders the pages.\n The drop INDEX is computed along X (orientation), but the preview is\n deliberately left unbounded on both axes \u2014 pinning it to the row with\n cdkDragBoundary means the chip you are dragging covers the chips you\n are dragging it past, and you cannot see where it is going to land. -->\n <div\n class=\"page-tabs\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onPageDropped($event)\">\n @if ((report?.pages?.length ?? 0) > 1) {\n @for (page of report.pages; track page.id; let index = $index) {\n <!-- The chip is the drag handle AND the tab: clicking selects,\n dragging reorders. The kebab lives inside it, so the whole\n control stays one chip instead of growing a second button. -->\n <div\n cdkDrag\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex\"\n (click)=\"selectPage(index)\">\n <span class=\"page-tab-label\">{{ pageLabel(page, index) }}</span>\n <!-- The kebab opens the menu rather than starting a drag or\n switching pages, so it swallows its own click. -->\n <span\n class=\"page-tab-menu\"\n [fsMenuTriggerFor]=\"pageMenu\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </span>\n </div>\n <!-- Outside the chip: cdkDrag clones its host into the drag preview,\n and a menu overlay anchored to a cloned trigger opens detached\n from the real tab. -->\n <fs-menu #pageMenu>\n <ng-template\n fs-menu-item\n (click)=\"renamePage(page)\">\n Edit name\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"deletePage(page)\">\n Delete\n </ng-template>\n </fs-menu>\n }\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <div class=\"zoom-controls\">\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom out\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom in\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;margin-top:10px}.canvas{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.canvas-toolbar .page-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.canvas-toolbar .page-tabs fs-menu{display:none}.canvas-toolbar .page-tabs .page-tab{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;cursor:pointer}.canvas-toolbar .page-tabs .page-tab.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.canvas-toolbar .page-tabs .page-tab .page-tab-label{white-space:nowrap}.canvas-toolbar .page-tabs .page-tab .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.canvas-toolbar .page-tabs .page-tab .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.canvas-toolbar .page-tabs .page-tab .page-tab-menu:hover{background:#0f172a14;opacity:1}.canvas-toolbar .page-tabs .page-tab.active .page-tab-menu:hover{background:#ffffff38}.canvas-toolbar .page-tabs .page-tab.add-page{gap:2px;padding:4px 14px 4px 8px;border-style:dashed;color:#52606d}.canvas-toolbar .page-tabs .page-tab.add-page mat-icon{font-size:16px;width:16px;height:16px}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder{background:transparent;border-style:dashed;border-color:#cbd2d9}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-label,.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-menu{visibility:hidden}.canvas-toolbar .page-tabs .cdk-drag-animating,.canvas-toolbar .page-tabs.cdk-drop-list-dragging .page-tab:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.canvas-toolbar .zoom-controls{display:flex;align-items:center;gap:2px;margin-left:auto;border:1px solid #e4e7eb;border-radius:18px;background:#fff;padding:2px 6px}.canvas-toolbar .zoom-controls .zoom-button{display:flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:#52606d;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-button:hover{background:#f0f4f8}.canvas-toolbar .zoom-controls .zoom-button mat-icon{font-size:18px;width:18px;height:18px}.canvas-toolbar .zoom-controls .zoom-label{border:none;background:transparent;font-size:12px;color:#52606d;min-width:44px;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-label:hover{color:#1f2933}.page-tab.cdk-drag-preview{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;box-shadow:0 3px 10px #0f172a3d}.page-tab.cdk-drag-preview.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.page-tab.cdk-drag-preview .page-tab-label{white-space:nowrap}.page-tab.cdk-drag-preview .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.page-tab.cdk-drag-preview .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.page-viewport{position:relative;flex:1;min-height:420px;border:1px solid #e4e7eb;border-radius:8px;background:#eef1f5;overflow:hidden}.page-viewport fs-zoom-pan{width:100%;height:100%}.edit-done{position:absolute;top:12px;right:12px;z-index:40;border-radius:999px;box-shadow:0 2px 10px #0f172a2e}.page{position:relative;background:#fff;border-radius:2px;box-shadow:0 2px 12px #0f172a1f,0 0 0 1px #0f172a0a;box-sizing:border-box}.page.flow{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:flex-start}.page.editing{background-image:radial-gradient(circle,#d8dee6 1px,transparent 1px);background-size:24px 24px}.guides{position:absolute;inset:0;pointer-events:none;z-index:30}.guides ::ng-deep .guide{position:absolute;background:#2196f3}.guides ::ng-deep .guide.guide-v{top:0;bottom:0;width:calc(1.25px / var(--canvas-zoom, 1))}.guides ::ng-deep .guide.guide-h{left:0;right:0;height:calc(1.25px / var(--canvas-zoom, 1))}.page-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#9aa5b1;font-size:14px;pointer-events:none}\n"] }]
|
|
450
|
+
], template: "<div class=\"canvas\">\n <div\n #viewport\n class=\"page-viewport\"\n (pointerdown)=\"onCanvasPointerDown()\">\n <fs-zoom-pan\n [zoomMin]=\"0.1\"\n [zoomMax]=\"3\"\n (zoomed)=\"onZoomed($event)\">\n @if (activePage; as page) {\n <div\n class=\"page\"\n [class.flow]=\"isFlow\"\n [class.editing]=\"editMode\"\n [style.width.px]=\"report.pageWidth * PX\"\n [style.height.px]=\"report.pageHeight * PX\"\n [style.padding.px]=\"isFlow ? flowPadding * PX : 0\"\n [style.--canvas-zoom]=\"zoom\"\n [style.--report-heading-size.px]=\"headingSizePx\">\n @if (isFlow) {\n @for (component of flowComponents; track component.id) {\n <app-report-component\n class=\"flow-item\"\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'flow'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.width.%]=\"component.flowWidth\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (flowReorder)=\"onFlowReorder($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n } @else {\n @for (component of page.components; track component.id) {\n <app-report-component\n [reportId]=\"report.id\"\n [component]=\"component\"\n [groups]=\"groups\"\n [editMode]=\"editMode\"\n [layout]=\"'freeform'\"\n [zoom]=\"zoom\"\n [snapper]=\"snapper\"\n [selected]=\"component.id === selectedComponentId\"\n [style.left.px]=\"component.x * PX\"\n [style.top.px]=\"component.y * PX\"\n [style.width.px]=\"component.w * PX\"\n [style.height.px]=\"component.autoHeight ? null : component.h * PX\"\n (selectComponent)=\"selectComponent($event)\"\n (positionChanged)=\"onPositionChanged($event)\"\n (openSettings)=\"componentSettings.emit($event)\">\n </app-report-component>\n }\n }\n\n <div\n #guides\n class=\"guides\">\n </div>\n\n @if (!page.components.length) {\n <div class=\"page-empty\">\n Ask the assistant to add a chart, list or KPI to this page.\n </div>\n }\n </div>\n }\n </fs-zoom-pan>\n\n @if (editMode) {\n <button\n mat-flat-button\n type=\"button\"\n color=\"primary\"\n class=\"edit-done\"\n matTooltip=\"Exit layout editing\"\n (click)=\"editDone.emit()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n </div>\n\n <div class=\"canvas-toolbar\">\n <!-- Tabs are one horizontal drop list: dragging a chip reorders the pages.\n The drop INDEX is computed along X (orientation), but the preview is\n deliberately left unbounded on both axes \u2014 pinning it to the row with\n cdkDragBoundary means the chip you are dragging covers the chips you\n are dragging it past, and you cannot see where it is going to land.\n Every page gets a chip, including a lone one: the chip is what tells\n you which page you are on, and a report that hid it left you unable to\n tell page 1 of 1 from a page that failed to load. Deleting the last\n page is refused server-side, so the kebab is safe to expose here. -->\n <div\n class=\"page-tabs\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onPageDropped($event)\">\n @for (page of report?.pages ?? []; track page.id; let index = $index) {\n <!-- The chip is the drag handle AND the tab: clicking selects,\n dragging reorders. The kebab lives inside it, so the whole\n control stays one chip instead of growing a second button. -->\n <div\n cdkDrag\n class=\"page-tab\"\n [class.active]=\"index === activePageIndex\"\n (click)=\"selectPage(index)\">\n <span class=\"page-tab-label\">{{ pageLabel(page, index) }}</span>\n <!-- The kebab opens the menu rather than starting a drag or\n switching pages, so it swallows its own click. -->\n <span\n class=\"page-tab-menu\"\n [fsMenuTriggerFor]=\"pageMenu\"\n (click)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </span>\n </div>\n <!-- Outside the chip: cdkDrag clones its host into the drag preview,\n and a menu overlay anchored to a cloned trigger opens detached\n from the real tab. -->\n <fs-menu #pageMenu>\n <ng-template\n fs-menu-item\n (click)=\"renamePage(page)\">\n Edit name\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"deletePage(page)\">\n Delete\n </ng-template>\n </fs-menu>\n }\n <button\n type=\"button\"\n class=\"page-tab add-page\"\n matTooltip=\"Add page\"\n (click)=\"addPage()\">\n <mat-icon>add</mat-icon>\n Page\n </button>\n </div>\n\n <div class=\"zoom-controls\">\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom out\"\n (click)=\"zoomOut()\">\n <mat-icon>remove</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-label\"\n matTooltip=\"Zoom to 100%\"\n (click)=\"zoomActual()\">\n {{ (zoom * 100).toFixed(0) }}%\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Zoom in\"\n (click)=\"zoomIn()\">\n <mat-icon>add</mat-icon>\n </button>\n <button\n type=\"button\"\n class=\"zoom-button\"\n matTooltip=\"Fit page\"\n (click)=\"zoomFit()\">\n <mat-icon>fit_screen</mat-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;margin-top:10px}.canvas{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px}.canvas-toolbar .page-tabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.canvas-toolbar .page-tabs fs-menu{display:none}.canvas-toolbar .page-tabs .page-tab{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;cursor:pointer}.canvas-toolbar .page-tabs .page-tab.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.canvas-toolbar .page-tabs .page-tab .page-tab-label{white-space:nowrap}.canvas-toolbar .page-tabs .page-tab .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.canvas-toolbar .page-tabs .page-tab .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.canvas-toolbar .page-tabs .page-tab .page-tab-menu:hover{background:#0f172a14;opacity:1}.canvas-toolbar .page-tabs .page-tab.active .page-tab-menu:hover{background:#ffffff38}.canvas-toolbar .page-tabs .page-tab.add-page{gap:2px;padding:4px 14px 4px 8px;border-style:dashed;color:#52606d}.canvas-toolbar .page-tabs .page-tab.add-page mat-icon{font-size:16px;width:16px;height:16px}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder{background:transparent;border-style:dashed;border-color:#cbd2d9}.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-label,.canvas-toolbar .page-tabs .page-tab.cdk-drag-placeholder .page-tab-menu{visibility:hidden}.canvas-toolbar .page-tabs .cdk-drag-animating,.canvas-toolbar .page-tabs.cdk-drop-list-dragging .page-tab:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.canvas-toolbar .zoom-controls{display:flex;align-items:center;gap:2px;margin-left:auto;border:1px solid #e4e7eb;border-radius:18px;background:#fff;padding:2px 6px}.canvas-toolbar .zoom-controls .zoom-button{display:flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:#52606d;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-button:hover{background:#f0f4f8}.canvas-toolbar .zoom-controls .zoom-button mat-icon{font-size:18px;width:18px;height:18px}.canvas-toolbar .zoom-controls .zoom-label{border:none;background:transparent;font-size:12px;color:#52606d;min-width:44px;cursor:pointer}.canvas-toolbar .zoom-controls .zoom-label:hover{color:#1f2933}.page-tab.cdk-drag-preview{display:inline-flex;align-items:center;box-sizing:border-box;border:1px solid #e4e7eb;border-radius:16px;background:#fff;padding:4px 6px 4px 14px;font-size:12px;line-height:16px;color:#52606d;box-shadow:0 3px 10px #0f172a3d}.page-tab.cdk-drag-preview.active{background:var(--brand-primary-color, #3b82f6);border-color:var(--brand-primary-color, #3b82f6);color:#fff}.page-tab.cdk-drag-preview .page-tab-label{white-space:nowrap}.page-tab.cdk-drag-preview .page-tab-menu{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:16px;height:16px;margin-left:2px;border-radius:50%;opacity:.75}.page-tab.cdk-drag-preview .page-tab-menu mat-icon{font-size:14px;width:14px;height:14px;line-height:14px}.page-viewport{position:relative;flex:1;min-height:420px;border:1px solid #e4e7eb;border-radius:8px;background:#eef1f5;overflow:hidden}.page-viewport fs-zoom-pan{width:100%;height:100%}.edit-done{position:absolute;top:12px;right:12px;z-index:40;border-radius:999px;box-shadow:0 2px 10px #0f172a2e}.page{position:relative;background:#fff;border-radius:2px;box-shadow:0 2px 12px #0f172a1f,0 0 0 1px #0f172a0a;box-sizing:border-box}.page.flow{display:flex;flex-wrap:wrap;align-content:flex-start;align-items:flex-start}.page.editing{background-image:radial-gradient(circle,#d8dee6 1px,transparent 1px);background-size:24px 24px}.guides{position:absolute;inset:0;pointer-events:none;z-index:30}.guides ::ng-deep .guide{position:absolute;background:#2196f3}.guides ::ng-deep .guide.guide-v{top:0;bottom:0;width:calc(1.25px / var(--canvas-zoom, 1))}.guides ::ng-deep .guide.guide-h{left:0;right:0;height:calc(1.25px / var(--canvas-zoom, 1))}.page-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#9aa5b1;font-size:14px;pointer-events:none}\n"] }]
|
|
451
451
|
}], propDecorators: { report: [{
|
|
452
452
|
type: Input
|
|
453
453
|
}], editMode: [{
|
|
@@ -475,4 +475,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
475
475
|
type: ViewChild,
|
|
476
476
|
args: ['guides', { static: false }]
|
|
477
477
|
}] } });
|
|
478
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNhbnZhcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvcmVwb3J0LWNhbnZhcy9yZXBvcnQtY2FudmFzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDVSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUNoRixVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUMvRixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQWUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0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QU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBEZXN0cm95UmVmLFxyXG4gIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBpbmplY3QsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuXHJcbmltcG9ydCB7IENka0RyYWdEcm9wLCBEcmFnRHJvcE1vZHVsZSwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5cclxuaW1wb3J0IHsgRnNNZW51TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVudSc7XHJcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xyXG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XHJcbmltcG9ydCB7IEZzWm9vbVBhbkNvbXBvbmVudCwgRnNab29tUGFuTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvem9vbS1wYW4nO1xyXG5cclxuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRTZXR0aW5ncywgUmVwb3J0LCBSZXBvcnRDb21wb25lbnQsIFJlcG9ydEZpbHRlckdyb3VwLCBSZXBvcnRQYWdlLFxyXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XHJcbmltcG9ydCB7IERFRkFVTFRfSEVBRElOR19TSVpFLCBGTE9XX1BBRERJTkcgfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xyXG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnRDb21wb25lbnQgfSBmcm9tICcuLi9yZXBvcnQtY29tcG9uZW50L3JlcG9ydC1jb21wb25lbnQuY29tcG9uZW50JztcclxuXHJcblxyXG4vLyBTY3JlZW4gZGVuc2l0eSBvZiB0aGUgY2FudmFzOiA5NiBDU1MgcHggcGVyIGluY2ggKHRoZSBDU1MgcmVmZXJlbmNlIHBpeGVsKSxcclxuLy8gYmVmb3JlIHpvb20uIEFsbCBnZW9tZXRyeSBzdGF5cyBpbiBpbmNoZXM7IG9ubHkgcmVuZGVyaW5nIG11bHRpcGxpZXMgYnkgaXQuXHJcbmV4cG9ydCBjb25zdCBQWF9QRVJfSU5DSCA9IDk2O1xyXG5cclxuLy8gT25lIHNtYXJ0IGd1aWRlIGxpbmUsIGluIHBhZ2UgaW5jaGVzLlxyXG5leHBvcnQgaW50ZXJmYWNlIEd1aWRlTGluZSB7XHJcbiAgb3JpZW50YXRpb246ICd2JyB8ICdoJztcclxuICBwb3NpdGlvbjogbnVtYmVyO1xyXG59XHJcblxyXG4vLyBUaGUgc25hcHBpbmcgY29udHJhY3QgaGFuZGVkIHRvIGVhY2ggY29tcG9uZW50J3MgZHJhZyBsb29wLiBJbXBsZW1lbnRlZCBieVxyXG4vLyB0aGUgY2FudmFzIGJlY2F1c2Ugb25seSBpdCBzZWVzIGV2ZXJ5IGNvbXBvbmVudCAoYWxpZ25tZW50IGNhbmRpZGF0ZXMpIGFuZFxyXG4vLyBvd25zIHRoZSBndWlkZXMgb3ZlcmxheS5cclxuZXhwb3J0IGludGVyZmFjZSBDYW52YXNTbmFwcGVyIHtcclxuICBzbmFwTW92ZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XHJcbiAgc25hcFJlc2l6ZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgZ2VvbWV0cnk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sIGhhbmRsZTogc3RyaW5nKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfTtcclxuICBjbGVhcigpOiB2b2lkO1xyXG59XHJcblxyXG4vLyBUaGUgZml4ZWQtc2l6ZSBwYWdlIGNhbnZhcyDigJQgdGhlIFBvd2VyUG9pbnQgbW9kZWwuIFBhZ2VzIGFyZSB0YWJzIChvbmx5IHRoZVxyXG4vLyBBQ1RJVkUgcGFnZSdzIGNvbXBvbmVudHMgZXhpc3Qg4oaSIG9ubHkgdGhleSBmZXRjaCk7IHRoZSBwYWdlIGlzIGFcclxuLy8gcGFnZVdpZHRow5dwYWdlSGVpZ2h0IElOQ0hFUyBzaGVldCByZW5kZXJlZCBhdCA5NnB4L2luIGluc2lkZSBmcy16b29tLXBhblxyXG4vLyAod2hlZWwgem9vbSwgYmFja2dyb3VuZCBkcmFnIHBhbiwgdG9vbGJhciBidXR0b25zKS5cclxuLy9cclxuLy8gRnJlZWZvcm0gbGF5b3V0OiBjb21wb25lbnRzIGFyZSBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQ7IGRyYWdnaW5nIGdldHMgc21hcnRcclxuLy8gYWxpZ25tZW50IGd1aWRlcyAoZWRnZXMgKyBjZW50ZXJzIG9mIHNpYmxpbmdzIGFuZCB0aGUgcGFnZSkgd2l0aCBzbmFwcGluZy5cclxuLy8gRmxvdyBsYXlvdXQ6IGNvbXBvbmVudHMgZmxvdyBpbnRvIHJvd3MgKGZsb3dXaWR0aCAlIG9mIHRoZSBjb250ZW50IHdpZHRoKSxcclxuLy8gZHJhZyByZW9yZGVycywgZWFzdC9zb3V0aCBoYW5kbGVzIHJlc2l6ZSB3aWR0aCUvaGVpZ2h0LlxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY2FudmFzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVwb3J0LWNhbnZhcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcmVwb3J0LWNhbnZhcy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRHJhZ0Ryb3BNb2R1bGUsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBNYXRJY29uLFxyXG4gICAgTWF0VG9vbHRpcCxcclxuICAgIEZzTWVudU1vZHVsZSxcclxuICAgIEZzWm9vbVBhbk1vZHVsZSxcclxuICAgIFJlcG9ydENvbXBvbmVudENvbXBvbmVudCxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVwb3J0Q2FudmFzQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIHJlcG9ydDogUmVwb3J0O1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0TW9kZSA9IGZhbHNlO1xyXG5cclxuICAvLyBUaGUgcGFnZSB0aGUgaG9zdCB3YW50cyBvbiBzY3JlZW4sIGJ5IHBhZ2UgaWQgKGEgZGVlcCBsaW5rKS4gS2V5ZWQgb24gaWRcclxuICAvLyByYXRoZXIgdGhhbiBpbmRleCBzbyBhIGxpbmsgc3Vydml2ZXMgcGFnZXMgYmVpbmcgcmVvcmRlcmVkIG9yIGRlbGV0ZWQ7IGFuXHJcbiAgLy8gaWQgdGhhdCBubyBsb25nZXIgcmVzb2x2ZXMgZmFsbHMgYmFjayB0byB0aGUgZmlyc3QgcGFnZS5cclxuICBASW5wdXQoKSBwdWJsaWMgcGFnZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8gQSBjb21wb25lbnQgYXNrZWQgZm9yIGl0cyBzZXR0aW5ncyBkaWFsb2cg4oCUIHRoZSBwYWdlLWxldmVsIGhvc3Qgb3BlbnMgaXRcclxuICAvLyAoaXQgb3ducyBNYXREaWFsb2cgKyB0aGUgcG9zdC1zYXZlIHJlbG9hZCkuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBjb21wb25lbnRTZXR0aW5ncyA9IG5ldyBFdmVudEVtaXR0ZXI8UmVwb3J0Q29tcG9uZW50PigpO1xyXG5cclxuICAvLyBUaGUgcmVwb3J0J3Mgc3RydWN0dXJlIGNoYW5nZWQgaGVyZSAoYSBwYWdlIHdhcyBhZGRlZCkg4oCUIHRoZSBob3N0IHJlLWZldGNoZXNcclxuICAvLyBpdCAoaXQgb3ducyB0aGUgYXNzZW1ibGVkIHJlcG9ydCArIGZpbHRlciBzdGF0ZSkuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyByZXBvcnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvLyBUaGUgdmlld2VyIGRpc21pc3NlZCBlZGl0IG1vZGUgZnJvbSB0aGUgb24tY2FudmFzIGJhZGdlIOKAlCB0aGUgaG9zdCBvd25zIHRoZVxyXG4gIC8vIGVkaXRNb2RlIGZsYWcsIHNvIGl0IGZsaXBzIGl0IG9mZiAobWlycm9ycyB0aGUgbWVudSdzIFwiRG9uZSBlZGl0aW5nIGxheW91dFwiKS5cclxuICBAT3V0cHV0KCkgcHVibGljIGVkaXREb25lID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvLyBUaGUgcGFnZSBvbiBzY3JlZW4gY2hhbmdlZCDigJQgdGhlIGhvc3QgcmVmbGVjdHMgaXQgaW4gdGhlIFVSTCBzbyBhIHJlZnJlc2hcclxuICAvLyBjb21lcyBiYWNrIHRvIHRoZSBzYW1lIHBhZ2UuIENhcnJpZXMgdGhlIHBhZ2UgaWQsIG5ldmVyIHRoZSBpbmRleC5cclxuICBAT3V0cHV0KCkgcHVibGljIHBhZ2VDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xyXG5cclxuICBAVmlld0NoaWxkKEZzWm9vbVBhbkNvbXBvbmVudClcclxuICBwdWJsaWMgem9vbVBhbjogRnNab29tUGFuQ29tcG9uZW50O1xyXG5cclxuICAvLyBUaGUgcmVuZGVyZWQgY29tcG9uZW50cyBvZiB0aGUgYWN0aXZlIHBhZ2Ug4oCUIG9ubHkgdGhlIGNhbnZhcyBjYW4gcmVhY2ggdGhlXHJcbiAgLy8gb25lIGluc3RhbmNlIGEgc2V0dGluZ3Mgc2F2ZSBhcHBsaWVzIHRvLlxyXG4gIEBWaWV3Q2hpbGRyZW4oUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50KVxyXG4gIHByaXZhdGUgX3JlbmRlcmVkQ29tcG9uZW50czogUXVlcnlMaXN0PFJlcG9ydENvbXBvbmVudENvbXBvbmVudD47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdwb3J0JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwcml2YXRlIF92aWV3cG9ydDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2d1aWRlcycsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHByaXZhdGUgX2d1aWRlczogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBQWCA9IFBYX1BFUl9JTkNIO1xyXG4gIHB1YmxpYyByZWFkb25seSBmbG93UGFkZGluZyA9IEZMT1dfUEFERElORztcclxuXHJcbiAgcHVibGljIGFjdGl2ZVBhZ2VJbmRleCA9IDA7XHJcbiAgcHVibGljIHpvb20gPSAxO1xyXG4gIHB1YmxpYyBncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XHJcbiAgcHVibGljIHNlbGVjdGVkQ29tcG9uZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyBUaGUgc25hcHBlciBoYW5kZWQgdG8gZXZlcnkgY29tcG9uZW50IChzdGFibGUgaWRlbnRpdHkgZm9yIE9uUHVzaCkuXHJcbiAgcHVibGljIHJlYWRvbmx5IHNuYXBwZXI6IENhbnZhc1NuYXBwZXIgPSB7XHJcbiAgICBzbmFwTW92ZTogKGNvbXBvbmVudCwgeCwgeSkgPT4gdGhpcy5fc25hcE1vdmUoY29tcG9uZW50LCB4LCB5KSxcclxuICAgIHNuYXBSZXNpemU6IChjb21wb25lbnQsIGdlb21ldHJ5LCBoYW5kbGUpID0+IHRoaXMuX3NuYXBSZXNpemUoY29tcG9uZW50LCBnZW9tZXRyeSwgaGFuZGxlKSxcclxuICAgIGNsZWFyOiAoKSA9PiB0aGlzLl9jbGVhckd1aWRlcygpLFxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XHJcbiAgcHJpdmF0ZSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcclxuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XHJcbiAgcHJpdmF0ZSBfY2RSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcbiAgcHJpdmF0ZSBfZml0dGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcHJldmlvdXNQYWdlQ291bnQgPSAwO1xyXG5cclxuICAvLyBUaGUgcGFnZSBpZCBsYXN0IGFubm91bmNlZCB0aHJvdWdoIHBhZ2VDaGFuZ2VkLCBzbyBhIHJlLXJlbmRlciB0aGF0IGxhbmRzIG9uXHJcbiAgLy8gdGhlIHNhbWUgcGFnZSBzdGF5cyBxdWlldCDigJQgaG9zdHMgcmVsb2FkIG9uIHRoaXMgYW5kIGFuIHVuY2hhbmdlZCBwYWdlIGlzXHJcbiAgLy8gbm90IG5ld3MuXHJcbiAgcHJpdmF0ZSBfZW1pdHRlZFBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JvdXBzID0gbmV3IE1hcCgodGhpcy5yZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSkubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCBncm91cF0pKTtcclxuXHJcbiAgICBjb25zdCBwYWdlQ291bnQgPSB0aGlzLnJlcG9ydD8ucGFnZXM/Lmxlbmd0aCA/PyAwO1xyXG5cclxuICAgIC8vIEEgcGFnZSB3YXMganVzdCBhZGRlZCAodGhlIGhvc3QgcmUtZmV0Y2hlZCB0aGUgcmVwb3J0KSDigJQgbGFuZCBvbiBpdC5cclxuICAgIGNvbnN0IHBhZ2VBZGRlZCA9IHBhZ2VDb3VudCA+IHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ICYmIHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ID4gMDtcclxuICAgIGlmIChwYWdlQWRkZWQpIHtcclxuICAgICAgdGhpcy5hY3RpdmVQYWdlSW5kZXggPSBwYWdlQ291bnQgLSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcHJldmlvdXNQYWdlQ291bnQgPSBwYWdlQ291bnQ7XHJcblxyXG4gICAgLy8gSG9ub3VyIGFuIGluY29taW5nIGRlZXAgbGluaywgYnV0IG5ldmVyIG92ZXIgYSBqdXN0LWFkZGVkIHBhZ2U6IGFkZGluZyBhXHJcbiAgICAvLyBwYWdlIGlzIGEgZGVsaWJlcmF0ZSBhY3QgaW4gdGhpcyB0YWIsIHdoaWxlIHBhZ2VJZCBpcyB0aGUgc3RhbGUgdmFsdWUgdGhlXHJcbiAgICAvLyBob3N0IGlzIHN0aWxsIGhvbGRpbmcgZnJvbSB0aGUgVVJMLiBBbiBpZCB0aGF0IGRvZXMgbm90IHJlc29sdmUgaXMgbGVmdFxyXG4gICAgLy8gYWxvbmUgcmF0aGVyIHRoYW4gZm9yY2VkIHRvIHRoZSBmaXJzdCBwYWdlIOKAlCB0aGUgcmVwb3J0IG1heSBzdGlsbCBiZVxyXG4gICAgLy8gbG9hZGluZywgYW5kIHRoZSBjbGFtcCBiZWxvdyBpcyB0aGUgcmVhbCBndWFyZC5cclxuICAgIGlmICghcGFnZUFkZGVkICYmIHRoaXMucGFnZUlkICE9IG51bGwpIHtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlcG9ydD8ucGFnZXM/LmZpbmRJbmRleCgocGFnZSkgPT4gcGFnZS5pZCA9PT0gdGhpcy5wYWdlSWQpID8/IC0xO1xyXG5cclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZVBhZ2VJbmRleCA9IGluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0aXZlUGFnZUluZGV4ID49IHBhZ2VDb3VudCkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVBhZ2VJbmRleCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGVsbCB0aGUgaG9zdCB3aGljaCBwYWdlIGlzIG9wZW4gd2hlbmV2ZXIgdGhhdCBjaGFuZ2VzIOKAlCBpbmNsdWRpbmcgdGhlXHJcbiAgICAvLyBGSVJTVCB0aW1lIHRoZSByZXBvcnQgcmVuZGVycywgbm90IG9ubHkgd2hlbiBzb21lb25lIGNsaWNrcyBhIHBhZ2UuXHJcbiAgICAvLyBIb3N0cyBiaW5kIHRoaW5ncyB0byB0aGUgb3BlbiBwYWdlICh0aGUgcmVwb3J0IGNoYXQgc2NvcGVzIGl0c1xyXG4gICAgLy8gY29udmVyc2F0aW9ucyB0byBpdCksIGFuZCB3aXRob3V0IHRoaXMgdGhleSB3b3VsZCBzaXQgb24gbm8gcGFnZSBhdCBhbGxcclxuICAgIC8vIHVudGlsIHRoZSBmaXJzdCBtYW51YWwgcGFnZSBjbGljay5cclxuICAgIGNvbnN0IGFjdGl2ZVBhZ2VJZCA9IHRoaXMuYWN0aXZlUGFnZT8uaWQgPz8gbnVsbDtcclxuICAgIGlmIChhY3RpdmVQYWdlSWQgIT09IHRoaXMuX2VtaXR0ZWRQYWdlSWQpIHtcclxuICAgICAgdGhpcy5fZW1pdHRlZFBhZ2VJZCA9IGFjdGl2ZVBhZ2VJZDtcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KGFjdGl2ZVBhZ2VJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZXBvcnQgaGVhZGluZyBzaXplIGluIHB4IChjb25maWcgaXMgcG9pbnRzOyB0aGUgY2FudmFzIHJlbmRlcnMgYXRcclxuICAvLyA5NnB4L2luLCBzbyBwb2ludHMgw5cgOTYvNzIpLiBJbmhlcml0ZWQgYnkgY29tcG9uZW50IHRpdGxlcyB2aWEgYSBDU1MgdmFyLlxyXG4gIHB1YmxpYyBnZXQgaGVhZGluZ1NpemVQeCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgcG9pbnRzID0gdGhpcy5yZXBvcnQ/LmNvbmZpZz8uc3R5bGVzPy5oZWFkaW5nPy5zaXplID8/IERFRkFVTFRfSEVBRElOR19TSVpFO1xyXG5cclxuICAgIHJldHVybiBwb2ludHMgKiAoUFhfUEVSX0lOQ0ggLyA3Mik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgLy8gRml0IHRoZSBwYWdlIHRvIHRoZSB2aWV3cG9ydCBvbmNlIG9uIGZpcnN0IHJlbmRlcjsgYWZ0ZXIgdGhhdCB0aGVcclxuICAgIC8vIHZpZXdlcidzIHpvb20gY2hvaWNlIGlzIHJlc3BlY3RlZCBhY3Jvc3MgcmUtcmVuZGVycy5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy56b29tRml0KCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc0Zsb3coKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXBvcnQ/LmxheW91dCA9PT0gJ2Zsb3cnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhY3RpdmVQYWdlKCk6IFJlcG9ydFBhZ2UgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnJlcG9ydD8ucGFnZXM/Llt0aGlzLmFjdGl2ZVBhZ2VJbmRleF0gPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIEZsb3cgcmVuZGVyIG9yZGVyICh0aGUgYXNzZW1ibGVyIGFscmVhZHkgc29ydHMsIGJ1dCBhIGxvY2FsIHJlb3JkZXJcclxuICAvLyBtaWQtc2Vzc2lvbiBtdXN0IGhvbGQgd2l0aG91dCBhIHJlLWZldGNoKS5cclxuICBwdWJsaWMgZ2V0IGZsb3dDb21wb25lbnRzKCk6IFJlcG9ydENvbXBvbmVudFtdIHtcclxuICAgIHJldHVybiBbLi4uKHRoaXMuYWN0aXZlUGFnZT8uY29tcG9uZW50cyA/PyBbXSldLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RQYWdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4ID0gaW5kZXg7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQgPSBudWxsO1xyXG5cclxuICAgIC8vIEtlcHQgaW4gc3RlcCB3aXRoIHRoZSBuZ09uQ2hhbmdlcyBhbm5vdW5jZW1lbnQgc28gdGhlIHR3byBjYW4ndCBkaXNhZ3JlZVxyXG4gICAgLy8gYWJvdXQgd2hhdCB0aGUgaG9zdCB3YXMgbGFzdCB0b2xkLlxyXG4gICAgdGhpcy5fZW1pdHRlZFBhZ2VJZCA9IHRoaXMuYWN0aXZlUGFnZT8uaWQgPz8gbnVsbDtcclxuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdCh0aGlzLl9lbWl0dGVkUGFnZUlkKTtcclxuICB9XHJcblxyXG4gIC8vIEFwcGVuZCBhIGJsYW5rIHBhZ2U7IHRoZSBob3N0IHJlLWZldGNoZXMgdGhlIHJlcG9ydCBhbmQgbmdPbkNoYW5nZXMgbGFuZHNcclxuICAvLyB0aGUgdmlldyBvbiB0aGUgbmV3IChsYXN0KSBwYWdlLlxyXG4gIHB1YmxpYyBhZGRQYWdlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlcG9ydCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fcmVwb3J0RGF0YS5hZGRQYWdlKHRoaXMucmVwb3J0LmlkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXBvcnRDaGFuZ2VkLmVtaXQoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGFnZUxhYmVsKHBhZ2U6IFJlcG9ydFBhZ2UsIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHBhZ2UubmFtZSB8fCBgUGFnZSAke2luZGV4ICsgMX1gO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVuYW1lIGZyb20gdGhlIHRhYidzIGtlYmFiLiBUaGUgcGFnZSBsaXN0IGlzIHBhdGNoZWQgaW4gcGxhY2UgcmF0aGVyIHRoYW5cclxuICAvLyByZS1mZXRjaGluZyB0aGUgcmVwb3J0OiBub3RoaW5nIGVsc2Ugb24gdGhlIGNhbnZhcyBkZXBlbmRzIG9uIGEgcGFnZSdzXHJcbiAgLy8gbmFtZSwgYW5kIGEgcmUtZmV0Y2ggd291bGQgcmUtcnVuIGV2ZXJ5IGNvbXBvbmVudCdzIHF1ZXJ5IHRvIHJlcGFpbnQgYVxyXG4gIC8vIGNoaXAncyBsYWJlbC5cclxuICBwdWJsaWMgcmVuYW1lUGFnZShwYWdlOiBSZXBvcnRQYWdlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9tcHQuaW5wdXQoe1xyXG4gICAgICB0aXRsZTogJ0VkaXQgUGFnZSBOYW1lJyxcclxuICAgICAgbGFiZWw6ICdOYW1lJyxcclxuICAgICAgZGVmYXVsdDogcGFnZS5uYW1lID8/ICcnLFxyXG4gICAgICBjb21taXRMYWJlbDogJ1NhdmUnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgobmFtZTogc3RyaW5nKSA9PiB0aGlzLl9yZXBvcnREYXRhXHJcbiAgICAgICAgICAudXBkYXRlUGFnZSh0aGlzLnJlcG9ydC5pZCwgcGFnZS5pZCwgbmFtZSlcclxuICAgICAgICAgIC5waXBlKG1hcCgoKSA9PiBuYW1lKSkpLFxyXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBwYWdlLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU2F2ZWQgcGFnZSBuYW1lJyk7XHJcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gRGVsZXRlIGZyb20gdGhlIHRhYidzIGtlYmFiLiBUaGUgY29uZmlybSBuYW1lcyB0aGUgcGFnZSBhbmQgc2F5cyB0aGVcclxuICAvLyBjb21wb25lbnRzIGdvIHdpdGggaXQg4oCUIHRoZSBzZXJ2ZXIgcmVmdXNlcyB0aGUgbGFzdCBwYWdlLCBhbmQgdGhhdCByZWZ1c2FsXHJcbiAgLy8gc3VyZmFjZXMgYXMgdGhlIEFQSSBlcnJvciBtZXNzYWdlIHJhdGhlciB0aGFuIGJlaW5nIHNlY29uZC1ndWVzc2VkIGhlcmUuXHJcbiAgcHVibGljIGRlbGV0ZVBhZ2UocGFnZTogUmVwb3J0UGFnZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xyXG4gICAgICB0aXRsZTogJ0NvbmZpcm0nLFxyXG4gICAgICB0ZW1wbGF0ZTogYEFyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byBkZWxldGUgXCIke3RoaXMucGFnZUxhYmVsKHBhZ2UsIHRoaXMucmVwb3J0LnBhZ2VzLmluZGV4T2YocGFnZSkpfVwiIGFuZCBldmVyeXRoaW5nIG9uIGl0P2AsXHJcbiAgICB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5kZWxldGVQYWdlKHRoaXMucmVwb3J0LmlkLCBwYWdlLmlkKSksXHJcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXBvcnQucGFnZXMuaW5kZXhPZihwYWdlKTtcclxuICAgICAgICB0aGlzLnJlcG9ydC5wYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAvLyBMYW5kIG9uIHRoZSBuZWlnaGJvdXIgcmF0aGVyIHRoYW4gc25hcHBpbmcgYmFjayB0byB0aGUgZmlyc3QgcGFnZSDigJRcclxuICAgICAgICAvLyBkZWxldGluZyBwYWdlIDQgb2YgNiBzaG91bGQgbGVhdmUgeW91IGxvb2tpbmcgYXQgd2hhdCBpcyBub3cgcGFnZSA0LlxyXG4gICAgICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHRoaXMucmVwb3J0LnBhZ2VzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ID0gdGhpcy5yZXBvcnQucGFnZXMubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIFRoZSBpZCBpbiB0aGUgVVJMIGp1c3Qgc3RvcHBlZCBleGlzdGluZyDigJQgcmVwbGFjZSBpdCB3aXRoIHRoZVxyXG4gICAgICAgIC8vIG5laWdoYm91ciB3ZSBsYW5kZWQgb24sIG9yIGEgcmVmcmVzaCB3b3VsZCA0MDQgaXRzIHdheSB0byBwYWdlIG9uZS5cclxuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQodGhpcy5hY3RpdmVQYWdlPy5pZCA/PyBudWxsKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdEZWxldGVkIHBhZ2UnKTtcclxuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBBIHRhYiB3YXMgZHJhZ2dlZCB0byBhIG5ldyBzbG90OiByZW9yZGVyIGxvY2FsbHkgc28gdGhlIGNoaXBzIHNldHRsZVxyXG4gIC8vIGltbWVkaWF0ZWx5LCBrZWVwIHRoZSB2aWV3ZXIgb24gdGhlIHBhZ2UgdGhleSB3ZXJlIGxvb2tpbmcgYXQsIGFuZCBwZXJzaXN0XHJcbiAgLy8gdGhlIHdob2xlIHNlcXVlbmNlIGluIG9uZSBQVVQuXHJcbiAgcHVibGljIG9uUGFnZURyb3BwZWQoZXZlbnQ6IENka0RyYWdEcm9wPHVua25vd24+KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQucHJldmlvdXNJbmRleCA9PT0gZXZlbnQuY3VycmVudEluZGV4KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhY3RpdmVQYWdlID0gdGhpcy5hY3RpdmVQYWdlO1xyXG5cclxuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLnJlcG9ydC5wYWdlcywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuXHJcbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLnJlcG9ydC5wYWdlcy5tYXAoKHBhZ2UsIG9yZGVyKSA9PiB7XHJcbiAgICAgIHBhZ2Uub3JkZXIgPSBvcmRlcjtcclxuXHJcbiAgICAgIHJldHVybiB7IHBhZ2VJZDogcGFnZS5pZCwgb3JkZXIgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4ID0gYWN0aXZlUGFnZVxyXG4gICAgICA/IHRoaXMucmVwb3J0LnBhZ2VzLmluZGV4T2YoYWN0aXZlUGFnZSlcclxuICAgICAgOiB0aGlzLmFjdGl2ZVBhZ2VJbmRleDtcclxuXHJcbiAgICB0aGlzLl9yZXBvcnREYXRhLnNhdmVQYWdlUG9zaXRpb25zKHRoaXMucmVwb3J0LmlkLCBwb3NpdGlvbnMpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZCBwcmVzZW50YXRpb24gc2V0dGluZ3MgKHRpdGxlLCBwYWRkaW5nKSBzYXZlZCBpbiB0aGUgc2V0dGluZ3MgZGlhbG9nIHRvXHJcbiAgLy8gdGhlIG9uZSBjb21wb25lbnQgdGhleSBiZWxvbmcgdG8uIE5vdGhpbmcgaGVyZSBmZWVkcyB0aGUgcXVlcnksIHNvIHRoYXRcclxuICAvLyBjb21wb25lbnQgcmVwYWludHMgYW5kIGV2ZXJ5IG90aGVyIG9uZSBvbiB0aGUgcGFnZSBpcyBsZWZ0IGFsb25lLlxyXG4gIHB1YmxpYyBhcHBseUNvbXBvbmVudFNldHRpbmdzKGNvbXBvbmVudElkOiBudW1iZXIsIHNldHRpbmdzOiBDb21wb25lbnRTZXR0aW5ncyk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnRzXHJcbiAgICAgIC5maW5kKChyZW5kZXJlZCkgPT4gcmVuZGVyZWQuY29tcG9uZW50LmlkID09PSBjb21wb25lbnRJZClcclxuICAgICAgPy5hcHBseVNldHRpbmdzKHNldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RDb21wb25lbnQoY29tcG9uZW50SWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCA9IGNvbXBvbmVudElkO1xyXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DYW52YXNQb2ludGVyRG93bigpOiB2b2lkIHtcclxuICAgIC8vIEJhY2tncm91bmQgY2xpY2sgKHBhbiBzdGFydCkgZGVzZWxlY3RzLlxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIC0tLS0tIHpvb20gdG9vbGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgcHVibGljIG9uWm9vbWVkKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuem9vbSA9IHNjYWxlO1xyXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgem9vbUluKCk6IHZvaWQge1xyXG4gICAgdGhpcy56b29tUGFuPy56b29tSW4oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB6b29tT3V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy56b29tUGFuPy56b29tT3V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgem9vbUZpdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fdmlld3BvcnQ/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIXZpZXdwb3J0IHx8ICF0aGlzLnJlcG9ydD8ucGFnZVdpZHRoIHx8ICF0aGlzLnpvb21QYW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpdCA9IE1hdGgubWluKFxyXG4gICAgICAodmlld3BvcnQuY2xpZW50V2lkdGggLSAzMikgLyAodGhpcy5yZXBvcnQucGFnZVdpZHRoICogUFhfUEVSX0lOQ0gpLFxyXG4gICAgICAodmlld3BvcnQuY2xpZW50SGVpZ2h0IC0gMzIpIC8gKHRoaXMucmVwb3J0LnBhZ2VIZWlnaHQgKiBQWF9QRVJfSU5DSCksXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuem9vbVBhbi56b29tKE1hdGgubWluKDEuNSwgTWF0aC5tYXgoMC4xLCBmaXQpKSk7XHJcbiAgICB0aGlzLnpvb21QYW4ubW92ZSgxNiwgMTYpO1xyXG4gICAgdGhpcy5fZml0dGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB6b29tQWN0dWFsKCk6IHZvaWQge1xyXG4gICAgdGhpcy56b29tUGFuPy56b29tKDEpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0gcGVyc2lzdGVuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvLyBBIGZyZWVmb3JtIGRyYWcvcmVzaXplIG9yIGEgZmxvdyB3aWR0aCByZXNpemUgbGFuZGVkIOKAlCBvbmUgUFVUIHBlciBnZXN0dXJlLlxyXG4gIHB1YmxpYyBvblBvc2l0aW9uQ2hhbmdlZChwb3NpdGlvbjogeyBjb21wb25lbnRJZDogbnVtYmVyIH0gJiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KTogdm9pZCB7XHJcbiAgICB0aGlzLl9jbGVhckd1aWRlcygpO1xyXG4gICAgdGhpcy5fcmVwb3J0RGF0YS5zYXZlUG9zaXRpb25zKHRoaXMucmVwb3J0LmlkLCBbcG9zaXRpb24gYXMgYW55XSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBBIGZsb3cgZHJhZyBkcm9wcGVkOiByZW9yZGVyIHRoZSBwYWdlJ3MgY29tcG9uZW50cyBhcm91bmQgdGhlIG1vdmVkIG9uZVxyXG4gIC8vIGFuZCBwZXJzaXN0IGV2ZXJ5IG9yZGVyIGluIG9uZSBQVVQuXHJcbiAgcHVibGljIG9uRmxvd1Jlb3JkZXIoZXZlbnQ6IHsgY29tcG9uZW50SWQ6IG51bWJlcjsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFnZSA9IHRoaXMuYWN0aXZlUGFnZTtcclxuICAgIGlmICghcGFnZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3JkZXJlZCA9IHRoaXMuZmxvd0NvbXBvbmVudHMuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC5pZCAhPT0gZXZlbnQuY29tcG9uZW50SWQpO1xyXG4gICAgY29uc3QgbW92ZWQgPSBwYWdlLmNvbXBvbmVudHMuZmluZCgoY29tcG9uZW50KSA9PiBjb21wb25lbnQuaWQgPT09IGV2ZW50LmNvbXBvbmVudElkKTtcclxuICAgIGlmICghbW92ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZmxvd0Ryb3BJbmRleChvcmRlcmVkLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcclxuICAgIG9yZGVyZWQuc3BsaWNlKGluZGV4LCAwLCBtb3ZlZCk7XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb25zID0gb3JkZXJlZC5tYXAoKGNvbXBvbmVudCwgb3JkZXIpID0+IHtcclxuICAgICAgY29tcG9uZW50Lm9yZGVyID0gb3JkZXI7XHJcblxyXG4gICAgICByZXR1cm4geyBjb21wb25lbnRJZDogY29tcG9uZW50LmlkLCBvcmRlciB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLl9yZXBvcnREYXRhLnNhdmVQb3NpdGlvbnModGhpcy5yZXBvcnQuaWQsIHBvc2l0aW9ucylcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBXaGVyZSB0aGUgcG9pbnRlciBsYW5kZWQgYW1vbmcgdGhlIGZsb3dlZCBjb21wb25lbnRzOiBiZWZvcmUgdGhlIGZpcnN0XHJcbiAgLy8gY29tcG9uZW50IHdob3NlIGNlbnRlciB0aGUgcG9pbnRlciBpcyBhYm92ZS9sZWZ0IG9mLlxyXG4gIHByaXZhdGUgX2Zsb3dEcm9wSW5kZXgob3JkZXJlZDogUmVwb3J0Q29tcG9uZW50W10sIGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGhvc3RzID0gQXJyYXkuZnJvbShcclxuICAgICAgdGhpcy5fdmlld3BvcnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignYXBwLXJlcG9ydC1jb21wb25lbnQnKSxcclxuICAgICkuZmlsdGVyKChob3N0KSA9PiAhaG9zdC5jbGFzc0xpc3QuY29udGFpbnMoJ2Zsb3ctZHJhZ2dpbmcnKSk7XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGhvc3RzLmxlbmd0aCAmJiBpbmRleCA8IG9yZGVyZWQubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSBob3N0c1tpbmRleF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGlmIChjbGllbnRZIDwgcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDJcclxuICAgICAgICB8fCAoY2xpZW50WSA8IHJlY3QuYm90dG9tICYmIGNsaWVudFggPCByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMikpIHtcclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3JkZXJlZC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLSBzbWFydCBndWlkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8vIFBpeGVsIGZlZWwgb2YgdGhlIHNuYXAsIGNvbnZlcnRlZCB0byBpbmNoZXMgYXQgdGhlIGN1cnJlbnQgem9vbS5cclxuICBwcml2YXRlIGdldCBfc25hcFRocmVzaG9sZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIDggLyAoUFhfUEVSX0lOQ0ggKiBNYXRoLm1heCgwLjEsIHRoaXMuem9vbSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc25hcE1vdmUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHg6IG51bWJlciwgeTogbnVtYmVyKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcclxuICAgIGNvbnN0IHsgdmVydGljYWwsIGhvcml6b250YWwgfSA9IHRoaXMuX2NhbmRpZGF0ZXMoY29tcG9uZW50KTtcclxuICAgIGNvbnN0IGd1aWRlczogR3VpZGVMaW5lW10gPSBbXTtcclxuXHJcbiAgICBjb25zdCBzbmFwcGVkWCA9IHRoaXMuX3NuYXBBeGlzKFxyXG4gICAgICBbXHJcbiAgICAgICAgeyBvZmZzZXQ6IDAsIHZhbHVlOiB4IH0sXHJcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC53IC8gMiwgdmFsdWU6IHggKyBjb21wb25lbnQudyAvIDIgfSxcclxuICAgICAgICB7IG9mZnNldDogY29tcG9uZW50LncsIHZhbHVlOiB4ICsgY29tcG9uZW50LncgfSxcclxuICAgICAgXSxcclxuICAgICAgdmVydGljYWwsXHJcbiAgICApO1xyXG4gICAgaWYgKHNuYXBwZWRYICE9PSBudWxsKSB7XHJcbiAgICAgIHggPSBzbmFwcGVkWC5iYXNlO1xyXG4gICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAndicsIHBvc2l0aW9uOiBzbmFwcGVkWC5ndWlkZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzbmFwcGVkWSA9IHRoaXMuX3NuYXBBeGlzKFxyXG4gICAgICBbXHJcbiAgICAgICAgeyBvZmZzZXQ6IDAsIHZhbHVlOiB5IH0sXHJcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC5oIC8gMiwgdmFsdWU6IHkgKyBjb21wb25lbnQuaCAvIDIgfSxcclxuICAgICAgICB7IG9mZnNldDogY29tcG9uZW50LmgsIHZhbHVlOiB5ICsgY29tcG9uZW50LmggfSxcclxuICAgICAgXSxcclxuICAgICAgaG9yaXpvbnRhbCxcclxuICAgICk7XHJcbiAgICBpZiAoc25hcHBlZFkgIT09IG51bGwpIHtcclxuICAgICAgeSA9IHNuYXBwZWRZLmJhc2U7XHJcbiAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICdoJywgcG9zaXRpb246IHNuYXBwZWRZLmd1aWRlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3JlbmRlckd1aWRlcyhndWlkZXMpO1xyXG5cclxuICAgIHJldHVybiB7IHgsIHkgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NuYXBSZXNpemUoXHJcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcclxuICAgIGdlb21ldHJ5OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9LFxyXG4gICAgaGFuZGxlOiBzdHJpbmcsXHJcbiAgKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB7XHJcbiAgICBjb25zdCB7IHZlcnRpY2FsLCBob3Jpem9udGFsIH0gPSB0aGlzLl9jYW5kaWRhdGVzKGNvbXBvbmVudCk7XHJcbiAgICBjb25zdCBndWlkZXM6IEd1aWRlTGluZVtdID0gW107XHJcbiAgICBjb25zdCByZXN1bHQgPSB7IC4uLmdlb21ldHJ5IH07XHJcblxyXG4gICAgLy8gT25seSB0aGUgZWRnZXMgdGhlIGhhbmRsZSBtb3ZlcyBwYXJ0aWNpcGF0ZSBpbiBzbmFwcGluZy5cclxuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ2UnKSkge1xyXG4gICAgICBjb25zdCBzbmFwcGVkID0gdGhpcy5fbmVhcmVzdChnZW9tZXRyeS54ICsgZ2VvbWV0cnkudywgdmVydGljYWwpO1xyXG4gICAgICBpZiAoc25hcHBlZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJlc3VsdC53ID0gc25hcHBlZCAtIGdlb21ldHJ5Lng7XHJcbiAgICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ3YnLCBwb3NpdGlvbjogc25hcHBlZCB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygndycpKSB7XHJcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LngsIHZlcnRpY2FsKTtcclxuICAgICAgaWYgKHNuYXBwZWQgIT09IG51bGwpIHtcclxuICAgICAgICByZXN1bHQudyA9IGdlb21ldHJ5LnggKyBnZW9tZXRyeS53IC0gc25hcHBlZDtcclxuICAgICAgICByZXN1bHQueCA9IHNuYXBwZWQ7XHJcbiAgICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ3YnLCBwb3NpdGlvbjogc25hcHBlZCB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygncycpKSB7XHJcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LnkgKyBnZW9tZXRyeS5oLCBob3Jpem9udGFsKTtcclxuICAgICAgaWYgKHNuYXBwZWQgIT09IG51bGwpIHtcclxuICAgICAgICByZXN1bHQuaCA9IHNuYXBwZWQgLSBnZW9tZXRyeS55O1xyXG4gICAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICdoJywgcG9zaXRpb246IHNuYXBwZWQgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ24nKSkge1xyXG4gICAgICBjb25zdCBzbmFwcGVkID0gdGhpcy5fbmVhcmVzdChnZW9tZXRyeS55LCBob3Jpem9udGFsKTtcclxuICAgICAgaWYgKHNuYXBwZWQgIT09IG51bGwpIHtcclxuICAgICAgICByZXN1bHQuaCA9IGdlb21ldHJ5LnkgKyBnZW9tZXRyeS5oIC0gc25hcHBlZDtcclxuICAgICAgICByZXN1bHQueSA9IHNuYXBwZWQ7XHJcbiAgICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ2gnLCBwb3NpdGlvbjogc25hcHBlZCB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3JlbmRlckd1aWRlcyhndWlkZXMpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyBBbGlnbm1lbnQgY2FuZGlkYXRlczogdGhlIHBhZ2UncyBlZGdlcyArIGNlbnRlciwgYW5kIGV2ZXJ5IHNpYmxpbmcnc1xyXG4gIC8vIGVkZ2VzICsgY2VudGVycy5cclxuICBwcml2YXRlIF9jYW5kaWRhdGVzKG1vdmluZzogUmVwb3J0Q29tcG9uZW50KTogeyB2ZXJ0aWNhbDogbnVtYmVyW107IGhvcml6b250YWw6IG51bWJlcltdIH0ge1xyXG4gICAgY29uc3QgdmVydGljYWwgPSBbMCwgdGhpcy5yZXBvcnQucGFnZVdpZHRoIC8gMiwgdGhpcy5yZXBvcnQucGFnZVdpZHRoXTtcclxuICAgIGNvbnN0IGhvcml6b250YWwgPSBbMCwgdGhpcy5yZXBvcnQucGFnZUhlaWdodCAvIDIsIHRoaXMucmVwb3J0LnBhZ2VIZWlnaHRdO1xyXG5cclxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuYWN0aXZlUGFnZT8uY29tcG9uZW50cyA/PyBbXSkge1xyXG4gICAgICBpZiAoY29tcG9uZW50LmlkID09PSBtb3ZpbmcuaWQpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmVydGljYWwucHVzaChjb21wb25lbnQueCwgY29tcG9uZW50LnggKyBjb21wb25lbnQudyAvIDIsIGNvbXBvbmVudC54ICsgY29tcG9uZW50LncpO1xyXG4gICAgICBob3Jpem9udGFsLnB1c2goY29tcG9uZW50LnksIGNvbXBvbmVudC55ICsgY29tcG9uZW50LmggLyAyLCBjb21wb25lbnQueSArIGNvbXBvbmVudC5oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCB9O1xyXG4gIH1cclxuXHJcbiAgLy8gU25hcCBvbmUgYXhpczogb2YgdGhlIG1vdmluZyBib3gncyB0aHJlZSBsaW5lcyAoZWRnZS9jZW50ZXIvZWRnZSksIGZpbmRcclxuICAvLyB0aGUgY2xvc2VzdCBjYW5kaWRhdGUgd2l0aGluIHRocmVzaG9sZCBhbmQgcmV0dXJuIHRoZSBhZGp1c3RlZCBiYXNlXHJcbiAgLy8gY29vcmRpbmF0ZSBwbHVzIHRoZSBndWlkZSB0byBkcmF3LlxyXG4gIHByaXZhdGUgX3NuYXBBeGlzKFxyXG4gICAgbGluZXM6IHsgb2Zmc2V0OiBudW1iZXI7IHZhbHVlOiBudW1iZXIgfVtdLFxyXG4gICAgY2FuZGlkYXRlczogbnVtYmVyW10sXHJcbiAgKTogeyBiYXNlOiBudW1iZXI7IGd1aWRlOiBudW1iZXIgfSB8IG51bGwge1xyXG4gICAgbGV0IGJlc3Q6IHsgYmFzZTogbnVtYmVyOyBndWlkZTogbnVtYmVyOyBkaXN0YW5jZTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xyXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoY2FuZGlkYXRlIC0gbGluZS52YWx1ZSk7XHJcbiAgICAgICAgaWYgKGRpc3RhbmNlIDw9IHRoaXMuX3NuYXBUaHJlc2hvbGQgJiYgKCFiZXN0IHx8IGRpc3RhbmNlIDwgYmVzdC5kaXN0YW5jZSkpIHtcclxuICAgICAgICAgIGJlc3QgPSB7IGJhc2U6IGNhbmRpZGF0ZSAtIGxpbmUub2Zmc2V0LCBndWlkZTogY2FuZGlkYXRlLCBkaXN0YW5jZSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBiZXN0ID8geyBiYXNlOiBiZXN0LmJhc2UsIGd1aWRlOiBiZXN0Lmd1aWRlIH0gOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbmVhcmVzdCh2YWx1ZTogbnVtYmVyLCBjYW5kaWRhdGVzOiBudW1iZXJbXSk6IG51bWJlciB8IG51bGwge1xyXG4gICAgbGV0IGJlc3Q6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgbGV0IGJlc3REaXN0YW5jZSA9IHRoaXMuX3NuYXBUaHJlc2hvbGQ7XHJcblxyXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xyXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGNhbmRpZGF0ZSAtIHZhbHVlKTtcclxuICAgICAgaWYgKGRpc3RhbmNlIDw9IGJlc3REaXN0YW5jZSkge1xyXG4gICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7XHJcbiAgICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYmVzdDtcclxuICB9XHJcblxyXG4gIC8vIFRoZSBndWlkZXMgb3ZlcmxheSBpcyBkcmF3biBpbXBlcmF0aXZlbHkg4oCUIHRoZSBkcmFnIGxvb3AgcnVucyBvdXRzaWRlXHJcbiAgLy8gQW5ndWxhciBhbmQgcmVwYWludHMgb24gZXZlcnkgcG9pbnRlcm1vdmUuXHJcbiAgcHJpdmF0ZSBfcmVuZGVyR3VpZGVzKGd1aWRlczogR3VpZGVMaW5lW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGhvc3QgPSB0aGlzLl9ndWlkZXM/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIWhvc3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGhvc3QucmVwbGFjZUNoaWxkcmVuKC4uLmd1aWRlcy5tYXAoKGd1aWRlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgbGluZS5jbGFzc05hbWUgPSBgZ3VpZGUgZ3VpZGUtJHtndWlkZS5vcmllbnRhdGlvbn1gO1xyXG4gICAgICBpZiAoZ3VpZGUub3JpZW50YXRpb24gPT09ICd2Jykge1xyXG4gICAgICAgIGxpbmUuc3R5bGUubGVmdCA9IGAke2d1aWRlLnBvc2l0aW9uICogUFhfUEVSX0lOQ0h9cHhgO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxpbmUuc3R5bGUudG9wID0gYCR7Z3VpZGUucG9zaXRpb24gKiBQWF9QRVJfSU5DSH1weGA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBsaW5lO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xlYXJHdWlkZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ndWlkZXM/Lm5hdGl2ZUVsZW1lbnQ/LnJlcGxhY2VDaGlsZHJlbigpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FudmFzXCI+XG4gIDxkaXZcbiAgICAjdmlld3BvcnRcbiAgICBjbGFzcz1cInBhZ2Utdmlld3BvcnRcIlxuICAgIChwb2ludGVyZG93bik9XCJvbkNhbnZhc1BvaW50ZXJEb3duKClcIj5cbiAgICA8ZnMtem9vbS1wYW5cbiAgICAgIFt6b29tTWluXT1cIjAuMVwiXG4gICAgICBbem9vbU1heF09XCIzXCJcbiAgICAgICh6b29tZWQpPVwib25ab29tZWQoJGV2ZW50KVwiPlxuICAgICAgQGlmIChhY3RpdmVQYWdlOyBhcyBwYWdlKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInBhZ2VcIlxuICAgICAgICAgIFtjbGFzcy5mbG93XT1cImlzRmxvd1wiXG4gICAgICAgICAgW2NsYXNzLmVkaXRpbmddPVwiZWRpdE1vZGVcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJyZXBvcnQucGFnZVdpZHRoICogUFhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicmVwb3J0LnBhZ2VIZWlnaHQgKiBQWFwiXG4gICAgICAgICAgW3N0eWxlLnBhZGRpbmcucHhdPVwiaXNGbG93ID8gZmxvd1BhZGRpbmcgKiBQWCA6IDBcIlxuICAgICAgICAgIFtzdHlsZS4tLWNhbnZhcy16b29tXT1cInpvb21cIlxuICAgICAgICAgIFtzdHlsZS4tLXJlcG9ydC1oZWFkaW5nLXNpemUucHhdPVwiaGVhZGluZ1NpemVQeFwiPlxuICAgICAgICAgIEBpZiAoaXNGbG93KSB7XG4gICAgICAgICAgICBAZm9yIChjb21wb25lbnQgb2YgZmxvd0NvbXBvbmVudHM7IHRyYWNrIGNvbXBvbmVudC5pZCkge1xuICAgICAgICAgICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsb3ctaXRlbVwiXG4gICAgICAgICAgICAgICAgW3JlcG9ydElkXT1cInJlcG9ydC5pZFwiXG4gICAgICAgICAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxuICAgICAgICAgICAgICAgIFtncm91cHNdPVwiZ3JvdXBzXCJcbiAgICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiZWRpdE1vZGVcIlxuICAgICAgICAgICAgICAgIFtsYXlvdXRdPVwiJ2Zsb3cnXCJcbiAgICAgICAgICAgICAgICBbem9vbV09XCJ6b29tXCJcbiAgICAgICAgICAgICAgICBbc25hcHBlcl09XCJzbmFwcGVyXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY29tcG9uZW50LmlkID09PSBzZWxlY3RlZENvbXBvbmVudElkXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJjb21wb25lbnQuZmxvd1dpZHRoXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbXBvbmVudC5hdXRvSGVpZ2h0ID8gbnVsbCA6IGNvbXBvbmVudC5oICogUFhcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RDb21wb25lbnQpPVwic2VsZWN0Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZWQpPVwib25Qb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZsb3dSZW9yZGVyKT1cIm9uRmxvd1Jlb3JkZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9wZW5TZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncy5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBwYWdlLmNvbXBvbmVudHM7IHRyYWNrIGNvbXBvbmVudC5pZCkge1xuICAgICAgICAgICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnRcbiAgICAgICAgICAgICAgICBbcmVwb3J0SWRdPVwicmVwb3J0LmlkXCJcbiAgICAgICAgICAgICAgICBbY29tcG9uZW50XT1cImNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgW2dyb3Vwc109XCJncm91cHNcIlxuICAgICAgICAgICAgICAgIFtlZGl0TW9kZV09XCJlZGl0TW9kZVwiXG4gICAgICAgICAgICAgICAgW2xheW91dF09XCInZnJlZWZvcm0nXCJcbiAgICAgICAgICAgICAgICBbem9vbV09XCJ6b29tXCJcbiAgICAgICAgICAgICAgICBbc25hcHBlcl09XCJzbmFwcGVyXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY29tcG9uZW50LmlkID09PSBzZWxlY3RlZENvbXBvbmVudElkXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJjb21wb25lbnQueCAqIFBYXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cImNvbXBvbmVudC55ICogUFhcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb21wb25lbnQudyAqIFBYXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbXBvbmVudC5hdXRvSGVpZ2h0ID8gbnVsbCA6IGNvbXBvbmVudC5oICogUFhcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RDb21wb25lbnQpPVwic2VsZWN0Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZWQpPVwib25Qb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9wZW5TZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncy5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZ3VpZGVzXG4gICAgICAgICAgICBjbGFzcz1cImd1aWRlc1wiPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgQGlmICghcGFnZS5jb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZ2UtZW1wdHlcIj5cbiAgICAgICAgICAgICAgQXNrIHRoZSBhc3Npc3RhbnQgdG8gYWRkIGEgY2hhcnQsIGxpc3Qgb3IgS1BJIHRvIHRoaXMgcGFnZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9mcy16b29tLXBhbj5cblxuICAgIEBpZiAoZWRpdE1vZGUpIHtcbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBjbGFzcz1cImVkaXQtZG9uZVwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJFeGl0IGxheW91dCBlZGl0aW5nXCJcbiAgICAgICAgKGNsaWNrKT1cImVkaXREb25lLmVtaXQoKVwiPlxuICAgICAgICA8bWF0LWljb24+Y2hlY2s8L21hdC1pY29uPlxuICAgICAgICBEb25lIGVkaXRpbmdcbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNhbnZhcy10b29sYmFyXCI+XG4gICAgPCEtLSBUYWJzIGFyZSBvbmUgaG9yaXpvbnRhbCBkcm9wIGxpc3Q6IGRyYWdnaW5nIGEgY2hpcCByZW9yZGVycyB0aGUgcGFnZXMuXG4gICAgICAgICBUaGUgZHJvcCBJTkRFWCBpcyBjb21wdXRlZCBhbG9uZyBYIChvcmllbnRhdGlvbiksIGJ1dCB0aGUgcHJldmlldyBpc1xuICAgICAgICAgZGVsaWJlcmF0ZWx5IGxlZnQgdW5ib3VuZGVkIG9uIGJvdGggYXhlcyDigJQgcGlubmluZyBpdCB0byB0aGUgcm93IHdpdGhcbiAgICAgICAgIGNka0RyYWdCb3VuZGFyeSBtZWFucyB0aGUgY2hpcCB5b3UgYXJlIGRyYWdnaW5nIGNvdmVycyB0aGUgY2hpcHMgeW91XG4gICAgICAgICBhcmUgZHJhZ2dpbmcgaXQgcGFzdCwgYW5kIHlvdSBjYW5ub3Qgc2VlIHdoZXJlIGl0IGlzIGdvaW5nIHRvIGxhbmQuIC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicGFnZS10YWJzXCJcbiAgICAgIGNka0Ryb3BMaXN0XG4gICAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uUGFnZURyb3BwZWQoJGV2ZW50KVwiPlxuICAgICAgQGlmICgocmVwb3J0Py5wYWdlcz8ubGVuZ3RoID8/IDApID4gMSkge1xuICAgICAgICBAZm9yIChwYWdlIG9mIHJlcG9ydC5wYWdlczsgdHJhY2sgcGFnZS5pZDsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgPCEtLSBUaGUgY2hpcCBpcyB0aGUgZHJhZyBoYW5kbGUgQU5EIHRoZSB0YWI6IGNsaWNraW5nIHNlbGVjdHMsXG4gICAgICAgICAgICAgICBkcmFnZ2luZyByZW9yZGVycy4gVGhlIGtlYmFiIGxpdmVzIGluc2lkZSBpdCwgc28gdGhlIHdob2xlXG4gICAgICAgICAgICAgICBjb250cm9sIHN0YXlzIG9uZSBjaGlwIGluc3RlYWQgb2YgZ3Jvd2luZyBhIHNlY29uZCBidXR0b24uIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgIGNsYXNzPVwicGFnZS10YWJcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpbmRleCA9PT0gYWN0aXZlUGFnZUluZGV4XCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQYWdlKGluZGV4KVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdlLXRhYi1sYWJlbFwiPnt7IHBhZ2VMYWJlbChwYWdlLCBpbmRleCkgfX08L3NwYW4+XG4gICAgICAgICAgICA8IS0tIFRoZSBrZWJhYiBvcGVucyB0aGUgbWVudSByYXRoZXIgdGhhbiBzdGFydGluZyBhIGRyYWcgb3JcbiAgICAgICAgICAgICAgICAgc3dpdGNoaW5nIHBhZ2VzLCBzbyBpdCBzd2FsbG93cyBpdHMgb3duIGNsaWNrLiAtLT5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzPVwicGFnZS10YWItbWVudVwiXG4gICAgICAgICAgICAgIFtmc01lbnVUcmlnZ2VyRm9yXT1cInBhZ2VNZW51XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gT3V0c2lkZSB0aGUgY2hpcDogY2RrRHJhZyBjbG9uZXMgaXRzIGhvc3QgaW50byB0aGUgZHJhZyBwcmV2aWV3LFxuICAgICAgICAgICAgICAgYW5kIGEgbWVudSBvdmVybGF5IGFuY2hvcmVkIHRvIGEgY2xvbmVkIHRyaWdnZXIgb3BlbnMgZGV0YWNoZWRcbiAgICAgICAgICAgICAgIGZyb20gdGhlIHJlYWwgdGFiLiAtLT5cbiAgICAgICAgICA8ZnMtbWVudSAjcGFnZU1lbnU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW5hbWVQYWdlKHBhZ2UpXCI+XG4gICAgICAgICAgICAgIEVkaXQgbmFtZVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVBhZ2UocGFnZSlcIj5cbiAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZnMtbWVudT5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJwYWdlLXRhYiBhZGQtcGFnZVwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgcGFnZVwiXG4gICAgICAgIChjbGljayk9XCJhZGRQYWdlKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgIFBhZ2VcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInpvb20tY29udHJvbHNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiem9vbS1idXR0b25cIlxuICAgICAgICBtYXRUb29sdGlwPVwiWm9vbSBvdXRcIlxuICAgICAgICAoY2xpY2spPVwiem9vbU91dCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5yZW1vdmU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInpvb20tbGFiZWxcIlxuICAgICAgICBtYXRUb29sdGlwPVwiWm9vbSB0byAxMDAlXCJcbiAgICAgICAgKGNsaWNrKT1cInpvb21BY3R1YWwoKVwiPlxuICAgICAgICB7eyAoem9vbSAqIDEwMCkudG9GaXhlZCgwKSB9fSVcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJ6b29tLWJ1dHRvblwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJab29tIGluXCJcbiAgICAgICAgKGNsaWNrKT1cInpvb21JbigpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkZpdCBwYWdlXCJcbiAgICAgICAgKGNsaWNrKT1cInpvb21GaXQoKVwiPlxuICAgICAgICA8bWF0LWljb24+Zml0X3NjcmVlbjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
478
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNhbnZhcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvcmVwb3J0LWNhbnZhcy9yZXBvcnQtY2FudmFzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDVSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUNoRixVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUMvRixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQWUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0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QU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBEZXN0cm95UmVmLFxyXG4gIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBpbmplY3QsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuXHJcbmltcG9ydCB7IENka0RyYWdEcm9wLCBEcmFnRHJvcE1vZHVsZSwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5cclxuaW1wb3J0IHsgRnNNZW51TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVudSc7XHJcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xyXG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XHJcbmltcG9ydCB7IEZzWm9vbVBhbkNvbXBvbmVudCwgRnNab29tUGFuTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvem9vbS1wYW4nO1xyXG5cclxuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRTZXR0aW5ncywgUmVwb3J0LCBSZXBvcnRDb21wb25lbnQsIFJlcG9ydEZpbHRlckdyb3VwLCBSZXBvcnRQYWdlLFxyXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XHJcbmltcG9ydCB7IERFRkFVTFRfSEVBRElOR19TSVpFLCBGTE9XX1BBRERJTkcgfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xyXG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnRDb21wb25lbnQgfSBmcm9tICcuLi9yZXBvcnQtY29tcG9uZW50L3JlcG9ydC1jb21wb25lbnQuY29tcG9uZW50JztcclxuXHJcblxyXG4vLyBTY3JlZW4gZGVuc2l0eSBvZiB0aGUgY2FudmFzOiA5NiBDU1MgcHggcGVyIGluY2ggKHRoZSBDU1MgcmVmZXJlbmNlIHBpeGVsKSxcclxuLy8gYmVmb3JlIHpvb20uIEFsbCBnZW9tZXRyeSBzdGF5cyBpbiBpbmNoZXM7IG9ubHkgcmVuZGVyaW5nIG11bHRpcGxpZXMgYnkgaXQuXHJcbmV4cG9ydCBjb25zdCBQWF9QRVJfSU5DSCA9IDk2O1xyXG5cclxuLy8gT25lIHNtYXJ0IGd1aWRlIGxpbmUsIGluIHBhZ2UgaW5jaGVzLlxyXG5leHBvcnQgaW50ZXJmYWNlIEd1aWRlTGluZSB7XHJcbiAgb3JpZW50YXRpb246ICd2JyB8ICdoJztcclxuICBwb3NpdGlvbjogbnVtYmVyO1xyXG59XHJcblxyXG4vLyBUaGUgc25hcHBpbmcgY29udHJhY3QgaGFuZGVkIHRvIGVhY2ggY29tcG9uZW50J3MgZHJhZyBsb29wLiBJbXBsZW1lbnRlZCBieVxyXG4vLyB0aGUgY2FudmFzIGJlY2F1c2Ugb25seSBpdCBzZWVzIGV2ZXJ5IGNvbXBvbmVudCAoYWxpZ25tZW50IGNhbmRpZGF0ZXMpIGFuZFxyXG4vLyBvd25zIHRoZSBndWlkZXMgb3ZlcmxheS5cclxuZXhwb3J0IGludGVyZmFjZSBDYW52YXNTbmFwcGVyIHtcclxuICBzbmFwTW92ZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XHJcbiAgc25hcFJlc2l6ZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgZ2VvbWV0cnk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0sIGhhbmRsZTogc3RyaW5nKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfTtcclxuICBjbGVhcigpOiB2b2lkO1xyXG59XHJcblxyXG4vLyBUaGUgZml4ZWQtc2l6ZSBwYWdlIGNhbnZhcyDigJQgdGhlIFBvd2VyUG9pbnQgbW9kZWwuIFBhZ2VzIGFyZSB0YWJzIChvbmx5IHRoZVxyXG4vLyBBQ1RJVkUgcGFnZSdzIGNvbXBvbmVudHMgZXhpc3Qg4oaSIG9ubHkgdGhleSBmZXRjaCk7IHRoZSBwYWdlIGlzIGFcclxuLy8gcGFnZVdpZHRow5dwYWdlSGVpZ2h0IElOQ0hFUyBzaGVldCByZW5kZXJlZCBhdCA5NnB4L2luIGluc2lkZSBmcy16b29tLXBhblxyXG4vLyAod2hlZWwgem9vbSwgYmFja2dyb3VuZCBkcmFnIHBhbiwgdG9vbGJhciBidXR0b25zKS5cclxuLy9cclxuLy8gRnJlZWZvcm0gbGF5b3V0OiBjb21wb25lbnRzIGFyZSBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQ7IGRyYWdnaW5nIGdldHMgc21hcnRcclxuLy8gYWxpZ25tZW50IGd1aWRlcyAoZWRnZXMgKyBjZW50ZXJzIG9mIHNpYmxpbmdzIGFuZCB0aGUgcGFnZSkgd2l0aCBzbmFwcGluZy5cclxuLy8gRmxvdyBsYXlvdXQ6IGNvbXBvbmVudHMgZmxvdyBpbnRvIHJvd3MgKGZsb3dXaWR0aCAlIG9mIHRoZSBjb250ZW50IHdpZHRoKSxcclxuLy8gZHJhZyByZW9yZGVycywgZWFzdC9zb3V0aCBoYW5kbGVzIHJlc2l6ZSB3aWR0aCUvaGVpZ2h0LlxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY2FudmFzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVwb3J0LWNhbnZhcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcmVwb3J0LWNhbnZhcy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRHJhZ0Ryb3BNb2R1bGUsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBNYXRJY29uLFxyXG4gICAgTWF0VG9vbHRpcCxcclxuICAgIEZzTWVudU1vZHVsZSxcclxuICAgIEZzWm9vbVBhbk1vZHVsZSxcclxuICAgIFJlcG9ydENvbXBvbmVudENvbXBvbmVudCxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVwb3J0Q2FudmFzQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIHJlcG9ydDogUmVwb3J0O1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0TW9kZSA9IGZhbHNlO1xyXG5cclxuICAvLyBUaGUgcGFnZSB0aGUgaG9zdCB3YW50cyBvbiBzY3JlZW4sIGJ5IHBhZ2UgaWQgKGEgZGVlcCBsaW5rKS4gS2V5ZWQgb24gaWRcclxuICAvLyByYXRoZXIgdGhhbiBpbmRleCBzbyBhIGxpbmsgc3Vydml2ZXMgcGFnZXMgYmVpbmcgcmVvcmRlcmVkIG9yIGRlbGV0ZWQ7IGFuXHJcbiAgLy8gaWQgdGhhdCBubyBsb25nZXIgcmVzb2x2ZXMgZmFsbHMgYmFjayB0byB0aGUgZmlyc3QgcGFnZS5cclxuICBASW5wdXQoKSBwdWJsaWMgcGFnZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8gQSBjb21wb25lbnQgYXNrZWQgZm9yIGl0cyBzZXR0aW5ncyBkaWFsb2cg4oCUIHRoZSBwYWdlLWxldmVsIGhvc3Qgb3BlbnMgaXRcclxuICAvLyAoaXQgb3ducyBNYXREaWFsb2cgKyB0aGUgcG9zdC1zYXZlIHJlbG9hZCkuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBjb21wb25lbnRTZXR0aW5ncyA9IG5ldyBFdmVudEVtaXR0ZXI8UmVwb3J0Q29tcG9uZW50PigpO1xyXG5cclxuICAvLyBUaGUgcmVwb3J0J3Mgc3RydWN0dXJlIGNoYW5nZWQgaGVyZSAoYSBwYWdlIHdhcyBhZGRlZCkg4oCUIHRoZSBob3N0IHJlLWZldGNoZXNcclxuICAvLyBpdCAoaXQgb3ducyB0aGUgYXNzZW1ibGVkIHJlcG9ydCArIGZpbHRlciBzdGF0ZSkuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyByZXBvcnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvLyBUaGUgdmlld2VyIGRpc21pc3NlZCBlZGl0IG1vZGUgZnJvbSB0aGUgb24tY2FudmFzIGJhZGdlIOKAlCB0aGUgaG9zdCBvd25zIHRoZVxyXG4gIC8vIGVkaXRNb2RlIGZsYWcsIHNvIGl0IGZsaXBzIGl0IG9mZiAobWlycm9ycyB0aGUgbWVudSdzIFwiRG9uZSBlZGl0aW5nIGxheW91dFwiKS5cclxuICBAT3V0cHV0KCkgcHVibGljIGVkaXREb25lID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvLyBUaGUgcGFnZSBvbiBzY3JlZW4gY2hhbmdlZCDigJQgdGhlIGhvc3QgcmVmbGVjdHMgaXQgaW4gdGhlIFVSTCBzbyBhIHJlZnJlc2hcclxuICAvLyBjb21lcyBiYWNrIHRvIHRoZSBzYW1lIHBhZ2UuIENhcnJpZXMgdGhlIHBhZ2UgaWQsIG5ldmVyIHRoZSBpbmRleC5cclxuICBAT3V0cHV0KCkgcHVibGljIHBhZ2VDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xyXG5cclxuICBAVmlld0NoaWxkKEZzWm9vbVBhbkNvbXBvbmVudClcclxuICBwdWJsaWMgem9vbVBhbjogRnNab29tUGFuQ29tcG9uZW50O1xyXG5cclxuICAvLyBUaGUgcmVuZGVyZWQgY29tcG9uZW50cyBvZiB0aGUgYWN0aXZlIHBhZ2Ug4oCUIG9ubHkgdGhlIGNhbnZhcyBjYW4gcmVhY2ggdGhlXHJcbiAgLy8gb25lIGluc3RhbmNlIGEgc2V0dGluZ3Mgc2F2ZSBhcHBsaWVzIHRvLlxyXG4gIEBWaWV3Q2hpbGRyZW4oUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50KVxyXG4gIHByaXZhdGUgX3JlbmRlcmVkQ29tcG9uZW50czogUXVlcnlMaXN0PFJlcG9ydENvbXBvbmVudENvbXBvbmVudD47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdwb3J0JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwcml2YXRlIF92aWV3cG9ydDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2d1aWRlcycsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHByaXZhdGUgX2d1aWRlczogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBQWCA9IFBYX1BFUl9JTkNIO1xyXG4gIHB1YmxpYyByZWFkb25seSBmbG93UGFkZGluZyA9IEZMT1dfUEFERElORztcclxuXHJcbiAgcHVibGljIGFjdGl2ZVBhZ2VJbmRleCA9IDA7XHJcbiAgcHVibGljIHpvb20gPSAxO1xyXG4gIHB1YmxpYyBncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XHJcbiAgcHVibGljIHNlbGVjdGVkQ29tcG9uZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyBUaGUgc25hcHBlciBoYW5kZWQgdG8gZXZlcnkgY29tcG9uZW50IChzdGFibGUgaWRlbnRpdHkgZm9yIE9uUHVzaCkuXHJcbiAgcHVibGljIHJlYWRvbmx5IHNuYXBwZXI6IENhbnZhc1NuYXBwZXIgPSB7XHJcbiAgICBzbmFwTW92ZTogKGNvbXBvbmVudCwgeCwgeSkgPT4gdGhpcy5fc25hcE1vdmUoY29tcG9uZW50LCB4LCB5KSxcclxuICAgIHNuYXBSZXNpemU6IChjb21wb25lbnQsIGdlb21ldHJ5LCBoYW5kbGUpID0+IHRoaXMuX3NuYXBSZXNpemUoY29tcG9uZW50LCBnZW9tZXRyeSwgaGFuZGxlKSxcclxuICAgIGNsZWFyOiAoKSA9PiB0aGlzLl9jbGVhckd1aWRlcygpLFxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XHJcbiAgcHJpdmF0ZSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcclxuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XHJcbiAgcHJpdmF0ZSBfY2RSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcbiAgcHJpdmF0ZSBfZml0dGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcHJldmlvdXNQYWdlQ291bnQgPSAwO1xyXG5cclxuICAvLyBUaGUgcGFnZSBpZCBsYXN0IGFubm91bmNlZCB0aHJvdWdoIHBhZ2VDaGFuZ2VkLCBzbyBhIHJlLXJlbmRlciB0aGF0IGxhbmRzIG9uXHJcbiAgLy8gdGhlIHNhbWUgcGFnZSBzdGF5cyBxdWlldCDigJQgaG9zdHMgcmVsb2FkIG9uIHRoaXMgYW5kIGFuIHVuY2hhbmdlZCBwYWdlIGlzXHJcbiAgLy8gbm90IG5ld3MuXHJcbiAgcHJpdmF0ZSBfZW1pdHRlZFBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JvdXBzID0gbmV3IE1hcCgodGhpcy5yZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSkubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCBncm91cF0pKTtcclxuXHJcbiAgICBjb25zdCBwYWdlQ291bnQgPSB0aGlzLnJlcG9ydD8ucGFnZXM/Lmxlbmd0aCA/PyAwO1xyXG5cclxuICAgIC8vIEEgcGFnZSB3YXMganVzdCBhZGRlZCAodGhlIGhvc3QgcmUtZmV0Y2hlZCB0aGUgcmVwb3J0KSDigJQgbGFuZCBvbiBpdC5cclxuICAgIGNvbnN0IHBhZ2VBZGRlZCA9IHBhZ2VDb3VudCA+IHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ICYmIHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ID4gMDtcclxuICAgIGlmIChwYWdlQWRkZWQpIHtcclxuICAgICAgdGhpcy5hY3RpdmVQYWdlSW5kZXggPSBwYWdlQ291bnQgLSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcHJldmlvdXNQYWdlQ291bnQgPSBwYWdlQ291bnQ7XHJcblxyXG4gICAgLy8gSG9ub3VyIGFuIGluY29taW5nIGRlZXAgbGluaywgYnV0IG5ldmVyIG92ZXIgYSBqdXN0LWFkZGVkIHBhZ2U6IGFkZGluZyBhXHJcbiAgICAvLyBwYWdlIGlzIGEgZGVsaWJlcmF0ZSBhY3QgaW4gdGhpcyB0YWIsIHdoaWxlIHBhZ2VJZCBpcyB0aGUgc3RhbGUgdmFsdWUgdGhlXHJcbiAgICAvLyBob3N0IGlzIHN0aWxsIGhvbGRpbmcgZnJvbSB0aGUgVVJMLiBBbiBpZCB0aGF0IGRvZXMgbm90IHJlc29sdmUgaXMgbGVmdFxyXG4gICAgLy8gYWxvbmUgcmF0aGVyIHRoYW4gZm9yY2VkIHRvIHRoZSBmaXJzdCBwYWdlIOKAlCB0aGUgcmVwb3J0IG1heSBzdGlsbCBiZVxyXG4gICAgLy8gbG9hZGluZywgYW5kIHRoZSBjbGFtcCBiZWxvdyBpcyB0aGUgcmVhbCBndWFyZC5cclxuICAgIGlmICghcGFnZUFkZGVkICYmIHRoaXMucGFnZUlkICE9IG51bGwpIHtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlcG9ydD8ucGFnZXM/LmZpbmRJbmRleCgocGFnZSkgPT4gcGFnZS5pZCA9PT0gdGhpcy5wYWdlSWQpID8/IC0xO1xyXG5cclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZVBhZ2VJbmRleCA9IGluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0aXZlUGFnZUluZGV4ID49IHBhZ2VDb3VudCkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVBhZ2VJbmRleCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGVsbCB0aGUgaG9zdCB3aGljaCBwYWdlIGlzIG9wZW4gd2hlbmV2ZXIgdGhhdCBjaGFuZ2VzIOKAlCBpbmNsdWRpbmcgdGhlXHJcbiAgICAvLyBGSVJTVCB0aW1lIHRoZSByZXBvcnQgcmVuZGVycywgbm90IG9ubHkgd2hlbiBzb21lb25lIGNsaWNrcyBhIHBhZ2UuXHJcbiAgICAvLyBIb3N0cyBiaW5kIHRoaW5ncyB0byB0aGUgb3BlbiBwYWdlICh0aGUgcmVwb3J0IGNoYXQgc2NvcGVzIGl0c1xyXG4gICAgLy8gY29udmVyc2F0aW9ucyB0byBpdCksIGFuZCB3aXRob3V0IHRoaXMgdGhleSB3b3VsZCBzaXQgb24gbm8gcGFnZSBhdCBhbGxcclxuICAgIC8vIHVudGlsIHRoZSBmaXJzdCBtYW51YWwgcGFnZSBjbGljay5cclxuICAgIGNvbnN0IGFjdGl2ZVBhZ2VJZCA9IHRoaXMuYWN0aXZlUGFnZT8uaWQgPz8gbnVsbDtcclxuICAgIGlmIChhY3RpdmVQYWdlSWQgIT09IHRoaXMuX2VtaXR0ZWRQYWdlSWQpIHtcclxuICAgICAgdGhpcy5fZW1pdHRlZFBhZ2VJZCA9IGFjdGl2ZVBhZ2VJZDtcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KGFjdGl2ZVBhZ2VJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZXBvcnQgaGVhZGluZyBzaXplIGluIHB4IChjb25maWcgaXMgcG9pbnRzOyB0aGUgY2FudmFzIHJlbmRlcnMgYXRcclxuICAvLyA5NnB4L2luLCBzbyBwb2ludHMgw5cgOTYvNzIpLiBJbmhlcml0ZWQgYnkgY29tcG9uZW50IHRpdGxlcyB2aWEgYSBDU1MgdmFyLlxyXG4gIHB1YmxpYyBnZXQgaGVhZGluZ1NpemVQeCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgcG9pbnRzID0gdGhpcy5yZXBvcnQ/LmNvbmZpZz8uc3R5bGVzPy5oZWFkaW5nPy5zaXplID8/IERFRkFVTFRfSEVBRElOR19TSVpFO1xyXG5cclxuICAgIHJldHVybiBwb2ludHMgKiAoUFhfUEVSX0lOQ0ggLyA3Mik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgLy8gRml0IHRoZSBwYWdlIHRvIHRoZSB2aWV3cG9ydCBvbmNlIG9uIGZpcnN0IHJlbmRlcjsgYWZ0ZXIgdGhhdCB0aGVcclxuICAgIC8vIHZpZXdlcidzIHpvb20gY2hvaWNlIGlzIHJlc3BlY3RlZCBhY3Jvc3MgcmUtcmVuZGVycy5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy56b29tRml0KCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc0Zsb3coKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXBvcnQ/LmxheW91dCA9PT0gJ2Zsb3cnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhY3RpdmVQYWdlKCk6IFJlcG9ydFBhZ2UgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnJlcG9ydD8ucGFnZXM/Llt0aGlzLmFjdGl2ZVBhZ2VJbmRleF0gPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIEZsb3cgcmVuZGVyIG9yZGVyICh0aGUgYXNzZW1ibGVyIGFscmVhZHkgc29ydHMsIGJ1dCBhIGxvY2FsIHJlb3JkZXJcclxuICAvLyBtaWQtc2Vzc2lvbiBtdXN0IGhvbGQgd2l0aG91dCBhIHJlLWZldGNoKS5cclxuICBwdWJsaWMgZ2V0IGZsb3dDb21wb25lbnRzKCk6IFJlcG9ydENvbXBvbmVudFtdIHtcclxuICAgIHJldHVybiBbLi4uKHRoaXMuYWN0aXZlUGFnZT8uY29tcG9uZW50cyA/PyBbXSldLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RQYWdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4ID0gaW5kZXg7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQgPSBudWxsO1xyXG5cclxuICAgIC8vIEtlcHQgaW4gc3RlcCB3aXRoIHRoZSBuZ09uQ2hhbmdlcyBhbm5vdW5jZW1lbnQgc28gdGhlIHR3byBjYW4ndCBkaXNhZ3JlZVxyXG4gICAgLy8gYWJvdXQgd2hhdCB0aGUgaG9zdCB3YXMgbGFzdCB0b2xkLlxyXG4gICAgdGhpcy5fZW1pdHRlZFBhZ2VJZCA9IHRoaXMuYWN0aXZlUGFnZT8uaWQgPz8gbnVsbDtcclxuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdCh0aGlzLl9lbWl0dGVkUGFnZUlkKTtcclxuICB9XHJcblxyXG4gIC8vIEFwcGVuZCBhIGJsYW5rIHBhZ2U7IHRoZSBob3N0IHJlLWZldGNoZXMgdGhlIHJlcG9ydCBhbmQgbmdPbkNoYW5nZXMgbGFuZHNcclxuICAvLyB0aGUgdmlldyBvbiB0aGUgbmV3IChsYXN0KSBwYWdlLlxyXG4gIHB1YmxpYyBhZGRQYWdlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlcG9ydCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fcmVwb3J0RGF0YS5hZGRQYWdlKHRoaXMucmVwb3J0LmlkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXBvcnRDaGFuZ2VkLmVtaXQoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGFnZUxhYmVsKHBhZ2U6IFJlcG9ydFBhZ2UsIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHBhZ2UubmFtZSB8fCBgUGFnZSAke2luZGV4ICsgMX1gO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVuYW1lIGZyb20gdGhlIHRhYidzIGtlYmFiLiBUaGUgcGFnZSBsaXN0IGlzIHBhdGNoZWQgaW4gcGxhY2UgcmF0aGVyIHRoYW5cclxuICAvLyByZS1mZXRjaGluZyB0aGUgcmVwb3J0OiBub3RoaW5nIGVsc2Ugb24gdGhlIGNhbnZhcyBkZXBlbmRzIG9uIGEgcGFnZSdzXHJcbiAgLy8gbmFtZSwgYW5kIGEgcmUtZmV0Y2ggd291bGQgcmUtcnVuIGV2ZXJ5IGNvbXBvbmVudCdzIHF1ZXJ5IHRvIHJlcGFpbnQgYVxyXG4gIC8vIGNoaXAncyBsYWJlbC5cclxuICBwdWJsaWMgcmVuYW1lUGFnZShwYWdlOiBSZXBvcnRQYWdlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcm9tcHQuaW5wdXQoe1xyXG4gICAgICB0aXRsZTogJ0VkaXQgUGFnZSBOYW1lJyxcclxuICAgICAgbGFiZWw6ICdOYW1lJyxcclxuICAgICAgZGVmYXVsdDogcGFnZS5uYW1lID8/ICcnLFxyXG4gICAgICBjb21taXRMYWJlbDogJ1NhdmUnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgobmFtZTogc3RyaW5nKSA9PiB0aGlzLl9yZXBvcnREYXRhXHJcbiAgICAgICAgICAudXBkYXRlUGFnZSh0aGlzLnJlcG9ydC5pZCwgcGFnZS5pZCwgbmFtZSlcclxuICAgICAgICAgIC5waXBlKG1hcCgoKSA9PiBuYW1lKSkpLFxyXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBwYWdlLm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU2F2ZWQgcGFnZSBuYW1lJyk7XHJcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gRGVsZXRlIGZyb20gdGhlIHRhYidzIGtlYmFiLiBUaGUgY29uZmlybSBuYW1lcyB0aGUgcGFnZSBhbmQgc2F5cyB0aGVcclxuICAvLyBjb21wb25lbnRzIGdvIHdpdGggaXQg4oCUIHRoZSBzZXJ2ZXIgcmVmdXNlcyB0aGUgbGFzdCBwYWdlLCBhbmQgdGhhdCByZWZ1c2FsXHJcbiAgLy8gc3VyZmFjZXMgYXMgdGhlIEFQSSBlcnJvciBtZXNzYWdlIHJhdGhlciB0aGFuIGJlaW5nIHNlY29uZC1ndWVzc2VkIGhlcmUuXHJcbiAgcHVibGljIGRlbGV0ZVBhZ2UocGFnZTogUmVwb3J0UGFnZSk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xyXG4gICAgICB0aXRsZTogJ0NvbmZpcm0nLFxyXG4gICAgICB0ZW1wbGF0ZTogYEFyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byBkZWxldGUgXCIke3RoaXMucGFnZUxhYmVsKHBhZ2UsIHRoaXMucmVwb3J0LnBhZ2VzLmluZGV4T2YocGFnZSkpfVwiIGFuZCBldmVyeXRoaW5nIG9uIGl0P2AsXHJcbiAgICB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5kZWxldGVQYWdlKHRoaXMucmVwb3J0LmlkLCBwYWdlLmlkKSksXHJcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZXBvcnQucGFnZXMuaW5kZXhPZihwYWdlKTtcclxuICAgICAgICB0aGlzLnJlcG9ydC5wYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAvLyBMYW5kIG9uIHRoZSBuZWlnaGJvdXIgcmF0aGVyIHRoYW4gc25hcHBpbmcgYmFjayB0byB0aGUgZmlyc3QgcGFnZSDigJRcclxuICAgICAgICAvLyBkZWxldGluZyBwYWdlIDQgb2YgNiBzaG91bGQgbGVhdmUgeW91IGxvb2tpbmcgYXQgd2hhdCBpcyBub3cgcGFnZSA0LlxyXG4gICAgICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHRoaXMucmVwb3J0LnBhZ2VzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzUGFnZUNvdW50ID0gdGhpcy5yZXBvcnQucGFnZXMubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIFRoZSBpZCBpbiB0aGUgVVJMIGp1c3Qgc3RvcHBlZCBleGlzdGluZyDigJQgcmVwbGFjZSBpdCB3aXRoIHRoZVxyXG4gICAgICAgIC8vIG5laWdoYm91ciB3ZSBsYW5kZWQgb24sIG9yIGEgcmVmcmVzaCB3b3VsZCA0MDQgaXRzIHdheSB0byBwYWdlIG9uZS5cclxuICAgICAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQodGhpcy5hY3RpdmVQYWdlPy5pZCA/PyBudWxsKTtcclxuXHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdEZWxldGVkIHBhZ2UnKTtcclxuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBBIHRhYiB3YXMgZHJhZ2dlZCB0byBhIG5ldyBzbG90OiByZW9yZGVyIGxvY2FsbHkgc28gdGhlIGNoaXBzIHNldHRsZVxyXG4gIC8vIGltbWVkaWF0ZWx5LCBrZWVwIHRoZSB2aWV3ZXIgb24gdGhlIHBhZ2UgdGhleSB3ZXJlIGxvb2tpbmcgYXQsIGFuZCBwZXJzaXN0XHJcbiAgLy8gdGhlIHdob2xlIHNlcXVlbmNlIGluIG9uZSBQVVQuXHJcbiAgcHVibGljIG9uUGFnZURyb3BwZWQoZXZlbnQ6IENka0RyYWdEcm9wPHVua25vd24+KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQucHJldmlvdXNJbmRleCA9PT0gZXZlbnQuY3VycmVudEluZGV4KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhY3RpdmVQYWdlID0gdGhpcy5hY3RpdmVQYWdlO1xyXG5cclxuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLnJlcG9ydC5wYWdlcywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcclxuXHJcbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLnJlcG9ydC5wYWdlcy5tYXAoKHBhZ2UsIG9yZGVyKSA9PiB7XHJcbiAgICAgIHBhZ2Uub3JkZXIgPSBvcmRlcjtcclxuXHJcbiAgICAgIHJldHVybiB7IHBhZ2VJZDogcGFnZS5pZCwgb3JkZXIgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWN0aXZlUGFnZUluZGV4ID0gYWN0aXZlUGFnZVxyXG4gICAgICA/IHRoaXMucmVwb3J0LnBhZ2VzLmluZGV4T2YoYWN0aXZlUGFnZSlcclxuICAgICAgOiB0aGlzLmFjdGl2ZVBhZ2VJbmRleDtcclxuXHJcbiAgICB0aGlzLl9yZXBvcnREYXRhLnNhdmVQYWdlUG9zaXRpb25zKHRoaXMucmVwb3J0LmlkLCBwb3NpdGlvbnMpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZCBwcmVzZW50YXRpb24gc2V0dGluZ3MgKHRpdGxlLCBwYWRkaW5nKSBzYXZlZCBpbiB0aGUgc2V0dGluZ3MgZGlhbG9nIHRvXHJcbiAgLy8gdGhlIG9uZSBjb21wb25lbnQgdGhleSBiZWxvbmcgdG8uIE5vdGhpbmcgaGVyZSBmZWVkcyB0aGUgcXVlcnksIHNvIHRoYXRcclxuICAvLyBjb21wb25lbnQgcmVwYWludHMgYW5kIGV2ZXJ5IG90aGVyIG9uZSBvbiB0aGUgcGFnZSBpcyBsZWZ0IGFsb25lLlxyXG4gIHB1YmxpYyBhcHBseUNvbXBvbmVudFNldHRpbmdzKGNvbXBvbmVudElkOiBudW1iZXIsIHNldHRpbmdzOiBDb21wb25lbnRTZXR0aW5ncyk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnRzXHJcbiAgICAgIC5maW5kKChyZW5kZXJlZCkgPT4gcmVuZGVyZWQuY29tcG9uZW50LmlkID09PSBjb21wb25lbnRJZClcclxuICAgICAgPy5hcHBseVNldHRpbmdzKHNldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RDb21wb25lbnQoY29tcG9uZW50SWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCA9IGNvbXBvbmVudElkO1xyXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DYW52YXNQb2ludGVyRG93bigpOiB2b2lkIHtcclxuICAgIC8vIEJhY2tncm91bmQgY2xpY2sgKHBhbiBzdGFydCkgZGVzZWxlY3RzLlxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnNlbGVjdENvbXBvbmVudChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIC0tLS0tIHpvb20gdG9vbGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgcHVibGljIG9uWm9vbWVkKHNjYWxlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuem9vbSA9IHNjYWxlO1xyXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgem9vbUluKCk6IHZvaWQge1xyXG4gICAgdGhpcy56b29tUGFuPy56b29tSW4oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB6b29tT3V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy56b29tUGFuPy56b29tT3V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgem9vbUZpdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fdmlld3BvcnQ/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIXZpZXdwb3J0IHx8ICF0aGlzLnJlcG9ydD8ucGFnZVdpZHRoIHx8ICF0aGlzLnpvb21QYW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpdCA9IE1hdGgubWluKFxyXG4gICAgICAodmlld3BvcnQuY2xpZW50V2lkdGggLSAzMikgLyAodGhpcy5yZXBvcnQucGFnZVdpZHRoICogUFhfUEVSX0lOQ0gpLFxyXG4gICAgICAodmlld3BvcnQuY2xpZW50SGVpZ2h0IC0gMzIpIC8gKHRoaXMucmVwb3J0LnBhZ2VIZWlnaHQgKiBQWF9QRVJfSU5DSCksXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuem9vbVBhbi56b29tKE1hdGgubWluKDEuNSwgTWF0aC5tYXgoMC4xLCBmaXQpKSk7XHJcbiAgICB0aGlzLnpvb21QYW4ubW92ZSgxNiwgMTYpO1xyXG4gICAgdGhpcy5fZml0dGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB6b29tQWN0dWFsKCk6IHZvaWQge1xyXG4gICAgdGhpcy56b29tUGFuPy56b29tKDEpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0gcGVyc2lzdGVuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvLyBBIGZyZWVmb3JtIGRyYWcvcmVzaXplIG9yIGEgZmxvdyB3aWR0aCByZXNpemUgbGFuZGVkIOKAlCBvbmUgUFVUIHBlciBnZXN0dXJlLlxyXG4gIHB1YmxpYyBvblBvc2l0aW9uQ2hhbmdlZChwb3NpdGlvbjogeyBjb21wb25lbnRJZDogbnVtYmVyIH0gJiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KTogdm9pZCB7XHJcbiAgICB0aGlzLl9jbGVhckd1aWRlcygpO1xyXG4gICAgdGhpcy5fcmVwb3J0RGF0YS5zYXZlUG9zaXRpb25zKHRoaXMucmVwb3J0LmlkLCBbcG9zaXRpb24gYXMgYW55XSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBBIGZsb3cgZHJhZyBkcm9wcGVkOiByZW9yZGVyIHRoZSBwYWdlJ3MgY29tcG9uZW50cyBhcm91bmQgdGhlIG1vdmVkIG9uZVxyXG4gIC8vIGFuZCBwZXJzaXN0IGV2ZXJ5IG9yZGVyIGluIG9uZSBQVVQuXHJcbiAgcHVibGljIG9uRmxvd1Jlb3JkZXIoZXZlbnQ6IHsgY29tcG9uZW50SWQ6IG51bWJlcjsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFnZSA9IHRoaXMuYWN0aXZlUGFnZTtcclxuICAgIGlmICghcGFnZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3JkZXJlZCA9IHRoaXMuZmxvd0NvbXBvbmVudHMuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC5pZCAhPT0gZXZlbnQuY29tcG9uZW50SWQpO1xyXG4gICAgY29uc3QgbW92ZWQgPSBwYWdlLmNvbXBvbmVudHMuZmluZCgoY29tcG9uZW50KSA9PiBjb21wb25lbnQuaWQgPT09IGV2ZW50LmNvbXBvbmVudElkKTtcclxuICAgIGlmICghbW92ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZmxvd0Ryb3BJbmRleChvcmRlcmVkLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcclxuICAgIG9yZGVyZWQuc3BsaWNlKGluZGV4LCAwLCBtb3ZlZCk7XHJcblxyXG4gICAgY29uc3QgcG9zaXRpb25zID0gb3JkZXJlZC5tYXAoKGNvbXBvbmVudCwgb3JkZXIpID0+IHtcclxuICAgICAgY29tcG9uZW50Lm9yZGVyID0gb3JkZXI7XHJcblxyXG4gICAgICByZXR1cm4geyBjb21wb25lbnRJZDogY29tcG9uZW50LmlkLCBvcmRlciB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLl9yZXBvcnREYXRhLnNhdmVQb3NpdGlvbnModGhpcy5yZXBvcnQuaWQsIHBvc2l0aW9ucylcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBXaGVyZSB0aGUgcG9pbnRlciBsYW5kZWQgYW1vbmcgdGhlIGZsb3dlZCBjb21wb25lbnRzOiBiZWZvcmUgdGhlIGZpcnN0XHJcbiAgLy8gY29tcG9uZW50IHdob3NlIGNlbnRlciB0aGUgcG9pbnRlciBpcyBhYm92ZS9sZWZ0IG9mLlxyXG4gIHByaXZhdGUgX2Zsb3dEcm9wSW5kZXgob3JkZXJlZDogUmVwb3J0Q29tcG9uZW50W10sIGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGhvc3RzID0gQXJyYXkuZnJvbShcclxuICAgICAgdGhpcy5fdmlld3BvcnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignYXBwLXJlcG9ydC1jb21wb25lbnQnKSxcclxuICAgICkuZmlsdGVyKChob3N0KSA9PiAhaG9zdC5jbGFzc0xpc3QuY29udGFpbnMoJ2Zsb3ctZHJhZ2dpbmcnKSk7XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGhvc3RzLmxlbmd0aCAmJiBpbmRleCA8IG9yZGVyZWQubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSBob3N0c1tpbmRleF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGlmIChjbGllbnRZIDwgcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDJcclxuICAgICAgICB8fCAoY2xpZW50WSA8IHJlY3QuYm90dG9tICYmIGNsaWVudFggPCByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMikpIHtcclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3JkZXJlZC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLSBzbWFydCBndWlkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8vIFBpeGVsIGZlZWwgb2YgdGhlIHNuYXAsIGNvbnZlcnRlZCB0byBpbmNoZXMgYXQgdGhlIGN1cnJlbnQgem9vbS5cclxuICBwcml2YXRlIGdldCBfc25hcFRocmVzaG9sZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIDggLyAoUFhfUEVSX0lOQ0ggKiBNYXRoLm1heCgwLjEsIHRoaXMuem9vbSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc25hcE1vdmUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHg6IG51bWJlciwgeTogbnVtYmVyKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcclxuICAgIGNvbnN0IHsgdmVydGljYWwsIGhvcml6b250YWwgfSA9IHRoaXMuX2NhbmRpZGF0ZXMoY29tcG9uZW50KTtcclxuICAgIGNvbnN0IGd1aWRlczogR3VpZGVMaW5lW10gPSBbXTtcclxuXHJcbiAgICBjb25zdCBzbmFwcGVkWCA9IHRoaXMuX3NuYXBBeGlzKFxyXG4gICAgICBbXHJcbiAgICAgICAgeyBvZmZzZXQ6IDAsIHZhbHVlOiB4IH0sXHJcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC53IC8gMiwgdmFsdWU6IHggKyBjb21wb25lbnQudyAvIDIgfSxcclxuICAgICAgICB7IG9mZnNldDogY29tcG9uZW50LncsIHZhbHVlOiB4ICsgY29tcG9uZW50LncgfSxcclxuICAgICAgXSxcclxuICAgICAgdmVydGljYWwsXHJcbiAgICApO1xyXG4gICAgaWYgKHNuYXBwZWRYICE9PSBudWxsKSB7XHJcbiAgICAgIHggPSBzbmFwcGVkWC5iYXNlO1xyXG4gICAgICBndWlkZXMucHVzaCh7IG9yaWVudGF0aW9uOiAndicsIHBvc2l0aW9uOiBzbmFwcGVkWC5ndWlkZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzbmFwcGVkWSA9IHRoaXMuX3NuYXBBeGlzKFxyXG4gICAgICBbXHJcbiAgICAgICAgeyBvZmZzZXQ6IDAsIHZhbHVlOiB5IH0sXHJcbiAgICAgICAgeyBvZmZzZXQ6IGNvbXBvbmVudC5oIC8gMiwgdmFsdWU6IHkgKyBjb21wb25lbnQuaCAvIDIgfSxcclxuICAgICAgICB7IG9mZnNldDogY29tcG9uZW50LmgsIHZhbHVlOiB5ICsgY29tcG9uZW50LmggfSxcclxuICAgICAgXSxcclxuICAgICAgaG9yaXpvbnRhbCxcclxuICAgICk7XHJcbiAgICBpZiAoc25hcHBlZFkgIT09IG51bGwpIHtcclxuICAgICAgeSA9IHNuYXBwZWRZLmJhc2U7XHJcbiAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICdoJywgcG9zaXRpb246IHNuYXBwZWRZLmd1aWRlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3JlbmRlckd1aWRlcyhndWlkZXMpO1xyXG5cclxuICAgIHJldHVybiB7IHgsIHkgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NuYXBSZXNpemUoXHJcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcclxuICAgIGdlb21ldHJ5OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9LFxyXG4gICAgaGFuZGxlOiBzdHJpbmcsXHJcbiAgKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSB7XHJcbiAgICBjb25zdCB7IHZlcnRpY2FsLCBob3Jpem9udGFsIH0gPSB0aGlzLl9jYW5kaWRhdGVzKGNvbXBvbmVudCk7XHJcbiAgICBjb25zdCBndWlkZXM6IEd1aWRlTGluZVtdID0gW107XHJcbiAgICBjb25zdCByZXN1bHQgPSB7IC4uLmdlb21ldHJ5IH07XHJcblxyXG4gICAgLy8gT25seSB0aGUgZWRnZXMgdGhlIGhhbmRsZSBtb3ZlcyBwYXJ0aWNpcGF0ZSBpbiBzbmFwcGluZy5cclxuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ2UnKSkge1xyXG4gICAgICBjb25zdCBzbmFwcGVkID0gdGhpcy5fbmVhcmVzdChnZW9tZXRyeS54ICsgZ2VvbWV0cnkudywgdmVydGljYWwpO1xyXG4gICAgICBpZiAoc25hcHBlZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJlc3VsdC53ID0gc25hcHBlZCAtIGdlb21ldHJ5Lng7XHJcbiAgICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ3YnLCBwb3NpdGlvbjogc25hcHBlZCB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygndycpKSB7XHJcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LngsIHZlcnRpY2FsKTtcclxuICAgICAgaWYgKHNuYXBwZWQgIT09IG51bGwpIHtcclxuICAgICAgICByZXN1bHQudyA9IGdlb21ldHJ5LnggKyBnZW9tZXRyeS53IC0gc25hcHBlZDtcclxuICAgICAgICByZXN1bHQueCA9IHNuYXBwZWQ7XHJcbiAgICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ3YnLCBwb3NpdGlvbjogc25hcHBlZCB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGhhbmRsZS5pbmNsdWRlcygncycpKSB7XHJcbiAgICAgIGNvbnN0IHNuYXBwZWQgPSB0aGlzLl9uZWFyZXN0KGdlb21ldHJ5LnkgKyBnZW9tZXRyeS5oLCBob3Jpem9udGFsKTtcclxuICAgICAgaWYgKHNuYXBwZWQgIT09IG51bGwpIHtcclxuICAgICAgICByZXN1bHQuaCA9IHNuYXBwZWQgLSBnZW9tZXRyeS55O1xyXG4gICAgICAgIGd1aWRlcy5wdXNoKHsgb3JpZW50YXRpb246ICdoJywgcG9zaXRpb246IHNuYXBwZWQgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ24nKSkge1xyXG4gICAgICBjb25zdCBzbmFwcGVkID0gdGhpcy5fbmVhcmVzdChnZW9tZXRyeS55LCBob3Jpem9udGFsKTtcclxuICAgICAgaWYgKHNuYXBwZWQgIT09IG51bGwpIHtcclxuICAgICAgICByZXN1bHQuaCA9IGdlb21ldHJ5LnkgKyBnZW9tZXRyeS5oIC0gc25hcHBlZDtcclxuICAgICAgICByZXN1bHQueSA9IHNuYXBwZWQ7XHJcbiAgICAgICAgZ3VpZGVzLnB1c2goeyBvcmllbnRhdGlvbjogJ2gnLCBwb3NpdGlvbjogc25hcHBlZCB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3JlbmRlckd1aWRlcyhndWlkZXMpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyBBbGlnbm1lbnQgY2FuZGlkYXRlczogdGhlIHBhZ2UncyBlZGdlcyArIGNlbnRlciwgYW5kIGV2ZXJ5IHNpYmxpbmcnc1xyXG4gIC8vIGVkZ2VzICsgY2VudGVycy5cclxuICBwcml2YXRlIF9jYW5kaWRhdGVzKG1vdmluZzogUmVwb3J0Q29tcG9uZW50KTogeyB2ZXJ0aWNhbDogbnVtYmVyW107IGhvcml6b250YWw6IG51bWJlcltdIH0ge1xyXG4gICAgY29uc3QgdmVydGljYWwgPSBbMCwgdGhpcy5yZXBvcnQucGFnZVdpZHRoIC8gMiwgdGhpcy5yZXBvcnQucGFnZVdpZHRoXTtcclxuICAgIGNvbnN0IGhvcml6b250YWwgPSBbMCwgdGhpcy5yZXBvcnQucGFnZUhlaWdodCAvIDIsIHRoaXMucmVwb3J0LnBhZ2VIZWlnaHRdO1xyXG5cclxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuYWN0aXZlUGFnZT8uY29tcG9uZW50cyA/PyBbXSkge1xyXG4gICAgICBpZiAoY29tcG9uZW50LmlkID09PSBtb3ZpbmcuaWQpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmVydGljYWwucHVzaChjb21wb25lbnQueCwgY29tcG9uZW50LnggKyBjb21wb25lbnQudyAvIDIsIGNvbXBvbmVudC54ICsgY29tcG9uZW50LncpO1xyXG4gICAgICBob3Jpem9udGFsLnB1c2goY29tcG9uZW50LnksIGNvbXBvbmVudC55ICsgY29tcG9uZW50LmggLyAyLCBjb21wb25lbnQueSArIGNvbXBvbmVudC5oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCB9O1xyXG4gIH1cclxuXHJcbiAgLy8gU25hcCBvbmUgYXhpczogb2YgdGhlIG1vdmluZyBib3gncyB0aHJlZSBsaW5lcyAoZWRnZS9jZW50ZXIvZWRnZSksIGZpbmRcclxuICAvLyB0aGUgY2xvc2VzdCBjYW5kaWRhdGUgd2l0aGluIHRocmVzaG9sZCBhbmQgcmV0dXJuIHRoZSBhZGp1c3RlZCBiYXNlXHJcbiAgLy8gY29vcmRpbmF0ZSBwbHVzIHRoZSBndWlkZSB0byBkcmF3LlxyXG4gIHByaXZhdGUgX3NuYXBBeGlzKFxyXG4gICAgbGluZXM6IHsgb2Zmc2V0OiBudW1iZXI7IHZhbHVlOiBudW1iZXIgfVtdLFxyXG4gICAgY2FuZGlkYXRlczogbnVtYmVyW10sXHJcbiAgKTogeyBiYXNlOiBudW1iZXI7IGd1aWRlOiBudW1iZXIgfSB8IG51bGwge1xyXG4gICAgbGV0IGJlc3Q6IHsgYmFzZTogbnVtYmVyOyBndWlkZTogbnVtYmVyOyBkaXN0YW5jZTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xyXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoY2FuZGlkYXRlIC0gbGluZS52YWx1ZSk7XHJcbiAgICAgICAgaWYgKGRpc3RhbmNlIDw9IHRoaXMuX3NuYXBUaHJlc2hvbGQgJiYgKCFiZXN0IHx8IGRpc3RhbmNlIDwgYmVzdC5kaXN0YW5jZSkpIHtcclxuICAgICAgICAgIGJlc3QgPSB7IGJhc2U6IGNhbmRpZGF0ZSAtIGxpbmUub2Zmc2V0LCBndWlkZTogY2FuZGlkYXRlLCBkaXN0YW5jZSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBiZXN0ID8geyBiYXNlOiBiZXN0LmJhc2UsIGd1aWRlOiBiZXN0Lmd1aWRlIH0gOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbmVhcmVzdCh2YWx1ZTogbnVtYmVyLCBjYW5kaWRhdGVzOiBudW1iZXJbXSk6IG51bWJlciB8IG51bGwge1xyXG4gICAgbGV0IGJlc3Q6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgbGV0IGJlc3REaXN0YW5jZSA9IHRoaXMuX3NuYXBUaHJlc2hvbGQ7XHJcblxyXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xyXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGNhbmRpZGF0ZSAtIHZhbHVlKTtcclxuICAgICAgaWYgKGRpc3RhbmNlIDw9IGJlc3REaXN0YW5jZSkge1xyXG4gICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7XHJcbiAgICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYmVzdDtcclxuICB9XHJcblxyXG4gIC8vIFRoZSBndWlkZXMgb3ZlcmxheSBpcyBkcmF3biBpbXBlcmF0aXZlbHkg4oCUIHRoZSBkcmFnIGxvb3AgcnVucyBvdXRzaWRlXHJcbiAgLy8gQW5ndWxhciBhbmQgcmVwYWludHMgb24gZXZlcnkgcG9pbnRlcm1vdmUuXHJcbiAgcHJpdmF0ZSBfcmVuZGVyR3VpZGVzKGd1aWRlczogR3VpZGVMaW5lW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGhvc3QgPSB0aGlzLl9ndWlkZXM/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIWhvc3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGhvc3QucmVwbGFjZUNoaWxkcmVuKC4uLmd1aWRlcy5tYXAoKGd1aWRlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgbGluZS5jbGFzc05hbWUgPSBgZ3VpZGUgZ3VpZGUtJHtndWlkZS5vcmllbnRhdGlvbn1gO1xyXG4gICAgICBpZiAoZ3VpZGUub3JpZW50YXRpb24gPT09ICd2Jykge1xyXG4gICAgICAgIGxpbmUuc3R5bGUubGVmdCA9IGAke2d1aWRlLnBvc2l0aW9uICogUFhfUEVSX0lOQ0h9cHhgO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxpbmUuc3R5bGUudG9wID0gYCR7Z3VpZGUucG9zaXRpb24gKiBQWF9QRVJfSU5DSH1weGA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBsaW5lO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xlYXJHdWlkZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9ndWlkZXM/Lm5hdGl2ZUVsZW1lbnQ/LnJlcGxhY2VDaGlsZHJlbigpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FudmFzXCI+XG4gIDxkaXZcbiAgICAjdmlld3BvcnRcbiAgICBjbGFzcz1cInBhZ2Utdmlld3BvcnRcIlxuICAgIChwb2ludGVyZG93bik9XCJvbkNhbnZhc1BvaW50ZXJEb3duKClcIj5cbiAgICA8ZnMtem9vbS1wYW5cbiAgICAgIFt6b29tTWluXT1cIjAuMVwiXG4gICAgICBbem9vbU1heF09XCIzXCJcbiAgICAgICh6b29tZWQpPVwib25ab29tZWQoJGV2ZW50KVwiPlxuICAgICAgQGlmIChhY3RpdmVQYWdlOyBhcyBwYWdlKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInBhZ2VcIlxuICAgICAgICAgIFtjbGFzcy5mbG93XT1cImlzRmxvd1wiXG4gICAgICAgICAgW2NsYXNzLmVkaXRpbmddPVwiZWRpdE1vZGVcIlxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJyZXBvcnQucGFnZVdpZHRoICogUFhcIlxuICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwicmVwb3J0LnBhZ2VIZWlnaHQgKiBQWFwiXG4gICAgICAgICAgW3N0eWxlLnBhZGRpbmcucHhdPVwiaXNGbG93ID8gZmxvd1BhZGRpbmcgKiBQWCA6IDBcIlxuICAgICAgICAgIFtzdHlsZS4tLWNhbnZhcy16b29tXT1cInpvb21cIlxuICAgICAgICAgIFtzdHlsZS4tLXJlcG9ydC1oZWFkaW5nLXNpemUucHhdPVwiaGVhZGluZ1NpemVQeFwiPlxuICAgICAgICAgIEBpZiAoaXNGbG93KSB7XG4gICAgICAgICAgICBAZm9yIChjb21wb25lbnQgb2YgZmxvd0NvbXBvbmVudHM7IHRyYWNrIGNvbXBvbmVudC5pZCkge1xuICAgICAgICAgICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsb3ctaXRlbVwiXG4gICAgICAgICAgICAgICAgW3JlcG9ydElkXT1cInJlcG9ydC5pZFwiXG4gICAgICAgICAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxuICAgICAgICAgICAgICAgIFtncm91cHNdPVwiZ3JvdXBzXCJcbiAgICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiZWRpdE1vZGVcIlxuICAgICAgICAgICAgICAgIFtsYXlvdXRdPVwiJ2Zsb3cnXCJcbiAgICAgICAgICAgICAgICBbem9vbV09XCJ6b29tXCJcbiAgICAgICAgICAgICAgICBbc25hcHBlcl09XCJzbmFwcGVyXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY29tcG9uZW50LmlkID09PSBzZWxlY3RlZENvbXBvbmVudElkXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJjb21wb25lbnQuZmxvd1dpZHRoXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbXBvbmVudC5hdXRvSGVpZ2h0ID8gbnVsbCA6IGNvbXBvbmVudC5oICogUFhcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RDb21wb25lbnQpPVwic2VsZWN0Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZWQpPVwib25Qb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZsb3dSZW9yZGVyKT1cIm9uRmxvd1Jlb3JkZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9wZW5TZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncy5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBwYWdlLmNvbXBvbmVudHM7IHRyYWNrIGNvbXBvbmVudC5pZCkge1xuICAgICAgICAgICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnRcbiAgICAgICAgICAgICAgICBbcmVwb3J0SWRdPVwicmVwb3J0LmlkXCJcbiAgICAgICAgICAgICAgICBbY29tcG9uZW50XT1cImNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgW2dyb3Vwc109XCJncm91cHNcIlxuICAgICAgICAgICAgICAgIFtlZGl0TW9kZV09XCJlZGl0TW9kZVwiXG4gICAgICAgICAgICAgICAgW2xheW91dF09XCInZnJlZWZvcm0nXCJcbiAgICAgICAgICAgICAgICBbem9vbV09XCJ6b29tXCJcbiAgICAgICAgICAgICAgICBbc25hcHBlcl09XCJzbmFwcGVyXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiY29tcG9uZW50LmlkID09PSBzZWxlY3RlZENvbXBvbmVudElkXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJjb21wb25lbnQueCAqIFBYXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cImNvbXBvbmVudC55ICogUFhcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb21wb25lbnQudyAqIFBYXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNvbXBvbmVudC5hdXRvSGVpZ2h0ID8gbnVsbCA6IGNvbXBvbmVudC5oICogUFhcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RDb21wb25lbnQpPVwic2VsZWN0Q29tcG9uZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChwb3NpdGlvbkNoYW5nZWQpPVwib25Qb3NpdGlvbkNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9wZW5TZXR0aW5ncyk9XCJjb21wb25lbnRTZXR0aW5ncy5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZ3VpZGVzXG4gICAgICAgICAgICBjbGFzcz1cImd1aWRlc1wiPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgQGlmICghcGFnZS5jb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZ2UtZW1wdHlcIj5cbiAgICAgICAgICAgICAgQXNrIHRoZSBhc3Npc3RhbnQgdG8gYWRkIGEgY2hhcnQsIGxpc3Qgb3IgS1BJIHRvIHRoaXMgcGFnZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9mcy16b29tLXBhbj5cblxuICAgIEBpZiAoZWRpdE1vZGUpIHtcbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBjbGFzcz1cImVkaXQtZG9uZVwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJFeGl0IGxheW91dCBlZGl0aW5nXCJcbiAgICAgICAgKGNsaWNrKT1cImVkaXREb25lLmVtaXQoKVwiPlxuICAgICAgICA8bWF0LWljb24+Y2hlY2s8L21hdC1pY29uPlxuICAgICAgICBEb25lIGVkaXRpbmdcbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNhbnZhcy10b29sYmFyXCI+XG4gICAgPCEtLSBUYWJzIGFyZSBvbmUgaG9yaXpvbnRhbCBkcm9wIGxpc3Q6IGRyYWdnaW5nIGEgY2hpcCByZW9yZGVycyB0aGUgcGFnZXMuXG4gICAgICAgICBUaGUgZHJvcCBJTkRFWCBpcyBjb21wdXRlZCBhbG9uZyBYIChvcmllbnRhdGlvbiksIGJ1dCB0aGUgcHJldmlldyBpc1xuICAgICAgICAgZGVsaWJlcmF0ZWx5IGxlZnQgdW5ib3VuZGVkIG9uIGJvdGggYXhlcyDigJQgcGlubmluZyBpdCB0byB0aGUgcm93IHdpdGhcbiAgICAgICAgIGNka0RyYWdCb3VuZGFyeSBtZWFucyB0aGUgY2hpcCB5b3UgYXJlIGRyYWdnaW5nIGNvdmVycyB0aGUgY2hpcHMgeW91XG4gICAgICAgICBhcmUgZHJhZ2dpbmcgaXQgcGFzdCwgYW5kIHlvdSBjYW5ub3Qgc2VlIHdoZXJlIGl0IGlzIGdvaW5nIHRvIGxhbmQuXG4gICAgICAgICBFdmVyeSBwYWdlIGdldHMgYSBjaGlwLCBpbmNsdWRpbmcgYSBsb25lIG9uZTogdGhlIGNoaXAgaXMgd2hhdCB0ZWxsc1xuICAgICAgICAgeW91IHdoaWNoIHBhZ2UgeW91IGFyZSBvbiwgYW5kIGEgcmVwb3J0IHRoYXQgaGlkIGl0IGxlZnQgeW91IHVuYWJsZSB0b1xuICAgICAgICAgdGVsbCBwYWdlIDEgb2YgMSBmcm9tIGEgcGFnZSB0aGF0IGZhaWxlZCB0byBsb2FkLiBEZWxldGluZyB0aGUgbGFzdFxuICAgICAgICAgcGFnZSBpcyByZWZ1c2VkIHNlcnZlci1zaWRlLCBzbyB0aGUga2ViYWIgaXMgc2FmZSB0byBleHBvc2UgaGVyZS4gLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJwYWdlLXRhYnNcIlxuICAgICAgY2RrRHJvcExpc3RcbiAgICAgIGNka0Ryb3BMaXN0T3JpZW50YXRpb249XCJob3Jpem9udGFsXCJcbiAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25QYWdlRHJvcHBlZCgkZXZlbnQpXCI+XG4gICAgICBAZm9yIChwYWdlIG9mIHJlcG9ydD8ucGFnZXMgPz8gW107IHRyYWNrIHBhZ2UuaWQ7IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgICA8IS0tIFRoZSBjaGlwIGlzIHRoZSBkcmFnIGhhbmRsZSBBTkQgdGhlIHRhYjogY2xpY2tpbmcgc2VsZWN0cyxcbiAgICAgICAgICAgICBkcmFnZ2luZyByZW9yZGVycy4gVGhlIGtlYmFiIGxpdmVzIGluc2lkZSBpdCwgc28gdGhlIHdob2xlXG4gICAgICAgICAgICAgY29udHJvbCBzdGF5cyBvbmUgY2hpcCBpbnN0ZWFkIG9mIGdyb3dpbmcgYSBzZWNvbmQgYnV0dG9uLiAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICBjbGFzcz1cInBhZ2UtdGFiXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImluZGV4ID09PSBhY3RpdmVQYWdlSW5kZXhcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQYWdlKGluZGV4KVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFnZS10YWItbGFiZWxcIj57eyBwYWdlTGFiZWwocGFnZSwgaW5kZXgpIH19PC9zcGFuPlxuICAgICAgICAgIDwhLS0gVGhlIGtlYmFiIG9wZW5zIHRoZSBtZW51IHJhdGhlciB0aGFuIHN0YXJ0aW5nIGEgZHJhZyBvclxuICAgICAgICAgICAgICAgc3dpdGNoaW5nIHBhZ2VzLCBzbyBpdCBzd2FsbG93cyBpdHMgb3duIGNsaWNrLiAtLT5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJwYWdlLXRhYi1tZW51XCJcbiAgICAgICAgICAgIFtmc01lbnVUcmlnZ2VyRm9yXT1cInBhZ2VNZW51XCJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gT3V0c2lkZSB0aGUgY2hpcDogY2RrRHJhZyBjbG9uZXMgaXRzIGhvc3QgaW50byB0aGUgZHJhZyBwcmV2aWV3LFxuICAgICAgICAgICAgIGFuZCBhIG1lbnUgb3ZlcmxheSBhbmNob3JlZCB0byBhIGNsb25lZCB0cmlnZ2VyIG9wZW5zIGRldGFjaGVkXG4gICAgICAgICAgICAgZnJvbSB0aGUgcmVhbCB0YWIuIC0tPlxuICAgICAgICA8ZnMtbWVudSAjcGFnZU1lbnU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgIChjbGljayk9XCJyZW5hbWVQYWdlKHBhZ2UpXCI+XG4gICAgICAgICAgICBFZGl0IG5hbWVcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUGFnZShwYWdlKVwiPlxuICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9mcy1tZW51PlxuICAgICAgfVxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJwYWdlLXRhYiBhZGQtcGFnZVwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJBZGQgcGFnZVwiXG4gICAgICAgIChjbGljayk9XCJhZGRQYWdlKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgIFBhZ2VcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInpvb20tY29udHJvbHNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiem9vbS1idXR0b25cIlxuICAgICAgICBtYXRUb29sdGlwPVwiWm9vbSBvdXRcIlxuICAgICAgICAoY2xpY2spPVwiem9vbU91dCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5yZW1vdmU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInpvb20tbGFiZWxcIlxuICAgICAgICBtYXRUb29sdGlwPVwiWm9vbSB0byAxMDAlXCJcbiAgICAgICAgKGNsaWNrKT1cInpvb21BY3R1YWwoKVwiPlxuICAgICAgICB7eyAoem9vbSAqIDEwMCkudG9GaXhlZCgwKSB9fSVcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJ6b29tLWJ1dHRvblwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJab29tIGluXCJcbiAgICAgICAgKGNsaWNrKT1cInpvb21JbigpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInpvb20tYnV0dG9uXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkZpdCBwYWdlXCJcbiAgICAgICAgKGNsaWNrKT1cInpvb21GaXQoKVwiPlxuICAgICAgICA8bWF0LWljb24+Zml0X3NjcmVlbjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|