@plumile/router 0.1.28 → 0.1.31

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.
Files changed (66) hide show
  1. package/README.md +9 -126
  2. package/lib/esm/ResourcePage.d.ts +1 -0
  3. package/lib/esm/ResourcePage.d.ts.map +1 -1
  4. package/lib/esm/ResourcePage.js +4 -1
  5. package/lib/esm/builder.d.ts.map +1 -1
  6. package/lib/esm/builder.js +1 -1
  7. package/lib/esm/errors/HttpRedirect.d.ts.map +1 -1
  8. package/lib/esm/errors/HttpRedirect.js +1 -1
  9. package/lib/esm/errors/index.js +1 -1
  10. package/lib/esm/history/BrowserHistory.d.ts +7 -2
  11. package/lib/esm/history/BrowserHistory.d.ts.map +1 -1
  12. package/lib/esm/history/BrowserHistory.js +96 -18
  13. package/lib/esm/history/types.d.ts +8 -1
  14. package/lib/esm/history/types.d.ts.map +1 -1
  15. package/lib/esm/history/types.js +1 -1
  16. package/lib/esm/routing/Link.d.ts.map +1 -1
  17. package/lib/esm/routing/Link.js +16 -1
  18. package/lib/esm/routing/createRouter.d.ts +5 -9
  19. package/lib/esm/routing/createRouter.d.ts.map +1 -1
  20. package/lib/esm/routing/createRouter.js +354 -382
  21. package/lib/esm/routing/useAllQuery.d.ts.map +1 -1
  22. package/lib/esm/routing/useAllQuery.js +1 -1
  23. package/lib/esm/routing/useFilterDiagnostics.d.ts.map +1 -1
  24. package/lib/esm/routing/useFilterDiagnostics.js +1 -1
  25. package/lib/esm/routing/useFilters.d.ts +5 -0
  26. package/lib/esm/routing/useFilters.d.ts.map +1 -1
  27. package/lib/esm/routing/useFilters.js +4 -1
  28. package/lib/esm/routing/useNavigate.d.ts.map +1 -1
  29. package/lib/esm/routing/useNavigate.js +1 -1
  30. package/lib/esm/routing/useQuery.d.ts.map +1 -1
  31. package/lib/esm/routing/useQuery.js +1 -1
  32. package/lib/esm/routing/useQueryState.d.ts.map +1 -1
  33. package/lib/esm/routing/useQueryState.js +1 -1
  34. package/lib/esm/tools/buildCombinedSearch.d.ts.map +1 -1
  35. package/lib/esm/tools/buildCombinedSearch.js +1 -1
  36. package/lib/esm/tools.d.ts +6 -2
  37. package/lib/esm/tools.d.ts.map +1 -1
  38. package/lib/esm/tools.js +47 -2
  39. package/lib/esm/types.d.ts +47 -0
  40. package/lib/esm/types.d.ts.map +1 -1
  41. package/lib/esm/types.js +28 -2
  42. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  43. package/lib/types/ResourcePage.d.ts +1 -0
  44. package/lib/types/ResourcePage.d.ts.map +1 -1
  45. package/lib/types/builder.d.ts.map +1 -1
  46. package/lib/types/errors/HttpRedirect.d.ts.map +1 -1
  47. package/lib/types/history/BrowserHistory.d.ts +7 -2
  48. package/lib/types/history/BrowserHistory.d.ts.map +1 -1
  49. package/lib/types/history/types.d.ts +8 -1
  50. package/lib/types/history/types.d.ts.map +1 -1
  51. package/lib/types/routing/Link.d.ts.map +1 -1
  52. package/lib/types/routing/createRouter.d.ts +5 -9
  53. package/lib/types/routing/createRouter.d.ts.map +1 -1
  54. package/lib/types/routing/useAllQuery.d.ts.map +1 -1
  55. package/lib/types/routing/useFilterDiagnostics.d.ts.map +1 -1
  56. package/lib/types/routing/useFilters.d.ts +5 -0
  57. package/lib/types/routing/useFilters.d.ts.map +1 -1
  58. package/lib/types/routing/useNavigate.d.ts.map +1 -1
  59. package/lib/types/routing/useQuery.d.ts.map +1 -1
  60. package/lib/types/routing/useQueryState.d.ts.map +1 -1
  61. package/lib/types/tools/buildCombinedSearch.d.ts.map +1 -1
  62. package/lib/types/tools.d.ts +6 -2
  63. package/lib/types/tools.d.ts.map +1 -1
  64. package/lib/types/types.d.ts +47 -0
  65. package/lib/types/types.d.ts.map +1 -1
  66. package/package.json +4 -4
@@ -4,44 +4,179 @@ import { getMatchedRoute, prepareMatch } from '../tools.js';
4
4
  import { parseRawQuery } from '../tools/query.js';
5
5
  import buildCombinedSearch from '../tools/buildCombinedSearch.js';
6
6
  import { parse as parseFilters } from '@plumile/filter-query';
7
- export default function createRouter(routes, opts = {}) {
8
- let devtoolsGlobal;
9
- let devtoolsPanel = false;
10
- let devtoolsShortcut = 'Alt+Shift+R';
11
- let devtoolsCollapsed = false;
12
- if (typeof opts.devtools === 'object') {
13
- const baseEnabled = (() => {
7
+ import { NavigationOrigin, RouterDebugEventKind, } from '../types.js';
8
+ export default function createRouter(routes, options = {}) {
9
+ const history = new BrowserHistory();
10
+ const debugEnabled = options.debug === true;
11
+ let debugSubscribers = null;
12
+ if (debugEnabled) {
13
+ debugSubscribers = new Set();
14
+ }
15
+ let pendingNavigationOrigin;
16
+ let lastNavigationOrigin = NavigationOrigin.External;
17
+ let lastPreloadSignature = null;
18
+ function normalizeLocation(location) {
19
+ let pathnameValue = '';
20
+ if (typeof location.pathname === 'string') {
21
+ pathnameValue = location.pathname;
22
+ }
23
+ let searchValue = '';
24
+ if (typeof location.search === 'string') {
25
+ searchValue = location.search;
26
+ }
27
+ let hashValue = '';
28
+ if (typeof location.hash === 'string') {
29
+ hashValue = location.hash;
30
+ }
31
+ return {
32
+ pathname: pathnameValue,
33
+ search: searchValue,
34
+ hash: hashValue,
35
+ };
36
+ }
37
+ function emitDebugEvent(payload) {
38
+ if (!debugEnabled || debugSubscribers === null) {
39
+ return;
40
+ }
41
+ for (const subscriber of debugSubscribers) {
14
42
  try {
15
- return (typeof process !== 'undefined' &&
16
- process.env.NODE_ENV !== 'production');
43
+ subscriber(payload);
17
44
  }
18
45
  catch {
19
- return false;
20
46
  }
21
- })();
22
- devtoolsGlobal = opts.devtools.global ?? baseEnabled;
23
- devtoolsPanel = !!opts.devtools.panel;
24
- devtoolsCollapsed = opts.devtools.collapsed ?? false;
25
- if (typeof opts.devtools.shortcut === 'string' &&
26
- opts.devtools.shortcut.trim() !== '') {
27
- devtoolsShortcut = opts.devtools.shortcut;
28
47
  }
29
48
  }
30
- else {
31
- const enabled = (() => {
32
- if (typeof opts.devtools === 'boolean')
33
- return opts.devtools;
34
- try {
35
- return (typeof process !== 'undefined' &&
36
- process.env.NODE_ENV !== 'production');
37
- }
38
- catch {
39
- return false;
49
+ function mapOrigin(raw) {
50
+ if (raw === undefined) {
51
+ return undefined;
52
+ }
53
+ switch (raw) {
54
+ case NavigationOrigin.LinkClick:
55
+ case NavigationOrigin.LinkHover:
56
+ case NavigationOrigin.Programmatic:
57
+ case NavigationOrigin.PopstateBack:
58
+ case NavigationOrigin.PopstateForward:
59
+ case NavigationOrigin.PopstateUnknown:
60
+ case NavigationOrigin.External:
61
+ case NavigationOrigin.Normalize:
62
+ case NavigationOrigin.PreloadHover:
63
+ return raw;
64
+ default:
65
+ return undefined;
66
+ }
67
+ }
68
+ function resolveNavigationOrigin(context) {
69
+ const fallbackOrigin = pendingNavigationOrigin;
70
+ let origin;
71
+ const contextOrigin = context?.origin;
72
+ if (contextOrigin !== undefined) {
73
+ origin = mapOrigin(contextOrigin);
74
+ }
75
+ origin ??= fallbackOrigin;
76
+ origin ??= NavigationOrigin.External;
77
+ pendingNavigationOrigin = undefined;
78
+ return origin;
79
+ }
80
+ function readMatchedRoutePath(entry) {
81
+ if (entry === undefined) {
82
+ return undefined;
83
+ }
84
+ const matchedRoute = entry.route;
85
+ if (matchedRoute === null) {
86
+ return undefined;
87
+ }
88
+ const childRoutes = matchedRoute.route.routes;
89
+ if (Array.isArray(childRoutes)) {
90
+ const lastChild = childRoutes.at(-1);
91
+ if (lastChild !== undefined) {
92
+ const lastChildRecord = lastChild;
93
+ const childPath = lastChildRecord.path;
94
+ if (typeof childPath === 'string') {
95
+ return childPath;
96
+ }
40
97
  }
41
- })();
42
- devtoolsGlobal = enabled;
98
+ }
99
+ const rootPath = matchedRoute.route.path;
100
+ if (typeof rootPath === 'string') {
101
+ return rootPath;
102
+ }
103
+ return undefined;
43
104
  }
44
- const history = new BrowserHistory();
105
+ function createPrepareDebug(origin) {
106
+ if (!debugEnabled) {
107
+ return undefined;
108
+ }
109
+ return {
110
+ origin,
111
+ requestTime: Date.now(),
112
+ emit(payload) {
113
+ emitDebugEvent({
114
+ ...payload,
115
+ location: normalizeLocation(history.location),
116
+ });
117
+ },
118
+ };
119
+ }
120
+ function buildPreloadKey(kind, pathname) {
121
+ return `${kind}:${pathname}`;
122
+ }
123
+ function maybeEmitProgrammaticPreload(kind, pathname, origin) {
124
+ if (!debugEnabled) {
125
+ return;
126
+ }
127
+ const key = buildPreloadKey(kind, pathname);
128
+ const now = Date.now();
129
+ const recentlyRecorded = lastPreloadSignature !== null &&
130
+ lastPreloadSignature.key === key &&
131
+ now - lastPreloadSignature.timestamp < 50;
132
+ if (!recentlyRecorded) {
133
+ emitDebugEvent({
134
+ kind,
135
+ origin,
136
+ timestamp: now,
137
+ location: normalizeLocation(history.location),
138
+ details: {
139
+ targetPathname: pathname,
140
+ },
141
+ });
142
+ }
143
+ lastPreloadSignature = null;
144
+ }
145
+ let debugHelpers;
146
+ if (debugEnabled) {
147
+ debugHelpers = {
148
+ recordPreload(kind, origin, pathname) {
149
+ const timestamp = Date.now();
150
+ lastPreloadSignature = {
151
+ key: buildPreloadKey(kind, pathname),
152
+ timestamp,
153
+ };
154
+ emitDebugEvent({
155
+ kind,
156
+ origin,
157
+ timestamp,
158
+ location: normalizeLocation(history.location),
159
+ details: {
160
+ targetPathname: pathname,
161
+ },
162
+ });
163
+ },
164
+ recordNavigationIntent(origin) {
165
+ pendingNavigationOrigin = origin;
166
+ },
167
+ recordHistoryAction(kind, origin, location, details) {
168
+ pendingNavigationOrigin = origin;
169
+ emitDebugEvent({
170
+ kind,
171
+ origin,
172
+ timestamp: Date.now(),
173
+ location: normalizeLocation(location),
174
+ details,
175
+ });
176
+ },
177
+ };
178
+ }
179
+ let routerGlobal = null;
45
180
  const flatRoutes = buildRoutes(routes);
46
181
  const route = getMatchedRoute(flatRoutes, history.location);
47
182
  const initialRawQuery = parseRawQuery(history.location.search);
@@ -59,7 +194,7 @@ export default function createRouter(routes, opts = {}) {
59
194
  initialFilters = parsed.filters;
60
195
  initialFilterDiagnostics = parsed.diagnostics;
61
196
  }
62
- const preparedMatch = prepareMatch(route, initialFilters);
197
+ const preparedMatch = prepareMatch(route, initialFilters, createPrepareDebug(lastNavigationOrigin));
63
198
  let currentEntry = {
64
199
  forceRerender: false,
65
200
  location: history.location,
@@ -70,6 +205,7 @@ export default function createRouter(routes, opts = {}) {
70
205
  filters: initialFilters,
71
206
  filterDiagnostics: initialFilterDiagnostics,
72
207
  activeQuerySchema: initialUnifiedSchema,
208
+ debugOrigin: lastNavigationOrigin,
73
209
  };
74
210
  const initTyped = currentEntry.filters;
75
211
  let initPageNumeric;
@@ -96,21 +232,105 @@ export default function createRouter(routes, opts = {}) {
96
232
  querySchema: initialUnifiedSchema,
97
233
  });
98
234
  if (normalizedSearch !== history.location.search) {
235
+ debugHelpers?.recordHistoryAction(RouterDebugEventKind.Normalize, NavigationOrigin.Normalize, {
236
+ pathname: history.location.pathname,
237
+ search: normalizedSearch,
238
+ hash: '',
239
+ }, { reason: 'initial-page-clamp' });
240
+ let normalizeDebugContext;
241
+ if (debugEnabled) {
242
+ normalizeDebugContext = {
243
+ origin: NavigationOrigin.Normalize,
244
+ trigger: 'normalize',
245
+ };
246
+ }
99
247
  history.set({
100
248
  pathname: history.location.pathname,
101
249
  search: normalizedSearch,
102
250
  hash: '',
251
+ debugContext: normalizeDebugContext,
103
252
  });
104
253
  currentEntry = {
105
254
  ...currentEntry,
106
255
  location: { ...currentEntry.location, search: normalizedSearch },
107
256
  rawSearch: normalizedSearch,
257
+ debugOrigin: NavigationOrigin.Normalize,
108
258
  };
109
259
  }
110
260
  }
261
+ if (debugEnabled) {
262
+ let snapshotOrigin = NavigationOrigin.External;
263
+ if (currentEntry.debugOrigin !== undefined) {
264
+ snapshotOrigin = currentEntry.debugOrigin;
265
+ }
266
+ emitDebugEvent({
267
+ kind: RouterDebugEventKind.Snapshot,
268
+ origin: snapshotOrigin,
269
+ timestamp: Date.now(),
270
+ location: normalizeLocation(history.location),
271
+ details: {
272
+ routePath: readMatchedRoutePath(currentEntry),
273
+ },
274
+ });
275
+ }
111
276
  let nextId = 0;
112
277
  const subscribers = new Map();
113
- const cleanup = history.subscribe((location, forceRerender) => {
278
+ const disposeHistory = history.subscribe((location, forceRerender, debugContext) => {
279
+ const origin = resolveNavigationOrigin(debugContext);
280
+ lastNavigationOrigin = origin;
281
+ const locationPayload = normalizeLocation(location);
282
+ const debugContextOrigin = debugContext?.origin;
283
+ if (debugEnabled && debugContextOrigin !== undefined) {
284
+ let historyDetails;
285
+ if (typeof debugContext?.historyIndex === 'number') {
286
+ historyDetails = { historyIndex: debugContext.historyIndex };
287
+ }
288
+ switch (debugContextOrigin) {
289
+ case NavigationOrigin.PopstateBack: {
290
+ emitDebugEvent({
291
+ kind: RouterDebugEventKind.PopstateBack,
292
+ origin,
293
+ timestamp: Date.now(),
294
+ location: locationPayload,
295
+ details: historyDetails,
296
+ });
297
+ break;
298
+ }
299
+ case NavigationOrigin.PopstateForward: {
300
+ emitDebugEvent({
301
+ kind: RouterDebugEventKind.PopstateForward,
302
+ origin,
303
+ timestamp: Date.now(),
304
+ location: locationPayload,
305
+ details: historyDetails,
306
+ });
307
+ break;
308
+ }
309
+ case NavigationOrigin.PopstateUnknown: {
310
+ emitDebugEvent({
311
+ kind: RouterDebugEventKind.PopstateUnknown,
312
+ origin,
313
+ timestamp: Date.now(),
314
+ location: locationPayload,
315
+ details: historyDetails,
316
+ });
317
+ break;
318
+ }
319
+ case NavigationOrigin.External: {
320
+ emitDebugEvent({
321
+ kind: RouterDebugEventKind.ExternalNavigation,
322
+ origin,
323
+ timestamp: Date.now(),
324
+ location: locationPayload,
325
+ details: historyDetails,
326
+ });
327
+ break;
328
+ }
329
+ default: {
330
+ break;
331
+ }
332
+ }
333
+ }
114
334
  const samePathname = location.pathname === currentEntry.location.pathname;
115
335
  const sameSearch = location.search === currentEntry.rawSearch;
116
336
  if (!forceRerender && samePathname && sameSearch) {
@@ -157,7 +377,7 @@ export default function createRouter(routes, opts = {}) {
157
377
  normalized = true;
158
378
  }
159
379
  if (!samePathname || !sameSearch) {
160
- nextPreparedMatch = prepareMatch(nextRoute, undefined);
380
+ nextPreparedMatch = prepareMatch(nextRoute, undefined, createPrepareDebug(origin));
161
381
  }
162
382
  const nextEntry = {
163
383
  forceRerender: forceRerender || (samePathname && !sameSearch),
@@ -169,6 +389,7 @@ export default function createRouter(routes, opts = {}) {
169
389
  filters,
170
390
  filterDiagnostics,
171
391
  activeQuerySchema: querySchema,
392
+ debugOrigin: origin,
172
393
  };
173
394
  if (normalized && querySchema != null) {
174
395
  const normalizedSearch = buildCombinedSearch({
@@ -177,16 +398,26 @@ export default function createRouter(routes, opts = {}) {
177
398
  });
178
399
  if (normalizedSearch !== location.search) {
179
400
  let nextSearchStr = normalizedSearch;
180
- if (!nextSearchStr.startsWith('?')) {
181
- if (nextSearchStr === '')
182
- nextSearchStr = '';
183
- else
184
- nextSearchStr = `?${nextSearchStr}`;
401
+ if (!nextSearchStr.startsWith('?') && nextSearchStr.length > 0) {
402
+ nextSearchStr = `?${nextSearchStr}`;
403
+ }
404
+ debugHelpers?.recordHistoryAction(RouterDebugEventKind.Normalize, NavigationOrigin.Normalize, {
405
+ pathname: location.pathname,
406
+ search: nextSearchStr,
407
+ hash: '',
408
+ }, { reason: 'runtime-page-clamp' });
409
+ let runtimeNormalizeContext;
410
+ if (debugEnabled) {
411
+ runtimeNormalizeContext = {
412
+ origin: NavigationOrigin.Normalize,
413
+ trigger: 'normalize',
414
+ };
185
415
  }
186
416
  history.set({
187
417
  pathname: location.pathname,
188
418
  search: nextSearchStr,
189
419
  hash: '',
420
+ debugContext: runtimeNormalizeContext,
190
421
  });
191
422
  return;
192
423
  }
@@ -195,6 +426,17 @@ export default function createRouter(routes, opts = {}) {
195
426
  subscribers.forEach((callback) => {
196
427
  callback(nextEntry);
197
428
  });
429
+ if (debugEnabled) {
430
+ emitDebugEvent({
431
+ kind: RouterDebugEventKind.Snapshot,
432
+ origin,
433
+ timestamp: Date.now(),
434
+ location: locationPayload,
435
+ details: {
436
+ routePath: readMatchedRoutePath(nextEntry),
437
+ },
438
+ });
439
+ }
198
440
  });
199
441
  const context = {
200
442
  history,
@@ -202,6 +444,7 @@ export default function createRouter(routes, opts = {}) {
202
444
  return currentEntry;
203
445
  },
204
446
  preloadCode(pathname) {
447
+ maybeEmitProgrammaticPreload(RouterDebugEventKind.PreloadCode, pathname, NavigationOrigin.Programmatic);
205
448
  const matches = getMatchedRoute(flatRoutes, {
206
449
  ...window.location,
207
450
  pathname,
@@ -217,11 +460,12 @@ export default function createRouter(routes, opts = {}) {
217
460
  });
218
461
  },
219
462
  preload(pathname) {
463
+ maybeEmitProgrammaticPreload(RouterDebugEventKind.Preload, pathname, NavigationOrigin.Programmatic);
220
464
  const matches = getMatchedRoute(flatRoutes, {
221
465
  ...window.location,
222
466
  pathname,
223
467
  });
224
- prepareMatch(matches);
468
+ prepareMatch(matches, undefined, createPrepareDebug(NavigationOrigin.Programmatic));
225
469
  },
226
470
  subscribe(callback) {
227
471
  nextId += 1;
@@ -234,31 +478,57 @@ export default function createRouter(routes, opts = {}) {
234
478
  },
235
479
  navigate({ pathname, query, filters: navFilters, replace }) {
236
480
  const current = currentEntry;
237
- const targetPathname = pathname ?? current.location.pathname;
481
+ let targetPathname = pathname;
482
+ if (targetPathname === undefined) {
483
+ targetPathname = current.location.pathname;
484
+ }
238
485
  let destSchema;
239
486
  const destRoute = getMatchedRoute(flatRoutes, {
240
487
  ...window.location,
241
488
  pathname: targetPathname,
242
489
  });
243
- if (destRoute != null) {
244
- const last = destRoute.route.routes.at(-1);
245
- if (last != null) {
246
- destSchema = last.querySchema;
247
- }
490
+ const lastRoute = destRoute?.route.routes.at(-1);
491
+ if (lastRoute != null) {
492
+ destSchema = lastRoute.querySchema;
248
493
  }
249
494
  destSchema ??= current.activeQuerySchema;
250
- const effectiveFilters = navFilters ?? current.filters;
495
+ const typedNavFilters = navFilters;
496
+ const effectiveFilters = typedNavFilters ?? current.filters;
251
497
  const filtersInput = effectiveFilters ?? query;
252
498
  const search = buildCombinedSearch({
253
499
  filters: filtersInput,
254
500
  querySchema: destSchema,
255
501
  });
256
502
  const locationObj = { pathname: targetPathname, search, hash: '' };
503
+ const origin = NavigationOrigin.Programmatic;
504
+ debugHelpers?.recordNavigationIntent(origin);
257
505
  if (replace === true) {
258
- history.set(locationObj);
506
+ debugHelpers?.recordHistoryAction(RouterDebugEventKind.HistoryReplace, origin, locationObj, { trigger: 'programmatic' });
507
+ let programmaticReplaceContext;
508
+ if (debugEnabled) {
509
+ programmaticReplaceContext = {
510
+ origin,
511
+ trigger: 'programmatic',
512
+ };
513
+ }
514
+ history.set({
515
+ ...locationObj,
516
+ debugContext: programmaticReplaceContext,
517
+ });
259
518
  }
260
519
  else {
261
- history.push(locationObj);
520
+ debugHelpers?.recordHistoryAction(RouterDebugEventKind.HistoryPush, origin, locationObj, { trigger: 'programmatic' });
521
+ let programmaticPushContext;
522
+ if (debugEnabled) {
523
+ programmaticPushContext = {
524
+ origin,
525
+ trigger: 'programmatic',
526
+ };
527
+ }
528
+ history.push({
529
+ ...locationObj,
530
+ debugContext: programmaticPushContext,
531
+ });
262
532
  }
263
533
  },
264
534
  getPrepared(path) {
@@ -275,351 +545,53 @@ export default function createRouter(routes, opts = {}) {
275
545
  return undefined;
276
546
  }
277
547
  },
548
+ __debug: debugHelpers,
278
549
  };
279
- if (devtoolsGlobal) {
550
+ if (options.debug === true) {
280
551
  try {
281
552
  if (typeof window !== 'undefined') {
282
- window.__PLUMILE_ROUTER__ =
283
- {
284
- get: context.get,
285
- subscribe: context.subscribe,
286
- };
553
+ const bridgeWindow = window;
554
+ routerGlobal = {
555
+ get: context.get.bind(context),
556
+ subscribe: context.subscribe.bind(context),
557
+ subscribeDebug(callback) {
558
+ const subscribers = debugSubscribers;
559
+ if (!debugEnabled ||
560
+ subscribers === null ||
561
+ typeof callback !== 'function') {
562
+ return undefined;
563
+ }
564
+ subscribers.add(callback);
565
+ return () => {
566
+ subscribers.delete(callback);
567
+ };
568
+ },
569
+ };
570
+ bridgeWindow.__PLUMILE_ROUTER__ = routerGlobal;
287
571
  }
288
572
  }
289
573
  catch {
290
574
  }
291
575
  }
292
- if (devtoolsPanel) {
293
- try {
294
- if (typeof window !== 'undefined' &&
295
- typeof document !== 'undefined' &&
296
- document.querySelector('[data-plumile-router-devtools-panel]') == null) {
297
- const host = document.createElement('div');
298
- host.setAttribute('data-plumile-router-devtools-panel', '');
299
- host.style.position = 'fixed';
300
- host.style.zIndex = '2147483646';
301
- host.style.bottom = '8px';
302
- host.style.right = '8px';
303
- host.style.fontFamily =
304
- 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace';
305
- host.style.fontSize = '12px';
306
- host.style.lineHeight = '1.3';
307
- host.style.color = '#111';
308
- host.style.background = 'transparent';
309
- host.style.pointerEvents = 'none';
310
- const shadow = host.attachShadow({ mode: 'open' });
311
- const panel = document.createElement('div');
312
- panel.style.pointerEvents = 'auto';
313
- panel.style.minWidth = '260px';
314
- panel.style.maxWidth = '420px';
315
- panel.style.maxHeight = '50vh';
316
- panel.style.overflow = 'auto';
317
- panel.style.background = 'rgba(255,255,255,0.95)';
318
- panel.style.border = '1px solid #ccc';
319
- panel.style.borderRadius = '6px';
320
- panel.style.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';
321
- panel.style.padding = '6px 8px 8px';
322
- panel.style.backdropFilter = 'blur(4px)';
323
- panel.style.display = 'flex';
324
- panel.style.flexDirection = 'column';
325
- panel.style.rowGap = '4px';
326
- const header = document.createElement('div');
327
- header.style.display = 'flex';
328
- header.style.alignItems = 'center';
329
- header.style.justifyContent = 'space-between';
330
- header.style.gap = '8px';
331
- const title = document.createElement('span');
332
- title.textContent = 'Plumile Router';
333
- title.style.fontWeight = '600';
334
- const buttons = document.createElement('div');
335
- buttons.style.display = 'flex';
336
- buttons.style.gap = '4px';
337
- const collapseBtn = document.createElement('button');
338
- collapseBtn.textContent = '−';
339
- const closeBtn = document.createElement('button');
340
- closeBtn.textContent = '×';
341
- const btns = [collapseBtn, closeBtn];
342
- for (const b of btns) {
343
- b.style.cursor = 'pointer';
344
- b.style.background = '#eee';
345
- b.style.border = '1px solid #ccc';
346
- b.style.borderRadius = '4px';
347
- b.style.fontSize = '11px';
348
- b.style.lineHeight = '1';
349
- b.style.padding = '2px 5px';
350
- }
351
- header.appendChild(title);
352
- buttons.appendChild(collapseBtn);
353
- buttons.appendChild(closeBtn);
354
- header.appendChild(buttons);
355
- const pathEl = document.createElement('div');
356
- pathEl.style.whiteSpace = 'nowrap';
357
- const matchEl = document.createElement('div');
358
- matchEl.style.whiteSpace = 'nowrap';
359
- const varsEl = document.createElement('pre');
360
- const queryEl = document.createElement('pre');
361
- const filtersEl = document.createElement('pre');
362
- const filterDiagEl = document.createElement('pre');
363
- const timelineWrap = document.createElement('div');
364
- timelineWrap.style.display = 'flex';
365
- timelineWrap.style.flexDirection = 'column';
366
- timelineWrap.style.gap = '2px';
367
- timelineWrap.style.marginTop = '4px';
368
- const timelineHeader = document.createElement('div');
369
- timelineHeader.textContent = 'Timeline (query changes)';
370
- timelineHeader.style.fontWeight = '600';
371
- timelineHeader.style.fontSize = '11px';
372
- const timeline = document.createElement('div');
373
- timeline.style.display = 'flex';
374
- timeline.style.flexDirection = 'column-reverse';
375
- timeline.style.maxHeight = '140px';
376
- timeline.style.overflowY = 'auto';
377
- timeline.style.border = '1px solid #e2e2e2';
378
- timeline.style.borderRadius = '4px';
379
- timeline.style.background = '#fafbfc';
380
- timeline.style.fontFamily = 'inherit';
381
- timeline.style.fontSize = '11px';
382
- timelineWrap.appendChild(timelineHeader);
383
- timelineWrap.appendChild(timeline);
384
- const pres = [
385
- varsEl,
386
- queryEl,
387
- filtersEl,
388
- filterDiagEl,
389
- ];
390
- for (const p of pres) {
391
- p.style.margin = '0';
392
- p.style.padding = '4px';
393
- p.style.background = '#f6f8fa';
394
- p.style.border = '1px solid #e2e2e2';
395
- p.style.borderRadius = '4px';
396
- p.style.overflowX = 'auto';
397
- p.style.maxHeight = '160px';
398
- }
399
- const small = document.createElement('div');
400
- small.style.fontSize = '10px';
401
- small.style.opacity = '0.7';
402
- small.textContent = `Shortcut: ${devtoolsShortcut}`;
403
- panel.appendChild(header);
404
- panel.appendChild(pathEl);
405
- panel.appendChild(matchEl);
406
- panel.appendChild(varsEl);
407
- panel.appendChild(queryEl);
408
- panel.appendChild(timelineWrap);
409
- panel.appendChild(filtersEl);
410
- panel.appendChild(filterDiagEl);
411
- panel.appendChild(small);
412
- shadow.appendChild(panel);
413
- document.body.appendChild(host);
414
- let collapsed = devtoolsCollapsed;
415
- const applyCollapsedState = (next) => {
416
- collapsed = next;
417
- if (collapsed) {
418
- panel.style.maxHeight = '24px';
419
- panel.style.overflow = 'hidden';
420
- collapseBtn.textContent = '+';
421
- }
422
- else {
423
- panel.style.maxHeight = '50vh';
424
- panel.style.overflow = 'auto';
425
- collapseBtn.textContent = '−';
426
- }
427
- };
428
- applyCollapsedState(devtoolsCollapsed);
429
- collapseBtn.addEventListener('click', () => {
430
- applyCollapsedState(!collapsed);
431
- });
432
- let unsub;
433
- closeBtn.addEventListener('click', () => {
434
- host.remove();
435
- if (typeof unsub === 'function') {
436
- unsub();
437
- }
438
- });
439
- let lastQuery;
440
- let lastSearch;
441
- function diffQueries(prev, next) {
442
- const added = [];
443
- const removed = [];
444
- const changed = [];
445
- const unchanged = [];
446
- const prevKeys = new Set(Object.keys(prev ?? {}));
447
- const nextKeys = new Set(Object.keys(next));
448
- nextKeys.forEach((k) => {
449
- if (!prevKeys.has(k)) {
450
- added.push(k);
451
- return;
452
- }
453
- let pv;
454
- if (prev != null) {
455
- pv = prev[k];
456
- }
457
- const nv = next[k];
458
- let same = false;
459
- if (Array.isArray(pv) && Array.isArray(nv)) {
460
- if (pv.length === nv.length) {
461
- same = pv.every((v, i) => {
462
- return v === nv[i];
463
- });
464
- }
465
- }
466
- else {
467
- same = pv === nv;
468
- }
469
- if (same) {
470
- unchanged.push(k);
471
- }
472
- else {
473
- changed.push(k);
474
- }
475
- prevKeys.delete(k);
476
- });
477
- prevKeys.forEach((k) => {
478
- removed.push(k);
479
- });
480
- return { added, removed, changed, unchanged };
481
- }
482
- function render() {
483
- try {
484
- const entry = context.get();
485
- pathEl.textContent = `${entry.location.pathname}${entry.location.search}`;
486
- const matchPath = entry.route?.route.path;
487
- matchEl.textContent = `match: ${matchPath ?? '(no route matched)'}`;
488
- const varsJson = JSON.stringify(entry.route?.params ?? {}, null, 2);
489
- varsEl.textContent = `vars: ${varsJson}`;
490
- const rawJson = JSON.stringify(entry.query, null, 2);
491
- queryEl.textContent = `raw: ${rawJson}`;
492
- const filtersJson = JSON.stringify(entry.filters, null, 2);
493
- filtersEl.textContent = `filters:${filtersJson}`;
494
- const diag = entry.filterDiagnostics ?? [];
495
- filterDiagEl.textContent = `filterDiagnostics: ${diag.length}`;
496
- if (entry.rawSearch !== lastSearch) {
497
- const nowQuery = entry.query;
498
- const diff = diffQueries(lastQuery, nowQuery);
499
- const row = document.createElement('div');
500
- row.style.display = 'flex';
501
- row.style.flexDirection = 'column';
502
- row.style.borderBottom = '1px solid #e9e9e9';
503
- row.style.padding = '3px 4px';
504
- const head = document.createElement('div');
505
- head.style.display = 'flex';
506
- head.style.justifyContent = 'space-between';
507
- const ts = new Date().toLocaleTimeString();
508
- let searchDisplay = '(empty)';
509
- if (entry.location.search !== '') {
510
- searchDisplay = entry.location.search;
511
- }
512
- head.innerHTML = `<strong>${ts}</strong> <code style="background:#eee;padding:1px 3px;border-radius:3px;">${searchDisplay}</code>`;
513
- const body = document.createElement('div');
514
- body.style.display = 'flex';
515
- body.style.flexWrap = 'wrap';
516
- body.style.gap = '4px';
517
- function pill(label, kind) {
518
- const span = document.createElement('span');
519
- span.textContent = label;
520
- span.style.padding = '1px 4px';
521
- span.style.borderRadius = '10px';
522
- span.style.fontSize = '10px';
523
- span.style.border = '1px solid';
524
- switch (kind) {
525
- case 'added':
526
- span.style.background = '#e6ffed';
527
- span.style.borderColor = '#2cbe4e';
528
- span.style.color = '#22863a';
529
- break;
530
- case 'removed':
531
- span.style.background = '#ffeef0';
532
- span.style.borderColor = '#d73a49';
533
- span.style.color = '#cb2431';
534
- break;
535
- case 'changed':
536
- span.style.background = '#fff5b1';
537
- span.style.borderColor = '#ffd33d';
538
- span.style.color = '#735c0f';
539
- break;
540
- case 'unchanged':
541
- span.style.background = '#f1f8ff';
542
- span.style.borderColor = '#79b8ff';
543
- span.style.color = '#0366d6';
544
- break;
545
- default:
546
- break;
547
- }
548
- return span;
549
- }
550
- if (diff.added.length > 0) {
551
- body.append(...diff.added.map((k) => {
552
- return pill(`+${k}`, 'added');
553
- }));
554
- }
555
- if (diff.changed.length > 0) {
556
- body.append(...diff.changed.map((k) => {
557
- return pill(`~${k}`, 'changed');
558
- }));
559
- }
560
- if (diff.removed.length > 0) {
561
- body.append(...diff.removed.map((k) => {
562
- return pill(`-${k}`, 'removed');
563
- }));
564
- }
565
- const noAdds = diff.added.length === 0;
566
- const noChanges = diff.changed.length === 0;
567
- const noRemovals = diff.removed.length === 0;
568
- if (noAdds && noChanges && noRemovals) {
569
- body.append(pill('no-change', 'unchanged'));
570
- }
571
- row.appendChild(head);
572
- row.appendChild(body);
573
- timeline.appendChild(row);
574
- if (timeline.childElementCount > 50) {
575
- const first = timeline.firstElementChild;
576
- if (first != null) {
577
- timeline.removeChild(first);
578
- }
579
- }
580
- lastQuery = nowQuery;
581
- lastSearch = entry.rawSearch;
582
- }
583
- }
584
- catch {
576
+ function cleanup() {
577
+ disposeHistory();
578
+ if (debugSubscribers !== null) {
579
+ debugSubscribers.clear();
580
+ }
581
+ if (debugEnabled) {
582
+ try {
583
+ if (typeof window !== 'undefined') {
584
+ const bridgeWindow = window;
585
+ if (bridgeWindow.__PLUMILE_ROUTER__ === routerGlobal) {
586
+ delete bridgeWindow.__PLUMILE_ROUTER__;
585
587
  }
586
588
  }
587
- render();
588
- unsub = context.subscribe(() => {
589
- render();
590
- });
591
- window.addEventListener('keydown', (ev) => {
592
- try {
593
- const parts = [];
594
- if (ev.altKey)
595
- parts.push('Alt');
596
- if (ev.shiftKey)
597
- parts.push('Shift');
598
- if (ev.ctrlKey)
599
- parts.push('Ctrl');
600
- let keyPart = ev.key;
601
- if (ev.key.length === 1) {
602
- keyPart = ev.key.toUpperCase();
603
- }
604
- parts.push(keyPart);
605
- const combo = parts.join('+');
606
- if (combo === devtoolsShortcut.replace(/\s+/g, '')) {
607
- if (host.style.display === 'none') {
608
- host.style.display = 'block';
609
- }
610
- else {
611
- host.style.display = 'none';
612
- }
613
- }
614
- }
615
- catch {
616
- }
617
- });
589
+ }
590
+ catch {
618
591
  }
619
592
  }
620
- catch {
621
- }
593
+ routerGlobal = null;
622
594
  }
623
- return { cleanup, context };
595
+ return { context, cleanup };
624
596
  }
625
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLG1CQUFtQixNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUF1RDlELE1BQU0sQ0FBQyxPQUFPLFVBQVUsWUFBWSxDQUNsQyxNQUEyQixFQUMzQixPQVNJLEVBQUU7SUFHTixJQUFJLGNBQXVCLENBQUM7SUFDNUIsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzFCLElBQUksZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0lBQ3JDLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQzlCLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ3hCLElBQUksQ0FBQztnQkFDSCxPQUFPLENBQ0wsT0FBTyxPQUFPLEtBQUssV0FBVztvQkFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUN0QyxDQUFDO1lBQ0osQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ0wsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztR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QyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7Z0NBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzs0QkFDL0IsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzs0QkFDOUIsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7b0JBQUMsTUFBTSxDQUFDO29CQUVULENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE1BQU0sQ0FBQztRQUVULENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQTZCLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkUm91dGVzIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0TWF0Y2hlZFJvdXRlLCBwcmVwYXJlTWF0Y2ggfSBmcm9tICcuLi90b29scy5qcyc7XG5pbXBvcnQgeyBwYXJzZVJhd1F1ZXJ5IH0gZnJvbSAnLi4vdG9vbHMvcXVlcnkuanMnO1xuaW1wb3J0IGJ1aWxkQ29tYmluZWRTZWFyY2ggZnJvbSAnLi4vdG9vbHMvYnVpbGRDb21iaW5lZFNlYXJjaC5qcyc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZUZpbHRlcnMgfSBmcm9tICdAcGx1bWlsZS9maWx0ZXItcXVlcnknO1xuaW1wb3J0IHR5cGUge1xuICBSb3V0ZUVudHJ5LFxuICBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIFN1YnNjcmliZUNhbGxiYWNrLFxuICBBbnlSb3V0ZSxcbiAgUHJlcGFyZWRBY2Nlc3MsXG4gIE5hdmlnYXRlT3ZlcmxvYWRzLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSBjcmVhdGVSb3V0ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlclJldHVybjxSIGV4dGVuZHMgQW55Um91dGVbXT4gPSB7XG4gIC8qKiBGdW5jdGlvbiB0byBjbGVhbiB1cCByb3V0ZXIgbGlzdGVuZXJzIGFuZCByZXNvdXJjZXMgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIFJvdXRlciBjb250ZXh0IG9iamVjdCBmb3IgdGhlIFJlYWN0IENvbnRleHQgUHJvdmlkZXIgKi9cbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT4gJiBQcmVwYXJlZEFjY2VzczxSPjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHJvdXRlciBzeXN0ZW0gZnJvbSByb3V0ZSBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBUaGlzIHJvdXRlciBpcyBidWlsdCBmcm9tIHRoZSBzYW1lIHByaW1pdGl2ZXMgYXMgcmVhY3Qtcm91dGVyIGJ1dCB3aXRoIGFkZGl0aW9uYWxcbiAqIGZlYXR1cmVzIGZvciBkYXRhIHByZWxvYWRpbmcgYW5kIGNvZGUgc3BsaXR0aW5nLiBFYWNoIHJvdXRlIGNhbiBjb250YWluIGJvdGggYVxuICogQ29tcG9uZW50IGFuZCBhIHByZXBhcmUoKSBmdW5jdGlvbiB0aGF0IGNhbiBwcmVsb2FkIGRhdGEgZm9yIHRoZSBjb21wb25lbnQuXG4gKlxuICogVGhlIHJvdXRlciB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIHZpYSB0aGUgSFRNTDUgSGlzdG9yeSBBUEksXG4gKiBtYXBzIHRoZSBsb2NhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyByb3V0ZSBlbnRyeSwgYW5kIHRoZW4gcHJlbG9hZHMgdGhlIGNvZGVcbiAqIGFuZCBkYXRhIGZvciB0aGUgcm91dGUgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gQXJyYXkgb2Ygcm91dGUgY29uZmlndXJhdGlvbnNcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSByb3V0ZXIgY29udGV4dCBhbmQgY2xlYW51cCBmdW5jdGlvblxuICpcbiAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZU1hdGNoKHJvdXRlLCBwYXJzZVJhd1F1ZXJ5KGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSksXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByb3V0ZXMgPSBbXG4gKiAgIHtcbiAqICAgICBwYXRoOiAnL3VzZXJzLzppZCcsXG4gKiAgICAgcmVzb3VyY2VQYWdlOiBnZXRSZXNvdXJjZVBhZ2UoJ1VzZXJQcm9maWxlJywgKCkgPT4gaW1wb3J0KCcuL1VzZXJQcm9maWxlJykpLFxuICogICAgIHByZXBhcmU6ICh7IHZhcmlhYmxlcyB9KSA9PiAoeyB1c2VySWQ6IHZhcmlhYmxlcy5pZCB9KVxuICogICB9XG4gKiBdO1xuICpcbiAqIGNvbnN0IHsgY29udGV4dCwgY2xlYW51cCB9ID0gY3JlYXRlUm91dGVyKHJvdXRlcyk7XG4gKlxuICogLy8gVXNlIGluIFJlYWN0IGFwcFxuICogPFJvdXRpbmdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjb250ZXh0fT5cbiAqICAgPFJvdXRlclJlbmRlcmVyIC8+XG4gKiA8L1JvdXRpbmdDb250ZXh0LlByb3ZpZGVyPlxuICogYGBgXG4gKi9cbi8qKlxuICogQ3JlYXRlIGEgcm91dGVyICh0eXBlZCBvdmVybG9hZCkuIFdoZW4gY2FsbGVkIHdpdGggYSBjb25zdCB0dXBsZSBvZiByb3V0ZXMsIGdlbmVyaWNzIGFyZSBwcmVzZXJ2ZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcjxSIGV4dGVuZHMgQW55Um91dGVbXT4oXG4gIHJvdXRlczogWy4uLlJdIHwgQW55Um91dGVbXSxcbiAgb3B0czoge1xuICAgIGRldnRvb2xzPzpcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB7XG4gICAgICAgICAgZ2xvYmFsPzogYm9vbGVhbjtcbiAgICAgICAgICBwYW5lbD86IGJvb2xlYW47XG4gICAgICAgICAgc2hvcnRjdXQ/OiBzdHJpbmc7XG4gICAgICAgICAgY29sbGFwc2VkPzogYm9vbGVhbjtcbiAgICAgICAgfTtcbiAgfSA9IHt9LFxuKTogQ3JlYXRlUm91dGVyUmV0dXJuPFIgZXh0ZW5kcyBBbnlSb3V0ZVtdID8gUiA6IEFueVJvdXRlW10+IHtcbiAgLy8gTm9ybWFsaXplIGRldnRvb2xzIG9wdGlvbnMgbWFpbnRhaW5pbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgbGV0IGRldnRvb2xzR2xvYmFsOiBib29sZWFuO1xuICBsZXQgZGV2dG9vbHNQYW5lbCA9IGZhbHNlO1xuICBsZXQgZGV2dG9vbHNTaG9ydGN1dCA9ICdBbHQrU2hpZnQrUic7XG4gIGxldCBkZXZ0b29sc0NvbGxhcHNlZCA9IGZhbHNlO1xuICBpZiAodHlwZW9mIG9wdHMuZGV2dG9vbHMgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgYmFzZUVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBvcHRzLmRldnRvb2xzLmdsb2JhbCA/PyBiYXNlRW5hYmxlZDtcbiAgICBkZXZ0b29sc1BhbmVsID0gISFvcHRzLmRldnRvb2xzLnBhbmVsO1xuICAgIGRldnRvb2xzQ29sbGFwc2VkID0gb3B0cy5kZXZ0b29scy5jb2xsYXBzZWQgPz8gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdHMuZGV2dG9vbHMuc2hvcnRjdXQgPT09ICdzdHJpbmcnICYmXG4gICAgICBvcHRzLmRldnRvb2xzLnNob3J0Y3V0LnRyaW0oKSAhPT0gJydcbiAgICApIHtcbiAgICAgIGRldnRvb2xzU2hvcnRjdXQgPSBvcHRzLmRldnRvb2xzLnNob3J0Y3V0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBib29sZWFuIG9yIHVuZGVmaW5lZFxuICAgIGNvbnN0IGVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmRldnRvb2xzID09PSAnYm9vbGVhbicpIHJldHVybiBvcHRzLmRldnRvb2xzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBlbmFibGVkO1xuICB9XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuXG4gIC8vIEJ1aWxkIGEgZmxhdCBsaXN0IG9mIHJvdXRlcyBmb3IgZWZmaWNpZW50IG1hdGNoaW5nXG4gIGNvbnN0IGZsYXRSb3V0ZXMgPSBidWlsZFJvdXRlcyhyb3V0ZXMpO1xuXG4gIC8vIEZpbmQgdGhlIGluaXRpYWwgcm91dGUgbWF0Y2ggYW5kIHByZXBhcmUgaXQgZm9yIHJlbmRlcmluZ1xuICBjb25zdCByb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgY29uc3QgaW5pdGlhbFJhd1F1ZXJ5ID0gcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCk7XG4gIC8vIERpcmVjdCBzY2hlbWE6IG9ubHkgdGhlIG1hdGNoZWQgcm91dGUncyBvd24gcXVlcnlTY2hlbWEgKG5vIGhpZXJhcmNoaWNhbCBkaXNjb3ZlcnkpXG4gIGxldCBpbml0aWFsVW5pZmllZFNjaGVtYTogYW55O1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGNvbnN0IGxhc3QgPSByb3V0ZS5yb3V0ZS5yb3V0ZXMuYXQoLTEpIGFzIHVua25vd24gYXMge1xuICAgICAgcXVlcnlTY2hlbWE/OiB1bmtub3duO1xuICAgIH0gfCBudWxsO1xuICAgIGlmIChsYXN0ICE9IG51bGwpIHtcbiAgICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hID0gbGFzdC5xdWVyeVNjaGVtYTtcbiAgICB9XG4gIH1cbiAgbGV0IGluaXRpYWxGaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgbGV0IGluaXRpYWxGaWx0ZXJEaWFnbm9zdGljczogYW55W10gfCB1bmRlZmluZWQ7XG4gIGlmIChpbml0aWFsVW5pZmllZFNjaGVtYSAhPSBudWxsKSB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGaWx0ZXJzKGhpc3RvcnkubG9jYXRpb24uc2VhcmNoLCBpbml0aWFsVW5pZmllZFNjaGVtYSk7XG4gICAgaW5pdGlhbEZpbHRlcnMgPSBwYXJzZWQuZmlsdGVycyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGluaXRpYWxGaWx0ZXJEaWFnbm9zdGljcyA9IHBhcnNlZC5kaWFnbm9zdGljcyBhcyB1bmtub3duW107XG4gIH1cbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChyb3V0ZSwgaW5pdGlhbEZpbHRlcnMpO1xuICAvLyBIZWxwZXIgdG8gYnVpbGQgdGhlIHJhdyBxdWVyeSBvYmplY3QgZnJvbSBhIHNlYXJjaCBzdHJpbmdcbiAgbGV0IGN1cnJlbnRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgIHJvdXRlLFxuICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgcmF3U2VhcmNoOiBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBxdWVyeTogaW5pdGlhbFJhd1F1ZXJ5LFxuICAgIC8vIHR5cGVkUXVlcnkgcmVtb3ZlZCAodW5pZmllZCBpbnRvIGZpbHRlcnMvcXVlcnkpXG4gICAgZmlsdGVyczogaW5pdGlhbEZpbHRlcnMsXG4gICAgZmlsdGVyRGlhZ25vc3RpY3M6IGluaXRpYWxGaWx0ZXJEaWFnbm9zdGljcyxcbiAgICBhY3RpdmVRdWVyeVNjaGVtYTogaW5pdGlhbFVuaWZpZWRTY2hlbWEsXG4gIH07XG5cbiAgLy8gSW5pdGlhbCBub3JtYWxpemF0aW9uIHBhc3MgKGUuZy4sIGNsYW1wIHBhZ2UpXG4gIGNvbnN0IGluaXRUeXBlZCA9IGN1cnJlbnRFbnRyeS5maWx0ZXJzIGFzIHVua25vd24gYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCB1bmRlZmluZWQ7XG4gIGxldCBpbml0UGFnZU51bWVyaWM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaWYgKGluaXRUeXBlZCAhPSBudWxsKSB7XG4gICAgY29uc3QgcmF3UGFnZSA9IGluaXRUeXBlZC5wYWdlO1xuICAgIGlmICh0eXBlb2YgcmF3UGFnZSA9PT0gJ251bWJlcicpIGluaXRQYWdlTnVtZXJpYyA9IHJhd1BhZ2U7XG4gICAgZWxzZSBpZiAoXG4gICAgICByYXdQYWdlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiByYXdQYWdlID09PSAnb2JqZWN0JyAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkocmF3UGFnZSkgJiZcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyYXdQYWdlLCAnZXEnKSAmJlxuICAgICAgdHlwZW9mIChyYXdQYWdlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5lcSA9PT0gJ251bWJlcidcbiAgICApIHtcbiAgICAgIGluaXRQYWdlTnVtZXJpYyA9IChyYXdQYWdlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5lcSBhcyBudW1iZXI7XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICB0eXBlb2YgaW5pdFBhZ2VOdW1lcmljID09PSAnbnVtYmVyJyAmJlxuICAgIGluaXRQYWdlTnVtZXJpYyA8IDEgJiZcbiAgICBpbml0aWFsVW5pZmllZFNjaGVtYSAhPSBudWxsICYmXG4gICAgaW5pdFR5cGVkICE9IG51bGxcbiAgKSB7XG4gICAgY29uc3Qgbm9ybSA9IHsgLi4uaW5pdFR5cGVkLCBwYWdlOiB7IGVxOiAxIH0gfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjdXJyZW50RW50cnkuZmlsdGVycyA9IG5vcm07IC8vIGltbWVkaWF0ZSB2aXNpYmlsaXR5XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgZmlsdGVyczogbm9ybSxcbiAgICAgIHF1ZXJ5U2NoZW1hOiBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgICB9KTsgLy8gcmV0dXJucyAnJyBvciBzdHJpbmcgc3RhcnRpbmcgd2l0aCAnPydcbiAgICBpZiAobm9ybWFsaXplZFNlYXJjaCAhPT0gaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICB9KTtcbiAgICAgIC8vIFVwZGF0ZSBjdXJyZW50RW50cnkubG9jYXRpb24gdG8gcmVmbGVjdCBuZXcgc2VhcmNoIGRpcmVjdGx5IChoaXN0b3J5LnNldCB0cmlnZ2VycyBhc3luYyBzdWJzY3JpYmVyKVxuICAgICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgICAuLi5jdXJyZW50RW50cnksXG4gICAgICAgIGxvY2F0aW9uOiB7IC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbiwgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoIH0sXG4gICAgICAgIHJhd1NlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGNsZWFudXAgPSBoaXN0b3J5LnN1YnNjcmliZSgobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIpID0+IHtcbiAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNhbWVTZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggPT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2g7XG5cbiAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgICAvLyB3ZSB3aWxsIHNldCBiZWxvdyBhZnRlciBjb21wdXRpbmcgdHlwZWQgcXVlcnlcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkobG9jYXRpb24uc2VhcmNoKTtcbiAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgbGV0IHF1ZXJ5U2NoZW1hOiBhbnk7XG4gICAgaWYgKG5leHRSb3V0ZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBsYXN0ID0gbmV4dFJvdXRlLnJvdXRlLnJvdXRlcy5hdCgtMSkgYXMgdW5rbm93biBhcyB7XG4gICAgICAgIHF1ZXJ5U2NoZW1hPzogdW5rbm93bjtcbiAgICAgIH0gfCBudWxsO1xuICAgICAgaWYgKGxhc3QgIT0gbnVsbCkge1xuICAgICAgICBxdWVyeVNjaGVtYSA9IGxhc3QucXVlcnlTY2hlbWE7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFBhcnNlIHVuaWZpZWQgZmlsdGVyc1xuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmlsdGVyRGlhZ25vc3RpY3M6IGFueVtdIHwgdW5kZWZpbmVkO1xuICAgIGlmIChxdWVyeVNjaGVtYSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBwYXJzZWRGID0gcGFyc2VGaWx0ZXJzKGxvY2F0aW9uLnNlYXJjaCwgcXVlcnlTY2hlbWEpO1xuICAgICAgZmlsdGVycyA9IHBhcnNlZEYuZmlsdGVycyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgZmlsdGVyRGlhZ25vc3RpY3MgPSBwYXJzZWRGLmRpYWdub3N0aWNzIGFzIHVua25vd25bXTtcbiAgICB9XG4gICAgLy8gTm9ybWFsaXphdGlvbjogY2xhbXAgcGFnZSA+PSAxIGlmIG51bWVyaWMgcGFnZSBwcmVzZW50XG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBmYWxzZTtcbiAgICBsZXQgcGc6IHVua25vd247XG4gICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkge1xuICAgICAgY29uc3QgZjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBmaWx0ZXJzO1xuICAgICAgY29uc3QgbWF5YmUgPSBmLnBhZ2U7XG4gICAgICBpZiAoXG4gICAgICAgIG1heWJlICE9IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIG1heWJlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShtYXliZSkgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1heWJlLCAnZXEnKVxuICAgICAgKSB7XG4gICAgICAgIHBnID0gKG1heWJlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5lcTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBnID0gbWF5YmU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGcgPT09ICdudW1iZXInICYmIHBnIDwgMSkge1xuICAgICAgY29uc3QgY2xvbmUgPSB7IC4uLihmaWx0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLCBwYWdlOiB7IGVxOiAxIH0gfTtcbiAgICAgIGZpbHRlcnMgPSBjbG9uZTtcbiAgICAgIG5vcm1hbGl6ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIG9ubHkgdGhlIHNlYXJjaCBjaGFuZ2VkIChzYW1lIHBhdGhuYW1lKSB3ZSBzdGlsbCBuZWVkIHRvIHJlLXJ1biBwcmVwYXJlXG4gICAgaWYgKCFzYW1lUGF0aG5hbWUgfHwgIXNhbWVTZWFyY2gpIHtcbiAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICAgIGZvcmNlUmVyZW5kZXI6IGZvcmNlUmVyZW5kZXIgfHwgKHNhbWVQYXRobmFtZSAmJiAhc2FtZVNlYXJjaCksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICBwcmVwYXJlZE1hdGNoOiBuZXh0UHJlcGFyZWRNYXRjaCxcbiAgICAgIHJhd1NlYXJjaDogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgcXVlcnksXG4gICAgICBmaWx0ZXJzLFxuICAgICAgZmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgICBhY3RpdmVRdWVyeVNjaGVtYTogcXVlcnlTY2hlbWEsXG4gICAgfTtcblxuICAgIC8vIElmIG5vcm1hbGl6YXRpb24gY2hhbmdlZCB0aGUgdHlwZWQgcXVlcnkgd2UgdHJpZ2dlciBhIHJlcGxhY2Ugd2l0aCBub3JtYWxpemVkIHNlYXJjaFxuICAgIGlmIChub3JtYWxpemVkICYmIHF1ZXJ5U2NoZW1hICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZENvbWJpbmVkU2VhcmNoKHtcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgcXVlcnlTY2hlbWEsXG4gICAgICB9KTtcbiAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgbGV0IG5leHRTZWFyY2hTdHIgPSBub3JtYWxpemVkU2VhcmNoO1xuICAgICAgICBpZiAoIW5leHRTZWFyY2hTdHIuc3RhcnRzV2l0aCgnPycpKSB7XG4gICAgICAgICAgaWYgKG5leHRTZWFyY2hTdHIgPT09ICcnKSBuZXh0U2VhcmNoU3RyID0gJyc7XG4gICAgICAgICAgZWxzZSBuZXh0U2VhcmNoU3RyID0gYD8ke25leHRTZWFyY2hTdHJ9YDtcbiAgICAgICAgfVxuICAgICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgIHNlYXJjaDogbmV4dFNlYXJjaFN0cixcbiAgICAgICAgICBoYXNoOiAnJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjsgLy8gZWFybHk6IHN1YnNlcXVlbnQgc2V0IHdpbGwgdHJpZ2dlciByZXJ1blxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjdXJyZW50IGVudHJ5IGFuZCBub3RpZnkgYWxsIHN1YnNjcmliZXJzXG4gICAgY3VycmVudEVudHJ5ID0gbmV4dEVudHJ5O1xuICAgIHN1YnNjcmliZXJzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICBjYWxsYmFjayhuZXh0RW50cnkpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBUaGUgcm91dGVyIGNvbnRleHQgb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gUmVhY3QgQ29udGV4dFxuICBjb25zdCBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55PiAmXG4gICAgUHJlcGFyZWRBY2Nlc3M8QW55Um91dGVbXT4gJiB7XG4gICAgICBuYXZpZ2F0ZTogTmF2aWdhdGVPdmVybG9hZHM8QW55Um91dGVbXT47XG4gICAgfSA9IHtcbiAgICBoaXN0b3J5LFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50RW50cnk7XG4gICAgfSxcbiAgICBwcmVsb2FkQ29kZShwYXRobmFtZSkge1xuICAgICAgLy8gUHJlbG9hZCBqdXN0IHRoZSBjb21wb25lbnQgY29kZSBmb3IgYSByb3V0ZSB3aXRob3V0IHN0b3JpbmcgdGhlIHJlc3VsdFxuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgYWxsIHJlc291cmNlIHBhZ2VzIGZvciB0aGUgbWF0Y2hlZCByb3V0ZVxuICAgICAgbWF0Y2hlcy5yb3V0ZS5yb3V0ZXMuZm9yRWFjaCgoeyByZXNvdXJjZVBhZ2UgfSkgPT4ge1xuICAgICAgICBpZiAocmVzb3VyY2VQYWdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICByZXNvdXJjZVBhZ2UubG9hZCgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwcmVsb2FkKHBhdGhuYW1lKSB7XG4gICAgICAvLyBQcmVsb2FkIGJvdGggdGhlIGNvbXBvbmVudCBjb2RlIGFuZCBwcmVwYXJlZCBkYXRhIGZvciBhIHJvdXRlXG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgcHJlcGFyZU1hdGNoKG1hdGNoZXMpO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBBZGQgYSBuZXcgc3Vic2NyaWJlciBhbmQgcmV0dXJuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAgICBuZXh0SWQgKz0gMTtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtc3R5bGVcbiAgICAgIGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9O1xuICAgICAgc3Vic2NyaWJlcnMuc2V0KGlkLCBjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZGlzcG9zZTtcbiAgICB9LFxuICAgIG5hdmlnYXRlKHsgcGF0aG5hbWUsIHF1ZXJ5LCBmaWx0ZXJzOiBuYXZGaWx0ZXJzLCByZXBsYWNlIH06IGFueSkge1xuICAgICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRFbnRyeTtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGhuYW1lID0gcGF0aG5hbWUgPz8gY3VycmVudC5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgIC8vIERldGVybWluZSBzY2hlbWEgb2YgZGVzdGluYXRpb24gKGlmIHNhbWUgcGF0aCBhbmQgd2UgaGF2ZSByb3V0ZSB3ZSBjYW4gcmV1c2UsIGVsc2UgcmVtYXRjaClcbiAgICAgIGxldCBkZXN0U2NoZW1hOiBhbnk7XG4gICAgICAvLyBBbHdheXMgYXR0ZW1wdCBmdWxsIG1hdGNoIGZvciBkZXN0aW5hdGlvbiB0byBlbnN1cmUgc2NoZW1hIHByZXNlbnQgZXZlbiBpZiBzYW1lIHBhdGhuYW1lXG4gICAgICBjb25zdCBkZXN0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGRlc3RSb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBkZXN0Um91dGUucm91dGUucm91dGVzLmF0KC0xKSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBxdWVyeVNjaGVtYT86IHVua25vd247XG4gICAgICAgIH0gfCBudWxsO1xuICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7XG4gICAgICAgICAgZGVzdFNjaGVtYSA9IGxhc3QucXVlcnlTY2hlbWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZhbGxiYWNrIHRvIGN1cnJlbnRseSBhY3RpdmUgc2NoZW1hIGlmIGRlc3RpbmF0aW9uIHNjaGVtYSBub3QgZm91bmQgKGUuZy4sIHJhY2UgY29uZGl0aW9ucylcbiAgICAgIGRlc3RTY2hlbWEgPz89IGN1cnJlbnQuYWN0aXZlUXVlcnlTY2hlbWE7XG4gICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJzID0gbmF2RmlsdGVycyA/PyBjdXJyZW50LmZpbHRlcnM7XG4gICAgICAvLyBUcmVhdCBsZWdhY3kgbmF2aWdhdGUoeyBxdWVyeSB9KSBhcyBmaWx0ZXJzIGluIHVuaWZpZWQgbW9kZWwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IGZpbHRlcnNJbnB1dCA9XG4gICAgICAgIGVmZmVjdGl2ZUZpbHRlcnMgPz8gKHF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgICBmaWx0ZXJzOiBmaWx0ZXJzSW5wdXQsXG4gICAgICAgIHF1ZXJ5U2NoZW1hOiBkZXN0U2NoZW1hLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHsgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgICBpZiAocmVwbGFjZSA9PT0gdHJ1ZSkge1xuICAgICAgICBoaXN0b3J5LnNldChsb2NhdGlvbk9iaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoaXN0b3J5LnB1c2gobG9jYXRpb25PYmopO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0UHJlcGFyZWQocGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBjdXJyZW50RW50cnk7XG4gICAgICAgIC8vIEZpbmQgbGFzdCBwcmVwYXJlZCByb3V0ZSB3aXRoIG1hdGNoaW5nIHBhdGhcbiAgICAgICAgZm9yIChjb25zdCBwciBvZiBlbnRyeS5wcmVwYXJlZE1hdGNoLnJvdXRlcykge1xuICAgICAgICAgIGlmIChwci5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gcHIucHJlcGFyZWQgYXMgYW55O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBnZXRUeXBlZFF1ZXJ5IHJlbW92ZWRcbiAgfTtcblxuICAvLyBSZXR1cm4gYm90aCB0aGUgY29udGV4dCBvYmplY3QgYW5kIGEgY2xlYW51cCBmdW5jdGlvblxuICAvLyBEZXZ0b29scyBleHBvc3VyZSAoZGV2ZWxvcG1lbnQgb25seSlcbiAgaWYgKGRldnRvb2xzR2xvYmFsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAod2luZG93IGFzIHVua25vd24gYXMgeyBfX1BMVU1JTEVfUk9VVEVSX18/OiBhbnkgfSkuX19QTFVNSUxFX1JPVVRFUl9fID1cbiAgICAgICAgICB7XG4gICAgICAgICAgICBnZXQ6IGNvbnRleHQuZ2V0LFxuICAgICAgICAgICAgc3Vic2NyaWJlOiBjb250ZXh0LnN1YnNjcmliZSxcbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICB9XG4gIC8vIE9wdGlvbmFsIGluLXBhZ2UgZGV2dG9vbHMgcGFuZWwgKGxpZ2h0d2VpZ2h0IG92ZXJsYXkpXG4gIGlmIChkZXZ0b29sc1BhbmVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wbHVtaWxlLXJvdXRlci1kZXZ0b29scy1wYW5lbF0nKSA9PSBudWxsXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBob3N0LnNldEF0dHJpYnV0ZSgnZGF0YS1wbHVtaWxlLXJvdXRlci1kZXZ0b29scy1wYW5lbCcsICcnKTtcbiAgICAgICAgaG9zdC5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICAgIGhvc3Quc3R5bGUuekluZGV4ID0gJzIxNDc0ODM2NDYnO1xuICAgICAgICBob3N0LnN0eWxlLmJvdHRvbSA9ICc4cHgnO1xuICAgICAgICBob3N0LnN0eWxlLnJpZ2h0ID0gJzhweCc7XG4gICAgICAgIGhvc3Quc3R5bGUuZm9udEZhbWlseSA9XG4gICAgICAgICAgJ3VpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkxpYmVyYXRpb24gTW9ub1wiLCBtb25vc3BhY2UnO1xuICAgICAgICBob3N0LnN0eWxlLmZvbnRTaXplID0gJzEycHgnO1xuICAgICAgICBob3N0LnN0eWxlLmxpbmVIZWlnaHQgPSAnMS4zJztcbiAgICAgICAgaG9zdC5zdHlsZS5jb2xvciA9ICcjMTExJztcbiAgICAgICAgaG9zdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgaG9zdC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICBjb25zdCBzaGFkb3cgPSBob3N0LmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcGFuZWwuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgcGFuZWwuc3R5bGUubWluV2lkdGggPSAnMjYwcHgnO1xuICAgICAgICBwYW5lbC5zdHlsZS5tYXhXaWR0aCA9ICc0MjBweCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICc1MHZoJztcbiAgICAgICAgcGFuZWwuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgyNTUsMjU1LDI1NSwwLjk1KSc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2NjYyc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmJvcmRlclJhZGl1cyA9ICc2cHgnO1xuICAgICAgICBwYW5lbC5zdHlsZS5ib3hTaGFkb3cgPSAnMCAycHggOHB4IHJnYmEoMCwwLDAsMC4xNSknO1xuICAgICAgICBwYW5lbC5zdHlsZS5wYWRkaW5nID0gJzZweCA4cHggOHB4JztcbiAgICAgICAgcGFuZWwuc3R5bGUuYmFja2Ryb3BGaWx0ZXIgPSAnYmx1cig0cHgpJztcbiAgICAgICAgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgcGFuZWwuc3R5bGUuZmxleERpcmVjdGlvbiA9ICdjb2x1bW4nO1xuICAgICAgICBwYW5lbC5zdHlsZS5yb3dHYXAgPSAnNHB4JztcbiAgICAgICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGhlYWRlci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICBoZWFkZXIuc3R5bGUuYWxpZ25JdGVtcyA9ICdjZW50ZXInO1xuICAgICAgICBoZWFkZXIuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSAnc3BhY2UtYmV0d2Vlbic7XG4gICAgICAgIGhlYWRlci5zdHlsZS5nYXAgPSAnOHB4JztcbiAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHRpdGxlLnRleHRDb250ZW50ID0gJ1BsdW1pbGUgUm91dGVyJztcbiAgICAgICAgdGl0bGUuc3R5bGUuZm9udFdlaWdodCA9ICc2MDAnO1xuICAgICAgICBjb25zdCBidXR0b25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJ1dHRvbnMuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgYnV0dG9ucy5zdHlsZS5nYXAgPSAnNHB4JztcbiAgICAgICAgY29uc3QgY29sbGFwc2VCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgY29sbGFwc2VCdG4udGV4dENvbnRlbnQgPSAn4oiSJztcbiAgICAgICAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgY2xvc2VCdG4udGV4dENvbnRlbnQgPSAnw5cnO1xuICAgICAgICBjb25zdCBidG5zOiBIVE1MQnV0dG9uRWxlbWVudFtdID0gW2NvbGxhcHNlQnRuLCBjbG9zZUJ0bl07XG4gICAgICAgIGZvciAoY29uc3QgYiBvZiBidG5zKSB7XG4gICAgICAgICAgYi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgICAgICAgYi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNlZWUnO1xuICAgICAgICAgIGIuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjY2NjJztcbiAgICAgICAgICBiLnN0eWxlLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuICAgICAgICAgIGIuc3R5bGUuZm9udFNpemUgPSAnMTFweCc7XG4gICAgICAgICAgYi5zdHlsZS5saW5lSGVpZ2h0ID0gJzEnO1xuICAgICAgICAgIGIuc3R5bGUucGFkZGluZyA9ICcycHggNXB4JztcbiAgICAgICAgfVxuICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQodGl0bGUpO1xuICAgICAgICBidXR0b25zLmFwcGVuZENoaWxkKGNvbGxhcHNlQnRuKTtcbiAgICAgICAgYnV0dG9ucy5hcHBlbmRDaGlsZChjbG9zZUJ0bik7XG4gICAgICAgIGhlYWRlci5hcHBlbmRDaGlsZChidXR0b25zKTtcbiAgICAgICAgY29uc3QgcGF0aEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHBhdGhFbC5zdHlsZS53aGl0ZVNwYWNlID0gJ25vd3JhcCc7XG4gICAgICAgIGNvbnN0IG1hdGNoRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbWF0Y2hFbC5zdHlsZS53aGl0ZVNwYWNlID0gJ25vd3JhcCc7XG4gICAgICAgIGNvbnN0IHZhcnNFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpO1xuICAgICAgICBjb25zdCBxdWVyeUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICAgIC8vIHR5cGVkIHF1ZXJ5IGVsZW1lbnQgcmVtb3ZlZFxuICAgICAgICBjb25zdCBmaWx0ZXJzRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgY29uc3QgZmlsdGVyRGlhZ0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICAgIC8vIFRpbWVsaW5lIGNvbnRhaW5lclxuICAgICAgICBjb25zdCB0aW1lbGluZVdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGltZWxpbmVXcmFwLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIHRpbWVsaW5lV3JhcC5zdHlsZS5mbGV4RGlyZWN0aW9uID0gJ2NvbHVtbic7XG4gICAgICAgIHRpbWVsaW5lV3JhcC5zdHlsZS5nYXAgPSAnMnB4JztcbiAgICAgICAgdGltZWxpbmVXcmFwLnN0eWxlLm1hcmdpblRvcCA9ICc0cHgnO1xuICAgICAgICBjb25zdCB0aW1lbGluZUhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aW1lbGluZUhlYWRlci50ZXh0Q29udGVudCA9ICdUaW1lbGluZSAocXVlcnkgY2hhbmdlcyknO1xuICAgICAgICB0aW1lbGluZUhlYWRlci5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XG4gICAgICAgIHRpbWVsaW5lSGVhZGVyLnN0eWxlLmZvbnRTaXplID0gJzExcHgnO1xuICAgICAgICBjb25zdCB0aW1lbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5mbGV4RGlyZWN0aW9uID0gJ2NvbHVtbi1yZXZlcnNlJzsgLy8gbmV3ZXN0IG9uIHRvcCB2aXN1YWxseSB3aGlsZSBhcHBlbmRpbmcgYXQgZW5kIGZvciBjaGVhcGVyIG9wc1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5tYXhIZWlnaHQgPSAnMTQwcHgnO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2UyZTJlMic7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmYWZiZmMnO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5mb250RmFtaWx5ID0gJ2luaGVyaXQnO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5mb250U2l6ZSA9ICcxMXB4JztcbiAgICAgICAgdGltZWxpbmVXcmFwLmFwcGVuZENoaWxkKHRpbWVsaW5lSGVhZGVyKTtcbiAgICAgICAgdGltZWxpbmVXcmFwLmFwcGVuZENoaWxkKHRpbWVsaW5lKTtcbiAgICAgICAgY29uc3QgcHJlczogSFRNTFByZUVsZW1lbnRbXSA9IFtcbiAgICAgICAgICB2YXJzRWwsXG4gICAgICAgICAgcXVlcnlFbCxcbiAgICAgICAgICBmaWx0ZXJzRWwsXG4gICAgICAgICAgZmlsdGVyRGlhZ0VsLFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJlcykge1xuICAgICAgICAgIHAuc3R5bGUubWFyZ2luID0gJzAnO1xuICAgICAgICAgIHAuc3R5bGUucGFkZGluZyA9ICc0cHgnO1xuICAgICAgICAgIHAuc3R5bGUuYmFja2dyb3VuZCA9ICcjZjZmOGZhJztcbiAgICAgICAgICBwLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2UyZTJlMic7XG4gICAgICAgICAgcC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNHB4JztcbiAgICAgICAgICBwLnN0eWxlLm92ZXJmbG93WCA9ICdhdXRvJztcbiAgICAgICAgICBwLnN0eWxlLm1heEhlaWdodCA9ICcxNjBweCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc21hbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgc21hbGwuc3R5bGUuZm9udFNpemUgPSAnMTBweCc7XG4gICAgICAgIHNtYWxsLnN0eWxlLm9wYWNpdHkgPSAnMC43JztcbiAgICAgICAgc21hbGwudGV4dENvbnRlbnQgPSBgU2hvcnRjdXQ6ICR7ZGV2dG9vbHNTaG9ydGN1dH1gO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChoZWFkZXIpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChwYXRoRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChtYXRjaEVsKTtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQodmFyc0VsKTtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQocXVlcnlFbCk7XG4gICAgICAgIC8vIHR5cGVkRWwgcmVtb3ZlZFxuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZCh0aW1lbGluZVdyYXApO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChmaWx0ZXJzRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChmaWx0ZXJEaWFnRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChzbWFsbCk7XG4gICAgICAgIHNoYWRvdy5hcHBlbmRDaGlsZChwYW5lbCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaG9zdCk7XG4gICAgICAgIGxldCBjb2xsYXBzZWQgPSBkZXZ0b29sc0NvbGxhcHNlZDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtc3R5bGVcbiAgICAgICAgY29uc3QgYXBwbHlDb2xsYXBzZWRTdGF0ZSA9IChuZXh0OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgICAgY29sbGFwc2VkID0gbmV4dDtcbiAgICAgICAgICBpZiAoY29sbGFwc2VkKSB7XG4gICAgICAgICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSAnMjRweCc7XG4gICAgICAgICAgICBwYW5lbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgY29sbGFwc2VCdG4udGV4dENvbnRlbnQgPSAnKyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICc1MHZoJztcbiAgICAgICAgICAgIHBhbmVsLnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICAgICAgICAgICAgY29sbGFwc2VCdG4udGV4dENvbnRlbnQgPSAn4oiSJztcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGFwcGx5Q29sbGFwc2VkU3RhdGUoZGV2dG9vbHNDb2xsYXBzZWQpO1xuICAgICAgICBjb2xsYXBzZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBhcHBseUNvbGxhcHNlZFN0YXRlKCFjb2xsYXBzZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHVuc3ViOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIGhvc3QucmVtb3ZlKCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB1bnN1YiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdW5zdWIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvKiogVXBkYXRlIHBhbmVsIGNvbnRlbnQgZnJvbSBjdXJyZW50IHJvdXRlIGVudHJ5ICovXG4gICAgICAgIC8vIEtlZXAgbGFzdCBxdWVyeSBzbmFwc2hvdCBmb3IgZGlmZlxuICAgICAgICBsZXQgbGFzdFF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGxhc3RTZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbXB1dGUgZGlmZiBjbGFzc2lmaWNhdGlvbiBiZXR3ZWVuIHR3byBxdWVyeSBvYmplY3RzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGlmZlF1ZXJpZXMoXG4gICAgICAgICAgcHJldjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgbmV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICk6IHtcbiAgICAgICAgICBhZGRlZDogc3RyaW5nW107XG4gICAgICAgICAgcmVtb3ZlZDogc3RyaW5nW107XG4gICAgICAgICAgY2hhbmdlZDogc3RyaW5nW107XG4gICAgICAgICAgdW5jaGFuZ2VkOiBzdHJpbmdbXTtcbiAgICAgICAgfSB7XG4gICAgICAgICAgY29uc3QgYWRkZWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3QgcmVtb3ZlZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHVuY2hhbmdlZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBjb25zdCBwcmV2S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMocHJldiA/PyB7fSkpO1xuICAgICAgICAgIGNvbnN0IG5leHRLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhuZXh0KSk7XG4gICAgICAgICAgbmV4dEtleXMuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgaWYgKCFwcmV2S2V5cy5oYXMoaykpIHtcbiAgICAgICAgICAgICAgYWRkZWQucHVzaChrKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHB2OiB1bmtub3duO1xuICAgICAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBwcmV2IGlzIGEgcGxhaW4gcmVjb3JkOyBkaXJlY3QgaW5kZXggKHJ1bnRpbWUgc2FmZSlcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICBwdiA9IChwcmV2IGFzIGFueSlba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBudiA9IG5leHRba107XG4gICAgICAgICAgICBsZXQgc2FtZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHYpICYmIEFycmF5LmlzQXJyYXkobnYpKSB7XG4gICAgICAgICAgICAgIGlmIChwdi5sZW5ndGggPT09IChudiBhcyB1bmtub3duW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNhbWUgPSBwdi5ldmVyeSgodiwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHYgPT09IChudiBhcyB1bmtub3duW10pW2ldO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzYW1lID0gcHYgPT09IG52O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNhbWUpIHtcbiAgICAgICAgICAgICAgdW5jaGFuZ2VkLnB1c2goayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGFuZ2VkLnB1c2goayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2S2V5cy5kZWxldGUoayk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcHJldktleXMuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKGspO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7IGFkZGVkLCByZW1vdmVkLCBjaGFuZ2VkLCB1bmNoYW5nZWQgfTtcbiAgICAgICAgfVxuICAgICAgICAvKiogVXBkYXRlIHBhbmVsIGNvbnRlbnQgYW5kIG1heWJlIHB1c2ggdGltZWxpbmUgZW50cnkgKi9cbiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCk6IHZvaWQge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGNvbnRleHQuZ2V0KCk7XG4gICAgICAgICAgICBwYXRoRWwudGV4dENvbnRlbnQgPSBgJHtlbnRyeS5sb2NhdGlvbi5wYXRobmFtZX0ke2VudHJ5LmxvY2F0aW9uLnNlYXJjaH1gO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hQYXRoID0gZW50cnkucm91dGU/LnJvdXRlLnBhdGg7XG4gICAgICAgICAgICBtYXRjaEVsLnRleHRDb250ZW50ID0gYG1hdGNoOiAke21hdGNoUGF0aCA/PyAnKG5vIHJvdXRlIG1hdGNoZWQpJ31gO1xuICAgICAgICAgICAgY29uc3QgdmFyc0pzb24gPSBKU09OLnN0cmluZ2lmeShlbnRyeS5yb3V0ZT8ucGFyYW1zID8/IHt9LCBudWxsLCAyKTtcbiAgICAgICAgICAgIHZhcnNFbC50ZXh0Q29udGVudCA9IGB2YXJzOiAke3ZhcnNKc29ufWA7XG4gICAgICAgICAgICBjb25zdCByYXdKc29uID0gSlNPTi5zdHJpbmdpZnkoZW50cnkucXVlcnksIG51bGwsIDIpO1xuICAgICAgICAgICAgcXVlcnlFbC50ZXh0Q29udGVudCA9IGByYXc6ICAke3Jhd0pzb259YDtcbiAgICAgICAgICAgIC8vIHR5cGVkIHF1ZXJ5IHJlbW92ZWRcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcnNKc29uID0gSlNPTi5zdHJpbmdpZnkoZW50cnkuZmlsdGVycywgbnVsbCwgMik7XG4gICAgICAgICAgICBmaWx0ZXJzRWwudGV4dENvbnRlbnQgPSBgZmlsdGVyczoke2ZpbHRlcnNKc29ufWA7XG4gICAgICAgICAgICBjb25zdCBkaWFnID0gZW50cnkuZmlsdGVyRGlhZ25vc3RpY3MgPz8gW107XG4gICAgICAgICAgICBmaWx0ZXJEaWFnRWwudGV4dENvbnRlbnQgPSBgZmlsdGVyRGlhZ25vc3RpY3M6ICR7ZGlhZy5sZW5ndGh9YDtcbiAgICAgICAgICAgIC8vIFRpbWVsaW5lIGxvZyBpZiBxdWVyeSBzZWFyY2ggY2hhbmdlZFxuICAgICAgICAgICAgaWYgKGVudHJ5LnJhd1NlYXJjaCAhPT0gbGFzdFNlYXJjaCkge1xuICAgICAgICAgICAgICBjb25zdCBub3dRdWVyeSA9IGVudHJ5LnF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgICBjb25zdCBkaWZmID0gZGlmZlF1ZXJpZXMobGFzdFF1ZXJ5LCBub3dRdWVyeSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICByb3cuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgICAgICAgcm93LnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICAgICAgICAgICAgcm93LnN0eWxlLmJvcmRlckJvdHRvbSA9ICcxcHggc29saWQgI2U5ZTllOSc7XG4gICAgICAgICAgICAgIHJvdy5zdHlsZS5wYWRkaW5nID0gJzNweCA0cHgnO1xuICAgICAgICAgICAgICBjb25zdCBoZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgIGhlYWQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgICAgICAgaGVhZC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdzcGFjZS1iZXR3ZWVuJztcbiAgICAgICAgICAgICAgY29uc3QgdHMgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpO1xuICAgICAgICAgICAgICBsZXQgc2VhcmNoRGlzcGxheSA9ICcoZW1wdHkpJztcbiAgICAgICAgICAgICAgaWYgKGVudHJ5LmxvY2F0aW9uLnNlYXJjaCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hEaXNwbGF5ID0gZW50cnkubG9jYXRpb24uc2VhcmNoO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGhlYWQuaW5uZXJIVE1MID0gYDxzdHJvbmc+JHt0c308L3N0cm9uZz4gPGNvZGUgc3R5bGU9XCJiYWNrZ3JvdW5kOiNlZWU7cGFkZGluZzoxcHggM3B4O2JvcmRlci1yYWRpdXM6M3B4O1wiPiR7c2VhcmNoRGlzcGxheX08L2NvZGU+YDtcbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICBib2R5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgICAgIGJvZHkuc3R5bGUuZmxleFdyYXAgPSAnd3JhcCc7XG4gICAgICAgICAgICAgIGJvZHkuc3R5bGUuZ2FwID0gJzRweCc7XG4gICAgICAgICAgICAgIC8qKiBDcmVhdGUgYSBjb2xvcmVkIHBpbGwgZWxlbWVudCAqL1xuICAgICAgICAgICAgICBmdW5jdGlvbiBwaWxsKFxuICAgICAgICAgICAgICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAga2luZDogJ2FkZGVkJyB8ICdyZW1vdmVkJyB8ICdjaGFuZ2VkJyB8ICd1bmNoYW5nZWQnLFxuICAgICAgICAgICAgICApOiBIVE1MU3BhbkVsZW1lbnQge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGxhYmVsO1xuICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUucGFkZGluZyA9ICcxcHggNHB4JztcbiAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJvcmRlclJhZGl1cyA9ICcxMHB4JztcbiAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gJzEwcHgnO1xuICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCc7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlICdhZGRlZCc6XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZCA9ICcjZTZmZmVkJztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5ib3JkZXJDb2xvciA9ICcjMmNiZTRlJztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5jb2xvciA9ICcjMjI4NjNhJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlICdyZW1vdmVkJzpcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmZmVlZjAnO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJvcmRlckNvbG9yID0gJyNkNzNhNDknO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyNjYjI0MzEnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2NoYW5nZWQnOlxuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJhY2tncm91bmQgPSAnI2ZmZjViMSc7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2ZmZDMzZCc7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnIzczNWMwZic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSAndW5jaGFuZ2VkJzpcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmMWY4ZmYnO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJvcmRlckNvbG9yID0gJyM3OWI4ZmYnO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyMwMzY2ZDYnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBleGhhdXN0aXZlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzcGFuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChkaWZmLmFkZGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBib2R5LmFwcGVuZChcbiAgICAgICAgICAgICAgICAgIC4uLmRpZmYuYWRkZWQubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwaWxsKGArJHtrfWAsICdhZGRlZCcpO1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGlmZi5jaGFuZ2VkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBib2R5LmFwcGVuZChcbiAgICAgICAgICAgICAgICAgIC4uLmRpZmYuY2hhbmdlZC5tYXAoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBpbGwoYH4ke2t9YCwgJ2NoYW5nZWQnKTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRpZmYucmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAuLi5kaWZmLnJlbW92ZWQubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwaWxsKGAtJHtrfWAsICdyZW1vdmVkJyk7XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG5vQWRkcyA9IGRpZmYuYWRkZWQubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgICBjb25zdCBub0NoYW5nZXMgPSBkaWZmLmNoYW5nZWQubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgICBjb25zdCBub1JlbW92YWxzID0gZGlmZi5yZW1vdmVkLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgICAgaWYgKG5vQWRkcyAmJiBub0NoYW5nZXMgJiYgbm9SZW1vdmFscykge1xuICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKHBpbGwoJ25vLWNoYW5nZScsICd1bmNoYW5nZWQnKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGhlYWQpO1xuICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoYm9keSk7XG4gICAgICAgICAgICAgIHRpbWVsaW5lLmFwcGVuZENoaWxkKHJvdyk7XG4gICAgICAgICAgICAgIGlmICh0aW1lbGluZS5jaGlsZEVsZW1lbnRDb3VudCA+IDUwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSB0aW1lbGluZS5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgdGltZWxpbmUucmVtb3ZlQ2hpbGQoZmlyc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsYXN0UXVlcnkgPSBub3dRdWVyeTtcbiAgICAgICAgICAgICAgbGFzdFNlYXJjaCA9IGVudHJ5LnJhd1NlYXJjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIGlnbm9yZSAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKTtcbiAgICAgICAgdW5zdWIgPSBjb250ZXh0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgcmVuZGVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChldi5hbHRLZXkpIHBhcnRzLnB1c2goJ0FsdCcpO1xuICAgICAgICAgICAgaWYgKGV2LnNoaWZ0S2V5KSBwYXJ0cy5wdXNoKCdTaGlmdCcpO1xuICAgICAgICAgICAgaWYgKGV2LmN0cmxLZXkpIHBhcnRzLnB1c2goJ0N0cmwnKTtcbiAgICAgICAgICAgIGxldCBrZXlQYXJ0ID0gZXYua2V5O1xuICAgICAgICAgICAgaWYgKGV2LmtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAga2V5UGFydCA9IGV2LmtleS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFydHMucHVzaChrZXlQYXJ0KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbWJvID0gcGFydHMuam9pbignKycpO1xuICAgICAgICAgICAgaWYgKGNvbWJvID09PSBkZXZ0b29sc1Nob3J0Y3V0LnJlcGxhY2UoL1xccysvZywgJycpKSB7XG4gICAgICAgICAgICAgIGlmIChob3N0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIGhvc3Quc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaG9zdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICB9XG4gIHJldHVybiB7IGNsZWFudXAsIGNvbnRleHQgfSBhcyBDcmVhdGVSb3V0ZXJSZXR1cm48YW55Pjtcbn1cbiJdfQ==
597
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLG1CQUFtQixNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsR0FTckIsTUFBTSxhQUFhLENBQUM7QUFrRXJCLE1BQU0sQ0FBQyxPQUFPLFVBQVUsWUFBWSxDQUNsQyxNQUEyQixFQUMzQixVQUErQixFQUFFO0lBR2pDLE1BQU0sT0FBTyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFDckMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUM7SUFHNUMsSUFBSSxnQkFBZ0IsR0FBZ0MsSUFBSSxDQUFDO0lBQ3pELElBQUksWUFBWSxFQUFFLENBQUM7UUFDakIsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksdUJBQXFELENBQUM7SUFDMUQsSUFBSSxvQkFBb0IsR0FBcUIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ3ZFLElBQUksb0JBQW9CLEdBR2IsSUFBSSxDQUFDO0lBS2hCLFNBQVMsaUJBQWlCLENBQUMsUUFJMUI7UUFDQyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxPQUFPLFFBQVEsQ0FBQyxR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QztRQUNqQixJQUFJLGdCQUFnQixLQUFLLElBQUksRUFBRSxDQUFDO1lBQzlCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQztnQkFDSCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO29CQUNsQyxNQUFNLFlBQVksR0FBRyxNQUVwQixDQUFDO29CQUNGLElBQUksWUFBWSxDQUFDLGtCQUFrQixLQUFLLFlBQVksRUFBRSxDQUFDO3dCQUNyRCxPQUFPLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDekMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUFDLE1BQU0sQ0FBQztZQUVULENBQUM7UUFDSCxDQUFDO1FBQ0QsWUFBWSxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBR0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVpbGRSb3V0ZXMgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNYXRjaGVkUm91dGUsIHByZXBhcmVNYXRjaCB9IGZyb20gJy4uL3Rvb2xzLmpzJztcbmltcG9ydCB7IHBhcnNlUmF3UXVlcnkgfSBmcm9tICcuLi90b29scy9xdWVyeS5qcyc7XG5pbXBvcnQgYnVpbGRDb21iaW5lZFNlYXJjaCBmcm9tICcuLi90b29scy9idWlsZENvbWJpbmVkU2VhcmNoLmpzJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlRmlsdGVycyB9IGZyb20gJ0BwbHVtaWxlL2ZpbHRlci1xdWVyeSc7XG5pbXBvcnQge1xuICBOYXZpZ2F0aW9uT3JpZ2luLFxuICBSb3V0ZXJEZWJ1Z0V2ZW50S2luZCxcbiAgdHlwZSBSb3V0ZXJEZWJ1Z0V2ZW50UGF5bG9hZCxcbiAgdHlwZSBSb3V0ZXJEZWJ1Z0hlbHBlcnMsXG4gIHR5cGUgUm91dGVFbnRyeSxcbiAgdHlwZSBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIHR5cGUgU3Vic2NyaWJlQ2FsbGJhY2ssXG4gIHR5cGUgQW55Um91dGUsXG4gIHR5cGUgUHJlcGFyZWRBY2Nlc3MsXG4gIHR5cGUgTmF2aWdhdGVPdmVybG9hZHMsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSGlzdG9yeURlYnVnQ29udGV4dCB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgY3JlYXRlUm91dGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJSZXR1cm48UiBleHRlbmRzIEFueVJvdXRlW10+ID0ge1xuICAvKiogRnVuY3Rpb24gdG8gY2xlYW4gdXAgcm91dGVyIGxpc3RlbmVycyBhbmQgcmVzb3VyY2VzICovXG4gIGNsZWFudXA6ICgpID0+IHZvaWQ7XG4gIC8qKiBSb3V0ZXIgY29udGV4dCBvYmplY3QgZm9yIHRoZSBSZWFjdCBDb250ZXh0IFByb3ZpZGVyICovXG4gIGNvbnRleHQ6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+ICYgUHJlcGFyZWRBY2Nlc3M8Uj47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSByb3V0ZXIgc3lzdGVtIGZyb20gcm91dGUgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVGhpcyByb3V0ZXIgaXMgYnVpbHQgZnJvbSB0aGUgc2FtZSBwcmltaXRpdmVzIGFzIHJlYWN0LXJvdXRlciBidXQgd2l0aCBhZGRpdGlvbmFsXG4gKiBmZWF0dXJlcyBmb3IgZGF0YSBwcmVsb2FkaW5nIGFuZCBjb2RlIHNwbGl0dGluZy4gRWFjaCByb3V0ZSBjYW4gY29udGFpbiBib3RoIGFcbiAqIENvbXBvbmVudCBhbmQgYSBwcmVwYXJlKCkgZnVuY3Rpb24gdGhhdCBjYW4gcHJlbG9hZCBkYXRhIGZvciB0aGUgY29tcG9uZW50LlxuICpcbiAqIFRoZSByb3V0ZXIgd2F0Y2hlcyBmb3IgY2hhbmdlcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiB2aWEgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLFxuICogbWFwcyB0aGUgbG9jYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm91dGUgZW50cnksIGFuZCB0aGVuIHByZWxvYWRzIHRoZSBjb2RlXG4gKiBhbmQgZGF0YSBmb3IgdGhlIHJvdXRlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIEFycmF5IG9mIHJvdXRlIGNvbmZpZ3VyYXRpb25zXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyIGNvbnRleHQgYW5kIGNsZWFudXAgZnVuY3Rpb25cbiAqXG4gIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVNYXRjaChyb3V0ZSwgcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkpLFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgcm91dGVzID0gW1xuICogICB7XG4gKiAgICAgcGF0aDogJy91c2Vycy86aWQnLFxuICogICAgIHJlc291cmNlUGFnZTogZ2V0UmVzb3VyY2VQYWdlKCdVc2VyUHJvZmlsZScsICgpID0+IGltcG9ydCgnLi9Vc2VyUHJvZmlsZScpKSxcbiAqICAgICBwcmVwYXJlOiAoeyB2YXJpYWJsZXMgfSkgPT4gKHsgdXNlcklkOiB2YXJpYWJsZXMuaWQgfSlcbiAqICAgfVxuICogXTtcbiAqXG4gKiBjb25zdCB7IGNvbnRleHQsIGNsZWFudXAgfSA9IGNyZWF0ZVJvdXRlcihyb3V0ZXMpO1xuICpcbiAqIC8vIFVzZSBpbiBSZWFjdCBhcHBcbiAqIDxSb3V0aW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+XG4gKiAgIDxSb3V0ZXJSZW5kZXJlciAvPlxuICogPC9Sb3V0aW5nQ29udGV4dC5Qcm92aWRlcj5cbiAqIGBgYFxuICovXG4vKipcbiAqIENyZWF0ZSBhIHJvdXRlciAodHlwZWQgb3ZlcmxvYWQpLiBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3QgdHVwbGUgb2Ygcm91dGVzLCBnZW5lcmljcyBhcmUgcHJlc2VydmVkLlxuICovXG4vKipcbiAqIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIGBjcmVhdGVSb3V0ZXJgLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJPcHRpb25zID0ge1xuICAvKipcbiAgICogV2hlbiB0cnVlLCBleHBvc2VzIGEgbGlnaHR3ZWlnaHQgZGVidWcgYnJpZGdlIG9uIGB3aW5kb3cuX19QTFVNSUxFX1JPVVRFUl9fYFxuICAgKiBjb250YWluaW5nIGB7IGdldCwgc3Vic2NyaWJlIH1gLiBJbnRlbmRlZCBmb3IgbG9jYWwgdG9vbGluZyAvIHRoZSBEZXZUb29scyBleHRlbnNpb24uXG4gICAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByb3V0ZXIgaW5zdGFuY2UgZnJvbSBhIHJvdXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIFJvdXRlIGRlZmluaXRpb25zIHRvIHJlZ2lzdGVyLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBkZWJ1ZyBzZXR0aW5ncyB1c2VkIGZvciBleHBvc2luZyBkZXZlbG9wbWVudCB0b29saW5nLlxuICogQHBhcmFtIG9wdGlvbnMuZGVidWcgLSBXaGVuIHRydWUsIHB1Ymxpc2hlcyBgd2luZG93Ll9fUExVTUlMRV9ST1VURVJfX2AgKGRldmVsb3BtZW50IG9ubHkpLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVSb3V0ZXI8UiBleHRlbmRzIEFueVJvdXRlW10+KFxuICByb3V0ZXM6IFsuLi5SXSB8IEFueVJvdXRlW10sXG4gIG9wdGlvbnM6IENyZWF0ZVJvdXRlck9wdGlvbnMgPSB7fSxcbik6IENyZWF0ZVJvdXRlclJldHVybjxSIGV4dGVuZHMgQW55Um91dGVbXSA/IFIgOiBBbnlSb3V0ZVtdPiB7XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuICBjb25zdCBkZWJ1Z0VuYWJsZWQgPSBvcHRpb25zLmRlYnVnID09PSB0cnVlO1xuXG4gIHR5cGUgRGVidWdTdWJzY3JpYmVyID0gKGV2ZW50OiBSb3V0ZXJEZWJ1Z0V2ZW50UGF5bG9hZCkgPT4gdm9pZDtcbiAgbGV0IGRlYnVnU3Vic2NyaWJlcnM6IFNldDxEZWJ1Z1N1YnNjcmliZXI+IHwgbnVsbCA9IG51bGw7XG4gIGlmIChkZWJ1Z0VuYWJsZWQpIHtcbiAgICBkZWJ1Z1N1YnNjcmliZXJzID0gbmV3IFNldDxEZWJ1Z1N1YnNjcmliZXI+KCk7XG4gIH1cblxuICBsZXQgcGVuZGluZ05hdmlnYXRpb25PcmlnaW46IE5hdmlnYXRpb25PcmlnaW4gfCB1bmRlZmluZWQ7XG4gIGxldCBsYXN0TmF2aWdhdGlvbk9yaWdpbjogTmF2aWdhdGlvbk9yaWdpbiA9IE5hdmlnYXRpb25PcmlnaW4uRXh0ZXJuYWw7XG4gIGxldCBsYXN0UHJlbG9hZFNpZ25hdHVyZToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgcGFydGlhbCBsb2NhdGlvbiBvYmplY3QgaW50byBhIGZ1bGwgbG9jYXRpb24gc3RydWN0dXJlIHdpdGggc3RyaW5nIGZpZWxkcy5cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uOiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g/OiBzdHJpbmc7XG4gICAgaGFzaD86IHN0cmluZztcbiAgfSk6IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmc7IGhhc2g6IHN0cmluZyB9IHtcbiAgICBsZXQgcGF0aG5hbWVWYWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24ucGF0aG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXRobmFtZVZhbHVlID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgfVxuICAgIGxldCBzZWFyY2hWYWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24uc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgc2VhcmNoVmFsdWUgPSBsb2NhdGlvbi5zZWFyY2g7XG4gICAgfVxuICAgIGxldCBoYXNoVmFsdWUgPSAnJztcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uLmhhc2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICBoYXNoVmFsdWUgPSBsb2NhdGlvbi5oYXNoO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lVmFsdWUsXG4gICAgICBzZWFyY2g6IHNlYXJjaFZhbHVlLFxuICAgICAgaGFzaDogaGFzaFZhbHVlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhIGRlYnVnIHBheWxvYWQgdG8gYWxsIHJlZ2lzdGVyZWQgc3Vic2NyaWJlcnMuXG4gICAqL1xuICBmdW5jdGlvbiBlbWl0RGVidWdFdmVudChwYXlsb2FkOiBSb3V0ZXJEZWJ1Z0V2ZW50UGF5bG9hZCk6IHZvaWQge1xuICAgIGlmICghZGVidWdFbmFibGVkIHx8IGRlYnVnU3Vic2NyaWJlcnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdWJzY3JpYmVyIG9mIGRlYnVnU3Vic2NyaWJlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1YnNjcmliZXIocGF5bG9hZCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWdub3JlIHN1YnNjcmliZXIgZmFpbHVyZXMgdG8gYXZvaWQgZGlzcnVwdGluZyByb3V0ZXIgZmxvdy5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gY29lcmNlIGFuIGFyYml0cmFyeSBzdHJpbmcgaW50byBhIGtub3duIG5hdmlnYXRpb24gb3JpZ2luLlxuICAgKi9cbiAgZnVuY3Rpb24gbWFwT3JpZ2luKHJhdz86IHN0cmluZyk6IE5hdmlnYXRpb25PcmlnaW4gfCB1bmRlZmluZWQge1xuICAgIGlmIChyYXcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc3dpdGNoIChyYXcpIHtcbiAgICAgIGNhc2UgTmF2aWdhdGlvbk9yaWdpbi5MaW5rQ2xpY2s6XG4gICAgICBjYXNlIE5hdmlnYXRpb25PcmlnaW4uTGlua0hvdmVyOlxuICAgICAgY2FzZSBOYXZpZ2F0aW9uT3JpZ2luLlByb2dyYW1tYXRpYzpcbiAgICAgIGNhc2UgTmF2aWdhdGlvbk9yaWdpbi5Qb3BzdGF0ZUJhY2s6XG4gICAgICBjYXNlIE5hdmlnYXRpb25PcmlnaW4uUG9wc3RhdGVGb3J3YXJkOlxuICAgICAgY2FzZSBOYXZpZ2F0aW9uT3JpZ2luLlBvcHN0YXRlVW5rbm93bjpcbiAgICAgIGNhc2UgTmF2aWdhdGlvbk9yaWdpbi5FeHRlcm5hbDpcbiAgICAgIGNhc2UgTmF2aWdhdGlvbk9yaWdpbi5Ob3JtYWxpemU6XG4gICAgICBjYXNlIE5hdmlnYXRpb25PcmlnaW4uUHJlbG9hZEhvdmVyOlxuICAgICAgICByZXR1cm4gcmF3O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBvcmlnaW4gZm9yIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gZXZlbnQuXG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlTmF2aWdhdGlvbk9yaWdpbihcbiAgICBjb250ZXh0PzogSGlzdG9yeURlYnVnQ29udGV4dCB8IG51bGwsXG4gICk6IE5hdmlnYXRpb25PcmlnaW4ge1xuICAgIGNvbnN0IGZhbGxiYWNrT3JpZ2luID0gcGVuZGluZ05hdmlnYXRpb25PcmlnaW47XG4gICAgbGV0IG9yaWdpbjogTmF2aWdhdGlvbk9yaWdpbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNvbnRleHRPcmlnaW4gPSBjb250ZXh0Py5vcmlnaW47XG4gICAgaWYgKGNvbnRleHRPcmlnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3JpZ2luID0gbWFwT3JpZ2luKGNvbnRleHRPcmlnaW4pO1xuICAgIH1cblxuICAgIG9yaWdpbiA/Pz0gZmFsbGJhY2tPcmlnaW47XG4gICAgb3JpZ2luID8/PSBOYXZpZ2F0aW9uT3JpZ2luLkV4dGVybmFsO1xuICAgIHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBvcmlnaW47XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIGlubmVyLW1vc3QgbWF0Y2hlZCByb3V0ZSBwYXRoIGZyb20gYSByb3V0ZSBlbnRyeSB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWRNYXRjaGVkUm91dGVQYXRoKFxuICAgIGVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gfCB1bmRlZmluZWQsXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWRSb3V0ZSA9IGVudHJ5LnJvdXRlO1xuICAgIGlmIChtYXRjaGVkUm91dGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkUm91dGVzID0gbWF0Y2hlZFJvdXRlLnJvdXRlLnJvdXRlcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZFJvdXRlcykpIHtcbiAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IGNoaWxkUm91dGVzLmF0KC0xKTtcbiAgICAgIGlmIChsYXN0Q2hpbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBsYXN0Q2hpbGRSZWNvcmQgPSBsYXN0Q2hpbGQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGxhc3RDaGlsZFJlY29yZC5wYXRoO1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkUGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGRQYXRoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJvb3RQYXRoID0gbWF0Y2hlZFJvdXRlLnJvdXRlLnBhdGg7XG4gICAgaWYgKHR5cGVvZiByb290UGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByb290UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHR5cGUgUHJlcGFyZURlYnVnQ29udGV4dCA9IHtcbiAgICBvcmlnaW46IE5hdmlnYXRpb25PcmlnaW47XG4gICAgcmVxdWVzdFRpbWU6IG51bWJlcjtcbiAgICBlbWl0OiAocGF5bG9hZDogUm91dGVyRGVidWdFdmVudFBheWxvYWQpID0+IHZvaWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGRlYnVnIGhlbHBlciBzdHJ1Y3R1cmUgZm9yIGEgcHJlcGFyZSBpbnZvY2F0aW9uIHdoZW4gZGVidWcgbW9kZSBpcyBlbmFibGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlUHJlcGFyZURlYnVnKFxuICAgIG9yaWdpbjogTmF2aWdhdGlvbk9yaWdpbixcbiAgKTogUHJlcGFyZURlYnVnQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFkZWJ1Z0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW4sXG4gICAgICByZXF1ZXN0VGltZTogRGF0ZS5ub3coKSxcbiAgICAgIGVtaXQocGF5bG9hZDogUm91dGVyRGVidWdFdmVudFBheWxvYWQpIHtcbiAgICAgICAgZW1pdERlYnVnRXZlbnQoe1xuICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGhpc3RvcnkubG9jYXRpb24pLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBkZXRlcm1pbmlzdGljIGtleSBmb3IgY29ycmVsYXRpbmcgcHJlbG9hZCBldmVudHMuXG4gICAqL1xuICBmdW5jdGlvbiBidWlsZFByZWxvYWRLZXkoXG4gICAga2luZDogUm91dGVyRGVidWdFdmVudEtpbmQuUHJlbG9hZCB8IFJvdXRlckRlYnVnRXZlbnRLaW5kLlByZWxvYWRDb2RlLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2tpbmR9OiR7cGF0aG5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgcHJvZ3JhbW1hdGljIHByZWxvYWRzIHdoZW4gaW5zdHJ1bWVudGF0aW9uIGlzIGFjdGl2ZS5cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRW1pdFByb2dyYW1tYXRpY1ByZWxvYWQoXG4gICAga2luZDogUm91dGVyRGVidWdFdmVudEtpbmQuUHJlbG9hZCB8IFJvdXRlckRlYnVnRXZlbnRLaW5kLlByZWxvYWRDb2RlLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgb3JpZ2luOiBOYXZpZ2F0aW9uT3JpZ2luLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWRlYnVnRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBidWlsZFByZWxvYWRLZXkoa2luZCwgcGF0aG5hbWUpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmVjZW50bHlSZWNvcmRlZCA9XG4gICAgICBsYXN0UHJlbG9hZFNpZ25hdHVyZSAhPT0gbnVsbCAmJlxuICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUua2V5ID09PSBrZXkgJiZcbiAgICAgIG5vdyAtIGxhc3RQcmVsb2FkU2lnbmF0dXJlLnRpbWVzdGFtcCA8IDUwO1xuXG4gICAgaWYgKCFyZWNlbnRseVJlY29yZGVkKSB7XG4gICAgICBlbWl0RGVidWdFdmVudCh7XG4gICAgICAgIGtpbmQsXG4gICAgICAgIG9yaWdpbixcbiAgICAgICAgdGltZXN0YW1wOiBub3csXG4gICAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihoaXN0b3J5LmxvY2F0aW9uKSxcbiAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgIHRhcmdldFBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlID0gbnVsbDtcbiAgfVxuXG4gIGxldCBkZWJ1Z0hlbHBlcnM6IFJvdXRlckRlYnVnSGVscGVycyB8IHVuZGVmaW5lZDtcblxuICBpZiAoZGVidWdFbmFibGVkKSB7XG4gICAgZGVidWdIZWxwZXJzID0ge1xuICAgICAgcmVjb3JkUHJlbG9hZChcbiAgICAgICAga2luZDogUm91dGVyRGVidWdFdmVudEtpbmQuUHJlbG9hZCB8IFJvdXRlckRlYnVnRXZlbnRLaW5kLlByZWxvYWRDb2RlLFxuICAgICAgICBvcmlnaW46IE5hdmlnYXRpb25PcmlnaW4sXG4gICAgICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUgPSB7XG4gICAgICAgICAga2V5OiBidWlsZFByZWxvYWRLZXkoa2luZCwgcGF0aG5hbWUpLFxuICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgfTtcbiAgICAgICAgZW1pdERlYnVnRXZlbnQoe1xuICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiksXG4gICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgdGFyZ2V0UGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHJlY29yZE5hdmlnYXRpb25JbnRlbnQob3JpZ2luOiBOYXZpZ2F0aW9uT3JpZ2luKSB7XG4gICAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgICAgfSxcbiAgICAgIHJlY29yZEhpc3RvcnlBY3Rpb24oXG4gICAgICAgIGtpbmQ6XG4gICAgICAgICAgfCBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5IaXN0b3J5UHVzaFxuICAgICAgICAgIHwgUm91dGVyRGVidWdFdmVudEtpbmQuSGlzdG9yeVJlcGxhY2VcbiAgICAgICAgICB8IFJvdXRlckRlYnVnRXZlbnRLaW5kLk5vcm1hbGl6ZSxcbiAgICAgICAgb3JpZ2luOiBOYXZpZ2F0aW9uT3JpZ2luLFxuICAgICAgICBsb2NhdGlvbjogeyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g/OiBzdHJpbmc7IGhhc2g/OiBzdHJpbmcgfSxcbiAgICAgICAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgKSB7XG4gICAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgICAgICBlbWl0RGVidWdFdmVudCh7XG4gICAgICAgICAga2luZCxcbiAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihsb2NhdGlvbiksXG4gICAgICAgICAgZGV0YWlscyxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICB0eXBlIFJvdXRlckdsb2JhbEJyaWRnZSA9IHtcbiAgICBnZXQ6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+WydnZXQnXTtcbiAgICBzdWJzY3JpYmU6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+WydzdWJzY3JpYmUnXTtcbiAgICBzdWJzY3JpYmVEZWJ1Zz86IChcbiAgICAgIGNhbGxiYWNrOiAoZXZlbnQ6IFJvdXRlckRlYnVnRXZlbnRQYXlsb2FkKSA9PiB2b2lkLFxuICAgICkgPT4gKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICB9O1xuICBsZXQgcm91dGVyR2xvYmFsOiBSb3V0ZXJHbG9iYWxCcmlkZ2UgfCBudWxsID0gbnVsbDtcblxuICAvLyBCdWlsZCBhIGZsYXQgbGlzdCBvZiByb3V0ZXMgZm9yIGVmZmljaWVudCBtYXRjaGluZ1xuICBjb25zdCBmbGF0Um91dGVzID0gYnVpbGRSb3V0ZXMocm91dGVzKTtcblxuICAvLyBGaW5kIHRoZSBpbml0aWFsIHJvdXRlIG1hdGNoIGFuZCBwcmVwYXJlIGl0IGZvciByZW5kZXJpbmdcbiAgY29uc3Qgcm91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gIGNvbnN0IGluaXRpYWxSYXdRdWVyeSA9IHBhcnNlUmF3UXVlcnkoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gpO1xuICAvLyBEaXJlY3Qgc2NoZW1hOiBvbmx5IHRoZSBtYXRjaGVkIHJvdXRlJ3Mgb3duIHF1ZXJ5U2NoZW1hIChubyBoaWVyYXJjaGljYWwgZGlzY292ZXJ5KVxuICBsZXQgaW5pdGlhbFVuaWZpZWRTY2hlbWE6IGFueTtcbiAgaWYgKHJvdXRlICE9IG51bGwpIHtcbiAgICBjb25zdCBsYXN0ID0gcm91dGUucm91dGUucm91dGVzLmF0KC0xKSBhcyB1bmtub3duIGFzIHtcbiAgICAgIHF1ZXJ5U2NoZW1hPzogdW5rbm93bjtcbiAgICB9IHwgbnVsbDtcbiAgICBpZiAobGFzdCAhPSBudWxsKSB7XG4gICAgICBpbml0aWFsVW5pZmllZFNjaGVtYSA9IGxhc3QucXVlcnlTY2hlbWE7XG4gICAgfVxuICB9XG4gIGxldCBpbml0aWFsRmlsdGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGxldCBpbml0aWFsRmlsdGVyRGlhZ25vc3RpY3M6IGFueVtdIHwgdW5kZWZpbmVkO1xuICBpZiAoaW5pdGlhbFVuaWZpZWRTY2hlbWEgIT0gbnVsbCkge1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmlsdGVycyhoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCwgaW5pdGlhbFVuaWZpZWRTY2hlbWEpO1xuICAgIGluaXRpYWxGaWx0ZXJzID0gcGFyc2VkLmZpbHRlcnMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpbml0aWFsRmlsdGVyRGlhZ25vc3RpY3MgPSBwYXJzZWQuZGlhZ25vc3RpY3MgYXMgdW5rbm93bltdO1xuICB9XG4gIGNvbnN0IHByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2goXG4gICAgcm91dGUsXG4gICAgaW5pdGlhbEZpbHRlcnMsXG4gICAgY3JlYXRlUHJlcGFyZURlYnVnKGxhc3ROYXZpZ2F0aW9uT3JpZ2luKSxcbiAgKTtcbiAgLy8gSGVscGVyIHRvIGJ1aWxkIHRoZSByYXcgcXVlcnkgb2JqZWN0IGZyb20gYSBzZWFyY2ggc3RyaW5nXG4gIGxldCBjdXJyZW50RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICBmb3JjZVJlcmVuZGVyOiBmYWxzZSxcbiAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvbixcbiAgICByb3V0ZSxcbiAgICBwcmVwYXJlZE1hdGNoLFxuICAgIHJhd1NlYXJjaDogaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gsXG4gICAgcXVlcnk6IGluaXRpYWxSYXdRdWVyeSxcbiAgICAvLyB0eXBlZFF1ZXJ5IHJlbW92ZWQgKHVuaWZpZWQgaW50byBmaWx0ZXJzL3F1ZXJ5KVxuICAgIGZpbHRlcnM6IGluaXRpYWxGaWx0ZXJzLFxuICAgIGZpbHRlckRpYWdub3N0aWNzOiBpbml0aWFsRmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgYWN0aXZlUXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIGRlYnVnT3JpZ2luOiBsYXN0TmF2aWdhdGlvbk9yaWdpbixcbiAgfTtcblxuICAvLyBJbml0aWFsIG5vcm1hbGl6YXRpb24gcGFzcyAoZS5nLiwgY2xhbXAgcGFnZSlcbiAgY29uc3QgaW5pdFR5cGVkID0gY3VycmVudEVudHJ5LmZpbHRlcnMgYXMgdW5rbm93biBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICB8IHVuZGVmaW5lZDtcbiAgbGV0IGluaXRQYWdlTnVtZXJpYzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoaW5pdFR5cGVkICE9IG51bGwpIHtcbiAgICBjb25zdCByYXdQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gICAgaWYgKHR5cGVvZiByYXdQYWdlID09PSAnbnVtYmVyJykgaW5pdFBhZ2VOdW1lcmljID0gcmF3UGFnZTtcbiAgICBlbHNlIGlmIChcbiAgICAgIHJhd1BhZ2UgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHJhd1BhZ2UgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShyYXdQYWdlKSAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJhd1BhZ2UsICdlcScpICYmXG4gICAgICB0eXBlb2YgKHJhd1BhZ2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVxID09PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgaW5pdFBhZ2VOdW1lcmljID0gKHJhd1BhZ2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVxIGFzIG51bWJlcjtcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZU51bWVyaWMgPT09ICdudW1iZXInICYmXG4gICAgaW5pdFBhZ2VOdW1lcmljIDwgMSAmJlxuICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IHsgZXE6IDEgfSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGN1cnJlbnRFbnRyeS5maWx0ZXJzID0gbm9ybTsgLy8gaW1tZWRpYXRlIHZpc2liaWxpdHlcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICBmaWx0ZXJzOiBub3JtLFxuICAgICAgcXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIH0pOyAvLyByZXR1cm5zICcnIG9yIHN0cmluZyBzdGFydGluZyB3aXRoICc/J1xuICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgZGVidWdIZWxwZXJzPy5yZWNvcmRIaXN0b3J5QWN0aW9uKFxuICAgICAgICBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5Ob3JtYWxpemUsXG4gICAgICAgIE5hdmlnYXRpb25PcmlnaW4uTm9ybWFsaXplLFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9LFxuICAgICAgICB7IHJlYXNvbjogJ2luaXRpYWwtcGFnZS1jbGFtcCcgfSxcbiAgICAgICk7XG4gICAgICBsZXQgbm9ybWFsaXplRGVidWdDb250ZXh0OiBIaXN0b3J5RGVidWdDb250ZXh0IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGRlYnVnRW5hYmxlZCkge1xuICAgICAgICBub3JtYWxpemVEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgICAgb3JpZ2luOiBOYXZpZ2F0aW9uT3JpZ2luLk5vcm1hbGl6ZSxcbiAgICAgICAgICB0cmlnZ2VyOiAnbm9ybWFsaXplJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICAgIGRlYnVnQ29udGV4dDogbm9ybWFsaXplRGVidWdDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICAvLyBVcGRhdGUgY3VycmVudEVudHJ5LmxvY2F0aW9uIHRvIHJlZmxlY3QgbmV3IHNlYXJjaCBkaXJlY3RseSAoaGlzdG9yeS5zZXQgdHJpZ2dlcnMgYXN5bmMgc3Vic2NyaWJlcilcbiAgICAgIGN1cnJlbnRFbnRyeSA9IHtcbiAgICAgICAgLi4uY3VycmVudEVudHJ5LFxuICAgICAgICBsb2NhdGlvbjogeyAuLi5jdXJyZW50RW50cnkubG9jYXRpb24sIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCB9LFxuICAgICAgICByYXdTZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGRlYnVnT3JpZ2luOiBOYXZpZ2F0aW9uT3JpZ2luLk5vcm1hbGl6ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlYnVnRW5hYmxlZCkge1xuICAgIGxldCBzbmFwc2hvdE9yaWdpbiA9IE5hdmlnYXRpb25PcmlnaW4uRXh0ZXJuYWw7XG4gICAgaWYgKGN1cnJlbnRFbnRyeS5kZWJ1Z09yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzbmFwc2hvdE9yaWdpbiA9IGN1cnJlbnRFbnRyeS5kZWJ1Z09yaWdpbjtcbiAgICB9XG4gICAgZW1pdERlYnVnRXZlbnQoe1xuICAgICAga2luZDogUm91dGVyRGVidWdFdmVudEtpbmQuU25hcHNob3QsXG4gICAgICBvcmlnaW46IHNuYXBzaG90T3JpZ2luLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGhpc3RvcnkubG9jYXRpb24pLFxuICAgICAgZGV0YWlsczoge1xuICAgICAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGN1cnJlbnRFbnRyeSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGRpc3Bvc2VIaXN0b3J5ID0gaGlzdG9yeS5zdWJzY3JpYmUoXG4gICAgKGxvY2F0aW9uLCBmb3JjZVJlcmVuZGVyLCBkZWJ1Z0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbiA9IHJlc29sdmVOYXZpZ2F0aW9uT3JpZ2luKGRlYnVnQ29udGV4dCk7XG4gICAgICBsYXN0TmF2aWdhdGlvbk9yaWdpbiA9IG9yaWdpbjtcbiAgICAgIGNvbnN0IGxvY2F0aW9uUGF5bG9hZCA9IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKTtcblxuICAgICAgY29uc3QgZGVidWdDb250ZXh0T3JpZ2luID0gZGVidWdDb250ZXh0Py5vcmlnaW47XG4gICAgICBpZiAoZGVidWdFbmFibGVkICYmIGRlYnVnQ29udGV4dE9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBoaXN0b3J5RGV0YWlsczogeyBoaXN0b3J5SW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIGRlYnVnQ29udGV4dD8uaGlzdG9yeUluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGhpc3RvcnlEZXRhaWxzID0geyBoaXN0b3J5SW5kZXg6IGRlYnVnQ29udGV4dC5oaXN0b3J5SW5kZXggfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZGVidWdDb250ZXh0T3JpZ2luKSB7XG4gICAgICAgICAgY2FzZSBOYXZpZ2F0aW9uT3JpZ2luLlBvcHN0YXRlQmFjazoge1xuICAgICAgICAgICAgZW1pdERlYnVnRXZlbnQoe1xuICAgICAgICAgICAgICBraW5kOiBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5Qb3BzdGF0ZUJhY2ssXG4gICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25QYXlsb2FkLFxuICAgICAgICAgICAgICBkZXRhaWxzOiBoaXN0b3J5RGV0YWlscyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgTmF2aWdhdGlvbk9yaWdpbi5Qb3BzdGF0ZUZvcndhcmQ6IHtcbiAgICAgICAgICAgIGVtaXREZWJ1Z0V2ZW50KHtcbiAgICAgICAgICAgICAga2luZDogUm91dGVyRGVidWdFdmVudEtpbmQuUG9wc3RhdGVGb3J3YXJkLFxuICAgICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgICAgICAgZGV0YWlsczogaGlzdG9yeURldGFpbHMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIE5hdmlnYXRpb25PcmlnaW4uUG9wc3RhdGVVbmtub3duOiB7XG4gICAgICAgICAgICBlbWl0RGVidWdFdmVudCh7XG4gICAgICAgICAgICAgIGtpbmQ6IFJvdXRlckRlYnVnRXZlbnRLaW5kLlBvcHN0YXRlVW5rbm93bixcbiAgICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblBheWxvYWQsXG4gICAgICAgICAgICAgIGRldGFpbHM6IGhpc3RvcnlEZXRhaWxzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBOYXZpZ2F0aW9uT3JpZ2luLkV4dGVybmFsOiB7XG4gICAgICAgICAgICBlbWl0RGVidWdFdmVudCh7XG4gICAgICAgICAgICAgIGtpbmQ6IFJvdXRlckRlYnVnRXZlbnRLaW5kLkV4dGVybmFsTmF2aWdhdGlvbixcbiAgICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblBheWxvYWQsXG4gICAgICAgICAgICAgIGRldGFpbHM6IGhpc3RvcnlEZXRhaWxzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbWVQYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICBjb25zdCBzYW1lU2VhcmNoID0gbG9jYXRpb24uc2VhcmNoID09PSBjdXJyZW50RW50cnkucmF3U2VhcmNoO1xuXG4gICAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgICAgLy8gTm90aGluZyBjaGFuZ2VkIHRoYXQgd2UgY2FyZSBhYm91dFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG9ubHkgdGhlIHNlYXJjaCBjaGFuZ2VkIHdlIHN0aWxsIHdhbnQgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UuXG4gICAgICAvLyBLZWVwIHRoZSBleGlzdGluZyBwcmVwYXJlZE1hdGNoIHdoZW4gcGF0aG5hbWUgaXMgaWRlbnRpY2FsIHRvIGF2b2lkIHJlZHVuZGFudCB3b3JrLlxuICAgICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgICBsZXQgbmV4dFJvdXRlID0gY3VycmVudEVudHJ5LnJvdXRlO1xuXG4gICAgICBpZiAoIXNhbWVQYXRobmFtZSkge1xuICAgICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgICAgICAgLy8gd2Ugd2lsbCBzZXQgYmVsb3cgYWZ0ZXIgY29tcHV0aW5nIHR5cGVkIHF1ZXJ5XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHJhdyBxdWVyeSBvYmplY3QgKGJhc2ljIGFnZ3JlZ2F0aW9uKSBmcm9tIGxvY2F0aW9uLnNlYXJjaFxuICAgICAgY29uc3QgcXVlcnkgPSBwYXJzZVJhd1F1ZXJ5KGxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgICBsZXQgcXVlcnlTY2hlbWE6IGFueTtcbiAgICAgIGlmIChuZXh0Um91dGUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBsYXN0ID0gbmV4dFJvdXRlLnJvdXRlLnJvdXRlcy5hdCgtMSkgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgcXVlcnlTY2hlbWE/OiB1bmtub3duO1xuICAgICAgICB9IHwgbnVsbDtcbiAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkge1xuICAgICAgICAgIHF1ZXJ5U2NoZW1hID0gbGFzdC5xdWVyeVNjaGVtYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gUGFyc2UgdW5pZmllZCBmaWx0ZXJzXG4gICAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmlsdGVyRGlhZ25vc3RpY3M6IGFueVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHF1ZXJ5U2NoZW1hICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkRiA9IHBhcnNlRmlsdGVycyhsb2NhdGlvbi5zZWFyY2gsIHF1ZXJ5U2NoZW1hKTtcbiAgICAgICAgZmlsdGVycyA9IHBhcnNlZEYuZmlsdGVycyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBmaWx0ZXJEaWFnbm9zdGljcyA9IHBhcnNlZEYuZGlhZ25vc3RpY3MgYXMgdW5rbm93bltdO1xuICAgICAgfVxuICAgICAgLy8gTm9ybWFsaXphdGlvbjogY2xhbXAgcGFnZSA+PSAxIGlmIG51bWVyaWMgcGFnZSBwcmVzZW50XG4gICAgICBsZXQgbm9ybWFsaXplZCA9IGZhbHNlO1xuICAgICAgbGV0IHBnOiB1bmtub3duO1xuICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBmOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGZpbHRlcnM7XG4gICAgICAgIGNvbnN0IG1heWJlID0gZi5wYWdlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWF5YmUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiBtYXliZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAhQXJyYXkuaXNBcnJheShtYXliZSkgJiZcbiAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWF5YmUsICdlcScpXG4gICAgICAgICkge1xuICAgICAgICAgIHBnID0gKG1heWJlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5lcTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZyA9IG1heWJlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHBnID09PSAnbnVtYmVyJyAmJiBwZyA8IDEpIHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSB7IC4uLihmaWx0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLCBwYWdlOiB7IGVxOiAxIH0gfTtcbiAgICAgICAgZmlsdGVycyA9IGNsb25lO1xuICAgICAgICBub3JtYWxpemVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgb25seSB0aGUgc2VhcmNoIGNoYW5nZWQgKHNhbWUgcGF0aG5hbWUpIHdlIHN0aWxsIG5lZWQgdG8gcmUtcnVuIHByZXBhcmVcbiAgICAgIGlmICghc2FtZVBhdGhuYW1lIHx8ICFzYW1lU2VhcmNoKSB7XG4gICAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgICAgICAgIG5leHRSb3V0ZSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgY3JlYXRlUHJlcGFyZURlYnVnKG9yaWdpbiksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgICAgICBmb3JjZVJlcmVuZGVyOiBmb3JjZVJlcmVuZGVyIHx8IChzYW1lUGF0aG5hbWUgJiYgIXNhbWVTZWFyY2gpLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgICAgcHJlcGFyZWRNYXRjaDogbmV4dFByZXBhcmVkTWF0Y2gsXG4gICAgICAgIHJhd1NlYXJjaDogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgZmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBxdWVyeVNjaGVtYSxcbiAgICAgICAgZGVidWdPcmlnaW46IG9yaWdpbixcbiAgICAgIH07XG5cbiAgICAgIC8vIElmIG5vcm1hbGl6YXRpb24gY2hhbmdlZCB0aGUgdHlwZWQgcXVlcnkgd2UgdHJpZ2dlciBhIHJlcGxhY2Ugd2l0aCBub3JtYWxpemVkIHNlYXJjaFxuICAgICAgaWYgKG5vcm1hbGl6ZWQgJiYgcXVlcnlTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICAgICAgZmlsdGVycyxcbiAgICAgICAgICBxdWVyeVNjaGVtYSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICBsZXQgbmV4dFNlYXJjaFN0ciA9IG5vcm1hbGl6ZWRTZWFyY2g7XG4gICAgICAgICAgaWYgKCFuZXh0U2VhcmNoU3RyLnN0YXJ0c1dpdGgoJz8nKSAmJiBuZXh0U2VhcmNoU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5leHRTZWFyY2hTdHIgPSBgPyR7bmV4dFNlYXJjaFN0cn1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWJ1Z0hlbHBlcnM/LnJlY29yZEhpc3RvcnlBY3Rpb24oXG4gICAgICAgICAgICBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5Ob3JtYWxpemUsXG4gICAgICAgICAgICBOYXZpZ2F0aW9uT3JpZ2luLk5vcm1hbGl6ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgICAgICBzZWFyY2g6IG5leHRTZWFyY2hTdHIsXG4gICAgICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVhc29uOiAncnVudGltZS1wYWdlLWNsYW1wJyB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgbGV0IHJ1bnRpbWVOb3JtYWxpemVDb250ZXh0OiBIaXN0b3J5RGVidWdDb250ZXh0IHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVOb3JtYWxpemVDb250ZXh0ID0ge1xuICAgICAgICAgICAgICBvcmlnaW46IE5hdmlnYXRpb25PcmlnaW4uTm9ybWFsaXplLFxuICAgICAgICAgICAgICB0cmlnZ2VyOiAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICAgIHNlYXJjaDogbmV4dFNlYXJjaFN0cixcbiAgICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICAgICAgZGVidWdDb250ZXh0OiBydW50aW1lTm9ybWFsaXplQ29udGV4dCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47IC8vIGVhcmx5OiBzdWJzZXF1ZW50IHNldCB3aWxsIHRyaWdnZXIgcmVydW5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgY3VycmVudCBlbnRyeSBhbmQgbm90aWZ5IGFsbCBzdWJzY3JpYmVyc1xuICAgICAgY3VycmVudEVudHJ5ID0gbmV4dEVudHJ5O1xuICAgICAgc3Vic2NyaWJlcnMuZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgY2FsbGJhY2sobmV4dEVudHJ5KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVidWdFbmFibGVkKSB7XG4gICAgICAgIGVtaXREZWJ1Z0V2ZW50KHtcbiAgICAgICAgICBraW5kOiBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5TbmFwc2hvdCxcbiAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblBheWxvYWQsXG4gICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgcm91dGVQYXRoOiByZWFkTWF0Y2hlZFJvdXRlUGF0aChuZXh0RW50cnkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICk7XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgY29uc3QgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT4gJlxuICAgIFByZXBhcmVkQWNjZXNzPEFueVJvdXRlW10+ICYge1xuICAgICAgbmF2aWdhdGU6IE5hdmlnYXRlT3ZlcmxvYWRzPEFueVJvdXRlW10+O1xuICAgIH0gPSB7XG4gICAgaGlzdG9yeSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5O1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUocGF0aG5hbWUpIHtcbiAgICAgIG1heWJlRW1pdFByb2dyYW1tYXRpY1ByZWxvYWQoXG4gICAgICAgIFJvdXRlckRlYnVnRXZlbnRLaW5kLlByZWxvYWRDb2RlLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgTmF2aWdhdGlvbk9yaWdpbi5Qcm9ncmFtbWF0aWMsXG4gICAgICApO1xuICAgICAgLy8gUHJlbG9hZCBqdXN0IHRoZSBjb21wb25lbnQgY29kZSBmb3IgYSByb3V0ZSB3aXRob3V0IHN0b3JpbmcgdGhlIHJlc3VsdFxuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgYWxsIHJlc291cmNlIHBhZ2VzIGZvciB0aGUgbWF0Y2hlZCByb3V0ZVxuICAgICAgbWF0Y2hlcy5yb3V0ZS5yb3V0ZXMuZm9yRWFjaCgoeyByZXNvdXJjZVBhZ2UgfSkgPT4ge1xuICAgICAgICBpZiAocmVzb3VyY2VQYWdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICByZXNvdXJjZVBhZ2UubG9hZCgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwcmVsb2FkKHBhdGhuYW1lKSB7XG4gICAgICBtYXliZUVtaXRQcm9ncmFtbWF0aWNQcmVsb2FkKFxuICAgICAgICBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5QcmVsb2FkLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgTmF2aWdhdGlvbk9yaWdpbi5Qcm9ncmFtbWF0aWMsXG4gICAgICApO1xuICAgICAgLy8gUHJlbG9hZCBib3RoIHRoZSBjb21wb25lbnQgY29kZSBhbmQgcHJlcGFyZWQgZGF0YSBmb3IgYSByb3V0ZVxuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIHByZXBhcmVNYXRjaChcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBjcmVhdGVQcmVwYXJlRGVidWcoTmF2aWdhdGlvbk9yaWdpbi5Qcm9ncmFtbWF0aWMpLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgLy8gQWRkIGEgbmV3IHN1YnNjcmliZXIgYW5kIHJldHVybiB1bnN1YnNjcmliZSBmdW5jdGlvblxuICAgICAgbmV4dElkICs9IDE7XG4gICAgICBjb25zdCBpZCA9IG5leHRJZDtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLXN0eWxlXG4gICAgICBjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoaWQpO1xuICAgICAgfTtcbiAgICAgIHN1YnNjcmliZXJzLnNldChpZCwgY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIGRpc3Bvc2U7XG4gICAgfSxcbiAgICBuYXZpZ2F0ZSh7IHBhdGhuYW1lLCBxdWVyeSwgZmlsdGVyczogbmF2RmlsdGVycywgcmVwbGFjZSB9OiBhbnkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBjdXJyZW50RW50cnk7XG4gICAgICBsZXQgdGFyZ2V0UGF0aG5hbWUgPSBwYXRobmFtZTtcbiAgICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRhcmdldFBhdGhuYW1lID0gY3VycmVudC5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgIH1cbiAgICAgIC8vIERldGVybWluZSBzY2hlbWEgb2YgZGVzdGluYXRpb24gKGlmIHNhbWUgcGF0aCBhbmQgd2UgaGF2ZSByb3V0ZSB3ZSBjYW4gcmV1c2UsIGVsc2UgcmVtYXRjaClcbiAgICAgIGxldCBkZXN0U2NoZW1hOiBhbnk7XG4gICAgICAvLyBBbHdheXMgYXR0ZW1wdCBmdWxsIG1hdGNoIGZvciBkZXN0aW5hdGlvbiB0byBlbnN1cmUgc2NoZW1hIHByZXNlbnQgZXZlbiBpZiBzYW1lIHBhdGhuYW1lXG4gICAgICBjb25zdCBkZXN0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbGFzdFJvdXRlID0gZGVzdFJvdXRlPy5yb3V0ZS5yb3V0ZXMuYXQoLTEpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgcXVlcnlTY2hlbWE/OiB1bmtub3duO1xuICAgICAgICAgIH1cbiAgICAgICAgfCBudWxsXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGxhc3RSb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIGRlc3RTY2hlbWEgPSBsYXN0Um91dGUucXVlcnlTY2hlbWE7XG4gICAgICB9XG4gICAgICAvLyBGYWxsYmFjayB0byBjdXJyZW50bHkgYWN0aXZlIHNjaGVtYSBpZiBkZXN0aW5hdGlvbiBzY2hlbWEgbm90IGZvdW5kIChlLmcuLCByYWNlIGNvbmRpdGlvbnMpXG4gICAgICBkZXN0U2NoZW1hID8/PSBjdXJyZW50LmFjdGl2ZVF1ZXJ5U2NoZW1hO1xuICAgICAgY29uc3QgdHlwZWROYXZGaWx0ZXJzID0gbmF2RmlsdGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcnMgPSB0eXBlZE5hdkZpbHRlcnMgPz8gY3VycmVudC5maWx0ZXJzO1xuICAgICAgLy8gVHJlYXQgbGVnYWN5IG5hdmlnYXRlKHsgcXVlcnkgfSkgYXMgZmlsdGVycyBpbiB1bmlmaWVkIG1vZGVsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICBjb25zdCBmaWx0ZXJzSW5wdXQgPVxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJzID8/IChxdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSBidWlsZENvbWJpbmVkU2VhcmNoKHtcbiAgICAgICAgZmlsdGVyczogZmlsdGVyc0lucHV0LFxuICAgICAgICBxdWVyeVNjaGVtYTogZGVzdFNjaGVtYSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbG9jYXRpb25PYmogPSB7IHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSwgc2VhcmNoLCBoYXNoOiAnJyB9O1xuICAgICAgY29uc3Qgb3JpZ2luID0gTmF2aWdhdGlvbk9yaWdpbi5Qcm9ncmFtbWF0aWM7XG4gICAgICBkZWJ1Z0hlbHBlcnM/LnJlY29yZE5hdmlnYXRpb25JbnRlbnQob3JpZ2luKTtcbiAgICAgIGlmIChyZXBsYWNlID09PSB0cnVlKSB7XG4gICAgICAgIGRlYnVnSGVscGVycz8ucmVjb3JkSGlzdG9yeUFjdGlvbihcbiAgICAgICAgICBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5IaXN0b3J5UmVwbGFjZSxcbiAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgbG9jYXRpb25PYmosXG4gICAgICAgICAgeyB0cmlnZ2VyOiAncHJvZ3JhbW1hdGljJyB9LFxuICAgICAgICApO1xuICAgICAgICBsZXQgcHJvZ3JhbW1hdGljUmVwbGFjZUNvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHtcbiAgICAgICAgICBwcm9ncmFtbWF0aWNSZXBsYWNlQ29udGV4dCA9IHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIC4uLmxvY2F0aW9uT2JqLFxuICAgICAgICAgIGRlYnVnQ29udGV4dDogcHJvZ3JhbW1hdGljUmVwbGFjZUNvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWdIZWxwZXJzPy5yZWNvcmRIaXN0b3J5QWN0aW9uKFxuICAgICAgICAgIFJvdXRlckRlYnVnRXZlbnRLaW5kLkhpc3RvcnlQdXNoLFxuICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICBsb2NhdGlvbk9iaixcbiAgICAgICAgICB7IHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnIH0sXG4gICAgICAgICk7XG4gICAgICAgIGxldCBwcm9ncmFtbWF0aWNQdXNoQ29udGV4dDogSGlzdG9yeURlYnVnQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRlYnVnRW5hYmxlZCkge1xuICAgICAgICAgIHByb2dyYW1tYXRpY1B1c2hDb250ZXh0ID0ge1xuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgdHJpZ2dlcjogJ3Byb2dyYW1tYXRpYycsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBoaXN0b3J5LnB1c2goe1xuICAgICAgICAgIC4uLmxvY2F0aW9uT2JqLFxuICAgICAgICAgIGRlYnVnQ29udGV4dDogcHJvZ3JhbW1hdGljUHVzaENvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0UHJlcGFyZWQocGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBjdXJyZW50RW50cnk7XG4gICAgICAgIC8vIEZpbmQgbGFzdCBwcmVwYXJlZCByb3V0ZSB3aXRoIG1hdGNoaW5nIHBhdGhcbiAgICAgICAgZm9yIChjb25zdCBwciBvZiBlbnRyeS5wcmVwYXJlZE1hdGNoLnJvdXRlcykge1xuICAgICAgICAgIGlmIChwci5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gcHIucHJlcGFyZWQgYXMgYW55O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBnZXRUeXBlZFF1ZXJ5IHJlbW92ZWRcbiAgICBfX2RlYnVnOiBkZWJ1Z0hlbHBlcnMsXG4gIH07XG5cbiAgaWYgKG9wdGlvbnMuZGVidWcgPT09IHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IGJyaWRnZVdpbmRvdyA9IHdpbmRvdyBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBfX1BMVU1JTEVfUk9VVEVSX18/OiBSb3V0ZXJHbG9iYWxCcmlkZ2U7XG4gICAgICAgIH07XG4gICAgICAgIHJvdXRlckdsb2JhbCA9IHtcbiAgICAgICAgICBnZXQ6IGNvbnRleHQuZ2V0LmJpbmQoY29udGV4dCksXG4gICAgICAgICAgc3Vic2NyaWJlOiBjb250ZXh0LnN1YnNjcmliZS5iaW5kKGNvbnRleHQpLFxuICAgICAgICAgIHN1YnNjcmliZURlYnVnKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJzY3JpYmVycyA9IGRlYnVnU3Vic2NyaWJlcnM7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFkZWJ1Z0VuYWJsZWQgfHxcbiAgICAgICAgICAgICAgc3Vic2NyaWJlcnMgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YnNjcmliZXJzLmFkZChjYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoY2FsbGJhY2spO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBicmlkZ2VXaW5kb3cuX19QTFVNSUxFX1JPVVRFUl9fID0gcm91dGVyR2xvYmFsO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRlYXJzIGRvd24gcm91dGVyIGxpc3RlbmVycyBhbmQgZGV0YWNoZXMgdGhlIGRlYnVnIGJyaWRnZSB3aGVuIG5lY2Vzc2FyeS5cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFudXAoKTogdm9pZCB7XG4gICAgZGlzcG9zZUhpc3RvcnkoKTtcbiAgICBpZiAoZGVidWdTdWJzY3JpYmVycyAhPT0gbnVsbCkge1xuICAgICAgZGVidWdTdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIH1cbiAgICBpZiAoZGVidWdFbmFibGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBjb25zdCBicmlkZ2VXaW5kb3cgPSB3aW5kb3cgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICBfX1BMVU1JTEVfUk9VVEVSX18/OiBSb3V0ZXJHbG9iYWxCcmlkZ2U7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoYnJpZGdlV2luZG93Ll9fUExVTUlMRV9ST1VURVJfXyA9PT0gcm91dGVyR2xvYmFsKSB7XG4gICAgICAgICAgICBkZWxldGUgYnJpZGdlV2luZG93Ll9fUExVTUlMRV9ST1VURVJfXztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgIH1cbiAgICB9XG4gICAgcm91dGVyR2xvYmFsID0gbnVsbDtcbiAgfVxuXG4gIC8vIFJldHVybiBib3RoIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgYSBjbGVhbnVwIGZ1bmN0aW9uXG4gIHJldHVybiB7IGNvbnRleHQsIGNsZWFudXAgfTtcbn1cbiJdfQ==