cdk-nextjs 0.7.5 → 0.7.6
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 +37 -37
- package/docs/adapter-runtime.md +1 -1
- package/docs/harness-coverage.md +9 -8
- package/lib/adapter/adapter.mjs +220 -149
- package/lib/adapter/aws-cache-store.d.ts +28 -4
- package/lib/adapter/aws-cache-store.js +52 -21
- package/lib/adapter/aws-cache-store.test.js +36 -1
- package/lib/adapter/build-outputs.js +23 -1
- package/lib/adapter/build-outputs.test.js +18 -1
- package/lib/adapter/cache-handler.d.ts +4 -3
- package/lib/adapter/cache-handler.js +1 -1
- package/lib/adapter/cache-handler.mjs +131 -61
- package/lib/adapter/cache-handler.test.js +31 -1
- package/lib/adapter/cache-utils.d.ts +68 -2
- package/lib/adapter/cache-utils.js +108 -2
- package/lib/adapter/cache-utils.test.js +45 -1
- package/lib/adapter/init-cache.d.ts +1 -1
- package/lib/adapter/init-cache.js +60 -37
- package/lib/adapter/init-cache.test.js +55 -2
- package/lib/adapter/local-file-cache-handler.d.ts +2 -2
- package/lib/adapter/local-file-cache-handler.js +4 -5
- package/lib/adapter/s3-cache-handler.d.ts +23 -7
- package/lib/adapter/s3-cache-handler.js +63 -27
- package/lib/adapter/s3-cache-handler.test.js +168 -1
- package/lib/adapter/use-cache-default-handler.mjs +32 -9
- package/lib/adapter/use-cache-remote-handler.js +2 -3
- package/lib/adapter/use-cache-remote-handler.mjs +81 -61
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.d.ts +0 -7
- package/lib/nextjs-build/nextjs-build.js +4 -11
- package/lib/nextjs-build/nextjs-build.test.js +4 -3
- 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/image.d.ts +19 -0
- package/lib/runtime/image.js +28 -2
- package/lib/runtime/image.test.js +43 -1
- package/lib/runtime/lambda.mjs +14 -3
- package/lib/runtime/server.mjs +14 -3
- package/lib/utils/deployment-build-id.d.ts +11 -0
- package/lib/utils/deployment-build-id.js +15 -0
- package/package.json +3 -3
- package/scripts/e2e-harness/README.md +1 -1
|
@@ -359,8 +359,8 @@ class S3CacheHandler {
|
|
|
359
359
|
if (!this.config.bucketName) {
|
|
360
360
|
return null;
|
|
361
361
|
}
|
|
362
|
-
const
|
|
363
|
-
const response = await this.bucket.get(
|
|
362
|
+
const objectKey = (0, aws_cache_store_1.s3ObjectKey)(this.config.buildId, cacheKey);
|
|
363
|
+
const response = await this.bucket.get(objectKey);
|
|
364
364
|
if (!response) {
|
|
365
365
|
this.debug(`S3 CACHE MISS: ${cacheKey}`);
|
|
366
366
|
return null;
|
|
@@ -386,7 +386,7 @@ class S3CacheHandler {
|
|
|
386
386
|
? null
|
|
387
387
|
: { lastModified: EXPIRED_LAST_MODIFIED, value: parsedValue.value };
|
|
388
388
|
}
|
|
389
|
-
this.debug(`S3 CACHE HIT: ${cacheKey} (${
|
|
389
|
+
this.debug(`S3 CACHE HIT: ${cacheKey} (${objectKey})`);
|
|
390
390
|
// Without the stored tags.
|
|
391
391
|
return {
|
|
392
392
|
lastModified: parsedValue.lastModified,
|
|
@@ -461,6 +461,10 @@ class S3CacheHandler {
|
|
|
461
461
|
this.softRevalidatedKeys.add(cacheKey);
|
|
462
462
|
}
|
|
463
463
|
async set(cacheKey, data, ctx) {
|
|
464
|
+
// The entry's name in tag mappings and CloudFront paths, and the object
|
|
465
|
+
// it is stored in, which differ for a name too long for S3.
|
|
466
|
+
const s3Key = (0, aws_cache_store_1.buildS3Key)(this.config.buildId, cacheKey);
|
|
467
|
+
const objectKey = (0, aws_cache_store_1.s3ObjectKey)(this.config.buildId, cacheKey);
|
|
464
468
|
try {
|
|
465
469
|
if (!data) {
|
|
466
470
|
// Delete from S3 and DynamoDB
|
|
@@ -470,17 +474,15 @@ class S3CacheHandler {
|
|
|
470
474
|
}
|
|
471
475
|
// The entry is gone, so there is no regeneration left to wait for.
|
|
472
476
|
this.softRevalidatedKeys.delete(cacheKey);
|
|
473
|
-
// Build S3 key without needing to know the kind
|
|
474
|
-
const s3Key = this.buildS3Key(cacheKey);
|
|
475
477
|
// Read the entry's tags before the object is gone: they are the only
|
|
476
478
|
// way to name its mapping rows, whose sort key is `tag#s3Key` and so
|
|
477
479
|
// cannot be queried from the key side. See `storedEntryTags`.
|
|
478
|
-
const tags = await this.storedEntryTags(
|
|
480
|
+
const tags = await this.storedEntryTags(objectKey, ctx);
|
|
479
481
|
await this.s3Client.send(new client_s3_1.DeleteObjectCommand({
|
|
480
482
|
Bucket: this.config.bucketName,
|
|
481
|
-
Key:
|
|
483
|
+
Key: objectKey,
|
|
482
484
|
}));
|
|
483
|
-
this.debug(`S3 CACHE DELETED: ${
|
|
485
|
+
this.debug(`S3 CACHE DELETED: ${objectKey}`);
|
|
484
486
|
await this.deleteDynamoDBTagMappings(s3Key, tags);
|
|
485
487
|
return;
|
|
486
488
|
}
|
|
@@ -499,7 +501,6 @@ class S3CacheHandler {
|
|
|
499
501
|
if (!this.config.bucketName) {
|
|
500
502
|
return;
|
|
501
503
|
}
|
|
502
|
-
const s3Key = this.buildS3Key(cacheKey);
|
|
503
504
|
// Create CacheHandlerValue structure for S3 storage with tags
|
|
504
505
|
const cacheHandlerValue = {
|
|
505
506
|
// On the marker clock, since that is what it is compared with.
|
|
@@ -514,7 +515,7 @@ class S3CacheHandler {
|
|
|
514
515
|
// Serialize with custom handling for Map and Buffer objects
|
|
515
516
|
const body = (0, cache_utils_1.serializeCacheValue)(cacheEntryWithTags);
|
|
516
517
|
// Always JSON since we store CacheHandlerValue
|
|
517
|
-
await this.bucket.putJson(
|
|
518
|
+
await this.bucket.putJson(objectKey, body);
|
|
518
519
|
this.debug(`S3 CACHE STORED: ${cacheKey} (${data.kind})`);
|
|
519
520
|
// The regeneration of an entry served stale: CloudFront may have cached
|
|
520
521
|
// that stale response after `revalidateTag`'s invalidation, so the key's
|
|
@@ -588,8 +589,9 @@ class S3CacheHandler {
|
|
|
588
589
|
* {@link MAX_TAG_QUERY_PAGES}, or no build tag manifest to read.
|
|
589
590
|
*/
|
|
590
591
|
async tagRoutes(tag) {
|
|
592
|
+
const skPrefix = this.tagMappingPrefix(tag);
|
|
591
593
|
const [{ items, truncated }, buildTags] = await Promise.all([
|
|
592
|
-
this.queryTagMappings(tag),
|
|
594
|
+
this.queryTagMappings(tag, skPrefix),
|
|
593
595
|
this.buildTagManifest(),
|
|
594
596
|
]);
|
|
595
597
|
// Extract S3 keys from sort keys (format: "tag#s3Key"). Split at the tag's
|
|
@@ -604,15 +606,21 @@ class S3CacheHandler {
|
|
|
604
606
|
// mapping row of it (`user#42#<buildId>/…`). What is left after the prefix
|
|
605
607
|
// is an S3 key only if it starts with the build's own prefix, which is how
|
|
606
608
|
// `buildS3Key` writes every one.
|
|
607
|
-
|
|
609
|
+
//
|
|
610
|
+
// A row whose key would not fit a sort key has it hashed there, and every
|
|
611
|
+
// row carries it in `s3Key` (rows written before that attribute fall back
|
|
612
|
+
// to the sort key): see `tagMappingSortKey`. An empty remainder is never a
|
|
613
|
+
// mapping row: it is the marker row of a tag one `#` longer.
|
|
614
|
+
const prefixLength = skPrefix.length;
|
|
608
615
|
const keyPrefix = this.config.buildId ? `${this.config.buildId}/` : "";
|
|
609
|
-
const s3Keys = items
|
|
610
|
-
|
|
611
|
-
|
|
616
|
+
const s3Keys = items.flatMap((item) => {
|
|
617
|
+
const rest = item.sk?.S?.slice(prefixLength);
|
|
618
|
+
return rest && rest.startsWith(keyPrefix) ? [item.s3Key?.S ?? rest] : [];
|
|
619
|
+
});
|
|
612
620
|
// The build-time prerenders carrying the tag, which no `set` wrote a row
|
|
613
621
|
// for.
|
|
614
622
|
for (const cacheKey of buildTags?.get(tag) ?? []) {
|
|
615
|
-
s3Keys.push(
|
|
623
|
+
s3Keys.push((0, aws_cache_store_1.buildS3Key)(this.config.buildId, cacheKey));
|
|
616
624
|
}
|
|
617
625
|
this.debug(`TAG ${tag}: Found ${s3Keys.length} cache entries to invalidate`);
|
|
618
626
|
// The mapping rows themselves are deliberately left alone. Stamping
|
|
@@ -660,7 +668,8 @@ class S3CacheHandler {
|
|
|
660
668
|
});
|
|
661
669
|
}
|
|
662
670
|
/**
|
|
663
|
-
* Every mapping row for `tag
|
|
671
|
+
* Every mapping row for `tag` - those whose sort key starts with
|
|
672
|
+
* `skPrefix`, its {@link tagMappingPrefix} - following `LastEvaluatedKey`, and whether
|
|
664
673
|
* {@link MAX_TAG_QUERY_PAGES} cut the walk short.
|
|
665
674
|
*
|
|
666
675
|
* DynamoDB caps a Query at 1 MB of items regardless of how many match, and
|
|
@@ -669,7 +678,7 @@ class S3CacheHandler {
|
|
|
669
678
|
* first page invalidates only that page's entries while still reporting
|
|
670
679
|
* success, which is indistinguishable from revalidation having worked.
|
|
671
680
|
*/
|
|
672
|
-
async queryTagMappings(tag) {
|
|
681
|
+
async queryTagMappings(tag, skPrefix) {
|
|
673
682
|
const items = [];
|
|
674
683
|
let exclusiveStartKey;
|
|
675
684
|
let pages = 0;
|
|
@@ -679,7 +688,7 @@ class S3CacheHandler {
|
|
|
679
688
|
KeyConditionExpression: "pk = :pk AND begins_with(sk, :skPrefix)",
|
|
680
689
|
ExpressionAttributeValues: {
|
|
681
690
|
":pk": { S: this.config.buildId },
|
|
682
|
-
":skPrefix": { S:
|
|
691
|
+
":skPrefix": { S: skPrefix },
|
|
683
692
|
},
|
|
684
693
|
ExclusiveStartKey: exclusiveStartKey,
|
|
685
694
|
}));
|
|
@@ -717,6 +726,12 @@ class S3CacheHandler {
|
|
|
717
726
|
if (withoutSuffix.includes("[") || isFetchCacheKey(withoutSuffix)) {
|
|
718
727
|
return undefined;
|
|
719
728
|
}
|
|
729
|
+
// next >= 16.3.8: `route-cache/<kind>/<hash>/$<pathname>`, the pathname
|
|
730
|
+
// through `normalizePagePath`.
|
|
731
|
+
const routeCacheKey = cache_utils_1.ROUTE_CACHE_KEY_PREFIX.exec(withoutSuffix);
|
|
732
|
+
if (routeCacheKey) {
|
|
733
|
+
return (0, cache_utils_1.denormalizePagePath)(withoutSuffix.slice(routeCacheKey[0].length));
|
|
734
|
+
}
|
|
720
735
|
return withoutSuffix === "index" ? "/" : `/${withoutSuffix}`;
|
|
721
736
|
}
|
|
722
737
|
/**
|
|
@@ -816,19 +831,39 @@ class S3CacheHandler {
|
|
|
816
831
|
return Boolean(this.cloudFrontConfig.distributionId ||
|
|
817
832
|
this.cloudFrontConfig.distributionIdParameterName);
|
|
818
833
|
}
|
|
819
|
-
/**
|
|
820
|
-
|
|
821
|
-
|
|
834
|
+
/**
|
|
835
|
+
* The sort key of `tag`'s mapping row for `s3Key`: `<prefix>s3Key`, or, when
|
|
836
|
+
* that passes DynamoDB's 1024-byte sort key limit, `<prefix><buildId>/#<sha256>`.
|
|
837
|
+
* Either way the row carries the key itself in `s3Key`. next 16.3.8's
|
|
838
|
+
* route-scoped keys are ~88 bytes longer than a pathname, enough to push a
|
|
839
|
+
* long tag on a long path over - and a rejected `PutItem` left
|
|
840
|
+
* `revalidateTag` nothing to invalidate, so CloudFront kept the stale page.
|
|
841
|
+
* The prefix is {@link tagMappingPrefix}'s, which {@link MAX_TAG_BYTES} and
|
|
842
|
+
* the build ID's cap leave room for the hashed form after.
|
|
843
|
+
*/
|
|
844
|
+
tagMappingSortKey(tag, s3Key) {
|
|
845
|
+
const prefix = this.tagMappingPrefix(tag);
|
|
846
|
+
const sk = `${prefix}${s3Key}`;
|
|
847
|
+
return Buffer.byteLength(sk) <= aws_cache_store_1.MAX_SORT_KEY_BYTES
|
|
848
|
+
? sk
|
|
849
|
+
: `${prefix}${this.config.buildId}/${(0, aws_cache_store_1.hashedTag)(s3Key)}`;
|
|
850
|
+
}
|
|
851
|
+
/**
|
|
852
|
+
* What every mapping row of `tag` starts with, and so what
|
|
853
|
+
* {@link queryTagMappings} matches: `<sortKeyTag(tag)>#`.
|
|
854
|
+
*/
|
|
855
|
+
tagMappingPrefix(tag) {
|
|
856
|
+
return `${(0, aws_cache_store_1.sortKeyTag)(tag)}#`;
|
|
822
857
|
}
|
|
823
858
|
async storeDynamoDBTagMappings(s3Key, tags) {
|
|
824
859
|
try {
|
|
825
860
|
const updatePromises = tags.map(async (tag) => {
|
|
826
|
-
const
|
|
861
|
+
const sk = this.tagMappingSortKey(tag, s3Key);
|
|
827
862
|
const updateCommand = new client_dynamodb_1.UpdateItemCommand({
|
|
828
863
|
TableName: this.config.tableName,
|
|
829
864
|
Key: {
|
|
830
865
|
pk: { S: this.config.buildId },
|
|
831
|
-
sk: { S:
|
|
866
|
+
sk: { S: sk },
|
|
832
867
|
},
|
|
833
868
|
// Deliberately no `revalidatedAt`: a mapping row records only that an
|
|
834
869
|
// entry carries the tag. Stamping it at write time made every tagged
|
|
@@ -836,9 +871,10 @@ class S3CacheHandler {
|
|
|
836
871
|
// row's timestamp is taken after the entry's `lastModified` — so
|
|
837
872
|
// `checkIfRevalidated` deleted healthy entries and the page
|
|
838
873
|
// re-rendered on every request.
|
|
839
|
-
UpdateExpression: "SET createdAt = if_not_exists(createdAt, :now)",
|
|
874
|
+
UpdateExpression: "SET createdAt = if_not_exists(createdAt, :now), s3Key = :s3Key",
|
|
840
875
|
ExpressionAttributeValues: {
|
|
841
876
|
":now": { N: Date.now().toString() },
|
|
877
|
+
":s3Key": { S: s3Key },
|
|
842
878
|
},
|
|
843
879
|
});
|
|
844
880
|
await this.dynamoClient.send(updateCommand);
|
|
@@ -888,7 +924,7 @@ class S3CacheHandler {
|
|
|
888
924
|
TableName: this.config.tableName,
|
|
889
925
|
Key: {
|
|
890
926
|
pk: { S: this.config.buildId },
|
|
891
|
-
sk: { S:
|
|
927
|
+
sk: { S: this.tagMappingSortKey(tag, s3Key) },
|
|
892
928
|
},
|
|
893
929
|
}));
|
|
894
930
|
}));
|
|
@@ -979,4 +1015,4 @@ class S3CacheHandler {
|
|
|
979
1015
|
}
|
|
980
1016
|
}
|
|
981
1017
|
exports.S3CacheHandler = S3CacheHandler;
|
|
982
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtY2FjaGUtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL3MzLWNhY2hlLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0VBRUU7QUFDRixzREFBc0Q7QUFDdEQsNkNBQXlDO0FBQ3pDLHFDQUF1QztBQUN2Qyw2Q0FBNEM7QUFDNUMseUNBQWlDO0FBQ2pDLGtFQUdvQztBQUNwQyw4REFNa0M7QUFDbEMsa0RBQW1FO0FBQ25FLG9EQUFxRTtBQUNyRSxrREFBNkI7QUFhN0IsdURBUzJCO0FBQzNCLCtDQU11QjtBQUN2Qix5REFBdUQ7QUFDdkQsa0RBQTREO0FBQzVELGtEQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxNQUE0QztJQUM3RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFBLHdCQUFVLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxlQUFlLENBQ3RCLEdBQXlFO0lBRXpFLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDOUIsQ0FBQztBQUVELHVGQUF1RjtBQUN2RixNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQztBQUUzQzs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEdBQVc7SUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRywwQkFBMEIsR0FB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T0FBTyxDQUFDO1lBQzVDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkMsSUFDRSxPQUFPLEtBQUssU0FBUztnQkFDckIsT0FBTyxHQUFHLGlCQUFpQjtnQkFDM0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFDaEMsQ0FBQztnQkFDRCxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBNzFCRCx3Q0E2MUJDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgUzMgYW5kIER5bmFtb0RCIGNhY2hlIGhhbmRsZXIgZm9yIE5leHQuanMgaW5jcmVtZW50YWwgY2FjaGVcbiovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHtcbiAgQ2xvdWRGcm9udENsaWVudCxcbiAgQ3JlYXRlSW52YWxpZGF0aW9uQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1jbG91ZGZyb250XCI7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGVWYWx1ZSxcbiAgRGVsZXRlSXRlbUNvbW1hbmQsXG4gIER5bmFtb0RCQ2xpZW50LFxuICBRdWVyeUNvbW1hbmQsXG4gIFVwZGF0ZUl0ZW1Db21tYW5kLFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCI7XG5pbXBvcnQgeyBTM0NsaWVudCwgRGVsZXRlT2JqZWN0Q29tbWFuZCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB7IFNTTUNsaWVudCwgR2V0UGFyYW1ldGVyQ29tbWFuZCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtc3NtXCI7XG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQge1xuICBDYWNoZUhhbmRsZXIsXG4gIENhY2hlSGFuZGxlclZhbHVlLFxuICBDYWNoZUhhbmRsZXJDb250ZXh0LFxufSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvaW5jcmVtZW50YWwtY2FjaGVcIjtcbmltcG9ydCB7XG4gIEluY3JlbWVudGFsQ2FjaGVWYWx1ZSxcbiAgR2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dCxcbiAgR2V0SW5jcmVtZW50YWxSZXNwb25zZUNhY2hlQ29udGV4dCxcbiAgU2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dCxcbiAgU2V0SW5jcmVtZW50YWxSZXNwb25zZUNhY2hlQ29udGV4dCxcbn0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcmVzcG9uc2UtY2FjaGVcIjtcbmltcG9ydCB7XG4gIEF3c0NhY2hlQ29uZmlnLFxuICBidWlsZFMzS2V5LFxuICBDYWNoZUJ1Y2tldCxcbiAgbWFya2VyQ2xvY2ssXG4gIHJlc29sdmVBd3NDYWNoZUNvbmZpZyxcbiAgUmV2YWxpZGF0ZUR1cmF0aW9ucyxcbiAgUmV2YWxpZGF0aW9uU3RhdGUsXG4gIFRyYWNrZWRUYWdNYXJrZXJzLFxufSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcbmltcG9ydCB7XG4gIHNlcmlhbGl6ZUNhY2hlVmFsdWUsXG4gIHBhcnNlQ2FjaGVWYWx1ZSxcbiAgZ2V0VGFncyxcbiAgaGVhZGVyVGFncyxcbiAgSU5JVF9DQUNIRV9UQUdfTUFOSUZFU1QsXG59IGZyb20gXCIuL2NhY2hlLXV0aWxzXCI7XG5pbXBvcnQgeyBzaGFyZWRUYWdNYW5pZmVzdCB9IGZyb20gXCIuL3VzZS1jYWNoZS1jb21tb25cIjtcbmltcG9ydCB7IFJFVkFMSURBVEVEX1BBR0VfSE9PSyB9IGZyb20gXCIuLi9ydW50aW1lL21hbmlmZXN0XCI7XG5pbXBvcnQgeyBiYXNlUGF0aFByZWZpeCwgd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyB9IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcblxuLyoqXG4gKiBUaGUgdGFncyBhIHN0b3JlZCBlbnRyeSBoYXMgdG8gYmUgdGFnLXJldmFsaWRhdGVkIGFnYWluc3QuXG4gKlxuICogQSBydW50aW1lIGBzZXRgIHJlY29yZHMgYHRhZ3NgIGFsb25nc2lkZSB0aGUgZW50cnksIGJ1dCBhIGJ1aWxkLXRpbWUgcHJlcmVuZGVyXG4gKiBkb2VzIG5vdDogdGhvc2UgZW50cmllcyBhcmUgd3JpdHRlbiBhcyBmaWxlcyBieSB0aGUgYWRhcHRlcidzXG4gKiBgb25CdWlsZENvbXBsZXRlYCByYXRoZXIgdGhhbiB0aHJvdWdoIGBzZXRgLCBhbmQgY2FycnkgdGhlaXIgdGFncyBvbmx5IGluIHRoZVxuICogcmVuZGVyJ3MgYHgtbmV4dC1jYWNoZS10YWdzYCBoZWFkZXIg4oCUIHRoZSBzYW1lIHBsYWNlIE5leHQuanMncyBvd25cbiAqIGBJbmNyZW1lbnRhbENhY2hlLmdldGAgcmVhZHMgdGhlbSBmcm9tIHdoZW4gaXQgZGVjaWRlcyBzdGFsZW5lc3MuIFdpdGhvdXQgdGhpc1xuICogZmFsbGJhY2sgbm8gcHJlcmVuZGVyZWQgcGFnZSBpcyByZWFjaGFibGUgYnkgYHJldmFsaWRhdGVUYWdgL2ByZXZhbGlkYXRlUGF0aGBcbiAqIHVudGlsIHNvbWUgbGF0ZXIgcnVudGltZSByZS1yZW5kZXIgaGFwcGVucyB0byByZXBsYWNlIHRoZSBzZWVkZWQgZW50cnksIHNvIGFuXG4gKiBhcHAgd2hvc2UgcGFnZXMgYXJlIGFsbCBzdGF0aWMgbmV2ZXIgcmV2YWxpZGF0ZXMgYXQgYWxsLiBNZWFzdXJlZCBhZ2FpbnN0XG4gKiBuZXh0LmpzJ3MgYHRlc3QvZTJlL2FwcC1kaXIvcmVzdW1lLWRhdGEtY2FjaGVgLlxuICovXG5mdW5jdGlvbiBlbnRyeVRhZ3Moc3RvcmVkOiB7IHRhZ3M/OiBzdHJpbmdbXTsgdmFsdWU/OiB1bmtub3duIH0pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBzdG9yZWQudGFncz8ubGVuZ3RoID8gc3RvcmVkLnRhZ3MgOiBoZWFkZXJUYWdzKHN0b3JlZC52YWx1ZSk7XG59XG5cbi8qKlxuICogVGhlIGBsYXN0TW9kaWZpZWRgIHRoYXQgdGVsbHMgTmV4dC5qcyBcInRoaXMgZW50cnkgaXMgZXhwaXJlZCwgcmUtcmVuZGVyIGl0XG4gKiBiZWZvcmUgYW5zd2VyaW5nXCIuXG4gKlxuICogYEluY3JlbWVudGFsQ2FjaGUuZ2V0YCB0dXJucyBpdCBpbnRvIGBpc1N0YWxlOiAtMWAsIHdoaWNoIGBhcHAtcGFnZS1ydW50aW1lYFxuICogcmVhZHMgYXMgYW4gb24tZGVtYW5kIHJldmFsaWRhdGlvbiBhbmQgYW5zd2VycyB3aXRoIGEgYmxvY2tpbmcgcmVuZGVyIG9mXG4gKiAqdGhpcyogcm91dGUsIHRoZW4gc3RvcmVzIGl0LiBSZXR1cm5pbmcgYG51bGxgIGluc3RlYWQgaXMgbm90IHRoZSBzYW1lIHRoaW5nOlxuICogYSBtaXNzIG9uIGEgUFBSIHJvdXRlIHdob3NlIGBwcmVyZW5kZXItbWFuaWZlc3QuanNvbmAgZW50cnkgY2FycmllcyBhXG4gKiBgZmFsbGJhY2tgIChgY29tcHV0ZTogXCJyZXN1bWluZ1wiYCkgaXMgYW5zd2VyZWQgZnJvbSB0aGUgcm91dGUncyBmYWxsYmFja1xuICogc2hlbGwsIHdoaWNoIGlzIHNlcnZlZCBgY2FjaGUtY29udHJvbDogcHJpdmF0ZSwgbm8tc3RvcmVgIHdpdGggbm9cbiAqIGB4LW5leHRqcy1jYWNoZWAgaGVhZGVyLCBhbmQgLSB1bmxlc3MgYHBhcnRpYWxQcmVmZXRjaGluZ2AgaXMgb24gLSBpcyBuZXZlclxuICogdXBncmFkZWQgaW50byBhIGNvbmNyZXRlIGVudHJ5LiBTbyB0aGUgZmlyc3QgYHJldmFsaWRhdGVUYWdgIHRvIHJlYWNoIGFcbiAqIHNlZWRlZCBwcmVyZW5kZXIgbGVmdCB0aGF0IHBhZ2UgdW5jYWNoZWFibGUsIGFuZCBkeW5hbWljYWxseSByZXN1bWVkIHBlclxuICogcmVxdWVzdCwgZm9yIHRoZSByZXN0IG9mIHRoZSBkZXBsb3ltZW50J3MgbGlmZS4gVGhlIGlzciBlMmUgc2VlcyBpdCBhcyBhblxuICogYWJzZW50IGB4LW5leHRqcy1jYWNoZWAuXG4gKi9cbmNvbnN0IEVYUElSRURfTEFTVF9NT0RJRklFRCA9IC0xO1xuXG4vKipcbiAqIFdoZXRoZXIgYSBgZ2V0YCBpcyBmb3IgdGhlIGBmZXRjaGAgY2FjaGUgcmF0aGVyIHRoYW4gZm9yIGEgcm91dGUncyByZXNwb25zZSxcbiAqIGFzIGEgbmFycm93aW5nIHByZWRpY2F0ZSBzbyB0aGF0IGBjdHgudGFnc2AgYW5kIGBjdHguc29mdFRhZ3NgIOKAlCB3aGljaCBvbmx5XG4gKiB7QGxpbmsgR2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dH0gaGFzIOKAlCBhcmUgcmVhY2hhYmxlIHdpdGhvdXQgYSBjYXN0LlxuICpcbiAqIGBJbmNyZW1lbnRhbENhY2hlS2luZC5GRVRDSGAsIGNvbXBhcmVkIGFzIGl0cyBvd24gc3RyaW5nIHZhbHVlIHNvIHRoaXMgZmlsZVxuICoga2VlcHMgaW1wb3J0aW5nIG5vIE5leHQuanMgaW50ZXJuYWxzICh0aGUgZW51bSBpcyBgY29uc3RgLCBzbyBpdCBoYXMgbm9cbiAqIHJ1bnRpbWUgcmVwcmVzZW50YXRpb24gdG8gaW1wb3J0IGFueXdheSkuXG4gKi9cbmZ1bmN0aW9uIGlzRmV0Y2hDYWNoZUdldChcbiAgY3R4OiBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0IHwgR2V0SW5jcmVtZW50YWxSZXNwb25zZUNhY2hlQ29udGV4dCxcbik6IGN0eCBpcyBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0IHtcbiAgcmV0dXJuIGN0eC5raW5kID09PSBcIkZFVENIXCI7XG59XG5cbi8qKiBgTkVYVF9DQUNIRV9JTVBMSUNJVF9UQUdfSURgLCBpbmxpbmVkIHNvIHRoaXMgZmlsZSBpbXBvcnRzIG5vIE5leHQuanMgaW50ZXJuYWxzLiAqL1xuY29uc3QgTkVYVF9DQUNIRV9JTVBMSUNJVF9UQUdfSUQgPSBcIl9OX1RfXCI7XG5cbi8qKlxuICogVGhlIGB0eXBlYCBhcmd1bWVudCBvZiBgcmV2YWxpZGF0ZVBhdGhgLCB3aGljaCBOZXh0LmpzIGFwcGVuZHMgdG8gdGhlIGltcGxpY2l0XG4gKiB0YWcgYXMgYSBwYXRoIHNlZ21lbnQuIEBzZWUgaW1wbGljaXRUYWdQYXRoc1xuICovXG5jb25zdCBSRVZBTElEQVRFX1BBVEhfVFlQRVMgPSBbXCJsYXlvdXRcIiwgXCJwYWdlXCJdO1xuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHBhdGhzIGEgYHJldmFsaWRhdGVQYXRoYCB0YWcgY291bGQgbmFtZSwgb3IgZW1wdHkgZm9yIGFuIGFwcCB0YWcuXG4gKlxuICogYHJldmFsaWRhdGVQYXRoKFwiL2Jsb2dcIilgIHJlYWNoZXMgdGhlIGNhY2hlIGhhbmRsZXIgYXMgdGhlIGltcGxpY2l0IHRhZ1xuICogYF9OX1RfL2Jsb2dgIC0gdGhlIHBhdGggaXMgcmlnaHQgdGhlcmUgaW4gdGhlIHRhZywgd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgQ0ROXG4gKiBjb3B5IG9mIGEgYnVpbGQtdGltZSBwcmVyZW5kZXIgcmVhY2hhYmxlIGF0IGFsbC4gQSBgcmV2YWxpZGF0ZVRhZyhcInBvc3RzXCIpYFxuICogY2FycmllcyBubyBwYXRoIGFuZCBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIHJvd3MgaW5zdGVhZC5cbiAqXG4gKiBUd28gcGF0aHMgY29tZSBiYWNrIHdoZW4gdGhlIHRhZyBlbmRzIGluIGEgYHJldmFsaWRhdGVQYXRoYCAqdHlwZSosIGJlY2F1c2VcbiAqIGByZXZhbGlkYXRlUGF0aChwYXRoLCB0eXBlKWAgYXBwZW5kcyBpdCB0byB0aGUgdGFnXG4gKiAoYG5leHQvZGlzdC9zZXJ2ZXIvd2ViL3NwZWMtZXh0ZW5zaW9uL3JldmFsaWRhdGUuanNgKTpcbiAqIGByZXZhbGlkYXRlUGF0aChcIi9ibG9nXCIsIFwibGF5b3V0XCIpYCBpcyBgX05fVF8vYmxvZy9sYXlvdXRgLCBhbmRcbiAqIGByZXZhbGlkYXRlUGF0aChcIi9cIiwgXCJsYXlvdXRcIilgIGlzIGBfTl9UXy9sYXlvdXRgLiBSZWFkaW5nIGVpdGhlciBvZiB0aG9zZSBhcyBhXG4gKiByZXF1ZXN0IHBhdGggaW52YWxpZGF0ZXMgYSBVUkkgdGhhdCBkb2VzIG5vdCBleGlzdCBhbmQgbmV2ZXIgdG91Y2hlcyB0aGUgb25lXG4gKiB0aGF0IGRvZXMuIFRoZSBzdWZmaXggY2Fubm90IGJlIHRvbGQgYXBhcnQgZnJvbSBhIHJvdXRlIHRoYXQgZ2VudWluZWx5IGVuZHMgaW5cbiAqIGAvbGF5b3V0YCwgc28gYm90aCByZWFkaW5ncyBhcmUgZW1pdHRlZDogYW4gaW52YWxpZGF0aW9uIHBhdGggbWF0Y2hpbmcgbm90aGluZ1xuICogY29zdHMgYSBwYXRoLCB3aGlsZSBtaXNzaW5nIHRoZSByZWFsIG9uZSBsZWF2ZXMgdGhlIGVkZ2Ugc3RhbGUgZm9yIHRoZSB3aG9sZVxuICogYHMtbWF4YWdlYC5cbiAqL1xuZnVuY3Rpb24gaW1wbGljaXRUYWdQYXRocyh0YWc6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0YWcuc3RhcnRzV2l0aChgJHtORVhUX0NBQ0hFX0lNUExJQ0lUX1RBR19JRH0vYCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcGF0aCA9IHRhZy5zbGljZShORVhUX0NBQ0hFX0lNUExJQ0lUX1RBR19JRC5sZW5ndGgpO1xuICBjb25zdCBjYW5kaWRhdGVzID0gW3BhdGhdO1xuICBmb3IgKGNvbnN0IHR5cGUgb2YgUkVWQUxJREFURV9QQVRIX1RZUEVTKSB7XG4gICAgaWYgKHBhdGguZW5kc1dpdGgoYC8ke3R5cGV9YCkpIHtcbiAgICAgIC8vIGBfTl9UXy9sYXlvdXRgIGlzIHRoZSByb290LCBub3QgdGhlIGVtcHR5IHBhdGguXG4gICAgICBjYW5kaWRhdGVzLnB1c2gocGF0aC5zbGljZSgwLCAtKHR5cGUubGVuZ3RoICsgMSkpIHx8IFwiL1wiKTtcbiAgICB9XG4gIH1cbiAgLy8gQSBkeW5hbWljIHJvdXRlIHRlbXBsYXRlIChcIi9ibG9nL1tzbHVnXVwiKSBtYXRjaGVzIG5vIGNhY2hlZCBVUkkuIEhhcm1sZXNzIHRvXG4gIC8vIHNlbmQsIGJ1dCBpdCBjb3N0cyBhbiBpbnZhbGlkYXRpb24gcGF0aCwgYW5kIHRob3NlIGFyZSBtZXRlcmVkLlxuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGNhbmRpZGF0ZXMpKS5maWx0ZXIoKHApID0+ICFwLmluY2x1ZGVzKFwiW1wiKSk7XG59XG5cbi8qKlxuICogSW52YWxpZGF0aW9uIHBhdGhzIGNvdmVyaW5nIGV2ZXJ5IFVSSSBDbG91ZEZyb250IGNvdWxkIGJlIGhvbGRpbmcgdGhlIHJlc3BvbnNlXG4gKiBmb3IgYHJvdXRlYCB1bmRlciwgb25jZSBgYmFzZVBhdGhgIGlzIHByZWZpeGVkLlxuICpcbiAqIEFuIGludmFsaWRhdGlvbiBwYXRoIG1hdGNoZXMgb25seSB0aGUgcXVlcnkgc3RyaW5nIGl0IHNwZWxscyBvdXQsIGFuZCBhIHBhZ2Unc1xuICogUlNDIHBheWxvYWQgaXMgY2FjaGVkIHVuZGVyIGA/X3JzYz08aGFzaD5gOyBkcm9wcGluZyB0aGUgSFRNTCB3aGlsZSBsZWF2aW5nIHRoZVxuICogcGF5bG9hZCBiZWhpbmQgbGVhdmVzIHRoZSByb3V0ZXIgbmF2aWdhdGluZyB0byB0aGUgcHJlLXJldmFsaWRhdGlvbiBwYWdlLiBBXG4gKiBgdHJhaWxpbmdTbGFzaGAgYXBwIGNhY2hlcyB0aGUgcmVkaXJlY3QgdGFyZ2V0IHJhdGhlciB0aGFuIHRoZSByb3V0ZSwgc28gdGhlXG4gKiBzbGFzaCB2YXJpYW50IGhhcyB0byBnbyB0b28uXG4gKlxuICogT25lIHRyYWlsaW5nIHdpbGRjYXJkIGNvdmVycyBhbGwgZm91ciAoYC9ibG9nYCwgYC9ibG9nP+KApmAsIGAvYmxvZy9gLFxuICogYC9ibG9nLz/igKZgKSBmb3IgYSBzaW5nbGUgd2lsZGNhcmQgcGF0aCwgd2hlcmUgc3BlbGxpbmcgdGhlbSBvdXQgY29zdCB0d28gLVxuICogYW5kIHdpbGRjYXJkcyBhcmUgdGhlIHF1b3RhIHRoYXQgcnVucyBvdXQuIEl0IGFsc28gbWF0Y2hlcyBgL2Jsb2dyb2xsYCBhbmRcbiAqIGV2ZXJ5dGhpbmcgdW5kZXIgYC9ibG9nL2AsIHdoaWNoIGlzIGEgbG93ZXIgaGl0IHJhdGUgb24gdGhvc2UsIG5ldmVyIGEgc3RhbGVcbiAqIHBhZ2UuIFRoZSBhcHAncyByb290IGlzIHRoZSBleGNlcHRpb246IGAvKmAgdGhlcmUgaXMgdGhlIHdob2xlIGFwcC5cbiAqXG4gKiBgYmFzZVBhdGhgIGlzIHByZWZpeGVkIGhlcmUgYmVjYXVzZSBuZWl0aGVyIHNvdXJjZSBvZiBhIHJvdXRlIGNhcnJpZXMgaXQuXG4gKiBDYWNoZSBrZXlzIGFyZSByb3V0ZXMg4oCUIE5leHQuanMgc3RyaXBzIGBiYXNlUGF0aGAgYmVmb3JlIHJvdXRpbmcsIHNvIHRoZSBjYWNoZVxuICogaGFuZGxlciBuZXZlciBzZWVzIG9uZSDigJQgYW5kIGByZXZhbGlkYXRlUGF0aChcIi9ibG9nXCIpYCBuYW1lcyB0aGUgcm91dGUgYXNcbiAqIHdlbGwuIENsb3VkRnJvbnQgb25seSBldmVyIHNhdyBgL2Jhc2UvYmxvZ2AsIHNvIGludmFsaWRhdGluZyBgL2Jsb2dgIGNsZWFyc1xuICogbm90aGluZyBhbmQgdGhlIGVkZ2Uga2VlcHMgc2VydmluZyB0aGUgcHJlLXJldmFsaWRhdGlvbiBwYWdlIHVudGlsIGBzLW1heGFnZWBcbiAqIGV4cGlyZXMuIFRoZSBhcHAncyByb290IHVuZGVyIGEgYGJhc2VQYXRoYCBpcyBgL2Jhc2VgLCBub3QgYC9iYXNlL2AuXG4gKi9cbmZ1bmN0aW9uIGNkbkludmFsaWRhdGlvblBhdGhzKHJvdXRlOiBzdHJpbmcsIGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRyaW1tZWQgPSByb3V0ZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICBpZiAodHJpbW1lZCA9PT0gXCJcIikge1xuICAgIHJldHVybiBiYXNlUGF0aFxuICAgICAgPyBbYmFzZVBhdGgsIGAke2Jhc2VQYXRofT8qYCwgYCR7YmFzZVBhdGh9L2AsIGAke2Jhc2VQYXRofS8/KmBdXG4gICAgICA6IFtcIi9cIiwgXCIvPypcIl07XG4gIH1cbiAgcmV0dXJuIFtgJHtiYXNlUGF0aH0ke2VuY29kZUludmFsaWRhdGlvblJvdXRlKHRyaW1tZWQpfSpgXTtcbn1cblxuLyoqXG4gKiBUaGUgYXBwJ3MgYGJhc2VQYXRoYCwgZnJvbSB0aGUgYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBldmVyeSBkZXBsb3ltZW50XG4gKiByb290IHN0YWdlcyBuZXh0IHRvIGBzZXJ2ZXJEaXN0RGlyYDogTmV4dC5qcyBoYW5kcyB0aGUgY2FjaGUgaGFuZGxlciBub1xuICogb3RoZXIgY29weS5cbiAqL1xuZnVuY3Rpb24gYXBwQmFzZVBhdGgoc2VydmVyRGlzdERpcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzZXJ2ZXJEaXN0RGlyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGZpbGUgPSBqb2luKHNlcnZlckRpc3REaXIsIFwiLi5cIiwgXCJyZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZmlsZSwgXCJ1dGY4XCIpKS5jb25maWc/LmJhc2VQYXRoO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCByZWFkIGJhc2VQYXRoIGZvciBDRE4gaW52YWxpZGF0aW9uOlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIGByb3V0ZWAgYXMgdGhlIFVSSSBhIGJyb3dzZXIgcmVxdWVzdHMgaXQgdW5kZXIsIHdoaWNoIGlzIHdoYXQgQ2xvdWRGcm9udFxuICogY2FjaGVzIGl0IGJ5LlxuICpcbiAqIE5leHQuanMgYnVpbGRzIGNhY2hlIGtleXMgZnJvbSB0aGUgKmRlY29kZWQqIHBhdGhuYW1lIChgZGVjb2RlUGF0aFBhcmFtc2AgaW5cbiAqIGByb3V0ZS1tb2R1bGUuanNgKSwgc28gYC9ibG9nL2jDqWxsb2Agb3IgYC9ibG9nL2hlbGxvIHdvcmxkYCByZWFjaCBoZXJlIHJhdyxcbiAqIHdoaWxlIENsb3VkRnJvbnQgaG9sZHMgYC9ibG9nL2glQzMlQTlsbG9gLCBhbmQgYW4gaW52YWxpZGF0aW9uIHBhdGggbWF0Y2hlc1xuICogdGhlIGVuY29kZWQgZm9ybSBvbmx5IC0gQVdTIHJlcXVpcmVzIG5vbi1BU0NJSSBhbmQgdW5zYWZlIGNoYXJhY3RlcnMgdG8gYmVcbiAqIHBlcmNlbnQtZW5jb2RlZCwgYW5kIG5vdGhpbmcgZWxzZS4gRWFjaCBzZWdtZW50IGlzIGVuY29kZWQgdGhlIHdheVxuICogYGVuY29kZVVSSWAgZG9lcywgd2hpY2ggbGVhdmVzIHRoZSBjaGFyYWN0ZXJzIGEgYnJvd3NlciBzZW5kcyByYXcgaW4gYSBwYXRoXG4gKiAoYEBgLCBgOmAsIGAsYCwgYDtgLCAuLi4pIGFsb25lLiBBIGAlYCB0aGF0IGFscmVhZHkgc3RhcnRzIGFuIGVzY2FwZSBpcyBrZXB0OlxuICogYGRlY29kZVBhdGhQYXJhbXNgIHJlLWVzY2FwZXMgcGF0aCBkZWxpbWl0ZXJzIChgJTJGYCwgYCUzRmAsIGAlMjNgLCBgJTVDYCksXG4gKiBhbmQgYSBgcmV2YWxpZGF0ZVBhdGhgIHRhZyBtYXkgbmFtZSB0aGUgZW5jb2RlZCBwYXRoIGl0c2VsZi4gYD9gIGFuZCBgI2AgY2FuXG4gKiBvbmx5IGJlIGluIGEgZGVjb2RlZCBzZWdtZW50IGFzIGRhdGEsIHNvIHRoZXkgYXJlIGVuY29kZWQgdG9vLlxuICovXG5mdW5jdGlvbiBlbmNvZGVJbnZhbGlkYXRpb25Sb3V0ZShyb3V0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJvdXRlXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+XG4gICAgICBzZWdtZW50XG4gICAgICAgIC5zcGxpdCgvKCVbMC05QS1GYS1mXXsyfSkvKVxuICAgICAgICAubWFwKChwYXJ0LCBpKSA9PlxuICAgICAgICAgIGkgJSAyID09PSAxXG4gICAgICAgICAgICA/IHBhcnRcbiAgICAgICAgICAgIDogZW5jb2RlVVJJKHBhcnQpLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgL1s/I10vZyxcbiAgICAgICAgICAgICAgICAoYykgPT4gYCUke2MuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKFwiXCIpLFxuICAgIClcbiAgICAuam9pbihcIi9cIik7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGNhY2hlIGtleSBpcyBhIGZldGNoLWNhY2hlIGVudHJ5IHJhdGhlciB0aGFuIGEgcGFnZSByb3V0ZS5cbiAqXG4gKiBUaG9zZSBrZXlzIGFyZSB0aGUgaGFzaCBOZXh0LmpzIGRlcml2ZXMgZnJvbSB0aGUgcmVxdWVzdCDigJQgYSBzaW5nbGUgc2VnbWVudCBvZlxuICogbG93ZXJjYXNlIGhleCwgbG9uZyBlbm91Z2ggdGhhdCBubyByb3V0ZSBwYXRobmFtZSB0YWtlcyB0aGUgc2FtZSBzaGFwZS4gVGhleVxuICogYXJlIG1hcHBlZCB0byB0YWdzIGV4YWN0bHkgbGlrZSBwYWdlcyBhcmUsIGJ1dCBuYW1lIG5vIFVSSSBDbG91ZEZyb250IGNvdWxkIGJlXG4gKiBob2xkaW5nLCBzbyBhbiBpbnZhbGlkYXRpb24gcGF0aCBidWlsdCBmcm9tIG9uZSBpcyBhbHdheXMgd2FzdGVkLlxuICovXG5mdW5jdGlvbiBpc0ZldGNoQ2FjaGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eWzAtOWEtZl17MzIsfSQvLnRlc3Qoa2V5KTtcbn1cblxuLyoqIFdoZXRoZXIgQ2xvdWRGcm9udCBjb3VudHMgdGhpcyBwYXRoIGFnYWluc3QgdGhlIHdpbGRjYXJkIHF1b3RhLiAqL1xuZnVuY3Rpb24gaXNXaWxkY2FyZFBhdGgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYXRoLmluY2x1ZGVzKFwiKlwiKTtcbn1cblxuLyoqXG4gKiBUaGUgbW9zdCB3aWxkY2FyZCBwYXRocyBvbmUgYHJldmFsaWRhdGVUYWdgIHNlbmRzIGJlZm9yZSBjb2xsYXBzaW5nIHRvIGEgc2luZ2xlXG4gKiBhcHAtd2lkZSB3aWxkY2FyZCwgYW5kIHRoZSBtb3N0IHBhdGhzIG9mIGFueSBraW5kLlxuICpcbiAqIENsb3VkRnJvbnQncyB3aWxkY2FyZCBxdW90YSBpcyBwZXIgKmRpc3RyaWJ1dGlvbiosIG5vdCBwZXIgcmVxdWVzdDogdGhlXG4gKiBpbnZhbGlkYXRpb25zIGl0IGhhcyBpbiBwcm9ncmVzcyBzaGFyZSBpdCwgc28gc3BsaXR0aW5nIGFuIG92ZXJzaXplZCBzZXQgaW50b1xuICogYmFjay10by1iYWNrIHJlcXVlc3RzIGlzIHdoYXQgZ2V0cyB0aGUgbGF0ZXIgb25lcyByZWplY3RlZFxuICogKGBUb29NYW55SW52YWxpZGF0aW9uc0luUHJvZ3Jlc3NgLCBvciBhIHRocm90dGxlIHVuZGVyIHRoZSBuZXdlciByYXRlLWJhc2VkXG4gKiBxdW90YXMpIC0gYW5kIGEgcmVqZWN0ZWQgcmVxdWVzdCBpcyBhIHBhZ2UgdGhhdCBzdGF5cyBzdGFsZSBhdCB0aGUgZWRnZS4gU29cbiAqIGV2ZXJ5dGhpbmcgZ29lcyBvdXQgYXMgb25lIHJlcXVlc3QsIGFuZCBhIHNldCB0aGF0IHdvdWxkIG5vdCBmaXQgaW4gb25lIGlzXG4gKiBhbnN3ZXJlZCB3aXRoIHRoZSB3aG9sZSBhcHAgKGAvKmAsIHNlZSBgd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRoc2ApIGluc3RlYWQ6XG4gKiBhIHdvcnNlIGhpdCByYXRlLCBhbmQgYSBzdHJpY3RseSBjb3JyZWN0IGFuc3dlci5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLWludmFsaWRhdGlvbnNcbiAqL1xuY29uc3QgTUFYX1dJTERDQVJEX1BBVEhTX1BFUl9JTlZBTElEQVRJT04gPSAxNTtcblxuY29uc3QgTUFYX1BBVEhTX1BFUl9JTlZBTElEQVRJT04gPSAzMDAwO1xuXG4vKipcbiAqIFJldHJpZXMgb2YgYW4gaW52YWxpZGF0aW9uIENsb3VkRnJvbnQgcmVqZWN0ZWQgZm9yIGl0cyBpbi1wcm9ncmVzcyBxdW90YSwgYW5kXG4gKiB0aGUgZGVsYXkgYmVmb3JlIHRoZSBmaXJzdDsgZWFjaCBsYXRlciBvbmUgd2FpdHMgdHdpY2UgYXMgbG9uZy5cbiAqXG4gKiBTaXppbmcgYSByZXF1ZXN0IGFnYWluc3QgdGhlIHF1b3RhIGNhbm5vdCBzZWUgdGhlIGludmFsaWRhdGlvbnMgb3RoZXJcbiAqIGluc3RhbmNlcyBhbHJlYWR5IGhhdmUgaW4gZmxpZ2h0LCBzbyB0d28gYHJldmFsaWRhdGVUYWdgcyBjbG9zZSB0b2dldGhlciBjYW5cbiAqIGVhY2ggZml0IG9uIHRoZWlyIG93biBhbmQgc3RpbGwgYmUgcmVqZWN0ZWQgdG9nZXRoZXIuIERyb3BwaW5nIHRoZSByZWplY3RlZFxuICogb25lIGxlZnQgaXRzIHBhZ2VzIHN0YWxlIGF0IHRoZSBlZGdlIGZvciB0aGUgd2hvbGUgYHMtbWF4YWdlYC4gVGhlIHJldHJ5IGFza3NcbiAqIGZvciB0aGUgd2hvbGUgYXBwIGluc3RlYWQsIHdoaWNoIGlzIG9uZSB3aWxkY2FyZCAtIHRoZSBsZWFzdCBvZiB0aGUgcXVvdGEgYW55XG4gKiByZXF1ZXN0IGNhbiB0YWtlIC0gYXQgdGhlIGNvc3Qgb2YgYSBjb2xkZXIgZWRnZS5cbiAqL1xuY29uc3QgSU5WQUxJREFUSU9OX1JFVFJJRVMgPSAyO1xuY29uc3QgSU5WQUxJREFUSU9OX1JFVFJZX0RFTEFZX01TID0gMTAwMDtcblxuLyoqIFRoZSBlcnJvcnMgdGhhdCBtZWFuIFwidGhlIHF1b3RhIGlzIGZ1bGwgcmlnaHQgbm93XCIsIG5vdCBcInRoaXMgaXMgd3JvbmdcIi4gKi9cbmZ1bmN0aW9uIGlzSW52YWxpZGF0aW9uUXVvdGFFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCBuYW1lID0gKGVycm9yIGFzIHsgbmFtZT86IHVua25vd24gfSB8IG51bGwpPy5uYW1lO1xuICByZXR1cm4gbmFtZSA9PT0gXCJUb29NYW55SW52YWxpZGF0aW9uc0luUHJvZ3Jlc3NcIiB8fCBuYW1lID09PSBcIlRocm90dGxpbmdcIjtcbn1cblxuLyoqXG4gKiBUaGUgbW9zdCBjYWNoZSBrZXlzIHRvIHJlbWVtYmVyIGFzIHNlcnZlZCBzdGFsZSB3aGlsZSBhd2FpdGluZyB0aGVpclxuICogcmVnZW5lcmF0aW9uLiBBIGJhY2tncm91bmQgcmVuZGVyIHRoYXQgZmFpbHMgbmV2ZXIgY2FsbHMgYHNldGAsIHNvIHdpdGhvdXQgYVxuICogYm91bmQgaXRzIGtleSB3b3VsZCBzdGF5IGJlaGluZCBmb3IgdGhlIGxpZmUgb2YgdGhlIGluc3RhbmNlLlxuICogQHNlZSBTM0NhY2hlSGFuZGxlci5zb2Z0UmV2YWxpZGF0ZWRLZXlzXG4gKi9cbmNvbnN0IE1BWF9TT0ZUX1JFVkFMSURBVEVEX0tFWVMgPSAxMDAwO1xuXG4vKipcbiAqIEhvdyBtYW55IDEgTUIgUXVlcnkgcGFnZXMgb2Ygb25lIHRhZydzIG1hcHBpbmcgcm93cyB0byB3YWxrLiBBIGNlaWxpbmcgcmF0aGVyXG4gKiB0aGFuIGEgcmVhbCBsaW1pdDogaXQgYm91bmRzIGEgcnVuYXdheSB0YWcgaW5zdGVhZCBvZiBwYWdpbmF0aW5nIGEgd2hvbGUgdGFibGVcbiAqIG9uIGEgcmVxdWVzdCBwYXRoLiBBIHRhZyBjdXQgb2ZmIGhlcmUgaW52YWxpZGF0ZXMgdGhlIHdob2xlIGFwcCwgYmVjYXVzZSB0aGVcbiAqIHJvd3MgaXQgbmV2ZXIgcmVhZCBhcmUgcGFnZXMgd2hvc2UgZWRnZSBjb3B5IHdvdWxkIG90aGVyd2lzZSBzdGF5IHN0YWxlLlxuICovXG5jb25zdCBNQVhfVEFHX1FVRVJZX1BBR0VTID0gMjA7XG5cbi8qKlxuICogTmV4dC5qcydzIGluLXByb2Nlc3MgdGFnIG1hbmlmZXN0LCB3aGljaCBgSW5jcmVtZW50YWxDYWNoZS5nZXRgIGNvbnN1bHRzIHRvXG4gKiBkZWNpZGUgd2hldGhlciBhbiBlbnRyeSBpcyBzdGFsZSAtIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGZvdW5kXG4gKiB1bmFtYmlndW91c2x5LlxuICpcbiAqIGByZXZhbGlkYXRlVGFnKHRhZywgcHJvZmlsZSlgIGFza3MgZm9yIHN0YWxlLXdoaWxlLXJldmFsaWRhdGU6IHRoZSBlbnRyeSBpc1xuICogc2VydmVkIG9uY2UgbW9yZSB3aGlsZSBhIGJhY2tncm91bmQgcmVuZGVyIHJlcGxhY2VzIGl0LiBBIGNhY2hlIGhhbmRsZXIgaGFzXG4gKiBubyBmaWVsZCB0byBzYXkgXCJzdGFsZVwiIGluIC0gYGxhc3RNb2RpZmllZDogLTFgIG1lYW5zIGV4cGlyZWQsIHdoaWNoIGJsb2NrcyAtXG4gKiBzbyB0aGlzIHNldHMgdGhlIHRhZydzIGBzdGFsZWAgdGltZXN0YW1wIHdoZXJlIE5leHQuanMgYWxyZWFkeSBsb29rcyBmb3IgaXQsXG4gKiB3aGljaCBpcyBleGFjdGx5IHdoYXQgaXRzIG93biBgRmlsZVN5c3RlbUNhY2hlLnJldmFsaWRhdGVUYWdgIGRvZXMuIFRoZSBtb2R1bGVcbiAqIGlzIHJlYWQgZnJvbSB0aGUgbG9hZGVkLW1vZHVsZSBjYWNoZSByYXRoZXIgdGhhbiBgcmVxdWlyZWBkOiB0aGUgaGFuZGxlciBpc1xuICogYnVuZGxlZCBhcGFydCBmcm9tIHRoZSBhcHAsIGFuZCByZXNvbHZpbmcgYG5leHRgIGZyb20gaGVyZSBjb3VsZCByZWFjaCBhXG4gKiBkaWZmZXJlbnQgY29weSB0aGFuIHRoZSBzZXJ2ZXIgbG9hZGVkLCB3aG9zZSBtYW5pZmVzdCBub3RoaW5nIHJlYWRzLiBBIHN0YWxlXG4gKiBtYXJrIHdyaXR0ZW4gdGhlcmUgd291bGQgc2VydmUgdGhlIGVudHJ5IGFzIGZyZXNoLCBzbyB3aXRob3V0IGV4YWN0bHkgb25lXG4gKiBsb2FkZWQgY29weSB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gZXhwaXJpbmcgdGhlIGVudHJ5IG91dHJpZ2h0LlxuICovXG5jb25zdCBUQUdTX01BTklGRVNUX01PRFVMRSA9XG4gIFwiL25leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlL3RhZ3MtbWFuaWZlc3QuZXh0ZXJuYWwuanNcIjtcbmZ1bmN0aW9uIG5leHRUYWdzTWFuaWZlc3QoKTpcbiAgTWFwPHN0cmluZywgeyBzdGFsZT86IG51bWJlcjsgZXhwaXJlZD86IG51bWJlciB9PiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhY2hlID0gY3JlYXRlUmVxdWlyZShqb2luKHByb2Nlc3MuY3dkKCksIFwiaW5kZXguanNcIikpLmNhY2hlO1xuICBjb25zdCBsb2FkZWQgPSBPYmplY3Qua2V5cyhjYWNoZSkuZmlsdGVyKChwYXRoKSA9PlxuICAgIHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikuZW5kc1dpdGgoVEFHU19NQU5JRkVTVF9NT0RVTEUpLFxuICApO1xuICBpZiAobG9hZGVkLmxlbmd0aCAhPT0gMSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbWFuaWZlc3QgPSBjYWNoZVtsb2FkZWRbMF1dPy5leHBvcnRzPy50YWdzTWFuaWZlc3Q7XG4gIHJldHVybiBtYW5pZmVzdCBpbnN0YW5jZW9mIE1hcCA/IG1hbmlmZXN0IDogdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgQ2xvdWRGcm9udEludmFsaWRhdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdHJpYnV0aW9uIElELCB3aGVuIHRoZSBjb21wdXRlJ3MgZW52aXJvbm1lbnQgY2FuIGNhcnJ5IGl0XG4gICAqIChgTmV4dGpzR2xvYmFsQ29udGFpbmVyc2ApLlxuICAgKi9cbiAgZGlzdHJpYnV0aW9uSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE90aGVyd2lzZSwgdGhlIG5hbWUgKG5vdCB2YWx1ZSkgb2YgdGhlIFNTTSBQYXJhbWV0ZXIgaG9sZGluZyBpdC5cbiAgICpcbiAgICogT24gYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2AgdGhlIGRpc3RyaWJ1dGlvbidzIG9yaWdpbiBpcyB0aGUgZnVuY3Rpb24nc1xuICAgKiBVUkwsIHNvIHRoZSBmdW5jdGlvbidzIGVudmlyb25tZW50IG5hbWluZyB0aGUgZGlzdHJpYnV0aW9uIGJhY2sgd291bGQgYmVcbiAgICogYSBjaXJjdWxhciBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5LiBUaGUgcGFyYW1ldGVyICpuYW1lKiBpcyBzdGF0aWMgYW5kXG4gICAqIGtub3duIGF0IHN5bnRoIHRpbWU7IG9ubHkgaXRzICp2YWx1ZSogZGVwZW5kcyBvbiB0aGUgZGlzdHJpYnV0aW9uLlxuICAgKi9cbiAgZGlzdHJpYnV0aW9uSWRQYXJhbWV0ZXJOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXBwJ3MgYGJhc2VQYXRoYCwgYXMgdGhlIFVSSSBwcmVmaXggQ2xvdWRGcm9udCBjYWNoZWQgdGhlIHJlc3BvbnNlc1xuICAgKiB1bmRlci5cbiAgICogQHNlZSBjZG5JbnZhbGlkYXRpb25QYXRoc1xuICAgKi9cbiAgYmFzZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTM0NhY2hlSGFuZGxlck9wdGlvbnMge1xuICBjb250ZXh0OiBDYWNoZUhhbmRsZXJDb250ZXh0O1xuICAvKipcbiAgICogVGhlIGFwcCdzIGBiYXNlUGF0aGAsIGZvciB0ZXN0czogcmVhZCBmcm9tIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmBcbiAgICogb3RoZXJ3aXNlLlxuICAgKi9cbiAgYmFzZVBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTM0NhY2hlSGFuZGxlciBpbXBsZW1lbnRzIENhY2hlSGFuZGxlciB7XG4gIHByaXZhdGUgczNDbGllbnQ6IFMzQ2xpZW50O1xuICBwcml2YXRlIGR5bmFtb0NsaWVudDogRHluYW1vREJDbGllbnQ7XG4gIHByaXZhdGUgY2xvdWRGcm9udENsaWVudDogQ2xvdWRGcm9udENsaWVudDtcbiAgcHJpdmF0ZSBzc21DbGllbnQ6IFNTTUNsaWVudDtcbiAgcHJpdmF0ZSBidWNrZXQ6IENhY2hlQnVja2V0O1xuICBwcml2YXRlIHRhZ3M6IFRyYWNrZWRUYWdNYXJrZXJzO1xuICBwcml2YXRlIGNvbmZpZzogQXdzQ2FjaGVDb25maWc7XG4gIHByaXZhdGUgY2xvdWRGcm9udENvbmZpZzogQ2xvdWRGcm9udEludmFsaWRhdGlvbkNvbmZpZztcbiAgcHJpdmF0ZSBkZWJ1ZyA9IGdldERlYnVnKFwiY2RrLW5leHRqczpjYWNoZS1oYW5kbGVyOnMzXCIpO1xuXG4gIC8vIENhY2hlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoaXMgaW5zdGFuY2UgKGkuZS4gdGhlIGNvbXB1dGUgaW5zdGFuY2UpIG9uY2VcbiAgLy8gcmVzb2x2ZWQsIHNpbmNlIGEgZGVwbG95bWVudCdzIGRpc3RyaWJ1dGlvbiBJRCBuZXZlciBjaGFuZ2VzIGF0IHJ1bnRpbWUuXG4gIHByaXZhdGUgY2FjaGVkRGlzdHJpYnV0aW9uSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDYWNoZSBrZXlzIHRoaXMgaW5zdGFuY2Ugc2VydmVkIHN0YWxlIGJlY2F1c2Ugb2YgYSBzb2Z0IGByZXZhbGlkYXRlVGFnYCxcbiAgICogd2hvc2UgcmVnZW5lcmF0ZWQgZW50cnkgYHNldGAgaGFzIHlldCB0byB3cml0ZS5cbiAgICpcbiAgICogYHJldmFsaWRhdGVUYWcodGFnLCBwcm9maWxlKWAgaW52YWxpZGF0ZXMgQ2xvdWRGcm9udCBhdCBvbmNlLCBidXQgdGhlIG5leHRcbiAgICogcmVxdWVzdCBpcyBhbnN3ZXJlZCBmcm9tIHRoZSBzdGFsZSBlbnRyeSAtIHN0YWxlLXdoaWxlLXJldmFsaWRhdGUgLSBhbmQgdGhhdFxuICAgKiByZXNwb25zZSBjYXJyaWVzIHRoZSBlbnRyeSdzIG9yaWdpbmFsIGBzLW1heGFnZWAsIHNvIHRoZSBlZGdlIGNhY2hlcyB0aGVcbiAgICogc3RhbGUgYm9keSBhZ2Fpbi4gVGhlIGJhY2tncm91bmQgcmVuZGVyIHRoYXQgcmVwbGFjZXMgaXQgcnVucyBpbiB0aGlzIHNhbWVcbiAgICogcHJvY2Vzcywgc28gYHNldGAgY2hlY2tzIHRoaXMgc2V0IGFuZCBpbnZhbGlkYXRlcyB0aGUga2V5J3MgcGF0aHMgYSBzZWNvbmRcbiAgICogdGltZSBvbmNlIHRoZSBmcmVzaCBlbnRyeSBpcyBpbiBTMy4gV2l0aG91dCB0aGF0LCB0aGUgZWRnZSBrZXB0IHNlcnZpbmcgdGhlXG4gICAqIHByZS1yZXZhbGlkYXRpb24gcGFnZSBmb3IgdGhlIHdob2xlIGBzLW1heGFnZWAuXG4gICAqXG4gICAqIEV4cGlyaW5nIHNvZnQtcmV2YWxpZGF0ZWQgZW50cmllcyBvdXRyaWdodCBpbnN0ZWFkIHdvdWxkIGFsc28ga2VlcCB0aGUgZWRnZVxuICAgKiByaWdodCwgYnV0IGl0IHR1cm5zIGV2ZXJ5IGByZXZhbGlkYXRlVGFnKHRhZywgXCJtYXhcIilgIGludG8gYSBibG9ja2luZyByZW5kZXJcbiAgICogYXQgdGhlIG9yaWdpbiwgd2hpY2ggaXMgdGhlIHRoaW5nIGEgcHJvZmlsZSBhc2tzIG5vdCB0byBoYXBwZW4uXG4gICAqL1xuICBwcml2YXRlIHNvZnRSZXZhbGlkYXRlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKiogQHNlZSBidWlsZFRhZ01hbmlmZXN0ICovXG4gIHByaXZhdGUgYnVpbGRUYWdzOiBQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZ1tdPj4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUzNDYWNoZUhhbmRsZXJPcHRpb25zKSB7XG4gICAgdGhpcy5jb25maWcgPSByZXNvbHZlQXdzQ2FjaGVDb25maWcoKTtcblxuICAgIC8vIE9ubHkgc2V0IGZvciBDbG91ZEZyb250LWZyb250ZWQgZGVwbG95bWVudHMgKE5leHRqc0dsb2JhbEZ1bmN0aW9ucy9Db250YWluZXJzKS5cbiAgICAvLyBXaGVuIHVuc2V0LCBvbi1kZW1hbmQgcmV2YWxpZGF0aW9uIHNraXBzIENETiBpbnZhbGlkYXRpb24gYW5kIHJlbGllcyBvbiB0aGVcbiAgICAvLyBkaXN0cmlidXRpb24ncyBjYWNoZSBwb2xpY3kgVFRMIChkcml2ZW4gYnkgdGhlIG9yaWdpbidzIENhY2hlLUNvbnRyb2wgaGVhZGVyKVxuICAgIC8vIHRvIGV2ZW50dWFsbHkgcGljayB1cCBmcmVzaCBjb250ZW50LlxuICAgIHRoaXMuY2xvdWRGcm9udENvbmZpZyA9IHtcbiAgICAgIGRpc3RyaWJ1dGlvbklkOiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0RJU1RSSUJVVElPTl9JRCB8fCBcIlwiLFxuICAgICAgZGlzdHJpYnV0aW9uSWRQYXJhbWV0ZXJOYW1lOlxuICAgICAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0RJU1RSSUJVVElPTl9JRF9QQVJBTV9OQU1FIHx8IFwiXCIsXG4gICAgICBiYXNlUGF0aDogYmFzZVBhdGhQcmVmaXgob3B0aW9ucy5iYXNlUGF0aCksXG4gICAgfTtcbiAgICAvLyBPbmx5IGludmFsaWRhdGlvbiBuZWVkcyBpdCwgc28gb25seSBhIGhhbmRsZXIgYmVoaW5kIGEgZGlzdHJpYnV0aW9uIHJlYWRzXG4gICAgLy8gaXQsIGFuZCBhIG1pc3NpbmcgZmlsZSB0aGVyZSBpcyB3b3J0aCBhIHdhcm5pbmcuXG4gICAgaWYgKHRoaXMuaW52YWxpZGF0ZXNDZG4gJiYgb3B0aW9ucy5iYXNlUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNsb3VkRnJvbnRDb25maWcuYmFzZVBhdGggPSBiYXNlUGF0aFByZWZpeChcbiAgICAgICAgYXBwQmFzZVBhdGgob3B0aW9ucy5jb250ZXh0LnNlcnZlckRpc3REaXIpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIEFXUyBjbGllbnRzXG4gICAgY29uc3QgeyByZWdpb24gfSA9IHRoaXMuY29uZmlnO1xuICAgIHRoaXMuczNDbGllbnQgPSBuZXcgUzNDbGllbnQoeyByZWdpb24gfSk7XG4gICAgdGhpcy5keW5hbW9DbGllbnQgPSBuZXcgRHluYW1vREJDbGllbnQoeyByZWdpb24gfSk7XG4gICAgdGhpcy5jbG91ZEZyb250Q2xpZW50ID0gbmV3IENsb3VkRnJvbnRDbGllbnQoeyByZWdpb24gfSk7XG4gICAgdGhpcy5zc21DbGllbnQgPSBuZXcgU1NNQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IENhY2hlQnVja2V0KHRoaXMuczNDbGllbnQsIHRoaXMuY29uZmlnLmJ1Y2tldE5hbWUpO1xuICAgIC8vIFRoZSBwcm9jZXNzJ3Mgb25lIGNvcHkgb2YgdGhlIHRhZyBtYXJrZXJzLCBzaGFyZWQgd2l0aCB0aGUgYCd1c2UgY2FjaGUnYFxuICAgIC8vIGhhbmRsZXJzOiBvbmUgYHJldmFsaWRhdGVUYWdgIHdyaXRlcyBlYWNoIHRhZydzIHJvd3Mgb25jZSwgYW5kIG9uZSBsb2dcbiAgICAvLyBgUXVlcnlgIHBlciBpbnRlcnZhbCBzZXJ2ZXMgZXZlcnkgaGFuZGxlci5cbiAgICB0aGlzLnRhZ3MgPSBzaGFyZWRUYWdNYW5pZmVzdCgpO1xuXG4gICAgLy8gYHJlcy5yZXZhbGlkYXRlKClgIHJlZ2VuZXJhdGVzIGEgcGFnZSB3aXRob3V0IGdvaW5nIHRocm91Z2hcbiAgICAvLyBgcmV2YWxpZGF0ZVRhZ2AsIHNvIHRoZSBydW50aW1lIGFza3MgZm9yIHRoZSBDRE4gY29waWVzIGl0c2VsZiwgdGhyb3VnaFxuICAgIC8vIHRoaXMgaG9vayAoYGludmFsaWRhdGVSZXZhbGlkYXRlZFBhZ2VgIGluIGBzcmMvcnVudGltZS9jb3JlLnRzYCkuIEEgZ2xvYmFsXG4gICAgLy8gYmVjYXVzZSB0aGUgcnVudGltZSBhbmQgdGhpcyBoYW5kbGVyIGFyZSBzZXBhcmF0ZSBidW5kbGVzIGluIG9uZSBwcm9jZXNzLlxuICAgIC8vIEV2ZXJ5IGluc3RhbmNlIHJlZ2lzdGVycyB0aGUgc2FtZSB0aGluZywgc28gdGhlIGxhdGVzdCBvbmUgd2lubmluZyBpcyBmaW5lLlxuICAgIGlmICh0aGlzLmludmFsaWRhdGVzQ2RuKSB7XG4gICAgICAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbUkVWQUxJREFURURfUEFHRV9IT09LXSA9IChcbiAgICAgICAgcm91dGVzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBjb25zdCB7IGJhc2VQYXRoIH0gPSB0aGlzLmNsb3VkRnJvbnRDb25maWc7XG4gICAgICAgIHJldHVybiB0aGlzLmludmFsaWRhdGVDbG91ZEZyb250UGF0aHMoXG4gICAgICAgICAgcm91dGVzLmZsYXRNYXAoKHJvdXRlKSA9PiBjZG5JbnZhbGlkYXRpb25QYXRocyhyb3V0ZSwgYmFzZVBhdGgpKSxcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5idWNrZXROYW1lKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiQ0RLX05FWFRKU19DQUNIRV9CVUNLRVRfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0LCBTMyBjYWNoZSBkaXNhYmxlZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnLnRhYmxlTmFtZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkNES19ORVhUSlNfUkVWQUxJREFUSU9OX1RBQkxFX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldCwgcmV2YWxpZGF0aW9uIHRyYWNraW5nIGRpc2FibGVkXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19CVUlMRF9JRCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkNES19ORVhUSlNfQlVJTERfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldCwgY2FjaGUgaXNvbGF0aW9uIG1heSBub3Qgd29yayBjb3JyZWN0bHlcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0KFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICAgY3R4OiBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0IHwgR2V0SW5jcmVtZW50YWxSZXNwb25zZUNhY2hlQ29udGV4dCxcbiAgKTogUHJvbWlzZTxDYWNoZUhhbmRsZXJWYWx1ZSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5idWNrZXROYW1lKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzM0tleSA9IHRoaXMuYnVpbGRTM0tleShjYWNoZUtleSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5idWNrZXQuZ2V0KHMzS2V5KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICB0aGlzLmRlYnVnKGBTMyBDQUNIRSBNSVNTOiAke2NhY2hlS2V5fWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gRXZlcnkgb2JqZWN0IGlzIEpTT04gKGBwdXRKc29uYCwgYW5kIHRoZSBzZWVkZWQgYC5qc29uYCBmaWxlcyk7IG9uZVxuICAgICAgLy8gdGhhdCBkb2VzIG5vdCBwYXJzZSBpcyBhIG1pc3MsIHRocm91Z2ggdGhlIGBjYXRjaGAgYmVsb3cuXG4gICAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IHBhcnNlQ2FjaGVWYWx1ZShyZXNwb25zZSk7XG5cbiAgICAgIGlmIChhd2FpdCB0aGlzLmlzUmV2YWxpZGF0ZWQocGFyc2VkVmFsdWUsIGN0eCwgY2FjaGVLZXkpKSB7XG4gICAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIElOVkFMSURBVEVEIEJZIFRBRzogJHtjYWNoZUtleX1gKTtcbiAgICAgICAgLy8gQSByZXZhbGlkYXRlZCBgZmV0Y2hgIGVudHJ5IGhhcyB0byByZWFkIGFzIGEgbWlzcyBzbyB0aGUgcmVxdWVzdFxuICAgICAgICAvLyByZWZldGNoZXMgaW5zdGVhZCBvZiByZXVzaW5nIHRoZSBib2R5IC0gdGhlIHNhbWUgdGhpbmcgTmV4dC5qcydzXG4gICAgICAgIC8vIG93biBgRmlsZVN5c3RlbUNhY2hlYCBkb2VzIHdpdGggYHJldmFsaWRhdGVkVGFnc2AuIE9ubHkgYVxuICAgICAgICAvLyAqcmVzcG9uc2UqIGVudHJ5IGdldHMgaGFuZGVkIGJhY2sgZXhwaXJlZCwgYmVjYXVzZSBmb3IgdGhvc2UgYVxuICAgICAgICAvLyBtaXNzIGlzIHdvcnNlIHRoYW4gc3RhbGU6IHNlZSBgRVhQSVJFRF9MQVNUX01PRElGSUVEYC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTmVpdGhlciBpcyBkZWxldGVkLiBUaGUgcmVmZXRjaCBvciByZS1yZW5kZXIgdGhpcyBwcm92b2tlc1xuICAgICAgICAvLyBvdmVyd3JpdGVzIHRoZSBvYmplY3QgdGhyb3VnaCBgc2V0YCwgd2l0aCBhIGBsYXN0TW9kaWZpZWRgIHBhc3QgdGhlXG4gICAgICAgIC8vIHRhZydzIG1hcmtlcjsgZGVsZXRpbmcgaXQgaGVyZSBhcyB3ZWxsIHJhY2VkIHRoYXQgd3JpdGUsIGFuZCBhXG4gICAgICAgIC8vIGNvbmN1cnJlbnQgcmVxdWVzdCdzIGZyZXNoIGVudHJ5IGNvdWxkIGJlIHRoZSBvbmUgcmVtb3ZlZC4gS2VlcGluZ1xuICAgICAgICAvLyBhIHJlc3BvbnNlIGVudHJ5IGFsc28gbWVhbnMgYSByZW5kZXIgdGhhdCBmYWlscyBpcyBhbnN3ZXJlZCBmcm9tXG4gICAgICAgIC8vIHRoZSBsYXN0IGdvb2QgY29weSByYXRoZXIgdGhhbiBmcm9tIGEgc2hlbGwuXG4gICAgICAgIHJldHVybiBpc0ZldGNoQ2FjaGVHZXQoY3R4KVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogeyBsYXN0TW9kaWZpZWQ6IEVYUElSRURfTEFTVF9NT0RJRklFRCwgdmFsdWU6IHBhcnNlZFZhbHVlLnZhbHVlIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIEhJVDogJHtjYWNoZUtleX0gKCR7czNLZXl9KWApO1xuXG4gICAgICAvLyBXaXRob3V0IHRoZSBzdG9yZWQgdGFncy5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhc3RNb2RpZmllZDogcGFyc2VkVmFsdWUubGFzdE1vZGlmaWVkLFxuICAgICAgICB2YWx1ZTogcGFyc2VkVmFsdWUudmFsdWUsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgYWN0dWFsIGVycm9ycyAoYSBjYWNoZSBtaXNzIGlzIG5vdCBvbmU6IHNlZSBgQ2FjaGVCdWNrZXQuZ2V0YClcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJldHJpZXZpbmcgY2FjaGUgZnJvbSBTMzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHRhZyByZXZhbGlkYXRpb24gaGFzIGV4cGlyZWQgYGVudHJ5YCwgZm9yIGEgYGdldGAgd2l0aCBgY3R4YC5cbiAgICpcbiAgICogUHVibGljIGJlY2F1c2UgdGhlIGluLW1lbW9yeSBsYXllciBpbiBmcm9udCBvZiB0aGlzIGhhbmRsZXIgaGFzIHRvIGFzayB0b286XG4gICAqIGEgbWVtb3J5IGhpdCBuZXZlciByZWFjaGVzIHtAbGluayBnZXR9LCBhbmQgd2l0aG91dCB0aGlzIGNoZWNrIGFuIGluc3RhbmNlXG4gICAqIG90aGVyIHRoYW4gdGhlIG9uZSB0aGF0IHJhbiBgcmV2YWxpZGF0ZVRhZ2Aga2VwdCBhbnN3ZXJpbmcgZnJvbSBtZW1vcnkgZm9yXG4gICAqIHRoZSB3aG9sZSBtZW1vcnkgVFRMIC0gbG9uZyBlbm91Z2ggZm9yIENsb3VkRnJvbnQgdG8gY2FjaGUgdGhlIHN0YWxlIHBhZ2VcbiAgICogYWdhaW4gYWZ0ZXIgdGhlIGludmFsaWRhdGlvbi5cbiAgICpcbiAgICogV2hpY2ggdGFncyB0byBjaGVjayBkZXBlbmRzIG9uIHRoZSBraW5kLCBhbmQgTmV4dC5qcydzIG93blxuICAgKiBgRmlsZVN5c3RlbUNhY2hlLmdldGAgc3BsaXRzIHRoZSBzYW1lIHR3byB3YXlzOiBhIHJlc3BvbnNlIGVudHJ5IGlzIGNoZWNrZWRcbiAgICogYWdhaW5zdCB0aGUgdGFncyAqaXQqIHdhcyBzdG9yZWQgd2l0aCwgYnV0IGEgYGZldGNoYCBlbnRyeSBpcyBjaGVja2VkXG4gICAqIGFnYWluc3QgYFsuLi5jdHgudGFncywgLi4uY3R4LnNvZnRUYWdzXWAg4oCUIHRoZSB0YWdzIG9mIHRoZSByZXF1ZXN0IGFza2luZ1xuICAgKiBmb3IgaXQuIFRoYXQgZGlzdGluY3Rpb24gaXMgbG9hZC1iZWFyaW5nLCBiZWNhdXNlIGEgYGZldGNoYCBlbnRyeSBpcyBvbmx5XG4gICAqIGV2ZXIgc3RvcmVkIHdpdGggaXRzICpleHBsaWNpdCogYGNhY2hlOiB7IHRhZ3MgfWAgYW5kIG5ldmVyIHdpdGggdGhlXG4gICAqIGltcGxpY2l0IGBfTl9UXy88cGF0aD5gIGNoYWluLCB3aGljaCBhcnJpdmVzIG9ubHkgYXMgYGN0eC5zb2Z0VGFnc2AuXG4gICAqIFJlYWRpbmcgdGhlIHN0b3JlZCB0YWdzIGZvciBhIGBmZXRjaGAgdG9vIG1lYW50IGFuIHVudGFnZ2VkIGBmb3JjZS1jYWNoZWBcbiAgICogZmV0Y2ggaGFkIGBbXWAsIHNraXBwZWQgdGhlIGNoZWNrIGVudGlyZWx5LCBhbmQgbm8gYHJldmFsaWRhdGVQYXRoYCBjb3VsZFxuICAgKiBldmVyIGV2aWN0IGl0OiBhIGBmb3JjZS1keW5hbWljYCBwYWdlIHdob3NlIGRhdGEgY29tZXMgZnJvbSBzdWNoIGEgZmV0Y2hcbiAgICogcmUtcmVuZGVyZWQgb24gZXZlcnkgcmVxdWVzdCBhbmQgc3RpbGwgc2VydmVkIHRoZSBzYW1lIGJvZHkgZm9yZXZlci5cbiAgICogTWVhc3VyZWQgYWdhaW5zdCBuZXh0LmpzJ3MgYHRlc3QvZTJlL2FwcC1kaXIvcmV2YWxpZGF0ZS1wYXRoLXdpdGgtcmV3cml0ZXNgLlxuICAgKlxuICAgKiBgY2FjaGVLZXlgIGlzIHRoZSBrZXkgdGhlIGVudHJ5IHdhcyByZWFkIHVuZGVyLiBBIHJlc3BvbnNlIGVudHJ5IGZvdW5kXG4gICAqIHN0YWxlIGlzIHJlbWVtYmVyZWQgYnkgaXQsIGZvciBgc2V0YCB0byBpbnZhbGlkYXRlIENsb3VkRnJvbnQgYWdhaW4gb25jZVxuICAgKiBpdHMgcmVnZW5lcmF0aW9uIGxhbmRzOiBzZWUge0BsaW5rIHNvZnRSZXZhbGlkYXRlZEtleXN9LlxuICAgKi9cbiAgYXN5bmMgaXNSZXZhbGlkYXRlZChcbiAgICBlbnRyeTogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IHRhZ3M/OiBzdHJpbmdbXTsgdmFsdWU/OiB1bmtub3duIH0sXG4gICAgY3R4OiBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0IHwgR2V0SW5jcmVtZW50YWxSZXNwb25zZUNhY2hlQ29udGV4dCxcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnRhYmxlTmFtZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjaGVja1RhZ3MgPSBpc0ZldGNoQ2FjaGVHZXQoY3R4KVxuICAgICAgPyBbLi4uKGN0eC50YWdzID8/IFtdKSwgLi4uKGN0eC5zb2Z0VGFncyA/PyBbXSldXG4gICAgICA6IGVudHJ5VGFncyhlbnRyeSk7XG4gICAgaWYgKGNoZWNrVGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmNoZWNrSWZSZXZhbGlkYXRlZChcbiAgICAgIGVudHJ5Lmxhc3RNb2RpZmllZCA/PyAwLFxuICAgICAgY2hlY2tUYWdzLFxuICAgICk7XG4gICAgaWYgKHN0YXRlID09PSBcInN0YWxlXCIgJiYgIWlzRmV0Y2hDYWNoZUdldChjdHgpKSB7XG4gICAgICB0aGlzLm5vdGVTb2Z0UmV2YWxpZGF0ZWQoY2FjaGVLZXkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUgPT09IFwiZXhwaXJlZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbWVtYmVyIHRoYXQgYGNhY2hlS2V5YCB3YXMgc2VydmVkIHN0YWxlLCB3aGVuIHRoZXJlIGlzIGEgZGlzdHJpYnV0aW9uXG4gICAqIHdob3NlIGNvcHkgb2YgaXQgd2lsbCBuZWVkIGludmFsaWRhdGluZyBhZ2Fpbi4gU2VlXG4gICAqIHtAbGluayBzb2Z0UmV2YWxpZGF0ZWRLZXlzfS5cbiAgICovXG4gIHByaXZhdGUgbm90ZVNvZnRSZXZhbGlkYXRlZChjYWNoZUtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmludmFsaWRhdGVzQ2RuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUoY2FjaGVLZXkpO1xuICAgIGlmICh0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMuc2l6ZSA+PSBNQVhfU09GVF9SRVZBTElEQVRFRF9LRVlTKSB7XG4gICAgICAvLyBJbnNlcnRpb24gb3JkZXI6IHRoZSBmaXJzdCBrZXkgaXMgdGhlIG9uZSB3YWl0aW5nIGxvbmdlc3QuXG4gICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUob2xkZXN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zb2Z0UmV2YWxpZGF0ZWRLZXlzLmFkZChjYWNoZUtleSk7XG4gIH1cblxuICBhc3luYyBzZXQoXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICBkYXRhOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgfCBudWxsLFxuICAgIGN0eDogU2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dCB8IFNldEluY3JlbWVudGFsUmVzcG9uc2VDYWNoZUNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgLy8gRGVsZXRlIGZyb20gUzMgYW5kIER5bmFtb0RCXG4gICAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIERFTEVURTogJHtjYWNoZUtleX1gKTtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmJ1Y2tldE5hbWUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZW50cnkgaXMgZ29uZSwgc28gdGhlcmUgaXMgbm8gcmVnZW5lcmF0aW9uIGxlZnQgdG8gd2FpdCBmb3IuXG4gICAgICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUoY2FjaGVLZXkpO1xuXG4gICAgICAgIC8vIEJ1aWxkIFMzIGtleSB3aXRob3V0IG5lZWRpbmcgdG8ga25vdyB0aGUga2luZFxuICAgICAgICBjb25zdCBzM0tleSA9IHRoaXMuYnVpbGRTM0tleShjYWNoZUtleSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgZW50cnkncyB0YWdzIGJlZm9yZSB0aGUgb2JqZWN0IGlzIGdvbmU6IHRoZXkgYXJlIHRoZSBvbmx5XG4gICAgICAgIC8vIHdheSB0byBuYW1lIGl0cyBtYXBwaW5nIHJvd3MsIHdob3NlIHNvcnQga2V5IGlzIGB0YWcjczNLZXlgIGFuZCBzb1xuICAgICAgICAvLyBjYW5ub3QgYmUgcXVlcmllZCBmcm9tIHRoZSBrZXkgc2lkZS4gU2VlIGBzdG9yZWRFbnRyeVRhZ3NgLlxuICAgICAgICBjb25zdCB0YWdzID0gYXdhaXQgdGhpcy5zdG9yZWRFbnRyeVRhZ3MoczNLZXksIGN0eCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zM0NsaWVudC5zZW5kKFxuICAgICAgICAgIG5ldyBEZWxldGVPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5jb25maWcuYnVja2V0TmFtZSxcbiAgICAgICAgICAgIEtleTogczNLZXksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIERFTEVURUQ6ICR7czNLZXl9YCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVEeW5hbW9EQlRhZ01hcHBpbmdzKHMzS2V5LCB0YWdzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBgZW50cnlUYWdzYCwgbm90IGBnZXRUYWdzKGN0eClgIGFsb25lOiBmb3IgYSBwYWdlIG9yIHJvdXRlIHJlc3BvbnNlXG4gICAgICAvLyBgY3R4YCBjYXJyaWVzIG9ubHkgYHsgY2FjaGVDb250cm9sLCBpc1JvdXRlUFBSRW5hYmxlZCwgaXNGYWxsYmFjayB9YCDigJRcbiAgICAgIC8vIGBSZXNwb25zZUNhY2hlLnNldGAgYnVpbGRzIGl0IHRoYXQgd2F5IGFuZCBgSW5jcmVtZW50YWxDYWNoZS5zZXRgXG4gICAgICAvLyBmb3J3YXJkcyBpdCB1bmNoYW5nZWQg4oCUIHNvIHRoZSB0YWdzIGxpdmUgaW4gdGhlIHJlbmRlcidzXG4gICAgICAvLyBgeC1uZXh0LWNhY2hlLXRhZ3NgIGhlYWRlciBhbmQgbm93aGVyZSBlbHNlLiBSZWFkaW5nIG9ubHkgYGN0eGAgbWVhbnQgbm9cbiAgICAgIC8vIHJ1bnRpbWUtcmVuZGVyZWQgcGFnZSBldmVyIGdvdCBhIG1hcHBpbmcgcm93LCBhbmQgYSBwYWdlIHRoYXQgaXMgbm90IGluXG4gICAgICAvLyB0aGUgYnVpbGQncyB0YWcgbWFuaWZlc3QgbmFtZXMgbm9uZSBlaXRoZXI6IGEgbGF0ZXJcbiAgICAgIC8vIGByZXZhbGlkYXRlVGFnYCBmb3VuZCBub3RoaW5nIHRvIGludmFsaWRhdGUgYW5kIENsb3VkRnJvbnQga2VwdCBzZXJ2aW5nXG4gICAgICAvLyB0aGUgc3RhbGUgSFRNTCBhbmQgUlNDIHBheWxvYWQgZm9yIHRoZSB3aG9sZSBgcy1tYXhhZ2VgLiBTYW1lIHNvdXJjZSB0aGVcbiAgICAgIC8vIHJlYWQgcGF0aCBhYm92ZSBhbHJlYWR5IGZhbGxzIGJhY2sgdG8uXG4gICAgICBjb25zdCB0YWdzID0gZW50cnlUYWdzKHsgdGFnczogZ2V0VGFncyhjdHgpLCB2YWx1ZTogZGF0YSB9KTtcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBTMyBDQUNIRSBTRVQ6IEtleTogJHtjYWNoZUtleX0sIHRhZ3M6ICR7dGFncy5sZW5ndGggPyB0YWdzIDogXCJub25lXCJ9YCxcbiAgICAgICk7XG5cbiAgICAgIGlmICghdGhpcy5jb25maWcuYnVja2V0TmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHMzS2V5ID0gdGhpcy5idWlsZFMzS2V5KGNhY2hlS2V5KTtcblxuICAgICAgLy8gQ3JlYXRlIENhY2hlSGFuZGxlclZhbHVlIHN0cnVjdHVyZSBmb3IgUzMgc3RvcmFnZSB3aXRoIHRhZ3NcbiAgICAgIGNvbnN0IGNhY2hlSGFuZGxlclZhbHVlOiBDYWNoZUhhbmRsZXJWYWx1ZSA9IHtcbiAgICAgICAgLy8gT24gdGhlIG1hcmtlciBjbG9jaywgc2luY2UgdGhhdCBpcyB3aGF0IGl0IGlzIGNvbXBhcmVkIHdpdGguXG4gICAgICAgIGxhc3RNb2RpZmllZDogbWFya2VyQ2xvY2soKSxcbiAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSB0YWdzIHdpdGggdGhlIGNhY2hlIGVudHJ5IGZvciByZXZhbGlkYXRpb24gY2hlY2tpbmdcbiAgICAgIGNvbnN0IGNhY2hlRW50cnlXaXRoVGFncyA9IHtcbiAgICAgICAgLi4uY2FjaGVIYW5kbGVyVmFsdWUsXG4gICAgICAgIHRhZ3MsXG4gICAgICB9O1xuXG4gICAgICAvLyBTZXJpYWxpemUgd2l0aCBjdXN0b20gaGFuZGxpbmcgZm9yIE1hcCBhbmQgQnVmZmVyIG9iamVjdHNcbiAgICAgIGNvbnN0IGJvZHkgPSBzZXJpYWxpemVDYWNoZVZhbHVlKGNhY2hlRW50cnlXaXRoVGFncyk7XG5cbiAgICAgIC8vIEFsd2F5cyBKU09OIHNpbmNlIHdlIHN0b3JlIENhY2hlSGFuZGxlclZhbHVlXG4gICAgICBhd2FpdCB0aGlzLmJ1Y2tldC5wdXRKc29uKHMzS2V5LCBib2R5KTtcblxuICAgICAgdGhpcy5kZWJ1ZyhgUzMgQ0FDSEUgU1RPUkVEOiAke2NhY2hlS2V5fSAoJHtkYXRhLmtpbmR9KWApO1xuXG4gICAgICAvLyBUaGUgcmVnZW5lcmF0aW9uIG9mIGFuIGVudHJ5IHNlcnZlZCBzdGFsZTogQ2xvdWRGcm9udCBtYXkgaGF2ZSBjYWNoZWRcbiAgICAgIC8vIHRoYXQgc3RhbGUgcmVzcG9uc2UgYWZ0ZXIgYHJldmFsaWRhdGVUYWdgJ3MgaW52YWxpZGF0aW9uLCBzbyB0aGUga2V5J3NcbiAgICAgIC8vIHBhdGhzIGdvIG9uY2UgbW9yZSBub3cgdGhhdCBTMyBob2xkcyB0aGUgZnJlc2ggb25lLlxuICAgICAgaWYgKHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUoY2FjaGVLZXkpKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5zM0tleVRvSW52YWxpZGF0aW9uUGF0aChzM0tleSk7XG4gICAgICAgIGlmIChyb3V0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5kZWJ1ZyhgU09GVCBSRVZBTElEQVRJT04gUkVHRU5FUkFURUQ6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlQ2xvdWRGcm9udFBhdGhzKFxuICAgICAgICAgICAgY2RuSW52YWxpZGF0aW9uUGF0aHMocm91dGUsIHRoaXMuY2xvdWRGcm9udENvbmZpZy5iYXNlUGF0aCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0YWctdG8tY2FjaGUta2V5IG1hcHBpbmdzIGluIER5bmFtb0RCIGZvciByZXZhbGlkYXRpb25cbiAgICAgIGlmICh0YWdzLmxlbmd0aCA+IDAgJiYgdGhpcy5tYXBzVGFnc1RvUGF0aHMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgU1RPUklORyBUQUdTOiAke2NhY2hlS2V5fSAtPiBbJHt0YWdzLmpvaW4oXCIsIFwiKX1dYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmVEeW5hbW9EQlRhZ01hcHBpbmdzKHMzS2V5LCB0YWdzKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHN0b3JpbmcgY2FjaGUgdG8gUzM6XCIsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXZhbGlkYXRlVGFnKFxuICAgIHRhZzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgZHVyYXRpb25zPzogUmV2YWxpZGF0ZUR1cmF0aW9ucyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFncyA9IEFycmF5LmlzQXJyYXkodGFnKSA/IHRhZyA6IFt0YWddO1xuICAgIHRoaXMuZGVidWcoYFJFVkFMSURBVElORyBUQUdTOiBbJHt0YWdzLmpvaW4oXCIsIFwiKX1dYCk7XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnLnRhYmxlTmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlY29yZCB0aGUgcmV2YWxpZGF0aW9uIGFnYWluc3QgZWFjaCB0YWcgaXRzZWxmLCBub3Qgb25seSBhZ2FpbnN0IHRoZVxuICAgIC8vIGNhY2hlIGtleXMgYWxyZWFkeSBtYXBwZWQgdG8gaXQ6IGBjaGVja0lmUmV2YWxpZGF0ZWRgIHJlYWRzIHRoZXNlIG1hcmtlclxuICAgIC8vIHJvd3MsIGFuZCBhIGJ1aWxkLXRpbWUgcHJlcmVuZGVyIGhhcyBubyBtYXBwaW5nIHJvd3MgYXQgYWxsLlxuICAgIGNvbnN0IHJlY29yZGVkID0gYXdhaXQgdGhpcy50YWdzLnVwZGF0ZSh0YWdzLCBkdXJhdGlvbnMpO1xuXG4gICAgaWYgKCF0aGlzLm1hcHNUYWdzVG9QYXRocykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYmFzZVBhdGggfSA9IHRoaXMuY2xvdWRGcm9udENvbmZpZztcbiAgICBpZiAoIXJlY29yZGVkKSB7XG4gICAgICAvLyBPdGhlciBpbnN0YW5jZXMgbWF5IG5ldmVyIGxlYXJuIG9mIHRoaXMgcmV2YWxpZGF0aW9uLCBzbyBubyBwYXRoIGxpc3RcbiAgICAgIC8vIGlzIGVub3VnaDogZHJvcCB0aGUgd2hvbGUgYXBwIGZyb20gQ2xvdWRGcm9udCByYXRoZXIgdGhhbiBzZXJ2ZSBzdGFsZVxuICAgICAgLy8gcGFnZXMgdW50aWwgdGhlaXIgVFRMLlxuICAgICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlQ2xvdWRGcm9udFBhdGhzKHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMoYmFzZVBhdGgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZXR0bGVkIHJhdGhlciB0aGFuIGBhbGxgOiBvbmUgdGFnJ3MgdGhyb3R0bGVkIFF1ZXJ5IG11c3Qgbm90IGRyb3AgdGhlXG4gICAgLy8gQ2xvdWRGcm9udCBwYXRocyBldmVyeSBvdGhlciB0YWcgcmVzb2x2ZWQuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRhZ3MubWFwKCh0KSA9PiB0aGlzLnRhZ1JvdXRlcyh0KSksXG4gICAgKTtcbiAgICBjb25zdCByb3V0ZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHdob2xlQXBwID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVhZGluZyB0YWcgbWFwcGluZ3M6XCIsIHJlc3VsdC5yZWFzb24pO1xuICAgICAgICAvLyBUaGUgdGFnJ3MgZW50cmllcyBhcmUgcmV2YWxpZGF0ZWQgYXQgdGhlIG9yaWdpbiB3aGlsZSBub3RoaW5nIG5hbWVzXG4gICAgICAgIC8vIHRoZWlyIENsb3VkRnJvbnQgcGF0aHMuIFRoZSBzYW1lIGFuc3dlciBhcyBhIHRhZyBjdXQgc2hvcnQgYnlcbiAgICAgICAgLy8gYE1BWF9UQUdfUVVFUllfUEFHRVNgOiB0aGUgd2hvbGUgYXBwLCBuZXZlciBhIHN0YWxlIHBhZ2UuXG4gICAgICAgIHdob2xlQXBwID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByb3V0ZXMucHVzaCguLi5yZXN1bHQudmFsdWUucm91dGVzKTtcbiAgICAgIHdob2xlQXBwIHx8PSByZXN1bHQudmFsdWUudHJ1bmNhdGVkO1xuICAgIH1cblxuICAgIC8vIEludmFsaWRhdGUgdGhlIENETiBlZGdlIGNhY2hlIHNvIENsb3VkRnJvbnQtZnJvbnRlZCBkZXBsb3ltZW50cyBkb24ndFxuICAgIC8vIGtlZXAgc2VydmluZyBzdGFsZSByZXNwb25zZXMgdW50aWwgdGhlIGNhY2hlIHBvbGljeSdzIFRUTCBuYXR1cmFsbHlcbiAgICAvLyBleHBpcmVzLiBPbmUgcmVxdWVzdCBmb3IgZXZlcnkgdGFnIGF0IG9uY2U6IHNlZVxuICAgIC8vIGBNQVhfV0lMRENBUkRfUEFUSFNfUEVSX0lOVkFMSURBVElPTmAgZm9yIHdoeSBuZXZlciBzZXZlcmFsLlxuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZUNsb3VkRnJvbnRQYXRocyhcbiAgICAgIHdob2xlQXBwXG4gICAgICAgID8gd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyhiYXNlUGF0aClcbiAgICAgICAgOiByb3V0ZXMuZmxhdE1hcCgocm91dGUpID0+IGNkbkludmFsaWRhdGlvblBhdGhzKHJvdXRlLCBiYXNlUGF0aCkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJvdXRlcyBDbG91ZEZyb250IGNvdWxkIGJlIGhvbGRpbmcgYSByZXNwb25zZSBmb3IgYHRhZ2AgdW5kZXIgLVxuICAgKiBgdHJ1bmNhdGVkYCB3aGVuIHRoZXkgY291bGQgbm90IGFsbCBiZSBuYW1lZDogbW9yZSBtYXBwaW5nIHJvd3MgdGhhblxuICAgKiB7QGxpbmsgTUFYX1RBR19RVUVSWV9QQUdFU30sIG9yIG5vIGJ1aWxkIHRhZyBtYW5pZmVzdCB0byByZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0YWdSb3V0ZXMoXG4gICAgdGFnOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyByb3V0ZXM6IHN0cmluZ1tdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IFt7IGl0ZW1zLCB0cnVuY2F0ZWQgfSwgYnVpbGRUYWdzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMucXVlcnlUYWdNYXBwaW5ncyh0YWcpLFxuICAgICAgdGhpcy5idWlsZFRhZ01hbmlmZXN0KCksXG4gICAgXSk7XG4gICAgLy8gRXh0cmFjdCBTMyBrZXlzIGZyb20gc29ydCBrZXlzIChmb3JtYXQ6IFwidGFnI3MzS2V5XCIpLiBTcGxpdCBhdCB0aGUgdGFnJ3NcbiAgICAvLyBvd24gbGVuZ3RoIHJhdGhlciB0aGFuIGF0IHRoZSBmaXJzdCBcIiNcIjogYSB0YWcgaXMgYXBwLWRlZmluZWQgYW5kIG1heVxuICAgIC8vIGNvbnRhaW4gb25lLCBhbmQgYHJldmFsaWRhdGVUYWcoXCJ1c2VyIzQyXCIpYCB0aGVuIHlpZWxkZWRcbiAgICAvLyBcIjQyIzxidWlsZElkPi9hY2NvdW50Lmpzb25cIiDigJQgd2hvc2UgaW52YWxpZGF0aW9uIHBhdGhcbiAgICAvLyAoXCIvNDIjPGJ1aWxkSWQ+L2FjY291bnRcIikgbmFtZXMgbm90aGluZyBDbG91ZEZyb250IGNhY2hlZCwgc28gdGhlIGVkZ2VcbiAgICAvLyBrZXB0IHNlcnZpbmcgdGhlIHN0YWxlIHBhZ2UuXG4gICAgLy9cbiAgICAvLyBUaGUgc2FtZSBgI2AgbWFrZXMgYGJlZ2luc193aXRoKHNrLCBcInVzZXIjXCIpYCBtYXRjaCByb3dzIHRoYXQgYXJlIG5vdFxuICAgIC8vIGB1c2VyYCdzIGF0IGFsbDogdGhlIG1hcmtlciByb3cgb2YgdGFnIGB1c2VyIzQyYCAoc2sgYHVzZXIjNDJgKSBhbmQgZXZlcnlcbiAgICAvLyBtYXBwaW5nIHJvdyBvZiBpdCAoYHVzZXIjNDIjPGJ1aWxkSWQ+L+KApmApLiBXaGF0IGlzIGxlZnQgYWZ0ZXIgdGhlIHByZWZpeFxuICAgIC8vIGlzIGFuIFMzIGtleSBvbmx5IGlmIGl0IHN0YXJ0cyB3aXRoIHRoZSBidWlsZCdzIG93biBwcmVmaXgsIHdoaWNoIGlzIGhvd1xuICAgIC8vIGBidWlsZFMzS2V5YCB3cml0ZXMgZXZlcnkgb25lLlxuICAgIGNvbnN0IHByZWZpeExlbmd0aCA9IHRhZy5sZW5ndGggKyAxO1xuICAgIGNvbnN0IGtleVByZWZpeCA9IHRoaXMuY29uZmlnLmJ1aWxkSWQgPyBgJHt0aGlzLmNvbmZpZy5idWlsZElkfS9gIDogXCJcIjtcbiAgICBjb25zdCBzM0tleXMgPSBpdGVtc1xuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5zaz8uUz8uc2xpY2UocHJlZml4TGVuZ3RoKSlcbiAgICAgIC5maWx0ZXIoKHMzS2V5KTogczNLZXkgaXMgc3RyaW5nID0+XG4gICAgICAgIEJvb2xlYW4oczNLZXkgJiYgczNLZXkuc3RhcnRzV2l0aChrZXlQcmVmaXgpKSxcbiAgICAgICk7XG4gICAgLy8gVGhlIGJ1aWxkLXRpbWUgcHJlcmVuZGVycyBjYXJyeWluZyB0aGUgdGFnLCB3aGljaCBubyBgc2V0YCB3cm90ZSBhIHJvd1xuICAgIC8vIGZvci5cbiAgICBmb3IgKGNvbnN0IGNhY2hlS2V5IG9mIGJ1aWxkVGFncz8uZ2V0KHRhZykgPz8gW10pIHtcbiAgICAgIHMzS2V5cy5wdXNoKHRoaXMuYnVpbGRTM0tleShjYWNoZUtleSkpO1xuICAgIH1cblxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgVEFHICR7dGFnfTogRm91bmQgJHtzM0tleXMubGVuZ3RofSBjYWNoZSBlbnRyaWVzIHRvIGludmFsaWRhdGVgLFxuICAgICk7XG5cbiAgICAvLyBUaGUgbWFwcGluZyByb3dzIHRoZW1zZWx2ZXMgYXJlIGRlbGliZXJhdGVseSBsZWZ0IGFsb25lLiBTdGFtcGluZ1xuICAgIC8vIGByZXZhbGlkYXRlZEF0YCBvbiBlYWNoIGB0YWcjY2FjaGVLZXlgIHJvdyBpcyB3aGF0IHRoaXMgdXNlZCB0byBkbywgYW5kXG4gICAgLy8gbm90aGluZyBoYXMgcmVhZCB0aGF0IGF0dHJpYnV0ZSBzaW5jZSBgY2hlY2tJZlJldmFsaWRhdGVkYCBiZWdhbiByZWFkaW5nXG4gICAgLy8gdGhlIGJhcmUtdGFnIG1hcmtlciByb3cgd3JpdHRlbiBhYm92ZSDigJQgc28gdGhlIHdyaXRlcyB3ZXJlIGRlYWQsIGFuZCB0aGV5XG4gICAgLy8gd2VyZSBkZWFkICppbiBmcm9udCBvZiogdGhlIGludmFsaWRhdGlvbi4gT25lIHRocm90dGxlZCBgVXBkYXRlSXRlbWBcbiAgICAvLyByZWplY3RlZCB0aGUgYmF0Y2gsIHRoZSBDbG91ZEZyb250IGludmFsaWRhdGlvbiBuZXZlciByYW4sIGFuZCB0aGUgb25seVxuICAgIC8vIHRyYWNlIHdhcyBhIGBjb25zb2xlLmVycm9yYCB3aGlsZSB0aGUgZWRnZSBrZXB0IHNlcnZpbmcgdGhlIHN0YWxlIHBhZ2UuXG4gICAgLy9cbiAgICAvLyBEZWxpYmVyYXRlbHkgbm90IGRlbGV0aW5nIHRoZSB0YWcncyBTMyBvYmplY3RzIGVpdGhlci4gVGhlIG1hcmtlciByb3dcbiAgICAvLyBhYm92ZSBpcyB3aGF0IGludmFsaWRhdGVzIHRoZW06IGBnZXRgIGNvbXBhcmVzIGl0IGFnYWluc3QgZWFjaCBlbnRyeSdzXG4gICAgLy8gb3duIGBsYXN0TW9kaWZpZWRgIGFuZCBoYW5kcyB0aGUgZW50cnkgYmFjayBleHBpcmVkLCB3aGljaCBpcyB0aGUgc2lnbmFsXG4gICAgLy8gdGhhdCBtYWtlcyBOZXh0LmpzIHJlLXJlbmRlciAqdGhpcyogcm91dGUgYW5kIHN0b3JlIHRoZSByZXN1bHQgKHNlZVxuICAgIC8vIGBFWFBJUkVEX0xBU1RfTU9ESUZJRURgKS4gRGVsZXRpbmcgdGhlIG9iamVjdCBpbnN0ZWFkIHR1cm5lZCB0aGUgbmV4dFxuICAgIC8vIHJlcXVlc3QgaW50byBhIGhhcmQgbWlzcywgYW5kIGEgaGFyZCBtaXNzIG9uIGEgUFBSIHJvdXRlIGlzIGFuc3dlcmVkIGZyb21cbiAgICAvLyB0aGUgcm91dGUncyBmYWxsYmFjayBzaGVsbCDigJQgdW5jYWNoZWFibGUsIGFuZCBuZXZlciB1cGdyYWRlZCBiYWNrIGludG8gYVxuICAgIC8vIGNvbmNyZXRlIGVudHJ5LCBzbyBvbmUgYHJldmFsaWRhdGVUYWdgIGxlZnQgdGhlIHBhZ2UgcmVzdW1pbmdcbiAgICAvLyBkeW5hbWljYWxseSBmb3IgZ29vZC5cbiAgICBjb25zdCByb3V0ZXMgPSBzM0tleXNcbiAgICAgIC5tYXAoKHMzS2V5KSA9PiB0aGlzLnMzS2V5VG9JbnZhbGlkYXRpb25QYXRoKHMzS2V5KSlcbiAgICAgIC5maWx0ZXIoKHJvdXRlKTogcm91dGUgaXMgc3RyaW5nID0+IHJvdXRlICE9PSB1bmRlZmluZWQpO1xuICAgIC8vIEEgYHJldmFsaWRhdGVQYXRoYCBuYW1lcyBpdHMgcGF0aCBpbiB0aGUgdGFnIGl0c2VsZiwgd2hpY2ggaXMgdGhlIG9ubHlcbiAgICAvLyB3YXkgdG8gcmVhY2ggYSBidWlsZC10aW1lIHByZXJlbmRlcidzIENETiBjb3B5IHdoZW4gaXQgaGFzIG5vIG1hcHBpbmdcbiAgICAvLyByb3cuXG4gICAgcm91dGVzLnB1c2goLi4uaW1wbGljaXRUYWdQYXRocyh0YWcpKTtcbiAgICByZXR1cm4geyByb3V0ZXMsIHRydW5jYXRlZDogdHJ1bmNhdGVkIHx8ICFidWlsZFRhZ3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQtdGltZSBwcmVyZW5kZXJzJyBjYWNoZSBrZXlzIGJ5IHRhZyAoe0BsaW5rIElOSVRfQ0FDSEVfVEFHX01BTklGRVNUfSksXG4gICAqIHJlYWQgZnJvbSB0aGUgY2FjaGUgYnVja2V0IG9uY2UgcGVyIGluc3RhbmNlLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoYXRcbiAgICogZmFpbGVkLCB0byBiZSByZWFkIGFnYWluIG5leHQgdGltZS4gQSBwcmVyZW5kZXIgaXMgd3JpdHRlbiBieSB0aGUgYWRhcHRlcixcbiAgICogbmV2ZXIgdGhyb3VnaCBgc2V0YCwgc28gdGhpcyBpcyB0aGUgb25seSByZWNvcmQgb2Ygd2hpY2ggdGFncyBuYW1lIGl0c1xuICAgKiBDbG91ZEZyb250IHBhdGhzLCBhbmQgaXQgaXMgc2VydmVkIHdpdGggYSB5ZWFyLWxvbmcgYHMtbWF4YWdlYC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUYWdNYW5pZmVzdCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZD4ge1xuICAgIHRoaXMuYnVpbGRUYWdzID8/PSB0aGlzLmJ1Y2tldFxuICAgICAgLmdldChgJHt0aGlzLmNvbmZpZy5idWlsZElkfS8ke0lOSVRfQ0FDSEVfVEFHX01BTklGRVNUfWApXG4gICAgICAvLyBOb25lIGlzIG5vcm1hbDogb25seSB0YWdnZWQgcHJlcmVuZGVycyB3cml0ZSBvbmUuXG4gICAgICAudGhlbigob2JqZWN0KSA9PiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKEpTT04ucGFyc2Uob2JqZWN0ID8/IFwie31cIikpKSk7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRUYWdzLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5idWlsZFRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgcmVhZCB0aGUgYnVpbGQncyB0YWcgbWFuaWZlc3Q6XCIsIGVycm9yKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgbWFwcGluZyByb3cgZm9yIGB0YWdgLCBmb2xsb3dpbmcgYExhc3RFdmFsdWF0ZWRLZXlgLCBhbmQgd2hldGhlclxuICAgKiB7QGxpbmsgTUFYX1RBR19RVUVSWV9QQUdFU30gY3V0IHRoZSB3YWxrIHNob3J0LlxuICAgKlxuICAgKiBEeW5hbW9EQiBjYXBzIGEgUXVlcnkgYXQgMSBNQiBvZiBpdGVtcyByZWdhcmRsZXNzIG9mIGhvdyBtYW55IG1hdGNoLCBhbmRcbiAgICogdGhlcmUgaXMgb25lIHJvdyBwZXIgdGFnZ2VkIGVudHJ5IGEgcnVudGltZSBgc2V0YCB3cm90ZSwgc28gYSBsYXJnZSBzaXRlXG4gICAqIHBhc3NlcyAxIE1CIG9uIGEgY29tbW9uIHRhZy4gU3RvcHBpbmcgYXQgdGhlXG4gICAqIGZpcnN0IHBhZ2UgaW52YWxpZGF0ZXMgb25seSB0aGF0IHBhZ2UncyBlbnRyaWVzIHdoaWxlIHN0aWxsIHJlcG9ydGluZ1xuICAgKiBzdWNjZXNzLCB3aGljaCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHJldmFsaWRhdGlvbiBoYXZpbmcgd29ya2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBxdWVyeVRhZ01hcHBpbmdzKFxuICAgIHRhZzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgaXRlbXM6IFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPltdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT5bXSA9IFtdO1xuICAgIGxldCBleGNsdXNpdmVTdGFydEtleTogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBwYWdlcyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZHluYW1vQ2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBRdWVyeUNvbW1hbmQoe1xuICAgICAgICAgIFRhYmxlTmFtZTogdGhpcy5jb25maWcudGFibGVOYW1lLFxuICAgICAgICAgIEtleUNvbmRpdGlvbkV4cHJlc3Npb246IFwicGsgPSA6cGsgQU5EIGJlZ2luc193aXRoKHNrLCA6c2tQcmVmaXgpXCIsXG4gICAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgXCI6cGtcIjogeyBTOiB0aGlzLmNvbmZpZy5idWlsZElkIH0sXG4gICAgICAgICAgICBcIjpza1ByZWZpeFwiOiB7IFM6IGAke3RhZ30jYCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgRXhjbHVzaXZlU3RhcnRLZXk6IGV4Y2x1c2l2ZVN0YXJ0S2V5LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBpdGVtcy5wdXNoKC4uLihyZXNwb25zZS5JdGVtcyA/PyBbXSkpO1xuICAgICAgZXhjbHVzaXZlU3RhcnRLZXkgPSByZXNwb25zZS5MYXN0RXZhbHVhdGVkS2V5O1xuICAgICAgcGFnZXMrKztcbiAgICB9IHdoaWxlIChleGNsdXNpdmVTdGFydEtleSAmJiBwYWdlcyA8IE1BWF9UQUdfUVVFUllfUEFHRVMpO1xuXG4gICAgY29uc3QgdHJ1bmNhdGVkID0gZXhjbHVzaXZlU3RhcnRLZXkgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAodHJ1bmNhdGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTdG9wcGVkIHBhZ2luYXRpbmcgdGFnIFwiJHt0YWd9XCIgYWZ0ZXIgJHtwYWdlc30gcGFnZXMgYCArXG4gICAgICAgICAgYCgke2l0ZW1zLmxlbmd0aH0gZW50cmllcyk7IGludmFsaWRhdGluZyB0aGUgd2hvbGUgYXBwIGluc3RlYWQuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IGl0ZW1zLCB0cnVuY2F0ZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnNlcyBgYnVpbGRTM0tleWAgdG8gcmVjb3ZlciB0aGUgcm91dGUgdGhlIHJlc3BvbnNlIHdhcyBjYWNoZWQgZm9yLCBmb3JcbiAgICoge0BsaW5rIGNkbkludmFsaWRhdGlvblBhdGhzfSB0byB0dXJuIGludG8gdGhlIFVSSXMgQ2xvdWRGcm9udCBob2xkcyBpdCB1bmRlciwgb3JcbiAgICogYHVuZGVmaW5lZGAgZm9yIGEga2V5IHRoYXQgbmFtZXMgbm8gY2FjaGVkIFVSSS5cbiAgICpcbiAgICogVHdvIGtpbmRzIG9mIG1hcHBpbmcgcm93IGRvIG5vdDogYSBkeW5hbWljIHJvdXRlIHRlbXBsYXRlIChgYmxvZy9bc2x1Z10uanNvbmAsXG4gICAqIHdoaWNoIHRoZSBhZGFwdGVyJ3Mgc2VlZGVkIGVudHJpZXMgaW5jbHVkZSksIGFuZCBhIGZldGNoLWNhY2hlIGVudHJ5LCB3aG9zZVxuICAgKiBrZXkgaXMgYW4gb3BhcXVlIGhhc2ggcmF0aGVyIHRoYW4gYSByb3V0ZS4gQm90aCB3b3VsZCBpbnZhbGlkYXRlIGEgVVJJIHRoYXRcbiAgICogY2Fubm90IGV4aXN0LCBhbmQgZWFjaCBvbmUgY29zdHMgb25lIG9mIHRoZSBmaWZ0ZWVuIHdpbGRjYXJkIHBhdGhzIGFuXG4gICAqIGludmFsaWRhdGlvbiBtYXkgY2Fycnkg4oCUIHNvIHRoZXkgYXJlIGRyb3BwZWQgaGVyZSByYXRoZXIgdGhhbiBjcm93ZGluZyBvdXRcbiAgICogdGhlIHJlYWwgb25lcy5cbiAgICovXG4gIHByaXZhdGUgczNLZXlUb0ludmFsaWRhdGlvblBhdGgoczNLZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcHJlZml4ID0gYCR7dGhpcy5jb25maWcuYnVpbGRJZH0vYDtcbiAgICBjb25zdCB3aXRob3V0UHJlZml4ID0gczNLZXkuc3RhcnRzV2l0aChwcmVmaXgpXG4gICAgICA/IHMzS2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpXG4gICAgICA6IHMzS2V5O1xuICAgIGNvbnN0IHdpdGhvdXRTdWZmaXggPSB3aXRob3V0UHJlZml4LmVuZHNXaXRoKFwiLmpzb25cIilcbiAgICAgID8gd2l0aG91dFByZWZpeC5zbGljZSgwLCAtXCIuanNvblwiLmxlbmd0aClcbiAgICAgIDogd2l0aG91dFByZWZpeDtcblxuICAgIGlmICh3aXRob3V0U3VmZml4LmluY2x1ZGVzKFwiW1wiKSB8fCBpc0ZldGNoQ2FjaGVLZXkod2l0aG91dFN1ZmZpeCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB3aXRob3V0U3VmZml4ID09PSBcImluZGV4XCIgPyBcIi9cIiA6IGAvJHt3aXRob3V0U3VmZml4fWA7XG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZSBgcGF0aHNgIGluIGEgc2luZ2xlIHJlcXVlc3QsIG9yIHRoZSB3aG9sZSBhcHBcbiAgICogKHtAbGluayB3aG9sZUFwcEludmFsaWRhdGlvblBhdGhzfSkgd2hlbiB0aGV5IHdvdWxkIG5vdCBmaXQgaW4gb25lLiBTZWVcbiAgICoge0BsaW5rIE1BWF9XSUxEQ0FSRF9QQVRIU19QRVJfSU5WQUxJREFUSU9OfS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW52YWxpZGF0ZUNsb3VkRnJvbnRQYXRocyhwYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgYmF0Y2ggPSBBcnJheS5mcm9tKG5ldyBTZXQocGF0aHMpKTtcbiAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uSWQgPSBhd2FpdCB0aGlzLmdldERpc3RyaWJ1dGlvbklkKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgcmVzb2x2ZSB0aGUgZGlzdHJpYnV0aW9uIHRvIGludmFsaWRhdGU6XCIsIGVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIGlmICghZGlzdHJpYnV0aW9uSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aWxkY2FyZHMgPSBiYXRjaC5maWx0ZXIoaXNXaWxkY2FyZFBhdGgpLmxlbmd0aDtcbiAgICBpZiAoXG4gICAgICB3aWxkY2FyZHMgPiBNQVhfV0lMRENBUkRfUEFUSFNfUEVSX0lOVkFMSURBVElPTiB8fFxuICAgICAgYmF0Y2gubGVuZ3RoID4gTUFYX1BBVEhTX1BFUl9JTlZBTElEQVRJT05cbiAgICApIHtcbiAgICAgIGNvbnN0IHdob2xlQXBwID0gd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyhcbiAgICAgICAgdGhpcy5jbG91ZEZyb250Q29uZmlnLmJhc2VQYXRoLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBDTE9VREZST05UIElOVkFMSURBVElPTjogJHtiYXRjaC5sZW5ndGh9IHBhdGhzICgke3dpbGRjYXJkc30gYCArXG4gICAgICAgICAgYHdpbGRjYXJkcykgZG8gbm90IGZpdCBvbmUgcmVxdWVzdCwgY29sbGFwc2luZyB0byBgICtcbiAgICAgICAgICBgWyR7d2hvbGVBcHAuam9pbihcIiwgXCIpfV1gLFxuICAgICAgKTtcbiAgICAgIGJhdGNoID0gd2hvbGVBcHA7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgQ0xPVURGUk9OVCBJTlZBTElEQVRJT046IFske2JhdGNoLmpvaW4oXCIsIFwiKX1dIG9uIGRpc3RyaWJ1dGlvbiAke2Rpc3RyaWJ1dGlvbklkfWAsXG4gICAgICApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jbG91ZEZyb250Q2xpZW50LnNlbmQoXG4gICAgICAgICAgbmV3IENyZWF0ZUludmFsaWRhdGlvbkNvbW1hbmQoe1xuICAgICAgICAgICAgRGlzdHJpYnV0aW9uSWQ6IGRpc3RyaWJ1dGlvbklkLFxuICAgICAgICAgICAgSW52YWxpZGF0aW9uQmF0Y2g6IHtcbiAgICAgICAgICAgICAgQ2FsbGVyUmVmZXJlbmNlOiByYW5kb21VVUlEKCksXG4gICAgICAgICAgICAgIFBhdGhzOiB7XG4gICAgICAgICAgICAgICAgUXVhbnRpdHk6IGJhdGNoLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBJdGVtczogYmF0Y2gsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNJbnZhbGlkYXRpb25RdW90YUVycm9yKGVycm9yKSAmJiBhdHRlbXB0IDwgSU5WQUxJREFUSU9OX1JFVFJJRVMpIHtcbiAgICAgICAgICAvLyBTZWUgYElOVkFMSURBVElPTl9SRVRSSUVTYC5cbiAgICAgICAgICBiYXRjaCA9IHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHModGhpcy5jbG91ZEZyb250Q29uZmlnLmJhc2VQYXRoKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSU5WQUxJREFUSU9OX1JFVFJZX0RFTEFZX01TICogMiAqKiBhdHRlbXB0KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbCAtIHRoZSBTMy9EeW5hbW9EQiBpbnZhbGlkYXRpb24gYWxyZWFkeSBzdWNjZWVkZWQsXG4gICAgICAgIC8vIGFuZCB0aGUgQ2xvdWRGcm9udCBjYWNoZSBwb2xpY3kgVFRMIHByb3ZpZGVzIGFuIGV2ZW50dWFsIGZhbGxiYWNrLlxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24gZm9yIFske2JhdGNoLmpvaW4oXCIsIFwiKX1dOmAsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpc3RyaWJ1dGlvbidzIHBoeXNpY2FsIElELCBmcm9tIHRoZSBlbnZpcm9ubWVudCBvciBlbHNlIFNTTSBQYXJhbWV0ZXJcbiAgICogU3RvcmUsIGNhY2hlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoaXMgaW5zdGFuY2UuIFNlZVxuICAgKiBgQ2xvdWRGcm9udEludmFsaWRhdGlvbkNvbmZpZ2AgZm9yIHdoeSBGdW5jdGlvbnMgbmVlZCB0aGUgaW5kaXJlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldERpc3RyaWJ1dGlvbklkKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhY2hlZERpc3RyaWJ1dGlvbklkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWREaXN0cmlidXRpb25JZDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2xvdWRGcm9udENvbmZpZy5kaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zc21DbGllbnQuc2VuZChcbiAgICAgIG5ldyBHZXRQYXJhbWV0ZXJDb21tYW5kKHtcbiAgICAgICAgTmFtZTogdGhpcy5jbG91ZEZyb250Q29uZmlnLmRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLmNhY2hlZERpc3RyaWJ1dGlvbklkID0gcmVzcG9uc2UuUGFyYW1ldGVyPy5WYWx1ZSB8fCBudWxsO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZERpc3RyaWJ1dGlvbklkO1xuICB9XG5cbiAgYXN5bmMgcmVzZXRSZXF1ZXN0Q2FjaGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVGhpcyBoYW5kbGVyIGRvZXNuJ3QgbWFpbnRhaW4gcmVxdWVzdC1sZXZlbCBjYWNoZSBzdGF0ZVxuICAgIC8vIFRoZSBhY3R1YWwgY2FjaGUgY2xlYXJpbmcgaXMgaGFuZGxlZCBieSB0aGUgbWVtb3J5IGNhY2hlIGhhbmRsZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZGVwbG95bWVudCBrZWVwcyBgdGFnI3MzS2V5YCBtYXBwaW5nIHJvd3MgYXQgYWxsLlxuICAgKlxuICAgKiBUaGVpciBvbmUgcmVhZGVyIGlzIGByZXZhbGlkYXRlVGFnYCdzIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uLCB3aGljaCBuZWVkc1xuICAgKiB0aGUgZW50cmllcycgcGF0aHMgLSB0YWcgcmV2YWxpZGF0aW9uIGl0c2VsZiBydW5zIG9uIHRoZSBiYXJlLXRhZyBtYXJrZXJcbiAgICogcm93cy4gQSBkZXBsb3ltZW50IHdpdGggbm8gZGlzdHJpYnV0aW9uICh0aGUgUmVnaW9uYWwgY29uc3RydWN0cykgd291bGQgcGF5XG4gICAqIGEgRHluYW1vREIgd3JpdGUgcGVyIHRhZyBvbiBldmVyeSBgc2V0YCwgYSBRdWVyeSBwZXIgYHJldmFsaWRhdGVUYWdgLCBhbmQgYW5cbiAgICogZXh0cmEgUzMgcmVhZCBiZWZvcmUgZXZlcnkgZGVsZXRlLCBmb3Igcm93cyBub3RoaW5nIGV2ZXIgcmVhZHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBtYXBzVGFnc1RvUGF0aHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5jb25maWcudGFibGVOYW1lKSAmJiB0aGlzLmludmFsaWRhdGVzQ2RuO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlcmUgaXMgYSBkaXN0cmlidXRpb24gdG8gaW52YWxpZGF0ZS4gKi9cbiAgcHJpdmF0ZSBnZXQgaW52YWxpZGF0ZXNDZG4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICB0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWQgfHxcbiAgICAgIHRoaXMuY2xvdWRGcm9udENvbmZpZy5kaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBge2J1aWxkSWR9L3tjYWNoZUtleX0uanNvbmA7IHNlZSB7QGxpbmsgYnVpbGRTM0tleX0uICovXG4gIHByaXZhdGUgYnVpbGRTM0tleShjYWNoZUtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGRTM0tleSh0aGlzLmNvbmZpZy5idWlsZElkLCBjYWNoZUtleSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0b3JlRHluYW1vREJUYWdNYXBwaW5ncyhcbiAgICBzM0tleTogc3RyaW5nLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXBkYXRlUHJvbWlzZXMgPSB0YWdzLm1hcChhc3luYyAodGFnKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhZ0NhY2hlS2V5ID0gYCR7dGFnfSMke3MzS2V5fWA7XG4gICAgICAgIGNvbnN0IHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlSXRlbUNvbW1hbmQoe1xuICAgICAgICAgIFRhYmxlTmFtZTogdGhpcy5jb25maWcudGFibGVOYW1lLFxuICAgICAgICAgIEtleToge1xuICAgICAgICAgICAgcGs6IHsgUzogdGhpcy5jb25maWcuYnVpbGRJZCB9LFxuICAgICAgICAgICAgc2s6IHsgUzogdGFnQ2FjaGVLZXkgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIERlbGliZXJhdGVseSBubyBgcmV2YWxpZGF0ZWRBdGA6IGEgbWFwcGluZyByb3cgcmVjb3JkcyBvbmx5IHRoYXQgYW5cbiAgICAgICAgICAvLyBlbnRyeSBjYXJyaWVzIHRoZSB0YWcuIFN0YW1waW5nIGl0IGF0IHdyaXRlIHRpbWUgbWFkZSBldmVyeSB0YWdnZWRcbiAgICAgICAgICAvLyBlbnRyeSBsb29rIHJldmFsaWRhdGVkIG9uZSBtaWxsaXNlY29uZCBhZnRlciBpdCB3YXMgc3RvcmVkIOKAlCB0aGVcbiAgICAgICAgICAvLyByb3cncyB0aW1lc3RhbXAgaXMgdGFrZW4gYWZ0ZXIgdGhlIGVudHJ5J3MgYGxhc3RNb2RpZmllZGAg4oCUIHNvXG4gICAgICAgICAgLy8gYGNoZWNrSWZSZXZhbGlkYXRlZGAgZGVsZXRlZCBoZWFsdGh5IGVudHJpZXMgYW5kIHRoZSBwYWdlXG4gICAgICAgICAgLy8gcmUtcmVuZGVyZWQgb24gZXZlcnkgcmVxdWVzdC5cbiAgICAgICAgICBVcGRhdGVFeHByZXNzaW9uOiBcIlNFVCBjcmVhdGVkQXQgPSBpZl9ub3RfZXhpc3RzKGNyZWF0ZWRBdCwgOm5vdylcIixcbiAgICAgICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICBcIjpub3dcIjogeyBOOiBEYXRlLm5vdygpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmR5bmFtb0NsaWVudC5zZW5kKHVwZGF0ZUNvbW1hbmQpO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHVwZGF0ZVByb21pc2VzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHN0b3JpbmcgRHluYW1vREIgdGFnIG1hcHBpbmdzOlwiLCBlcnJvcik7XG4gICAgICAvLyBEb24ndCB0aHJvdyAtIGNhY2hlIHN0b3JhZ2Ugc2hvdWxkIGNvbnRpbnVlIGV2ZW4gaWYgdGFnIG1hcHBpbmcgZmFpbHNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJvcCB0aGUgYHRhZyNzM0tleWAgbWFwcGluZyByb3dzIGZvciBhbiBlbnRyeSB0aGF0IG5vIGxvbmdlciBleGlzdHMuXG4gICAqXG4gICAqIFRoZSBjb3VudGVycGFydCBvZiB7QGxpbmsgc3RvcmVEeW5hbW9EQlRhZ01hcHBpbmdzfSwgYW5kIHRoZSByZWFzb24gaXRzXG4gICAqIGNhbGxlciBoYXMgdG8ga25vdyB0aGUgZW50cnkncyB0YWdzOiBhIG1hcHBpbmcgcm93J3Mgc29ydCBrZXkgc3RhcnRzIHdpdGhcbiAgICogdGhlIHRhZywgc28gdGhlIHJvd3MgYmVsb25naW5nIHRvIG9uZSBjYWNoZSBrZXkgY2Fubm90IGJlIHF1ZXJpZWQgZm9yIC0gb25seVxuICAgKiBhIGZ1bGwgc2NhbiBvZiB0aGUgYnVpbGQncyBwYXJ0aXRpb24gd291bGQgZmluZCB0aGVtLlxuICAgKlxuICAgKiBMZWZ0IGJlaGluZCwgYSByb3cgc3RpbGwgcmVzb2x2ZXMgdG8gYSBjYWNoZSBrZXkgb24gdGhlIG5leHRcbiAgICogYHJldmFsaWRhdGVUYWdgLCB3aGljaCBzcGVuZHMgb25lIG9mIENsb3VkRnJvbnQncyBmaWZ0ZWVuIHdpbGRjYXJkIHBhdGhzXG4gICAqIGludmFsaWRhdGluZyBhIFVSSSB3aG9zZSBlbnRyeSB3YXMgZGVsZXRlZCAtIGNyb3dkaW5nIG91dCB0aGUgcGF0aHMgdGhhdCBkb1xuICAgKiBuZWVkIGl0LCBhbmQgcGFzdCB7QGxpbmsgTUFYX1dJTERDQVJEX1BBVEhTX1BFUl9JTlZBTElEQVRJT059IGNvbGxhcHNpbmcgdGhlXG4gICAqIHdob2xlIGFwcCBpbnRvIG9uZSB3aWxkY2FyZC4gVGhlIHJvd3MgYWxzbyBjb3VudCBhZ2FpbnN0IHRoZSAxIE1CIGEgdGFnJ3MgUXVlcnkgcmV0dXJucywgc29cbiAgICogZW5vdWdoIG9mIHRoZW0gcHVzaCBsaXZlIGVudHJpZXMgb250byBhIHBhZ2VcbiAgICoge0BsaW5rIE1BWF9UQUdfUVVFUllfUEFHRVN9IG1heSBub3QgcmVhY2guXG4gICAqXG4gICAqIE9ubHkgdGhlIG1hcHBpbmcgcm93czogdGhlIGJhcmUtYHRhZ2AgbWFya2VyIHJvdyBgcmV2YWxpZGF0ZVRhZ2BcbiAgICogd3JpdGVzIGJlbG9uZ3MgdG8gdGhlIHRhZyByYXRoZXIgdGhhbiB0byBhbnkgZW50cnksIGFuZCBgY2hlY2tJZlJldmFsaWRhdGVkYFxuICAgKiByZWFkcyBpdCBmb3IgZXZlcnkgKm90aGVyKiBlbnRyeSBjYXJyeWluZyB0aGF0IHRhZy5cbiAgICpcbiAgICogRGVsaWJlcmF0ZWx5IG5vIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uIGZvciB0aGUgZGVsZXRlZCBwYXRoLiBUaGUgZWRnZSBjb3B5XG4gICAqIGRvZXMgb3V0bGl2ZSB0aGUgb2JqZWN0LCBidXQgdGhpcyBydW5zIG9uIGV2ZXJ5IHJldmFsaWRhdGVkIGBmZXRjaGAgZW50cnkgYXNcbiAgICogd2VsbCwgd2hlcmUgdGhlIGtleSBuYW1lcyBubyBVUkksIGFuZCBhbiBpbnZhbGlkYXRpb24gcmVxdWVzdCBwZXIgZGVsZXRlZFxuICAgKiBlbnRyeSBpcyBhIGNvc3QgdGhlIFRUTCBhbHJlYWR5IGJvdW5kcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVsZXRlRHluYW1vREJUYWdNYXBwaW5ncyhcbiAgICBzM0tleTogc3RyaW5nLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubWFwc1RhZ3NUb1BhdGhzIHx8IHRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgLy8gQSBwYWdlJ3MgdGFncyBjYW4gcmVwZWF0IC0gYGN0eC50YWdzYCBhbmQgdGhlIHJlbmRlcidzIGhlYWRlciBhcmUgYm90aFxuICAgICAgICAvLyByZWFkIC0gYW5kIG9uZSBkZWxldGUgcGVyIHRhZyBpcyBlbm91Z2guXG4gICAgICAgIEFycmF5LmZyb20obmV3IFNldCh0YWdzKSkubWFwKGFzeW5jICh0YWcpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmR5bmFtb0NsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IERlbGV0ZUl0ZW1Db21tYW5kKHtcbiAgICAgICAgICAgICAgVGFibGVOYW1lOiB0aGlzLmNvbmZpZy50YWJsZU5hbWUsXG4gICAgICAgICAgICAgIEtleToge1xuICAgICAgICAgICAgICAgIHBrOiB7IFM6IHRoaXMuY29uZmlnLmJ1aWxkSWQgfSxcbiAgICAgICAgICAgICAgICBzazogeyBTOiBgJHt0YWd9IyR7czNLZXl9YCB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgdGhpcy5kZWJ1ZyhgREVMRVRFRCBUQUcgTUFQUElOR1M6ICR7czNLZXl9IC0+IFske3RhZ3Muam9pbihcIiwgXCIpfV1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGJ1dCBkb24ndCBmYWlsOiB0aGUgZW50cnkgaXRzZWxmIGlzIGFscmVhZHkgZ29uZSwgYW5kIGEgc3RhbGVcbiAgICAgIC8vIG1hcHBpbmcgcm93IGNvc3RzIGFuIGludmFsaWRhdGlvbiBwYXRoIHJhdGhlciB0aGFuIGEgd3JvbmcgcmVzcG9uc2UuXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZGVsZXRpbmcgRHluYW1vREIgdGFnIG1hcHBpbmdzOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIGFuIGVudHJ5IGFib3V0IHRvIGJlIGRlbGV0ZWQgd2FzIHN0b3JlZCB3aXRoLlxuICAgKlxuICAgKiBgY3R4YCBjYXJyaWVzIHRoZW0gZm9yIGEgYGZldGNoYCBkZWxldGUsIGJ1dCBhIHJlc3BvbnNlIGRlbGV0ZSBhcnJpdmVzIGFzXG4gICAqIGB7IGNhY2hlQ29udHJvbCwgaXNSb3V0ZVBQUkVuYWJsZWQsIGlzRmFsbGJhY2sgfWAgLSBgUmVzcG9uc2VDYWNoZS5zZXRgXG4gICAqIGJ1aWxkcyBpdCB0aGF0IHdheSAtIHNvIHRoZSBlbnRyeSBpdHNlbGYgaXMgdGhlIG9ubHkgc291cmNlLCBhbmQgaXQgaGFzIHRvXG4gICAqIGJlIHJlYWQgYmVmb3JlIGl0IGlzIHJlbW92ZWQuIFRoYXQgaXMgb25lIGV4dHJhIEdFVCBvbiBhIHBhdGggdGhhdCBydW5zIHdoZW5cbiAgICogYSBjYWNoZWQgcm91dGUgc3RhcnRzIGFuc3dlcmluZyBgbm90Rm91bmQoKWA6IGBJbmNyZW1lbnRhbENhY2hlLnNldGBcbiAgICogZm9yd2FyZHMgYFJlc3BvbnNlQ2FjaGVgJ3MgbnVsbCB2YWx1ZSB0aHJvdWdoIHRvIGhlcmUuXG4gICAqXG4gICAqIEEgcGFnZSBpcyBhbHNvIHRoZSBjYXNlIHdvcnRoIHBheWluZyBpdCBmb3IsIHNpbmNlIGl0IGNhcnJpZXMgdGhlIHdob2xlXG4gICAqIGltcGxpY2l0IGBfTl9UXy/igKZgIGNoYWluIGFuZCB0aGVyZWZvcmUgdGhlIG1vc3Qgcm93cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3RvcmVkRW50cnlUYWdzKFxuICAgIHMzS2V5OiBzdHJpbmcsXG4gICAgY3R4OiBTZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0IHwgU2V0SW5jcmVtZW50YWxSZXNwb25zZUNhY2hlQ29udGV4dCxcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGN0eFRhZ3MgPSBnZXRUYWdzKGN0eCk7XG4gICAgaWYgKGN0eFRhZ3M/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGN0eFRhZ3M7XG4gICAgfVxuICAgIGlmICghdGhpcy5tYXBzVGFnc1RvUGF0aHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5idWNrZXQuZ2V0KHMzS2V5KTtcbiAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5VGFncyhwYXJzZUNhY2hlVmFsdWUocmVzcG9uc2UpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcmVhZCB0YWdzIG9mICR7czNLZXl9IGJlZm9yZSBkZWxldGluZzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW55IG9mIGB0YWdzYCB3YXMgcmV2YWxpZGF0ZWQgYWZ0ZXIgdGhpcyBlbnRyeSB3YXMgc3RvcmVkLCBhbmQgaG93LlxuICAgKlxuICAgKiBSZWFkcyB0aGUgcGVyLXRhZyBtYXJrZXIgcm93cyBgcmV2YWxpZGF0ZVRhZ2Agd3JpdGVzLCBhcyB0aGlzIGluc3RhbmNlXG4gICAqIHRyYWNrcyB0aGVtOiBzZWUgYFRyYWNrZWRUYWdNYXJrZXJzYCBmb3Igd2hlbiB0aGV5IGFyZSByZWFkLlxuICAgKiBTY2FubmluZyB0aGUgdGFnJ3MgbWFwcGluZyByb3dzIGluc3RlYWQgd291bGQgYW5zd2VyIHRoZSB3cm9uZyBxdWVzdGlvbjpcbiAgICogdGhvc2Ugcm93cyBleGlzdCBwZXIgY2FjaGUgKmtleSosIHNvIHdoaWNoIG9uZSBhIGBMaW1pdDogMWAgcXVlcnkgcmV0dXJuZWRcbiAgICogZGVwZW5kZWQgb24gc29ydCBvcmRlciwgYW5kIGFuIGVudHJ5IGNvdWxkIGJlIGp1ZGdlZCBhZ2FpbnN0IGFub3RoZXJcbiAgICogZW50cnkncyB0aW1lc3RhbXAuXG4gICAqXG4gICAqIEEgdGFnIHJldmFsaWRhdGVkIHdpdGggYSBwcm9maWxlIG9ubHkgbWFrZXMgdGhlIGVudHJ5ICpzdGFsZSo6IHRoYXQgaXNcbiAgICogcmVwb3J0ZWQgdG8gTmV4dC5qcyB0aHJvdWdoIGl0cyB0YWcgbWFuaWZlc3QgKHNlZSB7QGxpbmsgbmV4dFRhZ3NNYW5pZmVzdH0pXG4gICAqIGFuZCBhbnN3ZXJlZCBgXCJzdGFsZVwiYCBoZXJlLCBzbyB0aGUgZW50cnkgaXMgc2VydmVkIHdoaWxlIGEgYmFja2dyb3VuZFxuICAgKiByZW5kZXIgcmVwbGFjZXMgaXQuIFdoZW4gdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSByZWFjaGVkIGEgc3RhbGUgZW50cnkgaXNcbiAgICogcmVwb3J0ZWQgZXhwaXJlZCBpbnN0ZWFkIC0gYSBibG9ja2luZyByZW5kZXIsIG5ldmVyIGEgc3RhbGUgcGFnZSBwcmVzZW50ZWRcbiAgICogYXMgZnJlc2guXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrSWZSZXZhbGlkYXRlZChcbiAgICBjYWNoZUxhc3RNb2RpZmllZDogbnVtYmVyLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPFJldmFsaWRhdGlvblN0YXRlPiB7XG4gICAgYXdhaXQgdGhpcy50YWdzLnJlZnJlc2goKTtcbiAgICBhd2FpdCB0aGlzLnRhZ3MuZW5zdXJlKHRhZ3MpO1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy50YWdzLnN0YXRlKHRhZ3MsIGNhY2hlTGFzdE1vZGlmaWVkKTtcbiAgICBpZiAoc3RhdGUgIT09IFwic3RhbGVcIikge1xuICAgICAgaWYgKHN0YXRlID09PSBcImV4cGlyZWRcIikge1xuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBUYWdzIFske3RhZ3N9XSBleHBpcmVkIGVudHJ5IGNyZWF0ZWQgYXQgJHtjYWNoZUxhc3RNb2RpZmllZH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gbmV4dFRhZ3NNYW5pZmVzdCgpO1xuICAgIGlmICghbWFuaWZlc3QpIHtcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBUYWdzIFske3RhZ3N9XSBhcmUgc3RhbGUgYW5kIE5leHQuanMncyB0YWcgbWFuaWZlc3QgaXMgYCArXG4gICAgICAgICAgYHVucmVhY2hhYmxlLCBleHBpcmluZyB0aGUgZW50cnkgaW5zdGVhZGAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIFwiZXhwaXJlZFwiO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICBjb25zdCBzdGFsZUF0ID0gdGhpcy50YWdzLmdldCh0YWcpPy5zdGFsZUF0O1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtYW5pZmVzdC5nZXQodGFnKTtcbiAgICAgIGlmIChcbiAgICAgICAgc3RhbGVBdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHN0YWxlQXQgPiBjYWNoZUxhc3RNb2RpZmllZCAmJlxuICAgICAgICAoZXhpc3Rpbmc/LnN0YWxlID8/IDApIDwgc3RhbGVBdFxuICAgICAgKSB7XG4gICAgICAgIG1hbmlmZXN0LnNldCh0YWcsIHsgLi4uZXhpc3RpbmcsIHN0YWxlOiBzdGFsZUF0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJzdGFsZVwiO1xuICB9XG59XG4iXX0=
|
|
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
|