@plumile/router 0.1.178 → 0.1.181
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/README.md +2 -2
- package/lib/esm/ResourcePage.d.ts +3 -1
- package/lib/esm/ResourcePage.d.ts.map +1 -1
- package/lib/esm/ResourcePage.js +7 -1
- package/lib/esm/builder.d.ts +3 -2
- package/lib/esm/builder.d.ts.map +1 -1
- package/lib/esm/builder.js +78 -15
- package/lib/esm/instrumentation/Instrumentation.d.ts +14 -2
- package/lib/esm/instrumentation/Instrumentation.d.ts.map +1 -1
- package/lib/esm/instrumentation/Instrumentation.js +1 -1
- package/lib/esm/routing/Link.d.ts +4 -2
- package/lib/esm/routing/Link.d.ts.map +1 -1
- package/lib/esm/routing/Link.js +15 -9
- package/lib/esm/routing/RouteComponentWrapper.d.ts +2 -1
- package/lib/esm/routing/RouteComponentWrapper.d.ts.map +1 -1
- package/lib/esm/routing/RouteComponentWrapper.js +3 -3
- package/lib/esm/routing/RouterRenderer.d.ts +1 -0
- package/lib/esm/routing/RouterRenderer.d.ts.map +1 -1
- package/lib/esm/routing/RouterRenderer.js +164 -37
- package/lib/esm/routing/createRouter.d.ts.map +1 -1
- package/lib/esm/routing/createRouter.js +279 -48
- package/lib/esm/routing/createStaticRouter.d.ts.map +1 -1
- package/lib/esm/routing/createStaticRouter.js +28 -1
- package/lib/esm/tools.d.ts +8 -2
- package/lib/esm/tools.d.ts.map +1 -1
- package/lib/esm/tools.js +49 -4
- package/lib/esm/types.d.ts +57 -0
- package/lib/esm/types.d.ts.map +1 -1
- package/lib/esm/types.js +1 -1
- package/lib/esm/values.d.ts +1 -1
- package/lib/esm/values.d.ts.map +1 -1
- package/lib/esm/values.js +2 -1
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/ResourcePage.d.ts +3 -1
- package/lib/types/ResourcePage.d.ts.map +1 -1
- package/lib/types/builder.d.ts +3 -2
- package/lib/types/builder.d.ts.map +1 -1
- package/lib/types/instrumentation/Instrumentation.d.ts +14 -2
- package/lib/types/instrumentation/Instrumentation.d.ts.map +1 -1
- package/lib/types/routing/Link.d.ts +4 -2
- package/lib/types/routing/Link.d.ts.map +1 -1
- package/lib/types/routing/RouteComponentWrapper.d.ts +2 -1
- package/lib/types/routing/RouteComponentWrapper.d.ts.map +1 -1
- package/lib/types/routing/RouterRenderer.d.ts +1 -0
- package/lib/types/routing/RouterRenderer.d.ts.map +1 -1
- package/lib/types/routing/createRouter.d.ts.map +1 -1
- package/lib/types/routing/createStaticRouter.d.ts.map +1 -1
- package/lib/types/tools.d.ts +8 -2
- package/lib/types/tools.d.ts.map +1 -1
- package/lib/types/types.d.ts +57 -0
- package/lib/types/types.d.ts.map +1 -1
- package/lib/types/values.d.ts +1 -1
- package/lib/types/values.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -41,6 +41,9 @@ export default function createRouter(routes, options = {}) {
|
|
|
41
41
|
let lastNavigationOrigin = 'external';
|
|
42
42
|
let lastPreloadSignature = null;
|
|
43
43
|
let routerDisposed = false;
|
|
44
|
+
let activeEntryId = 0;
|
|
45
|
+
let loadStateVersion = 0;
|
|
46
|
+
const preloadedMatches = new Map();
|
|
44
47
|
function normalizeLocation(location) {
|
|
45
48
|
let pathnameValue = '';
|
|
46
49
|
if (typeof location.pathname === 'string') {
|
|
@@ -181,14 +184,90 @@ export default function createRouter(routes, options = {}) {
|
|
|
181
184
|
}
|
|
182
185
|
return state.query;
|
|
183
186
|
}
|
|
187
|
+
function isPendingStatus(status) {
|
|
188
|
+
return status === 'pending';
|
|
189
|
+
}
|
|
190
|
+
function isRejectedStatus(status) {
|
|
191
|
+
return status === 'rejected';
|
|
192
|
+
}
|
|
193
|
+
function deriveSegmentStatus(input) {
|
|
194
|
+
if (isPendingStatus(input.prepareStatus) ||
|
|
195
|
+
isPendingStatus(input.codeStatus)) {
|
|
196
|
+
return 'pending';
|
|
197
|
+
}
|
|
198
|
+
if (isRejectedStatus(input.prepareStatus) ||
|
|
199
|
+
isRejectedStatus(input.codeStatus)) {
|
|
200
|
+
return 'rejected';
|
|
201
|
+
}
|
|
202
|
+
return 'resolved';
|
|
203
|
+
}
|
|
204
|
+
function calculateLoadState(entry, version) {
|
|
205
|
+
const segments = entry.preparedMatch.segments.map((segment) => {
|
|
206
|
+
const prepareStatus = segment.preparedResource?.getStatus() ?? 'idle';
|
|
207
|
+
const codeStatus = segment.resourcePage?.getStatus() ?? 'idle';
|
|
208
|
+
const status = deriveSegmentStatus({ prepareStatus, codeStatus });
|
|
209
|
+
return {
|
|
210
|
+
path: segment.path,
|
|
211
|
+
fullPath: segment.fullPath,
|
|
212
|
+
segmentIndex: segment.segmentIndex,
|
|
213
|
+
prepareStatus,
|
|
214
|
+
codeStatus,
|
|
215
|
+
status,
|
|
216
|
+
};
|
|
217
|
+
});
|
|
218
|
+
const pendingCount = segments.filter((segment) => {
|
|
219
|
+
return segment.status === 'pending';
|
|
220
|
+
}).length;
|
|
221
|
+
const rejectedCount = segments.filter((segment) => {
|
|
222
|
+
return segment.status === 'rejected';
|
|
223
|
+
}).length;
|
|
224
|
+
let status = 'resolved';
|
|
225
|
+
if (pendingCount > 0) {
|
|
226
|
+
status = 'pending';
|
|
227
|
+
}
|
|
228
|
+
else if (rejectedCount > 0) {
|
|
229
|
+
status = 'rejected';
|
|
230
|
+
}
|
|
231
|
+
const activeLoadState = {
|
|
232
|
+
status,
|
|
233
|
+
pendingCount,
|
|
234
|
+
rejectedCount,
|
|
235
|
+
version,
|
|
236
|
+
};
|
|
237
|
+
return {
|
|
238
|
+
activeLoadState,
|
|
239
|
+
loadState: {
|
|
240
|
+
...activeLoadState,
|
|
241
|
+
segments,
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function withLoadState(entry) {
|
|
246
|
+
const { activeLoadState, loadState } = calculateLoadState(entry, loadStateVersion);
|
|
247
|
+
return {
|
|
248
|
+
...entry,
|
|
249
|
+
activeLoadState,
|
|
250
|
+
loadState,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
function isSameActiveLoadState(current, next) {
|
|
254
|
+
return (current.status === next.status &&
|
|
255
|
+
current.pendingCount === next.pendingCount &&
|
|
256
|
+
current.rejectedCount === next.rejectedCount);
|
|
257
|
+
}
|
|
184
258
|
function buildEntrySnapshot(entry) {
|
|
185
259
|
const preparedSegments = entry.preparedMatch.segments.map((segment) => {
|
|
186
260
|
return {
|
|
187
261
|
path: segment.path,
|
|
188
262
|
fullPath: segment.fullPath,
|
|
263
|
+
segmentKey: segment.segmentKey,
|
|
264
|
+
paramNames: segment.paramNames,
|
|
189
265
|
segmentIndex: segment.segmentIndex,
|
|
266
|
+
routeNode: segment.routeNode,
|
|
190
267
|
preparedResource: segment.preparedResource,
|
|
191
268
|
redirectTo: segment.redirectTo,
|
|
269
|
+
suspenseBoundary: segment.suspenseBoundary,
|
|
270
|
+
fallback: segment.fallback,
|
|
192
271
|
highlightId: segment.highlightId,
|
|
193
272
|
querySchema: segment.querySchema,
|
|
194
273
|
preparedStatus: segment.preparedResource?.getStatus(),
|
|
@@ -201,6 +280,8 @@ export default function createRouter(routes, options = {}) {
|
|
|
201
280
|
segments: preparedSegments,
|
|
202
281
|
routes: preparedSegments,
|
|
203
282
|
},
|
|
283
|
+
activeLoadState: entry.activeLoadState,
|
|
284
|
+
loadState: entry.loadState,
|
|
204
285
|
filters: entry.filters,
|
|
205
286
|
filterDiagnostics: entry.filterDiagnostics,
|
|
206
287
|
activeQuerySchema: entry.activeQuerySchema,
|
|
@@ -209,12 +290,48 @@ export default function createRouter(routes, options = {}) {
|
|
|
209
290
|
function notifyEntry(entry) {
|
|
210
291
|
registry.notifyEntryChange(buildEntrySnapshot(entry));
|
|
211
292
|
}
|
|
212
|
-
function buildPreloadKey(mode, pathname) {
|
|
213
|
-
return `${mode}:${pathname}`;
|
|
293
|
+
function buildPreloadKey(mode, pathname, search = '') {
|
|
294
|
+
return `${mode}:${pathname}${search}`;
|
|
295
|
+
}
|
|
296
|
+
function buildPreloadedMatchKey(pathname, search = '') {
|
|
297
|
+
return `${pathname}${search}`;
|
|
214
298
|
}
|
|
215
|
-
function
|
|
299
|
+
function isParamValueEqual(left, right) {
|
|
300
|
+
if (Array.isArray(left) || Array.isArray(right)) {
|
|
301
|
+
if (!Array.isArray(left) || !Array.isArray(right)) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
if (left.length !== right.length) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
return left.every((value, index) => {
|
|
308
|
+
return value === right[index];
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
return left === right;
|
|
312
|
+
}
|
|
313
|
+
function areMatchedRoutesEquivalent(left, right) {
|
|
314
|
+
if (left === right) {
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
317
|
+
if (left == null || right == null) {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
if (left.route !== right.route) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
const leftEntries = Object.entries(left.params);
|
|
324
|
+
const rightKeys = new Set(Object.keys(right.params));
|
|
325
|
+
if (leftEntries.length !== rightKeys.size) {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
return leftEntries.every(([key, value]) => {
|
|
329
|
+
return rightKeys.has(key) && isParamValueEqual(value, right.params[key]);
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
function emitPreloadEvent(mode, pathname, search, source) {
|
|
216
333
|
const now = Date.now();
|
|
217
|
-
const key = buildPreloadKey(mode, pathname);
|
|
334
|
+
const key = buildPreloadKey(mode, pathname, search);
|
|
218
335
|
const recentlyRecorded = lastPreloadSignature !== null &&
|
|
219
336
|
lastPreloadSignature.key === key &&
|
|
220
337
|
now - lastPreloadSignature.timestamp < 50;
|
|
@@ -241,6 +358,28 @@ export default function createRouter(routes, options = {}) {
|
|
|
241
358
|
details,
|
|
242
359
|
});
|
|
243
360
|
}
|
|
361
|
+
function loadPreparedMatchResources(preparedMatchToLoad) {
|
|
362
|
+
preparedMatchToLoad.segments.forEach((route) => {
|
|
363
|
+
if (route.preparedResource != null) {
|
|
364
|
+
route.preparedResource.load();
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
function consumePreloadedMatch(input) {
|
|
369
|
+
const key = buildPreloadedMatchKey(input.pathname, input.search);
|
|
370
|
+
const cached = preloadedMatches.get(key);
|
|
371
|
+
if (cached == null) {
|
|
372
|
+
return undefined;
|
|
373
|
+
}
|
|
374
|
+
preloadedMatches.delete(key);
|
|
375
|
+
if (cached.context !== input.context ||
|
|
376
|
+
!areMatchedRoutesEquivalent(cached.route, input.route) ||
|
|
377
|
+
cached.querySchema !== input.querySchema ||
|
|
378
|
+
cached.search !== input.search) {
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
return cached.preparedMatch;
|
|
382
|
+
}
|
|
244
383
|
const flatRoutes = buildRoutes(routes);
|
|
245
384
|
const route = getMatchedRoute(flatRoutes, history.location);
|
|
246
385
|
const initialUnifiedSchema = readActiveQuerySchema(route);
|
|
@@ -262,7 +401,9 @@ export default function createRouter(routes, options = {}) {
|
|
|
262
401
|
...initialSearchState,
|
|
263
402
|
filters: normalizedInitialFilters.filters,
|
|
264
403
|
}, initialUnifiedSchema), initialInstrumentation, initialContext);
|
|
265
|
-
let
|
|
404
|
+
let nextId = 0;
|
|
405
|
+
const subscribers = new Map();
|
|
406
|
+
let currentEntry = withLoadState({
|
|
266
407
|
forceRerender: false,
|
|
267
408
|
location: history.location,
|
|
268
409
|
route,
|
|
@@ -273,7 +414,7 @@ export default function createRouter(routes, options = {}) {
|
|
|
273
414
|
filters: normalizedInitialFilters.filters,
|
|
274
415
|
filterDiagnostics: initialSearchState.filterDiagnostics,
|
|
275
416
|
activeQuerySchema: initialUnifiedSchema,
|
|
276
|
-
};
|
|
417
|
+
});
|
|
277
418
|
if (normalizedInitialFilters.normalized &&
|
|
278
419
|
initialUnifiedSchema != null &&
|
|
279
420
|
normalizedInitialFilters.filters != null) {
|
|
@@ -299,23 +440,89 @@ export default function createRouter(routes, options = {}) {
|
|
|
299
440
|
hash: '',
|
|
300
441
|
debugContext: normalizeDebugContext,
|
|
301
442
|
});
|
|
302
|
-
currentEntry = {
|
|
443
|
+
currentEntry = withLoadState({
|
|
303
444
|
...currentEntry,
|
|
304
445
|
location: { ...currentEntry.location, search: normalizedSearch },
|
|
305
446
|
rawSearch: normalizedSearch,
|
|
306
|
-
};
|
|
447
|
+
});
|
|
307
448
|
}
|
|
308
449
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
450
|
+
function emitActiveLoadStateEvent(entry, source) {
|
|
451
|
+
emitEvent({
|
|
452
|
+
kind: 'active-load-state',
|
|
453
|
+
source,
|
|
454
|
+
timestamp: Date.now(),
|
|
455
|
+
location: normalizeLocation(entry.location),
|
|
456
|
+
routePath: readMatchedRoutePath(entry),
|
|
457
|
+
status: entry.activeLoadState.status,
|
|
458
|
+
pendingCount: entry.activeLoadState.pendingCount,
|
|
459
|
+
rejectedCount: entry.activeLoadState.rejectedCount,
|
|
460
|
+
version: entry.activeLoadState.version,
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
function notifySubscribers(entry) {
|
|
464
|
+
subscribers.forEach((callback) => {
|
|
465
|
+
callback(entry);
|
|
466
|
+
});
|
|
467
|
+
notifyEntry(entry);
|
|
468
|
+
}
|
|
469
|
+
function refreshActiveLoadState(entryId, source) {
|
|
470
|
+
if (routerDisposed || entryId !== activeEntryId) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
const next = calculateLoadState(currentEntry, loadStateVersion);
|
|
474
|
+
if (isSameActiveLoadState(currentEntry.activeLoadState, next.activeLoadState)) {
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
loadStateVersion += 1;
|
|
478
|
+
const refreshed = calculateLoadState(currentEntry, loadStateVersion);
|
|
479
|
+
currentEntry = {
|
|
480
|
+
...currentEntry,
|
|
481
|
+
activeLoadState: refreshed.activeLoadState,
|
|
482
|
+
loadState: refreshed.loadState,
|
|
483
|
+
};
|
|
484
|
+
notifySubscribers(currentEntry);
|
|
485
|
+
emitActiveLoadStateEvent(currentEntry, source);
|
|
486
|
+
}
|
|
487
|
+
function observeActiveEntryLoad(entry, entryId, source) {
|
|
488
|
+
entry.preparedMatch.segments.forEach((segment) => {
|
|
489
|
+
if (segment.preparedResource?.getStatus() === 'pending') {
|
|
490
|
+
segment.preparedResource.load().then(() => {
|
|
491
|
+
refreshActiveLoadState(entryId, source);
|
|
492
|
+
}, () => {
|
|
493
|
+
refreshActiveLoadState(entryId, source);
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
if (segment.resourcePage?.getStatus() === 'pending') {
|
|
497
|
+
segment.resourcePage.load().then(() => {
|
|
498
|
+
refreshActiveLoadState(entryId, source);
|
|
499
|
+
}, () => {
|
|
500
|
+
refreshActiveLoadState(entryId, source);
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
function publishEntry(input) {
|
|
506
|
+
activeEntryId += 1;
|
|
507
|
+
currentEntry = input.entry;
|
|
508
|
+
notifySubscribers(input.entry);
|
|
509
|
+
emitActiveLoadStateEvent(input.entry, input.source);
|
|
510
|
+
if (input.emitSnapshot) {
|
|
511
|
+
emitEvent({
|
|
512
|
+
kind: 'snapshot',
|
|
513
|
+
source: input.source,
|
|
514
|
+
timestamp: Date.now(),
|
|
515
|
+
location: normalizeLocation(input.entry.location),
|
|
516
|
+
routePath: readMatchedRoutePath(input.entry),
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
observeActiveEntryLoad(input.entry, activeEntryId, input.source);
|
|
520
|
+
}
|
|
521
|
+
publishEntry({
|
|
522
|
+
entry: currentEntry,
|
|
312
523
|
source: lastNavigationOrigin,
|
|
313
|
-
|
|
314
|
-
location: normalizeLocation(currentEntry.location),
|
|
315
|
-
routePath: readMatchedRoutePath(currentEntry),
|
|
524
|
+
emitSnapshot: true,
|
|
316
525
|
});
|
|
317
|
-
let nextId = 0;
|
|
318
|
-
const subscribers = new Map();
|
|
319
526
|
const disposeHistory = history.subscribe((location, forceRerender, debugContext) => {
|
|
320
527
|
const origin = resolveNavigationOrigin(debugContext);
|
|
321
528
|
lastNavigationOrigin = origin;
|
|
@@ -367,22 +574,43 @@ export default function createRouter(routes, options = {}) {
|
|
|
367
574
|
route: nextRoute,
|
|
368
575
|
});
|
|
369
576
|
if (shouldReprepare) {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
577
|
+
const preloadedMatch = consumePreloadedMatch({
|
|
578
|
+
pathname: location.pathname,
|
|
579
|
+
search: location.search,
|
|
580
|
+
context: nextContext,
|
|
581
|
+
route: nextRoute,
|
|
582
|
+
querySchema,
|
|
583
|
+
});
|
|
584
|
+
if (preloadedMatch != null) {
|
|
585
|
+
nextPreparedMatch = preloadedMatch;
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
let updateInstrumentation;
|
|
589
|
+
if (nextRoute != null) {
|
|
590
|
+
updateInstrumentation = {
|
|
591
|
+
emit: (event) => {
|
|
592
|
+
emitEvent(event);
|
|
593
|
+
},
|
|
594
|
+
source: origin,
|
|
595
|
+
location: locationPayload,
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
let reusePreparedSegments;
|
|
599
|
+
if (!samePathname) {
|
|
600
|
+
reusePreparedSegments = {
|
|
601
|
+
previousSegments: currentEntry.preparedMatch.segments,
|
|
602
|
+
previousParams: currentEntry.route?.params,
|
|
603
|
+
sameSearch,
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
nextPreparedMatch = prepareMatch(nextRoute, buildPrepareQueryInput({
|
|
607
|
+
...parsedSearchState,
|
|
608
|
+
filters: normalizedFilters.filters,
|
|
609
|
+
}, querySchema), updateInstrumentation, nextContext, reusePreparedSegments);
|
|
379
610
|
}
|
|
380
|
-
nextPreparedMatch = prepareMatch(nextRoute, buildPrepareQueryInput({
|
|
381
|
-
...parsedSearchState,
|
|
382
|
-
filters: normalizedFilters.filters,
|
|
383
|
-
}, querySchema), updateInstrumentation, nextContext);
|
|
384
611
|
}
|
|
385
|
-
|
|
612
|
+
loadStateVersion += 1;
|
|
613
|
+
const nextEntry = withLoadState({
|
|
386
614
|
forceRerender: forceRerender || (samePathname && !sameSearch),
|
|
387
615
|
location,
|
|
388
616
|
route: nextRoute,
|
|
@@ -393,7 +621,7 @@ export default function createRouter(routes, options = {}) {
|
|
|
393
621
|
filters: normalizedFilters.filters,
|
|
394
622
|
filterDiagnostics: parsedSearchState.filterDiagnostics,
|
|
395
623
|
activeQuerySchema: querySchema,
|
|
396
|
-
};
|
|
624
|
+
});
|
|
397
625
|
if (normalizedFilters.normalized && querySchema != null) {
|
|
398
626
|
const normalizedSearch = buildCombinedSearch({
|
|
399
627
|
filters: normalizedFilters.filters,
|
|
@@ -423,17 +651,10 @@ export default function createRouter(routes, options = {}) {
|
|
|
423
651
|
return;
|
|
424
652
|
}
|
|
425
653
|
}
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
callback(nextEntry);
|
|
429
|
-
});
|
|
430
|
-
notifyEntry(nextEntry);
|
|
431
|
-
emitEvent({
|
|
432
|
-
kind: 'snapshot',
|
|
654
|
+
publishEntry({
|
|
655
|
+
entry: nextEntry,
|
|
433
656
|
source: origin,
|
|
434
|
-
|
|
435
|
-
location: locationPayload,
|
|
436
|
-
routePath: readMatchedRoutePath(nextEntry),
|
|
657
|
+
emitSnapshot: true,
|
|
437
658
|
});
|
|
438
659
|
});
|
|
439
660
|
function normalizePreloadTarget(target) {
|
|
@@ -479,10 +700,15 @@ export default function createRouter(routes, options = {}) {
|
|
|
479
700
|
return {
|
|
480
701
|
path: preparedRoute.path,
|
|
481
702
|
fullPath: preparedRoute.fullPath,
|
|
703
|
+
segmentKey: preparedRoute.segmentKey,
|
|
704
|
+
paramNames: preparedRoute.paramNames,
|
|
482
705
|
segmentIndex: preparedRoute.segmentIndex,
|
|
706
|
+
routeNode: preparedRoute.routeNode,
|
|
483
707
|
preparedResource: preparedRoute.preparedResource,
|
|
484
708
|
redirectTo: preparedRoute.redirectTo,
|
|
485
709
|
resourcePage: preparedRoute.resourcePage,
|
|
710
|
+
suspenseBoundary: preparedRoute.suspenseBoundary,
|
|
711
|
+
fallback: preparedRoute.fallback,
|
|
486
712
|
highlightId: preparedRoute.highlightId,
|
|
487
713
|
querySchema: preparedRoute.querySchema,
|
|
488
714
|
};
|
|
@@ -495,7 +721,7 @@ export default function createRouter(routes, options = {}) {
|
|
|
495
721
|
},
|
|
496
722
|
preloadCode(target) {
|
|
497
723
|
const normalized = normalizePreloadTarget(target);
|
|
498
|
-
emitPreloadEvent('code', normalized.pathname, normalized.source);
|
|
724
|
+
emitPreloadEvent('code', normalized.pathname, normalized.search, normalized.source);
|
|
499
725
|
const matches = getMatchedRoute(flatRoutes, {
|
|
500
726
|
...history.location,
|
|
501
727
|
pathname: normalized.pathname,
|
|
@@ -512,7 +738,7 @@ export default function createRouter(routes, options = {}) {
|
|
|
512
738
|
},
|
|
513
739
|
preload(target) {
|
|
514
740
|
const normalized = normalizePreloadTarget(target);
|
|
515
|
-
emitPreloadEvent('full', normalized.pathname, normalized.source);
|
|
741
|
+
emitPreloadEvent('full', normalized.pathname, normalized.search, normalized.source);
|
|
516
742
|
const matches = getMatchedRoute(flatRoutes, {
|
|
517
743
|
...history.location,
|
|
518
744
|
pathname: normalized.pathname,
|
|
@@ -536,10 +762,15 @@ export default function createRouter(routes, options = {}) {
|
|
|
536
762
|
const preloadQuerySchema = readActiveQuerySchema(matches);
|
|
537
763
|
const preloadSearchState = parseSearchState(normalized.search, preloadQuerySchema);
|
|
538
764
|
const preparedMatch = prepareMatch(matches, buildPrepareQueryInput(preloadSearchState, preloadQuerySchema), instrumentation, preloadContext);
|
|
539
|
-
preparedMatch
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
765
|
+
loadPreparedMatchResources(preparedMatch);
|
|
766
|
+
const preloadKey = buildPreloadedMatchKey(normalized.pathname, normalized.search);
|
|
767
|
+
preloadedMatches.set(preloadKey, {
|
|
768
|
+
key: preloadKey,
|
|
769
|
+
context: preloadContext,
|
|
770
|
+
route: matches,
|
|
771
|
+
preparedMatch,
|
|
772
|
+
querySchema: preloadQuerySchema,
|
|
773
|
+
search: normalized.search,
|
|
543
774
|
});
|
|
544
775
|
},
|
|
545
776
|
subscribe(callback) {
|
|
@@ -627,4 +858,4 @@ export default function createRouter(routes, options = {}) {
|
|
|
627
858
|
}
|
|
628
859
|
return { context, cleanup };
|
|
629
860
|
}
|
|
630
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLG1CQUFtQixNQUFNLGlDQUFpQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFnQm5FLE9BQU8sRUFDTCw2QkFBNkIsR0FNOUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsd0JBQXdCLEdBR3pCLE1BQU0sY0FBYyxDQUFDO0FBa0J0QixTQUFTLHlCQUF5QixDQUFDLEtBSWxDO0lBQ0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLHFCQUFxQixLQUFLLE1BQU0sQ0FBQztJQUN6RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUEwRUQsTUFBTSxDQUFDLE9BQU8sVUFBVSxZQUFZLENBSWxDLE1BQTJCLEVBQzNCLFVBQXlDLEVBQUU7SUFHM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUVyQyxNQUFNLFFBQVEsR0FBRyw2QkFBNkIsQ0FDNUMsT0FBTyxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FDL0IsQ0FBQztJQUVGLElBQUksYUFBbUMsQ0FBQztJQUN4QyxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDMUMsYUFBYSxHQUFJLE9BQU8sQ0FBQyxPQUEwQixFQUFFLENBQUM7UUFDeEQsQ0FBQzthQUFNLENBQUM7WUFDTixhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUdELFNBQVMsY0FBYztRQUNyQixJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7WUFDL0IsT0FBTyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sYUFBeUIsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSx1QkFBMkQsQ0FBQztJQUNoRSxJQUFJLG9CQUFvQixHQUEyQixVQUFVLENBQUM7SUFDOUQsSUFBSSxvQkFBb0IsR0FHYixJQUFJLENBQUM7SUFDaEIsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBSzNCLFNBQVMsaUJBQWlCLENBQUMsUUFJMUI7UUFDQyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxPQUFPLFFBQVEsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDMUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksT0FBTyxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzVCLENBQUM7UUFDRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsTUFBTSxFQUFFLFdBQVc7WUFDbkIsSUFBSSxFQUFFLFNBQVM7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFHRCxTQUFTLFNBQVMsQ0FBQyxLQUFrQjtRQUNuQyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDVCxDQUFDO1FBQ0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBS0QsU0FBUyxTQUFTLENBQUMsR0FBWTtRQUM3QixJQUFJLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFTLGdCQUFnQixDQUFDLENBQUM7SUFHMUQsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO1FBQ3RDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLEtBQWdDLENBQUM7UUFDaEQsS0FBSyxNQUFNLFVBQVUsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0MsSUFDRSxVQUFVLElBQUksSUFBSTtnQkFDbEIsT0FBTyxVQUFVLEtBQUssUUFBUTtnQkFDOUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUMxQixDQUFDO2dCQUNELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUMxQyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDN0IsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFNRCxTQUFTLHVCQUF1QixDQUM5QixPQUFvQztRQUVwQyxNQUFNLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQztRQUMvQyxJQUFJLE1BQTBDLENBQUM7UUFFL0MsTUFBTSxhQUFhLEdBQUcsT0FBTyxFQUFFLE1BQU0sQ0FBQztRQUN0QyxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxNQUFNLEtBQUssY0FBYyxDQUFDO1FBQzFCLE1BQU0sS0FBSyxVQUFVLENBQUM7UUFDdEIsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFNRCxTQUFTLG9CQUFvQixDQUMzQixLQUE2QztRQUU3QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUNqQyxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMxQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDOUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixNQUFNLGVBQWUsR0FBRyxTQUFvQyxDQUFDO2dCQUM3RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO2dCQUN2QyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUNsQyxPQUFPLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDekMsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUdELFNBQVMscUJBQXFCLENBQzVCLEtBQTBDO1FBRTFDLE9BQU8sS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ2pELENBQUM7SUFHRCxTQUFTLGdCQUFnQixDQUN2QixNQUFjLEVBQ2QsV0FBOEI7UUFFOUIsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNqRCxPQUFPO1lBQ0wsS0FBSztZQUNMLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixpQkFBaUIsRUFBRSxNQUFNLENBQUMsV0FBVztTQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUdELFNBQVMsYUFBYSxDQUFDLE9BQXdCO1FBQzdDLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3BCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzdCLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELElBQ0UsT0FBTyxJQUFJLElBQUk7WUFDZixPQUFPLE9BQU8sS0FBSyxRQUFRO1lBQzNCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDdkIsT0FBUSxPQUE0QixDQUFDLEVBQUUsS0FBSyxRQUFRLEVBQ3BELENBQUM7WUFDRCxPQUFRLE9BQTBCLENBQUMsRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBR0QsU0FBUyxvQkFBb0IsQ0FBQyxPQUF3QjtRQUlwRCxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzNELE9BQU87Z0JBQ0wsT0FBTztnQkFDUCxVQUFVLEVBQUUsS0FBSzthQUNsQixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1AsR0FBRyxPQUFPO2dCQUNWLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7YUFDaEI7WUFDRCxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDO0lBQ0osQ0FBQztJQUdELFNBQVMsc0JBQXNCLENBQzdCLEtBQXdCLEVBQ3hCLFdBQThCO1FBRTlCLElBQUksV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLE9BQU8sS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBR0QsU0FBUyxrQkFBa0IsQ0FDekIsS0FBaUM7UUFFakMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNwRSxPQUFPO2dCQUNMLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO2dCQUMxQixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7Z0JBQ2xDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7Z0JBQzFDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtnQkFDOUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO2dCQUNoQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQ2hDLGNBQWMsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFO2FBQ3RELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxRQUFRLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUMzQyxTQUFTLEVBQUUsb0JBQW9CLENBQUMsS0FBSyxDQUFDO1lBQ3RDLGFBQWEsRUFBRTtnQkFDYixRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixNQUFNLEVBQUUsZ0JBQWdCO2FBQ3pCO1lBQ0QsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUI7WUFDMUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjtTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUdELFNBQVMsV0FBVyxDQUFDLEtBQWlDO1FBQ3BELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFHRCxTQUFTLGVBQWUsQ0FDdEIsSUFBNEIsRUFDNUIsUUFBZ0I7UUFFaEIsT0FBTyxHQUFHLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBR0QsU0FBUyxnQkFBZ0IsQ0FDdkIsSUFBcUIsRUFDckIsUUFBZ0IsRUFDaEIsTUFBOEI7UUFFOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUMsTUFBTSxnQkFBZ0IsR0FDcEIsb0JBQW9CLEtBQUssSUFBSTtZQUM3QixvQkFBb0IsQ0FBQyxHQUFHLEtBQUssR0FBRztZQUNoQyxHQUFHLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUU1QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN0QixTQUFTLENBQUM7Z0JBQ1IsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsTUFBTTtnQkFDTixTQUFTLEVBQUUsR0FBRztnQkFDZCxRQUFRLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDN0MsY0FBYyxFQUFFLFFBQVE7Z0JBQ3hCLElBQUk7YUFDTCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsb0JBQW9CLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFHRCxTQUFTLGdCQUFnQixDQUN2QixNQUFnQyxFQUNoQyxNQUE4QixFQUM5QixRQUE4RCxFQUM5RCxPQUFpQztRQUVqQyx1QkFBdUIsR0FBRyxNQUFNLENBQUM7UUFDakMsU0FBUyxDQUFDO1lBQ1IsSUFBSSxFQUFFLFNBQVM7WUFDZixNQUFNO1lBQ04sTUFBTTtZQUNOLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7WUFDckMsT0FBTztTQUNSLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFHdkMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUQsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUN6QyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFDdkIsb0JBQW9CLENBQ3JCLENBQUM7SUFDRixNQUFNLHdCQUF3QixHQUFHLG9CQUFvQixDQUNuRCxrQkFBa0IsQ0FBQyxPQUFPLENBQzNCLENBQUM7SUFDRixNQUFNLHVCQUF1QixHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRSxJQUFJLHNCQU1TLENBQUM7SUFDZCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixzQkFBc0IsR0FBRztZQUN2QixJQUFJLEVBQUUsQ0FBQyxLQUFrQixFQUFFLEVBQUU7Z0JBQzNCLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsTUFBTSxFQUFFLG9CQUFvQjtZQUM1QixRQUFRLEVBQUUsdUJBQXVCO1NBQ2xDLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxjQUFjLEdBQUcsY0FBYyxFQUFFLENBQUM7SUFDeEMsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUNoQyxLQUFLLEVBQ0wsc0JBQXNCLENBQ3BCO1FBQ0UsR0FBRyxrQkFBa0I7UUFDckIsT0FBTyxFQUFFLHdCQUF3QixDQUFDLE9BQU87S0FDMUMsRUFDRCxvQkFBb0IsQ0FDckIsRUFDRCxzQkFBc0IsRUFDdEIsY0FBYyxDQUNmLENBQUM7SUFFRixJQUFJLFlBQVksR0FBK0I7UUFDN0MsYUFBYSxFQUFFLEtBQUs7UUFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLEtBQUs7UUFDTCxhQUFhO1FBQ2IsT0FBTyxFQUFFLGNBQWM7UUFDdkIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtRQUNsQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsS0FBSztRQUUvQixPQUFPLEVBQUUsd0JBQXdCLENBQUMsT0FBTztRQUN6QyxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxpQkFBaUI7UUFDdkQsaUJBQWlCLEVBQUUsb0JBQW9CO0tBQ3hDLENBQUM7SUFHRixJQUNFLHdCQUF3QixDQUFDLFVBQVU7UUFDbkMsb0JBQW9CLElBQUksSUFBSTtRQUM1Qix3QkFBd0IsQ0FBQyxPQUFPLElBQUksSUFBSSxFQUN4QyxDQUFDO1FBQ0QsWUFBWSxDQUFDLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyxPQUFPLENBQUM7UUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQztZQUMzQyxPQUFPLEVBQUUsd0JBQXdCLENBQUMsT0FBTztZQUN6QyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsS0FBSztZQUMvQixXQUFXLEVBQUUsb0JBQW9CO1NBQ2xDLENBQUMsQ0FBQztRQUNILElBQUksZ0JBQWdCLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRCxnQkFBZ0IsQ0FDZCxXQUFXLEVBQ1gsV0FBVyxFQUNYO2dCQUNFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVE7Z0JBQ25DLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLElBQUksRUFBRSxFQUFFO2FBQ1QsRUFDRCxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxDQUNqQyxDQUFDO1lBQ0YsTUFBTSxxQkFBcUIsR0FBd0I7Z0JBQ2pELE1BQU0sRUFBRSxXQUFXO2dCQUNuQixPQUFPLEVBQUUsV0FBVzthQUNyQixDQUFDO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDVixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRO2dCQUNuQyxNQUFNLEVBQUUsZ0JBQWdCO2dCQUN4QixJQUFJLEVBQUUsRUFBRTtnQkFDUixZQUFZLEVBQUUscUJBQXFCO2FBQ3BDLENBQUMsQ0FBQztZQUVILFlBQVksR0FBRztnQkFDYixHQUFHLFlBQVk7Z0JBQ2YsUUFBUSxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRTtnQkFDaEUsU0FBUyxFQUFFLGdCQUFnQjthQUM1QixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUIsU0FBUyxDQUFDO1FBQ1IsSUFBSSxFQUFFLFVBQVU7UUFDaEIsTUFBTSxFQUFFLG9CQUFvQjtRQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNyQixRQUFRLEVBQUUsaUJBQWlCLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUNsRCxTQUFTLEVBQUUsb0JBQW9CLENBQUMsWUFBWSxDQUFDO0tBQzlDLENBQUMsQ0FBQztJQUdILElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUd4QixDQUFDO0lBS0osTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FDdEMsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxFQUFFO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JELG9CQUFvQixHQUFHLE1BQU0sQ0FBQztRQUM5QixNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVwRCxNQUFNLGtCQUFrQixHQUFHLFlBQVksRUFBRSxNQUFNLENBQUM7UUFDaEQsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLGNBQW9ELENBQUM7WUFDekQsSUFBSSxPQUFPLFlBQVksRUFBRSxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ25ELGNBQWMsR0FBRyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDL0QsQ0FBQztZQUVELElBQ0Usa0JBQWtCLEtBQUssZUFBZTtnQkFDdEMsa0JBQWtCLEtBQUssa0JBQWtCO2dCQUN6QyxrQkFBa0IsS0FBSyxrQkFBa0I7Z0JBQ3pDLGtCQUFrQixLQUFLLFVBQVUsRUFDakMsQ0FBQztnQkFDRCxJQUFJLFNBQVMsR0FBbUMsU0FBUyxDQUFDO2dCQUMxRCxJQUFJLGtCQUFrQixLQUFLLGVBQWUsRUFBRSxDQUFDO29CQUMzQyxTQUFTLEdBQUcsTUFBTSxDQUFDO2dCQUNyQixDQUFDO3FCQUFNLElBQUksa0JBQWtCLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztvQkFDckQsU0FBUyxHQUFHLFNBQVMsQ0FBQztnQkFDeEIsQ0FBQztnQkFDRCxTQUFTLENBQUM7b0JBQ1IsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLE1BQU0sRUFBRSxNQUFNO29CQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNyQixRQUFRLEVBQUUsZUFBZTtvQkFDekIsU0FBUztvQkFDVCxPQUFPLEVBQUUsY0FBYztpQkFDeEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsUUFBUSxLQUFLLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQzFFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUU5RCxJQUFJLENBQUMsYUFBYSxJQUFJLFlBQVksSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUVqRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBSXJDLElBQUksaUJBQWlCLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQztRQUNuRCxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBRW5DLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixTQUFTLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBR0QsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFMUUsTUFBTSxlQUFlLEdBQUcseUJBQXlCLENBQUM7WUFDaEQsWUFBWTtZQUNaLFVBQVU7WUFDVixLQUFLLEVBQUUsU0FBUztTQUNqQixDQUFDLENBQUM7UUFFSCxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLElBQUkscUJBTVMsQ0FBQztZQUNkLElBQUksU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN0QixxQkFBcUIsR0FBRztvQkFDdEIsSUFBSSxFQUFFLENBQUMsS0FBa0IsRUFBRSxFQUFFO3dCQUMzQixTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ25CLENBQUM7b0JBQ0QsTUFBTSxFQUFFLE1BQU07b0JBQ2QsUUFBUSxFQUFFLGVBQWU7aUJBQzFCLENBQUM7WUFDSixDQUFDO1lBQ0QsaUJBQWlCLEdBQUcsWUFBWSxDQUM5QixTQUFTLEVBQ1Qsc0JBQXNCLENBQ3BCO2dCQUNFLEdBQUcsaUJBQWlCO2dCQUNwQixPQUFPLEVBQUUsaUJBQWlCLENBQUMsT0FBTzthQUNuQyxFQUNELFdBQVcsQ0FDWixFQUNELHFCQUFxQixFQUNyQixXQUFXLENBQ1osQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBK0I7WUFDNUMsYUFBYSxFQUFFLGFBQWEsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM3RCxRQUFRO1lBQ1IsS0FBSyxFQUFFLFNBQVM7WUFDaEIsYUFBYSxFQUFFLGlCQUFpQjtZQUNoQyxPQUFPLEVBQUUsV0FBVztZQUNwQixTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDMUIsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUs7WUFDOUIsT0FBTyxFQUFFLGlCQUFpQixDQUFDLE9BQU87WUFDbEMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCO1lBQ3RELGlCQUFpQixFQUFFLFdBQVc7U0FDL0IsQ0FBQztRQUdGLElBQUksaUJBQWlCLENBQUMsVUFBVSxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4RCxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO2dCQUMzQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsT0FBTztnQkFDbEMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUs7Z0JBQzlCLFdBQVc7YUFDWixDQUFDLENBQUM7WUFDSCxJQUFJLGdCQUFnQixLQUFLLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQy9ELGFBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUN0QyxDQUFDO2dCQUNELGdCQUFnQixDQUNkLFdBQVcsRUFDWCxXQUFXLEVBQ1g7b0JBQ0UsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO29CQUMzQixNQUFNLEVBQUUsYUFBYTtvQkFDckIsSUFBSSxFQUFFLEVBQUU7aUJBQ1QsRUFDRCxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxDQUNqQyxDQUFDO2dCQUNGLE1BQU0sdUJBQXVCLEdBQXdCO29CQUNuRCxNQUFNLEVBQUUsV0FBVztvQkFDbkIsT0FBTyxFQUFFLFdBQVc7aUJBQ3JCLENBQUM7Z0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQztvQkFDVixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7b0JBQzNCLE1BQU0sRUFBRSxhQUFhO29CQUNyQixJQUFJLEVBQUUsRUFBRTtvQkFDUixZQUFZLEVBQUUsdUJBQXVCO2lCQUN0QyxDQUFDLENBQUM7Z0JBQ0gsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBR0QsWUFBWSxHQUFHLFNBQVMsQ0FBQztRQUN6QixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDL0IsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZCLFNBQVMsQ0FBQztZQUNSLElBQUksRUFBRSxVQUFVO1lBQ2hCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsUUFBUSxFQUFFLGVBQWU7WUFDekIsU0FBUyxFQUFFLG9CQUFvQixDQUFDLFNBQVMsQ0FBQztTQUMzQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQ0YsQ0FBQztJQUdGLFNBQVMsc0JBQXNCLENBQUMsTUFBcUI7UUFLbkQsSUFBSSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNuRCxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN2QyxDQUFDO1FBRUQsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxDQUFDO1FBRUQsSUFBSSxnQkFBZ0IsR0FBMkIsY0FBYyxDQUFDO1FBQzlELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLE1BQU0sRUFBRSxnQkFBZ0I7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFPRCxTQUFTLFdBQVcsQ0FBQyxJQUFZO1FBQy9CLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQztZQUMzQixLQUFLLE1BQU0sYUFBYSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3pELElBQUksYUFBYSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksYUFBYSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDbkUsT0FBTyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQy9DLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBT0QsU0FBUyxtQkFBbUIsQ0FBQyxJQUFZO1FBQ3ZDLE9BQU8sWUFBWSxDQUFDLGFBQWEsQ0FBQyxRQUFRO2FBQ3ZDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3hCLE9BQU8sYUFBYSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksYUFBYSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7UUFDeEUsQ0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDckIsT0FBTztnQkFDTCxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7Z0JBQ3hCLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtnQkFDaEMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxZQUFZO2dCQUN4QyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsZ0JBQWdCO2dCQUNoRCxVQUFVLEVBQUUsYUFBYSxDQUFDLFVBQVU7Z0JBQ3BDLFlBQVksRUFBRSxhQUFhLENBQUMsWUFBWTtnQkFDeEMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxXQUFXO2dCQUN0QyxXQUFXLEVBQUUsYUFBYSxDQUFDLFdBQVc7YUFDdkMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUdELE1BQU0sT0FBTyxHQUFHO1FBQ2QsT0FBTztRQUNQLEdBQUc7WUFDRCxPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBQ0QsV0FBVyxDQUFDLE1BQU07WUFDaEIsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEQsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUU7Z0JBQzFDLEdBQUcsT0FBTyxDQUFDLFFBQVE7Z0JBQ25CLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTthQUM5QixDQUFDLENBQUM7WUFFSCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDcEIsT0FBTztZQUNULENBQUM7WUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7Z0JBQ2hELElBQUksWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUN6QixPQUFPO2dCQUNULENBQUM7Z0JBRUQsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sQ0FBQyxNQUFNO1lBQ1osTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEQsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUU7Z0JBQzFDLEdBQUcsT0FBTyxDQUFDLFFBQVE7Z0JBQ25CLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTthQUM5QixDQUFDLENBQUM7WUFDSCxNQUFNLGdCQUFnQixHQUEyQjtnQkFDL0MsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO2dCQUM3QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07Z0JBQ3pCLElBQUksRUFBRSxFQUFFO2FBQ1QsQ0FBQztZQUNGLElBQUksZUFNUyxDQUFDO1lBQ2QsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLGVBQWUsR0FBRztvQkFDaEIsSUFBSSxFQUFFLENBQUMsS0FBa0IsRUFBRSxFQUFFO3dCQUMzQixTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ25CLENBQUM7b0JBQ0QsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO29CQUN6QixRQUFRLEVBQUUsZ0JBQWdCO2lCQUMzQixDQUFDO1lBQ0osQ0FBQztZQUNELE1BQU0sY0FBYyxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sa0JBQWtCLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FDekMsVUFBVSxDQUFDLE1BQU0sRUFDakIsa0JBQWtCLENBQ25CLENBQUM7WUFDRixNQUFNLGFBQWEsR0FBRyxZQUFZLENBQ2hDLE9BQU8sRUFDUCxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxFQUM5RCxlQUFlLEVBQ2YsY0FBYyxDQUNmLENBQUM7WUFDRixhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2QyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFFbkMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNoQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsU0FBUyxDQUFDLFFBQVE7WUFDaEIsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUNaLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztZQUVsQixTQUFTLGVBQWU7Z0JBQ3RCLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUNELFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sZUFBZSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxRQUFRLENBQUMsRUFDUCxRQUFRLEVBQ1IsS0FBSyxFQUNMLE9BQU8sRUFBRSxVQUFVLEVBQ25CLE9BQU8sR0FNUjtZQUNDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQztZQUM3QixJQUFJLGNBQWMsR0FBRyxRQUFRLENBQUM7WUFDOUIsY0FBYyxLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBRTdDLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRTtnQkFDbkQsR0FBRyxPQUFPLENBQUMsUUFBUTtnQkFDbkIsUUFBUSxFQUFFLGNBQWM7YUFDekIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxVQUFVLEdBQUcscUJBQXFCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6RCxVQUFVLEdBQUcsVUFBVSxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztZQUVyRCxNQUFNLFNBQVMsR0FBRyxVQUFVLElBQUksSUFBSSxDQUFDO1lBQ3JDLE1BQU0saUJBQWlCLEdBQ3JCLFVBQVUsSUFBSSxJQUFJO2dCQUNsQixTQUFTO2dCQUNULEtBQUssSUFBSSxJQUFJO2dCQUNiLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksWUFBWSxHQUFHLFVBQVUsQ0FBQztZQUM5QixJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO29CQUN0QixZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7Z0JBQ2pDLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxhQUF1RCxDQUFDO1lBQzVELElBQUksaUJBQWlCLEVBQUUsQ0FBQztnQkFDdEIsYUFBYSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDaEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGFBQWEsR0FBRyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN6QyxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUM7Z0JBQ2pDLE9BQU8sRUFBRSxZQUFZO2dCQUNyQixLQUFLLEVBQUUsYUFBYTtnQkFDcEIsV0FBVyxFQUFFLFVBQVU7YUFDeEIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDbkUsTUFBTSxNQUFNLEdBQTJCLGNBQWMsQ0FBQztZQUN0RCxNQUFNLFlBQVksR0FBd0I7Z0JBQ3hDLE1BQU07Z0JBQ04sT0FBTyxFQUFFLGNBQWM7YUFDeEIsQ0FBQztZQUVGLElBQUksT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQixnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtvQkFDL0MsT0FBTyxFQUFFLGNBQWM7aUJBQ3hCLENBQUMsQ0FBQztnQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDO29CQUNWLEdBQUcsV0FBVztvQkFDZCxZQUFZO2lCQUNiLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDTixnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRTtvQkFDNUMsT0FBTyxFQUFFLGNBQWM7aUJBQ3hCLENBQUMsQ0FBQztnQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUNYLEdBQUcsV0FBVztvQkFDZCxZQUFZO2lCQUNiLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQ0QsV0FBVztRQUNYLG1CQUFtQjtLQUMwQixDQUFDO0lBR2hELFNBQVMsT0FBTztRQUNkLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFDRCxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFHRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBidWlsZFJvdXRlcyB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgQnJvd3Nlckhpc3RvcnkgfSBmcm9tICcuLi9oaXN0b3J5L2luZGV4LmpzJztcbmltcG9ydCB7IGdldE1hdGNoZWRSb3V0ZSwgcHJlcGFyZU1hdGNoIH0gZnJvbSAnLi4vdG9vbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VSYXdRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LmpzJztcbmltcG9ydCBidWlsZENvbWJpbmVkU2VhcmNoIGZyb20gJy4uL3Rvb2xzL2J1aWxkQ29tYmluZWRTZWFyY2guanMnO1xuaW1wb3J0IHsgdHlwZSBEaWFnbm9zdGljIGFzIEZpbHRlckRpYWdub3N0aWMgfSBmcm9tICdAcGx1bWlsZS9maWx0ZXItcXVlcnkvZXJyb3JzLmpzJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlRmlsdGVycyB9IGZyb20gJ0BwbHVtaWxlL2ZpbHRlci1xdWVyeS9wYXJzZS5qcyc7XG5pbXBvcnQgeyB0eXBlIFNjaGVtYSBhcyBGaWx0ZXJTY2hlbWEgfSBmcm9tICdAcGx1bWlsZS9maWx0ZXItcXVlcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgRklMVEVSX09QRVJBVE9SUyB9IGZyb20gJ0BwbHVtaWxlL2ZpbHRlci1xdWVyeS92YWx1ZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXJhbURhdGEgfSBmcm9tICdwYXRoLXRvLXJlZ2V4cCc7XG5pbXBvcnQge1xuICB0eXBlIFJvdXRlRW50cnksXG4gIHR5cGUgUm91dGluZ0NvbnRleHRUeXBlLFxuICB0eXBlIFN1YnNjcmliZUNhbGxiYWNrLFxuICB0eXBlIEFueVJvdXRlLFxuICB0eXBlIFByZXBhcmVkQWNjZXNzLFxuICB0eXBlIE5hdmlnYXRlT3ZlcmxvYWRzLFxuICB0eXBlIFByZWxvYWRUYXJnZXQsXG4gIHR5cGUgUHJlcGFyZWRSb3V0ZVNlZ21lbnRTbmFwc2hvdCxcbiAgdHlwZSBSYXdRdWVyeSxcbiAgdHlwZSBSb3V0ZXJNYXRjaGVkUm91dGUsXG4gIHR5cGUgVW5rbm93bkZpbHRlcnMsXG4gIHR5cGUgVW5rbm93blF1ZXJ5U2hhcGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LFxuICB0eXBlIEluc3RydW1lbnRhdGlvbkFQSSxcbiAgdHlwZSBSb3V0ZXJFbnRyeVNuYXBzaG90LFxuICB0eXBlIFJvdXRlckxvY2F0aW9uU25hcHNob3QsXG4gIHR5cGUgUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgdHlwZSBSb3V0ZXJFdmVudCxcbn0gZnJvbSAnLi4vaW5zdHJ1bWVudGF0aW9uL0luc3RydW1lbnRhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEhpc3RvcnlEZWJ1Z0NvbnRleHQgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGlzUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgdHlwZSBSb3V0ZXJIaXN0b3J5QWN0aW9uVmFsdWUsXG4gIHR5cGUgUm91dGVyUHJlbG9hZE1vZGVWYWx1ZSxcbn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcblxudHlwZSBSb3V0ZXJRdWVyeVNjaGVtYSA9IEZpbHRlclNjaGVtYSB8IHVuZGVmaW5lZDtcbnR5cGUgUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4gPSBSb3V0ZUVudHJ5PFxuICBQYXJhbURhdGEsXG4gIFJvdXRlclF1ZXJ5U2NoZW1hLFxuICBUQ29udGV4dFxuPjtcbnR5cGUgUGFyc2VkU2VhcmNoU3RhdGUgPSB7XG4gIHF1ZXJ5OiBSYXdRdWVyeTtcbiAgZmlsdGVycz86IFVua25vd25GaWx0ZXJzO1xuICBmaWx0ZXJEaWFnbm9zdGljcz86IEZpbHRlckRpYWdub3N0aWNbXTtcbn07XG50eXBlIFByZXBhcmVRdWVyeUlucHV0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcm91dGUgcHJlcGFyZSBjYWxsYmFjayBzaG91bGQgcnVuIGFmdGVyIG5hdmlnYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFByZXBhcmVPbk5hdmlnYXRpb24oaW5wdXQ6IHtcbiAgc2FtZVBhdGhuYW1lOiBib29sZWFuO1xuICBzYW1lU2VhcmNoOiBib29sZWFuO1xuICByb3V0ZTogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsO1xufSk6IGJvb2xlYW4ge1xuICBpZiAoIWlucHV0LnNhbWVQYXRobmFtZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlucHV0LnNhbWVTZWFyY2gpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCByb3V0ZVNlZ21lbnRzID0gaW5wdXQucm91dGU/LnJvdXRlLnJvdXRlcyA/PyBbXTtcbiAgcmV0dXJuIHJvdXRlU2VnbWVudHMuc29tZSgocm91dGUpID0+IHtcbiAgICByZXR1cm4gcm91dGUucHJlcGFyZSAhPSBudWxsICYmIHJvdXRlLnByZXBhcmVTZWFyY2hCZWhhdmlvciAhPT0gJ3BhdGgnO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIGNyZWF0ZVJvdXRlciBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlUm91dGVyUmV0dXJuPFRDb250ZXh0LCBSIGV4dGVuZHMgQW55Um91dGVbXT4gPSB7XG4gIC8qKiBGdW5jdGlvbiB0byBjbGVhbiB1cCByb3V0ZXIgbGlzdGVuZXJzIGFuZCByZXNvdXJjZXMgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIFJvdXRlciBjb250ZXh0IG9iamVjdCBmb3IgdGhlIFJlYWN0IENvbnRleHQgUHJvdmlkZXIgKi9cbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPFxuICAgIFBhcmFtRGF0YSxcbiAgICBSb3V0ZXJRdWVyeVNjaGVtYSxcbiAgICBVbmtub3duUXVlcnlTaGFwZSxcbiAgICBUQ29udGV4dFxuICA+ICZcbiAgICBQcmVwYXJlZEFjY2VzczxSPiAmIHtcbiAgICAgIG5hdmlnYXRlOiBOYXZpZ2F0ZU92ZXJsb2FkczxSPjtcbiAgICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcGxldGUgcm91dGVyIHN5c3RlbSBmcm9tIHJvdXRlIGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFRoaXMgcm91dGVyIGlzIGJ1aWx0IGZyb20gdGhlIHNhbWUgcHJpbWl0aXZlcyBhcyByZWFjdC1yb3V0ZXIgYnV0IHdpdGggYWRkaXRpb25hbFxuICogZmVhdHVyZXMgZm9yIGRhdGEgcHJlbG9hZGluZyBhbmQgY29kZSBzcGxpdHRpbmcuIEVhY2ggcm91dGUgY2FuIGNvbnRhaW4gYm90aCBhXG4gKiBDb21wb25lbnQgYW5kIGEgcHJlcGFyZSgpIGZ1bmN0aW9uIHRoYXQgY2FuIHByZWxvYWQgZGF0YSBmb3IgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiBUaGUgcm91dGVyIHdhdGNoZXMgZm9yIGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gdmlhIHRoZSBIVE1MNSBIaXN0b3J5IEFQSSxcbiAqIG1hcHMgdGhlIGxvY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJvdXRlIGVudHJ5LCBhbmQgdGhlbiBwcmVsb2FkcyB0aGUgY29kZVxuICogYW5kIGRhdGEgZm9yIHRoZSByb3V0ZSBiZWZvcmUgcmVuZGVyaW5nLlxuICpcbiAqIEBwYXJhbSByb3V0ZXMgLSBBcnJheSBvZiByb3V0ZSBjb25maWd1cmF0aW9uc1xuICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJvdXRlciBjb250ZXh0IGFuZCBjbGVhbnVwIGZ1bmN0aW9uXG4gKlxuICBwcmVwYXJlZE1hdGNoOiBwcmVwYXJlTWF0Y2gocm91dGUsIHBhcnNlUmF3UXVlcnkoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gpKSxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJvdXRlcyA9IFtcbiAqICAge1xuICogICAgIHBhdGg6ICcvdXNlcnMvOmlkJyxcbiAqICAgICByZXNvdXJjZVBhZ2U6IGdldFJlc291cmNlUGFnZSgnVXNlclByb2ZpbGUnLCAoKSA9PiBpbXBvcnQoJy4vVXNlclByb2ZpbGUnKSksXG4gKiAgICAgcHJlcGFyZTogKHsgdmFyaWFibGVzIH0pID0+ICh7IHVzZXJJZDogdmFyaWFibGVzLmlkIH0pXG4gKiAgIH1cbiAqIF07XG4gKlxuICogY29uc3QgeyBjb250ZXh0LCBjbGVhbnVwIH0gPSBjcmVhdGVSb3V0ZXIocm91dGVzKTtcbiAqXG4gKiAvLyBVc2UgaW4gUmVhY3QgYXBwXG4gKiA8Um91dGluZ0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHR9PlxuICogICA8Um91dGVyUmVuZGVyZXIgZmFsbGJhY2s9ezxkaXY+TG9hZGluZy4uLjwvZGl2Pn0gLz5cbiAqIDwvUm91dGluZ0NvbnRleHQuUHJvdmlkZXI+XG4gKiBgYGBcbiAqL1xuLyoqXG4gKiBDcmVhdGUgYSByb3V0ZXIgKHR5cGVkIG92ZXJsb2FkKS4gV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0IHR1cGxlIG9mIHJvdXRlcywgZ2VuZXJpY3MgYXJlIHByZXNlcnZlZC5cbiAqL1xuLyoqXG4gKiBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciBgY3JlYXRlUm91dGVyYC5cbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlUm91dGVyT3B0aW9uczxUQ29udGV4dD4gPSB7XG4gIC8qKiBJbnN0cnVtZW50YXRpb25zIHRvIGF0dGFjaCB0byB0aGUgcm91dGVyIChEZXZUb29scyBicmlkZ2UsIGxvZ2dlciwgLi4uKS4gKi9cbiAgaW5zdHJ1bWVudGF0aW9ucz86IEluc3RydW1lbnRhdGlvbkFQSVtdO1xuICAvKiogU3RhdGljIGNvbnRleHQgdmFsdWUgb3IgbGF6eSBpbml0aWFsaXplciBmb3IgdGhlIHJvdXRlci4gKi9cbiAgY29udGV4dD86IFRDb250ZXh0IHwgKCgpID0+IFRDb250ZXh0KTtcbiAgLyoqIFJlc29sdmUgYSBmcmVzaCBjb250ZXh0IHZhbHVlIHBlciBuYXZpZ2F0aW9uLiAqL1xuICBnZXRDb250ZXh0PzogKCkgPT4gVENvbnRleHQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByb3V0ZXIgaW5zdGFuY2UgZnJvbSBhIHJvdXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIFJvdXRlIGRlZmluaXRpb25zIHRvIHJlZ2lzdGVyLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBpbnN0cnVtZW50YXRpb24gc2V0dGluZ3MgdXNlZCBmb3IgZXhwb3NpbmcgZGV2ZWxvcG1lbnQgdG9vbGluZy5cbiAqIEBwYXJhbSBvcHRpb25zLmluc3RydW1lbnRhdGlvbnMgLSBJbnN0cnVtZW50YXRpb25zIGludm9rZWQgb24gcm91dGVyIGV2ZW50cyAoZGV2ZWxvcG1lbnQgb25seSkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcjxcbiAgVENvbnRleHQgPSB1bmtub3duLFxuICBSIGV4dGVuZHMgQW55Um91dGVbXSA9IEFueVJvdXRlW10sXG4+KFxuICByb3V0ZXM6IFsuLi5SXSB8IEFueVJvdXRlW10sXG4gIG9wdGlvbnM6IENyZWF0ZVJvdXRlck9wdGlvbnM8VENvbnRleHQ+ID0ge30sXG4pOiBDcmVhdGVSb3V0ZXJSZXR1cm48VENvbnRleHQsIFI+IHtcbiAgLy8gSW5pdGlhbGl6ZSBicm93c2VyIGhpc3RvcnkgbWFuYWdlclxuICBjb25zdCBoaXN0b3J5ID0gbmV3IEJyb3dzZXJIaXN0b3J5KCk7XG5cbiAgY29uc3QgcmVnaXN0cnkgPSBjcmVhdGVJbnN0cnVtZW50YXRpb25SZWdpc3RyeShcbiAgICBvcHRpb25zLmluc3RydW1lbnRhdGlvbnMgPz8gW10sXG4gICk7XG5cbiAgbGV0IHN0YXRpY0NvbnRleHQ6IFRDb250ZXh0IHwgdW5kZWZpbmVkO1xuICBpZiAob3B0aW9ucy5nZXRDb250ZXh0ID09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhdGljQ29udGV4dCA9IChvcHRpb25zLmNvbnRleHQgYXMgKCkgPT4gVENvbnRleHQpKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRpY0NvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc29sdmUgdGhlIGNvbnRleHQgZm9yIHRoZSBjdXJyZW50IG5hdmlnYXRpb24uICovXG4gIGZ1bmN0aW9uIHJlc29sdmVDb250ZXh0KCk6IFRDb250ZXh0IHtcbiAgICBpZiAob3B0aW9ucy5nZXRDb250ZXh0ICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmdldENvbnRleHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRpY0NvbnRleHQgYXMgVENvbnRleHQ7XG4gIH1cblxuICBsZXQgcGVuZGluZ05hdmlnYXRpb25PcmlnaW46IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgfCB1bmRlZmluZWQ7XG4gIGxldCBsYXN0TmF2aWdhdGlvbk9yaWdpbjogUm91dGVyTmF2aWdhdGlvblNvdXJjZSA9ICdleHRlcm5hbCc7XG4gIGxldCBsYXN0UHJlbG9hZFNpZ25hdHVyZToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG4gIGxldCByb3V0ZXJEaXNwb3NlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHBhcnRpYWwgbG9jYXRpb24gb2JqZWN0IGludG8gYSBmdWxsIGxvY2F0aW9uIHN0cnVjdHVyZSB3aXRoIHN0cmluZyBmaWVsZHMuXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVMb2NhdGlvbihsb2NhdGlvbjoge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgc2VhcmNoPzogc3RyaW5nO1xuICAgIGhhc2g/OiBzdHJpbmc7XG4gIH0pOiB7IHBhdGhuYW1lOiBzdHJpbmc7IHNlYXJjaDogc3RyaW5nOyBoYXNoOiBzdHJpbmcgfSB7XG4gICAgbGV0IHBhdGhuYW1lVmFsdWUgPSAnJztcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uLnBhdGhuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgcGF0aG5hbWVWYWx1ZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIH1cbiAgICBsZXQgc2VhcmNoVmFsdWUgPSAnJztcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uLnNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNlYXJjaFZhbHVlID0gbG9jYXRpb24uc2VhcmNoO1xuICAgIH1cbiAgICBsZXQgaGFzaFZhbHVlID0gJyc7XG4gICAgaWYgKHR5cGVvZiBsb2NhdGlvbi5oYXNoID09PSAnc3RyaW5nJykge1xuICAgICAgaGFzaFZhbHVlID0gbG9jYXRpb24uaGFzaDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhuYW1lOiBwYXRobmFtZVZhbHVlLFxuICAgICAgc2VhcmNoOiBzZWFyY2hWYWx1ZSxcbiAgICAgIGhhc2g6IGhhc2hWYWx1ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEVtaXRzIGEgcm91dGVyIGV2ZW50IHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgaW5zdHJ1bWVudGF0aW9uLiAqL1xuICBmdW5jdGlvbiBlbWl0RXZlbnQoZXZlbnQ6IFJvdXRlckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHJvdXRlckRpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlZ2lzdHJ5LmVtaXRFdmVudChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gY29lcmNlIGFuIGFyYml0cmFyeSBzdHJpbmcgaW50byBhIGtub3duIG5hdmlnYXRpb24gc291cmNlLlxuICAgKi9cbiAgZnVuY3Rpb24gbWFwT3JpZ2luKHJhdz86IHN0cmluZyk6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgfCB1bmRlZmluZWQge1xuICAgIGlmIChpc1JvdXRlck5hdmlnYXRpb25Tb3VyY2UocmF3KSkge1xuICAgICAgcmV0dXJuIHJhdztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlck9wZXJhdG9ycyA9IG5ldyBTZXQ8c3RyaW5nPihGSUxURVJfT1BFUkFUT1JTKTtcblxuICAvKiogSGV1cmlzdGljOiBkZXRlY3QgZmlsdGVyLWxpa2Ugb2JqZWN0cyB3aGVuIGNhbGxlcnMgcGFzcyBmaWx0ZXIgcmVjb3JkcyB0byBuYXZpZ2F0ZS4gKi9cbiAgZnVuY3Rpb24gbG9va3NMaWtlRmlsdGVycyh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmVjb3JkID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBmaWVsZFZhbHVlIG9mIE9iamVjdC52YWx1ZXMocmVjb3JkKSkge1xuICAgICAgaWYgKFxuICAgICAgICBmaWVsZFZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmllbGRWYWx1ZSkpIHtcbiAgICAgICAgICBpZiAoZmlsdGVyT3BlcmF0b3JzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgb3JpZ2luIGZvciB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIGV2ZW50LlxuICAgKi9cbiAgLyoqIFJlc29sdmVzIHRoZSBuYXZpZ2F0aW9uIHNvdXJjZSBjb21iaW5pbmcgaGlzdG9yeSBjb250ZXh0IGFuZCBwZW5kaW5nIGludGVudC4gKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZU5hdmlnYXRpb25PcmlnaW4oXG4gICAgY29udGV4dD86IEhpc3RvcnlEZWJ1Z0NvbnRleHQgfCBudWxsLFxuICApOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlIHtcbiAgICBjb25zdCBmYWxsYmFja09yaWdpbiA9IHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luO1xuICAgIGxldCBvcmlnaW46IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjb250ZXh0T3JpZ2luID0gY29udGV4dD8ub3JpZ2luO1xuICAgIGlmIChjb250ZXh0T3JpZ2luICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9yaWdpbiA9IG1hcE9yaWdpbihjb250ZXh0T3JpZ2luKTtcbiAgICB9XG5cbiAgICBvcmlnaW4gPz89IGZhbGxiYWNrT3JpZ2luO1xuICAgIG9yaWdpbiA/Pz0gJ2V4dGVybmFsJztcbiAgICBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbiA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gb3JpZ2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIHRoZSBpbm5lci1tb3N0IG1hdGNoZWQgcm91dGUgcGF0aCBmcm9tIGEgcm91dGUgZW50cnkgd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICAvKiogUmV0dXJucyB0aGUgZGVlcGVzdCBtYXRjaGVkIHJvdXRlIHBhdGggZnJvbSBhIHJvdXRlIGVudHJ5IGlmIGF2YWlsYWJsZS4gKi9cbiAgZnVuY3Rpb24gcmVhZE1hdGNoZWRSb3V0ZVBhdGgoXG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+IHwgdW5kZWZpbmVkLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkUm91dGUgPSBlbnRyeS5yb3V0ZTtcbiAgICBpZiAobWF0Y2hlZFJvdXRlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZFJvdXRlcyA9IG1hdGNoZWRSb3V0ZS5yb3V0ZS5yb3V0ZXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRSb3V0ZXMpKSB7XG4gICAgICBjb25zdCBsYXN0Q2hpbGQgPSBjaGlsZFJvdXRlcy5hdCgtMSk7XG4gICAgICBpZiAobGFzdENoaWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbGFzdENoaWxkUmVjb3JkID0gbGFzdENoaWxkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBjb25zdCBjaGlsZFBhdGggPSBsYXN0Q2hpbGRSZWNvcmQucGF0aDtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZFBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkUGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByb290UGF0aCA9IG1hdGNoZWRSb3V0ZS5yb3V0ZS5wYXRoO1xuICAgIGlmICh0eXBlb2Ygcm9vdFBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcm9vdFBhdGg7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgZGVlcGVzdCBhY3RpdmUgcXVlcnkgc2NoZW1hIGZvciBhIG1hdGNoZWQgcm91dGUuICovXG4gIGZ1bmN0aW9uIHJlYWRBY3RpdmVRdWVyeVNjaGVtYShcbiAgICByb3V0ZTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD5bJ3JvdXRlJ10sXG4gICk6IFJvdXRlclF1ZXJ5U2NoZW1hIHtcbiAgICByZXR1cm4gcm91dGU/LnJvdXRlLnJvdXRlcy5hdCgtMSk/LnF1ZXJ5U2NoZW1hO1xuICB9XG5cbiAgLyoqIFBhcnNlcyByYXcgcXVlcnkgYW5kIHR5cGVkIGZpbHRlcnMgZm9yIHRoZSBwcm92aWRlZCBzZWFyY2ggc3RyaW5nLiAqL1xuICBmdW5jdGlvbiBwYXJzZVNlYXJjaFN0YXRlKFxuICAgIHNlYXJjaDogc3RyaW5nLFxuICAgIHF1ZXJ5U2NoZW1hOiBSb3V0ZXJRdWVyeVNjaGVtYSxcbiAgKTogUGFyc2VkU2VhcmNoU3RhdGUge1xuICAgIGNvbnN0IHF1ZXJ5ID0gcGFyc2VSYXdRdWVyeShzZWFyY2gpO1xuICAgIGlmIChxdWVyeVNjaGVtYSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyBxdWVyeSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmlsdGVycyhzZWFyY2gsIHF1ZXJ5U2NoZW1hKTtcbiAgICByZXR1cm4ge1xuICAgICAgcXVlcnksXG4gICAgICBmaWx0ZXJzOiBwYXJzZWQuZmlsdGVycyxcbiAgICAgIGZpbHRlckRpYWdub3N0aWNzOiBwYXJzZWQuZGlhZ25vc3RpY3MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBSZWFkcyBhIHBhZ2UgbnVtYmVyIGZyb20gZWl0aGVyIGBwYWdlYCBvciBgcGFnZS5lcWAgZmlsdGVyIHNoYXBlcy4gKi9cbiAgZnVuY3Rpb24gcmVhZFBhZ2VWYWx1ZShmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnMpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmF3UGFnZSA9IGZpbHRlcnMucGFnZTtcbiAgICBpZiAodHlwZW9mIHJhd1BhZ2UgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcmF3UGFnZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcmF3UGFnZSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgcmF3UGFnZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHJhd1BhZ2UpICYmXG4gICAgICB0eXBlb2YgKHJhd1BhZ2UgYXMgeyBlcT86IHVua25vd24gfSkuZXEgPT09ICdudW1iZXInXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHJhd1BhZ2UgYXMgeyBlcTogbnVtYmVyIH0pLmVxO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIE5vcm1hbGl6ZXMgdGhlIHBhZ2UgZmlsdGVyIHRvIGEgbWluaW11bSB2YWx1ZSBvZiAxIHdoZW4gcHJlc2VudC4gKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGFnZUZpbHRlcnMoZmlsdGVycz86IFVua25vd25GaWx0ZXJzKToge1xuICAgIGZpbHRlcnM/OiBVbmtub3duRmlsdGVycztcbiAgICBub3JtYWxpemVkOiBib29sZWFuO1xuICB9IHtcbiAgICBjb25zdCBwYWdlVmFsdWUgPSByZWFkUGFnZVZhbHVlKGZpbHRlcnMpO1xuICAgIGlmIChwYWdlVmFsdWUgPT0gbnVsbCB8fCBwYWdlVmFsdWUgPj0gMSB8fCBmaWx0ZXJzID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbHRlcnMsXG4gICAgICAgIG5vcm1hbGl6ZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyczoge1xuICAgICAgICAuLi5maWx0ZXJzLFxuICAgICAgICBwYWdlOiB7IGVxOiAxIH0sXG4gICAgICB9LFxuICAgICAgbm9ybWFsaXplZDogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIENvbnZlcnRzIHJvdXRlciBzZWFyY2ggc3RhdGUgaW50byB0aGUgb2JqZWN0IGZvcndhcmRlZCB0byBgcHJlcGFyZWAuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlcGFyZVF1ZXJ5SW5wdXQoXG4gICAgc3RhdGU6IFBhcnNlZFNlYXJjaFN0YXRlLFxuICAgIHF1ZXJ5U2NoZW1hOiBSb3V0ZXJRdWVyeVNjaGVtYSxcbiAgKTogUHJlcGFyZVF1ZXJ5SW5wdXQge1xuICAgIGlmIChxdWVyeVNjaGVtYSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gc3RhdGUuZmlsdGVycyA/PyB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLnF1ZXJ5O1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhIHNuYXBzaG90IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHJvdXRlciBlbnRyeS4gKi9cbiAgZnVuY3Rpb24gYnVpbGRFbnRyeVNuYXBzaG90KFxuICAgIGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PixcbiAgKTogUm91dGVyRW50cnlTbmFwc2hvdCB7XG4gICAgY29uc3QgcHJlcGFyZWRTZWdtZW50cyA9IGVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBzZWdtZW50LnBhdGgsXG4gICAgICAgIGZ1bGxQYXRoOiBzZWdtZW50LmZ1bGxQYXRoLFxuICAgICAgICBzZWdtZW50SW5kZXg6IHNlZ21lbnQuc2VnbWVudEluZGV4LFxuICAgICAgICBwcmVwYXJlZFJlc291cmNlOiBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2UsXG4gICAgICAgIHJlZGlyZWN0VG86IHNlZ21lbnQucmVkaXJlY3RUbyxcbiAgICAgICAgaGlnaGxpZ2h0SWQ6IHNlZ21lbnQuaGlnaGxpZ2h0SWQsXG4gICAgICAgIHF1ZXJ5U2NoZW1hOiBzZWdtZW50LnF1ZXJ5U2NoZW1hLFxuICAgICAgICBwcmVwYXJlZFN0YXR1czogc2VnbWVudC5wcmVwYXJlZFJlc291cmNlPy5nZXRTdGF0dXMoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGVudHJ5LmxvY2F0aW9uKSxcbiAgICAgIHJvdXRlUGF0aDogcmVhZE1hdGNoZWRSb3V0ZVBhdGgoZW50cnkpLFxuICAgICAgcHJlcGFyZWRNYXRjaDoge1xuICAgICAgICBzZWdtZW50czogcHJlcGFyZWRTZWdtZW50cyxcbiAgICAgICAgcm91dGVzOiBwcmVwYXJlZFNlZ21lbnRzLFxuICAgICAgfSxcbiAgICAgIGZpbHRlcnM6IGVudHJ5LmZpbHRlcnMsXG4gICAgICBmaWx0ZXJEaWFnbm9zdGljczogZW50cnkuZmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgICBhY3RpdmVRdWVyeVNjaGVtYTogZW50cnkuYWN0aXZlUXVlcnlTY2hlbWEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBOb3RpZmllcyBpbnN0cnVtZW50YXRpb25zIG9mIGEgbmV3IGFjdGl2ZSBlbnRyeS4gKi9cbiAgZnVuY3Rpb24gbm90aWZ5RW50cnkoZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+KTogdm9pZCB7XG4gICAgcmVnaXN0cnkubm90aWZ5RW50cnlDaGFuZ2UoYnVpbGRFbnRyeVNuYXBzaG90KGVudHJ5KSk7XG4gIH1cblxuICAvKiogQ3JlYXRlcyBhIGRlZHVwbGljYXRpb24ga2V5IGZvciBwcmVsb2FkIGV2ZW50cy4gKi9cbiAgZnVuY3Rpb24gYnVpbGRQcmVsb2FkS2V5KFxuICAgIG1vZGU6IFJvdXRlclByZWxvYWRNb2RlVmFsdWUsXG4gICAgcGF0aG5hbWU6IHN0cmluZyxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7bW9kZX06JHtwYXRobmFtZX1gO1xuICB9XG5cbiAgLyoqIEVtaXRzIGEgcHJlbG9hZCBvciBwcmVsb2FkLWNvZGUgaW5zdHJ1bWVudGF0aW9uIGV2ZW50LiAqL1xuICBmdW5jdGlvbiBlbWl0UHJlbG9hZEV2ZW50KFxuICAgIG1vZGU6ICdjb2RlJyB8ICdmdWxsJyxcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBrZXkgPSBidWlsZFByZWxvYWRLZXkobW9kZSwgcGF0aG5hbWUpO1xuICAgIGNvbnN0IHJlY2VudGx5UmVjb3JkZWQgPVxuICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUgIT09IG51bGwgJiZcbiAgICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlLmtleSA9PT0ga2V5ICYmXG4gICAgICBub3cgLSBsYXN0UHJlbG9hZFNpZ25hdHVyZS50aW1lc3RhbXAgPCA1MDtcblxuICAgIGlmICghcmVjZW50bHlSZWNvcmRlZCkge1xuICAgICAgZW1pdEV2ZW50KHtcbiAgICAgICAga2luZDogJ3ByZWxvYWQnLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRpbWVzdGFtcDogbm93LFxuICAgICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiksXG4gICAgICAgIHRhcmdldFBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICAgICAgbW9kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlID0geyBrZXksIHRpbWVzdGFtcDogbm93IH07XG4gIH1cblxuICAvKiogRW1pdHMgYSBoaXN0b3J5IG11dGF0aW9uIGV2ZW50IChwdXNoL3JlcGxhY2Uvbm9ybWFsaXplKS4gKi9cbiAgZnVuY3Rpb24gZW1pdEhpc3RvcnlFdmVudChcbiAgICBhY3Rpb246IFJvdXRlckhpc3RvcnlBY3Rpb25WYWx1ZSxcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICAgbG9jYXRpb246IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoPzogc3RyaW5nOyBoYXNoPzogc3RyaW5nIH0sXG4gICAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbiA9IHNvdXJjZTtcbiAgICBlbWl0RXZlbnQoe1xuICAgICAga2luZDogJ2hpc3RvcnknLFxuICAgICAgc291cmNlLFxuICAgICAgYWN0aW9uLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKSxcbiAgICAgIGRldGFpbHMsXG4gICAgfSk7XG4gIH1cblxuICAvLyBCdWlsZCBhIGZsYXQgbGlzdCBvZiByb3V0ZXMgZm9yIGVmZmljaWVudCBtYXRjaGluZ1xuICBjb25zdCBmbGF0Um91dGVzID0gYnVpbGRSb3V0ZXMocm91dGVzKTtcblxuICAvLyBGaW5kIHRoZSBpbml0aWFsIHJvdXRlIG1hdGNoIGFuZCBwcmVwYXJlIGl0IGZvciByZW5kZXJpbmdcbiAgY29uc3Qgcm91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gIGNvbnN0IGluaXRpYWxVbmlmaWVkU2NoZW1hID0gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKHJvdXRlKTtcbiAgY29uc3QgaW5pdGlhbFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShcbiAgICBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgKTtcbiAgY29uc3Qgbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzID0gbm9ybWFsaXplUGFnZUZpbHRlcnMoXG4gICAgaW5pdGlhbFNlYXJjaFN0YXRlLmZpbHRlcnMsXG4gICk7XG4gIGNvbnN0IGluaXRpYWxMb2NhdGlvblNuYXBzaG90ID0gbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbik7XG4gIGxldCBpbml0aWFsSW5zdHJ1bWVudGF0aW9uOlxuICAgIHwge1xuICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB2b2lkO1xuICAgICAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gICAgICAgIGxvY2F0aW9uOiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90O1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkO1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGluaXRpYWxJbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB7XG4gICAgICAgIGVtaXRFdmVudChldmVudCk7XG4gICAgICB9LFxuICAgICAgc291cmNlOiBsYXN0TmF2aWdhdGlvbk9yaWdpbixcbiAgICAgIGxvY2F0aW9uOiBpbml0aWFsTG9jYXRpb25TbmFwc2hvdCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IGluaXRpYWxDb250ZXh0ID0gcmVzb2x2ZUNvbnRleHQoKTtcbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChcbiAgICByb3V0ZSxcbiAgICBidWlsZFByZXBhcmVRdWVyeUlucHV0KFxuICAgICAge1xuICAgICAgICAuLi5pbml0aWFsU2VhcmNoU3RhdGUsXG4gICAgICAgIGZpbHRlcnM6IG5vcm1hbGl6ZWRJbml0aWFsRmlsdGVycy5maWx0ZXJzLFxuICAgICAgfSxcbiAgICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgICksXG4gICAgaW5pdGlhbEluc3RydW1lbnRhdGlvbixcbiAgICBpbml0aWFsQ29udGV4dCxcbiAgKTtcbiAgLy8gSGVscGVyIHRvIGJ1aWxkIHRoZSByYXcgcXVlcnkgb2JqZWN0IGZyb20gYSBzZWFyY2ggc3RyaW5nXG4gIGxldCBjdXJyZW50RW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+ID0ge1xuICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgIHJvdXRlLFxuICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgY29udGV4dDogaW5pdGlhbENvbnRleHQsXG4gICAgcmF3U2VhcmNoOiBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBxdWVyeTogaW5pdGlhbFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgIC8vIHR5cGVkUXVlcnkgcmVtb3ZlZCAodW5pZmllZCBpbnRvIGZpbHRlcnMvcXVlcnkpXG4gICAgZmlsdGVyczogbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnMsXG4gICAgZmlsdGVyRGlhZ25vc3RpY3M6IGluaXRpYWxTZWFyY2hTdGF0ZS5maWx0ZXJEaWFnbm9zdGljcyxcbiAgICBhY3RpdmVRdWVyeVNjaGVtYTogaW5pdGlhbFVuaWZpZWRTY2hlbWEsXG4gIH07XG5cbiAgLy8gSW5pdGlhbCBub3JtYWxpemF0aW9uIHBhc3MgKGUuZy4sIGNsYW1wIHBhZ2UpXG4gIGlmIChcbiAgICBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMubm9ybWFsaXplZCAmJlxuICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwgJiZcbiAgICBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyAhPSBudWxsXG4gICkge1xuICAgIGN1cnJlbnRFbnRyeS5maWx0ZXJzID0gbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnM7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgZmlsdGVyczogbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnMsXG4gICAgICBxdWVyeTogaW5pdGlhbFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgcXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIH0pOyAvLyByZXR1cm5zICcnIG9yIHN0cmluZyBzdGFydGluZyB3aXRoICc/J1xuICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgZW1pdEhpc3RvcnlFdmVudChcbiAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9LFxuICAgICAgICB7IHJlYXNvbjogJ2luaXRpYWwtcGFnZS1jbGFtcCcgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBub3JtYWxpemVEZWJ1Z0NvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgIG9yaWdpbjogJ25vcm1hbGl6ZScsXG4gICAgICAgIHRyaWdnZXI6ICdub3JtYWxpemUnLFxuICAgICAgfTtcbiAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICAgIGRlYnVnQ29udGV4dDogbm9ybWFsaXplRGVidWdDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICAvLyBVcGRhdGUgY3VycmVudEVudHJ5LmxvY2F0aW9uIHRvIHJlZmxlY3QgbmV3IHNlYXJjaCBkaXJlY3RseSAoaGlzdG9yeS5zZXQgdHJpZ2dlcnMgYXN5bmMgc3Vic2NyaWJlcilcbiAgICAgIGN1cnJlbnRFbnRyeSA9IHtcbiAgICAgICAgLi4uY3VycmVudEVudHJ5LFxuICAgICAgICBsb2NhdGlvbjogeyAuLi5jdXJyZW50RW50cnkubG9jYXRpb24sIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCB9LFxuICAgICAgICByYXdTZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIG5vdGlmeUVudHJ5KGN1cnJlbnRFbnRyeSk7XG4gIGVtaXRFdmVudCh7XG4gICAga2luZDogJ3NuYXBzaG90JyxcbiAgICBzb3VyY2U6IGxhc3ROYXZpZ2F0aW9uT3JpZ2luLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oY3VycmVudEVudHJ5LmxvY2F0aW9uKSxcbiAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGN1cnJlbnRFbnRyeSksXG4gIH0pO1xuXG4gIC8vIE1haW50YWluIGEgc2V0IG9mIHN1YnNjcmliZXJzIHRvIHRoZSBhY3RpdmUgcm91dGUgZW50cnlcbiAgbGV0IG5leHRJZCA9IDA7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgU3Vic2NyaWJlQ2FsbGJhY2s8UGFyYW1EYXRhLCBSb3V0ZXJRdWVyeVNjaGVtYSwgVENvbnRleHQ+XG4gID4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGRpc3Bvc2VIaXN0b3J5ID0gaGlzdG9yeS5zdWJzY3JpYmUoXG4gICAgKGxvY2F0aW9uLCBmb3JjZVJlcmVuZGVyLCBkZWJ1Z0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbiA9IHJlc29sdmVOYXZpZ2F0aW9uT3JpZ2luKGRlYnVnQ29udGV4dCk7XG4gICAgICBsYXN0TmF2aWdhdGlvbk9yaWdpbiA9IG9yaWdpbjtcbiAgICAgIGNvbnN0IGxvY2F0aW9uUGF5bG9hZCA9IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKTtcblxuICAgICAgY29uc3QgZGVidWdDb250ZXh0T3JpZ2luID0gZGVidWdDb250ZXh0Py5vcmlnaW47XG4gICAgICBpZiAoZGVidWdDb250ZXh0T3JpZ2luICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGhpc3RvcnlEZXRhaWxzOiB7IGhpc3RvcnlJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgZGVidWdDb250ZXh0Py5oaXN0b3J5SW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaGlzdG9yeURldGFpbHMgPSB7IGhpc3RvcnlJbmRleDogZGVidWdDb250ZXh0Lmhpc3RvcnlJbmRleCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWJhY2snIHx8XG4gICAgICAgICAgZGVidWdDb250ZXh0T3JpZ2luID09PSAncG9wc3RhdGUtZm9yd2FyZCcgfHxcbiAgICAgICAgICBkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS11bmtub3duJyB8fFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ2V4dGVybmFsJ1xuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgZGlyZWN0aW9uOiAnYmFjaycgfCAnZm9yd2FyZCcgfCAndW5rbm93bicgPSAndW5rbm93bic7XG4gICAgICAgICAgaWYgKGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWJhY2snKSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24gPSAnYmFjayc7XG4gICAgICAgICAgfSBlbHNlIGlmIChkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS1mb3J3YXJkJykge1xuICAgICAgICAgICAgZGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0RXZlbnQoe1xuICAgICAgICAgICAga2luZDogJ3BvcHN0YXRlJyxcbiAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICAgIGRldGFpbHM6IGhpc3RvcnlEZXRhaWxzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbWVQYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICBjb25zdCBzYW1lU2VhcmNoID0gbG9jYXRpb24uc2VhcmNoID09PSBjdXJyZW50RW50cnkucmF3U2VhcmNoO1xuXG4gICAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgICAgLy8gTm90aGluZyBjaGFuZ2VkIHRoYXQgd2UgY2FyZSBhYm91dFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZXh0ID0gcmVzb2x2ZUNvbnRleHQoKTtcblxuICAgICAgLy8gSWYgb25seSB0aGUgc2VhcmNoIGNoYW5nZWQgd2Ugc3RpbGwgd2FudCB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZS5cbiAgICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgICBsZXQgbmV4dFByZXBhcmVkTWF0Y2ggPSBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaDtcbiAgICAgIGxldCBuZXh0Um91dGUgPSBjdXJyZW50RW50cnkucm91dGU7XG5cbiAgICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBsb2NhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHJhdyBxdWVyeSBvYmplY3QgKGJhc2ljIGFnZ3JlZ2F0aW9uKSBmcm9tIGxvY2F0aW9uLnNlYXJjaFxuICAgICAgY29uc3QgcXVlcnlTY2hlbWEgPSByZWFkQWN0aXZlUXVlcnlTY2hlbWEobmV4dFJvdXRlKTtcbiAgICAgIGNvbnN0IHBhcnNlZFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShsb2NhdGlvbi5zZWFyY2gsIHF1ZXJ5U2NoZW1hKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWx0ZXJzID0gbm9ybWFsaXplUGFnZUZpbHRlcnMocGFyc2VkU2VhcmNoU3RhdGUuZmlsdGVycyk7XG5cbiAgICAgIGNvbnN0IHNob3VsZFJlcHJlcGFyZSA9IHNob3VsZFByZXBhcmVPbk5hdmlnYXRpb24oe1xuICAgICAgICBzYW1lUGF0aG5hbWUsXG4gICAgICAgIHNhbWVTZWFyY2gsXG4gICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHNob3VsZFJlcHJlcGFyZSkge1xuICAgICAgICBsZXQgdXBkYXRlSW5zdHJ1bWVudGF0aW9uOlxuICAgICAgICAgIHwge1xuICAgICAgICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB2b2lkO1xuICAgICAgICAgICAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gICAgICAgICAgICAgIGxvY2F0aW9uOiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAobmV4dFJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICB1cGRhdGVJbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGVtaXRFdmVudChldmVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc291cmNlOiBvcmlnaW4sXG4gICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25QYXlsb2FkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbmV4dFByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2goXG4gICAgICAgICAgbmV4dFJvdXRlLFxuICAgICAgICAgIGJ1aWxkUHJlcGFyZVF1ZXJ5SW5wdXQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhcnNlZFNlYXJjaFN0YXRlLFxuICAgICAgICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHF1ZXJ5U2NoZW1hLFxuICAgICAgICAgICksXG4gICAgICAgICAgdXBkYXRlSW5zdHJ1bWVudGF0aW9uLFxuICAgICAgICAgIG5leHRDb250ZXh0LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+ID0ge1xuICAgICAgICBmb3JjZVJlcmVuZGVyOiBmb3JjZVJlcmVuZGVyIHx8IChzYW1lUGF0aG5hbWUgJiYgIXNhbWVTZWFyY2gpLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgICAgcHJlcGFyZWRNYXRjaDogbmV4dFByZXBhcmVkTWF0Y2gsXG4gICAgICAgIGNvbnRleHQ6IG5leHRDb250ZXh0LFxuICAgICAgICByYXdTZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgICAgcXVlcnk6IHBhcnNlZFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICBmaWx0ZXJEaWFnbm9zdGljczogcGFyc2VkU2VhcmNoU3RhdGUuZmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBxdWVyeVNjaGVtYSxcbiAgICAgIH07XG5cbiAgICAgIC8vIElmIG5vcm1hbGl6YXRpb24gY2hhbmdlZCB0aGUgdHlwZWQgcXVlcnkgd2UgdHJpZ2dlciBhIHJlcGxhY2Ugd2l0aCBub3JtYWxpemVkIHNlYXJjaFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWx0ZXJzLm5vcm1hbGl6ZWQgJiYgcXVlcnlTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICAgICAgZmlsdGVyczogbm9ybWFsaXplZEZpbHRlcnMuZmlsdGVycyxcbiAgICAgICAgICBxdWVyeTogcGFyc2VkU2VhcmNoU3RhdGUucXVlcnksXG4gICAgICAgICAgcXVlcnlTY2hlbWEsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm9ybWFsaXplZFNlYXJjaCAhPT0gbG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgICAgbGV0IG5leHRTZWFyY2hTdHIgPSBub3JtYWxpemVkU2VhcmNoO1xuICAgICAgICAgIGlmICghbmV4dFNlYXJjaFN0ci5zdGFydHNXaXRoKCc/JykgJiYgbmV4dFNlYXJjaFN0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuZXh0U2VhcmNoU3RyID0gYD8ke25leHRTZWFyY2hTdHJ9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdEhpc3RvcnlFdmVudChcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICAgICAgc2VhcmNoOiBuZXh0U2VhcmNoU3RyLFxuICAgICAgICAgICAgICBoYXNoOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHJlYXNvbjogJ3J1bnRpbWUtcGFnZS1jbGFtcCcgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJ1bnRpbWVOb3JtYWxpemVDb250ZXh0OiBIaXN0b3J5RGVidWdDb250ZXh0ID0ge1xuICAgICAgICAgICAgb3JpZ2luOiAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIHRyaWdnZXI6ICdub3JtYWxpemUnLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgICAgc2VhcmNoOiBuZXh0U2VhcmNoU3RyLFxuICAgICAgICAgICAgaGFzaDogJycsXG4gICAgICAgICAgICBkZWJ1Z0NvbnRleHQ6IHJ1bnRpbWVOb3JtYWxpemVDb250ZXh0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjsgLy8gZWFybHk6IHN1YnNlcXVlbnQgc2V0IHdpbGwgdHJpZ2dlciByZXJ1blxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBjdXJyZW50IGVudHJ5IGFuZCBub3RpZnkgYWxsIHN1YnNjcmliZXJzXG4gICAgICBjdXJyZW50RW50cnkgPSBuZXh0RW50cnk7XG4gICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICBjYWxsYmFjayhuZXh0RW50cnkpO1xuICAgICAgfSk7XG4gICAgICBub3RpZnlFbnRyeShuZXh0RW50cnkpO1xuICAgICAgZW1pdEV2ZW50KHtcbiAgICAgICAga2luZDogJ3NuYXBzaG90JyxcbiAgICAgICAgc291cmNlOiBvcmlnaW4sXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgcm91dGVQYXRoOiByZWFkTWF0Y2hlZFJvdXRlUGF0aChuZXh0RW50cnkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgKTtcblxuICAvKiogTm9ybWFsaXplcyB1c2VyLXByb3ZpZGVkIHByZWxvYWQgdGFyZ2V0cyBpbnRvIGNvbnNpc3RlbnQgc3RydWN0dXJlcy4gKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUHJlbG9hZFRhcmdldCh0YXJnZXQ6IFByZWxvYWRUYXJnZXQpOiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g6IHN0cmluZztcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gIH0ge1xuICAgIGxldCBub3JtYWxpemVkUGF0aG5hbWUgPSBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0LnBhdGhuYW1lID09PSAnc3RyaW5nJyAmJiB0YXJnZXQucGF0aG5hbWUubGVuZ3RoID4gMCkge1xuICAgICAgbm9ybWFsaXplZFBhdGhuYW1lID0gdGFyZ2V0LnBhdGhuYW1lO1xuICAgIH1cblxuICAgIGxldCBub3JtYWxpemVkU2VhcmNoID0gJyc7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQuc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgbm9ybWFsaXplZFNlYXJjaCA9IHRhcmdldC5zZWFyY2g7XG4gICAgfVxuXG4gICAgbGV0IG5vcm1hbGl6ZWRTb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgPSAncHJvZ3JhbW1hdGljJztcbiAgICBjb25zdCBtYXBwZWRTb3VyY2UgPSBtYXBPcmlnaW4odGFyZ2V0LnNvdXJjZSk7XG4gICAgaWYgKG1hcHBlZFNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBub3JtYWxpemVkU291cmNlID0gbWFwcGVkU291cmNlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRobmFtZSxcbiAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgIHNvdXJjZTogbm9ybWFsaXplZFNvdXJjZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByZXBhcmVkIHZhbHVlIGZvciB0aGUgZmlyc3QgYWN0aXZlIHNlZ21lbnQgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm91dGUgc2VnbWVudCBwYXRoIG9yIGZ1bGwgcGF0aCB0byBpbnNwZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UHJlcGFyZWQocGF0aDogc3RyaW5nKTogdW5rbm93biB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gY3VycmVudEVudHJ5O1xuICAgICAgZm9yIChjb25zdCBwcmVwYXJlZFJvdXRlIG9mIGVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHMpIHtcbiAgICAgICAgaWYgKHByZXBhcmVkUm91dGUucGF0aCA9PT0gcGF0aCB8fCBwcmVwYXJlZFJvdXRlLmZ1bGxQYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXBhcmVkUm91dGUucHJlcGFyZWRSZXNvdXJjZT8uZ2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV2ZXJ5IGFjdGl2ZSBwcmVwYXJlZCBzZWdtZW50IG1hdGNoaW5nIHRoZSBwcm92aWRlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJvdXRlIHNlZ21lbnQgcGF0aCBvciBmdWxsIHBhdGggdG8gaW5zcGVjdC5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFByZXBhcmVkU2VnbWVudHMocGF0aDogc3RyaW5nKTogUHJlcGFyZWRSb3V0ZVNlZ21lbnRTbmFwc2hvdFtdIHtcbiAgICByZXR1cm4gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHNcbiAgICAgIC5maWx0ZXIoKHByZXBhcmVkUm91dGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZXBhcmVkUm91dGUucGF0aCA9PT0gcGF0aCB8fCBwcmVwYXJlZFJvdXRlLmZ1bGxQYXRoID09PSBwYXRoO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKHByZXBhcmVkUm91dGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXRoOiBwcmVwYXJlZFJvdXRlLnBhdGgsXG4gICAgICAgICAgZnVsbFBhdGg6IHByZXBhcmVkUm91dGUuZnVsbFBhdGgsXG4gICAgICAgICAgc2VnbWVudEluZGV4OiBwcmVwYXJlZFJvdXRlLnNlZ21lbnRJbmRleCxcbiAgICAgICAgICBwcmVwYXJlZFJlc291cmNlOiBwcmVwYXJlZFJvdXRlLnByZXBhcmVkUmVzb3VyY2UsXG4gICAgICAgICAgcmVkaXJlY3RUbzogcHJlcGFyZWRSb3V0ZS5yZWRpcmVjdFRvLFxuICAgICAgICAgIHJlc291cmNlUGFnZTogcHJlcGFyZWRSb3V0ZS5yZXNvdXJjZVBhZ2UsXG4gICAgICAgICAgaGlnaGxpZ2h0SWQ6IHByZXBhcmVkUm91dGUuaGlnaGxpZ2h0SWQsXG4gICAgICAgICAgcXVlcnlTY2hlbWE6IHByZXBhcmVkUm91dGUucXVlcnlTY2hlbWEsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSByb3V0ZXIgY29udGV4dCBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBSZWFjdCBDb250ZXh0XG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgaGlzdG9yeSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5O1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUodGFyZ2V0KSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUHJlbG9hZFRhcmdldCh0YXJnZXQpO1xuICAgICAgZW1pdFByZWxvYWRFdmVudCgnY29kZScsIG5vcm1hbGl6ZWQucGF0aG5hbWUsIG5vcm1hbGl6ZWQuc291cmNlKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi5oaXN0b3J5LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZTogbm9ybWFsaXplZC5wYXRobmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobWF0Y2hlcyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbWF0Y2hlcy5yb3V0ZS5yb3V0ZXMuZm9yRWFjaCgoeyByZXNvdXJjZVBhZ2UgfSkgPT4ge1xuICAgICAgICBpZiAocmVzb3VyY2VQYWdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICByZXNvdXJjZVBhZ2UubG9hZCgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwcmVsb2FkKHRhcmdldCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVByZWxvYWRUYXJnZXQodGFyZ2V0KTtcbiAgICAgIGVtaXRQcmVsb2FkRXZlbnQoJ2Z1bGwnLCBub3JtYWxpemVkLnBhdGhuYW1lLCBub3JtYWxpemVkLnNvdXJjZSk7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4uaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvY2F0aW9uU25hcHNob3Q6IFJvdXRlckxvY2F0aW9uU25hcHNob3QgPSB7XG4gICAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgICBoYXNoOiAnJyxcbiAgICAgIH07XG4gICAgICBsZXQgaW5zdHJ1bWVudGF0aW9uOlxuICAgICAgICB8IHtcbiAgICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHZvaWQ7XG4gICAgICAgICAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gICAgICAgICAgICBsb2NhdGlvbjogUm91dGVyTG9jYXRpb25TbmFwc2hvdDtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG1hdGNoZXMgIT0gbnVsbCkge1xuICAgICAgICBpbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4ge1xuICAgICAgICAgICAgZW1pdEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvdXJjZTogbm9ybWFsaXplZC5zb3VyY2UsXG4gICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uU25hcHNob3QsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwcmVsb2FkQ29udGV4dCA9IHJlc29sdmVDb250ZXh0KCk7XG4gICAgICBjb25zdCBwcmVsb2FkUXVlcnlTY2hlbWEgPSByZWFkQWN0aXZlUXVlcnlTY2hlbWEobWF0Y2hlcyk7XG4gICAgICBjb25zdCBwcmVsb2FkU2VhcmNoU3RhdGUgPSBwYXJzZVNlYXJjaFN0YXRlKFxuICAgICAgICBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgICAgcHJlbG9hZFF1ZXJ5U2NoZW1hLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2goXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIGJ1aWxkUHJlcGFyZVF1ZXJ5SW5wdXQocHJlbG9hZFNlYXJjaFN0YXRlLCBwcmVsb2FkUXVlcnlTY2hlbWEpLFxuICAgICAgICBpbnN0cnVtZW50YXRpb24sXG4gICAgICAgIHByZWxvYWRDb250ZXh0LFxuICAgICAgKTtcbiAgICAgIHByZXBhcmVkTWF0Y2guc2VnbWVudHMuZm9yRWFjaCgocm91dGUpID0+IHtcbiAgICAgICAgaWYgKHJvdXRlLnByZXBhcmVkUmVzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgICByb3V0ZS5wcmVwYXJlZFJlc291cmNlLmxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBzdWJzY3JpYmUoY2FsbGJhY2spIHtcbiAgICAgIG5leHRJZCArPSAxO1xuICAgICAgY29uc3QgaWQgPSBuZXh0SWQ7XG4gICAgICAvKiogUmVtb3ZlcyB0aGUgc3Vic2NyaWJlciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgdmlhIHN1YnNjcmliZS4gKi9cbiAgICAgIGZ1bmN0aW9uIGRpc3Bvc2VDYWxsYmFjaygpIHtcbiAgICAgICAgc3Vic2NyaWJlcnMuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICAgIHN1YnNjcmliZXJzLnNldChpZCwgY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIGRpc3Bvc2VDYWxsYmFjaztcbiAgICB9LFxuICAgIG5hdmlnYXRlKHtcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcXVlcnksXG4gICAgICBmaWx0ZXJzOiBuYXZGaWx0ZXJzLFxuICAgICAgcmVwbGFjZSxcbiAgICB9OiB7XG4gICAgICBwYXRobmFtZT86IHN0cmluZztcbiAgICAgIHF1ZXJ5PzogVW5rbm93blF1ZXJ5U2hhcGU7XG4gICAgICBmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnM7XG4gICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICB9KSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gY3VycmVudEVudHJ5O1xuICAgICAgbGV0IHRhcmdldFBhdGhuYW1lID0gcGF0aG5hbWU7XG4gICAgICB0YXJnZXRQYXRobmFtZSA/Pz0gY3VycmVudC5sb2NhdGlvbi5wYXRobmFtZTtcblxuICAgICAgY29uc3QgZGVzdGluYXRpb25Sb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLmhpc3RvcnkubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgbGV0IGRlc3RTY2hlbWEgPSByZWFkQWN0aXZlUXVlcnlTY2hlbWEoZGVzdGluYXRpb25Sb3V0ZSk7XG4gICAgICBkZXN0U2NoZW1hID0gZGVzdFNjaGVtYSA/PyBjdXJyZW50LmFjdGl2ZVF1ZXJ5U2NoZW1hO1xuXG4gICAgICBjb25zdCBoYXNTY2hlbWEgPSBkZXN0U2NoZW1hICE9IG51bGw7XG4gICAgICBjb25zdCB1c2VRdWVyeUFzRmlsdGVycyA9XG4gICAgICAgIG5hdkZpbHRlcnMgPT0gbnVsbCAmJlxuICAgICAgICBoYXNTY2hlbWEgJiZcbiAgICAgICAgcXVlcnkgIT0gbnVsbCAmJlxuICAgICAgICBsb29rc0xpa2VGaWx0ZXJzKHF1ZXJ5KTtcbiAgICAgIGxldCBmaWx0ZXJzSW5wdXQgPSBuYXZGaWx0ZXJzO1xuICAgICAgaWYgKGZpbHRlcnNJbnB1dCA9PSBudWxsKSB7XG4gICAgICAgIGlmICh1c2VRdWVyeUFzRmlsdGVycykge1xuICAgICAgICAgIGZpbHRlcnNJbnB1dCA9IHF1ZXJ5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbHRlcnNJbnB1dCA9IGN1cnJlbnQuZmlsdGVycztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHJhd1F1ZXJ5SW5wdXQ6IFVua25vd25RdWVyeVNoYXBlIHwgUmF3UXVlcnkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodXNlUXVlcnlBc0ZpbHRlcnMpIHtcbiAgICAgICAgcmF3UXVlcnlJbnB1dCA9IGN1cnJlbnQucXVlcnk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYXdRdWVyeUlucHV0ID0gcXVlcnkgPz8gY3VycmVudC5xdWVyeTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgICBmaWx0ZXJzOiBmaWx0ZXJzSW5wdXQsXG4gICAgICAgIHF1ZXJ5OiByYXdRdWVyeUlucHV0LFxuICAgICAgICBxdWVyeVNjaGVtYTogZGVzdFNjaGVtYSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbG9jYXRpb25PYmogPSB7IHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSwgc2VhcmNoLCBoYXNoOiAnJyB9O1xuICAgICAgY29uc3Qgb3JpZ2luOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlID0gJ3Byb2dyYW1tYXRpYyc7XG4gICAgICBjb25zdCBkZWJ1Z0NvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgIG9yaWdpbixcbiAgICAgICAgdHJpZ2dlcjogJ3Byb2dyYW1tYXRpYycsXG4gICAgICB9O1xuXG4gICAgICBpZiAocmVwbGFjZSA9PT0gdHJ1ZSkge1xuICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KCdyZXBsYWNlJywgb3JpZ2luLCBsb2NhdGlvbk9iaiwge1xuICAgICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIC4uLmxvY2F0aW9uT2JqLFxuICAgICAgICAgIGRlYnVnQ29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KCdwdXNoJywgb3JpZ2luLCBsb2NhdGlvbk9iaiwge1xuICAgICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaGlzdG9yeS5wdXNoKHtcbiAgICAgICAgICAuLi5sb2NhdGlvbk9iaixcbiAgICAgICAgICBkZWJ1Z0NvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0UHJlcGFyZWQsXG4gICAgZ2V0UHJlcGFyZWRTZWdtZW50cyxcbiAgfSBhcyBDcmVhdGVSb3V0ZXJSZXR1cm48VENvbnRleHQsIFI+Wydjb250ZXh0J107XG5cbiAgLyoqIFJlbGVhc2VzIHJvdXRlciByZXNvdXJjZXMgYW5kIGRldGFjaGVzIGFsbCBpbnN0cnVtZW50YXRpb25zLiAqL1xuICBmdW5jdGlvbiBjbGVhbnVwKCk6IHZvaWQge1xuICAgIGlmIChyb3V0ZXJEaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByb3V0ZXJEaXNwb3NlZCA9IHRydWU7XG4gICAgZGlzcG9zZUhpc3RvcnkoKTtcbiAgICBoaXN0b3J5LmRpc3Bvc2UoKTtcbiAgICBzdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIHJlZ2lzdHJ5LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIFJldHVybiBib3RoIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgYSBjbGVhbnVwIGZ1bmN0aW9uXG4gIHJldHVybiB7IGNvbnRleHQsIGNsZWFudXAgfTtcbn1cbiJdfQ==
|
|
861
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLG1CQUFtQixNQUFNLGlDQUFpQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFtQm5FLE9BQU8sRUFDTCw2QkFBNkIsR0FNOUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsd0JBQXdCLEdBR3pCLE1BQU0sY0FBYyxDQUFDO0FBMEJ0QixTQUFTLHlCQUF5QixDQUFDLEtBSWxDO0lBQ0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLHFCQUFxQixLQUFLLE1BQU0sQ0FBQztJQUN6RSxDQUFD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Y0FBYyxHQUFHLElBQUksQ0FBQztRQUN0QixjQUFjLEVBQUUsQ0FBQztRQUNqQixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBR0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVpbGRSb3V0ZXMgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNYXRjaGVkUm91dGUsIHByZXBhcmVNYXRjaCB9IGZyb20gJy4uL3Rvb2xzLmpzJztcbmltcG9ydCB7IHBhcnNlUmF3UXVlcnkgfSBmcm9tICcuLi90b29scy9xdWVyeS5qcyc7XG5pbXBvcnQgYnVpbGRDb21iaW5lZFNlYXJjaCBmcm9tICcuLi90b29scy9idWlsZENvbWJpbmVkU2VhcmNoLmpzJztcbmltcG9ydCB7IHR5cGUgRGlhZ25vc3RpYyBhcyBGaWx0ZXJEaWFnbm9zdGljIH0gZnJvbSAnQHBsdW1pbGUvZmlsdGVyLXF1ZXJ5L2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZUZpbHRlcnMgfSBmcm9tICdAcGx1bWlsZS9maWx0ZXItcXVlcnkvcGFyc2UuanMnO1xuaW1wb3J0IHsgdHlwZSBTY2hlbWEgYXMgRmlsdGVyU2NoZW1hIH0gZnJvbSAnQHBsdW1pbGUvZmlsdGVyLXF1ZXJ5L3R5cGVzLmpzJztcbmltcG9ydCB7IEZJTFRFUl9PUEVSQVRPUlMgfSBmcm9tICdAcGx1bWlsZS9maWx0ZXItcXVlcnkvdmFsdWVzLmpzJztcbmltcG9ydCB0eXBlIHsgUGFyYW1EYXRhIH0gZnJvbSAncGF0aC10by1yZWdleHAnO1xuaW1wb3J0IHtcbiAgdHlwZSBSb3V0ZUVudHJ5LFxuICB0eXBlIFJvdXRpbmdDb250ZXh0VHlwZSxcbiAgdHlwZSBTdWJzY3JpYmVDYWxsYmFjayxcbiAgdHlwZSBBbnlSb3V0ZSxcbiAgdHlwZSBQcmVwYXJlZEFjY2VzcyxcbiAgdHlwZSBOYXZpZ2F0ZU92ZXJsb2FkcyxcbiAgdHlwZSBQcmVsb2FkVGFyZ2V0LFxuICB0eXBlIFByZXBhcmVkUm91dGVTZWdtZW50U25hcHNob3QsXG4gIHR5cGUgUmF3UXVlcnksXG4gIHR5cGUgUm91dGVyTWF0Y2hlZFJvdXRlLFxuICB0eXBlIFJvdXRlckFjdGl2ZUxvYWRTdGF0ZSxcbiAgdHlwZSBSb3V0ZXJMb2FkU3RhdGUsXG4gIHR5cGUgUm91dGVyU2VnbWVudExvYWRTdGF0ZSxcbiAgdHlwZSBVbmtub3duRmlsdGVycyxcbiAgdHlwZSBVbmtub3duUXVlcnlTaGFwZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnksXG4gIHR5cGUgSW5zdHJ1bWVudGF0aW9uQVBJLFxuICB0eXBlIFJvdXRlckVudHJ5U25hcHNob3QsXG4gIHR5cGUgUm91dGVyTG9jYXRpb25TbmFwc2hvdCxcbiAgdHlwZSBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICB0eXBlIFJvdXRlckV2ZW50LFxufSBmcm9tICcuLi9pbnN0cnVtZW50YXRpb24vSW5zdHJ1bWVudGF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSGlzdG9yeURlYnVnQ29udGV4dCB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMuanMnO1xuaW1wb3J0IHtcbiAgaXNSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICB0eXBlIFJvdXRlckhpc3RvcnlBY3Rpb25WYWx1ZSxcbiAgdHlwZSBSb3V0ZXJQcmVsb2FkTW9kZVZhbHVlLFxufSBmcm9tICcuLi92YWx1ZXMuanMnO1xuXG50eXBlIFJvdXRlclF1ZXJ5U2NoZW1hID0gRmlsdGVyU2NoZW1hIHwgdW5kZWZpbmVkO1xudHlwZSBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PiA9IFJvdXRlRW50cnk8XG4gIFBhcmFtRGF0YSxcbiAgUm91dGVyUXVlcnlTY2hlbWEsXG4gIFRDb250ZXh0XG4+O1xudHlwZSBQYXJzZWRTZWFyY2hTdGF0ZSA9IHtcbiAgcXVlcnk6IFJhd1F1ZXJ5O1xuICBmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnM7XG4gIGZpbHRlckRpYWdub3N0aWNzPzogRmlsdGVyRGlhZ25vc3RpY1tdO1xufTtcbnR5cGUgUHJlcGFyZVF1ZXJ5SW5wdXQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbnR5cGUgUHJlbG9hZGVkUHJlcGFyZWRNYXRjaDxUQ29udGV4dD4gPSB7XG4gIGtleTogc3RyaW5nO1xuICBjb250ZXh0OiBUQ29udGV4dDtcbiAgcm91dGU6IFJvdXRlck1hdGNoZWRSb3V0ZTxQYXJhbURhdGE+IHwgbnVsbDtcbiAgcHJlcGFyZWRNYXRjaDogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD5bJ3ByZXBhcmVkTWF0Y2gnXTtcbiAgcXVlcnlTY2hlbWE6IFJvdXRlclF1ZXJ5U2NoZW1hO1xuICBzZWFyY2g6IHN0cmluZztcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcm91dGUgcHJlcGFyZSBjYWxsYmFjayBzaG91bGQgcnVuIGFmdGVyIG5hdmlnYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFByZXBhcmVPbk5hdmlnYXRpb24oaW5wdXQ6IHtcbiAgc2FtZVBhdGhuYW1lOiBib29sZWFuO1xuICBzYW1lU2VhcmNoOiBib29sZWFuO1xuICByb3V0ZTogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsO1xufSk6IGJvb2xlYW4ge1xuICBpZiAoIWlucHV0LnNhbWVQYXRobmFtZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlucHV0LnNhbWVTZWFyY2gpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCByb3V0ZVNlZ21lbnRzID0gaW5wdXQucm91dGU/LnJvdXRlLnJvdXRlcyA/PyBbXTtcbiAgcmV0dXJuIHJvdXRlU2VnbWVudHMuc29tZSgocm91dGUpID0+IHtcbiAgICByZXR1cm4gcm91dGUucHJlcGFyZSAhPSBudWxsICYmIHJvdXRlLnByZXBhcmVTZWFyY2hCZWhhdmlvciAhPT0gJ3BhdGgnO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIGNyZWF0ZVJvdXRlciBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlUm91dGVyUmV0dXJuPFRDb250ZXh0LCBSIGV4dGVuZHMgQW55Um91dGVbXT4gPSB7XG4gIC8qKiBGdW5jdGlvbiB0byBjbGVhbiB1cCByb3V0ZXIgbGlzdGVuZXJzIGFuZCByZXNvdXJjZXMgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIFJvdXRlciBjb250ZXh0IG9iamVjdCBmb3IgdGhlIFJlYWN0IENvbnRleHQgUHJvdmlkZXIgKi9cbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPFxuICAgIFBhcmFtRGF0YSxcbiAgICBSb3V0ZXJRdWVyeVNjaGVtYSxcbiAgICBVbmtub3duUXVlcnlTaGFwZSxcbiAgICBUQ29udGV4dFxuICA+ICZcbiAgICBQcmVwYXJlZEFjY2VzczxSPiAmIHtcbiAgICAgIG5hdmlnYXRlOiBOYXZpZ2F0ZU92ZXJsb2FkczxSPjtcbiAgICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcGxldGUgcm91dGVyIHN5c3RlbSBmcm9tIHJvdXRlIGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFRoaXMgcm91dGVyIGlzIGJ1aWx0IGZyb20gdGhlIHNhbWUgcHJpbWl0aXZlcyBhcyByZWFjdC1yb3V0ZXIgYnV0IHdpdGggYWRkaXRpb25hbFxuICogZmVhdHVyZXMgZm9yIGRhdGEgcHJlbG9hZGluZyBhbmQgY29kZSBzcGxpdHRpbmcuIEVhY2ggcm91dGUgY2FuIGNvbnRhaW4gYm90aCBhXG4gKiBDb21wb25lbnQgYW5kIGEgcHJlcGFyZSgpIGZ1bmN0aW9uIHRoYXQgY2FuIHByZWxvYWQgZGF0YSBmb3IgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiBUaGUgcm91dGVyIHdhdGNoZXMgZm9yIGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gdmlhIHRoZSBIVE1MNSBIaXN0b3J5IEFQSSxcbiAqIG1hcHMgdGhlIGxvY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJvdXRlIGVudHJ5LCBhbmQgdGhlbiBwcmVsb2FkcyB0aGUgY29kZVxuICogYW5kIGRhdGEgZm9yIHRoZSByb3V0ZSBiZWZvcmUgcmVuZGVyaW5nLlxuICpcbiAqIEBwYXJhbSByb3V0ZXMgLSBBcnJheSBvZiByb3V0ZSBjb25maWd1cmF0aW9uc1xuICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJvdXRlciBjb250ZXh0IGFuZCBjbGVhbnVwIGZ1bmN0aW9uXG4gKlxuICBwcmVwYXJlZE1hdGNoOiBwcmVwYXJlTWF0Y2gocm91dGUsIHBhcnNlUmF3UXVlcnkoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gpKSxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJvdXRlcyA9IFtcbiAqICAge1xuICogICAgIHBhdGg6ICcvdXNlcnMvOmlkJyxcbiAqICAgICByZXNvdXJjZVBhZ2U6IGdldFJlc291cmNlUGFnZSgnVXNlclByb2ZpbGUnLCAoKSA9PiBpbXBvcnQoJy4vVXNlclByb2ZpbGUnKSksXG4gKiAgICAgcHJlcGFyZTogKHsgdmFyaWFibGVzIH0pID0+ICh7IHVzZXJJZDogdmFyaWFibGVzLmlkIH0pXG4gKiAgIH1cbiAqIF07XG4gKlxuICogY29uc3QgeyBjb250ZXh0LCBjbGVhbnVwIH0gPSBjcmVhdGVSb3V0ZXIocm91dGVzKTtcbiAqXG4gKiAvLyBVc2UgaW4gUmVhY3QgYXBwXG4gKiA8Um91dGluZ0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHR9PlxuICogICA8Um91dGVyUmVuZGVyZXIgZmFsbGJhY2s9ezxkaXY+TG9hZGluZy4uLjwvZGl2Pn0gLz5cbiAqIDwvUm91dGluZ0NvbnRleHQuUHJvdmlkZXI+XG4gKiBgYGBcbiAqL1xuLyoqXG4gKiBDcmVhdGUgYSByb3V0ZXIgKHR5cGVkIG92ZXJsb2FkKS4gV2hlbiBjYWxsZWQgd2l0aCBhIGNvbnN0IHR1cGxlIG9mIHJvdXRlcywgZ2VuZXJpY3MgYXJlIHByZXNlcnZlZC5cbiAqL1xuLyoqXG4gKiBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciBgY3JlYXRlUm91dGVyYC5cbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlUm91dGVyT3B0aW9uczxUQ29udGV4dD4gPSB7XG4gIC8qKiBJbnN0cnVtZW50YXRpb25zIHRvIGF0dGFjaCB0byB0aGUgcm91dGVyIChEZXZUb29scyBicmlkZ2UsIGxvZ2dlciwgLi4uKS4gKi9cbiAgaW5zdHJ1bWVudGF0aW9ucz86IEluc3RydW1lbnRhdGlvbkFQSVtdO1xuICAvKiogU3RhdGljIGNvbnRleHQgdmFsdWUgb3IgbGF6eSBpbml0aWFsaXplciBmb3IgdGhlIHJvdXRlci4gKi9cbiAgY29udGV4dD86IFRDb250ZXh0IHwgKCgpID0+IFRDb250ZXh0KTtcbiAgLyoqIFJlc29sdmUgYSBmcmVzaCBjb250ZXh0IHZhbHVlIHBlciBuYXZpZ2F0aW9uLiAqL1xuICBnZXRDb250ZXh0PzogKCkgPT4gVENvbnRleHQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByb3V0ZXIgaW5zdGFuY2UgZnJvbSBhIHJvdXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIFJvdXRlIGRlZmluaXRpb25zIHRvIHJlZ2lzdGVyLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBpbnN0cnVtZW50YXRpb24gc2V0dGluZ3MgdXNlZCBmb3IgZXhwb3NpbmcgZGV2ZWxvcG1lbnQgdG9vbGluZy5cbiAqIEBwYXJhbSBvcHRpb25zLmluc3RydW1lbnRhdGlvbnMgLSBJbnN0cnVtZW50YXRpb25zIGludm9rZWQgb24gcm91dGVyIGV2ZW50cyAoZGV2ZWxvcG1lbnQgb25seSkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcjxcbiAgVENvbnRleHQgPSB1bmtub3duLFxuICBSIGV4dGVuZHMgQW55Um91dGVbXSA9IEFueVJvdXRlW10sXG4+KFxuICByb3V0ZXM6IFsuLi5SXSB8IEFueVJvdXRlW10sXG4gIG9wdGlvbnM6IENyZWF0ZVJvdXRlck9wdGlvbnM8VENvbnRleHQ+ID0ge30sXG4pOiBDcmVhdGVSb3V0ZXJSZXR1cm48VENvbnRleHQsIFI+IHtcbiAgLy8gSW5pdGlhbGl6ZSBicm93c2VyIGhpc3RvcnkgbWFuYWdlclxuICBjb25zdCBoaXN0b3J5ID0gbmV3IEJyb3dzZXJIaXN0b3J5KCk7XG5cbiAgY29uc3QgcmVnaXN0cnkgPSBjcmVhdGVJbnN0cnVtZW50YXRpb25SZWdpc3RyeShcbiAgICBvcHRpb25zLmluc3RydW1lbnRhdGlvbnMgPz8gW10sXG4gICk7XG5cbiAgbGV0IHN0YXRpY0NvbnRleHQ6IFRDb250ZXh0IHwgdW5kZWZpbmVkO1xuICBpZiAob3B0aW9ucy5nZXRDb250ZXh0ID09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhdGljQ29udGV4dCA9IChvcHRpb25zLmNvbnRleHQgYXMgKCkgPT4gVENvbnRleHQpKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRpY0NvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc29sdmUgdGhlIGNvbnRleHQgZm9yIHRoZSBjdXJyZW50IG5hdmlnYXRpb24uICovXG4gIGZ1bmN0aW9uIHJlc29sdmVDb250ZXh0KCk6IFRDb250ZXh0IHtcbiAgICBpZiAob3B0aW9ucy5nZXRDb250ZXh0ICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmdldENvbnRleHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRpY0NvbnRleHQgYXMgVENvbnRleHQ7XG4gIH1cblxuICBsZXQgcGVuZGluZ05hdmlnYXRpb25PcmlnaW46IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgfCB1bmRlZmluZWQ7XG4gIGxldCBsYXN0TmF2aWdhdGlvbk9yaWdpbjogUm91dGVyTmF2aWdhdGlvblNvdXJjZSA9ICdleHRlcm5hbCc7XG4gIGxldCBsYXN0UHJlbG9hZFNpZ25hdHVyZToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG4gIGxldCByb3V0ZXJEaXNwb3NlZCA9IGZhbHNlO1xuICBsZXQgYWN0aXZlRW50cnlJZCA9IDA7XG4gIGxldCBsb2FkU3RhdGVWZXJzaW9uID0gMDtcbiAgY29uc3QgcHJlbG9hZGVkTWF0Y2hlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcmVsb2FkZWRQcmVwYXJlZE1hdGNoPFRDb250ZXh0Pj4oKTtcblxuICAvKipcbiAgICogQ29udmVydHMgYSBwYXJ0aWFsIGxvY2F0aW9uIG9iamVjdCBpbnRvIGEgZnVsbCBsb2NhdGlvbiBzdHJ1Y3R1cmUgd2l0aCBzdHJpbmcgZmllbGRzLlxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYXRpb24obG9jYXRpb246IHtcbiAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgIHNlYXJjaD86IHN0cmluZztcbiAgICBoYXNoPzogc3RyaW5nO1xuICB9KTogeyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g6IHN0cmluZzsgaGFzaDogc3RyaW5nIH0ge1xuICAgIGxldCBwYXRobmFtZVZhbHVlID0gJyc7XG4gICAgaWYgKHR5cGVvZiBsb2NhdGlvbi5wYXRobmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBhdGhuYW1lVmFsdWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9XG4gICAgbGV0IHNlYXJjaFZhbHVlID0gJyc7XG4gICAgaWYgKHR5cGVvZiBsb2NhdGlvbi5zZWFyY2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICBzZWFyY2hWYWx1ZSA9IGxvY2F0aW9uLnNlYXJjaDtcbiAgICB9XG4gICAgbGV0IGhhc2hWYWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24uaGFzaCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGhhc2hWYWx1ZSA9IGxvY2F0aW9uLmhhc2g7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwYXRobmFtZTogcGF0aG5hbWVWYWx1ZSxcbiAgICAgIHNlYXJjaDogc2VhcmNoVmFsdWUsXG4gICAgICBoYXNoOiBoYXNoVmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBFbWl0cyBhIHJvdXRlciBldmVudCB0byBldmVyeSByZWdpc3RlcmVkIGluc3RydW1lbnRhdGlvbi4gKi9cbiAgZnVuY3Rpb24gZW1pdEV2ZW50KGV2ZW50OiBSb3V0ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmIChyb3V0ZXJEaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWdpc3RyeS5lbWl0RXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIGNvZXJjZSBhbiBhcmJpdHJhcnkgc3RyaW5nIGludG8gYSBrbm93biBuYXZpZ2F0aW9uIHNvdXJjZS5cbiAgICovXG4gIGZ1bmN0aW9uIG1hcE9yaWdpbihyYXc/OiBzdHJpbmcpOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaXNSb3V0ZXJOYXZpZ2F0aW9uU291cmNlKHJhdykpIHtcbiAgICAgIHJldHVybiByYXc7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJPcGVyYXRvcnMgPSBuZXcgU2V0PHN0cmluZz4oRklMVEVSX09QRVJBVE9SUyk7XG5cbiAgLyoqIEhldXJpc3RpYzogZGV0ZWN0IGZpbHRlci1saWtlIG9iamVjdHMgd2hlbiBjYWxsZXJzIHBhc3MgZmlsdGVyIHJlY29yZHMgdG8gbmF2aWdhdGUuICovXG4gIGZ1bmN0aW9uIGxvb2tzTGlrZUZpbHRlcnModmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJlY29yZCA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3QgZmllbGRWYWx1ZSBvZiBPYmplY3QudmFsdWVzKHJlY29yZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZmllbGRWYWx1ZSAhPSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZpZWxkVmFsdWUpKSB7XG4gICAgICAgICAgaWYgKGZpbHRlck9wZXJhdG9ycy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG9yaWdpbiBmb3IgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBldmVudC5cbiAgICovXG4gIC8qKiBSZXNvbHZlcyB0aGUgbmF2aWdhdGlvbiBzb3VyY2UgY29tYmluaW5nIGhpc3RvcnkgY29udGV4dCBhbmQgcGVuZGluZyBpbnRlbnQuICovXG4gIGZ1bmN0aW9uIHJlc29sdmVOYXZpZ2F0aW9uT3JpZ2luKFxuICAgIGNvbnRleHQ/OiBIaXN0b3J5RGVidWdDb250ZXh0IHwgbnVsbCxcbiAgKTogUm91dGVyTmF2aWdhdGlvblNvdXJjZSB7XG4gICAgY29uc3QgZmFsbGJhY2tPcmlnaW4gPSBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbjtcbiAgICBsZXQgb3JpZ2luOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29udGV4dE9yaWdpbiA9IGNvbnRleHQ/Lm9yaWdpbjtcbiAgICBpZiAoY29udGV4dE9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcmlnaW4gPSBtYXBPcmlnaW4oY29udGV4dE9yaWdpbik7XG4gICAgfVxuXG4gICAgb3JpZ2luID8/PSBmYWxsYmFja09yaWdpbjtcbiAgICBvcmlnaW4gPz89ICdleHRlcm5hbCc7XG4gICAgcGVuZGluZ05hdmlnYXRpb25PcmlnaW4gPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG9yaWdpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgaW5uZXItbW9zdCBtYXRjaGVkIHJvdXRlIHBhdGggZnJvbSBhIHJvdXRlIGVudHJ5IHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgLyoqIFJldHVybnMgdGhlIGRlZXBlc3QgbWF0Y2hlZCByb3V0ZSBwYXRoIGZyb20gYSByb3V0ZSBlbnRyeSBpZiBhdmFpbGFibGUuICovXG4gIGZ1bmN0aW9uIHJlYWRNYXRjaGVkUm91dGVQYXRoKFxuICAgIGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PiB8IHVuZGVmaW5lZCxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hlZFJvdXRlID0gZW50cnkucm91dGU7XG4gICAgaWYgKG1hdGNoZWRSb3V0ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBtYXRjaGVkUm91dGUucm91dGUucm91dGVzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkUm91dGVzKSkge1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gY2hpbGRSb3V0ZXMuYXQoLTEpO1xuICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGxhc3RDaGlsZFJlY29yZCA9IGxhc3RDaGlsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gbGFzdENoaWxkUmVjb3JkLnBhdGg7XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBjaGlsZFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm9vdFBhdGggPSBtYXRjaGVkUm91dGUucm91dGUucGF0aDtcbiAgICBpZiAodHlwZW9mIHJvb3RQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJvb3RQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGRlZXBlc3QgYWN0aXZlIHF1ZXJ5IHNjaGVtYSBmb3IgYSBtYXRjaGVkIHJvdXRlLiAqL1xuICBmdW5jdGlvbiByZWFkQWN0aXZlUXVlcnlTY2hlbWEoXG4gICAgcm91dGU6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+Wydyb3V0ZSddLFxuICApOiBSb3V0ZXJRdWVyeVNjaGVtYSB7XG4gICAgcmV0dXJuIHJvdXRlPy5yb3V0ZS5yb3V0ZXMuYXQoLTEpPy5xdWVyeVNjaGVtYTtcbiAgfVxuXG4gIC8qKiBQYXJzZXMgcmF3IHF1ZXJ5IGFuZCB0eXBlZCBmaWx0ZXJzIGZvciB0aGUgcHJvdmlkZWQgc2VhcmNoIHN0cmluZy4gKi9cbiAgZnVuY3Rpb24gcGFyc2VTZWFyY2hTdGF0ZShcbiAgICBzZWFyY2g6IHN0cmluZyxcbiAgICBxdWVyeVNjaGVtYTogUm91dGVyUXVlcnlTY2hlbWEsXG4gICk6IFBhcnNlZFNlYXJjaFN0YXRlIHtcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICBpZiAocXVlcnlTY2hlbWEgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgcXVlcnkgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZpbHRlcnMoc2VhcmNoLCBxdWVyeVNjaGVtYSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgZmlsdGVyczogcGFyc2VkLmZpbHRlcnMsXG4gICAgICBmaWx0ZXJEaWFnbm9zdGljczogcGFyc2VkLmRpYWdub3N0aWNzLFxuICAgIH07XG4gIH1cblxuICAvKiogUmVhZHMgYSBwYWdlIG51bWJlciBmcm9tIGVpdGhlciBgcGFnZWAgb3IgYHBhZ2UuZXFgIGZpbHRlciBzaGFwZXMuICovXG4gIGZ1bmN0aW9uIHJlYWRQYWdlVmFsdWUoZmlsdGVycz86IFVua25vd25GaWx0ZXJzKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZmlsdGVycyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJhd1BhZ2UgPSBmaWx0ZXJzLnBhZ2U7XG4gICAgaWYgKHR5cGVvZiByYXdQYWdlID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHJhd1BhZ2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHJhd1BhZ2UgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHJhd1BhZ2UgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShyYXdQYWdlKSAmJlxuICAgICAgdHlwZW9mIChyYXdQYWdlIGFzIHsgZXE/OiB1bmtub3duIH0pLmVxID09PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgcmV0dXJuIChyYXdQYWdlIGFzIHsgZXE6IG51bWJlciB9KS5lcTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBOb3JtYWxpemVzIHRoZSBwYWdlIGZpbHRlciB0byBhIG1pbmltdW0gdmFsdWUgb2YgMSB3aGVuIHByZXNlbnQuICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2VGaWx0ZXJzKGZpbHRlcnM/OiBVbmtub3duRmlsdGVycyk6IHtcbiAgICBmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnM7XG4gICAgbm9ybWFsaXplZDogYm9vbGVhbjtcbiAgfSB7XG4gICAgY29uc3QgcGFnZVZhbHVlID0gcmVhZFBhZ2VWYWx1ZShmaWx0ZXJzKTtcbiAgICBpZiAocGFnZVZhbHVlID09IG51bGwgfHwgcGFnZVZhbHVlID49IDEgfHwgZmlsdGVycyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICBub3JtYWxpemVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgLi4uZmlsdGVycyxcbiAgICAgICAgcGFnZTogeyBlcTogMSB9LFxuICAgICAgfSxcbiAgICAgIG5vcm1hbGl6ZWQ6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0cyByb3V0ZXIgc2VhcmNoIHN0YXRlIGludG8gdGhlIG9iamVjdCBmb3J3YXJkZWQgdG8gYHByZXBhcmVgLiAqL1xuICBmdW5jdGlvbiBidWlsZFByZXBhcmVRdWVyeUlucHV0KFxuICAgIHN0YXRlOiBQYXJzZWRTZWFyY2hTdGF0ZSxcbiAgICBxdWVyeVNjaGVtYTogUm91dGVyUXVlcnlTY2hlbWEsXG4gICk6IFByZXBhcmVRdWVyeUlucHV0IHtcbiAgICBpZiAocXVlcnlTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN0YXRlLmZpbHRlcnMgPz8ge307XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZS5xdWVyeTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgYSByZXNvdXJjZSBzdGF0dXMgc2hvdWxkIG1ha2UgdGhlIGFjdGl2ZSByb3V0ZSBwZW5kaW5nLiAqL1xuICBmdW5jdGlvbiBpc1BlbmRpbmdTdGF0dXMoc3RhdHVzOiBSb3V0ZXJBY3RpdmVMb2FkU3RhdGVbJ3N0YXR1cyddKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gJ3BlbmRpbmcnO1xuICB9XG5cbiAgLyoqIFJldHVybnMgd2hldGhlciBhIHJlc291cmNlIHN0YXR1cyBzaG91bGQgbWFrZSB0aGUgYWN0aXZlIHJvdXRlIHJlamVjdGVkLiAqL1xuICBmdW5jdGlvbiBpc1JlamVjdGVkU3RhdHVzKHN0YXR1czogUm91dGVyQWN0aXZlTG9hZFN0YXRlWydzdGF0dXMnXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGF0dXMgPT09ICdyZWplY3RlZCc7XG4gIH1cblxuICAvKiogRGVyaXZlcyBhIHNlZ21lbnQtbGV2ZWwgc3RhdHVzIGZyb20gaXRzIHByZXBhcmUvY29kZSByZXNvdXJjZXMuICovXG4gIGZ1bmN0aW9uIGRlcml2ZVNlZ21lbnRTdGF0dXMoaW5wdXQ6IHtcbiAgICBwcmVwYXJlU3RhdHVzOiBSb3V0ZXJTZWdtZW50TG9hZFN0YXRlWydwcmVwYXJlU3RhdHVzJ107XG4gICAgY29kZVN0YXR1czogUm91dGVyU2VnbWVudExvYWRTdGF0ZVsnY29kZVN0YXR1cyddO1xuICB9KTogUm91dGVyQWN0aXZlTG9hZFN0YXRlWydzdGF0dXMnXSB7XG4gICAgaWYgKFxuICAgICAgaXNQZW5kaW5nU3RhdHVzKGlucHV0LnByZXBhcmVTdGF0dXMpIHx8XG4gICAgICBpc1BlbmRpbmdTdGF0dXMoaW5wdXQuY29kZVN0YXR1cylcbiAgICApIHtcbiAgICAgIHJldHVybiAncGVuZGluZyc7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGlzUmVqZWN0ZWRTdGF0dXMoaW5wdXQucHJlcGFyZVN0YXR1cykgfHxcbiAgICAgIGlzUmVqZWN0ZWRTdGF0dXMoaW5wdXQuY29kZVN0YXR1cylcbiAgICApIHtcbiAgICAgIHJldHVybiAncmVqZWN0ZWQnO1xuICAgIH1cbiAgICByZXR1cm4gJ3Jlc29sdmVkJztcbiAgfVxuXG4gIC8qKiBDYWxjdWxhdGVzIHRoZSBsb2FkIHN0YXRlIGZvciB0aGUgYWN0aXZlIHByZXBhcmVkIHJvdXRlIGNoYWluLiAqL1xuICBmdW5jdGlvbiBjYWxjdWxhdGVMb2FkU3RhdGUoXG4gICAgZW50cnk6IE9taXQ8Um91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4sICdhY3RpdmVMb2FkU3RhdGUnIHwgJ2xvYWRTdGF0ZSc+LFxuICAgIHZlcnNpb246IG51bWJlcixcbiAgKTogeyBhY3RpdmVMb2FkU3RhdGU6IFJvdXRlckFjdGl2ZUxvYWRTdGF0ZTsgbG9hZFN0YXRlOiBSb3V0ZXJMb2FkU3RhdGUgfSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBlbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgY29uc3QgcHJlcGFyZVN0YXR1cyA9IHNlZ21lbnQucHJlcGFyZWRSZXNvdXJjZT8uZ2V0U3RhdHVzKCkgPz8gJ2lkbGUnO1xuICAgICAgY29uc3QgY29kZVN0YXR1cyA9IHNlZ21lbnQucmVzb3VyY2VQYWdlPy5nZXRTdGF0dXMoKSA/PyAnaWRsZSc7XG4gICAgICBjb25zdCBzdGF0dXMgPSBkZXJpdmVTZWdtZW50U3RhdHVzKHsgcHJlcGFyZVN0YXR1cywgY29kZVN0YXR1cyB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IHNlZ21lbnQucGF0aCxcbiAgICAgICAgZnVsbFBhdGg6IHNlZ21lbnQuZnVsbFBhdGgsXG4gICAgICAgIHNlZ21lbnRJbmRleDogc2VnbWVudC5zZWdtZW50SW5kZXgsXG4gICAgICAgIHByZXBhcmVTdGF0dXMsXG4gICAgICAgIGNvZGVTdGF0dXMsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgcGVuZGluZ0NvdW50ID0gc2VnbWVudHMuZmlsdGVyKChzZWdtZW50KSA9PiB7XG4gICAgICByZXR1cm4gc2VnbWVudC5zdGF0dXMgPT09ICdwZW5kaW5nJztcbiAgICB9KS5sZW5ndGg7XG4gICAgY29uc3QgcmVqZWN0ZWRDb3VudCA9IHNlZ21lbnRzLmZpbHRlcigoc2VnbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHNlZ21lbnQuc3RhdHVzID09PSAncmVqZWN0ZWQnO1xuICAgIH0pLmxlbmd0aDtcbiAgICBsZXQgc3RhdHVzOiBSb3V0ZXJBY3RpdmVMb2FkU3RhdGVbJ3N0YXR1cyddID0gJ3Jlc29sdmVkJztcbiAgICBpZiAocGVuZGluZ0NvdW50ID4gMCkge1xuICAgICAgc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgIH0gZWxzZSBpZiAocmVqZWN0ZWRDb3VudCA+IDApIHtcbiAgICAgIHN0YXR1cyA9ICdyZWplY3RlZCc7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZUxvYWRTdGF0ZSA9IHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIHBlbmRpbmdDb3VudCxcbiAgICAgIHJlamVjdGVkQ291bnQsXG4gICAgICB2ZXJzaW9uLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGl2ZUxvYWRTdGF0ZSxcbiAgICAgIGxvYWRTdGF0ZToge1xuICAgICAgICAuLi5hY3RpdmVMb2FkU3RhdGUsXG4gICAgICAgIHNlZ21lbnRzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhIHJvdXRlIGVudHJ5IHdpdGggYSBmcmVzaGx5IGNhbGN1bGF0ZWQgYWN0aXZlIGxvYWQgc3RhdGUuICovXG4gIGZ1bmN0aW9uIHdpdGhMb2FkU3RhdGUoXG4gICAgZW50cnk6IE9taXQ8Um91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4sICdhY3RpdmVMb2FkU3RhdGUnIHwgJ2xvYWRTdGF0ZSc+LFxuICApOiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PiB7XG4gICAgY29uc3QgeyBhY3RpdmVMb2FkU3RhdGUsIGxvYWRTdGF0ZSB9ID0gY2FsY3VsYXRlTG9hZFN0YXRlKFxuICAgICAgZW50cnksXG4gICAgICBsb2FkU3RhdGVWZXJzaW9uLFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmVudHJ5LFxuICAgICAgYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgbG9hZFN0YXRlLFxuICAgIH07XG4gIH1cblxuICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBhY3RpdmUgcm91dGUgbG9hZCBzdGF0ZSBjaGFuZ2VkIGluIGEgbWVhbmluZ2Z1bCB3YXkuICovXG4gIGZ1bmN0aW9uIGlzU2FtZUFjdGl2ZUxvYWRTdGF0ZShcbiAgICBjdXJyZW50OiBSb3V0ZXJBY3RpdmVMb2FkU3RhdGUsXG4gICAgbmV4dDogUm91dGVyQWN0aXZlTG9hZFN0YXRlLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY3VycmVudC5zdGF0dXMgPT09IG5leHQuc3RhdHVzICYmXG4gICAgICBjdXJyZW50LnBlbmRpbmdDb3VudCA9PT0gbmV4dC5wZW5kaW5nQ291bnQgJiZcbiAgICAgIGN1cnJlbnQucmVqZWN0ZWRDb3VudCA9PT0gbmV4dC5yZWplY3RlZENvdW50XG4gICAgKTtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYSBzbmFwc2hvdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCByb3V0ZXIgZW50cnkuICovXG4gIGZ1bmN0aW9uIGJ1aWxkRW50cnlTbmFwc2hvdChcbiAgICBlbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4sXG4gICk6IFJvdXRlckVudHJ5U25hcHNob3Qge1xuICAgIGNvbnN0IHByZXBhcmVkU2VnbWVudHMgPSBlbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogc2VnbWVudC5wYXRoLFxuICAgICAgICBmdWxsUGF0aDogc2VnbWVudC5mdWxsUGF0aCxcbiAgICAgICAgc2VnbWVudEtleTogc2VnbWVudC5zZWdtZW50S2V5LFxuICAgICAgICBwYXJhbU5hbWVzOiBzZWdtZW50LnBhcmFtTmFtZXMsXG4gICAgICAgIHNlZ21lbnRJbmRleDogc2VnbWVudC5zZWdtZW50SW5kZXgsXG4gICAgICAgIHJvdXRlTm9kZTogc2VnbWVudC5yb3V0ZU5vZGUsXG4gICAgICAgIHByZXBhcmVkUmVzb3VyY2U6IHNlZ21lbnQucHJlcGFyZWRSZXNvdXJjZSxcbiAgICAgICAgcmVkaXJlY3RUbzogc2VnbWVudC5yZWRpcmVjdFRvLFxuICAgICAgICBzdXNwZW5zZUJvdW5kYXJ5OiBzZWdtZW50LnN1c3BlbnNlQm91bmRhcnksXG4gICAgICAgIGZhbGxiYWNrOiBzZWdtZW50LmZhbGxiYWNrLFxuICAgICAgICBoaWdobGlnaHRJZDogc2VnbWVudC5oaWdobGlnaHRJZCxcbiAgICAgICAgcXVlcnlTY2hlbWE6IHNlZ21lbnQucXVlcnlTY2hlbWEsXG4gICAgICAgIHByZXBhcmVkU3RhdHVzOiBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2U/LmdldFN0YXR1cygpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oZW50cnkubG9jYXRpb24pLFxuICAgICAgcm91dGVQYXRoOiByZWFkTWF0Y2hlZFJvdXRlUGF0aChlbnRyeSksXG4gICAgICBwcmVwYXJlZE1hdGNoOiB7XG4gICAgICAgIHNlZ21lbnRzOiBwcmVwYXJlZFNlZ21lbnRzLFxuICAgICAgICByb3V0ZXM6IHByZXBhcmVkU2VnbWVudHMsXG4gICAgICB9LFxuICAgICAgYWN0aXZlTG9hZFN0YXRlOiBlbnRyeS5hY3RpdmVMb2FkU3RhdGUsXG4gICAgICBsb2FkU3RhdGU6IGVudHJ5LmxvYWRTdGF0ZSxcbiAgICAgIGZpbHRlcnM6IGVudHJ5LmZpbHRlcnMsXG4gICAgICBmaWx0ZXJEaWFnbm9zdGljczogZW50cnkuZmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgICBhY3RpdmVRdWVyeVNjaGVtYTogZW50cnkuYWN0aXZlUXVlcnlTY2hlbWEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBOb3RpZmllcyBpbnN0cnVtZW50YXRpb25zIG9mIGEgbmV3IGFjdGl2ZSBlbnRyeS4gKi9cbiAgZnVuY3Rpb24gbm90aWZ5RW50cnkoZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+KTogdm9pZCB7XG4gICAgcmVnaXN0cnkubm90aWZ5RW50cnlDaGFuZ2UoYnVpbGRFbnRyeVNuYXBzaG90KGVudHJ5KSk7XG4gIH1cblxuICAvKiogQ3JlYXRlcyBhIGRlZHVwbGljYXRpb24ga2V5IGZvciBwcmVsb2FkIGV2ZW50cy4gKi9cbiAgZnVuY3Rpb24gYnVpbGRQcmVsb2FkS2V5KFxuICAgIG1vZGU6IFJvdXRlclByZWxvYWRNb2RlVmFsdWUsXG4gICAgcGF0aG5hbWU6IHN0cmluZyxcbiAgICBzZWFyY2ggPSAnJyxcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7bW9kZX06JHtwYXRobmFtZX0ke3NlYXJjaH1gO1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhIG5vcm1hbGl6ZWQgbG9va3VwIGtleSBmb3IgcHJlcGFyZWQgZnVsbC1yb3V0ZSBwcmVsb2Fkcy4gKi9cbiAgZnVuY3Rpb24gYnVpbGRQcmVsb2FkZWRNYXRjaEtleShwYXRobmFtZTogc3RyaW5nLCBzZWFyY2ggPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3BhdGhuYW1lfSR7c2VhcmNofWA7XG4gIH1cblxuICAvKiogQ29tcGFyZXMgcGF0aCBwYXJhbWV0ZXIgdmFsdWVzLCBpbmNsdWRpbmcgd2lsZGNhcmQgYXJyYXlzLiAqL1xuICBmdW5jdGlvbiBpc1BhcmFtVmFsdWVFcXVhbChcbiAgICBsZWZ0OiBQYXJhbURhdGFbc3RyaW5nXSxcbiAgICByaWdodDogUGFyYW1EYXRhW3N0cmluZ10sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxlZnQpIHx8IEFycmF5LmlzQXJyYXkocmlnaHQpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGVmdCkgfHwgIUFycmF5LmlzQXJyYXkocmlnaHQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChsZWZ0Lmxlbmd0aCAhPT0gcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZWZ0LmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSByaWdodFtpbmRleF07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0O1xuICB9XG5cbiAgLyoqIFJldHVybnMgd2hldGhlciB0d28gbWF0Y2hlZCByb3V0ZSBzbmFwc2hvdHMgZGVzY3JpYmUgdGhlIHNhbWUgcm91dGUgYW5kIHBhcmFtcy4gKi9cbiAgZnVuY3Rpb24gYXJlTWF0Y2hlZFJvdXRlc0VxdWl2YWxlbnQoXG4gICAgbGVmdDogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsLFxuICAgIHJpZ2h0OiBSb3V0ZXJNYXRjaGVkUm91dGU8UGFyYW1EYXRhPiB8IG51bGwsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChsZWZ0ID09PSByaWdodCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobGVmdC5yb3V0ZSAhPT0gcmlnaHQucm91dGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbGVmdEVudHJpZXMgPSBPYmplY3QuZW50cmllcyhsZWZ0LnBhcmFtcyk7XG4gICAgY29uc3QgcmlnaHRLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhyaWdodC5wYXJhbXMpKTtcbiAgICBpZiAobGVmdEVudHJpZXMubGVuZ3RoICE9PSByaWdodEtleXMuc2l6ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbGVmdEVudHJpZXMuZXZlcnkoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgcmV0dXJuIHJpZ2h0S2V5cy5oYXMoa2V5KSAmJiBpc1BhcmFtVmFsdWVFcXVhbCh2YWx1ZSwgcmlnaHQucGFyYW1zW2tleV0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEVtaXRzIGEgcHJlbG9hZCBvciBwcmVsb2FkLWNvZGUgaW5zdHJ1bWVudGF0aW9uIGV2ZW50LiAqL1xuICBmdW5jdGlvbiBlbWl0UHJlbG9hZEV2ZW50KFxuICAgIG1vZGU6ICdjb2RlJyB8ICdmdWxsJyxcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICAgIHNlYXJjaDogc3RyaW5nLFxuICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBrZXkgPSBidWlsZFByZWxvYWRLZXkobW9kZSwgcGF0aG5hbWUsIHNlYXJjaCk7XG4gICAgY29uc3QgcmVjZW50bHlSZWNvcmRlZCA9XG4gICAgICBsYXN0UHJlbG9hZFNpZ25hdHVyZSAhPT0gbnVsbCAmJlxuICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUua2V5ID09PSBrZXkgJiZcbiAgICAgIG5vdyAtIGxhc3RQcmVsb2FkU2lnbmF0dXJlLnRpbWVzdGFtcCA8IDUwO1xuXG4gICAgaWYgKCFyZWNlbnRseVJlY29yZGVkKSB7XG4gICAgICBlbWl0RXZlbnQoe1xuICAgICAgICBraW5kOiAncHJlbG9hZCcsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wOiBub3csXG4gICAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihoaXN0b3J5LmxvY2F0aW9uKSxcbiAgICAgICAgdGFyZ2V0UGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgICAgICBtb2RlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGFzdFByZWxvYWRTaWduYXR1cmUgPSB7IGtleSwgdGltZXN0YW1wOiBub3cgfTtcbiAgfVxuXG4gIC8qKiBFbWl0cyBhIGhpc3RvcnkgbXV0YXRpb24gZXZlbnQgKHB1c2gvcmVwbGFjZS9ub3JtYWxpemUpLiAqL1xuICBmdW5jdGlvbiBlbWl0SGlzdG9yeUV2ZW50KFxuICAgIGFjdGlvbjogUm91dGVySGlzdG9yeUFjdGlvblZhbHVlLFxuICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgICBsb2NhdGlvbjogeyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g/OiBzdHJpbmc7IGhhc2g/OiBzdHJpbmcgfSxcbiAgICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICk6IHZvaWQge1xuICAgIHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luID0gc291cmNlO1xuICAgIGVtaXRFdmVudCh7XG4gICAgICBraW5kOiAnaGlzdG9yeScsXG4gICAgICBzb3VyY2UsXG4gICAgICBhY3Rpb24sXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24obG9jYXRpb24pLFxuICAgICAgZGV0YWlscyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBFYWdlcmx5IHN0YXJ0cyBldmVyeSByZXNvdXJjZSBpbiBhIHByZXBhcmVkIHJvdXRlIGNoYWluLiAqL1xuICBmdW5jdGlvbiBsb2FkUHJlcGFyZWRNYXRjaFJlc291cmNlcyhcbiAgICBwcmVwYXJlZE1hdGNoVG9Mb2FkOiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PlsncHJlcGFyZWRNYXRjaCddLFxuICApOiB2b2lkIHtcbiAgICBwcmVwYXJlZE1hdGNoVG9Mb2FkLnNlZ21lbnRzLmZvckVhY2goKHJvdXRlKSA9PiB7XG4gICAgICBpZiAocm91dGUucHJlcGFyZWRSZXNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgcm91dGUucHJlcGFyZWRSZXNvdXJjZS5sb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGNhY2hlZCBmdWxsIHByZWxvYWQgaWYgaXQgaXMgc3RpbGwgdmFsaWQgZm9yIHRoZSBuYXZpZ2F0aW9uLiAqL1xuICBmdW5jdGlvbiBjb25zdW1lUHJlbG9hZGVkTWF0Y2goaW5wdXQ6IHtcbiAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIGNvbnRleHQ6IFRDb250ZXh0O1xuICAgIHJvdXRlOiBSb3V0ZXJNYXRjaGVkUm91dGU8UGFyYW1EYXRhPiB8IG51bGw7XG4gICAgcXVlcnlTY2hlbWE6IFJvdXRlclF1ZXJ5U2NoZW1hO1xuICB9KTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD5bJ3ByZXBhcmVkTWF0Y2gnXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRQcmVsb2FkZWRNYXRjaEtleShpbnB1dC5wYXRobmFtZSwgaW5wdXQuc2VhcmNoKTtcbiAgICBjb25zdCBjYWNoZWQgPSBwcmVsb2FkZWRNYXRjaGVzLmdldChrZXkpO1xuICAgIGlmIChjYWNoZWQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHJlbG9hZGVkTWF0Y2hlcy5kZWxldGUoa2V5KTtcbiAgICBpZiAoXG4gICAgICBjYWNoZWQuY29udGV4dCAhPT0gaW5wdXQuY29udGV4dCB8fFxuICAgICAgIWFyZU1hdGNoZWRSb3V0ZXNFcXVpdmFsZW50KGNhY2hlZC5yb3V0ZSwgaW5wdXQucm91dGUpIHx8XG4gICAgICBjYWNoZWQucXVlcnlTY2hlbWEgIT09IGlucHV0LnF1ZXJ5U2NoZW1hIHx8XG4gICAgICBjYWNoZWQuc2VhcmNoICE9PSBpbnB1dC5zZWFyY2hcbiAgICApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWQucHJlcGFyZWRNYXRjaDtcbiAgfVxuXG4gIC8vIEJ1aWxkIGEgZmxhdCBsaXN0IG9mIHJvdXRlcyBmb3IgZWZmaWNpZW50IG1hdGNoaW5nXG4gIGNvbnN0IGZsYXRSb3V0ZXMgPSBidWlsZFJvdXRlcyhyb3V0ZXMpO1xuXG4gIC8vIEZpbmQgdGhlIGluaXRpYWwgcm91dGUgbWF0Y2ggYW5kIHByZXBhcmUgaXQgZm9yIHJlbmRlcmluZ1xuICBjb25zdCByb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgY29uc3QgaW5pdGlhbFVuaWZpZWRTY2hlbWEgPSByZWFkQWN0aXZlUXVlcnlTY2hlbWEocm91dGUpO1xuICBjb25zdCBpbml0aWFsU2VhcmNoU3RhdGUgPSBwYXJzZVNlYXJjaFN0YXRlKFxuICAgIGhpc3RvcnkubG9jYXRpb24uc2VhcmNoLFxuICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICApO1xuICBjb25zdCBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMgPSBub3JtYWxpemVQYWdlRmlsdGVycyhcbiAgICBpbml0aWFsU2VhcmNoU3RhdGUuZmlsdGVycyxcbiAgKTtcbiAgY29uc3QgaW5pdGlhbExvY2F0aW9uU25hcHNob3QgPSBub3JtYWxpemVMb2NhdGlvbihoaXN0b3J5LmxvY2F0aW9uKTtcbiAgbGV0IGluaXRpYWxJbnN0cnVtZW50YXRpb246XG4gICAgfCB7XG4gICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHZvaWQ7XG4gICAgICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZTtcbiAgICAgICAgbG9jYXRpb246IFJvdXRlckxvY2F0aW9uU25hcHNob3Q7XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWQ7XG4gIGlmIChyb3V0ZSAhPSBudWxsKSB7XG4gICAgaW5pdGlhbEluc3RydW1lbnRhdGlvbiA9IHtcbiAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgICAgZW1pdEV2ZW50KGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICBzb3VyY2U6IGxhc3ROYXZpZ2F0aW9uT3JpZ2luLFxuICAgICAgbG9jYXRpb246IGluaXRpYWxMb2NhdGlvblNuYXBzaG90LFxuICAgIH07XG4gIH1cbiAgY29uc3QgaW5pdGlhbENvbnRleHQgPSByZXNvbHZlQ29udGV4dCgpO1xuICBjb25zdCBwcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgIHJvdXRlLFxuICAgIGJ1aWxkUHJlcGFyZVF1ZXJ5SW5wdXQoXG4gICAgICB7XG4gICAgICAgIC4uLmluaXRpYWxTZWFyY2hTdGF0ZSxcbiAgICAgICAgZmlsdGVyczogbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnMsXG4gICAgICB9LFxuICAgICAgaW5pdGlhbFVuaWZpZWRTY2hlbWEsXG4gICAgKSxcbiAgICBpbml0aWFsSW5zdHJ1bWVudGF0aW9uLFxuICAgIGluaXRpYWxDb250ZXh0LFxuICApO1xuXG4gIC8vIE1haW50YWluIGEgc2V0IG9mIHN1YnNjcmliZXJzIHRvIHRoZSBhY3RpdmUgcm91dGUgZW50cnlcbiAgbGV0IG5leHRJZCA9IDA7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgU3Vic2NyaWJlQ2FsbGJhY2s8UGFyYW1EYXRhLCBSb3V0ZXJRdWVyeVNjaGVtYSwgVENvbnRleHQ+XG4gID4oKTtcbiAgLy8gSGVscGVyIHRvIGJ1aWxkIHRoZSByYXcgcXVlcnkgb2JqZWN0IGZyb20gYSBzZWFyY2ggc3RyaW5nXG4gIGxldCBjdXJyZW50RW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+ID0gd2l0aExvYWRTdGF0ZSh7XG4gICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sXG4gICAgcm91dGUsXG4gICAgcHJlcGFyZWRNYXRjaCxcbiAgICBjb250ZXh0OiBpbml0aWFsQ29udGV4dCxcbiAgICByYXdTZWFyY2g6IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoLFxuICAgIHF1ZXJ5OiBpbml0aWFsU2VhcmNoU3RhdGUucXVlcnksXG4gICAgLy8gdHlwZWRRdWVyeSByZW1vdmVkICh1bmlmaWVkIGludG8gZmlsdGVycy9xdWVyeSlcbiAgICBmaWx0ZXJzOiBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyxcbiAgICBmaWx0ZXJEaWFnbm9zdGljczogaW5pdGlhbFNlYXJjaFN0YXRlLmZpbHRlckRpYWdub3N0aWNzLFxuICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgfSk7XG5cbiAgLy8gSW5pdGlhbCBub3JtYWxpemF0aW9uIHBhc3MgKGUuZy4sIGNsYW1wIHBhZ2UpXG4gIGlmIChcbiAgICBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMubm9ybWFsaXplZCAmJlxuICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwgJiZcbiAgICBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyAhPSBudWxsXG4gICkge1xuICAgIGN1cnJlbnRFbnRyeS5maWx0ZXJzID0gbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnM7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgZmlsdGVyczogbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnMsXG4gICAgICBxdWVyeTogaW5pdGlhbFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgcXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIH0pOyAvLyByZXR1cm5zICcnIG9yIHN0cmluZyBzdGFydGluZyB3aXRoICc/J1xuICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgZW1pdEhpc3RvcnlFdmVudChcbiAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9LFxuICAgICAgICB7IHJlYXNvbjogJ2luaXRpYWwtcGFnZS1jbGFtcCcgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBub3JtYWxpemVEZWJ1Z0NvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgIG9yaWdpbjogJ25vcm1hbGl6ZScsXG4gICAgICAgIHRyaWdnZXI6ICdub3JtYWxpemUnLFxuICAgICAgfTtcbiAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICAgIGRlYnVnQ29udGV4dDogbm9ybWFsaXplRGVidWdDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICAvLyBVcGRhdGUgY3VycmVudEVudHJ5LmxvY2F0aW9uIHRvIHJlZmxlY3QgbmV3IHNlYXJjaCBkaXJlY3RseSAoaGlzdG9yeS5zZXQgdHJpZ2dlcnMgYXN5bmMgc3Vic2NyaWJlcilcbiAgICAgIGN1cnJlbnRFbnRyeSA9IHdpdGhMb2FkU3RhdGUoe1xuICAgICAgICAuLi5jdXJyZW50RW50cnksXG4gICAgICAgIGxvY2F0aW9uOiB7IC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbiwgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoIH0sXG4gICAgICAgIHJhd1NlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgYWN0aXZlIHJvdXRlIGxvYWQtc3RhdGUgZXZlbnQuICovXG4gIGZ1bmN0aW9uIGVtaXRBY3RpdmVMb2FkU3RhdGVFdmVudChcbiAgICBlbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4sXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICApOiB2b2lkIHtcbiAgICBlbWl0RXZlbnQoe1xuICAgICAga2luZDogJ2FjdGl2ZS1sb2FkLXN0YXRlJyxcbiAgICAgIHNvdXJjZSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihlbnRyeS5sb2NhdGlvbiksXG4gICAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGVudHJ5KSxcbiAgICAgIHN0YXR1czogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnN0YXR1cyxcbiAgICAgIHBlbmRpbmdDb3VudDogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnBlbmRpbmdDb3VudCxcbiAgICAgIHJlamVjdGVkQ291bnQ6IGVudHJ5LmFjdGl2ZUxvYWRTdGF0ZS5yZWplY3RlZENvdW50LFxuICAgICAgdmVyc2lvbjogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnZlcnNpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKiogTm90aWZpZXMgUmVhY3Qgc3Vic2NyaWJlcnMgYW5kIGluc3RydW1lbnRhdGlvbiBlbnRyeSBvYnNlcnZlcnMuICovXG4gIGZ1bmN0aW9uIG5vdGlmeVN1YnNjcmliZXJzKGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0Pik6IHZvaWQge1xuICAgIHN1YnNjcmliZXJzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICBjYWxsYmFjayhlbnRyeSk7XG4gICAgfSk7XG4gICAgbm90aWZ5RW50cnkoZW50cnkpO1xuICB9XG5cbiAgLyoqIFJlZnJlc2hlcyB0aGUgYWN0aXZlIGVudHJ5IGFmdGVyIGEgcm91dGUgcmVzb3VyY2Ugc2V0dGxlcy4gKi9cbiAgZnVuY3Rpb24gcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShcbiAgICBlbnRyeUlkOiBudW1iZXIsXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICApOiB2b2lkIHtcbiAgICBpZiAocm91dGVyRGlzcG9zZWQgfHwgZW50cnlJZCAhPT0gYWN0aXZlRW50cnlJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gY2FsY3VsYXRlTG9hZFN0YXRlKGN1cnJlbnRFbnRyeSwgbG9hZFN0YXRlVmVyc2lvbik7XG4gICAgaWYgKFxuICAgICAgaXNTYW1lQWN0aXZlTG9hZFN0YXRlKGN1cnJlbnRFbnRyeS5hY3RpdmVMb2FkU3RhdGUsIG5leHQuYWN0aXZlTG9hZFN0YXRlKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2FkU3RhdGVWZXJzaW9uICs9IDE7XG4gICAgY29uc3QgcmVmcmVzaGVkID0gY2FsY3VsYXRlTG9hZFN0YXRlKGN1cnJlbnRFbnRyeSwgbG9hZFN0YXRlVmVyc2lvbik7XG4gICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgLi4uY3VycmVudEVudHJ5LFxuICAgICAgYWN0aXZlTG9hZFN0YXRlOiByZWZyZXNoZWQuYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgbG9hZFN0YXRlOiByZWZyZXNoZWQubG9hZFN0YXRlLFxuICAgIH07XG4gICAgbm90aWZ5U3Vic2NyaWJlcnMoY3VycmVudEVudHJ5KTtcbiAgICBlbWl0QWN0aXZlTG9hZFN0YXRlRXZlbnQoY3VycmVudEVudHJ5LCBzb3VyY2UpO1xuICB9XG5cbiAgLyoqIE9ic2VydmVzIHBlbmRpbmcgcmVzb3VyY2VzIGZvciB0aGUgYWN0aXZlIGVudHJ5IGFuZCByZXB1Ymxpc2hlcyBvbiBzZXR0bGUuICovXG4gIGZ1bmN0aW9uIG9ic2VydmVBY3RpdmVFbnRyeUxvYWQoXG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LFxuICAgIGVudHJ5SWQ6IG51bWJlcixcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICk6IHZvaWQge1xuICAgIGVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHMuZm9yRWFjaCgoc2VnbWVudCkgPT4ge1xuICAgICAgaWYgKHNlZ21lbnQucHJlcGFyZWRSZXNvdXJjZT8uZ2V0U3RhdHVzKCkgPT09ICdwZW5kaW5nJykge1xuICAgICAgICBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2UubG9hZCgpLnRoZW4oXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc2VnbWVudC5yZXNvdXJjZVBhZ2U/LmdldFN0YXR1cygpID09PSAncGVuZGluZycpIHtcbiAgICAgICAgc2VnbWVudC5yZXNvdXJjZVBhZ2UubG9hZCgpLnRoZW4oXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogUHVibGlzaGVzIGEgbmV3IGFjdGl2ZSByb3V0ZSBlbnRyeSBhbmQgc3RhcnRzIG9ic2VydmluZyBpdHMgcm91dGUgd29yay4gKi9cbiAgZnVuY3Rpb24gcHVibGlzaEVudHJ5KGlucHV0OiB7XG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+O1xuICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZTtcbiAgICBlbWl0U25hcHNob3Q6IGJvb2xlYW47XG4gIH0pOiB2b2lkIHtcbiAgICBhY3RpdmVFbnRyeUlkICs9IDE7XG4gICAgY3VycmVudEVudHJ5ID0gaW5wdXQuZW50cnk7XG4gICAgbm90aWZ5U3Vic2NyaWJlcnMoaW5wdXQuZW50cnkpO1xuICAgIGVtaXRBY3RpdmVMb2FkU3RhdGVFdmVudChpbnB1dC5lbnRyeSwgaW5wdXQuc291cmNlKTtcbiAgICBpZiAoaW5wdXQuZW1pdFNuYXBzaG90KSB7XG4gICAgICBlbWl0RXZlbnQoe1xuICAgICAgICBraW5kOiAnc25hcHNob3QnLFxuICAgICAgICBzb3VyY2U6IGlucHV0LnNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oaW5wdXQuZW50cnkubG9jYXRpb24pLFxuICAgICAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGlucHV0LmVudHJ5KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBvYnNlcnZlQWN0aXZlRW50cnlMb2FkKGlucHV0LmVudHJ5LCBhY3RpdmVFbnRyeUlkLCBpbnB1dC5zb3VyY2UpO1xuICB9XG5cbiAgcHVibGlzaEVudHJ5KHtcbiAgICBlbnRyeTogY3VycmVudEVudHJ5LFxuICAgIHNvdXJjZTogbGFzdE5hdmlnYXRpb25PcmlnaW4sXG4gICAgZW1pdFNuYXBzaG90OiB0cnVlLFxuICB9KTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGRpc3Bvc2VIaXN0b3J5ID0gaGlzdG9yeS5zdWJzY3JpYmUoXG4gICAgKGxvY2F0aW9uLCBmb3JjZVJlcmVuZGVyLCBkZWJ1Z0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbiA9IHJlc29sdmVOYXZpZ2F0aW9uT3JpZ2luKGRlYnVnQ29udGV4dCk7XG4gICAgICBsYXN0TmF2aWdhdGlvbk9yaWdpbiA9IG9yaWdpbjtcbiAgICAgIGNvbnN0IGxvY2F0aW9uUGF5bG9hZCA9IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKTtcblxuICAgICAgY29uc3QgZGVidWdDb250ZXh0T3JpZ2luID0gZGVidWdDb250ZXh0Py5vcmlnaW47XG4gICAgICBpZiAoZGVidWdDb250ZXh0T3JpZ2luICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGhpc3RvcnlEZXRhaWxzOiB7IGhpc3RvcnlJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgZGVidWdDb250ZXh0Py5oaXN0b3J5SW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaGlzdG9yeURldGFpbHMgPSB7IGhpc3RvcnlJbmRleDogZGVidWdDb250ZXh0Lmhpc3RvcnlJbmRleCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWJhY2snIHx8XG4gICAgICAgICAgZGVidWdDb250ZXh0T3JpZ2luID09PSAncG9wc3RhdGUtZm9yd2FyZCcgfHxcbiAgICAgICAgICBkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS11bmtub3duJyB8fFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ2V4dGVybmFsJ1xuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgZGlyZWN0aW9uOiAnYmFjaycgfCAnZm9yd2FyZCcgfCAndW5rbm93bicgPSAndW5rbm93bic7XG4gICAgICAgICAgaWYgKGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWJhY2snKSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24gPSAnYmFjayc7XG4gICAgICAgICAgfSBlbHNlIGlmIChkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS1mb3J3YXJkJykge1xuICAgICAgICAgICAgZGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0RXZlbnQoe1xuICAgICAgICAgICAga2luZDogJ3BvcHN0YXRlJyxcbiAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICAgIGRldGFpbHM6IGhpc3RvcnlEZXRhaWxzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbWVQYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICBjb25zdCBzYW1lU2VhcmNoID0gbG9jYXRpb24uc2VhcmNoID09PSBjdXJyZW50RW50cnkucmF3U2VhcmNoO1xuXG4gICAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgICAgLy8gTm90aGluZyBjaGFuZ2VkIHRoYXQgd2UgY2FyZSBhYm91dFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZXh0ID0gcmVzb2x2ZUNvbnRleHQoKTtcblxuICAgICAgLy8gSWYgb25seSB0aGUgc2VhcmNoIGNoYW5nZWQgd2Ugc3RpbGwgd2FudCB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZS5cbiAgICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgICBsZXQgbmV4dFByZXBhcmVkTWF0Y2ggPSBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaDtcbiAgICAgIGxldCBuZXh0Um91dGUgPSBjdXJyZW50RW50cnkucm91dGU7XG5cbiAgICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBsb2NhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHJhdyBxdWVyeSBvYmplY3QgKGJhc2ljIGFnZ3JlZ2F0aW9uKSBmcm9tIGxvY2F0aW9uLnNlYXJjaFxuICAgICAgY29uc3QgcXVlcnlTY2hlbWEgPSByZWFkQWN0aXZlUXVlcnlTY2hlbWEobmV4dFJvdXRlKTtcbiAgICAgIGNvbnN0IHBhcnNlZFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShsb2NhdGlvbi5zZWFyY2gsIHF1ZXJ5U2NoZW1hKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWx0ZXJzID0gbm9ybWFsaXplUGFnZUZpbHRlcnMocGFyc2VkU2VhcmNoU3RhdGUuZmlsdGVycyk7XG5cbiAgICAgIGNvbnN0IHNob3VsZFJlcHJlcGFyZSA9IHNob3VsZFByZXBhcmVPbk5hdmlnYXRpb24oe1xuICAgICAgICBzYW1lUGF0aG5hbWUsXG4gICAgICAgIHNhbWVTZWFyY2gsXG4gICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHNob3VsZFJlcHJlcGFyZSkge1xuICAgICAgICBjb25zdCBwcmVsb2FkZWRNYXRjaCA9IGNvbnN1bWVQcmVsb2FkZWRNYXRjaCh7XG4gICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgIHNlYXJjaDogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgICAgIGNvbnRleHQ6IG5leHRDb250ZXh0LFxuICAgICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgICAgcXVlcnlTY2hlbWEsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocHJlbG9hZGVkTWF0Y2ggIT0gbnVsbCkge1xuICAgICAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlbG9hZGVkTWF0Y2g7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHVwZGF0ZUluc3RydW1lbnRhdGlvbjpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV4dFJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHVwZGF0ZUluc3RydW1lbnRhdGlvbiA9IHtcbiAgICAgICAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGVtaXRFdmVudChldmVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luLFxuICAgICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25QYXlsb2FkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHJldXNlUHJlcGFyZWRTZWdtZW50czpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU2VnbWVudHM6IHR5cGVvZiBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cztcbiAgICAgICAgICAgICAgICBwcmV2aW91c1BhcmFtczogUGFyYW1EYXRhIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHNhbWVTZWFyY2g6IGJvb2xlYW47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAgICAgICByZXVzZVByZXBhcmVkU2VnbWVudHMgPSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2VnbWVudHM6IGN1cnJlbnRFbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzLFxuICAgICAgICAgICAgICBwcmV2aW91c1BhcmFtczogY3VycmVudEVudHJ5LnJvdXRlPy5wYXJhbXMsXG4gICAgICAgICAgICAgIHNhbWVTZWFyY2gsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgICAgICAgICAgbmV4dFJvdXRlLFxuICAgICAgICAgICAgYnVpbGRQcmVwYXJlUXVlcnlJbnB1dChcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLnBhcnNlZFNlYXJjaFN0YXRlLFxuICAgICAgICAgICAgICAgIGZpbHRlcnM6IG5vcm1hbGl6ZWRGaWx0ZXJzLmZpbHRlcnMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHF1ZXJ5U2NoZW1hLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHVwZGF0ZUluc3RydW1lbnRhdGlvbixcbiAgICAgICAgICAgIG5leHRDb250ZXh0LFxuICAgICAgICAgICAgcmV1c2VQcmVwYXJlZFNlZ21lbnRzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9hZFN0YXRlVmVyc2lvbiArPSAxO1xuICAgICAgY29uc3QgbmV4dEVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PiA9IHdpdGhMb2FkU3RhdGUoe1xuICAgICAgICBmb3JjZVJlcmVuZGVyOiBmb3JjZVJlcmVuZGVyIHx8IChzYW1lUGF0aG5hbWUgJiYgIXNhbWVTZWFyY2gpLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgICAgcHJlcGFyZWRNYXRjaDogbmV4dFByZXBhcmVkTWF0Y2gsXG4gICAgICAgIGNvbnRleHQ6IG5leHRDb250ZXh0LFxuICAgICAgICByYXdTZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgICAgcXVlcnk6IHBhcnNlZFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICBmaWx0ZXJEaWFnbm9zdGljczogcGFyc2VkU2VhcmNoU3RhdGUuZmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBxdWVyeVNjaGVtYSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiBub3JtYWxpemF0aW9uIGNoYW5nZWQgdGhlIHR5cGVkIHF1ZXJ5IHdlIHRyaWdnZXIgYSByZXBsYWNlIHdpdGggbm9ybWFsaXplZCBzZWFyY2hcbiAgICAgIGlmIChub3JtYWxpemVkRmlsdGVycy5ub3JtYWxpemVkICYmIHF1ZXJ5U2NoZW1hICE9IG51bGwpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgICAgIGZpbHRlcnM6IG5vcm1hbGl6ZWRGaWx0ZXJzLmZpbHRlcnMsXG4gICAgICAgICAgcXVlcnk6IHBhcnNlZFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgICAgIHF1ZXJ5U2NoZW1hLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgICAgIGxldCBuZXh0U2VhcmNoU3RyID0gbm9ybWFsaXplZFNlYXJjaDtcbiAgICAgICAgICBpZiAoIW5leHRTZWFyY2hTdHIuc3RhcnRzV2l0aCgnPycpICYmIG5leHRTZWFyY2hTdHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbmV4dFNlYXJjaFN0ciA9IGA/JHtuZXh0U2VhcmNoU3RyfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVtaXRIaXN0b3J5RXZlbnQoXG4gICAgICAgICAgICAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgICAgIHNlYXJjaDogbmV4dFNlYXJjaFN0cixcbiAgICAgICAgICAgICAgaGFzaDogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyByZWFzb246ICdydW50aW1lLXBhZ2UtY2xhbXAnIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBydW50aW1lTm9ybWFsaXplQ29udGV4dDogSGlzdG9yeURlYnVnQ29udGV4dCA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICB0cmlnZ2VyOiAnbm9ybWFsaXplJyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICAgIHNlYXJjaDogbmV4dFNlYXJjaFN0cixcbiAgICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICAgICAgZGVidWdDb250ZXh0OiBydW50aW1lTm9ybWFsaXplQ29udGV4dCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47IC8vIGVhcmx5OiBzdWJzZXF1ZW50IHNldCB3aWxsIHRyaWdnZXIgcmVydW5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwdWJsaXNoRW50cnkoe1xuICAgICAgICBlbnRyeTogbmV4dEVudHJ5LFxuICAgICAgICBzb3VyY2U6IG9yaWdpbixcbiAgICAgICAgZW1pdFNuYXBzaG90OiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgKTtcblxuICAvKiogTm9ybWFsaXplcyB1c2VyLXByb3ZpZGVkIHByZWxvYWQgdGFyZ2V0cyBpbnRvIGNvbnNpc3RlbnQgc3RydWN0dXJlcy4gKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUHJlbG9hZFRhcmdldCh0YXJnZXQ6IFByZWxvYWRUYXJnZXQpOiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g6IHN0cmluZztcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gIH0ge1xuICAgIGxldCBub3JtYWxpemVkUGF0aG5hbWUgPSBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0LnBhdGhuYW1lID09PSAnc3RyaW5nJyAmJiB0YXJnZXQucGF0aG5hbWUubGVuZ3RoID4gMCkge1xuICAgICAgbm9ybWFsaXplZFBhdGhuYW1lID0gdGFyZ2V0LnBhdGhuYW1lO1xuICAgIH1cblxuICAgIGxldCBub3JtYWxpemVkU2VhcmNoID0gJyc7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQuc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgbm9ybWFsaXplZFNlYXJjaCA9IHRhcmdldC5zZWFyY2g7XG4gICAgfVxuXG4gICAgbGV0IG5vcm1hbGl6ZWRTb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgPSAncHJvZ3JhbW1hdGljJztcbiAgICBjb25zdCBtYXBwZWRTb3VyY2UgPSBtYXBPcmlnaW4odGFyZ2V0LnNvdXJjZSk7XG4gICAgaWYgKG1hcHBlZFNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBub3JtYWxpemVkU291cmNlID0gbWFwcGVkU291cmNlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRobmFtZSxcbiAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgIHNvdXJjZTogbm9ybWFsaXplZFNvdXJjZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByZXBhcmVkIHZhbHVlIGZvciB0aGUgZmlyc3QgYWN0aXZlIHNlZ21lbnQgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm91dGUgc2VnbWVudCBwYXRoIG9yIGZ1bGwgcGF0aCB0byBpbnNwZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UHJlcGFyZWQocGF0aDogc3RyaW5nKTogdW5rbm93biB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gY3VycmVudEVudHJ5O1xuICAgICAgZm9yIChjb25zdCBwcmVwYXJlZFJvdXRlIG9mIGVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHMpIHtcbiAgICAgICAgaWYgKHByZXBhcmVkUm91dGUucGF0aCA9PT0gcGF0aCB8fCBwcmVwYXJlZFJvdXRlLmZ1bGxQYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXBhcmVkUm91dGUucHJlcGFyZWRSZXNvdXJjZT8uZ2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV2ZXJ5IGFjdGl2ZSBwcmVwYXJlZCBzZWdtZW50IG1hdGNoaW5nIHRoZSBwcm92aWRlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJvdXRlIHNlZ21lbnQgcGF0aCBvciBmdWxsIHBhdGggdG8gaW5zcGVjdC5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFByZXBhcmVkU2VnbWVudHMocGF0aDogc3RyaW5nKTogUHJlcGFyZWRSb3V0ZVNlZ21lbnRTbmFwc2hvdFtdIHtcbiAgICByZXR1cm4gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHNcbiAgICAgIC5maWx0ZXIoKHByZXBhcmVkUm91dGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZXBhcmVkUm91dGUucGF0aCA9PT0gcGF0aCB8fCBwcmVwYXJlZFJvdXRlLmZ1bGxQYXRoID09PSBwYXRoO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKHByZXBhcmVkUm91dGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXRoOiBwcmVwYXJlZFJvdXRlLnBhdGgsXG4gICAgICAgICAgZnVsbFBhdGg6IHByZXBhcmVkUm91dGUuZnVsbFBhdGgsXG4gICAgICAgICAgc2VnbWVudEtleTogcHJlcGFyZWRSb3V0ZS5zZWdtZW50S2V5LFxuICAgICAgICAgIHBhcmFtTmFtZXM6IHByZXBhcmVkUm91dGUucGFyYW1OYW1lcyxcbiAgICAgICAgICBzZWdtZW50SW5kZXg6IHByZXBhcmVkUm91dGUuc2VnbWVudEluZGV4LFxuICAgICAgICAgIHJvdXRlTm9kZTogcHJlcGFyZWRSb3V0ZS5yb3V0ZU5vZGUsXG4gICAgICAgICAgcHJlcGFyZWRSZXNvdXJjZTogcHJlcGFyZWRSb3V0ZS5wcmVwYXJlZFJlc291cmNlLFxuICAgICAgICAgIHJlZGlyZWN0VG86IHByZXBhcmVkUm91dGUucmVkaXJlY3RUbyxcbiAgICAgICAgICByZXNvdXJjZVBhZ2U6IHByZXBhcmVkUm91dGUucmVzb3VyY2VQYWdlLFxuICAgICAgICAgIHN1c3BlbnNlQm91bmRhcnk6IHByZXBhcmVkUm91dGUuc3VzcGVuc2VCb3VuZGFyeSxcbiAgICAgICAgICBmYWxsYmFjazogcHJlcGFyZWRSb3V0ZS5mYWxsYmFjayxcbiAgICAgICAgICBoaWdobGlnaHRJZDogcHJlcGFyZWRSb3V0ZS5oaWdobGlnaHRJZCxcbiAgICAgICAgICBxdWVyeVNjaGVtYTogcHJlcGFyZWRSb3V0ZS5xdWVyeVNjaGVtYSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICBoaXN0b3J5LFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50RW50cnk7XG4gICAgfSxcbiAgICBwcmVsb2FkQ29kZSh0YXJnZXQpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQcmVsb2FkVGFyZ2V0KHRhcmdldCk7XG4gICAgICBlbWl0UHJlbG9hZEV2ZW50KFxuICAgICAgICAnY29kZScsXG4gICAgICAgIG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgICBub3JtYWxpemVkLnNvdXJjZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4uaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1hdGNoZXMucm91dGUucm91dGVzLmZvckVhY2goKHsgcmVzb3VyY2VQYWdlIH0pID0+IHtcbiAgICAgICAgaWYgKHJlc291cmNlUGFnZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgcmVzb3VyY2VQYWdlLmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlbG9hZCh0YXJnZXQpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQcmVsb2FkVGFyZ2V0KHRhcmdldCk7XG4gICAgICBlbWl0UHJlbG9hZEV2ZW50KFxuICAgICAgICAnZnVsbCcsXG4gICAgICAgIG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgICBub3JtYWxpemVkLnNvdXJjZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4uaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvY2F0aW9uU25hcHNob3Q6IFJvdXRlckxvY2F0aW9uU25hcHNob3QgPSB7XG4gICAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgICBoYXNoOiAnJyxcbiAgICAgIH07XG4gICAgICBsZXQgaW5zdHJ1bWVudGF0aW9uOlxuICAgICAgICB8IHtcbiAgICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHZvaWQ7XG4gICAgICAgICAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gICAgICAgICAgICBsb2NhdGlvbjogUm91dGVyTG9jYXRpb25TbmFwc2hvdDtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG1hdGNoZXMgIT0gbnVsbCkge1xuICAgICAgICBpbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4ge1xuICAgICAgICAgICAgZW1pdEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvdXJjZTogbm9ybWFsaXplZC5zb3VyY2UsXG4gICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uU25hcHNob3QsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwcmVsb2FkQ29udGV4dCA9IHJlc29sdmVDb250ZXh0KCk7XG4gICAgICBjb25zdCBwcmVsb2FkUXVlcnlTY2hlbWEgPSByZWFkQWN0aXZlUXVlcnlTY2hlbWEobWF0Y2hlcyk7XG4gICAgICBjb25zdCBwcmVsb2FkU2VhcmNoU3RhdGUgPSBwYXJzZVNlYXJjaFN0YXRlKFxuICAgICAgICBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgICAgcHJlbG9hZFF1ZXJ5U2NoZW1hLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2goXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIGJ1aWxkUHJlcGFyZVF1ZXJ5SW5wdXQocHJlbG9hZFNlYXJjaFN0YXRlLCBwcmVsb2FkUXVlcnlTY2hlbWEpLFxuICAgICAgICBpbnN0cnVtZW50YXRpb24sXG4gICAgICAgIHByZWxvYWRDb250ZXh0LFxuICAgICAgKTtcbiAgICAgIGxvYWRQcmVwYXJlZE1hdGNoUmVzb3VyY2VzKHByZXBhcmVkTWF0Y2gpO1xuICAgICAgY29uc3QgcHJlbG9hZEtleSA9IGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkoXG4gICAgICAgIG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgKTtcbiAgICAgIHByZWxvYWRlZE1hdGNoZXMuc2V0KHByZWxvYWRLZXksIHtcbiAgICAgICAga2V5OiBwcmVsb2FkS2V5LFxuICAgICAgICBjb250ZXh0OiBwcmVsb2FkQ29udGV4dCxcbiAgICAgICAgcm91dGU6IG1hdGNoZXMsXG4gICAgICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgICAgIHF1ZXJ5U2NoZW1hOiBwcmVsb2FkUXVlcnlTY2hlbWEsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZC5zZWFyY2gsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgbmV4dElkICs9IDE7XG4gICAgICBjb25zdCBpZCA9IG5leHRJZDtcbiAgICAgIC8qKiBSZW1vdmVzIHRoZSBzdWJzY3JpYmVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB2aWEgc3Vic2NyaWJlLiAqL1xuICAgICAgZnVuY3Rpb24gZGlzcG9zZUNhbGxiYWNrKCkge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgICAgc3Vic2NyaWJlcnMuc2V0KGlkLCBjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZGlzcG9zZUNhbGxiYWNrO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIGZpbHRlcnM6IG5hdkZpbHRlcnMsXG4gICAgICByZXBsYWNlLFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBVbmtub3duUXVlcnlTaGFwZTtcbiAgICAgIGZpbHRlcnM/OiBVbmtub3duRmlsdGVycztcbiAgICAgIHJlcGxhY2U/OiBib29sZWFuO1xuICAgIH0pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBjdXJyZW50RW50cnk7XG4gICAgICBsZXQgdGFyZ2V0UGF0aG5hbWUgPSBwYXRobmFtZTtcbiAgICAgIHRhcmdldFBhdGhuYW1lID8/PSBjdXJyZW50LmxvY2F0aW9uLnBhdGhuYW1lO1xuXG4gICAgICBjb25zdCBkZXN0aW5hdGlvblJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4uaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLFxuICAgICAgfSk7XG4gICAgICBsZXQgZGVzdFNjaGVtYSA9IHJlYWRBY3RpdmVRdWVyeVNjaGVtYShkZXN0aW5hdGlvblJvdXRlKTtcbiAgICAgIGRlc3RTY2hlbWEgPSBkZXN0U2NoZW1hID8/IGN1cnJlbnQuYWN0aXZlUXVlcnlTY2hlbWE7XG5cbiAgICAgIGNvbnN0IGhhc1NjaGVtYSA9IGRlc3RTY2hlbWEgIT0gbnVsbDtcbiAgICAgIGNvbnN0IHVzZVF1ZXJ5QXNGaWx0ZXJzID1cbiAgICAgICAgbmF2RmlsdGVycyA9PSBudWxsICYmXG4gICAgICAgIGhhc1NjaGVtYSAmJlxuICAgICAgICBxdWVyeSAhPSBudWxsICYmXG4gICAgICAgIGxvb2tzTGlrZUZpbHRlcnMocXVlcnkpO1xuICAgICAgbGV0IGZpbHRlcnNJbnB1dCA9IG5hdkZpbHRlcnM7XG4gICAgICBpZiAoZmlsdGVyc0lucHV0ID09IG51bGwpIHtcbiAgICAgICAgaWYgKHVzZVF1ZXJ5QXNGaWx0ZXJzKSB7XG4gICAgICAgICAgZmlsdGVyc0lucHV0ID0gcXVlcnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsdGVyc0lucHV0ID0gY3VycmVudC5maWx0ZXJzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgcmF3UXVlcnlJbnB1dDogVW5rbm93blF1ZXJ5U2hhcGUgfCBSYXdRdWVyeSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh1c2VRdWVyeUFzRmlsdGVycykge1xuICAgICAgICByYXdRdWVyeUlucHV0ID0gY3VycmVudC5xdWVyeTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhd1F1ZXJ5SW5wdXQgPSBxdWVyeSA/PyBjdXJyZW50LnF1ZXJ5O1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICAgIGZpbHRlcnM6IGZpbHRlcnNJbnB1dCxcbiAgICAgICAgcXVlcnk6IHJhd1F1ZXJ5SW5wdXQsXG4gICAgICAgIHF1ZXJ5U2NoZW1hOiBkZXN0U2NoZW1hLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHsgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgICBjb25zdCBvcmlnaW46IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgPSAncHJvZ3JhbW1hdGljJztcbiAgICAgIGNvbnN0IGRlYnVnQ29udGV4dDogSGlzdG9yeURlYnVnQ29udGV4dCA9IHtcbiAgICAgICAgb3JpZ2luLFxuICAgICAgICB0cmlnZ2VyOiAncHJvZ3JhbW1hdGljJyxcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZXBsYWNlID09PSB0cnVlKSB7XG4gICAgICAgIGVtaXRIaXN0b3J5RXZlbnQoJ3JlcGxhY2UnLCBvcmlnaW4sIGxvY2F0aW9uT2JqLCB7XG4gICAgICAgICAgdHJpZ2dlcjogJ3Byb2dyYW1tYXRpYycsXG4gICAgICAgIH0pO1xuICAgICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgICAgLi4ubG9jYXRpb25PYmosXG4gICAgICAgICAgZGVidWdDb250ZXh0LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVtaXRIaXN0b3J5RXZlbnQoJ3B1c2gnLCBvcmlnaW4sIGxvY2F0aW9uT2JqLCB7XG4gICAgICAgICAgdHJpZ2dlcjogJ3Byb2dyYW1tYXRpYycsXG4gICAgICAgIH0pO1xuICAgICAgICBoaXN0b3J5LnB1c2goe1xuICAgICAgICAgIC4uLmxvY2F0aW9uT2JqLFxuICAgICAgICAgIGRlYnVnQ29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRQcmVwYXJlZCxcbiAgICBnZXRQcmVwYXJlZFNlZ21lbnRzLFxuICB9IGFzIENyZWF0ZVJvdXRlclJldHVybjxUQ29udGV4dCwgUj5bJ2NvbnRleHQnXTtcblxuICAvKiogUmVsZWFzZXMgcm91dGVyIHJlc291cmNlcyBhbmQgZGV0YWNoZXMgYWxsIGluc3RydW1lbnRhdGlvbnMuICovXG4gIGZ1bmN0aW9uIGNsZWFudXAoKTogdm9pZCB7XG4gICAgaWYgKHJvdXRlckRpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvdXRlckRpc3Bvc2VkID0gdHJ1ZTtcbiAgICBkaXNwb3NlSGlzdG9yeSgpO1xuICAgIGhpc3RvcnkuZGlzcG9zZSgpO1xuICAgIHN1YnNjcmliZXJzLmNsZWFyKCk7XG4gICAgcmVnaXN0cnkuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUmV0dXJuIGJvdGggdGhlIGNvbnRleHQgb2JqZWN0IGFuZCBhIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuIHsgY29udGV4dCwgY2xlYW51cCB9O1xufVxuIl19
|