@plumile/router 0.1.32 → 0.1.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +42 -21
- package/lib/esm/index.d.ts +1 -0
- package/lib/esm/index.d.ts.map +1 -1
- package/lib/esm/index.js +2 -1
- package/lib/esm/instrumentation/Instrumentation.d.ts +66 -0
- package/lib/esm/instrumentation/Instrumentation.d.ts.map +1 -0
- package/lib/esm/instrumentation/Instrumentation.js +59 -0
- package/lib/esm/instrumentation/adapters/devtoolsBridge.d.ts +14 -0
- package/lib/esm/instrumentation/adapters/devtoolsBridge.d.ts.map +1 -0
- package/lib/esm/instrumentation/adapters/devtoolsBridge.js +118 -0
- package/lib/esm/instrumentation/adapters/logger.d.ts +10 -0
- package/lib/esm/instrumentation/adapters/logger.d.ts.map +1 -0
- package/lib/esm/instrumentation/adapters/logger.js +19 -0
- package/lib/esm/instrumentation/index.d.ts +4 -0
- package/lib/esm/instrumentation/index.d.ts.map +1 -0
- package/lib/esm/instrumentation/index.js +4 -0
- package/lib/esm/routing/Link.d.ts.map +1 -1
- package/lib/esm/routing/Link.js +8 -17
- package/lib/esm/routing/createRouter.d.ts +2 -1
- package/lib/esm/routing/createRouter.d.ts.map +1 -1
- package/lib/esm/routing/createRouter.js +184 -261
- package/lib/esm/tools.d.ts +6 -5
- package/lib/esm/tools.d.ts.map +1 -1
- package/lib/esm/tools.js +17 -34
- package/lib/esm/types.d.ts +7 -49
- package/lib/esm/types.d.ts.map +1 -1
- package/lib/esm/types.js +2 -28
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/instrumentation/Instrumentation.d.ts +66 -0
- package/lib/types/instrumentation/Instrumentation.d.ts.map +1 -0
- package/lib/types/instrumentation/adapters/devtoolsBridge.d.ts +14 -0
- package/lib/types/instrumentation/adapters/devtoolsBridge.d.ts.map +1 -0
- package/lib/types/instrumentation/adapters/logger.d.ts +10 -0
- package/lib/types/instrumentation/adapters/logger.d.ts.map +1 -0
- package/lib/types/instrumentation/index.d.ts +4 -0
- package/lib/types/instrumentation/index.d.ts.map +1 -0
- package/lib/types/routing/Link.d.ts.map +1 -1
- package/lib/types/routing/createRouter.d.ts +2 -1
- package/lib/types/routing/createRouter.d.ts.map +1 -1
- package/lib/types/tools.d.ts +6 -5
- package/lib/types/tools.d.ts.map +1 -1
- package/lib/types/types.d.ts +7 -49
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +33 -18
|
@@ -4,16 +4,12 @@ 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
|
-
import {
|
|
7
|
+
import { createInstrumentationRegistry, } from '../instrumentation/Instrumentation.js';
|
|
8
8
|
export default function createRouter(routes, options = {}) {
|
|
9
9
|
const history = new BrowserHistory();
|
|
10
|
-
const
|
|
11
|
-
let debugSubscribers = null;
|
|
12
|
-
if (debugEnabled) {
|
|
13
|
-
debugSubscribers = new Set();
|
|
14
|
-
}
|
|
10
|
+
const registry = createInstrumentationRegistry(options.instrumentations ?? []);
|
|
15
11
|
let pendingNavigationOrigin;
|
|
16
|
-
let lastNavigationOrigin =
|
|
12
|
+
let lastNavigationOrigin = 'external';
|
|
17
13
|
let lastPreloadSignature = null;
|
|
18
14
|
function normalizeLocation(location) {
|
|
19
15
|
let pathnameValue = '';
|
|
@@ -34,32 +30,23 @@ export default function createRouter(routes, options = {}) {
|
|
|
34
30
|
hash: hashValue,
|
|
35
31
|
};
|
|
36
32
|
}
|
|
37
|
-
function
|
|
38
|
-
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
for (const subscriber of debugSubscribers) {
|
|
42
|
-
try {
|
|
43
|
-
subscriber(payload);
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
}
|
|
47
|
-
}
|
|
33
|
+
function emitEvent(event) {
|
|
34
|
+
registry.emitEvent(event);
|
|
48
35
|
}
|
|
49
36
|
function mapOrigin(raw) {
|
|
50
37
|
if (raw === undefined) {
|
|
51
38
|
return undefined;
|
|
52
39
|
}
|
|
53
40
|
switch (raw) {
|
|
54
|
-
case
|
|
55
|
-
case
|
|
56
|
-
case
|
|
57
|
-
case
|
|
58
|
-
case
|
|
59
|
-
case
|
|
60
|
-
case
|
|
61
|
-
case
|
|
62
|
-
case
|
|
41
|
+
case 'link-click':
|
|
42
|
+
case 'link-hover':
|
|
43
|
+
case 'programmatic':
|
|
44
|
+
case 'popstate-back':
|
|
45
|
+
case 'popstate-forward':
|
|
46
|
+
case 'popstate-unknown':
|
|
47
|
+
case 'external':
|
|
48
|
+
case 'normalize':
|
|
49
|
+
case 'preload-hover':
|
|
63
50
|
return raw;
|
|
64
51
|
default:
|
|
65
52
|
return undefined;
|
|
@@ -73,7 +60,7 @@ export default function createRouter(routes, options = {}) {
|
|
|
73
60
|
origin = mapOrigin(contextOrigin);
|
|
74
61
|
}
|
|
75
62
|
origin ??= fallbackOrigin;
|
|
76
|
-
origin ??=
|
|
63
|
+
origin ??= 'external';
|
|
77
64
|
pendingNavigationOrigin = undefined;
|
|
78
65
|
return origin;
|
|
79
66
|
}
|
|
@@ -102,81 +89,51 @@ export default function createRouter(routes, options = {}) {
|
|
|
102
89
|
}
|
|
103
90
|
return undefined;
|
|
104
91
|
}
|
|
105
|
-
function
|
|
106
|
-
if (!debugEnabled) {
|
|
107
|
-
return undefined;
|
|
108
|
-
}
|
|
92
|
+
function buildEntrySnapshot(entry) {
|
|
109
93
|
return {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
});
|
|
117
|
-
},
|
|
94
|
+
location: normalizeLocation(entry.location),
|
|
95
|
+
routePath: readMatchedRoutePath(entry),
|
|
96
|
+
preparedMatch: entry.preparedMatch,
|
|
97
|
+
filters: entry.filters,
|
|
98
|
+
filterDiagnostics: entry.filterDiagnostics,
|
|
99
|
+
activeQuerySchema: entry.activeQuerySchema,
|
|
118
100
|
};
|
|
119
101
|
}
|
|
120
|
-
function
|
|
121
|
-
|
|
102
|
+
function notifyEntry(entry) {
|
|
103
|
+
registry.notifyEntryChange(buildEntrySnapshot(entry));
|
|
122
104
|
}
|
|
123
|
-
function
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const key = buildPreloadKey(kind, pathname);
|
|
105
|
+
function buildPreloadKey(mode, pathname) {
|
|
106
|
+
return `${mode}:${pathname}`;
|
|
107
|
+
}
|
|
108
|
+
function emitPreloadEvent(mode, pathname, source) {
|
|
128
109
|
const now = Date.now();
|
|
110
|
+
const key = buildPreloadKey(mode, pathname);
|
|
129
111
|
const recentlyRecorded = lastPreloadSignature !== null &&
|
|
130
112
|
lastPreloadSignature.key === key &&
|
|
131
113
|
now - lastPreloadSignature.timestamp < 50;
|
|
132
114
|
if (!recentlyRecorded) {
|
|
133
|
-
|
|
134
|
-
kind,
|
|
135
|
-
|
|
115
|
+
emitEvent({
|
|
116
|
+
kind: 'preload',
|
|
117
|
+
source,
|
|
136
118
|
timestamp: now,
|
|
137
119
|
location: normalizeLocation(history.location),
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
},
|
|
120
|
+
targetPathname: pathname,
|
|
121
|
+
mode,
|
|
141
122
|
});
|
|
142
123
|
}
|
|
143
|
-
lastPreloadSignature =
|
|
124
|
+
lastPreloadSignature = { key, timestamp: now };
|
|
144
125
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
};
|
|
126
|
+
function emitHistoryEvent(action, source, location, details) {
|
|
127
|
+
pendingNavigationOrigin = source;
|
|
128
|
+
emitEvent({
|
|
129
|
+
kind: 'history',
|
|
130
|
+
source,
|
|
131
|
+
action,
|
|
132
|
+
timestamp: Date.now(),
|
|
133
|
+
location: normalizeLocation(location),
|
|
134
|
+
details,
|
|
135
|
+
});
|
|
178
136
|
}
|
|
179
|
-
let routerGlobal = null;
|
|
180
137
|
const flatRoutes = buildRoutes(routes);
|
|
181
138
|
const route = getMatchedRoute(flatRoutes, history.location);
|
|
182
139
|
const initialRawQuery = parseRawQuery(history.location.search);
|
|
@@ -194,7 +151,18 @@ export default function createRouter(routes, options = {}) {
|
|
|
194
151
|
initialFilters = parsed.filters;
|
|
195
152
|
initialFilterDiagnostics = parsed.diagnostics;
|
|
196
153
|
}
|
|
197
|
-
const
|
|
154
|
+
const initialLocationSnapshot = normalizeLocation(history.location);
|
|
155
|
+
let initialInstrumentation;
|
|
156
|
+
if (route != null) {
|
|
157
|
+
initialInstrumentation = {
|
|
158
|
+
emit: (event) => {
|
|
159
|
+
emitEvent(event);
|
|
160
|
+
},
|
|
161
|
+
source: lastNavigationOrigin,
|
|
162
|
+
location: initialLocationSnapshot,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const preparedMatch = prepareMatch(route, initialFilters, initialInstrumentation);
|
|
198
166
|
let currentEntry = {
|
|
199
167
|
forceRerender: false,
|
|
200
168
|
location: history.location,
|
|
@@ -205,7 +173,6 @@ export default function createRouter(routes, options = {}) {
|
|
|
205
173
|
filters: initialFilters,
|
|
206
174
|
filterDiagnostics: initialFilterDiagnostics,
|
|
207
175
|
activeQuerySchema: initialUnifiedSchema,
|
|
208
|
-
debugOrigin: lastNavigationOrigin,
|
|
209
176
|
};
|
|
210
177
|
const initTyped = currentEntry.filters;
|
|
211
178
|
let initPageNumeric;
|
|
@@ -232,18 +199,15 @@ export default function createRouter(routes, options = {}) {
|
|
|
232
199
|
querySchema: initialUnifiedSchema,
|
|
233
200
|
});
|
|
234
201
|
if (normalizedSearch !== history.location.search) {
|
|
235
|
-
|
|
202
|
+
emitHistoryEvent('normalize', 'normalize', {
|
|
236
203
|
pathname: history.location.pathname,
|
|
237
204
|
search: normalizedSearch,
|
|
238
205
|
hash: '',
|
|
239
206
|
}, { reason: 'initial-page-clamp' });
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
trigger: 'normalize',
|
|
245
|
-
};
|
|
246
|
-
}
|
|
207
|
+
const normalizeDebugContext = {
|
|
208
|
+
origin: 'normalize',
|
|
209
|
+
trigger: 'normalize',
|
|
210
|
+
};
|
|
247
211
|
history.set({
|
|
248
212
|
pathname: history.location.pathname,
|
|
249
213
|
search: normalizedSearch,
|
|
@@ -254,25 +218,17 @@ export default function createRouter(routes, options = {}) {
|
|
|
254
218
|
...currentEntry,
|
|
255
219
|
location: { ...currentEntry.location, search: normalizedSearch },
|
|
256
220
|
rawSearch: normalizedSearch,
|
|
257
|
-
debugOrigin: NavigationOrigin.Normalize,
|
|
258
221
|
};
|
|
259
222
|
}
|
|
260
223
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
timestamp: Date.now(),
|
|
270
|
-
location: normalizeLocation(history.location),
|
|
271
|
-
details: {
|
|
272
|
-
routePath: readMatchedRoutePath(currentEntry),
|
|
273
|
-
},
|
|
274
|
-
});
|
|
275
|
-
}
|
|
224
|
+
notifyEntry(currentEntry);
|
|
225
|
+
emitEvent({
|
|
226
|
+
kind: 'snapshot',
|
|
227
|
+
source: lastNavigationOrigin,
|
|
228
|
+
timestamp: Date.now(),
|
|
229
|
+
location: normalizeLocation(currentEntry.location),
|
|
230
|
+
routePath: readMatchedRoutePath(currentEntry),
|
|
231
|
+
});
|
|
276
232
|
let nextId = 0;
|
|
277
233
|
const subscribers = new Map();
|
|
278
234
|
const disposeHistory = history.subscribe((location, forceRerender, debugContext) => {
|
|
@@ -280,55 +236,30 @@ export default function createRouter(routes, options = {}) {
|
|
|
280
236
|
lastNavigationOrigin = origin;
|
|
281
237
|
const locationPayload = normalizeLocation(location);
|
|
282
238
|
const debugContextOrigin = debugContext?.origin;
|
|
283
|
-
if (
|
|
239
|
+
if (debugContextOrigin !== undefined) {
|
|
284
240
|
let historyDetails;
|
|
285
241
|
if (typeof debugContext?.historyIndex === 'number') {
|
|
286
242
|
historyDetails = { historyIndex: debugContext.historyIndex };
|
|
287
243
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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;
|
|
244
|
+
if (debugContextOrigin === 'popstate-back' ||
|
|
245
|
+
debugContextOrigin === 'popstate-forward' ||
|
|
246
|
+
debugContextOrigin === 'popstate-unknown' ||
|
|
247
|
+
debugContextOrigin === 'external') {
|
|
248
|
+
let direction = 'unknown';
|
|
249
|
+
if (debugContextOrigin === 'popstate-back') {
|
|
250
|
+
direction = 'back';
|
|
318
251
|
}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
kind: RouterDebugEventKind.ExternalNavigation,
|
|
322
|
-
origin,
|
|
323
|
-
timestamp: Date.now(),
|
|
324
|
-
location: locationPayload,
|
|
325
|
-
details: historyDetails,
|
|
326
|
-
});
|
|
327
|
-
break;
|
|
328
|
-
}
|
|
329
|
-
default: {
|
|
330
|
-
break;
|
|
252
|
+
else if (debugContextOrigin === 'popstate-forward') {
|
|
253
|
+
direction = 'forward';
|
|
331
254
|
}
|
|
255
|
+
emitEvent({
|
|
256
|
+
kind: 'popstate',
|
|
257
|
+
source: origin,
|
|
258
|
+
timestamp: Date.now(),
|
|
259
|
+
location: locationPayload,
|
|
260
|
+
direction,
|
|
261
|
+
details: historyDetails,
|
|
262
|
+
});
|
|
332
263
|
}
|
|
333
264
|
}
|
|
334
265
|
const samePathname = location.pathname === currentEntry.location.pathname;
|
|
@@ -339,7 +270,7 @@ export default function createRouter(routes, options = {}) {
|
|
|
339
270
|
let nextPreparedMatch = currentEntry.preparedMatch;
|
|
340
271
|
let nextRoute = currentEntry.route;
|
|
341
272
|
if (!samePathname) {
|
|
342
|
-
nextRoute = getMatchedRoute(flatRoutes,
|
|
273
|
+
nextRoute = getMatchedRoute(flatRoutes, location);
|
|
343
274
|
}
|
|
344
275
|
const query = parseRawQuery(location.search);
|
|
345
276
|
let querySchema;
|
|
@@ -377,7 +308,17 @@ export default function createRouter(routes, options = {}) {
|
|
|
377
308
|
normalized = true;
|
|
378
309
|
}
|
|
379
310
|
if (!samePathname || !sameSearch) {
|
|
380
|
-
|
|
311
|
+
let updateInstrumentation;
|
|
312
|
+
if (nextRoute != null) {
|
|
313
|
+
updateInstrumentation = {
|
|
314
|
+
emit: (event) => {
|
|
315
|
+
emitEvent(event);
|
|
316
|
+
},
|
|
317
|
+
source: origin,
|
|
318
|
+
location: locationPayload,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
nextPreparedMatch = prepareMatch(nextRoute, undefined, updateInstrumentation);
|
|
381
322
|
}
|
|
382
323
|
const nextEntry = {
|
|
383
324
|
forceRerender: forceRerender || (samePathname && !sameSearch),
|
|
@@ -389,7 +330,6 @@ export default function createRouter(routes, options = {}) {
|
|
|
389
330
|
filters,
|
|
390
331
|
filterDiagnostics,
|
|
391
332
|
activeQuerySchema: querySchema,
|
|
392
|
-
debugOrigin: origin,
|
|
393
333
|
};
|
|
394
334
|
if (normalized && querySchema != null) {
|
|
395
335
|
const normalizedSearch = buildCombinedSearch({
|
|
@@ -401,18 +341,15 @@ export default function createRouter(routes, options = {}) {
|
|
|
401
341
|
if (!nextSearchStr.startsWith('?') && nextSearchStr.length > 0) {
|
|
402
342
|
nextSearchStr = `?${nextSearchStr}`;
|
|
403
343
|
}
|
|
404
|
-
|
|
344
|
+
emitHistoryEvent('normalize', 'normalize', {
|
|
405
345
|
pathname: location.pathname,
|
|
406
346
|
search: nextSearchStr,
|
|
407
347
|
hash: '',
|
|
408
348
|
}, { reason: 'runtime-page-clamp' });
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
trigger: 'normalize',
|
|
414
|
-
};
|
|
415
|
-
}
|
|
349
|
+
const runtimeNormalizeContext = {
|
|
350
|
+
origin: 'normalize',
|
|
351
|
+
trigger: 'normalize',
|
|
352
|
+
};
|
|
416
353
|
history.set({
|
|
417
354
|
pathname: location.pathname,
|
|
418
355
|
search: nextSearchStr,
|
|
@@ -426,28 +363,46 @@ export default function createRouter(routes, options = {}) {
|
|
|
426
363
|
subscribers.forEach((callback) => {
|
|
427
364
|
callback(nextEntry);
|
|
428
365
|
});
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
},
|
|
438
|
-
});
|
|
439
|
-
}
|
|
366
|
+
notifyEntry(nextEntry);
|
|
367
|
+
emitEvent({
|
|
368
|
+
kind: 'snapshot',
|
|
369
|
+
source: origin,
|
|
370
|
+
timestamp: Date.now(),
|
|
371
|
+
location: locationPayload,
|
|
372
|
+
routePath: readMatchedRoutePath(nextEntry),
|
|
373
|
+
});
|
|
440
374
|
});
|
|
375
|
+
function normalizePreloadTarget(target) {
|
|
376
|
+
let normalizedPathname = history.location.pathname;
|
|
377
|
+
if (typeof target.pathname === 'string' && target.pathname.length > 0) {
|
|
378
|
+
normalizedPathname = target.pathname;
|
|
379
|
+
}
|
|
380
|
+
let normalizedSearch = '';
|
|
381
|
+
if (typeof target.search === 'string') {
|
|
382
|
+
normalizedSearch = target.search;
|
|
383
|
+
}
|
|
384
|
+
let normalizedSource = 'programmatic';
|
|
385
|
+
const mappedSource = mapOrigin(target.source);
|
|
386
|
+
if (mappedSource !== undefined) {
|
|
387
|
+
normalizedSource = mappedSource;
|
|
388
|
+
}
|
|
389
|
+
return {
|
|
390
|
+
pathname: normalizedPathname,
|
|
391
|
+
search: normalizedSearch,
|
|
392
|
+
source: normalizedSource,
|
|
393
|
+
};
|
|
394
|
+
}
|
|
441
395
|
const context = {
|
|
442
396
|
history,
|
|
443
397
|
get() {
|
|
444
398
|
return currentEntry;
|
|
445
399
|
},
|
|
446
|
-
preloadCode(
|
|
447
|
-
|
|
400
|
+
preloadCode(target) {
|
|
401
|
+
const normalized = normalizePreloadTarget(target);
|
|
402
|
+
emitPreloadEvent('code', normalized.pathname, normalized.source);
|
|
448
403
|
const matches = getMatchedRoute(flatRoutes, {
|
|
449
|
-
...
|
|
450
|
-
pathname,
|
|
404
|
+
...history.location,
|
|
405
|
+
pathname: normalized.pathname,
|
|
451
406
|
});
|
|
452
407
|
if (matches == null) {
|
|
453
408
|
return;
|
|
@@ -459,22 +414,38 @@ export default function createRouter(routes, options = {}) {
|
|
|
459
414
|
resourcePage.load();
|
|
460
415
|
});
|
|
461
416
|
},
|
|
462
|
-
preload(
|
|
463
|
-
|
|
417
|
+
preload(target) {
|
|
418
|
+
const normalized = normalizePreloadTarget(target);
|
|
419
|
+
emitPreloadEvent('full', normalized.pathname, normalized.source);
|
|
464
420
|
const matches = getMatchedRoute(flatRoutes, {
|
|
465
|
-
...
|
|
466
|
-
pathname,
|
|
421
|
+
...history.location,
|
|
422
|
+
pathname: normalized.pathname,
|
|
467
423
|
});
|
|
468
|
-
|
|
424
|
+
const locationSnapshot = {
|
|
425
|
+
pathname: normalized.pathname,
|
|
426
|
+
search: normalized.search,
|
|
427
|
+
hash: '',
|
|
428
|
+
};
|
|
429
|
+
let instrumentation;
|
|
430
|
+
if (matches != null) {
|
|
431
|
+
instrumentation = {
|
|
432
|
+
emit: (event) => {
|
|
433
|
+
emitEvent(event);
|
|
434
|
+
},
|
|
435
|
+
source: normalized.source,
|
|
436
|
+
location: locationSnapshot,
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
prepareMatch(matches, undefined, instrumentation);
|
|
469
440
|
},
|
|
470
441
|
subscribe(callback) {
|
|
471
442
|
nextId += 1;
|
|
472
443
|
const id = nextId;
|
|
473
|
-
|
|
444
|
+
function disposeCallback() {
|
|
474
445
|
subscribers.delete(id);
|
|
475
|
-
}
|
|
446
|
+
}
|
|
476
447
|
subscribers.set(id, callback);
|
|
477
|
-
return
|
|
448
|
+
return disposeCallback;
|
|
478
449
|
},
|
|
479
450
|
navigate({ pathname, query, filters: navFilters, replace }) {
|
|
480
451
|
const current = currentEntry;
|
|
@@ -483,11 +454,11 @@ export default function createRouter(routes, options = {}) {
|
|
|
483
454
|
targetPathname = current.location.pathname;
|
|
484
455
|
}
|
|
485
456
|
let destSchema;
|
|
486
|
-
const
|
|
487
|
-
...
|
|
457
|
+
const destinationRoute = getMatchedRoute(flatRoutes, {
|
|
458
|
+
...history.location,
|
|
488
459
|
pathname: targetPathname,
|
|
489
460
|
});
|
|
490
|
-
const lastRoute =
|
|
461
|
+
const lastRoute = destinationRoute?.route.routes.at(-1);
|
|
491
462
|
if (lastRoute != null) {
|
|
492
463
|
destSchema = lastRoute.querySchema;
|
|
493
464
|
}
|
|
@@ -500,43 +471,36 @@ export default function createRouter(routes, options = {}) {
|
|
|
500
471
|
querySchema: destSchema,
|
|
501
472
|
});
|
|
502
473
|
const locationObj = { pathname: targetPathname, search, hash: '' };
|
|
503
|
-
const origin =
|
|
504
|
-
|
|
474
|
+
const origin = 'programmatic';
|
|
475
|
+
const debugContext = {
|
|
476
|
+
origin,
|
|
477
|
+
trigger: 'programmatic',
|
|
478
|
+
};
|
|
505
479
|
if (replace === true) {
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
programmaticReplaceContext = {
|
|
510
|
-
origin,
|
|
511
|
-
trigger: 'programmatic',
|
|
512
|
-
};
|
|
513
|
-
}
|
|
480
|
+
emitHistoryEvent('replace', origin, locationObj, {
|
|
481
|
+
trigger: 'programmatic',
|
|
482
|
+
});
|
|
514
483
|
history.set({
|
|
515
484
|
...locationObj,
|
|
516
|
-
debugContext
|
|
485
|
+
debugContext,
|
|
517
486
|
});
|
|
518
487
|
}
|
|
519
488
|
else {
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
programmaticPushContext = {
|
|
524
|
-
origin,
|
|
525
|
-
trigger: 'programmatic',
|
|
526
|
-
};
|
|
527
|
-
}
|
|
489
|
+
emitHistoryEvent('push', origin, locationObj, {
|
|
490
|
+
trigger: 'programmatic',
|
|
491
|
+
});
|
|
528
492
|
history.push({
|
|
529
493
|
...locationObj,
|
|
530
|
-
debugContext
|
|
494
|
+
debugContext,
|
|
531
495
|
});
|
|
532
496
|
}
|
|
533
497
|
},
|
|
534
498
|
getPrepared(path) {
|
|
535
499
|
try {
|
|
536
500
|
const entry = currentEntry;
|
|
537
|
-
for (const
|
|
538
|
-
if (
|
|
539
|
-
return
|
|
501
|
+
for (const preparedRoute of entry.preparedMatch.routes) {
|
|
502
|
+
if (preparedRoute.path === path) {
|
|
503
|
+
return preparedRoute.prepared;
|
|
540
504
|
}
|
|
541
505
|
}
|
|
542
506
|
return undefined;
|
|
@@ -545,53 +509,12 @@ export default function createRouter(routes, options = {}) {
|
|
|
545
509
|
return undefined;
|
|
546
510
|
}
|
|
547
511
|
},
|
|
548
|
-
__debug: debugHelpers,
|
|
549
512
|
};
|
|
550
|
-
if (options.debug === true) {
|
|
551
|
-
try {
|
|
552
|
-
if (typeof window !== 'undefined') {
|
|
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;
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
catch {
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
513
|
function cleanup() {
|
|
577
514
|
disposeHistory();
|
|
578
|
-
|
|
579
|
-
|
|
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__;
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
catch {
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
routerGlobal = null;
|
|
515
|
+
subscribers.clear();
|
|
516
|
+
registry.dispose();
|
|
594
517
|
}
|
|
595
518
|
return { context, cleanup };
|
|
596
519
|
}
|
|
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==
|
|
520
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLG1CQUFtQixNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFVOUQsT0FBTyxFQUNMLDZCQUE2QixHQU05QixNQUFNLHVDQUF1QyxDQUFDO0FBK0QvQyxNQUFNLENBQUMsT0FBTyxVQUFVLFlBQVksQ0FDbEMsTUFBMkIsRUFDM0IsVUFBK0IsRUFBRTtJQUdqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0lBRXJDLE1BQU0sUUFBUSxHQUFHLDZCQUE2QixDQUM1QyxPQUFPLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUMvQixDQUFDO0lBRUYsSUFBSSx1QkFBMkQsQ0FBQztJQUNoRSxJQUFJLG9CQUFvQixHQUEyQixVQUFVLENBQUM7SUFDOUQsSUFBSSxvQkFBb0IsR0FHYixJQUFJLENBQUM7SUFLaEIsU0FBUyxpQkFBaUIsQ0FBQyxRQUkxQjtRQUNDLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLE9BQU8sUUFBUSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMxQyxhQUFhLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUks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QkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNYLEdBQUcsV0FBVztvQkFDZCxZQUFZO2lCQUNiLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQ0QsV0FBVyxDQUFDLElBQUk7WUFDZCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO2dCQUMzQixLQUFLLE1BQU0sYUFBYSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3ZELElBQUksYUFBYSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDaEMsT0FBTyxhQUFhLENBQUMsUUFBZSxDQUFDO29CQUN2QyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7SUFHRixTQUFTLE9BQU87UUFDZCxjQUFjLEVBQUUsQ0FBQztRQUNqQixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFHRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBidWlsZFJvdXRlcyB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgQnJvd3Nlckhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L2luZGV4LmpzJztcbmltcG9ydCB7IGdldE1hdGNoZWRSb3V0ZSwgcHJlcGFyZU1hdGNoIH0gZnJvbSAnLi4vdG9vbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VSYXdRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LmpzJztcbmltcG9ydCBidWlsZENvbWJpbmVkU2VhcmNoIGZyb20gJy4uL3Rvb2xzL2J1aWxkQ29tYmluZWRTZWFyY2guanMnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VGaWx0ZXJzIH0gZnJvbSAnQHBsdW1pbGUvZmlsdGVyLXF1ZXJ5JztcbmltcG9ydCB7XG4gIHR5cGUgUm91dGVFbnRyeSxcbiAgdHlwZSBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIHR5cGUgU3Vic2NyaWJlQ2FsbGJhY2ssXG4gIHR5cGUgQW55Um91dGUsXG4gIHR5cGUgUHJlcGFyZWRBY2Nlc3MsXG4gIHR5cGUgTmF2aWdhdGVPdmVybG9hZHMsXG4gIHR5cGUgUHJlbG9hZFRhcmdldCxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnksXG4gIHR5cGUgSW5zdHJ1bWVudGF0aW9uQVBJLFxuICB0eXBlIFJvdXRlckVudHJ5U25hcHNob3QsXG4gIHR5cGUgUm91dGVyTG9jYXRpb25TbmFwc2hvdCxcbiAgdHlwZSBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICB0eXBlIFJvdXRlckV2ZW50LFxufSBmcm9tICcuLi9pbnN0cnVtZW50YXRpb24vSW5zdHJ1bWVudGF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSGlzdG9yeURlYnVnQ29udGV4dCB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgY3JlYXRlUm91dGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJSZXR1cm48UiBleHRlbmRzIEFueVJvdXRlW10+ID0ge1xuICAvKiogRnVuY3Rpb24gdG8gY2xlYW4gdXAgcm91dGVyIGxpc3RlbmVycyBhbmQgcmVzb3VyY2VzICovXG4gIGNsZWFudXA6ICgpID0+IHZvaWQ7XG4gIC8qKiBSb3V0ZXIgY29udGV4dCBvYmplY3QgZm9yIHRoZSBSZWFjdCBDb250ZXh0IFByb3ZpZGVyICovXG4gIGNvbnRleHQ6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+ICYgUHJlcGFyZWRBY2Nlc3M8Uj47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSByb3V0ZXIgc3lzdGVtIGZyb20gcm91dGUgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVGhpcyByb3V0ZXIgaXMgYnVpbHQgZnJvbSB0aGUgc2FtZSBwcmltaXRpdmVzIGFzIHJlYWN0LXJvdXRlciBidXQgd2l0aCBhZGRpdGlvbmFsXG4gKiBmZWF0dXJlcyBmb3IgZGF0YSBwcmVsb2FkaW5nIGFuZCBjb2RlIHNwbGl0dGluZy4gRWFjaCByb3V0ZSBjYW4gY29udGFpbiBib3RoIGFcbiAqIENvbXBvbmVudCBhbmQgYSBwcmVwYXJlKCkgZnVuY3Rpb24gdGhhdCBjYW4gcHJlbG9hZCBkYXRhIGZvciB0aGUgY29tcG9uZW50LlxuICpcbiAqIFRoZSByb3V0ZXIgd2F0Y2hlcyBmb3IgY2hhbmdlcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiB2aWEgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLFxuICogbWFwcyB0aGUgbG9jYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm91dGUgZW50cnksIGFuZCB0aGVuIHByZWxvYWRzIHRoZSBjb2RlXG4gKiBhbmQgZGF0YSBmb3IgdGhlIHJvdXRlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIEFycmF5IG9mIHJvdXRlIGNvbmZpZ3VyYXRpb25zXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyIGNvbnRleHQgYW5kIGNsZWFudXAgZnVuY3Rpb25cbiAqXG4gIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVNYXRjaChyb3V0ZSwgcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkpLFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgcm91dGVzID0gW1xuICogICB7XG4gKiAgICAgcGF0aDogJy91c2Vycy86aWQnLFxuICogICAgIHJlc291cmNlUGFnZTogZ2V0UmVzb3VyY2VQYWdlKCdVc2VyUHJvZmlsZScsICgpID0+IGltcG9ydCgnLi9Vc2VyUHJvZmlsZScpKSxcbiAqICAgICBwcmVwYXJlOiAoeyB2YXJpYWJsZXMgfSkgPT4gKHsgdXNlcklkOiB2YXJpYWJsZXMuaWQgfSlcbiAqICAgfVxuICogXTtcbiAqXG4gKiBjb25zdCB7IGNvbnRleHQsIGNsZWFudXAgfSA9IGNyZWF0ZVJvdXRlcihyb3V0ZXMpO1xuICpcbiAqIC8vIFVzZSBpbiBSZWFjdCBhcHBcbiAqIDxSb3V0aW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+XG4gKiAgIDxSb3V0ZXJSZW5kZXJlciAvPlxuICogPC9Sb3V0aW5nQ29udGV4dC5Qcm92aWRlcj5cbiAqIGBgYFxuICovXG4vKipcbiAqIENyZWF0ZSBhIHJvdXRlciAodHlwZWQgb3ZlcmxvYWQpLiBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3QgdHVwbGUgb2Ygcm91dGVzLCBnZW5lcmljcyBhcmUgcHJlc2VydmVkLlxuICovXG4vKipcbiAqIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIGBjcmVhdGVSb3V0ZXJgLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJPcHRpb25zID0ge1xuICAvKiogSW5zdHJ1bWVudGF0aW9ucyB0byBhdHRhY2ggdG8gdGhlIHJvdXRlciAoRGV2VG9vbHMgYnJpZGdlLCBsb2dnZXIsIC4uLikuICovXG4gIGluc3RydW1lbnRhdGlvbnM/OiBJbnN0cnVtZW50YXRpb25BUElbXTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJvdXRlciBpbnN0YW5jZSBmcm9tIGEgcm91dGUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gUm91dGUgZGVmaW5pdGlvbnMgdG8gcmVnaXN0ZXIuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGluc3RydW1lbnRhdGlvbiBzZXR0aW5ncyB1c2VkIGZvciBleHBvc2luZyBkZXZlbG9wbWVudCB0b29saW5nLlxuICogQHBhcmFtIG9wdGlvbnMuaW5zdHJ1bWVudGF0aW9ucyAtIEluc3RydW1lbnRhdGlvbnMgaW52b2tlZCBvbiByb3V0ZXIgZXZlbnRzIChkZXZlbG9wbWVudCBvbmx5KS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlUm91dGVyPFIgZXh0ZW5kcyBBbnlSb3V0ZVtdPihcbiAgcm91dGVzOiBbLi4uUl0gfCBBbnlSb3V0ZVtdLFxuICBvcHRpb25zOiBDcmVhdGVSb3V0ZXJPcHRpb25zID0ge30sXG4pOiBDcmVhdGVSb3V0ZXJSZXR1cm48UiBleHRlbmRzIEFueVJvdXRlW10gPyBSIDogQW55Um91dGVbXT4ge1xuICAvLyBJbml0aWFsaXplIGJyb3dzZXIgaGlzdG9yeSBtYW5hZ2VyXG4gIGNvbnN0IGhpc3RvcnkgPSBuZXcgQnJvd3Nlckhpc3RvcnkoKTtcblxuICBjb25zdCByZWdpc3RyeSA9IGNyZWF0ZUluc3RydW1lbnRhdGlvblJlZ2lzdHJ5KFxuICAgIG9wdGlvbnMuaW5zdHJ1bWVudGF0aW9ucyA/PyBbXSxcbiAgKTtcblxuICBsZXQgcGVuZGluZ05hdmlnYXRpb25PcmlnaW46IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgfCB1bmRlZmluZWQ7XG4gIGxldCBsYXN0TmF2aWdhdGlvbk9yaWdpbjogUm91dGVyTmF2aWdhdGlvblNvdXJjZSA9ICdleHRlcm5hbCc7XG4gIGxldCBsYXN0UHJlbG9hZFNpZ25hdHVyZToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgcGFydGlhbCBsb2NhdGlvbiBvYmplY3QgaW50byBhIGZ1bGwgbG9jYXRpb24gc3RydWN0dXJlIHdpdGggc3RyaW5nIGZpZWxkcy5cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uOiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g/OiBzdHJpbmc7XG4gICAgaGFzaD86IHN0cmluZztcbiAgfSk6IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmc7IGhhc2g6IHN0cmluZyB9IHtcbiAgICBsZXQgcGF0aG5hbWVWYWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24ucGF0aG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXRobmFtZVZhbHVlID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgfVxuICAgIGxldCBzZWFyY2hWYWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24uc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgc2VhcmNoVmFsdWUgPSBsb2NhdGlvbi5zZWFyY2g7XG4gICAgfVxuICAgIGxldCBoYXNoVmFsdWUgPSAnJztcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uLmhhc2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICBoYXNoVmFsdWUgPSBsb2NhdGlvbi5oYXNoO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lVmFsdWUsXG4gICAgICBzZWFyY2g6IHNlYXJjaFZhbHVlLFxuICAgICAgaGFzaDogaGFzaFZhbHVlLFxuICAgIH07XG4gIH1cblxuICAvKiogRW1pdHMgYSByb3V0ZXIgZXZlbnQgdG8gZXZlcnkgcmVnaXN0ZXJlZCBpbnN0cnVtZW50YXRpb24uICovXG4gIGZ1bmN0aW9uIGVtaXRFdmVudChldmVudDogUm91dGVyRXZlbnQpOiB2b2lkIHtcbiAgICByZWdpc3RyeS5lbWl0RXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIGNvZXJjZSBhbiBhcmJpdHJhcnkgc3RyaW5nIGludG8gYSBrbm93biBuYXZpZ2F0aW9uIHNvdXJjZS5cbiAgICovXG4gIGZ1bmN0aW9uIG1hcE9yaWdpbihyYXc/OiBzdHJpbmcpOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocmF3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHN3aXRjaCAocmF3KSB7XG4gICAgICBjYXNlICdsaW5rLWNsaWNrJzpcbiAgICAgIGNhc2UgJ2xpbmstaG92ZXInOlxuICAgICAgY2FzZSAncHJvZ3JhbW1hdGljJzpcbiAgICAgIGNhc2UgJ3BvcHN0YXRlLWJhY2snOlxuICAgICAgY2FzZSAncG9wc3RhdGUtZm9yd2FyZCc6XG4gICAgICBjYXNlICdwb3BzdGF0ZS11bmtub3duJzpcbiAgICAgIGNhc2UgJ2V4dGVybmFsJzpcbiAgICAgIGNhc2UgJ25vcm1hbGl6ZSc6XG4gICAgICBjYXNlICdwcmVsb2FkLWhvdmVyJzpcbiAgICAgICAgcmV0dXJuIHJhdztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgb3JpZ2luIGZvciB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIGV2ZW50LlxuICAgKi9cbiAgLyoqIFJlc29sdmVzIHRoZSBuYXZpZ2F0aW9uIHNvdXJjZSBjb21iaW5pbmcgaGlzdG9yeSBjb250ZXh0IGFuZCBwZW5kaW5nIGludGVudC4gKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZU5hdmlnYXRpb25PcmlnaW4oXG4gICAgY29udGV4dD86IEhpc3RvcnlEZWJ1Z0NvbnRleHQgfCBudWxsLFxuICApOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlIHtcbiAgICBjb25zdCBmYWxsYmFja09yaWdpbiA9IHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luO1xuICAgIGxldCBvcmlnaW46IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjb250ZXh0T3JpZ2luID0gY29udGV4dD8ub3JpZ2luO1xuICAgIGlmIChjb250ZXh0T3JpZ2luICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9yaWdpbiA9IG1hcE9yaWdpbihjb250ZXh0T3JpZ2luKTtcbiAgICB9XG5cbiAgICBvcmlnaW4gPz89IGZhbGxiYWNrT3JpZ2luO1xuICAgIG9yaWdpbiA/Pz0gJ2V4dGVybmFsJztcbiAgICBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbiA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gb3JpZ2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIHRoZSBpbm5lci1tb3N0IG1hdGNoZWQgcm91dGUgcGF0aCBmcm9tIGEgcm91dGUgZW50cnkgd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICAvKiogUmV0dXJucyB0aGUgZGVlcGVzdCBtYXRjaGVkIHJvdXRlIHBhdGggZnJvbSBhIHJvdXRlIGVudHJ5IGlmIGF2YWlsYWJsZS4gKi9cbiAgZnVuY3Rpb24gcmVhZE1hdGNoZWRSb3V0ZVBhdGgoXG4gICAgZW50cnk6IFJvdXRlRW50cnk8YW55PiB8IHVuZGVmaW5lZCxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hlZFJvdXRlID0gZW50cnkucm91dGU7XG4gICAgaWYgKG1hdGNoZWRSb3V0ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBtYXRjaGVkUm91dGUucm91dGUucm91dGVzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkUm91dGVzKSkge1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gY2hpbGRSb3V0ZXMuYXQoLTEpO1xuICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGxhc3RDaGlsZFJlY29yZCA9IGxhc3RDaGlsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gbGFzdENoaWxkUmVjb3JkLnBhdGg7XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBjaGlsZFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm9vdFBhdGggPSBtYXRjaGVkUm91dGUucm91dGUucGF0aDtcbiAgICBpZiAodHlwZW9mIHJvb3RQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJvb3RQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhIHNuYXBzaG90IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHJvdXRlciBlbnRyeS4gKi9cbiAgZnVuY3Rpb24gYnVpbGRFbnRyeVNuYXBzaG90KGVudHJ5OiBSb3V0ZUVudHJ5PGFueT4pOiBSb3V0ZXJFbnRyeVNuYXBzaG90IHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGVudHJ5LmxvY2F0aW9uKSxcbiAgICAgIHJvdXRlUGF0aDogcmVhZE1hdGNoZWRSb3V0ZVBhdGgoZW50cnkpLFxuICAgICAgcHJlcGFyZWRNYXRjaDogZW50cnkucHJlcGFyZWRNYXRjaCxcbiAgICAgIGZpbHRlcnM6IGVudHJ5LmZpbHRlcnMsXG4gICAgICBmaWx0ZXJEaWFnbm9zdGljczogZW50cnkuZmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgICBhY3RpdmVRdWVyeVNjaGVtYTogZW50cnkuYWN0aXZlUXVlcnlTY2hlbWEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBOb3RpZmllcyBpbnN0cnVtZW50YXRpb25zIG9mIGEgbmV3IGFjdGl2ZSBlbnRyeS4gKi9cbiAgZnVuY3Rpb24gbm90aWZ5RW50cnkoZW50cnk6IFJvdXRlRW50cnk8YW55Pik6IHZvaWQge1xuICAgIHJlZ2lzdHJ5Lm5vdGlmeUVudHJ5Q2hhbmdlKGJ1aWxkRW50cnlTbmFwc2hvdChlbnRyeSkpO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgYSBkZWR1cGxpY2F0aW9uIGtleSBmb3IgcHJlbG9hZCBldmVudHMuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlbG9hZEtleShtb2RlOiAnY29kZScgfCAnZnVsbCcsIHBhdGhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHttb2RlfToke3BhdGhuYW1lfWA7XG4gIH1cblxuICAvKiogRW1pdHMgYSBwcmVsb2FkIG9yIHByZWxvYWQtY29kZSBpbnN0cnVtZW50YXRpb24gZXZlbnQuICovXG4gIGZ1bmN0aW9uIGVtaXRQcmVsb2FkRXZlbnQoXG4gICAgbW9kZTogJ2NvZGUnIHwgJ2Z1bGwnLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkUHJlbG9hZEtleShtb2RlLCBwYXRobmFtZSk7XG4gICAgY29uc3QgcmVjZW50bHlSZWNvcmRlZCA9XG4gICAgICBsYXN0UHJlbG9hZFNpZ25hdHVyZSAhPT0gbnVsbCAmJlxuICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUua2V5ID09PSBrZXkgJiZcbiAgICAgIG5vdyAtIGxhc3RQcmVsb2FkU2lnbmF0dXJlLnRpbWVzdGFtcCA8IDUwO1xuXG4gICAgaWYgKCFyZWNlbnRseVJlY29yZGVkKSB7XG4gICAgICBlbWl0RXZlbnQoe1xuICAgICAgICBraW5kOiAncHJlbG9hZCcsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wOiBub3csXG4gICAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihoaXN0b3J5LmxvY2F0aW9uKSxcbiAgICAgICAgdGFyZ2V0UGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgICAgICBtb2RlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGFzdFByZWxvYWRTaWduYXR1cmUgPSB7IGtleSwgdGltZXN0YW1wOiBub3cgfTtcbiAgfVxuXG4gIC8qKiBFbWl0cyBhIGhpc3RvcnkgbXV0YXRpb24gZXZlbnQgKHB1c2gvcmVwbGFjZS9ub3JtYWxpemUpLiAqL1xuICBmdW5jdGlvbiBlbWl0SGlzdG9yeUV2ZW50KFxuICAgIGFjdGlvbjogJ3B1c2gnIHwgJ3JlcGxhY2UnIHwgJ25vcm1hbGl6ZScsXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICAgIGxvY2F0aW9uOiB7IHBhdGhuYW1lOiBzdHJpbmc7IHNlYXJjaD86IHN0cmluZzsgaGFzaD86IHN0cmluZyB9LFxuICAgIGRldGFpbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogdm9pZCB7XG4gICAgcGVuZGluZ05hdmlnYXRpb25PcmlnaW4gPSBzb3VyY2U7XG4gICAgZW1pdEV2ZW50KHtcbiAgICAgIGtpbmQ6ICdoaXN0b3J5JyxcbiAgICAgIHNvdXJjZSxcbiAgICAgIGFjdGlvbixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihsb2NhdGlvbiksXG4gICAgICBkZXRhaWxzLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQnVpbGQgYSBmbGF0IGxpc3Qgb2Ygcm91dGVzIGZvciBlZmZpY2llbnQgbWF0Y2hpbmdcbiAgY29uc3QgZmxhdFJvdXRlcyA9IGJ1aWxkUm91dGVzKHJvdXRlcyk7XG5cbiAgLy8gRmluZCB0aGUgaW5pdGlhbCByb3V0ZSBtYXRjaCBhbmQgcHJlcGFyZSBpdCBmb3IgcmVuZGVyaW5nXG4gIGNvbnN0IHJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIGhpc3RvcnkubG9jYXRpb24pO1xuICBjb25zdCBpbml0aWFsUmF3UXVlcnkgPSBwYXJzZVJhd1F1ZXJ5KGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKTtcbiAgLy8gRGlyZWN0IHNjaGVtYTogb25seSB0aGUgbWF0Y2hlZCByb3V0ZSdzIG93biBxdWVyeVNjaGVtYSAobm8gaGllcmFyY2hpY2FsIGRpc2NvdmVyeSlcbiAgbGV0IGluaXRpYWxVbmlmaWVkU2NoZW1hOiBhbnk7XG4gIGlmIChyb3V0ZSAhPSBudWxsKSB7XG4gICAgY29uc3QgbGFzdCA9IHJvdXRlLnJvdXRlLnJvdXRlcy5hdCgtMSkgYXMgdW5rbm93biBhcyB7XG4gICAgICBxdWVyeVNjaGVtYT86IHVua25vd247XG4gICAgfSB8IG51bGw7XG4gICAgaWYgKGxhc3QgIT0gbnVsbCkge1xuICAgICAgaW5pdGlhbFVuaWZpZWRTY2hlbWEgPSBsYXN0LnF1ZXJ5U2NoZW1hO1xuICAgIH1cbiAgfVxuICBsZXQgaW5pdGlhbEZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBsZXQgaW5pdGlhbEZpbHRlckRpYWdub3N0aWNzOiBhbnlbXSB8IHVuZGVmaW5lZDtcbiAgaWYgKGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZpbHRlcnMoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gsIGluaXRpYWxVbmlmaWVkU2NoZW1hKTtcbiAgICBpbml0aWFsRmlsdGVycyA9IHBhcnNlZC5maWx0ZXJzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaW5pdGlhbEZpbHRlckRpYWdub3N0aWNzID0gcGFyc2VkLmRpYWdub3N0aWNzIGFzIHVua25vd25bXTtcbiAgfVxuICBjb25zdCBpbml0aWFsTG9jYXRpb25TbmFwc2hvdCA9IG5vcm1hbGl6ZUxvY2F0aW9uKGhpc3RvcnkubG9jYXRpb24pO1xuICBsZXQgaW5pdGlhbEluc3RydW1lbnRhdGlvbjpcbiAgICB8IHtcbiAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4gdm9pZDtcbiAgICAgICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICAgICAgICBsb2NhdGlvbjogUm91dGVyTG9jYXRpb25TbmFwc2hvdDtcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZDtcbiAgaWYgKHJvdXRlICE9IG51bGwpIHtcbiAgICBpbml0aWFsSW5zdHJ1bWVudGF0aW9uID0ge1xuICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4ge1xuICAgICAgICBlbWl0RXZlbnQoZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIHNvdXJjZTogbGFzdE5hdmlnYXRpb25PcmlnaW4sXG4gICAgICBsb2NhdGlvbjogaW5pdGlhbExvY2F0aW9uU25hcHNob3QsXG4gICAgfTtcbiAgfVxuICBjb25zdCBwcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgIHJvdXRlLFxuICAgIGluaXRpYWxGaWx0ZXJzLFxuICAgIGluaXRpYWxJbnN0cnVtZW50YXRpb24sXG4gICk7XG4gIC8vIEhlbHBlciB0byBidWlsZCB0aGUgcmF3IHF1ZXJ5IG9iamVjdCBmcm9tIGEgc2VhcmNoIHN0cmluZ1xuICBsZXQgY3VycmVudEVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gPSB7XG4gICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sXG4gICAgcm91dGUsXG4gICAgcHJlcGFyZWRNYXRjaCxcbiAgICByYXdTZWFyY2g6IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoLFxuICAgIHF1ZXJ5OiBpbml0aWFsUmF3UXVlcnksXG4gICAgLy8gdHlwZWRRdWVyeSByZW1vdmVkICh1bmlmaWVkIGludG8gZmlsdGVycy9xdWVyeSlcbiAgICBmaWx0ZXJzOiBpbml0aWFsRmlsdGVycyxcbiAgICBmaWx0ZXJEaWFnbm9zdGljczogaW5pdGlhbEZpbHRlckRpYWdub3N0aWNzLFxuICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgfTtcblxuICAvLyBJbml0aWFsIG5vcm1hbGl6YXRpb24gcGFzcyAoZS5nLiwgY2xhbXAgcGFnZSlcbiAgY29uc3QgaW5pdFR5cGVkID0gY3VycmVudEVudHJ5LmZpbHRlcnMgYXMgdW5rbm93biBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICB8IHVuZGVmaW5lZDtcbiAgbGV0IGluaXRQYWdlTnVtZXJpYzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoaW5pdFR5cGVkICE9IG51bGwpIHtcbiAgICBjb25zdCByYXdQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gICAgaWYgKHR5cGVvZiByYXdQYWdlID09PSAnbnVtYmVyJykgaW5pdFBhZ2VOdW1lcmljID0gcmF3UGFnZTtcbiAgICBlbHNlIGlmIChcbiAgICAgIHJhd1BhZ2UgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHJhd1BhZ2UgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShyYXdQYWdlKSAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJhd1BhZ2UsICdlcScpICYmXG4gICAgICB0eXBlb2YgKHJhd1BhZ2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVxID09PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgaW5pdFBhZ2VOdW1lcmljID0gKHJhd1BhZ2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVxIGFzIG51bWJlcjtcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZU51bWVyaWMgPT09ICdudW1iZXInICYmXG4gICAgaW5pdFBhZ2VOdW1lcmljIDwgMSAmJlxuICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IHsgZXE6IDEgfSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGN1cnJlbnRFbnRyeS5maWx0ZXJzID0gbm9ybTsgLy8gaW1tZWRpYXRlIHZpc2liaWxpdHlcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICBmaWx0ZXJzOiBub3JtLFxuICAgICAgcXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIH0pOyAvLyByZXR1cm5zICcnIG9yIHN0cmluZyBzdGFydGluZyB3aXRoICc/J1xuICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgZW1pdEhpc3RvcnlFdmVudChcbiAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9LFxuICAgICAgICB7IHJlYXNvbjogJ2luaXRpYWwtcGFnZS1jbGFtcCcgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBub3JtYWxpemVEZWJ1Z0NvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgIG9yaWdpbjogJ25vcm1hbGl6ZScsXG4gICAgICAgIHRyaWdnZXI6ICdub3JtYWxpemUnLFxuICAgICAgfTtcbiAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICAgIGRlYnVnQ29udGV4dDogbm9ybWFsaXplRGVidWdDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICAvLyBVcGRhdGUgY3VycmVudEVudHJ5LmxvY2F0aW9uIHRvIHJlZmxlY3QgbmV3IHNlYXJjaCBkaXJlY3RseSAoaGlzdG9yeS5zZXQgdHJpZ2dlcnMgYXN5bmMgc3Vic2NyaWJlcilcbiAgICAgIGN1cnJlbnRFbnRyeSA9IHtcbiAgICAgICAgLi4uY3VycmVudEVudHJ5LFxuICAgICAgICBsb2NhdGlvbjogeyAuLi5jdXJyZW50RW50cnkubG9jYXRpb24sIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCB9LFxuICAgICAgICByYXdTZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIG5vdGlmeUVudHJ5KGN1cnJlbnRFbnRyeSk7XG4gIGVtaXRFdmVudCh7XG4gICAga2luZDogJ3NuYXBzaG90JyxcbiAgICBzb3VyY2U6IGxhc3ROYXZpZ2F0aW9uT3JpZ2luLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oY3VycmVudEVudHJ5LmxvY2F0aW9uKSxcbiAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGN1cnJlbnRFbnRyeSksXG4gIH0pO1xuXG4gIC8vIE1haW50YWluIGEgc2V0IG9mIHN1YnNjcmliZXJzIHRvIHRoZSBhY3RpdmUgcm91dGUgZW50cnlcbiAgbGV0IG5leHRJZCA9IDA7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IE1hcDxudW1iZXIsIFN1YnNjcmliZUNhbGxiYWNrPGFueT4+KCk7XG5cbiAgLy8gTGlzdGVuIGZvciBsb2NhdGlvbiBjaGFuZ2VzLCBtYXRjaCB0byB0aGUgcm91dGUgZW50cnksIHByZXBhcmUgdGhlIGVudHJ5LFxuICAvLyBhbmQgbm90aWZ5IHN1YnNjcmliZXJzLiBUaGlzIHBhdHRlcm4gZW5zdXJlcyB0aGF0IGRhdGEtbG9hZGluZ1xuICAvLyBvY2N1cnMgKm91dHNpZGUqIG9mIC0gYW5kICpiZWZvcmUqIC0gcmVuZGVyaW5nLlxuICBjb25zdCBkaXNwb3NlSGlzdG9yeSA9IGhpc3Rvcnkuc3Vic2NyaWJlKFxuICAgIChsb2NhdGlvbiwgZm9yY2VSZXJlbmRlciwgZGVidWdDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW4gPSByZXNvbHZlTmF2aWdhdGlvbk9yaWdpbihkZWJ1Z0NvbnRleHQpO1xuICAgICAgbGFzdE5hdmlnYXRpb25PcmlnaW4gPSBvcmlnaW47XG4gICAgICBjb25zdCBsb2NhdGlvblBheWxvYWQgPSBub3JtYWxpemVMb2NhdGlvbihsb2NhdGlvbik7XG5cbiAgICAgIGNvbnN0IGRlYnVnQ29udGV4dE9yaWdpbiA9IGRlYnVnQ29udGV4dD8ub3JpZ2luO1xuICAgICAgaWYgKGRlYnVnQ29udGV4dE9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBoaXN0b3J5RGV0YWlsczogeyBoaXN0b3J5SW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIGRlYnVnQ29udGV4dD8uaGlzdG9yeUluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGhpc3RvcnlEZXRhaWxzID0geyBoaXN0b3J5SW5kZXg6IGRlYnVnQ29udGV4dC5oaXN0b3J5SW5kZXggfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS1iYWNrJyB8fFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWZvcndhcmQnIHx8XG4gICAgICAgICAgZGVidWdDb250ZXh0T3JpZ2luID09PSAncG9wc3RhdGUtdW5rbm93bicgfHxcbiAgICAgICAgICBkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdleHRlcm5hbCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IGRpcmVjdGlvbjogJ2JhY2snIHwgJ2ZvcndhcmQnIHwgJ3Vua25vd24nID0gJ3Vua25vd24nO1xuICAgICAgICAgIGlmIChkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS1iYWNrJykge1xuICAgICAgICAgICAgZGlyZWN0aW9uID0gJ2JhY2snO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGVidWdDb250ZXh0T3JpZ2luID09PSAncG9wc3RhdGUtZm9yd2FyZCcpIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9ICdmb3J3YXJkJztcbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdEV2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdwb3BzdGF0ZScsXG4gICAgICAgICAgICBzb3VyY2U6IG9yaWdpbixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblBheWxvYWQsXG4gICAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgICBkZXRhaWxzOiBoaXN0b3J5RGV0YWlscyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgY29uc3Qgc2FtZVNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaCA9PT0gY3VycmVudEVudHJ5LnJhd1NlYXJjaDtcblxuICAgICAgaWYgKCFmb3JjZVJlcmVuZGVyICYmIHNhbWVQYXRobmFtZSAmJiBzYW1lU2VhcmNoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgICAgLy8gS2VlcCB0aGUgZXhpc3RpbmcgcHJlcGFyZWRNYXRjaCB3aGVuIHBhdGhuYW1lIGlzIGlkZW50aWNhbCB0byBhdm9pZCByZWR1bmRhbnQgd29yay5cbiAgICAgIGxldCBuZXh0UHJlcGFyZWRNYXRjaCA9IGN1cnJlbnRFbnRyeS5wcmVwYXJlZE1hdGNoO1xuICAgICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgICAgaWYgKCFzYW1lUGF0aG5hbWUpIHtcbiAgICAgICAgbmV4dFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIGxvY2F0aW9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gQnVpbGQgcmF3IHF1ZXJ5IG9iamVjdCAoYmFzaWMgYWdncmVnYXRpb24pIGZyb20gbG9jYXRpb24uc2VhcmNoXG4gICAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkobG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIC8vIERldGVybWluZSBzY2hlbWEgZnJvbSBkZWVwZXN0IG1hdGNoZWQgcm91dGVcbiAgICAgIGxldCBxdWVyeVNjaGVtYTogYW55O1xuICAgICAgaWYgKG5leHRSb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBuZXh0Um91dGUucm91dGUucm91dGVzLmF0KC0xKSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBxdWVyeVNjaGVtYT86IHVua25vd247XG4gICAgICAgIH0gfCBudWxsO1xuICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7XG4gICAgICAgICAgcXVlcnlTY2hlbWEgPSBsYXN0LnF1ZXJ5U2NoZW1hO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBQYXJzZSB1bmlmaWVkIGZpbHRlcnNcbiAgICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBmaWx0ZXJEaWFnbm9zdGljczogYW55W10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAocXVlcnlTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwYXJzZWRGID0gcGFyc2VGaWx0ZXJzKGxvY2F0aW9uLnNlYXJjaCwgcXVlcnlTY2hlbWEpO1xuICAgICAgICBmaWx0ZXJzID0gcGFyc2VkRi5maWx0ZXJzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGZpbHRlckRpYWdub3N0aWNzID0gcGFyc2VkRi5kaWFnbm9zdGljcyBhcyB1bmtub3duW107XG4gICAgICB9XG4gICAgICAvLyBOb3JtYWxpemF0aW9uOiBjbGFtcCBwYWdlID49IDEgaWYgbnVtZXJpYyBwYWdlIHByZXNlbnRcbiAgICAgIGxldCBub3JtYWxpemVkID0gZmFsc2U7XG4gICAgICBsZXQgcGc6IHVua25vd247XG4gICAgICBpZiAoZmlsdGVycyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gZmlsdGVycztcbiAgICAgICAgY29uc3QgbWF5YmUgPSBmLnBhZ2U7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtYXliZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIG1heWJlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KG1heWJlKSAmJlxuICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXliZSwgJ2VxJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgcGcgPSAobWF5YmUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBnID0gbWF5YmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcGcgPT09ICdudW1iZXInICYmIHBnIDwgMSkge1xuICAgICAgICBjb25zdCBjbG9uZSA9IHsgLi4uKGZpbHRlcnMgYXMgUmVjb3JkPHN0cmluZywgYW55PiksIHBhZ2U6IHsgZXE6IDEgfSB9O1xuICAgICAgICBmaWx0ZXJzID0gY2xvbmU7XG4gICAgICAgIG5vcm1hbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCAoc2FtZSBwYXRobmFtZSkgd2Ugc3RpbGwgbmVlZCB0byByZS1ydW4gcHJlcGFyZVxuICAgICAgaWYgKCFzYW1lUGF0aG5hbWUgfHwgIXNhbWVTZWFyY2gpIHtcbiAgICAgICAgbGV0IHVwZGF0ZUluc3RydW1lbnRhdGlvbjpcbiAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4gdm9pZDtcbiAgICAgICAgICAgICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICAgICAgICAgICAgICBsb2NhdGlvbjogUm91dGVyTG9jYXRpb25TbmFwc2hvdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG5leHRSb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgdXBkYXRlSW5zdHJ1bWVudGF0aW9uID0ge1xuICAgICAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBlbWl0RXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luLFxuICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgICAgICAgIG5leHRSb3V0ZSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdXBkYXRlSW5zdHJ1bWVudGF0aW9uLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICAgICAgZm9yY2VSZXJlbmRlcjogZm9yY2VSZXJlbmRlciB8fCAoc2FtZVBhdGhuYW1lICYmICFzYW1lU2VhcmNoKSxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgIHByZXBhcmVkTWF0Y2g6IG5leHRQcmVwYXJlZE1hdGNoLFxuICAgICAgICByYXdTZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGZpbHRlcnMsXG4gICAgICAgIGZpbHRlckRpYWdub3N0aWNzLFxuICAgICAgICBhY3RpdmVRdWVyeVNjaGVtYTogcXVlcnlTY2hlbWEsXG4gICAgICB9O1xuXG4gICAgICAvLyBJZiBub3JtYWxpemF0aW9uIGNoYW5nZWQgdGhlIHR5cGVkIHF1ZXJ5IHdlIHRyaWdnZXIgYSByZXBsYWNlIHdpdGggbm9ybWFsaXplZCBzZWFyY2hcbiAgICAgIGlmIChub3JtYWxpemVkICYmIHF1ZXJ5U2NoZW1hICE9IG51bGwpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgcXVlcnlTY2hlbWEsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm9ybWFsaXplZFNlYXJjaCAhPT0gbG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgICAgbGV0IG5leHRTZWFyY2hTdHIgPSBub3JtYWxpemVkU2VhcmNoO1xuICAgICAgICAgIGlmICghbmV4dFNlYXJjaFN0ci5zdGFydHNXaXRoKCc/JykgJiYgbmV4dFNlYXJjaFN0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuZXh0U2VhcmNoU3RyID0gYD8ke25leHRTZWFyY2hTdHJ9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdEhpc3RvcnlFdmVudChcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICAgICAgc2VhcmNoOiBuZXh0U2VhcmNoU3RyLFxuICAgICAgICAgICAgICBoYXNoOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHJlYXNvbjogJ3J1bnRpbWUtcGFnZS1jbGFtcCcgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJ1bnRpbWVOb3JtYWxpemVDb250ZXh0OiBIaXN0b3J5RGVidWdDb250ZXh0ID0ge1xuICAgICAgICAgICAgb3JpZ2luOiAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIHRyaWdnZXI6ICdub3JtYWxpemUnLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgICAgc2VhcmNoOiBuZXh0U2VhcmNoU3RyLFxuICAgICAgICAgICAgaGFzaDogJycsXG4gICAgICAgICAgICBkZWJ1Z0NvbnRleHQ6IHJ1bnRpbWVOb3JtYWxpemVDb250ZXh0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjsgLy8gZWFybHk6IHN1YnNlcXVlbnQgc2V0IHdpbGwgdHJpZ2dlciByZXJ1blxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBjdXJyZW50IGVudHJ5IGFuZCBub3RpZnkgYWxsIHN1YnNjcmliZXJzXG4gICAgICBjdXJyZW50RW50cnkgPSBuZXh0RW50cnk7XG4gICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICBjYWxsYmFjayhuZXh0RW50cnkpO1xuICAgICAgfSk7XG4gICAgICBub3RpZnlFbnRyeShuZXh0RW50cnkpO1xuICAgICAgZW1pdEV2ZW50KHtcbiAgICAgICAga2luZDogJ3NuYXBzaG90JyxcbiAgICAgICAgc291cmNlOiBvcmlnaW4sXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgcm91dGVQYXRoOiByZWFkTWF0Y2hlZFJvdXRlUGF0aChuZXh0RW50cnkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgKTtcblxuICAvKiogTm9ybWFsaXplcyB1c2VyLXByb3ZpZGVkIHByZWxvYWQgdGFyZ2V0cyBpbnRvIGNvbnNpc3RlbnQgc3RydWN0dXJlcy4gKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUHJlbG9hZFRhcmdldCh0YXJnZXQ6IFByZWxvYWRUYXJnZXQpOiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g6IHN0cmluZztcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gIH0ge1xuICAgIGxldCBub3JtYWxpemVkUGF0aG5hbWUgPSBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0LnBhdGhuYW1lID09PSAnc3RyaW5nJyAmJiB0YXJnZXQucGF0aG5hbWUubGVuZ3RoID4gMCkge1xuICAgICAgbm9ybWFsaXplZFBhdGhuYW1lID0gdGFyZ2V0LnBhdGhuYW1lO1xuICAgIH1cblxuICAgIGxldCBub3JtYWxpemVkU2VhcmNoID0gJyc7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQuc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgbm9ybWFsaXplZFNlYXJjaCA9IHRhcmdldC5zZWFyY2g7XG4gICAgfVxuXG4gICAgbGV0IG5vcm1hbGl6ZWRTb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgPSAncHJvZ3JhbW1hdGljJztcbiAgICBjb25zdCBtYXBwZWRTb3VyY2UgPSBtYXBPcmlnaW4odGFyZ2V0LnNvdXJjZSk7XG4gICAgaWYgKG1hcHBlZFNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBub3JtYWxpemVkU291cmNlID0gbWFwcGVkU291cmNlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRobmFtZSxcbiAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgIHNvdXJjZTogbm9ybWFsaXplZFNvdXJjZSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgY29uc3QgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT4gJlxuICAgIFByZXBhcmVkQWNjZXNzPEFueVJvdXRlW10+ICYge1xuICAgICAgbmF2aWdhdGU6IE5hdmlnYXRlT3ZlcmxvYWRzPEFueVJvdXRlW10+O1xuICAgIH0gPSB7XG4gICAgaGlzdG9yeSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5O1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUodGFyZ2V0KSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUHJlbG9hZFRhcmdldCh0YXJnZXQpO1xuICAgICAgZW1pdFByZWxvYWRFdmVudCgnY29kZScsIG5vcm1hbGl6ZWQucGF0aG5hbWUsIG5vcm1hbGl6ZWQuc291cmNlKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi5oaXN0b3J5LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZTogbm9ybWFsaXplZC5wYXRobmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobWF0Y2hlcyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbWF0Y2hlcy5yb3V0ZS5yb3V0ZXMuZm9yRWFjaCgoeyByZXNvdXJjZVBhZ2UgfSkgPT4ge1xuICAgICAgICBpZiAocmVzb3VyY2VQYWdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICByZXNvdXJjZVBhZ2UubG9hZCgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwcmVsb2FkKHRhcmdldCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVByZWxvYWRUYXJnZXQodGFyZ2V0KTtcbiAgICAgIGVtaXRQcmVsb2FkRXZlbnQoJ2Z1bGwnLCBub3JtYWxpemVkLnBhdGhuYW1lLCBub3JtYWxpemVkLnNvdXJjZSk7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4uaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvY2F0aW9uU25hcHNob3Q6IFJvdXRlckxvY2F0aW9uU25hcHNob3QgPSB7XG4gICAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgICBoYXNoOiAnJyxcbiAgICAgIH07XG4gICAgICBsZXQgaW5zdHJ1bWVudGF0aW9uOlxuICAgICAgICB8IHtcbiAgICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHZvaWQ7XG4gICAgICAgICAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gICAgICAgICAgICBsb2NhdGlvbjogUm91dGVyTG9jYXRpb25TbmFwc2hvdDtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG1hdGNoZXMgIT0gbnVsbCkge1xuICAgICAgICBpbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4ge1xuICAgICAgICAgICAgZW1pdEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvdXJjZTogbm9ybWFsaXplZC5zb3VyY2UsXG4gICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uU25hcHNob3QsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBwcmVwYXJlTWF0Y2gobWF0Y2hlcywgdW5kZWZpbmVkLCBpbnN0cnVtZW50YXRpb24pO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICBuZXh0SWQgKz0gMTtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkO1xuICAgICAgLyoqIFJlbW92ZXMgdGhlIHN1YnNjcmliZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHZpYSBzdWJzY3JpYmUuICovXG4gICAgICBmdW5jdGlvbiBkaXNwb3NlQ2FsbGJhY2soKSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVycy5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBkaXNwb3NlQ2FsbGJhY2s7XG4gICAgfSxcbiAgICBuYXZpZ2F0ZSh7IHBhdGhuYW1lLCBxdWVyeSwgZmlsdGVyczogbmF2RmlsdGVycywgcmVwbGFjZSB9OiBhbnkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBjdXJyZW50RW50cnk7XG4gICAgICBsZXQgdGFyZ2V0UGF0aG5hbWUgPSBwYXRobmFtZTtcbiAgICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRhcmdldFBhdGhuYW1lID0gY3VycmVudC5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGRlc3RTY2hlbWE6IGFueTtcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uUm91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi5oaXN0b3J5LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxhc3RSb3V0ZSA9IGRlc3RpbmF0aW9uUm91dGU/LnJvdXRlLnJvdXRlcy5hdCgtMSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBxdWVyeVNjaGVtYT86IHVua25vd247XG4gICAgICAgICAgfVxuICAgICAgICB8IG51bGxcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAobGFzdFJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgZGVzdFNjaGVtYSA9IGxhc3RSb3V0ZS5xdWVyeVNjaGVtYTtcbiAgICAgIH1cbiAgICAgIGRlc3RTY2hlbWEgPz89IGN1cnJlbnQuYWN0aXZlUXVlcnlTY2hlbWE7XG5cbiAgICAgIGNvbnN0IHR5cGVkTmF2RmlsdGVycyA9IG5hdkZpbHRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJzID0gdHlwZWROYXZGaWx0ZXJzID8/IGN1cnJlbnQuZmlsdGVycztcbiAgICAgIGNvbnN0IGZpbHRlcnNJbnB1dCA9XG4gICAgICAgIGVmZmVjdGl2ZUZpbHRlcnMgPz8gKHF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgICBmaWx0ZXJzOiBmaWx0ZXJzSW5wdXQsXG4gICAgICAgIHF1ZXJ5U2NoZW1hOiBkZXN0U2NoZW1hLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHsgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgICBjb25zdCBvcmlnaW46IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgPSAncHJvZ3JhbW1hdGljJztcbiAgICAgIGNvbnN0IGRlYnVnQ29udGV4dDogSGlzdG9yeURlYnVnQ29udGV4dCA9IHtcbiAgICAgICAgb3JpZ2luLFxuICAgICAgICB0cmlnZ2VyOiAncHJvZ3JhbW1hdGljJyxcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZXBsYWNlID09PSB0cnVlKSB7XG4gICAgICAgIGVtaXRIaXN0b3J5RXZlbnQoJ3JlcGxhY2UnLCBvcmlnaW4sIGxvY2F0aW9uT2JqLCB7XG4gICAgICAgICAgdHJpZ2dlcjogJ3Byb2dyYW1tYXRpYycsXG4gICAgICAgIH0pO1xuICAgICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgICAgLi4ubG9jYXRpb25PYmosXG4gICAgICAgICAgZGVidWdDb250ZXh0LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVtaXRIaXN0b3J5RXZlbnQoJ3B1c2gnLCBvcmlnaW4sIGxvY2F0aW9uT2JqLCB7XG4gICAgICAgICAgdHJpZ2dlcjogJ3Byb2dyYW1tYXRpYycsXG4gICAgICAgIH0pO1xuICAgICAgICBoaXN0b3J5LnB1c2goe1xuICAgICAgICAgIC4uLmxvY2F0aW9uT2JqLFxuICAgICAgICAgIGRlYnVnQ29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRQcmVwYXJlZChwYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IGN1cnJlbnRFbnRyeTtcbiAgICAgICAgZm9yIChjb25zdCBwcmVwYXJlZFJvdXRlIG9mIGVudHJ5LnByZXBhcmVkTWF0Y2gucm91dGVzKSB7XG4gICAgICAgICAgaWYgKHByZXBhcmVkUm91dGUucGF0aCA9PT0gcGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXBhcmVkUm91dGUucHJlcGFyZWQgYXMgYW55O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICAvKiogUmVsZWFzZXMgcm91dGVyIHJlc291cmNlcyBhbmQgZGV0YWNoZXMgYWxsIGluc3RydW1lbnRhdGlvbnMuICovXG4gIGZ1bmN0aW9uIGNsZWFudXAoKTogdm9pZCB7XG4gICAgZGlzcG9zZUhpc3RvcnkoKTtcbiAgICBzdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIHJlZ2lzdHJ5LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIFJldHVybiBib3RoIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgYSBjbGVhbnVwIGZ1bmN0aW9uXG4gIHJldHVybiB7IGNvbnRleHQsIGNsZWFudXAgfTtcbn1cbiJdfQ==
|