@firestitch/report 18.10.2 → 18.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -1
- package/app/reports/data/report.data.d.ts +8 -12
- package/app/reports/export/report-export-collector.service.d.ts +0 -1
- package/app/reports/export/report-filter-lines.d.ts +0 -2
- package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +0 -2
- package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -3
- package/app/reports/interfaces/report-saved-filter-changes.interface.d.ts +4 -0
- package/app/reports/interfaces/report-saved-filter.interface.d.ts +6 -0
- package/app/reports/interfaces/{report-view-config.interface.d.ts → report-state-snapshot.interface.d.ts} +1 -2
- package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -1
- package/app/reports/report-chat-viewer-state.d.ts +3 -3
- package/app/reports/report-saved-filters.d.ts +3 -0
- package/app/reports/report-state.d.ts +15 -0
- package/app/reports/services/report-filter-state.service.d.ts +9 -25
- package/app/reports/tile-data-state.d.ts +5 -5
- package/app/reports/views/report/fs-ai-report.component.d.ts +12 -5
- package/esm2022/app/reports/canvas-landing-page.mjs +3 -3
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +3 -3
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +8 -12
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +25 -30
- package/esm2022/app/reports/data/report.data.mjs +24 -41
- package/esm2022/app/reports/export/report-export-collector.service.mjs +11 -18
- package/esm2022/app/reports/export/report-filter-lines.mjs +5 -15
- package/esm2022/app/reports/filter-settings-rules.mjs +2 -2
- package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-saved-filter-changes.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-saved-filter.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-state-snapshot.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +1 -1
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/mark-click.mjs +2 -2
- package/esm2022/app/reports/report-chat-viewer-state.mjs +3 -3
- package/esm2022/app/reports/report-date-presets.mjs +2 -2
- package/esm2022/app/reports/report-saved-filters.mjs +92 -0
- package/esm2022/app/reports/report-state.mjs +169 -0
- package/esm2022/app/reports/report-viewer-features.mjs +2 -4
- package/esm2022/app/reports/services/report-filter-state.service.mjs +83 -310
- package/esm2022/app/reports/tile-data-state.mjs +4 -4
- package/esm2022/app/reports/tile-loads.mjs +5 -6
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +192 -102
- package/esm2022/app/reports/views/report/report.component.mjs +14 -16
- package/esm2022/public_api.mjs +4 -8
- package/fesm2022/{firestitch-report-echarts-CyHkFToO.mjs → firestitch-report-echarts-B0RWUjR8.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-CyHkFToO.mjs.map → firestitch-report-echarts-B0RWUjR8.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-DftB7M1o.mjs → firestitch-report-firestitch-report-CJW0lLdW.mjs} +480 -1450
- package/fesm2022/firestitch-report-firestitch-report-CJW0lLdW.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +3 -7
- package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +0 -21
- package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +0 -13
- package/app/reports/interfaces/report-view-create.interface.d.ts +0 -7
- package/app/reports/interfaces/report-view-deleted.interface.d.ts +0 -4
- package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +0 -7
- package/app/reports/interfaces/report-view-dropped.interface.d.ts +0 -5
- package/app/reports/interfaces/report-view-menu-item.interface.d.ts +0 -10
- package/app/reports/interfaces/report-view-summary.interface.d.ts +0 -11
- package/app/reports/interfaces/report-view.interface.d.ts +0 -7
- package/app/reports/interfaces/report-views.interface.d.ts +0 -7
- package/app/reports/report-view-config.d.ts +0 -34
- package/app/reports/report-view-menu.d.ts +0 -15
- package/app/reports/services/report-view.service.d.ts +0 -39
- package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +0 -115
- package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +0 -52
- package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-view.interface.mjs +0 -2
- package/esm2022/app/reports/interfaces/report-views.interface.mjs +0 -2
- package/esm2022/app/reports/report-view-config.mjs +0 -587
- package/esm2022/app/reports/report-view-menu.mjs +0 -119
- package/esm2022/app/reports/services/report-view.service.mjs +0 -218
- package/fesm2022/firestitch-report-firestitch-report-DftB7M1o.mjs.map +0 -1
|
@@ -11,10 +11,7 @@ import { listHiddenColumns, listSortTerms } from '../list-config';
|
|
|
11
11
|
import { dateBoundString, LIST_SEARCH_MAX_LENGTH } from '../report-filter-items';
|
|
12
12
|
import { groupValueSignature } from '../report-filter-items';
|
|
13
13
|
import { isTile } from '../report-tile';
|
|
14
|
-
import { isRelativeRange } from '../report-
|
|
15
|
-
import { REPORT_VIEW_CONFIG_VERSION, cleanDrillPath, groupValueFromStored, isChartGranularity, sameDrillPath, toLiveGroupValue, toStoredGroupValue, viewDiffers, } from '../report-view-config';
|
|
16
|
-
import { finiteNumber } from '../report-view-config';
|
|
17
|
-
import { sameStoredGroupValue } from '../report-view-config';
|
|
14
|
+
import { cleanDrillPath, finiteNumber, isRelativeRange, sameDrillPath, sameStoredGroupValue, stateDiffers, toStoredGroupValue, } from '../report-state';
|
|
18
15
|
import { tileDataState } from '../tile-data-state';
|
|
19
16
|
import { reportComponents } from '../values';
|
|
20
17
|
import * as i0 from "@angular/core";
|
|
@@ -121,16 +118,17 @@ function emptyTemporaryState() {
|
|
|
121
118
|
// columns, the page and each chart's drill path. None of it is ever written to
|
|
122
119
|
// the browser URL. It outlives a page switch (the canvas changes the page, not
|
|
123
120
|
// this service) and goes with the report view: a reload starts a new service,
|
|
124
|
-
// which opens on the report's defaults
|
|
125
|
-
//
|
|
121
|
+
// which opens on the report's authored defaults. changes() fires on every
|
|
122
|
+
// change of it.
|
|
126
123
|
//
|
|
127
|
-
// The durable part
|
|
128
|
-
//
|
|
129
|
-
//
|
|
130
|
-
//
|
|
124
|
+
// The durable part reads as one document: snapshot() writes it, and
|
|
125
|
+
// differsFromDefaults says whether the screen still shows the report's
|
|
126
|
+
// authored defaults (resetToDefaults() puts it back on them). The temporary
|
|
127
|
+
// layer (a cross-filter, an open rows panel) is its own section, so a
|
|
128
|
+
// snapshot never carries it.
|
|
131
129
|
//
|
|
132
|
-
// Session-only, never in
|
|
133
|
-
// component's filter menu (the `enabled` column is the authored default; a
|
|
130
|
+
// Session-only, never in the snapshot: per-filter enable/disable toggles from
|
|
131
|
+
// a component's filter menu (the `enabled` column is the authored default; a
|
|
134
132
|
// viewer's toggle shouldn't write to the report).
|
|
135
133
|
export class ReportFilterStateService {
|
|
136
134
|
// The open report's effective zone (resolveReportTimezone). Relative presets
|
|
@@ -153,14 +151,10 @@ export class ReportFilterStateService {
|
|
|
153
151
|
listHidden = signal(new Map(), {
|
|
154
152
|
equal: sameHidden,
|
|
155
153
|
});
|
|
156
|
-
// Moves each time
|
|
157
|
-
//
|
|
154
|
+
// Moves each time resetToDefaults() replaces the whole durable state. Bars
|
|
155
|
+
// and tiles key on it, so a reset repaints all of them; the tiles refetch
|
|
156
|
+
// in place, so their data stays on screen while they reload.
|
|
158
157
|
stateVersion = computed(() => this._stateVersion());
|
|
159
|
-
// Moves each time apply() opens a view (or the report's defaults). The
|
|
160
|
-
// canvas keys its tiles on it, so an opened view draws each one again.
|
|
161
|
-
// resetToBase() leaves it: a reset refetches the tiles in place, so their
|
|
162
|
-
// data stays on screen while they reload.
|
|
163
|
-
appliedVersion = computed(() => this._appliedVersion());
|
|
164
158
|
// By list component id, how many resets moved that list's sort. FsList
|
|
165
159
|
// reads its sort only when it is created, so a list whose sort a reset
|
|
166
160
|
// moved is drawn again (keyed on its count); every other tile reloads in
|
|
@@ -178,20 +172,12 @@ export class ReportFilterStateService {
|
|
|
178
172
|
// The report init() last read, or null before one is open. A tile header
|
|
179
173
|
// lists its select options from it (ReportFilterOptionsService).
|
|
180
174
|
report = computed(() => this._report());
|
|
181
|
-
//
|
|
182
|
-
//
|
|
183
|
-
//
|
|
184
|
-
|
|
185
|
-
base = computed(() => {
|
|
175
|
+
// Whether the screen differs from the report's authored defaults
|
|
176
|
+
// (stateDiffers): what the report bar's 'Clear filters' shows for. A switch
|
|
177
|
+
// of page does not count, and the temporary state never does.
|
|
178
|
+
differsFromDefaults = computed(() => {
|
|
186
179
|
this._revision();
|
|
187
|
-
return this.
|
|
188
|
-
});
|
|
189
|
-
// Whether the screen differs from base (viewDiffers): what a view picker
|
|
190
|
-
// marks '(edited)'. A switch of page does not count, and the temporary
|
|
191
|
-
// state never does.
|
|
192
|
-
viewChanged = computed(() => {
|
|
193
|
-
this._revision();
|
|
194
|
-
return viewDiffers(this.base(), this.snapshot(), this.authoredConfig());
|
|
180
|
+
return stateDiffers(this.authoredConfig(), this.snapshot());
|
|
195
181
|
});
|
|
196
182
|
_values = new Map();
|
|
197
183
|
_groups = new Map();
|
|
@@ -202,7 +188,7 @@ export class ReportFilterStateService {
|
|
|
202
188
|
_cleared = new Set();
|
|
203
189
|
// The report's group-by control: a single report-wide bucket override for all
|
|
204
190
|
// time-series charts. Unset = each chart uses its authored granularity. Never
|
|
205
|
-
// saved to the report
|
|
191
|
+
// saved to the report, and carried in the data request's
|
|
206
192
|
// `state`, so it propagates through to the PDF/PowerPoint exports too. Named
|
|
207
193
|
// for the `frequency` wire key it travels under, not for the control's label.
|
|
208
194
|
_frequency = null;
|
|
@@ -230,10 +216,11 @@ export class ReportFilterStateService {
|
|
|
230
216
|
// Fires whenever anything in the viewer state may have changed.
|
|
231
217
|
_stateChanged$ = new Subject();
|
|
232
218
|
// Counts the changes changes() reports. The group values, the grain and
|
|
233
|
-
// the list state that
|
|
219
|
+
// the list state that differsFromDefaults compares are the plain fields
|
|
234
220
|
// above, which every setter reports through changes() (they are shared
|
|
235
221
|
// with the inline values build, so they stay as they are); this counter is
|
|
236
|
-
// how the
|
|
222
|
+
// how the computed hears of them. The page, match and drills below are
|
|
223
|
+
// signals and
|
|
237
224
|
// is read directly. The subject is this service's own and is never
|
|
238
225
|
// completed, so the signal listens to it exactly as long as the service
|
|
239
226
|
// lives.
|
|
@@ -242,13 +229,11 @@ export class ReportFilterStateService {
|
|
|
242
229
|
manualCleanup: true,
|
|
243
230
|
});
|
|
244
231
|
_stateVersion = signal(0);
|
|
245
|
-
_appliedVersion = signal(0);
|
|
246
232
|
_listSortResets = signal(new Map());
|
|
247
|
-
// The report init() last read: the tiles and pages
|
|
248
|
-
//
|
|
233
|
+
// The report init() last read: the tiles and pages the state is checked
|
|
234
|
+
// against.
|
|
249
235
|
_report = signal(null);
|
|
250
|
-
// The open page, set by the host as the viewer moves between pages.
|
|
251
|
-
// stores it, but moving to another page never edits a view.
|
|
236
|
+
// The open page, set by the host as the viewer moves between pages.
|
|
252
237
|
_pageId = signal(null);
|
|
253
238
|
// How the groups combine: 'all' (the default) or 'any'.
|
|
254
239
|
_match = signal('all');
|
|
@@ -257,11 +242,8 @@ export class ReportFilterStateService {
|
|
|
257
242
|
_drills = signal(new Map());
|
|
258
243
|
// Emits the id of the chart whose drill path changed.
|
|
259
244
|
_drillChanged$ = new Subject();
|
|
260
|
-
// The base as apply() applied it, or null when the base is the authored
|
|
261
|
-
// defaults (see base).
|
|
262
|
-
_baseConfig = signal(null);
|
|
263
245
|
// The temporary layer: kept apart from everything above, so snapshot()
|
|
264
|
-
// and
|
|
246
|
+
// and differsFromDefaults never read it.
|
|
265
247
|
_temporary = signal(emptyTemporaryState());
|
|
266
248
|
// Seed groups + their defaults when a report loads. Existing session values
|
|
267
249
|
// for still-existing groups survive a structure re-fetch (a chat edit
|
|
@@ -291,7 +273,7 @@ export class ReportFilterStateService {
|
|
|
291
273
|
}
|
|
292
274
|
this._lists = new Map(this._listComponents(report).map((component) => [component.id, component]));
|
|
293
275
|
this._prune(report);
|
|
294
|
-
this.
|
|
276
|
+
this._prunePageState(report);
|
|
295
277
|
this._changed$.next(null);
|
|
296
278
|
this._stateChanged$.next();
|
|
297
279
|
}
|
|
@@ -318,7 +300,7 @@ export class ReportFilterStateService {
|
|
|
318
300
|
this._stateChanged$.next();
|
|
319
301
|
}
|
|
320
302
|
// A relative preset name as today's range in the report's zone, or null for
|
|
321
|
-
// a name it does not know.
|
|
303
|
+
// a name it does not know.
|
|
322
304
|
resolveRelative(name) {
|
|
323
305
|
return this._relativeRange(name);
|
|
324
306
|
}
|
|
@@ -366,8 +348,8 @@ export class ReportFilterStateService {
|
|
|
366
348
|
// Whether a list shows the search box over its text columns: it does when the
|
|
367
349
|
// server answers a list search (see _serverSearches), unless one of its live
|
|
368
350
|
// filters belongs to a keyword group its header shows. A bar shows one search
|
|
369
|
-
// box (its last keyword item), and that one is the author's. The header,
|
|
370
|
-
//
|
|
351
|
+
// box (its last keyword item), and that one is the author's. The header, the
|
|
352
|
+
// pruning, the data request state and the exports all read
|
|
371
353
|
// this one rule, so no search narrows a list whose screen has no box showing
|
|
372
354
|
// it, and no export titles a search the server did not apply.
|
|
373
355
|
listSearchable(component) {
|
|
@@ -427,7 +409,7 @@ export class ReportFilterStateService {
|
|
|
427
409
|
}
|
|
428
410
|
// Fires whenever the viewer state may have changed: a group value, the
|
|
429
411
|
// grain, the match, the page, a list sort, search or hidden columns, a
|
|
430
|
-
// drill path,
|
|
412
|
+
// drill path, a reset or a (re)load of the report.
|
|
431
413
|
changes() {
|
|
432
414
|
return this._stateChanged$.asObservable();
|
|
433
415
|
}
|
|
@@ -566,117 +548,86 @@ export class ReportFilterStateService {
|
|
|
566
548
|
this._stateChanged$.next();
|
|
567
549
|
return true;
|
|
568
550
|
}
|
|
569
|
-
// The durable state on screen as one
|
|
570
|
-
//
|
|
571
|
-
//
|
|
572
|
-
//
|
|
573
|
-
//
|
|
574
|
-
//
|
|
551
|
+
// The durable state on screen as one document: the page, every group the
|
|
552
|
+
// report has (null when it holds nothing, a cleared default included), the
|
|
553
|
+
// match, the grain, and each tile's sort, search, hidden columns and drill
|
|
554
|
+
// path where they differ from the authored tile. A date range that still
|
|
555
|
+
// carries its relative preset is written as that preset, whatever today is
|
|
556
|
+
// (toStoredGroupValue). The temporary layer is never part of it.
|
|
575
557
|
snapshot() {
|
|
576
|
-
const
|
|
558
|
+
const snapshot = {};
|
|
577
559
|
if (this._pageId()) {
|
|
578
|
-
|
|
560
|
+
snapshot.pageId = this._pageId();
|
|
579
561
|
}
|
|
580
562
|
if (this._frequency) {
|
|
581
|
-
|
|
563
|
+
snapshot.groupBy = this._frequency;
|
|
582
564
|
}
|
|
583
565
|
if (this._match() === 'any') {
|
|
584
|
-
|
|
566
|
+
snapshot.match = 'any';
|
|
585
567
|
}
|
|
586
|
-
|
|
568
|
+
snapshot.groups = this._snapshotGroups();
|
|
587
569
|
const tiles = this._snapshotTiles();
|
|
588
570
|
if (Object.keys(tiles).length) {
|
|
589
|
-
|
|
571
|
+
snapshot.tiles = tiles;
|
|
590
572
|
}
|
|
591
|
-
return
|
|
573
|
+
return snapshot;
|
|
592
574
|
}
|
|
593
|
-
// The report's authored defaults as a
|
|
594
|
-
//
|
|
575
|
+
// The report's authored defaults as a snapshot: every group at its authored
|
|
576
|
+
// default (null when it has none), no match, grain or tile state.
|
|
595
577
|
authoredConfig() {
|
|
596
578
|
const groups = {};
|
|
597
579
|
this._groups.forEach((group) => {
|
|
598
580
|
groups[group.id] = toStoredGroupValue(group.type, this._defaultValue(group));
|
|
599
581
|
});
|
|
600
|
-
return {
|
|
601
|
-
}
|
|
602
|
-
//
|
|
603
|
-
//
|
|
604
|
-
//
|
|
605
|
-
//
|
|
606
|
-
//
|
|
607
|
-
|
|
608
|
-
// the report opened with beats its default view's page). The temporary
|
|
609
|
-
// layer is kept. Every change is announced once, at the end.
|
|
610
|
-
apply(config, pageId = null) {
|
|
611
|
-
const frequency = this._frequency;
|
|
612
|
-
this._setBase(config);
|
|
613
|
-
this._applyPage(config?.pageId);
|
|
614
|
-
this._applyPage(pageId);
|
|
615
|
-
this._appliedVersion.update((version) => version + 1);
|
|
616
|
-
this._notifyApplied(frequency);
|
|
617
|
-
}
|
|
618
|
-
// Puts the screen back on its base (the open view, else the authored
|
|
619
|
-
// defaults) on the page it is on, and clears the temporary layer. The
|
|
620
|
-
// tiles stay and reload in place (appliedVersion does not move), except a
|
|
621
|
-
// list whose sort this moved (listSortResets).
|
|
622
|
-
resetToBase() {
|
|
582
|
+
return { groups };
|
|
583
|
+
}
|
|
584
|
+
// Puts the screen back on the report's authored defaults on the page it is
|
|
585
|
+
// on: every group at its default, match 'all', no grain, and every tile at
|
|
586
|
+
// its authored sort, search, columns and top. Clears the temporary layer.
|
|
587
|
+
// The tiles stay and reload in place, except a list whose sort this moved
|
|
588
|
+
// (listSortResets). Every change is announced once, at the end.
|
|
589
|
+
resetToDefaults() {
|
|
623
590
|
const frequency = this._frequency;
|
|
624
591
|
const sorts = new Map(this._listSorts);
|
|
625
592
|
this._temporary.set(emptyTemporaryState());
|
|
626
|
-
this.
|
|
593
|
+
this._groups.forEach((group) => this._seedAuthored(group));
|
|
594
|
+
this._match.set('all');
|
|
595
|
+
this._frequency = null;
|
|
596
|
+
this._clearTiles();
|
|
627
597
|
this._countSortResets(sorts);
|
|
628
|
-
this.
|
|
629
|
-
}
|
|
630
|
-
//
|
|
631
|
-
//
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
// The report's authored defaults become the base again (the open view was
|
|
637
|
-
// deleted); the screen stays as it is.
|
|
638
|
-
clearBase() {
|
|
639
|
-
this._baseConfig.set(null);
|
|
640
|
-
this._stateChanged$.next();
|
|
641
|
-
}
|
|
642
|
-
// Puts only `groupIds` back on the base: the open view's value for a group
|
|
643
|
-
// it holds, else the group's authored default. A tile header's 'Clear
|
|
644
|
-
// filters' owns only its own groups; the report bar's calls resetToBase().
|
|
645
|
-
// Each group is announced as a viewer's change to it is, so the tiles in
|
|
646
|
-
// it refetch and a bar showing it with another value is built again.
|
|
647
|
-
resetGroupsToBase(groupIds) {
|
|
648
|
-
const held = this._baseConfig()?.groups ?? {};
|
|
598
|
+
this._notifyReset(frequency);
|
|
599
|
+
}
|
|
600
|
+
// Puts only `groupIds` back on their authored defaults. A tile header's
|
|
601
|
+
// 'Clear filters' owns only its own groups; the report bar's calls
|
|
602
|
+
// resetToDefaults(). Each group is announced as a viewer's change to it is,
|
|
603
|
+
// so the tiles in it refetch and a bar showing it with another value is
|
|
604
|
+
// built again.
|
|
605
|
+
resetGroupsToDefaults(groupIds) {
|
|
649
606
|
groupIds.forEach((groupId) => {
|
|
650
607
|
const group = this._groups.get(groupId);
|
|
651
608
|
if (!group) {
|
|
652
609
|
return;
|
|
653
610
|
}
|
|
654
|
-
|
|
655
|
-
this._seedAuthored(group);
|
|
656
|
-
}
|
|
611
|
+
this._seedAuthored(group);
|
|
657
612
|
this._changed$.next(groupId);
|
|
658
613
|
});
|
|
659
614
|
this._stateChanged$.next();
|
|
660
615
|
}
|
|
661
|
-
// Whether one of `groupIds` shows a value other than its
|
|
662
|
-
//
|
|
663
|
-
//
|
|
664
|
-
//
|
|
665
|
-
//
|
|
666
|
-
|
|
667
|
-
groupsDifferFromBase(groupIds) {
|
|
616
|
+
// Whether one of `groupIds` shows a value other than its authored default,
|
|
617
|
+
// the value resetGroupsToDefaults() puts back. A tile header's Clear chip
|
|
618
|
+
// shows exactly while one of its own groups does. It reads the revision
|
|
619
|
+
// differsFromDefaults reads, so a caller on each check of an OnPush view
|
|
620
|
+
// stays current.
|
|
621
|
+
groupsDifferFromDefaults(groupIds) {
|
|
668
622
|
this._revision();
|
|
669
|
-
const held = this._baseConfig()?.groups ?? {};
|
|
670
623
|
return groupIds.some((groupId) => {
|
|
671
624
|
const group = this._groups.get(groupId);
|
|
672
625
|
if (!group) {
|
|
673
626
|
return false;
|
|
674
627
|
}
|
|
675
|
-
const
|
|
676
|
-
? held[groupId]
|
|
677
|
-
: toStoredGroupValue(group.type, this._defaultValue(group));
|
|
628
|
+
const authored = toStoredGroupValue(group.type, this._defaultValue(group));
|
|
678
629
|
const screen = this._cleared.has(groupId) ? null : toStoredGroupValue(group.type, this._values.get(groupId));
|
|
679
|
-
return !sameStoredGroupValue(
|
|
630
|
+
return !sameStoredGroupValue(authored, screen);
|
|
680
631
|
});
|
|
681
632
|
}
|
|
682
633
|
// The interaction state a tile's data request carries now: tileDataState
|
|
@@ -943,77 +894,6 @@ export class ReportFilterStateService {
|
|
|
943
894
|
}
|
|
944
895
|
return tiles;
|
|
945
896
|
}
|
|
946
|
-
// The view apply() was given, applied as the screen's state and kept as
|
|
947
|
-
// the base. What is kept is the snapshot of it, with only the groups it
|
|
948
|
-
// held: a group it did not hold, or held in a shape that does not fit,
|
|
949
|
-
// follows its authored default (viewDiffers compares it with
|
|
950
|
-
// authoredConfig()).
|
|
951
|
-
_setBase(base) {
|
|
952
|
-
const held = this._applyLayer(base);
|
|
953
|
-
if (!base) {
|
|
954
|
-
this._baseConfig.set(null);
|
|
955
|
-
return;
|
|
956
|
-
}
|
|
957
|
-
// The page is the base's own, not the one on screen.
|
|
958
|
-
const applied = this.snapshot();
|
|
959
|
-
delete applied.pageId;
|
|
960
|
-
applied.groups = Object.fromEntries(Object.entries(applied.groups ?? {})
|
|
961
|
-
.filter(([groupId]) => held.has(Number(groupId))));
|
|
962
|
-
if (base.pageId && (this._report()?.pages ?? []).some((page) => page.id === base.pageId)) {
|
|
963
|
-
applied.pageId = base.pageId;
|
|
964
|
-
}
|
|
965
|
-
this._baseConfig.set(applied);
|
|
966
|
-
}
|
|
967
|
-
// Applies a view's state in place of the whole durable state, and gives the
|
|
968
|
-
// ids of the groups it set: what `config` does not hold goes back to the
|
|
969
|
-
// authored report. Nothing is announced here: the caller announces once
|
|
970
|
-
// (_notifyApplied).
|
|
971
|
-
_applyLayer(config) {
|
|
972
|
-
const held = this._applyGroups(config?.groups ?? {});
|
|
973
|
-
this._match.set(config?.match === 'any' ? 'any' : 'all');
|
|
974
|
-
const groupBy = config?.groupBy;
|
|
975
|
-
this._frequency = isChartGranularity(groupBy) ? groupBy : null;
|
|
976
|
-
this._clearTiles();
|
|
977
|
-
Object.entries(config?.tiles ?? {})
|
|
978
|
-
.forEach(([componentId, tile]) => this._applyTile(Number(componentId), tile ?? {}));
|
|
979
|
-
return held;
|
|
980
|
-
}
|
|
981
|
-
// Each group's value from a view; a group it does not set goes back to its
|
|
982
|
-
// authored default.
|
|
983
|
-
_applyGroups(groups) {
|
|
984
|
-
const held = new Set();
|
|
985
|
-
this._groups.forEach((group) => {
|
|
986
|
-
if (Object.prototype.hasOwnProperty.call(groups, group.id) && this._applyGroup(group, groups[group.id])) {
|
|
987
|
-
held.add(group.id);
|
|
988
|
-
}
|
|
989
|
-
else {
|
|
990
|
-
this._seedAuthored(group);
|
|
991
|
-
}
|
|
992
|
-
});
|
|
993
|
-
return held;
|
|
994
|
-
}
|
|
995
|
-
// One group's stored value, or false when the group's type cannot hold it
|
|
996
|
-
// (it is then dropped whole, and the caller seeds the group's authored
|
|
997
|
-
// default). null, or a value that holds nothing, clears the group.
|
|
998
|
-
_applyGroup(group, stored) {
|
|
999
|
-
const kept = stored === null ? {} : groupValueFromStored(stored, group.type);
|
|
1000
|
-
if (kept === null) {
|
|
1001
|
-
return false;
|
|
1002
|
-
}
|
|
1003
|
-
const value = toLiveGroupValue(group.type, kept, (name) => this.resolveRelative(name));
|
|
1004
|
-
if (value) {
|
|
1005
|
-
this._values.set(group.id, value);
|
|
1006
|
-
this._cleared.delete(group.id);
|
|
1007
|
-
}
|
|
1008
|
-
else {
|
|
1009
|
-
this._values.delete(group.id);
|
|
1010
|
-
this._cleared.delete(group.id);
|
|
1011
|
-
if (group.config?.default) {
|
|
1012
|
-
this._cleared.add(group.id);
|
|
1013
|
-
}
|
|
1014
|
-
}
|
|
1015
|
-
return true;
|
|
1016
|
-
}
|
|
1017
897
|
// A group back at its authored default.
|
|
1018
898
|
_seedAuthored(group) {
|
|
1019
899
|
const value = this._defaultValue(group);
|
|
@@ -1032,54 +912,6 @@ export class ReportFilterStateService {
|
|
|
1032
912
|
this.listHidden.set(new Map());
|
|
1033
913
|
this._drills.set(new Map());
|
|
1034
914
|
}
|
|
1035
|
-
// One tile's stored state, each key checked: a sort on a column the list
|
|
1036
|
-
// can sort by, a search on a list that shows the box, hidden columns the
|
|
1037
|
-
// list can hide, a drill path on a chart.
|
|
1038
|
-
_applyTile(componentId, tile) {
|
|
1039
|
-
const list = this._lists.get(componentId);
|
|
1040
|
-
if (list) {
|
|
1041
|
-
this._applyListTile(list, tile);
|
|
1042
|
-
}
|
|
1043
|
-
if (Array.isArray(tile.drill) && this._isChart(componentId)) {
|
|
1044
|
-
this._setDrillPath(componentId, cleanDrillPath(tile.drill));
|
|
1045
|
-
}
|
|
1046
|
-
}
|
|
1047
|
-
// A list's sort, search and hidden columns from a tile state, kept by the
|
|
1048
|
-
// rules setListSort, setListSearch and setHiddenColumns apply, but set
|
|
1049
|
-
// straight on the maps: those setters each announce a change, and an apply
|
|
1050
|
-
// announces once, at its end. A sort that is the list's authored first
|
|
1051
|
-
// term is its default, so it clears the entry.
|
|
1052
|
-
_applyListTile(list, tile) {
|
|
1053
|
-
const sort = tile.sort;
|
|
1054
|
-
if (sort?.column && this._sortableColumns(list).includes(sort.column)) {
|
|
1055
|
-
if (sameSort(sort, listSortTerms(list.config)[0] ?? null)) {
|
|
1056
|
-
this._listSorts.delete(list.id);
|
|
1057
|
-
}
|
|
1058
|
-
else {
|
|
1059
|
-
this._listSorts.set(list.id, { ...sort });
|
|
1060
|
-
}
|
|
1061
|
-
}
|
|
1062
|
-
if (typeof tile.search === 'string') {
|
|
1063
|
-
const search = listSearchText(tile.search);
|
|
1064
|
-
if (search && this.listSearchable(list)) {
|
|
1065
|
-
this._listSearches.set(list.id, search);
|
|
1066
|
-
}
|
|
1067
|
-
else {
|
|
1068
|
-
this._listSearches.delete(list.id);
|
|
1069
|
-
}
|
|
1070
|
-
}
|
|
1071
|
-
if (Array.isArray(tile.hidden)) {
|
|
1072
|
-
const hidden = listHiddenColumns(list.config, tile.hidden);
|
|
1073
|
-
const next = new Map(this.listHidden());
|
|
1074
|
-
if (hidden.length) {
|
|
1075
|
-
next.set(list.id, hidden);
|
|
1076
|
-
}
|
|
1077
|
-
else {
|
|
1078
|
-
next.delete(list.id);
|
|
1079
|
-
}
|
|
1080
|
-
this.listHidden.set(next);
|
|
1081
|
-
}
|
|
1082
|
-
}
|
|
1083
915
|
// One chart's drill path; an empty path is the chart's top.
|
|
1084
916
|
_setDrillPath(componentId, path) {
|
|
1085
917
|
const next = new Map(this._drills());
|
|
@@ -1091,15 +923,9 @@ export class ReportFilterStateService {
|
|
|
1091
923
|
}
|
|
1092
924
|
this._drills.set(next);
|
|
1093
925
|
}
|
|
1094
|
-
//
|
|
1095
|
-
_applyPage(pageId) {
|
|
1096
|
-
if (pageId && (this._report()?.pages ?? []).some((page) => page.id === pageId)) {
|
|
1097
|
-
this._pageId.set(pageId);
|
|
1098
|
-
}
|
|
1099
|
-
}
|
|
1100
|
-
// After apply() or resetToBase(): every bar and tile repaints, and the
|
|
926
|
+
// After resetToDefaults(): every bar and tile repaints, and the
|
|
1101
927
|
// time-series charts refetch when the grain moved.
|
|
1102
|
-
|
|
928
|
+
_notifyReset(frequency) {
|
|
1103
929
|
this._stateVersion.update((version) => version + 1);
|
|
1104
930
|
this._changed$.next(null);
|
|
1105
931
|
if (frequency !== this._frequency) {
|
|
@@ -1118,13 +944,12 @@ export class ReportFilterStateService {
|
|
|
1118
944
|
return this._tiles()
|
|
1119
945
|
.some((component) => component.id === componentId && component.type === 'chart');
|
|
1120
946
|
}
|
|
1121
|
-
// Keeps the
|
|
1122
|
-
// drill paths on charts it still has, the page while it has it
|
|
1123
|
-
//
|
|
1124
|
-
//
|
|
1125
|
-
|
|
947
|
+
// Keeps the page and drill state to what the report (re)loaded by init()
|
|
948
|
+
// still has: drill paths on charts it still has, the page while it has it.
|
|
949
|
+
// On another report it starts again: match 'all', no drill and nothing
|
|
950
|
+
// temporary.
|
|
951
|
+
_prunePageState(report) {
|
|
1126
952
|
if (this._report()?.id !== report.id) {
|
|
1127
|
-
this._baseConfig.set(null);
|
|
1128
953
|
this._match.set('all');
|
|
1129
954
|
this._pageId.set(null);
|
|
1130
955
|
this._drills.set(new Map());
|
|
@@ -1136,58 +961,6 @@ export class ReportFilterStateService {
|
|
|
1136
961
|
if (this._pageId() && !(report.pages ?? []).some((page) => page.id === this._pageId())) {
|
|
1137
962
|
this._pageId.set(null);
|
|
1138
963
|
}
|
|
1139
|
-
this._pruneBase(previousGroups);
|
|
1140
|
-
}
|
|
1141
|
-
// Keeps the base to what the screen can still show, by the rules the live
|
|
1142
|
-
// state is pruned by (_prune, _seed and the drill pruning above), so an
|
|
1143
|
-
// edit of the report alone never reads as '(edited)'. A group whose
|
|
1144
|
-
// authored default changed leaves the base and follows the new default,
|
|
1145
|
-
// as the live value does (_seed re-seeds it); so does a group the report
|
|
1146
|
-
// no longer has. Each tile keeps only the state its component can still
|
|
1147
|
-
// take (_baseTile).
|
|
1148
|
-
_pruneBase(previousGroups) {
|
|
1149
|
-
const base = this._baseConfig();
|
|
1150
|
-
if (!base) {
|
|
1151
|
-
return;
|
|
1152
|
-
}
|
|
1153
|
-
const groups = Object.fromEntries(Object.entries(base.groups ?? {})
|
|
1154
|
-
.filter(([groupId]) => {
|
|
1155
|
-
const group = this._groups.get(Number(groupId));
|
|
1156
|
-
return !!group
|
|
1157
|
-
&& sameDefault(previousGroups.get(group.id)?.config?.default ?? null, group.config?.default ?? null);
|
|
1158
|
-
}));
|
|
1159
|
-
const tiles = Object.fromEntries(Object.entries(base.tiles ?? {})
|
|
1160
|
-
.map(([componentId, tile]) => [componentId, this._baseTile(Number(componentId), tile)])
|
|
1161
|
-
.filter(([, tile]) => Object.keys(tile).length));
|
|
1162
|
-
const pruned = { ...base, groups };
|
|
1163
|
-
delete pruned.tiles;
|
|
1164
|
-
if (Object.keys(tiles).length) {
|
|
1165
|
-
pruned.tiles = tiles;
|
|
1166
|
-
}
|
|
1167
|
-
this._baseConfig.set(pruned);
|
|
1168
|
-
}
|
|
1169
|
-
// A base tile's state, kept to what its component can still take: a sort
|
|
1170
|
-
// on a column the list can still sort by that is not now its authored
|
|
1171
|
-
// first term, a search while the list shows the box, the hidden columns
|
|
1172
|
-
// the list still has, a drill path while the component is a chart.
|
|
1173
|
-
_baseTile(componentId, tile) {
|
|
1174
|
-
const kept = {};
|
|
1175
|
-
const list = this._lists.get(componentId);
|
|
1176
|
-
const hidden = list && tile.hidden ? listHiddenColumns(list.config, tile.hidden) : [];
|
|
1177
|
-
if (list && tile.sort && this._sortableColumns(list).includes(tile.sort.column)
|
|
1178
|
-
&& !sameSort(tile.sort, listSortTerms(list.config)[0] ?? null)) {
|
|
1179
|
-
kept.sort = tile.sort;
|
|
1180
|
-
}
|
|
1181
|
-
if (list && tile.search && this.listSearchable(list)) {
|
|
1182
|
-
kept.search = tile.search;
|
|
1183
|
-
}
|
|
1184
|
-
if (hidden.length) {
|
|
1185
|
-
kept.hidden = hidden;
|
|
1186
|
-
}
|
|
1187
|
-
if (tile.drill?.length && this._isChart(componentId)) {
|
|
1188
|
-
kept.drill = tile.drill;
|
|
1189
|
-
}
|
|
1190
|
-
return kept;
|
|
1191
964
|
}
|
|
1192
965
|
// A select's values to leave out (only when it keeps none) and a number
|
|
1193
966
|
// range's ends, an open end left out and 0 kept, written onto `fields`.
|
|
@@ -1243,4 +1016,4 @@ export class ReportFilterStateService {
|
|
|
1243
1016
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, decorators: [{
|
|
1244
1017
|
type: Injectable
|
|
1245
1018
|
}] });
|
|
1246
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQzdCLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEdBQ2pGLE1BQU0sV0FBVyxDQUFDO0FBbUJuQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxP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QUUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3RFLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3RCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDO1lBRXJELE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDL0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQzt3R0FyMENVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgZmlsdGVyIGFzIHJ4RmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgc2NhbiB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgZW5kT2ZXZWVrLCBzdGFydE9mTW9udGgsIHN0YXJ0T2ZRdWFydGVyLCBzdGFydE9mV2Vlaywgc3RhcnRPZlllYXIsXG4gIHN1YkRheXMsIHN1Yk1vbnRocywgc3ViV2Vla3MsXG59IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0gZnJvbSAnLi4vY29uc3RzL3JlcG9ydC13ZWVrLmNvbnN0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfRk9STUFUX0NPTlRFWFQsIGdldFpvbmVkTm93LCByZXNvbHZlRm9ybWF0Q29udGV4dCwgcmVzb2x2ZVJlcG9ydFRpbWV6b25lLFxufSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHsgUmVwb3J0Q2hhdFZpZXdlckZpbHRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWNoYXQtdmlld2VyLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RHJpbGxTdGVwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZHJpbGwtc3RlcC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyTWF0Y2ggfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRUZW1wb3JhcnlTdGF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXRlbXBvcmFyeS1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0VGlsZVN0YXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdGlsZS1zdGF0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld0NvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBGaWx0ZXJHcm91cERlZmF1bHQsXG4gIEZpbHRlckdyb3VwVmFsdWUsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0UmVsYXRpdmVSYW5nZSxcbiAgUmVwb3J0U29ydCxcbiAgUmVzb2x2ZWRGaWx0ZXJWYWx1ZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGxpc3RIaWRkZW5Db2x1bW5zLCBsaXN0U29ydFRlcm1zIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kU3RyaW5nLCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBncm91cFZhbHVlU2lnbmF0dXJlIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBpc1RpbGUgfSBmcm9tICcuLi9yZXBvcnQtdGlsZSc7XG5pbXBvcnQgeyBpc1JlbGF0aXZlUmFuZ2UgfSBmcm9tICcuLi9yZXBvcnQtdmlldy1jb25maWcnO1xuaW1wb3J0IHtcbiAgUkVQT1JUX1ZJRVdfQ09ORklHX1ZFUlNJT04sIGNsZWFuRHJpbGxQYXRoLCBncm91cFZhbHVlRnJvbVN0b3JlZCwgaXNDaGFydEdyYW51bGFyaXR5LFxuICBzYW1lRHJpbGxQYXRoLCB0b0xpdmVHcm91cFZhbHVlLCB0b1N0b3JlZEdyb3VwVmFsdWUsIHZpZXdEaWZmZXJzLFxufSBmcm9tICcuLi9yZXBvcnQtdmlldy1jb25maWcnO1xuaW1wb3J0IHsgZmluaXRlTnVtYmVyIH0gZnJvbSAnLi4vcmVwb3J0LXZpZXctY29uZmlnJztcbmltcG9ydCB7IHNhbWVTdG9yZWRHcm91cFZhbHVlIH0gZnJvbSAnLi4vcmVwb3J0LXZpZXctY29uZmlnJztcbmltcG9ydCB7IENvbXBvbmVudERhdGFTdGF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyB0aWxlRGF0YVN0YXRlIH0gZnJvbSAnLi4vdGlsZS1kYXRhLXN0YXRlJztcbmltcG9ydCB7IHJlcG9ydENvbXBvbmVudHMgfSBmcm9tICcuLi92YWx1ZXMnO1xuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBmaWx0ZXItZ3JvdXAgZGVmYXVsdHMgYXJlIHRoZSBzYW1lLiBDb21wYXJlZCBvbiB0aGUgZmllbGRzIGFcbi8vIGRlZmF1bHQgY2FuIGFjdHVhbGx5IGNhcnJ5LCBzbyBrZXkgb3JkZXIgaW4gdGhlIHBheWxvYWQgY2FuJ3QgcmVhZCBhcyBhIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRGVmYXVsdChcbiAgYTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbiAgYjogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICByZXR1cm4gYS5zdGFydCA9PT0gYi5zdGFydFxuICAgICYmIGEuZW5kID09PSBiLmVuZFxuICAgICYmIGEudmFsdWUgPT09IGIudmFsdWVcbiAgICAmJiBhLnJlbGF0aXZlID09PSBiLnJlbGF0aXZlXG4gICAgJiYgc2FtZUxpc3QoYS52YWx1ZXMsIGIudmFsdWVzKVxuICAgICYmIHNhbWVMaXN0KGEuZXhjbHVkZVZhbHVlcywgYi5leGNsdWRlVmFsdWVzKVxuICAgICYmIGEubWluID09PSBiLm1pblxuICAgICYmIGEubWF4ID09PSBiLm1heDtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBzdG9yZWQgbGlzdHMgaG9sZCB0aGUgc2FtZSB2YWx1ZXMgaW4gdGhlIHNhbWUgb3JkZXIuXG5mdW5jdGlvbiBzYW1lTGlzdChhOiB1bmtub3duW10gfCB1bmRlZmluZWQsIGI6IHVua25vd25bXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGEgPz8gW10pLmxlbmd0aCA9PT0gKGIgPz8gW10pLmxlbmd0aFxuICAgICYmIChhID8/IFtdKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gKGIgPz8gW10pW2luZGV4XSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gbGlzdCBzb3J0cyBvcmRlciB0aGUgcm93cyB0aGUgc2FtZSB3YXkuIE5vIGRpcmVjdGlvbiByZWFkcyBhc1xuLy8gYXNjZW5kaW5nLCB0aGUgd2F5IHRoZSBsaXN0IGFwcGxpZXMgaXQuXG5mdW5jdGlvbiBzYW1lU29ydChhOiBSZXBvcnRTb3J0LCBiOiBSZXBvcnRTb3J0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFiXG4gICAgJiYgYS5jb2x1bW4gPT09IGIuY29sdW1uXG4gICAgJiYgKGEuZGlyZWN0aW9uID8/ICdhc2MnKSA9PT0gKGIuZGlyZWN0aW9uID8/ICdhc2MnKTtcbn1cblxuXG4vLyBXaGV0aGVyIGEgdmFsdWUgcmVhZCBvZmYgYSBmaWx0ZXIgYmFyIGlzIHRoZSB2YWx1ZSBhbHJlYWR5IHN0b3JlZCBmb3IgaXRzXG4vLyBncm91cDogdGhlIHNhbWUgY2FsZW5kYXIgZGF5cywgdGhlIHNhbWUgc2VsZWN0IHZhbHVlcyBrZXB0IG9yIGxlZnQgb3V0IGluXG4vLyB0aGUgc2FtZSBvcmRlciwgdGhlIHNhbWUgdHJpbW1lZCB0ZXh0IGFuZCB0aGUgc2FtZSBudW1iZXIgcmFuZ2UgZW5kcy4gQVxuLy8gYmFyIHJlLXJlYWRzIGV2ZXJ5IGdyb3VwIGl0IHNob3dzIG9uIGFueSBjaGFuZ2UsIHNvIHRoaXMgaXMgd2hhdCB0ZWxscyB0aGVcbi8vIGdyb3VwIHRoYXQgY2hhbmdlZCBmcm9tIHRoZSBvbmVzIHRoYXQgZGlkIG5vdC5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRmlsdGVyVmFsdWUoXG4gIGE6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBiOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZ3JvdXBWYWx1ZVNpZ25hdHVyZShhKSA9PT0gZ3JvdXBWYWx1ZVNpZ25hdHVyZShiKTtcbn1cblxuXG4vLyBUaGUgZ3JvdXBzIGEgYmFyIHJlLXJlYWQgdGhhdCBpdCBub3cgc2hvd3Mgd2l0aCBhIHZhbHVlIG90aGVyIHRoYW4gdGhlIG9uZVxuLy8gaXQgbGFzdCByZXBvcnRlZCwgcmVjb3JkaW5nIGVhY2ggbmV3IHZhbHVlIGluIGBsYXN0UmVwb3J0ZWRgLiBBIGJhciBpc1xuLy8gY29tcGFyZWQgd2l0aCBpdHNlbGYsIG5ldmVyIHdpdGggdGhlIHN0b3JlZCB2YWx1ZTogYSBncm91cCBzaG93biBpbiB0d28gYmFyc1xuLy8gKGxldmVsICdib3RoJykgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIG90aGVyIG9uZSwgYW5kIHRoaXMgYmFyIGlzIG5vdFxuLy8gcmVwYWludGVkLCBzbyBpdHMgc3RhbGUgdmFsdWUgbXVzdCBub3QgYmUgc2V0IGJhY2sgd2hlbiB0aGUgdmlld2VyIGNoYW5nZXNcbi8vIGFub3RoZXIgb2YgaXRzIGl0ZW1zICh0aGUgbGlzdCBzZWFyY2ggYm94LCBzYXkpLlxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVkR3JvdXBWYWx1ZXMoXG4gIGxhc3RSZXBvcnRlZDogTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGw+LFxuICByZXBvcnRlZDogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10sXG4pOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSB7XG4gIHJldHVybiByZXBvcnRlZC5maWx0ZXIoKHsgZ3JvdXBJZCwgdmFsdWUgfSkgPT4ge1xuICAgIGlmIChzYW1lRmlsdGVyVmFsdWUobGFzdFJlcG9ydGVkLmdldChncm91cElkKSwgdmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGFzdFJlcG9ydGVkLnNldChncm91cElkLCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cblxuLy8gQSBsaXN0J3Mgc2VhcmNoIHRleHQgYXMgdGhlIHNlcnZlciBhcHBsaWVzIGl0OiB0cmltbWVkLCB0aGVuIGN1dCB0b1xuLy8gTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCBjaGFyYWN0ZXJzIChjb2RlIHBvaW50cywgYXMgdGhlIHNlcnZlciBjb3VudHMgdGhlbSkuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFsuLi50ZXh0LnRyaW0oKV0uc2xpY2UoMCwgTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCkuam9pbignJyk7XG59XG5cblxuLy8gV2hldGhlciB0d28gbGlzdHMgb2YgY29sdW1uIG5hbWVzIGFyZSB0aGUgc2FtZSBuYW1lcyBpbiB0aGUgc2FtZSBvcmRlci5cbmZ1bmN0aW9uIHNhbWVOYW1lcyhhOiByZWFkb25seSBzdHJpbmdbXSwgYjogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KChuYW1lLCBpbmRleCkgPT4gbmFtZSA9PT0gYltpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGhpZGRlbi1jb2x1bW4gbWFwcyBoaWRlIHRoZSBzYW1lIGNvbHVtbnMgb24gdGhlIHNhbWUgbGlzdHMuXG5mdW5jdGlvbiBzYW1lSGlkZGVuKFxuICBhOiBSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPixcbiAgYjogUmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuc2l6ZSA9PT0gYi5zaXplXG4gICAgJiYgWy4uLmFdLmV2ZXJ5KChbY29tcG9uZW50SWQsIG5hbWVzXSkgPT4gc2FtZU5hbWVzKG5hbWVzLCBiLmdldChjb21wb25lbnRJZCkgPz8gW10pKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBkYXRlLXJhbmdlIHZhbHVlcyBjb3ZlciB0aGUgc2FtZSBjYWxlbmRhciBkYXlzLlxuZnVuY3Rpb24gc2FtZURheXMoYTogRmlsdGVyR3JvdXBWYWx1ZSwgYjogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZGF0ZUJvdW5kU3RyaW5nKGEuc3RhcnQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5zdGFydClcbiAgICAmJiBkYXRlQm91bmRTdHJpbmcoYS5lbmQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5lbmQpO1xufVxuXG5cbi8vIEEgc3RhYmxlIHNpZ25hdHVyZSBmb3IgYSBncm91cCdzIHN0b3JlZCBkZWZhdWx0LiBUaGUgcmVwb3J0IHRvb2xiYXIga2V5cyBpdHNcbi8vIGZzLWZpbHRlciBvbiB0aGlzLCBiZWNhdXNlIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCDigJQgd2l0aG91dCBhXG4vLyBrZXkgY2hhbmdlIGl0IGtlZXBzIHJlbmRlcmluZyB0aGUgdmFsdWVzIGl0IHdhcyBjcmVhdGVkIHdpdGggZXZlbiBhZnRlciB0aGVcbi8vIGNvbmZpZyBiZWhpbmQgaXQgaGFzIGJlZW4gcmVidWlsdC5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U2lnbmF0dXJlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IHN0cmluZyB7XG4gIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcblxuICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5lbmQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnZhbHVlID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSA/PyAnJyxcbiAgICAoZ3JvdXBEZWZhdWx0LnZhbHVlcyA/PyBbXSkuam9pbignLCcpLFxuICAgIChncm91cERlZmF1bHQuZXhjbHVkZVZhbHVlcyA/PyBbXSkuam9pbignLCcpLFxuICAgIGdyb3VwRGVmYXVsdC5taW4gPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0Lm1heCA/PyAnJyxcbiAgXS5qb2luKCd+Jyk7XG59XG5cblxuLy8gVGhlIHRlbXBvcmFyeSBsYXllciB3aXRoIG5vdGhpbmcgcGlja2VkLlxuZnVuY3Rpb24gZW1wdHlUZW1wb3JhcnlTdGF0ZSgpOiBSZXBvcnRUZW1wb3JhcnlTdGF0ZSB7XG4gIHJldHVybiB7IGNyb3NzRmlsdGVyczogW10sIGRldGFpbDogbnVsbCB9O1xufVxuXG5cbi8vIFZpZXdlciBmaWx0ZXIgc3RhdGUgZm9yIHRoZSBvcGVuIHJlcG9ydC4gRmlsdGVyIFZBTFVFUyBhcmUgbmV2ZXIgc2F2ZWQgdG9cbi8vIHRoZSByZXBvcnQg4oCUIHRoaXMgc2VydmljZSBob2xkcyB0aGVtIHBlciBmaWx0ZXIgR1JPVVAgKHRoZSBwcm9wYWdhdGlvbiB1bml0KSxcbi8vIHJlc29sdmVzIHRoZW0gaW50byBwZXItY29tcG9uZW50IG1lbWJlci1maWx0ZXIgdmFsdWVzIGZvciBlYWNoIGRhdGEgcmVxdWVzdCxcbi8vIGFuZCBub3RpZmllcyB0aGUgY29tcG9uZW50cyB3aG9zZSBncm91cHMgY2hhbmdlZCBzbyBvbmx5IHRoZXkgcmVmZXRjaC5cbi8vXG4vLyBJdCBpcyB0aGUgb25lIHBsYWNlIHRoZSB2aWV3ZXIncyBzdGF0ZSBsaXZlcyB3aGlsZSB0aGUgcmVwb3J0IGlzIG9wZW46IHRoZVxuLy8gZ3JvdXAgdmFsdWVzLCB0aGUgZ3JvdXAtYnkgZ3JhaW4sIHRoZSBtYXRjaCwgbGlzdCBzb3J0cywgc2VhcmNoZXMgYW5kIGhpZGRlblxuLy8gY29sdW1ucywgdGhlIHBhZ2UgYW5kIGVhY2ggY2hhcnQncyBkcmlsbCBwYXRoLiBOb25lIG9mIGl0IGlzIGV2ZXIgd3JpdHRlbiB0b1xuLy8gdGhlIGJyb3dzZXIgVVJMLiBJdCBvdXRsaXZlcyBhIHBhZ2Ugc3dpdGNoICh0aGUgY2FudmFzIGNoYW5nZXMgdGhlIHBhZ2UsIG5vdFxuLy8gdGhpcyBzZXJ2aWNlKSBhbmQgZ29lcyB3aXRoIHRoZSByZXBvcnQgdmlldzogYSByZWxvYWQgc3RhcnRzIGEgbmV3IHNlcnZpY2UsXG4vLyB3aGljaCBvcGVucyBvbiB0aGUgcmVwb3J0J3MgZGVmYXVsdHMgb3IgdGhlIHZpZXdlcidzIGRlZmF1bHQgdmlldy5cbi8vIGNoYW5nZXMoKSBmaXJlcyBvbiBldmVyeSBjaGFuZ2Ugb2YgaXQuXG4vL1xuLy8gVGhlIGR1cmFibGUgcGFydCBpcyBvbmUgdmlldyBkb2N1bWVudDogc25hcHNob3QoKSB3cml0ZXMgaXQsIGFwcGx5KCkgb3BlbnNcbi8vIGEgdmlldywgYW5kIGJhc2UgYW5kIHZpZXdDaGFuZ2VkIHNheSB3aGV0aGVyIHRoZSBzY3JlZW4gc3RpbGwgc2hvd3MgdGhhdFxuLy8gdmlldy4gVGhlIHRlbXBvcmFyeSBsYXllciAoYSBjcm9zcy1maWx0ZXIsIGFuIG9wZW4gcm93cyBwYW5lbCkgaXMgaXRzIG93blxuLy8gc2VjdGlvbiwgc28gbm8gdmlldyBldmVyIGNhcnJpZXMgaXQuXG4vL1xuLy8gU2Vzc2lvbi1vbmx5LCBuZXZlciBpbiBhIHZpZXc6IHBlci1maWx0ZXIgZW5hYmxlL2Rpc2FibGUgdG9nZ2xlcyBmcm9tIGFcbi8vIGNvbXBvbmVudCdzIGZpbHRlciBtZW51ICh0aGUgYGVuYWJsZWRgIGNvbHVtbiBpcyB0aGUgYXV0aG9yZWQgZGVmYXVsdDsgYVxuLy8gdmlld2VyJ3MgdG9nZ2xlIHNob3VsZG4ndCB3cml0ZSB0byB0aGUgcmVwb3J0KS5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Uge1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGVmZmVjdGl2ZSB6b25lIChyZXNvbHZlUmVwb3J0VGltZXpvbmUpLiBSZWxhdGl2ZSBwcmVzZXRzXG4gIC8vIHJlc29sdmUgYWdhaW5zdCB0b2RheSBpbiBpdCwgYW5kIGRhdGUgY2VsbHMgcmVuZGVyIGluIGl0LlxuICBwdWJsaWMgcmVhZG9ubHkgdGltZXpvbmUgPSBzaWduYWw8c3RyaW5nPignVVRDJyk7XG5cbiAgLy8gSG93IHRoZSBvcGVuIHJlcG9ydCB3cml0ZXMgaXRzIG51bWJlcnMgYW5kIGRhdGVzIChyZXNvbHZlRm9ybWF0Q29udGV4dCk6XG4gIC8vIGl0cyBsb2NhbGUsIGl0cyBjdXJyZW5jeSBhbmQgd2hldGhlciBwZXJjZW50cyBhcnJpdmUgYXMgcmF0aW9zLiBFdmVyeSBLUEksXG4gIC8vIGNoYXJ0LCBkYXRlIGNlbGwgYW5kIGV4cG9ydCByZWFkcyBpdCBoZXJlLiBDb21wYXJlZCBieSB2YWx1ZSwgc28gYSByZWxvYWRcbiAgLy8gb2YgYW4gdW5jaGFuZ2VkIHJlcG9ydCByZS1yZW5kZXJzIG5vdGhpbmcuXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gc2lnbmFsPFJlcG9ydEZvcm1hdENvbnRleHQ+KERFRkFVTFRfRk9STUFUX0NPTlRFWFQsIHtcbiAgICBlcXVhbDogKGEsIGIpID0+IGEubG9jYWxlID09PSBiLmxvY2FsZVxuICAgICAgJiYgYS5jdXJyZW5jeSA9PT0gYi5jdXJyZW5jeVxuICAgICAgJiYgYS5yYXRpb1BlcmNlbnQgPT09IGIucmF0aW9QZXJjZW50LFxuICB9KTtcblxuICAvLyBUaGUgY29uZmlnIGNvbHVtbnMgYSB2aWV3ZXIgaGlkIG9uIGVhY2ggcGxhaW4gbGlzdCAobGlzdEhpZGRlbkNvbHVtbnMpLFxuICAvLyBieSBjb21wb25lbnQgaWQ7IGEgbGlzdCBzaG93aW5nIGV2ZXJ5IGNvbHVtbiBoYXMgbm8gZW50cnkuIEEgc2lnbmFsLCBzbyBhXG4gIC8vIGxpc3QgaGlkZXMgYW5kIHNob3dzIGl0cyBjb2x1bW5zIGluIHBsYWNlOiB0aGUgcm93cyBkbyBub3QgY2hhbmdlLCBzb1xuICAvLyBub3RoaW5nIHJlZmV0Y2hlcy4gQ29tcGFyZWQgYnkgdmFsdWUsIHNvIGEgcmVsb2FkIHRoYXQga2VlcHMgZXZlcnkgY29sdW1uXG4gIC8vIHJlcGFpbnRzIG5vdGhpbmcuXG4gIHB1YmxpYyByZWFkb25seSBsaXN0SGlkZGVuID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+PihuZXcgTWFwKCksIHtcbiAgICBlcXVhbDogc2FtZUhpZGRlbixcbiAgfSk7XG5cbiAgLy8gTW92ZXMgZWFjaCB0aW1lIGFwcGx5KCkgb3IgcmVzZXRUb0Jhc2UoKSByZXBsYWNlcyB0aGUgd2hvbGUgZHVyYWJsZVxuICAvLyBzdGF0ZS4gQmFycyBhbmQgdGlsZXMga2V5IG9uIGl0LCBzbyBhbiBhcHBsaWVkIHZpZXcgcmVwYWludHMgYWxsIG9mIHRoZW0uXG4gIHB1YmxpYyByZWFkb25seSBzdGF0ZVZlcnNpb24gPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9zdGF0ZVZlcnNpb24oKSk7XG5cbiAgLy8gTW92ZXMgZWFjaCB0aW1lIGFwcGx5KCkgb3BlbnMgYSB2aWV3IChvciB0aGUgcmVwb3J0J3MgZGVmYXVsdHMpLiBUaGVcbiAgLy8gY2FudmFzIGtleXMgaXRzIHRpbGVzIG9uIGl0LCBzbyBhbiBvcGVuZWQgdmlldyBkcmF3cyBlYWNoIG9uZSBhZ2Fpbi5cbiAgLy8gcmVzZXRUb0Jhc2UoKSBsZWF2ZXMgaXQ6IGEgcmVzZXQgcmVmZXRjaGVzIHRoZSB0aWxlcyBpbiBwbGFjZSwgc28gdGhlaXJcbiAgLy8gZGF0YSBzdGF5cyBvbiBzY3JlZW4gd2hpbGUgdGhleSByZWxvYWQuXG4gIHB1YmxpYyByZWFkb25seSBhcHBsaWVkVmVyc2lvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FwcGxpZWRWZXJzaW9uKCkpO1xuXG4gIC8vIEJ5IGxpc3QgY29tcG9uZW50IGlkLCBob3cgbWFueSByZXNldHMgbW92ZWQgdGhhdCBsaXN0J3Mgc29ydC4gRnNMaXN0XG4gIC8vIHJlYWRzIGl0cyBzb3J0IG9ubHkgd2hlbiBpdCBpcyBjcmVhdGVkLCBzbyBhIGxpc3Qgd2hvc2Ugc29ydCBhIHJlc2V0XG4gIC8vIG1vdmVkIGlzIGRyYXduIGFnYWluIChrZXllZCBvbiBpdHMgY291bnQpOyBldmVyeSBvdGhlciB0aWxlIHJlbG9hZHMgaW5cbiAgLy8gcGxhY2UuXG4gIHB1YmxpYyByZWFkb25seSBsaXN0U29ydFJlc2V0cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2xpc3RTb3J0UmVzZXRzKCkpO1xuXG4gIC8vIFRoZSBvcGVuIHBhZ2UsIG9yIG51bGwgYmVmb3JlIHRoZSBob3N0IHJlcG9ydHMgb25lIChzZXRQYWdlKS5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2UgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9wYWdlSWQoKSk7XG5cbiAgLy8gSG93IHRoZSBncm91cHMgY29tYmluZTogJ2FsbCcga2VlcHMgdGhlIHJvd3MgZXZlcnkgZ3JvdXAga2VlcHMsICdhbnknXG4gIC8vIHRoZSByb3dzIGF0IGxlYXN0IG9uZSBlbGlnaWJsZSBncm91cCBrZWVwcyAoc2V0TWF0Y2gpLlxuICBwdWJsaWMgcmVhZG9ubHkgbWF0Y2ggPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9tYXRjaCgpKTtcblxuICAvLyBUaGUgdmlld2VyIGZlYXR1cmVzIHRoZSBvcGVuIHJlcG9ydCdzIHNlcnZlciBzZXJ2ZXMgKFJlcG9ydC52aWV3ZXJGZWF0dXJlcyk6XG4gIC8vIGEgZmlsdGVyIGJhciBvZmZlcnMgYSBjb250cm9sIG9ubHkgd2hlbiBpdHMgZmVhdHVyZSBpcyBsaXN0ZWQuIEVtcHR5XG4gIC8vIGJlZm9yZSBhIHJlcG9ydCBpcyBvcGVuIGFuZCBmcm9tIGFuIG9sZGVyIHNlcnZlci5cbiAgcHVibGljIHJlYWRvbmx5IHZpZXdlckZlYXR1cmVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcmVwb3J0KCk/LnZpZXdlckZlYXR1cmVzID8/IFtdKTtcblxuICAvLyBUaGUgcmVwb3J0IGluaXQoKSBsYXN0IHJlYWQsIG9yIG51bGwgYmVmb3JlIG9uZSBpcyBvcGVuLiBBIHRpbGUgaGVhZGVyXG4gIC8vIGxpc3RzIGl0cyBzZWxlY3Qgb3B0aW9ucyBmcm9tIGl0IChSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSkuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9yZXBvcnQoKSk7XG5cbiAgLy8gVGhlIHN0YXRlIHRoZSBzY3JlZW4gaXMgY29tcGFyZWQgd2l0aDogdGhlIGJhc2UgYXBwbHkoKSB3YXMgZ2l2ZW4gKHRoZVxuICAvLyBvcGVuIHZpZXcgYXMgaXQgYXBwbGllZCksIG9yIHRoZSByZXBvcnQncyBhdXRob3JlZCBkZWZhdWx0c1xuICAvLyAoYXV0aG9yZWRDb25maWcoKSkgd2hlbiBubyB2aWV3IGlzIG9wZW4uIEl0IGhvbGRzIG9ubHkgdGhlIGdyb3VwcyB0aGVcbiAgLy8gdmlldyBoZWxkOyBldmVyeSBvdGhlciBncm91cCBmb2xsb3dzIGl0cyBhdXRob3JlZCBkZWZhdWx0LlxuICBwdWJsaWMgcmVhZG9ubHkgYmFzZSA9IGNvbXB1dGVkPFJlcG9ydFZpZXdDb25maWc+KCgpID0+IHtcbiAgICB0aGlzLl9yZXZpc2lvbigpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2Jhc2VDb25maWcoKSA/PyB0aGlzLmF1dGhvcmVkQ29uZmlnKCk7XG4gIH0pO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gYmFzZSAodmlld0RpZmZlcnMpOiB3aGF0IGEgdmlldyBwaWNrZXJcbiAgLy8gbWFya3MgJyhlZGl0ZWQpJy4gQSBzd2l0Y2ggb2YgcGFnZSBkb2VzIG5vdCBjb3VudCwgYW5kIHRoZSB0ZW1wb3JhcnlcbiAgLy8gc3RhdGUgbmV2ZXIgZG9lcy5cbiAgcHVibGljIHJlYWRvbmx5IHZpZXdDaGFuZ2VkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHRoaXMuX3JldmlzaW9uKCk7XG5cbiAgICByZXR1cm4gdmlld0RpZmZlcnModGhpcy5iYXNlKCksIHRoaXMuc25hcHNob3QoKSwgdGhpcy5hdXRob3JlZENvbmZpZygpKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfdmFsdWVzID0gbmV3IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWU+KCk7XG4gIHByaXZhdGUgX2dyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD4oKTtcbiAgcHJpdmF0ZSBfc2Vzc2lvbkRpc2FibGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLy8gR3JvdXBzIHRoYXQgaGF2ZSBhIGRlZmF1bHQgdGhlIHZpZXdlciBjbGVhcmVkLiBXaXRob3V0IHRoaXMgYSByZWxvYWQgb2YgdGhlXG4gIC8vIHJlcG9ydCAoYSBjaGF0IGVkaXQsIGEgZGlhbG9nKSB3b3VsZCBmaW5kIG5vIHZhbHVlIGZvciB0aGUgZ3JvdXAgYW5kIHNlZWRcbiAgLy8gaXRzIGRlZmF1bHQgc3RyYWlnaHQgYmFjay4gQSBjaGFuZ2UgdG8gdGhlIHN0b3JlZCBkZWZhdWx0IHJlbGVhc2VzIGl0LlxuICBwcml2YXRlIF9jbGVhcmVkID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGdyb3VwLWJ5IGNvbnRyb2w6IGEgc2luZ2xlIHJlcG9ydC13aWRlIGJ1Y2tldCBvdmVycmlkZSBmb3IgYWxsXG4gIC8vIHRpbWUtc2VyaWVzIGNoYXJ0cy4gVW5zZXQgPSBlYWNoIGNoYXJ0IHVzZXMgaXRzIGF1dGhvcmVkIGdyYW51bGFyaXR5LiBOZXZlclxuICAvLyBzYXZlZCB0byB0aGUgcmVwb3J0IChhIHNhdmVkIHZpZXcga2VlcHMgaXQpLCBhbmQgY2FycmllZCBpbiB0aGUgZGF0YSByZXF1ZXN0J3NcbiAgLy8gYHN0YXRlYCwgc28gaXQgcHJvcGFnYXRlcyB0aHJvdWdoIHRvIHRoZSBQREYvUG93ZXJQb2ludCBleHBvcnRzIHRvby4gTmFtZWRcbiAgLy8gZm9yIHRoZSBgZnJlcXVlbmN5YCB3aXJlIGtleSBpdCB0cmF2ZWxzIHVuZGVyLCBub3QgZm9yIHRoZSBjb250cm9sJ3MgbGFiZWwuXG4gIHByaXZhdGUgX2ZyZXF1ZW5jeTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9mcmVxdWVuY3lDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gRWFjaCBsaXN0J3Mgdmlld2VyLWNob3NlbiBzb3J0LCBieSBjb21wb25lbnQgaWQuIEhlbGQgaGVyZSByYXRoZXIgdGhhbiBvbmx5XG4gIC8vIGluIHRoZSBsaXN0J3MgRnNMaXN0IHNvIGl0IHN1cnZpdmVzIHRoZSBsaXN0IGJlaW5nIHJlY3JlYXRlZCAoYSBwYWdlIHN3aXRjaCxcbiAgLy8gYSByZWxvYWQgYWZ0ZXIgYW4gZWRpdCkgYW5kIHNvIGV2ZXJ5IGNvbnN1bWVyIG9mIHZpZXdlciBzdGF0ZSByZWFkcyBvbmUgcGxhY2UuXG4gIHByaXZhdGUgX2xpc3RTb3J0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRTb3J0PigpO1xuXG4gIC8vIEVhY2ggbGlzdCdzIHNlYXJjaCBib3ggdGV4dCAobGlzdFNlYXJjaFRleHQpLCBieSBjb21wb25lbnQgaWQuIEEgbGlzdCB3aXRoXG4gIC8vIGFuIGVtcHR5IGJveCBoYXMgbm8gZW50cnkuIEhlbGQgaGVyZSBmb3IgdGhlIHNhbWUgcmVhc29ucyBhcyB0aGUgc29ydHMsIGFuZFxuICAvLyBiZWNhdXNlIHRoZSBib3ggbGl2ZXMgaW4gdGhlIGNvbXBvbmVudCBoZWFkZXIsIG5vdCBpbiB0aGUgbGlzdC5cbiAgcHJpdmF0ZSBfbGlzdFNlYXJjaGVzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBsaXN0cywgYnkgY29tcG9uZW50IGlkLCBzbyBhIGZpbHRlciB0b2dnbGUgY2FuIHRlbGxcbiAgLy8gd2hpY2ggb2YgdGhlbSBsb3NlIHRoZWlyIHNlYXJjaCBib3ggKGxpc3RTZWFyY2hhYmxlKS5cbiAgcHJpdmF0ZSBfbGlzdHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0Q29tcG9uZW50PigpO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNlcnZlciBhbnN3ZXJzIGEgbGlzdCBzZWFyY2guIExpc3Qgc2VhcmNoIGFuZCBlZmZlY3RpdmVMb2NhbGVcbiAgLy8gc2hpcCBpbiB0aGUgc2FtZSBmcmFtZXdvcmsgY2hhbmdlIHNldCwgc28gYSBzZXJ2ZXIgdGhhdCBzZW5kcyBub1xuICAvLyBlZmZlY3RpdmVMb2NhbGUgaGFzIG5laXRoZXIsIGFuZCBpdHMgbGlzdHMgc2hvdyBubyBzZWFyY2ggYm94LlxuICBwcml2YXRlIF9zZXJ2ZXJTZWFyY2hlcyA9IGZhbHNlO1xuXG4gIC8vIEVtaXRzIHRoZSBpZCBvZiB0aGUgbGlzdCB3aG9zZSBzZWFyY2ggdGV4dCBjaGFuZ2VkLlxuICBwcml2YXRlIF9saXN0U2VhcmNoQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgLy8gRW1pdHMgdGhlIGdyb3VwIGlkIHRoYXQgY2hhbmdlZDsgY29tcG9uZW50cyBsaXN0ZW4gZmlsdGVyZWQgdG8gdGhlaXIgb3duXG4gIC8vIGdyb3VwIGlkcy4gbnVsbCA9IGV2ZXJ5dGhpbmcgY2hhbmdlZCAocmUtaW5pdCkuXG4gIHByaXZhdGUgX2NoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcblxuICAvLyBGaXJlcyB3aGVuZXZlciBhbnl0aGluZyBpbiB0aGUgdmlld2VyIHN0YXRlIG1heSBoYXZlIGNoYW5nZWQuXG4gIHByaXZhdGUgX3N0YXRlQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIENvdW50cyB0aGUgY2hhbmdlcyBjaGFuZ2VzKCkgcmVwb3J0cy4gVGhlIGdyb3VwIHZhbHVlcywgdGhlIGdyYWluIGFuZFxuICAvLyB0aGUgbGlzdCBzdGF0ZSB0aGF0IGJhc2UgYW5kIHZpZXdDaGFuZ2VkIGNvbXBhcmUgYXJlIHRoZSBwbGFpbiBmaWVsZHNcbiAgLy8gYWJvdmUsIHdoaWNoIGV2ZXJ5IHNldHRlciByZXBvcnRzIHRocm91Z2ggY2hhbmdlcygpICh0aGV5IGFyZSBzaGFyZWRcbiAgLy8gd2l0aCB0aGUgaW5saW5lIHZhbHVlcyBidWlsZCwgc28gdGhleSBzdGF5IGFzIHRoZXkgYXJlKTsgdGhpcyBjb3VudGVyIGlzXG4gIC8vIGhvdyB0aGUgdHdvIGNvbXB1dGVkcyBoZWFyIG9mIHRoZW0uIFRoZSB2aWV3IHN0YXRlIGJlbG93IGlzIHNpZ25hbHMgYW5kXG4gIC8vIGlzIHJlYWQgZGlyZWN0bHkuIFRoZSBzdWJqZWN0IGlzIHRoaXMgc2VydmljZSdzIG93biBhbmQgaXMgbmV2ZXJcbiAgLy8gY29tcGxldGVkLCBzbyB0aGUgc2lnbmFsIGxpc3RlbnMgdG8gaXQgZXhhY3RseSBhcyBsb25nIGFzIHRoZSBzZXJ2aWNlXG4gIC8vIGxpdmVzLlxuICBwcml2YXRlIF9yZXZpc2lvbiA9IHRvU2lnbmFsKHRoaXMuX3N0YXRlQ2hhbmdlZCQucGlwZShzY2FuKChjb3VudCkgPT4gY291bnQgKyAxLCAwKSksIHtcbiAgICBpbml0aWFsVmFsdWU6IDAsXG4gICAgbWFudWFsQ2xlYW51cDogdHJ1ZSxcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfc3RhdGVWZXJzaW9uID0gc2lnbmFsKDApO1xuXG4gIHByaXZhdGUgX2FwcGxpZWRWZXJzaW9uID0gc2lnbmFsKDApO1xuXG4gIHByaXZhdGUgX2xpc3RTb3J0UmVzZXRzID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgbnVtYmVyPj4obmV3IE1hcCgpKTtcblxuICAvLyBUaGUgcmVwb3J0IGluaXQoKSBsYXN0IHJlYWQ6IHRoZSB0aWxlcyBhbmQgcGFnZXMgYSB2aWV3J3Mgc3RhdGUgaXNcbiAgLy8gY2hlY2tlZCBhZ2FpbnN0LlxuICBwcml2YXRlIF9yZXBvcnQgPSBzaWduYWw8UmVwb3J0IHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIG9wZW4gcGFnZSwgc2V0IGJ5IHRoZSBob3N0IGFzIHRoZSB2aWV3ZXIgbW92ZXMgYmV0d2VlbiBwYWdlcy4gQSB2aWV3XG4gIC8vIHN0b3JlcyBpdCwgYnV0IG1vdmluZyB0byBhbm90aGVyIHBhZ2UgbmV2ZXIgZWRpdHMgYSB2aWV3LlxuICBwcml2YXRlIF9wYWdlSWQgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gSG93IHRoZSBncm91cHMgY29tYmluZTogJ2FsbCcgKHRoZSBkZWZhdWx0KSBvciAnYW55Jy5cbiAgcHJpdmF0ZSBfbWF0Y2ggPSBzaWduYWw8UmVwb3J0RmlsdGVyTWF0Y2g+KCdhbGwnKTtcblxuICAvLyBFYWNoIGNoYXJ0J3MgZHJpbGwgcGF0aCwgdG9wIGZpcnN0LCBieSBjb21wb25lbnQgaWQuIEEgY2hhcnQgYXQgaXRzIHRvcFxuICAvLyBoYXMgbm8gZW50cnksIGFuZCBvbmx5IGEgY2hhcnQgaGFzIG9uZS5cbiAgcHJpdmF0ZSBfZHJpbGxzID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10+PihuZXcgTWFwKCkpO1xuXG4gIC8vIEVtaXRzIHRoZSBpZCBvZiB0aGUgY2hhcnQgd2hvc2UgZHJpbGwgcGF0aCBjaGFuZ2VkLlxuICBwcml2YXRlIF9kcmlsbENoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSBiYXNlIGFzIGFwcGx5KCkgYXBwbGllZCBpdCwgb3IgbnVsbCB3aGVuIHRoZSBiYXNlIGlzIHRoZSBhdXRob3JlZFxuICAvLyBkZWZhdWx0cyAoc2VlIGJhc2UpLlxuICBwcml2YXRlIF9iYXNlQ29uZmlnID0gc2lnbmFsPFJlcG9ydFZpZXdDb25maWcgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgdGVtcG9yYXJ5IGxheWVyOiBrZXB0IGFwYXJ0IGZyb20gZXZlcnl0aGluZyBhYm92ZSwgc28gc25hcHNob3QoKVxuICAvLyBhbmQgdmlld0NoYW5nZWQgbmV2ZXIgcmVhZCBpdC5cbiAgcHJpdmF0ZSBfdGVtcG9yYXJ5ID0gc2lnbmFsPFJlcG9ydFRlbXBvcmFyeVN0YXRlPihlbXB0eVRlbXBvcmFyeVN0YXRlKCkpO1xuXG4gIC8vIFNlZWQgZ3JvdXBzICsgdGhlaXIgZGVmYXVsdHMgd2hlbiBhIHJlcG9ydCBsb2Fkcy4gRXhpc3Rpbmcgc2Vzc2lvbiB2YWx1ZXNcbiAgLy8gZm9yIHN0aWxsLWV4aXN0aW5nIGdyb3VwcyBzdXJ2aXZlIGEgc3RydWN0dXJlIHJlLWZldGNoIChhIGNoYXQgZWRpdFxuICAvLyBzaG91bGRuJ3QgcmVzZXQgdGhlIHZpZXdlcidzIGZpbHRlcnMpLCBhbmQgc28gZG9lcyBhIGdyb3VwIHRoZSB2aWV3ZXJcbiAgLy8gY2xlYXJlZCDigJQgVU5MRVNTIHRoZSBncm91cCdzIHN0b3JlZCBkZWZhdWx0IGl0c2VsZiBjaGFuZ2VkLCB3aGljaCBvbmx5XG4gIC8vIGhhcHBlbnMgd2hlbiBhbiBvcGVyYXRvciBzYXZlZCBhIG5ldyBkZWZhdWx0IGluIHJlcG9ydCBzZXR0aW5ncyBvciB0aGVcbiAgLy8gYWdlbnQgc2V0IG9uZS4gVGhhdCBpcyBhbiBleHBsaWNpdCBpbnN0cnVjdGlvbiB0byByZS1zZWVkLCBzbyBpdCB3aW5zIG92ZXJcbiAgLy8gdGhlIHN1cnZpdmluZyBzZXNzaW9uIHZhbHVlOyB3aXRob3V0IGl0IHRoZSBiYXIga2VlcHMgc2hvd2luZyB3aGF0ZXZlciBpdFxuICAvLyB3YXMgZmlyc3Qgc2VlZGVkIHdpdGggdW50aWwgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAvL1xuICAvLyBBIGNoYW5nZSBvZiB0aGUgcmVwb3J0J3Mgem9uZSBtb3ZlcyBcInRvZGF5XCIsIHNvIGEgdmFsdWUgc3RpbGwgY2FycnlpbmcgaXRzXG4gIC8vIGdyb3VwIGRlZmF1bHQncyBwcmVzZXQgbmFtZSBpcyByZXNvbHZlZCBhZ2FpbiBpbiB0aGUgbmV3IHpvbmUuIEEgdmFsdWUgdGhlXG4gIC8vIHZpZXdlciBwaWNrZWQsIG9yIG9uZSBjYXJyeWluZyBhbm90aGVyIHByZXNldCBuYW1lLCBpcyBrZXB0IGFzIGl0IGlzLlxuICBwdWJsaWMgaW5pdChyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzVGltZXpvbmUgPSB0aGlzLnRpbWV6b25lKCk7XG5cbiAgICAvLyBTZXQgZmlyc3Q6IHRoZSBkZWZhdWx0cyBzZWVkZWQgYmVsb3cgcmVzb2x2ZSB0aGVpciByZWxhdGl2ZSBwcmVzZXRzIGluIGl0LlxuICAgIHRoaXMudGltZXpvbmUuc2V0KHJlc29sdmVSZXBvcnRUaW1lem9uZShyZXBvcnQpKTtcbiAgICB0aGlzLmZvcm1hdENvbnRleHQuc2V0KHJlc29sdmVGb3JtYXRDb250ZXh0KHJlcG9ydCkpO1xuICAgIC8vIEJlZm9yZSB0aGUgcHJ1bmluZzogbGlzdFNlYXJjaGFibGUgcmVhZHMgaXQuXG4gICAgdGhpcy5fc2VydmVyU2VhcmNoZXMgPSByZXBvcnQuZWZmZWN0aXZlTG9jYWxlICE9PSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB0aW1lem9uZUNoYW5nZWQgPSBwcmV2aW91c1RpbWV6b25lICE9PSB0aGlzLnRpbWV6b25lKCk7XG4gICAgY29uc3QgcHJldmlvdXNHcm91cHMgPSB0aGlzLl9ncm91cHM7XG4gICAgdGhpcy5fZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKSB7XG4gICAgICB0aGlzLl9ncm91cHMuc2V0KGdyb3VwLmlkLCBncm91cCk7XG4gICAgICB0aGlzLl9zZWVkKGdyb3VwLCBwcmV2aW91c0dyb3Vwcy5nZXQoZ3JvdXAuaWQpID8/IG51bGwsIHRpbWV6b25lQ2hhbmdlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcblxuICAgIHRoaXMuX3BydW5lKHJlcG9ydCk7XG4gICAgdGhpcy5fcHJ1bmVWaWV3U3RhdGUocmVwb3J0LCBwcmV2aW91c0dyb3Vwcyk7XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIHZhbHVlKGdyb3VwSWQ6IG51bWJlcik6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpO1xuICB9XG5cbiAgLy8gQSBiYXIncyB2YWx1ZSBmb3IgYSBncm91cC4gQSBkYXRlIHJhbmdlIGtlZXBzIHRoZSBzdG9yZWQgcHJlc2V0IG5hbWUgb25seVxuICAvLyB3aGlsZSBpdHMgZGF5cyBhcmUgc3RpbGwgdGhlIHN0b3JlZCBkYXlzOiB0aGUgYmFycyByZS1zZXQgZXZlcnkgZ3JvdXAgdGhleVxuICAvLyBzaG93IHdoZW5ldmVyIGFueSBvbmUgb2YgdGhlbSBjaGFuZ2VzLCBhbmQgYW4gdW50b3VjaGVkIHJvbGxpbmcgcmFuZ2UgbXVzdFxuICAvLyBrZWVwIGl0cyBuYW1lIHJhdGhlciB0aGFuIHR1cm4gaW50byB0d28gZml4ZWQgZGF0ZXMuIEFueSBvdGhlciByYW5nZSwgYVxuICAvLyBkYXRlIHBpY2tlciBwcmVzZXQgaW5jbHVkZWQsIGlzIHN0b3JlZCBhcyB0aGUgZml4ZWQgZGF0ZXMgaXQgc2hvd3MuXG4gIHB1YmxpYyBzZXRWYWx1ZShncm91cElkOiBudW1iZXIsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcblxuICAgICAgaWYgKHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXBJZCk/LmNvbmZpZz8uZGVmYXVsdCkge1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmFkZChncm91cElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB0aGlzLl93aXRoUHJlc2V0KHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCksIHZhbHVlKSk7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgbmFtZSBhcyB0b2RheSdzIHJhbmdlIGluIHRoZSByZXBvcnQncyB6b25lLCBvciBudWxsIGZvclxuICAvLyBhIG5hbWUgaXQgZG9lcyBub3Qga25vdy4gQSB2aWV3J3Mgcm9sbGluZyByYW5nZSBpcyBvcGVuZWQgdGhyb3VnaCB0aGlzLlxuICBwdWJsaWMgcmVzb2x2ZVJlbGF0aXZlKG5hbWU6IHN0cmluZyk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbGF0aXZlUmFuZ2UobmFtZSk7XG4gIH1cblxuICAvLyBUaGUgYWN0aXZlIGdyb3VwLWJ5IGdyYWluLCBvciBudWxsIHdoZW4gdGhlIHZpZXdlciBoYXNuJ3QgY2hvc2VuIG9uZS5cbiAgcHVibGljIGZyZXF1ZW5jeSgpOiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGcmVxdWVuY3koZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTtcbiAgICB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5uZXh0KCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgZ3JvdXAtYnkgZ3JhaW4gY2hhbmdlcyDigJQgZXZlcnkgdGltZS1zZXJpZXMgY2hhcnQgbGlzdGVuc1xuICAvLyBzbyBpdCByZWZldGNoZXMgYW5kIHJlLWJ1Y2tldHMgKHRoZSBvdmVycmlkZSBpc24ndCBzY29wZWQgdG8gYW55IGZpbHRlclxuICAvLyBncm91cCwgc28gY2hhbmdlc0ZvcigpIGNhbid0IGNhcnJ5IGl0KS5cbiAgcHVibGljIGZyZXF1ZW5jeUNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gVGhlIHNvcnQgdGhlIHZpZXdlciBsYXN0IGZldGNoZWQgYSBsaXN0IHdpdGgsIG9yIG51bGwgd2hlbiBpdCBoYXNuJ3Qgc29ydGVkXG4gIC8vICh0aGUgbGlzdCB0aGVuIGZhbGxzIGJhY2sgdG8gaXRzIGF1dGhvcmVkIHNvcnQpLlxuICBwdWJsaWMgbGlzdFNvcnQoY29tcG9uZW50SWQ6IG51bWJlcik6IFJlcG9ydFNvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc29ydCB3aGVuIGl0IGlzIHRoZSB2aWV3ZXIncyBvd246IGEgc29ydCB0aGF0IGlzIHRoZVxuICAvLyBsaXN0J3MgYXV0aG9yZWQgZmlyc3QgdGVybSBpcyB0aGUgbGlzdCdzIGRlZmF1bHQsIG5vdCBhIGNob2ljZSwgc28gaXRcbiAgLy8gY2xlYXJzIHRoZSBlbnRyeSBpbnN0ZWFkICh0aGUgcnVsZSBzbmFwc2hvdCgpIGFwcGxpZXMpLiBPdGhlcndpc2UgYVxuICAvLyBsaXN0J3MgZmlyc3QgZmV0Y2ggd291bGQgcmVjb3JkIGl0cyBzZWVkZWQgYXV0aG9yZWQgdGVybSwgYW5kIGEgbGlzdCB0aGVcbiAgLy8gYWdlbnQgcmUtc29ydHMgbGF0ZXIgaW4gdGhlIHNlc3Npb24gd291bGQga2VlcCBzZW5kaW5nIHRoZSBvbGQgdGVybVxuICAvLyBmaXJzdC4gRGVsaWJlcmF0ZWx5IGVtaXRzIG5vIGNoYW5nZTogdGhlIGxpc3Qgc2V0cyB0aGlzIGZyb20gdGhlIGZldGNoXG4gIC8vIHRoYXQgYWxyZWFkeSByYW4gd2l0aCB0aGF0IHNvcnQsIHNvIGEgbm90aWZpY2F0aW9uIHdvdWxkIG9ubHkgbWFrZSBpdFxuICAvLyByZWZldGNoIHRoZSBzYW1lIHJvd3MuIE9ubHkgY2hhbmdlcygpIGhlYXJzIGFib3V0IGl0LlxuICBwdWJsaWMgc2V0TGlzdFNvcnQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNvcnQ6IFJlcG9ydFNvcnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHNvcnQgJiYgIXNhbWVTb3J0KHNvcnQsIGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCkpIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5zZXQoY29tcG9uZW50LmlkLCBzb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdFNvcnRzLmRlbGV0ZShjb21wb25lbnQuaWQpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIHRleHQgYSBsaXN0IGlzIHNlYXJjaGVkIGJ5LCBvciBudWxsIHdoZW4gaXRzIHNlYXJjaCBib3ggaXMgZW1wdHkuXG4gIHB1YmxpYyBsaXN0U2VhcmNoKGNvbXBvbmVudElkOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNlYXJjaGVzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFdoZXRoZXIgYSBsaXN0IHNob3dzIHRoZSBzZWFyY2ggYm94IG92ZXIgaXRzIHRleHQgY29sdW1uczogaXQgZG9lcyB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgYW5zd2VycyBhIGxpc3Qgc2VhcmNoIChzZWUgX3NlcnZlclNlYXJjaGVzKSwgdW5sZXNzIG9uZSBvZiBpdHMgbGl2ZVxuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gYSBrZXl3b3JkIGdyb3VwIGl0cyBoZWFkZXIgc2hvd3MuIEEgYmFyIHNob3dzIG9uZSBzZWFyY2hcbiAgLy8gYm94IChpdHMgbGFzdCBrZXl3b3JkIGl0ZW0pLCBhbmQgdGhhdCBvbmUgaXMgdGhlIGF1dGhvcidzLiBUaGUgaGVhZGVyLCBhblxuICAvLyBvcGVuZWQgdmlldywgdGhlIHBydW5pbmcsIHRoZSBkYXRhIHJlcXVlc3Qgc3RhdGUgYW5kIHRoZSBleHBvcnRzIGFsbCByZWFkXG4gIC8vIHRoaXMgb25lIHJ1bGUsIHNvIG5vIHNlYXJjaCBuYXJyb3dzIGEgbGlzdCB3aG9zZSBzY3JlZW4gaGFzIG5vIGJveCBzaG93aW5nXG4gIC8vIGl0LCBhbmQgbm8gZXhwb3J0IHRpdGxlcyBhIHNlYXJjaCB0aGUgc2VydmVyIGRpZCBub3QgYXBwbHkuXG4gIHB1YmxpYyBsaXN0U2VhcmNoYWJsZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJTZWFyY2hlc1xuICAgICAgJiYgY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgJiYgIShjb21wb25lbnQuZmlsdGVycyA/PyBbXSkuc29tZSgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlci5lbmFibGVkXG4gICAgICAgICAgJiYgIXRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKVxuICAgICAgICAgICYmIGdyb3VwPy50eXBlID09PSAna2V5d29yZCdcbiAgICAgICAgICAmJiAoZ3JvdXAubGV2ZWwgPT09ICdjb21wb25lbnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCcpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgbGlzdCdzIHNlYXJjaCBib3ggdGV4dCAobGlzdFNlYXJjaFRleHQpOyBhbiBlbXB0eSBib3ggY2xlYXJzXG4gIC8vIGl0LiBUaGUgaGVhZGVyIGNhbGxzIHRoaXMgb24gZXZlcnkgY2hhbmdlIG9mIGFueSBvZiBpdHMgaXRlbXMsIHNvIHRoZVxuICAvLyBsaXN0IGFuZCBjaGFuZ2VzKCkgaGVhciBhYm91dCBpdCBvbmx5IHdoZW4gdGhlIHN0b3JlZCB0ZXh0IGFjdHVhbGx5IGNoYW5nZWQuXG4gIHB1YmxpYyBzZXRMaXN0U2VhcmNoKGNvbXBvbmVudElkOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNlYXJjaCA9IGxpc3RTZWFyY2hUZXh0KHRleHQpO1xuXG4gICAgaWYgKHNlYXJjaCA9PT0gKHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50SWQpID8/ICcnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5zZXQoY29tcG9uZW50SWQsIHNlYXJjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTZWFyY2hDaGFuZ2VkJC5uZXh0KGNvbXBvbmVudElkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSBjb25maWcgY29sdW1uIG5hbWVzIGEgdmlld2VyIGhpZCBvbiBhIGxpc3Q7IG5vbmUgd2hlbiBpdCBzaG93cyB0aGVtIGFsbC5cbiAgcHVibGljIGhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQ6IG51bWJlcik6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5saXN0SGlkZGVuKCkuZ2V0KGNvbXBvbmVudElkKSA/PyBbXTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgdGhlIGNvbHVtbnMgYSB2aWV3ZXIgaGlkIG9uIGEgbGlzdCwga2VwdCB0byBsaXN0SGlkZGVuQ29sdW1uczpcbiAgLy8gbmFtZXMgdGhlIGxpc3QgY2Fubm90IGhpZGUgYXJlIGRyb3BwZWQsIGFuZCBub25lIChvciBldmVyeSBjb2x1bW4pIGNsZWFyc1xuICAvLyB0aGUgZW50cnkuIE9ubHkgY2hhbmdlcygpIGhlYXJzIGFib3V0IGl0LCBhbmQgb25seSBvbiBhIHJlYWwgY2hhbmdlLlxuICBwdWJsaWMgc2V0SGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyLCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBoaWRkZW4gPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgIGlmIChzYW1lTmFtZXMoaGlkZGVuLCB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMubGlzdEhpZGRlbigpKTtcblxuICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciBvbmUgbGlzdCdzIHNlYXJjaCB0ZXh0IGNoYW5nZXMsIHNvIHRoYXQgbGlzdCByZWZldGNoZXMuXG4gIHB1YmxpYyBsaXN0U2VhcmNoQ2hhbmdlcyhjb21wb25lbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTZWFyY2hDaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChpZCkgPT4gaWQgPT09IGNvbXBvbmVudElkKSxcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICApO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgdGhlIHZpZXdlciBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkOiBhIGdyb3VwIHZhbHVlLCB0aGVcbiAgLy8gZ3JhaW4sIHRoZSBtYXRjaCwgdGhlIHBhZ2UsIGEgbGlzdCBzb3J0LCBzZWFyY2ggb3IgaGlkZGVuIGNvbHVtbnMsIGFcbiAgLy8gZHJpbGwgcGF0aCwgYW4gYXBwbGllZCB2aWV3IG9yIGEgKHJlKWxvYWQgb2YgdGhlIHJlcG9ydC5cbiAgcHVibGljIGNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJEaXNhYmxlZChmaWx0ZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyLCBncm91cElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuYWRkKGZpbHRlcklkKTtcbiAgICB9XG5cbiAgICAvLyBUdXJuaW5nIGEga2V5d29yZCBmaWx0ZXIgYmFjayBvbiB0YWtlcyBpdHMgbGlzdCdzIHNlYXJjaCBib3ggYXdheSwgYW5kXG4gICAgLy8gdGhlIHNlYXJjaCB3aXRoIGl0LiBUaGUgbGlzdCByZWZldGNoZXMgb24gdGhlIGdyb3VwIGNoYW5nZSBiZWxvdy5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gTm90aWZpY2F0aW9ucyByZWxldmFudCB0byBPTkUgY29tcG9uZW50OiBhbnkgY2hhbmdlIHRvIGEgZ3JvdXAgb25lIG9mIGl0c1xuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gKG9yIGEgZnVsbCByZS1pbml0KS5cbiAgcHVibGljIGNoYW5nZXNGb3IoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cElkcyA9IG5ldyBTZXQoKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmZpbHRlckdyb3VwSWQpKTtcblxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKSA9PiBncm91cElkID09PSBudWxsIHx8IGdyb3VwSWRzLmhhcyhncm91cElkKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gTm90aWZpY2F0aW9ucyByZWxldmFudCB0byBBTlkgb2YgYSBzZXQgb2YgY29tcG9uZW50cyB0aGF0IGNvbWVzIGFuZCBnb2VzXG4gIC8vIChhIHBhZ2UncyB2YWx1ZXMpOiBhIGNoYW5nZSB0byBhIGdyb3VwIG9uZSBvZiB0aGVpciBmaWx0ZXJzIGJlbG9uZ3MgdG8uXG4gIC8vIFVubGlrZSBjaGFuZ2VzRm9yLCB0aGUgc2V0IGlzIHJlYWQgb24gZWFjaCBldmVudCByYXRoZXIgdGhhbiBjYXB0dXJlZCBhdFxuICAvLyBzdWJzY3JpYmUsIHNvIG9uZSBzdWJzY3JpcHRpb24gZm9sbG93cyB0aGUgc2V0IGFzIHRoZSByZXBvcnQgcmVsb2Fkcy4gQVxuICAvLyBmdWxsIHJlLWluaXQgKG51bGwpIGlzIG5vdCBwYXNzZWQgb246IGluaXQoKSBydW5zIG9uIGEgcmVwb3J0XG4gIC8vIChyZSlsb2FkLCBhbmQgYSBjYWxsZXIgb2YgdGhpcyBjaGVja3Mgb24gdGhhdCByZWxvYWQgaXRzZWxmIHdoZXRoZXIgdGhlXG4gIC8vIGZpbHRlciB2YWx1ZXMgaXRzIGNvbXBvbmVudHMgYXJlIHJlYWQgd2l0aCBtb3ZlZC5cbiAgcHVibGljIGNoYW5nZXNGb3JBbnkoY29tcG9uZW50czogKCkgPT4gUmVwb3J0Q29tcG9uZW50W10pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKTogZ3JvdXBJZCBpcyBudW1iZXIgPT4gZ3JvdXBJZCAhPT0gbnVsbFxuICAgICAgICAgICYmIGNvbXBvbmVudHMoKS5zb21lKChjb21wb25lbnQpID0+IChjb21wb25lbnQuZmlsdGVycyA/PyBbXSlcbiAgICAgICAgICAgIC5zb21lKChmaWx0ZXIpID0+IGZpbHRlci5maWx0ZXJHcm91cElkID09PSBncm91cElkKSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBncm91cCB2YWx1ZXMgcmVzb2x2ZWQgaW50byB0aGlzIGNvbXBvbmVudCdzIG1lbWJlci1maWx0ZXIgdmFsdWVzIOKAlFxuICAvLyB3aGF0IHRoZSBkYXRhIHJlcXVlc3QgY2Fycmllcy4gRGlzYWJsZWQgZmlsdGVycyAoYXV0aG9yZWQgb3Igc2Vzc2lvbikgYXJlXG4gIC8vIHNraXBwZWQgZW50aXJlbHkuXG4gIHB1YmxpYyByZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCByZXNvbHZlZDogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBjb21wb25lbnQuZmlsdGVycyA/PyBbXSkge1xuICAgICAgaWYgKCFmaWx0ZXIuZW5hYmxlZCB8fCB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlci5pZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB2YWx1ZSA/IHRoaXMuX3Jlc29sdmVkRmllbGRzKHZhbHVlKSA6IG51bGw7XG5cbiAgICAgIGlmIChmaWVsZHMpIHtcbiAgICAgICAgcmVzb2x2ZWQucHVzaCh7IGZpbHRlcklkOiBmaWx0ZXIuaWQsIC4uLmZpZWxkcyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cblxuICAvLyBXaGF0IHRoZSB2aWV3ZXIgaGFzIHNldCwgb25lIGVudHJ5IHBlciBmaWx0ZXIgZ3JvdXAsIGZvciB0aGUgcmVwb3J0IGNoYXQ6XG4gIC8vIHRoZSBhZ2VudCByZWFkcyBpdCB0byBrbm93IHdoYXQgaXMgb24gc2NyZWVuLiBHcm91cCBvcmRlciwgbm90IHRoZSBvcmRlclxuICAvLyB0aGUgdmFsdWVzIHdlcmUgc2V0IGluLCBzbyB0aGUgc2FtZSBzdGF0ZSBhbHdheXMgcmVhZHMgdGhlIHNhbWUuIEEgZ3JvdXBcbiAgLy8gd2l0aCBub3RoaW5nIGluIGl0IGlzIGxlZnQgb3V0LCBhbmQgYSBzYXZlZCBkZWZhdWx0IGNvdW50cyB1bnRpbCB0aGVcbiAgLy8gdmlld2VyIGNoYW5nZXMgaXQuIFBlci1maWx0ZXIgdG9nZ2xlcyBhcmUgYSBjb21wb25lbnQncyBvd24gYnVzaW5lc3MsIHNvXG4gIC8vIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIGl0LlxuICBwdWJsaWMgdmlld2VyRmlsdGVycygpOiBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fdmFsdWVzLmVudHJpZXMoKV1cbiAgICAgIC5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpXG4gICAgICAubWFwKChbZ3JvdXBJZCwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuX3Jlc29sdmVkRmllbGRzKHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gZmllbGRzID8geyBncm91cElkLCAuLi5maWVsZHMgfSA6IG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyID0+IGVudHJ5ICE9PSBudWxsKTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IHRpbGUncyByZXNvbHZlZCB2YWx1ZXMgaW4gb25lIGFycmF5IOKAlCB3aGF0IGEgcmVwb3J0LWxldmVsIGV4cG9ydFxuICAvLyBjYXJyaWVzIHNvIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIHRoZSBzY3JlZW4gaXMuXG4gIC8vIEZpbHRlciBpZHMgYXJlIHVuaXF1ZSBwZXIgY29tcG9uZW50LCBzbyB0aGUgYmFja2VuZCBwaWNrcyBlYWNoIGNvbXBvbmVudCdzXG4gIC8vIG93biBvdXQgb2YgdGhlIHBpbGUuIE9ubHkgYSB0aWxlIGJlY29tZXMgYSBmaWxlIChpc1RpbGUpLCBzbyBubyBvdGhlclxuICAvLyBjb21wb25lbnQncyBlbnRyaWVzIHJpZGUgYWxvbmcuIEEgcGFnZSBpZCBuYXJyb3dzIGl0IHRvIHRoYXQgcGFnZS5cbiAgcHVibGljIHJlc29sdmVGb3JSZXBvcnQocmVwb3J0OiBSZXBvcnQsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHBhZ2VzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKTtcblxuICAgIHJldHVybiBwYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IChwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gaXNUaWxlKGNvbXBvbmVudCkpXG4gICAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpKSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UGFnZShwYWdlSWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocGFnZUlkID09PSB0aGlzLl9wYWdlSWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3BhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEEgY2hhbmdlIG9mIG1hdGNoIGNhbiBjaGFuZ2UgZXZlcnkgdGlsZSBhIGdyb3VwIHdpdGggYSB2YWx1ZSBuYXJyb3dzLCBzb1xuICAvLyBldmVyeSB0aWxlIGhlYXJzIGFib3V0IGl0LlxuICBwdWJsaWMgc2V0TWF0Y2gobWF0Y2g6IFJlcG9ydEZpbHRlck1hdGNoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dDogUmVwb3J0RmlsdGVyTWF0Y2ggPSBtYXRjaCA9PT0gJ2FueScgPyAnYW55JyA6ICdhbGwnO1xuICAgIGlmIChuZXh0ID09PSB0aGlzLl9tYXRjaCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbWF0Y2guc2V0KG5leHQpO1xuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBBIGNoYXJ0J3MgZHJpbGwgcGF0aCwgdG9wIGZpcnN0OyBlbXB0eSB3aGlsZSB0aGUgY2hhcnQgaXMgYXQgaXRzIHRvcC5cbiAgLy8gSXQgcmVhZHMgYSBzaWduYWwsIHNvIGEgdGVtcGxhdGUgdGhhdCBzaG93cyBpdCByZXBhaW50cyB3aGVuIGl0IG1vdmVzLlxuICBwdWJsaWMgZHJpbGwoY29tcG9uZW50SWQ6IG51bWJlcik6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZHJpbGxzKCkuZ2V0KGNvbXBvbmVudElkKSA/PyBbXTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBjaGFydCdzIGRyaWxsIHBhdGgsIGtlcHQgdG8gY2xlYW5EcmlsbFBhdGg7IGFuIGVtcHR5IHBhdGggaXNcbiAgLy8gdGhlIGNoYXJ0J3MgdG9wLiBPbmx5IGEgY2hhcnQgb2YgdGhlIG9wZW4gcmVwb3J0IGRyaWxsczogYSBwYXRoIGZvciBhbnlcbiAgLy8gb3RoZXIgY29tcG9uZW50IGlzIGlnbm9yZWQuIE9ubHkgdGhhdCBjaGFydCBhbmQgY2hhbmdlcygpIGhlYXIgYWJvdXQgaXQsXG4gIC8vIGFuZCBvbmx5IG9uIGEgcmVhbCBjaGFuZ2UuXG4gIHB1YmxpYyBzZXREcmlsbChjb21wb25lbnRJZDogbnVtYmVyLCBwYXRoOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSk6IHZvaWQge1xuICAgIGNvbnN0IGtlcHQgPSBjbGVhbkRyaWxsUGF0aChwYXRoKTtcbiAgICBpZiAoIXRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpIHx8IHNhbWVEcmlsbFBhdGgoa2VwdCwgdGhpcy5kcmlsbChjb21wb25lbnRJZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0RHJpbGxQYXRoKGNvbXBvbmVudElkLCBrZXB0KTtcbiAgICB0aGlzLl9kcmlsbENoYW5nZWQkLm5leHQoY29tcG9uZW50SWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgb25lIGNoYXJ0J3MgZHJpbGwgcGF0aCBjaGFuZ2VzLCBzbyB0aGF0IGNoYXJ0IHJlZmV0Y2hlcy5cbiAgcHVibGljIGRyaWxsQ2hhbmdlcyhjb21wb25lbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RyaWxsQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoaWQpID0+IGlkID09PSBjb21wb25lbnRJZCksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRha2VzIHRoZSBkcmlsbCBwYXRoIGEgY2hhcnQncyBhbnN3ZXIgYXBwbGllZCBhcyB0aGUgY2hhcnQncyBvd246IHRoZVxuICAvLyBzZXJ2ZXIga2VlcHMgdGhlIGxvbmdlc3QgcGFydCBvZiBhIHNlbnQgcGF0aCBpdCBjYW4gYXBwbHksIHNvIGEgbGF0ZXJcbiAgLy8gc2F2ZSBob2xkcyB0aGF0IHBhcnQgb25seS4gVGhlIGNoYXJ0IGhhcyBqdXN0IHJlYWQgdGhhdCBwYXRoLCBzbyBvbmx5XG4gIC8vIGNoYW5nZXMoKSBoZWFycyBhYm91dCBpdC4gVHJ1ZSB3aGVuIHRoZSBwYXRoIGNoYW5nZWQuXG4gIHB1YmxpYyBhZG9wdERyaWxsKGNvbXBvbmVudElkOiBudW1iZXIsIHBhdGg6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2VwdCA9IGNsZWFuRHJpbGxQYXRoKHBhdGgpO1xuICAgIGlmICghdGhpcy5faXNDaGFydChjb21wb25lbnRJZCkgfHwgc2FtZURyaWxsUGF0aChrZXB0LCB0aGlzLmRyaWxsKGNvbXBvbmVudElkKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXREcmlsbFBhdGgoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBUaGUgZHVyYWJsZSBzdGF0ZSBvbiBzY3JlZW4gYXMgb25lIHZpZXcgZG9jdW1lbnQ6IHRoZSBwYWdlLCBldmVyeSBncm91cFxuICAvLyB0aGUgcmVwb3J0IGhhcyAobnVsbCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcsIGEgY2xlYXJlZCBkZWZhdWx0IGluY2x1ZGVkKSxcbiAgLy8gdGhlIG1hdGNoLCB0aGUgZ3JhaW4sIGFuZCBlYWNoIHRpbGUncyBzb3J0LCBzZWFyY2gsIGhpZGRlbiBjb2x1bW5zIGFuZFxuICAvLyBkcmlsbCBwYXRoIHdoZXJlIHRoZXkgZGlmZmVyIGZyb20gdGhlIGF1dGhvcmVkIHRpbGUuIEEgZGF0ZSByYW5nZSB0aGF0XG4gIC8vIHN0aWxsIGNhcnJpZXMgaXRzIHJlbGF0aXZlIHByZXNldCBpcyB3cml0dGVuIGFzIHRoYXQgcHJlc2V0LCB3aGF0ZXZlclxuICAvLyB0b2RheSBpcyAodG9TdG9yZWRHcm91cFZhbHVlKS4gVGhlIHRlbXBvcmFyeSBsYXllciBpcyBuZXZlciBwYXJ0IG9mIGl0LlxuICBwdWJsaWMgc25hcHNob3QoKTogUmVwb3J0Vmlld0NvbmZpZyB7XG4gICAgY29uc3QgY29uZmlnOiBSZXBvcnRWaWV3Q29uZmlnID0geyB2OiBSRVBPUlRfVklFV19DT05GSUdfVkVSU0lPTiB9O1xuXG4gICAgaWYgKHRoaXMuX3BhZ2VJZCgpKSB7XG4gICAgICBjb25maWcucGFnZUlkID0gdGhpcy5fcGFnZUlkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZyZXF1ZW5jeSkge1xuICAgICAgY29uZmlnLmdyb3VwQnkgPSB0aGlzLl9mcmVxdWVuY3k7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX21hdGNoKCkgPT09ICdhbnknKSB7XG4gICAgICBjb25maWcubWF0Y2ggPSAnYW55JztcbiAgICB9XG5cbiAgICBjb25maWcuZ3JvdXBzID0gdGhpcy5fc25hcHNob3RHcm91cHMoKTtcblxuICAgIGNvbnN0IHRpbGVzID0gdGhpcy5fc25hcHNob3RUaWxlcygpO1xuICAgIGlmIChPYmplY3Qua2V5cyh0aWxlcykubGVuZ3RoKSB7XG4gICAgICBjb25maWcudGlsZXMgPSB0aWxlcztcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzIGFzIGEgdmlldyBkb2N1bWVudDogZXZlcnkgZ3JvdXAgYXQgaXRzXG4gIC8vIGF1dGhvcmVkIGRlZmF1bHQgKG51bGwgd2hlbiBpdCBoYXMgbm9uZSksIG5vIG1hdGNoLCBncmFpbiBvciB0aWxlIHN0YXRlLlxuICBwdWJsaWMgYXV0aG9yZWRDb25maWcoKTogUmVwb3J0Vmlld0NvbmZpZyB7XG4gICAgY29uc3QgZ3JvdXBzOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsPiA9IHt9O1xuXG4gICAgdGhpcy5fZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICBncm91cHNbZ3JvdXAuaWRdID0gdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgdjogUkVQT1JUX1ZJRVdfQ09ORklHX1ZFUlNJT04sIGdyb3VwcyB9O1xuICB9XG5cbiAgLy8gUmVwbGFjZXMgdGhlIGR1cmFibGUgc3RhdGUgd2l0aCBhIHZpZXcncyAoYGNvbmZpZ2A7IG51bGwgPSB0aGUgcmVwb3J0J3NcbiAgLy8gYXV0aG9yZWQgZGVmYXVsdHMpLCB3aGljaCBiZWNvbWVzIHRoZSBiYXNlOiB3aGF0IHRoZSBzY3JlZW4gaXMgY29tcGFyZWRcbiAgLy8gd2l0aCBmb3IgJyhlZGl0ZWQpJyBhbmQgd2hhdCByZXNldFRvQmFzZSgpIHJldHVybnMgdG8uIEEgZ3JvdXAgdGhlIHZpZXdcbiAgLy8gZG9lcyBub3QgaG9sZCBvcGVucyBhdCBpdHMgYXV0aG9yZWQgZGVmYXVsdDsgb25lIHRoZSByZXBvcnQgZG9lcyBub3RcbiAgLy8gaGF2ZSwgb3Igd2hvc2UgdmFsdWUgZG9lcyBub3QgZml0IHRoZSBncm91cCdzIHR5cGUsIGlzIHNraXBwZWQuIFRoZVxuICAvLyB2aWV3J3MgcGFnZSBvcGVucywgdW5sZXNzIGBwYWdlSWRgIG5hbWVzIGEgcGFnZSBvZiB0aGUgcmVwb3J0IChhID9wYWdlPVxuICAvLyB0aGUgcmVwb3J0IG9wZW5lZCB3aXRoIGJlYXRzIGl0cyBkZWZhdWx0IHZpZXcncyBwYWdlKS4gVGhlIHRlbXBvcmFyeVxuICAvLyBsYXllciBpcyBrZXB0LiBFdmVyeSBjaGFuZ2UgaXMgYW5ub3VuY2VkIG9uY2UsIGF0IHRoZSBlbmQuXG4gIHB1YmxpYyBhcHBseShjb25maWc6IFJlcG9ydFZpZXdDb25maWcgfCBudWxsLCBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZnJlcXVlbmN5O1xuXG4gICAgdGhpcy5fc2V0QmFzZShjb25maWcpO1xuICAgIHRoaXMuX2FwcGx5UGFnZShjb25maWc/LnBhZ2VJZCk7XG4gICAgdGhpcy5fYXBwbHlQYWdlKHBhZ2VJZCk7XG5cbiAgICB0aGlzLl9hcHBsaWVkVmVyc2lvbi51cGRhdGUoKHZlcnNpb24pID0+IHZlcnNpb24gKyAxKTtcbiAgICB0aGlzLl9ub3RpZnlBcHBsaWVkKGZyZXF1ZW5jeSk7XG4gIH1cblxuICAvLyBQdXRzIHRoZSBzY3JlZW4gYmFjayBvbiBpdHMgYmFzZSAodGhlIG9wZW4gdmlldywgZWxzZSB0aGUgYXV0aG9yZWRcbiAgLy8gZGVmYXVsdHMpIG9uIHRoZSBwYWdlIGl0IGlzIG9uLCBhbmQgY2xlYXJzIHRoZSB0ZW1wb3JhcnkgbGF5ZXIuIFRoZVxuICAvLyB0aWxlcyBzdGF5IGFuZCByZWxvYWQgaW4gcGxhY2UgKGFwcGxpZWRWZXJzaW9uIGRvZXMgbm90IG1vdmUpLCBleGNlcHQgYVxuICAvLyBsaXN0IHdob3NlIHNvcnQgdGhpcyBtb3ZlZCAobGlzdFNvcnRSZXNldHMpLlxuICBwdWJsaWMgcmVzZXRUb0Jhc2UoKTogdm9pZCB7XG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZnJlcXVlbmN5O1xuICAgIGNvbnN0IHNvcnRzID0gbmV3IE1hcCh0aGlzLl9saXN0U29ydHMpO1xuXG4gICAgdGhpcy5fdGVtcG9yYXJ5LnNldChlbXB0eVRlbXBvcmFyeVN0YXRlKCkpO1xuICAgIHRoaXMuX2FwcGx5TGF5ZXIodGhpcy5fYmFzZUNvbmZpZygpKTtcbiAgICB0aGlzLl9jb3VudFNvcnRSZXNldHMoc29ydHMpO1xuICAgIHRoaXMuX25vdGlmeUFwcGxpZWQoZnJlcXVlbmN5KTtcbiAgfVxuXG4gIC8vIFRoZSBzY3JlZW4gYXMgaXQgaXMgYmVjb21lcyB0aGUgYmFzZSwgd2l0aCBub3RoaW5nIGFwcGxpZWQ6IHdoYXQgYSB2aWV3XG4gIC8vIGp1c3Qgc2F2ZWQgZnJvbSB0aGUgc2NyZWVuIGhvbGRzLiBUaGUgcGFnZSBvbiBzY3JlZW4gaXMgdGhlIGJhc2Uncy5cbiAgcHVibGljIHNldEJhc2VUb1NjcmVlbigpOiB2b2lkIHtcbiAgICB0aGlzLl9iYXNlQ29uZmlnLnNldCh0aGlzLnNuYXBzaG90KCkpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzIGJlY29tZSB0aGUgYmFzZSBhZ2FpbiAodGhlIG9wZW4gdmlldyB3YXNcbiAgLy8gZGVsZXRlZCk7IHRoZSBzY3JlZW4gc3RheXMgYXMgaXQgaXMuXG4gIHB1YmxpYyBjbGVhckJhc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fYmFzZUNvbmZpZy5zZXQobnVsbCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBQdXRzIG9ubHkgYGdyb3VwSWRzYCBiYWNrIG9uIHRoZSBiYXNlOiB0aGUgb3BlbiB2aWV3J3MgdmFsdWUgZm9yIGEgZ3JvdXBcbiAgLy8gaXQgaG9sZHMsIGVsc2UgdGhlIGdyb3VwJ3MgYXV0aG9yZWQgZGVmYXVsdC4gQSB0aWxlIGhlYWRlcidzICdDbGVhclxuICAvLyBmaWx0ZXJzJyBvd25zIG9ubHkgaXRzIG93biBncm91cHM7IHRoZSByZXBvcnQgYmFyJ3MgY2FsbHMgcmVzZXRUb0Jhc2UoKS5cbiAgLy8gRWFjaCBncm91cCBpcyBhbm5vdW5jZWQgYXMgYSB2aWV3ZXIncyBjaGFuZ2UgdG8gaXQgaXMsIHNvIHRoZSB0aWxlcyBpblxuICAvLyBpdCByZWZldGNoIGFuZCBhIGJhciBzaG93aW5nIGl0IHdpdGggYW5vdGhlciB2YWx1ZSBpcyBidWlsdCBhZ2Fpbi5cbiAgcHVibGljIHJlc2V0R3JvdXBzVG9CYXNlKGdyb3VwSWRzOiByZWFkb25seSBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IGhlbGQgPSB0aGlzLl9iYXNlQ29uZmlnKCk/Lmdyb3VwcyA/PyB7fTtcblxuICAgIGdyb3VwSWRzLmZvckVhY2goKGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoZWxkLCBncm91cElkKSB8fCAhdGhpcy5fYXBwbHlHcm91cChncm91cCwgaGVsZFtncm91cElkXSkpIHtcbiAgICAgICAgdGhpcy5fc2VlZEF1dGhvcmVkKGdyb3VwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gV2hldGhlciBvbmUgb2YgYGdyb3VwSWRzYCBzaG93cyBhIHZhbHVlIG90aGVyIHRoYW4gaXRzIGJhc2U6IHRoZSBvcGVuXG4gIC8vIHZpZXcncyB2YWx1ZSBmb3IgYSBncm91cCBpdCBob2xkcywgZWxzZSB0aGUgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0LFxuICAvLyB0aGUgdmFsdWUgcmVzZXRHcm91cHNUb0Jhc2UoKSBwdXRzIGJhY2sgYW5kIHZpZXdDaGFuZ2VkIGNvbXBhcmVzLiBBIHRpbGVcbiAgLy8gaGVhZGVyJ3MgQ2xlYXIgY2hpcCBzaG93cyBleGFjdGx5IHdoaWxlIG9uZSBvZiBpdHMgb3duIGdyb3VwcyBkb2VzLiBJdFxuICAvLyByZWFkcyB0aGUgcmV2aXNpb24gdmlld0NoYW5nZWQgcmVhZHMsIHNvIGEgY2FsbGVyIG9uIGVhY2ggY2hlY2sgb2YgYW5cbiAgLy8gT25QdXNoIHZpZXcgc3RheXMgY3VycmVudC5cbiAgcHVibGljIGdyb3Vwc0RpZmZlckZyb21CYXNlKGdyb3VwSWRzOiByZWFkb25seSBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3JldmlzaW9uKCk7XG4gICAgY29uc3QgaGVsZCA9IHRoaXMuX2Jhc2VDb25maWcoKT8uZ3JvdXBzID8/IHt9O1xuXG4gICAgcmV0dXJuIGdyb3VwSWRzLnNvbWUoKGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhlbGQsIGdyb3VwSWQpXG4gICAgICAgID8gaGVsZFtncm91cElkXVxuICAgICAgICA6IHRvU3RvcmVkR3JvdXBWYWx1ZShncm91cC50eXBlLCB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApKTtcbiAgICAgIGNvbnN0IHNjcmVlbiA9IHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwSWQpID8gbnVsbCA6IHRvU3RvcmVkR3JvdXBWYWx1ZShncm91cC50eXBlLCB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpKTtcblxuICAgICAgcmV0dXJuICFzYW1lU3RvcmVkR3JvdXBWYWx1ZShiYXNlLCBzY3JlZW4pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGludGVyYWN0aW9uIHN0YXRlIGEgdGlsZSdzIGRhdGEgcmVxdWVzdCBjYXJyaWVzIG5vdzogdGlsZURhdGFTdGF0ZVxuICAvLyBvdmVyIHRoZSBvcGVuIHJlcG9ydCBhbmQgdGhlIHNjcmVlbidzIHNuYXBzaG90KCkuXG4gIHB1YmxpYyB0aWxlU3RhdGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBDb21wb25lbnREYXRhU3RhdGUge1xuICAgIHJldHVybiB0aWxlRGF0YVN0YXRlKHRoaXMuX3JlcG9ydCgpLCBjb21wb25lbnQsIHRoaXMuc25hcHNob3QoKSk7XG4gIH1cblxuICAvLyBUaGUgcmVsYXRpdmUgcmFuZ2UgYSBncm91cCdzIHZhbHVlIHN0aWxsIGlzLCBhcyBhIGRhdGEgcmVxdWVzdCBuYW1lcyBpdFxuICAvLyAoaXRzIHByZXNldCB3aGlsZSBpdHMgZGF5cyBhcmUgdGhhdCByYW5nZSByZXNvbHZlZCB0b2RheSksIG9yIG51bGwuIFRoZVxuICAvLyBleHBvcnQgd29yZGluZyBuYW1lcyBhIGxpdmUgcHJlc2V0IGJ5IGl0LlxuICBwdWJsaWMgbGl2ZVByZXNldChncm91cElkOiBudW1iZXIpOiBSZXBvcnRSZWxhdGl2ZVJhbmdlIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpO1xuXG4gICAgcmV0dXJuIHZhbHVlID8gdGhpcy5fbGl2ZVByZXNldCh2YWx1ZSkgOiBudWxsO1xuICB9XG5cbiAgLy8gQSBncm91cCB2YWx1ZSBhcyB0aGUgZmllbGRzIGEgcmVxdWVzdCBjYXJyaWVzOiBkYXRlIGJvdW5kcyBhcyBjYWxlbmRhclxuICAvLyBkYXlzLCBzZWxlY3QgdmFsdWVzIHdoZW4gYW55IGFyZSBwaWNrZWQgKGVsc2UgdGhlIHZhbHVlcyBsZWZ0IG91dCksXG4gIC8vIGtleXdvcmQgdGV4dCB0cmltbWVkLCBhIG51bWJlciByYW5nZSdzIGVuZHMuIE51bGwgd2hlbiBhbGwgb2YgdGhlbSBhcmVcbiAgLy8gZW1wdHkuIEEgZGF0ZSByYW5nZSBhbHNvIG5hbWVzIHRoZSByZWxhdGl2ZSByYW5nZSBpdCBzdGlsbCBpc1xuICAvLyAoX2xpdmVQcmVzZXQpLCBzbyB0aGUgc2VydmVyIGtub3dzIHdoaWNoIHBlcmlvZCB0aGUgZGF5cyBjb3ZlcjtcbiAgLy8gdGhlIGRheXMgc3RheSB0aGUgd2luZG93IGVpdGhlciB3YXkuIENvbXBvbmVudCBkYXRhLCB0aGUgcmVwb3J0IGFuZCBwYWdlXG4gIC8vIGV4cG9ydHMgYW5kIHRoZSBjaGF0J3Mgdmlld2VyIGZpbHRlcnMgYWxsIHJlYWQgdGhlaXIgZmllbGRzIGhlcmUsIHNvIGFsbFxuICAvLyB0aHJlZSBjYXJyeSBpdC5cbiAgcHJpdmF0ZSBfcmVzb2x2ZWRGaWVsZHModmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+IHwgbnVsbCB7XG4gICAgY29uc3QgZmllbGRzOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+ID0ge307XG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5fbGl2ZVByZXNldCh2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgIGZpZWxkcy5zdGFydCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgIGZpZWxkcy5lbmQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKTtcbiAgICB9XG4gICAgaWYgKHByZXNldCkge1xuICAgICAgZmllbGRzLnByZXNldCA9IHByZXNldDtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICBmaWVsZHMudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgZmllbGRzLnZhbHVlID0gdmFsdWUudmFsdWUudHJpbSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc29sdmVFeGNsdWRlQW5kUmFuZ2UodmFsdWUsIGZpZWxkcyk7XG5cbiAgICByZXR1cm4gZmllbGRzLnN0YXJ0IHx8IGZpZWxkcy5lbmQgfHwgZmllbGRzLnZhbHVlcyB8fCBmaWVsZHMudmFsdWVcbiAgICAgIHx8IGZpZWxkcy5leGNsdWRlVmFsdWVzIHx8IGZpZWxkcy5taW4gIT09IHVuZGVmaW5lZCB8fCBmaWVsZHMubWF4ICE9PSB1bmRlZmluZWRcbiAgICAgID8gZmllbGRzXG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvLyBUaGUgcmVsYXRpdmUgcmFuZ2UgYSBkYXRlIHZhbHVlIHN0aWxsIGlzOiB0aGUgcHJlc2V0IG5hbWUgaXQgY2FycmllcyxcbiAgLy8gd2hpbGUgaXRzIGRheXMgYXJlIHRoYXQgcmFuZ2UgcmVzb2x2ZWQgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUuIEFcbiAgLy8gdmFsdWUgd2hvc2UgZGF5cyB0aGUgdmlld2VyIGNoYW5nZWQsIG9yIG9uZSBzZWVkZWQgYmVmb3JlIG1pZG5pZ2h0IHRoYXRcbiAgLy8gaXMgbm93IGEgZGF5IGJlaGluZCwgbmFtZXMgbm9uZSwgYW5kIHRoZSBzZXJ2ZXIgcmVhZHMgaXRzIGRheXMgYWxvbmUuXG4gIHByaXZhdGUgX2xpdmVQcmVzZXQodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBSZXBvcnRSZWxhdGl2ZVJhbmdlIHwgbnVsbCB7XG4gICAgaWYgKCF2YWx1ZS5wcmVzZXQgfHwgIWlzUmVsYXRpdmVSYW5nZSh2YWx1ZS5wcmVzZXQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByYW5nZSA9IHRoaXMuX3JlbGF0aXZlUmFuZ2UodmFsdWUucHJlc2V0KTtcblxuICAgIHJldHVybiByYW5nZSAmJiBzYW1lRGF5cyh2YWx1ZSwgcmFuZ2UpID8gdmFsdWUucHJlc2V0IDogbnVsbDtcbiAgfVxuXG4gIC8vIFNlZWRzIG9uZSBncm91cCBvbiAocmUpbG9hZDsgc2VlIGluaXQoKS4gYHByZXZpb3VzYCBpcyB0aGUgZ3JvdXAgYXMgdGhlXG4gIC8vIGxhc3QgbG9hZCBoYWQgaXQsIG9yIG51bGwgd2hlbiBpdCBpcyBuZXcuXG4gIHByaXZhdGUgX3NlZWQoXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHByZXZpb3VzOiBSZXBvcnRGaWx0ZXJHcm91cCB8IG51bGwsXG4gICAgdGltZXpvbmVDaGFuZ2VkOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0Q2hhbmdlZCA9ICFzYW1lRGVmYXVsdChwcmV2aW91cz8uY29uZmlnPy5kZWZhdWx0ID8/IG51bGwsIGdyb3VwLmNvbmZpZz8uZGVmYXVsdCA/PyBudWxsKTtcblxuICAgIGlmIChkZWZhdWx0Q2hhbmdlZCkge1xuICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpO1xuICAgIGNvbnN0IHByZXNldFRvUmVzb2x2ZSA9IHRpbWV6b25lQ2hhbmdlZFxuICAgICAgJiYgISF2YWx1ZT8ucHJlc2V0XG4gICAgICAmJiB2YWx1ZS5wcmVzZXQgPT09IGdyb3VwLmNvbmZpZz8uZGVmYXVsdD8ucmVsYXRpdmU7XG5cbiAgICBpZiAodmFsdWUgJiYgIWRlZmF1bHRDaGFuZ2VkICYmICFwcmVzZXRUb1Jlc29sdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApO1xuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cC5pZCwgZGVmYXVsdFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICAvLyBUaGUgZGVmYXVsdCB3YXMgY2xlYXJlZCwgc28gdGhlIHZhbHVlIGl0IHNlZWRlZCBnb2VzIHdpdGggaXQuXG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBEcm9wcyB0aGUgc2VhcmNoIG9mIGV2ZXJ5IGxpc3QgdGhhdCBubyBsb25nZXIgc2hvd3MgYSBzZWFyY2ggYm94OiBvbmVcbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciBvbmUgd2hvc2UgaGVhZGVyIG5vdyBoYXMgYSBrZXl3b3JkIGdyb3VwLlxuICBwcml2YXRlIF9kcm9wVW5zZWFyY2hhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5mb3JFYWNoKChzZWFyY2gsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5saXN0U2VhcmNoYWJsZShjb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRHJvcHMgc3RhdGUga2VwdCBmb3IgZ3JvdXBzLCBsaXN0cyBhbmQgZmlsdGVycyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMuXG4gIC8vIEEgbGlzdCBzb3J0IGFsc28gZ29lcyB3aGVuIGl0cyBjb2x1bW4gZG9lczogdGhlIGFnZW50IGNhbiByZW1vdmUgb3IgcmVuYW1lXG4gIC8vIGl0LCBhbmQgdGhlIHJlY3JlYXRlZCBsaXN0IHdvdWxkIHNlbmQgYSBjb2x1bW4gdGhlIHF1ZXJ5IGRvZXMgbm90IGtub3cuXG4gIC8vIEEgbGlzdCBzZWFyY2ggZ29lcyB3aXRoIGl0cyBsaXN0IChvciB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm8gbG9uZ2VyIGFcbiAgLy8gbGlzdCksIGFuZCB3aGVuIHRoZSBsaXN0IGdhaW5zIGEga2V5d29yZCBncm91cCBhbmQgc28gbG9zZXMgaXRzIGJveC5cbiAgLy8gSGlkZGVuIGNvbHVtbnMga2VlcCBvbmx5IHRoZSBuYW1lcyB0aGVpciBsaXN0IHN0aWxsIGhhcyBhcyBjb2x1bW5zICh0aGVcbiAgLy8gYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWUgb25lLCBvciB0dXJuIHRoZSBsaXN0IGludG8gYSBjcm9zcy10YWIpLCBhbmQgZ29cbiAgLy8gd2hlbiB3aGF0IGlzIGxlZnQgd291bGQgaGlkZSBldmVyeSBjb2x1bW4uXG4gIHByaXZhdGUgX3BydW5lKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBncm91cElkIG9mIFsuLi50aGlzLl92YWx1ZXMua2V5cygpLCAuLi50aGlzLl9jbGVhcmVkXSkge1xuICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTb3J0cy5mb3JFYWNoKChzb3J0LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFZhbHVlcyBpbmNsdWRlZDogb25lIGlzIG5ldmVyIGRyYXduLCBidXQgaXRzIGZpbHRlcnMgYXJlIHRoZSByZXBvcnQnc1xuICAgIC8vIGxpa2UgYW55IG90aGVyIGNvbXBvbmVudCdzLCBhbmQgc28gYXJlIHRoZWlyIHNlc3Npb24gdG9nZ2xlcy5cbiAgICBjb25zdCBmaWx0ZXJJZHMgPSBuZXcgU2V0KHJlcG9ydENvbXBvbmVudHMocmVwb3J0KVxuICAgICAgLmZsYXRNYXAoKGNvbXBvbmVudCkgPT4gKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmlkKSkpO1xuXG4gICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmZvckVhY2goKGZpbHRlcklkKSA9PiB7XG4gICAgICBpZiAoIWZpbHRlcklkcy5oYXMoZmlsdGVySWQpKSB7XG4gICAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fZHJvcFVuc2VhcmNoYWJsZSgpO1xuXG4gICAgY29uc3QgaGlkZGVuID0gbmV3IE1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPigpO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuKCkuZm9yRWFjaCgobmFtZXMsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBrZXB0ID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBuYW1lcyk7XG5cbiAgICAgIGlmIChrZXB0Lmxlbmd0aCkge1xuICAgICAgICBoaWRkZW4uc2V0KGNvbXBvbmVudElkLCBrZXB0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQoaGlkZGVuKTtcbiAgfVxuXG4gIC8vIFRoZSB2YWx1ZSBhIGJhciBzZXRzLCBrZWVwaW5nIHRoZSBzdG9yZWQgcHJlc2V0IG5hbWUgd2hpbGUgdGhlIGRheXMgYXJlXG4gIC8vIHN0aWxsIHRoZSBzdG9yZWQgZGF5cyAoc2VlIHNldFZhbHVlKS5cbiAgcHJpdmF0ZSBfd2l0aFByZXNldChzdG9yZWQ6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogRmlsdGVyR3JvdXBWYWx1ZSB7XG4gICAgY29uc3QgZml4ZWQ6IEZpbHRlckdyb3VwVmFsdWUgPSB7IC4uLnZhbHVlIH07XG4gICAgZGVsZXRlIGZpeGVkLnByZXNldDtcblxuICAgIHJldHVybiBzdG9yZWQ/LnByZXNldCAmJiBzYW1lRGF5cyhzdG9yZWQsIGZpeGVkKVxuICAgICAgPyB7IC4uLmZpeGVkLCBwcmVzZXQ6IHN0b3JlZC5wcmVzZXQgfVxuICAgICAgOiBmaXhlZDtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RDb21wb25lbnRzKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIHJldHVybiByZXBvcnRDb21wb25lbnRzKHJlcG9ydClcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0Jyk7XG4gIH1cblxuICAvLyBUaGUgY29sdW1ucyBhIGxpc3QgY2FuIGJlIHNvcnRlZCBieTogZXZlcnkgYXV0aG9yZWQgY29sdW1uLCBvciBhXG4gIC8vIGNyb3NzLXRhYidzIHJvdyBjb2x1bW4gb25seSAoaXRzIHBpdm90IGNvbHVtbnMgY29tZSBhbmQgZ28gd2l0aCB0aGUgZGF0YSkuXG4gIHByaXZhdGUgX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnO1xuXG4gICAgaWYgKGNvbmZpZz8ucGl2b3RCeT8uY29sdW1uKSB7XG4gICAgICByZXR1cm4gY29uZmlnLnJvd0J5Py5jb2x1bW4gPyBbY29uZmlnLnJvd0J5LmNvbHVtbl0gOiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNvbmZpZz8uY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+IGNvbHVtbi5jb2x1bW4pO1xuICB9XG5cbiAgLy8gQSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIG1hcHBlZCB0byBhIHNlc3Npb24gdmFsdWUgYnkgdHlwZS4gUmVsYXRpdmVcbiAgLy8gZGF0ZSBwcmVzZXRzIHJlc29sdmUgYWdhaW5zdCBcIm5vd1wiIGVhY2ggdGltZSB0aGUgcmVwb3J0IG9wZW5zLCBzbyBhIHNhdmVkXG4gIC8vIFwibGFzdCAxMiBtb250aHNcIiBzdGF5cyByZWxhdGl2ZSBhbmQgY2FycmllcyBpdHMgcHJlc2V0IG5hbWU7IGEgZml4ZWRcbiAgLy8gcmFuZ2UsIHNlbGVjdCB2YWx1ZXMgYW5kIGtleXdvcmQgdGV4dCBzZWVkIHZlcmJhdGltLlxuICBwcml2YXRlIF9kZWZhdWx0VmFsdWUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICAgIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcbiAgICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSkge1xuICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yZWxhdGl2ZVJhbmdlKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSk7XG5cbiAgICAgIHJldHVybiByYW5nZSA/IHsgc3RhcnQ6IHJhbmdlLnN0YXJ0LCBlbmQ6IHJhbmdlLmVuZCwgcHJlc2V0OiBncm91cERlZmF1bHQucmVsYXRpdmUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5zdGFydCB8fCBncm91cERlZmF1bHQuZW5kKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/IG51bGwsXG4gICAgICAgIGVuZDogZ3JvdXBEZWZhdWx0LmVuZCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZXM6IGdyb3VwRGVmYXVsdC52YWx1ZXMgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogZ3JvdXBEZWZhdWx0LnZhbHVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVPclJhbmdlRGVmYXVsdChncm91cERlZmF1bHQpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgYXMgYSBjYWxlbmRhci1kYXkgcmFuZ2UuIFwiVG9kYXlcIiBpcyB0aGUgZGF5IGluIHRoZVxuICAvLyByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgbm90IHRoZSBicm93c2VyJ3MsIHNvIGV2ZXJ5IHZpZXdlciBzZWVkcyB0aGUgc2FtZVxuICAvLyByYW5nZS4gVGhlIHNlcnZlciB0d2luIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtIChmcmFtZXdvcmsvUmVwb3J0L0VudW0pLFxuICAvLyBhbmQgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW1UZXN0IHBpbnMgdGhlIHRhYmxlIGJvdGggc2lkZXMgbXVzdCBwcm9kdWNlLlxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IGdldFpvbmVkTm93KHRoaXMudGltZXpvbmUoKSk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIE1vbmRheSB0byBTdW5kYXkgKFJFUE9SVF9XRUVLX1NUQVJUU19PTiwgdGhlIHNhbWUgd2Vla1xuICAgICAgLy8gdGhlIHNlcnZlcidzIHdlZWtseSBidWNrZXRzIHVzZSksIGluIHdob2xlIGRheXMg4oCUIG5vdCB0aGUgcm9sbGluZ1xuICAgICAgLy8gc2V2ZW4gZGF5cyBgbGFzdDdEYXlzYCBnaXZlcywgd2hpY2ggbmV2ZXIgbGluZXMgdXAgd2l0aCB0aGUgd2VlayBhXG4gICAgICAvLyBwYXJ0bmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gYGxhc3RXZWVrYCBpcyB0aGUgb25lIGEgd2Vla2x5IHJlcG9ydFxuICAgICAgLy8gd2FudHM6IGl0IGVuZHMgb24gdGhlIHByZXZpb3VzIHdlZWsncyBTdW5kYXkgcmF0aGVyIHRoYW4gYXQgYG5vd2AsXG4gICAgICAvLyBiZWNhdXNlIHRoZSB3ZWVrIGl0IG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlclxuICAgICAgLy8gcHJlc2V0IGhlcmUgYW5kIHJ1bnMgdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkXG4gICAgICAvLyB3ZWVrIChvbiBhIFN1bmRheSBpdCBpcyB0aGUgd2hvbGUgTW9uZGF5LXRvLVN1bmRheSB3ZWVrKS5cbiAgICAgIGNhc2UgJ3RoaXNXZWVrJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3RXZWVrJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN1YldlZWtzKG5vdywgMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0N0RheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDcpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDMwRGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgMzApLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDNNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0Nk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCA2KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QxMk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAxMiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzTW9udGgnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZk1vbnRoKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzUXVhcnRlcic6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mUXVhcnRlcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1llYXInOlxuICAgICAgY2FzZSAneWVhclRvRGF0ZSc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mWWVhcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgZ3JvdXAgaW4gaXRzIHN0b3JlZCBzaGFwZTogbnVsbCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcsIGEgZGVmYXVsdFxuICAvLyB0aGUgdmlld2VyIGNsZWFyZWQgaW5jbHVkZWQuXG4gIHByaXZhdGUgX3NuYXBzaG90R3JvdXBzKCk6IFJlY29yZDxudW1iZXIsIEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cHM6IFJlY29yZDxudW1iZXIsIEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGw+ID0ge307XG5cbiAgICB0aGlzLl9ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGdyb3Vwc1tncm91cC5pZF0gPSB0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZClcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICAvLyBFYWNoIHRpbGUncyBzdGF0ZSB3aGVyZSBpdCBkaWZmZXJzIGZyb20gdGhlIGF1dGhvcmVkIHRpbGUuIEEgbGlzdCBzb3J0XG4gIC8vIHRoYXQgaXMgdGhlIGxpc3QncyBhdXRob3JlZCBmaXJzdCB0ZXJtIGlzIGl0cyBkZWZhdWx0LCBub3QgYSBjaG9pY2UuXG4gIHByaXZhdGUgX3NuYXBzaG90VGlsZXMoKTogUmVjb3JkPG51bWJlciwgUmVwb3J0VGlsZVN0YXRlPiB7XG4gICAgY29uc3QgdGlsZXM6IFJlY29yZDxudW1iZXIsIFJlcG9ydFRpbGVTdGF0ZT4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuX3RpbGVzKCkpIHtcbiAgICAgIGNvbnN0IHRpbGU6IFJlcG9ydFRpbGVTdGF0ZSA9IHt9O1xuICAgICAgY29uc3Qgc29ydCA9IHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IGhpZGRlbiA9IHRoaXMuaGlkZGVuQ29sdW1ucyhjb21wb25lbnQuaWQpO1xuICAgICAgY29uc3QgZHJpbGwgPSB0aGlzLmRyaWxsKGNvbXBvbmVudC5pZCk7XG5cbiAgICAgIGlmIChzb3J0ICYmICFzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGNvbXBvbmVudC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICAgIHRpbGUuc29ydCA9IHsgLi4uc29ydCB9O1xuICAgICAgfVxuICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICB0aWxlLnNlYXJjaCA9IHNlYXJjaDtcbiAgICAgIH1cbiAgICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuaGlkZGVuID0gWy4uLmhpZGRlbl07XG4gICAgICB9XG4gICAgICBpZiAoZHJpbGwubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuZHJpbGwgPSBkcmlsbC5tYXAoKHN0ZXApID0+ICh7IC4uLnN0ZXAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmtleXModGlsZSkubGVuZ3RoKSB7XG4gICAgICAgIHRpbGVzW2NvbXBvbmVudC5pZF0gPSB0aWxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aWxlcztcbiAgfVxuXG4gIC8vIFRoZSB2aWV3IGFwcGx5KCkgd2FzIGdpdmVuLCBhcHBsaWVkIGFzIHRoZSBzY3JlZW4ncyBzdGF0ZSBhbmQga2VwdCBhc1xuICAvLyB0aGUgYmFzZS4gV2hhdCBpcyBrZXB0IGlzIHRoZSBzbmFwc2hvdCBvZiBpdCwgd2l0aCBvbmx5IHRoZSBncm91cHMgaXRcbiAgLy8gaGVsZDogYSBncm91cCBpdCBkaWQgbm90IGhvbGQsIG9yIGhlbGQgaW4gYSBzaGFwZSB0aGF0IGRvZXMgbm90IGZpdCxcbiAgLy8gZm9sbG93cyBpdHMgYXV0aG9yZWQgZGVmYXVsdCAodmlld0RpZmZlcnMgY29tcGFyZXMgaXQgd2l0aFxuICAvLyBhdXRob3JlZENvbmZpZygpKS5cbiAgcHJpdmF0ZSBfc2V0QmFzZShiYXNlOiBSZXBvcnRWaWV3Q29uZmlnIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IGhlbGQgPSB0aGlzLl9hcHBseUxheWVyKGJhc2UpO1xuXG4gICAgaWYgKCFiYXNlKSB7XG4gICAgICB0aGlzLl9iYXNlQ29uZmlnLnNldChudWxsKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBwYWdlIGlzIHRoZSBiYXNlJ3Mgb3duLCBub3QgdGhlIG9uZSBvbiBzY3JlZW4uXG4gICAgY29uc3QgYXBwbGllZCA9IHRoaXMuc25hcHNob3QoKTtcbiAgICBkZWxldGUgYXBwbGllZC5wYWdlSWQ7XG4gICAgYXBwbGllZC5ncm91cHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXBwbGllZC5ncm91cHMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbZ3JvdXBJZF0pID0+IGhlbGQuaGFzKE51bWJlcihncm91cElkKSkpKTtcblxuICAgIGlmIChiYXNlLnBhZ2VJZCAmJiAodGhpcy5fcmVwb3J0KCk/LnBhZ2VzID8/IFtdKS5zb21lKChwYWdlKSA9PiBwYWdlLmlkID09PSBiYXNlLnBhZ2VJZCkpIHtcbiAgICAgIGFwcGxpZWQucGFnZUlkID0gYmFzZS5wYWdlSWQ7XG4gICAgfVxuXG4gICAgdGhpcy5fYmFzZUNvbmZpZy5zZXQoYXBwbGllZCk7XG4gIH1cblxuICAvLyBBcHBsaWVzIGEgdmlldydzIHN0YXRlIGluIHBsYWNlIG9mIHRoZSB3aG9sZSBkdXJhYmxlIHN0YXRlLCBhbmQgZ2l2ZXMgdGhlXG4gIC8vIGlkcyBvZiB0aGUgZ3JvdXBzIGl0IHNldDogd2hhdCBgY29uZmlnYCBkb2VzIG5vdCBob2xkIGdvZXMgYmFjayB0byB0aGVcbiAgLy8gYXV0aG9yZWQgcmVwb3J0LiBOb3RoaW5nIGlzIGFubm91bmNlZCBoZXJlOiB0aGUgY2FsbGVyIGFubm91bmNlcyBvbmNlXG4gIC8vIChfbm90aWZ5QXBwbGllZCkuXG4gIHByaXZhdGUgX2FwcGx5TGF5ZXIoY29uZmlnOiBSZXBvcnRWaWV3Q29uZmlnIHwgbnVsbCk6IFNldDxudW1iZXI+IHtcbiAgICBjb25zdCBoZWxkID0gdGhpcy5fYXBwbHlHcm91cHMoY29uZmlnPy5ncm91cHMgPz8ge30pO1xuXG4gICAgdGhpcy5fbWF0Y2guc2V0KGNvbmZpZz8ubWF0Y2ggPT09ICdhbnknID8gJ2FueScgOiAnYWxsJyk7XG5cbiAgICBjb25zdCBncm91cEJ5ID0gY29uZmlnPy5ncm91cEJ5O1xuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IGlzQ2hhcnRHcmFudWxhcml0eShncm91cEJ5KSA/IGdyb3VwQnkgOiBudWxsO1xuXG4gICAgdGhpcy5fY2xlYXJUaWxlcygpO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoY29uZmlnPy50aWxlcyA/PyB7fSlcbiAgICAgIC5mb3JFYWNoKChbY29tcG9uZW50SWQsIHRpbGVdKSA9PiB0aGlzLl9hcHBseVRpbGUoTnVtYmVyKGNvbXBvbmVudElkKSwgdGlsZSA/PyB7fSkpO1xuXG4gICAgcmV0dXJuIGhlbGQ7XG4gIH1cblxuICAvLyBFYWNoIGdyb3VwJ3MgdmFsdWUgZnJvbSBhIHZpZXc7IGEgZ3JvdXAgaXQgZG9lcyBub3Qgc2V0IGdvZXMgYmFjayB0byBpdHNcbiAgLy8gYXV0aG9yZWQgZGVmYXVsdC5cbiAgcHJpdmF0ZSBfYXBwbHlHcm91cHMoZ3JvdXBzOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsPik6IFNldDxudW1iZXI+IHtcbiAgICBjb25zdCBoZWxkID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICB0aGlzLl9ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZ3JvdXBzLCBncm91cC5pZCkgJiYgdGhpcy5fYXBwbHlHcm91cChncm91cCwgZ3JvdXBzW2dyb3VwLmlkXSkpIHtcbiAgICAgICAgaGVsZC5hZGQoZ3JvdXAuaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VlZEF1dGhvcmVkKGdyb3VwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBoZWxkO1xuICB9XG5cbiAgLy8gT25lIGdyb3VwJ3Mgc3RvcmVkIHZhbHVlLCBvciBmYWxzZSB3aGVuIHRoZSBncm91cCdzIHR5cGUgY2Fubm90IGhvbGQgaXRcbiAgLy8gKGl0IGlzIHRoZW4gZHJvcHBlZCB3aG9sZSwgYW5kIHRoZSBjYWxsZXIgc2VlZHMgdGhlIGdyb3VwJ3MgYXV0aG9yZWRcbiAgLy8gZGVmYXVsdCkuIG51bGwsIG9yIGEgdmFsdWUgdGhhdCBob2xkcyBub3RoaW5nLCBjbGVhcnMgdGhlIGdyb3VwLlxuICBwcml2YXRlIF9hcHBseUdyb3VwKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCwgc3RvcmVkOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2VwdCA9IHN0b3JlZCA9PT0gbnVsbCA/IHt9IDogZ3JvdXBWYWx1ZUZyb21TdG9yZWQoc3RvcmVkLCBncm91cC50eXBlKTtcblxuICAgIGlmIChrZXB0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0b0xpdmVHcm91cFZhbHVlKGdyb3VwLnR5cGUsIGtlcHQsIChuYW1lKSA9PiB0aGlzLnJlc29sdmVSZWxhdGl2ZShuYW1lKSk7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXAuaWQsIHZhbHVlKTtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cC5pZCk7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG5cbiAgICAgIGlmIChncm91cC5jb25maWc/LmRlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXAuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQSBncm91cCBiYWNrIGF0IGl0cyBhdXRob3JlZCBkZWZhdWx0LlxuICBwcml2YXRlIF9zZWVkQXV0aG9yZWQoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApO1xuXG4gICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXAuaWQpO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV2ZXJ5IHRpbGUgYmFjayBhdCBpdHMgYXV0aG9yZWQgc3RhdGUuXG4gIHByaXZhdGUgX2NsZWFyVGlsZXMoKTogdm9pZCB7XG4gICAgdGhpcy5fbGlzdFNvcnRzLmNsZWFyKCk7XG4gICAgdGhpcy5fbGlzdFNlYXJjaGVzLmNsZWFyKCk7XG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChuZXcgTWFwKCkpO1xuICAgIHRoaXMuX2RyaWxscy5zZXQobmV3IE1hcCgpKTtcbiAgfVxuXG4gIC8vIE9uZSB0aWxlJ3Mgc3RvcmVkIHN0YXRlLCBlYWNoIGtleSBjaGVja2VkOiBhIHNvcnQgb24gYSBjb2x1bW4gdGhlIGxpc3RcbiAgLy8gY2FuIHNvcnQgYnksIGEgc2VhcmNoIG9uIGEgbGlzdCB0aGF0IHNob3dzIHRoZSBib3gsIGhpZGRlbiBjb2x1bW5zIHRoZVxuICAvLyBsaXN0IGNhbiBoaWRlLCBhIGRyaWxsIHBhdGggb24gYSBjaGFydC5cbiAgcHJpdmF0ZSBfYXBwbHlUaWxlKGNvbXBvbmVudElkOiBudW1iZXIsIHRpbGU6IFJlcG9ydFRpbGVTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgaWYgKGxpc3QpIHtcbiAgICAgIHRoaXMuX2FwcGx5TGlzdFRpbGUobGlzdCwgdGlsZSk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGlsZS5kcmlsbCkgJiYgdGhpcy5faXNDaGFydChjb21wb25lbnRJZCkpIHtcbiAgICAgIHRoaXMuX3NldERyaWxsUGF0aChjb21wb25lbnRJZCwgY2xlYW5EcmlsbFBhdGgodGlsZS5kcmlsbCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgbGlzdCdzIHNvcnQsIHNlYXJjaCBhbmQgaGlkZGVuIGNvbHVtbnMgZnJvbSBhIHRpbGUgc3RhdGUsIGtlcHQgYnkgdGhlXG4gIC8vIHJ1bGVzIHNldExpc3RTb3J0LCBzZXRMaXN0U2VhcmNoIGFuZCBzZXRIaWRkZW5Db2x1bW5zIGFwcGx5LCBidXQgc2V0XG4gIC8vIHN0cmFpZ2h0IG9uIHRoZSBtYXBzOiB0aG9zZSBzZXR0ZXJzIGVhY2ggYW5ub3VuY2UgYSBjaGFuZ2UsIGFuZCBhbiBhcHBseVxuICAvLyBhbm5vdW5jZXMgb25jZSwgYXQgaXRzIGVuZC4gQSBzb3J0IHRoYXQgaXMgdGhlIGxpc3QncyBhdXRob3JlZCBmaXJzdFxuICAvLyB0ZXJtIGlzIGl0cyBkZWZhdWx0LCBzbyBpdCBjbGVhcnMgdGhlIGVudHJ5LlxuICBwcml2YXRlIF9hcHBseUxpc3RUaWxlKGxpc3Q6IFJlcG9ydENvbXBvbmVudCwgdGlsZTogUmVwb3J0VGlsZVN0YXRlKTogdm9pZCB7XG4gICAgY29uc3Qgc29ydCA9IHRpbGUuc29ydDtcblxuICAgIGlmIChzb3J0Py5jb2x1bW4gJiYgdGhpcy5fc29ydGFibGVDb2x1bW5zKGxpc3QpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgaWYgKHNhbWVTb3J0KHNvcnQsIGxpc3RTb3J0VGVybXMobGlzdC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTb3J0cy5kZWxldGUobGlzdC5pZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuc2V0KGxpc3QuaWQsIHsgLi4uc29ydCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRpbGUuc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3Qgc2VhcmNoID0gbGlzdFNlYXJjaFRleHQodGlsZS5zZWFyY2gpO1xuXG4gICAgICBpZiAoc2VhcmNoICYmIHRoaXMubGlzdFNlYXJjaGFibGUobGlzdCkpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLnNldChsaXN0LmlkLCBzZWFyY2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLmRlbGV0ZShsaXN0LmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aWxlLmhpZGRlbikpIHtcbiAgICAgIGNvbnN0IGhpZGRlbiA9IGxpc3RIaWRkZW5Db2x1bW5zKGxpc3QuY29uZmlnLCB0aWxlLmhpZGRlbik7XG4gICAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLmxpc3RIaWRkZW4oKSk7XG5cbiAgICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICAgIG5leHQuc2V0KGxpc3QuaWQsIGhpZGRlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0LmRlbGV0ZShsaXN0LmlkKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5saXN0SGlkZGVuLnNldChuZXh0KTtcbiAgICB9XG4gIH1cblxuICAvLyBPbmUgY2hhcnQncyBkcmlsbCBwYXRoOyBhbiBlbXB0eSBwYXRoIGlzIHRoZSBjaGFydCdzIHRvcC5cbiAgcHJpdmF0ZSBfc2V0RHJpbGxQYXRoKGNvbXBvbmVudElkOiBudW1iZXIsIHBhdGg6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5fZHJpbGxzKCkpO1xuXG4gICAgaWYgKHBhdGgubGVuZ3RoKSB7XG4gICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgcGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kcmlsbHMuc2V0KG5leHQpO1xuICB9XG5cbiAgLy8gVGhlIHBhZ2UgYSBsYXllciBuYW1lcywgd2hlbiB0aGUgcmVwb3J0IGhhcyBpdC5cbiAgcHJpdmF0ZSBfYXBwbHlQYWdlKHBhZ2VJZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmIChwYWdlSWQgJiYgKHRoaXMuX3JlcG9ydCgpPy5wYWdlcyA/PyBbXSkuc29tZSgocGFnZSkgPT4gcGFnZS5pZCA9PT0gcGFnZUlkKSkge1xuICAgICAgdGhpcy5fcGFnZUlkLnNldChwYWdlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFmdGVyIGFwcGx5KCkgb3IgcmVzZXRUb0Jhc2UoKTogZXZlcnkgYmFyIGFuZCB0aWxlIHJlcGFpbnRzLCBhbmQgdGhlXG4gIC8vIHRpbWUtc2VyaWVzIGNoYXJ0cyByZWZldGNoIHdoZW4gdGhlIGdyYWluIG1vdmVkLlxuICBwcml2YXRlIF9ub3RpZnlBcHBsaWVkKGZyZXF1ZW5jeTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0ZVZlcnNpb24udXBkYXRlKCh2ZXJzaW9uKSA9PiB2ZXJzaW9uICsgMSk7XG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcblxuICAgIGlmIChmcmVxdWVuY3kgIT09IHRoaXMuX2ZyZXF1ZW5jeSkge1xuICAgICAgdGhpcy5fZnJlcXVlbmN5Q2hhbmdlZCQubmV4dCgpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIHRpbGVzIG9mIHRoZSByZXBvcnQgaW5pdCgpIGxhc3QgcmVhZC5cbiAgcHJpdmF0ZSBfdGlsZXMoKTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMuX3JlcG9ydCgpO1xuXG4gICAgcmV0dXJuIHJlcG9ydFxuICAgICAgPyByZXBvcnRDb21wb25lbnRzKHJlcG9ydCkuZmlsdGVyKGlzVGlsZSlcbiAgICAgIDogW107XG4gIH1cblxuICBwcml2YXRlIF9pc0NoYXJ0KGNvbXBvbmVudElkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdGlsZXMoKVxuICAgICAgLnNvbWUoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmlkID09PSBjb21wb25lbnRJZCAmJiBjb21wb25lbnQudHlwZSA9PT0gJ2NoYXJ0Jyk7XG4gIH1cblxuICAvLyBLZWVwcyB0aGUgdmlldyBzdGF0ZSB0byB3aGF0IHRoZSByZXBvcnQgKHJlKWxvYWRlZCBieSBpbml0KCkgc3RpbGwgaGFzOlxuICAvLyBkcmlsbCBwYXRocyBvbiBjaGFydHMgaXQgc3RpbGwgaGFzLCB0aGUgcGFnZSB3aGlsZSBpdCBoYXMgaXQsIGFuZCB0aGVcbiAgLy8gYmFzZSB0byB3aGF0IHRoZSBzY3JlZW4gY2FuIHN0aWxsIHNob3cgKF9wcnVuZUJhc2UpLiBPbiBhbm90aGVyIHJlcG9ydCBpdFxuICAvLyBzdGFydHMgYWdhaW46IG5vIG9wZW4gdmlldywgbWF0Y2ggJ2FsbCcsIG5vIGRyaWxsIGFuZCBub3RoaW5nIHRlbXBvcmFyeS5cbiAgcHJpdmF0ZSBfcHJ1bmVWaWV3U3RhdGUocmVwb3J0OiBSZXBvcnQsIHByZXZpb3VzR3JvdXBzOiBSZWFkb25seU1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yZXBvcnQoKT8uaWQgIT09IHJlcG9ydC5pZCkge1xuICAgICAgdGhpcy5fYmFzZUNvbmZpZy5zZXQobnVsbCk7XG4gICAgICB0aGlzLl9tYXRjaC5zZXQoJ2FsbCcpO1xuICAgICAgdGhpcy5fcGFnZUlkLnNldChudWxsKTtcbiAgICAgIHRoaXMuX2RyaWxscy5zZXQobmV3IE1hcCgpKTtcbiAgICAgIHRoaXMuX3RlbXBvcmFyeS5zZXQoZW1wdHlUZW1wb3JhcnlTdGF0ZSgpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKFsuLi50aGlzLl9kcmlsbHMoKV1cbiAgICAgIC5maWx0ZXIoKFtjb21wb25lbnRJZF0pID0+IHRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpKSkpO1xuXG4gICAgaWYgKHRoaXMuX3BhZ2VJZCgpICYmICEocmVwb3J0LnBhZ2VzID8/IFtdKS5zb21lKChwYWdlKSA9PiBwYWdlLmlkID09PSB0aGlzLl9wYWdlSWQoKSkpIHtcbiAgICAgIHRoaXMuX3BhZ2VJZC5zZXQobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJ1bmVCYXNlKHByZXZpb3VzR3JvdXBzKTtcbiAgfVxuXG4gIC8vIEtlZXBzIHRoZSBiYXNlIHRvIHdoYXQgdGhlIHNjcmVlbiBjYW4gc3RpbGwgc2hvdywgYnkgdGhlIHJ1bGVzIHRoZSBsaXZlXG4gIC8vIHN0YXRlIGlzIHBydW5lZCBieSAoX3BydW5lLCBfc2VlZCBhbmQgdGhlIGRyaWxsIHBydW5pbmcgYWJvdmUpLCBzbyBhblxuICAvLyBlZGl0IG9mIHRoZSByZXBvcnQgYWxvbmUgbmV2ZXIgcmVhZHMgYXMgJyhlZGl0ZWQpJy4gQSBncm91cCB3aG9zZVxuICAvLyBhdXRob3JlZCBkZWZhdWx0IGNoYW5nZWQgbGVhdmVzIHRoZSBiYXNlIGFuZCBmb2xsb3dzIHRoZSBuZXcgZGVmYXVsdCxcbiAgLy8gYXMgdGhlIGxpdmUgdmFsdWUgZG9lcyAoX3NlZWQgcmUtc2VlZHMgaXQpOyBzbyBkb2VzIGEgZ3JvdXAgdGhlIHJlcG9ydFxuICAvLyBubyBsb25nZXIgaGFzLiBFYWNoIHRpbGUga2VlcHMgb25seSB0aGUgc3RhdGUgaXRzIGNvbXBvbmVudCBjYW4gc3RpbGxcbiAgLy8gdGFrZSAoX2Jhc2VUaWxlKS5cbiAgcHJpdmF0ZSBfcHJ1bmVCYXNlKHByZXZpb3VzR3JvdXBzOiBSZWFkb25seU1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPik6IHZvaWQge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLl9iYXNlQ29uZmlnKCk7XG4gICAgaWYgKCFiYXNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGJhc2UuZ3JvdXBzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW2dyb3VwSWRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChOdW1iZXIoZ3JvdXBJZCkpO1xuXG4gICAgICAgIHJldHVybiAhIWdyb3VwXG4gICAgICAgICAgJiYgc2FtZURlZmF1bHQocHJldmlvdXNHcm91cHMuZ2V0KGdyb3VwLmlkKT8uY29uZmlnPy5kZWZhdWx0ID8/IG51bGwsIGdyb3VwLmNvbmZpZz8uZGVmYXVsdCA/PyBudWxsKTtcbiAgICAgIH0pKTtcblxuICAgIGNvbnN0IHRpbGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGJhc2UudGlsZXMgPz8ge30pXG4gICAgICAubWFwKChbY29tcG9uZW50SWQsIHRpbGVdKSA9PiBbY29tcG9uZW50SWQsIHRoaXMuX2Jhc2VUaWxlKE51bWJlcihjb21wb25lbnRJZCksIHRpbGUpXSBhcyBjb25zdClcbiAgICAgIC5maWx0ZXIoKFssIHRpbGVdKSA9PiBPYmplY3Qua2V5cyh0aWxlKS5sZW5ndGgpKTtcblxuICAgIGNvbnN0IHBydW5lZDogUmVwb3J0Vmlld0NvbmZpZyA9IHsgLi4uYmFzZSwgZ3JvdXBzIH07XG4gICAgZGVsZXRlIHBydW5lZC50aWxlcztcblxuICAgIGlmIChPYmplY3Qua2V5cyh0aWxlcykubGVuZ3RoKSB7XG4gICAgICBwcnVuZWQudGlsZXMgPSB0aWxlcztcbiAgICB9XG5cbiAgICB0aGlzLl9iYXNlQ29uZmlnLnNldChwcnVuZWQpO1xuICB9XG5cbiAgLy8gQSBiYXNlIHRpbGUncyBzdGF0ZSwga2VwdCB0byB3aGF0IGl0cyBjb21wb25lbnQgY2FuIHN0aWxsIHRha2U6IGEgc29ydFxuICAvLyBvbiBhIGNvbHVtbiB0aGUgbGlzdCBjYW4gc3RpbGwgc29ydCBieSB0aGF0IGlzIG5vdCBub3cgaXRzIGF1dGhvcmVkXG4gIC8vIGZpcnN0IHRlcm0sIGEgc2VhcmNoIHdoaWxlIHRoZSBsaXN0IHNob3dzIHRoZSBib3gsIHRoZSBoaWRkZW4gY29sdW1uc1xuICAvLyB0aGUgbGlzdCBzdGlsbCBoYXMsIGEgZHJpbGwgcGF0aCB3aGlsZSB0aGUgY29tcG9uZW50IGlzIGEgY2hhcnQuXG4gIHByaXZhdGUgX2Jhc2VUaWxlKGNvbXBvbmVudElkOiBudW1iZXIsIHRpbGU6IFJlcG9ydFRpbGVTdGF0ZSk6IFJlcG9ydFRpbGVTdGF0ZSB7XG4gICAgY29uc3Qga2VwdDogUmVwb3J0VGlsZVN0YXRlID0ge307XG4gICAgY29uc3QgbGlzdCA9IHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk7XG4gICAgY29uc3QgaGlkZGVuID0gbGlzdCAmJiB0aWxlLmhpZGRlbiA/IGxpc3RIaWRkZW5Db2x1bW5zKGxpc3QuY29uZmlnLCB0aWxlLmhpZGRlbikgOiBbXTtcblxuICAgIGlmIChsaXN0ICYmIHRpbGUuc29ydCAmJiB0aGlzLl9zb3J0YWJsZUNvbHVtbnMobGlzdCkuaW5jbHVkZXModGlsZS5zb3J0LmNvbHVtbilcbiAgICAgICYmICFzYW1lU29ydCh0aWxlLnNvcnQsIGxpc3RTb3J0VGVybXMobGlzdC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICBrZXB0LnNvcnQgPSB0aWxlLnNvcnQ7XG4gICAgfVxuICAgIGlmIChsaXN0ICYmIHRpbGUuc2VhcmNoICYmIHRoaXMubGlzdFNlYXJjaGFibGUobGlzdCkpIHtcbiAgICAgIGtlcHQuc2VhcmNoID0gdGlsZS5zZWFyY2g7XG4gICAgfVxuICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICBrZXB0LmhpZGRlbiA9IGhpZGRlbjtcbiAgICB9XG4gICAgaWYgKHRpbGUuZHJpbGw/Lmxlbmd0aCAmJiB0aGlzLl9pc0NoYXJ0KGNvbXBvbmVudElkKSkge1xuICAgICAga2VwdC5kcmlsbCA9IHRpbGUuZHJpbGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGtlcHQ7XG4gIH1cblxuICAvLyBBIHNlbGVjdCdzIHZhbHVlcyB0byBsZWF2ZSBvdXQgKG9ubHkgd2hlbiBpdCBrZWVwcyBub25lKSBhbmQgYSBudW1iZXJcbiAgLy8gcmFuZ2UncyBlbmRzLCBhbiBvcGVuIGVuZCBsZWZ0IG91dCBhbmQgMCBrZXB0LCB3cml0dGVuIG9udG8gYGZpZWxkc2AuXG4gIHByaXZhdGUgX3Jlc29sdmVFeGNsdWRlQW5kUmFuZ2UodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUsIGZpZWxkczogT21pdDxSZXNvbHZlZEZpbHRlclZhbHVlLCAnZmlsdGVySWQnPik6IHZvaWQge1xuICAgIGlmICh2YWx1ZS5leGNsdWRlVmFsdWVzPy5sZW5ndGggJiYgIWZpZWxkcy52YWx1ZXMpIHtcbiAgICAgIGZpZWxkcy5leGNsdWRlVmFsdWVzID0gdmFsdWUuZXhjbHVkZVZhbHVlcztcbiAgICB9XG5cbiAgICBjb25zdCBtaW4gPSBmaW5pdGVOdW1iZXIodmFsdWUubWluKTtcbiAgICBjb25zdCBtYXggPSBmaW5pdGVOdW1iZXIodmFsdWUubWF4KTtcblxuICAgIGlmIChtaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmllbGRzLm1pbiA9IG1pbjtcbiAgICB9XG4gICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWVsZHMubWF4ID0gbWF4O1xuICAgIH1cbiAgfVxuXG4gIC8vIEFuIGF1dGhvcmVkIGRlZmF1bHQgdGhhdCBsZWF2ZXMgc2VsZWN0IHZhbHVlcyBvdXQsIG9yIGEgbnVtYmVyIHJhbmdlJ3NcbiAgLy8gZW5kcyAoMCBrZXB0KSwgYXMgYSBzZXNzaW9uIHZhbHVlOyBudWxsIHdoZW4gaXQgaG9sZHMgbmVpdGhlci5cbiAgcHJpdmF0ZSBfZXhjbHVkZU9yUmFuZ2VEZWZhdWx0KGdyb3VwRGVmYXVsdDogRmlsdGVyR3JvdXBEZWZhdWx0KTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICAgIGlmIChncm91cERlZmF1bHQuZXhjbHVkZVZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyBleGNsdWRlVmFsdWVzOiBncm91cERlZmF1bHQuZXhjbHVkZVZhbHVlcyB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1pbiA9IGZpbml0ZU51bWJlcihncm91cERlZmF1bHQubWluKTtcbiAgICBjb25zdCBtYXggPSBmaW5pdGVOdW1iZXIoZ3JvdXBEZWZhdWx0Lm1heCk7XG5cbiAgICBpZiAobWluID09PSB1bmRlZmluZWQgJiYgbWF4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi4obWluICE9PSB1bmRlZmluZWQgPyB7IG1pbiB9IDoge30pLFxuICAgICAgLi4uKG1heCAhPT0gdW5kZWZpbmVkID8geyBtYXggfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQ291bnRzIGEgcmVzZXQgZm9yIGVhY2ggbGlzdCB3aG9zZSBzb3J0IGlzIG5vdCB0aGUgb25lIGl0IGhhZCAoYGJlZm9yZWAsXG4gIC8vIHRoZSBzb3J0cyBieSBsaXN0IGJlZm9yZSB0aGUgcmVzZXQpLiBBIHNvcnQgYSBsaXN0IGxvc3QgYW5kIG9uZSBpdFxuICAvLyBnYWluZWQgYm90aCBjb3VudDsgdGhlIGF1dGhvcmVkIHNvcnQgaXMgbm8gZW50cnkgZWl0aGVyIHNpZGUuXG4gIHByaXZhdGUgX2NvdW50U29ydFJlc2V0cyhiZWZvcmU6IFJlYWRvbmx5TWFwPG51bWJlciwgUmVwb3J0U29ydD4pOiB2b2lkIHtcbiAgICBjb25zdCBtb3ZlZCA9IFsuLi5uZXcgU2V0KFsuLi5iZWZvcmUua2V5cygpLCAuLi50aGlzLl9saXN0U29ydHMua2V5cygpXSldXG4gICAgICAuZmlsdGVyKChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICBjb25zdCB3YXMgPSBiZWZvcmUuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgICAgY29uc3Qgbm93ID0gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcblxuICAgICAgICByZXR1cm4gd2FzID8gIXNhbWVTb3J0KHdhcywgbm93KSA6IG5vdyAhPT0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgaWYgKCFtb3ZlZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RTb3J0UmVzZXRzKCkpO1xuICAgIG1vdmVkLmZvckVhY2goKGNvbXBvbmVudElkKSA9PiBjb3VudHMuc2V0KGNvbXBvbmVudElkLCAoY291bnRzLmdldChjb21wb25lbnRJZCkgPz8gMCkgKyAxKSk7XG4gICAgdGhpcy5fbGlzdFNvcnRSZXNldHMuc2V0KGNvdW50cyk7XG4gIH1cbn1cbiJdfQ==
|
|
1019
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQzdCLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEdBQ2pGLE1BQU0sV0FBVyxDQUFDO0FBbUJuQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxP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QyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7d0dBbGpDVSx3QkFBd0I7NEdBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIGZpbHRlciBhcyByeEZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHNjYW4gfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIGVuZE9mV2Vlaywgc3RhcnRPZk1vbnRoLCBzdGFydE9mUXVhcnRlciwgc3RhcnRPZldlZWssIHN0YXJ0T2ZZZWFyLFxuICBzdWJEYXlzLCBzdWJNb250aHMsIHN1YldlZWtzLFxufSBmcm9tICdkYXRlLWZucyc7XG5cbmltcG9ydCB7IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9IGZyb20gJy4uL2NvbnN0cy9yZXBvcnQtd2Vlay5jb25zdCc7XG5pbXBvcnQge1xuICBERUZBVUxUX0ZPUk1BVF9DT05URVhULCBnZXRab25lZE5vdywgcmVzb2x2ZUZvcm1hdENvbnRleHQsIHJlc29sdmVSZXBvcnRUaW1lem9uZSxcbn0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1jaGF0LXZpZXdlci1maWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydERyaWxsU3RlcCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWRyaWxsLXN0ZXAuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck1hdGNoIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLW1hdGNoLnR5cGUnO1xuaW1wb3J0IHsgUmVwb3J0VGVtcG9yYXJ5U3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC10ZW1wb3Jhcnktc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFRpbGVTdGF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXRpbGUtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFN0YXRlU25hcHNob3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1zdGF0ZS1zbmFwc2hvdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSxcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBGaWx0ZXJHcm91cFZhbHVlLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyR3JvdXAsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydFJlbGF0aXZlUmFuZ2UsXG4gIFJlcG9ydFNvcnQsXG4gIFJlc29sdmVkRmlsdGVyVmFsdWUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBsaXN0SGlkZGVuQ29sdW1ucywgbGlzdFNvcnRUZXJtcyB9IGZyb20gJy4uL2xpc3QtY29uZmlnJztcbmltcG9ydCB7IGRhdGVCb3VuZFN0cmluZywgTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCB9IGZyb20gJy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgZ3JvdXBWYWx1ZVNpZ25hdHVyZSB9IGZyb20gJy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgaXNUaWxlIH0gZnJvbSAnLi4vcmVwb3J0LXRpbGUnO1xuaW1wb3J0IHtcbiAgY2xlYW5EcmlsbFBhdGgsIGZpbml0ZU51bWJlciwgaXNSZWxhdGl2ZVJhbmdlLCBzYW1lRHJpbGxQYXRoLCBzYW1lU3RvcmVkR3JvdXBWYWx1ZSxcbiAgc3RhdGVEaWZmZXJzLCB0b1N0b3JlZEdyb3VwVmFsdWUsXG59IGZyb20gJy4uL3JlcG9ydC1zdGF0ZSc7XG5pbXBvcnQgeyBDb21wb25lbnREYXRhU3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgdGlsZURhdGFTdGF0ZSB9IGZyb20gJy4uL3RpbGUtZGF0YS1zdGF0ZSc7XG5pbXBvcnQgeyByZXBvcnRDb21wb25lbnRzIH0gZnJvbSAnLi4vdmFsdWVzJztcblxuXG4vLyBXaGV0aGVyIHR3byBzdG9yZWQgZmlsdGVyLWdyb3VwIGRlZmF1bHRzIGFyZSB0aGUgc2FtZS4gQ29tcGFyZWQgb24gdGhlIGZpZWxkcyBhXG4vLyBkZWZhdWx0IGNhbiBhY3R1YWxseSBjYXJyeSwgc28ga2V5IG9yZGVyIGluIHRoZSBwYXlsb2FkIGNhbid0IHJlYWQgYXMgYSBjaGFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gc2FtZURlZmF1bHQoXG4gIGE6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwsXG4gIGI6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgaWYgKCFhIHx8ICFiKSB7XG4gICAgcmV0dXJuICFhICYmICFiO1xuICB9XG5cbiAgcmV0dXJuIGEuc3RhcnQgPT09IGIuc3RhcnRcbiAgICAmJiBhLmVuZCA9PT0gYi5lbmRcbiAgICAmJiBhLnZhbHVlID09PSBiLnZhbHVlXG4gICAgJiYgYS5yZWxhdGl2ZSA9PT0gYi5yZWxhdGl2ZVxuICAgICYmIHNhbWVMaXN0KGEudmFsdWVzLCBiLnZhbHVlcylcbiAgICAmJiBzYW1lTGlzdChhLmV4Y2x1ZGVWYWx1ZXMsIGIuZXhjbHVkZVZhbHVlcylcbiAgICAmJiBhLm1pbiA9PT0gYi5taW5cbiAgICAmJiBhLm1heCA9PT0gYi5tYXg7XG59XG5cblxuLy8gV2hldGhlciB0d28gc3RvcmVkIGxpc3RzIGhvbGQgdGhlIHNhbWUgdmFsdWVzIGluIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gc2FtZUxpc3QoYTogdW5rbm93bltdIHwgdW5kZWZpbmVkLCBiOiB1bmtub3duW10gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChhID8/IFtdKS5sZW5ndGggPT09IChiID8/IFtdKS5sZW5ndGhcbiAgICAmJiAoYSA/PyBbXSkuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IChiID8/IFtdKVtpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGxpc3Qgc29ydHMgb3JkZXIgdGhlIHJvd3MgdGhlIHNhbWUgd2F5LiBObyBkaXJlY3Rpb24gcmVhZHMgYXNcbi8vIGFzY2VuZGluZywgdGhlIHdheSB0aGUgbGlzdCBhcHBsaWVzIGl0LlxuZnVuY3Rpb24gc2FtZVNvcnQoYTogUmVwb3J0U29ydCwgYjogUmVwb3J0U29ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhYlxuICAgICYmIGEuY29sdW1uID09PSBiLmNvbHVtblxuICAgICYmIChhLmRpcmVjdGlvbiA/PyAnYXNjJykgPT09IChiLmRpcmVjdGlvbiA/PyAnYXNjJyk7XG59XG5cblxuLy8gV2hldGhlciBhIHZhbHVlIHJlYWQgb2ZmIGEgZmlsdGVyIGJhciBpcyB0aGUgdmFsdWUgYWxyZWFkeSBzdG9yZWQgZm9yIGl0c1xuLy8gZ3JvdXA6IHRoZSBzYW1lIGNhbGVuZGFyIGRheXMsIHRoZSBzYW1lIHNlbGVjdCB2YWx1ZXMga2VwdCBvciBsZWZ0IG91dCBpblxuLy8gdGhlIHNhbWUgb3JkZXIsIHRoZSBzYW1lIHRyaW1tZWQgdGV4dCBhbmQgdGhlIHNhbWUgbnVtYmVyIHJhbmdlIGVuZHMuIEFcbi8vIGJhciByZS1yZWFkcyBldmVyeSBncm91cCBpdCBzaG93cyBvbiBhbnkgY2hhbmdlLCBzbyB0aGlzIGlzIHdoYXQgdGVsbHMgdGhlXG4vLyBncm91cCB0aGF0IGNoYW5nZWQgZnJvbSB0aGUgb25lcyB0aGF0IGRpZCBub3QuXG5leHBvcnQgZnVuY3Rpb24gc2FtZUZpbHRlclZhbHVlKFxuICBhOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgYjogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdyb3VwVmFsdWVTaWduYXR1cmUoYSkgPT09IGdyb3VwVmFsdWVTaWduYXR1cmUoYik7XG59XG5cblxuLy8gVGhlIGdyb3VwcyBhIGJhciByZS1yZWFkIHRoYXQgaXQgbm93IHNob3dzIHdpdGggYSB2YWx1ZSBvdGhlciB0aGFuIHRoZSBvbmVcbi8vIGl0IGxhc3QgcmVwb3J0ZWQsIHJlY29yZGluZyBlYWNoIG5ldyB2YWx1ZSBpbiBgbGFzdFJlcG9ydGVkYC4gQSBiYXIgaXNcbi8vIGNvbXBhcmVkIHdpdGggaXRzZWxmLCBuZXZlciB3aXRoIHRoZSBzdG9yZWQgdmFsdWU6IGEgZ3JvdXAgc2hvd24gaW4gdHdvIGJhcnNcbi8vIChsZXZlbCAnYm90aCcpIGNhbiBiZSBjaGFuZ2VkIGluIHRoZSBvdGhlciBvbmUsIGFuZCB0aGlzIGJhciBpcyBub3Rcbi8vIHJlcGFpbnRlZCwgc28gaXRzIHN0YWxlIHZhbHVlIG11c3Qgbm90IGJlIHNldCBiYWNrIHdoZW4gdGhlIHZpZXdlciBjaGFuZ2VzXG4vLyBhbm90aGVyIG9mIGl0cyBpdGVtcyAodGhlIGxpc3Qgc2VhcmNoIGJveCwgc2F5KS5cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlZEdyb3VwVmFsdWVzKFxuICBsYXN0UmVwb3J0ZWQ6IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWUgfCBudWxsPixcbiAgcmVwb3J0ZWQ6IHsgZ3JvdXBJZDogbnVtYmVyOyB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfVtdLFxuKTogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10ge1xuICByZXR1cm4gcmVwb3J0ZWQuZmlsdGVyKCh7IGdyb3VwSWQsIHZhbHVlIH0pID0+IHtcbiAgICBpZiAoc2FtZUZpbHRlclZhbHVlKGxhc3RSZXBvcnRlZC5nZXQoZ3JvdXBJZCksIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxhc3RSZXBvcnRlZC5zZXQoZ3JvdXBJZCwgdmFsdWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5cbi8vIEEgbGlzdCdzIHNlYXJjaCB0ZXh0IGFzIHRoZSBzZXJ2ZXIgYXBwbGllcyBpdDogdHJpbW1lZCwgdGhlbiBjdXQgdG9cbi8vIExJU1RfU0VBUkNIX01BWF9MRU5HVEggY2hhcmFjdGVycyAoY29kZSBwb2ludHMsIGFzIHRoZSBzZXJ2ZXIgY291bnRzIHRoZW0pLlxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RTZWFyY2hUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBbLi4udGV4dC50cmltKCldLnNsaWNlKDAsIExJU1RfU0VBUkNIX01BWF9MRU5HVEgpLmpvaW4oJycpO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGxpc3RzIG9mIGNvbHVtbiBuYW1lcyBhcmUgdGhlIHNhbWUgbmFtZXMgaW4gdGhlIHNhbWUgb3JkZXIuXG5mdW5jdGlvbiBzYW1lTmFtZXMoYTogcmVhZG9ubHkgc3RyaW5nW10sIGI6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeSgobmFtZSwgaW5kZXgpID0+IG5hbWUgPT09IGJbaW5kZXhdKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBoaWRkZW4tY29sdW1uIG1hcHMgaGlkZSB0aGUgc2FtZSBjb2x1bW5zIG9uIHRoZSBzYW1lIGxpc3RzLlxuZnVuY3Rpb24gc2FtZUhpZGRlbihcbiAgYTogUmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4sXG4gIGI6IFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+LFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBhLnNpemUgPT09IGIuc2l6ZVxuICAgICYmIFsuLi5hXS5ldmVyeSgoW2NvbXBvbmVudElkLCBuYW1lc10pID0+IHNhbWVOYW1lcyhuYW1lcywgYi5nZXQoY29tcG9uZW50SWQpID8/IFtdKSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gZGF0ZS1yYW5nZSB2YWx1ZXMgY292ZXIgdGhlIHNhbWUgY2FsZW5kYXIgZGF5cy5cbmZ1bmN0aW9uIHNhbWVEYXlzKGE6IEZpbHRlckdyb3VwVmFsdWUsIGI6IEZpbHRlckdyb3VwVmFsdWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGRhdGVCb3VuZFN0cmluZyhhLnN0YXJ0KSA9PT0gZGF0ZUJvdW5kU3RyaW5nKGIuc3RhcnQpXG4gICAgJiYgZGF0ZUJvdW5kU3RyaW5nKGEuZW5kKSA9PT0gZGF0ZUJvdW5kU3RyaW5nKGIuZW5kKTtcbn1cblxuXG4vLyBBIHN0YWJsZSBzaWduYXR1cmUgZm9yIGEgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdC4gVGhlIHJlcG9ydCB0b29sYmFyIGtleXMgaXRzXG4vLyBmcy1maWx0ZXIgb24gdGhpcywgYmVjYXVzZSBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQg4oCUIHdpdGhvdXQgYVxuLy8ga2V5IGNoYW5nZSBpdCBrZWVwcyByZW5kZXJpbmcgdGhlIHZhbHVlcyBpdCB3YXMgY3JlYXRlZCB3aXRoIGV2ZW4gYWZ0ZXIgdGhlXG4vLyBjb25maWcgYmVoaW5kIGl0IGhhcyBiZWVuIHJlYnVpbHQuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFNpZ25hdHVyZShncm91cDogUmVwb3J0RmlsdGVyR3JvdXApOiBzdHJpbmcge1xuICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG5cbiAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGdyb3VwRGVmYXVsdC5zdGFydCA/PyAnJyxcbiAgICBncm91cERlZmF1bHQuZW5kID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC52YWx1ZSA/PyAnJyxcbiAgICBncm91cERlZmF1bHQucmVsYXRpdmUgPz8gJycsXG4gICAgKGdyb3VwRGVmYXVsdC52YWx1ZXMgPz8gW10pLmpvaW4oJywnKSxcbiAgICAoZ3JvdXBEZWZhdWx0LmV4Y2x1ZGVWYWx1ZXMgPz8gW10pLmpvaW4oJywnKSxcbiAgICBncm91cERlZmF1bHQubWluID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5tYXggPz8gJycsXG4gIF0uam9pbignficpO1xufVxuXG5cbi8vIFRoZSB0ZW1wb3JhcnkgbGF5ZXIgd2l0aCBub3RoaW5nIHBpY2tlZC5cbmZ1bmN0aW9uIGVtcHR5VGVtcG9yYXJ5U3RhdGUoKTogUmVwb3J0VGVtcG9yYXJ5U3RhdGUge1xuICByZXR1cm4geyBjcm9zc0ZpbHRlcnM6IFtdLCBkZXRhaWw6IG51bGwgfTtcbn1cblxuXG4vLyBWaWV3ZXIgZmlsdGVyIHN0YXRlIGZvciB0aGUgb3BlbiByZXBvcnQuIEZpbHRlciBWQUxVRVMgYXJlIG5ldmVyIHNhdmVkIHRvXG4vLyB0aGUgcmVwb3J0IOKAlCB0aGlzIHNlcnZpY2UgaG9sZHMgdGhlbSBwZXIgZmlsdGVyIEdST1VQICh0aGUgcHJvcGFnYXRpb24gdW5pdCksXG4vLyByZXNvbHZlcyB0aGVtIGludG8gcGVyLWNvbXBvbmVudCBtZW1iZXItZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBkYXRhIHJlcXVlc3QsXG4vLyBhbmQgbm90aWZpZXMgdGhlIGNvbXBvbmVudHMgd2hvc2UgZ3JvdXBzIGNoYW5nZWQgc28gb25seSB0aGV5IHJlZmV0Y2guXG4vL1xuLy8gSXQgaXMgdGhlIG9uZSBwbGFjZSB0aGUgdmlld2VyJ3Mgc3RhdGUgbGl2ZXMgd2hpbGUgdGhlIHJlcG9ydCBpcyBvcGVuOiB0aGVcbi8vIGdyb3VwIHZhbHVlcywgdGhlIGdyb3VwLWJ5IGdyYWluLCB0aGUgbWF0Y2gsIGxpc3Qgc29ydHMsIHNlYXJjaGVzIGFuZCBoaWRkZW5cbi8vIGNvbHVtbnMsIHRoZSBwYWdlIGFuZCBlYWNoIGNoYXJ0J3MgZHJpbGwgcGF0aC4gTm9uZSBvZiBpdCBpcyBldmVyIHdyaXR0ZW4gdG9cbi8vIHRoZSBicm93c2VyIFVSTC4gSXQgb3V0bGl2ZXMgYSBwYWdlIHN3aXRjaCAodGhlIGNhbnZhcyBjaGFuZ2VzIHRoZSBwYWdlLCBub3Rcbi8vIHRoaXMgc2VydmljZSkgYW5kIGdvZXMgd2l0aCB0aGUgcmVwb3J0IHZpZXc6IGEgcmVsb2FkIHN0YXJ0cyBhIG5ldyBzZXJ2aWNlLFxuLy8gd2hpY2ggb3BlbnMgb24gdGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzLiBjaGFuZ2VzKCkgZmlyZXMgb24gZXZlcnlcbi8vIGNoYW5nZSBvZiBpdC5cbi8vXG4vLyBUaGUgZHVyYWJsZSBwYXJ0IHJlYWRzIGFzIG9uZSBkb2N1bWVudDogc25hcHNob3QoKSB3cml0ZXMgaXQsIGFuZFxuLy8gZGlmZmVyc0Zyb21EZWZhdWx0cyBzYXlzIHdoZXRoZXIgdGhlIHNjcmVlbiBzdGlsbCBzaG93cyB0aGUgcmVwb3J0J3Ncbi8vIGF1dGhvcmVkIGRlZmF1bHRzIChyZXNldFRvRGVmYXVsdHMoKSBwdXRzIGl0IGJhY2sgb24gdGhlbSkuIFRoZSB0ZW1wb3Jhcnlcbi8vIGxheWVyIChhIGNyb3NzLWZpbHRlciwgYW4gb3BlbiByb3dzIHBhbmVsKSBpcyBpdHMgb3duIHNlY3Rpb24sIHNvIGFcbi8vIHNuYXBzaG90IG5ldmVyIGNhcnJpZXMgaXQuXG4vL1xuLy8gU2Vzc2lvbi1vbmx5LCBuZXZlciBpbiB0aGUgc25hcHNob3Q6IHBlci1maWx0ZXIgZW5hYmxlL2Rpc2FibGUgdG9nZ2xlcyBmcm9tXG4vLyBhIGNvbXBvbmVudCdzIGZpbHRlciBtZW51ICh0aGUgYGVuYWJsZWRgIGNvbHVtbiBpcyB0aGUgYXV0aG9yZWQgZGVmYXVsdDsgYVxuLy8gdmlld2VyJ3MgdG9nZ2xlIHNob3VsZG4ndCB3cml0ZSB0byB0aGUgcmVwb3J0KS5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Uge1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGVmZmVjdGl2ZSB6b25lIChyZXNvbHZlUmVwb3J0VGltZXpvbmUpLiBSZWxhdGl2ZSBwcmVzZXRzXG4gIC8vIHJlc29sdmUgYWdhaW5zdCB0b2RheSBpbiBpdCwgYW5kIGRhdGUgY2VsbHMgcmVuZGVyIGluIGl0LlxuICBwdWJsaWMgcmVhZG9ubHkgdGltZXpvbmUgPSBzaWduYWw8c3RyaW5nPignVVRDJyk7XG5cbiAgLy8gSG93IHRoZSBvcGVuIHJlcG9ydCB3cml0ZXMgaXRzIG51bWJlcnMgYW5kIGRhdGVzIChyZXNvbHZlRm9ybWF0Q29udGV4dCk6XG4gIC8vIGl0cyBsb2NhbGUsIGl0cyBjdXJyZW5jeSBhbmQgd2hldGhlciBwZXJjZW50cyBhcnJpdmUgYXMgcmF0aW9zLiBFdmVyeSBLUEksXG4gIC8vIGNoYXJ0LCBkYXRlIGNlbGwgYW5kIGV4cG9ydCByZWFkcyBpdCBoZXJlLiBDb21wYXJlZCBieSB2YWx1ZSwgc28gYSByZWxvYWRcbiAgLy8gb2YgYW4gdW5jaGFuZ2VkIHJlcG9ydCByZS1yZW5kZXJzIG5vdGhpbmcuXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gc2lnbmFsPFJlcG9ydEZvcm1hdENvbnRleHQ+KERFRkFVTFRfRk9STUFUX0NPTlRFWFQsIHtcbiAgICBlcXVhbDogKGEsIGIpID0+IGEubG9jYWxlID09PSBiLmxvY2FsZVxuICAgICAgJiYgYS5jdXJyZW5jeSA9PT0gYi5jdXJyZW5jeVxuICAgICAgJiYgYS5yYXRpb1BlcmNlbnQgPT09IGIucmF0aW9QZXJjZW50LFxuICB9KTtcblxuICAvLyBUaGUgY29uZmlnIGNvbHVtbnMgYSB2aWV3ZXIgaGlkIG9uIGVhY2ggcGxhaW4gbGlzdCAobGlzdEhpZGRlbkNvbHVtbnMpLFxuICAvLyBieSBjb21wb25lbnQgaWQ7IGEgbGlzdCBzaG93aW5nIGV2ZXJ5IGNvbHVtbiBoYXMgbm8gZW50cnkuIEEgc2lnbmFsLCBzbyBhXG4gIC8vIGxpc3QgaGlkZXMgYW5kIHNob3dzIGl0cyBjb2x1bW5zIGluIHBsYWNlOiB0aGUgcm93cyBkbyBub3QgY2hhbmdlLCBzb1xuICAvLyBub3RoaW5nIHJlZmV0Y2hlcy4gQ29tcGFyZWQgYnkgdmFsdWUsIHNvIGEgcmVsb2FkIHRoYXQga2VlcHMgZXZlcnkgY29sdW1uXG4gIC8vIHJlcGFpbnRzIG5vdGhpbmcuXG4gIHB1YmxpYyByZWFkb25seSBsaXN0SGlkZGVuID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+PihuZXcgTWFwKCksIHtcbiAgICBlcXVhbDogc2FtZUhpZGRlbixcbiAgfSk7XG5cbiAgLy8gTW92ZXMgZWFjaCB0aW1lIHJlc2V0VG9EZWZhdWx0cygpIHJlcGxhY2VzIHRoZSB3aG9sZSBkdXJhYmxlIHN0YXRlLiBCYXJzXG4gIC8vIGFuZCB0aWxlcyBrZXkgb24gaXQsIHNvIGEgcmVzZXQgcmVwYWludHMgYWxsIG9mIHRoZW07IHRoZSB0aWxlcyByZWZldGNoXG4gIC8vIGluIHBsYWNlLCBzbyB0aGVpciBkYXRhIHN0YXlzIG9uIHNjcmVlbiB3aGlsZSB0aGV5IHJlbG9hZC5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlVmVyc2lvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3N0YXRlVmVyc2lvbigpKTtcblxuICAvLyBCeSBsaXN0IGNvbXBvbmVudCBpZCwgaG93IG1hbnkgcmVzZXRzIG1vdmVkIHRoYXQgbGlzdCdzIHNvcnQuIEZzTGlzdFxuICAvLyByZWFkcyBpdHMgc29ydCBvbmx5IHdoZW4gaXQgaXMgY3JlYXRlZCwgc28gYSBsaXN0IHdob3NlIHNvcnQgYSByZXNldFxuICAvLyBtb3ZlZCBpcyBkcmF3biBhZ2FpbiAoa2V5ZWQgb24gaXRzIGNvdW50KTsgZXZlcnkgb3RoZXIgdGlsZSByZWxvYWRzIGluXG4gIC8vIHBsYWNlLlxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdFNvcnRSZXNldHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9saXN0U29ydFJlc2V0cygpKTtcblxuICAvLyBUaGUgb3BlbiBwYWdlLCBvciBudWxsIGJlZm9yZSB0aGUgaG9zdCByZXBvcnRzIG9uZSAoc2V0UGFnZSkuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcGFnZUlkKCkpO1xuXG4gIC8vIEhvdyB0aGUgZ3JvdXBzIGNvbWJpbmU6ICdhbGwnIGtlZXBzIHRoZSByb3dzIGV2ZXJ5IGdyb3VwIGtlZXBzLCAnYW55J1xuICAvLyB0aGUgcm93cyBhdCBsZWFzdCBvbmUgZWxpZ2libGUgZ3JvdXAga2VlcHMgKHNldE1hdGNoKS5cbiAgcHVibGljIHJlYWRvbmx5IG1hdGNoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fbWF0Y2goKSk7XG5cbiAgLy8gVGhlIHZpZXdlciBmZWF0dXJlcyB0aGUgb3BlbiByZXBvcnQncyBzZXJ2ZXIgc2VydmVzIChSZXBvcnQudmlld2VyRmVhdHVyZXMpOlxuICAvLyBhIGZpbHRlciBiYXIgb2ZmZXJzIGEgY29udHJvbCBvbmx5IHdoZW4gaXRzIGZlYXR1cmUgaXMgbGlzdGVkLiBFbXB0eVxuICAvLyBiZWZvcmUgYSByZXBvcnQgaXMgb3BlbiBhbmQgZnJvbSBhbiBvbGRlciBzZXJ2ZXIuXG4gIHB1YmxpYyByZWFkb25seSB2aWV3ZXJGZWF0dXJlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3JlcG9ydCgpPy52aWV3ZXJGZWF0dXJlcyA/PyBbXSk7XG5cbiAgLy8gVGhlIHJlcG9ydCBpbml0KCkgbGFzdCByZWFkLCBvciBudWxsIGJlZm9yZSBvbmUgaXMgb3Blbi4gQSB0aWxlIGhlYWRlclxuICAvLyBsaXN0cyBpdHMgc2VsZWN0IG9wdGlvbnMgZnJvbSBpdCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcmVwb3J0KCkpO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gdGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzXG4gIC8vIChzdGF0ZURpZmZlcnMpOiB3aGF0IHRoZSByZXBvcnQgYmFyJ3MgJ0NsZWFyIGZpbHRlcnMnIHNob3dzIGZvci4gQSBzd2l0Y2hcbiAgLy8gb2YgcGFnZSBkb2VzIG5vdCBjb3VudCwgYW5kIHRoZSB0ZW1wb3Jhcnkgc3RhdGUgbmV2ZXIgZG9lcy5cbiAgcHVibGljIHJlYWRvbmx5IGRpZmZlcnNGcm9tRGVmYXVsdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdGhpcy5fcmV2aXNpb24oKTtcblxuICAgIHJldHVybiBzdGF0ZURpZmZlcnModGhpcy5hdXRob3JlZENvbmZpZygpLCB0aGlzLnNuYXBzaG90KCkpO1xuICB9KTtcblxuICBwcml2YXRlIF92YWx1ZXMgPSBuZXcgTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZT4oKTtcbiAgcHJpdmF0ZSBfZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuICBwcml2YXRlIF9zZXNzaW9uRGlzYWJsZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBHcm91cHMgdGhhdCBoYXZlIGEgZGVmYXVsdCB0aGUgdmlld2VyIGNsZWFyZWQuIFdpdGhvdXQgdGhpcyBhIHJlbG9hZCBvZiB0aGVcbiAgLy8gcmVwb3J0IChhIGNoYXQgZWRpdCwgYSBkaWFsb2cpIHdvdWxkIGZpbmQgbm8gdmFsdWUgZm9yIHRoZSBncm91cCBhbmQgc2VlZFxuICAvLyBpdHMgZGVmYXVsdCBzdHJhaWdodCBiYWNrLiBBIGNoYW5nZSB0byB0aGUgc3RvcmVkIGRlZmF1bHQgcmVsZWFzZXMgaXQuXG4gIHByaXZhdGUgX2NsZWFyZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbDogYSBzaW5nbGUgcmVwb3J0LXdpZGUgYnVja2V0IG92ZXJyaWRlIGZvciBhbGxcbiAgLy8gdGltZS1zZXJpZXMgY2hhcnRzLiBVbnNldCA9IGVhY2ggY2hhcnQgdXNlcyBpdHMgYXV0aG9yZWQgZ3JhbnVsYXJpdHkuIE5ldmVyXG4gIC8vIHNhdmVkIHRvIHRoZSByZXBvcnQsIGFuZCBjYXJyaWVkIGluIHRoZSBkYXRhIHJlcXVlc3Qnc1xuICAvLyBgc3RhdGVgLCBzbyBpdCBwcm9wYWdhdGVzIHRocm91Z2ggdG8gdGhlIFBERi9Qb3dlclBvaW50IGV4cG9ydHMgdG9vLiBOYW1lZFxuICAvLyBmb3IgdGhlIGBmcmVxdWVuY3lgIHdpcmUga2V5IGl0IHRyYXZlbHMgdW5kZXIsIG5vdCBmb3IgdGhlIGNvbnRyb2wncyBsYWJlbC5cbiAgcHJpdmF0ZSBfZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2ZyZXF1ZW5jeUNoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBFYWNoIGxpc3QncyB2aWV3ZXItY2hvc2VuIHNvcnQsIGJ5IGNvbXBvbmVudCBpZC4gSGVsZCBoZXJlIHJhdGhlciB0aGFuIG9ubHlcbiAgLy8gaW4gdGhlIGxpc3QncyBGc0xpc3Qgc28gaXQgc3Vydml2ZXMgdGhlIGxpc3QgYmVpbmcgcmVjcmVhdGVkIChhIHBhZ2Ugc3dpdGNoLFxuICAvLyBhIHJlbG9hZCBhZnRlciBhbiBlZGl0KSBhbmQgc28gZXZlcnkgY29uc3VtZXIgb2Ygdmlld2VyIHN0YXRlIHJlYWRzIG9uZSBwbGFjZS5cbiAgcHJpdmF0ZSBfbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KCk7XG5cbiAgLy8gRWFjaCBsaXN0J3Mgc2VhcmNoIGJveCB0ZXh0IChsaXN0U2VhcmNoVGV4dCksIGJ5IGNvbXBvbmVudCBpZC4gQSBsaXN0IHdpdGhcbiAgLy8gYW4gZW1wdHkgYm94IGhhcyBubyBlbnRyeS4gSGVsZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb25zIGFzIHRoZSBzb3J0cywgYW5kXG4gIC8vIGJlY2F1c2UgdGhlIGJveCBsaXZlcyBpbiB0aGUgY29tcG9uZW50IGhlYWRlciwgbm90IGluIHRoZSBsaXN0LlxuICBwcml2YXRlIF9saXN0U2VhcmNoZXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGxpc3RzLCBieSBjb21wb25lbnQgaWQsIHNvIGEgZmlsdGVyIHRvZ2dsZSBjYW4gdGVsbFxuICAvLyB3aGljaCBvZiB0aGVtIGxvc2UgdGhlaXIgc2VhcmNoIGJveCAobGlzdFNlYXJjaGFibGUpLlxuICBwcml2YXRlIF9saXN0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRDb21wb25lbnQ+KCk7XG5cbiAgLy8gV2hldGhlciB0aGUgc2VydmVyIGFuc3dlcnMgYSBsaXN0IHNlYXJjaC4gTGlzdCBzZWFyY2ggYW5kIGVmZmVjdGl2ZUxvY2FsZVxuICAvLyBzaGlwIGluIHRoZSBzYW1lIGZyYW1ld29yayBjaGFuZ2Ugc2V0LCBzbyBhIHNlcnZlciB0aGF0IHNlbmRzIG5vXG4gIC8vIGVmZmVjdGl2ZUxvY2FsZSBoYXMgbmVpdGhlciwgYW5kIGl0cyBsaXN0cyBzaG93IG5vIHNlYXJjaCBib3guXG4gIHByaXZhdGUgX3NlcnZlclNlYXJjaGVzID0gZmFsc2U7XG5cbiAgLy8gRW1pdHMgdGhlIGlkIG9mIHRoZSBsaXN0IHdob3NlIHNlYXJjaCB0ZXh0IGNoYW5nZWQuXG4gIHByaXZhdGUgX2xpc3RTZWFyY2hDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcblxuICAvLyBFbWl0cyB0aGUgZ3JvdXAgaWQgdGhhdCBjaGFuZ2VkOyBjb21wb25lbnRzIGxpc3RlbiBmaWx0ZXJlZCB0byB0aGVpciBvd25cbiAgLy8gZ3JvdXAgaWRzLiBudWxsID0gZXZlcnl0aGluZyBjaGFuZ2VkIChyZS1pbml0KS5cbiAgcHJpdmF0ZSBfY2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXIgfCBudWxsPigpO1xuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIGFueXRoaW5nIGluIHRoZSB2aWV3ZXIgc3RhdGUgbWF5IGhhdmUgY2hhbmdlZC5cbiAgcHJpdmF0ZSBfc3RhdGVDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gQ291bnRzIHRoZSBjaGFuZ2VzIGNoYW5nZXMoKSByZXBvcnRzLiBUaGUgZ3JvdXAgdmFsdWVzLCB0aGUgZ3JhaW4gYW5kXG4gIC8vIHRoZSBsaXN0IHN0YXRlIHRoYXQgZGlmZmVyc0Zyb21EZWZhdWx0cyBjb21wYXJlcyBhcmUgdGhlIHBsYWluIGZpZWxkc1xuICAvLyBhYm92ZSwgd2hpY2ggZXZlcnkgc2V0dGVyIHJlcG9ydHMgdGhyb3VnaCBjaGFuZ2VzKCkgKHRoZXkgYXJlIHNoYXJlZFxuICAvLyB3aXRoIHRoZSBpbmxpbmUgdmFsdWVzIGJ1aWxkLCBzbyB0aGV5IHN0YXkgYXMgdGhleSBhcmUpOyB0aGlzIGNvdW50ZXIgaXNcbiAgLy8gaG93IHRoZSBjb21wdXRlZCBoZWFycyBvZiB0aGVtLiBUaGUgcGFnZSwgbWF0Y2ggYW5kIGRyaWxscyBiZWxvdyBhcmVcbiAgLy8gc2lnbmFscyBhbmRcbiAgLy8gaXMgcmVhZCBkaXJlY3RseS4gVGhlIHN1YmplY3QgaXMgdGhpcyBzZXJ2aWNlJ3Mgb3duIGFuZCBpcyBuZXZlclxuICAvLyBjb21wbGV0ZWQsIHNvIHRoZSBzaWduYWwgbGlzdGVucyB0byBpdCBleGFjdGx5IGFzIGxvbmcgYXMgdGhlIHNlcnZpY2VcbiAgLy8gbGl2ZXMuXG4gIHByaXZhdGUgX3JldmlzaW9uID0gdG9TaWduYWwodGhpcy5fc3RhdGVDaGFuZ2VkJC5waXBlKHNjYW4oKGNvdW50KSA9PiBjb3VudCArIDEsIDApKSwge1xuICAgIGluaXRpYWxWYWx1ZTogMCxcbiAgICBtYW51YWxDbGVhbnVwOiB0cnVlLFxuICB9KTtcblxuICBwcml2YXRlIF9zdGF0ZVZlcnNpb24gPSBzaWduYWwoMCk7XG5cbiAgcHJpdmF0ZSBfbGlzdFNvcnRSZXNldHMgPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCBudW1iZXI+PihuZXcgTWFwKCkpO1xuXG4gIC8vIFRoZSByZXBvcnQgaW5pdCgpIGxhc3QgcmVhZDogdGhlIHRpbGVzIGFuZCBwYWdlcyB0aGUgc3RhdGUgaXMgY2hlY2tlZFxuICAvLyBhZ2FpbnN0LlxuICBwcml2YXRlIF9yZXBvcnQgPSBzaWduYWw8UmVwb3J0IHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIG9wZW4gcGFnZSwgc2V0IGJ5IHRoZSBob3N0IGFzIHRoZSB2aWV3ZXIgbW92ZXMgYmV0d2VlbiBwYWdlcy5cbiAgcHJpdmF0ZSBfcGFnZUlkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIEhvdyB0aGUgZ3JvdXBzIGNvbWJpbmU6ICdhbGwnICh0aGUgZGVmYXVsdCkgb3IgJ2FueScuXG4gIHByaXZhdGUgX21hdGNoID0gc2lnbmFsPFJlcG9ydEZpbHRlck1hdGNoPignYWxsJyk7XG5cbiAgLy8gRWFjaCBjaGFydCdzIGRyaWxsIHBhdGgsIHRvcCBmaXJzdCwgYnkgY29tcG9uZW50IGlkLiBBIGNoYXJ0IGF0IGl0cyB0b3BcbiAgLy8gaGFzIG5vIGVudHJ5LCBhbmQgb25seSBhIGNoYXJ0IGhhcyBvbmUuXG4gIHByaXZhdGUgX2RyaWxscyA9IHNpZ25hbDxSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdPj4obmV3IE1hcCgpKTtcblxuICAvLyBFbWl0cyB0aGUgaWQgb2YgdGhlIGNoYXJ0IHdob3NlIGRyaWxsIHBhdGggY2hhbmdlZC5cbiAgcHJpdmF0ZSBfZHJpbGxDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgdGVtcG9yYXJ5IGxheWVyOiBrZXB0IGFwYXJ0IGZyb20gZXZlcnl0aGluZyBhYm92ZSwgc28gc25hcHNob3QoKVxuICAvLyBhbmQgZGlmZmVyc0Zyb21EZWZhdWx0cyBuZXZlciByZWFkIGl0LlxuICBwcml2YXRlIF90ZW1wb3JhcnkgPSBzaWduYWw8UmVwb3J0VGVtcG9yYXJ5U3RhdGU+KGVtcHR5VGVtcG9yYXJ5U3RhdGUoKSk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycyksIGFuZCBzbyBkb2VzIGEgZ3JvdXAgdGhlIHZpZXdlclxuICAvLyBjbGVhcmVkIOKAlCBVTkxFU1MgdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQgaXRzZWxmIGNoYW5nZWQsIHdoaWNoIG9ubHlcbiAgLy8gaGFwcGVucyB3aGVuIGFuIG9wZXJhdG9yIHNhdmVkIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0IHNldHRpbmdzIG9yIHRoZVxuICAvLyBhZ2VudCBzZXQgb25lLiBUaGF0IGlzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIHRvIHJlLXNlZWQsIHNvIGl0IHdpbnMgb3ZlclxuICAvLyB0aGUgc3Vydml2aW5nIHNlc3Npb24gdmFsdWU7IHdpdGhvdXQgaXQgdGhlIGJhciBrZWVwcyBzaG93aW5nIHdoYXRldmVyIGl0XG4gIC8vIHdhcyBmaXJzdCBzZWVkZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gIC8vXG4gIC8vIEEgY2hhbmdlIG9mIHRoZSByZXBvcnQncyB6b25lIG1vdmVzIFwidG9kYXlcIiwgc28gYSB2YWx1ZSBzdGlsbCBjYXJyeWluZyBpdHNcbiAgLy8gZ3JvdXAgZGVmYXVsdCdzIHByZXNldCBuYW1lIGlzIHJlc29sdmVkIGFnYWluIGluIHRoZSBuZXcgem9uZS4gQSB2YWx1ZSB0aGVcbiAgLy8gdmlld2VyIHBpY2tlZCwgb3Igb25lIGNhcnJ5aW5nIGFub3RoZXIgcHJlc2V0IG5hbWUsIGlzIGtlcHQgYXMgaXQgaXMuXG4gIHB1YmxpYyBpbml0KHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXNUaW1lem9uZSA9IHRoaXMudGltZXpvbmUoKTtcblxuICAgIC8vIFNldCBmaXJzdDogdGhlIGRlZmF1bHRzIHNlZWRlZCBiZWxvdyByZXNvbHZlIHRoZWlyIHJlbGF0aXZlIHByZXNldHMgaW4gaXQuXG4gICAgdGhpcy50aW1lem9uZS5zZXQocmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCkpO1xuICAgIHRoaXMuZm9ybWF0Q29udGV4dC5zZXQocmVzb2x2ZUZvcm1hdENvbnRleHQocmVwb3J0KSk7XG4gICAgLy8gQmVmb3JlIHRoZSBwcnVuaW5nOiBsaXN0U2VhcmNoYWJsZSByZWFkcyBpdC5cbiAgICB0aGlzLl9zZXJ2ZXJTZWFyY2hlcyA9IHJlcG9ydC5lZmZlY3RpdmVMb2NhbGUgIT09IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHRpbWV6b25lQ2hhbmdlZCA9IHByZXZpb3VzVGltZXpvbmUgIT09IHRoaXMudGltZXpvbmUoKTtcbiAgICBjb25zdCBwcmV2aW91c0dyb3VwcyA9IHRoaXMuX2dyb3VwcztcbiAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIHRoaXMuX2dyb3Vwcy5zZXQoZ3JvdXAuaWQsIGdyb3VwKTtcbiAgICAgIHRoaXMuX3NlZWQoZ3JvdXAsIHByZXZpb3VzR3JvdXBzLmdldChncm91cC5pZCkgPz8gbnVsbCwgdGltZXpvbmVDaGFuZ2VkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgdGhpcy5fcHJ1bmUocmVwb3J0KTtcbiAgICB0aGlzLl9wcnVuZVBhZ2VTdGF0ZShyZXBvcnQpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZShncm91cElkOiBudW1iZXIpOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzLmdldChncm91cElkKTtcbiAgfVxuXG4gIC8vIEEgYmFyJ3MgdmFsdWUgZm9yIGEgZ3JvdXAuIEEgZGF0ZSByYW5nZSBrZWVwcyB0aGUgc3RvcmVkIHByZXNldCBuYW1lIG9ubHlcbiAgLy8gd2hpbGUgaXRzIGRheXMgYXJlIHN0aWxsIHRoZSBzdG9yZWQgZGF5czogdGhlIGJhcnMgcmUtc2V0IGV2ZXJ5IGdyb3VwIHRoZXlcbiAgLy8gc2hvdyB3aGVuZXZlciBhbnkgb25lIG9mIHRoZW0gY2hhbmdlcywgYW5kIGFuIHVudG91Y2hlZCByb2xsaW5nIHJhbmdlIG11c3RcbiAgLy8ga2VlcCBpdHMgbmFtZSByYXRoZXIgdGhhbiB0dXJuIGludG8gdHdvIGZpeGVkIGRhdGVzLiBBbnkgb3RoZXIgcmFuZ2UsIGFcbiAgLy8gZGF0ZSBwaWNrZXIgcHJlc2V0IGluY2x1ZGVkLCBpcyBzdG9yZWQgYXMgdGhlIGZpeGVkIGRhdGVzIGl0IHNob3dzLlxuICBwdWJsaWMgc2V0VmFsdWUoZ3JvdXBJZDogbnVtYmVyLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG5cbiAgICAgIGlmICh0aGlzLl9ncm91cHMuZ2V0KGdyb3VwSWQpPy5jb25maWc/LmRlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXBJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXBJZCwgdGhpcy5fd2l0aFByZXNldCh0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpLCB2YWx1ZSkpO1xuICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXBJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEEgcmVsYXRpdmUgcHJlc2V0IG5hbWUgYXMgdG9kYXkncyByYW5nZSBpbiB0aGUgcmVwb3J0J3Mgem9uZSwgb3IgbnVsbCBmb3JcbiAgLy8gYSBuYW1lIGl0IGRvZXMgbm90IGtub3cuXG4gIHB1YmxpYyByZXNvbHZlUmVsYXRpdmUobmFtZTogc3RyaW5nKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZShuYW1lKTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgZ3JvdXAtYnkgZ3JhaW4sIG9yIG51bGwgd2hlbiB0aGUgdmlld2VyIGhhc24ndCBjaG9zZW4gb25lLlxuICBwdWJsaWMgZnJlcXVlbmN5KCk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5O1xuICB9XG5cbiAgcHVibGljIHNldEZyZXF1ZW5jeShmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gZnJlcXVlbmN5O1xuICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIHRoZSBncm91cC1ieSBncmFpbiBjaGFuZ2VzIOKAlCBldmVyeSB0aW1lLXNlcmllcyBjaGFydCBsaXN0ZW5zXG4gIC8vIHNvIGl0IHJlZmV0Y2hlcyBhbmQgcmUtYnVja2V0cyAodGhlIG92ZXJyaWRlIGlzbid0IHNjb3BlZCB0byBhbnkgZmlsdGVyXG4gIC8vIGdyb3VwLCBzbyBjaGFuZ2VzRm9yKCkgY2FuJ3QgY2FycnkgaXQpLlxuICBwdWJsaWMgZnJlcXVlbmN5Q2hhbmdlcygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5Q2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyBUaGUgc29ydCB0aGUgdmlld2VyIGxhc3QgZmV0Y2hlZCBhIGxpc3Qgd2l0aCwgb3IgbnVsbCB3aGVuIGl0IGhhc24ndCBzb3J0ZWRcbiAgLy8gKHRoZSBsaXN0IHRoZW4gZmFsbHMgYmFjayB0byBpdHMgYXV0aG9yZWQgc29ydCkuXG4gIHB1YmxpYyBsaXN0U29ydChjb21wb25lbnRJZDogbnVtYmVyKTogUmVwb3J0U29ydCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9saXN0U29ydHMuZ2V0KGNvbXBvbmVudElkKSA/PyBudWxsO1xuICB9XG5cbiAgLy8gUmVjb3JkcyBhIGxpc3QncyBzb3J0IHdoZW4gaXQgaXMgdGhlIHZpZXdlcidzIG93bjogYSBzb3J0IHRoYXQgaXMgdGhlXG4gIC8vIGxpc3QncyBhdXRob3JlZCBmaXJzdCB0ZXJtIGlzIHRoZSBsaXN0J3MgZGVmYXVsdCwgbm90IGEgY2hvaWNlLCBzbyBpdFxuICAvLyBjbGVhcnMgdGhlIGVudHJ5IGluc3RlYWQgKHRoZSBydWxlIHNuYXBzaG90KCkgYXBwbGllcykuIE90aGVyd2lzZSBhXG4gIC8vIGxpc3QncyBmaXJzdCBmZXRjaCB3b3VsZCByZWNvcmQgaXRzIHNlZWRlZCBhdXRob3JlZCB0ZXJtLCBhbmQgYSBsaXN0IHRoZVxuICAvLyBhZ2VudCByZS1zb3J0cyBsYXRlciBpbiB0aGUgc2Vzc2lvbiB3b3VsZCBrZWVwIHNlbmRpbmcgdGhlIG9sZCB0ZXJtXG4gIC8vIGZpcnN0LiBEZWxpYmVyYXRlbHkgZW1pdHMgbm8gY2hhbmdlOiB0aGUgbGlzdCBzZXRzIHRoaXMgZnJvbSB0aGUgZmV0Y2hcbiAgLy8gdGhhdCBhbHJlYWR5IHJhbiB3aXRoIHRoYXQgc29ydCwgc28gYSBub3RpZmljYXRpb24gd291bGQgb25seSBtYWtlIGl0XG4gIC8vIHJlZmV0Y2ggdGhlIHNhbWUgcm93cy4gT25seSBjaGFuZ2VzKCkgaGVhcnMgYWJvdXQgaXQuXG4gIHB1YmxpYyBzZXRMaXN0U29ydChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgc29ydDogUmVwb3J0U29ydCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoc29ydCAmJiAhc2FtZVNvcnQoc29ydCwgbGlzdFNvcnRUZXJtcyhjb21wb25lbnQuY29uZmlnKVswXSA/PyBudWxsKSkge1xuICAgICAgdGhpcy5fbGlzdFNvcnRzLnNldChjb21wb25lbnQuaWQsIHNvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudC5pZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgdGV4dCBhIGxpc3QgaXMgc2VhcmNoZWQgYnksIG9yIG51bGwgd2hlbiBpdHMgc2VhcmNoIGJveCBpcyBlbXB0eS5cbiAgcHVibGljIGxpc3RTZWFyY2goY29tcG9uZW50SWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudElkKSA/PyBudWxsO1xuICB9XG5cbiAgLy8gV2hldGhlciBhIGxpc3Qgc2hvd3MgdGhlIHNlYXJjaCBib3ggb3ZlciBpdHMgdGV4dCBjb2x1bW5zOiBpdCBkb2VzIHdoZW4gdGhlXG4gIC8vIHNlcnZlciBhbnN3ZXJzIGEgbGlzdCBzZWFyY2ggKHNlZSBfc2VydmVyU2VhcmNoZXMpLCB1bmxlc3Mgb25lIG9mIGl0cyBsaXZlXG4gIC8vIGZpbHRlcnMgYmVsb25ncyB0byBhIGtleXdvcmQgZ3JvdXAgaXRzIGhlYWRlciBzaG93cy4gQSBiYXIgc2hvd3Mgb25lIHNlYXJjaFxuICAvLyBib3ggKGl0cyBsYXN0IGtleXdvcmQgaXRlbSksIGFuZCB0aGF0IG9uZSBpcyB0aGUgYXV0aG9yJ3MuIFRoZSBoZWFkZXIsIHRoZVxuICAvLyBwcnVuaW5nLCB0aGUgZGF0YSByZXF1ZXN0IHN0YXRlIGFuZCB0aGUgZXhwb3J0cyBhbGwgcmVhZFxuICAvLyB0aGlzIG9uZSBydWxlLCBzbyBubyBzZWFyY2ggbmFycm93cyBhIGxpc3Qgd2hvc2Ugc2NyZWVuIGhhcyBubyBib3ggc2hvd2luZ1xuICAvLyBpdCwgYW5kIG5vIGV4cG9ydCB0aXRsZXMgYSBzZWFyY2ggdGhlIHNlcnZlciBkaWQgbm90IGFwcGx5LlxuICBwdWJsaWMgbGlzdFNlYXJjaGFibGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VydmVyU2VhcmNoZXNcbiAgICAgICYmIGNvbXBvbmVudC50eXBlID09PSAnbGlzdCdcbiAgICAgICYmICEoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLnNvbWUoKGZpbHRlcikgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuX2dyb3Vwcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuXG4gICAgICAgIHJldHVybiBmaWx0ZXIuZW5hYmxlZFxuICAgICAgICAgICYmICF0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlci5pZClcbiAgICAgICAgICAmJiBncm91cD8udHlwZSA9PT0gJ2tleXdvcmQnXG4gICAgICAgICAgJiYgKGdyb3VwLmxldmVsID09PSAnY29tcG9uZW50JyB8fCBncm91cC5sZXZlbCA9PT0gJ2JvdGgnKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gUmVjb3JkcyBhIGxpc3QncyBzZWFyY2ggYm94IHRleHQgKGxpc3RTZWFyY2hUZXh0KTsgYW4gZW1wdHkgYm94IGNsZWFyc1xuICAvLyBpdC4gVGhlIGhlYWRlciBjYWxscyB0aGlzIG9uIGV2ZXJ5IGNoYW5nZSBvZiBhbnkgb2YgaXRzIGl0ZW1zLCBzbyB0aGVcbiAgLy8gbGlzdCBhbmQgY2hhbmdlcygpIGhlYXIgYWJvdXQgaXQgb25seSB3aGVuIHRoZSBzdG9yZWQgdGV4dCBhY3R1YWxseSBjaGFuZ2VkLlxuICBwdWJsaWMgc2V0TGlzdFNlYXJjaChjb21wb25lbnRJZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZWFyY2ggPSBsaXN0U2VhcmNoVGV4dCh0ZXh0KTtcblxuICAgIGlmIChzZWFyY2ggPT09ICh0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudElkKSA/PyAnJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoKSB7XG4gICAgICB0aGlzLl9saXN0U2VhcmNoZXMuc2V0KGNvbXBvbmVudElkLCBzZWFyY2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0U2VhcmNoZXMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0U2VhcmNoQ2hhbmdlZCQubmV4dChjb21wb25lbnRJZCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgY29uZmlnIGNvbHVtbiBuYW1lcyBhIHZpZXdlciBoaWQgb24gYSBsaXN0OyBub25lIHdoZW4gaXQgc2hvd3MgdGhlbSBhbGwuXG4gIHB1YmxpYyBoaWRkZW5Db2x1bW5zKGNvbXBvbmVudElkOiBudW1iZXIpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdEhpZGRlbigpLmdldChjb21wb25lbnRJZCkgPz8gW107XG4gIH1cblxuICAvLyBSZWNvcmRzIHRoZSBjb2x1bW5zIGEgdmlld2VyIGhpZCBvbiBhIGxpc3QsIGtlcHQgdG8gbGlzdEhpZGRlbkNvbHVtbnM6XG4gIC8vIG5hbWVzIHRoZSBsaXN0IGNhbm5vdCBoaWRlIGFyZSBkcm9wcGVkLCBhbmQgbm9uZSAob3IgZXZlcnkgY29sdW1uKSBjbGVhcnNcbiAgLy8gdGhlIGVudHJ5LiBPbmx5IGNoYW5nZXMoKSBoZWFycyBhYm91dCBpdCwgYW5kIG9ubHkgb24gYSByZWFsIGNoYW5nZS5cbiAgcHVibGljIHNldEhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQ6IG51bWJlciwgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgaGlkZGVuID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBuYW1lcyk7XG5cbiAgICBpZiAoc2FtZU5hbWVzKGhpZGRlbiwgdGhpcy5oaWRkZW5Db2x1bW5zKGNvbXBvbmVudElkKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLmxpc3RIaWRkZW4oKSk7XG5cbiAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgbmV4dC5zZXQoY29tcG9uZW50SWQsIGhpZGRlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RIaWRkZW4uc2V0KG5leHQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgb25lIGxpc3QncyBzZWFyY2ggdGV4dCBjaGFuZ2VzLCBzbyB0aGF0IGxpc3QgcmVmZXRjaGVzLlxuICBwdWJsaWMgbGlzdFNlYXJjaENoYW5nZXMoY29tcG9uZW50SWQ6IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9saXN0U2VhcmNoQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoaWQpID0+IGlkID09PSBjb21wb25lbnRJZCksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIHRoZSB2aWV3ZXIgc3RhdGUgbWF5IGhhdmUgY2hhbmdlZDogYSBncm91cCB2YWx1ZSwgdGhlXG4gIC8vIGdyYWluLCB0aGUgbWF0Y2gsIHRoZSBwYWdlLCBhIGxpc3Qgc29ydCwgc2VhcmNoIG9yIGhpZGRlbiBjb2x1bW5zLCBhXG4gIC8vIGRyaWxsIHBhdGgsIGEgcmVzZXQgb3IgYSAocmUpbG9hZCBvZiB0aGUgcmVwb3J0LlxuICBwdWJsaWMgY2hhbmdlcygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVDaGFuZ2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZpbHRlckRpc2FibGVkKGZpbHRlcklkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIsIGdyb3VwSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlcklkKSkge1xuICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmRlbGV0ZShmaWx0ZXJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5hZGQoZmlsdGVySWQpO1xuICAgIH1cblxuICAgIC8vIFR1cm5pbmcgYSBrZXl3b3JkIGZpbHRlciBiYWNrIG9uIHRha2VzIGl0cyBsaXN0J3Mgc2VhcmNoIGJveCBhd2F5LCBhbmRcbiAgICAvLyB0aGUgc2VhcmNoIHdpdGggaXQuIFRoZSBsaXN0IHJlZmV0Y2hlcyBvbiB0aGUgZ3JvdXAgY2hhbmdlIGJlbG93LlxuICAgIHRoaXMuX2Ryb3BVbnNlYXJjaGFibGUoKTtcblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBOb3RpZmljYXRpb25zIHJlbGV2YW50IHRvIE9ORSBjb21wb25lbnQ6IGFueSBjaGFuZ2UgdG8gYSBncm91cCBvbmUgb2YgaXRzXG4gIC8vIGZpbHRlcnMgYmVsb25ncyB0byAob3IgYSBmdWxsIHJlLWluaXQpLlxuICBwdWJsaWMgY2hhbmdlc0Zvcihjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdyb3VwSWRzID0gbmV3IFNldCgoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyR3JvdXBJZCkpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGdyb3VwSWQpID0+IGdyb3VwSWQgPT09IG51bGwgfHwgZ3JvdXBJZHMuaGFzKGdyb3VwSWQpKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBOb3RpZmljYXRpb25zIHJlbGV2YW50IHRvIEFOWSBvZiBhIHNldCBvZiBjb21wb25lbnRzIHRoYXQgY29tZXMgYW5kIGdvZXNcbiAgLy8gKGEgcGFnZSdzIHZhbHVlcyk6IGEgY2hhbmdlIHRvIGEgZ3JvdXAgb25lIG9mIHRoZWlyIGZpbHRlcnMgYmVsb25ncyB0by5cbiAgLy8gVW5saWtlIGNoYW5nZXNGb3IsIHRoZSBzZXQgaXMgcmVhZCBvbiBlYWNoIGV2ZW50IHJhdGhlciB0aGFuIGNhcHR1cmVkIGF0XG4gIC8vIHN1YnNjcmliZSwgc28gb25lIHN1YnNjcmlwdGlvbiBmb2xsb3dzIHRoZSBzZXQgYXMgdGhlIHJlcG9ydCByZWxvYWRzLiBBXG4gIC8vIGZ1bGwgcmUtaW5pdCAobnVsbCkgaXMgbm90IHBhc3NlZCBvbjogaW5pdCgpIHJ1bnMgb24gYSByZXBvcnRcbiAgLy8gKHJlKWxvYWQsIGFuZCBhIGNhbGxlciBvZiB0aGlzIGNoZWNrcyBvbiB0aGF0IHJlbG9hZCBpdHNlbGYgd2hldGhlciB0aGVcbiAgLy8gZmlsdGVyIHZhbHVlcyBpdHMgY29tcG9uZW50cyBhcmUgcmVhZCB3aXRoIG1vdmVkLlxuICBwdWJsaWMgY2hhbmdlc0ZvckFueShjb21wb25lbnRzOiAoKSA9PiBSZXBvcnRDb21wb25lbnRbXSk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGdyb3VwSWQpOiBncm91cElkIGlzIG51bWJlciA9PiBncm91cElkICE9PSBudWxsXG4gICAgICAgICAgJiYgY29tcG9uZW50cygpLnNvbWUoKGNvbXBvbmVudCkgPT4gKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKVxuICAgICAgICAgICAgLnNvbWUoKGZpbHRlcikgPT4gZmlsdGVyLmZpbHRlckdyb3VwSWQgPT09IGdyb3VwSWQpKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGhlIGdyb3VwIHZhbHVlcyByZXNvbHZlZCBpbnRvIHRoaXMgY29tcG9uZW50J3MgbWVtYmVyLWZpbHRlciB2YWx1ZXMg4oCUXG4gIC8vIHdoYXQgdGhlIGRhdGEgcmVxdWVzdCBjYXJyaWVzLiBEaXNhYmxlZCBmaWx0ZXJzIChhdXRob3JlZCBvciBzZXNzaW9uKSBhcmVcbiAgLy8gc2tpcHBlZCBlbnRpcmVseS5cbiAgcHVibGljIHJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHJlc29sdmVkOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKSB7XG4gICAgICBpZiAoIWZpbHRlci5lbmFibGVkIHx8IHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHZhbHVlID8gdGhpcy5fcmVzb2x2ZWRGaWVsZHModmFsdWUpIDogbnVsbDtcblxuICAgICAgaWYgKGZpZWxkcykge1xuICAgICAgICByZXNvbHZlZC5wdXNoKHsgZmlsdGVySWQ6IGZpbHRlci5pZCwgLi4uZmllbGRzIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuXG4gIC8vIFdoYXQgdGhlIHZpZXdlciBoYXMgc2V0LCBvbmUgZW50cnkgcGVyIGZpbHRlciBncm91cCwgZm9yIHRoZSByZXBvcnQgY2hhdDpcbiAgLy8gdGhlIGFnZW50IHJlYWRzIGl0IHRvIGtub3cgd2hhdCBpcyBvbiBzY3JlZW4uIEdyb3VwIG9yZGVyLCBub3QgdGhlIG9yZGVyXG4gIC8vIHRoZSB2YWx1ZXMgd2VyZSBzZXQgaW4sIHNvIHRoZSBzYW1lIHN0YXRlIGFsd2F5cyByZWFkcyB0aGUgc2FtZS4gQSBncm91cFxuICAvLyB3aXRoIG5vdGhpbmcgaW4gaXQgaXMgbGVmdCBvdXQsIGFuZCBhIHNhdmVkIGRlZmF1bHQgY291bnRzIHVudGlsIHRoZVxuICAvLyB2aWV3ZXIgY2hhbmdlcyBpdC4gUGVyLWZpbHRlciB0b2dnbGVzIGFyZSBhIGNvbXBvbmVudCdzIG93biBidXNpbmVzcywgc29cbiAgLy8gdGhleSBhcmUgbm90IHBhcnQgb2YgaXQuXG4gIHB1YmxpYyB2aWV3ZXJGaWx0ZXJzKCk6IFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl92YWx1ZXMuZW50cmllcygpXVxuICAgICAgLnNvcnQoKFthXSwgW2JdKSA9PiBhIC0gYilcbiAgICAgIC5tYXAoKFtncm91cElkLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5fcmVzb2x2ZWRGaWVsZHModmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBmaWVsZHMgPyB7IGdyb3VwSWQsIC4uLmZpZWxkcyB9IDogbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXIgPT4gZW50cnkgIT09IG51bGwpO1xuICB9XG5cbiAgLy8gRXZlcnkgdGlsZSdzIHJlc29sdmVkIHZhbHVlcyBpbiBvbmUgYXJyYXkg4oCUIHdoYXQgYSByZXBvcnQtbGV2ZWwgZXhwb3J0XG4gIC8vIGNhcnJpZXMgc28gZWFjaCBmaWxlIGluIHRoZSBhcmNoaXZlIGlzIGZpbHRlcmVkIGV4YWN0bHkgYXMgdGhlIHNjcmVlbiBpcy5cbiAgLy8gRmlsdGVyIGlkcyBhcmUgdW5pcXVlIHBlciBjb21wb25lbnQsIHNvIHRoZSBiYWNrZW5kIHBpY2tzIGVhY2ggY29tcG9uZW50J3NcbiAgLy8gb3duIG91dCBvZiB0aGUgcGlsZS4gT25seSBhIHRpbGUgYmVjb21lcyBhIGZpbGUgKGlzVGlsZSksIHNvIG5vIG90aGVyXG4gIC8vIGNvbXBvbmVudCdzIGVudHJpZXMgcmlkZSBhbG9uZy4gQSBwYWdlIGlkIG5hcnJvd3MgaXQgdG8gdGhhdCBwYWdlLlxuICBwdWJsaWMgcmVzb2x2ZUZvclJlcG9ydChyZXBvcnQ6IFJlcG9ydCwgcGFnZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSB7XG4gICAgY29uc3QgcGFnZXMgPSAocmVwb3J0LnBhZ2VzID8/IFtdKVxuICAgICAgLmZpbHRlcigocGFnZSkgPT4gIXBhZ2VJZCB8fCBwYWdlLmlkID09PSBwYWdlSWQpO1xuXG4gICAgcmV0dXJuIHBhZ2VzXG4gICAgICAuZmxhdE1hcCgocGFnZSkgPT4gKHBhZ2UuY29tcG9uZW50cyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigoY29tcG9uZW50KSA9PiBpc1RpbGUoY29tcG9uZW50KSlcbiAgICAgICAgLmZsYXRNYXAoKGNvbXBvbmVudCkgPT4gdGhpcy5yZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudCkpKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQYWdlKHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChwYWdlSWQgPT09IHRoaXMuX3BhZ2VJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGFnZUlkLnNldChwYWdlSWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSBjaGFuZ2Ugb2YgbWF0Y2ggY2FuIGNoYW5nZSBldmVyeSB0aWxlIGEgZ3JvdXAgd2l0aCBhIHZhbHVlIG5hcnJvd3MsIHNvXG4gIC8vIGV2ZXJ5IHRpbGUgaGVhcnMgYWJvdXQgaXQuXG4gIHB1YmxpYyBzZXRNYXRjaChtYXRjaDogUmVwb3J0RmlsdGVyTWF0Y2gpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0OiBSZXBvcnRGaWx0ZXJNYXRjaCA9IG1hdGNoID09PSAnYW55JyA/ICdhbnknIDogJ2FsbCc7XG4gICAgaWYgKG5leHQgPT09IHRoaXMuX21hdGNoKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXRjaC5zZXQobmV4dCk7XG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEEgY2hhcnQncyBkcmlsbCBwYXRoLCB0b3AgZmlyc3Q7IGVtcHR5IHdoaWxlIHRoZSBjaGFydCBpcyBhdCBpdHMgdG9wLlxuICAvLyBJdCByZWFkcyBhIHNpZ25hbCwgc28gYSB0ZW1wbGF0ZSB0aGF0IHNob3dzIGl0IHJlcGFpbnRzIHdoZW4gaXQgbW92ZXMuXG4gIHB1YmxpYyBkcmlsbChjb21wb25lbnRJZDogbnVtYmVyKTogcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10ge1xuICAgIHJldHVybiB0aGlzLl9kcmlsbHMoKS5nZXQoY29tcG9uZW50SWQpID8/IFtdO1xuICB9XG5cbiAgLy8gUmVjb3JkcyBhIGNoYXJ0J3MgZHJpbGwgcGF0aCwga2VwdCB0byBjbGVhbkRyaWxsUGF0aDsgYW4gZW1wdHkgcGF0aCBpc1xuICAvLyB0aGUgY2hhcnQncyB0b3AuIE9ubHkgYSBjaGFydCBvZiB0aGUgb3BlbiByZXBvcnQgZHJpbGxzOiBhIHBhdGggZm9yIGFueVxuICAvLyBvdGhlciBjb21wb25lbnQgaXMgaWdub3JlZC4gT25seSB0aGF0IGNoYXJ0IGFuZCBjaGFuZ2VzKCkgaGVhciBhYm91dCBpdCxcbiAgLy8gYW5kIG9ubHkgb24gYSByZWFsIGNoYW5nZS5cbiAgcHVibGljIHNldERyaWxsKGNvbXBvbmVudElkOiBudW1iZXIsIHBhdGg6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdKTogdm9pZCB7XG4gICAgY29uc3Qga2VwdCA9IGNsZWFuRHJpbGxQYXRoKHBhdGgpO1xuICAgIGlmICghdGhpcy5faXNDaGFydChjb21wb25lbnRJZCkgfHwgc2FtZURyaWxsUGF0aChrZXB0LCB0aGlzLmRyaWxsKGNvbXBvbmVudElkKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXREcmlsbFBhdGgoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgIHRoaXMuX2RyaWxsQ2hhbmdlZCQubmV4dChjb21wb25lbnRJZCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciBvbmUgY2hhcnQncyBkcmlsbCBwYXRoIGNoYW5nZXMsIHNvIHRoYXQgY2hhcnQgcmVmZXRjaGVzLlxuICBwdWJsaWMgZHJpbGxDaGFuZ2VzKGNvbXBvbmVudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZHJpbGxDaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChpZCkgPT4gaWQgPT09IGNvbXBvbmVudElkKSxcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGFrZXMgdGhlIGRyaWxsIHBhdGggYSBjaGFydCdzIGFuc3dlciBhcHBsaWVkIGFzIHRoZSBjaGFydCdzIG93bjogdGhlXG4gIC8vIHNlcnZlciBrZWVwcyB0aGUgbG9uZ2VzdCBwYXJ0IG9mIGEgc2VudCBwYXRoIGl0IGNhbiBhcHBseSwgc28gYSBsYXRlclxuICAvLyBzYXZlIGhvbGRzIHRoYXQgcGFydCBvbmx5LiBUaGUgY2hhcnQgaGFzIGp1c3QgcmVhZCB0aGF0IHBhdGgsIHNvIG9ubHlcbiAgLy8gY2hhbmdlcygpIGhlYXJzIGFib3V0IGl0LiBUcnVlIHdoZW4gdGhlIHBhdGggY2hhbmdlZC5cbiAgcHVibGljIGFkb3B0RHJpbGwoY29tcG9uZW50SWQ6IG51bWJlciwgcGF0aDogcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBrZXB0ID0gY2xlYW5EcmlsbFBhdGgocGF0aCk7XG4gICAgaWYgKCF0aGlzLl9pc0NoYXJ0KGNvbXBvbmVudElkKSB8fCBzYW1lRHJpbGxQYXRoKGtlcHQsIHRoaXMuZHJpbGwoY29tcG9uZW50SWQpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuX3NldERyaWxsUGF0aChjb21wb25lbnRJZCwga2VwdCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFRoZSBkdXJhYmxlIHN0YXRlIG9uIHNjcmVlbiBhcyBvbmUgZG9jdW1lbnQ6IHRoZSBwYWdlLCBldmVyeSBncm91cCB0aGVcbiAgLy8gcmVwb3J0IGhhcyAobnVsbCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcsIGEgY2xlYXJlZCBkZWZhdWx0IGluY2x1ZGVkKSwgdGhlXG4gIC8vIG1hdGNoLCB0aGUgZ3JhaW4sIGFuZCBlYWNoIHRpbGUncyBzb3J0LCBzZWFyY2gsIGhpZGRlbiBjb2x1bW5zIGFuZCBkcmlsbFxuICAvLyBwYXRoIHdoZXJlIHRoZXkgZGlmZmVyIGZyb20gdGhlIGF1dGhvcmVkIHRpbGUuIEEgZGF0ZSByYW5nZSB0aGF0IHN0aWxsXG4gIC8vIGNhcnJpZXMgaXRzIHJlbGF0aXZlIHByZXNldCBpcyB3cml0dGVuIGFzIHRoYXQgcHJlc2V0LCB3aGF0ZXZlciB0b2RheSBpc1xuICAvLyAodG9TdG9yZWRHcm91cFZhbHVlKS4gVGhlIHRlbXBvcmFyeSBsYXllciBpcyBuZXZlciBwYXJ0IG9mIGl0LlxuICBwdWJsaWMgc25hcHNob3QoKTogUmVwb3J0U3RhdGVTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFJlcG9ydFN0YXRlU25hcHNob3QgPSB7fTtcblxuICAgIGlmICh0aGlzLl9wYWdlSWQoKSkge1xuICAgICAgc25hcHNob3QucGFnZUlkID0gdGhpcy5fcGFnZUlkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZyZXF1ZW5jeSkge1xuICAgICAgc25hcHNob3QuZ3JvdXBCeSA9IHRoaXMuX2ZyZXF1ZW5jeTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWF0Y2goKSA9PT0gJ2FueScpIHtcbiAgICAgIHNuYXBzaG90Lm1hdGNoID0gJ2FueSc7XG4gICAgfVxuXG4gICAgc25hcHNob3QuZ3JvdXBzID0gdGhpcy5fc25hcHNob3RHcm91cHMoKTtcblxuICAgIGNvbnN0IHRpbGVzID0gdGhpcy5fc25hcHNob3RUaWxlcygpO1xuICAgIGlmIChPYmplY3Qua2V5cyh0aWxlcykubGVuZ3RoKSB7XG4gICAgICBzbmFwc2hvdC50aWxlcyA9IHRpbGVzO1xuICAgIH1cblxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQncyBhdXRob3JlZCBkZWZhdWx0cyBhcyBhIHNuYXBzaG90OiBldmVyeSBncm91cCBhdCBpdHMgYXV0aG9yZWRcbiAgLy8gZGVmYXVsdCAobnVsbCB3aGVuIGl0IGhhcyBub25lKSwgbm8gbWF0Y2gsIGdyYWluIG9yIHRpbGUgc3RhdGUuXG4gIHB1YmxpYyBhdXRob3JlZENvbmZpZygpOiBSZXBvcnRTdGF0ZVNuYXBzaG90IHtcbiAgICBjb25zdCBncm91cHM6IFJlY29yZDxudW1iZXIsIEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGw+ID0ge307XG5cbiAgICB0aGlzLl9ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGdyb3Vwc1tncm91cC5pZF0gPSB0b1N0b3JlZEdyb3VwVmFsdWUoZ3JvdXAudHlwZSwgdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBncm91cHMgfTtcbiAgfVxuXG4gIC8vIFB1dHMgdGhlIHNjcmVlbiBiYWNrIG9uIHRoZSByZXBvcnQncyBhdXRob3JlZCBkZWZhdWx0cyBvbiB0aGUgcGFnZSBpdCBpc1xuICAvLyBvbjogZXZlcnkgZ3JvdXAgYXQgaXRzIGRlZmF1bHQsIG1hdGNoICdhbGwnLCBubyBncmFpbiwgYW5kIGV2ZXJ5IHRpbGUgYXRcbiAgLy8gaXRzIGF1dGhvcmVkIHNvcnQsIHNlYXJjaCwgY29sdW1ucyBhbmQgdG9wLiBDbGVhcnMgdGhlIHRlbXBvcmFyeSBsYXllci5cbiAgLy8gVGhlIHRpbGVzIHN0YXkgYW5kIHJlbG9hZCBpbiBwbGFjZSwgZXhjZXB0IGEgbGlzdCB3aG9zZSBzb3J0IHRoaXMgbW92ZWRcbiAgLy8gKGxpc3RTb3J0UmVzZXRzKS4gRXZlcnkgY2hhbmdlIGlzIGFubm91bmNlZCBvbmNlLCBhdCB0aGUgZW5kLlxuICBwdWJsaWMgcmVzZXRUb0RlZmF1bHRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZyZXF1ZW5jeTtcbiAgICBjb25zdCBzb3J0cyA9IG5ldyBNYXAodGhpcy5fbGlzdFNvcnRzKTtcblxuICAgIHRoaXMuX3RlbXBvcmFyeS5zZXQoZW1wdHlUZW1wb3JhcnlTdGF0ZSgpKTtcbiAgICB0aGlzLl9ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHRoaXMuX3NlZWRBdXRob3JlZChncm91cCkpO1xuICAgIHRoaXMuX21hdGNoLnNldCgnYWxsJyk7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gbnVsbDtcbiAgICB0aGlzLl9jbGVhclRpbGVzKCk7XG4gICAgdGhpcy5fY291bnRTb3J0UmVzZXRzKHNvcnRzKTtcbiAgICB0aGlzLl9ub3RpZnlSZXNldChmcmVxdWVuY3kpO1xuICB9XG5cbiAgLy8gUHV0cyBvbmx5IGBncm91cElkc2AgYmFjayBvbiB0aGVpciBhdXRob3JlZCBkZWZhdWx0cy4gQSB0aWxlIGhlYWRlcidzXG4gIC8vICdDbGVhciBmaWx0ZXJzJyBvd25zIG9ubHkgaXRzIG93biBncm91cHM7IHRoZSByZXBvcnQgYmFyJ3MgY2FsbHNcbiAgLy8gcmVzZXRUb0RlZmF1bHRzKCkuIEVhY2ggZ3JvdXAgaXMgYW5ub3VuY2VkIGFzIGEgdmlld2VyJ3MgY2hhbmdlIHRvIGl0IGlzLFxuICAvLyBzbyB0aGUgdGlsZXMgaW4gaXQgcmVmZXRjaCBhbmQgYSBiYXIgc2hvd2luZyBpdCB3aXRoIGFub3RoZXIgdmFsdWUgaXNcbiAgLy8gYnVpbHQgYWdhaW4uXG4gIHB1YmxpYyByZXNldEdyb3Vwc1RvRGVmYXVsdHMoZ3JvdXBJZHM6IHJlYWRvbmx5IG51bWJlcltdKTogdm9pZCB7XG4gICAgZ3JvdXBJZHMuZm9yRWFjaCgoZ3JvdXBJZCkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9ncm91cHMuZ2V0KGdyb3VwSWQpO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NlZWRBdXRob3JlZChncm91cCk7XG4gICAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBXaGV0aGVyIG9uZSBvZiBgZ3JvdXBJZHNgIHNob3dzIGEgdmFsdWUgb3RoZXIgdGhhbiBpdHMgYXV0aG9yZWQgZGVmYXVsdCxcbiAgLy8gdGhlIHZhbHVlIHJlc2V0R3JvdXBzVG9EZWZhdWx0cygpIHB1dHMgYmFjay4gQSB0aWxlIGhlYWRlcidzIENsZWFyIGNoaXBcbiAgLy8gc2hvd3MgZXhhY3RseSB3aGlsZSBvbmUgb2YgaXRzIG93biBncm91cHMgZG9lcy4gSXQgcmVhZHMgdGhlIHJldmlzaW9uXG4gIC8vIGRpZmZlcnNGcm9tRGVmYXVsdHMgcmVhZHMsIHNvIGEgY2FsbGVyIG9uIGVhY2ggY2hlY2sgb2YgYW4gT25QdXNoIHZpZXdcbiAgLy8gc3RheXMgY3VycmVudC5cbiAgcHVibGljIGdyb3Vwc0RpZmZlckZyb21EZWZhdWx0cyhncm91cElkczogcmVhZG9ubHkgbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICB0aGlzLl9yZXZpc2lvbigpO1xuXG4gICAgcmV0dXJuIGdyb3VwSWRzLnNvbWUoKGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRob3JlZCA9IHRvU3RvcmVkR3JvdXBWYWx1ZShncm91cC50eXBlLCB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApKTtcbiAgICAgIGNvbnN0IHNjcmVlbiA9IHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwSWQpID8gbnVsbCA6IHRvU3RvcmVkR3JvdXBWYWx1ZShncm91cC50eXBlLCB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpKTtcblxuICAgICAgcmV0dXJuICFzYW1lU3RvcmVkR3JvdXBWYWx1ZShhdXRob3JlZCwgc2NyZWVuKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBpbnRlcmFjdGlvbiBzdGF0ZSBhIHRpbGUncyBkYXRhIHJlcXVlc3QgY2FycmllcyBub3c6IHRpbGVEYXRhU3RhdGVcbiAgLy8gb3ZlciB0aGUgb3BlbiByZXBvcnQgYW5kIHRoZSBzY3JlZW4ncyBzbmFwc2hvdCgpLlxuICBwdWJsaWMgdGlsZVN0YXRlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogQ29tcG9uZW50RGF0YVN0YXRlIHtcbiAgICByZXR1cm4gdGlsZURhdGFTdGF0ZSh0aGlzLl9yZXBvcnQoKSwgY29tcG9uZW50LCB0aGlzLnNuYXBzaG90KCkpO1xuICB9XG5cbiAgLy8gVGhlIHJlbGF0aXZlIHJhbmdlIGEgZ3JvdXAncyB2YWx1ZSBzdGlsbCBpcywgYXMgYSBkYXRhIHJlcXVlc3QgbmFtZXMgaXRcbiAgLy8gKGl0cyBwcmVzZXQgd2hpbGUgaXRzIGRheXMgYXJlIHRoYXQgcmFuZ2UgcmVzb2x2ZWQgdG9kYXkpLCBvciBudWxsLiBUaGVcbiAgLy8gZXhwb3J0IHdvcmRpbmcgbmFtZXMgYSBsaXZlIHByZXNldCBieSBpdC5cbiAgcHVibGljIGxpdmVQcmVzZXQoZ3JvdXBJZDogbnVtYmVyKTogUmVwb3J0UmVsYXRpdmVSYW5nZSB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cElkKTtcblxuICAgIHJldHVybiB2YWx1ZSA/IHRoaXMuX2xpdmVQcmVzZXQodmFsdWUpIDogbnVsbDtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAgdmFsdWUgYXMgdGhlIGZpZWxkcyBhIHJlcXVlc3QgY2FycmllczogZGF0ZSBib3VuZHMgYXMgY2FsZW5kYXJcbiAgLy8gZGF5cywgc2VsZWN0IHZhbHVlcyB3aGVuIGFueSBhcmUgcGlja2VkIChlbHNlIHRoZSB2YWx1ZXMgbGVmdCBvdXQpLFxuICAvLyBrZXl3b3JkIHRleHQgdHJpbW1lZCwgYSBudW1iZXIgcmFuZ2UncyBlbmRzLiBOdWxsIHdoZW4gYWxsIG9mIHRoZW0gYXJlXG4gIC8vIGVtcHR5LiBBIGRhdGUgcmFuZ2UgYWxzbyBuYW1lcyB0aGUgcmVsYXRpdmUgcmFuZ2UgaXQgc3RpbGwgaXNcbiAgLy8gKF9saXZlUHJlc2V0KSwgc28gdGhlIHNlcnZlciBrbm93cyB3aGljaCBwZXJpb2QgdGhlIGRheXMgY292ZXI7XG4gIC8vIHRoZSBkYXlzIHN0YXkgdGhlIHdpbmRvdyBlaXRoZXIgd2F5LiBDb21wb25lbnQgZGF0YSwgdGhlIHJlcG9ydCBhbmQgcGFnZVxuICAvLyBleHBvcnRzIGFuZCB0aGUgY2hhdCdzIHZpZXdlciBmaWx0ZXJzIGFsbCByZWFkIHRoZWlyIGZpZWxkcyBoZXJlLCBzbyBhbGxcbiAgLy8gdGhyZWUgY2FycnkgaXQuXG4gIHByaXZhdGUgX3Jlc29sdmVkRmllbGRzKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogT21pdDxSZXNvbHZlZEZpbHRlclZhbHVlLCAnZmlsdGVySWQnPiB8IG51bGwge1xuICAgIGNvbnN0IGZpZWxkczogT21pdDxSZXNvbHZlZEZpbHRlclZhbHVlLCAnZmlsdGVySWQnPiA9IHt9O1xuICAgIGNvbnN0IHByZXNldCA9IHRoaXMuX2xpdmVQcmVzZXQodmFsdWUpO1xuXG4gICAgaWYgKHZhbHVlLnN0YXJ0KSB7XG4gICAgICBmaWVsZHMuc3RhcnQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuc3RhcnQpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuZW5kKSB7XG4gICAgICBmaWVsZHMuZW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLmVuZCk7XG4gICAgfVxuICAgIGlmIChwcmVzZXQpIHtcbiAgICAgIGZpZWxkcy5wcmVzZXQgPSBwcmVzZXQ7XG4gICAgfVxuICAgIGlmICh2YWx1ZS52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgZmllbGRzLnZhbHVlcyA9IHZhbHVlLnZhbHVlcztcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlPy50cmltKCkpIHtcbiAgICAgIGZpZWxkcy52YWx1ZSA9IHZhbHVlLnZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvbHZlRXhjbHVkZUFuZFJhbmdlKHZhbHVlLCBmaWVsZHMpO1xuXG4gICAgcmV0dXJuIGZpZWxkcy5zdGFydCB8fCBmaWVsZHMuZW5kIHx8IGZpZWxkcy52YWx1ZXMgfHwgZmllbGRzLnZhbHVlXG4gICAgICB8fCBmaWVsZHMuZXhjbHVkZVZhbHVlcyB8fCBmaWVsZHMubWluICE9PSB1bmRlZmluZWQgfHwgZmllbGRzLm1heCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGZpZWxkc1xuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLy8gVGhlIHJlbGF0aXZlIHJhbmdlIGEgZGF0ZSB2YWx1ZSBzdGlsbCBpczogdGhlIHByZXNldCBuYW1lIGl0IGNhcnJpZXMsXG4gIC8vIHdoaWxlIGl0cyBkYXlzIGFyZSB0aGF0IHJhbmdlIHJlc29sdmVkIHRvZGF5IGluIHRoZSByZXBvcnQncyB6b25lLiBBXG4gIC8vIHZhbHVlIHdob3NlIGRheXMgdGhlIHZpZXdlciBjaGFuZ2VkLCBvciBvbmUgc2VlZGVkIGJlZm9yZSBtaWRuaWdodCB0aGF0XG4gIC8vIGlzIG5vdyBhIGRheSBiZWhpbmQsIG5hbWVzIG5vbmUsIGFuZCB0aGUgc2VydmVyIHJlYWRzIGl0cyBkYXlzIGFsb25lLlxuICBwcml2YXRlIF9saXZlUHJlc2V0KHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogUmVwb3J0UmVsYXRpdmVSYW5nZSB8IG51bGwge1xuICAgIGlmICghdmFsdWUucHJlc2V0IHx8ICFpc1JlbGF0aXZlUmFuZ2UodmFsdWUucHJlc2V0KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yZWxhdGl2ZVJhbmdlKHZhbHVlLnByZXNldCk7XG5cbiAgICByZXR1cm4gcmFuZ2UgJiYgc2FtZURheXModmFsdWUsIHJhbmdlKSA/IHZhbHVlLnByZXNldCA6IG51bGw7XG4gIH1cblxuICAvLyBTZWVkcyBvbmUgZ3JvdXAgb24gKHJlKWxvYWQ7IHNlZSBpbml0KCkuIGBwcmV2aW91c2AgaXMgdGhlIGdyb3VwIGFzIHRoZVxuICAvLyBsYXN0IGxvYWQgaGFkIGl0LCBvciBudWxsIHdoZW4gaXQgaXMgbmV3LlxuICBwcml2YXRlIF9zZWVkKFxuICAgIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgICBwcmV2aW91czogUmVwb3J0RmlsdGVyR3JvdXAgfCBudWxsLFxuICAgIHRpbWV6b25lQ2hhbmdlZDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdENoYW5nZWQgPSAhc2FtZURlZmF1bHQocHJldmlvdXM/LmNvbmZpZz8uZGVmYXVsdCA/PyBudWxsLCBncm91cC5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCk7XG5cbiAgICBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXAuaWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwLmlkKTtcbiAgICBjb25zdCBwcmVzZXRUb1Jlc29sdmUgPSB0aW1lem9uZUNoYW5nZWRcbiAgICAgICYmICEhdmFsdWU/LnByZXNldFxuICAgICAgJiYgdmFsdWUucHJlc2V0ID09PSBncm91cC5jb25maWc/LmRlZmF1bHQ/LnJlbGF0aXZlO1xuXG4gICAgaWYgKHZhbHVlICYmICFkZWZhdWx0Q2hhbmdlZCAmJiAhcHJlc2V0VG9SZXNvbHZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKTtcblxuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXAuaWQsIGRlZmF1bHRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChkZWZhdWx0Q2hhbmdlZCkge1xuICAgICAgLy8gVGhlIGRlZmF1bHQgd2FzIGNsZWFyZWQsIHNvIHRoZSB2YWx1ZSBpdCBzZWVkZWQgZ29lcyB3aXRoIGl0LlxuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHJvcHMgdGhlIHNlYXJjaCBvZiBldmVyeSBsaXN0IHRoYXQgbm8gbG9uZ2VyIHNob3dzIGEgc2VhcmNoIGJveDogb25lXG4gIC8vIHRoZSByZXBvcnQgbm8gbG9uZ2VyIGhhcywgb3Igb25lIHdob3NlIGhlYWRlciBub3cgaGFzIGEga2V5d29yZCBncm91cC5cbiAgcHJpdmF0ZSBfZHJvcFVuc2VhcmNoYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9saXN0U2VhcmNoZXMuZm9yRWFjaCgoc2VhcmNoLCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMubGlzdFNlYXJjaGFibGUoY29tcG9uZW50KSkge1xuICAgICAgICB0aGlzLl9saXN0U2VhcmNoZXMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIERyb3BzIHN0YXRlIGtlcHQgZm9yIGdyb3VwcywgbGlzdHMgYW5kIGZpbHRlcnMgdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLlxuICAvLyBBIGxpc3Qgc29ydCBhbHNvIGdvZXMgd2hlbiBpdHMgY29sdW1uIGRvZXM6IHRoZSBhZ2VudCBjYW4gcmVtb3ZlIG9yIHJlbmFtZVxuICAvLyBpdCwgYW5kIHRoZSByZWNyZWF0ZWQgbGlzdCB3b3VsZCBzZW5kIGEgY29sdW1uIHRoZSBxdWVyeSBkb2VzIG5vdCBrbm93LlxuICAvLyBBIGxpc3Qgc2VhcmNoIGdvZXMgd2l0aCBpdHMgbGlzdCAob3Igd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vIGxvbmdlciBhXG4gIC8vIGxpc3QpLCBhbmQgd2hlbiB0aGUgbGlzdCBnYWlucyBhIGtleXdvcmQgZ3JvdXAgYW5kIHNvIGxvc2VzIGl0cyBib3guXG4gIC8vIEhpZGRlbiBjb2x1bW5zIGtlZXAgb25seSB0aGUgbmFtZXMgdGhlaXIgbGlzdCBzdGlsbCBoYXMgYXMgY29sdW1ucyAodGhlXG4gIC8vIGFnZW50IGNhbiByZW1vdmUgb3IgcmVuYW1lIG9uZSwgb3IgdHVybiB0aGUgbGlzdCBpbnRvIGEgY3Jvc3MtdGFiKSwgYW5kIGdvXG4gIC8vIHdoZW4gd2hhdCBpcyBsZWZ0IHdvdWxkIGhpZGUgZXZlcnkgY29sdW1uLlxuICBwcml2YXRlIF9wcnVuZShyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBbLi4udGhpcy5fdmFsdWVzLmtleXMoKSwgLi4udGhpcy5fY2xlYXJlZF0pIHtcbiAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhncm91cElkKSkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9saXN0U29ydHMuZm9yRWFjaCgoc29ydCwgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk7XG5cbiAgICAgIGlmICghY29tcG9uZW50IHx8ICF0aGlzLl9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50KS5pbmNsdWRlcyhzb3J0LmNvbHVtbikpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNvcnRzLmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBWYWx1ZXMgaW5jbHVkZWQ6IG9uZSBpcyBuZXZlciBkcmF3biwgYnV0IGl0cyBmaWx0ZXJzIGFyZSB0aGUgcmVwb3J0J3NcbiAgICAvLyBsaWtlIGFueSBvdGhlciBjb21wb25lbnQncywgYW5kIHNvIGFyZSB0aGVpciBzZXNzaW9uIHRvZ2dsZXMuXG4gICAgY29uc3QgZmlsdGVySWRzID0gbmV3IFNldChyZXBvcnRDb21wb25lbnRzKHJlcG9ydClcbiAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IChjb21wb25lbnQuZmlsdGVycyA/PyBbXSkubWFwKChmaWx0ZXIpID0+IGZpbHRlci5pZCkpKTtcblxuICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5mb3JFYWNoKChmaWx0ZXJJZCkgPT4ge1xuICAgICAgaWYgKCFmaWx0ZXJJZHMuaGFzKGZpbHRlcklkKSkge1xuICAgICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZGVsZXRlKGZpbHRlcklkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuX2Ryb3BVbnNlYXJjaGFibGUoKTtcblxuICAgIGNvbnN0IGhpZGRlbiA9IG5ldyBNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4oKTtcblxuICAgIHRoaXMubGlzdEhpZGRlbigpLmZvckVhY2goKG5hbWVzLCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3Qga2VwdCA9IGxpc3RIaWRkZW5Db2x1bW5zKHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk/LmNvbmZpZywgbmFtZXMpO1xuXG4gICAgICBpZiAoa2VwdC5sZW5ndGgpIHtcbiAgICAgICAgaGlkZGVuLnNldChjb21wb25lbnRJZCwga2VwdCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmxpc3RIaWRkZW4uc2V0KGhpZGRlbik7XG4gIH1cblxuICAvLyBUaGUgdmFsdWUgYSBiYXIgc2V0cywga2VlcGluZyB0aGUgc3RvcmVkIHByZXNldCBuYW1lIHdoaWxlIHRoZSBkYXlzIGFyZVxuICAvLyBzdGlsbCB0aGUgc3RvcmVkIGRheXMgKHNlZSBzZXRWYWx1ZSkuXG4gIHByaXZhdGUgX3dpdGhQcmVzZXQoc3RvcmVkOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IEZpbHRlckdyb3VwVmFsdWUge1xuICAgIGNvbnN0IGZpeGVkOiBGaWx0ZXJHcm91cFZhbHVlID0geyAuLi52YWx1ZSB9O1xuICAgIGRlbGV0ZSBmaXhlZC5wcmVzZXQ7XG5cbiAgICByZXR1cm4gc3RvcmVkPy5wcmVzZXQgJiYgc2FtZURheXMoc3RvcmVkLCBmaXhlZClcbiAgICAgID8geyAuLi5maXhlZCwgcHJlc2V0OiBzdG9yZWQucHJlc2V0IH1cbiAgICAgIDogZml4ZWQ7XG4gIH1cblxuICBwcml2YXRlIF9saXN0Q29tcG9uZW50cyhyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gcmVwb3J0Q29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCcpO1xuICB9XG5cbiAgLy8gVGhlIGNvbHVtbnMgYSBsaXN0IGNhbiBiZSBzb3J0ZWQgYnk6IGV2ZXJ5IGF1dGhvcmVkIGNvbHVtbiwgb3IgYVxuICAvLyBjcm9zcy10YWIncyByb3cgY29sdW1uIG9ubHkgKGl0cyBwaXZvdCBjb2x1bW5zIGNvbWUgYW5kIGdvIHdpdGggdGhlIGRhdGEpLlxuICBwcml2YXRlIF9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZztcblxuICAgIGlmIChjb25maWc/LnBpdm90Qnk/LmNvbHVtbikge1xuICAgICAgcmV0dXJuIGNvbmZpZy5yb3dCeT8uY29sdW1uID8gW2NvbmZpZy5yb3dCeS5jb2x1bW5dIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIChjb25maWc/LmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uY29sdW1uKTtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0LCBtYXBwZWQgdG8gYSBzZXNzaW9uIHZhbHVlIGJ5IHR5cGUuIFJlbGF0aXZlXG4gIC8vIGRhdGUgcHJlc2V0cyByZXNvbHZlIGFnYWluc3QgXCJub3dcIiBlYWNoIHRpbWUgdGhlIHJlcG9ydCBvcGVucywgc28gYSBzYXZlZFxuICAvLyBcImxhc3QgMTIgbW9udGhzXCIgc3RheXMgcmVsYXRpdmUgYW5kIGNhcnJpZXMgaXRzIHByZXNldCBuYW1lOyBhIGZpeGVkXG4gIC8vIHJhbmdlLCBzZWxlY3QgdmFsdWVzIGFuZCBrZXl3b3JkIHRleHQgc2VlZCB2ZXJiYXRpbS5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQucmVsYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZShncm91cERlZmF1bHQucmVsYXRpdmUpO1xuXG4gICAgICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogZ3JvdXBEZWZhdWx0LnJlbGF0aXZlIH0gOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQuc3RhcnQgfHwgZ3JvdXBEZWZhdWx0LmVuZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGdyb3VwRGVmYXVsdC5zdGFydCA/PyBudWxsLFxuICAgICAgICBlbmQ6IGdyb3VwRGVmYXVsdC5lbmQgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWVzOiBncm91cERlZmF1bHQudmFsdWVzIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IGdyb3VwRGVmYXVsdC52YWx1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9leGNsdWRlT3JSYW5nZURlZmF1bHQoZ3JvdXBEZWZhdWx0KTtcbiAgfVxuXG4gIC8vIEEgcmVsYXRpdmUgcHJlc2V0IGFzIGEgY2FsZW5kYXItZGF5IHJhbmdlLiBcIlRvZGF5XCIgaXMgdGhlIGRheSBpbiB0aGVcbiAgLy8gcmVwb3J0J3MgZWZmZWN0aXZlIHpvbmUsIG5vdCB0aGUgYnJvd3NlcidzLCBzbyBldmVyeSB2aWV3ZXIgc2VlZHMgdGhlIHNhbWVcbiAgLy8gcmFuZ2UuIFRoZSBzZXJ2ZXIgdHdpbiBpcyBSZXBvcnRSZWxhdGl2ZVJhbmdlRW51bSAoZnJhbWV3b3JrL1JlcG9ydC9FbnVtKSxcbiAgLy8gYW5kIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtVGVzdCBwaW5zIHRoZSB0YWJsZSBib3RoIHNpZGVzIG11c3QgcHJvZHVjZS5cbiAgcHJpdmF0ZSBfcmVsYXRpdmVSYW5nZShyZWxhdGl2ZTogc3RyaW5nKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0gfCBudWxsIHtcbiAgICBjb25zdCBub3cgPSBnZXRab25lZE5vdyh0aGlzLnRpbWV6b25lKCkpO1xuXG4gICAgc3dpdGNoIChyZWxhdGl2ZSkge1xuICAgICAgLy8gQSBjYWxlbmRhciB3ZWVrLCBNb25kYXkgdG8gU3VuZGF5IChSRVBPUlRfV0VFS19TVEFSVFNfT04sIHRoZSBzYW1lIHdlZWtcbiAgICAgIC8vIHRoZSBzZXJ2ZXIncyB3ZWVrbHkgYnVja2V0cyB1c2UpLCBpbiB3aG9sZSBkYXlzIOKAlCBub3QgdGhlIHJvbGxpbmdcbiAgICAgIC8vIHNldmVuIGRheXMgYGxhc3Q3RGF5c2AgZ2l2ZXMsIHdoaWNoIG5ldmVyIGxpbmVzIHVwIHdpdGggdGhlIHdlZWsgYVxuICAgICAgLy8gcGFydG5lciBoYXMgYWxyZWFkeSBiZWVuIHNlbnQuIGBsYXN0V2Vla2AgaXMgdGhlIG9uZSBhIHdlZWtseSByZXBvcnRcbiAgICAgIC8vIHdhbnRzOiBpdCBlbmRzIG9uIHRoZSBwcmV2aW91cyB3ZWVrJ3MgU3VuZGF5IHJhdGhlciB0aGFuIGF0IGBub3dgLFxuICAgICAgLy8gYmVjYXVzZSB0aGUgd2VlayBpdCBuYW1lcyBoYXMgY2xvc2VkLiBgdGhpc1dlZWtgIGZvbGxvd3MgZXZlcnkgb3RoZXJcbiAgICAgIC8vIHByZXNldCBoZXJlIGFuZCBydW5zIHVwIHRvIG5vdywgc28gaXQgaXMgZGVsaWJlcmF0ZWx5IGEgcGFydC1maW5pc2hlZFxuICAgICAgLy8gd2VlayAob24gYSBTdW5kYXkgaXQgaXMgdGhlIHdob2xlIE1vbmRheS10by1TdW5kYXkgd2VlaykuXG4gICAgICBjYXNlICd0aGlzV2Vlayc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mV2Vlayhub3csIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0V2Vlayc6IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBzdWJXZWVrcyhub3csIDEpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhcnQ6IHN0YXJ0T2ZXZWVrKHByZXZpb3VzLCB7IHdlZWtTdGFydHNPbjogUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0pLFxuICAgICAgICAgIGVuZDogZW5kT2ZXZWVrKHByZXZpb3VzLCB7IHdlZWtTdGFydHNPbjogUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnbGFzdDdEYXlzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1YkRheXMobm93LCA3KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QzMERheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDMwKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QzTW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDMpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDZNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgNiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0MTJNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMTIpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc01vbnRoJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZNb250aChub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1F1YXJ0ZXInOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZlF1YXJ0ZXIobm93KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNZZWFyJzpcbiAgICAgIGNhc2UgJ3llYXJUb0RhdGUnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZlllYXIobm93KSwgZW5kOiBub3cgfTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV2ZXJ5IGdyb3VwIGluIGl0cyBzdG9yZWQgc2hhcGU6IG51bGwgd2hlbiBpdCBob2xkcyBub3RoaW5nLCBhIGRlZmF1bHRcbiAgLy8gdGhlIHZpZXdlciBjbGVhcmVkIGluY2x1ZGVkLlxuICBwcml2YXRlIF9zbmFwc2hvdEdyb3VwcygpOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsPiB7XG4gICAgY29uc3QgZ3JvdXBzOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsPiA9IHt9O1xuXG4gICAgdGhpcy5fZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICBncm91cHNbZ3JvdXAuaWRdID0gdGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXAuaWQpXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRvU3RvcmVkR3JvdXBWYWx1ZShncm91cC50eXBlLCB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwLmlkKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JvdXBzO1xuICB9XG5cbiAgLy8gRWFjaCB0aWxlJ3Mgc3RhdGUgd2hlcmUgaXQgZGlmZmVycyBmcm9tIHRoZSBhdXRob3JlZCB0aWxlLiBBIGxpc3Qgc29ydFxuICAvLyB0aGF0IGlzIHRoZSBsaXN0J3MgYXV0aG9yZWQgZmlyc3QgdGVybSBpcyBpdHMgZGVmYXVsdCwgbm90IGEgY2hvaWNlLlxuICBwcml2YXRlIF9zbmFwc2hvdFRpbGVzKCk6IFJlY29yZDxudW1iZXIsIFJlcG9ydFRpbGVTdGF0ZT4ge1xuICAgIGNvbnN0IHRpbGVzOiBSZWNvcmQ8bnVtYmVyLCBSZXBvcnRUaWxlU3RhdGU+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLl90aWxlcygpKSB7XG4gICAgICBjb25zdCB0aWxlOiBSZXBvcnRUaWxlU3RhdGUgPSB7fTtcbiAgICAgIGNvbnN0IHNvcnQgPSB0aGlzLl9saXN0U29ydHMuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBoaWRkZW4gPSB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IGRyaWxsID0gdGhpcy5kcmlsbChjb21wb25lbnQuaWQpO1xuXG4gICAgICBpZiAoc29ydCAmJiAhc2FtZVNvcnQoc29ydCwgbGlzdFNvcnRUZXJtcyhjb21wb25lbnQuY29uZmlnKVswXSA/PyBudWxsKSkge1xuICAgICAgICB0aWxlLnNvcnQgPSB7IC4uLnNvcnQgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgdGlsZS5zZWFyY2ggPSBzZWFyY2g7XG4gICAgICB9XG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICB0aWxlLmhpZGRlbiA9IFsuLi5oaWRkZW5dO1xuICAgICAgfVxuICAgICAgaWYgKGRyaWxsLmxlbmd0aCkge1xuICAgICAgICB0aWxlLmRyaWxsID0gZHJpbGwubWFwKChzdGVwKSA9PiAoeyAuLi5zdGVwIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKE9iamVjdC5rZXlzKHRpbGUpLmxlbmd0aCkge1xuICAgICAgICB0aWxlc1tjb21wb25lbnQuaWRdID0gdGlsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGlsZXM7XG4gIH1cblxuICAvLyBBIGdyb3VwIGJhY2sgYXQgaXRzIGF1dGhvcmVkIGRlZmF1bHQuXG4gIHByaXZhdGUgX3NlZWRBdXRob3JlZChncm91cDogUmVwb3J0RmlsdGVyR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXAuaWQsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgdGlsZSBiYWNrIGF0IGl0cyBhdXRob3JlZCBzdGF0ZS5cbiAgcHJpdmF0ZSBfY2xlYXJUaWxlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9saXN0U29ydHMuY2xlYXIoKTtcbiAgICB0aGlzLl9saXN0U2VhcmNoZXMuY2xlYXIoKTtcbiAgICB0aGlzLmxpc3RIaWRkZW4uc2V0KG5ldyBNYXAoKSk7XG4gICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKCkpO1xuICB9XG5cbiAgLy8gT25lIGNoYXJ0J3MgZHJpbGwgcGF0aDsgYW4gZW1wdHkgcGF0aCBpcyB0aGUgY2hhcnQncyB0b3AuXG4gIHByaXZhdGUgX3NldERyaWxsUGF0aChjb21wb25lbnRJZDogbnVtYmVyLCBwYXRoOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMuX2RyaWxscygpKTtcblxuICAgIGlmIChwYXRoLmxlbmd0aCkge1xuICAgICAgbmV4dC5zZXQoY29tcG9uZW50SWQsIHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0LmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZHJpbGxzLnNldChuZXh0KTtcbiAgfVxuXG4gIC8vIEFmdGVyIHJlc2V0VG9EZWZhdWx0cygpOiBldmVyeSBiYXIgYW5kIHRpbGUgcmVwYWludHMsIGFuZCB0aGVcbiAgLy8gdGltZS1zZXJpZXMgY2hhcnRzIHJlZmV0Y2ggd2hlbiB0aGUgZ3JhaW4gbW92ZWQuXG4gIHByaXZhdGUgX25vdGlmeVJlc2V0KGZyZXF1ZW5jeTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0ZVZlcnNpb24udXBkYXRlKCh2ZXJzaW9uKSA9PiB2ZXJzaW9uICsgMSk7XG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcblxuICAgIGlmIChmcmVxdWVuY3kgIT09IHRoaXMuX2ZyZXF1ZW5jeSkge1xuICAgICAgdGhpcy5fZnJlcXVlbmN5Q2hhbmdlZCQubmV4dCgpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIHRpbGVzIG9mIHRoZSByZXBvcnQgaW5pdCgpIGxhc3QgcmVhZC5cbiAgcHJpdmF0ZSBfdGlsZXMoKTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMuX3JlcG9ydCgpO1xuXG4gICAgcmV0dXJuIHJlcG9ydFxuICAgICAgPyByZXBvcnRDb21wb25lbnRzKHJlcG9ydCkuZmlsdGVyKGlzVGlsZSlcbiAgICAgIDogW107XG4gIH1cblxuICBwcml2YXRlIF9pc0NoYXJ0KGNvbXBvbmVudElkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdGlsZXMoKVxuICAgICAgLnNvbWUoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmlkID09PSBjb21wb25lbnRJZCAmJiBjb21wb25lbnQudHlwZSA9PT0gJ2NoYXJ0Jyk7XG4gIH1cblxuICAvLyBLZWVwcyB0aGUgcGFnZSBhbmQgZHJpbGwgc3RhdGUgdG8gd2hhdCB0aGUgcmVwb3J0IChyZSlsb2FkZWQgYnkgaW5pdCgpXG4gIC8vIHN0aWxsIGhhczogZHJpbGwgcGF0aHMgb24gY2hhcnRzIGl0IHN0aWxsIGhhcywgdGhlIHBhZ2Ugd2hpbGUgaXQgaGFzIGl0LlxuICAvLyBPbiBhbm90aGVyIHJlcG9ydCBpdCBzdGFydHMgYWdhaW46IG1hdGNoICdhbGwnLCBubyBkcmlsbCBhbmQgbm90aGluZ1xuICAvLyB0ZW1wb3JhcnkuXG4gIHByaXZhdGUgX3BydW5lUGFnZVN0YXRlKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3JlcG9ydCgpPy5pZCAhPT0gcmVwb3J0LmlkKSB7XG4gICAgICB0aGlzLl9tYXRjaC5zZXQoJ2FsbCcpO1xuICAgICAgdGhpcy5fcGFnZUlkLnNldChudWxsKTtcbiAgICAgIHRoaXMuX2RyaWxscy5zZXQobmV3IE1hcCgpKTtcbiAgICAgIHRoaXMuX3RlbXBvcmFyeS5zZXQoZW1wdHlUZW1wb3JhcnlTdGF0ZSgpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKFsuLi50aGlzLl9kcmlsbHMoKV1cbiAgICAgIC5maWx0ZXIoKFtjb21wb25lbnRJZF0pID0+IHRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpKSkpO1xuXG4gICAgaWYgKHRoaXMuX3BhZ2VJZCgpICYmICEocmVwb3J0LnBhZ2VzID8/IFtdKS5zb21lKChwYWdlKSA9PiBwYWdlLmlkID09PSB0aGlzLl9wYWdlSWQoKSkpIHtcbiAgICAgIHRoaXMuX3BhZ2VJZC5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBzZWxlY3QncyB2YWx1ZXMgdG8gbGVhdmUgb3V0IChvbmx5IHdoZW4gaXQga2VlcHMgbm9uZSkgYW5kIGEgbnVtYmVyXG4gIC8vIHJhbmdlJ3MgZW5kcywgYW4gb3BlbiBlbmQgbGVmdCBvdXQgYW5kIDAga2VwdCwgd3JpdHRlbiBvbnRvIGBmaWVsZHNgLlxuICBwcml2YXRlIF9yZXNvbHZlRXhjbHVkZUFuZFJhbmdlKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlLCBmaWVsZHM6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4pOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuZXhjbHVkZVZhbHVlcz8ubGVuZ3RoICYmICFmaWVsZHMudmFsdWVzKSB7XG4gICAgICBmaWVsZHMuZXhjbHVkZVZhbHVlcyA9IHZhbHVlLmV4Y2x1ZGVWYWx1ZXM7XG4gICAgfVxuXG4gICAgY29uc3QgbWluID0gZmluaXRlTnVtYmVyKHZhbHVlLm1pbik7XG4gICAgY29uc3QgbWF4ID0gZmluaXRlTnVtYmVyKHZhbHVlLm1heCk7XG5cbiAgICBpZiAobWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpZWxkcy5taW4gPSBtaW47XG4gICAgfVxuICAgIGlmIChtYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmllbGRzLm1heCA9IG1heDtcbiAgICB9XG4gIH1cblxuICAvLyBBbiBhdXRob3JlZCBkZWZhdWx0IHRoYXQgbGVhdmVzIHNlbGVjdCB2YWx1ZXMgb3V0LCBvciBhIG51bWJlciByYW5nZSdzXG4gIC8vIGVuZHMgKDAga2VwdCksIGFzIGEgc2Vzc2lvbiB2YWx1ZTsgbnVsbCB3aGVuIGl0IGhvbGRzIG5laXRoZXIuXG4gIHByaXZhdGUgX2V4Y2x1ZGVPclJhbmdlRGVmYXVsdChncm91cERlZmF1bHQ6IEZpbHRlckdyb3VwRGVmYXVsdCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBpZiAoZ3JvdXBEZWZhdWx0LmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgZXhjbHVkZVZhbHVlczogZ3JvdXBEZWZhdWx0LmV4Y2x1ZGVWYWx1ZXMgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW4gPSBmaW5pdGVOdW1iZXIoZ3JvdXBEZWZhdWx0Lm1pbik7XG4gICAgY29uc3QgbWF4ID0gZmluaXRlTnVtYmVyKGdyb3VwRGVmYXVsdC5tYXgpO1xuXG4gICAgaWYgKG1pbiA9PT0gdW5kZWZpbmVkICYmIG1heCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uKG1pbiAhPT0gdW5kZWZpbmVkID8geyBtaW4gfSA6IHt9KSxcbiAgICAgIC4uLihtYXggIT09IHVuZGVmaW5lZCA/IHsgbWF4IH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIENvdW50cyBhIHJlc2V0IGZvciBlYWNoIGxpc3Qgd2hvc2Ugc29ydCBpcyBub3QgdGhlIG9uZSBpdCBoYWQgKGBiZWZvcmVgLFxuICAvLyB0aGUgc29ydHMgYnkgbGlzdCBiZWZvcmUgdGhlIHJlc2V0KS4gQSBzb3J0IGEgbGlzdCBsb3N0IGFuZCBvbmUgaXRcbiAgLy8gZ2FpbmVkIGJvdGggY291bnQ7IHRoZSBhdXRob3JlZCBzb3J0IGlzIG5vIGVudHJ5IGVpdGhlciBzaWRlLlxuICBwcml2YXRlIF9jb3VudFNvcnRSZXNldHMoYmVmb3JlOiBSZWFkb25seU1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KTogdm9pZCB7XG4gICAgY29uc3QgbW92ZWQgPSBbLi4ubmV3IFNldChbLi4uYmVmb3JlLmtleXMoKSwgLi4udGhpcy5fbGlzdFNvcnRzLmtleXMoKV0pXVxuICAgICAgLmZpbHRlcigoY29tcG9uZW50SWQpID0+IHtcbiAgICAgICAgY29uc3Qgd2FzID0gYmVmb3JlLmdldChjb21wb25lbnRJZCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHdhcyA/ICFzYW1lU29ydCh3YXMsIG5vdykgOiBub3cgIT09IG51bGw7XG4gICAgICB9KTtcblxuICAgIGlmICghbW92ZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY291bnRzID0gbmV3IE1hcCh0aGlzLl9saXN0U29ydFJlc2V0cygpKTtcbiAgICBtb3ZlZC5mb3JFYWNoKChjb21wb25lbnRJZCkgPT4gY291bnRzLnNldChjb21wb25lbnRJZCwgKGNvdW50cy5nZXQoY29tcG9uZW50SWQpID8/IDApICsgMSkpO1xuICAgIHRoaXMuX2xpc3RTb3J0UmVzZXRzLnNldChjb3VudHMpO1xuICB9XG59XG4iXX0=
|