@myrmidon/gve-core 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/animation-timeline/animation-timeline.component.mjs +5 -5
- package/esm2022/lib/components/animation-timeline-set/animation-timeline-set.component.mjs +130 -0
- package/esm2022/lib/components/animation-tween/animation-tween.component.mjs +5 -5
- package/esm2022/lib/components/animation-vars/animation-vars.component.mjs +3 -3
- package/esm2022/lib/components/base-text-char/base-text-char.component.mjs +3 -3
- package/esm2022/lib/components/base-text-editor/base-text-editor.component.mjs +3 -3
- package/esm2022/lib/components/base-text-view/base-text-view.component.mjs +3 -3
- package/esm2022/lib/components/chain-operation-editor/chain-operation-editor.component.mjs +3 -3
- package/esm2022/lib/components/chain-result-view/chain-result-view.component.mjs +3 -3
- package/esm2022/lib/components/feature-editor/feature-editor.component.mjs +3 -3
- package/esm2022/lib/components/feature-set-editor/feature-set-editor.component.mjs +3 -3
- package/esm2022/lib/components/feature-set-view/feature-set-view.component.mjs +3 -3
- package/esm2022/lib/components/ln-heights-editor/ln-heights-editor.component.mjs +3 -3
- package/esm2022/lib/components/operation-source-editor/operation-source-editor.component.mjs +3 -3
- package/esm2022/lib/components/simple-tree/simple-tree.component.mjs +3 -3
- package/esm2022/lib/components/snapshot-editor/snapshot-editor.component.mjs +38 -5
- package/esm2022/lib/components/steps-map/steps-map.component.mjs +3 -3
- package/esm2022/lib/services/gve-api.service.mjs +17 -4
- package/esm2022/lib/services/settings.service.mjs +3 -3
- package/fesm2022/myrmidon-gve-core.mjs +212 -57
- package/fesm2022/myrmidon-gve-core.mjs.map +1 -1
- package/lib/components/animation-timeline-set/animation-timeline-set.component.d.ts +31 -0
- package/lib/components/feature-editor/feature-editor.component.d.ts +1 -1
- package/lib/components/snapshot-editor/snapshot-editor.component.d.ts +5 -1
- package/lib/services/gve-api.service.d.ts +14 -0
- package/package.json +1 -1
|
@@ -20,6 +20,7 @@ import { ChainOperationEditorComponent } from '../chain-operation-editor/chain-o
|
|
|
20
20
|
import { ChainResultViewComponent } from '../chain-result-view/chain-result-view.component';
|
|
21
21
|
import { LnHeightsEditorComponent } from '../ln-heights-editor/ln-heights-editor.component';
|
|
22
22
|
import { BaseTextEditorComponent } from '../base-text-editor/base-text-editor.component';
|
|
23
|
+
import { AnimationTimelineSetComponent } from '../animation-timeline-set/animation-timeline-set.component';
|
|
23
24
|
import * as i0 from "@angular/core";
|
|
24
25
|
import * as i1 from "@angular/forms";
|
|
25
26
|
import * as i2 from "../../services/gve-api.service";
|
|
@@ -69,6 +70,8 @@ export class SnapshotEditorComponent {
|
|
|
69
70
|
*/
|
|
70
71
|
this.snapshotCancel = new EventEmitter();
|
|
71
72
|
this.editedOpIndex = -1;
|
|
73
|
+
this.opTags = [];
|
|
74
|
+
this.opElementIds = [];
|
|
72
75
|
this.opTypeMap = {
|
|
73
76
|
0: 'replace',
|
|
74
77
|
1: 'delete',
|
|
@@ -112,6 +115,10 @@ export class SnapshotEditorComponent {
|
|
|
112
115
|
this.imageWidth = new FormControl(0, { nonNullable: true });
|
|
113
116
|
this.imageHeight = new FormControl(0, { nonNullable: true });
|
|
114
117
|
this.defs = new FormControl(null);
|
|
118
|
+
// timelines
|
|
119
|
+
this.timelines = new FormControl([], {
|
|
120
|
+
nonNullable: true,
|
|
121
|
+
});
|
|
115
122
|
this.form = formBuilder.group({
|
|
116
123
|
width: this.width,
|
|
117
124
|
height: this.height,
|
|
@@ -135,6 +142,8 @@ export class SnapshotEditorComponent {
|
|
|
135
142
|
imageWidth: this.imageWidth,
|
|
136
143
|
imageHeight: this.imageHeight,
|
|
137
144
|
defs: this.defs,
|
|
145
|
+
// timelines
|
|
146
|
+
timelines: this.timelines,
|
|
138
147
|
});
|
|
139
148
|
}
|
|
140
149
|
ngOnInit() {
|
|
@@ -199,6 +208,14 @@ export class SnapshotEditorComponent {
|
|
|
199
208
|
this.operations.setValue(snapshot.operations);
|
|
200
209
|
this.inputOps.reset();
|
|
201
210
|
this.opStyle.setValue(snapshot.opStyle || null);
|
|
211
|
+
// timelines
|
|
212
|
+
const timelines = [];
|
|
213
|
+
if (snapshot.timelines) {
|
|
214
|
+
for (let tag in snapshot.timelines) {
|
|
215
|
+
timelines.push(snapshot.timelines[tag]);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
this.timelines.setValue(timelines);
|
|
202
219
|
}
|
|
203
220
|
this.form.markAsPristine();
|
|
204
221
|
}
|
|
@@ -475,8 +492,23 @@ export class SnapshotEditorComponent {
|
|
|
475
492
|
};
|
|
476
493
|
}
|
|
477
494
|
}
|
|
495
|
+
// timelines
|
|
496
|
+
if (this.timelines.value.length) {
|
|
497
|
+
snapshot.timelines = {};
|
|
498
|
+
this.timelines.value.forEach((t) => {
|
|
499
|
+
snapshot.timelines[t.tag] = t;
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
snapshot.timelines = undefined;
|
|
504
|
+
}
|
|
478
505
|
return snapshot;
|
|
479
506
|
}
|
|
507
|
+
onTimelinesChange(timelines) {
|
|
508
|
+
this.timelines.setValue(timelines);
|
|
509
|
+
this.timelines.markAsDirty();
|
|
510
|
+
this.timelines.updateValueAndValidity();
|
|
511
|
+
}
|
|
480
512
|
save() {
|
|
481
513
|
if (this.form.invalid || this.noSave) {
|
|
482
514
|
return;
|
|
@@ -484,10 +516,10 @@ export class SnapshotEditorComponent {
|
|
|
484
516
|
this._snapshot = this.getSnapshot();
|
|
485
517
|
this.snapshotChange.emit(this._snapshot);
|
|
486
518
|
}
|
|
487
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.
|
|
488
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: SnapshotEditorComponent, isStandalone: true, selector: "gve-snapshot-editor", inputs: { snapshot: "snapshot", batchOps: "batchOps", noSave: "noSave" }, outputs: { snapshotChange: "snapshotChange", snapshotCancel: "snapshotCancel" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- text -->\r\n <mat-tab label=\"text\">\r\n <mat-expansion-panel [expanded]=\"!baseText.value\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title> base text </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-base-text-editor\r\n [text]=\"baseText.value\"\r\n (textChange)=\"onTextChange($event)\"\r\n />\r\n <fieldset>\r\n <div class=\"form-row\">\r\n <!-- offsetX -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetX\"\r\n placeholder=\"X offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- offsetY -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetY\"\r\n placeholder=\"Y offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- lineHeightOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>ln h-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"lineHeightOffset\"\r\n placeholder=\"ln h-offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- charSpacingOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>char spacing</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"charSpacingOffset\"\r\n placeholder=\"char spacing\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- spcWidthOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>spc w-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"spcWidthOffset\"\r\n placeholder=\"spc w-offset\"\r\n />\r\n </mat-form-field>\r\n <!-- minLineHeights -->\r\n <div>\r\n <gve-ln-heights-editor\r\n [lineCount]=\"lineCount\"\r\n [heights]=\"lnHeights.value\"\r\n (heightsChange)=\"onHeightsChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n <!-- textStyle -->\r\n <div>\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>text style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"textStyle\"\r\n placeholder=\"text style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </fieldset>\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- operations -->\r\n <mat-tab label=\"operations\">\r\n <div id=\"snapshot-container\">\r\n <div id=\"general\">\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"width\"\r\n placeholder=\"width\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"height\"\r\n placeholder=\"height\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- add op -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary right\"\r\n [disabled]=\"!baseText.value\"\r\n (click)=\"editNewOperation()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> operation\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- ops -->\r\n <div id=\"ops\">\r\n <!-- operations list -->\r\n @if (operations.value.length) {\r\n <table id=\"list\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>ID</th>\r\n <th>type</th>\r\n <th>at</th>\r\n <th>run</th>\r\n <th>value</th>\r\n <th>itag</th>\r\n <th>otag</th>\r\n <th>gid</th>\r\n <th>feats</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (operation of operations.value; track operation.id; let\r\n index=$index) {\r\n <tr\r\n [ngClass]=\"{ selected: operation.id === resultOperationId }\"\r\n [ngClass]=\"{ edited: operation.id === editedOp?.id }\"\r\n >\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"editOperation(index)\"\r\n matTooltip=\"Edit operation\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"deleteOperation(index)\"\r\n matTooltip=\"Delete operation\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <!-- run to -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"accent\"\r\n (click)=\"runTo(index)\"\r\n matTooltip=\"Run to this operation\"\r\n >\r\n <mat-icon class=\"mat-accent\">subscriptions</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ operation.id }}</td>\r\n <td>{{ operation.type | flatLookup : opTypeMap }}</td>\r\n <td>{{ operation.at }}</td>\r\n <td>{{ operation.run }}</td>\r\n <td>{{ operation.value }}</td>\r\n <td>{{ operation.inputTag }}</td>\r\n <td>{{ operation.outputTag }}</td>\r\n <td>{{ operation.groupId }}</td>\r\n <td>{{ operation.features?.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- operation editor -->\r\n <mat-expansion-panel [expanded]=\"editedOp\" [disabled]=\"!editedOp\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>operation {{ editedOp?.id }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <gve-chain-operation-editor\r\n [operation]=\"editedOp\"\r\n (operationCancel)=\"onOperationCancel()\"\r\n (operationChange)=\"onOperationChange($event)\"\r\n (operationPreview)=\"onOperationPreview($event)\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\r\n <div>\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"busy\" />\r\n </div>\r\n\r\n <!-- opStyle -->\r\n <div id=\"opStyle\">\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>operations style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"opStyle\"\r\n placeholder=\"operations style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- batch ops -->\r\n <div>\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>batch operations</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <div id=\"batch-container\">\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>operations</mat-label>\r\n <textarea\r\n class=\"code\"\r\n matInput\r\n [formControl]=\"inputOps\"\r\n placeholder=\"operations\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Remove all the operations\"\r\n [disabled]=\"!operations.value.length || busy\"\r\n (click)=\"clearOperations()\"\r\n >\r\n clear\r\n </button>\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Parse text and add results to the operations\"\r\n [disabled]=\"!inputOps.value || busy\"\r\n (click)=\"parseOperations()\"\r\n >\r\n batch add\r\n </button>\r\n @if (parseError) {\r\n <span class=\"error\">{{ parseError }}</span>\r\n }\r\n </div>\r\n </div>\r\n <div id=\"batch-help\">\r\n <ul>\r\n <li>\r\n <strong>replace</strong>:\r\n <code>ATxRUN<strong>=</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>delete</strong>:\r\n <code>ATxRUN<strong>-</strong></code>\r\n </li>\r\n <li>\r\n <strong>add-before</strong>:\r\n <code>ATxRUN<strong>+[</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>add-after</strong>:\r\n <code>ATxRUN<strong>+]</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>move-before</strong>:\r\n <code>ATxRUN<strong>>[</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>move-after</strong>:\r\n <code>ATxRUN<strong>>]</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>swap</strong>:\r\n <code>ATxRUN<strong><></strong>TOxRUN</code>\r\n </li>\r\n <li>\r\n <strong>annotate</strong>:\r\n <code>ATxRUN<strong>:</strong></code>\r\n </li>\r\n </ul>\r\n <p>For all the operations:</p>\r\n <ul>\r\n <li>\r\n prefix <code>(ITAG:OTAG)</code> to define input and/or\r\n output tags, separated by colon.\r\n </li>\r\n <li>\r\n prepend <code>@</code> to AT to use character\r\n indexes (0-N) rather than IDs.\r\n </li>\r\n <li>RUN (where applicable) defaults to 1.</li>\r\n <li>\r\n append features like <code>[NAME OPERATOR VALUE]</code>,\r\n separated by space, where:\r\n </li>\r\n <ol>\r\n <li>\r\n NAME is an arbitrary string. Prefixes:\r\n <code>*</code>=global features, <code>!</code>=remove\r\n feature (no value). Suffixes:\r\n <code>^</code>=short-lived (like\r\n <code>*version^=alpha</code>).\r\n </li>\r\n <li>\r\n OPERATOR is <code>=</code> (multiple),\r\n <code>:=</code> (single),\r\n <code>==</code> (first-single).\r\n </li>\r\n <li>\r\n VALUE is a string. If it includes spaces, wrap it in\r\n <code>\"\"</code>.\r\n </li>\r\n </ol>\r\n </ul>\r\n </div>\r\n </div>\r\n </fieldset>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- result -->\r\n @if (result) {\r\n <fieldset id=\"result\">\r\n <legend>result</legend>\r\n <gve-chain-result-view\r\n [result]=\"result\"\r\n (stepPick)=\"onStepPick($event)\"\r\n />\r\n </fieldset>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- image -->\r\n <mat-tab label=\"image\">\r\n <div id=\"image\">\r\n <div id=\"image-ctl\">\r\n <!-- url -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>URL</mat-label>\r\n <input matInput [formControl]=\"imageUrl\" />\r\n </mat-form-field>\r\n <div class=\"form-row\">\r\n <!-- x -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageX\"\r\n placeholder=\"X\"\r\n />\r\n </mat-form-field>\r\n <!-- y -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageY\"\r\n placeholder=\"Y\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageWidth\"\r\n />\r\n </mat-form-field>\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageHeight\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <!-- defs -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>defs</mat-label>\r\n <textarea matInput [formControl]=\"defs\" rows=\"3\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div id=\"image-view\">\r\n @if (imageUrl.value) {\r\n <img alt=\"background\" [src]=\"imageUrl.value\" width=\"600\" />\r\n }\r\n </div>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- preview -->\r\n @if (snapshot) {\r\n <fieldset id=\"preview\">\r\n <legend class=\"button-row\">\r\n <span>{{ viewTitle }}</span>\r\n <button\r\n color=\"primary\"\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Refresh preview\"\r\n (click)=\"updateViewData()\"\r\n >\r\n <mat-icon class=\"mat-primary\">refresh</mat-icon>\r\n </button>\r\n </legend>\r\n <gve-snapshot-view\r\n [data]=\"viewData\"\r\n (snapshotRender)=\"onSnapshotRender($any($event))\"\r\n (visualEvent)=\"onVisualEvent($any($event))\"\r\n />\r\n <div>\r\n <mat-button-toggle\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Toggle rulers\"\r\n [checked]=\"rulers\"\r\n (change)=\"toggleRulers()\"\r\n >\r\n <mat-icon class=\"mat-primary\">straighten</mat-icon>\r\n </mat-button-toggle>\r\n </div>\r\n @if (visualInfo) {\r\n <div id=\"visual-info\">{{ visualInfo }}</div>\r\n }\r\n </fieldset>\r\n }\r\n\r\n <!--buttons -->\r\n <div class=\"form-row-center\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n close\r\n </button>\r\n @if (!noSave) {\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n }\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row-center{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap}.form-row,.form-row-center *{flex:0 0 auto}.form-row *.right{margin-left:auto}.button-row{display:flex;align-items:center;flex-wrap:wrap}.button-row *{flex:0 0 auto}.long-text{width:100%;max-width:800px}#text-range{margin:8px;border:1px solid silver;border-radius:6px;padding:6px}mat-expansion-panel{margin:8px 0}div#visual-info{font-size:95%;color:#909090;margin:8px}div#batch-container{display:grid;gap:16px;grid-template-rows:auto;grid-template-columns:1fr auto;grid-template-areas:\"batch-input batch-help\"}div#batch-input{grid-area:batch-input}div#batch-help{grid-area:batch-help}div#batch-help strong{color:#ff8c00}#list{margin:8px 0}#opStyle{margin-top:8px}table{width:100%;border-collapse:collapse}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#c8d9eb}tr.edited{background-color:#f6f6e4}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:#909090}.error{color:red}.input-nr{width:6em}.full-width{width:100%}.code{font-family:Courier New,Courier,monospace}div#image{display:grid;gap:8px;grid-template-rows:auto;grid-template-columns:1fr auto;grid-template-areas:\"image-ctl image-view\"}div#image-ctl{grid-area:image-ctl}div#image-view{grid-area:image-view}@media only screen and (max-width: 959px){div#batch-container{grid-template-columns:1fr;grid-template-areas:\"batch-input\" \"batch-help\"}div#image{grid-template-columns:1fr;grid-template-areas:\"image-ctl\" \"image-view\"}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "component", type: i7.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i8.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i8.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i8.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i12.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i13.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i13.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: NgToolsModule }, { kind: "pipe", type: i15.FlatLookupPipe, name: "flatLookup" }, { kind: "component", type: BaseTextEditorComponent, selector: "gve-base-text-editor", inputs: ["text"], outputs: ["textChange"] }, { kind: "component", type: ChainOperationEditorComponent, selector: "gve-chain-operation-editor", inputs: ["operation", "snapshot", "hidePreview"], outputs: ["operationChange", "operationPreview", "operationCancel"] }, { kind: "component", type: ChainResultViewComponent, selector: "gve-chain-result-view", inputs: ["result"], outputs: ["stepPick"] }, { kind: "component", type: LnHeightsEditorComponent, selector: "gve-ln-heights-editor", inputs: ["lineCount", "heights"], outputs: ["heightsChange"] }] }); }
|
|
519
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: SnapshotEditorComponent, deps: [{ token: i1.FormBuilder }, { token: i2.GveApiService }, { token: i3.DialogService }, { token: i4.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
520
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: SnapshotEditorComponent, isStandalone: true, selector: "gve-snapshot-editor", inputs: { snapshot: "snapshot", batchOps: "batchOps", noSave: "noSave" }, outputs: { snapshotChange: "snapshotChange", snapshotCancel: "snapshotCancel" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- text -->\r\n <mat-tab label=\"text\">\r\n <mat-expansion-panel [expanded]=\"!baseText.value\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title> base text </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-base-text-editor\r\n [text]=\"baseText.value\"\r\n (textChange)=\"onTextChange($event)\"\r\n />\r\n <fieldset>\r\n <div class=\"form-row\">\r\n <!-- offsetX -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetX\"\r\n placeholder=\"X offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- offsetY -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetY\"\r\n placeholder=\"Y offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- lineHeightOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>ln h-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"lineHeightOffset\"\r\n placeholder=\"ln h-offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- charSpacingOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>char spacing</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"charSpacingOffset\"\r\n placeholder=\"char spacing\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- spcWidthOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>spc w-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"spcWidthOffset\"\r\n placeholder=\"spc w-offset\"\r\n />\r\n </mat-form-field>\r\n <!-- minLineHeights -->\r\n <div>\r\n <gve-ln-heights-editor\r\n [lineCount]=\"lineCount\"\r\n [heights]=\"lnHeights.value\"\r\n (heightsChange)=\"onHeightsChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n <!-- textStyle -->\r\n <div>\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>text style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"textStyle\"\r\n placeholder=\"text style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </fieldset>\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- operations -->\r\n <mat-tab label=\"operations\">\r\n <div id=\"snapshot-container\">\r\n <div id=\"general\">\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"width\"\r\n placeholder=\"width\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"height\"\r\n placeholder=\"height\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- add op -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary right\"\r\n [disabled]=\"!baseText.value\"\r\n (click)=\"editNewOperation()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> operation\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- ops -->\r\n <div id=\"ops\">\r\n <!-- operations list -->\r\n @if (operations.value.length) {\r\n <table id=\"list\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>ID</th>\r\n <th>type</th>\r\n <th>at</th>\r\n <th>run</th>\r\n <th>value</th>\r\n <th>itag</th>\r\n <th>otag</th>\r\n <th>gid</th>\r\n <th>feats</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (operation of operations.value; track operation.id; let\r\n index=$index) {\r\n <tr\r\n [ngClass]=\"{ selected: operation.id === resultOperationId }\"\r\n [ngClass]=\"{ edited: operation.id === editedOp?.id }\"\r\n >\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"editOperation(index)\"\r\n matTooltip=\"Edit operation\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"deleteOperation(index)\"\r\n matTooltip=\"Delete operation\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <!-- run to -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"accent\"\r\n (click)=\"runTo(index)\"\r\n matTooltip=\"Run to this operation\"\r\n >\r\n <mat-icon class=\"mat-accent\">subscriptions</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ operation.id }}</td>\r\n <td>{{ operation.type | flatLookup : opTypeMap }}</td>\r\n <td>{{ operation.at }}</td>\r\n <td>{{ operation.run }}</td>\r\n <td>{{ operation.value }}</td>\r\n <td>{{ operation.inputTag }}</td>\r\n <td>{{ operation.outputTag }}</td>\r\n <td>{{ operation.groupId }}</td>\r\n <td>{{ operation.features?.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- operation editor -->\r\n <mat-expansion-panel [expanded]=\"editedOp\" [disabled]=\"!editedOp\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>operation {{ editedOp?.id }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <gve-chain-operation-editor\r\n [operation]=\"editedOp\"\r\n (operationCancel)=\"onOperationCancel()\"\r\n (operationChange)=\"onOperationChange($event)\"\r\n (operationPreview)=\"onOperationPreview($event)\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\r\n <div>\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"busy\" />\r\n </div>\r\n\r\n <!-- opStyle -->\r\n <div id=\"opStyle\">\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>operations style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"opStyle\"\r\n placeholder=\"operations style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- batch ops -->\r\n <div>\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>batch operations</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <div id=\"batch-container\">\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>operations</mat-label>\r\n <textarea\r\n class=\"code\"\r\n matInput\r\n [formControl]=\"inputOps\"\r\n placeholder=\"operations\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Remove all the operations\"\r\n [disabled]=\"!operations.value.length || busy\"\r\n (click)=\"clearOperations()\"\r\n >\r\n clear\r\n </button>\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Parse text and add results to the operations\"\r\n [disabled]=\"!inputOps.value || busy\"\r\n (click)=\"parseOperations()\"\r\n >\r\n batch add\r\n </button>\r\n @if (parseError) {\r\n <span class=\"error\">{{ parseError }}</span>\r\n }\r\n </div>\r\n </div>\r\n <div id=\"batch-help\">\r\n <ul>\r\n <li>\r\n <strong>replace</strong>:\r\n <code>ATxRUN<strong>=</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>delete</strong>:\r\n <code>ATxRUN<strong>-</strong></code>\r\n </li>\r\n <li>\r\n <strong>add-before</strong>:\r\n <code>ATxRUN<strong>+[</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>add-after</strong>:\r\n <code>ATxRUN<strong>+]</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>move-before</strong>:\r\n <code>ATxRUN<strong>>[</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>move-after</strong>:\r\n <code>ATxRUN<strong>>]</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>swap</strong>:\r\n <code>ATxRUN<strong><></strong>TOxRUN</code>\r\n </li>\r\n <li>\r\n <strong>annotate</strong>:\r\n <code>ATxRUN<strong>:</strong></code>\r\n </li>\r\n </ul>\r\n <p>For all the operations:</p>\r\n <ul>\r\n <li>\r\n prefix <code>(ITAG:OTAG)</code> to define input and/or\r\n output tags, separated by colon.\r\n </li>\r\n <li>\r\n prepend <code>@</code> to AT to use character\r\n indexes (0-N) rather than IDs.\r\n </li>\r\n <li>RUN (where applicable) defaults to 1.</li>\r\n <li>\r\n append features like <code>[NAME OPERATOR VALUE]</code>,\r\n separated by space, where:\r\n </li>\r\n <ol>\r\n <li>\r\n NAME is an arbitrary string. Prefixes:\r\n <code>*</code>=global features, <code>!</code>=remove\r\n feature (no value). Suffixes:\r\n <code>^</code>=short-lived (like\r\n <code>*version^=alpha</code>).\r\n </li>\r\n <li>\r\n OPERATOR is <code>=</code> (multiple),\r\n <code>:=</code> (single),\r\n <code>==</code> (first-single).\r\n </li>\r\n <li>\r\n VALUE is a string. If it includes spaces, wrap it in\r\n <code>\"\"</code>.\r\n </li>\r\n </ol>\r\n </ul>\r\n </div>\r\n </div>\r\n </fieldset>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- result -->\r\n @if (result) {\r\n <fieldset id=\"result\">\r\n <legend>result</legend>\r\n <gve-chain-result-view\r\n [result]=\"result\"\r\n (stepPick)=\"onStepPick($event)\"\r\n />\r\n </fieldset>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- image -->\r\n <mat-tab label=\"image\">\r\n <div id=\"image\">\r\n <div id=\"image-ctl\">\r\n <!-- url -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>URL</mat-label>\r\n <input matInput [formControl]=\"imageUrl\" />\r\n </mat-form-field>\r\n <div class=\"form-row\">\r\n <!-- x -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageX\"\r\n placeholder=\"X\"\r\n />\r\n </mat-form-field>\r\n <!-- y -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageY\"\r\n placeholder=\"Y\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageWidth\"\r\n />\r\n </mat-form-field>\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageHeight\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <!-- defs -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>defs</mat-label>\r\n <textarea matInput [formControl]=\"defs\" rows=\"3\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div id=\"image-view\">\r\n @if (imageUrl.value) {\r\n <img alt=\"background\" [src]=\"imageUrl.value\" width=\"600\" />\r\n }\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- timelines -->\r\n <mat-tab label=\"animation\">\r\n <gve-animation-timeline-set\r\n [tags]=\"opTags\"\r\n [elementIds]=\"opElementIds\"\r\n [timelines]=\"timelines.value\"\r\n (timelinesChange)=\"onTimelinesChange($event)\"\r\n />\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- preview -->\r\n @if (snapshot) {\r\n <fieldset id=\"preview\">\r\n <legend class=\"button-row\">\r\n <span>{{ viewTitle }}</span>\r\n <button\r\n color=\"primary\"\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Refresh preview\"\r\n (click)=\"updateViewData()\"\r\n >\r\n <mat-icon class=\"mat-primary\">refresh</mat-icon>\r\n </button>\r\n </legend>\r\n <gve-snapshot-view\r\n [data]=\"viewData\"\r\n (snapshotRender)=\"onSnapshotRender($any($event))\"\r\n (visualEvent)=\"onVisualEvent($any($event))\"\r\n />\r\n <div>\r\n <mat-button-toggle\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Toggle rulers\"\r\n [checked]=\"rulers\"\r\n (change)=\"toggleRulers()\"\r\n >\r\n <mat-icon class=\"mat-primary\">straighten</mat-icon>\r\n </mat-button-toggle>\r\n </div>\r\n @if (visualInfo) {\r\n <div id=\"visual-info\">{{ visualInfo }}</div>\r\n }\r\n </fieldset>\r\n }\r\n\r\n <!--buttons -->\r\n <div class=\"form-row-center\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n close\r\n </button>\r\n @if (!noSave) {\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n }\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row-center{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap}.form-row,.form-row-center *{flex:0 0 auto}.form-row *.right{margin-left:auto}.button-row{display:flex;align-items:center;flex-wrap:wrap}.button-row *{flex:0 0 auto}.long-text{width:100%;max-width:800px}#text-range{margin:8px;border:1px solid silver;border-radius:6px;padding:6px}mat-expansion-panel{margin:8px 0}div#visual-info{font-size:95%;color:#909090;margin:8px}div#batch-container{display:grid;gap:16px;grid-template-rows:auto;grid-template-columns:1fr auto;grid-template-areas:\"batch-input batch-help\"}div#batch-input{grid-area:batch-input}div#batch-help{grid-area:batch-help}div#batch-help strong{color:#ff8c00}#list{margin:8px 0}#opStyle{margin-top:8px}table{width:100%;border-collapse:collapse}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#c8d9eb}tr.edited{background-color:#f6f6e4}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:#909090}.error{color:red}.input-nr{width:6em}.full-width{width:100%}.code{font-family:Courier New,Courier,monospace}gve-animation-timeline-set{margin:8px 0}div#image{display:grid;gap:8px;grid-template-rows:auto;grid-template-columns:1fr auto;grid-template-areas:\"image-ctl image-view\"}div#image-ctl{grid-area:image-ctl}div#image-view{grid-area:image-view}@media only screen and (max-width: 959px){div#batch-container{grid-template-columns:1fr;grid-template-areas:\"batch-input\" \"batch-help\"}div#image{grid-template-columns:1fr;grid-template-areas:\"image-ctl\" \"image-view\"}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "component", type: i7.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i8.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i8.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i8.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i12.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i13.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i13.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: NgToolsModule }, { kind: "pipe", type: i15.FlatLookupPipe, name: "flatLookup" }, { kind: "component", type: BaseTextEditorComponent, selector: "gve-base-text-editor", inputs: ["text"], outputs: ["textChange"] }, { kind: "component", type: ChainOperationEditorComponent, selector: "gve-chain-operation-editor", inputs: ["operation", "snapshot", "hidePreview"], outputs: ["operationChange", "operationPreview", "operationCancel"] }, { kind: "component", type: ChainResultViewComponent, selector: "gve-chain-result-view", inputs: ["result"], outputs: ["stepPick"] }, { kind: "component", type: LnHeightsEditorComponent, selector: "gve-ln-heights-editor", inputs: ["lineCount", "heights"], outputs: ["heightsChange"] }, { kind: "component", type: AnimationTimelineSetComponent, selector: "gve-animation-timeline-set", inputs: ["timelines", "elementIds", "tags"], outputs: ["timelinesChange", "cancel"] }] }); }
|
|
489
521
|
}
|
|
490
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.
|
|
522
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: SnapshotEditorComponent, decorators: [{
|
|
491
523
|
type: Component,
|
|
492
524
|
args: [{ selector: 'gve-snapshot-editor', standalone: true, imports: [
|
|
493
525
|
CommonModule,
|
|
@@ -510,7 +542,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
|
|
|
510
542
|
ChainOperationEditorComponent,
|
|
511
543
|
ChainResultViewComponent,
|
|
512
544
|
LnHeightsEditorComponent,
|
|
513
|
-
], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- text -->\r\n <mat-tab label=\"text\">\r\n <mat-expansion-panel [expanded]=\"!baseText.value\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title> base text </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-base-text-editor\r\n [text]=\"baseText.value\"\r\n (textChange)=\"onTextChange($event)\"\r\n />\r\n <fieldset>\r\n <div class=\"form-row\">\r\n <!-- offsetX -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetX\"\r\n placeholder=\"X offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- offsetY -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetY\"\r\n placeholder=\"Y offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- lineHeightOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>ln h-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"lineHeightOffset\"\r\n placeholder=\"ln h-offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- charSpacingOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>char spacing</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"charSpacingOffset\"\r\n placeholder=\"char spacing\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- spcWidthOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>spc w-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"spcWidthOffset\"\r\n placeholder=\"spc w-offset\"\r\n />\r\n </mat-form-field>\r\n <!-- minLineHeights -->\r\n <div>\r\n <gve-ln-heights-editor\r\n [lineCount]=\"lineCount\"\r\n [heights]=\"lnHeights.value\"\r\n (heightsChange)=\"onHeightsChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n <!-- textStyle -->\r\n <div>\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>text style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"textStyle\"\r\n placeholder=\"text style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </fieldset>\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- operations -->\r\n <mat-tab label=\"operations\">\r\n <div id=\"snapshot-container\">\r\n <div id=\"general\">\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"width\"\r\n placeholder=\"width\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"height\"\r\n placeholder=\"height\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- add op -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary right\"\r\n [disabled]=\"!baseText.value\"\r\n (click)=\"editNewOperation()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> operation\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- ops -->\r\n <div id=\"ops\">\r\n <!-- operations list -->\r\n @if (operations.value.length) {\r\n <table id=\"list\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>ID</th>\r\n <th>type</th>\r\n <th>at</th>\r\n <th>run</th>\r\n <th>value</th>\r\n <th>itag</th>\r\n <th>otag</th>\r\n <th>gid</th>\r\n <th>feats</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (operation of operations.value; track operation.id; let\r\n index=$index) {\r\n <tr\r\n [ngClass]=\"{ selected: operation.id === resultOperationId }\"\r\n [ngClass]=\"{ edited: operation.id === editedOp?.id }\"\r\n >\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"editOperation(index)\"\r\n matTooltip=\"Edit operation\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"deleteOperation(index)\"\r\n matTooltip=\"Delete operation\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <!-- run to -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"accent\"\r\n (click)=\"runTo(index)\"\r\n matTooltip=\"Run to this operation\"\r\n >\r\n <mat-icon class=\"mat-accent\">subscriptions</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ operation.id }}</td>\r\n <td>{{ operation.type | flatLookup : opTypeMap }}</td>\r\n <td>{{ operation.at }}</td>\r\n <td>{{ operation.run }}</td>\r\n <td>{{ operation.value }}</td>\r\n <td>{{ operation.inputTag }}</td>\r\n <td>{{ operation.outputTag }}</td>\r\n <td>{{ operation.groupId }}</td>\r\n <td>{{ operation.features?.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- operation editor -->\r\n <mat-expansion-panel [expanded]=\"editedOp\" [disabled]=\"!editedOp\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>operation {{ editedOp?.id }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <gve-chain-operation-editor\r\n [operation]=\"editedOp\"\r\n (operationCancel)=\"onOperationCancel()\"\r\n (operationChange)=\"onOperationChange($event)\"\r\n (operationPreview)=\"onOperationPreview($event)\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\r\n <div>\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"busy\" />\r\n </div>\r\n\r\n <!-- opStyle -->\r\n <div id=\"opStyle\">\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>operations style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"opStyle\"\r\n placeholder=\"operations style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- batch ops -->\r\n <div>\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>batch operations</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <div id=\"batch-container\">\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>operations</mat-label>\r\n <textarea\r\n class=\"code\"\r\n matInput\r\n [formControl]=\"inputOps\"\r\n placeholder=\"operations\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Remove all the operations\"\r\n [disabled]=\"!operations.value.length || busy\"\r\n (click)=\"clearOperations()\"\r\n >\r\n clear\r\n </button>\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Parse text and add results to the operations\"\r\n [disabled]=\"!inputOps.value || busy\"\r\n (click)=\"parseOperations()\"\r\n >\r\n batch add\r\n </button>\r\n @if (parseError) {\r\n <span class=\"error\">{{ parseError }}</span>\r\n }\r\n </div>\r\n </div>\r\n <div id=\"batch-help\">\r\n <ul>\r\n <li>\r\n <strong>replace</strong>:\r\n <code>ATxRUN<strong>=</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>delete</strong>:\r\n <code>ATxRUN<strong>-</strong></code>\r\n </li>\r\n <li>\r\n <strong>add-before</strong>:\r\n <code>ATxRUN<strong>+[</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>add-after</strong>:\r\n <code>ATxRUN<strong>+]</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>move-before</strong>:\r\n <code>ATxRUN<strong>>[</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>move-after</strong>:\r\n <code>ATxRUN<strong>>]</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>swap</strong>:\r\n <code>ATxRUN<strong><></strong>TOxRUN</code>\r\n </li>\r\n <li>\r\n <strong>annotate</strong>:\r\n <code>ATxRUN<strong>:</strong></code>\r\n </li>\r\n </ul>\r\n <p>For all the operations:</p>\r\n <ul>\r\n <li>\r\n prefix <code>(ITAG:OTAG)</code> to define input and/or\r\n output tags, separated by colon.\r\n </li>\r\n <li>\r\n prepend <code>@</code> to AT to use character\r\n indexes (0-N) rather than IDs.\r\n </li>\r\n <li>RUN (where applicable) defaults to 1.</li>\r\n <li>\r\n append features like <code>[NAME OPERATOR VALUE]</code>,\r\n separated by space, where:\r\n </li>\r\n <ol>\r\n <li>\r\n NAME is an arbitrary string. Prefixes:\r\n <code>*</code>=global features, <code>!</code>=remove\r\n feature (no value). Suffixes:\r\n <code>^</code>=short-lived (like\r\n <code>*version^=alpha</code>).\r\n </li>\r\n <li>\r\n OPERATOR is <code>=</code> (multiple),\r\n <code>:=</code> (single),\r\n <code>==</code> (first-single).\r\n </li>\r\n <li>\r\n VALUE is a string. If it includes spaces, wrap it in\r\n <code>\"\"</code>.\r\n </li>\r\n </ol>\r\n </ul>\r\n </div>\r\n </div>\r\n </fieldset>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- result -->\r\n @if (result) {\r\n <fieldset id=\"result\">\r\n <legend>result</legend>\r\n <gve-chain-result-view\r\n [result]=\"result\"\r\n (stepPick)=\"onStepPick($event)\"\r\n />\r\n </fieldset>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- image -->\r\n <mat-tab label=\"image\">\r\n <div id=\"image\">\r\n <div id=\"image-ctl\">\r\n <!-- url -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>URL</mat-label>\r\n <input matInput [formControl]=\"imageUrl\" />\r\n </mat-form-field>\r\n <div class=\"form-row\">\r\n <!-- x -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageX\"\r\n placeholder=\"X\"\r\n />\r\n </mat-form-field>\r\n <!-- y -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageY\"\r\n placeholder=\"Y\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageWidth\"\r\n />\r\n </mat-form-field>\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageHeight\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <!-- defs -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>defs</mat-label>\r\n <textarea matInput [formControl]=\"defs\" rows=\"3\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div id=\"image-view\">\r\n @if (imageUrl.value) {\r\n <img alt=\"background\" [src]=\"imageUrl.value\" width=\"600\" />\r\n }\r\n </div>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- preview -->\r\n @if (snapshot) {\r\n <fieldset id=\"preview\">\r\n <legend class=\"button-row\">\r\n <span>{{ viewTitle }}</span>\r\n <button\r\n color=\"primary\"\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Refresh preview\"\r\n (click)=\"updateViewData()\"\r\n >\r\n <mat-icon class=\"mat-primary\">refresh</mat-icon>\r\n </button>\r\n </legend>\r\n <gve-snapshot-view\r\n [data]=\"viewData\"\r\n (snapshotRender)=\"onSnapshotRender($any($event))\"\r\n (visualEvent)=\"onVisualEvent($any($event))\"\r\n />\r\n <div>\r\n <mat-button-toggle\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Toggle rulers\"\r\n [checked]=\"rulers\"\r\n (change)=\"toggleRulers()\"\r\n >\r\n <mat-icon class=\"mat-primary\">straighten</mat-icon>\r\n </mat-button-toggle>\r\n </div>\r\n @if (visualInfo) {\r\n <div id=\"visual-info\">{{ visualInfo }}</div>\r\n }\r\n </fieldset>\r\n }\r\n\r\n <!--buttons -->\r\n <div class=\"form-row-center\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n close\r\n </button>\r\n @if (!noSave) {\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n }\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row-center{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap}.form-row,.form-row-center *{flex:0 0 auto}.form-row *.right{margin-left:auto}.button-row{display:flex;align-items:center;flex-wrap:wrap}.button-row *{flex:0 0 auto}.long-text{width:100%;max-width:800px}#text-range{margin:8px;border:1px solid silver;border-radius:6px;padding:6px}mat-expansion-panel{margin:8px 0}div#visual-info{font-size:95%;color:#909090;margin:8px}div#batch-container{display:grid;gap:16px;grid-template-rows:auto;grid-template-columns:1fr auto;grid-template-areas:\"batch-input batch-help\"}div#batch-input{grid-area:batch-input}div#batch-help{grid-area:batch-help}div#batch-help strong{color:#ff8c00}#list{margin:8px 0}#opStyle{margin-top:8px}table{width:100%;border-collapse:collapse}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#c8d9eb}tr.edited{background-color:#f6f6e4}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:#909090}.error{color:red}.input-nr{width:6em}.full-width{width:100%}.code{font-family:Courier New,Courier,monospace}div#image{display:grid;gap:8px;grid-template-rows:auto;grid-template-columns:1fr auto;grid-template-areas:\"image-ctl image-view\"}div#image-ctl{grid-area:image-ctl}div#image-view{grid-area:image-view}@media only screen and (max-width: 959px){div#batch-container{grid-template-columns:1fr;grid-template-areas:\"batch-input\" \"batch-help\"}div#image{grid-template-columns:1fr;grid-template-areas:\"image-ctl\" \"image-view\"}}\n"] }]
|
|
545
|
+
AnimationTimelineSetComponent,
|
|
546
|
+
], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <mat-tab-group>\r\n <!-- text -->\r\n <mat-tab label=\"text\">\r\n <mat-expansion-panel [expanded]=\"!baseText.value\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title> base text </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-base-text-editor\r\n [text]=\"baseText.value\"\r\n (textChange)=\"onTextChange($event)\"\r\n />\r\n <fieldset>\r\n <div class=\"form-row\">\r\n <!-- offsetX -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetX\"\r\n placeholder=\"X offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- offsetY -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"offsetY\"\r\n placeholder=\"Y offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- lineHeightOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>ln h-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"lineHeightOffset\"\r\n placeholder=\"ln h-offset\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- charSpacingOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>char spacing</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"charSpacingOffset\"\r\n placeholder=\"char spacing\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- spcWidthOffset -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>spc w-offset</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"spcWidthOffset\"\r\n placeholder=\"spc w-offset\"\r\n />\r\n </mat-form-field>\r\n <!-- minLineHeights -->\r\n <div>\r\n <gve-ln-heights-editor\r\n [lineCount]=\"lineCount\"\r\n [heights]=\"lnHeights.value\"\r\n (heightsChange)=\"onHeightsChange($event)\"\r\n />\r\n </div>\r\n </div>\r\n <!-- textStyle -->\r\n <div>\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>text style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"textStyle\"\r\n placeholder=\"text style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n </fieldset>\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- operations -->\r\n <mat-tab label=\"operations\">\r\n <div id=\"snapshot-container\">\r\n <div id=\"general\">\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"width\"\r\n placeholder=\"width\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"height\"\r\n placeholder=\"height\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- add op -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary right\"\r\n [disabled]=\"!baseText.value\"\r\n (click)=\"editNewOperation()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> operation\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- ops -->\r\n <div id=\"ops\">\r\n <!-- operations list -->\r\n @if (operations.value.length) {\r\n <table id=\"list\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>ID</th>\r\n <th>type</th>\r\n <th>at</th>\r\n <th>run</th>\r\n <th>value</th>\r\n <th>itag</th>\r\n <th>otag</th>\r\n <th>gid</th>\r\n <th>feats</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (operation of operations.value; track operation.id; let\r\n index=$index) {\r\n <tr\r\n [ngClass]=\"{ selected: operation.id === resultOperationId }\"\r\n [ngClass]=\"{ edited: operation.id === editedOp?.id }\"\r\n >\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"editOperation(index)\"\r\n matTooltip=\"Edit operation\"\r\n >\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"deleteOperation(index)\"\r\n matTooltip=\"Delete operation\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <!-- run to -->\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"accent\"\r\n (click)=\"runTo(index)\"\r\n matTooltip=\"Run to this operation\"\r\n >\r\n <mat-icon class=\"mat-accent\">subscriptions</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ operation.id }}</td>\r\n <td>{{ operation.type | flatLookup : opTypeMap }}</td>\r\n <td>{{ operation.at }}</td>\r\n <td>{{ operation.run }}</td>\r\n <td>{{ operation.value }}</td>\r\n <td>{{ operation.inputTag }}</td>\r\n <td>{{ operation.outputTag }}</td>\r\n <td>{{ operation.groupId }}</td>\r\n <td>{{ operation.features?.length }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <!-- operation editor -->\r\n <mat-expansion-panel [expanded]=\"editedOp\" [disabled]=\"!editedOp\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>operation {{ editedOp?.id }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <gve-chain-operation-editor\r\n [operation]=\"editedOp\"\r\n (operationCancel)=\"onOperationCancel()\"\r\n (operationChange)=\"onOperationChange($event)\"\r\n (operationPreview)=\"onOperationPreview($event)\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\r\n <div>\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"busy\" />\r\n </div>\r\n\r\n <!-- opStyle -->\r\n <div id=\"opStyle\">\r\n <mat-form-field class=\"long-text\" appearance=\"outline\">\r\n <mat-label>operations style</mat-label>\r\n <textarea\r\n matInput\r\n [formControl]=\"opStyle\"\r\n placeholder=\"operations style\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- batch ops -->\r\n <div>\r\n <mat-expansion-panel>\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>batch operations</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <fieldset>\r\n <div id=\"batch-container\">\r\n <div id=\"batch-input\">\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>operations</mat-label>\r\n <textarea\r\n class=\"code\"\r\n matInput\r\n [formControl]=\"inputOps\"\r\n placeholder=\"operations\"\r\n rows=\"8\"\r\n spellcheck=\"false\"\r\n ></textarea>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Remove all the operations\"\r\n [disabled]=\"!operations.value.length || busy\"\r\n (click)=\"clearOperations()\"\r\n >\r\n clear\r\n </button>\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Parse text and add results to the operations\"\r\n [disabled]=\"!inputOps.value || busy\"\r\n (click)=\"parseOperations()\"\r\n >\r\n batch add\r\n </button>\r\n @if (parseError) {\r\n <span class=\"error\">{{ parseError }}</span>\r\n }\r\n </div>\r\n </div>\r\n <div id=\"batch-help\">\r\n <ul>\r\n <li>\r\n <strong>replace</strong>:\r\n <code>ATxRUN<strong>=</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>delete</strong>:\r\n <code>ATxRUN<strong>-</strong></code>\r\n </li>\r\n <li>\r\n <strong>add-before</strong>:\r\n <code>ATxRUN<strong>+[</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>add-after</strong>:\r\n <code>ATxRUN<strong>+]</strong>\"VALUE\"</code>\r\n </li>\r\n <li>\r\n <strong>move-before</strong>:\r\n <code>ATxRUN<strong>>[</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>move-after</strong>:\r\n <code>ATxRUN<strong>>]</strong>TO</code>\r\n </li>\r\n <li>\r\n <strong>swap</strong>:\r\n <code>ATxRUN<strong><></strong>TOxRUN</code>\r\n </li>\r\n <li>\r\n <strong>annotate</strong>:\r\n <code>ATxRUN<strong>:</strong></code>\r\n </li>\r\n </ul>\r\n <p>For all the operations:</p>\r\n <ul>\r\n <li>\r\n prefix <code>(ITAG:OTAG)</code> to define input and/or\r\n output tags, separated by colon.\r\n </li>\r\n <li>\r\n prepend <code>@</code> to AT to use character\r\n indexes (0-N) rather than IDs.\r\n </li>\r\n <li>RUN (where applicable) defaults to 1.</li>\r\n <li>\r\n append features like <code>[NAME OPERATOR VALUE]</code>,\r\n separated by space, where:\r\n </li>\r\n <ol>\r\n <li>\r\n NAME is an arbitrary string. Prefixes:\r\n <code>*</code>=global features, <code>!</code>=remove\r\n feature (no value). Suffixes:\r\n <code>^</code>=short-lived (like\r\n <code>*version^=alpha</code>).\r\n </li>\r\n <li>\r\n OPERATOR is <code>=</code> (multiple),\r\n <code>:=</code> (single),\r\n <code>==</code> (first-single).\r\n </li>\r\n <li>\r\n VALUE is a string. If it includes spaces, wrap it in\r\n <code>\"\"</code>.\r\n </li>\r\n </ol>\r\n </ul>\r\n </div>\r\n </div>\r\n </fieldset>\r\n </mat-expansion-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- result -->\r\n @if (result) {\r\n <fieldset id=\"result\">\r\n <legend>result</legend>\r\n <gve-chain-result-view\r\n [result]=\"result\"\r\n (stepPick)=\"onStepPick($event)\"\r\n />\r\n </fieldset>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- image -->\r\n <mat-tab label=\"image\">\r\n <div id=\"image\">\r\n <div id=\"image-ctl\">\r\n <!-- url -->\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>URL</mat-label>\r\n <input matInput [formControl]=\"imageUrl\" />\r\n </mat-form-field>\r\n <div class=\"form-row\">\r\n <!-- x -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>X</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageX\"\r\n placeholder=\"X\"\r\n />\r\n </mat-form-field>\r\n <!-- y -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>Y</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"imageY\"\r\n placeholder=\"Y\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- width -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>width</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageWidth\"\r\n />\r\n </mat-form-field>\r\n <!-- height -->\r\n <mat-form-field class=\"input-nr\">\r\n <mat-label>height</mat-label>\r\n <input\r\n matInput\r\n type=\"number\"\r\n min=\"0\"\r\n [formControl]=\"imageHeight\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <!-- defs -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>defs</mat-label>\r\n <textarea matInput [formControl]=\"defs\" rows=\"3\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div id=\"image-view\">\r\n @if (imageUrl.value) {\r\n <img alt=\"background\" [src]=\"imageUrl.value\" width=\"600\" />\r\n }\r\n </div>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- timelines -->\r\n <mat-tab label=\"animation\">\r\n <gve-animation-timeline-set\r\n [tags]=\"opTags\"\r\n [elementIds]=\"opElementIds\"\r\n [timelines]=\"timelines.value\"\r\n (timelinesChange)=\"onTimelinesChange($event)\"\r\n />\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- preview -->\r\n @if (snapshot) {\r\n <fieldset id=\"preview\">\r\n <legend class=\"button-row\">\r\n <span>{{ viewTitle }}</span>\r\n <button\r\n color=\"primary\"\r\n mat-icon-button\r\n type=\"button\"\r\n matTooltip=\"Refresh preview\"\r\n (click)=\"updateViewData()\"\r\n >\r\n <mat-icon class=\"mat-primary\">refresh</mat-icon>\r\n </button>\r\n </legend>\r\n <gve-snapshot-view\r\n [data]=\"viewData\"\r\n (snapshotRender)=\"onSnapshotRender($any($event))\"\r\n (visualEvent)=\"onVisualEvent($any($event))\"\r\n />\r\n <div>\r\n <mat-button-toggle\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Toggle rulers\"\r\n [checked]=\"rulers\"\r\n (change)=\"toggleRulers()\"\r\n >\r\n <mat-icon class=\"mat-primary\">straighten</mat-icon>\r\n </mat-button-toggle>\r\n </div>\r\n @if (visualInfo) {\r\n <div id=\"visual-info\">{{ visualInfo }}</div>\r\n }\r\n </fieldset>\r\n }\r\n\r\n <!--buttons -->\r\n <div class=\"form-row-center\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-flat-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n close\r\n </button>\r\n @if (!noSave) {\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n }\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row-center{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap}.form-row,.form-row-center *{flex:0 0 auto}.form-row *.right{margin-left:auto}.button-row{display:flex;align-items:center;flex-wrap:wrap}.button-row *{flex:0 0 auto}.long-text{width:100%;max-width:800px}#text-range{margin:8px;border:1px solid silver;border-radius:6px;padding:6px}mat-expansion-panel{margin:8px 0}div#visual-info{font-size:95%;color:#909090;margin:8px}div#batch-container{display:grid;gap:16px;grid-template-rows:auto;grid-template-columns:1fr auto;grid-template-areas:\"batch-input batch-help\"}div#batch-input{grid-area:batch-input}div#batch-help{grid-area:batch-help}div#batch-help strong{color:#ff8c00}#list{margin:8px 0}#opStyle{margin-top:8px}table{width:100%;border-collapse:collapse}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr.selected{background-color:#c8d9eb}tr.edited{background-color:#f6f6e4}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:#909090}.error{color:red}.input-nr{width:6em}.full-width{width:100%}.code{font-family:Courier New,Courier,monospace}gve-animation-timeline-set{margin:8px 0}div#image{display:grid;gap:8px;grid-template-rows:auto;grid-template-columns:1fr auto;grid-template-areas:\"image-ctl image-view\"}div#image-ctl{grid-area:image-ctl}div#image-view{grid-area:image-view}@media only screen and (max-width: 959px){div#batch-container{grid-template-columns:1fr;grid-template-areas:\"batch-input\" \"batch-help\"}div#image{grid-template-columns:1fr;grid-template-areas:\"image-ctl\" \"image-view\"}}\n"] }]
|
|
514
547
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.GveApiService }, { type: i3.DialogService }, { type: i4.MatSnackBar }], propDecorators: { snapshot: [{
|
|
515
548
|
type: Input
|
|
516
549
|
}], batchOps: [{
|
|
@@ -522,4 +555,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
|
|
|
522
555
|
}], snapshotCancel: [{
|
|
523
556
|
type: Output
|
|
524
557
|
}] } });
|
|
525
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9zbmFwc2hvdC1lZGl0b3Ivc25hcHNob3QtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9zbmFwc2hvdC1lZGl0b3Ivc25hcHNob3QtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxXQUFXLEVBRVgsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxF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YyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0MsQ0FBQzs4R0E1aUJVLHVCQUF1QjtrR0FBdkIsdUJBQXVCLDBPQy9GcEMsODJrQkFpZ0JBLGt6REQzYkksWUFBWSxnT0FDWixXQUFXLHcvQkFDWCxtQkFBbUIsa1dBQ25CLGVBQWUsd1VBQ2YscUJBQXFCLHNTQUNyQixpQkFBaUIsOEJBQ2pCLGtCQUFrQix5ZEFDbEIsa0JBQWtCLDBTQUNsQixhQUFhLG9MQUNiLGNBQWMsMldBQ2Qsb0JBQW9CLHlOQUNwQixpQkFBaUIsOEJBQ2pCLGFBQWEsNm1CQUNiLGdCQUFnQiw2VEFDaEIsYUFBYSwrRkFDYix1QkFBdUIsNEdBRXZCLDZCQUE2Qiw4TEFDN0Isd0JBQXdCLDZHQUN4Qix3QkFBd0I7OzJGQU1mLHVCQUF1QjtrQkE3Qm5DLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLHFCQUFxQjt3QkFDckIsaUJBQWlCO3dCQUNqQixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixjQUFjO3dCQUNkLG9CQUFvQjt3QkFDcEIsaUJBQWlCO3dCQUNqQixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYix1QkFBdUI7d0JBQ3ZCLHFCQUFxQjt3QkFDckIsNkJBQTZCO3dCQUM3Qix3QkFBd0I7d0JBQ3hCLHdCQUF3QjtxQkFDekIsV0FDUSxDQUFDLHNCQUFzQixDQUFDO2tLQWN0QixRQUFRO3NCQURsQixLQUFLO2dCQWlCQyxRQUFRO3NCQURkLEtBQUs7Z0JBT0MsTUFBTTtzQkFEWixLQUFLO2dCQU9VLGNBQWM7c0JBRDdCLE1BQU07Z0JBT1MsY0FBYztzQkFEN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEZvcm1zTW9kdWxlLFxyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Ub2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24tdG9nZ2xlJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdEV4cGFuc2lvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyLCBNYXRTbmFja0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5cclxuaW1wb3J0IHsgY3VzdG9tQWxwaGFiZXQgfSBmcm9tICduYW5vaWQnO1xyXG5cclxuaW1wb3J0IHsgTmdUb29sc01vZHVsZSwgZGVlcENvcHkgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQG15cm1pZG9uL25nLW1hdC10b29scyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIENoYXJDaGFpbk9wZXJhdGlvbixcclxuICBDaGFyTm9kZSxcclxuICBERUZBVUxUX1NWR19CQVNFX1RFWFRfT1BUSU9OUyxcclxuICBGZWF0dXJlLFxyXG4gIEd2ZVZpc3VhbEV2ZW50LFxyXG4gIFNuYXBzaG90LFxyXG4gIFNuYXBzaG90Vmlld0RhdGEsXHJcbiAgU25hcHNob3RWaWV3UmVuZGVyRXZlbnQsXHJcbiAgU25hcHNob3RWaWV3U2VydmljZSxcclxufSBmcm9tICdAbXlybWlkb24vZ3ZlLXNuYXBzaG90LXZpZXcnO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlVGV4dFZpZXdDb21wb25lbnQsXHJcbiAgVmFyQmFzZVRleHRSYW5nZSxcclxufSBmcm9tICcuLi9iYXNlLXRleHQtdmlldy9iYXNlLXRleHQtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGFpbk9wZXJhdGlvbkVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2NoYWluLW9wZXJhdGlvbi1lZGl0b3IvY2hhaW4tb3BlcmF0aW9uLWVkaXRvci5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIENoYWluT3BlcmF0aW9uQ29udGV4dFN0ZXAsXHJcbiAgQ2hhckNoYWluUmVzdWx0LFxyXG4gIEd2ZUFwaVNlcnZpY2UsXHJcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ3ZlLWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2hhaW5SZXN1bHRWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hhaW4tcmVzdWx0LXZpZXcvY2hhaW4tcmVzdWx0LXZpZXcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTG5IZWlnaHRzRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vbG4taGVpZ2h0cy1lZGl0b3IvbG4taGVpZ2h0cy1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQmFzZVRleHRFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlLXRleHQtZWRpdG9yL2Jhc2UtdGV4dC1lZGl0b3IuY29tcG9uZW50JztcclxuXHJcbmNvbnN0IFZJRVdfVElUTEUgPSAncHJldmlldyc7XHJcblxyXG4vKipcclxuICogQSBjb21wb25lbnQgdG8gZWRpdCBhIHRleHQgc25hcHNob3QuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2d2ZS1zbmFwc2hvdC1lZGl0b3InLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uVG9nZ2xlTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXRFeHBhbnNpb25Nb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0SW5wdXRNb2R1bGUsXHJcbiAgICBNYXRQcm9ncmVzc0Jhck1vZHVsZSxcclxuICAgIE1hdFNuYWNrQmFyTW9kdWxlLFxyXG4gICAgTWF0VGFic01vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBOZ1Rvb2xzTW9kdWxlLFxyXG4gICAgQmFzZVRleHRFZGl0b3JDb21wb25lbnQsXHJcbiAgICBCYXNlVGV4dFZpZXdDb21wb25lbnQsXHJcbiAgICBDaGFpbk9wZXJhdGlvbkVkaXRvckNvbXBvbmVudCxcclxuICAgIENoYWluUmVzdWx0Vmlld0NvbXBvbmVudCxcclxuICAgIExuSGVpZ2h0c0VkaXRvckNvbXBvbmVudCxcclxuICBdLFxyXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vc25hcHNob3QtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc25hcHNob3QtZWRpdG9yLmNvbXBvbmVudC5jc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU25hcHNob3RFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX25hbm9pZCA9IGN1c3RvbUFscGhhYmV0KCcxMjM0NTY3ODkwYWJjZGVmJywgMTApO1xyXG4gIHByaXZhdGUgX3NuYXBzaG90PzogU25hcHNob3Q7XHJcbiAgcHJpdmF0ZSBfcmVuZGVyZXI/OiBTbmFwc2hvdFZpZXdTZXJ2aWNlO1xyXG4gIHByaXZhdGUgX3ByZXZpZXdpbmc/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc25hcHNob3QgdG8gZWRpdC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgc25hcHNob3QoKTogU25hcHNob3QgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NuYXBzaG90O1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHNuYXBzaG90KHZhbHVlOiBTbmFwc2hvdCB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIGlmICh0aGlzLl9zbmFwc2hvdCA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc25hcHNob3QgPSB2YWx1ZSB8fCB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm0odGhpcy5fc25hcHNob3QpO1xyXG4gICAgdGhpcy51cGRhdGVWaWV3RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGJhdGNoIG9wZXJhdGlvbnMgdGV4dCB0byBzZXQgZm9yIHRoZSBlZGl0b3IuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYmF0Y2hPcHM/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRydWUgdG8gZGlzYWJsZSBzYXZpbmcuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgbm9TYXZlPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIHNhdmVzIHRoZSBlZGl0ZWQgc25hcHNob3QuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IHNuYXBzaG90Q2hhbmdlOiBFdmVudEVtaXR0ZXI8U25hcHNob3Q+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2FuY2VscyB0aGUgc25hcHNob3QgZWRpdGluZy5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgc25hcHNob3RDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIC8vIGdlbmVyYWxcclxuICBwdWJsaWMgd2lkdGg6IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIGhlaWdodDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICBwdWJsaWMgc3R5bGU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIC8vIGJhc2UgdGV4dFxyXG4gIHB1YmxpYyBiYXNlVGV4dDogRm9ybUNvbnRyb2w8Q2hhck5vZGVbXSB8IHN0cmluZz47XHJcbiAgcHVibGljIG9mZnNldFg6IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIG9mZnNldFk6IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIGxpbmVIZWlnaHRPZmZzZXQ6IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIGxuSGVpZ2h0czogRm9ybUNvbnRyb2w8UmVjb3JkPG51bWJlciwgbnVtYmVyPiB8IG51bGw+O1xyXG4gIHB1YmxpYyBjaGFyU3BhY2luZ09mZnNldDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICBwdWJsaWMgc3BjV2lkdGhPZmZzZXQ6IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIHRleHRTdHlsZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgLy8gb3BlcmF0aW9uc1xyXG4gIHB1YmxpYyBvcGVyYXRpb25zOiBGb3JtQ29udHJvbDxDaGFyQ2hhaW5PcGVyYXRpb25bXT47XHJcbiAgcHVibGljIGlucHV0T3BzOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgb3BTdHlsZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuICAvLyBpbWFnZSBhbmQgZGVmc1xyXG4gIHB1YmxpYyBpbWFnZVVybDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGltYWdlT3BhY2l0eTogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICBwdWJsaWMgaW1hZ2VYOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBpbWFnZVk6IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIGltYWdlV2lkdGg6IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIGltYWdlSGVpZ2h0OiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBkZWZzOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuXHJcbiAgcHVibGljIHRleHRSYW5nZT86IFZhckJhc2VUZXh0UmFuZ2U7XHJcbiAgcHVibGljIGVkaXRlZE9wPzogQ2hhckNoYWluT3BlcmF0aW9uO1xyXG4gIHB1YmxpYyBlZGl0ZWRPcEluZGV4ID0gLTE7XHJcblxyXG4gIHB1YmxpYyBidXN5PzogYm9vbGVhbjtcclxuICBwdWJsaWMgcGFyc2VFcnJvcj86IHN0cmluZztcclxuICBwdWJsaWMgb3BUeXBlTWFwID0ge1xyXG4gICAgMDogJ3JlcGxhY2UnLFxyXG4gICAgMTogJ2RlbGV0ZScsXHJcbiAgICAyOiAnYWRkLWJlZm9yZScsXHJcbiAgICAzOiAnYWRkLWFmdGVyJyxcclxuICAgIDQ6ICdtb3ZlLWJlZm9yZScsXHJcbiAgICA1OiAnbW92ZS1hZnRlcicsXHJcbiAgICA2OiAnc3dhcCcsXHJcbiAgICA3OiAnYW5ub3RhdGUnLFxyXG4gIH07XHJcbiAgcHVibGljIGxpbmVDb3VudCA9IDA7XHJcblxyXG4gIHB1YmxpYyB2aWV3VGl0bGUgPSBWSUVXX1RJVExFO1xyXG4gIHB1YmxpYyB2aWV3RGF0YT86IFNuYXBzaG90Vmlld0RhdGE7XHJcbiAgcHVibGljIHZpc3VhbEluZm8/OiBzdHJpbmc7XHJcbiAgcHVibGljIHJ1bGVycyA9IHRydWU7XHJcbiAgLy8gcnVuIHJlc3VsdFxyXG4gIHB1YmxpYyByZXN1bHQ/OiBDaGFyQ2hhaW5SZXN1bHQ7XHJcbiAgcHVibGljIHJlc3VsdE9wZXJhdGlvbklkPzogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgX2FwaTogR3ZlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zbmFja2JhcjogTWF0U25hY2tCYXJcclxuICApIHtcclxuICAgIC8vIGdlbmVyYWxcclxuICAgIHRoaXMud2lkdGggPSBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPig4MDAsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmhlaWdodCA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KDYwMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuc3R5bGUgPSBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICAvLyBiYXNlIHRleHRcclxuICAgIHRoaXMuYmFzZVRleHQgPSBuZXcgRm9ybUNvbnRyb2w8Q2hhck5vZGVbXSB8IHN0cmluZz4oW10sIHtcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5vZmZzZXRYID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMub2Zmc2V0WSA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KDAsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmxpbmVIZWlnaHRPZmZzZXQgPSBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPihcclxuICAgICAgREVGQVVMVF9TVkdfQkFTRV9URVhUX09QVElPTlMubGluZUhlaWdodE9mZnNldCxcclxuICAgICAgeyBub25OdWxsYWJsZTogdHJ1ZSB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5sbkhlaWdodHMgPSBuZXcgRm9ybUNvbnRyb2w8UmVjb3JkPG51bWJlciwgbnVtYmVyPiB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5jaGFyU3BhY2luZ09mZnNldCA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KDAsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLnNwY1dpZHRoT2Zmc2V0ID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudGV4dFN0eWxlID0gbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG5cclxuICAgIC8vIG9wZXJhdGlvbnNcclxuICAgIHRoaXMub3BlcmF0aW9ucyA9IG5ldyBGb3JtQ29udHJvbDxDaGFyQ2hhaW5PcGVyYXRpb25bXT4oW10sIHtcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuaW5wdXRPcHMgPSBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICB0aGlzLm9wU3R5bGUgPSBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICAvLyBpbWFnZVxyXG4gICAgdGhpcy5pbWFnZVVybCA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKTtcclxuICAgIHRoaXMuaW1hZ2VPcGFjaXR5ID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuaW1hZ2VYID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuaW1hZ2VZID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuaW1hZ2VXaWR0aCA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KDAsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmltYWdlSGVpZ2h0ID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuZGVmcyA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKTtcclxuXHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxyXG4gICAgICBzdHlsZTogdGhpcy5zdHlsZSxcclxuICAgICAgYmFzZVRleHQ6IHRoaXMuYmFzZVRleHQsXHJcbiAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXRZLFxyXG4gICAgICBsaW5lSGVpZ2h0T2Zmc2V0OiB0aGlzLmxpbmVIZWlnaHRPZmZzZXQsXHJcbiAgICAgIGxuSGVpZ2h0czogdGhpcy5sbkhlaWdodHMsXHJcbiAgICAgIGNoYXJTcGFjaW5nT2Zmc2V0OiB0aGlzLmNoYXJTcGFjaW5nT2Zmc2V0LFxyXG4gICAgICBzcGNXaWR0aE9mZnNldDogdGhpcy5zcGNXaWR0aE9mZnNldCxcclxuICAgICAgdGV4dFN0eWxlOiB0aGlzLnRleHRTdHlsZSxcclxuICAgICAgb3BlcmF0aW9uczogdGhpcy5vcGVyYXRpb25zLFxyXG4gICAgICBpbnB1dE9wczogdGhpcy5pbnB1dE9wcyxcclxuICAgICAgb3BTdHlsZTogdGhpcy5vcFN0eWxlLFxyXG4gICAgICAvLyBpbWFnZVxyXG4gICAgICBpbWFnZVVybDogdGhpcy5pbWFnZVVybCxcclxuICAgICAgaW1hZ2VPcGFjaXR5OiB0aGlzLmltYWdlT3BhY2l0eSxcclxuICAgICAgaW1hZ2VYOiB0aGlzLmltYWdlWCxcclxuICAgICAgaW1hZ2VZOiB0aGlzLmltYWdlWSxcclxuICAgICAgaW1hZ2VXaWR0aDogdGhpcy5pbWFnZVdpZHRoLFxyXG4gICAgICBpbWFnZUhlaWdodDogdGhpcy5pbWFnZUhlaWdodCxcclxuICAgICAgZGVmczogdGhpcy5kZWZzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5iYXRjaE9wcykge1xyXG4gICAgICB0aGlzLmlucHV0T3BzLnNldFZhbHVlKHRoaXMuYmF0Y2hPcHMpO1xyXG4gICAgICB0aGlzLnBhcnNlT3BlcmF0aW9ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZVZpZXdEYXRhKFxyXG4gICAgbmV3T3BlcmF0aW9uPzogQ2hhckNoYWluT3BlcmF0aW9uLFxyXG4gICAgc25hcHNob3Q/OiBTbmFwc2hvdCxcclxuICAgIHRpdGxlID0gVklFV19USVRMRVxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ3VwZGF0ZSB2aWV3IGRhdGEnKTtcclxuICAgIGlmICghc25hcHNob3QpIHtcclxuICAgICAgc25hcHNob3QgPSB0aGlzLmdldFNuYXBzaG90KCk7XHJcbiAgICB9XHJcbiAgICAvLyB1cGRhdGUgb3IgYWRkIG5ldyBvcGVyYXRpb24gaW4gY29weVxyXG4gICAgaWYgKG5ld09wZXJhdGlvbikge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHNuYXBzaG90Lm9wZXJhdGlvbnMuZmluZEluZGV4KFxyXG4gICAgICAgIChvcCkgPT4gb3AuaWQgPT09IG5ld09wZXJhdGlvbi5pZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHNuYXBzaG90Lm9wZXJhdGlvbnMuc3BsaWNlKGluZGV4LCAxLCBuZXdPcGVyYXRpb24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNuYXBzaG90Lm9wZXJhdGlvbnMucHVzaChuZXdPcGVyYXRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdXBkYXRlIHZpZXcgZGF0YVxyXG4gICAgdGhpcy52aWV3VGl0bGUgPSB0aXRsZTtcclxuICAgIHRoaXMudmlzdWFsSW5mbyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudmlld0RhdGEgPSB7XHJcbiAgICAgIHNuYXBzaG90OiBzbmFwc2hvdCxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIC8vIGRlYnVnOiB0cnVlLFxyXG4gICAgICAgIGRlbGF5ZWRSZW5kZXI6IHRydWUsXHJcbiAgICAgICAgc2hvd1J1bGVyczogdHJ1ZSxcclxuICAgICAgICBzaG93R3JpZDogdHJ1ZSxcclxuICAgICAgICBwYW5ab29tOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIGNvbnNvbGUubG9nKGB2aWV3IGRhdGE6ICR7dGhpcy52aWV3RGF0YX1gKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybShzbmFwc2hvdDogU25hcHNob3QgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghc25hcHNob3QpIHtcclxuICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndpZHRoLnNldFZhbHVlKHNuYXBzaG90LnNpemUud2lkdGgpO1xyXG4gICAgICB0aGlzLmhlaWdodC5zZXRWYWx1ZShzbmFwc2hvdC5zaXplLmhlaWdodCk7XHJcbiAgICAgIHRoaXMuc3R5bGUuc2V0VmFsdWUoc25hcHNob3Quc3R5bGUgfHwgbnVsbCk7XHJcbiAgICAgIHRoaXMuaW1hZ2VVcmwuc2V0VmFsdWUoc25hcHNob3QuaW1hZ2U/LnVybCB8fCBudWxsKTtcclxuICAgICAgdGhpcy5pbWFnZU9wYWNpdHkuc2V0VmFsdWUoc25hcHNob3QuaW1hZ2U/Lm9wYWNpdHkgfHwgMCk7XHJcbiAgICAgIHRoaXMuaW1hZ2VYLnNldFZhbHVlKHNuYXBzaG90LmltYWdlPy5jYW52YXM/LnggfHwgMCk7XHJcbiAgICAgIHRoaXMuaW1hZ2VZLnNldFZhbHVlKHNuYXBzaG90LmltYWdlPy5jYW52YXM/LnkgfHwgMCk7XHJcbiAgICAgIHRoaXMuaW1hZ2VXaWR0aC5zZXRWYWx1ZShzbmFwc2hvdC5pbWFnZT8uY2FudmFzPy53aWR0aCB8fCAwKTtcclxuICAgICAgdGhpcy5pbWFnZUhlaWdodC5zZXRWYWx1ZShzbmFwc2hvdC5pbWFnZT8uY2FudmFzPy5oZWlnaHQgfHwgMCk7XHJcbiAgICAgIHRoaXMuZGVmcy5zZXRWYWx1ZShzbmFwc2hvdC5kZWZzIHx8IG51bGwpO1xyXG4gICAgICB0aGlzLmJhc2VUZXh0LnNldFZhbHVlKHNuYXBzaG90LnRleHQpO1xyXG4gICAgICB0aGlzLm9mZnNldFguc2V0VmFsdWUoc25hcHNob3QudGV4dE9wdGlvbnM/Lm9mZnNldD8ueCB8fCAwKTtcclxuICAgICAgdGhpcy5vZmZzZXRZLnNldFZhbHVlKHNuYXBzaG90LnRleHRPcHRpb25zPy5vZmZzZXQ/LnkgfHwgMCk7XHJcbiAgICAgIHRoaXMubGluZUhlaWdodE9mZnNldC5zZXRWYWx1ZShzbmFwc2hvdC50ZXh0T3B0aW9ucz8ubGluZUhlaWdodE9mZnNldCk7XHJcbiAgICAgIHRoaXMubG5IZWlnaHRzLnNldFZhbHVlKHNuYXBzaG90LnRleHRPcHRpb25zPy5taW5MaW5lSGVpZ2h0cyB8fCBudWxsKTtcclxuICAgICAgdGhpcy5jaGFyU3BhY2luZ09mZnNldC5zZXRWYWx1ZShzbmFwc2hvdC50ZXh0T3B0aW9ucz8uY2hhclNwYWNpbmdPZmZzZXQpO1xyXG4gICAgICB0aGlzLnNwY1dpZHRoT2Zmc2V0LnNldFZhbHVlKHNuYXBzaG90LnRleHRPcHRpb25zPy5zcGNXaWR0aE9mZnNldCk7XHJcbiAgICAgIHRoaXMudGV4dFN0eWxlLnNldFZhbHVlKHNuYXBzaG90LnRleHRTdHlsZSB8fCBudWxsKTtcclxuICAgICAgdGhpcy5vcGVyYXRpb25zLnNldFZhbHVlKHNuYXBzaG90Lm9wZXJhdGlvbnMpO1xyXG4gICAgICB0aGlzLmlucHV0T3BzLnJlc2V0KCk7XHJcbiAgICAgIHRoaXMub3BTdHlsZS5zZXRWYWx1ZShzbmFwc2hvdC5vcFN0eWxlIHx8IG51bGwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZWRpdE5ld09wZXJhdGlvbigpIHtcclxuICAgIHRoaXMuZWRpdGVkT3AgPSB7XHJcbiAgICAgIGlkOiB0aGlzLl9uYW5vaWQoKSxcclxuICAgICAgdHlwZTogMCxcclxuICAgICAgYXQ6IHRoaXMudGV4dFJhbmdlPy5hdCB8fCAwLFxyXG4gICAgICBydW46IHRoaXMudGV4dFJhbmdlPy5ydW4gfHwgMSxcclxuICAgIH07XHJcbiAgICB0aGlzLmVkaXRlZE9wSW5kZXggPSAtMTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0T3BlcmF0aW9uKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuZWRpdGVkT3BJbmRleCA9IGluZGV4O1xyXG4gICAgdGhpcy5lZGl0ZWRPcCA9IGRlZXBDb3B5KHRoaXMub3BlcmF0aW9ucy52YWx1ZVtpbmRleF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZUVkaXRlZE9wKCkge1xyXG4gICAgdGhpcy5lZGl0ZWRPcEluZGV4ID0gLTE7XHJcbiAgICB0aGlzLmVkaXRlZE9wID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uT3BlcmF0aW9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5jbG9zZUVkaXRlZE9wKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25PcGVyYXRpb25DaGFuZ2Uob3A6IENoYXJDaGFpbk9wZXJhdGlvbikge1xyXG4gICAgY29uc29sZS5sb2coJ29wZXJhdGlvbiBjaGFuZ2UnKTtcclxuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbLi4udGhpcy5vcGVyYXRpb25zLnZhbHVlXTtcclxuXHJcbiAgICBpZiAodGhpcy5lZGl0ZWRPcEluZGV4ID4gLTEpIHtcclxuICAgICAgb3BlcmF0aW9ucy5zcGxpY2UodGhpcy5lZGl0ZWRPcEluZGV4LCAxLCBvcCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvcGVyYXRpb25zLnB1c2gob3ApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVyYXRpb25zLnNldFZhbHVlKG9wZXJhdGlvbnMpO1xyXG4gICAgdGhpcy5vcGVyYXRpb25zLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLm9wZXJhdGlvbnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgIHRoaXMuY2xvc2VFZGl0ZWRPcCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZU9wZXJhdGlvbihpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9kaWFsb2dTZXJ2aWNlXHJcbiAgICAgIC5jb25maXJtKFxyXG4gICAgICAgICdDb25maXJtIERlbGV0aW9uJyxcclxuICAgICAgICBgRGVsZXRlIG9wZXJhdGlvbiBcIiR7dGhpcy5vcGVyYXRpb25zLnZhbHVlW2luZGV4XS5pZH1cIj9gXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoeWVzOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKHllcykge1xyXG4gICAgICAgICAgaWYgKHRoaXMucmVzdWx0T3BlcmF0aW9uSWQgPT09IHRoaXMub3BlcmF0aW9ucy52YWx1ZVtpbmRleF0uaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRPcGVyYXRpb25JZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbLi4udGhpcy5vcGVyYXRpb25zLnZhbHVlXTtcclxuICAgICAgICAgIG9wZXJhdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgIHRoaXMub3BlcmF0aW9ucy5zZXRWYWx1ZShvcGVyYXRpb25zKTtcclxuICAgICAgICAgIHRoaXMub3BlcmF0aW9ucy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgdGhpcy5vcGVyYXRpb25zLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVGV4dENoYW5nZSh0ZXh0OiBDaGFyTm9kZVtdKSB7XHJcbiAgICBjb25zb2xlLmxvZygndGV4dCBjaGFuZ2U6ICcgKyB0ZXh0KTtcclxuICAgIHRoaXMuYmFzZVRleHQuc2V0VmFsdWUodGV4dCk7XHJcbiAgICB0aGlzLmJhc2VUZXh0LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuYmFzZVRleHQubWFya0FzRGlydHkoKTtcclxuICAgIGlmICghdGV4dC5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5saW5lQ291bnQgPSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5saW5lQ291bnQgPSB0ZXh0LmZpbHRlcigoYykgPT4gYy5kYXRhID09PSAnXFxuJykubGVuZ3RoICsgMTtcclxuICAgIH1cclxuICAgIHRoaXMudGV4dFJhbmdlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5jbG9zZUVkaXRlZE9wKCk7XHJcbiAgICB0aGlzLm9wZXJhdGlvbnMucmVzZXQoKTtcclxuICAgIHRoaXMudXBkYXRlVmlld0RhdGEoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblJhbmdlUGljayhyYW5nZTogVmFyQmFzZVRleHRSYW5nZSkge1xyXG4gICAgdGhpcy50ZXh0UmFuZ2UgPSByYW5nZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwYXJzZU9wZXJhdGlvbnMoKSB7XHJcbiAgICBpZiAodGhpcy5idXN5IHx8ICF0aGlzLmlucHV0T3BzLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2RpYWxvZ1NlcnZpY2VcclxuICAgICAgLmNvbmZpcm0oJ0NvbmZpcm0nLCAnUGFyc2Ugb3BlcmF0aW9ucz8nKVxyXG4gICAgICAuc3Vic2NyaWJlKCh5ZXM6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoeWVzKSB7XHJcbiAgICAgICAgICB0aGlzLmJ1c3kgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5wYXJzZUVycm9yID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgIHRoaXMuX2FwaS5wYXJzZU9wZXJhdGlvbnModGhpcy5pbnB1dE9wcy52YWx1ZSEpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6ICh3cmFwcGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IFsuLi50aGlzLm9wZXJhdGlvbnMudmFsdWVdO1xyXG4gICAgICAgICAgICAgIG9wZXJhdGlvbnMucHVzaCguLi53cmFwcGVyLnJlc3VsdCEpO1xyXG4gICAgICAgICAgICAgIHRoaXMub3BlcmF0aW9ucy5zZXRWYWx1ZShvcGVyYXRpb25zKTtcclxuICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbnMubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld0RhdGEoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucGFyc2VFcnJvciA9IGVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5idXN5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyT3BlcmF0aW9ucygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RpYWxvZ1NlcnZpY2VcclxuICAgICAgLmNvbmZpcm0oJ0NvbmZpcm0nLCAnUmVtb3ZlIGFsbCBvcGVyYXRpb25zPycpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHllczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmICh5ZXMpIHtcclxuICAgICAgICAgIHRoaXMucmVzdWx0T3BlcmF0aW9uSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbnMucmVzZXQoKTtcclxuICAgICAgICAgIHRoaXMub3BlcmF0aW9ucy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgdGhpcy5vcGVyYXRpb25zLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlVmlld0RhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uT3BlcmF0aW9uUHJldmlldyhvcGVyYXRpb246IENoYXJDaGFpbk9wZXJhdGlvbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3ByZXZpZXdpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcHJldmlld2luZyA9IHRydWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVWaWV3RGF0YShvcGVyYXRpb24pO1xyXG4gICAgICB0aGlzLl9wcmV2aWV3aW5nID0gZmFsc2U7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBydW5UbyhpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuZ2V0U25hcHNob3QoKTtcclxuICAgIGlmICghc25hcHNob3QudGV4dCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBvcGVyYXRpb25zID0gdGhpcy5vcGVyYXRpb25zLnZhbHVlLnNsaWNlKDAsIGluZGV4ICsgMSk7XHJcbiAgICB0aGlzLmJ1c3kgPSB0cnVlO1xyXG4gICAgdGhpcy5fYXBpLnJ1bk9wZXJhdGlvbnMoc25hcHNob3QudGV4dCBhcyBDaGFyTm9kZVtdLCBvcGVyYXRpb25zKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAod3JhcHBlcikgPT4ge1xyXG4gICAgICAgIGlmICh3cmFwcGVyLmVycm9yKSB7XHJcbiAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuKHdyYXBwZXIuZXJyb3IsICdPSycpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlc3VsdCA9IHdyYXBwZXIucmVzdWx0ITtcclxuICAgICAgICAvLyBUT0RPIHVwZGF0ZSB2aWV3XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVWaWV3RGF0YShcclxuICAgICAgICAvLyAgIHVuZGVmaW5lZCxcclxuICAgICAgICAvLyAgIHNuYXBzaG90LFxyXG4gICAgICAgIC8vICAgdGhpcy5vcGVyYXRpb25zLnZhbHVlW2luZGV4XS5vdXRwdXRUYWdcclxuICAgICAgICAvLyApO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgdGhpcy5fc25hY2tiYXIub3BlbignRXJyb3IgcnVubmluZyBvcGVyYXRpb25zJywgJ09LJyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5idXN5ID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblN0ZXBQaWNrKHN0ZXA6IENoYWluT3BlcmF0aW9uQ29udGV4dFN0ZXApOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5yZXN1bHQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN1bHRPcGVyYXRpb25JZCA9IHN0ZXAub3BlcmF0aW9uLmlkO1xyXG5cclxuICAgIC8vIGdldCBzbmFwc2hvdCBmb3IgcHJldmlldyBieSB1cGRhdGluZyBpdHMgdGV4dCBhbmRcclxuICAgIC8vIHJlbW92aW5nIG9wZXJhdGlvbnMgcGFzdCB0aGUgbGFzdCBleGVjdXRlZFxyXG4gICAgY29uc3Qgc3RlcE5vZGVzID0gdGhpcy5yZXN1bHQudGFnZ2VkTm9kZXNbc3RlcC5vdXRwdXRUYWddO1xyXG5cclxuICAgIC8vIHdlIGFsd2F5cyBkaXNwbGF5IHRoZSBvcmlnaW5hbCBiYXNlIHRleHQsIGp1c3QgdXBkYXRpbmdcclxuICAgIC8vIGl0cyBub2RlcyBmZWF0dXJlcyB0byB0aG9zZSBvZiB0aGUgcGlja2VkIHN0ZXAsIGFuZCBhZGRpbmdcclxuICAgIC8vIG5ldyBub2RlcyBpZiB0aGV5IGFyZSBub3QgaW4gdGhlIG9yaWdpbmFsIHRleHQuIEl0IGlzIGFzc3VtZWRcclxuICAgIC8vIHRoYXQgdGhlc2UgbmV3IG5vZGVzIGhhdmUgYSBtYW51YWxseSBzZXQgcG9zaXRpb24uXHJcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuZ2V0U25hcHNob3QoKTtcclxuICAgIGNvbnN0IG5vZGVzOiBDaGFyTm9kZVtdID0gZGVlcENvcHkoc25hcHNob3QudGV4dCBhcyBDaGFyTm9kZVtdKTtcclxuICAgIGZvciAoY29uc3Qgc24gb2Ygc3RlcE5vZGVzKSB7XHJcbiAgICAgIGNvbnN0IGkgPSBub2Rlcy5maW5kSW5kZXgoKG4pID0+IG4uaWQgPT09IHNuLmlkKTtcclxuICAgICAgaWYgKGkgPiAtMSkge1xyXG4gICAgICAgIG5vZGVzW2ldLmZlYXR1cmVzID0gc24uZmVhdHVyZXM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbm9kZXMucHVzaChzbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBmaW5kIG1heCBJRCBpbiBzbmFwc2hvdC50ZXh0ICg9b3JpZ2luYWwpIG5vZGVzLFxyXG4gICAgLy8gc28gdGhhdCBhbnkgSUQgZ3JlYXRlciB0aGFuIGl0IGJlbG9uZ3MgdG8gbmV3IG5vZGVzXHJcbiAgICBjb25zdCBtYXhPcmlnaW5hbElkID0gKHNuYXBzaG90LnRleHQgYXMgQ2hhck5vZGVbXSkucmVkdWNlKFxyXG4gICAgICAobWF4LCBuKSA9PiBNYXRoLm1heChtYXgsIG4uaWQpLFxyXG4gICAgICAwXHJcbiAgICApO1xyXG5cclxuICAgIC8vIGFwcGVuZCBub2RlcyBpbnRyb2R1Y2VkIGJlZm9yZSB0aGUgcGlja2VkIHN0ZXAgaWYgYW55XHJcbiAgICAvLyAodGhvc2UgaW50cm9kdWNlZCBieSB0aGUgcGlja2VkIHN0ZXAgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQpXHJcbiAgICBjb25zdCBzdGVwSW5kZXggPSB0aGlzLnJlc3VsdC5zdGVwcy5pbmRleE9mKHN0ZXApO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGVwSW5kZXg7IGkrKykge1xyXG4gICAgICBjb25zdCBzdGVwTm9kZXMgPSB0aGlzLnJlc3VsdC50YWdnZWROb2Rlc1t0aGlzLnJlc3VsdC5zdGVwc1tpXS5vdXRwdXRUYWddO1xyXG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygc3RlcE5vZGVzKSB7XHJcbiAgICAgICAgaWYgKG4uaWQgPiBtYXhPcmlnaW5hbElkICYmICFub2Rlcy5maW5kKCh4KSA9PiB4LmlkID09PSBuLmlkKSkge1xyXG4gICAgICAgICAgbm9kZXMucHVzaChuKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzbmFwc2hvdC50ZXh0ID0gbm9kZXM7XHJcbiAgICBjb25zdCBpID0gc25hcHNob3Qub3BlcmF0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IHN0ZXAub3BlcmF0aW9uLmlkKTtcclxuICAgIGlmIChpID4gLTEpIHtcclxuICAgICAgc25hcHNob3Qub3BlcmF0aW9ucyA9IHNuYXBzaG90Lm9wZXJhdGlvbnMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVWaWV3RGF0YSh1bmRlZmluZWQsIHNuYXBzaG90LCBzdGVwLm91dHB1dFRhZyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25WaXN1YWxFdmVudChldmVudDogQ3VzdG9tRXZlbnQ8R3ZlVmlzdWFsRXZlbnQ+KTogdm9pZCB7XHJcbiAgICBjb25zdCBkID0gZXZlbnQuZGV0YWlsO1xyXG4gICAgaWYgKGQuZXZlbnQudHlwZSA9PT0gJ21vdXNlb3ZlcicpIHtcclxuICAgICAgY29uc3QgdmlzdWFsID0gZC5zb3VyY2U7XHJcbiAgICAgIGNvbnN0IHNiOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICBzYi5wdXNoKCcjJyArIHZpc3VhbC5pZCk7XHJcbiAgICAgIHNiLnB1c2goYCAoJHt2aXN1YWwudHlwZX0pYCk7XHJcbiAgICAgIGlmICh2aXN1YWwuZGF0YT8ubGFiZWwpIHtcclxuICAgICAgICBzYi5wdXNoKCc6ICcpO1xyXG4gICAgICAgIHNiLnB1c2godmlzdWFsLmRhdGEubGFiZWwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh2aXN1YWwuZGF0YT8uZmVhdHVyZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgIHNiLnB1c2goXHJcbiAgICAgICAgICB2aXN1YWwuZGF0YS5mZWF0dXJlc1xyXG4gICAgICAgICAgICAubWFwKChmOiBGZWF0dXJlKSA9PiBgJHtmLm5hbWV9PSR7Zi52YWx1ZX1gKVxyXG4gICAgICAgICAgICAuam9pbignXFxuJylcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudmlzdWFsSW5mbyA9IHNiLmpvaW4oJycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uSGVpZ2h0c0NoYW5nZShoZWlnaHRzOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+IHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICB0aGlzLmxuSGVpZ2h0cy5zZXRWYWx1ZShoZWlnaHRzIHx8IG51bGwpO1xyXG4gICAgdGhpcy5sbkhlaWdodHMubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMubG5IZWlnaHRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc25hcHNob3RDYW5jZWwuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uU25hcHNob3RSZW5kZXIoZXZlbnQ6IEN1c3RvbUV2ZW50PFNuYXBzaG90Vmlld1JlbmRlckV2ZW50Pik6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVuZGVyZXIgPSAoZXZlbnQuZGV0YWlsIGFzIFNuYXBzaG90Vmlld1JlbmRlckV2ZW50KS5yZW5kZXJlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVSdWxlcnMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucnVsZXJzID0gdGhpcy5fcmVuZGVyZXIudG9nZ2xlUnVsZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNuYXBzaG90KCk6IFNuYXBzaG90IHtcclxuICAgIGNvbnN0IHNuYXBzaG90OiBTbmFwc2hvdCA9IHtcclxuICAgICAgc2l6ZToge1xyXG4gICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLnZhbHVlLFxyXG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQudmFsdWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0eWxlOiB0aGlzLnN0eWxlLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgZGVmczogdGhpcy5kZWZzLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgdGV4dDogdGhpcy5iYXNlVGV4dC52YWx1ZSEsXHJcbiAgICAgIHRleHRTdHlsZTogdGhpcy50ZXh0U3R5bGUudmFsdWUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICB0ZXh0T3B0aW9uczoge1xyXG4gICAgICAgIGxpbmVIZWlnaHRPZmZzZXQ6IHRoaXMubGluZUhlaWdodE9mZnNldC52YWx1ZSxcclxuICAgICAgICBtaW5MaW5lSGVpZ2h0czogdGhpcy5sbkhlaWdodHMudmFsdWUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGNoYXJTcGFjaW5nT2Zmc2V0OiB0aGlzLmNoYXJTcGFjaW5nT2Zmc2V0LnZhbHVlLFxyXG4gICAgICAgIHNwY1dpZHRoT2Zmc2V0OiB0aGlzLnNwY1dpZHRoT2Zmc2V0LnZhbHVlLFxyXG4gICAgICAgIG9mZnNldDoge1xyXG4gICAgICAgICAgeDogdGhpcy5vZmZzZXRYLnZhbHVlLFxyXG4gICAgICAgICAgeTogdGhpcy5vZmZzZXRZLnZhbHVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIG9wZXJhdGlvbnM6IFsuLi50aGlzLm9wZXJhdGlvbnMudmFsdWVdLFxyXG4gICAgICBvcFN0eWxlOiB0aGlzLm9wU3R5bGUudmFsdWUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICB0aW1lbGluZXM6IHt9LCAvLyBUT0RPXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGltYWdlXHJcbiAgICBpZiAodGhpcy5pbWFnZVVybC52YWx1ZSkge1xyXG4gICAgICBzbmFwc2hvdC5pbWFnZSA9IHtcclxuICAgICAgICB1cmw6IHRoaXMuaW1hZ2VVcmwudmFsdWUsXHJcbiAgICAgICAgb3BhY2l0eTogdGhpcy5pbWFnZU9wYWNpdHkudmFsdWUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICB9O1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5pbWFnZVgudmFsdWUgfHxcclxuICAgICAgICB0aGlzLmltYWdlWS52YWx1ZSB8fFxyXG4gICAgICAgIHRoaXMuaW1hZ2VXaWR0aC52YWx1ZSB8fFxyXG4gICAgICAgIHRoaXMuaW1hZ2VIZWlnaHQudmFsdWVcclxuICAgICAgKSB7XHJcbiAgICAgICAgc25hcHNob3QuaW1hZ2UuY2FudmFzID0ge1xyXG4gICAgICAgICAgeDogdGhpcy5pbWFnZVgudmFsdWUsXHJcbiAgICAgICAgICB5OiB0aGlzLmltYWdlWS52YWx1ZSxcclxuICAgICAgICAgIHdpZHRoOiB0aGlzLmltYWdlV2lkdGgudmFsdWUsXHJcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMuaW1hZ2VIZWlnaHQudmFsdWUsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzbmFwc2hvdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkIHx8IHRoaXMubm9TYXZlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3NuYXBzaG90ID0gdGhpcy5nZXRTbmFwc2hvdCgpO1xyXG4gICAgdGhpcy5zbmFwc2hvdENoYW5nZS5lbWl0KHRoaXMuX3NuYXBzaG90KTtcclxuICB9XHJcbn1cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJzYXZlKClcIj5cclxuICA8bWF0LXRhYi1ncm91cD5cclxuICAgIDwhLS0gdGV4dCAtLT5cclxuICAgIDxtYXQtdGFiIGxhYmVsPVwidGV4dFwiPlxyXG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBbZXhwYW5kZWRdPVwiIWJhc2VUZXh0LnZhbHVlXCI+XHJcbiAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT4gYmFzZSB0ZXh0IDwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgPGd2ZS1iYXNlLXRleHQtZWRpdG9yXHJcbiAgICAgICAgICBbdGV4dF09XCJiYXNlVGV4dC52YWx1ZVwiXHJcbiAgICAgICAgICAodGV4dENoYW5nZSk9XCJvblRleHRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgICAgICAgICAgPCEtLSBvZmZzZXRYIC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1uclwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+WCBvZmZzZXQ8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJvZmZzZXRYXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiWCBvZmZzZXRcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgICAgICA8IS0tIG9mZnNldFkgLS0+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LW5yXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5ZIG9mZnNldDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIm9mZnNldFlcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJZIG9mZnNldFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gbGluZUhlaWdodE9mZnNldCAtLT5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXQtbnJcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPmxuIGgtb2Zmc2V0PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwibGluZUhlaWdodE9mZnNldFwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImxuIGgtb2Zmc2V0XCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBjaGFyU3BhY2luZ09mZnNldCAtLT5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXQtbnJcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPmNoYXIgc3BhY2luZzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNoYXJTcGFjaW5nT2Zmc2V0XCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiY2hhciBzcGFjaW5nXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBzcGNXaWR0aE9mZnNldCAtLT5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXQtbnJcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPnNwYyB3LW9mZnNldDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNwY1dpZHRoT2Zmc2V0XCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwic3BjIHctb2Zmc2V0XCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8IS0tIG1pbkxpbmVIZWlnaHRzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxndmUtbG4taGVpZ2h0cy1lZGl0b3JcclxuICAgICAgICAgICAgICAgIFtsaW5lQ291bnRdPVwibGluZUNvdW50XCJcclxuICAgICAgICAgICAgICAgIFtoZWlnaHRzXT1cImxuSGVpZ2h0cy52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAoaGVpZ2h0c0NoYW5nZSk9XCJvbkhlaWdodHNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gdGV4dFN0eWxlIC0tPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibG9uZy10ZXh0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPnRleHQgc3R5bGU8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwidGV4dFN0eWxlXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwidGV4dCBzdHlsZVwiXHJcbiAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2ZpZWxkc2V0PlxyXG4gICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBvcGVyYXRpb25zIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJvcGVyYXRpb25zXCI+XHJcbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGlkPVwiZ2VuZXJhbFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICAgICAgICAgIDwhLS0gd2lkdGggLS0+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LW5yXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD53aWR0aDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwid2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ3aWR0aFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gaGVpZ2h0IC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1uclwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+aGVpZ2h0PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBtaW49XCIwXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJoZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJoZWlnaHRcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgICAgICA8IS0tIGFkZCBvcCAtLT5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtcHJpbWFyeSByaWdodFwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFiYXNlVGV4dC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXROZXdPcGVyYXRpb24oKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+YWRkX2NpcmNsZTwvbWF0LWljb24+IG9wZXJhdGlvblxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIG9wcyAtLT5cclxuICAgICAgICA8ZGl2IGlkPVwib3BzXCI+XHJcbiAgICAgICAgICA8IS0tIG9wZXJhdGlvbnMgbGlzdCAtLT5cclxuICAgICAgICAgIEBpZiAob3BlcmF0aW9ucy52YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgICAgIDx0YWJsZSBpZD1cImxpc3RcIj5cclxuICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPklEPC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD50eXBlPC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD5hdDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+cnVuPC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD52YWx1ZTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+aXRhZzwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+b3RhZzwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+Z2lkPC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD5mZWF0czwvdGg+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgIEBmb3IgKG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zLnZhbHVlOyB0cmFjayBvcGVyYXRpb24uaWQ7IGxldFxyXG4gICAgICAgICAgICAgIGluZGV4PSRpbmRleCkge1xyXG4gICAgICAgICAgICAgIDx0clxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBzZWxlY3RlZDogb3BlcmF0aW9uLmlkID09PSByZXN1bHRPcGVyYXRpb25JZCB9XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZWRpdGVkOiBvcGVyYXRpb24uaWQgPT09IGVkaXRlZE9wPy5pZCB9XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJmaXQtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBlZGl0IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdE9wZXJhdGlvbihpbmRleClcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJFZGl0IG9wZXJhdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGRlbGV0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZU9wZXJhdGlvbihpbmRleClcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEZWxldGUgb3BlcmF0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC13YXJuXCI+ZGVsZXRlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gcnVuIHRvIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJhY2NlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW5UbyhpbmRleClcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJSdW4gdG8gdGhpcyBvcGVyYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWFjY2VudFwiPnN1YnNjcmlwdGlvbnM8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3sgb3BlcmF0aW9uLmlkIH19PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57eyBvcGVyYXRpb24udHlwZSB8IGZsYXRMb29rdXAgOiBvcFR5cGVNYXAgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7IG9wZXJhdGlvbi5hdCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3sgb3BlcmF0aW9uLnJ1biB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3sgb3BlcmF0aW9uLnZhbHVlIH19PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57eyBvcGVyYXRpb24uaW5wdXRUYWcgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7IG9wZXJhdGlvbi5vdXRwdXRUYWcgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7IG9wZXJhdGlvbi5ncm91cElkIH19PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57eyBvcGVyYXRpb24uZmVhdHVyZXM/Lmxlbmd0aCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIDwhLS0gb3BlcmF0aW9uIGVkaXRvciAtLT5cclxuICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtleHBhbmRlZF09XCJlZGl0ZWRPcFwiIFtkaXNhYmxlZF09XCIhZWRpdGVkT3BcIj5cclxuICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+b3BlcmF0aW9uIHt7IGVkaXRlZE9wPy5pZCB9fTwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgICAgICAgPGd2ZS1jaGFpbi1vcGVyYXRpb24tZWRpdG9yXHJcbiAgICAgICAgICAgICAgICBbb3BlcmF0aW9uXT1cImVkaXRlZE9wXCJcclxuICAgICAgICAgICAgICAgIChvcGVyYXRpb25DYW5jZWwpPVwib25PcGVyYXRpb25DYW5jZWwoKVwiXHJcbiAgICAgICAgICAgICAgICAob3BlcmF0aW9uQ2hhbmdlKT1cIm9uT3BlcmF0aW9uQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG9wZXJhdGlvblByZXZpZXcpPVwib25PcGVyYXRpb25QcmV2aWV3KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XHJcbiAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcblxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImJ1c3lcIiAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBvcFN0eWxlIC0tPlxyXG4gICAgICAgICAgPGRpdiBpZD1cIm9wU3R5bGVcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibG9uZy10ZXh0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPm9wZXJhdGlvbnMgc3R5bGU8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwib3BTdHlsZVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIm9wZXJhdGlvbnMgc3R5bGVcIlxyXG4gICAgICAgICAgICAgID48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBiYXRjaCBvcHMgLS0+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPmJhdGNoIG9wZXJhdGlvbnM8L21hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgIDxmaWVsZHNldD5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJiYXRjaC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImJhdGNoLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5vcGVyYXRpb25zPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaW5wdXRPcHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwib3BlcmF0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cz1cIjhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXdhcm5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlJlbW92ZSBhbGwgdGhlIG9wZXJhdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW9wZXJhdGlvbnMudmFsdWUubGVuZ3RoIHx8IGJ1c3lcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJPcGVyYXRpb25zKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJQYXJzZSB0ZXh0IGFuZCBhZGQgcmVzdWx0cyB0byB0aGUgb3BlcmF0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaW5wdXRPcHMudmFsdWUgfHwgYnVzeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYXJzZU9wZXJhdGlvbnMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoIGFkZFxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHBhcnNlRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIj57eyBwYXJzZUVycm9yIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImJhdGNoLWhlbHBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+cmVwbGFjZTwvc3Ryb25nPjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+QVR4UlVOPHN0cm9uZz49PC9zdHJvbmc+XCJWQUxVRVwiPC9jb2RlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5kZWxldGU8L3N0cm9uZz46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkFUeFJVTjxzdHJvbmc+LTwvc3Ryb25nPjwvY29kZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+YWRkLWJlZm9yZTwvc3Ryb25nPjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+QVR4UlVOPHN0cm9uZz4rWzwvc3Ryb25nPlwiVkFMVUVcIjwvY29kZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+YWRkLWFmdGVyPC9zdHJvbmc+OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5BVHhSVU48c3Ryb25nPitdPC9zdHJvbmc+XCJWQUxVRVwiPC9jb2RlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5tb3ZlLWJlZm9yZTwvc3Ryb25nPjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+QVR4UlVOPHN0cm9uZz4mZ3Q7Wzwvc3Ryb25nPlRPPC9jb2RlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5tb3ZlLWFmdGVyPC9zdHJvbmc+OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5BVHhSVU48c3Ryb25nPiZndDtdPC9zdHJvbmc+VE88L2NvZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnN3YXA8L3N0cm9uZz46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkFUeFJVTjxzdHJvbmc+Jmx0OyZndDs8L3N0cm9uZz5UT3hSVU48L2NvZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPmFubm90YXRlPC9zdHJvbmc+OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5BVHhSVU48c3Ryb25nPjo8L3N0cm9uZz48L2NvZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIGFsbCB0aGUgb3BlcmF0aW9uczo8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPGNvZGU+KElUQUc6T1RBRyk8L2NvZGU+IHRvIGRlZmluZSBpbnB1dCBhbmQvb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHRhZ3MsIHNlcGFyYXRlZCBieSBjb2xvbi5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQgPGNvZGU+JiN4NDA7PC9jb2RlPiB0byBBVCB0byB1c2UgY2hhcmFjdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZXMgKDAtTikgcmF0aGVyIHRoYW4gSURzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaT5SVU4gKHdoZXJlIGFwcGxpY2FibGUpIGRlZmF1bHRzIHRvIDEuPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGZlYXR1cmVzIGxpa2UgPGNvZGU+W05BTUUgT1BFUkFUT1IgVkFMVUVdPC9jb2RlPixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGVkIGJ5IHNwYWNlLCB3aGVyZTpcclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8b2w+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FIGlzIGFuIGFyYml0cmFyeSBzdHJpbmcuIFByZWZpeGVzOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPio8L2NvZGU+PWdsb2JhbCBmZWF0dXJlcywgPGNvZGU+ITwvY29kZT49cmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSAobm8gdmFsdWUpLiBTdWZmaXhlczpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5ePC9jb2RlPj1zaG9ydC1saXZlZCAobGlrZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPip2ZXJzaW9uXj1hbHBoYTwvY29kZT4pLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgT1BFUkFUT1IgaXMgPGNvZGU+PTwvY29kZT4gKG11bHRpcGxlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT46PTwvY29kZT4gKHNpbmdsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+PT08L2NvZGU+IChmaXJzdC1zaW5nbGUpLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUgaXMgYSBzdHJpbmcuIElmIGl0IGluY2x1ZGVzIHNwYWNlcywgd3JhcCBpdCBpblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlwiXCI8L2NvZGU+LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9vbD5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZmllbGRzZXQ+XHJcbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIHJlc3VsdCAtLT5cclxuICAgICAgICBAaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIDxmaWVsZHNldCBpZD1cInJlc3VsdFwiPlxyXG4gICAgICAgICAgPGxlZ2VuZD5yZXN1bHQ8L2xlZ2VuZD5cclxuICAgICAgICAgIDxndmUtY2hhaW4tcmVzdWx0LXZpZXdcclxuICAgICAgICAgICAgW3Jlc3VsdF09XCJyZXN1bHRcIlxyXG4gICAgICAgICAgICAoc3RlcFBpY2spPVwib25TdGVwUGljaygkZXZlbnQpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtdGFiPlxyXG5cclxuICAgIDwhLS0gaW1hZ2UgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImltYWdlXCI+XHJcbiAgICAgIDxkaXYgaWQ9XCJpbWFnZVwiPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJpbWFnZS1jdGxcIj5cclxuICAgICAgICAgIDwhLS0gdXJsIC0tPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibG9uZy10ZXh0XCI+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+VVJMPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiaW1hZ2VVcmxcIiAvPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICAgICAgICA8IS0tIHggLS0+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LW5yXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5YPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaW1hZ2VYXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiWFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPCEtLSB5IC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1uclwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+WTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImltYWdlWVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIllcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICAgICAgICA8IS0tIHdpZHRoIC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1uclwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+d2lkdGg8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIG1pbj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImltYWdlV2lkdGhcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwhLS0gaGVpZ2h0IC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1uclwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+aGVpZ2h0PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBtaW49XCIwXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJpbWFnZUhlaWdodFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSBkZWZzIC0tPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibG9uZy10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5kZWZzPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJkZWZzXCIgcm93cz1cIjNcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBpZD1cImltYWdlLXZpZXdcIj5cclxuICAgICAgICAgIEBpZiAoaW1hZ2VVcmwudmFsdWUpIHtcclxuICAgICAgICAgIDxpbWcgYWx0PVwiYmFja2dyb3VuZFwiIFtzcmNdPVwiaW1hZ2VVcmwudmFsdWVcIiB3aWR0aD1cIjYwMFwiIC8+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtdGFiPlxyXG4gIDwvbWF0LXRhYi1ncm91cD5cclxuXHJcbiAgPCEtLSBwcmV2aWV3IC0tPlxyXG4gIEBpZiAoc25hcHNob3QpIHtcclxuICA8ZmllbGRzZXQgaWQ9XCJwcmV2aWV3XCI+XHJcbiAgICA8bGVnZW5kIGNsYXNzPVwiYnV0dG9uLXJvd1wiPlxyXG4gICAgICA8c3Bhbj57eyB2aWV3VGl0bGUgfX08L3NwYW4+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIG1hdFRvb2x0aXA9XCJSZWZyZXNoIHByZXZpZXdcIlxyXG4gICAgICAgIChjbGljayk9XCJ1cGRhdGVWaWV3RGF0YSgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+cmVmcmVzaDwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9sZWdlbmQ+XHJcbiAgICA8Z3ZlLXNuYXBzaG90LXZpZXdcclxuICAgICAgW2RhdGFdPVwidmlld0RhdGFcIlxyXG4gICAgICAoc25hcHNob3RSZW5kZXIpPVwib25TbmFwc2hvdFJlbmRlcigkYW55KCRldmVudCkpXCJcclxuICAgICAgKHZpc3VhbEV2ZW50KT1cIm9uVmlzdWFsRXZlbnQoJGFueSgkZXZlbnQpKVwiXHJcbiAgICAvPlxyXG4gICAgPGRpdj5cclxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICBtYXRUb29sdGlwPVwiVG9nZ2xlIHJ1bGVyc1wiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwicnVsZXJzXCJcclxuICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVJ1bGVycygpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+c3RyYWlnaHRlbjwvbWF0LWljb24+XHJcbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIEBpZiAodmlzdWFsSW5mbykge1xyXG4gICAgPGRpdiBpZD1cInZpc3VhbC1pbmZvXCI+e3sgdmlzdWFsSW5mbyB9fTwvZGl2PlxyXG4gICAgfVxyXG4gIDwvZmllbGRzZXQ+XHJcbiAgfVxyXG5cclxuICA8IS0tYnV0dG9ucyAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3ctY2VudGVyXCI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cIm1hdC13YXJuXCJcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJEaXNjYXJkIGNoYW5nZXNcIlxyXG4gICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICAgIGNsb3NlXHJcbiAgICA8L2J1dHRvbj5cclxuICAgIEBpZiAoIW5vU2F2ZSkge1xyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwic3VibWl0XCJcclxuICAgICAgY2xhc3M9XCJtYXQtcHJpbWFyeVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiU2F2ZSBjaGFuZ2VzXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZCB8fCBmb3JtLnByaXN0aW5lXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICAgIHNhdmVcclxuICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcbiJdfQ==
|
|
558
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9zbmFwc2hvdC1lZGl0b3Ivc25hcHNob3QtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9zbmFwc2hvdC1lZGl0b3Ivc25hcHNob3QtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxXQUFXLEVBRVgsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxF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LENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsTUFB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TTtnQkFPUyxjQUFjO3NCQUQ3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvblRvZ2dsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbi10b2dnbGUnO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIsIE1hdFNuYWNrQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuaW1wb3J0IHsgTWF0VGFic01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcblxyXG5pbXBvcnQgeyBjdXN0b21BbHBoYWJldCB9IGZyb20gJ25hbm9pZCc7XHJcblxyXG5pbXBvcnQgeyBOZ1Rvb2xzTW9kdWxlLCBkZWVwQ29weSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ2hhckNoYWluT3BlcmF0aW9uLFxyXG4gIENoYXJOb2RlLFxyXG4gIERFRkFVTFRfU1ZHX0JBU0VfVEVYVF9PUFRJT05TLFxyXG4gIEZlYXR1cmUsXHJcbiAgR3ZlQW5pbWF0aW9uVGltZWxpbmUsXHJcbiAgR3ZlVmlzdWFsRXZlbnQsXHJcbiAgU25hcHNob3QsXHJcbiAgU25hcHNob3RWaWV3RGF0YSxcclxuICBTbmFwc2hvdFZpZXdSZW5kZXJFdmVudCxcclxuICBTbmFwc2hvdFZpZXdTZXJ2aWNlLFxyXG59IGZyb20gJ0BteXJtaWRvbi9ndmUtc25hcHNob3Qtdmlldyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VUZXh0Vmlld0NvbXBvbmVudCxcclxuICBWYXJCYXNlVGV4dFJhbmdlLFxyXG59IGZyb20gJy4uL2Jhc2UtdGV4dC12aWV3L2Jhc2UtdGV4dC12aWV3LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENoYWluT3BlcmF0aW9uRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hhaW4tb3BlcmF0aW9uLWVkaXRvci9jaGFpbi1vcGVyYXRpb24tZWRpdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQ2hhaW5PcGVyYXRpb25Db250ZXh0U3RlcCxcclxuICBDaGFyQ2hhaW5SZXN1bHQsXHJcbiAgR3ZlQXBpU2VydmljZSxcclxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ndmUtYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDaGFpblJlc3VsdFZpZXdDb21wb25lbnQgfSBmcm9tICcuLi9jaGFpbi1yZXN1bHQtdmlldy9jaGFpbi1yZXN1bHQtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMbkhlaWdodHNFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuLi9sbi1oZWlnaHRzLWVkaXRvci9sbi1oZWlnaHRzLWVkaXRvci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCYXNlVGV4dEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UtdGV4dC1lZGl0b3IvYmFzZS10ZXh0LWVkaXRvci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBbmltYXRpb25UaW1lbGluZVNldENvbXBvbmVudCB9IGZyb20gJy4uL2FuaW1hdGlvbi10aW1lbGluZS1zZXQvYW5pbWF0aW9uLXRpbWVsaW5lLXNldC5jb21wb25lbnQnO1xyXG5cclxuY29uc3QgVklFV19USVRMRSA9ICdwcmV2aWV3JztcclxuXHJcbi8qKlxyXG4gKiBBIGNvbXBvbmVudCB0byBlZGl0IGEgdGV4dCBzbmFwc2hvdC5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZ3ZlLXNuYXBzaG90LWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdEV4cGFuc2lvbk1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlLFxyXG4gICAgTWF0U25hY2tCYXJNb2R1bGUsXHJcbiAgICBNYXRUYWJzTW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE5nVG9vbHNNb2R1bGUsXHJcbiAgICBCYXNlVGV4dEVkaXRvckNvbXBvbmVudCxcclxuICAgIEJhc2VUZXh0Vmlld0NvbXBvbmVudCxcclxuICAgIENoYWluT3BlcmF0aW9uRWRpdG9yQ29tcG9uZW50LFxyXG4gICAgQ2hhaW5SZXN1bHRWaWV3Q29tcG9uZW50LFxyXG4gICAgTG5IZWlnaHRzRWRpdG9yQ29tcG9uZW50LFxyXG4gICAgQW5pbWF0aW9uVGltZWxpbmVTZXRDb21wb25lbnQsXHJcbiAgXSxcclxuICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NuYXBzaG90LWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3NuYXBzaG90LWVkaXRvci5jb21wb25lbnQuY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNuYXBzaG90RWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9uYW5vaWQgPSBjdXN0b21BbHBoYWJldCgnMTIzNDU2Nzg5MGFiY2RlZicsIDEwKTtcclxuICBwcml2YXRlIF9zbmFwc2hvdD86IFNuYXBzaG90O1xyXG4gIHByaXZhdGUgX3JlbmRlcmVyPzogU25hcHNob3RWaWV3U2VydmljZTtcclxuICBwcml2YXRlIF9wcmV2aWV3aW5nPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNuYXBzaG90IHRvIGVkaXQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHNuYXBzaG90KCk6IFNuYXBzaG90IHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9zbmFwc2hvdDtcclxuICB9XHJcbiAgcHVibGljIHNldCBzbmFwc2hvdCh2YWx1ZTogU25hcHNob3QgfCB1bmRlZmluZWQgfCBudWxsKSB7XHJcbiAgICBpZiAodGhpcy5fc25hcHNob3QgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3NuYXBzaG90ID0gdmFsdWUgfHwgdW5kZWZpbmVkO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtKHRoaXMuX3NuYXBzaG90KTtcclxuICAgIHRoaXMudXBkYXRlVmlld0RhdGEoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBiYXRjaCBvcGVyYXRpb25zIHRleHQgdG8gc2V0IGZvciB0aGUgZWRpdG9yLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGJhdGNoT3BzPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBUcnVlIHRvIGRpc2FibGUgc2F2aW5nLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG5vU2F2ZT86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBzYXZlcyB0aGUgZWRpdGVkIHNuYXBzaG90LlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBzbmFwc2hvdENoYW5nZTogRXZlbnRFbWl0dGVyPFNuYXBzaG90PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgdGhlIHNuYXBzaG90IGVkaXRpbmcuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IHNuYXBzaG90Q2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvLyBnZW5lcmFsXHJcbiAgcHVibGljIHdpZHRoOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBoZWlnaHQ6IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIHN0eWxlOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICAvLyBiYXNlIHRleHRcclxuICBwdWJsaWMgYmFzZVRleHQ6IEZvcm1Db250cm9sPENoYXJOb2RlW10gfCBzdHJpbmc+O1xyXG4gIHB1YmxpYyBvZmZzZXRYOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBvZmZzZXRZOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBsaW5lSGVpZ2h0T2Zmc2V0OiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBsbkhlaWdodHM6IEZvcm1Db250cm9sPFJlY29yZDxudW1iZXIsIG51bWJlcj4gfCBudWxsPjtcclxuICBwdWJsaWMgY2hhclNwYWNpbmdPZmZzZXQ6IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIHNwY1dpZHRoT2Zmc2V0OiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyB0ZXh0U3R5bGU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIC8vIG9wZXJhdGlvbnNcclxuICBwdWJsaWMgb3BlcmF0aW9uczogRm9ybUNvbnRyb2w8Q2hhckNoYWluT3BlcmF0aW9uW10+O1xyXG4gIHB1YmxpYyBpbnB1dE9wczogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIG9wU3R5bGU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgLy8gaW1hZ2UgYW5kIGRlZnNcclxuICBwdWJsaWMgaW1hZ2VVcmw6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBpbWFnZU9wYWNpdHk6IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIGltYWdlWDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICBwdWJsaWMgaW1hZ2VZOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBpbWFnZVdpZHRoOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBpbWFnZUhlaWdodDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICBwdWJsaWMgZGVmczogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgLy8gdGltZWxpbmVzXHJcbiAgcHVibGljIHRpbWVsaW5lczogRm9ybUNvbnRyb2w8R3ZlQW5pbWF0aW9uVGltZWxpbmVbXT47XHJcblxyXG4gIHB1YmxpYyB0ZXh0UmFuZ2U/OiBWYXJCYXNlVGV4dFJhbmdlO1xyXG4gIHB1YmxpYyBlZGl0ZWRPcD86IENoYXJDaGFpbk9wZXJhdGlvbjtcclxuICBwdWJsaWMgZWRpdGVkT3BJbmRleCA9IC0xO1xyXG5cclxuICBwdWJsaWMgb3BUYWdzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHB1YmxpYyBvcEVsZW1lbnRJZHM6IHN0cmluZ1tdID0gW107XHJcbiAgLy8gVE9ETzogYWRkIGNvZGUgdG8gdXBkYXRlIG9wVGFncyBhbmQgb3BFbGVtZW50SWRzXHJcblxyXG4gIHB1YmxpYyBidXN5PzogYm9vbGVhbjtcclxuICBwdWJsaWMgcGFyc2VFcnJvcj86IHN0cmluZztcclxuICBwdWJsaWMgb3BUeXBlTWFwID0ge1xyXG4gICAgMDogJ3JlcGxhY2UnLFxyXG4gICAgMTogJ2RlbGV0ZScsXHJcbiAgICAyOiAnYWRkLWJlZm9yZScsXHJcbiAgICAzOiAnYWRkLWFmdGVyJyxcclxuICAgIDQ6ICdtb3ZlLWJlZm9yZScsXHJcbiAgICA1OiAnbW92ZS1hZnRlcicsXHJcbiAgICA2OiAnc3dhcCcsXHJcbiAgICA3OiAnYW5ub3RhdGUnLFxyXG4gIH07XHJcbiAgcHVibGljIGxpbmVDb3VudCA9IDA7XHJcblxyXG4gIHB1YmxpYyB2aWV3VGl0bGUgPSBWSUVXX1RJVExFO1xyXG4gIHB1YmxpYyB2aWV3RGF0YT86IFNuYXBzaG90Vmlld0RhdGE7XHJcbiAgcHVibGljIHZpc3VhbEluZm8/OiBzdHJpbmc7XHJcbiAgcHVibGljIHJ1bGVycyA9IHRydWU7XHJcbiAgLy8gcnVuIHJlc3VsdFxyXG4gIHB1YmxpYyByZXN1bHQ/OiBDaGFyQ2hhaW5SZXN1bHQ7XHJcbiAgcHVibGljIHJlc3VsdE9wZXJhdGlvbklkPzogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgX2FwaTogR3ZlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zbmFja2JhcjogTWF0U25hY2tCYXJcclxuICApIHtcclxuICAgIC8vIGdlbmVyYWxcclxuICAgIHRoaXMud2lkdGggPSBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPig4MDAsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmhlaWdodCA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KDYwMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuc3R5bGUgPSBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICAvLyBiYXNlIHRleHRcclxuICAgIHRoaXMuYmFzZVRleHQgPSBuZXcgRm9ybUNvbnRyb2w8Q2hhck5vZGVbXSB8IHN0cmluZz4oW10sIHtcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5vZmZzZXRYID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMub2Zmc2V0WSA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KDAsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmxpbmVIZWlnaHRPZmZzZXQgPSBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPihcclxuICAgICAgREVGQVVMVF9TVkdfQkFTRV9URVhUX09QVElPTlMubGluZUhlaWdodE9mZnNldCxcclxuICAgICAgeyBub25OdWxsYWJsZTogdHJ1ZSB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5sbkhlaWdodHMgPSBuZXcgRm9ybUNvbnRyb2w8UmVjb3JkPG51bWJlciwgbnVtYmVyPiB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5jaGFyU3BhY2luZ09mZnNldCA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KDAsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLnNwY1dpZHRoT2Zmc2V0ID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudGV4dFN0eWxlID0gbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG5cclxuICAgIC8vIG9wZXJhdGlvbnNcclxuICAgIHRoaXMub3BlcmF0aW9ucyA9IG5ldyBGb3JtQ29udHJvbDxDaGFyQ2hhaW5PcGVyYXRpb25bXT4oW10sIHtcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuaW5wdXRPcHMgPSBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICB0aGlzLm9wU3R5bGUgPSBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICAvLyBpbWFnZVxyXG4gICAgdGhpcy5pbWFnZVVybCA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKTtcclxuICAgIHRoaXMuaW1hZ2VPcGFjaXR5ID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuaW1hZ2VYID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuaW1hZ2VZID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuaW1hZ2VXaWR0aCA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KDAsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmltYWdlSGVpZ2h0ID0gbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuZGVmcyA9IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKTtcclxuXHJcbiAgICAvLyB0aW1lbGluZXNcclxuICAgIHRoaXMudGltZWxpbmVzID0gbmV3IEZvcm1Db250cm9sPEd2ZUFuaW1hdGlvblRpbWVsaW5lW10+KFtdLCB7XHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5mb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcclxuICAgICAgc3R5bGU6IHRoaXMuc3R5bGUsXHJcbiAgICAgIGJhc2VUZXh0OiB0aGlzLmJhc2VUZXh0LFxyXG4gICAgICBvZmZzZXRYOiB0aGlzLm9mZnNldFgsXHJcbiAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSxcclxuICAgICAgbGluZUhlaWdodE9mZnNldDogdGhpcy5saW5lSGVpZ2h0T2Zmc2V0LFxyXG4gICAgICBsbkhlaWdodHM6IHRoaXMubG5IZWlnaHRzLFxyXG4gICAgICBjaGFyU3BhY2luZ09mZnNldDogdGhpcy5jaGFyU3BhY2luZ09mZnNldCxcclxuICAgICAgc3BjV2lkdGhPZmZzZXQ6IHRoaXMuc3BjV2lkdGhPZmZzZXQsXHJcbiAgICAgIHRleHRTdHlsZTogdGhpcy50ZXh0U3R5bGUsXHJcbiAgICAgIG9wZXJhdGlvbnM6IHRoaXMub3BlcmF0aW9ucyxcclxuICAgICAgaW5wdXRPcHM6IHRoaXMuaW5wdXRPcHMsXHJcbiAgICAgIG9wU3R5bGU6IHRoaXMub3BTdHlsZSxcclxuICAgICAgLy8gaW1hZ2VcclxuICAgICAgaW1hZ2VVcmw6IHRoaXMuaW1hZ2VVcmwsXHJcbiAgICAgIGltYWdlT3BhY2l0eTogdGhpcy5pbWFnZU9wYWNpdHksXHJcbiAgICAgIGltYWdlWDogdGhpcy5pbWFnZVgsXHJcbiAgICAgIGltYWdlWTogdGhpcy5pbWFnZVksXHJcbiAgICAgIGltYWdlV2lkdGg6IHRoaXMuaW1hZ2VXaWR0aCxcclxuICAgICAgaW1hZ2VIZWlnaHQ6IHRoaXMuaW1hZ2VIZWlnaHQsXHJcbiAgICAgIGRlZnM6IHRoaXMuZGVmcyxcclxuICAgICAgLy8gdGltZWxpbmVzXHJcbiAgICAgIHRpbWVsaW5lczogdGhpcy50aW1lbGluZXMsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmJhdGNoT3BzKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRPcHMuc2V0VmFsdWUodGhpcy5iYXRjaE9wcyk7XHJcbiAgICAgIHRoaXMucGFyc2VPcGVyYXRpb25zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlVmlld0RhdGEoXHJcbiAgICBuZXdPcGVyYXRpb24/OiBDaGFyQ2hhaW5PcGVyYXRpb24sXHJcbiAgICBzbmFwc2hvdD86IFNuYXBzaG90LFxyXG4gICAgdGl0bGUgPSBWSUVXX1RJVExFXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygndXBkYXRlIHZpZXcgZGF0YScpO1xyXG4gICAgaWYgKCFzbmFwc2hvdCkge1xyXG4gICAgICBzbmFwc2hvdCA9IHRoaXMuZ2V0U25hcHNob3QoKTtcclxuICAgIH1cclxuICAgIC8vIHVwZGF0ZSBvciBhZGQgbmV3IG9wZXJhdGlvbiBpbiBjb3B5XHJcbiAgICBpZiAobmV3T3BlcmF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gc25hcHNob3Qub3BlcmF0aW9ucy5maW5kSW5kZXgoXHJcbiAgICAgICAgKG9wKSA9PiBvcC5pZCA9PT0gbmV3T3BlcmF0aW9uLmlkXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgc25hcHNob3Qub3BlcmF0aW9ucy5zcGxpY2UoaW5kZXgsIDEsIG5ld09wZXJhdGlvbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc25hcHNob3Qub3BlcmF0aW9ucy5wdXNoKG5ld09wZXJhdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB1cGRhdGUgdmlldyBkYXRhXHJcbiAgICB0aGlzLnZpZXdUaXRsZSA9IHRpdGxlO1xyXG4gICAgdGhpcy52aXN1YWxJbmZvID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy52aWV3RGF0YSA9IHtcclxuICAgICAgc25hcHNob3Q6IHNuYXBzaG90LFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgLy8gZGVidWc6IHRydWUsXHJcbiAgICAgICAgZGVsYXllZFJlbmRlcjogdHJ1ZSxcclxuICAgICAgICBzaG93UnVsZXJzOiB0cnVlLFxyXG4gICAgICAgIHNob3dHcmlkOiB0cnVlLFxyXG4gICAgICAgIHBhblpvb206IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgY29uc29sZS5sb2coYHZpZXcgZGF0YTogJHt0aGlzLnZpZXdEYXRhfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtKHNuYXBzaG90OiBTbmFwc2hvdCB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCFzbmFwc2hvdCkge1xyXG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMud2lkdGguc2V0VmFsdWUoc25hcHNob3Quc2l6ZS53aWR0aCk7XHJcbiAgICAgIHRoaXMuaGVpZ2h0LnNldFZhbHVlKHNuYXBzaG90LnNpemUuaGVpZ2h0KTtcclxuICAgICAgdGhpcy5zdHlsZS5zZXRWYWx1ZShzbmFwc2hvdC5zdHlsZSB8fCBudWxsKTtcclxuICAgICAgdGhpcy5pbWFnZVVybC5zZXRWYWx1ZShzbmFwc2hvdC5pbWFnZT8udXJsIHx8IG51bGwpO1xyXG4gICAgICB0aGlzLmltYWdlT3BhY2l0eS5zZXRWYWx1ZShzbmFwc2hvdC5pbWFnZT8ub3BhY2l0eSB8fCAwKTtcclxuICAgICAgdGhpcy5pbWFnZVguc2V0VmFsdWUoc25hcHNob3QuaW1hZ2U/LmNhbnZhcz8ueCB8fCAwKTtcclxuICAgICAgdGhpcy5pbWFnZVkuc2V0VmFsdWUoc25hcHNob3QuaW1hZ2U/LmNhbnZhcz8ueSB8fCAwKTtcclxuICAgICAgdGhpcy5pbWFnZVdpZHRoLnNldFZhbHVlKHNuYXBzaG90LmltYWdlPy5jYW52YXM/LndpZHRoIHx8IDApO1xyXG4gICAgICB0aGlzLmltYWdlSGVpZ2h0LnNldFZhbHVlKHNuYXBzaG90LmltYWdlPy5jYW52YXM/LmhlaWdodCB8fCAwKTtcclxuICAgICAgdGhpcy5kZWZzLnNldFZhbHVlKHNuYXBzaG90LmRlZnMgfHwgbnVsbCk7XHJcbiAgICAgIHRoaXMuYmFzZVRleHQuc2V0VmFsdWUoc25hcHNob3QudGV4dCk7XHJcbiAgICAgIHRoaXMub2Zmc2V0WC5zZXRWYWx1ZShzbmFwc2hvdC50ZXh0T3B0aW9ucz8ub2Zmc2V0Py54IHx8IDApO1xyXG4gICAgICB0aGlzLm9mZnNldFkuc2V0VmFsdWUoc25hcHNob3QudGV4dE9wdGlvbnM/Lm9mZnNldD8ueSB8fCAwKTtcclxuICAgICAgdGhpcy5saW5lSGVpZ2h0T2Zmc2V0LnNldFZhbHVlKHNuYXBzaG90LnRleHRPcHRpb25zPy5saW5lSGVpZ2h0T2Zmc2V0KTtcclxuICAgICAgdGhpcy5sbkhlaWdodHMuc2V0VmFsdWUoc25hcHNob3QudGV4dE9wdGlvbnM/Lm1pbkxpbmVIZWlnaHRzIHx8IG51bGwpO1xyXG4gICAgICB0aGlzLmNoYXJTcGFjaW5nT2Zmc2V0LnNldFZhbHVlKHNuYXBzaG90LnRleHRPcHRpb25zPy5jaGFyU3BhY2luZ09mZnNldCk7XHJcbiAgICAgIHRoaXMuc3BjV2lkdGhPZmZzZXQuc2V0VmFsdWUoc25hcHNob3QudGV4dE9wdGlvbnM/LnNwY1dpZHRoT2Zmc2V0KTtcclxuICAgICAgdGhpcy50ZXh0U3R5bGUuc2V0VmFsdWUoc25hcHNob3QudGV4dFN0eWxlIHx8IG51bGwpO1xyXG4gICAgICB0aGlzLm9wZXJhdGlvbnMuc2V0VmFsdWUoc25hcHNob3Qub3BlcmF0aW9ucyk7XHJcbiAgICAgIHRoaXMuaW5wdXRPcHMucmVzZXQoKTtcclxuICAgICAgdGhpcy5vcFN0eWxlLnNldFZhbHVlKHNuYXBzaG90Lm9wU3R5bGUgfHwgbnVsbCk7XHJcbiAgICAgIC8vIHRpbWVsaW5lc1xyXG4gICAgICBjb25zdCB0aW1lbGluZXM6IEd2ZUFuaW1hdGlvblRpbWVsaW5lW10gPSBbXTtcclxuICAgICAgaWYgKHNuYXBzaG90LnRpbWVsaW5lcykge1xyXG4gICAgICAgIGZvciAobGV0IHRhZyBpbiBzbmFwc2hvdC50aW1lbGluZXMpIHtcclxuICAgICAgICAgIHRpbWVsaW5lcy5wdXNoKHNuYXBzaG90LnRpbWVsaW5lc1t0YWddKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aW1lbGluZXMuc2V0VmFsdWUodGltZWxpbmVzKTtcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXROZXdPcGVyYXRpb24oKSB7XHJcbiAgICB0aGlzLmVkaXRlZE9wID0ge1xyXG4gICAgICBpZDogdGhpcy5fbmFub2lkKCksXHJcbiAgICAgIHR5cGU6IDAsXHJcbiAgICAgIGF0OiB0aGlzLnRleHRSYW5nZT8uYXQgfHwgMCxcclxuICAgICAgcnVuOiB0aGlzLnRleHRSYW5nZT8ucnVuIHx8IDEsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5lZGl0ZWRPcEluZGV4ID0gLTE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZWRpdE9wZXJhdGlvbihpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmVkaXRlZE9wSW5kZXggPSBpbmRleDtcclxuICAgIHRoaXMuZWRpdGVkT3AgPSBkZWVwQ29weSh0aGlzLm9wZXJhdGlvbnMudmFsdWVbaW5kZXhdKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvc2VFZGl0ZWRPcCgpIHtcclxuICAgIHRoaXMuZWRpdGVkT3BJbmRleCA9IC0xO1xyXG4gICAgdGhpcy5lZGl0ZWRPcCA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk9wZXJhdGlvbkNhbmNlbCgpIHtcclxuICAgIHRoaXMuY2xvc2VFZGl0ZWRPcCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uT3BlcmF0aW9uQ2hhbmdlKG9wOiBDaGFyQ2hhaW5PcGVyYXRpb24pIHtcclxuICAgIGNvbnNvbGUubG9nKCdvcGVyYXRpb24gY2hhbmdlJyk7XHJcbiAgICBjb25zdCBvcGVyYXRpb25zID0gWy4uLnRoaXMub3BlcmF0aW9ucy52YWx1ZV07XHJcblxyXG4gICAgaWYgKHRoaXMuZWRpdGVkT3BJbmRleCA+IC0xKSB7XHJcbiAgICAgIG9wZXJhdGlvbnMuc3BsaWNlKHRoaXMuZWRpdGVkT3BJbmRleCwgMSwgb3ApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3BlcmF0aW9ucy5wdXNoKG9wKTtcclxuICAgIH1cclxuICAgIHRoaXMub3BlcmF0aW9ucy5zZXRWYWx1ZShvcGVyYXRpb25zKTtcclxuICAgIHRoaXMub3BlcmF0aW9ucy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy5vcGVyYXRpb25zLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICB0aGlzLmNsb3NlRWRpdGVkT3AoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWxldGVPcGVyYXRpb24oaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5fZGlhbG9nU2VydmljZVxyXG4gICAgICAuY29uZmlybShcclxuICAgICAgICAnQ29uZmlybSBEZWxldGlvbicsXHJcbiAgICAgICAgYERlbGV0ZSBvcGVyYXRpb24gXCIke3RoaXMub3BlcmF0aW9ucy52YWx1ZVtpbmRleF0uaWR9XCI/YFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHllczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmICh5ZXMpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnJlc3VsdE9wZXJhdGlvbklkID09PSB0aGlzLm9wZXJhdGlvbnMudmFsdWVbaW5kZXhdLmlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0T3BlcmF0aW9uSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBvcGVyYXRpb25zID0gWy4uLnRoaXMub3BlcmF0aW9ucy52YWx1ZV07XHJcbiAgICAgICAgICBvcGVyYXRpb25zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbnMuc2V0VmFsdWUob3BlcmF0aW9ucyk7XHJcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbnMubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIHRoaXMub3BlcmF0aW9ucy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblRleHRDaGFuZ2UodGV4dDogQ2hhck5vZGVbXSkge1xyXG4gICAgY29uc29sZS5sb2coJ3RleHQgY2hhbmdlOiAnICsgdGV4dCk7XHJcbiAgICB0aGlzLmJhc2VUZXh0LnNldFZhbHVlKHRleHQpO1xyXG4gICAgdGhpcy5iYXNlVGV4dC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmJhc2VUZXh0Lm1hcmtBc0RpcnR5KCk7XHJcbiAgICBpZiAoIXRleHQubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMubGluZUNvdW50ID0gMDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGluZUNvdW50ID0gdGV4dC5maWx0ZXIoKGMpID0+IGMuZGF0YSA9PT0gJ1xcbicpLmxlbmd0aCArIDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRleHRSYW5nZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuY2xvc2VFZGl0ZWRPcCgpO1xyXG4gICAgdGhpcy5vcGVyYXRpb25zLnJlc2V0KCk7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXdEYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25SYW5nZVBpY2socmFuZ2U6IFZhckJhc2VUZXh0UmFuZ2UpIHtcclxuICAgIHRoaXMudGV4dFJhbmdlID0gcmFuZ2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGFyc2VPcGVyYXRpb25zKCkge1xyXG4gICAgaWYgKHRoaXMuYnVzeSB8fCAhdGhpcy5pbnB1dE9wcy52YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kaWFsb2dTZXJ2aWNlXHJcbiAgICAgIC5jb25maXJtKCdDb25maXJtJywgJ1BhcnNlIG9wZXJhdGlvbnM/JylcclxuICAgICAgLnN1YnNjcmliZSgoeWVzOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKHllcykge1xyXG4gICAgICAgICAgdGhpcy5idXN5ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMucGFyc2VFcnJvciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICB0aGlzLl9hcGkucGFyc2VPcGVyYXRpb25zKHRoaXMuaW5wdXRPcHMudmFsdWUhKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAod3JhcHBlcikgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBbLi4udGhpcy5vcGVyYXRpb25zLnZhbHVlXTtcclxuICAgICAgICAgICAgICBvcGVyYXRpb25zLnB1c2goLi4ud3JhcHBlci5yZXN1bHQhKTtcclxuICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbnMuc2V0VmFsdWUob3BlcmF0aW9ucyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb25zLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb25zLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdEYXRhKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnBhcnNlRXJyb3IgPSBlcnJvci5tZXNzYWdlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhck9wZXJhdGlvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kaWFsb2dTZXJ2aWNlXHJcbiAgICAgIC5jb25maXJtKCdDb25maXJtJywgJ1JlbW92ZSBhbGwgb3BlcmF0aW9ucz8nKVxyXG4gICAgICAuc3Vic2NyaWJlKCh5ZXM6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoeWVzKSB7XHJcbiAgICAgICAgICB0aGlzLnJlc3VsdE9wZXJhdGlvbklkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgdGhpcy5vcGVyYXRpb25zLnJlc2V0KCk7XHJcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbnMubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIHRoaXMub3BlcmF0aW9ucy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdEYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk9wZXJhdGlvblByZXZpZXcob3BlcmF0aW9uOiBDaGFyQ2hhaW5PcGVyYXRpb24pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9wcmV2aWV3aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3ByZXZpZXdpbmcgPSB0cnVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlld0RhdGEob3BlcmF0aW9uKTtcclxuICAgICAgdGhpcy5fcHJldmlld2luZyA9IGZhbHNlO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcnVuVG8oaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmdldFNuYXBzaG90KCk7XHJcbiAgICBpZiAoIXNuYXBzaG90LnRleHQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IHRoaXMub3BlcmF0aW9ucy52YWx1ZS5zbGljZSgwLCBpbmRleCArIDEpO1xyXG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcclxuICAgIHRoaXMuX2FwaS5ydW5PcGVyYXRpb25zKHNuYXBzaG90LnRleHQgYXMgQ2hhck5vZGVbXSwgb3BlcmF0aW9ucykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHdyYXBwZXIpID0+IHtcclxuICAgICAgICBpZiAod3JhcHBlci5lcnJvcikge1xyXG4gICAgICAgICAgdGhpcy5fc25hY2tiYXIub3Blbih3cmFwcGVyLmVycm9yLCAnT0snKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZXN1bHQgPSB3cmFwcGVyLnJlc3VsdCE7XHJcbiAgICAgICAgLy8gVE9ETyB1cGRhdGUgdmlld1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlVmlld0RhdGEoXHJcbiAgICAgICAgLy8gICB1bmRlZmluZWQsXHJcbiAgICAgICAgLy8gICBzbmFwc2hvdCxcclxuICAgICAgICAvLyAgIHRoaXMub3BlcmF0aW9ucy52YWx1ZVtpbmRleF0ub3V0cHV0VGFnXHJcbiAgICAgICAgLy8gKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW4oJ0Vycm9yIHJ1bm5pbmcgb3BlcmF0aW9ucycsICdPSycpO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TdGVwUGljayhzdGVwOiBDaGFpbk9wZXJhdGlvbkNvbnRleHRTdGVwKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucmVzdWx0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucmVzdWx0T3BlcmF0aW9uSWQgPSBzdGVwLm9wZXJhdGlvbi5pZDtcclxuXHJcbiAgICAvLyBnZXQgc25hcHNob3QgZm9yIHByZXZpZXcgYnkgdXBkYXRpbmcgaXRzIHRleHQgYW5kXHJcbiAgICAvLyByZW1vdmluZyBvcGVyYXRpb25zIHBhc3QgdGhlIGxhc3QgZXhlY3V0ZWRcclxuICAgIGNvbnN0IHN0ZXBOb2RlcyA9IHRoaXMucmVzdWx0LnRhZ2dlZE5vZGVzW3N0ZXAub3V0cHV0VGFnXTtcclxuXHJcbiAgICAvLyB3ZSBhbHdheXMgZGlzcGxheSB0aGUgb3JpZ2luYWwgYmFzZSB0ZXh0LCBqdXN0IHVwZGF0aW5nXHJcbiAgICAvLyBpdHMgbm9kZXMgZmVhdHVyZXMgdG8gdGhvc2Ugb2YgdGhlIHBpY2tlZCBzdGVwLCBhbmQgYWRkaW5nXHJcbiAgICAvLyBuZXcgbm9kZXMgaWYgdGhleSBhcmUgbm90IGluIHRoZSBvcmlnaW5hbCB0ZXh0LiBJdCBpcyBhc3N1bWVkXHJcbiAgICAvLyB0aGF0IHRoZXNlIG5ldyBub2RlcyBoYXZlIGEgbWFudWFsbHkgc2V0IHBvc2l0aW9uLlxyXG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmdldFNuYXBzaG90KCk7XHJcbiAgICBjb25zdCBub2RlczogQ2hhck5vZGVbXSA9IGRlZXBDb3B5KHNuYXBzaG90LnRleHQgYXMgQ2hhck5vZGVbXSk7XHJcbiAgICBmb3IgKGNvbnN0IHNuIG9mIHN0ZXBOb2Rlcykge1xyXG4gICAgICBjb25zdCBpID0gbm9kZXMuZmluZEluZGV4KChuKSA9PiBuLmlkID09PSBzbi5pZCk7XHJcbiAgICAgIGlmIChpID4gLTEpIHtcclxuICAgICAgICBub2Rlc1tpXS5mZWF0dXJlcyA9IHNuLmZlYXR1cmVzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vZGVzLnB1c2goc24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmluZCBtYXggSUQgaW4gc25hcHNob3QudGV4dCAoPW9yaWdpbmFsKSBub2RlcyxcclxuICAgIC8vIHNvIHRoYXQgYW55IElEIGdyZWF0ZXIgdGhhbiBpdCBiZWxvbmdzIHRvIG5ldyBub2Rlc1xyXG4gICAgY29uc3QgbWF4T3JpZ2luYWxJZCA9IChzbmFwc2hvdC50ZXh0IGFzIENoYXJOb2RlW10pLnJlZHVjZShcclxuICAgICAgKG1heCwgbikgPT4gTWF0aC5tYXgobWF4LCBuLmlkKSxcclxuICAgICAgMFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBhcHBlbmQgbm9kZXMgaW50cm9kdWNlZCBiZWZvcmUgdGhlIHBpY2tlZCBzdGVwIGlmIGFueVxyXG4gICAgLy8gKHRob3NlIGludHJvZHVjZWQgYnkgdGhlIHBpY2tlZCBzdGVwIGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkKVxyXG4gICAgY29uc3Qgc3RlcEluZGV4ID0gdGhpcy5yZXN1bHQuc3RlcHMuaW5kZXhPZihzdGVwKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcEluZGV4OyBpKyspIHtcclxuICAgICAgY29uc3Qgc3RlcE5vZGVzID0gdGhpcy5yZXN1bHQudGFnZ2VkTm9kZXNbdGhpcy5yZXN1bHQuc3RlcHNbaV0ub3V0cHV0VGFnXTtcclxuICAgICAgZm9yIChjb25zdCBuIG9mIHN0ZXBOb2Rlcykge1xyXG4gICAgICAgIGlmIChuLmlkID4gbWF4T3JpZ2luYWxJZCAmJiAhbm9kZXMuZmluZCgoeCkgPT4geC5pZCA9PT0gbi5pZCkpIHtcclxuICAgICAgICAgIG5vZGVzLnB1c2gobik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc25hcHNob3QudGV4dCA9IG5vZGVzO1xyXG4gICAgY29uc3QgaSA9IHNuYXBzaG90Lm9wZXJhdGlvbnMuZmluZEluZGV4KChvKSA9PiBvLmlkID09PSBzdGVwLm9wZXJhdGlvbi5pZCk7XHJcbiAgICBpZiAoaSA+IC0xKSB7XHJcbiAgICAgIHNuYXBzaG90Lm9wZXJhdGlvbnMgPSBzbmFwc2hvdC5vcGVyYXRpb25zLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlVmlld0RhdGEodW5kZWZpbmVkLCBzbmFwc2hvdCwgc3RlcC5vdXRwdXRUYWcpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVmlzdWFsRXZlbnQoZXZlbnQ6IEN1c3RvbUV2ZW50PEd2ZVZpc3VhbEV2ZW50Pik6IHZvaWQge1xyXG4gICAgY29uc3QgZCA9IGV2ZW50LmRldGFpbDtcclxuICAgIGlmIChkLmV2ZW50LnR5cGUgPT09ICdtb3VzZW92ZXInKSB7XHJcbiAgICAgIGNvbnN0IHZpc3VhbCA9IGQuc291cmNlO1xyXG4gICAgICBjb25zdCBzYjogc3RyaW5nW10gPSBbXTtcclxuICAgICAgc2IucHVzaCgnIycgKyB2aXN1YWwuaWQpO1xyXG4gICAgICBzYi5wdXNoKGAgKCR7dmlzdWFsLnR5cGV9KWApO1xyXG4gICAgICBpZiAodmlzdWFsLmRhdGE/LmxhYmVsKSB7XHJcbiAgICAgICAgc2IucHVzaCgnOiAnKTtcclxuICAgICAgICBzYi5wdXNoKHZpc3VhbC5kYXRhLmxhYmVsKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmlzdWFsLmRhdGE/LmZlYXR1cmVzPy5sZW5ndGgpIHtcclxuICAgICAgICBzYi5wdXNoKFxyXG4gICAgICAgICAgdmlzdWFsLmRhdGEuZmVhdHVyZXNcclxuICAgICAgICAgICAgLm1hcCgoZjogRmVhdHVyZSkgPT4gYCR7Zi5uYW1lfT0ke2YudmFsdWV9YClcclxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnZpc3VhbEluZm8gPSBzYi5qb2luKCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkhlaWdodHNDaGFuZ2UoaGVpZ2h0czogUmVjb3JkPG51bWJlciwgbnVtYmVyPiB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgdGhpcy5sbkhlaWdodHMuc2V0VmFsdWUoaGVpZ2h0cyB8fCBudWxsKTtcclxuICAgIHRoaXMubG5IZWlnaHRzLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLmxuSGVpZ2h0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNuYXBzaG90Q2FuY2VsLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNuYXBzaG90UmVuZGVyKGV2ZW50OiBDdXN0b21FdmVudDxTbmFwc2hvdFZpZXdSZW5kZXJFdmVudD4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlbmRlcmVyID0gKGV2ZW50LmRldGFpbCBhcyBTbmFwc2hvdFZpZXdSZW5kZXJFdmVudCkucmVuZGVyZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlUnVsZXJzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJ1bGVycyA9IHRoaXMuX3JlbmRlcmVyLnRvZ2dsZVJ1bGVycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTbmFwc2hvdCgpOiBTbmFwc2hvdCB7XHJcbiAgICBjb25zdCBzbmFwc2hvdDogU25hcHNob3QgPSB7XHJcbiAgICAgIHNpemU6IHtcclxuICAgICAgICB3aWR0aDogdGhpcy53aWR0aC52YWx1ZSxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LnZhbHVlLFxyXG4gICAgICB9LFxyXG4gICAgICBzdHlsZTogdGhpcy5zdHlsZS52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIGRlZnM6IHRoaXMuZGVmcy52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIHRleHQ6IHRoaXMuYmFzZVRleHQudmFsdWUhLFxyXG4gICAgICB0ZXh0U3R5bGU6IHRoaXMudGV4dFN0eWxlLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgdGV4dE9wdGlvbnM6IHtcclxuICAgICAgICBsaW5lSGVpZ2h0T2Zmc2V0OiB0aGlzLmxpbmVIZWlnaHRPZmZzZXQudmFsdWUsXHJcbiAgICAgICAgbWluTGluZUhlaWdodHM6IHRoaXMubG5IZWlnaHRzLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICBjaGFyU3BhY2luZ09mZnNldDogdGhpcy5jaGFyU3BhY2luZ09mZnNldC52YWx1ZSxcclxuICAgICAgICBzcGNXaWR0aE9mZnNldDogdGhpcy5zcGNXaWR0aE9mZnNldC52YWx1ZSxcclxuICAgICAgICBvZmZzZXQ6IHtcclxuICAgICAgICAgIHg6IHRoaXMub2Zmc2V0WC52YWx1ZSxcclxuICAgICAgICAgIHk6IHRoaXMub2Zmc2V0WS52YWx1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgICBvcGVyYXRpb25zOiBbLi4udGhpcy5vcGVyYXRpb25zLnZhbHVlXSxcclxuICAgICAgb3BTdHlsZTogdGhpcy5vcFN0eWxlLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgdGltZWxpbmVzOiB7fSwgLy8gVE9ET1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBpbWFnZVxyXG4gICAgaWYgKHRoaXMuaW1hZ2VVcmwudmFsdWUpIHtcclxuICAgICAgc25hcHNob3QuaW1hZ2UgPSB7XHJcbiAgICAgICAgdXJsOiB0aGlzLmltYWdlVXJsLnZhbHVlLFxyXG4gICAgICAgIG9wYWNpdHk6IHRoaXMuaW1hZ2VPcGFjaXR5LnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgfTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuaW1hZ2VYLnZhbHVlIHx8XHJcbiAgICAgICAgdGhpcy5pbWFnZVkudmFsdWUgfHxcclxuICAgICAgICB0aGlzLmltYWdlV2lkdGgudmFsdWUgfHxcclxuICAgICAgICB0aGlzLmltYWdlSGVpZ2h0LnZhbHVlXHJcbiAgICAgICkge1xyXG4gICAgICAgIHNuYXBzaG90LmltYWdlLmNhbnZhcyA9IHtcclxuICAgICAgICAgIHg6IHRoaXMuaW1hZ2VYLnZhbHVlLFxyXG4gICAgICAgICAgeTogdGhpcy5pbWFnZVkudmFsdWUsXHJcbiAgICAgICAgICB3aWR0aDogdGhpcy5pbWFnZVdpZHRoLnZhbHVlLFxyXG4gICAgICAgICAgaGVpZ2h0OiB0aGlzLmltYWdlSGVpZ2h0LnZhbHVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB0aW1lbGluZXNcclxuICAgIGlmICh0aGlzLnRpbWVsaW5lcy52YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgc25hcHNob3QudGltZWxpbmVzID0ge307XHJcbiAgICAgIHRoaXMudGltZWxpbmVzLnZhbHVlLmZvckVhY2goKHQpID0+IHtcclxuICAgICAgICBzbmFwc2hvdC50aW1lbGluZXMhW3QudGFnXSA9IHQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc25hcHNob3QudGltZWxpbmVzID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzbmFwc2hvdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblRpbWVsaW5lc0NoYW5nZSh0aW1lbGluZXM6IEd2ZUFuaW1hdGlvblRpbWVsaW5lW10pOiB2b2lkIHtcclxuICAgIHRoaXMudGltZWxpbmVzLnNldFZhbHVlKHRpbWVsaW5lcyk7XHJcbiAgICB0aGlzLnRpbWVsaW5lcy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy50aW1lbGluZXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQgfHwgdGhpcy5ub1NhdmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc25hcHNob3QgPSB0aGlzLmdldFNuYXBzaG90KCk7XHJcbiAgICB0aGlzLnNuYXBzaG90Q2hhbmdlLmVtaXQodGhpcy5fc25hcHNob3QpO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxyXG4gIDxtYXQtdGFiLWdyb3VwPlxyXG4gICAgPCEtLSB0ZXh0IC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJ0ZXh0XCI+XHJcbiAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtleHBhbmRlZF09XCIhYmFzZVRleHQudmFsdWVcIj5cclxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPiBiYXNlIHRleHQgPC9tYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8Z3ZlLWJhc2UtdGV4dC1lZGl0b3JcclxuICAgICAgICAgIFt0ZXh0XT1cImJhc2VUZXh0LnZhbHVlXCJcclxuICAgICAgICAgICh0ZXh0Q2hhbmdlKT1cIm9uVGV4dENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxmaWVsZHNldD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICAgICAgICA8IS0tIG9mZnNldFggLS0+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LW5yXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5YIG9mZnNldDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIm9mZnNldFhcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJYIG9mZnNldFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gb2Zmc2V0WSAtLT5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXQtbnJcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlkgb2Zmc2V0PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwib2Zmc2V0WVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlkgb2Zmc2V0XCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBsaW5lSGVpZ2h0T2Zmc2V0IC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1uclwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+bG4gaC1vZmZzZXQ8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJsaW5lSGVpZ2h0T2Zmc2V0XCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwibG4gaC1vZmZzZXRcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgICAgICA8IS0tIGNoYXJTcGFjaW5nT2Zmc2V0IC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1uclwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+Y2hhciBzcGFjaW5nPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiY2hhclNwYWNpbmdPZmZzZXRcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJjaGFyIHNwYWNpbmdcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgICAgICA8IS0tIHNwY1dpZHRoT2Zmc2V0IC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC1uclwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+c3BjIHctb2Zmc2V0PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic3BjV2lkdGhPZmZzZXRcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJzcGMgdy1vZmZzZXRcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwhLS0gbWluTGluZUhlaWdodHMgLS0+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPGd2ZS1sbi1oZWlnaHRzLWVkaXRvclxyXG4gICAgICAgICAgICAgICAgW2xpbmVDb3VudF09XCJsaW5lQ291bnRcIlxyXG4gICAgICAgICAgICAgICAgW2hlaWdodHNdPVwibG5IZWlnaHRzLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIChoZWlnaHRzQ2hhbmdlKT1cIm9uSGVpZ2h0c0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSB0ZXh0U3R5bGUgLS0+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJsb25nLXRleHRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+dGV4dCBzdHlsZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ0ZXh0U3R5bGVcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ0ZXh0IHN0eWxlXCJcclxuICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZmllbGRzZXQ+XHJcbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgIDwvbWF0LXRhYj5cclxuXHJcbiAgICA8IS0tIG9wZXJhdGlvbnMgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cIm9wZXJhdGlvbnNcIj5cclxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJnZW5lcmFsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgICAgICAgICAgPCEtLSB3aWR0aCAtLT5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXQtbnJcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPndpZHRoPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBtaW49XCIwXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ3aWR0aFwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIndpZHRoXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBoZWlnaHQgLS0+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LW5yXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5oZWlnaHQ8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIG1pbj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImhlaWdodFwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImhlaWdodFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gYWRkIG9wIC0tPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5IHJpZ2h0XCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWJhc2VUZXh0LnZhbHVlXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdE5ld09wZXJhdGlvbigpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGRfY2lyY2xlPC9tYXQtaWNvbj4gb3BlcmF0aW9uXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gb3BzIC0tPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJvcHNcIj5cclxuICAgICAgICAgIDwhLS0gb3BlcmF0aW9ucyBsaXN0IC0tPlxyXG4gICAgICAgICAgQGlmIChvcGVyYXRpb25zLnZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgPHRhYmxlIGlkPVwibGlzdFwiPlxyXG4gICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+SUQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPnR5cGU8L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPmF0PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD5ydW48L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPnZhbHVlPC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD5pdGFnPC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD5vdGFnPC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD5naWQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPmZlYXRzPC90aD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgQGZvciAob3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMudmFsdWU7IHRyYWNrIG9wZXJhdGlvbi5pZDsgbGV0XHJcbiAgICAgICAgICAgICAgaW5kZXg9JGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgPHRyXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IHNlbGVjdGVkOiBvcGVyYXRpb24uaWQgPT09IHJlc3VsdE9wZXJhdGlvbklkIH1cIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBlZGl0ZWQ6IG9wZXJhdGlvbi5pZCA9PT0gZWRpdGVkT3A/LmlkIH1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpdC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGVkaXQgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0T3BlcmF0aW9uKGluZGV4KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkVkaXQgb3BlcmF0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gZGVsZXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlT3BlcmF0aW9uKGluZGV4KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkRlbGV0ZSBvcGVyYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXdhcm5cIj5kZWxldGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBydW4gdG8gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImFjY2VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1blRvKGluZGV4KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlJ1biB0byB0aGlzIG9wZXJhdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtYWNjZW50XCI+c3Vic2NyaXB0aW9uczwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57eyBvcGVyYXRpb24uaWQgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7IG9wZXJhdGlvbi50eXBlIHwgZmxhdExvb2t1cCA6IG9wVHlwZU1hcCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3sgb3BlcmF0aW9uLmF0IH19PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57eyBvcGVyYXRpb24ucnVuIH19PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57eyBvcGVyYXRpb24udmFsdWUgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7IG9wZXJhdGlvbi5pbnB1dFRhZyB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3sgb3BlcmF0aW9uLm91dHB1dFRhZyB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3sgb3BlcmF0aW9uLmdyb3VwSWQgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7IG9wZXJhdGlvbi5mZWF0dXJlcz8ubGVuZ3RoIH19PC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgPCEtLSBvcGVyYXRpb24gZWRpdG9yIC0tPlxyXG4gICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW2V4cGFuZGVkXT1cImVkaXRlZE9wXCIgW2Rpc2FibGVkXT1cIiFlZGl0ZWRPcFwiPlxyXG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5vcGVyYXRpb24ge3sgZWRpdGVkT3A/LmlkIH19PC9tYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgIDxmaWVsZHNldD5cclxuICAgICAgICAgICAgICA8Z3ZlLWNoYWluLW9wZXJhdGlvbi1lZGl0b3JcclxuICAgICAgICAgICAgICAgIFtvcGVyYXRpb25dPVwiZWRpdGVkT3BcIlxyXG4gICAgICAgICAgICAgICAgKG9wZXJhdGlvbkNhbmNlbCk9XCJvbk9wZXJhdGlvbkNhbmNlbCgpXCJcclxuICAgICAgICAgICAgICAgIChvcGVyYXRpb25DaGFuZ2UpPVwib25PcGVyYXRpb25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAob3BlcmF0aW9uUHJldmlldyk9XCJvbk9wZXJhdGlvblByZXZpZXcoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuXHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiYnVzeVwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIG9wU3R5bGUgLS0+XHJcbiAgICAgICAgICA8ZGl2IGlkPVwib3BTdHlsZVwiPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJsb25nLXRleHRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+b3BlcmF0aW9ucyBzdHlsZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJvcFN0eWxlXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwib3BlcmF0aW9ucyBzdHlsZVwiXHJcbiAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIGJhdGNoIG9wcyAtLT5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+YmF0Y2ggb3BlcmF0aW9uczwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgPGZpZWxkc2V0PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImJhdGNoLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiYmF0Y2gtaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPm9wZXJhdGlvbnM8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJpbnB1dE9wc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJvcGVyYXRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzPVwiOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtd2FyblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiUmVtb3ZlIGFsbCB0aGUgb3BlcmF0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhb3BlcmF0aW9ucy52YWx1ZS5sZW5ndGggfHwgYnVzeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhck9wZXJhdGlvbnMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlBhcnNlIHRleHQgYW5kIGFkZCByZXN1bHRzIHRvIHRoZSBvcGVyYXRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpbnB1dE9wcy52YWx1ZSB8fCBidXN5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhcnNlT3BlcmF0aW9ucygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggYWRkXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAocGFyc2VFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiPnt7IHBhcnNlRXJyb3IgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiYmF0Y2gtaGVscFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5yZXBsYWNlPC9zdHJvbmc+OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5BVHhSVU48c3Ryb25nPj08L3N0cm9uZz5cIlZBTFVFXCI8L2NvZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPmRlbGV0ZTwvc3Ryb25nPjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+QVR4UlVOPHN0cm9uZz4tPC9zdHJvbmc+PC9jb2RlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5hZGQtYmVmb3JlPC9zdHJvbmc+OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5BVHhSVU48c3Ryb25nPitbPC9zdHJvbmc+XCJWQUxVRVwiPC9jb2RlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5hZGQtYWZ0ZXI8L3N0cm9uZz46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkFUeFJVTjxzdHJvbmc+K108L3N0cm9uZz5cIlZBTFVFXCI8L2NvZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPm1vdmUtYmVmb3JlPC9zdHJvbmc+OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5BVHhSVU48c3Ryb25nPiZndDtbPC9zdHJvbmc+VE88L2NvZGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPm1vdmUtYWZ0ZXI8L3N0cm9uZz46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkFUeFJVTjxzdHJvbmc+Jmd0O108L3N0cm9uZz5UTzwvY29kZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+c3dhcDwvc3Ryb25nPjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+QVR4UlVOPHN0cm9uZz4mbHQ7Jmd0Ozwvc3Ryb25nPlRPeFJVTjwvY29kZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+YW5ub3RhdGU8L3N0cm9uZz46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkFUeFJVTjxzdHJvbmc+Ojwvc3Ryb25nPjwvY29kZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICA8cD5Gb3IgYWxsIHRoZSBvcGVyYXRpb25zOjwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA8Y29kZT4oSVRBRzpPVEFHKTwvY29kZT4gdG8gZGVmaW5lIGlucHV0IGFuZC9vclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgdGFncywgc2VwYXJhdGVkIGJ5IGNvbG9uLlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZCA8Y29kZT4mI3g0MDs8L2NvZGU+IHRvIEFUIHRvIHVzZSBjaGFyYWN0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlcyAoMC1OKSByYXRoZXIgdGhhbiBJRHMuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpPlJVTiAod2hlcmUgYXBwbGljYWJsZSkgZGVmYXVsdHMgdG8gMS48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZmVhdHVyZXMgbGlrZSA8Y29kZT5bTkFNRSBPUEVSQVRPUiBWQUxVRV08L2NvZGU+LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZWQgYnkgc3BhY2UsIHdoZXJlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUUgaXMgYW4gYXJiaXRyYXJ5IHN0cmluZy4gUHJlZml4ZXM6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+KjwvY29kZT49Z2xvYmFsIGZlYXR1cmVzLCA8Y29kZT4hPC9jb2RlPj1yZW1vdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlIChubyB2YWx1ZSkuIFN1ZmZpeGVzOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPl48L2NvZGU+PXNob3J0LWxpdmVkIChsaWtlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+KnZlcnNpb25ePWFscGhhPC9jb2RlPikuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVSQVRPUiBpcyA8Y29kZT49PC9jb2RlPiAobXVsdGlwbGUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPjo9PC9jb2RlPiAoc2luZ2xlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT49PTwvY29kZT4gKGZpcnN0LXNpbmdsZSkuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSBpcyBhIHN0cmluZy4gSWYgaXQgaW5jbHVkZXMgc3BhY2VzLCB3cmFwIGl0IGluXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+XCJcIjwvY29kZT4uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L29sPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gcmVzdWx0IC0tPlxyXG4gICAgICAgIEBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgPGZpZWxkc2V0IGlkPVwicmVzdWx0XCI+XHJcbiAgICAgICAgICA8bGVnZW5kPnJlc3VsdDwvbGVnZW5kPlxyXG4gICAgICAgICAgPGd2ZS1jaGFpbi1yZXN1bHQtdmlld1xyXG4gICAgICAgICAgICBbcmVzdWx0XT1cInJlc3VsdFwiXHJcbiAgICAgICAgICAgIChzdGVwUGljayk9XCJvblN0ZXBQaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2ZpZWxkc2V0PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBpbWFnZSAtLT5cclxuICAgIDxtYXQtdGFiIGxhYmVsPVwiaW1hZ2VcIj5cclxuICAgICAgPGRpdiBpZD1cImltYWdlXCI+XHJcbiAgICAgICAgPGRpdiBpZD1cImltYWdlLWN0bFwiPlxyXG4gICAgICAgICAgPCEtLSB1cmwgLS0+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJsb25nLXRleHRcIj5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD5VUkw8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJpbWFnZVVybFwiIC8+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICAgICAgICAgIDwhLS0geCAtLT5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXQtbnJcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlg8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJpbWFnZVhcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJYXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8IS0tIHkgLS0+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LW5yXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5ZPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaW1hZ2VZXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiWVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICAgICAgICAgIDwhLS0gd2lkdGggLS0+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LW5yXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD53aWR0aDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaW1hZ2VXaWR0aFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPCEtLSBoZWlnaHQgLS0+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LW5yXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5oZWlnaHQ8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgIG1pbj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImltYWdlSGVpZ2h0XCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8IS0tIGRlZnMgLS0+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJsb25nLXRleHRcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPmRlZnM8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImRlZnNcIiByb3dzPVwiM1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGlkPVwiaW1hZ2Utdmlld1wiPlxyXG4gICAgICAgICAgQGlmIChpbWFnZVVybC52YWx1ZSkge1xyXG4gICAgICAgICAgPGltZyBhbHQ9XCJiYWNrZ3JvdW5kXCIgW3NyY109XCJpbWFnZVVybC52YWx1ZVwiIHdpZHRoPVwiNjAwXCIgLz5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSB0aW1lbGluZXMgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImFuaW1hdGlvblwiPlxyXG4gICAgICA8Z3ZlLWFuaW1hdGlvbi10aW1lbGluZS1zZXRcclxuICAgICAgICBbdGFnc109XCJvcFRhZ3NcIlxyXG4gICAgICAgIFtlbGVtZW50SWRzXT1cIm9wRWxlbWVudElkc1wiXHJcbiAgICAgICAgW3RpbWVsaW5lc109XCJ0aW1lbGluZXMudmFsdWVcIlxyXG4gICAgICAgICh0aW1lbGluZXNDaGFuZ2UpPVwib25UaW1lbGluZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L21hdC10YWI+XHJcbiAgPC9tYXQtdGFiLWdyb3VwPlxyXG5cclxuICA8IS0tIHByZXZpZXcgLS0+XHJcbiAgQGlmIChzbmFwc2hvdCkge1xyXG4gIDxmaWVsZHNldCBpZD1cInByZXZpZXdcIj5cclxuICAgIDxsZWdlbmQgY2xhc3M9XCJidXR0b24tcm93XCI+XHJcbiAgICAgIDxzcGFuPnt7IHZpZXdUaXRsZSB9fTwvc3Bhbj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgbWF0VG9vbHRpcD1cIlJlZnJlc2ggcHJldmlld1wiXHJcbiAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZpZXdEYXRhKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5yZWZyZXNoPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2xlZ2VuZD5cclxuICAgIDxndmUtc25hcHNob3Qtdmlld1xyXG4gICAgICBbZGF0YV09XCJ2aWV3RGF0YVwiXHJcbiAgICAgIChzbmFwc2hvdFJlbmRlcik9XCJvblNuYXBzaG90UmVuZGVyKCRhbnkoJGV2ZW50KSlcIlxyXG4gICAgICAodmlzdWFsRXZlbnQpPVwib25WaXN1YWxFdmVudCgkYW55KCRldmVudCkpXCJcclxuICAgIC8+XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgIG1hdFRvb2x0aXA9XCJUb2dnbGUgcnVsZXJzXCJcclxuICAgICAgICBbY2hlY2tlZF09XCJydWxlcnNcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlUnVsZXJzKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5zdHJhaWdodGVuPC9tYXQtaWNvbj5cclxuICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cclxuICAgIDwvZGl2PlxyXG4gICAgQGlmICh2aXN1YWxJbmZvKSB7XHJcbiAgICA8ZGl2IGlkPVwidmlzdWFsLWluZm9cIj57eyB2aXN1YWxJbmZvIH19PC9kaXY+XHJcbiAgICB9XHJcbiAgPC9maWVsZHNldD5cclxuICB9XHJcblxyXG4gIDwhLS1idXR0b25zIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLXJvdy1jZW50ZXJcIj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNsYXNzPVwibWF0LXdhcm5cIlxyXG4gICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgbWF0VG9vbHRpcD1cIkRpc2NhcmQgY2hhbmdlc1wiXHJcbiAgICAgIChjbGljayk9XCJjbG9zZSgpXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cclxuICAgICAgY2xvc2VcclxuICAgIDwvYnV0dG9uPlxyXG4gICAgQGlmICghbm9TYXZlKSB7XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJTYXZlIGNoYW5nZXNcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkIHx8IGZvcm0ucHJpc3RpbmVcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cclxuICAgICAgc2F2ZVxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZm9ybT5cclxuIl19
|