obsidian-dev-utils 100.2.0 → 101.1.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.
@@ -329,13 +329,11 @@ class DeleteProtectionPatchComponent extends import_monkey_around_component.Monk
329
329
  */
330
330
  replayedFolderPaths = /* @__PURE__ */ new Set();
331
331
  settingsManager;
332
- shouldInvokeHandler;
333
332
  constructor(params) {
334
333
  super();
335
334
  this.app = params.app;
336
335
  this.pluginNoticeComponent = params.pluginNoticeComponent;
337
336
  this.settingsManager = params.settingsManager;
338
- this.shouldInvokeHandler = params.shouldInvokeHandler;
339
337
  }
340
338
  onload() {
341
339
  this.registerMethodPatch({
@@ -485,9 +483,6 @@ class DeleteProtectionPatchComponent extends import_monkey_around_component.Monk
485
483
  if (!(0, import_file_system.isFolder)(file)) {
486
484
  return false;
487
485
  }
488
- if (!this.shouldInvokeHandler()) {
489
- return false;
490
- }
491
486
  const settings = this.settingsManager.getSettings();
492
487
  if (!settings.shouldHandleDeletions) {
493
488
  return false;
@@ -528,7 +523,22 @@ class FileManagerRunAsyncLinkUpdatePatchComponent extends import_monkey_around_c
528
523
  }
529
524
  const newHandler = (linkUpdates) => this.wrapLinkUpdatesHandler(linkUpdates, linkUpdatesHandler);
530
525
  return originalMethodBound(newHandler);
531
- }
526
+ },
527
+ /*
528
+ * Suppressing Obsidian's own link updates is NOT idempotent, so two live copies of this component
529
+ * would fight over the same method. `PATCH_TOKEN` is a `Symbol.for` and the token registry is
530
+ * `getObsidianDevUtilsState`-backed, so the arbitration spans independently bundled copies of this
531
+ * library: the first patcher stays live, a copy that patches afterwards sees the token on its own
532
+ * `originalMethod` and defers via the guard above, and it takes over on its next call once the
533
+ * leader unloads and the token is dropped.
534
+ *
535
+ * This arbitrates the PATCH only. The component's `vault.on('rename' | 'delete')` and
536
+ * `metadataCache.on('deleted')` listeners have no equivalent guard — the plugin-registry election
537
+ * that used to provide one went with the multi-plugin machinery — so two live copies would both
538
+ * handle an event. With one owner that cannot arise; a consumer that must guarantee it refuses to
539
+ * load beside a conflicting version, which is a plugin's job rather than a library's.
540
+ */
541
+ patchToken: PATCH_TOKEN
532
542
  });
533
543
  }
534
544
  async wrapLinkUpdatesHandler(linkUpdates, linkUpdatesHandler) {
@@ -1068,36 +1078,18 @@ class RenameMap {
1068
1078
  }
1069
1079
  }
1070
1080
  class SettingsManager {
1071
- renameDeleteHandlersMap;
1072
- constructor() {
1073
- this.renameDeleteHandlersMap = (0, import_obsidian_dev_utils_state.getObsidianDevUtilsState)("renameDeleteHandlersMap", /* @__PURE__ */ new Map()).value;
1081
+ settingsBuilder;
1082
+ constructor(settingsBuilder) {
1083
+ this.settingsBuilder = settingsBuilder;
1074
1084
  }
1075
1085
  getSettings() {
1076
- const settingsBuilders = [...this.renameDeleteHandlersMap.values()].reverse();
1077
- const settings = {};
1078
- settings.isNote = (path) => (0, import_file_system.isNote)(path);
1079
- settings.isPathIgnored = () => false;
1080
- for (const settingsBuilder of settingsBuilders) {
1081
- const newSettings = settingsBuilder();
1082
- settings.shouldDeleteConflictingAttachments ||= newSettings.shouldDeleteConflictingAttachments ?? false;
1083
- if (newSettings.emptyFolderBehavior) {
1084
- settings.emptyFolderBehavior ??= newSettings.emptyFolderBehavior;
1085
- }
1086
- settings.shouldHandleDeletions ||= newSettings.shouldHandleDeletions ?? false;
1087
- settings.shouldHandleRenames ||= newSettings.shouldHandleRenames ?? false;
1088
- settings.shouldRenameAttachmentFiles ||= newSettings.shouldRenameAttachmentFiles ?? false;
1089
- settings.shouldRenameAttachmentFolder ||= newSettings.shouldRenameAttachmentFolder ?? false;
1090
- settings.shouldUpdateFileNameAliases ||= newSettings.shouldUpdateFileNameAliases ?? false;
1091
- if (newSettings.getRescuePath) {
1092
- settings.getRescuePath ??= newSettings.getRescuePath;
1093
- }
1094
- const isPathIgnored = settings.isPathIgnored;
1095
- settings.isPathIgnored = (path) => isPathIgnored(path) || (newSettings.isPathIgnored?.(path) ?? false);
1096
- const currentIsNote = settings.isNote;
1097
- settings.isNote = (path) => currentIsNote(path) && (newSettings.isNote?.(path) ?? true);
1098
- }
1099
- settings.emptyFolderBehavior ??= import_vault.EmptyFolderBehavior.Keep;
1100
- return settings;
1086
+ const builtSettings = this.settingsBuilder();
1087
+ return {
1088
+ ...builtSettings,
1089
+ emptyFolderBehavior: builtSettings.emptyFolderBehavior ?? import_vault.EmptyFolderBehavior.Keep,
1090
+ isNote: (path) => builtSettings.isNote?.(path) ?? (0, import_file_system.isNote)(path),
1091
+ isPathIgnored: (path) => builtSettings.isPathIgnored?.(path) ?? false
1092
+ };
1101
1093
  }
1102
1094
  isNoteEx(path) {
1103
1095
  const settings = this.getSettings();
@@ -1118,10 +1110,6 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
1118
1110
  * with the running count of processed files and the total. When `null`, no progress is reported.
1119
1111
  */
1120
1112
  linkUpdateProgressReporter;
1121
- /**
1122
- * The plugin ID used to identify this handler among the registered rename/delete handlers.
1123
- */
1124
- pluginId;
1125
1113
  /**
1126
1114
  * The notice component used to report updated links to the user.
1127
1115
  */
@@ -1152,22 +1140,14 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
1152
1140
  this.app = params.app;
1153
1141
  this.linkUpdateProgressReporter = params.linkUpdateProgressReporter ?? null;
1154
1142
  this.resourceLockComponent = params.resourceLockComponent;
1155
- this.pluginId = params.pluginId;
1156
1143
  this.pluginNoticeComponent = params.pluginNoticeComponent;
1157
1144
  this.settingsBuilder = params.settingsBuilder;
1158
- this.settingsManager = new SettingsManager();
1145
+ this.settingsManager = new SettingsManager(this.settingsBuilder);
1159
1146
  }
1160
1147
  /**
1161
1148
  * Loads the component
1162
1149
  */
1163
1150
  onload() {
1164
- const renameDeleteHandlersMap = this.settingsManager.renameDeleteHandlersMap;
1165
- renameDeleteHandlersMap.set(this.pluginId, this.settingsBuilder);
1166
- this.logRegisteredHandlers();
1167
- this.register(() => {
1168
- renameDeleteHandlersMap.delete(this.pluginId);
1169
- this.logRegisteredHandlers();
1170
- });
1171
1151
  this.registerEvent(this.app.vault.on("delete", this.handleDelete.bind(this)));
1172
1152
  this.registerEvent(this.app.vault.on("rename", this.handleRename.bind(this)));
1173
1153
  this.registerEvent(this.app.metadataCache.on("deleted", this.handleMetadataDeleted.bind(this)));
@@ -1182,15 +1162,11 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
1182
1162
  new DeleteProtectionPatchComponent({
1183
1163
  app: this.app,
1184
1164
  pluginNoticeComponent: this.pluginNoticeComponent,
1185
- settingsManager: this.settingsManager,
1186
- shouldInvokeHandler: this.shouldInvokeHandler.bind(this)
1165
+ settingsManager: this.settingsManager
1187
1166
  })
1188
1167
  );
1189
1168
  }
1190
1169
  handleDelete(file) {
1191
- if (!this.shouldInvokeHandler()) {
1192
- return;
1193
- }
1194
1170
  (0, import_queue.addToQueue)({
1195
1171
  operationFunction: (abortSignal) => new DeleteHandler({
1196
1172
  abortSignal,
@@ -1204,9 +1180,6 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
1204
1180
  });
1205
1181
  }
1206
1182
  handleMetadataDeleted(file, previousCache) {
1207
- if (!this.shouldInvokeHandler()) {
1208
- return;
1209
- }
1210
1183
  new MetadataDeletedHandler({
1211
1184
  deletedMetadataCacheMap: this.deletedMetadataCacheMap,
1212
1185
  file,
@@ -1215,9 +1188,6 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
1215
1188
  }).handle();
1216
1189
  }
1217
1190
  handleRename(file, oldPath) {
1218
- if (!this.shouldInvokeHandler()) {
1219
- return;
1220
- }
1221
1191
  if (!(0, import_file_system.isFile)(file)) {
1222
1192
  return;
1223
1193
  }
@@ -1285,17 +1255,6 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
1285
1255
  isNoOpRename(settings, oldPath, newPath) {
1286
1256
  return !settings.shouldHandleRenames && !(settings.isNote?.(oldPath) ?? false) && !(settings.isNote?.(newPath) ?? false) && (settings.emptyFolderBehavior ?? import_vault.EmptyFolderBehavior.Keep) === import_vault.EmptyFolderBehavior.Keep;
1287
1257
  }
1288
- logRegisteredHandlers() {
1289
- const renameDeleteHandlersMap = this.settingsManager.renameDeleteHandlersMap;
1290
- (0, import_debug.getLibDebugger)("RenameDeleteHandler:logRegisteredHandlers")(
1291
- `Plugins with registered rename/delete handlers: ${JSON.stringify([...renameDeleteHandlersMap.keys()])}`
1292
- );
1293
- }
1294
- shouldInvokeHandler() {
1295
- const renameDeleteHandlersMap = this.settingsManager.renameDeleteHandlersMap;
1296
- const mainPluginId = [...renameDeleteHandlersMap.keys()][0];
1297
- return mainPluginId === this.pluginId;
1298
- }
1299
1258
  }
1300
1259
  async function didRescueStillUsedAttachment(params) {
1301
1260
  const settings = params.settingsManager.getSettings();
@@ -1341,4 +1300,4 @@ function getLinkIdentityKey(link) {
1341
1300
  EmptyFolderBehavior,
1342
1301
  RenameDeleteHandlerComponent
1343
1302
  });
1344
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVlcGx5IGNvdXBsZWQgdG8gT2JzaWRpYW4gcnVudGltZTsgcmVxdWlyZXMgcnVubmluZyB2YXVsdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0aW5nLiAqL1xuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgSW50ZXJuYWxQbHVnaW5OYW1lXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IHQgfSBmcm9tICdpMThuZXh0JztcbmltcG9ydCB7XG4gIEZpbGVNYW5hZ2VyLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfSBmcm9tICcuLi9saW5rLXVwZGF0ZS1wcm9ncmVzcy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQgdHlwZSB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGZpbHRlckluUGxhY2UgfSBmcm9tICcuLi8uLi9hcnJheS50cyc7XG5pbXBvcnQgeyBnZXRMaWJEZWJ1Z2dlciB9IGZyb20gJy4uLy4uL2RlYnVnLnRzJztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvci50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi8uLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7XG4gIENBTlZBU19GSUxFX0VYVEVOU0lPTixcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzRmlsZSxcbiAgaXNGb2xkZXIsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZWRpdExpbmtzLFxuICBleHRyYWN0TGlua0ZpbGUsXG4gIHVwZGF0ZUxpbmssXG4gIHVwZGF0ZUxpbmtzSW5GaWxlXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldExpbmtzLFxuICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBhZGRUb1F1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yIH0gZnJvbSAnLi4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgeyBkZWxldGVJZk5vdFVzZWQgfSBmcm9tICcuLi92YXVsdC1kZWxldGUudHMnO1xuaW1wb3J0IHtcbiAgY2xlYW51cEVtcHR5Rm9sZGVycyxcbiAgRW1wdHlGb2xkZXJCZWhhdmlvcixcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIGlzQ2hpbGRPclNlbGYsXG4gIHJlbmFtZVNhZmUsXG4gIHRyYXNoU2FmZVxufSBmcm9tICcuLi92YXVsdC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGhhc1BhdGNoVG9rZW4sXG4gIE1vbmtleUFyb3VuZENvbXBvbmVudFxufSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlc2N1ZVBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQgdGhhdCBpcyBhYm91dCB0byBiZSBzdHJhbmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGFjaG1lbnRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgdGhhdCBzdGlsbCByZWZlcmVuY2UgdGhlIGF0dGFjaG1lbnQgb25jZSB0aGUgZGVsZXRpb24gaXMgZG9uZS4gTmV2ZXIgZW1wdHkuXG4gICAqL1xuICByZWFkb25seSBzdXJ2aXZpbmdOb3RlUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICAgKi9cbiAgZW1wdHlGb2xkZXJCZWhhdmlvcjogRW1wdHlGb2xkZXJCZWhhdmlvcjtcblxuICAvKipcbiAgICogV2hlcmUgdG8gbW92ZSBhbiBhdHRhY2htZW50IHRoYXQgYSBkZWxldGlvbiB3b3VsZCBvdGhlcndpc2Ugc3RyYW5kIFx1MjAxNCBvbmUgdGhhdCBzdXJ2aXZlcyBiZWNhdXNlIGFub3RoZXJcbiAgICogbm90ZSBzdGlsbCByZWZlcmVuY2VzIGl0LCBidXQgaXMgbGVmdCBzaXR0aW5nIGluIGEgZm9sZGVyIHdob3NlIG93bmluZyBub3RlIGlzIGdvbmUuXG4gICAqXG4gICAqIERlY2lkaW5nIHRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgcGx1Z2luJ3MgYXR0YWNobWVudC1wYXRoIHBvbGljeSwgd2hpY2ggaXMgd2h5IHRoZSBoYW5kbGVyIGFza3MgcmF0aGVyXG4gICAqIHRoYW4gZ3Vlc3Nlcy4gUmV0dXJuaW5nIGBudWxsYCBcdTIwMTQgb3Igbm90IGltcGxlbWVudGluZyB0aGlzIGF0IGFsbCBcdTIwMTQga2VlcHMgdGhlIGF0dGFjaG1lbnQgd2hlcmUgaXQgaXMsXG4gICAqIHdoaWNoIGlzIHRoZSBiZWhhdmlvciBldmVyeSBjb25zdW1lciBoYWQgYmVmb3JlIHRoaXMgbWVtYmVyIGV4aXN0ZWQuXG4gICAqL1xuICBnZXRSZXNjdWVQYXRoPyhwYXJhbXM6IEdldFJlc2N1ZVBhdGhQYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZShwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGlnbm9yZSB0aGUgcGF0aC5cbiAgICovXG4gIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgY29uZmxpY3RpbmcgYXR0YWNobWVudHMuXG4gICAqL1xuICBzaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSBkZWxldGlvbnMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVEZWxldGlvbnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIHJlbmFtZXMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVSZW5hbWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZpbGVzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZm9sZGVyIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlZFJlbmFtZUtleSB7XG4gIG5ld1BhdGg6IHN0cmluZztcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcD86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tYmluZWQgYmFja2xpbmtzIG1hcCwga2V5ZWQgYnkgbmV3IGJhY2tsaW5rIHBhdGgsIGFjY3VtdWxhdGluZyBsaW5rLUpTT04gdG8gc291cmNlLXBhdGggbWFwcGluZ3MuXG4gICAqL1xuICByZWFkb25seSBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdob3NlIGJhY2tsaW5rcyBhcmUgYmVpbmcgcmVjb3JkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBiYWNrbGlua3MgbWFwIGZvciBhIHNpbmdsZSBmaWxlLCBrZXllZCBieSBiYWNrbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG59XG5cbmNvbnN0IFBBVENIX1RPS0VOID0gU3ltYm9sLmZvcigncmVuYW1lRGVsZXRlSGFuZGxlcicpO1xuXG5pbnRlcmZhY2UgRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuICBzaG91bGRJbnZva2VIYW5kbGVyKHRoaXM6IHZvaWQpOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudFBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBmaWxlTWFuYWdlcjogRmlsZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHNldHRpbmdzQnVpbGRlcih0aGlzOiB2b2lkKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xufVxuXG5jbGFzcyBEZWxldGVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERlbGV0ZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7dGhpcy5maWxlLnBhdGh9YCk7XG4gICAgaWYgKCFpc05vdGUodGhpcy5maWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyh0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oW2Rpcm5hbWUodGhpcy5maWxlLnBhdGgpXSk7XG5cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZ2V0KHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjb25zdCBsaW5rcyA9IGdldExpbmtzKHsgY2FjaGUgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aCB9KTtcbiAgICAgICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEZvbGRlclBhdGhzLmRlbGV0ZSgnJyk7XG4gICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGhcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmICghYXR0YWNobWVudEZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMuZmlsZS5wYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGb2xkZXIsXG4gICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogS2VlcHMgYSBmb2xkZXIgZGVsZXRpb24gZnJvbSBkZXN0cm95aW5nIGFuIGF0dGFjaG1lbnQgYSBub3RlIG91dHNpZGUgdGhhdCBmb2xkZXIgc3RpbGwgcmVmZXJlbmNlcy5cbiAqXG4gKiBEZWxldGluZyBhIE5PVEUgaXMgYWxyZWFkeSBzYWZlOiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfSBkaXNjb3VudHMgdGhlIGRlbGV0ZWQgbm90ZSdzIG93biBiYWNrbGlua3MsIHNlZXNcbiAqIGFub3RoZXIgbm90ZSBzdGlsbCByZWZlcmVuY2luZyB0aGUgYXR0YWNobWVudCwgYW5kIGtlZXBzIGl0LiBEZWxldGluZyBhIEZPTERFUiB3YXMgbm90LCBiZWNhdXNlXG4gKiB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudH0gb25seSBsaXN0ZW5zIChgdmF1bHQub24oJ2RlbGV0ZScpYCkgYW5kIGJ5IHRoZSB0aW1lIGEgZm9sZGVyIGRlbGV0aW9uXG4gKiBpcyByZXBvcnRlZCBpdHMgY2hpbGRyZW4gYXJlIGFscmVhZHkgZ29uZS4gTm90aGluZyByZWFjdGl2ZSBjYW4gaGVscCwgc28gdGhpcyBjb21wb25lbnQgaW50ZXJjZXB0cyB0aGVcbiAqIGRlbGV0aW9uIHByaW1pdGl2ZXMgaW5zdGVhZDogYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgKHdoYXQgdGhlIGZpbGUtZXhwbG9yZXIgRGVsZXRlIGZsb3cgcmVhY2hlcyB0aHJvdWdoXG4gKiBgcHJvbXB0Rm9yRGVsZXRpb25gKSBwbHVzIHRoZSByYXcgYFZhdWx0LmRlbGV0ZWAgLyBgVmF1bHQudHJhc2hgIGEgcGx1Z2luIG1heSBjYWxsIGRpcmVjdGx5LlxuICpcbiAqIEEgZm9sZGVyIGRlbGV0aW9uIGlzIHNjYW5uZWQgZmlyc3QuIFdoZW4gbm90aGluZyBpbnNpZGUgaXQgaXMgc3RpbGwgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUgXHUyMDE0IHRoZVxuICogb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIGRlbGV0aW9ucyBcdTIwMTQgdGhlIG9yaWdpbmFsIHJ1bnMgdW50b3VjaGVkLCBzbyB0aGUgbmF0aXZlIGJlaGF2aW9yIGlzIHByZXNlcnZlZFxuICogZXhhY3RseS4gT25seSB3aGVuIHNvbWV0aGluZyB3b3VsZCBiZSBsb3N0IGRvZXMgdGhpcyB0YWtlIG92ZXIsIHJlcGxheWluZyB0aGUgZGVsZXRpb24gdGhyb3VnaFxuICoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH06IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgZm9sZGVyIGdvZXMsIHRoZSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnRzIGFuZCB0aGVcbiAqIGZvbGRlcnMgaG9sZGluZyB0aGVtIHN0YXksIGFuZCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlIGZpcmVzLCBtaXJyb3JpbmcgdGhlIG5vdGUgY2FzZS5cbiAqXG4gKiBGaWxlcyBhcmUgbmV2ZXIgaW50ZXJjZXB0ZWQgXHUyMDE0IGRlbGV0aW5nIGEgZmlsZSBpcyB0aGUgdXNlciBuYW1pbmcgdGhhdCBmaWxlIGV4cGxpY2l0bHkuXG4gKi9cbmNsYXNzIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJvb3RzIG9mIHRoZSBmb2xkZXIgZGVsZXRpb25zIGN1cnJlbnRseSBiZWluZyByZXBsYXllZC4gVGhlIHJlcGxheSBkZWxldGVzIHRocm91Z2ggdGhlIFVOUEFUQ0hFRFxuICAgKiBvcmlnaW5hbCwgc28gaXQgY2Fubm90IHJlLWVudGVyIHRoaXMgY29tcG9uZW50IGRpcmVjdGx5IFx1MjAxNCBidXQgYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgaXRzZWxmIGNhbGxzIGRvd25cbiAgICogaW50byBgVmF1bHQudHJhc2hgIC8gYFZhdWx0LmRlbGV0ZWAsIHdoaWNoIGFyZSBwYXRjaGVkIHRvbywgYW5kIHJlLXNjYW5uaW5nIGEgc3VidHJlZSBhbHJlYWR5IGJlaW5nXG4gICAqIHdhbGtlZCBpcyBwdXJlIHdhc3RlLiBTY29wZWQgYnkgcGF0aCByYXRoZXIgdGhhbiBieSBhIGZsYWcgc28gdGhhdCBhbiB1bnJlbGF0ZWQgZm9sZGVyIGRlbGV0aW9uXG4gICAqIGludGVybGVhdmluZyBvbiBhbiBgYXdhaXRgIGlzIHN0aWxsIHByb3RlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwbGF5ZWRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkSW52b2tlSGFuZGxlcjogKCkgPT4gYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyID0gcGFyYW1zLnNob3VsZEludm9rZUhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3RyYXNoRmlsZSc+KHtcbiAgICAgICRvYmplY3Q6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaEZpbGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2RlbGV0ZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBmb3JjZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlLCBmb3JjZSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAndHJhc2gnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2gnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBzeXN0ZW1dLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgc3lzdGVtKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0cyB0aGUgcGF0aHMgb2YgZXZlcnkgbm90ZSBpbnNpZGUgdGhlIGZvbGRlci4gVGhleSBhcmUgdGhlIGxpbmsgc291cmNlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoXG4gICAqIHRoZSBmb2xkZXIsIHNvIHRoZWlyIGJhY2tsaW5rcyBtdXN0IG5vdCBrZWVwIGFuIGF0dGFjaG1lbnQgYWxpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBub3RlcyBpbnNpZGUgdGhlIGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyOiBURm9sZGVyLCBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IGRlbGV0ZWROb3RlUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZm9sZGVyLCAoY2hpbGQpID0+IHtcbiAgICAgIGlmIChpc0ZpbGUoY2hpbGQpICYmIChzZXR0aW5ncy5pc05vdGU/LihjaGlsZC5wYXRoKSA/PyBmYWxzZSkpIHtcbiAgICAgICAgZGVsZXRlZE5vdGVQYXRocy5hZGQoY2hpbGQucGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlbGV0ZWROb3RlUGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGF0dGFjaG1lbnRzIGluc2lkZSB0aGUgZm9sZGVyIHRoYXQgYSBub3RlIG91dHNpZGUgaXQgc3RpbGwgcmVmZXJlbmNlcywgYW5kIHdvdWxkIHRoZXJlZm9yZSBiZVxuICAgKiBkZXN0cm95ZWQgYnkgZGVsZXRpbmcgdGhlIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGRlbGV0ZWROb3RlUGF0aHMgLSBUaGUgcGF0aHMgb2YgdGhlIG5vdGVzIHRoYXQgZGlzYXBwZWFyIGFsb25nIHdpdGggdGhlIGZvbGRlci5cbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aHMgb2YgdGhlIGF0dGFjaG1lbnRzIHRoYXQgbXVzdCBzdXJ2aXZlIHRoZSBkZWxldGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZFN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyhcbiAgICBmb2xkZXI6IFRGb2xkZXIsXG4gICAgZGVsZXRlZE5vdGVQYXRoczogU2V0PHN0cmluZz4sXG4gICAgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPlxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgY2FuZGlkYXRlRmlsZXM6IFRGaWxlW10gPSBbXTtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZm9sZGVyLCAoY2hpbGQpID0+IHtcbiAgICAgIGlmIChpc0ZpbGUoY2hpbGQpICYmICEoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGNhbmRpZGF0ZUZpbGVzLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGVGaWxlIG9mIGNhbmRpZGF0ZUZpbGVzKSB7XG4gICAgICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGNhbmRpZGF0ZUZpbGUgfSk7XG4gICAgICBmb3IgKGNvbnN0IGRlbGV0ZWROb3RlUGF0aCBvZiBkZWxldGVkTm90ZVBhdGhzKSB7XG4gICAgICAgIGJhY2tsaW5rcy5jbGVhcihkZWxldGVkTm90ZVBhdGgpO1xuICAgICAgfVxuICAgICAgaWYgKGJhY2tsaW5rcy5jb3VudCgpICE9PSAwKSB7XG4gICAgICAgIHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5wdXNoKGNhbmRpZGF0ZUZpbGUucGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBkZWxldGlvbiBuZWVkcyBwcm90ZWN0aW5nIGFuZCwgaWYgc28sIHJlcGxhY2VzIGl0IHdpdGggYSBwcm90ZWN0ZWQgcmVwbGF5LlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBmYWxsYmFjayAtIEludm9rZXMgdGhlIGludGVyY2VwdGVkIG1ldGhvZCB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSBkZWxldGVBYnN0cmFjdEZpbGUgLSBEZWxldGVzIGEgc2luZ2xlIGFic3RyYWN0IGZpbGUgdGhyb3VnaCB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kJ3MgdW5wYXRjaGVkIG9yaWdpbmFsLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRlbGV0aW9uIGlzIGRvbmUuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZURlbGV0aW9uKFxuICAgIGZpbGU6IFRBYnN0cmFjdEZpbGUsXG4gICAgZmFsbGJhY2s6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICAgZGVsZXRlQWJzdHJhY3RGaWxlOiAoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5zaG91bGRDb25zaWRlckZvbGRlcihmaWxlKSkge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVwbGF5Rm9sZGVyRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGRlbGV0ZUFic3RyYWN0RmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgZm9sZGVyIHdoaWxlIGtlZXBpbmcgd2hhdGV2ZXIgaW5zaWRlIGl0IGlzIHN0aWxsIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXBsYXlGb2xkZXJEZWxldGlvbihcbiAgICBmb2xkZXI6IFRGb2xkZXIsXG4gICAgZmFsbGJhY2s6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICAgZGVsZXRlQWJzdHJhY3RGaWxlOiAoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gdGhpcy5jb2xsZWN0RGVsZXRlZE5vdGVQYXRocyhmb2xkZXIsIHNldHRpbmdzKTtcbiAgICBjb25zdCBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMgPSBhd2FpdCB0aGlzLmZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoZm9sZGVyLCBkZWxldGVkTm90ZVBhdGhzLCBzZXR0aW5ncyk7XG5cbiAgICBpZiAoc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKGBOb3RoaW5nIHRvIHByb3RlY3QgaW4gJHtmb2xkZXIucGF0aH07IGRlbGV0aW5nIGl0IGFzIHVzdWFsLmApO1xuICAgICAgYXdhaXQgZmFsbGJhY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkZWxldGVQcm90ZWN0aW9uJykoXG4gICAgICBgUHJvdGVjdGluZyAke3N0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5sZW5ndGgudG9TdHJpbmcoKX0gc3RpbGwtcmVmZXJlbmNlZCBhdHRhY2htZW50KHMpIGZyb20gdGhlIGRlbGV0aW9uIG9mICR7Zm9sZGVyLnBhdGh9OiAke3RvSnNvbihzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMpfWBcbiAgICApO1xuXG4gICAgdGhpcy5yZXBsYXllZEZvbGRlclBhdGhzLmFkZChmb2xkZXIucGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGRlbGV0ZUFic3RyYWN0RmlsZSxcbiAgICAgICAgZGVsZXRlZE5vdGVQYXRoczogWy4uLmRlbGV0ZWROb3RlUGF0aHNdLFxuICAgICAgICBwYXRoT3JGaWxlOiBmb2xkZXIsXG4gICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHJlc2N1ZVN0aWxsVXNlZEZpbGU6IHRoaXMucmVzY3VlU3RpbGxVc2VkRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgICAvKlxuICAgICAgICAgKiBUaGUgdXNlciBuYW1lZCBUSElTIGZvbGRlciwgc28gaXQgZ29lcyBldmVuIHVuZGVyIGBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBgIFx1MjAxNCB0aGF0IHNldHRpbmdcbiAgICAgICAgICogZ292ZXJucyBmb2xkZXJzIGVtcHRpZWQgaW5jaWRlbnRhbGx5LCBub3QgdGhlIG9uZSBleHBsaWNpdGx5IGRlbGV0ZWQuIGBkZWxldGVJZk5vdFVzZWRgIHN0aWxsXG4gICAgICAgICAqIHJlZnVzZXMgdG8gcmVtb3ZlIGFueSBmb2xkZXIgd2hvc2UgY2hpbGQgaGFkIHRvIGJlIGtlcHQsIHdoaWNoIGlzIHRoZSBwcm90ZWN0aW9uIHdhbnRlZCBoZXJlLlxuICAgICAgICAgKi9cbiAgICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiB0cnVlLFxuICAgICAgICAvKlxuICAgICAgICAgKiBBIG5vdGUgdGhhdCBvdGhlcnMgbGluayB0byBpcyBkZWxldGVkIGFzIG5vcm1hbDsgT2JzaWRpYW4gbGVhdmVzIHRoZSBkYW5nbGluZyBsaW5rLiBQcm90ZWN0aW5nXG4gICAgICAgICAqIG5vdGVzIHRvbyB3b3VsZCBtYWtlIGRlbGV0aW5nIGEgZm9sZGVyIG9mIGxpbmtlZC10byBub3RlcyBpbXBvc3NpYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgc2hvdWxkUHJvdGVjdElmU3RpbGxVc2VkOiAoY2FuZGlkYXRlRmlsZSkgPT4gIShzZXR0aW5ncy5pc05vdGU/LihjYW5kaWRhdGVGaWxlLnBhdGgpID8/IGZhbHNlKVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucmVwbGF5ZWRGb2xkZXJQYXRocy5kZWxldGUoZm9sZGVyLnBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzY3VlU3RpbGxVc2VkRmlsZShyZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc2N1ZVBhcmFtcyxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGRlbGV0aW9uIGlzIGEgZm9sZGVyIGRlbGV0aW9uIHRoaXMgaGFuZGxlciBpcyByZXNwb25zaWJsZSBmb3IgcHJvdGVjdGluZy5cbiAgICpcbiAgICogRXZlcnkgY2hlY2sgaGVyZSBpcyBzeW5jaHJvbm91cyBhbmQgY2hlYXAsIHNvIGEgZmlsZSBkZWxldGlvbiBcdTIwMTQgdGhlIG92ZXJ3aGVsbWluZyBtYWpvcml0eSBcdTIwMTQgY29zdHMgb25lXG4gICAqIHtAbGluayBpc0ZvbGRlcn0gY2FsbCBhbmQgcmVhY2hlcyB0aGUgb3JpZ2luYWwgdW50b3VjaGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBkZWxldGlvbiBzaG91bGQgYmUgc2Nhbm5lZCBiZWZvcmUgaXQgcnVucy5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkQ29uc2lkZXJGb2xkZXIoZmlsZTogVEFic3RyYWN0RmlsZSk6IGZpbGUgaXMgVEZvbGRlciB7XG4gICAgaWYgKCFpc0ZvbGRlcihmaWxlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGZpbGUucGF0aCkgPz8gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlcGxheWVkRm9sZGVyUGF0aCBvZiB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMpIHtcbiAgICAgIGlmIChpc0NoaWxkT3JTZWxmKHsgYXBwOiB0aGlzLmFwcCwgY2hpbGRQYXRoT3JGaWxlOiBmaWxlLnBhdGgsIHBhcmVudFBhdGhPckZpbGU6IHJlcGxheWVkRm9sZGVyUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuY2xhc3MgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZU1hbmFnZXIgPSBwYXJhbXMuZmlsZU1hbmFnZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtsaW5rVXBkYXRlc0hhbmRsZXJdLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RCb3VuZFxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoaGFzUGF0Y2hUb2tlbihvcmlnaW5hbE1ldGhvZCwgUEFUQ0hfVE9LRU4pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIgPSAobGlua1VwZGF0ZXMpID0+IHRoaXMud3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcywgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXM6IExpbmtVcGRhdGVbXSwgbGlua1VwZGF0ZXNIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaXNSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBsZXQgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpID0+IHtcbiAgICAgIGlzUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIC8qXG4gICAgICAgKiBBIHJlbmFtZSBwZXJmb3JtZWQgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGVcbiAgICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIEFkdmFuY2VkIE5vdGUgQ29tcG9zZXIncyBmb2xkZXIgbWVyZ2UpIGlzIG93bmVkIGJ5IHRoYXRcbiAgICAgICAqIHRyYW5zYWN0aW9uLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBsaW5rIGNvbnNpc3RlbmN5LiBUaGlzIGhhbmRsZXIgZGVsaWJlcmF0ZWx5IGRvZXNcbiAgICAgICAqIE5PVCByZXdyaXRlIGxpbmtzIGZvciBpdCwgc28gc3VwcHJlc3NpbmcgT2JzaWRpYW4ncyBuYXRpdmUgbGluayB1cGRhdGUgYmVsb3cgd291bGQgbGVhdmUgdGhlXG4gICAgICAgKiBsaW5rcyBkYW5nbGluZy4gTGV0IHRoZSBuYXRpdmUgdXBkYXRlIHByb2NlZWQgdW50b3VjaGVkLiBTZWVcbiAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1hZHZhbmNlZC1ub3RlLWNvbXBvc2VyL2lzc3Vlcy8xNDYuXG4gICAgICAgKi9cbiAgICAgIGlmIChpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIGZpbGUucGF0aCkgfHwgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBvbGRQYXRoKSkge1xuICAgICAgICBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgbWlnaHQgY2hhbmdlZCBpbiBgcmVuYW1lYCBldmVudCBoYW5kbGVyLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gICAgaWYgKCFpc1JlbmFtZUNhbGxlZCB8fCAhc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fCBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKFxuICAgICAgbGlua1VwZGF0ZXMsXG4gICAgICAobGlua1VwZGF0ZSkgPT4ge1xuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHNvdXJjZSBmaWxlICR7bGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6cnVuQXN5bmNMaW5rVXBkYXRlJykoXG4gICAgICAgICAgICBgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2YgcmVzb2x2ZWQgZmlsZSAke2xpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFwcC5wbHVnaW5zLmdldFBsdWdpbignYmFja2xpbmstY2FjaGUnKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5rVXBkYXRlLnNvdXJjZUZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgSGFuZGxlZFJlbmFtZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIYW5kbGVkUmVuYW1lS2V5PigpO1xuXG4gIHB1YmxpYyBhZGQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLmRlbGV0ZSh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXMob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxIYW5kbGVkUmVuYW1lS2V5PiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXlUb1N0cmluZyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xuICB9XG59XG5cbmNsYXNzIE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLnByZXZpb3VzQ2FjaGUgPSBwYXJhbXMucHJldmlvdXNDYWNoZTtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZU1ldGFkYXRhRGVsZXRlZCcpKGBTa2lwcGluZyBtZXRhZGF0YSBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc01hcmtkb3duRmlsZSh0aGlzLmZpbGUpICYmIHRoaXMucHJldmlvdXNDYWNoZSkge1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQodGhpcy5maWxlLnBhdGgsIHRoaXMucHJldmlvdXNDYWNoZSk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJlbmFtZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lczogSGFuZGxlZFJlbmFtZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzID0gcGFyYW1zLmhhbmRsZWRSZW5hbWVzO1xuICAgIHRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwID8/IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gcGFyYW1zLmludGVycnVwdGVkUmVuYW1lc01hcDtcbiAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID0gcGFyYW1zLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwID0gcGFyYW1zLm9sZFBhdGhCYWNrbGlua3NNYXA7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub2xkUGF0aCA9PT0gdGhpcy5uZXdQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIC8qXG4gICAgICogVGhlIHJlbmFtZSB0aGF0IHRyaWdnZXJlZCB0aGlzIGhhbmRsZXIgaXMgdmVyeSBsaWtlbHkgc3RpbGwgaW5zaWRlIE9ic2lkaWFuJ3Mgb3duXG4gICAgICogYEZpbGVNYW5hZ2VyLnJ1bkFzeW5jTGlua1VwZGF0ZWAgY3ljbGUsIHdoaWNoIGlzIGFib3V0IHRvIGRlY2lkZSBcdTIwMTQgc3luY2hyb25vdXNseSBcdTIwMTQgd2hpY2ggbGlua3MgdG9cbiAgICAgKiByZXdyaXRlLCBieSByZS1yZXNvbHZpbmcgZWFjaCBvbmUuIEV2ZXJ5dGhpbmcgYmVsb3cgdGVtcG9yYXJpbHkgcmVnaXN0ZXJzIGEgcGhhbnRvbSBmaWxlIGF0IHRoZVxuICAgICAqIG9sZCBwYXRoIChgcmVnaXN0ZXJGaWxlc2AsIGRpcmVjdGx5IGhlcmUgYW5kIGluc2lkZSBgUmVuYW1lTWFwYCkgYW5kIGhvbGRzIGl0IGFjcm9zcyBhbiBgYXdhaXRgO1xuICAgICAqIHNlZW4gbWlkLWRlY2lzaW9uLCB0aGF0IHBoYW50b20gbWFrZXMgdGhlIG9sZCBwYXRoIHN0aWxsIHJlc29sdmUsIHNvIE9ic2lkaWFuIGNvbmNsdWRlcyBub3RoaW5nXG4gICAgICogY2hhbmdlZCBhbmQgcmV3cml0ZXMgbm90aGluZy4gU3RhbmRpbmcgaW52YXJpYW50OiBuZXZlciB0b3VjaCB0aGUgdmF1bHQgaW5kZXggd2hpbGUgT2JzaWRpYW4gaXNcbiAgICAgKiBtaWQtZGVjaXNpb24uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzQ3LlxuICAgICAqL1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXModGhpcy5hcHApO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IHRoaXMuY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAvLyBUaGUgcmVmcmVzaGVkIGJhY2tsaW5rcyBmZWVkIGBvbGRQYXRoQmFja2xpbmtzTWFwYCwgd2hpY2ggb25seSB0aGUgbGluay1yZXdyaXRlIHN0ZXBzIGJlbG93IHJlYWQsIGFuZCB0aG9zZSBhcmUgZ2F0ZWQgb24gdGhlIHNhbWUgZmxhZy5cbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKS5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hMaW5rcygpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUNhc2VDb2xsaXNpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGNvbnN0IHBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gICAgY29uc3QgcmVuYW1lZEZpbGVQYXRocyA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVuYW1lZEZpbGVQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcbiAgICBjb25zdCByZW5hbWVkTGlua3MgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZWRMaW5rUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVuYW1lTWFwID0gbmV3IFJlbmFtZU1hcCh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBuZXdQYXRoOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcmVuYW1lTWFwLmZpbGwoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4gICAgICAvLyBCYWNrbGlua3MgYXJlIG9ubHkgY29uc3VtZWQgYnkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdywgd2hpY2ggYXJlIGdhdGVkIG9uXG4gICAgICAvLyBgc2hvdWxkSGFuZGxlUmVuYW1lc2AuIFNraXAgZ2F0aGVyaW5nIHRoZW0gKGEgYmFja2xpbmsgZmV0Y2ggcGVyIGF0dGFjaG1lbnQpIG9uIGEgbW92ZS1vbmx5IHJlbmFtZS5cbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0T3JpZ2luYWxMaW5rc01hcChjb21iaW5lZEJhY2tsaW5rc01hcCk7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhdHRhY2htZW50T2xkUGF0aCBvZiByZW5hbWVNYXAua2V5cygpKSB7XG4gICAgICAgICAgaWYgKGF0dGFjaG1lbnRPbGRQYXRoID09PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudE9sZFBhdGggfSk7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXAgPSBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rcy5kYXRhO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICAgIHBhdGg6IGF0dGFjaG1lbnRPbGRQYXRoLFxuICAgICAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgW29sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aF0gb2YgcmVuYW1lTWFwLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAob2xkQXR0YWNobWVudFBhdGggIT09IHRoaXMub2xkUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGZpeGVkTmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQob2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50UGF0aCwgZml4ZWROZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChvbGRBdHRhY2htZW50UGF0aCkpIHtcbiAgICAgICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoZGlybmFtZShvbGRBdHRhY2htZW50UGF0aCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGNsZWFudXBFbXB0eUZvbGRlcnMoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCxcbiAgICAgICAgZm9sZGVyUGF0aHM6IFsuLi5wYXJlbnRGb2xkZXJQYXRoc11cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAvKlxuICAgICAgICogVGhlIGF0dGFjaG1lbnQgbW92ZSBhYm92ZSBydW5zIHJlZ2FyZGxlc3Mgb2YgYHNob3VsZEhhbmRsZVJlbmFtZXNgICh0aGF0IGlzIHRoZSBwb2ludCBvZiBkZWNvdXBsaW5nXG4gICAgICAgKiBcIk1vdmUgYXR0YWNobWVudHMgd2l0aCBub3RlXCIgZnJvbSBcIlVwZGF0ZSBsaW5rc1wiKS4gVGhlIHJlbWFpbmluZyBzdGVwcyBvbmx5IHJld3JpdGUgbGlua3MsIHNvIHNraXBcbiAgICAgICAqIHRoZW0gd2hlbiBsaW5rIHVwZGF0ZXMgYXJlIGRpc2FibGVkOyB0aGUgYGZpbmFsbHlgIGJsb2NrIGJlbG93IHN0aWxsIHJ1bnMuXG4gICAgICAgKi9cbiAgICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhY2tsaW5rRW50cmllcyA9IFsuLi5jb21iaW5lZEJhY2tsaW5rc01hcCwgLi4udGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwXTtcbiAgICAgIGxldCBwcm9jZXNzZWRCYWNrbGlua0ZpbGVzID0gMDtcbiAgICAgIGZvciAoY29uc3QgW25ld0JhY2tsaW5rUGF0aCwgbGlua0tleVRvUGF0aE1hcF0gb2YgYmFja2xpbmtFbnRyaWVzKSB7XG4gICAgICAgIGxldCBsaW5rSW5kZXggPSAwO1xuICAgICAgICBhd2FpdCBlZGl0TGlua3Moe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgICAgICAgIGxpbmtJbmRleCsrO1xuICAgICAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudFBhdGggPSBsaW5rS2V5VG9QYXRoTWFwLmdldChnZXRMaW5rSWRlbnRpdHlLZXkobGluaykpO1xuICAgICAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgKiBBIGxpbmsgdGhhdCBpcyBub3QgaW4gdGhlIHNuYXBzaG90IHdhcyBlaXRoZXIgbmV2ZXIgb3VycyB0byByZXdyaXRlLCBvciB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgICAgKiByZXdyaXR0ZW4gYnkgc29tZW9uZSBlbHNlIChsZWF2aW5nIGl0IGNvcnJlY3QpLiBFaXRoZXIgd2F5IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gLVxuICAgICAgICAgICAgICAgKiBidXQgbG9nIGl0LCBiZWNhdXNlIGEgc2lsZW50IHNraXAgaGVyZSBpcyBleGFjdGx5IGhvd1xuICAgICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzYwIHN0YXllZFxuICAgICAgICAgICAgICAgKiBpbnZpc2libGU6IGV2ZXJ5IHNraXBwZWQgbGluayBsZWZ0IGEgYnJva2VuIGVtYmVkIGFuZCByZXBvcnRlZCBub3RoaW5nLlxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6dXBkYXRlQmFja2xpbmtzJykoXG4gICAgICAgICAgICAgICAgYE5vIHNuYXBzaG90IGVudHJ5IGZvciBsaW5rICR7dG9Kc29uKGxpbmspfSBpbiAke25ld0JhY2tsaW5rUGF0aH07IGxlYXZpbmcgaXQgdW5jaGFuZ2VkLmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IHJlbmFtZU1hcC5nZXQob2xkQXR0YWNobWVudFBhdGgpID8/IG9sZEF0dGFjaG1lbnRQYXRoO1xuXG4gICAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmFkZChuZXdCYWNrbGlua1BhdGgpO1xuICAgICAgICAgICAgcmVuYW1lZExpbmtzLmFkZChgJHtuZXdCYWNrbGlua1BhdGh9Ly8ke1N0cmluZyhsaW5rSW5kZXgpfWApO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua1BhcmFtcz4oe1xuICAgICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgICBvbGRUYXJnZXRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50UGF0aCxcbiAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXRoT3JGaWxlOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIHByb2Nlc3NlZEJhY2tsaW5rRmlsZXMrKztcbiAgICAgICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj8uKHtcbiAgICAgICAgICBjdXJyZW50UGF0aDogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgIHByb2Nlc3NlZDogcHJvY2Vzc2VkQmFja2xpbmtGaWxlcyxcbiAgICAgICAgICB0b3RhbDogYmFja2xpbmtFbnRyaWVzLmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTm90ZSh0aGlzLm5ld1BhdGgpKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZUxpbmtzSW5GaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rc0luRmlsZVBhcmFtcz4oe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGggfSkpIHtcbiAgICAgICAgbGV0IGludGVycnVwdGVkUmVuYW1lcyA9IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldCh0aGlzLm5ld1BhdGgpO1xuICAgICAgICBpZiAoIWludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lcyA9IFtdO1xuICAgICAgICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLnNldCh0aGlzLm5ld1BhdGgsIGludGVycnVwdGVkUmVuYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzLnB1c2goe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3Qgb3JwaGFuS2V5cyA9IFsuLi50aGlzLmhhbmRsZWRSZW5hbWVzLmtleXMoKV07XG4gICAgICBhZGRUb1F1ZXVlKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBvcnBoYW5LZXkgb2Ygb3JwaGFuS2V5cykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob3JwaGFuS2V5Lm9sZFBhdGgsIG9ycGhhbktleS5uZXdQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVuYW1lZExpbmtzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlT3JwaGFuZWRSZW5hbWVzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5vbGRQYXRoKTtcbiAgICBpZiAoaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGg6IGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2FzZUNvbGxpc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWdldERhdGFBZGFwdGVyRXgodGhpcy5hcHApLmluc2Vuc2l0aXZlIHx8IHRoaXMub2xkUGF0aC50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLm5ld1BhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBqb2luKGRpcm5hbWUodGhpcy5uZXdQYXRoKSwgYF9fdGVtcF9fJHtiYXNlbmFtZSh0aGlzLm5ld1BhdGgpfWApO1xuICAgIGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZCh0aGlzLm5ld1BhdGgsIHRlbXBvcmFyeVBhdGgpO1xuXG4gICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICBuZXdQYXRoOiB0ZW1wb3JhcnlQYXRoLFxuICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcblxuICAgIGF3YWl0IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUoZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRlbXBvcmFyeVBhdGggfSksIHRoaXMubmV3UGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hMaW5rcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmYWtlT2xkRmlsZSA9IGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgICBsZXQgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICAgIHtcbiAgICAgIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKHRoaXMuYXBwLCBbZmFrZU9sZEZpbGVdKTtcbiAgICAgIGNvbnN0IGZha2VPbGRGaWxlQmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBmYWtlT2xkRmlsZSB9KTtcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQgPSBmYWtlT2xkRmlsZUJhY2tsaW5rcy5kYXRhO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2JhY2tsaW5rUGF0aCwgcmVmcmVzaGVkTGlua3NdIG9mIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQpIHtcbiAgICAgIGxldCBvbGRMaW5rcyA9IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5nZXQoYmFja2xpbmtQYXRoKTtcbiAgICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgICAgb2xkTGlua3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIHJlZnJlc2hlZExpbmtzKSB7XG4gICAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW5hbWVIYW5kbGVkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBuZXdQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmFkZChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVNYXAge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5uZXdQYXRoID0gcGFyYW1zLm5ld1BhdGg7XG4gICAgdGhpcy5vbGRQYXRoTGlua3MgPSB0aGlzLm9sZENhY2hlID8gZ2V0TGlua3MoeyBjYWNoZTogdGhpcy5vbGRDYWNoZSB9KSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBzdHJpbmddPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmVudHJpZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5vbGRQYXRoLCB0aGlzLm5ld1BhdGgpO1xuXG4gICAgaWYgKCFpc05vdGUodGhpcy5vbGRQYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ic2lkaWFuIGRvZXMgbm90IGluZGV4IGEgY2FudmFzIGZpbGUgaW50byB0aGUgbWV0YWRhdGEgY2FjaGUuXG4gICAgLy8gVGhlIGNhY2hlLWRlcml2ZWQgYG9sZFBhdGhMaW5rc2AgaXMgZW1wdHkgZm9yIGEgY2FudmFzLCBoaWRpbmcgaXRzIGVtYmVkZGVkIGF0dGFjaG1lbnRzLlxuICAgIC8vIFJlYWRpbmcgdGhlIGNhbnZhcyByZWZlcmVuY2VzIGRpcmVjdGx5IG1vdmVzIHRoZW0gd2l0aCB0aGUgY2FudmFzIChtaXJyb3Jpbmcgbm90ZSBiZWhhdmlvcikuXG4gICAgLy8gVGhlIGZpbGUgYWxyZWFkeSBsaXZlcyBhdCB0aGUgbmV3IHBhdGggYWZ0ZXIgdGhlIHJlbmFtZSwgc28gcmVhZCB0aGUgcmVmZXJlbmNlcyBmcm9tIHRoZXJlLlxuICAgIGlmIChpc0NhbnZhc0ZpbGUodGhpcy5vbGRQYXRoKSkge1xuICAgICAgY29uc3QgY2FudmFzUmVmZXJlbmNlcyA9IGF3YWl0IGdldENhbnZhc1JlZmVyZW5jZXModGhpcy5hcHAsIHRoaXMubmV3UGF0aCk7XG4gICAgICB0aGlzLm9sZFBhdGhMaW5rcy5wdXNoKC4uLmNhbnZhc1JlZmVyZW5jZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGNvbnN0IG9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCB0aGlzLmdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGUpO1xuXG4gICAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGhcbiAgICAgIH0pXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gICAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKCFvbGRBdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgICBpZiAoXG4gICAgICBhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAob2xkQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgfHwgb2xkQXR0YWNobWVudEZpbGUucGF0aC5zdGFydHNXaXRoKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpKTtcbiAgICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm9sZFBhdGgpO1xuICAgICAgICAgIGtleXMuZGVsZXRlKHRoaXMubmV3UGF0aCk7XG4gICAgICAgICAgaWYgKGtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdBdHRhY2htZW50RmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgIG9sZE5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPyBvbGRBdHRhY2htZW50RmlsZS5wYXRoIDogcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBqb2luKG5ld0ZvbGRlciwgb2xkQXR0YWNobWVudEZpbGUubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50RmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50RmlsZVBhdGggfSk7XG4gICAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmZpbGxSZW5hbWVNYXAnKShgUmVtb3ZpbmcgY29uZmxpY3RpbmcgYXR0YWNobWVudCAke25ld0F0dGFjaG1lbnRGaWxlLnBhdGh9LmApO1xuICAgICAgICAgIGF3YWl0IHRyYXNoU2FmZSh0aGlzLmFwcCwgbmV3QXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gZGlybmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gYmFzZW5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoLCBleHRlbnNpb24pO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSB0aGlzLmFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKGpvaW4oZGlyZWN0b3J5LCBiYXNlTmFtZSksIGV4dGVuc2lvbi5zbGljZSgxKSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcC5zZXQob2xkQXR0YWNobWVudEZpbGUucGF0aCwgbmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0KG9sZFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChvbGRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0QmFja2xpbmtzTWFwKHBhcmFtczogUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgcGF0aCxcbiAgICAgIHNpbmdsZUJhY2tsaW5rc01hcFxuICAgIH0gPSBwYXJhbXM7XG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCBsaW5rc10gb2Ygc2luZ2xlQmFja2xpbmtzTWFwKSB7XG4gICAgICBjb25zdCBuZXdCYWNrbGlua1BhdGggPSB0aGlzLm1hcC5nZXQoYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgICBjb25zdCBsaW5rS2V5VG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtLZXlUb1BhdGhNYXApO1xuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgIGxpbmtLZXlUb1BhdGhNYXAuc2V0KGdldExpbmtJZGVudGl0eUtleShsaW5rKSwgcGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHsgYXBwOiB0aGlzLmFwcCwgbGluazogb2xkUGF0aExpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCB9KTtcbiAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+KFtbdGhpcy5uZXdQYXRoLCBbb2xkUGF0aExpbmtdXV0pO1xuICAgICAgdGhpcy5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsXG4gICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYmFja2xpbmtzTWFwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlOiBURmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtvbGRGaWxlXSk7XG4gICAgdXNpbmcgX2NhY2hlUmVnaXN0cmF0aW9uID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWRcbiAgICAgID8gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBjYWNoZTogdGhpcy5vbGRDYWNoZSwgcGF0aE9yRmlsZTogb2xkRmlsZSB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGhcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA6IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZURlbGV0ZUhhbmRsZXJzTWFwJywgbmV3IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4oKSkudmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2V0dGluZ3MoKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgICBjb25zdCBzZXR0aW5nc0J1aWxkZXJzID0gWy4uLnRoaXMucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAudmFsdWVzKCldLnJldmVyc2UoKTtcblxuICAgIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4gPSB7fTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1pbW1lZGlhdGUtbXV0YXRpb24gLS0gRm9sZGluZyB0aGVzZSBpbnRvIHRoZSBvYmplY3QgbGl0ZXJhbCBrZWVwcyB0aGVtIG9wdGlvbmFsIHVuZGVyIGBQYXJ0aWFsPD5gLCBsb3NpbmcgdGhlIG5hcnJvd2luZyB0aGF0IG1ha2VzIHRoZW0gY2FsbGFibGUgYmVsb3cgd2l0aG91dCBhIG51bGxpc2ggY2hlY2suXG4gICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gaXNOb3RlKHBhdGgpO1xuICAgIHNldHRpbmdzLmlzUGF0aElnbm9yZWQgPSAoKTogYm9vbGVhbiA9PiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qgc2V0dGluZ3NCdWlsZGVyIG9mIHNldHRpbmdzQnVpbGRlcnMpIHtcbiAgICAgIGNvbnN0IG5ld1NldHRpbmdzID0gc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgICBzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzID8/IGZhbHNlO1xuICAgICAgaWYgKG5ld1NldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IpIHtcbiAgICAgICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gbmV3U2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvcjtcbiAgICAgIH1cbiAgICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlcyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzID8/IGZhbHNlO1xuICAgICAgaWYgKG5ld1NldHRpbmdzLmdldFJlc2N1ZVBhdGgpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogRmlyc3QgcGx1Z2luIHRvIGFuc3dlciBvd25zIHRoZSBkZXN0aW5hdGlvbiwgbWlycm9yaW5nIGBlbXB0eUZvbGRlckJlaGF2aW9yYC4gTGVmdCBgdW5kZWZpbmVkYFxuICAgICAgICAgKiB3aGVuIG5vYm9keSBpbXBsZW1lbnRzIGl0LCBzbyB0aGUgcmVzY3VlIG5ldmVyIHJ1bnMgZm9yIGNvbnN1bWVycyB0aGF0IGRpZCBub3Qgb3B0IGluLlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCA/Pz0gbmV3U2V0dGluZ3MuZ2V0UmVzY3VlUGF0aDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzUGF0aElnbm9yZWQgPSBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkO1xuICAgICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzUGF0aElnbm9yZWQocGF0aCkgfHwgKG5ld1NldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSA/PyBmYWxzZSk7XG4gICAgICBjb25zdCBjdXJyZW50SXNOb3RlID0gc2V0dGluZ3MuaXNOb3RlO1xuICAgICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gY3VycmVudElzTm90ZShwYXRoKSAmJiAobmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICAgIHJldHVybiBzZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCBoYW5kbGVzIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqIEl0IGxpc3RlbnMgdG8gcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGFuZCB1cGRhdGVzIGxpbmtzIGFjY29yZGluZ2x5LlxuICogSXQgYWxzbyBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBjYXNlLW9ubHkgcmVuYW1lcyBhbmQgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgY29tcG9uZW50IHdob3NlIHNpZ25hbCBjYW5jZWxzIGluLWZsaWdodCByZW5hbWUgb3BlcmF0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgd2hvc2UgbGlua3MgYXJlIHVwZGF0ZWQgZHVyaW5nIGEgcmVuYW1lL21vdmUsXG4gICAqIHdpdGggdGhlIHJ1bm5pbmcgY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gYG51bGxgLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBJRCB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgaGFuZGxlciBhbW9uZyB0aGUgcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbXBvbmVudCB1c2VkIHRvIHJlcG9ydCB1cGRhdGVkIGxpbmtzIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIGxvY2sgY29tcG9uZW50IHVzZWQgdG8gZ3VhcmQgbGluayB1cGRhdGVzLCBvciBgbnVsbGAgaWYgbm9uZSBpcyB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcblxuICAvKipcbiAgICogQnVpbGRzIHRoaXMgcGx1Z2luJ3MgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuYWdlciB0aGF0IGFnZ3JlZ2F0ZXMgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzIGFjcm9zcyByZWdpc3RlcmVkIHBsdWdpbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzID0gbmV3IEhhbmRsZWRSZW5hbWVzKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50ID0gcGFyYW1zLmFib3J0U2lnbmFsQ29tcG9uZW50O1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID0gcGFyYW1zLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID8/IG51bGw7XG4gICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSBwYXJhbXMucmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICAgIHRoaXMucGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luSWQ7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NCdWlsZGVyID0gcGFyYW1zLnNldHRpbmdzQnVpbGRlcjtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IG5ldyBTZXR0aW5nc01hbmFnZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG5cbiAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5zZXQodGhpcy5wbHVnaW5JZCwgdGhpcy5zZXR0aW5nc0J1aWxkZXIpO1xuICAgIHRoaXMubG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmRlbGV0ZSh0aGlzLnBsdWdpbklkKTtcbiAgICAgIHRoaXMubG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIHRoaXMuaGFuZGxlUmVuYW1lLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiB0aGlzLmFwcC5maWxlTWFuYWdlcixcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLFxuICAgICAgICBzaG91bGRJbnZva2VIYW5kbGVyOiB0aGlzLnNob3VsZEludm9rZUhhbmRsZXIuYmluZCh0aGlzKVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGUoZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgRGVsZXRlSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZURlbGV0ZSwgeyBmaWxlUGF0aDogZmlsZS5wYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ldyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyKHtcbiAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgZmlsZSxcbiAgICAgIHByZXZpb3VzQ2FjaGUsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbmFtZShmaWxlOiBUQWJzdHJhY3RGaWxlLCBvbGRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXRoID0gZmlsZS5wYXRoO1xuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YCk7XG4gICAgaWYgKHRoaXMuaGFuZGxlZFJlbmFtZXMuaGFzKG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgcmVuYW1lIG9jY3VycmluZyBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIEFkdmFuY2VkIE5vdGUgQ29tcG9zZXIncyBmb2xkZXIgbWVyZ2UpIGlzIG9yY2hlc3RyYXRlZCBieSB0aGF0XG4gICAgICogdHJhbnNhY3Rpb24ncyBvd25lciwgd2hpY2ggdGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gUmVhY3RpbmcgdG8gaXRcbiAgICAgKiBoZXJlIHdvdWxkIChhKSBwZXJ0dXJiIE9ic2lkaWFuJ3MgbmF0aXZlIHBvc3QtcmVuYW1lIGxpbmsgdXBkYXRlIGFuZCBsZWF2ZSBsaW5rcyBkYW5nbGluZywgYW5kXG4gICAgICogKGIpIGNvbGxpZGUgd2l0aCB0aGUgZm9yZWlnbiB0cmFuc2FjdGlvbiBcdTIwMTQgYW4gYXN5bmMgYWJvcnQgZnJvbSB0aGlzIGhhbmRsZXIgYWJvcnRzIGFuXG4gICAgICogYWxyZWFkeS1jb21taXR0ZWQgdHJhbnNhY3Rpb24sIHRocm93aW5nIFwiQ2Fubm90IHJvbGwgYmFjayBhIGNvbW1pdHRlZCB0cmFuc2FjdGlvblwiLiBUaGlzXG4gICAgICogaGFuZGxlcidzIG93biBhdHRhY2htZW50IG1vdmVzIGFyZSBhbHJlYWR5IGV4Y2x1ZGVkIGFib3ZlIHZpYSBgaGFuZGxlZFJlbmFtZXNgLCBzbyBhIGxvY2sgc3RpbGxcbiAgICAgKiBoZWxkIGhlcmUgYWx3YXlzIGJlbG9uZ3MgdG8gYSBmb3JlaWduIG9wZXJhdGlvbjsgc3RheSBvdXQgb2YgaXRzIHdheS4gU2VlXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWFkdmFuY2VkLW5vdGUtY29tcG9zZXIvaXNzdWVzLzE0Ni5cbiAgICAgKi9cbiAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBvbGRQYXRoKSB8fCBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBvY2N1cnMgaW5zaWRlIGEgZm9yZWlnbiBsb2NrZWQgdHJhbnNhY3Rpb24uYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05vT3BSZW5hbWUoc2V0dGluZ3MsIG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBpcyBub3QgYSBub3RlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdpdGggbGluayB1cGRhdGVzIGRpc2FibGVkLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKHRoaXMuYXBwLCBvbGRQYXRoKS5kYXRhO1xuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQuYWJvcnRTaWduYWwsXG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlUmVuYW1lLCB7IG5ld1BhdGgsIG9sZFBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXRoIGxpbmsgcmV3cml0aW5nIG9mZiwgdGhlIGhhbmRsZXIncyBvbmx5IHJlbWFpbmluZyBqb2JzIGFyZSBtb3ZpbmcgYSBOT1RFJ3MgYXR0YWNobWVudHMgYW5kIHBydW5pbmdcbiAgICogdGhlIGZvbGRlciBhIG1vdmVkIGZpbGUgdmFjYXRlZC4gQSBub24tbm90ZSByZW5hbWUgbmVlZHMgbmVpdGhlciB3aGVuIGVtcHR5IGZvbGRlcnMgYXJlIGtlcHQsIHNvIHRoZXJlXG4gICAqIGlzIG5vdGhpbmcgdG8gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgZmlsZSB3YXMgcmVuYW1lZCBmcm9tLlxuICAgKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBwYXRoIHRoZSBmaWxlIHdhcyByZW5hbWVkIHRvLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgaGFuZGxlciB3b3VsZCBkbyBubyB3b3JrIGZvciB0aGlzIHJlbmFtZS5cbiAgICovXG4gIHByaXZhdGUgaXNOb09wUmVuYW1lKHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4sIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzXG4gICAgICAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKG9sZFBhdGgpID8/IGZhbHNlKVxuICAgICAgJiYgIShzZXR0aW5ncy5pc05vdGU/LihuZXdQYXRoKSA/PyBmYWxzZSlcbiAgICAgICYmIChzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCkgPT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcDtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6bG9nUmVnaXN0ZXJlZEhhbmRsZXJzJykoXG4gICAgICBgUGx1Z2lucyB3aXRoIHJlZ2lzdGVyZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyczogJHtKU09OLnN0cmluZ2lmeShbLi4ucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpXSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEludm9rZUhhbmRsZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcbiAgICBjb25zdCBtYWluUGx1Z2luSWQgPSBbLi4ucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpXVswXTtcbiAgICByZXR1cm4gbWFpblBsdWdpbklkID09PSB0aGlzLnBsdWdpbklkO1xuICB9XG59XG5cbi8qKlxuICogTW92ZXMgYW4gYXR0YWNobWVudCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgdG8gd2hlcmV2ZXIgdGhlIGNvbnN1bWluZyBwbHVnaW4gc2F5cyBpdCBiZWxvbmdzLlxuICpcbiAqIFNoYXJlZCBieSBib3RoIGRlbGV0ZSBwYXRocyBcdTIwMTQgdGhlIG5vdGUgZGVsZXRlIGluIHtAbGluayBEZWxldGVIYW5kbGVyfSBhbmQgdGhlIGZvbGRlciBkZWxldGUgcmVwbGF5ZWQgYnlcbiAqIHtAbGluayBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnR9IFx1MjAxNCBiZWNhdXNlIGJvdGggcmVhY2ggdGhlIHNhbWUgcG9pbnQ6IHtAbGluayBkZWxldGVJZk5vdFVzZWR9IGhhc1xuICogZGVjaWRlZCB0aGUgYXR0YWNobWVudCBtdXN0IHN1cnZpdmUsIGFuZCB3aXRob3V0IHRoaXMgaXQgd291bGQgc3Vydml2ZSBpbiBhIGZvbGRlciBub3RoaW5nIG93bnMgYW55IG1vcmUuXG4gKlxuICogQSBjb25zdW1lciB0aGF0IGRvZXMgbm90IGltcGxlbWVudCB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LCBvciB0aGF0IGFuc3dlcnNcbiAqIGBudWxsYCwgZ2V0cyBleGFjdGx5IHRoZSBiZWhhdmlvciBpdCBoYWQgYmVmb3JlIHRoaXMgZXhpc3RlZDogdGhlIGF0dGFjaG1lbnQgc3RheXMgcHV0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB3aGV0aGVyIHRoZSBhdHRhY2htZW50IHdhcyBtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudChwYXJhbXM6IERpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnRQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gIGlmICghc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlLnBhdGg7XG4gIGNvbnN0IHJlc2N1ZVBhdGggPSBhd2FpdCBzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKHtcbiAgICBhdHRhY2htZW50UGF0aCxcbiAgICBzdXJ2aXZpbmdOb3RlUGF0aHM6IHBhcmFtcy5yZXNjdWVQYXJhbXMuc3Vydml2aW5nTm90ZVBhdGhzXG4gIH0pO1xuXG4gIGlmIChyZXNjdWVQYXRoID09PSBudWxsKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCcpKGBObyByZXNjdWUgcGF0aCBmb3IgJHthdHRhY2htZW50UGF0aH07IGtlZXBpbmcgaXQgd2hlcmUgaXQgaXMuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvKlxuICAgICAqIGByZW5hbWVTYWZlYCBjcmVhdGVzIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIsIHJlc29sdmVzIGEgY29sbGlzaW9uIHZpYSBgZ2V0U2FmZVJlbmFtZVBhdGhgLCBhbmQgbW92ZXNcbiAgICAgKiB0aHJvdWdoIGBhcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZWAsIHNvIHRoZSBzdXJ2aXZpbmcgbm90ZXMnIGxpbmtzIGZvbGxvdyB0aGUgYXR0YWNobWVudC5cbiAgICAgKi9cbiAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoe1xuICAgICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgICAgbmV3UGF0aDogcmVzY3VlUGF0aCxcbiAgICAgIG9sZFBhdGhPckFic3RyYWN0RmlsZTogcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlXG4gICAgfSk7XG5cbiAgICBpZiAobmV3QXR0YWNobWVudFBhdGggPT09IGF0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGF0dGFjaG1lbnQgaXMgYWxyZWFkeSB3aGVyZSBpdCBiZWxvbmdzLiBUaGlzIGlzIHRoZSBub3JtYWwgc2Vjb25kIGxvb2sgYXQgYSBmaWxlIHRoZSBmb2xkZXJcbiAgICAgICAqIGRlbGV0ZSBqdXN0IHJlc2N1ZWQ6IHRoZSBvd25pbmcgbm90ZSdzIG93biBkZWxldGlvbiBpcyByZXBvcnRlZCBhZnRlcndhcmRzIGFuZCB3YWxrcyBpdHMgbGlua3NcbiAgICAgICAqIGFnYWluLiBOb3RoaW5nIG1vdmVkLCBzbyBub3RoaW5nIGlzIGNsYWltZWQgXHUyMDE0IHRoZSBjYWxsZXIga2VlcHMgaXQgaW4gcGxhY2UsIHdoaWNoIGlzIHRoZSB0cnV0aC5cbiAgICAgICAqL1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCcpKGAke2F0dGFjaG1lbnRQYXRofSBhbHJlYWR5IHNpdHMgYXQgaXRzIHJlc2N1ZSBwYXRoOyBub3RoaW5nIHRvIG1vdmUuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgbW92ZSBmaXJlcyBgdmF1bHQub24oJ3JlbmFtZScpYCwgc28gdGhpcyBoYW5kbGVyJ3Mgb3duIGBSZW5hbWVIYW5kbGVyYCBwaWNrcyBpdCB1cCBsaWtlIGFueSBvdGhlclxuICAgICAqIGF0dGFjaG1lbnQgbW92ZS4gSXQgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZWdpc3RlcmVkIGluIGBoYW5kbGVkUmVuYW1lc2A6XG4gICAgICogYEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRgIGFscmVhZHkgZGlzY2FyZHMgT2JzaWRpYW4ncyBuYXRpdmUgbGluayB1cGRhdGUgd2hpbGVcbiAgICAgKiBgc2hvdWxkSGFuZGxlUmVuYW1lc2AgaXMgb24sIHNvIHN1cHByZXNzaW5nIHRoZSBoYW5kbGVyIGFzIHdlbGwgd291bGQgbGVhdmUgZGFuZ2xpbmcgZXhhY3RseSB0aGUgbGlua3NcbiAgICAgKiB0aGlzIHJlc2N1ZSBleGlzdHMgdG8gcHJlc2VydmUuIExldCB0aGUgcmV3cml0ZSBzZXR0bGUgYmVmb3JlIHRoZSBkZWxldGUgd2FsayBjYXJyaWVzIG9uLlxuICAgICAqL1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXMocGFyYW1zLmFwcCk7XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYFJlc2N1ZWQgJHthdHRhY2htZW50UGF0aH0gdG8gJHtuZXdBdHRhY2htZW50UGF0aH0uYCk7XG4gICAgcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5ub3RpY2VzLmF0dGFjaG1lbnRSZXNjdWVkLCB7IGF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCB9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLypcbiAgICAgKiBBIHJlc2N1ZSB0aGF0IGhhbGYgaGFwcGVuZWQgbXVzdCBub3QgcmVhZCBhcyBzdWNjZXNzIFx1MjAxNCByZXBvcnRpbmcgYGZhbHNlYCBmYWxscyBiYWNrIHRvIGtlZXBpbmcgdGhlXG4gICAgICogYXR0YWNobWVudCBpbiBwbGFjZSB3aXRoIHRoZSBgYXR0YWNobWVudElzU3RpbGxVc2VkYCBub3RpY2UsIHdoaWNoIGlzIHN0aWxsIHNhZmUuXG4gICAgICovXG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNjdWUgJHthdHRhY2htZW50UGF0aH0gdG8gJHtyZXNjdWVQYXRofWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGtleSB1bmRlciB3aGljaCBhIGxpbmsgaXMgcmVtZW1iZXJlZCB3aGlsZSBhIHJlbmFtZSBpcyBpbiBmbGlnaHQuXG4gKlxuICogVGhlIHJld3JpdGUgaGFzIHRvIG1hdGNoIGxpbmtzIGNhcHR1cmVkIEJFRk9SRSB0aGUgYXR0YWNobWVudHMgbW92ZWQgYWdhaW5zdCB0aGUgbGlua3MgdGhlIG1ldGFkYXRhIGNhY2hlXG4gKiByZXBvcnRzIEFGVEVSIHRoZXkgbW92ZWQsIGFuZCB0aGUgb25seSB0aGluZyB0aGF0IHJlbGlhYmx5IHN1cnZpdmVzIHRoYXQgZ2FwIGlzIHRoZSBsaW5rJ3MgVEVYVC5cbiAqIERlbGliZXJhdGVseSBleGNsdWRlcyBgcG9zaXRpb25gOiBrZXlpbmcgb24gdGhlIHdob2xlIHtAbGluayBSZWZlcmVuY2V9IG1lYW50IHRoYXQgYXMgc29vbiBhcyBhbnl0aGluZ1xuICogZWRpdGVkIHRoZSBmaWxlIGluIGJldHdlZW4gXHUyMDE0IGEgY28taW5zdGFsbGVkIHBsdWdpbiByZXdyaXRpbmcgaXRzIG93biBsaW5rcywgbW9zdCBvZnRlbiBcdTIwMTQgZXZlcnkgbGluayBiZWxvd1xuICogdGhlIGVkaXQgc2hpZnRlZCBpdHMgb2Zmc2V0cywgbWlzc2VkIGl0cyBrZXksIGFuZCB3YXMgc2tpcHBlZCBpbiBzaWxlbmNlLCBsZWF2aW5nIHRoZSBub3RlIHdpdGggc29tZSBlbWJlZHNcbiAqIHJld3JpdHRlbiBhbmQgdGhlIHJlc3QgYnJva2VuLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbi9pc3N1ZXMvNjAuXG4gKlxuICogVHdvIGxpbmtzIHdpdGggaWRlbnRpY2FsIHRleHQgaW4gb25lIGZpbGUgbmVjZXNzYXJpbHkgcmVzb2x2ZSB0byB0aGUgc2FtZSB0YXJnZXQsIHNvIGNvbGxhcHNpbmcgdGhlbSBvbnRvXG4gKiBvbmUga2V5IGxvc2VzIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBidWlsZCB0aGUga2V5IGZvci5cbiAqIEByZXR1cm5zIFRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIGxpbmsgYnkgaXRzIHRleHQgYWxvbmUuXG4gKi9cbmZ1bmN0aW9uIGdldExpbmtJZGVudGl0eUtleShsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Kc29uKHtcbiAgICBsaW5rOiBsaW5rLmxpbmssXG4gICAgb3JpZ2luYWw6IGxpbmsub3JpZ2luYWxcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbmV4cG9ydCB7IEVtcHR5Rm9sZGVyQmVoYXZpb3IgfSBmcm9tICcuLi92YXVsdC50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBb0JBLDZCQUdPO0FBQ1AscUJBQWtCO0FBQ2xCLHNCQUdPO0FBWVAsbUJBQThCO0FBQzlCLG1CQUErQjtBQUMvQixtQkFBMkI7QUFDM0IsMEJBR087QUFDUCxzQ0FBeUM7QUFDekMsa0JBTU87QUFDUCw2QkFLTztBQUNQLG9CQUFvQztBQUNwQywwQkFBMEM7QUFDMUMseUJBVU87QUFDUCxrQkFLTztBQUNQLDRCQU1PO0FBQ1AsbUJBQTJCO0FBQzNCLDJCQUFrRDtBQUNsRCwwQkFBZ0M7QUFDaEMsbUJBT087QUFDUCwwQkFBNEI7QUFDNUIscUNBR087QUEya0RQLElBQUFBLGdCQUFvQztBQTE4Q3BDLE1BQU0sY0FBYyx1QkFBTyxJQUFJLHFCQUFxQjtBQWdEcEQsTUFBTSxjQUFjO0FBQUEsRUFDRDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEs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ckQscUNBQWUsMkNBQTJDO0FBQUEsTUFDeEQsbURBQW1ELEtBQUssVUFBVSxDQUFDLEdBQUcsd0JBQXdCLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFBQSxJQUN4RztBQUFBLEVBQ0Y7QUFBQSxFQUVRLHNCQUErQjtBQUNyQyxVQUFNLDBCQUEwQixLQUFLLGdCQUFnQjtBQUNyRCxVQUFNLGVBQWUsQ0FBQyxHQUFHLHdCQUF3QixLQUFLLENBQUMsRUFBRSxDQUFDO0FBQzFELFdBQU8saUJBQWlCLEtBQUs7QUFBQSxFQUMvQjtBQUNGO0FBZUEsZUFBZSw2QkFBNkIsUUFBOEQ7QUFDeEcsUUFBTSxXQUFXLE9BQU8sZ0JBQWdCLFlBQVk7QUFDcEQsTUFBSSxDQUFDLFNBQVMsZUFBZTtBQUMzQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0saUJBQWlCLE9BQU8sYUFBYSxLQUFLO0FBQ2hELFFBQU0sYUFBYSxNQUFNLFNBQVMsY0FBYztBQUFBLElBQzlDO0FBQUEsSUFDQSxvQkFBb0IsT0FBTyxhQUFhO0FBQUEsRUFDMUMsQ0FBQztBQUVELE1BQUksZUFBZSxNQUFNO0FBQ3ZCLHFDQUFlLGtEQUFrRCxFQUFFLHNCQUFzQixjQUFjLDJCQUEyQjtBQUNsSSxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFLRixVQUFNLG9CQUFvQixVQUFNLHlCQUFXO0FBQUEsTUFDekMsS0FBSyxPQUFPO0FBQUEsTUFDWixTQUFTO0FBQUEsTUFDVCx1QkFBdUIsT0FBTyxhQUFhO0FBQUEsSUFDN0MsQ0FBQztBQUVELFFBQUksc0JBQXNCLGdCQUFnQjtBQU14Qyx1Q0FBZSxrREFBa0QsRUFBRSxHQUFHLGNBQWMsb0RBQW9EO0FBQ3hJLGFBQU87QUFBQSxJQUNUO0FBU0EsY0FBTSwrQ0FBMEIsT0FBTyxHQUFHO0FBRTFDLHFDQUFlLGtEQUFrRCxFQUFFLFdBQVcsY0FBYyxPQUFPLGlCQUFpQixHQUFHO0FBQ3ZILFdBQU8sc0JBQXNCLGVBQVcsa0JBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLFFBQVEsbUJBQW1CLEVBQUUsZ0JBQWdCLGtCQUFrQixDQUFDLENBQUM7QUFDckksV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFPO0FBS2QsaUNBQVcsSUFBSSxNQUFNLG9CQUFvQixjQUFjLE9BQU8sVUFBVSxJQUFJLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUM3RixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBbUJBLFNBQVMsbUJBQW1CLE1BQXlCO0FBQ25ELGFBQU8sNEJBQU87QUFBQSxJQUNaLE1BQU0sS0FBSztBQUFBLElBQ1gsVUFBVSxLQUFLO0FBQUEsRUFDakIsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfdmF1bHQiXQp9Cg==
1303
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVlcGx5IGNvdXBsZWQgdG8gT2JzaWRpYW4gcnVudGltZTsgcmVxdWlyZXMgcnVubmluZyB2YXVsdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0aW5nLiAqL1xuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgSW50ZXJuYWxQbHVnaW5OYW1lXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IHQgfSBmcm9tICdpMThuZXh0JztcbmltcG9ydCB7XG4gIEZpbGVNYW5hZ2VyLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfSBmcm9tICcuLi9saW5rLXVwZGF0ZS1wcm9ncmVzcy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB0eXBlIHsgUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQgdHlwZSB7IEFib3J0U2lnbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGZpbHRlckluUGxhY2UgfSBmcm9tICcuLi8uLi9hcnJheS50cyc7XG5pbXBvcnQgeyBnZXRMaWJEZWJ1Z2dlciB9IGZyb20gJy4uLy4uL2RlYnVnLnRzJztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvci50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi8uLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7XG4gIENBTlZBU19GSUxFX0VYVEVOU0lPTixcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzRmlsZSxcbiAgaXNGb2xkZXIsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZWRpdExpbmtzLFxuICBleHRyYWN0TGlua0ZpbGUsXG4gIHVwZGF0ZUxpbmssXG4gIHVwZGF0ZUxpbmtzSW5GaWxlXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldExpbmtzLFxuICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBhZGRUb1F1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yIH0gZnJvbSAnLi4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgeyBkZWxldGVJZk5vdFVzZWQgfSBmcm9tICcuLi92YXVsdC1kZWxldGUudHMnO1xuaW1wb3J0IHtcbiAgY2xlYW51cEVtcHR5Rm9sZGVycyxcbiAgRW1wdHlGb2xkZXJCZWhhdmlvcixcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIGlzQ2hpbGRPclNlbGYsXG4gIHJlbmFtZVNhZmUsXG4gIHRyYXNoU2FmZVxufSBmcm9tICcuLi92YXVsdC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGhhc1BhdGNoVG9rZW4sXG4gIE1vbmtleUFyb3VuZENvbXBvbmVudFxufSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlc2N1ZVBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQgdGhhdCBpcyBhYm91dCB0byBiZSBzdHJhbmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGFjaG1lbnRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgdGhhdCBzdGlsbCByZWZlcmVuY2UgdGhlIGF0dGFjaG1lbnQgb25jZSB0aGUgZGVsZXRpb24gaXMgZG9uZS4gTmV2ZXIgZW1wdHkuXG4gICAqL1xuICByZWFkb25seSBzdXJ2aXZpbmdOb3RlUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICAgKi9cbiAgZW1wdHlGb2xkZXJCZWhhdmlvcjogRW1wdHlGb2xkZXJCZWhhdmlvcjtcblxuICAvKipcbiAgICogV2hlcmUgdG8gbW92ZSBhbiBhdHRhY2htZW50IHRoYXQgYSBkZWxldGlvbiB3b3VsZCBvdGhlcndpc2Ugc3RyYW5kIFx1MjAxNCBvbmUgdGhhdCBzdXJ2aXZlcyBiZWNhdXNlIGFub3RoZXJcbiAgICogbm90ZSBzdGlsbCByZWZlcmVuY2VzIGl0LCBidXQgaXMgbGVmdCBzaXR0aW5nIGluIGEgZm9sZGVyIHdob3NlIG93bmluZyBub3RlIGlzIGdvbmUuXG4gICAqXG4gICAqIERlY2lkaW5nIHRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgcGx1Z2luJ3MgYXR0YWNobWVudC1wYXRoIHBvbGljeSwgd2hpY2ggaXMgd2h5IHRoZSBoYW5kbGVyIGFza3MgcmF0aGVyXG4gICAqIHRoYW4gZ3Vlc3Nlcy4gUmV0dXJuaW5nIGBudWxsYCBcdTIwMTQgb3Igbm90IGltcGxlbWVudGluZyB0aGlzIGF0IGFsbCBcdTIwMTQga2VlcHMgdGhlIGF0dGFjaG1lbnQgd2hlcmUgaXQgaXMsXG4gICAqIHdoaWNoIGlzIHRoZSBiZWhhdmlvciBldmVyeSBjb25zdW1lciBoYWQgYmVmb3JlIHRoaXMgbWVtYmVyIGV4aXN0ZWQuXG4gICAqL1xuICBnZXRSZXNjdWVQYXRoPyhwYXJhbXM6IEdldFJlc2N1ZVBhdGhQYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIGlzTm90ZShwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGlnbm9yZSB0aGUgcGF0aC5cbiAgICovXG4gIGlzUGF0aElnbm9yZWQocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgY29uZmxpY3RpbmcgYXR0YWNobWVudHMuXG4gICAqL1xuICBzaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSBkZWxldGlvbnMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVEZWxldGlvbnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIHJlbmFtZXMuXG4gICAqL1xuICBzaG91bGRIYW5kbGVSZW5hbWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZpbGVzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZm9sZGVyIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlZFJlbmFtZUtleSB7XG4gIG5ld1BhdGg6IHN0cmluZztcbiAgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcD86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tYmluZWQgYmFja2xpbmtzIG1hcCwga2V5ZWQgYnkgbmV3IGJhY2tsaW5rIHBhdGgsIGFjY3VtdWxhdGluZyBsaW5rLUpTT04gdG8gc291cmNlLXBhdGggbWFwcGluZ3MuXG4gICAqL1xuICByZWFkb25seSBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdob3NlIGJhY2tsaW5rcyBhcmUgYmVpbmcgcmVjb3JkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBiYWNrbGlua3MgbWFwIGZvciBhIHNpbmdsZSBmaWxlLCBrZXllZCBieSBiYWNrbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2luZ2xlQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG59XG5cbmNvbnN0IFBBVENIX1RPS0VOID0gU3ltYm9sLmZvcigncmVuYW1lRGVsZXRlSGFuZGxlcicpO1xuXG5pbnRlcmZhY2UgRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudFBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBmaWxlTWFuYWdlcjogRmlsZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcmVhZG9ubHkgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHNldHRpbmdzQnVpbGRlcih0aGlzOiB2b2lkKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xufVxuXG5jbGFzcyBEZWxldGVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERlbGV0ZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7dGhpcy5maWxlLnBhdGh9YCk7XG4gICAgaWYgKCFpc05vdGUodGhpcy5maWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyh0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oW2Rpcm5hbWUodGhpcy5maWxlLnBhdGgpXSk7XG5cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZ2V0KHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjb25zdCBsaW5rcyA9IGdldExpbmtzKHsgY2FjaGUgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aCB9KTtcbiAgICAgICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgcmVzY3VlU3RpbGxVc2VkRmlsZTogdGhpcy5yZXNjdWVTdGlsbFVzZWRGaWxlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgIT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEZvbGRlclBhdGhzLmRlbGV0ZSgnJyk7XG4gICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICBmb2xkZXJQYXRoczogWy4uLnBhcmVudEZvbGRlclBhdGhzXVxuICAgIH0pO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICBub3RlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGhcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyUGF0aCB9KTtcblxuICAgIGlmICghYXR0YWNobWVudEZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LkRlbGV0ZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMuZmlsZS5wYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGb2xkZXIsXG4gICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNjdWVTdGlsbFVzZWRGaWxlKHJlc2N1ZVBhcmFtczogUmVzY3VlU3RpbGxVc2VkRmlsZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzY3VlUGFyYW1zLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogS2VlcHMgYSBmb2xkZXIgZGVsZXRpb24gZnJvbSBkZXN0cm95aW5nIGFuIGF0dGFjaG1lbnQgYSBub3RlIG91dHNpZGUgdGhhdCBmb2xkZXIgc3RpbGwgcmVmZXJlbmNlcy5cbiAqXG4gKiBEZWxldGluZyBhIE5PVEUgaXMgYWxyZWFkeSBzYWZlOiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfSBkaXNjb3VudHMgdGhlIGRlbGV0ZWQgbm90ZSdzIG93biBiYWNrbGlua3MsIHNlZXNcbiAqIGFub3RoZXIgbm90ZSBzdGlsbCByZWZlcmVuY2luZyB0aGUgYXR0YWNobWVudCwgYW5kIGtlZXBzIGl0LiBEZWxldGluZyBhIEZPTERFUiB3YXMgbm90LCBiZWNhdXNlXG4gKiB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudH0gb25seSBsaXN0ZW5zIChgdmF1bHQub24oJ2RlbGV0ZScpYCkgYW5kIGJ5IHRoZSB0aW1lIGEgZm9sZGVyIGRlbGV0aW9uXG4gKiBpcyByZXBvcnRlZCBpdHMgY2hpbGRyZW4gYXJlIGFscmVhZHkgZ29uZS4gTm90aGluZyByZWFjdGl2ZSBjYW4gaGVscCwgc28gdGhpcyBjb21wb25lbnQgaW50ZXJjZXB0cyB0aGVcbiAqIGRlbGV0aW9uIHByaW1pdGl2ZXMgaW5zdGVhZDogYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgKHdoYXQgdGhlIGZpbGUtZXhwbG9yZXIgRGVsZXRlIGZsb3cgcmVhY2hlcyB0aHJvdWdoXG4gKiBgcHJvbXB0Rm9yRGVsZXRpb25gKSBwbHVzIHRoZSByYXcgYFZhdWx0LmRlbGV0ZWAgLyBgVmF1bHQudHJhc2hgIGEgcGx1Z2luIG1heSBjYWxsIGRpcmVjdGx5LlxuICpcbiAqIEEgZm9sZGVyIGRlbGV0aW9uIGlzIHNjYW5uZWQgZmlyc3QuIFdoZW4gbm90aGluZyBpbnNpZGUgaXQgaXMgc3RpbGwgcmVmZXJlbmNlZCBmcm9tIG91dHNpZGUgXHUyMDE0IHRoZVxuICogb3ZlcndoZWxtaW5nIG1ham9yaXR5IG9mIGRlbGV0aW9ucyBcdTIwMTQgdGhlIG9yaWdpbmFsIHJ1bnMgdW50b3VjaGVkLCBzbyB0aGUgbmF0aXZlIGJlaGF2aW9yIGlzIHByZXNlcnZlZFxuICogZXhhY3RseS4gT25seSB3aGVuIHNvbWV0aGluZyB3b3VsZCBiZSBsb3N0IGRvZXMgdGhpcyB0YWtlIG92ZXIsIHJlcGxheWluZyB0aGUgZGVsZXRpb24gdGhyb3VnaFxuICoge0BsaW5rIGRlbGV0ZUlmTm90VXNlZH06IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgZm9sZGVyIGdvZXMsIHRoZSBzdGlsbC1yZWZlcmVuY2VkIGF0dGFjaG1lbnRzIGFuZCB0aGVcbiAqIGZvbGRlcnMgaG9sZGluZyB0aGVtIHN0YXksIGFuZCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlIGZpcmVzLCBtaXJyb3JpbmcgdGhlIG5vdGUgY2FzZS5cbiAqXG4gKiBGaWxlcyBhcmUgbmV2ZXIgaW50ZXJjZXB0ZWQgXHUyMDE0IGRlbGV0aW5nIGEgZmlsZSBpcyB0aGUgdXNlciBuYW1pbmcgdGhhdCBmaWxlIGV4cGxpY2l0bHkuXG4gKi9cbmNsYXNzIERlbGV0ZVByb3RlY3Rpb25QYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJvb3RzIG9mIHRoZSBmb2xkZXIgZGVsZXRpb25zIGN1cnJlbnRseSBiZWluZyByZXBsYXllZC4gVGhlIHJlcGxheSBkZWxldGVzIHRocm91Z2ggdGhlIFVOUEFUQ0hFRFxuICAgKiBvcmlnaW5hbCwgc28gaXQgY2Fubm90IHJlLWVudGVyIHRoaXMgY29tcG9uZW50IGRpcmVjdGx5IFx1MjAxNCBidXQgYEZpbGVNYW5hZ2VyLnRyYXNoRmlsZWAgaXRzZWxmIGNhbGxzIGRvd25cbiAgICogaW50byBgVmF1bHQudHJhc2hgIC8gYFZhdWx0LmRlbGV0ZWAsIHdoaWNoIGFyZSBwYXRjaGVkIHRvbywgYW5kIHJlLXNjYW5uaW5nIGEgc3VidHJlZSBhbHJlYWR5IGJlaW5nXG4gICAqIHdhbGtlZCBpcyBwdXJlIHdhc3RlLiBTY29wZWQgYnkgcGF0aCByYXRoZXIgdGhhbiBieSBhIGZsYWcgc28gdGhhdCBhbiB1bnJlbGF0ZWQgZm9sZGVyIGRlbGV0aW9uXG4gICAqIGludGVybGVhdmluZyBvbiBhbiBgYXdhaXRgIGlzIHN0aWxsIHByb3RlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwbGF5ZWRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICd0cmFzaEZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgZm9yY2VdLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgZm9yY2UpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgc3lzdGVtXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUsIHN5c3RlbSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIHBhdGhzIG9mIGV2ZXJ5IG5vdGUgaW5zaWRlIHRoZSBmb2xkZXIuIFRoZXkgYXJlIHRoZSBsaW5rIHNvdXJjZXMgdGhhdCBkaXNhcHBlYXIgYWxvbmcgd2l0aFxuICAgKiB0aGUgZm9sZGVyLCBzbyB0aGVpciBiYWNrbGlua3MgbXVzdCBub3Qga2VlcCBhbiBhdHRhY2htZW50IGFsaXZlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgYWdncmVnYXRlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIFRoZSBwYXRocyBvZiB0aGUgbm90ZXMgaW5zaWRlIHRoZSBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGNvbGxlY3REZWxldGVkTm90ZVBhdGhzKGZvbGRlcjogVEZvbGRlciwgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHMuYWRkKGNoaWxkLnBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZWxldGVkTm90ZVBhdGhzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBhdHRhY2htZW50cyBpbnNpZGUgdGhlIGZvbGRlciB0aGF0IGEgbm90ZSBvdXRzaWRlIGl0IHN0aWxsIHJlZmVyZW5jZXMsIGFuZCB3b3VsZCB0aGVyZWZvcmUgYmVcbiAgICogZGVzdHJveWVkIGJ5IGRlbGV0aW5nIHRoZSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBkZWxldGVkTm90ZVBhdGhzIC0gVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoIHRoZSBmb2xkZXIuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBhdHRhY2htZW50cyB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgZGVsZXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGRlbGV0ZWROb3RlUGF0aHM6IFNldDxzdHJpbmc+LFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZUZpbGVzOiBURmlsZVtdID0gW107XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKGNoaWxkKSAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKGNoaWxkLnBhdGgpID8/IGZhbHNlKSkge1xuICAgICAgICBjYW5kaWRhdGVGaWxlcy5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlRmlsZSBvZiBjYW5kaWRhdGVGaWxlcykge1xuICAgICAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBjYW5kaWRhdGVGaWxlIH0pO1xuICAgICAgZm9yIChjb25zdCBkZWxldGVkTm90ZVBhdGggb2YgZGVsZXRlZE5vdGVQYXRocykge1xuICAgICAgICBiYWNrbGlua3MuY2xlYXIoZGVsZXRlZE5vdGVQYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYWNrbGlua3MuY291bnQoKSAhPT0gMCkge1xuICAgICAgICBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMucHVzaChjYW5kaWRhdGVGaWxlLnBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVsZXRpb24gbmVlZHMgcHJvdGVjdGluZyBhbmQsIGlmIHNvLCByZXBsYWNlcyBpdCB3aXRoIGEgcHJvdGVjdGVkIHJlcGxheS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZWxldGlvbihcbiAgICBmaWxlOiBUQWJzdHJhY3RGaWxlLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkQ29uc2lkZXJGb2xkZXIoZmlsZSkpIHtcbiAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlcGxheUZvbGRlckRlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBkZWxldGVBYnN0cmFjdEZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIGZvbGRlciB3aGlsZSBrZWVwaW5nIHdoYXRldmVyIGluc2lkZSBpdCBpcyBzdGlsbCByZWZlcmVuY2VkIGZyb20gb3V0c2lkZS5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gSW52b2tlcyB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIGRlbGV0ZUFic3RyYWN0RmlsZSAtIERlbGV0ZXMgYSBzaW5nbGUgYWJzdHJhY3QgZmlsZSB0aHJvdWdoIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QncyB1bnBhdGNoZWQgb3JpZ2luYWwuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVsZXRpb24gaXMgZG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVwbGF5Rm9sZGVyRGVsZXRpb24oXG4gICAgZm9sZGVyOiBURm9sZGVyLFxuICAgIGZhbGxiYWNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGRlbGV0ZUFic3RyYWN0RmlsZTogKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSkgPT4gUHJvbWlzZTx2b2lkPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgY29uc3QgZGVsZXRlZE5vdGVQYXRocyA9IHRoaXMuY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyLCBzZXR0aW5ncyk7XG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzID0gYXdhaXQgdGhpcy5maW5kU3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKGZvbGRlciwgZGVsZXRlZE5vdGVQYXRocywgc2V0dGluZ3MpO1xuXG4gICAgaWYgKHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRlbGV0ZVByb3RlY3Rpb24nKShgTm90aGluZyB0byBwcm90ZWN0IGluICR7Zm9sZGVyLnBhdGh9OyBkZWxldGluZyBpdCBhcyB1c3VhbC5gKTtcbiAgICAgIGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKFxuICAgICAgYFByb3RlY3RpbmcgJHtzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMubGVuZ3RoLnRvU3RyaW5nKCl9IHN0aWxsLXJlZmVyZW5jZWQgYXR0YWNobWVudChzKSBmcm9tIHRoZSBkZWxldGlvbiBvZiAke2ZvbGRlci5wYXRofTogJHt0b0pzb24oc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKX1gXG4gICAgKTtcblxuICAgIHRoaXMucmVwbGF5ZWRGb2xkZXJQYXRocy5hZGQoZm9sZGVyLnBhdGgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBkZWxldGVBYnN0cmFjdEZpbGUsXG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHM6IFsuLi5kZWxldGVkTm90ZVBhdGhzXSxcbiAgICAgICAgcGF0aE9yRmlsZTogZm9sZGVyLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIHVzZXIgbmFtZWQgVEhJUyBmb2xkZXIsIHNvIGl0IGdvZXMgZXZlbiB1bmRlciBgRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwYCBcdTIwMTQgdGhhdCBzZXR0aW5nXG4gICAgICAgICAqIGdvdmVybnMgZm9sZGVycyBlbXB0aWVkIGluY2lkZW50YWxseSwgbm90IHRoZSBvbmUgZXhwbGljaXRseSBkZWxldGVkLiBgZGVsZXRlSWZOb3RVc2VkYCBzdGlsbFxuICAgICAgICAgKiByZWZ1c2VzIHRvIHJlbW92ZSBhbnkgZm9sZGVyIHdob3NlIGNoaWxkIGhhZCB0byBiZSBrZXB0LCB3aGljaCBpcyB0aGUgcHJvdGVjdGlvbiB3YW50ZWQgaGVyZS5cbiAgICAgICAgICovXG4gICAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogdHJ1ZSxcbiAgICAgICAgLypcbiAgICAgICAgICogQSBub3RlIHRoYXQgb3RoZXJzIGxpbmsgdG8gaXMgZGVsZXRlZCBhcyBub3JtYWw7IE9ic2lkaWFuIGxlYXZlcyB0aGUgZGFuZ2xpbmcgbGluay4gUHJvdGVjdGluZ1xuICAgICAgICAgKiBub3RlcyB0b28gd291bGQgbWFrZSBkZWxldGluZyBhIGZvbGRlciBvZiBsaW5rZWQtdG8gbm90ZXMgaW1wb3NzaWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHNob3VsZFByb3RlY3RJZlN0aWxsVXNlZDogKGNhbmRpZGF0ZUZpbGUpID0+ICEoc2V0dGluZ3MuaXNOb3RlPy4oY2FuZGlkYXRlRmlsZS5wYXRoKSA/PyBmYWxzZSlcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMuZGVsZXRlKGZvbGRlci5wYXRoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2N1ZVN0aWxsVXNlZEZpbGUocmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICByZXNjdWVQYXJhbXMsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBkZWxldGlvbiBpcyBhIGZvbGRlciBkZWxldGlvbiB0aGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIHByb3RlY3RpbmcuXG4gICAqXG4gICAqIEV2ZXJ5IGNoZWNrIGhlcmUgaXMgc3luY2hyb25vdXMgYW5kIGNoZWFwLCBzbyBhIGZpbGUgZGVsZXRpb24gXHUyMDE0IHRoZSBvdmVyd2hlbG1pbmcgbWFqb3JpdHkgXHUyMDE0IGNvc3RzIG9uZVxuICAgKiB7QGxpbmsgaXNGb2xkZXJ9IGNhbGwgYW5kIHJlYWNoZXMgdGhlIG9yaWdpbmFsIHVudG91Y2hlZC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZGVsZXRpb24gc2hvdWxkIGJlIHNjYW5uZWQgYmVmb3JlIGl0IHJ1bnMuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZENvbnNpZGVyRm9sZGVyKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiBmaWxlIGlzIFRGb2xkZXIge1xuICAgIGlmICghaXNGb2xkZXIoZmlsZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGZpbGUucGF0aCkgPz8gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlcGxheWVkRm9sZGVyUGF0aCBvZiB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMpIHtcbiAgICAgIGlmIChpc0NoaWxkT3JTZWxmKHsgYXBwOiB0aGlzLmFwcCwgY2hpbGRQYXRoT3JGaWxlOiBmaWxlLnBhdGgsIHBhcmVudFBhdGhPckZpbGU6IHJlcGxheWVkRm9sZGVyUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuY2xhc3MgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZU1hbmFnZXIgPSBwYXJhbXMuZmlsZU1hbmFnZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtsaW5rVXBkYXRlc0hhbmRsZXJdLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RCb3VuZFxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoaGFzUGF0Y2hUb2tlbihvcmlnaW5hbE1ldGhvZCwgUEFUQ0hfVE9LRU4pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIgPSAobGlua1VwZGF0ZXMpID0+IHRoaXMud3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlcywgbGlua1VwZGF0ZXNIYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgLypcbiAgICAgICAqIFN1cHByZXNzaW5nIE9ic2lkaWFuJ3Mgb3duIGxpbmsgdXBkYXRlcyBpcyBOT1QgaWRlbXBvdGVudCwgc28gdHdvIGxpdmUgY29waWVzIG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgKiB3b3VsZCBmaWdodCBvdmVyIHRoZSBzYW1lIG1ldGhvZC4gYFBBVENIX1RPS0VOYCBpcyBhIGBTeW1ib2wuZm9yYCBhbmQgdGhlIHRva2VuIHJlZ2lzdHJ5IGlzXG4gICAgICAgKiBgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlYC1iYWNrZWQsIHNvIHRoZSBhcmJpdHJhdGlvbiBzcGFucyBpbmRlcGVuZGVudGx5IGJ1bmRsZWQgY29waWVzIG9mIHRoaXNcbiAgICAgICAqIGxpYnJhcnk6IHRoZSBmaXJzdCBwYXRjaGVyIHN0YXlzIGxpdmUsIGEgY29weSB0aGF0IHBhdGNoZXMgYWZ0ZXJ3YXJkcyBzZWVzIHRoZSB0b2tlbiBvbiBpdHMgb3duXG4gICAgICAgKiBgb3JpZ2luYWxNZXRob2RgIGFuZCBkZWZlcnMgdmlhIHRoZSBndWFyZCBhYm92ZSwgYW5kIGl0IHRha2VzIG92ZXIgb24gaXRzIG5leHQgY2FsbCBvbmNlIHRoZVxuICAgICAgICogbGVhZGVyIHVubG9hZHMgYW5kIHRoZSB0b2tlbiBpcyBkcm9wcGVkLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgYXJiaXRyYXRlcyB0aGUgUEFUQ0ggb25seS4gVGhlIGNvbXBvbmVudCdzIGB2YXVsdC5vbigncmVuYW1lJyB8ICdkZWxldGUnKWAgYW5kXG4gICAgICAgKiBgbWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcpYCBsaXN0ZW5lcnMgaGF2ZSBubyBlcXVpdmFsZW50IGd1YXJkIFx1MjAxNCB0aGUgcGx1Z2luLXJlZ2lzdHJ5IGVsZWN0aW9uXG4gICAgICAgKiB0aGF0IHVzZWQgdG8gcHJvdmlkZSBvbmUgd2VudCB3aXRoIHRoZSBtdWx0aS1wbHVnaW4gbWFjaGluZXJ5IFx1MjAxNCBzbyB0d28gbGl2ZSBjb3BpZXMgd291bGQgYm90aFxuICAgICAgICogaGFuZGxlIGFuIGV2ZW50LiBXaXRoIG9uZSBvd25lciB0aGF0IGNhbm5vdCBhcmlzZTsgYSBjb25zdW1lciB0aGF0IG11c3QgZ3VhcmFudGVlIGl0IHJlZnVzZXMgdG9cbiAgICAgICAqIGxvYWQgYmVzaWRlIGEgY29uZmxpY3RpbmcgdmVyc2lvbiwgd2hpY2ggaXMgYSBwbHVnaW4ncyBqb2IgcmF0aGVyIHRoYW4gYSBsaWJyYXJ5J3MuXG4gICAgICAgKi9cbiAgICAgIHBhdGNoVG9rZW46IFBBVENIX1RPS0VOXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXM6IExpbmtVcGRhdGVbXSwgbGlua1VwZGF0ZXNIYW5kbGVyOiBMaW5rVXBkYXRlc0hhbmRsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaXNSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBsZXQgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpID0+IHtcbiAgICAgIGlzUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIC8qXG4gICAgICAgKiBBIHJlbmFtZSBwZXJmb3JtZWQgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGVcbiAgICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIEFkdmFuY2VkIE5vdGUgQ29tcG9zZXIncyBmb2xkZXIgbWVyZ2UpIGlzIG93bmVkIGJ5IHRoYXRcbiAgICAgICAqIHRyYW5zYWN0aW9uLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgaXRzIG93biBsaW5rIGNvbnNpc3RlbmN5LiBUaGlzIGhhbmRsZXIgZGVsaWJlcmF0ZWx5IGRvZXNcbiAgICAgICAqIE5PVCByZXdyaXRlIGxpbmtzIGZvciBpdCwgc28gc3VwcHJlc3NpbmcgT2JzaWRpYW4ncyBuYXRpdmUgbGluayB1cGRhdGUgYmVsb3cgd291bGQgbGVhdmUgdGhlXG4gICAgICAgKiBsaW5rcyBkYW5nbGluZy4gTGV0IHRoZSBuYXRpdmUgdXBkYXRlIHByb2NlZWQgdW50b3VjaGVkLiBTZWVcbiAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1hZHZhbmNlZC1ub3RlLWNvbXBvc2VyL2lzc3Vlcy8xNDYuXG4gICAgICAgKi9cbiAgICAgIGlmIChpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIGZpbGUucGF0aCkgfHwgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBvbGRQYXRoKSkge1xuICAgICAgICBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBsaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmFwcC52YXVsdC5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgbWlnaHQgY2hhbmdlZCBpbiBgcmVuYW1lYCBldmVudCBoYW5kbGVyLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gICAgaWYgKCFpc1JlbmFtZUNhbGxlZCB8fCAhc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyB8fCBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKFxuICAgICAgbGlua1VwZGF0ZXMsXG4gICAgICAobGlua1VwZGF0ZSkgPT4ge1xuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHNvdXJjZSBmaWxlICR7bGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6cnVuQXN5bmNMaW5rVXBkYXRlJykoXG4gICAgICAgICAgICBgUm9sbCBiYWNrIHRvIGRlZmF1bHQgbGluayB1cGRhdGUgb2YgcmVzb2x2ZWQgZmlsZSAke2xpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFwcC5wbHVnaW5zLmdldFBsdWdpbignYmFja2xpbmstY2FjaGUnKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5rVXBkYXRlLnNvdXJjZUZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgSGFuZGxlZFJlbmFtZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBIYW5kbGVkUmVuYW1lS2V5PigpO1xuXG4gIHB1YmxpYyBhZGQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSwgeyBuZXdQYXRoLCBvbGRQYXRoIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLmRlbGV0ZSh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXMob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGtleXMoKTogSXRlcmFibGVJdGVyYXRvcjxIYW5kbGVkUmVuYW1lS2V5PiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLnZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXlUb1N0cmluZyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xuICB9XG59XG5cbmNsYXNzIE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLnByZXZpb3VzQ2FjaGUgPSBwYXJhbXMucHJldmlvdXNDYWNoZTtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZU1ldGFkYXRhRGVsZXRlZCcpKGBTa2lwcGluZyBtZXRhZGF0YSBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc01hcmtkb3duRmlsZSh0aGlzLmZpbGUpICYmIHRoaXMucHJldmlvdXNDYWNoZSkge1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQodGhpcy5maWxlLnBhdGgsIHRoaXMucHJldmlvdXNDYWNoZSk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJlbmFtZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lczogSGFuZGxlZFJlbmFtZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzID0gcGFyYW1zLmhhbmRsZWRSZW5hbWVzO1xuICAgIHRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwID8/IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gcGFyYW1zLmludGVycnVwdGVkUmVuYW1lc01hcDtcbiAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyID0gcGFyYW1zLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwID0gcGFyYW1zLm9sZFBhdGhCYWNrbGlua3NNYXA7XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub2xkUGF0aCA9PT0gdGhpcy5uZXdQYXRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIC8qXG4gICAgICogVGhlIHJlbmFtZSB0aGF0IHRyaWdnZXJlZCB0aGlzIGhhbmRsZXIgaXMgdmVyeSBsaWtlbHkgc3RpbGwgaW5zaWRlIE9ic2lkaWFuJ3Mgb3duXG4gICAgICogYEZpbGVNYW5hZ2VyLnJ1bkFzeW5jTGlua1VwZGF0ZWAgY3ljbGUsIHdoaWNoIGlzIGFib3V0IHRvIGRlY2lkZSBcdTIwMTQgc3luY2hyb25vdXNseSBcdTIwMTQgd2hpY2ggbGlua3MgdG9cbiAgICAgKiByZXdyaXRlLCBieSByZS1yZXNvbHZpbmcgZWFjaCBvbmUuIEV2ZXJ5dGhpbmcgYmVsb3cgdGVtcG9yYXJpbHkgcmVnaXN0ZXJzIGEgcGhhbnRvbSBmaWxlIGF0IHRoZVxuICAgICAqIG9sZCBwYXRoIChgcmVnaXN0ZXJGaWxlc2AsIGRpcmVjdGx5IGhlcmUgYW5kIGluc2lkZSBgUmVuYW1lTWFwYCkgYW5kIGhvbGRzIGl0IGFjcm9zcyBhbiBgYXdhaXRgO1xuICAgICAqIHNlZW4gbWlkLWRlY2lzaW9uLCB0aGF0IHBoYW50b20gbWFrZXMgdGhlIG9sZCBwYXRoIHN0aWxsIHJlc29sdmUsIHNvIE9ic2lkaWFuIGNvbmNsdWRlcyBub3RoaW5nXG4gICAgICogY2hhbmdlZCBhbmQgcmV3cml0ZXMgbm90aGluZy4gU3RhbmRpbmcgaW52YXJpYW50OiBuZXZlciB0b3VjaCB0aGUgdmF1bHQgaW5kZXggd2hpbGUgT2JzaWRpYW4gaXNcbiAgICAgKiBtaWQtZGVjaXNpb24uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzQ3LlxuICAgICAqL1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nTGlua1VwZGF0ZXModGhpcy5hcHApO1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGF3YWl0IHRoaXMuY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAvLyBUaGUgcmVmcmVzaGVkIGJhY2tsaW5rcyBmZWVkIGBvbGRQYXRoQmFja2xpbmtzTWFwYCwgd2hpY2ggb25seSB0aGUgbGluay1yZXdyaXRlIHN0ZXBzIGJlbG93IHJlYWQsIGFuZCB0aG9zZSBhcmUgZ2F0ZWQgb24gdGhlIHNhbWUgZmxhZy5cbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKS5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hMaW5rcygpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUNhc2VDb2xsaXNpb24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGNvbnN0IHBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gICAgY29uc3QgcmVuYW1lZEZpbGVQYXRocyA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVuYW1lZEZpbGVQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcbiAgICBjb25zdCByZW5hbWVkTGlua3MgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZWRMaW5rUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVuYW1lTWFwID0gbmV3IFJlbmFtZU1hcCh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBuZXdQYXRoOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcmVuYW1lTWFwLmZpbGwoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4gICAgICAvLyBCYWNrbGlua3MgYXJlIG9ubHkgY29uc3VtZWQgYnkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdywgd2hpY2ggYXJlIGdhdGVkIG9uXG4gICAgICAvLyBgc2hvdWxkSGFuZGxlUmVuYW1lc2AuIFNraXAgZ2F0aGVyaW5nIHRoZW0gKGEgYmFja2xpbmsgZmV0Y2ggcGVyIGF0dGFjaG1lbnQpIG9uIGEgbW92ZS1vbmx5IHJlbmFtZS5cbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0T3JpZ2luYWxMaW5rc01hcChjb21iaW5lZEJhY2tsaW5rc01hcCk7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhdHRhY2htZW50T2xkUGF0aCBvZiByZW5hbWVNYXAua2V5cygpKSB7XG4gICAgICAgICAgaWYgKGF0dGFjaG1lbnRPbGRQYXRoID09PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudE9sZFBhdGggfSk7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXAgPSBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rcy5kYXRhO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICAgIHBhdGg6IGF0dGFjaG1lbnRPbGRQYXRoLFxuICAgICAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgW29sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aF0gb2YgcmVuYW1lTWFwLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAob2xkQXR0YWNobWVudFBhdGggIT09IHRoaXMub2xkUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGZpeGVkTmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQob2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50UGF0aCwgZml4ZWROZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChvbGRBdHRhY2htZW50UGF0aCkpIHtcbiAgICAgICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoZGlybmFtZShvbGRBdHRhY2htZW50UGF0aCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGNsZWFudXBFbXB0eUZvbGRlcnMoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCxcbiAgICAgICAgZm9sZGVyUGF0aHM6IFsuLi5wYXJlbnRGb2xkZXJQYXRoc11cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAvKlxuICAgICAgICogVGhlIGF0dGFjaG1lbnQgbW92ZSBhYm92ZSBydW5zIHJlZ2FyZGxlc3Mgb2YgYHNob3VsZEhhbmRsZVJlbmFtZXNgICh0aGF0IGlzIHRoZSBwb2ludCBvZiBkZWNvdXBsaW5nXG4gICAgICAgKiBcIk1vdmUgYXR0YWNobWVudHMgd2l0aCBub3RlXCIgZnJvbSBcIlVwZGF0ZSBsaW5rc1wiKS4gVGhlIHJlbWFpbmluZyBzdGVwcyBvbmx5IHJld3JpdGUgbGlua3MsIHNvIHNraXBcbiAgICAgICAqIHRoZW0gd2hlbiBsaW5rIHVwZGF0ZXMgYXJlIGRpc2FibGVkOyB0aGUgYGZpbmFsbHlgIGJsb2NrIGJlbG93IHN0aWxsIHJ1bnMuXG4gICAgICAgKi9cbiAgICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhY2tsaW5rRW50cmllcyA9IFsuLi5jb21iaW5lZEJhY2tsaW5rc01hcCwgLi4udGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwXTtcbiAgICAgIGxldCBwcm9jZXNzZWRCYWNrbGlua0ZpbGVzID0gMDtcbiAgICAgIGZvciAoY29uc3QgW25ld0JhY2tsaW5rUGF0aCwgbGlua0tleVRvUGF0aE1hcF0gb2YgYmFja2xpbmtFbnRyaWVzKSB7XG4gICAgICAgIGxldCBsaW5rSW5kZXggPSAwO1xuICAgICAgICBhd2FpdCBlZGl0TGlua3Moe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgICAgICAgIGxpbmtJbmRleCsrO1xuICAgICAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudFBhdGggPSBsaW5rS2V5VG9QYXRoTWFwLmdldChnZXRMaW5rSWRlbnRpdHlLZXkobGluaykpO1xuICAgICAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgKiBBIGxpbmsgdGhhdCBpcyBub3QgaW4gdGhlIHNuYXBzaG90IHdhcyBlaXRoZXIgbmV2ZXIgb3VycyB0byByZXdyaXRlLCBvciB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgICAgKiByZXdyaXR0ZW4gYnkgc29tZW9uZSBlbHNlIChsZWF2aW5nIGl0IGNvcnJlY3QpLiBFaXRoZXIgd2F5IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gLVxuICAgICAgICAgICAgICAgKiBidXQgbG9nIGl0LCBiZWNhdXNlIGEgc2lsZW50IHNraXAgaGVyZSBpcyBleGFjdGx5IGhvd1xuICAgICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzYwIHN0YXllZFxuICAgICAgICAgICAgICAgKiBpbnZpc2libGU6IGV2ZXJ5IHNraXBwZWQgbGluayBsZWZ0IGEgYnJva2VuIGVtYmVkIGFuZCByZXBvcnRlZCBub3RoaW5nLlxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6dXBkYXRlQmFja2xpbmtzJykoXG4gICAgICAgICAgICAgICAgYE5vIHNuYXBzaG90IGVudHJ5IGZvciBsaW5rICR7dG9Kc29uKGxpbmspfSBpbiAke25ld0JhY2tsaW5rUGF0aH07IGxlYXZpbmcgaXQgdW5jaGFuZ2VkLmBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IHJlbmFtZU1hcC5nZXQob2xkQXR0YWNobWVudFBhdGgpID8/IG9sZEF0dGFjaG1lbnRQYXRoO1xuXG4gICAgICAgICAgICByZW5hbWVkRmlsZVBhdGhzLmFkZChuZXdCYWNrbGlua1BhdGgpO1xuICAgICAgICAgICAgcmVuYW1lZExpbmtzLmFkZChgJHtuZXdCYWNrbGlua1BhdGh9Ly8ke1N0cmluZyhsaW5rSW5kZXgpfWApO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua1BhcmFtcz4oe1xuICAgICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgICBvbGRUYXJnZXRQYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50UGF0aCxcbiAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXRoT3JGaWxlOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIHByb2Nlc3NlZEJhY2tsaW5rRmlsZXMrKztcbiAgICAgICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj8uKHtcbiAgICAgICAgICBjdXJyZW50UGF0aDogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgIHByb2Nlc3NlZDogcHJvY2Vzc2VkQmFja2xpbmtGaWxlcyxcbiAgICAgICAgICB0b3RhbDogYmFja2xpbmtFbnRyaWVzLmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTm90ZSh0aGlzLm5ld1BhdGgpKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZUxpbmtzSW5GaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rc0luRmlsZVBhcmFtcz4oe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGggfSkpIHtcbiAgICAgICAgbGV0IGludGVycnVwdGVkUmVuYW1lcyA9IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldCh0aGlzLm5ld1BhdGgpO1xuICAgICAgICBpZiAoIWludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lcyA9IFtdO1xuICAgICAgICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLnNldCh0aGlzLm5ld1BhdGgsIGludGVycnVwdGVkUmVuYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzLnB1c2goe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3Qgb3JwaGFuS2V5cyA9IFsuLi50aGlzLmhhbmRsZWRSZW5hbWVzLmtleXMoKV07XG4gICAgICBhZGRUb1F1ZXVlKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBvcnBoYW5LZXkgb2Ygb3JwaGFuS2V5cykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob3JwaGFuS2V5Lm9sZFBhdGgsIG9ycGhhbktleS5uZXdQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVuYW1lZExpbmtzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlT3JwaGFuZWRSZW5hbWVzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5vbGRQYXRoKTtcbiAgICBpZiAoaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGg6IGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2FzZUNvbGxpc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWdldERhdGFBZGFwdGVyRXgodGhpcy5hcHApLmluc2Vuc2l0aXZlIHx8IHRoaXMub2xkUGF0aC50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLm5ld1BhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBqb2luKGRpcm5hbWUodGhpcy5uZXdQYXRoKSwgYF9fdGVtcF9fJHtiYXNlbmFtZSh0aGlzLm5ld1BhdGgpfWApO1xuICAgIGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZCh0aGlzLm5ld1BhdGgsIHRlbXBvcmFyeVBhdGgpO1xuXG4gICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICBuZXdQYXRoOiB0ZW1wb3JhcnlQYXRoLFxuICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcblxuICAgIGF3YWl0IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUoZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRlbXBvcmFyeVBhdGggfSksIHRoaXMubmV3UGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hMaW5rcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmYWtlT2xkRmlsZSA9IGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgICBsZXQgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICAgIHtcbiAgICAgIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKHRoaXMuYXBwLCBbZmFrZU9sZEZpbGVdKTtcbiAgICAgIGNvbnN0IGZha2VPbGRGaWxlQmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBmYWtlT2xkRmlsZSB9KTtcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQgPSBmYWtlT2xkRmlsZUJhY2tsaW5rcy5kYXRhO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2JhY2tsaW5rUGF0aCwgcmVmcmVzaGVkTGlua3NdIG9mIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQpIHtcbiAgICAgIGxldCBvbGRMaW5rcyA9IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5nZXQoYmFja2xpbmtQYXRoKTtcbiAgICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgICAgb2xkTGlua3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIHJlZnJlc2hlZExpbmtzKSB7XG4gICAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW5hbWVIYW5kbGVkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBuZXdQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmFkZChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVNYXAge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5uZXdQYXRoID0gcGFyYW1zLm5ld1BhdGg7XG4gICAgdGhpcy5vbGRQYXRoTGlua3MgPSB0aGlzLm9sZENhY2hlID8gZ2V0TGlua3MoeyBjYWNoZTogdGhpcy5vbGRDYWNoZSB9KSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBzdHJpbmddPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmVudHJpZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5vbGRQYXRoLCB0aGlzLm5ld1BhdGgpO1xuXG4gICAgaWYgKCFpc05vdGUodGhpcy5vbGRQYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ic2lkaWFuIGRvZXMgbm90IGluZGV4IGEgY2FudmFzIGZpbGUgaW50byB0aGUgbWV0YWRhdGEgY2FjaGUuXG4gICAgLy8gVGhlIGNhY2hlLWRlcml2ZWQgYG9sZFBhdGhMaW5rc2AgaXMgZW1wdHkgZm9yIGEgY2FudmFzLCBoaWRpbmcgaXRzIGVtYmVkZGVkIGF0dGFjaG1lbnRzLlxuICAgIC8vIFJlYWRpbmcgdGhlIGNhbnZhcyByZWZlcmVuY2VzIGRpcmVjdGx5IG1vdmVzIHRoZW0gd2l0aCB0aGUgY2FudmFzIChtaXJyb3Jpbmcgbm90ZSBiZWhhdmlvcikuXG4gICAgLy8gVGhlIGZpbGUgYWxyZWFkeSBsaXZlcyBhdCB0aGUgbmV3IHBhdGggYWZ0ZXIgdGhlIHJlbmFtZSwgc28gcmVhZCB0aGUgcmVmZXJlbmNlcyBmcm9tIHRoZXJlLlxuICAgIGlmIChpc0NhbnZhc0ZpbGUodGhpcy5vbGRQYXRoKSkge1xuICAgICAgY29uc3QgY2FudmFzUmVmZXJlbmNlcyA9IGF3YWl0IGdldENhbnZhc1JlZmVyZW5jZXModGhpcy5hcHAsIHRoaXMubmV3UGF0aCk7XG4gICAgICB0aGlzLm9sZFBhdGhMaW5rcy5wdXNoKC4uLmNhbnZhc1JlZmVyZW5jZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGNvbnN0IG9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCB0aGlzLmdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGUpO1xuXG4gICAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGhcbiAgICAgIH0pXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gICAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKCFvbGRBdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgICBpZiAoXG4gICAgICBhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAob2xkQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgfHwgb2xkQXR0YWNobWVudEZpbGUucGF0aC5zdGFydHNXaXRoKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpKTtcbiAgICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm9sZFBhdGgpO1xuICAgICAgICAgIGtleXMuZGVsZXRlKHRoaXMubmV3UGF0aCk7XG4gICAgICAgICAgaWYgKGtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdBdHRhY2htZW50RmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgIG9sZE5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPyBvbGRBdHRhY2htZW50RmlsZS5wYXRoIDogcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBqb2luKG5ld0ZvbGRlciwgb2xkQXR0YWNobWVudEZpbGUubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50RmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50RmlsZVBhdGggfSk7XG4gICAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmZpbGxSZW5hbWVNYXAnKShgUmVtb3ZpbmcgY29uZmxpY3RpbmcgYXR0YWNobWVudCAke25ld0F0dGFjaG1lbnRGaWxlLnBhdGh9LmApO1xuICAgICAgICAgIGF3YWl0IHRyYXNoU2FmZSh0aGlzLmFwcCwgbmV3QXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gZGlybmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gYmFzZW5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoLCBleHRlbnNpb24pO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSB0aGlzLmFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKGpvaW4oZGlyZWN0b3J5LCBiYXNlTmFtZSksIGV4dGVuc2lvbi5zbGljZSgxKSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcC5zZXQob2xkQXR0YWNobWVudEZpbGUucGF0aCwgbmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0KG9sZFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChvbGRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0QmFja2xpbmtzTWFwKHBhcmFtczogUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgcGF0aCxcbiAgICAgIHNpbmdsZUJhY2tsaW5rc01hcFxuICAgIH0gPSBwYXJhbXM7XG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCBsaW5rc10gb2Ygc2luZ2xlQmFja2xpbmtzTWFwKSB7XG4gICAgICBjb25zdCBuZXdCYWNrbGlua1BhdGggPSB0aGlzLm1hcC5nZXQoYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgICBjb25zdCBsaW5rS2V5VG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtLZXlUb1BhdGhNYXApO1xuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgIGxpbmtLZXlUb1BhdGhNYXAuc2V0KGdldExpbmtJZGVudGl0eUtleShsaW5rKSwgcGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHsgYXBwOiB0aGlzLmFwcCwgbGluazogb2xkUGF0aExpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCB9KTtcbiAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVmZXJlbmNlW10+KFtbdGhpcy5uZXdQYXRoLCBbb2xkUGF0aExpbmtdXV0pO1xuICAgICAgdGhpcy5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsXG4gICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYmFja2xpbmtzTWFwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlOiBURmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtvbGRGaWxlXSk7XG4gICAgdXNpbmcgX2NhY2hlUmVnaXN0cmF0aW9uID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWRcbiAgICAgID8gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBjYWNoZTogdGhpcy5vbGRDYWNoZSwgcGF0aE9yRmlsZTogb2xkRmlsZSB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzZXR0aW5ncyB0aGUgaGFuZGxlciBydW5zIHdpdGguXG4gKlxuICogVGhlcmUgaXMgZXhhY3RseSBvbmUgY29udHJpYnV0b3I6IHRoZSBjb21wb25lbnQncyBvd24gYHNldHRpbmdzQnVpbGRlcmAuIEVhcmxpZXIgdmVyc2lvbnMgYWdncmVnYXRlZCBhXG4gKiByZWdpc3RyeSBvZiBjb250cmlidXRvcnMgYW5kIE9SLW1lcmdlZCB0aGVpciBhbnN3ZXJzLCBiZWNhdXNlIHNldmVyYWwgcGx1Z2lucyBjb3VsZCBlYWNoIHJlZ2lzdGVyIGFcbiAqIGhhbmRsZXIgYWdhaW5zdCB0aGUgb25lIHNoYXJlZCB2YXVsdC4gVGhleSBubyBsb25nZXIgZG8sIHNvIHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgcXVlc3Rpb24gb2Ygd2hvc2VcbiAqIHNldHRpbmcgd2lucy5cbiAqXG4gKiBXaGF0IHJlbWFpbnMgaXMgZGVmYXVsdGluZzogdGhlIGJ1aWxkZXIgcmV0dXJucyBhIGBQYXJ0aWFsYCwgc28gdGhlIHR3byBwcmVkaWNhdGVzIGFuZCB0aGUgZW1wdHktZm9sZGVyXG4gKiBiZWhhdmlvciBuZWVkIGEgdmFsdWUgd2hlbiBpdCBkb2VzIG5vdCBzdXBwbHkgb25lLlxuICovXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPikge1xuICAgIHRoaXMuc2V0dGluZ3NCdWlsZGVyID0gc2V0dGluZ3NCdWlsZGVyO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3QgYnVpbHRTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJ1aWx0U2V0dGluZ3MsXG4gICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBidWlsdFNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgaXNOb3RlOiAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBidWlsdFNldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IGlzTm90ZShwYXRoKSxcbiAgICAgIGlzUGF0aElnbm9yZWQ6IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGJ1aWx0U2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHBhdGgpID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCBoYW5kbGVzIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqIEl0IGxpc3RlbnMgdG8gcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGFuZCB1cGRhdGVzIGxpbmtzIGFjY29yZGluZ2x5LlxuICogSXQgYWxzbyBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBjYXNlLW9ubHkgcmVuYW1lcyBhbmQgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgY29tcG9uZW50IHdob3NlIHNpZ25hbCBjYW5jZWxzIGluLWZsaWdodCByZW5hbWUgb3BlcmF0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgd2hvc2UgbGlua3MgYXJlIHVwZGF0ZWQgZHVyaW5nIGEgcmVuYW1lL21vdmUsXG4gICAqIHdpdGggdGhlIHJ1bm5pbmcgY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gYG51bGxgLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgdXBkYXRlZCBsaW5rcyB0byB0aGUgdXNlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBsb2NrIGNvbXBvbmVudCB1c2VkIHRvIGd1YXJkIGxpbmsgdXBkYXRlcywgb3IgYG51bGxgIGlmIG5vbmUgaXMgdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGlzIHBsdWdpbidzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG1hbmFnZXIgdGhhdCBhZ2dyZWdhdGVzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncyBhY3Jvc3MgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lcyA9IG5ldyBIYW5kbGVkUmVuYW1lcygpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudCA9IHBhcmFtcy5hYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA/PyBudWxsO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBwYXJhbXMuc2V0dGluZ3NCdWlsZGVyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gbmV3IFNldHRpbmdzTWFuYWdlcih0aGlzLnNldHRpbmdzQnVpbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIHRoaXMuaGFuZGxlUmVuYW1lLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiB0aGlzLmFwcC5maWxlTWFuYWdlcixcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURlbGV0ZShmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgRGVsZXRlSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZURlbGV0ZSwgeyBmaWxlUGF0aDogZmlsZS5wYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwpOiB2b2lkIHtcbiAgICBuZXcgTWV0YWRhdGFEZWxldGVkSGFuZGxlcih7XG4gICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgIGZpbGUsXG4gICAgICBwcmV2aW91c0NhY2hlLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW5hbWUoZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFpc0ZpbGUoZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQYXRoID0gZmlsZS5wYXRoO1xuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YCk7XG4gICAgaWYgKHRoaXMuaGFuZGxlZFJlbmFtZXMuaGFzKG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgcmVuYW1lIG9jY3VycmluZyBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIEFkdmFuY2VkIE5vdGUgQ29tcG9zZXIncyBmb2xkZXIgbWVyZ2UpIGlzIG9yY2hlc3RyYXRlZCBieSB0aGF0XG4gICAgICogdHJhbnNhY3Rpb24ncyBvd25lciwgd2hpY2ggdGFrZXMgcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gUmVhY3RpbmcgdG8gaXRcbiAgICAgKiBoZXJlIHdvdWxkIChhKSBwZXJ0dXJiIE9ic2lkaWFuJ3MgbmF0aXZlIHBvc3QtcmVuYW1lIGxpbmsgdXBkYXRlIGFuZCBsZWF2ZSBsaW5rcyBkYW5nbGluZywgYW5kXG4gICAgICogKGIpIGNvbGxpZGUgd2l0aCB0aGUgZm9yZWlnbiB0cmFuc2FjdGlvbiBcdTIwMTQgYW4gYXN5bmMgYWJvcnQgZnJvbSB0aGlzIGhhbmRsZXIgYWJvcnRzIGFuXG4gICAgICogYWxyZWFkeS1jb21taXR0ZWQgdHJhbnNhY3Rpb24sIHRocm93aW5nIFwiQ2Fubm90IHJvbGwgYmFjayBhIGNvbW1pdHRlZCB0cmFuc2FjdGlvblwiLiBUaGlzXG4gICAgICogaGFuZGxlcidzIG93biBhdHRhY2htZW50IG1vdmVzIGFyZSBhbHJlYWR5IGV4Y2x1ZGVkIGFib3ZlIHZpYSBgaGFuZGxlZFJlbmFtZXNgLCBzbyBhIGxvY2sgc3RpbGxcbiAgICAgKiBoZWxkIGhlcmUgYWx3YXlzIGJlbG9uZ3MgdG8gYSBmb3JlaWduIG9wZXJhdGlvbjsgc3RheSBvdXQgb2YgaXRzIHdheS4gU2VlXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWFkdmFuY2VkLW5vdGUtY29tcG9zZXIvaXNzdWVzLzE0Ni5cbiAgICAgKi9cbiAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBvbGRQYXRoKSB8fCBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBvY2N1cnMgaW5zaWRlIGEgZm9yZWlnbiBsb2NrZWQgdHJhbnNhY3Rpb24uYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05vT3BSZW5hbWUoc2V0dGluZ3MsIG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBpcyBub3QgYSBub3RlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdpdGggbGluayB1cGRhdGVzIGRpc2FibGVkLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKHRoaXMuYXBwLCBvbGRQYXRoKS5kYXRhO1xuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQuYWJvcnRTaWduYWwsXG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlUmVuYW1lLCB7IG5ld1BhdGgsIG9sZFBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXRoIGxpbmsgcmV3cml0aW5nIG9mZiwgdGhlIGhhbmRsZXIncyBvbmx5IHJlbWFpbmluZyBqb2JzIGFyZSBtb3ZpbmcgYSBOT1RFJ3MgYXR0YWNobWVudHMgYW5kIHBydW5pbmdcbiAgICogdGhlIGZvbGRlciBhIG1vdmVkIGZpbGUgdmFjYXRlZC4gQSBub24tbm90ZSByZW5hbWUgbmVlZHMgbmVpdGhlciB3aGVuIGVtcHR5IGZvbGRlcnMgYXJlIGtlcHQsIHNvIHRoZXJlXG4gICAqIGlzIG5vdGhpbmcgdG8gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgZmlsZSB3YXMgcmVuYW1lZCBmcm9tLlxuICAgKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBwYXRoIHRoZSBmaWxlIHdhcyByZW5hbWVkIHRvLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgaGFuZGxlciB3b3VsZCBkbyBubyB3b3JrIGZvciB0aGlzIHJlbmFtZS5cbiAgICovXG4gIHByaXZhdGUgaXNOb09wUmVuYW1lKHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4sIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzXG4gICAgICAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKG9sZFBhdGgpID8/IGZhbHNlKVxuICAgICAgJiYgIShzZXR0aW5ncy5pc05vdGU/LihuZXdQYXRoKSA/PyBmYWxzZSlcbiAgICAgICYmIChzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCkgPT09IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcDtcbiAgfVxufVxuXG4vKipcbiAqIE1vdmVzIGFuIGF0dGFjaG1lbnQgYSBkZWxldGlvbiB3b3VsZCBvdGhlcndpc2Ugc3RyYW5kIHRvIHdoZXJldmVyIHRoZSBjb25zdW1pbmcgcGx1Z2luIHNheXMgaXQgYmVsb25ncy5cbiAqXG4gKiBTaGFyZWQgYnkgYm90aCBkZWxldGUgcGF0aHMgXHUyMDE0IHRoZSBub3RlIGRlbGV0ZSBpbiB7QGxpbmsgRGVsZXRlSGFuZGxlcn0gYW5kIHRoZSBmb2xkZXIgZGVsZXRlIHJlcGxheWVkIGJ5XG4gKiB7QGxpbmsgRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50fSBcdTIwMTQgYmVjYXVzZSBib3RoIHJlYWNoIHRoZSBzYW1lIHBvaW50OiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfSBoYXNcbiAqIGRlY2lkZWQgdGhlIGF0dGFjaG1lbnQgbXVzdCBzdXJ2aXZlLCBhbmQgd2l0aG91dCB0aGlzIGl0IHdvdWxkIHN1cnZpdmUgaW4gYSBmb2xkZXIgbm90aGluZyBvd25zIGFueSBtb3JlLlxuICpcbiAqIEEgY29uc3VtZXIgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQge0BsaW5rIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncy5nZXRSZXNjdWVQYXRofSwgb3IgdGhhdCBhbnN3ZXJzXG4gKiBgbnVsbGAsIGdldHMgZXhhY3RseSB0aGUgYmVoYXZpb3IgaXQgaGFkIGJlZm9yZSB0aGlzIGV4aXN0ZWQ6IHRoZSBhdHRhY2htZW50IHN0YXlzIHB1dC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gd2hldGhlciB0aGUgYXR0YWNobWVudCB3YXMgbW92ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQocGFyYW1zOiBEaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50UGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHNldHRpbmdzID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICBpZiAoIXNldHRpbmdzLmdldFJlc2N1ZVBhdGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBhdHRhY2htZW50UGF0aCA9IHBhcmFtcy5yZXNjdWVQYXJhbXMuZmlsZS5wYXRoO1xuICBjb25zdCByZXNjdWVQYXRoID0gYXdhaXQgc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCh7XG4gICAgYXR0YWNobWVudFBhdGgsXG4gICAgc3Vydml2aW5nTm90ZVBhdGhzOiBwYXJhbXMucmVzY3VlUGFyYW1zLnN1cnZpdmluZ05vdGVQYXRoc1xuICB9KTtcblxuICBpZiAocmVzY3VlUGF0aCA9PT0gbnVsbCkge1xuICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgTm8gcmVzY3VlIHBhdGggZm9yICR7YXR0YWNobWVudFBhdGh9OyBrZWVwaW5nIGl0IHdoZXJlIGl0IGlzLmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLypcbiAgICAgKiBgcmVuYW1lU2FmZWAgY3JlYXRlcyB0aGUgZGVzdGluYXRpb24gZm9sZGVyLCByZXNvbHZlcyBhIGNvbGxpc2lvbiB2aWEgYGdldFNhZmVSZW5hbWVQYXRoYCwgYW5kIG1vdmVzXG4gICAgICogdGhyb3VnaCBgYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGVgLCBzbyB0aGUgc3Vydml2aW5nIG5vdGVzJyBsaW5rcyBmb2xsb3cgdGhlIGF0dGFjaG1lbnQuXG4gICAgICovXG4gICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCByZW5hbWVTYWZlKHtcbiAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgIG5ld1BhdGg6IHJlc2N1ZVBhdGgsXG4gICAgICBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IHBhcmFtcy5yZXNjdWVQYXJhbXMuZmlsZVxuICAgIH0pO1xuXG4gICAgaWYgKG5ld0F0dGFjaG1lbnRQYXRoID09PSBhdHRhY2htZW50UGF0aCkge1xuICAgICAgLypcbiAgICAgICAqIFRoZSBhdHRhY2htZW50IGlzIGFscmVhZHkgd2hlcmUgaXQgYmVsb25ncy4gVGhpcyBpcyB0aGUgbm9ybWFsIHNlY29uZCBsb29rIGF0IGEgZmlsZSB0aGUgZm9sZGVyXG4gICAgICAgKiBkZWxldGUganVzdCByZXNjdWVkOiB0aGUgb3duaW5nIG5vdGUncyBvd24gZGVsZXRpb24gaXMgcmVwb3J0ZWQgYWZ0ZXJ3YXJkcyBhbmQgd2Fsa3MgaXRzIGxpbmtzXG4gICAgICAgKiBhZ2Fpbi4gTm90aGluZyBtb3ZlZCwgc28gbm90aGluZyBpcyBjbGFpbWVkIFx1MjAxNCB0aGUgY2FsbGVyIGtlZXBzIGl0IGluIHBsYWNlLCB3aGljaCBpcyB0aGUgdHJ1dGguXG4gICAgICAgKi9cbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgJHthdHRhY2htZW50UGF0aH0gYWxyZWFkeSBzaXRzIGF0IGl0cyByZXNjdWUgcGF0aDsgbm90aGluZyB0byBtb3ZlLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGhlIG1vdmUgZmlyZXMgYHZhdWx0Lm9uKCdyZW5hbWUnKWAsIHNvIHRoaXMgaGFuZGxlcidzIG93biBgUmVuYW1lSGFuZGxlcmAgcGlja3MgaXQgdXAgbGlrZSBhbnkgb3RoZXJcbiAgICAgKiBhdHRhY2htZW50IG1vdmUuIEl0IGlzIGRlbGliZXJhdGVseSBOT1QgcmVnaXN0ZXJlZCBpbiBgaGFuZGxlZFJlbmFtZXNgOlxuICAgICAqIGBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50YCBhbHJlYWR5IGRpc2NhcmRzIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIHdoaWxlXG4gICAgICogYHNob3VsZEhhbmRsZVJlbmFtZXNgIGlzIG9uLCBzbyBzdXBwcmVzc2luZyB0aGUgaGFuZGxlciBhcyB3ZWxsIHdvdWxkIGxlYXZlIGRhbmdsaW5nIGV4YWN0bHkgdGhlIGxpbmtzXG4gICAgICogdGhpcyByZXNjdWUgZXhpc3RzIHRvIHByZXNlcnZlLiBMZXQgdGhlIHJld3JpdGUgc2V0dGxlIGJlZm9yZSB0aGUgZGVsZXRlIHdhbGsgY2FycmllcyBvbi5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHBhcmFtcy5hcHApO1xuXG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudCcpKGBSZXNjdWVkICR7YXR0YWNobWVudFBhdGh9IHRvICR7bmV3QXR0YWNobWVudFBhdGh9LmApO1xuICAgIHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMubm90aWNlcy5hdHRhY2htZW50UmVzY3VlZCwgeyBhdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGggfSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8qXG4gICAgICogQSByZXNjdWUgdGhhdCBoYWxmIGhhcHBlbmVkIG11c3Qgbm90IHJlYWQgYXMgc3VjY2VzcyBcdTIwMTQgcmVwb3J0aW5nIGBmYWxzZWAgZmFsbHMgYmFjayB0byBrZWVwaW5nIHRoZVxuICAgICAqIGF0dGFjaG1lbnQgaW4gcGxhY2Ugd2l0aCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlLCB3aGljaCBpcyBzdGlsbCBzYWZlLlxuICAgICAqL1xuICAgIHByaW50RXJyb3IobmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzY3VlICR7YXR0YWNobWVudFBhdGh9IHRvICR7cmVzY3VlUGF0aH1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBrZXkgdW5kZXIgd2hpY2ggYSBsaW5rIGlzIHJlbWVtYmVyZWQgd2hpbGUgYSByZW5hbWUgaXMgaW4gZmxpZ2h0LlxuICpcbiAqIFRoZSByZXdyaXRlIGhhcyB0byBtYXRjaCBsaW5rcyBjYXB0dXJlZCBCRUZPUkUgdGhlIGF0dGFjaG1lbnRzIG1vdmVkIGFnYWluc3QgdGhlIGxpbmtzIHRoZSBtZXRhZGF0YSBjYWNoZVxuICogcmVwb3J0cyBBRlRFUiB0aGV5IG1vdmVkLCBhbmQgdGhlIG9ubHkgdGhpbmcgdGhhdCByZWxpYWJseSBzdXJ2aXZlcyB0aGF0IGdhcCBpcyB0aGUgbGluaydzIFRFWFQuXG4gKiBEZWxpYmVyYXRlbHkgZXhjbHVkZXMgYHBvc2l0aW9uYDoga2V5aW5nIG9uIHRoZSB3aG9sZSB7QGxpbmsgUmVmZXJlbmNlfSBtZWFudCB0aGF0IGFzIHNvb24gYXMgYW55dGhpbmdcbiAqIGVkaXRlZCB0aGUgZmlsZSBpbiBiZXR3ZWVuIFx1MjAxNCBhIGNvLWluc3RhbGxlZCBwbHVnaW4gcmV3cml0aW5nIGl0cyBvd24gbGlua3MsIG1vc3Qgb2Z0ZW4gXHUyMDE0IGV2ZXJ5IGxpbmsgYmVsb3dcbiAqIHRoZSBlZGl0IHNoaWZ0ZWQgaXRzIG9mZnNldHMsIG1pc3NlZCBpdHMga2V5LCBhbmQgd2FzIHNraXBwZWQgaW4gc2lsZW5jZSwgbGVhdmluZyB0aGUgbm90ZSB3aXRoIHNvbWUgZW1iZWRzXG4gKiByZXdyaXR0ZW4gYW5kIHRoZSByZXN0IGJyb2tlbi4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzYwLlxuICpcbiAqIFR3byBsaW5rcyB3aXRoIGlkZW50aWNhbCB0ZXh0IGluIG9uZSBmaWxlIG5lY2Vzc2FyaWx5IHJlc29sdmUgdG8gdGhlIHNhbWUgdGFyZ2V0LCBzbyBjb2xsYXBzaW5nIHRoZW0gb250b1xuICogb25lIGtleSBsb3NlcyBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdG8gYnVpbGQgdGhlIGtleSBmb3IuXG4gKiBAcmV0dXJucyBUaGUga2V5IGlkZW50aWZ5aW5nIHRoZSBsaW5rIGJ5IGl0cyB0ZXh0IGFsb25lLlxuICovXG5mdW5jdGlvbiBnZXRMaW5rSWRlbnRpdHlLZXkobGluazogUmVmZXJlbmNlKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvSnNvbih7XG4gICAgbGluazogbGluay5saW5rLFxuICAgIG9yaWdpbmFsOiBsaW5rLm9yaWdpbmFsXG4gIH0pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG5leHBvcnQgeyBFbXB0eUZvbGRlckJlaGF2aW9yIH0gZnJvbSAnLi4vdmF1bHQudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW9CQSw2QkFHTztBQUNQLHFCQUFrQjtBQUNsQixzQkFHTztBQVlQLG1CQUE4QjtBQUM5QixtQkFBK0I7QUFDL0IsbUJBQTJCO0FBQzNCLDBCQUdPO0FBQ1Asc0NBQXlDO0FBQ3pDLGtCQU1PO0FBQ1AsNkJBS087QUFDUCxvQkFBb0M7QUFDcEMsMEJBQTBDO0FBQzFDLHlCQVVPO0FBQ1Asa0JBS087QUFDUCw0QkFNTztBQUNQLG1CQUEyQjtBQUMzQiwyQkFBa0Q7QUFDbEQsMEJBQWdDO0FB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LHVCQUNaLEVBQUUsU0FBUyxTQUFTLE9BQU8sS0FBSyxVQUNoQyxFQUFFLFNBQVMsU0FBUyxPQUFPLEtBQUssV0FDL0IsU0FBUyx1QkFBdUIsaUNBQW9CLFVBQVUsaUNBQW9CO0FBQUEsRUFDMUY7QUFDRjtBQWVBLGVBQWUsNkJBQTZCLFFBQThEO0FBQ3hHLFFBQU0sV0FBVyxPQUFPLGdCQUFnQixZQUFZO0FBQ3BELE1BQUksQ0FBQyxTQUFTLGVBQWU7QUFDM0IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGlCQUFpQixPQUFPLGFBQWEsS0FBSztBQUNoRCxRQUFNLGFBQWEsTUFBTSxTQUFTLGNBQWM7QUFBQSxJQUM5QztBQUFBLElBQ0Esb0JBQW9CLE9BQU8sYUFBYTtBQUFBLEVBQzFDLENBQUM7QUFFRCxNQUFJLGVBQWUsTUFBTTtBQUN2QixxQ0FBZSxrREFBa0QsRUFBRSxzQkFBc0IsY0FBYywyQkFBMkI7QUFDbEksV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBS0YsVUFBTSxvQkFBb0IsVUFBTSx5QkFBVztBQUFBLE1BQ3pDLEtBQUssT0FBTztBQUFBLE1BQ1osU0FBUztBQUFBLE1BQ1QsdUJBQXVCLE9BQU8sYUFBYTtBQUFBLElBQzdDLENBQUM7QUFFRCxRQUFJLHNCQUFzQixnQkFBZ0I7QUFNeEMsdUNBQWUsa0RBQWtELEVBQUUsR0FBRyxjQUFjLG9EQUFvRDtBQUN4SSxhQUFPO0FBQUEsSUFDVDtBQVNBLGNBQU0sK0NBQTBCLE9BQU8sR0FBRztBQUUxQyxxQ0FBZSxrREFBa0QsRUFBRSxXQUFXLGNBQWMsT0FBTyxpQkFBaUIsR0FBRztBQUN2SCxXQUFPLHNCQUFzQixlQUFXLGtCQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixRQUFRLG1CQUFtQixFQUFFLGdCQUFnQixrQkFBa0IsQ0FBQyxDQUFDO0FBQ3JJLFdBQU87QUFBQSxFQUNULFNBQVMsT0FBTztBQUtkLGlDQUFXLElBQUksTUFBTSxvQkFBb0IsY0FBYyxPQUFPLFVBQVUsSUFBSSxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDN0YsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQW1CQSxTQUFTLG1CQUFtQixNQUF5QjtBQUNuRCxhQUFPLDRCQUFPO0FBQUEsSUFDWixNQUFNLEtBQUs7QUFBQSxJQUNYLFVBQVUsS0FBSztBQUFBLEVBQ2pCLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsiaW1wb3J0X3ZhdWx0Il0KfQo=