cdk-nextjs 0.7.6 → 0.7.8
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/.jsii +3 -3
- package/.jsii.tabl.json +1 -1
- package/README.md +12 -3
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
- package/docs/adapter-runtime.md +1 -1
- package/docs/caching-guide.md +11 -1
- package/docs/harness-coverage.md +154 -73
- package/lib/adapter/adapter.mjs +12 -3
- package/lib/adapter/aws-cache-store.d.ts +221 -3
- package/lib/adapter/aws-cache-store.js +481 -35
- package/lib/adapter/aws-cache-store.test.js +706 -3
- package/lib/adapter/cache-handler.d.ts +5 -3
- package/lib/adapter/cache-handler.js +16 -10
- package/lib/adapter/cache-handler.mjs +517 -49
- package/lib/adapter/cache-handler.test.js +44 -1
- package/lib/adapter/cache-utils.d.ts +22 -0
- package/lib/adapter/cache-utils.js +44 -1
- package/lib/adapter/function-groups.js +17 -4
- package/lib/adapter/function-groups.test.js +33 -1
- package/lib/adapter/memory-cache-handler.d.ts +5 -1
- package/lib/adapter/memory-cache-handler.js +6 -2
- package/lib/adapter/s3-cache-handler.d.ts +12 -1
- package/lib/adapter/s3-cache-handler.js +30 -8
- package/lib/adapter/s3-cache-handler.test.js +84 -2
- package/lib/adapter/use-cache-common.d.ts +66 -1
- package/lib/adapter/use-cache-common.js +142 -19
- package/lib/adapter/use-cache-common.test.js +174 -1
- package/lib/adapter/use-cache-default-handler.js +36 -6
- package/lib/adapter/use-cache-default-handler.mjs +553 -47
- package/lib/adapter/use-cache-handlers.test.js +247 -7
- package/lib/adapter/use-cache-remote-handler.js +9 -7
- package/lib/adapter/use-cache-remote-handler.mjs +542 -45
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.js +1 -1
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/core.js +20 -4
- package/lib/runtime/core.test.js +17 -1
- package/lib/runtime/image-utils.d.ts +8 -9
- package/lib/runtime/image-utils.js +16 -1
- package/lib/runtime/image-utils.test.js +13 -1
- package/lib/runtime/image.js +9 -3
- package/lib/runtime/lambda.mjs +66 -18
- package/lib/runtime/server.mjs +66 -18
- package/lib/runtime/tag-manifest.d.ts +40 -0
- package/lib/runtime/tag-manifest.js +59 -0
- package/lib/runtime/tag-manifest.test.d.ts +1 -0
- package/lib/runtime/tag-manifest.test.js +47 -0
- package/package.json +3 -3
- package/scripts/e2e-deploy.sh +7 -2
- package/scripts/e2e-harness/README.md +72 -35
- package/scripts/e2e-harness/screen.mjs +148 -7
- package/scripts/playwright-install-deps.sh +40 -0
|
@@ -295,15 +295,26 @@ class S3CacheHandler {
|
|
|
295
295
|
* request is answered from the stale entry - stale-while-revalidate - and that
|
|
296
296
|
* response carries the entry's original `s-maxage`, so the edge caches the
|
|
297
297
|
* stale body again. The background render that replaces it runs in this same
|
|
298
|
-
* process, so `set` checks
|
|
298
|
+
* process, so `set` checks for the key here and invalidates the key's paths a second
|
|
299
299
|
* time once the fresh entry is in S3. Without that, the edge kept serving the
|
|
300
300
|
* pre-revalidation page for the whole `s-maxage`.
|
|
301
301
|
*
|
|
302
302
|
* Expiring soft-revalidated entries outright instead would also keep the edge
|
|
303
303
|
* right, but it turns every `revalidateTag(tag, "max")` into a blocking render
|
|
304
304
|
* at the origin, which is the thing a profile asks not to happen.
|
|
305
|
+
*
|
|
306
|
+
* When the re-render fails, next 16.4's `retainPreviousCacheEntry` writes the
|
|
307
|
+
* stale value back with a short lifetime: that is no regeneration, so the key
|
|
308
|
+
* keeps waiting rather than invalidating the edge for a page that has not
|
|
309
|
+
* changed. {@link servedStale} is how `set` recognises it.
|
|
305
310
|
*/
|
|
306
311
|
softRevalidatedKeys = new Set();
|
|
312
|
+
/**
|
|
313
|
+
* Every value handed out stale, by identity: the object `get` returned is the
|
|
314
|
+
* one `retainPreviousCacheEntry` writes back. Weak, so a page body is held no
|
|
315
|
+
* longer than the memory layer or the request holds it.
|
|
316
|
+
*/
|
|
317
|
+
servedStale = new WeakSet();
|
|
307
318
|
/** @see buildTagManifest */
|
|
308
319
|
buildTags;
|
|
309
320
|
constructor(options) {
|
|
@@ -384,13 +395,19 @@ class S3CacheHandler {
|
|
|
384
395
|
// the last good copy rather than from a shell.
|
|
385
396
|
return isFetchCacheGet(ctx)
|
|
386
397
|
? null
|
|
387
|
-
: {
|
|
398
|
+
: {
|
|
399
|
+
lastModified: EXPIRED_LAST_MODIFIED,
|
|
400
|
+
value: parsedValue.value,
|
|
401
|
+
cacheControl: (0, cache_utils_1.storedCacheControl)(parsedValue.cacheControl),
|
|
402
|
+
};
|
|
388
403
|
}
|
|
389
404
|
this.debug(`S3 CACHE HIT: ${cacheKey} (${objectKey})`);
|
|
390
|
-
// Without the stored tags.
|
|
405
|
+
// Without the stored tags. With the stored lifetime: see
|
|
406
|
+
// `getCacheControl`.
|
|
391
407
|
return {
|
|
392
408
|
lastModified: parsedValue.lastModified,
|
|
393
409
|
value: parsedValue.value,
|
|
410
|
+
cacheControl: (0, cache_utils_1.storedCacheControl)(parsedValue.cacheControl),
|
|
394
411
|
};
|
|
395
412
|
}
|
|
396
413
|
catch (error) {
|
|
@@ -437,7 +454,7 @@ class S3CacheHandler {
|
|
|
437
454
|
}
|
|
438
455
|
const state = await this.checkIfRevalidated(entry.lastModified ?? 0, checkTags);
|
|
439
456
|
if (state === "stale" && !isFetchCacheGet(ctx)) {
|
|
440
|
-
this.noteSoftRevalidated(cacheKey);
|
|
457
|
+
this.noteSoftRevalidated(cacheKey, entry.value);
|
|
441
458
|
}
|
|
442
459
|
return state === "expired";
|
|
443
460
|
}
|
|
@@ -446,14 +463,17 @@ class S3CacheHandler {
|
|
|
446
463
|
* whose copy of it will need invalidating again. See
|
|
447
464
|
* {@link softRevalidatedKeys}.
|
|
448
465
|
*/
|
|
449
|
-
noteSoftRevalidated(cacheKey) {
|
|
466
|
+
noteSoftRevalidated(cacheKey, value) {
|
|
450
467
|
if (!this.invalidatesCdn) {
|
|
451
468
|
return;
|
|
452
469
|
}
|
|
470
|
+
if (typeof value === "object" && value !== null) {
|
|
471
|
+
this.servedStale.add(value);
|
|
472
|
+
}
|
|
453
473
|
this.softRevalidatedKeys.delete(cacheKey);
|
|
454
474
|
if (this.softRevalidatedKeys.size >= MAX_SOFT_REVALIDATED_KEYS) {
|
|
455
475
|
// Insertion order: the first key is the one waiting longest.
|
|
456
|
-
const oldest = this.softRevalidatedKeys.
|
|
476
|
+
const oldest = this.softRevalidatedKeys.keys().next().value;
|
|
457
477
|
if (oldest !== undefined) {
|
|
458
478
|
this.softRevalidatedKeys.delete(oldest);
|
|
459
479
|
}
|
|
@@ -506,6 +526,7 @@ class S3CacheHandler {
|
|
|
506
526
|
// On the marker clock, since that is what it is compared with.
|
|
507
527
|
lastModified: (0, aws_cache_store_1.markerClock)(),
|
|
508
528
|
value: data,
|
|
529
|
+
cacheControl: (0, cache_utils_1.getCacheControl)(ctx),
|
|
509
530
|
};
|
|
510
531
|
// Store tags with the cache entry for revalidation checking
|
|
511
532
|
const cacheEntryWithTags = {
|
|
@@ -520,7 +541,8 @@ class S3CacheHandler {
|
|
|
520
541
|
// The regeneration of an entry served stale: CloudFront may have cached
|
|
521
542
|
// that stale response after `revalidateTag`'s invalidation, so the key's
|
|
522
543
|
// paths go once more now that S3 holds the fresh one.
|
|
523
|
-
if (this.
|
|
544
|
+
if (!this.servedStale.has(data) &&
|
|
545
|
+
this.softRevalidatedKeys.delete(cacheKey)) {
|
|
524
546
|
const route = this.s3KeyToInvalidationPath(s3Key);
|
|
525
547
|
if (route !== undefined) {
|
|
526
548
|
this.debug(`SOFT REVALIDATION REGENERATED: ${cacheKey}`);
|
|
@@ -1015,4 +1037,4 @@ class S3CacheHandler {
|
|
|
1015
1037
|
}
|
|
1016
1038
|
}
|
|
1017
1039
|
exports.S3CacheHandler = S3CacheHandler;
|
|
1018
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtY2FjaGUtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL3MzLWNhY2hlLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0VBRUU7QUFDRixzREFBc0Q7QUFDdEQsNkNBQXlDO0FBQ3pDLHFDQUF1QztBQUN2Qyw2Q0FBNEM7QUFDNUMseUNBQWlDO0FBQ2pDLGtFQUdvQztBQUNwQyw4REFNa0M7QUFDbEMsa0RBQW1FO0FBQ25FLG9EQUFxRTtBQUNyRSxrREFBNkI7QUFVN0IsdURBYTJCO0FBQzNCLCtDQVV1QjtBQUN2Qix5REFBdUQ7QUFDdkQsa0RBQTREO0FBQzVELGtEQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxNQUE0QztJQUM3RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFBLHdCQUFVLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxlQUFlLENBQ3RCLEdBQTJCO0lBRTNCLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDOUIsQ0FBQztBQUVELHVGQUF1RjtBQUN2RixNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQztBQUUzQzs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEdBQVc7SUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRywwQkFBMEIsR0FB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QUFDLEVBQUUsT0FBTyxDQUFDO1lBQzVDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkMsSUFDRSxPQUFPLEtBQUssU0FBUztnQkFDckIsT0FBTyxHQUFHLGlCQUFpQjtnQkFDM0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFDaEMsQ0FBQztnQkFDRCxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBaDRCRCx3Q0FnNEJDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgUzMgYW5kIER5bmFtb0RCIGNhY2hlIGhhbmRsZXIgZm9yIE5leHQuanMgaW5jcmVtZW50YWwgY2FjaGVcbiovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHtcbiAgQ2xvdWRGcm9udENsaWVudCxcbiAgQ3JlYXRlSW52YWxpZGF0aW9uQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1jbG91ZGZyb250XCI7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGVWYWx1ZSxcbiAgRGVsZXRlSXRlbUNvbW1hbmQsXG4gIER5bmFtb0RCQ2xpZW50LFxuICBRdWVyeUNvbW1hbmQsXG4gIFVwZGF0ZUl0ZW1Db21tYW5kLFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCI7XG5pbXBvcnQgeyBTM0NsaWVudCwgRGVsZXRlT2JqZWN0Q29tbWFuZCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB7IFNTTUNsaWVudCwgR2V0UGFyYW1ldGVyQ29tbWFuZCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtc3NtXCI7XG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQge1xuICBDYWNoZUhhbmRsZXIsXG4gIENhY2hlSGFuZGxlclZhbHVlLFxuICBDYWNoZUhhbmRsZXJDb250ZXh0LFxufSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvaW5jcmVtZW50YWwtY2FjaGVcIjtcbmltcG9ydCB7XG4gIEluY3JlbWVudGFsQ2FjaGVWYWx1ZSxcbiAgR2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dCxcbn0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcmVzcG9uc2UtY2FjaGVcIjtcbmltcG9ydCB7XG4gIEF3c0NhY2hlQ29uZmlnLFxuICBidWlsZFMzS2V5LFxuICBDYWNoZUJ1Y2tldCxcbiAgaGFzaGVkVGFnLFxuICBtYXJrZXJDbG9jayxcbiAgTUFYX1NPUlRfS0VZX0JZVEVTLFxuICByZXNvbHZlQXdzQ2FjaGVDb25maWcsXG4gIFJldmFsaWRhdGVEdXJhdGlvbnMsXG4gIFJldmFsaWRhdGlvblN0YXRlLFxuICBzb3J0S2V5VGFnLFxuICBzM09iamVjdEtleSxcbiAgVHJhY2tlZFRhZ01hcmtlcnMsXG59IGZyb20gXCIuL2F3cy1jYWNoZS1zdG9yZVwiO1xuaW1wb3J0IHtcbiAgc2VyaWFsaXplQ2FjaGVWYWx1ZSxcbiAgcGFyc2VDYWNoZVZhbHVlLFxuICBkZW5vcm1hbGl6ZVBhZ2VQYXRoLFxuICBnZXRUYWdzLFxuICBHZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICBTZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICBoZWFkZXJUYWdzLFxuICBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVCxcbiAgUk9VVEVfQ0FDSEVfS0VZX1BSRUZJWCxcbn0gZnJvbSBcIi4vY2FjaGUtdXRpbHNcIjtcbmltcG9ydCB7IHNoYXJlZFRhZ01hbmlmZXN0IH0gZnJvbSBcIi4vdXNlLWNhY2hlLWNvbW1vblwiO1xuaW1wb3J0IHsgUkVWQUxJREFURURfUEFHRV9IT09LIH0gZnJvbSBcIi4uL3J1bnRpbWUvbWFuaWZlc3RcIjtcbmltcG9ydCB7IGJhc2VQYXRoUHJlZml4LCB3aG9sZUFwcEludmFsaWRhdGlvblBhdGhzIH0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG4vKipcbiAqIFRoZSB0YWdzIGEgc3RvcmVkIGVudHJ5IGhhcyB0byBiZSB0YWctcmV2YWxpZGF0ZWQgYWdhaW5zdC5cbiAqXG4gKiBBIHJ1bnRpbWUgYHNldGAgcmVjb3JkcyBgdGFnc2AgYWxvbmdzaWRlIHRoZSBlbnRyeSwgYnV0IGEgYnVpbGQtdGltZSBwcmVyZW5kZXJcbiAqIGRvZXMgbm90OiB0aG9zZSBlbnRyaWVzIGFyZSB3cml0dGVuIGFzIGZpbGVzIGJ5IHRoZSBhZGFwdGVyJ3NcbiAqIGBvbkJ1aWxkQ29tcGxldGVgIHJhdGhlciB0aGFuIHRocm91Z2ggYHNldGAsIGFuZCBjYXJyeSB0aGVpciB0YWdzIG9ubHkgaW4gdGhlXG4gKiByZW5kZXIncyBgeC1uZXh0LWNhY2hlLXRhZ3NgIGhlYWRlciDigJQgdGhlIHNhbWUgcGxhY2UgTmV4dC5qcydzIG93blxuICogYEluY3JlbWVudGFsQ2FjaGUuZ2V0YCByZWFkcyB0aGVtIGZyb20gd2hlbiBpdCBkZWNpZGVzIHN0YWxlbmVzcy4gV2l0aG91dCB0aGlzXG4gKiBmYWxsYmFjayBubyBwcmVyZW5kZXJlZCBwYWdlIGlzIHJlYWNoYWJsZSBieSBgcmV2YWxpZGF0ZVRhZ2AvYHJldmFsaWRhdGVQYXRoYFxuICogdW50aWwgc29tZSBsYXRlciBydW50aW1lIHJlLXJlbmRlciBoYXBwZW5zIHRvIHJlcGxhY2UgdGhlIHNlZWRlZCBlbnRyeSwgc28gYW5cbiAqIGFwcCB3aG9zZSBwYWdlcyBhcmUgYWxsIHN0YXRpYyBuZXZlciByZXZhbGlkYXRlcyBhdCBhbGwuIE1lYXN1cmVkIGFnYWluc3RcbiAqIG5leHQuanMncyBgdGVzdC9lMmUvYXBwLWRpci9yZXN1bWUtZGF0YS1jYWNoZWAuXG4gKi9cbmZ1bmN0aW9uIGVudHJ5VGFncyhzdG9yZWQ6IHsgdGFncz86IHN0cmluZ1tdOyB2YWx1ZT86IHVua25vd24gfSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHN0b3JlZC50YWdzPy5sZW5ndGggPyBzdG9yZWQudGFncyA6IGhlYWRlclRhZ3Moc3RvcmVkLnZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgYGxhc3RNb2RpZmllZGAgdGhhdCB0ZWxscyBOZXh0LmpzIFwidGhpcyBlbnRyeSBpcyBleHBpcmVkLCByZS1yZW5kZXIgaXRcbiAqIGJlZm9yZSBhbnN3ZXJpbmdcIi5cbiAqXG4gKiBgSW5jcmVtZW50YWxDYWNoZS5nZXRgIHR1cm5zIGl0IGludG8gYGlzU3RhbGU6IC0xYCwgd2hpY2ggYGFwcC1wYWdlLXJ1bnRpbWVgXG4gKiByZWFkcyBhcyBhbiBvbi1kZW1hbmQgcmV2YWxpZGF0aW9uIGFuZCBhbnN3ZXJzIHdpdGggYSBibG9ja2luZyByZW5kZXIgb2ZcbiAqICp0aGlzKiByb3V0ZSwgdGhlbiBzdG9yZXMgaXQuIFJldHVybmluZyBgbnVsbGAgaW5zdGVhZCBpcyBub3QgdGhlIHNhbWUgdGhpbmc6XG4gKiBhIG1pc3Mgb24gYSBQUFIgcm91dGUgd2hvc2UgYHByZXJlbmRlci1tYW5pZmVzdC5qc29uYCBlbnRyeSBjYXJyaWVzIGFcbiAqIGBmYWxsYmFja2AgKGBjb21wdXRlOiBcInJlc3VtaW5nXCJgKSBpcyBhbnN3ZXJlZCBmcm9tIHRoZSByb3V0ZSdzIGZhbGxiYWNrXG4gKiBzaGVsbCwgd2hpY2ggaXMgc2VydmVkIGBjYWNoZS1jb250cm9sOiBwcml2YXRlLCBuby1zdG9yZWAgd2l0aCBub1xuICogYHgtbmV4dGpzLWNhY2hlYCBoZWFkZXIsIGFuZCAtIHVubGVzcyBgcGFydGlhbFByZWZldGNoaW5nYCBpcyBvbiAtIGlzIG5ldmVyXG4gKiB1cGdyYWRlZCBpbnRvIGEgY29uY3JldGUgZW50cnkuIFNvIHRoZSBmaXJzdCBgcmV2YWxpZGF0ZVRhZ2AgdG8gcmVhY2ggYVxuICogc2VlZGVkIHByZXJlbmRlciBsZWZ0IHRoYXQgcGFnZSB1bmNhY2hlYWJsZSwgYW5kIGR5bmFtaWNhbGx5IHJlc3VtZWQgcGVyXG4gKiByZXF1ZXN0LCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGRlcGxveW1lbnQncyBsaWZlLiBUaGUgaXNyIGUyZSBzZWVzIGl0IGFzIGFuXG4gKiBhYnNlbnQgYHgtbmV4dGpzLWNhY2hlYC5cbiAqL1xuY29uc3QgRVhQSVJFRF9MQVNUX01PRElGSUVEID0gLTE7XG5cbi8qKlxuICogV2hldGhlciBhIGBnZXRgIGlzIGZvciB0aGUgYGZldGNoYCBjYWNoZSByYXRoZXIgdGhhbiBmb3IgYSByb3V0ZSdzIHJlc3BvbnNlLFxuICogYXMgYSBuYXJyb3dpbmcgcHJlZGljYXRlIHNvIHRoYXQgYGN0eC50YWdzYCBhbmQgYGN0eC5zb2Z0VGFnc2Ag4oCUIHdoaWNoIG9ubHlcbiAqIHtAbGluayBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0fSBoYXMg4oCUIGFyZSByZWFjaGFibGUgd2l0aG91dCBhIGNhc3QuXG4gKlxuICogYEluY3JlbWVudGFsQ2FjaGVLaW5kLkZFVENIYCwgY29tcGFyZWQgYXMgaXRzIG93biBzdHJpbmcgdmFsdWUgc28gdGhpcyBmaWxlXG4gKiBrZWVwcyBpbXBvcnRpbmcgbm8gTmV4dC5qcyBpbnRlcm5hbHMgKHRoZSBlbnVtIGlzIGBjb25zdGAsIHNvIGl0IGhhcyBub1xuICogcnVudGltZSByZXByZXNlbnRhdGlvbiB0byBpbXBvcnQgYW55d2F5KS5cbiAqL1xuZnVuY3Rpb24gaXNGZXRjaENhY2hlR2V0KFxuICBjdHg6IEdldENhY2hlSGFuZGxlckNvbnRleHQsXG4pOiBjdHggaXMgR2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dCB7XG4gIHJldHVybiBjdHgua2luZCA9PT0gXCJGRVRDSFwiO1xufVxuXG4vKiogYE5FWFRfQ0FDSEVfSU1QTElDSVRfVEFHX0lEYCwgaW5saW5lZCBzbyB0aGlzIGZpbGUgaW1wb3J0cyBubyBOZXh0LmpzIGludGVybmFscy4gKi9cbmNvbnN0IE5FWFRfQ0FDSEVfSU1QTElDSVRfVEFHX0lEID0gXCJfTl9UX1wiO1xuXG4vKipcbiAqIFRoZSBgdHlwZWAgYXJndW1lbnQgb2YgYHJldmFsaWRhdGVQYXRoYCwgd2hpY2ggTmV4dC5qcyBhcHBlbmRzIHRvIHRoZSBpbXBsaWNpdFxuICogdGFnIGFzIGEgcGF0aCBzZWdtZW50LiBAc2VlIGltcGxpY2l0VGFnUGF0aHNcbiAqL1xuY29uc3QgUkVWQUxJREFURV9QQVRIX1RZUEVTID0gW1wibGF5b3V0XCIsIFwicGFnZVwiXTtcblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBwYXRocyBhIGByZXZhbGlkYXRlUGF0aGAgdGFnIGNvdWxkIG5hbWUsIG9yIGVtcHR5IGZvciBhbiBhcHAgdGFnLlxuICpcbiAqIGByZXZhbGlkYXRlUGF0aChcIi9ibG9nXCIpYCByZWFjaGVzIHRoZSBjYWNoZSBoYW5kbGVyIGFzIHRoZSBpbXBsaWNpdCB0YWdcbiAqIGBfTl9UXy9ibG9nYCAtIHRoZSBwYXRoIGlzIHJpZ2h0IHRoZXJlIGluIHRoZSB0YWcsIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIENETlxuICogY29weSBvZiBhIGJ1aWxkLXRpbWUgcHJlcmVuZGVyIHJlYWNoYWJsZSBhdCBhbGwuIEEgYHJldmFsaWRhdGVUYWcoXCJwb3N0c1wiKWBcbiAqIGNhcnJpZXMgbm8gcGF0aCBhbmQgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyByb3dzIGluc3RlYWQuXG4gKlxuICogVHdvIHBhdGhzIGNvbWUgYmFjayB3aGVuIHRoZSB0YWcgZW5kcyBpbiBhIGByZXZhbGlkYXRlUGF0aGAgKnR5cGUqLCBiZWNhdXNlXG4gKiBgcmV2YWxpZGF0ZVBhdGgocGF0aCwgdHlwZSlgIGFwcGVuZHMgaXQgdG8gdGhlIHRhZ1xuICogKGBuZXh0L2Rpc3Qvc2VydmVyL3dlYi9zcGVjLWV4dGVuc2lvbi9yZXZhbGlkYXRlLmpzYCk6XG4gKiBgcmV2YWxpZGF0ZVBhdGgoXCIvYmxvZ1wiLCBcImxheW91dFwiKWAgaXMgYF9OX1RfL2Jsb2cvbGF5b3V0YCwgYW5kXG4gKiBgcmV2YWxpZGF0ZVBhdGgoXCIvXCIsIFwibGF5b3V0XCIpYCBpcyBgX05fVF8vbGF5b3V0YC4gUmVhZGluZyBlaXRoZXIgb2YgdGhvc2UgYXMgYVxuICogcmVxdWVzdCBwYXRoIGludmFsaWRhdGVzIGEgVVJJIHRoYXQgZG9lcyBub3QgZXhpc3QgYW5kIG5ldmVyIHRvdWNoZXMgdGhlIG9uZVxuICogdGhhdCBkb2VzLiBUaGUgc3VmZml4IGNhbm5vdCBiZSB0b2xkIGFwYXJ0IGZyb20gYSByb3V0ZSB0aGF0IGdlbnVpbmVseSBlbmRzIGluXG4gKiBgL2xheW91dGAsIHNvIGJvdGggcmVhZGluZ3MgYXJlIGVtaXR0ZWQ6IGFuIGludmFsaWRhdGlvbiBwYXRoIG1hdGNoaW5nIG5vdGhpbmdcbiAqIGNvc3RzIGEgcGF0aCwgd2hpbGUgbWlzc2luZyB0aGUgcmVhbCBvbmUgbGVhdmVzIHRoZSBlZGdlIHN0YWxlIGZvciB0aGUgd2hvbGVcbiAqIGBzLW1heGFnZWAuXG4gKi9cbmZ1bmN0aW9uIGltcGxpY2l0VGFnUGF0aHModGFnOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghdGFnLnN0YXJ0c1dpdGgoYCR7TkVYVF9DQUNIRV9JTVBMSUNJVF9UQUdfSUR9L2ApKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHBhdGggPSB0YWcuc2xpY2UoTkVYVF9DQUNIRV9JTVBMSUNJVF9UQUdfSUQubGVuZ3RoKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtwYXRoXTtcbiAgZm9yIChjb25zdCB0eXBlIG9mIFJFVkFMSURBVEVfUEFUSF9UWVBFUykge1xuICAgIGlmIChwYXRoLmVuZHNXaXRoKGAvJHt0eXBlfWApKSB7XG4gICAgICAvLyBgX05fVF8vbGF5b3V0YCBpcyB0aGUgcm9vdCwgbm90IHRoZSBlbXB0eSBwYXRoLlxuICAgICAgY2FuZGlkYXRlcy5wdXNoKHBhdGguc2xpY2UoMCwgLSh0eXBlLmxlbmd0aCArIDEpKSB8fCBcIi9cIik7XG4gICAgfVxuICB9XG4gIC8vIEEgZHluYW1pYyByb3V0ZSB0ZW1wbGF0ZSAoXCIvYmxvZy9bc2x1Z11cIikgbWF0Y2hlcyBubyBjYWNoZWQgVVJJLiBIYXJtbGVzcyB0b1xuICAvLyBzZW5kLCBidXQgaXQgY29zdHMgYW4gaW52YWxpZGF0aW9uIHBhdGgsIGFuZCB0aG9zZSBhcmUgbWV0ZXJlZC5cbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChjYW5kaWRhdGVzKSkuZmlsdGVyKChwKSA9PiAhcC5pbmNsdWRlcyhcIltcIikpO1xufVxuXG4vKipcbiAqIEludmFsaWRhdGlvbiBwYXRocyBjb3ZlcmluZyBldmVyeSBVUkkgQ2xvdWRGcm9udCBjb3VsZCBiZSBob2xkaW5nIHRoZSByZXNwb25zZVxuICogZm9yIGByb3V0ZWAgdW5kZXIsIG9uY2UgYGJhc2VQYXRoYCBpcyBwcmVmaXhlZC5cbiAqXG4gKiBBbiBpbnZhbGlkYXRpb24gcGF0aCBtYXRjaGVzIG9ubHkgdGhlIHF1ZXJ5IHN0cmluZyBpdCBzcGVsbHMgb3V0LCBhbmQgYSBwYWdlJ3NcbiAqIFJTQyBwYXlsb2FkIGlzIGNhY2hlZCB1bmRlciBgP19yc2M9PGhhc2g+YDsgZHJvcHBpbmcgdGhlIEhUTUwgd2hpbGUgbGVhdmluZyB0aGVcbiAqIHBheWxvYWQgYmVoaW5kIGxlYXZlcyB0aGUgcm91dGVyIG5hdmlnYXRpbmcgdG8gdGhlIHByZS1yZXZhbGlkYXRpb24gcGFnZS4gQVxuICogYHRyYWlsaW5nU2xhc2hgIGFwcCBjYWNoZXMgdGhlIHJlZGlyZWN0IHRhcmdldCByYXRoZXIgdGhhbiB0aGUgcm91dGUsIHNvIHRoZVxuICogc2xhc2ggdmFyaWFudCBoYXMgdG8gZ28gdG9vLlxuICpcbiAqIE9uZSB0cmFpbGluZyB3aWxkY2FyZCBjb3ZlcnMgYWxsIGZvdXIgKGAvYmxvZ2AsIGAvYmxvZz/igKZgLCBgL2Jsb2cvYCxcbiAqIGAvYmxvZy8/4oCmYCkgZm9yIGEgc2luZ2xlIHdpbGRjYXJkIHBhdGgsIHdoZXJlIHNwZWxsaW5nIHRoZW0gb3V0IGNvc3QgdHdvIC1cbiAqIGFuZCB3aWxkY2FyZHMgYXJlIHRoZSBxdW90YSB0aGF0IHJ1bnMgb3V0LiBJdCBhbHNvIG1hdGNoZXMgYC9ibG9ncm9sbGAgYW5kXG4gKiBldmVyeXRoaW5nIHVuZGVyIGAvYmxvZy9gLCB3aGljaCBpcyBhIGxvd2VyIGhpdCByYXRlIG9uIHRob3NlLCBuZXZlciBhIHN0YWxlXG4gKiBwYWdlLiBUaGUgYXBwJ3Mgcm9vdCBpcyB0aGUgZXhjZXB0aW9uOiBgLypgIHRoZXJlIGlzIHRoZSB3aG9sZSBhcHAuXG4gKlxuICogYGJhc2VQYXRoYCBpcyBwcmVmaXhlZCBoZXJlIGJlY2F1c2UgbmVpdGhlciBzb3VyY2Ugb2YgYSByb3V0ZSBjYXJyaWVzIGl0LlxuICogQ2FjaGUga2V5cyBhcmUgcm91dGVzIOKAlCBOZXh0LmpzIHN0cmlwcyBgYmFzZVBhdGhgIGJlZm9yZSByb3V0aW5nLCBzbyB0aGUgY2FjaGVcbiAqIGhhbmRsZXIgbmV2ZXIgc2VlcyBvbmUg4oCUIGFuZCBgcmV2YWxpZGF0ZVBhdGgoXCIvYmxvZ1wiKWAgbmFtZXMgdGhlIHJvdXRlIGFzXG4gKiB3ZWxsLiBDbG91ZEZyb250IG9ubHkgZXZlciBzYXcgYC9iYXNlL2Jsb2dgLCBzbyBpbnZhbGlkYXRpbmcgYC9ibG9nYCBjbGVhcnNcbiAqIG5vdGhpbmcgYW5kIHRoZSBlZGdlIGtlZXBzIHNlcnZpbmcgdGhlIHByZS1yZXZhbGlkYXRpb24gcGFnZSB1bnRpbCBgcy1tYXhhZ2VgXG4gKiBleHBpcmVzLiBUaGUgYXBwJ3Mgcm9vdCB1bmRlciBhIGBiYXNlUGF0aGAgaXMgYC9iYXNlYCwgbm90IGAvYmFzZS9gLlxuICovXG5mdW5jdGlvbiBjZG5JbnZhbGlkYXRpb25QYXRocyhyb3V0ZTogc3RyaW5nLCBiYXNlUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0cmltbWVkID0gcm91dGUucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgaWYgKHRyaW1tZWQgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gYmFzZVBhdGhcbiAgICAgID8gW2Jhc2VQYXRoLCBgJHtiYXNlUGF0aH0/KmAsIGAke2Jhc2VQYXRofS9gLCBgJHtiYXNlUGF0aH0vPypgXVxuICAgICAgOiBbXCIvXCIsIFwiLz8qXCJdO1xuICB9XG4gIHJldHVybiBbYCR7YmFzZVBhdGh9JHtlbmNvZGVJbnZhbGlkYXRpb25Sb3V0ZSh0cmltbWVkKX0qYF07XG59XG5cbi8qKlxuICogVGhlIGFwcCdzIGBiYXNlUGF0aGAsIGZyb20gdGhlIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAgZXZlcnkgZGVwbG95bWVudFxuICogcm9vdCBzdGFnZXMgbmV4dCB0byBgc2VydmVyRGlzdERpcmA6IE5leHQuanMgaGFuZHMgdGhlIGNhY2hlIGhhbmRsZXIgbm9cbiAqIG90aGVyIGNvcHkuXG4gKi9cbmZ1bmN0aW9uIGFwcEJhc2VQYXRoKHNlcnZlckRpc3REaXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghc2VydmVyRGlzdERpcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlID0gam9pbihzZXJ2ZXJEaXN0RGlyLCBcIi4uXCIsIFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIik7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGZpbGUsIFwidXRmOFwiKSkuY29uZmlnPy5iYXNlUGF0aDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgcmVhZCBiYXNlUGF0aCBmb3IgQ0ROIGludmFsaWRhdGlvbjpcIiwgZXJyb3IpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBgcm91dGVgIGFzIHRoZSBVUkkgYSBicm93c2VyIHJlcXVlc3RzIGl0IHVuZGVyLCB3aGljaCBpcyB3aGF0IENsb3VkRnJvbnRcbiAqIGNhY2hlcyBpdCBieS5cbiAqXG4gKiBOZXh0LmpzIGJ1aWxkcyBjYWNoZSBrZXlzIGZyb20gdGhlICpkZWNvZGVkKiBwYXRobmFtZSAoYGRlY29kZVBhdGhQYXJhbXNgIGluXG4gKiBgcm91dGUtbW9kdWxlLmpzYCksIHNvIGAvYmxvZy9ow6lsbG9gIG9yIGAvYmxvZy9oZWxsbyB3b3JsZGAgcmVhY2ggaGVyZSByYXcsXG4gKiB3aGlsZSBDbG91ZEZyb250IGhvbGRzIGAvYmxvZy9oJUMzJUE5bGxvYCwgYW5kIGFuIGludmFsaWRhdGlvbiBwYXRoIG1hdGNoZXNcbiAqIHRoZSBlbmNvZGVkIGZvcm0gb25seSAtIEFXUyByZXF1aXJlcyBub24tQVNDSUkgYW5kIHVuc2FmZSBjaGFyYWN0ZXJzIHRvIGJlXG4gKiBwZXJjZW50LWVuY29kZWQsIGFuZCBub3RoaW5nIGVsc2UuIEVhY2ggc2VnbWVudCBpcyBlbmNvZGVkIHRoZSB3YXlcbiAqIGBlbmNvZGVVUklgIGRvZXMsIHdoaWNoIGxlYXZlcyB0aGUgY2hhcmFjdGVycyBhIGJyb3dzZXIgc2VuZHMgcmF3IGluIGEgcGF0aFxuICogKGBAYCwgYDpgLCBgLGAsIGA7YCwgLi4uKSBhbG9uZS4gQSBgJWAgdGhhdCBhbHJlYWR5IHN0YXJ0cyBhbiBlc2NhcGUgaXMga2VwdDpcbiAqIGBkZWNvZGVQYXRoUGFyYW1zYCByZS1lc2NhcGVzIHBhdGggZGVsaW1pdGVycyAoYCUyRmAsIGAlM0ZgLCBgJTIzYCwgYCU1Q2ApLFxuICogYW5kIGEgYHJldmFsaWRhdGVQYXRoYCB0YWcgbWF5IG5hbWUgdGhlIGVuY29kZWQgcGF0aCBpdHNlbGYuIGA/YCBhbmQgYCNgIGNhblxuICogb25seSBiZSBpbiBhIGRlY29kZWQgc2VnbWVudCBhcyBkYXRhLCBzbyB0aGV5IGFyZSBlbmNvZGVkIHRvby5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlSW52YWxpZGF0aW9uUm91dGUocm91dGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByb3V0ZVxuICAgIC5zcGxpdChcIi9cIilcbiAgICAubWFwKChzZWdtZW50KSA9PlxuICAgICAgc2VnbWVudFxuICAgICAgICAuc3BsaXQoLyglWzAtOUEtRmEtZl17Mn0pLylcbiAgICAgICAgLm1hcCgocGFydCwgaSkgPT5cbiAgICAgICAgICBpICUgMiA9PT0gMVxuICAgICAgICAgICAgPyBwYXJ0XG4gICAgICAgICAgICA6IGVuY29kZVVSSShwYXJ0KS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIC9bPyNdL2csXG4gICAgICAgICAgICAgICAgKGMpID0+IGAlJHtjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9YCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIlwiKSxcbiAgICApXG4gICAgLmpvaW4oXCIvXCIpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBjYWNoZSBrZXkgaXMgYSBmZXRjaC1jYWNoZSBlbnRyeSByYXRoZXIgdGhhbiBhIHBhZ2Ugcm91dGUuXG4gKlxuICogVGhvc2Uga2V5cyBhcmUgdGhlIGhhc2ggTmV4dC5qcyBkZXJpdmVzIGZyb20gdGhlIHJlcXVlc3Qg4oCUIGEgc2luZ2xlIHNlZ21lbnQgb2ZcbiAqIGxvd2VyY2FzZSBoZXgsIGxvbmcgZW5vdWdoIHRoYXQgbm8gcm91dGUgcGF0aG5hbWUgdGFrZXMgdGhlIHNhbWUgc2hhcGUuIFRoZXlcbiAqIGFyZSBtYXBwZWQgdG8gdGFncyBleGFjdGx5IGxpa2UgcGFnZXMgYXJlLCBidXQgbmFtZSBubyBVUkkgQ2xvdWRGcm9udCBjb3VsZCBiZVxuICogaG9sZGluZywgc28gYW4gaW52YWxpZGF0aW9uIHBhdGggYnVpbHQgZnJvbSBvbmUgaXMgYWx3YXlzIHdhc3RlZC5cbiAqL1xuZnVuY3Rpb24gaXNGZXRjaENhY2hlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlswLTlhLWZdezMyLH0kLy50ZXN0KGtleSk7XG59XG5cbi8qKiBXaGV0aGVyIENsb3VkRnJvbnQgY291bnRzIHRoaXMgcGF0aCBhZ2FpbnN0IHRoZSB3aWxkY2FyZCBxdW90YS4gKi9cbmZ1bmN0aW9uIGlzV2lsZGNhcmRQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGF0aC5pbmNsdWRlcyhcIipcIik7XG59XG5cbi8qKlxuICogVGhlIG1vc3Qgd2lsZGNhcmQgcGF0aHMgb25lIGByZXZhbGlkYXRlVGFnYCBzZW5kcyBiZWZvcmUgY29sbGFwc2luZyB0byBhIHNpbmdsZVxuICogYXBwLXdpZGUgd2lsZGNhcmQsIGFuZCB0aGUgbW9zdCBwYXRocyBvZiBhbnkga2luZC5cbiAqXG4gKiBDbG91ZEZyb250J3Mgd2lsZGNhcmQgcXVvdGEgaXMgcGVyICpkaXN0cmlidXRpb24qLCBub3QgcGVyIHJlcXVlc3Q6IHRoZVxuICogaW52YWxpZGF0aW9ucyBpdCBoYXMgaW4gcHJvZ3Jlc3Mgc2hhcmUgaXQsIHNvIHNwbGl0dGluZyBhbiBvdmVyc2l6ZWQgc2V0IGludG9cbiAqIGJhY2stdG8tYmFjayByZXF1ZXN0cyBpcyB3aGF0IGdldHMgdGhlIGxhdGVyIG9uZXMgcmVqZWN0ZWRcbiAqIChgVG9vTWFueUludmFsaWRhdGlvbnNJblByb2dyZXNzYCwgb3IgYSB0aHJvdHRsZSB1bmRlciB0aGUgbmV3ZXIgcmF0ZS1iYXNlZFxuICogcXVvdGFzKSAtIGFuZCBhIHJlamVjdGVkIHJlcXVlc3QgaXMgYSBwYWdlIHRoYXQgc3RheXMgc3RhbGUgYXQgdGhlIGVkZ2UuIFNvXG4gKiBldmVyeXRoaW5nIGdvZXMgb3V0IGFzIG9uZSByZXF1ZXN0LCBhbmQgYSBzZXQgdGhhdCB3b3VsZCBub3QgZml0IGluIG9uZSBpc1xuICogYW5zd2VyZWQgd2l0aCB0aGUgd2hvbGUgYXBwIChgLypgLCBzZWUgYHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHNgKSBpbnN0ZWFkOlxuICogYSB3b3JzZSBoaXQgcmF0ZSwgYW5kIGEgc3RyaWN0bHkgY29ycmVjdCBhbnN3ZXIuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbG91ZGZyb250LWxpbWl0cy5odG1sI2xpbWl0cy1pbnZhbGlkYXRpb25zXG4gKi9cbmNvbnN0IE1BWF9XSUxEQ0FSRF9QQVRIU19QRVJfSU5WQUxJREFUSU9OID0gMTU7XG5cbmNvbnN0IE1BWF9QQVRIU19QRVJfSU5WQUxJREFUSU9OID0gMzAwMDtcblxuLyoqXG4gKiBSZXRyaWVzIG9mIGFuIGludmFsaWRhdGlvbiBDbG91ZEZyb250IHJlamVjdGVkIGZvciBpdHMgaW4tcHJvZ3Jlc3MgcXVvdGEsIGFuZFxuICogdGhlIGRlbGF5IGJlZm9yZSB0aGUgZmlyc3Q7IGVhY2ggbGF0ZXIgb25lIHdhaXRzIHR3aWNlIGFzIGxvbmcuXG4gKlxuICogU2l6aW5nIGEgcmVxdWVzdCBhZ2FpbnN0IHRoZSBxdW90YSBjYW5ub3Qgc2VlIHRoZSBpbnZhbGlkYXRpb25zIG90aGVyXG4gKiBpbnN0YW5jZXMgYWxyZWFkeSBoYXZlIGluIGZsaWdodCwgc28gdHdvIGByZXZhbGlkYXRlVGFnYHMgY2xvc2UgdG9nZXRoZXIgY2FuXG4gKiBlYWNoIGZpdCBvbiB0aGVpciBvd24gYW5kIHN0aWxsIGJlIHJlamVjdGVkIHRvZ2V0aGVyLiBEcm9wcGluZyB0aGUgcmVqZWN0ZWRcbiAqIG9uZSBsZWZ0IGl0cyBwYWdlcyBzdGFsZSBhdCB0aGUgZWRnZSBmb3IgdGhlIHdob2xlIGBzLW1heGFnZWAuIFRoZSByZXRyeSBhc2tzXG4gKiBmb3IgdGhlIHdob2xlIGFwcCBpbnN0ZWFkLCB3aGljaCBpcyBvbmUgd2lsZGNhcmQgLSB0aGUgbGVhc3Qgb2YgdGhlIHF1b3RhIGFueVxuICogcmVxdWVzdCBjYW4gdGFrZSAtIGF0IHRoZSBjb3N0IG9mIGEgY29sZGVyIGVkZ2UuXG4gKi9cbmNvbnN0IElOVkFMSURBVElPTl9SRVRSSUVTID0gMjtcbmNvbnN0IElOVkFMSURBVElPTl9SRVRSWV9ERUxBWV9NUyA9IDEwMDA7XG5cbi8qKiBUaGUgZXJyb3JzIHRoYXQgbWVhbiBcInRoZSBxdW90YSBpcyBmdWxsIHJpZ2h0IG5vd1wiLCBub3QgXCJ0aGlzIGlzIHdyb25nXCIuICovXG5mdW5jdGlvbiBpc0ludmFsaWRhdGlvblF1b3RhRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgbmFtZSA9IChlcnJvciBhcyB7IG5hbWU/OiB1bmtub3duIH0gfCBudWxsKT8ubmFtZTtcbiAgcmV0dXJuIG5hbWUgPT09IFwiVG9vTWFueUludmFsaWRhdGlvbnNJblByb2dyZXNzXCIgfHwgbmFtZSA9PT0gXCJUaHJvdHRsaW5nXCI7XG59XG5cbi8qKlxuICogVGhlIG1vc3QgY2FjaGUga2V5cyB0byByZW1lbWJlciBhcyBzZXJ2ZWQgc3RhbGUgd2hpbGUgYXdhaXRpbmcgdGhlaXJcbiAqIHJlZ2VuZXJhdGlvbi4gQSBiYWNrZ3JvdW5kIHJlbmRlciB0aGF0IGZhaWxzIG5ldmVyIGNhbGxzIGBzZXRgLCBzbyB3aXRob3V0IGFcbiAqIGJvdW5kIGl0cyBrZXkgd291bGQgc3RheSBiZWhpbmQgZm9yIHRoZSBsaWZlIG9mIHRoZSBpbnN0YW5jZS5cbiAqIEBzZWUgUzNDYWNoZUhhbmRsZXIuc29mdFJldmFsaWRhdGVkS2V5c1xuICovXG5jb25zdCBNQVhfU09GVF9SRVZBTElEQVRFRF9LRVlTID0gMTAwMDtcblxuLyoqXG4gKiBIb3cgbWFueSAxIE1CIFF1ZXJ5IHBhZ2VzIG9mIG9uZSB0YWcncyBtYXBwaW5nIHJvd3MgdG8gd2Fsay4gQSBjZWlsaW5nIHJhdGhlclxuICogdGhhbiBhIHJlYWwgbGltaXQ6IGl0IGJvdW5kcyBhIHJ1bmF3YXkgdGFnIGluc3RlYWQgb2YgcGFnaW5hdGluZyBhIHdob2xlIHRhYmxlXG4gKiBvbiBhIHJlcXVlc3QgcGF0aC4gQSB0YWcgY3V0IG9mZiBoZXJlIGludmFsaWRhdGVzIHRoZSB3aG9sZSBhcHAsIGJlY2F1c2UgdGhlXG4gKiByb3dzIGl0IG5ldmVyIHJlYWQgYXJlIHBhZ2VzIHdob3NlIGVkZ2UgY29weSB3b3VsZCBvdGhlcndpc2Ugc3RheSBzdGFsZS5cbiAqL1xuY29uc3QgTUFYX1RBR19RVUVSWV9QQUdFUyA9IDIwO1xuXG4vKipcbiAqIE5leHQuanMncyBpbi1wcm9jZXNzIHRhZyBtYW5pZmVzdCwgd2hpY2ggYEluY3JlbWVudGFsQ2FjaGUuZ2V0YCBjb25zdWx0cyB0b1xuICogZGVjaWRlIHdoZXRoZXIgYW4gZW50cnkgaXMgc3RhbGUgLSBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbm5vdCBiZSBmb3VuZFxuICogdW5hbWJpZ3VvdXNseS5cbiAqXG4gKiBgcmV2YWxpZGF0ZVRhZyh0YWcsIHByb2ZpbGUpYCBhc2tzIGZvciBzdGFsZS13aGlsZS1yZXZhbGlkYXRlOiB0aGUgZW50cnkgaXNcbiAqIHNlcnZlZCBvbmNlIG1vcmUgd2hpbGUgYSBiYWNrZ3JvdW5kIHJlbmRlciByZXBsYWNlcyBpdC4gQSBjYWNoZSBoYW5kbGVyIGhhc1xuICogbm8gZmllbGQgdG8gc2F5IFwic3RhbGVcIiBpbiAtIGBsYXN0TW9kaWZpZWQ6IC0xYCBtZWFucyBleHBpcmVkLCB3aGljaCBibG9ja3MgLVxuICogc28gdGhpcyBzZXRzIHRoZSB0YWcncyBgc3RhbGVgIHRpbWVzdGFtcCB3aGVyZSBOZXh0LmpzIGFscmVhZHkgbG9va3MgZm9yIGl0LFxuICogd2hpY2ggaXMgZXhhY3RseSB3aGF0IGl0cyBvd24gYEZpbGVTeXN0ZW1DYWNoZS5yZXZhbGlkYXRlVGFnYCBkb2VzLiBUaGUgbW9kdWxlXG4gKiBpcyByZWFkIGZyb20gdGhlIGxvYWRlZC1tb2R1bGUgY2FjaGUgcmF0aGVyIHRoYW4gYHJlcXVpcmVgZDogdGhlIGhhbmRsZXIgaXNcbiAqIGJ1bmRsZWQgYXBhcnQgZnJvbSB0aGUgYXBwLCBhbmQgcmVzb2x2aW5nIGBuZXh0YCBmcm9tIGhlcmUgY291bGQgcmVhY2ggYVxuICogZGlmZmVyZW50IGNvcHkgdGhhbiB0aGUgc2VydmVyIGxvYWRlZCwgd2hvc2UgbWFuaWZlc3Qgbm90aGluZyByZWFkcy4gQSBzdGFsZVxuICogbWFyayB3cml0dGVuIHRoZXJlIHdvdWxkIHNlcnZlIHRoZSBlbnRyeSBhcyBmcmVzaCwgc28gd2l0aG91dCBleGFjdGx5IG9uZVxuICogbG9hZGVkIGNvcHkgdGhlIGNhbGxlciBmYWxscyBiYWNrIHRvIGV4cGlyaW5nIHRoZSBlbnRyeSBvdXRyaWdodC5cbiAqL1xuY29uc3QgVEFHU19NQU5JRkVTVF9NT0RVTEUgPVxuICBcIi9uZXh0L2Rpc3Qvc2VydmVyL2xpYi9pbmNyZW1lbnRhbC1jYWNoZS90YWdzLW1hbmlmZXN0LmV4dGVybmFsLmpzXCI7XG5mdW5jdGlvbiBuZXh0VGFnc01hbmlmZXN0KCk6XG4gIE1hcDxzdHJpbmcsIHsgc3RhbGU/OiBudW1iZXI7IGV4cGlyZWQ/OiBudW1iZXIgfT4gfCB1bmRlZmluZWQge1xuICBjb25zdCBjYWNoZSA9IGNyZWF0ZVJlcXVpcmUoam9pbihwcm9jZXNzLmN3ZCgpLCBcImluZGV4LmpzXCIpKS5jYWNoZTtcbiAgY29uc3QgbG9hZGVkID0gT2JqZWN0LmtleXMoY2FjaGUpLmZpbHRlcigocGF0aCkgPT5cbiAgICBwYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLmVuZHNXaXRoKFRBR1NfTUFOSUZFU1RfTU9EVUxFKSxcbiAgKTtcbiAgaWYgKGxvYWRlZC5sZW5ndGggIT09IDEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1hbmlmZXN0ID0gY2FjaGVbbG9hZGVkWzBdXT8uZXhwb3J0cz8udGFnc01hbmlmZXN0O1xuICByZXR1cm4gbWFuaWZlc3QgaW5zdGFuY2VvZiBNYXAgPyBtYW5pZmVzdCA6IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIENsb3VkRnJvbnRJbnZhbGlkYXRpb25Db25maWcge1xuICAvKipcbiAgICogVGhlIGRpc3RyaWJ1dGlvbiBJRCwgd2hlbiB0aGUgY29tcHV0ZSdzIGVudmlyb25tZW50IGNhbiBjYXJyeSBpdFxuICAgKiAoYE5leHRqc0dsb2JhbENvbnRhaW5lcnNgKS5cbiAgICovXG4gIGRpc3RyaWJ1dGlvbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPdGhlcndpc2UsIHRoZSBuYW1lIChub3QgdmFsdWUpIG9mIHRoZSBTU00gUGFyYW1ldGVyIGhvbGRpbmcgaXQuXG4gICAqXG4gICAqIE9uIGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgIHRoZSBkaXN0cmlidXRpb24ncyBvcmlnaW4gaXMgdGhlIGZ1bmN0aW9uJ3NcbiAgICogVVJMLCBzbyB0aGUgZnVuY3Rpb24ncyBlbnZpcm9ubWVudCBuYW1pbmcgdGhlIGRpc3RyaWJ1dGlvbiBiYWNrIHdvdWxkIGJlXG4gICAqIGEgY2lyY3VsYXIgQ2xvdWRGb3JtYXRpb24gZGVwZW5kZW5jeS4gVGhlIHBhcmFtZXRlciAqbmFtZSogaXMgc3RhdGljIGFuZFxuICAgKiBrbm93biBhdCBzeW50aCB0aW1lOyBvbmx5IGl0cyAqdmFsdWUqIGRlcGVuZHMgb24gdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIGRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFwcCdzIGBiYXNlUGF0aGAsIGFzIHRoZSBVUkkgcHJlZml4IENsb3VkRnJvbnQgY2FjaGVkIHRoZSByZXNwb25zZXNcbiAgICogdW5kZXIuXG4gICAqIEBzZWUgY2RuSW52YWxpZGF0aW9uUGF0aHNcbiAgICovXG4gIGJhc2VQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUzNDYWNoZUhhbmRsZXJPcHRpb25zIHtcbiAgY29udGV4dDogQ2FjaGVIYW5kbGVyQ29udGV4dDtcbiAgLyoqXG4gICAqIFRoZSBhcHAncyBgYmFzZVBhdGhgLCBmb3IgdGVzdHM6IHJlYWQgZnJvbSBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gXG4gICAqIG90aGVyd2lzZS5cbiAgICovXG4gIGJhc2VQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUzNDYWNoZUhhbmRsZXIgaW1wbGVtZW50cyBDYWNoZUhhbmRsZXIge1xuICBwcml2YXRlIHMzQ2xpZW50OiBTM0NsaWVudDtcbiAgcHJpdmF0ZSBkeW5hbW9DbGllbnQ6IER5bmFtb0RCQ2xpZW50O1xuICBwcml2YXRlIGNsb3VkRnJvbnRDbGllbnQ6IENsb3VkRnJvbnRDbGllbnQ7XG4gIHByaXZhdGUgc3NtQ2xpZW50OiBTU01DbGllbnQ7XG4gIHByaXZhdGUgYnVja2V0OiBDYWNoZUJ1Y2tldDtcbiAgcHJpdmF0ZSB0YWdzOiBUcmFja2VkVGFnTWFya2VycztcbiAgcHJpdmF0ZSBjb25maWc6IEF3c0NhY2hlQ29uZmlnO1xuICBwcml2YXRlIGNsb3VkRnJvbnRDb25maWc6IENsb3VkRnJvbnRJbnZhbGlkYXRpb25Db25maWc7XG4gIHByaXZhdGUgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6Y2FjaGUtaGFuZGxlcjpzM1wiKTtcblxuICAvLyBDYWNoZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGlzIGluc3RhbmNlIChpLmUuIHRoZSBjb21wdXRlIGluc3RhbmNlKSBvbmNlXG4gIC8vIHJlc29sdmVkLCBzaW5jZSBhIGRlcGxveW1lbnQncyBkaXN0cmlidXRpb24gSUQgbmV2ZXIgY2hhbmdlcyBhdCBydW50aW1lLlxuICBwcml2YXRlIGNhY2hlZERpc3RyaWJ1dGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ2FjaGUga2V5cyB0aGlzIGluc3RhbmNlIHNlcnZlZCBzdGFsZSBiZWNhdXNlIG9mIGEgc29mdCBgcmV2YWxpZGF0ZVRhZ2AsXG4gICAqIHdob3NlIHJlZ2VuZXJhdGVkIGVudHJ5IGBzZXRgIGhhcyB5ZXQgdG8gd3JpdGUuXG4gICAqXG4gICAqIGByZXZhbGlkYXRlVGFnKHRhZywgcHJvZmlsZSlgIGludmFsaWRhdGVzIENsb3VkRnJvbnQgYXQgb25jZSwgYnV0IHRoZSBuZXh0XG4gICAqIHJlcXVlc3QgaXMgYW5zd2VyZWQgZnJvbSB0aGUgc3RhbGUgZW50cnkgLSBzdGFsZS13aGlsZS1yZXZhbGlkYXRlIC0gYW5kIHRoYXRcbiAgICogcmVzcG9uc2UgY2FycmllcyB0aGUgZW50cnkncyBvcmlnaW5hbCBgcy1tYXhhZ2VgLCBzbyB0aGUgZWRnZSBjYWNoZXMgdGhlXG4gICAqIHN0YWxlIGJvZHkgYWdhaW4uIFRoZSBiYWNrZ3JvdW5kIHJlbmRlciB0aGF0IHJlcGxhY2VzIGl0IHJ1bnMgaW4gdGhpcyBzYW1lXG4gICAqIHByb2Nlc3MsIHNvIGBzZXRgIGNoZWNrcyB0aGlzIHNldCBhbmQgaW52YWxpZGF0ZXMgdGhlIGtleSdzIHBhdGhzIGEgc2Vjb25kXG4gICAqIHRpbWUgb25jZSB0aGUgZnJlc2ggZW50cnkgaXMgaW4gUzMuIFdpdGhvdXQgdGhhdCwgdGhlIGVkZ2Uga2VwdCBzZXJ2aW5nIHRoZVxuICAgKiBwcmUtcmV2YWxpZGF0aW9uIHBhZ2UgZm9yIHRoZSB3aG9sZSBgcy1tYXhhZ2VgLlxuICAgKlxuICAgKiBFeHBpcmluZyBzb2Z0LXJldmFsaWRhdGVkIGVudHJpZXMgb3V0cmlnaHQgaW5zdGVhZCB3b3VsZCBhbHNvIGtlZXAgdGhlIGVkZ2VcbiAgICogcmlnaHQsIGJ1dCBpdCB0dXJucyBldmVyeSBgcmV2YWxpZGF0ZVRhZyh0YWcsIFwibWF4XCIpYCBpbnRvIGEgYmxvY2tpbmcgcmVuZGVyXG4gICAqIGF0IHRoZSBvcmlnaW4sIHdoaWNoIGlzIHRoZSB0aGluZyBhIHByb2ZpbGUgYXNrcyBub3QgdG8gaGFwcGVuLlxuICAgKi9cbiAgcHJpdmF0ZSBzb2Z0UmV2YWxpZGF0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqIEBzZWUgYnVpbGRUYWdNYW5pZmVzdCAqL1xuICBwcml2YXRlIGJ1aWxkVGFnczogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmdbXT4+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFMzQ2FjaGVIYW5kbGVyT3B0aW9ucykge1xuICAgIHRoaXMuY29uZmlnID0gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCk7XG5cbiAgICAvLyBPbmx5IHNldCBmb3IgQ2xvdWRGcm9udC1mcm9udGVkIGRlcGxveW1lbnRzIChOZXh0anNHbG9iYWxGdW5jdGlvbnMvQ29udGFpbmVycykuXG4gICAgLy8gV2hlbiB1bnNldCwgb24tZGVtYW5kIHJldmFsaWRhdGlvbiBza2lwcyBDRE4gaW52YWxpZGF0aW9uIGFuZCByZWxpZXMgb24gdGhlXG4gICAgLy8gZGlzdHJpYnV0aW9uJ3MgY2FjaGUgcG9saWN5IFRUTCAoZHJpdmVuIGJ5IHRoZSBvcmlnaW4ncyBDYWNoZS1Db250cm9sIGhlYWRlcilcbiAgICAvLyB0byBldmVudHVhbGx5IHBpY2sgdXAgZnJlc2ggY29udGVudC5cbiAgICB0aGlzLmNsb3VkRnJvbnRDb25maWcgPSB7XG4gICAgICBkaXN0cmlidXRpb25JZDogcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19ESVNUUklCVVRJT05fSUQgfHwgXCJcIixcbiAgICAgIGRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZTpcbiAgICAgICAgcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19ESVNUUklCVVRJT05fSURfUEFSQU1fTkFNRSB8fCBcIlwiLFxuICAgICAgYmFzZVBhdGg6IGJhc2VQYXRoUHJlZml4KG9wdGlvbnMuYmFzZVBhdGgpLFxuICAgIH07XG4gICAgLy8gT25seSBpbnZhbGlkYXRpb24gbmVlZHMgaXQsIHNvIG9ubHkgYSBoYW5kbGVyIGJlaGluZCBhIGRpc3RyaWJ1dGlvbiByZWFkc1xuICAgIC8vIGl0LCBhbmQgYSBtaXNzaW5nIGZpbGUgdGhlcmUgaXMgd29ydGggYSB3YXJuaW5nLlxuICAgIGlmICh0aGlzLmludmFsaWRhdGVzQ2RuICYmIG9wdGlvbnMuYmFzZVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jbG91ZEZyb250Q29uZmlnLmJhc2VQYXRoID0gYmFzZVBhdGhQcmVmaXgoXG4gICAgICAgIGFwcEJhc2VQYXRoKG9wdGlvbnMuY29udGV4dC5zZXJ2ZXJEaXN0RGlyKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBBV1MgY2xpZW50c1xuICAgIGNvbnN0IHsgcmVnaW9uIH0gPSB0aGlzLmNvbmZpZztcbiAgICB0aGlzLnMzQ2xpZW50ID0gbmV3IFMzQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHRoaXMuZHluYW1vQ2xpZW50ID0gbmV3IER5bmFtb0RCQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHRoaXMuY2xvdWRGcm9udENsaWVudCA9IG5ldyBDbG91ZEZyb250Q2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHRoaXMuc3NtQ2xpZW50ID0gbmV3IFNTTUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBDYWNoZUJ1Y2tldCh0aGlzLnMzQ2xpZW50LCB0aGlzLmNvbmZpZy5idWNrZXROYW1lKTtcbiAgICAvLyBUaGUgcHJvY2VzcydzIG9uZSBjb3B5IG9mIHRoZSB0YWcgbWFya2Vycywgc2hhcmVkIHdpdGggdGhlIGAndXNlIGNhY2hlJ2BcbiAgICAvLyBoYW5kbGVyczogb25lIGByZXZhbGlkYXRlVGFnYCB3cml0ZXMgZWFjaCB0YWcncyByb3dzIG9uY2UsIGFuZCBvbmUgbG9nXG4gICAgLy8gYFF1ZXJ5YCBwZXIgaW50ZXJ2YWwgc2VydmVzIGV2ZXJ5IGhhbmRsZXIuXG4gICAgdGhpcy50YWdzID0gc2hhcmVkVGFnTWFuaWZlc3QoKTtcblxuICAgIC8vIGByZXMucmV2YWxpZGF0ZSgpYCByZWdlbmVyYXRlcyBhIHBhZ2Ugd2l0aG91dCBnb2luZyB0aHJvdWdoXG4gICAgLy8gYHJldmFsaWRhdGVUYWdgLCBzbyB0aGUgcnVudGltZSBhc2tzIGZvciB0aGUgQ0ROIGNvcGllcyBpdHNlbGYsIHRocm91Z2hcbiAgICAvLyB0aGlzIGhvb2sgKGBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlYCBpbiBgc3JjL3J1bnRpbWUvY29yZS50c2ApLiBBIGdsb2JhbFxuICAgIC8vIGJlY2F1c2UgdGhlIHJ1bnRpbWUgYW5kIHRoaXMgaGFuZGxlciBhcmUgc2VwYXJhdGUgYnVuZGxlcyBpbiBvbmUgcHJvY2Vzcy5cbiAgICAvLyBFdmVyeSBpbnN0YW5jZSByZWdpc3RlcnMgdGhlIHNhbWUgdGhpbmcsIHNvIHRoZSBsYXRlc3Qgb25lIHdpbm5pbmcgaXMgZmluZS5cbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlc0Nkbikge1xuICAgICAgKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1JFVkFMSURBVEVEX1BBR0VfSE9PS10gPSAoXG4gICAgICAgIHJvdXRlczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCB9ID0gdGhpcy5jbG91ZEZyb250Q29uZmlnO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZhbGlkYXRlQ2xvdWRGcm9udFBhdGhzKFxuICAgICAgICAgIHJvdXRlcy5mbGF0TWFwKChyb3V0ZSkgPT4gY2RuSW52YWxpZGF0aW9uUGF0aHMocm91dGUsIGJhc2VQYXRoKSksXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcuYnVja2V0TmFtZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkNES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldCwgUzMgY2FjaGUgZGlzYWJsZWRcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy50YWJsZU5hbWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBzZXQsIHJldmFsaWRhdGlvbiB0cmFja2luZyBkaXNhYmxlZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2Nlc3MuZW52LkNES19ORVhUSlNfQlVJTERfSUQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDREtfTkVYVEpTX0JVSUxEX0lEIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBzZXQsIGNhY2hlIGlzb2xhdGlvbiBtYXkgbm90IHdvcmsgY29ycmVjdGx5XCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldChcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIGN0eDogR2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbiAgKTogUHJvbWlzZTxDYWNoZUhhbmRsZXJWYWx1ZSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5idWNrZXROYW1lKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvYmplY3RLZXkgPSBzM09iamVjdEtleSh0aGlzLmNvbmZpZy5idWlsZElkLCBjYWNoZUtleSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5idWNrZXQuZ2V0KG9iamVjdEtleSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgUzMgQ0FDSEUgTUlTUzogJHtjYWNoZUtleX1gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZXJ5IG9iamVjdCBpcyBKU09OIChgcHV0SnNvbmAsIGFuZCB0aGUgc2VlZGVkIGAuanNvbmAgZmlsZXMpOyBvbmVcbiAgICAgIC8vIHRoYXQgZG9lcyBub3QgcGFyc2UgaXMgYSBtaXNzLCB0aHJvdWdoIHRoZSBgY2F0Y2hgIGJlbG93LlxuICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSBwYXJzZUNhY2hlVmFsdWUocmVzcG9uc2UpO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5pc1JldmFsaWRhdGVkKHBhcnNlZFZhbHVlLCBjdHgsIGNhY2hlS2V5KSkge1xuICAgICAgICB0aGlzLmRlYnVnKGBTMyBDQUNIRSBJTlZBTElEQVRFRCBCWSBUQUc6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgIC8vIEEgcmV2YWxpZGF0ZWQgYGZldGNoYCBlbnRyeSBoYXMgdG8gcmVhZCBhcyBhIG1pc3Mgc28gdGhlIHJlcXVlc3RcbiAgICAgICAgLy8gcmVmZXRjaGVzIGluc3RlYWQgb2YgcmV1c2luZyB0aGUgYm9keSAtIHRoZSBzYW1lIHRoaW5nIE5leHQuanMnc1xuICAgICAgICAvLyBvd24gYEZpbGVTeXN0ZW1DYWNoZWAgZG9lcyB3aXRoIGByZXZhbGlkYXRlZFRhZ3NgLiBPbmx5IGFcbiAgICAgICAgLy8gKnJlc3BvbnNlKiBlbnRyeSBnZXRzIGhhbmRlZCBiYWNrIGV4cGlyZWQsIGJlY2F1c2UgZm9yIHRob3NlIGFcbiAgICAgICAgLy8gbWlzcyBpcyB3b3JzZSB0aGFuIHN0YWxlOiBzZWUgYEVYUElSRURfTEFTVF9NT0RJRklFRGAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5laXRoZXIgaXMgZGVsZXRlZC4gVGhlIHJlZmV0Y2ggb3IgcmUtcmVuZGVyIHRoaXMgcHJvdm9rZXNcbiAgICAgICAgLy8gb3ZlcndyaXRlcyB0aGUgb2JqZWN0IHRocm91Z2ggYHNldGAsIHdpdGggYSBgbGFzdE1vZGlmaWVkYCBwYXN0IHRoZVxuICAgICAgICAvLyB0YWcncyBtYXJrZXI7IGRlbGV0aW5nIGl0IGhlcmUgYXMgd2VsbCByYWNlZCB0aGF0IHdyaXRlLCBhbmQgYVxuICAgICAgICAvLyBjb25jdXJyZW50IHJlcXVlc3QncyBmcmVzaCBlbnRyeSBjb3VsZCBiZSB0aGUgb25lIHJlbW92ZWQuIEtlZXBpbmdcbiAgICAgICAgLy8gYSByZXNwb25zZSBlbnRyeSBhbHNvIG1lYW5zIGEgcmVuZGVyIHRoYXQgZmFpbHMgaXMgYW5zd2VyZWQgZnJvbVxuICAgICAgICAvLyB0aGUgbGFzdCBnb29kIGNvcHkgcmF0aGVyIHRoYW4gZnJvbSBhIHNoZWxsLlxuICAgICAgICByZXR1cm4gaXNGZXRjaENhY2hlR2V0KGN0eClcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHsgbGFzdE1vZGlmaWVkOiBFWFBJUkVEX0xBU1RfTU9ESUZJRUQsIHZhbHVlOiBwYXJzZWRWYWx1ZS52YWx1ZSB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRlYnVnKGBTMyBDQUNIRSBISVQ6ICR7Y2FjaGVLZXl9ICgke29iamVjdEtleX0pYCk7XG5cbiAgICAgIC8vIFdpdGhvdXQgdGhlIHN0b3JlZCB0YWdzLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFzdE1vZGlmaWVkOiBwYXJzZWRWYWx1ZS5sYXN0TW9kaWZpZWQsXG4gICAgICAgIHZhbHVlOiBwYXJzZWRWYWx1ZS52YWx1ZSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBhY3R1YWwgZXJyb3JzIChhIGNhY2hlIG1pc3MgaXMgbm90IG9uZTogc2VlIGBDYWNoZUJ1Y2tldC5nZXRgKVxuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgcmV0cmlldmluZyBjYWNoZSBmcm9tIFMzOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgdGFnIHJldmFsaWRhdGlvbiBoYXMgZXhwaXJlZCBgZW50cnlgLCBmb3IgYSBgZ2V0YCB3aXRoIGBjdHhgLlxuICAgKlxuICAgKiBQdWJsaWMgYmVjYXVzZSB0aGUgaW4tbWVtb3J5IGxheWVyIGluIGZyb250IG9mIHRoaXMgaGFuZGxlciBoYXMgdG8gYXNrIHRvbzpcbiAgICogYSBtZW1vcnkgaGl0IG5ldmVyIHJlYWNoZXMge0BsaW5rIGdldH0sIGFuZCB3aXRob3V0IHRoaXMgY2hlY2sgYW4gaW5zdGFuY2VcbiAgICogb3RoZXIgdGhhbiB0aGUgb25lIHRoYXQgcmFuIGByZXZhbGlkYXRlVGFnYCBrZXB0IGFuc3dlcmluZyBmcm9tIG1lbW9yeSBmb3JcbiAgICogdGhlIHdob2xlIG1lbW9yeSBUVEwgLSBsb25nIGVub3VnaCBmb3IgQ2xvdWRGcm9udCB0byBjYWNoZSB0aGUgc3RhbGUgcGFnZVxuICAgKiBhZ2FpbiBhZnRlciB0aGUgaW52YWxpZGF0aW9uLlxuICAgKlxuICAgKiBXaGljaCB0YWdzIHRvIGNoZWNrIGRlcGVuZHMgb24gdGhlIGtpbmQsIGFuZCBOZXh0LmpzJ3Mgb3duXG4gICAqIGBGaWxlU3lzdGVtQ2FjaGUuZ2V0YCBzcGxpdHMgdGhlIHNhbWUgdHdvIHdheXM6IGEgcmVzcG9uc2UgZW50cnkgaXMgY2hlY2tlZFxuICAgKiBhZ2FpbnN0IHRoZSB0YWdzICppdCogd2FzIHN0b3JlZCB3aXRoLCBidXQgYSBgZmV0Y2hgIGVudHJ5IGlzIGNoZWNrZWRcbiAgICogYWdhaW5zdCBgWy4uLmN0eC50YWdzLCAuLi5jdHguc29mdFRhZ3NdYCDigJQgdGhlIHRhZ3Mgb2YgdGhlIHJlcXVlc3QgYXNraW5nXG4gICAqIGZvciBpdC4gVGhhdCBkaXN0aW5jdGlvbiBpcyBsb2FkLWJlYXJpbmcsIGJlY2F1c2UgYSBgZmV0Y2hgIGVudHJ5IGlzIG9ubHlcbiAgICogZXZlciBzdG9yZWQgd2l0aCBpdHMgKmV4cGxpY2l0KiBgY2FjaGU6IHsgdGFncyB9YCBhbmQgbmV2ZXIgd2l0aCB0aGVcbiAgICogaW1wbGljaXQgYF9OX1RfLzxwYXRoPmAgY2hhaW4sIHdoaWNoIGFycml2ZXMgb25seSBhcyBgY3R4LnNvZnRUYWdzYC5cbiAgICogUmVhZGluZyB0aGUgc3RvcmVkIHRhZ3MgZm9yIGEgYGZldGNoYCB0b28gbWVhbnQgYW4gdW50YWdnZWQgYGZvcmNlLWNhY2hlYFxuICAgKiBmZXRjaCBoYWQgYFtdYCwgc2tpcHBlZCB0aGUgY2hlY2sgZW50aXJlbHksIGFuZCBubyBgcmV2YWxpZGF0ZVBhdGhgIGNvdWxkXG4gICAqIGV2ZXIgZXZpY3QgaXQ6IGEgYGZvcmNlLWR5bmFtaWNgIHBhZ2Ugd2hvc2UgZGF0YSBjb21lcyBmcm9tIHN1Y2ggYSBmZXRjaFxuICAgKiByZS1yZW5kZXJlZCBvbiBldmVyeSByZXF1ZXN0IGFuZCBzdGlsbCBzZXJ2ZWQgdGhlIHNhbWUgYm9keSBmb3JldmVyLlxuICAgKiBNZWFzdXJlZCBhZ2FpbnN0IG5leHQuanMncyBgdGVzdC9lMmUvYXBwLWRpci9yZXZhbGlkYXRlLXBhdGgtd2l0aC1yZXdyaXRlc2AuXG4gICAqXG4gICAqIGBjYWNoZUtleWAgaXMgdGhlIGtleSB0aGUgZW50cnkgd2FzIHJlYWQgdW5kZXIuIEEgcmVzcG9uc2UgZW50cnkgZm91bmRcbiAgICogc3RhbGUgaXMgcmVtZW1iZXJlZCBieSBpdCwgZm9yIGBzZXRgIHRvIGludmFsaWRhdGUgQ2xvdWRGcm9udCBhZ2FpbiBvbmNlXG4gICAqIGl0cyByZWdlbmVyYXRpb24gbGFuZHM6IHNlZSB7QGxpbmsgc29mdFJldmFsaWRhdGVkS2V5c30uXG4gICAqL1xuICBhc3luYyBpc1JldmFsaWRhdGVkKFxuICAgIGVudHJ5OiB7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgdGFncz86IHN0cmluZ1tdOyB2YWx1ZT86IHVua25vd24gfSxcbiAgICBjdHg6IEdldENhY2hlSGFuZGxlckNvbnRleHQsXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy50YWJsZU5hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2hlY2tUYWdzID0gaXNGZXRjaENhY2hlR2V0KGN0eClcbiAgICAgID8gWy4uLihjdHgudGFncyA/PyBbXSksIC4uLihjdHguc29mdFRhZ3MgPz8gW10pXVxuICAgICAgOiBlbnRyeVRhZ3MoZW50cnkpO1xuICAgIGlmIChjaGVja1RhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgdGhpcy5jaGVja0lmUmV2YWxpZGF0ZWQoXG4gICAgICBlbnRyeS5sYXN0TW9kaWZpZWQgPz8gMCxcbiAgICAgIGNoZWNrVGFncyxcbiAgICApO1xuICAgIGlmIChzdGF0ZSA9PT0gXCJzdGFsZVwiICYmICFpc0ZldGNoQ2FjaGVHZXQoY3R4KSkge1xuICAgICAgdGhpcy5ub3RlU29mdFJldmFsaWRhdGVkKGNhY2hlS2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlID09PSBcImV4cGlyZWRcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1lbWJlciB0aGF0IGBjYWNoZUtleWAgd2FzIHNlcnZlZCBzdGFsZSwgd2hlbiB0aGVyZSBpcyBhIGRpc3RyaWJ1dGlvblxuICAgKiB3aG9zZSBjb3B5IG9mIGl0IHdpbGwgbmVlZCBpbnZhbGlkYXRpbmcgYWdhaW4uIFNlZVxuICAgKiB7QGxpbmsgc29mdFJldmFsaWRhdGVkS2V5c30uXG4gICAqL1xuICBwcml2YXRlIG5vdGVTb2Z0UmV2YWxpZGF0ZWQoY2FjaGVLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnZhbGlkYXRlc0Nkbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICBpZiAodGhpcy5zb2Z0UmV2YWxpZGF0ZWRLZXlzLnNpemUgPj0gTUFYX1NPRlRfUkVWQUxJREFURURfS0VZUykge1xuICAgICAgLy8gSW5zZXJ0aW9uIG9yZGVyOiB0aGUgZmlyc3Qga2V5IGlzIHRoZSBvbmUgd2FpdGluZyBsb25nZXN0LlxuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5zb2Z0UmV2YWxpZGF0ZWRLZXlzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMuZGVsZXRlKG9sZGVzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5hZGQoY2FjaGVLZXkpO1xuICB9XG5cbiAgYXN5bmMgc2V0KFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICAgZGF0YTogSW5jcmVtZW50YWxDYWNoZVZhbHVlIHwgbnVsbCxcbiAgICBjdHg6IFNldENhY2hlSGFuZGxlckNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFRoZSBlbnRyeSdzIG5hbWUgaW4gdGFnIG1hcHBpbmdzIGFuZCBDbG91ZEZyb250IHBhdGhzLCBhbmQgdGhlIG9iamVjdFxuICAgIC8vIGl0IGlzIHN0b3JlZCBpbiwgd2hpY2ggZGlmZmVyIGZvciBhIG5hbWUgdG9vIGxvbmcgZm9yIFMzLlxuICAgIGNvbnN0IHMzS2V5ID0gYnVpbGRTM0tleSh0aGlzLmNvbmZpZy5idWlsZElkLCBjYWNoZUtleSk7XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gczNPYmplY3RLZXkodGhpcy5jb25maWcuYnVpbGRJZCwgY2FjaGVLZXkpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgLy8gRGVsZXRlIGZyb20gUzMgYW5kIER5bmFtb0RCXG4gICAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIERFTEVURTogJHtjYWNoZUtleX1gKTtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmJ1Y2tldE5hbWUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZW50cnkgaXMgZ29uZSwgc28gdGhlcmUgaXMgbm8gcmVnZW5lcmF0aW9uIGxlZnQgdG8gd2FpdCBmb3IuXG4gICAgICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUoY2FjaGVLZXkpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIGVudHJ5J3MgdGFncyBiZWZvcmUgdGhlIG9iamVjdCBpcyBnb25lOiB0aGV5IGFyZSB0aGUgb25seVxuICAgICAgICAvLyB3YXkgdG8gbmFtZSBpdHMgbWFwcGluZyByb3dzLCB3aG9zZSBzb3J0IGtleSBpcyBgdGFnI3MzS2V5YCBhbmQgc29cbiAgICAgICAgLy8gY2Fubm90IGJlIHF1ZXJpZWQgZnJvbSB0aGUga2V5IHNpZGUuIFNlZSBgc3RvcmVkRW50cnlUYWdzYC5cbiAgICAgICAgY29uc3QgdGFncyA9IGF3YWl0IHRoaXMuc3RvcmVkRW50cnlUYWdzKG9iamVjdEtleSwgY3R4KTtcblxuICAgICAgICBhd2FpdCB0aGlzLnMzQ2xpZW50LnNlbmQoXG4gICAgICAgICAgbmV3IERlbGV0ZU9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmNvbmZpZy5idWNrZXROYW1lLFxuICAgICAgICAgICAgS2V5OiBvYmplY3RLZXksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIERFTEVURUQ6ICR7b2JqZWN0S2V5fWApO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRHluYW1vREJUYWdNYXBwaW5ncyhzM0tleSwgdGFncyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gYGVudHJ5VGFnc2AsIG5vdCBgZ2V0VGFncyhjdHgpYCBhbG9uZTogZm9yIGEgcGFnZSBvciByb3V0ZSByZXNwb25zZVxuICAgICAgLy8gYGN0eGAgY2FycmllcyBvbmx5IGB7IGNhY2hlQ29udHJvbCwgaXNSb3V0ZVBQUkVuYWJsZWQsIGlzRmFsbGJhY2sgfWAg4oCUXG4gICAgICAvLyBgUmVzcG9uc2VDYWNoZS5zZXRgIGJ1aWxkcyBpdCB0aGF0IHdheSBhbmQgYEluY3JlbWVudGFsQ2FjaGUuc2V0YFxuICAgICAgLy8gZm9yd2FyZHMgaXQgdW5jaGFuZ2VkIOKAlCBzbyB0aGUgdGFncyBsaXZlIGluIHRoZSByZW5kZXInc1xuICAgICAgLy8gYHgtbmV4dC1jYWNoZS10YWdzYCBoZWFkZXIgYW5kIG5vd2hlcmUgZWxzZS4gUmVhZGluZyBvbmx5IGBjdHhgIG1lYW50IG5vXG4gICAgICAvLyBydW50aW1lLXJlbmRlcmVkIHBhZ2UgZXZlciBnb3QgYSBtYXBwaW5nIHJvdywgYW5kIGEgcGFnZSB0aGF0IGlzIG5vdCBpblxuICAgICAgLy8gdGhlIGJ1aWxkJ3MgdGFnIG1hbmlmZXN0IG5hbWVzIG5vbmUgZWl0aGVyOiBhIGxhdGVyXG4gICAgICAvLyBgcmV2YWxpZGF0ZVRhZ2AgZm91bmQgbm90aGluZyB0byBpbnZhbGlkYXRlIGFuZCBDbG91ZEZyb250IGtlcHQgc2VydmluZ1xuICAgICAgLy8gdGhlIHN0YWxlIEhUTUwgYW5kIFJTQyBwYXlsb2FkIGZvciB0aGUgd2hvbGUgYHMtbWF4YWdlYC4gU2FtZSBzb3VyY2UgdGhlXG4gICAgICAvLyByZWFkIHBhdGggYWJvdmUgYWxyZWFkeSBmYWxscyBiYWNrIHRvLlxuICAgICAgY29uc3QgdGFncyA9IGVudHJ5VGFncyh7IHRhZ3M6IGdldFRhZ3MoY3R4KSwgdmFsdWU6IGRhdGEgfSk7XG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgUzMgQ0FDSEUgU0VUOiBLZXk6ICR7Y2FjaGVLZXl9LCB0YWdzOiAke3RhZ3MubGVuZ3RoID8gdGFncyA6IFwibm9uZVwifWAsXG4gICAgICApO1xuXG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmJ1Y2tldE5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgQ2FjaGVIYW5kbGVyVmFsdWUgc3RydWN0dXJlIGZvciBTMyBzdG9yYWdlIHdpdGggdGFnc1xuICAgICAgY29uc3QgY2FjaGVIYW5kbGVyVmFsdWU6IENhY2hlSGFuZGxlclZhbHVlID0ge1xuICAgICAgICAvLyBPbiB0aGUgbWFya2VyIGNsb2NrLCBzaW5jZSB0aGF0IGlzIHdoYXQgaXQgaXMgY29tcGFyZWQgd2l0aC5cbiAgICAgICAgbGFzdE1vZGlmaWVkOiBtYXJrZXJDbG9jaygpLFxuICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0b3JlIHRhZ3Mgd2l0aCB0aGUgY2FjaGUgZW50cnkgZm9yIHJldmFsaWRhdGlvbiBjaGVja2luZ1xuICAgICAgY29uc3QgY2FjaGVFbnRyeVdpdGhUYWdzID0ge1xuICAgICAgICAuLi5jYWNoZUhhbmRsZXJWYWx1ZSxcbiAgICAgICAgdGFncyxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSB3aXRoIGN1c3RvbSBoYW5kbGluZyBmb3IgTWFwIGFuZCBCdWZmZXIgb2JqZWN0c1xuICAgICAgY29uc3QgYm9keSA9IHNlcmlhbGl6ZUNhY2hlVmFsdWUoY2FjaGVFbnRyeVdpdGhUYWdzKTtcblxuICAgICAgLy8gQWx3YXlzIEpTT04gc2luY2Ugd2Ugc3RvcmUgQ2FjaGVIYW5kbGVyVmFsdWVcbiAgICAgIGF3YWl0IHRoaXMuYnVja2V0LnB1dEpzb24ob2JqZWN0S2V5LCBib2R5KTtcblxuICAgICAgdGhpcy5kZWJ1ZyhgUzMgQ0FDSEUgU1RPUkVEOiAke2NhY2hlS2V5fSAoJHtkYXRhLmtpbmR9KWApO1xuXG4gICAgICAvLyBUaGUgcmVnZW5lcmF0aW9uIG9mIGFuIGVudHJ5IHNlcnZlZCBzdGFsZTogQ2xvdWRGcm9udCBtYXkgaGF2ZSBjYWNoZWRcbiAgICAgIC8vIHRoYXQgc3RhbGUgcmVzcG9uc2UgYWZ0ZXIgYHJldmFsaWRhdGVUYWdgJ3MgaW52YWxpZGF0aW9uLCBzbyB0aGUga2V5J3NcbiAgICAgIC8vIHBhdGhzIGdvIG9uY2UgbW9yZSBub3cgdGhhdCBTMyBob2xkcyB0aGUgZnJlc2ggb25lLlxuICAgICAgaWYgKHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUoY2FjaGVLZXkpKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5zM0tleVRvSW52YWxpZGF0aW9uUGF0aChzM0tleSk7XG4gICAgICAgIGlmIChyb3V0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5kZWJ1ZyhgU09GVCBSRVZBTElEQVRJT04gUkVHRU5FUkFURUQ6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlQ2xvdWRGcm9udFBhdGhzKFxuICAgICAgICAgICAgY2RuSW52YWxpZGF0aW9uUGF0aHMocm91dGUsIHRoaXMuY2xvdWRGcm9udENvbmZpZy5iYXNlUGF0aCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0YWctdG8tY2FjaGUta2V5IG1hcHBpbmdzIGluIER5bmFtb0RCIGZvciByZXZhbGlkYXRpb25cbiAgICAgIGlmICh0YWdzLmxlbmd0aCA+IDAgJiYgdGhpcy5tYXBzVGFnc1RvUGF0aHMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgU1RPUklORyBUQUdTOiAke2NhY2hlS2V5fSAtPiBbJHt0YWdzLmpvaW4oXCIsIFwiKX1dYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmVEeW5hbW9EQlRhZ01hcHBpbmdzKHMzS2V5LCB0YWdzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHN0b3JpbmcgY2FjaGUgdG8gUzM6XCIsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXZhbGlkYXRlVGFnKFxuICAgIHRhZzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgZHVyYXRpb25zPzogUmV2YWxpZGF0ZUR1cmF0aW9ucyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFncyA9IEFycmF5LmlzQXJyYXkodGFnKSA/IHRhZyA6IFt0YWddO1xuICAgIHRoaXMuZGVidWcoYFJFVkFMSURBVElORyBUQUdTOiBbJHt0YWdzLmpvaW4oXCIsIFwiKX1dYCk7XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnLnRhYmxlTmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlY29yZCB0aGUgcmV2YWxpZGF0aW9uIGFnYWluc3QgZWFjaCB0YWcgaXRzZWxmLCBub3Qgb25seSBhZ2FpbnN0IHRoZVxuICAgIC8vIGNhY2hlIGtleXMgYWxyZWFkeSBtYXBwZWQgdG8gaXQ6IGBjaGVja0lmUmV2YWxpZGF0ZWRgIHJlYWRzIHRoZXNlIG1hcmtlclxuICAgIC8vIHJvd3MsIGFuZCBhIGJ1aWxkLXRpbWUgcHJlcmVuZGVyIGhhcyBubyBtYXBwaW5nIHJvd3MgYXQgYWxsLlxuICAgIGNvbnN0IHJlY29yZGVkID0gYXdhaXQgdGhpcy50YWdzLnVwZGF0ZSh0YWdzLCBkdXJhdGlvbnMpO1xuXG4gICAgaWYgKCF0aGlzLm1hcHNUYWdzVG9QYXRocykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYmFzZVBhdGggfSA9IHRoaXMuY2xvdWRGcm9udENvbmZpZztcbiAgICBpZiAoIXJlY29yZGVkKSB7XG4gICAgICAvLyBPdGhlciBpbnN0YW5jZXMgbWF5IG5ldmVyIGxlYXJuIG9mIHRoaXMgcmV2YWxpZGF0aW9uLCBzbyBubyBwYXRoIGxpc3RcbiAgICAgIC8vIGlzIGVub3VnaDogZHJvcCB0aGUgd2hvbGUgYXBwIGZyb20gQ2xvdWRGcm9udCByYXRoZXIgdGhhbiBzZXJ2ZSBzdGFsZVxuICAgICAgLy8gcGFnZXMgdW50aWwgdGhlaXIgVFRMLlxuICAgICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlQ2xvdWRGcm9udFBhdGhzKHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMoYmFzZVBhdGgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZXR0bGVkIHJhdGhlciB0aGFuIGBhbGxgOiBvbmUgdGFnJ3MgdGhyb3R0bGVkIFF1ZXJ5IG11c3Qgbm90IGRyb3AgdGhlXG4gICAgLy8gQ2xvdWRGcm9udCBwYXRocyBldmVyeSBvdGhlciB0YWcgcmVzb2x2ZWQuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRhZ3MubWFwKCh0KSA9PiB0aGlzLnRhZ1JvdXRlcyh0KSksXG4gICAgKTtcbiAgICBjb25zdCByb3V0ZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHdob2xlQXBwID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVhZGluZyB0YWcgbWFwcGluZ3M6XCIsIHJlc3VsdC5yZWFzb24pO1xuICAgICAgICAvLyBUaGUgdGFnJ3MgZW50cmllcyBhcmUgcmV2YWxpZGF0ZWQgYXQgdGhlIG9yaWdpbiB3aGlsZSBub3RoaW5nIG5hbWVzXG4gICAgICAgIC8vIHRoZWlyIENsb3VkRnJvbnQgcGF0aHMuIFRoZSBzYW1lIGFuc3dlciBhcyBhIHRhZyBjdXQgc2hvcnQgYnlcbiAgICAgICAgLy8gYE1BWF9UQUdfUVVFUllfUEFHRVNgOiB0aGUgd2hvbGUgYXBwLCBuZXZlciBhIHN0YWxlIHBhZ2UuXG4gICAgICAgIHdob2xlQXBwID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByb3V0ZXMucHVzaCguLi5yZXN1bHQudmFsdWUucm91dGVzKTtcbiAgICAgIHdob2xlQXBwIHx8PSByZXN1bHQudmFsdWUudHJ1bmNhdGVkO1xuICAgIH1cblxuICAgIC8vIEludmFsaWRhdGUgdGhlIENETiBlZGdlIGNhY2hlIHNvIENsb3VkRnJvbnQtZnJvbnRlZCBkZXBsb3ltZW50cyBkb24ndFxuICAgIC8vIGtlZXAgc2VydmluZyBzdGFsZSByZXNwb25zZXMgdW50aWwgdGhlIGNhY2hlIHBvbGljeSdzIFRUTCBuYXR1cmFsbHlcbiAgICAvLyBleHBpcmVzLiBPbmUgcmVxdWVzdCBmb3IgZXZlcnkgdGFnIGF0IG9uY2U6IHNlZVxuICAgIC8vIGBNQVhfV0lMRENBUkRfUEFUSFNfUEVSX0lOVkFMSURBVElPTmAgZm9yIHdoeSBuZXZlciBzZXZlcmFsLlxuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZUNsb3VkRnJvbnRQYXRocyhcbiAgICAgIHdob2xlQXBwXG4gICAgICAgID8gd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyhiYXNlUGF0aClcbiAgICAgICAgOiByb3V0ZXMuZmxhdE1hcCgocm91dGUpID0+IGNkbkludmFsaWRhdGlvblBhdGhzKHJvdXRlLCBiYXNlUGF0aCkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJvdXRlcyBDbG91ZEZyb250IGNvdWxkIGJlIGhvbGRpbmcgYSByZXNwb25zZSBmb3IgYHRhZ2AgdW5kZXIgLVxuICAgKiBgdHJ1bmNhdGVkYCB3aGVuIHRoZXkgY291bGQgbm90IGFsbCBiZSBuYW1lZDogbW9yZSBtYXBwaW5nIHJvd3MgdGhhblxuICAgKiB7QGxpbmsgTUFYX1RBR19RVUVSWV9QQUdFU30sIG9yIG5vIGJ1aWxkIHRhZyBtYW5pZmVzdCB0byByZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0YWdSb3V0ZXMoXG4gICAgdGFnOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyByb3V0ZXM6IHN0cmluZ1tdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHNrUHJlZml4ID0gdGhpcy50YWdNYXBwaW5nUHJlZml4KHRhZyk7XG4gICAgY29uc3QgW3sgaXRlbXMsIHRydW5jYXRlZCB9LCBidWlsZFRhZ3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5xdWVyeVRhZ01hcHBpbmdzKHRhZywgc2tQcmVmaXgpLFxuICAgICAgdGhpcy5idWlsZFRhZ01hbmlmZXN0KCksXG4gICAgXSk7XG4gICAgLy8gRXh0cmFjdCBTMyBrZXlzIGZyb20gc29ydCBrZXlzIChmb3JtYXQ6IFwidGFnI3MzS2V5XCIpLiBTcGxpdCBhdCB0aGUgdGFnJ3NcbiAgICAvLyBvd24gbGVuZ3RoIHJhdGhlciB0aGFuIGF0IHRoZSBmaXJzdCBcIiNcIjogYSB0YWcgaXMgYXBwLWRlZmluZWQgYW5kIG1heVxuICAgIC8vIGNvbnRhaW4gb25lLCBhbmQgYHJldmFsaWRhdGVUYWcoXCJ1c2VyIzQyXCIpYCB0aGVuIHlpZWxkZWRcbiAgICAvLyBcIjQyIzxidWlsZElkPi9hY2NvdW50Lmpzb25cIiDigJQgd2hvc2UgaW52YWxpZGF0aW9uIHBhdGhcbiAgICAvLyAoXCIvNDIjPGJ1aWxkSWQ+L2FjY291bnRcIikgbmFtZXMgbm90aGluZyBDbG91ZEZyb250IGNhY2hlZCwgc28gdGhlIGVkZ2VcbiAgICAvLyBrZXB0IHNlcnZpbmcgdGhlIHN0YWxlIHBhZ2UuXG4gICAgLy9cbiAgICAvLyBUaGUgc2FtZSBgI2AgbWFrZXMgYGJlZ2luc193aXRoKHNrLCBcInVzZXIjXCIpYCBtYXRjaCByb3dzIHRoYXQgYXJlIG5vdFxuICAgIC8vIGB1c2VyYCdzIGF0IGFsbDogdGhlIG1hcmtlciByb3cgb2YgdGFnIGB1c2VyIzQyYCAoc2sgYHVzZXIjNDJgKSBhbmQgZXZlcnlcbiAgICAvLyBtYXBwaW5nIHJvdyBvZiBpdCAoYHVzZXIjNDIjPGJ1aWxkSWQ+L+KApmApLiBXaGF0IGlzIGxlZnQgYWZ0ZXIgdGhlIHByZWZpeFxuICAgIC8vIGlzIGFuIFMzIGtleSBvbmx5IGlmIGl0IHN0YXJ0cyB3aXRoIHRoZSBidWlsZCdzIG93biBwcmVmaXgsIHdoaWNoIGlzIGhvd1xuICAgIC8vIGBidWlsZFMzS2V5YCB3cml0ZXMgZXZlcnkgb25lLlxuICAgIC8vXG4gICAgLy8gQSByb3cgd2hvc2Uga2V5IHdvdWxkIG5vdCBmaXQgYSBzb3J0IGtleSBoYXMgaXQgaGFzaGVkIHRoZXJlLCBhbmQgZXZlcnlcbiAgICAvLyByb3cgY2FycmllcyBpdCBpbiBgczNLZXlgIChyb3dzIHdyaXR0ZW4gYmVmb3JlIHRoYXQgYXR0cmlidXRlIGZhbGwgYmFja1xuICAgIC8vIHRvIHRoZSBzb3J0IGtleSk6IHNlZSBgdGFnTWFwcGluZ1NvcnRLZXlgLiBBbiBlbXB0eSByZW1haW5kZXIgaXMgbmV2ZXIgYVxuICAgIC8vIG1hcHBpbmcgcm93OiBpdCBpcyB0aGUgbWFya2VyIHJvdyBvZiBhIHRhZyBvbmUgYCNgIGxvbmdlci5cbiAgICBjb25zdCBwcmVmaXhMZW5ndGggPSBza1ByZWZpeC5sZW5ndGg7XG4gICAgY29uc3Qga2V5UHJlZml4ID0gdGhpcy5jb25maWcuYnVpbGRJZCA/IGAke3RoaXMuY29uZmlnLmJ1aWxkSWR9L2AgOiBcIlwiO1xuICAgIGNvbnN0IHMzS2V5cyA9IGl0ZW1zLmZsYXRNYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHJlc3QgPSBpdGVtLnNrPy5TPy5zbGljZShwcmVmaXhMZW5ndGgpO1xuICAgICAgcmV0dXJuIHJlc3QgJiYgcmVzdC5zdGFydHNXaXRoKGtleVByZWZpeCkgPyBbaXRlbS5zM0tleT8uUyA/PyByZXN0XSA6IFtdO1xuICAgIH0pO1xuICAgIC8vIFRoZSBidWlsZC10aW1lIHByZXJlbmRlcnMgY2FycnlpbmcgdGhlIHRhZywgd2hpY2ggbm8gYHNldGAgd3JvdGUgYSByb3dcbiAgICAvLyBmb3IuXG4gICAgZm9yIChjb25zdCBjYWNoZUtleSBvZiBidWlsZFRhZ3M/LmdldCh0YWcpID8/IFtdKSB7XG4gICAgICBzM0tleXMucHVzaChidWlsZFMzS2V5KHRoaXMuY29uZmlnLmJ1aWxkSWQsIGNhY2hlS2V5KSk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBUQUcgJHt0YWd9OiBGb3VuZCAke3MzS2V5cy5sZW5ndGh9IGNhY2hlIGVudHJpZXMgdG8gaW52YWxpZGF0ZWAsXG4gICAgKTtcblxuICAgIC8vIFRoZSBtYXBwaW5nIHJvd3MgdGhlbXNlbHZlcyBhcmUgZGVsaWJlcmF0ZWx5IGxlZnQgYWxvbmUuIFN0YW1waW5nXG4gICAgLy8gYHJldmFsaWRhdGVkQXRgIG9uIGVhY2ggYHRhZyNjYWNoZUtleWAgcm93IGlzIHdoYXQgdGhpcyB1c2VkIHRvIGRvLCBhbmRcbiAgICAvLyBub3RoaW5nIGhhcyByZWFkIHRoYXQgYXR0cmlidXRlIHNpbmNlIGBjaGVja0lmUmV2YWxpZGF0ZWRgIGJlZ2FuIHJlYWRpbmdcbiAgICAvLyB0aGUgYmFyZS10YWcgbWFya2VyIHJvdyB3cml0dGVuIGFib3ZlIOKAlCBzbyB0aGUgd3JpdGVzIHdlcmUgZGVhZCwgYW5kIHRoZXlcbiAgICAvLyB3ZXJlIGRlYWQgKmluIGZyb250IG9mKiB0aGUgaW52YWxpZGF0aW9uLiBPbmUgdGhyb3R0bGVkIGBVcGRhdGVJdGVtYFxuICAgIC8vIHJlamVjdGVkIHRoZSBiYXRjaCwgdGhlIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uIG5ldmVyIHJhbiwgYW5kIHRoZSBvbmx5XG4gICAgLy8gdHJhY2Ugd2FzIGEgYGNvbnNvbGUuZXJyb3JgIHdoaWxlIHRoZSBlZGdlIGtlcHQgc2VydmluZyB0aGUgc3RhbGUgcGFnZS5cbiAgICAvL1xuICAgIC8vIERlbGliZXJhdGVseSBub3QgZGVsZXRpbmcgdGhlIHRhZydzIFMzIG9iamVjdHMgZWl0aGVyLiBUaGUgbWFya2VyIHJvd1xuICAgIC8vIGFib3ZlIGlzIHdoYXQgaW52YWxpZGF0ZXMgdGhlbTogYGdldGAgY29tcGFyZXMgaXQgYWdhaW5zdCBlYWNoIGVudHJ5J3NcbiAgICAvLyBvd24gYGxhc3RNb2RpZmllZGAgYW5kIGhhbmRzIHRoZSBlbnRyeSBiYWNrIGV4cGlyZWQsIHdoaWNoIGlzIHRoZSBzaWduYWxcbiAgICAvLyB0aGF0IG1ha2VzIE5leHQuanMgcmUtcmVuZGVyICp0aGlzKiByb3V0ZSBhbmQgc3RvcmUgdGhlIHJlc3VsdCAoc2VlXG4gICAgLy8gYEVYUElSRURfTEFTVF9NT0RJRklFRGApLiBEZWxldGluZyB0aGUgb2JqZWN0IGluc3RlYWQgdHVybmVkIHRoZSBuZXh0XG4gICAgLy8gcmVxdWVzdCBpbnRvIGEgaGFyZCBtaXNzLCBhbmQgYSBoYXJkIG1pc3Mgb24gYSBQUFIgcm91dGUgaXMgYW5zd2VyZWQgZnJvbVxuICAgIC8vIHRoZSByb3V0ZSdzIGZhbGxiYWNrIHNoZWxsIOKAlCB1bmNhY2hlYWJsZSwgYW5kIG5ldmVyIHVwZ3JhZGVkIGJhY2sgaW50byBhXG4gICAgLy8gY29uY3JldGUgZW50cnksIHNvIG9uZSBgcmV2YWxpZGF0ZVRhZ2AgbGVmdCB0aGUgcGFnZSByZXN1bWluZ1xuICAgIC8vIGR5bmFtaWNhbGx5IGZvciBnb29kLlxuICAgIGNvbnN0IHJvdXRlcyA9IHMzS2V5c1xuICAgICAgLm1hcCgoczNLZXkpID0+IHRoaXMuczNLZXlUb0ludmFsaWRhdGlvblBhdGgoczNLZXkpKVxuICAgICAgLmZpbHRlcigocm91dGUpOiByb3V0ZSBpcyBzdHJpbmcgPT4gcm91dGUgIT09IHVuZGVmaW5lZCk7XG4gICAgLy8gQSBgcmV2YWxpZGF0ZVBhdGhgIG5hbWVzIGl0cyBwYXRoIGluIHRoZSB0YWcgaXRzZWxmLCB3aGljaCBpcyB0aGUgb25seVxuICAgIC8vIHdheSB0byByZWFjaCBhIGJ1aWxkLXRpbWUgcHJlcmVuZGVyJ3MgQ0ROIGNvcHkgd2hlbiBpdCBoYXMgbm8gbWFwcGluZ1xuICAgIC8vIHJvdy5cbiAgICByb3V0ZXMucHVzaCguLi5pbXBsaWNpdFRhZ1BhdGhzKHRhZykpO1xuICAgIHJldHVybiB7IHJvdXRlcywgdHJ1bmNhdGVkOiB0cnVuY2F0ZWQgfHwgIWJ1aWxkVGFncyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZC10aW1lIHByZXJlbmRlcnMnIGNhY2hlIGtleXMgYnkgdGFnICh7QGxpbmsgSU5JVF9DQUNIRV9UQUdfTUFOSUZFU1R9KSxcbiAgICogcmVhZCBmcm9tIHRoZSBjYWNoZSBidWNrZXQgb25jZSBwZXIgaW5zdGFuY2UsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhhdFxuICAgKiBmYWlsZWQsIHRvIGJlIHJlYWQgYWdhaW4gbmV4dCB0aW1lLiBBIHByZXJlbmRlciBpcyB3cml0dGVuIGJ5IHRoZSBhZGFwdGVyLFxuICAgKiBuZXZlciB0aHJvdWdoIGBzZXRgLCBzbyB0aGlzIGlzIHRoZSBvbmx5IHJlY29yZCBvZiB3aGljaCB0YWdzIG5hbWUgaXRzXG4gICAqIENsb3VkRnJvbnQgcGF0aHMsIGFuZCBpdCBpcyBzZXJ2ZWQgd2l0aCBhIHllYXItbG9uZyBgcy1tYXhhZ2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRhZ01hbmlmZXN0KCk6IFByb21pc2U8TWFwPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkPiB7XG4gICAgdGhpcy5idWlsZFRhZ3MgPz89IHRoaXMuYnVja2V0XG4gICAgICAuZ2V0KGAke3RoaXMuY29uZmlnLmJ1aWxkSWR9LyR7SU5JVF9DQUNIRV9UQUdfTUFOSUZFU1R9YClcbiAgICAgIC8vIE5vbmUgaXMgbm9ybWFsOiBvbmx5IHRhZ2dlZCBwcmVyZW5kZXJzIHdyaXRlIG9uZS5cbiAgICAgIC50aGVuKChvYmplY3QpID0+IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoSlNPTi5wYXJzZShvYmplY3QgPz8gXCJ7fVwiKSkpKTtcbiAgICByZXR1cm4gdGhpcy5idWlsZFRhZ3MuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICB0aGlzLmJ1aWxkVGFncyA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCByZWFkIHRoZSBidWlsZCdzIHRhZyBtYW5pZmVzdDpcIiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVyeSBtYXBwaW5nIHJvdyBmb3IgYHRhZ2AgLSB0aG9zZSB3aG9zZSBzb3J0IGtleSBzdGFydHMgd2l0aFxuICAgKiBgc2tQcmVmaXhgLCBpdHMge0BsaW5rIHRhZ01hcHBpbmdQcmVmaXh9IC0gZm9sbG93aW5nIGBMYXN0RXZhbHVhdGVkS2V5YCwgYW5kIHdoZXRoZXJcbiAgICoge0BsaW5rIE1BWF9UQUdfUVVFUllfUEFHRVN9IGN1dCB0aGUgd2FsayBzaG9ydC5cbiAgICpcbiAgICogRHluYW1vREIgY2FwcyBhIFF1ZXJ5IGF0IDEgTUIgb2YgaXRlbXMgcmVnYXJkbGVzcyBvZiBob3cgbWFueSBtYXRjaCwgYW5kXG4gICAqIHRoZXJlIGlzIG9uZSByb3cgcGVyIHRhZ2dlZCBlbnRyeSBhIHJ1bnRpbWUgYHNldGAgd3JvdGUsIHNvIGEgbGFyZ2Ugc2l0ZVxuICAgKiBwYXNzZXMgMSBNQiBvbiBhIGNvbW1vbiB0YWcuIFN0b3BwaW5nIGF0IHRoZVxuICAgKiBmaXJzdCBwYWdlIGludmFsaWRhdGVzIG9ubHkgdGhhdCBwYWdlJ3MgZW50cmllcyB3aGlsZSBzdGlsbCByZXBvcnRpbmdcbiAgICogc3VjY2Vzcywgd2hpY2ggaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSByZXZhbGlkYXRpb24gaGF2aW5nIHdvcmtlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcXVlcnlUYWdNYXBwaW5ncyhcbiAgICB0YWc6IHN0cmluZyxcbiAgICBza1ByZWZpeDogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgaXRlbXM6IFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPltdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT5bXSA9IFtdO1xuICAgIGxldCBleGNsdXNpdmVTdGFydEtleTogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBwYWdlcyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZHluYW1vQ2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBRdWVyeUNvbW1hbmQoe1xuICAgICAgICAgIFRhYmxlTmFtZTogdGhpcy5jb25maWcudGFibGVOYW1lLFxuICAgICAgICAgIEtleUNvbmRpdGlvbkV4cHJlc3Npb246IFwicGsgPSA6cGsgQU5EIGJlZ2luc193aXRoKHNrLCA6c2tQcmVmaXgpXCIsXG4gICAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgXCI6cGtcIjogeyBTOiB0aGlzLmNvbmZpZy5idWlsZElkIH0sXG4gICAgICAgICAgICBcIjpza1ByZWZpeFwiOiB7IFM6IHNrUHJlZml4IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBFeGNsdXNpdmVTdGFydEtleTogZXhjbHVzaXZlU3RhcnRLZXksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGl0ZW1zLnB1c2goLi4uKHJlc3BvbnNlLkl0ZW1zID8/IFtdKSk7XG4gICAgICBleGNsdXNpdmVTdGFydEtleSA9IHJlc3BvbnNlLkxhc3RFdmFsdWF0ZWRLZXk7XG4gICAgICBwYWdlcysrO1xuICAgIH0gd2hpbGUgKGV4Y2x1c2l2ZVN0YXJ0S2V5ICYmIHBhZ2VzIDwgTUFYX1RBR19RVUVSWV9QQUdFUyk7XG5cbiAgICBjb25zdCB0cnVuY2F0ZWQgPSBleGNsdXNpdmVTdGFydEtleSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICh0cnVuY2F0ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFN0b3BwZWQgcGFnaW5hdGluZyB0YWcgXCIke3RhZ31cIiBhZnRlciAke3BhZ2VzfSBwYWdlcyBgICtcbiAgICAgICAgICBgKCR7aXRlbXMubGVuZ3RofSBlbnRyaWVzKTsgaW52YWxpZGF0aW5nIHRoZSB3aG9sZSBhcHAgaW5zdGVhZC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaXRlbXMsIHRydW5jYXRlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVyc2VzIGBidWlsZFMzS2V5YCB0byByZWNvdmVyIHRoZSByb3V0ZSB0aGUgcmVzcG9uc2Ugd2FzIGNhY2hlZCBmb3IsIGZvclxuICAgKiB7QGxpbmsgY2RuSW52YWxpZGF0aW9uUGF0aHN9IHRvIHR1cm4gaW50byB0aGUgVVJJcyBDbG91ZEZyb250IGhvbGRzIGl0IHVuZGVyLCBvclxuICAgKiBgdW5kZWZpbmVkYCBmb3IgYSBrZXkgdGhhdCBuYW1lcyBubyBjYWNoZWQgVVJJLlxuICAgKlxuICAgKiBUd28ga2luZHMgb2YgbWFwcGluZyByb3cgZG8gbm90OiBhIGR5bmFtaWMgcm91dGUgdGVtcGxhdGUgKGBibG9nL1tzbHVnXS5qc29uYCxcbiAgICogd2hpY2ggdGhlIGFkYXB0ZXIncyBzZWVkZWQgZW50cmllcyBpbmNsdWRlKSwgYW5kIGEgZmV0Y2gtY2FjaGUgZW50cnksIHdob3NlXG4gICAqIGtleSBpcyBhbiBvcGFxdWUgaGFzaCByYXRoZXIgdGhhbiBhIHJvdXRlLiBCb3RoIHdvdWxkIGludmFsaWRhdGUgYSBVUkkgdGhhdFxuICAgKiBjYW5ub3QgZXhpc3QsIGFuZCBlYWNoIG9uZSBjb3N0cyBvbmUgb2YgdGhlIGZpZnRlZW4gd2lsZGNhcmQgcGF0aHMgYW5cbiAgICogaW52YWxpZGF0aW9uIG1heSBjYXJyeSDigJQgc28gdGhleSBhcmUgZHJvcHBlZCBoZXJlIHJhdGhlciB0aGFuIGNyb3dkaW5nIG91dFxuICAgKiB0aGUgcmVhbCBvbmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzM0tleVRvSW52YWxpZGF0aW9uUGF0aChzM0tleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwcmVmaXggPSBgJHt0aGlzLmNvbmZpZy5idWlsZElkfS9gO1xuICAgIGNvbnN0IHdpdGhvdXRQcmVmaXggPSBzM0tleS5zdGFydHNXaXRoKHByZWZpeClcbiAgICAgID8gczNLZXkuc2xpY2UocHJlZml4Lmxlbmd0aClcbiAgICAgIDogczNLZXk7XG4gICAgY29uc3Qgd2l0aG91dFN1ZmZpeCA9IHdpdGhvdXRQcmVmaXguZW5kc1dpdGgoXCIuanNvblwiKVxuICAgICAgPyB3aXRob3V0UHJlZml4LnNsaWNlKDAsIC1cIi5qc29uXCIubGVuZ3RoKVxuICAgICAgOiB3aXRob3V0UHJlZml4O1xuXG4gICAgaWYgKHdpdGhvdXRTdWZmaXguaW5jbHVkZXMoXCJbXCIpIHx8IGlzRmV0Y2hDYWNoZUtleSh3aXRob3V0U3VmZml4KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gbmV4dCA+PSAxNi4zLjg6IGByb3V0ZS1jYWNoZS88a2luZD4vPGhhc2g+LyQ8cGF0aG5hbWU+YCwgdGhlIHBhdGhuYW1lXG4gICAgLy8gdGhyb3VnaCBgbm9ybWFsaXplUGFnZVBhdGhgLlxuICAgIGNvbnN0IHJvdXRlQ2FjaGVLZXkgPSBST1VURV9DQUNIRV9LRVlfUFJFRklYLmV4ZWMod2l0aG91dFN1ZmZpeCk7XG4gICAgaWYgKHJvdXRlQ2FjaGVLZXkpIHtcbiAgICAgIHJldHVybiBkZW5vcm1hbGl6ZVBhZ2VQYXRoKHdpdGhvdXRTdWZmaXguc2xpY2Uocm91dGVDYWNoZUtleVswXS5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPT09IFwiaW5kZXhcIiA/IFwiL1wiIDogYC8ke3dpdGhvdXRTdWZmaXh9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlIGBwYXRoc2AgaW4gYSBzaW5nbGUgcmVxdWVzdCwgb3IgdGhlIHdob2xlIGFwcFxuICAgKiAoe0BsaW5rIHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHN9KSB3aGVuIHRoZXkgd291bGQgbm90IGZpdCBpbiBvbmUuIFNlZVxuICAgKiB7QGxpbmsgTUFYX1dJTERDQVJEX1BBVEhTX1BFUl9JTlZBTElEQVRJT059LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbnZhbGlkYXRlQ2xvdWRGcm9udFBhdGhzKHBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBiYXRjaCA9IEFycmF5LmZyb20obmV3IFNldChwYXRocykpO1xuICAgIGlmIChiYXRjaC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkaXN0cmlidXRpb25JZCA9IGF3YWl0IHRoaXMuZ2V0RGlzdHJpYnV0aW9uSWQoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCByZXNvbHZlIHRoZSBkaXN0cmlidXRpb24gdG8gaW52YWxpZGF0ZTpcIiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gICAgaWYgKCFkaXN0cmlidXRpb25JZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdpbGRjYXJkcyA9IGJhdGNoLmZpbHRlcihpc1dpbGRjYXJkUGF0aCkubGVuZ3RoO1xuICAgIGlmIChcbiAgICAgIHdpbGRjYXJkcyA+IE1BWF9XSUxEQ0FSRF9QQVRIU19QRVJfSU5WQUxJREFUSU9OIHx8XG4gICAgICBiYXRjaC5sZW5ndGggPiBNQVhfUEFUSFNfUEVSX0lOVkFMSURBVElPTlxuICAgICkge1xuICAgICAgY29uc3Qgd2hvbGVBcHAgPSB3aG9sZUFwcEludmFsaWRhdGlvblBhdGhzKFxuICAgICAgICB0aGlzLmNsb3VkRnJvbnRDb25maWcuYmFzZVBhdGgsXG4gICAgICApO1xuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYENMT1VERlJPTlQgSU5WQUxJREFUSU9OOiAke2JhdGNoLmxlbmd0aH0gcGF0aHMgKCR7d2lsZGNhcmRzfSBgICtcbiAgICAgICAgICBgd2lsZGNhcmRzKSBkbyBub3QgZml0IG9uZSByZXF1ZXN0LCBjb2xsYXBzaW5nIHRvIGAgK1xuICAgICAgICAgIGBbJHt3aG9sZUFwcC5qb2luKFwiLCBcIil9XWAsXG4gICAgICApO1xuICAgICAgYmF0Y2ggPSB3aG9sZUFwcDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgOyBhdHRlbXB0KyspIHtcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBDTE9VREZST05UIElOVkFMSURBVElPTjogWyR7YmF0Y2guam9pbihcIiwgXCIpfV0gb24gZGlzdHJpYnV0aW9uICR7ZGlzdHJpYnV0aW9uSWR9YCxcbiAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNsb3VkRnJvbnRDbGllbnQuc2VuZChcbiAgICAgICAgICBuZXcgQ3JlYXRlSW52YWxpZGF0aW9uQ29tbWFuZCh7XG4gICAgICAgICAgICBEaXN0cmlidXRpb25JZDogZGlzdHJpYnV0aW9uSWQsXG4gICAgICAgICAgICBJbnZhbGlkYXRpb25CYXRjaDoge1xuICAgICAgICAgICAgICBDYWxsZXJSZWZlcmVuY2U6IHJhbmRvbVVVSUQoKSxcbiAgICAgICAgICAgICAgUGF0aHM6IHtcbiAgICAgICAgICAgICAgICBRdWFudGl0eTogYmF0Y2gubGVuZ3RoLFxuICAgICAgICAgICAgICAgIEl0ZW1zOiBiYXRjaCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChpc0ludmFsaWRhdGlvblF1b3RhRXJyb3IoZXJyb3IpICYmIGF0dGVtcHQgPCBJTlZBTElEQVRJT05fUkVUUklFUykge1xuICAgICAgICAgIC8vIFNlZSBgSU5WQUxJREFUSU9OX1JFVFJJRVNgLlxuICAgICAgICAgIGJhdGNoID0gd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyh0aGlzLmNsb3VkRnJvbnRDb25maWcuYmFzZVBhdGgpO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBJTlZBTElEQVRJT05fUkVUUllfREVMQVlfTVMgKiAyICoqIGF0dGVtcHQpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9nIGJ1dCBkb24ndCBmYWlsIC0gdGhlIFMzL0R5bmFtb0RCIGludmFsaWRhdGlvbiBhbHJlYWR5IHN1Y2NlZWRlZCxcbiAgICAgICAgLy8gYW5kIHRoZSBDbG91ZEZyb250IGNhY2hlIHBvbGljeSBUVEwgcHJvdmlkZXMgYW4gZXZlbnR1YWwgZmFsbGJhY2suXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBDbG91ZEZyb250IGludmFsaWRhdGlvbiBmb3IgWyR7YmF0Y2guam9pbihcIiwgXCIpfV06YCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlzdHJpYnV0aW9uJ3MgcGh5c2ljYWwgSUQsIGZyb20gdGhlIGVudmlyb25tZW50IG9yIGVsc2UgU1NNIFBhcmFtZXRlclxuICAgKiBTdG9yZSwgY2FjaGVkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhpcyBpbnN0YW5jZS4gU2VlXG4gICAqIGBDbG91ZEZyb250SW52YWxpZGF0aW9uQ29uZmlnYCBmb3Igd2h5IEZ1bmN0aW9ucyBuZWVkIHRoZSBpbmRpcmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0RGlzdHJpYnV0aW9uSWQoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgaWYgKHRoaXMuY2xvdWRGcm9udENvbmZpZy5kaXN0cmlidXRpb25JZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xvdWRGcm9udENvbmZpZy5kaXN0cmlidXRpb25JZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FjaGVkRGlzdHJpYnV0aW9uSWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZERpc3RyaWJ1dGlvbklkO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jbG91ZEZyb250Q29uZmlnLmRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNzbUNsaWVudC5zZW5kKFxuICAgICAgbmV3IEdldFBhcmFtZXRlckNvbW1hbmQoe1xuICAgICAgICBOYW1lOiB0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWRQYXJhbWV0ZXJOYW1lLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMuY2FjaGVkRGlzdHJpYnV0aW9uSWQgPSByZXNwb25zZS5QYXJhbWV0ZXI/LlZhbHVlIHx8IG51bGw7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkRGlzdHJpYnV0aW9uSWQ7XG4gIH1cblxuICBhc3luYyByZXNldFJlcXVlc3RDYWNoZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUaGlzIGhhbmRsZXIgZG9lc24ndCBtYWludGFpbiByZXF1ZXN0LWxldmVsIGNhY2hlIHN0YXRlXG4gICAgLy8gVGhlIGFjdHVhbCBjYWNoZSBjbGVhcmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZW1vcnkgY2FjaGUgaGFuZGxlclxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBkZXBsb3ltZW50IGtlZXBzIGB0YWcjczNLZXlgIG1hcHBpbmcgcm93cyBhdCBhbGwuXG4gICAqXG4gICAqIFRoZWlyIG9uZSByZWFkZXIgaXMgYHJldmFsaWRhdGVUYWdgJ3MgQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24sIHdoaWNoIG5lZWRzXG4gICAqIHRoZSBlbnRyaWVzJyBwYXRocyAtIHRhZyByZXZhbGlkYXRpb24gaXRzZWxmIHJ1bnMgb24gdGhlIGJhcmUtdGFnIG1hcmtlclxuICAgKiByb3dzLiBBIGRlcGxveW1lbnQgd2l0aCBubyBkaXN0cmlidXRpb24gKHRoZSBSZWdpb25hbCBjb25zdHJ1Y3RzKSB3b3VsZCBwYXlcbiAgICogYSBEeW5hbW9EQiB3cml0ZSBwZXIgdGFnIG9uIGV2ZXJ5IGBzZXRgLCBhIFF1ZXJ5IHBlciBgcmV2YWxpZGF0ZVRhZ2AsIGFuZCBhblxuICAgKiBleHRyYSBTMyByZWFkIGJlZm9yZSBldmVyeSBkZWxldGUsIGZvciByb3dzIG5vdGhpbmcgZXZlciByZWFkcy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IG1hcHNUYWdzVG9QYXRocygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNvbmZpZy50YWJsZU5hbWUpICYmIHRoaXMuaW52YWxpZGF0ZXNDZG47XG4gIH1cblxuICAvKiogV2hldGhlciB0aGVyZSBpcyBhIGRpc3RyaWJ1dGlvbiB0byBpbnZhbGlkYXRlLiAqL1xuICBwcml2YXRlIGdldCBpbnZhbGlkYXRlc0NkbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIHRoaXMuY2xvdWRGcm9udENvbmZpZy5kaXN0cmlidXRpb25JZCB8fFxuICAgICAgdGhpcy5jbG91ZEZyb250Q29uZmlnLmRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzb3J0IGtleSBvZiBgdGFnYCdzIG1hcHBpbmcgcm93IGZvciBgczNLZXlgOiBgPHByZWZpeD5zM0tleWAsIG9yLCB3aGVuXG4gICAqIHRoYXQgcGFzc2VzIER5bmFtb0RCJ3MgMTAyNC1ieXRlIHNvcnQga2V5IGxpbWl0LCBgPHByZWZpeD48YnVpbGRJZD4vIzxzaGEyNTY+YC5cbiAgICogRWl0aGVyIHdheSB0aGUgcm93IGNhcnJpZXMgdGhlIGtleSBpdHNlbGYgaW4gYHMzS2V5YC4gbmV4dCAxNi4zLjgnc1xuICAgKiByb3V0ZS1zY29wZWQga2V5cyBhcmUgfjg4IGJ5dGVzIGxvbmdlciB0aGFuIGEgcGF0aG5hbWUsIGVub3VnaCB0byBwdXNoIGFcbiAgICogbG9uZyB0YWcgb24gYSBsb25nIHBhdGggb3ZlciAtIGFuZCBhIHJlamVjdGVkIGBQdXRJdGVtYCBsZWZ0XG4gICAqIGByZXZhbGlkYXRlVGFnYCBub3RoaW5nIHRvIGludmFsaWRhdGUsIHNvIENsb3VkRnJvbnQga2VwdCB0aGUgc3RhbGUgcGFnZS5cbiAgICogVGhlIHByZWZpeCBpcyB7QGxpbmsgdGFnTWFwcGluZ1ByZWZpeH0ncywgd2hpY2gge0BsaW5rIE1BWF9UQUdfQllURVN9IGFuZFxuICAgKiB0aGUgYnVpbGQgSUQncyBjYXAgbGVhdmUgcm9vbSBmb3IgdGhlIGhhc2hlZCBmb3JtIGFmdGVyLlxuICAgKi9cbiAgcHJpdmF0ZSB0YWdNYXBwaW5nU29ydEtleSh0YWc6IHN0cmluZywgczNLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gdGhpcy50YWdNYXBwaW5nUHJlZml4KHRhZyk7XG4gICAgY29uc3Qgc2sgPSBgJHtwcmVmaXh9JHtzM0tleX1gO1xuICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzaykgPD0gTUFYX1NPUlRfS0VZX0JZVEVTXG4gICAgICA/IHNrXG4gICAgICA6IGAke3ByZWZpeH0ke3RoaXMuY29uZmlnLmJ1aWxkSWR9LyR7aGFzaGVkVGFnKHMzS2V5KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgZXZlcnkgbWFwcGluZyByb3cgb2YgYHRhZ2Agc3RhcnRzIHdpdGgsIGFuZCBzbyB3aGF0XG4gICAqIHtAbGluayBxdWVyeVRhZ01hcHBpbmdzfSBtYXRjaGVzOiBgPHNvcnRLZXlUYWcodGFnKT4jYC5cbiAgICovXG4gIHByaXZhdGUgdGFnTWFwcGluZ1ByZWZpeCh0YWc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3NvcnRLZXlUYWcodGFnKX0jYDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RvcmVEeW5hbW9EQlRhZ01hcHBpbmdzKFxuICAgIHMzS2V5OiBzdHJpbmcsXG4gICAgdGFnczogc3RyaW5nW10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cGRhdGVQcm9taXNlcyA9IHRhZ3MubWFwKGFzeW5jICh0YWcpID0+IHtcbiAgICAgICAgY29uc3Qgc2sgPSB0aGlzLnRhZ01hcHBpbmdTb3J0S2V5KHRhZywgczNLZXkpO1xuICAgICAgICBjb25zdCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZUl0ZW1Db21tYW5kKHtcbiAgICAgICAgICBUYWJsZU5hbWU6IHRoaXMuY29uZmlnLnRhYmxlTmFtZSxcbiAgICAgICAgICBLZXk6IHtcbiAgICAgICAgICAgIHBrOiB7IFM6IHRoaXMuY29uZmlnLmJ1aWxkSWQgfSxcbiAgICAgICAgICAgIHNrOiB7IFM6IHNrIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm8gYHJldmFsaWRhdGVkQXRgOiBhIG1hcHBpbmcgcm93IHJlY29yZHMgb25seSB0aGF0IGFuXG4gICAgICAgICAgLy8gZW50cnkgY2FycmllcyB0aGUgdGFnLiBTdGFtcGluZyBpdCBhdCB3cml0ZSB0aW1lIG1hZGUgZXZlcnkgdGFnZ2VkXG4gICAgICAgICAgLy8gZW50cnkgbG9vayByZXZhbGlkYXRlZCBvbmUgbWlsbGlzZWNvbmQgYWZ0ZXIgaXQgd2FzIHN0b3JlZCDigJQgdGhlXG4gICAgICAgICAgLy8gcm93J3MgdGltZXN0YW1wIGlzIHRha2VuIGFmdGVyIHRoZSBlbnRyeSdzIGBsYXN0TW9kaWZpZWRgIOKAlCBzb1xuICAgICAgICAgIC8vIGBjaGVja0lmUmV2YWxpZGF0ZWRgIGRlbGV0ZWQgaGVhbHRoeSBlbnRyaWVzIGFuZCB0aGUgcGFnZVxuICAgICAgICAgIC8vIHJlLXJlbmRlcmVkIG9uIGV2ZXJ5IHJlcXVlc3QuXG4gICAgICAgICAgVXBkYXRlRXhwcmVzc2lvbjpcbiAgICAgICAgICAgIFwiU0VUIGNyZWF0ZWRBdCA9IGlmX25vdF9leGlzdHMoY3JlYXRlZEF0LCA6bm93KSwgczNLZXkgPSA6czNLZXlcIixcbiAgICAgICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICBcIjpub3dcIjogeyBOOiBEYXRlLm5vdygpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIFwiOnMzS2V5XCI6IHsgUzogczNLZXkgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmR5bmFtb0NsaWVudC5zZW5kKHVwZGF0ZUNvbW1hbmQpO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHVwZGF0ZVByb21pc2VzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHN0b3JpbmcgRHluYW1vREIgdGFnIG1hcHBpbmdzOlwiLCBlcnJvcik7XG4gICAgICAvLyBEb24ndCB0aHJvdyAtIGNhY2hlIHN0b3JhZ2Ugc2hvdWxkIGNvbnRpbnVlIGV2ZW4gaWYgdGFnIG1hcHBpbmcgZmFpbHNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJvcCB0aGUgYHRhZyNzM0tleWAgbWFwcGluZyByb3dzIGZvciBhbiBlbnRyeSB0aGF0IG5vIGxvbmdlciBleGlzdHMuXG4gICAqXG4gICAqIFRoZSBjb3VudGVycGFydCBvZiB7QGxpbmsgc3RvcmVEeW5hbW9EQlRhZ01hcHBpbmdzfSwgYW5kIHRoZSByZWFzb24gaXRzXG4gICAqIGNhbGxlciBoYXMgdG8ga25vdyB0aGUgZW50cnkncyB0YWdzOiBhIG1hcHBpbmcgcm93J3Mgc29ydCBrZXkgc3RhcnRzIHdpdGhcbiAgICogdGhlIHRhZywgc28gdGhlIHJvd3MgYmVsb25naW5nIHRvIG9uZSBjYWNoZSBrZXkgY2Fubm90IGJlIHF1ZXJpZWQgZm9yIC0gb25seVxuICAgKiBhIGZ1bGwgc2NhbiBvZiB0aGUgYnVpbGQncyBwYXJ0aXRpb24gd291bGQgZmluZCB0aGVtLlxuICAgKlxuICAgKiBMZWZ0IGJlaGluZCwgYSByb3cgc3RpbGwgcmVzb2x2ZXMgdG8gYSBjYWNoZSBrZXkgb24gdGhlIG5leHRcbiAgICogYHJldmFsaWRhdGVUYWdgLCB3aGljaCBzcGVuZHMgb25lIG9mIENsb3VkRnJvbnQncyBmaWZ0ZWVuIHdpbGRjYXJkIHBhdGhzXG4gICAqIGludmFsaWRhdGluZyBhIFVSSSB3aG9zZSBlbnRyeSB3YXMgZGVsZXRlZCAtIGNyb3dkaW5nIG91dCB0aGUgcGF0aHMgdGhhdCBkb1xuICAgKiBuZWVkIGl0LCBhbmQgcGFzdCB7QGxpbmsgTUFYX1dJTERDQVJEX1BBVEhTX1BFUl9JTlZBTElEQVRJT059IGNvbGxhcHNpbmcgdGhlXG4gICAqIHdob2xlIGFwcCBpbnRvIG9uZSB3aWxkY2FyZC4gVGhlIHJvd3MgYWxzbyBjb3VudCBhZ2FpbnN0IHRoZSAxIE1CIGEgdGFnJ3MgUXVlcnkgcmV0dXJucywgc29cbiAgICogZW5vdWdoIG9mIHRoZW0gcHVzaCBsaXZlIGVudHJpZXMgb250byBhIHBhZ2VcbiAgICoge0BsaW5rIE1BWF9UQUdfUVVFUllfUEFHRVN9IG1heSBub3QgcmVhY2guXG4gICAqXG4gICAqIE9ubHkgdGhlIG1hcHBpbmcgcm93czogdGhlIGJhcmUtYHRhZ2AgbWFya2VyIHJvdyBgcmV2YWxpZGF0ZVRhZ2BcbiAgICogd3JpdGVzIGJlbG9uZ3MgdG8gdGhlIHRhZyByYXRoZXIgdGhhbiB0byBhbnkgZW50cnksIGFuZCBgY2hlY2tJZlJldmFsaWRhdGVkYFxuICAgKiByZWFkcyBpdCBmb3IgZXZlcnkgKm90aGVyKiBlbnRyeSBjYXJyeWluZyB0aGF0IHRhZy5cbiAgICpcbiAgICogRGVsaWJlcmF0ZWx5IG5vIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uIGZvciB0aGUgZGVsZXRlZCBwYXRoLiBUaGUgZWRnZSBjb3B5XG4gICAqIGRvZXMgb3V0bGl2ZSB0aGUgb2JqZWN0LCBidXQgdGhpcyBydW5zIG9uIGV2ZXJ5IHJldmFsaWRhdGVkIGBmZXRjaGAgZW50cnkgYXNcbiAgICogd2VsbCwgd2hlcmUgdGhlIGtleSBuYW1lcyBubyBVUkksIGFuZCBhbiBpbnZhbGlkYXRpb24gcmVxdWVzdCBwZXIgZGVsZXRlZFxuICAgKiBlbnRyeSBpcyBhIGNvc3QgdGhlIFRUTCBhbHJlYWR5IGJvdW5kcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRHluYW1vREJUYWdNYXBwaW5ncyhcbiAgICBzM0tleTogc3RyaW5nLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubWFwc1RhZ3NUb1BhdGhzIHx8IHRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgLy8gQSBwYWdlJ3MgdGFncyBjYW4gcmVwZWF0IC0gYGN0eC50YWdzYCBhbmQgdGhlIHJlbmRlcidzIGhlYWRlciBhcmUgYm90aFxuICAgICAgICAvLyByZWFkIC0gYW5kIG9uZSBkZWxldGUgcGVyIHRhZyBpcyBlbm91Z2guXG4gICAgICAgIEFycmF5LmZyb20obmV3IFNldCh0YWdzKSkubWFwKGFzeW5jICh0YWcpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmR5bmFtb0NsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IERlbGV0ZUl0ZW1Db21tYW5kKHtcbiAgICAgICAgICAgICAgVGFibGVOYW1lOiB0aGlzLmNvbmZpZy50YWJsZU5hbWUsXG4gICAgICAgICAgICAgIEtleToge1xuICAgICAgICAgICAgICAgIHBrOiB7IFM6IHRoaXMuY29uZmlnLmJ1aWxkSWQgfSxcbiAgICAgICAgICAgICAgICBzazogeyBTOiB0aGlzLnRhZ01hcHBpbmdTb3J0S2V5KHRhZywgczNLZXkpIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICB0aGlzLmRlYnVnKGBERUxFVEVEIFRBRyBNQVBQSU5HUzogJHtzM0tleX0gLT4gWyR7dGFncy5qb2luKFwiLCBcIil9XWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgYnV0IGRvbid0IGZhaWw6IHRoZSBlbnRyeSBpdHNlbGYgaXMgYWxyZWFkeSBnb25lLCBhbmQgYSBzdGFsZVxuICAgICAgLy8gbWFwcGluZyByb3cgY29zdHMgYW4gaW52YWxpZGF0aW9uIHBhdGggcmF0aGVyIHRoYW4gYSB3cm9uZyByZXNwb25zZS5cbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkZWxldGluZyBEeW5hbW9EQiB0YWcgbWFwcGluZ3M6XCIsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhZ3MgYW4gZW50cnkgYWJvdXQgdG8gYmUgZGVsZXRlZCB3YXMgc3RvcmVkIHdpdGguXG4gICAqXG4gICAqIGBjdHhgIGNhcnJpZXMgdGhlbSBmb3IgYSBgZmV0Y2hgIGRlbGV0ZSwgYnV0IGEgcmVzcG9uc2UgZGVsZXRlIGFycml2ZXMgYXNcbiAgICogYHsgY2FjaGVDb250cm9sLCBpc1JvdXRlUFBSRW5hYmxlZCwgaXNGYWxsYmFjayB9YCAtIGBSZXNwb25zZUNhY2hlLnNldGBcbiAgICogYnVpbGRzIGl0IHRoYXQgd2F5IC0gc28gdGhlIGVudHJ5IGl0c2VsZiBpcyB0aGUgb25seSBzb3VyY2UsIGFuZCBpdCBoYXMgdG9cbiAgICogYmUgcmVhZCBiZWZvcmUgaXQgaXMgcmVtb3ZlZC4gVGhhdCBpcyBvbmUgZXh0cmEgR0VUIG9uIGEgcGF0aCB0aGF0IHJ1bnMgd2hlblxuICAgKiBhIGNhY2hlZCByb3V0ZSBzdGFydHMgYW5zd2VyaW5nIGBub3RGb3VuZCgpYDogYEluY3JlbWVudGFsQ2FjaGUuc2V0YFxuICAgKiBmb3J3YXJkcyBgUmVzcG9uc2VDYWNoZWAncyBudWxsIHZhbHVlIHRocm91Z2ggdG8gaGVyZS5cbiAgICpcbiAgICogQSBwYWdlIGlzIGFsc28gdGhlIGNhc2Ugd29ydGggcGF5aW5nIGl0IGZvciwgc2luY2UgaXQgY2FycmllcyB0aGUgd2hvbGVcbiAgICogaW1wbGljaXQgYF9OX1RfL+KApmAgY2hhaW4gYW5kIHRoZXJlZm9yZSB0aGUgbW9zdCByb3dzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdG9yZWRFbnRyeVRhZ3MoXG4gICAgczNLZXk6IHN0cmluZyxcbiAgICBjdHg6IFNldENhY2hlSGFuZGxlckNvbnRleHQsXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBjdHhUYWdzID0gZ2V0VGFncyhjdHgpO1xuICAgIGlmIChjdHhUYWdzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjdHhUYWdzO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubWFwc1RhZ3NUb1BhdGhzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYnVja2V0LmdldChzM0tleSk7XG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyeVRhZ3MocGFyc2VDYWNoZVZhbHVlKHJlc3BvbnNlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHJlYWQgdGFncyBvZiAke3MzS2V5fSBiZWZvcmUgZGVsZXRpbmc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFueSBvZiBgdGFnc2Agd2FzIHJldmFsaWRhdGVkIGFmdGVyIHRoaXMgZW50cnkgd2FzIHN0b3JlZCwgYW5kIGhvdy5cbiAgICpcbiAgICogUmVhZHMgdGhlIHBlci10YWcgbWFya2VyIHJvd3MgYHJldmFsaWRhdGVUYWdgIHdyaXRlcywgYXMgdGhpcyBpbnN0YW5jZVxuICAgKiB0cmFja3MgdGhlbTogc2VlIGBUcmFja2VkVGFnTWFya2Vyc2AgZm9yIHdoZW4gdGhleSBhcmUgcmVhZC5cbiAgICogU2Nhbm5pbmcgdGhlIHRhZydzIG1hcHBpbmcgcm93cyBpbnN0ZWFkIHdvdWxkIGFuc3dlciB0aGUgd3JvbmcgcXVlc3Rpb246XG4gICAqIHRob3NlIHJvd3MgZXhpc3QgcGVyIGNhY2hlICprZXkqLCBzbyB3aGljaCBvbmUgYSBgTGltaXQ6IDFgIHF1ZXJ5IHJldHVybmVkXG4gICAqIGRlcGVuZGVkIG9uIHNvcnQgb3JkZXIsIGFuZCBhbiBlbnRyeSBjb3VsZCBiZSBqdWRnZWQgYWdhaW5zdCBhbm90aGVyXG4gICAqIGVudHJ5J3MgdGltZXN0YW1wLlxuICAgKlxuICAgKiBBIHRhZyByZXZhbGlkYXRlZCB3aXRoIGEgcHJvZmlsZSBvbmx5IG1ha2VzIHRoZSBlbnRyeSAqc3RhbGUqOiB0aGF0IGlzXG4gICAqIHJlcG9ydGVkIHRvIE5leHQuanMgdGhyb3VnaCBpdHMgdGFnIG1hbmlmZXN0IChzZWUge0BsaW5rIG5leHRUYWdzTWFuaWZlc3R9KVxuICAgKiBhbmQgYW5zd2VyZWQgYFwic3RhbGVcImAgaGVyZSwgc28gdGhlIGVudHJ5IGlzIHNlcnZlZCB3aGlsZSBhIGJhY2tncm91bmRcbiAgICogcmVuZGVyIHJlcGxhY2VzIGl0LiBXaGVuIHRoZSBtYW5pZmVzdCBjYW5ub3QgYmUgcmVhY2hlZCBhIHN0YWxlIGVudHJ5IGlzXG4gICAqIHJlcG9ydGVkIGV4cGlyZWQgaW5zdGVhZCAtIGEgYmxvY2tpbmcgcmVuZGVyLCBuZXZlciBhIHN0YWxlIHBhZ2UgcHJlc2VudGVkXG4gICAqIGFzIGZyZXNoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0lmUmV2YWxpZGF0ZWQoXG4gICAgY2FjaGVMYXN0TW9kaWZpZWQ6IG51bWJlcixcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTxSZXZhbGlkYXRpb25TdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMudGFncy5yZWZyZXNoKCk7XG4gICAgYXdhaXQgdGhpcy50YWdzLmVuc3VyZSh0YWdzKTtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMudGFncy5zdGF0ZSh0YWdzLCBjYWNoZUxhc3RNb2RpZmllZCk7XG4gICAgaWYgKHN0YXRlICE9PSBcInN0YWxlXCIpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gXCJleHBpcmVkXCIpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICBgVGFncyBbJHt0YWdzfV0gZXhwaXJlZCBlbnRyeSBjcmVhdGVkIGF0ICR7Y2FjaGVMYXN0TW9kaWZpZWR9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYW5pZmVzdCA9IG5leHRUYWdzTWFuaWZlc3QoKTtcbiAgICBpZiAoIW1hbmlmZXN0KSB7XG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgVGFncyBbJHt0YWdzfV0gYXJlIHN0YWxlIGFuZCBOZXh0LmpzJ3MgdGFnIG1hbmlmZXN0IGlzIGAgK1xuICAgICAgICAgIGB1bnJlYWNoYWJsZSwgZXhwaXJpbmcgdGhlIGVudHJ5IGluc3RlYWRgLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBcImV4cGlyZWRcIjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgY29uc3Qgc3RhbGVBdCA9IHRoaXMudGFncy5nZXQodGFnKT8uc3RhbGVBdDtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWFuaWZlc3QuZ2V0KHRhZyk7XG4gICAgICBpZiAoXG4gICAgICAgIHN0YWxlQXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBzdGFsZUF0ID4gY2FjaGVMYXN0TW9kaWZpZWQgJiZcbiAgICAgICAgKGV4aXN0aW5nPy5zdGFsZSA/PyAwKSA8IHN0YWxlQXRcbiAgICAgICkge1xuICAgICAgICBtYW5pZmVzdC5zZXQodGFnLCB7IC4uLmV4aXN0aW5nLCBzdGFsZTogc3RhbGVBdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwic3RhbGVcIjtcbiAgfVxufVxuIl19
|
|
1040
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtY2FjaGUtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL3MzLWNhY2hlLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0VBRUU7QUFDRixzREFBc0Q7QUFDdEQsNkNBQXlDO0FBQ3pDLHFDQUF1QztBQUN2Qyw2Q0FBNEM7QUFDNUMseUNBQWlDO0FBQ2pDLGtFQUdvQztBQUNwQyw4REFNa0M7QUFDbEMsa0RBQW1FO0FBQ25FLG9EQUFxRTtBQUNyRSxrREFBNkI7QUFVN0IsdURBYTJCO0FBQzNCLCtDQVl1QjtBQUN2Qix5REFBdUQ7QUFDdkQsa0RBQTREO0FBQzVELGtEQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxNQUE0QztJQUM3RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFBLHdCQUFVLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxlQUFlLENBQ3RCLEdBQTJCO0lBRTNCLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDOUIsQ0FBQztBQUVELHVGQUF1RjtBQUN2RixNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQztBQUUzQzs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEdBQVc7SUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRywwQkFBMEIsR0FB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LEtBQUssT0FBTyxFQUFFLENBQUM7WUFDdEIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQ1IsU0FBUyxJQUFJLDhCQUE4QixpQkFBaUIsRUFBRSxDQUMvRCxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssQ0FDUixTQUFTLElBQUksNENBQTRDO2dCQUN2RCx5Q0FBeUMsQ0FDNUMsQ0FBQztZQUNGLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQztZQUM1QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLElBQ0UsT0FBTyxLQUFLLFNBQVM7Z0JBQ3JCLE9BQU8sR0FBRyxpQkFBaUI7Z0JBQzNCLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQ2hDLENBQUM7Z0JBQ0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQXo1QkQsd0NBeTVCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFMzIGFuZCBEeW5hbW9EQiBjYWNoZSBoYW5kbGVyIGZvciBOZXh0LmpzIGluY3JlbWVudGFsIGNhY2hlXG4qL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7XG4gIENsb3VkRnJvbnRDbGllbnQsXG4gIENyZWF0ZUludmFsaWRhdGlvbkNvbW1hbmQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlVmFsdWUsXG4gIERlbGV0ZUl0ZW1Db21tYW5kLFxuICBEeW5hbW9EQkNsaWVudCxcbiAgUXVlcnlDb21tYW5kLFxuICBVcGRhdGVJdGVtQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IHsgUzNDbGllbnQsIERlbGV0ZU9iamVjdENvbW1hbmQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgeyBTU01DbGllbnQsIEdldFBhcmFtZXRlckNvbW1hbmQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNzbVwiO1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHtcbiAgQ2FjaGVIYW5kbGVyLFxuICBDYWNoZUhhbmRsZXJWYWx1ZSxcbiAgQ2FjaGVIYW5kbGVyQ29udGV4dCxcbn0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlXCI7XG5pbXBvcnQge1xuICBJbmNyZW1lbnRhbENhY2hlVmFsdWUsXG4gIEdldEluY3JlbWVudGFsRmV0Y2hDYWNoZUNvbnRleHQsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlXCI7XG5pbXBvcnQge1xuICBBd3NDYWNoZUNvbmZpZyxcbiAgYnVpbGRTM0tleSxcbiAgQ2FjaGVCdWNrZXQsXG4gIGhhc2hlZFRhZyxcbiAgbWFya2VyQ2xvY2ssXG4gIE1BWF9TT1JUX0tFWV9CWVRFUyxcbiAgcmVzb2x2ZUF3c0NhY2hlQ29uZmlnLFxuICBSZXZhbGlkYXRlRHVyYXRpb25zLFxuICBSZXZhbGlkYXRpb25TdGF0ZSxcbiAgc29ydEtleVRhZyxcbiAgczNPYmplY3RLZXksXG4gIFRyYWNrZWRUYWdNYXJrZXJzLFxufSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcbmltcG9ydCB7XG4gIHNlcmlhbGl6ZUNhY2hlVmFsdWUsXG4gIHBhcnNlQ2FjaGVWYWx1ZSxcbiAgZGVub3JtYWxpemVQYWdlUGF0aCxcbiAgZ2V0Q2FjaGVDb250cm9sLFxuICBnZXRUYWdzLFxuICBHZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICBTZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICBoZWFkZXJUYWdzLFxuICBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVCxcbiAgUk9VVEVfQ0FDSEVfS0VZX1BSRUZJWCxcbiAgc3RvcmVkQ2FjaGVDb250cm9sLFxufSBmcm9tIFwiLi9jYWNoZS11dGlsc1wiO1xuaW1wb3J0IHsgc2hhcmVkVGFnTWFuaWZlc3QgfSBmcm9tIFwiLi91c2UtY2FjaGUtY29tbW9uXCI7XG5pbXBvcnQgeyBSRVZBTElEQVRFRF9QQUdFX0hPT0sgfSBmcm9tIFwiLi4vcnVudGltZS9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgYmFzZVBhdGhQcmVmaXgsIHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMgfSBmcm9tIFwiLi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5cbi8qKlxuICogVGhlIHRhZ3MgYSBzdG9yZWQgZW50cnkgaGFzIHRvIGJlIHRhZy1yZXZhbGlkYXRlZCBhZ2FpbnN0LlxuICpcbiAqIEEgcnVudGltZSBgc2V0YCByZWNvcmRzIGB0YWdzYCBhbG9uZ3NpZGUgdGhlIGVudHJ5LCBidXQgYSBidWlsZC10aW1lIHByZXJlbmRlclxuICogZG9lcyBub3Q6IHRob3NlIGVudHJpZXMgYXJlIHdyaXR0ZW4gYXMgZmlsZXMgYnkgdGhlIGFkYXB0ZXInc1xuICogYG9uQnVpbGRDb21wbGV0ZWAgcmF0aGVyIHRoYW4gdGhyb3VnaCBgc2V0YCwgYW5kIGNhcnJ5IHRoZWlyIHRhZ3Mgb25seSBpbiB0aGVcbiAqIHJlbmRlcidzIGB4LW5leHQtY2FjaGUtdGFnc2AgaGVhZGVyIOKAlCB0aGUgc2FtZSBwbGFjZSBOZXh0LmpzJ3Mgb3duXG4gKiBgSW5jcmVtZW50YWxDYWNoZS5nZXRgIHJlYWRzIHRoZW0gZnJvbSB3aGVuIGl0IGRlY2lkZXMgc3RhbGVuZXNzLiBXaXRob3V0IHRoaXNcbiAqIGZhbGxiYWNrIG5vIHByZXJlbmRlcmVkIHBhZ2UgaXMgcmVhY2hhYmxlIGJ5IGByZXZhbGlkYXRlVGFnYC9gcmV2YWxpZGF0ZVBhdGhgXG4gKiB1bnRpbCBzb21lIGxhdGVyIHJ1bnRpbWUgcmUtcmVuZGVyIGhhcHBlbnMgdG8gcmVwbGFjZSB0aGUgc2VlZGVkIGVudHJ5LCBzbyBhblxuICogYXBwIHdob3NlIHBhZ2VzIGFyZSBhbGwgc3RhdGljIG5ldmVyIHJldmFsaWRhdGVzIGF0IGFsbC4gTWVhc3VyZWQgYWdhaW5zdFxuICogbmV4dC5qcydzIGB0ZXN0L2UyZS9hcHAtZGlyL3Jlc3VtZS1kYXRhLWNhY2hlYC5cbiAqL1xuZnVuY3Rpb24gZW50cnlUYWdzKHN0b3JlZDogeyB0YWdzPzogc3RyaW5nW107IHZhbHVlPzogdW5rbm93biB9KTogc3RyaW5nW10ge1xuICByZXR1cm4gc3RvcmVkLnRhZ3M/Lmxlbmd0aCA/IHN0b3JlZC50YWdzIDogaGVhZGVyVGFncyhzdG9yZWQudmFsdWUpO1xufVxuXG4vKipcbiAqIFRoZSBgbGFzdE1vZGlmaWVkYCB0aGF0IHRlbGxzIE5leHQuanMgXCJ0aGlzIGVudHJ5IGlzIGV4cGlyZWQsIHJlLXJlbmRlciBpdFxuICogYmVmb3JlIGFuc3dlcmluZ1wiLlxuICpcbiAqIGBJbmNyZW1lbnRhbENhY2hlLmdldGAgdHVybnMgaXQgaW50byBgaXNTdGFsZTogLTFgLCB3aGljaCBgYXBwLXBhZ2UtcnVudGltZWBcbiAqIHJlYWRzIGFzIGFuIG9uLWRlbWFuZCByZXZhbGlkYXRpb24gYW5kIGFuc3dlcnMgd2l0aCBhIGJsb2NraW5nIHJlbmRlciBvZlxuICogKnRoaXMqIHJvdXRlLCB0aGVuIHN0b3JlcyBpdC4gUmV0dXJuaW5nIGBudWxsYCBpbnN0ZWFkIGlzIG5vdCB0aGUgc2FtZSB0aGluZzpcbiAqIGEgbWlzcyBvbiBhIFBQUiByb3V0ZSB3aG9zZSBgcHJlcmVuZGVyLW1hbmlmZXN0Lmpzb25gIGVudHJ5IGNhcnJpZXMgYVxuICogYGZhbGxiYWNrYCAoYGNvbXB1dGU6IFwicmVzdW1pbmdcImApIGlzIGFuc3dlcmVkIGZyb20gdGhlIHJvdXRlJ3MgZmFsbGJhY2tcbiAqIHNoZWxsLCB3aGljaCBpcyBzZXJ2ZWQgYGNhY2hlLWNvbnRyb2w6IHByaXZhdGUsIG5vLXN0b3JlYCB3aXRoIG5vXG4gKiBgeC1uZXh0anMtY2FjaGVgIGhlYWRlciwgYW5kIC0gdW5sZXNzIGBwYXJ0aWFsUHJlZmV0Y2hpbmdgIGlzIG9uIC0gaXMgbmV2ZXJcbiAqIHVwZ3JhZGVkIGludG8gYSBjb25jcmV0ZSBlbnRyeS4gU28gdGhlIGZpcnN0IGByZXZhbGlkYXRlVGFnYCB0byByZWFjaCBhXG4gKiBzZWVkZWQgcHJlcmVuZGVyIGxlZnQgdGhhdCBwYWdlIHVuY2FjaGVhYmxlLCBhbmQgZHluYW1pY2FsbHkgcmVzdW1lZCBwZXJcbiAqIHJlcXVlc3QsIGZvciB0aGUgcmVzdCBvZiB0aGUgZGVwbG95bWVudCdzIGxpZmUuIFRoZSBpc3IgZTJlIHNlZXMgaXQgYXMgYW5cbiAqIGFic2VudCBgeC1uZXh0anMtY2FjaGVgLlxuICovXG5jb25zdCBFWFBJUkVEX0xBU1RfTU9ESUZJRUQgPSAtMTtcblxuLyoqXG4gKiBXaGV0aGVyIGEgYGdldGAgaXMgZm9yIHRoZSBgZmV0Y2hgIGNhY2hlIHJhdGhlciB0aGFuIGZvciBhIHJvdXRlJ3MgcmVzcG9uc2UsXG4gKiBhcyBhIG5hcnJvd2luZyBwcmVkaWNhdGUgc28gdGhhdCBgY3R4LnRhZ3NgIGFuZCBgY3R4LnNvZnRUYWdzYCDigJQgd2hpY2ggb25seVxuICoge0BsaW5rIEdldEluY3JlbWVudGFsRmV0Y2hDYWNoZUNvbnRleHR9IGhhcyDigJQgYXJlIHJlYWNoYWJsZSB3aXRob3V0IGEgY2FzdC5cbiAqXG4gKiBgSW5jcmVtZW50YWxDYWNoZUtpbmQuRkVUQ0hgLCBjb21wYXJlZCBhcyBpdHMgb3duIHN0cmluZyB2YWx1ZSBzbyB0aGlzIGZpbGVcbiAqIGtlZXBzIGltcG9ydGluZyBubyBOZXh0LmpzIGludGVybmFscyAodGhlIGVudW0gaXMgYGNvbnN0YCwgc28gaXQgaGFzIG5vXG4gKiBydW50aW1lIHJlcHJlc2VudGF0aW9uIHRvIGltcG9ydCBhbnl3YXkpLlxuICovXG5mdW5jdGlvbiBpc0ZldGNoQ2FjaGVHZXQoXG4gIGN0eDogR2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbik6IGN0eCBpcyBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0IHtcbiAgcmV0dXJuIGN0eC5raW5kID09PSBcIkZFVENIXCI7XG59XG5cbi8qKiBgTkVYVF9DQUNIRV9JTVBMSUNJVF9UQUdfSURgLCBpbmxpbmVkIHNvIHRoaXMgZmlsZSBpbXBvcnRzIG5vIE5leHQuanMgaW50ZXJuYWxzLiAqL1xuY29uc3QgTkVYVF9DQUNIRV9JTVBMSUNJVF9UQUdfSUQgPSBcIl9OX1RfXCI7XG5cbi8qKlxuICogVGhlIGB0eXBlYCBhcmd1bWVudCBvZiBgcmV2YWxpZGF0ZVBhdGhgLCB3aGljaCBOZXh0LmpzIGFwcGVuZHMgdG8gdGhlIGltcGxpY2l0XG4gKiB0YWcgYXMgYSBwYXRoIHNlZ21lbnQuIEBzZWUgaW1wbGljaXRUYWdQYXRoc1xuICovXG5jb25zdCBSRVZBTElEQVRFX1BBVEhfVFlQRVMgPSBbXCJsYXlvdXRcIiwgXCJwYWdlXCJdO1xuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHBhdGhzIGEgYHJldmFsaWRhdGVQYXRoYCB0YWcgY291bGQgbmFtZSwgb3IgZW1wdHkgZm9yIGFuIGFwcCB0YWcuXG4gKlxuICogYHJldmFsaWRhdGVQYXRoKFwiL2Jsb2dcIilgIHJlYWNoZXMgdGhlIGNhY2hlIGhhbmRsZXIgYXMgdGhlIGltcGxpY2l0IHRhZ1xuICogYF9OX1RfL2Jsb2dgIC0gdGhlIHBhdGggaXMgcmlnaHQgdGhlcmUgaW4gdGhlIHRhZywgd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgQ0ROXG4gKiBjb3B5IG9mIGEgYnVpbGQtdGltZSBwcmVyZW5kZXIgcmVhY2hhYmxlIGF0IGFsbC4gQSBgcmV2YWxpZGF0ZVRhZyhcInBvc3RzXCIpYFxuICogY2FycmllcyBubyBwYXRoIGFuZCBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIHJvd3MgaW5zdGVhZC5cbiAqXG4gKiBUd28gcGF0aHMgY29tZSBiYWNrIHdoZW4gdGhlIHRhZyBlbmRzIGluIGEgYHJldmFsaWRhdGVQYXRoYCAqdHlwZSosIGJlY2F1c2VcbiAqIGByZXZhbGlkYXRlUGF0aChwYXRoLCB0eXBlKWAgYXBwZW5kcyBpdCB0byB0aGUgdGFnXG4gKiAoYG5leHQvZGlzdC9zZXJ2ZXIvd2ViL3NwZWMtZXh0ZW5zaW9uL3JldmFsaWRhdGUuanNgKTpcbiAqIGByZXZhbGlkYXRlUGF0aChcIi9ibG9nXCIsIFwibGF5b3V0XCIpYCBpcyBgX05fVF8vYmxvZy9sYXlvdXRgLCBhbmRcbiAqIGByZXZhbGlkYXRlUGF0aChcIi9cIiwgXCJsYXlvdXRcIilgIGlzIGBfTl9UXy9sYXlvdXRgLiBSZWFkaW5nIGVpdGhlciBvZiB0aG9zZSBhcyBhXG4gKiByZXF1ZXN0IHBhdGggaW52YWxpZGF0ZXMgYSBVUkkgdGhhdCBkb2VzIG5vdCBleGlzdCBhbmQgbmV2ZXIgdG91Y2hlcyB0aGUgb25lXG4gKiB0aGF0IGRvZXMuIFRoZSBzdWZmaXggY2Fubm90IGJlIHRvbGQgYXBhcnQgZnJvbSBhIHJvdXRlIHRoYXQgZ2VudWluZWx5IGVuZHMgaW5cbiAqIGAvbGF5b3V0YCwgc28gYm90aCByZWFkaW5ncyBhcmUgZW1pdHRlZDogYW4gaW52YWxpZGF0aW9uIHBhdGggbWF0Y2hpbmcgbm90aGluZ1xuICogY29zdHMgYSBwYXRoLCB3aGlsZSBtaXNzaW5nIHRoZSByZWFsIG9uZSBsZWF2ZXMgdGhlIGVkZ2Ugc3RhbGUgZm9yIHRoZSB3aG9sZVxuICogYHMtbWF4YWdlYC5cbiAqL1xuZnVuY3Rpb24gaW1wbGljaXRUYWdQYXRocyh0YWc6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0YWcuc3RhcnRzV2l0aChgJHtORVhUX0NBQ0hFX0lNUExJQ0lUX1RBR19JRH0vYCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcGF0aCA9IHRhZy5zbGljZShORVhUX0NBQ0hFX0lNUExJQ0lUX1RBR19JRC5sZW5ndGgpO1xuICBjb25zdCBjYW5kaWRhdGVzID0gW3BhdGhdO1xuICBmb3IgKGNvbnN0IHR5cGUgb2YgUkVWQUxJREFURV9QQVRIX1RZUEVTKSB7XG4gICAgaWYgKHBhdGguZW5kc1dpdGgoYC8ke3R5cGV9YCkpIHtcbiAgICAgIC8vIGBfTl9UXy9sYXlvdXRgIGlzIHRoZSByb290LCBub3QgdGhlIGVtcHR5IHBhdGguXG4gICAgICBjYW5kaWRhdGVzLnB1c2gocGF0aC5zbGljZSgwLCAtKHR5cGUubGVuZ3RoICsgMSkpIHx8IFwiL1wiKTtcbiAgICB9XG4gIH1cbiAgLy8gQSBkeW5hbWljIHJvdXRlIHRlbXBsYXRlIChcIi9ibG9nL1tzbHVnXVwiKSBtYXRjaGVzIG5vIGNhY2hlZCBVUkkuIEhhcm1sZXNzIHRvXG4gIC8vIHNlbmQsIGJ1dCBpdCBjb3N0cyBhbiBpbnZhbGlkYXRpb24gcGF0aCwgYW5kIHRob3NlIGFyZSBtZXRlcmVkLlxuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGNhbmRpZGF0ZXMpKS5maWx0ZXIoKHApID0+ICFwLmluY2x1ZGVzKFwiW1wiKSk7XG59XG5cbi8qKlxuICogSW52YWxpZGF0aW9uIHBhdGhzIGNvdmVyaW5nIGV2ZXJ5IFVSSSBDbG91ZEZyb250IGNvdWxkIGJlIGhvbGRpbmcgdGhlIHJlc3BvbnNlXG4gKiBmb3IgYHJvdXRlYCB1bmRlciwgb25jZSBgYmFzZVBhdGhgIGlzIHByZWZpeGVkLlxuICpcbiAqIEFuIGludmFsaWRhdGlvbiBwYXRoIG1hdGNoZXMgb25seSB0aGUgcXVlcnkgc3RyaW5nIGl0IHNwZWxscyBvdXQsIGFuZCBhIHBhZ2Unc1xuICogUlNDIHBheWxvYWQgaXMgY2FjaGVkIHVuZGVyIGA/X3JzYz08aGFzaD5gOyBkcm9wcGluZyB0aGUgSFRNTCB3aGlsZSBsZWF2aW5nIHRoZVxuICogcGF5bG9hZCBiZWhpbmQgbGVhdmVzIHRoZSByb3V0ZXIgbmF2aWdhdGluZyB0byB0aGUgcHJlLXJldmFsaWRhdGlvbiBwYWdlLiBBXG4gKiBgdHJhaWxpbmdTbGFzaGAgYXBwIGNhY2hlcyB0aGUgcmVkaXJlY3QgdGFyZ2V0IHJhdGhlciB0aGFuIHRoZSByb3V0ZSwgc28gdGhlXG4gKiBzbGFzaCB2YXJpYW50IGhhcyB0byBnbyB0b28uXG4gKlxuICogT25lIHRyYWlsaW5nIHdpbGRjYXJkIGNvdmVycyBhbGwgZm91ciAoYC9ibG9nYCwgYC9ibG9nP+KApmAsIGAvYmxvZy9gLFxuICogYC9ibG9nLz/igKZgKSBmb3IgYSBzaW5nbGUgd2lsZGNhcmQgcGF0aCwgd2hlcmUgc3BlbGxpbmcgdGhlbSBvdXQgY29zdCB0d28gLVxuICogYW5kIHdpbGRjYXJkcyBhcmUgdGhlIHF1b3RhIHRoYXQgcnVucyBvdXQuIEl0IGFsc28gbWF0Y2hlcyBgL2Jsb2dyb2xsYCBhbmRcbiAqIGV2ZXJ5dGhpbmcgdW5kZXIgYC9ibG9nL2AsIHdoaWNoIGlzIGEgbG93ZXIgaGl0IHJhdGUgb24gdGhvc2UsIG5ldmVyIGEgc3RhbGVcbiAqIHBhZ2UuIFRoZSBhcHAncyByb290IGlzIHRoZSBleGNlcHRpb246IGAvKmAgdGhlcmUgaXMgdGhlIHdob2xlIGFwcC5cbiAqXG4gKiBgYmFzZVBhdGhgIGlzIHByZWZpeGVkIGhlcmUgYmVjYXVzZSBuZWl0aGVyIHNvdXJjZSBvZiBhIHJvdXRlIGNhcnJpZXMgaXQuXG4gKiBDYWNoZSBrZXlzIGFyZSByb3V0ZXMg4oCUIE5leHQuanMgc3RyaXBzIGBiYXNlUGF0aGAgYmVmb3JlIHJvdXRpbmcsIHNvIHRoZSBjYWNoZVxuICogaGFuZGxlciBuZXZlciBzZWVzIG9uZSDigJQgYW5kIGByZXZhbGlkYXRlUGF0aChcIi9ibG9nXCIpYCBuYW1lcyB0aGUgcm91dGUgYXNcbiAqIHdlbGwuIENsb3VkRnJvbnQgb25seSBldmVyIHNhdyBgL2Jhc2UvYmxvZ2AsIHNvIGludmFsaWRhdGluZyBgL2Jsb2dgIGNsZWFyc1xuICogbm90aGluZyBhbmQgdGhlIGVkZ2Uga2VlcHMgc2VydmluZyB0aGUgcHJlLXJldmFsaWRhdGlvbiBwYWdlIHVudGlsIGBzLW1heGFnZWBcbiAqIGV4cGlyZXMuIFRoZSBhcHAncyByb290IHVuZGVyIGEgYGJhc2VQYXRoYCBpcyBgL2Jhc2VgLCBub3QgYC9iYXNlL2AuXG4gKi9cbmZ1bmN0aW9uIGNkbkludmFsaWRhdGlvblBhdGhzKHJvdXRlOiBzdHJpbmcsIGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRyaW1tZWQgPSByb3V0ZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICBpZiAodHJpbW1lZCA9PT0gXCJcIikge1xuICAgIHJldHVybiBiYXNlUGF0aFxuICAgICAgPyBbYmFzZVBhdGgsIGAke2Jhc2VQYXRofT8qYCwgYCR7YmFzZVBhdGh9L2AsIGAke2Jhc2VQYXRofS8/KmBdXG4gICAgICA6IFtcIi9cIiwgXCIvPypcIl07XG4gIH1cbiAgcmV0dXJuIFtgJHtiYXNlUGF0aH0ke2VuY29kZUludmFsaWRhdGlvblJvdXRlKHRyaW1tZWQpfSpgXTtcbn1cblxuLyoqXG4gKiBUaGUgYXBwJ3MgYGJhc2VQYXRoYCwgZnJvbSB0aGUgYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBldmVyeSBkZXBsb3ltZW50XG4gKiByb290IHN0YWdlcyBuZXh0IHRvIGBzZXJ2ZXJEaXN0RGlyYDogTmV4dC5qcyBoYW5kcyB0aGUgY2FjaGUgaGFuZGxlciBub1xuICogb3RoZXIgY29weS5cbiAqL1xuZnVuY3Rpb24gYXBwQmFzZVBhdGgoc2VydmVyRGlzdERpcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzZXJ2ZXJEaXN0RGlyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGZpbGUgPSBqb2luKHNlcnZlckRpc3REaXIsIFwiLi5cIiwgXCJyZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZmlsZSwgXCJ1dGY4XCIpKS5jb25maWc/LmJhc2VQYXRoO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCByZWFkIGJhc2VQYXRoIGZvciBDRE4gaW52YWxpZGF0aW9uOlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIGByb3V0ZWAgYXMgdGhlIFVSSSBhIGJyb3dzZXIgcmVxdWVzdHMgaXQgdW5kZXIsIHdoaWNoIGlzIHdoYXQgQ2xvdWRGcm9udFxuICogY2FjaGVzIGl0IGJ5LlxuICpcbiAqIE5leHQuanMgYnVpbGRzIGNhY2hlIGtleXMgZnJvbSB0aGUgKmRlY29kZWQqIHBhdGhuYW1lIChgZGVjb2RlUGF0aFBhcmFtc2AgaW5cbiAqIGByb3V0ZS1tb2R1bGUuanNgKSwgc28gYC9ibG9nL2jDqWxsb2Agb3IgYC9ibG9nL2hlbGxvIHdvcmxkYCByZWFjaCBoZXJlIHJhdyxcbiAqIHdoaWxlIENsb3VkRnJvbnQgaG9sZHMgYC9ibG9nL2glQzMlQTlsbG9gLCBhbmQgYW4gaW52YWxpZGF0aW9uIHBhdGggbWF0Y2hlc1xuICogdGhlIGVuY29kZWQgZm9ybSBvbmx5IC0gQVdTIHJlcXVpcmVzIG5vbi1BU0NJSSBhbmQgdW5zYWZlIGNoYXJhY3RlcnMgdG8gYmVcbiAqIHBlcmNlbnQtZW5jb2RlZCwgYW5kIG5vdGhpbmcgZWxzZS4gRWFjaCBzZWdtZW50IGlzIGVuY29kZWQgdGhlIHdheVxuICogYGVuY29kZVVSSWAgZG9lcywgd2hpY2ggbGVhdmVzIHRoZSBjaGFyYWN0ZXJzIGEgYnJvd3NlciBzZW5kcyByYXcgaW4gYSBwYXRoXG4gKiAoYEBgLCBgOmAsIGAsYCwgYDtgLCAuLi4pIGFsb25lLiBBIGAlYCB0aGF0IGFscmVhZHkgc3RhcnRzIGFuIGVzY2FwZSBpcyBrZXB0OlxuICogYGRlY29kZVBhdGhQYXJhbXNgIHJlLWVzY2FwZXMgcGF0aCBkZWxpbWl0ZXJzIChgJTJGYCwgYCUzRmAsIGAlMjNgLCBgJTVDYCksXG4gKiBhbmQgYSBgcmV2YWxpZGF0ZVBhdGhgIHRhZyBtYXkgbmFtZSB0aGUgZW5jb2RlZCBwYXRoIGl0c2VsZi4gYD9gIGFuZCBgI2AgY2FuXG4gKiBvbmx5IGJlIGluIGEgZGVjb2RlZCBzZWdtZW50IGFzIGRhdGEsIHNvIHRoZXkgYXJlIGVuY29kZWQgdG9vLlxuICovXG5mdW5jdGlvbiBlbmNvZGVJbnZhbGlkYXRpb25Sb3V0ZShyb3V0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJvdXRlXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+XG4gICAgICBzZWdtZW50XG4gICAgICAgIC5zcGxpdCgvKCVbMC05QS1GYS1mXXsyfSkvKVxuICAgICAgICAubWFwKChwYXJ0LCBpKSA9PlxuICAgICAgICAgIGkgJSAyID09PSAxXG4gICAgICAgICAgICA/IHBhcnRcbiAgICAgICAgICAgIDogZW5jb2RlVVJJKHBhcnQpLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgL1s/I10vZyxcbiAgICAgICAgICAgICAgICAoYykgPT4gYCUke2MuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKFwiXCIpLFxuICAgIClcbiAgICAuam9pbihcIi9cIik7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGNhY2hlIGtleSBpcyBhIGZldGNoLWNhY2hlIGVudHJ5IHJhdGhlciB0aGFuIGEgcGFnZSByb3V0ZS5cbiAqXG4gKiBUaG9zZSBrZXlzIGFyZSB0aGUgaGFzaCBOZXh0LmpzIGRlcml2ZXMgZnJvbSB0aGUgcmVxdWVzdCDigJQgYSBzaW5nbGUgc2VnbWVudCBvZlxuICogbG93ZXJjYXNlIGhleCwgbG9uZyBlbm91Z2ggdGhhdCBubyByb3V0ZSBwYXRobmFtZSB0YWtlcyB0aGUgc2FtZSBzaGFwZS4gVGhleVxuICogYXJlIG1hcHBlZCB0byB0YWdzIGV4YWN0bHkgbGlrZSBwYWdlcyBhcmUsIGJ1dCBuYW1lIG5vIFVSSSBDbG91ZEZyb250IGNvdWxkIGJlXG4gKiBob2xkaW5nLCBzbyBhbiBpbnZhbGlkYXRpb24gcGF0aCBidWlsdCBmcm9tIG9uZSBpcyBhbHdheXMgd2FzdGVkLlxuICovXG5mdW5jdGlvbiBpc0ZldGNoQ2FjaGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eWzAtOWEtZl17MzIsfSQvLnRlc3Qoa2V5KTtcbn1cblxuLyoqIFdoZXRoZXIgQ2xvdWRGcm9udCBjb3VudHMgdGhpcyBwYXRoIGFnYWluc3QgdGhlIHdpbGRjYXJkIHF1b3RhLiAqL1xuZnVuY3Rpb24gaXNXaWxkY2FyZFBhdGgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYXRoLmluY2x1ZGVzKFwiKlwiKTtcbn1cblxuLyoqXG4gKiBUaGUgbW9zdCB3aWxkY2FyZCBwYXRocyBvbmUgYHJldmFsaWRhdGVUYWdgIHNlbmRzIGJlZm9yZSBjb2xsYXBzaW5nIHRvIGEgc2luZ2xlXG4gKiBhcHAtd2lkZSB3aWxkY2FyZCwgYW5kIHRoZSBtb3N0IHBhdGhzIG9mIGFueSBraW5kLlxuICpcbiAqIENsb3VkRnJvbnQncyB3aWxkY2FyZCBxdW90YSBpcyBwZXIgKmRpc3RyaWJ1dGlvbiosIG5vdCBwZXIgcmVxdWVzdDogdGhlXG4gKiBpbnZhbGlkYXRpb25zIGl0IGhhcyBpbiBwcm9ncmVzcyBzaGFyZSBpdCwgc28gc3BsaXR0aW5nIGFuIG92ZXJzaXplZCBzZXQgaW50b1xuICogYmFjay10by1iYWNrIHJlcXVlc3RzIGlzIHdoYXQgZ2V0cyB0aGUgbGF0ZXIgb25lcyByZWplY3RlZFxuICogKGBUb29NYW55SW52YWxpZGF0aW9uc0luUHJvZ3Jlc3NgLCBvciBhIHRocm90dGxlIHVuZGVyIHRoZSBuZXdlciByYXRlLWJhc2VkXG4gKiBxdW90YXMpIC0gYW5kIGEgcmVqZWN0ZWQgcmVxdWVzdCBpcyBhIHBhZ2UgdGhhdCBzdGF5cyBzdGFsZSBhdCB0aGUgZWRnZS4gU29cbiAqIGV2ZXJ5dGhpbmcgZ29lcyBvdXQgYXMgb25lIHJlcXVlc3QsIGFuZCBhIHNldCB0aGF0IHdvdWxkIG5vdCBmaXQgaW4gb25lIGlzXG4gKiBhbnN3ZXJlZCB3aXRoIHRoZSB3aG9sZSBhcHAgKGAvKmAsIHNlZSBgd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRoc2ApIGluc3RlYWQ6XG4gKiBhIHdvcnNlIGhpdCByYXRlLCBhbmQgYSBzdHJpY3RseSBjb3JyZWN0IGFuc3dlci5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLWludmFsaWRhdGlvbnNcbiAqL1xuY29uc3QgTUFYX1dJTERDQVJEX1BBVEhTX1BFUl9JTlZBTElEQVRJT04gPSAxNTtcblxuY29uc3QgTUFYX1BBVEhTX1BFUl9JTlZBTElEQVRJT04gPSAzMDAwO1xuXG4vKipcbiAqIFJldHJpZXMgb2YgYW4gaW52YWxpZGF0aW9uIENsb3VkRnJvbnQgcmVqZWN0ZWQgZm9yIGl0cyBpbi1wcm9ncmVzcyBxdW90YSwgYW5kXG4gKiB0aGUgZGVsYXkgYmVmb3JlIHRoZSBmaXJzdDsgZWFjaCBsYXRlciBvbmUgd2FpdHMgdHdpY2UgYXMgbG9uZy5cbiAqXG4gKiBTaXppbmcgYSByZXF1ZXN0IGFnYWluc3QgdGhlIHF1b3RhIGNhbm5vdCBzZWUgdGhlIGludmFsaWRhdGlvbnMgb3RoZXJcbiAqIGluc3RhbmNlcyBhbHJlYWR5IGhhdmUgaW4gZmxpZ2h0LCBzbyB0d28gYHJldmFsaWRhdGVUYWdgcyBjbG9zZSB0b2dldGhlciBjYW5cbiAqIGVhY2ggZml0IG9uIHRoZWlyIG93biBhbmQgc3RpbGwgYmUgcmVqZWN0ZWQgdG9nZXRoZXIuIERyb3BwaW5nIHRoZSByZWplY3RlZFxuICogb25lIGxlZnQgaXRzIHBhZ2VzIHN0YWxlIGF0IHRoZSBlZGdlIGZvciB0aGUgd2hvbGUgYHMtbWF4YWdlYC4gVGhlIHJldHJ5IGFza3NcbiAqIGZvciB0aGUgd2hvbGUgYXBwIGluc3RlYWQsIHdoaWNoIGlzIG9uZSB3aWxkY2FyZCAtIHRoZSBsZWFzdCBvZiB0aGUgcXVvdGEgYW55XG4gKiByZXF1ZXN0IGNhbiB0YWtlIC0gYXQgdGhlIGNvc3Qgb2YgYSBjb2xkZXIgZWRnZS5cbiAqL1xuY29uc3QgSU5WQUxJREFUSU9OX1JFVFJJRVMgPSAyO1xuY29uc3QgSU5WQUxJREFUSU9OX1JFVFJZX0RFTEFZX01TID0gMTAwMDtcblxuLyoqIFRoZSBlcnJvcnMgdGhhdCBtZWFuIFwidGhlIHF1b3RhIGlzIGZ1bGwgcmlnaHQgbm93XCIsIG5vdCBcInRoaXMgaXMgd3JvbmdcIi4gKi9cbmZ1bmN0aW9uIGlzSW52YWxpZGF0aW9uUXVvdGFFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCBuYW1lID0gKGVycm9yIGFzIHsgbmFtZT86IHVua25vd24gfSB8IG51bGwpPy5uYW1lO1xuICByZXR1cm4gbmFtZSA9PT0gXCJUb29NYW55SW52YWxpZGF0aW9uc0luUHJvZ3Jlc3NcIiB8fCBuYW1lID09PSBcIlRocm90dGxpbmdcIjtcbn1cblxuLyoqXG4gKiBUaGUgbW9zdCBjYWNoZSBrZXlzIHRvIHJlbWVtYmVyIGFzIHNlcnZlZCBzdGFsZSB3aGlsZSBhd2FpdGluZyB0aGVpclxuICogcmVnZW5lcmF0aW9uLiBBIGJhY2tncm91bmQgcmVuZGVyIHRoYXQgZmFpbHMgbmV2ZXIgY2FsbHMgYHNldGAsIHNvIHdpdGhvdXQgYVxuICogYm91bmQgaXRzIGtleSB3b3VsZCBzdGF5IGJlaGluZCBmb3IgdGhlIGxpZmUgb2YgdGhlIGluc3RhbmNlLlxuICogQHNlZSBTM0NhY2hlSGFuZGxlci5zb2Z0UmV2YWxpZGF0ZWRLZXlzXG4gKi9cbmNvbnN0IE1BWF9TT0ZUX1JFVkFMSURBVEVEX0tFWVMgPSAxMDAwO1xuXG4vKipcbiAqIEhvdyBtYW55IDEgTUIgUXVlcnkgcGFnZXMgb2Ygb25lIHRhZydzIG1hcHBpbmcgcm93cyB0byB3YWxrLiBBIGNlaWxpbmcgcmF0aGVyXG4gKiB0aGFuIGEgcmVhbCBsaW1pdDogaXQgYm91bmRzIGEgcnVuYXdheSB0YWcgaW5zdGVhZCBvZiBwYWdpbmF0aW5nIGEgd2hvbGUgdGFibGVcbiAqIG9uIGEgcmVxdWVzdCBwYXRoLiBBIHRhZyBjdXQgb2ZmIGhlcmUgaW52YWxpZGF0ZXMgdGhlIHdob2xlIGFwcCwgYmVjYXVzZSB0aGVcbiAqIHJvd3MgaXQgbmV2ZXIgcmVhZCBhcmUgcGFnZXMgd2hvc2UgZWRnZSBjb3B5IHdvdWxkIG90aGVyd2lzZSBzdGF5IHN0YWxlLlxuICovXG5jb25zdCBNQVhfVEFHX1FVRVJZX1BBR0VTID0gMjA7XG5cbi8qKlxuICogTmV4dC5qcydzIGluLXByb2Nlc3MgdGFnIG1hbmlmZXN0LCB3aGljaCBgSW5jcmVtZW50YWxDYWNoZS5nZXRgIGNvbnN1bHRzIHRvXG4gKiBkZWNpZGUgd2hldGhlciBhbiBlbnRyeSBpcyBzdGFsZSAtIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGZvdW5kXG4gKiB1bmFtYmlndW91c2x5LlxuICpcbiAqIGByZXZhbGlkYXRlVGFnKHRhZywgcHJvZmlsZSlgIGFza3MgZm9yIHN0YWxlLXdoaWxlLXJldmFsaWRhdGU6IHRoZSBlbnRyeSBpc1xuICogc2VydmVkIG9uY2UgbW9yZSB3aGlsZSBhIGJhY2tncm91bmQgcmVuZGVyIHJlcGxhY2VzIGl0LiBBIGNhY2hlIGhhbmRsZXIgaGFzXG4gKiBubyBmaWVsZCB0byBzYXkgXCJzdGFsZVwiIGluIC0gYGxhc3RNb2RpZmllZDogLTFgIG1lYW5zIGV4cGlyZWQsIHdoaWNoIGJsb2NrcyAtXG4gKiBzbyB0aGlzIHNldHMgdGhlIHRhZydzIGBzdGFsZWAgdGltZXN0YW1wIHdoZXJlIE5leHQuanMgYWxyZWFkeSBsb29rcyBmb3IgaXQsXG4gKiB3aGljaCBpcyBleGFjdGx5IHdoYXQgaXRzIG93biBgRmlsZVN5c3RlbUNhY2hlLnJldmFsaWRhdGVUYWdgIGRvZXMuIFRoZSBtb2R1bGVcbiAqIGlzIHJlYWQgZnJvbSB0aGUgbG9hZGVkLW1vZHVsZSBjYWNoZSByYXRoZXIgdGhhbiBgcmVxdWlyZWBkOiB0aGUgaGFuZGxlciBpc1xuICogYnVuZGxlZCBhcGFydCBmcm9tIHRoZSBhcHAsIGFuZCByZXNvbHZpbmcgYG5leHRgIGZyb20gaGVyZSBjb3VsZCByZWFjaCBhXG4gKiBkaWZmZXJlbnQgY29weSB0aGFuIHRoZSBzZXJ2ZXIgbG9hZGVkLCB3aG9zZSBtYW5pZmVzdCBub3RoaW5nIHJlYWRzLiBBIHN0YWxlXG4gKiBtYXJrIHdyaXR0ZW4gdGhlcmUgd291bGQgc2VydmUgdGhlIGVudHJ5IGFzIGZyZXNoLCBzbyB3aXRob3V0IGV4YWN0bHkgb25lXG4gKiBsb2FkZWQgY29weSB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gZXhwaXJpbmcgdGhlIGVudHJ5IG91dHJpZ2h0LlxuICovXG5jb25zdCBUQUdTX01BTklGRVNUX01PRFVMRSA9XG4gIFwiL25leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlL3RhZ3MtbWFuaWZlc3QuZXh0ZXJuYWwuanNcIjtcbmZ1bmN0aW9uIG5leHRUYWdzTWFuaWZlc3QoKTpcbiAgTWFwPHN0cmluZywgeyBzdGFsZT86IG51bWJlcjsgZXhwaXJlZD86IG51bWJlciB9PiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhY2hlID0gY3JlYXRlUmVxdWlyZShqb2luKHByb2Nlc3MuY3dkKCksIFwiaW5kZXguanNcIikpLmNhY2hlO1xuICBjb25zdCBsb2FkZWQgPSBPYmplY3Qua2V5cyhjYWNoZSkuZmlsdGVyKChwYXRoKSA9PlxuICAgIHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikuZW5kc1dpdGgoVEFHU19NQU5JRkVTVF9NT0RVTEUpLFxuICApO1xuICBpZiAobG9hZGVkLmxlbmd0aCAhPT0gMSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbWFuaWZlc3QgPSBjYWNoZVtsb2FkZWRbMF1dPy5leHBvcnRzPy50YWdzTWFuaWZlc3Q7XG4gIHJldHVybiBtYW5pZmVzdCBpbnN0YW5jZW9mIE1hcCA/IG1hbmlmZXN0IDogdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgQ2xvdWRGcm9udEludmFsaWRhdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdHJpYnV0aW9uIElELCB3aGVuIHRoZSBjb21wdXRlJ3MgZW52aXJvbm1lbnQgY2FuIGNhcnJ5IGl0XG4gICAqIChgTmV4dGpzR2xvYmFsQ29udGFpbmVyc2ApLlxuICAgKi9cbiAgZGlzdHJpYnV0aW9uSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE90aGVyd2lzZSwgdGhlIG5hbWUgKG5vdCB2YWx1ZSkgb2YgdGhlIFNTTSBQYXJhbWV0ZXIgaG9sZGluZyBpdC5cbiAgICpcbiAgICogT24gYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2AgdGhlIGRpc3RyaWJ1dGlvbidzIG9yaWdpbiBpcyB0aGUgZnVuY3Rpb24nc1xuICAgKiBVUkwsIHNvIHRoZSBmdW5jdGlvbidzIGVudmlyb25tZW50IG5hbWluZyB0aGUgZGlzdHJpYnV0aW9uIGJhY2sgd291bGQgYmVcbiAgICogYSBjaXJjdWxhciBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5LiBUaGUgcGFyYW1ldGVyICpuYW1lKiBpcyBzdGF0aWMgYW5kXG4gICAqIGtub3duIGF0IHN5bnRoIHRpbWU7IG9ubHkgaXRzICp2YWx1ZSogZGVwZW5kcyBvbiB0aGUgZGlzdHJpYnV0aW9uLlxuICAgKi9cbiAgZGlzdHJpYnV0aW9uSWRQYXJhbWV0ZXJOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXBwJ3MgYGJhc2VQYXRoYCwgYXMgdGhlIFVSSSBwcmVmaXggQ2xvdWRGcm9udCBjYWNoZWQgdGhlIHJlc3BvbnNlc1xuICAgKiB1bmRlci5cbiAgICogQHNlZSBjZG5JbnZhbGlkYXRpb25QYXRoc1xuICAgKi9cbiAgYmFzZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTM0NhY2hlSGFuZGxlck9wdGlvbnMge1xuICBjb250ZXh0OiBDYWNoZUhhbmRsZXJDb250ZXh0O1xuICAvKipcbiAgICogVGhlIGFwcCdzIGBiYXNlUGF0aGAsIGZvciB0ZXN0czogcmVhZCBmcm9tIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmBcbiAgICogb3RoZXJ3aXNlLlxuICAgKi9cbiAgYmFzZVBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTM0NhY2hlSGFuZGxlciBpbXBsZW1lbnRzIENhY2hlSGFuZGxlciB7XG4gIHByaXZhdGUgczNDbGllbnQ6IFMzQ2xpZW50O1xuICBwcml2YXRlIGR5bmFtb0NsaWVudDogRHluYW1vREJDbGllbnQ7XG4gIHByaXZhdGUgY2xvdWRGcm9udENsaWVudDogQ2xvdWRGcm9udENsaWVudDtcbiAgcHJpdmF0ZSBzc21DbGllbnQ6IFNTTUNsaWVudDtcbiAgcHJpdmF0ZSBidWNrZXQ6IENhY2hlQnVja2V0O1xuICBwcml2YXRlIHRhZ3M6IFRyYWNrZWRUYWdNYXJrZXJzO1xuICBwcml2YXRlIGNvbmZpZzogQXdzQ2FjaGVDb25maWc7XG4gIHByaXZhdGUgY2xvdWRGcm9udENvbmZpZzogQ2xvdWRGcm9udEludmFsaWRhdGlvbkNvbmZpZztcbiAgcHJpdmF0ZSBkZWJ1ZyA9IGdldERlYnVnKFwiY2RrLW5leHRqczpjYWNoZS1oYW5kbGVyOnMzXCIpO1xuXG4gIC8vIENhY2hlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoaXMgaW5zdGFuY2UgKGkuZS4gdGhlIGNvbXB1dGUgaW5zdGFuY2UpIG9uY2VcbiAgLy8gcmVzb2x2ZWQsIHNpbmNlIGEgZGVwbG95bWVudCdzIGRpc3RyaWJ1dGlvbiBJRCBuZXZlciBjaGFuZ2VzIGF0IHJ1bnRpbWUuXG4gIHByaXZhdGUgY2FjaGVkRGlzdHJpYnV0aW9uSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDYWNoZSBrZXlzIHRoaXMgaW5zdGFuY2Ugc2VydmVkIHN0YWxlIGJlY2F1c2Ugb2YgYSBzb2Z0IGByZXZhbGlkYXRlVGFnYCxcbiAgICogd2hvc2UgcmVnZW5lcmF0ZWQgZW50cnkgYHNldGAgaGFzIHlldCB0byB3cml0ZS5cbiAgICpcbiAgICogYHJldmFsaWRhdGVUYWcodGFnLCBwcm9maWxlKWAgaW52YWxpZGF0ZXMgQ2xvdWRGcm9udCBhdCBvbmNlLCBidXQgdGhlIG5leHRcbiAgICogcmVxdWVzdCBpcyBhbnN3ZXJlZCBmcm9tIHRoZSBzdGFsZSBlbnRyeSAtIHN0YWxlLXdoaWxlLXJldmFsaWRhdGUgLSBhbmQgdGhhdFxuICAgKiByZXNwb25zZSBjYXJyaWVzIHRoZSBlbnRyeSdzIG9yaWdpbmFsIGBzLW1heGFnZWAsIHNvIHRoZSBlZGdlIGNhY2hlcyB0aGVcbiAgICogc3RhbGUgYm9keSBhZ2Fpbi4gVGhlIGJhY2tncm91bmQgcmVuZGVyIHRoYXQgcmVwbGFjZXMgaXQgcnVucyBpbiB0aGlzIHNhbWVcbiAgICogcHJvY2Vzcywgc28gYHNldGAgY2hlY2tzIGZvciB0aGUga2V5IGhlcmUgYW5kIGludmFsaWRhdGVzIHRoZSBrZXkncyBwYXRocyBhIHNlY29uZFxuICAgKiB0aW1lIG9uY2UgdGhlIGZyZXNoIGVudHJ5IGlzIGluIFMzLiBXaXRob3V0IHRoYXQsIHRoZSBlZGdlIGtlcHQgc2VydmluZyB0aGVcbiAgICogcHJlLXJldmFsaWRhdGlvbiBwYWdlIGZvciB0aGUgd2hvbGUgYHMtbWF4YWdlYC5cbiAgICpcbiAgICogRXhwaXJpbmcgc29mdC1yZXZhbGlkYXRlZCBlbnRyaWVzIG91dHJpZ2h0IGluc3RlYWQgd291bGQgYWxzbyBrZWVwIHRoZSBlZGdlXG4gICAqIHJpZ2h0LCBidXQgaXQgdHVybnMgZXZlcnkgYHJldmFsaWRhdGVUYWcodGFnLCBcIm1heFwiKWAgaW50byBhIGJsb2NraW5nIHJlbmRlclxuICAgKiBhdCB0aGUgb3JpZ2luLCB3aGljaCBpcyB0aGUgdGhpbmcgYSBwcm9maWxlIGFza3Mgbm90IHRvIGhhcHBlbi5cbiAgICpcbiAgICogV2hlbiB0aGUgcmUtcmVuZGVyIGZhaWxzLCBuZXh0IDE2LjQncyBgcmV0YWluUHJldmlvdXNDYWNoZUVudHJ5YCB3cml0ZXMgdGhlXG4gICAqIHN0YWxlIHZhbHVlIGJhY2sgd2l0aCBhIHNob3J0IGxpZmV0aW1lOiB0aGF0IGlzIG5vIHJlZ2VuZXJhdGlvbiwgc28gdGhlIGtleVxuICAgKiBrZWVwcyB3YWl0aW5nIHJhdGhlciB0aGFuIGludmFsaWRhdGluZyB0aGUgZWRnZSBmb3IgYSBwYWdlIHRoYXQgaGFzIG5vdFxuICAgKiBjaGFuZ2VkLiB7QGxpbmsgc2VydmVkU3RhbGV9IGlzIGhvdyBgc2V0YCByZWNvZ25pc2VzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzb2Z0UmV2YWxpZGF0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IHZhbHVlIGhhbmRlZCBvdXQgc3RhbGUsIGJ5IGlkZW50aXR5OiB0aGUgb2JqZWN0IGBnZXRgIHJldHVybmVkIGlzIHRoZVxuICAgKiBvbmUgYHJldGFpblByZXZpb3VzQ2FjaGVFbnRyeWAgd3JpdGVzIGJhY2suIFdlYWssIHNvIGEgcGFnZSBib2R5IGlzIGhlbGQgbm9cbiAgICogbG9uZ2VyIHRoYW4gdGhlIG1lbW9yeSBsYXllciBvciB0aGUgcmVxdWVzdCBob2xkcyBpdC5cbiAgICovXG4gIHByaXZhdGUgc2VydmVkU3RhbGUgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgLyoqIEBzZWUgYnVpbGRUYWdNYW5pZmVzdCAqL1xuICBwcml2YXRlIGJ1aWxkVGFnczogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmdbXT4+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFMzQ2FjaGVIYW5kbGVyT3B0aW9ucykge1xuICAgIHRoaXMuY29uZmlnID0gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCk7XG5cbiAgICAvLyBPbmx5IHNldCBmb3IgQ2xvdWRGcm9udC1mcm9udGVkIGRlcGxveW1lbnRzIChOZXh0anNHbG9iYWxGdW5jdGlvbnMvQ29udGFpbmVycykuXG4gICAgLy8gV2hlbiB1bnNldCwgb24tZGVtYW5kIHJldmFsaWRhdGlvbiBza2lwcyBDRE4gaW52YWxpZGF0aW9uIGFuZCByZWxpZXMgb24gdGhlXG4gICAgLy8gZGlzdHJpYnV0aW9uJ3MgY2FjaGUgcG9saWN5IFRUTCAoZHJpdmVuIGJ5IHRoZSBvcmlnaW4ncyBDYWNoZS1Db250cm9sIGhlYWRlcilcbiAgICAvLyB0byBldmVudHVhbGx5IHBpY2sgdXAgZnJlc2ggY29udGVudC5cbiAgICB0aGlzLmNsb3VkRnJvbnRDb25maWcgPSB7XG4gICAgICBkaXN0cmlidXRpb25JZDogcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19ESVNUUklCVVRJT05fSUQgfHwgXCJcIixcbiAgICAgIGRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZTpcbiAgICAgICAgcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19ESVNUUklCVVRJT05fSURfUEFSQU1fTkFNRSB8fCBcIlwiLFxuICAgICAgYmFzZVBhdGg6IGJhc2VQYXRoUHJlZml4KG9wdGlvbnMuYmFzZVBhdGgpLFxuICAgIH07XG4gICAgLy8gT25seSBpbnZhbGlkYXRpb24gbmVlZHMgaXQsIHNvIG9ubHkgYSBoYW5kbGVyIGJlaGluZCBhIGRpc3RyaWJ1dGlvbiByZWFkc1xuICAgIC8vIGl0LCBhbmQgYSBtaXNzaW5nIGZpbGUgdGhlcmUgaXMgd29ydGggYSB3YXJuaW5nLlxuICAgIGlmICh0aGlzLmludmFsaWRhdGVzQ2RuICYmIG9wdGlvbnMuYmFzZVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jbG91ZEZyb250Q29uZmlnLmJhc2VQYXRoID0gYmFzZVBhdGhQcmVmaXgoXG4gICAgICAgIGFwcEJhc2VQYXRoKG9wdGlvbnMuY29udGV4dC5zZXJ2ZXJEaXN0RGlyKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBBV1MgY2xpZW50c1xuICAgIGNvbnN0IHsgcmVnaW9uIH0gPSB0aGlzLmNvbmZpZztcbiAgICB0aGlzLnMzQ2xpZW50ID0gbmV3IFMzQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHRoaXMuZHluYW1vQ2xpZW50ID0gbmV3IER5bmFtb0RCQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHRoaXMuY2xvdWRGcm9udENsaWVudCA9IG5ldyBDbG91ZEZyb250Q2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHRoaXMuc3NtQ2xpZW50ID0gbmV3IFNTTUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBDYWNoZUJ1Y2tldCh0aGlzLnMzQ2xpZW50LCB0aGlzLmNvbmZpZy5idWNrZXROYW1lKTtcbiAgICAvLyBUaGUgcHJvY2VzcydzIG9uZSBjb3B5IG9mIHRoZSB0YWcgbWFya2Vycywgc2hhcmVkIHdpdGggdGhlIGAndXNlIGNhY2hlJ2BcbiAgICAvLyBoYW5kbGVyczogb25lIGByZXZhbGlkYXRlVGFnYCB3cml0ZXMgZWFjaCB0YWcncyByb3dzIG9uY2UsIGFuZCBvbmUgbG9nXG4gICAgLy8gYFF1ZXJ5YCBwZXIgaW50ZXJ2YWwgc2VydmVzIGV2ZXJ5IGhhbmRsZXIuXG4gICAgdGhpcy50YWdzID0gc2hhcmVkVGFnTWFuaWZlc3QoKTtcblxuICAgIC8vIGByZXMucmV2YWxpZGF0ZSgpYCByZWdlbmVyYXRlcyBhIHBhZ2Ugd2l0aG91dCBnb2luZyB0aHJvdWdoXG4gICAgLy8gYHJldmFsaWRhdGVUYWdgLCBzbyB0aGUgcnVudGltZSBhc2tzIGZvciB0aGUgQ0ROIGNvcGllcyBpdHNlbGYsIHRocm91Z2hcbiAgICAvLyB0aGlzIGhvb2sgKGBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlYCBpbiBgc3JjL3J1bnRpbWUvY29yZS50c2ApLiBBIGdsb2JhbFxuICAgIC8vIGJlY2F1c2UgdGhlIHJ1bnRpbWUgYW5kIHRoaXMgaGFuZGxlciBhcmUgc2VwYXJhdGUgYnVuZGxlcyBpbiBvbmUgcHJvY2Vzcy5cbiAgICAvLyBFdmVyeSBpbnN0YW5jZSByZWdpc3RlcnMgdGhlIHNhbWUgdGhpbmcsIHNvIHRoZSBsYXRlc3Qgb25lIHdpbm5pbmcgaXMgZmluZS5cbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlc0Nkbikge1xuICAgICAgKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1JFVkFMSURBVEVEX1BBR0VfSE9PS10gPSAoXG4gICAgICAgIHJvdXRlczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCB9ID0gdGhpcy5jbG91ZEZyb250Q29uZmlnO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZhbGlkYXRlQ2xvdWRGcm9udFBhdGhzKFxuICAgICAgICAgIHJvdXRlcy5mbGF0TWFwKChyb3V0ZSkgPT4gY2RuSW52YWxpZGF0aW9uUGF0aHMocm91dGUsIGJhc2VQYXRoKSksXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcuYnVja2V0TmFtZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkNES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldCwgUzMgY2FjaGUgZGlzYWJsZWRcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy50YWJsZU5hbWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBzZXQsIHJldmFsaWRhdGlvbiB0cmFja2luZyBkaXNhYmxlZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2Nlc3MuZW52LkNES19ORVhUSlNfQlVJTERfSUQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDREtfTkVYVEpTX0JVSUxEX0lEIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBzZXQsIGNhY2hlIGlzb2xhdGlvbiBtYXkgbm90IHdvcmsgY29ycmVjdGx5XCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldChcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIGN0eDogR2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbiAgKTogUHJvbWlzZTxDYWNoZUhhbmRsZXJWYWx1ZSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5idWNrZXROYW1lKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvYmplY3RLZXkgPSBzM09iamVjdEtleSh0aGlzLmNvbmZpZy5idWlsZElkLCBjYWNoZUtleSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5idWNrZXQuZ2V0KG9iamVjdEtleSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgUzMgQ0FDSEUgTUlTUzogJHtjYWNoZUtleX1gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZXJ5IG9iamVjdCBpcyBKU09OIChgcHV0SnNvbmAsIGFuZCB0aGUgc2VlZGVkIGAuanNvbmAgZmlsZXMpOyBvbmVcbiAgICAgIC8vIHRoYXQgZG9lcyBub3QgcGFyc2UgaXMgYSBtaXNzLCB0aHJvdWdoIHRoZSBgY2F0Y2hgIGJlbG93LlxuICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSBwYXJzZUNhY2hlVmFsdWUocmVzcG9uc2UpO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5pc1JldmFsaWRhdGVkKHBhcnNlZFZhbHVlLCBjdHgsIGNhY2hlS2V5KSkge1xuICAgICAgICB0aGlzLmRlYnVnKGBTMyBDQUNIRSBJTlZBTElEQVRFRCBCWSBUQUc6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgIC8vIEEgcmV2YWxpZGF0ZWQgYGZldGNoYCBlbnRyeSBoYXMgdG8gcmVhZCBhcyBhIG1pc3Mgc28gdGhlIHJlcXVlc3RcbiAgICAgICAgLy8gcmVmZXRjaGVzIGluc3RlYWQgb2YgcmV1c2luZyB0aGUgYm9keSAtIHRoZSBzYW1lIHRoaW5nIE5leHQuanMnc1xuICAgICAgICAvLyBvd24gYEZpbGVTeXN0ZW1DYWNoZWAgZG9lcyB3aXRoIGByZXZhbGlkYXRlZFRhZ3NgLiBPbmx5IGFcbiAgICAgICAgLy8gKnJlc3BvbnNlKiBlbnRyeSBnZXRzIGhhbmRlZCBiYWNrIGV4cGlyZWQsIGJlY2F1c2UgZm9yIHRob3NlIGFcbiAgICAgICAgLy8gbWlzcyBpcyB3b3JzZSB0aGFuIHN0YWxlOiBzZWUgYEVYUElSRURfTEFTVF9NT0RJRklFRGAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5laXRoZXIgaXMgZGVsZXRlZC4gVGhlIHJlZmV0Y2ggb3IgcmUtcmVuZGVyIHRoaXMgcHJvdm9rZXNcbiAgICAgICAgLy8gb3ZlcndyaXRlcyB0aGUgb2JqZWN0IHRocm91Z2ggYHNldGAsIHdpdGggYSBgbGFzdE1vZGlmaWVkYCBwYXN0IHRoZVxuICAgICAgICAvLyB0YWcncyBtYXJrZXI7IGRlbGV0aW5nIGl0IGhlcmUgYXMgd2VsbCByYWNlZCB0aGF0IHdyaXRlLCBhbmQgYVxuICAgICAgICAvLyBjb25jdXJyZW50IHJlcXVlc3QncyBmcmVzaCBlbnRyeSBjb3VsZCBiZSB0aGUgb25lIHJlbW92ZWQuIEtlZXBpbmdcbiAgICAgICAgLy8gYSByZXNwb25zZSBlbnRyeSBhbHNvIG1lYW5zIGEgcmVuZGVyIHRoYXQgZmFpbHMgaXMgYW5zd2VyZWQgZnJvbVxuICAgICAgICAvLyB0aGUgbGFzdCBnb29kIGNvcHkgcmF0aGVyIHRoYW4gZnJvbSBhIHNoZWxsLlxuICAgICAgICByZXR1cm4gaXNGZXRjaENhY2hlR2V0KGN0eClcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBFWFBJUkVEX0xBU1RfTU9ESUZJRUQsXG4gICAgICAgICAgICAgIHZhbHVlOiBwYXJzZWRWYWx1ZS52YWx1ZSxcbiAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBzdG9yZWRDYWNoZUNvbnRyb2wocGFyc2VkVmFsdWUuY2FjaGVDb250cm9sKSxcbiAgICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIEhJVDogJHtjYWNoZUtleX0gKCR7b2JqZWN0S2V5fSlgKTtcblxuICAgICAgLy8gV2l0aG91dCB0aGUgc3RvcmVkIHRhZ3MuIFdpdGggdGhlIHN0b3JlZCBsaWZldGltZTogc2VlXG4gICAgICAvLyBgZ2V0Q2FjaGVDb250cm9sYC5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhc3RNb2RpZmllZDogcGFyc2VkVmFsdWUubGFzdE1vZGlmaWVkLFxuICAgICAgICB2YWx1ZTogcGFyc2VkVmFsdWUudmFsdWUsXG4gICAgICAgIGNhY2hlQ29udHJvbDogc3RvcmVkQ2FjaGVDb250cm9sKHBhcnNlZFZhbHVlLmNhY2hlQ29udHJvbCksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgYWN0dWFsIGVycm9ycyAoYSBjYWNoZSBtaXNzIGlzIG5vdCBvbmU6IHNlZSBgQ2FjaGVCdWNrZXQuZ2V0YClcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJldHJpZXZpbmcgY2FjaGUgZnJvbSBTMzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHRhZyByZXZhbGlkYXRpb24gaGFzIGV4cGlyZWQgYGVudHJ5YCwgZm9yIGEgYGdldGAgd2l0aCBgY3R4YC5cbiAgICpcbiAgICogUHVibGljIGJlY2F1c2UgdGhlIGluLW1lbW9yeSBsYXllciBpbiBmcm9udCBvZiB0aGlzIGhhbmRsZXIgaGFzIHRvIGFzayB0b286XG4gICAqIGEgbWVtb3J5IGhpdCBuZXZlciByZWFjaGVzIHtAbGluayBnZXR9LCBhbmQgd2l0aG91dCB0aGlzIGNoZWNrIGFuIGluc3RhbmNlXG4gICAqIG90aGVyIHRoYW4gdGhlIG9uZSB0aGF0IHJhbiBgcmV2YWxpZGF0ZVRhZ2Aga2VwdCBhbnN3ZXJpbmcgZnJvbSBtZW1vcnkgZm9yXG4gICAqIHRoZSB3aG9sZSBtZW1vcnkgVFRMIC0gbG9uZyBlbm91Z2ggZm9yIENsb3VkRnJvbnQgdG8gY2FjaGUgdGhlIHN0YWxlIHBhZ2VcbiAgICogYWdhaW4gYWZ0ZXIgdGhlIGludmFsaWRhdGlvbi5cbiAgICpcbiAgICogV2hpY2ggdGFncyB0byBjaGVjayBkZXBlbmRzIG9uIHRoZSBraW5kLCBhbmQgTmV4dC5qcydzIG93blxuICAgKiBgRmlsZVN5c3RlbUNhY2hlLmdldGAgc3BsaXRzIHRoZSBzYW1lIHR3byB3YXlzOiBhIHJlc3BvbnNlIGVudHJ5IGlzIGNoZWNrZWRcbiAgICogYWdhaW5zdCB0aGUgdGFncyAqaXQqIHdhcyBzdG9yZWQgd2l0aCwgYnV0IGEgYGZldGNoYCBlbnRyeSBpcyBjaGVja2VkXG4gICAqIGFnYWluc3QgYFsuLi5jdHgudGFncywgLi4uY3R4LnNvZnRUYWdzXWAg4oCUIHRoZSB0YWdzIG9mIHRoZSByZXF1ZXN0IGFza2luZ1xuICAgKiBmb3IgaXQuIFRoYXQgZGlzdGluY3Rpb24gaXMgbG9hZC1iZWFyaW5nLCBiZWNhdXNlIGEgYGZldGNoYCBlbnRyeSBpcyBvbmx5XG4gICAqIGV2ZXIgc3RvcmVkIHdpdGggaXRzICpleHBsaWNpdCogYGNhY2hlOiB7IHRhZ3MgfWAgYW5kIG5ldmVyIHdpdGggdGhlXG4gICAqIGltcGxpY2l0IGBfTl9UXy88cGF0aD5gIGNoYWluLCB3aGljaCBhcnJpdmVzIG9ubHkgYXMgYGN0eC5zb2Z0VGFnc2AuXG4gICAqIFJlYWRpbmcgdGhlIHN0b3JlZCB0YWdzIGZvciBhIGBmZXRjaGAgdG9vIG1lYW50IGFuIHVudGFnZ2VkIGBmb3JjZS1jYWNoZWBcbiAgICogZmV0Y2ggaGFkIGBbXWAsIHNraXBwZWQgdGhlIGNoZWNrIGVudGlyZWx5LCBhbmQgbm8gYHJldmFsaWRhdGVQYXRoYCBjb3VsZFxuICAgKiBldmVyIGV2aWN0IGl0OiBhIGBmb3JjZS1keW5hbWljYCBwYWdlIHdob3NlIGRhdGEgY29tZXMgZnJvbSBzdWNoIGEgZmV0Y2hcbiAgICogcmUtcmVuZGVyZWQgb24gZXZlcnkgcmVxdWVzdCBhbmQgc3RpbGwgc2VydmVkIHRoZSBzYW1lIGJvZHkgZm9yZXZlci5cbiAgICogTWVhc3VyZWQgYWdhaW5zdCBuZXh0LmpzJ3MgYHRlc3QvZTJlL2FwcC1kaXIvcmV2YWxpZGF0ZS1wYXRoLXdpdGgtcmV3cml0ZXNgLlxuICAgKlxuICAgKiBgY2FjaGVLZXlgIGlzIHRoZSBrZXkgdGhlIGVudHJ5IHdhcyByZWFkIHVuZGVyLiBBIHJlc3BvbnNlIGVudHJ5IGZvdW5kXG4gICAqIHN0YWxlIGlzIHJlbWVtYmVyZWQgYnkgaXQsIGZvciBgc2V0YCB0byBpbnZhbGlkYXRlIENsb3VkRnJvbnQgYWdhaW4gb25jZVxuICAgKiBpdHMgcmVnZW5lcmF0aW9uIGxhbmRzOiBzZWUge0BsaW5rIHNvZnRSZXZhbGlkYXRlZEtleXN9LlxuICAgKi9cbiAgYXN5bmMgaXNSZXZhbGlkYXRlZChcbiAgICBlbnRyeTogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IHRhZ3M/OiBzdHJpbmdbXTsgdmFsdWU/OiB1bmtub3duIH0sXG4gICAgY3R4OiBHZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5jb25maWcudGFibGVOYW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNoZWNrVGFncyA9IGlzRmV0Y2hDYWNoZUdldChjdHgpXG4gICAgICA/IFsuLi4oY3R4LnRhZ3MgPz8gW10pLCAuLi4oY3R4LnNvZnRUYWdzID8/IFtdKV1cbiAgICAgIDogZW50cnlUYWdzKGVudHJ5KTtcbiAgICBpZiAoY2hlY2tUYWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMuY2hlY2tJZlJldmFsaWRhdGVkKFxuICAgICAgZW50cnkubGFzdE1vZGlmaWVkID8/IDAsXG4gICAgICBjaGVja1RhZ3MsXG4gICAgKTtcbiAgICBpZiAoc3RhdGUgPT09IFwic3RhbGVcIiAmJiAhaXNGZXRjaENhY2hlR2V0KGN0eCkpIHtcbiAgICAgIHRoaXMubm90ZVNvZnRSZXZhbGlkYXRlZChjYWNoZUtleSwgZW50cnkudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUgPT09IFwiZXhwaXJlZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbWVtYmVyIHRoYXQgYGNhY2hlS2V5YCB3YXMgc2VydmVkIHN0YWxlLCB3aGVuIHRoZXJlIGlzIGEgZGlzdHJpYnV0aW9uXG4gICAqIHdob3NlIGNvcHkgb2YgaXQgd2lsbCBuZWVkIGludmFsaWRhdGluZyBhZ2Fpbi4gU2VlXG4gICAqIHtAbGluayBzb2Z0UmV2YWxpZGF0ZWRLZXlzfS5cbiAgICovXG4gIHByaXZhdGUgbm90ZVNvZnRSZXZhbGlkYXRlZChjYWNoZUtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnZhbGlkYXRlc0Nkbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnNlcnZlZFN0YWxlLmFkZCh2YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUoY2FjaGVLZXkpO1xuICAgIGlmICh0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMuc2l6ZSA+PSBNQVhfU09GVF9SRVZBTElEQVRFRF9LRVlTKSB7XG4gICAgICAvLyBJbnNlcnRpb24gb3JkZXI6IHRoZSBmaXJzdCBrZXkgaXMgdGhlIG9uZSB3YWl0aW5nIGxvbmdlc3QuXG4gICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMuZGVsZXRlKG9sZGVzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5hZGQoY2FjaGVLZXkpO1xuICB9XG5cbiAgYXN5bmMgc2V0KFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICAgZGF0YTogSW5jcmVtZW50YWxDYWNoZVZhbHVlIHwgbnVsbCxcbiAgICBjdHg6IFNldENhY2hlSGFuZGxlckNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFRoZSBlbnRyeSdzIG5hbWUgaW4gdGFnIG1hcHBpbmdzIGFuZCBDbG91ZEZyb250IHBhdGhzLCBhbmQgdGhlIG9iamVjdFxuICAgIC8vIGl0IGlzIHN0b3JlZCBpbiwgd2hpY2ggZGlmZmVyIGZvciBhIG5hbWUgdG9vIGxvbmcgZm9yIFMzLlxuICAgIGNvbnN0IHMzS2V5ID0gYnVpbGRTM0tleSh0aGlzLmNvbmZpZy5idWlsZElkLCBjYWNoZUtleSk7XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gczNPYmplY3RLZXkodGhpcy5jb25maWcuYnVpbGRJZCwgY2FjaGVLZXkpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgLy8gRGVsZXRlIGZyb20gUzMgYW5kIER5bmFtb0RCXG4gICAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIERFTEVURTogJHtjYWNoZUtleX1gKTtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmJ1Y2tldE5hbWUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZW50cnkgaXMgZ29uZSwgc28gdGhlcmUgaXMgbm8gcmVnZW5lcmF0aW9uIGxlZnQgdG8gd2FpdCBmb3IuXG4gICAgICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUoY2FjaGVLZXkpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIGVudHJ5J3MgdGFncyBiZWZvcmUgdGhlIG9iamVjdCBpcyBnb25lOiB0aGV5IGFyZSB0aGUgb25seVxuICAgICAgICAvLyB3YXkgdG8gbmFtZSBpdHMgbWFwcGluZyByb3dzLCB3aG9zZSBzb3J0IGtleSBpcyBgdGFnI3MzS2V5YCBhbmQgc29cbiAgICAgICAgLy8gY2Fubm90IGJlIHF1ZXJpZWQgZnJvbSB0aGUga2V5IHNpZGUuIFNlZSBgc3RvcmVkRW50cnlUYWdzYC5cbiAgICAgICAgY29uc3QgdGFncyA9IGF3YWl0IHRoaXMuc3RvcmVkRW50cnlUYWdzKG9iamVjdEtleSwgY3R4KTtcblxuICAgICAgICBhd2FpdCB0aGlzLnMzQ2xpZW50LnNlbmQoXG4gICAgICAgICAgbmV3IERlbGV0ZU9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmNvbmZpZy5idWNrZXROYW1lLFxuICAgICAgICAgICAgS2V5OiBvYmplY3RLZXksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIERFTEVURUQ6ICR7b2JqZWN0S2V5fWApO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRHluYW1vREJUYWdNYXBwaW5ncyhzM0tleSwgdGFncyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gYGVudHJ5VGFnc2AsIG5vdCBgZ2V0VGFncyhjdHgpYCBhbG9uZTogZm9yIGEgcGFnZSBvciByb3V0ZSByZXNwb25zZVxuICAgICAgLy8gYGN0eGAgY2FycmllcyBvbmx5IGB7IGNhY2hlQ29udHJvbCwgaXNSb3V0ZVBQUkVuYWJsZWQsIGlzRmFsbGJhY2sgfWAg4oCUXG4gICAgICAvLyBgUmVzcG9uc2VDYWNoZS5zZXRgIGJ1aWxkcyBpdCB0aGF0IHdheSBhbmQgYEluY3JlbWVudGFsQ2FjaGUuc2V0YFxuICAgICAgLy8gZm9yd2FyZHMgaXQgdW5jaGFuZ2VkIOKAlCBzbyB0aGUgdGFncyBsaXZlIGluIHRoZSByZW5kZXInc1xuICAgICAgLy8gYHgtbmV4dC1jYWNoZS10YWdzYCBoZWFkZXIgYW5kIG5vd2hlcmUgZWxzZS4gUmVhZGluZyBvbmx5IGBjdHhgIG1lYW50IG5vXG4gICAgICAvLyBydW50aW1lLXJlbmRlcmVkIHBhZ2UgZXZlciBnb3QgYSBtYXBwaW5nIHJvdywgYW5kIGEgcGFnZSB0aGF0IGlzIG5vdCBpblxuICAgICAgLy8gdGhlIGJ1aWxkJ3MgdGFnIG1hbmlmZXN0IG5hbWVzIG5vbmUgZWl0aGVyOiBhIGxhdGVyXG4gICAgICAvLyBgcmV2YWxpZGF0ZVRhZ2AgZm91bmQgbm90aGluZyB0byBpbnZhbGlkYXRlIGFuZCBDbG91ZEZyb250IGtlcHQgc2VydmluZ1xuICAgICAgLy8gdGhlIHN0YWxlIEhUTUwgYW5kIFJTQyBwYXlsb2FkIGZvciB0aGUgd2hvbGUgYHMtbWF4YWdlYC4gU2FtZSBzb3VyY2UgdGhlXG4gICAgICAvLyByZWFkIHBhdGggYWJvdmUgYWxyZWFkeSBmYWxscyBiYWNrIHRvLlxuICAgICAgY29uc3QgdGFncyA9IGVudHJ5VGFncyh7IHRhZ3M6IGdldFRhZ3MoY3R4KSwgdmFsdWU6IGRhdGEgfSk7XG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgUzMgQ0FDSEUgU0VUOiBLZXk6ICR7Y2FjaGVLZXl9LCB0YWdzOiAke3RhZ3MubGVuZ3RoID8gdGFncyA6IFwibm9uZVwifWAsXG4gICAgICApO1xuXG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmJ1Y2tldE5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgQ2FjaGVIYW5kbGVyVmFsdWUgc3RydWN0dXJlIGZvciBTMyBzdG9yYWdlIHdpdGggdGFnc1xuICAgICAgY29uc3QgY2FjaGVIYW5kbGVyVmFsdWU6IENhY2hlSGFuZGxlclZhbHVlID0ge1xuICAgICAgICAvLyBPbiB0aGUgbWFya2VyIGNsb2NrLCBzaW5jZSB0aGF0IGlzIHdoYXQgaXQgaXMgY29tcGFyZWQgd2l0aC5cbiAgICAgICAgbGFzdE1vZGlmaWVkOiBtYXJrZXJDbG9jaygpLFxuICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgY2FjaGVDb250cm9sOiBnZXRDYWNoZUNvbnRyb2woY3R4KSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0b3JlIHRhZ3Mgd2l0aCB0aGUgY2FjaGUgZW50cnkgZm9yIHJldmFsaWRhdGlvbiBjaGVja2luZ1xuICAgICAgY29uc3QgY2FjaGVFbnRyeVdpdGhUYWdzID0ge1xuICAgICAgICAuLi5jYWNoZUhhbmRsZXJWYWx1ZSxcbiAgICAgICAgdGFncyxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSB3aXRoIGN1c3RvbSBoYW5kbGluZyBmb3IgTWFwIGFuZCBCdWZmZXIgb2JqZWN0c1xuICAgICAgY29uc3QgYm9keSA9IHNlcmlhbGl6ZUNhY2hlVmFsdWUoY2FjaGVFbnRyeVdpdGhUYWdzKTtcblxuICAgICAgLy8gQWx3YXlzIEpTT04gc2luY2Ugd2Ugc3RvcmUgQ2FjaGVIYW5kbGVyVmFsdWVcbiAgICAgIGF3YWl0IHRoaXMuYnVja2V0LnB1dEpzb24ob2JqZWN0S2V5LCBib2R5KTtcblxuICAgICAgdGhpcy5kZWJ1ZyhgUzMgQ0FDSEUgU1RPUkVEOiAke2NhY2hlS2V5fSAoJHtkYXRhLmtpbmR9KWApO1xuXG4gICAgICAvLyBUaGUgcmVnZW5lcmF0aW9uIG9mIGFuIGVudHJ5IHNlcnZlZCBzdGFsZTogQ2xvdWRGcm9udCBtYXkgaGF2ZSBjYWNoZWRcbiAgICAgIC8vIHRoYXQgc3RhbGUgcmVzcG9uc2UgYWZ0ZXIgYHJldmFsaWRhdGVUYWdgJ3MgaW52YWxpZGF0aW9uLCBzbyB0aGUga2V5J3NcbiAgICAgIC8vIHBhdGhzIGdvIG9uY2UgbW9yZSBub3cgdGhhdCBTMyBob2xkcyB0aGUgZnJlc2ggb25lLlxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zZXJ2ZWRTdGFsZS5oYXMoZGF0YSkgJiZcbiAgICAgICAgdGhpcy5zb2Z0UmV2YWxpZGF0ZWRLZXlzLmRlbGV0ZShjYWNoZUtleSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuczNLZXlUb0ludmFsaWRhdGlvblBhdGgoczNLZXkpO1xuICAgICAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuZGVidWcoYFNPRlQgUkVWQUxJREFUSU9OIFJFR0VORVJBVEVEOiAke2NhY2hlS2V5fWApO1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZUNsb3VkRnJvbnRQYXRocyhcbiAgICAgICAgICAgIGNkbkludmFsaWRhdGlvblBhdGhzKHJvdXRlLCB0aGlzLmNsb3VkRnJvbnRDb25maWcuYmFzZVBhdGgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgdGFnLXRvLWNhY2hlLWtleSBtYXBwaW5ncyBpbiBEeW5hbW9EQiBmb3IgcmV2YWxpZGF0aW9uXG4gICAgICBpZiAodGFncy5sZW5ndGggPiAwICYmIHRoaXMubWFwc1RhZ3NUb1BhdGhzKSB7XG4gICAgICAgIHRoaXMuZGVidWcoYFNUT1JJTkcgVEFHUzogJHtjYWNoZUtleX0gLT4gWyR7dGFncy5qb2luKFwiLCBcIil9XWApO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JlRHluYW1vREJUYWdNYXBwaW5ncyhzM0tleSwgdGFncyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzdG9yaW5nIGNhY2hlIHRvIFMzOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV2YWxpZGF0ZVRhZyhcbiAgICB0YWc6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIGR1cmF0aW9ucz86IFJldmFsaWRhdGVEdXJhdGlvbnMsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5pc0FycmF5KHRhZykgPyB0YWcgOiBbdGFnXTtcbiAgICB0aGlzLmRlYnVnKGBSRVZBTElEQVRJTkcgVEFHUzogWyR7dGFncy5qb2luKFwiLCBcIil9XWApO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy50YWJsZU5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWNvcmQgdGhlIHJldmFsaWRhdGlvbiBhZ2FpbnN0IGVhY2ggdGFnIGl0c2VsZiwgbm90IG9ubHkgYWdhaW5zdCB0aGVcbiAgICAvLyBjYWNoZSBrZXlzIGFscmVhZHkgbWFwcGVkIHRvIGl0OiBgY2hlY2tJZlJldmFsaWRhdGVkYCByZWFkcyB0aGVzZSBtYXJrZXJcbiAgICAvLyByb3dzLCBhbmQgYSBidWlsZC10aW1lIHByZXJlbmRlciBoYXMgbm8gbWFwcGluZyByb3dzIGF0IGFsbC5cbiAgICBjb25zdCByZWNvcmRlZCA9IGF3YWl0IHRoaXMudGFncy51cGRhdGUodGFncywgZHVyYXRpb25zKTtcblxuICAgIGlmICghdGhpcy5tYXBzVGFnc1RvUGF0aHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGJhc2VQYXRoIH0gPSB0aGlzLmNsb3VkRnJvbnRDb25maWc7XG4gICAgaWYgKCFyZWNvcmRlZCkge1xuICAgICAgLy8gT3RoZXIgaW5zdGFuY2VzIG1heSBuZXZlciBsZWFybiBvZiB0aGlzIHJldmFsaWRhdGlvbiwgc28gbm8gcGF0aCBsaXN0XG4gICAgICAvLyBpcyBlbm91Z2g6IGRyb3AgdGhlIHdob2xlIGFwcCBmcm9tIENsb3VkRnJvbnQgcmF0aGVyIHRoYW4gc2VydmUgc3RhbGVcbiAgICAgIC8vIHBhZ2VzIHVudGlsIHRoZWlyIFRUTC5cbiAgICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZUNsb3VkRnJvbnRQYXRocyh3aG9sZUFwcEludmFsaWRhdGlvblBhdGhzKGJhc2VQYXRoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0dGxlZCByYXRoZXIgdGhhbiBgYWxsYDogb25lIHRhZydzIHRocm90dGxlZCBRdWVyeSBtdXN0IG5vdCBkcm9wIHRoZVxuICAgIC8vIENsb3VkRnJvbnQgcGF0aHMgZXZlcnkgb3RoZXIgdGFnIHJlc29sdmVkLlxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0YWdzLm1hcCgodCkgPT4gdGhpcy50YWdSb3V0ZXModCkpLFxuICAgICk7XG4gICAgY29uc3Qgcm91dGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCB3aG9sZUFwcCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlYWRpbmcgdGFnIG1hcHBpbmdzOlwiLCByZXN1bHQucmVhc29uKTtcbiAgICAgICAgLy8gVGhlIHRhZydzIGVudHJpZXMgYXJlIHJldmFsaWRhdGVkIGF0IHRoZSBvcmlnaW4gd2hpbGUgbm90aGluZyBuYW1lc1xuICAgICAgICAvLyB0aGVpciBDbG91ZEZyb250IHBhdGhzLiBUaGUgc2FtZSBhbnN3ZXIgYXMgYSB0YWcgY3V0IHNob3J0IGJ5XG4gICAgICAgIC8vIGBNQVhfVEFHX1FVRVJZX1BBR0VTYDogdGhlIHdob2xlIGFwcCwgbmV2ZXIgYSBzdGFsZSBwYWdlLlxuICAgICAgICB3aG9sZUFwcCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcm91dGVzLnB1c2goLi4ucmVzdWx0LnZhbHVlLnJvdXRlcyk7XG4gICAgICB3aG9sZUFwcCB8fD0gcmVzdWx0LnZhbHVlLnRydW5jYXRlZDtcbiAgICB9XG5cbiAgICAvLyBJbnZhbGlkYXRlIHRoZSBDRE4gZWRnZSBjYWNoZSBzbyBDbG91ZEZyb250LWZyb250ZWQgZGVwbG95bWVudHMgZG9uJ3RcbiAgICAvLyBrZWVwIHNlcnZpbmcgc3RhbGUgcmVzcG9uc2VzIHVudGlsIHRoZSBjYWNoZSBwb2xpY3kncyBUVEwgbmF0dXJhbGx5XG4gICAgLy8gZXhwaXJlcy4gT25lIHJlcXVlc3QgZm9yIGV2ZXJ5IHRhZyBhdCBvbmNlOiBzZWVcbiAgICAvLyBgTUFYX1dJTERDQVJEX1BBVEhTX1BFUl9JTlZBTElEQVRJT05gIGZvciB3aHkgbmV2ZXIgc2V2ZXJhbC5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVDbG91ZEZyb250UGF0aHMoXG4gICAgICB3aG9sZUFwcFxuICAgICAgICA/IHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMoYmFzZVBhdGgpXG4gICAgICAgIDogcm91dGVzLmZsYXRNYXAoKHJvdXRlKSA9PiBjZG5JbnZhbGlkYXRpb25QYXRocyhyb3V0ZSwgYmFzZVBhdGgpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByb3V0ZXMgQ2xvdWRGcm9udCBjb3VsZCBiZSBob2xkaW5nIGEgcmVzcG9uc2UgZm9yIGB0YWdgIHVuZGVyIC1cbiAgICogYHRydW5jYXRlZGAgd2hlbiB0aGV5IGNvdWxkIG5vdCBhbGwgYmUgbmFtZWQ6IG1vcmUgbWFwcGluZyByb3dzIHRoYW5cbiAgICoge0BsaW5rIE1BWF9UQUdfUVVFUllfUEFHRVN9LCBvciBubyBidWlsZCB0YWcgbWFuaWZlc3QgdG8gcmVhZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdGFnUm91dGVzKFxuICAgIHRhZzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgcm91dGVzOiBzdHJpbmdbXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBza1ByZWZpeCA9IHRoaXMudGFnTWFwcGluZ1ByZWZpeCh0YWcpO1xuICAgIGNvbnN0IFt7IGl0ZW1zLCB0cnVuY2F0ZWQgfSwgYnVpbGRUYWdzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMucXVlcnlUYWdNYXBwaW5ncyh0YWcsIHNrUHJlZml4KSxcbiAgICAgIHRoaXMuYnVpbGRUYWdNYW5pZmVzdCgpLFxuICAgIF0pO1xuICAgIC8vIEV4dHJhY3QgUzMga2V5cyBmcm9tIHNvcnQga2V5cyAoZm9ybWF0OiBcInRhZyNzM0tleVwiKS4gU3BsaXQgYXQgdGhlIHRhZydzXG4gICAgLy8gb3duIGxlbmd0aCByYXRoZXIgdGhhbiBhdCB0aGUgZmlyc3QgXCIjXCI6IGEgdGFnIGlzIGFwcC1kZWZpbmVkIGFuZCBtYXlcbiAgICAvLyBjb250YWluIG9uZSwgYW5kIGByZXZhbGlkYXRlVGFnKFwidXNlciM0MlwiKWAgdGhlbiB5aWVsZGVkXG4gICAgLy8gXCI0MiM8YnVpbGRJZD4vYWNjb3VudC5qc29uXCIg4oCUIHdob3NlIGludmFsaWRhdGlvbiBwYXRoXG4gICAgLy8gKFwiLzQyIzxidWlsZElkPi9hY2NvdW50XCIpIG5hbWVzIG5vdGhpbmcgQ2xvdWRGcm9udCBjYWNoZWQsIHNvIHRoZSBlZGdlXG4gICAgLy8ga2VwdCBzZXJ2aW5nIHRoZSBzdGFsZSBwYWdlLlxuICAgIC8vXG4gICAgLy8gVGhlIHNhbWUgYCNgIG1ha2VzIGBiZWdpbnNfd2l0aChzaywgXCJ1c2VyI1wiKWAgbWF0Y2ggcm93cyB0aGF0IGFyZSBub3RcbiAgICAvLyBgdXNlcmAncyBhdCBhbGw6IHRoZSBtYXJrZXIgcm93IG9mIHRhZyBgdXNlciM0MmAgKHNrIGB1c2VyIzQyYCkgYW5kIGV2ZXJ5XG4gICAgLy8gbWFwcGluZyByb3cgb2YgaXQgKGB1c2VyIzQyIzxidWlsZElkPi/igKZgKS4gV2hhdCBpcyBsZWZ0IGFmdGVyIHRoZSBwcmVmaXhcbiAgICAvLyBpcyBhbiBTMyBrZXkgb25seSBpZiBpdCBzdGFydHMgd2l0aCB0aGUgYnVpbGQncyBvd24gcHJlZml4LCB3aGljaCBpcyBob3dcbiAgICAvLyBgYnVpbGRTM0tleWAgd3JpdGVzIGV2ZXJ5IG9uZS5cbiAgICAvL1xuICAgIC8vIEEgcm93IHdob3NlIGtleSB3b3VsZCBub3QgZml0IGEgc29ydCBrZXkgaGFzIGl0IGhhc2hlZCB0aGVyZSwgYW5kIGV2ZXJ5XG4gICAgLy8gcm93IGNhcnJpZXMgaXQgaW4gYHMzS2V5YCAocm93cyB3cml0dGVuIGJlZm9yZSB0aGF0IGF0dHJpYnV0ZSBmYWxsIGJhY2tcbiAgICAvLyB0byB0aGUgc29ydCBrZXkpOiBzZWUgYHRhZ01hcHBpbmdTb3J0S2V5YC4gQW4gZW1wdHkgcmVtYWluZGVyIGlzIG5ldmVyIGFcbiAgICAvLyBtYXBwaW5nIHJvdzogaXQgaXMgdGhlIG1hcmtlciByb3cgb2YgYSB0YWcgb25lIGAjYCBsb25nZXIuXG4gICAgY29uc3QgcHJlZml4TGVuZ3RoID0gc2tQcmVmaXgubGVuZ3RoO1xuICAgIGNvbnN0IGtleVByZWZpeCA9IHRoaXMuY29uZmlnLmJ1aWxkSWQgPyBgJHt0aGlzLmNvbmZpZy5idWlsZElkfS9gIDogXCJcIjtcbiAgICBjb25zdCBzM0tleXMgPSBpdGVtcy5mbGF0TWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCByZXN0ID0gaXRlbS5zaz8uUz8uc2xpY2UocHJlZml4TGVuZ3RoKTtcbiAgICAgIHJldHVybiByZXN0ICYmIHJlc3Quc3RhcnRzV2l0aChrZXlQcmVmaXgpID8gW2l0ZW0uczNLZXk/LlMgPz8gcmVzdF0gOiBbXTtcbiAgICB9KTtcbiAgICAvLyBUaGUgYnVpbGQtdGltZSBwcmVyZW5kZXJzIGNhcnJ5aW5nIHRoZSB0YWcsIHdoaWNoIG5vIGBzZXRgIHdyb3RlIGEgcm93XG4gICAgLy8gZm9yLlxuICAgIGZvciAoY29uc3QgY2FjaGVLZXkgb2YgYnVpbGRUYWdzPy5nZXQodGFnKSA/PyBbXSkge1xuICAgICAgczNLZXlzLnB1c2goYnVpbGRTM0tleSh0aGlzLmNvbmZpZy5idWlsZElkLCBjYWNoZUtleSkpO1xuICAgIH1cblxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgVEFHICR7dGFnfTogRm91bmQgJHtzM0tleXMubGVuZ3RofSBjYWNoZSBlbnRyaWVzIHRvIGludmFsaWRhdGVgLFxuICAgICk7XG5cbiAgICAvLyBUaGUgbWFwcGluZyByb3dzIHRoZW1zZWx2ZXMgYXJlIGRlbGliZXJhdGVseSBsZWZ0IGFsb25lLiBTdGFtcGluZ1xuICAgIC8vIGByZXZhbGlkYXRlZEF0YCBvbiBlYWNoIGB0YWcjY2FjaGVLZXlgIHJvdyBpcyB3aGF0IHRoaXMgdXNlZCB0byBkbywgYW5kXG4gICAgLy8gbm90aGluZyBoYXMgcmVhZCB0aGF0IGF0dHJpYnV0ZSBzaW5jZSBgY2hlY2tJZlJldmFsaWRhdGVkYCBiZWdhbiByZWFkaW5nXG4gICAgLy8gdGhlIGJhcmUtdGFnIG1hcmtlciByb3cgd3JpdHRlbiBhYm92ZSDigJQgc28gdGhlIHdyaXRlcyB3ZXJlIGRlYWQsIGFuZCB0aGV5XG4gICAgLy8gd2VyZSBkZWFkICppbiBmcm9udCBvZiogdGhlIGludmFsaWRhdGlvbi4gT25lIHRocm90dGxlZCBgVXBkYXRlSXRlbWBcbiAgICAvLyByZWplY3RlZCB0aGUgYmF0Y2gsIHRoZSBDbG91ZEZyb250IGludmFsaWRhdGlvbiBuZXZlciByYW4sIGFuZCB0aGUgb25seVxuICAgIC8vIHRyYWNlIHdhcyBhIGBjb25zb2xlLmVycm9yYCB3aGlsZSB0aGUgZWRnZSBrZXB0IHNlcnZpbmcgdGhlIHN0YWxlIHBhZ2UuXG4gICAgLy9cbiAgICAvLyBEZWxpYmVyYXRlbHkgbm90IGRlbGV0aW5nIHRoZSB0YWcncyBTMyBvYmplY3RzIGVpdGhlci4gVGhlIG1hcmtlciByb3dcbiAgICAvLyBhYm92ZSBpcyB3aGF0IGludmFsaWRhdGVzIHRoZW06IGBnZXRgIGNvbXBhcmVzIGl0IGFnYWluc3QgZWFjaCBlbnRyeSdzXG4gICAgLy8gb3duIGBsYXN0TW9kaWZpZWRgIGFuZCBoYW5kcyB0aGUgZW50cnkgYmFjayBleHBpcmVkLCB3aGljaCBpcyB0aGUgc2lnbmFsXG4gICAgLy8gdGhhdCBtYWtlcyBOZXh0LmpzIHJlLXJlbmRlciAqdGhpcyogcm91dGUgYW5kIHN0b3JlIHRoZSByZXN1bHQgKHNlZVxuICAgIC8vIGBFWFBJUkVEX0xBU1RfTU9ESUZJRURgKS4gRGVsZXRpbmcgdGhlIG9iamVjdCBpbnN0ZWFkIHR1cm5lZCB0aGUgbmV4dFxuICAgIC8vIHJlcXVlc3QgaW50byBhIGhhcmQgbWlzcywgYW5kIGEgaGFyZCBtaXNzIG9uIGEgUFBSIHJvdXRlIGlzIGFuc3dlcmVkIGZyb21cbiAgICAvLyB0aGUgcm91dGUncyBmYWxsYmFjayBzaGVsbCDigJQgdW5jYWNoZWFibGUsIGFuZCBuZXZlciB1cGdyYWRlZCBiYWNrIGludG8gYVxuICAgIC8vIGNvbmNyZXRlIGVudHJ5LCBzbyBvbmUgYHJldmFsaWRhdGVUYWdgIGxlZnQgdGhlIHBhZ2UgcmVzdW1pbmdcbiAgICAvLyBkeW5hbWljYWxseSBmb3IgZ29vZC5cbiAgICBjb25zdCByb3V0ZXMgPSBzM0tleXNcbiAgICAgIC5tYXAoKHMzS2V5KSA9PiB0aGlzLnMzS2V5VG9JbnZhbGlkYXRpb25QYXRoKHMzS2V5KSlcbiAgICAgIC5maWx0ZXIoKHJvdXRlKTogcm91dGUgaXMgc3RyaW5nID0+IHJvdXRlICE9PSB1bmRlZmluZWQpO1xuICAgIC8vIEEgYHJldmFsaWRhdGVQYXRoYCBuYW1lcyBpdHMgcGF0aCBpbiB0aGUgdGFnIGl0c2VsZiwgd2hpY2ggaXMgdGhlIG9ubHlcbiAgICAvLyB3YXkgdG8gcmVhY2ggYSBidWlsZC10aW1lIHByZXJlbmRlcidzIENETiBjb3B5IHdoZW4gaXQgaGFzIG5vIG1hcHBpbmdcbiAgICAvLyByb3cuXG4gICAgcm91dGVzLnB1c2goLi4uaW1wbGljaXRUYWdQYXRocyh0YWcpKTtcbiAgICByZXR1cm4geyByb3V0ZXMsIHRydW5jYXRlZDogdHJ1bmNhdGVkIHx8ICFidWlsZFRhZ3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQtdGltZSBwcmVyZW5kZXJzJyBjYWNoZSBrZXlzIGJ5IHRhZyAoe0BsaW5rIElOSVRfQ0FDSEVfVEFHX01BTklGRVNUfSksXG4gICAqIHJlYWQgZnJvbSB0aGUgY2FjaGUgYnVja2V0IG9uY2UgcGVyIGluc3RhbmNlLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoYXRcbiAgICogZmFpbGVkLCB0byBiZSByZWFkIGFnYWluIG5leHQgdGltZS4gQSBwcmVyZW5kZXIgaXMgd3JpdHRlbiBieSB0aGUgYWRhcHRlcixcbiAgICogbmV2ZXIgdGhyb3VnaCBgc2V0YCwgc28gdGhpcyBpcyB0aGUgb25seSByZWNvcmQgb2Ygd2hpY2ggdGFncyBuYW1lIGl0c1xuICAgKiBDbG91ZEZyb250IHBhdGhzLCBhbmQgaXQgaXMgc2VydmVkIHdpdGggYSB5ZWFyLWxvbmcgYHMtbWF4YWdlYC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUYWdNYW5pZmVzdCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZD4ge1xuICAgIHRoaXMuYnVpbGRUYWdzID8/PSB0aGlzLmJ1Y2tldFxuICAgICAgLmdldChgJHt0aGlzLmNvbmZpZy5idWlsZElkfS8ke0lOSVRfQ0FDSEVfVEFHX01BTklGRVNUfWApXG4gICAgICAvLyBOb25lIGlzIG5vcm1hbDogb25seSB0YWdnZWQgcHJlcmVuZGVycyB3cml0ZSBvbmUuXG4gICAgICAudGhlbigob2JqZWN0KSA9PiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKEpTT04ucGFyc2Uob2JqZWN0ID8/IFwie31cIikpKSk7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRUYWdzLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5idWlsZFRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgcmVhZCB0aGUgYnVpbGQncyB0YWcgbWFuaWZlc3Q6XCIsIGVycm9yKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgbWFwcGluZyByb3cgZm9yIGB0YWdgIC0gdGhvc2Ugd2hvc2Ugc29ydCBrZXkgc3RhcnRzIHdpdGhcbiAgICogYHNrUHJlZml4YCwgaXRzIHtAbGluayB0YWdNYXBwaW5nUHJlZml4fSAtIGZvbGxvd2luZyBgTGFzdEV2YWx1YXRlZEtleWAsIGFuZCB3aGV0aGVyXG4gICAqIHtAbGluayBNQVhfVEFHX1FVRVJZX1BBR0VTfSBjdXQgdGhlIHdhbGsgc2hvcnQuXG4gICAqXG4gICAqIER5bmFtb0RCIGNhcHMgYSBRdWVyeSBhdCAxIE1CIG9mIGl0ZW1zIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgbWF0Y2gsIGFuZFxuICAgKiB0aGVyZSBpcyBvbmUgcm93IHBlciB0YWdnZWQgZW50cnkgYSBydW50aW1lIGBzZXRgIHdyb3RlLCBzbyBhIGxhcmdlIHNpdGVcbiAgICogcGFzc2VzIDEgTUIgb24gYSBjb21tb24gdGFnLiBTdG9wcGluZyBhdCB0aGVcbiAgICogZmlyc3QgcGFnZSBpbnZhbGlkYXRlcyBvbmx5IHRoYXQgcGFnZSdzIGVudHJpZXMgd2hpbGUgc3RpbGwgcmVwb3J0aW5nXG4gICAqIHN1Y2Nlc3MsIHdoaWNoIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gcmV2YWxpZGF0aW9uIGhhdmluZyB3b3JrZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHF1ZXJ5VGFnTWFwcGluZ3MoXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgc2tQcmVmaXg6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT5bXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBpdGVtczogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+W10gPSBbXTtcbiAgICBsZXQgZXhjbHVzaXZlU3RhcnRLZXk6IFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcGFnZXMgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmR5bmFtb0NsaWVudC5zZW5kKFxuICAgICAgICBuZXcgUXVlcnlDb21tYW5kKHtcbiAgICAgICAgICBUYWJsZU5hbWU6IHRoaXMuY29uZmlnLnRhYmxlTmFtZSxcbiAgICAgICAgICBLZXlDb25kaXRpb25FeHByZXNzaW9uOiBcInBrID0gOnBrIEFORCBiZWdpbnNfd2l0aChzaywgOnNrUHJlZml4KVwiLFxuICAgICAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgIFwiOnBrXCI6IHsgUzogdGhpcy5jb25maWcuYnVpbGRJZCB9LFxuICAgICAgICAgICAgXCI6c2tQcmVmaXhcIjogeyBTOiBza1ByZWZpeCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgRXhjbHVzaXZlU3RhcnRLZXk6IGV4Y2x1c2l2ZVN0YXJ0S2V5LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBpdGVtcy5wdXNoKC4uLihyZXNwb25zZS5JdGVtcyA/PyBbXSkpO1xuICAgICAgZXhjbHVzaXZlU3RhcnRLZXkgPSByZXNwb25zZS5MYXN0RXZhbHVhdGVkS2V5O1xuICAgICAgcGFnZXMrKztcbiAgICB9IHdoaWxlIChleGNsdXNpdmVTdGFydEtleSAmJiBwYWdlcyA8IE1BWF9UQUdfUVVFUllfUEFHRVMpO1xuXG4gICAgY29uc3QgdHJ1bmNhdGVkID0gZXhjbHVzaXZlU3RhcnRLZXkgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAodHJ1bmNhdGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTdG9wcGVkIHBhZ2luYXRpbmcgdGFnIFwiJHt0YWd9XCIgYWZ0ZXIgJHtwYWdlc30gcGFnZXMgYCArXG4gICAgICAgICAgYCgke2l0ZW1zLmxlbmd0aH0gZW50cmllcyk7IGludmFsaWRhdGluZyB0aGUgd2hvbGUgYXBwIGluc3RlYWQuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IGl0ZW1zLCB0cnVuY2F0ZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnNlcyBgYnVpbGRTM0tleWAgdG8gcmVjb3ZlciB0aGUgcm91dGUgdGhlIHJlc3BvbnNlIHdhcyBjYWNoZWQgZm9yLCBmb3JcbiAgICoge0BsaW5rIGNkbkludmFsaWRhdGlvblBhdGhzfSB0byB0dXJuIGludG8gdGhlIFVSSXMgQ2xvdWRGcm9udCBob2xkcyBpdCB1bmRlciwgb3JcbiAgICogYHVuZGVmaW5lZGAgZm9yIGEga2V5IHRoYXQgbmFtZXMgbm8gY2FjaGVkIFVSSS5cbiAgICpcbiAgICogVHdvIGtpbmRzIG9mIG1hcHBpbmcgcm93IGRvIG5vdDogYSBkeW5hbWljIHJvdXRlIHRlbXBsYXRlIChgYmxvZy9bc2x1Z10uanNvbmAsXG4gICAqIHdoaWNoIHRoZSBhZGFwdGVyJ3Mgc2VlZGVkIGVudHJpZXMgaW5jbHVkZSksIGFuZCBhIGZldGNoLWNhY2hlIGVudHJ5LCB3aG9zZVxuICAgKiBrZXkgaXMgYW4gb3BhcXVlIGhhc2ggcmF0aGVyIHRoYW4gYSByb3V0ZS4gQm90aCB3b3VsZCBpbnZhbGlkYXRlIGEgVVJJIHRoYXRcbiAgICogY2Fubm90IGV4aXN0LCBhbmQgZWFjaCBvbmUgY29zdHMgb25lIG9mIHRoZSBmaWZ0ZWVuIHdpbGRjYXJkIHBhdGhzIGFuXG4gICAqIGludmFsaWRhdGlvbiBtYXkgY2Fycnkg4oCUIHNvIHRoZXkgYXJlIGRyb3BwZWQgaGVyZSByYXRoZXIgdGhhbiBjcm93ZGluZyBvdXRcbiAgICogdGhlIHJlYWwgb25lcy5cbiAgICovXG4gIHByaXZhdGUgczNLZXlUb0ludmFsaWRhdGlvblBhdGgoczNLZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcHJlZml4ID0gYCR7dGhpcy5jb25maWcuYnVpbGRJZH0vYDtcbiAgICBjb25zdCB3aXRob3V0UHJlZml4ID0gczNLZXkuc3RhcnRzV2l0aChwcmVmaXgpXG4gICAgICA/IHMzS2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpXG4gICAgICA6IHMzS2V5O1xuICAgIGNvbnN0IHdpdGhvdXRTdWZmaXggPSB3aXRob3V0UHJlZml4LmVuZHNXaXRoKFwiLmpzb25cIilcbiAgICAgID8gd2l0aG91dFByZWZpeC5zbGljZSgwLCAtXCIuanNvblwiLmxlbmd0aClcbiAgICAgIDogd2l0aG91dFByZWZpeDtcblxuICAgIGlmICh3aXRob3V0U3VmZml4LmluY2x1ZGVzKFwiW1wiKSB8fCBpc0ZldGNoQ2FjaGVLZXkod2l0aG91dFN1ZmZpeCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIG5leHQgPj0gMTYuMy44OiBgcm91dGUtY2FjaGUvPGtpbmQ+LzxoYXNoPi8kPHBhdGhuYW1lPmAsIHRoZSBwYXRobmFtZVxuICAgIC8vIHRocm91Z2ggYG5vcm1hbGl6ZVBhZ2VQYXRoYC5cbiAgICBjb25zdCByb3V0ZUNhY2hlS2V5ID0gUk9VVEVfQ0FDSEVfS0VZX1BSRUZJWC5leGVjKHdpdGhvdXRTdWZmaXgpO1xuICAgIGlmIChyb3V0ZUNhY2hlS2V5KSB7XG4gICAgICByZXR1cm4gZGVub3JtYWxpemVQYWdlUGF0aCh3aXRob3V0U3VmZml4LnNsaWNlKHJvdXRlQ2FjaGVLZXlbMF0ubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiB3aXRob3V0U3VmZml4ID09PSBcImluZGV4XCIgPyBcIi9cIiA6IGAvJHt3aXRob3V0U3VmZml4fWA7XG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZSBgcGF0aHNgIGluIGEgc2luZ2xlIHJlcXVlc3QsIG9yIHRoZSB3aG9sZSBhcHBcbiAgICogKHtAbGluayB3aG9sZUFwcEludmFsaWRhdGlvblBhdGhzfSkgd2hlbiB0aGV5IHdvdWxkIG5vdCBmaXQgaW4gb25lLiBTZWVcbiAgICoge0BsaW5rIE1BWF9XSUxEQ0FSRF9QQVRIU19QRVJfSU5WQUxJREFUSU9OfS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW52YWxpZGF0ZUNsb3VkRnJvbnRQYXRocyhwYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgYmF0Y2ggPSBBcnJheS5mcm9tKG5ldyBTZXQocGF0aHMpKTtcbiAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uSWQgPSBhd2FpdCB0aGlzLmdldERpc3RyaWJ1dGlvbklkKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgcmVzb2x2ZSB0aGUgZGlzdHJpYnV0aW9uIHRvIGludmFsaWRhdGU6XCIsIGVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIGlmICghZGlzdHJpYnV0aW9uSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aWxkY2FyZHMgPSBiYXRjaC5maWx0ZXIoaXNXaWxkY2FyZFBhdGgpLmxlbmd0aDtcbiAgICBpZiAoXG4gICAgICB3aWxkY2FyZHMgPiBNQVhfV0lMRENBUkRfUEFUSFNfUEVSX0lOVkFMSURBVElPTiB8fFxuICAgICAgYmF0Y2gubGVuZ3RoID4gTUFYX1BBVEhTX1BFUl9JTlZBTElEQVRJT05cbiAgICApIHtcbiAgICAgIGNvbnN0IHdob2xlQXBwID0gd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyhcbiAgICAgICAgdGhpcy5jbG91ZEZyb250Q29uZmlnLmJhc2VQYXRoLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBDTE9VREZST05UIElOVkFMSURBVElPTjogJHtiYXRjaC5sZW5ndGh9IHBhdGhzICgke3dpbGRjYXJkc30gYCArXG4gICAgICAgICAgYHdpbGRjYXJkcykgZG8gbm90IGZpdCBvbmUgcmVxdWVzdCwgY29sbGFwc2luZyB0byBgICtcbiAgICAgICAgICBgWyR7d2hvbGVBcHAuam9pbihcIiwgXCIpfV1gLFxuICAgICAgKTtcbiAgICAgIGJhdGNoID0gd2hvbGVBcHA7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgQ0xPVURGUk9OVCBJTlZBTElEQVRJT046IFske2JhdGNoLmpvaW4oXCIsIFwiKX1dIG9uIGRpc3RyaWJ1dGlvbiAke2Rpc3RyaWJ1dGlvbklkfWAsXG4gICAgICApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jbG91ZEZyb250Q2xpZW50LnNlbmQoXG4gICAgICAgICAgbmV3IENyZWF0ZUludmFsaWRhdGlvbkNvbW1hbmQoe1xuICAgICAgICAgICAgRGlzdHJpYnV0aW9uSWQ6IGRpc3RyaWJ1dGlvbklkLFxuICAgICAgICAgICAgSW52YWxpZGF0aW9uQmF0Y2g6IHtcbiAgICAgICAgICAgICAgQ2FsbGVyUmVmZXJlbmNlOiByYW5kb21VVUlEKCksXG4gICAgICAgICAgICAgIFBhdGhzOiB7XG4gICAgICAgICAgICAgICAgUXVhbnRpdHk6IGJhdGNoLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBJdGVtczogYmF0Y2gsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNJbnZhbGlkYXRpb25RdW90YUVycm9yKGVycm9yKSAmJiBhdHRlbXB0IDwgSU5WQUxJREFUSU9OX1JFVFJJRVMpIHtcbiAgICAgICAgICAvLyBTZWUgYElOVkFMSURBVElPTl9SRVRSSUVTYC5cbiAgICAgICAgICBiYXRjaCA9IHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHModGhpcy5jbG91ZEZyb250Q29uZmlnLmJhc2VQYXRoKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSU5WQUxJREFUSU9OX1JFVFJZX0RFTEFZX01TICogMiAqKiBhdHRlbXB0KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbCAtIHRoZSBTMy9EeW5hbW9EQiBpbnZhbGlkYXRpb24gYWxyZWFkeSBzdWNjZWVkZWQsXG4gICAgICAgIC8vIGFuZCB0aGUgQ2xvdWRGcm9udCBjYWNoZSBwb2xpY3kgVFRMIHByb3ZpZGVzIGFuIGV2ZW50dWFsIGZhbGxiYWNrLlxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24gZm9yIFske2JhdGNoLmpvaW4oXCIsIFwiKX1dOmAsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpc3RyaWJ1dGlvbidzIHBoeXNpY2FsIElELCBmcm9tIHRoZSBlbnZpcm9ubWVudCBvciBlbHNlIFNTTSBQYXJhbWV0ZXJcbiAgICogU3RvcmUsIGNhY2hlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoaXMgaW5zdGFuY2UuIFNlZVxuICAgKiBgQ2xvdWRGcm9udEludmFsaWRhdGlvbkNvbmZpZ2AgZm9yIHdoeSBGdW5jdGlvbnMgbmVlZCB0aGUgaW5kaXJlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldERpc3RyaWJ1dGlvbklkKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhY2hlZERpc3RyaWJ1dGlvbklkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWREaXN0cmlidXRpb25JZDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2xvdWRGcm9udENvbmZpZy5kaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zc21DbGllbnQuc2VuZChcbiAgICAgIG5ldyBHZXRQYXJhbWV0ZXJDb21tYW5kKHtcbiAgICAgICAgTmFtZTogdGhpcy5jbG91ZEZyb250Q29uZmlnLmRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLmNhY2hlZERpc3RyaWJ1dGlvbklkID0gcmVzcG9uc2UuUGFyYW1ldGVyPy5WYWx1ZSB8fCBudWxsO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZERpc3RyaWJ1dGlvbklkO1xuICB9XG5cbiAgYXN5bmMgcmVzZXRSZXF1ZXN0Q2FjaGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVGhpcyBoYW5kbGVyIGRvZXNuJ3QgbWFpbnRhaW4gcmVxdWVzdC1sZXZlbCBjYWNoZSBzdGF0ZVxuICAgIC8vIFRoZSBhY3R1YWwgY2FjaGUgY2xlYXJpbmcgaXMgaGFuZGxlZCBieSB0aGUgbWVtb3J5IGNhY2hlIGhhbmRsZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZGVwbG95bWVudCBrZWVwcyBgdGFnI3MzS2V5YCBtYXBwaW5nIHJvd3MgYXQgYWxsLlxuICAgKlxuICAgKiBUaGVpciBvbmUgcmVhZGVyIGlzIGByZXZhbGlkYXRlVGFnYCdzIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uLCB3aGljaCBuZWVkc1xuICAgKiB0aGUgZW50cmllcycgcGF0aHMgLSB0YWcgcmV2YWxpZGF0aW9uIGl0c2VsZiBydW5zIG9uIHRoZSBiYXJlLXRhZyBtYXJrZXJcbiAgICogcm93cy4gQSBkZXBsb3ltZW50IHdpdGggbm8gZGlzdHJpYnV0aW9uICh0aGUgUmVnaW9uYWwgY29uc3RydWN0cykgd291bGQgcGF5XG4gICAqIGEgRHluYW1vREIgd3JpdGUgcGVyIHRhZyBvbiBldmVyeSBgc2V0YCwgYSBRdWVyeSBwZXIgYHJldmFsaWRhdGVUYWdgLCBhbmQgYW5cbiAgICogZXh0cmEgUzMgcmVhZCBiZWZvcmUgZXZlcnkgZGVsZXRlLCBmb3Igcm93cyBub3RoaW5nIGV2ZXIgcmVhZHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBtYXBzVGFnc1RvUGF0aHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5jb25maWcudGFibGVOYW1lKSAmJiB0aGlzLmludmFsaWRhdGVzQ2RuO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlcmUgaXMgYSBkaXN0cmlidXRpb24gdG8gaW52YWxpZGF0ZS4gKi9cbiAgcHJpdmF0ZSBnZXQgaW52YWxpZGF0ZXNDZG4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICB0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWQgfHxcbiAgICAgIHRoaXMuY2xvdWRGcm9udENvbmZpZy5kaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc29ydCBrZXkgb2YgYHRhZ2AncyBtYXBwaW5nIHJvdyBmb3IgYHMzS2V5YDogYDxwcmVmaXg+czNLZXlgLCBvciwgd2hlblxuICAgKiB0aGF0IHBhc3NlcyBEeW5hbW9EQidzIDEwMjQtYnl0ZSBzb3J0IGtleSBsaW1pdCwgYDxwcmVmaXg+PGJ1aWxkSWQ+LyM8c2hhMjU2PmAuXG4gICAqIEVpdGhlciB3YXkgdGhlIHJvdyBjYXJyaWVzIHRoZSBrZXkgaXRzZWxmIGluIGBzM0tleWAuIG5leHQgMTYuMy44J3NcbiAgICogcm91dGUtc2NvcGVkIGtleXMgYXJlIH44OCBieXRlcyBsb25nZXIgdGhhbiBhIHBhdGhuYW1lLCBlbm91Z2ggdG8gcHVzaCBhXG4gICAqIGxvbmcgdGFnIG9uIGEgbG9uZyBwYXRoIG92ZXIgLSBhbmQgYSByZWplY3RlZCBgUHV0SXRlbWAgbGVmdFxuICAgKiBgcmV2YWxpZGF0ZVRhZ2Agbm90aGluZyB0byBpbnZhbGlkYXRlLCBzbyBDbG91ZEZyb250IGtlcHQgdGhlIHN0YWxlIHBhZ2UuXG4gICAqIFRoZSBwcmVmaXggaXMge0BsaW5rIHRhZ01hcHBpbmdQcmVmaXh9J3MsIHdoaWNoIHtAbGluayBNQVhfVEFHX0JZVEVTfSBhbmRcbiAgICogdGhlIGJ1aWxkIElEJ3MgY2FwIGxlYXZlIHJvb20gZm9yIHRoZSBoYXNoZWQgZm9ybSBhZnRlci5cbiAgICovXG4gIHByaXZhdGUgdGFnTWFwcGluZ1NvcnRLZXkodGFnOiBzdHJpbmcsIHMzS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMudGFnTWFwcGluZ1ByZWZpeCh0YWcpO1xuICAgIGNvbnN0IHNrID0gYCR7cHJlZml4fSR7czNLZXl9YDtcbiAgICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgoc2spIDw9IE1BWF9TT1JUX0tFWV9CWVRFU1xuICAgICAgPyBza1xuICAgICAgOiBgJHtwcmVmaXh9JHt0aGlzLmNvbmZpZy5idWlsZElkfS8ke2hhc2hlZFRhZyhzM0tleSl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGV2ZXJ5IG1hcHBpbmcgcm93IG9mIGB0YWdgIHN0YXJ0cyB3aXRoLCBhbmQgc28gd2hhdFxuICAgKiB7QGxpbmsgcXVlcnlUYWdNYXBwaW5nc30gbWF0Y2hlczogYDxzb3J0S2V5VGFnKHRhZyk+I2AuXG4gICAqL1xuICBwcml2YXRlIHRhZ01hcHBpbmdQcmVmaXgodGFnOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtzb3J0S2V5VGFnKHRhZyl9I2A7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0b3JlRHluYW1vREJUYWdNYXBwaW5ncyhcbiAgICBzM0tleTogc3RyaW5nLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXBkYXRlUHJvbWlzZXMgPSB0YWdzLm1hcChhc3luYyAodGFnKSA9PiB7XG4gICAgICAgIGNvbnN0IHNrID0gdGhpcy50YWdNYXBwaW5nU29ydEtleSh0YWcsIHMzS2V5KTtcbiAgICAgICAgY29uc3QgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVJdGVtQ29tbWFuZCh7XG4gICAgICAgICAgVGFibGVOYW1lOiB0aGlzLmNvbmZpZy50YWJsZU5hbWUsXG4gICAgICAgICAgS2V5OiB7XG4gICAgICAgICAgICBwazogeyBTOiB0aGlzLmNvbmZpZy5idWlsZElkIH0sXG4gICAgICAgICAgICBzazogeyBTOiBzayB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGByZXZhbGlkYXRlZEF0YDogYSBtYXBwaW5nIHJvdyByZWNvcmRzIG9ubHkgdGhhdCBhblxuICAgICAgICAgIC8vIGVudHJ5IGNhcnJpZXMgdGhlIHRhZy4gU3RhbXBpbmcgaXQgYXQgd3JpdGUgdGltZSBtYWRlIGV2ZXJ5IHRhZ2dlZFxuICAgICAgICAgIC8vIGVudHJ5IGxvb2sgcmV2YWxpZGF0ZWQgb25lIG1pbGxpc2Vjb25kIGFmdGVyIGl0IHdhcyBzdG9yZWQg4oCUIHRoZVxuICAgICAgICAgIC8vIHJvdydzIHRpbWVzdGFtcCBpcyB0YWtlbiBhZnRlciB0aGUgZW50cnkncyBgbGFzdE1vZGlmaWVkYCDigJQgc29cbiAgICAgICAgICAvLyBgY2hlY2tJZlJldmFsaWRhdGVkYCBkZWxldGVkIGhlYWx0aHkgZW50cmllcyBhbmQgdGhlIHBhZ2VcbiAgICAgICAgICAvLyByZS1yZW5kZXJlZCBvbiBldmVyeSByZXF1ZXN0LlxuICAgICAgICAgIFVwZGF0ZUV4cHJlc3Npb246XG4gICAgICAgICAgICBcIlNFVCBjcmVhdGVkQXQgPSBpZl9ub3RfZXhpc3RzKGNyZWF0ZWRBdCwgOm5vdyksIHMzS2V5ID0gOnMzS2V5XCIsXG4gICAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgXCI6bm93XCI6IHsgTjogRGF0ZS5ub3coKS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICBcIjpzM0tleVwiOiB7IFM6IHMzS2V5IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5keW5hbW9DbGllbnQuc2VuZCh1cGRhdGVDb21tYW5kKTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh1cGRhdGVQcm9taXNlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzdG9yaW5nIER5bmFtb0RCIHRhZyBtYXBwaW5nczpcIiwgZXJyb3IpO1xuICAgICAgLy8gRG9uJ3QgdGhyb3cgLSBjYWNoZSBzdG9yYWdlIHNob3VsZCBjb250aW51ZSBldmVuIGlmIHRhZyBtYXBwaW5nIGZhaWxzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgdGhlIGB0YWcjczNLZXlgIG1hcHBpbmcgcm93cyBmb3IgYW4gZW50cnkgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgKlxuICAgKiBUaGUgY291bnRlcnBhcnQgb2Yge0BsaW5rIHN0b3JlRHluYW1vREJUYWdNYXBwaW5nc30sIGFuZCB0aGUgcmVhc29uIGl0c1xuICAgKiBjYWxsZXIgaGFzIHRvIGtub3cgdGhlIGVudHJ5J3MgdGFnczogYSBtYXBwaW5nIHJvdydzIHNvcnQga2V5IHN0YXJ0cyB3aXRoXG4gICAqIHRoZSB0YWcsIHNvIHRoZSByb3dzIGJlbG9uZ2luZyB0byBvbmUgY2FjaGUga2V5IGNhbm5vdCBiZSBxdWVyaWVkIGZvciAtIG9ubHlcbiAgICogYSBmdWxsIHNjYW4gb2YgdGhlIGJ1aWxkJ3MgcGFydGl0aW9uIHdvdWxkIGZpbmQgdGhlbS5cbiAgICpcbiAgICogTGVmdCBiZWhpbmQsIGEgcm93IHN0aWxsIHJlc29sdmVzIHRvIGEgY2FjaGUga2V5IG9uIHRoZSBuZXh0XG4gICAqIGByZXZhbGlkYXRlVGFnYCwgd2hpY2ggc3BlbmRzIG9uZSBvZiBDbG91ZEZyb250J3MgZmlmdGVlbiB3aWxkY2FyZCBwYXRoc1xuICAgKiBpbnZhbGlkYXRpbmcgYSBVUkkgd2hvc2UgZW50cnkgd2FzIGRlbGV0ZWQgLSBjcm93ZGluZyBvdXQgdGhlIHBhdGhzIHRoYXQgZG9cbiAgICogbmVlZCBpdCwgYW5kIHBhc3Qge0BsaW5rIE1BWF9XSUxEQ0FSRF9QQVRIU19QRVJfSU5WQUxJREFUSU9OfSBjb2xsYXBzaW5nIHRoZVxuICAgKiB3aG9sZSBhcHAgaW50byBvbmUgd2lsZGNhcmQuIFRoZSByb3dzIGFsc28gY291bnQgYWdhaW5zdCB0aGUgMSBNQiBhIHRhZydzIFF1ZXJ5IHJldHVybnMsIHNvXG4gICAqIGVub3VnaCBvZiB0aGVtIHB1c2ggbGl2ZSBlbnRyaWVzIG9udG8gYSBwYWdlXG4gICAqIHtAbGluayBNQVhfVEFHX1FVRVJZX1BBR0VTfSBtYXkgbm90IHJlYWNoLlxuICAgKlxuICAgKiBPbmx5IHRoZSBtYXBwaW5nIHJvd3M6IHRoZSBiYXJlLWB0YWdgIG1hcmtlciByb3cgYHJldmFsaWRhdGVUYWdgXG4gICAqIHdyaXRlcyBiZWxvbmdzIHRvIHRoZSB0YWcgcmF0aGVyIHRoYW4gdG8gYW55IGVudHJ5LCBhbmQgYGNoZWNrSWZSZXZhbGlkYXRlZGBcbiAgICogcmVhZHMgaXQgZm9yIGV2ZXJ5ICpvdGhlciogZW50cnkgY2FycnlpbmcgdGhhdCB0YWcuXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBubyBDbG91ZEZyb250IGludmFsaWRhdGlvbiBmb3IgdGhlIGRlbGV0ZWQgcGF0aC4gVGhlIGVkZ2UgY29weVxuICAgKiBkb2VzIG91dGxpdmUgdGhlIG9iamVjdCwgYnV0IHRoaXMgcnVucyBvbiBldmVyeSByZXZhbGlkYXRlZCBgZmV0Y2hgIGVudHJ5IGFzXG4gICAqIHdlbGwsIHdoZXJlIHRoZSBrZXkgbmFtZXMgbm8gVVJJLCBhbmQgYW4gaW52YWxpZGF0aW9uIHJlcXVlc3QgcGVyIGRlbGV0ZWRcbiAgICogZW50cnkgaXMgYSBjb3N0IHRoZSBUVEwgYWxyZWFkeSBib3VuZHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlbGV0ZUR5bmFtb0RCVGFnTWFwcGluZ3MoXG4gICAgczNLZXk6IHN0cmluZyxcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm1hcHNUYWdzVG9QYXRocyB8fCB0YWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIC8vIEEgcGFnZSdzIHRhZ3MgY2FuIHJlcGVhdCAtIGBjdHgudGFnc2AgYW5kIHRoZSByZW5kZXIncyBoZWFkZXIgYXJlIGJvdGhcbiAgICAgICAgLy8gcmVhZCAtIGFuZCBvbmUgZGVsZXRlIHBlciB0YWcgaXMgZW5vdWdoLlxuICAgICAgICBBcnJheS5mcm9tKG5ldyBTZXQodGFncykpLm1hcChhc3luYyAodGFnKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5keW5hbW9DbGllbnQuc2VuZChcbiAgICAgICAgICAgIG5ldyBEZWxldGVJdGVtQ29tbWFuZCh7XG4gICAgICAgICAgICAgIFRhYmxlTmFtZTogdGhpcy5jb25maWcudGFibGVOYW1lLFxuICAgICAgICAgICAgICBLZXk6IHtcbiAgICAgICAgICAgICAgICBwazogeyBTOiB0aGlzLmNvbmZpZy5idWlsZElkIH0sXG4gICAgICAgICAgICAgICAgc2s6IHsgUzogdGhpcy50YWdNYXBwaW5nU29ydEtleSh0YWcsIHMzS2V5KSB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgdGhpcy5kZWJ1ZyhgREVMRVRFRCBUQUcgTUFQUElOR1M6ICR7czNLZXl9IC0+IFske3RhZ3Muam9pbihcIiwgXCIpfV1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGJ1dCBkb24ndCBmYWlsOiB0aGUgZW50cnkgaXRzZWxmIGlzIGFscmVhZHkgZ29uZSwgYW5kIGEgc3RhbGVcbiAgICAgIC8vIG1hcHBpbmcgcm93IGNvc3RzIGFuIGludmFsaWRhdGlvbiBwYXRoIHJhdGhlciB0aGFuIGEgd3JvbmcgcmVzcG9uc2UuXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZGVsZXRpbmcgRHluYW1vREIgdGFnIG1hcHBpbmdzOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIGFuIGVudHJ5IGFib3V0IHRvIGJlIGRlbGV0ZWQgd2FzIHN0b3JlZCB3aXRoLlxuICAgKlxuICAgKiBgY3R4YCBjYXJyaWVzIHRoZW0gZm9yIGEgYGZldGNoYCBkZWxldGUsIGJ1dCBhIHJlc3BvbnNlIGRlbGV0ZSBhcnJpdmVzIGFzXG4gICAqIGB7IGNhY2hlQ29udHJvbCwgaXNSb3V0ZVBQUkVuYWJsZWQsIGlzRmFsbGJhY2sgfWAgLSBgUmVzcG9uc2VDYWNoZS5zZXRgXG4gICAqIGJ1aWxkcyBpdCB0aGF0IHdheSAtIHNvIHRoZSBlbnRyeSBpdHNlbGYgaXMgdGhlIG9ubHkgc291cmNlLCBhbmQgaXQgaGFzIHRvXG4gICAqIGJlIHJlYWQgYmVmb3JlIGl0IGlzIHJlbW92ZWQuIFRoYXQgaXMgb25lIGV4dHJhIEdFVCBvbiBhIHBhdGggdGhhdCBydW5zIHdoZW5cbiAgICogYSBjYWNoZWQgcm91dGUgc3RhcnRzIGFuc3dlcmluZyBgbm90Rm91bmQoKWA6IGBJbmNyZW1lbnRhbENhY2hlLnNldGBcbiAgICogZm9yd2FyZHMgYFJlc3BvbnNlQ2FjaGVgJ3MgbnVsbCB2YWx1ZSB0aHJvdWdoIHRvIGhlcmUuXG4gICAqXG4gICAqIEEgcGFnZSBpcyBhbHNvIHRoZSBjYXNlIHdvcnRoIHBheWluZyBpdCBmb3IsIHNpbmNlIGl0IGNhcnJpZXMgdGhlIHdob2xlXG4gICAqIGltcGxpY2l0IGBfTl9UXy/igKZgIGNoYWluIGFuZCB0aGVyZWZvcmUgdGhlIG1vc3Qgcm93cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3RvcmVkRW50cnlUYWdzKFxuICAgIHMzS2V5OiBzdHJpbmcsXG4gICAgY3R4OiBTZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgY3R4VGFncyA9IGdldFRhZ3MoY3R4KTtcbiAgICBpZiAoY3R4VGFncz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY3R4VGFncztcbiAgICB9XG4gICAgaWYgKCF0aGlzLm1hcHNUYWdzVG9QYXRocykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJ1Y2tldC5nZXQoczNLZXkpO1xuICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnlUYWdzKHBhcnNlQ2FjaGVWYWx1ZShyZXNwb25zZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byByZWFkIHRhZ3Mgb2YgJHtzM0tleX0gYmVmb3JlIGRlbGV0aW5nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhbnkgb2YgYHRhZ3NgIHdhcyByZXZhbGlkYXRlZCBhZnRlciB0aGlzIGVudHJ5IHdhcyBzdG9yZWQsIGFuZCBob3cuXG4gICAqXG4gICAqIFJlYWRzIHRoZSBwZXItdGFnIG1hcmtlciByb3dzIGByZXZhbGlkYXRlVGFnYCB3cml0ZXMsIGFzIHRoaXMgaW5zdGFuY2VcbiAgICogdHJhY2tzIHRoZW06IHNlZSBgVHJhY2tlZFRhZ01hcmtlcnNgIGZvciB3aGVuIHRoZXkgYXJlIHJlYWQuXG4gICAqIFNjYW5uaW5nIHRoZSB0YWcncyBtYXBwaW5nIHJvd3MgaW5zdGVhZCB3b3VsZCBhbnN3ZXIgdGhlIHdyb25nIHF1ZXN0aW9uOlxuICAgKiB0aG9zZSByb3dzIGV4aXN0IHBlciBjYWNoZSAqa2V5Kiwgc28gd2hpY2ggb25lIGEgYExpbWl0OiAxYCBxdWVyeSByZXR1cm5lZFxuICAgKiBkZXBlbmRlZCBvbiBzb3J0IG9yZGVyLCBhbmQgYW4gZW50cnkgY291bGQgYmUganVkZ2VkIGFnYWluc3QgYW5vdGhlclxuICAgKiBlbnRyeSdzIHRpbWVzdGFtcC5cbiAgICpcbiAgICogQSB0YWcgcmV2YWxpZGF0ZWQgd2l0aCBhIHByb2ZpbGUgb25seSBtYWtlcyB0aGUgZW50cnkgKnN0YWxlKjogdGhhdCBpc1xuICAgKiByZXBvcnRlZCB0byBOZXh0LmpzIHRocm91Z2ggaXRzIHRhZyBtYW5pZmVzdCAoc2VlIHtAbGluayBuZXh0VGFnc01hbmlmZXN0fSlcbiAgICogYW5kIGFuc3dlcmVkIGBcInN0YWxlXCJgIGhlcmUsIHNvIHRoZSBlbnRyeSBpcyBzZXJ2ZWQgd2hpbGUgYSBiYWNrZ3JvdW5kXG4gICAqIHJlbmRlciByZXBsYWNlcyBpdC4gV2hlbiB0aGUgbWFuaWZlc3QgY2Fubm90IGJlIHJlYWNoZWQgYSBzdGFsZSBlbnRyeSBpc1xuICAgKiByZXBvcnRlZCBleHBpcmVkIGluc3RlYWQgLSBhIGJsb2NraW5nIHJlbmRlciwgbmV2ZXIgYSBzdGFsZSBwYWdlIHByZXNlbnRlZFxuICAgKiBhcyBmcmVzaC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tJZlJldmFsaWRhdGVkKFxuICAgIGNhY2hlTGFzdE1vZGlmaWVkOiBudW1iZXIsXG4gICAgdGFnczogc3RyaW5nW10sXG4gICk6IFByb21pc2U8UmV2YWxpZGF0aW9uU3RhdGU+IHtcbiAgICBhd2FpdCB0aGlzLnRhZ3MucmVmcmVzaCgpO1xuICAgIGF3YWl0IHRoaXMudGFncy5lbnN1cmUodGFncyk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnRhZ3Muc3RhdGUodGFncywgY2FjaGVMYXN0TW9kaWZpZWQpO1xuICAgIGlmIChzdGF0ZSAhPT0gXCJzdGFsZVwiKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IFwiZXhwaXJlZFwiKSB7XG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYFRhZ3MgWyR7dGFnc31dIGV4cGlyZWQgZW50cnkgY3JlYXRlZCBhdCAke2NhY2hlTGFzdE1vZGlmaWVkfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgbWFuaWZlc3QgPSBuZXh0VGFnc01hbmlmZXN0KCk7XG4gICAgaWYgKCFtYW5pZmVzdCkge1xuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYFRhZ3MgWyR7dGFnc31dIGFyZSBzdGFsZSBhbmQgTmV4dC5qcydzIHRhZyBtYW5pZmVzdCBpcyBgICtcbiAgICAgICAgICBgdW5yZWFjaGFibGUsIGV4cGlyaW5nIHRoZSBlbnRyeSBpbnN0ZWFkYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gXCJleHBpcmVkXCI7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIGNvbnN0IHN0YWxlQXQgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk/LnN0YWxlQXQ7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG1hbmlmZXN0LmdldCh0YWcpO1xuICAgICAgaWYgKFxuICAgICAgICBzdGFsZUF0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgc3RhbGVBdCA+IGNhY2hlTGFzdE1vZGlmaWVkICYmXG4gICAgICAgIChleGlzdGluZz8uc3RhbGUgPz8gMCkgPCBzdGFsZUF0XG4gICAgICApIHtcbiAgICAgICAgbWFuaWZlc3Quc2V0KHRhZywgeyAuLi5leGlzdGluZywgc3RhbGU6IHN0YWxlQXQgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcInN0YWxlXCI7XG4gIH1cbn1cbiJdfQ==
|