@firestitch/report 18.3.1 → 18.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
3
  import { ActivatedRoute, Router, RouterLink } from '@angular/router';
4
4
  import { MatDialog } from '@angular/material/dialog';
5
5
  import { MatIconModule } from '@angular/material/icon';
6
+ import { FsChipModule } from '@firestitch/chip';
6
7
  import { FsFilterModule, ItemType } from '@firestitch/filter';
7
8
  import { FsMessage } from '@firestitch/message';
8
9
  import { FsPrompt } from '@firestitch/prompt';
@@ -11,12 +12,13 @@ import { FsTreeComponent, FsTreeModule, TreeActionType, TreeDragMode, } from '@f
11
12
  import { switchMap } from 'rxjs';
12
13
  import { ReportData } from '../../data/report.data';
13
14
  import { GlobalSettingsComponent } from '../../dialogs/global-settings/global-settings.component';
14
- import { ReportNodeType, ReportState, ReportStates, } from '../../interfaces/report.interface';
15
+ import { ReportNodeType, ReportState, } from '../../interfaces/report.interface';
15
16
  import * as i0 from "@angular/core";
16
- import * as i1 from "@firestitch/filter";
17
- import * as i2 from "@firestitch/skeleton";
18
- import * as i3 from "@firestitch/tree";
19
- import * as i4 from "@angular/material/icon";
17
+ import * as i1 from "@firestitch/chip";
18
+ import * as i2 from "@firestitch/filter";
19
+ import * as i3 from "@firestitch/skeleton";
20
+ import * as i4 from "@firestitch/tree";
21
+ import * as i5 from "@angular/material/icon";
20
22
  // The reports listing — an fs-tree of folders and the reports filed into them.
21
23
  // Rows link out through a URL pattern (a ':id' token → the report id; a leading
22
24
  // '/' makes it absolute, otherwise it's relative to this component's route).
@@ -30,17 +32,17 @@ import * as i4 from "@angular/material/icon";
30
32
  // report in no folder is a root node, which is where every report sat before
31
33
  // folders existed, so nothing had to be migrated or bucketed as "uncategorized".
32
34
  //
33
- // Reports are soft-deletable: the row kebab deletes, "Show Deleted" flips the
34
- // listing into deleted mode (the backend hides deleted reports otherwise), and
35
- // in that mode the kebab offers Restore instead. Folders do NOT take part in
36
- // that a folder is only deletable once it is empty, so it hard deletes and has
37
- // nothing to restore. The upshot is that deleted mode keeps the folder structure
38
- // on screen with the deleted reports sitting where they belong, so restoring one
39
- // puts it back rather than dropping it at the root.
35
+ // Folders and reports are both soft-deletable, and a folder deletes whatever it
36
+ // holds. Only the folder's own row is written: everything under it drops out of
37
+ // the listing because it sits under a deleted folder, and comes back with it.
38
+ // "Show Deleted" shows the WHOLE tree live and deleted together, each deleted
39
+ // row where it was filed and on anything deleted the kebab offers Restore
40
+ // instead. Restoring also restores any deleted folder above the row, so it lands
41
+ // back where it was rather than at the root.
42
+ //
43
+ // Every folder starts collapsed; the tree remembers what was opened across its
44
+ // own reloads (a rename, a move, the Show Deleted toggle) and across a search.
40
45
  export class FsAiReportsComponent {
41
- // How deep the tree opens on load. Folders are audience buckets, not a
42
- // filesystem, so there is nothing worth hiding behind a closed chevron.
43
- static EXPAND_LEVEL = 10;
44
46
  // API base for the reports endpoints; override to mount elsewhere.
45
47
  basePath = input('reports');
46
48
  // Where a row links to; ':id' is replaced with the report id. Default takes
@@ -64,6 +66,10 @@ export class FsAiReportsComponent {
64
66
  _destroyRef = inject(DestroyRef);
65
67
  // The filter bar's current query — carries `state` when Show Deleted is on.
66
68
  _query = {};
69
+ // The folders that were open when a search started; null while no search is
70
+ // running. The search opens every match's path over the top of them, and
71
+ // clearing it puts these back.
72
+ _expandedBeforeSearch = null;
67
73
  constructor() {
68
74
  effect(() => {
69
75
  this._reportData.basePath = this.basePath();
@@ -81,11 +87,6 @@ export class FsAiReportsComponent {
81
87
  openLink(report) {
82
88
  return this._patternCommands(this.openPattern(), report.id);
83
89
  }
84
- // A deleted report can't be opened — the backend only assembles active ones —
85
- // so in Show Deleted mode its name renders as plain text rather than a link.
86
- isDeleted(report) {
87
- return report?.state === ReportState.Deleted;
88
- }
89
90
  // Prompt for a title, create the report — filed under reportFolderId when a
90
91
  // folder's kebab asked, at the root otherwise — then route to it (createPattern).
91
92
  createReport(reportFolderId = null) {
@@ -120,13 +121,16 @@ export class FsAiReportsComponent {
120
121
  type: ItemType.Keyword,
121
122
  label: 'Search',
122
123
  },
124
+ // A checkbox rather than the usual Status select with a "Show Deleted"
125
+ // isolate. Isolating the deleted rows would strand them: a deleted
126
+ // report in a live folder arrives without the folder it sits in, and a
127
+ // tree cannot place a node whose parent it never received. So the
128
+ // toggle asks for everything, and the rows mark what is deleted.
123
129
  {
124
130
  name: 'state',
125
- type: ItemType.Select,
126
- label: 'Status',
127
- multiple: true,
128
- values: () => ReportStates,
129
- isolate: { label: 'Show Deleted', value: ReportState.Deleted },
131
+ type: ItemType.Checkbox,
132
+ label: 'Show Deleted',
133
+ checked: [ReportState.Active, ReportState.Deleted].join(','),
130
134
  },
131
135
  ],
132
136
  actions: [
@@ -159,15 +163,19 @@ export class FsAiReportsComponent {
159
163
  click: () => this.createReport(),
160
164
  },
161
165
  ],
162
- // The two items are answered in different places and both have to run.
163
- // The keyword drives the tree's own search, which is the whole point of
164
- // searching a tree — it reveals a match nested inside collapsed folders
165
- // rather than only filtering what is already on screen. `state` is the
166
- // Show Deleted toggle, and only the server can answer that.
166
+ // The two items are answered in different places, and each only when it
167
+ // changed. The keyword drives the tree's own search, which is the whole
168
+ // point of searching a tree — it reveals a match nested inside collapsed
169
+ // folders rather than only filtering what is already on screen. `state` is
170
+ // the Show Deleted toggle, and only the server can answer that. Running the
171
+ // search on a toggle would clear it, and clearing collapses the tree.
167
172
  change: (query) => {
173
+ const keywordChanged = String(query?.keyword ?? '') !== String(this._query.keyword ?? '');
168
174
  const stateChanged = String(query?.state ?? '') !== String(this._query.state ?? '');
169
175
  this._query = { ...query };
170
- this._search(query?.keyword);
176
+ if (keywordChanged) {
177
+ this._search(query?.keyword);
178
+ }
171
179
  if (stateChanged) {
172
180
  this._load();
173
181
  }
@@ -175,22 +183,26 @@ export class FsAiReportsComponent {
175
183
  };
176
184
  }
177
185
  _initTreeConfig() {
186
+ // No expandLevel: every folder starts collapsed.
178
187
  this.treeConfig = {
179
188
  data: [],
180
189
  childrenName: 'children',
181
- expandLevel: FsAiReportsComponent.EXPAND_LEVEL,
182
190
  draggable: true,
183
191
  // The whole row is the grip and the handle stays hidden; a press only
184
192
  // becomes a drag once the pointer moves, so the kebab, the chevron and the
185
193
  // report link all stay clickable.
186
194
  dragMode: TreeDragMode.Node,
195
+ // Anything deleted is restored before it is moved — the backend refuses
196
+ // to edit a deleted row, and a drag would only snap back.
197
+ canDrag: (node) => !this._isDeletedNode(node),
187
198
  // canDrop is asked about the node being DRAGGED, so only `toParent`
188
199
  // describes the destination — reading node.level/node.parent here would
189
200
  // describe where it came from. A report can never be a parent because its
190
201
  // type says so, and that single test is the whole "folders nest, reports
191
- // are leaves" rule on this side.
202
+ // are leaves" rule on this side. A deleted folder is no destination
203
+ // either: whatever landed in it would vanish from the live listing.
192
204
  canDrop: (node, fromParent, toParent) => {
193
- return !toParent || toParent.data?.type === ReportNodeType.Folder;
205
+ return !toParent || (this._isFolderNode(toParent) && !this._isDeletedNode(toParent));
194
206
  },
195
207
  changeReorder: (event) => this._move(event),
196
208
  nodeClass: (node) => node.data?.type,
@@ -214,12 +226,12 @@ export class FsAiReportsComponent {
214
226
  },
215
227
  {
216
228
  label: 'New report',
217
- show: (node) => this._isFolderNode(node),
229
+ show: (node) => this._isFolderNode(node) && !this._isDeletedNode(node),
218
230
  click: (node) => this.createReport(node.data?.id),
219
231
  },
220
232
  {
221
233
  label: 'New folder',
222
- show: (node) => this._isFolderNode(node),
234
+ show: (node) => this._isFolderNode(node) && !this._isDeletedNode(node),
223
235
  click: (node) => this._createFolder(node.data?.id),
224
236
  },
225
237
  {
@@ -227,8 +239,8 @@ export class FsAiReportsComponent {
227
239
  show: (node) => !this._isDeletedNode(node),
228
240
  click: (node) => this._delete(node),
229
241
  },
230
- // Folders never reach this: they hard delete, so a deleted folder
231
- // does not exist to be restored.
242
+ // On every deleted row, including a live one that is only hidden by
243
+ // a deleted folder above it — restoring that brings the folder back.
232
244
  {
233
245
  label: 'Restore',
234
246
  show: (node) => this._isDeletedNode(node),
@@ -243,66 +255,128 @@ export class FsAiReportsComponent {
243
255
  return node?.data?.type === ReportNodeType.Folder;
244
256
  }
245
257
  _isDeletedNode(node) {
246
- return this.isDeleted(node?.data?.report);
258
+ return !!node?.data?.deleted;
247
259
  }
248
260
  // Drive the tree's built-in search: it collapses everything, hides every node,
249
261
  // then unhides each match and walks its ancestors open, so a report several
250
- // folders deep surfaces with its path expanded. Clearing does NOT undo that
251
- // initial collapse, so the tree is re-opened here otherwise the listing is
252
- // left fully collapsed the moment somebody empties the search box.
262
+ // folders deep surfaces with its path expanded. Clearing collapses everything
263
+ // again, so the folders that were open before the search are put back.
253
264
  _search(keyword) {
254
265
  const tree = this._tree();
255
266
  if (!tree) {
256
267
  return;
257
268
  }
258
269
  if (keyword) {
270
+ this._expandedBeforeSearch ??= this._expandedKeys();
259
271
  tree.search(keyword);
260
272
  return;
261
273
  }
262
274
  tree.clearSearch();
263
- tree.expandAll();
275
+ this._expandKeys(this._expandedBeforeSearch ?? []);
276
+ this._expandedBeforeSearch = null;
264
277
  }
265
278
  _load() {
266
- this._reportData.tree(this._query)
279
+ // Only the Show Deleted toggle is the server's to answer — the keyword is
280
+ // the tree's own search — and an unchecked toggle sends nothing, leaving the
281
+ // backend's active-only default in charge.
282
+ const query = this._query.state ? { state: this._query.state } : {};
283
+ this._reportData.tree(query)
267
284
  .pipe(takeUntilDestroyed(this._destroyRef))
268
- .subscribe((tree) => {
269
- const nodes = this._buildNodes(tree);
285
+ .subscribe((reportTree) => {
286
+ const nodes = this._buildNodes(reportTree);
270
287
  this.nodes.set(nodes);
271
288
  // The tree reads `config` once, in its own ngOnInit. The first load
272
289
  // lands before it exists, so the data has to arrive through the config;
273
290
  // every later one has to go through the instance or nothing changes.
274
291
  this.treeConfig = { ...this.treeConfig, data: nodes };
275
- this._tree()?.setData(nodes);
292
+ const tree = this._tree();
293
+ if (!tree) {
294
+ return;
295
+ }
296
+ // setData() rebuilds every node collapsed, so a rename or a move would
297
+ // otherwise slam shut every folder somebody had opened. Keys are stable
298
+ // across loads ('f:12'), so what was open is reopened by key — and a
299
+ // folder that no longer comes back simply is not.
300
+ const expandedKeys = this._expandedKeys();
301
+ tree.setData(nodes);
302
+ this._expandKeys(expandedKeys);
303
+ const keyword = String(this._query.keyword ?? '');
304
+ if (keyword) {
305
+ tree.search(keyword);
306
+ }
276
307
  });
277
308
  }
309
+ // The keys of every open folder, walked through the tree's public node API.
310
+ _expandedKeys() {
311
+ const tree = this._tree();
312
+ if (!tree) {
313
+ return [];
314
+ }
315
+ const walk = (parent) => tree.getNodes(parent)
316
+ .filter((node) => node.isExpanded())
317
+ .flatMap((node) => [node.data?.key, ...walk(node)]);
318
+ return walk(null);
319
+ }
320
+ _expandKeys(keys) {
321
+ const tree = this._tree();
322
+ if (!tree || !keys.length) {
323
+ return;
324
+ }
325
+ const open = new Set(keys);
326
+ const walk = (parent) => {
327
+ tree.getNodes(parent)
328
+ .filter((node) => open.has(node.data?.key))
329
+ .forEach((node) => {
330
+ node.expand();
331
+ walk(node);
332
+ });
333
+ };
334
+ walk(null);
335
+ }
278
336
  // Flat API rows → the nested shape fs-tree renders. Folders come before
279
337
  // reports at every level, each already name-ordered by the backend.
280
- _buildNodes(tree) {
281
- const folders = tree?.folders ?? [];
282
- const reports = tree?.reports ?? [];
283
- const build = (parentId) => {
338
+ //
339
+ // `deleted` is inherited downward: a deleted folder hides everything below it
340
+ // without the rows below being deleted themselves, and that is only visible
341
+ // from here, where the parent is in hand. The backend applies the same rule
342
+ // when it filters (ReportFolderModel::getDeletedFolderIds()).
343
+ _buildNodes(reportTree) {
344
+ const folders = reportTree?.folders ?? [];
345
+ const reports = reportTree?.reports ?? [];
346
+ const build = (parentId, parentDeleted) => {
284
347
  const folderNodes = folders
285
348
  .filter((folder) => (folder.parentReportFolderId ?? null) === parentId)
286
- .map((folder) => ({
287
- key: `f:${folder.id}`,
288
- id: folder.id,
289
- name: folder.name,
290
- type: ReportNodeType.Folder,
291
- children: build(folder.id),
292
- }));
349
+ .map((folder) => {
350
+ const stateDeleted = folder.state === ReportState.Deleted;
351
+ const deleted = parentDeleted || stateDeleted;
352
+ return {
353
+ key: `f:${folder.id}`,
354
+ id: folder.id,
355
+ name: folder.name,
356
+ type: ReportNodeType.Folder,
357
+ children: build(folder.id, deleted),
358
+ stateDeleted,
359
+ deleted,
360
+ };
361
+ });
293
362
  const reportNodes = reports
294
363
  .filter((report) => (report.reportFolderId ?? null) === parentId)
295
- .map((report) => ({
296
- key: `r:${report.id}`,
297
- id: report.id,
298
- name: report.name,
299
- type: ReportNodeType.Report,
300
- children: [],
301
- report,
302
- }));
364
+ .map((report) => {
365
+ const stateDeleted = report.state === ReportState.Deleted;
366
+ return {
367
+ key: `r:${report.id}`,
368
+ id: report.id,
369
+ name: report.name,
370
+ type: ReportNodeType.Report,
371
+ children: [],
372
+ report,
373
+ stateDeleted,
374
+ deleted: parentDeleted || stateDeleted,
375
+ };
376
+ });
303
377
  return [...folderNodes, ...reportNodes];
304
378
  };
305
- return build(null);
379
+ return build(null, false);
306
380
  }
307
381
  // A drop moved a node under a new parent, or out to the root. The tree has
308
382
  // already moved it on screen, so both outcomes reload: a success to pick up
@@ -363,9 +437,9 @@ export class FsAiReportsComponent {
363
437
  this._load();
364
438
  });
365
439
  }
366
- // Deleting a folder is refused server-side while it still holds a sub-folder
367
- // or an active report, and the message says which so the confirm here warns
368
- // that a folder delete is permanent rather than trying to restate the rule.
440
+ // A folder deletes with everything in it, so the confirm says what that is —
441
+ // and that it all comes back from Show Deleted, which is what makes it safe to
442
+ // offer.
369
443
  _delete(node) {
370
444
  const data = node?.data;
371
445
  if (!data) {
@@ -375,7 +449,7 @@ export class FsAiReportsComponent {
375
449
  this._prompt.confirm({
376
450
  title: 'Confirm',
377
451
  template: folder
378
- ? `Are you sure you would like to delete the folder "${data.name}"? This cannot be undone.`
452
+ ? this._deleteFolderMessage(data)
379
453
  : 'Are you sure you would like to delete this report?',
380
454
  })
381
455
  .pipe(switchMap(() => (folder
@@ -386,15 +460,41 @@ export class FsAiReportsComponent {
386
460
  this._load();
387
461
  });
388
462
  }
463
+ // Counted from the node already on screen, live rows only: in Show Deleted
464
+ // mode the folder can also hold rows that are gone already, and those are not
465
+ // leaving with it.
466
+ _deleteFolderMessage(folder) {
467
+ const count = (node) => node.children
468
+ .filter((child) => !child.deleted)
469
+ .reduce((total, child) => {
470
+ const below = count(child);
471
+ return {
472
+ folders: total.folders + below.folders + (child.type === ReportNodeType.Folder ? 1 : 0),
473
+ reports: total.reports + below.reports + (child.type === ReportNodeType.Report ? 1 : 0),
474
+ };
475
+ }, { folders: 0, reports: 0 });
476
+ const { folders, reports } = count(folder);
477
+ const contents = [
478
+ folders ? `${folders} ${folders === 1 ? 'folder' : 'folders'}` : '',
479
+ reports ? `${reports} ${reports === 1 ? 'report' : 'reports'}` : '',
480
+ ].filter(Boolean);
481
+ const inside = contents.length ? ` and the ${contents.join(' and ')} inside it` : '';
482
+ return `Are you sure you would like to delete the folder "${folder.name}"${inside}? It can be restored from Show Deleted.`;
483
+ }
484
+ // Both endpoints also restore any deleted folder above the row, so a row that
485
+ // is live itself but hidden by a deleted folder is restored by the same call.
389
486
  _restore(node) {
390
487
  const data = node?.data;
391
488
  if (!data) {
392
489
  return;
393
490
  }
394
- this._reportData.undelete(data.id)
491
+ const folder = data.type === ReportNodeType.Folder;
492
+ (folder
493
+ ? this._reportData.undeleteFolder(data.id)
494
+ : this._reportData.undelete(data.id))
395
495
  .pipe(takeUntilDestroyed(this._destroyRef))
396
496
  .subscribe(() => {
397
- this._message.success('Restored report');
497
+ this._message.success(folder ? 'Restored folder' : 'Restored report');
398
498
  this._load();
399
499
  });
400
500
  }
@@ -414,16 +514,17 @@ export class FsAiReportsComponent {
414
514
  return segments;
415
515
  }
416
516
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FsAiReportsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
417
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FsAiReportsComponent, isStandalone: true, selector: "fs-ai-reports", inputs: { basePath: { classPropertyName: "basePath", publicName: "basePath", isSignal: true, isRequired: false, transformFunction: null }, openPattern: { classPropertyName: "openPattern", publicName: "openPattern", isSignal: true, isRequired: false, transformFunction: null }, createPattern: { classPropertyName: "createPattern", publicName: "createPattern", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_tree", first: true, predicate: FsTreeComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<fs-filter [config]=\"filterConfig\"></fs-filter>\n\n<ng-container *fsSkeleton=\"nodes()\">\n <fs-tree [config]=\"treeConfig\">\n <ng-template\n fsTreeNode\n let-data=\"data\">\n <div class=\"fs-row.gap-sm.align-center node-row\">\n <mat-icon class=\"node-icon\">\n {{ data.type === nodeType.Folder ? 'folder' : 'insert_chart_outlined' }}\n </mat-icon>\n\n @if (data.type === nodeType.Folder) {\n <span class=\"node-name\">{{ data.name }}</span>\n } @else if (isDeleted(data.report)) {\n <!-- A deleted report can't be opened (the backend only assembles\n active ones), so in Show Deleted mode the name is plain text \u2014\n restore it from the row menu first. -->\n <span class=\"node-name\">{{ data.name }}</span>\n } @else {\n <a\n class=\"node-name\"\n [routerLink]=\"openLink(data.report)\">\n {{ data.name }}\n </a>\n }\n </div>\n </ng-template>\n </fs-tree>\n\n @if (!nodes().length) {\n <p class=\"small tree-empty\">\n No reports yet. Create one, or add a folder to group them.\n </p>\n }\n</ng-container>\n", styles: ["a{cursor:pointer}fs-tree .node>.container{flex:1;min-width:0}fs-tree .node>.container>.content{min-width:0}fs-tree .node>.container>button{margin-top:-5px}.node-row{min-width:0}.node-icon{font-size:18px;width:18px;height:18px;flex:none}.node-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-empty{margin-top:10px}\n"], dependencies: [{ kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i1.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i2.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }, { kind: "ngmodule", type: FsTreeModule }, { kind: "component", type: i3.FsTreeComponent, selector: "fs-tree", inputs: ["config"] }, { kind: "directive", type: i3.FsTreeNodeDirective, selector: "[fsTreeNode]", inputs: ["class"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
517
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FsAiReportsComponent, isStandalone: true, selector: "fs-ai-reports", inputs: { basePath: { classPropertyName: "basePath", publicName: "basePath", isSignal: true, isRequired: false, transformFunction: null }, openPattern: { classPropertyName: "openPattern", publicName: "openPattern", isSignal: true, isRequired: false, transformFunction: null }, createPattern: { classPropertyName: "createPattern", publicName: "createPattern", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_tree", first: true, predicate: FsTreeComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<fs-filter [config]=\"filterConfig\"></fs-filter>\n\n<ng-container *fsSkeleton=\"nodes()\">\n <fs-tree [config]=\"treeConfig\">\n <ng-template\n fsTreeNode\n let-data=\"data\">\n <div\n class=\"fs-row.gap-sm.align-center node-row\"\n [class.deleted]=\"data.deleted\">\n <mat-icon class=\"node-icon\">\n {{ data.type === nodeType.Folder ? 'folder' : 'insert_chart_outlined' }}\n </mat-icon>\n\n @if (data.type === nodeType.Folder || data.deleted) {\n <!-- A deleted report can't be opened (the backend only assembles\n live ones, and one under a deleted folder is not on the live\n listing), so in Show Deleted mode the name is plain text \u2014\n restore it from the row menu first. -->\n <span class=\"node-name\">{{ data.name }}</span>\n } @else {\n <a\n class=\"node-name\"\n [routerLink]=\"openLink(data.report)\">\n {{ data.name }}\n </a>\n }\n\n <!-- Only on the row somebody deleted. Everything under a deleted\n folder is muted with it, but was not deleted itself. -->\n @if (data.stateDeleted) {\n <fs-chip size=\"tiny\">Deleted</fs-chip>\n }\n </div>\n </ng-template>\n </fs-tree>\n\n @if (!nodes().length) {\n <p class=\"small tree-empty\">\n No reports yet. Create one, or add a folder to group them.\n </p>\n }\n</ng-container>\n", styles: ["a{cursor:pointer}fs-tree .node>.container{flex:1;min-width:0}fs-tree .node>.container>.content{min-width:0}fs-tree .node>.container>button{margin-top:-5px}.node-row{min-width:0}.node-row.deleted{opacity:.55}.node-icon{font-size:18px;width:18px;height:18px;flex:none}.node-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-empty{margin-top:10px}\n"], dependencies: [{ kind: "ngmodule", type: FsChipModule }, { kind: "component", type: i1.FsChipComponent, selector: "fs-chip", inputs: ["selectable", "removable", "value", "maxWidth", "width", "backgroundColor", "borderColor", "color", "shape", "outlined", "outlineDash", "icon", "image", "selected", "disabled", "padding", "contrastColor", "size"], outputs: ["selectedToggled", "removed", "click"] }, { kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i2.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i3.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }, { kind: "ngmodule", type: FsTreeModule }, { kind: "component", type: i4.FsTreeComponent, selector: "fs-tree", inputs: ["config"] }, { kind: "directive", type: i4.FsTreeNodeDirective, selector: "[fsTreeNode]", inputs: ["class"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
418
518
  }
419
519
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FsAiReportsComponent, decorators: [{
420
520
  type: Component,
421
521
  args: [{ selector: 'fs-ai-reports', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
522
+ FsChipModule,
422
523
  FsFilterModule,
423
524
  FsSkeletonModule,
424
525
  FsTreeModule,
425
526
  MatIconModule,
426
527
  RouterLink,
427
- ], template: "<fs-filter [config]=\"filterConfig\"></fs-filter>\n\n<ng-container *fsSkeleton=\"nodes()\">\n <fs-tree [config]=\"treeConfig\">\n <ng-template\n fsTreeNode\n let-data=\"data\">\n <div class=\"fs-row.gap-sm.align-center node-row\">\n <mat-icon class=\"node-icon\">\n {{ data.type === nodeType.Folder ? 'folder' : 'insert_chart_outlined' }}\n </mat-icon>\n\n @if (data.type === nodeType.Folder) {\n <span class=\"node-name\">{{ data.name }}</span>\n } @else if (isDeleted(data.report)) {\n <!-- A deleted report can't be opened (the backend only assembles\n active ones), so in Show Deleted mode the name is plain text \u2014\n restore it from the row menu first. -->\n <span class=\"node-name\">{{ data.name }}</span>\n } @else {\n <a\n class=\"node-name\"\n [routerLink]=\"openLink(data.report)\">\n {{ data.name }}\n </a>\n }\n </div>\n </ng-template>\n </fs-tree>\n\n @if (!nodes().length) {\n <p class=\"small tree-empty\">\n No reports yet. Create one, or add a folder to group them.\n </p>\n }\n</ng-container>\n", styles: ["a{cursor:pointer}fs-tree .node>.container{flex:1;min-width:0}fs-tree .node>.container>.content{min-width:0}fs-tree .node>.container>button{margin-top:-5px}.node-row{min-width:0}.node-icon{font-size:18px;width:18px;height:18px;flex:none}.node-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-empty{margin-top:10px}\n"] }]
528
+ ], template: "<fs-filter [config]=\"filterConfig\"></fs-filter>\n\n<ng-container *fsSkeleton=\"nodes()\">\n <fs-tree [config]=\"treeConfig\">\n <ng-template\n fsTreeNode\n let-data=\"data\">\n <div\n class=\"fs-row.gap-sm.align-center node-row\"\n [class.deleted]=\"data.deleted\">\n <mat-icon class=\"node-icon\">\n {{ data.type === nodeType.Folder ? 'folder' : 'insert_chart_outlined' }}\n </mat-icon>\n\n @if (data.type === nodeType.Folder || data.deleted) {\n <!-- A deleted report can't be opened (the backend only assembles\n live ones, and one under a deleted folder is not on the live\n listing), so in Show Deleted mode the name is plain text \u2014\n restore it from the row menu first. -->\n <span class=\"node-name\">{{ data.name }}</span>\n } @else {\n <a\n class=\"node-name\"\n [routerLink]=\"openLink(data.report)\">\n {{ data.name }}\n </a>\n }\n\n <!-- Only on the row somebody deleted. Everything under a deleted\n folder is muted with it, but was not deleted itself. -->\n @if (data.stateDeleted) {\n <fs-chip size=\"tiny\">Deleted</fs-chip>\n }\n </div>\n </ng-template>\n </fs-tree>\n\n @if (!nodes().length) {\n <p class=\"small tree-empty\">\n No reports yet. Create one, or add a folder to group them.\n </p>\n }\n</ng-container>\n", styles: ["a{cursor:pointer}fs-tree .node>.container{flex:1;min-width:0}fs-tree .node>.container>.content{min-width:0}fs-tree .node>.container>button{margin-top:-5px}.node-row{min-width:0}.node-row.deleted{opacity:.55}.node-icon{font-size:18px;width:18px;height:18px;flex:none}.node-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-empty{margin-top:10px}\n"] }]
428
529
  }], ctorParameters: () => [] });
429
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvdmlld3MvcmVwb3J0cy9mcy1haS1yZXBvcnRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnRzL2ZzLWFpLXJlcG9ydHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUVWLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQWdCLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFFTCxlQUFlLEVBQ2YsWUFBWSxFQUdaLGNBQWMsRUFDZCxZQUFZLEdBQ2IsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0Is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T0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzt3R0EvYlUsb0JBQW9COzRGQUFwQixvQkFBb0IsdWhCQXlCSSxlQUFlLGdFQ3pHcEQseXNDQW9DQSxvWkRxQ0ksY0FBYyxrS0FDZCxnQkFBZ0IsaUtBQ2hCLFlBQVksME5BQ1osYUFBYSxvTEFDYixVQUFVOzs0RkFHRCxvQkFBb0I7a0JBZGhDLFNBQVM7K0JBQ0UsZUFBZSxtQkFHUix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixhQUFhO3dCQUNiLFVBQVU7cUJBQ1giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBPbkluaXQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5cbmltcG9ydCB7IEZpbHRlckNvbmZpZywgRnNGaWx0ZXJNb2R1bGUsIEl0ZW1UeXBlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7XG4gIEZsYXRJdGVtTm9kZSxcbiAgRnNUcmVlQ29tcG9uZW50LFxuICBGc1RyZWVNb2R1bGUsXG4gIElUcmVlQ2hhbmdlUmVvcmRlcixcbiAgSVRyZWVDb25maWcsXG4gIFRyZWVBY3Rpb25UeXBlLFxuICBUcmVlRHJhZ01vZGUsXG59IGZyb20gJ0BmaXJlc3RpdGNoL3RyZWUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgR2xvYmFsU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuLi8uLi9kaWFsb2dzL2dsb2JhbC1zZXR0aW5ncy9nbG9iYWwtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFJlcG9ydEZvbGRlcixcbiAgUmVwb3J0TGlzdEl0ZW0sXG4gIFJlcG9ydE5vZGUsXG4gIFJlcG9ydE5vZGVUeXBlLFxuICBSZXBvcnRTdGF0ZSxcbiAgUmVwb3J0U3RhdGVzLFxuICBSZXBvcnRUcmVlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIFRoZSByZXBvcnRzIGxpc3Rpbmcg4oCUIGFuIGZzLXRyZWUgb2YgZm9sZGVycyBhbmQgdGhlIHJlcG9ydHMgZmlsZWQgaW50byB0aGVtLlxuLy8gUm93cyBsaW5rIG91dCB0aHJvdWdoIGEgVVJMIHBhdHRlcm4gKGEgJzppZCcgdG9rZW4g4oaSIHRoZSByZXBvcnQgaWQ7IGEgbGVhZGluZ1xuLy8gJy8nIG1ha2VzIGl0IGFic29sdXRlLCBvdGhlcndpc2UgaXQncyByZWxhdGl2ZSB0byB0aGlzIGNvbXBvbmVudCdzIHJvdXRlKS5cbi8vIENyZWF0ZSBwcm9tcHRzIGZvciBhIHRpdGxlLCBjcmVhdGVzIHRoZSByZXBvcnQsIHRoZW4gcm91dGVzIHRvIGl0LiBUaGUgZ2VhclxuLy8gb3BlbnMgdGhlIGdsb2JhbCBSZXBvcnQgU2V0dGluZ3MgZGlhbG9nIChBSSBrbm93bGVkZ2UgZG9jdW1lbnQgK1xuLy8gc2VtYW50aWMtZGF0YWJhc2UgYnVpbGQpLCB3aGljaCBsaXZlcyBpbiB0aGlzIHBhY2thZ2UuIE5vIHJvdXRpbmcgaXNcbi8vIGhhcmQtY29kZWQgaGVyZS5cbi8vXG4vLyBGb2xkZXJzIG5lc3Q7IHJlcG9ydHMgYXJlIGFsd2F5cyBsZWF2ZXMg4oCUIGNhbkRyb3AgZW5mb3JjZXMgaXQgaGVyZSwgYW5kIHRoZVxuLy8gYmFja2VuZCBlbmZvcmNlcyBpdCBzdHJ1Y3R1cmFsbHkgYnkga2VlcGluZyB0aGUgdHJlZSBpbiBpdHMgb3duIHRhYmxlLiBBXG4vLyByZXBvcnQgaW4gbm8gZm9sZGVyIGlzIGEgcm9vdCBub2RlLCB3aGljaCBpcyB3aGVyZSBldmVyeSByZXBvcnQgc2F0IGJlZm9yZVxuLy8gZm9sZGVycyBleGlzdGVkLCBzbyBub3RoaW5nIGhhZCB0byBiZSBtaWdyYXRlZCBvciBidWNrZXRlZCBhcyBcInVuY2F0ZWdvcml6ZWRcIi5cbi8vXG4vLyBSZXBvcnRzIGFyZSBzb2Z0LWRlbGV0YWJsZTogdGhlIHJvdyBrZWJhYiBkZWxldGVzLCBcIlNob3cgRGVsZXRlZFwiIGZsaXBzIHRoZVxuLy8gbGlzdGluZyBpbnRvIGRlbGV0ZWQgbW9kZSAodGhlIGJhY2tlbmQgaGlkZXMgZGVsZXRlZCByZXBvcnRzIG90aGVyd2lzZSksIGFuZFxuLy8gaW4gdGhhdCBtb2RlIHRoZSBrZWJhYiBvZmZlcnMgUmVzdG9yZSBpbnN0ZWFkLiBGb2xkZXJzIGRvIE5PVCB0YWtlIHBhcnQgaW5cbi8vIHRoYXQg4oCUIGEgZm9sZGVyIGlzIG9ubHkgZGVsZXRhYmxlIG9uY2UgaXQgaXMgZW1wdHksIHNvIGl0IGhhcmQgZGVsZXRlcyBhbmQgaGFzXG4vLyBub3RoaW5nIHRvIHJlc3RvcmUuIFRoZSB1cHNob3QgaXMgdGhhdCBkZWxldGVkIG1vZGUga2VlcHMgdGhlIGZvbGRlciBzdHJ1Y3R1cmVcbi8vIG9uIHNjcmVlbiB3aXRoIHRoZSBkZWxldGVkIHJlcG9ydHMgc2l0dGluZyB3aGVyZSB0aGV5IGJlbG9uZywgc28gcmVzdG9yaW5nIG9uZVxuLy8gcHV0cyBpdCBiYWNrIHJhdGhlciB0aGFuIGRyb3BwaW5nIGl0IGF0IHRoZSByb290LlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtYWktcmVwb3J0cycsXG4gIHRlbXBsYXRlVXJsOiAnLi9mcy1haS1yZXBvcnRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZnMtYWktcmVwb3J0cy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZzRmlsdGVyTW9kdWxlLFxuICAgIEZzU2tlbGV0b25Nb2R1bGUsXG4gICAgRnNUcmVlTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgUm91dGVyTGluayxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNBaVJlcG9ydHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8vIEhvdyBkZWVwIHRoZSB0cmVlIG9wZW5zIG9uIGxvYWQuIEZvbGRlcnMgYXJlIGF1ZGllbmNlIGJ1Y2tldHMsIG5vdCBhXG4gIC8vIGZpbGVzeXN0ZW0sIHNvIHRoZXJlIGlzIG5vdGhpbmcgd29ydGggaGlkaW5nIGJlaGluZCBhIGNsb3NlZCBjaGV2cm9uLlxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVYUEFORF9MRVZFTCA9IDEwO1xuXG4gIC8vIEFQSSBiYXNlIGZvciB0aGUgcmVwb3J0cyBlbmRwb2ludHM7IG92ZXJyaWRlIHRvIG1vdW50IGVsc2V3aGVyZS5cbiAgcHVibGljIHJlYWRvbmx5IGJhc2VQYXRoID0gaW5wdXQ8c3RyaW5nPigncmVwb3J0cycpO1xuXG4gIC8vIFdoZXJlIGEgcm93IGxpbmtzIHRvOyAnOmlkJyBpcyByZXBsYWNlZCB3aXRoIHRoZSByZXBvcnQgaWQuIERlZmF1bHQgdGFrZXNcbiAgLy8geW91IHRvIDxjdXJyZW50IHJvdXRlPi86aWQuIEFic29sdXRlIHdoZW4gaXQgc3RhcnRzIHdpdGggJy8nLlxuICBwdWJsaWMgcmVhZG9ubHkgb3BlblBhdHRlcm4gPSBpbnB1dDxzdHJpbmc+KCc6aWQnKTtcblxuICAvLyBXaGVyZSBhIGZyZXNobHktY3JlYXRlZCByZXBvcnQgcm91dGVzIHRvOyBzYW1lICc6aWQnIHBhdHRlcm4gcnVsZXMuXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVQYXR0ZXJuID0gaW5wdXQ8c3RyaW5nPignOmlkJyk7XG5cbiAgLy8gTnVsbCB1bnRpbCB0aGUgZmlyc3QgbG9hZCByZXNvbHZlcyDigJQgdGhhdCBpcyB3aGF0IGdhdGVzICpmc1NrZWxldG9uLlxuICBwdWJsaWMgcmVhZG9ubHkgbm9kZXMgPSBzaWduYWw8UmVwb3J0Tm9kZVtdPihudWxsKTtcblxuICBwdWJsaWMgdHJlZUNvbmZpZzogSVRyZWVDb25maWc8UmVwb3J0Tm9kZVtdPjtcbiAgcHVibGljIGZpbHRlckNvbmZpZzogRmlsdGVyQ29uZmlnO1xuXG4gIC8vIFRlbXBsYXRlLXNpZGUgaGFuZGxlIG9uIHRoZSBlbnVtLCBzbyBhIHJvdyBjYW4gdGVsbCBhIGZvbGRlciBmcm9tIGEgcmVwb3J0LlxuICBwdWJsaWMgcmVhZG9ubHkgbm9kZVR5cGUgPSBSZXBvcnROb2RlVHlwZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90cmVlID0gdmlld0NoaWxkKEZzVHJlZUNvbXBvbmVudCk7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgX3JvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIF9kaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAvLyBUaGUgZmlsdGVyIGJhcidzIGN1cnJlbnQgcXVlcnkg4oCUIGNhcnJpZXMgYHN0YXRlYCB3aGVuIFNob3cgRGVsZXRlZCBpcyBvbi5cbiAgcHJpdmF0ZSBfcXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydERhdGEuYmFzZVBhdGggPSB0aGlzLmJhc2VQYXRoKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gU2V0IGJlZm9yZSB0aGUgZmlyc3QgZmV0Y2ggcmF0aGVyIHRoYW4gd2FpdGluZyBvbiB0aGUgZWZmZWN0IGFib3ZlLCB3aGljaFxuICAgIC8vIGRvZXMgbm90IHJ1biB1bnRpbCBhZnRlciB0aGUgaW5pdGlhbCBjaGFuZ2UgZGV0ZWN0aW9uIHBhc3MuXG4gICAgdGhpcy5fcmVwb3J0RGF0YS5iYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGgoKTtcblxuICAgIHRoaXMuX2luaXRGaWx0ZXJDb25maWcoKTtcbiAgICB0aGlzLl9pbml0VHJlZUNvbmZpZygpO1xuICAgIHRoaXMuX2xvYWQoKTtcbiAgfVxuXG4gIC8vIHJvdXRlckxpbmsgY29tbWFuZHMgZm9yIGEgcmVwb3J0IHJvdyAoYnVpbHQgZnJvbSBvcGVuUGF0dGVybikuXG4gIHB1YmxpYyBvcGVuTGluayhyZXBvcnQ6IFJlcG9ydExpc3RJdGVtKTogdW5rbm93bltdIHtcbiAgICByZXR1cm4gdGhpcy5fcGF0dGVybkNvbW1hbmRzKHRoaXMub3BlblBhdHRlcm4oKSwgcmVwb3J0LmlkKTtcbiAgfVxuXG4gIC8vIEEgZGVsZXRlZCByZXBvcnQgY2FuJ3QgYmUgb3BlbmVkIOKAlCB0aGUgYmFja2VuZCBvbmx5IGFzc2VtYmxlcyBhY3RpdmUgb25lcyDigJRcbiAgLy8gc28gaW4gU2hvdyBEZWxldGVkIG1vZGUgaXRzIG5hbWUgcmVuZGVycyBhcyBwbGFpbiB0ZXh0IHJhdGhlciB0aGFuIGEgbGluay5cbiAgcHVibGljIGlzRGVsZXRlZChyZXBvcnQ6IFJlcG9ydExpc3RJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlcG9ydD8uc3RhdGUgPT09IFJlcG9ydFN0YXRlLkRlbGV0ZWQ7XG4gIH1cblxuICAvLyBQcm9tcHQgZm9yIGEgdGl0bGUsIGNyZWF0ZSB0aGUgcmVwb3J0IOKAlCBmaWxlZCB1bmRlciByZXBvcnRGb2xkZXJJZCB3aGVuIGFcbiAgLy8gZm9sZGVyJ3Mga2ViYWIgYXNrZWQsIGF0IHRoZSByb290IG90aGVyd2lzZSDigJQgdGhlbiByb3V0ZSB0byBpdCAoY3JlYXRlUGF0dGVybikuXG4gIHB1YmxpYyBjcmVhdGVSZXBvcnQocmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9wcm9tcHQuaW5wdXQoe1xuICAgICAgdGl0bGU6ICdDcmVhdGUgUmVwb3J0JyxcbiAgICAgIGxhYmVsOiAnVGl0bGUnLFxuICAgICAgY29tbWl0TGFiZWw6ICdDcmVhdGUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKG5hbWU6IHN0cmluZykgPT4gdGhpcy5fcmVwb3J0RGF0YS5jcmVhdGUobmFtZSwgcmVwb3J0Rm9sZGVySWQpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVwb3J0OiBSZXBvcnRMaXN0SXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5jcmVhdGVQYXR0ZXJuKCk7XG4gICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICB0aGlzLl9wYXR0ZXJuQ29tbWFuZHMocGF0dGVybiwgcmVwb3J0LmlkKSxcbiAgICAgICAgICBwYXR0ZXJuLnN0YXJ0c1dpdGgoJy8nKSA/IHt9IDogeyByZWxhdGl2ZVRvOiB0aGlzLl9yb3V0ZSB9LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBUaGUgZ2xvYmFsIFJlcG9ydCBTZXR0aW5ncyBkaWFsb2c6IHRoZSBBSSBrbm93bGVkZ2UgZG9jdW1lbnQgYW5kIHRoZVxuICAvLyBzZW1hbnRpYy1kYXRhYmFzZSBidWlsZC4gQSBydW5uaW5nIGJ1aWxkIHN0cmVhbXMgaW50byB0aGUgRnNQcm9jZXNzIGRvY2ssXG4gIC8vIHdoaWNoIHN1cnZpdmVzIHRoZSBkaWFsb2cgY2xvc2luZy5cbiAgcHVibGljIG9wZW5TZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLl9kaWFsb2cub3BlbihHbG9iYWxTZXR0aW5nc0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc5MDBweCcsXG4gICAgICBtYXhXaWR0aDogJzk1dncnLFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEZpbHRlckNvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckNvbmZpZyA9IHtcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAna2V5d29yZCcsXG4gICAgICAgICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICAgICAgICBsYWJlbDogJ1NlYXJjaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc3RhdGUnLFxuICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICAgICAgdmFsdWVzOiAoKSA9PiBSZXBvcnRTdGF0ZXMsXG4gICAgICAgICAgaXNvbGF0ZTogeyBsYWJlbDogJ1Nob3cgRGVsZXRlZCcsIHZhbHVlOiBSZXBvcnRTdGF0ZS5EZWxldGVkIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWNvbjogJ3VuZm9sZF9tb3JlJyxcbiAgICAgICAgICB0b29sdGlwOiAnRXhwYW5kIGFsbCcsXG4gICAgICAgICAgcHJpbWFyeTogZmFsc2UsXG4gICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuX3RyZWUoKT8uZXhwYW5kQWxsKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpY29uOiAndW5mb2xkX2xlc3MnLFxuICAgICAgICAgIHRvb2x0aXA6ICdDb2xsYXBzZSBhbGwnLFxuICAgICAgICAgIHByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLl90cmVlKCk/LmNvbGxhcHNlQWxsKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpY29uOiAnc2V0dGluZ3MnLFxuICAgICAgICAgIHRvb2x0aXA6ICdSZXBvcnQgc2V0dGluZ3MnLFxuICAgICAgICAgIHByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLm9wZW5TZXR0aW5ncygpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdOZXcgRm9sZGVyJyxcbiAgICAgICAgICBwcmltYXJ5OiBmYWxzZSxcbiAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5fY3JlYXRlRm9sZGVyKG51bGwpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdDcmVhdGUnLFxuICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuY3JlYXRlUmVwb3J0KCksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLy8gVGhlIHR3byBpdGVtcyBhcmUgYW5zd2VyZWQgaW4gZGlmZmVyZW50IHBsYWNlcyBhbmQgYm90aCBoYXZlIHRvIHJ1bi5cbiAgICAgIC8vIFRoZSBrZXl3b3JkIGRyaXZlcyB0aGUgdHJlZSdzIG93biBzZWFyY2gsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBvZlxuICAgICAgLy8gc2VhcmNoaW5nIGEgdHJlZSDigJQgaXQgcmV2ZWFscyBhIG1hdGNoIG5lc3RlZCBpbnNpZGUgY29sbGFwc2VkIGZvbGRlcnNcbiAgICAgIC8vIHJhdGhlciB0aGFuIG9ubHkgZmlsdGVyaW5nIHdoYXQgaXMgYWxyZWFkeSBvbiBzY3JlZW4uIGBzdGF0ZWAgaXMgdGhlXG4gICAgICAvLyBTaG93IERlbGV0ZWQgdG9nZ2xlLCBhbmQgb25seSB0aGUgc2VydmVyIGNhbiBhbnN3ZXIgdGhhdC5cbiAgICAgIGNoYW5nZTogKHF1ZXJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlQ2hhbmdlZCA9IFN0cmluZyhxdWVyeT8uc3RhdGUgPz8gJycpICE9PSBTdHJpbmcodGhpcy5fcXVlcnkuc3RhdGUgPz8gJycpO1xuICAgICAgICB0aGlzLl9xdWVyeSA9IHsgLi4ucXVlcnkgfTtcblxuICAgICAgICB0aGlzLl9zZWFyY2gocXVlcnk/LmtleXdvcmQpO1xuXG4gICAgICAgIGlmIChzdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRUcmVlQ29uZmlnKCk6IHZvaWQge1xuICAgIHRoaXMudHJlZUNvbmZpZyA9IHtcbiAgICAgIGRhdGE6IFtdLFxuICAgICAgY2hpbGRyZW5OYW1lOiAnY2hpbGRyZW4nLFxuICAgICAgZXhwYW5kTGV2ZWw6IEZzQWlSZXBvcnRzQ29tcG9uZW50LkVYUEFORF9MRVZFTCxcbiAgICAgIGRyYWdnYWJsZTogdHJ1ZSxcbiAgICAgIC8vIFRoZSB3aG9sZSByb3cgaXMgdGhlIGdyaXAgYW5kIHRoZSBoYW5kbGUgc3RheXMgaGlkZGVuOyBhIHByZXNzIG9ubHlcbiAgICAgIC8vIGJlY29tZXMgYSBkcmFnIG9uY2UgdGhlIHBvaW50ZXIgbW92ZXMsIHNvIHRoZSBrZWJhYiwgdGhlIGNoZXZyb24gYW5kIHRoZVxuICAgICAgLy8gcmVwb3J0IGxpbmsgYWxsIHN0YXkgY2xpY2thYmxlLlxuICAgICAgZHJhZ01vZGU6IFRyZWVEcmFnTW9kZS5Ob2RlLFxuICAgICAgLy8gY2FuRHJvcCBpcyBhc2tlZCBhYm91dCB0aGUgbm9kZSBiZWluZyBEUkFHR0VELCBzbyBvbmx5IGB0b1BhcmVudGBcbiAgICAgIC8vIGRlc2NyaWJlcyB0aGUgZGVzdGluYXRpb24g4oCUIHJlYWRpbmcgbm9kZS5sZXZlbC9ub2RlLnBhcmVudCBoZXJlIHdvdWxkXG4gICAgICAvLyBkZXNjcmliZSB3aGVyZSBpdCBjYW1lIGZyb20uIEEgcmVwb3J0IGNhbiBuZXZlciBiZSBhIHBhcmVudCBiZWNhdXNlIGl0c1xuICAgICAgLy8gdHlwZSBzYXlzIHNvLCBhbmQgdGhhdCBzaW5nbGUgdGVzdCBpcyB0aGUgd2hvbGUgXCJmb2xkZXJzIG5lc3QsIHJlcG9ydHNcbiAgICAgIC8vIGFyZSBsZWF2ZXNcIiBydWxlIG9uIHRoaXMgc2lkZS5cbiAgICAgIGNhbkRyb3A6IChub2RlOiBGbGF0SXRlbU5vZGUsIGZyb21QYXJlbnQ6IEZsYXRJdGVtTm9kZSwgdG9QYXJlbnQ6IEZsYXRJdGVtTm9kZSkgPT4ge1xuICAgICAgICByZXR1cm4gIXRvUGFyZW50IHx8IHRvUGFyZW50LmRhdGE/LnR5cGUgPT09IFJlcG9ydE5vZGVUeXBlLkZvbGRlcjtcbiAgICAgIH0sXG4gICAgICBjaGFuZ2VSZW9yZGVyOiAoZXZlbnQ6IElUcmVlQ2hhbmdlUmVvcmRlcikgPT4gdGhpcy5fbW92ZShldmVudCksXG4gICAgICBub2RlQ2xhc3M6IChub2RlOiBGbGF0SXRlbU5vZGUpID0+IG5vZGUuZGF0YT8udHlwZSxcbiAgICAgIC8vIE1hdGNoIG9uIHRoZSBuYW1lIG9ubHkuIFRoZSBsaWJyYXJ5J3MgZGVmYXVsdCBtYXRjaGVyIHN0cmluZ2lmaWVzIHRoZVxuICAgICAgLy8gd2hvbGUgbm9kZSwgc28gaXQgd291bGQgaGl0IGlkcywgdGhlIGxpdGVyYWwgdHlwZSB3b3JkLCBhbmQgZXZlcnl0aGluZ1xuICAgICAgLy8gZWxzZSByaWRpbmcgb24gdGhlIHJvdy5cbiAgICAgIGZpbHRlckl0ZW06IChub2RlLCBxdWVyeSkgPT4ge1xuICAgICAgICByZXR1cm4gU3RyaW5nKG5vZGUuZGF0YT8ubmFtZSA/PyAnJylcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIC5pbmNsdWRlcyhTdHJpbmcocXVlcnkgPz8gJycpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfSxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFRyZWVBY3Rpb25UeXBlLk1lbnUsXG4gICAgICAgICAgaWNvbjogJ21vcmVfdmVydCcsXG4gICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZW5hbWUnLFxuICAgICAgICAgICAgICBzaG93OiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiAhdGhpcy5faXNEZWxldGVkTm9kZShub2RlKSxcbiAgICAgICAgICAgICAgY2xpY2s6IChub2RlOiBGbGF0SXRlbU5vZGUpID0+IHRoaXMuX3JlbmFtZShub2RlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnTmV3IHJlcG9ydCcsXG4gICAgICAgICAgICAgIHNob3c6IChub2RlOiBGbGF0SXRlbU5vZGUpID0+IHRoaXMuX2lzRm9sZGVyTm9kZShub2RlKSxcbiAgICAgICAgICAgICAgY2xpY2s6IChub2RlOiBGbGF0SXRlbU5vZGUpID0+IHRoaXMuY3JlYXRlUmVwb3J0KG5vZGUuZGF0YT8uaWQpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdOZXcgZm9sZGVyJyxcbiAgICAgICAgICAgICAgc2hvdzogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5faXNGb2xkZXJOb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5fY3JlYXRlRm9sZGVyKG5vZGUuZGF0YT8uaWQpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdEZWxldGUnLFxuICAgICAgICAgICAgICBzaG93OiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiAhdGhpcy5faXNEZWxldGVkTm9kZShub2RlKSxcbiAgICAgICAgICAgICAgY2xpY2s6IChub2RlOiBGbGF0SXRlbU5vZGUpID0+IHRoaXMuX2RlbGV0ZShub2RlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBGb2xkZXJzIG5ldmVyIHJlYWNoIHRoaXM6IHRoZXkgaGFyZCBkZWxldGUsIHNvIGEgZGVsZXRlZCBmb2xkZXJcbiAgICAgICAgICAgIC8vIGRvZXMgbm90IGV4aXN0IHRvIGJlIHJlc3RvcmVkLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ1Jlc3RvcmUnLFxuICAgICAgICAgICAgICBzaG93OiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiB0aGlzLl9pc0RlbGV0ZWROb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5fcmVzdG9yZShub2RlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzRm9sZGVyTm9kZShub2RlOiBGbGF0SXRlbU5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbm9kZT8uZGF0YT8udHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNEZWxldGVkTm9kZShub2RlOiBGbGF0SXRlbU5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0RlbGV0ZWQobm9kZT8uZGF0YT8ucmVwb3J0KTtcbiAgfVxuXG4gIC8vIERyaXZlIHRoZSB0cmVlJ3MgYnVpbHQtaW4gc2VhcmNoOiBpdCBjb2xsYXBzZXMgZXZlcnl0aGluZywgaGlkZXMgZXZlcnkgbm9kZSxcbiAgLy8gdGhlbiB1bmhpZGVzIGVhY2ggbWF0Y2ggYW5kIHdhbGtzIGl0cyBhbmNlc3RvcnMgb3Blbiwgc28gYSByZXBvcnQgc2V2ZXJhbFxuICAvLyBmb2xkZXJzIGRlZXAgc3VyZmFjZXMgd2l0aCBpdHMgcGF0aCBleHBhbmRlZC4gQ2xlYXJpbmcgZG9lcyBOT1QgdW5kbyB0aGF0XG4gIC8vIGluaXRpYWwgY29sbGFwc2UsIHNvIHRoZSB0cmVlIGlzIHJlLW9wZW5lZCBoZXJlIOKAlCBvdGhlcndpc2UgdGhlIGxpc3RpbmcgaXNcbiAgLy8gbGVmdCBmdWxseSBjb2xsYXBzZWQgdGhlIG1vbWVudCBzb21lYm9keSBlbXB0aWVzIHRoZSBzZWFyY2ggYm94LlxuICBwcml2YXRlIF9zZWFyY2goa2V5d29yZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdHJlZSA9IHRoaXMuX3RyZWUoKTtcbiAgICBpZiAoIXRyZWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5d29yZCkge1xuICAgICAgdHJlZS5zZWFyY2goa2V5d29yZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJlZS5jbGVhclNlYXJjaCgpO1xuICAgIHRyZWUuZXhwYW5kQWxsKCk7XG4gIH1cblxuICBwcml2YXRlIF9sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlcG9ydERhdGEudHJlZSh0aGlzLl9xdWVyeSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh0cmVlOiBSZXBvcnRUcmVlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fYnVpbGROb2Rlcyh0cmVlKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5zZXQobm9kZXMpO1xuXG4gICAgICAgIC8vIFRoZSB0cmVlIHJlYWRzIGBjb25maWdgIG9uY2UsIGluIGl0cyBvd24gbmdPbkluaXQuIFRoZSBmaXJzdCBsb2FkXG4gICAgICAgIC8vIGxhbmRzIGJlZm9yZSBpdCBleGlzdHMsIHNvIHRoZSBkYXRhIGhhcyB0byBhcnJpdmUgdGhyb3VnaCB0aGUgY29uZmlnO1xuICAgICAgICAvLyBldmVyeSBsYXRlciBvbmUgaGFzIHRvIGdvIHRocm91Z2ggdGhlIGluc3RhbmNlIG9yIG5vdGhpbmcgY2hhbmdlcy5cbiAgICAgICAgdGhpcy50cmVlQ29uZmlnID0geyAuLi50aGlzLnRyZWVDb25maWcsIGRhdGE6IG5vZGVzIH07XG4gICAgICAgIHRoaXMuX3RyZWUoKT8uc2V0RGF0YShub2Rlcyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIEZsYXQgQVBJIHJvd3Mg4oaSIHRoZSBuZXN0ZWQgc2hhcGUgZnMtdHJlZSByZW5kZXJzLiBGb2xkZXJzIGNvbWUgYmVmb3JlXG4gIC8vIHJlcG9ydHMgYXQgZXZlcnkgbGV2ZWwsIGVhY2ggYWxyZWFkeSBuYW1lLW9yZGVyZWQgYnkgdGhlIGJhY2tlbmQuXG4gIHByaXZhdGUgX2J1aWxkTm9kZXModHJlZTogUmVwb3J0VHJlZSk6IFJlcG9ydE5vZGVbXSB7XG4gICAgY29uc3QgZm9sZGVycyA9IHRyZWU/LmZvbGRlcnMgPz8gW107XG4gICAgY29uc3QgcmVwb3J0cyA9IHRyZWU/LnJlcG9ydHMgPz8gW107XG5cbiAgICBjb25zdCBidWlsZCA9IChwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCk6IFJlcG9ydE5vZGVbXSA9PiB7XG4gICAgICBjb25zdCBmb2xkZXJOb2RlczogUmVwb3J0Tm9kZVtdID0gZm9sZGVyc1xuICAgICAgICAuZmlsdGVyKChmb2xkZXI6IFJlcG9ydEZvbGRlcikgPT4gKGZvbGRlci5wYXJlbnRSZXBvcnRGb2xkZXJJZCA/PyBudWxsKSA9PT0gcGFyZW50SWQpXG4gICAgICAgIC5tYXAoKGZvbGRlcjogUmVwb3J0Rm9sZGVyKSA9PiAoe1xuICAgICAgICAgIGtleTogYGY6JHtmb2xkZXIuaWR9YCxcbiAgICAgICAgICBpZDogZm9sZGVyLmlkLFxuICAgICAgICAgIG5hbWU6IGZvbGRlci5uYW1lLFxuICAgICAgICAgIHR5cGU6IFJlcG9ydE5vZGVUeXBlLkZvbGRlcixcbiAgICAgICAgICBjaGlsZHJlbjogYnVpbGQoZm9sZGVyLmlkKSxcbiAgICAgICAgfSkpO1xuXG4gICAgICBjb25zdCByZXBvcnROb2RlczogUmVwb3J0Tm9kZVtdID0gcmVwb3J0c1xuICAgICAgICAuZmlsdGVyKChyZXBvcnQ6IFJlcG9ydExpc3RJdGVtKSA9PiAocmVwb3J0LnJlcG9ydEZvbGRlcklkID8/IG51bGwpID09PSBwYXJlbnRJZClcbiAgICAgICAgLm1hcCgocmVwb3J0OiBSZXBvcnRMaXN0SXRlbSkgPT4gKHtcbiAgICAgICAgICBrZXk6IGByOiR7cmVwb3J0LmlkfWAsXG4gICAgICAgICAgaWQ6IHJlcG9ydC5pZCxcbiAgICAgICAgICBuYW1lOiByZXBvcnQubmFtZSxcbiAgICAgICAgICB0eXBlOiBSZXBvcnROb2RlVHlwZS5SZXBvcnQsXG4gICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgIHJlcG9ydCxcbiAgICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gWy4uLmZvbGRlck5vZGVzLCAuLi5yZXBvcnROb2Rlc107XG4gICAgfTtcblxuICAgIHJldHVybiBidWlsZChudWxsKTtcbiAgfVxuXG4gIC8vIEEgZHJvcCBtb3ZlZCBhIG5vZGUgdW5kZXIgYSBuZXcgcGFyZW50LCBvciBvdXQgdG8gdGhlIHJvb3QuIFRoZSB0cmVlIGhhc1xuICAvLyBhbHJlYWR5IG1vdmVkIGl0IG9uIHNjcmVlbiwgc28gYm90aCBvdXRjb21lcyByZWxvYWQ6IGEgc3VjY2VzcyB0byBwaWNrIHVwXG4gIC8vIHRoZSBzZXJ2ZXIncyBvcmRlcmluZywgYSBmYWlsdXJlIHRvIHB1dCB0aGUgcm93IGJhY2sgd2hlcmUgaXQgcmVhbGx5IGlzLlxuICBwcml2YXRlIF9tb3ZlKGV2ZW50OiBJVHJlZUNoYW5nZVJlb3JkZXIpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlOiBSZXBvcnROb2RlID0gZXZlbnQubm9kZT8uZGF0YTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRSZXBvcnRGb2xkZXJJZDogbnVtYmVyID0gZXZlbnQudG9QYXJlbnQ/LmRhdGE/LmlkID8/IG51bGw7XG5cbiAgICBpZiAoZXZlbnQudG9QYXJlbnQgJiYgIWV2ZW50LnRvUGFyZW50LmlzRXhwYW5kZWQoKSkge1xuICAgICAgZXZlbnQudG9QYXJlbnQuZXhwYW5kKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2F2ZSQ6IE9ic2VydmFibGU8dW5rbm93bj4gPSBub2RlLnR5cGUgPT09IFJlcG9ydE5vZGVUeXBlLkZvbGRlclxuICAgICAgPyB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZUZvbGRlcihub2RlLmlkLCB7IHBhcmVudFJlcG9ydEZvbGRlcklkIH0pXG4gICAgICA6IHRoaXMuX3JlcG9ydERhdGEubW92ZVJlcG9ydChub2RlLmlkLCBwYXJlbnRSZXBvcnRGb2xkZXJJZCk7XG5cbiAgICBzYXZlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTYXZlZCBjaGFuZ2VzJyk7XG4gICAgICAgICAgdGhpcy5fbG9hZCgpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy5fbG9hZCgpLFxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVGb2xkZXIocGFyZW50UmVwb3J0Rm9sZGVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3Byb21wdC5pbnB1dCh7XG4gICAgICB0aXRsZTogJ05ldyBGb2xkZXInLFxuICAgICAgbGFiZWw6ICdOYW1lJyxcbiAgICAgIGNvbW1pdExhYmVsOiAnQ3JlYXRlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuX3JlcG9ydERhdGEuY3JlYXRlRm9sZGVyKG5hbWUsIHBhcmVudFJlcG9ydEZvbGRlcklkKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ0NyZWF0ZWQgZm9sZGVyJyk7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuYW1lKG5vZGU6IEZsYXRJdGVtTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGE6IFJlcG9ydE5vZGUgPSBub2RlPy5kYXRhO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRhdGEudHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyO1xuXG4gICAgdGhpcy5fcHJvbXB0LmlucHV0KHtcbiAgICAgIHRpdGxlOiBmb2xkZXIgPyAnUmVuYW1lIEZvbGRlcicgOiAnUmVuYW1lIFJlcG9ydCcsXG4gICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgZGVmYXVsdDogZGF0YS5uYW1lLFxuICAgICAgY29tbWl0TGFiZWw6ICdTYXZlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChuYW1lOiBzdHJpbmcpID0+IChmb2xkZXJcbiAgICAgICAgICA/IHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRm9sZGVyKGRhdGEuaWQsIHsgbmFtZSB9KVxuICAgICAgICAgIDogdGhpcy5fcmVwb3J0RGF0YS5yZW5hbWUoZGF0YS5pZCwgbmFtZSkpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU2F2ZWQgY2hhbmdlcycpO1xuICAgICAgICB0aGlzLl9sb2FkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIERlbGV0aW5nIGEgZm9sZGVyIGlzIHJlZnVzZWQgc2VydmVyLXNpZGUgd2hpbGUgaXQgc3RpbGwgaG9sZHMgYSBzdWItZm9sZGVyXG4gIC8vIG9yIGFuIGFjdGl2ZSByZXBvcnQsIGFuZCB0aGUgbWVzc2FnZSBzYXlzIHdoaWNoIOKAlCBzbyB0aGUgY29uZmlybSBoZXJlIHdhcm5zXG4gIC8vIHRoYXQgYSBmb2xkZXIgZGVsZXRlIGlzIHBlcm1hbmVudCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gcmVzdGF0ZSB0aGUgcnVsZS5cbiAgcHJpdmF0ZSBfZGVsZXRlKG5vZGU6IEZsYXRJdGVtTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGE6IFJlcG9ydE5vZGUgPSBub2RlPy5kYXRhO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRhdGEudHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyO1xuXG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xuICAgICAgdGl0bGU6ICdDb25maXJtJyxcbiAgICAgIHRlbXBsYXRlOiBmb2xkZXJcbiAgICAgICAgPyBgQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZSB0aGUgZm9sZGVyIFwiJHtkYXRhLm5hbWV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gXG4gICAgICAgIDogJ0FyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byBkZWxldGUgdGhpcyByZXBvcnQ/JyxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiAoZm9sZGVyXG4gICAgICAgICAgPyB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZUZvbGRlcihkYXRhLmlkKVxuICAgICAgICAgIDogdGhpcy5fcmVwb3J0RGF0YS5kZWxldGUoZGF0YS5pZCkpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2Vzcyhmb2xkZXIgPyAnRGVsZXRlZCBmb2xkZXInIDogJ0RlbGV0ZWQgcmVwb3J0Jyk7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdG9yZShub2RlOiBGbGF0SXRlbU5vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhOiBSZXBvcnROb2RlID0gbm9kZT8uZGF0YTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnREYXRhLnVuZGVsZXRlKGRhdGEuaWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnUmVzdG9yZWQgcmVwb3J0Jyk7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVHVybiBhICc6aWQnIHBhdHRlcm4gaW50byByb3V0ZXIgY29tbWFuZHMuIFJlbGF0aXZlIHVubGVzcyBpdCBzdGFydHNcbiAgLy8gd2l0aCAnLycsIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IHNlZ21lbnQgY2FycmllcyB0aGUgbGVhZGluZyBzbGFzaC5cbiAgcHJpdmF0ZSBfcGF0dGVybkNvbW1hbmRzKHBhdHRlcm46IHN0cmluZywgaWQ6IG51bWJlcik6IHVua25vd25bXSB7XG4gICAgY29uc3QgYWJzb2x1dGUgPSBwYXR0ZXJuLnN0YXJ0c1dpdGgoJy8nKTtcbiAgICBjb25zdCBzZWdtZW50czogdW5rbm93bltdID0gcGF0dGVybi5zcGxpdCgnLycpXG4gICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50Lmxlbmd0aCA+IDApXG4gICAgICAubWFwKChzZWdtZW50KSA9PiAoc2VnbWVudCA9PT0gJzppZCcgPyBpZCA6IHNlZ21lbnQpKTtcblxuICAgIGlmICghc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW2lkXTtcbiAgICB9XG5cbiAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgIHNlZ21lbnRzWzBdID0gYC8ke3NlZ21lbnRzWzBdfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG59XG4iLCI8ZnMtZmlsdGVyIFtjb25maWddPVwiZmlsdGVyQ29uZmlnXCI+PC9mcy1maWx0ZXI+XG5cbjxuZy1jb250YWluZXIgKmZzU2tlbGV0b249XCJub2RlcygpXCI+XG4gIDxmcy10cmVlIFtjb25maWddPVwidHJlZUNvbmZpZ1wiPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBmc1RyZWVOb2RlXG4gICAgICAgIGxldC1kYXRhPVwiZGF0YVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLXJvdy5nYXAtc20uYWxpZ24tY2VudGVyIG5vZGUtcm93XCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm5vZGUtaWNvblwiPlxuICAgICAgICAgIHt7IGRhdGEudHlwZSA9PT0gbm9kZVR5cGUuRm9sZGVyID8gJ2ZvbGRlcicgOiAnaW5zZXJ0X2NoYXJ0X291dGxpbmVkJyB9fVxuICAgICAgICA8L21hdC1pY29uPlxuXG4gICAgICAgIEBpZiAoZGF0YS50eXBlID09PSBub2RlVHlwZS5Gb2xkZXIpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZGUtbmFtZVwiPnt7IGRhdGEubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSBpZiAoaXNEZWxldGVkKGRhdGEucmVwb3J0KSkge1xuICAgICAgICAgIDwhLS0gQSBkZWxldGVkIHJlcG9ydCBjYW4ndCBiZSBvcGVuZWQgKHRoZSBiYWNrZW5kIG9ubHkgYXNzZW1ibGVzXG4gICAgICAgICAgICAgICBhY3RpdmUgb25lcyksIHNvIGluIFNob3cgRGVsZXRlZCBtb2RlIHRoZSBuYW1lIGlzIHBsYWluIHRleHQg4oCUXG4gICAgICAgICAgICAgICByZXN0b3JlIGl0IGZyb20gdGhlIHJvdyBtZW51IGZpcnN0LiAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZGUtbmFtZVwiPnt7IGRhdGEubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgICAgY2xhc3M9XCJub2RlLW5hbWVcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJvcGVuTGluayhkYXRhLnJlcG9ydClcIj5cbiAgICAgICAgICAgIHt7IGRhdGEubmFtZSB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy10cmVlPlxuXG4gIEBpZiAoIW5vZGVzKCkubGVuZ3RoKSB7XG4gICAgPHAgY2xhc3M9XCJzbWFsbCB0cmVlLWVtcHR5XCI+XG4gICAgICBObyByZXBvcnRzIHlldC4gQ3JlYXRlIG9uZSwgb3IgYWRkIGEgZm9sZGVyIHRvIGdyb3VwIHRoZW0uXG4gICAgPC9wPlxuICB9XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
530
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvdmlld3MvcmVwb3J0cy9mcy1haS1yZXBvcnRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnRzL2ZzLWFpLXJlcG9ydHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUVWLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFnQixjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBRUwsZUFBZSxFQUNmLFlBQVksRUFHWixjQUFjLEVBQ2QsWUFBWSxHQUNiLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFjLFNBQVMsRUFBRSxNQUFNLE1BQU0s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Q0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO3dHQS9pQlUsb0JBQW9COzRGQUFwQixvQkFBb0IsdWhCQXFCSSxlQUFlLGdFQ3pHcEQsbytDQTJDQSxrYkRpQ0ksWUFBWSxxWEFDWixjQUFjLGtLQUNkLGdCQUFnQixpS0FDaEIsWUFBWSwwTkFDWixhQUFhLG9MQUNiLFVBQVU7OzRGQUdELG9CQUFvQjtrQkFmaEMsU0FBUzsrQkFDRSxlQUFlLG1CQUdSLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixVQUFVO3FCQUNYIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgT25Jbml0LFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIsIFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuXG5pbXBvcnQgeyBGc0NoaXBNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9jaGlwJztcbmltcG9ydCB7IEZpbHRlckNvbmZpZywgRnNGaWx0ZXJNb2R1bGUsIEl0ZW1UeXBlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7XG4gIEZsYXRJdGVtTm9kZSxcbiAgRnNUcmVlQ29tcG9uZW50LFxuICBGc1RyZWVNb2R1bGUsXG4gIElUcmVlQ2hhbmdlUmVvcmRlcixcbiAgSVRyZWVDb25maWcsXG4gIFRyZWVBY3Rpb25UeXBlLFxuICBUcmVlRHJhZ01vZGUsXG59IGZyb20gJ0BmaXJlc3RpdGNoL3RyZWUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgR2xvYmFsU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuLi8uLi9kaWFsb2dzL2dsb2JhbC1zZXR0aW5ncy9nbG9iYWwtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFJlcG9ydEZvbGRlcixcbiAgUmVwb3J0TGlzdEl0ZW0sXG4gIFJlcG9ydE5vZGUsXG4gIFJlcG9ydE5vZGVUeXBlLFxuICBSZXBvcnRTdGF0ZSxcbiAgUmVwb3J0VHJlZSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcblxuXG4vLyBUaGUgcmVwb3J0cyBsaXN0aW5nIOKAlCBhbiBmcy10cmVlIG9mIGZvbGRlcnMgYW5kIHRoZSByZXBvcnRzIGZpbGVkIGludG8gdGhlbS5cbi8vIFJvd3MgbGluayBvdXQgdGhyb3VnaCBhIFVSTCBwYXR0ZXJuIChhICc6aWQnIHRva2VuIOKGkiB0aGUgcmVwb3J0IGlkOyBhIGxlYWRpbmdcbi8vICcvJyBtYWtlcyBpdCBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGl0J3MgcmVsYXRpdmUgdG8gdGhpcyBjb21wb25lbnQncyByb3V0ZSkuXG4vLyBDcmVhdGUgcHJvbXB0cyBmb3IgYSB0aXRsZSwgY3JlYXRlcyB0aGUgcmVwb3J0LCB0aGVuIHJvdXRlcyB0byBpdC4gVGhlIGdlYXJcbi8vIG9wZW5zIHRoZSBnbG9iYWwgUmVwb3J0IFNldHRpbmdzIGRpYWxvZyAoQUkga25vd2xlZGdlIGRvY3VtZW50ICtcbi8vIHNlbWFudGljLWRhdGFiYXNlIGJ1aWxkKSwgd2hpY2ggbGl2ZXMgaW4gdGhpcyBwYWNrYWdlLiBObyByb3V0aW5nIGlzXG4vLyBoYXJkLWNvZGVkIGhlcmUuXG4vL1xuLy8gRm9sZGVycyBuZXN0OyByZXBvcnRzIGFyZSBhbHdheXMgbGVhdmVzIOKAlCBjYW5Ecm9wIGVuZm9yY2VzIGl0IGhlcmUsIGFuZCB0aGVcbi8vIGJhY2tlbmQgZW5mb3JjZXMgaXQgc3RydWN0dXJhbGx5IGJ5IGtlZXBpbmcgdGhlIHRyZWUgaW4gaXRzIG93biB0YWJsZS4gQVxuLy8gcmVwb3J0IGluIG5vIGZvbGRlciBpcyBhIHJvb3Qgbm9kZSwgd2hpY2ggaXMgd2hlcmUgZXZlcnkgcmVwb3J0IHNhdCBiZWZvcmVcbi8vIGZvbGRlcnMgZXhpc3RlZCwgc28gbm90aGluZyBoYWQgdG8gYmUgbWlncmF0ZWQgb3IgYnVja2V0ZWQgYXMgXCJ1bmNhdGVnb3JpemVkXCIuXG4vL1xuLy8gRm9sZGVycyBhbmQgcmVwb3J0cyBhcmUgYm90aCBzb2Z0LWRlbGV0YWJsZSwgYW5kIGEgZm9sZGVyIGRlbGV0ZXMgd2hhdGV2ZXIgaXRcbi8vIGhvbGRzLiBPbmx5IHRoZSBmb2xkZXIncyBvd24gcm93IGlzIHdyaXR0ZW46IGV2ZXJ5dGhpbmcgdW5kZXIgaXQgZHJvcHMgb3V0IG9mXG4vLyB0aGUgbGlzdGluZyBiZWNhdXNlIGl0IHNpdHMgdW5kZXIgYSBkZWxldGVkIGZvbGRlciwgYW5kIGNvbWVzIGJhY2sgd2l0aCBpdC5cbi8vIFwiU2hvdyBEZWxldGVkXCIgc2hvd3MgdGhlIFdIT0xFIHRyZWUg4oCUIGxpdmUgYW5kIGRlbGV0ZWQgdG9nZXRoZXIsIGVhY2ggZGVsZXRlZFxuLy8gcm93IHdoZXJlIGl0IHdhcyBmaWxlZCDigJQgYW5kIG9uIGFueXRoaW5nIGRlbGV0ZWQgdGhlIGtlYmFiIG9mZmVycyBSZXN0b3JlXG4vLyBpbnN0ZWFkLiBSZXN0b3JpbmcgYWxzbyByZXN0b3JlcyBhbnkgZGVsZXRlZCBmb2xkZXIgYWJvdmUgdGhlIHJvdywgc28gaXQgbGFuZHNcbi8vIGJhY2sgd2hlcmUgaXQgd2FzIHJhdGhlciB0aGFuIGF0IHRoZSByb290LlxuLy9cbi8vIEV2ZXJ5IGZvbGRlciBzdGFydHMgY29sbGFwc2VkOyB0aGUgdHJlZSByZW1lbWJlcnMgd2hhdCB3YXMgb3BlbmVkIGFjcm9zcyBpdHNcbi8vIG93biByZWxvYWRzIChhIHJlbmFtZSwgYSBtb3ZlLCB0aGUgU2hvdyBEZWxldGVkIHRvZ2dsZSkgYW5kIGFjcm9zcyBhIHNlYXJjaC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWFpLXJlcG9ydHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZnMtYWktcmVwb3J0cy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZzLWFpLXJlcG9ydHMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGc0NoaXBNb2R1bGUsXG4gICAgRnNGaWx0ZXJNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgICBGc1RyZWVNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBSb3V0ZXJMaW5rLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGc0FpUmVwb3J0c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLy8gQVBJIGJhc2UgZm9yIHRoZSByZXBvcnRzIGVuZHBvaW50czsgb3ZlcnJpZGUgdG8gbW91bnQgZWxzZXdoZXJlLlxuICBwdWJsaWMgcmVhZG9ubHkgYmFzZVBhdGggPSBpbnB1dDxzdHJpbmc+KCdyZXBvcnRzJyk7XG5cbiAgLy8gV2hlcmUgYSByb3cgbGlua3MgdG87ICc6aWQnIGlzIHJlcGxhY2VkIHdpdGggdGhlIHJlcG9ydCBpZC4gRGVmYXVsdCB0YWtlc1xuICAvLyB5b3UgdG8gPGN1cnJlbnQgcm91dGU+LzppZC4gQWJzb2x1dGUgd2hlbiBpdCBzdGFydHMgd2l0aCAnLycuXG4gIHB1YmxpYyByZWFkb25seSBvcGVuUGF0dGVybiA9IGlucHV0PHN0cmluZz4oJzppZCcpO1xuXG4gIC8vIFdoZXJlIGEgZnJlc2hseS1jcmVhdGVkIHJlcG9ydCByb3V0ZXMgdG87IHNhbWUgJzppZCcgcGF0dGVybiBydWxlcy5cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZVBhdHRlcm4gPSBpbnB1dDxzdHJpbmc+KCc6aWQnKTtcblxuICAvLyBOdWxsIHVudGlsIHRoZSBmaXJzdCBsb2FkIHJlc29sdmVzIOKAlCB0aGF0IGlzIHdoYXQgZ2F0ZXMgKmZzU2tlbGV0b24uXG4gIHB1YmxpYyByZWFkb25seSBub2RlcyA9IHNpZ25hbDxSZXBvcnROb2RlW10+KG51bGwpO1xuXG4gIHB1YmxpYyB0cmVlQ29uZmlnOiBJVHJlZUNvbmZpZzxSZXBvcnROb2RlW10+O1xuICBwdWJsaWMgZmlsdGVyQ29uZmlnOiBGaWx0ZXJDb25maWc7XG5cbiAgLy8gVGVtcGxhdGUtc2lkZSBoYW5kbGUgb24gdGhlIGVudW0sIHNvIGEgcm93IGNhbiB0ZWxsIGEgZm9sZGVyIGZyb20gYSByZXBvcnQuXG4gIHB1YmxpYyByZWFkb25seSBub2RlVHlwZSA9IFJlcG9ydE5vZGVUeXBlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RyZWUgPSB2aWV3Q2hpbGQoRnNUcmVlQ29tcG9uZW50KTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSBfcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIF9wcm9tcHQgPSBpbmplY3QoRnNQcm9tcHQpO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8vIFRoZSBmaWx0ZXIgYmFyJ3MgY3VycmVudCBxdWVyeSDigJQgY2FycmllcyBgc3RhdGVgIHdoZW4gU2hvdyBEZWxldGVkIGlzIG9uLlxuICBwcml2YXRlIF9xdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvLyBUaGUgZm9sZGVycyB0aGF0IHdlcmUgb3BlbiB3aGVuIGEgc2VhcmNoIHN0YXJ0ZWQ7IG51bGwgd2hpbGUgbm8gc2VhcmNoIGlzXG4gIC8vIHJ1bm5pbmcuIFRoZSBzZWFyY2ggb3BlbnMgZXZlcnkgbWF0Y2gncyBwYXRoIG92ZXIgdGhlIHRvcCBvZiB0aGVtLCBhbmRcbiAgLy8gY2xlYXJpbmcgaXQgcHV0cyB0aGVzZSBiYWNrLlxuICBwcml2YXRlIF9leHBhbmRlZEJlZm9yZVNlYXJjaDogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVwb3J0RGF0YS5iYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGgoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZXQgYmVmb3JlIHRoZSBmaXJzdCBmZXRjaCByYXRoZXIgdGhhbiB3YWl0aW5nIG9uIHRoZSBlZmZlY3QgYWJvdmUsIHdoaWNoXG4gICAgLy8gZG9lcyBub3QgcnVuIHVudGlsIGFmdGVyIHRoZSBpbml0aWFsIGNoYW5nZSBkZXRlY3Rpb24gcGFzcy5cbiAgICB0aGlzLl9yZXBvcnREYXRhLmJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aCgpO1xuXG4gICAgdGhpcy5faW5pdEZpbHRlckNvbmZpZygpO1xuICAgIHRoaXMuX2luaXRUcmVlQ29uZmlnKCk7XG4gICAgdGhpcy5fbG9hZCgpO1xuICB9XG5cbiAgLy8gcm91dGVyTGluayBjb21tYW5kcyBmb3IgYSByZXBvcnQgcm93IChidWlsdCBmcm9tIG9wZW5QYXR0ZXJuKS5cbiAgcHVibGljIG9wZW5MaW5rKHJlcG9ydDogUmVwb3J0TGlzdEl0ZW0pOiB1bmtub3duW10ge1xuICAgIHJldHVybiB0aGlzLl9wYXR0ZXJuQ29tbWFuZHModGhpcy5vcGVuUGF0dGVybigpLCByZXBvcnQuaWQpO1xuICB9XG5cbiAgLy8gUHJvbXB0IGZvciBhIHRpdGxlLCBjcmVhdGUgdGhlIHJlcG9ydCDigJQgZmlsZWQgdW5kZXIgcmVwb3J0Rm9sZGVySWQgd2hlbiBhXG4gIC8vIGZvbGRlcidzIGtlYmFiIGFza2VkLCBhdCB0aGUgcm9vdCBvdGhlcndpc2Ug4oCUIHRoZW4gcm91dGUgdG8gaXQgKGNyZWF0ZVBhdHRlcm4pLlxuICBwdWJsaWMgY3JlYXRlUmVwb3J0KHJlcG9ydEZvbGRlcklkOiBudW1iZXIgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmlucHV0KHtcbiAgICAgIHRpdGxlOiAnQ3JlYXRlIFJlcG9ydCcsXG4gICAgICBsYWJlbDogJ1RpdGxlJyxcbiAgICAgIGNvbW1pdExhYmVsOiAnQ3JlYXRlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuX3JlcG9ydERhdGEuY3JlYXRlKG5hbWUsIHJlcG9ydEZvbGRlcklkKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlcG9ydDogUmVwb3J0TGlzdEl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuY3JlYXRlUGF0dGVybigpO1xuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgdGhpcy5fcGF0dGVybkNvbW1hbmRzKHBhdHRlcm4sIHJlcG9ydC5pZCksXG4gICAgICAgICAgcGF0dGVybi5zdGFydHNXaXRoKCcvJykgPyB7fSA6IHsgcmVsYXRpdmVUbzogdGhpcy5fcm91dGUgfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGdsb2JhbCBSZXBvcnQgU2V0dGluZ3MgZGlhbG9nOiB0aGUgQUkga25vd2xlZGdlIGRvY3VtZW50IGFuZCB0aGVcbiAgLy8gc2VtYW50aWMtZGF0YWJhc2UgYnVpbGQuIEEgcnVubmluZyBidWlsZCBzdHJlYW1zIGludG8gdGhlIEZzUHJvY2VzcyBkb2NrLFxuICAvLyB3aGljaCBzdXJ2aXZlcyB0aGUgZGlhbG9nIGNsb3NpbmcuXG4gIHB1YmxpYyBvcGVuU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oR2xvYmFsU2V0dGluZ3NDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnOTAwcHgnLFxuICAgICAgbWF4V2lkdGg6ICc5NXZ3JyxcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRGaWx0ZXJDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJDb25maWcgPSB7XG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2tleXdvcmQnLFxuICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLktleXdvcmQsXG4gICAgICAgICAgbGFiZWw6ICdTZWFyY2gnLFxuICAgICAgICB9LFxuICAgICAgICAvLyBBIGNoZWNrYm94IHJhdGhlciB0aGFuIHRoZSB1c3VhbCBTdGF0dXMgc2VsZWN0IHdpdGggYSBcIlNob3cgRGVsZXRlZFwiXG4gICAgICAgIC8vIGlzb2xhdGUuIElzb2xhdGluZyB0aGUgZGVsZXRlZCByb3dzIHdvdWxkIHN0cmFuZCB0aGVtOiBhIGRlbGV0ZWRcbiAgICAgICAgLy8gcmVwb3J0IGluIGEgbGl2ZSBmb2xkZXIgYXJyaXZlcyB3aXRob3V0IHRoZSBmb2xkZXIgaXQgc2l0cyBpbiwgYW5kIGFcbiAgICAgICAgLy8gdHJlZSBjYW5ub3QgcGxhY2UgYSBub2RlIHdob3NlIHBhcmVudCBpdCBuZXZlciByZWNlaXZlZC4gU28gdGhlXG4gICAgICAgIC8vIHRvZ2dsZSBhc2tzIGZvciBldmVyeXRoaW5nLCBhbmQgdGhlIHJvd3MgbWFyayB3aGF0IGlzIGRlbGV0ZWQuXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc3RhdGUnLFxuICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLkNoZWNrYm94LFxuICAgICAgICAgIGxhYmVsOiAnU2hvdyBEZWxldGVkJyxcbiAgICAgICAgICBjaGVja2VkOiBbUmVwb3J0U3RhdGUuQWN0aXZlLCBSZXBvcnRTdGF0ZS5EZWxldGVkXS5qb2luKCcsJyksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWNvbjogJ3VuZm9sZF9tb3JlJyxcbiAgICAgICAgICB0b29sdGlwOiAnRXhwYW5kIGFsbCcsXG4gICAgICAgICAgcHJpbWFyeTogZmFsc2UsXG4gICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuX3RyZWUoKT8uZXhwYW5kQWxsKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpY29uOiAndW5mb2xkX2xlc3MnLFxuICAgICAgICAgIHRvb2x0aXA6ICdDb2xsYXBzZSBhbGwnLFxuICAgICAgICAgIHByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLl90cmVlKCk/LmNvbGxhcHNlQWxsKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpY29uOiAnc2V0dGluZ3MnLFxuICAgICAgICAgIHRvb2x0aXA6ICdSZXBvcnQgc2V0dGluZ3MnLFxuICAgICAgICAgIHByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLm9wZW5TZXR0aW5ncygpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdOZXcgRm9sZGVyJyxcbiAgICAgICAgICBwcmltYXJ5OiBmYWxzZSxcbiAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5fY3JlYXRlRm9sZGVyKG51bGwpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdDcmVhdGUnLFxuICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuY3JlYXRlUmVwb3J0KCksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLy8gVGhlIHR3byBpdGVtcyBhcmUgYW5zd2VyZWQgaW4gZGlmZmVyZW50IHBsYWNlcywgYW5kIGVhY2ggb25seSB3aGVuIGl0XG4gICAgICAvLyBjaGFuZ2VkLiBUaGUga2V5d29yZCBkcml2ZXMgdGhlIHRyZWUncyBvd24gc2VhcmNoLCB3aGljaCBpcyB0aGUgd2hvbGVcbiAgICAgIC8vIHBvaW50IG9mIHNlYXJjaGluZyBhIHRyZWUg4oCUIGl0IHJldmVhbHMgYSBtYXRjaCBuZXN0ZWQgaW5zaWRlIGNvbGxhcHNlZFxuICAgICAgLy8gZm9sZGVycyByYXRoZXIgdGhhbiBvbmx5IGZpbHRlcmluZyB3aGF0IGlzIGFscmVhZHkgb24gc2NyZWVuLiBgc3RhdGVgIGlzXG4gICAgICAvLyB0aGUgU2hvdyBEZWxldGVkIHRvZ2dsZSwgYW5kIG9ubHkgdGhlIHNlcnZlciBjYW4gYW5zd2VyIHRoYXQuIFJ1bm5pbmcgdGhlXG4gICAgICAvLyBzZWFyY2ggb24gYSB0b2dnbGUgd291bGQgY2xlYXIgaXQsIGFuZCBjbGVhcmluZyBjb2xsYXBzZXMgdGhlIHRyZWUuXG4gICAgICBjaGFuZ2U6IChxdWVyeSkgPT4ge1xuICAgICAgICBjb25zdCBrZXl3b3JkQ2hhbmdlZCA9IFN0cmluZyhxdWVyeT8ua2V5d29yZCA/PyAnJykgIT09IFN0cmluZyh0aGlzLl9xdWVyeS5rZXl3b3JkID8/ICcnKTtcbiAgICAgICAgY29uc3Qgc3RhdGVDaGFuZ2VkID0gU3RyaW5nKHF1ZXJ5Py5zdGF0ZSA/PyAnJykgIT09IFN0cmluZyh0aGlzLl9xdWVyeS5zdGF0ZSA/PyAnJyk7XG4gICAgICAgIHRoaXMuX3F1ZXJ5ID0geyAuLi5xdWVyeSB9O1xuXG4gICAgICAgIGlmIChrZXl3b3JkQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMuX3NlYXJjaChxdWVyeT8ua2V5d29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9pbml0VHJlZUNvbmZpZygpOiB2b2lkIHtcbiAgICAvLyBObyBleHBhbmRMZXZlbDogZXZlcnkgZm9sZGVyIHN0YXJ0cyBjb2xsYXBzZWQuXG4gICAgdGhpcy50cmVlQ29uZmlnID0ge1xuICAgICAgZGF0YTogW10sXG4gICAgICBjaGlsZHJlbk5hbWU6ICdjaGlsZHJlbicsXG4gICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICAvLyBUaGUgd2hvbGUgcm93IGlzIHRoZSBncmlwIGFuZCB0aGUgaGFuZGxlIHN0YXlzIGhpZGRlbjsgYSBwcmVzcyBvbmx5XG4gICAgICAvLyBiZWNvbWVzIGEgZHJhZyBvbmNlIHRoZSBwb2ludGVyIG1vdmVzLCBzbyB0aGUga2ViYWIsIHRoZSBjaGV2cm9uIGFuZCB0aGVcbiAgICAgIC8vIHJlcG9ydCBsaW5rIGFsbCBzdGF5IGNsaWNrYWJsZS5cbiAgICAgIGRyYWdNb2RlOiBUcmVlRHJhZ01vZGUuTm9kZSxcbiAgICAgIC8vIEFueXRoaW5nIGRlbGV0ZWQgaXMgcmVzdG9yZWQgYmVmb3JlIGl0IGlzIG1vdmVkIOKAlCB0aGUgYmFja2VuZCByZWZ1c2VzXG4gICAgICAvLyB0byBlZGl0IGEgZGVsZXRlZCByb3csIGFuZCBhIGRyYWcgd291bGQgb25seSBzbmFwIGJhY2suXG4gICAgICBjYW5EcmFnOiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiAhdGhpcy5faXNEZWxldGVkTm9kZShub2RlKSxcbiAgICAgIC8vIGNhbkRyb3AgaXMgYXNrZWQgYWJvdXQgdGhlIG5vZGUgYmVpbmcgRFJBR0dFRCwgc28gb25seSBgdG9QYXJlbnRgXG4gICAgICAvLyBkZXNjcmliZXMgdGhlIGRlc3RpbmF0aW9uIOKAlCByZWFkaW5nIG5vZGUubGV2ZWwvbm9kZS5wYXJlbnQgaGVyZSB3b3VsZFxuICAgICAgLy8gZGVzY3JpYmUgd2hlcmUgaXQgY2FtZSBmcm9tLiBBIHJlcG9ydCBjYW4gbmV2ZXIgYmUgYSBwYXJlbnQgYmVjYXVzZSBpdHNcbiAgICAgIC8vIHR5cGUgc2F5cyBzbywgYW5kIHRoYXQgc2luZ2xlIHRlc3QgaXMgdGhlIHdob2xlIFwiZm9sZGVycyBuZXN0LCByZXBvcnRzXG4gICAgICAvLyBhcmUgbGVhdmVzXCIgcnVsZSBvbiB0aGlzIHNpZGUuIEEgZGVsZXRlZCBmb2xkZXIgaXMgbm8gZGVzdGluYXRpb25cbiAgICAgIC8vIGVpdGhlcjogd2hhdGV2ZXIgbGFuZGVkIGluIGl0IHdvdWxkIHZhbmlzaCBmcm9tIHRoZSBsaXZlIGxpc3RpbmcuXG4gICAgICBjYW5Ecm9wOiAobm9kZTogRmxhdEl0ZW1Ob2RlLCBmcm9tUGFyZW50OiBGbGF0SXRlbU5vZGUsIHRvUGFyZW50OiBGbGF0SXRlbU5vZGUpID0+IHtcbiAgICAgICAgcmV0dXJuICF0b1BhcmVudCB8fCAodGhpcy5faXNGb2xkZXJOb2RlKHRvUGFyZW50KSAmJiAhdGhpcy5faXNEZWxldGVkTm9kZSh0b1BhcmVudCkpO1xuICAgICAgfSxcbiAgICAgIGNoYW5nZVJlb3JkZXI6IChldmVudDogSVRyZWVDaGFuZ2VSZW9yZGVyKSA9PiB0aGlzLl9tb3ZlKGV2ZW50KSxcbiAgICAgIG5vZGVDbGFzczogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gbm9kZS5kYXRhPy50eXBlLFxuICAgICAgLy8gTWF0Y2ggb24gdGhlIG5hbWUgb25seS4gVGhlIGxpYnJhcnkncyBkZWZhdWx0IG1hdGNoZXIgc3RyaW5naWZpZXMgdGhlXG4gICAgICAvLyB3aG9sZSBub2RlLCBzbyBpdCB3b3VsZCBoaXQgaWRzLCB0aGUgbGl0ZXJhbCB0eXBlIHdvcmQsIGFuZCBldmVyeXRoaW5nXG4gICAgICAvLyBlbHNlIHJpZGluZyBvbiB0aGUgcm93LlxuICAgICAgZmlsdGVySXRlbTogKG5vZGUsIHF1ZXJ5KSA9PiB7XG4gICAgICAgIHJldHVybiBTdHJpbmcobm9kZS5kYXRhPy5uYW1lID8/ICcnKVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLmluY2x1ZGVzKFN0cmluZyhxdWVyeSA/PyAnJykudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9LFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogVHJlZUFjdGlvblR5cGUuTWVudSxcbiAgICAgICAgICBpY29uOiAnbW9yZV92ZXJ0JyxcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ1JlbmFtZScsXG4gICAgICAgICAgICAgIHNob3c6IChub2RlOiBGbGF0SXRlbU5vZGUpID0+ICF0aGlzLl9pc0RlbGV0ZWROb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5fcmVuYW1lKG5vZGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdOZXcgcmVwb3J0JyxcbiAgICAgICAgICAgICAgc2hvdzogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5faXNGb2xkZXJOb2RlKG5vZGUpICYmICF0aGlzLl9pc0RlbGV0ZWROb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5jcmVhdGVSZXBvcnQobm9kZS5kYXRhPy5pZCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ05ldyBmb2xkZXInLFxuICAgICAgICAgICAgICBzaG93OiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiB0aGlzLl9pc0ZvbGRlck5vZGUobm9kZSkgJiYgIXRoaXMuX2lzRGVsZXRlZE5vZGUobm9kZSksXG4gICAgICAgICAgICAgIGNsaWNrOiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiB0aGlzLl9jcmVhdGVGb2xkZXIobm9kZS5kYXRhPy5pZCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ0RlbGV0ZScsXG4gICAgICAgICAgICAgIHNob3c6IChub2RlOiBGbGF0SXRlbU5vZGUpID0+ICF0aGlzLl9pc0RlbGV0ZWROb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5fZGVsZXRlKG5vZGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIE9uIGV2ZXJ5IGRlbGV0ZWQgcm93LCBpbmNsdWRpbmcgYSBsaXZlIG9uZSB0aGF0IGlzIG9ubHkgaGlkZGVuIGJ5XG4gICAgICAgICAgICAvLyBhIGRlbGV0ZWQgZm9sZGVyIGFib3ZlIGl0IOKAlCByZXN0b3JpbmcgdGhhdCBicmluZ3MgdGhlIGZvbGRlciBiYWNrLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ1Jlc3RvcmUnLFxuICAgICAgICAgICAgICBzaG93OiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiB0aGlzLl9pc0RlbGV0ZWROb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5fcmVzdG9yZShub2RlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzRm9sZGVyTm9kZShub2RlOiBGbGF0SXRlbU5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbm9kZT8uZGF0YT8udHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNEZWxldGVkTm9kZShub2RlOiBGbGF0SXRlbU5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFub2RlPy5kYXRhPy5kZWxldGVkO1xuICB9XG5cbiAgLy8gRHJpdmUgdGhlIHRyZWUncyBidWlsdC1pbiBzZWFyY2g6IGl0IGNvbGxhcHNlcyBldmVyeXRoaW5nLCBoaWRlcyBldmVyeSBub2RlLFxuICAvLyB0aGVuIHVuaGlkZXMgZWFjaCBtYXRjaCBhbmQgd2Fsa3MgaXRzIGFuY2VzdG9ycyBvcGVuLCBzbyBhIHJlcG9ydCBzZXZlcmFsXG4gIC8vIGZvbGRlcnMgZGVlcCBzdXJmYWNlcyB3aXRoIGl0cyBwYXRoIGV4cGFuZGVkLiBDbGVhcmluZyBjb2xsYXBzZXMgZXZlcnl0aGluZ1xuICAvLyBhZ2Fpbiwgc28gdGhlIGZvbGRlcnMgdGhhdCB3ZXJlIG9wZW4gYmVmb3JlIHRoZSBzZWFyY2ggYXJlIHB1dCBiYWNrLlxuICBwcml2YXRlIF9zZWFyY2goa2V5d29yZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdHJlZSA9IHRoaXMuX3RyZWUoKTtcbiAgICBpZiAoIXRyZWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5d29yZCkge1xuICAgICAgdGhpcy5fZXhwYW5kZWRCZWZvcmVTZWFyY2ggPz89IHRoaXMuX2V4cGFuZGVkS2V5cygpO1xuICAgICAgdHJlZS5zZWFyY2goa2V5d29yZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJlZS5jbGVhclNlYXJjaCgpO1xuICAgIHRoaXMuX2V4cGFuZEtleXModGhpcy5fZXhwYW5kZWRCZWZvcmVTZWFyY2ggPz8gW10pO1xuICAgIHRoaXMuX2V4cGFuZGVkQmVmb3JlU2VhcmNoID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2xvYWQoKTogdm9pZCB7XG4gICAgLy8gT25seSB0aGUgU2hvdyBEZWxldGVkIHRvZ2dsZSBpcyB0aGUgc2VydmVyJ3MgdG8gYW5zd2VyIOKAlCB0aGUga2V5d29yZCBpc1xuICAgIC8vIHRoZSB0cmVlJ3Mgb3duIHNlYXJjaCDigJQgYW5kIGFuIHVuY2hlY2tlZCB0b2dnbGUgc2VuZHMgbm90aGluZywgbGVhdmluZyB0aGVcbiAgICAvLyBiYWNrZW5kJ3MgYWN0aXZlLW9ubHkgZGVmYXVsdCBpbiBjaGFyZ2UuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLl9xdWVyeS5zdGF0ZSA/IHsgc3RhdGU6IHRoaXMuX3F1ZXJ5LnN0YXRlIH0gOiB7fTtcblxuICAgIHRoaXMuX3JlcG9ydERhdGEudHJlZShxdWVyeSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXBvcnRUcmVlOiBSZXBvcnRUcmVlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fYnVpbGROb2RlcyhyZXBvcnRUcmVlKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5zZXQobm9kZXMpO1xuXG4gICAgICAgIC8vIFRoZSB0cmVlIHJlYWRzIGBjb25maWdgIG9uY2UsIGluIGl0cyBvd24gbmdPbkluaXQuIFRoZSBmaXJzdCBsb2FkXG4gICAgICAgIC8vIGxhbmRzIGJlZm9yZSBpdCBleGlzdHMsIHNvIHRoZSBkYXRhIGhhcyB0byBhcnJpdmUgdGhyb3VnaCB0aGUgY29uZmlnO1xuICAgICAgICAvLyBldmVyeSBsYXRlciBvbmUgaGFzIHRvIGdvIHRocm91Z2ggdGhlIGluc3RhbmNlIG9yIG5vdGhpbmcgY2hhbmdlcy5cbiAgICAgICAgdGhpcy50cmVlQ29uZmlnID0geyAuLi50aGlzLnRyZWVDb25maWcsIGRhdGE6IG5vZGVzIH07XG5cbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMuX3RyZWUoKTtcbiAgICAgICAgaWYgKCF0cmVlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0RGF0YSgpIHJlYnVpbGRzIGV2ZXJ5IG5vZGUgY29sbGFwc2VkLCBzbyBhIHJlbmFtZSBvciBhIG1vdmUgd291bGRcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHNsYW0gc2h1dCBldmVyeSBmb2xkZXIgc29tZWJvZHkgaGFkIG9wZW5lZC4gS2V5cyBhcmUgc3RhYmxlXG4gICAgICAgIC8vIGFjcm9zcyBsb2FkcyAoJ2Y6MTInKSwgc28gd2hhdCB3YXMgb3BlbiBpcyByZW9wZW5lZCBieSBrZXkg4oCUIGFuZCBhXG4gICAgICAgIC8vIGZvbGRlciB0aGF0IG5vIGxvbmdlciBjb21lcyBiYWNrIHNpbXBseSBpcyBub3QuXG4gICAgICAgIGNvbnN0IGV4cGFuZGVkS2V5cyA9IHRoaXMuX2V4cGFuZGVkS2V5cygpO1xuICAgICAgICB0cmVlLnNldERhdGEobm9kZXMpO1xuICAgICAgICB0aGlzLl9leHBhbmRLZXlzKGV4cGFuZGVkS2V5cyk7XG5cbiAgICAgICAgY29uc3Qga2V5d29yZCA9IFN0cmluZyh0aGlzLl9xdWVyeS5rZXl3b3JkID8/ICcnKTtcbiAgICAgICAgaWYgKGtleXdvcmQpIHtcbiAgICAgICAgICB0cmVlLnNlYXJjaChrZXl3b3JkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBUaGUga2V5cyBvZiBldmVyeSBvcGVuIGZvbGRlciwgd2Fsa2VkIHRocm91Z2ggdGhlIHRyZWUncyBwdWJsaWMgbm9kZSBBUEkuXG4gIHByaXZhdGUgX2V4cGFuZGVkS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdHJlZSA9IHRoaXMuX3RyZWUoKTtcbiAgICBpZiAoIXRyZWUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB3YWxrID0gKHBhcmVudDogRmxhdEl0ZW1Ob2RlKTogc3RyaW5nW10gPT4gdHJlZS5nZXROb2RlcyhwYXJlbnQpXG4gICAgICAuZmlsdGVyKChub2RlOiBGbGF0SXRlbU5vZGUpID0+IG5vZGUuaXNFeHBhbmRlZCgpKVxuICAgICAgLmZsYXRNYXAoKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gW25vZGUuZGF0YT8ua2V5LCAuLi53YWxrKG5vZGUpXSk7XG5cbiAgICByZXR1cm4gd2FsayhudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgX2V4cGFuZEtleXMoa2V5czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCB0cmVlID0gdGhpcy5fdHJlZSgpO1xuICAgIGlmICghdHJlZSB8fCAha2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVuID0gbmV3IFNldChrZXlzKTtcbiAgICBjb25zdCB3YWxrID0gKHBhcmVudDogRmxhdEl0ZW1Ob2RlKTogdm9pZCA9PiB7XG4gICAgICB0cmVlLmdldE5vZGVzKHBhcmVudClcbiAgICAgICAgLmZpbHRlcigobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiBvcGVuLmhhcyhub2RlLmRhdGE/LmtleSkpXG4gICAgICAgIC5mb3JFYWNoKChub2RlOiBGbGF0SXRlbU5vZGUpID0+IHtcbiAgICAgICAgICBub2RlLmV4cGFuZCgpO1xuICAgICAgICAgIHdhbGsobm9kZSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB3YWxrKG51bGwpO1xuICB9XG5cbiAgLy8gRmxhdCBBUEkgcm93cyDihpIgdGhlIG5lc3RlZCBzaGFwZSBmcy10cmVlIHJlbmRlcnMuIEZvbGRlcnMgY29tZSBiZWZvcmVcbiAgLy8gcmVwb3J0cyBhdCBldmVyeSBsZXZlbCwgZWFjaCBhbHJlYWR5IG5hbWUtb3JkZXJlZCBieSB0aGUgYmFja2VuZC5cbiAgLy9cbiAgLy8gYGRlbGV0ZWRgIGlzIGluaGVyaXRlZCBkb3dud2FyZDogYSBkZWxldGVkIGZvbGRlciBoaWRlcyBldmVyeXRoaW5nIGJlbG93IGl0XG4gIC8vIHdpdGhvdXQgdGhlIHJvd3MgYmVsb3cgYmVpbmcgZGVsZXRlZCB0aGVtc2VsdmVzLCBhbmQgdGhhdCBpcyBvbmx5IHZpc2libGVcbiAgLy8gZnJvbSBoZXJlLCB3aGVyZSB0aGUgcGFyZW50IGlzIGluIGhhbmQuIFRoZSBiYWNrZW5kIGFwcGxpZXMgdGhlIHNhbWUgcnVsZVxuICAvLyB3aGVuIGl0IGZpbHRlcnMgKFJlcG9ydEZvbGRlck1vZGVsOjpnZXREZWxldGVkRm9sZGVySWRzKCkpLlxuICBwcml2YXRlIF9idWlsZE5vZGVzKHJlcG9ydFRyZWU6IFJlcG9ydFRyZWUpOiBSZXBvcnROb2RlW10ge1xuICAgIGNvbnN0IGZvbGRlcnMgPSByZXBvcnRUcmVlPy5mb2xkZXJzID8/IFtdO1xuICAgIGNvbnN0IHJlcG9ydHMgPSByZXBvcnRUcmVlPy5yZXBvcnRzID8/IFtdO1xuXG4gICAgY29uc3QgYnVpbGQgPSAocGFyZW50SWQ6IG51bWJlciB8IG51bGwsIHBhcmVudERlbGV0ZWQ6IGJvb2xlYW4pOiBSZXBvcnROb2RlW10gPT4ge1xuICAgICAgY29uc3QgZm9sZGVyTm9kZXM6IFJlcG9ydE5vZGVbXSA9IGZvbGRlcnNcbiAgICAgICAgLmZpbHRlcigoZm9sZGVyOiBSZXBvcnRGb2xkZXIpID0+IChmb2xkZXIucGFyZW50UmVwb3J0Rm9sZGVySWQgPz8gbnVsbCkgPT09IHBhcmVudElkKVxuICAgICAgICAubWFwKChmb2xkZXI6IFJlcG9ydEZvbGRlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlRGVsZXRlZCA9IGZvbGRlci5zdGF0ZSA9PT0gUmVwb3J0U3RhdGUuRGVsZXRlZDtcbiAgICAgICAgICBjb25zdCBkZWxldGVkID0gcGFyZW50RGVsZXRlZCB8fCBzdGF0ZURlbGV0ZWQ7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiBgZjoke2ZvbGRlci5pZH1gLFxuICAgICAgICAgICAgaWQ6IGZvbGRlci5pZCxcbiAgICAgICAgICAgIG5hbWU6IGZvbGRlci5uYW1lLFxuICAgICAgICAgICAgdHlwZTogUmVwb3J0Tm9kZVR5cGUuRm9sZGVyLFxuICAgICAgICAgICAgY2hpbGRyZW46IGJ1aWxkKGZvbGRlci5pZCwgZGVsZXRlZCksXG4gICAgICAgICAgICBzdGF0ZURlbGV0ZWQsXG4gICAgICAgICAgICBkZWxldGVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXBvcnROb2RlczogUmVwb3J0Tm9kZVtdID0gcmVwb3J0c1xuICAgICAgICAuZmlsdGVyKChyZXBvcnQ6IFJlcG9ydExpc3RJdGVtKSA9PiAocmVwb3J0LnJlcG9ydEZvbGRlcklkID8/IG51bGwpID09PSBwYXJlbnRJZClcbiAgICAgICAgLm1hcCgocmVwb3J0OiBSZXBvcnRMaXN0SXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlRGVsZXRlZCA9IHJlcG9ydC5zdGF0ZSA9PT0gUmVwb3J0U3RhdGUuRGVsZXRlZDtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IGByOiR7cmVwb3J0LmlkfWAsXG4gICAgICAgICAgICBpZDogcmVwb3J0LmlkLFxuICAgICAgICAgICAgbmFtZTogcmVwb3J0Lm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBSZXBvcnROb2RlVHlwZS5SZXBvcnQsXG4gICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICByZXBvcnQsXG4gICAgICAgICAgICBzdGF0ZURlbGV0ZWQsXG4gICAgICAgICAgICBkZWxldGVkOiBwYXJlbnREZWxldGVkIHx8IHN0YXRlRGVsZXRlZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIFsuLi5mb2xkZXJOb2RlcywgLi4ucmVwb3J0Tm9kZXNdO1xuICAgIH07XG5cbiAgICByZXR1cm4gYnVpbGQobnVsbCwgZmFsc2UpO1xuICB9XG5cbiAgLy8gQSBkcm9wIG1vdmVkIGEgbm9kZSB1bmRlciBhIG5ldyBwYXJlbnQsIG9yIG91dCB0byB0aGUgcm9vdC4gVGhlIHRyZWUgaGFzXG4gIC8vIGFscmVhZHkgbW92ZWQgaXQgb24gc2NyZWVuLCBzbyBib3RoIG91dGNvbWVzIHJlbG9hZDogYSBzdWNjZXNzIHRvIHBpY2sgdXBcbiAgLy8gdGhlIHNlcnZlcidzIG9yZGVyaW5nLCBhIGZhaWx1cmUgdG8gcHV0IHRoZSByb3cgYmFjayB3aGVyZSBpdCByZWFsbHkgaXMuXG4gIHByaXZhdGUgX21vdmUoZXZlbnQ6IElUcmVlQ2hhbmdlUmVvcmRlcik6IHZvaWQge1xuICAgIGNvbnN0IG5vZGU6IFJlcG9ydE5vZGUgPSBldmVudC5ub2RlPy5kYXRhO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudFJlcG9ydEZvbGRlcklkOiBudW1iZXIgPSBldmVudC50b1BhcmVudD8uZGF0YT8uaWQgPz8gbnVsbDtcblxuICAgIGlmIChldmVudC50b1BhcmVudCAmJiAhZXZlbnQudG9QYXJlbnQuaXNFeHBhbmRlZCgpKSB7XG4gICAgICBldmVudC50b1BhcmVudC5leHBhbmQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlJDogT2JzZXJ2YWJsZTx1bmtub3duPiA9IG5vZGUudHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyXG4gICAgICA/IHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRm9sZGVyKG5vZGUuaWQsIHsgcGFyZW50UmVwb3J0Rm9sZGVySWQgfSlcbiAgICAgIDogdGhpcy5fcmVwb3J0RGF0YS5tb3ZlUmVwb3J0KG5vZGUuaWQsIHBhcmVudFJlcG9ydEZvbGRlcklkKTtcblxuICAgIHNhdmUkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1NhdmVkIGNoYW5nZXMnKTtcbiAgICAgICAgICB0aGlzLl9sb2FkKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLl9sb2FkKCksXG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUZvbGRlcihwYXJlbnRSZXBvcnRGb2xkZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmlucHV0KHtcbiAgICAgIHRpdGxlOiAnTmV3IEZvbGRlcicsXG4gICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgY29tbWl0TGFiZWw6ICdDcmVhdGUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKG5hbWU6IHN0cmluZykgPT4gdGhpcy5fcmVwb3J0RGF0YS5jcmVhdGVGb2xkZXIobmFtZSwgcGFyZW50UmVwb3J0Rm9sZGVySWQpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQ3JlYXRlZCBmb2xkZXInKTtcbiAgICAgICAgdGhpcy5fbG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5hbWUobm9kZTogRmxhdEl0ZW1Ob2RlKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YTogUmVwb3J0Tm9kZSA9IG5vZGU/LmRhdGE7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9sZGVyID0gZGF0YS50eXBlID09PSBSZXBvcnROb2RlVHlwZS5Gb2xkZXI7XG5cbiAgICB0aGlzLl9wcm9tcHQuaW5wdXQoe1xuICAgICAgdGl0bGU6IGZvbGRlciA/ICdSZW5hbWUgRm9sZGVyJyA6ICdSZW5hbWUgUmVwb3J0JyxcbiAgICAgIGxhYmVsOiAnTmFtZScsXG4gICAgICBkZWZhdWx0OiBkYXRhLm5hbWUsXG4gICAgICBjb21taXRMYWJlbDogJ1NhdmUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKG5hbWU6IHN0cmluZykgPT4gKGZvbGRlclxuICAgICAgICAgID8gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVGb2xkZXIoZGF0YS5pZCwgeyBuYW1lIH0pXG4gICAgICAgICAgOiB0aGlzLl9yZXBvcnREYXRhLnJlbmFtZShkYXRhLmlkLCBuYW1lKSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTYXZlZCBjaGFuZ2VzJyk7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gQSBmb2xkZXIgZGVsZXRlcyB3aXRoIGV2ZXJ5dGhpbmcgaW4gaXQsIHNvIHRoZSBjb25maXJtIHNheXMgd2hhdCB0aGF0IGlzIOKAlFxuICAvLyBhbmQgdGhhdCBpdCBhbGwgY29tZXMgYmFjayBmcm9tIFNob3cgRGVsZXRlZCwgd2hpY2ggaXMgd2hhdCBtYWtlcyBpdCBzYWZlIHRvXG4gIC8vIG9mZmVyLlxuICBwcml2YXRlIF9kZWxldGUobm9kZTogRmxhdEl0ZW1Ob2RlKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YTogUmVwb3J0Tm9kZSA9IG5vZGU/LmRhdGE7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9sZGVyID0gZGF0YS50eXBlID09PSBSZXBvcnROb2RlVHlwZS5Gb2xkZXI7XG5cbiAgICB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICB0aXRsZTogJ0NvbmZpcm0nLFxuICAgICAgdGVtcGxhdGU6IGZvbGRlclxuICAgICAgICA/IHRoaXMuX2RlbGV0ZUZvbGRlck1lc3NhZ2UoZGF0YSlcbiAgICAgICAgOiAnQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZSB0aGlzIHJlcG9ydD8nLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IChmb2xkZXJcbiAgICAgICAgICA/IHRoaXMuX3JlcG9ydERhdGEuZGVsZXRlRm9sZGVyKGRhdGEuaWQpXG4gICAgICAgICAgOiB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZShkYXRhLmlkKSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKGZvbGRlciA/ICdEZWxldGVkIGZvbGRlcicgOiAnRGVsZXRlZCByZXBvcnQnKTtcbiAgICAgICAgdGhpcy5fbG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBDb3VudGVkIGZyb20gdGhlIG5vZGUgYWxyZWFkeSBvbiBzY3JlZW4sIGxpdmUgcm93cyBvbmx5OiBpbiBTaG93IERlbGV0ZWRcbiAgLy8gbW9kZSB0aGUgZm9sZGVyIGNhbiBhbHNvIGhvbGQgcm93cyB0aGF0IGFyZSBnb25lIGFscmVhZHksIGFuZCB0aG9zZSBhcmUgbm90XG4gIC8vIGxlYXZpbmcgd2l0aCBpdC5cbiAgcHJpdmF0ZSBfZGVsZXRlRm9sZGVyTWVzc2FnZShmb2xkZXI6IFJlcG9ydE5vZGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gKG5vZGU6IFJlcG9ydE5vZGUpOiB7IGZvbGRlcnM6IG51bWJlcjsgcmVwb3J0czogbnVtYmVyIH0gPT4gbm9kZS5jaGlsZHJlblxuICAgICAgLmZpbHRlcigoY2hpbGQpID0+ICFjaGlsZC5kZWxldGVkKVxuICAgICAgLnJlZHVjZSgodG90YWwsIGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGJlbG93ID0gY291bnQoY2hpbGQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9sZGVyczogdG90YWwuZm9sZGVycyArIGJlbG93LmZvbGRlcnMgKyAoY2hpbGQudHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyID8gMSA6IDApLFxuICAgICAgICAgIHJlcG9ydHM6IHRvdGFsLnJlcG9ydHMgKyBiZWxvdy5yZXBvcnRzICsgKGNoaWxkLnR5cGUgPT09IFJlcG9ydE5vZGVUeXBlLlJlcG9ydCA/IDEgOiAwKSxcbiAgICAgICAgfTtcbiAgICAgIH0sIHsgZm9sZGVyczogMCwgcmVwb3J0czogMCB9KTtcblxuICAgIGNvbnN0IHsgZm9sZGVycywgcmVwb3J0cyB9ID0gY291bnQoZm9sZGVyKTtcbiAgICBjb25zdCBjb250ZW50cyA9IFtcbiAgICAgIGZvbGRlcnMgPyBgJHtmb2xkZXJzfSAke2ZvbGRlcnMgPT09IDEgPyAnZm9sZGVyJyA6ICdmb2xkZXJzJ31gIDogJycsXG4gICAgICByZXBvcnRzID8gYCR7cmVwb3J0c30gJHtyZXBvcnRzID09PSAxID8gJ3JlcG9ydCcgOiAncmVwb3J0cyd9YCA6ICcnLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgY29uc3QgaW5zaWRlID0gY29udGVudHMubGVuZ3RoID8gYCBhbmQgdGhlICR7Y29udGVudHMuam9pbignIGFuZCAnKX0gaW5zaWRlIGl0YCA6ICcnO1xuXG4gICAgcmV0dXJuIGBBcmUgeW91IHN1cmUgeW91IHdvdWxkIGxpa2UgdG8gZGVsZXRlIHRoZSBmb2xkZXIgXCIke2ZvbGRlci5uYW1lfVwiJHtpbnNpZGV9PyBJdCBjYW4gYmUgcmVzdG9yZWQgZnJvbSBTaG93IERlbGV0ZWQuYDtcbiAgfVxuXG4gIC8vIEJvdGggZW5kcG9pbnRzIGFsc28gcmVzdG9yZSBhbnkgZGVsZXRlZCBmb2xkZXIgYWJvdmUgdGhlIHJvdywgc28gYSByb3cgdGhhdFxuICAvLyBpcyBsaXZlIGl0c2VsZiBidXQgaGlkZGVuIGJ5IGEgZGVsZXRlZCBmb2xkZXIgaXMgcmVzdG9yZWQgYnkgdGhlIHNhbWUgY2FsbC5cbiAgcHJpdmF0ZSBfcmVzdG9yZShub2RlOiBGbGF0SXRlbU5vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhOiBSZXBvcnROb2RlID0gbm9kZT8uZGF0YTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkYXRhLnR5cGUgPT09IFJlcG9ydE5vZGVUeXBlLkZvbGRlcjtcblxuICAgIChmb2xkZXJcbiAgICAgID8gdGhpcy5fcmVwb3J0RGF0YS51bmRlbGV0ZUZvbGRlcihkYXRhLmlkKVxuICAgICAgOiB0aGlzLl9yZXBvcnREYXRhLnVuZGVsZXRlKGRhdGEuaWQpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoZm9sZGVyID8gJ1Jlc3RvcmVkIGZvbGRlcicgOiAnUmVzdG9yZWQgcmVwb3J0Jyk7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVHVybiBhICc6aWQnIHBhdHRlcm4gaW50byByb3V0ZXIgY29tbWFuZHMuIFJlbGF0aXZlIHVubGVzcyBpdCBzdGFydHNcbiAgLy8gd2l0aCAnLycsIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IHNlZ21lbnQgY2FycmllcyB0aGUgbGVhZGluZyBzbGFzaC5cbiAgcHJpdmF0ZSBfcGF0dGVybkNvbW1hbmRzKHBhdHRlcm46IHN0cmluZywgaWQ6IG51bWJlcik6IHVua25vd25bXSB7XG4gICAgY29uc3QgYWJzb2x1dGUgPSBwYXR0ZXJuLnN0YXJ0c1dpdGgoJy8nKTtcbiAgICBjb25zdCBzZWdtZW50czogdW5rbm93bltdID0gcGF0dGVybi5zcGxpdCgnLycpXG4gICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50Lmxlbmd0aCA+IDApXG4gICAgICAubWFwKChzZWdtZW50KSA9PiAoc2VnbWVudCA9PT0gJzppZCcgPyBpZCA6IHNlZ21lbnQpKTtcblxuICAgIGlmICghc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW2lkXTtcbiAgICB9XG5cbiAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgIHNlZ21lbnRzWzBdID0gYC8ke3NlZ21lbnRzWzBdfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG59XG4iLCI8ZnMtZmlsdGVyIFtjb25maWddPVwiZmlsdGVyQ29uZmlnXCI+PC9mcy1maWx0ZXI+XG5cbjxuZy1jb250YWluZXIgKmZzU2tlbGV0b249XCJub2RlcygpXCI+XG4gIDxmcy10cmVlIFtjb25maWddPVwidHJlZUNvbmZpZ1wiPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBmc1RyZWVOb2RlXG4gICAgICAgIGxldC1kYXRhPVwiZGF0YVwiPlxuICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZnMtcm93LmdhcC1zbS5hbGlnbi1jZW50ZXIgbm9kZS1yb3dcIlxuICAgICAgICAgIFtjbGFzcy5kZWxldGVkXT1cImRhdGEuZGVsZXRlZFwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2RlLWljb25cIj5cbiAgICAgICAgICB7eyBkYXRhLnR5cGUgPT09IG5vZGVUeXBlLkZvbGRlciA/ICdmb2xkZXInIDogJ2luc2VydF9jaGFydF9vdXRsaW5lZCcgfX1cbiAgICAgICAgPC9tYXQtaWNvbj5cblxuICAgICAgICBAaWYgKGRhdGEudHlwZSA9PT0gbm9kZVR5cGUuRm9sZGVyIHx8IGRhdGEuZGVsZXRlZCkge1xuICAgICAgICAgIDwhLS0gQSBkZWxldGVkIHJlcG9ydCBjYW4ndCBiZSBvcGVuZWQgKHRoZSBiYWNrZW5kIG9ubHkgYXNzZW1ibGVzXG4gICAgICAgICAgICAgICBsaXZlIG9uZXMsIGFuZCBvbmUgdW5kZXIgYSBkZWxldGVkIGZvbGRlciBpcyBub3Qgb24gdGhlIGxpdmVcbiAgICAgICAgICAgICAgIGxpc3RpbmcpLCBzbyBpbiBTaG93IERlbGV0ZWQgbW9kZSB0aGUgbmFtZSBpcyBwbGFpbiB0ZXh0IOKAlFxuICAgICAgICAgICAgICAgcmVzdG9yZSBpdCBmcm9tIHRoZSByb3cgbWVudSBmaXJzdC4gLS0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJub2RlLW5hbWVcIj57eyBkYXRhLm5hbWUgfX08L3NwYW4+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIGNsYXNzPVwibm9kZS1uYW1lXCJcbiAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwib3BlbkxpbmsoZGF0YS5yZXBvcnQpXCI+XG4gICAgICAgICAgICB7eyBkYXRhLm5hbWUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIE9ubHkgb24gdGhlIHJvdyBzb21lYm9keSBkZWxldGVkLiBFdmVyeXRoaW5nIHVuZGVyIGEgZGVsZXRlZFxuICAgICAgICAgICAgIGZvbGRlciBpcyBtdXRlZCB3aXRoIGl0LCBidXQgd2FzIG5vdCBkZWxldGVkIGl0c2VsZi4gLS0+XG4gICAgICAgIEBpZiAoZGF0YS5zdGF0ZURlbGV0ZWQpIHtcbiAgICAgICAgICA8ZnMtY2hpcCBzaXplPVwidGlueVwiPkRlbGV0ZWQ8L2ZzLWNoaXA+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtdHJlZT5cblxuICBAaWYgKCFub2RlcygpLmxlbmd0aCkge1xuICAgIDxwIGNsYXNzPVwic21hbGwgdHJlZS1lbXB0eVwiPlxuICAgICAgTm8gcmVwb3J0cyB5ZXQuIENyZWF0ZSBvbmUsIG9yIGFkZCBhIGZvbGRlciB0byBncm91cCB0aGVtLlxuICAgIDwvcD5cbiAgfVxuPC9uZy1jb250YWluZXI+XG4iXX0=