@firestitch/report 18.0.15 → 18.0.17

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.
@@ -1,12 +1,13 @@
1
- import { SemanticEntityFunction, SemanticEntityFunctions } from '../../interfaces/report.interface';
1
+ import { SemanticEntityFunction, SemanticEntityFunctions, SemanticFunctionSource } from '../../interfaces/report.interface';
2
2
  import * as i0 from "@angular/core";
3
3
  export interface EntityFunctionsDialogData {
4
4
  entityKey: string;
5
- source: 'model' | 'handler';
5
+ source: SemanticFunctionSource;
6
6
  }
7
7
  export declare class EntityFunctionsComponent {
8
8
  private static readonly KIND_COLORS;
9
9
  private static readonly KIND_ORDER;
10
+ private static readonly SOURCE_LABELS;
10
11
  private readonly _data;
11
12
  readonly entityKey: string;
12
13
  readonly sourceLabel: string;
@@ -1,19 +1,28 @@
1
- import { SemanticBuildEntity, SemanticBuildStage, SemanticBuildStatus, SemanticBuildTable } from '../../../../interfaces/report.interface';
1
+ import { SemanticBuildEntity, SemanticBuildStatus, SemanticBuildTable, SemanticFunctionSource } from '../../../../interfaces/report.interface';
2
2
  import * as i0 from "@angular/core";
3
+ interface SemanticUnitView {
4
+ key: string;
5
+ name: string;
6
+ hasTable: boolean;
7
+ entity: SemanticBuildEntity | null;
8
+ model: string | null;
9
+ functionCount: number;
10
+ }
3
11
  export declare class SemanticDatabaseComponent {
4
12
  private static readonly ACTIVE_STATES;
5
13
  private static readonly STATE_LABELS;
6
- private static readonly DONE_COLOR;
7
14
  private static readonly PENDING_COLOR;
8
- readonly stageKeys: string[];
9
- readonly stageLabels: Record<string, string>;
15
+ private static readonly NAME_SUFFIX;
10
16
  readonly status: import("@angular/core").WritableSignal<SemanticBuildStatus>;
17
+ readonly filter: import("@angular/core").WritableSignal<string>;
11
18
  readonly building: import("@angular/core").WritableSignal<boolean>;
12
19
  readonly buildActive: import("@angular/core").Signal<boolean>;
13
20
  readonly buildStateLabel: import("@angular/core").Signal<string>;
14
21
  readonly hasCatalog: import("@angular/core").Signal<boolean>;
15
22
  readonly excludedTables: import("@angular/core").Signal<SemanticBuildTable[]>;
16
23
  readonly unlinkedJunctions: import("@angular/core").Signal<SemanticBuildTable[]>;
24
+ readonly units: import("@angular/core").Signal<SemanticUnitView[]>;
25
+ readonly filteredUnits: import("@angular/core").Signal<SemanticUnitView[]>;
17
26
  readonly coverage: import("@angular/core").Signal<string>;
18
27
  private readonly _tables;
19
28
  private _buildFinalized;
@@ -28,29 +37,52 @@ export declare class SemanticDatabaseComponent {
28
37
  stopBuild(): void;
29
38
  private _runBuild;
30
39
  /**
31
- * Wrap up one build run exactly once. On a hard stream error there is no
32
- * status to read, so say so directly; otherwise refresh the status and
33
- * announce how the build actually ended — a build that failed (e.g. the AI
34
- * couldn't be reached) reports 'Failed' with a reason, and that must surface
35
- * instead of the run silently doing nothing.
40
+ * Wrap up one build run exactly once. On a hard stream error, surface the
41
+ * actual server-side reason pulled off the broken stream — the generic
42
+ * "could not run" line only when the failure carried no server text at all;
43
+ * otherwise refresh the status and announce how the build actually ended — a
44
+ * build that failed (e.g. the AI couldn't be reached) reports 'Failed' with
45
+ * a reason, and that must surface instead of the run silently doing nothing.
36
46
  */
37
47
  private _finalizeBuild;
48
+ /**
49
+ * The real reason a broken build stream broke, from what the server actually
50
+ * sent. A structured error frame arrives as {message} on the error body; a
51
+ * mid-stream crash dumps raw text into the stream (the stream interceptor
52
+ * hands it back as statusText), where the frames are JSON lines and the
53
+ * first non-JSON lines are the error and its location. '' when the failure
54
+ * carried no server text at all (transport down / server unreachable).
55
+ */
56
+ private _streamErrorDetail;
38
57
  /**
39
58
  * Tell the operator how the build ended: a failed/stopped build surfaces its
40
59
  * reason (so an AI connection problem is never silent), a completed one
41
60
  * confirms success.
42
61
  */
43
62
  private _announceOutcome;
44
- stageColor(stage: SemanticBuildStage): string;
45
- stageTooltip(stage: SemanticBuildStage): string;
63
+ pendingColor(): string;
46
64
  /**
47
- * Open the child dialog listing one group of an entity's cached functions —
48
- * the model class's or the handler class's. The dialog fetches fresh on open,
49
- * so the tab never holds function payloads.
65
+ * The build stages this row is still owed, or [] when it is fully built. A
66
+ * stopped or interrupted build is the only way to get a non-empty list.
50
67
  */
51
- openFunctions(entity: SemanticBuildEntity, source: 'model' | 'handler'): void;
68
+ pendingStages(unit: SemanticUnitView): string[];
69
+ setFilter(value: string): void;
70
+ /**
71
+ * Open the child dialog listing one group of a unit's cached functions — an
72
+ * entity's model or handler class, or a standalone class's code. The dialog
73
+ * fetches fresh on open, so the tab never holds function payloads.
74
+ */
75
+ openFunctions(unit: SemanticUnitView, source: SemanticFunctionSource): void;
52
76
  private _init;
77
+ /**
78
+ * What a reader recognizes the unit by: its class's short name, minus the
79
+ * `Model` suffix that every model carries and none of them are distinguished
80
+ * by. Falls back to the cache key for a unit whose class could not be
81
+ * resolved, so a row never renders nameless.
82
+ */
83
+ private _displayName;
53
84
  private _refreshStatus;
54
85
  static ɵfac: i0.ɵɵFactoryDeclaration<SemanticDatabaseComponent, never>;
55
86
  static ɵcmp: i0.ɵɵComponentDeclaration<SemanticDatabaseComponent, "fs-ai-report-global-settings-semantic-database", never, {}, {}, never, never, true, never>;
56
87
  }
88
+ export {};
@@ -210,6 +210,8 @@ export interface SemanticBuildEnum {
210
210
  export interface SemanticBuildEntity {
211
211
  key: string;
212
212
  table: string;
213
+ model: string | null;
214
+ handler: string | null;
213
215
  columns: number;
214
216
  relationships: number;
215
217
  enums: SemanticBuildEnum[];
@@ -219,6 +221,11 @@ export interface SemanticBuildEntity {
219
221
  handlerFunctionCount: number;
220
222
  stages: Record<string, SemanticBuildStage>;
221
223
  }
224
+ export interface SemanticBuildClass {
225
+ key: string;
226
+ model: string | null;
227
+ functionCount: number;
228
+ }
222
229
  export type SemanticTableClassification = 'entity' | 'junction' | 'excluded';
223
230
  export interface SemanticBuildTable {
224
231
  table: string;
@@ -229,14 +236,17 @@ export interface SemanticBuildTable {
229
236
  export interface SemanticBuildDetail {
230
237
  generatedAt: Date | null;
231
238
  entityCount: number;
239
+ classCount: number;
232
240
  functionCount: number;
233
241
  entities: SemanticBuildEntity[];
242
+ classes: SemanticBuildClass[];
234
243
  tableCount: number;
235
244
  junctionCount: number;
236
245
  unlinkedJunctionCount: number;
237
246
  excludedCount: number;
238
247
  tables: SemanticBuildTable[];
239
248
  }
249
+ export type SemanticFunctionSource = 'model' | 'handler' | 'class';
240
250
  export interface SemanticEntityFunction {
241
251
  class: string;
242
252
  method: string;
@@ -244,7 +254,7 @@ export interface SemanticEntityFunction {
244
254
  kind: string;
245
255
  summary: string;
246
256
  produces: string;
247
- source: 'model' | 'handler';
257
+ source: SemanticFunctionSource;
248
258
  }
249
259
  export interface SemanticEntityFunctions {
250
260
  entity: string;
@@ -405,7 +405,7 @@ export class ReportComponentComponent {
405
405
  });
406
406
  }
407
407
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportComponentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
408
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportComponentComponent, isStandalone: true, selector: "app-report-component", inputs: { reportId: "reportId", component: "component", groups: "groups", editMode: "editMode", layout: "layout", zoom: "zoom", snapper: "snapper", selected: "selected" }, outputs: { selectComponent: "selectComponent", positionChanged: "positionChanged", flowReorder: "flowReorder", openSettings: "openSettings" }, host: { properties: { "class.height-auto": "this.heightAuto" } }, viewQueries: [{ propertyName: "chartComponent", first: true, predicate: ComponentChartComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"component-box\"\n [class.editing]=\"editMode\"\n [class.selected]=\"selected\"\n [style.padding]=\"bodyPadding\"\n (pointerdown)=\"onComponentPointerDown($event)\"\n (mousedown)=\"stopCanvasPan($event)\"\n (touchstart)=\"stopCanvasPan($event)\">\n <!-- The header is an fs-filter: heading template = title (and the edit-mode\n drag handle), actions = the menu, items = component-level filters.\n Lists carry no items here \u2014 they filter through FsList. fs-filter reads\n its config once, so the block is keyed on the component-filter set to be\n recreated when it changes. -->\n @for (key of [filterKey]; track key) {\n <fs-filter\n class=\"component-filter\"\n [config]=\"filterConfig\">\n <ng-template fsFilterHeading>\n <div\n class=\"component-title\"\n (pointerdown)=\"onDragStart($event)\">\n {{ component.title }}\n @if (truncated) {\n <mat-icon\n class=\"truncated-icon\"\n matTooltip=\"Showing a truncated result \u2014 refine the filters to see everything.\">\n warning_amber\n </mat-icon>\n }\n </div>\n </ng-template>\n </fs-filter>\n }\n <!-- The actions menu is floated top-right (absolute) rather than living in\n fs-filter's actions slot, so its ~40px button height no longer drives the\n header row's height. It overlays the box corner; the heading reserves\n right padding so a long title ellipsises before it. -->\n <button\n mat-icon-button\n class=\"component-menu\"\n [matMenuTriggerFor]=\"menu\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"stopCanvasPan($event)\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"settings()\">\n <mat-icon>tune</mat-icon>\n <span>Settings</span>\n </button>\n <button mat-menu-item (click)=\"exportCsv()\">\n <mat-icon>download</mat-icon>\n <span>Export CSV</span>\n </button>\n </mat-menu>\n <div class=\"component-body\">\n @if (component.type === 'list') {\n <app-report-component-list\n [reportId]=\"reportId\"\n [component]=\"component\"\n [groups]=\"groups\">\n </app-report-component-list>\n } @else if (loading) {\n <div class=\"component-state\">\n <div class=\"loading-shimmer\"></div>\n </div>\n } @else if (error) {\n <div class=\"component-state error\">\n {{ error }}\n </div>\n } @else if (!data?.rows?.length) {\n <div class=\"component-state\">\n No data\n </div>\n } @else if (component.type === 'kpi') {\n <app-report-component-kpi\n [component]=\"component\"\n [data]=\"data\">\n </app-report-component-kpi>\n } @else {\n <app-report-component-chart\n [component]=\"component\"\n [data]=\"data\">\n </app-report-component-chart>\n }\n <!-- In edit mode a transparent veil over the body makes the WHOLE\n component draggable (industry standard: you grab the object, not just\n its title bar) and keeps inner widgets from swallowing the gesture. -->\n @if (editMode) {\n <div\n class=\"drag-veil\"\n (pointerdown)=\"onDragStart($event)\">\n </div>\n }\n </div>\n</div>\n<!-- Handles live OUTSIDE the clipped box so they straddle its edges. -->\n@if (editMode && selected) {\n @if (layout === 'freeform') {\n @for (handle of resizeHandles; track handle) {\n <div\n class=\"handle handle-{{ handle }}\"\n (mousedown)=\"stopCanvasPan($event)\"\n (pointerdown)=\"onResizeStart($event, handle)\">\n </div>\n }\n } @else {\n <!-- Flow height is always auto (the box fits its content), so only the\n east handle (width %) is offered here. -->\n <div\n class=\"handle handle-e\"\n matTooltip=\"Width (% of page)\"\n (mousedown)=\"stopCanvasPan($event)\"\n (pointerdown)=\"onResizeStart($event, 'e')\">\n </div>\n }\n}", styles: [":host{position:absolute;display:flex;flex-direction:column}:host.flow-item{position:relative;left:auto;top:auto}:host.flow-dragging{z-index:40;opacity:.7;pointer-events:none}.component-box{position:relative;width:100%;flex:1 1 auto;min-height:0;box-sizing:border-box;display:flex;flex-direction:column;background:#fff;border:1px solid #e4e7eb;border-radius:6px;overflow:hidden;transition:box-shadow .12s ease,border-color .12s ease}.component-box.editing .component-title{cursor:grab}.component-box.editing .component-title:active{cursor:grabbing}.component-box.editing:hover{border-color:#9db3c8;box-shadow:0 2px 8px #0f172a14}.component-box.selected{border-color:var(--brand-primary-color);box-shadow:0 0 0 1px var(--brand-primary-color),0 4px 14px #2196f32e}:host ::ng-deep .component-filter .filter-bar-container{align-items:center!important}.component-filter{flex:0 0 auto;display:block;padding:0 0 4px}.component-filter .component-title{display:flex;align-items:center;gap:4px;-webkit-user-select:none;user-select:none;padding-right:40px;font-size:var(--report-heading-size);font-weight:600;color:#1f2933;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.component-filter .component-title .truncated-icon{font-size:16px;width:16px;height:16px;color:#f59e0b}.component-menu{position:absolute;top:2px;right:2px;z-index:30}.component-body{flex:1 1 auto;min-height:0;position:relative}:host(.height-auto) .component-state{min-height:120px}.drag-veil{position:absolute;inset:0;cursor:grab;touch-action:none}.drag-veil:active{cursor:grabbing}.component-state{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:12px;color:#7b8794;padding:8px;text-align:center}.component-state.error{color:#e15759}.loading-shimmer{width:70%;height:60%;border-radius:6px;background:linear-gradient(100deg,#f0f4f8 40%,#e4ebf2,#f0f4f8 60%);background-size:200% 100%;animation:shimmer 1.2s infinite linear}@keyframes shimmer{to{background-position-x:-200%}}.handle{position:absolute;width:14px;height:14px;display:flex;align-items:center;justify-content:center;touch-action:none;z-index:20;transform:scale(calc(1 / var(--canvas-zoom, 1)))}.handle:before{content:\"\";width:8px;height:8px;background:#fff;border:1.5px solid var(--brand-primary-color);border-radius:2px;box-shadow:0 1px 2px #0f172a33}.handle-nw{left:-7px;top:-7px;cursor:nwse-resize}.handle-n{left:calc(50% - 7px);top:-7px;cursor:ns-resize}.handle-ne{right:-7px;top:-7px;cursor:nesw-resize}.handle-e{right:-7px;top:calc(50% - 7px);cursor:ew-resize}.handle-se{right:-7px;bottom:-7px;cursor:nwse-resize}.handle-s{left:calc(50% - 7px);bottom:-7px;cursor:ns-resize}.handle-sw{left:-7px;bottom:-7px;cursor:nesw-resize}.handle-w{left:-7px;top:calc(50% - 7px);cursor:ew-resize}\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i2.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "directive", type: i2.FilterHeadingDirective, selector: "[fsFilterHeading]" }, { kind: "component", type: ComponentChartComponent, selector: "app-report-component-chart", inputs: ["component", "data"] }, { kind: "component", type: ComponentKpiComponent, selector: "app-report-component-kpi", inputs: ["component", "data"] }, { kind: "component", type: ComponentListComponent, selector: "app-report-component-list", inputs: ["reportId", "component", "groups"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
408
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportComponentComponent, isStandalone: true, selector: "app-report-component", inputs: { reportId: "reportId", component: "component", groups: "groups", editMode: "editMode", layout: "layout", zoom: "zoom", snapper: "snapper", selected: "selected" }, outputs: { selectComponent: "selectComponent", positionChanged: "positionChanged", flowReorder: "flowReorder", openSettings: "openSettings" }, host: { properties: { "class.height-auto": "this.heightAuto" } }, viewQueries: [{ propertyName: "chartComponent", first: true, predicate: ComponentChartComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"component-box\"\n [class.editing]=\"editMode\"\n [class.selected]=\"selected\"\n [style.padding]=\"bodyPadding\"\n (pointerdown)=\"onComponentPointerDown($event)\"\n (mousedown)=\"stopCanvasPan($event)\"\n (touchstart)=\"stopCanvasPan($event)\">\n <!-- The header is an fs-filter: heading template = title (and the edit-mode\n drag handle), actions = the menu, items = component-level filters.\n Lists carry no items here \u2014 they filter through FsList. fs-filter reads\n its config once, so the block is keyed on the component-filter set to be\n recreated when it changes. -->\n @for (key of [filterKey]; track key) {\n <fs-filter\n class=\"component-filter\"\n [config]=\"filterConfig\">\n <ng-template fsFilterHeading>\n <div\n class=\"component-title\"\n (pointerdown)=\"onDragStart($event)\">\n {{ component.title }}\n @if (truncated) {\n <mat-icon\n class=\"truncated-icon\"\n matTooltip=\"Showing a truncated result \u2014 refine the filters to see everything.\">\n warning_amber\n </mat-icon>\n }\n </div>\n </ng-template>\n </fs-filter>\n }\n <!-- The actions menu is floated top-right (absolute) rather than living in\n fs-filter's actions slot, so its ~40px button height no longer drives the\n header row's height. It overlays the box corner; the heading reserves\n right padding so a long title ellipsises before it. -->\n <button\n mat-icon-button\n class=\"component-menu\"\n [matMenuTriggerFor]=\"menu\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"stopCanvasPan($event)\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"settings()\">\n <mat-icon>tune</mat-icon>\n <span>Settings</span>\n </button>\n <button mat-menu-item (click)=\"exportCsv()\">\n <mat-icon>download</mat-icon>\n <span>Export CSV</span>\n </button>\n </mat-menu>\n <div class=\"component-body\">\n @if (component.type === 'list') {\n <app-report-component-list\n [reportId]=\"reportId\"\n [component]=\"component\"\n [groups]=\"groups\">\n </app-report-component-list>\n } @else if (loading) {\n <div class=\"component-state\">\n <div class=\"loading-shimmer\"></div>\n </div>\n } @else if (error) {\n <div class=\"component-state error\">\n {{ error }}\n </div>\n } @else if (!data?.rows?.length) {\n <div class=\"component-state\">\n No data\n </div>\n } @else if (component.type === 'kpi') {\n <app-report-component-kpi\n [component]=\"component\"\n [data]=\"data\">\n </app-report-component-kpi>\n } @else {\n <app-report-component-chart\n [component]=\"component\"\n [data]=\"data\">\n </app-report-component-chart>\n }\n <!-- In edit mode a transparent veil over the body makes the WHOLE\n component draggable (industry standard: you grab the object, not just\n its title bar) and keeps inner widgets from swallowing the gesture. -->\n @if (editMode) {\n <div\n class=\"drag-veil\"\n (pointerdown)=\"onDragStart($event)\">\n </div>\n }\n </div>\n</div>\n<!-- Handles live OUTSIDE the clipped box so they straddle its edges. -->\n@if (editMode && selected) {\n @if (layout === 'freeform') {\n @for (handle of resizeHandles; track handle) {\n <div\n class=\"handle handle-{{ handle }}\"\n (mousedown)=\"stopCanvasPan($event)\"\n (pointerdown)=\"onResizeStart($event, handle)\">\n </div>\n }\n } @else {\n <!-- Flow height is always auto (the box fits its content), so only the\n east handle (width %) is offered here. -->\n <div\n class=\"handle handle-e\"\n matTooltip=\"Width (% of page)\"\n (mousedown)=\"stopCanvasPan($event)\"\n (pointerdown)=\"onResizeStart($event, 'e')\">\n </div>\n }\n}", styles: [":host{position:absolute;display:flex;flex-direction:column;font-size:10px}:host.flow-item{position:relative;left:auto;top:auto}:host.flow-dragging{z-index:40;opacity:.7;pointer-events:none}.component-box{position:relative;width:100%;flex:1 1 auto;min-height:0;box-sizing:border-box;display:flex;flex-direction:column;background:#fff;border:1px solid #e4e7eb;border-radius:6px;overflow:hidden;transition:box-shadow .12s ease,border-color .12s ease}.component-box.editing .component-title{cursor:grab}.component-box.editing .component-title:active{cursor:grabbing}.component-box.editing:hover{border-color:#9db3c8;box-shadow:0 2px 8px #0f172a14}.component-box.selected{border-color:var(--brand-primary-color);box-shadow:0 0 0 1px var(--brand-primary-color),0 4px 14px #2196f32e}:host ::ng-deep .component-filter .filter-bar-container{align-items:center!important}.component-filter{flex:0 0 auto;display:block;padding:0 0 4px}.component-filter .component-title{display:flex;align-items:center;gap:4px;-webkit-user-select:none;user-select:none;padding-right:40px;font-size:var(--report-heading-size);font-weight:600;color:#1f2933;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.component-filter .component-title .truncated-icon{font-size:16px;width:16px;height:16px;color:#f59e0b}.component-menu{position:absolute;top:2px;right:2px;z-index:30}.component-body{flex:1 1 auto;min-height:0;position:relative}:host(.height-auto) .component-state{min-height:120px}.drag-veil{position:absolute;inset:0;cursor:grab;touch-action:none}.drag-veil:active{cursor:grabbing}.component-state{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:12px;color:#7b8794;padding:8px;text-align:center}.component-state.error{color:#e15759}.loading-shimmer{width:70%;height:60%;border-radius:6px;background:linear-gradient(100deg,#f0f4f8 40%,#e4ebf2,#f0f4f8 60%);background-size:200% 100%;animation:shimmer 1.2s infinite linear}@keyframes shimmer{to{background-position-x:-200%}}.handle{position:absolute;width:14px;height:14px;display:flex;align-items:center;justify-content:center;touch-action:none;z-index:20;transform:scale(calc(1 / var(--canvas-zoom, 1)))}.handle:before{content:\"\";width:8px;height:8px;background:#fff;border:1.5px solid var(--brand-primary-color);border-radius:2px;box-shadow:0 1px 2px #0f172a33}.handle-nw{left:-7px;top:-7px;cursor:nwse-resize}.handle-n{left:calc(50% - 7px);top:-7px;cursor:ns-resize}.handle-ne{right:-7px;top:-7px;cursor:nesw-resize}.handle-e{right:-7px;top:calc(50% - 7px);cursor:ew-resize}.handle-se{right:-7px;bottom:-7px;cursor:nwse-resize}.handle-s{left:calc(50% - 7px);bottom:-7px;cursor:ns-resize}.handle-sw{left:-7px;bottom:-7px;cursor:nesw-resize}.handle-w{left:-7px;top:calc(50% - 7px);cursor:ew-resize}\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i2.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "directive", type: i2.FilterHeadingDirective, selector: "[fsFilterHeading]" }, { kind: "component", type: ComponentChartComponent, selector: "app-report-component-chart", inputs: ["component", "data"] }, { kind: "component", type: ComponentKpiComponent, selector: "app-report-component-kpi", inputs: ["component", "data"] }, { kind: "component", type: ComponentListComponent, selector: "app-report-component-list", inputs: ["reportId", "component", "groups"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
409
409
  }
410
410
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportComponentComponent, decorators: [{
411
411
  type: Component,
@@ -418,7 +418,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
418
418
  ComponentChartComponent,
419
419
  ComponentKpiComponent,
420
420
  ComponentListComponent,
421
- ], template: "<div\n class=\"component-box\"\n [class.editing]=\"editMode\"\n [class.selected]=\"selected\"\n [style.padding]=\"bodyPadding\"\n (pointerdown)=\"onComponentPointerDown($event)\"\n (mousedown)=\"stopCanvasPan($event)\"\n (touchstart)=\"stopCanvasPan($event)\">\n <!-- The header is an fs-filter: heading template = title (and the edit-mode\n drag handle), actions = the menu, items = component-level filters.\n Lists carry no items here \u2014 they filter through FsList. fs-filter reads\n its config once, so the block is keyed on the component-filter set to be\n recreated when it changes. -->\n @for (key of [filterKey]; track key) {\n <fs-filter\n class=\"component-filter\"\n [config]=\"filterConfig\">\n <ng-template fsFilterHeading>\n <div\n class=\"component-title\"\n (pointerdown)=\"onDragStart($event)\">\n {{ component.title }}\n @if (truncated) {\n <mat-icon\n class=\"truncated-icon\"\n matTooltip=\"Showing a truncated result \u2014 refine the filters to see everything.\">\n warning_amber\n </mat-icon>\n }\n </div>\n </ng-template>\n </fs-filter>\n }\n <!-- The actions menu is floated top-right (absolute) rather than living in\n fs-filter's actions slot, so its ~40px button height no longer drives the\n header row's height. It overlays the box corner; the heading reserves\n right padding so a long title ellipsises before it. -->\n <button\n mat-icon-button\n class=\"component-menu\"\n [matMenuTriggerFor]=\"menu\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"stopCanvasPan($event)\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"settings()\">\n <mat-icon>tune</mat-icon>\n <span>Settings</span>\n </button>\n <button mat-menu-item (click)=\"exportCsv()\">\n <mat-icon>download</mat-icon>\n <span>Export CSV</span>\n </button>\n </mat-menu>\n <div class=\"component-body\">\n @if (component.type === 'list') {\n <app-report-component-list\n [reportId]=\"reportId\"\n [component]=\"component\"\n [groups]=\"groups\">\n </app-report-component-list>\n } @else if (loading) {\n <div class=\"component-state\">\n <div class=\"loading-shimmer\"></div>\n </div>\n } @else if (error) {\n <div class=\"component-state error\">\n {{ error }}\n </div>\n } @else if (!data?.rows?.length) {\n <div class=\"component-state\">\n No data\n </div>\n } @else if (component.type === 'kpi') {\n <app-report-component-kpi\n [component]=\"component\"\n [data]=\"data\">\n </app-report-component-kpi>\n } @else {\n <app-report-component-chart\n [component]=\"component\"\n [data]=\"data\">\n </app-report-component-chart>\n }\n <!-- In edit mode a transparent veil over the body makes the WHOLE\n component draggable (industry standard: you grab the object, not just\n its title bar) and keeps inner widgets from swallowing the gesture. -->\n @if (editMode) {\n <div\n class=\"drag-veil\"\n (pointerdown)=\"onDragStart($event)\">\n </div>\n }\n </div>\n</div>\n<!-- Handles live OUTSIDE the clipped box so they straddle its edges. -->\n@if (editMode && selected) {\n @if (layout === 'freeform') {\n @for (handle of resizeHandles; track handle) {\n <div\n class=\"handle handle-{{ handle }}\"\n (mousedown)=\"stopCanvasPan($event)\"\n (pointerdown)=\"onResizeStart($event, handle)\">\n </div>\n }\n } @else {\n <!-- Flow height is always auto (the box fits its content), so only the\n east handle (width %) is offered here. -->\n <div\n class=\"handle handle-e\"\n matTooltip=\"Width (% of page)\"\n (mousedown)=\"stopCanvasPan($event)\"\n (pointerdown)=\"onResizeStart($event, 'e')\">\n </div>\n }\n}", styles: [":host{position:absolute;display:flex;flex-direction:column}:host.flow-item{position:relative;left:auto;top:auto}:host.flow-dragging{z-index:40;opacity:.7;pointer-events:none}.component-box{position:relative;width:100%;flex:1 1 auto;min-height:0;box-sizing:border-box;display:flex;flex-direction:column;background:#fff;border:1px solid #e4e7eb;border-radius:6px;overflow:hidden;transition:box-shadow .12s ease,border-color .12s ease}.component-box.editing .component-title{cursor:grab}.component-box.editing .component-title:active{cursor:grabbing}.component-box.editing:hover{border-color:#9db3c8;box-shadow:0 2px 8px #0f172a14}.component-box.selected{border-color:var(--brand-primary-color);box-shadow:0 0 0 1px var(--brand-primary-color),0 4px 14px #2196f32e}:host ::ng-deep .component-filter .filter-bar-container{align-items:center!important}.component-filter{flex:0 0 auto;display:block;padding:0 0 4px}.component-filter .component-title{display:flex;align-items:center;gap:4px;-webkit-user-select:none;user-select:none;padding-right:40px;font-size:var(--report-heading-size);font-weight:600;color:#1f2933;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.component-filter .component-title .truncated-icon{font-size:16px;width:16px;height:16px;color:#f59e0b}.component-menu{position:absolute;top:2px;right:2px;z-index:30}.component-body{flex:1 1 auto;min-height:0;position:relative}:host(.height-auto) .component-state{min-height:120px}.drag-veil{position:absolute;inset:0;cursor:grab;touch-action:none}.drag-veil:active{cursor:grabbing}.component-state{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:12px;color:#7b8794;padding:8px;text-align:center}.component-state.error{color:#e15759}.loading-shimmer{width:70%;height:60%;border-radius:6px;background:linear-gradient(100deg,#f0f4f8 40%,#e4ebf2,#f0f4f8 60%);background-size:200% 100%;animation:shimmer 1.2s infinite linear}@keyframes shimmer{to{background-position-x:-200%}}.handle{position:absolute;width:14px;height:14px;display:flex;align-items:center;justify-content:center;touch-action:none;z-index:20;transform:scale(calc(1 / var(--canvas-zoom, 1)))}.handle:before{content:\"\";width:8px;height:8px;background:#fff;border:1.5px solid var(--brand-primary-color);border-radius:2px;box-shadow:0 1px 2px #0f172a33}.handle-nw{left:-7px;top:-7px;cursor:nwse-resize}.handle-n{left:calc(50% - 7px);top:-7px;cursor:ns-resize}.handle-ne{right:-7px;top:-7px;cursor:nesw-resize}.handle-e{right:-7px;top:calc(50% - 7px);cursor:ew-resize}.handle-se{right:-7px;bottom:-7px;cursor:nwse-resize}.handle-s{left:calc(50% - 7px);bottom:-7px;cursor:ns-resize}.handle-sw{left:-7px;bottom:-7px;cursor:nesw-resize}.handle-w{left:-7px;top:calc(50% - 7px);cursor:ew-resize}\n"] }]
421
+ ], template: "<div\n class=\"component-box\"\n [class.editing]=\"editMode\"\n [class.selected]=\"selected\"\n [style.padding]=\"bodyPadding\"\n (pointerdown)=\"onComponentPointerDown($event)\"\n (mousedown)=\"stopCanvasPan($event)\"\n (touchstart)=\"stopCanvasPan($event)\">\n <!-- The header is an fs-filter: heading template = title (and the edit-mode\n drag handle), actions = the menu, items = component-level filters.\n Lists carry no items here \u2014 they filter through FsList. fs-filter reads\n its config once, so the block is keyed on the component-filter set to be\n recreated when it changes. -->\n @for (key of [filterKey]; track key) {\n <fs-filter\n class=\"component-filter\"\n [config]=\"filterConfig\">\n <ng-template fsFilterHeading>\n <div\n class=\"component-title\"\n (pointerdown)=\"onDragStart($event)\">\n {{ component.title }}\n @if (truncated) {\n <mat-icon\n class=\"truncated-icon\"\n matTooltip=\"Showing a truncated result \u2014 refine the filters to see everything.\">\n warning_amber\n </mat-icon>\n }\n </div>\n </ng-template>\n </fs-filter>\n }\n <!-- The actions menu is floated top-right (absolute) rather than living in\n fs-filter's actions slot, so its ~40px button height no longer drives the\n header row's height. It overlays the box corner; the heading reserves\n right padding so a long title ellipsises before it. -->\n <button\n mat-icon-button\n class=\"component-menu\"\n [matMenuTriggerFor]=\"menu\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"stopCanvasPan($event)\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"settings()\">\n <mat-icon>tune</mat-icon>\n <span>Settings</span>\n </button>\n <button mat-menu-item (click)=\"exportCsv()\">\n <mat-icon>download</mat-icon>\n <span>Export CSV</span>\n </button>\n </mat-menu>\n <div class=\"component-body\">\n @if (component.type === 'list') {\n <app-report-component-list\n [reportId]=\"reportId\"\n [component]=\"component\"\n [groups]=\"groups\">\n </app-report-component-list>\n } @else if (loading) {\n <div class=\"component-state\">\n <div class=\"loading-shimmer\"></div>\n </div>\n } @else if (error) {\n <div class=\"component-state error\">\n {{ error }}\n </div>\n } @else if (!data?.rows?.length) {\n <div class=\"component-state\">\n No data\n </div>\n } @else if (component.type === 'kpi') {\n <app-report-component-kpi\n [component]=\"component\"\n [data]=\"data\">\n </app-report-component-kpi>\n } @else {\n <app-report-component-chart\n [component]=\"component\"\n [data]=\"data\">\n </app-report-component-chart>\n }\n <!-- In edit mode a transparent veil over the body makes the WHOLE\n component draggable (industry standard: you grab the object, not just\n its title bar) and keeps inner widgets from swallowing the gesture. -->\n @if (editMode) {\n <div\n class=\"drag-veil\"\n (pointerdown)=\"onDragStart($event)\">\n </div>\n }\n </div>\n</div>\n<!-- Handles live OUTSIDE the clipped box so they straddle its edges. -->\n@if (editMode && selected) {\n @if (layout === 'freeform') {\n @for (handle of resizeHandles; track handle) {\n <div\n class=\"handle handle-{{ handle }}\"\n (mousedown)=\"stopCanvasPan($event)\"\n (pointerdown)=\"onResizeStart($event, handle)\">\n </div>\n }\n } @else {\n <!-- Flow height is always auto (the box fits its content), so only the\n east handle (width %) is offered here. -->\n <div\n class=\"handle handle-e\"\n matTooltip=\"Width (% of page)\"\n (mousedown)=\"stopCanvasPan($event)\"\n (pointerdown)=\"onResizeStart($event, 'e')\">\n </div>\n }\n}", styles: [":host{position:absolute;display:flex;flex-direction:column;font-size:10px}:host.flow-item{position:relative;left:auto;top:auto}:host.flow-dragging{z-index:40;opacity:.7;pointer-events:none}.component-box{position:relative;width:100%;flex:1 1 auto;min-height:0;box-sizing:border-box;display:flex;flex-direction:column;background:#fff;border:1px solid #e4e7eb;border-radius:6px;overflow:hidden;transition:box-shadow .12s ease,border-color .12s ease}.component-box.editing .component-title{cursor:grab}.component-box.editing .component-title:active{cursor:grabbing}.component-box.editing:hover{border-color:#9db3c8;box-shadow:0 2px 8px #0f172a14}.component-box.selected{border-color:var(--brand-primary-color);box-shadow:0 0 0 1px var(--brand-primary-color),0 4px 14px #2196f32e}:host ::ng-deep .component-filter .filter-bar-container{align-items:center!important}.component-filter{flex:0 0 auto;display:block;padding:0 0 4px}.component-filter .component-title{display:flex;align-items:center;gap:4px;-webkit-user-select:none;user-select:none;padding-right:40px;font-size:var(--report-heading-size);font-weight:600;color:#1f2933;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.component-filter .component-title .truncated-icon{font-size:16px;width:16px;height:16px;color:#f59e0b}.component-menu{position:absolute;top:2px;right:2px;z-index:30}.component-body{flex:1 1 auto;min-height:0;position:relative}:host(.height-auto) .component-state{min-height:120px}.drag-veil{position:absolute;inset:0;cursor:grab;touch-action:none}.drag-veil:active{cursor:grabbing}.component-state{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:12px;color:#7b8794;padding:8px;text-align:center}.component-state.error{color:#e15759}.loading-shimmer{width:70%;height:60%;border-radius:6px;background:linear-gradient(100deg,#f0f4f8 40%,#e4ebf2,#f0f4f8 60%);background-size:200% 100%;animation:shimmer 1.2s infinite linear}@keyframes shimmer{to{background-position-x:-200%}}.handle{position:absolute;width:14px;height:14px;display:flex;align-items:center;justify-content:center;touch-action:none;z-index:20;transform:scale(calc(1 / var(--canvas-zoom, 1)))}.handle:before{content:\"\";width:8px;height:8px;background:#fff;border:1.5px solid var(--brand-primary-color);border-radius:2px;box-shadow:0 1px 2px #0f172a33}.handle-nw{left:-7px;top:-7px;cursor:nwse-resize}.handle-n{left:calc(50% - 7px);top:-7px;cursor:ns-resize}.handle-ne{right:-7px;top:-7px;cursor:nesw-resize}.handle-e{right:-7px;top:calc(50% - 7px);cursor:ew-resize}.handle-se{right:-7px;bottom:-7px;cursor:nwse-resize}.handle-s{left:calc(50% - 7px);bottom:-7px;cursor:ns-resize}.handle-sw{left:-7px;bottom:-7px;cursor:nesw-resize}.handle-w{left:-7px;top:calc(50% - 7px);cursor:ew-resize}\n"] }]
422
422
  }], propDecorators: { reportId: [{
423
423
  type: Input
424
424
  }], component: [{
@@ -450,4 +450,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
450
450
  type: HostBinding,
451
451
  args: ['class.height-auto']
452
452
  }] } });
453
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNvbXBvbmVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9yZXBvcnQtY29tcG9uZW50L3JlcG9ydC1jb21wb25lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvcmVwb3J0LWNvbXBvbmVudC9yZXBvcnQtY29tcG9uZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFDN0UsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFxQixNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLEdBQ3RHLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQWdCLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPcEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9B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IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5pbXBvcnQgeyBNYXRJY29uQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRmlsdGVyQ29uZmlnLCBGc0ZpbHRlck1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbHRlcic7XG5pbXBvcnQgeyBGc1Byb2Nlc3MgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcblxuaW1wb3J0IHsgU3ViamVjdCwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgUmVwb3J0Q29tcG9uZW50IGFzIFJlcG9ydENvbXBvbmVudE1vZGVsLFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0TGF5b3V0LFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgREVGQVVMVF9DT01QT05FTlRfUEFERElORyB9IGZyb20gJy4uLy4uL2xheW91dCc7XG5pbXBvcnQgeyBmaWx0ZXJJdGVtRm9yR3JvdXAsIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5IH0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50Q2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtY2hhcnQvY29tcG9uZW50LWNoYXJ0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRLcGlDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQta3BpL2NvbXBvbmVudC1rcGkuY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudExpc3RDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbGlzdC9jb21wb25lbnQtbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2FudmFzU25hcHBlciwgUFhfUEVSX0lOQ0ggfSBmcm9tICcuLi9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50JztcblxuXG4vLyBGcmVlZm9ybSByZXNpemUgaGFuZGxlcywgbmFtZWQgYnkgY29tcGFzcyBkaXJlY3Rpb24uXG5jb25zdCBIQU5ETEVTID0gWydudycsICduJywgJ25lJywgJ2UnLCAnc2UnLCAncycsICdzdycsICd3J10gYXMgY29uc3Q7XG50eXBlIEhhbmRsZSA9IHR5cGVvZiBIQU5ETEVTW251bWJlcl07XG5cbi8vIEZsb3cgd2lkdGggc25hcHMgdG8gdGhlIHVzZWZ1bCBmcmFjdGlvbnMgb2YgYSBwYWdlIHJvdy5cbmNvbnN0IEZMT1dfV0lEVEhfU1RPUFMgPSBbMjUsIDMzLjMzLCA1MCwgNjYuNjcsIDc1LCAxMDBdO1xuXG5jb25zdCBNSU5fVyA9IDAuNjsgLy8gaW5jaGVzXG5jb25zdCBNSU5fSCA9IDAuNDsgLy8gaW5jaGVzXG5cbi8vIE9uZSBjb21wb25lbnQgb24gdGhlIHBhZ2U6IHRpdGxlIGJhciwgdGhlIHR5cGUtc3BlY2lmaWMgYm9keSAoY2hhcnQgfCBsaXN0XG4vLyB8IGtwaSksIGEgbWVudSAoc2V0dGluZ3MsIGZpbHRlciB0b2dnbGVzLCBleHBvcnQpIOKAlCBhbmQgdGhlIGVkaXRpbmdcbi8vIGludGVyYWN0aW9uczpcbi8vXG4vLyAgIEZyZWVmb3JtOiBjbGljayBzZWxlY3RzOyB0aGUgc2VsZWN0aW9uIGZyYW1lIHNob3dzIDggcmVzaXplIGhhbmRsZXM7XG4vLyAgIGRyYWdnaW5nIHRoZSBib2R5IG1vdmVzIHdpdGggc21hcnQgYWxpZ25tZW50IGd1aWRlcyAodmlhIHRoZSBjYW52YXNcbi8vICAgc25hcHBlcik7IGV2ZXJ5dGhpbmcgd29ya3MgYXQgYW55IHpvb20gKHBpeGVsIGRlbHRhcyDDtyB6b29twrc5NiDihpIgaW5jaGVzKS5cbi8vXG4vLyAgIEZsb3c6IGRyYWdnaW5nIHJlb3JkZXJzIChkcm9wIHBvc2l0aW9uIGRlY2lkZWQgYnkgdGhlIGNhbnZhcyk7IHRoZSBFXG4vLyAgIGhhbmRsZSByZXNpemVzIGZsb3dXaWR0aCAlIChzbmFwcGluZyB0byAyNS8zMy81MC82Ni83NS8xMDApLCB0aGUgUyBoYW5kbGVcbi8vICAgcmVzaXplcyBoZWlnaHQgaW4gaW5jaGVzLlxuLy9cbi8vIENoYXJ0cyBhbmQgS1BJcyBmZXRjaCB0aGVpciBvd24gZGF0YSBoZXJlOyBsaXN0cyBmZXRjaCBpbnNpZGVcbi8vIENvbXBvbmVudExpc3RDb21wb25lbnQgdGhyb3VnaCBGc0xpc3QgcGFnaW5nLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVwb3J0LWNvbXBvbmVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlcG9ydC1jb21wb25lbnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRJY29uLFxuICAgIE1hdEljb25CdXR0b24sXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgICBNYXRUb29sdGlwLFxuICAgIEZzRmlsdGVyTW9kdWxlLFxuICAgIENvbXBvbmVudENoYXJ0Q29tcG9uZW50LFxuICAgIENvbXBvbmVudEtwaUNvbXBvbmVudCxcbiAgICBDb21wb25lbnRMaXN0Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRDb21wb25lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcHVibGljIHJlcG9ydElkOiBudW1iZXI7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudE1vZGVsO1xuICBASW5wdXQoKSBwdWJsaWMgZ3JvdXBzOiBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD47XG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0TW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgbGF5b3V0OiBSZXBvcnRMYXlvdXQgPSAnZnJlZWZvcm0nO1xuICAvLyBUaGUgY2FudmFzIHpvb20g4oCUIGNvbnZlcnRzIG9uLXNjcmVlbiBwaXhlbCBkZWx0YXMgYmFjayB0byBpbmNoZXMuXG4gIEBJbnB1dCgpIHB1YmxpYyB6b29tID0gMTtcbiAgQElucHV0KCkgcHVibGljIHNuYXBwZXI6IENhbnZhc1NuYXBwZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RDb21wb25lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBwb3NpdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBmbG93UmVvcmRlciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb21wb25lbnRJZDogbnVtYmVyOyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9wZW5TZXR0aW5ncyA9IG5ldyBFdmVudEVtaXR0ZXI8UmVwb3J0Q29tcG9uZW50TW9kZWw+KCk7XG5cbiAgQFZpZXdDaGlsZChDb21wb25lbnRDaGFydENvbXBvbmVudClcbiAgcHVibGljIGNoYXJ0Q29tcG9uZW50OiBDb21wb25lbnRDaGFydENvbXBvbmVudDtcblxuICAvLyBGcmVlZm9ybSByZXNpemUgaGFuZGxlcyBieSB0eXBlOiBhIGZpeGVkLWhlaWdodCBjb21wb25lbnQgKGNoYXJ0L2xpc3QpXG4gIC8vIGdldHMgYWxsIGVpZ2h0IChyZXNpemUgd2lkdGggQU5EIGhlaWdodCk7IGFuIGF1dG8taGVpZ2h0IG9uZSAoa3BpKSBnZXRzXG4gIC8vIG9ubHkgdGhlIHNpZGUgaGFuZGxlcyBzaW5jZSBpdHMgaGVpZ2h0IGZpdHMgaXRzIGNvbnRlbnQgYW5kIGNhbid0IGJlIHNldC5cbiAgcHVibGljIGdldCByZXNpemVIYW5kbGVzKCk6IHJlYWRvbmx5IEhhbmRsZVtdIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0QXV0byA/IFsnZScsICd3J10gOiBIQU5ETEVTO1xuICB9XG5cbiAgLy8gVGhlIGNvbXBvbmVudCdzIGhlYWRlciBJUyBhbiBmcy1maWx0ZXI6IGhlYWRpbmcgdGVtcGxhdGUgPSBpdHMgdGl0bGUgKGFuZFxuICAvLyB0aGUgZHJhZyBoYW5kbGUpLCBhY3Rpb25zID0gdGhlIFNldHRpbmdzIC8gZmlsdGVyLXRvZ2dsZXMgLyBFeHBvcnQgbWVudSxcbiAgLy8gaXRlbXMgPSBpdHMgY29tcG9uZW50LWxldmVsIGZpbHRlciBncm91cHMgKG5vbmUgZm9yIGxpc3RzIOKAlCB0aGV5IGZpbHRlclxuICAvLyB0aHJvdWdoIEZzTGlzdCkuIFJlYnVpbHQgd2hlbiBhIGZpbHRlciB0b2dnbGUgY2hhbmdlcyB3aGljaCBncm91cHMgc2hvdy5cbiAgcHVibGljIGZpbHRlckNvbmZpZyE6IEZpbHRlckNvbmZpZztcblxuICBwdWJsaWMgZGF0YTogQ29tcG9uZW50RGF0YSB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgZXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX3JlZnJlc2gkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvY2VzcyA9IGluamVjdChGc1Byb2Nlc3MpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF9jZFJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgX3pvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSBfaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2J1aWxkRmlsdGVyQ29uZmlnKCk7XG5cbiAgICBpZiAodGhpcy5jb21wb25lbnQudHlwZSAhPT0gJ2xpc3QnKSB7XG4gICAgICAvLyBEZWJvdW5jZWQgc28gYSByYXBpZCBmaWx0ZXIgc3dlZXAgZmlyZXMgb25lIHF1ZXJ5LCBub3Qgb25lIHBlciBjaGFuZ2UuXG4gICAgICB0aGlzLl9yZWZyZXNoJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9sb2FkKCkpO1xuXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yKHRoaXMuY29tcG9uZW50KVxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fcmVmcmVzaCQubmV4dCgpKTtcblxuICAgICAgLy8gQSBGcmVxdWVuY3kgY2hhbmdlIHJlLWJ1Y2tldHMgZXZlcnkgdGltZS1zZXJpZXMgY2hhcnQ7IGl0IGlzbid0IHNjb3BlZFxuICAgICAgLy8gdG8gYSBmaWx0ZXIgZ3JvdXAsIHNvIGl0IHJpZGVzIGl0cyBvd24gc3RyZWFtLlxuICAgICAgaWYgKHRoaXMuX2lzVGltZVNlcmllcykge1xuICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3lDaGFuZ2VzKClcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9yZWZyZXNoJC5uZXh0KCkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9sb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCByZWxvYWRzIChlLmcuIGFmdGVyIHRoZSBzZXR0aW5ncyBkaWFsb2cgYWRkcy9tb3ZlcyBhIGZpbHRlcilcbiAgLy8gaGFuZCB0aGlzIGluc3RhbmNlIGZyZXNoIGBjb21wb25lbnRgL2Bncm91cHNgIGlucHV0cyB3aXRob3V0IHJlLXJ1bm5pbmdcbiAgLy8gbmdPbkluaXQuIFJlYnVpbGQgdGhlIGhlYWRlciBjb25maWcgc28gdGhlIGlubGluZSBjb21wb25lbnQtZmlsdGVyIHN0cmlwXG4gIC8vIHJlZmxlY3RzIHRoZSBuZXcgZmlsdGVyczsgdGhlIHRlbXBsYXRlIHJlY3JlYXRlcyB0aGUgZnMtZmlsdGVyIHZpYVxuICAvLyBgZmlsdGVyS2V5YCBzbyBpdCBhY3R1YWxseSByZS1yZWFkcyB0aGlzIGNvbmZpZy5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCBmaWx0ZXJzQ2hhbmdlZCA9IChjaGFuZ2VzLmNvbXBvbmVudCAmJiAhY2hhbmdlcy5jb21wb25lbnQuZmlyc3RDaGFuZ2UpXG4gICAgICB8fCAoY2hhbmdlcy5ncm91cHMgJiYgIWNoYW5nZXMuZ3JvdXBzLmZpcnN0Q2hhbmdlKTtcblxuICAgIGlmIChmaWx0ZXJzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fYnVpbGRGaWx0ZXJDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmx5IG9uY2UgYXQgaW5pdCwgc28gdGhlIGhlYWRlciBpcyBrZXllZCBvbiB0aGVcbiAgLy8gc2V0IG9mIGNvbXBvbmVudC1sZXZlbCBmaWx0ZXIgZ3JvdXBzOiB0aGUgYmxvY2sgaXMgcmVjcmVhdGVkIChyZS1yZWFkaW5nXG4gIC8vIHRoZSByZWJ1aWx0IGNvbmZpZykgd2hlbmV2ZXIgdGhhdCBzZXQgY2hhbmdlcy5cbiAgcHVibGljIGdldCBmaWx0ZXJLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRGaWx0ZXJHcm91cHMubWFwKChncm91cCkgPT4gYCR7Z3JvdXAuaWR9OiR7Z3JvdXAubGV2ZWx9YCkuam9pbignfCcpO1xuICB9XG5cbiAgcHVibGljIGdldCB0cnVuY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhPy50cnVuY2F0ZWQ7XG4gIH1cblxuICAvLyBDb250ZW50IHBhZGRpbmcgKGluY2hlcyDihpIgcHggYXQgOTYvaW47IHRoZSBjYW52YXMgem9vbSBzY2FsZXMgdGhlIHBhZ2UgYXNcbiAgLy8gYSB3aG9sZSkuIEVhY2ggZWRnZSBkZWZhdWx0cyB0byAxLzhcIi5cbiAgcHVibGljIGdldCBib2R5UGFkZGluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLmNvbXBvbmVudC5jb25maWc/LnBhZGRpbmc7XG4gICAgY29uc3QgZWRnZSA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiBgJHsodmFsdWUgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORykgKiBQWF9QRVJfSU5DSH1weGA7XG5cbiAgICByZXR1cm4gYCR7ZWRnZShwYWRkaW5nPy50b3ApfSAke2VkZ2UocGFkZGluZz8ucmlnaHQpfSAke2VkZ2UocGFkZGluZz8uYm90dG9tKX0gJHtlZGdlKHBhZGRpbmc/LmxlZnQpfWA7XG4gIH1cblxuICAvLyBUaGUgY29tcG9uZW50LWxldmVsIGZpbHRlciBncm91cHMgdGhhdCBzaG91bGQgcmVuZGVyIGFzIGFuIGlubGluZSBjb250cm9sXG4gIC8vIHN0cmlwIG9uIFRISVMgY29tcG9uZW50OiBhIGdyb3VwIGlzIGluY2x1ZGVkIHdoZW4gaXQncyBsZXZlbD1jb21wb25lbnQgYW5kXG4gIC8vIGhhcyBhbiBlbmFibGVkLCBzZXNzaW9uLW9uIGZpbHRlciBoZXJlLiBSZXBvcnQtbGV2ZWwgZ3JvdXBzIGxpdmUgaW4gdGhlXG4gIC8vIHRvcCBiYXIgaW5zdGVhZDsgbGlzdHMgcmVuZGVyIHRoZWlyIG93biBmaWx0ZXJzIHRocm91Z2ggRnNMaXN0LCBzbyB0aGV5XG4gIC8vIG5ldmVyIHVzZSB0aGlzIHN0cmlwLlxuICBwdWJsaWMgZ2V0IGNvbXBvbmVudEZpbHRlckdyb3VwcygpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnIHx8ICF0aGlzLmdyb3Vwcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5jb21wb25lbnQuZmlsdGVycyA/PyBbXSkge1xuICAgICAgaWYgKCFmaWx0ZXIuZW5hYmxlZCB8fCB0aGlzLl9maWx0ZXJTdGF0ZS5pc0ZpbHRlckRpc2FibGVkKGZpbHRlci5pZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG4gICAgICBpZiAoZ3JvdXAgJiYgKGdyb3VwLmxldmVsID09PSAnY29tcG9uZW50JyB8fCBncm91cC5sZXZlbCA9PT0gJ2JvdGgnKSkge1xuICAgICAgICBncm91cElkcy5hZGQoZ3JvdXAuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbLi4uZ3JvdXBJZHNdLm1hcCgoaWQpID0+IHRoaXMuZ3JvdXBzLmdldChpZCkpLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5TZXR0aW5ncy5lbWl0KHRoaXMuY29tcG9uZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRDc3YoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQodGhpcy5jb21wb25lbnQpO1xuXG4gICAgdGhpcy5fcHJvY2Vzcy5kb3dubG9hZChcbiAgICAgIGBFeHBvcnRpbmcgJHt0aGlzLmNvbXBvbmVudC50aXRsZSA/PyAnY29tcG9uZW50J31gLFxuICAgICAgdGhpcy5fcmVwb3J0RGF0YS5leHBvcnRDb21wb25lbnQodGhpcy5yZXBvcnRJZCwgdGhpcy5jb21wb25lbnQuaWQsIGZpbHRlcnMpLFxuICAgICk7XG4gIH1cblxuICAvLyBBbnkgaW50ZXJhY3Rpb24gaW5zaWRlIGEgY29tcG9uZW50IG11c3QgbmV2ZXIgc3RhcnQgYSBjYW52YXMgcGFuICh0aGVcbiAgLy8gem9vbS1wYW4gaG9zdCBsaXN0ZW5zIGZvciBtb3VzZWRvd24vdG91Y2hzdGFydCBhdCB0aGUgY29udGFpbmVyIGxldmVsKS5cbiAgcHVibGljIHN0b3BDYW52YXNQYW4oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgb25Db21wb25lbnRQb2ludGVyRG93bihldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZWRpdE1vZGUgJiYgIXRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmVtaXQodGhpcy5jb21wb25lbnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tIGVkaXQtbW9kZSBnZXN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwdWJsaWMgb25EcmFnU3RhcnQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0TW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmVtaXQodGhpcy5jb21wb25lbnQuaWQpO1xuXG4gICAgaWYgKHRoaXMubGF5b3V0ID09PSAnZmxvdycpIHtcbiAgICAgIHRoaXMuX2Zsb3dEcmFnKGV2ZW50KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3RyYWNrKGV2ZW50LCAoZGVsdGFYLCBkZWx0YVkpID0+IHtcbiAgICAgIGxldCB4ID0gTWF0aC5tYXgoMCwgdGhpcy5fb3JpZ2luLnggKyB0aGlzLl9pbmNoZXMoZGVsdGFYKSk7XG4gICAgICBsZXQgeSA9IE1hdGgubWF4KDAsIHRoaXMuX29yaWdpbi55ICsgdGhpcy5faW5jaGVzKGRlbHRhWSkpO1xuXG4gICAgICBpZiAodGhpcy5zbmFwcGVyKSB7XG4gICAgICAgICh7IHgsIHkgfSA9IHRoaXMuc25hcHBlci5zbmFwTW92ZSh0aGlzLmNvbXBvbmVudCwgeCwgeSkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbXBvbmVudC54ID0geDtcbiAgICAgIHRoaXMuY29tcG9uZW50LnkgPSB5O1xuICAgICAgdGhpcy5fYXBwbHlHZW9tZXRyeSgpO1xuICAgIH0sICgpID0+IHRoaXMuX2VtaXRHZW9tZXRyeSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZVN0YXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQsIGhhbmRsZTogSGFuZGxlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRNb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuZW1pdCh0aGlzLmNvbXBvbmVudC5pZCk7XG5cbiAgICBpZiAodGhpcy5sYXlvdXQgPT09ICdmbG93Jykge1xuICAgICAgdGhpcy5fZmxvd1Jlc2l6ZShldmVudCwgaGFuZGxlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3RyYWNrKGV2ZW50LCAoZGVsdGFYLCBkZWx0YVkpID0+IHtcbiAgICAgIGNvbnN0IGR4ID0gdGhpcy5faW5jaGVzKGRlbHRhWCk7XG4gICAgICBjb25zdCBkeSA9IHRoaXMuX2luY2hlcyhkZWx0YVkpO1xuICAgICAgbGV0IHsgeCwgeSwgdywgaCB9ID0gdGhpcy5fb3JpZ2luO1xuXG4gICAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCdlJykpIHtcbiAgICAgICAgdyA9IE1hdGgubWF4KE1JTl9XLCB0aGlzLl9vcmlnaW4udyArIGR4KTtcbiAgICAgIH1cbiAgICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ3MnKSkge1xuICAgICAgICBoID0gTWF0aC5tYXgoTUlOX0gsIHRoaXMuX29yaWdpbi5oICsgZHkpO1xuICAgICAgfVxuICAgICAgaWYgKGhhbmRsZS5pbmNsdWRlcygndycpKSB7XG4gICAgICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbihkeCwgdGhpcy5fb3JpZ2luLncgLSBNSU5fVyk7XG4gICAgICAgIHggPSB0aGlzLl9vcmlnaW4ueCArIGNsYW1wZWQ7XG4gICAgICAgIHcgPSB0aGlzLl9vcmlnaW4udyAtIGNsYW1wZWQ7XG4gICAgICB9XG4gICAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCduJykpIHtcbiAgICAgICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWluKGR5LCB0aGlzLl9vcmlnaW4uaCAtIE1JTl9IKTtcbiAgICAgICAgeSA9IHRoaXMuX29yaWdpbi55ICsgY2xhbXBlZDtcbiAgICAgICAgaCA9IHRoaXMuX29yaWdpbi5oIC0gY2xhbXBlZDtcbiAgICAgIH1cblxuICAgICAgbGV0IGdlb21ldHJ5ID0geyB4LCB5LCB3LCBoIH07XG4gICAgICBpZiAodGhpcy5zbmFwcGVyKSB7XG4gICAgICAgIGdlb21ldHJ5ID0gdGhpcy5zbmFwcGVyLnNuYXBSZXNpemUodGhpcy5jb21wb25lbnQsIGdlb21ldHJ5LCBoYW5kbGUpO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuY29tcG9uZW50LCBnZW9tZXRyeSk7XG4gICAgICB0aGlzLl9hcHBseUdlb21ldHJ5KCk7XG4gICAgICB0aGlzLmNoYXJ0Q29tcG9uZW50Py5yZXNpemUoKTtcbiAgICB9LCAoKSA9PiB0aGlzLl9lbWl0R2VvbWV0cnkoKSk7XG4gIH1cblxuICAvLyAoUmUpYnVpbGQgdGhlIGhlYWRlciBmcy1maWx0ZXIgY29uZmlnOiBoZWFkaW5nIHRlbXBsYXRlIHJlbmRlcnMgdGhlIHRpdGxlXG4gIC8vIGFuZCBpdGVtcyBhcmUgdGhpcyBjb21wb25lbnQncyBjb21wb25lbnQtbGV2ZWwgZmlsdGVyIGdyb3Vwcy4gVGhlIGFjdGlvbnNcbiAgLy8gbWVudSAoU2V0dGluZ3MgLyBFeHBvcnQgQ1NWKSBpcyBOT1QgaGVyZSDigJQgaXQncyBhIHN0YW5kYWxvbmUga2ViYWIgZmxvYXRlZFxuICAvLyB0b3AtcmlnaHQgaW4gdGhlIHRlbXBsYXRlLCBzbyBpdHMgYnV0dG9uIGhlaWdodCBubyBsb25nZXIgZHJpdmVzIHRoZSBoZWFkZXJcbiAgLy8gcm93J3MgaGVpZ2h0ICh3aGljaCB3b3VsZCBvdGhlcndpc2UgaW5mbGF0ZSB0aGUgaGVhZGluZyBieSB+NDBweCkuXG4gIHByaXZhdGUgX2J1aWxkRmlsdGVyQ29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyQ29uZmlnID0ge1xuICAgICAgLy8gTmV2ZXIgdG91Y2ggdGhlIFVSTCBvciBwZXJzaXN0IGZpbHRlciBzdGF0ZSDigJQgY29tcG9uZW50IGZpbHRlcnMgYXJlXG4gICAgICAvLyBzZXNzaW9uLW9ubHksIG93bmVkIGJ5IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZS5cbiAgICAgIHF1ZXJ5UGFyYW06IGZhbHNlLFxuICAgICAgcGVyc2lzdDogZmFsc2UsXG4gICAgICBpdGVtczogdGhpcy5jb21wb25lbnRGaWx0ZXJHcm91cHMubWFwKChncm91cCkgPT5cbiAgICAgICAgZmlsdGVySXRlbUZvckdyb3VwKGdyb3VwLCB0aGlzLl9yZXBvcnREYXRhLCB0aGlzLnJlcG9ydElkLCB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cC5pZCkpKSxcbiAgICAgIGNoYW5nZTogKHF1ZXJ5KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyBncm91cElkLCB2YWx1ZSB9IG9mIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5KHF1ZXJ5ID8/IHt9LCB0aGlzLmNvbXBvbmVudEZpbHRlckdyb3VwcykpIHtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRWYWx1ZShncm91cElkLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZsb3c6IG9ubHkgdGhlIGVhc3QgaGFuZGxlIHJlc2l6ZXMgKHdpZHRoICUpLiBIZWlnaHQgaXMgYWx3YXlzIGF1dG8gaW4gZmxvd1xuICAvLyAodGhlIGJveCBmaXRzIGl0cyBjb250ZW50KSwgc28gdGhlcmUncyBubyBzb3V0aCBoYW5kbGUgaGVyZS5cbiAgcHJpdmF0ZSBfZmxvd1Jlc2l6ZShldmVudDogUG9pbnRlckV2ZW50LCBoYW5kbGU6IEhhbmRsZSk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Py5jbGllbnRXaWR0aCB8fCAxO1xuXG4gICAgdGhpcy5fdHJhY2soZXZlbnQsIChkZWx0YVgpID0+IHtcbiAgICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ2UnKSkge1xuICAgICAgICBjb25zdCBkZWx0YVBlcmNlbnQgPSAoZGVsdGFYIC8gdGhpcy56b29tIC8gcGFnZVdpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmF3ID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgxMCwgdGhpcy5fb3JpZ2luLmZsb3dXaWR0aCArIGRlbHRhUGVyY2VudCkpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudC5mbG93V2lkdGggPSB0aGlzLl9zbmFwRmxvd1dpZHRoKHJhdyk7XG4gICAgICAgIHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RoaXMuY29tcG9uZW50LmZsb3dXaWR0aH0lYDtcbiAgICAgIH1cbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLnBvc2l0aW9uQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuY29tcG9uZW50LmlkLFxuICAgICAgICBmbG93V2lkdGg6IHRoaXMuY29tcG9uZW50LmZsb3dXaWR0aCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRmxvdzogZHJhZyBsaWZ0cyB0aGUgY29tcG9uZW50IChnaG9zdCkgYW5kIHRoZSBjYW52YXMgZGVjaWRlcyB0aGUgZHJvcFxuICAvLyBpbmRleCBmcm9tIHRoZSBwb2ludGVyIHBvc2l0aW9uLlxuICBwcml2YXRlIF9mbG93RHJhZyhldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudDtcbiAgICBsZXQgbGFzdENsaWVudFggPSBldmVudC5jbGllbnRYO1xuICAgIGxldCBsYXN0Q2xpZW50WSA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICBob3N0LmNsYXNzTGlzdC5hZGQoJ2Zsb3ctZHJhZ2dpbmcnKTtcblxuICAgIHRoaXMuX3RyYWNrKGV2ZW50LCAoZGVsdGFYLCBkZWx0YVksIGUpID0+IHtcbiAgICAgIGxhc3RDbGllbnRYID0gZS5jbGllbnRYO1xuICAgICAgbGFzdENsaWVudFkgPSBlLmNsaWVudFk7XG4gICAgICBob3N0LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtkZWx0YVggLyB0aGlzLnpvb219cHgsICR7ZGVsdGFZIC8gdGhpcy56b29tfXB4KWA7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgaG9zdC5jbGFzc0xpc3QucmVtb3ZlKCdmbG93LWRyYWdnaW5nJyk7XG4gICAgICBob3N0LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgdGhpcy5mbG93UmVvcmRlci5lbWl0KHtcbiAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuY29tcG9uZW50LmlkLFxuICAgICAgICBjbGllbnRYOiBsYXN0Q2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogbGFzdENsaWVudFksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29yaWdpbiA9IHsgeDogMCwgeTogMCwgdzogMCwgaDogMCwgZmxvd1dpZHRoOiA1MCB9O1xuXG4gIC8vIFBvaW50ZXItY2FwdHVyZSBnZXN0dXJlIGxvb3A6IHJ1bnMgb3V0c2lkZSBBbmd1bGFyLCByZXBhaW50cyBpbXBlcmF0aXZlbHksXG4gIC8vIGFuZCBmaW5pc2hlcyBiYWNrIGluc2lkZSBBbmd1bGFyIChzZWxlY3Rpb24vcGVyc2lzdGVuY2UpLlxuICBwcml2YXRlIF90cmFjayhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIG9uTW92ZTogKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlciwgZTogUG9pbnRlckV2ZW50KSA9PiB2b2lkLFxuICAgIG9uRW5kOiAoKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgaGFuZGxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGhhbmRsZS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuXG4gICAgdGhpcy5fb3JpZ2luID0ge1xuICAgICAgeDogdGhpcy5jb21wb25lbnQueCxcbiAgICAgIHk6IHRoaXMuY29tcG9uZW50LnksXG4gICAgICB3OiB0aGlzLmNvbXBvbmVudC53LFxuICAgICAgaDogdGhpcy5jb21wb25lbnQuaCxcbiAgICAgIGZsb3dXaWR0aDogdGhpcy5jb21wb25lbnQuZmxvd1dpZHRoID8/IDUwLFxuICAgIH07XG4gICAgY29uc3Qgc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICBjb25zdCBzdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4gb25Nb3ZlKGUuY2xpZW50WCAtIHN0YXJ0WCwgZS5jbGllbnRZIC0gc3RhcnRZLCBlKTtcbiAgICAgIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcblxuICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zbmFwcGVyPy5jbGVhcigpO1xuICAgICAgICAgIG9uRW5kKCk7XG4gICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXRHZW9tZXRyeSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudC54ID0gdGhpcy5fcm91bmQodGhpcy5jb21wb25lbnQueCk7XG4gICAgdGhpcy5jb21wb25lbnQueSA9IHRoaXMuX3JvdW5kKHRoaXMuY29tcG9uZW50LnkpO1xuICAgIHRoaXMuY29tcG9uZW50LncgPSB0aGlzLl9yb3VuZChNYXRoLm1heChNSU5fVywgdGhpcy5jb21wb25lbnQudykpO1xuICAgIHRoaXMuY29tcG9uZW50LmggPSB0aGlzLl9yb3VuZChNYXRoLm1heChNSU5fSCwgdGhpcy5jb21wb25lbnQuaCkpO1xuICAgIHRoaXMuX2FwcGx5R2VvbWV0cnkoKTtcbiAgICB0aGlzLmNoYXJ0Q29tcG9uZW50Py5yZXNpemUoKTtcblxuICAgIHRoaXMucG9zaXRpb25DaGFuZ2VkLmVtaXQoe1xuICAgICAgY29tcG9uZW50SWQ6IHRoaXMuY29tcG9uZW50LmlkLFxuICAgICAgeDogdGhpcy5jb21wb25lbnQueCxcbiAgICAgIHk6IHRoaXMuY29tcG9uZW50LnksXG4gICAgICB3OiB0aGlzLmNvbXBvbmVudC53LFxuICAgICAgaDogdGhpcy5jb21wb25lbnQuaCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgY2hhcnQgb24gYSB0aW1lIHgtYXhpcyDigJQgdGhlIG9ubHkgY29tcG9uZW50IHRoZSBydW50aW1lIEZyZXF1ZW5jeSBjb250cm9sXG4gIC8vIGFwcGxpZXMgdG8uXG4gIHByaXZhdGUgZ2V0IF9pc1RpbWVTZXJpZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgdGhpcy5jb21wb25lbnQuY29uZmlnPy54QXhpcz8ua2luZCA9PT0gJ3RpbWUnO1xuICB9XG5cbiAgLy8gQXV0byBoZWlnaHQgKGJveCBmaXRzIGl0cyBjb250ZW50KSB2cyBmaXhlZCAodXNlIGBoYCBleGFjdGx5KS4gRGVyaXZlZCBmcm9tXG4gIC8vIHR5cGUsIHNlcnZlci1zaWRlOiBLUEkgdGlsZXMgYXJlIGF1dG87IGNoYXJ0cyBhbmQgbGlzdHMgYXJlIGZpeGVkIOKAlCBjaGFydHNcbiAgLy8gZml0IHRoZSBib3ggYW5kIG5ldmVyIG92ZXJmbG93LCBsaXN0cyBzY3JvbGwgaW5zaWRlIGl0LlxuICBwcml2YXRlIGdldCBfaGVpZ2h0QXV0bygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuYXV0b0hlaWdodCAhPT0gZmFsc2U7XG4gIH1cblxuICAvLyBEcml2ZXMgdGhlIGF1dG8tb25seSBDU1MgZGVmYXVsdCAoZW1wdHktc3RhdGUgYmFzZWxpbmUpIHNvIGl0IG5ldmVyIGFwcGxpZXNcbiAgLy8gdG8gYSBmaXhlZC1oZWlnaHQgY29tcG9uZW50LlxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhlaWdodC1hdXRvJylcbiAgcHVibGljIGdldCBoZWlnaHRBdXRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oZWlnaHRBdXRvO1xuICB9XG5cbiAgLy8gU2NyZWVuIHBpeGVscyDihpIgaW5jaGVzIGF0IHRoZSBjdXJyZW50IHpvb20uXG4gIHByaXZhdGUgX2luY2hlcyhwaXhlbHM6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHBpeGVscyAvICh0aGlzLnpvb20gKiBQWF9QRVJfSU5DSCk7XG4gIH1cblxuICAvLyBDbGVhbiBwZXJzaXN0ZWQgdmFsdWVzOiBodW5kcmVkdGhzIG9mIGFuIGluY2guXG4gIHByaXZhdGUgX3JvdW5kKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogMTAwKSAvIDEwMDtcbiAgfVxuXG4gIHByaXZhdGUgX3NuYXBGbG93V2lkdGgodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgZm9yIChjb25zdCBzdG9wIG9mIEZMT1dfV0lEVEhfU1RPUFMpIHtcbiAgICAgIGlmIChNYXRoLmFicyh2YWx1ZSAtIHN0b3ApIDwgMykge1xuICAgICAgICByZXR1cm4gc3RvcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwKSAvIDEwO1xuICB9XG5cbiAgLy8gVGhlIGNhbnZhcyBwb3NpdGlvbnMgdGhlIGhvc3QgdmlhIFtzdHlsZV07IG1pZC1nZXN0dXJlIHdlIHNldCBpdCBkaXJlY3RseVxuICAvLyBzbyBPblB1c2ggbmV2ZXIgcmUtcmVuZGVycyBpbiB0aGUgbW92ZSBsb29wLlxuICBwcml2YXRlIF9hcHBseUdlb21ldHJ5KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5faG9zdC5uYXRpdmVFbGVtZW50LnN0eWxlO1xuICAgIHN0eWxlLmxlZnQgPSBgJHt0aGlzLmNvbXBvbmVudC54ICogUFhfUEVSX0lOQ0h9cHhgO1xuICAgIHN0eWxlLnRvcCA9IGAke3RoaXMuY29tcG9uZW50LnkgKiBQWF9QRVJfSU5DSH1weGA7XG4gICAgc3R5bGUud2lkdGggPSBgJHt0aGlzLmNvbXBvbmVudC53ICogUFhfUEVSX0lOQ0h9cHhgO1xuXG4gICAgLy8gQXV0byAoa3BpKTogbm8gZml4ZWQgaGVpZ2h0IOKAlCB0aGUgYm94IHNpemVzIHRvIGl0cyBjb250ZW50LiBGaXhlZFxuICAgIC8vIChjaGFydC9saXN0KTogYGhgIGlzIHRoZSBleGFjdCBoZWlnaHQuIE1pcnJvcnMgdGhlIGNhbnZhcyBbc3R5bGVdIGJpbmRpbmdcbiAgICAvLyBzbyB0aGUgbWlkLWdlc3R1cmUgcGFpbnQgbWF0Y2hlcyB0aGUgcG9zdC1nZXN0dXJlIHJlLXJlbmRlci5cbiAgICBpZiAodGhpcy5faGVpZ2h0QXV0bykge1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlLmhlaWdodCA9IGAke3RoaXMuY29tcG9uZW50LmggKiBQWF9QRVJfSU5DSH1weGA7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0gZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBfbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQodGhpcy5jb21wb25lbnQpO1xuICAgIC8vIFRpbWUtc2VyaWVzIGNoYXJ0cyBjYXJyeSB0aGUgcnVudGltZSBGcmVxdWVuY3kgb3ZlcnJpZGUgKGlmIGNob3Nlbikgc28gdGhlXG4gICAgLy8gYmFja2VuZCByZS1idWNrZXRzOyBldmVyeXRoaW5nIGVsc2Ugc2VuZHMgbm8gaW50ZXJhY3Rpb24gc3RhdGUgaGVyZS5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2lzVGltZVNlcmllcyAmJiB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKVxuICAgICAgPyB7IGZyZXF1ZW5jeTogdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkgfVxuICAgICAgOiB7fTtcblxuICAgIHRoaXMuX3JlcG9ydERhdGEuY29tcG9uZW50RGF0YSh0aGlzLnJlcG9ydElkLCB0aGlzLmNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IENvbXBvbmVudERhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yPy5lcnJvcj8ubWVzc2FnZSA/PyBlcnJvcj8ubWVzc2FnZSA/PyAnRmFpbGVkIHRvIGxvYWQgZGF0YSc7XG4gICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwiY29tcG9uZW50LWJveFwiXG4gICAgW2NsYXNzLmVkaXRpbmddPVwiZWRpdE1vZGVcIlxuICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZFwiXG4gICAgW3N0eWxlLnBhZGRpbmddPVwiYm9keVBhZGRpbmdcIlxuICAgIChwb2ludGVyZG93bik9XCJvbkNvbXBvbmVudFBvaW50ZXJEb3duKCRldmVudClcIlxuICAgIChtb3VzZWRvd24pPVwic3RvcENhbnZhc1BhbigkZXZlbnQpXCJcbiAgICAodG91Y2hzdGFydCk9XCJzdG9wQ2FudmFzUGFuKCRldmVudClcIj5cbiAgPCEtLSBUaGUgaGVhZGVyIGlzIGFuIGZzLWZpbHRlcjogaGVhZGluZyB0ZW1wbGF0ZSA9IHRpdGxlIChhbmQgdGhlIGVkaXQtbW9kZVxuICAgICAgIGRyYWcgaGFuZGxlKSwgYWN0aW9ucyA9IHRoZSBtZW51LCBpdGVtcyA9IGNvbXBvbmVudC1sZXZlbCBmaWx0ZXJzLlxuICAgICAgIExpc3RzIGNhcnJ5IG5vIGl0ZW1zIGhlcmUg4oCUIHRoZXkgZmlsdGVyIHRocm91Z2ggRnNMaXN0LiBmcy1maWx0ZXIgcmVhZHNcbiAgICAgICBpdHMgY29uZmlnIG9uY2UsIHNvIHRoZSBibG9jayBpcyBrZXllZCBvbiB0aGUgY29tcG9uZW50LWZpbHRlciBzZXQgdG8gYmVcbiAgICAgICByZWNyZWF0ZWQgd2hlbiBpdCBjaGFuZ2VzLiAtLT5cbiAgQGZvciAoa2V5IG9mIFtmaWx0ZXJLZXldOyB0cmFjayBrZXkpIHtcbiAgICA8ZnMtZmlsdGVyXG4gICAgICAgIGNsYXNzPVwiY29tcG9uZW50LWZpbHRlclwiXG4gICAgICAgIFtjb25maWddPVwiZmlsdGVyQ29uZmlnXCI+XG4gICAgICA8bmctdGVtcGxhdGUgZnNGaWx0ZXJIZWFkaW5nPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvbXBvbmVudC10aXRsZVwiXG4gICAgICAgICAgICAocG9pbnRlcmRvd24pPVwib25EcmFnU3RhcnQoJGV2ZW50KVwiPlxuICAgICAgICAgIHt7IGNvbXBvbmVudC50aXRsZSB9fVxuICAgICAgICAgIEBpZiAodHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlZC1pY29uXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiU2hvd2luZyBhIHRydW5jYXRlZCByZXN1bHQg4oCUIHJlZmluZSB0aGUgZmlsdGVycyB0byBzZWUgZXZlcnl0aGluZy5cIj5cbiAgICAgICAgICAgICAgd2FybmluZ19hbWJlclxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2ZzLWZpbHRlcj5cbiAgfVxuICA8IS0tIFRoZSBhY3Rpb25zIG1lbnUgaXMgZmxvYXRlZCB0b3AtcmlnaHQgKGFic29sdXRlKSByYXRoZXIgdGhhbiBsaXZpbmcgaW5cbiAgICAgICBmcy1maWx0ZXIncyBhY3Rpb25zIHNsb3QsIHNvIGl0cyB+NDBweCBidXR0b24gaGVpZ2h0IG5vIGxvbmdlciBkcml2ZXMgdGhlXG4gICAgICAgaGVhZGVyIHJvdydzIGhlaWdodC4gSXQgb3ZlcmxheXMgdGhlIGJveCBjb3JuZXI7IHRoZSBoZWFkaW5nIHJlc2VydmVzXG4gICAgICAgcmlnaHQgcGFkZGluZyBzbyBhIGxvbmcgdGl0bGUgZWxsaXBzaXNlcyBiZWZvcmUgaXQuIC0tPlxuICA8YnV0dG9uXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNsYXNzPVwiY29tcG9uZW50LW1lbnVcIlxuICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIlxuICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAobW91c2Vkb3duKT1cInN0b3BDYW52YXNQYW4oJGV2ZW50KVwiPlxuICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic2V0dGluZ3MoKVwiPlxuICAgICAgPG1hdC1pY29uPnR1bmU8L21hdC1pY29uPlxuICAgICAgPHNwYW4+U2V0dGluZ3M8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJleHBvcnRDc3YoKVwiPlxuICAgICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuPkV4cG9ydCBDU1Y8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LW1lbnU+XG4gIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtYm9keVwiPlxuICAgIEBpZiAoY29tcG9uZW50LnR5cGUgPT09ICdsaXN0Jykge1xuICAgICAgPGFwcC1yZXBvcnQtY29tcG9uZW50LWxpc3RcbiAgICAgICAgW3JlcG9ydElkXT1cInJlcG9ydElkXCJcbiAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxuICAgICAgICBbZ3JvdXBzXT1cImdyb3Vwc1wiPlxuICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1saXN0PlxuICAgIH0gQGVsc2UgaWYgKGxvYWRpbmcpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc3RhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc2hpbW1lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSBpZiAoZXJyb3IpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc3RhdGUgZXJyb3JcIj5cbiAgICAgICAge3sgZXJyb3IgfX1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2UgaWYgKCFkYXRhPy5yb3dzPy5sZW5ndGgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc3RhdGVcIj5cbiAgICAgICAgTm8gZGF0YVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSBpZiAoY29tcG9uZW50LnR5cGUgPT09ICdrcGknKSB7XG4gICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnQta3BpXG4gICAgICAgIFtjb21wb25lbnRdPVwiY29tcG9uZW50XCJcbiAgICAgICAgW2RhdGFdPVwiZGF0YVwiPlxuICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1rcGk+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnQtY2hhcnRcbiAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxuICAgICAgICBbZGF0YV09XCJkYXRhXCI+XG4gICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50LWNoYXJ0PlxuICAgIH1cbiAgICA8IS0tIEluIGVkaXQgbW9kZSBhIHRyYW5zcGFyZW50IHZlaWwgb3ZlciB0aGUgYm9keSBtYWtlcyB0aGUgV0hPTEVcbiAgICAgICAgIGNvbXBvbmVudCBkcmFnZ2FibGUgKGluZHVzdHJ5IHN0YW5kYXJkOiB5b3UgZ3JhYiB0aGUgb2JqZWN0LCBub3QganVzdFxuICAgICAgICAgaXRzIHRpdGxlIGJhcikgYW5kIGtlZXBzIGlubmVyIHdpZGdldHMgZnJvbSBzd2FsbG93aW5nIHRoZSBnZXN0dXJlLiAtLT5cbiAgICBAaWYgKGVkaXRNb2RlKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHJhZy12ZWlsXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uRHJhZ1N0YXJ0KCRldmVudClcIj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbjwhLS0gSGFuZGxlcyBsaXZlIE9VVFNJREUgdGhlIGNsaXBwZWQgYm94IHNvIHRoZXkgc3RyYWRkbGUgaXRzIGVkZ2VzLiAtLT5cbkBpZiAoZWRpdE1vZGUgJiYgc2VsZWN0ZWQpIHtcbiAgQGlmIChsYXlvdXQgPT09ICdmcmVlZm9ybScpIHtcbiAgICBAZm9yIChoYW5kbGUgb2YgcmVzaXplSGFuZGxlczsgdHJhY2sgaGFuZGxlKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaGFuZGxlIGhhbmRsZS17eyBoYW5kbGUgfX1cIlxuICAgICAgICAobW91c2Vkb3duKT1cInN0b3BDYW52YXNQYW4oJGV2ZW50KVwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudCwgaGFuZGxlKVwiPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9IEBlbHNlIHtcbiAgICA8IS0tIEZsb3cgaGVpZ2h0IGlzIGFsd2F5cyBhdXRvICh0aGUgYm94IGZpdHMgaXRzIGNvbnRlbnQpLCBzbyBvbmx5IHRoZVxuICAgICAgICAgZWFzdCBoYW5kbGUgKHdpZHRoICUpIGlzIG9mZmVyZWQgaGVyZS4gLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJoYW5kbGUgaGFuZGxlLWVcIlxuICAgICAgbWF0VG9vbHRpcD1cIldpZHRoICglIG9mIHBhZ2UpXCJcbiAgICAgIChtb3VzZWRvd24pPVwic3RvcENhbnZhc1BhbigkZXZlbnQpXCJcbiAgICAgIChwb2ludGVyZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudCwgJ2UnKVwiPlxuICAgIDwvZGl2PlxuICB9XG59Il19
453
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNvbXBvbmVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9yZXBvcnQtY29tcG9uZW50L3JlcG9ydC1jb21wb25lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvcmVwb3J0LWNvbXBvbmVudC9yZXBvcnQtY29tcG9uZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFDN0UsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFxQixNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLEdBQ3RHLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQWdCLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPcEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9B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IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBOZ1pvbmUsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5pbXBvcnQgeyBNYXRJY29uQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRmlsdGVyQ29uZmlnLCBGc0ZpbHRlck1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbHRlcic7XG5pbXBvcnQgeyBGc1Byb2Nlc3MgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcblxuaW1wb3J0IHsgU3ViamVjdCwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgUmVwb3J0Q29tcG9uZW50IGFzIFJlcG9ydENvbXBvbmVudE1vZGVsLFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0TGF5b3V0LFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgREVGQVVMVF9DT01QT05FTlRfUEFERElORyB9IGZyb20gJy4uLy4uL2xheW91dCc7XG5pbXBvcnQgeyBmaWx0ZXJJdGVtRm9yR3JvdXAsIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5IH0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50Q2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtY2hhcnQvY29tcG9uZW50LWNoYXJ0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRLcGlDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQta3BpL2NvbXBvbmVudC1rcGkuY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudExpc3RDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbGlzdC9jb21wb25lbnQtbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2FudmFzU25hcHBlciwgUFhfUEVSX0lOQ0ggfSBmcm9tICcuLi9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50JztcblxuXG4vLyBGcmVlZm9ybSByZXNpemUgaGFuZGxlcywgbmFtZWQgYnkgY29tcGFzcyBkaXJlY3Rpb24uXG5jb25zdCBIQU5ETEVTID0gWydudycsICduJywgJ25lJywgJ2UnLCAnc2UnLCAncycsICdzdycsICd3J10gYXMgY29uc3Q7XG50eXBlIEhhbmRsZSA9IHR5cGVvZiBIQU5ETEVTW251bWJlcl07XG5cbi8vIEZsb3cgd2lkdGggc25hcHMgdG8gdGhlIHVzZWZ1bCBmcmFjdGlvbnMgb2YgYSBwYWdlIHJvdy5cbmNvbnN0IEZMT1dfV0lEVEhfU1RPUFMgPSBbMjUsIDMzLjMzLCA1MCwgNjYuNjcsIDc1LCAxMDBdO1xuXG5jb25zdCBNSU5fVyA9IDAuNjsgLy8gaW5jaGVzXG5jb25zdCBNSU5fSCA9IDAuNDsgLy8gaW5jaGVzXG5cbi8vIE9uZSBjb21wb25lbnQgb24gdGhlIHBhZ2U6IHRpdGxlIGJhciwgdGhlIHR5cGUtc3BlY2lmaWMgYm9keSAoY2hhcnQgfCBsaXN0XG4vLyB8IGtwaSksIGEgbWVudSAoc2V0dGluZ3MsIGZpbHRlciB0b2dnbGVzLCBleHBvcnQpIOKAlCBhbmQgdGhlIGVkaXRpbmdcbi8vIGludGVyYWN0aW9uczpcbi8vXG4vLyAgIEZyZWVmb3JtOiBjbGljayBzZWxlY3RzOyB0aGUgc2VsZWN0aW9uIGZyYW1lIHNob3dzIDggcmVzaXplIGhhbmRsZXM7XG4vLyAgIGRyYWdnaW5nIHRoZSBib2R5IG1vdmVzIHdpdGggc21hcnQgYWxpZ25tZW50IGd1aWRlcyAodmlhIHRoZSBjYW52YXNcbi8vICAgc25hcHBlcik7IGV2ZXJ5dGhpbmcgd29ya3MgYXQgYW55IHpvb20gKHBpeGVsIGRlbHRhcyDDtyB6b29twrc5NiDihpIgaW5jaGVzKS5cbi8vXG4vLyAgIEZsb3c6IGRyYWdnaW5nIHJlb3JkZXJzIChkcm9wIHBvc2l0aW9uIGRlY2lkZWQgYnkgdGhlIGNhbnZhcyk7IHRoZSBFXG4vLyAgIGhhbmRsZSByZXNpemVzIGZsb3dXaWR0aCAlIChzbmFwcGluZyB0byAyNS8zMy81MC82Ni83NS8xMDApLCB0aGUgUyBoYW5kbGVcbi8vICAgcmVzaXplcyBoZWlnaHQgaW4gaW5jaGVzLlxuLy9cbi8vIENoYXJ0cyBhbmQgS1BJcyBmZXRjaCB0aGVpciBvd24gZGF0YSBoZXJlOyBsaXN0cyBmZXRjaCBpbnNpZGVcbi8vIENvbXBvbmVudExpc3RDb21wb25lbnQgdGhyb3VnaCBGc0xpc3QgcGFnaW5nLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVwb3J0LWNvbXBvbmVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlcG9ydC1jb21wb25lbnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRJY29uLFxuICAgIE1hdEljb25CdXR0b24sXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgICBNYXRUb29sdGlwLFxuICAgIEZzRmlsdGVyTW9kdWxlLFxuICAgIENvbXBvbmVudENoYXJ0Q29tcG9uZW50LFxuICAgIENvbXBvbmVudEtwaUNvbXBvbmVudCxcbiAgICBDb21wb25lbnRMaXN0Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRDb21wb25lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcHVibGljIHJlcG9ydElkOiBudW1iZXI7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudE1vZGVsO1xuICBASW5wdXQoKSBwdWJsaWMgZ3JvdXBzOiBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD47XG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0TW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgbGF5b3V0OiBSZXBvcnRMYXlvdXQgPSAnZnJlZWZvcm0nO1xuICAvLyBUaGUgY2FudmFzIHpvb20g4oCUIGNvbnZlcnRzIG9uLXNjcmVlbiBwaXhlbCBkZWx0YXMgYmFjayB0byBpbmNoZXMuXG4gIEBJbnB1dCgpIHB1YmxpYyB6b29tID0gMTtcbiAgQElucHV0KCkgcHVibGljIHNuYXBwZXI6IENhbnZhc1NuYXBwZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RDb21wb25lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBwb3NpdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBmbG93UmVvcmRlciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb21wb25lbnRJZDogbnVtYmVyOyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9wZW5TZXR0aW5ncyA9IG5ldyBFdmVudEVtaXR0ZXI8UmVwb3J0Q29tcG9uZW50TW9kZWw+KCk7XG5cbiAgQFZpZXdDaGlsZChDb21wb25lbnRDaGFydENvbXBvbmVudClcbiAgcHVibGljIGNoYXJ0Q29tcG9uZW50OiBDb21wb25lbnRDaGFydENvbXBvbmVudDtcblxuICAvLyBGcmVlZm9ybSByZXNpemUgaGFuZGxlcyBieSB0eXBlOiBhIGZpeGVkLWhlaWdodCBjb21wb25lbnQgKGNoYXJ0L2xpc3QpXG4gIC8vIGdldHMgYWxsIGVpZ2h0IChyZXNpemUgd2lkdGggQU5EIGhlaWdodCk7IGFuIGF1dG8taGVpZ2h0IG9uZSAoa3BpKSBnZXRzXG4gIC8vIG9ubHkgdGhlIHNpZGUgaGFuZGxlcyBzaW5jZSBpdHMgaGVpZ2h0IGZpdHMgaXRzIGNvbnRlbnQgYW5kIGNhbid0IGJlIHNldC5cbiAgcHVibGljIGdldCByZXNpemVIYW5kbGVzKCk6IHJlYWRvbmx5IEhhbmRsZVtdIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0QXV0byA/IFsnZScsICd3J10gOiBIQU5ETEVTO1xuICB9XG5cbiAgLy8gVGhlIGNvbXBvbmVudCdzIGhlYWRlciBJUyBhbiBmcy1maWx0ZXI6IGhlYWRpbmcgdGVtcGxhdGUgPSBpdHMgdGl0bGUgKGFuZFxuICAvLyB0aGUgZHJhZyBoYW5kbGUpLCBhY3Rpb25zID0gdGhlIFNldHRpbmdzIC8gZmlsdGVyLXRvZ2dsZXMgLyBFeHBvcnQgbWVudSxcbiAgLy8gaXRlbXMgPSBpdHMgY29tcG9uZW50LWxldmVsIGZpbHRlciBncm91cHMgKG5vbmUgZm9yIGxpc3RzIOKAlCB0aGV5IGZpbHRlclxuICAvLyB0aHJvdWdoIEZzTGlzdCkuIFJlYnVpbHQgd2hlbiBhIGZpbHRlciB0b2dnbGUgY2hhbmdlcyB3aGljaCBncm91cHMgc2hvdy5cbiAgcHVibGljIGZpbHRlckNvbmZpZyE6IEZpbHRlckNvbmZpZztcblxuICBwdWJsaWMgZGF0YTogQ29tcG9uZW50RGF0YSB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgZXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX3JlZnJlc2gkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvY2VzcyA9IGluamVjdChGc1Byb2Nlc3MpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF9jZFJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgX3pvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSBfaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2J1aWxkRmlsdGVyQ29uZmlnKCk7XG5cbiAgICBpZiAodGhpcy5jb21wb25lbnQudHlwZSAhPT0gJ2xpc3QnKSB7XG4gICAgICAvLyBEZWJvdW5jZWQgc28gYSByYXBpZCBmaWx0ZXIgc3dlZXAgZmlyZXMgb25lIHF1ZXJ5LCBub3Qgb25lIHBlciBjaGFuZ2UuXG4gICAgICB0aGlzLl9yZWZyZXNoJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9sb2FkKCkpO1xuXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yKHRoaXMuY29tcG9uZW50KVxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fcmVmcmVzaCQubmV4dCgpKTtcblxuICAgICAgLy8gQSBGcmVxdWVuY3kgY2hhbmdlIHJlLWJ1Y2tldHMgZXZlcnkgdGltZS1zZXJpZXMgY2hhcnQ7IGl0IGlzbid0IHNjb3BlZFxuICAgICAgLy8gdG8gYSBmaWx0ZXIgZ3JvdXAsIHNvIGl0IHJpZGVzIGl0cyBvd24gc3RyZWFtLlxuICAgICAgaWYgKHRoaXMuX2lzVGltZVNlcmllcykge1xuICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3lDaGFuZ2VzKClcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9yZWZyZXNoJC5uZXh0KCkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9sb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCByZWxvYWRzIChlLmcuIGFmdGVyIHRoZSBzZXR0aW5ncyBkaWFsb2cgYWRkcy9tb3ZlcyBhIGZpbHRlcilcbiAgLy8gaGFuZCB0aGlzIGluc3RhbmNlIGZyZXNoIGBjb21wb25lbnRgL2Bncm91cHNgIGlucHV0cyB3aXRob3V0IHJlLXJ1bm5pbmdcbiAgLy8gbmdPbkluaXQuIFJlYnVpbGQgdGhlIGhlYWRlciBjb25maWcgc28gdGhlIGlubGluZSBjb21wb25lbnQtZmlsdGVyIHN0cmlwXG4gIC8vIHJlZmxlY3RzIHRoZSBuZXcgZmlsdGVyczsgdGhlIHRlbXBsYXRlIHJlY3JlYXRlcyB0aGUgZnMtZmlsdGVyIHZpYVxuICAvLyBgZmlsdGVyS2V5YCBzbyBpdCBhY3R1YWxseSByZS1yZWFkcyB0aGlzIGNvbmZpZy5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCBmaWx0ZXJzQ2hhbmdlZCA9IChjaGFuZ2VzLmNvbXBvbmVudCAmJiAhY2hhbmdlcy5jb21wb25lbnQuZmlyc3RDaGFuZ2UpXG4gICAgICB8fCAoY2hhbmdlcy5ncm91cHMgJiYgIWNoYW5nZXMuZ3JvdXBzLmZpcnN0Q2hhbmdlKTtcblxuICAgIGlmIChmaWx0ZXJzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fYnVpbGRGaWx0ZXJDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmx5IG9uY2UgYXQgaW5pdCwgc28gdGhlIGhlYWRlciBpcyBrZXllZCBvbiB0aGVcbiAgLy8gc2V0IG9mIGNvbXBvbmVudC1sZXZlbCBmaWx0ZXIgZ3JvdXBzOiB0aGUgYmxvY2sgaXMgcmVjcmVhdGVkIChyZS1yZWFkaW5nXG4gIC8vIHRoZSByZWJ1aWx0IGNvbmZpZykgd2hlbmV2ZXIgdGhhdCBzZXQgY2hhbmdlcy5cbiAgcHVibGljIGdldCBmaWx0ZXJLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRGaWx0ZXJHcm91cHMubWFwKChncm91cCkgPT4gYCR7Z3JvdXAuaWR9OiR7Z3JvdXAubGV2ZWx9YCkuam9pbignfCcpO1xuICB9XG5cbiAgcHVibGljIGdldCB0cnVuY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhPy50cnVuY2F0ZWQ7XG4gIH1cblxuICAvLyBDb250ZW50IHBhZGRpbmcgKGluY2hlcyDihpIgcHggYXQgOTYvaW47IHRoZSBjYW52YXMgem9vbSBzY2FsZXMgdGhlIHBhZ2UgYXNcbiAgLy8gYSB3aG9sZSkuIEVhY2ggZWRnZSBkZWZhdWx0cyB0byAxLzhcIi5cbiAgcHVibGljIGdldCBib2R5UGFkZGluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLmNvbXBvbmVudC5jb25maWc/LnBhZGRpbmc7XG4gICAgY29uc3QgZWRnZSA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiBgJHsodmFsdWUgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORykgKiBQWF9QRVJfSU5DSH1weGA7XG5cbiAgICByZXR1cm4gYCR7ZWRnZShwYWRkaW5nPy50b3ApfSAke2VkZ2UocGFkZGluZz8ucmlnaHQpfSAke2VkZ2UocGFkZGluZz8uYm90dG9tKX0gJHtlZGdlKHBhZGRpbmc/LmxlZnQpfWA7XG4gIH1cblxuICAvLyBUaGUgY29tcG9uZW50LWxldmVsIGZpbHRlciBncm91cHMgdGhhdCBzaG91bGQgcmVuZGVyIGFzIGFuIGlubGluZSBjb250cm9sXG4gIC8vIHN0cmlwIG9uIFRISVMgY29tcG9uZW50OiBhIGdyb3VwIGlzIGluY2x1ZGVkIHdoZW4gaXQncyBsZXZlbD1jb21wb25lbnQgYW5kXG4gIC8vIGhhcyBhbiBlbmFibGVkLCBzZXNzaW9uLW9uIGZpbHRlciBoZXJlLiBSZXBvcnQtbGV2ZWwgZ3JvdXBzIGxpdmUgaW4gdGhlXG4gIC8vIHRvcCBiYXIgaW5zdGVhZDsgbGlzdHMgcmVuZGVyIHRoZWlyIG93biBmaWx0ZXJzIHRocm91Z2ggRnNMaXN0LCBzbyB0aGV5XG4gIC8vIG5ldmVyIHVzZSB0aGlzIHN0cmlwLlxuICBwdWJsaWMgZ2V0IGNvbXBvbmVudEZpbHRlckdyb3VwcygpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnIHx8ICF0aGlzLmdyb3Vwcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5jb21wb25lbnQuZmlsdGVycyA/PyBbXSkge1xuICAgICAgaWYgKCFmaWx0ZXIuZW5hYmxlZCB8fCB0aGlzLl9maWx0ZXJTdGF0ZS5pc0ZpbHRlckRpc2FibGVkKGZpbHRlci5pZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG4gICAgICBpZiAoZ3JvdXAgJiYgKGdyb3VwLmxldmVsID09PSAnY29tcG9uZW50JyB8fCBncm91cC5sZXZlbCA9PT0gJ2JvdGgnKSkge1xuICAgICAgICBncm91cElkcy5hZGQoZ3JvdXAuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbLi4uZ3JvdXBJZHNdLm1hcCgoaWQpID0+IHRoaXMuZ3JvdXBzLmdldChpZCkpLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5TZXR0aW5ncy5lbWl0KHRoaXMuY29tcG9uZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRDc3YoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQodGhpcy5jb21wb25lbnQpO1xuXG4gICAgdGhpcy5fcHJvY2Vzcy5kb3dubG9hZChcbiAgICAgIGBFeHBvcnRpbmcgJHt0aGlzLmNvbXBvbmVudC50aXRsZSA/PyAnY29tcG9uZW50J31gLFxuICAgICAgdGhpcy5fcmVwb3J0RGF0YS5leHBvcnRDb21wb25lbnQodGhpcy5yZXBvcnRJZCwgdGhpcy5jb21wb25lbnQuaWQsIGZpbHRlcnMpLFxuICAgICk7XG4gIH1cblxuICAvLyBBbnkgaW50ZXJhY3Rpb24gaW5zaWRlIGEgY29tcG9uZW50IG11c3QgbmV2ZXIgc3RhcnQgYSBjYW52YXMgcGFuICh0aGVcbiAgLy8gem9vbS1wYW4gaG9zdCBsaXN0ZW5zIGZvciBtb3VzZWRvd24vdG91Y2hzdGFydCBhdCB0aGUgY29udGFpbmVyIGxldmVsKS5cbiAgcHVibGljIHN0b3BDYW52YXNQYW4oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgb25Db21wb25lbnRQb2ludGVyRG93bihldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZWRpdE1vZGUgJiYgIXRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmVtaXQodGhpcy5jb21wb25lbnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tIGVkaXQtbW9kZSBnZXN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwdWJsaWMgb25EcmFnU3RhcnQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0TW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmVtaXQodGhpcy5jb21wb25lbnQuaWQpO1xuXG4gICAgaWYgKHRoaXMubGF5b3V0ID09PSAnZmxvdycpIHtcbiAgICAgIHRoaXMuX2Zsb3dEcmFnKGV2ZW50KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3RyYWNrKGV2ZW50LCAoZGVsdGFYLCBkZWx0YVkpID0+IHtcbiAgICAgIGxldCB4ID0gTWF0aC5tYXgoMCwgdGhpcy5fb3JpZ2luLnggKyB0aGlzLl9pbmNoZXMoZGVsdGFYKSk7XG4gICAgICBsZXQgeSA9IE1hdGgubWF4KDAsIHRoaXMuX29yaWdpbi55ICsgdGhpcy5faW5jaGVzKGRlbHRhWSkpO1xuXG4gICAgICBpZiAodGhpcy5zbmFwcGVyKSB7XG4gICAgICAgICh7IHgsIHkgfSA9IHRoaXMuc25hcHBlci5zbmFwTW92ZSh0aGlzLmNvbXBvbmVudCwgeCwgeSkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbXBvbmVudC54ID0geDtcbiAgICAgIHRoaXMuY29tcG9uZW50LnkgPSB5O1xuICAgICAgdGhpcy5fYXBwbHlHZW9tZXRyeSgpO1xuICAgIH0sICgpID0+IHRoaXMuX2VtaXRHZW9tZXRyeSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZVN0YXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQsIGhhbmRsZTogSGFuZGxlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRNb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuZW1pdCh0aGlzLmNvbXBvbmVudC5pZCk7XG5cbiAgICBpZiAodGhpcy5sYXlvdXQgPT09ICdmbG93Jykge1xuICAgICAgdGhpcy5fZmxvd1Jlc2l6ZShldmVudCwgaGFuZGxlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3RyYWNrKGV2ZW50LCAoZGVsdGFYLCBkZWx0YVkpID0+IHtcbiAgICAgIGNvbnN0IGR4ID0gdGhpcy5faW5jaGVzKGRlbHRhWCk7XG4gICAgICBjb25zdCBkeSA9IHRoaXMuX2luY2hlcyhkZWx0YVkpO1xuICAgICAgbGV0IHsgeCwgeSwgdywgaCB9ID0gdGhpcy5fb3JpZ2luO1xuXG4gICAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCdlJykpIHtcbiAgICAgICAgdyA9IE1hdGgubWF4KE1JTl9XLCB0aGlzLl9vcmlnaW4udyArIGR4KTtcbiAgICAgIH1cbiAgICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ3MnKSkge1xuICAgICAgICBoID0gTWF0aC5tYXgoTUlOX0gsIHRoaXMuX29yaWdpbi5oICsgZHkpO1xuICAgICAgfVxuICAgICAgaWYgKGhhbmRsZS5pbmNsdWRlcygndycpKSB7XG4gICAgICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbihkeCwgdGhpcy5fb3JpZ2luLncgLSBNSU5fVyk7XG4gICAgICAgIHggPSB0aGlzLl9vcmlnaW4ueCArIGNsYW1wZWQ7XG4gICAgICAgIHcgPSB0aGlzLl9vcmlnaW4udyAtIGNsYW1wZWQ7XG4gICAgICB9XG4gICAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCduJykpIHtcbiAgICAgICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWluKGR5LCB0aGlzLl9vcmlnaW4uaCAtIE1JTl9IKTtcbiAgICAgICAgeSA9IHRoaXMuX29yaWdpbi55ICsgY2xhbXBlZDtcbiAgICAgICAgaCA9IHRoaXMuX29yaWdpbi5oIC0gY2xhbXBlZDtcbiAgICAgIH1cblxuICAgICAgbGV0IGdlb21ldHJ5ID0geyB4LCB5LCB3LCBoIH07XG4gICAgICBpZiAodGhpcy5zbmFwcGVyKSB7XG4gICAgICAgIGdlb21ldHJ5ID0gdGhpcy5zbmFwcGVyLnNuYXBSZXNpemUodGhpcy5jb21wb25lbnQsIGdlb21ldHJ5LCBoYW5kbGUpO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuY29tcG9uZW50LCBnZW9tZXRyeSk7XG4gICAgICB0aGlzLl9hcHBseUdlb21ldHJ5KCk7XG4gICAgICB0aGlzLmNoYXJ0Q29tcG9uZW50Py5yZXNpemUoKTtcbiAgICB9LCAoKSA9PiB0aGlzLl9lbWl0R2VvbWV0cnkoKSk7XG4gIH1cblxuICAvLyAoUmUpYnVpbGQgdGhlIGhlYWRlciBmcy1maWx0ZXIgY29uZmlnOiBoZWFkaW5nIHRlbXBsYXRlIHJlbmRlcnMgdGhlIHRpdGxlXG4gIC8vIGFuZCBpdGVtcyBhcmUgdGhpcyBjb21wb25lbnQncyBjb21wb25lbnQtbGV2ZWwgZmlsdGVyIGdyb3Vwcy4gVGhlIGFjdGlvbnNcbiAgLy8gbWVudSAoU2V0dGluZ3MgLyBFeHBvcnQgQ1NWKSBpcyBOT1QgaGVyZSDigJQgaXQncyBhIHN0YW5kYWxvbmUga2ViYWIgZmxvYXRlZFxuICAvLyB0b3AtcmlnaHQgaW4gdGhlIHRlbXBsYXRlLCBzbyBpdHMgYnV0dG9uIGhlaWdodCBubyBsb25nZXIgZHJpdmVzIHRoZSBoZWFkZXJcbiAgLy8gcm93J3MgaGVpZ2h0ICh3aGljaCB3b3VsZCBvdGhlcndpc2UgaW5mbGF0ZSB0aGUgaGVhZGluZyBieSB+NDBweCkuXG4gIHByaXZhdGUgX2J1aWxkRmlsdGVyQ29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyQ29uZmlnID0ge1xuICAgICAgLy8gTmV2ZXIgdG91Y2ggdGhlIFVSTCBvciBwZXJzaXN0IGZpbHRlciBzdGF0ZSDigJQgY29tcG9uZW50IGZpbHRlcnMgYXJlXG4gICAgICAvLyBzZXNzaW9uLW9ubHksIG93bmVkIGJ5IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZS5cbiAgICAgIHF1ZXJ5UGFyYW06IGZhbHNlLFxuICAgICAgcGVyc2lzdDogZmFsc2UsXG4gICAgICBpdGVtczogdGhpcy5jb21wb25lbnRGaWx0ZXJHcm91cHMubWFwKChncm91cCkgPT5cbiAgICAgICAgZmlsdGVySXRlbUZvckdyb3VwKGdyb3VwLCB0aGlzLl9yZXBvcnREYXRhLCB0aGlzLnJlcG9ydElkLCB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cC5pZCkpKSxcbiAgICAgIGNoYW5nZTogKHF1ZXJ5KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyBncm91cElkLCB2YWx1ZSB9IG9mIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5KHF1ZXJ5ID8/IHt9LCB0aGlzLmNvbXBvbmVudEZpbHRlckdyb3VwcykpIHtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRWYWx1ZShncm91cElkLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZsb3c6IG9ubHkgdGhlIGVhc3QgaGFuZGxlIHJlc2l6ZXMgKHdpZHRoICUpLiBIZWlnaHQgaXMgYWx3YXlzIGF1dG8gaW4gZmxvd1xuICAvLyAodGhlIGJveCBmaXRzIGl0cyBjb250ZW50KSwgc28gdGhlcmUncyBubyBzb3V0aCBoYW5kbGUgaGVyZS5cbiAgcHJpdmF0ZSBfZmxvd1Jlc2l6ZShldmVudDogUG9pbnRlckV2ZW50LCBoYW5kbGU6IEhhbmRsZSk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Py5jbGllbnRXaWR0aCB8fCAxO1xuXG4gICAgdGhpcy5fdHJhY2soZXZlbnQsIChkZWx0YVgpID0+IHtcbiAgICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ2UnKSkge1xuICAgICAgICBjb25zdCBkZWx0YVBlcmNlbnQgPSAoZGVsdGFYIC8gdGhpcy56b29tIC8gcGFnZVdpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmF3ID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgxMCwgdGhpcy5fb3JpZ2luLmZsb3dXaWR0aCArIGRlbHRhUGVyY2VudCkpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudC5mbG93V2lkdGggPSB0aGlzLl9zbmFwRmxvd1dpZHRoKHJhdyk7XG4gICAgICAgIHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RoaXMuY29tcG9uZW50LmZsb3dXaWR0aH0lYDtcbiAgICAgIH1cbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLnBvc2l0aW9uQ2hhbmdlZC5lbWl0KHtcbiAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuY29tcG9uZW50LmlkLFxuICAgICAgICBmbG93V2lkdGg6IHRoaXMuY29tcG9uZW50LmZsb3dXaWR0aCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRmxvdzogZHJhZyBsaWZ0cyB0aGUgY29tcG9uZW50IChnaG9zdCkgYW5kIHRoZSBjYW52YXMgZGVjaWRlcyB0aGUgZHJvcFxuICAvLyBpbmRleCBmcm9tIHRoZSBwb2ludGVyIHBvc2l0aW9uLlxuICBwcml2YXRlIF9mbG93RHJhZyhldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudDtcbiAgICBsZXQgbGFzdENsaWVudFggPSBldmVudC5jbGllbnRYO1xuICAgIGxldCBsYXN0Q2xpZW50WSA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICBob3N0LmNsYXNzTGlzdC5hZGQoJ2Zsb3ctZHJhZ2dpbmcnKTtcblxuICAgIHRoaXMuX3RyYWNrKGV2ZW50LCAoZGVsdGFYLCBkZWx0YVksIGUpID0+IHtcbiAgICAgIGxhc3RDbGllbnRYID0gZS5jbGllbnRYO1xuICAgICAgbGFzdENsaWVudFkgPSBlLmNsaWVudFk7XG4gICAgICBob3N0LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtkZWx0YVggLyB0aGlzLnpvb219cHgsICR7ZGVsdGFZIC8gdGhpcy56b29tfXB4KWA7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgaG9zdC5jbGFzc0xpc3QucmVtb3ZlKCdmbG93LWRyYWdnaW5nJyk7XG4gICAgICBob3N0LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgdGhpcy5mbG93UmVvcmRlci5lbWl0KHtcbiAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuY29tcG9uZW50LmlkLFxuICAgICAgICBjbGllbnRYOiBsYXN0Q2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogbGFzdENsaWVudFksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29yaWdpbiA9IHsgeDogMCwgeTogMCwgdzogMCwgaDogMCwgZmxvd1dpZHRoOiA1MCB9O1xuXG4gIC8vIFBvaW50ZXItY2FwdHVyZSBnZXN0dXJlIGxvb3A6IHJ1bnMgb3V0c2lkZSBBbmd1bGFyLCByZXBhaW50cyBpbXBlcmF0aXZlbHksXG4gIC8vIGFuZCBmaW5pc2hlcyBiYWNrIGluc2lkZSBBbmd1bGFyIChzZWxlY3Rpb24vcGVyc2lzdGVuY2UpLlxuICBwcml2YXRlIF90cmFjayhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIG9uTW92ZTogKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlciwgZTogUG9pbnRlckV2ZW50KSA9PiB2b2lkLFxuICAgIG9uRW5kOiAoKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgaGFuZGxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGhhbmRsZS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuXG4gICAgdGhpcy5fb3JpZ2luID0ge1xuICAgICAgeDogdGhpcy5jb21wb25lbnQueCxcbiAgICAgIHk6IHRoaXMuY29tcG9uZW50LnksXG4gICAgICB3OiB0aGlzLmNvbXBvbmVudC53LFxuICAgICAgaDogdGhpcy5jb21wb25lbnQuaCxcbiAgICAgIGZsb3dXaWR0aDogdGhpcy5jb21wb25lbnQuZmxvd1dpZHRoID8/IDUwLFxuICAgIH07XG4gICAgY29uc3Qgc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICBjb25zdCBzdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4gb25Nb3ZlKGUuY2xpZW50WCAtIHN0YXJ0WCwgZS5jbGllbnRZIC0gc3RhcnRZLCBlKTtcbiAgICAgIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcblxuICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zbmFwcGVyPy5jbGVhcigpO1xuICAgICAgICAgIG9uRW5kKCk7XG4gICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXRHZW9tZXRyeSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudC54ID0gdGhpcy5fcm91bmQodGhpcy5jb21wb25lbnQueCk7XG4gICAgdGhpcy5jb21wb25lbnQueSA9IHRoaXMuX3JvdW5kKHRoaXMuY29tcG9uZW50LnkpO1xuICAgIHRoaXMuY29tcG9uZW50LncgPSB0aGlzLl9yb3VuZChNYXRoLm1heChNSU5fVywgdGhpcy5jb21wb25lbnQudykpO1xuICAgIHRoaXMuY29tcG9uZW50LmggPSB0aGlzLl9yb3VuZChNYXRoLm1heChNSU5fSCwgdGhpcy5jb21wb25lbnQuaCkpO1xuICAgIHRoaXMuX2FwcGx5R2VvbWV0cnkoKTtcbiAgICB0aGlzLmNoYXJ0Q29tcG9uZW50Py5yZXNpemUoKTtcblxuICAgIHRoaXMucG9zaXRpb25DaGFuZ2VkLmVtaXQoe1xuICAgICAgY29tcG9uZW50SWQ6IHRoaXMuY29tcG9uZW50LmlkLFxuICAgICAgeDogdGhpcy5jb21wb25lbnQueCxcbiAgICAgIHk6IHRoaXMuY29tcG9uZW50LnksXG4gICAgICB3OiB0aGlzLmNvbXBvbmVudC53LFxuICAgICAgaDogdGhpcy5jb21wb25lbnQuaCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgY2hhcnQgb24gYSB0aW1lIHgtYXhpcyDigJQgdGhlIG9ubHkgY29tcG9uZW50IHRoZSBydW50aW1lIEZyZXF1ZW5jeSBjb250cm9sXG4gIC8vIGFwcGxpZXMgdG8uXG4gIHByaXZhdGUgZ2V0IF9pc1RpbWVTZXJpZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgdGhpcy5jb21wb25lbnQuY29uZmlnPy54QXhpcz8ua2luZCA9PT0gJ3RpbWUnO1xuICB9XG5cbiAgLy8gQXV0byBoZWlnaHQgKGJveCBmaXRzIGl0cyBjb250ZW50KSB2cyBmaXhlZCAodXNlIGBoYCBleGFjdGx5KS4gRGVyaXZlZCBmcm9tXG4gIC8vIHR5cGUsIHNlcnZlci1zaWRlOiBLUEkgdGlsZXMgYXJlIGF1dG87IGNoYXJ0cyBhbmQgbGlzdHMgYXJlIGZpeGVkIOKAlCBjaGFydHNcbiAgLy8gZml0IHRoZSBib3ggYW5kIG5ldmVyIG92ZXJmbG93LCBsaXN0cyBzY3JvbGwgaW5zaWRlIGl0LlxuICBwcml2YXRlIGdldCBfaGVpZ2h0QXV0bygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuYXV0b0hlaWdodCAhPT0gZmFsc2U7XG4gIH1cblxuICAvLyBEcml2ZXMgdGhlIGF1dG8tb25seSBDU1MgZGVmYXVsdCAoZW1wdHktc3RhdGUgYmFzZWxpbmUpIHNvIGl0IG5ldmVyIGFwcGxpZXNcbiAgLy8gdG8gYSBmaXhlZC1oZWlnaHQgY29tcG9uZW50LlxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhlaWdodC1hdXRvJylcbiAgcHVibGljIGdldCBoZWlnaHRBdXRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oZWlnaHRBdXRvO1xuICB9XG5cbiAgLy8gU2NyZWVuIHBpeGVscyDihpIgaW5jaGVzIGF0IHRoZSBjdXJyZW50IHpvb20uXG4gIHByaXZhdGUgX2luY2hlcyhwaXhlbHM6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHBpeGVscyAvICh0aGlzLnpvb20gKiBQWF9QRVJfSU5DSCk7XG4gIH1cblxuICAvLyBDbGVhbiBwZXJzaXN0ZWQgdmFsdWVzOiBodW5kcmVkdGhzIG9mIGFuIGluY2guXG4gIHByaXZhdGUgX3JvdW5kKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogMTAwKSAvIDEwMDtcbiAgfVxuXG4gIHByaXZhdGUgX3NuYXBGbG93V2lkdGgodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgZm9yIChjb25zdCBzdG9wIG9mIEZMT1dfV0lEVEhfU1RPUFMpIHtcbiAgICAgIGlmIChNYXRoLmFicyh2YWx1ZSAtIHN0b3ApIDwgMykge1xuICAgICAgICByZXR1cm4gc3RvcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwKSAvIDEwO1xuICB9XG5cbiAgLy8gVGhlIGNhbnZhcyBwb3NpdGlvbnMgdGhlIGhvc3QgdmlhIFtzdHlsZV07IG1pZC1nZXN0dXJlIHdlIHNldCBpdCBkaXJlY3RseVxuICAvLyBzbyBPblB1c2ggbmV2ZXIgcmUtcmVuZGVycyBpbiB0aGUgbW92ZSBsb29wLlxuICBwcml2YXRlIF9hcHBseUdlb21ldHJ5KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5faG9zdC5uYXRpdmVFbGVtZW50LnN0eWxlO1xuICAgIHN0eWxlLmxlZnQgPSBgJHt0aGlzLmNvbXBvbmVudC54ICogUFhfUEVSX0lOQ0h9cHhgO1xuICAgIHN0eWxlLnRvcCA9IGAke3RoaXMuY29tcG9uZW50LnkgKiBQWF9QRVJfSU5DSH1weGA7XG4gICAgc3R5bGUud2lkdGggPSBgJHt0aGlzLmNvbXBvbmVudC53ICogUFhfUEVSX0lOQ0h9cHhgO1xuXG4gICAgLy8gQXV0byAoa3BpKTogbm8gZml4ZWQgaGVpZ2h0IOKAlCB0aGUgYm94IHNpemVzIHRvIGl0cyBjb250ZW50LiBGaXhlZFxuICAgIC8vIChjaGFydC9saXN0KTogYGhgIGlzIHRoZSBleGFjdCBoZWlnaHQuIE1pcnJvcnMgdGhlIGNhbnZhcyBbc3R5bGVdIGJpbmRpbmdcbiAgICAvLyBzbyB0aGUgbWlkLWdlc3R1cmUgcGFpbnQgbWF0Y2hlcyB0aGUgcG9zdC1nZXN0dXJlIHJlLXJlbmRlci5cbiAgICBpZiAodGhpcy5faGVpZ2h0QXV0bykge1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlLmhlaWdodCA9IGAke3RoaXMuY29tcG9uZW50LmggKiBQWF9QRVJfSU5DSH1weGA7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0gZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBfbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQodGhpcy5jb21wb25lbnQpO1xuICAgIC8vIFRpbWUtc2VyaWVzIGNoYXJ0cyBjYXJyeSB0aGUgcnVudGltZSBGcmVxdWVuY3kgb3ZlcnJpZGUgKGlmIGNob3Nlbikgc28gdGhlXG4gICAgLy8gYmFja2VuZCByZS1idWNrZXRzOyBldmVyeXRoaW5nIGVsc2Ugc2VuZHMgbm8gaW50ZXJhY3Rpb24gc3RhdGUgaGVyZS5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2lzVGltZVNlcmllcyAmJiB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKVxuICAgICAgPyB7IGZyZXF1ZW5jeTogdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkgfVxuICAgICAgOiB7fTtcblxuICAgIHRoaXMuX3JlcG9ydERhdGEuY29tcG9uZW50RGF0YSh0aGlzLnJlcG9ydElkLCB0aGlzLmNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IENvbXBvbmVudERhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yPy5lcnJvcj8ubWVzc2FnZSA/PyBlcnJvcj8ubWVzc2FnZSA/PyAnRmFpbGVkIHRvIGxvYWQgZGF0YSc7XG4gICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwiY29tcG9uZW50LWJveFwiXG4gICAgW2NsYXNzLmVkaXRpbmddPVwiZWRpdE1vZGVcIlxuICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZFwiXG4gICAgW3N0eWxlLnBhZGRpbmddPVwiYm9keVBhZGRpbmdcIlxuICAgIChwb2ludGVyZG93bik9XCJvbkNvbXBvbmVudFBvaW50ZXJEb3duKCRldmVudClcIlxuICAgIChtb3VzZWRvd24pPVwic3RvcENhbnZhc1BhbigkZXZlbnQpXCJcbiAgICAodG91Y2hzdGFydCk9XCJzdG9wQ2FudmFzUGFuKCRldmVudClcIj5cbiAgPCEtLSBUaGUgaGVhZGVyIGlzIGFuIGZzLWZpbHRlcjogaGVhZGluZyB0ZW1wbGF0ZSA9IHRpdGxlIChhbmQgdGhlIGVkaXQtbW9kZVxuICAgICAgIGRyYWcgaGFuZGxlKSwgYWN0aW9ucyA9IHRoZSBtZW51LCBpdGVtcyA9IGNvbXBvbmVudC1sZXZlbCBmaWx0ZXJzLlxuICAgICAgIExpc3RzIGNhcnJ5IG5vIGl0ZW1zIGhlcmUg4oCUIHRoZXkgZmlsdGVyIHRocm91Z2ggRnNMaXN0LiBmcy1maWx0ZXIgcmVhZHNcbiAgICAgICBpdHMgY29uZmlnIG9uY2UsIHNvIHRoZSBibG9jayBpcyBrZXllZCBvbiB0aGUgY29tcG9uZW50LWZpbHRlciBzZXQgdG8gYmVcbiAgICAgICByZWNyZWF0ZWQgd2hlbiBpdCBjaGFuZ2VzLiAtLT5cbiAgQGZvciAoa2V5IG9mIFtmaWx0ZXJLZXldOyB0cmFjayBrZXkpIHtcbiAgICA8ZnMtZmlsdGVyXG4gICAgICAgIGNsYXNzPVwiY29tcG9uZW50LWZpbHRlclwiXG4gICAgICAgIFtjb25maWddPVwiZmlsdGVyQ29uZmlnXCI+XG4gICAgICA8bmctdGVtcGxhdGUgZnNGaWx0ZXJIZWFkaW5nPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvbXBvbmVudC10aXRsZVwiXG4gICAgICAgICAgICAocG9pbnRlcmRvd24pPVwib25EcmFnU3RhcnQoJGV2ZW50KVwiPlxuICAgICAgICAgIHt7IGNvbXBvbmVudC50aXRsZSB9fVxuICAgICAgICAgIEBpZiAodHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlZC1pY29uXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiU2hvd2luZyBhIHRydW5jYXRlZCByZXN1bHQg4oCUIHJlZmluZSB0aGUgZmlsdGVycyB0byBzZWUgZXZlcnl0aGluZy5cIj5cbiAgICAgICAgICAgICAgd2FybmluZ19hbWJlclxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2ZzLWZpbHRlcj5cbiAgfVxuICA8IS0tIFRoZSBhY3Rpb25zIG1lbnUgaXMgZmxvYXRlZCB0b3AtcmlnaHQgKGFic29sdXRlKSByYXRoZXIgdGhhbiBsaXZpbmcgaW5cbiAgICAgICBmcy1maWx0ZXIncyBhY3Rpb25zIHNsb3QsIHNvIGl0cyB+NDBweCBidXR0b24gaGVpZ2h0IG5vIGxvbmdlciBkcml2ZXMgdGhlXG4gICAgICAgaGVhZGVyIHJvdydzIGhlaWdodC4gSXQgb3ZlcmxheXMgdGhlIGJveCBjb3JuZXI7IHRoZSBoZWFkaW5nIHJlc2VydmVzXG4gICAgICAgcmlnaHQgcGFkZGluZyBzbyBhIGxvbmcgdGl0bGUgZWxsaXBzaXNlcyBiZWZvcmUgaXQuIC0tPlxuICA8YnV0dG9uXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNsYXNzPVwiY29tcG9uZW50LW1lbnVcIlxuICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIlxuICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAobW91c2Vkb3duKT1cInN0b3BDYW52YXNQYW4oJGV2ZW50KVwiPlxuICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic2V0dGluZ3MoKVwiPlxuICAgICAgPG1hdC1pY29uPnR1bmU8L21hdC1pY29uPlxuICAgICAgPHNwYW4+U2V0dGluZ3M8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJleHBvcnRDc3YoKVwiPlxuICAgICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuPkV4cG9ydCBDU1Y8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LW1lbnU+XG4gIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtYm9keVwiPlxuICAgIEBpZiAoY29tcG9uZW50LnR5cGUgPT09ICdsaXN0Jykge1xuICAgICAgPGFwcC1yZXBvcnQtY29tcG9uZW50LWxpc3RcbiAgICAgICAgW3JlcG9ydElkXT1cInJlcG9ydElkXCJcbiAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxuICAgICAgICBbZ3JvdXBzXT1cImdyb3Vwc1wiPlxuICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1saXN0PlxuICAgIH0gQGVsc2UgaWYgKGxvYWRpbmcpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc3RhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc2hpbW1lclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSBpZiAoZXJyb3IpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc3RhdGUgZXJyb3JcIj5cbiAgICAgICAge3sgZXJyb3IgfX1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2UgaWYgKCFkYXRhPy5yb3dzPy5sZW5ndGgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc3RhdGVcIj5cbiAgICAgICAgTm8gZGF0YVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSBpZiAoY29tcG9uZW50LnR5cGUgPT09ICdrcGknKSB7XG4gICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnQta3BpXG4gICAgICAgIFtjb21wb25lbnRdPVwiY29tcG9uZW50XCJcbiAgICAgICAgW2RhdGFdPVwiZGF0YVwiPlxuICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1rcGk+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnQtY2hhcnRcbiAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxuICAgICAgICBbZGF0YV09XCJkYXRhXCI+XG4gICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50LWNoYXJ0PlxuICAgIH1cbiAgICA8IS0tIEluIGVkaXQgbW9kZSBhIHRyYW5zcGFyZW50IHZlaWwgb3ZlciB0aGUgYm9keSBtYWtlcyB0aGUgV0hPTEVcbiAgICAgICAgIGNvbXBvbmVudCBkcmFnZ2FibGUgKGluZHVzdHJ5IHN0YW5kYXJkOiB5b3UgZ3JhYiB0aGUgb2JqZWN0LCBub3QganVzdFxuICAgICAgICAgaXRzIHRpdGxlIGJhcikgYW5kIGtlZXBzIGlubmVyIHdpZGdldHMgZnJvbSBzd2FsbG93aW5nIHRoZSBnZXN0dXJlLiAtLT5cbiAgICBAaWYgKGVkaXRNb2RlKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHJhZy12ZWlsXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uRHJhZ1N0YXJ0KCRldmVudClcIj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbjwhLS0gSGFuZGxlcyBsaXZlIE9VVFNJREUgdGhlIGNsaXBwZWQgYm94IHNvIHRoZXkgc3RyYWRkbGUgaXRzIGVkZ2VzLiAtLT5cbkBpZiAoZWRpdE1vZGUgJiYgc2VsZWN0ZWQpIHtcbiAgQGlmIChsYXlvdXQgPT09ICdmcmVlZm9ybScpIHtcbiAgICBAZm9yIChoYW5kbGUgb2YgcmVzaXplSGFuZGxlczsgdHJhY2sgaGFuZGxlKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaGFuZGxlIGhhbmRsZS17eyBoYW5kbGUgfX1cIlxuICAgICAgICAobW91c2Vkb3duKT1cInN0b3BDYW52YXNQYW4oJGV2ZW50KVwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudCwgaGFuZGxlKVwiPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9IEBlbHNlIHtcbiAgICA8IS0tIEZsb3cgaGVpZ2h0IGlzIGFsd2F5cyBhdXRvICh0aGUgYm94IGZpdHMgaXRzIGNvbnRlbnQpLCBzbyBvbmx5IHRoZVxuICAgICAgICAgZWFzdCBoYW5kbGUgKHdpZHRoICUpIGlzIG9mZmVyZWQgaGVyZS4gLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJoYW5kbGUgaGFuZGxlLWVcIlxuICAgICAgbWF0VG9vbHRpcD1cIldpZHRoICglIG9mIHBhZ2UpXCJcbiAgICAgIChtb3VzZWRvd24pPVwic3RvcENhbnZhc1BhbigkZXZlbnQpXCJcbiAgICAgIChwb2ludGVyZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudCwgJ2UnKVwiPlxuICAgIDwvZGl2PlxuICB9XG59Il19