@mnaoumov/typescript-dev-toolkit 6.2.0 → 6.3.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.
@@ -286,6 +286,26 @@ async function publishGitHubRelease(newVersion, options = {}) {
286
286
  }
287
287
  await closeReleasedIssuesSafely(newVersion, true);
288
288
  }
289
+ function toChangelogCommitEntry(commitMessage) {
290
+ const lines = commitMessage.split(/\r?\n/).filter(Boolean);
291
+ const subject = lines[0] ?? "";
292
+ const bodyLines = lines.slice(1);
293
+ const liftedLine = MERGE_SUBJECT_REG_EXP.test(subject) ? bodyLines.find((line) => !parseIssueReferenceLine(line)) : void 0;
294
+ const entry = liftedLine ?? subject;
295
+ const references = /* @__PURE__ */ new Set();
296
+ for (const reference of bodyLines.flatMap((line) => parseIssueReferenceLine(line) ?? [])) {
297
+ if (reference.spellings.every((spelling) => !new RegExp(String.raw`(?<![\w/])${escapeRegExp(spelling)}(?!\d)`).test(entry))) {
298
+ references.add(reference.rendered);
299
+ }
300
+ }
301
+ const detailLines = bodyLines.filter((line) => line !== liftedLine && !parseIssueReferenceLine(line) && !BREAKING_CHANGE_FOOTER_REG_EXP.test(line));
302
+ return {
303
+ detailLines: detailLines.map((line) => autolinkBareUrls(line.trim())),
304
+ entry: autolinkBareUrls(entry),
305
+ hasBreakingFooter: BREAKING_CHANGE_FOOTER_REG_EXP.test(commitMessage),
306
+ references: [...references]
307
+ };
308
+ }
289
309
  function toUpdateVersionOptions(values) {
290
310
  return {
291
311
  changelogFilePath: values["changelog-file"],
@@ -757,26 +777,6 @@ ${forcingLines}
757
777
  A release publishes every commit since the last tag, not the change you happen to be working on, so the bump has to answer for all of them. Re-run the release with a ${bumpFloor.level} bump \u2014 a higher one is always accepted, and nothing has been written yet.`
758
778
  );
759
779
  }
760
- function toChangelogCommitEntry(commitMessage) {
761
- const lines = commitMessage.split(/\r?\n/).filter(Boolean);
762
- const subject = lines[0] ?? "";
763
- const bodyLines = lines.slice(1);
764
- const liftedLine = MERGE_SUBJECT_REG_EXP.test(subject) ? bodyLines.find((line) => !parseIssueReferenceLine(line)) : void 0;
765
- const entry = liftedLine ?? subject;
766
- const references = /* @__PURE__ */ new Set();
767
- for (const reference of bodyLines.flatMap((line) => parseIssueReferenceLine(line) ?? [])) {
768
- if (reference.spellings.every((spelling) => !new RegExp(String.raw`(?<![\w/])${escapeRegExp(spelling)}(?!\d)`).test(entry))) {
769
- references.add(reference.rendered);
770
- }
771
- }
772
- const detailLines = bodyLines.filter((line) => line !== liftedLine && !parseIssueReferenceLine(line) && !BREAKING_CHANGE_FOOTER_REG_EXP.test(line));
773
- return {
774
- detailLines: detailLines.map((line) => autolinkBareUrls(line.trim())),
775
- entry: autolinkBareUrls(entry),
776
- hasBreakingFooter: BREAKING_CHANGE_FOOTER_REG_EXP.test(commitMessage),
777
- references: [...references]
778
- };
779
- }
780
780
  function toChangelogEntry(commitMessage) {
781
781
  const { entry, references } = toChangelogCommitEntry(commitMessage);
782
782
  return references.length === 0 ? entry : `${entry} (${references.join(", ")})`;
@@ -901,10 +901,11 @@ export {
901
901
  parseVersionArguments,
902
902
  publishGitHubRelease,
903
903
  readGitHeadState,
904
+ toChangelogCommitEntry,
904
905
  toUpdateVersionOptions,
905
906
  updateChangelog,
906
907
  updateVersion,
907
908
  updateVersionInFiles,
908
909
  validate
909
910
  };
910
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJzaW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHZlcnNpb24gdXBkYXRlcyBpbiBhIHByb2plY3QuXG4gKiBJdCBpbmNsdWRlcyB0YXNrcyBzdWNoIGFzIHZhbGlkYXRpbmcgdmVyc2lvbiB1cGRhdGUgdHlwZXMsIGNoZWNraW5nIHRoZSBzdGF0ZVxuICogb2YgR2l0IGFuZCBHaXRIdWIgQ0xJLCB1cGRhdGluZyB2ZXJzaW9uIG51bWJlcnMgaW4gZmlsZXMsIGFuZCBwZXJmb3JtaW5nXG4gKiBHaXQgb3BlcmF0aW9ucyBzdWNoIGFzIHRhZ2dpbmcgYW5kIHB1c2hpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQYXJzZUFyZ3NDb25maWcgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUgeyBSZWxlYXNlVHlwZSB9IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7XG4gIGVzY2FwZVJlZ0V4cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZHRlbXAsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBiYXNlbmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lL3Byb21pc2VzJztcbmltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBpbmMsXG4gIHBhcnNlLFxuICBwcmVyZWxlYXNlXG59IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ2hhbmdlbG9nQ29tbWl0RW50cnksXG4gIENoYW5nZWxvZ1N0eWxlXG59IGZyb20gJy4vY2hhbmdlbG9nLWdyb3VwaW5nLnRzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUxvY2tKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQge1xuICBDSEFOR0VMT0dfU1RZTEVTLFxuICByZW5kZXJHcm91cGVkQ2hhbmdlbG9nU2VjdGlvblxufSBmcm9tICcuL2NoYW5nZWxvZy1ncm91cGluZy50cyc7XG5pbXBvcnQge1xuICBmaW5kRm9yYmlkZGVuUGF0dGVybk1hdGNoZXMsXG4gIEZPUkJJRERFTl9QQVRURVJOU19GSUxFX0VOVl9WQVJJQUJMRSxcbiAgcmVhZEZvcmJpZGRlblBhdHRlcm5zXG59IGZyb20gJy4vZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmltcG9ydCB7IGdhdGUgfSBmcm9tICcuL2dhdGUudHMnO1xuaW1wb3J0IHsgc3BlbGxjaGVja0NvbnRlbnQgfSBmcm9tICcuL2xpbnRlcnMvY3NwZWxsLWNvbnRlbnQudHMnO1xuaW1wb3J0IHtcbiAgZml4TWFya2Rvd25Db250ZW50LFxuICBsaW50TWFya2Rvd25Db250ZW50XG59IGZyb20gJy4vbGludGVycy9tYXJrZG93bmxpbnQtY29udGVudC50cyc7XG5pbXBvcnQge1xuICBlZGl0TnBtU2hyaW5rV3JhcEpzb24sXG4gIGVkaXRQYWNrYWdlSnNvbixcbiAgZWRpdFBhY2thZ2VMb2NrSnNvbixcbiAgcmVhZFBhY2thZ2VKc29uXG59IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IGNsb3NlUmVsZWFzZWRJc3N1ZXMgfSBmcm9tICcuL3JlbGVhc2VkLWlzc3Vlcy50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBhZGRVcGRhdGVkRmlsZXNUb0dpdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwdWJsaXNoR2l0SHViUmVsZWFzZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZpbGVzIHRvIGF0dGFjaCB0byB0aGUgR2l0SHViIHJlbGVhc2UsIGFzIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuIEEgcGF0aCB0aGF0IGRvZXNcbiAgICogbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBgbnBtIHBhY2tgIHRhcmJhbGwgb2YgdGhlIHByb2plY3QsIHdyaXR0ZW4gaW50byBgZGlzdC9gLCBhbmQgYGRpc3Qvc3R5bGVzLmNzc2BcbiAgICovXG4gIHJlYWRvbmx5IGdldFJlbGVhc2VBc3NldFBhdGhzPzogKCgpID0+IFByb21pc2U8c3RyaW5nW10+KSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjbG9zZSB0aGUgaXNzdWVzIHRoZSByZWxlYXNlIGNhcnJpZXMgb25jZSBpdCBpcyBwdWJsaXNoZWQ6IGV2ZXJ5IGlzc3VlIGEgY29tbWl0IHNpbmNlIHRoZSBwcmV2aW91c1xuICAgKiB0YWcgbmFtZXMgd2l0aCBhIGNsb3Npbmcga2V5d29yZCAoYGZpeGVzICMxMmApIGlzIGNsb3NlZCB3aXRoIGEgYEZpeGVkIGluYCAvIGBJbXBsZW1lbnRlZCBpbmAgY29tbWVudCBsaW5raW5nXG4gICAqIHRoZSByZWxlYXNlLiBTZWUge0BsaW5rIGNsb3NlUmVsZWFzZWRJc3N1ZXN9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlcXVpcmUgZXZlcnkgYXNzZXQgdG8gZXhpc3QsIHJlcXVpcmUgYW4gZXhpc3RpbmcgcmVtb3RlIHRhZywgYW5kIHZlcmlmeSB0aGUgcHVibGlzaGVkXG4gICAqIG5vbi1kcmFmdCByZWxlYXNlIGFuZCBpdHMgdXBsb2FkZWQgYXNzZXRzIGJlZm9yZSBjbG9zaW5nIGlzc3Vlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5UmVsZWFzZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZUNoYW5nZWxvZ30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIHBhdGggdG8gYSBmaWxlIHdob3NlIGNvbnRlbnRzIGJlY29tZSB0aGUgYm9keSBvZiB0aGUgbmV3IHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiwgaW5zdGVhZCBvZlxuICAgKiB0aGUgYnVsbGV0cyBkZXJpdmVkIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlcy4gVXNlIGl0IHRvIHN1cHBseSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzIGZyb20gYVxuICAgKiBub24taW50ZXJhY3RpdmUgY2FsbGVyIChhIGJhY2tncm91bmQgcHJvY2VzcywgQ0ksIGFuIGFnZW50KS5cbiAgICpcbiAgICogU2V0dGluZyBpdCBpbXBsaWVzIG5vIGludGVyYWN0aXZlIHJldmlldzogdGhlIGNvbW1pdCBsb2cgaXMgbm90IHJlYWQsIGFuZCB0aGUgY2hhbmdlbG9nIGlzIG5ldmVyXG4gICAqIG9wZW5lZCBpbiB0aGUgZWRpdG9yIG5vciB3YWl0ZWQgb24gYXQgdGhlIGNvbnNvbGUsIHJlZ2FyZGxlc3Mgb2Yge0BsaW5rIHNob3VsZEVkaXRDaGFuZ2Vsb2d9LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCBzdWJqZWN0cyBzaW5jZSB0aGUgcHJldmlvdXMgdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nRmlsZVBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgc2VjdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzIGlzIGxhaWQgb3V0OiBgZ3JvdXBlZGAgc29ydHMgdGhlIGVudHJpZXMgdW5kZXIgcGxhaW4tbGFuZ3VhZ2VcbiAgICogaGVhZGluZ3MgYW5kIGNvdW50cyB0aGUgbWFpbnRlbmFuY2UgY29tbWl0cyBpbnN0ZWFkIG9mIGxpc3RpbmcgdGhlbSwgYGNvbW1pdHNgIHdyaXRlcyBvbmUgYnVsbGV0IHBlciBmaXJzdC1wYXJlbnRcbiAgICogY29tbWl0LiBTZWUge0BsaW5rIENoYW5nZWxvZ1N0eWxlfS5cbiAgICpcbiAgICogSWdub3JlZCB3aGVuIHtAbGluayBjaGFuZ2Vsb2dGaWxlUGF0aH0gaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2dyb3VwZWQnYFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nU3R5bGU/OiBDaGFuZ2Vsb2dTdHlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBvcGVuIHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIGluIHRoZSBlZGl0b3IgZm9yIGFuIGludGVyYWN0aXZlIHJldmlldy4gV2hlbiBgZmFsc2VgLFxuICAgKiB0aGUgY2hhbmdlbG9nIGlzIHN0aWxsIGdlbmVyYXRlZCBmcm9tIGNvbW1pdCBtZXNzYWdlcywgYnV0IGl0IGlzIG5vdCBvcGVuZWQgaW4gdGhlIGVkaXRvciBmb3JcbiAgICogbWFudWFsIHJldmlldy5cbiAgICpcbiAgICogSWdub3JlZCB3aGVuIHtAbGluayBjaGFuZ2Vsb2dGaWxlUGF0aH0gaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVWZXJzaW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVWZXJzaW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIHBhdGggdG8gYSBmaWxlIHdob3NlIGNvbnRlbnRzIGJlY29tZSB0aGUgYm9keSBvZiB0aGUgbmV3IHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiwgaW5zdGVhZCBvZlxuICAgKiB0aGUgYnVsbGV0cyBkZXJpdmVkIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlcy4gVXNlIGl0IHRvIHN1cHBseSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzIGZyb20gYVxuICAgKiBub24taW50ZXJhY3RpdmUgY2FsbGVyIChhIGJhY2tncm91bmQgcHJvY2VzcywgQ0ksIGFuIGFnZW50KS5cbiAgICpcbiAgICogU2V0dGluZyBpdCBpbXBsaWVzIG5vIGludGVyYWN0aXZlIHJldmlldzogdGhlIGNvbW1pdCBsb2cgaXMgbm90IHJlYWQsIGFuZCB0aGUgY2hhbmdlbG9nIGlzIG5ldmVyXG4gICAqIG9wZW5lZCBpbiB0aGUgZWRpdG9yIG5vciB3YWl0ZWQgb24gYXQgdGhlIGNvbnNvbGUsIHJlZ2FyZGxlc3Mgb2Yge0BsaW5rIHNob3VsZEVkaXRDaGFuZ2Vsb2d9LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCBzdWJqZWN0cyBzaW5jZSB0aGUgcHJldmlvdXMgdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nRmlsZVBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgc2VjdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzIGlzIGxhaWQgb3V0LiBTZWUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMuY2hhbmdlbG9nU3R5bGV9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2dyb3VwZWQnYFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nU3R5bGU/OiBDaGFuZ2Vsb2dTdHlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlsZXMgdG8gYXR0YWNoIHRvIHRoZSBHaXRIdWIgcmVsZWFzZS4gU2VlIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuZ2V0UmVsZWFzZUFzc2V0UGF0aHN9LlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0UmVsZWFzZUFzc2V0UGF0aHM/OiAoKCkgPT4gUHJvbWlzZTxzdHJpbmdbXT4pIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIEdpdEh1YiByZWxlYXNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIEdpdEh1YiByZWxlYXNlIGhhcyBiZWVuIHByZXBhcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcGFyZUdpdEh1YlJlbGVhc2U/OiAobmV3VmVyc2lvbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgYnVpbGQgc3RlcC4gVGhlIGJ1aWxkIGlzIGEgcHVibGlzaGluZyBwcmVyZXF1aXNpdGUsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjayxcbiAgICogc28gaXQgaXMgZ292ZXJuZWQgYnkgdGhpcyBmbGFnIGluZGVwZW5kZW50bHkgb2Yge0BsaW5rIHNob3VsZFJ1bkNoZWNrc30g4oCUIGl0IHJ1bnMgZXZlbiB3aGVuIHRoZVxuICAgKiBjaGVja3MgYXJlIHNraXBwZWQsIHNvIGEgZmFzdCByZWxlYXNlIHN0aWxsIHNoaXBzIGZyZXNoIGFydGlmYWN0cy4gU2V0IHRvIGBmYWxzZWAgb25seSB3aGVuIHRoZVxuICAgKiBidWlsZCBvdXRwdXQgaXMga25vd24gdG8gYWxyZWFkeSBtYXRjaCB0aGUgY3VycmVudCBjb2RlOyBvdGhlcndpc2UgdGhlIHJlbGVhc2Ugd291bGQgcHVibGlzaFxuICAgKiBzdGFsZSBhcnRpZmFjdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNsb3NlIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2FycmllcyBvbmNlIGl0IGlzIHB1Ymxpc2hlZC4gU2VlXG4gICAqIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlc30uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgY2hhbmdlbG9nRmlsZVBhdGh9IGlzIHNldC4gV2hlbiBpdCBpcyBuZWl0aGVyIHNldCBub3IgZGlzYWJsZWQsIHRoZSByZWxlYXNlXG4gICAqIHJlcXVpcmVzIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCBhbmQge0BsaW5rIHVwZGF0ZVZlcnNpb259IHJlZnVzZXMgdXAgZnJvbnQgd2l0aG91dCBvbmUgcmF0aGVyXG4gICAqIHRoYW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yIG5vYm9keSB3aWxsIGNsb3NlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggYW5kIHZlcmlmeSB0aGUgR2l0SHViIHJlbGVhc2UgYmVmb3JlIHB1c2hpbmcgdGhlIHZlcnNpb24gY29tbWl0IHRvIHRoZSBicmFuY2guXG4gICAqIFByZXBhcmF0aW9uIGFuZCBhc3NldCB2YWxpZGF0aW9uIGhhcHBlbiBiZWZvcmUgYW55IHB1c2guIE9ubHkgdGhlIHJlbGVhc2UgdGFnIGlzIHB1c2hlZCBmaXJzdDtcbiAgICogYSBmYWlsZWQgcHJlcGFyYXRpb24sIHB1YmxpY2F0aW9uIG9yIHZlcmlmaWNhdGlvbiBsZWF2ZXMgdGhlIHJlbW90ZSBicmFuY2ggdW5jaGFuZ2VkLlxuICAgKiBVc2VzIHRoZSBgb3JpZ2luYCByZW1vdGUgYW5kIHB1c2hlcyB0aGUgdmVyaWZpZWQgY29tbWl0IHRvIHRoZSBvcmlnaW5hbCBicmFuY2ggd2l0aG91dCBmb3JjZS5cbiAgICogSWdub3JlZCB3aGVuIHtAbGluayBzaG91bGRSZWxlYXNlfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQdWJsaXNoQmVmb3JlUHVzaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHVibGlzaCB0aGUgcmVsZWFzZS4gV2hlbiBgZmFsc2VgLCBhbGwgbG9jYWwgc3RlcHMgYXJlIGV4ZWN1dGVkICh2ZXJzaW9uIGJ1bXAsXG4gICAqIGNoYW5nZWxvZywgY29tbWl0LCB0YWcpLCBidXQgdGhlIGNoYW5nZXMgYXJlIG5vdCBwdXNoZWQgYW5kIG5vIEdpdEh1YiByZWxlYXNlIGlzIHB1Ymxpc2hlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZWZsaWdodCB2ZXJpZmljYXRpb24gY2hlY2tzIChjbGVhbi1yZXBvIGNoZWNrLCBmb3JtYXQsIHNwZWxsY2hlY2ssIGxpbnQsXG4gICAqIG92ZXItZXhwb3N1cmUgYW5hbHlzaXMsIGFuZCB0ZXN0cykuIFRoZSBidWlsZCBzdGVwIGlzIG5vdCBvbmUgb2YgdGhlc2UgY2hlY2tzIOKAlCBpdCBpcyBnb3Zlcm5lZFxuICAgKiBzZXBhcmF0ZWx5IGJ5IHtAbGluayBzaG91bGRCdWlsZH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUnVuQ2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZS1jb21taXQgaG9vayB3aGVuIGNyZWF0aW5nIHRoZSByZWxlYXNlIGNvbW1pdC4gV2hlbiBgZmFsc2VgLCBgLS1uby12ZXJpZnlgXG4gICAqIGlzIHBhc3NlZCB0byB0aGUgcmVsZWFzZSBjb21taXQgdG8gc2tpcCB0aGUgaG9vay5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRWZXJpZnlDb21taXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIGluIGFueSBmaWxlIGJleW9uZCBgcGFja2FnZS5qc29uYCBhbmQgdGhlIGxvY2tmaWxlcywgb25jZSB0aGUgbmV3IHZlcnNpb24gaXMga25vd24gYW5kXG4gICAqIGJlZm9yZSB0aGUgcmVsZWFzZSBjb21taXQgaXMgbWFkZS4gQW4gT2JzaWRpYW4gcGx1Z2luJ3MgYG1hbmlmZXN0Lmpzb25gIGFuZCBgdmVyc2lvbnMuanNvbmAgYXJlIHRoZSBjYXNlIHRoaXNcbiAgICogZXhpc3RzIGZvci5cbiAgICpcbiAgICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgdmVyc2lvbiBiZWluZyByZWxlYXNlZC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlcyBhcmUgdXBkYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZVZlcnNpb25JbkV4dHJhRmlsZXM/OiAoKG5ld1ZlcnNpb246IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGxvd2VzdCBidW1wIGEgcmFuZ2Ugb2YgY29tbWl0cyBtYXkgYmUgcHVibGlzaGVkIHVuZGVyLCBhbmQgdGhlIGNvbW1pdHMgdGhhdCBmb3JjZSBpdC5cbiAqL1xuaW50ZXJmYWNlIEJ1bXBGbG9vciB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0cyB3aG9zZSBDb252ZW50aW9uYWwtQ29tbWl0cyBtYXJrZXJzIGZvcmNlIHtAbGluayBsZXZlbH0sIGluIHRoZSBvcmRlciBgZ2l0IGxvZ2AgcmVwb3J0ZWQgdGhlbS5cbiAgICogRW1wdHkgd2hlbiBub3RoaW5nIGZvcmNlcyBhbnl0aGluZywgd2hpY2ggaXMgdGhlIG9yZGluYXJ5IGNhc2UgZm9yIGEgcmFuZ2Ugb2YgYGZpeGBlcyBhbmQgYGNob3JlYHMuXG4gICAqL1xuICByZWFkb25seSBmb3JjaW5nQ29tbWl0czogcmVhZG9ubHkgRm9yY2luZ0NvbW1pdFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbG93ZXN0IHtAbGluayBCdW1wTGV2ZWx9IHRoZSByYW5nZSBtYXkgc2hpcCBhcy5cbiAgICovXG4gIHJlYWRvbmx5IGxldmVsOiBCdW1wTGV2ZWw7XG59XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgdG9CdW1wRmxvb3JFcnJvcn0gbmVlZHMgYmV5b25kIHRoZSB7QGxpbmsgQnVtcEZsb29yfSBpdHNlbGYgdG8gc2F5IHdoYXQgd2FzIGFza2VkIGZvciBhbmQgd2hhdFxuICogdGhhdCB3b3VsZCBoYXZlIHNoaXBwZWQgYXMuXG4gKi9cbmludGVyZmFjZSBCdW1wRmxvb3JSZWZ1c2FsQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgcHJldmlvdXMgcmVsZWFzZSB0YWcgdGhlIHJhbmdlIHdhcyBtZWFzdXJlZCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFRhZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiB0aGUgcmVxdWVzdGVkIGJ1bXAgd291bGQgaGF2ZSBwcm9kdWNlZC5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1ZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHtAbGluayBCdW1wTGV2ZWx9IHtAbGluayBuZXdWZXJzaW9ufSBhY3R1YWxseSBtb3ZlcywgcmVsYXRpdmUgdG8ge0BsaW5rIGxhc3RUYWd9LlxuICAgKi9cbiAgcmVhZG9ubHkgdGFrZW5MZXZlbDogQnVtcExldmVsO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0aGUgcmVsZWFzZSB3YXMgYXNrZWQgZm9yLCB2ZXJiYXRpbSDigJQgd2hpY2ggaXMgYSBwcmUtcmVsZWFzZSB0eXBlIG9yIGFuIGV4cGxpY2l0XG4gICAqIHZlcnNpb24gYXMgb2Z0ZW4gYXMgaXQgaXMgYSBwbGFpbiBgcGF0Y2hgLCBhbmQgaXMgdGhlcmVmb3JlIHdvcnRoIHF1b3RpbmcgYmFjayByYXRoZXIgdGhhbiBpbmZlcnJpbmcuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB0aHJlZSByZWxlYXNlIGxpbmVzIGEgYnVtcCBjYW4gbW92ZSwgb3JkZXJlZCBieSB7QGxpbmsgaXNCdW1wTGV2ZWxBdExlYXN0fS5cbiAqXG4gKiBBIHByZS1yZWxlYXNlIHR5cGUgaXMgbm90IG9uZSBvZiB0aGVzZTogYHByZW1ham9yYCBtb3ZlcyB0aGUgbWFqb3IgbGluZSBhbmQgYHByZXJlbGVhc2VgIG1vdmVzIHdoaWNoZXZlclxuICogbGluZSBhbiBlYXJsaWVyIHByZS1yZWxlYXNlIGFscmVhZHkgY2hvc2UsIHNvIHdoYXQgYSBwcmUtcmVsZWFzZSBkaWQgaXMgcmVhZCBvZmYgdGhlIHJlc3VsdGluZyB2ZXJzaW9uXG4gKiByYXRoZXIgdGhhbiBvZmYgaXRzIHR5cGUuIFNlZSB7QGxpbmsgdG9FZmZlY3RpdmVCdW1wTGV2ZWx9LlxuICovXG50eXBlIEJ1bXBMZXZlbCA9IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yIHwgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IgfCBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcblxuLyoqXG4gKiBPbmUgZmluZGluZyByZXBvcnRlZCBvdmVyIHRoZSBzZXR0bGVkIGNoYW5nZWxvZyBzZWN0aW9uLCB0YWdnZWQgd2l0aCB0aGUgbnBtIHNjcmlwdCB3aG9zZSBjaGVjayBwcm9kdWNlZCBpdC5cbiAqXG4gKiBUaGUgdGFnIGlzIHdoYXQgbGV0cyBvbmUgbWVzc2FnZSBuYW1lIGBsaW50Om1kYCwgYHNwZWxsY2hlY2tgIG9yIGJvdGgsIHRydXRoZnVsbHkuIEJvdGggY2hlY2tzIHJ1biBvdmVyXG4gKiBldmVyeSBzZXR0bGUsIHNvIGFuIGF1dGhvciB3aG8gaGFzIHRvIGZpeCBhIGhhcmQtd3JhcHBlZCBsaW5lIGFuZCBhIGNvaW5lZCB3b3JkIGZpeGVzIHRoZW0gaW4gT05FIHJvdW5kIG9mXG4gKiB0aGUgcmV2aWV3IHJhdGhlciB0aGFuIGJlaW5nIHNlbnQgYmFjayB0d2ljZS5cbiAqL1xuaW50ZXJmYWNlIENoYW5nZWxvZ0ZpbmRpbmcge1xuICAvKipcbiAgICogVGhlIG5wbSBzY3JpcHQgdGhhdCB3b3VsZCBoYXZlIHJlcG9ydGVkIHRoaXMgb24gdGhlIGJyYW5jaC5cbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlcG9ydGVkIGxpbmUsIGV4YWN0bHkgYXMgdGhhdCBzY3JpcHQncyBvd24gb3V0cHV0IHdvdWxkIGhhdmUgY2FycmllZCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgY29tbWl0IHRoYXQgZm9yY2VzIGEge0BsaW5rIEJ1bXBGbG9vcn0sIHJlbmRlcmVkIGludG8gdGhlIHJlZnVzYWwgc28gdGhlIGF1dGhvciBjYW4gZ28gYW5kIGxvb2sgYXQgaXQuXG4gKi9cbmludGVyZmFjZSBGb3JjaW5nQ29tbWl0IHtcbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgQnVtcExldmVsfSB0aGlzIG9uZSBjb21taXQgZm9yY2VzIG9uIGl0cyBvd24uXG4gICAqL1xuICByZWFkb25seSBsZXZlbDogQnVtcExldmVsO1xuXG4gIC8qKlxuICAgKiBXaGF0IGluIHRoZSBjb21taXQgZm9yY2VkIGl0IOKAlCB0aGUgYCFgIG1hcmtlciwgdGhlIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXIsIG9yIHRoZSBgZmVhdGAgdHlwZSDigJQgbmFtZWRcbiAgICogc28gYSByZWFkZXIgY2FuIHRlbGwgYSBkZWxpYmVyYXRlIGJyZWFraW5nIG1hcmtlciBmcm9tIGEgZm9vdGVyIHNvbWVib2R5IHdyb3RlIGluIHBhc3NpbmcuXG4gICAqL1xuICByZWFkb25seSBtYXJrZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bGwgY29tbWl0IGhhc2guXG4gICAqL1xuICByZWFkb25seSBzaGE6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbW1pdCBzdWJqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTnBtUGFja1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGZpbGVuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBgQlJFQUtJTkcgQ0hBTkdFOmAgZm9vdGVyLCBpbiBib3RoIHNwZWxsaW5ncyBDb252ZW50aW9uYWwgQ29tbWl0cyBhbGxvd3MuXG4gKlxuICogTWF0Y2hlZCBwZXIgbGluZSAoYG1gKSByYXRoZXIgdGhhbiBhZ2FpbnN0IHRoZSB3aG9sZSBtZXNzYWdlLCBiZWNhdXNlIGEgZm9vdGVyIHNpdHMgYXQgdGhlIGJvdHRvbSBvZiB0aGVcbiAqIGJvZHkuIEl0IGlzIHRoZSBoYWxmIG9mIHRoZSBicmVha2luZy1jaGFuZ2Ugc2lnbmFsIHRoYXQge0BsaW5rIE1FUkdFX1NVQkpFQ1RfUkVHX0VYUH0ncyBzaWJsaW5nIHJld3JpdGVcbiAqIGNhbm5vdCBjYXJyeTogYHRvQ2hhbmdlbG9nRW50cnlgIGxpZnRzIG9ubHkgdGhlIG1lcmdlIGJvZHkncyBmaXJzdCBsaW5lIG9udG8gdGhlIG1lcmdlIHN1YmplY3QsIHNvIGEgZm9vdGVyXG4gKiB3cml0dGVuIG9uIGEgYnJhbmNoIGNvbW1pdCBuZXZlciByZWFjaGVzIHRoZSBmaXJzdC1wYXJlbnQgaGlzdG9yeSBhdCBhbGwuIFRoYXQgaXMgd2h5XG4gKiB7QGxpbmsgZ2V0QnVtcEZsb29yfSByZWFkcyBldmVyeSBjb21taXQgaW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIG9ubHkgdGhlIGZpcnN0LXBhcmVudCBvbmVzLlxuICovXG5jb25zdCBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX1JFR19FWFAgPSAvXkJSRUFLSU5HWyAtXUNIQU5HRTovbTtcblxuLyoqXG4gKiBUaGUgbWFya2VyIG5hbWVzIGEge0BsaW5rIEZvcmNpbmdDb21taXR9IGNhcnJpZXMsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGUgcmVmdXNhbCBtZXNzYWdlIHNheXMgZm9yY2VkIHRoZVxuICogZmxvb3IuIFRoZXkgYXJlIHNwZWxsZWQgb3V0IHJhdGhlciB0aGFuIHJlZHVjZWQgdG8gdGhlIGxldmVsIGFsb25lLCBiZWNhdXNlIGBmZWF0IWAgYW5kIGEgYEJSRUFLSU5HIENIQU5HRTpgXG4gKiBmb290ZXIgYnVyaWVkIGluIGEgYm9keSBhcmUgdmVyeSBkaWZmZXJlbnQgdGhpbmdzIHRvIGJlIHRvbGQgYWJvdXQuXG4gKi9cbmNvbnN0IEJSRUFLSU5HX0NIQU5HRV9GT09URVJfTUFSS0VSID0gJ2EgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3Rlcic7XG5cbi8qKlxuICogU2VlIHtAbGluayBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX01BUktFUn0uXG4gKi9cbmNvbnN0IEJSRUFLSU5HX01BUktFUiA9ICd0aGUgYCFgIGJyZWFraW5nIG1hcmtlcic7XG5cbi8qKlxuICogU2VlIHtAbGluayBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX01BUktFUn0uXG4gKi9cbmNvbnN0IEZFQVRfVFlQRV9NQVJLRVIgPSAnYSBgZmVhdGAgdHlwZSc7XG5cbi8qKlxuICogQSBDb252ZW50aW9uYWwtQ29tbWl0cyBzdWJqZWN0OiBhIHR5cGUsIGFuIG9wdGlvbmFsIHNjb3BlLCBhbiBvcHRpb25hbCBgIWAsIHRoZW4gdGhlIGNvbG9uLlxuICpcbiAqIERlbGliZXJhdGVseSB0b2xlcmFudCBvZiBhIHN1YmplY3QgdGhhdCBpcyBub3Qgb25lIGF0IGFsbCDigJQgYW4gdW5wYXJzYWJsZSBzdWJqZWN0IHNpbXBseSBjb25zdHJhaW5zXG4gKiBub3RoaW5nLCB3aGljaCBpcyB0aGUgc2FtZSBhbnN3ZXIgYSBgY2hvcmU6YCBnaXZlcy4gVGhpcyBnYXRlIGV4aXN0cyB0byBjYXRjaCBhIGJ1bXAgdGhhdCBpcyB0b28gTE9XLCBzb1xuICogZmFpbGluZyB0byByZWNvZ25pemUgYSBzdWJqZWN0IGNhbiBvbmx5IHVuZGVyLWNvbnN0cmFpbiwgbmV2ZXIgcmVmdXNlIGEgcmVsZWFzZSB0aGF0IHNob3VsZCBoYXZlIHNoaXBwZWQuXG4gKi9cbmNvbnN0IENPTlZFTlRJT05BTF9DT01NSVRfU1VCSkVDVF9SRUdfRVhQID0gL14oPzx0eXBlPlthLXpdKykoPzpcXChbXigpXSpcXCkpPyg/PGJyZWFraW5nPiEpPzpcXHMvaTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBwcmUtcmVsZWFzZSBpZGVudGlmaWVyIHVzZWQgZm9yIHByZS1yZWxlYXNlIHZlcnNpb25zLlxuICovXG5jb25zdCBERUZBVUxUX1BSRUlEID0gJ2JldGEnO1xuXG4vKipcbiAqIFRoZSBDb252ZW50aW9uYWwtQ29tbWl0cyB0eXBlIHRoYXQgZm9yY2VzIGEgbWlub3IuXG4gKi9cbmNvbnN0IEZFQVRfVFlQRSA9ICdmZWF0JztcblxuLyoqXG4gKiBPbmUgaXNzdWUgcmVmZXJlbmNlIGluc2lkZSBhbiB7QGxpbmsgSVNTVUVfUkVGRVJFTkNFX0xJTkVfUkVHX0VYUH0gbGluZTogYW4gaXNzdWUgb3IgcHVsbCByZXF1ZXN0IFVSTCwgYW5cbiAqIGBvd25lci9yZXBvI25gLCBvciBhIGJhcmUgYCNuYC5cbiAqL1xuY29uc3QgSVNTVUVfUkVGRVJFTkNFX1JFR19FWFAgPSAvaHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvKD88dXJsU2x1Zz5bXFx3Li1dK1xcL1tcXHcuLV0rKVxcLyg/Omlzc3Vlc3xwdWxsKVxcLyg/PHVybE51bWJlcj5cXGQrKXwoPzwhW1xcdy4vLV0pKD88c2x1Zz5bXFx3Li1dK1xcL1tcXHcuLV0rKSMoPzxzbHVnTnVtYmVyPlxcZCspXFxifCg/PCFbXFx3LyYjLi1dKSMoPzxiYXJlTnVtYmVyPlxcZCspXFxiL2c7XG5cbi8qKlxuICogQSBjb21taXQgYm9keSBsaW5lIHRoYXQgbmFtZXMgdGhlIGlzc3VlcyB0aGUgY29tbWl0IHdvcmtzIG9uOiBgUmVmcyBvd25lci9yZXBvIzEyYCwgYEZpeGVzICMzYCxcbiAqIGBDbG9zZXMgaHR0cHM6Ly9naXRodWIuY29tL293bmVyL3JlcG8vaXNzdWVzLzQsICM1YC4gVGhlIGtleXdvcmQgaXMgZm9sbG93ZWQgYnkgcmVmZXJlbmNlcyBhbmQgbm90aGluZyBlbHNlXG4gKiAoc2VlIHtAbGluayBwYXJzZUlzc3VlUmVmZXJlbmNlTGluZX0pLCBzbyBhIHByb3NlIGxpbmUgdGhhdCBtZXJlbHkgb3BlbnMgd2l0aCBgRml4ZXNgIG5hbWVzIG5vdGhpbmcuXG4gKlxuICogQSBmaXggbWFkZSBpbiBvbmUgcmVwb3NpdG9yeSBmb3IgYW4gaXNzdWUgaW4gYW5vdGhlciBjbG9zZXMgbm90aGluZyBoZXJlLCBhbmQgaXRzIGNvbW1pdCBzdWJqZWN0IGNhbm5vdCBjYXJyeVxuICogdGhlIG90aGVyIHJlcG9zaXRvcnkncyBudW1iZXIsIHNvIHRoaXMgbGluZSBpcyB0aGUgb25seSBwbGFjZSB0aGUgcmVsZWFzZSBjYW4gbGVhcm4gd2hpY2ggaXNzdWUgaXQgZml4ZXMuXG4gKi9cbmNvbnN0IElTU1VFX1JFRkVSRU5DRV9MSU5FX1JFR19FWFAgPSAvXig/OnJlZnM/fHJlfGZpeCg/OmVbc2RdKT98Y2xvc2Vbc2RdP3xyZXNvbHZlW3NkXT98aW1wbGVtZW50cz8pOj9cXHMrKD88cmVmZXJlbmNlcz4uKykkL2k7XG5cbi8qKlxuICogVGhlIG5wbSBzY3JpcHRzIHdob3NlIGNoZWNrcyB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cgaXMgaGVsZCB0bywgbmFtZWQgaW4gdGhlIG1lc3NhZ2VzIHNvIGEgcmVhZGVyIGtub3dzIHdoaWNoXG4gKiBnYXRlIHRoZXkgYXJlIGxvb2tpbmcgYXQg4oCUIGFuZCBrbm93cyB0aGF0IGZpeGluZyBpdCBoZXJlIGlzIHRoZSBzYW1lIGZpeCBhcyBmaXhpbmcgaXQgb24gdGhlIGJyYW5jaC5cbiAqL1xuY29uc3QgTElOVF9NRF9TQ1JJUFRfTkFNRSA9ICdsaW50Om1kJztcblxuLyoqXG4gKiBIb3cgbXVjaCBvZiBhIGNvbW1pdCBoYXNoIHRoZSBidW1wLWZsb29yIHJlZnVzYWwgcHJpbnRzLiBMb25nIGVub3VnaCB0byBwYXN0ZSBpbnRvIGBnaXQgc2hvd2AsIHNob3J0IGVub3VnaFxuICogdGhhdCBhIGxpc3Qgb2YgdGhlbSBzdGF5cyByZWFkYWJsZS5cbiAqL1xuY29uc3QgU0hPUlRfU0hBX0xFTkdUSCA9IDg7XG5cbi8qKlxuICogU2VlIHtAbGluayBMSU5UX01EX1NDUklQVF9OQU1FfS5cbiAqL1xuY29uc3QgU1BFTExDSEVDS19TQ1JJUFRfTkFNRSA9ICdzcGVsbGNoZWNrJztcblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgYSBtZXJnZSBzdWJqZWN0IGdpdCB3cm90ZSBpdHNlbGYsIHJhdGhlciB0aGFuIG9uZSBhbiBhdXRob3IgY2hvc2UuXG4gKlxuICogRXZlcnkgZGVmYXVsdCBnaXQgcHJvZHVjZXMgb3BlbnMgd2l0aCBgTWVyZ2VgIGFuZCBhIHdvcmQgYm91bmRhcnkg4oCUIGBNZXJnZSBicmFuY2ggJ3gnYCxcbiAqIGBNZXJnZSBicmFuY2hlcyAneCcgYW5kICd5J2AsIGBNZXJnZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoICd4J2AsIGBNZXJnZSBwdWxsIHJlcXVlc3QgIzEgZnJvbSB5YCxcbiAqIGBNZXJnZSB0YWcgJ3gnYCwgYE1lcmdlIGNvbW1pdCAnYWJjJ2Ag4oCUIHdoaWNoIGlzIHdoYXQgdGhlIG9wdGlvbmFsIGFsdGVybmF0aW9uIGFuZCB0aGUgdHJhaWxpbmcgYFxcYmAgY292ZXJcbiAqIGJldHdlZW4gdGhlbS4gQmVpbmcgdGhhdCBicm9hZCBjb3N0cyBub3RoaW5nIGhlcmU6IGV2ZXJ5IGNoYW5nZWxvZyBlbnRyeSBpbiB0aGlzIHdvcmtzcGFjZSBpcyBhXG4gKiBDb252ZW50aW9uYWwtQ29tbWl0cyBzdWJqZWN0LCBhbmQgdGhvc2Ugb3BlbiB3aXRoIGEgdHlwZSAoYGZlYXRgLCBgZml4YCwgYGNob3JlYCwg4oCmKSwgbmV2ZXIgd2l0aCBgTWVyZ2VgLlxuICpcbiAqIE9ORSBwYXR0ZXJuIGRyaXZlcyBib3RoIGhhbHZlcyBvZiB0aGUgZ3VhcmQsIHNvIHRoZXkgY2Fubm90IGRyaWZ0IGFwYXJ0OiB7QGxpbmsgdG9DaGFuZ2Vsb2dFbnRyeX0gcmV3cml0ZXNcbiAqIGEgY29tbWl0IHdob3NlIHN1YmplY3QgbWF0Y2hlcyBpdCwgYW5kIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9IHJlZnVzZXMgYSBjaGFuZ2Vsb2cgbGluZVxuICogdGhhdCBzdGlsbCBkb2VzLiBUaGUgcmVmdXNhbCBpcyB0aGVyZWZvcmUgcmVhY2hhYmxlIG9ubHkgZm9yIGEgbWVyZ2UgdGhlIHJld3JpdGUgaGFkIG5vdGhpbmcgdG8gd29yayB3aXRoLlxuICovXG5jb25zdCBNRVJHRV9TVUJKRUNUX1JFR19FWFAgPSAvXk1lcmdlKD86IGJyYW5jaHwgcmVtb3RlLXRyYWNraW5nfCBwdWxsIHJlcXVlc3QpP1xcYi87XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHZlcnNpb24gdXBkYXRlcy5cbiAqXG4gKiBBbGlnbnMgd2l0aCBucG0ncyBgbnBtIHZlcnNpb25gIGluY3JlbWVudCB0eXBlcyBwbHVzIGBNYW51YWxgIGZvciBleHBsaWNpdCB2ZXJzaW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gVmVyc2lvblVwZGF0ZVR5cGUge1xuICBJbnZhbGlkID0gJ2ludmFsaWQnLFxuICBNYWpvciA9ICdtYWpvcicsXG4gIE1hbnVhbCA9ICdtYW51YWwnLFxuICBNaW5vciA9ICdtaW5vcicsXG4gIFBhdGNoID0gJ3BhdGNoJyxcbiAgUHJlTWFqb3IgPSAncHJlbWFqb3InLFxuICBQcmVNaW5vciA9ICdwcmVtaW5vcicsXG4gIFByZVBhdGNoID0gJ3ByZXBhdGNoJyxcbiAgUHJlUmVsZWFzZSA9ICdwcmVyZWxlYXNlJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlcyBhIGNhbGxlciBuYW1lcyBkaXJlY3RseSwga2V5ZWQgYnkgdGhlaXIgbmFtZSwgYXMgb3Bwb3NlZCB0byB0aGUgdHdvIGBnZXRWZXJzaW9uVXBkYXRlVHlwZWAgZGVyaXZlcy5cbiAqL1xuY29uc3QgTkFNRURfVkVSU0lPTl9VUERBVEVfVFlQRVMgPSBuZXcgTWFwPHN0cmluZywgVmVyc2lvblVwZGF0ZVR5cGU+KFtcbiAgVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IsXG4gIFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaCxcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWFqb3IsXG4gIFZlcnNpb25VcGRhdGVUeXBlLlByZU1pbm9yLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QcmVQYXRjaCxcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUHJlUmVsZWFzZVxuXS5tYXAoKHR5cGUpID0+IFt0eXBlLCB0eXBlXSkpO1xuXG4vKipcbiAqIFdoZXJlIGBIRUFEYCBzdG9vZCB3aGVuIGEgcmVsZWFzZSBzdGFydGVkOiB0aGUgYnJhbmNoIGl0IGlzIG9uIChlbXB0eSBmb3IgYSBkZXRhY2hlZCBgSEVBRGApIGFuZCBpdHMgY29tbWl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdEhlYWRTdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgY2hlY2tlZC1vdXQgYnJhbmNoLCBvciBhbiBlbXB0eSBzdHJpbmcgZm9yIGEgZGV0YWNoZWQgYEhFQURgLlxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXQgYEhFQURgIHBvaW50cyBhdC5cbiAgICovXG4gIHJlYWRvbmx5IHNoYTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBHaXQgdGFnIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIHVzZSBmb3IgdGhlIHRhZy5cbiAqIEBwYXJhbSBjb21taXRTaGEgLSBUaGUgY29tbWl0IHRvIHRhZy4gV2hlbiBvbWl0dGVkLCBgSEVBRGAgaXMgdGFnZ2VkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0YWcgaGFzIGJlZW4gY3JlYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEdpdFRhZyhuZXdWZXJzaW9uOiBzdHJpbmcsIGNvbW1pdFNoYT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCB0YWcgLWEgJHtuZXdWZXJzaW9ufSAtbSAke25ld1ZlcnNpb259IC0tZm9yY2Uke2NvbW1pdFNoYSA/IGAgJHtjb21taXRTaGF9YCA6ICcnfWAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gdGhlIEdpdCBzdGFnaW5nIGFyZWEgYW5kIGNvbW1pdHMgdGhlbSB3aXRoIHRoZSBuZXcgdmVyc2lvbiBtZXNzYWdlLlxuICpcbiAqIElmIHRoZSBjb21taXQgZmFpbHMgKGZvciBleGFtcGxlLCB0aGUgcHJlLWNvbW1pdCBob29rIHJlamVjdHMgYSBuZXcgd29yZCBpbiB0aGUgY2hhbmdlbG9nKSBhbmQgdGhlXG4gKiBwcm9jZXNzIGlzIGF0dGFjaGVkIHRvIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byBmaXggdGhlIGlzc3VlIChmb3IgZXhhbXBsZSxcbiAqIGFkZCB0aGUgbWlzc2luZyB3b3JkIHRvIGBjc3BlbGwuanNvbmApIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeS4gVGhlIHJldHJ5IHJlLXN0YWdlcyBhbGwgZmlsZXMsIHNvIHRoZVxuICogZml4IGlzIHBpY2tlZCB1cCB3aXRob3V0IHJlc3RhcnRpbmcgdGhlIHdob2xlIHJlbGVhc2UgbGlmZWN5Y2xlLiBJbiBhIG5vbi1pbnRlcmFjdGl2ZSBlbnZpcm9ubWVudCAobm9cbiAqIFRUWSwgc3VjaCBhcyBDSSksIHRoZSBlcnJvciBpcyByZS10aHJvd24gaW5zdGVhZCBvZiBwcm9tcHRpbmcsIHNvIHRoZSBzY3JpcHQgZmFpbHMgZmFzdCByYXRoZXIgdGhhblxuICogaGFuZ2luZy4gUGFzcyBgc2hvdWxkVmVyaWZ5Q29tbWl0OiBmYWxzZWAgdG8gc2tpcCB0aGUgcHJlLWNvbW1pdCBob29rIGVudGlyZWx5IGluIHN1Y2ggY2FzZXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNvbW1pdCBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIGFuZCBjb21taXR0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcblxuICBjb25zdCBjb21taXRBcmd1bWVudHMgPSBbJ2dpdCcsICdjb21taXQnLCAnLW0nLCBgY2hvcmU6IHJlbGVhc2UgJHtuZXdWZXJzaW9ufWAsICctLWFsbG93LWVtcHR5JywgLi4uKHNob3VsZFZlcmlmeUNvbW1pdCA/IFtdIDogWyctLW5vLXZlcmlmeSddKV07XG5cbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnYWRkJywgJy0tYWxsJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChjb21taXRBcmd1bWVudHMsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2ZXJzaW9uRGVidWdnZXIoXG4gICAgICAgIGBGYWlsZWQgdG8gY29tbWl0IHRoZSByZWxlYXNlLlxcbiR7ZXJyb3JUb1N0cmluZyhlcnJvcil9XFxuYFxuICAgICAgICAgICsgJ0ZpeCB0aGUgaXNzdWVzIChmb3IgZXhhbXBsZSwgYWRkIHRoZSBtaXNzaW5nIHdvcmQgdG8gY3NwZWxsLmpzb24pIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeSB0aGUgY29tbWl0LCBvciBDdHJsK0MgdG8gYWJvcnQuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oJ1ByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQuLi4nKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIEdpdEh1YiBDTEkgaXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0SHViQ2xpSW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggLS12ZXJzaW9uJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2NsaS5naXRodWIuY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIEdpdCBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgR2l0IGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydEdpdEluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0IGlzIG5vdCBpbnN0YWxsZWQuIFBsZWFzZSBpbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9naXQtc2NtLmNvbS8nKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgY2xlYW4sIG1lYW5pbmcgdGhlcmUgYXJlIG5vIHVuY29tbWl0dGVkIGNoYW5nZXMuXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0UmVwb0NsZWFuKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiAtLXVudHJhY2tlZC1maWxlcz1hbGwnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHN0ZG91dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi4gUGxlYXNlIGNvbW1pdCBvciBzdGFzaCB5b3VyIGNoYW5nZXMgYmVmb3JlIHJlbGVhc2luZyBhIG5ldyB2ZXJzaW9uLicpO1xuICB9XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBIRUFEYCBpcyB0aGUgcmVsZWFzZSBjb21taXQ6IG9uIHRoZSBicmFuY2ggdGhlIHJlbGVhc2Ugc3RhcnRlZCBvbiwgYSBzaW5nbGUgY29tbWl0IG9uIHRvcCBvZiB0aGVcbiAqIGNvbW1pdCBpdCBzdGFydGVkIGZyb20sIHdpdGggdGhlIGBjaG9yZTogcmVsZWFzZSA8dmVyc2lvbj5gIHN1YmplY3QuXG4gKlxuICogQSBzdWNjZXNzZnVsIGBnaXQgY29tbWl0YCBwcm92ZXMgb25seSB0aGF0IGEgY29tbWl0IHdhcyBtYWRlIHNvbWV3aGVyZS4gQSBjaGVja291dCBzd2l0Y2hlZCB1bmRlcm5lYXRoIGFcbiAqIHJlbGVhc2UgYnkgYW5vdGhlciBwcm9jZXNzIHRha2VzIHRoZSBjb21taXQgb250byB0aGF0IG90aGVyIGJyYW5jaCwgYW5kIHdoZW4gaXQgaXMgc3dpdGNoZWQgYmFjayB0aGUgdGFnIGFuZFxuICogdGhlIEdpdEh1YiByZWxlYXNlIGdvIG91dCBvbiB0aGUgY29tbWl0IGJlZm9yZSB0aGUgYnVtcCwgd2l0aCB0aGUgYnVtcCBsZWZ0IHN0YWdlZCBpbiB0aGUgd29ya2luZyB0cmVlIGFuZCBub3RoaW5nXG4gKiByZXBvcnRlZC4gU28gdGhlIHJlbGVhc2UgY2hlY2tzIHdoZXJlIHRoZSBjb21taXQgbGFuZGVkIGJlZm9yZSB0YWdnaW5nLCBhbmQgYWdhaW4gYmVmb3JlIHB1c2hpbmcuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgdmVyc2lvbiBiZWluZyByZWxlYXNlZC5cbiAqIEBwYXJhbSBzdGFydEhlYWQgLSBXaGVyZSBgSEVBRGAgc3Rvb2Qgd2hlbiB0aGUgcmVsZWFzZSBzdGFydGVkLlxuICogQHBhcmFtIHN0YWdlIC0gVGhlIHN0ZXAgYWJvdXQgdG8gcnVuLCBmb3IgdGhlIGVycm9yIG1lc3NhZ2UgKGZvciBleGFtcGxlIGB0YWdnaW5nYCkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWxlYXNlIGNvbW1pdCdzIFNIQS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydFJlbGVhc2VDb21taXRMYW5kZWQobmV3VmVyc2lvbjogc3RyaW5nLCBzdGFydEhlYWQ6IEdpdEhlYWRTdGF0ZSwgc3RhZ2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV4cGVjdGVkU3ViamVjdCA9IGBjaG9yZTogcmVsZWFzZSAke25ld1ZlcnNpb259YDtcbiAgY29uc3QgYnJhbmNoID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ2JyYW5jaCcsICctLXNob3ctY3VycmVudCddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IGhlYWRMb2dGaWVsZENvdW50ID0gMztcbiAgY29uc3QgaGVhZExvZyA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdsb2cnLCAnLTEnLCAnLS1mb3JtYXQ9JUglbiVQJW4lcyddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IFtzaGEgPSAnJywgcGFyZW50cyA9ICcnLCBzdWJqZWN0ID0gJyddID0gaGVhZExvZy5zcGxpdCgnXFxuJywgaGVhZExvZ0ZpZWxkQ291bnQpO1xuXG4gIGlmIChicmFuY2ggPT09IHN0YXJ0SGVhZC5icmFuY2ggJiYgcGFyZW50cyA9PT0gc3RhcnRIZWFkLnNoYSAmJiBzdWJqZWN0ID09PSBleHBlY3RlZFN1YmplY3QpIHtcbiAgICByZXR1cm4gc2hhO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBSZWZ1c2luZyB0byBjb250aW51ZSBiZWZvcmUgJHtzdGFnZX06IHRoZSByZWxlYXNlIGNvbW1pdCBmb3IgJHtuZXdWZXJzaW9ufSBpcyBub3Qgd2hlcmUgaXQgc2hvdWxkIGJlLiBgXG4gICAgICArIGBUaGUgcmVsZWFzZSBzdGFydGVkIG9uICR7ZGVzY3JpYmVCcmFuY2goc3RhcnRIZWFkLmJyYW5jaCl9IGF0ICR7c3RhcnRIZWFkLnNoYX0gYW5kIGV4cGVjdHMgYSAnJHtleHBlY3RlZFN1YmplY3R9JyBjb21taXQgb24gdG9wIG9mIGl0LCBgXG4gICAgICArIGBidXQgSEVBRCBpcyAke3NoYX0gKCcke3N1YmplY3R9JywgcGFyZW50ICR7cGFyZW50cyB8fCAnbm9uZSd9KSBvbiAke2Rlc2NyaWJlQnJhbmNoKGJyYW5jaCl9LiBgXG4gICAgICArICdTb21ldGhpbmcgZWxzZSBtb3ZlZCBIRUFEIGluIHRoaXMgd29ya2luZyB0cmVlIHdoaWxlIHRoZSByZWxlYXNlIHJhbiAoYSBjb25jdXJyZW50IGNoZWNrb3V0LCByZXNldCBvciBjb21taXQpLiAnXG4gICAgICArICdDaGVjayBgZ2l0IHJlZmxvZ2AgdG8gZmluZCB0aGUgcmVsZWFzZSBjb21taXQsIHB1dCBpdCBvbiB0aGUgcmVsZWFzZSBicmFuY2gsIGFuZCB0YWcgYW5kIHB1c2ggaXQgYnkgaGFuZC4nXG4gICk7XG59XG5cbi8qKlxuICogV3JhcHMgYW55IGJhcmUgYGh0dHAocyk6Ly9gIFVSTCBpbiB0aGUgZ2l2ZW4gdGV4dCBpbiBhbmdsZSBicmFja2V0cyAoYDx1cmw+YCkgc28gdGhhdCB0ZXh0IGVtaXR0ZWRcbiAqIGludG8gYSBNYXJrZG93biBkb2N1bWVudCAoc3VjaCBhcyBhIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgYnVsbGV0KSBwYXNzZXMgbWFya2Rvd25saW50J3NcbiAqIGBNRDAzNC9uby1iYXJlLXVybHNgIHJ1bGUgd2hpbGUgc3RpbGwgcmVuZGVyaW5nIGFzIGEgY2xpY2thYmxlIGF1dG9saW5rIG9uIEdpdEh1Yi5cbiAqXG4gKiBVUkxzIHRoYXQgYXJlIGFscmVhZHkgd3JhcHBlZCBpbiBhbmdsZSBicmFja2V0cyAoYDx1cmw+YCkgb3IgdGhhdCBmb3JtIHRoZSB0YXJnZXQgb2YgYSBNYXJrZG93blxuICogbGluayAoYFt0ZXh0XSh1cmwpYCkgYXJlIGxlZnQgdW50b3VjaGVkLCBzbyB0aGUgZnVuY3Rpb24gaXMgc2FmZSB0byBydW4gcmVwZWF0ZWRseS4gVHJhaWxpbmdcbiAqIHNlbnRlbmNlIHB1bmN0dWF0aW9uIChgLmAsIGAsYCwgYDtgLCBgOmAsIGAhYCwgYD9gKSBpcyBrZXB0IG91dHNpZGUgdGhlIGFuZ2xlIGJyYWNrZXRzIHNvIGl0IGRvZXNcbiAqIG5vdCBiZWNvbWUgcGFydCBvZiB0aGUgbGluay5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHBvc3NpYmx5IGNvbnRhaW5pbmcgYmFyZSBVUkxzLlxuICogQHJldHVybnMgVGhlIHRleHQgd2l0aCBldmVyeSBiYXJlIFVSTCB3cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXV0b2xpbmtCYXJlVXJscyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC8oPzwhWzxbKF0paHR0cHM/OlxcL1xcL1teXFxzPD4pXFxdXSsvZywgKHVybCkgPT4ge1xuICAgIGNvbnN0IHRyYWlsaW5nUHVuY3R1YXRpb24gPSAvWy4sOzohP10rJC8uZXhlYyh1cmwpPy5bMF0gPz8gJyc7XG4gICAgY29uc3QgYmFyZVVybCA9IHVybC5zbGljZSgwLCB1cmwubGVuZ3RoIC0gdHJhaWxpbmdQdW5jdHVhdGlvbi5sZW5ndGgpO1xuICAgIHJldHVybiBgPCR7YmFyZVVybH0+JHt0cmFpbGluZ1B1bmN0dWF0aW9ufWA7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG5ldyB2ZXJzaW9uIHN0cmluZyBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uIGFuZCB0aGUgc3BlY2lmaWVkIHVwZGF0ZSB0eXBlLlxuICpcbiAqIFVzZXMgdGhlIGBzZW12ZXJgIHBhY2thZ2UgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLCBzdXBwb3J0aW5nIGFsbCBucG0gaW5jcmVtZW50IHR5cGVzOlxuICogYG1ham9yYCwgYG1pbm9yYCwgYHBhdGNoYCwgYHByZW1ham9yYCwgYHByZW1pbm9yYCwgYHByZXBhdGNoYCwgYW5kIGBwcmVyZWxlYXNlYC5cbiAqIFByZS1yZWxlYXNlIHZlcnNpb25zIHVzZSB0aGUgYGJldGFgIGlkZW50aWZpZXIgYnkgZGVmYXVsdCAoZS5nLiwgYDEuMi40LWJldGEuMGApLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB0eXBlIG9mIHZlcnNpb24gdXBkYXRlIG9yIGFuIGV4cGxpY2l0IHZlcnNpb24gc3RyaW5nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHZlcnNpb24gc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgY3VycmVudCB2ZXJzaW9uIGlzIGludmFsaWQgb3IgdGhlIGluY3JlbWVudCBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHZlcnNpb25UeXBlID0gZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBpZiAodmVyc2lvblR5cGUgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbCkge1xuICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcGFja2FnZUpzb24udmVyc2lvbiA/PyAnJztcblxuICBjb25zdCByZWxlYXNlVHlwZSA9IHZlcnNpb25UeXBlIGFzIFJlbGVhc2VUeXBlO1xuICBjb25zdCBpc1ByZVJlbGVhc2VUeXBlID0gcmVsZWFzZVR5cGUuc3RhcnRzV2l0aCgncHJlJyk7XG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBpc1ByZVJlbGVhc2VUeXBlXG4gICAgPyBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlLCBERUZBVUxUX1BSRUlEKVxuICAgIDogaW5jKGN1cnJlbnRWZXJzaW9uLCByZWxlYXNlVHlwZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5ld1ZlcnNpb24sIGBGYWlsZWQgdG8gaW5jcmVtZW50IHZlcnNpb24gZnJvbSAnJHtjdXJyZW50VmVyc2lvbn0nIHdpdGggdHlwZSAnJHt2ZXJzaW9uVHlwZX0nYCk7XG5cbiAgcmV0dXJuIG5ld1ZlcnNpb247XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSByZWxlYXNlIG5vdGVzIGZvciBhIHNwZWNpZmljIHZlcnNpb24gZnJvbSB0aGUgY2hhbmdlbG9nLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3Igd2hpY2ggdG8gZ2V0IHRoZSByZWxlYXNlIG5vdGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmVsZWFzZSBub3RlcyBmb3IgdGhlIHNwZWNpZmllZCB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVsZWFzZU5vdGVzKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICBjb25zdCBzZWN0aW9uID0gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY29udGVudCwgbmV3VmVyc2lvbik7XG4gIGxldCByZWxlYXNlTm90ZXMgPSBzZWN0aW9uID8gYCR7c2VjdGlvbn1cXG5cXG5gIDogJyc7XG5cbiAgY29uc3QgdGFnT3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgdGFnIC0tc29ydD0tY3JlYXRvcmRhdGUnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHRhZ3MgPSB0YWdPdXRwdXQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgcHJldmlvdXNWZXJzaW9uID0gdGFnc1sxXTtcblxuICBjb25zdCByZXBvVXJsID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaCByZXBvIHZpZXcgLS1qc29uIHVybCAtcSAudXJsJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gIGNvbnN0IGNoYW5nZXNVcmwgPSBwcmV2aW91c1ZlcnNpb24gPyBgJHtyZXBvVXJsfS9jb21wYXJlLyR7cHJldmlvdXNWZXJzaW9ufS4uLiR7bmV3VmVyc2lvbn1gIDogYCR7cmVwb1VybH0vY29tbWl0cy8ke25ld1ZlcnNpb259YDtcblxuICByZWxlYXNlTm90ZXMgKz0gYCoqRnVsbCBDaGFuZ2Vsb2cqKjogJHtjaGFuZ2VzVXJsfWA7XG4gIHJldHVybiByZWxlYXNlTm90ZXM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgYFZlcnNpb25VcGRhdGVUeXBlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIGNvbnN0IG5hbWVkVmVyc2lvblVwZGF0ZVR5cGUgPSBOQU1FRF9WRVJTSU9OX1VQREFURV9UWVBFUy5nZXQodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBpZiAobmFtZWRWZXJzaW9uVXBkYXRlVHlwZSkge1xuICAgIHJldHVybiBuYW1lZFZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgcmV0dXJuIC9eXFxkK1xcLlxcZCtcXC5cXGQrKD86LVtcXHdcXGQuLV0rKT8kLy50ZXN0KHZlcnNpb25VcGRhdGVUeXBlKSA/IFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbCA6IFZlcnNpb25VcGRhdGVUeXBlLkludmFsaWQ7XG59XG5cbi8qKlxuICogUHVzaGVzIGNvbW1pdHMgYW5kIHRhZ3MgdG8gdGhlIHJlbW90ZSBHaXQgcmVwb3NpdG9yeS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHB1c2ggb3BlcmF0aW9uIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2l0UHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgcHVzaCAtLWZvbGxvdy10YWdzIC0tZm9yY2UnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgd2hlcmUgYEhFQURgIHN0YW5kcyBub3cuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY3VycmVudCB7QGxpbmsgR2l0SGVhZFN0YXRlfS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRHaXRIZWFkU3RhdGUoKTogUHJvbWlzZTxHaXRIZWFkU3RhdGU+IHtcbiAgY29uc3QgYnJhbmNoID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ2JyYW5jaCcsICctLXNob3ctY3VycmVudCddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHNoYSA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdyZXYtcGFyc2UnLCAnSEVBRCddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIHJldHVybiB7IGJyYW5jaCwgc2hhIH07XG59XG5cbi8qKlxuICogVGhlIGZsYWdzIHtAbGluayBwYXJzZVZlcnNpb25Bcmd1bWVudHN9IHJlY29nbml6ZXMsIGluIHRoZSBzaGFwZSBOb2RlJ3MgYHBhcnNlQXJnc2AgdGFrZXMuIEV4cG9ydGVkIHNvIGEgd3JhcHBlclxuICogdGhhdCBhZGRzIGZsYWdzIG9mIGl0cyBvd24gY2FuIHBhcnNlIHRoZW0gYWxsIGluIG9uZSBwYXNzIGFuZCBzdGlsbCByZWFkIHRoZXNlIHRocm91Z2hcbiAqIHtAbGluayB0b1VwZGF0ZVZlcnNpb25PcHRpb25zfS5cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OUyA9IHtcbiAgJ2NoYW5nZWxvZy1maWxlJzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAnY2hhbmdlbG9nLXN0eWxlJzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAnbm8tYnVpbGQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8tY2hhbmdlbG9nLWVkaXRpbmcnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8tY2hlY2tzJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8taXNzdWUtY2xvc2luZyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICduby1yZWxlYXNlJzogeyB0eXBlOiAnYm9vbGVhbicgfVxufSBhcyBjb25zdCBzYXRpc2ZpZXMgTm9uTnVsbGFibGU8UGFyc2VBcmdzQ29uZmlnWydvcHRpb25zJ10+O1xuXG4vKipcbiAqIFRoZSB2YWx1ZXMgYHBhcnNlQXJnc2AgcmVwb3J0cyBmb3Ige0BsaW5rIFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OU30uXG4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25Bcmd1bWVudFZhbHVlcyA9IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlQXJnczxWZXJzaW9uQXJndW1lbnRQYXJzZUNvbmZpZz4+Wyd2YWx1ZXMnXTtcblxuLyoqXG4gKiBBbiB1cGxvYWRlZCBhc3NldCByZXR1cm5lZCBieSBHaXRIdWIgQ0xJIGZvciBwdWJsaWNhdGlvbiB2ZXJpZmljYXRpb24uXG4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlQXNzZXRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgZG93bmxvYWRhYmxlIGZpbGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIEdpdEh1YidzIHVwbG9hZCBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlbGVhc2UgZmllbGRzIHJldHVybmVkIGJ5IEdpdEh1YiBDTEkgZm9yIHB1YmxpY2F0aW9uIHZlcmlmaWNhdGlvbi5cbiAqL1xuaW50ZXJmYWNlIEdpdEh1YlJlbGVhc2VNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBVcGxvYWRlZCBhc3NldHMuXG4gICAqL1xuICByZWFkb25seSBhc3NldHM6IHJlYWRvbmx5IEdpdEh1YlJlbGVhc2VBc3NldE1ldGFkYXRhW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByZWxlYXNlIHJlbWFpbnMgcHJpdmF0ZSBhcyBhIGRyYWZ0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNEcmFmdDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgR2l0SHViIG1hcmtzIGl0IGFzIGEgcHJlLXJlbGVhc2UuXG4gICAqL1xuICByZWFkb25seSBpc1ByZXJlbGVhc2U6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgZXhhY3QgdGFnIHVzZXJzIHdpbGwgZG93bmxvYWQuXG4gICAqL1xuICByZWFkb25seSB0YWdOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIGlzc3VlIHJlZmVyZW5jZSBhIGNvbW1pdCBib2R5IG5hbWVzLCBhcyB7QGxpbmsgcGFyc2VJc3N1ZVJlZmVyZW5jZUxpbmV9IHJlYWRzIGl0LlxuICovXG5pbnRlcmZhY2UgSXNzdWVSZWZlcmVuY2Uge1xuICAvKipcbiAgICogSG93IHRoZSBjaGFuZ2Vsb2cgbGluZSBzaG93cyBpdDogYCNuYCBmb3IgYSBiYXJlIG51bWJlciwgdGhlIGlzc3VlIFVSTCBpbiBhbmdsZSBicmFja2V0cyBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSByZW5kZXJlZDogc3RyaW5nO1xuICAvKipcbiAgICogRXZlcnkgd2F5IGEgbGluZSB0aGF0IGFscmVhZHkgc2hvd3MgaXQgbWF5IHNwZWxsIGl0OiBgI25gLCBvciBgb3duZXIvcmVwbyNuYCBhbmQgdGhlIGlzc3VlIFVSTC5cbiAgICovXG4gIHJlYWRvbmx5IHNwZWxsaW5nczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIGBwYXJzZUFyZ3NgIGNvbmZpZ3VyYXRpb24ge0BsaW5rIFZlcnNpb25Bcmd1bWVudFZhbHVlc30gaXMgZGVyaXZlZCBmcm9tLlxuICovXG5pbnRlcmZhY2UgVmVyc2lvbkFyZ3VtZW50UGFyc2VDb25maWcge1xuICAvKipcbiAgICogVGhlIHJlY29nbml6ZWQgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiB0eXBlb2YgVkVSU0lPTl9BUkdVTUVOVF9PUFRJT05TO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB2ZXJzaW9uIGlzIGEgcHJlLXJlbGVhc2UsIHN1Y2ggYXMgYDEuMi40LWJldGEuMGAuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgaXQgY2FycmllcyBhIHByZS1yZWxlYXNlIHBhcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByZVJlbGVhc2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmVyZWxlYXNlKHZlcnNpb24pICE9PSBudWxsO1xufVxuLyoqXG4gKiBQYXJzZXMgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUgaW50byBhIHZlcnNpb24gdXBkYXRlIHR5cGUgYW5kXG4gKiB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9LlxuICpcbiAqIEVhY2ggYmVoYXZpb3IgaXMgZW5hYmxlZCBieSBkZWZhdWx0OyB0aGUgY29ycmVzcG9uZGluZyBgLS1uby0qYCBmbGFnIHR1cm5zIGl0IG9mZi4gYC0tY2hhbmdlbG9nLWZpbGVgIHRha2VzIGFcbiAqIHZhbHVlIGluc3RlYWQgYW5kIGhhcyBubyBkZWZhdWx0LiBSZWNvZ25pemVkIGZsYWdzOlxuICogLSBgLS1jaGFuZ2Vsb2ctZmlsZT08cGF0aD5gIOKAlCB1c2UgdGhpcyBmaWxlJ3MgY29udGVudHMgYXMgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24gaW5zdGVhZCBvZlxuICogICB0aGUgY29tbWl0LWRlcml2ZWQgYnVsbGV0cywgYW5kIHNraXAgdGhlIGludGVyYWN0aXZlIHJldmlldyBlbnRpcmVseS5cbiAqIC0gYC0tY2hhbmdlbG9nLXN0eWxlPTxncm91cGVkfGNvbW1pdHM+YCDigJQgaG93IHRoZSBjb21taXQtZGVyaXZlZCBzZWN0aW9uIGlzIGxhaWQgb3V0IChkZWZhdWx0IGBncm91cGVkYCkuXG4gKiAtIGAtLW5vLWJ1aWxkYCDigJQgc2tpcCB0aGUgYnVpbGQgc3RlcCAob25seSBzYWZlIHdoZW4gdGhlIGJ1aWxkIG91dHB1dCBhbHJlYWR5IG1hdGNoZXMgdGhlIGN1cnJlbnQgY29kZSkuXG4gKiAtIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCDigJQgZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyB3aXRob3V0IG9wZW5pbmcgaXQgZm9yIG1hbnVhbCByZXZpZXcuXG4gKiAtIGAtLW5vLWNoZWNrc2Ag4oCUIHNraXAgdGhlIGNsZWFuLXJlcG8gY2hlY2ssIGZvcm1hdCwgc3BlbGxjaGVjaywgbGludCwgb3Zlci1leHBvc3VyZSBhbmFseXNpcywgYW5kIHRlc3RzICh0aGUgYnVpbGQgc3RpbGwgcnVucykuXG4gKiAtIGAtLW5vLWNvbW1pdC12ZXJpZmljYXRpb25gIOKAlCBwYXNzIGAtLW5vLXZlcmlmeWAgdG8gdGhlIHJlbGVhc2UgY29tbWl0LCBza2lwcGluZyB0aGUgcHJlLWNvbW1pdCBob29rLlxuICogLSBgLS1uby1pc3N1ZS1jbG9zaW5nYCDigJQgZG8gbm90IGNsb3NlIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2FycmllcyBvbmNlIGl0IGlzIHB1Ymxpc2hlZC5cbiAqIC0gYC0tbm8tcmVsZWFzZWAg4oCUIHJ1biBhbGwgbG9jYWwgc3RlcHMgYnV0IHNraXAgdGhlIHB1c2ggYW5kIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHBhcnNlICh0eXBpY2FsbHkgYHByb2Nlc3MuYXJndi5zbGljZSgyKWApLlxuICogQHJldHVybnMgVGhlIHtAbGluayBQYXJzZWRWZXJzaW9uQXJndW1lbnRzfSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFuZCB0aGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvbkFyZ3VtZW50cygkYXJndW1lbnRzOiBzdHJpbmdbXSk6IFBhcnNlZFZlcnNpb25Bcmd1bWVudHMge1xuICBjb25zdCB7IHBvc2l0aW9uYWxzLCB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgYXJnc2AgaXMgdGhlIG9wdGlvbiBuYW1lIE5vZGUncyBgcGFyc2VBcmdzYCByZWFkcy5cbiAgICBhcmdzOiAkYXJndW1lbnRzLFxuICAgIG9wdGlvbnM6IFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OU1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG9wdGlvbnM6IHRvVXBkYXRlVmVyc2lvbk9wdGlvbnModmFsdWVzKSxcbiAgICB2ZXJzaW9uVXBkYXRlVHlwZTogcG9zaXRpb25hbHNbMF1cbiAgfTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZSBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIENyZWF0ZXMgdGhlIHJlbGVhc2UgYW5kIGF0dGFjaGVzIHRoZSBmaWxlcyB7QGxpbmsgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zLmdldFJlbGVhc2VBc3NldFBhdGhzfSBuYW1lcy5cbiAqXG4gKiBPbmNlIHRoZSByZWxlYXNlIGV4aXN0cywgdGhlIGlzc3VlcyBpdCBjYXJyaWVzIGFyZSBjbG9zZWQgd2l0aCBhIGxpbmsgdG8gaXQgKHNlZSB7QGxpbmsgY2xvc2VSZWxlYXNlZElzc3Vlc30pLFxuICogdW5sZXNzIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlc30gaXMgYGZhbHNlYC4gQSBmYWlsdXJlIHRoZXJlIGlzIHJlcG9ydGVkIGFuZFxuICogZG9lcyBub3QgZmFpbCB0aGUgcmVsZWFzZSwgd2hpY2ggaXMgYWxyZWFkeSBwdWJsaXNoZWQuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB0aGUgcmVsZWFzZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWxlYXNlIGhhcyBiZWVuIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBnZXRSZWxlYXNlQXNzZXRQYXRocyA9IGdldE5wbVBhY2tSZWxlYXNlQXNzZXRQYXRocywgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlcyA9IHRydWUsIHNob3VsZFZlcmlmeVJlbGVhc2UgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgcmVzb2x2ZVJlbGVhc2VBc3NldFBhdGhzKGdldFJlbGVhc2VBc3NldFBhdGhzLCBzaG91bGRWZXJpZnlSZWxlYXNlKTtcblxuICBhd2FpdCBleGVjRnJvbVJvb3QoW1xuICAgICdnaCcsXG4gICAgJ3JlbGVhc2UnLFxuICAgICdjcmVhdGUnLFxuICAgIG5ld1ZlcnNpb24sXG4gICAgLi4uZmlsZVBhdGhzLFxuICAgICctLXRpdGxlJyxcbiAgICBgdiR7bmV3VmVyc2lvbn1gLFxuICAgIC4uLihzaG91bGRWZXJpZnlSZWxlYXNlID8gWyctLXZlcmlmeS10YWcnXSA6IFtdKSxcbiAgICAuLi4oaXNQcmVSZWxlYXNlKG5ld1ZlcnNpb24pID8gWyctLXByZXJlbGVhc2UnXSA6IFtdKSxcbiAgICAnLS1ub3Rlcy1maWxlJyxcbiAgICAnLSdcbiAgXSwge1xuICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgc3RkaW46IGF3YWl0IGdldFJlbGVhc2VOb3RlcyhuZXdWZXJzaW9uKVxuICB9KTtcblxuICBpZiAoc2hvdWxkVmVyaWZ5UmVsZWFzZSkge1xuICAgIGF3YWl0IHZlcmlmeUdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbiwgZmlsZVBhdGhzKTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGNsb3NlUmVsZWFzZWRJc3N1ZXNTYWZlbHkobmV3VmVyc2lvbiwgdHJ1ZSk7XG59XG5cbi8qKlxuICogTWFwcyB0aGUgdmFsdWVzIGBwYXJzZUFyZ3NgIHJlcG9ydHMgZm9yIHtAbGluayBWRVJTSU9OX0FSR1VNRU5UX09QVElPTlN9IG9udG8ge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfS5cbiAqXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIHBhcnNlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVXBkYXRlVmVyc2lvbk9wdGlvbnModmFsdWVzOiBWZXJzaW9uQXJndW1lbnRWYWx1ZXMpOiBVcGRhdGVWZXJzaW9uT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGg6IHZhbHVlc1snY2hhbmdlbG9nLWZpbGUnXSxcbiAgICBjaGFuZ2Vsb2dTdHlsZTogdG9DaGFuZ2Vsb2dTdHlsZSh2YWx1ZXNbJ2NoYW5nZWxvZy1zdHlsZSddKSxcbiAgICBzaG91bGRCdWlsZDogISh2YWx1ZXNbJ25vLWJ1aWxkJ10gPz8gZmFsc2UpLFxuICAgIHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM6ICEodmFsdWVzWyduby1pc3N1ZS1jbG9zaW5nJ10gPz8gZmFsc2UpLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2c6ICEodmFsdWVzWyduby1jaGFuZ2Vsb2ctZWRpdGluZyddID8/IGZhbHNlKSxcbiAgICBzaG91bGRSZWxlYXNlOiAhKHZhbHVlc1snbm8tcmVsZWFzZSddID8/IGZhbHNlKSxcbiAgICBzaG91bGRSdW5DaGVja3M6ICEodmFsdWVzWyduby1jaGVja3MnXSA/PyBmYWxzZSksXG4gICAgc2hvdWxkVmVyaWZ5Q29tbWl0OiAhKHZhbHVlc1snbm8tY29tbWl0LXZlcmlmaWNhdGlvbiddID8/IGZhbHNlKVxuICB9O1xufVxuLyoqXG4gKiBVcGRhdGVzIHRoZSBjaGFuZ2Vsb2cgZmlsZSB3aXRoIG5ldyB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBjb21taXQgbWVzc2FnZXMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgY3VycmVudCBjaGFuZ2Vsb2csIGFwcGVuZHMgbmV3IGVudHJpZXMgZm9yIHRoZSBsYXRlc3QgdmVyc2lvbixcbiAqIGFuZCBwcm9tcHRzIHRoZSB1c2VyIHRvIHJldmlldyB0aGUgY2hhbmdlcy5cbiAqXG4gKiBUaGUgcmV2aWV3IGhhcHBlbnMgb24gYSBzY3JhdGNoIGNvcHkgaW4gdGhlIE9TIHRlbXBvcmFyeSBmb2xkZXIsIGFuZCB0aGUgcmVwb3NpdG9yeSdzIG93blxuICogYENIQU5HRUxPRy5tZGAgaXMgd3JpdHRlbiBvbmx5IG9uY2UgdGhlIHJldmlldyBpcyBvdmVyIOKAlCBzbyBpbnRlcnJ1cHRpbmcgdGhlIHJldmlldyBsZWF2ZXMgdGhlXG4gKiByZXBvc2l0b3J5IHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGNoYW5nZWxvZy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zfSBjb250cm9sbGluZyB0aGUgY2hhbmdlbG9nIHJldmlldyBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2hhbmdlbG9nIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3cml0ZUNoYW5nZWxvZyhhd2FpdCBwcmVwYXJlQ2hhbmdlbG9nKG5ld1ZlcnNpb24sIG9wdGlvbnMpKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIHNlcmllcyBvZiB0YXNrcyB0byBoYW5kbGUgdmVyc2lvbiB1cGRhdGVzOlxuICogMS4gVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogMi4gQ2hlY2tzIGlmIEdpdCBhbmQgR2l0SHViIENMSSBhcmUgaW5zdGFsbGVkLlxuICogMy4gVmVyaWZpZXMgdGhhdCB0aGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldywgaWYgb25lIGlzIGR1ZSwgY2FuIGFjdHVhbGx5IGJlIGFuc3dlcmVkLlxuICogNC4gVmVyaWZpZXMgdGhhdCB0aGUgYnVtcCBpcyBub3QgbG93ZXIgdGhhbiB0aGUgY29tbWl0cyBzaW5jZSB0aGUgbGFzdCB0YWcgZm9yY2UgaXQgdG8gYmUuXG4gKiA1LiBWZXJpZmllcyB0aGF0IHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbi5cbiAqIDYuIFJ1bnMgc3BlbGxjaGVjayBhbmQgbGludGluZy5cbiAqIDcuIEJ1aWxkcyB0aGUgcHJvamVjdC5cbiAqIDguIFNldHRsZXMgdGhlIGNoYW5nZWxvZyDigJQgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhIGh1bWFuLCBhbmQgZGVsaWJlcmF0ZWx5IHRoZSBsYXN0IG9uZSBiZWZvcmVcbiAqICAgIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIGFuIGludGVycnVwdCBoZXJlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGNsZWFuIGFuZCB0aGUgcmVsZWFzZSByZS1ydW5uYWJsZS5cbiAqICAgIFRoZSBzZXR0bGVkIHRleHQgaXMgbGludGVkIGhlcmUgdG9vOiBgbGludDptZGAgcmFuIGluIHN0ZXAgNiwgYmVmb3JlIGEgY2hhcmFjdGVyIG9mIGl0IGV4aXN0ZWQuXG4gKiA5LiBVcGRhdGVzIHZlcnNpb24gaW4gZmlsZXMgKGFuZCBpbiB3aGF0ZXZlciB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnMudXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlc30gYWRkcyksIHRoZW5cbiAqICAgIHdyaXRlcyB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cuXG4gKiAxMC4gQWRkcyB1cGRhdGVkIGZpbGVzIHRvIEdpdCwgdGFncyB0aGUgY29tbWl0LCBhbmQgcHVzaGVzIHRvIHRoZSByZXBvc2l0b3J5LlxuICogMTEuIFByZXBhcmVzIGFuZCBwdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZS5cbiAqIDEyLiBDbG9zZXMgdGhlIGlzc3VlcyB0aGUgcmVsZWFzZSBjYXJyaWVzLCB3aXRoIGEgbGluayB0byBpdC5cbiAqXG4gKiBXaXRoIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9ucy5zaG91bGRQdWJsaXNoQmVmb3JlUHVzaH0sIHByZXBhcmF0aW9uIGFuZCBhc3NldCB2YWxpZGF0aW9uIHByZWNlZGVcbiAqIHRoZSB0YWcgcHVzaC4gUHVibGljYXRpb24gYW5kIHZlcmlmaWNhdGlvbiB0aGVuIHByZWNlZGUgdGhlIGJyYW5jaCBwdXNoLCBhbmQgaXNzdWUgY2xvc2luZyByZW1haW5zIGxhc3QuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgdG8gcGVyZm9ybSAobWFqb3IsIG1pbm9yLCBwYXRjaCwgcHJlbWFqb3IsIHByZW1pbm9yLCBwcmVwYXRjaCwgcHJlcmVsZWFzZSwgb3IgeC55LnpbLXN1ZmZpeF0pLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBjb250cm9sbGluZyB0aGUgcmVsZWFzZSBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmVyc2lvbiB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlPzogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2Vsb2dGaWxlUGF0aCxcbiAgICBjaGFuZ2Vsb2dTdHlsZSxcbiAgICBnZXRSZWxlYXNlQXNzZXRQYXRocyA9IGdldE5wbVBhY2tSZWxlYXNlQXNzZXRQYXRocyxcbiAgICBwcmVwYXJlR2l0SHViUmVsZWFzZSxcbiAgICBzaG91bGRCdWlsZCA9IHRydWUsXG4gICAgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlcyA9IHRydWUsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWUsXG4gICAgc2hvdWxkUHVibGlzaEJlZm9yZVB1c2ggPSBmYWxzZSxcbiAgICBzaG91bGRSZWxlYXNlID0gdHJ1ZSxcbiAgICBzaG91bGRSdW5DaGVja3MgPSB0cnVlLFxuICAgIHNob3VsZFZlcmlmeUNvbW1pdCA9IHRydWUsXG4gICAgdXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlc1xuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIXZlcnNpb25VcGRhdGVUeXBlKSB7XG4gICAgY29uc3QgbnBtT2xkVmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fb2xkX3ZlcnNpb24nXTtcbiAgICBjb25zdCBucG1OZXdWZXJzaW9uID0gcHJvY2Vzcy5lbnZbJ25wbV9uZXdfdmVyc2lvbiddO1xuXG4gICAgaWYgKG5wbU9sZFZlcnNpb24gJiYgbnBtTmV3VmVyc2lvbikge1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobnBtT2xkVmVyc2lvbik7XG4gICAgICBhd2FpdCB1cGRhdGVWZXJzaW9uKG5wbU5ld1ZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignTm8gdmVyc2lvbiB1cGRhdGUgdHlwZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBhd2FpdCBhc3NlcnRHaXRJbnN0YWxsZWQoKTtcbiAgYXdhaXQgYXNzZXJ0R2l0SHViQ2xpSW5zdGFsbGVkKCk7XG4gIC8vIENoZWNrZWQgaGVyZSwgYmVmb3JlIHRoZSBjaGVja3MgYW5kIHRoZSBidWlsZCwgcmF0aGVyIHRoYW4gYXQgdGhlIGNoYW5nZWxvZyBzdGVwIGl0c2VsZjogYSBub24taW50ZXJhY3RpdmVcbiAgLy8gY2FsbGVyIGxlYXJucyBpbiBzZWNvbmRzIGluc3RlYWQgb2YgcGF5aW5nIGZvciB0aGUgd2hvbGUgcHJlZmxpZ2h0IGFuZCBvbmx5IHRoZW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yXG4gIC8vIHdpbmRvdyBub2JvZHkgd2lsbCBldmVyIGNsb3NlLlxuICBhc3NlcnRDaGFuZ2Vsb2dTdGVwSXNOb25CbG9ja2luZyhjaGFuZ2Vsb2dGaWxlUGF0aCwgc2hvdWxkRWRpdENoYW5nZWxvZyk7XG4gIC8vIFNhbWUgcGxhY2VtZW50LCBzYW1lIHJlYXNvbi4gRGVsaWJlcmF0ZWx5IE5PVCB1bmRlciBgc2hvdWxkUnVuQ2hlY2tzYDogdGhhdCBmbGFnIGJ1eXMgYSBmYXN0IHJlbGVhc2UgYnlcbiAgLy8gc2tpcHBpbmcgdGhlIFZFUklGSUNBVElPTiBvZiB0aGUgY29kZSwgYW5kIHRoaXMgaXMgYSBjb3JyZWN0bmVzcyBnYXRlIG9uIHRoZSByZWxlYXNlIGl0c2VsZiDigJQgdGhlIGJ1bXBcbiAgLy8gYSBgLS1uby1jaGVja3NgIHJlbGVhc2Ugc2hpcHMgaXMgYXMgcHVibGljLCBhbmQgYXMgdW5maXhhYmxlIGFmdGVyd2FyZHMsIGFzIGFueSBvdGhlci5cbiAgYXdhaXQgYXNzZXJ0VmVyc2lvblVwZGF0ZVR5cGVNZWV0c0J1bXBGbG9vcih2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIC8vIFNhbWUgcGxhY2VtZW50LCBzYW1lIHJlYXNvbjogYSBjaGFuZ2Vsb2cgc2VjdGlvbiBub2JvZHkgd2lsbCByZXZpZXcgaXMgZnVsbHkga25vd24gYmVmb3JlIHRoZSBnYXRlLCBhbmQgYSBzdWJqZWN0IGl0XG4gIC8vIGZhaWxzIG9uIGlzIGFscmVhZHkgcHVzaGVkLCBzbyBsZWFybmluZyB0aGF0IGFmdGVyIHRoZSBwcmVmbGlnaHQgb25seSBjb3N0cyB0aGUgcHJlZmxpZ2h0LlxuICBhd2FpdCBhc3NlcnROb25JbnRlcmFjdGl2ZUNoYW5nZWxvZ0lzUHVibGlzaGFibGUodmVyc2lvblVwZGF0ZVR5cGUsIHsgY2hhbmdlbG9nRmlsZVBhdGgsIGNoYW5nZWxvZ1N0eWxlLCBzaG91bGRFZGl0Q2hhbmdlbG9nIH0pO1xuXG4gIGlmIChzaG91bGRSdW5DaGVja3MpIHtcbiAgICBhd2FpdCBhc3NlcnRHaXRSZXBvQ2xlYW4oKTtcbiAgfVxuXG4gIC8vIFJlYWQgYmVmb3JlIHRoZSBnYXRlLCBzbyBhIGNoZWNrb3V0IHN3aXRjaGVkIGF0IGFueSBwb2ludCBvZiB0aGUgcmVsZWFzZSBpcyBjYXVnaHQgYWZ0ZXIgdGhlIGNvbW1pdC5cbiAgY29uc3Qgc3RhcnRIZWFkID0gYXdhaXQgcmVhZEdpdEhlYWRTdGF0ZSgpO1xuXG4gIC8vIFRoZSByZXN0IG9mIHRoZSBwcmVmbGlnaHQgSVMgYG5wbSBydW4gZ2F0ZWAsIG5vdCBhIGNvcHkgb2YgaXQ6IGEgY2hlY2sgYWRkZWQgdG8gdGhlIGdhdGUgaXMgcmVhY2hhYmxlXG4gIC8vIGZyb20gdGhlIGJyYW5jaCBhbmQgZnJvbSB0aGUgcmVsZWFzZSBieSBjb25zdHJ1Y3Rpb24sIGluc3RlYWQgb2YgYnkgdHdvIGxpc3RzIGhhcHBlbmluZyB0byBhZ3JlZS5cbiAgLy8gVGhlIGNsZWFuLXJlcG8gYXNzZXJ0aW9uIGFib3ZlIHN0YXlzIGhlcmUsIGJlY2F1c2UgdGhlIGdhdGUgaXMgcnVuIG9uIGEgZGlydHkgdHJlZSBvbiBwdXJwb3NlLlxuICAvLyBUaGUgYnVpbGQgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHB1Ymxpc2hpbmcsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjaywgc28gaXQgcnVucyB1bmxlc3MgYHNob3VsZEJ1aWxkYCBpcyBgZmFsc2VgIOKAlCB0aGlzIGtlZXBzIHRoZSByZWxlYXNlZCBhcnRpZmFjdHMgaW4gc3luYyB3aXRoIHRoZSBjdXJyZW50IGNvZGUgZXZlbiBvbiBhIGZhc3QgcmVsZWFzZS5cbiAgYXdhaXQgZ2F0ZSh7XG4gICAgc2hvdWxkQnVpbGQsXG4gICAgc2hvdWxkUnVuQ2hlY2tzLFxuICAgIHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHM6IHRydWVcbiAgfSk7XG5cbiAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGUpO1xuXG4gIC8vIFRoZSBjaGFuZ2Vsb2cgaXMgc2V0dGxlZCBCRUZPUkUgYW55dGhpbmcgaXMgd3JpdHRlbiwgYmVjYXVzZSB0aGlzIGlzIHRoZSBvbmx5IHN0ZXAgdGhhdCBjYW4gYmxvY2sgb24gYVxuICAvLyBodW1hbi4gSW50ZXJydXB0aW5nIGl0IHRoZXJlZm9yZSBsZWF2ZXMgdGhlIHdvcmtpbmcgdHJlZSBwcmlzdGluZSBhbmQgdGhlIHdob2xlIHJlbGVhc2UgcmUtcnVubmFibGUsXG4gIC8vIGluc3RlYWQgb2Ygc3RyYW5kaW5nIGEgYnVtcGVkLWJ1dC11bmNvbW1pdHRlZCB0cmVlIHRoYXQgYGFzc2VydEdpdFJlcG9DbGVhbmAgdGhlbiByZWZ1c2VzIHRvIHJlLXJlbGVhc2UuXG4gIGNvbnN0IG5ld0NoYW5nZUxvZyA9IGF3YWl0IHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbiwge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIGNoYW5nZWxvZ1N0eWxlLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2dcbiAgfSk7XG5cbiAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbik7XG4gIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkV4dHJhRmlsZXM/LihuZXdWZXJzaW9uKTtcblxuICBhd2FpdCB3cml0ZUNoYW5nZWxvZyhuZXdDaGFuZ2VMb2cpO1xuICBhd2FpdCBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uLCB7IHNob3VsZFZlcmlmeUNvbW1pdCB9KTtcbiAgLy8gVGhlIHRhZyBuYW1lcyB0aGUgdmVyaWZpZWQgY29tbWl0IHJhdGhlciB0aGFuIHdoYXRldmVyIGBIRUFEYCBpcyBieSB0aGUgdGltZSBgZ2l0IHRhZ2AgcnVucy5cbiAgY29uc3QgcmVsZWFzZUNvbW1pdFNoYSA9IGF3YWl0IGFzc2VydFJlbGVhc2VDb21taXRMYW5kZWQobmV3VmVyc2lvbiwgc3RhcnRIZWFkLCAndGFnZ2luZycpO1xuICBhd2FpdCBhZGRHaXRUYWcobmV3VmVyc2lvbiwgcmVsZWFzZUNvbW1pdFNoYSk7XG5cbiAgaWYgKCFzaG91bGRSZWxlYXNlKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKSgnU2tpcHBpbmcgZ2l0IHB1c2ggYW5kIEdpdEh1YiByZWxlYXNlICgtLW5vLXJlbGVhc2UpLiBUaGUgdmVyc2lvbiBidW1wLCBjaGFuZ2Vsb2csIGNvbW1pdCwgYW5kIHRhZyBoYXZlIGJlZW4gY3JlYXRlZCBsb2NhbGx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRQdWJsaXNoQmVmb3JlUHVzaCkge1xuICAgIGF3YWl0IHByZXBhcmVHaXRIdWJSZWxlYXNlPy4obmV3VmVyc2lvbik7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgcmVzb2x2ZVJlbGVhc2VBc3NldFBhdGhzKGdldFJlbGVhc2VBc3NldFBhdGhzLCB0cnVlKTtcbiAgICBhd2FpdCBhc3NlcnRSZWxlYXNlQ29tbWl0TGFuZGVkKG5ld1ZlcnNpb24sIHN0YXJ0SGVhZCwgJ3B1c2hpbmcnKTtcbiAgICBjb25zdCB0YWdDb21taXRTaGEgPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAncmV2LXBhcnNlJywgYHJlZnMvdGFncy8ke25ld1ZlcnNpb259Xnt9YF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBpZiAodGFnQ29tbWl0U2hhICE9PSByZWxlYXNlQ29tbWl0U2hhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZnVzaW5nIHRvIHB1c2ggJHtuZXdWZXJzaW9ufTogaXRzIHRhZyBubyBsb25nZXIgbmFtZXMgdGhlIHZlcmlmaWVkIHJlbGVhc2UgY29tbWl0LmApO1xuICAgIH1cbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAncHVzaCcsICdvcmlnaW4nLCBgcmVmcy90YWdzLyR7bmV3VmVyc2lvbn06cmVmcy90YWdzLyR7bmV3VmVyc2lvbn1gXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGF3YWl0IHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb24sIHtcbiAgICAgIGdldFJlbGVhc2VBc3NldFBhdGhzOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmlsZVBhdGhzKSxcbiAgICAgIHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM6IGZhbHNlLFxuICAgICAgc2hvdWxkVmVyaWZ5UmVsZWFzZTogdHJ1ZVxuICAgIH0pO1xuICAgIGF3YWl0IGFzc2VydFJlbGVhc2VDb21taXRMYW5kZWQobmV3VmVyc2lvbiwgc3RhcnRIZWFkLCAncHVzaGluZycpO1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdwdXNoJywgJ29yaWdpbicsIGAke3JlbGVhc2VDb21taXRTaGF9OnJlZnMvaGVhZHMvJHtzdGFydEhlYWQuYnJhbmNofWBdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgYXdhaXQgY2xvc2VSZWxlYXNlZElzc3Vlc1NhZmVseShuZXdWZXJzaW9uLCBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBhc3NlcnRSZWxlYXNlQ29tbWl0TGFuZGVkKG5ld1ZlcnNpb24sIHN0YXJ0SGVhZCwgJ3B1c2hpbmcnKTtcbiAgYXdhaXQgZ2l0UHVzaCgpO1xuICBhd2FpdCBwcmVwYXJlR2l0SHViUmVsZWFzZT8uKG5ld1ZlcnNpb24pO1xuICBhd2FpdCBwdWJsaXNoR2l0SHViUmVsZWFzZShuZXdWZXJzaW9uLCB7IGdldFJlbGVhc2VBc3NldFBhdGhzLCBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gaW4gYHBhY2thZ2UuanNvbmAgYW5kLCB3aGVyZSB0aGV5IGV4aXN0LCBgcGFja2FnZS1sb2NrLmpzb25gIGFuZCBgbnBtLXNocmlua3dyYXAuanNvbmAuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gc3RyaW5nIHRvIHVwZGF0ZSBpbiB0aGUgZmlsZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBlZGl0UGFja2FnZUpzb24oKHBhY2thZ2VKc29uKSA9PiB7XG4gICAgcGFja2FnZUpzb24udmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gIH0pO1xuXG4gIGF3YWl0IGVkaXRQYWNrYWdlTG9ja0pzb24odXBkYXRlLCB7IHNob3VsZFNraXBJZk1pc3Npbmc6IHRydWUgfSk7XG4gIGF3YWl0IGVkaXROcG1TaHJpbmtXcmFwSnNvbih1cGRhdGUsIHsgc2hvdWxkU2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcblxuICBmdW5jdGlvbiB1cGRhdGUocGFja2FnZUxvY2tKc29uOiBQYWNrYWdlTG9ja0pzb24pOiB2b2lkIHtcbiAgICBwYWNrYWdlTG9ja0pzb24udmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgY29uc3QgZGVmYXVsdFBhY2thZ2UgPSBwYWNrYWdlTG9ja0pzb24ucGFja2FnZXM/LlsnJ107XG4gICAgaWYgKGRlZmF1bHRQYWNrYWdlKSB7XG4gICAgICBkZWZhdWx0UGFja2FnZS52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgdG8gZW5zdXJlIGl0IGlzIGVpdGhlciBhIHJlY29nbml6ZWQgdHlwZVxuICogb3IgYSB2YWxpZCBtYW51YWwgdmVyc2lvbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgdG8gdmFsaWRhdGUuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGlzIGludmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZSh2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZSkgPT09IFZlcnNpb25VcGRhdGVUeXBlLkludmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnSW52YWxpZCB2ZXJzaW9uIHVwZGF0ZSB0eXBlLiBQbGVhc2UgdXNlIFxcJ21ham9yXFwnLCBcXCdtaW5vclxcJywgXFwncGF0Y2hcXCcsIFxcJ3ByZW1ham9yXFwnLCBcXCdwcmVtaW5vclxcJywgXFwncHJlcGF0Y2hcXCcsIFxcJ3ByZXJlbGVhc2VcXCcsIG9yIFxcJ3gueS56Wy1zdWZmaXhdXFwnIGZvcm1hdC4nXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZnVzZXMgYSBjaGFuZ2Vsb2cgd2hvc2UgTkVXIHNlY3Rpb24gbWF0Y2hlcyBvbmUgb2YgdGhlIG1haW50YWluZXIncyBvd24gdW5wdWJsaXNoZWQgZm9yYmlkZGVuIHBhdHRlcm5zLlxuICpcbiAqIEV2ZXJ5IGNvbW1pdCBzdWJqZWN0IHNpbmNlIHRoZSBsYXN0IHRhZyBzaGlwcyB2ZXJiYXRpbSBpbnRvIHRoZSBuZXcgc2VjdGlvbiwgc28gYSBzdWJqZWN0IHRoYXQgY2Fycmllc1xuICogdm9jYWJ1bGFyeSBwcml2YXRlIHRvIHRoZSBtYWludGFpbmVyIOKAlCBhbiBpbnRlcm5hbCB0cmFja2VyIGlkLCBhIHByaXZhdGUgcHJvamVjdCBzaG9ydCBuYW1lIOKAlCBsYW5kcyBpbiBhXG4gKiBjaGVja2VkLWluLCBwdWJsaXNoZWQgZmlsZSBpbnNpZGUgdGhlIHJlbGVhc2UgY29tbWl0LCB3aGVyZSBub3RoaW5nIGV2ZXIgbG9va3MgYXQgaXQgYWdhaW4uIFRoZSBsaXN0IG9mIHdoYXRcbiAqIGNvdW50cyBhcyBwcml2YXRlIGNhbm5vdCBsaXZlIGluIHRoaXMgbGlicmFyeSBvciBpbiB0aGUgcmVwb3NpdG9yeSB3aXRob3V0IHB1Ymxpc2hpbmcgdGhlIHZlcnkgdGhpbmcgaXRcbiAqIHByb3RlY3RzLCBzbyBpdCBjb21lcyBmcm9tIHRoZSBmaWxlIHtAbGluayBGT1JCSURERU5fUEFUVEVSTlNfRklMRV9FTlZfVkFSSUFCTEV9IG5hbWVzLCBhbmQgdGhpcyBpcyBhIG5vLW9wXG4gKiB3aGVyZXZlciB0aGF0IGlzIG5vdCBjb25maWd1cmVkLlxuICpcbiAqIExpa2Uge0BsaW5rIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0c30sIG9ubHkgdGhlIHNlY3Rpb24gYmVpbmcgcHVibGlzaGVkIGlzIHNjYW5uZWQsIGFuZCB0aGUgdGhyb3dcbiAqIGNvbWVzIGJlZm9yZSBhbnl0aGluZyBpcyB3cml0dGVuLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIHZlcnNpb24gd2hvc2Ugc2VjdGlvbiBpcyBhYm91dCB0byBiZSBwdWJsaXNoZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNlY3Rpb24gaXMgY2xlYW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydENoYW5nZWxvZ0hhc05vRm9yYmlkZGVuUGF0dGVybnMoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGF0dGVybnMgPSBhd2FpdCByZWFkRm9yYmlkZGVuUGF0dGVybnMoKTtcbiAgY29uc3QgbWF0Y2hlcyA9IGZpbmRGb3JiaWRkZW5QYXR0ZXJuTWF0Y2hlcyhleHRyYWN0Q2hhbmdlbG9nU2VjdGlvbihjaGFuZ2Vsb2dDb250ZW50LCB2ZXJzaW9uKSwgcGF0dGVybnMpO1xuXG4gIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVGhlICR7dmVyc2lvbn0gc2VjdGlvbiBvZiAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gbWF0Y2hlcyBhIHBhdHRlcm4gZnJvbSB0aGUgZmlsZWBcbiAgICAgICsgYCAke0ZPUkJJRERFTl9QQVRURVJOU19GSUxFX0VOVl9WQVJJQUJMRX0gbmFtZXM6XFxuYFxuICAgICAgKyBgJHttYXRjaGVzLm1hcCgoeyBsaW5lLCBtYXRjaCB9KSA9PiBgJHtsaW5lfSAgICA8LSAke21hdGNofWApLmpvaW4oJ1xcbicpfVxcbmBcbiAgICAgICsgJ05vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB5ZXQuIFN1cHBseSByZWxlYXNlIG5vdGVzIHRoYXQgc2F5IHRoZSBzYW1lIHRoaW5nIHdpdGhvdXQgaXQsIHdpdGgnXG4gICAgICArICcgYC0tY2hhbmdlbG9nLWZpbGUgPHBhdGg+YCwgb3IgcmVtb3ZlIGl0IGF0IHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcsIGFuZCByZS1ydW4gdGhlIHJlbGVhc2UuJ1xuICApO1xufVxuXG4vKipcbiAqIFJlZnVzZXMgYSBjaGFuZ2Vsb2cgd2hvc2UgTkVXIHNlY3Rpb24gc3RpbGwgY2FycmllcyBhbiBlbnRyeSB0aGF0IHJlYWRzIGFzIGEgbWVyZ2Ugc3ViamVjdCBnaXQgd3JvdGUgaXRzZWxmLlxuICpcbiAqIFRoZSBjb252ZW50aW9uIHRoaXMgZW5mb3JjZXMgaXMgdGhhdCBhIG5vbi1mZiBtZXJnZSB0YWtlcyB0aGUgc2FtZSBDb252ZW50aW9uYWwtQ29tbWl0cyBzdWJqZWN0IGFzIHRoZSBicmFuY2hcbiAqIGNvbW1pdCBpdCBsYW5kcy4gTm90aGluZyB1c2VkIHRvIGhvbGQgaXQ6IGZvciBhIG5vbi1mZiBtZXJnZSB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCBpcyB0aGUgbWVyZ2UgY29tbWl0LCBzbyBhXG4gKiBkZWZhdWx0IHN1YmplY3Qgc2hpcHMgdmVyYmF0aW0sIHB1Ymxpc2hpbmcgYSBiYXJlIGJyYW5jaCBuYW1lIChgTWVyZ2UgYnJhbmNoICdmaXgtdGhlLXRoaW5nJ2ApIGFzIGEgY2hhbmdlbG9nXG4gKiBlbnRyeSDigJQgd2hpY2ggc2F5cyBub3RoaW5nIGFib3V0IHdoYXQgY2hhbmdlZCwgYW5kIG9uIGEgYnJhbmNoIG5hbWVkIGFmdGVyIGEgcHJpdmF0ZSB0cmFja2VyIGl0ZW0gZGVjb2RlcyB0b1xuICogbm90aGluZyBhdCBhbGwgZm9yIGEgcmVhZGVyLiBUaGUgaW50ZXJhY3RpdmUgcmV2aWV3IHdhcyB0aGUgZGUgZmFjdG8gY2F0Y2gsIGFuZCBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2AsIHRoZVxuICogZmxhZyBhbiB1bmF0dGVuZGVkIHJlbGVhc2UgYWN0dWFsbHkgdXNlcywgc2tpcHMgaXQ7IG9uZSBzd2VlcCBhY3Jvc3MgdGhpcyB3b3Jrc3BhY2UgZm91bmQgdHdlbHZlIHN1Y2hcbiAqIHB1Ymxpc2hlZCBlbnRyaWVzIGluIGEgc2luZ2xlIHJlcG9zaXRvcnkuXG4gKlxuICogT25seSB0aGUgc2VjdGlvbiBiZWluZyBwdWJsaXNoZWQgaXMgc2Nhbm5lZCwgc28gYW4gZW50cnkgYWxyZWFkeSBzaGlwcGVkIHVuZGVyIGFuIG9sZGVyIHZlcnNpb24gY2Fubm90IGJsb2NrXG4gKiBldmVyeSBmdXR1cmUgcmVsZWFzZS4ge0BsaW5rIHRvQ2hhbmdlbG9nRW50cnl9IGhhcyBhbHJlYWR5IHJld3JpdHRlbiBldmVyeSBtZXJnZSB0aGF0IGhhZCBhIGJvZHkgdG8gcmV3cml0ZVxuICogZnJvbSwgc28gd2hhdCByZWFjaGVzIGhlcmUgaXMgYSBtZXJnZSB3aG9zZSBhdXRob3Igd3JvdGUgbm90aGluZyBhdCBhbGwg4oCUIHdoaWNoIG5vIHJld3JpdGUgY2FuIGludmVudCwgYW5kXG4gKiB3aGljaCBpcyB0aGVyZWZvcmUgd29ydGggc3RvcHBpbmcgdGhlIHJlbGVhc2UgZm9yLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIHZlcnNpb24gd2hvc2Ugc2VjdGlvbiBpcyBhYm91dCB0byBiZSBwdWJsaXNoZWQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0cyhjaGFuZ2Vsb2dDb250ZW50OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBCVUxMRVRfUkVHX0VYUCA9IC9eLSAvO1xuICBjb25zdCBvZmZlbmRpbmdFbnRyaWVzID0gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbilcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbHRlcigobGluZSkgPT4gTUVSR0VfU1VCSkVDVF9SRUdfRVhQLnRlc3QobGluZS5yZXBsYWNlKEJVTExFVF9SRUdfRVhQLCAnJykpKTtcblxuICBpZiAob2ZmZW5kaW5nRW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFRoZSAke3ZlcnNpb259IHNlY3Rpb24gb2YgJHtSZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGNhcnJpZXMgYSBtZXJnZSBzdWJqZWN0IGdpdCB3cm90ZSBpdHNlbGY6XFxuYFxuICAgICAgKyBgJHtvZmZlbmRpbmdFbnRyaWVzLmpvaW4oJ1xcbicpfVxcbmBcbiAgICAgICsgJ1N1Y2ggYW4gZW50cnkgcHVibGlzaGVzIGEgYnJhbmNoIG5hbWUgaW5zdGVhZCBvZiBzYXlpbmcgd2hhdCBzaGlwcGVkLiBHaXZlIHRoZSBtZXJnZSBjb21taXQgdGhlIHNhbWUnXG4gICAgICArICcgc3ViamVjdCBhcyB0aGUgYnJhbmNoIGNvbW1pdCBpdCBsYW5kcyAoYGdpdCBjb21taXQgLS1hbWVuZGAgb24gdGhlIG1lcmdlLCB0aGVuIHJlLXJ1biB0aGUgcmVsZWFzZSksIG9yJ1xuICAgICAgKyAnIHN1cHBseSB0aGUgcmVsZWFzZSBub3RlcyB5b3Vyc2VsZiB3aXRoIGAtLWNoYW5nZWxvZy1maWxlIDxwYXRoPmAuJ1xuICApO1xufVxuXG4vKipcbiAqIFJlZnVzZXMgYSByZWxlYXNlIHRoYXQgd291bGQgaGF2ZSB0byBzdG9wIGF0IHRoZSBpbnRlcmFjdGl2ZSBjaGFuZ2Vsb2cgcmV2aWV3IHdpdGggbm9ib2R5IHRoZXJlIHRvXG4gKiBmaW5pc2ggaXQuIENhbGxlZCBmcm9tIHRoZSBwcmVmbGlnaHQgc28gdGhlIHJlZnVzYWwgY29zdHMgc2Vjb25kcywgbm90IHRoZSB3aG9sZSBjaGVjay1hbmQtYnVpbGQgZ2F0ZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nRmlsZVBhdGggLSBUaGUgcGF0aCB0byB0aGUgcHJlcGFyZWQgcmVsZWFzZSBub3Rlcywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub25lLlxuICogQHBhcmFtIHNob3VsZEVkaXRDaGFuZ2Vsb2cgLSBXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIGlzIG1lYW50IHRvIGJlIHJldmlld2VkIGludGVyYWN0aXZlbHkuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydENoYW5nZWxvZ1N0ZXBJc05vbkJsb2NraW5nKGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNob3VsZEVkaXRDaGFuZ2Vsb2c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGNoYW5nZWxvZ0ZpbGVQYXRoICE9PSB1bmRlZmluZWQgfHwgIXNob3VsZEVkaXRDaGFuZ2Vsb2cgfHwgcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnVGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcgbmVlZHMgYSB0ZXJtaW5hbCwgYW5kIHRoaXMgcHJvY2VzcyBoYXMgbm9uZSwgc28gdGhlIHJlbGVhc2Ugd291bGQgYmxvY2sgZm9yZXZlci4nXG4gICAgICArICcgUGFzcyBgLS1jaGFuZ2Vsb2ctZmlsZSA8cGF0aD5gIHRvIHN1cHBseSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzLCBvciBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2AgdG8gYWNjZXB0IHRoZSdcbiAgICAgICsgJyBjaGFuZ2Vsb2cgZ2VuZXJhdGVkIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlcyBhcyBpcy4nXG4gICk7XG59XG5cbi8qKlxuICogUnVucyB0aGUgY2hlY2tzIHtAbGluayBwcmVwYXJlQ2hhbmdlbG9nfSBydW5zIG9uIGEgY2hhbmdlbG9nIG5vYm9keSB3aWxsIHJldmlldywgYmVmb3JlIHRoZSBnYXRlIHJhdGhlciB0aGFuXG4gKiBhZnRlciBpdC5cbiAqXG4gKiBXaXRob3V0IGFuIGludGVyYWN0aXZlIHJldmlldyAoYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgLCBvciBgLS1jaGFuZ2Vsb2ctZmlsZWApLCB0aGUgbmV3IHNlY3Rpb24gaXMgZnVsbHkgZGVjaWRlZFxuICogYnkgd2hhdCBpcyBhbHJlYWR5IGNvbW1pdHRlZCwgc28gZXZlcnkgY2hlY2sgYHByZXBhcmVDaGFuZ2Vsb2dgIHdvdWxkIHRocm93IG9uIGNhbiBiZSBhbnN3ZXJlZCBpbiBzZWNvbmRzLiBBXG4gKiByZWxlYXNlIG9uY2UgcGFzc2VkIGl0cyB3aG9sZSAyNS1taW51dGUgcHJlZmxpZ2h0IGFuZCB3YXMgdGhlbiByZWZ1c2VkIGJ5IGBsaW50Om1kYCBvdmVyIGEgcHVzaGVkIGNvbW1pdCBzdWJqZWN0XG4gKiBpdCBjb3VsZCBoYXZlIG5hbWVkIGF0IHRoZSBzdGFydC4gV2l0aCBhIHJldmlldyBkdWUsIG5vdGhpbmcgaXMgY2hlY2tlZCBoZXJlLCBiZWNhdXNlIHRoZSBhdXRob3IgY2FuIHN0aWxsIGZpeFxuICogYSBmaW5kaW5nIGluIHRoZSBlZGl0b3IuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHJlcXVlc3RlZCB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBXaGVyZSB0aGUgc2VjdGlvbiBib2R5IGNvbWVzIGZyb20gYW5kIHdoZXRoZXIgdGhlIGludGVyYWN0aXZlIHJldmlldyB3YXMgYXNrZWQgZm9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZWN0aW9uIHdvdWxkIHBhc3MsIGFuZCByZWplY3RzIG5hbWluZyB3aGF0IGl0IGZhaWxzIG9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnROb25JbnRlcmFjdGl2ZUNoYW5nZWxvZ0lzUHVibGlzaGFibGUodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZywgb3B0aW9uczogVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGNoYW5nZWxvZ0ZpbGVQYXRoLCBjaGFuZ2Vsb2dTdHlsZSwgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWUgfSA9IG9wdGlvbnM7XG4gIGlmIChpc0NoYW5nZWxvZ1Jldmlld0R1ZShjaGFuZ2Vsb2dGaWxlUGF0aCwgc2hvdWxkRWRpdENoYW5nZWxvZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGNvbnN0IGNoYW5nZWxvZyA9IGF3YWl0IGNvbXBvc2VDaGFuZ2Vsb2dOb2JvZHlSZXZpZXdzKG5ld1ZlcnNpb24sIGNoYW5nZWxvZ0ZpbGVQYXRoLCBjaGFuZ2Vsb2dTdHlsZSk7XG4gIGNvbnN0IGZpbmRpbmdzID0gYXdhaXQgZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzKGNoYW5nZWxvZywgbmV3VmVyc2lvbik7XG4gIGlmIChmaW5kaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzLCBuZXdWZXJzaW9uKTtcbiAgfVxuXG4gIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0cyhjaGFuZ2Vsb2csIG5ld1ZlcnNpb24pO1xuICBhd2FpdCBhc3NlcnRDaGFuZ2Vsb2dIYXNOb0ZvcmJpZGRlblBhdHRlcm5zKGNoYW5nZWxvZywgbmV3VmVyc2lvbik7XG59XG5cbi8qKlxuICogUmVmdXNlcyBhIHJlbGVhc2Ugd2hvc2UgYnVtcCBpcyBMT1dFUiB0aGFuIHRoZSBjb21taXRzIGl0IGlzIGFib3V0IHRvIHB1Ymxpc2ggZm9yY2UgaXQgdG8gYmUuXG4gKlxuICogVGhlIHJ1bGUgdGhpcyBlbmZvcmNlcyBpcyBvbGQgYW5kIHdhcyB3cml0dGVuIGRvd24gYWZ0ZXIgYDk2LjUuMWAgc2hpcHBlZCBzaXggdW5yZWxlYXNlZCBgZmVhdDpgIGNvbW1pdHMgYXNcbiAqIGEgcGF0Y2g6IGNob29zZSB0aGUgYnVtcCBmcm9tIHRoZSB3aG9sZSByYW5nZSBzaW5jZSB0aGUgbGFzdCB0YWcsIG5ldmVyIGZyb20gdGhlIGNoYW5nZSB5b3UgaGFwcGVuIHRvIGJlXG4gKiB3b3JraW5nIG9uLiBJdCBkaWQgbm90IGhvbGQg4oCUIGAxMDUuMS4wYCBvZiB0aGlzIGxpYnJhcnkgaXMgYSBNSU5PUiBjYXJyeWluZyBgZmVhdCh2aXRlc3QtY29uZmlnKSFgLCBzbyBldmVyeVxuICogY29uc3VtZXIgb24gYSBjYXJldCByYW5nZSB0b29rIGEgYnJlYWtpbmcgY2hhbmdlIHdpdGggbm8gdmVyc2lvbiBzaWduYWwg4oCUIGFuZCBpdCBjb3VsZCBub3QgaG9sZCwgYmVjYXVzZSBpdFxuICogYXNrZWQgYSBodW1hbiB0byBzY2FuIGEgcmFuZ2UgYW5kIHRoZW4gdHlwZSBhIGJ1bXAgdGhhdCBub3RoaW5nIGNvbXBhcmVkIGFnYWluc3Qgd2hhdCB0aGUgc2NhbiB3b3VsZCBoYXZlXG4gKiBmb3VuZC4gVGhpcyBpcyB0aGF0IGNvbXBhcmlzb24sIGF0IHRoZSBvbmUgbW9tZW50IHRoZSBydWxlIGlzIGJlaW5nIGJyb2tlbi5cbiAqXG4gKiBJdCByZWZ1c2VzIG9ubHkgYSBidW1wIHRoYXQgaXMgdG9vIExPVy4gQSBkZWxpYmVyYXRlbHkgaGlnaGVyIG9uZSDigJQgYSBtYWpvciBjdXQgdG8gc2lnbmFsIGEgYnJlYWsgbGF0ZSwgYVxuICogbWlub3IgZm9yIGEgcmFuZ2Ugb2YgcHVyZSBgZml4YGVzIOKAlCBwYXNzZXMgdW50b3VjaGVkLCBhbmQgdGhlcmUgaXMgbm8gZmxhZyB0byBzd2l0Y2ggdGhlIGdhdGUgb2ZmOiBhblxuICogb3B0LW91dCBpcyB3aGF0IGdldHMgcmVhY2hlZCBmb3IgcmVmbGV4aXZlbHksIGFuZCB0aGUgbGVnaXRpbWF0ZSBlc2NhcGUgKGJ1bXAgaGlnaGVyKSBhbHJlYWR5IGV4aXN0cy5cbiAqXG4gKiBDYWxsZWQgZnJvbSB0aGUgcHJlZmxpZ2h0IHJhdGhlciB0aGFuIGF0IHRoZSBidW1wIGl0c2VsZiwgc28gYSByZWZ1c2FsIGNvc3RzIHNlY29uZHMgaW5zdGVhZCBvZiB0aGUgd2hvbGVcbiAqIGNoZWNrLWFuZC1idWlsZCBnYXRlLCBhbmQgbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHdoZW4gaXQgdGhyb3dzLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRoZSByZWxlYXNlIHdhcyBhc2tlZCBmb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydFZlcnNpb25VcGRhdGVUeXBlTWVldHNCdW1wRmxvb3IodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2ZXJzaW9uRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpO1xuICBjb25zdCBsYXN0VGFnID0gYXdhaXQgcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhhd2FpdCByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpKTtcblxuICAvLyBObyBiYXNlbGluZSwgbm8gcmFuZ2UsIG5vIGZsb29yLiBUaGlzIGlzIGEgZmlyc3QgcmVsZWFzZSwgb3Igb25lIHdob3NlIHByZXZpb3VzIHRhZyB3YXMgZGVsZXRlZCDigJQgdGhlXG4gIC8vIGNoYW5nZWxvZyBzdGVwIGZhbGxzIGJhY2sgdG8gdGhlIGZ1bGwgaGlzdG9yeSB0aGVyZSwgYW5kIGRlcml2aW5nIGEgZmxvb3IgZnJvbSB0aGUgZnVsbCBoaXN0b3J5IG9mIGEgcmVwb1xuICAvLyBhYm91dCB0byBjdXQgYDEuMC4wYCB3b3VsZCByZWZ1c2UgaXQgb3ZlciBjb21taXRzIHRoYXQgcHJlZGF0ZSB0aGUgY29uY2VwdCBvZiBhIHB1Ymxpc2hlZCBzdXJmYWNlLlxuICBpZiAoIWxhc3RUYWcpIHtcbiAgICB2ZXJzaW9uRGVidWdnZXIoJ05vIHByZXZpb3VzIHJlbGVhc2UgdGFnIHJlc29sdmVkLCBzbyB0aGUgYnVtcCBmbG9vciBpcyBub3QgZGVyaXZlZC4gVGhlIGJ1bXAgaXMgdGFrZW4gYXMgZ2l2ZW4uJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYnVtcEZsb29yID0gYXdhaXQgZ2V0QnVtcEZsb29yKGAke2xhc3RUYWd9Li5IRUFEYCk7XG4gIGNvbnN0IGZsb29yTGV2ZWwgPSBidW1wRmxvb3IubGV2ZWw7XG4gIGlmIChmbG9vckxldmVsID09PSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgY29uc3QgdGFrZW5MZXZlbCA9IHRvRWZmZWN0aXZlQnVtcExldmVsKGxhc3RUYWcsIG5ld1ZlcnNpb24pO1xuXG4gIC8vIEFuIHVucGFyc2FibGUgYmFzZWxpbmUgb3IgdGFyZ2V0IGlzIG5vdCB0aGlzIGdhdGUncyBidXNpbmVzcyB0byBmYWlsIGEgcmVsZWFzZSBvdmVyLiBJdCBjYW4gb25seSBoYXBwZW5cbiAgLy8gZm9yIGEgdGFnIHRoYXQgaXMgbm90IGEgdmVyc2lvbiBhdCBhbGwsIHdoaWNoIGV2ZXJ5IG90aGVyIHN0ZXAgaGVyZSB3b3VsZCBoYXZlIGl0cyBvd24gdHJvdWJsZSB3aXRoLlxuICBpZiAoIXRha2VuTGV2ZWwpIHtcbiAgICB2ZXJzaW9uRGVidWdnZXIoYENvdWxkIG5vdCBjb21wYXJlICcke25ld1ZlcnNpb259JyBhZ2FpbnN0IHRoZSBwcmV2aW91cyB0YWcgJyR7bGFzdFRhZ30nLCBzbyB0aGUgYnVtcCBmbG9vciBpcyBub3QgZW5mb3JjZWQuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQnVtcExldmVsQXRMZWFzdCh0YWtlbkxldmVsLCBmbG9vckxldmVsKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IHRvQnVtcEZsb29yRXJyb3IoYnVtcEZsb29yLCB7XG4gICAgbGFzdFRhZyxcbiAgICBuZXdWZXJzaW9uLFxuICAgIHRha2VuTGV2ZWwsXG4gICAgdmVyc2lvblVwZGF0ZVR5cGVcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwb3J0cyBpc3N1ZS1jbG9zaW5nIGZhaWx1cmVzIHdpdGhvdXQgZmFpbGluZyBhbiBhbHJlYWR5IHB1Ymxpc2hlZCByZWxlYXNlLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIHdob3NlIGlzc3VlcyBzaG91bGQgY2xvc2UuXG4gKiBAcGFyYW0gc2hvdWxkQ2xvc2UgLSBXaGV0aGVyIHRvIGNsb3NlIHRoZSBpc3N1ZXMgYWZ0ZXIgc3VjY2Vzc2Z1bCBkZWxpdmVyeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xvc2VSZWxlYXNlZElzc3Vlc1NhZmVseShuZXdWZXJzaW9uOiBzdHJpbmcsIHNob3VsZENsb3NlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghc2hvdWxkQ2xvc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBjbG9zZVJlbGVhc2VkSXNzdWVzKHsgbmV3VmVyc2lvbiB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFRoZSAke25ld1ZlcnNpb259IHJlbGVhc2UgaXMgcHVibGlzaGVkLCBidXQgY2xvc2luZyB0aGUgaXNzdWVzIGl0IGNhcnJpZXMgZmFpbGVkOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogQ29tcG9zZXMgdGhlIG5ldyBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IOKAlCB0aGUgbmV3IHNlY3Rpb24gZnJvbSB0aGUgY29tbWl0cyBzaW5jZSB0aGUgbGFzdCB0YWcsIG9yIGZyb20gdGhlXG4gKiBwcmVwYXJlZCBub3RlcywgYWJvdmUgdGhlIHByZXZpb3VzIHNlY3Rpb25zIOKAlCB3aXRob3V0IHJldmlld2luZywgY2hlY2tpbmcgb3Igd3JpdGluZyBpdC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdGhlIGNoYW5nZWxvZyBzZWN0aW9uIGlzIHdyaXR0ZW4gZm9yLlxuICogQHBhcmFtIGNoYW5nZWxvZ0ZpbGVQYXRoIC0gVGhlIHByZXBhcmVkIG5vdGVzLCB3aGVuIHRoZSByZWxlYXNlIHdhcyBnaXZlbiB0aGVtLlxuICogQHBhcmFtIGNoYW5nZWxvZ1N0eWxlIC0gSG93IGEgc2VjdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzIGlzIGxhaWQgb3V0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcG9zZWQgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcG9zZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNoYW5nZWxvZ1N0eWxlOiBDaGFuZ2Vsb2dTdHlsZSA9ICdncm91cGVkJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHByZXZpb3VzQ2hhbmdlbG9nTGluZXMgPSBhd2FpdCByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpO1xuXG4gIGxldCBuZXdDaGFuZ2VMb2cgPSBgIyBDSEFOR0VMT0dcXG5cXG4jIyAke25ld1ZlcnNpb259XFxuXFxuYDtcblxuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGxhc3RUYWcgPSBhd2FpdCByZXNvbHZlTGFzdFJlbGVhc2VkVGFnKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMpO1xuICAgIGNvbnN0IGNvbW1pdFJhbmdlID0gbGFzdFRhZyA/IGAke2xhc3RUYWd9Li5IRUFEYCA6ICdIRUFEJztcbiAgICBjb25zdCBjb21taXRNZXNzYWdlc1N0cmluZyA9IGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IGxvZyAke2NvbW1pdFJhbmdlfSAtLWZvcm1hdD0lQiAtLWZpcnN0LXBhcmVudCAtemAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBjb25zdCBjb21taXRNZXNzYWdlcyA9IGNvbW1pdE1lc3NhZ2VzU3RyaW5nLnNwbGl0KCdcXDAnKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAoY2hhbmdlbG9nU3R5bGUgPT09ICdncm91cGVkJykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAke3JlbmRlckdyb3VwZWRDaGFuZ2Vsb2dTZWN0aW9uKGNvbW1pdE1lc3NhZ2VzLm1hcCgoY29tbWl0TWVzc2FnZSkgPT4gdG9DaGFuZ2Vsb2dDb21taXRFbnRyeShjb21taXRNZXNzYWdlKSkpfVxcbmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgY29tbWl0TWVzc2FnZSBvZiBjb21taXRNZXNzYWdlcykge1xuICAgICAgICBuZXdDaGFuZ2VMb2cgKz0gYC0gJHthdXRvbGlua0JhcmVVcmxzKHRvQ2hhbmdlbG9nRW50cnkoY29tbWl0TWVzc2FnZSkpfVxcbmA7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByZXBhcmVkTm90ZXMgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgbmV3Q2hhbmdlTG9nICs9IGAke3JlcGxhY2VBbGwoeyAkc3RyaW5nOiBwcmVwYXJlZE5vdGVzLCByZXBsYWNlcjogJ1xcbicsIHNlYXJjaFZhbHVlOiAnXFxyXFxuJyB9KS50cmltKCl9XFxuYDtcbiAgfVxuXG4gIGlmIChwcmV2aW91c0NoYW5nZWxvZ0xpbmVzLmxlbmd0aCA+IDApIHtcbiAgICBuZXdDaGFuZ2VMb2cgKz0gJ1xcbic7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMpIHtcbiAgICAgIG5ld0NoYW5nZUxvZyArPSBgJHtsaW5lfVxcbmA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0NoYW5nZUxvZztcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0aGUgbmV3IGBDSEFOR0VMT0cubWRgIGNvbnRlbnQgZm9yIGEgcmVsZWFzZSBub2JvZHkgcmV2aWV3cywgYXBwbHlpbmcgYGxpbnQ6bWQ6Zml4YCdzIGZpeGVzIHRvIGEgc2VjdGlvblxuICogZ2VuZXJhdGVkIGZyb20gY29tbWl0IHN1YmplY3RzLlxuICpcbiAqIEEgc3ViamVjdCBjYW4gZmFpbCBgbGludDptZGAgd2l0aG91dCBhbnlvbmUgaGF2aW5nIGhhZCB0aGUgY2hhbmNlIHRvIGZpeCBpdDogYSBgLS1uby1mZmAgbWVyZ2UgaXMgbWFkZSB3aXRoXG4gKiBgSFVTS1k9MGAsIHNvIGNvbW1pdGxpbnQgbmV2ZXIgc2VlcyBpdCwgYW5kIGFuIGlzc3VlLWNsb3NpbmcgbWVyZ2UgdGFrZXMgdGhlIGlzc3VlIHRpdGxlIHZlcmJhdGltLiBBbiBPYnNpZGlhblxuICogcGx1Z2luJ3Mgc3ViamVjdCBuYW1pbmcgdGhlIHBsdWdpbiB3aXRob3V0IGJhY2t0aWNrcyBzdG9wcGVkIGEgcmVsZWFzZSB0aGF0IHdheSB0aHJlZSB0aW1lcywgYWZ0ZXIgdGhlIHdob2xlXG4gKiBwcmVmbGlnaHQuIFdoYXRldmVyIHRoZSByZXBvc2l0b3J5J3MgY29uZmlndXJhdGlvbiBjYW4gZml4IGlzIGZpeGVkIGhlcmUsIGFuZCB3aGF0IGl0IGNhbm5vdCBpcyBzdGlsbCByZWZ1c2VkIGJ5XG4gKiB0aGUgZmluZGluZ3MgY2hlY2sgdGhhdCBmb2xsb3dzLiBQcmVwYXJlZCBub3RlcyBhcmUgdGhlIGF1dGhvcidzIHJldmlld2VkIHRleHQsIHNvIHRoZXkgYXJlIG5ldmVyIHJld3JpdHRlbiwgYW5kXG4gKiBvbmx5IHRoZSBuZXcgc2VjdGlvbiBpcyB0b3VjaGVkLCBuZXZlciBhIHB1Ymxpc2hlZCBvbmUuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRoZSBjaGFuZ2Vsb2cgc2VjdGlvbiBpcyB3cml0dGVuIGZvci5cbiAqIEBwYXJhbSBjaGFuZ2Vsb2dGaWxlUGF0aCAtIFRoZSBwcmVwYXJlZCBub3Rlcywgd2hlbiB0aGUgcmVsZWFzZSB3YXMgZ2l2ZW4gdGhlbS5cbiAqIEBwYXJhbSBjaGFuZ2Vsb2dTdHlsZSAtIEhvdyBhIHNlY3Rpb24gZ2VuZXJhdGVkIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlcyBpcyBsYWlkIG91dC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbXBvc2VkIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbXBvc2VDaGFuZ2Vsb2dOb2JvZHlSZXZpZXdzKFxuICBuZXdWZXJzaW9uOiBzdHJpbmcsXG4gIGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNoYW5nZWxvZ1N0eWxlOiBDaGFuZ2Vsb2dTdHlsZSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlbG9nID0gYXdhaXQgY29tcG9zZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCBjaGFuZ2Vsb2dGaWxlUGF0aCwgY2hhbmdlbG9nU3R5bGUpO1xuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjaGFuZ2Vsb2c7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbigpO1xuICBpZiAoIU9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pLmluY2x1ZGVzKExJTlRfTURfU0NSSVBUX05BTUUpKSB7XG4gICAgcmV0dXJuIGNoYW5nZWxvZztcbiAgfVxuXG4gIGNvbnN0IHNlY3Rpb24gPSBleHRyYWN0Q2hhbmdlbG9nU2VjdGlvbihjaGFuZ2Vsb2csIG5ld1ZlcnNpb24pO1xuICBjb25zdCB7IGNvbnRlbnQsIGZpeENvdW50IH0gPSBhd2FpdCBmaXhNYXJrZG93bkNvbnRlbnQoe1xuICAgIGNvbnRlbnQ6IHRvQ2hhbmdlbG9nU2VjdGlvbkRvY3VtZW50KGNoYW5nZWxvZywgbmV3VmVyc2lvbiksXG4gICAgZmlsZVBhdGg6IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pXG4gIH0pO1xuICBpZiAoZml4Q291bnQgPT09IDApIHtcbiAgICByZXR1cm4gY2hhbmdlbG9nO1xuICB9XG5cbiAgY29uc29sZS53YXJuKGBGaXhlZCAke1N0cmluZyhmaXhDb3VudCl9IG1hcmtkb3dubGludCBmaW5kaW5nKHMpIGluIHRoZSBnZW5lcmF0ZWQgJHtuZXdWZXJzaW9ufSBjaGFuZ2Vsb2cgc2VjdGlvbiwgc28gaXQgZGlmZmVycyBmcm9tIHRoZSBjb21taXQgc3ViamVjdHMuYCk7XG4gIGNvbnN0IGhlYWRpbmcgPSBgIyMgJHtuZXdWZXJzaW9ufVxcblxcbmA7XG4gIHJldHVybiBjaGFuZ2Vsb2cucmVwbGFjZShgJHtoZWFkaW5nfSR7c2VjdGlvbn1gLCAoKSA9PiBgJHtoZWFkaW5nfSR7ZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY29udGVudCwgbmV3VmVyc2lvbil9YCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQnJhbmNoKGJyYW5jaDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJyYW5jaCA/IGBicmFuY2ggJyR7YnJhbmNofSdgIDogJ2EgZGV0YWNoZWQgSEVBRCc7XG59XG4vKipcbiAqIEV4dHJhY3RzIHRoZSBib2R5IG9mIG9uZSB2ZXJzaW9uJ3MgYENIQU5HRUxPRy5tZGAgc2VjdGlvbiDigJQgZXZlcnl0aGluZyBiZXR3ZWVuIGl0cyBgIyMgPHZlcnNpb24+YCBoZWFkaW5nXG4gKiBhbmQgd2hpY2hldmVyIGNvbWVzIGZpcnN0LCB0aGUgbmV4dCBgIyMgYCBoZWFkaW5nIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gKlxuICogRW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgbm90IGFuIGVkZ2UgY2FzZSBidXQgdGhlIG5vcm1hbCBzaGFwZSBvZiBhIEZJUlNUIHJlbGVhc2U6IHNlY3Rpb25zIGFyZVxuICogcHJlcGVuZGVkLCBzbyB0aGUgbmV3ZXN0IG9uZSBpcyBib3VuZGVkIGJ5IHRoZSBwcmV2aW91cyByZWxlYXNlIG9ubHkgb25jZSBhIHByZXZpb3VzIHJlbGVhc2UgZXhpc3RzLiBUaGVcbiAqIHJlZ2V4IHRoaXMgcmVwbGFjZWQgcmVxdWlyZWQgYSB0cmFpbGluZyBgXFxuXFxuIyNgLCBzbyBldmVyeSBgMS4wLjBgIHNpbGVudGx5IHB1Ymxpc2hlZCBlbXB0eSByZWxlYXNlIG5vdGVzLlxuICogVGVybWluYXRpbmcgb24gYCcjIyAnYCBXSVRIIGl0cyB0cmFpbGluZyBzcGFjZSBpcyB3aGF0IGtlZXBzIGFuIGAjIyNgIHN1Yi1oZWFkaW5nIGluc2lkZSB0aGUgc2VjdGlvblxuICogaW5zdGVhZCBvZiB0cnVuY2F0aW5nIGl0IHRoZXJlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29udGVudHMgb2YgYENIQU5HRUxPRy5tZGAuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIFRoZSBzZWN0aW9uIGJvZHksIHRyaW1tZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBjaGFuZ2Vsb2cgaGFzIG5vIHNlY3Rpb24gZm9yIHRoYXQgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGNoYW5nZWxvZ0NvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgaGVhZGluZ0luZGV4ID0gbGluZXMuaW5kZXhPZihgIyMgJHt2ZXJzaW9ufWApO1xuICBpZiAoaGVhZGluZ0luZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGJvZHlTdGFydEluZGV4ID0gaGVhZGluZ0luZGV4ICsgMTtcbiAgY29uc3QgbmV4dEhlYWRpbmdPZmZzZXQgPSBsaW5lcy5zbGljZShib2R5U3RhcnRJbmRleCkuZmluZEluZGV4KChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoJyMjICcpKTtcbiAgY29uc3QgYm9keUVuZEluZGV4ID0gbmV4dEhlYWRpbmdPZmZzZXQgPT09IC0xID8gbGluZXMubGVuZ3RoIDogYm9keVN0YXJ0SW5kZXggKyBuZXh0SGVhZGluZ09mZnNldDtcbiAgcmV0dXJuIGxpbmVzLnNsaWNlKGJvZHlTdGFydEluZGV4LCBib2R5RW5kSW5kZXgpLmpvaW4oJ1xcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBEZXJpdmVzIHRoZSBsb3dlc3QgYnVtcCBhIGNvbW1pdCByYW5nZSBtYXkgYmUgcHVibGlzaGVkIHVuZGVyLCBmcm9tIHRoZSBDb252ZW50aW9uYWwtQ29tbWl0cyBtYXJrZXJzIHRoZVxuICogY29tbWl0cyBpbiBpdCBjYXJyeS5cbiAqXG4gKiBBIGAhYCBiZWZvcmUgdGhlIHN1YmplY3QncyBjb2xvbiwgb3IgYSBgQlJFQUtJTkcgQ0hBTkdFOmAgLyBgQlJFQUtJTkctQ0hBTkdFOmAgZm9vdGVyLCBmb3JjZXMgYSBtYWpvcjsgYVxuICogYGZlYXRgIHR5cGUgZm9yY2VzIGEgbWlub3I7IGV2ZXJ5dGhpbmcgZWxzZSDigJQgYGZpeGAsIGBjaG9yZWAsIGBkb2NzYCwgYHJlZmFjdG9yYCwgYW4gdW5wYXJzYWJsZSBzdWJqZWN0IOKAlFxuICogY29uc3RyYWlucyBub3RoaW5nIGFuZCB5aWVsZHMgYSBwYXRjaCBmbG9vciwgd2hpY2ggaXMgbm8gY29uc3RyYWludCBhdCBhbGwuXG4gKlxuICogKipFdmVyeSBjb21taXQgaW4gdGhlIHJhbmdlIGlzIHJlYWQsIGRlbGliZXJhdGVseSBOT1Qgb25seSB0aGUgZmlyc3QtcGFyZW50IG9uZXMqKiwgd2hpY2ggaXMgd2hlcmUgdGhpc1xuICogZGlmZmVycyBmcm9tIHRoZSBjaGFuZ2Vsb2cgZ2VuZXJhdGVkIG92ZXIgdGhlIHNhbWUgcmFuZ2UuIFRoZSBjaGFuZ2Vsb2cgaXMgZmlyc3QtcGFyZW50IGJlY2F1c2UgaXQgcHVibGlzaGVzXG4gKiBvbmUgbGluZSBwZXIgbGFuZGVkIGNoYW5nZTsgYSBicmVha2luZyBjaGFuZ2UgaXMgYnJlYWtpbmcgd2hpY2hldmVyIHBhcmVudCBpdCBhcnJpdmVkIG9uLiBDb25jcmV0ZWx5LFxuICoge0BsaW5rIHRvQ2hhbmdlbG9nRW50cnl9IGxpZnRzIG9ubHkgdGhlIEZJUlNUIGxpbmUgb2YgYSBtZXJnZSBib2R5IG9udG8gYSBkZWZhdWx0IG1lcmdlIHN1YmplY3QsIHNvIGFcbiAqIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXIgd3JpdHRlbiBvbiBhIGJyYW5jaCBjb21taXQgaXMgaW52aXNpYmxlIHRvIHRoZSBmaXJzdC1wYXJlbnQgaGlzdG9yeSDigJQgYW5kIGEgZm9vdGVyXG4gKiBpcyB0aGUgb25lIGJyZWFraW5nIHNpZ25hbCBDb252ZW50aW9uYWwgQ29tbWl0cyBwdXRzIGluIHRoZSBib2R5IHJhdGhlciB0aGFuIHRoZSBzdWJqZWN0LiBUaGUgY29zdCBvZlxuICogcmVhZGluZyBldmVyeXRoaW5nIGlzIG92ZXItZGV0ZWN0aW9uOiBhIGJyYW5jaCB3aG9zZSBicmVha2luZyBjb21taXQgd2FzIHJld29ya2VkIGludG8gYSBub24tYnJlYWtpbmcgbWVyZ2VcbiAqIHN0aWxsIGZvcmNlcyBhIG1ham9yLiBUaGF0IGRpcmVjdGlvbiBpcyBzYWZlIOKAlCBhbiBvdmVyLWJ1bXAgY29zdHMgYSBjb25zdW1lciBub3RoaW5nIGFuZCB0aGUgbWVzc2FnZSBuYW1lc1xuICogdGhlIGNvbW1pdCBzbyB0aGUgYXV0aG9yIGNhbiBzZWUgZXhhY3RseSB3aGljaCBvbmUg4oCUIGFuZCB0aGUgb3RoZXIgZGlyZWN0aW9uIGlzIHRoZSBkZWZlY3QgdGhpcyBleGlzdHMgZm9yLlxuICpcbiAqIEBwYXJhbSBjb21taXRSYW5nZSAtIFRoZSBnaXQgcmV2aXNpb24gcmFuZ2UgdG8gc2NhbiwgZS5nLiBgMTA1LjIuMC4uSEVBRGAuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB7QGxpbmsgQnVtcEZsb29yfSB0aGUgcmFuZ2UgZm9yY2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCdW1wRmxvb3IoY29tbWl0UmFuZ2U6IHN0cmluZyk6IFByb21pc2U8QnVtcEZsb29yPiB7XG4gIC8vIGAlSCVuJUJgIHB1dHMgdGhlIGhhc2ggb24gaXRzIG93biBmaXJzdCBsaW5lIGFuZCB0aGUgZnVsbCBtZXNzYWdlIHVuZGVyIGl0LCBhbmQgYC16YCBzZXBhcmF0ZXMgdGhlXG4gIC8vIGNvbW1pdHMgd2l0aCBOVUwg4oCUIHNvIG5vdGhpbmcgaW4gYSBjb21taXQgbWVzc2FnZSBjYW4gYmUgbWlzdGFrZW4gZm9yIGEgcmVjb3JkIGJvdW5kYXJ5LlxuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnbG9nJywgY29tbWl0UmFuZ2UsICctLWZvcm1hdD0lSCVuJUInLCAnLXonXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gIGNvbnN0IGZvcmNpbmdDb21taXRzID0gb3V0cHV0XG4gICAgLnNwbGl0KCdcXDAnKVxuICAgIC5tYXAoKHJlY29yZCkgPT4gdG9Gb3JjaW5nQ29tbWl0KHJlY29yZCkpXG4gICAgLmZpbHRlcigoZm9yY2luZ0NvbW1pdCkgPT4gZm9yY2luZ0NvbW1pdCAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JjaW5nQ29tbWl0cyxcbiAgICBsZXZlbDogdG9IaWdoZXN0QnVtcExldmVsKGZvcmNpbmdDb21taXRzKVxuICB9O1xufVxuXG4vKipcbiAqIFJ1bnMgYGxpbnQ6bWRgJ3MgYW5kIGBzcGVsbGNoZWNrYCdzIGNoZWNrcyBvdmVyIHRoZSBORVcgc2VjdGlvbiBvZiBhIGNvbXBvc2VkIGNoYW5nZWxvZywgYmVmb3JlIGFueSBvZiBpdFxuICogcmVhY2hlcyB0aGUgcmVwb3NpdG9yeS5cbiAqXG4gKiBPbmx5IHRoZSBuZXcgc2VjdGlvbiBpcyBjaGVja2VkLCBhbmQgZGVsaWJlcmF0ZWx5IHNvLiBUaGUgaG9uZXN0IGNoZWNrIGlzIHRoZSB3aG9sZSBmaWxlLCBidXQgaXQgZmFpbHMgYVxuICogcmVsZWFzZSBvbiBhIGRlZmVjdCBpbiBhIHNlY3Rpb24gc29tZWJvZHkgc2hpcHBlZCB5ZWFycyBhZ28g4oCUIHdoaWNoIGlzIGEgcmVsZWFzZSBub2JvZHkgY2FuIGN1dCB3aXRob3V0XG4gKiBmaXJzdCBmaXhpbmcgaGlzdG9yeSwgYW5kIGlzIGV4YWN0bHkgaG93IGEgY2hhbmdlbG9nIGRlZmVjdCBiZWNvbWVzIGEgcGVybWFuZW50IGJsb2NrZXIgaW5zdGVhZCBvZiBhXG4gKiB0d28tbWludXRlIGZpeC4gVGhhdCBpcyBub3QgaHlwb3RoZXRpY2FsIGZvciB0aGUgc3BlbGxpbmcgaGFsZiBpbiBwYXJ0aWN1bGFyOiBpdCBpcyB0aGUgc3RhdGUgZml2ZVxuICogcmVwb3NpdG9yaWVzIGluIHRoaXMgd29ya3NwYWNlIGFyZSBpbiwgZWFjaCB3aXRoIGEgY29pbmVkIHdvcmQgYWxyZWFkeSBwdWJsaXNoZWQgaW4gYW4gb2xkIHNlY3Rpb24uIFRoZSBuZXdcbiAqIHNlY3Rpb24gaXMgdGhlIG9ubHkgcGFydCB0aGlzIHJlbGVhc2UgaXMgcmVzcG9uc2libGUgZm9yLlxuICpcbiAqIEJPVEggY2hlY2tzIHJ1biBvdmVyIGV2ZXJ5IHNldHRsZSwgYW5kIG5laXRoZXIgc2hvcnQtY2lyY3VpdHMgdGhlIG90aGVyLiBBbiBhdXRob3Igd2hvIGhhcyBhIGhhcmQtd3JhcHBlZFxuICogbGluZSBhbmQgYSBjb2luZWQgd29yZCBpcyB0b2xkIGFib3V0IGJvdGggYXQgb25jZSwgaW4gb25lIHJvdW5kIG9mIHRoZSByZXZpZXcsIHJhdGhlciB0aGFuIGZpeGluZyBvbmUgYW5kXG4gKiBiZWluZyBzZW50IGJhY2sgZm9yIHRoZSBvdGhlci5cbiAqXG4gKiBFYWNoIGhhbGYgcnVucyBvbmx5IHdoZXJlIHRoZSBwcm9qZWN0IGRlZmluZXMgdGhlIHNjcmlwdCBpdCBzdGFuZHMgZm9yLCBqdXN0IGFzIHtAbGluayBnYXRlfSBydW5zIHRoYXQgc2NyaXB0XG4gKiBvbmx5IHdoZXJlIGl0IGlzIGRlZmluZWQuIEEgcHJvamVjdCB3aXRoIG5vIGBzcGVsbGNoZWNrYCBoYXMgbm8gc3BlbGxpbmcgY29uZmlndXJhdGlvbiBlaXRoZXIsIHNvIGBjc3BlbGxgIHdvdWxkXG4gKiBqdWRnZSBpdHMgcmVsZWFzZSBub3RlcyBhZ2FpbnN0IHRoZSBzdG9jayBkaWN0aW9uYXJpZXMgYWxvbmUgYW5kIHJlZnVzZSB0aGUgcmVsZWFzZSBvdmVyIHRoZSBwbHVnaW4ncyBvd24gbmFtZTpcbiAqIGEgY2hlY2sgdGhlIHByb2plY3QgbmV2ZXIgYWRvcHRlZCwgZW5mb3JjZWQgb25seSBhdCByZWxlYXNlIHRpbWUuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0NvbnRlbnQgLSBUaGUgZnVsbCBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIGlzIGFib3V0IHRvIGJlIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbmRpbmdzLCBvciBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBzZWN0aW9uIGlzIGNsZWFuLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDaGFuZ2Vsb2dTZWN0aW9uRmluZGluZ3MoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPENoYW5nZWxvZ0ZpbmRpbmdbXT4ge1xuICBjb25zdCBjb250ZW50ID0gdG9DaGFuZ2Vsb2dTZWN0aW9uRG9jdW1lbnQoY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbik7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBSZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IHNjcmlwdE5hbWVzID0gT2JqZWN0LmtleXMocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSk7XG5cbiAgY29uc3QgbWFya2Rvd25saW50RmluZGluZ3MgPSBzY3JpcHROYW1lcy5pbmNsdWRlcyhMSU5UX01EX1NDUklQVF9OQU1FKVxuICAgID8gYXdhaXQgbGludE1hcmtkb3duQ29udGVudCh7XG4gICAgICBjb250ZW50LFxuICAgICAgZmlsZVBhdGhcbiAgICB9KVxuICAgIDogW107XG4gIGNvbnN0IHNwZWxsaW5nRmluZGluZ3MgPSBzY3JpcHROYW1lcy5pbmNsdWRlcyhTUEVMTENIRUNLX1NDUklQVF9OQU1FKVxuICAgID8gYXdhaXQgc3BlbGxjaGVja0NvbnRlbnQoe1xuICAgICAgY29udGVudCxcbiAgICAgIGZpbGVQYXRoXG4gICAgfSlcbiAgICA6IFtdO1xuXG4gIHJldHVybiBbXG4gICAgLi4ubWFya2Rvd25saW50RmluZGluZ3MubWFwKCh0ZXh0KSA9PiAoe1xuICAgICAgc2NyaXB0TmFtZTogTElOVF9NRF9TQ1JJUFRfTkFNRSxcbiAgICAgIHRleHRcbiAgICB9KSksXG4gICAgLi4uc3BlbGxpbmdGaW5kaW5ncy5tYXAoKHRleHQpID0+ICh7XG4gICAgICBzY3JpcHROYW1lOiBTUEVMTENIRUNLX1NDUklQVF9OQU1FLFxuICAgICAgdGV4dFxuICAgIH0pKVxuICBdO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHJlbGVhc2UgYXNzZXRzOiB0aGUgcHJvamVjdCdzIGBucG0gcGFja2AgdGFyYmFsbCwgd3JpdHRlbiBpbnRvIGBkaXN0L2AsIGFuZCBgZGlzdC9zdHlsZXMuY3NzYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYXNzZXQgcGF0aHMsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE5wbVBhY2tSZWxlYXNlQXNzZXRQYXRocygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlc3VsdE91dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ25wbScsICdwYWNrJywgJy0tcGFjay1kZXN0aW5hdGlvbicsIFJlcG9QYXRocy5EaXN0LCAnLS1qc29uJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VOcG1QYWNrT3V0cHV0KHJlc3VsdE91dHB1dCk7XG4gIHJldHVybiBbXG4gICAgam9pbihSZXBvUGF0aHMuRGlzdCwgcmVzdWx0LmZpbGVuYW1lKSxcbiAgICBqb2luKFJlcG9QYXRocy5EaXN0LCBSZXBvUGF0aHMuU3R5bGVzQ3NzKVxuICBdO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBidW1wIHJlYWNoZXMgYSBmbG9vci5cbiAqXG4gKiBTcGVsbGVkIG91dCByYXRoZXIgdGhhbiBnaXZlbiBudW1lcmljIHJhbmtzLCBiZWNhdXNlIHRocmVlIGxldmVscyBkbyBub3QgbmVlZCBhbiBvcmRlcmluZyBzY2hlbWUgYW5kIGFcbiAqIGAyID49IDNgIGluIGEgcmVsZWFzZSBnYXRlIGlzIG9uZSB0cmFuc3Bvc2l0aW9uIGF3YXkgZnJvbSBzaWxlbnRseSBwYXNzaW5nIGV2ZXJ5dGhpbmcuIGBmbG9vckxldmVsYCBleGNsdWRlc1xuICoge0BsaW5rIFZlcnNpb25VcGRhdGVUeXBlLlBhdGNofSBmb3IgdGhlIHNhbWUgcmVhc29uIGl0IGlzIG5vdCB0ZXN0ZWQgZm9yOiBhIHBhdGNoIGZsb29yIGlzIG5vIGZsb29yLCBhbmQgaXRzXG4gKiBvbmx5IGNhbGxlciBoYXMgYWxyZWFkeSByZXR1cm5lZCBieSB0aGVuIOKAlCBhIGJyYW5jaCB0aGF0IGNhbiBvbmx5IGV2ZXIgYW5zd2VyIGB0cnVlYCBpcyBvbmUgbm9ib2R5IHJlYWRzIGFuZFxuICogbm90aGluZyBjb3ZlcnMuXG4gKlxuICogQHBhcmFtIGxldmVsIC0gVGhlIHtAbGluayBCdW1wTGV2ZWx9IGFjdHVhbGx5IHRha2VuLlxuICogQHBhcmFtIGZsb29yTGV2ZWwgLSBUaGUge0BsaW5rIEJ1bXBMZXZlbH0gcmVxdWlyZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGBsZXZlbGAgaXMgYXQgbGVhc3QgYGZsb29yTGV2ZWxgLlxuICovXG5mdW5jdGlvbiBpc0J1bXBMZXZlbEF0TGVhc3QobGV2ZWw6IEJ1bXBMZXZlbCwgZmxvb3JMZXZlbDogVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IgfCBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vcik6IGJvb2xlYW4ge1xuICByZXR1cm4gZmxvb3JMZXZlbCA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3JcbiAgICA/IGxldmVsID09PSBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvclxuICAgIDogbGV2ZWwgIT09IFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbGVhc2Ugb3BlbnMgdGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcuIFByZXBhcmVkIG5vdGVzIGFyZSBhbHJlYWR5IHRoZSByZXZpZXdlZCB0ZXh0LCBzb1xuICogdGhleSBuZXZlciBvcGVuIGFuIGVkaXRvciwgd2hhdGV2ZXIgYHNob3VsZEVkaXRDaGFuZ2Vsb2dgIHNheXMuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0ZpbGVQYXRoIC0gVGhlIHByZXBhcmVkIG5vdGVzLCB3aGVuIHRoZSByZWxlYXNlIHdhcyBnaXZlbiB0aGVtLlxuICogQHBhcmFtIHNob3VsZEVkaXRDaGFuZ2Vsb2cgLSBXaGV0aGVyIHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcgd2FzIGFza2VkIGZvci5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHJldmlldyBpcyBkdWUuXG4gKi9cbmZ1bmN0aW9uIGlzQ2hhbmdlbG9nUmV2aWV3RHVlKGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNob3VsZEVkaXRDaGFuZ2Vsb2c6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoYW5nZWxvZ0ZpbGVQYXRoID09PSB1bmRlZmluZWQgJiYgc2hvdWxkRWRpdENoYW5nZWxvZztcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgaXNzdWUgcmVmZXJlbmNlcyBvZmYgb25lIHtAbGluayBJU1NVRV9SRUZFUkVOQ0VfTElORV9SRUdfRVhQfSBsaW5lLlxuICpcbiAqIEEgY3Jvc3MtcmVwb3NpdG9yeSByZWZlcmVuY2UgaXMgcmVuZGVyZWQgYXMgaXRzIFVSTCByYXRoZXIgdGhhbiBhcyBgb3duZXIvcmVwbyNuYDogR2l0SHViIHNob3dzIHRoZSBVUkwgYXMgdGhlXG4gKiBzYW1lIHNob3J0IGxpbmssIGFuZCB0aGUgc3BlbGxjaGVja2VyIHRoZSBjaGFuZ2Vsb2cgc2VjdGlvbiBpcyBoZWxkIHRvIHNraXBzIGEgVVJMIGJ1dCBub3QgYSByZXBvc2l0b3J5IG5hbWUuXG4gKlxuICogQHBhcmFtIGxpbmUgLSBPbmUgbGluZSBvZiBhIGNvbW1pdCBib2R5LlxuICogQHJldHVybnMgVGhlIHJlZmVyZW5jZXMsIG9yIGBudWxsYCB3aGVuIHRoZSBsaW5lIGlzIG5vdCBhIHJlZmVyZW5jZSBsaW5lIG9yIGhvbGRzIGFueXRoaW5nIGJ1dCByZWZlcmVuY2VzLlxuICovXG5mdW5jdGlvbiBwYXJzZUlzc3VlUmVmZXJlbmNlTGluZShsaW5lOiBzdHJpbmcpOiBJc3N1ZVJlZmVyZW5jZVtdIHwgbnVsbCB7XG4gIGNvbnN0IHJlZmVyZW5jZXNUZXh0ID0gSVNTVUVfUkVGRVJFTkNFX0xJTkVfUkVHX0VYUC5leGVjKGxpbmUudHJpbSgpKT8uZ3JvdXBzPy5bJ3JlZmVyZW5jZXMnXTtcbiAgaWYgKHJlZmVyZW5jZXNUZXh0Py5yZXBsYWNlQWxsKElTU1VFX1JFRkVSRU5DRV9SRUdfRVhQLCAnJykucmVwbGFjZUFsbCgvXFxiYW5kXFxifFtcXHMsXS9nLCAnJykgIT09ICcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShyZWZlcmVuY2VzVGV4dC5tYXRjaEFsbChJU1NVRV9SRUZFUkVOQ0VfUkVHX0VYUCksIChtYXRjaCk6IElzc3VlUmVmZXJlbmNlID0+IHtcbiAgICBjb25zdCBiYXJlTnVtYmVyID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAnYmFyZU51bWJlcicpO1xuICAgIGlmIChiYXJlTnVtYmVyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyByZW5kZXJlZDogYCMke2JhcmVOdW1iZXJ9YCwgc3BlbGxpbmdzOiBbYCMke2JhcmVOdW1iZXJ9YF0gfTtcbiAgICB9XG4gICAgY29uc3QgcmVwb1NsdWcgPSBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICd1cmxTbHVnJykgPz8gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAnc2x1ZycpO1xuICAgIGNvbnN0IGlzc3VlTnVtYmVyID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAndXJsTnVtYmVyJykgPz8gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAnc2x1Z051bWJlcicpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHJlcG9TbHVnKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShpc3N1ZU51bWJlcik7XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9TbHVnfS9pc3N1ZXMvJHtpc3N1ZU51bWJlcn1gO1xuICAgIHJldHVybiB7IHJlbmRlcmVkOiBgPCR7dXJsfT5gLCBzcGVsbGluZ3M6IFtgJHtyZXBvU2x1Z30jJHtpc3N1ZU51bWJlcn1gLCB1cmwsIGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvU2x1Z30vcHVsbC8ke2lzc3VlTnVtYmVyfWBdIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBzaW5nbGUgcGFjayByZXN1bHQgZnJvbSB0aGUgb3V0cHV0IG9mIGBucG0gcGFjayAtLWpzb25gLlxuICpcbiAqIFR3byB0aGluZ3MgbWFrZSB0aGlzIG1vcmUgdGhhbiBhIGBKU09OLnBhcnNlKClgLiBUaGUgcGF5bG9hZCBpcyBQUkVDRURFRCBvbiBzdGRvdXQgYnkgd2hhdGV2ZXIgdGhlXG4gKiBgcHJlcGFyZWAgc2NyaXB0IHByaW50ZWQgKHRoZSBgbnBtIG5vdGljZWAgbGluZXMgZ28gdG8gc3RkZXJyLCBub3QgaGVyZSksIHNvIGl0cyBzdGFydCBoYXMgdG8gYmUgZm91bmQg4oCUXG4gKiBhbmQgaXQgaXMgZm91bmQgYnkgcGFyc2luZyBmcm9tIGVhY2ggY2FuZGlkYXRlIHN0YXJ0IHJhdGhlciB0aGFuIGJ5IG1hdGNoaW5nIGEgbGl0ZXJhbCwgYmVjYXVzZSB0aGVcbiAqIHByZWZpeCBtYXkgaXRzZWxmIGNvbnRhaW4gYSBicmFjZS4gQW5kIHRoZSBwYXlsb2FkJ3MgU0hBUEUgZGVwZW5kcyBvbiB0aGUgbnBtIG1ham9yOiBucG0gMTEgYW5kIGVhcmxpZXJcbiAqIGVtaXQgYW4gYXJyYXkgb2YgcGFjayByZXN1bHRzLCBucG0gMTIgZW1pdHMgYW4gb2JqZWN0IGtleWVkIGJ5IHBhY2thZ2UgbmFtZS4gQm90aCBhcmUgYWNjZXB0ZWQ7IHNjYW5uaW5nXG4gKiBmb3IgdGhlIGFycmF5J3MgbGl0ZXJhbCBvcGVuaW5nIGlzIHdoYXQgYnJva2UgZXZlcnkgcmVsZWFzZSBvbiBucG0gMTIuXG4gKlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBzdGRvdXQgb2YgYG5wbSBwYWNrIC0tanNvbmAuXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIE5wbVBhY2tSZXN1bHR9IGRlc2NyaWJpbmcgdGhlIHBhY2tlZCB0YXJiYWxsLlxuICogQHRocm93cyBJZiB0aGUgb3V0cHV0IGhvbGRzIG5vIHBhcnNhYmxlIEpTT04gcGF5bG9hZCwgb3IgdGhlIHBheWxvYWQgaG9sZHMgbm8gcGFjayByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTnBtUGFja091dHB1dChvdXRwdXQ6IHN0cmluZyk6IE5wbVBhY2tSZXN1bHQge1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIG91dHB1dC5tYXRjaEFsbCgvW1t7XS9nKSkge1xuICAgIGxldCBwYXlsb2FkOiB1bmtub3duO1xuXG4gICAgdHJ5IHtcbiAgICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKG91dHB1dC5zbGljZShtYXRjaC5pbmRleCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIGFzIE5wbVBhY2tSZXN1bHRbXSA6IE9iamVjdC52YWx1ZXMocGF5bG9hZCBhcyBSZWNvcmQ8c3RyaW5nLCBOcG1QYWNrUmVzdWx0Pik7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0c1swXTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIG5vIHBhY2sgcmVzdWx0IGluIHRoZSBgbnBtIHBhY2sgLS1qc29uYCBvdXRwdXQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmluZCB0aGUgSlNPTiBwYXlsb2FkIGluIHRoZSBgbnBtIHBhY2sgLS1qc29uYCBvdXRwdXQnKTtcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0aGUgZnVsbCBuZXcgYENIQU5HRUxPRy5tZGAgY29udGVudCDigJQgaW5jbHVkaW5nIHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcsIHdoZW4gb25lIGlzIGR1ZSDigJRcbiAqIFdJVEhPVVQgdG91Y2hpbmcgdGhlIHJlcG9zaXRvcnkuIE5vdGhpbmcgaGVyZSB3cml0ZXMgaW50byB0aGUgcmVwbywgc28gYW4gaW50ZXJydXB0IGFueXdoZXJlIGluIHRoZVxuICogcmV2aWV3IHdpbmRvdyAodGhlIHdob2xlIHBvaW50IG9mIHRoZSBzcGxpdCkgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgZXhhY3RseSBhcyBpdCB3YXMuXG4gKlxuICogVGhlIHNldHRsZWQgY29udGVudCBpcyBoYW5kZWQgdG8ge0BsaW5rIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0c30gYmVmb3JlIGl0IGlzIHJldHVybmVkLCB3aGljaCBpc1xuICogaG93IHRoYXQgZ3VhcmQgcmVhY2hlcyBldmVyeSBjYWxsZXIgYW5kIGV2ZXJ5IHBhdGgg4oCUIHJldmlld2VkIG9yIG5vdCwgY29tbWl0LWRlcml2ZWQgb3IgcHJlcGFyZWQg4oCUIGZyb20gYVxuICogc2luZ2xlIHNpdGUuXG4gKlxuICogSXQgaXMgYWxzbyB3aGVyZSB0aGUgbmV3IHNlY3Rpb24gaXMgTElOVEVEIGFuZCBTUEVMTENIRUNLRUQsIGZvciB0aGUgc2FtZSByZWFzb24gYW5kIG9uZSB0aGUgcmVsZWFzZSdzXG4gKiBvcmRlcmluZyBmb3JjZXM6IHRoZSByZWxlYXNlJ3Mgb25seSBgbGludDptZGAgYW5kIGBzcGVsbGNoZWNrYCBydW4gaW4gdGhlIGdhdGUsIHdoaWNoIGlzIG92ZXIgYmVmb3JlIHRoaXNcbiAqIHRleHQgZXhpc3RzLCBzbyBldmVyeSBjaGFyYWN0ZXIgb2YgYSBuZXcgY2hhbmdlbG9nIHNlY3Rpb24gdXNlZCB0byBlbnRlciB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgb25seVxuICogY2hlY2tzIHRoYXQgY291bGQgaGF2ZSBsb29rZWQgYXQgaXQuIFRoZSBnZW5lcmF0b3IncyBvd24gYnVsbGV0cyBjYW5ub3QgZmFpbCB0aGVtIOKAlCB0aGV5IGFyZSBvbmVcbiAqIGB0b0ZpcnN0TGluZWAgcGVyIGNvbW1pdCDigJQgYnV0IHRoZSB0d28gcGF0aHMgYSBodW1hbiBvciBhbiBhZ2VudCB3cml0ZXMsIHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcgYW5kXG4gKiBgLS1jaGFuZ2Vsb2ctZmlsZWAsIGFyZSBleGFjdGx5IHRoZSBwYXRocyB0aGF0IGNhcnJ5IHByb3NlLiBBIGRlZmVjdCB0aGVyZSBkb2VzIG5vdCBmYWlsIHRoZSByZWxlYXNlOiBpdFxuICogbGFuZHMgb24gdGhlIGRlZmF1bHQgYnJhbmNoIGluc2lkZSB0aGUgYGNob3JlOiByZWxlYXNlYCBjb21taXQsIGFuZCB0dXJucyB0aGUgTkVYVCBnYXRlIHJlZCwgb24gYSBicmFuY2hcbiAqIGJlbG9uZ2luZyB0byBzb21lYm9keSB3aG8gZGlkIG5vdCB3cml0ZSBpdC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdGhlIGNoYW5nZWxvZyBzZWN0aW9uIGlzIHdyaXR0ZW4gZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnN9IGNvbnRyb2xsaW5nIHdoZXJlIHRoZSBzZWN0aW9uIGJvZHkgY29tZXMgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNldHRsZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGgsXG4gICAgY2hhbmdlbG9nU3R5bGUsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlzUmV2aWV3RHVlID0gaXNDaGFuZ2Vsb2dSZXZpZXdEdWUoY2hhbmdlbG9nRmlsZVBhdGgsIHNob3VsZEVkaXRDaGFuZ2Vsb2cpO1xuICBjb25zdCBuZXdDaGFuZ2VMb2cgPSBpc1Jldmlld0R1ZVxuICAgID8gYXdhaXQgY29tcG9zZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCBjaGFuZ2Vsb2dGaWxlUGF0aCwgY2hhbmdlbG9nU3R5bGUpXG4gICAgOiBhd2FpdCBjb21wb3NlQ2hhbmdlbG9nTm9ib2R5UmV2aWV3cyhuZXdWZXJzaW9uLCBjaGFuZ2Vsb2dGaWxlUGF0aCwgY2hhbmdlbG9nU3R5bGUpO1xuICBsZXQgc2V0dGxlZENoYW5nZUxvZyA9IG5ld0NoYW5nZUxvZztcbiAgbGV0IGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10gPSBbXTtcblxuICAvLyBUaGUgY2hlY2tzIHJ1biBvbiB0aGUgU0VUVExFRCB0ZXh0LCBzbyB0aGUgcmV2aWV3IHNpdHMgaW5zaWRlIHRoZSBsb29wIHJhdGhlciB0aGFuIGJlZm9yZSBpdDogdGhlIGF1dGhvciBpc1xuICAvLyBzdGlsbCBzaXR0aW5nIGF0IHRoZSBlZGl0b3IsIHNvIHRoZXkgYXJlIGhhbmRlZCB0aGUgZmluZGluZ3MgYW5kIHRoZSBzYW1lIHNjcmF0Y2ggY29weSBiYWNrLiBBIHJldmlldyB0aGF0XG4gIC8vIHJldHVybnMgYnl0ZS1pZGVudGljYWwgdGV4dCBpcyB0aGUgYXV0aG9yIGRlY2xpbmluZyB0byBmaXggdGhlbSwgd2hpY2ggZW5kcyB0aGUgbG9vcCBpbnN0ZWFkIG9mIHJlb3BlbmluZ1xuICAvLyBmb3IgZXZlci4gVGhlcmUgaXMgbm9ib2R5IHRvIGhhbmQgYSBmaW5kaW5nIHRvIG9uIHRoZSBvdGhlciBwYXRocywgc28gdGhvc2UgdGhyb3cgb24gdGhlIGZpcnN0IG9uZS5cbiAgZm9yICg7Oykge1xuICAgIGlmIChpc1Jldmlld0R1ZSkge1xuICAgICAgY29uc3QgcmV2aWV3ZWRDaGFuZ2VMb2cgPSBhd2FpdCByZXZpZXdDaGFuZ2Vsb2coc2V0dGxlZENoYW5nZUxvZywgZmluZGluZ3MpO1xuICAgICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA+IDAgJiYgcmV2aWV3ZWRDaGFuZ2VMb2cgPT09IHNldHRsZWRDaGFuZ2VMb2cpIHtcbiAgICAgICAgdGhyb3cgdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzLCBuZXdWZXJzaW9uKTtcbiAgICAgIH1cblxuICAgICAgc2V0dGxlZENoYW5nZUxvZyA9IHJldmlld2VkQ2hhbmdlTG9nO1xuICAgIH1cblxuICAgIGZpbmRpbmdzID0gYXdhaXQgZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzKHNldHRsZWRDaGFuZ2VMb2csIG5ld1ZlcnNpb24pO1xuICAgIGlmIChmaW5kaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICghaXNSZXZpZXdEdWUpIHtcbiAgICAgIHRocm93IHRvQ2hhbmdlbG9nRmluZGluZ3NFcnJvcihmaW5kaW5ncywgbmV3VmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGxhc3QgdGhpbmcgdGhlIGNvbXBvc2l0aW9uIGRvZXMsIGFuZCB0aGF0IHBsYWNlbWVudCBpcyB0aGUgd2hvbGUgcG9pbnQ6IHRoaXMgT05FIHNpdGUgc2VlcyB0aGVcbiAgLy8gY29tbWl0LWRlcml2ZWQgYnVsbGV0cywgdGhlIHByZXBhcmVkIG5vdGVzIGFuZCB3aGF0ZXZlciBhIHJldmlldyBsZWZ0IGJlaGluZCwgc28gdGhlIGd1YXJkIHJ1bnMgd2hldGhlciBvciBub3RcbiAgLy8gdGhlIGludGVyYWN0aXZlIHJldmlldyBkb2VzIOKAlCBhbmQgdGhlIHJldmlldyBpcyBwcmVjaXNlbHkgd2hhdCBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2Agc2tpcHMuIE5vdGhpbmcgaGFzIGJlZW5cbiAgLy8gd3JpdHRlbiB0byB0aGUgcmVwb3NpdG9yeSB5ZXQgZWl0aGVyLCBzbyB0aGUgdGhyb3cgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgcHJpc3RpbmUgYW5kIHRoZSByZWxlYXNlIHJlLXJ1bm5hYmxlLlxuICBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHMoc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gIGF3YWl0IGFzc2VydENoYW5nZWxvZ0hhc05vRm9yYmlkZGVuUGF0dGVybnMoc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gIHJldHVybiBzZXR0bGVkQ2hhbmdlTG9nO1xufVxuXG4vKipcbiAqIFJlYWRzIGBDSEFOR0VMT0cubWRgIGFuZCByZXR1cm5zIGV2ZXJ5dGhpbmcgYmVsb3cgaXRzIGAjIENIQU5HRUxPR2AgaGVhZGVyIOKAlCBzbyB0aGUgZmlyc3QgbGluZSBpcyB0aGVcbiAqIG5ld2VzdCBgIyMgPHZlcnNpb24+YCBoZWFkaW5nLCB3aGljaCBpcyB3aGF0IG5hbWVzIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24uXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbGluZXMsIG9yIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIHJlcG9zaXRvcnkgaGFzIG5vIGNoYW5nZWxvZ1xuICogeWV0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IEhFQURFUl9MSU5FU19DT1VOVCA9IDI7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGNoYW5nZWxvZ1BhdGgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICBjb25zdCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJykuc2xpY2UoSEVBREVSX0xJTkVTX0NPVU5UKTtcbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMuYXQoLTEpID09PSAnJykge1xuICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgdGFnIG9mIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24g4oCUIHRoZSBiYXNlbGluZSBib3RoIHRoZSBjaGFuZ2Vsb2cgcmFuZ2UgYW5kIHRoZSBidW1wIGZsb29yIGFyZVxuICogbWVhc3VyZWQgZnJvbSwgZGVyaXZlZCBvbmNlIGhlcmUgc28gdGhvc2UgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZSBhYm91dCB3aGljaCBjb21taXRzIGFyZSBiZWluZyBwdWJsaXNoZWQuXG4gKlxuICogQSBoZWFkaW5nIGlzIG5vdCBhIHRhZy4gQSBoYW5kLXdyaXR0ZW4gYCMjIDAuMC4wYCBwbGFjZWhvbGRlciBpbiBhIG5ldmVyLXRhZ2dlZCByZXBvLCBvciBhIHRhZyBkZWxldGVkIGFmdGVyXG4gKiB0aGUgZmFjdCwgd291bGQgb3RoZXJ3aXNlIHJlYWNoIGBnaXQgbG9nYCBhcyBhIHJldmlzaW9uIGl0IGNhbm5vdCByZXNvbHZlIOKAlCBhbmQgaXQgdXNlZCB0byByZWFjaCBpdCBhdCB0aGVcbiAqIHZlcnkgRU5EIG9mIHRoZSByZWxlYXNlLCBhZnRlciB0aGUgd2hvbGUgcHJlZmxpZ2h0IGhhZCBiZWVuIHBhaWQgZm9yLiBGYWxsaW5nIGJhY2sgdG8gbm8gYmFzZWxpbmVcbiAqIG92ZXItaW5jbHVkZXMgd2hlbiBhIHRhZyB3YXMgZGVsZXRlZCwgYnV0IHRoYXQgaXMgc2FmZSBhbmQgdmlzaWJsZTogdGhlIGNoYW5nZWxvZyByZXZpZXcgaXMgZXhhY3RseSB3aGVyZSBhblxuICogb3Zlci1pbmNsdWRlZCByYW5nZSBnZXRzIHRyaW1tZWQsIGFuZCB0aGUgYnVtcCBmbG9vciBkZWNsaW5lcyB0byBkZXJpdmUgYW55dGhpbmcgYXQgYWxsIHdpdGhvdXQgYSBiYXNlbGluZS5cbiAqXG4gKiBAcGFyYW0gcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyAtIFRoZSBsaW5lcyB7QGxpbmsgcmVhZFByZXZpb3VzQ2hhbmdlbG9nTGluZXN9IHJldHVybmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdGFnIG5hbWUsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZXJlIGlzIG5vbmUgdG8gcmVzb2x2ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhwcmV2aW91c0NoYW5nZWxvZ0xpbmVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGxhc3RUYWcgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzWzBdID8/ICcnLFxuICAgIHJlcGxhY2VyOiAnJyxcbiAgICBzZWFyY2hWYWx1ZTogJyMjICdcbiAgfSk7XG5cbiAgaWYgKCFsYXN0VGFnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMYXN0VGFnID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLXZlcmlmeScsICctLXF1aWV0JywgYHJlZnMvdGFncy8ke2xhc3RUYWd9YF0sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gIH0pO1xuXG4gIGlmICghcmVzb2x2ZWRMYXN0VGFnKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKShcbiAgICAgIGAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gc3RhcnRzIGF0ICcjIyAke2xhc3RUYWd9JywgYnV0IG5vIHN1Y2ggdGFnIGV4aXN0cy4gR2VuZXJhdGluZyB0aGUgY2hhbmdlbG9nIGZyb20gdGhlIGZ1bGwgaGlzdG9yeSBpbnN0ZWFkLmBcbiAgICApO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBsYXN0VGFnO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGFzc2V0cyBvbmNlIHByZXBhcmF0aW9uIGhhcyBmaW5pc2hlZCwgcmVmdXNpbmcgbWlzc2luZyBmaWxlcyBpbiB0aGUgZ3VhcmRlZCBtb2RlLlxuICpcbiAqIEBwYXJhbSBnZXRQYXRocyAtIFRoZSBjYWxsYmFjayBuYW1pbmcgdGhlIHByZXBhcmVkIGFzc2V0cy5cbiAqIEBwYXJhbSBzaG91bGRSZXF1aXJlQXNzZXRzIC0gV2hldGhlciBhIG1pc3NpbmcgcmVxdWVzdGVkIGFzc2V0IGZhaWxzIHRoZSByZWxlYXNlLlxuICogQHJldHVybnMgVGhlIGV4aXN0aW5nIHBhdGhzIHRvIGF0dGFjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVJlbGVhc2VBc3NldFBhdGhzKGdldFBhdGhzOiAoKSA9PiBQcm9taXNlPHN0cmluZ1tdPiwgc2hvdWxkUmVxdWlyZUFzc2V0czogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBnZXRQYXRocygpO1xuICByZXR1cm4gcGF0aHMuZmlsdGVyKChwYXRoKSA9PiB7XG4gICAgY29uc3QgaXNFeGlzdHMgPSBleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aCB9KSk7XG4gICAgaWYgKCFpc0V4aXN0cyAmJiBzaG91bGRSZXF1aXJlQXNzZXRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlbGVhc2UgYXNzZXQgZG9lcyBub3QgZXhpc3Q6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzRXhpc3RzO1xuICB9KTtcbn1cblxuLyoqXG4gKiBIYW5kcyB0aGUgY29tcG9zZWQgY2hhbmdlbG9nIHRvIHRoZSB1c2VyIGZvciByZXZpZXcgb24gYSBzY3JhdGNoIGNvcHkgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgYW5kXG4gKiByZXR1cm5zIHdoYXRldmVyIHRoZXkgbGVmdCBiZWhpbmQuIFRoZSBzY3JhdGNoIGZvbGRlciBpcyByZW1vdmVkIGV2ZW4gd2hlbiB0aGUgcmV2aWV3IGZhaWxzLlxuICpcbiAqIEBwYXJhbSBuZXdDaGFuZ2VMb2cgLSBUaGUgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudCB0byBoYW5kIG92ZXIgZm9yIHJldmlldy5cbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0aGUgcHJldmlvdXMgcm91bmQgb2YgdGhpcyByZXZpZXcgbGVmdCB1bmZpeGVkLCBwcmludGVkIGFib3ZlIHRoZSBwcm9tcHQgc29cbiAqIHRoZSBhdXRob3Igc2VlcyB3aGF0IGhhcyB0byBjaGFuZ2UuIEVtcHR5IG9uIHRoZSBmaXJzdCByb3VuZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldmlld2VkIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldmlld0NoYW5nZWxvZyhuZXdDaGFuZ2VMb2c6IHN0cmluZywgZmluZGluZ3M6IENoYW5nZWxvZ0ZpbmRpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHNjcmF0Y2hGb2xkZXIgPSBhd2FpdCBta2R0ZW1wKGpvaW4odG1wZGlyKCksICdjaGFuZ2Vsb2ctJykpO1xuICBjb25zdCBzY3JhdGNoQ2hhbmdlbG9nUGF0aCA9IGpvaW4oc2NyYXRjaEZvbGRlciwgUmVwb1BhdGhzLkNoYW5nZWxvZ01kKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlRmlsZShzY3JhdGNoQ2hhbmdlbG9nUGF0aCwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGNvZGVWZXJzaW9uID0gYXdhaXQgZXhlY0Zyb21Sb290KCdjb2RlIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHZlcnNpb25EZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJyk7XG4gICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihcbiAgICAgICAgYCR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBkb2VzIG5vdCBwYXNzICR7dG9GYWlsZWRTY3JpcHROYW1lcyhmaW5kaW5ncyl9IHlldDpcXG4ke3RvRmluZGluZ0xpbmVzKGZpbmRpbmdzKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb2RlVmVyc2lvbikge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKGBQbGVhc2UgdXBkYXRlIHRoZSAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gZmlsZS4gQ2xvc2UgVmlzdWFsIFN0dWRpbyBDb2RlIHdoZW4geW91IGFyZSBkb25lLi4uYCk7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydjb2RlJywgJy13Jywgc2NyYXRjaENoYW5nZWxvZ1BhdGhdLCB7XG4gICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKCdDb3VsZCBub3QgZmluZCBWaXN1YWwgU3R1ZGlvIENvZGUgaW4geW91ciBQQVRILiBVc2luZyBjb25zb2xlIG1vZGUgaW5zdGVhZC4nKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oXG4gICAgICAgIGBQbGVhc2UgdXBkYXRlIHRoZSAke3NjcmF0Y2hDaGFuZ2Vsb2dQYXRofSBmaWxlLiBQcmVzcyBFbnRlciB3aGVuIHlvdSBhcmUgZG9uZS4uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBybShzY3JhdGNoRm9sZGVyLCB7XG4gICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlcnJvciB0aGF0IHJlZnVzZXMgYSBidW1wIGxvd2VyIHRoYW4gdGhlIHJhbmdlIGZvcmNlcy5cbiAqXG4gKiBJdCBuYW1lcyBldmVyeSBmb3JjaW5nIGNvbW1pdCB3aXRoIGl0cyBzaG9ydCBoYXNoLCBpdHMgc3ViamVjdCBhbmQgV0hJQ0ggbWFya2VyIGZvcmNlZCBpdCwgYmVjYXVzZSB0aGVcbiAqIHJlbWVkeSBkZXBlbmRzIG9uIHRoYXQ6IGEgYGZlYXQhYCBpcyBhIGRlbGliZXJhdGUgYnJlYWsgc29tZWJvZHkgdHlwZWQsIHdoaWxlIGEgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3RlclxuICogc2l0cyBpbiBhIGJvZHkgbm9ib2R5IHJlLXJlYWRzIGFuZCBpcyBleGFjdGx5IHRoZSB0aGluZyB0aGlzIGdhdGUgZXhpc3RzIHRvIHN1cmZhY2UuIFRoZSBpbnN0cnVjdGlvbiBpcyB0b1xuICogdGFrZSB0aGUgaGlnaGVyIGJ1bXAsIG5vdCB0byBlZGl0IHRoZSBjb21taXRzIOKAlCBoaXN0b3J5IHRoYXQgYWxyZWFkeSByZWFjaGVkIHRoZSBkZWZhdWx0IGJyYW5jaCBpcyB3aGF0IGFcbiAqIHJlbGVhc2UgcHVibGlzaGVzLCBhbmQgcmV3cml0aW5nIGl0IHRvIGRvZGdlIGEgdmVyc2lvbiBzaWduYWwgaXMgdGhlIGRlZmVjdCBvbmUgbGV2ZWwgdXAuXG4gKlxuICogQHBhcmFtIGJ1bXBGbG9vciAtIFRoZSBkZXJpdmVkIHtAbGluayBCdW1wRmxvb3J9LlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUge0BsaW5rIEJ1bXBGbG9vclJlZnVzYWxDb250ZXh0fSBkZXNjcmliaW5nIHdoYXQgd2FzIGFza2VkIGZvci5cbiAqIEByZXR1cm5zIFRoZSBlcnJvciB0byB0aHJvdy5cbiAqL1xuZnVuY3Rpb24gdG9CdW1wRmxvb3JFcnJvcihidW1wRmxvb3I6IEJ1bXBGbG9vciwgY29udGV4dDogQnVtcEZsb29yUmVmdXNhbENvbnRleHQpOiBFcnJvciB7XG4gIGNvbnN0IGZvcmNpbmdMaW5lcyA9IGJ1bXBGbG9vci5mb3JjaW5nQ29tbWl0c1xuICAgIC5tYXAoKGZvcmNpbmdDb21taXQpID0+IGAgICR7Zm9yY2luZ0NvbW1pdC5zaGEuc2xpY2UoMCwgU0hPUlRfU0hBX0xFTkdUSCl9ICAke2ZvcmNpbmdDb21taXQuc3ViamVjdH0gICgke2ZvcmNpbmdDb21taXQubWFya2VyfSlgKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGBUaGUgY29tbWl0cyBzaW5jZSAke2NvbnRleHQubGFzdFRhZ30gZm9yY2UgYXQgbGVhc3QgYSAke2J1bXBGbG9vci5sZXZlbH0gcmVsZWFzZSwgYnV0ICcke2NvbnRleHQudmVyc2lvblVwZGF0ZVR5cGV9JyB3b3VsZCBwdWJsaXNoYFxuICAgICAgKyBgICR7Y29udGV4dC5uZXdWZXJzaW9ufSwgd2hpY2ggaXMgYSAke2NvbnRleHQudGFrZW5MZXZlbH0uXFxuYFxuICAgICAgKyBgJHtmb3JjaW5nTGluZXN9XFxuYFxuICAgICAgKyAnQSByZWxlYXNlIHB1Ymxpc2hlcyBldmVyeSBjb21taXQgc2luY2UgdGhlIGxhc3QgdGFnLCBub3QgdGhlIGNoYW5nZSB5b3UgaGFwcGVuIHRvIGJlIHdvcmtpbmcgb24sIHNvIHRoZSdcbiAgICAgICsgJyBidW1wIGhhcyB0byBhbnN3ZXIgZm9yIGFsbCBvZiB0aGVtLiBSZS1ydW4gdGhlIHJlbGVhc2Ugd2l0aCBhJ1xuICAgICAgKyBgICR7YnVtcEZsb29yLmxldmVsfSBidW1wIOKAlCBhIGhpZ2hlciBvbmUgaXMgYWx3YXlzIGFjY2VwdGVkLCBhbmQgbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHlldC5gXG4gICk7XG59XG5cbi8qKlxuICogUmVhZHMgb25lIGZpcnN0LXBhcmVudCBjb21taXQgaW50byB0aGUgcGFydHMgYm90aCBjaGFuZ2Vsb2cgc3R5bGVzIHJlbmRlcjogdGhlIGxpbmUge0BsaW5rIHRvQ2hhbmdlbG9nRW50cnl9XG4gKiBkZXNjcmliZXMsIHRoZSBpc3N1ZSByZWZlcmVuY2VzIGl0IGRvZXMgbm90IGFscmVhZHkgc2hvdywgYW5kIHdoYXQgZWxzZSB0aGUgYm9keSBzYXlzLlxuICpcbiAqIEBwYXJhbSBjb21taXRNZXNzYWdlIC0gVGhlIGZ1bGwgY29tbWl0IG1lc3NhZ2UuXG4gKiBAcmV0dXJucyBUaGUgcGFydHMsIHdpdGggYmFyZSBVUkxzIGluIHRoZSBlbnRyeSBhbmQgdGhlIGRldGFpbCBsaW5lcyBhdXRvbGlua2VkLlxuICovXG5mdW5jdGlvbiB0b0NoYW5nZWxvZ0NvbW1pdEVudHJ5KGNvbW1pdE1lc3NhZ2U6IHN0cmluZyk6IENoYW5nZWxvZ0NvbW1pdEVudHJ5IHtcbiAgY29uc3QgbGluZXMgPSBjb21taXRNZXNzYWdlLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzdWJqZWN0ID0gbGluZXNbMF0gPz8gJyc7XG4gIGNvbnN0IGJvZHlMaW5lcyA9IGxpbmVzLnNsaWNlKDEpO1xuICBjb25zdCBsaWZ0ZWRMaW5lID0gTUVSR0VfU1VCSkVDVF9SRUdfRVhQLnRlc3Qoc3ViamVjdCkgPyBib2R5TGluZXMuZmluZCgobGluZSkgPT4gIXBhcnNlSXNzdWVSZWZlcmVuY2VMaW5lKGxpbmUpKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZW50cnkgPSBsaWZ0ZWRMaW5lID8/IHN1YmplY3Q7XG4gIGNvbnN0IHJlZmVyZW5jZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgYm9keUxpbmVzLmZsYXRNYXAoKGxpbmUpID0+IHBhcnNlSXNzdWVSZWZlcmVuY2VMaW5lKGxpbmUpID8/IFtdKSkge1xuICAgIGlmIChyZWZlcmVuY2Uuc3BlbGxpbmdzLmV2ZXJ5KChzcGVsbGluZykgPT4gIW5ldyBSZWdFeHAoU3RyaW5nLnJhd2AoPzwhW1xcdy9dKSR7ZXNjYXBlUmVnRXhwKHNwZWxsaW5nKX0oPyFcXGQpYCkudGVzdChlbnRyeSkpKSB7XG4gICAgICByZWZlcmVuY2VzLmFkZChyZWZlcmVuY2UucmVuZGVyZWQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldGFpbExpbmVzID0gYm9keUxpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gbGlmdGVkTGluZSAmJiAhcGFyc2VJc3N1ZVJlZmVyZW5jZUxpbmUobGluZSkgJiYgIUJSRUFLSU5HX0NIQU5HRV9GT09URVJfUkVHX0VYUC50ZXN0KGxpbmUpKTtcbiAgcmV0dXJuIHtcbiAgICBkZXRhaWxMaW5lczogZGV0YWlsTGluZXMubWFwKChsaW5lKSA9PiBhdXRvbGlua0JhcmVVcmxzKGxpbmUudHJpbSgpKSksXG4gICAgZW50cnk6IGF1dG9saW5rQmFyZVVybHMoZW50cnkpLFxuICAgIGhhc0JyZWFraW5nRm9vdGVyOiBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX1JFR19FWFAudGVzdChjb21taXRNZXNzYWdlKSxcbiAgICByZWZlcmVuY2VzOiBbLi4ucmVmZXJlbmNlc11cbiAgfTtcbn1cblxuLyoqXG4gKiBUdXJucyBvbmUgZnVsbCBjb21taXQgbWVzc2FnZSAoYGdpdCBsb2cgLS1mb3JtYXQ9JUJgKSBpbnRvIHRoZSBjaGFuZ2Vsb2cgbGluZSBpdCBzaG91bGQgY29udHJpYnV0ZS5cbiAqXG4gKiBOb3JtYWxseSB0aGF0IGlzIHRoZSBzdWJqZWN0LiBUaGUgZXhjZXB0aW9uIGlzIGEgbWVyZ2Ugd2hvc2Ugc3ViamVjdCBnaXQgd3JvdGUgaXRzZWxmOiBmb3IgYSBub24tZmYgbWVyZ2VcbiAqIHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IElTIHRoZSBtZXJnZSBjb21taXQsIHNvIGl0cyBzdWJqZWN0IGlzIHdoYXQgc2hpcHMsIGFuZCBhIGRlZmF1bHQgb25lIHB1Ymxpc2hlcyBhXG4gKiBwcml2YXRlIGJyYW5jaCBuYW1lIGFzIGEgY2hhbmdlbG9nIGVudHJ5LiBUaGUgbWVzc2FnZSB0aGUgYXV0aG9yIGFjdHVhbGx5IHdyb3RlIGlzIHVzdWFsbHkgc3RpbGwgdGhlcmUg4oCUXG4gKiBvbmUgbGluZSBiZWxvdywgYXMgdGhlIG1lcmdlIGJvZHkg4oCUIHNvIGl0IGlzIGxpZnRlZCBvdXQgcmF0aGVyIHRoYW4gZGlzY2FyZGVkLCB3aGljaCBpcyBleGFjdGx5IHRoZSBlZGl0IGFcbiAqIGh1bWFuIG1ha2VzIGJ5IGhhbmQgYXQgdGhlIHJldmlldyBzdGVwLiBBIG1lcmdlIHdpdGggbm8gYm9keSBoYXMgbm90aGluZyB0byBsaWZ0IGFuZCBrZWVwcyBpdHMgc3ViamVjdDtcbiAqIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9IGlzIHdoYXQgc3RvcHMgdGhhdCBvbmUgZnJvbSBiZWluZyBwdWJsaXNoZWQuXG4gKlxuICogVGhlIGlzc3VlcyB0aGUgYm9keSBuYW1lcyBvbiB7QGxpbmsgSVNTVUVfUkVGRVJFTkNFX0xJTkVfUkVHX0VYUH0gbGluZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBsaW5lLCBzbyB0aGVcbiAqIHJlbGVhc2UgbGlua3MgdGhlbS4gT25seSB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCdzIGJvZHkgaXMgcmVhZCwgc28gZm9yIGEgbWVyZ2UgaXQgaXMgdGhlIG1lcmdlIG1lc3NhZ2UgdGhhdFxuICogaGFzIHRvIGNhcnJ5IHRoZW0uIEEgcmVmZXJlbmNlIHRoZSBsaW5lIGFscmVhZHkgc2hvd3MgaXMgbm90IHJlcGVhdGVkLlxuICpcbiAqIEBwYXJhbSBjb21taXRNZXNzYWdlIC0gVGhlIGZ1bGwgY29tbWl0IG1lc3NhZ2UuXG4gKiBAcmV0dXJucyBUaGUgY2hhbmdlbG9nIGxpbmUgZm9yIHRoYXQgY29tbWl0LlxuICovXG5mdW5jdGlvbiB0b0NoYW5nZWxvZ0VudHJ5KGNvbW1pdE1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZW50cnksIHJlZmVyZW5jZXMgfSA9IHRvQ2hhbmdlbG9nQ29tbWl0RW50cnkoY29tbWl0TWVzc2FnZSk7XG4gIHJldHVybiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCA/IGVudHJ5IDogYCR7ZW50cnl9ICgke3JlZmVyZW5jZXMuam9pbignLCAnKX0pYDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGVycm9yIHRoYXQgc3RvcHMgYSByZWxlYXNlIHdob3NlIG5ldyBjaGFuZ2Vsb2cgc2VjdGlvbiBkb2VzIG5vdCBwYXNzIGBsaW50Om1kYCBvciBgc3BlbGxjaGVja2AuXG4gKlxuICogSXQgaXMgdGhyb3duIGZyb20gdGhlIGNvbXBvc2l0aW9uIHN0ZXAsIHdoaWNoIGlzIEJFRk9SRSBhbnl0aGluZyBpcyB3cml0dGVuLCBzbyB0aGUgcmVjb3ZlcnkgaXQgZGVzY3JpYmVzIGlzXG4gKiB0aGUgd2hvbGUgcmVjb3Zlcnk6IHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV2ZXJ0LCBhbmQgdGhlIHJlbGVhc2UgcmUtcnVucyBmcm9tIHRoZSB0b3AuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzLCBhcyB7QGxpbmsgZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzfSBjb2xsZWN0ZWQgdGhlbS5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIHZlcnNpb24gd2hvc2Ugc2VjdGlvbiB3YXMgYmVpbmcgcHVibGlzaGVkLlxuICogQHJldHVybnMgVGhlIGVycm9yIHRvIHRocm93LlxuICovXG5mdW5jdGlvbiB0b0NoYW5nZWxvZ0ZpbmRpbmdzRXJyb3IoZmluZGluZ3M6IENoYW5nZWxvZ0ZpbmRpbmdbXSwgdmVyc2lvbjogc3RyaW5nKTogRXJyb3Ige1xuICBjb25zdCBzY3JpcHROYW1lcyA9IHRvRmFpbGVkU2NyaXB0TmFtZXMoZmluZGluZ3MpO1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGBUaGUgJHt2ZXJzaW9ufSBzZWN0aW9uIG9mICR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBkb2VzIG5vdCBwYXNzICR7c2NyaXB0TmFtZXN9OlxcbmBcbiAgICAgICsgYCR7dG9GaW5kaW5nTGluZXMoZmluZGluZ3MpfVxcbmBcbiAgICAgICsgJ1RoZSBjaGFuZ2Vsb2cgaXMgc2V0dGxlZCBiZWZvcmUgaXQgaXMgd3JpdHRlbiwgc28gdGhpcyBzdG9wcyB0aGUgcmVsZWFzZSB3aXRoIHRoZSByZXBvc2l0b3J5IHVudG91Y2hlZCdcbiAgICAgICsgJyBhbmQgbm90aGluZyB0byByZXZlcnQuIFRoZSBsaW5lIG51bWJlcnMgYXJlIHRoZSBvbmVzIHRoZSB3cml0dGVuIGZpbGUgd291bGQgaGF2ZSBoYWQuIEZpeCB0aGUgcmVsZWFzZSdcbiAgICAgICsgJyBub3RlcyDigJQgaW4gdGhlIHByZXBhcmVkIG5vdGVzIGZpbGUsIG9yIGluIHRoZSBjb21taXQgbWVzc2FnZXMgdGhleSB3ZXJlIGdlbmVyYXRlZCBmcm9tIOKAlCBvciwgZm9yIGEgd29yZCdcbiAgICAgICsgJyB0aGlzIHByb2plY3QgcmVhbGx5IGRvZXMgdXNlLCBhZGQgaXQgdG8gdGhlIHByb2plY3RcXCdzIGBjc3BlbGxgIGNvbmZpZ3VyYXRpb24sIGFuZCByZS1ydW4gdGhlIHJlbGVhc2UuJ1xuICAgICAgKyAnIFJlbGVhc2luZyBhbnl3YXkgd291bGQgbGFuZCB0aGUgZGVmZWN0IG9uIHRoZSBkZWZhdWx0IGJyYW5jaCBpbnNpZGUgdGhlIHJlbGVhc2UgY29tbWl0LCB3aGVyZSB0aGUgbmV4dCdcbiAgICAgICsgYCAke3NjcmlwdE5hbWVzfSBvbiBhbnlvbmUncyBicmFuY2ggcmVwb3J0cyBpdC5gXG4gICk7XG59XG5cbi8qKlxuICogV3JhcHMgb25lIHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiBpbiB0aGUgbWluaW1hbCBkb2N1bWVudCB0aGUgY2hlY2tzIGFyZSBoYW5kZWQuXG4gKlxuICogVGhlIHNlY3Rpb24gZ29lcyBpbnNpZGUgYSBkb2N1bWVudCByYXRoZXIgdGhhbiBvbiBpdHMgb3duLCBzbyB0aGUgaGVhZGluZyBhbmQgbGlzdCBydWxlcyBzZWUgdGhlXG4gKiBjb250ZXh0IHRoZXkgbmVlZCAoYSBkb2N1bWVudCB3aG9zZSBmaXJzdCBsaW5lIGlzIGEgbGlzdCBpdGVtIGlzIGEgZGlmZmVyZW50IGRvY3VtZW50KS4gVGhlIGxpbmUgbnVtYmVycyBhXG4gKiBmaW5kaW5nIHJlcG9ydHMgYXJlIHRoZW4gdGhlIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgJ3Mgb3duLCB3aGljaCBpcyBub3QgYSBjb2luY2lkZW5jZSBhbmQgaXMgd29ydGgga2VlcGluZzpcbiAqIGEgc2VjdGlvbiBpcyBQUkVQRU5ERUQsIHNvIHRoaXMgZG9jdW1lbnQgaXMgY2hhcmFjdGVyLWZvci1jaGFyYWN0ZXIgdGhlIGhlYWQgb2YgdGhlIGZpbGUgYWJvdXQgdG8gYmUgd3JpdHRlbi5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gaXMgYWJvdXQgdG8gYmUgcHVibGlzaGVkLlxuICogQHJldHVybnMgVGhlIG1pbmltYWwgZG9jdW1lbnQgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIHRvQ2hhbmdlbG9nU2VjdGlvbkRvY3VtZW50KGNoYW5nZWxvZ0NvbnRlbnQ6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGVhZGluZyA9IGAjIENIQU5HRUxPR1xcblxcbiMjICR7dmVyc2lvbn1gO1xuICBjb25zdCBzZWN0aW9uID0gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbik7XG4gIC8vIEFuIGVtcHR5IHNlY3Rpb24gaXMgYSByZWFsIHNoYXBlIOKAlCBhIHJlbGVhc2Ugd2l0aCBubyBjb21taXRzIHRvIGRlc2NyaWJlLCBvciBwcmVwYXJlZCBub3RlcyB0aGF0IGFyZSBhblxuICAvLyBlbXB0eSBmaWxlIOKAlCBhbmQgYXBwZW5kaW5nIGEgYmxhbmsgYm9keSB0byB0aGUgaGVhZGluZyB3b3VsZCByZXBvcnQgYSBkZWZlY3QgdGhpcyByZWxlYXNlIGRpZCBub3QgY29tbWl0LlxuICByZXR1cm4gc2VjdGlvbiA9PT0gJycgPyBgJHtoZWFkaW5nfVxcbmAgOiBgJHtoZWFkaW5nfVxcblxcbiR7c2VjdGlvbn1cXG5gO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgYC0tY2hhbmdlbG9nLXN0eWxlYCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgZmxhZydzIHZhbHVlLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IHdhcyBub3QgcGFzc2VkLlxuICogQHJldHVybnMgVGhlIHN0eWxlLCBvciBgdW5kZWZpbmVkYCBmb3IgdGhlIGRlZmF1bHQuXG4gKiBAdGhyb3dzIElmIHRoZSB2YWx1ZSBuYW1lcyBubyB7QGxpbmsgQ2hhbmdlbG9nU3R5bGV9LlxuICovXG5mdW5jdGlvbiB0b0NoYW5nZWxvZ1N0eWxlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBDaGFuZ2Vsb2dTdHlsZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHN0eWxlID0gQ0hBTkdFTE9HX1NUWUxFUy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSA9PT0gdmFsdWUpO1xuICBpZiAoIXN0eWxlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIC0tY2hhbmdlbG9nLXN0eWxlICcke3ZhbHVlfScuIFVzZSBvbmUgb2Y6ICR7Q0hBTkdFTE9HX1NUWUxFUy5qb2luKCcsICcpfS5gKTtcbiAgfVxuXG4gIHJldHVybiBzdHlsZTtcbn1cblxuLyoqXG4gKiBSZWFkcyBvZmYgd2hpY2ggcmVsZWFzZSBsaW5lIGEgdmVyc2lvbiBhY3R1YWxseSBtb3ZlcywgcmVsYXRpdmUgdG8gdGhlIGJhc2VsaW5lIGl0IGlzIGJlaW5nIGN1dCBmcm9tLlxuICpcbiAqIFRoaXMgaXMgbWVhc3VyZWQgcmF0aGVyIHRoYW4gcmVhZCBvZmYgdGhlIHJlcXVlc3RlZCB0eXBlIG9uIHB1cnBvc2UsIGJlY2F1c2UgdGhlIHR5cGUgZG9lcyBub3QgYWx3YXlzIHNheS5cbiAqIGBwcmVyZWxlYXNlYCBhZHZhbmNlcyB3aGljaGV2ZXIgbGluZSBhbiBlYXJsaWVyIGBwcmVtYWpvcmAgb3IgYHByZW1pbm9yYCBhbHJlYWR5IGNob3NlLCBhbmQgYW4gZXhwbGljaXRcbiAqIGB4LnkuemAgc2F5cyBub3RoaW5nIGF0IGFsbCB1bnRpbCBpdCBpcyBjb21wYXJlZC4gVGFraW5nIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgcmVzdWx0aW5nIHZlcnNpb24gYW5zd2VycyBhbGxcbiAqIG9mIHRoZW0gd2l0aCBvbmUgcnVsZSDigJQgYW5kIGl0IGFuc3dlcnMgdGhlbSB0aGUgd2F5IGEgY29uc3VtZXIncyBjYXJldCByYW5nZSBzZWVzIGl0LCB3aGljaCBpcyB0aGUgb25seVxuICogcmVhZGluZyB0aGF0IG1hdHRlcnMgZm9yIGEgcHVibGlzaGVkIHN1cmZhY2UuXG4gKlxuICogQHBhcmFtIGJhc2VWZXJzaW9uIC0gVGhlIHByZXZpb3VzIHJlbGVhc2VkIHZlcnNpb24uXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSB2ZXJzaW9uIGFib3V0IHRvIGJlIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgQnVtcExldmVsfSwgb3IgYG51bGxgIHdoZW4gZWl0aGVyIHZlcnNpb24gaXMgbm90IHBhcnNhYmxlIGFzIHNlbXZlci5cbiAqL1xuZnVuY3Rpb24gdG9FZmZlY3RpdmVCdW1wTGV2ZWwoYmFzZVZlcnNpb246IHN0cmluZywgbmV3VmVyc2lvbjogc3RyaW5nKTogQnVtcExldmVsIHwgbnVsbCB7XG4gIGNvbnN0IGJhc2UgPSBwYXJzZShiYXNlVmVyc2lvbik7XG4gIGNvbnN0IG5leHQgPSBwYXJzZShuZXdWZXJzaW9uKTtcbiAgaWYgKCFiYXNlIHx8ICFuZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobmV4dC5tYWpvciA+IGJhc2UubWFqb3IpIHtcbiAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3I7XG4gIH1cblxuICByZXR1cm4gbmV4dC5taW5vciA+IGJhc2UubWlub3IgPyBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vciA6IFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoO1xufVxuXG4vKipcbiAqIE5hbWVzIHRoZSBucG0gc2NyaXB0cyB0aGF0IGFjdHVhbGx5IHJlcG9ydGVkIHNvbWV0aGluZywgaW4gdGhlIG9yZGVyIHRoZXkgcmFuLlxuICpcbiAqIE5hbWluZyBib3RoIHVuY29uZGl0aW9uYWxseSB3b3VsZCBiZSB0aGUgZWFzeSB2ZXJzaW9uIGFuZCB3b3VsZCBiZSBhIGxpZSBoYWxmIHRoZSB0aW1lOiBhIHJlbGVhc2Ugc3RvcHBlZCBieVxuICogYSBjb2luZWQgd29yZCB3b3VsZCB0ZWxsIGl0cyBhdXRob3IgdG8gZ28gYW5kIGxvb2sgYXQgYGxpbnQ6bWRgLCB3aGljaCBwYXNzZWQuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIG5hbWUgdGhlIHNjcmlwdHMgb2YuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IG5hbWVzLCBqb2luZWQgZm9yIHByb3NlIOKAlCBgbGludDptZGAsIGBzcGVsbGNoZWNrYCwgb3IgYGxpbnQ6bWQgYW5kIHNwZWxsY2hlY2tgLlxuICovXG5mdW5jdGlvbiB0b0ZhaWxlZFNjcmlwdE5hbWVzKGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBzY3JpcHROYW1lcyA9IFtMSU5UX01EX1NDUklQVF9OQU1FLCBTUEVMTENIRUNLX1NDUklQVF9OQU1FXS5maWx0ZXIoKHNjcmlwdE5hbWUpID0+IGZpbmRpbmdzLnNvbWUoKGZpbmRpbmcpID0+IGZpbmRpbmcuc2NyaXB0TmFtZSA9PT0gc2NyaXB0TmFtZSkpO1xuICByZXR1cm4gc2NyaXB0TmFtZXMuam9pbignIGFuZCAnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBmaW5kaW5ncyBmb3IgYSBtZXNzYWdlLCBlYWNoIGxpbmUgdGFnZ2VkIHdpdGggdGhlIHNjcmlwdCB0aGF0IHJlcG9ydGVkIGl0LlxuICpcbiAqIFRoZSB0YWcgaXMgbm90IGRlY29yYXRpb246IHRoZSB0d28gdG9vbHMnIG91dHB1dCBzaGFwZXMgYXJlIHNpbWlsYXIgZW5vdWdoIHRvIGJlIG1pc3Rha2VuIGZvciBlYWNoIG90aGVyLFxuICogYW5kIHRoZSBmaXggZm9yIG9uZSBpcyBub3QgdGhlIGZpeCBmb3IgdGhlIG90aGVyLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byByZW5kZXIuXG4gKiBAcmV0dXJucyBUaGUgcmVuZGVyZWQgbGluZXMsIG9uZSBmaW5kaW5nIHBlciBsaW5lLlxuICovXG5mdW5jdGlvbiB0b0ZpbmRpbmdMaW5lcyhmaW5kaW5nczogQ2hhbmdlbG9nRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZpbmRpbmdzLm1hcCgoZmluZGluZykgPT4gYFske2ZpbmRpbmcuc2NyaXB0TmFtZX1dICR7ZmluZGluZy50ZXh0fWApLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIENsYXNzaWZpZXMgb25lIGBnaXQgbG9nIC0tZm9ybWF0PSVIJW4lQiAtemAgcmVjb3JkIGludG8gdGhlIHtAbGluayBGb3JjaW5nQ29tbWl0fSBpdCBpcywgb3IgYG51bGxgIHdoZW4gaXRcbiAqIGZvcmNlcyBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBPbmUgTlVMLWRlbGltaXRlZCByZWNvcmQ6IHRoZSBmdWxsIGhhc2ggb24gdGhlIGZpcnN0IGxpbmUsIHRoZSBmdWxsIGNvbW1pdCBtZXNzYWdlIGJlbG93IGl0LlxuICogQHJldHVybnMgVGhlIHtAbGluayBGb3JjaW5nQ29tbWl0fSwgb3IgYG51bGxgIGZvciBhIHJlY29yZCB0aGF0IGNvbnN0cmFpbnMgbm90aGluZyBvciBpcyBub3QgYSByZWNvcmQgYXQgYWxsXG4gKiAodGhlIHRyYWlsaW5nIGVtcHR5IHN0cmluZyBgLXpgIG91dHB1dCBlbmRzIHdpdGgsIGFtb25nIG90aGVycykuXG4gKi9cbmZ1bmN0aW9uIHRvRm9yY2luZ0NvbW1pdChyZWNvcmQ6IHN0cmluZyk6IEZvcmNpbmdDb21taXQgfCBudWxsIHtcbiAgLy8gVGhlIHRyYWlsaW5nIGVtcHR5IHJlY29yZCBgLXpgIGxlYXZlcyBoYXMgbm8gaGFzaCwgYW5kIGEgcmVjb3JkIHdpdGggbm8gbGluZSB1bmRlciB0aGUgaGFzaCBpcyBub3Qgb25lXG4gIC8vIHRoaXMgY2FuIGNsYXNzaWZ5LiBCb3RoIGFyZSB0aGUgc2FtZSBub24tYW5zd2VyLlxuICBjb25zdCBbc2hhLCBzdWJqZWN0TGluZSwgLi4uYm9keUxpbmVzXSA9IHJlY29yZC5zcGxpdCgnXFxuJyk7XG4gIGlmICghc2hhIHx8IHN1YmplY3RMaW5lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHN1YmplY3QgPSBzdWJqZWN0TGluZS50cmltKCk7XG4gIGNvbnN0IGJvZHkgPSBib2R5TGluZXMuam9pbignXFxuJyk7XG4gIGNvbnN0IHN1YmplY3RNYXRjaCA9IENPTlZFTlRJT05BTF9DT01NSVRfU1VCSkVDVF9SRUdfRVhQLmV4ZWMoc3ViamVjdCk7XG5cbiAgaWYgKHN1YmplY3RNYXRjaD8uZ3JvdXBzPy5bJ2JyZWFraW5nJ10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGV2ZWw6IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yLFxuICAgICAgbWFya2VyOiBCUkVBS0lOR19NQVJLRVIsXG4gICAgICBzaGEsXG4gICAgICBzdWJqZWN0XG4gICAgfTtcbiAgfVxuXG4gIGlmIChCUkVBS0lOR19DSEFOR0VfRk9PVEVSX1JFR19FWFAudGVzdChib2R5KSkge1xuICAgIHJldHVybiB7XG4gICAgICBsZXZlbDogVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IsXG4gICAgICBtYXJrZXI6IEJSRUFLSU5HX0NIQU5HRV9GT09URVJfTUFSS0VSLFxuICAgICAgc2hhLFxuICAgICAgc3ViamVjdFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3ViamVjdE1hdGNoPy5ncm91cHM/LlsndHlwZSddPy50b0xvd2VyQ2FzZSgpID09PSBGRUFUX1RZUEVcbiAgICA/IHtcbiAgICAgIGxldmVsOiBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vcixcbiAgICAgIG1hcmtlcjogRkVBVF9UWVBFX01BUktFUixcbiAgICAgIHNoYSxcbiAgICAgIHN1YmplY3RcbiAgICB9XG4gICAgOiBudWxsO1xufVxuXG4vKipcbiAqIFJlZHVjZXMgdGhlIGNvbW1pdHMgdGhhdCBmb3JjZSBzb21ldGhpbmcgdG8gdGhlIG9uZSBmbG9vciB0aGUgcmFuZ2UgYXMgYSB3aG9sZSBoYXMgdG8gY2xlYXIuXG4gKlxuICogQHBhcmFtIGZvcmNpbmdDb21taXRzIC0gVGhlIHtAbGluayBGb3JjaW5nQ29tbWl0fXMgZm91bmQgaW4gdGhlIHJhbmdlLlxuICogQHJldHVybnMgVGhlIGhpZ2hlc3Qge0BsaW5rIEJ1bXBMZXZlbH0gYW55IG9mIHRoZW0gZm9yY2VzLCBvciB7QGxpbmsgVmVyc2lvblVwZGF0ZVR5cGUuUGF0Y2h9IOKAlCBub1xuICogY29uc3RyYWludCDigJQgd2hlbiB0aGVyZSBhcmUgbm9uZS5cbiAqL1xuZnVuY3Rpb24gdG9IaWdoZXN0QnVtcExldmVsKGZvcmNpbmdDb21taXRzOiByZWFkb25seSBGb3JjaW5nQ29tbWl0W10pOiBCdW1wTGV2ZWwge1xuICBpZiAoZm9yY2luZ0NvbW1pdHMuc29tZSgoZm9yY2luZ0NvbW1pdCkgPT4gZm9yY2luZ0NvbW1pdC5sZXZlbCA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IpKSB7XG4gICAgcmV0dXJuIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yO1xuICB9XG5cbiAgcmV0dXJuIGZvcmNpbmdDb21taXRzLmxlbmd0aCA+IDAgPyBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vciA6IFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoO1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHB1YmxpYyByZWxlYXNlIG1ldGFkYXRhIGFuZCBjb21wbGV0ZWQgdXBsb2FkcyBiZWZvcmUgZXhwb3NpbmcgaXRzIHZlcnNpb24gb24gdGhlIGJyYW5jaC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBleGFjdCB2ZXJzaW9uIHRhZyBleHBlY3RlZCBvbiB0aGUgcmVsZWFzZS5cbiAqIEBwYXJhbSBmaWxlUGF0aHMgLSBUaGUgZmlsZXMgd2hvc2UgdXBsb2FkcyBtdXN0IGJlIGNvbXBsZXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb246IHN0cmluZywgZmlsZVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWxlYXNlID0gSlNPTi5wYXJzZShcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoW1xuICAgICAgJ2doJyxcbiAgICAgICdyZWxlYXNlJyxcbiAgICAgICd2aWV3JyxcbiAgICAgIG5ld1ZlcnNpb24sXG4gICAgICAnLS1qc29uJyxcbiAgICAgICdpc0RyYWZ0LGlzUHJlcmVsZWFzZSx0YWdOYW1lLGFzc2V0cydcbiAgICBdLCB7IGlzUXVpZXQ6IHRydWUgfSlcbiAgKSBhcyBHaXRIdWJSZWxlYXNlTWV0YWRhdGE7XG4gIGlmIChcbiAgICByZWxlYXNlLmlzRHJhZnQgfHwgcmVsZWFzZS50YWdOYW1lICE9PSBuZXdWZXJzaW9uIHx8IHJlbGVhc2UuaXNQcmVyZWxlYXNlICE9PSBpc1ByZVJlbGVhc2UobmV3VmVyc2lvbilcbiAgICB8fCBmaWxlUGF0aHMuc29tZSgocGF0aCkgPT4gcmVsZWFzZS5hc3NldHMuZXZlcnkoKGFzc2V0KSA9PiAhKGFzc2V0Lm5hbWUgPT09IGJhc2VuYW1lKHBhdGgpICYmIGFzc2V0LnN0YXRlID09PSAndXBsb2FkZWQnKSkpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHZlcmlmeSB0aGUgcHVibGljICR7bmV3VmVyc2lvbn0gcmVsZWFzZSBhbmQgaXRzIHVwbG9hZGVkIGFzc2V0czsgdGhlIHJlbW90ZSBicmFuY2ggd2FzIG5vdCBhZHZhbmNlZC5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgY29tcG9zZWQgY2hhbmdlbG9nIGludG8gdGhlIHJlcG9zaXRvcnkuIERlbGliZXJhdGVseSB0aGUgbGFzdCB0aGluZyB0aGUgY2hhbmdlbG9nIHN0ZXAgZG9lcyxcbiAqIHNvIG5vdGhpbmcgbGFuZHMgb24gZGlzayB1bnRpbCB0aGUgY29udGVudCBpcyBzZXR0bGVkLlxuICpcbiAqIEBwYXJhbSBuZXdDaGFuZ2VMb2cgLSBUaGUgc2V0dGxlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IHRvIHdyaXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2Vsb2cgaGFzIGJlZW4gd3JpdHRlbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVDaGFuZ2Vsb2cobmV3Q2hhbmdlTG9nOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgd3JpdGVGaWxlKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pLCBuZXdDaGFuZ2VMb2csICd1dGYtOCcpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7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QUFNLENBQUMsS0FBSyxhQUFhLEdBQUcsU0FBUyxJQUFJLE9BQU8sTUFBTSxJQUFJO0FBQzFELE1BQUksQ0FBQyxPQUFPLGdCQUFnQixRQUFXO0FBQ3JDLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxVQUFVLFlBQVksS0FBSztBQUNqQyxRQUFNLE9BQU8sVUFBVSxLQUFLLElBQUk7QUFDaEMsUUFBTSxlQUFlLG9DQUFvQyxLQUFLLE9BQU87QUFFckUsTUFBSSxjQUFjLFNBQVMsVUFBVSxHQUFHO0FBQ3RDLFdBQU87QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSwrQkFBK0IsS0FBSyxJQUFJLEdBQUc7QUFDN0MsV0FBTztBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1I7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLGNBQWMsU0FBUyxNQUFNLEdBQUcsWUFBWSxNQUFNLFlBQ3JEO0FBQUEsSUFDQSxPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQ0U7QUFDTjtBQVNBLFNBQVMsbUJBQW1CLGdCQUFxRDtBQUMvRSxNQUFJLGVBQWUsS0FBSyxDQUFDLGtCQUFrQixjQUFjLFVBQVUsbUJBQXVCLEdBQUc7QUFDM0YsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGVBQWUsU0FBUyxJQUFJLHNCQUEwQjtBQUMvRDtBQVFBLGVBQWUsb0JBQW9CLFlBQW9CLFdBQTZDO0FBQ2xHLFFBQU0sVUFBVSxLQUFLO0FBQUEsSUFDbkIsTUFBTSxhQUFhO0FBQUEsTUFDakI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsRUFDdEI7QUFDQSxNQUNFLFFBQVEsV0FBVyxRQUFRLFlBQVksY0FBYyxRQUFRLGlCQUFpQixhQUFhLFVBQVUsS0FDbEcsVUFBVSxLQUFLLENBQUMsU0FBUyxRQUFRLE9BQU8sTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLFNBQVMsU0FBUyxJQUFJLEtBQUssTUFBTSxVQUFVLFdBQVcsQ0FBQyxHQUMzSDtBQUNBLFVBQU0sSUFBSSxNQUFNLCtCQUErQixVQUFVLHVFQUF1RTtBQUFBLEVBQ2xJO0FBQ0Y7QUFTQSxlQUFlLGVBQWUsY0FBcUM7QUFDakUsUUFBTSxVQUFVLHdCQUF3QixFQUFFLE1BQU0sVUFBVSxZQUFZLENBQUMsR0FBRyxjQUFjLE9BQU87QUFDakc7IiwibmFtZXMiOlsiVmVyc2lvblVwZGF0ZVR5cGUiXX0=
911
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJzaW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHZlcnNpb24gdXBkYXRlcyBpbiBhIHByb2plY3QuXG4gKiBJdCBpbmNsdWRlcyB0YXNrcyBzdWNoIGFzIHZhbGlkYXRpbmcgdmVyc2lvbiB1cGRhdGUgdHlwZXMsIGNoZWNraW5nIHRoZSBzdGF0ZVxuICogb2YgR2l0IGFuZCBHaXRIdWIgQ0xJLCB1cGRhdGluZyB2ZXJzaW9uIG51bWJlcnMgaW4gZmlsZXMsIGFuZCBwZXJmb3JtaW5nXG4gKiBHaXQgb3BlcmF0aW9ucyBzdWNoIGFzIHRhZ2dpbmcgYW5kIHB1c2hpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQYXJzZUFyZ3NDb25maWcgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUgeyBSZWxlYXNlVHlwZSB9IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7XG4gIGVzY2FwZVJlZ0V4cCxcbiAgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZHRlbXAsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBiYXNlbmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lL3Byb21pc2VzJztcbmltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBpbmMsXG4gIHBhcnNlLFxuICBwcmVyZWxlYXNlXG59IGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ2hhbmdlbG9nQ29tbWl0RW50cnksXG4gIENoYW5nZWxvZ1N0eWxlXG59IGZyb20gJy4vY2hhbmdlbG9nLWdyb3VwaW5nLnRzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUxvY2tKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQge1xuICBDSEFOR0VMT0dfU1RZTEVTLFxuICByZW5kZXJHcm91cGVkQ2hhbmdlbG9nU2VjdGlvblxufSBmcm9tICcuL2NoYW5nZWxvZy1ncm91cGluZy50cyc7XG5pbXBvcnQge1xuICBmaW5kRm9yYmlkZGVuUGF0dGVybk1hdGNoZXMsXG4gIEZPUkJJRERFTl9QQVRURVJOU19GSUxFX0VOVl9WQVJJQUJMRSxcbiAgcmVhZEZvcmJpZGRlblBhdHRlcm5zXG59IGZyb20gJy4vZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmltcG9ydCB7IGdhdGUgfSBmcm9tICcuL2dhdGUudHMnO1xuaW1wb3J0IHsgc3BlbGxjaGVja0NvbnRlbnQgfSBmcm9tICcuL2xpbnRlcnMvY3NwZWxsLWNvbnRlbnQudHMnO1xuaW1wb3J0IHtcbiAgZml4TWFya2Rvd25Db250ZW50LFxuICBsaW50TWFya2Rvd25Db250ZW50XG59IGZyb20gJy4vbGludGVycy9tYXJrZG93bmxpbnQtY29udGVudC50cyc7XG5pbXBvcnQge1xuICBlZGl0TnBtU2hyaW5rV3JhcEpzb24sXG4gIGVkaXRQYWNrYWdlSnNvbixcbiAgZWRpdFBhY2thZ2VMb2NrSnNvbixcbiAgcmVhZFBhY2thZ2VKc29uXG59IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IGNsb3NlUmVsZWFzZWRJc3N1ZXMgfSBmcm9tICcuL3JlbGVhc2VkLWlzc3Vlcy50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBhZGRVcGRhdGVkRmlsZXNUb0dpdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwdWJsaXNoR2l0SHViUmVsZWFzZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZpbGVzIHRvIGF0dGFjaCB0byB0aGUgR2l0SHViIHJlbGVhc2UsIGFzIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuIEEgcGF0aCB0aGF0IGRvZXNcbiAgICogbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBgbnBtIHBhY2tgIHRhcmJhbGwgb2YgdGhlIHByb2plY3QsIHdyaXR0ZW4gaW50byBgZGlzdC9gLCBhbmQgYGRpc3Qvc3R5bGVzLmNzc2BcbiAgICovXG4gIHJlYWRvbmx5IGdldFJlbGVhc2VBc3NldFBhdGhzPzogKCgpID0+IFByb21pc2U8c3RyaW5nW10+KSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjbG9zZSB0aGUgaXNzdWVzIHRoZSByZWxlYXNlIGNhcnJpZXMgb25jZSBpdCBpcyBwdWJsaXNoZWQ6IGV2ZXJ5IGlzc3VlIGEgY29tbWl0IHNpbmNlIHRoZSBwcmV2aW91c1xuICAgKiB0YWcgbmFtZXMgd2l0aCBhIGNsb3Npbmcga2V5d29yZCAoYGZpeGVzICMxMmApIGlzIGNsb3NlZCB3aXRoIGEgYEZpeGVkIGluYCAvIGBJbXBsZW1lbnRlZCBpbmAgY29tbWVudCBsaW5raW5nXG4gICAqIHRoZSByZWxlYXNlLiBTZWUge0BsaW5rIGNsb3NlUmVsZWFzZWRJc3N1ZXN9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlcXVpcmUgZXZlcnkgYXNzZXQgdG8gZXhpc3QsIHJlcXVpcmUgYW4gZXhpc3RpbmcgcmVtb3RlIHRhZywgYW5kIHZlcmlmeSB0aGUgcHVibGlzaGVkXG4gICAqIG5vbi1kcmFmdCByZWxlYXNlIGFuZCBpdHMgdXBsb2FkZWQgYXNzZXRzIGJlZm9yZSBjbG9zaW5nIGlzc3Vlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5UmVsZWFzZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZUNoYW5nZWxvZ30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIHBhdGggdG8gYSBmaWxlIHdob3NlIGNvbnRlbnRzIGJlY29tZSB0aGUgYm9keSBvZiB0aGUgbmV3IHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiwgaW5zdGVhZCBvZlxuICAgKiB0aGUgYnVsbGV0cyBkZXJpdmVkIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlcy4gVXNlIGl0IHRvIHN1cHBseSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzIGZyb20gYVxuICAgKiBub24taW50ZXJhY3RpdmUgY2FsbGVyIChhIGJhY2tncm91bmQgcHJvY2VzcywgQ0ksIGFuIGFnZW50KS5cbiAgICpcbiAgICogU2V0dGluZyBpdCBpbXBsaWVzIG5vIGludGVyYWN0aXZlIHJldmlldzogdGhlIGNvbW1pdCBsb2cgaXMgbm90IHJlYWQsIGFuZCB0aGUgY2hhbmdlbG9nIGlzIG5ldmVyXG4gICAqIG9wZW5lZCBpbiB0aGUgZWRpdG9yIG5vciB3YWl0ZWQgb24gYXQgdGhlIGNvbnNvbGUsIHJlZ2FyZGxlc3Mgb2Yge0BsaW5rIHNob3VsZEVkaXRDaGFuZ2Vsb2d9LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCBzdWJqZWN0cyBzaW5jZSB0aGUgcHJldmlvdXMgdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nRmlsZVBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgc2VjdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzIGlzIGxhaWQgb3V0OiBgZ3JvdXBlZGAgc29ydHMgdGhlIGVudHJpZXMgdW5kZXIgcGxhaW4tbGFuZ3VhZ2VcbiAgICogaGVhZGluZ3MgYW5kIGNvdW50cyB0aGUgbWFpbnRlbmFuY2UgY29tbWl0cyBpbnN0ZWFkIG9mIGxpc3RpbmcgdGhlbSwgYGNvbW1pdHNgIHdyaXRlcyBvbmUgYnVsbGV0IHBlciBmaXJzdC1wYXJlbnRcbiAgICogY29tbWl0LiBTZWUge0BsaW5rIENoYW5nZWxvZ1N0eWxlfS5cbiAgICpcbiAgICogSWdub3JlZCB3aGVuIHtAbGluayBjaGFuZ2Vsb2dGaWxlUGF0aH0gaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2dyb3VwZWQnYFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nU3R5bGU/OiBDaGFuZ2Vsb2dTdHlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBvcGVuIHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIGluIHRoZSBlZGl0b3IgZm9yIGFuIGludGVyYWN0aXZlIHJldmlldy4gV2hlbiBgZmFsc2VgLFxuICAgKiB0aGUgY2hhbmdlbG9nIGlzIHN0aWxsIGdlbmVyYXRlZCBmcm9tIGNvbW1pdCBtZXNzYWdlcywgYnV0IGl0IGlzIG5vdCBvcGVuZWQgaW4gdGhlIGVkaXRvciBmb3JcbiAgICogbWFudWFsIHJldmlldy5cbiAgICpcbiAgICogSWdub3JlZCB3aGVuIHtAbGluayBjaGFuZ2Vsb2dGaWxlUGF0aH0gaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVWZXJzaW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVWZXJzaW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIHBhdGggdG8gYSBmaWxlIHdob3NlIGNvbnRlbnRzIGJlY29tZSB0aGUgYm9keSBvZiB0aGUgbmV3IHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiwgaW5zdGVhZCBvZlxuICAgKiB0aGUgYnVsbGV0cyBkZXJpdmVkIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlcy4gVXNlIGl0IHRvIHN1cHBseSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzIGZyb20gYVxuICAgKiBub24taW50ZXJhY3RpdmUgY2FsbGVyIChhIGJhY2tncm91bmQgcHJvY2VzcywgQ0ksIGFuIGFnZW50KS5cbiAgICpcbiAgICogU2V0dGluZyBpdCBpbXBsaWVzIG5vIGludGVyYWN0aXZlIHJldmlldzogdGhlIGNvbW1pdCBsb2cgaXMgbm90IHJlYWQsIGFuZCB0aGUgY2hhbmdlbG9nIGlzIG5ldmVyXG4gICAqIG9wZW5lZCBpbiB0aGUgZWRpdG9yIG5vciB3YWl0ZWQgb24gYXQgdGhlIGNvbnNvbGUsIHJlZ2FyZGxlc3Mgb2Yge0BsaW5rIHNob3VsZEVkaXRDaGFuZ2Vsb2d9LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCBzdWJqZWN0cyBzaW5jZSB0aGUgcHJldmlvdXMgdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nRmlsZVBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgc2VjdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzIGlzIGxhaWQgb3V0LiBTZWUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMuY2hhbmdlbG9nU3R5bGV9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2dyb3VwZWQnYFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nU3R5bGU/OiBDaGFuZ2Vsb2dTdHlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmlsZXMgdG8gYXR0YWNoIHRvIHRoZSBHaXRIdWIgcmVsZWFzZS4gU2VlIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuZ2V0UmVsZWFzZUFzc2V0UGF0aHN9LlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0UmVsZWFzZUFzc2V0UGF0aHM/OiAoKCkgPT4gUHJvbWlzZTxzdHJpbmdbXT4pIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIEdpdEh1YiByZWxlYXNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIEdpdEh1YiByZWxlYXNlIGhhcyBiZWVuIHByZXBhcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlcGFyZUdpdEh1YlJlbGVhc2U/OiAobmV3VmVyc2lvbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgYnVpbGQgc3RlcC4gVGhlIGJ1aWxkIGlzIGEgcHVibGlzaGluZyBwcmVyZXF1aXNpdGUsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjayxcbiAgICogc28gaXQgaXMgZ292ZXJuZWQgYnkgdGhpcyBmbGFnIGluZGVwZW5kZW50bHkgb2Yge0BsaW5rIHNob3VsZFJ1bkNoZWNrc30g4oCUIGl0IHJ1bnMgZXZlbiB3aGVuIHRoZVxuICAgKiBjaGVja3MgYXJlIHNraXBwZWQsIHNvIGEgZmFzdCByZWxlYXNlIHN0aWxsIHNoaXBzIGZyZXNoIGFydGlmYWN0cy4gU2V0IHRvIGBmYWxzZWAgb25seSB3aGVuIHRoZVxuICAgKiBidWlsZCBvdXRwdXQgaXMga25vd24gdG8gYWxyZWFkeSBtYXRjaCB0aGUgY3VycmVudCBjb2RlOyBvdGhlcndpc2UgdGhlIHJlbGVhc2Ugd291bGQgcHVibGlzaFxuICAgKiBzdGFsZSBhcnRpZmFjdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNsb3NlIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2FycmllcyBvbmNlIGl0IGlzIHB1Ymxpc2hlZC4gU2VlXG4gICAqIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlc30uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgY2hhbmdlbG9nRmlsZVBhdGh9IGlzIHNldC4gV2hlbiBpdCBpcyBuZWl0aGVyIHNldCBub3IgZGlzYWJsZWQsIHRoZSByZWxlYXNlXG4gICAqIHJlcXVpcmVzIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCBhbmQge0BsaW5rIHVwZGF0ZVZlcnNpb259IHJlZnVzZXMgdXAgZnJvbnQgd2l0aG91dCBvbmUgcmF0aGVyXG4gICAqIHRoYW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yIG5vYm9keSB3aWxsIGNsb3NlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggYW5kIHZlcmlmeSB0aGUgR2l0SHViIHJlbGVhc2UgYmVmb3JlIHB1c2hpbmcgdGhlIHZlcnNpb24gY29tbWl0IHRvIHRoZSBicmFuY2guXG4gICAqIFByZXBhcmF0aW9uIGFuZCBhc3NldCB2YWxpZGF0aW9uIGhhcHBlbiBiZWZvcmUgYW55IHB1c2guIE9ubHkgdGhlIHJlbGVhc2UgdGFnIGlzIHB1c2hlZCBmaXJzdDtcbiAgICogYSBmYWlsZWQgcHJlcGFyYXRpb24sIHB1YmxpY2F0aW9uIG9yIHZlcmlmaWNhdGlvbiBsZWF2ZXMgdGhlIHJlbW90ZSBicmFuY2ggdW5jaGFuZ2VkLlxuICAgKiBVc2VzIHRoZSBgb3JpZ2luYCByZW1vdGUgYW5kIHB1c2hlcyB0aGUgdmVyaWZpZWQgY29tbWl0IHRvIHRoZSBvcmlnaW5hbCBicmFuY2ggd2l0aG91dCBmb3JjZS5cbiAgICogSWdub3JlZCB3aGVuIHtAbGluayBzaG91bGRSZWxlYXNlfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQdWJsaXNoQmVmb3JlUHVzaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHVibGlzaCB0aGUgcmVsZWFzZS4gV2hlbiBgZmFsc2VgLCBhbGwgbG9jYWwgc3RlcHMgYXJlIGV4ZWN1dGVkICh2ZXJzaW9uIGJ1bXAsXG4gICAqIGNoYW5nZWxvZywgY29tbWl0LCB0YWcpLCBidXQgdGhlIGNoYW5nZXMgYXJlIG5vdCBwdXNoZWQgYW5kIG5vIEdpdEh1YiByZWxlYXNlIGlzIHB1Ymxpc2hlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZWZsaWdodCB2ZXJpZmljYXRpb24gY2hlY2tzIChjbGVhbi1yZXBvIGNoZWNrLCBmb3JtYXQsIHNwZWxsY2hlY2ssIGxpbnQsXG4gICAqIG92ZXItZXhwb3N1cmUgYW5hbHlzaXMsIGFuZCB0ZXN0cykuIFRoZSBidWlsZCBzdGVwIGlzIG5vdCBvbmUgb2YgdGhlc2UgY2hlY2tzIOKAlCBpdCBpcyBnb3Zlcm5lZFxuICAgKiBzZXBhcmF0ZWx5IGJ5IHtAbGluayBzaG91bGRCdWlsZH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUnVuQ2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZS1jb21taXQgaG9vayB3aGVuIGNyZWF0aW5nIHRoZSByZWxlYXNlIGNvbW1pdC4gV2hlbiBgZmFsc2VgLCBgLS1uby12ZXJpZnlgXG4gICAqIGlzIHBhc3NlZCB0byB0aGUgcmVsZWFzZSBjb21taXQgdG8gc2tpcCB0aGUgaG9vay5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRWZXJpZnlDb21taXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIGluIGFueSBmaWxlIGJleW9uZCBgcGFja2FnZS5qc29uYCBhbmQgdGhlIGxvY2tmaWxlcywgb25jZSB0aGUgbmV3IHZlcnNpb24gaXMga25vd24gYW5kXG4gICAqIGJlZm9yZSB0aGUgcmVsZWFzZSBjb21taXQgaXMgbWFkZS4gQW4gT2JzaWRpYW4gcGx1Z2luJ3MgYG1hbmlmZXN0Lmpzb25gIGFuZCBgdmVyc2lvbnMuanNvbmAgYXJlIHRoZSBjYXNlIHRoaXNcbiAgICogZXhpc3RzIGZvci5cbiAgICpcbiAgICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgdmVyc2lvbiBiZWluZyByZWxlYXNlZC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlcyBhcmUgdXBkYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZVZlcnNpb25JbkV4dHJhRmlsZXM/OiAoKG5ld1ZlcnNpb246IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGxvd2VzdCBidW1wIGEgcmFuZ2Ugb2YgY29tbWl0cyBtYXkgYmUgcHVibGlzaGVkIHVuZGVyLCBhbmQgdGhlIGNvbW1pdHMgdGhhdCBmb3JjZSBpdC5cbiAqL1xuaW50ZXJmYWNlIEJ1bXBGbG9vciB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0cyB3aG9zZSBDb252ZW50aW9uYWwtQ29tbWl0cyBtYXJrZXJzIGZvcmNlIHtAbGluayBsZXZlbH0sIGluIHRoZSBvcmRlciBgZ2l0IGxvZ2AgcmVwb3J0ZWQgdGhlbS5cbiAgICogRW1wdHkgd2hlbiBub3RoaW5nIGZvcmNlcyBhbnl0aGluZywgd2hpY2ggaXMgdGhlIG9yZGluYXJ5IGNhc2UgZm9yIGEgcmFuZ2Ugb2YgYGZpeGBlcyBhbmQgYGNob3JlYHMuXG4gICAqL1xuICByZWFkb25seSBmb3JjaW5nQ29tbWl0czogcmVhZG9ubHkgRm9yY2luZ0NvbW1pdFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbG93ZXN0IHtAbGluayBCdW1wTGV2ZWx9IHRoZSByYW5nZSBtYXkgc2hpcCBhcy5cbiAgICovXG4gIHJlYWRvbmx5IGxldmVsOiBCdW1wTGV2ZWw7XG59XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgdG9CdW1wRmxvb3JFcnJvcn0gbmVlZHMgYmV5b25kIHRoZSB7QGxpbmsgQnVtcEZsb29yfSBpdHNlbGYgdG8gc2F5IHdoYXQgd2FzIGFza2VkIGZvciBhbmQgd2hhdFxuICogdGhhdCB3b3VsZCBoYXZlIHNoaXBwZWQgYXMuXG4gKi9cbmludGVyZmFjZSBCdW1wRmxvb3JSZWZ1c2FsQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgcHJldmlvdXMgcmVsZWFzZSB0YWcgdGhlIHJhbmdlIHdhcyBtZWFzdXJlZCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFRhZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiB0aGUgcmVxdWVzdGVkIGJ1bXAgd291bGQgaGF2ZSBwcm9kdWNlZC5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1ZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHtAbGluayBCdW1wTGV2ZWx9IHtAbGluayBuZXdWZXJzaW9ufSBhY3R1YWxseSBtb3ZlcywgcmVsYXRpdmUgdG8ge0BsaW5rIGxhc3RUYWd9LlxuICAgKi9cbiAgcmVhZG9ubHkgdGFrZW5MZXZlbDogQnVtcExldmVsO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0aGUgcmVsZWFzZSB3YXMgYXNrZWQgZm9yLCB2ZXJiYXRpbSDigJQgd2hpY2ggaXMgYSBwcmUtcmVsZWFzZSB0eXBlIG9yIGFuIGV4cGxpY2l0XG4gICAqIHZlcnNpb24gYXMgb2Z0ZW4gYXMgaXQgaXMgYSBwbGFpbiBgcGF0Y2hgLCBhbmQgaXMgdGhlcmVmb3JlIHdvcnRoIHF1b3RpbmcgYmFjayByYXRoZXIgdGhhbiBpbmZlcnJpbmcuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB0aHJlZSByZWxlYXNlIGxpbmVzIGEgYnVtcCBjYW4gbW92ZSwgb3JkZXJlZCBieSB7QGxpbmsgaXNCdW1wTGV2ZWxBdExlYXN0fS5cbiAqXG4gKiBBIHByZS1yZWxlYXNlIHR5cGUgaXMgbm90IG9uZSBvZiB0aGVzZTogYHByZW1ham9yYCBtb3ZlcyB0aGUgbWFqb3IgbGluZSBhbmQgYHByZXJlbGVhc2VgIG1vdmVzIHdoaWNoZXZlclxuICogbGluZSBhbiBlYXJsaWVyIHByZS1yZWxlYXNlIGFscmVhZHkgY2hvc2UsIHNvIHdoYXQgYSBwcmUtcmVsZWFzZSBkaWQgaXMgcmVhZCBvZmYgdGhlIHJlc3VsdGluZyB2ZXJzaW9uXG4gKiByYXRoZXIgdGhhbiBvZmYgaXRzIHR5cGUuIFNlZSB7QGxpbmsgdG9FZmZlY3RpdmVCdW1wTGV2ZWx9LlxuICovXG50eXBlIEJ1bXBMZXZlbCA9IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yIHwgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IgfCBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcblxuLyoqXG4gKiBPbmUgZmluZGluZyByZXBvcnRlZCBvdmVyIHRoZSBzZXR0bGVkIGNoYW5nZWxvZyBzZWN0aW9uLCB0YWdnZWQgd2l0aCB0aGUgbnBtIHNjcmlwdCB3aG9zZSBjaGVjayBwcm9kdWNlZCBpdC5cbiAqXG4gKiBUaGUgdGFnIGlzIHdoYXQgbGV0cyBvbmUgbWVzc2FnZSBuYW1lIGBsaW50Om1kYCwgYHNwZWxsY2hlY2tgIG9yIGJvdGgsIHRydXRoZnVsbHkuIEJvdGggY2hlY2tzIHJ1biBvdmVyXG4gKiBldmVyeSBzZXR0bGUsIHNvIGFuIGF1dGhvciB3aG8gaGFzIHRvIGZpeCBhIGhhcmQtd3JhcHBlZCBsaW5lIGFuZCBhIGNvaW5lZCB3b3JkIGZpeGVzIHRoZW0gaW4gT05FIHJvdW5kIG9mXG4gKiB0aGUgcmV2aWV3IHJhdGhlciB0aGFuIGJlaW5nIHNlbnQgYmFjayB0d2ljZS5cbiAqL1xuaW50ZXJmYWNlIENoYW5nZWxvZ0ZpbmRpbmcge1xuICAvKipcbiAgICogVGhlIG5wbSBzY3JpcHQgdGhhdCB3b3VsZCBoYXZlIHJlcG9ydGVkIHRoaXMgb24gdGhlIGJyYW5jaC5cbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlcG9ydGVkIGxpbmUsIGV4YWN0bHkgYXMgdGhhdCBzY3JpcHQncyBvd24gb3V0cHV0IHdvdWxkIGhhdmUgY2FycmllZCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgY29tbWl0IHRoYXQgZm9yY2VzIGEge0BsaW5rIEJ1bXBGbG9vcn0sIHJlbmRlcmVkIGludG8gdGhlIHJlZnVzYWwgc28gdGhlIGF1dGhvciBjYW4gZ28gYW5kIGxvb2sgYXQgaXQuXG4gKi9cbmludGVyZmFjZSBGb3JjaW5nQ29tbWl0IHtcbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgQnVtcExldmVsfSB0aGlzIG9uZSBjb21taXQgZm9yY2VzIG9uIGl0cyBvd24uXG4gICAqL1xuICByZWFkb25seSBsZXZlbDogQnVtcExldmVsO1xuXG4gIC8qKlxuICAgKiBXaGF0IGluIHRoZSBjb21taXQgZm9yY2VkIGl0IOKAlCB0aGUgYCFgIG1hcmtlciwgdGhlIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXIsIG9yIHRoZSBgZmVhdGAgdHlwZSDigJQgbmFtZWRcbiAgICogc28gYSByZWFkZXIgY2FuIHRlbGwgYSBkZWxpYmVyYXRlIGJyZWFraW5nIG1hcmtlciBmcm9tIGEgZm9vdGVyIHNvbWVib2R5IHdyb3RlIGluIHBhc3NpbmcuXG4gICAqL1xuICByZWFkb25seSBtYXJrZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bGwgY29tbWl0IGhhc2guXG4gICAqL1xuICByZWFkb25seSBzaGE6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbW1pdCBzdWJqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTnBtUGFja1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGZpbGVuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBgQlJFQUtJTkcgQ0hBTkdFOmAgZm9vdGVyLCBpbiBib3RoIHNwZWxsaW5ncyBDb252ZW50aW9uYWwgQ29tbWl0cyBhbGxvd3MuXG4gKlxuICogTWF0Y2hlZCBwZXIgbGluZSAoYG1gKSByYXRoZXIgdGhhbiBhZ2FpbnN0IHRoZSB3aG9sZSBtZXNzYWdlLCBiZWNhdXNlIGEgZm9vdGVyIHNpdHMgYXQgdGhlIGJvdHRvbSBvZiB0aGVcbiAqIGJvZHkuIEl0IGlzIHRoZSBoYWxmIG9mIHRoZSBicmVha2luZy1jaGFuZ2Ugc2lnbmFsIHRoYXQge0BsaW5rIE1FUkdFX1NVQkpFQ1RfUkVHX0VYUH0ncyBzaWJsaW5nIHJld3JpdGVcbiAqIGNhbm5vdCBjYXJyeTogYHRvQ2hhbmdlbG9nRW50cnlgIGxpZnRzIG9ubHkgdGhlIG1lcmdlIGJvZHkncyBmaXJzdCBsaW5lIG9udG8gdGhlIG1lcmdlIHN1YmplY3QsIHNvIGEgZm9vdGVyXG4gKiB3cml0dGVuIG9uIGEgYnJhbmNoIGNvbW1pdCBuZXZlciByZWFjaGVzIHRoZSBmaXJzdC1wYXJlbnQgaGlzdG9yeSBhdCBhbGwuIFRoYXQgaXMgd2h5XG4gKiB7QGxpbmsgZ2V0QnVtcEZsb29yfSByZWFkcyBldmVyeSBjb21taXQgaW4gdGhlIHJhbmdlIHJhdGhlciB0aGFuIG9ubHkgdGhlIGZpcnN0LXBhcmVudCBvbmVzLlxuICovXG5jb25zdCBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX1JFR19FWFAgPSAvXkJSRUFLSU5HWyAtXUNIQU5HRTovbTtcblxuLyoqXG4gKiBUaGUgbWFya2VyIG5hbWVzIGEge0BsaW5rIEZvcmNpbmdDb21taXR9IGNhcnJpZXMsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGUgcmVmdXNhbCBtZXNzYWdlIHNheXMgZm9yY2VkIHRoZVxuICogZmxvb3IuIFRoZXkgYXJlIHNwZWxsZWQgb3V0IHJhdGhlciB0aGFuIHJlZHVjZWQgdG8gdGhlIGxldmVsIGFsb25lLCBiZWNhdXNlIGBmZWF0IWAgYW5kIGEgYEJSRUFLSU5HIENIQU5HRTpgXG4gKiBmb290ZXIgYnVyaWVkIGluIGEgYm9keSBhcmUgdmVyeSBkaWZmZXJlbnQgdGhpbmdzIHRvIGJlIHRvbGQgYWJvdXQuXG4gKi9cbmNvbnN0IEJSRUFLSU5HX0NIQU5HRV9GT09URVJfTUFSS0VSID0gJ2EgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3Rlcic7XG5cbi8qKlxuICogU2VlIHtAbGluayBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX01BUktFUn0uXG4gKi9cbmNvbnN0IEJSRUFLSU5HX01BUktFUiA9ICd0aGUgYCFgIGJyZWFraW5nIG1hcmtlcic7XG5cbi8qKlxuICogU2VlIHtAbGluayBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX01BUktFUn0uXG4gKi9cbmNvbnN0IEZFQVRfVFlQRV9NQVJLRVIgPSAnYSBgZmVhdGAgdHlwZSc7XG5cbi8qKlxuICogQSBDb252ZW50aW9uYWwtQ29tbWl0cyBzdWJqZWN0OiBhIHR5cGUsIGFuIG9wdGlvbmFsIHNjb3BlLCBhbiBvcHRpb25hbCBgIWAsIHRoZW4gdGhlIGNvbG9uLlxuICpcbiAqIERlbGliZXJhdGVseSB0b2xlcmFudCBvZiBhIHN1YmplY3QgdGhhdCBpcyBub3Qgb25lIGF0IGFsbCDigJQgYW4gdW5wYXJzYWJsZSBzdWJqZWN0IHNpbXBseSBjb25zdHJhaW5zXG4gKiBub3RoaW5nLCB3aGljaCBpcyB0aGUgc2FtZSBhbnN3ZXIgYSBgY2hvcmU6YCBnaXZlcy4gVGhpcyBnYXRlIGV4aXN0cyB0byBjYXRjaCBhIGJ1bXAgdGhhdCBpcyB0b28gTE9XLCBzb1xuICogZmFpbGluZyB0byByZWNvZ25pemUgYSBzdWJqZWN0IGNhbiBvbmx5IHVuZGVyLWNvbnN0cmFpbiwgbmV2ZXIgcmVmdXNlIGEgcmVsZWFzZSB0aGF0IHNob3VsZCBoYXZlIHNoaXBwZWQuXG4gKi9cbmNvbnN0IENPTlZFTlRJT05BTF9DT01NSVRfU1VCSkVDVF9SRUdfRVhQID0gL14oPzx0eXBlPlthLXpdKykoPzpcXChbXigpXSpcXCkpPyg/PGJyZWFraW5nPiEpPzpcXHMvaTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBwcmUtcmVsZWFzZSBpZGVudGlmaWVyIHVzZWQgZm9yIHByZS1yZWxlYXNlIHZlcnNpb25zLlxuICovXG5jb25zdCBERUZBVUxUX1BSRUlEID0gJ2JldGEnO1xuXG4vKipcbiAqIFRoZSBDb252ZW50aW9uYWwtQ29tbWl0cyB0eXBlIHRoYXQgZm9yY2VzIGEgbWlub3IuXG4gKi9cbmNvbnN0IEZFQVRfVFlQRSA9ICdmZWF0JztcblxuLyoqXG4gKiBPbmUgaXNzdWUgcmVmZXJlbmNlIGluc2lkZSBhbiB7QGxpbmsgSVNTVUVfUkVGRVJFTkNFX0xJTkVfUkVHX0VYUH0gbGluZTogYW4gaXNzdWUgb3IgcHVsbCByZXF1ZXN0IFVSTCwgYW5cbiAqIGBvd25lci9yZXBvI25gLCBvciBhIGJhcmUgYCNuYC5cbiAqL1xuY29uc3QgSVNTVUVfUkVGRVJFTkNFX1JFR19FWFAgPSAvaHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvKD88dXJsU2x1Zz5bXFx3Li1dK1xcL1tcXHcuLV0rKVxcLyg/Omlzc3Vlc3xwdWxsKVxcLyg/PHVybE51bWJlcj5cXGQrKXwoPzwhW1xcdy4vLV0pKD88c2x1Zz5bXFx3Li1dK1xcL1tcXHcuLV0rKSMoPzxzbHVnTnVtYmVyPlxcZCspXFxifCg/PCFbXFx3LyYjLi1dKSMoPzxiYXJlTnVtYmVyPlxcZCspXFxiL2c7XG5cbi8qKlxuICogQSBjb21taXQgYm9keSBsaW5lIHRoYXQgbmFtZXMgdGhlIGlzc3VlcyB0aGUgY29tbWl0IHdvcmtzIG9uOiBgUmVmcyBvd25lci9yZXBvIzEyYCwgYEZpeGVzICMzYCxcbiAqIGBDbG9zZXMgaHR0cHM6Ly9naXRodWIuY29tL293bmVyL3JlcG8vaXNzdWVzLzQsICM1YC4gVGhlIGtleXdvcmQgaXMgZm9sbG93ZWQgYnkgcmVmZXJlbmNlcyBhbmQgbm90aGluZyBlbHNlXG4gKiAoc2VlIHtAbGluayBwYXJzZUlzc3VlUmVmZXJlbmNlTGluZX0pLCBzbyBhIHByb3NlIGxpbmUgdGhhdCBtZXJlbHkgb3BlbnMgd2l0aCBgRml4ZXNgIG5hbWVzIG5vdGhpbmcuXG4gKlxuICogQSBmaXggbWFkZSBpbiBvbmUgcmVwb3NpdG9yeSBmb3IgYW4gaXNzdWUgaW4gYW5vdGhlciBjbG9zZXMgbm90aGluZyBoZXJlLCBhbmQgaXRzIGNvbW1pdCBzdWJqZWN0IGNhbm5vdCBjYXJyeVxuICogdGhlIG90aGVyIHJlcG9zaXRvcnkncyBudW1iZXIsIHNvIHRoaXMgbGluZSBpcyB0aGUgb25seSBwbGFjZSB0aGUgcmVsZWFzZSBjYW4gbGVhcm4gd2hpY2ggaXNzdWUgaXQgZml4ZXMuXG4gKi9cbmNvbnN0IElTU1VFX1JFRkVSRU5DRV9MSU5FX1JFR19FWFAgPSAvXig/OnJlZnM/fHJlfGZpeCg/OmVbc2RdKT98Y2xvc2Vbc2RdP3xyZXNvbHZlW3NkXT98aW1wbGVtZW50cz8pOj9cXHMrKD88cmVmZXJlbmNlcz4uKykkL2k7XG5cbi8qKlxuICogVGhlIG5wbSBzY3JpcHRzIHdob3NlIGNoZWNrcyB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cgaXMgaGVsZCB0bywgbmFtZWQgaW4gdGhlIG1lc3NhZ2VzIHNvIGEgcmVhZGVyIGtub3dzIHdoaWNoXG4gKiBnYXRlIHRoZXkgYXJlIGxvb2tpbmcgYXQg4oCUIGFuZCBrbm93cyB0aGF0IGZpeGluZyBpdCBoZXJlIGlzIHRoZSBzYW1lIGZpeCBhcyBmaXhpbmcgaXQgb24gdGhlIGJyYW5jaC5cbiAqL1xuY29uc3QgTElOVF9NRF9TQ1JJUFRfTkFNRSA9ICdsaW50Om1kJztcblxuLyoqXG4gKiBIb3cgbXVjaCBvZiBhIGNvbW1pdCBoYXNoIHRoZSBidW1wLWZsb29yIHJlZnVzYWwgcHJpbnRzLiBMb25nIGVub3VnaCB0byBwYXN0ZSBpbnRvIGBnaXQgc2hvd2AsIHNob3J0IGVub3VnaFxuICogdGhhdCBhIGxpc3Qgb2YgdGhlbSBzdGF5cyByZWFkYWJsZS5cbiAqL1xuY29uc3QgU0hPUlRfU0hBX0xFTkdUSCA9IDg7XG5cbi8qKlxuICogU2VlIHtAbGluayBMSU5UX01EX1NDUklQVF9OQU1FfS5cbiAqL1xuY29uc3QgU1BFTExDSEVDS19TQ1JJUFRfTkFNRSA9ICdzcGVsbGNoZWNrJztcblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgYSBtZXJnZSBzdWJqZWN0IGdpdCB3cm90ZSBpdHNlbGYsIHJhdGhlciB0aGFuIG9uZSBhbiBhdXRob3IgY2hvc2UuXG4gKlxuICogRXZlcnkgZGVmYXVsdCBnaXQgcHJvZHVjZXMgb3BlbnMgd2l0aCBgTWVyZ2VgIGFuZCBhIHdvcmQgYm91bmRhcnkg4oCUIGBNZXJnZSBicmFuY2ggJ3gnYCxcbiAqIGBNZXJnZSBicmFuY2hlcyAneCcgYW5kICd5J2AsIGBNZXJnZSByZW1vdGUtdHJhY2tpbmcgYnJhbmNoICd4J2AsIGBNZXJnZSBwdWxsIHJlcXVlc3QgIzEgZnJvbSB5YCxcbiAqIGBNZXJnZSB0YWcgJ3gnYCwgYE1lcmdlIGNvbW1pdCAnYWJjJ2Ag4oCUIHdoaWNoIGlzIHdoYXQgdGhlIG9wdGlvbmFsIGFsdGVybmF0aW9uIGFuZCB0aGUgdHJhaWxpbmcgYFxcYmAgY292ZXJcbiAqIGJldHdlZW4gdGhlbS4gQmVpbmcgdGhhdCBicm9hZCBjb3N0cyBub3RoaW5nIGhlcmU6IGV2ZXJ5IGNoYW5nZWxvZyBlbnRyeSBpbiB0aGlzIHdvcmtzcGFjZSBpcyBhXG4gKiBDb252ZW50aW9uYWwtQ29tbWl0cyBzdWJqZWN0LCBhbmQgdGhvc2Ugb3BlbiB3aXRoIGEgdHlwZSAoYGZlYXRgLCBgZml4YCwgYGNob3JlYCwg4oCmKSwgbmV2ZXIgd2l0aCBgTWVyZ2VgLlxuICpcbiAqIE9ORSBwYXR0ZXJuIGRyaXZlcyBib3RoIGhhbHZlcyBvZiB0aGUgZ3VhcmQsIHNvIHRoZXkgY2Fubm90IGRyaWZ0IGFwYXJ0OiB7QGxpbmsgdG9DaGFuZ2Vsb2dFbnRyeX0gcmV3cml0ZXNcbiAqIGEgY29tbWl0IHdob3NlIHN1YmplY3QgbWF0Y2hlcyBpdCwgYW5kIHtAbGluayBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHN9IHJlZnVzZXMgYSBjaGFuZ2Vsb2cgbGluZVxuICogdGhhdCBzdGlsbCBkb2VzLiBUaGUgcmVmdXNhbCBpcyB0aGVyZWZvcmUgcmVhY2hhYmxlIG9ubHkgZm9yIGEgbWVyZ2UgdGhlIHJld3JpdGUgaGFkIG5vdGhpbmcgdG8gd29yayB3aXRoLlxuICovXG5jb25zdCBNRVJHRV9TVUJKRUNUX1JFR19FWFAgPSAvXk1lcmdlKD86IGJyYW5jaHwgcmVtb3RlLXRyYWNraW5nfCBwdWxsIHJlcXVlc3QpP1xcYi87XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHZlcnNpb24gdXBkYXRlcy5cbiAqXG4gKiBBbGlnbnMgd2l0aCBucG0ncyBgbnBtIHZlcnNpb25gIGluY3JlbWVudCB0eXBlcyBwbHVzIGBNYW51YWxgIGZvciBleHBsaWNpdCB2ZXJzaW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gVmVyc2lvblVwZGF0ZVR5cGUge1xuICBJbnZhbGlkID0gJ2ludmFsaWQnLFxuICBNYWpvciA9ICdtYWpvcicsXG4gIE1hbnVhbCA9ICdtYW51YWwnLFxuICBNaW5vciA9ICdtaW5vcicsXG4gIFBhdGNoID0gJ3BhdGNoJyxcbiAgUHJlTWFqb3IgPSAncHJlbWFqb3InLFxuICBQcmVNaW5vciA9ICdwcmVtaW5vcicsXG4gIFByZVBhdGNoID0gJ3ByZXBhdGNoJyxcbiAgUHJlUmVsZWFzZSA9ICdwcmVyZWxlYXNlJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlcyBhIGNhbGxlciBuYW1lcyBkaXJlY3RseSwga2V5ZWQgYnkgdGhlaXIgbmFtZSwgYXMgb3Bwb3NlZCB0byB0aGUgdHdvIGBnZXRWZXJzaW9uVXBkYXRlVHlwZWAgZGVyaXZlcy5cbiAqL1xuY29uc3QgTkFNRURfVkVSU0lPTl9VUERBVEVfVFlQRVMgPSBuZXcgTWFwPHN0cmluZywgVmVyc2lvblVwZGF0ZVR5cGU+KFtcbiAgVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IsXG4gIFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaCxcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWFqb3IsXG4gIFZlcnNpb25VcGRhdGVUeXBlLlByZU1pbm9yLFxuICBWZXJzaW9uVXBkYXRlVHlwZS5QcmVQYXRjaCxcbiAgVmVyc2lvblVwZGF0ZVR5cGUuUHJlUmVsZWFzZVxuXS5tYXAoKHR5cGUpID0+IFt0eXBlLCB0eXBlXSkpO1xuXG4vKipcbiAqIFdoZXJlIGBIRUFEYCBzdG9vZCB3aGVuIGEgcmVsZWFzZSBzdGFydGVkOiB0aGUgYnJhbmNoIGl0IGlzIG9uIChlbXB0eSBmb3IgYSBkZXRhY2hlZCBgSEVBRGApIGFuZCBpdHMgY29tbWl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdEhlYWRTdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgY2hlY2tlZC1vdXQgYnJhbmNoLCBvciBhbiBlbXB0eSBzdHJpbmcgZm9yIGEgZGV0YWNoZWQgYEhFQURgLlxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXQgYEhFQURgIHBvaW50cyBhdC5cbiAgICovXG4gIHJlYWRvbmx5IHNoYTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBHaXQgdGFnIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIHVzZSBmb3IgdGhlIHRhZy5cbiAqIEBwYXJhbSBjb21taXRTaGEgLSBUaGUgY29tbWl0IHRvIHRhZy4gV2hlbiBvbWl0dGVkLCBgSEVBRGAgaXMgdGFnZ2VkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0YWcgaGFzIGJlZW4gY3JlYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEdpdFRhZyhuZXdWZXJzaW9uOiBzdHJpbmcsIGNvbW1pdFNoYT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCB0YWcgLWEgJHtuZXdWZXJzaW9ufSAtbSAke25ld1ZlcnNpb259IC0tZm9yY2Uke2NvbW1pdFNoYSA/IGAgJHtjb21taXRTaGF9YCA6ICcnfWAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gdGhlIEdpdCBzdGFnaW5nIGFyZWEgYW5kIGNvbW1pdHMgdGhlbSB3aXRoIHRoZSBuZXcgdmVyc2lvbiBtZXNzYWdlLlxuICpcbiAqIElmIHRoZSBjb21taXQgZmFpbHMgKGZvciBleGFtcGxlLCB0aGUgcHJlLWNvbW1pdCBob29rIHJlamVjdHMgYSBuZXcgd29yZCBpbiB0aGUgY2hhbmdlbG9nKSBhbmQgdGhlXG4gKiBwcm9jZXNzIGlzIGF0dGFjaGVkIHRvIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byBmaXggdGhlIGlzc3VlIChmb3IgZXhhbXBsZSxcbiAqIGFkZCB0aGUgbWlzc2luZyB3b3JkIHRvIGBjc3BlbGwuanNvbmApIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeS4gVGhlIHJldHJ5IHJlLXN0YWdlcyBhbGwgZmlsZXMsIHNvIHRoZVxuICogZml4IGlzIHBpY2tlZCB1cCB3aXRob3V0IHJlc3RhcnRpbmcgdGhlIHdob2xlIHJlbGVhc2UgbGlmZWN5Y2xlLiBJbiBhIG5vbi1pbnRlcmFjdGl2ZSBlbnZpcm9ubWVudCAobm9cbiAqIFRUWSwgc3VjaCBhcyBDSSksIHRoZSBlcnJvciBpcyByZS10aHJvd24gaW5zdGVhZCBvZiBwcm9tcHRpbmcsIHNvIHRoZSBzY3JpcHQgZmFpbHMgZmFzdCByYXRoZXIgdGhhblxuICogaGFuZ2luZy4gUGFzcyBgc2hvdWxkVmVyaWZ5Q29tbWl0OiBmYWxzZWAgdG8gc2tpcCB0aGUgcHJlLWNvbW1pdCBob29rIGVudGlyZWx5IGluIHN1Y2ggY2FzZXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNvbW1pdCBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIGFuZCBjb21taXR0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcblxuICBjb25zdCBjb21taXRBcmd1bWVudHMgPSBbJ2dpdCcsICdjb21taXQnLCAnLW0nLCBgY2hvcmU6IHJlbGVhc2UgJHtuZXdWZXJzaW9ufWAsICctLWFsbG93LWVtcHR5JywgLi4uKHNob3VsZFZlcmlmeUNvbW1pdCA/IFtdIDogWyctLW5vLXZlcmlmeSddKV07XG5cbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnYWRkJywgJy0tYWxsJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChjb21taXRBcmd1bWVudHMsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2ZXJzaW9uRGVidWdnZXIoXG4gICAgICAgIGBGYWlsZWQgdG8gY29tbWl0IHRoZSByZWxlYXNlLlxcbiR7ZXJyb3JUb1N0cmluZyhlcnJvcil9XFxuYFxuICAgICAgICAgICsgJ0ZpeCB0aGUgaXNzdWVzIChmb3IgZXhhbXBsZSwgYWRkIHRoZSBtaXNzaW5nIHdvcmQgdG8gY3NwZWxsLmpzb24pIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeSB0aGUgY29tbWl0LCBvciBDdHJsK0MgdG8gYWJvcnQuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oJ1ByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQuLi4nKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIEdpdEh1YiBDTEkgaXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0SHViQ2xpSW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggLS12ZXJzaW9uJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2NsaS5naXRodWIuY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIEdpdCBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgR2l0IGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydEdpdEluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0IGlzIG5vdCBpbnN0YWxsZWQuIFBsZWFzZSBpbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9naXQtc2NtLmNvbS8nKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgY2xlYW4sIG1lYW5pbmcgdGhlcmUgYXJlIG5vIHVuY29tbWl0dGVkIGNoYW5nZXMuXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0UmVwb0NsZWFuKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiAtLXVudHJhY2tlZC1maWxlcz1hbGwnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHN0ZG91dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi4gUGxlYXNlIGNvbW1pdCBvciBzdGFzaCB5b3VyIGNoYW5nZXMgYmVmb3JlIHJlbGVhc2luZyBhIG5ldyB2ZXJzaW9uLicpO1xuICB9XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBIRUFEYCBpcyB0aGUgcmVsZWFzZSBjb21taXQ6IG9uIHRoZSBicmFuY2ggdGhlIHJlbGVhc2Ugc3RhcnRlZCBvbiwgYSBzaW5nbGUgY29tbWl0IG9uIHRvcCBvZiB0aGVcbiAqIGNvbW1pdCBpdCBzdGFydGVkIGZyb20sIHdpdGggdGhlIGBjaG9yZTogcmVsZWFzZSA8dmVyc2lvbj5gIHN1YmplY3QuXG4gKlxuICogQSBzdWNjZXNzZnVsIGBnaXQgY29tbWl0YCBwcm92ZXMgb25seSB0aGF0IGEgY29tbWl0IHdhcyBtYWRlIHNvbWV3aGVyZS4gQSBjaGVja291dCBzd2l0Y2hlZCB1bmRlcm5lYXRoIGFcbiAqIHJlbGVhc2UgYnkgYW5vdGhlciBwcm9jZXNzIHRha2VzIHRoZSBjb21taXQgb250byB0aGF0IG90aGVyIGJyYW5jaCwgYW5kIHdoZW4gaXQgaXMgc3dpdGNoZWQgYmFjayB0aGUgdGFnIGFuZFxuICogdGhlIEdpdEh1YiByZWxlYXNlIGdvIG91dCBvbiB0aGUgY29tbWl0IGJlZm9yZSB0aGUgYnVtcCwgd2l0aCB0aGUgYnVtcCBsZWZ0IHN0YWdlZCBpbiB0aGUgd29ya2luZyB0cmVlIGFuZCBub3RoaW5nXG4gKiByZXBvcnRlZC4gU28gdGhlIHJlbGVhc2UgY2hlY2tzIHdoZXJlIHRoZSBjb21taXQgbGFuZGVkIGJlZm9yZSB0YWdnaW5nLCBhbmQgYWdhaW4gYmVmb3JlIHB1c2hpbmcuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgdmVyc2lvbiBiZWluZyByZWxlYXNlZC5cbiAqIEBwYXJhbSBzdGFydEhlYWQgLSBXaGVyZSBgSEVBRGAgc3Rvb2Qgd2hlbiB0aGUgcmVsZWFzZSBzdGFydGVkLlxuICogQHBhcmFtIHN0YWdlIC0gVGhlIHN0ZXAgYWJvdXQgdG8gcnVuLCBmb3IgdGhlIGVycm9yIG1lc3NhZ2UgKGZvciBleGFtcGxlIGB0YWdnaW5nYCkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWxlYXNlIGNvbW1pdCdzIFNIQS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydFJlbGVhc2VDb21taXRMYW5kZWQobmV3VmVyc2lvbjogc3RyaW5nLCBzdGFydEhlYWQ6IEdpdEhlYWRTdGF0ZSwgc3RhZ2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV4cGVjdGVkU3ViamVjdCA9IGBjaG9yZTogcmVsZWFzZSAke25ld1ZlcnNpb259YDtcbiAgY29uc3QgYnJhbmNoID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ2JyYW5jaCcsICctLXNob3ctY3VycmVudCddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IGhlYWRMb2dGaWVsZENvdW50ID0gMztcbiAgY29uc3QgaGVhZExvZyA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdsb2cnLCAnLTEnLCAnLS1mb3JtYXQ9JUglbiVQJW4lcyddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IFtzaGEgPSAnJywgcGFyZW50cyA9ICcnLCBzdWJqZWN0ID0gJyddID0gaGVhZExvZy5zcGxpdCgnXFxuJywgaGVhZExvZ0ZpZWxkQ291bnQpO1xuXG4gIGlmIChicmFuY2ggPT09IHN0YXJ0SGVhZC5icmFuY2ggJiYgcGFyZW50cyA9PT0gc3RhcnRIZWFkLnNoYSAmJiBzdWJqZWN0ID09PSBleHBlY3RlZFN1YmplY3QpIHtcbiAgICByZXR1cm4gc2hhO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBSZWZ1c2luZyB0byBjb250aW51ZSBiZWZvcmUgJHtzdGFnZX06IHRoZSByZWxlYXNlIGNvbW1pdCBmb3IgJHtuZXdWZXJzaW9ufSBpcyBub3Qgd2hlcmUgaXQgc2hvdWxkIGJlLiBgXG4gICAgICArIGBUaGUgcmVsZWFzZSBzdGFydGVkIG9uICR7ZGVzY3JpYmVCcmFuY2goc3RhcnRIZWFkLmJyYW5jaCl9IGF0ICR7c3RhcnRIZWFkLnNoYX0gYW5kIGV4cGVjdHMgYSAnJHtleHBlY3RlZFN1YmplY3R9JyBjb21taXQgb24gdG9wIG9mIGl0LCBgXG4gICAgICArIGBidXQgSEVBRCBpcyAke3NoYX0gKCcke3N1YmplY3R9JywgcGFyZW50ICR7cGFyZW50cyB8fCAnbm9uZSd9KSBvbiAke2Rlc2NyaWJlQnJhbmNoKGJyYW5jaCl9LiBgXG4gICAgICArICdTb21ldGhpbmcgZWxzZSBtb3ZlZCBIRUFEIGluIHRoaXMgd29ya2luZyB0cmVlIHdoaWxlIHRoZSByZWxlYXNlIHJhbiAoYSBjb25jdXJyZW50IGNoZWNrb3V0LCByZXNldCBvciBjb21taXQpLiAnXG4gICAgICArICdDaGVjayBgZ2l0IHJlZmxvZ2AgdG8gZmluZCB0aGUgcmVsZWFzZSBjb21taXQsIHB1dCBpdCBvbiB0aGUgcmVsZWFzZSBicmFuY2gsIGFuZCB0YWcgYW5kIHB1c2ggaXQgYnkgaGFuZC4nXG4gICk7XG59XG5cbi8qKlxuICogV3JhcHMgYW55IGJhcmUgYGh0dHAocyk6Ly9gIFVSTCBpbiB0aGUgZ2l2ZW4gdGV4dCBpbiBhbmdsZSBicmFja2V0cyAoYDx1cmw+YCkgc28gdGhhdCB0ZXh0IGVtaXR0ZWRcbiAqIGludG8gYSBNYXJrZG93biBkb2N1bWVudCAoc3VjaCBhcyBhIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgYnVsbGV0KSBwYXNzZXMgbWFya2Rvd25saW50J3NcbiAqIGBNRDAzNC9uby1iYXJlLXVybHNgIHJ1bGUgd2hpbGUgc3RpbGwgcmVuZGVyaW5nIGFzIGEgY2xpY2thYmxlIGF1dG9saW5rIG9uIEdpdEh1Yi5cbiAqXG4gKiBVUkxzIHRoYXQgYXJlIGFscmVhZHkgd3JhcHBlZCBpbiBhbmdsZSBicmFja2V0cyAoYDx1cmw+YCkgb3IgdGhhdCBmb3JtIHRoZSB0YXJnZXQgb2YgYSBNYXJrZG93blxuICogbGluayAoYFt0ZXh0XSh1cmwpYCkgYXJlIGxlZnQgdW50b3VjaGVkLCBzbyB0aGUgZnVuY3Rpb24gaXMgc2FmZSB0byBydW4gcmVwZWF0ZWRseS4gVHJhaWxpbmdcbiAqIHNlbnRlbmNlIHB1bmN0dWF0aW9uIChgLmAsIGAsYCwgYDtgLCBgOmAsIGAhYCwgYD9gKSBpcyBrZXB0IG91dHNpZGUgdGhlIGFuZ2xlIGJyYWNrZXRzIHNvIGl0IGRvZXNcbiAqIG5vdCBiZWNvbWUgcGFydCBvZiB0aGUgbGluay5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHBvc3NpYmx5IGNvbnRhaW5pbmcgYmFyZSBVUkxzLlxuICogQHJldHVybnMgVGhlIHRleHQgd2l0aCBldmVyeSBiYXJlIFVSTCB3cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXV0b2xpbmtCYXJlVXJscyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC8oPzwhWzxbKF0paHR0cHM/OlxcL1xcL1teXFxzPD4pXFxdXSsvZywgKHVybCkgPT4ge1xuICAgIGNvbnN0IHRyYWlsaW5nUHVuY3R1YXRpb24gPSAvWy4sOzohP10rJC8uZXhlYyh1cmwpPy5bMF0gPz8gJyc7XG4gICAgY29uc3QgYmFyZVVybCA9IHVybC5zbGljZSgwLCB1cmwubGVuZ3RoIC0gdHJhaWxpbmdQdW5jdHVhdGlvbi5sZW5ndGgpO1xuICAgIHJldHVybiBgPCR7YmFyZVVybH0+JHt0cmFpbGluZ1B1bmN0dWF0aW9ufWA7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG5ldyB2ZXJzaW9uIHN0cmluZyBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uIGFuZCB0aGUgc3BlY2lmaWVkIHVwZGF0ZSB0eXBlLlxuICpcbiAqIFVzZXMgdGhlIGBzZW12ZXJgIHBhY2thZ2UgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLCBzdXBwb3J0aW5nIGFsbCBucG0gaW5jcmVtZW50IHR5cGVzOlxuICogYG1ham9yYCwgYG1pbm9yYCwgYHBhdGNoYCwgYHByZW1ham9yYCwgYHByZW1pbm9yYCwgYHByZXBhdGNoYCwgYW5kIGBwcmVyZWxlYXNlYC5cbiAqIFByZS1yZWxlYXNlIHZlcnNpb25zIHVzZSB0aGUgYGJldGFgIGlkZW50aWZpZXIgYnkgZGVmYXVsdCAoZS5nLiwgYDEuMi40LWJldGEuMGApLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB0eXBlIG9mIHZlcnNpb24gdXBkYXRlIG9yIGFuIGV4cGxpY2l0IHZlcnNpb24gc3RyaW5nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHZlcnNpb24gc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgY3VycmVudCB2ZXJzaW9uIGlzIGludmFsaWQgb3IgdGhlIGluY3JlbWVudCBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHZlcnNpb25UeXBlID0gZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBpZiAodmVyc2lvblR5cGUgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbCkge1xuICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcGFja2FnZUpzb24udmVyc2lvbiA/PyAnJztcblxuICBjb25zdCByZWxlYXNlVHlwZSA9IHZlcnNpb25UeXBlIGFzIFJlbGVhc2VUeXBlO1xuICBjb25zdCBpc1ByZVJlbGVhc2VUeXBlID0gcmVsZWFzZVR5cGUuc3RhcnRzV2l0aCgncHJlJyk7XG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBpc1ByZVJlbGVhc2VUeXBlXG4gICAgPyBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlLCBERUZBVUxUX1BSRUlEKVxuICAgIDogaW5jKGN1cnJlbnRWZXJzaW9uLCByZWxlYXNlVHlwZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5ld1ZlcnNpb24sIGBGYWlsZWQgdG8gaW5jcmVtZW50IHZlcnNpb24gZnJvbSAnJHtjdXJyZW50VmVyc2lvbn0nIHdpdGggdHlwZSAnJHt2ZXJzaW9uVHlwZX0nYCk7XG5cbiAgcmV0dXJuIG5ld1ZlcnNpb247XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSByZWxlYXNlIG5vdGVzIGZvciBhIHNwZWNpZmljIHZlcnNpb24gZnJvbSB0aGUgY2hhbmdlbG9nLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3Igd2hpY2ggdG8gZ2V0IHRoZSByZWxlYXNlIG5vdGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmVsZWFzZSBub3RlcyBmb3IgdGhlIHNwZWNpZmllZCB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVsZWFzZU5vdGVzKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICBjb25zdCBzZWN0aW9uID0gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY29udGVudCwgbmV3VmVyc2lvbik7XG4gIGxldCByZWxlYXNlTm90ZXMgPSBzZWN0aW9uID8gYCR7c2VjdGlvbn1cXG5cXG5gIDogJyc7XG5cbiAgY29uc3QgdGFnT3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgdGFnIC0tc29ydD0tY3JlYXRvcmRhdGUnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHRhZ3MgPSB0YWdPdXRwdXQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgcHJldmlvdXNWZXJzaW9uID0gdGFnc1sxXTtcblxuICBjb25zdCByZXBvVXJsID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaCByZXBvIHZpZXcgLS1qc29uIHVybCAtcSAudXJsJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gIGNvbnN0IGNoYW5nZXNVcmwgPSBwcmV2aW91c1ZlcnNpb24gPyBgJHtyZXBvVXJsfS9jb21wYXJlLyR7cHJldmlvdXNWZXJzaW9ufS4uLiR7bmV3VmVyc2lvbn1gIDogYCR7cmVwb1VybH0vY29tbWl0cy8ke25ld1ZlcnNpb259YDtcblxuICByZWxlYXNlTm90ZXMgKz0gYCoqRnVsbCBDaGFuZ2Vsb2cqKjogJHtjaGFuZ2VzVXJsfWA7XG4gIHJldHVybiByZWxlYXNlTm90ZXM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgYFZlcnNpb25VcGRhdGVUeXBlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIGNvbnN0IG5hbWVkVmVyc2lvblVwZGF0ZVR5cGUgPSBOQU1FRF9WRVJTSU9OX1VQREFURV9UWVBFUy5nZXQodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBpZiAobmFtZWRWZXJzaW9uVXBkYXRlVHlwZSkge1xuICAgIHJldHVybiBuYW1lZFZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgcmV0dXJuIC9eXFxkK1xcLlxcZCtcXC5cXGQrKD86LVtcXHdcXGQuLV0rKT8kLy50ZXN0KHZlcnNpb25VcGRhdGVUeXBlKSA/IFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbCA6IFZlcnNpb25VcGRhdGVUeXBlLkludmFsaWQ7XG59XG5cbi8qKlxuICogUHVzaGVzIGNvbW1pdHMgYW5kIHRhZ3MgdG8gdGhlIHJlbW90ZSBHaXQgcmVwb3NpdG9yeS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHB1c2ggb3BlcmF0aW9uIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2l0UHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgcHVzaCAtLWZvbGxvdy10YWdzIC0tZm9yY2UnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgd2hlcmUgYEhFQURgIHN0YW5kcyBub3cuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY3VycmVudCB7QGxpbmsgR2l0SGVhZFN0YXRlfS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRHaXRIZWFkU3RhdGUoKTogUHJvbWlzZTxHaXRIZWFkU3RhdGU+IHtcbiAgY29uc3QgYnJhbmNoID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ2JyYW5jaCcsICctLXNob3ctY3VycmVudCddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHNoYSA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdyZXYtcGFyc2UnLCAnSEVBRCddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIHJldHVybiB7IGJyYW5jaCwgc2hhIH07XG59XG5cbi8qKlxuICogVGhlIGZsYWdzIHtAbGluayBwYXJzZVZlcnNpb25Bcmd1bWVudHN9IHJlY29nbml6ZXMsIGluIHRoZSBzaGFwZSBOb2RlJ3MgYHBhcnNlQXJnc2AgdGFrZXMuIEV4cG9ydGVkIHNvIGEgd3JhcHBlclxuICogdGhhdCBhZGRzIGZsYWdzIG9mIGl0cyBvd24gY2FuIHBhcnNlIHRoZW0gYWxsIGluIG9uZSBwYXNzIGFuZCBzdGlsbCByZWFkIHRoZXNlIHRocm91Z2hcbiAqIHtAbGluayB0b1VwZGF0ZVZlcnNpb25PcHRpb25zfS5cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OUyA9IHtcbiAgJ2NoYW5nZWxvZy1maWxlJzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAnY2hhbmdlbG9nLXN0eWxlJzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAnbm8tYnVpbGQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8tY2hhbmdlbG9nLWVkaXRpbmcnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8tY2hlY2tzJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAnbm8taXNzdWUtY2xvc2luZyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICduby1yZWxlYXNlJzogeyB0eXBlOiAnYm9vbGVhbicgfVxufSBhcyBjb25zdCBzYXRpc2ZpZXMgTm9uTnVsbGFibGU8UGFyc2VBcmdzQ29uZmlnWydvcHRpb25zJ10+O1xuXG4vKipcbiAqIFRoZSB2YWx1ZXMgYHBhcnNlQXJnc2AgcmVwb3J0cyBmb3Ige0BsaW5rIFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OU30uXG4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25Bcmd1bWVudFZhbHVlcyA9IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlQXJnczxWZXJzaW9uQXJndW1lbnRQYXJzZUNvbmZpZz4+Wyd2YWx1ZXMnXTtcblxuLyoqXG4gKiBBbiB1cGxvYWRlZCBhc3NldCByZXR1cm5lZCBieSBHaXRIdWIgQ0xJIGZvciBwdWJsaWNhdGlvbiB2ZXJpZmljYXRpb24uXG4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlQXNzZXRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgZG93bmxvYWRhYmxlIGZpbGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIEdpdEh1YidzIHVwbG9hZCBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlbGVhc2UgZmllbGRzIHJldHVybmVkIGJ5IEdpdEh1YiBDTEkgZm9yIHB1YmxpY2F0aW9uIHZlcmlmaWNhdGlvbi5cbiAqL1xuaW50ZXJmYWNlIEdpdEh1YlJlbGVhc2VNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBVcGxvYWRlZCBhc3NldHMuXG4gICAqL1xuICByZWFkb25seSBhc3NldHM6IHJlYWRvbmx5IEdpdEh1YlJlbGVhc2VBc3NldE1ldGFkYXRhW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByZWxlYXNlIHJlbWFpbnMgcHJpdmF0ZSBhcyBhIGRyYWZ0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNEcmFmdDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgR2l0SHViIG1hcmtzIGl0IGFzIGEgcHJlLXJlbGVhc2UuXG4gICAqL1xuICByZWFkb25seSBpc1ByZXJlbGVhc2U6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgZXhhY3QgdGFnIHVzZXJzIHdpbGwgZG93bmxvYWQuXG4gICAqL1xuICByZWFkb25seSB0YWdOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIGlzc3VlIHJlZmVyZW5jZSBhIGNvbW1pdCBib2R5IG5hbWVzLCBhcyB7QGxpbmsgcGFyc2VJc3N1ZVJlZmVyZW5jZUxpbmV9IHJlYWRzIGl0LlxuICovXG5pbnRlcmZhY2UgSXNzdWVSZWZlcmVuY2Uge1xuICAvKipcbiAgICogSG93IHRoZSBjaGFuZ2Vsb2cgbGluZSBzaG93cyBpdDogYCNuYCBmb3IgYSBiYXJlIG51bWJlciwgdGhlIGlzc3VlIFVSTCBpbiBhbmdsZSBicmFja2V0cyBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSByZW5kZXJlZDogc3RyaW5nO1xuICAvKipcbiAgICogRXZlcnkgd2F5IGEgbGluZSB0aGF0IGFscmVhZHkgc2hvd3MgaXQgbWF5IHNwZWxsIGl0OiBgI25gLCBvciBgb3duZXIvcmVwbyNuYCBhbmQgdGhlIGlzc3VlIFVSTC5cbiAgICovXG4gIHJlYWRvbmx5IHNwZWxsaW5nczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIGBwYXJzZUFyZ3NgIGNvbmZpZ3VyYXRpb24ge0BsaW5rIFZlcnNpb25Bcmd1bWVudFZhbHVlc30gaXMgZGVyaXZlZCBmcm9tLlxuICovXG5pbnRlcmZhY2UgVmVyc2lvbkFyZ3VtZW50UGFyc2VDb25maWcge1xuICAvKipcbiAgICogVGhlIHJlY29nbml6ZWQgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiB0eXBlb2YgVkVSU0lPTl9BUkdVTUVOVF9PUFRJT05TO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB2ZXJzaW9uIGlzIGEgcHJlLXJlbGVhc2UsIHN1Y2ggYXMgYDEuMi40LWJldGEuMGAuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgaXQgY2FycmllcyBhIHByZS1yZWxlYXNlIHBhcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByZVJlbGVhc2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmVyZWxlYXNlKHZlcnNpb24pICE9PSBudWxsO1xufVxuLyoqXG4gKiBQYXJzZXMgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUgaW50byBhIHZlcnNpb24gdXBkYXRlIHR5cGUgYW5kXG4gKiB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9LlxuICpcbiAqIEVhY2ggYmVoYXZpb3IgaXMgZW5hYmxlZCBieSBkZWZhdWx0OyB0aGUgY29ycmVzcG9uZGluZyBgLS1uby0qYCBmbGFnIHR1cm5zIGl0IG9mZi4gYC0tY2hhbmdlbG9nLWZpbGVgIHRha2VzIGFcbiAqIHZhbHVlIGluc3RlYWQgYW5kIGhhcyBubyBkZWZhdWx0LiBSZWNvZ25pemVkIGZsYWdzOlxuICogLSBgLS1jaGFuZ2Vsb2ctZmlsZT08cGF0aD5gIOKAlCB1c2UgdGhpcyBmaWxlJ3MgY29udGVudHMgYXMgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24gaW5zdGVhZCBvZlxuICogICB0aGUgY29tbWl0LWRlcml2ZWQgYnVsbGV0cywgYW5kIHNraXAgdGhlIGludGVyYWN0aXZlIHJldmlldyBlbnRpcmVseS5cbiAqIC0gYC0tY2hhbmdlbG9nLXN0eWxlPTxncm91cGVkfGNvbW1pdHM+YCDigJQgaG93IHRoZSBjb21taXQtZGVyaXZlZCBzZWN0aW9uIGlzIGxhaWQgb3V0IChkZWZhdWx0IGBncm91cGVkYCkuXG4gKiAtIGAtLW5vLWJ1aWxkYCDigJQgc2tpcCB0aGUgYnVpbGQgc3RlcCAob25seSBzYWZlIHdoZW4gdGhlIGJ1aWxkIG91dHB1dCBhbHJlYWR5IG1hdGNoZXMgdGhlIGN1cnJlbnQgY29kZSkuXG4gKiAtIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCDigJQgZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyB3aXRob3V0IG9wZW5pbmcgaXQgZm9yIG1hbnVhbCByZXZpZXcuXG4gKiAtIGAtLW5vLWNoZWNrc2Ag4oCUIHNraXAgdGhlIGNsZWFuLXJlcG8gY2hlY2ssIGZvcm1hdCwgc3BlbGxjaGVjaywgbGludCwgb3Zlci1leHBvc3VyZSBhbmFseXNpcywgYW5kIHRlc3RzICh0aGUgYnVpbGQgc3RpbGwgcnVucykuXG4gKiAtIGAtLW5vLWNvbW1pdC12ZXJpZmljYXRpb25gIOKAlCBwYXNzIGAtLW5vLXZlcmlmeWAgdG8gdGhlIHJlbGVhc2UgY29tbWl0LCBza2lwcGluZyB0aGUgcHJlLWNvbW1pdCBob29rLlxuICogLSBgLS1uby1pc3N1ZS1jbG9zaW5nYCDigJQgZG8gbm90IGNsb3NlIHRoZSBpc3N1ZXMgdGhlIHJlbGVhc2UgY2FycmllcyBvbmNlIGl0IGlzIHB1Ymxpc2hlZC5cbiAqIC0gYC0tbm8tcmVsZWFzZWAg4oCUIHJ1biBhbGwgbG9jYWwgc3RlcHMgYnV0IHNraXAgdGhlIHB1c2ggYW5kIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHBhcnNlICh0eXBpY2FsbHkgYHByb2Nlc3MuYXJndi5zbGljZSgyKWApLlxuICogQHJldHVybnMgVGhlIHtAbGluayBQYXJzZWRWZXJzaW9uQXJndW1lbnRzfSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFuZCB0aGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvbkFyZ3VtZW50cygkYXJndW1lbnRzOiBzdHJpbmdbXSk6IFBhcnNlZFZlcnNpb25Bcmd1bWVudHMge1xuICBjb25zdCB7IHBvc2l0aW9uYWxzLCB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgYXJnc2AgaXMgdGhlIG9wdGlvbiBuYW1lIE5vZGUncyBgcGFyc2VBcmdzYCByZWFkcy5cbiAgICBhcmdzOiAkYXJndW1lbnRzLFxuICAgIG9wdGlvbnM6IFZFUlNJT05fQVJHVU1FTlRfT1BUSU9OU1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG9wdGlvbnM6IHRvVXBkYXRlVmVyc2lvbk9wdGlvbnModmFsdWVzKSxcbiAgICB2ZXJzaW9uVXBkYXRlVHlwZTogcG9zaXRpb25hbHNbMF1cbiAgfTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZSBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIENyZWF0ZXMgdGhlIHJlbGVhc2UgYW5kIGF0dGFjaGVzIHRoZSBmaWxlcyB7QGxpbmsgUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zLmdldFJlbGVhc2VBc3NldFBhdGhzfSBuYW1lcy5cbiAqXG4gKiBPbmNlIHRoZSByZWxlYXNlIGV4aXN0cywgdGhlIGlzc3VlcyBpdCBjYXJyaWVzIGFyZSBjbG9zZWQgd2l0aCBhIGxpbmsgdG8gaXQgKHNlZSB7QGxpbmsgY2xvc2VSZWxlYXNlZElzc3Vlc30pLFxuICogdW5sZXNzIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnMuc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlc30gaXMgYGZhbHNlYC4gQSBmYWlsdXJlIHRoZXJlIGlzIHJlcG9ydGVkIGFuZFxuICogZG9lcyBub3QgZmFpbCB0aGUgcmVsZWFzZSwgd2hpY2ggaXMgYWxyZWFkeSBwdWJsaXNoZWQuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB0aGUgcmVsZWFzZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBQdWJsaXNoR2l0SHViUmVsZWFzZU9wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWxlYXNlIGhhcyBiZWVuIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogUHVibGlzaEdpdEh1YlJlbGVhc2VPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBnZXRSZWxlYXNlQXNzZXRQYXRocyA9IGdldE5wbVBhY2tSZWxlYXNlQXNzZXRQYXRocywgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlcyA9IHRydWUsIHNob3VsZFZlcmlmeVJlbGVhc2UgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgcmVzb2x2ZVJlbGVhc2VBc3NldFBhdGhzKGdldFJlbGVhc2VBc3NldFBhdGhzLCBzaG91bGRWZXJpZnlSZWxlYXNlKTtcblxuICBhd2FpdCBleGVjRnJvbVJvb3QoW1xuICAgICdnaCcsXG4gICAgJ3JlbGVhc2UnLFxuICAgICdjcmVhdGUnLFxuICAgIG5ld1ZlcnNpb24sXG4gICAgLi4uZmlsZVBhdGhzLFxuICAgICctLXRpdGxlJyxcbiAgICBgdiR7bmV3VmVyc2lvbn1gLFxuICAgIC4uLihzaG91bGRWZXJpZnlSZWxlYXNlID8gWyctLXZlcmlmeS10YWcnXSA6IFtdKSxcbiAgICAuLi4oaXNQcmVSZWxlYXNlKG5ld1ZlcnNpb24pID8gWyctLXByZXJlbGVhc2UnXSA6IFtdKSxcbiAgICAnLS1ub3Rlcy1maWxlJyxcbiAgICAnLSdcbiAgXSwge1xuICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgc3RkaW46IGF3YWl0IGdldFJlbGVhc2VOb3RlcyhuZXdWZXJzaW9uKVxuICB9KTtcblxuICBpZiAoc2hvdWxkVmVyaWZ5UmVsZWFzZSkge1xuICAgIGF3YWl0IHZlcmlmeUdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbiwgZmlsZVBhdGhzKTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3Vlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGNsb3NlUmVsZWFzZWRJc3N1ZXNTYWZlbHkobmV3VmVyc2lvbiwgdHJ1ZSk7XG59XG5cbi8qKlxuICogUmVhZHMgb25lIGZpcnN0LXBhcmVudCBjb21taXQgaW50byB0aGUgcGFydHMgYm90aCBjaGFuZ2Vsb2cgc3R5bGVzIHJlbmRlcjogdGhlIGxpbmUge0BsaW5rIHRvQ2hhbmdlbG9nRW50cnl9XG4gKiBkZXNjcmliZXMsIHRoZSBpc3N1ZSByZWZlcmVuY2VzIGl0IGRvZXMgbm90IGFscmVhZHkgc2hvdywgYW5kIHdoYXQgZWxzZSB0aGUgYm9keSBzYXlzLlxuICpcbiAqIEBwYXJhbSBjb21taXRNZXNzYWdlIC0gVGhlIGZ1bGwgY29tbWl0IG1lc3NhZ2UuXG4gKiBAcmV0dXJucyBUaGUgcGFydHMsIHdpdGggYmFyZSBVUkxzIGluIHRoZSBlbnRyeSBhbmQgdGhlIGRldGFpbCBsaW5lcyBhdXRvbGlua2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DaGFuZ2Vsb2dDb21taXRFbnRyeShjb21taXRNZXNzYWdlOiBzdHJpbmcpOiBDaGFuZ2Vsb2dDb21taXRFbnRyeSB7XG4gIGNvbnN0IGxpbmVzID0gY29tbWl0TWVzc2FnZS5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcihCb29sZWFuKTtcbiAgY29uc3Qgc3ViamVjdCA9IGxpbmVzWzBdID8/ICcnO1xuICBjb25zdCBib2R5TGluZXMgPSBsaW5lcy5zbGljZSgxKTtcbiAgY29uc3QgbGlmdGVkTGluZSA9IE1FUkdFX1NVQkpFQ1RfUkVHX0VYUC50ZXN0KHN1YmplY3QpID8gYm9keUxpbmVzLmZpbmQoKGxpbmUpID0+ICFwYXJzZUlzc3VlUmVmZXJlbmNlTGluZShsaW5lKSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGVudHJ5ID0gbGlmdGVkTGluZSA/PyBzdWJqZWN0O1xuICBjb25zdCByZWZlcmVuY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGJvZHlMaW5lcy5mbGF0TWFwKChsaW5lKSA9PiBwYXJzZUlzc3VlUmVmZXJlbmNlTGluZShsaW5lKSA/PyBbXSkpIHtcbiAgICBpZiAocmVmZXJlbmNlLnNwZWxsaW5ncy5ldmVyeSgoc3BlbGxpbmcpID0+ICFuZXcgUmVnRXhwKFN0cmluZy5yYXdgKD88IVtcXHcvXSkke2VzY2FwZVJlZ0V4cChzcGVsbGluZyl9KD8hXFxkKWApLnRlc3QoZW50cnkpKSkge1xuICAgICAgcmVmZXJlbmNlcy5hZGQocmVmZXJlbmNlLnJlbmRlcmVkKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXRhaWxMaW5lcyA9IGJvZHlMaW5lcy5maWx0ZXIoKGxpbmUpID0+IGxpbmUgIT09IGxpZnRlZExpbmUgJiYgIXBhcnNlSXNzdWVSZWZlcmVuY2VMaW5lKGxpbmUpICYmICFCUkVBS0lOR19DSEFOR0VfRk9PVEVSX1JFR19FWFAudGVzdChsaW5lKSk7XG4gIHJldHVybiB7XG4gICAgZGV0YWlsTGluZXM6IGRldGFpbExpbmVzLm1hcCgobGluZSkgPT4gYXV0b2xpbmtCYXJlVXJscyhsaW5lLnRyaW0oKSkpLFxuICAgIGVudHJ5OiBhdXRvbGlua0JhcmVVcmxzKGVudHJ5KSxcbiAgICBoYXNCcmVha2luZ0Zvb3RlcjogQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9SRUdfRVhQLnRlc3QoY29tbWl0TWVzc2FnZSksXG4gICAgcmVmZXJlbmNlczogWy4uLnJlZmVyZW5jZXNdXG4gIH07XG59XG4vKipcbiAqIE1hcHMgdGhlIHZhbHVlcyBgcGFyc2VBcmdzYCByZXBvcnRzIGZvciB7QGxpbmsgVkVSU0lPTl9BUkdVTUVOVF9PUFRJT05TfSBvbnRvIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30uXG4gKlxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBwYXJzZWQgdmFsdWVzLlxuICogQHJldHVybnMgVGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VwZGF0ZVZlcnNpb25PcHRpb25zKHZhbHVlczogVmVyc2lvbkFyZ3VtZW50VmFsdWVzKTogVXBkYXRlVmVyc2lvbk9wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoOiB2YWx1ZXNbJ2NoYW5nZWxvZy1maWxlJ10sXG4gICAgY2hhbmdlbG9nU3R5bGU6IHRvQ2hhbmdlbG9nU3R5bGUodmFsdWVzWydjaGFuZ2Vsb2ctc3R5bGUnXSksXG4gICAgc2hvdWxkQnVpbGQ6ICEodmFsdWVzWyduby1idWlsZCddID8/IGZhbHNlKSxcbiAgICBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzOiAhKHZhbHVlc1snbm8taXNzdWUtY2xvc2luZyddID8/IGZhbHNlKSxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nOiAhKHZhbHVlc1snbm8tY2hhbmdlbG9nLWVkaXRpbmcnXSA/PyBmYWxzZSksXG4gICAgc2hvdWxkUmVsZWFzZTogISh2YWx1ZXNbJ25vLXJlbGVhc2UnXSA/PyBmYWxzZSksXG4gICAgc2hvdWxkUnVuQ2hlY2tzOiAhKHZhbHVlc1snbm8tY2hlY2tzJ10gPz8gZmFsc2UpLFxuICAgIHNob3VsZFZlcmlmeUNvbW1pdDogISh2YWx1ZXNbJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nXSA/PyBmYWxzZSlcbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBjaGFuZ2Vsb2cgZmlsZSB3aXRoIG5ldyB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBjb21taXQgbWVzc2FnZXMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgY3VycmVudCBjaGFuZ2Vsb2csIGFwcGVuZHMgbmV3IGVudHJpZXMgZm9yIHRoZSBsYXRlc3QgdmVyc2lvbixcbiAqIGFuZCBwcm9tcHRzIHRoZSB1c2VyIHRvIHJldmlldyB0aGUgY2hhbmdlcy5cbiAqXG4gKiBUaGUgcmV2aWV3IGhhcHBlbnMgb24gYSBzY3JhdGNoIGNvcHkgaW4gdGhlIE9TIHRlbXBvcmFyeSBmb2xkZXIsIGFuZCB0aGUgcmVwb3NpdG9yeSdzIG93blxuICogYENIQU5HRUxPRy5tZGAgaXMgd3JpdHRlbiBvbmx5IG9uY2UgdGhlIHJldmlldyBpcyBvdmVyIOKAlCBzbyBpbnRlcnJ1cHRpbmcgdGhlIHJldmlldyBsZWF2ZXMgdGhlXG4gKiByZXBvc2l0b3J5IHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGNoYW5nZWxvZy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zfSBjb250cm9sbGluZyB0aGUgY2hhbmdlbG9nIHJldmlldyBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2hhbmdlbG9nIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3cml0ZUNoYW5nZWxvZyhhd2FpdCBwcmVwYXJlQ2hhbmdlbG9nKG5ld1ZlcnNpb24sIG9wdGlvbnMpKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIHNlcmllcyBvZiB0YXNrcyB0byBoYW5kbGUgdmVyc2lvbiB1cGRhdGVzOlxuICogMS4gVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogMi4gQ2hlY2tzIGlmIEdpdCBhbmQgR2l0SHViIENMSSBhcmUgaW5zdGFsbGVkLlxuICogMy4gVmVyaWZpZXMgdGhhdCB0aGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldywgaWYgb25lIGlzIGR1ZSwgY2FuIGFjdHVhbGx5IGJlIGFuc3dlcmVkLlxuICogNC4gVmVyaWZpZXMgdGhhdCB0aGUgYnVtcCBpcyBub3QgbG93ZXIgdGhhbiB0aGUgY29tbWl0cyBzaW5jZSB0aGUgbGFzdCB0YWcgZm9yY2UgaXQgdG8gYmUuXG4gKiA1LiBWZXJpZmllcyB0aGF0IHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbi5cbiAqIDYuIFJ1bnMgc3BlbGxjaGVjayBhbmQgbGludGluZy5cbiAqIDcuIEJ1aWxkcyB0aGUgcHJvamVjdC5cbiAqIDguIFNldHRsZXMgdGhlIGNoYW5nZWxvZyDigJQgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhIGh1bWFuLCBhbmQgZGVsaWJlcmF0ZWx5IHRoZSBsYXN0IG9uZSBiZWZvcmVcbiAqICAgIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIGFuIGludGVycnVwdCBoZXJlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGNsZWFuIGFuZCB0aGUgcmVsZWFzZSByZS1ydW5uYWJsZS5cbiAqICAgIFRoZSBzZXR0bGVkIHRleHQgaXMgbGludGVkIGhlcmUgdG9vOiBgbGludDptZGAgcmFuIGluIHN0ZXAgNiwgYmVmb3JlIGEgY2hhcmFjdGVyIG9mIGl0IGV4aXN0ZWQuXG4gKiA5LiBVcGRhdGVzIHZlcnNpb24gaW4gZmlsZXMgKGFuZCBpbiB3aGF0ZXZlciB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnMudXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlc30gYWRkcyksIHRoZW5cbiAqICAgIHdyaXRlcyB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cuXG4gKiAxMC4gQWRkcyB1cGRhdGVkIGZpbGVzIHRvIEdpdCwgdGFncyB0aGUgY29tbWl0LCBhbmQgcHVzaGVzIHRvIHRoZSByZXBvc2l0b3J5LlxuICogMTEuIFByZXBhcmVzIGFuZCBwdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZS5cbiAqIDEyLiBDbG9zZXMgdGhlIGlzc3VlcyB0aGUgcmVsZWFzZSBjYXJyaWVzLCB3aXRoIGEgbGluayB0byBpdC5cbiAqXG4gKiBXaXRoIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9ucy5zaG91bGRQdWJsaXNoQmVmb3JlUHVzaH0sIHByZXBhcmF0aW9uIGFuZCBhc3NldCB2YWxpZGF0aW9uIHByZWNlZGVcbiAqIHRoZSB0YWcgcHVzaC4gUHVibGljYXRpb24gYW5kIHZlcmlmaWNhdGlvbiB0aGVuIHByZWNlZGUgdGhlIGJyYW5jaCBwdXNoLCBhbmQgaXNzdWUgY2xvc2luZyByZW1haW5zIGxhc3QuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgdG8gcGVyZm9ybSAobWFqb3IsIG1pbm9yLCBwYXRjaCwgcHJlbWFqb3IsIHByZW1pbm9yLCBwcmVwYXRjaCwgcHJlcmVsZWFzZSwgb3IgeC55LnpbLXN1ZmZpeF0pLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBjb250cm9sbGluZyB0aGUgcmVsZWFzZSBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmVyc2lvbiB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlPzogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2Vsb2dGaWxlUGF0aCxcbiAgICBjaGFuZ2Vsb2dTdHlsZSxcbiAgICBnZXRSZWxlYXNlQXNzZXRQYXRocyA9IGdldE5wbVBhY2tSZWxlYXNlQXNzZXRQYXRocyxcbiAgICBwcmVwYXJlR2l0SHViUmVsZWFzZSxcbiAgICBzaG91bGRCdWlsZCA9IHRydWUsXG4gICAgc2hvdWxkQ2xvc2VSZWxlYXNlZElzc3VlcyA9IHRydWUsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWUsXG4gICAgc2hvdWxkUHVibGlzaEJlZm9yZVB1c2ggPSBmYWxzZSxcbiAgICBzaG91bGRSZWxlYXNlID0gdHJ1ZSxcbiAgICBzaG91bGRSdW5DaGVja3MgPSB0cnVlLFxuICAgIHNob3VsZFZlcmlmeUNvbW1pdCA9IHRydWUsXG4gICAgdXBkYXRlVmVyc2lvbkluRXh0cmFGaWxlc1xuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIXZlcnNpb25VcGRhdGVUeXBlKSB7XG4gICAgY29uc3QgbnBtT2xkVmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fb2xkX3ZlcnNpb24nXTtcbiAgICBjb25zdCBucG1OZXdWZXJzaW9uID0gcHJvY2Vzcy5lbnZbJ25wbV9uZXdfdmVyc2lvbiddO1xuXG4gICAgaWYgKG5wbU9sZFZlcnNpb24gJiYgbnBtTmV3VmVyc2lvbikge1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobnBtT2xkVmVyc2lvbik7XG4gICAgICBhd2FpdCB1cGRhdGVWZXJzaW9uKG5wbU5ld1ZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignTm8gdmVyc2lvbiB1cGRhdGUgdHlwZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBhd2FpdCBhc3NlcnRHaXRJbnN0YWxsZWQoKTtcbiAgYXdhaXQgYXNzZXJ0R2l0SHViQ2xpSW5zdGFsbGVkKCk7XG4gIC8vIENoZWNrZWQgaGVyZSwgYmVmb3JlIHRoZSBjaGVja3MgYW5kIHRoZSBidWlsZCwgcmF0aGVyIHRoYW4gYXQgdGhlIGNoYW5nZWxvZyBzdGVwIGl0c2VsZjogYSBub24taW50ZXJhY3RpdmVcbiAgLy8gY2FsbGVyIGxlYXJucyBpbiBzZWNvbmRzIGluc3RlYWQgb2YgcGF5aW5nIGZvciB0aGUgd2hvbGUgcHJlZmxpZ2h0IGFuZCBvbmx5IHRoZW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yXG4gIC8vIHdpbmRvdyBub2JvZHkgd2lsbCBldmVyIGNsb3NlLlxuICBhc3NlcnRDaGFuZ2Vsb2dTdGVwSXNOb25CbG9ja2luZyhjaGFuZ2Vsb2dGaWxlUGF0aCwgc2hvdWxkRWRpdENoYW5nZWxvZyk7XG4gIC8vIFNhbWUgcGxhY2VtZW50LCBzYW1lIHJlYXNvbi4gRGVsaWJlcmF0ZWx5IE5PVCB1bmRlciBgc2hvdWxkUnVuQ2hlY2tzYDogdGhhdCBmbGFnIGJ1eXMgYSBmYXN0IHJlbGVhc2UgYnlcbiAgLy8gc2tpcHBpbmcgdGhlIFZFUklGSUNBVElPTiBvZiB0aGUgY29kZSwgYW5kIHRoaXMgaXMgYSBjb3JyZWN0bmVzcyBnYXRlIG9uIHRoZSByZWxlYXNlIGl0c2VsZiDigJQgdGhlIGJ1bXBcbiAgLy8gYSBgLS1uby1jaGVja3NgIHJlbGVhc2Ugc2hpcHMgaXMgYXMgcHVibGljLCBhbmQgYXMgdW5maXhhYmxlIGFmdGVyd2FyZHMsIGFzIGFueSBvdGhlci5cbiAgYXdhaXQgYXNzZXJ0VmVyc2lvblVwZGF0ZVR5cGVNZWV0c0J1bXBGbG9vcih2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIC8vIFNhbWUgcGxhY2VtZW50LCBzYW1lIHJlYXNvbjogYSBjaGFuZ2Vsb2cgc2VjdGlvbiBub2JvZHkgd2lsbCByZXZpZXcgaXMgZnVsbHkga25vd24gYmVmb3JlIHRoZSBnYXRlLCBhbmQgYSBzdWJqZWN0IGl0XG4gIC8vIGZhaWxzIG9uIGlzIGFscmVhZHkgcHVzaGVkLCBzbyBsZWFybmluZyB0aGF0IGFmdGVyIHRoZSBwcmVmbGlnaHQgb25seSBjb3N0cyB0aGUgcHJlZmxpZ2h0LlxuICBhd2FpdCBhc3NlcnROb25JbnRlcmFjdGl2ZUNoYW5nZWxvZ0lzUHVibGlzaGFibGUodmVyc2lvblVwZGF0ZVR5cGUsIHsgY2hhbmdlbG9nRmlsZVBhdGgsIGNoYW5nZWxvZ1N0eWxlLCBzaG91bGRFZGl0Q2hhbmdlbG9nIH0pO1xuXG4gIGlmIChzaG91bGRSdW5DaGVja3MpIHtcbiAgICBhd2FpdCBhc3NlcnRHaXRSZXBvQ2xlYW4oKTtcbiAgfVxuXG4gIC8vIFJlYWQgYmVmb3JlIHRoZSBnYXRlLCBzbyBhIGNoZWNrb3V0IHN3aXRjaGVkIGF0IGFueSBwb2ludCBvZiB0aGUgcmVsZWFzZSBpcyBjYXVnaHQgYWZ0ZXIgdGhlIGNvbW1pdC5cbiAgY29uc3Qgc3RhcnRIZWFkID0gYXdhaXQgcmVhZEdpdEhlYWRTdGF0ZSgpO1xuXG4gIC8vIFRoZSByZXN0IG9mIHRoZSBwcmVmbGlnaHQgSVMgYG5wbSBydW4gZ2F0ZWAsIG5vdCBhIGNvcHkgb2YgaXQ6IGEgY2hlY2sgYWRkZWQgdG8gdGhlIGdhdGUgaXMgcmVhY2hhYmxlXG4gIC8vIGZyb20gdGhlIGJyYW5jaCBhbmQgZnJvbSB0aGUgcmVsZWFzZSBieSBjb25zdHJ1Y3Rpb24sIGluc3RlYWQgb2YgYnkgdHdvIGxpc3RzIGhhcHBlbmluZyB0byBhZ3JlZS5cbiAgLy8gVGhlIGNsZWFuLXJlcG8gYXNzZXJ0aW9uIGFib3ZlIHN0YXlzIGhlcmUsIGJlY2F1c2UgdGhlIGdhdGUgaXMgcnVuIG9uIGEgZGlydHkgdHJlZSBvbiBwdXJwb3NlLlxuICAvLyBUaGUgYnVpbGQgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHB1Ymxpc2hpbmcsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjaywgc28gaXQgcnVucyB1bmxlc3MgYHNob3VsZEJ1aWxkYCBpcyBgZmFsc2VgIOKAlCB0aGlzIGtlZXBzIHRoZSByZWxlYXNlZCBhcnRpZmFjdHMgaW4gc3luYyB3aXRoIHRoZSBjdXJyZW50IGNvZGUgZXZlbiBvbiBhIGZhc3QgcmVsZWFzZS5cbiAgYXdhaXQgZ2F0ZSh7XG4gICAgc2hvdWxkQnVpbGQsXG4gICAgc2hvdWxkUnVuQ2hlY2tzLFxuICAgIHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHM6IHRydWVcbiAgfSk7XG5cbiAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGUpO1xuXG4gIC8vIFRoZSBjaGFuZ2Vsb2cgaXMgc2V0dGxlZCBCRUZPUkUgYW55dGhpbmcgaXMgd3JpdHRlbiwgYmVjYXVzZSB0aGlzIGlzIHRoZSBvbmx5IHN0ZXAgdGhhdCBjYW4gYmxvY2sgb24gYVxuICAvLyBodW1hbi4gSW50ZXJydXB0aW5nIGl0IHRoZXJlZm9yZSBsZWF2ZXMgdGhlIHdvcmtpbmcgdHJlZSBwcmlzdGluZSBhbmQgdGhlIHdob2xlIHJlbGVhc2UgcmUtcnVubmFibGUsXG4gIC8vIGluc3RlYWQgb2Ygc3RyYW5kaW5nIGEgYnVtcGVkLWJ1dC11bmNvbW1pdHRlZCB0cmVlIHRoYXQgYGFzc2VydEdpdFJlcG9DbGVhbmAgdGhlbiByZWZ1c2VzIHRvIHJlLXJlbGVhc2UuXG4gIGNvbnN0IG5ld0NoYW5nZUxvZyA9IGF3YWl0IHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbiwge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIGNoYW5nZWxvZ1N0eWxlLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2dcbiAgfSk7XG5cbiAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbik7XG4gIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkV4dHJhRmlsZXM/LihuZXdWZXJzaW9uKTtcblxuICBhd2FpdCB3cml0ZUNoYW5nZWxvZyhuZXdDaGFuZ2VMb2cpO1xuICBhd2FpdCBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uLCB7IHNob3VsZFZlcmlmeUNvbW1pdCB9KTtcbiAgLy8gVGhlIHRhZyBuYW1lcyB0aGUgdmVyaWZpZWQgY29tbWl0IHJhdGhlciB0aGFuIHdoYXRldmVyIGBIRUFEYCBpcyBieSB0aGUgdGltZSBgZ2l0IHRhZ2AgcnVucy5cbiAgY29uc3QgcmVsZWFzZUNvbW1pdFNoYSA9IGF3YWl0IGFzc2VydFJlbGVhc2VDb21taXRMYW5kZWQobmV3VmVyc2lvbiwgc3RhcnRIZWFkLCAndGFnZ2luZycpO1xuICBhd2FpdCBhZGRHaXRUYWcobmV3VmVyc2lvbiwgcmVsZWFzZUNvbW1pdFNoYSk7XG5cbiAgaWYgKCFzaG91bGRSZWxlYXNlKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKSgnU2tpcHBpbmcgZ2l0IHB1c2ggYW5kIEdpdEh1YiByZWxlYXNlICgtLW5vLXJlbGVhc2UpLiBUaGUgdmVyc2lvbiBidW1wLCBjaGFuZ2Vsb2csIGNvbW1pdCwgYW5kIHRhZyBoYXZlIGJlZW4gY3JlYXRlZCBsb2NhbGx5LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRQdWJsaXNoQmVmb3JlUHVzaCkge1xuICAgIGF3YWl0IHByZXBhcmVHaXRIdWJSZWxlYXNlPy4obmV3VmVyc2lvbik7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgcmVzb2x2ZVJlbGVhc2VBc3NldFBhdGhzKGdldFJlbGVhc2VBc3NldFBhdGhzLCB0cnVlKTtcbiAgICBhd2FpdCBhc3NlcnRSZWxlYXNlQ29tbWl0TGFuZGVkKG5ld1ZlcnNpb24sIHN0YXJ0SGVhZCwgJ3B1c2hpbmcnKTtcbiAgICBjb25zdCB0YWdDb21taXRTaGEgPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAncmV2LXBhcnNlJywgYHJlZnMvdGFncy8ke25ld1ZlcnNpb259Xnt9YF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBpZiAodGFnQ29tbWl0U2hhICE9PSByZWxlYXNlQ29tbWl0U2hhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZnVzaW5nIHRvIHB1c2ggJHtuZXdWZXJzaW9ufTogaXRzIHRhZyBubyBsb25nZXIgbmFtZXMgdGhlIHZlcmlmaWVkIHJlbGVhc2UgY29tbWl0LmApO1xuICAgIH1cbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAncHVzaCcsICdvcmlnaW4nLCBgcmVmcy90YWdzLyR7bmV3VmVyc2lvbn06cmVmcy90YWdzLyR7bmV3VmVyc2lvbn1gXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGF3YWl0IHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb24sIHtcbiAgICAgIGdldFJlbGVhc2VBc3NldFBhdGhzOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmlsZVBhdGhzKSxcbiAgICAgIHNob3VsZENsb3NlUmVsZWFzZWRJc3N1ZXM6IGZhbHNlLFxuICAgICAgc2hvdWxkVmVyaWZ5UmVsZWFzZTogdHJ1ZVxuICAgIH0pO1xuICAgIGF3YWl0IGFzc2VydFJlbGVhc2VDb21taXRMYW5kZWQobmV3VmVyc2lvbiwgc3RhcnRIZWFkLCAncHVzaGluZycpO1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdwdXNoJywgJ29yaWdpbicsIGAke3JlbGVhc2VDb21taXRTaGF9OnJlZnMvaGVhZHMvJHtzdGFydEhlYWQuYnJhbmNofWBdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgYXdhaXQgY2xvc2VSZWxlYXNlZElzc3Vlc1NhZmVseShuZXdWZXJzaW9uLCBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBhc3NlcnRSZWxlYXNlQ29tbWl0TGFuZGVkKG5ld1ZlcnNpb24sIHN0YXJ0SGVhZCwgJ3B1c2hpbmcnKTtcbiAgYXdhaXQgZ2l0UHVzaCgpO1xuICBhd2FpdCBwcmVwYXJlR2l0SHViUmVsZWFzZT8uKG5ld1ZlcnNpb24pO1xuICBhd2FpdCBwdWJsaXNoR2l0SHViUmVsZWFzZShuZXdWZXJzaW9uLCB7IGdldFJlbGVhc2VBc3NldFBhdGhzLCBzaG91bGRDbG9zZVJlbGVhc2VkSXNzdWVzIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gaW4gYHBhY2thZ2UuanNvbmAgYW5kLCB3aGVyZSB0aGV5IGV4aXN0LCBgcGFja2FnZS1sb2NrLmpzb25gIGFuZCBgbnBtLXNocmlua3dyYXAuanNvbmAuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gc3RyaW5nIHRvIHVwZGF0ZSBpbiB0aGUgZmlsZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBlZGl0UGFja2FnZUpzb24oKHBhY2thZ2VKc29uKSA9PiB7XG4gICAgcGFja2FnZUpzb24udmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gIH0pO1xuXG4gIGF3YWl0IGVkaXRQYWNrYWdlTG9ja0pzb24odXBkYXRlLCB7IHNob3VsZFNraXBJZk1pc3Npbmc6IHRydWUgfSk7XG4gIGF3YWl0IGVkaXROcG1TaHJpbmtXcmFwSnNvbih1cGRhdGUsIHsgc2hvdWxkU2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcblxuICBmdW5jdGlvbiB1cGRhdGUocGFja2FnZUxvY2tKc29uOiBQYWNrYWdlTG9ja0pzb24pOiB2b2lkIHtcbiAgICBwYWNrYWdlTG9ja0pzb24udmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgY29uc3QgZGVmYXVsdFBhY2thZ2UgPSBwYWNrYWdlTG9ja0pzb24ucGFja2FnZXM/LlsnJ107XG4gICAgaWYgKGRlZmF1bHRQYWNrYWdlKSB7XG4gICAgICBkZWZhdWx0UGFja2FnZS52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgdG8gZW5zdXJlIGl0IGlzIGVpdGhlciBhIHJlY29nbml6ZWQgdHlwZVxuICogb3IgYSB2YWxpZCBtYW51YWwgdmVyc2lvbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgdG8gdmFsaWRhdGUuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGlzIGludmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZSh2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZSkgPT09IFZlcnNpb25VcGRhdGVUeXBlLkludmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnSW52YWxpZCB2ZXJzaW9uIHVwZGF0ZSB0eXBlLiBQbGVhc2UgdXNlIFxcJ21ham9yXFwnLCBcXCdtaW5vclxcJywgXFwncGF0Y2hcXCcsIFxcJ3ByZW1ham9yXFwnLCBcXCdwcmVtaW5vclxcJywgXFwncHJlcGF0Y2hcXCcsIFxcJ3ByZXJlbGVhc2VcXCcsIG9yIFxcJ3gueS56Wy1zdWZmaXhdXFwnIGZvcm1hdC4nXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZnVzZXMgYSBjaGFuZ2Vsb2cgd2hvc2UgTkVXIHNlY3Rpb24gbWF0Y2hlcyBvbmUgb2YgdGhlIG1haW50YWluZXIncyBvd24gdW5wdWJsaXNoZWQgZm9yYmlkZGVuIHBhdHRlcm5zLlxuICpcbiAqIEV2ZXJ5IGNvbW1pdCBzdWJqZWN0IHNpbmNlIHRoZSBsYXN0IHRhZyBzaGlwcyB2ZXJiYXRpbSBpbnRvIHRoZSBuZXcgc2VjdGlvbiwgc28gYSBzdWJqZWN0IHRoYXQgY2Fycmllc1xuICogdm9jYWJ1bGFyeSBwcml2YXRlIHRvIHRoZSBtYWludGFpbmVyIOKAlCBhbiBpbnRlcm5hbCB0cmFja2VyIGlkLCBhIHByaXZhdGUgcHJvamVjdCBzaG9ydCBuYW1lIOKAlCBsYW5kcyBpbiBhXG4gKiBjaGVja2VkLWluLCBwdWJsaXNoZWQgZmlsZSBpbnNpZGUgdGhlIHJlbGVhc2UgY29tbWl0LCB3aGVyZSBub3RoaW5nIGV2ZXIgbG9va3MgYXQgaXQgYWdhaW4uIFRoZSBsaXN0IG9mIHdoYXRcbiAqIGNvdW50cyBhcyBwcml2YXRlIGNhbm5vdCBsaXZlIGluIHRoaXMgbGlicmFyeSBvciBpbiB0aGUgcmVwb3NpdG9yeSB3aXRob3V0IHB1Ymxpc2hpbmcgdGhlIHZlcnkgdGhpbmcgaXRcbiAqIHByb3RlY3RzLCBzbyBpdCBjb21lcyBmcm9tIHRoZSBmaWxlIHtAbGluayBGT1JCSURERU5fUEFUVEVSTlNfRklMRV9FTlZfVkFSSUFCTEV9IG5hbWVzLCBhbmQgdGhpcyBpcyBhIG5vLW9wXG4gKiB3aGVyZXZlciB0aGF0IGlzIG5vdCBjb25maWd1cmVkLlxuICpcbiAqIExpa2Uge0BsaW5rIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0c30sIG9ubHkgdGhlIHNlY3Rpb24gYmVpbmcgcHVibGlzaGVkIGlzIHNjYW5uZWQsIGFuZCB0aGUgdGhyb3dcbiAqIGNvbWVzIGJlZm9yZSBhbnl0aGluZyBpcyB3cml0dGVuLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIHZlcnNpb24gd2hvc2Ugc2VjdGlvbiBpcyBhYm91dCB0byBiZSBwdWJsaXNoZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNlY3Rpb24gaXMgY2xlYW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydENoYW5nZWxvZ0hhc05vRm9yYmlkZGVuUGF0dGVybnMoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGF0dGVybnMgPSBhd2FpdCByZWFkRm9yYmlkZGVuUGF0dGVybnMoKTtcbiAgY29uc3QgbWF0Y2hlcyA9IGZpbmRGb3JiaWRkZW5QYXR0ZXJuTWF0Y2hlcyhleHRyYWN0Q2hhbmdlbG9nU2VjdGlvbihjaGFuZ2Vsb2dDb250ZW50LCB2ZXJzaW9uKSwgcGF0dGVybnMpO1xuXG4gIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVGhlICR7dmVyc2lvbn0gc2VjdGlvbiBvZiAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gbWF0Y2hlcyBhIHBhdHRlcm4gZnJvbSB0aGUgZmlsZWBcbiAgICAgICsgYCAke0ZPUkJJRERFTl9QQVRURVJOU19GSUxFX0VOVl9WQVJJQUJMRX0gbmFtZXM6XFxuYFxuICAgICAgKyBgJHttYXRjaGVzLm1hcCgoeyBsaW5lLCBtYXRjaCB9KSA9PiBgJHtsaW5lfSAgICA8LSAke21hdGNofWApLmpvaW4oJ1xcbicpfVxcbmBcbiAgICAgICsgJ05vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB5ZXQuIFN1cHBseSByZWxlYXNlIG5vdGVzIHRoYXQgc2F5IHRoZSBzYW1lIHRoaW5nIHdpdGhvdXQgaXQsIHdpdGgnXG4gICAgICArICcgYC0tY2hhbmdlbG9nLWZpbGUgPHBhdGg+YCwgb3IgcmVtb3ZlIGl0IGF0IHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcsIGFuZCByZS1ydW4gdGhlIHJlbGVhc2UuJ1xuICApO1xufVxuXG4vKipcbiAqIFJlZnVzZXMgYSBjaGFuZ2Vsb2cgd2hvc2UgTkVXIHNlY3Rpb24gc3RpbGwgY2FycmllcyBhbiBlbnRyeSB0aGF0IHJlYWRzIGFzIGEgbWVyZ2Ugc3ViamVjdCBnaXQgd3JvdGUgaXRzZWxmLlxuICpcbiAqIFRoZSBjb252ZW50aW9uIHRoaXMgZW5mb3JjZXMgaXMgdGhhdCBhIG5vbi1mZiBtZXJnZSB0YWtlcyB0aGUgc2FtZSBDb252ZW50aW9uYWwtQ29tbWl0cyBzdWJqZWN0IGFzIHRoZSBicmFuY2hcbiAqIGNvbW1pdCBpdCBsYW5kcy4gTm90aGluZyB1c2VkIHRvIGhvbGQgaXQ6IGZvciBhIG5vbi1mZiBtZXJnZSB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCBpcyB0aGUgbWVyZ2UgY29tbWl0LCBzbyBhXG4gKiBkZWZhdWx0IHN1YmplY3Qgc2hpcHMgdmVyYmF0aW0sIHB1Ymxpc2hpbmcgYSBiYXJlIGJyYW5jaCBuYW1lIChgTWVyZ2UgYnJhbmNoICdmaXgtdGhlLXRoaW5nJ2ApIGFzIGEgY2hhbmdlbG9nXG4gKiBlbnRyeSDigJQgd2hpY2ggc2F5cyBub3RoaW5nIGFib3V0IHdoYXQgY2hhbmdlZCwgYW5kIG9uIGEgYnJhbmNoIG5hbWVkIGFmdGVyIGEgcHJpdmF0ZSB0cmFja2VyIGl0ZW0gZGVjb2RlcyB0b1xuICogbm90aGluZyBhdCBhbGwgZm9yIGEgcmVhZGVyLiBUaGUgaW50ZXJhY3RpdmUgcmV2aWV3IHdhcyB0aGUgZGUgZmFjdG8gY2F0Y2gsIGFuZCBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2AsIHRoZVxuICogZmxhZyBhbiB1bmF0dGVuZGVkIHJlbGVhc2UgYWN0dWFsbHkgdXNlcywgc2tpcHMgaXQ7IG9uZSBzd2VlcCBhY3Jvc3MgdGhpcyB3b3Jrc3BhY2UgZm91bmQgdHdlbHZlIHN1Y2hcbiAqIHB1Ymxpc2hlZCBlbnRyaWVzIGluIGEgc2luZ2xlIHJlcG9zaXRvcnkuXG4gKlxuICogT25seSB0aGUgc2VjdGlvbiBiZWluZyBwdWJsaXNoZWQgaXMgc2Nhbm5lZCwgc28gYW4gZW50cnkgYWxyZWFkeSBzaGlwcGVkIHVuZGVyIGFuIG9sZGVyIHZlcnNpb24gY2Fubm90IGJsb2NrXG4gKiBldmVyeSBmdXR1cmUgcmVsZWFzZS4ge0BsaW5rIHRvQ2hhbmdlbG9nRW50cnl9IGhhcyBhbHJlYWR5IHJld3JpdHRlbiBldmVyeSBtZXJnZSB0aGF0IGhhZCBhIGJvZHkgdG8gcmV3cml0ZVxuICogZnJvbSwgc28gd2hhdCByZWFjaGVzIGhlcmUgaXMgYSBtZXJnZSB3aG9zZSBhdXRob3Igd3JvdGUgbm90aGluZyBhdCBhbGwg4oCUIHdoaWNoIG5vIHJld3JpdGUgY2FuIGludmVudCwgYW5kXG4gKiB3aGljaCBpcyB0aGVyZWZvcmUgd29ydGggc3RvcHBpbmcgdGhlIHJlbGVhc2UgZm9yLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIHZlcnNpb24gd2hvc2Ugc2VjdGlvbiBpcyBhYm91dCB0byBiZSBwdWJsaXNoZWQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0cyhjaGFuZ2Vsb2dDb250ZW50OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBCVUxMRVRfUkVHX0VYUCA9IC9eLSAvO1xuICBjb25zdCBvZmZlbmRpbmdFbnRyaWVzID0gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbilcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbHRlcigobGluZSkgPT4gTUVSR0VfU1VCSkVDVF9SRUdfRVhQLnRlc3QobGluZS5yZXBsYWNlKEJVTExFVF9SRUdfRVhQLCAnJykpKTtcblxuICBpZiAob2ZmZW5kaW5nRW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFRoZSAke3ZlcnNpb259IHNlY3Rpb24gb2YgJHtSZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGNhcnJpZXMgYSBtZXJnZSBzdWJqZWN0IGdpdCB3cm90ZSBpdHNlbGY6XFxuYFxuICAgICAgKyBgJHtvZmZlbmRpbmdFbnRyaWVzLmpvaW4oJ1xcbicpfVxcbmBcbiAgICAgICsgJ1N1Y2ggYW4gZW50cnkgcHVibGlzaGVzIGEgYnJhbmNoIG5hbWUgaW5zdGVhZCBvZiBzYXlpbmcgd2hhdCBzaGlwcGVkLiBHaXZlIHRoZSBtZXJnZSBjb21taXQgdGhlIHNhbWUnXG4gICAgICArICcgc3ViamVjdCBhcyB0aGUgYnJhbmNoIGNvbW1pdCBpdCBsYW5kcyAoYGdpdCBjb21taXQgLS1hbWVuZGAgb24gdGhlIG1lcmdlLCB0aGVuIHJlLXJ1biB0aGUgcmVsZWFzZSksIG9yJ1xuICAgICAgKyAnIHN1cHBseSB0aGUgcmVsZWFzZSBub3RlcyB5b3Vyc2VsZiB3aXRoIGAtLWNoYW5nZWxvZy1maWxlIDxwYXRoPmAuJ1xuICApO1xufVxuXG4vKipcbiAqIFJlZnVzZXMgYSByZWxlYXNlIHRoYXQgd291bGQgaGF2ZSB0byBzdG9wIGF0IHRoZSBpbnRlcmFjdGl2ZSBjaGFuZ2Vsb2cgcmV2aWV3IHdpdGggbm9ib2R5IHRoZXJlIHRvXG4gKiBmaW5pc2ggaXQuIENhbGxlZCBmcm9tIHRoZSBwcmVmbGlnaHQgc28gdGhlIHJlZnVzYWwgY29zdHMgc2Vjb25kcywgbm90IHRoZSB3aG9sZSBjaGVjay1hbmQtYnVpbGQgZ2F0ZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nRmlsZVBhdGggLSBUaGUgcGF0aCB0byB0aGUgcHJlcGFyZWQgcmVsZWFzZSBub3Rlcywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub25lLlxuICogQHBhcmFtIHNob3VsZEVkaXRDaGFuZ2Vsb2cgLSBXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIGlzIG1lYW50IHRvIGJlIHJldmlld2VkIGludGVyYWN0aXZlbHkuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydENoYW5nZWxvZ1N0ZXBJc05vbkJsb2NraW5nKGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNob3VsZEVkaXRDaGFuZ2Vsb2c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGNoYW5nZWxvZ0ZpbGVQYXRoICE9PSB1bmRlZmluZWQgfHwgIXNob3VsZEVkaXRDaGFuZ2Vsb2cgfHwgcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnVGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcgbmVlZHMgYSB0ZXJtaW5hbCwgYW5kIHRoaXMgcHJvY2VzcyBoYXMgbm9uZSwgc28gdGhlIHJlbGVhc2Ugd291bGQgYmxvY2sgZm9yZXZlci4nXG4gICAgICArICcgUGFzcyBgLS1jaGFuZ2Vsb2ctZmlsZSA8cGF0aD5gIHRvIHN1cHBseSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzLCBvciBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2AgdG8gYWNjZXB0IHRoZSdcbiAgICAgICsgJyBjaGFuZ2Vsb2cgZ2VuZXJhdGVkIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlcyBhcyBpcy4nXG4gICk7XG59XG5cbi8qKlxuICogUnVucyB0aGUgY2hlY2tzIHtAbGluayBwcmVwYXJlQ2hhbmdlbG9nfSBydW5zIG9uIGEgY2hhbmdlbG9nIG5vYm9keSB3aWxsIHJldmlldywgYmVmb3JlIHRoZSBnYXRlIHJhdGhlciB0aGFuXG4gKiBhZnRlciBpdC5cbiAqXG4gKiBXaXRob3V0IGFuIGludGVyYWN0aXZlIHJldmlldyAoYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgLCBvciBgLS1jaGFuZ2Vsb2ctZmlsZWApLCB0aGUgbmV3IHNlY3Rpb24gaXMgZnVsbHkgZGVjaWRlZFxuICogYnkgd2hhdCBpcyBhbHJlYWR5IGNvbW1pdHRlZCwgc28gZXZlcnkgY2hlY2sgYHByZXBhcmVDaGFuZ2Vsb2dgIHdvdWxkIHRocm93IG9uIGNhbiBiZSBhbnN3ZXJlZCBpbiBzZWNvbmRzLiBBXG4gKiByZWxlYXNlIG9uY2UgcGFzc2VkIGl0cyB3aG9sZSAyNS1taW51dGUgcHJlZmxpZ2h0IGFuZCB3YXMgdGhlbiByZWZ1c2VkIGJ5IGBsaW50Om1kYCBvdmVyIGEgcHVzaGVkIGNvbW1pdCBzdWJqZWN0XG4gKiBpdCBjb3VsZCBoYXZlIG5hbWVkIGF0IHRoZSBzdGFydC4gV2l0aCBhIHJldmlldyBkdWUsIG5vdGhpbmcgaXMgY2hlY2tlZCBoZXJlLCBiZWNhdXNlIHRoZSBhdXRob3IgY2FuIHN0aWxsIGZpeFxuICogYSBmaW5kaW5nIGluIHRoZSBlZGl0b3IuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHJlcXVlc3RlZCB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBXaGVyZSB0aGUgc2VjdGlvbiBib2R5IGNvbWVzIGZyb20gYW5kIHdoZXRoZXIgdGhlIGludGVyYWN0aXZlIHJldmlldyB3YXMgYXNrZWQgZm9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZWN0aW9uIHdvdWxkIHBhc3MsIGFuZCByZWplY3RzIG5hbWluZyB3aGF0IGl0IGZhaWxzIG9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnROb25JbnRlcmFjdGl2ZUNoYW5nZWxvZ0lzUHVibGlzaGFibGUodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZywgb3B0aW9uczogVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGNoYW5nZWxvZ0ZpbGVQYXRoLCBjaGFuZ2Vsb2dTdHlsZSwgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWUgfSA9IG9wdGlvbnM7XG4gIGlmIChpc0NoYW5nZWxvZ1Jldmlld0R1ZShjaGFuZ2Vsb2dGaWxlUGF0aCwgc2hvdWxkRWRpdENoYW5nZWxvZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGNvbnN0IGNoYW5nZWxvZyA9IGF3YWl0IGNvbXBvc2VDaGFuZ2Vsb2dOb2JvZHlSZXZpZXdzKG5ld1ZlcnNpb24sIGNoYW5nZWxvZ0ZpbGVQYXRoLCBjaGFuZ2Vsb2dTdHlsZSk7XG4gIGNvbnN0IGZpbmRpbmdzID0gYXdhaXQgZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzKGNoYW5nZWxvZywgbmV3VmVyc2lvbik7XG4gIGlmIChmaW5kaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzLCBuZXdWZXJzaW9uKTtcbiAgfVxuXG4gIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0cyhjaGFuZ2Vsb2csIG5ld1ZlcnNpb24pO1xuICBhd2FpdCBhc3NlcnRDaGFuZ2Vsb2dIYXNOb0ZvcmJpZGRlblBhdHRlcm5zKGNoYW5nZWxvZywgbmV3VmVyc2lvbik7XG59XG5cbi8qKlxuICogUmVmdXNlcyBhIHJlbGVhc2Ugd2hvc2UgYnVtcCBpcyBMT1dFUiB0aGFuIHRoZSBjb21taXRzIGl0IGlzIGFib3V0IHRvIHB1Ymxpc2ggZm9yY2UgaXQgdG8gYmUuXG4gKlxuICogVGhlIHJ1bGUgdGhpcyBlbmZvcmNlcyBpcyBvbGQgYW5kIHdhcyB3cml0dGVuIGRvd24gYWZ0ZXIgYDk2LjUuMWAgc2hpcHBlZCBzaXggdW5yZWxlYXNlZCBgZmVhdDpgIGNvbW1pdHMgYXNcbiAqIGEgcGF0Y2g6IGNob29zZSB0aGUgYnVtcCBmcm9tIHRoZSB3aG9sZSByYW5nZSBzaW5jZSB0aGUgbGFzdCB0YWcsIG5ldmVyIGZyb20gdGhlIGNoYW5nZSB5b3UgaGFwcGVuIHRvIGJlXG4gKiB3b3JraW5nIG9uLiBJdCBkaWQgbm90IGhvbGQg4oCUIGAxMDUuMS4wYCBvZiB0aGlzIGxpYnJhcnkgaXMgYSBNSU5PUiBjYXJyeWluZyBgZmVhdCh2aXRlc3QtY29uZmlnKSFgLCBzbyBldmVyeVxuICogY29uc3VtZXIgb24gYSBjYXJldCByYW5nZSB0b29rIGEgYnJlYWtpbmcgY2hhbmdlIHdpdGggbm8gdmVyc2lvbiBzaWduYWwg4oCUIGFuZCBpdCBjb3VsZCBub3QgaG9sZCwgYmVjYXVzZSBpdFxuICogYXNrZWQgYSBodW1hbiB0byBzY2FuIGEgcmFuZ2UgYW5kIHRoZW4gdHlwZSBhIGJ1bXAgdGhhdCBub3RoaW5nIGNvbXBhcmVkIGFnYWluc3Qgd2hhdCB0aGUgc2NhbiB3b3VsZCBoYXZlXG4gKiBmb3VuZC4gVGhpcyBpcyB0aGF0IGNvbXBhcmlzb24sIGF0IHRoZSBvbmUgbW9tZW50IHRoZSBydWxlIGlzIGJlaW5nIGJyb2tlbi5cbiAqXG4gKiBJdCByZWZ1c2VzIG9ubHkgYSBidW1wIHRoYXQgaXMgdG9vIExPVy4gQSBkZWxpYmVyYXRlbHkgaGlnaGVyIG9uZSDigJQgYSBtYWpvciBjdXQgdG8gc2lnbmFsIGEgYnJlYWsgbGF0ZSwgYVxuICogbWlub3IgZm9yIGEgcmFuZ2Ugb2YgcHVyZSBgZml4YGVzIOKAlCBwYXNzZXMgdW50b3VjaGVkLCBhbmQgdGhlcmUgaXMgbm8gZmxhZyB0byBzd2l0Y2ggdGhlIGdhdGUgb2ZmOiBhblxuICogb3B0LW91dCBpcyB3aGF0IGdldHMgcmVhY2hlZCBmb3IgcmVmbGV4aXZlbHksIGFuZCB0aGUgbGVnaXRpbWF0ZSBlc2NhcGUgKGJ1bXAgaGlnaGVyKSBhbHJlYWR5IGV4aXN0cy5cbiAqXG4gKiBDYWxsZWQgZnJvbSB0aGUgcHJlZmxpZ2h0IHJhdGhlciB0aGFuIGF0IHRoZSBidW1wIGl0c2VsZiwgc28gYSByZWZ1c2FsIGNvc3RzIHNlY29uZHMgaW5zdGVhZCBvZiB0aGUgd2hvbGVcbiAqIGNoZWNrLWFuZC1idWlsZCBnYXRlLCBhbmQgbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHdoZW4gaXQgdGhyb3dzLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRoZSByZWxlYXNlIHdhcyBhc2tlZCBmb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydFZlcnNpb25VcGRhdGVUeXBlTWVldHNCdW1wRmxvb3IodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2ZXJzaW9uRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpO1xuICBjb25zdCBsYXN0VGFnID0gYXdhaXQgcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhhd2FpdCByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpKTtcblxuICAvLyBObyBiYXNlbGluZSwgbm8gcmFuZ2UsIG5vIGZsb29yLiBUaGlzIGlzIGEgZmlyc3QgcmVsZWFzZSwgb3Igb25lIHdob3NlIHByZXZpb3VzIHRhZyB3YXMgZGVsZXRlZCDigJQgdGhlXG4gIC8vIGNoYW5nZWxvZyBzdGVwIGZhbGxzIGJhY2sgdG8gdGhlIGZ1bGwgaGlzdG9yeSB0aGVyZSwgYW5kIGRlcml2aW5nIGEgZmxvb3IgZnJvbSB0aGUgZnVsbCBoaXN0b3J5IG9mIGEgcmVwb1xuICAvLyBhYm91dCB0byBjdXQgYDEuMC4wYCB3b3VsZCByZWZ1c2UgaXQgb3ZlciBjb21taXRzIHRoYXQgcHJlZGF0ZSB0aGUgY29uY2VwdCBvZiBhIHB1Ymxpc2hlZCBzdXJmYWNlLlxuICBpZiAoIWxhc3RUYWcpIHtcbiAgICB2ZXJzaW9uRGVidWdnZXIoJ05vIHByZXZpb3VzIHJlbGVhc2UgdGFnIHJlc29sdmVkLCBzbyB0aGUgYnVtcCBmbG9vciBpcyBub3QgZGVyaXZlZC4gVGhlIGJ1bXAgaXMgdGFrZW4gYXMgZ2l2ZW4uJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYnVtcEZsb29yID0gYXdhaXQgZ2V0QnVtcEZsb29yKGAke2xhc3RUYWd9Li5IRUFEYCk7XG4gIGNvbnN0IGZsb29yTGV2ZWwgPSBidW1wRmxvb3IubGV2ZWw7XG4gIGlmIChmbG9vckxldmVsID09PSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgY29uc3QgdGFrZW5MZXZlbCA9IHRvRWZmZWN0aXZlQnVtcExldmVsKGxhc3RUYWcsIG5ld1ZlcnNpb24pO1xuXG4gIC8vIEFuIHVucGFyc2FibGUgYmFzZWxpbmUgb3IgdGFyZ2V0IGlzIG5vdCB0aGlzIGdhdGUncyBidXNpbmVzcyB0byBmYWlsIGEgcmVsZWFzZSBvdmVyLiBJdCBjYW4gb25seSBoYXBwZW5cbiAgLy8gZm9yIGEgdGFnIHRoYXQgaXMgbm90IGEgdmVyc2lvbiBhdCBhbGwsIHdoaWNoIGV2ZXJ5IG90aGVyIHN0ZXAgaGVyZSB3b3VsZCBoYXZlIGl0cyBvd24gdHJvdWJsZSB3aXRoLlxuICBpZiAoIXRha2VuTGV2ZWwpIHtcbiAgICB2ZXJzaW9uRGVidWdnZXIoYENvdWxkIG5vdCBjb21wYXJlICcke25ld1ZlcnNpb259JyBhZ2FpbnN0IHRoZSBwcmV2aW91cyB0YWcgJyR7bGFzdFRhZ30nLCBzbyB0aGUgYnVtcCBmbG9vciBpcyBub3QgZW5mb3JjZWQuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQnVtcExldmVsQXRMZWFzdCh0YWtlbkxldmVsLCBmbG9vckxldmVsKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IHRvQnVtcEZsb29yRXJyb3IoYnVtcEZsb29yLCB7XG4gICAgbGFzdFRhZyxcbiAgICBuZXdWZXJzaW9uLFxuICAgIHRha2VuTGV2ZWwsXG4gICAgdmVyc2lvblVwZGF0ZVR5cGVcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwb3J0cyBpc3N1ZS1jbG9zaW5nIGZhaWx1cmVzIHdpdGhvdXQgZmFpbGluZyBhbiBhbHJlYWR5IHB1Ymxpc2hlZCByZWxlYXNlLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIHdob3NlIGlzc3VlcyBzaG91bGQgY2xvc2UuXG4gKiBAcGFyYW0gc2hvdWxkQ2xvc2UgLSBXaGV0aGVyIHRvIGNsb3NlIHRoZSBpc3N1ZXMgYWZ0ZXIgc3VjY2Vzc2Z1bCBkZWxpdmVyeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xvc2VSZWxlYXNlZElzc3Vlc1NhZmVseShuZXdWZXJzaW9uOiBzdHJpbmcsIHNob3VsZENsb3NlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghc2hvdWxkQ2xvc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBjbG9zZVJlbGVhc2VkSXNzdWVzKHsgbmV3VmVyc2lvbiB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFRoZSAke25ld1ZlcnNpb259IHJlbGVhc2UgaXMgcHVibGlzaGVkLCBidXQgY2xvc2luZyB0aGUgaXNzdWVzIGl0IGNhcnJpZXMgZmFpbGVkOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogQ29tcG9zZXMgdGhlIG5ldyBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IOKAlCB0aGUgbmV3IHNlY3Rpb24gZnJvbSB0aGUgY29tbWl0cyBzaW5jZSB0aGUgbGFzdCB0YWcsIG9yIGZyb20gdGhlXG4gKiBwcmVwYXJlZCBub3RlcywgYWJvdmUgdGhlIHByZXZpb3VzIHNlY3Rpb25zIOKAlCB3aXRob3V0IHJldmlld2luZywgY2hlY2tpbmcgb3Igd3JpdGluZyBpdC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdGhlIGNoYW5nZWxvZyBzZWN0aW9uIGlzIHdyaXR0ZW4gZm9yLlxuICogQHBhcmFtIGNoYW5nZWxvZ0ZpbGVQYXRoIC0gVGhlIHByZXBhcmVkIG5vdGVzLCB3aGVuIHRoZSByZWxlYXNlIHdhcyBnaXZlbiB0aGVtLlxuICogQHBhcmFtIGNoYW5nZWxvZ1N0eWxlIC0gSG93IGEgc2VjdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzIGlzIGxhaWQgb3V0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcG9zZWQgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcG9zZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNoYW5nZWxvZ1N0eWxlOiBDaGFuZ2Vsb2dTdHlsZSA9ICdncm91cGVkJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHByZXZpb3VzQ2hhbmdlbG9nTGluZXMgPSBhd2FpdCByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpO1xuXG4gIGxldCBuZXdDaGFuZ2VMb2cgPSBgIyBDSEFOR0VMT0dcXG5cXG4jIyAke25ld1ZlcnNpb259XFxuXFxuYDtcblxuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGxhc3RUYWcgPSBhd2FpdCByZXNvbHZlTGFzdFJlbGVhc2VkVGFnKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMpO1xuICAgIGNvbnN0IGNvbW1pdFJhbmdlID0gbGFzdFRhZyA/IGAke2xhc3RUYWd9Li5IRUFEYCA6ICdIRUFEJztcbiAgICBjb25zdCBjb21taXRNZXNzYWdlc1N0cmluZyA9IGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IGxvZyAke2NvbW1pdFJhbmdlfSAtLWZvcm1hdD0lQiAtLWZpcnN0LXBhcmVudCAtemAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBjb25zdCBjb21taXRNZXNzYWdlcyA9IGNvbW1pdE1lc3NhZ2VzU3RyaW5nLnNwbGl0KCdcXDAnKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAoY2hhbmdlbG9nU3R5bGUgPT09ICdncm91cGVkJykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAke3JlbmRlckdyb3VwZWRDaGFuZ2Vsb2dTZWN0aW9uKGNvbW1pdE1lc3NhZ2VzLm1hcCgoY29tbWl0TWVzc2FnZSkgPT4gdG9DaGFuZ2Vsb2dDb21taXRFbnRyeShjb21taXRNZXNzYWdlKSkpfVxcbmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgY29tbWl0TWVzc2FnZSBvZiBjb21taXRNZXNzYWdlcykge1xuICAgICAgICBuZXdDaGFuZ2VMb2cgKz0gYC0gJHthdXRvbGlua0JhcmVVcmxzKHRvQ2hhbmdlbG9nRW50cnkoY29tbWl0TWVzc2FnZSkpfVxcbmA7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByZXBhcmVkTm90ZXMgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgbmV3Q2hhbmdlTG9nICs9IGAke3JlcGxhY2VBbGwoeyAkc3RyaW5nOiBwcmVwYXJlZE5vdGVzLCByZXBsYWNlcjogJ1xcbicsIHNlYXJjaFZhbHVlOiAnXFxyXFxuJyB9KS50cmltKCl9XFxuYDtcbiAgfVxuXG4gIGlmIChwcmV2aW91c0NoYW5nZWxvZ0xpbmVzLmxlbmd0aCA+IDApIHtcbiAgICBuZXdDaGFuZ2VMb2cgKz0gJ1xcbic7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMpIHtcbiAgICAgIG5ld0NoYW5nZUxvZyArPSBgJHtsaW5lfVxcbmA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0NoYW5nZUxvZztcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0aGUgbmV3IGBDSEFOR0VMT0cubWRgIGNvbnRlbnQgZm9yIGEgcmVsZWFzZSBub2JvZHkgcmV2aWV3cywgYXBwbHlpbmcgYGxpbnQ6bWQ6Zml4YCdzIGZpeGVzIHRvIGEgc2VjdGlvblxuICogZ2VuZXJhdGVkIGZyb20gY29tbWl0IHN1YmplY3RzLlxuICpcbiAqIEEgc3ViamVjdCBjYW4gZmFpbCBgbGludDptZGAgd2l0aG91dCBhbnlvbmUgaGF2aW5nIGhhZCB0aGUgY2hhbmNlIHRvIGZpeCBpdDogYSBgLS1uby1mZmAgbWVyZ2UgaXMgbWFkZSB3aXRoXG4gKiBgSFVTS1k9MGAsIHNvIGNvbW1pdGxpbnQgbmV2ZXIgc2VlcyBpdCwgYW5kIGFuIGlzc3VlLWNsb3NpbmcgbWVyZ2UgdGFrZXMgdGhlIGlzc3VlIHRpdGxlIHZlcmJhdGltLiBBbiBPYnNpZGlhblxuICogcGx1Z2luJ3Mgc3ViamVjdCBuYW1pbmcgdGhlIHBsdWdpbiB3aXRob3V0IGJhY2t0aWNrcyBzdG9wcGVkIGEgcmVsZWFzZSB0aGF0IHdheSB0aHJlZSB0aW1lcywgYWZ0ZXIgdGhlIHdob2xlXG4gKiBwcmVmbGlnaHQuIFdoYXRldmVyIHRoZSByZXBvc2l0b3J5J3MgY29uZmlndXJhdGlvbiBjYW4gZml4IGlzIGZpeGVkIGhlcmUsIGFuZCB3aGF0IGl0IGNhbm5vdCBpcyBzdGlsbCByZWZ1c2VkIGJ5XG4gKiB0aGUgZmluZGluZ3MgY2hlY2sgdGhhdCBmb2xsb3dzLiBQcmVwYXJlZCBub3RlcyBhcmUgdGhlIGF1dGhvcidzIHJldmlld2VkIHRleHQsIHNvIHRoZXkgYXJlIG5ldmVyIHJld3JpdHRlbiwgYW5kXG4gKiBvbmx5IHRoZSBuZXcgc2VjdGlvbiBpcyB0b3VjaGVkLCBuZXZlciBhIHB1Ymxpc2hlZCBvbmUuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRoZSBjaGFuZ2Vsb2cgc2VjdGlvbiBpcyB3cml0dGVuIGZvci5cbiAqIEBwYXJhbSBjaGFuZ2Vsb2dGaWxlUGF0aCAtIFRoZSBwcmVwYXJlZCBub3Rlcywgd2hlbiB0aGUgcmVsZWFzZSB3YXMgZ2l2ZW4gdGhlbS5cbiAqIEBwYXJhbSBjaGFuZ2Vsb2dTdHlsZSAtIEhvdyBhIHNlY3Rpb24gZ2VuZXJhdGVkIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlcyBpcyBsYWlkIG91dC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbXBvc2VkIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbXBvc2VDaGFuZ2Vsb2dOb2JvZHlSZXZpZXdzKFxuICBuZXdWZXJzaW9uOiBzdHJpbmcsXG4gIGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNoYW5nZWxvZ1N0eWxlOiBDaGFuZ2Vsb2dTdHlsZSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlbG9nID0gYXdhaXQgY29tcG9zZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCBjaGFuZ2Vsb2dGaWxlUGF0aCwgY2hhbmdlbG9nU3R5bGUpO1xuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjaGFuZ2Vsb2c7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbigpO1xuICBpZiAoIU9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pLmluY2x1ZGVzKExJTlRfTURfU0NSSVBUX05BTUUpKSB7XG4gICAgcmV0dXJuIGNoYW5nZWxvZztcbiAgfVxuXG4gIGNvbnN0IHNlY3Rpb24gPSBleHRyYWN0Q2hhbmdlbG9nU2VjdGlvbihjaGFuZ2Vsb2csIG5ld1ZlcnNpb24pO1xuICBjb25zdCB7IGNvbnRlbnQsIGZpeENvdW50IH0gPSBhd2FpdCBmaXhNYXJrZG93bkNvbnRlbnQoe1xuICAgIGNvbnRlbnQ6IHRvQ2hhbmdlbG9nU2VjdGlvbkRvY3VtZW50KGNoYW5nZWxvZywgbmV3VmVyc2lvbiksXG4gICAgZmlsZVBhdGg6IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pXG4gIH0pO1xuICBpZiAoZml4Q291bnQgPT09IDApIHtcbiAgICByZXR1cm4gY2hhbmdlbG9nO1xuICB9XG5cbiAgY29uc29sZS53YXJuKGBGaXhlZCAke1N0cmluZyhmaXhDb3VudCl9IG1hcmtkb3dubGludCBmaW5kaW5nKHMpIGluIHRoZSBnZW5lcmF0ZWQgJHtuZXdWZXJzaW9ufSBjaGFuZ2Vsb2cgc2VjdGlvbiwgc28gaXQgZGlmZmVycyBmcm9tIHRoZSBjb21taXQgc3ViamVjdHMuYCk7XG4gIGNvbnN0IGhlYWRpbmcgPSBgIyMgJHtuZXdWZXJzaW9ufVxcblxcbmA7XG4gIHJldHVybiBjaGFuZ2Vsb2cucmVwbGFjZShgJHtoZWFkaW5nfSR7c2VjdGlvbn1gLCAoKSA9PiBgJHtoZWFkaW5nfSR7ZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY29udGVudCwgbmV3VmVyc2lvbil9YCk7XG59XG5mdW5jdGlvbiBkZXNjcmliZUJyYW5jaChicmFuY2g6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBicmFuY2ggPyBgYnJhbmNoICcke2JyYW5jaH0nYCA6ICdhIGRldGFjaGVkIEhFQUQnO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBib2R5IG9mIG9uZSB2ZXJzaW9uJ3MgYENIQU5HRUxPRy5tZGAgc2VjdGlvbiDigJQgZXZlcnl0aGluZyBiZXR3ZWVuIGl0cyBgIyMgPHZlcnNpb24+YCBoZWFkaW5nXG4gKiBhbmQgd2hpY2hldmVyIGNvbWVzIGZpcnN0LCB0aGUgbmV4dCBgIyMgYCBoZWFkaW5nIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gKlxuICogRW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgbm90IGFuIGVkZ2UgY2FzZSBidXQgdGhlIG5vcm1hbCBzaGFwZSBvZiBhIEZJUlNUIHJlbGVhc2U6IHNlY3Rpb25zIGFyZVxuICogcHJlcGVuZGVkLCBzbyB0aGUgbmV3ZXN0IG9uZSBpcyBib3VuZGVkIGJ5IHRoZSBwcmV2aW91cyByZWxlYXNlIG9ubHkgb25jZSBhIHByZXZpb3VzIHJlbGVhc2UgZXhpc3RzLiBUaGVcbiAqIHJlZ2V4IHRoaXMgcmVwbGFjZWQgcmVxdWlyZWQgYSB0cmFpbGluZyBgXFxuXFxuIyNgLCBzbyBldmVyeSBgMS4wLjBgIHNpbGVudGx5IHB1Ymxpc2hlZCBlbXB0eSByZWxlYXNlIG5vdGVzLlxuICogVGVybWluYXRpbmcgb24gYCcjIyAnYCBXSVRIIGl0cyB0cmFpbGluZyBzcGFjZSBpcyB3aGF0IGtlZXBzIGFuIGAjIyNgIHN1Yi1oZWFkaW5nIGluc2lkZSB0aGUgc2VjdGlvblxuICogaW5zdGVhZCBvZiB0cnVuY2F0aW5nIGl0IHRoZXJlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29udGVudHMgb2YgYENIQU5HRUxPRy5tZGAuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIFRoZSBzZWN0aW9uIGJvZHksIHRyaW1tZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBjaGFuZ2Vsb2cgaGFzIG5vIHNlY3Rpb24gZm9yIHRoYXQgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGNoYW5nZWxvZ0NvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgaGVhZGluZ0luZGV4ID0gbGluZXMuaW5kZXhPZihgIyMgJHt2ZXJzaW9ufWApO1xuICBpZiAoaGVhZGluZ0luZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGJvZHlTdGFydEluZGV4ID0gaGVhZGluZ0luZGV4ICsgMTtcbiAgY29uc3QgbmV4dEhlYWRpbmdPZmZzZXQgPSBsaW5lcy5zbGljZShib2R5U3RhcnRJbmRleCkuZmluZEluZGV4KChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoJyMjICcpKTtcbiAgY29uc3QgYm9keUVuZEluZGV4ID0gbmV4dEhlYWRpbmdPZmZzZXQgPT09IC0xID8gbGluZXMubGVuZ3RoIDogYm9keVN0YXJ0SW5kZXggKyBuZXh0SGVhZGluZ09mZnNldDtcbiAgcmV0dXJuIGxpbmVzLnNsaWNlKGJvZHlTdGFydEluZGV4LCBib2R5RW5kSW5kZXgpLmpvaW4oJ1xcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBEZXJpdmVzIHRoZSBsb3dlc3QgYnVtcCBhIGNvbW1pdCByYW5nZSBtYXkgYmUgcHVibGlzaGVkIHVuZGVyLCBmcm9tIHRoZSBDb252ZW50aW9uYWwtQ29tbWl0cyBtYXJrZXJzIHRoZVxuICogY29tbWl0cyBpbiBpdCBjYXJyeS5cbiAqXG4gKiBBIGAhYCBiZWZvcmUgdGhlIHN1YmplY3QncyBjb2xvbiwgb3IgYSBgQlJFQUtJTkcgQ0hBTkdFOmAgLyBgQlJFQUtJTkctQ0hBTkdFOmAgZm9vdGVyLCBmb3JjZXMgYSBtYWpvcjsgYVxuICogYGZlYXRgIHR5cGUgZm9yY2VzIGEgbWlub3I7IGV2ZXJ5dGhpbmcgZWxzZSDigJQgYGZpeGAsIGBjaG9yZWAsIGBkb2NzYCwgYHJlZmFjdG9yYCwgYW4gdW5wYXJzYWJsZSBzdWJqZWN0IOKAlFxuICogY29uc3RyYWlucyBub3RoaW5nIGFuZCB5aWVsZHMgYSBwYXRjaCBmbG9vciwgd2hpY2ggaXMgbm8gY29uc3RyYWludCBhdCBhbGwuXG4gKlxuICogKipFdmVyeSBjb21taXQgaW4gdGhlIHJhbmdlIGlzIHJlYWQsIGRlbGliZXJhdGVseSBOT1Qgb25seSB0aGUgZmlyc3QtcGFyZW50IG9uZXMqKiwgd2hpY2ggaXMgd2hlcmUgdGhpc1xuICogZGlmZmVycyBmcm9tIHRoZSBjaGFuZ2Vsb2cgZ2VuZXJhdGVkIG92ZXIgdGhlIHNhbWUgcmFuZ2UuIFRoZSBjaGFuZ2Vsb2cgaXMgZmlyc3QtcGFyZW50IGJlY2F1c2UgaXQgcHVibGlzaGVzXG4gKiBvbmUgbGluZSBwZXIgbGFuZGVkIGNoYW5nZTsgYSBicmVha2luZyBjaGFuZ2UgaXMgYnJlYWtpbmcgd2hpY2hldmVyIHBhcmVudCBpdCBhcnJpdmVkIG9uLiBDb25jcmV0ZWx5LFxuICoge0BsaW5rIHRvQ2hhbmdlbG9nRW50cnl9IGxpZnRzIG9ubHkgdGhlIEZJUlNUIGxpbmUgb2YgYSBtZXJnZSBib2R5IG9udG8gYSBkZWZhdWx0IG1lcmdlIHN1YmplY3QsIHNvIGFcbiAqIGBCUkVBS0lORyBDSEFOR0U6YCBmb290ZXIgd3JpdHRlbiBvbiBhIGJyYW5jaCBjb21taXQgaXMgaW52aXNpYmxlIHRvIHRoZSBmaXJzdC1wYXJlbnQgaGlzdG9yeSDigJQgYW5kIGEgZm9vdGVyXG4gKiBpcyB0aGUgb25lIGJyZWFraW5nIHNpZ25hbCBDb252ZW50aW9uYWwgQ29tbWl0cyBwdXRzIGluIHRoZSBib2R5IHJhdGhlciB0aGFuIHRoZSBzdWJqZWN0LiBUaGUgY29zdCBvZlxuICogcmVhZGluZyBldmVyeXRoaW5nIGlzIG92ZXItZGV0ZWN0aW9uOiBhIGJyYW5jaCB3aG9zZSBicmVha2luZyBjb21taXQgd2FzIHJld29ya2VkIGludG8gYSBub24tYnJlYWtpbmcgbWVyZ2VcbiAqIHN0aWxsIGZvcmNlcyBhIG1ham9yLiBUaGF0IGRpcmVjdGlvbiBpcyBzYWZlIOKAlCBhbiBvdmVyLWJ1bXAgY29zdHMgYSBjb25zdW1lciBub3RoaW5nIGFuZCB0aGUgbWVzc2FnZSBuYW1lc1xuICogdGhlIGNvbW1pdCBzbyB0aGUgYXV0aG9yIGNhbiBzZWUgZXhhY3RseSB3aGljaCBvbmUg4oCUIGFuZCB0aGUgb3RoZXIgZGlyZWN0aW9uIGlzIHRoZSBkZWZlY3QgdGhpcyBleGlzdHMgZm9yLlxuICpcbiAqIEBwYXJhbSBjb21taXRSYW5nZSAtIFRoZSBnaXQgcmV2aXNpb24gcmFuZ2UgdG8gc2NhbiwgZS5nLiBgMTA1LjIuMC4uSEVBRGAuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB7QGxpbmsgQnVtcEZsb29yfSB0aGUgcmFuZ2UgZm9yY2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCdW1wRmxvb3IoY29tbWl0UmFuZ2U6IHN0cmluZyk6IFByb21pc2U8QnVtcEZsb29yPiB7XG4gIC8vIGAlSCVuJUJgIHB1dHMgdGhlIGhhc2ggb24gaXRzIG93biBmaXJzdCBsaW5lIGFuZCB0aGUgZnVsbCBtZXNzYWdlIHVuZGVyIGl0LCBhbmQgYC16YCBzZXBhcmF0ZXMgdGhlXG4gIC8vIGNvbW1pdHMgd2l0aCBOVUwg4oCUIHNvIG5vdGhpbmcgaW4gYSBjb21taXQgbWVzc2FnZSBjYW4gYmUgbWlzdGFrZW4gZm9yIGEgcmVjb3JkIGJvdW5kYXJ5LlxuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoWydnaXQnLCAnbG9nJywgY29tbWl0UmFuZ2UsICctLWZvcm1hdD0lSCVuJUInLCAnLXonXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gIGNvbnN0IGZvcmNpbmdDb21taXRzID0gb3V0cHV0XG4gICAgLnNwbGl0KCdcXDAnKVxuICAgIC5tYXAoKHJlY29yZCkgPT4gdG9Gb3JjaW5nQ29tbWl0KHJlY29yZCkpXG4gICAgLmZpbHRlcigoZm9yY2luZ0NvbW1pdCkgPT4gZm9yY2luZ0NvbW1pdCAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JjaW5nQ29tbWl0cyxcbiAgICBsZXZlbDogdG9IaWdoZXN0QnVtcExldmVsKGZvcmNpbmdDb21taXRzKVxuICB9O1xufVxuXG4vKipcbiAqIFJ1bnMgYGxpbnQ6bWRgJ3MgYW5kIGBzcGVsbGNoZWNrYCdzIGNoZWNrcyBvdmVyIHRoZSBORVcgc2VjdGlvbiBvZiBhIGNvbXBvc2VkIGNoYW5nZWxvZywgYmVmb3JlIGFueSBvZiBpdFxuICogcmVhY2hlcyB0aGUgcmVwb3NpdG9yeS5cbiAqXG4gKiBPbmx5IHRoZSBuZXcgc2VjdGlvbiBpcyBjaGVja2VkLCBhbmQgZGVsaWJlcmF0ZWx5IHNvLiBUaGUgaG9uZXN0IGNoZWNrIGlzIHRoZSB3aG9sZSBmaWxlLCBidXQgaXQgZmFpbHMgYVxuICogcmVsZWFzZSBvbiBhIGRlZmVjdCBpbiBhIHNlY3Rpb24gc29tZWJvZHkgc2hpcHBlZCB5ZWFycyBhZ28g4oCUIHdoaWNoIGlzIGEgcmVsZWFzZSBub2JvZHkgY2FuIGN1dCB3aXRob3V0XG4gKiBmaXJzdCBmaXhpbmcgaGlzdG9yeSwgYW5kIGlzIGV4YWN0bHkgaG93IGEgY2hhbmdlbG9nIGRlZmVjdCBiZWNvbWVzIGEgcGVybWFuZW50IGJsb2NrZXIgaW5zdGVhZCBvZiBhXG4gKiB0d28tbWludXRlIGZpeC4gVGhhdCBpcyBub3QgaHlwb3RoZXRpY2FsIGZvciB0aGUgc3BlbGxpbmcgaGFsZiBpbiBwYXJ0aWN1bGFyOiBpdCBpcyB0aGUgc3RhdGUgZml2ZVxuICogcmVwb3NpdG9yaWVzIGluIHRoaXMgd29ya3NwYWNlIGFyZSBpbiwgZWFjaCB3aXRoIGEgY29pbmVkIHdvcmQgYWxyZWFkeSBwdWJsaXNoZWQgaW4gYW4gb2xkIHNlY3Rpb24uIFRoZSBuZXdcbiAqIHNlY3Rpb24gaXMgdGhlIG9ubHkgcGFydCB0aGlzIHJlbGVhc2UgaXMgcmVzcG9uc2libGUgZm9yLlxuICpcbiAqIEJPVEggY2hlY2tzIHJ1biBvdmVyIGV2ZXJ5IHNldHRsZSwgYW5kIG5laXRoZXIgc2hvcnQtY2lyY3VpdHMgdGhlIG90aGVyLiBBbiBhdXRob3Igd2hvIGhhcyBhIGhhcmQtd3JhcHBlZFxuICogbGluZSBhbmQgYSBjb2luZWQgd29yZCBpcyB0b2xkIGFib3V0IGJvdGggYXQgb25jZSwgaW4gb25lIHJvdW5kIG9mIHRoZSByZXZpZXcsIHJhdGhlciB0aGFuIGZpeGluZyBvbmUgYW5kXG4gKiBiZWluZyBzZW50IGJhY2sgZm9yIHRoZSBvdGhlci5cbiAqXG4gKiBFYWNoIGhhbGYgcnVucyBvbmx5IHdoZXJlIHRoZSBwcm9qZWN0IGRlZmluZXMgdGhlIHNjcmlwdCBpdCBzdGFuZHMgZm9yLCBqdXN0IGFzIHtAbGluayBnYXRlfSBydW5zIHRoYXQgc2NyaXB0XG4gKiBvbmx5IHdoZXJlIGl0IGlzIGRlZmluZWQuIEEgcHJvamVjdCB3aXRoIG5vIGBzcGVsbGNoZWNrYCBoYXMgbm8gc3BlbGxpbmcgY29uZmlndXJhdGlvbiBlaXRoZXIsIHNvIGBjc3BlbGxgIHdvdWxkXG4gKiBqdWRnZSBpdHMgcmVsZWFzZSBub3RlcyBhZ2FpbnN0IHRoZSBzdG9jayBkaWN0aW9uYXJpZXMgYWxvbmUgYW5kIHJlZnVzZSB0aGUgcmVsZWFzZSBvdmVyIHRoZSBwbHVnaW4ncyBvd24gbmFtZTpcbiAqIGEgY2hlY2sgdGhlIHByb2plY3QgbmV2ZXIgYWRvcHRlZCwgZW5mb3JjZWQgb25seSBhdCByZWxlYXNlIHRpbWUuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0NvbnRlbnQgLSBUaGUgZnVsbCBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIGlzIGFib3V0IHRvIGJlIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbmRpbmdzLCBvciBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBzZWN0aW9uIGlzIGNsZWFuLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDaGFuZ2Vsb2dTZWN0aW9uRmluZGluZ3MoY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPENoYW5nZWxvZ0ZpbmRpbmdbXT4ge1xuICBjb25zdCBjb250ZW50ID0gdG9DaGFuZ2Vsb2dTZWN0aW9uRG9jdW1lbnQoY2hhbmdlbG9nQ29udGVudCwgdmVyc2lvbik7XG4gIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBSZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IHNjcmlwdE5hbWVzID0gT2JqZWN0LmtleXMocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSk7XG5cbiAgY29uc3QgbWFya2Rvd25saW50RmluZGluZ3MgPSBzY3JpcHROYW1lcy5pbmNsdWRlcyhMSU5UX01EX1NDUklQVF9OQU1FKVxuICAgID8gYXdhaXQgbGludE1hcmtkb3duQ29udGVudCh7XG4gICAgICBjb250ZW50LFxuICAgICAgZmlsZVBhdGhcbiAgICB9KVxuICAgIDogW107XG4gIGNvbnN0IHNwZWxsaW5nRmluZGluZ3MgPSBzY3JpcHROYW1lcy5pbmNsdWRlcyhTUEVMTENIRUNLX1NDUklQVF9OQU1FKVxuICAgID8gYXdhaXQgc3BlbGxjaGVja0NvbnRlbnQoe1xuICAgICAgY29udGVudCxcbiAgICAgIGZpbGVQYXRoXG4gICAgfSlcbiAgICA6IFtdO1xuXG4gIHJldHVybiBbXG4gICAgLi4ubWFya2Rvd25saW50RmluZGluZ3MubWFwKCh0ZXh0KSA9PiAoe1xuICAgICAgc2NyaXB0TmFtZTogTElOVF9NRF9TQ1JJUFRfTkFNRSxcbiAgICAgIHRleHRcbiAgICB9KSksXG4gICAgLi4uc3BlbGxpbmdGaW5kaW5ncy5tYXAoKHRleHQpID0+ICh7XG4gICAgICBzY3JpcHROYW1lOiBTUEVMTENIRUNLX1NDUklQVF9OQU1FLFxuICAgICAgdGV4dFxuICAgIH0pKVxuICBdO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHJlbGVhc2UgYXNzZXRzOiB0aGUgcHJvamVjdCdzIGBucG0gcGFja2AgdGFyYmFsbCwgd3JpdHRlbiBpbnRvIGBkaXN0L2AsIGFuZCBgZGlzdC9zdHlsZXMuY3NzYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYXNzZXQgcGF0aHMsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE5wbVBhY2tSZWxlYXNlQXNzZXRQYXRocygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlc3VsdE91dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ25wbScsICdwYWNrJywgJy0tcGFjay1kZXN0aW5hdGlvbicsIFJlcG9QYXRocy5EaXN0LCAnLS1qc29uJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VOcG1QYWNrT3V0cHV0KHJlc3VsdE91dHB1dCk7XG4gIHJldHVybiBbXG4gICAgam9pbihSZXBvUGF0aHMuRGlzdCwgcmVzdWx0LmZpbGVuYW1lKSxcbiAgICBqb2luKFJlcG9QYXRocy5EaXN0LCBSZXBvUGF0aHMuU3R5bGVzQ3NzKVxuICBdO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBidW1wIHJlYWNoZXMgYSBmbG9vci5cbiAqXG4gKiBTcGVsbGVkIG91dCByYXRoZXIgdGhhbiBnaXZlbiBudW1lcmljIHJhbmtzLCBiZWNhdXNlIHRocmVlIGxldmVscyBkbyBub3QgbmVlZCBhbiBvcmRlcmluZyBzY2hlbWUgYW5kIGFcbiAqIGAyID49IDNgIGluIGEgcmVsZWFzZSBnYXRlIGlzIG9uZSB0cmFuc3Bvc2l0aW9uIGF3YXkgZnJvbSBzaWxlbnRseSBwYXNzaW5nIGV2ZXJ5dGhpbmcuIGBmbG9vckxldmVsYCBleGNsdWRlc1xuICoge0BsaW5rIFZlcnNpb25VcGRhdGVUeXBlLlBhdGNofSBmb3IgdGhlIHNhbWUgcmVhc29uIGl0IGlzIG5vdCB0ZXN0ZWQgZm9yOiBhIHBhdGNoIGZsb29yIGlzIG5vIGZsb29yLCBhbmQgaXRzXG4gKiBvbmx5IGNhbGxlciBoYXMgYWxyZWFkeSByZXR1cm5lZCBieSB0aGVuIOKAlCBhIGJyYW5jaCB0aGF0IGNhbiBvbmx5IGV2ZXIgYW5zd2VyIGB0cnVlYCBpcyBvbmUgbm9ib2R5IHJlYWRzIGFuZFxuICogbm90aGluZyBjb3ZlcnMuXG4gKlxuICogQHBhcmFtIGxldmVsIC0gVGhlIHtAbGluayBCdW1wTGV2ZWx9IGFjdHVhbGx5IHRha2VuLlxuICogQHBhcmFtIGZsb29yTGV2ZWwgLSBUaGUge0BsaW5rIEJ1bXBMZXZlbH0gcmVxdWlyZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGBsZXZlbGAgaXMgYXQgbGVhc3QgYGZsb29yTGV2ZWxgLlxuICovXG5mdW5jdGlvbiBpc0J1bXBMZXZlbEF0TGVhc3QobGV2ZWw6IEJ1bXBMZXZlbCwgZmxvb3JMZXZlbDogVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3IgfCBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vcik6IGJvb2xlYW4ge1xuICByZXR1cm4gZmxvb3JMZXZlbCA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3JcbiAgICA/IGxldmVsID09PSBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvclxuICAgIDogbGV2ZWwgIT09IFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbGVhc2Ugb3BlbnMgdGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcuIFByZXBhcmVkIG5vdGVzIGFyZSBhbHJlYWR5IHRoZSByZXZpZXdlZCB0ZXh0LCBzb1xuICogdGhleSBuZXZlciBvcGVuIGFuIGVkaXRvciwgd2hhdGV2ZXIgYHNob3VsZEVkaXRDaGFuZ2Vsb2dgIHNheXMuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0ZpbGVQYXRoIC0gVGhlIHByZXBhcmVkIG5vdGVzLCB3aGVuIHRoZSByZWxlYXNlIHdhcyBnaXZlbiB0aGVtLlxuICogQHBhcmFtIHNob3VsZEVkaXRDaGFuZ2Vsb2cgLSBXaGV0aGVyIHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcgd2FzIGFza2VkIGZvci5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHJldmlldyBpcyBkdWUuXG4gKi9cbmZ1bmN0aW9uIGlzQ2hhbmdlbG9nUmV2aWV3RHVlKGNoYW5nZWxvZ0ZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNob3VsZEVkaXRDaGFuZ2Vsb2c6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoYW5nZWxvZ0ZpbGVQYXRoID09PSB1bmRlZmluZWQgJiYgc2hvdWxkRWRpdENoYW5nZWxvZztcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgaXNzdWUgcmVmZXJlbmNlcyBvZmYgb25lIHtAbGluayBJU1NVRV9SRUZFUkVOQ0VfTElORV9SRUdfRVhQfSBsaW5lLlxuICpcbiAqIEEgY3Jvc3MtcmVwb3NpdG9yeSByZWZlcmVuY2UgaXMgcmVuZGVyZWQgYXMgaXRzIFVSTCByYXRoZXIgdGhhbiBhcyBgb3duZXIvcmVwbyNuYDogR2l0SHViIHNob3dzIHRoZSBVUkwgYXMgdGhlXG4gKiBzYW1lIHNob3J0IGxpbmssIGFuZCB0aGUgc3BlbGxjaGVja2VyIHRoZSBjaGFuZ2Vsb2cgc2VjdGlvbiBpcyBoZWxkIHRvIHNraXBzIGEgVVJMIGJ1dCBub3QgYSByZXBvc2l0b3J5IG5hbWUuXG4gKlxuICogQHBhcmFtIGxpbmUgLSBPbmUgbGluZSBvZiBhIGNvbW1pdCBib2R5LlxuICogQHJldHVybnMgVGhlIHJlZmVyZW5jZXMsIG9yIGBudWxsYCB3aGVuIHRoZSBsaW5lIGlzIG5vdCBhIHJlZmVyZW5jZSBsaW5lIG9yIGhvbGRzIGFueXRoaW5nIGJ1dCByZWZlcmVuY2VzLlxuICovXG5mdW5jdGlvbiBwYXJzZUlzc3VlUmVmZXJlbmNlTGluZShsaW5lOiBzdHJpbmcpOiBJc3N1ZVJlZmVyZW5jZVtdIHwgbnVsbCB7XG4gIGNvbnN0IHJlZmVyZW5jZXNUZXh0ID0gSVNTVUVfUkVGRVJFTkNFX0xJTkVfUkVHX0VYUC5leGVjKGxpbmUudHJpbSgpKT8uZ3JvdXBzPy5bJ3JlZmVyZW5jZXMnXTtcbiAgaWYgKHJlZmVyZW5jZXNUZXh0Py5yZXBsYWNlQWxsKElTU1VFX1JFRkVSRU5DRV9SRUdfRVhQLCAnJykucmVwbGFjZUFsbCgvXFxiYW5kXFxifFtcXHMsXS9nLCAnJykgIT09ICcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShyZWZlcmVuY2VzVGV4dC5tYXRjaEFsbChJU1NVRV9SRUZFUkVOQ0VfUkVHX0VYUCksIChtYXRjaCk6IElzc3VlUmVmZXJlbmNlID0+IHtcbiAgICBjb25zdCBiYXJlTnVtYmVyID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAnYmFyZU51bWJlcicpO1xuICAgIGlmIChiYXJlTnVtYmVyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyByZW5kZXJlZDogYCMke2JhcmVOdW1iZXJ9YCwgc3BlbGxpbmdzOiBbYCMke2JhcmVOdW1iZXJ9YF0gfTtcbiAgICB9XG4gICAgY29uc3QgcmVwb1NsdWcgPSBnZXRPcHRpb25hbE5hbWVkR3JvdXAobWF0Y2gsICd1cmxTbHVnJykgPz8gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAnc2x1ZycpO1xuICAgIGNvbnN0IGlzc3VlTnVtYmVyID0gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAndXJsTnVtYmVyJykgPz8gZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCAnc2x1Z051bWJlcicpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHJlcG9TbHVnKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShpc3N1ZU51bWJlcik7XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9TbHVnfS9pc3N1ZXMvJHtpc3N1ZU51bWJlcn1gO1xuICAgIHJldHVybiB7IHJlbmRlcmVkOiBgPCR7dXJsfT5gLCBzcGVsbGluZ3M6IFtgJHtyZXBvU2x1Z30jJHtpc3N1ZU51bWJlcn1gLCB1cmwsIGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvU2x1Z30vcHVsbC8ke2lzc3VlTnVtYmVyfWBdIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBzaW5nbGUgcGFjayByZXN1bHQgZnJvbSB0aGUgb3V0cHV0IG9mIGBucG0gcGFjayAtLWpzb25gLlxuICpcbiAqIFR3byB0aGluZ3MgbWFrZSB0aGlzIG1vcmUgdGhhbiBhIGBKU09OLnBhcnNlKClgLiBUaGUgcGF5bG9hZCBpcyBQUkVDRURFRCBvbiBzdGRvdXQgYnkgd2hhdGV2ZXIgdGhlXG4gKiBgcHJlcGFyZWAgc2NyaXB0IHByaW50ZWQgKHRoZSBgbnBtIG5vdGljZWAgbGluZXMgZ28gdG8gc3RkZXJyLCBub3QgaGVyZSksIHNvIGl0cyBzdGFydCBoYXMgdG8gYmUgZm91bmQg4oCUXG4gKiBhbmQgaXQgaXMgZm91bmQgYnkgcGFyc2luZyBmcm9tIGVhY2ggY2FuZGlkYXRlIHN0YXJ0IHJhdGhlciB0aGFuIGJ5IG1hdGNoaW5nIGEgbGl0ZXJhbCwgYmVjYXVzZSB0aGVcbiAqIHByZWZpeCBtYXkgaXRzZWxmIGNvbnRhaW4gYSBicmFjZS4gQW5kIHRoZSBwYXlsb2FkJ3MgU0hBUEUgZGVwZW5kcyBvbiB0aGUgbnBtIG1ham9yOiBucG0gMTEgYW5kIGVhcmxpZXJcbiAqIGVtaXQgYW4gYXJyYXkgb2YgcGFjayByZXN1bHRzLCBucG0gMTIgZW1pdHMgYW4gb2JqZWN0IGtleWVkIGJ5IHBhY2thZ2UgbmFtZS4gQm90aCBhcmUgYWNjZXB0ZWQ7IHNjYW5uaW5nXG4gKiBmb3IgdGhlIGFycmF5J3MgbGl0ZXJhbCBvcGVuaW5nIGlzIHdoYXQgYnJva2UgZXZlcnkgcmVsZWFzZSBvbiBucG0gMTIuXG4gKlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBzdGRvdXQgb2YgYG5wbSBwYWNrIC0tanNvbmAuXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIE5wbVBhY2tSZXN1bHR9IGRlc2NyaWJpbmcgdGhlIHBhY2tlZCB0YXJiYWxsLlxuICogQHRocm93cyBJZiB0aGUgb3V0cHV0IGhvbGRzIG5vIHBhcnNhYmxlIEpTT04gcGF5bG9hZCwgb3IgdGhlIHBheWxvYWQgaG9sZHMgbm8gcGFjayByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTnBtUGFja091dHB1dChvdXRwdXQ6IHN0cmluZyk6IE5wbVBhY2tSZXN1bHQge1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIG91dHB1dC5tYXRjaEFsbCgvW1t7XS9nKSkge1xuICAgIGxldCBwYXlsb2FkOiB1bmtub3duO1xuXG4gICAgdHJ5IHtcbiAgICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKG91dHB1dC5zbGljZShtYXRjaC5pbmRleCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIGFzIE5wbVBhY2tSZXN1bHRbXSA6IE9iamVjdC52YWx1ZXMocGF5bG9hZCBhcyBSZWNvcmQ8c3RyaW5nLCBOcG1QYWNrUmVzdWx0Pik7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0c1swXTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIG5vIHBhY2sgcmVzdWx0IGluIHRoZSBgbnBtIHBhY2sgLS1qc29uYCBvdXRwdXQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmluZCB0aGUgSlNPTiBwYXlsb2FkIGluIHRoZSBgbnBtIHBhY2sgLS1qc29uYCBvdXRwdXQnKTtcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0aGUgZnVsbCBuZXcgYENIQU5HRUxPRy5tZGAgY29udGVudCDigJQgaW5jbHVkaW5nIHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcsIHdoZW4gb25lIGlzIGR1ZSDigJRcbiAqIFdJVEhPVVQgdG91Y2hpbmcgdGhlIHJlcG9zaXRvcnkuIE5vdGhpbmcgaGVyZSB3cml0ZXMgaW50byB0aGUgcmVwbywgc28gYW4gaW50ZXJydXB0IGFueXdoZXJlIGluIHRoZVxuICogcmV2aWV3IHdpbmRvdyAodGhlIHdob2xlIHBvaW50IG9mIHRoZSBzcGxpdCkgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgZXhhY3RseSBhcyBpdCB3YXMuXG4gKlxuICogVGhlIHNldHRsZWQgY29udGVudCBpcyBoYW5kZWQgdG8ge0BsaW5rIGFzc2VydENoYW5nZWxvZ0hhc05vTWVyZ2VTdWJqZWN0c30gYmVmb3JlIGl0IGlzIHJldHVybmVkLCB3aGljaCBpc1xuICogaG93IHRoYXQgZ3VhcmQgcmVhY2hlcyBldmVyeSBjYWxsZXIgYW5kIGV2ZXJ5IHBhdGgg4oCUIHJldmlld2VkIG9yIG5vdCwgY29tbWl0LWRlcml2ZWQgb3IgcHJlcGFyZWQg4oCUIGZyb20gYVxuICogc2luZ2xlIHNpdGUuXG4gKlxuICogSXQgaXMgYWxzbyB3aGVyZSB0aGUgbmV3IHNlY3Rpb24gaXMgTElOVEVEIGFuZCBTUEVMTENIRUNLRUQsIGZvciB0aGUgc2FtZSByZWFzb24gYW5kIG9uZSB0aGUgcmVsZWFzZSdzXG4gKiBvcmRlcmluZyBmb3JjZXM6IHRoZSByZWxlYXNlJ3Mgb25seSBgbGludDptZGAgYW5kIGBzcGVsbGNoZWNrYCBydW4gaW4gdGhlIGdhdGUsIHdoaWNoIGlzIG92ZXIgYmVmb3JlIHRoaXNcbiAqIHRleHQgZXhpc3RzLCBzbyBldmVyeSBjaGFyYWN0ZXIgb2YgYSBuZXcgY2hhbmdlbG9nIHNlY3Rpb24gdXNlZCB0byBlbnRlciB0aGUgcmVwb3NpdG9yeSBhZnRlciB0aGUgb25seVxuICogY2hlY2tzIHRoYXQgY291bGQgaGF2ZSBsb29rZWQgYXQgaXQuIFRoZSBnZW5lcmF0b3IncyBvd24gYnVsbGV0cyBjYW5ub3QgZmFpbCB0aGVtIOKAlCB0aGV5IGFyZSBvbmVcbiAqIGB0b0ZpcnN0TGluZWAgcGVyIGNvbW1pdCDigJQgYnV0IHRoZSB0d28gcGF0aHMgYSBodW1hbiBvciBhbiBhZ2VudCB3cml0ZXMsIHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcgYW5kXG4gKiBgLS1jaGFuZ2Vsb2ctZmlsZWAsIGFyZSBleGFjdGx5IHRoZSBwYXRocyB0aGF0IGNhcnJ5IHByb3NlLiBBIGRlZmVjdCB0aGVyZSBkb2VzIG5vdCBmYWlsIHRoZSByZWxlYXNlOiBpdFxuICogbGFuZHMgb24gdGhlIGRlZmF1bHQgYnJhbmNoIGluc2lkZSB0aGUgYGNob3JlOiByZWxlYXNlYCBjb21taXQsIGFuZCB0dXJucyB0aGUgTkVYVCBnYXRlIHJlZCwgb24gYSBicmFuY2hcbiAqIGJlbG9uZ2luZyB0byBzb21lYm9keSB3aG8gZGlkIG5vdCB3cml0ZSBpdC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdGhlIGNoYW5nZWxvZyBzZWN0aW9uIGlzIHdyaXR0ZW4gZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnN9IGNvbnRyb2xsaW5nIHdoZXJlIHRoZSBzZWN0aW9uIGJvZHkgY29tZXMgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNldHRsZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGgsXG4gICAgY2hhbmdlbG9nU3R5bGUsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlzUmV2aWV3RHVlID0gaXNDaGFuZ2Vsb2dSZXZpZXdEdWUoY2hhbmdlbG9nRmlsZVBhdGgsIHNob3VsZEVkaXRDaGFuZ2Vsb2cpO1xuICBjb25zdCBuZXdDaGFuZ2VMb2cgPSBpc1Jldmlld0R1ZVxuICAgID8gYXdhaXQgY29tcG9zZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCBjaGFuZ2Vsb2dGaWxlUGF0aCwgY2hhbmdlbG9nU3R5bGUpXG4gICAgOiBhd2FpdCBjb21wb3NlQ2hhbmdlbG9nTm9ib2R5UmV2aWV3cyhuZXdWZXJzaW9uLCBjaGFuZ2Vsb2dGaWxlUGF0aCwgY2hhbmdlbG9nU3R5bGUpO1xuICBsZXQgc2V0dGxlZENoYW5nZUxvZyA9IG5ld0NoYW5nZUxvZztcbiAgbGV0IGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10gPSBbXTtcblxuICAvLyBUaGUgY2hlY2tzIHJ1biBvbiB0aGUgU0VUVExFRCB0ZXh0LCBzbyB0aGUgcmV2aWV3IHNpdHMgaW5zaWRlIHRoZSBsb29wIHJhdGhlciB0aGFuIGJlZm9yZSBpdDogdGhlIGF1dGhvciBpc1xuICAvLyBzdGlsbCBzaXR0aW5nIGF0IHRoZSBlZGl0b3IsIHNvIHRoZXkgYXJlIGhhbmRlZCB0aGUgZmluZGluZ3MgYW5kIHRoZSBzYW1lIHNjcmF0Y2ggY29weSBiYWNrLiBBIHJldmlldyB0aGF0XG4gIC8vIHJldHVybnMgYnl0ZS1pZGVudGljYWwgdGV4dCBpcyB0aGUgYXV0aG9yIGRlY2xpbmluZyB0byBmaXggdGhlbSwgd2hpY2ggZW5kcyB0aGUgbG9vcCBpbnN0ZWFkIG9mIHJlb3BlbmluZ1xuICAvLyBmb3IgZXZlci4gVGhlcmUgaXMgbm9ib2R5IHRvIGhhbmQgYSBmaW5kaW5nIHRvIG9uIHRoZSBvdGhlciBwYXRocywgc28gdGhvc2UgdGhyb3cgb24gdGhlIGZpcnN0IG9uZS5cbiAgZm9yICg7Oykge1xuICAgIGlmIChpc1Jldmlld0R1ZSkge1xuICAgICAgY29uc3QgcmV2aWV3ZWRDaGFuZ2VMb2cgPSBhd2FpdCByZXZpZXdDaGFuZ2Vsb2coc2V0dGxlZENoYW5nZUxvZywgZmluZGluZ3MpO1xuICAgICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA+IDAgJiYgcmV2aWV3ZWRDaGFuZ2VMb2cgPT09IHNldHRsZWRDaGFuZ2VMb2cpIHtcbiAgICAgICAgdGhyb3cgdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzLCBuZXdWZXJzaW9uKTtcbiAgICAgIH1cblxuICAgICAgc2V0dGxlZENoYW5nZUxvZyA9IHJldmlld2VkQ2hhbmdlTG9nO1xuICAgIH1cblxuICAgIGZpbmRpbmdzID0gYXdhaXQgZ2V0Q2hhbmdlbG9nU2VjdGlvbkZpbmRpbmdzKHNldHRsZWRDaGFuZ2VMb2csIG5ld1ZlcnNpb24pO1xuICAgIGlmIChmaW5kaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICghaXNSZXZpZXdEdWUpIHtcbiAgICAgIHRocm93IHRvQ2hhbmdlbG9nRmluZGluZ3NFcnJvcihmaW5kaW5ncywgbmV3VmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGxhc3QgdGhpbmcgdGhlIGNvbXBvc2l0aW9uIGRvZXMsIGFuZCB0aGF0IHBsYWNlbWVudCBpcyB0aGUgd2hvbGUgcG9pbnQ6IHRoaXMgT05FIHNpdGUgc2VlcyB0aGVcbiAgLy8gY29tbWl0LWRlcml2ZWQgYnVsbGV0cywgdGhlIHByZXBhcmVkIG5vdGVzIGFuZCB3aGF0ZXZlciBhIHJldmlldyBsZWZ0IGJlaGluZCwgc28gdGhlIGd1YXJkIHJ1bnMgd2hldGhlciBvciBub3RcbiAgLy8gdGhlIGludGVyYWN0aXZlIHJldmlldyBkb2VzIOKAlCBhbmQgdGhlIHJldmlldyBpcyBwcmVjaXNlbHkgd2hhdCBgLS1uby1jaGFuZ2Vsb2ctZWRpdGluZ2Agc2tpcHMuIE5vdGhpbmcgaGFzIGJlZW5cbiAgLy8gd3JpdHRlbiB0byB0aGUgcmVwb3NpdG9yeSB5ZXQgZWl0aGVyLCBzbyB0aGUgdGhyb3cgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgcHJpc3RpbmUgYW5kIHRoZSByZWxlYXNlIHJlLXJ1bm5hYmxlLlxuICBhc3NlcnRDaGFuZ2Vsb2dIYXNOb01lcmdlU3ViamVjdHMoc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gIGF3YWl0IGFzc2VydENoYW5nZWxvZ0hhc05vRm9yYmlkZGVuUGF0dGVybnMoc2V0dGxlZENoYW5nZUxvZywgbmV3VmVyc2lvbik7XG4gIHJldHVybiBzZXR0bGVkQ2hhbmdlTG9nO1xufVxuXG4vKipcbiAqIFJlYWRzIGBDSEFOR0VMT0cubWRgIGFuZCByZXR1cm5zIGV2ZXJ5dGhpbmcgYmVsb3cgaXRzIGAjIENIQU5HRUxPR2AgaGVhZGVyIOKAlCBzbyB0aGUgZmlyc3QgbGluZSBpcyB0aGVcbiAqIG5ld2VzdCBgIyMgPHZlcnNpb24+YCBoZWFkaW5nLCB3aGljaCBpcyB3aGF0IG5hbWVzIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24uXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbGluZXMsIG9yIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIHJlcG9zaXRvcnkgaGFzIG5vIGNoYW5nZWxvZ1xuICogeWV0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUHJldmlvdXNDaGFuZ2Vsb2dMaW5lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IEhFQURFUl9MSU5FU19DT1VOVCA9IDI7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGNoYW5nZWxvZ1BhdGgpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICBjb25zdCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJykuc2xpY2UoSEVBREVSX0xJTkVTX0NPVU5UKTtcbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMuYXQoLTEpID09PSAnJykge1xuICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgdGFnIG9mIHRoZSBsYXN0IHJlbGVhc2VkIHZlcnNpb24g4oCUIHRoZSBiYXNlbGluZSBib3RoIHRoZSBjaGFuZ2Vsb2cgcmFuZ2UgYW5kIHRoZSBidW1wIGZsb29yIGFyZVxuICogbWVhc3VyZWQgZnJvbSwgZGVyaXZlZCBvbmNlIGhlcmUgc28gdGhvc2UgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZSBhYm91dCB3aGljaCBjb21taXRzIGFyZSBiZWluZyBwdWJsaXNoZWQuXG4gKlxuICogQSBoZWFkaW5nIGlzIG5vdCBhIHRhZy4gQSBoYW5kLXdyaXR0ZW4gYCMjIDAuMC4wYCBwbGFjZWhvbGRlciBpbiBhIG5ldmVyLXRhZ2dlZCByZXBvLCBvciBhIHRhZyBkZWxldGVkIGFmdGVyXG4gKiB0aGUgZmFjdCwgd291bGQgb3RoZXJ3aXNlIHJlYWNoIGBnaXQgbG9nYCBhcyBhIHJldmlzaW9uIGl0IGNhbm5vdCByZXNvbHZlIOKAlCBhbmQgaXQgdXNlZCB0byByZWFjaCBpdCBhdCB0aGVcbiAqIHZlcnkgRU5EIG9mIHRoZSByZWxlYXNlLCBhZnRlciB0aGUgd2hvbGUgcHJlZmxpZ2h0IGhhZCBiZWVuIHBhaWQgZm9yLiBGYWxsaW5nIGJhY2sgdG8gbm8gYmFzZWxpbmVcbiAqIG92ZXItaW5jbHVkZXMgd2hlbiBhIHRhZyB3YXMgZGVsZXRlZCwgYnV0IHRoYXQgaXMgc2FmZSBhbmQgdmlzaWJsZTogdGhlIGNoYW5nZWxvZyByZXZpZXcgaXMgZXhhY3RseSB3aGVyZSBhblxuICogb3Zlci1pbmNsdWRlZCByYW5nZSBnZXRzIHRyaW1tZWQsIGFuZCB0aGUgYnVtcCBmbG9vciBkZWNsaW5lcyB0byBkZXJpdmUgYW55dGhpbmcgYXQgYWxsIHdpdGhvdXQgYSBiYXNlbGluZS5cbiAqXG4gKiBAcGFyYW0gcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyAtIFRoZSBsaW5lcyB7QGxpbmsgcmVhZFByZXZpb3VzQ2hhbmdlbG9nTGluZXN9IHJldHVybmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdGFnIG5hbWUsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZXJlIGlzIG5vbmUgdG8gcmVzb2x2ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxhc3RSZWxlYXNlZFRhZyhwcmV2aW91c0NoYW5nZWxvZ0xpbmVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGxhc3RUYWcgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzWzBdID8/ICcnLFxuICAgIHJlcGxhY2VyOiAnJyxcbiAgICBzZWFyY2hWYWx1ZTogJyMjICdcbiAgfSk7XG5cbiAgaWYgKCFsYXN0VGFnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMYXN0VGFnID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLXZlcmlmeScsICctLXF1aWV0JywgYHJlZnMvdGFncy8ke2xhc3RUYWd9YF0sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gIH0pO1xuXG4gIGlmICghcmVzb2x2ZWRMYXN0VGFnKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKShcbiAgICAgIGAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gc3RhcnRzIGF0ICcjIyAke2xhc3RUYWd9JywgYnV0IG5vIHN1Y2ggdGFnIGV4aXN0cy4gR2VuZXJhdGluZyB0aGUgY2hhbmdlbG9nIGZyb20gdGhlIGZ1bGwgaGlzdG9yeSBpbnN0ZWFkLmBcbiAgICApO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBsYXN0VGFnO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGFzc2V0cyBvbmNlIHByZXBhcmF0aW9uIGhhcyBmaW5pc2hlZCwgcmVmdXNpbmcgbWlzc2luZyBmaWxlcyBpbiB0aGUgZ3VhcmRlZCBtb2RlLlxuICpcbiAqIEBwYXJhbSBnZXRQYXRocyAtIFRoZSBjYWxsYmFjayBuYW1pbmcgdGhlIHByZXBhcmVkIGFzc2V0cy5cbiAqIEBwYXJhbSBzaG91bGRSZXF1aXJlQXNzZXRzIC0gV2hldGhlciBhIG1pc3NpbmcgcmVxdWVzdGVkIGFzc2V0IGZhaWxzIHRoZSByZWxlYXNlLlxuICogQHJldHVybnMgVGhlIGV4aXN0aW5nIHBhdGhzIHRvIGF0dGFjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVJlbGVhc2VBc3NldFBhdGhzKGdldFBhdGhzOiAoKSA9PiBQcm9taXNlPHN0cmluZ1tdPiwgc2hvdWxkUmVxdWlyZUFzc2V0czogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBnZXRQYXRocygpO1xuICByZXR1cm4gcGF0aHMuZmlsdGVyKChwYXRoKSA9PiB7XG4gICAgY29uc3QgaXNFeGlzdHMgPSBleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aCB9KSk7XG4gICAgaWYgKCFpc0V4aXN0cyAmJiBzaG91bGRSZXF1aXJlQXNzZXRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlbGVhc2UgYXNzZXQgZG9lcyBub3QgZXhpc3Q6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzRXhpc3RzO1xuICB9KTtcbn1cblxuLyoqXG4gKiBIYW5kcyB0aGUgY29tcG9zZWQgY2hhbmdlbG9nIHRvIHRoZSB1c2VyIGZvciByZXZpZXcgb24gYSBzY3JhdGNoIGNvcHkgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgYW5kXG4gKiByZXR1cm5zIHdoYXRldmVyIHRoZXkgbGVmdCBiZWhpbmQuIFRoZSBzY3JhdGNoIGZvbGRlciBpcyByZW1vdmVkIGV2ZW4gd2hlbiB0aGUgcmV2aWV3IGZhaWxzLlxuICpcbiAqIEBwYXJhbSBuZXdDaGFuZ2VMb2cgLSBUaGUgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudCB0byBoYW5kIG92ZXIgZm9yIHJldmlldy5cbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0aGUgcHJldmlvdXMgcm91bmQgb2YgdGhpcyByZXZpZXcgbGVmdCB1bmZpeGVkLCBwcmludGVkIGFib3ZlIHRoZSBwcm9tcHQgc29cbiAqIHRoZSBhdXRob3Igc2VlcyB3aGF0IGhhcyB0byBjaGFuZ2UuIEVtcHR5IG9uIHRoZSBmaXJzdCByb3VuZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldmlld2VkIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldmlld0NoYW5nZWxvZyhuZXdDaGFuZ2VMb2c6IHN0cmluZywgZmluZGluZ3M6IENoYW5nZWxvZ0ZpbmRpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHNjcmF0Y2hGb2xkZXIgPSBhd2FpdCBta2R0ZW1wKGpvaW4odG1wZGlyKCksICdjaGFuZ2Vsb2ctJykpO1xuICBjb25zdCBzY3JhdGNoQ2hhbmdlbG9nUGF0aCA9IGpvaW4oc2NyYXRjaEZvbGRlciwgUmVwb1BhdGhzLkNoYW5nZWxvZ01kKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlRmlsZShzY3JhdGNoQ2hhbmdlbG9nUGF0aCwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGNvZGVWZXJzaW9uID0gYXdhaXQgZXhlY0Zyb21Sb290KCdjb2RlIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHZlcnNpb25EZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJyk7XG4gICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihcbiAgICAgICAgYCR7UmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBkb2VzIG5vdCBwYXNzICR7dG9GYWlsZWRTY3JpcHROYW1lcyhmaW5kaW5ncyl9IHlldDpcXG4ke3RvRmluZGluZ0xpbmVzKGZpbmRpbmdzKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb2RlVmVyc2lvbikge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKGBQbGVhc2UgdXBkYXRlIHRoZSAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gZmlsZS4gQ2xvc2UgVmlzdWFsIFN0dWRpbyBDb2RlIHdoZW4geW91IGFyZSBkb25lLi4uYCk7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydjb2RlJywgJy13Jywgc2NyYXRjaENoYW5nZWxvZ1BhdGhdLCB7XG4gICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKCdDb3VsZCBub3QgZmluZCBWaXN1YWwgU3R1ZGlvIENvZGUgaW4geW91ciBQQVRILiBVc2luZyBjb25zb2xlIG1vZGUgaW5zdGVhZC4nKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oXG4gICAgICAgIGBQbGVhc2UgdXBkYXRlIHRoZSAke3NjcmF0Y2hDaGFuZ2Vsb2dQYXRofSBmaWxlLiBQcmVzcyBFbnRlciB3aGVuIHlvdSBhcmUgZG9uZS4uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBybShzY3JhdGNoRm9sZGVyLCB7XG4gICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlcnJvciB0aGF0IHJlZnVzZXMgYSBidW1wIGxvd2VyIHRoYW4gdGhlIHJhbmdlIGZvcmNlcy5cbiAqXG4gKiBJdCBuYW1lcyBldmVyeSBmb3JjaW5nIGNvbW1pdCB3aXRoIGl0cyBzaG9ydCBoYXNoLCBpdHMgc3ViamVjdCBhbmQgV0hJQ0ggbWFya2VyIGZvcmNlZCBpdCwgYmVjYXVzZSB0aGVcbiAqIHJlbWVkeSBkZXBlbmRzIG9uIHRoYXQ6IGEgYGZlYXQhYCBpcyBhIGRlbGliZXJhdGUgYnJlYWsgc29tZWJvZHkgdHlwZWQsIHdoaWxlIGEgYEJSRUFLSU5HIENIQU5HRTpgIGZvb3RlclxuICogc2l0cyBpbiBhIGJvZHkgbm9ib2R5IHJlLXJlYWRzIGFuZCBpcyBleGFjdGx5IHRoZSB0aGluZyB0aGlzIGdhdGUgZXhpc3RzIHRvIHN1cmZhY2UuIFRoZSBpbnN0cnVjdGlvbiBpcyB0b1xuICogdGFrZSB0aGUgaGlnaGVyIGJ1bXAsIG5vdCB0byBlZGl0IHRoZSBjb21taXRzIOKAlCBoaXN0b3J5IHRoYXQgYWxyZWFkeSByZWFjaGVkIHRoZSBkZWZhdWx0IGJyYW5jaCBpcyB3aGF0IGFcbiAqIHJlbGVhc2UgcHVibGlzaGVzLCBhbmQgcmV3cml0aW5nIGl0IHRvIGRvZGdlIGEgdmVyc2lvbiBzaWduYWwgaXMgdGhlIGRlZmVjdCBvbmUgbGV2ZWwgdXAuXG4gKlxuICogQHBhcmFtIGJ1bXBGbG9vciAtIFRoZSBkZXJpdmVkIHtAbGluayBCdW1wRmxvb3J9LlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUge0BsaW5rIEJ1bXBGbG9vclJlZnVzYWxDb250ZXh0fSBkZXNjcmliaW5nIHdoYXQgd2FzIGFza2VkIGZvci5cbiAqIEByZXR1cm5zIFRoZSBlcnJvciB0byB0aHJvdy5cbiAqL1xuZnVuY3Rpb24gdG9CdW1wRmxvb3JFcnJvcihidW1wRmxvb3I6IEJ1bXBGbG9vciwgY29udGV4dDogQnVtcEZsb29yUmVmdXNhbENvbnRleHQpOiBFcnJvciB7XG4gIGNvbnN0IGZvcmNpbmdMaW5lcyA9IGJ1bXBGbG9vci5mb3JjaW5nQ29tbWl0c1xuICAgIC5tYXAoKGZvcmNpbmdDb21taXQpID0+IGAgICR7Zm9yY2luZ0NvbW1pdC5zaGEuc2xpY2UoMCwgU0hPUlRfU0hBX0xFTkdUSCl9ICAke2ZvcmNpbmdDb21taXQuc3ViamVjdH0gICgke2ZvcmNpbmdDb21taXQubWFya2VyfSlgKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGBUaGUgY29tbWl0cyBzaW5jZSAke2NvbnRleHQubGFzdFRhZ30gZm9yY2UgYXQgbGVhc3QgYSAke2J1bXBGbG9vci5sZXZlbH0gcmVsZWFzZSwgYnV0ICcke2NvbnRleHQudmVyc2lvblVwZGF0ZVR5cGV9JyB3b3VsZCBwdWJsaXNoYFxuICAgICAgKyBgICR7Y29udGV4dC5uZXdWZXJzaW9ufSwgd2hpY2ggaXMgYSAke2NvbnRleHQudGFrZW5MZXZlbH0uXFxuYFxuICAgICAgKyBgJHtmb3JjaW5nTGluZXN9XFxuYFxuICAgICAgKyAnQSByZWxlYXNlIHB1Ymxpc2hlcyBldmVyeSBjb21taXQgc2luY2UgdGhlIGxhc3QgdGFnLCBub3QgdGhlIGNoYW5nZSB5b3UgaGFwcGVuIHRvIGJlIHdvcmtpbmcgb24sIHNvIHRoZSdcbiAgICAgICsgJyBidW1wIGhhcyB0byBhbnN3ZXIgZm9yIGFsbCBvZiB0aGVtLiBSZS1ydW4gdGhlIHJlbGVhc2Ugd2l0aCBhJ1xuICAgICAgKyBgICR7YnVtcEZsb29yLmxldmVsfSBidW1wIOKAlCBhIGhpZ2hlciBvbmUgaXMgYWx3YXlzIGFjY2VwdGVkLCBhbmQgbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHlldC5gXG4gICk7XG59XG5cbi8qKlxuICogVHVybnMgb25lIGZ1bGwgY29tbWl0IG1lc3NhZ2UgKGBnaXQgbG9nIC0tZm9ybWF0PSVCYCkgaW50byB0aGUgY2hhbmdlbG9nIGxpbmUgaXQgc2hvdWxkIGNvbnRyaWJ1dGUuXG4gKlxuICogTm9ybWFsbHkgdGhhdCBpcyB0aGUgc3ViamVjdC4gVGhlIGV4Y2VwdGlvbiBpcyBhIG1lcmdlIHdob3NlIHN1YmplY3QgZ2l0IHdyb3RlIGl0c2VsZjogZm9yIGEgbm9uLWZmIG1lcmdlXG4gKiB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCBJUyB0aGUgbWVyZ2UgY29tbWl0LCBzbyBpdHMgc3ViamVjdCBpcyB3aGF0IHNoaXBzLCBhbmQgYSBkZWZhdWx0IG9uZSBwdWJsaXNoZXMgYVxuICogcHJpdmF0ZSBicmFuY2ggbmFtZSBhcyBhIGNoYW5nZWxvZyBlbnRyeS4gVGhlIG1lc3NhZ2UgdGhlIGF1dGhvciBhY3R1YWxseSB3cm90ZSBpcyB1c3VhbGx5IHN0aWxsIHRoZXJlIOKAlFxuICogb25lIGxpbmUgYmVsb3csIGFzIHRoZSBtZXJnZSBib2R5IOKAlCBzbyBpdCBpcyBsaWZ0ZWQgb3V0IHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgd2hpY2ggaXMgZXhhY3RseSB0aGUgZWRpdCBhXG4gKiBodW1hbiBtYWtlcyBieSBoYW5kIGF0IHRoZSByZXZpZXcgc3RlcC4gQSBtZXJnZSB3aXRoIG5vIGJvZHkgaGFzIG5vdGhpbmcgdG8gbGlmdCBhbmQga2VlcHMgaXRzIHN1YmplY3Q7XG4gKiB7QGxpbmsgYXNzZXJ0Q2hhbmdlbG9nSGFzTm9NZXJnZVN1YmplY3RzfSBpcyB3aGF0IHN0b3BzIHRoYXQgb25lIGZyb20gYmVpbmcgcHVibGlzaGVkLlxuICpcbiAqIFRoZSBpc3N1ZXMgdGhlIGJvZHkgbmFtZXMgb24ge0BsaW5rIElTU1VFX1JFRkVSRU5DRV9MSU5FX1JFR19FWFB9IGxpbmVzIGFyZSBhcHBlbmRlZCB0byB0aGUgbGluZSwgc28gdGhlXG4gKiByZWxlYXNlIGxpbmtzIHRoZW0uIE9ubHkgdGhlIGZpcnN0LXBhcmVudCBjb21taXQncyBib2R5IGlzIHJlYWQsIHNvIGZvciBhIG1lcmdlIGl0IGlzIHRoZSBtZXJnZSBtZXNzYWdlIHRoYXRcbiAqIGhhcyB0byBjYXJyeSB0aGVtLiBBIHJlZmVyZW5jZSB0aGUgbGluZSBhbHJlYWR5IHNob3dzIGlzIG5vdCByZXBlYXRlZC5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TWVzc2FnZSAtIFRoZSBmdWxsIGNvbW1pdCBtZXNzYWdlLlxuICogQHJldHVybnMgVGhlIGNoYW5nZWxvZyBsaW5lIGZvciB0aGF0IGNvbW1pdC5cbiAqL1xuZnVuY3Rpb24gdG9DaGFuZ2Vsb2dFbnRyeShjb21taXRNZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB7IGVudHJ5LCByZWZlcmVuY2VzIH0gPSB0b0NoYW5nZWxvZ0NvbW1pdEVudHJ5KGNvbW1pdE1lc3NhZ2UpO1xuICByZXR1cm4gcmVmZXJlbmNlcy5sZW5ndGggPT09IDAgPyBlbnRyeSA6IGAke2VudHJ5fSAoJHtyZWZlcmVuY2VzLmpvaW4oJywgJyl9KWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlcnJvciB0aGF0IHN0b3BzIGEgcmVsZWFzZSB3aG9zZSBuZXcgY2hhbmdlbG9nIHNlY3Rpb24gZG9lcyBub3QgcGFzcyBgbGludDptZGAgb3IgYHNwZWxsY2hlY2tgLlxuICpcbiAqIEl0IGlzIHRocm93biBmcm9tIHRoZSBjb21wb3NpdGlvbiBzdGVwLCB3aGljaCBpcyBCRUZPUkUgYW55dGhpbmcgaXMgd3JpdHRlbiwgc28gdGhlIHJlY292ZXJ5IGl0IGRlc2NyaWJlcyBpc1xuICogdGhlIHdob2xlIHJlY292ZXJ5OiB0aGVyZSBpcyBub3RoaW5nIHRvIHJldmVydCwgYW5kIHRoZSByZWxlYXNlIHJlLXJ1bnMgZnJvbSB0aGUgdG9wLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncywgYXMge0BsaW5rIGdldENoYW5nZWxvZ1NlY3Rpb25GaW5kaW5nc30gY29sbGVjdGVkIHRoZW0uXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gd2FzIGJlaW5nIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIFRoZSBlcnJvciB0byB0aHJvdy5cbiAqL1xuZnVuY3Rpb24gdG9DaGFuZ2Vsb2dGaW5kaW5nc0Vycm9yKGZpbmRpbmdzOiBDaGFuZ2Vsb2dGaW5kaW5nW10sIHZlcnNpb246IHN0cmluZyk6IEVycm9yIHtcbiAgY29uc3Qgc2NyaXB0TmFtZXMgPSB0b0ZhaWxlZFNjcmlwdE5hbWVzKGZpbmRpbmdzKTtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgVGhlICR7dmVyc2lvbn0gc2VjdGlvbiBvZiAke1JlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gZG9lcyBub3QgcGFzcyAke3NjcmlwdE5hbWVzfTpcXG5gXG4gICAgICArIGAke3RvRmluZGluZ0xpbmVzKGZpbmRpbmdzKX1cXG5gXG4gICAgICArICdUaGUgY2hhbmdlbG9nIGlzIHNldHRsZWQgYmVmb3JlIGl0IGlzIHdyaXR0ZW4sIHNvIHRoaXMgc3RvcHMgdGhlIHJlbGVhc2Ugd2l0aCB0aGUgcmVwb3NpdG9yeSB1bnRvdWNoZWQnXG4gICAgICArICcgYW5kIG5vdGhpbmcgdG8gcmV2ZXJ0LiBUaGUgbGluZSBudW1iZXJzIGFyZSB0aGUgb25lcyB0aGUgd3JpdHRlbiBmaWxlIHdvdWxkIGhhdmUgaGFkLiBGaXggdGhlIHJlbGVhc2UnXG4gICAgICArICcgbm90ZXMg4oCUIGluIHRoZSBwcmVwYXJlZCBub3RlcyBmaWxlLCBvciBpbiB0aGUgY29tbWl0IG1lc3NhZ2VzIHRoZXkgd2VyZSBnZW5lcmF0ZWQgZnJvbSDigJQgb3IsIGZvciBhIHdvcmQnXG4gICAgICArICcgdGhpcyBwcm9qZWN0IHJlYWxseSBkb2VzIHVzZSwgYWRkIGl0IHRvIHRoZSBwcm9qZWN0XFwncyBgY3NwZWxsYCBjb25maWd1cmF0aW9uLCBhbmQgcmUtcnVuIHRoZSByZWxlYXNlLidcbiAgICAgICsgJyBSZWxlYXNpbmcgYW55d2F5IHdvdWxkIGxhbmQgdGhlIGRlZmVjdCBvbiB0aGUgZGVmYXVsdCBicmFuY2ggaW5zaWRlIHRoZSByZWxlYXNlIGNvbW1pdCwgd2hlcmUgdGhlIG5leHQnXG4gICAgICArIGAgJHtzY3JpcHROYW1lc30gb24gYW55b25lJ3MgYnJhbmNoIHJlcG9ydHMgaXQuYFxuICApO1xufVxuXG4vKipcbiAqIFdyYXBzIG9uZSB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24gaW4gdGhlIG1pbmltYWwgZG9jdW1lbnQgdGhlIGNoZWNrcyBhcmUgaGFuZGVkLlxuICpcbiAqIFRoZSBzZWN0aW9uIGdvZXMgaW5zaWRlIGEgZG9jdW1lbnQgcmF0aGVyIHRoYW4gb24gaXRzIG93biwgc28gdGhlIGhlYWRpbmcgYW5kIGxpc3QgcnVsZXMgc2VlIHRoZVxuICogY29udGV4dCB0aGV5IG5lZWQgKGEgZG9jdW1lbnQgd2hvc2UgZmlyc3QgbGluZSBpcyBhIGxpc3QgaXRlbSBpcyBhIGRpZmZlcmVudCBkb2N1bWVudCkuIFRoZSBsaW5lIG51bWJlcnMgYVxuICogZmluZGluZyByZXBvcnRzIGFyZSB0aGVuIHRoZSBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCdzIG93biwgd2hpY2ggaXMgbm90IGEgY29pbmNpZGVuY2UgYW5kIGlzIHdvcnRoIGtlZXBpbmc6XG4gKiBhIHNlY3Rpb24gaXMgUFJFUEVOREVELCBzbyB0aGlzIGRvY3VtZW50IGlzIGNoYXJhY3Rlci1mb3ItY2hhcmFjdGVyIHRoZSBoZWFkIG9mIHRoZSBmaWxlIGFib3V0IHRvIGJlIHdyaXR0ZW4uXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0NvbnRlbnQgLSBUaGUgZnVsbCBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50LlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIGlzIGFib3V0IHRvIGJlIHB1Ymxpc2hlZC5cbiAqIEByZXR1cm5zIFRoZSBtaW5pbWFsIGRvY3VtZW50IHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiB0b0NoYW5nZWxvZ1NlY3Rpb25Eb2N1bWVudChjaGFuZ2Vsb2dDb250ZW50OiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhlYWRpbmcgPSBgIyBDSEFOR0VMT0dcXG5cXG4jIyAke3ZlcnNpb259YDtcbiAgY29uc3Qgc2VjdGlvbiA9IGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNoYW5nZWxvZ0NvbnRlbnQsIHZlcnNpb24pO1xuICAvLyBBbiBlbXB0eSBzZWN0aW9uIGlzIGEgcmVhbCBzaGFwZSDigJQgYSByZWxlYXNlIHdpdGggbm8gY29tbWl0cyB0byBkZXNjcmliZSwgb3IgcHJlcGFyZWQgbm90ZXMgdGhhdCBhcmUgYW5cbiAgLy8gZW1wdHkgZmlsZSDigJQgYW5kIGFwcGVuZGluZyBhIGJsYW5rIGJvZHkgdG8gdGhlIGhlYWRpbmcgd291bGQgcmVwb3J0IGEgZGVmZWN0IHRoaXMgcmVsZWFzZSBkaWQgbm90IGNvbW1pdC5cbiAgcmV0dXJuIHNlY3Rpb24gPT09ICcnID8gYCR7aGVhZGluZ31cXG5gIDogYCR7aGVhZGluZ31cXG5cXG4ke3NlY3Rpb259XFxuYDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGAtLWNoYW5nZWxvZy1zdHlsZWAgdmFsdWUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIGZsYWcncyB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCB3YXMgbm90IHBhc3NlZC5cbiAqIEByZXR1cm5zIFRoZSBzdHlsZSwgb3IgYHVuZGVmaW5lZGAgZm9yIHRoZSBkZWZhdWx0LlxuICogQHRocm93cyBJZiB0aGUgdmFsdWUgbmFtZXMgbm8ge0BsaW5rIENoYW5nZWxvZ1N0eWxlfS5cbiAqL1xuZnVuY3Rpb24gdG9DaGFuZ2Vsb2dTdHlsZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogQ2hhbmdlbG9nU3R5bGUgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBzdHlsZSA9IENIQU5HRUxPR19TVFlMRVMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgPT09IHZhbHVlKTtcbiAgaWYgKCFzdHlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biAtLWNoYW5nZWxvZy1zdHlsZSAnJHt2YWx1ZX0nLiBVc2Ugb25lIG9mOiAke0NIQU5HRUxPR19TVFlMRVMuam9pbignLCAnKX0uYCk7XG4gIH1cblxuICByZXR1cm4gc3R5bGU7XG59XG5cbi8qKlxuICogUmVhZHMgb2ZmIHdoaWNoIHJlbGVhc2UgbGluZSBhIHZlcnNpb24gYWN0dWFsbHkgbW92ZXMsIHJlbGF0aXZlIHRvIHRoZSBiYXNlbGluZSBpdCBpcyBiZWluZyBjdXQgZnJvbS5cbiAqXG4gKiBUaGlzIGlzIG1lYXN1cmVkIHJhdGhlciB0aGFuIHJlYWQgb2ZmIHRoZSByZXF1ZXN0ZWQgdHlwZSBvbiBwdXJwb3NlLCBiZWNhdXNlIHRoZSB0eXBlIGRvZXMgbm90IGFsd2F5cyBzYXkuXG4gKiBgcHJlcmVsZWFzZWAgYWR2YW5jZXMgd2hpY2hldmVyIGxpbmUgYW4gZWFybGllciBgcHJlbWFqb3JgIG9yIGBwcmVtaW5vcmAgYWxyZWFkeSBjaG9zZSwgYW5kIGFuIGV4cGxpY2l0XG4gKiBgeC55LnpgIHNheXMgbm90aGluZyBhdCBhbGwgdW50aWwgaXQgaXMgY29tcGFyZWQuIFRha2luZyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHJlc3VsdGluZyB2ZXJzaW9uIGFuc3dlcnMgYWxsXG4gKiBvZiB0aGVtIHdpdGggb25lIHJ1bGUg4oCUIGFuZCBpdCBhbnN3ZXJzIHRoZW0gdGhlIHdheSBhIGNvbnN1bWVyJ3MgY2FyZXQgcmFuZ2Ugc2VlcyBpdCwgd2hpY2ggaXMgdGhlIG9ubHlcbiAqIHJlYWRpbmcgdGhhdCBtYXR0ZXJzIGZvciBhIHB1Ymxpc2hlZCBzdXJmYWNlLlxuICpcbiAqIEBwYXJhbSBiYXNlVmVyc2lvbiAtIFRoZSBwcmV2aW91cyByZWxlYXNlZCB2ZXJzaW9uLlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgdmVyc2lvbiBhYm91dCB0byBiZSBwdWJsaXNoZWQuXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIEJ1bXBMZXZlbH0sIG9yIGBudWxsYCB3aGVuIGVpdGhlciB2ZXJzaW9uIGlzIG5vdCBwYXJzYWJsZSBhcyBzZW12ZXIuXG4gKi9cbmZ1bmN0aW9uIHRvRWZmZWN0aXZlQnVtcExldmVsKGJhc2VWZXJzaW9uOiBzdHJpbmcsIG5ld1ZlcnNpb246IHN0cmluZyk6IEJ1bXBMZXZlbCB8IG51bGwge1xuICBjb25zdCBiYXNlID0gcGFyc2UoYmFzZVZlcnNpb24pO1xuICBjb25zdCBuZXh0ID0gcGFyc2UobmV3VmVyc2lvbik7XG4gIGlmICghYmFzZSB8fCAhbmV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG5leHQubWFqb3IgPiBiYXNlLm1ham9yKSB7XG4gICAgcmV0dXJuIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yO1xuICB9XG5cbiAgcmV0dXJuIG5leHQubWlub3IgPiBiYXNlLm1pbm9yID8gVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IgOiBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcbn1cblxuLyoqXG4gKiBOYW1lcyB0aGUgbnBtIHNjcmlwdHMgdGhhdCBhY3R1YWxseSByZXBvcnRlZCBzb21ldGhpbmcsIGluIHRoZSBvcmRlciB0aGV5IHJhbi5cbiAqXG4gKiBOYW1pbmcgYm90aCB1bmNvbmRpdGlvbmFsbHkgd291bGQgYmUgdGhlIGVhc3kgdmVyc2lvbiBhbmQgd291bGQgYmUgYSBsaWUgaGFsZiB0aGUgdGltZTogYSByZWxlYXNlIHN0b3BwZWQgYnlcbiAqIGEgY29pbmVkIHdvcmQgd291bGQgdGVsbCBpdHMgYXV0aG9yIHRvIGdvIGFuZCBsb29rIGF0IGBsaW50Om1kYCwgd2hpY2ggcGFzc2VkLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBuYW1lIHRoZSBzY3JpcHRzIG9mLlxuICogQHJldHVybnMgVGhlIHNjcmlwdCBuYW1lcywgam9pbmVkIGZvciBwcm9zZSDigJQgYGxpbnQ6bWRgLCBgc3BlbGxjaGVja2AsIG9yIGBsaW50Om1kIGFuZCBzcGVsbGNoZWNrYC5cbiAqL1xuZnVuY3Rpb24gdG9GYWlsZWRTY3JpcHROYW1lcyhmaW5kaW5nczogQ2hhbmdlbG9nRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc2NyaXB0TmFtZXMgPSBbTElOVF9NRF9TQ1JJUFRfTkFNRSwgU1BFTExDSEVDS19TQ1JJUFRfTkFNRV0uZmlsdGVyKChzY3JpcHROYW1lKSA9PiBmaW5kaW5ncy5zb21lKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNjcmlwdE5hbWUgPT09IHNjcmlwdE5hbWUpKTtcbiAgcmV0dXJuIHNjcmlwdE5hbWVzLmpvaW4oJyBhbmQgJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgZmluZGluZ3MgZm9yIGEgbWVzc2FnZSwgZWFjaCBsaW5lIHRhZ2dlZCB3aXRoIHRoZSBzY3JpcHQgdGhhdCByZXBvcnRlZCBpdC5cbiAqXG4gKiBUaGUgdGFnIGlzIG5vdCBkZWNvcmF0aW9uOiB0aGUgdHdvIHRvb2xzJyBvdXRwdXQgc2hhcGVzIGFyZSBzaW1pbGFyIGVub3VnaCB0byBiZSBtaXN0YWtlbiBmb3IgZWFjaCBvdGhlcixcbiAqIGFuZCB0aGUgZml4IGZvciBvbmUgaXMgbm90IHRoZSBmaXggZm9yIHRoZSBvdGhlci5cbiAqXG4gKiBAcGFyYW0gZmluZGluZ3MgLSBUaGUgZmluZGluZ3MgdG8gcmVuZGVyLlxuICogQHJldHVybnMgVGhlIHJlbmRlcmVkIGxpbmVzLCBvbmUgZmluZGluZyBwZXIgbGluZS5cbiAqL1xuZnVuY3Rpb24gdG9GaW5kaW5nTGluZXMoZmluZGluZ3M6IENoYW5nZWxvZ0ZpbmRpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBmaW5kaW5ncy5tYXAoKGZpbmRpbmcpID0+IGBbJHtmaW5kaW5nLnNjcmlwdE5hbWV9XSAke2ZpbmRpbmcudGV4dH1gKS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBDbGFzc2lmaWVzIG9uZSBgZ2l0IGxvZyAtLWZvcm1hdD0lSCVuJUIgLXpgIHJlY29yZCBpbnRvIHRoZSB7QGxpbmsgRm9yY2luZ0NvbW1pdH0gaXQgaXMsIG9yIGBudWxsYCB3aGVuIGl0XG4gKiBmb3JjZXMgbm90aGluZy5cbiAqXG4gKiBAcGFyYW0gcmVjb3JkIC0gT25lIE5VTC1kZWxpbWl0ZWQgcmVjb3JkOiB0aGUgZnVsbCBoYXNoIG9uIHRoZSBmaXJzdCBsaW5lLCB0aGUgZnVsbCBjb21taXQgbWVzc2FnZSBiZWxvdyBpdC5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRm9yY2luZ0NvbW1pdH0sIG9yIGBudWxsYCBmb3IgYSByZWNvcmQgdGhhdCBjb25zdHJhaW5zIG5vdGhpbmcgb3IgaXMgbm90IGEgcmVjb3JkIGF0IGFsbFxuICogKHRoZSB0cmFpbGluZyBlbXB0eSBzdHJpbmcgYC16YCBvdXRwdXQgZW5kcyB3aXRoLCBhbW9uZyBvdGhlcnMpLlxuICovXG5mdW5jdGlvbiB0b0ZvcmNpbmdDb21taXQocmVjb3JkOiBzdHJpbmcpOiBGb3JjaW5nQ29tbWl0IHwgbnVsbCB7XG4gIC8vIFRoZSB0cmFpbGluZyBlbXB0eSByZWNvcmQgYC16YCBsZWF2ZXMgaGFzIG5vIGhhc2gsIGFuZCBhIHJlY29yZCB3aXRoIG5vIGxpbmUgdW5kZXIgdGhlIGhhc2ggaXMgbm90IG9uZVxuICAvLyB0aGlzIGNhbiBjbGFzc2lmeS4gQm90aCBhcmUgdGhlIHNhbWUgbm9uLWFuc3dlci5cbiAgY29uc3QgW3NoYSwgc3ViamVjdExpbmUsIC4uLmJvZHlMaW5lc10gPSByZWNvcmQuc3BsaXQoJ1xcbicpO1xuICBpZiAoIXNoYSB8fCBzdWJqZWN0TGluZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzdWJqZWN0ID0gc3ViamVjdExpbmUudHJpbSgpO1xuICBjb25zdCBib2R5ID0gYm9keUxpbmVzLmpvaW4oJ1xcbicpO1xuICBjb25zdCBzdWJqZWN0TWF0Y2ggPSBDT05WRU5USU9OQUxfQ09NTUlUX1NVQkpFQ1RfUkVHX0VYUC5leGVjKHN1YmplY3QpO1xuXG4gIGlmIChzdWJqZWN0TWF0Y2g/Lmdyb3Vwcz8uWydicmVha2luZyddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxldmVsOiBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvcixcbiAgICAgIG1hcmtlcjogQlJFQUtJTkdfTUFSS0VSLFxuICAgICAgc2hhLFxuICAgICAgc3ViamVjdFxuICAgIH07XG4gIH1cblxuICBpZiAoQlJFQUtJTkdfQ0hBTkdFX0ZPT1RFUl9SRUdfRVhQLnRlc3QoYm9keSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGV2ZWw6IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yLFxuICAgICAgbWFya2VyOiBCUkVBS0lOR19DSEFOR0VfRk9PVEVSX01BUktFUixcbiAgICAgIHNoYSxcbiAgICAgIHN1YmplY3RcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN1YmplY3RNYXRjaD8uZ3JvdXBzPy5bJ3R5cGUnXT8udG9Mb3dlckNhc2UoKSA9PT0gRkVBVF9UWVBFXG4gICAgPyB7XG4gICAgICBsZXZlbDogVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IsXG4gICAgICBtYXJrZXI6IEZFQVRfVFlQRV9NQVJLRVIsXG4gICAgICBzaGEsXG4gICAgICBzdWJqZWN0XG4gICAgfVxuICAgIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZWR1Y2VzIHRoZSBjb21taXRzIHRoYXQgZm9yY2Ugc29tZXRoaW5nIHRvIHRoZSBvbmUgZmxvb3IgdGhlIHJhbmdlIGFzIGEgd2hvbGUgaGFzIHRvIGNsZWFyLlxuICpcbiAqIEBwYXJhbSBmb3JjaW5nQ29tbWl0cyAtIFRoZSB7QGxpbmsgRm9yY2luZ0NvbW1pdH1zIGZvdW5kIGluIHRoZSByYW5nZS5cbiAqIEByZXR1cm5zIFRoZSBoaWdoZXN0IHtAbGluayBCdW1wTGV2ZWx9IGFueSBvZiB0aGVtIGZvcmNlcywgb3Ige0BsaW5rIFZlcnNpb25VcGRhdGVUeXBlLlBhdGNofSDigJQgbm9cbiAqIGNvbnN0cmFpbnQg4oCUIHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gKi9cbmZ1bmN0aW9uIHRvSGlnaGVzdEJ1bXBMZXZlbChmb3JjaW5nQ29tbWl0czogcmVhZG9ubHkgRm9yY2luZ0NvbW1pdFtdKTogQnVtcExldmVsIHtcbiAgaWYgKGZvcmNpbmdDb21taXRzLnNvbWUoKGZvcmNpbmdDb21taXQpID0+IGZvcmNpbmdDb21taXQubGV2ZWwgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1ham9yKSkge1xuICAgIHJldHVybiBWZXJzaW9uVXBkYXRlVHlwZS5NYWpvcjtcbiAgfVxuXG4gIHJldHVybiBmb3JjaW5nQ29tbWl0cy5sZW5ndGggPiAwID8gVmVyc2lvblVwZGF0ZVR5cGUuTWlub3IgOiBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDtcbn1cblxuLyoqXG4gKiBWZXJpZmllcyBwdWJsaWMgcmVsZWFzZSBtZXRhZGF0YSBhbmQgY29tcGxldGVkIHVwbG9hZHMgYmVmb3JlIGV4cG9zaW5nIGl0cyB2ZXJzaW9uIG9uIHRoZSBicmFuY2guXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgZXhhY3QgdmVyc2lvbiB0YWcgZXhwZWN0ZWQgb24gdGhlIHJlbGVhc2UuXG4gKiBAcGFyYW0gZmlsZVBhdGhzIC0gVGhlIGZpbGVzIHdob3NlIHVwbG9hZHMgbXVzdCBiZSBjb21wbGV0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5R2l0SHViUmVsZWFzZShuZXdWZXJzaW9uOiBzdHJpbmcsIGZpbGVQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVsZWFzZSA9IEpTT04ucGFyc2UoXG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KFtcbiAgICAgICdnaCcsXG4gICAgICAncmVsZWFzZScsXG4gICAgICAndmlldycsXG4gICAgICBuZXdWZXJzaW9uLFxuICAgICAgJy0tanNvbicsXG4gICAgICAnaXNEcmFmdCxpc1ByZXJlbGVhc2UsdGFnTmFtZSxhc3NldHMnXG4gICAgXSwgeyBpc1F1aWV0OiB0cnVlIH0pXG4gICkgYXMgR2l0SHViUmVsZWFzZU1ldGFkYXRhO1xuICBpZiAoXG4gICAgcmVsZWFzZS5pc0RyYWZ0IHx8IHJlbGVhc2UudGFnTmFtZSAhPT0gbmV3VmVyc2lvbiB8fCByZWxlYXNlLmlzUHJlcmVsZWFzZSAhPT0gaXNQcmVSZWxlYXNlKG5ld1ZlcnNpb24pXG4gICAgfHwgZmlsZVBhdGhzLnNvbWUoKHBhdGgpID0+IHJlbGVhc2UuYXNzZXRzLmV2ZXJ5KChhc3NldCkgPT4gIShhc3NldC5uYW1lID09PSBiYXNlbmFtZShwYXRoKSAmJiBhc3NldC5zdGF0ZSA9PT0gJ3VwbG9hZGVkJykpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB2ZXJpZnkgdGhlIHB1YmxpYyAke25ld1ZlcnNpb259IHJlbGVhc2UgYW5kIGl0cyB1cGxvYWRlZCBhc3NldHM7IHRoZSByZW1vdGUgYnJhbmNoIHdhcyBub3QgYWR2YW5jZWQuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGNvbXBvc2VkIGNoYW5nZWxvZyBpbnRvIHRoZSByZXBvc2l0b3J5LiBEZWxpYmVyYXRlbHkgdGhlIGxhc3QgdGhpbmcgdGhlIGNoYW5nZWxvZyBzdGVwIGRvZXMsXG4gKiBzbyBub3RoaW5nIGxhbmRzIG9uIGRpc2sgdW50aWwgdGhlIGNvbnRlbnQgaXMgc2V0dGxlZC5cbiAqXG4gKiBAcGFyYW0gbmV3Q2hhbmdlTG9nIC0gVGhlIHNldHRsZWQgYENIQU5HRUxPRy5tZGAgY29udGVudCB0byB3cml0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlbG9nIGhhcyBiZWVuIHdyaXR0ZW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2hhbmdlbG9nKG5ld0NoYW5nZUxvZzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlRmlsZShyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KSwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQSxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHFCQUFxQjtBQUM5QixTQUFTLFlBQVk7QUFDckI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsaUJBQWlCO0FBQzFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVFQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsaUJBQWlCO0FBQzFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBa1VQLE1BQU0saUNBQWlDO0FBT3ZDLE1BQU0sZ0NBQWdDO0FBS3RDLE1BQU0sa0JBQWtCO0FBS3hCLE1BQU0sbUJBQW1CO0FBU3pCLE1BQU0sc0NBQXNDO0FBSzVDLE1BQU0sZ0JBQWdCO0FBS3RCLE1BQU0sWUFBWTtBQU1sQixNQUFNLDBCQUEwQjtBQVVoQyxNQUFNLCtCQUErQjtBQU1yQyxNQUFNLHNCQUFzQjtBQU01QixNQUFNLG1CQUFtQjtBQUt6QixNQUFNLHlCQUF5QjtBQWUvQixNQUFNLHdCQUF3QjtBQU92QixJQUFLLG9CQUFMLGtCQUFLQSx1QkFBTDtBQUNMLEVBQUFBLG1CQUFBLGFBQVU7QUFDVixFQUFBQSxtQkFBQSxXQUFRO0FBQ1IsRUFBQUEsbUJBQUEsWUFBUztBQUNULEVBQUFBLG1CQUFBLFdBQVE7QUFDUixFQUFBQSxtQkFBQSxXQUFRO0FBQ1IsRUFBQUEsbUJBQUEsY0FBVztBQUNYLEVBQUFBLG1CQUFBLGNBQVc7QUFDWCxFQUFBQSxtQkFBQSxjQUFXO0FBQ1gsRUFBQUEsbUJBQUEsZ0JBQWE7QUFUSCxTQUFBQTtBQUFBLEdBQUE7QUFlWixNQUFNLDZCQUE2QixJQUFJLElBQStCO0FBQUEsRUFDcEU7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztBQXdCN0IsZUFBc0IsVUFBVSxZQUFvQixXQUFtQztBQUNyRixRQUFNLGFBQWEsY0FBYyxVQUFVLE9BQU8sVUFBVSxXQUFXLFlBQVksSUFBSSxTQUFTLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDOUg7QUFnQkEsZUFBc0IscUJBQXFCLFlBQW9CLFVBQXVDLENBQUMsR0FBa0I7QUFDdkgsUUFBTSxFQUFFLHFCQUFxQixLQUFLLElBQUk7QUFDdEMsUUFBTSxrQkFBa0IsZUFBZSxTQUFTO0FBRWhELFFBQU0sa0JBQWtCLENBQUMsT0FBTyxVQUFVLE1BQU0sa0JBQWtCLFVBQVUsSUFBSSxpQkFBaUIsR0FBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFFO0FBRS9JLGFBQVM7QUFDUCxRQUFJO0FBQ0YsWUFBTSxhQUFhLENBQUMsT0FBTyxPQUFPLE9BQU8sR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQzdELFlBQU0sYUFBYSxpQkFBaUIsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNyRDtBQUFBLElBQ0YsU0FBUyxPQUFPO0FBQ2QsVUFBSSxDQUFDLFFBQVEsTUFBTSxPQUFPO0FBQ3hCLGNBQU07QUFBQSxNQUNSO0FBRUE7QUFBQSxRQUNFO0FBQUEsRUFBa0MsY0FBYyxLQUFLLENBQUM7QUFBQTtBQUFBLE1BRXhEO0FBQ0EsWUFBTSxnQkFBZ0IsUUFBUSxPQUFPLFFBQVEsTUFBTSxFQUFFLFNBQVMsb0NBQW9DO0FBQUEsSUFDcEc7QUFBQSxFQUNGO0FBQ0Y7QUFTQSxlQUFzQiwyQkFBMEM7QUFDOUQsTUFBSTtBQUNGLFVBQU0sYUFBYSxnQkFBZ0IsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLEVBQ3RELFFBQVE7QUFDTixVQUFNLElBQUksTUFBTSw2RUFBNkU7QUFBQSxFQUMvRjtBQUNGO0FBU0EsZUFBc0IscUJBQW9DO0FBQ3hELE1BQUk7QUFDRixVQUFNLGFBQWEsaUJBQWlCLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFBQSxFQUN2RCxRQUFRO0FBQ04sVUFBTSxJQUFJLE1BQU0sbUVBQW1FO0FBQUEsRUFDckY7QUFDRjtBQVNBLGVBQXNCLHFCQUFvQztBQUN4RCxNQUFJO0FBQ0YsVUFBTSxTQUFTLE1BQU0sYUFBYSxnREFBZ0QsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNuRyxRQUFJLFFBQVE7QUFDVixZQUFNLElBQUksTUFBTTtBQUFBLElBQ2xCO0FBQUEsRUFDRixRQUFRO0FBQ04sVUFBTSxJQUFJLE1BQU0sa0dBQWtHO0FBQUEsRUFDcEg7QUFDRjtBQWdCQSxlQUFzQiwwQkFBMEIsWUFBb0IsV0FBeUIsT0FBZ0M7QUFDM0gsUUFBTSxrQkFBa0Isa0JBQWtCLFVBQVU7QUFDcEQsUUFBTSxTQUFTLE1BQU0sYUFBYSxDQUFDLE9BQU8sVUFBVSxnQkFBZ0IsR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ3hGLFFBQU0sb0JBQW9CO0FBQzFCLFFBQU0sVUFBVSxNQUFNLGFBQWEsQ0FBQyxPQUFPLE9BQU8sTUFBTSxxQkFBcUIsR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ2pHLFFBQU0sQ0FBQyxNQUFNLElBQUksVUFBVSxJQUFJLFVBQVUsRUFBRSxJQUFJLFFBQVEsTUFBTSxNQUFNLGlCQUFpQjtBQUVwRixNQUFJLFdBQVcsVUFBVSxVQUFVLFlBQVksVUFBVSxPQUFPLFlBQVksaUJBQWlCO0FBQzNGLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxJQUFJO0FBQUEsSUFDUiwrQkFBK0IsS0FBSyw0QkFBNEIsVUFBVSxzREFDNUMsZUFBZSxVQUFVLE1BQU0sQ0FBQyxPQUFPLFVBQVUsR0FBRyxtQkFBbUIsZUFBZSxzQ0FDakcsR0FBRyxNQUFNLE9BQU8sYUFBYSxXQUFXLE1BQU0sUUFBUSxlQUFlLE1BQU0sQ0FBQztBQUFBLEVBR2pHO0FBQ0Y7QUFlTyxTQUFTLGlCQUFpQixNQUFzQjtBQUNyRCxTQUFPLEtBQUssV0FBVyxxQ0FBcUMsQ0FBQyxRQUFRO0FBQ25FLFVBQU0sc0JBQXNCLGFBQWEsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLO0FBQzNELFVBQU0sVUFBVSxJQUFJLE1BQU0sR0FBRyxJQUFJLFNBQVMsb0JBQW9CLE1BQU07QUFDcEUsV0FBTyxJQUFJLE9BQU8sSUFBSSxtQkFBbUI7QUFBQSxFQUMzQyxDQUFDO0FBQ0g7QUFhQSxlQUFzQixjQUFjLG1CQUE0QztBQUM5RSxRQUFNLGNBQWMscUJBQXFCLGlCQUFpQjtBQUMxRCxNQUFJLGdCQUFnQix1QkFBMEI7QUFDNUMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGNBQWMsTUFBTSxnQkFBZ0I7QUFDMUMsUUFBTSxpQkFBaUIsWUFBWSxXQUFXO0FBRTlDLFFBQU0sY0FBYztBQUNwQixRQUFNLG1CQUFtQixZQUFZLFdBQVcsS0FBSztBQUNyRCxRQUFNLGFBQWEsbUJBQ2YsSUFBSSxnQkFBZ0IsYUFBYSxhQUFhLElBQzlDLElBQUksZ0JBQWdCLFdBQVc7QUFDbkMsb0JBQWtCLFlBQVkscUNBQXFDLGNBQWMsZ0JBQWdCLFdBQVcsR0FBRztBQUUvRyxTQUFPO0FBQ1Q7QUFRQSxlQUFzQixnQkFBZ0IsWUFBcUM7QUFDekUsUUFBTSxnQkFBZ0Isd0JBQXdCLEVBQUUsTUFBTSxVQUFVLFlBQVksQ0FBQztBQUM3RSxRQUFNLFVBQVUsTUFBTSxTQUFTLGVBQWUsT0FBTztBQUNyRCxRQUFNLFVBQVUsd0JBQXdCLFNBQVMsVUFBVTtBQUMzRCxNQUFJLGVBQWUsVUFBVSxHQUFHLE9BQU87QUFBQTtBQUFBLElBQVM7QUFFaEQsUUFBTSxZQUFZLE1BQU0sYUFBYSwrQkFBK0IsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNyRixRQUFNLE9BQU8sVUFBVSxNQUFNLE9BQU87QUFDcEMsUUFBTSxrQkFBa0IsS0FBSyxDQUFDO0FBRTlCLFFBQU0sVUFBVSxNQUFNLGFBQWEsbUNBQW1DLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFFdkYsUUFBTSxhQUFhLGtCQUFrQixHQUFHLE9BQU8sWUFBWSxlQUFlLE1BQU0sVUFBVSxLQUFLLEdBQUcsT0FBTyxZQUFZLFVBQVU7QUFFL0gsa0JBQWdCLHVCQUF1QixVQUFVO0FBQ2pELFNBQU87QUFDVDtBQVFPLFNBQVMscUJBQXFCLG1CQUE4QztBQUNqRixRQUFNLHlCQUF5QiwyQkFBMkIsSUFBSSxpQkFBaUI7QUFDL0UsTUFBSSx3QkFBd0I7QUFDMUIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGlDQUFpQyxLQUFLLGlCQUFpQixJQUFJLHdCQUEyQjtBQUMvRjtBQU9BLGVBQXNCLFVBQXlCO0FBQzdDLFFBQU0sYUFBYSxrQ0FBa0MsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUN4RTtBQU9BLGVBQXNCLG1CQUEwQztBQUM5RCxRQUFNLFNBQVMsTUFBTSxhQUFhLENBQUMsT0FBTyxVQUFVLGdCQUFnQixHQUFHLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDeEYsUUFBTSxNQUFNLE1BQU0sYUFBYSxDQUFDLE9BQU8sYUFBYSxNQUFNLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUM5RSxTQUFPLEVBQUUsUUFBUSxJQUFJO0FBQ3ZCO0FBT08sTUFBTSwyQkFBMkI7QUFBQSxFQUN0QyxrQkFBa0IsRUFBRSxNQUFNLFNBQVM7QUFBQSxFQUNuQyxtQkFBbUIsRUFBRSxNQUFNLFNBQVM7QUFBQSxFQUNwQyxZQUFZLEVBQUUsTUFBTSxVQUFVO0FBQUEsRUFDOUIsd0JBQXdCLEVBQUUsTUFBTSxVQUFVO0FBQUEsRUFDMUMsYUFBYSxFQUFFLE1BQU0sVUFBVTtBQUFBLEVBQy9CLDBCQUEwQixFQUFFLE1BQU0sVUFBVTtBQUFBLEVBQzVDLG9CQUFvQixFQUFFLE1BQU0sVUFBVTtBQUFBLEVBQ3RDLGNBQWMsRUFBRSxNQUFNLFVBQVU7QUFDbEM7QUF5RU8sU0FBUyxhQUFhLFNBQTBCO0FBQ3JELFNBQU8sV0FBVyxPQUFPLE1BQU07QUFDakM7QUFvQk8sU0FBUyxzQkFBc0IsWUFBOEM7QUFDbEYsUUFBTSxFQUFFLGFBQWEsT0FBTyxJQUFJLFVBQVU7QUFBQSxJQUN4QyxrQkFBa0I7QUFBQTtBQUFBLElBRWxCLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxFQUNYLENBQUM7QUFFRCxTQUFPO0FBQUEsSUFDTCxTQUFTLHVCQUF1QixNQUFNO0FBQUEsSUFDdEMsbUJBQW1CLFlBQVksQ0FBQztBQUFBLEVBQ2xDO0FBQ0Y7QUFlQSxlQUFzQixxQkFBcUIsWUFBb0IsVUFBdUMsQ0FBQyxHQUFrQjtBQUN2SCxRQUFNLEVBQUUsdUJBQXVCLDZCQUE2Qiw0QkFBNEIsTUFBTSxzQkFBc0IsTUFBTSxJQUFJO0FBQzlILFFBQU0sWUFBWSxNQUFNLHlCQUF5QixzQkFBc0IsbUJBQW1CO0FBRTFGLFFBQU0sYUFBYTtBQUFBLElBQ2pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxHQUFHO0FBQUEsSUFDSDtBQUFBLElBQ0EsSUFBSSxVQUFVO0FBQUEsSUFDZCxHQUFJLHNCQUFzQixDQUFDLGNBQWMsSUFBSSxDQUFDO0FBQUEsSUFDOUMsR0FBSSxhQUFhLFVBQVUsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDO0FBQUEsSUFDbkQ7QUFBQSxJQUNBO0FBQUEsRUFDRixHQUFHO0FBQUEsSUFDRCxTQUFTO0FBQUEsSUFDVCxPQUFPLE1BQU0sZ0JBQWdCLFVBQVU7QUFBQSxFQUN6QyxDQUFDO0FBRUQsTUFBSSxxQkFBcUI7QUFDdkIsVUFBTSxvQkFBb0IsWUFBWSxTQUFTO0FBQUEsRUFDakQ7QUFFQSxNQUFJLENBQUMsMkJBQTJCO0FBQzlCO0FBQUEsRUFDRjtBQUVBLFFBQU0sMEJBQTBCLFlBQVksSUFBSTtBQUNsRDtBQVNPLFNBQVMsdUJBQXVCLGVBQTZDO0FBQ2xGLFFBQU0sUUFBUSxjQUFjLE1BQU0sT0FBTyxFQUFFLE9BQU8sT0FBTztBQUN6RCxRQUFNLFVBQVUsTUFBTSxDQUFDLEtBQUs7QUFDNUIsUUFBTSxZQUFZLE1BQU0sTUFBTSxDQUFDO0FBQy9CLFFBQU0sYUFBYSxzQkFBc0IsS0FBSyxPQUFPLElBQUksVUFBVSxLQUFLLENBQUMsU0FBUyxDQUFDLHdCQUF3QixJQUFJLENBQUMsSUFBSTtBQUNwSCxRQUFNLFFBQVEsY0FBYztBQUM1QixRQUFNLGFBQWEsb0JBQUksSUFBWTtBQUNuQyxhQUFXLGFBQWEsVUFBVSxRQUFRLENBQUMsU0FBUyx3QkFBd0IsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHO0FBQ3hGLFFBQUksVUFBVSxVQUFVLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxPQUFPLE9BQU8sZ0JBQWdCLGFBQWEsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLEtBQUssQ0FBQyxHQUFHO0FBQzNILGlCQUFXLElBQUksVUFBVSxRQUFRO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBRUEsUUFBTSxjQUFjLFVBQVUsT0FBTyxDQUFDLFNBQVMsU0FBUyxjQUFjLENBQUMsd0JBQXdCLElBQUksS0FBSyxDQUFDLCtCQUErQixLQUFLLElBQUksQ0FBQztBQUNsSixTQUFPO0FBQUEsSUFDTCxhQUFhLFlBQVksSUFBSSxDQUFDLFNBQVMsaUJBQWlCLEtBQUssS0FBSyxDQUFDLENBQUM7QUFBQSxJQUNwRSxPQUFPLGlCQUFpQixLQUFLO0FBQUEsSUFDN0IsbUJBQW1CLCtCQUErQixLQUFLLGFBQWE7QUFBQSxJQUNwRSxZQUFZLENBQUMsR0FBRyxVQUFVO0FBQUEsRUFDNUI7QUFDRjtBQU9PLFNBQVMsdUJBQXVCLFFBQXFEO0FBQzFGLFNBQU87QUFBQSxJQUNMLG1CQUFtQixPQUFPLGdCQUFnQjtBQUFBLElBQzFDLGdCQUFnQixpQkFBaUIsT0FBTyxpQkFBaUIsQ0FBQztBQUFBLElBQzFELGFBQWEsRUFBRSxPQUFPLFVBQVUsS0FBSztBQUFBLElBQ3JDLDJCQUEyQixFQUFFLE9BQU8sa0JBQWtCLEtBQUs7QUFBQSxJQUMzRCxxQkFBcUIsRUFBRSxPQUFPLHNCQUFzQixLQUFLO0FBQUEsSUFDekQsZUFBZSxFQUFFLE9BQU8sWUFBWSxLQUFLO0FBQUEsSUFDekMsaUJBQWlCLEVBQUUsT0FBTyxXQUFXLEtBQUs7QUFBQSxJQUMxQyxvQkFBb0IsRUFBRSxPQUFPLHdCQUF3QixLQUFLO0FBQUEsRUFDNUQ7QUFDRjtBQWdCQSxlQUFzQixnQkFBZ0IsWUFBb0IsVUFBa0MsQ0FBQyxHQUFrQjtBQUM3RyxRQUFNLGVBQWUsTUFBTSxpQkFBaUIsWUFBWSxPQUFPLENBQUM7QUFDbEU7QUE2QkEsZUFBc0IsY0FBYyxtQkFBNEIsVUFBZ0MsQ0FBQyxHQUFrQjtBQUNqSCxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBLHVCQUF1QjtBQUFBLElBQ3ZCO0FBQUEsSUFDQSxjQUFjO0FBQUEsSUFDZCw0QkFBNEI7QUFBQSxJQUM1QixzQkFBc0I7QUFBQSxJQUN0QiwwQkFBMEI7QUFBQSxJQUMxQixnQkFBZ0I7QUFBQSxJQUNoQixrQkFBa0I7QUFBQSxJQUNsQixxQkFBcUI7QUFBQSxJQUNyQjtBQUFBLEVBQ0YsSUFBSTtBQUVKLE1BQUksQ0FBQyxtQkFBbUI7QUFDdEIsVUFBTSxnQkFBZ0IsUUFBUSxJQUFJLGlCQUFpQjtBQUNuRCxVQUFNLGdCQUFnQixRQUFRLElBQUksaUJBQWlCO0FBRW5ELFFBQUksaUJBQWlCLGVBQWU7QUFDbEMsWUFBTSxxQkFBcUIsYUFBYTtBQUN4QyxZQUFNLGNBQWMsZUFBZSxPQUFPO0FBQzFDO0FBQUEsSUFDRjtBQUVBLFVBQU0sSUFBSSxNQUFNLGlDQUFpQztBQUFBLEVBQ25EO0FBRUEsV0FBUyxpQkFBaUI7QUFDMUIsUUFBTSxtQkFBbUI7QUFDekIsUUFBTSx5QkFBeUI7QUFJL0IsbUNBQWlDLG1CQUFtQixtQkFBbUI7QUFJdkUsUUFBTSxzQ0FBc0MsaUJBQWlCO0FBRzdELFFBQU0sMkNBQTJDLG1CQUFtQixFQUFFLG1CQUFtQixnQkFBZ0Isb0JBQW9CLENBQUM7QUFFOUgsTUFBSSxpQkFBaUI7QUFDbkIsVUFBTSxtQkFBbUI7QUFBQSxFQUMzQjtBQUdBLFFBQU0sWUFBWSxNQUFNLGlCQUFpQjtBQU16QyxRQUFNLEtBQUs7QUFBQSxJQUNUO0FBQUEsSUFDQTtBQUFBLElBQ0EsMkJBQTJCO0FBQUEsRUFDN0IsQ0FBQztBQUVELFFBQU0sYUFBYSxNQUFNLGNBQWMsaUJBQWlCO0FBS3hELFFBQU0sZUFBZSxNQUFNLGlCQUFpQixZQUFZO0FBQUEsSUFDdEQ7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUVELFFBQU0scUJBQXFCLFVBQVU7QUFDckMsUUFBTSw0QkFBNEIsVUFBVTtBQUU1QyxRQUFNLGVBQWUsWUFBWTtBQUNqQyxRQUFNLHFCQUFxQixZQUFZLEVBQUUsbUJBQW1CLENBQUM7QUFFN0QsUUFBTSxtQkFBbUIsTUFBTSwwQkFBMEIsWUFBWSxXQUFXLFNBQVM7QUFDekYsUUFBTSxVQUFVLFlBQVksZ0JBQWdCO0FBRTVDLE1BQUksQ0FBQyxlQUFlO0FBQ2xCLG1CQUFlLFNBQVMsRUFBRSw4SEFBOEg7QUFDeEo7QUFBQSxFQUNGO0FBRUEsTUFBSSx5QkFBeUI7QUFDM0IsVUFBTSx1QkFBdUIsVUFBVTtBQUN2QyxVQUFNLFlBQVksTUFBTSx5QkFBeUIsc0JBQXNCLElBQUk7QUFDM0UsVUFBTSwwQkFBMEIsWUFBWSxXQUFXLFNBQVM7QUFDaEUsVUFBTSxlQUFlLE1BQU0sYUFBYSxDQUFDLE9BQU8sYUFBYSxhQUFhLFVBQVUsS0FBSyxHQUFHLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDN0csUUFBSSxpQkFBaUIsa0JBQWtCO0FBQ3JDLFlBQU0sSUFBSSxNQUFNLG9CQUFvQixVQUFVLHdEQUF3RDtBQUFBLElBQ3hHO0FBQ0EsVUFBTSxhQUFhLENBQUMsT0FBTyxRQUFRLFVBQVUsYUFBYSxVQUFVLGNBQWMsVUFBVSxFQUFFLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNsSCxVQUFNLHFCQUFxQixZQUFZO0FBQUEsTUFDckMsc0JBQXNCLE1BQU0sUUFBUSxRQUFRLFNBQVM7QUFBQSxNQUNyRCwyQkFBMkI7QUFBQSxNQUMzQixxQkFBcUI7QUFBQSxJQUN2QixDQUFDO0FBQ0QsVUFBTSwwQkFBMEIsWUFBWSxXQUFXLFNBQVM7QUFDaEUsVUFBTSxhQUFhLENBQUMsT0FBTyxRQUFRLFVBQVUsR0FBRyxnQkFBZ0IsZUFBZSxVQUFVLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDckgsVUFBTSwwQkFBMEIsWUFBWSx5QkFBeUI7QUFDckU7QUFBQSxFQUNGO0FBRUEsUUFBTSwwQkFBMEIsWUFBWSxXQUFXLFNBQVM7QUFDaEUsUUFBTSxRQUFRO0FBQ2QsUUFBTSx1QkFBdUIsVUFBVTtBQUN2QyxRQUFNLHFCQUFxQixZQUFZLEVBQUUsc0JBQXNCLDBCQUEwQixDQUFDO0FBQzVGO0FBUUEsZUFBc0IscUJBQXFCLFlBQW1DO0FBQzVFLFFBQU0sZ0JBQWdCLENBQUMsZ0JBQWdCO0FBQ3JDLGdCQUFZLFVBQVU7QUFBQSxFQUN4QixDQUFDO0FBRUQsUUFBTSxvQkFBb0IsUUFBUSxFQUFFLHFCQUFxQixLQUFLLENBQUM7QUFDL0QsUUFBTSxzQkFBc0IsUUFBUSxFQUFFLHFCQUFxQixLQUFLLENBQUM7QUFFakUsV0FBUyxPQUFPLGlCQUF3QztBQUN0RCxvQkFBZ0IsVUFBVTtBQUMxQixVQUFNLGlCQUFpQixnQkFBZ0IsV0FBVyxFQUFFO0FBQ3BELFFBQUksZ0JBQWdCO0FBQ2xCLHFCQUFlLFVBQVU7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFDRjtBQVNPLFNBQVMsU0FBUyxtQkFBaUM7QUFDeEQsTUFBSSxxQkFBcUIsaUJBQWlCLE1BQU0seUJBQTJCO0FBQ3pFLFVBQU0sSUFBSTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBbUJBLGVBQWUsc0NBQXNDLGtCQUEwQixTQUFnQztBQUM3RyxRQUFNLFdBQVcsTUFBTSxzQkFBc0I7QUFDN0MsUUFBTSxVQUFVLDRCQUE0Qix3QkFBd0Isa0JBQWtCLE9BQU8sR0FBRyxRQUFRO0FBRXhHLE1BQUksUUFBUSxXQUFXLEdBQUc7QUFDeEI7QUFBQSxFQUNGO0FBRUEsUUFBTSxJQUFJO0FBQUEsSUFDUixPQUFPLE9BQU8sZUFBZSxVQUFVLFdBQVcsb0NBQzFDLG9DQUFvQztBQUFBLEVBQ3JDLFFBQVEsSUFBSSxDQUFDLEVBQUUsTUFBTSxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsS0FBSyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUM7QUFBQTtBQUFBLEVBRzlFO0FBQ0Y7QUFxQkEsU0FBUyxrQ0FBa0Msa0JBQTBCLFNBQXVCO0FBQzFGLFFBQU0saUJBQWlCO0FBQ3ZCLFFBQU0sbUJBQW1CLHdCQUF3QixrQkFBa0IsT0FBTyxFQUN2RSxNQUFNLElBQUksRUFDVixPQUFPLENBQUMsU0FBUyxzQkFBc0IsS0FBSyxLQUFLLFFBQVEsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0FBRWhGLE1BQUksaUJBQWlCLFdBQVcsR0FBRztBQUNqQztBQUFBLEVBQ0Y7QUFFQSxRQUFNLElBQUk7QUFBQSxJQUNSLE9BQU8sT0FBTyxlQUFlLFVBQVUsV0FBVztBQUFBLEVBQzNDLGlCQUFpQixLQUFLLElBQUksQ0FBQztBQUFBO0FBQUEsRUFJcEM7QUFDRjtBQVNBLFNBQVMsaUNBQWlDLG1CQUF1QyxxQkFBb0M7QUFDbkgsTUFBSSxzQkFBc0IsVUFBYSxDQUFDLHVCQUF1QixRQUFRLE1BQU0sT0FBTztBQUNsRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLElBQUk7QUFBQSxJQUNSO0FBQUEsRUFHRjtBQUNGO0FBZ0JBLGVBQWUsMkNBQTJDLG1CQUEyQixTQUFnRDtBQUNuSSxRQUFNLEVBQUUsbUJBQW1CLGdCQUFnQixzQkFBc0IsS0FBSyxJQUFJO0FBQzFFLE1BQUkscUJBQXFCLG1CQUFtQixtQkFBbUIsR0FBRztBQUNoRTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGFBQWEsTUFBTSxjQUFjLGlCQUFpQjtBQUN4RCxRQUFNLFlBQVksTUFBTSw4QkFBOEIsWUFBWSxtQkFBbUIsY0FBYztBQUNuRyxRQUFNLFdBQVcsTUFBTSw0QkFBNEIsV0FBVyxVQUFVO0FBQ3hFLE1BQUksU0FBUyxTQUFTLEdBQUc7QUFDdkIsVUFBTSx5QkFBeUIsVUFBVSxVQUFVO0FBQUEsRUFDckQ7QUFFQSxvQ0FBa0MsV0FBVyxVQUFVO0FBQ3ZELFFBQU0sc0NBQXNDLFdBQVcsVUFBVTtBQUNuRTtBQXFCQSxlQUFlLHNDQUFzQyxtQkFBMEM7QUFDN0YsUUFBTSxrQkFBa0IsZUFBZSxTQUFTO0FBQ2hELFFBQU0sVUFBVSxNQUFNLHVCQUF1QixNQUFNLDJCQUEyQixDQUFDO0FBSy9FLE1BQUksQ0FBQyxTQUFTO0FBQ1osb0JBQWdCLGlHQUFpRztBQUNqSDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFlBQVksTUFBTSxhQUFhLEdBQUcsT0FBTyxRQUFRO0FBQ3ZELFFBQU0sYUFBYSxVQUFVO0FBQzdCLE1BQUksZUFBZSxxQkFBeUI7QUFDMUM7QUFBQSxFQUNGO0FBRUEsUUFBTSxhQUFhLE1BQU0sY0FBYyxpQkFBaUI7QUFDeEQsUUFBTSxhQUFhLHFCQUFxQixTQUFTLFVBQVU7QUFJM0QsTUFBSSxDQUFDLFlBQVk7QUFDZixvQkFBZ0Isc0JBQXNCLFVBQVUsK0JBQStCLE9BQU8sdUNBQXVDO0FBQzdIO0FBQUEsRUFDRjtBQUVBLE1BQUksbUJBQW1CLFlBQVksVUFBVSxHQUFHO0FBQzlDO0FBQUEsRUFDRjtBQUVBLFFBQU0saUJBQWlCLFdBQVc7QUFBQSxJQUNoQztBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBUUEsZUFBZSwwQkFBMEIsWUFBb0IsYUFBcUM7QUFDaEcsTUFBSSxDQUFDLGFBQWE7QUFDaEI7QUFBQSxFQUNGO0FBQ0EsTUFBSTtBQUNGLFVBQU0sb0JBQW9CLEVBQUUsV0FBVyxDQUFDO0FBQUEsRUFDMUMsU0FBUyxPQUFPO0FBQ2QsWUFBUSxLQUFLLE9BQU8sVUFBVSxvRUFBb0UsY0FBYyxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQzFIO0FBQ0Y7QUFXQSxlQUFlLGlCQUFpQixZQUFvQixtQkFBdUMsaUJBQWlDLFdBQTRCO0FBQ3RKLFFBQU0seUJBQXlCLE1BQU0sMkJBQTJCO0FBRWhFLE1BQUksZUFBZTtBQUFBO0FBQUEsS0FBcUIsVUFBVTtBQUFBO0FBQUE7QUFFbEQsTUFBSSxzQkFBc0IsUUFBVztBQUNuQyxVQUFNLFVBQVUsTUFBTSx1QkFBdUIsc0JBQXNCO0FBQ25FLFVBQU0sY0FBYyxVQUFVLEdBQUcsT0FBTyxXQUFXO0FBQ25ELFVBQU0sdUJBQXVCLE1BQU0sYUFBYSxXQUFXLFdBQVcsa0NBQWtDLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDekgsVUFBTSxpQkFBaUIscUJBQXFCLE1BQU0sSUFBSSxFQUFFLE9BQU8sT0FBTztBQUV0RSxRQUFJLG1CQUFtQixXQUFXO0FBQ2hDLHNCQUFnQixHQUFHLDhCQUE4QixlQUFlLElBQUksQ0FBQyxrQkFBa0IsdUJBQXVCLGFBQWEsQ0FBQyxDQUFDLENBQUM7QUFBQTtBQUFBLElBQ2hJLE9BQU87QUFDTCxpQkFBVyxpQkFBaUIsZ0JBQWdCO0FBQzFDLHdCQUFnQixLQUFLLGlCQUFpQixpQkFBaUIsYUFBYSxDQUFDLENBQUM7QUFBQTtBQUFBLE1BQ3hFO0FBQUEsSUFDRjtBQUFBLEVBQ0YsT0FBTztBQUNMLFVBQU0sZ0JBQWdCLE1BQU0sU0FBUyxtQkFBbUIsT0FBTztBQUMvRCxvQkFBZ0IsR0FBRyxXQUFXLEVBQUUsU0FBUyxlQUFlLFVBQVUsTUFBTSxhQUFhLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQztBQUFBO0FBQUEsRUFDdkc7QUFFQSxNQUFJLHVCQUF1QixTQUFTLEdBQUc7QUFDckMsb0JBQWdCO0FBQ2hCLGVBQVcsUUFBUSx3QkFBd0I7QUFDekMsc0JBQWdCLEdBQUcsSUFBSTtBQUFBO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBa0JBLGVBQWUsOEJBQ2IsWUFDQSxtQkFDQSxnQkFDaUI7QUFDakIsUUFBTSxZQUFZLE1BQU0saUJBQWlCLFlBQVksbUJBQW1CLGNBQWM7QUFDdEYsTUFBSSxzQkFBc0IsUUFBVztBQUNuQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sY0FBYyxNQUFNLGdCQUFnQjtBQUMxQyxNQUFJLENBQUMsT0FBTyxLQUFLLFlBQVksV0FBVyxDQUFDLENBQUMsRUFBRSxTQUFTLG1CQUFtQixHQUFHO0FBQ3pFLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxVQUFVLHdCQUF3QixXQUFXLFVBQVU7QUFDN0QsUUFBTSxFQUFFLFNBQVMsU0FBUyxJQUFJLE1BQU0sbUJBQW1CO0FBQUEsSUFDckQsU0FBUywyQkFBMkIsV0FBVyxVQUFVO0FBQUEsSUFDekQsVUFBVSx3QkFBd0IsRUFBRSxNQUFNLFVBQVUsWUFBWSxDQUFDO0FBQUEsRUFDbkUsQ0FBQztBQUNELE1BQUksYUFBYSxHQUFHO0FBQ2xCLFdBQU87QUFBQSxFQUNUO0FBRUEsVUFBUSxLQUFLLFNBQVMsT0FBTyxRQUFRLENBQUMsNkNBQTZDLFVBQVUsNkRBQTZEO0FBQzFKLFFBQU0sVUFBVSxNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQ2hDLFNBQU8sVUFBVSxRQUFRLEdBQUcsT0FBTyxHQUFHLE9BQU8sSUFBSSxNQUFNLEdBQUcsT0FBTyxHQUFHLHdCQUF3QixTQUFTLFVBQVUsQ0FBQyxFQUFFO0FBQ3BIO0FBQ0EsU0FBUyxlQUFlLFFBQXdCO0FBQzlDLFNBQU8sU0FBUyxXQUFXLE1BQU0sTUFBTTtBQUN6QztBQWdCQSxTQUFTLHdCQUF3QixrQkFBMEIsU0FBeUI7QUFDbEYsUUFBTSxRQUFRLGlCQUFpQixNQUFNLE9BQU87QUFDNUMsUUFBTSxlQUFlLE1BQU0sUUFBUSxNQUFNLE9BQU8sRUFBRTtBQUNsRCxNQUFJLGlCQUFpQixJQUFJO0FBQ3ZCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxpQkFBaUIsZUFBZTtBQUN0QyxRQUFNLG9CQUFvQixNQUFNLE1BQU0sY0FBYyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEtBQUssV0FBVyxLQUFLLENBQUM7QUFDaEcsUUFBTSxlQUFlLHNCQUFzQixLQUFLLE1BQU0sU0FBUyxpQkFBaUI7QUFDaEYsU0FBTyxNQUFNLE1BQU0sZ0JBQWdCLFlBQVksRUFBRSxLQUFLLElBQUksRUFBRSxLQUFLO0FBQ25FO0FBdUJBLGVBQWUsYUFBYSxhQUF5QztBQUduRSxRQUFNLFNBQVMsTUFBTSxhQUFhLENBQUMsT0FBTyxPQUFPLGFBQWEsbUJBQW1CLElBQUksR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBRXpHLFFBQU0saUJBQWlCLE9BQ3BCLE1BQU0sSUFBSSxFQUNWLElBQUksQ0FBQyxXQUFXLGdCQUFnQixNQUFNLENBQUMsRUFDdkMsT0FBTyxDQUFDLGtCQUFrQixrQkFBa0IsSUFBSTtBQUVuRCxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0EsT0FBTyxtQkFBbUIsY0FBYztBQUFBLEVBQzFDO0FBQ0Y7QUEwQkEsZUFBZSw0QkFBNEIsa0JBQTBCLFNBQThDO0FBQ2pILFFBQU0sVUFBVSwyQkFBMkIsa0JBQWtCLE9BQU87QUFDcEUsUUFBTSxXQUFXLHdCQUF3QixFQUFFLE1BQU0sVUFBVSxZQUFZLENBQUM7QUFDeEUsUUFBTSxjQUFjLE1BQU0sZ0JBQWdCO0FBQzFDLFFBQU0sY0FBYyxPQUFPLEtBQUssWUFBWSxXQUFXLENBQUMsQ0FBQztBQUV6RCxRQUFNLHVCQUF1QixZQUFZLFNBQVMsbUJBQW1CLElBQ2pFLE1BQU0sb0JBQW9CO0FBQUEsSUFDMUI7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDLElBQ0MsQ0FBQztBQUNMLFFBQU0sbUJBQW1CLFlBQVksU0FBUyxzQkFBc0IsSUFDaEUsTUFBTSxrQkFBa0I7QUFBQSxJQUN4QjtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUMsSUFDQyxDQUFDO0FBRUwsU0FBTztBQUFBLElBQ0wsR0FBRyxxQkFBcUIsSUFBSSxDQUFDLFVBQVU7QUFBQSxNQUNyQyxZQUFZO0FBQUEsTUFDWjtBQUFBLElBQ0YsRUFBRTtBQUFBLElBQ0YsR0FBRyxpQkFBaUIsSUFBSSxDQUFDLFVBQVU7QUFBQSxNQUNqQyxZQUFZO0FBQUEsTUFDWjtBQUFBLElBQ0YsRUFBRTtBQUFBLEVBQ0o7QUFDRjtBQU9BLGVBQWUsOEJBQWlEO0FBQzlELFFBQU0sZUFBZSxNQUFNLGFBQWEsQ0FBQyxPQUFPLFFBQVEsc0JBQXNCLFVBQVUsTUFBTSxRQUFRLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUMxSCxRQUFNLFNBQVMsbUJBQW1CLFlBQVk7QUFDOUMsU0FBTztBQUFBLElBQ0wsS0FBSyxVQUFVLE1BQU0sT0FBTyxRQUFRO0FBQUEsSUFDcEMsS0FBSyxVQUFVLE1BQU0sVUFBVSxTQUFTO0FBQUEsRUFDMUM7QUFDRjtBQWVBLFNBQVMsbUJBQW1CLE9BQWtCLFlBQXdFO0FBQ3BILFNBQU8sZUFBZSxzQkFDbEIsVUFBVSxzQkFDVixVQUFVO0FBQ2hCO0FBVUEsU0FBUyxxQkFBcUIsbUJBQXVDLHFCQUF1QztBQUMxRyxTQUFPLHNCQUFzQixVQUFhO0FBQzVDO0FBV0EsU0FBUyx3QkFBd0IsTUFBdUM7QUFDdEUsUUFBTSxpQkFBaUIsNkJBQTZCLEtBQUssS0FBSyxLQUFLLENBQUMsR0FBRyxTQUFTLFlBQVk7QUFDNUYsTUFBSSxnQkFBZ0IsV0FBVyx5QkFBeUIsRUFBRSxFQUFFLFdBQVcsa0JBQWtCLEVBQUUsTUFBTSxJQUFJO0FBQ25HLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxNQUFNLEtBQUssZUFBZSxTQUFTLHVCQUF1QixHQUFHLENBQUMsVUFBMEI7QUFDN0YsVUFBTSxhQUFhLHNCQUFzQixPQUFPLFlBQVk7QUFDNUQsUUFBSSxlQUFlLE1BQU07QUFDdkIsYUFBTyxFQUFFLFVBQVUsSUFBSSxVQUFVLElBQUksV0FBVyxDQUFDLElBQUksVUFBVSxFQUFFLEVBQUU7QUFBQSxJQUNyRTtBQUNBLFVBQU0sV0FBVyxzQkFBc0IsT0FBTyxTQUFTLEtBQUssc0JBQXNCLE9BQU8sTUFBTTtBQUMvRixVQUFNLGNBQWMsc0JBQXNCLE9BQU8sV0FBVyxLQUFLLHNCQUFzQixPQUFPLFlBQVk7QUFDMUcsc0JBQWtCLFFBQVE7QUFDMUIsc0JBQWtCLFdBQVc7QUFDN0IsVUFBTSxNQUFNLHNCQUFzQixRQUFRLFdBQVcsV0FBVztBQUNoRSxXQUFPLEVBQUUsVUFBVSxJQUFJLEdBQUcsS0FBSyxXQUFXLENBQUMsR0FBRyxRQUFRLElBQUksV0FBVyxJQUFJLEtBQUssc0JBQXNCLFFBQVEsU0FBUyxXQUFXLEVBQUUsRUFBRTtBQUFBLEVBQ3RJLENBQUM7QUFDSDtBQWdCQSxTQUFTLG1CQUFtQixRQUErQjtBQUN6RCxhQUFXLFNBQVMsT0FBTyxTQUFTLE9BQU8sR0FBRztBQUM1QyxRQUFJO0FBRUosUUFBSTtBQUNGLGdCQUFVLEtBQUssTUFBTSxPQUFPLE1BQU0sTUFBTSxLQUFLLENBQUM7QUFBQSxJQUNoRCxRQUFRO0FBQ047QUFBQSxJQUNGO0FBRUEsVUFBTSxVQUFVLE1BQU0sUUFBUSxPQUFPLElBQUksVUFBNkIsT0FBTyxPQUFPLE9BQXdDO0FBQzVILFVBQU0sU0FBUyxRQUFRLENBQUM7QUFFeEIsUUFBSSxDQUFDLFFBQVE7QUFDWCxZQUFNLElBQUksTUFBTSxzREFBc0Q7QUFBQSxJQUN4RTtBQUVBLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxJQUFJLE1BQU0saUVBQWlFO0FBQ25GO0FBd0JBLGVBQWUsaUJBQWlCLFlBQW9CLFNBQWtEO0FBQ3BHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0Esc0JBQXNCO0FBQUEsRUFDeEIsSUFBSTtBQUNKLFFBQU0sY0FBYyxxQkFBcUIsbUJBQW1CLG1CQUFtQjtBQUMvRSxRQUFNLGVBQWUsY0FDakIsTUFBTSxpQkFBaUIsWUFBWSxtQkFBbUIsY0FBYyxJQUNwRSxNQUFNLDhCQUE4QixZQUFZLG1CQUFtQixjQUFjO0FBQ3JGLE1BQUksbUJBQW1CO0FBQ3ZCLE1BQUksV0FBK0IsQ0FBQztBQU1wQyxhQUFTO0FBQ1AsUUFBSSxhQUFhO0FBQ2YsWUFBTSxvQkFBb0IsTUFBTSxnQkFBZ0Isa0JBQWtCLFFBQVE7QUFDMUUsVUFBSSxTQUFTLFNBQVMsS0FBSyxzQkFBc0Isa0JBQWtCO0FBQ2pFLGNBQU0seUJBQXlCLFVBQVUsVUFBVTtBQUFBLE1BQ3JEO0FBRUEseUJBQW1CO0FBQUEsSUFDckI7QUFFQSxlQUFXLE1BQU0sNEJBQTRCLGtCQUFrQixVQUFVO0FBQ3pFLFFBQUksU0FBUyxXQUFXLEdBQUc7QUFDekI7QUFBQSxJQUNGO0FBRUEsUUFBSSxDQUFDLGFBQWE7QUFDaEIsWUFBTSx5QkFBeUIsVUFBVSxVQUFVO0FBQUEsSUFDckQ7QUFBQSxFQUNGO0FBTUEsb0NBQWtDLGtCQUFrQixVQUFVO0FBQzlELFFBQU0sc0NBQXNDLGtCQUFrQixVQUFVO0FBQ3hFLFNBQU87QUFDVDtBQVNBLGVBQWUsNkJBQWdEO0FBQzdELFFBQU0scUJBQXFCO0FBQzNCLFFBQU0sZ0JBQWdCLHdCQUF3QixFQUFFLE1BQU0sVUFBVSxZQUFZLENBQUM7QUFDN0UsTUFBSSxDQUFDLFdBQVcsYUFBYSxHQUFHO0FBQzlCLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFVBQVUsTUFBTSxTQUFTLGVBQWUsT0FBTztBQUNyRCxRQUFNLHlCQUF5QixRQUFRLE1BQU0sSUFBSSxFQUFFLE1BQU0sa0JBQWtCO0FBQzNFLE1BQUksdUJBQXVCLEdBQUcsRUFBRSxNQUFNLElBQUk7QUFDeEMsMkJBQXVCLElBQUk7QUFBQSxFQUM3QjtBQUVBLFNBQU87QUFDVDtBQWVBLGVBQWUsdUJBQXVCLHdCQUFtRDtBQUN2RixRQUFNLFVBQVUsV0FBVztBQUFBLElBQ3pCLFNBQVMsdUJBQXVCLENBQUMsS0FBSztBQUFBLElBQ3RDLFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFFRCxNQUFJLENBQUMsU0FBUztBQUNaLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxrQkFBa0IsTUFBTSxhQUFhLENBQUMsT0FBTyxhQUFhLFlBQVksV0FBVyxhQUFhLE9BQU8sRUFBRSxHQUFHO0FBQUEsSUFDOUcsU0FBUztBQUFBLElBQ1Qsc0JBQXNCO0FBQUEsRUFDeEIsQ0FBQztBQUVELE1BQUksQ0FBQyxpQkFBaUI7QUFDcEIsbUJBQWUsU0FBUztBQUFBLE1BQ3RCLEdBQUcsVUFBVSxXQUFXLGtCQUFrQixPQUFPO0FBQUEsSUFDbkQ7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFDVDtBQVNBLGVBQWUseUJBQXlCLFVBQW1DLHFCQUFpRDtBQUMxSCxRQUFNLFFBQVEsTUFBTSxTQUFTO0FBQzdCLFNBQU8sTUFBTSxPQUFPLENBQUMsU0FBUztBQUM1QixVQUFNLFdBQVcsV0FBVyx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM3RCxRQUFJLENBQUMsWUFBWSxxQkFBcUI7QUFDcEMsWUFBTSxJQUFJLE1BQU0saUNBQWlDLElBQUksRUFBRTtBQUFBLElBQ3pEO0FBQ0EsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUNIO0FBV0EsZUFBZSxnQkFBZ0IsY0FBc0IsVUFBK0M7QUFDbEcsUUFBTSxnQkFBZ0IsTUFBTSxRQUFRLEtBQUssT0FBTyxHQUFHLFlBQVksQ0FBQztBQUNoRSxRQUFNLHVCQUF1QixLQUFLLGVBQWUsVUFBVSxXQUFXO0FBRXRFLE1BQUk7QUFDRixVQUFNLFVBQVUsc0JBQXNCLGNBQWMsT0FBTztBQUUzRCxVQUFNLGNBQWMsTUFBTSxhQUFhLGtCQUFrQjtBQUFBLE1BQ3ZELFNBQVM7QUFBQSxNQUNULHNCQUFzQjtBQUFBLElBQ3hCLENBQUM7QUFDRCxVQUFNLGtCQUFrQixlQUFlLFNBQVM7QUFDaEQsUUFBSSxTQUFTLFNBQVMsR0FBRztBQUN2QjtBQUFBLFFBQ0UsR0FBRyxVQUFVLFdBQVcsa0JBQWtCLG9CQUFvQixRQUFRLENBQUM7QUFBQSxFQUFVLGVBQWUsUUFBUSxDQUFDO0FBQUEsTUFDM0c7QUFBQSxJQUNGO0FBRUEsUUFBSSxhQUFhO0FBQ2Ysc0JBQWdCLHFCQUFxQixVQUFVLFdBQVcsc0RBQXNEO0FBQ2hILFlBQU0sYUFBYSxDQUFDLFFBQVEsTUFBTSxvQkFBb0IsR0FBRztBQUFBLFFBQ3ZELFNBQVM7QUFBQSxRQUNULHNCQUFzQjtBQUFBLE1BQ3hCLENBQUM7QUFBQSxJQUNILE9BQU87QUFDTCxzQkFBZ0IsNkVBQTZFO0FBQzdGLFlBQU0sZ0JBQWdCLFFBQVEsT0FBTyxRQUFRLE1BQU0sRUFBRTtBQUFBLFFBQ25ELHFCQUFxQixvQkFBb0I7QUFBQSxNQUMzQztBQUFBLElBQ0Y7QUFFQSxXQUFPLE1BQU0sU0FBUyxzQkFBc0IsT0FBTztBQUFBLEVBQ3JELFVBQUU7QUFDQSxVQUFNLEdBQUcsZUFBZTtBQUFBLE1BQ3RCLE9BQU87QUFBQSxNQUNQLFdBQVc7QUFBQSxJQUNiLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFlQSxTQUFTLGlCQUFpQixXQUFzQixTQUF5QztBQUN2RixRQUFNLGVBQWUsVUFBVSxlQUM1QixJQUFJLENBQUMsa0JBQWtCLEtBQUssY0FBYyxJQUFJLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLGNBQWMsT0FBTyxNQUFNLGNBQWMsTUFBTSxHQUFHLEVBQy9ILEtBQUssSUFBSTtBQUVaLFNBQU8sSUFBSTtBQUFBLElBQ1QscUJBQXFCLFFBQVEsT0FBTyxxQkFBcUIsVUFBVSxLQUFLLGtCQUFrQixRQUFRLGlCQUFpQixtQkFDM0csUUFBUSxVQUFVLGdCQUFnQixRQUFRLFVBQVU7QUFBQSxFQUNyRCxZQUFZO0FBQUEsd0tBR1gsVUFBVSxLQUFLO0FBQUEsRUFDekI7QUFDRjtBQW1CQSxTQUFTLGlCQUFpQixlQUErQjtBQUN2RCxRQUFNLEVBQUUsT0FBTyxXQUFXLElBQUksdUJBQXVCLGFBQWE7QUFDbEUsU0FBTyxXQUFXLFdBQVcsSUFBSSxRQUFRLEdBQUcsS0FBSyxLQUFLLFdBQVcsS0FBSyxJQUFJLENBQUM7QUFDN0U7QUFZQSxTQUFTLHlCQUF5QixVQUE4QixTQUF3QjtBQUN0RixRQUFNLGNBQWMsb0JBQW9CLFFBQVE7QUFDaEQsU0FBTyxJQUFJO0FBQUEsSUFDVCxPQUFPLE9BQU8sZUFBZSxVQUFVLFdBQVcsa0JBQWtCLFdBQVc7QUFBQSxFQUN4RSxlQUFlLFFBQVEsQ0FBQztBQUFBLGdoQkFNdkIsV0FBVztBQUFBLEVBQ3JCO0FBQ0Y7QUFjQSxTQUFTLDJCQUEyQixrQkFBMEIsU0FBeUI7QUFDckYsUUFBTSxVQUFVO0FBQUE7QUFBQSxLQUFxQixPQUFPO0FBQzVDLFFBQU0sVUFBVSx3QkFBd0Isa0JBQWtCLE9BQU87QUFHakUsU0FBTyxZQUFZLEtBQUssR0FBRyxPQUFPO0FBQUEsSUFBTyxHQUFHLE9BQU87QUFBQTtBQUFBLEVBQU8sT0FBTztBQUFBO0FBQ25FO0FBU0EsU0FBUyxpQkFBaUIsT0FBdUQ7QUFDL0UsTUFBSSxVQUFVLFFBQVc7QUFDdkIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFFBQVEsaUJBQWlCLEtBQUssQ0FBQyxjQUFjLGNBQWMsS0FBSztBQUN0RSxNQUFJLENBQUMsT0FBTztBQUNWLFVBQU0sSUFBSSxNQUFNLDhCQUE4QixLQUFLLGtCQUFrQixpQkFBaUIsS0FBSyxJQUFJLENBQUMsR0FBRztBQUFBLEVBQ3JHO0FBRUEsU0FBTztBQUNUO0FBZUEsU0FBUyxxQkFBcUIsYUFBcUIsWUFBc0M7QUFDdkYsUUFBTSxPQUFPLE1BQU0sV0FBVztBQUM5QixRQUFNLE9BQU8sTUFBTSxVQUFVO0FBQzdCLE1BQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtBQUNsQixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksS0FBSyxRQUFRLEtBQUssT0FBTztBQUMzQixXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sS0FBSyxRQUFRLEtBQUssUUFBUSxzQkFBMEI7QUFDN0Q7QUFXQSxTQUFTLG9CQUFvQixVQUFzQztBQUNqRSxRQUFNLGNBQWMsQ0FBQyxxQkFBcUIsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLGVBQWUsU0FBUyxLQUFLLENBQUMsWUFBWSxRQUFRLGVBQWUsVUFBVSxDQUFDO0FBQ3RKLFNBQU8sWUFBWSxLQUFLLE9BQU87QUFDakM7QUFXQSxTQUFTLGVBQWUsVUFBc0M7QUFDNUQsU0FBTyxTQUFTLElBQUksQ0FBQyxZQUFZLElBQUksUUFBUSxVQUFVLEtBQUssUUFBUSxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDdkY7QUFVQSxTQUFTLGdCQUFnQixRQUFzQztBQUc3RCxRQUFNLENBQUMsS0FBSyxhQUFhLEdBQUcsU0FBUyxJQUFJLE9BQU8sTUFBTSxJQUFJO0FBQzFELE1BQUksQ0FBQyxPQUFPLGdCQUFnQixRQUFXO0FBQ3JDLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxVQUFVLFlBQVksS0FBSztBQUNqQyxRQUFNLE9BQU8sVUFBVSxLQUFLLElBQUk7QUFDaEMsUUFBTSxlQUFlLG9DQUFvQyxLQUFLLE9BQU87QUFFckUsTUFBSSxjQUFjLFNBQVMsVUFBVSxHQUFHO0FBQ3RDLFdBQU87QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSwrQkFBK0IsS0FBSyxJQUFJLEdBQUc7QUFDN0MsV0FBTztBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1I7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLGNBQWMsU0FBUyxNQUFNLEdBQUcsWUFBWSxNQUFNLFlBQ3JEO0FBQUEsSUFDQSxPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUjtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQ0U7QUFDTjtBQVNBLFNBQVMsbUJBQW1CLGdCQUFxRDtBQUMvRSxNQUFJLGVBQWUsS0FBSyxDQUFDLGtCQUFrQixjQUFjLFVBQVUsbUJBQXVCLEdBQUc7QUFDM0YsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGVBQWUsU0FBUyxJQUFJLHNCQUEwQjtBQUMvRDtBQVFBLGVBQWUsb0JBQW9CLFlBQW9CLFdBQTZDO0FBQ2xHLFFBQU0sVUFBVSxLQUFLO0FBQUEsSUFDbkIsTUFBTSxhQUFhO0FBQUEsTUFDakI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsRUFDdEI7QUFDQSxNQUNFLFFBQVEsV0FBVyxRQUFRLFlBQVksY0FBYyxRQUFRLGlCQUFpQixhQUFhLFVBQVUsS0FDbEcsVUFBVSxLQUFLLENBQUMsU0FBUyxRQUFRLE9BQU8sTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLFNBQVMsU0FBUyxJQUFJLEtBQUssTUFBTSxVQUFVLFdBQVcsQ0FBQyxHQUMzSDtBQUNBLFVBQU0sSUFBSSxNQUFNLCtCQUErQixVQUFVLHVFQUF1RTtBQUFBLEVBQ2xJO0FBQ0Y7QUFTQSxlQUFlLGVBQWUsY0FBcUM7QUFDakUsUUFBTSxVQUFVLHdCQUF3QixFQUFFLE1BQU0sVUFBVSxZQUFZLENBQUMsR0FBRyxjQUFjLE9BQU87QUFDakc7IiwibmFtZXMiOlsiVmVyc2lvblVwZGF0ZVR5cGUiXX0=