@mnaoumov/obsidian-lib 8.1.0 → 9.0.0

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.
@@ -126,14 +126,14 @@ import {
126
126
  import {
127
127
  buildBacklinksSnapshot,
128
128
  editBacklinksSnapshot,
129
- extractLinkFile,
129
+ extractReferenceFile,
130
130
  updateLink,
131
- updateLinksInFile
131
+ updateReferencesInFile
132
132
  } from "../link.mjs";
133
133
  import {
134
134
  getBacklinksForFileOrPath,
135
135
  getBacklinksForFileSafe,
136
- getLinks,
136
+ getReferences,
137
137
  hasBacklinkCachePlugin,
138
138
  registerFileCacheForNonExistingFile,
139
139
  registerFiles
@@ -194,9 +194,9 @@ class DeleteHandler {
194
194
  const cache = this.deletedMetadataCacheMap.get(this.file.path);
195
195
  this.deletedMetadataCacheMap.delete(this.file.path);
196
196
  if (cache) {
197
- const links = getLinks({ cache });
197
+ const links = getReferences({ cache });
198
198
  for (const link of links) {
199
- const attachmentFile = extractLinkFile({ app: this.app, link, sourcePathOrFile: this.file.path });
199
+ const attachmentFile = extractReferenceFile({ app: this.app, reference: link, sourcePathOrFile: this.file.path });
200
200
  if (!attachmentFile || this.settingsManager.isNoteEx(attachmentFile.path)) {
201
201
  continue;
202
202
  }
@@ -677,7 +677,9 @@ class RenameHandler {
677
677
  await editBacklinksSnapshot(normalizeOptionalProperties({
678
678
  abortSignal: this.abortSignal,
679
679
  app: this.app,
680
- linkConverter: ({ link, payload: oldAttachmentPath, sourcePath: newBacklinkPath }) => {
680
+ linkUpdateProgressReporter: this.linkUpdateProgressReporter ?? void 0,
681
+ pluginNoticeComponent,
682
+ referenceConverter: ({ payload: oldAttachmentPath, reference: link, sourcePath: newBacklinkPath }) => {
681
683
  const linkIndex = (linkIndexes.get(newBacklinkPath) ?? 0) + 1;
682
684
  linkIndexes.set(newBacklinkPath, linkIndex);
683
685
  if (!oldAttachmentPath) {
@@ -691,24 +693,22 @@ class RenameHandler {
691
693
  renamedLinks.add(`${newBacklinkPath}//${String(linkIndex)}`);
692
694
  return updateLink(normalizeOptionalProperties({
693
695
  app: this.app,
694
- link,
695
696
  newSourcePathOrFile: newBacklinkPath,
696
697
  newTargetPathOrFile: newAttachmentPath,
697
698
  oldTargetPathOrFile: oldAttachmentPath,
699
+ reference: link,
698
700
  shouldUpdateFileNameAlias: settings.shouldUpdateFileNameAliases
699
701
  }));
700
702
  },
701
- linkUpdateProgressReporter: this.linkUpdateProgressReporter ?? void 0,
702
- pluginNoticeComponent,
703
703
  resourceLockComponent: this.resourceLockComponent,
704
704
  shouldFailOnMissingFile: false,
705
705
  // The converter logs every link it declines, so it has to be shown the ones the snapshot does not name.
706
- shouldVisitUnmatchedLinks: true,
706
+ shouldVisitUnmatchedReferences: true,
707
707
  snapshot: combinedBacklinksMap
708
708
  }));
709
709
  this.abortSignal.throwIfAborted();
710
710
  if (isNote(this.newPath)) {
711
- await updateLinksInFile(normalizeOptionalProperties({
711
+ await updateReferencesInFile(normalizeOptionalProperties({
712
712
  app: this.app,
713
713
  newSourcePathOrFile: this.newPath,
714
714
  oldSourcePathOrFile: this.oldPath,
@@ -851,7 +851,7 @@ class RenameMap {
851
851
  this.oldCache = params.oldCache;
852
852
  this.oldPath = params.oldPath;
853
853
  this.newPath = params.newPath;
854
- this.oldPathLinks = this.oldCache ? getLinks({ cache: this.oldCache }) : [];
854
+ this.oldPathLinks = this.oldCache ? getReferences({ cache: this.oldCache }) : [];
855
855
  }
856
856
  entries() {
857
857
  return this.map.entries();
@@ -894,7 +894,7 @@ class RenameMap {
894
894
  } else {
895
895
  for (const oldPathLink of this.oldPathLinks) {
896
896
  this.abortSignal.throwIfAborted();
897
- const oldAttachmentFile = extractLinkFile({ app: this.app, link: oldPathLink, sourcePathOrFile: this.oldPath });
897
+ const oldAttachmentFile = extractReferenceFile({ app: this.app, reference: oldPathLink, sourcePathOrFile: this.oldPath });
898
898
  if (!oldAttachmentFile || !isOldAttachmentFolderAtRoot && !oldAttachmentFile.path.startsWith(oldAttachmentFolderPath)) {
899
899
  continue;
900
900
  }
@@ -959,15 +959,15 @@ class RenameMap {
959
959
  } = params;
960
960
  buildBacklinksSnapshot({
961
961
  backlinks: singleBacklinksMap,
962
- linkIdentityKeyProvider: getLinkIdentityKey,
963
962
  pathRemapper: (backlinkPath) => this.map.get(backlinkPath) ?? backlinkPath,
964
963
  payloadProvider: () => path,
964
+ referenceIdentityKeyProvider: getReferenceIdentityKey,
965
965
  target: combinedBacklinksMap
966
966
  });
967
967
  }
968
968
  initOriginalLinksMap(combinedBacklinksMap) {
969
969
  for (const oldPathLink of this.oldPathLinks) {
970
- const oldAttachmentFile = extractLinkFile({ app: this.app, link: oldPathLink, sourcePathOrFile: this.oldPath });
970
+ const oldAttachmentFile = extractReferenceFile({ app: this.app, reference: oldPathLink, sourcePathOrFile: this.oldPath });
971
971
  if (!oldAttachmentFile) {
972
972
  continue;
973
973
  }
@@ -1214,7 +1214,7 @@ async function didRescueStillUsedAttachment(params) {
1214
1214
  return false;
1215
1215
  }
1216
1216
  }
1217
- function getLinkIdentityKey(link) {
1217
+ function getReferenceIdentityKey(link) {
1218
1218
  return toJson({
1219
1219
  link: link.link,
1220
1220
  original: link.original
@@ -1224,4 +1224,4 @@ export {
1224
1224
  EmptyFolderBehavior2 as EmptyFolderBehavior,
1225
1225
  RenameDeleteHandlerComponent
1226
1226
  };
1227
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3JlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FycmF5JztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIH0gZnJvbSAnLi4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXMsXG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQgdHlwZSB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgd2FpdEZvclBlbmRpbmdMaW5rVXBkYXRlcyB9IGZyb20gJy4uL2ZpbGUtbWFuYWdlci50cyc7XG5pbXBvcnQge1xuICBDQU5WQVNfRklMRV9FWFRFTlNJT04sXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc0ZpbGUsXG4gIGlzRm9sZGVyLFxuICBpc01hcmtkb3duRmlsZSxcbiAgaXNOb3RlXG59IGZyb20gJy4uL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGJ1aWxkQmFja2xpbmtzU25hcHNob3QsXG4gIGVkaXRCYWNrbGlua3NTbmFwc2hvdCxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRMaW5rcyxcbiAgaGFzQmFja2xpbmtDYWNoZVBsdWdpbixcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUsXG4gIHJlZ2lzdGVyRmlsZXNcbn0gZnJvbSAnLi4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhZGRUb1F1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yIH0gZnJvbSAnLi4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgeyBkZWxldGVJZk5vdFVzZWQgfSBmcm9tICcuLi92YXVsdC1kZWxldGUudHMnO1xuaW1wb3J0IHtcbiAgY2xlYW51cEVtcHR5Rm9sZGVycyxcbiAgRW1wdHlGb2xkZXJCZWhhdmlvcixcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIGlzQ2hpbGRPclNlbGYsXG4gIHJlbmFtZVNhZmUsXG4gIHRyYXNoU2FmZVxufSBmcm9tICcuLi92YXVsdC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGhhc1BhdGNoVG9rZW4sXG4gIE1vbmtleUFyb3VuZENvbXBvbmVudFxufSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlc2N1ZVBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQgdGhhdCBpcyBhYm91dCB0byBiZSBzdHJhbmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGFjaG1lbnRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgdGhhdCBzdGlsbCByZWZlcmVuY2UgdGhlIGF0dGFjaG1lbnQgb25jZSB0aGUgZGVsZXRpb24gaXMgZG9uZS4gTmV2ZXIgZW1wdHkuXG4gICAqL1xuICByZWFkb25seSBzdXJ2aXZpbmdOb3RlUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW1wdHlGb2xkZXJCZWhhdmlvcjogRW1wdHlGb2xkZXJCZWhhdmlvcjtcblxuICAvKipcbiAgICogV2hlcmUgdG8gbW92ZSBhbiBhdHRhY2htZW50IHRoYXQgYSBkZWxldGlvbiB3b3VsZCBvdGhlcndpc2Ugc3RyYW5kIOKAlCBvbmUgdGhhdCBzdXJ2aXZlcyBiZWNhdXNlIGFub3RoZXJcbiAgICogbm90ZSBzdGlsbCByZWZlcmVuY2VzIGl0LCBidXQgaXMgbGVmdCBzaXR0aW5nIGluIGEgZm9sZGVyIHdob3NlIG93bmluZyBub3RlIGlzIGdvbmUuXG4gICAqXG4gICAqIERlY2lkaW5nIHRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgcGx1Z2luJ3MgYXR0YWNobWVudC1wYXRoIHBvbGljeSwgd2hpY2ggaXMgd2h5IHRoZSBoYW5kbGVyIGFza3MgcmF0aGVyXG4gICAqIHRoYW4gZ3Vlc3Nlcy4gUmV0dXJuaW5nIGBudWxsYCDigJQgb3Igbm90IGltcGxlbWVudGluZyB0aGlzIGF0IGFsbCDigJQga2VlcHMgdGhlIGF0dGFjaG1lbnQgd2hlcmUgaXQgaXMsXG4gICAqIHdoaWNoIGlzIHRoZSBiZWhhdmlvciBldmVyeSBjb25zdW1lciBoYWQgYmVmb3JlIHRoaXMgbWVtYmVyIGV4aXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBnZXRSZXNjdWVQYXRoPzogKHBhcmFtczogR2V0UmVzY3VlUGF0aFBhcmFtcykgPT4gUHJvbWlzZTxudWxsIHwgc3RyaW5nPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGF0aCBpcyBhIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBpc05vdGU6IChwYXRoOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaWdub3JlIHRoZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQYXRoSWdub3JlZDogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgY29uZmxpY3RpbmcgYXR0YWNobWVudHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSBkZWxldGlvbnMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVEZWxldGlvbnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIHJlbmFtZXMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIYW5kbGVSZW5hbWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZpbGVzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZm9sZGVyIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlZFJlbmFtZUtleSB7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICByZWFkb25seSBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcD86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tYmluZWQgYmFja2xpbmtzIG1hcCwga2V5ZWQgYnkgbmV3IGJhY2tsaW5rIHBhdGgsIGFjY3VtdWxhdGluZyBsaW5rLUpTT04gdG8gc291cmNlLXBhdGggbWFwcGluZ3MuXG4gICAqL1xuICByZWFkb25seSBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdob3NlIGJhY2tsaW5rcyBhcmUgYmVpbmcgcmVjb3JkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBiYWNrbGlua3MgbWFwIGZvciBhIHNpbmdsZSBmaWxlLCBrZXllZCBieSBiYWNrbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG59XG5cbmNvbnN0IFBBVENIX1RPS0VOID0gU3ltYm9sLmZvcigncmVuYW1lRGVsZXRlSGFuZGxlcicpO1xuXG5pbnRlcmZhY2UgRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudFBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBmaWxlTWFuYWdlcjogRmlsZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xufVxuXG5jbGFzcyBEZWxldGVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERlbGV0ZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYEhhbmRsZSBEZWxldGUgJHt0aGlzLmZpbGUucGF0aH1gKTtcbiAgICBpZiAoIWlzTm90ZSh0aGlzLmZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShcbiAgICAgICAgYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBmaWxlIHN0aWxsIGV4aXN0cyBvbiBkaXNrIChpbmRleC1vbmx5IHJlbW92YWwsIG5vdCBhIHJlYWwgZGVsZXRpb24pLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oW2Rpcm5hbWUodGhpcy5maWxlLnBhdGgpXSk7XG5cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZ2V0KHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjb25zdCBsaW5rcyA9IGdldExpbmtzKHsgY2FjaGUgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aCB9KTtcbiAgICAgICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlIHx8IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KGF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoYXR0YWNobWVudEZpbGUucGFyZW50Py5wYXRoID8/ICcnKTtcbiAgICAgICAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQoe1xuICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgIGRlbGV0ZWROb3RlUGF0aDogdGhpcy5maWxlLnBhdGgsXG4gICAgICAgICAgICBwYXRoT3JGaWxlOiBhdHRhY2htZW50RmlsZSxcbiAgICAgICAgICAgIHJlc2N1ZVN0aWxsVXNlZEZpbGU6IHRoaXMucmVzY3VlU3RpbGxVc2VkRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJlbnRGb2xkZXJQYXRocy5kZWxldGUoJycpO1xuICAgIGF3YWl0IGNsZWFudXBFbXB0eUZvbGRlcnMoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgZm9sZGVyUGF0aHM6IFsuLi5wYXJlbnRGb2xkZXJQYXRoc11cbiAgICB9KTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5EZWxldGVOb3RlLFxuICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMuZmlsZS5wYXRoXG4gICAgfSk7XG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZvbGRlcjogYXR0YWNobWVudEZvbGRlclBhdGggfSk7XG5cbiAgICBpZiAoXG4gICAgICAhYXR0YWNobWVudEZvbGRlciB8fCAhYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcih7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5EZWxldGVOb3RlLFxuICAgICAgICBwYXRoOiB0aGlzLmZpbGUucGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGRlbGV0ZWROb3RlUGF0aDogdGhpcy5maWxlLnBhdGgsXG4gICAgICBwYXRoT3JGaWxlOiBhdHRhY2htZW50Rm9sZGVyLFxuICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzY3VlU3RpbGxVc2VkRmlsZShyZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc2N1ZVBhcmFtcyxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEtlZXBzIGEgZm9sZGVyIGRlbGV0aW9uIGZyb20gZGVzdHJveWluZyBhbiBhdHRhY2htZW50IGEgbm90ZSBvdXRzaWRlIHRoYXQgZm9sZGVyIHN0aWxsIHJlZmVyZW5jZXMuXG4gKlxuICogRGVsZXRpbmcgYSBOT1RFIGlzIGFscmVhZHkgc2FmZToge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH0gZGlzY291bnRzIHRoZSBkZWxldGVkIG5vdGUncyBvd24gYmFja2xpbmtzLCBzZWVzXG4gKiBhbm90aGVyIG5vdGUgc3RpbGwgcmVmZXJlbmNpbmcgdGhlIGF0dGFjaG1lbnQsIGFuZCBrZWVwcyBpdC4gRGVsZXRpbmcgYSBGT0xERVIgd2FzIG5vdCwgYmVjYXVzZVxuICoge0BsaW5rIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnR9IG9ubHkgbGlzdGVucyAoYHZhdWx0Lm9uKCdkZWxldGUnKWApIGFuZCBieSB0aGUgdGltZSBhIGZvbGRlciBkZWxldGlvblxuICogaXMgcmVwb3J0ZWQgaXRzIGNoaWxkcmVuIGFyZSBhbHJlYWR5IGdvbmUuIE5vdGhpbmcgcmVhY3RpdmUgY2FuIGhlbHAsIHNvIHRoaXMgY29tcG9uZW50IGludGVyY2VwdHMgdGhlXG4gKiBkZWxldGlvbiBwcmltaXRpdmVzIGluc3RlYWQ6IGBGaWxlTWFuYWdlci50cmFzaEZpbGVgICh3aGF0IHRoZSBmaWxlLWV4cGxvcmVyIERlbGV0ZSBmbG93IHJlYWNoZXMgdGhyb3VnaFxuICogYHByb21wdEZvckRlbGV0aW9uYCkgcGx1cyB0aGUgcmF3IGBWYXVsdC5kZWxldGVgIC8gYFZhdWx0LnRyYXNoYCBhIHBsdWdpbiBtYXkgY2FsbCBkaXJlY3RseS5cbiAqXG4gKiBBIGZvbGRlciBkZWxldGlvbiBpcyBzY2FubmVkIGZpcnN0LiBXaGVuIG5vdGhpbmcgaW5zaWRlIGl0IGlzIHN0aWxsIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlIOKAlCB0aGVcbiAqIG92ZXJ3aGVsbWluZyBtYWpvcml0eSBvZiBkZWxldGlvbnMg4oCUIHRoZSBvcmlnaW5hbCBydW5zIHVudG91Y2hlZCwgc28gdGhlIG5hdGl2ZSBiZWhhdmlvciBpcyBwcmVzZXJ2ZWRcbiAqIGV4YWN0bHkuIE9ubHkgd2hlbiBzb21ldGhpbmcgd291bGQgYmUgbG9zdCBkb2VzIHRoaXMgdGFrZSBvdmVyLCByZXBsYXlpbmcgdGhlIGRlbGV0aW9uIHRocm91Z2hcbiAqIHtAbGluayBkZWxldGVJZk5vdFVzZWR9OiBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIGZvbGRlciBnb2VzLCB0aGUgc3RpbGwtcmVmZXJlbmNlZCBhdHRhY2htZW50cyBhbmQgdGhlXG4gKiBmb2xkZXJzIGhvbGRpbmcgdGhlbSBzdGF5LCBhbmQgdGhlIGBhdHRhY2htZW50SXNTdGlsbFVzZWRgIG5vdGljZSBmaXJlcywgbWlycm9yaW5nIHRoZSBub3RlIGNhc2UuXG4gKlxuICogRmlsZXMgYXJlIG5ldmVyIGludGVyY2VwdGVkIOKAlCBkZWxldGluZyBhIGZpbGUgaXMgdGhlIHVzZXIgbmFtaW5nIHRoYXQgZmlsZSBleHBsaWNpdGx5LlxuICovXG5jbGFzcyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSb290cyBvZiB0aGUgZm9sZGVyIGRlbGV0aW9ucyBjdXJyZW50bHkgYmVpbmcgcmVwbGF5ZWQuIFRoZSByZXBsYXkgZGVsZXRlcyB0aHJvdWdoIHRoZSBVTlBBVENIRURcbiAgICogb3JpZ2luYWwsIHNvIGl0IGNhbm5vdCByZS1lbnRlciB0aGlzIGNvbXBvbmVudCBkaXJlY3RseSDigJQgYnV0IGBGaWxlTWFuYWdlci50cmFzaEZpbGVgIGl0c2VsZiBjYWxscyBkb3duXG4gICAqIGludG8gYFZhdWx0LnRyYXNoYCAvIGBWYXVsdC5kZWxldGVgLCB3aGljaCBhcmUgcGF0Y2hlZCB0b28sIGFuZCByZS1zY2FubmluZyBhIHN1YnRyZWUgYWxyZWFkeSBiZWluZ1xuICAgKiB3YWxrZWQgaXMgcHVyZSB3YXN0ZS4gU2NvcGVkIGJ5IHBhdGggcmF0aGVyIHRoYW4gYnkgYSBmbGFnIHNvIHRoYXQgYW4gdW5yZWxhdGVkIGZvbGRlciBkZWxldGlvblxuICAgKiBpbnRlcmxlYXZpbmcgb24gYW4gYGF3YWl0YCBpcyBzdGlsbCBwcm90ZWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcGxheWVkRm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEZpbGVNYW5hZ2VyLCAndHJhc2hGaWxlJz4oe1xuICAgICAgJG9iamVjdDogRmlsZU1hbmFnZXIucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoRmlsZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnZGVsZXRlJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2RlbGV0ZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGUsIGZvcmNlXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUsIGZvcmNlKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICd0cmFzaCc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaCcsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGUsIHN5c3RlbV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlLCBzeXN0ZW0pO1xuICAgICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3RzIHRoZSBwYXRocyBvZiBldmVyeSBub3RlIGluc2lkZSB0aGUgZm9sZGVyLiBUaGV5IGFyZSB0aGUgbGluayBzb3VyY2VzIHRoYXQgZGlzYXBwZWFyIGFsb25nIHdpdGhcbiAgICogdGhlIGZvbGRlciwgc28gdGhlaXIgYmFja2xpbmtzIG11c3Qgbm90IGtlZXAgYW4gYXR0YWNobWVudCBhbGl2ZS5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aHMgb2YgdGhlIG5vdGVzIGluc2lkZSB0aGUgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBjb2xsZWN0RGVsZXRlZE5vdGVQYXRocyhmb2xkZXI6IFRGb2xkZXIsIHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4pOiBTZXQ8c3RyaW5nPiB7XG4gICAgY29uc3QgZGVsZXRlZE5vdGVQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihmb2xkZXIsIChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGlzRmlsZShjaGlsZCkgJiYgKHNldHRpbmdzLmlzTm90ZT8uKGNoaWxkLnBhdGgpID8/IGZhbHNlKSkge1xuICAgICAgICBkZWxldGVkTm90ZVBhdGhzLmFkZChjaGlsZC5wYXRoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGVsZXRlZE5vdGVQYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgYXR0YWNobWVudHMgaW5zaWRlIHRoZSBmb2xkZXIgdGhhdCBhIG5vdGUgb3V0c2lkZSBpdCBzdGlsbCByZWZlcmVuY2VzLCBhbmQgd291bGQgdGhlcmVmb3JlIGJlXG4gICAqIGRlc3Ryb3llZCBieSBkZWxldGluZyB0aGUgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZGVsZXRlZE5vdGVQYXRocyAtIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgdGhhdCBkaXNhcHBlYXIgYWxvbmcgd2l0aCB0aGUgZm9sZGVyLlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgYXR0YWNobWVudHMgdGhhdCBtdXN0IHN1cnZpdmUgdGhlIGRlbGV0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kU3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKFxuICAgIGZvbGRlcjogVEZvbGRlcixcbiAgICBkZWxldGVkTm90ZVBhdGhzOiBTZXQ8c3RyaW5nPixcbiAgICBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+XG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBjYW5kaWRhdGVGaWxlczogVEZpbGVbXSA9IFtdO1xuICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihmb2xkZXIsIChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGlzRmlsZShjaGlsZCkgJiYgIShzZXR0aW5ncy5pc05vdGU/LihjaGlsZC5wYXRoKSA/PyBmYWxzZSkpIHtcbiAgICAgICAgY2FuZGlkYXRlRmlsZXMucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZUZpbGUgb2YgY2FuZGlkYXRlRmlsZXMpIHtcbiAgICAgIGNvbnN0IGJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogY2FuZGlkYXRlRmlsZSB9KTtcbiAgICAgIGZvciAoY29uc3QgZGVsZXRlZE5vdGVQYXRoIG9mIGRlbGV0ZWROb3RlUGF0aHMpIHtcbiAgICAgICAgYmFja2xpbmtzLmNsZWFyKGRlbGV0ZWROb3RlUGF0aCk7XG4gICAgICB9XG4gICAgICBpZiAoYmFja2xpbmtzLmNvdW50KCkgIT09IDApIHtcbiAgICAgICAgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzLnB1c2goY2FuZGlkYXRlRmlsZS5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBhIGRlbGV0aW9uIG5lZWRzIHByb3RlY3RpbmcgYW5kLCBpZiBzbywgcmVwbGFjZXMgaXQgd2l0aCBhIHByb3RlY3RlZCByZXBsYXkuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gSW52b2tlcyB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIGRlbGV0ZUFic3RyYWN0RmlsZSAtIERlbGV0ZXMgYSBzaW5nbGUgYWJzdHJhY3QgZmlsZSB0aHJvdWdoIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QncyB1bnBhdGNoZWQgb3JpZ2luYWwuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVsZXRpb24gaXMgZG9uZS5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRpb24oXG4gICAgZmlsZTogVEFic3RyYWN0RmlsZSxcbiAgICBmYWxsYmFjazogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBkZWxldGVBYnN0cmFjdEZpbGU6IChhYnN0cmFjdEZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IFByb21pc2U8dm9pZD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvdWxkQ29uc2lkZXJGb2xkZXIoZmlsZSkgPyB0aGlzLnJlcGxheUZvbGRlckRlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBkZWxldGVBYnN0cmFjdEZpbGUpIDogZmFsbGJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSBmb2xkZXIgd2hpbGUga2VlcGluZyB3aGF0ZXZlciBpbnNpZGUgaXQgaXMgc3RpbGwgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBmYWxsYmFjayAtIEludm9rZXMgdGhlIGludGVyY2VwdGVkIG1ldGhvZCB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSBkZWxldGVBYnN0cmFjdEZpbGUgLSBEZWxldGVzIGEgc2luZ2xlIGFic3RyYWN0IGZpbGUgdGhyb3VnaCB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kJ3MgdW5wYXRjaGVkIG9yaWdpbmFsLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRlbGV0aW9uIGlzIGRvbmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlcGxheUZvbGRlckRlbGV0aW9uKFxuICAgIGZvbGRlcjogVEZvbGRlcixcbiAgICBmYWxsYmFjazogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBkZWxldGVBYnN0cmFjdEZpbGU6IChhYnN0cmFjdEZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IFByb21pc2U8dm9pZD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGNvbnN0IGRlbGV0ZWROb3RlUGF0aHMgPSB0aGlzLmNvbGxlY3REZWxldGVkTm90ZVBhdGhzKGZvbGRlciwgc2V0dGluZ3MpO1xuICAgIGNvbnN0IHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyA9IGF3YWl0IHRoaXMuZmluZFN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyhmb2xkZXIsIGRlbGV0ZWROb3RlUGF0aHMsIHNldHRpbmdzKTtcblxuICAgIGlmIChzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRlbGV0ZVByb3RlY3Rpb24nKShgTm90aGluZyB0byBwcm90ZWN0IGluICR7Zm9sZGVyLnBhdGh9OyBkZWxldGluZyBpdCBhcyB1c3VhbC5gKTtcbiAgICAgIGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkZWxldGVQcm90ZWN0aW9uJykoXG4gICAgICBgUHJvdGVjdGluZyAke3N0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5sZW5ndGgudG9TdHJpbmcoKX0gc3RpbGwtcmVmZXJlbmNlZCBhdHRhY2htZW50KHMpIGZyb20gdGhlIGRlbGV0aW9uIG9mICR7Zm9sZGVyLnBhdGh9OiAke3RvSnNvbihzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMpfWBcbiAgICApO1xuXG4gICAgdGhpcy5yZXBsYXllZEZvbGRlclBhdGhzLmFkZChmb2xkZXIucGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGRlbGV0ZUFic3RyYWN0RmlsZSxcbiAgICAgICAgZGVsZXRlZE5vdGVQYXRoczogWy4uLmRlbGV0ZWROb3RlUGF0aHNdLFxuICAgICAgICBwYXRoT3JGaWxlOiBmb2xkZXIsXG4gICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHJlc2N1ZVN0aWxsVXNlZEZpbGU6IHRoaXMucmVzY3VlU3RpbGxVc2VkRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgICAvKlxuICAgICAgICAgKiBUaGUgdXNlciBuYW1lZCBUSElTIGZvbGRlciwgc28gaXQgZ29lcyBldmVuIHVuZGVyIGBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBgIOKAlCB0aGF0IHNldHRpbmdcbiAgICAgICAgICogZ292ZXJucyBmb2xkZXJzIGVtcHRpZWQgaW5jaWRlbnRhbGx5LCBub3QgdGhlIG9uZSBleHBsaWNpdGx5IGRlbGV0ZWQuIGBkZWxldGVJZk5vdFVzZWRgIHN0aWxsXG4gICAgICAgICAqIHJlZnVzZXMgdG8gcmVtb3ZlIGFueSBmb2xkZXIgd2hvc2UgY2hpbGQgaGFkIHRvIGJlIGtlcHQsIHdoaWNoIGlzIHRoZSBwcm90ZWN0aW9uIHdhbnRlZCBoZXJlLlxuICAgICAgICAgKi9cbiAgICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiB0cnVlLFxuICAgICAgICAvKlxuICAgICAgICAgKiBBIG5vdGUgdGhhdCBvdGhlcnMgbGluayB0byBpcyBkZWxldGVkIGFzIG5vcm1hbDsgT2JzaWRpYW4gbGVhdmVzIHRoZSBkYW5nbGluZyBsaW5rLiBQcm90ZWN0aW5nXG4gICAgICAgICAqIG5vdGVzIHRvbyB3b3VsZCBtYWtlIGRlbGV0aW5nIGEgZm9sZGVyIG9mIGxpbmtlZC10byBub3RlcyBpbXBvc3NpYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgc2hvdWxkUHJvdGVjdElmU3RpbGxVc2VkOiAoY2FuZGlkYXRlRmlsZSkgPT4gIShzZXR0aW5ncy5pc05vdGU/LihjYW5kaWRhdGVGaWxlLnBhdGgpID8/IGZhbHNlKVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucmVwbGF5ZWRGb2xkZXJQYXRocy5kZWxldGUoZm9sZGVyLnBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzY3VlU3RpbGxVc2VkRmlsZShyZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc2N1ZVBhcmFtcyxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGRlbGV0aW9uIGlzIGEgZm9sZGVyIGRlbGV0aW9uIHRoaXMgaGFuZGxlciBpcyByZXNwb25zaWJsZSBmb3IgcHJvdGVjdGluZy5cbiAgICpcbiAgICogRXZlcnkgY2hlY2sgaGVyZSBpcyBzeW5jaHJvbm91cyBhbmQgY2hlYXAsIHNvIGEgZmlsZSBkZWxldGlvbiDigJQgdGhlIG92ZXJ3aGVsbWluZyBtYWpvcml0eSDigJQgY29zdHMgb25lXG4gICAqIHtAbGluayBpc0ZvbGRlcn0gY2FsbCBhbmQgcmVhY2hlcyB0aGUgb3JpZ2luYWwgdW50b3VjaGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBkZWxldGlvbiBzaG91bGQgYmUgc2Nhbm5lZCBiZWZvcmUgaXQgcnVucy5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkQ29uc2lkZXJGb2xkZXIoZmlsZTogVEFic3RyYWN0RmlsZSk6IGZpbGUgaXMgVEZvbGRlciB7XG4gICAgaWYgKCFpc0ZvbGRlcihmaWxlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyB8fCAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGZpbGUucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZXBsYXllZEZvbGRlclBhdGggb2YgdGhpcy5yZXBsYXllZEZvbGRlclBhdGhzKSB7XG4gICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcDogdGhpcy5hcHAsIGNoaWxkUGF0aE9yRmlsZTogZmlsZS5wYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiByZXBsYXllZEZvbGRlclBhdGggfSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmNsYXNzIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGVNYW5hZ2VyID0gcGFyYW1zLmZpbGVNYW5hZ2VyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IHRoaXMuZmlsZU1hbmFnZXIsXG4gICAgICBtZXRob2ROYW1lOiAncnVuQXN5bmNMaW5rVXBkYXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHtcbiAgICAgICAgZmFsbGJhY2ssXG4gICAgICAgIG9yaWdpbmFsQXJndW1lbnRzOiBbbGlua1VwZGF0ZXNIYW5kbGVyXSxcbiAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kQm91bmRcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKGhhc1BhdGNoVG9rZW4ob3JpZ2luYWxNZXRob2QsIFBBVENIX1RPS0VOKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyID0gKGxpbmtVcGRhdGVzKSA9PiB0aGlzLndyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMsIGxpbmtVcGRhdGVzSGFuZGxlcik7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZEJvdW5kKG5ld0hhbmRsZXIpO1xuICAgICAgfSxcbiAgICAgIC8qXG4gICAgICAgKiBTdXBwcmVzc2luZyBPYnNpZGlhbidzIG93biBsaW5rIHVwZGF0ZXMgaXMgTk9UIGlkZW1wb3RlbnQsIHNvIHR3byBsaXZlIGNvcGllcyBvZiB0aGlzIGNvbXBvbmVudFxuICAgICAgICogd291bGQgZmlnaHQgb3ZlciB0aGUgc2FtZSBtZXRob2QuIGBQQVRDSF9UT0tFTmAgaXMgYSBgU3ltYm9sLmZvcmAgYW5kIHRoZSB0b2tlbiByZWdpc3RyeSBpc1xuICAgICAgICogYGdldE9ic2lkaWFuTGliU3RhdGVgLWJhY2tlZCwgc28gdGhlIGFyYml0cmF0aW9uIHNwYW5zIGluZGVwZW5kZW50bHkgYnVuZGxlZCBjb3BpZXMgb2YgdGhpc1xuICAgICAgICogbGlicmFyeTogdGhlIGZpcnN0IHBhdGNoZXIgc3RheXMgbGl2ZSwgYSBjb3B5IHRoYXQgcGF0Y2hlcyBhZnRlcndhcmRzIHNlZXMgdGhlIHRva2VuIG9uIGl0cyBvd25cbiAgICAgICAqIGBvcmlnaW5hbE1ldGhvZGAgYW5kIGRlZmVycyB2aWEgdGhlIGd1YXJkIGFib3ZlLCBhbmQgaXQgdGFrZXMgb3ZlciBvbiBpdHMgbmV4dCBjYWxsIG9uY2UgdGhlXG4gICAgICAgKiBsZWFkZXIgdW5sb2FkcyBhbmQgdGhlIHRva2VuIGlzIGRyb3BwZWQuXG4gICAgICAgKlxuICAgICAgICogVGhpcyBhcmJpdHJhdGVzIHRoZSBQQVRDSCBvbmx5LiBUaGUgY29tcG9uZW50J3MgYHZhdWx0Lm9uKCdyZW5hbWUnIHwgJ2RlbGV0ZScpYCBhbmRcbiAgICAgICAqIGBtZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJylgIGxpc3RlbmVycyBoYXZlIG5vIGVxdWl2YWxlbnQgZ3VhcmQg4oCUIHRoZSBwbHVnaW4tcmVnaXN0cnkgZWxlY3Rpb25cbiAgICAgICAqIHRoYXQgdXNlZCB0byBwcm92aWRlIG9uZSB3ZW50IHdpdGggdGhlIG11bHRpLXBsdWdpbiBtYWNoaW5lcnkg4oCUIHNvIHR3byBsaXZlIGNvcGllcyB3b3VsZCBib3RoXG4gICAgICAgKiBoYW5kbGUgYW4gZXZlbnQuIFdpdGggb25lIG93bmVyIHRoYXQgY2Fubm90IGFyaXNlOyBhIGNvbnN1bWVyIHRoYXQgbXVzdCBndWFyYW50ZWUgaXQgcmVmdXNlcyB0b1xuICAgICAgICogbG9hZCBiZXNpZGUgYSBjb25mbGljdGluZyB2ZXJzaW9uLlxuICAgICAgICpcbiAgICAgICAqIFRoYXQgcmVmdXNhbCB1c2VkIHRvIGJlIGRlc2NyaWJlZCBoZXJlIGFzIFwiYSBwbHVnaW4ncyBqb2IgcmF0aGVyIHRoYW4gYSBsaWJyYXJ5J3NcIiwgd2hpY2ggaXMgbm9cbiAgICAgICAqIGxvbmdlciB0cnVlIOKAlCBgUGx1Z2luQmFzZS5nZXRQbHVnaW5EZXBlbmRlbmNpZXNgIGlzIHdoZXJlIGEgY29uc3VtZXIgZGVjbGFyZXMgaXQsIGFuZCB0aGVcbiAgICAgICAqIGBhcGlWZXJzaW9uUmFuZ2VgIGl0IG5hbWVzIGlzIGV4YWN0bHkgdGhlIGNvbmZsaWN0aW5nLXZlcnNpb24gZ3VhcmQuIFRoZSBsaWJyYXJ5IG93bnMgdGhlXG4gICAgICAgKiBtZWNoYW5pc207IHRoZSBwbHVnaW4gc3RpbGwgb3ducyB0aGUgZGVjaXNpb24gdG8gdXNlIGl0LlxuICAgICAgICovXG4gICAgICBwYXRjaFRva2VuOiBQQVRDSF9UT0tFTlxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cmFwTGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzOiBMaW5rVXBkYXRlW10sIGxpbmtVcGRhdGVzSGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGlzUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgbGV0IGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gdGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgICAvKlxuICAgICAgICogQSByZW5hbWUgcGVyZm9ybWVkIGluc2lkZSBhIGZvcmVpZ24gcGx1Z2luJ3MgaW4tZmxpZ2h0IGxvY2tlZCB0cmFuc2FjdGlvbiAod2hpY2ggbG9ja3MgdGhlXG4gICAgICAgKiBhZmZlY3RlZCBmb2xkZXIgc3VidHJlZSwgZS5nLiBgQWR2YW5jZWQgTm90ZSBDb21wb3NlcmAncyBmb2xkZXIgbWVyZ2UpIGlzIG93bmVkIGJ5IHRoYXRcbiAgICAgICAqIHRyYW5zYWN0aW9uLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBsaW5rIGNvbnNpc3RlbmN5LiBUaGlzIGhhbmRsZXIgZGVsaWJlcmF0ZWx5IGRvZXNcbiAgICAgICAqIE5PVCByZXdyaXRlIGxpbmtzIGZvciBpdCwgc28gc3VwcHJlc3NpbmcgT2JzaWRpYW4ncyBuYXRpdmUgbGluayB1cGRhdGUgYmVsb3cgd291bGQgbGVhdmUgdGhlXG4gICAgICAgKiBsaW5rcyBkYW5nbGluZy4gTGV0IHRoZSBuYXRpdmUgdXBkYXRlIHByb2NlZWQgdW50b3VjaGVkLiBTZWVcbiAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1hZHZhbmNlZC1ub3RlLWNvbXBvc2VyL2lzc3Vlcy8xNDYuXG4gICAgICAgKi9cbiAgICAgIGlmIChpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIGZpbGUucGF0aCkgfHwgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBvbGRQYXRoKSkge1xuICAgICAgICBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgbWlnaHQgY2hhbmdlZCBpbiBgcmVuYW1lYCBldmVudCBoYW5kbGVyLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gICAgaWYgKCFpc1JlbmFtZUNhbGxlZCB8fCAhc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fCBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKFxuICAgICAgbGlua1VwZGF0ZXMsXG4gICAgICAobGlua1VwZGF0ZSkgPT4ge1xuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6cnVuQXN5bmNMaW5rVXBkYXRlJykoXG4gICAgICAgICAgICBgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2Ygc291cmNlIGZpbGUgJHtsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHJlc29sdmVkIGZpbGUgJHtsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSAhPT0gbnVsbCAmJiAhaGFzQmFja2xpbmtDYWNoZVBsdWdpbih0aGlzLmFwcClcbiAgICAgICAgICAmJiAobGlua1VwZGF0ZS5zb3VyY2VGaWxlLmV4dGVuc2lvbiA9PT0gQ0FOVkFTX0ZJTEVfRVhURU5TSU9OIHx8IGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLmV4dGVuc2lvbiA9PT0gQ0FOVkFTX0ZJTEVfRVhURU5TSU9OKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmNsYXNzIEhhbmRsZWRSZW5hbWVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgSGFuZGxlZFJlbmFtZUtleT4oKTtcblxuICBwdWJsaWMgYWRkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCksIHsgbmV3UGF0aCwgb2xkUGF0aCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5kZWxldGUodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMgaGFzKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmhhcyh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SGFuZGxlZFJlbmFtZUtleT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC52YWx1ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUga2V5VG9TdHJpbmcob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YDtcbiAgfVxufVxuXG5jbGFzcyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBwYXJhbXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA7XG4gICAgdGhpcy5maWxlID0gcGFyYW1zLmZpbGU7XG4gICAgdGhpcy5wcmV2aW91c0NhY2hlID0gcGFyYW1zLnByZXZpb3VzQ2FjaGU7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZU1ldGFkYXRhRGVsZXRlZCcpKGBTa2lwcGluZyBtZXRhZGF0YSBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc01hcmtkb3duRmlsZSh0aGlzLmZpbGUpICYmIHRoaXMucHJldmlvdXNDYWNoZSkge1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQodGhpcy5maWxlLnBhdGgsIHRoaXMucHJldmlvdXNDYWNoZSk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJlbmFtZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lczogSGFuZGxlZFJlbmFtZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzID0gcGFyYW1zLmhhbmRsZWRSZW5hbWVzO1xuICAgIHRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwID8/IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gcGFyYW1zLmludGVycnVwdGVkUmVuYW1lc01hcDtcbiAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID0gcGFyYW1zLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwID0gcGFyYW1zLm9sZFBhdGhCYWNrbGlua3NNYXA7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub2xkUGF0aCA9PT0gdGhpcy5uZXdQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIC8qXG4gICAgICogVGhlIHJlbmFtZSB0aGF0IHRyaWdnZXJlZCB0aGlzIGhhbmRsZXIgaXMgdmVyeSBsaWtlbHkgc3RpbGwgaW5zaWRlIE9ic2lkaWFuJ3Mgb3duXG4gICAgICogYEZpbGVNYW5hZ2VyLnJ1bkFzeW5jTGlua1VwZGF0ZWAgY3ljbGUsIHdoaWNoIGlzIGFib3V0IHRvIGRlY2lkZSDigJQgc3luY2hyb25vdXNseSDigJQgd2hpY2ggbGlua3MgdG9cbiAgICAgKiByZXdyaXRlLCBieSByZS1yZXNvbHZpbmcgZWFjaCBvbmUuIEV2ZXJ5dGhpbmcgYmVsb3cgdGVtcG9yYXJpbHkgcmVnaXN0ZXJzIGEgcGhhbnRvbSBmaWxlIGF0IHRoZVxuICAgICAqIG9sZCBwYXRoIChgcmVnaXN0ZXJGaWxlc2AsIGRpcmVjdGx5IGhlcmUgYW5kIGluc2lkZSBgUmVuYW1lTWFwYCkgYW5kIGhvbGRzIGl0IGFjcm9zcyBhbiBgYXdhaXRgO1xuICAgICAqIHNlZW4gbWlkLWRlY2lzaW9uLCB0aGF0IHBoYW50b20gbWFrZXMgdGhlIG9sZCBwYXRoIHN0aWxsIHJlc29sdmUsIHNvIE9ic2lkaWFuIGNvbmNsdWRlcyBub3RoaW5nXG4gICAgICogY2hhbmdlZCBhbmQgcmV3cml0ZXMgbm90aGluZy4gU3RhbmRpbmcgaW52YXJpYW50OiBuZXZlciB0b3VjaCB0aGUgdmF1bHQgaW5kZXggd2hpbGUgT2JzaWRpYW4gaXNcbiAgICAgKiBtaWQtZGVjaXNpb24uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzQ3LlxuICAgICAqL1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXModGhpcy5hcHApO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IHRoaXMuY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAvLyBUaGUgcmVmcmVzaGVkIGJhY2tsaW5rcyBmZWVkIGBvbGRQYXRoQmFja2xpbmtzTWFwYCwgd2hpY2ggb25seSB0aGUgbGluay1yZXdyaXRlIHN0ZXBzIGJlbG93IHJlYWQsIGFuZCB0aG9zZSBhcmUgZ2F0ZWQgb24gdGhlIHNhbWUgZmxhZy5cbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKS5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hMaW5rcygpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUNhc2VDb2xsaXNpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGNvbnN0IHBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gICAgY29uc3QgcmVuYW1lZEZpbGVQYXRocyA9IGdldE9ic2lkaWFuTGliU3RhdGUoJ3JlbmFtZWRGaWxlUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gICAgY29uc3QgcmVuYW1lZExpbmtzID0gZ2V0T2JzaWRpYW5MaWJTdGF0ZSgncmVuYW1lZExpbmtQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgUmVuYW1lTWFwKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZW5hbWVNYXAuZmlsbCgpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICAgIGNvbnN0IGNvbWJpbmVkQmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbiAgICAgIC8vIEJhY2tsaW5rcyBhcmUgb25seSBjb25zdW1lZCBieSB0aGUgbGluay1yZXdyaXRlIHN0ZXBzIGJlbG93LCB3aGljaCBhcmUgZ2F0ZWQgb25cbiAgICAgIC8vIGBzaG91bGRIYW5kbGVSZW5hbWVzYC4gU2tpcCBnYXRoZXJpbmcgdGhlbSAoYSBiYWNrbGluayBmZXRjaCBwZXIgYXR0YWNobWVudCkgb24gYSBtb3ZlLW9ubHkgcmVuYW1lLlxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgICAgcmVuYW1lTWFwLmluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwKTtcbiAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcFxuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgICAgICBpZiAoYXR0YWNobWVudE9sZFBhdGggPT09IHRoaXMub2xkUGF0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBhdHRhY2htZW50T2xkUGF0aCB9KTtcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCA9IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzLmRhdGE7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgICAgcGF0aDogYXR0YWNobWVudE9sZFBhdGgsXG4gICAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIChjb25zdCBbb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChvbGRBdHRhY2htZW50UGF0aCAhPT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgY29uc3QgZml4ZWROZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZChvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRQYXRoLCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRQYXRoKSkge1xuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgICAgfSk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIC8qXG4gICAgICAgKiBUaGUgYXR0YWNobWVudCBtb3ZlIGFib3ZlIHJ1bnMgcmVnYXJkbGVzcyBvZiBgc2hvdWxkSGFuZGxlUmVuYW1lc2AgKHRoYXQgaXMgdGhlIHBvaW50IG9mIGRlY291cGxpbmdcbiAgICAgICAqIFwiTW92ZSBhdHRhY2htZW50cyB3aXRoIG5vdGVcIiBmcm9tIFwiVXBkYXRlIGxpbmtzXCIpLiBUaGUgcmVtYWluaW5nIHN0ZXBzIG9ubHkgcmV3cml0ZSBsaW5rcywgc28gc2tpcFxuICAgICAgICogdGhlbSB3aGVuIGxpbmsgdXBkYXRlcyBhcmUgZGlzYWJsZWQ7IHRoZSBgZmluYWxseWAgYmxvY2sgYmVsb3cgc3RpbGwgcnVucy5cbiAgICAgICAqL1xuICAgICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqIEEgcmVzdW1lZCByZW5hbWUgYnJpbmdzIGl0cyBvd24gc25hcHNob3QgYWxvbmcuIE1lcmdlIGl0IElOVE8gdGhlIGN1cnJlbnQgb25lIHJhdGhlciB0aGFuXG4gICAgICAgKiBjb25jYXRlbmF0aW5nIHRoZSB0d286IGEgZmlsZSBuYW1lZCBieSBib3RoIHdvdWxkIG90aGVyd2lzZSBiZSBvcGVuZWQgYW5kIHJld3JpdHRlbiB0d2ljZSwgd2hpY2ggaXNcbiAgICAgICAqIHRoZSB2ZXJ5IHRoaW5nIGEgY29tYmluZWQgc25hcHNob3QgZXhpc3RzIHRvIGF2b2lkLiBUaGUgY3VycmVudCByZW5hbWUncyBlbnRyeSB3aW5zIGEga2V5IGNvbGxpc2lvbixcbiAgICAgICAqIGJlY2F1c2UgaXQgZGVzY3JpYmVzIHdoZXJlIHRoZSB0YXJnZXQgaXMgbm93LlxuICAgICAgICovXG4gICAgICBmb3IgKGNvbnN0IFtpbnRlcnJ1cHRlZEJhY2tsaW5rUGF0aCwgaW50ZXJydXB0ZWRMaW5rS2V5VG9QYXRoTWFwXSBvZiB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXApIHtcbiAgICAgICAgY29uc3QgbGlua0tleVRvUGF0aE1hcCA9IGNvbWJpbmVkQmFja2xpbmtzTWFwLmdldChpbnRlcnJ1cHRlZEJhY2tsaW5rUGF0aCk7XG4gICAgICAgIGlmICghbGlua0tleVRvUGF0aE1hcCkge1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChpbnRlcnJ1cHRlZEJhY2tsaW5rUGF0aCwgaW50ZXJydXB0ZWRMaW5rS2V5VG9QYXRoTWFwKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2xpbmtLZXksIG9sZFRhcmdldFBhdGhdIG9mIGludGVycnVwdGVkTGlua0tleVRvUGF0aE1hcCkge1xuICAgICAgICAgIGlmICghbGlua0tleVRvUGF0aE1hcC5oYXMobGlua0tleSkpIHtcbiAgICAgICAgICAgIGxpbmtLZXlUb1BhdGhNYXAuc2V0KGxpbmtLZXksIG9sZFRhcmdldFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5rSW5kZXhlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICBhd2FpdCBlZGl0QmFja2xpbmtzU25hcHNob3Qobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxzdHJpbmc+Pih7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBsaW5rQ29udmVydGVyOiAoeyBsaW5rLCBwYXlsb2FkOiBvbGRBdHRhY2htZW50UGF0aCwgc291cmNlUGF0aDogbmV3QmFja2xpbmtQYXRoIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaW5rSW5kZXggPSAobGlua0luZGV4ZXMuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gMCkgKyAxO1xuICAgICAgICAgIGxpbmtJbmRleGVzLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtJbmRleCk7XG5cbiAgICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogQSBsaW5rIHRoYXQgaXMgbm90IGluIHRoZSBzbmFwc2hvdCB3YXMgZWl0aGVyIG5ldmVyIG91cnMgdG8gcmV3cml0ZSwgb3Igd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAqIHJld3JpdHRlbiBieSBzb21lb25lIGVsc2UgKGxlYXZpbmcgaXQgY29ycmVjdCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0byBkbyAtXG4gICAgICAgICAgICAgKiBidXQgbG9nIGl0LCBiZWNhdXNlIGEgc2lsZW50IHNraXAgaGVyZSBpcyBleGFjdGx5IGhvd1xuICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy82MCBzdGF5ZWRcbiAgICAgICAgICAgICAqIGludmlzaWJsZTogZXZlcnkgc2tpcHBlZCBsaW5rIGxlZnQgYSBicm9rZW4gZW1iZWQgYW5kIHJlcG9ydGVkIG5vdGhpbmcuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6dXBkYXRlQmFja2xpbmtzJykoXG4gICAgICAgICAgICAgIGBObyBzbmFwc2hvdCBlbnRyeSBmb3IgbGluayAke3RvSnNvbihsaW5rKX0gaW4gJHtuZXdCYWNrbGlua1BhdGh9OyBsZWF2aW5nIGl0IHVuY2hhbmdlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCkgPz8gb2xkQXR0YWNobWVudFBhdGg7XG5cbiAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmFkZChuZXdCYWNrbGlua1BhdGgpO1xuICAgICAgICAgIHJlbmFtZWRMaW5rcy5hZGQoYCR7bmV3QmFja2xpbmtQYXRofS8vJHtTdHJpbmcobGlua0luZGV4KX1gKTtcblxuICAgICAgICAgIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgbGluayxcbiAgICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgb2xkVGFyZ2V0UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgIC8vIFRoZSBjb252ZXJ0ZXIgbG9ncyBldmVyeSBsaW5rIGl0IGRlY2xpbmVzLCBzbyBpdCBoYXMgdG8gYmUgc2hvd24gdGhlIG9uZXMgdGhlIHNuYXBzaG90IGRvZXMgbm90IG5hbWUuXG4gICAgICAgIHNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3M6IHRydWUsXG4gICAgICAgIHNuYXBzaG90OiBjb21iaW5lZEJhY2tsaW5rc01hcFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBpZiAoaXNOb3RlKHRoaXMubmV3UGF0aCkpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlTGlua3NJbkZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zPih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCB9KSkge1xuICAgICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KHRoaXMubmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBvcnBoYW5LZXlzID0gWy4uLnRoaXMuaGFuZGxlZFJlbmFtZXMua2V5cygpXTtcbiAgICAgIGFkZFRvUXVldWUoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246ICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9ycGhhbktleSBvZiBvcnBoYW5LZXlzKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvcnBoYW5LZXkub2xkUGF0aCwgb3JwaGFuS2V5Lm5ld1BhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5hbWVkTGlua3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZU9ycGhhbmVkUmVuYW1lcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMub2xkUGF0aCk7XG4gICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGludGVycnVwdGVkUmVuYW1lIG9mIGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogaW50ZXJydXB0ZWRSZW5hbWUub2xkUGF0aCxcbiAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KS5oYW5kbGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNhc2VDb2xsaXNpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFnZXREYXRhQWRhcHRlckV4KHRoaXMuYXBwKS5pbnNlbnNpdGl2ZSB8fCB0aGlzLm9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5uZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gam9pbihkaXJuYW1lKHRoaXMubmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUodGhpcy5uZXdQYXRoKX1gKTtcbiAgICBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQodGhpcy5uZXdQYXRoLCB0ZW1wb3JhcnlQYXRoKTtcblxuICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgbmV3UGF0aDogdGVtcG9yYXJ5UGF0aCxcbiAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG5cbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0ZW1wb3JhcnlQYXRoIH0pLCB0aGlzLm5ld1BhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTGlua3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgbGV0IG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQ6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgICB7XG4gICAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW2Zha2VPbGRGaWxlXSk7XG4gICAgICBjb25zdCBmYWtlT2xkRmlsZUJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogZmFrZU9sZEZpbGUgfSk7XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gZmFrZU9sZEZpbGVCYWNrbGlua3MuZGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZExpbmtzXSBvZiBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkKSB7XG4gICAgICBsZXQgb2xkTGlua3MgPSB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuZ2V0KGJhY2tsaW5rUGF0aCk7XG4gICAgICBpZiAoIW9sZExpbmtzKSB7XG4gICAgICAgIG9sZExpbmtzID0gW107XG4gICAgICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5zZXQoYmFja2xpbmtQYXRoLCBvbGRMaW5rcyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbGluayBvZiByZWZyZXNoZWRMaW5rcykge1xuICAgICAgICBpZiAob2xkTGlua3MuaW5jbHVkZXMobGluaykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBvbGRMaW5rcy5wdXNoKGxpbmspO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVuYW1lSGFuZGxlZChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbmV3UGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBvbGRQYXRoIH0pO1xuICAgIGlmIChvbGRQYXRoID09PSBuZXdQYXRoKSB7XG4gICAgICByZXR1cm4gbmV3UGF0aDtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5hZGQob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgbmV3UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lTWFwIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkUGF0aExpbmtzID0gdGhpcy5vbGRDYWNoZSA/IGdldExpbmtzKHsgY2FjaGU6IHRoaXMub2xkQ2FjaGUgfSkgOiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgc3RyaW5nXT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5lbnRyaWVzKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmlsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMub2xkUGF0aCwgdGhpcy5uZXdQYXRoKTtcblxuICAgIGlmICghaXNOb3RlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPYnNpZGlhbiBkb2VzIG5vdCBpbmRleCBhIGNhbnZhcyBmaWxlIGludG8gdGhlIG1ldGFkYXRhIGNhY2hlLlxuICAgIC8vIFRoZSBjYWNoZS1kZXJpdmVkIGBvbGRQYXRoTGlua3NgIGlzIGVtcHR5IGZvciBhIGNhbnZhcywgaGlkaW5nIGl0cyBlbWJlZGRlZCBhdHRhY2htZW50cy5cbiAgICAvLyBSZWFkaW5nIHRoZSBjYW52YXMgcmVmZXJlbmNlcyBkaXJlY3RseSBtb3ZlcyB0aGVtIHdpdGggdGhlIGNhbnZhcyAobWlycm9yaW5nIG5vdGUgYmVoYXZpb3IpLlxuICAgIC8vIFRoZSBmaWxlIGFscmVhZHkgbGl2ZXMgYXQgdGhlIG5ldyBwYXRoIGFmdGVyIHRoZSByZW5hbWUsIHNvIHJlYWQgdGhlIHJlZmVyZW5jZXMgZnJvbSB0aGVyZS5cbiAgICBpZiAoaXNDYW52YXNGaWxlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNhbnZhc1JlZmVyZW5jZXMgPSBhd2FpdCBnZXRDYW52YXNSZWZlcmVuY2VzKHRoaXMuYXBwLCB0aGlzLm5ld1BhdGgpO1xuICAgICAgdGhpcy5vbGRQYXRoTGlua3MucHVzaCguLi5jYW52YXNSZWZlcmVuY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBjb25zdCBvbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgdGhpcy5nZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlKTtcblxuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlclxuICAgICAgPyBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoXG4gICAgICB9KVxuICAgICAgOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aDtcblxuICAgIGNvbnN0IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA9IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLyc7XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmICghb2xkQXR0YWNobWVudEZvbGRlciB8fCAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgICBpZiAoXG4gICAgICBhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAob2xkQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUgfHwgKCFpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgJiYgIW9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50QmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpKTtcbiAgICAgICAga2V5cy5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgICAga2V5cy5kZWxldGUodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgaWYgKGtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdBdHRhY2htZW50RmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgIG9sZE5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPyBvbGRBdHRhY2htZW50RmlsZS5wYXRoIDogcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBqb2luKG5ld0ZvbGRlciwgb2xkQXR0YWNobWVudEZpbGUubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50RmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50RmlsZVBhdGggfSk7XG4gICAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZmlsbFJlbmFtZU1hcCcpKGBSZW1vdmluZyBjb25mbGljdGluZyBhdHRhY2htZW50ICR7bmV3QXR0YWNobWVudEZpbGUucGF0aH0uYCk7XG4gICAgICAgICAgYXdhaXQgdHJhc2hTYWZlKHRoaXMuYXBwLCBuZXdBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSBkaXJuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBiYXNlbmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgsIGV4dGVuc2lvbik7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IHRoaXMuYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXJlY3RvcnksIGJhc2VOYW1lKSwgZXh0ZW5zaW9uLnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQob2xkUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KG9sZFBhdGgpO1xuICB9XG5cbiAgcHVibGljIGluaXRCYWNrbGlua3NNYXAocGFyYW1zOiBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICBwYXRoLFxuICAgICAgc2luZ2xlQmFja2xpbmtzTWFwXG4gICAgfSA9IHBhcmFtcztcbiAgICBidWlsZEJhY2tsaW5rc1NuYXBzaG90PHN0cmluZz4oe1xuICAgICAgYmFja2xpbmtzOiBzaW5nbGVCYWNrbGlua3NNYXAsXG4gICAgICBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcjogZ2V0TGlua0lkZW50aXR5S2V5LFxuICAgICAgcGF0aFJlbWFwcGVyOiAoYmFja2xpbmtQYXRoKSA9PiB0aGlzLm1hcC5nZXQoYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGgsXG4gICAgICBwYXlsb2FkUHJvdmlkZXI6ICgpID0+IHBhdGgsXG4gICAgICB0YXJnZXQ6IGNvbWJpbmVkQmFja2xpbmtzTWFwXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rOiBvbGRQYXRoTGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoIH0pO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oW1t0aGlzLm5ld1BhdGgsIFtvbGRQYXRoTGlua11dXSk7XG4gICAgICB0aGlzLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgcGF0aDogb2xkQXR0YWNobWVudEZpbGUucGF0aCxcbiAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiBiYWNrbGlua3NNYXBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmtleXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQob2xkUGF0aCwgbmV3UGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGU6IFRGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW29sZEZpbGVdKTtcbiAgICB1c2luZyBfY2FjaGVSZWdpc3RyYXRpb24gPSB0aGlzLm9sZENhY2hlICYmIG9sZEZpbGUuZGVsZXRlZFxuICAgICAgPyByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSh7IGFwcDogdGhpcy5hcHAsIGNhY2hlOiB0aGlzLm9sZENhY2hlLCBwYXRoT3JGaWxlOiBvbGRGaWxlIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHNldHRpbmdzIHRoZSBoYW5kbGVyIHJ1bnMgd2l0aC5cbiAqXG4gKiBUaGVyZSBpcyBleGFjdGx5IG9uZSBjb250cmlidXRvcjogdGhlIGNvbXBvbmVudCdzIG93biBgc2V0dGluZ3NCdWlsZGVyYC4gRWFybGllciB2ZXJzaW9ucyBhZ2dyZWdhdGVkIGFcbiAqIHJlZ2lzdHJ5IG9mIGNvbnRyaWJ1dG9ycyBhbmQgT1ItbWVyZ2VkIHRoZWlyIGFuc3dlcnMsIGJlY2F1c2Ugc2V2ZXJhbCBwbHVnaW5zIGNvdWxkIGVhY2ggcmVnaXN0ZXIgYVxuICogaGFuZGxlciBhZ2FpbnN0IHRoZSBvbmUgc2hhcmVkIHZhdWx0LiBUaGV5IG5vIGxvbmdlciBkbywgc28gdGhlcmUgaXMgbm8gbG9uZ2VyIGFueSBxdWVzdGlvbiBvZiB3aG9zZVxuICogc2V0dGluZyB3aW5zLlxuICpcbiAqIFdoYXQgcmVtYWlucyBpcyBkZWZhdWx0aW5nOiB0aGUgYnVpbGRlciByZXR1cm5zIGEgYFBhcnRpYWxgLCBzbyB0aGUgdHdvIHByZWRpY2F0ZXMgYW5kIHRoZSBlbXB0eS1mb2xkZXJcbiAqIGJlaGF2aW9yIG5lZWQgYSB2YWx1ZSB3aGVuIGl0IGRvZXMgbm90IHN1cHBseSBvbmUuXG4gKi9cbmNsYXNzIFNldHRpbmdzTWFuYWdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBzZXR0aW5nc0J1aWxkZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dGluZ3MoKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgICBjb25zdCBidWlsdFNldHRpbmdzID0gdGhpcy5zZXR0aW5nc0J1aWxkZXIoKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYnVpbHRTZXR0aW5ncyxcbiAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IGJ1aWx0U2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBpc05vdGU6IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGJ1aWx0U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gaXNOb3RlKHBhdGgpLFxuICAgICAgaXNQYXRoSWdub3JlZDogKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gYnVpbHRTZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkgPz8gZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGlzTm90ZUV4KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgIHJldHVybiBzZXR0aW5ncy5pc05vdGU/LihwYXRoKSA/PyBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBvbmVudCB0aGF0IGhhbmRsZXMgcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGluIE9ic2lkaWFuLlxuICogSXQgbGlzdGVucyB0byByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgYW5kIHVwZGF0ZXMgbGlua3MgYWNjb3JkaW5nbHkuXG4gKiBJdCBhbHNvIGhhbmRsZXMgZWRnZSBjYXNlcyBzdWNoIGFzIGNhc2Utb25seSByZW5hbWVzIGFuZCBjb2xsaXNpb25zIHdpdGggZXhpc3RpbmcgZmlsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCBjb21wb25lbnQgd2hvc2Ugc2lnbmFsIGNhbmNlbHMgaW4tZmxpZ2h0IHJlbmFtZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHJlcG9ydGVyIGludm9rZWQgb25jZSBwZXIgYmFja2xpbmsgZmlsZSB3aG9zZSBsaW5rcyBhcmUgdXBkYXRlZCBkdXJpbmcgYSByZW5hbWUvbW92ZSxcbiAgICogd2l0aCB0aGUgcnVubmluZyBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBgbnVsbGAsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbXBvbmVudCB1c2VkIHRvIHJlcG9ydCB1cGRhdGVkIGxpbmtzIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIGxvY2sgY29tcG9uZW50IHVzZWQgdG8gZ3VhcmQgbGluayB1cGRhdGVzLCBvciBgbnVsbGAgaWYgbm9uZSBpcyB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogQnVpbGRzIHRoaXMgcGx1Z2luJ3MgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuYWdlciB0aGF0IGFnZ3JlZ2F0ZXMgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzIGFjcm9zcyByZWdpc3RlcmVkIHBsdWdpbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzID0gbmV3IEhhbmRsZWRSZW5hbWVzKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50ID0gcGFyYW1zLmFib3J0U2lnbmFsQ29tcG9uZW50O1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID0gcGFyYW1zLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID8/IG51bGw7XG4gICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzQnVpbGRlciA9IHBhcmFtcy5zZXR0aW5nc0J1aWxkZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBuZXcgU2V0dGluZ3NNYW5hZ2VyKHRoaXMuc2V0dGluZ3NCdWlsZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgdGhpcy5oYW5kbGVEZWxldGUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgdGhpcy5oYW5kbGVSZW5hbWUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgdGhpcy5oYW5kbGVNZXRhZGF0YURlbGV0ZWQuYmluZCh0aGlzKSkpO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50KHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZmlsZU1hbmFnZXI6IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRlKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiAoYWJvcnRTaWduYWwpID0+XG4gICAgICAgIG5ldyBEZWxldGVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZURlbGV0ZSwgeyBmaWxlUGF0aDogZmlsZS5wYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgICBuZXcgTWV0YWRhdGFEZWxldGVkSGFuZGxlcih7XG4gICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgIGZpbGUsXG4gICAgICBwcmV2aW91c0NhY2hlLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW5hbWUoZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXRoID0gZmlsZS5wYXRoO1xuXG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgSGFuZGxlIFJlbmFtZSAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gKTtcbiAgICBpZiAodGhpcy5oYW5kbGVkUmVuYW1lcy5oYXMob2xkUGF0aCwgbmV3UGF0aCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQSByZW5hbWUgb2NjdXJyaW5nIGluc2lkZSBhIGZvcmVpZ24gcGx1Z2luJ3MgaW4tZmxpZ2h0IGxvY2tlZCB0cmFuc2FjdGlvbiAod2hpY2ggbG9ja3MgdGhlXG4gICAgICogYWZmZWN0ZWQgZm9sZGVyIHN1YnRyZWUsIGUuZy4gYEFkdmFuY2VkIE5vdGUgQ29tcG9zZXJgJ3MgZm9sZGVyIG1lcmdlKSBpcyBvcmNoZXN0cmF0ZWQgYnkgdGhhdFxuICAgICAqIHRyYW5zYWN0aW9uJ3Mgb3duZXIsIHdoaWNoIHRha2VzIHJlc3BvbnNpYmlsaXR5IGZvciBpdHMgb3duIGxpbmsgY29uc2lzdGVuY3kuIFJlYWN0aW5nIHRvIGl0XG4gICAgICogaGVyZSB3b3VsZCAoYSkgcGVydHVyYiBPYnNpZGlhbidzIG5hdGl2ZSBwb3N0LXJlbmFtZSBsaW5rIHVwZGF0ZSBhbmQgbGVhdmUgbGlua3MgZGFuZ2xpbmcsIGFuZFxuICAgICAqIChiKSBjb2xsaWRlIHdpdGggdGhlIGZvcmVpZ24gdHJhbnNhY3Rpb24g4oCUIGFuIGFzeW5jIGFib3J0IGZyb20gdGhpcyBoYW5kbGVyIGFib3J0cyBhblxuICAgICAqIGFscmVhZHktY29tbWl0dGVkIHRyYW5zYWN0aW9uLCB0aHJvd2luZyBcIkNhbm5vdCByb2xsIGJhY2sgYSBjb21taXR0ZWQgdHJhbnNhY3Rpb25cIi4gVGhpc1xuICAgICAqIGhhbmRsZXIncyBvd24gYXR0YWNobWVudCBtb3ZlcyBhcmUgYWxyZWFkeSBleGNsdWRlZCBhYm92ZSB2aWEgYGhhbmRsZWRSZW5hbWVzYCwgc28gYSBsb2NrIHN0aWxsXG4gICAgICogaGVsZCBoZXJlIGFsd2F5cyBiZWxvbmdzIHRvIGEgZm9yZWlnbiBvcGVyYXRpb247IHN0YXkgb3V0IG9mIGl0cyB3YXkuIFNlZVxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1hZHZhbmNlZC1ub3RlLWNvbXBvc2VyL2lzc3Vlcy8xNDYuXG4gICAgICovXG4gICAgaWYgKGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkgfHwgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBuZXdQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBvY2N1cnMgaW5zaWRlIGEgZm9yZWlnbiBsb2NrZWQgdHJhbnNhY3Rpb24uYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05vT3BSZW5hbWUoc2V0dGluZ3MsIG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKFxuICAgICAgICBgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9IGFzIGl0IGlzIG5vdCBhIG5vdGUgYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gd2l0aCBsaW5rIHVwZGF0ZXMgZGlzYWJsZWQuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG9sZFBhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiBvbGQgcGF0aCAke29sZFBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihuZXdQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKHRoaXMuYXBwLCBvbGRQYXRoKS5kYXRhO1xuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQuYWJvcnRTaWduYWwsXG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZVJlbmFtZSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2l0aCBsaW5rIHJld3JpdGluZyBvZmYsIHRoZSBoYW5kbGVyJ3Mgb25seSByZW1haW5pbmcgam9icyBhcmUgbW92aW5nIGEgTk9URSdzIGF0dGFjaG1lbnRzIGFuZCBwcnVuaW5nXG4gICAqIHRoZSBmb2xkZXIgYSBtb3ZlZCBmaWxlIHZhY2F0ZWQuIEEgbm9uLW5vdGUgcmVuYW1lIG5lZWRzIG5laXRoZXIgd2hlbiBlbXB0eSBmb2xkZXJzIGFyZSBrZXB0LCBzbyB0aGVyZVxuICAgKiBpcyBub3RoaW5nIHRvIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEBwYXJhbSBvbGRQYXRoIC0gVGhlIHBhdGggdGhlIGZpbGUgd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgZmlsZSB3YXMgcmVuYW1lZCB0by5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGhhbmRsZXIgd291bGQgZG8gbm8gd29yayBmb3IgdGhpcyByZW5hbWUuXG4gICAqL1xuICBwcml2YXRlIGlzTm9PcFJlbmFtZShzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+LCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lc1xuICAgICAgJiYgIShzZXR0aW5ncy5pc05vdGU/LihvbGRQYXRoKSA/PyBmYWxzZSlcbiAgICAgICYmICEoc2V0dGluZ3MuaXNOb3RlPy4obmV3UGF0aCkgPz8gZmFsc2UpXG4gICAgICAmJiAoc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXApID09PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXA7XG4gIH1cbn1cblxuLyoqXG4gKiBNb3ZlcyBhbiBhdHRhY2htZW50IGEgZGVsZXRpb24gd291bGQgb3RoZXJ3aXNlIHN0cmFuZCB0byB3aGVyZXZlciB0aGUgY29uc3VtaW5nIHBsdWdpbiBzYXlzIGl0IGJlbG9uZ3MuXG4gKlxuICogU2hhcmVkIGJ5IGJvdGggZGVsZXRlIHBhdGhzIOKAlCB0aGUgbm90ZSBkZWxldGUgaW4ge0BsaW5rIERlbGV0ZUhhbmRsZXJ9IGFuZCB0aGUgZm9sZGVyIGRlbGV0ZSByZXBsYXllZCBieVxuICoge0BsaW5rIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudH0g4oCUIGJlY2F1c2UgYm90aCByZWFjaCB0aGUgc2FtZSBwb2ludDoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH0gaGFzXG4gKiBkZWNpZGVkIHRoZSBhdHRhY2htZW50IG11c3Qgc3Vydml2ZSwgYW5kIHdpdGhvdXQgdGhpcyBpdCB3b3VsZCBzdXJ2aXZlIGluIGEgZm9sZGVyIG5vdGhpbmcgb3ducyBhbnkgbW9yZS5cbiAqXG4gKiBBIGNvbnN1bWVyIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MuZ2V0UmVzY3VlUGF0aH0sIG9yIHRoYXQgYW5zd2Vyc1xuICogYG51bGxgLCBnZXRzIGV4YWN0bHkgdGhlIGJlaGF2aW9yIGl0IGhhZCBiZWZvcmUgdGhpcyBleGlzdGVkOiB0aGUgYXR0YWNobWVudCBzdGF5cyBwdXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoZXRoZXIgdGhlIGF0dGFjaG1lbnQgd2FzIG1vdmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHBhcmFtczogRGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudFBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBzZXR0aW5ncyA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgaWYgKCFzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYXR0YWNobWVudFBhdGggPSBwYXJhbXMucmVzY3VlUGFyYW1zLmZpbGUucGF0aDtcbiAgY29uc3QgcmVzY3VlUGF0aCA9IGF3YWl0IHNldHRpbmdzLmdldFJlc2N1ZVBhdGgoe1xuICAgIGF0dGFjaG1lbnRQYXRoLFxuICAgIHN1cnZpdmluZ05vdGVQYXRoczogcGFyYW1zLnJlc2N1ZVBhcmFtcy5zdXJ2aXZpbmdOb3RlUGF0aHNcbiAgfSk7XG5cbiAgaWYgKHJlc2N1ZVBhdGggPT09IG51bGwpIHtcbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgTm8gcmVzY3VlIHBhdGggZm9yICR7YXR0YWNobWVudFBhdGh9OyBrZWVwaW5nIGl0IHdoZXJlIGl0IGlzLmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLypcbiAgICAgKiBgcmVuYW1lU2FmZWAgY3JlYXRlcyB0aGUgZGVzdGluYXRpb24gZm9sZGVyLCByZXNvbHZlcyBhIGNvbGxpc2lvbiB2aWEgYGdldFNhZmVSZW5hbWVQYXRoYCwgYW5kIG1vdmVzXG4gICAgICogdGhyb3VnaCBgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGVgLCBzbyB0aGUgc3Vydml2aW5nIG5vdGVzJyBsaW5rcyBmb2xsb3cgdGhlIGF0dGFjaG1lbnQuXG4gICAgICovXG4gICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCByZW5hbWVTYWZlKHtcbiAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgIG5ld1BhdGg6IHJlc2N1ZVBhdGgsXG4gICAgICBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IHBhcmFtcy5yZXNjdWVQYXJhbXMuZmlsZVxuICAgIH0pO1xuXG4gICAgaWYgKG5ld0F0dGFjaG1lbnRQYXRoID09PSBhdHRhY2htZW50UGF0aCkge1xuICAgICAgLypcbiAgICAgICAqIFRoZSBhdHRhY2htZW50IGlzIGFscmVhZHkgd2hlcmUgaXQgYmVsb25ncy4gVGhpcyBpcyB0aGUgbm9ybWFsIHNlY29uZCBsb29rIGF0IGEgZmlsZSB0aGUgZm9sZGVyXG4gICAgICAgKiBkZWxldGUganVzdCByZXNjdWVkOiB0aGUgb3duaW5nIG5vdGUncyBvd24gZGVsZXRpb24gaXMgcmVwb3J0ZWQgYWZ0ZXJ3YXJkcyBhbmQgd2Fsa3MgaXRzIGxpbmtzXG4gICAgICAgKiBhZ2Fpbi4gTm90aGluZyBtb3ZlZCwgc28gbm90aGluZyBpcyBjbGFpbWVkIOKAlCB0aGUgY2FsbGVyIGtlZXBzIGl0IGluIHBsYWNlLCB3aGljaCBpcyB0aGUgdHJ1dGguXG4gICAgICAgKi9cbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCcpKGAke2F0dGFjaG1lbnRQYXRofSBhbHJlYWR5IHNpdHMgYXQgaXRzIHJlc2N1ZSBwYXRoOyBub3RoaW5nIHRvIG1vdmUuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgbW92ZSBmaXJlcyBgdmF1bHQub24oJ3JlbmFtZScpYCwgc28gdGhpcyBoYW5kbGVyJ3Mgb3duIGBSZW5hbWVIYW5kbGVyYCBwaWNrcyBpdCB1cCBsaWtlIGFueSBvdGhlclxuICAgICAqIGF0dGFjaG1lbnQgbW92ZS4gSXQgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZWdpc3RlcmVkIGluIGBoYW5kbGVkUmVuYW1lc2A6XG4gICAgICogYEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRgIGFscmVhZHkgZGlzY2FyZHMgT2JzaWRpYW4ncyBuYXRpdmUgbGluayB1cGRhdGUgd2hpbGVcbiAgICAgKiBgc2hvdWxkSGFuZGxlUmVuYW1lc2AgaXMgb24sIHNvIHN1cHByZXNzaW5nIHRoZSBoYW5kbGVyIGFzIHdlbGwgd291bGQgbGVhdmUgZGFuZ2xpbmcgZXhhY3RseSB0aGUgbGlua3NcbiAgICAgKiB0aGlzIHJlc2N1ZSBleGlzdHMgdG8gcHJlc2VydmUuIExldCB0aGUgcmV3cml0ZSBzZXR0bGUgYmVmb3JlIHRoZSBkZWxldGUgd2FsayBjYXJyaWVzIG9uLlxuICAgICAqL1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXMocGFyYW1zLmFwcCk7XG5cbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgUmVzY3VlZCAke2F0dGFjaG1lbnRQYXRofSB0byAke25ld0F0dGFjaG1lbnRQYXRofS5gKTtcbiAgICBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5ub3RpY2VzLmF0dGFjaG1lbnRSZXNjdWVkLCB7IGF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCB9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLypcbiAgICAgKiBBIHJlc2N1ZSB0aGF0IGhhbGYgaGFwcGVuZWQgbXVzdCBub3QgcmVhZCBhcyBzdWNjZXNzIOKAlCByZXBvcnRpbmcgYGZhbHNlYCBmYWxscyBiYWNrIHRvIGtlZXBpbmcgdGhlXG4gICAgICogYXR0YWNobWVudCBpbiBwbGFjZSB3aXRoIHRoZSBgYXR0YWNobWVudElzU3RpbGxVc2VkYCBub3RpY2UsIHdoaWNoIGlzIHN0aWxsIHNhZmUuXG4gICAgICovXG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNjdWUgJHthdHRhY2htZW50UGF0aH0gdG8gJHtyZXNjdWVQYXRofWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGtleSB1bmRlciB3aGljaCBhIGxpbmsgaXMgcmVtZW1iZXJlZCB3aGlsZSBhIHJlbmFtZSBpcyBpbiBmbGlnaHQuXG4gKlxuICogVGhlIHJld3JpdGUgaGFzIHRvIG1hdGNoIGxpbmtzIGNhcHR1cmVkIEJFRk9SRSB0aGUgYXR0YWNobWVudHMgbW92ZWQgYWdhaW5zdCB0aGUgbGlua3MgdGhlIG1ldGFkYXRhIGNhY2hlXG4gKiByZXBvcnRzIEFGVEVSIHRoZXkgbW92ZWQsIGFuZCB0aGUgb25seSB0aGluZyB0aGF0IHJlbGlhYmx5IHN1cnZpdmVzIHRoYXQgZ2FwIGlzIHRoZSBsaW5rJ3MgVEVYVC5cbiAqIERlbGliZXJhdGVseSBleGNsdWRlcyBgcG9zaXRpb25gOiBrZXlpbmcgb24gdGhlIHdob2xlIHtAbGluayBSZWZlcmVuY2V9IG1lYW50IHRoYXQgYXMgc29vbiBhcyBhbnl0aGluZ1xuICogZWRpdGVkIHRoZSBmaWxlIGluIGJldHdlZW4g4oCUIGEgY28taW5zdGFsbGVkIHBsdWdpbiByZXdyaXRpbmcgaXRzIG93biBsaW5rcywgbW9zdCBvZnRlbiDigJQgZXZlcnkgbGluayBiZWxvd1xuICogdGhlIGVkaXQgc2hpZnRlZCBpdHMgb2Zmc2V0cywgbWlzc2VkIGl0cyBrZXksIGFuZCB3YXMgc2tpcHBlZCBpbiBzaWxlbmNlLCBsZWF2aW5nIHRoZSBub3RlIHdpdGggc29tZSBlbWJlZHNcbiAqIHJld3JpdHRlbiBhbmQgdGhlIHJlc3QgYnJva2VuLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbi9pc3N1ZXMvNjAuXG4gKlxuICogVHdvIGxpbmtzIHdpdGggaWRlbnRpY2FsIHRleHQgaW4gb25lIGZpbGUgbmVjZXNzYXJpbHkgcmVzb2x2ZSB0byB0aGUgc2FtZSB0YXJnZXQsIHNvIGNvbGxhcHNpbmcgdGhlbSBvbnRvXG4gKiBvbmUga2V5IGxvc2VzIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBidWlsZCB0aGUga2V5IGZvci5cbiAqIEByZXR1cm5zIFRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIGxpbmsgYnkgaXRzIHRleHQgYWxvbmUuXG4gKi9cbmZ1bmN0aW9uIGdldExpbmtJZGVudGl0eUtleShsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Kc29uKHtcbiAgICBsaW5rOiBsaW5rLmxpbmssXG4gICAgb3JpZ2luYWw6IGxpbmsub3JpZ2luYWxcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbmV4cG9ydCB7IEVtcHR5Rm9sZGVyQmVoYXZpb3IgfSBmcm9tICcuLi92YXVsdC50cyc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsU0FBUztBQUNsQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWFQO0FBQUEsRUFDRTtBQUFBLEVB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
1227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3JlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FycmF5JztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIH0gZnJvbSAnLi4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXMsXG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZVJlZmVyZW5jZXNJbkZpbGVQYXJhbXNcbn0gZnJvbSAnLi4vbGluay50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlTG9ja0NvbXBvbmVudCB9IGZyb20gJy4uL3Jlc291cmNlLWxvY2sudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zIH0gZnJvbSAnLi4vdmF1bHQtZGVsZXRlLnRzJztcbmltcG9ydCB0eXBlIHsgQWJvcnRTaWduYWxDb21wb25lbnQgfSBmcm9tICcuL2Fib3J0LXNpZ25hbC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHtcbiAgQXR0YWNobWVudFBhdGhDb250ZXh0LFxuICBnZXRBdHRhY2htZW50RmlsZVBhdGgsXG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4uL2F0dGFjaG1lbnQtcGF0aC50cyc7XG5pbXBvcnQgeyBnZXRDYW52YXNSZWZlcmVuY2VzIH0gZnJvbSAnLi4vY2FudmFzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7XG4gIENBTlZBU19GSUxFX0VYVEVOU0lPTixcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzRmlsZSxcbiAgaXNGb2xkZXIsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCYWNrbGlua3NTbmFwc2hvdCxcbiAgZWRpdEJhY2tsaW5rc1NuYXBzaG90LFxuICBleHRyYWN0UmVmZXJlbmNlRmlsZSxcbiAgdXBkYXRlTGluayxcbiAgdXBkYXRlUmVmZXJlbmNlc0luRmlsZVxufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRSZWZlcmVuY2VzLFxuICBoYXNCYWNrbGlua0NhY2hlUGx1Z2luLFxuICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tbGliLXN0YXRlLnRzJztcbmltcG9ydCB7IGFkZFRvUXVldWUgfSBmcm9tICcuLi9xdWV1ZS50cyc7XG5pbXBvcnQgeyBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB7IGRlbGV0ZUlmTm90VXNlZCB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQge1xuICBjbGVhbnVwRW1wdHlGb2xkZXJzLFxuICBFbXB0eUZvbGRlckJlaGF2aW9yLFxuICBnZXRTYWZlUmVuYW1lUGF0aCxcbiAgaXNDaGlsZE9yU2VsZixcbiAgcmVuYW1lU2FmZSxcbiAgdHJhc2hTYWZlXG59IGZyb20gJy4uL3ZhdWx0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHtcbiAgaGFzUGF0Y2hUb2tlbixcbiAgTW9ua2V5QXJvdW5kQ29tcG9uZW50XG59IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MuZ2V0UmVzY3VlUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVzY3VlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudCB0aGF0IGlzIGFib3V0IHRvIGJlIHN0cmFuZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IHN0aWxsIHJlZmVyZW5jZSB0aGUgYXR0YWNobWVudCBvbmNlIHRoZSBkZWxldGlvbiBpcyBkb25lLiBOZXZlciBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IHN1cnZpdmluZ05vdGVQYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICByZWFkb25seSBlbXB0eUZvbGRlckJlaGF2aW9yOiBFbXB0eUZvbGRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBtb3ZlIGFuIGF0dGFjaG1lbnQgdGhhdCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQg4oCUIG9uZSB0aGF0IHN1cnZpdmVzIGJlY2F1c2UgYW5vdGhlclxuICAgKiBub3RlIHN0aWxsIHJlZmVyZW5jZXMgaXQsIGJ1dCBpcyBsZWZ0IHNpdHRpbmcgaW4gYSBmb2xkZXIgd2hvc2Ugb3duaW5nIG5vdGUgaXMgZ29uZS5cbiAgICpcbiAgICogRGVjaWRpbmcgdGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBwbHVnaW4ncyBhdHRhY2htZW50LXBhdGggcG9saWN5LCB3aGljaCBpcyB3aHkgdGhlIGhhbmRsZXIgYXNrcyByYXRoZXJcbiAgICogdGhhbiBndWVzc2VzLiBSZXR1cm5pbmcgYG51bGxgIOKAlCBvciBub3QgaW1wbGVtZW50aW5nIHRoaXMgYXQgYWxsIOKAlCBrZWVwcyB0aGUgYXR0YWNobWVudCB3aGVyZSBpdCBpcyxcbiAgICogd2hpY2ggaXMgdGhlIGJlaGF2aW9yIGV2ZXJ5IGNvbnN1bWVyIGhhZCBiZWZvcmUgdGhpcyBtZW1iZXIgZXhpc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IGdldFJlc2N1ZVBhdGg/OiAocGFyYW1zOiBHZXRSZXNjdWVQYXRoUGFyYW1zKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzTm90ZTogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICByZWFkb25seSBpc1BhdGhJZ25vcmVkOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBIYW5kbGVkUmVuYW1lS2V5IHtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlcnJ1cHRlZFJlbmFtZSB7XG4gIHJlYWRvbmx5IGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21iaW5lZCBiYWNrbGlua3MgbWFwLCBrZXllZCBieSBuZXcgYmFja2xpbmsgcGF0aCwgYWNjdW11bGF0aW5nIGxpbmstSlNPTiB0byBzb3VyY2UtcGF0aCBtYXBwaW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggd2hvc2UgYmFja2xpbmtzIGFyZSBiZWluZyByZWNvcmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhY2tsaW5rcyBtYXAgZm9yIGEgc2luZ2xlIGZpbGUsIGtleWVkIGJ5IGJhY2tsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbn1cblxuY29uc3QgUEFUQ0hfVE9LRU4gPSBTeW1ib2wuZm9yKCdyZW5hbWVEZWxldGVIYW5kbGVyJyk7XG5cbmludGVyZmFjZSBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50UGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXM7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWxDb21wb25lbnQ6IEFib3J0U2lnbmFsQ29tcG9uZW50O1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG59XG5cbmNsYXNzIERlbGV0ZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgSGFuZGxlIERlbGV0ZSAke3RoaXMuZmlsZS5wYXRofWApO1xuICAgIGlmICghaXNOb3RlKHRoaXMuZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHModGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZGlybmFtZSh0aGlzLmZpbGUucGF0aCldKTtcblxuICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5nZXQodGhpcy5maWxlLnBhdGgpO1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5kZWxldGUodGhpcy5maWxlLnBhdGgpO1xuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gZ2V0UmVmZXJlbmNlcyh7IGNhY2hlIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdFJlZmVyZW5jZUZpbGUoeyBhcHA6IHRoaXMuYXBwLCByZWZlcmVuY2U6IGxpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMuZmlsZS5wYXRoIH0pO1xuICAgICAgICAgIGlmICghYXR0YWNobWVudEZpbGUgfHwgdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEZvbGRlclBhdGhzLmRlbGV0ZSgnJyk7XG4gICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGhcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmIChcbiAgICAgICFhdHRhY2htZW50Rm9sZGVyIHx8ICFhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMuZmlsZS5wYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGb2xkZXIsXG4gICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogS2VlcHMgYSBmb2xkZXIgZGVsZXRpb24gZnJvbSBkZXN0cm95aW5nIGFuIGF0dGFjaG1lbnQgYSBub3RlIG91dHNpZGUgdGhhdCBmb2xkZXIgc3RpbGwgcmVmZXJlbmNlcy5cbiAqXG4gKiBEZWxldGluZyBhIE5PVEUgaXMgYWxyZWFkeSBzYWZlOiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfSBkaXNjb3VudHMgdGhlIGRlbGV0ZWQgbm90ZSdzIG93biBiYWNrbGlua3MsIHNlZXNcbiAqIGFub3RoZXIgbm90ZSBzdGlsbCByZWZlcmVuY2luZyB0aGUgYXR0YWNobWVudCwgYW5kIGtlZXBzIGl0LiBEZWxldGluZyBhIEZPTERFUiB3YXMgbm90LCBiZWNhdXNlXG4gKiB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudH0gb25seSBsaXN0ZW5zIChgdmF1bHQub24oJ2RlbGV0ZScpYCkgYW5kIGJ5IHRoZSB0aW1lIGEgZm9sZGVyIGRlbGV0aW9uXG4gKiBpcyByZXBvcnRlZCBpdHMgY2hpbGRyZW4gYXJlIGFscmVhZHkgZ29uZS4gTm90aGluZyByZWFjdGl2ZSBjYW4gaGVscCwgc28gdGhpcyBjb21wb25lbnQgaW50ZXJjZXB0cyB0aGVcbiAqIGRlbGV0aW9uIHByaW1pdGl2ZXMgaW5zdGVhZDogYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgKHdoYXQgdGhlIGZpbGUtZXhwbG9yZXIgRGVsZXRlIGZsb3cgcmVhY2hlcyB0aHJvdWdoXG4gKiBgcHJvbXB0Rm9yRGVsZXRpb25gKSBwbHVzIHRoZSByYXcgYFZhdWx0LmRlbGV0ZWAgLyBgVmF1bHQudHJhc2hgIGEgcGx1Z2luIG1heSBjYWxsIGRpcmVjdGx5LlxuICpcbiAqIEEgZm9sZGVyIGRlbGV0aW9uIGlzIHNjYW5uZWQgZmlyc3QuIFdoZW4gbm90aGluZyBpbnNpZGUgaXQgaXMgc3RpbGwgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUg4oCUIHRoZVxuICogb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIGRlbGV0aW9ucyDigJQgdGhlIG9yaWdpbmFsIHJ1bnMgdW50b3VjaGVkLCBzbyB0aGUgbmF0aXZlIGJlaGF2aW9yIGlzIHByZXNlcnZlZFxuICogZXhhY3RseS4gT25seSB3aGVuIHNvbWV0aGluZyB3b3VsZCBiZSBsb3N0IGRvZXMgdGhpcyB0YWtlIG92ZXIsIHJlcGxheWluZyB0aGUgZGVsZXRpb24gdGhyb3VnaFxuICoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH06IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgZm9sZGVyIGdvZXMsIHRoZSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnRzIGFuZCB0aGVcbiAqIGZvbGRlcnMgaG9sZGluZyB0aGVtIHN0YXksIGFuZCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlIGZpcmVzLCBtaXJyb3JpbmcgdGhlIG5vdGUgY2FzZS5cbiAqXG4gKiBGaWxlcyBhcmUgbmV2ZXIgaW50ZXJjZXB0ZWQg4oCUIGRlbGV0aW5nIGEgZmlsZSBpcyB0aGUgdXNlciBuYW1pbmcgdGhhdCBmaWxlIGV4cGxpY2l0bHkuXG4gKi9cbmNsYXNzIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJvb3RzIG9mIHRoZSBmb2xkZXIgZGVsZXRpb25zIGN1cnJlbnRseSBiZWluZyByZXBsYXllZC4gVGhlIHJlcGxheSBkZWxldGVzIHRocm91Z2ggdGhlIFVOUEFUQ0hFRFxuICAgKiBvcmlnaW5hbCwgc28gaXQgY2Fubm90IHJlLWVudGVyIHRoaXMgY29tcG9uZW50IGRpcmVjdGx5IOKAlCBidXQgYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgaXRzZWxmIGNhbGxzIGRvd25cbiAgICogaW50byBgVmF1bHQudHJhc2hgIC8gYFZhdWx0LmRlbGV0ZWAsIHdoaWNoIGFyZSBwYXRjaGVkIHRvbywgYW5kIHJlLXNjYW5uaW5nIGEgc3VidHJlZSBhbHJlYWR5IGJlaW5nXG4gICAqIHdhbGtlZCBpcyBwdXJlIHdhc3RlLiBTY29wZWQgYnkgcGF0aCByYXRoZXIgdGhhbiBieSBhIGZsYWcgc28gdGhhdCBhbiB1bnJlbGF0ZWQgZm9sZGVyIGRlbGV0aW9uXG4gICAqIGludGVybGVhdmluZyBvbiBhbiBgYXdhaXRgIGlzIHN0aWxsIHByb3RlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwbGF5ZWRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICd0cmFzaEZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgZm9yY2VdLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgZm9yY2UpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgc3lzdGVtXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUsIHN5c3RlbSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIHBhdGhzIG9mIGV2ZXJ5IG5vdGUgaW5zaWRlIHRoZSBmb2xkZXIuIFRoZXkgYXJlIHRoZSBsaW5rIHNvdXJjZXMgdGhhdCBkaXNhcHBlYXIgYWxvbmcgd2l0aFxuICAgKiB0aGUgZm9sZGVyLCBzbyB0aGVpciBiYWNrbGlua3MgbXVzdCBub3Qga2VlcCBhbiBhdHRhY2htZW50IGFsaXZlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3REZWxldGVkTm90ZVBhdGhzKGZvbGRlcjogVEZvbGRlciwgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHMuYWRkKGNoaWxkLnBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVkTm90ZVBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBhdHRhY2htZW50cyBpbnNpZGUgdGhlIGZvbGRlciB0aGF0IGEgbm90ZSBvdXRzaWRlIGl0IHN0aWxsIHJlZmVyZW5jZXMsIGFuZCB3b3VsZCB0aGVyZWZvcmUgYmVcbiAgICogZGVzdHJveWVkIGJ5IGRlbGV0aW5nIHRoZSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBkZWxldGVkTm90ZVBhdGhzIC0gVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoIHRoZSBmb2xkZXIuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBhdHRhY2htZW50cyB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgZGVsZXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGRlbGV0ZWROb3RlUGF0aHM6IFNldDxzdHJpbmc+LFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZUZpbGVzOiBURmlsZVtdID0gW107XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKGNoaWxkLnBhdGgpID8/IGZhbHNlKSkge1xuICAgICAgICBjYW5kaWRhdGVGaWxlcy5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlRmlsZSBvZiBjYW5kaWRhdGVGaWxlcykge1xuICAgICAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBjYW5kaWRhdGVGaWxlIH0pO1xuICAgICAgZm9yIChjb25zdCBkZWxldGVkTm90ZVBhdGggb2YgZGVsZXRlZE5vdGVQYXRocykge1xuICAgICAgICBiYWNrbGlua3MuY2xlYXIoZGVsZXRlZE5vdGVQYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYWNrbGlua3MuY291bnQoKSAhPT0gMCkge1xuICAgICAgICBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMucHVzaChjYW5kaWRhdGVGaWxlLnBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVsZXRpb24gbmVlZHMgcHJvdGVjdGluZyBhbmQsIGlmIHNvLCByZXBsYWNlcyBpdCB3aXRoIGEgcHJvdGVjdGVkIHJlcGxheS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGlvbihcbiAgICBmaWxlOiBUQWJzdHJhY3RGaWxlLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zaG91bGRDb25zaWRlckZvbGRlcihmaWxlKSA/IHRoaXMucmVwbGF5Rm9sZGVyRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGRlbGV0ZUFic3RyYWN0RmlsZSkgOiBmYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGZvbGRlciB3aGlsZSBrZWVwaW5nIHdoYXRldmVyIGluc2lkZSBpdCBpcyBzdGlsbCByZWZlcmVuY2VkIGZyb20gb3V0c2lkZS5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gSW52b2tlcyB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIGRlbGV0ZUFic3RyYWN0RmlsZSAtIERlbGV0ZXMgYSBzaW5nbGUgYWJzdHJhY3QgZmlsZSB0aHJvdWdoIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QncyB1bnBhdGNoZWQgb3JpZ2luYWwuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVsZXRpb24gaXMgZG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVwbGF5Rm9sZGVyRGVsZXRpb24oXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgY29uc3QgZGVsZXRlZE5vdGVQYXRocyA9IHRoaXMuY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyLCBzZXR0aW5ncyk7XG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzID0gYXdhaXQgdGhpcy5maW5kU3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKGZvbGRlciwgZGVsZXRlZE5vdGVQYXRocywgc2V0dGluZ3MpO1xuXG4gICAgaWYgKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKGBOb3RoaW5nIHRvIHByb3RlY3QgaW4gJHtmb2xkZXIucGF0aH07IGRlbGV0aW5nIGl0IGFzIHVzdWFsLmApO1xuICAgICAgYXdhaXQgZmFsbGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRlbGV0ZVByb3RlY3Rpb24nKShcbiAgICAgIGBQcm90ZWN0aW5nICR7c3RpbGxVc2VkQXR0YWNobWVudFBhdGhzLmxlbmd0aC50b1N0cmluZygpfSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnQocykgZnJvbSB0aGUgZGVsZXRpb24gb2YgJHtmb2xkZXIucGF0aH06ICR7dG9Kc29uKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyl9YFxuICAgICk7XG5cbiAgICB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMuYWRkKGZvbGRlci5wYXRoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZGVsZXRlQWJzdHJhY3RGaWxlLFxuICAgICAgICBkZWxldGVkTm90ZVBhdGhzOiBbLi4uZGVsZXRlZE5vdGVQYXRoc10sXG4gICAgICAgIHBhdGhPckZpbGU6IGZvbGRlcixcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSB1c2VyIG5hbWVkIFRISVMgZm9sZGVyLCBzbyBpdCBnb2VzIGV2ZW4gdW5kZXIgYEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcGAg4oCUIHRoYXQgc2V0dGluZ1xuICAgICAgICAgKiBnb3Zlcm5zIGZvbGRlcnMgZW1wdGllZCBpbmNpZGVudGFsbHksIG5vdCB0aGUgb25lIGV4cGxpY2l0bHkgZGVsZXRlZC4gYGRlbGV0ZUlmTm90VXNlZGAgc3RpbGxcbiAgICAgICAgICogcmVmdXNlcyB0byByZW1vdmUgYW55IGZvbGRlciB3aG9zZSBjaGlsZCBoYWQgdG8gYmUga2VwdCwgd2hpY2ggaXMgdGhlIHByb3RlY3Rpb24gd2FudGVkIGhlcmUuXG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHRydWUsXG4gICAgICAgIC8qXG4gICAgICAgICAqIEEgbm90ZSB0aGF0IG90aGVycyBsaW5rIHRvIGlzIGRlbGV0ZWQgYXMgbm9ybWFsOyBPYnNpZGlhbiBsZWF2ZXMgdGhlIGRhbmdsaW5nIGxpbmsuIFByb3RlY3RpbmdcbiAgICAgICAgICogbm90ZXMgdG9vIHdvdWxkIG1ha2UgZGVsZXRpbmcgYSBmb2xkZXIgb2YgbGlua2VkLXRvIG5vdGVzIGltcG9zc2libGUuXG4gICAgICAgICAqL1xuICAgICAgICBzaG91bGRQcm90ZWN0SWZTdGlsbFVzZWQ6IChjYW5kaWRhdGVGaWxlKSA9PiAhKHNldHRpbmdzLmlzTm90ZT8uKGNhbmRpZGF0ZUZpbGUucGF0aCkgPz8gZmFsc2UpXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5yZXBsYXllZEZvbGRlclBhdGhzLmRlbGV0ZShmb2xkZXIucGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgZGVsZXRpb24gaXMgYSBmb2xkZXIgZGVsZXRpb24gdGhpcyBoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm90ZWN0aW5nLlxuICAgKlxuICAgKiBFdmVyeSBjaGVjayBoZXJlIGlzIHN5bmNocm9ub3VzIGFuZCBjaGVhcCwgc28gYSBmaWxlIGRlbGV0aW9uIOKAlCB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5IOKAlCBjb3N0cyBvbmVcbiAgICoge0BsaW5rIGlzRm9sZGVyfSBjYWxsIGFuZCByZWFjaGVzIHRoZSBvcmlnaW5hbCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgYmVpbmcgZGVsZXRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRlbGV0aW9uIHNob3VsZCBiZSBzY2FubmVkIGJlZm9yZSBpdCBydW5zLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRDb25zaWRlckZvbGRlcihmaWxlOiBUQWJzdHJhY3RGaWxlKTogZmlsZSBpcyBURm9sZGVyIHtcbiAgICBpZiAoIWlzRm9sZGVyKGZpbGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zIHx8IChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4oZmlsZS5wYXRoKSA/PyBmYWxzZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlcGxheWVkRm9sZGVyUGF0aCBvZiB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMpIHtcbiAgICAgIGlmIChpc0NoaWxkT3JTZWxmKHsgYXBwOiB0aGlzLmFwcCwgY2hpbGRQYXRoT3JGaWxlOiBmaWxlLnBhdGgsIHBhcmVudFBhdGhPckZpbGU6IHJlcGxheWVkRm9sZGVyUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuY2xhc3MgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZU1hbmFnZXIgPSBwYXJhbXMuZmlsZU1hbmFnZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtsaW5rVXBkYXRlc0hhbmRsZXJdLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RCb3VuZFxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoaGFzUGF0Y2hUb2tlbihvcmlnaW5hbE1ldGhvZCwgUEFUQ0hfVE9LRU4pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIgPSAobGlua1VwZGF0ZXMpID0+IHRoaXMud3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcywgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgLypcbiAgICAgICAqIFN1cHByZXNzaW5nIE9ic2lkaWFuJ3Mgb3duIGxpbmsgdXBkYXRlcyBpcyBOT1QgaWRlbXBvdGVudCwgc28gdHdvIGxpdmUgY29waWVzIG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgKiB3b3VsZCBmaWdodCBvdmVyIHRoZSBzYW1lIG1ldGhvZC4gYFBBVENIX1RPS0VOYCBpcyBhIGBTeW1ib2wuZm9yYCBhbmQgdGhlIHRva2VuIHJlZ2lzdHJ5IGlzXG4gICAgICAgKiBgZ2V0T2JzaWRpYW5MaWJTdGF0ZWAtYmFja2VkLCBzbyB0aGUgYXJiaXRyYXRpb24gc3BhbnMgaW5kZXBlbmRlbnRseSBidW5kbGVkIGNvcGllcyBvZiB0aGlzXG4gICAgICAgKiBsaWJyYXJ5OiB0aGUgZmlyc3QgcGF0Y2hlciBzdGF5cyBsaXZlLCBhIGNvcHkgdGhhdCBwYXRjaGVzIGFmdGVyd2FyZHMgc2VlcyB0aGUgdG9rZW4gb24gaXRzIG93blxuICAgICAgICogYG9yaWdpbmFsTWV0aG9kYCBhbmQgZGVmZXJzIHZpYSB0aGUgZ3VhcmQgYWJvdmUsIGFuZCBpdCB0YWtlcyBvdmVyIG9uIGl0cyBuZXh0IGNhbGwgb25jZSB0aGVcbiAgICAgICAqIGxlYWRlciB1bmxvYWRzIGFuZCB0aGUgdG9rZW4gaXMgZHJvcHBlZC5cbiAgICAgICAqXG4gICAgICAgKiBUaGlzIGFyYml0cmF0ZXMgdGhlIFBBVENIIG9ubHkuIFRoZSBjb21wb25lbnQncyBgdmF1bHQub24oJ3JlbmFtZScgfCAnZGVsZXRlJylgIGFuZFxuICAgICAgICogYG1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnKWAgbGlzdGVuZXJzIGhhdmUgbm8gZXF1aXZhbGVudCBndWFyZCDigJQgdGhlIHBsdWdpbi1yZWdpc3RyeSBlbGVjdGlvblxuICAgICAgICogdGhhdCB1c2VkIHRvIHByb3ZpZGUgb25lIHdlbnQgd2l0aCB0aGUgbXVsdGktcGx1Z2luIG1hY2hpbmVyeSDigJQgc28gdHdvIGxpdmUgY29waWVzIHdvdWxkIGJvdGhcbiAgICAgICAqIGhhbmRsZSBhbiBldmVudC4gV2l0aCBvbmUgb3duZXIgdGhhdCBjYW5ub3QgYXJpc2U7IGEgY29uc3VtZXIgdGhhdCBtdXN0IGd1YXJhbnRlZSBpdCByZWZ1c2VzIHRvXG4gICAgICAgKiBsb2FkIGJlc2lkZSBhIGNvbmZsaWN0aW5nIHZlcnNpb24uXG4gICAgICAgKlxuICAgICAgICogVGhhdCByZWZ1c2FsIHVzZWQgdG8gYmUgZGVzY3JpYmVkIGhlcmUgYXMgXCJhIHBsdWdpbidzIGpvYiByYXRoZXIgdGhhbiBhIGxpYnJhcnknc1wiLCB3aGljaCBpcyBub1xuICAgICAgICogbG9uZ2VyIHRydWUg4oCUIGBQbHVnaW5CYXNlLmdldFBsdWdpbkRlcGVuZGVuY2llc2AgaXMgd2hlcmUgYSBjb25zdW1lciBkZWNsYXJlcyBpdCwgYW5kIHRoZVxuICAgICAgICogYGFwaVZlcnNpb25SYW5nZWAgaXQgbmFtZXMgaXMgZXhhY3RseSB0aGUgY29uZmxpY3RpbmctdmVyc2lvbiBndWFyZC4gVGhlIGxpYnJhcnkgb3ducyB0aGVcbiAgICAgICAqIG1lY2hhbmlzbTsgdGhlIHBsdWdpbiBzdGlsbCBvd25zIHRoZSBkZWNpc2lvbiB0byB1c2UgaXQuXG4gICAgICAgKi9cbiAgICAgIHBhdGNoVG9rZW46IFBBVENIX1RPS0VOXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXM6IExpbmtVcGRhdGVbXSwgbGlua1VwZGF0ZXNIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaXNSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBsZXQgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpID0+IHtcbiAgICAgIGlzUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIC8qXG4gICAgICAgKiBBIHJlbmFtZSBwZXJmb3JtZWQgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGVcbiAgICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIGBBZHZhbmNlZCBOb3RlIENvbXBvc2VyYCdzIGZvbGRlciBtZXJnZSkgaXMgb3duZWQgYnkgdGhhdFxuICAgICAgICogdHJhbnNhY3Rpb24sIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBpdHMgb3duIGxpbmsgY29uc2lzdGVuY3kuIFRoaXMgaGFuZGxlciBkZWxpYmVyYXRlbHkgZG9lc1xuICAgICAgICogTk9UIHJld3JpdGUgbGlua3MgZm9yIGl0LCBzbyBzdXBwcmVzc2luZyBPYnNpZGlhbidzIG5hdGl2ZSBsaW5rIHVwZGF0ZSBiZWxvdyB3b3VsZCBsZWF2ZSB0aGVcbiAgICAgICAqIGxpbmtzIGRhbmdsaW5nLiBMZXQgdGhlIG5hdGl2ZSB1cGRhdGUgcHJvY2VlZCB1bnRvdWNoZWQuIFNlZVxuICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWFkdmFuY2VkLW5vdGUtY29tcG9zZXIvaXNzdWVzLzE0Ni5cbiAgICAgICAqL1xuICAgICAgaWYgKGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgZmlsZS5wYXRoKSB8fCBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG9sZFBhdGgpKSB7XG4gICAgICAgIGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYXBwLnZhdWx0Lm9mZnJlZihldmVudFJlZik7XG4gICAgfVxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBtaWdodCBjaGFuZ2VkIGluIGByZW5hbWVgIGV2ZW50IGhhbmRsZXIuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgICBpZiAoIWlzUmVuYW1lQ2FsbGVkIHx8ICFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzIHx8IGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbHRlckluUGxhY2UoXG4gICAgICBsaW5rVXBkYXRlcyxcbiAgICAgIChsaW5rVXBkYXRlKSA9PiB7XG4gICAgICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiBzb3VyY2UgZmlsZSAke2xpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6cnVuQXN5bmNMaW5rVXBkYXRlJykoXG4gICAgICAgICAgICBgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2YgcmVzb2x2ZWQgZmlsZSAke2xpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5hcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpICE9PSBudWxsICYmICFoYXNCYWNrbGlua0NhY2hlUGx1Z2luKHRoaXMuYXBwKVxuICAgICAgICAgICYmIChsaW5rVXBkYXRlLnNvdXJjZUZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04gfHwgbGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgSGFuZGxlZFJlbmFtZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIYW5kbGVkUmVuYW1lS2V5PigpO1xuXG4gIHB1YmxpYyBhZGQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLmRlbGV0ZSh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXMob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxIYW5kbGVkUmVuYW1lS2V5PiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXlUb1N0cmluZyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xuICB9XG59XG5cbmNsYXNzIE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLnByZXZpb3VzQ2FjaGUgPSBwYXJhbXMucHJldmlvdXNDYWNoZTtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlTWV0YWRhdGFEZWxldGVkJykoYFNraXBwaW5nIG1ldGFkYXRhIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTWFya2Rvd25GaWxlKHRoaXMuZmlsZSkgJiYgdGhpcy5wcmV2aW91c0NhY2hlKSB7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLnNldCh0aGlzLmZpbGUucGF0aCwgdGhpcy5wcmV2aW91c0NhY2hlKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMgPSBwYXJhbXMuaGFuZGxlZFJlbmFtZXM7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwID0gcGFyYW1zLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPz8gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwO1xuICAgIHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPSBwYXJhbXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG4gICAgdGhpcy5uZXdQYXRoID0gcGFyYW1zLm5ld1BhdGg7XG4gICAgdGhpcy5vbGRDYWNoZSA9IHBhcmFtcy5vbGRDYWNoZTtcbiAgICB0aGlzLm9sZFBhdGggPSBwYXJhbXMub2xkUGF0aDtcbiAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAgPSBwYXJhbXMub2xkUGF0aEJhY2tsaW5rc01hcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vbGRQYXRoID09PSB0aGlzLm5ld1BhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgLypcbiAgICAgKiBUaGUgcmVuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoaXMgaGFuZGxlciBpcyB2ZXJ5IGxpa2VseSBzdGlsbCBpbnNpZGUgT2JzaWRpYW4ncyBvd25cbiAgICAgKiBgRmlsZU1hbmFnZXIucnVuQXN5bmNMaW5rVXBkYXRlYCBjeWNsZSwgd2hpY2ggaXMgYWJvdXQgdG8gZGVjaWRlIOKAlCBzeW5jaHJvbm91c2x5IOKAlCB3aGljaCBsaW5rcyB0b1xuICAgICAqIHJld3JpdGUsIGJ5IHJlLXJlc29sdmluZyBlYWNoIG9uZS4gRXZlcnl0aGluZyBiZWxvdyB0ZW1wb3JhcmlseSByZWdpc3RlcnMgYSBwaGFudG9tIGZpbGUgYXQgdGhlXG4gICAgICogb2xkIHBhdGggKGByZWdpc3RlckZpbGVzYCwgZGlyZWN0bHkgaGVyZSBhbmQgaW5zaWRlIGBSZW5hbWVNYXBgKSBhbmQgaG9sZHMgaXQgYWNyb3NzIGFuIGBhd2FpdGA7XG4gICAgICogc2VlbiBtaWQtZGVjaXNpb24sIHRoYXQgcGhhbnRvbSBtYWtlcyB0aGUgb2xkIHBhdGggc3RpbGwgcmVzb2x2ZSwgc28gT2JzaWRpYW4gY29uY2x1ZGVzIG5vdGhpbmdcbiAgICAgKiBjaGFuZ2VkIGFuZCByZXdyaXRlcyBub3RoaW5nLiBTdGFuZGluZyBpbnZhcmlhbnQ6IG5ldmVyIHRvdWNoIHRoZSB2YXVsdCBpbmRleCB3aGlsZSBPYnNpZGlhbiBpc1xuICAgICAqIG1pZC1kZWNpc2lvbi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbi9pc3N1ZXMvNDcuXG4gICAgICovXG4gICAgYXdhaXQgd2FpdEZvclBlbmRpbmdMaW5rVXBkYXRlcyh0aGlzLmFwcCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgYXdhaXQgdGhpcy5jb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIC8vIFRoZSByZWZyZXNoZWQgYmFja2xpbmtzIGZlZWQgYG9sZFBhdGhCYWNrbGlua3NNYXBgLCB3aGljaCBvbmx5IHRoZSBsaW5rLXJld3JpdGUgc3RlcHMgYmVsb3cgcmVhZCwgYW5kIHRob3NlIGFyZSBnYXRlZCBvbiB0aGUgc2FtZSBmbGFnLlxuICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaExpbmtzKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlQ2FzZUNvbGxpc2lvbigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgY29uc3QgcGx1Z2luTm90aWNlQ29tcG9uZW50ID0gdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgICBjb25zdCByZW5hbWVkRmlsZVBhdGhzID0gZ2V0T2JzaWRpYW5MaWJTdGF0ZSgncmVuYW1lZEZpbGVQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcbiAgICBjb25zdCByZW5hbWVkTGlua3MgPSBnZXRPYnNpZGlhbkxpYlN0YXRlKCdyZW5hbWVkTGlua1BhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbmFtZU1hcCA9IG5ldyBSZW5hbWVNYXAoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlbmFtZU1hcC5maWxsKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgY29uc3QgY29tYmluZWRCYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcblxuICAgICAgLy8gQmFja2xpbmtzIGFyZSBvbmx5IGNvbnN1bWVkIGJ5IHRoZSBsaW5rLXJld3JpdGUgc3RlcHMgYmVsb3csIHdoaWNoIGFyZSBnYXRlZCBvblxuICAgICAgLy8gYHNob3VsZEhhbmRsZVJlbmFtZXNgLiBTa2lwIGdhdGhlcmluZyB0aGVtIChhIGJhY2tsaW5rIGZldGNoIHBlciBhdHRhY2htZW50KSBvbiBhIG1vdmUtb25seSByZW5hbWUuXG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZW5hbWVNYXAuaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXR0YWNobWVudE9sZFBhdGggb2YgcmVuYW1lTWFwLmtleXMoKSkge1xuICAgICAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRPbGRQYXRoIH0pO1xuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3MuZGF0YTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgICBwYXRoOiBhdHRhY2htZW50T2xkUGF0aCxcbiAgICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGhdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoICE9PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICBjb25zdCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKG9sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudFBhdGgsIGZpeGVkTmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudFBhdGgpKSB7XG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGRpcm5hbWUob2xkQXR0YWNobWVudFBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjbGVhbnVwRW1wdHlGb2xkZXJzKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICAgIGZvbGRlclBhdGhzOiBbLi4ucGFyZW50Rm9sZGVyUGF0aHNdXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgLypcbiAgICAgICAqIFRoZSBhdHRhY2htZW50IG1vdmUgYWJvdmUgcnVucyByZWdhcmRsZXNzIG9mIGBzaG91bGRIYW5kbGVSZW5hbWVzYCAodGhhdCBpcyB0aGUgcG9pbnQgb2YgZGVjb3VwbGluZ1xuICAgICAgICogXCJNb3ZlIGF0dGFjaG1lbnRzIHdpdGggbm90ZVwiIGZyb20gXCJVcGRhdGUgbGlua3NcIikuIFRoZSByZW1haW5pbmcgc3RlcHMgb25seSByZXdyaXRlIGxpbmtzLCBzbyBza2lwXG4gICAgICAgKiB0aGVtIHdoZW4gbGluayB1cGRhdGVzIGFyZSBkaXNhYmxlZDsgdGhlIGBmaW5hbGx5YCBibG9jayBiZWxvdyBzdGlsbCBydW5zLlxuICAgICAgICovXG4gICAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICogQSByZXN1bWVkIHJlbmFtZSBicmluZ3MgaXRzIG93biBzbmFwc2hvdCBhbG9uZy4gTWVyZ2UgaXQgSU5UTyB0aGUgY3VycmVudCBvbmUgcmF0aGVyIHRoYW5cbiAgICAgICAqIGNvbmNhdGVuYXRpbmcgdGhlIHR3bzogYSBmaWxlIG5hbWVkIGJ5IGJvdGggd291bGQgb3RoZXJ3aXNlIGJlIG9wZW5lZCBhbmQgcmV3cml0dGVuIHR3aWNlLCB3aGljaCBpc1xuICAgICAgICogdGhlIHZlcnkgdGhpbmcgYSBjb21iaW5lZCBzbmFwc2hvdCBleGlzdHMgdG8gYXZvaWQuIFRoZSBjdXJyZW50IHJlbmFtZSdzIGVudHJ5IHdpbnMgYSBrZXkgY29sbGlzaW9uLFxuICAgICAgICogYmVjYXVzZSBpdCBkZXNjcmliZXMgd2hlcmUgdGhlIHRhcmdldCBpcyBub3cuXG4gICAgICAgKi9cbiAgICAgIGZvciAoY29uc3QgW2ludGVycnVwdGVkQmFja2xpbmtQYXRoLCBpbnRlcnJ1cHRlZExpbmtLZXlUb1BhdGhNYXBdIG9mIHRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCkge1xuICAgICAgICBjb25zdCBsaW5rS2V5VG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KGludGVycnVwdGVkQmFja2xpbmtQYXRoKTtcbiAgICAgICAgaWYgKCFsaW5rS2V5VG9QYXRoTWFwKSB7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAuc2V0KGludGVycnVwdGVkQmFja2xpbmtQYXRoLCBpbnRlcnJ1cHRlZExpbmtLZXlUb1BhdGhNYXApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBbbGlua0tleSwgb2xkVGFyZ2V0UGF0aF0gb2YgaW50ZXJydXB0ZWRMaW5rS2V5VG9QYXRoTWFwKSB7XG4gICAgICAgICAgaWYgKCFsaW5rS2V5VG9QYXRoTWFwLmhhcyhsaW5rS2V5KSkge1xuICAgICAgICAgICAgbGlua0tleVRvUGF0aE1hcC5zZXQobGlua0tleSwgb2xkVGFyZ2V0UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmtJbmRleGVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIGF3YWl0IGVkaXRCYWNrbGlua3NTbmFwc2hvdChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zPHN0cmluZz4+KHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZWZlcmVuY2VDb252ZXJ0ZXI6ICh7IHBheWxvYWQ6IG9sZEF0dGFjaG1lbnRQYXRoLCByZWZlcmVuY2U6IGxpbmssIHNvdXJjZVBhdGg6IG5ld0JhY2tsaW5rUGF0aCB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgbGlua0luZGV4ID0gKGxpbmtJbmRleGVzLmdldChuZXdCYWNrbGlua1BhdGgpID8/IDApICsgMTtcbiAgICAgICAgICBsaW5rSW5kZXhlcy5zZXQobmV3QmFja2xpbmtQYXRoLCBsaW5rSW5kZXgpO1xuXG4gICAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIEEgbGluayB0aGF0IGlzIG5vdCBpbiB0aGUgc25hcHNob3Qgd2FzIGVpdGhlciBuZXZlciBvdXJzIHRvIHJld3JpdGUsIG9yIHdhcyBhbHJlYWR5XG4gICAgICAgICAgICAgKiByZXdyaXR0ZW4gYnkgc29tZW9uZSBlbHNlIChsZWF2aW5nIGl0IGNvcnJlY3QpLiBFaXRoZXIgd2F5IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gLVxuICAgICAgICAgICAgICogYnV0IGxvZyBpdCwgYmVjYXVzZSBhIHNpbGVudCBza2lwIGhlcmUgaXMgZXhhY3RseSBob3dcbiAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbi9pc3N1ZXMvNjAgc3RheWVkXG4gICAgICAgICAgICAgKiBpbnZpc2libGU6IGV2ZXJ5IHNraXBwZWQgbGluayBsZWZ0IGEgYnJva2VuIGVtYmVkIGFuZCByZXBvcnRlZCBub3RoaW5nLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnVwZGF0ZUJhY2tsaW5rcycpKFxuICAgICAgICAgICAgICBgTm8gc25hcHNob3QgZW50cnkgZm9yIGxpbmsgJHt0b0pzb24obGluayl9IGluICR7bmV3QmFja2xpbmtQYXRofTsgbGVhdmluZyBpdCB1bmNoYW5nZWQuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IHJlbmFtZU1hcC5nZXQob2xkQXR0YWNobWVudFBhdGgpID8/IG9sZEF0dGFjaG1lbnRQYXRoO1xuXG4gICAgICAgICAgcmVuYW1lZEZpbGVQYXRocy5hZGQobmV3QmFja2xpbmtQYXRoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuYWRkKGAke25ld0JhY2tsaW5rUGF0aH0vLyR7U3RyaW5nKGxpbmtJbmRleCl9YCk7XG5cbiAgICAgICAgICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua1BhcmFtcz4oe1xuICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgb2xkVGFyZ2V0UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICByZWZlcmVuY2U6IGxpbmssXG4gICAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgLy8gVGhlIGNvbnZlcnRlciBsb2dzIGV2ZXJ5IGxpbmsgaXQgZGVjbGluZXMsIHNvIGl0IGhhcyB0byBiZSBzaG93biB0aGUgb25lcyB0aGUgc25hcHNob3QgZG9lcyBub3QgbmFtZS5cbiAgICAgICAgc2hvdWxkVmlzaXRVbm1hdGNoZWRSZWZlcmVuY2VzOiB0cnVlLFxuICAgICAgICBzbmFwc2hvdDogY29tYmluZWRCYWNrbGlua3NNYXBcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgaWYgKGlzTm90ZSh0aGlzLm5ld1BhdGgpKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZVJlZmVyZW5jZXNJbkZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZVJlZmVyZW5jZXNJbkZpbGVQYXJhbXM+KHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlc1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZXRGaWxlT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoIH0pKSB7XG4gICAgICAgIGxldCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5zZXQodGhpcy5uZXdQYXRoLCBpbnRlcnJ1cHRlZFJlbmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lcy5wdXNoKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGhcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IG9ycGhhbktleXMgPSBbLi4udGhpcy5oYW5kbGVkUmVuYW1lcy5rZXlzKCldO1xuICAgICAgYWRkVG9RdWV1ZSh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3Qgb3JwaGFuS2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9ycGhhbktleS5vbGRQYXRoLCBvcnBoYW5LZXkubmV3UGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmFtZWRMaW5rcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVuYW1lRGVsZXRlSGFuZGxlci51cGRhdGVkTGlua3MsIHsgZmlsZXNDb3VudDogcmVuYW1lZEZpbGVQYXRocy5zaXplLCBsaW5rc0NvdW50OiByZW5hbWVkTGlua3Muc2l6ZSB9KSk7XG4gICAgICAgICAgcmVuYW1lZEZpbGVQYXRocy5jbGVhcigpO1xuICAgICAgICAgIHJlbmFtZWRMaW5rcy5jbGVhcigpO1xuICAgICAgICB9LFxuICAgICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlT3JwaGFuZWRSZW5hbWVzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5vbGRQYXRoKTtcbiAgICBpZiAoIWludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmRlbGV0ZSh0aGlzLm9sZFBhdGgpO1xuICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICBhd2FpdCBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcDogaW50ZXJydXB0ZWRSZW5hbWUuY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgICBuZXdQYXRoOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICBvbGRQYXRoOiBpbnRlcnJ1cHRlZFJlbmFtZS5vbGRQYXRoLFxuICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pLmhhbmRsZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2FzZUNvbGxpc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWdldERhdGFBZGFwdGVyRXgodGhpcy5hcHApLmluc2Vuc2l0aXZlIHx8IHRoaXMub2xkUGF0aC50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLm5ld1BhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBqb2luKGRpcm5hbWUodGhpcy5uZXdQYXRoKSwgYF9fdGVtcF9fJHtiYXNlbmFtZSh0aGlzLm5ld1BhdGgpfWApO1xuICAgIGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZCh0aGlzLm5ld1BhdGgsIHRlbXBvcmFyeVBhdGgpO1xuXG4gICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICBuZXdQYXRoOiB0ZW1wb3JhcnlQYXRoLFxuICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcblxuICAgIGF3YWl0IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUoZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRlbXBvcmFyeVBhdGggfSksIHRoaXMubmV3UGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hMaW5rcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmYWtlT2xkRmlsZSA9IGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgICBsZXQgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICAgIHtcbiAgICAgIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKHRoaXMuYXBwLCBbZmFrZU9sZEZpbGVdKTtcbiAgICAgIGNvbnN0IGZha2VPbGRGaWxlQmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBmYWtlT2xkRmlsZSB9KTtcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQgPSBmYWtlT2xkRmlsZUJhY2tsaW5rcy5kYXRhO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2JhY2tsaW5rUGF0aCwgcmVmcmVzaGVkTGlua3NdIG9mIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQpIHtcbiAgICAgIGxldCBvbGRMaW5rcyA9IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5nZXQoYmFja2xpbmtQYXRoKTtcbiAgICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgICAgb2xkTGlua3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIHJlZnJlc2hlZExpbmtzKSB7XG4gICAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW5hbWVIYW5kbGVkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBuZXdQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmFkZChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVNYXAge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5uZXdQYXRoID0gcGFyYW1zLm5ld1BhdGg7XG4gICAgdGhpcy5vbGRQYXRoTGlua3MgPSB0aGlzLm9sZENhY2hlID8gZ2V0UmVmZXJlbmNlcyh7IGNhY2hlOiB0aGlzLm9sZENhY2hlIH0pIDogW107XG4gIH1cblxuICBwdWJsaWMgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZW50cmllcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHRoaXMubWFwLnNldCh0aGlzLm9sZFBhdGgsIHRoaXMubmV3UGF0aCk7XG5cbiAgICBpZiAoIWlzTm90ZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT2JzaWRpYW4gZG9lcyBub3QgaW5kZXggYSBjYW52YXMgZmlsZSBpbnRvIHRoZSBtZXRhZGF0YSBjYWNoZS5cbiAgICAvLyBUaGUgY2FjaGUtZGVyaXZlZCBgb2xkUGF0aExpbmtzYCBpcyBlbXB0eSBmb3IgYSBjYW52YXMsIGhpZGluZyBpdHMgZW1iZWRkZWQgYXR0YWNobWVudHMuXG4gICAgLy8gUmVhZGluZyB0aGUgY2FudmFzIHJlZmVyZW5jZXMgZGlyZWN0bHkgbW92ZXMgdGhlbSB3aXRoIHRoZSBjYW52YXMgKG1pcnJvcmluZyBub3RlIGJlaGF2aW9yKS5cbiAgICAvLyBUaGUgZmlsZSBhbHJlYWR5IGxpdmVzIGF0IHRoZSBuZXcgcGF0aCBhZnRlciB0aGUgcmVuYW1lLCBzbyByZWFkIHRoZSByZWZlcmVuY2VzIGZyb20gdGhlcmUuXG4gICAgaWYgKGlzQ2FudmFzRmlsZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICBjb25zdCBjYW52YXNSZWZlcmVuY2VzID0gYXdhaXQgZ2V0Q2FudmFzUmVmZXJlbmNlcyh0aGlzLmFwcCwgdGhpcy5uZXdQYXRoKTtcbiAgICAgIHRoaXMub2xkUGF0aExpbmtzLnB1c2goLi4uY2FudmFzUmVmZXJlbmNlcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgY29uc3Qgb2xkRmlsZSA9IGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IHRoaXMuZ2V0T2xkQXR0YWNobWVudEZvbGRlclBhdGgob2xkRmlsZSk7XG5cbiAgICBjb25zdCBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXJcbiAgICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aFxuICAgICAgfSlcbiAgICAgIDogb2xkQXR0YWNobWVudEZvbGRlclBhdGg7XG5cbiAgICBjb25zdCBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPSBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy8nO1xuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZvbGRlcjogb2xkQXR0YWNobWVudEZvbGRlclBhdGggfSk7XG5cbiAgICBpZiAoIW9sZEF0dGFjaG1lbnRGb2xkZXIgfHwgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gICAgaWYgKFxuICAgICAgYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcih7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICBwYXRoOiB0aGlzLm9sZFBhdGhcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4ob2xkQXR0YWNobWVudEZvbGRlciwgKG9sZEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgaWYgKGlzRmlsZShvbGRBdHRhY2htZW50RmlsZSkpIHtcbiAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIHRoaXMub2xkUGF0aExpbmtzKSB7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0UmVmZXJlbmNlRmlsZSh7IGFwcDogdGhpcy5hcHAsIHJlZmVyZW5jZTogb2xkUGF0aExpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCB9KTtcbiAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSB8fCAoIWlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCAmJiAhb2xkQXR0YWNobWVudEZpbGUucGF0aC5zdGFydHNXaXRoKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4ob2xkQXR0YWNobWVudEJhY2tsaW5rcy5rZXlzKCkpO1xuICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm9sZFBhdGgpO1xuICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm5ld1BhdGgpO1xuICAgICAgICBpZiAoa2V5cy5zaXplID09PSAwKSB7XG4gICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvbGRBdHRhY2htZW50RmlsZSBvZiBvbGRBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChvbGRBdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld0F0dGFjaG1lbnRGaWxlUGF0aDogc3RyaW5nO1xuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudEZpbGUsXG4gICAgICAgICAgb2xkTm90ZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA/IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggOiByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgb2xkQXR0YWNobWVudEZpbGUucGF0aCk7XG4gICAgICAgIGNvbnN0IG5ld0ZvbGRlciA9IGpvaW4obmV3QXR0YWNobWVudEZvbGRlclBhdGgsIGRpcm5hbWUocmVsYXRpdmVQYXRoKSk7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGpvaW4obmV3Rm9sZGVyLCBvbGRBdHRhY2htZW50RmlsZS5uYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggPT09IG5ld0F0dGFjaG1lbnRGaWxlUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRGaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRGaWxlUGF0aCB9KTtcbiAgICAgICAgaWYgKG5ld0F0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpmaWxsUmVuYW1lTWFwJykoYFJlbW92aW5nIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnQgJHtuZXdBdHRhY2htZW50RmlsZS5wYXRofS5gKTtcbiAgICAgICAgICBhd2FpdCB0cmFzaFNhZmUodGhpcy5hcHAsIG5ld0F0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdG9yeSA9IGRpcm5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGJhc2VuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCwgZXh0ZW5zaW9uKTtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gdGhpcy5hcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKGRpcmVjdG9yeSwgYmFzZU5hbWUpLCBleHRlbnNpb24uc2xpY2UoMSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXAuc2V0KG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChvbGRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1hcC5nZXQob2xkUGF0aCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEJhY2tsaW5rc01hcChwYXJhbXM6IFJlbmFtZU1hcEluaXRCYWNrbGlua3NNYXBQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7XG4gICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgIHBhdGgsXG4gICAgICBzaW5nbGVCYWNrbGlua3NNYXBcbiAgICB9ID0gcGFyYW1zO1xuICAgIGJ1aWxkQmFja2xpbmtzU25hcHNob3Q8c3RyaW5nPih7XG4gICAgICBiYWNrbGlua3M6IHNpbmdsZUJhY2tsaW5rc01hcCxcbiAgICAgIHBhdGhSZW1hcHBlcjogKGJhY2tsaW5rUGF0aCkgPT4gdGhpcy5tYXAuZ2V0KGJhY2tsaW5rUGF0aCkgPz8gYmFja2xpbmtQYXRoLFxuICAgICAgcGF5bG9hZFByb3ZpZGVyOiAoKSA9PiBwYXRoLFxuICAgICAgcmVmZXJlbmNlSWRlbnRpdHlLZXlQcm92aWRlcjogZ2V0UmVmZXJlbmNlSWRlbnRpdHlLZXksXG4gICAgICB0YXJnZXQ6IGNvbWJpbmVkQmFja2xpbmtzTWFwXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0UmVmZXJlbmNlRmlsZSh7IGFwcDogdGhpcy5hcHAsIHJlZmVyZW5jZTogb2xkUGF0aExpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCB9KTtcbiAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+KFtbdGhpcy5uZXdQYXRoLCBbb2xkUGF0aExpbmtdXV0pO1xuICAgICAgdGhpcy5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsXG4gICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYmFja2xpbmtzTWFwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlOiBURmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtvbGRGaWxlXSk7XG4gICAgdXNpbmcgX2NhY2hlUmVnaXN0cmF0aW9uID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWRcbiAgICAgID8gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBjYWNoZTogdGhpcy5vbGRDYWNoZSwgcGF0aE9yRmlsZTogb2xkRmlsZSB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzZXR0aW5ncyB0aGUgaGFuZGxlciBydW5zIHdpdGguXG4gKlxuICogVGhlcmUgaXMgZXhhY3RseSBvbmUgY29udHJpYnV0b3I6IHRoZSBjb21wb25lbnQncyBvd24gYHNldHRpbmdzQnVpbGRlcmAuIEVhcmxpZXIgdmVyc2lvbnMgYWdncmVnYXRlZCBhXG4gKiByZWdpc3RyeSBvZiBjb250cmlidXRvcnMgYW5kIE9SLW1lcmdlZCB0aGVpciBhbnN3ZXJzLCBiZWNhdXNlIHNldmVyYWwgcGx1Z2lucyBjb3VsZCBlYWNoIHJlZ2lzdGVyIGFcbiAqIGhhbmRsZXIgYWdhaW5zdCB0aGUgb25lIHNoYXJlZCB2YXVsdC4gVGhleSBubyBsb25nZXIgZG8sIHNvIHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgcXVlc3Rpb24gb2Ygd2hvc2VcbiAqIHNldHRpbmcgd2lucy5cbiAqXG4gKiBXaGF0IHJlbWFpbnMgaXMgZGVmYXVsdGluZzogdGhlIGJ1aWxkZXIgcmV0dXJucyBhIGBQYXJ0aWFsYCwgc28gdGhlIHR3byBwcmVkaWNhdGVzIGFuZCB0aGUgZW1wdHktZm9sZGVyXG4gKiBiZWhhdmlvciBuZWVkIGEgdmFsdWUgd2hlbiBpdCBkb2VzIG5vdCBzdXBwbHkgb25lLlxuICovXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPikge1xuICAgIHRoaXMuc2V0dGluZ3NCdWlsZGVyID0gc2V0dGluZ3NCdWlsZGVyO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3QgYnVpbHRTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJ1aWx0U2V0dGluZ3MsXG4gICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBidWlsdFNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgaXNOb3RlOiAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBidWlsdFNldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IGlzTm90ZShwYXRoKSxcbiAgICAgIGlzUGF0aElnbm9yZWQ6IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGJ1aWx0U2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHBhdGgpID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCBoYW5kbGVzIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqIEl0IGxpc3RlbnMgdG8gcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGFuZCB1cGRhdGVzIGxpbmtzIGFjY29yZGluZ2x5LlxuICogSXQgYWxzbyBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBjYXNlLW9ubHkgcmVuYW1lcyBhbmQgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgY29tcG9uZW50IHdob3NlIHNpZ25hbCBjYW5jZWxzIGluLWZsaWdodCByZW5hbWUgb3BlcmF0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgd2hvc2UgbGlua3MgYXJlIHVwZGF0ZWQgZHVyaW5nIGEgcmVuYW1lL21vdmUsXG4gICAqIHdpdGggdGhlIHJ1bm5pbmcgY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gYG51bGxgLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgdXBkYXRlZCBsaW5rcyB0byB0aGUgdXNlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBsb2NrIGNvbXBvbmVudCB1c2VkIHRvIGd1YXJkIGxpbmsgdXBkYXRlcywgb3IgYG51bGxgIGlmIG5vbmUgaXMgdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGlzIHBsdWdpbidzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG1hbmFnZXIgdGhhdCBhZ2dyZWdhdGVzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncyBhY3Jvc3MgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lcyA9IG5ldyBIYW5kbGVkUmVuYW1lcygpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudCA9IHBhcmFtcy5hYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA/PyBudWxsO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBwYXJhbXMuc2V0dGluZ3NCdWlsZGVyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gbmV3IFNldHRpbmdzTWFuYWdlcih0aGlzLnNldHRpbmdzQnVpbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIHRoaXMuaGFuZGxlUmVuYW1lLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiB0aGlzLmFwcC5maWxlTWFuYWdlcixcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURlbGV0ZShmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgRGVsZXRlSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVEZWxldGUsIHsgZmlsZVBhdGg6IGZpbGUucGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXRhZGF0YURlbGV0ZWQoZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gICAgbmV3IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIoe1xuICAgICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAsXG4gICAgICBmaWxlLFxuICAgICAgcHJldmlvdXNDYWNoZSxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVuYW1lKGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghaXNGaWxlKGZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UGF0aCA9IGZpbGUucGF0aDtcblxuICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YCk7XG4gICAgaWYgKHRoaXMuaGFuZGxlZFJlbmFtZXMuaGFzKG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgcmVuYW1lIG9jY3VycmluZyBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIGBBZHZhbmNlZCBOb3RlIENvbXBvc2VyYCdzIGZvbGRlciBtZXJnZSkgaXMgb3JjaGVzdHJhdGVkIGJ5IHRoYXRcbiAgICAgKiB0cmFuc2FjdGlvbidzIG93bmVyLCB3aGljaCB0YWtlcyByZXNwb25zaWJpbGl0eSBmb3IgaXRzIG93biBsaW5rIGNvbnNpc3RlbmN5LiBSZWFjdGluZyB0byBpdFxuICAgICAqIGhlcmUgd291bGQgKGEpIHBlcnR1cmIgT2JzaWRpYW4ncyBuYXRpdmUgcG9zdC1yZW5hbWUgbGluayB1cGRhdGUgYW5kIGxlYXZlIGxpbmtzIGRhbmdsaW5nLCBhbmRcbiAgICAgKiAoYikgY29sbGlkZSB3aXRoIHRoZSBmb3JlaWduIHRyYW5zYWN0aW9uIOKAlCBhbiBhc3luYyBhYm9ydCBmcm9tIHRoaXMgaGFuZGxlciBhYm9ydHMgYW5cbiAgICAgKiBhbHJlYWR5LWNvbW1pdHRlZCB0cmFuc2FjdGlvbiwgdGhyb3dpbmcgXCJDYW5ub3Qgcm9sbCBiYWNrIGEgY29tbWl0dGVkIHRyYW5zYWN0aW9uXCIuIFRoaXNcbiAgICAgKiBoYW5kbGVyJ3Mgb3duIGF0dGFjaG1lbnQgbW92ZXMgYXJlIGFscmVhZHkgZXhjbHVkZWQgYWJvdmUgdmlhIGBoYW5kbGVkUmVuYW1lc2AsIHNvIGEgbG9jayBzdGlsbFxuICAgICAqIGhlbGQgaGVyZSBhbHdheXMgYmVsb25ncyB0byBhIGZvcmVpZ24gb3BlcmF0aW9uOyBzdGF5IG91dCBvZiBpdHMgd2F5LiBTZWVcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAqL1xuICAgIGlmIChpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG9sZFBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoXG4gICAgICAgIGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH0gYXMgaXQgb2NjdXJzIGluc2lkZSBhIGZvcmVpZ24gbG9ja2VkIHRyYW5zYWN0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOb09wUmVuYW1lKHNldHRpbmdzLCBvbGRQYXRoLCBuZXdQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBpcyBub3QgYSBub3RlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdpdGggbGluayB1cGRhdGVzIGRpc2FibGVkLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2Ygb2xkIHBhdGggJHtvbGRQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG5ldyBwYXRoICR7bmV3UGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRDYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUob2xkUGF0aCkgPz8gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgICBjb25zdCBvbGRQYXRoQmFja2xpbmtzTWFwID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCh0aGlzLmFwcCwgb2xkUGF0aCkuZGF0YTtcbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50LmFib3J0U2lnbmFsLFxuICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IChhYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgICBuZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVSZW5hbWUsIHsgbmV3UGF0aCwgb2xkUGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpdGggbGluayByZXdyaXRpbmcgb2ZmLCB0aGUgaGFuZGxlcidzIG9ubHkgcmVtYWluaW5nIGpvYnMgYXJlIG1vdmluZyBhIE5PVEUncyBhdHRhY2htZW50cyBhbmQgcHJ1bmluZ1xuICAgKiB0aGUgZm9sZGVyIGEgbW92ZWQgZmlsZSB2YWNhdGVkLiBBIG5vbi1ub3RlIHJlbmFtZSBuZWVkcyBuZWl0aGVyIHdoZW4gZW1wdHkgZm9sZGVycyBhcmUga2VwdCwgc28gdGhlcmVcbiAgICogaXMgbm90aGluZyB0byBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSBmaWxlIHdhcyByZW5hbWVkIGZyb20uXG4gICAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIHBhdGggdGhlIGZpbGUgd2FzIHJlbmFtZWQgdG8uXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBoYW5kbGVyIHdvdWxkIGRvIG5vIHdvcmsgZm9yIHRoaXMgcmVuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc05vT3BSZW5hbWUoc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXNcbiAgICAgICYmICEoc2V0dGluZ3MuaXNOb3RlPy4ob2xkUGF0aCkgPz8gZmFsc2UpXG4gICAgICAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKG5ld1BhdGgpID8/IGZhbHNlKVxuICAgICAgJiYgKHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwKSA9PT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICB9XG59XG5cbi8qKlxuICogTW92ZXMgYW4gYXR0YWNobWVudCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgdG8gd2hlcmV2ZXIgdGhlIGNvbnN1bWluZyBwbHVnaW4gc2F5cyBpdCBiZWxvbmdzLlxuICpcbiAqIFNoYXJlZCBieSBib3RoIGRlbGV0ZSBwYXRocyDigJQgdGhlIG5vdGUgZGVsZXRlIGluIHtAbGluayBEZWxldGVIYW5kbGVyfSBhbmQgdGhlIGZvbGRlciBkZWxldGUgcmVwbGF5ZWQgYnlcbiAqIHtAbGluayBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnR9IOKAlCBiZWNhdXNlIGJvdGggcmVhY2ggdGhlIHNhbWUgcG9pbnQ6IHtAbGluayBkZWxldGVJZk5vdFVzZWR9IGhhc1xuICogZGVjaWRlZCB0aGUgYXR0YWNobWVudCBtdXN0IHN1cnZpdmUsIGFuZCB3aXRob3V0IHRoaXMgaXQgd291bGQgc3Vydml2ZSBpbiBhIGZvbGRlciBub3RoaW5nIG93bnMgYW55IG1vcmUuXG4gKlxuICogQSBjb25zdW1lciB0aGF0IGRvZXMgbm90IGltcGxlbWVudCB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LCBvciB0aGF0IGFuc3dlcnNcbiAqIGBudWxsYCwgZ2V0cyBleGFjdGx5IHRoZSBiZWhhdmlvciBpdCBoYWQgYmVmb3JlIHRoaXMgZXhpc3RlZDogdGhlIGF0dGFjaG1lbnQgc3RheXMgcHV0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB3aGV0aGVyIHRoZSBhdHRhY2htZW50IHdhcyBtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudChwYXJhbXM6IERpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnRQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gIGlmICghc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlLnBhdGg7XG4gIGNvbnN0IHJlc2N1ZVBhdGggPSBhd2FpdCBzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKHtcbiAgICBhdHRhY2htZW50UGF0aCxcbiAgICBzdXJ2aXZpbmdOb3RlUGF0aHM6IHBhcmFtcy5yZXNjdWVQYXJhbXMuc3Vydml2aW5nTm90ZVBhdGhzXG4gIH0pO1xuXG4gIGlmIChyZXNjdWVQYXRoID09PSBudWxsKSB7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYE5vIHJlc2N1ZSBwYXRoIGZvciAke2F0dGFjaG1lbnRQYXRofTsga2VlcGluZyBpdCB3aGVyZSBpdCBpcy5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIC8qXG4gICAgICogYHJlbmFtZVNhZmVgIGNyZWF0ZXMgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciwgcmVzb2x2ZXMgYSBjb2xsaXNpb24gdmlhIGBnZXRTYWZlUmVuYW1lUGF0aGAsIGFuZCBtb3Zlc1xuICAgICAqIHRocm91Z2ggYGFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlYCwgc28gdGhlIHN1cnZpdmluZyBub3RlcycgbGlua3MgZm9sbG93IHRoZSBhdHRhY2htZW50LlxuICAgICAqL1xuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7XG4gICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICBuZXdQYXRoOiByZXNjdWVQYXRoLFxuICAgICAgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBwYXJhbXMucmVzY3VlUGFyYW1zLmZpbGVcbiAgICB9KTtcblxuICAgIGlmIChuZXdBdHRhY2htZW50UGF0aCA9PT0gYXR0YWNobWVudFBhdGgpIHtcbiAgICAgIC8qXG4gICAgICAgKiBUaGUgYXR0YWNobWVudCBpcyBhbHJlYWR5IHdoZXJlIGl0IGJlbG9uZ3MuIFRoaXMgaXMgdGhlIG5vcm1hbCBzZWNvbmQgbG9vayBhdCBhIGZpbGUgdGhlIGZvbGRlclxuICAgICAgICogZGVsZXRlIGp1c3QgcmVzY3VlZDogdGhlIG93bmluZyBub3RlJ3Mgb3duIGRlbGV0aW9uIGlzIHJlcG9ydGVkIGFmdGVyd2FyZHMgYW5kIHdhbGtzIGl0cyBsaW5rc1xuICAgICAgICogYWdhaW4uIE5vdGhpbmcgbW92ZWQsIHNvIG5vdGhpbmcgaXMgY2xhaW1lZCDigJQgdGhlIGNhbGxlciBrZWVwcyBpdCBpbiBwbGFjZSwgd2hpY2ggaXMgdGhlIHRydXRoLlxuICAgICAgICovXG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgJHthdHRhY2htZW50UGF0aH0gYWxyZWFkeSBzaXRzIGF0IGl0cyByZXNjdWUgcGF0aDsgbm90aGluZyB0byBtb3ZlLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGhlIG1vdmUgZmlyZXMgYHZhdWx0Lm9uKCdyZW5hbWUnKWAsIHNvIHRoaXMgaGFuZGxlcidzIG93biBgUmVuYW1lSGFuZGxlcmAgcGlja3MgaXQgdXAgbGlrZSBhbnkgb3RoZXJcbiAgICAgKiBhdHRhY2htZW50IG1vdmUuIEl0IGlzIGRlbGliZXJhdGVseSBOT1QgcmVnaXN0ZXJlZCBpbiBgaGFuZGxlZFJlbmFtZXNgOlxuICAgICAqIGBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50YCBhbHJlYWR5IGRpc2NhcmRzIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIHdoaWxlXG4gICAgICogYHNob3VsZEhhbmRsZVJlbmFtZXNgIGlzIG9uLCBzbyBzdXBwcmVzc2luZyB0aGUgaGFuZGxlciBhcyB3ZWxsIHdvdWxkIGxlYXZlIGRhbmdsaW5nIGV4YWN0bHkgdGhlIGxpbmtzXG4gICAgICogdGhpcyByZXNjdWUgZXhpc3RzIHRvIHByZXNlcnZlLiBMZXQgdGhlIHJld3JpdGUgc2V0dGxlIGJlZm9yZSB0aGUgZGVsZXRlIHdhbGsgY2FycmllcyBvbi5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHBhcmFtcy5hcHApO1xuXG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYFJlc2N1ZWQgJHthdHRhY2htZW50UGF0aH0gdG8gJHtuZXdBdHRhY2htZW50UGF0aH0uYCk7XG4gICAgcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIubm90aWNlcy5hdHRhY2htZW50UmVzY3VlZCwgeyBhdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGggfSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8qXG4gICAgICogQSByZXNjdWUgdGhhdCBoYWxmIGhhcHBlbmVkIG11c3Qgbm90IHJlYWQgYXMgc3VjY2VzcyDigJQgcmVwb3J0aW5nIGBmYWxzZWAgZmFsbHMgYmFjayB0byBrZWVwaW5nIHRoZVxuICAgICAqIGF0dGFjaG1lbnQgaW4gcGxhY2Ugd2l0aCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlLCB3aGljaCBpcyBzdGlsbCBzYWZlLlxuICAgICAqL1xuICAgIHByaW50RXJyb3IobmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzY3VlICR7YXR0YWNobWVudFBhdGh9IHRvICR7cmVzY3VlUGF0aH1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBrZXkgdW5kZXIgd2hpY2ggYSBsaW5rIGlzIHJlbWVtYmVyZWQgd2hpbGUgYSByZW5hbWUgaXMgaW4gZmxpZ2h0LlxuICpcbiAqIFRoZSByZXdyaXRlIGhhcyB0byBtYXRjaCBsaW5rcyBjYXB0dXJlZCBCRUZPUkUgdGhlIGF0dGFjaG1lbnRzIG1vdmVkIGFnYWluc3QgdGhlIGxpbmtzIHRoZSBtZXRhZGF0YSBjYWNoZVxuICogcmVwb3J0cyBBRlRFUiB0aGV5IG1vdmVkLCBhbmQgdGhlIG9ubHkgdGhpbmcgdGhhdCByZWxpYWJseSBzdXJ2aXZlcyB0aGF0IGdhcCBpcyB0aGUgbGluaydzIFRFWFQuXG4gKiBEZWxpYmVyYXRlbHkgZXhjbHVkZXMgYHBvc2l0aW9uYDoga2V5aW5nIG9uIHRoZSB3aG9sZSB7QGxpbmsgUmVmZXJlbmNlfSBtZWFudCB0aGF0IGFzIHNvb24gYXMgYW55dGhpbmdcbiAqIGVkaXRlZCB0aGUgZmlsZSBpbiBiZXR3ZWVuIOKAlCBhIGNvLWluc3RhbGxlZCBwbHVnaW4gcmV3cml0aW5nIGl0cyBvd24gbGlua3MsIG1vc3Qgb2Z0ZW4g4oCUIGV2ZXJ5IGxpbmsgYmVsb3dcbiAqIHRoZSBlZGl0IHNoaWZ0ZWQgaXRzIG9mZnNldHMsIG1pc3NlZCBpdHMga2V5LCBhbmQgd2FzIHNraXBwZWQgaW4gc2lsZW5jZSwgbGVhdmluZyB0aGUgbm90ZSB3aXRoIHNvbWUgZW1iZWRzXG4gKiByZXdyaXR0ZW4gYW5kIHRoZSByZXN0IGJyb2tlbi4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzYwLlxuICpcbiAqIFR3byBsaW5rcyB3aXRoIGlkZW50aWNhbCB0ZXh0IGluIG9uZSBmaWxlIG5lY2Vzc2FyaWx5IHJlc29sdmUgdG8gdGhlIHNhbWUgdGFyZ2V0LCBzbyBjb2xsYXBzaW5nIHRoZW0gb250b1xuICogb25lIGtleSBsb3NlcyBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdG8gYnVpbGQgdGhlIGtleSBmb3IuXG4gKiBAcmV0dXJucyBUaGUga2V5IGlkZW50aWZ5aW5nIHRoZSBsaW5rIGJ5IGl0cyB0ZXh0IGFsb25lLlxuICovXG5mdW5jdGlvbiBnZXRSZWZlcmVuY2VJZGVudGl0eUtleShsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Kc29uKHtcbiAgICBsaW5rOiBsaW5rLmxpbmssXG4gICAgb3JpZ2luYWw6IGxpbmsub3JpZ2luYWxcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbmV4cG9ydCB7IEVtcHR5Rm9sZGVyQmVoYXZpb3IgfSBmcm9tICcuLi92YXVsdC50cyc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEs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