sliftutils 1.7.85 → 1.7.87

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.
@@ -40,15 +40,20 @@ async function requireBucket(account, bucketName) {
40
40
  return bucket;
41
41
  }
42
42
  exports.requireBucket = requireBucket;
43
- /** The store serving a request: the exact config entry the CLIENT selected, matched by equality (key order ignored) against the bucket's own entries. A match is honored even when its window has passed - the selection never validates, the store's own validation throws instead. Throws when nothing matches, listing what is available. */
43
+ /** The stable identity of a source config for matching: everything EXCEPT the valid window, and with an intermediate resolved back to the source it was split out of. The window drifts (a switchover splits one window in two around an intermediate, then rejoins it), so a caller and this server routinely disagree on it - matching on it would wrongly reject the request. An intermediate is a transient alt-port view of another source, so it must resolve to THAT source (config.intermediate holds its url + the intermediate flag is dropped), or a request naming the intermediate would fail to match once the intermediate has rejoined and its entry is gone. The route stays in the identity (it selects the store/folder). */
44
+ function sourceMatchKey(config) {
45
+ let url = config.intermediate || config.url;
46
+ return stableStringify({ ...config, url, intermediate: undefined, validWindow: undefined });
47
+ }
48
+ /** The store serving a request: the config entry the CLIENT selected, matched against the bucket's own entries by identity EXCLUDING the valid window (see sourceMatchKey). The selection never validates - the store's own window/route checks throw if the caller is stale - so honoring a window mismatch here is exactly right. Throws when nothing matches, listing what is available. */
44
49
  async function findBucketStore(account, bucketName, sourceConfig) {
45
50
  let bucket = await requireBucket(account, bucketName);
46
51
  if (!sourceConfig) {
47
52
  throw new Error(`No remote source configuration was provided for bucket ${account}/${bucketName}: every request must say which configured source it selected. Available: ${JSON.stringify(bucket.selfEntries)}`);
48
53
  }
49
- let wanted = stableStringify(sourceConfig);
54
+ let wanted = sourceMatchKey(sourceConfig);
50
55
  for (let s of bucket.stores) {
51
- if (s.entries.some(e => stableStringify(e) === wanted))
56
+ if (s.entries.some(e => sourceMatchKey(e) === wanted))
52
57
  return s;
53
58
  }
54
59
  throw new Error(`No source on this server matches the requested remote configuration for bucket ${account}/${bucketName}. Requested: ${JSON.stringify(sourceConfig)}. Available: ${JSON.stringify(bucket.selfEntries)}`);
@@ -357,7 +362,7 @@ function buildStore(account, bucketName, planStore) {
357
362
  return ({
358
363
  source: spec.sourceConfig && (0, createArchives_1.createApiArchives)(spec.sourceConfig) || new ArchivesDisk_1.ArchivesDisk(folder),
359
364
  url: ((_a = spec.sourceConfig) === null || _a === void 0 ? void 0 : _a.url) || folder,
360
- validWindow: spec.validWindow,
365
+ validWindows: spec.validWindows,
361
366
  route: spec.route,
362
367
  noFullSync: spec.noFullSync,
363
368
  intermediate: (_b = spec.sourceConfig) === null || _b === void 0 ? void 0 : _b.intermediate,
@@ -456,12 +461,12 @@ async function checkRoutingChanged(account, bucketName, config) {
456
461
  live.store.updateSources(planStore.sourceSpecs.map(spec => {
457
462
  const sourceConfig = spec.sourceConfig;
458
463
  if (!sourceConfig) {
459
- return { identity: sourceIdentity(undefined), url: storeFolder, validWindow: spec.validWindow, create: () => new ArchivesDisk_1.ArchivesDisk(storeFolder) };
464
+ return { identity: sourceIdentity(undefined), url: storeFolder, validWindows: spec.validWindows, create: () => new ArchivesDisk_1.ArchivesDisk(storeFolder) };
460
465
  }
461
466
  return {
462
467
  identity: sourceIdentity(sourceConfig),
463
468
  url: sourceConfig.url,
464
- validWindow: spec.validWindow,
469
+ validWindows: spec.validWindows,
465
470
  route: spec.route,
466
471
  noFullSync: spec.noFullSync,
467
472
  intermediate: sourceConfig.intermediate,
@@ -519,7 +524,7 @@ async function writeRoutingConfig(account, bucketName, data, config) {
519
524
  let reinjected = 0;
520
525
  for (let intermediate of (0, intermediateSources_1.getIntermediateSources)((0, intermediateSources_1.expireIntermediateSources)(loaded.routing, Date.now()))) {
521
526
  stored = (0, intermediateSources_1.injectIntermediateSource)(stored, {
522
- splitUrl: (0, intermediateSources_1.findSplitUrl)(loaded.routing, intermediate) || intermediate.url,
527
+ splitUrl: intermediate.intermediate || intermediate.url,
523
528
  intermediateUrl: intermediate.url,
524
529
  start: intermediate.validWindow[0],
525
530
  end: intermediate.validWindow[1],
@@ -944,5 +949,5 @@ function getLocalArchives(account, bucketName, sourceConfig) {
944
949
  return archives;
945
950
  }
946
951
  exports.getLocalArchives = getLocalArchives;
947
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIseURBQW1EO0FBQ25ELG1EQUFnRDtBQUNoRCwyREFBK0Q7QUFDL0Qsa0RBQStDO0FBQy9DLDJDQUF1SDtBQUN2SCw0Q0FHc0I7QUFDdEIsaURBQWlNO0FBQ2pNLCtEQUFzTDtBQUN0TCxxREFBMkQ7QUFDM0QscURBQWlGO0FBQ2pGLDJEQUE4RDtBQUM5RCxpREFBNkU7QUFDN0UsNkNBQXdJO0FBQ3hJLDJDQUF3RztBQTBCeEcsbUxBQW1MO0FBQ25MLFNBQVMsZUFBZSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDL0QsQ0FBQztJQUNELElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBZ0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztJQUMvRixJQUFBLFdBQUksRUFBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxF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QVksQ0FBQyxFQUFFLENBQUM7SUFDdEUsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxJQUFJLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM5QixJQUFJLFFBQVEsR0FBRyxJQUFJLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDN0UsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakMsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQztBQVBELDRDQU9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgcnVuSW5maW5pdGVQb2xsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IEFyY2hpdmVzRGlzayB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IEJsb2JTdG9yZSwgUmF3RGlza1N0b3JlLCBJQnVja2V0U3RvcmUsIERFRkFVTFRfRkFTVF9XUklURV9ERUxBWSwgV0lORE9XX0VORF9GTFVTSF9NQVJHSU4gfSBmcm9tIFwiLi9ibG9iU3RvcmVcIjtcbmltcG9ydCB7XG4gICAgUmVtb3RlQ29uZmlnLCBIb3N0ZWRDb25maWcsIFNvdXJjZUNvbmZpZywgSUFyY2hpdmVzLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZXNDb25maWcsIEFyY2hpdmVzU3luY1N0YXR1cyxcbiAgICBBcmNoaXZlRmlsZUluZm8sIENoYW5nZXNBZnRlckNvbmZpZywgRGVsQ29uZmlnLCBGaW5kQ29uZmlnLCBHZXRDb25maWcsIEdldEluZm9Db25maWcsIFNldENvbmZpZywgU3luY0FjdGl2aXR5LCBGVUxMX1JPVVRFLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIHBhcnNlUm91dGluZ0RhdGEsIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZywgcGFyc2VIb3N0ZWRVcmwsIHJlcGxhY2VIb3N0ZWRVcmxQb3J0LCBidWlsZEZpbGVVcmwsIGdldENvbmZpZ1ZlcnNpb24sIHJvdXRlSW50ZXJzZWN0aW9uLCBub3JtYWxpemVTb3VyY2UgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IGluamVjdEludGVybWVkaWF0ZVNvdXJjZSwgZXhwaXJlSW50ZXJtZWRpYXRlU291cmNlcywgZ2V0SW50ZXJtZWRpYXRlU291cmNlcywgZmluZFNwbGl0VXJsLCBuZXh0SW50ZXJtZWRpYXRlVmVyc2lvbiwgSU5URVJNRURJQVRFX0VYUElSRV9HUkFDRSB9IGZyb20gXCIuL2ludGVybWVkaWF0ZVNvdXJjZXNcIjtcbmltcG9ydCB7IGdldFRha2VvdmVySW50ZXJtZWRpYXRlIH0gZnJvbSBcIi4vZGVwbG95VGFrZW92ZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUFwaUFyY2hpdmVzLCBsaXN0U2VydmVyQWN0aXZlQnVja2V0S2V5cyB9IGZyb20gXCIuL2NyZWF0ZUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBnZXRTdG9yYWdlU2VydmVyQ29uZmlnLCBhc3NlcnRXcml0ZXNBbGxvd2VkIH0gZnJvbSBcIi4vc2VydmVyQ29uZmlnXCI7XG5pbXBvcnQgeyBnZXRCdWNrZXRGb2xkZXIsIHJlYWRSb3V0aW5nRmlsZSwgcmVhZFJvdXRpbmdGcm9tRGlzaywgZ2V0Um91dGluZ0ZpbGVSZXN1bHQsIGdldERpc2tJbmZvLCBCdWNrZXREaXNrSW5mbyB9IGZyb20gXCIuL2J1Y2tldERpc2tcIjtcbmltcG9ydCB7IGNvbXB1dGVTdG9yZVBsYW4sIGZpbmRTZWxmSW5kZXhlcywgU3RvcmVQbGFuLCBTdG9yZVBsYW5TdG9yZSwgU2VsZlN1bW1hcnkgfSBmcm9tIFwiLi9zdG9yZVBsYW5cIjtcblxuLy8gVGhlIHN0b3JhZ2Ugc2VydmVyJ3MgYnVja2V0IGxpZmVjeWNsZTogdGhlIG1hcCBvZiBsb2FkZWQgYnVja2V0cyAoZWFjaCA9IGl0cyByb3V0aW5nIGNvbmZpZyArIG9uZSBCbG9iU3RvcmUgcGVyIHJvdXRlKSwga2VlcGluZyB0aGVtIGN1cnJlbnQgKHJvdXRpbmcgcmVsb2Fkcywgd2luZG93LWJvdW5kYXJ5IHJlYnVpbGRzLCBib3VuZGFyeSBzY2FucyksIHdyaXRpbmcvcHJvcGFnYXRpbmcgcm91dGluZyBjb25maWdzLCBkZXBsb3ktc3dpdGNob3ZlciBtYWludGVuYW5jZSwgYW5kIHRoZSBzZXJ2ZXItbGV2ZWwgYnVja2V0IGxpc3RpbmdzLiBTdG9yZSBzZWxlY3Rpb24gKHNvdXJjZUNvbmZpZyAtPiBzdG9yZSkgbGl2ZXMgaGVyZSB0b28sIGFzIGZpbmRCdWNrZXRTdG9yZS5cblxuZXhwb3J0IHR5cGUgTG9hZGVkU3RvcmUgPSB7XG4gICAgLy8gSlNPTiBvZiB0aGUgcm91dGUgKEZVTExfUk9VVEUgd2hlbiBhYnNlbnQpIC0gdGhlIE9ORSByb3V0ZSB0aGlzIHN0b3JlIHNlcnZlc1xuICAgIHJvdXRlS2V5OiBzdHJpbmc7XG4gICAgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIC8vIFRoZSBleGFjdCBzZWxmIGVudHJpZXMgdGhpcyBzdG9yZSBzZXJ2ZXMgKHNhbWUgcm91dGUsIGRpZmZlcmVudCB2YWxpZCB3aW5kb3dzKS4gRW1wdHkgd2hlbiB3ZSBhcmUgbm90IGluIHRoZSBjb25maWcgYnV0IHN0aWxsIHNlcnZlIG91ciBkaXNrIGRhdGEuXG4gICAgZW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgZm9sZGVyOiBzdHJpbmc7XG4gICAgc3RvcmU6IElCdWNrZXRTdG9yZTtcbn07XG5cbi8vIEEgYnVja2V0IGxvYWRlZCBvbiB0aGlzIHNlcnZlcjogaXRzIHJvdXRpbmcgY29uZmlnIGFuZCBpdHMgcGVyLXJvdXRlIHN0b3Jlcy4gUHVyZSBkYXRhIC0gdGhlIHN0b3JlcyB0aGVtc2VsdmVzIGRvIHRoZSB3b3JrLlxuZXhwb3J0IHR5cGUgQnVja2V0U3RhdGUgPSB7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICByb3V0aW5nOiBSZW1vdGVDb25maWc7XG4gICAgcm91dGluZ0pTT046IHN0cmluZztcbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgc2VsZjogU2VsZlN1bW1hcnkgfCB1bmRlZmluZWQ7XG4gICAgc3RvcmVzOiBMb2FkZWRTdG9yZVtdO1xuICAgIHN0cnVjdHVyZUtleTogc3RyaW5nO1xufTtcblxuLyoqIEpTT04gd2l0aCBzb3J0ZWQgb2JqZWN0IGtleXMgYW5kIHVuZGVmaW5lZC12YWx1ZWQga2V5cyBkcm9wcGVkLCBzbyB0d28gY29uZmlncyB0aGF0IG1lYW4gdGhlIHNhbWUgdGhpbmcgY29tcGFyZSBlcXVhbCByZWdhcmRsZXNzIG9mIGtleSBvcmRlciBvciB3aGljaCBzaWRlIHNlcmlhbGl6ZWQgdGhlbS4gKi9cbmZ1bmN0aW9uIHN0YWJsZVN0cmluZ2lmeSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBgWyR7dmFsdWUubWFwKHggPT4gc3RhYmxlU3RyaW5naWZ5KHgpKS5qb2luKFwiLFwiKX1dYDtcbiAgICB9XG4gICAgbGV0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZmlsdGVyKHggPT4geFsxXSAhPT0gdW5kZWZpbmVkKTtcbiAgICBzb3J0KGVudHJpZXMsIHggPT4geFswXSk7XG4gICAgcmV0dXJuIGB7JHtlbnRyaWVzLm1hcCgoW2tleSwgY2hpbGRdKSA9PiBgJHtKU09OLnN0cmluZ2lmeShrZXkpfToke3N0YWJsZVN0cmluZ2lmeShjaGlsZCl9YCkuam9pbihcIixcIil9fWA7XG59XG5cbi8qKiBUaGUgbG9hZGVkIGJ1Y2tldCwgbG9hZGluZyBpdCAod2hpY2ggaW5zdGFudGlhdGVzIGl0cyBzdG9yZXMgYW5kIHN0YXJ0cyB0aGVpciBzeW5jaHJvbml6YXRpb24pIGlmIG5lZWRlZC4gQSBidWNrZXQgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHNlcnZlciB0aHJvd3MgLSBjYWxsZXJzIG5ldmVyIHNlZSB1bmRlZmluZWQgYnVja2V0cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXF1aXJlQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxCdWNrZXRTdGF0ZT4ge1xuICAgIGxldCBidWNrZXQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgc2VydmVyLiBXcml0ZSBpdHMgcm91dGluZyBjb25maWcgdG8gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSB0byBjcmVhdGUgaXQuYCk7XG4gICAgfVxuICAgIHJldHVybiBidWNrZXQ7XG59XG5cbi8qKiBUaGUgc3RvcmUgc2VydmluZyBhIHJlcXVlc3Q6IHRoZSBleGFjdCBjb25maWcgZW50cnkgdGhlIENMSUVOVCBzZWxlY3RlZCwgbWF0Y2hlZCBieSBlcXVhbGl0eSAoa2V5IG9yZGVyIGlnbm9yZWQpIGFnYWluc3QgdGhlIGJ1Y2tldCdzIG93biBlbnRyaWVzLiBBIG1hdGNoIGlzIGhvbm9yZWQgZXZlbiB3aGVuIGl0cyB3aW5kb3cgaGFzIHBhc3NlZCAtIHRoZSBzZWxlY3Rpb24gbmV2ZXIgdmFsaWRhdGVzLCB0aGUgc3RvcmUncyBvd24gdmFsaWRhdGlvbiB0aHJvd3MgaW5zdGVhZC4gVGhyb3dzIHdoZW4gbm90aGluZyBtYXRjaGVzLCBsaXN0aW5nIHdoYXQgaXMgYXZhaWxhYmxlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRCdWNrZXRTdG9yZShhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQpOiBQcm9taXNlPExvYWRlZFN0b3JlPiB7XG4gICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHJlcXVpcmVCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFzb3VyY2VDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZW1vdGUgc291cmNlIGNvbmZpZ3VyYXRpb24gd2FzIHByb3ZpZGVkIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OiBldmVyeSByZXF1ZXN0IG11c3Qgc2F5IHdoaWNoIGNvbmZpZ3VyZWQgc291cmNlIGl0IHNlbGVjdGVkLiBBdmFpbGFibGU6ICR7SlNPTi5zdHJpbmdpZnkoYnVja2V0LnNlbGZFbnRyaWVzKX1gKTtcbiAgICB9XG4gICAgbGV0IHdhbnRlZCA9IHN0YWJsZVN0cmluZ2lmeShzb3VyY2VDb25maWcpO1xuICAgIGZvciAobGV0IHMgb2YgYnVja2V0LnN0b3Jlcykge1xuICAgICAgICBpZiAocy5lbnRyaWVzLnNvbWUoZSA9PiBzdGFibGVTdHJpbmdpZnkoZSkgPT09IHdhbnRlZCkpIHJldHVybiBzO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBvbiB0aGlzIHNlcnZlciBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgcmVtb3RlIGNvbmZpZ3VyYXRpb24gZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0uIFJlcXVlc3RlZDogJHtKU09OLnN0cmluZ2lmeShzb3VyY2VDb25maWcpfS4gQXZhaWxhYmxlOiAke0pTT04uc3RyaW5naWZ5KGJ1Y2tldC5zZWxmRW50cmllcyl9YCk7XG59XG5cbi8qKiBJbnRlcm5hbCAoc3RvcmUtdG8tc3RvcmUpIHJlYWRzIHNraXAgc3RvcmUgc2VsZWN0aW9uIGVudGlyZWx5OiB0aGUgY2FsbGVyIGlzIGFub3RoZXIgc3RvcmUgd2hvc2UgaW5kZXggc2F5cyB0aGlzIE1BQ0hJTkUgaG9sZHMgdGhlIGJ5dGVzIC0gdGhlIHBlcnNpc3RlZCBob2xkZXIgaWRlbnRpdHkgaXMganVzdCBhIFVSTCwgd2hpY2ggY2Fubm90IG5hbWUgYSBzdG9yZS4gV2hpY2hldmVyIHN0b3JlJ3MgZm9sZGVyIGhhcyB0aGUgbmV3ZXN0IGNvcHkgYW5zd2Vycy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQnVja2V0SW50ZXJuYWwoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBidWNrZXQgPSBhd2FpdCByZXF1aXJlQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVja2V0LnN0b3Jlcy5tYXAocyA9PiBzLnN0b3JlLmdldDIoeyBwYXRoOiBjb25maWcucGF0aCwgcmFuZ2U6IGNvbmZpZy5yYW5nZSwgaW5jbHVkZVRvbWJzdG9uZXM6IGNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcywgaW50ZXJuYWw6IHRydWUgfSkpKTtcbiAgICBsZXQgYmVzdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0ICYmICghYmVzdCB8fCByZXN1bHQud3JpdGVUaW1lID4gYmVzdC53cml0ZVRpbWUpKSB7XG4gICAgICAgICAgICBiZXN0ID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiZXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVja2V0Q29uZmlnKGJ1Y2tldDogQnVja2V0U3RhdGUpOiBBcmNoaXZlc0NvbmZpZyB7XG4gICAgbGV0IGluZGV4ID0geyBmaWxlQ291bnQ6IDAsIGJ5dGVDb3VudDogMCB9O1xuICAgIGxldCBpbmRleFNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gPSBbXTtcbiAgICBsZXQgc3luY2luZzogU3luY0FjdGl2aXR5W10gPSBbXTtcbiAgICBsZXQgcmVhZGVyRGlza0xpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgcyBvZiBidWNrZXQuc3RvcmVzKSB7XG4gICAgICAgIGxldCBwcm9ncmVzcyA9IHMuc3RvcmUuZ2V0U3luY1Byb2dyZXNzPy4oKTtcbiAgICAgICAgaWYgKCFwcm9ncmVzcykgY29udGludWU7XG4gICAgICAgIGluZGV4LmZpbGVDb3VudCArPSBwcm9ncmVzcy5pbmRleC5maWxlQ291bnQ7XG4gICAgICAgIGluZGV4LmJ5dGVDb3VudCArPSBwcm9ncmVzcy5pbmRleC5ieXRlQ291bnQ7XG4gICAgICAgIGluZGV4U291cmNlcy5wdXNoKC4uLnByb2dyZXNzLnNvdXJjZXMpO1xuICAgICAgICBzeW5jaW5nLnB1c2goLi4ucHJvZ3Jlc3Muc3luY2luZyk7XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdCA9IHJlYWRlckRpc2tMaW1pdCB8fCBwcm9ncmVzcy5yZWFkZXJEaXNrTGltaXQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC8vIE5hdGl2ZSBjaGFuZ2UtZmVlZCBzdXBwb3J0ID0gdGhlIHN0b3JlcyBrZWVwIGFuIGluZGV4IChyYXdEaXNrIGJ1Y2tldHMgZW11bGF0ZSBnZXRDaGFuZ2VzQWZ0ZXIyIHdpdGggYSBmdWxsIGxpc3RpbmcpIC0gY2xpZW50cyB1c2UgdGhpcyB0byBwaWNrIHRoZWlyIHNjYW4gY2FkZW5jZVxuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYnVja2V0LnN0b3Jlcy5zb21lKHMgPT4gcy5zdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSksXG4gICAgICAgIHJlbW90ZUNvbmZpZzogYnVja2V0LnJvdXRpbmcsXG4gICAgICAgIGluZGV4LFxuICAgICAgICBpbmRleFNvdXJjZXMsXG4gICAgICAgIHJlYWRlckRpc2tMaW1pdCxcbiAgICAgICAgc3luY2luZyxcbiAgICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVja2V0U3luY1N0YXR1cyhidWNrZXQ6IEJ1Y2tldFN0YXRlKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICBsZXQgc3VwcG9ydGVkID0gYnVja2V0LnN0b3Jlcy5maWx0ZXIocyA9PiBzLnN0b3JlLmdldFN5bmNTdGF0dXMpO1xuICAgIGlmICghc3VwcG9ydGVkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2J1Y2tldC5hY2NvdW50fS8ke2J1Y2tldC5idWNrZXROYW1lfSBkb2VzIG5vdCBzdXBwb3J0IGdldFN5bmNTdGF0dXMgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIHN5bmNocm9uaXphdGlvbilgKTtcbiAgICB9XG4gICAgbGV0IHN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoc3VwcG9ydGVkLm1hcChhc3luYyBzID0+IHtcbiAgICAgICAgbGV0IGdldFN5bmNTdGF0dXMgPSBzLnN0b3JlLmdldFN5bmNTdGF0dXM7XG4gICAgICAgIGlmICghZ2V0U3luY1N0YXR1cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBnZXRTeW5jU3RhdHVzIGRpc2FwcGVhcmVkIGZyb20gYSBzdG9yZSBmb3IgJHtidWNrZXQuYWNjb3VudH0vJHtidWNrZXQuYnVja2V0TmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0U3luY1N0YXR1cy5jYWxsKHMuc3RvcmUpO1xuICAgIH0pKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhbGxTY2Fuc0NvbXBsZXRlOiBzdGF0dXNlcy5ldmVyeSh4ID0+IHguYWxsU2NhbnNDb21wbGV0ZSksXG4gICAgICAgIGluZGV4U2l6ZTogc3RhdHVzZXMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHguaW5kZXhTaXplLCAwKSxcbiAgICAgICAgc291cmNlczogc3RhdHVzZXMuZmxhdE1hcCh4ID0+IHguc291cmNlcyksXG4gICAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1Y2tldEluZGV4VG90YWxzKGJ1Y2tldDogQnVja2V0U3RhdGUpOiBQcm9taXNlPHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0gfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgc3VwcG9ydGVkID0gYnVja2V0LnN0b3Jlcy5maWx0ZXIocyA9PiBzLnN0b3JlLmNvbXB1dGVJbmRleFRvdGFscyk7XG4gICAgaWYgKCFzdXBwb3J0ZWQubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGxldCB0b3RhbHMgPSBhd2FpdCBQcm9taXNlLmFsbChzdXBwb3J0ZWQubWFwKGFzeW5jIHMgPT4ge1xuICAgICAgICBsZXQgY29tcHV0ZUluZGV4VG90YWxzID0gcy5zdG9yZS5jb21wdXRlSW5kZXhUb3RhbHM7XG4gICAgICAgIGlmICghY29tcHV0ZUluZGV4VG90YWxzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbXB1dGVJbmRleFRvdGFscyBkaXNhcHBlYXJlZCBmcm9tIGEgc3RvcmUgZm9yICR7YnVja2V0LmFjY291bnR9LyR7YnVja2V0LmJ1Y2tldE5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGNvbXB1dGVJbmRleFRvdGFscy5jYWxsKHMuc3RvcmUpO1xuICAgIH0pKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaWxlQ291bnQ6IHRvdGFscy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5maWxlQ291bnQsIDApLFxuICAgICAgICBieXRlQ291bnQ6IHRvdGFscy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5ieXRlQ291bnQsIDApLFxuICAgICAgICBzb3VyY2VzOiB0b3RhbHMuZmxhdE1hcCh4ID0+IHguc291cmNlcyksXG4gICAgfTtcbn1cblxuY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPEJ1Y2tldFN0YXRlIHwgdW5kZWZpbmVkPj4oKTtcblxuY29uc3QgTUFYX1JFQlVJTERfVElNRVJfREVMQVkgPSAyICoqIDMxIC0gMTtcbmNvbnN0IFJFQlVJTERfQk9VTkRBUllfQlVGRkVSID0gMTAwMDtcblxuZnVuY3Rpb24gc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkOiBCdWNrZXRTdGF0ZSk6IHZvaWQge1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBib3VuZGFyaWVzID0gbG9hZGVkLnNlbGZFbnRyaWVzLmZsYXRNYXAoeCA9PiB4LnZhbGlkV2luZG93KS5maWx0ZXIodCA9PiB0ID4gbm93KTtcbiAgICBpZiAoIWJvdW5kYXJpZXMubGVuZ3RoKSByZXR1cm47XG4gICAgbGV0IG5leHRCb3VuZGFyeSA9IE1hdGgubWluKC4uLmJvdW5kYXJpZXMpO1xuICAgIGxldCBrZXkgPSBgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX1gO1xuICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGF3YWl0IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbG9hZGVkKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA8IG5leHRCb3VuZGFyeSkge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSwgeyBmb3JjZTogdHJ1ZSwgcmVhc29uOiBcImEgdmFsaWQgd2luZG93IGJvdW5kYXJ5IHBhc3NlZFwiIH0pO1xuICAgICAgICB9KSgpO1xuICAgIH0sIE1hdGgubWluKG5leHRCb3VuZGFyeSAtIG5vdyArIFJFQlVJTERfQk9VTkRBUllfQlVGRkVSLCBNQVhfUkVCVUlMRF9USU1FUl9ERUxBWSkpO1xuICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG59XG5cbmNvbnN0IEJPVU5EQVJZX1NDQU5fT0ZGU0VUUyA9IFstMzAgKiAxMDAwLCAyICogMTAwMCwgMzAgKiAxMDAwXTtcbmNvbnN0IEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0sgPSBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVkgKyBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTjtcbmNvbnN0IFNUQVJUVVBfQk9VTkRBUllfU0NBTl9ERUxBWSA9IDMwICogMTAwMDtcblxuY29uc3Qgc2NoZWR1bGVkQm91bmRhcnlTY2FucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuY29uc3QgYm91bmRhcnlTY2Fuc1J1bm5pbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuZnVuY3Rpb24gc2NoZWR1bGVCb3VuZGFyeVNjYW5zKGxvYWRlZDogQnVja2V0U3RhdGUpOiB2b2lkIHtcbiAgICBsZXQga2V5ID0gYCR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9YDtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgc3RhcnRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgZm9yIChsZXQgc2VsZiBvZiBsb2FkZWQuc2VsZkVudHJpZXMpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gc2VsZi52YWxpZFdpbmRvd1swXTtcbiAgICAgICAgaWYgKHN0YXJ0ID4gbm93ICYmIHN0YXJ0IDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHN0YXJ0cy5hZGQoc3RhcnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHNlbGYgb2YgbG9hZGVkLnNlbGZFbnRyaWVzKSB7XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBzZWxmLnZhbGlkV2luZG93O1xuICAgICAgICBpZiAoIShzdGFydCA8PSBub3cgJiYgbm93IDwgZW5kKSB8fCBzdGFydCA8PSAwKSBjb250aW51ZTtcbiAgICAgICAgaWYgKG5vdyAtIHN0YXJ0ID4gQk9VTkRBUllfU0NBTl9MT09LQkFDSykgY29udGludWU7XG4gICAgICAgIGxldCBzY2hlZHVsZUtleSA9IGAke2tleX18JHtzdGFydH18c3RhcnR1cGA7XG4gICAgICAgIGlmIChzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmhhcyhzY2hlZHVsZUtleSkpIGNvbnRpbnVlO1xuICAgICAgICBzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmFkZChzY2hlZHVsZUtleSk7XG4gICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBydW5Cb3VuZGFyeVNjYW4oa2V5LCBzdGFydCwgU1RBUlRVUF9CT1VOREFSWV9TQ0FOX0RFTEFZLCBcInN0YXJ0dXArMzBzXCIpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgQm91bmRhcnkgc2NhbiBmb3IgYnVja2V0ICR7a2V5fSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfSwgU1RBUlRVUF9CT1VOREFSWV9TQ0FOX0RFTEFZKTtcbiAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG4gICAgZm9yIChsZXQgc3RhcnQgb2Ygc3RhcnRzKSB7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCBvZiBCT1VOREFSWV9TQ0FOX09GRlNFVFMpIHtcbiAgICAgICAgICAgIGxldCBhdCA9IHN0YXJ0ICsgb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKGF0IDw9IG5vdykgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc2NoZWR1bGVLZXkgPSBgJHtrZXl9fCR7c3RhcnR9fCR7b2Zmc2V0fWA7XG4gICAgICAgICAgICBpZiAoc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5oYXMoc2NoZWR1bGVLZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuYWRkKHNjaGVkdWxlS2V5KTtcbiAgICAgICAgICAgIGxldCBhcm0gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIDwgYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZvaWQgcnVuQm91bmRhcnlTY2FuKGtleSwgc3RhcnQsIG9mZnNldCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBCb3VuZGFyeSBzY2FuIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICAgICAgICAgIH0sIE1hdGgubWluKGF0IC0gRGF0ZS5ub3coKSwgTUFYX1JFQlVJTERfVElNRVJfREVMQVkpKTtcbiAgICAgICAgICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFybSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Cb3VuZGFyeVNjYW4oYnVja2V0S2V5OiBzdHJpbmcsIHdpbmRvd1N0YXJ0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyLCBvZmZzZXRMYWJlbD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBsYWJlbCA9IGBidWNrZXQgJHtidWNrZXRLZXl9LCB3aW5kb3cgc3RhcnRpbmcgJHtuZXcgRGF0ZSh3aW5kb3dTdGFydCkudG9JU09TdHJpbmcoKX0sIG9mZnNldCAke29mZnNldExhYmVsIHx8IGAke29mZnNldCAvIDEwMDB9c2B9YDtcbiAgICBpZiAoYm91bmRhcnlTY2Fuc1J1bm5pbmcuaGFzKGJ1Y2tldEtleSkpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFNraXBwaW5nIGJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KTogdGhlIHByZXZpb3VzIGJvdW5kYXJ5IHNjYW4gaXMgc3RpbGwgcnVubmluZ2ApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGJvdW5kYXJ5U2NhbnNSdW5uaW5nLmFkZChidWNrZXRLZXkpO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBidWNrZXRzLmdldChidWNrZXRLZXkpO1xuICAgICAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgZWZmZWN0aXZlID0gbG9hZGVkLnJvdXRpbmc7XG4gICAgICAgIGxldCBzZWxmSW5kZXhlcyA9IGZpbmRTZWxmSW5kZXhlcyhlZmZlY3RpdmUsIGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSk7XG4gICAgICAgIGxldCBzZWxmSW5kZXhTZXQgPSBuZXcgU2V0KHNlbGZJbmRleGVzKTtcbiAgICAgICAgbGV0IHNlbHZlcyA9IHNlbGZJbmRleGVzLm1hcChpID0+IGVmZmVjdGl2ZS5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZykuZmlsdGVyKHggPT4geC52YWxpZFdpbmRvd1swXSA9PT0gd2luZG93U3RhcnQpO1xuICAgICAgICBpZiAoIXNlbHZlcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IHByZXZUaW1lID0gd2luZG93U3RhcnQgLSAxO1xuICAgICAgICAvLyBFdmVyeXRoaW5nIGlzIHBlci1zdG9yZTogZWFjaCBzZWxmIGVudHJ5J3Mgcm91dGUgaGFzIGl0cyBvd24gc3RvcmUsIGFuZCB0aGF0IHN0b3JlJ3MgZGlzay9yZW1vdGUgYm91bmRhcnkgcHVsbHMgb25seSBjb25jZXJuIGl0cyBvd24gcm91dGUgc2xpY2VcbiAgICAgICAgbGV0IG5lZWREaXNrU2NhbiA9IG5ldyBTZXQ8TG9hZGVkU3RvcmU+KCk7XG4gICAgICAgIGxldCByZW1vdGVPd25lcnMgPSBuZXcgTWFwPExvYWRlZFN0b3JlLCBNYXA8bnVtYmVyLCBbbnVtYmVyLCBudW1iZXJdPj4oKTtcbiAgICAgICAgZm9yIChsZXQgc2VsZiBvZiBzZWx2ZXMpIHtcbiAgICAgICAgICAgIGxldCBzZWxmUm91dGUgPSBzZWxmLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgICAgICBsZXQgc2VsZlN0b3JlID0gbG9hZGVkLnN0b3Jlcy5maW5kKHggPT4geC5yb3V0ZUtleSA9PT0gSlNPTi5zdHJpbmdpZnkoc2VsZlJvdXRlKSk7XG4gICAgICAgICAgICBpZiAoIXNlbGZTdG9yZSB8fCAhKHNlbGZTdG9yZS5zdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGlkeCA9IGVmZmVjdGl2ZS5zb3VyY2VzLmluZGV4T2Yoc2VsZik7XG4gICAgICAgICAgICBsZXQgc2hhZG93ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaWR4OyBqKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3RoZXIgPSBlZmZlY3RpdmUuc291cmNlc1tqXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG90aGVyID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgW3dzLCB3ZV0gPSBvdGhlci52YWxpZFdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoISh3cyA8PSB3aW5kb3dTdGFydCAmJiB3aW5kb3dTdGFydCA8IHdlKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHIgPSBvdGhlci5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgICAgIGlmIChyWzBdIDw9IHNlbGZSb3V0ZVswXSAmJiBzZWxmUm91dGVbMV0gPD0gclsxXSkge1xuICAgICAgICAgICAgICAgICAgICBzaGFkb3dlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaGFkb3dlZCkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgdW5jb3ZlcmVkOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbW3NlbGZSb3V0ZVswXSwgc2VsZlJvdXRlWzFdXV07XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVmZmVjdGl2ZS5zb3VyY2VzLmxlbmd0aCAmJiB1bmNvdmVyZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3RoZXIgPSBlZmZlY3RpdmUuc291cmNlc1tqXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG90aGVyID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgW3dzLCB3ZV0gPSBvdGhlci52YWxpZFdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoISh3cyA8PSBwcmV2VGltZSAmJiBwcmV2VGltZSA8IHdlKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHIgPSBvdGhlci5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmc6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjbGFpbWVkOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHUgb2YgdW5jb3ZlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnRlciA9IHJvdXRlSW50ZXJzZWN0aW9uKHUsIHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWludGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcucHVzaCh1KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYWltZWQgPSBjbGFpbWVkICYmIFtNYXRoLm1pbihjbGFpbWVkWzBdLCBpbnRlclswXSksIE1hdGgubWF4KGNsYWltZWRbMV0sIGludGVyWzFdKV0gYXMgW251bWJlciwgbnVtYmVyXSB8fCBpbnRlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVbMF0gPCBpbnRlclswXSkgcmVtYWluaW5nLnB1c2goW3VbMF0sIGludGVyWzBdXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlclsxXSA8IHVbMV0pIHJlbWFpbmluZy5wdXNoKFtpbnRlclsxXSwgdVsxXV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1bmNvdmVyZWQgPSByZW1haW5pbmc7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGFpbWVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZkluZGV4U2V0LmhhcyhqKSkge1xuICAgICAgICAgICAgICAgICAgICBuZWVkRGlza1NjYW4uYWRkKHNlbGZTdG9yZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVycyA9IHJlbW90ZU93bmVycy5nZXQoc2VsZlN0b3JlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvd25lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG93bmVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZU93bmVycy5zZXQoc2VsZlN0b3JlLCBvd25lcnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IG93bmVycy5nZXQoaik7XG4gICAgICAgICAgICAgICAgICAgIG93bmVycy5zZXQoaiwgZXhpc3RpbmcgJiYgW01hdGgubWluKGV4aXN0aW5nWzBdLCBjbGFpbWVkWzBdKSwgTWF0aC5tYXgoZXhpc3RpbmdbMV0sIGNsYWltZWRbMV0pXSBhcyBbbnVtYmVyLCBudW1iZXJdIHx8IGNsYWltZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5lZWREaXNrU2Nhbi5zaXplICYmICFyZW1vdGVPd25lcnMuc2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyhgQm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pOiBkaXNrU2NhbnM9JHtuZWVkRGlza1NjYW4uc2l6ZX0sIHN0b3JlcyB3aXRoIHJlbW90ZSBwcmV2aW91cy13aW5kb3cgb3duZXJzOiAke3JlbW90ZU93bmVycy5zaXplfWApO1xuICAgICAgICBmb3IgKGxldCBzZWxmU3RvcmUgb2YgbmVlZERpc2tTY2FuKSB7XG4gICAgICAgICAgICBpZiAoc2VsZlN0b3JlLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc2VsZlN0b3JlLnN0b3JlLnJlc2NhbkJhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgc2luY2UgPSB3aW5kb3dTdGFydCAtIEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0s7XG4gICAgICAgIGZvciAobGV0IFtzZWxmU3RvcmUsIG93bmVyc10gb2YgcmVtb3RlT3duZXJzKSB7XG4gICAgICAgICAgICBpZiAoIShzZWxmU3RvcmUuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAobGV0IFtzb3VyY2VJbmRleCwgcm91dGVdIG9mIG93bmVycykge1xuICAgICAgICAgICAgICAgIGxldCBvd25lclNvdXJjZSA9IGVmZmVjdGl2ZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG93bmVyU291cmNlID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZWxmU3RvcmUuc3RvcmUuYm91bmRhcnlTY2FuUmVtb3RlKGNyZWF0ZUFwaUFyY2hpdmVzKG93bmVyU291cmNlKSwgeyBzaW5jZSwgcm91dGUgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCb3VuZGFyeSBzY2FuICgke2xhYmVsfSkgb2YgcHJldmlvdXMtd2luZG93IG93bmVyIChzb3VyY2UgaW5kZXggJHtzb3VyY2VJbmRleH0pIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBib3VuZGFyeVNjYW5zUnVubmluZy5kZWxldGUoYnVja2V0S2V5KTtcbiAgICB9XG59XG5cbmNvbnN0IHJlc29sdmVkU291cmNlQXJjaGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgSUFyY2hpdmVzPigpO1xuLyoqIEEgY2FjaGVkIElBcmNoaXZlcyBmb3IgYSBwZXJzaXN0ZWQgc291cmNlIGlkZW50aXR5OiBhIHJvdXRpbmcgVVJMIChob3N0ZWQvYmFja2JsYXplKSBvciBhIGRpc2sgZm9sZGVyIHBhdGggLSB0aGUgZm9ybSBCbG9iU3RvcmUncyBzb3VyY2VzIGxpc3Qgc3RvcmVzLiBDb25maWd1cmF0aW9uICh2YWxpZCB3aW5kb3dzLCByb3V0ZXMpIGRlY2lkZXMgV0hFTiBhIHNvdXJjZSBzaG91bGQgYmUgdXNlZDsgZm9yIHJlYWRpbmcgYnl0ZXMgdGhlIGluZGV4IHNheXMgYSBzb3VyY2UgaG9sZHMsIHRoZSBVUkwgYWxvbmUgaXMgZW5vdWdoIC0gZXZlbiBmb3Igc291cmNlcyBubyBsb25nZXIgaW4gYW55IGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU291cmNlQXJjaGl2ZXModXJsOiBzdHJpbmcpOiBJQXJjaGl2ZXMge1xuICAgIGxldCBleGlzdGluZyA9IHJlc29sdmVkU291cmNlQXJjaGl2ZXMuZ2V0KHVybCk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgbGV0IGFyY2hpdmVzOiBJQXJjaGl2ZXM7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgLy8gVGhlIGNvbmZpZyBpcyBmYWJyaWNhdGVkIGZyb20gdGhlIGJhcmUgVVJMIGFuZCBjYW4gbmV2ZXIgZXhhY3QtbWF0Y2ggYSBzZXJ2ZXIncyBlbnRyaWVzIC0gd2hpY2ggaXMgZmluZSwgYmVjYXVzZSBob2xkZXIgcmVhZHMgYXJlIGludGVybmFsIHJlYWRzLCBhbmQgaW50ZXJuYWwgcmVhZHMgbmV2ZXIgc2VsZWN0IGEgc3RvcmUgKHNlZSByZWFkQnVja2V0SW50ZXJuYWwpXG4gICAgICAgIGFyY2hpdmVzID0gY3JlYXRlQXBpQXJjaGl2ZXMobm9ybWFsaXplU291cmNlKHVybCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFyY2hpdmVzID0gbmV3IEFyY2hpdmVzRGlzayh1cmwpO1xuICAgIH1cbiAgICByZXNvbHZlZFNvdXJjZUFyY2hpdmVzLnNldCh1cmwsIGFyY2hpdmVzKTtcbiAgICByZXR1cm4gYXJjaGl2ZXM7XG59XG5cbmZ1bmN0aW9uIHNvdXJjZUlkZW50aXR5KHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIXNvdXJjZUNvbmZpZykgcmV0dXJuIFwiZGlza1wiO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IC4uLnNvdXJjZUNvbmZpZywgdmFsaWRXaW5kb3c6IHVuZGVmaW5lZCwgcm91dGU6IHVuZGVmaW5lZCB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTdG9yZShhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgcGxhblN0b3JlOiBTdG9yZVBsYW5TdG9yZSk6IElCdWNrZXRTdG9yZSB7XG4gICAgbGV0IGZvbGRlciA9IGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lLCBwbGFuU3RvcmUucm91dGUpO1xuICAgIGlmIChwbGFuU3RvcmUucmF3RGlzaykge1xuICAgICAgICByZXR1cm4gbmV3IFJhd0Rpc2tTdG9yZShuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlcikpO1xuICAgIH1cbiAgICBsZXQgc291cmNlczogQXJjaGl2ZXNTb3VyY2VbXSA9IHBsYW5TdG9yZS5zb3VyY2VTcGVjcy5tYXAoc3BlYyA9PiAoe1xuICAgICAgICBzb3VyY2U6IHNwZWMuc291cmNlQ29uZmlnICYmIGNyZWF0ZUFwaUFyY2hpdmVzKHNwZWMuc291cmNlQ29uZmlnKSB8fCBuZXcgQXJjaGl2ZXNEaXNrKGZvbGRlciksXG4gICAgICAgIHVybDogc3BlYy5zb3VyY2VDb25maWc/LnVybCB8fCBmb2xkZXIsXG4gICAgICAgIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LFxuICAgICAgICByb3V0ZTogc3BlYy5yb3V0ZSxcbiAgICAgICAgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLFxuICAgICAgICBpbnRlcm1lZGlhdGU6IHNwZWMuc291cmNlQ29uZmlnPy5pbnRlcm1lZGlhdGUsXG4gICAgICAgIHNvdXJjZUNvbmZpZzogc3BlYy5zb3VyY2VDb25maWcsXG4gICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzcGVjLnNvdXJjZUNvbmZpZyksXG4gICAgfSkpO1xuICAgIHJldHVybiBuZXcgQmxvYlN0b3JlKGZvbGRlciwgc291cmNlcywge1xuICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHBsYW5TdG9yZS5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgIG9uV3JpdGVDb3VudGVkOiAoa2luZCwgYnl0ZXMpID0+IGNvdW50QnVja2V0V3JpdGUoYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWAsIGtpbmQsIGJ5dGVzKSxcbiAgICAgICAgcmVzb2x2ZVNvdXJjZVVybDogcmVzb2x2ZVNvdXJjZUFyY2hpdmVzLFxuICAgICAgICBlbnRyaWVzOiBwbGFuU3RvcmUuZW50cmllcyxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHJvdXRpbmc6IFJlbW90ZUNvbmZpZywgcGxhbj86IFN0b3JlUGxhbik6IEJ1Y2tldFN0YXRlIHtcbiAgICBpZiAoIXBsYW4pIHtcbiAgICAgICAgcGxhbiA9IGNvbXB1dGVTdG9yZVBsYW4oYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZyk7XG4gICAgfVxuICAgIGxldCB7IHNlbGZFbnRyaWVzLCBzZWxmIH0gPSBwbGFuO1xuICAgIGlmICghc2VsZikge1xuICAgICAgICBjb25zb2xlLmxvZyhgVGhpcyBzZXJ2ZXIgaXMgbm90IGluIHRoZSByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfTogbm8gbG9uZ2VyIHN5bmNocm9uaXppbmcsIHZhbGlkIHdpbmRvdyB0cmVhdGVkIGFzIFswLCAwXSAoZmFzdCB3cml0ZXMgZmx1c2ggaW1tZWRpYXRlbHkpLCBkaXNrIGRhdGEga2VwdCBhbmQgc2VydmVkYCk7XG4gICAgfVxuICAgIGxldCBzdG9yZXM6IExvYWRlZFN0b3JlW10gPSBwbGFuLnN0b3Jlcy5tYXAocGxhblN0b3JlID0+ICh7XG4gICAgICAgIHJvdXRlS2V5OiBwbGFuU3RvcmUucm91dGVLZXksXG4gICAgICAgIHJvdXRlOiBwbGFuU3RvcmUucm91dGUsXG4gICAgICAgIGVudHJpZXM6IHBsYW5TdG9yZS5lbnRyaWVzLFxuICAgICAgICBmb2xkZXI6IGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lLCBwbGFuU3RvcmUucm91dGUpLFxuICAgICAgICBzdG9yZTogYnVpbGRTdG9yZShhY2NvdW50LCBidWNrZXROYW1lLCBwbGFuU3RvcmUpLFxuICAgIH0pKTtcbiAgICBsZXQgbG9hZGVkOiBCdWNrZXRTdGF0ZSA9IHsgYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZywgcm91dGluZ0pTT046IEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpLCBzZWxmRW50cmllcywgc2VsZiwgc3RvcmVzLCBzdHJ1Y3R1cmVLZXk6IHBsYW4uc3RydWN0dXJlS2V5IH07XG4gICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICBzY2hlZHVsZUJvdW5kYXJ5U2NhbnMobG9hZGVkKTtcbiAgICAvLyBBIGxvYWRlZCBidWNrZXQgbXVzdCBhY3R1YWxseSBiZSBydW5uaW5nOiBlYWNoIHN0b3JlJ3MgaW5pdCBsb2FkcyBpdHMgaW5kZXggYW5kIHN0YXJ0cyBpdHMgc291cmNlIHN5bmNocm9uaXphdGlvbiwgYW5kIGl0IGlzIGxhenksIHNvIHdpdGhvdXQgdGhpcyBhIGJ1Y2tldCBub3RoaW5nIGhhcyByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBzaXRzIGluZXJ0IC0gcmVwb3J0aW5nIG5vIGRhdGEgYW5kIG5vIHN5bmNpbmcgd2hpbGUgaXRzIGRpc2sgaXMgZnVsbCBvZiBmaWxlcy5cbiAgICBmb3IgKGxldCBzIG9mIHN0b3Jlcykge1xuICAgICAgICBpZiAocy5zdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkge1xuICAgICAgICAgICAgbGV0IHN0b3JlID0gcy5zdG9yZTtcbiAgICAgICAgICAgIHZvaWQgc3RvcmUuaW5pdCgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgSW5pdGlhbGl6aW5nIHRoZSBzdG9yZSBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSAocm91dGUgJHtzLnJvdXRlS2V5fSkgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvYWRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QnVja2V0U3RhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgcm91dGluZyA9IGF3YWl0IHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFyb3V0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBidWlsZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRlZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QnVja2V0U3RhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGxvYWRlZCA9IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgbG9hZGVkID0gbG9hZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBsb2FkZWQpO1xuICAgICAgICB2b2lkIGxvYWRlZC50aGVuKGJ1Y2tldCA9PiB7XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldCAmJiBidWNrZXRzLmdldChrZXkpID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYnVja2V0cy5nZXQoa2V5KSA9PT0gbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0cy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkZWQ7XG59XG5cbmNvbnN0IHJvdXRpbmdSZWxvYWRzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5mdW5jdGlvbiBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgZm9yY2U/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbmV4dCA9IChyb3V0aW5nUmVsb2Fkcy5nZXQoa2V5KSB8fCBQcm9taXNlLnJlc29sdmUoKSlcbiAgICAgICAgLnRoZW4oKCkgPT4gY2hlY2tSb3V0aW5nQ2hhbmdlZChhY2NvdW50LCBidWNrZXROYW1lLCBjb25maWcpKVxuICAgICAgICAuY2F0Y2goZSA9PiBjb25zb2xlLmVycm9yKGBSZWxvYWRpbmcgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOmAsIGUpKTtcbiAgICByb3V0aW5nUmVsb2Fkcy5zZXQoa2V5LCBuZXh0KTtcbiAgICByZXR1cm4gbmV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tSb3V0aW5nQ2hhbmdlZChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgY29uZmlnPzogeyBmb3JjZT86IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghcm91dGluZykgcmV0dXJuO1xuICAgIGlmICghY29uZmlnPy5mb3JjZSAmJiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSA9PT0gbG9hZGVkLnJvdXRpbmdKU09OKSByZXR1cm47XG4gICAgbGV0IHJlYXNvbiA9IGNvbmZpZz8uZm9yY2UgJiYgKGNvbmZpZy5yZWFzb24gfHwgXCJmb3JjZWRcIikgfHwgXCJyb3V0aW5nIGNvbmZpZyBjaGFuZ2VkXCI7XG4gICAgbGV0IHBsYW4gPSBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcpO1xuICAgIGlmIChwbGFuLnN0cnVjdHVyZUtleSA9PT0gbG9hZGVkLnN0cnVjdHVyZUtleSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQXBwbHlpbmcgdGhlIHJvdXRpbmcgY29uZmlnIHRvIHRoZSBydW5uaW5nIHN0b3JlcyBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KWApO1xuICAgICAgICBmb3IgKGxldCBwbGFuU3RvcmUgb2YgcGxhbi5zdG9yZXMpIHtcbiAgICAgICAgICAgIGxldCBsaXZlID0gbG9hZGVkLnN0b3Jlcy5maW5kKHggPT4geC5yb3V0ZUtleSA9PT0gcGxhblN0b3JlLnJvdXRlS2V5KTtcbiAgICAgICAgICAgIC8vIHN0cnVjdHVyZUtleSBlcXVhbGl0eSBtZWFucyB0aGUgc3RvcmUgc2V0IChyb3V0ZXMsIHJhd0Rpc2ssIGxpbWl0cykgaXMgdW5jaGFuZ2VkLCBzbyBldmVyeSBwbGFuIHN0b3JlIGhhcyBpdHMgbGl2ZSB0d2luXG4gICAgICAgICAgICBpZiAoIWxpdmUgfHwgIShsaXZlLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc3RvcmVGb2xkZXIgPSBsaXZlLmZvbGRlcjtcbiAgICAgICAgICAgIGxpdmUuc3RvcmUudXBkYXRlU291cmNlcyhwbGFuU3RvcmUuc291cmNlU3BlY3MubWFwKHNwZWMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbmZpZyA9IHNwZWMuc291cmNlQ29uZmlnO1xuICAgICAgICAgICAgICAgIGlmICghc291cmNlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eSh1bmRlZmluZWQpLCB1cmw6IHN0b3JlRm9sZGVyLCB2YWxpZFdpbmRvdzogc3BlYy52YWxpZFdpbmRvdywgY3JlYXRlOiAoKTogSUFyY2hpdmVzID0+IG5ldyBBcmNoaXZlc0Rpc2soc3RvcmVGb2xkZXIpIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHNvdXJjZUNvbmZpZy51cmwsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LFxuICAgICAgICAgICAgICAgICAgICByb3V0ZTogc3BlYy5yb3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLFxuICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGU6IHNvdXJjZUNvbmZpZy5pbnRlcm1lZGlhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlOiAoKSA9PiBjcmVhdGVBcGlBcmNoaXZlcyhzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSwgcGxhblN0b3JlLmVudHJpZXMpO1xuICAgICAgICAgICAgbGl2ZS5lbnRyaWVzID0gcGxhblN0b3JlLmVudHJpZXM7XG4gICAgICAgIH1cbiAgICAgICAgbG9hZGVkLnJvdXRpbmcgPSByb3V0aW5nO1xuICAgICAgICBsb2FkZWQucm91dGluZ0pTT04gPSBKU09OLnN0cmluZ2lmeShyb3V0aW5nKTtcbiAgICAgICAgbG9hZGVkLnNlbGZFbnRyaWVzID0gcGxhbi5zZWxmRW50cmllcztcbiAgICAgICAgbG9hZGVkLnNlbGYgPSBwbGFuLnNlbGY7XG4gICAgICAgIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZCk7XG4gICAgICAgIHNjaGVkdWxlQm91bmRhcnlTY2Fucyhsb2FkZWQpO1xuICAgICAgICBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBSZWJ1aWxkaW5nIHRoZSBzdG9yZXMgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSk6IHN0cnVjdHVyZSBjaGFuZ2VkIGZyb20gJHtsb2FkZWQuc3RydWN0dXJlS2V5fSB0byAke3BsYW4uc3RydWN0dXJlS2V5fWApO1xuICAgIGZvciAobGV0IHMgb2YgbG9hZGVkLnN0b3Jlcykge1xuICAgICAgICBpZiAocy5zdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkge1xuICAgICAgICAgICAgYXdhaXQgcy5zdG9yZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUoYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZywgcGxhbikpKTtcbiAgICBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCgpO1xufVxuXG5jb25zdCByb3V0aW5nV3JpdGVzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5cbi8qKiBUaGUgcm91dGluZy1jb25maWcgd3JpdGUgcGF0aCAtIHRoZSBPTkUgd3JpdGUgdGhhdCBjYW5ub3QgZ28gdGhyb3VnaCBhIHN0b3JlIChpdCBpcyB3aGF0IENSRUFURVMgdGhlIGJ1Y2tldCBhbmQgaXRzIHN0b3JlcykuIFNlcmlhbGl6ZWQgcGVyIGJ1Y2tldDogY29uY3VycmVudCBjb25maWcgd3JpdGVzIHdvdWxkIHJhY2UgdGhlIHZlcnNpb24gY2hlY2suICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcXVldWVSb3V0aW5nQ29uZmlnV3JpdGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IHJ1biA9IChyb3V0aW5nV3JpdGVzLmdldChrZXkpIHx8IFByb21pc2UucmVzb2x2ZSgpKS50aGVuKCgpID0+IHdyaXRlUm91dGluZ0NvbmZpZyhhY2NvdW50LCBidWNrZXROYW1lLCBkYXRhLCBjb25maWcpKTtcbiAgICByb3V0aW5nV3JpdGVzLnNldChrZXksIHJ1bi50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KSk7XG4gICAgcmV0dXJuIGF3YWl0IHJ1bjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVSb3V0aW5nQ29uZmlnKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGluY29taW5nID0gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGF3YWl0IHJlc29sdmVTb3VyY2VBcmNoaXZlcyhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUoYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgaW5jb21pbmcpKSk7XG4gICAgICAgIGJyb2FkY2FzdFJvdXRpbmdDaGFuZ2VkKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkIGJ1Y2tldCAke2tleX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpICE9PSBsb2FkZWQucm91dGluZ0pTT04gJiYgZ2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZykgPD0gZ2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZykpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBgQ2Fubm90IHVwZGF0ZSByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7a2V5fTogdGhlIG5ldyBjb25maWcgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IG9uZSBidXQgaXRzIHZlcnNpb24gKCR7Z2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZyl9KSBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24gKCR7Z2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZyl9KS4gSW5jcmVtZW50IHRoZSB2ZXJzaW9uIHRvIHVwZGF0ZSBpdC4gQ3VycmVudDogJHtsb2FkZWQucm91dGluZ0pTT059LiBBdHRlbXB0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpfWA7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgbGV0IHN0b3JlZCA9IGluY29taW5nO1xuICAgIGxldCByZWluamVjdGVkID0gMDtcbiAgICBmb3IgKGxldCBpbnRlcm1lZGlhdGUgb2YgZ2V0SW50ZXJtZWRpYXRlU291cmNlcyhleHBpcmVJbnRlcm1lZGlhdGVTb3VyY2VzKGxvYWRlZC5yb3V0aW5nLCBEYXRlLm5vdygpKSkpIHtcbiAgICAgICAgc3RvcmVkID0gaW5qZWN0SW50ZXJtZWRpYXRlU291cmNlKHN0b3JlZCwge1xuICAgICAgICAgICAgc3BsaXRVcmw6IGZpbmRTcGxpdFVybChsb2FkZWQucm91dGluZywgaW50ZXJtZWRpYXRlKSB8fCBpbnRlcm1lZGlhdGUudXJsLFxuICAgICAgICAgICAgaW50ZXJtZWRpYXRlVXJsOiBpbnRlcm1lZGlhdGUudXJsLFxuICAgICAgICAgICAgc3RhcnQ6IGludGVybWVkaWF0ZS52YWxpZFdpbmRvd1swXSxcbiAgICAgICAgICAgIGVuZDogaW50ZXJtZWRpYXRlLnZhbGlkV2luZG93WzFdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVpbmplY3RlZCsrO1xuICAgIH1cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSAhPT0gSlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZS1pbmplY3RlZCAke3JlaW5qZWN0ZWR9IGluLWZsaWdodCBzd2l0Y2hvdmVyIHdpbmRvd3MgaW50byB0aGUgaW5jb21pbmcgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKGluY29taW5nKX0pYCk7XG4gICAgfVxuICAgIC8vIFdyaXR0ZW4gc3RyYWlnaHQgaW50byB0aGUgcGxhaW4gYnVja2V0IGZvbGRlcjogdGhlIHJvdXRpbmcgZmlsZSBkZWZpbmVzIHRoZSBwZXItcm91dGUgc3RvcmVzLCBzbyBpdCBuZXZlciBmbG93cyB0aHJvdWdoIHRoZW1cbiAgICBhd2FpdCByZXNvbHZlU291cmNlQXJjaGl2ZXMoZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5zZXQoUk9VVElOR19GSUxFLCBCdWZmZXIuZnJvbShzZXJpYWxpemVSZW1vdGVDb25maWcoc3RvcmVkKSksIHsgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbi8qKiBXaGljaCBidWNrZXRzIHRoaXMgcHJvY2VzcyBjdXJyZW50bHkgaGFzIGxvYWRlZCAtIHdoYXQgYSBkZXBsb3kgc3VjY2Vzc29yIGFza3MgaXRzIHByZWRlY2Vzc29yIGZvciwgc28gaXQgYWN0aXZhdGVzIGV4YWN0bHkgdGhlIGJ1Y2tldHMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gdXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZUJ1Y2tldEtleXMoKTogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiBbLi4uYnVja2V0cy5rZXlzKCldLm1hcChrZXkgPT4ge1xuICAgICAgICBsZXQgc2xhc2ggPSBrZXkuaW5kZXhPZihcIi9cIik7XG4gICAgICAgIHJldHVybiB7IGFjY291bnQ6IGtleS5zbGljZSgwLCBzbGFzaCksIGJ1Y2tldE5hbWU6IGtleS5zbGljZShzbGFzaCArIDEpIH07XG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkQWxsTG9hZGVkQnVja2V0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBrZXkgb2YgWy4uLmJ1Y2tldHMua2V5cygpXSkge1xuICAgICAgICBsZXQgc2xhc2ggPSBrZXkuaW5kZXhPZihcIi9cIik7XG4gICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChrZXkuc2xpY2UoMCwgc2xhc2gpLCBrZXkuc2xpY2Uoc2xhc2ggKyAxKSwgeyBmb3JjZTogdHJ1ZSwgcmVhc29uOiBcImFsbCBsb2FkZWQgYnVja2V0cyB3ZXJlIGFza2VkIHRvIHJlYnVpbGRcIiB9KTtcbiAgICB9XG59XG5cbmNvbnN0IE9XTl9DT05GSUdfV1JJVEVfVEhST1RUTEUgPSAzMCAqIDEwMDA7XG5jb25zdCBJTlRFUk1FRElBVEVfTUFJTlRBSU5fSU5URVJWQUwgPSA2MCAqIDEwMDA7XG4vLyBQZXIgYnVja2V0LCBub3QgZ2xvYmFsOiBhIHN3aXRjaG92ZXIgaGFzIHRvIHdyaXRlIGV2ZXJ5IGJ1Y2tldCdzIHdpbmRvd3MgYXQgb25jZSwgYW5kIGEgc2hhcmVkIHRocm90dGxlIHdvdWxkIGxldCBvbmx5IG9uZSBidWNrZXQgdGhyb3VnaCBwZXIgaW50ZXJ2YWxcbmNvbnN0IGxhc3RPd25Db25maWdXcml0ZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlT3duUm91dGluZ0NvbmZpZyhsb2FkZWQ6IEJ1Y2tldFN0YXRlLCB1cGRhdGVkOiBSZW1vdGVDb25maWcsIHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IHNpbmNlTGFzdCA9IERhdGUubm93KCkgLSAobGFzdE93bkNvbmZpZ1dyaXRlLmdldChrZXkpIHx8IDApO1xuICAgIGlmIChzaW5jZUxhc3QgPCBPV05fQ09ORklHX1dSSVRFX1RIUk9UVExFKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBOb3Qgd3JpdGluZyBvdXIgb3duIHJvdXRpbmcgY29uZmlnIHVwZGF0ZSBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KTogdGhlIGxhc3Qgb25lIHdhcyAke3NpbmNlTGFzdH1tcyBhZ28sIHVuZGVyIHRoZSAke09XTl9DT05GSUdfV1JJVEVfVEhST1RUTEV9bXMgdGhyb3R0bGUuIFJldHJ5aW5nIG9uIHRoZSBuZXh0IG1haW50ZW5hbmNlIHBhc3MuIFdhbnRlZDogJHtKU09OLnN0cmluZ2lmeSh1cGRhdGVkKX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0T3duQ29uZmlnV3JpdGUuc2V0KGtleSwgRGF0ZS5ub3coKSk7XG4gICAgbGV0IHZlcnNpb24gPSBuZXh0SW50ZXJtZWRpYXRlVmVyc2lvbihnZXRDb25maWdWZXJzaW9uKGxvYWRlZC5yb3V0aW5nKSk7XG4gICAgbGV0IG5leHQ6IFJlbW90ZUNvbmZpZyA9IHsgLi4udXBkYXRlZCwgdmVyc2lvbiB9O1xuICAgIGNvbnNvbGUubG9nKGBXcml0aW5nICR7Uk9VVElOR19GSUxFfSBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KSwgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpfSAtPiAke3ZlcnNpb259OiAke0pTT04uc3RyaW5naWZ5KG5leHQpfWApO1xuICAgIGxldCBkYXRhID0gQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKG5leHQpKTtcbiAgICBhd2FpdCBxdWV1ZVJvdXRpbmdDb25maWdXcml0ZShsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUsIGRhdGEpO1xuICAgIGF3YWl0IHByb3BhZ2F0ZVJvdXRpbmdDb25maWcobG9hZGVkLCBuZXh0LCBkYXRhKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvcGFnYXRlUm91dGluZ0NvbmZpZyhsb2FkZWQ6IEJ1Y2tldFN0YXRlLCBuZXh0OiBSZW1vdGVDb25maWcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0YXJnZXRzID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUNvbmZpZz4oKTtcbiAgICBmb3IgKGxldCBzb3VyY2Ugb2YgWy4uLmxvYWRlZC5yb3V0aW5nLnNvdXJjZXMsIC4uLm5leHQuc291cmNlc10pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlLmludGVybWVkaWF0ZSkgY29udGludWU7XG4gICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gXCJyZW1vdGVcIikge1xuICAgICAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHNvdXJjZS51cmwpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZC5hY2NvdW50ICE9PSBsb2FkZWQuYWNjb3VudCB8fCBwYXJzZWQuYnVja2V0TmFtZSAhPT0gbG9hZGVkLmJ1Y2tldE5hbWUpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXRzLmhhcyhzb3VyY2UudXJsKSkgY29udGludWU7XG4gICAgICAgIHRhcmdldHMuc2V0KHNvdXJjZS51cmwsIHNvdXJjZSk7XG4gICAgfVxuICAgIGZvciAobGV0IFt1cmwsIHNvdXJjZV0gb2YgdGFyZ2V0cykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgY3JlYXRlQXBpQXJjaGl2ZXMoc291cmNlKS5zZXQoUk9VVElOR19GSUxFLCBkYXRhKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXcm90ZSAke1JPVVRJTkdfRklMRX0gZm9yIGJ1Y2tldCAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfSB0byAke3VybH1gKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUHJvcGFnYXRpbmcgb3VyIHJvdXRpbmcgY29uZmlnIHVwZGF0ZSB0byAke3VybH0gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWludGFpbkludGVybWVkaWF0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgbGV0IHRha2VvdmVyID0gZ2V0VGFrZW92ZXJJbnRlcm1lZGlhdGUoKTtcbiAgICBsZXQgd3JpdHRlbjogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgYWxyZWFkeUNvcnJlY3Q6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG5vdE91cnM6IHN0cmluZ1tdID0gW107XG4gICAgLy8gT05MWSBidWNrZXRzIGFscmVhZHkgaW4gbWVtb3J5LiBBIHN3aXRjaG92ZXIgbXVzdCBuZXZlciBsb2FkIGEgYnVja2V0OiBsb2FkaW5nIHN0YXJ0cyBpdHMgc3luY2hyb25pemF0aW9uLCBhbmQgYnVja2V0cyBub3RoaW5nIGhhcyB0b3VjaGVkIChsZWdhY3kgb25lcyBlc3BlY2lhbGx5KSBoYXZlIG5vIHdyaXRlcyB0byBoYW5kIG9mZiBpbiB0aGUgZmlyc3QgcGxhY2UuIE9uZSB0aGF0IGRvZXMgZ2V0IHVzZWQgbWlkLXN3aXRjaG92ZXIgbG9hZHMgb24gdGhhdCBhY2Nlc3MsIGFuZCB0aGUgbmV4dCBwYXNzIGdpdmVzIGl0IGl0cyB3aW5kb3cuXG4gICAgbGV0IGtleXMgPSBbLi4uYnVja2V0cy5rZXlzKCldO1xuICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGxldCBsb2FkZWRQcm9taXNlID0gYnVja2V0cy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFsb2FkZWRQcm9taXNlKSBjb250aW51ZTtcbiAgICAgICAgbGV0IGxvYWRlZCA9IGF3YWl0IGxvYWRlZFByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKCFsb2FkZWQpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgZXhwaXJlZCA9IGV4cGlyZUludGVybWVkaWF0ZVNvdXJjZXMobG9hZGVkLnJvdXRpbmcsIERhdGUubm93KCkpO1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZXhwaXJlZCkgIT09IEpTT04uc3RyaW5naWZ5KGxvYWRlZC5yb3V0aW5nKSkge1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVPd25Sb3V0aW5nQ29uZmlnKGxvYWRlZCwgZXhwaXJlZCwgYHN3aXRjaG92ZXIgd2luZG93cyBleHBpcmVkIG1vcmUgdGhhbiAke0lOVEVSTUVESUFURV9FWFBJUkVfR1JBQ0UgLyAxMDAwfXMgYWdvYCk7XG4gICAgICAgICAgICB3cml0dGVuLnB1c2goa2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGFrZW92ZXIpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbWFpblVybCA9IGxvYWRlZC5yb3V0aW5nLnNvdXJjZXMuZmluZCh4ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiB8fCB4LnR5cGUgIT09IFwicmVtb3RlXCIgfHwgeC5pbnRlcm1lZGlhdGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybCh4LnVybCk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkLmFkZHJlc3MgPT09IGRvbWFpbiAmJiBwYXJzZWQucG9ydCA9PT0gcG9ydDtcbiAgICAgICAgfSkgYXMgSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIW1haW5VcmwpIHtcbiAgICAgICAgICAgIG5vdE91cnMucHVzaChrZXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluamVjdGVkID0gaW5qZWN0SW50ZXJtZWRpYXRlU291cmNlKGxvYWRlZC5yb3V0aW5nLCB7XG4gICAgICAgICAgICBzcGxpdFVybDogbWFpblVybC51cmwsXG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVVcmw6IHJlcGxhY2VIb3N0ZWRVcmxQb3J0KG1haW5VcmwudXJsLCB0YWtlb3Zlci5hbHRQb3J0KSxcbiAgICAgICAgICAgIHN0YXJ0OiB0YWtlb3Zlci5zdGFydCxcbiAgICAgICAgICAgIGVuZDogdGFrZW92ZXIuZW5kLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGluamVjdGVkKSA9PT0gSlNPTi5zdHJpbmdpZnkobG9hZGVkLnJvdXRpbmcpKSB7XG4gICAgICAgICAgICBhbHJlYWR5Q29ycmVjdC5wdXNoKGtleSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB3cml0ZU93blJvdXRpbmdDb25maWcobG9hZGVkLCBpbmplY3RlZCwgYHdlIGFyZSBhIGRlcGxveSBzdWNjZXNzb3I6IHdyaXRlcyByb3V0ZSB0byBvdXIgYWx0ZXJuYXRlIHBvcnQgJHt0YWtlb3Zlci5hbHRQb3J0fSBmcm9tICR7bmV3IERhdGUodGFrZW92ZXIuc3RhcnQpLnRvSVNPU3RyaW5nKCl9IHVudGlsIG91ciBwcmVkZWNlc3NvciBpcyBraWxsZWQgYXQgJHtuZXcgRGF0ZSh0YWtlb3Zlci5lbmQpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICAgIHdyaXR0ZW4ucHVzaChrZXkpO1xuICAgIH1cbiAgICBpZiAoIXRha2VvdmVyKSByZXR1cm47XG4gICAgaWYgKCFrZXlzLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgTm8gYWN0aXZlIGJ1Y2tldHMsIHNvIG5vIGNvbmZpZyBmaWxlcyB0byB3cml0ZSB0aGUgaW50ZXJtZWRpYXRlIGludG8gKGEgYnVja2V0IGlzIG9ubHkgYWN0aXZlIG9uY2Ugc29tZXRoaW5nIHVzZXMgaXQpYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF3cml0dGVuLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgV3JvdGUgbm8gY29uZmlnIGZpbGVzOiBvZiAke2tleXMubGVuZ3RofSBhY3RpdmUgYnVja2V0cywgJHthbHJlYWR5Q29ycmVjdC5sZW5ndGh9IGFscmVhZHkgY29udGFpbiB0aGUgaW50ZXJtZWRpYXRlIGFuZCAke25vdE91cnMubGVuZ3RofSBhcmUgbm90IGhvc3RlZCBieSB1c2ApO1xuICAgIH1cbn1cblxuLyoqIE91ciBwcmVkZWNlc3NvciBzdGlsbCBob2xkcyB0aGUgbWFpbiBwb3J0IGFuZCBoYXMgYmVlbiBzZXJ2aW5nIGFsbCBhbG9uZywgc28gaXQgLSBub3QgdXMgLSBrbm93cyB3aGljaCBidWNrZXRzIGFyZSBpbiB1c2UuIFdlIGFjdGl2YXRlIGV4YWN0bHkgdGhvc2UsIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlaXIgY29uZmlnIGZpbGVzIGdldCB0aGUgaW50ZXJtZWRpYXRlOyBub3RoaW5nIGVsc2Ugb24gZGlzayBpcyB0b3VjaGVkLiAqL1xuYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVQcmVkZWNlc3NvckJ1Y2tldHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgbGV0IHVybCA9IGBodHRwczovLyR7ZG9tYWlufToke3BvcnR9YDtcbiAgICBsZXQga2V5czogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9W107XG4gICAgdHJ5IHtcbiAgICAgICAga2V5cyA9IGF3YWl0IGxpc3RTZXJ2ZXJBY3RpdmVCdWNrZXRLZXlzKHsgdXJsIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IGFzayBvdXIgcHJlZGVjZXNzb3Igb24gJHt1cmx9IHdoaWNoIGJ1Y2tldHMgYXJlIGFjdGl2ZSwgc28gb25seSBidWNrZXRzIHVzZWQgb24gdGhpcyBwcm9jZXNzIGdldCB0aGUgaW50ZXJtZWRpYXRlOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE91ciBwcmVkZWNlc3NvciBvbiAke3VybH0gaGFzIG5vIGFjdGl2ZSBidWNrZXRzLCBzbyB0aGVyZSBhcmUgbm8gY29uZmlnIGZpbGVzIHRvIHdyaXRlIHRoZSBpbnRlcm1lZGlhdGUgaW50b2ApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBPdXIgcHJlZGVjZXNzb3Igb24gJHt1cmx9IGhhcyAke2tleXMubGVuZ3RofSBhY3RpdmUgYnVja2V0cywgYWN0aXZhdGluZyB0aGVtIGhlcmUgc28gdGhlaXIgY29uZmlnIGZpbGVzIGdldCB0aGUgaW50ZXJtZWRpYXRlOiAke2tleXMubWFwKHggPT4gYCR7eC5hY2NvdW50fS8ke3guYnVja2V0TmFtZX1gKS5qb2luKFwiLCBcIil9YCk7XG4gICAgZm9yIChsZXQgeyBhY2NvdW50LCBidWNrZXROYW1lIH0gb2Yga2V5cykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBY3RpdmF0aW5nIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gKGFjdGl2ZSBvbiBvdXIgcHJlZGVjZXNzb3IpIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqIFN0YXJ0ZWQgYnkgZGVwbG95VGFrZW92ZXIgb25jZSB3ZSBhcmUgYWN0dWFsbHkgYSBkZXBsb3kgc3VjY2Vzc29yIGxpc3RlbmluZyBvbiBhbiBhbHRlcm5hdGUgcG9ydC4gVW50aWwgdGhlbiB0aGVyZSBhcmUgbm8gc3dpdGNob3ZlciB3aW5kb3dzIHRvIHdyaXRlIG9yIGV4cGlyZSwgc28gbm90aGluZyBwb2xscy4gKi9cbmV4cG9ydCBjb25zdCBzdGFydEludGVybWVkaWF0ZU1haW50ZW5hbmNlID0gbGF6eSgoKSA9PiB7XG4gICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBhY3RpdmF0ZVByZWRlY2Vzc29yQnVja2V0cygpO1xuICAgICAgICBhd2FpdCBtYWludGFpbkludGVybWVkaWF0ZXMoKTtcbiAgICB9KSgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgV3JpdGluZyB0aGUgaW50ZXJtZWRpYXRlIGludG8gdGhlIGNvbmZpZyBmaWxlcyBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICBydW5JbmZpbml0ZVBvbGwoSU5URVJNRURJQVRFX01BSU5UQUlOX0lOVEVSVkFMLCBtYWludGFpbkludGVybWVkaWF0ZXMpO1xufSk7XG5cbmV4cG9ydCB0eXBlIFNlcnZlckJ1Y2tldEluZm8gPSB7XG4gICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgICAvKiogV2hlcmUgdGhlIGJ1Y2tldCdzIGRhdGEgbGl2ZXMgb24gdGhpcyBzZXJ2ZXIgKi9cbiAgICBmb2xkZXI6IHN0cmluZztcbiAgICAvKiogVGhlIGRyaXZlIHRoYXQgZm9sZGVyIGlzIG9uLiBCdWNrZXRzIHNoYXJpbmcgYSBkcml2ZSByZXBvcnQgdGhlIHNhbWUgbnVtYmVycy4gKi9cbiAgICBkaXNrPzogQnVja2V0RGlza0luZm87XG4gICAgZGlza0Vycm9yPzogc3RyaW5nO1xuICAgIHdyaXRlU3RhdHM/OiBCdWNrZXRXcml0ZVN0YXRzO1xuICAgIGNvbmZpZz86IEFyY2hpdmVzQ29uZmlnO1xuICAgIGVycm9yPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQWN0aXZlQnVja2V0SW5mbyA9IHtcbiAgICBmb2xkZXI6IHN0cmluZztcbiAgICAvKiogVGhlIHJvdXRpbmcgY29uZmlnIHRoZSBidWNrZXQgaXMgUlVOTklORyBvbiwgc3RyYWlnaHQgZnJvbSBtZW1vcnkgLSBpbmNsdWRpbmcgc3dpdGNob3ZlciB3aW5kb3dzIHdyaXR0ZW4gc2luY2UgaXQgbG9hZGVkICovXG4gICAgcm91dGluZzogUmVtb3RlQ29uZmlnO1xuICAgIC8qKiBPdXIgb3duIGVudHJpZXMgaW4gdGhhdCBjb25maWcsIGFuZCB0aGVpciBzdW1tYXJpemVkIGN1cnJlbnQgcm9sZSAocm91dGVzIHVuaW9uICsgZmxhZ3MpICovXG4gICAgc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdO1xuICAgIHNlbGY/OiBTZWxmU3VtbWFyeTtcbiAgICBjb25maWc6IEFyY2hpdmVzQ29uZmlnO1xufTtcblxuZnVuY3Rpb24gdG9BY3RpdmVCdWNrZXRJbmZvKGxvYWRlZDogQnVja2V0U3RhdGUpOiBBY3RpdmVCdWNrZXRJbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb2xkZXI6IGdldEJ1Y2tldEZvbGRlcihsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUpLFxuICAgICAgICByb3V0aW5nOiBsb2FkZWQucm91dGluZyxcbiAgICAgICAgc2VsZkVudHJpZXM6IGxvYWRlZC5zZWxmRW50cmllcyxcbiAgICAgICAgc2VsZjogbG9hZGVkLnNlbGYsXG4gICAgICAgIGNvbmZpZzogZ2V0QnVja2V0Q29uZmlnKGxvYWRlZCksXG4gICAgfTtcbn1cblxuLyoqIFRoZSBsaXZlIGluLW1lbW9yeSBzdGF0ZSBvZiBPTkUgYnVja2V0LCBhbnN3ZXJlZCB3aXRob3V0IHRvdWNoaW5nIHRoZSBkaXNrIChubyByb3V0aW5nIGZpbGUgcmVhZCwgbm8gc3RhdGZzLCBubyBzdG9yZWQgd3JpdGUgc3RhdHMpLiBSZXR1cm5zIGFuIGVycm9yIHN0cmluZyB3aGVuIHRoZSBidWNrZXQgaXMgbm90IGxvYWRlZCBoZXJlLCB3aGljaCBpcyB0aGUgbm9ybWFsIHN0YXRlIGZvciBhIGJ1Y2tldCBub3RoaW5nIGhhcyBhY2Nlc3NlZCBzaW5jZSBzdGFydHVwLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFjdGl2ZUJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbG9hZGVkUHJvbWlzZSA9IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFsb2FkZWRQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBpcyBub3QgbG9hZGVkIG9uIHRoaXMgc2VydmVyLCBzbyBpdCBoYXMgbm8gbGl2ZSBzdGF0ZSAoaXQgbG9hZHMgb24gZmlyc3QgYWNjZXNzKWA7XG4gICAgfVxuICAgIGxldCBsb2FkZWQ6IEJ1Y2tldFN0YXRlIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICAgIGxvYWRlZCA9IGF3YWl0IGxvYWRlZFByb21pc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gZmFpbGVkIHRvIGxvYWQgb24gdGhpcyBzZXJ2ZXI6ICR7U3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApfWA7XG4gICAgfVxuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHNlcnZlcmA7XG4gICAgfVxuICAgIHJldHVybiB0b0FjdGl2ZUJ1Y2tldEluZm8obG9hZGVkKTtcbn1cblxuLyoqIExvYWRzIGEgYnVja2V0IHRoYXQgZXhpc3RzIG9uIHRoaXMgc2VydmVyJ3MgZGlzayBpbnRvIG1lbW9yeSwgd2hpY2ggc3RhcnRzIGl0cyBzeW5jaHJvbml6YXRpb24gYW5kIHdpbmRvdyB0aW1lcnMsIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLiBOb3RoaW5nIGlzIHdyaXR0ZW4gYW5kIG5vIG90aGVyIHNlcnZlciBpcyBjb250YWN0ZWQgLSB1bmxpa2UgYnVpbGRpbmcgYW4gQXJjaGl2ZXNDaGFpbiBmb3IgaXQsIHdoaWNoIHdvdWxkIHByb2JlIGV2ZXJ5IHNvdXJjZSBhbmQgY291bGQgd3JpdGUgdGhlIHJvdXRpbmcgY29uZmlnLiBBbHJlYWR5LWxvYWRlZCBidWNrZXRzIGp1c3QgcmV0dXJuIHRoZWlyIHN0YXRlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCB3YXNMb2FkZWQgPSBidWNrZXRzLmhhcyhrZXkpO1xuICAgIGxldCBsb2FkZWQ6IEJ1Y2tldFN0YXRlIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICAgIGxvYWRlZCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBmYWlsZWQgdG8gbG9hZCBvbiB0aGlzIHNlcnZlcjogJHtTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCl9YDtcbiAgICB9XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgcmV0dXJuIGBCdWNrZXQgJHtrZXl9IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgc2VydmVyIChubyByb3V0aW5nIGZpbGUgaW4gJHtnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSl9KWA7XG4gICAgfVxuICAgIC8vIFdhaXQgZm9yIHRoZSBpbmRleGVzIHRvIGxvYWQsIHNvIHRoZSB0b3RhbHMgd2UgcmV0dXJuIGFyZSB0aGUgcmVhbCBvbmVzIHJhdGhlciB0aGFuIHplcm9lcyBmcm9tIHN0b3JlcyB0aGF0IGhhdmUgbm90IHJlYWQgdGhlaXIgaW5kZXggeWV0LiBUaGUgc291cmNlIHNjYW5zIGtlZXAgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICBmb3IgKGxldCBzIG9mIGxvYWRlZC5zdG9yZXMpIHtcbiAgICAgICAgaWYgKHMuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpIHtcbiAgICAgICAgICAgIGF3YWl0IHMuc3RvcmUuaW5pdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghd2FzTG9hZGVkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBY3RpdmF0ZWQgYnVja2V0ICR7a2V5fSBvbiByZXF1ZXN0OiBpdCBpcyBub3cgbG9hZGVkIGFuZCBzeW5jaHJvbml6aW5nYCk7XG4gICAgfVxuICAgIHJldHVybiB0b0FjdGl2ZUJ1Y2tldEluZm8obG9hZGVkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RBY2NvdW50QnVja2V0cyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgbGV0IHRpbWluZ3MgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHRpbWVkPFQ+KG5hbWU6IHN0cmluZywgcnVuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBiZWdhbiA9IERhdGUubm93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aW1pbmdzLnNldChuYW1lLCAodGltaW5ncy5nZXQobmFtZSkgfHwgMCkgKyAoRGF0ZS5ub3coKSAtIGJlZ2FuKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGFjY291bnRGb2xkZXIgPSBwYXRoLmpvaW4oZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpLmZvbGRlciwgXCJidWNrZXRzMlwiLCBhY2NvdW50KTtcbiAgICBsZXQgbmFtZXM6IHN0cmluZ1tdO1xuICAgIHRyeSB7XG4gICAgICAgIG5hbWVzID0gYXdhaXQgdGltZWQoXCJyZWFkZGlyXCIsICgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIoYWNjb3VudEZvbGRlcikpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8vIFBlci1yb3V0ZSBmb2xkZXJzIChidWNrZXROYW1lLXJvdXRlLTxzdGFydD4tPGVuZD4pIGJlbG9uZyB0byB0aGUgc2FtZSBidWNrZXQgYXMgdGhlIHBsYWluIGZvbGRlciAtIGNvbGxhcHNlIHRoZW0gc28gb25lIGJ1Y2tldCBsaXN0cyBvbmNlXG4gICAgbmFtZXMgPSBbLi4ubmV3IFNldChuYW1lcy5tYXAoeCA9PiB4LnJlcGxhY2UoLy1yb3V0ZS1bXFxkLl0rLVtcXGQuXSskLywgXCJcIikpKV07XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKG5hbWVzLm1hcChhc3luYyBidWNrZXROYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICAgICAgICAgIGxldCBmb2xkZXIgPSBnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgICAgICBsZXQgYmFzZTogU2VydmVyQnVja2V0SW5mbyA9IHsgYnVja2V0TmFtZSwgYWN0aXZlOiBmYWxzZSwgZm9sZGVyIH07XG4gICAgICAgICAgICBiYXNlLmRpc2sgPSBhd2FpdCB0aW1lZChcInN0YXRmc1wiLCAoKSA9PiBnZXREaXNrSW5mbyhmb2xkZXIpKS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBiYXNlLmRpc2tFcnJvciA9IFN0cmluZyhlLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmFzZS53cml0ZVN0YXRzID0gZ2V0QnVja2V0V3JpdGVTdGF0cyhrZXkpO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVkUHJvbWlzZSA9IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAobG9hZGVkUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCB0aW1lZChcImF3YWl0TG9hZGVkXCIsICgpID0+IGxvYWRlZFByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBhY3RpdmU6IHRydWUsIGNvbmZpZzogZ2V0QnVja2V0Q29uZmlnKGxvYWRlZCkgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgYWN0aXZlOiB0cnVlLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGltZWQoXCJyZWFkUm91dGluZ0ZpbGVcIiwgKCkgPT4gcmVhZFJvdXRpbmdGaWxlKGZvbGRlcikpO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBlcnJvcjogYE5vIHJvdXRpbmcgZmlsZSAoJHtST1VUSU5HX0ZJTEV9KWAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlZCA9IGF3YWl0IHRpbWVkKFwicGFyc2VSb3V0aW5nXCIsIGFzeW5jICgpID0+IHBhcnNlUm91dGluZ0RhdGEoZGF0YSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGNvbmZpZzogeyByZW1vdGVDb25maWc6IHBhcnNlZCB9IH07XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gVGhlIHBhcnRzIHJ1biBjb25jdXJyZW50bHksIHNvIHRoZXNlIGFyZSBzdW1tZWQgd2FsbCB0aW1lcyBwZXIgcGFydCwgbm90IGEgYnJlYWtkb3duIG9mIHRoZSB0b3RhbFxuICAgICAgICBsZXQgcGFydHMgPSBbLi4udGltaW5nc10ubWFwKChbbmFtZSwgbXNdKSA9PiBgJHtuYW1lfSAke21zfW1zYCkuam9pbihcIiwgXCIpO1xuICAgICAgICBjb25zb2xlLmxvZyhgbGlzdEFjY291bnRCdWNrZXRzKCR7YWNjb3VudH0pIHRvb2sgJHtEYXRlLm5vdygpIC0gc3RhcnR9bXMgZm9yICR7bmFtZXMubGVuZ3RofSBidWNrZXRzOiAke3BhcnRzfWApO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgQnVja2V0V3JpdGVTdGF0cyA9IHtcbiAgICAvKiogRXZlcnkgc2V0IGNhbGwgdGhlIGJ1Y2tldCBhY2NlcHRlZCAqL1xuICAgIG9yaWdpbmFsV3JpdGVzOiBudW1iZXI7XG4gICAgb3JpZ2luYWxCeXRlczogbnVtYmVyO1xuICAgIC8qKiBXaGF0IGFjdHVhbGx5IHJlYWNoZWQgdGhlIHNvdXJjZXMuIEZhc3Qgd3JpdGVzIGNvYWxlc2NlIHJlcGVhdGVkIHdyaXRlcyB0byB0aGUgc2FtZSBrZXksIHNvIHRoaXMgaXMgbG93ZXIgdGhhbiB0aGUgb3JpZ2luYWwgY291bnRzIChhbmQgaXMgd2hhdCB0aGUgZGlzayBhY3R1YWxseSBkaWQpLiAqL1xuICAgIGZsdXNoZWRXcml0ZXM6IG51bWJlcjtcbiAgICBmbHVzaGVkQnl0ZXM6IG51bWJlcjtcbn07XG5mdW5jdGlvbiBlbXB0eVdyaXRlU3RhdHMoKTogQnVja2V0V3JpdGVTdGF0cyB7XG4gICAgcmV0dXJuIHsgb3JpZ2luYWxXcml0ZXM6IDAsIG9yaWdpbmFsQnl0ZXM6IDAsIGZsdXNoZWRXcml0ZXM6IDAsIGZsdXNoZWRCeXRlczogMCB9O1xufVxuXG4vLyBJbiBtZW1vcnkgb25seTogdG90YWxzIHNpbmNlIHRoaXMgcHJvY2VzcyBzdGFydGVkIChvciB0aGUgbGFzdCBjbGVhcldyaXRlU3RhdHMpLiBQZXJzaXN0aW5nIHRoZW0gdG8gZGlzayB3YXMgbW9yZSBtYWNoaW5lcnkgdGhhbiB0aGUgbnVtYmVycyB3ZXJlIHdvcnRoLlxuY29uc3Qgd3JpdGVTdGF0cyA9IG5ldyBNYXA8c3RyaW5nLCBCdWNrZXRXcml0ZVN0YXRzPigpO1xuXG5mdW5jdGlvbiBjb3VudEJ1Y2tldFdyaXRlKGtleTogc3RyaW5nLCBraW5kOiBcIm9yaWdpbmFsXCIgfCBcImZsdXNoZWRcIiwgYnl0ZXM6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBzdGF0cyA9IHdyaXRlU3RhdHMuZ2V0KGtleSk7XG4gICAgaWYgKCFzdGF0cykge1xuICAgICAgICBzdGF0cyA9IGVtcHR5V3JpdGVTdGF0cygpO1xuICAgICAgICB3cml0ZVN0YXRzLnNldChrZXksIHN0YXRzKTtcbiAgICB9XG4gICAgaWYgKGtpbmQgPT09IFwib3JpZ2luYWxcIikge1xuICAgICAgICBzdGF0cy5vcmlnaW5hbFdyaXRlcysrO1xuICAgICAgICBzdGF0cy5vcmlnaW5hbEJ5dGVzICs9IGJ5dGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRzLmZsdXNoZWRXcml0ZXMrKztcbiAgICAgICAgc3RhdHMuZmx1c2hlZEJ5dGVzICs9IGJ5dGVzO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0QnVja2V0V3JpdGVTdGF0cyhrZXk6IHN0cmluZyk6IEJ1Y2tldFdyaXRlU3RhdHMge1xuICAgIHJldHVybiB3cml0ZVN0YXRzLmdldChrZXkpIHx8IGVtcHR5V3JpdGVTdGF0cygpO1xufVxuXG4vKiogWmVyb2VzIHRoZSB3cml0ZSBzdGF0aXN0aWNzIG9mIGV2ZXJ5IGJ1Y2tldCBpbiB0aGUgYWNjb3VudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckFjY291bnRXcml0ZVN0YXRzKGFjY291bnQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IHByZWZpeCA9IGAke2FjY291bnR9L2A7XG4gICAgbGV0IGNsZWFyZWQgPSAwO1xuICAgIGZvciAobGV0IGtleSBvZiBbLi4ud3JpdGVTdGF0cy5rZXlzKCldKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgIHdyaXRlU3RhdHMuZGVsZXRlKGtleSk7XG4gICAgICAgIGNsZWFyZWQrKztcbiAgICB9XG4gICAgY29uc29sZS5sb2coYENsZWFyZWQgdGhlIHdyaXRlIHN0YXRpc3RpY3Mgb2YgJHtjbGVhcmVkfSBidWNrZXRzIGluIGFjY291bnQgJHthY2NvdW50fWApO1xuICAgIHJldHVybiBjbGVhcmVkO1xufVxuXG5jb25zdCBMQVJHRV9GSUxFX1BBUlRfU0laRSA9IDggKiAxMDI0ICogMTAyNDtcblxuLy8gV3JhcHMgYSBsb2NhbGx5IGhvc3RlZCBidWNrZXQgaW4gdGhlIElBcmNoaXZlcyBpbnRlcmZhY2UsIHNvIGNvZGUgd3JpdHRlbiBhZ2FpbnN0IElBcmNoaXZlcyAodGhlIGNoYWluLCBzeW5jIHNvdXJjZXMsIGhvbGRlciByZWFkcykgdGFsa3MgdG8gaXQgZGlyZWN0bHkgaW5zdGVhZCBvZiBiZWNvbWluZyBhIG5ldHdvcmsgY2xpZW50IHRvIG91cnNlbHZlcy5cbmNsYXNzIEJ1Y2tldElBcmNoaXZlc1dyYXBwZXIgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYWNjb3VudDogc3RyaW5nLCBwcml2YXRlIGJ1Y2tldE5hbWU6IHN0cmluZywgcHJpdmF0ZSBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZykgeyB9XG5cbiAgICBwcml2YXRlIGZpbmRTdG9yZSgpOiBQcm9taXNlPExvYWRlZFN0b3JlPiB7XG4gICAgICAgIHJldHVybiBmaW5kQnVja2V0U3RvcmUodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIHRoaXMuc291cmNlQ29uZmlnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYGxvY2FsQnVja2V0IGFjY291bnQgJHt0aGlzLmFjY291bnR9IGJ1Y2tldCAke3RoaXMuYnVja2V0TmFtZX0gcm91dGUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnNvdXJjZUNvbmZpZy5yb3V0ZSB8fCBGVUxMX1JPVVRFKX1gO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKGZpbGVOYW1lID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZXRSb3V0aW5nRmlsZVJlc3VsdCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZz8uaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWFkQnVja2V0SW50ZXJuYWwodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIHsgcGF0aDogZmlsZU5hbWUsIHJhbmdlOiBjb25maWcucmFuZ2UsIGluY2x1ZGVUb21ic3RvbmVzOiBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IChhd2FpdCB0aGlzLmZpbmRTdG9yZSgpKS5zdG9yZS5nZXQyKHsgcGF0aDogZmlsZU5hbWUsIC4uLmNvbmZpZyB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgaWYgKGZpbGVOYW1lID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIGF3YWl0IHF1ZXVlUm91dGluZ0NvbmZpZ1dyaXRlKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBkYXRhLCBjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IChhd2FpdCB0aGlzLmZpbmRTdG9yZSgpKS5zdG9yZS5zZXQoeyAuLi5jb25maWcsIHBhdGg6IGZpbGVOYW1lLCBkYXRhIH0pO1xuICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogRGVsQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgYXdhaXQgKGF3YWl0IHRoaXMuZmluZFN0b3JlKCkpLnN0b3JlLmRlbCh7IHBhdGg6IGZpbGVOYW1lLCAuLi5jb25maWcgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBnZXROZXh0RGF0YSgpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgICAgIGxldCBzdG9yZSA9IChhd2FpdCB0aGlzLmZpbmRTdG9yZSgpKS5zdG9yZTtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgc3RvcmUuc3RhcnRMYXJnZVVwbG9hZCh7IHBhdGg6IGNvbmZpZy5wYXRoLCBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBkYXRhLmxlbmd0aDsgb2Zmc2V0ICs9IExBUkdFX0ZJTEVfUEFSVF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JlLmFwcGVuZExhcmdlVXBsb2FkKHsgaWQsIGRhdGE6IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBMQVJHRV9GSUxFX1BBUlRfU0laRSkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgc3RvcmUuZmluaXNoTGFyZ2VVcGxvYWQoeyBpZCwgcGF0aDogY29uZmlnLnBhdGgsIGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgc3RvcmUuY2FuY2VsTGFyZ2VVcGxvYWQoeyBpZCB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0SW5mb0NvbmZpZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKGZpbGVOYW1lID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBnZXRSb3V0aW5nRmlsZVJlc3VsdCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuc2l6ZSB9IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgKGF3YWl0IHRoaXMuZmluZFN0b3JlKCkpLnN0b3JlLmdldEluZm8oeyBwYXRoOiBmaWxlTmFtZSwgLi4uY29uZmlnIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCAoYXdhaXQgdGhpcy5maW5kU3RvcmUoKSkuc3RvcmUuZmluZEluZm8oeyBwcmVmaXgsIC4uLmNvbmZpZyB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IEZpbmRDb25maWcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgICAgICByZXR1cm4gYnVpbGRGaWxlVXJsKGBodHRwczovLyR7ZG9tYWlufToke3BvcnR9L2ZpbGUvJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5hY2NvdW50KX0vJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5idWNrZXROYW1lKX1gLCBmaWxlUGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICByZXR1cm4gZ2V0QnVja2V0Q29uZmlnKGF3YWl0IHJlcXVpcmVCdWNrZXQodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCAoYXdhaXQgdGhpcy5maW5kU3RvcmUoKSkuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyMihjb25maWcpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0U3luY1N0YXR1cyhhd2FpdCByZXF1aXJlQnVja2V0KHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lKSk7XG4gICAgfVxufVxuXG5jb25zdCBsb2NhbEFyY2hpdmVzID0gbmV3IE1hcDxzdHJpbmcsIElBcmNoaXZlcz4oKTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbEFyY2hpdmVzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyk6IElBcmNoaXZlcyB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX18JHtzdGFibGVTdHJpbmdpZnkoc291cmNlQ29uZmlnKX1gO1xuICAgIGxldCBleGlzdGluZyA9IGxvY2FsQXJjaGl2ZXMuZ2V0KGtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgbGV0IGFyY2hpdmVzID0gbmV3IEJ1Y2tldElBcmNoaXZlc1dyYXBwZXIoYWNjb3VudCwgYnVja2V0TmFtZSwgc291cmNlQ29uZmlnKTtcbiAgICBsb2NhbEFyY2hpdmVzLnNldChrZXksIGFyY2hpdmVzKTtcbiAgICByZXR1cm4gYXJjaGl2ZXM7XG59XG4iXX0=
948
- /* _JS_SOURCE_HASH = "b5131c1dd6ca8eb364527efce131d6a7ad4954e088f05f1ce66ee810a031603d"; */
952
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIseURBQW1EO0FBQ25ELG1EQUFnRDtBQUNoRCwyREFBK0Q7QUFDL0Qsa0RBQStDO0FBQy9DLDJDQUF1SDtBQUN2SCw0Q0FHc0I7QUFDdEIsaURBQWlNO0FBQ2pNLCtEQUF3SztBQUN4SyxxREFBMkQ7QUFDM0QscURBQWlGO0FBQ2pGLDJEQUE4RDtBQUM5RCxpREFBNkU7QUFDN0UsNkNBQXdJO0FBQ3hJLDJDQUF3RztBQTBCeEcsbUxBQW1MO0FBQ25MLFNBQVMsZUFBZSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDL0QsQ0FBQztJQUNELElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBZ0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztJQUMvRixJQUFBLFdBQUksRUFBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxF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QVUsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztDQUNKO0FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7QUFDbkQsU0FBZ0IsZ0JBQWdCLENBQUMsT0FBZSxFQUFFLFVBQWtCLEVBQUUsWUFBMEI7SUFDNUYsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLElBQUksVUFBVSxJQUFJLGVBQWUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0lBQ3RFLElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzdFLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFQRCw0Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgc29ydCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2sgfSBmcm9tIFwiLi4vQXJjaGl2ZXNEaXNrXCI7XG5pbXBvcnQgeyBCbG9iU3RvcmUsIFJhd0Rpc2tTdG9yZSwgSUJ1Y2tldFN0b3JlLCBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVksIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZUNvbmZpZywgSG9zdGVkQ29uZmlnLCBTb3VyY2VDb25maWcsIElBcmNoaXZlcywgQXJjaGl2ZXNTb3VyY2UsIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsXG4gICAgQXJjaGl2ZUZpbGVJbmZvLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIERlbENvbmZpZywgRmluZENvbmZpZywgR2V0Q29uZmlnLCBHZXRJbmZvQ29uZmlnLCBTZXRDb25maWcsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBwYXJzZVJvdXRpbmdEYXRhLCBzZXJpYWxpemVSZW1vdGVDb25maWcsIHBhcnNlSG9zdGVkVXJsLCByZXBsYWNlSG9zdGVkVXJsUG9ydCwgYnVpbGRGaWxlVXJsLCBnZXRDb25maWdWZXJzaW9uLCByb3V0ZUludGVyc2VjdGlvbiwgbm9ybWFsaXplU291cmNlIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBpbmplY3RJbnRlcm1lZGlhdGVTb3VyY2UsIGV4cGlyZUludGVybWVkaWF0ZVNvdXJjZXMsIGdldEludGVybWVkaWF0ZVNvdXJjZXMsIG5leHRJbnRlcm1lZGlhdGVWZXJzaW9uLCBJTlRFUk1FRElBVEVfRVhQSVJFX0dSQUNFIH0gZnJvbSBcIi4vaW50ZXJtZWRpYXRlU291cmNlc1wiO1xuaW1wb3J0IHsgZ2V0VGFrZW92ZXJJbnRlcm1lZGlhdGUgfSBmcm9tIFwiLi9kZXBsb3lUYWtlb3ZlclwiO1xuaW1wb3J0IHsgY3JlYXRlQXBpQXJjaGl2ZXMsIGxpc3RTZXJ2ZXJBY3RpdmVCdWNrZXRLZXlzIH0gZnJvbSBcIi4vY3JlYXRlQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGJyb2FkY2FzdFJvdXRpbmdDaGFuZ2VkIH0gZnJvbSBcIi4vc3RvcmFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcsIGFzc2VydFdyaXRlc0FsbG93ZWQgfSBmcm9tIFwiLi9zZXJ2ZXJDb25maWdcIjtcbmltcG9ydCB7IGdldEJ1Y2tldEZvbGRlciwgcmVhZFJvdXRpbmdGaWxlLCByZWFkUm91dGluZ0Zyb21EaXNrLCBnZXRSb3V0aW5nRmlsZVJlc3VsdCwgZ2V0RGlza0luZm8sIEJ1Y2tldERpc2tJbmZvIH0gZnJvbSBcIi4vYnVja2V0RGlza1wiO1xuaW1wb3J0IHsgY29tcHV0ZVN0b3JlUGxhbiwgZmluZFNlbGZJbmRleGVzLCBTdG9yZVBsYW4sIFN0b3JlUGxhblN0b3JlLCBTZWxmU3VtbWFyeSB9IGZyb20gXCIuL3N0b3JlUGxhblwiO1xuXG4vLyBUaGUgc3RvcmFnZSBzZXJ2ZXIncyBidWNrZXQgbGlmZWN5Y2xlOiB0aGUgbWFwIG9mIGxvYWRlZCBidWNrZXRzIChlYWNoID0gaXRzIHJvdXRpbmcgY29uZmlnICsgb25lIEJsb2JTdG9yZSBwZXIgcm91dGUpLCBrZWVwaW5nIHRoZW0gY3VycmVudCAocm91dGluZyByZWxvYWRzLCB3aW5kb3ctYm91bmRhcnkgcmVidWlsZHMsIGJvdW5kYXJ5IHNjYW5zKSwgd3JpdGluZy9wcm9wYWdhdGluZyByb3V0aW5nIGNvbmZpZ3MsIGRlcGxveS1zd2l0Y2hvdmVyIG1haW50ZW5hbmNlLCBhbmQgdGhlIHNlcnZlci1sZXZlbCBidWNrZXQgbGlzdGluZ3MuIFN0b3JlIHNlbGVjdGlvbiAoc291cmNlQ29uZmlnIC0+IHN0b3JlKSBsaXZlcyBoZXJlIHRvbywgYXMgZmluZEJ1Y2tldFN0b3JlLlxuXG5leHBvcnQgdHlwZSBMb2FkZWRTdG9yZSA9IHtcbiAgICAvLyBKU09OIG9mIHRoZSByb3V0ZSAoRlVMTF9ST1VURSB3aGVuIGFic2VudCkgLSB0aGUgT05FIHJvdXRlIHRoaXMgc3RvcmUgc2VydmVzXG4gICAgcm91dGVLZXk6IHN0cmluZztcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgLy8gVGhlIGV4YWN0IHNlbGYgZW50cmllcyB0aGlzIHN0b3JlIHNlcnZlcyAoc2FtZSByb3V0ZSwgZGlmZmVyZW50IHZhbGlkIHdpbmRvd3MpLiBFbXB0eSB3aGVuIHdlIGFyZSBub3QgaW4gdGhlIGNvbmZpZyBidXQgc3RpbGwgc2VydmUgb3VyIGRpc2sgZGF0YS5cbiAgICBlbnRyaWVzOiBIb3N0ZWRDb25maWdbXTtcbiAgICBmb2xkZXI6IHN0cmluZztcbiAgICBzdG9yZTogSUJ1Y2tldFN0b3JlO1xufTtcblxuLy8gQSBidWNrZXQgbG9hZGVkIG9uIHRoaXMgc2VydmVyOiBpdHMgcm91dGluZyBjb25maWcgYW5kIGl0cyBwZXItcm91dGUgc3RvcmVzLiBQdXJlIGRhdGEgLSB0aGUgc3RvcmVzIHRoZW1zZWx2ZXMgZG8gdGhlIHdvcmsuXG5leHBvcnQgdHlwZSBCdWNrZXRTdGF0ZSA9IHtcbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgIHJvdXRpbmc6IFJlbW90ZUNvbmZpZztcbiAgICByb3V0aW5nSlNPTjogc3RyaW5nO1xuICAgIHNlbGZFbnRyaWVzOiBIb3N0ZWRDb25maWdbXTtcbiAgICBzZWxmOiBTZWxmU3VtbWFyeSB8IHVuZGVmaW5lZDtcbiAgICBzdG9yZXM6IExvYWRlZFN0b3JlW107XG4gICAgc3RydWN0dXJlS2V5OiBzdHJpbmc7XG59O1xuXG4vKiogSlNPTiB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cyBhbmQgdW5kZWZpbmVkLXZhbHVlZCBrZXlzIGRyb3BwZWQsIHNvIHR3byBjb25maWdzIHRoYXQgbWVhbiB0aGUgc2FtZSB0aGluZyBjb21wYXJlIGVxdWFsIHJlZ2FyZGxlc3Mgb2Yga2V5IG9yZGVyIG9yIHdoaWNoIHNpZGUgc2VyaWFsaXplZCB0aGVtLiAqL1xuZnVuY3Rpb24gc3RhYmxlU3RyaW5naWZ5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGBbJHt2YWx1ZS5tYXAoeCA9PiBzdGFibGVTdHJpbmdpZnkoeCkpLmpvaW4oXCIsXCIpfV1gO1xuICAgIH1cbiAgICBsZXQgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5maWx0ZXIoeCA9PiB4WzFdICE9PSB1bmRlZmluZWQpO1xuICAgIHNvcnQoZW50cmllcywgeCA9PiB4WzBdKTtcbiAgICByZXR1cm4gYHske2VudHJpZXMubWFwKChba2V5LCBjaGlsZF0pID0+IGAke0pTT04uc3RyaW5naWZ5KGtleSl9OiR7c3RhYmxlU3RyaW5naWZ5KGNoaWxkKX1gKS5qb2luKFwiLFwiKX19YDtcbn1cblxuLyoqIFRoZSBsb2FkZWQgYnVja2V0LCBsb2FkaW5nIGl0ICh3aGljaCBpbnN0YW50aWF0ZXMgaXRzIHN0b3JlcyBhbmQgc3RhcnRzIHRoZWlyIHN5bmNocm9uaXphdGlvbikgaWYgbmVlZGVkLiBBIGJ1Y2tldCB0aGF0IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgc2VydmVyIHRocm93cyAtIGNhbGxlcnMgbmV2ZXIgc2VlIHVuZGVmaW5lZCBidWNrZXRzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPEJ1Y2tldFN0YXRlPiB7XG4gICAgbGV0IGJ1Y2tldCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBzZXJ2ZXIuIFdyaXRlIGl0cyByb3V0aW5nIGNvbmZpZyB0byAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IHRvIGNyZWF0ZSBpdC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1Y2tldDtcbn1cblxuLyoqIFRoZSBzdGFibGUgaWRlbnRpdHkgb2YgYSBzb3VyY2UgY29uZmlnIGZvciBtYXRjaGluZzogZXZlcnl0aGluZyBFWENFUFQgdGhlIHZhbGlkIHdpbmRvdywgYW5kIHdpdGggYW4gaW50ZXJtZWRpYXRlIHJlc29sdmVkIGJhY2sgdG8gdGhlIHNvdXJjZSBpdCB3YXMgc3BsaXQgb3V0IG9mLiBUaGUgd2luZG93IGRyaWZ0cyAoYSBzd2l0Y2hvdmVyIHNwbGl0cyBvbmUgd2luZG93IGluIHR3byBhcm91bmQgYW4gaW50ZXJtZWRpYXRlLCB0aGVuIHJlam9pbnMgaXQpLCBzbyBhIGNhbGxlciBhbmQgdGhpcyBzZXJ2ZXIgcm91dGluZWx5IGRpc2FncmVlIG9uIGl0IC0gbWF0Y2hpbmcgb24gaXQgd291bGQgd3JvbmdseSByZWplY3QgdGhlIHJlcXVlc3QuIEFuIGludGVybWVkaWF0ZSBpcyBhIHRyYW5zaWVudCBhbHQtcG9ydCB2aWV3IG9mIGFub3RoZXIgc291cmNlLCBzbyBpdCBtdXN0IHJlc29sdmUgdG8gVEhBVCBzb3VyY2UgKGNvbmZpZy5pbnRlcm1lZGlhdGUgaG9sZHMgaXRzIHVybCArIHRoZSBpbnRlcm1lZGlhdGUgZmxhZyBpcyBkcm9wcGVkKSwgb3IgYSByZXF1ZXN0IG5hbWluZyB0aGUgaW50ZXJtZWRpYXRlIHdvdWxkIGZhaWwgdG8gbWF0Y2ggb25jZSB0aGUgaW50ZXJtZWRpYXRlIGhhcyByZWpvaW5lZCBhbmQgaXRzIGVudHJ5IGlzIGdvbmUuIFRoZSByb3V0ZSBzdGF5cyBpbiB0aGUgaWRlbnRpdHkgKGl0IHNlbGVjdHMgdGhlIHN0b3JlL2ZvbGRlcikuICovXG5mdW5jdGlvbiBzb3VyY2VNYXRjaEtleShjb25maWc6IFNvdXJjZUNvbmZpZyk6IHN0cmluZyB7XG4gICAgbGV0IHVybCA9IGNvbmZpZy5pbnRlcm1lZGlhdGUgfHwgY29uZmlnLnVybDtcbiAgICByZXR1cm4gc3RhYmxlU3RyaW5naWZ5KHsgLi4uY29uZmlnLCB1cmwsIGludGVybWVkaWF0ZTogdW5kZWZpbmVkLCB2YWxpZFdpbmRvdzogdW5kZWZpbmVkIH0pO1xufVxuXG4vKiogVGhlIHN0b3JlIHNlcnZpbmcgYSByZXF1ZXN0OiB0aGUgY29uZmlnIGVudHJ5IHRoZSBDTElFTlQgc2VsZWN0ZWQsIG1hdGNoZWQgYWdhaW5zdCB0aGUgYnVja2V0J3Mgb3duIGVudHJpZXMgYnkgaWRlbnRpdHkgRVhDTFVESU5HIHRoZSB2YWxpZCB3aW5kb3cgKHNlZSBzb3VyY2VNYXRjaEtleSkuIFRoZSBzZWxlY3Rpb24gbmV2ZXIgdmFsaWRhdGVzIC0gdGhlIHN0b3JlJ3Mgb3duIHdpbmRvdy9yb3V0ZSBjaGVja3MgdGhyb3cgaWYgdGhlIGNhbGxlciBpcyBzdGFsZSAtIHNvIGhvbm9yaW5nIGEgd2luZG93IG1pc21hdGNoIGhlcmUgaXMgZXhhY3RseSByaWdodC4gVGhyb3dzIHdoZW4gbm90aGluZyBtYXRjaGVzLCBsaXN0aW5nIHdoYXQgaXMgYXZhaWxhYmxlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRCdWNrZXRTdG9yZShhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQpOiBQcm9taXNlPExvYWRlZFN0b3JlPiB7XG4gICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHJlcXVpcmVCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFzb3VyY2VDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZW1vdGUgc291cmNlIGNvbmZpZ3VyYXRpb24gd2FzIHByb3ZpZGVkIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OiBldmVyeSByZXF1ZXN0IG11c3Qgc2F5IHdoaWNoIGNvbmZpZ3VyZWQgc291cmNlIGl0IHNlbGVjdGVkLiBBdmFpbGFibGU6ICR7SlNPTi5zdHJpbmdpZnkoYnVja2V0LnNlbGZFbnRyaWVzKX1gKTtcbiAgICB9XG4gICAgbGV0IHdhbnRlZCA9IHNvdXJjZU1hdGNoS2V5KHNvdXJjZUNvbmZpZyk7XG4gICAgZm9yIChsZXQgcyBvZiBidWNrZXQuc3RvcmVzKSB7XG4gICAgICAgIGlmIChzLmVudHJpZXMuc29tZShlID0+IHNvdXJjZU1hdGNoS2V5KGUpID09PSB3YW50ZWQpKSByZXR1cm4gcztcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2Ugb24gdGhpcyBzZXJ2ZXIgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIHJlbW90ZSBjb25maWd1cmF0aW9uIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9LiBSZXF1ZXN0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoc291cmNlQ29uZmlnKX0uIEF2YWlsYWJsZTogJHtKU09OLnN0cmluZ2lmeShidWNrZXQuc2VsZkVudHJpZXMpfWApO1xufVxuXG4vKiogSW50ZXJuYWwgKHN0b3JlLXRvLXN0b3JlKSByZWFkcyBza2lwIHN0b3JlIHNlbGVjdGlvbiBlbnRpcmVseTogdGhlIGNhbGxlciBpcyBhbm90aGVyIHN0b3JlIHdob3NlIGluZGV4IHNheXMgdGhpcyBNQUNISU5FIGhvbGRzIHRoZSBieXRlcyAtIHRoZSBwZXJzaXN0ZWQgaG9sZGVyIGlkZW50aXR5IGlzIGp1c3QgYSBVUkwsIHdoaWNoIGNhbm5vdCBuYW1lIGEgc3RvcmUuIFdoaWNoZXZlciBzdG9yZSdzIGZvbGRlciBoYXMgdGhlIG5ld2VzdCBjb3B5IGFuc3dlcnMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEJ1Y2tldEludGVybmFsKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBjb25maWc6IHsgcGF0aDogc3RyaW5nOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgYnVja2V0ID0gYXdhaXQgcmVxdWlyZUJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1Y2tldC5zdG9yZXMubWFwKHMgPT4gcy5zdG9yZS5nZXQyKHsgcGF0aDogY29uZmlnLnBhdGgsIHJhbmdlOiBjb25maWcucmFuZ2UsIGluY2x1ZGVUb21ic3RvbmVzOiBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMsIGludGVybmFsOiB0cnVlIH0pKSk7XG4gICAgbGV0IGJlc3Q6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAoIWJlc3QgfHwgcmVzdWx0LndyaXRlVGltZSA+IGJlc3Qud3JpdGVUaW1lKSkge1xuICAgICAgICAgICAgYmVzdCA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1Y2tldENvbmZpZyhidWNrZXQ6IEJ1Y2tldFN0YXRlKTogQXJjaGl2ZXNDb25maWcge1xuICAgIGxldCBpbmRleCA9IHsgZmlsZUNvdW50OiAwLCBieXRlQ291bnQ6IDAgfTtcbiAgICBsZXQgaW5kZXhTb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdID0gW107XG4gICAgbGV0IHN5bmNpbmc6IFN5bmNBY3Rpdml0eVtdID0gW107XG4gICAgbGV0IHJlYWRlckRpc2tMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IHMgb2YgYnVja2V0LnN0b3Jlcykge1xuICAgICAgICBsZXQgcHJvZ3Jlc3MgPSBzLnN0b3JlLmdldFN5bmNQcm9ncmVzcz8uKCk7XG4gICAgICAgIGlmICghcHJvZ3Jlc3MpIGNvbnRpbnVlO1xuICAgICAgICBpbmRleC5maWxlQ291bnQgKz0gcHJvZ3Jlc3MuaW5kZXguZmlsZUNvdW50O1xuICAgICAgICBpbmRleC5ieXRlQ291bnQgKz0gcHJvZ3Jlc3MuaW5kZXguYnl0ZUNvdW50O1xuICAgICAgICBpbmRleFNvdXJjZXMucHVzaCguLi5wcm9ncmVzcy5zb3VyY2VzKTtcbiAgICAgICAgc3luY2luZy5wdXNoKC4uLnByb2dyZXNzLnN5bmNpbmcpO1xuICAgICAgICByZWFkZXJEaXNrTGltaXQgPSByZWFkZXJEaXNrTGltaXQgfHwgcHJvZ3Jlc3MucmVhZGVyRGlza0xpbWl0O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBOYXRpdmUgY2hhbmdlLWZlZWQgc3VwcG9ydCA9IHRoZSBzdG9yZXMga2VlcCBhbiBpbmRleCAocmF3RGlzayBidWNrZXRzIGVtdWxhdGUgZ2V0Q2hhbmdlc0FmdGVyMiB3aXRoIGEgZnVsbCBsaXN0aW5nKSAtIGNsaWVudHMgdXNlIHRoaXMgdG8gcGljayB0aGVpciBzY2FuIGNhZGVuY2VcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGJ1Y2tldC5zdG9yZXMuc29tZShzID0+IHMuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpLFxuICAgICAgICByZW1vdGVDb25maWc6IGJ1Y2tldC5yb3V0aW5nLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgaW5kZXhTb3VyY2VzLFxuICAgICAgICByZWFkZXJEaXNrTGltaXQsXG4gICAgICAgIHN5bmNpbmcsXG4gICAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1Y2tldFN5bmNTdGF0dXMoYnVja2V0OiBCdWNrZXRTdGF0ZSk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgbGV0IHN1cHBvcnRlZCA9IGJ1Y2tldC5zdG9yZXMuZmlsdGVyKHMgPT4gcy5zdG9yZS5nZXRTeW5jU3RhdHVzKTtcbiAgICBpZiAoIXN1cHBvcnRlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHtidWNrZXQuYWNjb3VudH0vJHtidWNrZXQuYnVja2V0TmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRTeW5jU3RhdHVzIChyYXdEaXNrIGJ1Y2tldHMgaGF2ZSBubyBzeW5jaHJvbml6YXRpb24pYCk7XG4gICAgfVxuICAgIGxldCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHN1cHBvcnRlZC5tYXAoYXN5bmMgcyA9PiB7XG4gICAgICAgIGxldCBnZXRTeW5jU3RhdHVzID0gcy5zdG9yZS5nZXRTeW5jU3RhdHVzO1xuICAgICAgICBpZiAoIWdldFN5bmNTdGF0dXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZ2V0U3luY1N0YXR1cyBkaXNhcHBlYXJlZCBmcm9tIGEgc3RvcmUgZm9yICR7YnVja2V0LmFjY291bnR9LyR7YnVja2V0LmJ1Y2tldE5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldFN5bmNTdGF0dXMuY2FsbChzLnN0b3JlKTtcbiAgICB9KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsU2NhbnNDb21wbGV0ZTogc3RhdHVzZXMuZXZlcnkoeCA9PiB4LmFsbFNjYW5zQ29tcGxldGUpLFxuICAgICAgICBpbmRleFNpemU6IHN0YXR1c2VzLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4LmluZGV4U2l6ZSwgMCksXG4gICAgICAgIHNvdXJjZXM6IHN0YXR1c2VzLmZsYXRNYXAoeCA9PiB4LnNvdXJjZXMpLFxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWNrZXRJbmRleFRvdGFscyhidWNrZXQ6IEJ1Y2tldFN0YXRlKTogUHJvbWlzZTx7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXSB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IHN1cHBvcnRlZCA9IGJ1Y2tldC5zdG9yZXMuZmlsdGVyKHMgPT4gcy5zdG9yZS5jb21wdXRlSW5kZXhUb3RhbHMpO1xuICAgIGlmICghc3VwcG9ydGVkLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBsZXQgdG90YWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoc3VwcG9ydGVkLm1hcChhc3luYyBzID0+IHtcbiAgICAgICAgbGV0IGNvbXB1dGVJbmRleFRvdGFscyA9IHMuc3RvcmUuY29tcHV0ZUluZGV4VG90YWxzO1xuICAgICAgICBpZiAoIWNvbXB1dGVJbmRleFRvdGFscykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb21wdXRlSW5kZXhUb3RhbHMgZGlzYXBwZWFyZWQgZnJvbSBhIHN0b3JlIGZvciAke2J1Y2tldC5hY2NvdW50fS8ke2J1Y2tldC5idWNrZXROYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBjb21wdXRlSW5kZXhUb3RhbHMuY2FsbChzLnN0b3JlKTtcbiAgICB9KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZUNvdW50OiB0b3RhbHMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHguZmlsZUNvdW50LCAwKSxcbiAgICAgICAgYnl0ZUNvdW50OiB0b3RhbHMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHguYnl0ZUNvdW50LCAwKSxcbiAgICAgICAgc291cmNlczogdG90YWxzLmZsYXRNYXAoeCA9PiB4LnNvdXJjZXMpLFxuICAgIH07XG59XG5cbmNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxCdWNrZXRTdGF0ZSB8IHVuZGVmaW5lZD4+KCk7XG5cbmNvbnN0IE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZID0gMiAqKiAzMSAtIDE7XG5jb25zdCBSRUJVSUxEX0JPVU5EQVJZX0JVRkZFUiA9IDEwMDA7XG5cbmZ1bmN0aW9uIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZDogQnVja2V0U3RhdGUpOiB2b2lkIHtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgYm91bmRhcmllcyA9IGxvYWRlZC5zZWxmRW50cmllcy5mbGF0TWFwKHggPT4geC52YWxpZFdpbmRvdykuZmlsdGVyKHQgPT4gdCA+IG5vdyk7XG4gICAgaWYgKCFib3VuZGFyaWVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGxldCBuZXh0Qm91bmRhcnkgPSBNYXRoLm1pbiguLi5ib3VuZGFyaWVzKTtcbiAgICBsZXQga2V5ID0gYCR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9YDtcbiAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBhd2FpdCBidWNrZXRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IGxvYWRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCBuZXh0Qm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUsIHsgZm9yY2U6IHRydWUsIHJlYXNvbjogXCJhIHZhbGlkIHdpbmRvdyBib3VuZGFyeSBwYXNzZWRcIiB9KTtcbiAgICAgICAgfSkoKTtcbiAgICB9LCBNYXRoLm1pbihuZXh0Qm91bmRhcnkgLSBub3cgKyBSRUJVSUxEX0JPVU5EQVJZX0JVRkZFUiwgTUFYX1JFQlVJTERfVElNRVJfREVMQVkpKTtcbiAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xufVxuXG5jb25zdCBCT1VOREFSWV9TQ0FOX09GRlNFVFMgPSBbLTMwICogMTAwMCwgMiAqIDEwMDAsIDMwICogMTAwMF07XG5jb25zdCBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLID0gREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZICsgV0lORE9XX0VORF9GTFVTSF9NQVJHSU47XG5jb25zdCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVkgPSAzMCAqIDEwMDA7XG5cbmNvbnN0IHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmNvbnN0IGJvdW5kYXJ5U2NhbnNSdW5uaW5nID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQm91bmRhcnlTY2Fucyhsb2FkZWQ6IEJ1Y2tldFN0YXRlKTogdm9pZCB7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IHN0YXJ0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAobGV0IHNlbGYgb2YgbG9hZGVkLnNlbGZFbnRyaWVzKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHNlbGYudmFsaWRXaW5kb3dbMF07XG4gICAgICAgIGlmIChzdGFydCA+IG5vdyAmJiBzdGFydCA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICBzdGFydHMuYWRkKHN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBzZWxmIG9mIGxvYWRlZC5zZWxmRW50cmllcykge1xuICAgICAgICBsZXQgW3N0YXJ0LCBlbmRdID0gc2VsZi52YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKCEoc3RhcnQgPD0gbm93ICYmIG5vdyA8IGVuZCkgfHwgc3RhcnQgPD0gMCkgY29udGludWU7XG4gICAgICAgIGlmIChub3cgLSBzdGFydCA+IEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0spIGNvbnRpbnVlO1xuICAgICAgICBsZXQgc2NoZWR1bGVLZXkgPSBgJHtrZXl9fCR7c3RhcnR9fHN0YXJ0dXBgO1xuICAgICAgICBpZiAoc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5oYXMoc2NoZWR1bGVLZXkpKSBjb250aW51ZTtcbiAgICAgICAgc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5hZGQoc2NoZWR1bGVLZXkpO1xuICAgICAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHZvaWQgcnVuQm91bmRhcnlTY2FuKGtleSwgc3RhcnQsIFNUQVJUVVBfQk9VTkRBUllfU0NBTl9ERUxBWSwgXCJzdGFydHVwKzMwc1wiKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgIH0sIFNUQVJUVVBfQk9VTkRBUllfU0NBTl9ERUxBWSk7XG4gICAgICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgfVxuICAgIGZvciAobGV0IHN0YXJ0IG9mIHN0YXJ0cykge1xuICAgICAgICBmb3IgKGxldCBvZmZzZXQgb2YgQk9VTkRBUllfU0NBTl9PRkZTRVRTKSB7XG4gICAgICAgICAgICBsZXQgYXQgPSBzdGFydCArIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChhdCA8PSBub3cpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHNjaGVkdWxlS2V5ID0gYCR7a2V5fXwke3N0YXJ0fXwke29mZnNldH1gO1xuICAgICAgICAgICAgaWYgKHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuaGFzKHNjaGVkdWxlS2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmFkZChzY2hlZHVsZUtleSk7XG4gICAgICAgICAgICBsZXQgYXJtID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA8IGF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2b2lkIHJ1bkJvdW5kYXJ5U2NhbihrZXksIHN0YXJ0LCBvZmZzZXQpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgQm91bmRhcnkgc2NhbiBmb3IgYnVja2V0ICR7a2V5fSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgICAgICAgICB9LCBNYXRoLm1pbihhdCAtIERhdGUubm93KCksIE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZKSk7XG4gICAgICAgICAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhcm0oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQm91bmRhcnlTY2FuKGJ1Y2tldEtleTogc3RyaW5nLCB3aW5kb3dTdGFydDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlciwgb2Zmc2V0TGFiZWw/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFiZWwgPSBgYnVja2V0ICR7YnVja2V0S2V5fSwgd2luZG93IHN0YXJ0aW5nICR7bmV3IERhdGUod2luZG93U3RhcnQpLnRvSVNPU3RyaW5nKCl9LCBvZmZzZXQgJHtvZmZzZXRMYWJlbCB8fCBgJHtvZmZzZXQgLyAxMDAwfXNgfWA7XG4gICAgaWYgKGJvdW5kYXJ5U2NhbnNSdW5uaW5nLmhhcyhidWNrZXRLZXkpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTa2lwcGluZyBib3VuZGFyeSBzY2FuICgke2xhYmVsfSk6IHRoZSBwcmV2aW91cyBib3VuZGFyeSBzY2FuIGlzIHN0aWxsIHJ1bm5pbmdgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBib3VuZGFyeVNjYW5zUnVubmluZy5hZGQoYnVja2V0S2V5KTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgbG9hZGVkID0gYXdhaXQgYnVja2V0cy5nZXQoYnVja2V0S2V5KTtcbiAgICAgICAgaWYgKCFsb2FkZWQpIHJldHVybjtcbiAgICAgICAgbGV0IGVmZmVjdGl2ZSA9IGxvYWRlZC5yb3V0aW5nO1xuICAgICAgICBsZXQgc2VsZkluZGV4ZXMgPSBmaW5kU2VsZkluZGV4ZXMoZWZmZWN0aXZlLCBsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUpO1xuICAgICAgICBsZXQgc2VsZkluZGV4U2V0ID0gbmV3IFNldChzZWxmSW5kZXhlcyk7XG4gICAgICAgIGxldCBzZWx2ZXMgPSBzZWxmSW5kZXhlcy5tYXAoaSA9PiBlZmZlY3RpdmUuc291cmNlc1tpXSBhcyBIb3N0ZWRDb25maWcpLmZpbHRlcih4ID0+IHgudmFsaWRXaW5kb3dbMF0gPT09IHdpbmRvd1N0YXJ0KTtcbiAgICAgICAgaWYgKCFzZWx2ZXMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBwcmV2VGltZSA9IHdpbmRvd1N0YXJ0IC0gMTtcbiAgICAgICAgLy8gRXZlcnl0aGluZyBpcyBwZXItc3RvcmU6IGVhY2ggc2VsZiBlbnRyeSdzIHJvdXRlIGhhcyBpdHMgb3duIHN0b3JlLCBhbmQgdGhhdCBzdG9yZSdzIGRpc2svcmVtb3RlIGJvdW5kYXJ5IHB1bGxzIG9ubHkgY29uY2VybiBpdHMgb3duIHJvdXRlIHNsaWNlXG4gICAgICAgIGxldCBuZWVkRGlza1NjYW4gPSBuZXcgU2V0PExvYWRlZFN0b3JlPigpO1xuICAgICAgICBsZXQgcmVtb3RlT3duZXJzID0gbmV3IE1hcDxMb2FkZWRTdG9yZSwgTWFwPG51bWJlciwgW251bWJlciwgbnVtYmVyXT4+KCk7XG4gICAgICAgIGZvciAobGV0IHNlbGYgb2Ygc2VsdmVzKSB7XG4gICAgICAgICAgICBsZXQgc2VsZlJvdXRlID0gc2VsZi5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgbGV0IHNlbGZTdG9yZSA9IGxvYWRlZC5zdG9yZXMuZmluZCh4ID0+IHgucm91dGVLZXkgPT09IEpTT04uc3RyaW5naWZ5KHNlbGZSb3V0ZSkpO1xuICAgICAgICAgICAgaWYgKCFzZWxmU3RvcmUgfHwgIShzZWxmU3RvcmUuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZHggPSBlZmZlY3RpdmUuc291cmNlcy5pbmRleE9mKHNlbGYpO1xuICAgICAgICAgICAgbGV0IHNoYWRvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlkeDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gZWZmZWN0aXZlLnNvdXJjZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IFt3cywgd2VdID0gb3RoZXIudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCEod3MgPD0gd2luZG93U3RhcnQgJiYgd2luZG93U3RhcnQgPCB3ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBpZiAoclswXSA8PSBzZWxmUm91dGVbMF0gJiYgc2VsZlJvdXRlWzFdIDw9IHJbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhZG93ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hhZG93ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHVuY292ZXJlZDogW251bWJlciwgbnVtYmVyXVtdID0gW1tzZWxmUm91dGVbMF0sIHNlbGZSb3V0ZVsxXV1dO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlZmZlY3RpdmUuc291cmNlcy5sZW5ndGggJiYgdW5jb3ZlcmVkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gZWZmZWN0aXZlLnNvdXJjZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IFt3cywgd2VdID0gb3RoZXIudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCEod3MgPD0gcHJldlRpbWUgJiYgcHJldlRpbWUgPCB3ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhaW1lZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IG9mIHVuY292ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW50ZXIgPSByb3V0ZUludGVyc2VjdGlvbih1LCByKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLnB1c2godSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFpbWVkID0gY2xhaW1lZCAmJiBbTWF0aC5taW4oY2xhaW1lZFswXSwgaW50ZXJbMF0pLCBNYXRoLm1heChjbGFpbWVkWzFdLCBpbnRlclsxXSldIGFzIFtudW1iZXIsIG51bWJlcl0gfHwgaW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1WzBdIDwgaW50ZXJbMF0pIHJlbWFpbmluZy5wdXNoKFt1WzBdLCBpbnRlclswXV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJbMV0gPCB1WzFdKSByZW1haW5pbmcucHVzaChbaW50ZXJbMV0sIHVbMV1dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5jb3ZlcmVkID0gcmVtYWluaW5nO1xuICAgICAgICAgICAgICAgIGlmICghY2xhaW1lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGZJbmRleFNldC5oYXMoaikpIHtcbiAgICAgICAgICAgICAgICAgICAgbmVlZERpc2tTY2FuLmFkZChzZWxmU3RvcmUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lcnMgPSByZW1vdGVPd25lcnMuZ2V0KHNlbGZTdG9yZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3duZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvd25lcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVPd25lcnMuc2V0KHNlbGZTdG9yZSwgb3duZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBvd25lcnMuZ2V0KGopO1xuICAgICAgICAgICAgICAgICAgICBvd25lcnMuc2V0KGosIGV4aXN0aW5nICYmIFtNYXRoLm1pbihleGlzdGluZ1swXSwgY2xhaW1lZFswXSksIE1hdGgubWF4KGV4aXN0aW5nWzFdLCBjbGFpbWVkWzFdKV0gYXMgW251bWJlciwgbnVtYmVyXSB8fCBjbGFpbWVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZWVkRGlza1NjYW4uc2l6ZSAmJiAhcmVtb3RlT3duZXJzLnNpemUpIHJldHVybjtcbiAgICAgICAgY29uc29sZS5sb2coYEJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KTogZGlza1NjYW5zPSR7bmVlZERpc2tTY2FuLnNpemV9LCBzdG9yZXMgd2l0aCByZW1vdGUgcHJldmlvdXMtd2luZG93IG93bmVyczogJHtyZW1vdGVPd25lcnMuc2l6ZX1gKTtcbiAgICAgICAgZm9yIChsZXQgc2VsZlN0b3JlIG9mIG5lZWREaXNrU2Nhbikge1xuICAgICAgICAgICAgaWYgKHNlbGZTdG9yZS5zdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHNlbGZTdG9yZS5zdG9yZS5yZXNjYW5CYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNpbmNlID0gd2luZG93U3RhcnQgLSBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLO1xuICAgICAgICBmb3IgKGxldCBbc2VsZlN0b3JlLCBvd25lcnNdIG9mIHJlbW90ZU93bmVycykge1xuICAgICAgICAgICAgaWYgKCEoc2VsZlN0b3JlLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSkgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGxldCBbc291cmNlSW5kZXgsIHJvdXRlXSBvZiBvd25lcnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZXJTb3VyY2UgPSBlZmZlY3RpdmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvd25lclNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2VsZlN0b3JlLnN0b3JlLmJvdW5kYXJ5U2NhblJlbW90ZShjcmVhdGVBcGlBcmNoaXZlcyhvd25lclNvdXJjZSksIHsgc2luY2UsIHJvdXRlIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pIG9mIHByZXZpb3VzLXdpbmRvdyBvd25lciAoc291cmNlIGluZGV4ICR7c291cmNlSW5kZXh9KSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuZGVsZXRlKGJ1Y2tldEtleSk7XG4gICAgfVxufVxuXG5jb25zdCByZXNvbHZlZFNvdXJjZUFyY2hpdmVzID0gbmV3IE1hcDxzdHJpbmcsIElBcmNoaXZlcz4oKTtcbi8qKiBBIGNhY2hlZCBJQXJjaGl2ZXMgZm9yIGEgcGVyc2lzdGVkIHNvdXJjZSBpZGVudGl0eTogYSByb3V0aW5nIFVSTCAoaG9zdGVkL2JhY2tibGF6ZSkgb3IgYSBkaXNrIGZvbGRlciBwYXRoIC0gdGhlIGZvcm0gQmxvYlN0b3JlJ3Mgc291cmNlcyBsaXN0IHN0b3Jlcy4gQ29uZmlndXJhdGlvbiAodmFsaWQgd2luZG93cywgcm91dGVzKSBkZWNpZGVzIFdIRU4gYSBzb3VyY2Ugc2hvdWxkIGJlIHVzZWQ7IGZvciByZWFkaW5nIGJ5dGVzIHRoZSBpbmRleCBzYXlzIGEgc291cmNlIGhvbGRzLCB0aGUgVVJMIGFsb25lIGlzIGVub3VnaCAtIGV2ZW4gZm9yIHNvdXJjZXMgbm8gbG9uZ2VyIGluIGFueSBjb25maWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNvdXJjZUFyY2hpdmVzKHVybDogc3RyaW5nKTogSUFyY2hpdmVzIHtcbiAgICBsZXQgZXhpc3RpbmcgPSByZXNvbHZlZFNvdXJjZUFyY2hpdmVzLmdldCh1cmwpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGxldCBhcmNoaXZlczogSUFyY2hpdmVzO1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgIC8vIFRoZSBjb25maWcgaXMgZmFicmljYXRlZCBmcm9tIHRoZSBiYXJlIFVSTCBhbmQgY2FuIG5ldmVyIGV4YWN0LW1hdGNoIGEgc2VydmVyJ3MgZW50cmllcyAtIHdoaWNoIGlzIGZpbmUsIGJlY2F1c2UgaG9sZGVyIHJlYWRzIGFyZSBpbnRlcm5hbCByZWFkcywgYW5kIGludGVybmFsIHJlYWRzIG5ldmVyIHNlbGVjdCBhIHN0b3JlIChzZWUgcmVhZEJ1Y2tldEludGVybmFsKVxuICAgICAgICBhcmNoaXZlcyA9IGNyZWF0ZUFwaUFyY2hpdmVzKG5vcm1hbGl6ZVNvdXJjZSh1cmwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcmNoaXZlcyA9IG5ldyBBcmNoaXZlc0Rpc2sodXJsKTtcbiAgICB9XG4gICAgcmVzb2x2ZWRTb3VyY2VBcmNoaXZlcy5zZXQodXJsLCBhcmNoaXZlcyk7XG4gICAgcmV0dXJuIGFyY2hpdmVzO1xufVxuXG5mdW5jdGlvbiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFzb3VyY2VDb25maWcpIHJldHVybiBcImRpc2tcIjtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyAuLi5zb3VyY2VDb25maWcsIHZhbGlkV2luZG93OiB1bmRlZmluZWQsIHJvdXRlOiB1bmRlZmluZWQgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3RvcmUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHBsYW5TdG9yZTogU3RvcmVQbGFuU3RvcmUpOiBJQnVja2V0U3RvcmUge1xuICAgIGxldCBmb2xkZXIgPSBnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSwgcGxhblN0b3JlLnJvdXRlKTtcbiAgICBpZiAocGxhblN0b3JlLnJhd0Rpc2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYXdEaXNrU3RvcmUobmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpKTtcbiAgICB9XG4gICAgbGV0IHNvdXJjZXM6IEFyY2hpdmVzU291cmNlW10gPSBwbGFuU3RvcmUuc291cmNlU3BlY3MubWFwKHNwZWMgPT4gKHtcbiAgICAgICAgc291cmNlOiBzcGVjLnNvdXJjZUNvbmZpZyAmJiBjcmVhdGVBcGlBcmNoaXZlcyhzcGVjLnNvdXJjZUNvbmZpZykgfHwgbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpLFxuICAgICAgICB1cmw6IHNwZWMuc291cmNlQ29uZmlnPy51cmwgfHwgZm9sZGVyLFxuICAgICAgICB2YWxpZFdpbmRvd3M6IHNwZWMudmFsaWRXaW5kb3dzLFxuICAgICAgICByb3V0ZTogc3BlYy5yb3V0ZSxcbiAgICAgICAgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLFxuICAgICAgICBpbnRlcm1lZGlhdGU6IHNwZWMuc291cmNlQ29uZmlnPy5pbnRlcm1lZGlhdGUsXG4gICAgICAgIHNvdXJjZUNvbmZpZzogc3BlYy5zb3VyY2VDb25maWcsXG4gICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzcGVjLnNvdXJjZUNvbmZpZyksXG4gICAgfSkpO1xuICAgIHJldHVybiBuZXcgQmxvYlN0b3JlKGZvbGRlciwgc291cmNlcywge1xuICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHBsYW5TdG9yZS5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgIG9uV3JpdGVDb3VudGVkOiAoa2luZCwgYnl0ZXMpID0+IGNvdW50QnVja2V0V3JpdGUoYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWAsIGtpbmQsIGJ5dGVzKSxcbiAgICAgICAgcmVzb2x2ZVNvdXJjZVVybDogcmVzb2x2ZVNvdXJjZUFyY2hpdmVzLFxuICAgICAgICBlbnRyaWVzOiBwbGFuU3RvcmUuZW50cmllcyxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHJvdXRpbmc6IFJlbW90ZUNvbmZpZywgcGxhbj86IFN0b3JlUGxhbik6IEJ1Y2tldFN0YXRlIHtcbiAgICBpZiAoIXBsYW4pIHtcbiAgICAgICAgcGxhbiA9IGNvbXB1dGVTdG9yZVBsYW4oYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZyk7XG4gICAgfVxuICAgIGxldCB7IHNlbGZFbnRyaWVzLCBzZWxmIH0gPSBwbGFuO1xuICAgIGlmICghc2VsZikge1xuICAgICAgICBjb25zb2xlLmxvZyhgVGhpcyBzZXJ2ZXIgaXMgbm90IGluIHRoZSByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfTogbm8gbG9uZ2VyIHN5bmNocm9uaXppbmcsIHZhbGlkIHdpbmRvdyB0cmVhdGVkIGFzIFswLCAwXSAoZmFzdCB3cml0ZXMgZmx1c2ggaW1tZWRpYXRlbHkpLCBkaXNrIGRhdGEga2VwdCBhbmQgc2VydmVkYCk7XG4gICAgfVxuICAgIGxldCBzdG9yZXM6IExvYWRlZFN0b3JlW10gPSBwbGFuLnN0b3Jlcy5tYXAocGxhblN0b3JlID0+ICh7XG4gICAgICAgIHJvdXRlS2V5OiBwbGFuU3RvcmUucm91dGVLZXksXG4gICAgICAgIHJvdXRlOiBwbGFuU3RvcmUucm91dGUsXG4gICAgICAgIGVudHJpZXM6IHBsYW5TdG9yZS5lbnRyaWVzLFxuICAgICAgICBmb2xkZXI6IGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lLCBwbGFuU3RvcmUucm91dGUpLFxuICAgICAgICBzdG9yZTogYnVpbGRTdG9yZShhY2NvdW50LCBidWNrZXROYW1lLCBwbGFuU3RvcmUpLFxuICAgIH0pKTtcbiAgICBsZXQgbG9hZGVkOiBCdWNrZXRTdGF0ZSA9IHsgYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZywgcm91dGluZ0pTT046IEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpLCBzZWxmRW50cmllcywgc2VsZiwgc3RvcmVzLCBzdHJ1Y3R1cmVLZXk6IHBsYW4uc3RydWN0dXJlS2V5IH07XG4gICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICBzY2hlZHVsZUJvdW5kYXJ5U2NhbnMobG9hZGVkKTtcbiAgICAvLyBBIGxvYWRlZCBidWNrZXQgbXVzdCBhY3R1YWxseSBiZSBydW5uaW5nOiBlYWNoIHN0b3JlJ3MgaW5pdCBsb2FkcyBpdHMgaW5kZXggYW5kIHN0YXJ0cyBpdHMgc291cmNlIHN5bmNocm9uaXphdGlvbiwgYW5kIGl0IGlzIGxhenksIHNvIHdpdGhvdXQgdGhpcyBhIGJ1Y2tldCBub3RoaW5nIGhhcyByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBzaXRzIGluZXJ0IC0gcmVwb3J0aW5nIG5vIGRhdGEgYW5kIG5vIHN5bmNpbmcgd2hpbGUgaXRzIGRpc2sgaXMgZnVsbCBvZiBmaWxlcy5cbiAgICBmb3IgKGxldCBzIG9mIHN0b3Jlcykge1xuICAgICAgICBpZiAocy5zdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkge1xuICAgICAgICAgICAgbGV0IHN0b3JlID0gcy5zdG9yZTtcbiAgICAgICAgICAgIHZvaWQgc3RvcmUuaW5pdCgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgSW5pdGlhbGl6aW5nIHRoZSBzdG9yZSBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSAocm91dGUgJHtzLnJvdXRlS2V5fSkgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvYWRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QnVja2V0U3RhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgcm91dGluZyA9IGF3YWl0IHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFyb3V0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBidWlsZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRlZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QnVja2V0U3RhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGxvYWRlZCA9IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgbG9hZGVkID0gbG9hZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBsb2FkZWQpO1xuICAgICAgICB2b2lkIGxvYWRlZC50aGVuKGJ1Y2tldCA9PiB7XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldCAmJiBidWNrZXRzLmdldChrZXkpID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYnVja2V0cy5nZXQoa2V5KSA9PT0gbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0cy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkZWQ7XG59XG5cbmNvbnN0IHJvdXRpbmdSZWxvYWRzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5mdW5jdGlvbiBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgZm9yY2U/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbmV4dCA9IChyb3V0aW5nUmVsb2Fkcy5nZXQoa2V5KSB8fCBQcm9taXNlLnJlc29sdmUoKSlcbiAgICAgICAgLnRoZW4oKCkgPT4gY2hlY2tSb3V0aW5nQ2hhbmdlZChhY2NvdW50LCBidWNrZXROYW1lLCBjb25maWcpKVxuICAgICAgICAuY2F0Y2goZSA9PiBjb25zb2xlLmVycm9yKGBSZWxvYWRpbmcgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOmAsIGUpKTtcbiAgICByb3V0aW5nUmVsb2Fkcy5zZXQoa2V5LCBuZXh0KTtcbiAgICByZXR1cm4gbmV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tSb3V0aW5nQ2hhbmdlZChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgY29uZmlnPzogeyBmb3JjZT86IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghcm91dGluZykgcmV0dXJuO1xuICAgIGlmICghY29uZmlnPy5mb3JjZSAmJiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSA9PT0gbG9hZGVkLnJvdXRpbmdKU09OKSByZXR1cm47XG4gICAgbGV0IHJlYXNvbiA9IGNvbmZpZz8uZm9yY2UgJiYgKGNvbmZpZy5yZWFzb24gfHwgXCJmb3JjZWRcIikgfHwgXCJyb3V0aW5nIGNvbmZpZyBjaGFuZ2VkXCI7XG4gICAgbGV0IHBsYW4gPSBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcpO1xuICAgIGlmIChwbGFuLnN0cnVjdHVyZUtleSA9PT0gbG9hZGVkLnN0cnVjdHVyZUtleSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQXBwbHlpbmcgdGhlIHJvdXRpbmcgY29uZmlnIHRvIHRoZSBydW5uaW5nIHN0b3JlcyBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KWApO1xuICAgICAgICBmb3IgKGxldCBwbGFuU3RvcmUgb2YgcGxhbi5zdG9yZXMpIHtcbiAgICAgICAgICAgIGxldCBsaXZlID0gbG9hZGVkLnN0b3Jlcy5maW5kKHggPT4geC5yb3V0ZUtleSA9PT0gcGxhblN0b3JlLnJvdXRlS2V5KTtcbiAgICAgICAgICAgIC8vIHN0cnVjdHVyZUtleSBlcXVhbGl0eSBtZWFucyB0aGUgc3RvcmUgc2V0IChyb3V0ZXMsIHJhd0Rpc2ssIGxpbWl0cykgaXMgdW5jaGFuZ2VkLCBzbyBldmVyeSBwbGFuIHN0b3JlIGhhcyBpdHMgbGl2ZSB0d2luXG4gICAgICAgICAgICBpZiAoIWxpdmUgfHwgIShsaXZlLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc3RvcmVGb2xkZXIgPSBsaXZlLmZvbGRlcjtcbiAgICAgICAgICAgIGxpdmUuc3RvcmUudXBkYXRlU291cmNlcyhwbGFuU3RvcmUuc291cmNlU3BlY3MubWFwKHNwZWMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbmZpZyA9IHNwZWMuc291cmNlQ29uZmlnO1xuICAgICAgICAgICAgICAgIGlmICghc291cmNlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eSh1bmRlZmluZWQpLCB1cmw6IHN0b3JlRm9sZGVyLCB2YWxpZFdpbmRvd3M6IHNwZWMudmFsaWRXaW5kb3dzLCBjcmVhdGU6ICgpOiBJQXJjaGl2ZXMgPT4gbmV3IEFyY2hpdmVzRGlzayhzdG9yZUZvbGRlcikgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHk6IHNvdXJjZUlkZW50aXR5KHNvdXJjZUNvbmZpZyksXG4gICAgICAgICAgICAgICAgICAgIHVybDogc291cmNlQ29uZmlnLnVybCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRXaW5kb3dzOiBzcGVjLnZhbGlkV2luZG93cyxcbiAgICAgICAgICAgICAgICAgICAgcm91dGU6IHNwZWMucm91dGUsXG4gICAgICAgICAgICAgICAgICAgIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlOiBzb3VyY2VDb25maWcuaW50ZXJtZWRpYXRlLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZTogKCkgPT4gY3JlYXRlQXBpQXJjaGl2ZXMoc291cmNlQ29uZmlnKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksIHBsYW5TdG9yZS5lbnRyaWVzKTtcbiAgICAgICAgICAgIGxpdmUuZW50cmllcyA9IHBsYW5TdG9yZS5lbnRyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGxvYWRlZC5yb3V0aW5nID0gcm91dGluZztcbiAgICAgICAgbG9hZGVkLnJvdXRpbmdKU09OID0gSlNPTi5zdHJpbmdpZnkocm91dGluZyk7XG4gICAgICAgIGxvYWRlZC5zZWxmRW50cmllcyA9IHBsYW4uc2VsZkVudHJpZXM7XG4gICAgICAgIGxvYWRlZC5zZWxmID0gcGxhbi5zZWxmO1xuICAgICAgICBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQpO1xuICAgICAgICBzY2hlZHVsZUJvdW5kYXJ5U2NhbnMobG9hZGVkKTtcbiAgICAgICAgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgUmVidWlsZGluZyB0aGUgc3RvcmVzIGZvciBidWNrZXQgJHtrZXl9ICgke3JlYXNvbn0pOiBzdHJ1Y3R1cmUgY2hhbmdlZCBmcm9tICR7bG9hZGVkLnN0cnVjdHVyZUtleX0gdG8gJHtwbGFuLnN0cnVjdHVyZUtleX1gKTtcbiAgICBmb3IgKGxldCBzIG9mIGxvYWRlZC5zdG9yZXMpIHtcbiAgICAgICAgaWYgKHMuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpIHtcbiAgICAgICAgICAgIGF3YWl0IHMuc3RvcmUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcsIHBsYW4pKSk7XG4gICAgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTtcbn1cblxuY29uc3Qgcm91dGluZ1dyaXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4vKiogVGhlIHJvdXRpbmctY29uZmlnIHdyaXRlIHBhdGggLSB0aGUgT05FIHdyaXRlIHRoYXQgY2Fubm90IGdvIHRocm91Z2ggYSBzdG9yZSAoaXQgaXMgd2hhdCBDUkVBVEVTIHRoZSBidWNrZXQgYW5kIGl0cyBzdG9yZXMpLiBTZXJpYWxpemVkIHBlciBidWNrZXQ6IGNvbmN1cnJlbnQgY29uZmlnIHdyaXRlcyB3b3VsZCByYWNlIHRoZSB2ZXJzaW9uIGNoZWNrLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlUm91dGluZ0NvbmZpZ1dyaXRlKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBydW4gPSAocm91dGluZ1dyaXRlcy5nZXQoa2V5KSB8fCBQcm9taXNlLnJlc29sdmUoKSkudGhlbigoKSA9PiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudCwgYnVja2V0TmFtZSwgZGF0YSwgY29uZmlnKSk7XG4gICAgcm91dGluZ1dyaXRlcy5zZXQoa2V5LCBydW4udGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSkpO1xuICAgIHJldHVybiBhd2FpdCBydW47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUm91dGluZ0NvbmZpZyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBpbmNvbWluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICBhd2FpdCByZXNvbHZlU291cmNlQXJjaGl2ZXMoZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIGluY29taW5nKSkpO1xuICAgICAgICBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCgpO1xuICAgICAgICBjb25zb2xlLmxvZyhgQ3JlYXRlZCBidWNrZXQgJHtrZXl9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KGluY29taW5nKSAhPT0gbG9hZGVkLnJvdXRpbmdKU09OICYmIGdldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpIDw9IGdldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gYENhbm5vdCB1cGRhdGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX06IHRoZSBuZXcgY29uZmlnIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBvbmUgYnV0IGl0cyB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpfSkgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpfSkuIEluY3JlbWVudCB0aGUgdmVyc2lvbiB0byB1cGRhdGUgaXQuIEN1cnJlbnQ6ICR7bG9hZGVkLnJvdXRpbmdKU09OfS4gQXR0ZW1wdGVkOiAke0pTT04uc3RyaW5naWZ5KGluY29taW5nKX1gO1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIGxldCBzdG9yZWQgPSBpbmNvbWluZztcbiAgICBsZXQgcmVpbmplY3RlZCA9IDA7XG4gICAgZm9yIChsZXQgaW50ZXJtZWRpYXRlIG9mIGdldEludGVybWVkaWF0ZVNvdXJjZXMoZXhwaXJlSW50ZXJtZWRpYXRlU291cmNlcyhsb2FkZWQucm91dGluZywgRGF0ZS5ub3coKSkpKSB7XG4gICAgICAgIHN0b3JlZCA9IGluamVjdEludGVybWVkaWF0ZVNvdXJjZShzdG9yZWQsIHtcbiAgICAgICAgICAgIHNwbGl0VXJsOiBpbnRlcm1lZGlhdGUuaW50ZXJtZWRpYXRlIHx8IGludGVybWVkaWF0ZS51cmwsXG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVVcmw6IGludGVybWVkaWF0ZS51cmwsXG4gICAgICAgICAgICBzdGFydDogaW50ZXJtZWRpYXRlLnZhbGlkV2luZG93WzBdLFxuICAgICAgICAgICAgZW5kOiBpbnRlcm1lZGlhdGUudmFsaWRXaW5kb3dbMV0sXG4gICAgICAgIH0pO1xuICAgICAgICByZWluamVjdGVkKys7XG4gICAgfVxuICAgIGlmIChKU09OLnN0cmluZ2lmeShzdG9yZWQpICE9PSBKU09OLnN0cmluZ2lmeShpbmNvbWluZykpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlLWluamVjdGVkICR7cmVpbmplY3RlZH0gaW4tZmxpZ2h0IHN3aXRjaG92ZXIgd2luZG93cyBpbnRvIHRoZSBpbmNvbWluZyByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7a2V5fSAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpfSlgKTtcbiAgICB9XG4gICAgLy8gV3JpdHRlbiBzdHJhaWdodCBpbnRvIHRoZSBwbGFpbiBidWNrZXQgZm9sZGVyOiB0aGUgcm91dGluZyBmaWxlIGRlZmluZXMgdGhlIHBlci1yb3V0ZSBzdG9yZXMsIHNvIGl0IG5ldmVyIGZsb3dzIHRocm91Z2ggdGhlbVxuICAgIGF3YWl0IHJlc29sdmVTb3VyY2VBcmNoaXZlcyhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpLnNldChST1VUSU5HX0ZJTEUsIEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyhzdG9yZWQpKSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZz8ubGFzdE1vZGlmaWVkIH0pO1xuICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChhY2NvdW50LCBidWNrZXROYW1lKTtcbn1cblxuLyoqIFdoaWNoIGJ1Y2tldHMgdGhpcyBwcm9jZXNzIGN1cnJlbnRseSBoYXMgbG9hZGVkIC0gd2hhdCBhIGRlcGxveSBzdWNjZXNzb3IgYXNrcyBpdHMgcHJlZGVjZXNzb3IgZm9yLCBzbyBpdCBhY3RpdmF0ZXMgZXhhY3RseSB0aGUgYnVja2V0cyB0aGF0IGFyZSBhY3R1YWxseSBpbiB1c2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlQnVja2V0S2V5cygpOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIFsuLi5idWNrZXRzLmtleXMoKV0ubWFwKGtleSA9PiB7XG4gICAgICAgIGxldCBzbGFzaCA9IGtleS5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgcmV0dXJuIHsgYWNjb3VudDoga2V5LnNsaWNlKDAsIHNsYXNoKSwgYnVja2V0TmFtZToga2V5LnNsaWNlKHNsYXNoICsgMSkgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYnVpbGRBbGxMb2FkZWRCdWNrZXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IGtleSBvZiBbLi4uYnVja2V0cy5rZXlzKCldKSB7XG4gICAgICAgIGxldCBzbGFzaCA9IGtleS5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGtleS5zbGljZSgwLCBzbGFzaCksIGtleS5zbGljZShzbGFzaCArIDEpLCB7IGZvcmNlOiB0cnVlLCByZWFzb246IFwiYWxsIGxvYWRlZCBidWNrZXRzIHdlcmUgYXNrZWQgdG8gcmVidWlsZFwiIH0pO1xuICAgIH1cbn1cblxuY29uc3QgT1dOX0NPTkZJR19XUklURV9USFJPVFRMRSA9IDMwICogMTAwMDtcbmNvbnN0IElOVEVSTUVESUFURV9NQUlOVEFJTl9JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIFBlciBidWNrZXQsIG5vdCBnbG9iYWw6IGEgc3dpdGNob3ZlciBoYXMgdG8gd3JpdGUgZXZlcnkgYnVja2V0J3Mgd2luZG93cyBhdCBvbmNlLCBhbmQgYSBzaGFyZWQgdGhyb3R0bGUgd291bGQgbGV0IG9ubHkgb25lIGJ1Y2tldCB0aHJvdWdoIHBlciBpbnRlcnZhbFxuY29uc3QgbGFzdE93bkNvbmZpZ1dyaXRlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVPd25Sb3V0aW5nQ29uZmlnKGxvYWRlZDogQnVja2V0U3RhdGUsIHVwZGF0ZWQ6IFJlbW90ZUNvbmZpZywgcmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9YDtcbiAgICBsZXQgc2luY2VMYXN0ID0gRGF0ZS5ub3coKSAtIChsYXN0T3duQ29uZmlnV3JpdGUuZ2V0KGtleSkgfHwgMCk7XG4gICAgaWYgKHNpbmNlTGFzdCA8IE9XTl9DT05GSUdfV1JJVEVfVEhST1RUTEUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE5vdCB3cml0aW5nIG91ciBvd24gcm91dGluZyBjb25maWcgdXBkYXRlIGZvciBidWNrZXQgJHtrZXl9ICgke3JlYXNvbn0pOiB0aGUgbGFzdCBvbmUgd2FzICR7c2luY2VMYXN0fW1zIGFnbywgdW5kZXIgdGhlICR7T1dOX0NPTkZJR19XUklURV9USFJPVFRMRX1tcyB0aHJvdHRsZS4gUmV0cnlpbmcgb24gdGhlIG5leHQgbWFpbnRlbmFuY2UgcGFzcy4gV2FudGVkOiAke0pTT04uc3RyaW5naWZ5KHVwZGF0ZWQpfWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RPd25Db25maWdXcml0ZS5zZXQoa2V5LCBEYXRlLm5vdygpKTtcbiAgICBsZXQgdmVyc2lvbiA9IG5leHRJbnRlcm1lZGlhdGVWZXJzaW9uKGdldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpKTtcbiAgICBsZXQgbmV4dDogUmVtb3RlQ29uZmlnID0geyAuLi51cGRhdGVkLCB2ZXJzaW9uIH07XG4gICAgY29uc29sZS5sb2coYFdyaXRpbmcgJHtST1VUSU5HX0ZJTEV9IGZvciBidWNrZXQgJHtrZXl9ICgke3JlYXNvbn0pLCB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZyl9IC0+ICR7dmVyc2lvbn06ICR7SlNPTi5zdHJpbmdpZnkobmV4dCl9YCk7XG4gICAgbGV0IGRhdGEgPSBCdWZmZXIuZnJvbShzZXJpYWxpemVSZW1vdGVDb25maWcobmV4dCkpO1xuICAgIGF3YWl0IHF1ZXVlUm91dGluZ0NvbmZpZ1dyaXRlKGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSwgZGF0YSk7XG4gICAgYXdhaXQgcHJvcGFnYXRlUm91dGluZ0NvbmZpZyhsb2FkZWQsIG5leHQsIGRhdGEpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9wYWdhdGVSb3V0aW5nQ29uZmlnKGxvYWRlZDogQnVja2V0U3RhdGUsIG5leHQ6IFJlbW90ZUNvbmZpZywgZGF0YTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHRhcmdldHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlQ29uZmlnPigpO1xuICAgIGZvciAobGV0IHNvdXJjZSBvZiBbLi4ubG9hZGVkLnJvdXRpbmcuc291cmNlcywgLi4ubmV4dC5zb3VyY2VzXSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UuaW50ZXJtZWRpYXRlKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSBcInJlbW90ZVwiKSB7XG4gICAgICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgICAgICBpZiAocGFyc2VkLmFjY291bnQgIT09IGxvYWRlZC5hY2NvdW50IHx8IHBhcnNlZC5idWNrZXROYW1lICE9PSBsb2FkZWQuYnVja2V0TmFtZSkgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldHMuaGFzKHNvdXJjZS51cmwpKSBjb250aW51ZTtcbiAgICAgICAgdGFyZ2V0cy5zZXQoc291cmNlLnVybCwgc291cmNlKTtcbiAgICB9XG4gICAgZm9yIChsZXQgW3VybCwgc291cmNlXSBvZiB0YXJnZXRzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjcmVhdGVBcGlBcmNoaXZlcyhzb3VyY2UpLnNldChST1VUSU5HX0ZJTEUsIGRhdGEpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFdyb3RlICR7Uk9VVElOR19GSUxFfSBmb3IgYnVja2V0ICR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9IHRvICR7dXJsfWApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcm9wYWdhdGluZyBvdXIgcm91dGluZyBjb25maWcgdXBkYXRlIHRvICR7dXJsfSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW50YWluSW50ZXJtZWRpYXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICBsZXQgdGFrZW92ZXIgPSBnZXRUYWtlb3ZlckludGVybWVkaWF0ZSgpO1xuICAgIGxldCB3cml0dGVuOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBhbHJlYWR5Q29ycmVjdDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbm90T3Vyczogc3RyaW5nW10gPSBbXTtcbiAgICAvLyBPTkxZIGJ1Y2tldHMgYWxyZWFkeSBpbiBtZW1vcnkuIEEgc3dpdGNob3ZlciBtdXN0IG5ldmVyIGxvYWQgYSBidWNrZXQ6IGxvYWRpbmcgc3RhcnRzIGl0cyBzeW5jaHJvbml6YXRpb24sIGFuZCBidWNrZXRzIG5vdGhpbmcgaGFzIHRvdWNoZWQgKGxlZ2FjeSBvbmVzIGVzcGVjaWFsbHkpIGhhdmUgbm8gd3JpdGVzIHRvIGhhbmQgb2ZmIGluIHRoZSBmaXJzdCBwbGFjZS4gT25lIHRoYXQgZG9lcyBnZXQgdXNlZCBtaWQtc3dpdGNob3ZlciBsb2FkcyBvbiB0aGF0IGFjY2VzcywgYW5kIHRoZSBuZXh0IHBhc3MgZ2l2ZXMgaXQgaXRzIHdpbmRvdy5cbiAgICBsZXQga2V5cyA9IFsuLi5idWNrZXRzLmtleXMoKV07XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgbGV0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChrZXkpO1xuICAgICAgICBpZiAoIWxvYWRlZFByb21pc2UpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbG9hZGVkID0gYXdhaXQgbG9hZGVkUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoIWxvYWRlZCkgY29udGludWU7XG4gICAgICAgIGxldCBleHBpcmVkID0gZXhwaXJlSW50ZXJtZWRpYXRlU291cmNlcyhsb2FkZWQucm91dGluZywgRGF0ZS5ub3coKSk7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleHBpcmVkKSAhPT0gSlNPTi5zdHJpbmdpZnkobG9hZGVkLnJvdXRpbmcpKSB7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZU93blJvdXRpbmdDb25maWcobG9hZGVkLCBleHBpcmVkLCBgc3dpdGNob3ZlciB3aW5kb3dzIGV4cGlyZWQgbW9yZSB0aGFuICR7SU5URVJNRURJQVRFX0VYUElSRV9HUkFDRSAvIDEwMDB9cyBhZ29gKTtcbiAgICAgICAgICAgIHdyaXR0ZW4ucHVzaChrZXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YWtlb3ZlcikgY29udGludWU7XG4gICAgICAgIGxldCBtYWluVXJsID0gbG9hZGVkLnJvdXRpbmcuc291cmNlcy5maW5kKHggPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB4ID09PSBcInN0cmluZ1wiIHx8IHgudHlwZSAhPT0gXCJyZW1vdGVcIiB8fCB4LmludGVybWVkaWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHgudXJsKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZWQuYWRkcmVzcyA9PT0gZG9tYWluICYmIHBhcnNlZC5wb3J0ID09PSBwb3J0O1xuICAgICAgICB9KSBhcyBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghbWFpblVybCkge1xuICAgICAgICAgICAgbm90T3Vycy5wdXNoKGtleSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5qZWN0ZWQgPSBpbmplY3RJbnRlcm1lZGlhdGVTb3VyY2UobG9hZGVkLnJvdXRpbmcsIHtcbiAgICAgICAgICAgIHNwbGl0VXJsOiBtYWluVXJsLnVybCxcbiAgICAgICAgICAgIGludGVybWVkaWF0ZVVybDogcmVwbGFjZUhvc3RlZFVybFBvcnQobWFpblVybC51cmwsIHRha2VvdmVyLmFsdFBvcnQpLFxuICAgICAgICAgICAgc3RhcnQ6IHRha2VvdmVyLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiB0YWtlb3Zlci5lbmQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoaW5qZWN0ZWQpID09PSBKU09OLnN0cmluZ2lmeShsb2FkZWQucm91dGluZykpIHtcbiAgICAgICAgICAgIGFscmVhZHlDb3JyZWN0LnB1c2goa2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHdyaXRlT3duUm91dGluZ0NvbmZpZyhsb2FkZWQsIGluamVjdGVkLCBgd2UgYXJlIGEgZGVwbG95IHN1Y2Nlc3Nvcjogd3JpdGVzIHJvdXRlIHRvIG91ciBhbHRlcm5hdGUgcG9ydCAke3Rha2VvdmVyLmFsdFBvcnR9IGZyb20gJHtuZXcgRGF0ZSh0YWtlb3Zlci5zdGFydCkudG9JU09TdHJpbmcoKX0gdW50aWwgb3VyIHByZWRlY2Vzc29yIGlzIGtpbGxlZCBhdCAke25ldyBEYXRlKHRha2VvdmVyLmVuZCkudG9JU09TdHJpbmcoKX1gKTtcbiAgICAgICAgd3JpdHRlbi5wdXNoKGtleSk7XG4gICAgfVxuICAgIGlmICghdGFrZW92ZXIpIHJldHVybjtcbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBObyBhY3RpdmUgYnVja2V0cywgc28gbm8gY29uZmlnIGZpbGVzIHRvIHdyaXRlIHRoZSBpbnRlcm1lZGlhdGUgaW50byAoYSBidWNrZXQgaXMgb25seSBhY3RpdmUgb25jZSBzb21ldGhpbmcgdXNlcyBpdClgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXdyaXR0ZW4ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBXcm90ZSBubyBjb25maWcgZmlsZXM6IG9mICR7a2V5cy5sZW5ndGh9IGFjdGl2ZSBidWNrZXRzLCAke2FscmVhZHlDb3JyZWN0Lmxlbmd0aH0gYWxyZWFkeSBjb250YWluIHRoZSBpbnRlcm1lZGlhdGUgYW5kICR7bm90T3Vycy5sZW5ndGh9IGFyZSBub3QgaG9zdGVkIGJ5IHVzYCk7XG4gICAgfVxufVxuXG4vKiogT3VyIHByZWRlY2Vzc29yIHN0aWxsIGhvbGRzIHRoZSBtYWluIHBvcnQgYW5kIGhhcyBiZWVuIHNlcnZpbmcgYWxsIGFsb25nLCBzbyBpdCAtIG5vdCB1cyAtIGtub3dzIHdoaWNoIGJ1Y2tldHMgYXJlIGluIHVzZS4gV2UgYWN0aXZhdGUgZXhhY3RseSB0aG9zZSwgd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGVpciBjb25maWcgZmlsZXMgZ2V0IHRoZSBpbnRlcm1lZGlhdGU7IG5vdGhpbmcgZWxzZSBvbiBkaXNrIGlzIHRvdWNoZWQuICovXG5hc3luYyBmdW5jdGlvbiBhY3RpdmF0ZVByZWRlY2Vzc29yQnVja2V0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICBsZXQgdXJsID0gYGh0dHBzOi8vJHtkb21haW59OiR7cG9ydH1gO1xuICAgIGxldCBrZXlzOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXTtcbiAgICB0cnkge1xuICAgICAgICBrZXlzID0gYXdhaXQgbGlzdFNlcnZlckFjdGl2ZUJ1Y2tldEtleXMoeyB1cmwgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgYXNrIG91ciBwcmVkZWNlc3NvciBvbiAke3VybH0gd2hpY2ggYnVja2V0cyBhcmUgYWN0aXZlLCBzbyBvbmx5IGJ1Y2tldHMgdXNlZCBvbiB0aGlzIHByb2Nlc3MgZ2V0IHRoZSBpbnRlcm1lZGlhdGU6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFrZXlzLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgT3VyIHByZWRlY2Vzc29yIG9uICR7dXJsfSBoYXMgbm8gYWN0aXZlIGJ1Y2tldHMsIHNvIHRoZXJlIGFyZSBubyBjb25maWcgZmlsZXMgdG8gd3JpdGUgdGhlIGludGVybWVkaWF0ZSBpbnRvYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYE91ciBwcmVkZWNlc3NvciBvbiAke3VybH0gaGFzICR7a2V5cy5sZW5ndGh9IGFjdGl2ZSBidWNrZXRzLCBhY3RpdmF0aW5nIHRoZW0gaGVyZSBzbyB0aGVpciBjb25maWcgZmlsZXMgZ2V0IHRoZSBpbnRlcm1lZGlhdGU6ICR7a2V5cy5tYXAoeCA9PiBgJHt4LmFjY291bnR9LyR7eC5idWNrZXROYW1lfWApLmpvaW4oXCIsIFwiKX1gKTtcbiAgICBmb3IgKGxldCB7IGFjY291bnQsIGJ1Y2tldE5hbWUgfSBvZiBrZXlzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFjdGl2YXRpbmcgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSAoYWN0aXZlIG9uIG91ciBwcmVkZWNlc3NvcikgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKiogU3RhcnRlZCBieSBkZXBsb3lUYWtlb3ZlciBvbmNlIHdlIGFyZSBhY3R1YWxseSBhIGRlcGxveSBzdWNjZXNzb3IgbGlzdGVuaW5nIG9uIGFuIGFsdGVybmF0ZSBwb3J0LiBVbnRpbCB0aGVuIHRoZXJlIGFyZSBubyBzd2l0Y2hvdmVyIHdpbmRvd3MgdG8gd3JpdGUgb3IgZXhwaXJlLCBzbyBub3RoaW5nIHBvbGxzLiAqL1xuZXhwb3J0IGNvbnN0IHN0YXJ0SW50ZXJtZWRpYXRlTWFpbnRlbmFuY2UgPSBsYXp5KCgpID0+IHtcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGFjdGl2YXRlUHJlZGVjZXNzb3JCdWNrZXRzKCk7XG4gICAgICAgIGF3YWl0IG1haW50YWluSW50ZXJtZWRpYXRlcygpO1xuICAgIH0pKCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBXcml0aW5nIHRoZSBpbnRlcm1lZGlhdGUgaW50byB0aGUgY29uZmlnIGZpbGVzIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgIHJ1bkluZmluaXRlUG9sbChJTlRFUk1FRElBVEVfTUFJTlRBSU5fSU5URVJWQUwsIG1haW50YWluSW50ZXJtZWRpYXRlcyk7XG59KTtcblxuZXhwb3J0IHR5cGUgU2VydmVyQnVja2V0SW5mbyA9IHtcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKiBXaGVyZSB0aGUgYnVja2V0J3MgZGF0YSBsaXZlcyBvbiB0aGlzIHNlcnZlciAqL1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgZHJpdmUgdGhhdCBmb2xkZXIgaXMgb24uIEJ1Y2tldHMgc2hhcmluZyBhIGRyaXZlIHJlcG9ydCB0aGUgc2FtZSBudW1iZXJzLiAqL1xuICAgIGRpc2s/OiBCdWNrZXREaXNrSW5mbztcbiAgICBkaXNrRXJyb3I/OiBzdHJpbmc7XG4gICAgd3JpdGVTdGF0cz86IEJ1Y2tldFdyaXRlU3RhdHM7XG4gICAgY29uZmlnPzogQXJjaGl2ZXNDb25maWc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBY3RpdmVCdWNrZXRJbmZvID0ge1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgcm91dGluZyBjb25maWcgdGhlIGJ1Y2tldCBpcyBSVU5OSU5HIG9uLCBzdHJhaWdodCBmcm9tIG1lbW9yeSAtIGluY2x1ZGluZyBzd2l0Y2hvdmVyIHdpbmRvd3Mgd3JpdHRlbiBzaW5jZSBpdCBsb2FkZWQgKi9cbiAgICByb3V0aW5nOiBSZW1vdGVDb25maWc7XG4gICAgLyoqIE91ciBvd24gZW50cmllcyBpbiB0aGF0IGNvbmZpZywgYW5kIHRoZWlyIHN1bW1hcml6ZWQgY3VycmVudCByb2xlIChyb3V0ZXMgdW5pb24gKyBmbGFncykgKi9cbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgc2VsZj86IFNlbGZTdW1tYXJ5O1xuICAgIGNvbmZpZzogQXJjaGl2ZXNDb25maWc7XG59O1xuXG5mdW5jdGlvbiB0b0FjdGl2ZUJ1Y2tldEluZm8obG9hZGVkOiBCdWNrZXRTdGF0ZSk6IEFjdGl2ZUJ1Y2tldEluZm8ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZvbGRlcjogZ2V0QnVja2V0Rm9sZGVyKGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSksXG4gICAgICAgIHJvdXRpbmc6IGxvYWRlZC5yb3V0aW5nLFxuICAgICAgICBzZWxmRW50cmllczogbG9hZGVkLnNlbGZFbnRyaWVzLFxuICAgICAgICBzZWxmOiBsb2FkZWQuc2VsZixcbiAgICAgICAgY29uZmlnOiBnZXRCdWNrZXRDb25maWcobG9hZGVkKSxcbiAgICB9O1xufVxuXG4vKiogVGhlIGxpdmUgaW4tbWVtb3J5IHN0YXRlIG9mIE9ORSBidWNrZXQsIGFuc3dlcmVkIHdpdGhvdXQgdG91Y2hpbmcgdGhlIGRpc2sgKG5vIHJvdXRpbmcgZmlsZSByZWFkLCBubyBzdGF0ZnMsIG5vIHN0b3JlZCB3cml0ZSBzdGF0cykuIFJldHVybnMgYW4gZXJyb3Igc3RyaW5nIHdoZW4gdGhlIGJ1Y2tldCBpcyBub3QgbG9hZGVkIGhlcmUsIHdoaWNoIGlzIHRoZSBub3JtYWwgc3RhdGUgZm9yIGEgYnVja2V0IG5vdGhpbmcgaGFzIGFjY2Vzc2VkIHNpbmNlIHN0YXJ0dXAuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWN0aXZlQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWRQcm9taXNlID0gYnVja2V0cy5nZXQoa2V5KTtcbiAgICBpZiAoIWxvYWRlZFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIGBCdWNrZXQgJHtrZXl9IGlzIG5vdCBsb2FkZWQgb24gdGhpcyBzZXJ2ZXIsIHNvIGl0IGhhcyBubyBsaXZlIHN0YXRlIChpdCBsb2FkcyBvbiBmaXJzdCBhY2Nlc3MpYDtcbiAgICB9XG4gICAgbGV0IGxvYWRlZDogQnVja2V0U3RhdGUgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVkUHJvbWlzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBmYWlsZWQgdG8gbG9hZCBvbiB0aGlzIHNlcnZlcjogJHtTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCl9YDtcbiAgICB9XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgcmV0dXJuIGBCdWNrZXQgJHtrZXl9IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgc2VydmVyYDtcbiAgICB9XG4gICAgcmV0dXJuIHRvQWN0aXZlQnVja2V0SW5mbyhsb2FkZWQpO1xufVxuXG4vKiogTG9hZHMgYSBidWNrZXQgdGhhdCBleGlzdHMgb24gdGhpcyBzZXJ2ZXIncyBkaXNrIGludG8gbWVtb3J5LCB3aGljaCBzdGFydHMgaXRzIHN5bmNocm9uaXphdGlvbiBhbmQgd2luZG93IHRpbWVycywgYW5kIHJldHVybnMgaXRzIGxpdmUgc3RhdGUuIE5vdGhpbmcgaXMgd3JpdHRlbiBhbmQgbm8gb3RoZXIgc2VydmVyIGlzIGNvbnRhY3RlZCAtIHVubGlrZSBidWlsZGluZyBhbiBBcmNoaXZlc0NoYWluIGZvciBpdCwgd2hpY2ggd291bGQgcHJvYmUgZXZlcnkgc291cmNlIGFuZCBjb3VsZCB3cml0ZSB0aGUgcm91dGluZyBjb25maWcuIEFscmVhZHktbG9hZGVkIGJ1Y2tldHMganVzdCByZXR1cm4gdGhlaXIgc3RhdGUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IHdhc0xvYWRlZCA9IGJ1Y2tldHMuaGFzKGtleSk7XG4gICAgbGV0IGxvYWRlZDogQnVja2V0U3RhdGUgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGBCdWNrZXQgJHtrZXl9IGZhaWxlZCB0byBsb2FkIG9uIHRoaXMgc2VydmVyOiAke1N0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKX1gO1xuICAgIH1cbiAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBzZXJ2ZXIgKG5vIHJvdXRpbmcgZmlsZSBpbiAke2dldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKX0pYDtcbiAgICB9XG4gICAgLy8gV2FpdCBmb3IgdGhlIGluZGV4ZXMgdG8gbG9hZCwgc28gdGhlIHRvdGFscyB3ZSByZXR1cm4gYXJlIHRoZSByZWFsIG9uZXMgcmF0aGVyIHRoYW4gemVyb2VzIGZyb20gc3RvcmVzIHRoYXQgaGF2ZSBub3QgcmVhZCB0aGVpciBpbmRleCB5ZXQuIFRoZSBzb3VyY2Ugc2NhbnMga2VlcCBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgIGZvciAobGV0IHMgb2YgbG9hZGVkLnN0b3Jlcykge1xuICAgICAgICBpZiAocy5zdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkge1xuICAgICAgICAgICAgYXdhaXQgcy5zdG9yZS5pbml0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF3YXNMb2FkZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFjdGl2YXRlZCBidWNrZXQgJHtrZXl9IG9uIHJlcXVlc3Q6IGl0IGlzIG5vdyBsb2FkZWQgYW5kIHN5bmNocm9uaXppbmdgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRvQWN0aXZlQnVja2V0SW5mbyhsb2FkZWQpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEFjY291bnRCdWNrZXRzKGFjY291bnQ6IHN0cmluZyk6IFByb21pc2U8U2VydmVyQnVja2V0SW5mb1tdPiB7XG4gICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgdGltaW5ncyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgYXN5bmMgZnVuY3Rpb24gdGltZWQ8VD4obmFtZTogc3RyaW5nLCBydW46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IGJlZ2FuID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4oKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRpbWluZ3Muc2V0KG5hbWUsICh0aW1pbmdzLmdldChuYW1lKSB8fCAwKSArIChEYXRlLm5vdygpIC0gYmVnYW4pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgYWNjb3VudEZvbGRlciA9IHBhdGguam9pbihnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkuZm9sZGVyLCBcImJ1Y2tldHMyXCIsIGFjY291bnQpO1xuICAgIGxldCBuYW1lczogc3RyaW5nW107XG4gICAgdHJ5IHtcbiAgICAgICAgbmFtZXMgPSBhd2FpdCB0aW1lZChcInJlYWRkaXJcIiwgKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihhY2NvdW50Rm9sZGVyKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gUGVyLXJvdXRlIGZvbGRlcnMgKGJ1Y2tldE5hbWUtcm91dGUtPHN0YXJ0Pi08ZW5kPikgYmVsb25nIHRvIHRoZSBzYW1lIGJ1Y2tldCBhcyB0aGUgcGxhaW4gZm9sZGVyIC0gY29sbGFwc2UgdGhlbSBzbyBvbmUgYnVja2V0IGxpc3RzIG9uY2VcbiAgICBuYW1lcyA9IFsuLi5uZXcgU2V0KG5hbWVzLm1hcCh4ID0+IHgucmVwbGFjZSgvLXJvdXRlLVtcXGQuXSstW1xcZC5dKyQvLCBcIlwiKSkpXTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwobmFtZXMubWFwKGFzeW5jIGJ1Y2tldE5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICAgICAgbGV0IGZvbGRlciA9IGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgICAgIGxldCBiYXNlOiBTZXJ2ZXJCdWNrZXRJbmZvID0geyBidWNrZXROYW1lLCBhY3RpdmU6IGZhbHNlLCBmb2xkZXIgfTtcbiAgICAgICAgICAgIGJhc2UuZGlzayA9IGF3YWl0IHRpbWVkKFwic3RhdGZzXCIsICgpID0+IGdldERpc2tJbmZvKGZvbGRlcikpLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGJhc2UuZGlza0Vycm9yID0gU3RyaW5nKGUuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBiYXNlLndyaXRlU3RhdHMgPSBnZXRCdWNrZXRXcml0ZVN0YXRzKGtleSk7XG4gICAgICAgICAgICBjb25zdCBsb2FkZWRQcm9taXNlID0gYnVja2V0cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2FkZWRQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvYWRlZCA9IGF3YWl0IHRpbWVkKFwiYXdhaXRMb2FkZWRcIiwgKCkgPT4gbG9hZGVkUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGFjdGl2ZTogdHJ1ZSwgY29uZmlnOiBnZXRCdWNrZXRDb25maWcobG9hZGVkKSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBhY3RpdmU6IHRydWUsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aW1lZChcInJlYWRSb3V0aW5nRmlsZVwiLCAoKSA9PiByZWFkUm91dGluZ0ZpbGUoZm9sZGVyKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGVycm9yOiBgTm8gcm91dGluZyBmaWxlICgke1JPVVRJTkdfRklMRX0pYCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gYXdhaXQgdGltZWQoXCJwYXJzZVJvdXRpbmdcIiwgYXN5bmMgKCkgPT4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgY29uZmlnOiB7IHJlbW90ZUNvbmZpZzogcGFyc2VkIH0gfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBUaGUgcGFydHMgcnVuIGNvbmN1cnJlbnRseSwgc28gdGhlc2UgYXJlIHN1bW1lZCB3YWxsIHRpbWVzIHBlciBwYXJ0LCBub3QgYSBicmVha2Rvd24gb2YgdGhlIHRvdGFsXG4gICAgICAgIGxldCBwYXJ0cyA9IFsuLi50aW1pbmdzXS5tYXAoKFtuYW1lLCBtc10pID0+IGAke25hbWV9ICR7bXN9bXNgKS5qb2luKFwiLCBcIik7XG4gICAgICAgIGNvbnNvbGUubG9nKGBsaXN0QWNjb3VudEJ1Y2tldHMoJHthY2NvdW50fSkgdG9vayAke0RhdGUubm93KCkgLSBzdGFydH1tcyBmb3IgJHtuYW1lcy5sZW5ndGh9IGJ1Y2tldHM6ICR7cGFydHN9YCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBCdWNrZXRXcml0ZVN0YXRzID0ge1xuICAgIC8qKiBFdmVyeSBzZXQgY2FsbCB0aGUgYnVja2V0IGFjY2VwdGVkICovXG4gICAgb3JpZ2luYWxXcml0ZXM6IG51bWJlcjtcbiAgICBvcmlnaW5hbEJ5dGVzOiBudW1iZXI7XG4gICAgLyoqIFdoYXQgYWN0dWFsbHkgcmVhY2hlZCB0aGUgc291cmNlcy4gRmFzdCB3cml0ZXMgY29hbGVzY2UgcmVwZWF0ZWQgd3JpdGVzIHRvIHRoZSBzYW1lIGtleSwgc28gdGhpcyBpcyBsb3dlciB0aGFuIHRoZSBvcmlnaW5hbCBjb3VudHMgKGFuZCBpcyB3aGF0IHRoZSBkaXNrIGFjdHVhbGx5IGRpZCkuICovXG4gICAgZmx1c2hlZFdyaXRlczogbnVtYmVyO1xuICAgIGZsdXNoZWRCeXRlczogbnVtYmVyO1xufTtcbmZ1bmN0aW9uIGVtcHR5V3JpdGVTdGF0cygpOiBCdWNrZXRXcml0ZVN0YXRzIHtcbiAgICByZXR1cm4geyBvcmlnaW5hbFdyaXRlczogMCwgb3JpZ2luYWxCeXRlczogMCwgZmx1c2hlZFdyaXRlczogMCwgZmx1c2hlZEJ5dGVzOiAwIH07XG59XG5cbi8vIEluIG1lbW9yeSBvbmx5OiB0b3RhbHMgc2luY2UgdGhpcyBwcm9jZXNzIHN0YXJ0ZWQgKG9yIHRoZSBsYXN0IGNsZWFyV3JpdGVTdGF0cykuIFBlcnNpc3RpbmcgdGhlbSB0byBkaXNrIHdhcyBtb3JlIG1hY2hpbmVyeSB0aGFuIHRoZSBudW1iZXJzIHdlcmUgd29ydGguXG5jb25zdCB3cml0ZVN0YXRzID0gbmV3IE1hcDxzdHJpbmcsIEJ1Y2tldFdyaXRlU3RhdHM+KCk7XG5cbmZ1bmN0aW9uIGNvdW50QnVja2V0V3JpdGUoa2V5OiBzdHJpbmcsIGtpbmQ6IFwib3JpZ2luYWxcIiB8IFwiZmx1c2hlZFwiLCBieXRlczogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IHN0YXRzID0gd3JpdGVTdGF0cy5nZXQoa2V5KTtcbiAgICBpZiAoIXN0YXRzKSB7XG4gICAgICAgIHN0YXRzID0gZW1wdHlXcml0ZVN0YXRzKCk7XG4gICAgICAgIHdyaXRlU3RhdHMuc2V0KGtleSwgc3RhdHMpO1xuICAgIH1cbiAgICBpZiAoa2luZCA9PT0gXCJvcmlnaW5hbFwiKSB7XG4gICAgICAgIHN0YXRzLm9yaWdpbmFsV3JpdGVzKys7XG4gICAgICAgIHN0YXRzLm9yaWdpbmFsQnl0ZXMgKz0gYnl0ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHMuZmx1c2hlZFdyaXRlcysrO1xuICAgICAgICBzdGF0cy5mbHVzaGVkQnl0ZXMgKz0gYnl0ZXM7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRCdWNrZXRXcml0ZVN0YXRzKGtleTogc3RyaW5nKTogQnVja2V0V3JpdGVTdGF0cyB7XG4gICAgcmV0dXJuIHdyaXRlU3RhdHMuZ2V0KGtleSkgfHwgZW1wdHlXcml0ZVN0YXRzKCk7XG59XG5cbi8qKiBaZXJvZXMgdGhlIHdyaXRlIHN0YXRpc3RpY3Mgb2YgZXZlcnkgYnVja2V0IGluIHRoZSBhY2NvdW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQWNjb3VudFdyaXRlU3RhdHMoYWNjb3VudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgcHJlZml4ID0gYCR7YWNjb3VudH0vYDtcbiAgICBsZXQgY2xlYXJlZCA9IDA7XG4gICAgZm9yIChsZXQga2V5IG9mIFsuLi53cml0ZVN0YXRzLmtleXMoKV0pIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgd3JpdGVTdGF0cy5kZWxldGUoa2V5KTtcbiAgICAgICAgY2xlYXJlZCsrO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgQ2xlYXJlZCB0aGUgd3JpdGUgc3RhdGlzdGljcyBvZiAke2NsZWFyZWR9IGJ1Y2tldHMgaW4gYWNjb3VudCAke2FjY291bnR9YCk7XG4gICAgcmV0dXJuIGNsZWFyZWQ7XG59XG5cbmNvbnN0IExBUkdFX0ZJTEVfUEFSVF9TSVpFID0gOCAqIDEwMjQgKiAxMDI0O1xuXG4vLyBXcmFwcyBhIGxvY2FsbHkgaG9zdGVkIGJ1Y2tldCBpbiB0aGUgSUFyY2hpdmVzIGludGVyZmFjZSwgc28gY29kZSB3cml0dGVuIGFnYWluc3QgSUFyY2hpdmVzICh0aGUgY2hhaW4sIHN5bmMgc291cmNlcywgaG9sZGVyIHJlYWRzKSB0YWxrcyB0byBpdCBkaXJlY3RseSBpbnN0ZWFkIG9mIGJlY29taW5nIGEgbmV0d29yayBjbGllbnQgdG8gb3Vyc2VsdmVzLlxuY2xhc3MgQnVja2V0SUFyY2hpdmVzV3JhcHBlciBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhY2NvdW50OiBzdHJpbmcsIHByaXZhdGUgYnVja2V0TmFtZTogc3RyaW5nLCBwcml2YXRlIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnKSB7IH1cblxuICAgIHByaXZhdGUgZmluZFN0b3JlKCk6IFByb21pc2U8TG9hZGVkU3RvcmU+IHtcbiAgICAgICAgcmV0dXJuIGZpbmRCdWNrZXRTdG9yZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgdGhpcy5zb3VyY2VDb25maWcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBgbG9jYWxCdWNrZXQgYWNjb3VudCAke3RoaXMuYWNjb3VudH0gYnVja2V0ICR7dGhpcy5idWNrZXROYW1lfSByb3V0ZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc291cmNlQ29uZmlnLnJvdXRlIHx8IEZVTExfUk9VVEUpfWA7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoZmlsZU5hbWUgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdldFJvdXRpbmdGaWxlUmVzdWx0KHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnPy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlYWRCdWNrZXRJbnRlcm5hbCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgeyBwYXRoOiBmaWxlTmFtZSwgcmFuZ2U6IGNvbmZpZy5yYW5nZSwgaW5jbHVkZVRvbWJzdG9uZXM6IGNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgKGF3YWl0IHRoaXMuZmluZFN0b3JlKCkpLnN0b3JlLmdldDIoeyBwYXRoOiBmaWxlTmFtZSwgLi4uY29uZmlnIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogU2V0Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBpZiAoZmlsZU5hbWUgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgYXdhaXQgcXVldWVSb3V0aW5nQ29uZmlnV3JpdGUodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGRhdGEsIGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgKGF3YWl0IHRoaXMuZmluZFN0b3JlKCkpLnN0b3JlLnNldCh7IC4uLmNvbmZpZywgcGF0aDogZmlsZU5hbWUsIGRhdGEgfSk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBEZWxDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBhd2FpdCAoYXdhaXQgdGhpcy5maW5kU3RvcmUoKSkuc3RvcmUuZGVsKHsgcGF0aDogZmlsZU5hbWUsIC4uLmNvbmZpZyB9KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IHN0b3JlID0gKGF3YWl0IHRoaXMuZmluZFN0b3JlKCkpLnN0b3JlO1xuICAgICAgICBsZXQgaWQgPSBhd2FpdCBzdG9yZS5zdGFydExhcmdlVXBsb2FkKHsgcGF0aDogY29uZmlnLnBhdGgsIGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGRhdGEubGVuZ3RoOyBvZmZzZXQgKz0gTEFSR0VfRklMRV9QQVJUX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3RvcmUuYXBwZW5kTGFyZ2VVcGxvYWQoeyBpZCwgZGF0YTogZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIExBUkdFX0ZJTEVfUEFSVF9TSVpFKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBzdG9yZS5maW5pc2hMYXJnZVVwbG9hZCh7IGlkLCBwYXRoOiBjb25maWcucGF0aCwgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhd2FpdCBzdG9yZS5jYW5jZWxMYXJnZVVwbG9hZCh7IGlkIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRJbmZvQ29uZmlnKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoZmlsZU5hbWUgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGdldFJvdXRpbmdGaWxlUmVzdWx0KHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgJiYgeyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH0gfHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCAoYXdhaXQgdGhpcy5maW5kU3RvcmUoKSkuc3RvcmUuZ2V0SW5mbyh7IHBhdGg6IGZpbGVOYW1lLCAuLi5jb25maWcgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogRmluZENvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IChhd2FpdCB0aGlzLmZpbmRTdG9yZSgpKS5zdG9yZS5maW5kSW5mbyh7IHByZWZpeCwgLi4uY29uZmlnIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogRmluZENvbmZpZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldFVSTChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIHJldHVybiBidWlsZEZpbGVVcmwoYGh0dHBzOi8vJHtkb21haW59OiR7cG9ydH0vZmlsZS8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmFjY291bnQpfS8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmJ1Y2tldE5hbWUpfWAsIGZpbGVQYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIHJldHVybiBnZXRCdWNrZXRDb25maWcoYXdhaXQgcmVxdWlyZUJ1Y2tldCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IChhd2FpdCB0aGlzLmZpbmRTdG9yZSgpKS5zdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXRTeW5jU3RhdHVzKGF3YWl0IHJlcXVpcmVCdWNrZXQodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUpKTtcbiAgICB9XG59XG5cbmNvbnN0IGxvY2FsQXJjaGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgSUFyY2hpdmVzPigpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsQXJjaGl2ZXMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnKTogSUFyY2hpdmVzIHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfXwke3N0YWJsZVN0cmluZ2lmeShzb3VyY2VDb25maWcpfWA7XG4gICAgbGV0IGV4aXN0aW5nID0gbG9jYWxBcmNoaXZlcy5nZXQoa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICBsZXQgYXJjaGl2ZXMgPSBuZXcgQnVja2V0SUFyY2hpdmVzV3JhcHBlcihhY2NvdW50LCBidWNrZXROYW1lLCBzb3VyY2VDb25maWcpO1xuICAgIGxvY2FsQXJjaGl2ZXMuc2V0KGtleSwgYXJjaGl2ZXMpO1xuICAgIHJldHVybiBhcmNoaXZlcztcbn1cbiJdfQ==
953
+ /* _JS_SOURCE_HASH = "dab61171b71c11af9b36c3fccb800e54160c632a865dd3a41a96121cf6bf6b5c"; */