@dbx-tools/appkit-mastra 0.6.61 → 0.6.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/chart.js CHANGED
@@ -27,7 +27,7 @@
27
27
  * @module
28
28
  */
29
29
  import { AppKitError, CacheManager, ExecutionError } from "@databricks/appkit";
30
- import { async, error, hash, json, log, string } from "@dbx-tools/shared-core";
30
+ import { async, error, hash, json, log, object, string, } from "@dbx-tools/shared-core";
31
31
  import { marker, wire } from "@dbx-tools/shared-mastra";
32
32
  import { model } from "@dbx-tools/shared-model";
33
33
  import { Agent } from "@mastra/core/agent";
@@ -88,19 +88,18 @@ const chartDataPointSchema = z
88
88
  if (typeof v === "number")
89
89
  return Number.isFinite(v) ? v : null;
90
90
  if (typeof v === "string") {
91
- const n = Number(v);
92
- return Number.isFinite(n) ? n : null;
91
+ return object.toNumber(v) ?? null;
93
92
  }
94
93
  // Scatter `[x, y]` or heatmap `[xIndex, yIndex, value]`. Coerce
95
94
  // stringified components; reject if any component is non-finite.
96
95
  if (Array.isArray(v) && (v.length === 2 || v.length === 3)) {
97
- const nums = v.map((c) => (typeof c === "number" ? c : Number(c)));
98
- return nums.every((n) => Number.isFinite(n)) ? nums : null;
96
+ const nums = v.map((c) => object.toNumber(c));
97
+ return nums.every((n) => n !== undefined) ? nums : null;
99
98
  }
100
99
  if (typeof v === "object" && v !== null && "value" in v) {
101
100
  const obj = v;
102
- const val = typeof obj.value === "number" ? obj.value : Number(obj.value);
103
- if (!Number.isFinite(val))
101
+ const val = object.toNumber(obj.value);
102
+ if (val === undefined)
104
103
  return null;
105
104
  // Coerce numeric / boolean / nullish names to strings so a
106
105
  // pie slice keyed on a year (`2024`) or category id is
@@ -1018,4 +1017,4 @@ export function buildRenderDataTool(config) {
1018
1017
  },
1019
1018
  });
1020
1019
  }
1021
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBZ0MsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyw2RUFBNkU7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXBDLHNEQUFzRDtBQUN0RCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFeEMsdURBQXVEO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRXRDLG9FQUFvRTtBQUNwRSxNQUFNLG9CQUFvQixH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QVVDO1lBQ0Q7Ozs7O09BS0M7U0FDRixDQUFDO1FBQ0YsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxZQUFZLEVBQUUscUJBQXFCO1FBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQTRCLENBQUM7WUFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBeUQsQ0FBQztZQUN0RSxPQUFPLFlBQVksQ0FBQztnQkFDbEIsTUFBTTtnQkFDTixPQUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLEtBQUs7Z0JBQ0wsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGFydCBwbGFubmVyICsgY2hhcnQgY2FjaGUuXG4gKlxuICogU2VsZi1jb250YWluZWQgY2hhcnQgc3Vic3lzdGVtIHdpdGggdHdvIGxheWVyczpcbiAqXG4gKiAgIDEuIElubmVyIHBsYW5uZXIgYWdlbnQgKHByaXZhdGUpLiBQdXJlIGRhdGFzZXQtaW4gL1xuICogICAgICBgRUNoYXJ0c09wdGlvbmAtb3V0IGJyYWluLiBEcml2ZW4gYnkge0BsaW5rIHByZXBhcmVDaGFydH07XG4gKiAgICAgIGNhbGxlcnMgbmV2ZXIgaW5zdGFudGlhdGUgaXQgZGlyZWN0bHkuXG4gKiAgIDIuIHtAbGluayBwcmVwYXJlQ2hhcnR9OiBvcmNoZXN0cmF0aW9uIG9uIHRvcCBvZiB0aGUgcGxhbm5lci5cbiAqICAgICAgTWludHMgYSBgY2hhcnRJZGAsIGNhY2hlcyBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHJlY29yZFxuICogICAgICBzeW5jaHJvbm91c2x5LCB0aGVuIHJlc29sdmVzIHRoZSBkYXRhc2V0IGFuZCBydW5zIHRoZVxuICogICAgICBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgdGVybWluYWwgZW50cnkgc2V0dGxlcyB3aXRoXG4gKiAgICAgIGVpdGhlciBgcmVzdWx0YCAoc3VjY2Vzcykgb3IgYGVycm9yYCAoZmFpbHVyZSkuIEJvdGhcbiAqICAgICAgdW5kZWZpbmVkIG1lYW5zIHRoZSBlbnRyeSBpcyBzdGlsbCBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBjYWNoZSBzdXJmYWNlICh7QGxpbmsgZmV0Y2hDaGFydH0pIGlzIHRoZSBvbmx5IHN0YXRlIHRoZVxuICogSFRUUCByb3V0ZSBhbmQgdGhlIGNoYXJ0LXByb2R1Y2luZyB0b29scyBzaGFyZS4gYHByZXBhcmVDaGFydGBcbiAqIGlzIGRhdGFzZXQtYWdub3N0aWMgLSBjYWxsZXJzIHN1cHBseSBhIGByZXNvbHZlRGF0YWAgY2FsbGJhY2tcbiAqIHRoYXQgZmV0Y2hlcyB0aGUgcm93cyBob3dldmVyIHRoZXkgbGlrZSAoR2VuaWUgc3RhdGVtZW50LCBpbmxpbmVcbiAqIGRhdGFzZXQsIGN1c3RvbSBBUEkpLiBUaGUgbW9kdWxlIGhhcyBubyBrbm93bGVkZ2Ugb2YgR2VuaWUgb3JcbiAqIHN0YXRlbWVudCBpZHM7IHRob3NlIGNvbmNlcm5zIGxpdmUgaW4gdGhlIHRvb2xzIHRoYXQgd3JhcCBpdC5cbiAqXG4gKiBXaXJlLWZvcm1hdCBzY2hlbWFzIGxpdmUgaW4gYEBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYWAgc29cbiAqIHRoZSBkZW1vIGNsaWVudCBhbmQgYW55IG90aGVyIFVJIGNvbnN1bWVyIHNoYXJlIHRoZSBleGFjdCBzYW1lXG4gKiBzaGFwZSB0aGlzIG1vZHVsZSByZWFkcyBhbmQgd3JpdGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBcHBLaXRFcnJvciwgQ2FjaGVNYW5hZ2VyLCBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFzeW5jLCBlcnJvciwgaGFzaCwganNvbiwgbG9nLCBzdHJpbmcsIHR5cGUgQnJhbmRDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IG1hcmtlciwgd2lyZSwgdHlwZSBDaGFydCwgdHlwZSBDaGFydFJlc3VsdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlc29sdmVVc2VyS2V5LCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgYnVpbGRNb2RlbCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvY2hhcnRcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVFRMIGZvciBjYWNoZWQgY2hhcnQgZW50cmllcy4gT25lIGhvdXIgYmFsYW5jZXMgXCJsb25nIGVub3VnaCBmb3JcbiAqIHRoZSBob3N0IFVJIHRvIGZldGNoIHRoZSBjaGFydCB3ZWxsIGFmdGVyIHRoZSBtb2RlbCBmaW5pc2hlZFxuICogdGFsa2luZ1wiIGFnYWluc3QgXCJzaG9ydCBlbm91Z2ggdGhhdCBhYmFuZG9uZWQgY2hhcnQgaWRzIGRvbid0XG4gKiBwaW4gc3RvcmFnZVwiLiBNYXRjaGVzIHRoZSB0eXBpY2FsIERhdGFicmlja3MgT0JPIHRva2VuIGxpZmV0aW1lXG4gKiBzbyBhbnkgZGF0YSByZS1yZXNvbHV0aW9uIHN0YXlzIGluc2lkZSB0aGUgb3JpZ2luYWwgYXV0aCB3aW5kb3cuXG4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX1RUTF9TRUMgPSA2MCAqIDYwO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlOyBrZWVwcyB0aGUgY2hhcnQga2V5c3BhY2UgdGlkeS4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOmNoYXJ0XCI7XG5cbi8qKiBEZWZhdWx0IHNlcnZlci1zaWRlIGxvbmctcG9sbCBidWRnZXQgZm9yIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmNvbnN0IERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIERlZmF1bHQgaW50ZXItcG9sbCBzbGVlcCBmb3Ige0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuY29uc3QgREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NUyA9IDI1MDtcblxuLyoqIFN0YWJsZSB0ZXh0IHN0b3JlZCBvbiBhIGNoYXJ0IGVudHJ5IHdob3NlIHBsYW5uZXIgcnVuIGZhaWxlZC4gKi9cbmNvbnN0IENIQVJUX0ZBSUxFRF9NRVNTQUdFID0gXCJDaGFydCBnZW5lcmF0aW9uIGZhaWxlZFwiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNjaGVtYXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSBzZXJpZXMgZGF0YSBwb2ludC4gV2lkZSB2YXJpYW50IHNldCBzbyB0aGUgcGxhbm5lciBhZ2VudCBjYW5cbiAqIGZhaXRoZnVsbHkgcGFzcyB0aHJvdWdoIHdoYXRldmVyIHRoZSBTUUwgcm93IHNldCBjb250YWluZWRcbiAqIChudW1iZXJzLCBzdHJpbmdpZmllZCBudW1iZXJzLCBudWxscyBmb3IgbWlzc2luZyBtZWFzdXJlbWVudHMsXG4gKiBgW3gsIHldYCB0dXBsZXMgZm9yIHNjYXR0ZXIsIGBbeCwgeSwgdmFsdWVdYCB0cmlwbGVzIGZvciBoZWF0bWFwLFxuICogYHtuYW1lLCB2YWx1ZX1gIHNsaWNlcyBmb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcCkgd2l0aG91dCB0aGVcbiAqIHN0cnVjdHVyZWQtb3V0cHV0IGd1YXJkIHJlamVjdGluZyB0aGUgd2hvbGUgcGxhbi5cbiAqXG4gKiBUaHJlZSBsYXllcnMgb2YgdG9sZXJhbmNlOlxuICpcbiAqICAgMS4ge0BsaW5rIHoucHJlcHJvY2Vzc30gbm9ybWFsaXplcyB3aXJlIHNoYXBlcyBCRUZPUkUgdW5pb25cbiAqICAgICAgZGlzcGF0Y2g6IHN0cmluZ2lmaWVkIG51bWJlcnMgcGFyc2UgdG8gbnVtYmVycywgZmluaXRlXG4gKiAgICAgIGNoZWNrcyByZWplY3QgYE5hTmAgLyBgSW5maW5pdHlgLCAyLS8zLWVsZW1lbnQgYXJyYXlzIGNvZXJjZVxuICogICAgICB0dXBsZSBjb21wb25lbnRzLCBhbmQgYHt2YWx1ZX1gIG9iamVjdHMgd2l0aCBtaXNzaW5nIC9cbiAqICAgICAgc3RyaW5naWZpZWQgYHZhbHVlYCBnZXQgY29lcmNlZCBvciByZWplY3RlZCB1bmlmb3JtbHkuXG4gKiAgICAgIEFueXRoaW5nIG5vdCBoYW5kbGVhYmxlIGJlY29tZXMgYG51bGxgLlxuICogICAyLiBUaGUgdW5pb24gYWNjZXB0cyBgbnVsbGAgYXMgYSBmaXJzdC1jbGFzcyB2YXJpYW50LiBFY2hhcnRzXG4gKiAgICAgIHJlbmRlcnMgbnVsbCBhcyBhIGdhcCBvbiBiYXIgLyBsaW5lIC8gYXJlYSAod2hpY2ggaXMgdGhlXG4gKiAgICAgIHJpZ2h0IHZpc3VhbCBzaWduYWwgZm9yIFwibWlzc2luZyByZWFkaW5nXCIpLiBTY2F0dGVyLCBoZWF0bWFwLFxuICogICAgICBhbmQgc2xpY2UgY2hhcnRzIGZpbHRlciBudWxscyBpbiB7QGxpbmsgcGxhblRvRWNoYXJ0c09wdGlvbn1cbiAqICAgICAgYmVjYXVzZSBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCB0dXBsZXMgLyBzbGljZXMuXG4gKiAgIDMuIHtAbGluayB6LnVuaW9uI2NhdGNofSBiYWNrc3RvcHMgdGhlIHdob2xlIHRoaW5nOiBpZlxuICogICAgICBwcmVwcm9jZXNzIHNvbWVob3cgcHJvZHVjZXMgYSBzaGFwZSB0aGF0IHN0aWxsIGRvZXNuJ3RcbiAqICAgICAgbWF0Y2ggYW55IHZhcmlhbnQsIHRoZSBiYWQgaXRlbSBiZWNvbWVzIGBudWxsYCBpbnN0ZWFkIG9mXG4gKiAgICAgIHRha2luZyBkb3duIHRoZSBlbnRpcmUgY2hhcnQgd2l0aCBhXG4gKiAgICAgIGBTdHJ1Y3R1cmVkIG91dHB1dCB2YWxpZGF0aW9uIGZhaWxlZGAgZXJyb3IuXG4gKi9cbmNvbnN0IGNoYXJ0RGF0YVBvaW50U2NoZW1hID0gelxuICAucHJlcHJvY2VzcyhcbiAgICAodikgPT4ge1xuICAgICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2KSA/IHYgOiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IG4gPSBOdW1iZXIodik7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobikgPyBuIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIFNjYXR0ZXIgYFt4LCB5XWAgb3IgaGVhdG1hcCBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gLiBDb2VyY2VcbiAgICAgIC8vIHN0cmluZ2lmaWVkIGNvbXBvbmVudHM7IHJlamVjdCBpZiBhbnkgY29tcG9uZW50IGlzIG5vbi1maW5pdGUuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSAmJiAodi5sZW5ndGggPT09IDIgfHwgdi5sZW5ndGggPT09IDMpKSB7XG4gICAgICAgIGNvbnN0IG51bXMgPSB2Lm1hcCgoYykgPT4gKHR5cGVvZiBjID09PSBcIm51bWJlclwiID8gYyA6IE51bWJlcihjKSkpO1xuICAgICAgICByZXR1cm4gbnVtcy5ldmVyeSgobikgPT4gTnVtYmVyLmlzRmluaXRlKG4pKSA/IG51bXMgOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgXCJ2YWx1ZVwiIGluIHYpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdiBhcyB7IG5hbWU/OiB1bmtub3duOyB2YWx1ZTogdW5rbm93biB9O1xuICAgICAgICBjb25zdCB2YWwgPSB0eXBlb2Ygb2JqLnZhbHVlID09PSBcIm51bWJlclwiID8gb2JqLnZhbHVlIDogTnVtYmVyKG9iai52YWx1ZSk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDb2VyY2UgbnVtZXJpYyAvIGJvb2xlYW4gLyBudWxsaXNoIG5hbWVzIHRvIHN0cmluZ3Mgc28gYVxuICAgICAgICAvLyBwaWUgc2xpY2Uga2V5ZWQgb24gYSB5ZWFyIChgMjAyNGApIG9yIGNhdGVnb3J5IGlkIGlzXG4gICAgICAgIC8vIGFjY2VwdGVkIHdpdGhvdXQgcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgY2F0Y2ggYXJtLlxuICAgICAgICBjb25zdCByYXdOYW1lID0gb2JqLm5hbWU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmF3TmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhd05hbWUgOiByYXdOYW1lID09IG51bGwgPyBcIlwiIDogU3RyaW5nKHJhd05hbWUpO1xuICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHoudW5pb24oW1xuICAgICAgei5udW1iZXIoKSxcbiAgICAgIHoubnVsbCgpLFxuICAgICAgLy8gYFt4LCB5XWAgc2NhdHRlciBvciBgW3gsIHksIHZhbHVlXWAgaGVhdG1hcCBjZWxsLiBNb2RlbGxlZCBhcyBhXG4gICAgICAvLyBsZW5ndGgtY29uc3RyYWluZWQgaG9tb2dlbmVvdXMgYXJyYXkgcmF0aGVyIHRoYW4gYHoudHVwbGVgOlxuICAgICAgLy8gWm9kIGVtaXRzIGEgdHVwbGUgYXMgSlNPTiBTY2hlbWEgMjAyMC0xMiBgcHJlZml4SXRlbXNgLCBhbmRcbiAgICAgIC8vIERhdGFicmlja3MnIEdlbWluaSBlbmRwb2ludHMgcmVqZWN0IGEgYHJlc3BvbnNlX2pzb25fc2NoZW1hYFxuICAgICAgLy8gY29udGFpbmluZyBpdCAoXCJtdXN0IGJlIGEgYm9vbGVhbiBvciBhbiBvYmplY3RcIiwgc2luY2VcbiAgICAgIC8vIGBpdGVtc2AgaXMgYWJzZW50KS4gYG1pbkl0ZW1zYCAvIGBtYXhJdGVtc2AgKyBgaXRlbXNgIGlzIHdoYXRcbiAgICAgIC8vIGV2ZXJ5IHByb3ZpZGVyIHVuZGVyc3RhbmRzLlxuICAgICAgei5hcnJheSh6Lm51bWJlcigpKS5taW4oMikubWF4KDMpLFxuICAgICAgei5vYmplY3QoeyBuYW1lOiB6LnN0cmluZygpLCB2YWx1ZTogei5udW1iZXIoKSB9KSxcbiAgICBdKSxcbiAgKVxuICAuY2F0Y2gobnVsbCk7XG5cbi8qKiBQZXItc2VyaWVzIG1hcmsgdHlwZSB1c2VkIGJ5IGBjb21ib2AgY2hhcnRzIChiYXIgKyBsaW5lIG92ZXJsYXkpLiAqL1xuY29uc3Qgc2VyaWVzTWFya1R5cGVTY2hlbWEgPSB6XG4gIC51bmlvbihbei5saXRlcmFsKFwiYmFyXCIpLCB6LmxpdGVyYWwoXCJsaW5lXCIpLCB6LmxpdGVyYWwoXCJhcmVhXCIpXSlcbiAgLmRlc2NyaWJlKFxuICAgIFwiTWFyayB0eXBlIGZvciB0aGlzIHNlcmllcy4gUmVxdWlyZWQgZm9yIGBjb21ib2AgKG1peCBiYXIgYW5kIGxpbmUvYXJlYSk7IGlnbm9yZWQgZm9yIG90aGVyIGNoYXJ0IHR5cGVzLlwiLFxuICApO1xuXG4vKipcbiAqIENvbXBhY3QsIG1vZGVsLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIEVjaGFydHMgc3BlYy4gVGhlXG4gKiBwbGFubmVyIGFnZW50IGVtaXRzIHRoaXM7IHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufSBleHBhbmRzIGl0XG4gKiBpbnRvIGEgcmVhbCBgRUNoYXJ0c09wdGlvbmAgSlNPTi4gVHdvIGxheWVycyBiZWNhdXNlIGxldHRpbmcgdGhlXG4gKiBtb2RlbCBmaWxsIGluIGEgZnVsbHktdHlwZWQgYEVDaGFydHNPcHRpb25gIGlzIGJyaXR0bGUgKGh1bmRyZWRzXG4gKiBvZiBvcHRpb25hbCBmaWVsZHMsIGRlZXAgdW5pb25zLCB2ZXJzaW9uLWRlcGVuZGVudCBzaGFwZXMpLiBBXG4gKiBzbWFsbCBcImNoYXJ0IHBsYW5cIiBzY2hlbWEgaXMgbXVjaCBtb3JlIHJlbGlhYmxlIGZvciBhIGZhc3QgbW9kZWxcbiAqIGFuZCBrZWVwcyBhbmltYXRpb24gLyB0b29sdGlwIC8gc3R5bGluZyBkZWZhdWx0cyBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgY2hhcnRzLlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRQbGFuU2NoZW1hID0gei5vYmplY3Qoe1xuICBjaGFydFR5cGU6IHdpcmUuQ2hhcnRUeXBlU2NoZW1hLFxuICB0aXRsZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIE9wdGlvbmFsOyBkZWZhdWx0cyB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBwcmltYXJ5ICh1c3VhbGx5IGJvdHRvbSAvIHZhbHVlKSBheGlzLlxuICAgICAgICBVc2VkIGZvciBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbFxuICAgICAgICAvIHNjYXR0ZXIgLyBoZWF0bWFwOyBpZ25vcmVkIGZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwIC8gcmFkYXIuXG4gICAgICBgKSxcbiAgICApLFxuICB5QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgKHVzdWFsbHkgbGVmdCkgYXhpcy4gVXNlZCBmb3JcbiAgICAgICAgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGwgL1xuICAgICAgICBzY2F0dGVyIC8gaGVhdG1hcDsgaWdub3JlZCBmb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcCAvIHJhZGFyLlxuICAgICAgYCksXG4gICAgKSxcbiAgY2F0ZWdvcmllczogelxuICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBQcmltYXJ5IGNhdGVnb3J5IGxhYmVscy4gRm9yIFxcYGJhclxcYCAvIFxcYGhvcml6b250YWxCYXJcXGAgL1xuICAgICAgICBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgd2F0ZXJmYWxsXFxgOiBvbmUgbGFiZWwgcGVyXG4gICAgICAgIGRhdGEgcG9pbnQuIEZvciBcXGBoZWF0bWFwXFxgOiB4LWF4aXMgY2F0ZWdvcmllcy4gRm9yIFxcYHJhZGFyXFxgOlxuICAgICAgICBpbmRpY2F0b3IgbmFtZXMuIE9taXQgZm9yIFxcYHNjYXR0ZXJcXGAgKFxcYFt4LCB5XVxcYCB0dXBsZXMpIGFuZFxuICAgICAgICBzbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGAsIGVhY2ggc2xpY2VcbiAgICAgICAgY2FycmllcyBpdHMgb3duIFxcYG5hbWVcXGApLlxuICAgICAgYCksXG4gICAgKSxcbiAgeUNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgWS1heGlzIChyb3cpIGxhYmVscyBmb3IgXFxgaGVhdG1hcFxcYC4gT3B0aW9uYWwgLSB3aGVuIG9taXR0ZWQgdGhlXG4gICAgICAgIHJvdyBsYWJlbHMgY29tZSBmcm9tIHRoZSBzZXJpZXMgbmFtZXMsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWRcbiAgICAgICAgd2F5IHRvIGJ1aWxkIGEgaGVhdG1hcC4gT21pdCBmb3IgZXZlcnkgb3RoZXIgY2hhcnQgdHlwZS5cbiAgICAgIGApLFxuICAgICksXG4gIHNlcmllczogelxuICAgIC5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgbmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBMZWdlbmQgbmFtZSBmb3IgdGhpcyBzZXJpZXMuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICAgIHR5cGU6IHNlcmllc01hcmtUeXBlU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgIHlBeGlzSW5kZXg6IHpcbiAgICAgICAgICAudW5pb24oW3oubGl0ZXJhbCgwKSwgei5saXRlcmFsKDEpXSlcbiAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFwiV2hpY2ggeS1heGlzIHRvIGJpbmQgKDAgPSBsZWZ0LCAxID0gcmlnaHQpLiBVc2Ugb24gYGNvbWJvYCB3aGVuIHNlcmllcyBoYXZlIGRpZmZlcmVudCB1bml0cyBvciBzY2FsZXMuXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgZGF0YTogei5hcnJheShjaGFydERhdGFQb2ludFNjaGVtYSkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgRGF0YSBwb2ludHMuIEZvciBjYXRlZ29yeSBjaGFydHMgKFxcYGJhclxcYCAvIFxcYGhvcml6b250YWxCYXJcXGBcbiAgICAgICAgICAgIC8gXFxgbGluZVxcYCAvIFxcYGFyZWFcXGAgLyBcXGBjb21ib1xcYCAvIFxcYHdhdGVyZmFsbFxcYCAvIFxcYHJhZGFyXFxgKSxcbiAgICAgICAgICAgIGFuIGFycmF5IG9mIG51bWJlcnMgYWxpZ25lZCB0byBcXGBjYXRlZ29yaWVzXFxgOyBmb3JcbiAgICAgICAgICAgIFxcYHdhdGVyZmFsbFxcYCB0aG9zZSBudW1iZXJzIGFyZSBzaWduZWQgZGVsdGFzIChvbmUgc2VyaWVzXG4gICAgICAgICAgICBvbmx5IC0gbmV2ZXIgYSBjdW11bGF0aXZlIGJhc2Ugc2VyaWVzKS4gRm9yIFxcYGhlYXRtYXBcXGAsXG4gICAgICAgICAgICBvbmUgc2VyaWVzIHBlciBtYXRyaXggcm93LCBob2xkaW5nIHRoYXQgcm93J3MgbnVtYmVyc1xuICAgICAgICAgICAgYWxpZ25lZCB0byBcXGBjYXRlZ29yaWVzXFxgLiBGb3IgXFxgc2NhdHRlclxcYCwgYW4gYXJyYXkgb2ZcbiAgICAgICAgICAgIFxcYFt4LCB5XVxcYCBudW1lcmljIHR1cGxlcy4gRm9yIFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvXG4gICAgICAgICAgICBcXGB0cmVlbWFwXFxgLCBhbiBhcnJheSBvZiBcXGB7bmFtZSwgdmFsdWV9XFxgIG9iamVjdHMuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICApXG4gICAgLmRlZmF1bHQoW10pXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUgb3IgbW9yZSBzZXJpZXMgdG8gcGxvdC4gUmVxdWlyZWQgZm9yIGV2ZXJ5IGNoYXJ0IHR5cGVcbiAgICAgICAgZXhjZXB0IFxcYGN1c3RvbVxcYCwgd2hpY2ggY2FycmllcyBpdHMgc2VyaWVzIGluc2lkZSBcXGBvcHRpb25cXGAuXG4gICAgICAgIFNsaWNlIGNoYXJ0cyAoXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC8gXFxgdHJlZW1hcFxcYCkgYW5kXG4gICAgICAgIFxcYHdhdGVyZmFsbFxcYCAvIFxcYGhlYXRtYXBcXGAgdXNlIGV4YWN0bHkgb25lIHNlcmllczsgXFxgYmFyXFxgIC9cbiAgICAgICAgXFxgbGluZVxcYCAvIFxcYGFyZWFcXGAgLyBcXGBjb21ib1xcYCAvIFxcYHJhZGFyXFxgIC8gXFxgc2NhdHRlclxcYCBjYW5cbiAgICAgICAgY2FycnkgbXVsdGlwbGUgc2VyaWVzLlxuICAgICAgYCksXG4gICAgKSxcbiAgb3B0aW9uOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFJlcXVpcmVkIGZvciBcXGBjdXN0b21cXGAsIGlnbm9yZWQgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuIEFcbiAgICAgICAgQ09NUExFVEUgRWNoYXJ0cyBvcHRpb24sIGFzIGEgSlNPTiBvYmplY3QgZW5jb2RlZCBpbiBhIHN0cmluZzpcbiAgICAgICAgXFxgc2VyaWVzXFxgIChlYWNoIHdpdGggaXRzIG93biBcXGB0eXBlXFxgIGFuZCB0aGF0IHNlcmllcycgb3duIGRhdGFcbiAgICAgICAgc2hhcGUpIHBsdXMgd2hhdGV2ZXIgZWxzZSB0aGUgY2hhcnQgbmVlZHMgLSBhIGNvb3JkaW5hdGUgc3lzdGVtLFxuICAgICAgICBcXGB2aXN1YWxNYXBcXGAsIGF4ZXMuIFBsYWluIEpTT04gdmFsdWVzIG9ubHksIG5ldmVyIGEgSmF2YVNjcmlwdFxuICAgICAgICBmdW5jdGlvbi4gQSBjZW50ZXJlZCB0aXRsZSBpcyBmaWxsZWQgaW4gd2hlbiB0aGUgb2JqZWN0IG9taXRzXG4gICAgICAgIG9uZS5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxudHlwZSBDaGFydFBsYW4gPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5TY2hlbWE+O1xuXG4vKipcbiAqIENhbm9uaWNhbCBwbGFubmVyIGlucHV0IHNoYXBlLiBUb29scyB0aGF0IHNvdXJjZSByb3dzIGZyb20gYW5cbiAqIGlubGluZSBkYXRhc2V0IChgcmVuZGVyX2RhdGFgKSB1c2UgaXQgYXMgdGhlaXIgYGlucHV0U2NoZW1hYFxuICogdmVyYmF0aW07IHRvb2xzIHRoYXQgcmVzb2x2ZSByb3dzIGZyb20gYSByZW1vdGUgKGBwcmVwYXJlX2NoYXJ0YFxuICogb3ZlciBhIEdlbmllIHN0YXRlbWVudCkgYG9taXQoeyBkYXRhIH0pYCBhbmQgYGV4dGVuZGAgd2l0aCB0aGVpclxuICogb3duIGlkZW50aWZpZXIgZmllbGQsIHNvIHRoZSBmaWVsZC1sZXZlbCBgLmRlc2NyaWJlKClgIHRleHRcbiAqIHN0YXlzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC4gU2VydmVyLW9ubHkgLSB0aGUgVUkgbmV2ZXJcbiAqIHNlZXMgYSBwbGFubmVyIHJlcXVlc3QsIG9ubHkgdGhlIHJlc29sdmVkIHtAbGluayBDaGFydH0uXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hID0gei5vYmplY3Qoe1xuICB0aXRsZTogei5zdHJpbmcoKS5kZXNjcmliZShcbiAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIENvbmNpc2UgdGl0bGUgc2hvd24gYWJvdmUgdGhlIGNoYXJ0IChlLmcuIFwiVG9wIDEwIFNLVXMgYnkgUmV2ZW51ZVwiKS5cbiAgICAgIGApLFxuICApLFxuICBkZXNjcmlwdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUtbGluZSBpbnRlbnQgdGhlIGNoYXJ0LXBsYW5uZXIgdXNlcyB3aGVuIHBpY2tpbmcgYSBjaGFydCB0eXBlXG4gICAgICAgIGFuZCBheGlzIGVuY29kaW5ncyAoZS5nLiBcImNvbXBhcmUgcXVhcnRlcmx5IHJldmVudWUgYWNyb3NzXG4gICAgICAgIHJlZ2lvbnNcIiwgXCJoaWdobGlnaHQgdGhlIHN0ZWVwIGRyb3AgYWZ0ZXIgcG9zaXRpb24gNVwiKS4gTm90IHNob3duXG4gICAgICAgIHRvIHRoZSB1c2VyLlxuICAgICAgYCksXG4gICAgKSxcbiAgZGF0YTogelxuICAgIC5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpXG4gICAgLm5vbmVtcHR5KFwiRGF0YSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHJvd1wiKVxuICAgIC5yZWFkb25seSgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBUYWJ1bGFyIGRhdGFzZXQgdG8gY2hhcnQuIE9uZSBvYmplY3QgcGVyIHJvdywga2V5ZWQgYnkgY29sdW1uXG4gICAgICAgIG5hbWUuIFZhbHVlcyBtYXkgYmUgc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9yIG51bGwuIFRoZVxuICAgICAgICBjaGFydC1wbGFubmVyIGRlY2lkZXMgd2hpY2ggY29sdW1ucyBhcmUgY2F0ZWdvcmllcyB2cy4gbnVtZXJpY1xuICAgICAgICBzZXJpZXMuIENhcCBhdCBhIGZldyBodW5kcmVkIHJvd3MgZm9yIGxlZ2liaWxpdHk7IHNhbXBsZSAvXG4gICAgICAgIGFnZ3JlZ2F0ZSBsYXJnZXIgZGF0YXNldHMgZmlyc3QuXG4gICAgICBgKSxcbiAgICApLFxufSk7XG5cbmV4cG9ydCB0eXBlIENoYXJ0UGxhbm5lclJlcXVlc3QgPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hPjtcblxuLyoqXG4gKiBBZ2VudC1mYWNpbmcgcmVzdWx0IG9mIGVpdGhlciBjaGFydC1wcm9kdWNpbmcgdG9vbC5cbiAqXG4gKiBgbWFya2VyYCBpcyBkZWxpYmVyYXRlbHkgcmVkdW5kYW50IHdpdGggYGNoYXJ0SWRgOiB0aGUgaG9zdCBzdGlsbCBrZXlzIHRoZVxuICogY2FjaGUgYnkgaWQsIHdoaWxlIHRoZSBtb2RlbCBnZXRzIHRoZSBleGFjdCBvcGFxdWUgdG9rZW4gdG8gY29weSBpbnRvIHByb3NlXG4gKiBhbmQgaGFzIG5vIHJlYXNvbiB0byBpbnZlbnQgb3IgcmV0eXBlIGEgVVVJRC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSA9IHdpcmUuQ2hhcnRTY2hlbWEucGljayh7IGNoYXJ0SWQ6IHRydWUgfSkuZXh0ZW5kKHtcbiAgbWFya2VyOiB6XG4gICAgLnN0cmluZygpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJFeGFjdCBlbWJlZCBtYXJrZXIuIENvcHkgdGhpcyBjb21wbGV0ZSB2YWx1ZSB2ZXJiYXRpbSBvbnRvIGl0cyBvd24gbGluZTsgbmV2ZXIgY29uc3RydWN0IGEgbWFya2VyIGZyb20gY2hhcnRJZC5cIixcbiAgICApLFxufSk7XG5cbi8qKiBSZXN1bHQgcmV0dXJuZWQgc3luY2hyb25vdXNseSB3aGlsZSBjaGFydCBwbGFubmluZyBjb250aW51ZXMgaW4gdGhlIGJhY2tncm91bmQuICovXG5leHBvcnQgdHlwZSBDaGFydFRvb2xPdXRwdXQgPSB6LmluZmVyPHR5cGVvZiBjaGFydFRvb2xPdXRwdXRTY2hlbWE+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGxhbm5lciBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRm9ybWF0IHtAbGluayB3aXJlLkNoYXJ0VHlwZVNjaGVtYX0ncyB2YXJpYW50cyBhcyBhIHNpbmdsZVxuICogaHVtYW4tZnJpZW5kbHkgc3RyaW5nIG9mIGBgIGA8dmFsdWU+YCBmb3IgPGRlc2NyaXB0aW9uPiBgYFxuICogY2xhdXNlcyBqb2luZWQgYnkgc2VtaWNvbG9ucywgZHJhd24gZnJvbSBlYWNoIHZhcmlhbnQncyBvd25cbiAqIGAuZGVzY3JpYmUoKWAgc28gdGhlIHBsYW5uZXIgcHJvbXB0IHN0YXlzIGluIGxvY2stc3RlcCB3aXRoXG4gKiB0aGUgc2NoZW1hIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0Q2hhcnRUeXBlUGlja2VyKCk6IHN0cmluZyB7XG4gIHJldHVybiB3aXJlLkNoYXJ0VHlwZVNjaGVtYS5vcHRpb25zXG4gICAgLm1hcCgob3B0KSA9PiBgXFxgJHtvcHQudmFsdWV9XFxgIGZvciAke29wdC5kZXNjcmlwdGlvbiA/PyBcIlwifWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbn1cblxuLyoqXG4gKiBTeXN0ZW0gcHJvbXB0IGZvciB0aGUgaW5uZXIgY2hhcnQtcGxhbm5pbmcgYWdlbnQuIFR1bmVkIGZvciBhXG4gKiBmYXN0LXRpZXIgbW9kZWwgKEhhaWt1LCBHUFQtNS1taW5pLCBHZW1pbmkgRmxhc2ggTGl0ZSkuXG4gKi9cbmNvbnN0IENIQVJUX1BMQU5ORVJfSU5TVFJVQ1RJT05TID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICBZb3UgZGVzaWduIEFwYWNoZSBFY2hhcnRzIHZpc3VhbGl6YXRpb25zLiBUaGUgdXNlciBnaXZlcyB5b3UgYVxuICB0YWJ1bGFyIGRhdGFzZXQgKHJvd3Mgb2Ygb2JqZWN0cykgcGx1cyBhIHRpdGxlIGFuZCBhbiBvcHRpb25hbFxuICBkZXNjcmlwdGlvbiBvZiB0aGUgaW50ZW50LiBZb3UgcHJvZHVjZSBhIHNtYWxsIGNoYXJ0IHBsYW4gKGNoYXJ0XG4gIHR5cGUsIGF4aXMgbGFiZWxzLCBjYXRlZ29yaWVzLCBzZXJpZXMpIHRoYXQgYmVzdCBjb252ZXlzIHRoZSBkYXRhLlxuXG4gIERlY2lzaW9uIGd1aWRlLiBQaWNrIHRoZSBjaGFydCB0eXBlIHdob3NlIGRhdGEgc2hhcGUgbWF0Y2hlcyB0aGVcbiAgZGF0YXNldCBhbmQgdGhlIHVzZXIncyBpbnRlbnQ6ICR7Zm9ybWF0Q2hhcnRUeXBlUGlja2VyKCl9LlxuXG4gIFdoZW4gaW4gZG91YnQgYmV0d2VlbiBiYXIgYW5kIGxpbmUsIHByZWZlciBiYXIgZm9yIHVub3JkZXJlZFxuICBjYXRlZ29yaWVzIGFuZCBsaW5lIGZvciBvcmRlcmVkIG9uZXMgKGRhdGVzLCB0aW1lIGJ1Y2tldHMsIHJhbmtzKS5cbiAgUHJlZmVyIFxcYGhvcml6b250YWxCYXJcXGAgd2hlbiBjYXRlZ29yeSBsYWJlbHMgYXJlIGxvbmcuIFByZWZlclxuICBcXGBjb21ib1xcYCB3aGVuIG9uZSBtZWFzdXJlIGlzIGEgY291bnQvdm9sdW1lIGFuZCBhbm90aGVyIGlzIGFcbiAgcmF0ZS90cmVuZC4gUHJlZmVyIFxcYHdhdGVyZmFsbFxcYCBmb3IgYnJpZGdlcyBvZiBzaWduZWQgZGVsdGFzLlxuICBQcmVmZXIgXFxgc2NhdHRlclxcYCB3aGVuIGNvcnJlbGF0aW5nIHR3byBudW1lcmljIGZpZWxkcyAobm9cbiAgY2F0ZWdvcnkgYXhpcykuIFByZWZlciBcXGBoZWF0bWFwXFxgIGZvciBhIGNhdGVnb3J5IHggY2F0ZWdvcnlcbiAgbWF0cml4LiBQcmVmZXIgXFxgcmFkYXJcXGAgZm9yIHNjb3JpbmcgdGhlIHNhbWUgZW50aXRpZXMgYWNyb3NzIGFcbiAgZml4ZWQgc2V0IG9mIGRpbWVuc2lvbnMuIE5ldmVyIHBpY2sgcGllIGZvciBtb3JlIHRoYW4gNyBzbGljZXNcbiAgKHVzZSBcXGB0cmVlbWFwXFxgIGluc3RlYWQpLiBQcmVmZXIgXFxgZnVubmVsXFxgIGZvciBvcmRlcmVkIGNvbnZlcnNpb25cbiAgc3RhZ2VzLlxuXG4gIEZvciBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbDogcGljayBvbmVcbiAgY29sdW1uIGFzIHRoZSBjYXRlZ29yeSBheGlzICh1c3VhbGx5IHRoZSBvbmx5IHN0cmluZy12YWx1ZWQgY29sdW1uKVxuICBhbmQgb25lIG9yIG1vcmUgbnVtZXJpYyBjb2x1bW5zIGFzIHNlcmllcy4gU29ydCBjYXRlZ29yaWVzIGJ5IHRoZVxuICBwcmltYXJ5IHNlcmllcyB2YWx1ZSBkZXNjZW5kaW5nIHVubGVzcyB0aGUgZGF0YSBpcyBuYXR1cmFsbHkgb3JkZXJlZFxuICAoZGF0ZXMsIHJhbmtzLCBmdW5uZWwgc3RhZ2VzLCB3YXRlcmZhbGwgc3RlcHMpLiBGb3IgXFxgY29tYm9cXGAsIHNldFxuICBlYWNoIHNlcmllcycgXFxgdHlwZVxcYCB0byBcXGBiYXJcXGAsIFxcYGxpbmVcXGAsIG9yIFxcYGFyZWFcXGAsIGFuZCB1c2VcbiAgXFxgeUF4aXNJbmRleDogMVxcYCB3aGVuIGEgc2VyaWVzIG5lZWRzIGEgc2Vjb25kIHNjYWxlLlxuXG4gIEZvciB3YXRlcmZhbGwsIGVtaXQgZXhhY3RseSBPTkUgc2VyaWVzIGhvbGRpbmcgdGhlIHNpZ25lZCBzdGVwIHZhbHVlc1xuICAoZGVsdGFzKSwgb25lIHBlciBjYXRlZ29yeSwgaW4gb3JkZXIgLSBwb3NpdGl2ZSBmb3IgYSByaXNlLCBuZWdhdGl2ZVxuICBmb3IgYSBkcm9wLiBEbyBOT1QgYWRkIGEgY3VtdWxhdGl2ZSAvIHJ1bm5pbmctdG90YWwgLyBiYXNlIHNlcmllcyBhbmRcbiAgZG8gTk9UIGNvbnZlcnQgdGhlIGRlbHRhcyBpbnRvIHJ1bm5pbmcgdG90YWxzIHlvdXJzZWxmOyB0aGUgcnVubmluZ1xuICB0b3RhbCBpcyBjb21wdXRlZCBmb3IgeW91LCBhbmQgYSBoYW5kLWJ1aWx0IGJhc2Ugc2VyaWVzIHJlbmRlcnMgYXMgYVxuICBwbGFpbiBiYXIgY2hhcnQgaW5zdGVhZCBvZiBhIGJyaWRnZS5cblxuICBGb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcDogcGljayB0aGUgY2F0ZWdvcnkgY29sdW1uIGZvciBzbGljZSBuYW1lc1xuICBhbmQgb25lIG51bWVyaWMgY29sdW1uIGZvciBzbGljZSB2YWx1ZXMuIEVtaXQgYSBzaW5nbGUgc2VyaWVzIG9mXG4gIFxcYHtuYW1lLCB2YWx1ZX1cXGAgb2JqZWN0cy5cblxuICBGb3Igc2NhdHRlcjogcGljayB0d28gbnVtZXJpYyBjb2x1bW5zIGFuZCBlbWl0IFxcYFt4LCB5XVxcYCB0dXBsZXMgaW5cbiAgb25lIG9yIG1vcmUgc2VyaWVzIChvbmUgc2VyaWVzIHBlciBncm91cCBpZiBhIGdyb3VwaW5nIGNvbHVtbiBleGlzdHMpLlxuXG4gIEZvciBoZWF0bWFwOiBwaWNrIHR3byBjYXRlZ29yeSBjb2x1bW5zIGFuZCBvbmUgbnVtZXJpYyBtZWFzdXJlLiBQdXRcbiAgdGhlIHgtYXhpcyBjYXRlZ29yaWVzIGluIFxcYGNhdGVnb3JpZXNcXGAsIHRoZW4gZW1pdCBPTkUgU0VSSUVTIFBFUiBST1dcbiAgb2YgdGhlIG1hdHJpeCAtIHRoZSBzZXJpZXMgXFxgbmFtZVxcYCBpcyB0aGUgcm93IGxhYmVsIGFuZCBcXGBkYXRhXFxgIGlzXG4gIHRoZSByb3cncyBudW1iZXJzLCBvbmUgcGVyIGVudHJ5IGluIFxcYGNhdGVnb3JpZXNcXGAsIGluIHRoZSBzYW1lIG9yZGVyLlxuICBEbyBub3QgY29tcHV0ZSBjZWxsIGluZGljZXMuXG5cbiAgRm9yIHJhZGFyOiBcXGBjYXRlZ29yaWVzXFxgIGFyZSB0aGUgaW5kaWNhdG9yIG5hbWVzOyBlYWNoIHNlcmllcyBpcyBhblxuICBhcnJheSBvZiBudW1iZXJzIChvbmUgdmFsdWUgcGVyIGluZGljYXRvcikuXG5cbiAgRm9yIGFueXRoaW5nIHRoZSB0eXBlcyBhYm92ZSBjYW5ub3QgZXhwcmVzcyAtIGEgc2Fua2V5LCBib3hwbG90LFxuICBjYW5kbGVzdGljaywgc3VuYnVyc3QsIGdhdWdlLCBuZXR3b3JrIGdyYXBoLCBjYWxlbmRhciwgcGFyYWxsZWwtXG4gIGNvb3JkaW5hdGVzIHBsb3QsIG9yIGFueSBvdGhlciBFY2hhcnRzIHNlcmllcyAtIHVzZSBcXGBjdXN0b21cXGAgYW5kXG4gIGhhbmQtd3JpdGUgdGhlIHdob2xlIEVjaGFydHMgb3B0aW9uIGludG8gXFxgb3B0aW9uXFxgIGFzIGEgSlNPTiBzdHJpbmcuXG4gIEluY2x1ZGUgZXZlcnkgcGFydCB0aGF0IGNoYXJ0IG5lZWRzOiB0aGUgc2VyaWVzIHdpdGggdGhlaXIgb3duXG4gIFxcYHR5cGVcXGAgYW5kIGRhdGEgc2hhcGUsIHBsdXMgYW55IGNvb3JkaW5hdGUgc3lzdGVtLCBcXGB2aXN1YWxNYXBcXGAsXG4gIG9yIGF4ZXMuIExlYXZlIFxcYHNlcmllc1xcYCwgXFxgY2F0ZWdvcmllc1xcYCwgYW5kIHRoZSBheGlzIGxhYmVscyBvdXQ7XG4gIHRoZXkgYXJlIGlnbm9yZWQgZm9yIFxcYGN1c3RvbVxcYC4gUHJlZmVyIGEgbGlzdGVkIHR5cGUgd2hlbmV2ZXIgb25lXG4gIGdlbnVpbmVseSBmaXRzIC0gXFxgY3VzdG9tXFxgIGdpdmVzIHVwIHRoZSBzaGFyZWQgdG9vbHRpcCwgbGVnZW5kLCBhbmRcbiAgZ3JpZCBkZWZhdWx0cywgc28gaXQgaXMgdGhlIGFuc3dlciBmb3IgYW4gdW5zdXBwb3J0ZWQgY2hhcnQgc2hhcGUsXG4gIG5vdCBhIHdheSB0byByZXN0eWxlIGEgc3VwcG9ydGVkIG9uZS5cblxuICBLZWVwIHNlcmllcyBuYW1lcyBodW1hbi1yZWFkYWJsZSAodXNlIHRoZSBjb2x1bW4gbmFtZTsgdGl0bGUgY2FzZSBpdFxuICBsaWdodGx5IGlmIG5lZWRlZCkuIEtlZXAgdGl0bGVzIGNvbmNpc2U7IGRvIG5vdCByZXBlYXQgdGhlIHVzZXInc1xuICB0aXRsZSBpbiB4QXhpc0xhYmVsIC8geUF4aXNMYWJlbC5cbmApO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwbGFubmVyIGFnZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHBsYW5uZXIgYEFnZW50YCBwZXIgcGx1Z2luIGNvbmZpZy4gQ2FjaGVkIG9uIGNvbmZpZyBvYmplY3RcbiAqIGlkZW50aXR5IHNvIGNhbGxlcnMgY2FuIGBwcmVwYXJlQ2hhcnQoeyBjb25maWcsIC4uLiB9KWAgZnJvbSBhXG4gKiBob3QgcGF0aCB3aXRob3V0IHBheWluZyB0aGUgQWdlbnQtY29uc3RydWN0b3IgY29zdCBldmVyeSBjYWxsLlxuICogYFdlYWtNYXBgIGxldHMgcmV0aXJlZCBjb25maWdzIChlLmcuIHRlc3QgcmVjb25maWd1cmF0aW9ucylcbiAqIHJlbGVhc2UgdGhlaXIgYWdlbnQgd2l0aG91dCBtYW51YWwgZXZpY3Rpb24uXG4gKi9cbmNvbnN0IHBsYW5uZXJBZ2VudHMgPSBuZXcgV2Vha01hcDxNYXN0cmFQbHVnaW5Db25maWcsIEFnZW50PigpO1xuXG5mdW5jdGlvbiBnZXRQbGFubmVyQWdlbnQoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBBZ2VudCB7XG4gIGxldCBhZ2VudCA9IHBsYW5uZXJBZ2VudHMuZ2V0KGNvbmZpZyk7XG4gIGlmICghYWdlbnQpIHtcbiAgICBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICBpZDogXCJjaGFydF9wbGFubmVyXCIsXG4gICAgICBuYW1lOiBcIkNoYXJ0IFBsYW5uZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlBpY2tzIGNoYXJ0IHR5cGUgYW5kIGF4aXMgZW5jb2RpbmdzIGZvciBhIGRhdGFzZXQuXCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IENIQVJUX1BMQU5ORVJfSU5TVFJVQ1RJT05TLFxuICAgICAgbW9kZWw6ICh7IHJlcXVlc3RDb250ZXh0IH0pID0+XG4gICAgICAgIGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCwgeyBtb2RlbENsYXNzOiBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0IH0pLFxuICAgIH0pO1xuICAgIHBsYW5uZXJBZ2VudHMuc2V0KGNvbmZpZywgYWdlbnQpO1xuICB9XG4gIHJldHVybiBhZ2VudDtcbn1cblxuLyoqXG4gKiBSdW4gdGhlIHBsYW5uZXIgYWdhaW5zdCBgcmVxdWVzdGAgYW5kIHJldHVybiB0aGUgcmVzb2x2ZWRcbiAqIEVjaGFydHMgc3BlYy4gVGhyb3dzIG9uIHBsYW5uZXIgZmFpbHVyZSAtIHtAbGluayBwcmVwYXJlQ2hhcnR9XG4gKiBjYXRjaGVzIGFuZCBzdGFzaGVzIHRoZSBlcnJvciBpbiB0aGUgY2FjaGUgZW50cnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkNoYXJ0UGxhbm5lcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHJlcXVlc3Q6IENoYXJ0UGxhbm5lclJlcXVlc3QsXG4gIG9wdGlvbnM6IHsgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDsgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCB9ID0ge30sXG4pOiBQcm9taXNlPENoYXJ0UmVzdWx0PiB7XG4gIGNvbnN0IHsgdGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhIH0gPSByZXF1ZXN0O1xuICBjb25zdCB7IHJlcXVlc3RDb250ZXh0LCBhYm9ydFNpZ25hbCB9ID0gb3B0aW9ucztcbiAgY29uc3QgcHJvbXB0ID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oe1xuICAgIFRpdGxlOiB0aXRsZSxcbiAgICAuLi4oZGVzY3JpcHRpb24gPyB7IERlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgIFwiRGF0YXNldCAoSlNPTiwgb25lIHJvdyBwZXIgb2JqZWN0KVwiOiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSxcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFBsYW5uZXJBZ2VudChjb25maWcpLmdlbmVyYXRlKHByb21wdCwge1xuICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHsgc2NoZW1hOiBjaGFydFBsYW5TY2hlbWEgfSxcbiAgICAuLi4ocmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgLi4uKGFib3J0U2lnbmFsID8geyBhYm9ydFNpZ25hbCB9IDoge30pLFxuICB9KTtcbiAgY29uc3QgcGxhbiA9IGNoYXJ0UGxhblNjaGVtYS5wYXJzZShyZXN1bHQub2JqZWN0KTtcbiAgY29uc3Qgb3B0aW9uID0gcGxhblRvRWNoYXJ0c09wdGlvbihwbGFuLCB0aXRsZSwgY29uZmlnLmJyYW5kKTtcbiAgcmV0dXJuIHsgY2hhcnRUeXBlOiBwbGFuLmNoYXJ0VHlwZSwgb3B0aW9uIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjYWNoZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBjYW5vbmljYWwgY2FjaGUga2V5IGZvciBhIGBjaGFydElkYCBvd25lZCBieSBgdXNlcktleWAuXG4gKlxuICogVGhlIGlkZW50aXR5IGlzIHBhcnQgb2YgdGhlIGtleSwgbm90IGEgZmlsdGVyIGFwcGxpZWQgYWZ0ZXIgdGhlIHJlYWQsIHNvIGFcbiAqIGNoYXJ0IGlkIGd1ZXNzZWQgb3IgY29waWVkIGZyb20gYW5vdGhlciB1c2VyJ3MgdHJhbnNjcmlwdCByZXNvbHZlcyB0byBhXG4gKiBkaWZmZXJlbnQga2V5IGFuZCBzaW1wbHkgbWlzc2VzLiBUaGF0IG1pc3MgaXMgd2hhdCB0aGUgSFRUUCByb3V0ZSB0dXJucyBpbnRvXG4gKiBhIDQwNCwgd2hpY2ggaXMgYWxzbyB0aGUgYW5zd2VyIHRoYXQgbGVha3MgdGhlIGxlYXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGFydENhY2hlS2V5KGNoYXJ0SWQ6IHN0cmluZywgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIChhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKSkuZ2VuZXJhdGVLZXkoW0NIQVJUX0NBQ0hFX05BTUVTUEFDRSwgY2hhcnRJZF0sIHVzZXJLZXkpO1xufVxuXG4vKipcbiAqIFBlcnNpc3QgYSB7QGxpbmsgQ2hhcnR9IGVudHJ5IHVuZGVyIGl0cyBgY2hhcnRJZGAsIG93bmVkIGJ5IGB1c2VyS2V5YC5cbiAqIFJlZnJlc2hlcyB0aGUgVFRMIG9uIGV2ZXJ5IHdyaXRlLiBDYWNoZS1sYXllciBmYWlsdXJlcyBhcmUgbG9nZ2VkIGFuZFxuICogc3dhbGxvd2VkIHNvIGJhY2tncm91bmQgcnVubmVycyBuZXZlciB0aHJvdyBpbnRvIHRoZVxuICogdW5oYW5kbGVkLXJlamVjdGlvbiBzdHJlYW0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2hhcnQoZW50cnk6IENoYXJ0LCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjaGFydENhY2hlS2V5KGVudHJ5LmNoYXJ0SWQsIHVzZXJLZXkpO1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5zZXQoa2V5LCBlbnRyeSwge1xuICAgICAgdHRsOiBDSEFSVF9DQUNIRV9UVExfU0VDLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcIndyaXRlLWVycm9yXCIsIHtcbiAgICAgIGNoYXJ0SWQ6IGVudHJ5LmNoYXJ0SWQsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29rIHVwIGEgY2hhcnQgYHVzZXJLZXlgIG93bnMuIFJldHVybnMgYHVuZGVmaW5lZGAgb24gbWlzcywgb25cbiAqIGV4cGlyeSwgd2hlbiBhbm90aGVyIGlkZW50aXR5IG93bnMgdGhlIGlkLCBvciB3aGVuIHRoZSBjYWNoZSBsYXllciBpc1xuICogdW5oZWFsdGh5IC0gbmV2ZXIgdGhyb3dzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkQ2hhcnQoY2hhcnRJZDogc3RyaW5nLCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPENoYXJ0IHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2hhcnRDYWNoZUtleShjaGFydElkLCB1c2VyS2V5KTtcbiAgICBjb25zdCB2ID0gYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldDxDaGFydD4oa2V5KTtcbiAgICByZXR1cm4gdiA/PyB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwicmVhZC1lcnJvclwiLCB7XG4gICAgICBjaGFydElkLFxuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByZXBhcmVDaGFydCBvcmNoZXN0cmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBJbnB1dHMgdG8ge0BsaW5rIHByZXBhcmVDaGFydH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXBhcmVDaGFydE9wdGlvbnMge1xuICAvKiogUGx1Z2luIGNvbmZpZzsgcmVzb2x2ZXMgdGhlIHBsYW5uZXIgYWdlbnQncyBtb2RlbC4gKi9cbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG4gIC8qKlxuICAgKiBJZGVudGl0eSB0aGF0IG93bnMgdGhlIG1pbnRlZCBjaGFydC4gT25seSBhIHtAbGluayBmZXRjaENoYXJ0fSBjYWxsXG4gICAqIGNhcnJ5aW5nIHRoZSBzYW1lIGtleSByZXNvbHZlcyBpdC4gVXNlIHtAbGluayByZXNvbHZlVXNlcktleX0uXG4gICAqL1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IHRpdGxlIGZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudC4gKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBpbnRlbnQgaGludCBmb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHJvd3MgdG8gY2hhcnQuIENhbGxlZCBvbmNlLCBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICogQW55IHRocm93biBlcnJvciBsYW5kcyBpbiB0aGUgY2FjaGUgYXMgdGhlIGVudHJ5J3MgYGVycm9yYFxuICAgKiBmaWVsZCAobmV2ZXIgcHJvcGFnYXRlZCB0byB0aGUgY2FsbGVyIG9mIHtAbGluayBwcmVwYXJlQ2hhcnR9KS5cbiAgICogQW4gZW1wdHkgYHJvd3NgIGFycmF5IGlzIHJlamVjdGVkIGFzIGBcImRhdGFzZXQgaGFzIG5vIHJvd3M7XG4gICAqIG5vdGhpbmcgdG8gY2hhcnRcImAuXG4gICAqL1xuICByZXNvbHZlRGF0YTogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPHsgcm93czogUmVhZG9ubHlBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfT47XG4gIC8qKlxuICAgKiBQZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgLiBGb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQgc29cbiAgICogdXNlci1zY29wZWQgbW9kZWwgcmVzb2x1dGlvbiAoT0JPKSBzdGF5cyBpbiBlZmZlY3QuXG4gICAqL1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xuICAvKipcbiAgICogQ29vcGVyYXRpdmUgY2FuY2VsbGF0aW9uLiBGb3J3YXJkZWQgdG8gYHJlc29sdmVEYXRhYCBhbmQgdGhlXG4gICAqIHBsYW5uZXIgYWdlbnQuIE5vdGU6IHRoZSBjaGFydCB0YXNrIGNvbnRpbnVlcyBydW5uaW5nIGluIHRoZVxuICAgKiBiYWNrZ3JvdW5kIGFmdGVyIHRoZSBwYXJlbnQgcmVxdWVzdCBlbmRzLCBzbyBleHRlcm5hbCBhYm9ydFxuICAgKiBzaWduYWxzIGFyZSBiZXN0LWVmZm9ydDsgdHlwaWNhbCB1c2UgaXMgdG8gbGVhdmUgdGhpcyB1bnNldFxuICAgKiBhbmQgbGV0IHRoZSAxaCBUVEwgY2FwIHN0YWxlIGVudHJpZXMuXG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBNaW50IGEgYGNoYXJ0SWRgLCBjYWNoZSBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHBsYWNlaG9sZGVyXG4gKiBzeW5jaHJvbm91c2x5LCBhbmQga2ljayBvZmYgYSBiYWNrZ3JvdW5kIHRhc2sgdGhhdCByZXNvbHZlcyB0aGVcbiAqIGRhdGFzZXQgYW5kIHJ1bnMgdGhlIHBsYW5uZXIuIFJldHVybnMgdGhlIGBjaGFydElkYCBvbmNlIHRoZVxuICogcGxhY2Vob2xkZXIgbGFuZHMgc28gdGhlIGZpcnN0IHtAbGluayBmZXRjaENoYXJ0fSBjYWxsIGFsd2F5c1xuICogc2VlcyBhbiBlbnRyeSAobm8gc3B1cmlvdXMgNDA0IHJhY2UpLlxuICpcbiAqIFRoZSBiYWNrZ3JvdW5kIHRhc2sgc3dhbGxvd3MgaXRzIG93biBmYWlsdXJlcyBhbmQgd3JpdGVzIHRoZW1cbiAqIGFzIGBlcnJvcmAgZW50cmllcywgc28gY2FsbGVycyBuZXZlciBzZWUgYSByZWplY3RlZCBwcm9taXNlLlxuICogQ2FjaGUgc3RhdGUgbWFjaGluZTpcbiAqXG4gKiAgIC0ganVzdCBhZnRlciB0aGlzIGNhbGwgcmV0dXJuczogYHsgY2hhcnRJZCB9YCAocHJvY2Vzc2luZylcbiAqICAgLSBvbiBwbGFubmVyIHN1Y2Nlc3M6ICAgICAgICAgICBgeyBjaGFydElkLCByZXN1bHQgfWBcbiAqICAgLSBvbiBkYXRhIC8gcGxhbm5lciBmYWlsdXJlOiAgICBgeyBjaGFydElkLCBlcnJvciB9YFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNoYXJ0KG9wdHM6IFByZXBhcmVDaGFydE9wdGlvbnMpOiBQcm9taXNlPENoYXJ0VG9vbE91dHB1dD4ge1xuICBjb25zdCBjaGFydElkID0gaGFzaC5pZCgpO1xuICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCB9LCBvcHRzLnVzZXJLZXkpO1xuICBsb2dnZXIuZGVidWcoXCJxdWV1ZWRcIiwgeyBjaGFydElkIH0pO1xuICAvLyBGaXJlLWFuZC1mb3JnZXQuIEZhaWx1cmVzIGxhbmQgaW4gdGhlIGNhY2hlIGFzIGBlcnJvcmAgZW50cmllcztcbiAgLy8gbmV2ZXIgZXNjYXBlIGludG8gYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgdm9pZCBydW5QcmVwYXJlQ2hhcnQoY2hhcnRJZCwgb3B0cyk7XG4gIHJldHVybiB7IGNoYXJ0SWQsIG1hcmtlcjogbWFya2VyLmZvcm1hdE1hcmtlcihcImNoYXJ0XCIsIGNoYXJ0SWQpIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByZXBhcmVDaGFydChjaGFydElkOiBzdHJpbmcsIG9wdHM6IFByZXBhcmVDaGFydE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgb3B0cy5yZXNvbHZlRGF0YShvcHRzLnNpZ25hbCk7XG4gICAgaWYgKGRhdGEucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIkRhdGFzZXQgaGFzIG5vIHJvd3M7IG5vdGhpbmcgdG8gY2hhcnRcIik7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkNoYXJ0UGxhbm5lcihcbiAgICAgIG9wdHMuY29uZmlnLFxuICAgICAge1xuICAgICAgICB0aXRsZTogb3B0cy50aXRsZSA/PyBcIkNoYXJ0XCIsXG4gICAgICAgIC4uLihvcHRzLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogb3B0cy5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICBkYXRhOiBkYXRhLnJvd3MgYXMgQ2hhcnRQbGFubmVyUmVxdWVzdFtcImRhdGFcIl0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAuLi4ob3B0cy5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IG9wdHMucmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMuc2lnbmFsID8geyBhYm9ydFNpZ25hbDogb3B0cy5zaWduYWwgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCwgcmVzdWx0IH0sIG9wdHMudXNlcktleSk7XG4gICAgbG9nZ2VyLmluZm8oXCJkb25lXCIsIHtcbiAgICAgIGNoYXJ0SWQsXG4gICAgICBjaGFydFR5cGU6IHJlc3VsdC5jaGFydFR5cGUsXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZXJyb3JcIiwgeyBjaGFydElkLCBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgLy8gVGhlIGVudHJ5J3MgYGVycm9yYCBpcyByZW5kZXJlZCBpbiB0aGUgY2hhdCwgc28gb25seSBhbiBBcHBLaXRFcnJvcidzXG4gICAgLy8gb3duIG1lc3NhZ2UgdHJhdmVsczsgYW55dGhpbmcgZWxzZSBjb3VsZCBjYXJyeSB1cHN0cmVhbSBwcm92aWRlciBkZXRhaWwuXG4gICAgY29uc3QgZXJyVGV4dCA9IGVyciBpbnN0YW5jZW9mIEFwcEtpdEVycm9yID8gZXJyLm1lc3NhZ2UgOiBDSEFSVF9GQUlMRURfTUVTU0FHRTtcbiAgICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCwgZXJyb3I6IGVyclRleHQgfSwgb3B0cy51c2VyS2V5KTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxvbmctcG9sbCBmZXRjaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBJbnB1dHMgdG8ge0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBGZXRjaENoYXJ0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZGVudGl0eSB0aGUgY2hhcnQgbXVzdCBiZWxvbmcgdG8uIEEgY2hhcnQgbWludGVkIHVuZGVyIGEgZGlmZmVyZW50IGtleVxuICAgKiBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIHVua25vd24gaWQuIFVzZSB7QGxpbmsgcmVzb2x2ZVVzZXJLZXl9LlxuICAgKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKipcbiAgICogU2VydmVyLXNpZGUgcG9sbGluZyBidWRnZXQgaW4gbXMuIFdoZW4gdGhlIGVudHJ5IHN0YXlzIGluXG4gICAqIHRoZSBwcm9jZXNzaW5nIHN0YXRlIHBhc3QgdGhpcyB3aW5kb3csIHRoZSBoZWxwZXIgcmV0dXJucyB0aGVcbiAgICogbGFzdCBzZWVuIHZhbHVlIChzdGlsbCBwcm9jZXNzaW5nKSBzbyB0aGUgY2xpZW50IGNhbiByZS1wb2xsLlxuICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9GRVRDSF9USU1FT1VUX01TfSAoNjBzKS5cbiAgICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBvbGwgaW50ZXJ2YWwgaW4gbXMuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBERUZBVUxUX0ZFVENIX0lOVEVSVkFMX01TfSAoMjUwbXMpLlxuICAgKi9cbiAgaW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbiBoYW5kbGUgKGUuZy4gcmVxdWVzdCBgcmVxLnNpZ25hbGApLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBMb25nLXBvbGwgdGhlIGNoYXJ0IGNhY2hlIHVudGlsIHRoZSBlbnRyeSBzZXR0bGVzIChgcmVzdWx0YCBvclxuICogYGVycm9yYCBzZXQpLCB0aGUgZW50cnkgaXMgbWlzc2luZywgb3IgdGhlIHNlcnZlci1zaWRlIHRpbWVvdXRcbiAqIGVsYXBzZXMuXG4gKlxuICogUmV0dXJuczpcbiAqICAgLSB0aGUgcmVzb2x2ZWQge0BsaW5rIENoYXJ0fSB3aGVuIGl0IHNldHRsZWQsIGVycm9yZWQsIG9yXG4gKiAgICAgc3RheWVkIGluIHByb2Nlc3NpbmcgcGFzdCBgdGltZW91dE1zYCAoc28gdGhlIGNsaWVudCBjYW5cbiAqICAgICByZS1wb2xsKTtcbiAqICAgLSBgdW5kZWZpbmVkYCB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCBleHBpcmVkLCBvciBvd25lZCBieVxuICogICAgIGFub3RoZXIgaWRlbnRpdHkgKHRoZSBjb25zdW1lciBzaG91bGQgdHJlYXQgYXMgNDA0KS5cbiAqXG4gKiBgc2lnbmFsYCBsZXRzIHRoZSBjYWxsZXIgY2FuY2VsIGFoZWFkIG9mIHRpbWVvdXQgKGUuZy4gdGhlIEhUVFBcbiAqIHJlcXVlc3QgY2xvc2VkKS4gQ2FuY2VsbGF0aW9uIHByb3BhZ2F0ZXMgdG8gdGhlIGludGVyLXBvbGwgc2xlZXBcbiAqIHNvIHRoZSBoZWxwZXIgcmV0dXJucyBpbW1lZGlhdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2hhcnQoXG4gIGNoYXJ0SWQ6IHN0cmluZyxcbiAgb3B0aW9uczogRmV0Y2hDaGFydE9wdGlvbnMsXG4pOiBQcm9taXNlPENoYXJ0IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHRpbWVvdXRNcyA9IG9wdGlvbnMudGltZW91dE1zID8/IERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NUztcbiAgY29uc3QgaW50ZXJ2YWxNcyA9IG9wdGlvbnMuaW50ZXJ2YWxNcyA/PyBERUZBVUxUX0ZFVENIX0lOVEVSVkFMX01TO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG5cbiAgbGV0IGxhc3Q6IENoYXJ0IHwgdW5kZWZpbmVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIG9wdGlvbnMuc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGxhc3QgPSBhd2FpdCByZWFkQ2hhcnQoY2hhcnRJZCwgb3B0aW9ucy51c2VyS2V5KTtcbiAgICBpZiAoIWxhc3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKGxhc3QucmVzdWx0ICE9PSB1bmRlZmluZWQgfHwgbGFzdC5lcnJvciAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbGFzdDtcbiAgICBjb25zdCByZW1haW5pbmcgPSBkZWFkbGluZSAtIERhdGUubm93KCk7XG4gICAgaWYgKHJlbWFpbmluZyA8PSAwKSByZXR1cm4gbGFzdDtcbiAgICBhd2FpdCBhc3luYy5zbGVlcChNYXRoLm1pbihpbnRlcnZhbE1zLCByZW1haW5pbmcpLCBvcHRpb25zLnNpZ25hbCk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZWNoYXJ0cyB0aGVtZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRoZSBzbGljZSBvZiBhbiBFY2hhcnRzIG9wdGlvbiB0aGF0IGNhcnJpZXMgYnJhbmQgaWRlbnRpdHk6IHRoZSBzZXJpZXNcbiAqIGNvbG9yIGN5Y2xlIGFuZCB0aGUgYmFzZSBmb250IHN0YWNrLiBEZXJpdmVkIGZyb20gYSB7QGxpbmsgQnJhbmRDb250ZXh0fVxuICogYnkge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0gYW5kIG1lcmdlZCBpbnRvIGV2ZXJ5IHNwZWMgYnlcbiAqIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgY2FycmllcyBubyB0ZXh0IENPTE9SLiBBIHNwZWMgaXMgcGxhbm5lZCBoZXJlLCBvbiB0aGVcbiAqIHNlcnZlciwgYW5kIHJlYWQgbGF0ZXIgaW4gYSBicm93c2VyIHdob3NlIGxpZ2h0L2RhcmsgdGhlbWUgdGhpcyBjb2RlXG4gKiBjYW5ub3Qga25vdzsgYmFraW5nIGluIHRoZSBicmFuZCdzIHNpbmdsZSAobGlnaHQpIGZvcmVncm91bmQgcHJvZHVjZWRcbiAqIG5lYXItYmxhY2sgbGFiZWxzIHRoYXQgZGlzYXBwZWFyZWQgYWdhaW5zdCBhIGRhcmsgY2hhdCBzdXJmYWNlLiBUaGVcbiAqIHJlbmRlcmVyIHJlc29sdmVzIGNocm9tZSBjb2xvcnMgZnJvbSBBcHBLaXQncyBsaXZlIENTUyB0b2tlbnMgaW5zdGVhZFxuICogKGBAZGJ4LXRvb2xzL3VpLW1hc3RyYWAncyBgY2hhcnQtdGhlbWVgICsgYG5vcm1hbGl6ZUNoYXJ0T3B0aW9uYCksXG4gKiBsZWF2aW5nIHRoaXMgdGhlbWUgdGhlIHBhcnRzIHRoYXQgcmVhZCB0aGUgc2FtZSBpbiBlaXRoZXIgbW9kZS5cbiAqL1xuaW50ZXJmYWNlIENoYXJ0VGhlbWUge1xuICBjb2xvcjogc3RyaW5nW107XG4gIHRleHRTdHlsZTogeyBmb250RmFtaWx5OiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBBcHBLaXQncyBjYXRlZ29yaWNhbCBjaGFydCBwYWxldHRlIChgLS1jaGFydC1jYXQtMWAgLi4gYC0tY2hhcnQtY2F0LThgIGZyb21cbiAqIGBAZGF0YWJyaWNrcy9hcHBraXQtdWlgKSwgYXMgaGV4LiBTZXJ2ZXItcmVuZGVyZWQgY2hhcnQgc3BlY3MgY2Fubm90IHJlYWQgdGhlXG4gKiBicm93c2VyJ3MgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBzbyB0aGUgdmFsdWVzIGFyZSBtaXJyb3JlZCBoZXJlIHRvIGtlZXAgYVxuICogZ2VuZXJhdGVkIGNoYXJ0IHZpc3VhbGx5IGNvbnNpc3RlbnQgd2l0aCB0aGUgQXBwS2l0LXN0eWxlZCBVSSBhcm91bmQgaXQuXG4gKiBLZWVwIGluIHN5bmMgd2l0aCBBcHBLaXQncyBzdHlsZXNoZWV0IGlmIGl0IGNoYW5nZXMuXG4gKi9cbmNvbnN0IEFQUEtJVF9DSEFSVF9QQUxFVFRFID0gW1xuICBcIiMyNDYzRUJcIiwgLy8gYmx1ZVxuICBcIiMyRUI4OEFcIiwgLy8gdGVhbFxuICBcIiNBQjQ3QkRcIiwgLy8gcHVycGxlXG4gIFwiI0Y2OUUyM1wiLCAvLyBhbWJlclxuICBcIiNERDJDNERcIiwgLy8gcm9zZVxuICBcIiMxQkEzQkJcIiwgLy8gY3lhblxuICBcIiM5QjYxRDFcIiwgLy8gbGF2ZW5kZXJcbiAgXCIjMzRCMjYyXCIsIC8vIGVtZXJhbGRcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRXhwYW5kIHR3byBicmFuZCBoZXggY29sb3JzIGludG8gYSBsZWdpYmxlIGNhdGVnb3JpY2FsIGN5Y2xlLiBFY2hhcnRzXG4gKiByZXBlYXRzIHRoZSBgY29sb3JgIGFycmF5IGFjcm9zcyBzZXJpZXMgLyBjYXRlZ29yaWVzLCBzbyBhIGdvb2QgZGVmYXVsdFxuICogbmVlZHMgc2V2ZXJhbCBkaXN0aW5jdCBodWVzLCBub3QgdHdvLiBXZSBzZWVkIHdpdGggdGhlIGJyYW5kIHByaW1hcnkgYW5kXG4gKiBhY2NlbnQgKHRoZSBpZGVudGl0eSBjb2xvcnMpIGFuZCBmb2xsb3cgd2l0aCBBcHBLaXQncyBvd24gY2F0ZWdvcmljYWwgY2hhcnRcbiAqIHBhbGV0dGUsIHNvIG11bHRpLXNlcmllcyAvIG1hbnktc2xpY2UgY2hhcnRzIHN0YXkgcmVhZGFibGUgYW5kIG1hdGNoIHRoZVxuICogc3Vycm91bmRpbmcgQXBwS2l0IFVJIHdoaWxlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIG1hcmtzIGxhbmQgb24tYnJhbmQuXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ29sb3JDeWNsZShwcmltYXJ5OiBzdHJpbmcsIGFjY2VudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBzcHJlYWQgPSBBUFBLSVRfQ0hBUlRfUEFMRVRURTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZXR1cm4gW3ByaW1hcnksIGFjY2VudCwgLi4uc3ByZWFkXS5maWx0ZXIoKGMpID0+IHtcbiAgICBjb25zdCBrZXkgPSBjLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHNlZW4uaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICBzZWVuLmFkZChrZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYW4gRWNoYXJ0cyB7QGxpbmsgQ2hhcnRUaGVtZX0gZnJvbSBhIGJyYW5kIGNvbnRleHQ6IHRoZSBwcmltYXJ5ICtcbiAqIGFjY2VudCBjb2xvcnMgc2VlZCB0aGUgc2VyaWVzIGN5Y2xlIGFuZCB0aGUgc2FucyBzdGFjayBiZWNvbWVzIHRoZSBiYXNlXG4gKiBmb250LiBUZXh0IGNvbG9ycyBhcmUgdGhlIHJlbmRlcmVyJ3Mgam9iIC0gc2VlIHtAbGluayBDaGFydFRoZW1lfS5cbiAqL1xuZnVuY3Rpb24gYnJhbmRDaGFydFRoZW1lKGJyYW5kOiBCcmFuZENvbnRleHQpOiBDaGFydFRoZW1lIHtcbiAgcmV0dXJuIHtcbiAgICBjb2xvcjogYnJhbmRDb2xvckN5Y2xlKGJyYW5kLmNvbG9ycy5wcmltYXJ5LCBicmFuZC5jb2xvcnMuYWNjZW50KSxcbiAgICB0ZXh0U3R5bGU6IHsgZm9udEZhbWlseTogYnJhbmQudHlwb2dyYXBoeS5zYW5zIH0sXG4gIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgZXhwYW5zaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbnR5cGUgTmFtZWRTbGljZSA9IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH07XG50eXBlIFNjYXR0ZXJQb2ludCA9IFtudW1iZXIsIG51bWJlcl07XG50eXBlIEhlYXRtYXBDZWxsID0gW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogS2VlcCBvbmx5IGB7bmFtZSwgdmFsdWV9YCBzbGljZXM7IGRyb3AgbnVsbHMgLyBiYXJlIG51bWJlcnMgLyB0dXBsZXMuICovXG5mdW5jdGlvbiBuYW1lZFNsaWNlcyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBOYW1lZFNsaWNlW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoXG4gICAgKGQpOiBkIGlzIE5hbWVkU2xpY2UgPT4gZCAhPT0gbnVsbCAmJiB0eXBlb2YgZCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShkKSxcbiAgKTtcbn1cblxuLyoqIEtlZXAgb25seSBmaW5pdGUgbnVtYmVycyAoY2F0ZWdvcnkgLyByYWRhciAvIHdhdGVyZmFsbCBzZXJpZXMpLiAqL1xuZnVuY3Rpb24gbnVtZXJpY1BvaW50cyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBudW1iZXJbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcigoZCk6IGQgaXMgbnVtYmVyID0+IHR5cGVvZiBkID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZShkKSk7XG59XG5cbi8qKiBLZWVwIG9ubHkgYFt4LCB5XWAgc2NhdHRlciB0dXBsZXMuICovXG5mdW5jdGlvbiBzY2F0dGVyUG9pbnRzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IFNjYXR0ZXJQb2ludFtdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKFxuICAgIChkKTogZCBpcyBTY2F0dGVyUG9pbnQgPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMixcbiAgKSBhcyBTY2F0dGVyUG9pbnRbXTtcbn1cblxuLyoqIEtlZXAgb25seSBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gIGhlYXRtYXAgY2VsbHMuICovXG5mdW5jdGlvbiBoZWF0bWFwQ2VsbHMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogSGVhdG1hcENlbGxbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcigoZCk6IGQgaXMgSGVhdG1hcENlbGwgPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMykgYXMgSGVhdG1hcENlbGxbXTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgaGVhdG1hcCdzIGNlbGxzIGFuZCByb3cgbGFiZWxzIGZyb20gZWl0aGVyIHNoYXBlIHRoZVxuICogcGxhbm5lciBtYXkgcHJvZHVjZS5cbiAqXG4gKiBUaGUgZG9jdW1lbnRlZCBzaGFwZSBpcyBPTkUgc2VyaWVzIG9mIGBbeEluZGV4LCB5SW5kZXgsIHZhbHVlXWBcbiAqIHRyaXBsZXMsIGJ1dCBpbmRleCBhcml0aG1ldGljIGlzIGV4YWN0bHkgdGhlIGtpbmQgb2YgYm9va2tlZXBpbmcgYVxuICogZmFzdCBtb2RlbCBnZXRzIHdyb25nLCBhbmQgdGhlIGZhaWx1cmUgaXMgc2lsZW50IChldmVyeSBjZWxsIGlzXG4gKiBkcm9wcGVkIGFuZCB0aGUgZ3JpZCByZW5kZXJzIGVtcHR5KS4gU28gdGhlIHJvdy1wZXItc2VyaWVzIHNoYXBlIGl0XG4gKiBhbHJlYWR5IHByb2R1Y2VzIHJlbGlhYmx5IGZvciBiYXIgY2hhcnRzIC0gb25lIHNlcmllcyBwZXIgbWF0cml4XG4gKiByb3csIG51bWJlcnMgYWxpZ25lZCB0byBgY2F0ZWdvcmllc2AgLSBpcyBhY2NlcHRlZCB0b28gYW5kIHR1cm5lZFxuICogaW50byB0cmlwbGVzIGhlcmUuXG4gKlxuICogUm93IG9yZGVyIHJlYWRzIHRvcC10by1ib3R0b206IEVjaGFydHMnIGNhdGVnb3J5IHktYXhpcyBjb3VudHMgaW5kZXhcbiAqIDAgZnJvbSB0aGUgQk9UVE9NLCBzbyBhIHJvdy1kZXJpdmVkIG1hdHJpeCByZXZlcnNlcyBib3RoIHRoZSBheGlzXG4gKiBsYWJlbHMgYW5kIHRoZSByb3cgaW5kaWNlcywgcHV0dGluZyB0aGUgZmlyc3Qgc2VyaWVzIGF0IHRoZSB0b3AgdGhlXG4gKiB3YXkgdGhlIG1vZGVsIGxpc3RlZCBpdC5cbiAqL1xuZnVuY3Rpb24gaGVhdG1hcE1hdHJpeChwbGFuOiBDaGFydFBsYW4pOiB7IGNlbGxzOiBIZWF0bWFwQ2VsbFtdOyB5Q2F0ZWdvcmllczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHRyaXBsZXMgPSBoZWF0bWFwQ2VsbHMocGxhbi5zZXJpZXNbMF0/LmRhdGEgPz8gW10pO1xuICBpZiAodHJpcGxlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHsgY2VsbHM6IHRyaXBsZXMsIHlDYXRlZ29yaWVzOiBwbGFuLnlDYXRlZ29yaWVzID8/IFtdIH07XG4gIH1cbiAgY29uc3Qgcm93cyA9IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHsgbmFtZTogcy5uYW1lLCB2YWx1ZXM6IG51bWVyaWNQb2ludHMocy5kYXRhKSB9KSk7XG4gIGNvbnN0IGxhYmVscyA9IHBsYW4ueUNhdGVnb3JpZXMgPz8gcm93cy5tYXAoKHIpID0+IHIubmFtZSk7XG4gIGNvbnN0IGxhc3RSb3cgPSByb3dzLmxlbmd0aCAtIDE7XG4gIHJldHVybiB7XG4gICAgY2VsbHM6IHJvd3MuZmxhdE1hcCgocm93LCByb3dJbmRleCkgPT5cbiAgICAgIHJvdy52YWx1ZXMubWFwKCh2YWx1ZSwgY29sdW1uSW5kZXgpOiBIZWF0bWFwQ2VsbCA9PiBbY29sdW1uSW5kZXgsIGxhc3RSb3cgLSByb3dJbmRleCwgdmFsdWVdKSxcbiAgICApLFxuICAgIHlDYXRlZ29yaWVzOiBbLi4ubGFiZWxzXS5yZXZlcnNlKCksXG4gIH07XG59XG5cbi8qKiBTZXF1ZW50aWFsIGxpZ2h0LXRvLWJyYW5kIHJhbXAgZm9yIGhlYXRtYXAgaW50ZW5zaXR5LiAqL1xuY29uc3QgSEVBVE1BUF9SQU1QID0gW1wiI0VBRjFGRVwiLCBcIiM5Q0JERjdcIiwgXCIjNEM4NkVFXCIsIFwiIzI0NjNFQlwiLCBcIiMxNDM4N0ZcIl07XG5cbi8qKiBBYm92ZSB0aGlzIG1hbnkgY2VsbHMsIHByaW50ZWQgdmFsdWVzIG92ZXJsYXAgYW5kIGFyZSBzdXBwcmVzc2VkLiAqL1xuY29uc3QgSEVBVE1BUF9MQUJFTF9NQVhfQ0VMTFMgPSA2MDtcblxuLyoqIFJpc2luZyBzdGVwIGZpbGwgKGVtZXJhbGQpIGFuZCBmYWxsaW5nIHN0ZXAgZmlsbCAocm9zZSkuICovXG5jb25zdCBXQVRFUkZBTExfSU5DUkVBU0VfQ09MT1IgPSBcIiMyRUI4OEFcIjtcbmNvbnN0IFdBVEVSRkFMTF9ERUNSRUFTRV9DT0xPUiA9IFwiI0REMkM0RFwiO1xuXG4vKiogU2VyaWVzIG5hbWVzIHRoZSB3YXRlcmZhbGwgZXhwYW5zaW9uIGVtaXRzLiAqL1xuY29uc3QgV0FURVJGQUxMX0hFTFBFUl9OQU1FID0gXCJSdW5uaW5nIHRvdGFsXCI7XG5jb25zdCBXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSA9IFwiSW5jcmVhc2VcIjtcbmNvbnN0IFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FID0gXCJEZWNyZWFzZVwiO1xuXG4vKipcbiAqIEEgbW9kZWwgYXNrZWQgZm9yIGEgYnJpZGdlIG9mdGVuIGJ1aWxkcyB0aGUgcnVubmluZyB0b3RhbCBpdHNlbGYgYW5kXG4gKiBoYW5kcyBiYWNrIGEgY3VtdWxhdGl2ZS1iYXNlIHNlcmllcyBhbG9uZ3NpZGUgdGhlIGRlbHRhcyAtIHdoaWNoXG4gKiByZW5kZXJzIGFzIHR3byBwbGFpbiBiYXIgc2VyaWVzLCBub3QgYSB3YXRlcmZhbGwgKHRoZSBiYXNlIGJhcnMgYXJlXG4gKiB0aGUgdGFsbCBvbmVzKS4gVGhlIGJhc2UgaXMgcmVjb2duaXphYmxlIGJ5IG5hbWUsIHNvIGl0IGlzIGRyb3BwZWRcbiAqIGhlcmUgYW5kIHRoZSBydW5uaW5nIHRvdGFsIHJlY29tcHV0ZWQgZnJvbSB0aGUgZGVsdGFzLlxuICovXG5jb25zdCBXQVRFUkZBTExfQkFTRV9OQU1FID0gL1xcYihiYXNlfGN1bXVsYXRpdmV8cnVubmluZ3xoZWxwZXJ8dG90YWx8c3RhcnQoaW5nKT8pXFxiL2k7XG5cbi8qKlxuICogUGljayB0aGUgc2lnbmVkLWRlbHRhIHNlcmllcyBvdXQgb2YgYSB3YXRlcmZhbGwgcGxhbiwgaWdub3JpbmcgYW55XG4gKiBjdW11bGF0aXZlLWJhc2Ugc2VyaWVzIHRoZSBwbGFubmVyIGJ1aWx0IGJ5IGhhbmRcbiAqICh7QGxpbmsgV0FURVJGQUxMX0JBU0VfTkFNRX0pLiBGYWxscyBiYWNrIHRvIHRoZSBmaXJzdCBzZXJpZXMgd2hlblxuICogZXZlcnkgbmFtZSBsb29rcyBsaWtlIGEgYmFzZSwgc2luY2UgZHJvcHBpbmcgdGhlbSBhbGwgd291bGQgbGVhdmVcbiAqIG5vdGhpbmcgdG8gcGxvdC5cbiAqL1xuZnVuY3Rpb24gd2F0ZXJmYWxsRGVsdGFTZXJpZXMoXG4gIHNlcmllczogQ2hhcnRQbGFuW1wic2VyaWVzXCJdLFxuKTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2VyaWVzLmZpbmQoKHMpID0+ICFXQVRFUkZBTExfQkFTRV9OQU1FLnRlc3Qocy5uYW1lKSkgPz8gc2VyaWVzWzBdO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBzdGFja2VkIHRyYW5zcGFyZW50LWJhc2UgKyBpbmNyZWFzZSArIGRlY3JlYXNlIHNlcmllcyB0aGF0XG4gKiBFY2hhcnRzIHVzZXMgZm9yIGEgd2F0ZXJmYWxsIChpdCBoYXMgbm8gbmF0aXZlIHdhdGVyZmFsbCB0eXBlKS5cbiAqIFZhbHVlcyBhcmUgc2lnbmVkIGRlbHRhczsgdGhlIHRyYW5zcGFyZW50IGhlbHBlciBjYXJyaWVzIHRoZSBydW5uaW5nXG4gKiB0b3RhbCBzbyBlYWNoIHZpc2libGUgYmFyIHN0YXJ0cyB3aGVyZSB0aGUgcHJldmlvdXMgb25lIGVuZGVkLlxuICpcbiAqIFRoZSBoZWxwZXIgaXMgYHNpbGVudGAsIHNvIHdpdGggYW4gaXRlbS10cmlnZ2VyZWQgdG9vbHRpcCBpdCBpc1xuICogaW52aXNpYmxlIHRvIGJvdGggdGhlIGV5ZSBhbmQgdGhlIHBvaW50ZXIgLSB0aGUgYWx0ZXJuYXRpdmUsIGFuIGF4aXNcbiAqIHRvb2x0aXAgdGhhdCBoaWRlcyB0aGUgaGVscGVyIHJvdywgbmVlZHMgYSBmdW5jdGlvbiBmb3JtYXR0ZXIsIGFuZFxuICogdGhpcyBzcGVjIGhhcyB0byBzdXJ2aXZlIEpTT04gc2VyaWFsaXphdGlvbiB0byB0aGUgYnJvd3Nlci5cbiAqL1xuZnVuY3Rpb24gd2F0ZXJmYWxsU2VyaWVzKHZhbHVlczogbnVtYmVyW10pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBoZWxwZXJzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBpbmNyZWFzZXM6IEFycmF5PG51bWJlciB8IFwiLVwiPiA9IFtdO1xuICBjb25zdCBkZWNyZWFzZXM6IEFycmF5PG51bWJlciB8IFwiLVwiPiA9IFtdO1xuICBsZXQgY3VtdWxhdGl2ZSA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlID49IDApIHtcbiAgICAgIGhlbHBlcnMucHVzaChjdW11bGF0aXZlKTtcbiAgICAgIGluY3JlYXNlcy5wdXNoKHZhbHVlKTtcbiAgICAgIGRlY3JlYXNlcy5wdXNoKFwiLVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVscGVycy5wdXNoKGN1bXVsYXRpdmUgKyB2YWx1ZSk7XG4gICAgICBpbmNyZWFzZXMucHVzaChcIi1cIik7XG4gICAgICBkZWNyZWFzZXMucHVzaCgtdmFsdWUpO1xuICAgIH1cbiAgICBjdW11bGF0aXZlICs9IHZhbHVlO1xuICB9XG4gIGNvbnN0IHRyYW5zcGFyZW50ID0geyBib3JkZXJDb2xvcjogXCJ0cmFuc3BhcmVudFwiLCBjb2xvcjogXCJ0cmFuc3BhcmVudFwiIH07XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogV0FURVJGQUxMX0hFTFBFUl9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICBpdGVtU3R5bGU6IHRyYW5zcGFyZW50LFxuICAgICAgZW1waGFzaXM6IHsgaXRlbVN0eWxlOiB0cmFuc3BhcmVudCB9LFxuICAgICAgZGF0YTogaGVscGVycyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9JTkNSRUFTRV9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IFdBVEVSRkFMTF9JTkNSRUFTRV9DT0xPUiB9LFxuICAgICAgZGF0YTogaW5jcmVhc2VzLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogV0FURVJGQUxMX0RFQ1JFQVNFX05BTUUsXG4gICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgc3RhY2s6IFwidG90YWxcIixcbiAgICAgIGl0ZW1TdHlsZTogeyBjb2xvcjogV0FURVJGQUxMX0RFQ1JFQVNFX0NPTE9SIH0sXG4gICAgICBkYXRhOiBkZWNyZWFzZXMsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgYSB7QGxpbmsgQ2hhcnRQbGFufSBpbnRvIGEgZnVsbCBFY2hhcnRzIGBFQ2hhcnRzT3B0aW9uYFxuICogSlNPTi4gQ2VudHJhbGl6ZWQgaGVyZSBzbyB0aGUgcGxhbm5lciBhZ2VudCBvbmx5IGZpbGxzIGluIHRoZVxuICogY29tcGFjdCBwbGFuIHNoYXBlOyB0b29sdGlwIC8gYW5pbWF0aW9uIC8gY29sb3IgLyBncmlkIGRlZmF1bHRzXG4gKiBzdGF5IGNvbnNpc3RlbnQgYWNyb3NzIGNoYXJ0cyBhbmQgYXJlIGVhc3kgdG8gdHVuZSB3aXRob3V0XG4gKiByZXRyYWluaW5nIG1vZGVsIGJlaGF2aW91ci5cbiAqXG4gKiBXaGVuIGBicmFuZGAgaXMgc2V0LCB0aGUgcmVzb2x2ZWQgc3BlYyBpcyB0aGVtZWQgd2l0aCB0aGUgYnJhbmQncyBzZXJpZXNcbiAqIGNvbG9yIGN5Y2xlIGFuZCBiYXNlIHRleHQgc3R5bGUgKHNlZSB7QGxpbmsgYnJhbmRDaGFydFRoZW1lfSk7IG90aGVyd2lzZVxuICogRWNoYXJ0cycgZGVmYXVsdHMgYXBwbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGFuVG9FY2hhcnRzT3B0aW9uKFxuICBwbGFuOiBDaGFydFBsYW4sXG4gIGZhbGxiYWNrVGl0bGU6IHN0cmluZyxcbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGJhc2VUaXRsZSA9IHBsYW4udGl0bGUgPz8gZmFsbGJhY2tUaXRsZTtcbiAgY29uc3QgZ3JpZCA9IHsgbGVmdDogNDgsIHJpZ2h0OiAyNCwgdG9wOiA1NiwgYm90dG9tOiA0OCwgY29udGFpbkxhYmVsOiB0cnVlIH07XG4gIGNvbnN0IHRoZW1lID0gYnJhbmQgPyBicmFuZENoYXJ0VGhlbWUoYnJhbmQpIDogdW5kZWZpbmVkO1xuICBjb25zdCB0aGVtZWQgPSAob3B0aW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gICAgdGhlbWUgPyB7IC4uLnRoZW1lLCAuLi5vcHRpb24gfSA6IG9wdGlvbjtcbiAgY29uc3QgdGl0bGUgPSB7IHRleHQ6IGJhc2VUaXRsZSwgbGVmdDogXCJjZW50ZXJcIiB9O1xuICBjb25zdCBsZWdlbmQgPSB7IGJvdHRvbTogMCB9O1xuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIC8vIFRoZSBvcHRpb24gYXJyaXZlcyBhcyBhIEpTT04gU1RSSU5HLCBub3QgYSBuZXN0ZWQgb2JqZWN0OiB0aGlzIHBsYW4gaXNcbiAgICAvLyB0aGUgcGxhbm5lcidzIHByb3ZpZGVyLWVuZm9yY2VkIHN0cnVjdHVyZWQgb3V0cHV0LCBhbmQgYSBmcmVlLWZvcm1cbiAgICAvLyBvYmplY3QgYmVjb21lcyBhbiB1bmNvbnN0cmFpbmVkIGBhZGRpdGlvbmFsUHJvcGVydGllc2Agc2NoZW1hIHRoYXRcbiAgICAvLyBzdHJpY3QgT3BlbkFJIGFuZCBHZW1pbmkgZW5kcG9pbnRzIHJlamVjdCAtIHdoaWNoIHdvdWxkIGJyZWFrIEVWRVJZXG4gICAgLy8gY2hhcnQsIG5vdCBqdXN0IHRoaXMgb25lIChzYW1lIGNsYXNzIG9mIGhhemFyZCBhcyB0aGUgYHByZWZpeEl0ZW1zYFxuICAgIC8vIG5vdGUgb24gYGNoYXJ0RGF0YVBvaW50U2NoZW1hYCkuIEEgbWFsZm9ybWVkIHN0cmluZyBjb3N0cyBvbmUgY2hhcnQuXG4gICAgLy8gTm90aGluZyBoZXJlIGlzIGV2YWwnZDsgYSBzdHJpbmctdmFsdWVkIEVjaGFydHMgZm9ybWF0dGVyIGlzIGFcbiAgICAvLyB0ZW1wbGF0ZSwgbm90IGNvZGUuXG4gICAgY29uc3Qgb3B0aW9uID0ganNvbi5wYXJzZVJlY29yZChwbGFuLm9wdGlvbik7XG4gICAgaWYgKCFvcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2hhcnRUeXBlIFwiY3VzdG9tXCIgbmVlZHMgYW4gYG9wdGlvbmAgaG9sZGluZyBhIEpTT04gb2JqZWN0Jyk7XG4gICAgfVxuICAgIC8vIFRpdGxlIGlzIHRoZSBvbmUgZGVmYXVsdCB3b3J0aCBmaWxsaW5nOiBldmVyeSBvdGhlciBicmFuY2ggZ3VhcmFudGVlc1xuICAgIC8vIG9uZSBhbmQgdGhlIHJlbmRlcmVyIHJlc2VydmVzIGdyaWQgc3BhY2UgZm9yIGl0LiBBIHRpdGxlIHRoZSBtb2RlbCBzZXRcbiAgICAvLyB3aW5zLCBhcyBkb2VzIGV2ZXJ5IG90aGVyIGZpZWxkIGl0IGRlY2xhcmVkLlxuICAgIHJldHVybiB0aGVtZWQoeyB0aXRsZSwgLi4ub3B0aW9uIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcInBpZVwiIHx8IHBsYW4uY2hhcnRUeXBlID09PSBcImZ1bm5lbFwiIHx8IHBsYW4uY2hhcnRUeXBlID09PSBcInRyZWVtYXBcIikge1xuICAgIGNvbnN0IHNsaWNlcyA9IG5hbWVkU2xpY2VzKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKTtcbiAgICBjb25zdCBzZXJpZXNUeXBlID0gcGxhbi5jaGFydFR5cGU7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZDogc2VyaWVzVHlwZSA9PT0gXCJ0cmVlbWFwXCIgPyB1bmRlZmluZWQgOiBsZWdlbmQsXG4gICAgICBzZXJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHBsYW4uc2VyaWVzWzBdPy5uYW1lID8/IGJhc2VUaXRsZSxcbiAgICAgICAgICB0eXBlOiBzZXJpZXNUeXBlLFxuICAgICAgICAgIC4uLihzZXJpZXNUeXBlID09PSBcInBpZVwiID8geyByYWRpdXM6IFtcIjM1JVwiLCBcIjY1JVwiXSB9IDoge30pLFxuICAgICAgICAgIC4uLihzZXJpZXNUeXBlID09PSBcImZ1bm5lbFwiID8geyBzb3J0OiBcImRlc2NlbmRpbmdcIiB9IDoge30pLFxuICAgICAgICAgIGRhdGE6IHNsaWNlcyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwic2NhdHRlclwiKSB7XG4gICAgLy8gRWNoYXJ0cyBjcmFzaGVzIG9uIG51bGwgc2NhdHRlciBwb2ludHMgLSBrZWVwIG9ubHkgdmFsaWRcbiAgICAvLyBgW3gsIHldYCB0dXBsZXMuIEJhcmUgbnVtYmVycyAvIG9iamVjdHMgLyBudWxscyBmcm9tIGFcbiAgICAvLyBtaXNtYXRjaGVkIHBsYW4gZ2V0IGRyb3BwZWQgc2lsZW50bHkuXG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCB9LFxuICAgICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgIHR5cGU6IFwic2NhdHRlclwiLFxuICAgICAgICBkYXRhOiBzY2F0dGVyUG9pbnRzKHMuZGF0YSksXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiaGVhdG1hcFwiKSB7XG4gICAgY29uc3QgeyBjZWxscywgeUNhdGVnb3JpZXMgfSA9IGhlYXRtYXBNYXRyaXgocGxhbik7XG4gICAgY29uc3QgdmFsdWVzID0gY2VsbHMubWFwKChjKSA9PiBjWzJdKTtcbiAgICBjb25zdCBtaW4gPSB2YWx1ZXMubGVuZ3RoID4gMCA/IE1hdGgubWluKC4uLnZhbHVlcykgOiAwO1xuICAgIGNvbnN0IG1heCA9IHZhbHVlcy5sZW5ndGggPiAwID8gTWF0aC5tYXgoLi4udmFsdWVzKSA6IDE7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgcG9zaXRpb246IFwidG9wXCIgfSxcbiAgICAgIC8vIFRoZSB2aXN1YWxNYXAgcmFtcCBzaXRzIGJlbG93IHRoZSBwbG90LCBzbyB0aGUgZ3JpZCBnaXZlcyB1cFxuICAgICAgLy8gbW9yZSBib3R0b20gcm9vbSB0aGFuIGFuIGF4aXMtb25seSBjaGFydCBuZWVkcy5cbiAgICAgIGdyaWQ6IHsgLi4uZ3JpZCwgYm90dG9tOiA3MiB9LFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgICAgc3BsaXRBcmVhOiB7IHNob3c6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgICB5QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHlDYXRlZ29yaWVzLFxuICAgICAgICBuYW1lOiBwbGFuLnlBeGlzTGFiZWwsXG4gICAgICAgIHNwbGl0QXJlYTogeyBzaG93OiB0cnVlIH0sXG4gICAgICB9LFxuICAgICAgdmlzdWFsTWFwOiB7XG4gICAgICAgIC8vIEVjaGFydHMgaGlkZXMgZXZlcnkgY2VsbCB3aGVuIG1pbiA9PT0gbWF4IChhIHVuaWZvcm0gbWF0cml4KSxcbiAgICAgICAgLy8gc28gYSBkZWdlbmVyYXRlIHJhbmdlIGlzIHdpZGVuZWQgYnkgb25lLlxuICAgICAgICBtaW4sXG4gICAgICAgIG1heDogbWF4ID4gbWluID8gbWF4IDogbWluICsgMSxcbiAgICAgICAgY2FsY3VsYWJsZTogdHJ1ZSxcbiAgICAgICAgb3JpZW50OiBcImhvcml6b250YWxcIixcbiAgICAgICAgbGVmdDogXCJjZW50ZXJcIixcbiAgICAgICAgYm90dG9tOiA4LFxuICAgICAgICBpblJhbmdlOiB7IGNvbG9yOiBIRUFUTUFQX1JBTVAgfSxcbiAgICAgIH0sXG4gICAgICBzZXJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHBsYW4uc2VyaWVzWzBdPy5uYW1lID8/IGJhc2VUaXRsZSxcbiAgICAgICAgICB0eXBlOiBcImhlYXRtYXBcIixcbiAgICAgICAgICBkYXRhOiBjZWxscyxcbiAgICAgICAgICAvLyBQcmludGVkIGNlbGwgdmFsdWVzIGFyZSB1bnJlYWRhYmxlIG9uY2UgdGhlIGdyaWQgaXMgZGVuc2UuXG4gICAgICAgICAgbGFiZWw6IHsgc2hvdzogY2VsbHMubGVuZ3RoIDw9IEhFQVRNQVBfTEFCRUxfTUFYX0NFTExTIH0sXG4gICAgICAgICAgZW1waGFzaXM6IHsgaXRlbVN0eWxlOiB7IHNoYWRvd0JsdXI6IDEwLCBzaGFkb3dDb2xvcjogXCJyZ2JhKDAsIDAsIDAsIDAuMylcIiB9IH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcInJhZGFyXCIpIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gKHBsYW4uY2F0ZWdvcmllcyA/PyBbXSkubWFwKChuYW1lLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGVhayA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICAuLi5wbGFuLnNlcmllcy5tYXAoKHMpID0+IHtcbiAgICAgICAgICBjb25zdCBudW1zID0gbnVtZXJpY1BvaW50cyhzLmRhdGEpO1xuICAgICAgICAgIHJldHVybiBudW1zW2luZGV4XSA/PyAwO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBuYW1lLCBtYXg6IHBlYWsgPiAwID8gcGVhayA6IDEgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgcmFkYXI6IHsgaW5kaWNhdG9yOiBpbmRpY2F0b3JzIH0sXG4gICAgICBzZXJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwicmFkYXJcIixcbiAgICAgICAgICBkYXRhOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVtZXJpY1BvaW50cyhzLmRhdGEpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwid2F0ZXJmYWxsXCIpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBudW1lcmljUG9pbnRzKHdhdGVyZmFsbERlbHRhU2VyaWVzKHBsYW4uc2VyaWVzKT8uZGF0YSA/PyBbXSk7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIC8vIEl0ZW0tdHJpZ2dlcmVkIHNvIHRoZSB0cmFuc3BhcmVudCBgc2lsZW50YCBvZmZzZXQgYmFycyBuZXZlclxuICAgICAgLy8gc3VyZmFjZSBpbiBhIHRvb2x0aXAgKHNlZSBgd2F0ZXJmYWxsU2VyaWVzYCkuXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICAvLyBPbmx5IHRoZSB0d28gdmlzaWJsZSBzdGVwcyBiZWxvbmcgaW4gdGhlIGxlZ2VuZC5cbiAgICAgIGxlZ2VuZDogeyAuLi5sZWdlbmQsIGRhdGE6IFtXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSwgV0FURVJGQUxMX0RFQ1JFQVNFX05BTUVdIH0sXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiB3YXRlcmZhbGxTZXJpZXModmFsdWVzKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJob3Jpem9udGFsQmFyXCIpIHtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiwgYXhpc1BvaW50ZXI6IHsgdHlwZTogXCJzaGFkb3dcIiB9IH0sXG4gICAgICBsZWdlbmQsXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnhBeGlzTGFiZWwgfSxcbiAgICAgIHlBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICBuYW1lOiBwbGFuLnlBeGlzTGFiZWwsXG4gICAgICB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgICAgZGF0YTogcy5kYXRhLFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImNvbWJvXCIpIHtcbiAgICBjb25zdCB1c2VzUmlnaHRBeGlzID0gcGxhbi5zZXJpZXMuc29tZSgocykgPT4gcy55QXhpc0luZGV4ID09PSAxKTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgICB9LFxuICAgICAgeUF4aXM6IHVzZXNSaWdodEF4aXNcbiAgICAgICAgPyBbXG4gICAgICAgICAgICB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgXVxuICAgICAgICA6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSBzLnR5cGUgPz8gXCJiYXJcIjtcbiAgICAgICAgY29uc3Qgc2VyaWVzVHlwZSA9IG1hcmsgPT09IFwiYXJlYVwiID8gXCJsaW5lXCIgOiBtYXJrO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgICB0eXBlOiBzZXJpZXNUeXBlLFxuICAgICAgICAgIGRhdGE6IHMuZGF0YSxcbiAgICAgICAgICB5QXhpc0luZGV4OiBzLnlBeGlzSW5kZXggPz8gMCxcbiAgICAgICAgICBzbW9vdGg6IHNlcmllc1R5cGUgPT09IFwibGluZVwiLFxuICAgICAgICAgIC4uLihtYXJrID09PSBcImFyZWFcIiA/IHsgYXJlYVN0eWxlOiB7fSB9IDoge30pLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBiYXIgLyBsaW5lIC8gYXJlYSBzaGFyZSB0aGUgc2FtZSBheGlzIGxheW91dC5cbiAgY29uc3QgaXNBcmVhID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYXJlYVwiO1xuICBjb25zdCBzZXJpZXNUeXBlID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYmFyXCIgPyBcImJhclwiIDogXCJsaW5lXCI7XG4gIHJldHVybiB0aGVtZWQoe1xuICAgIHRpdGxlLFxuICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJheGlzXCIgfSxcbiAgICBsZWdlbmQsXG4gICAgZ3JpZCxcbiAgICB4QXhpczoge1xuICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgIH0sXG4gICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICBzbW9vdGg6IHNlcmllc1R5cGUgPT09IFwibGluZVwiLFxuICAgICAgLi4uKGlzQXJlYSA/IHsgYXJlYVN0eWxlOiB7fSB9IDoge30pLFxuICAgIH0pKSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlbmRlcl9kYXRhIHRvb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHJlbmRlcl9kYXRhYCBNYXN0cmEgdG9vbCBib3VuZCB0byB0aGUgZ2l2ZW4gcGx1Z2luXG4gKiBjb25maWcuIEF1dG8td2lyZWQgYXMgYSBzeXN0ZW0gdG9vbCBvbiBldmVyeSBhZ2VudCAoc2VlXG4gKiBgYWdlbnRzLnRzYCk7IHBlci1hZ2VudCB0b29scyBjYW4gc2hhZG93IGl0IGJ5IHJlZ2lzdGVyaW5nIGFcbiAqIHNhbWUtbmFtZWQgZW50cnkuXG4gKlxuICogVGhpbiB3cmFwcGVyIG92ZXIge0BsaW5rIHByZXBhcmVDaGFydH0gZm9yIGNhbGxlcnMgdGhhdCBhbHJlYWR5XG4gKiBoYXZlIGEgZGF0YXNldCBpbiBoYW5kLiBNaW50cyBhIGBjaGFydElkYCBzeW5jaHJvbm91c2x5LCBjYWNoZXNcbiAqIGFuIGVtcHR5IHBsYWNlaG9sZGVyLCBhbmQga2lja3Mgb2ZmIHRoZSBjaGFydC1wbGFubmVyIGluIHRoZVxuICogYmFja2dyb3VuZC4gUmV0dXJucyB0aGUgYGNoYXJ0SWRgIHBsdXMgaXRzIHJlYWR5LXRvLWNvcHkgYG1hcmtlcmA7IHRoZSBob3N0XG4gKiBVSSByZXNvbHZlcyB0aGF0IG1hcmtlciB0aHJvdWdoIHRoZSBwbHVnaW4ncyBgL2VtYmVkL2NoYXJ0LzppZGAgcm91dGUuXG4gKlxuICogRm9yIEdlbmllIHN0YXRlbWVudCByZXN1bHRzLCBwcmVmZXIgdGhlIEdlbmllIGFnZW50J3NcbiAqIGBwcmVwYXJlX2NoYXJ0YCB0b29sLCB3aGljaCBhY2NlcHRzIGEgYHN0YXRlbWVudF9pZGAgYW5kXG4gKiByZXNvbHZlcyB0aGUgcm93cyBsYXppbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJlbmRlckRhdGFUb29sKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKSB7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogXCJyZW5kZXJfZGF0YVwiLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcudG9EZXNjcmlwdGlvbihbXG4gICAgICBgXG4gICAgICAgIFN1Ym1pdCBhIHRhYnVsYXIgZGF0YXNldCBmb3IgaW5saW5lIHJlbmRlcmluZyBhcyBhIGNoYXJ0IGluXG4gICAgICAgIHRoZSB1c2VyJ3Mgdmlldy4gUGFzcyBhIHRpdGxlLCB0aGUgcmF3IHJvd3MgKGFycmF5IG9mIG9iamVjdHNcbiAgICAgICAga2V5ZWQgYnkgY29sdW1uIG5hbWUpLCBhbmQgYW4gb3B0aW9uYWwgb25lLWxpbmUgZGVzY3JpcHRpb25cbiAgICAgICAgb2YgdGhlIGluc2lnaHQgdG8gaGlnaGxpZ2h0LiBSZXR1cm5zIFxcYGNoYXJ0SWRcXGAgcGx1cyB0aGVcbiAgICAgICAgY29tcGxldGUgXFxgbWFya2VyXFxgOyBjb3B5IHRoZSByZXR1cm5lZCBtYXJrZXIgVkVSQkFUSU0gb250b1xuICAgICAgICBpdHMgb3duIGxpbmUgd2hlcmUgdGhlIGNoYXJ0IHNob3VsZCByZW5kZXIuIE5ldmVyIGNvbnN0cnVjdCxcbiAgICAgICAgYWx0ZXIsIG9yIGludmVudCBhIGNoYXJ0IG1hcmtlciB5b3Vyc2VsZi5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFBsYWNlbWVudCBjb250cmFjdDogZW1iZWQgdGhlIHJldHVybmVkIFxcYG1hcmtlclxcYCBvbiBpdHMgb3duXG4gICAgICAgIGxpbmUgKGJsYW5rIGxpbmVzIGFib3ZlIGFuZCBiZWxvdykgd2hlcmV2ZXIgeW91IHdhbnQgdGhlIGNoYXJ0XG4gICAgICAgIHRvIGFwcGVhciBpbiB5b3VyIHJlcGx5LiBUaGUgY2hhcnQgcmVzb2x2ZXNcbiAgICAgICAgYXN5bmNocm9ub3VzbHkgLSB0aGUgdG9vbCByZXR1cm5zIHRoZSBpZCBpbW1lZGlhdGVseSBhbmQgdGhlXG4gICAgICAgIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2hhcnQgZnJvbSB0aGUgY2FjaGUgb25jZSB0aGUgcGxhbm5lclxuICAgICAgICBsYW5kcy4gWW91IGNhbiBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIG11bHRpcGxlIHRpbWVzIGluIHRoZVxuICAgICAgICBzYW1lIHR1cm4gKHRoZSB0b29sIGlzIHBhcmFsbGVsLXNhZmUpIGFuZCBpbnRlcmxlYXZlIHRoZVxuICAgICAgICBtYXJrZXJzIHdpdGggcHJvc2Ugc28gZWFjaCBjaGFydCBzaXRzIG5leHQgdG8gaXRzXG4gICAgICAgIGNvbW1lbnRhcnkuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBVc2Ugd2hlbmV2ZXIgYSBTUUwgcm93IHNldCwgQVBJIHJlc3BvbnNlLCBvciBoYW5kLWJ1aWx0XG4gICAgICAgIGRhdGFzZXQgd291bGQgbGFuZCBiZXR0ZXIgYXMgYSBwaWN0dXJlIHRoYW4gYXMgYSBsaXN0IG9yXG4gICAgICAgIHRhYmxlLiBDYXAgaW5wdXQgYXQgYSBmZXcgaHVuZHJlZCByb3dzOyBzYW1wbGUgb3IgYWdncmVnYXRlXG4gICAgICAgIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGAsXG4gICAgXSksXG4gICAgaW5wdXRTY2hlbWE6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsXG4gICAgb3V0cHV0U2NoZW1hOiBjaGFydFRvb2xPdXRwdXRTY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IHsgdGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhIH0gPSBpbnB1dCBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0O1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIHsgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dCB9IHwgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHByZXBhcmVDaGFydCh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkoY3R4Py5yZXF1ZXN0Q29udGV4dCksXG4gICAgICAgIHRpdGxlLFxuICAgICAgICAuLi4oZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHJlc29sdmVEYXRhOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoeyByb3dzOiBkYXRhIH0pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
1020
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILE1BQU0sRUFDTixNQUFNLEdBRVAsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBZ0MsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyw2RUFBNkU7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXBDLHNEQUFzRDtBQUN0RCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFeEMsdURBQXVEO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRXRDLG9FQUFvRTtBQUNwRSxNQUFN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RSxPQUFPLFlBQVksQ0FBQztnQkFDbEIsTUFBTTtnQkFDTixPQUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLEtBQUs7Z0JBQ0wsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGFydCBwbGFubmVyICsgY2hhcnQgY2FjaGUuXG4gKlxuICogU2VsZi1jb250YWluZWQgY2hhcnQgc3Vic3lzdGVtIHdpdGggdHdvIGxheWVyczpcbiAqXG4gKiAgIDEuIElubmVyIHBsYW5uZXIgYWdlbnQgKHByaXZhdGUpLiBQdXJlIGRhdGFzZXQtaW4gL1xuICogICAgICBgRUNoYXJ0c09wdGlvbmAtb3V0IGJyYWluLiBEcml2ZW4gYnkge0BsaW5rIHByZXBhcmVDaGFydH07XG4gKiAgICAgIGNhbGxlcnMgbmV2ZXIgaW5zdGFudGlhdGUgaXQgZGlyZWN0bHkuXG4gKiAgIDIuIHtAbGluayBwcmVwYXJlQ2hhcnR9OiBvcmNoZXN0cmF0aW9uIG9uIHRvcCBvZiB0aGUgcGxhbm5lci5cbiAqICAgICAgTWludHMgYSBgY2hhcnRJZGAsIGNhY2hlcyBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHJlY29yZFxuICogICAgICBzeW5jaHJvbm91c2x5LCB0aGVuIHJlc29sdmVzIHRoZSBkYXRhc2V0IGFuZCBydW5zIHRoZVxuICogICAgICBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgdGVybWluYWwgZW50cnkgc2V0dGxlcyB3aXRoXG4gKiAgICAgIGVpdGhlciBgcmVzdWx0YCAoc3VjY2Vzcykgb3IgYGVycm9yYCAoZmFpbHVyZSkuIEJvdGhcbiAqICAgICAgdW5kZWZpbmVkIG1lYW5zIHRoZSBlbnRyeSBpcyBzdGlsbCBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBjYWNoZSBzdXJmYWNlICh7QGxpbmsgZmV0Y2hDaGFydH0pIGlzIHRoZSBvbmx5IHN0YXRlIHRoZVxuICogSFRUUCByb3V0ZSBhbmQgdGhlIGNoYXJ0LXByb2R1Y2luZyB0b29scyBzaGFyZS4gYHByZXBhcmVDaGFydGBcbiAqIGlzIGRhdGFzZXQtYWdub3N0aWMgLSBjYWxsZXJzIHN1cHBseSBhIGByZXNvbHZlRGF0YWAgY2FsbGJhY2tcbiAqIHRoYXQgZmV0Y2hlcyB0aGUgcm93cyBob3dldmVyIHRoZXkgbGlrZSAoR2VuaWUgc3RhdGVtZW50LCBpbmxpbmVcbiAqIGRhdGFzZXQsIGN1c3RvbSBBUEkpLiBUaGUgbW9kdWxlIGhhcyBubyBrbm93bGVkZ2Ugb2YgR2VuaWUgb3JcbiAqIHN0YXRlbWVudCBpZHM7IHRob3NlIGNvbmNlcm5zIGxpdmUgaW4gdGhlIHRvb2xzIHRoYXQgd3JhcCBpdC5cbiAqXG4gKiBXaXJlLWZvcm1hdCBzY2hlbWFzIGxpdmUgaW4gYEBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYWAgc29cbiAqIHRoZSBkZW1vIGNsaWVudCBhbmQgYW55IG90aGVyIFVJIGNvbnN1bWVyIHNoYXJlIHRoZSBleGFjdCBzYW1lXG4gKiBzaGFwZSB0aGlzIG1vZHVsZSByZWFkcyBhbmQgd3JpdGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBcHBLaXRFcnJvciwgQ2FjaGVNYW5hZ2VyLCBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGFzeW5jLFxuICBlcnJvcixcbiAgaGFzaCxcbiAganNvbixcbiAgbG9nLFxuICBvYmplY3QsXG4gIHN0cmluZyxcbiAgdHlwZSBCcmFuZENvbnRleHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtYXJrZXIsIHdpcmUsIHR5cGUgQ2hhcnQsIHR5cGUgQ2hhcnRSZXN1bHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IGNyZWF0ZVRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyByZXNvbHZlVXNlcktleSwgdHlwZSBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2NoYXJ0XCIpO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRUTCBmb3IgY2FjaGVkIGNoYXJ0IGVudHJpZXMuIE9uZSBob3VyIGJhbGFuY2VzIFwibG9uZyBlbm91Z2ggZm9yXG4gKiB0aGUgaG9zdCBVSSB0byBmZXRjaCB0aGUgY2hhcnQgd2VsbCBhZnRlciB0aGUgbW9kZWwgZmluaXNoZWRcbiAqIHRhbGtpbmdcIiBhZ2FpbnN0IFwic2hvcnQgZW5vdWdoIHRoYXQgYWJhbmRvbmVkIGNoYXJ0IGlkcyBkb24ndFxuICogcGluIHN0b3JhZ2VcIi4gTWF0Y2hlcyB0aGUgdHlwaWNhbCBEYXRhYnJpY2tzIE9CTyB0b2tlbiBsaWZldGltZVxuICogc28gYW55IGRhdGEgcmUtcmVzb2x1dGlvbiBzdGF5cyBpbnNpZGUgdGhlIG9yaWdpbmFsIGF1dGggd2luZG93LlxuICovXG5jb25zdCBDSEFSVF9DQUNIRV9UVExfU0VDID0gNjAgKiA2MDtcblxuLyoqIENhY2hlIG5hbWVzcGFjZTsga2VlcHMgdGhlIGNoYXJ0IGtleXNwYWNlIHRpZHkuICovXG5jb25zdCBDSEFSVF9DQUNIRV9OQU1FU1BBQ0UgPSBcIm1hc3RyYTpjaGFydFwiO1xuXG4vKiogRGVmYXVsdCBzZXJ2ZXItc2lkZSBsb25nLXBvbGwgYnVkZ2V0IGZvciB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5jb25zdCBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVMgPSA2MF8wMDA7XG5cbi8qKiBEZWZhdWx0IGludGVyLXBvbGwgc2xlZXAgZm9yIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmNvbnN0IERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVMgPSAyNTA7XG5cbi8qKiBTdGFibGUgdGV4dCBzdG9yZWQgb24gYSBjaGFydCBlbnRyeSB3aG9zZSBwbGFubmVyIHJ1biBmYWlsZWQuICovXG5jb25zdCBDSEFSVF9GQUlMRURfTUVTU0FHRSA9IFwiQ2hhcnQgZ2VuZXJhdGlvbiBmYWlsZWRcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzY2hlbWFzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgc2VyaWVzIGRhdGEgcG9pbnQuIFdpZGUgdmFyaWFudCBzZXQgc28gdGhlIHBsYW5uZXIgYWdlbnQgY2FuXG4gKiBmYWl0aGZ1bGx5IHBhc3MgdGhyb3VnaCB3aGF0ZXZlciB0aGUgU1FMIHJvdyBzZXQgY29udGFpbmVkXG4gKiAobnVtYmVycywgc3RyaW5naWZpZWQgbnVtYmVycywgbnVsbHMgZm9yIG1pc3NpbmcgbWVhc3VyZW1lbnRzLFxuICogYFt4LCB5XWAgdHVwbGVzIGZvciBzY2F0dGVyLCBgW3gsIHksIHZhbHVlXWAgdHJpcGxlcyBmb3IgaGVhdG1hcCxcbiAqIGB7bmFtZSwgdmFsdWV9YCBzbGljZXMgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXApIHdpdGhvdXQgdGhlXG4gKiBzdHJ1Y3R1cmVkLW91dHB1dCBndWFyZCByZWplY3RpbmcgdGhlIHdob2xlIHBsYW4uXG4gKlxuICogVGhyZWUgbGF5ZXJzIG9mIHRvbGVyYW5jZTpcbiAqXG4gKiAgIDEuIHtAbGluayB6LnByZXByb2Nlc3N9IG5vcm1hbGl6ZXMgd2lyZSBzaGFwZXMgQkVGT1JFIHVuaW9uXG4gKiAgICAgIGRpc3BhdGNoOiBzdHJpbmdpZmllZCBudW1iZXJzIHBhcnNlIHRvIG51bWJlcnMsIGZpbml0ZVxuICogICAgICBjaGVja3MgcmVqZWN0IGBOYU5gIC8gYEluZmluaXR5YCwgMi0vMy1lbGVtZW50IGFycmF5cyBjb2VyY2VcbiAqICAgICAgdHVwbGUgY29tcG9uZW50cywgYW5kIGB7dmFsdWV9YCBvYmplY3RzIHdpdGggbWlzc2luZyAvXG4gKiAgICAgIHN0cmluZ2lmaWVkIGB2YWx1ZWAgZ2V0IGNvZXJjZWQgb3IgcmVqZWN0ZWQgdW5pZm9ybWx5LlxuICogICAgICBBbnl0aGluZyBub3QgaGFuZGxlYWJsZSBiZWNvbWVzIGBudWxsYC5cbiAqICAgMi4gVGhlIHVuaW9uIGFjY2VwdHMgYG51bGxgIGFzIGEgZmlyc3QtY2xhc3MgdmFyaWFudC4gRWNoYXJ0c1xuICogICAgICByZW5kZXJzIG51bGwgYXMgYSBnYXAgb24gYmFyIC8gbGluZSAvIGFyZWEgKHdoaWNoIGlzIHRoZVxuICogICAgICByaWdodCB2aXN1YWwgc2lnbmFsIGZvciBcIm1pc3NpbmcgcmVhZGluZ1wiKS4gU2NhdHRlciwgaGVhdG1hcCxcbiAqICAgICAgYW5kIHNsaWNlIGNoYXJ0cyBmaWx0ZXIgbnVsbHMgaW4ge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259XG4gKiAgICAgIGJlY2F1c2UgRWNoYXJ0cyBjcmFzaGVzIG9uIG51bGwgdHVwbGVzIC8gc2xpY2VzLlxuICogICAzLiB7QGxpbmsgei51bmlvbiNjYXRjaH0gYmFja3N0b3BzIHRoZSB3aG9sZSB0aGluZzogaWZcbiAqICAgICAgcHJlcHJvY2VzcyBzb21laG93IHByb2R1Y2VzIGEgc2hhcGUgdGhhdCBzdGlsbCBkb2Vzbid0XG4gKiAgICAgIG1hdGNoIGFueSB2YXJpYW50LCB0aGUgYmFkIGl0ZW0gYmVjb21lcyBgbnVsbGAgaW5zdGVhZCBvZlxuICogICAgICB0YWtpbmcgZG93biB0aGUgZW50aXJlIGNoYXJ0IHdpdGggYVxuICogICAgICBgU3RydWN0dXJlZCBvdXRwdXQgdmFsaWRhdGlvbiBmYWlsZWRgIGVycm9yLlxuICovXG5jb25zdCBjaGFydERhdGFQb2ludFNjaGVtYSA9IHpcbiAgLnByZXByb2Nlc3MoXG4gICAgKHYpID0+IHtcbiAgICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodikgPyB2IDogbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gb2JqZWN0LnRvTnVtYmVyKHYpID8/IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBTY2F0dGVyIGBbeCwgeV1gIG9yIGhlYXRtYXAgYFt4SW5kZXgsIHlJbmRleCwgdmFsdWVdYC4gQ29lcmNlXG4gICAgICAvLyBzdHJpbmdpZmllZCBjb21wb25lbnRzOyByZWplY3QgaWYgYW55IGNvbXBvbmVudCBpcyBub24tZmluaXRlLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgKHYubGVuZ3RoID09PSAyIHx8IHYubGVuZ3RoID09PSAzKSkge1xuICAgICAgICBjb25zdCBudW1zID0gdi5tYXAoKGMpID0+IG9iamVjdC50b051bWJlcihjKSk7XG4gICAgICAgIHJldHVybiBudW1zLmV2ZXJ5KChuKSA9PiBuICE9PSB1bmRlZmluZWQpID8gbnVtcyA6IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiBcInZhbHVlXCIgaW4gdikge1xuICAgICAgICBjb25zdCBvYmogPSB2IGFzIHsgbmFtZT86IHVua25vd247IHZhbHVlOiB1bmtub3duIH07XG4gICAgICAgIGNvbnN0IHZhbCA9IG9iamVjdC50b051bWJlcihvYmoudmFsdWUpO1xuICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDb2VyY2UgbnVtZXJpYyAvIGJvb2xlYW4gLyBudWxsaXNoIG5hbWVzIHRvIHN0cmluZ3Mgc28gYVxuICAgICAgICAvLyBwaWUgc2xpY2Uga2V5ZWQgb24gYSB5ZWFyIChgMjAyNGApIG9yIGNhdGVnb3J5IGlkIGlzXG4gICAgICAgIC8vIGFjY2VwdGVkIHdpdGhvdXQgcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgY2F0Y2ggYXJtLlxuICAgICAgICBjb25zdCByYXdOYW1lID0gb2JqLm5hbWU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmF3TmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhd05hbWUgOiByYXdOYW1lID09IG51bGwgPyBcIlwiIDogU3RyaW5nKHJhd05hbWUpO1xuICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHoudW5pb24oW1xuICAgICAgei5udW1iZXIoKSxcbiAgICAgIHoubnVsbCgpLFxuICAgICAgLy8gYFt4LCB5XWAgc2NhdHRlciBvciBgW3gsIHksIHZhbHVlXWAgaGVhdG1hcCBjZWxsLiBNb2RlbGxlZCBhcyBhXG4gICAgICAvLyBsZW5ndGgtY29uc3RyYWluZWQgaG9tb2dlbmVvdXMgYXJyYXkgcmF0aGVyIHRoYW4gYHoudHVwbGVgOlxuICAgICAgLy8gWm9kIGVtaXRzIGEgdHVwbGUgYXMgSlNPTiBTY2hlbWEgMjAyMC0xMiBgcHJlZml4SXRlbXNgLCBhbmRcbiAgICAgIC8vIERhdGFicmlja3MnIEdlbWluaSBlbmRwb2ludHMgcmVqZWN0IGEgYHJlc3BvbnNlX2pzb25fc2NoZW1hYFxuICAgICAgLy8gY29udGFpbmluZyBpdCAoXCJtdXN0IGJlIGEgYm9vbGVhbiBvciBhbiBvYmplY3RcIiwgc2luY2VcbiAgICAgIC8vIGBpdGVtc2AgaXMgYWJzZW50KS4gYG1pbkl0ZW1zYCAvIGBtYXhJdGVtc2AgKyBgaXRlbXNgIGlzIHdoYXRcbiAgICAgIC8vIGV2ZXJ5IHByb3ZpZGVyIHVuZGVyc3RhbmRzLlxuICAgICAgei5hcnJheSh6Lm51bWJlcigpKS5taW4oMikubWF4KDMpLFxuICAgICAgei5vYmplY3QoeyBuYW1lOiB6LnN0cmluZygpLCB2YWx1ZTogei5udW1iZXIoKSB9KSxcbiAgICBdKSxcbiAgKVxuICAuY2F0Y2gobnVsbCk7XG5cbi8qKiBQZXItc2VyaWVzIG1hcmsgdHlwZSB1c2VkIGJ5IGBjb21ib2AgY2hhcnRzIChiYXIgKyBsaW5lIG92ZXJsYXkpLiAqL1xuY29uc3Qgc2VyaWVzTWFya1R5cGVTY2hlbWEgPSB6XG4gIC51bmlvbihbei5saXRlcmFsKFwiYmFyXCIpLCB6LmxpdGVyYWwoXCJsaW5lXCIpLCB6LmxpdGVyYWwoXCJhcmVhXCIpXSlcbiAgLmRlc2NyaWJlKFxuICAgIFwiTWFyayB0eXBlIGZvciB0aGlzIHNlcmllcy4gUmVxdWlyZWQgZm9yIGBjb21ib2AgKG1peCBiYXIgYW5kIGxpbmUvYXJlYSk7IGlnbm9yZWQgZm9yIG90aGVyIGNoYXJ0IHR5cGVzLlwiLFxuICApO1xuXG4vKipcbiAqIENvbXBhY3QsIG1vZGVsLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIEVjaGFydHMgc3BlYy4gVGhlXG4gKiBwbGFubmVyIGFnZW50IGVtaXRzIHRoaXM7IHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufSBleHBhbmRzIGl0XG4gKiBpbnRvIGEgcmVhbCBgRUNoYXJ0c09wdGlvbmAgSlNPTi4gVHdvIGxheWVycyBiZWNhdXNlIGxldHRpbmcgdGhlXG4gKiBtb2RlbCBmaWxsIGluIGEgZnVsbHktdHlwZWQgYEVDaGFydHNPcHRpb25gIGlzIGJyaXR0bGUgKGh1bmRyZWRzXG4gKiBvZiBvcHRpb25hbCBmaWVsZHMsIGRlZXAgdW5pb25zLCB2ZXJzaW9uLWRlcGVuZGVudCBzaGFwZXMpLiBBXG4gKiBzbWFsbCBcImNoYXJ0IHBsYW5cIiBzY2hlbWEgaXMgbXVjaCBtb3JlIHJlbGlhYmxlIGZvciBhIGZhc3QgbW9kZWxcbiAqIGFuZCBrZWVwcyBhbmltYXRpb24gLyB0b29sdGlwIC8gc3R5bGluZyBkZWZhdWx0cyBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgY2hhcnRzLlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRQbGFuU2NoZW1hID0gei5vYmplY3Qoe1xuICBjaGFydFR5cGU6IHdpcmUuQ2hhcnRUeXBlU2NoZW1hLFxuICB0aXRsZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIE9wdGlvbmFsOyBkZWZhdWx0cyB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBwcmltYXJ5ICh1c3VhbGx5IGJvdHRvbSAvIHZhbHVlKSBheGlzLlxuICAgICAgICBVc2VkIGZvciBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbFxuICAgICAgICAvIHNjYXR0ZXIgLyBoZWF0bWFwOyBpZ25vcmVkIGZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwIC8gcmFkYXIuXG4gICAgICBgKSxcbiAgICApLFxuICB5QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgKHVzdWFsbHkgbGVmdCkgYXhpcy4gVXNlZCBmb3JcbiAgICAgICAgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGwgL1xuICAgICAgICBzY2F0dGVyIC8gaGVhdG1hcDsgaWdub3JlZCBmb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcCAvIHJhZGFyLlxuICAgICAgYCksXG4gICAgKSxcbiAgY2F0ZWdvcmllczogelxuICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBQcmltYXJ5IGNhdGVnb3J5IGxhYmVscy4gRm9yIFxcYGJhclxcYCAvIFxcYGhvcml6b250YWxCYXJcXGAgL1xuICAgICAgICBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgd2F0ZXJmYWxsXFxgOiBvbmUgbGFiZWwgcGVyXG4gICAgICAgIGRhdGEgcG9pbnQuIEZvciBcXGBoZWF0bWFwXFxgOiB4LWF4aXMgY2F0ZWdvcmllcy4gRm9yIFxcYHJhZGFyXFxgOlxuICAgICAgICBpbmRpY2F0b3IgbmFtZXMuIE9taXQgZm9yIFxcYHNjYXR0ZXJcXGAgKFxcYFt4LCB5XVxcYCB0dXBsZXMpIGFuZFxuICAgICAgICBzbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGAsIGVhY2ggc2xpY2VcbiAgICAgICAgY2FycmllcyBpdHMgb3duIFxcYG5hbWVcXGApLlxuICAgICAgYCksXG4gICAgKSxcbiAgeUNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgWS1heGlzIChyb3cpIGxhYmVscyBmb3IgXFxgaGVhdG1hcFxcYC4gT3B0aW9uYWwgLSB3aGVuIG9taXR0ZWQgdGhlXG4gICAgICAgIHJvdyBsYWJlbHMgY29tZSBmcm9tIHRoZSBzZXJpZXMgbmFtZXMsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWRcbiAgICAgICAgd2F5IHRvIGJ1aWxkIGEgaGVhdG1hcC4gT21pdCBmb3IgZXZlcnkgb3RoZXIgY2hhcnQgdHlwZS5cbiAgICAgIGApLFxuICAgICksXG4gIHNlcmllczogelxuICAgIC5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgbmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBMZWdlbmQgbmFtZSBmb3IgdGhpcyBzZXJpZXMuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICAgIHR5cGU6IHNlcmllc01hcmtUeXBlU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgIHlBeGlzSW5kZXg6IHpcbiAgICAgICAgICAudW5pb24oW3oubGl0ZXJhbCgwKSwgei5saXRlcmFsKDEpXSlcbiAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFwiV2hpY2ggeS1heGlzIHRvIGJpbmQgKDAgPSBsZWZ0LCAxID0gcmlnaHQpLiBVc2Ugb24gYGNvbWJvYCB3aGVuIHNlcmllcyBoYXZlIGRpZmZlcmVudCB1bml0cyBvciBzY2FsZXMuXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgZGF0YTogei5hcnJheShjaGFydERhdGFQb2ludFNjaGVtYSkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgRGF0YSBwb2ludHMuIEZvciBjYXRlZ29yeSBjaGFydHMgKFxcYGJhclxcYCAvIFxcYGhvcml6b250YWxCYXJcXGBcbiAgICAgICAgICAgIC8gXFxgbGluZVxcYCAvIFxcYGFyZWFcXGAgLyBcXGBjb21ib1xcYCAvIFxcYHdhdGVyZmFsbFxcYCAvIFxcYHJhZGFyXFxgKSxcbiAgICAgICAgICAgIGFuIGFycmF5IG9mIG51bWJlcnMgYWxpZ25lZCB0byBcXGBjYXRlZ29yaWVzXFxgOyBmb3JcbiAgICAgICAgICAgIFxcYHdhdGVyZmFsbFxcYCB0aG9zZSBudW1iZXJzIGFyZSBzaWduZWQgZGVsdGFzIChvbmUgc2VyaWVzXG4gICAgICAgICAgICBvbmx5IC0gbmV2ZXIgYSBjdW11bGF0aXZlIGJhc2Ugc2VyaWVzKS4gRm9yIFxcYGhlYXRtYXBcXGAsXG4gICAgICAgICAgICBvbmUgc2VyaWVzIHBlciBtYXRyaXggcm93LCBob2xkaW5nIHRoYXQgcm93J3MgbnVtYmVyc1xuICAgICAgICAgICAgYWxpZ25lZCB0byBcXGBjYXRlZ29yaWVzXFxgLiBGb3IgXFxgc2NhdHRlclxcYCwgYW4gYXJyYXkgb2ZcbiAgICAgICAgICAgIFxcYFt4LCB5XVxcYCBudW1lcmljIHR1cGxlcy4gRm9yIFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvXG4gICAgICAgICAgICBcXGB0cmVlbWFwXFxgLCBhbiBhcnJheSBvZiBcXGB7bmFtZSwgdmFsdWV9XFxgIG9iamVjdHMuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICApXG4gICAgLmRlZmF1bHQoW10pXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUgb3IgbW9yZSBzZXJpZXMgdG8gcGxvdC4gUmVxdWlyZWQgZm9yIGV2ZXJ5IGNoYXJ0IHR5cGVcbiAgICAgICAgZXhjZXB0IFxcYGN1c3RvbVxcYCwgd2hpY2ggY2FycmllcyBpdHMgc2VyaWVzIGluc2lkZSBcXGBvcHRpb25cXGAuXG4gICAgICAgIFNsaWNlIGNoYXJ0cyAoXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC8gXFxgdHJlZW1hcFxcYCkgYW5kXG4gICAgICAgIFxcYHdhdGVyZmFsbFxcYCAvIFxcYGhlYXRtYXBcXGAgdXNlIGV4YWN0bHkgb25lIHNlcmllczsgXFxgYmFyXFxgIC9cbiAgICAgICAgXFxgbGluZVxcYCAvIFxcYGFyZWFcXGAgLyBcXGBjb21ib1xcYCAvIFxcYHJhZGFyXFxgIC8gXFxgc2NhdHRlclxcYCBjYW5cbiAgICAgICAgY2FycnkgbXVsdGlwbGUgc2VyaWVzLlxuICAgICAgYCksXG4gICAgKSxcbiAgb3B0aW9uOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFJlcXVpcmVkIGZvciBcXGBjdXN0b21cXGAsIGlnbm9yZWQgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuIEFcbiAgICAgICAgQ09NUExFVEUgRWNoYXJ0cyBvcHRpb24sIGFzIGEgSlNPTiBvYmplY3QgZW5jb2RlZCBpbiBhIHN0cmluZzpcbiAgICAgICAgXFxgc2VyaWVzXFxgIChlYWNoIHdpdGggaXRzIG93biBcXGB0eXBlXFxgIGFuZCB0aGF0IHNlcmllcycgb3duIGRhdGFcbiAgICAgICAgc2hhcGUpIHBsdXMgd2hhdGV2ZXIgZWxzZSB0aGUgY2hhcnQgbmVlZHMgLSBhIGNvb3JkaW5hdGUgc3lzdGVtLFxuICAgICAgICBcXGB2aXN1YWxNYXBcXGAsIGF4ZXMuIFBsYWluIEpTT04gdmFsdWVzIG9ubHksIG5ldmVyIGEgSmF2YVNjcmlwdFxuICAgICAgICBmdW5jdGlvbi4gQSBjZW50ZXJlZCB0aXRsZSBpcyBmaWxsZWQgaW4gd2hlbiB0aGUgb2JqZWN0IG9taXRzXG4gICAgICAgIG9uZS5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxudHlwZSBDaGFydFBsYW4gPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5TY2hlbWE+O1xuXG4vKipcbiAqIENhbm9uaWNhbCBwbGFubmVyIGlucHV0IHNoYXBlLiBUb29scyB0aGF0IHNvdXJjZSByb3dzIGZyb20gYW5cbiAqIGlubGluZSBkYXRhc2V0IChgcmVuZGVyX2RhdGFgKSB1c2UgaXQgYXMgdGhlaXIgYGlucHV0U2NoZW1hYFxuICogdmVyYmF0aW07IHRvb2xzIHRoYXQgcmVzb2x2ZSByb3dzIGZyb20gYSByZW1vdGUgKGBwcmVwYXJlX2NoYXJ0YFxuICogb3ZlciBhIEdlbmllIHN0YXRlbWVudCkgYG9taXQoeyBkYXRhIH0pYCBhbmQgYGV4dGVuZGAgd2l0aCB0aGVpclxuICogb3duIGlkZW50aWZpZXIgZmllbGQsIHNvIHRoZSBmaWVsZC1sZXZlbCBgLmRlc2NyaWJlKClgIHRleHRcbiAqIHN0YXlzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC4gU2VydmVyLW9ubHkgLSB0aGUgVUkgbmV2ZXJcbiAqIHNlZXMgYSBwbGFubmVyIHJlcXVlc3QsIG9ubHkgdGhlIHJlc29sdmVkIHtAbGluayBDaGFydH0uXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hID0gei5vYmplY3Qoe1xuICB0aXRsZTogei5zdHJpbmcoKS5kZXNjcmliZShcbiAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIENvbmNpc2UgdGl0bGUgc2hvd24gYWJvdmUgdGhlIGNoYXJ0IChlLmcuIFwiVG9wIDEwIFNLVXMgYnkgUmV2ZW51ZVwiKS5cbiAgICAgIGApLFxuICApLFxuICBkZXNjcmlwdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUtbGluZSBpbnRlbnQgdGhlIGNoYXJ0LXBsYW5uZXIgdXNlcyB3aGVuIHBpY2tpbmcgYSBjaGFydCB0eXBlXG4gICAgICAgIGFuZCBheGlzIGVuY29kaW5ncyAoZS5nLiBcImNvbXBhcmUgcXVhcnRlcmx5IHJldmVudWUgYWNyb3NzXG4gICAgICAgIHJlZ2lvbnNcIiwgXCJoaWdobGlnaHQgdGhlIHN0ZWVwIGRyb3AgYWZ0ZXIgcG9zaXRpb24gNVwiKS4gTm90IHNob3duXG4gICAgICAgIHRvIHRoZSB1c2VyLlxuICAgICAgYCksXG4gICAgKSxcbiAgZGF0YTogelxuICAgIC5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpXG4gICAgLm5vbmVtcHR5KFwiRGF0YSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHJvd1wiKVxuICAgIC5yZWFkb25seSgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBUYWJ1bGFyIGRhdGFzZXQgdG8gY2hhcnQuIE9uZSBvYmplY3QgcGVyIHJvdywga2V5ZWQgYnkgY29sdW1uXG4gICAgICAgIG5hbWUuIFZhbHVlcyBtYXkgYmUgc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9yIG51bGwuIFRoZVxuICAgICAgICBjaGFydC1wbGFubmVyIGRlY2lkZXMgd2hpY2ggY29sdW1ucyBhcmUgY2F0ZWdvcmllcyB2cy4gbnVtZXJpY1xuICAgICAgICBzZXJpZXMuIENhcCBhdCBhIGZldyBodW5kcmVkIHJvd3MgZm9yIGxlZ2liaWxpdHk7IHNhbXBsZSAvXG4gICAgICAgIGFnZ3JlZ2F0ZSBsYXJnZXIgZGF0YXNldHMgZmlyc3QuXG4gICAgICBgKSxcbiAgICApLFxufSk7XG5cbmV4cG9ydCB0eXBlIENoYXJ0UGxhbm5lclJlcXVlc3QgPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hPjtcblxuLyoqXG4gKiBBZ2VudC1mYWNpbmcgcmVzdWx0IG9mIGVpdGhlciBjaGFydC1wcm9kdWNpbmcgdG9vbC5cbiAqXG4gKiBgbWFya2VyYCBpcyBkZWxpYmVyYXRlbHkgcmVkdW5kYW50IHdpdGggYGNoYXJ0SWRgOiB0aGUgaG9zdCBzdGlsbCBrZXlzIHRoZVxuICogY2FjaGUgYnkgaWQsIHdoaWxlIHRoZSBtb2RlbCBnZXRzIHRoZSBleGFjdCBvcGFxdWUgdG9rZW4gdG8gY29weSBpbnRvIHByb3NlXG4gKiBhbmQgaGFzIG5vIHJlYXNvbiB0byBpbnZlbnQgb3IgcmV0eXBlIGEgVVVJRC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSA9IHdpcmUuQ2hhcnRTY2hlbWEucGljayh7IGNoYXJ0SWQ6IHRydWUgfSkuZXh0ZW5kKHtcbiAgbWFya2VyOiB6XG4gICAgLnN0cmluZygpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJFeGFjdCBlbWJlZCBtYXJrZXIuIENvcHkgdGhpcyBjb21wbGV0ZSB2YWx1ZSB2ZXJiYXRpbSBvbnRvIGl0cyBvd24gbGluZTsgbmV2ZXIgY29uc3RydWN0IGEgbWFya2VyIGZyb20gY2hhcnRJZC5cIixcbiAgICApLFxufSk7XG5cbi8qKiBSZXN1bHQgcmV0dXJuZWQgc3luY2hyb25vdXNseSB3aGlsZSBjaGFydCBwbGFubmluZyBjb250aW51ZXMgaW4gdGhlIGJhY2tncm91bmQuICovXG5leHBvcnQgdHlwZSBDaGFydFRvb2xPdXRwdXQgPSB6LmluZmVyPHR5cGVvZiBjaGFydFRvb2xPdXRwdXRTY2hlbWE+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGxhbm5lciBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRm9ybWF0IHtAbGluayB3aXJlLkNoYXJ0VHlwZVNjaGVtYX0ncyB2YXJpYW50cyBhcyBhIHNpbmdsZVxuICogaHVtYW4tZnJpZW5kbHkgc3RyaW5nIG9mIGBgIGA8dmFsdWU+YCBmb3IgPGRlc2NyaXB0aW9uPiBgYFxuICogY2xhdXNlcyBqb2luZWQgYnkgc2VtaWNvbG9ucywgZHJhd24gZnJvbSBlYWNoIHZhcmlhbnQncyBvd25cbiAqIGAuZGVzY3JpYmUoKWAgc28gdGhlIHBsYW5uZXIgcHJvbXB0IHN0YXlzIGluIGxvY2stc3RlcCB3aXRoXG4gKiB0aGUgc2NoZW1hIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0Q2hhcnRUeXBlUGlja2VyKCk6IHN0cmluZyB7XG4gIHJldHVybiB3aXJlLkNoYXJ0VHlwZVNjaGVtYS5vcHRpb25zXG4gICAgLm1hcCgob3B0KSA9PiBgXFxgJHtvcHQudmFsdWV9XFxgIGZvciAke29wdC5kZXNjcmlwdGlvbiA/PyBcIlwifWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbn1cblxuLyoqXG4gKiBTeXN0ZW0gcHJvbXB0IGZvciB0aGUgaW5uZXIgY2hhcnQtcGxhbm5pbmcgYWdlbnQuIFR1bmVkIGZvciBhXG4gKiBmYXN0LXRpZXIgbW9kZWwgKEhhaWt1LCBHUFQtNS1taW5pLCBHZW1pbmkgRmxhc2ggTGl0ZSkuXG4gKi9cbmNvbnN0IENIQVJUX1BMQU5ORVJfSU5TVFJVQ1RJT05TID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICBZb3UgZGVzaWduIEFwYWNoZSBFY2hhcnRzIHZpc3VhbGl6YXRpb25zLiBUaGUgdXNlciBnaXZlcyB5b3UgYVxuICB0YWJ1bGFyIGRhdGFzZXQgKHJvd3Mgb2Ygb2JqZWN0cykgcGx1cyBhIHRpdGxlIGFuZCBhbiBvcHRpb25hbFxuICBkZXNjcmlwdGlvbiBvZiB0aGUgaW50ZW50LiBZb3UgcHJvZHVjZSBhIHNtYWxsIGNoYXJ0IHBsYW4gKGNoYXJ0XG4gIHR5cGUsIGF4aXMgbGFiZWxzLCBjYXRlZ29yaWVzLCBzZXJpZXMpIHRoYXQgYmVzdCBjb252ZXlzIHRoZSBkYXRhLlxuXG4gIERlY2lzaW9uIGd1aWRlLiBQaWNrIHRoZSBjaGFydCB0eXBlIHdob3NlIGRhdGEgc2hhcGUgbWF0Y2hlcyB0aGVcbiAgZGF0YXNldCBhbmQgdGhlIHVzZXIncyBpbnRlbnQ6ICR7Zm9ybWF0Q2hhcnRUeXBlUGlja2VyKCl9LlxuXG4gIFdoZW4gaW4gZG91YnQgYmV0d2VlbiBiYXIgYW5kIGxpbmUsIHByZWZlciBiYXIgZm9yIHVub3JkZXJlZFxuICBjYXRlZ29yaWVzIGFuZCBsaW5lIGZvciBvcmRlcmVkIG9uZXMgKGRhdGVzLCB0aW1lIGJ1Y2tldHMsIHJhbmtzKS5cbiAgUHJlZmVyIFxcYGhvcml6b250YWxCYXJcXGAgd2hlbiBjYXRlZ29yeSBsYWJlbHMgYXJlIGxvbmcuIFByZWZlclxuICBcXGBjb21ib1xcYCB3aGVuIG9uZSBtZWFzdXJlIGlzIGEgY291bnQvdm9sdW1lIGFuZCBhbm90aGVyIGlzIGFcbiAgcmF0ZS90cmVuZC4gUHJlZmVyIFxcYHdhdGVyZmFsbFxcYCBmb3IgYnJpZGdlcyBvZiBzaWduZWQgZGVsdGFzLlxuICBQcmVmZXIgXFxgc2NhdHRlclxcYCB3aGVuIGNvcnJlbGF0aW5nIHR3byBudW1lcmljIGZpZWxkcyAobm9cbiAgY2F0ZWdvcnkgYXhpcykuIFByZWZlciBcXGBoZWF0bWFwXFxgIGZvciBhIGNhdGVnb3J5IHggY2F0ZWdvcnlcbiAgbWF0cml4LiBQcmVmZXIgXFxgcmFkYXJcXGAgZm9yIHNjb3JpbmcgdGhlIHNhbWUgZW50aXRpZXMgYWNyb3NzIGFcbiAgZml4ZWQgc2V0IG9mIGRpbWVuc2lvbnMuIE5ldmVyIHBpY2sgcGllIGZvciBtb3JlIHRoYW4gNyBzbGljZXNcbiAgKHVzZSBcXGB0cmVlbWFwXFxgIGluc3RlYWQpLiBQcmVmZXIgXFxgZnVubmVsXFxgIGZvciBvcmRlcmVkIGNvbnZlcnNpb25cbiAgc3RhZ2VzLlxuXG4gIEZvciBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbDogcGljayBvbmVcbiAgY29sdW1uIGFzIHRoZSBjYXRlZ29yeSBheGlzICh1c3VhbGx5IHRoZSBvbmx5IHN0cmluZy12YWx1ZWQgY29sdW1uKVxuICBhbmQgb25lIG9yIG1vcmUgbnVtZXJpYyBjb2x1bW5zIGFzIHNlcmllcy4gU29ydCBjYXRlZ29yaWVzIGJ5IHRoZVxuICBwcmltYXJ5IHNlcmllcyB2YWx1ZSBkZXNjZW5kaW5nIHVubGVzcyB0aGUgZGF0YSBpcyBuYXR1cmFsbHkgb3JkZXJlZFxuICAoZGF0ZXMsIHJhbmtzLCBmdW5uZWwgc3RhZ2VzLCB3YXRlcmZhbGwgc3RlcHMpLiBGb3IgXFxgY29tYm9cXGAsIHNldFxuICBlYWNoIHNlcmllcycgXFxgdHlwZVxcYCB0byBcXGBiYXJcXGAsIFxcYGxpbmVcXGAsIG9yIFxcYGFyZWFcXGAsIGFuZCB1c2VcbiAgXFxgeUF4aXNJbmRleDogMVxcYCB3aGVuIGEgc2VyaWVzIG5lZWRzIGEgc2Vjb25kIHNjYWxlLlxuXG4gIEZvciB3YXRlcmZhbGwsIGVtaXQgZXhhY3RseSBPTkUgc2VyaWVzIGhvbGRpbmcgdGhlIHNpZ25lZCBzdGVwIHZhbHVlc1xuICAoZGVsdGFzKSwgb25lIHBlciBjYXRlZ29yeSwgaW4gb3JkZXIgLSBwb3NpdGl2ZSBmb3IgYSByaXNlLCBuZWdhdGl2ZVxuICBmb3IgYSBkcm9wLiBEbyBOT1QgYWRkIGEgY3VtdWxhdGl2ZSAvIHJ1bm5pbmctdG90YWwgLyBiYXNlIHNlcmllcyBhbmRcbiAgZG8gTk9UIGNvbnZlcnQgdGhlIGRlbHRhcyBpbnRvIHJ1bm5pbmcgdG90YWxzIHlvdXJzZWxmOyB0aGUgcnVubmluZ1xuICB0b3RhbCBpcyBjb21wdXRlZCBmb3IgeW91LCBhbmQgYSBoYW5kLWJ1aWx0IGJhc2Ugc2VyaWVzIHJlbmRlcnMgYXMgYVxuICBwbGFpbiBiYXIgY2hhcnQgaW5zdGVhZCBvZiBhIGJyaWRnZS5cblxuICBGb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcDogcGljayB0aGUgY2F0ZWdvcnkgY29sdW1uIGZvciBzbGljZSBuYW1lc1xuICBhbmQgb25lIG51bWVyaWMgY29sdW1uIGZvciBzbGljZSB2YWx1ZXMuIEVtaXQgYSBzaW5nbGUgc2VyaWVzIG9mXG4gIFxcYHtuYW1lLCB2YWx1ZX1cXGAgb2JqZWN0cy5cblxuICBGb3Igc2NhdHRlcjogcGljayB0d28gbnVtZXJpYyBjb2x1bW5zIGFuZCBlbWl0IFxcYFt4LCB5XVxcYCB0dXBsZXMgaW5cbiAgb25lIG9yIG1vcmUgc2VyaWVzIChvbmUgc2VyaWVzIHBlciBncm91cCBpZiBhIGdyb3VwaW5nIGNvbHVtbiBleGlzdHMpLlxuXG4gIEZvciBoZWF0bWFwOiBwaWNrIHR3byBjYXRlZ29yeSBjb2x1bW5zIGFuZCBvbmUgbnVtZXJpYyBtZWFzdXJlLiBQdXRcbiAgdGhlIHgtYXhpcyBjYXRlZ29yaWVzIGluIFxcYGNhdGVnb3JpZXNcXGAsIHRoZW4gZW1pdCBPTkUgU0VSSUVTIFBFUiBST1dcbiAgb2YgdGhlIG1hdHJpeCAtIHRoZSBzZXJpZXMgXFxgbmFtZVxcYCBpcyB0aGUgcm93IGxhYmVsIGFuZCBcXGBkYXRhXFxgIGlzXG4gIHRoZSByb3cncyBudW1iZXJzLCBvbmUgcGVyIGVudHJ5IGluIFxcYGNhdGVnb3JpZXNcXGAsIGluIHRoZSBzYW1lIG9yZGVyLlxuICBEbyBub3QgY29tcHV0ZSBjZWxsIGluZGljZXMuXG5cbiAgRm9yIHJhZGFyOiBcXGBjYXRlZ29yaWVzXFxgIGFyZSB0aGUgaW5kaWNhdG9yIG5hbWVzOyBlYWNoIHNlcmllcyBpcyBhblxuICBhcnJheSBvZiBudW1iZXJzIChvbmUgdmFsdWUgcGVyIGluZGljYXRvcikuXG5cbiAgRm9yIGFueXRoaW5nIHRoZSB0eXBlcyBhYm92ZSBjYW5ub3QgZXhwcmVzcyAtIGEgc2Fua2V5LCBib3hwbG90LFxuICBjYW5kbGVzdGljaywgc3VuYnVyc3QsIGdhdWdlLCBuZXR3b3JrIGdyYXBoLCBjYWxlbmRhciwgcGFyYWxsZWwtXG4gIGNvb3JkaW5hdGVzIHBsb3QsIG9yIGFueSBvdGhlciBFY2hhcnRzIHNlcmllcyAtIHVzZSBcXGBjdXN0b21cXGAgYW5kXG4gIGhhbmQtd3JpdGUgdGhlIHdob2xlIEVjaGFydHMgb3B0aW9uIGludG8gXFxgb3B0aW9uXFxgIGFzIGEgSlNPTiBzdHJpbmcuXG4gIEluY2x1ZGUgZXZlcnkgcGFydCB0aGF0IGNoYXJ0IG5lZWRzOiB0aGUgc2VyaWVzIHdpdGggdGhlaXIgb3duXG4gIFxcYHR5cGVcXGAgYW5kIGRhdGEgc2hhcGUsIHBsdXMgYW55IGNvb3JkaW5hdGUgc3lzdGVtLCBcXGB2aXN1YWxNYXBcXGAsXG4gIG9yIGF4ZXMuIExlYXZlIFxcYHNlcmllc1xcYCwgXFxgY2F0ZWdvcmllc1xcYCwgYW5kIHRoZSBheGlzIGxhYmVscyBvdXQ7XG4gIHRoZXkgYXJlIGlnbm9yZWQgZm9yIFxcYGN1c3RvbVxcYC4gUHJlZmVyIGEgbGlzdGVkIHR5cGUgd2hlbmV2ZXIgb25lXG4gIGdlbnVpbmVseSBmaXRzIC0gXFxgY3VzdG9tXFxgIGdpdmVzIHVwIHRoZSBzaGFyZWQgdG9vbHRpcCwgbGVnZW5kLCBhbmRcbiAgZ3JpZCBkZWZhdWx0cywgc28gaXQgaXMgdGhlIGFuc3dlciBmb3IgYW4gdW5zdXBwb3J0ZWQgY2hhcnQgc2hhcGUsXG4gIG5vdCBhIHdheSB0byByZXN0eWxlIGEgc3VwcG9ydGVkIG9uZS5cblxuICBLZWVwIHNlcmllcyBuYW1lcyBodW1hbi1yZWFkYWJsZSAodXNlIHRoZSBjb2x1bW4gbmFtZTsgdGl0bGUgY2FzZSBpdFxuICBsaWdodGx5IGlmIG5lZWRlZCkuIEtlZXAgdGl0bGVzIGNvbmNpc2U7IGRvIG5vdCByZXBlYXQgdGhlIHVzZXInc1xuICB0aXRsZSBpbiB4QXhpc0xhYmVsIC8geUF4aXNMYWJlbC5cbmApO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwbGFubmVyIGFnZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHBsYW5uZXIgYEFnZW50YCBwZXIgcGx1Z2luIGNvbmZpZy4gQ2FjaGVkIG9uIGNvbmZpZyBvYmplY3RcbiAqIGlkZW50aXR5IHNvIGNhbGxlcnMgY2FuIGBwcmVwYXJlQ2hhcnQoeyBjb25maWcsIC4uLiB9KWAgZnJvbSBhXG4gKiBob3QgcGF0aCB3aXRob3V0IHBheWluZyB0aGUgQWdlbnQtY29uc3RydWN0b3IgY29zdCBldmVyeSBjYWxsLlxuICogYFdlYWtNYXBgIGxldHMgcmV0aXJlZCBjb25maWdzIChlLmcuIHRlc3QgcmVjb25maWd1cmF0aW9ucylcbiAqIHJlbGVhc2UgdGhlaXIgYWdlbnQgd2l0aG91dCBtYW51YWwgZXZpY3Rpb24uXG4gKi9cbmNvbnN0IHBsYW5uZXJBZ2VudHMgPSBuZXcgV2Vha01hcDxNYXN0cmFQbHVnaW5Db25maWcsIEFnZW50PigpO1xuXG5mdW5jdGlvbiBnZXRQbGFubmVyQWdlbnQoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBBZ2VudCB7XG4gIGxldCBhZ2VudCA9IHBsYW5uZXJBZ2VudHMuZ2V0KGNvbmZpZyk7XG4gIGlmICghYWdlbnQpIHtcbiAgICBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICBpZDogXCJjaGFydF9wbGFubmVyXCIsXG4gICAgICBuYW1lOiBcIkNoYXJ0IFBsYW5uZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlBpY2tzIGNoYXJ0IHR5cGUgYW5kIGF4aXMgZW5jb2RpbmdzIGZvciBhIGRhdGFzZXQuXCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IENIQVJUX1BMQU5ORVJfSU5TVFJVQ1RJT05TLFxuICAgICAgbW9kZWw6ICh7IHJlcXVlc3RDb250ZXh0IH0pID0+XG4gICAgICAgIGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCwgeyBtb2RlbENsYXNzOiBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0IH0pLFxuICAgIH0pO1xuICAgIHBsYW5uZXJBZ2VudHMuc2V0KGNvbmZpZywgYWdlbnQpO1xuICB9XG4gIHJldHVybiBhZ2VudDtcbn1cblxuLyoqXG4gKiBSdW4gdGhlIHBsYW5uZXIgYWdhaW5zdCBgcmVxdWVzdGAgYW5kIHJldHVybiB0aGUgcmVzb2x2ZWRcbiAqIEVjaGFydHMgc3BlYy4gVGhyb3dzIG9uIHBsYW5uZXIgZmFpbHVyZSAtIHtAbGluayBwcmVwYXJlQ2hhcnR9XG4gKiBjYXRjaGVzIGFuZCBzdGFzaGVzIHRoZSBlcnJvciBpbiB0aGUgY2FjaGUgZW50cnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkNoYXJ0UGxhbm5lcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHJlcXVlc3Q6IENoYXJ0UGxhbm5lclJlcXVlc3QsXG4gIG9wdGlvbnM6IHsgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDsgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCB9ID0ge30sXG4pOiBQcm9taXNlPENoYXJ0UmVzdWx0PiB7XG4gIGNvbnN0IHsgdGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhIH0gPSByZXF1ZXN0O1xuICBjb25zdCB7IHJlcXVlc3RDb250ZXh0LCBhYm9ydFNpZ25hbCB9ID0gb3B0aW9ucztcbiAgY29uc3QgcHJvbXB0ID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oe1xuICAgIFRpdGxlOiB0aXRsZSxcbiAgICAuLi4oZGVzY3JpcHRpb24gPyB7IERlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgIFwiRGF0YXNldCAoSlNPTiwgb25lIHJvdyBwZXIgb2JqZWN0KVwiOiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSxcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFBsYW5uZXJBZ2VudChjb25maWcpLmdlbmVyYXRlKHByb21wdCwge1xuICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHsgc2NoZW1hOiBjaGFydFBsYW5TY2hlbWEgfSxcbiAgICAuLi4ocmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgLi4uKGFib3J0U2lnbmFsID8geyBhYm9ydFNpZ25hbCB9IDoge30pLFxuICB9KTtcbiAgY29uc3QgcGxhbiA9IGNoYXJ0UGxhblNjaGVtYS5wYXJzZShyZXN1bHQub2JqZWN0KTtcbiAgY29uc3Qgb3B0aW9uID0gcGxhblRvRWNoYXJ0c09wdGlvbihwbGFuLCB0aXRsZSwgY29uZmlnLmJyYW5kKTtcbiAgcmV0dXJuIHsgY2hhcnRUeXBlOiBwbGFuLmNoYXJ0VHlwZSwgb3B0aW9uIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjYWNoZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBjYW5vbmljYWwgY2FjaGUga2V5IGZvciBhIGBjaGFydElkYCBvd25lZCBieSBgdXNlcktleWAuXG4gKlxuICogVGhlIGlkZW50aXR5IGlzIHBhcnQgb2YgdGhlIGtleSwgbm90IGEgZmlsdGVyIGFwcGxpZWQgYWZ0ZXIgdGhlIHJlYWQsIHNvIGFcbiAqIGNoYXJ0IGlkIGd1ZXNzZWQgb3IgY29waWVkIGZyb20gYW5vdGhlciB1c2VyJ3MgdHJhbnNjcmlwdCByZXNvbHZlcyB0byBhXG4gKiBkaWZmZXJlbnQga2V5IGFuZCBzaW1wbHkgbWlzc2VzLiBUaGF0IG1pc3MgaXMgd2hhdCB0aGUgSFRUUCByb3V0ZSB0dXJucyBpbnRvXG4gKiBhIDQwNCwgd2hpY2ggaXMgYWxzbyB0aGUgYW5zd2VyIHRoYXQgbGVha3MgdGhlIGxlYXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGFydENhY2hlS2V5KGNoYXJ0SWQ6IHN0cmluZywgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIChhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKSkuZ2VuZXJhdGVLZXkoW0NIQVJUX0NBQ0hFX05BTUVTUEFDRSwgY2hhcnRJZF0sIHVzZXJLZXkpO1xufVxuXG4vKipcbiAqIFBlcnNpc3QgYSB7QGxpbmsgQ2hhcnR9IGVudHJ5IHVuZGVyIGl0cyBgY2hhcnRJZGAsIG93bmVkIGJ5IGB1c2VyS2V5YC5cbiAqIFJlZnJlc2hlcyB0aGUgVFRMIG9uIGV2ZXJ5IHdyaXRlLiBDYWNoZS1sYXllciBmYWlsdXJlcyBhcmUgbG9nZ2VkIGFuZFxuICogc3dhbGxvd2VkIHNvIGJhY2tncm91bmQgcnVubmVycyBuZXZlciB0aHJvdyBpbnRvIHRoZVxuICogdW5oYW5kbGVkLXJlamVjdGlvbiBzdHJlYW0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2hhcnQoZW50cnk6IENoYXJ0LCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjaGFydENhY2hlS2V5KGVudHJ5LmNoYXJ0SWQsIHVzZXJLZXkpO1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5zZXQoa2V5LCBlbnRyeSwge1xuICAgICAgdHRsOiBDSEFSVF9DQUNIRV9UVExfU0VDLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcIndyaXRlLWVycm9yXCIsIHtcbiAgICAgIGNoYXJ0SWQ6IGVudHJ5LmNoYXJ0SWQsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29rIHVwIGEgY2hhcnQgYHVzZXJLZXlgIG93bnMuIFJldHVybnMgYHVuZGVmaW5lZGAgb24gbWlzcywgb25cbiAqIGV4cGlyeSwgd2hlbiBhbm90aGVyIGlkZW50aXR5IG93bnMgdGhlIGlkLCBvciB3aGVuIHRoZSBjYWNoZSBsYXllciBpc1xuICogdW5oZWFsdGh5IC0gbmV2ZXIgdGhyb3dzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkQ2hhcnQoY2hhcnRJZDogc3RyaW5nLCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPENoYXJ0IHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2hhcnRDYWNoZUtleShjaGFydElkLCB1c2VyS2V5KTtcbiAgICBjb25zdCB2ID0gYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldDxDaGFydD4oa2V5KTtcbiAgICByZXR1cm4gdiA/PyB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwicmVhZC1lcnJvclwiLCB7XG4gICAgICBjaGFydElkLFxuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByZXBhcmVDaGFydCBvcmNoZXN0cmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBJbnB1dHMgdG8ge0BsaW5rIHByZXBhcmVDaGFydH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXBhcmVDaGFydE9wdGlvbnMge1xuICAvKiogUGx1Z2luIGNvbmZpZzsgcmVzb2x2ZXMgdGhlIHBsYW5uZXIgYWdlbnQncyBtb2RlbC4gKi9cbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG4gIC8qKlxuICAgKiBJZGVudGl0eSB0aGF0IG93bnMgdGhlIG1pbnRlZCBjaGFydC4gT25seSBhIHtAbGluayBmZXRjaENoYXJ0fSBjYWxsXG4gICAqIGNhcnJ5aW5nIHRoZSBzYW1lIGtleSByZXNvbHZlcyBpdC4gVXNlIHtAbGluayByZXNvbHZlVXNlcktleX0uXG4gICAqL1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IHRpdGxlIGZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudC4gKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBpbnRlbnQgaGludCBmb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHJvd3MgdG8gY2hhcnQuIENhbGxlZCBvbmNlLCBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICogQW55IHRocm93biBlcnJvciBsYW5kcyBpbiB0aGUgY2FjaGUgYXMgdGhlIGVudHJ5J3MgYGVycm9yYFxuICAgKiBmaWVsZCAobmV2ZXIgcHJvcGFnYXRlZCB0byB0aGUgY2FsbGVyIG9mIHtAbGluayBwcmVwYXJlQ2hhcnR9KS5cbiAgICogQW4gZW1wdHkgYHJvd3NgIGFycmF5IGlzIHJlamVjdGVkIGFzIGBcImRhdGFzZXQgaGFzIG5vIHJvd3M7XG4gICAqIG5vdGhpbmcgdG8gY2hhcnRcImAuXG4gICAqL1xuICByZXNvbHZlRGF0YTogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPHsgcm93czogUmVhZG9ubHlBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfT47XG4gIC8qKlxuICAgKiBQZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgLiBGb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQgc29cbiAgICogdXNlci1zY29wZWQgbW9kZWwgcmVzb2x1dGlvbiAoT0JPKSBzdGF5cyBpbiBlZmZlY3QuXG4gICAqL1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xuICAvKipcbiAgICogQ29vcGVyYXRpdmUgY2FuY2VsbGF0aW9uLiBGb3J3YXJkZWQgdG8gYHJlc29sdmVEYXRhYCBhbmQgdGhlXG4gICAqIHBsYW5uZXIgYWdlbnQuIE5vdGU6IHRoZSBjaGFydCB0YXNrIGNvbnRpbnVlcyBydW5uaW5nIGluIHRoZVxuICAgKiBiYWNrZ3JvdW5kIGFmdGVyIHRoZSBwYXJlbnQgcmVxdWVzdCBlbmRzLCBzbyBleHRlcm5hbCBhYm9ydFxuICAgKiBzaWduYWxzIGFyZSBiZXN0LWVmZm9ydDsgdHlwaWNhbCB1c2UgaXMgdG8gbGVhdmUgdGhpcyB1bnNldFxuICAgKiBhbmQgbGV0IHRoZSAxaCBUVEwgY2FwIHN0YWxlIGVudHJpZXMuXG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBNaW50IGEgYGNoYXJ0SWRgLCBjYWNoZSBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHBsYWNlaG9sZGVyXG4gKiBzeW5jaHJvbm91c2x5LCBhbmQga2ljayBvZmYgYSBiYWNrZ3JvdW5kIHRhc2sgdGhhdCByZXNvbHZlcyB0aGVcbiAqIGRhdGFzZXQgYW5kIHJ1bnMgdGhlIHBsYW5uZXIuIFJldHVybnMgdGhlIGBjaGFydElkYCBvbmNlIHRoZVxuICogcGxhY2Vob2xkZXIgbGFuZHMgc28gdGhlIGZpcnN0IHtAbGluayBmZXRjaENoYXJ0fSBjYWxsIGFsd2F5c1xuICogc2VlcyBhbiBlbnRyeSAobm8gc3B1cmlvdXMgNDA0IHJhY2UpLlxuICpcbiAqIFRoZSBiYWNrZ3JvdW5kIHRhc2sgc3dhbGxvd3MgaXRzIG93biBmYWlsdXJlcyBhbmQgd3JpdGVzIHRoZW1cbiAqIGFzIGBlcnJvcmAgZW50cmllcywgc28gY2FsbGVycyBuZXZlciBzZWUgYSByZWplY3RlZCBwcm9taXNlLlxuICogQ2FjaGUgc3RhdGUgbWFjaGluZTpcbiAqXG4gKiAgIC0ganVzdCBhZnRlciB0aGlzIGNhbGwgcmV0dXJuczogYHsgY2hhcnRJZCB9YCAocHJvY2Vzc2luZylcbiAqICAgLSBvbiBwbGFubmVyIHN1Y2Nlc3M6ICAgICAgICAgICBgeyBjaGFydElkLCByZXN1bHQgfWBcbiAqICAgLSBvbiBkYXRhIC8gcGxhbm5lciBmYWlsdXJlOiAgICBgeyBjaGFydElkLCBlcnJvciB9YFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNoYXJ0KG9wdHM6IFByZXBhcmVDaGFydE9wdGlvbnMpOiBQcm9taXNlPENoYXJ0VG9vbE91dHB1dD4ge1xuICBjb25zdCBjaGFydElkID0gaGFzaC5pZCgpO1xuICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCB9LCBvcHRzLnVzZXJLZXkpO1xuICBsb2dnZXIuZGVidWcoXCJxdWV1ZWRcIiwgeyBjaGFydElkIH0pO1xuICAvLyBGaXJlLWFuZC1mb3JnZXQuIEZhaWx1cmVzIGxhbmQgaW4gdGhlIGNhY2hlIGFzIGBlcnJvcmAgZW50cmllcztcbiAgLy8gbmV2ZXIgZXNjYXBlIGludG8gYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgdm9pZCBydW5QcmVwYXJlQ2hhcnQoY2hhcnRJZCwgb3B0cyk7XG4gIHJldHVybiB7IGNoYXJ0SWQsIG1hcmtlcjogbWFya2VyLmZvcm1hdE1hcmtlcihcImNoYXJ0XCIsIGNoYXJ0SWQpIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByZXBhcmVDaGFydChjaGFydElkOiBzdHJpbmcsIG9wdHM6IFByZXBhcmVDaGFydE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgb3B0cy5yZXNvbHZlRGF0YShvcHRzLnNpZ25hbCk7XG4gICAgaWYgKGRhdGEucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIkRhdGFzZXQgaGFzIG5vIHJvd3M7IG5vdGhpbmcgdG8gY2hhcnRcIik7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkNoYXJ0UGxhbm5lcihcbiAgICAgIG9wdHMuY29uZmlnLFxuICAgICAge1xuICAgICAgICB0aXRsZTogb3B0cy50aXRsZSA/PyBcIkNoYXJ0XCIsXG4gICAgICAgIC4uLihvcHRzLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogb3B0cy5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICBkYXRhOiBkYXRhLnJvd3MgYXMgQ2hhcnRQbGFubmVyUmVxdWVzdFtcImRhdGFcIl0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAuLi4ob3B0cy5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IG9wdHMucmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMuc2lnbmFsID8geyBhYm9ydFNpZ25hbDogb3B0cy5zaWduYWwgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCwgcmVzdWx0IH0sIG9wdHMudXNlcktleSk7XG4gICAgbG9nZ2VyLmluZm8oXCJkb25lXCIsIHtcbiAgICAgIGNoYXJ0SWQsXG4gICAgICBjaGFydFR5cGU6IHJlc3VsdC5jaGFydFR5cGUsXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZXJyb3JcIiwgeyBjaGFydElkLCBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgLy8gVGhlIGVudHJ5J3MgYGVycm9yYCBpcyByZW5kZXJlZCBpbiB0aGUgY2hhdCwgc28gb25seSBhbiBBcHBLaXRFcnJvcidzXG4gICAgLy8gb3duIG1lc3NhZ2UgdHJhdmVsczsgYW55dGhpbmcgZWxzZSBjb3VsZCBjYXJyeSB1cHN0cmVhbSBwcm92aWRlciBkZXRhaWwuXG4gICAgY29uc3QgZXJyVGV4dCA9IGVyciBpbnN0YW5jZW9mIEFwcEtpdEVycm9yID8gZXJyLm1lc3NhZ2UgOiBDSEFSVF9GQUlMRURfTUVTU0FHRTtcbiAgICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCwgZXJyb3I6IGVyclRleHQgfSwgb3B0cy51c2VyS2V5KTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxvbmctcG9sbCBmZXRjaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBJbnB1dHMgdG8ge0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBGZXRjaENoYXJ0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZGVudGl0eSB0aGUgY2hhcnQgbXVzdCBiZWxvbmcgdG8uIEEgY2hhcnQgbWludGVkIHVuZGVyIGEgZGlmZmVyZW50IGtleVxuICAgKiBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIHVua25vd24gaWQuIFVzZSB7QGxpbmsgcmVzb2x2ZVVzZXJLZXl9LlxuICAgKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKipcbiAgICogU2VydmVyLXNpZGUgcG9sbGluZyBidWRnZXQgaW4gbXMuIFdoZW4gdGhlIGVudHJ5IHN0YXlzIGluXG4gICAqIHRoZSBwcm9jZXNzaW5nIHN0YXRlIHBhc3QgdGhpcyB3aW5kb3csIHRoZSBoZWxwZXIgcmV0dXJucyB0aGVcbiAgICogbGFzdCBzZWVuIHZhbHVlIChzdGlsbCBwcm9jZXNzaW5nKSBzbyB0aGUgY2xpZW50IGNhbiByZS1wb2xsLlxuICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9GRVRDSF9USU1FT1VUX01TfSAoNjBzKS5cbiAgICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBvbGwgaW50ZXJ2YWwgaW4gbXMuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBERUZBVUxUX0ZFVENIX0lOVEVSVkFMX01TfSAoMjUwbXMpLlxuICAgKi9cbiAgaW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbiBoYW5kbGUgKGUuZy4gcmVxdWVzdCBgcmVxLnNpZ25hbGApLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBMb25nLXBvbGwgdGhlIGNoYXJ0IGNhY2hlIHVudGlsIHRoZSBlbnRyeSBzZXR0bGVzIChgcmVzdWx0YCBvclxuICogYGVycm9yYCBzZXQpLCB0aGUgZW50cnkgaXMgbWlzc2luZywgb3IgdGhlIHNlcnZlci1zaWRlIHRpbWVvdXRcbiAqIGVsYXBzZXMuXG4gKlxuICogUmV0dXJuczpcbiAqICAgLSB0aGUgcmVzb2x2ZWQge0BsaW5rIENoYXJ0fSB3aGVuIGl0IHNldHRsZWQsIGVycm9yZWQsIG9yXG4gKiAgICAgc3RheWVkIGluIHByb2Nlc3NpbmcgcGFzdCBgdGltZW91dE1zYCAoc28gdGhlIGNsaWVudCBjYW5cbiAqICAgICByZS1wb2xsKTtcbiAqICAgLSBgdW5kZWZpbmVkYCB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCBleHBpcmVkLCBvciBvd25lZCBieVxuICogICAgIGFub3RoZXIgaWRlbnRpdHkgKHRoZSBjb25zdW1lciBzaG91bGQgdHJlYXQgYXMgNDA0KS5cbiAqXG4gKiBgc2lnbmFsYCBsZXRzIHRoZSBjYWxsZXIgY2FuY2VsIGFoZWFkIG9mIHRpbWVvdXQgKGUuZy4gdGhlIEhUVFBcbiAqIHJlcXVlc3QgY2xvc2VkKS4gQ2FuY2VsbGF0aW9uIHByb3BhZ2F0ZXMgdG8gdGhlIGludGVyLXBvbGwgc2xlZXBcbiAqIHNvIHRoZSBoZWxwZXIgcmV0dXJucyBpbW1lZGlhdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2hhcnQoXG4gIGNoYXJ0SWQ6IHN0cmluZyxcbiAgb3B0aW9uczogRmV0Y2hDaGFydE9wdGlvbnMsXG4pOiBQcm9taXNlPENoYXJ0IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHRpbWVvdXRNcyA9IG9wdGlvbnMudGltZW91dE1zID8/IERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NUztcbiAgY29uc3QgaW50ZXJ2YWxNcyA9IG9wdGlvbnMuaW50ZXJ2YWxNcyA/PyBERUZBVUxUX0ZFVENIX0lOVEVSVkFMX01TO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG5cbiAgbGV0IGxhc3Q6IENoYXJ0IHwgdW5kZWZpbmVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIG9wdGlvbnMuc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGxhc3QgPSBhd2FpdCByZWFkQ2hhcnQoY2hhcnRJZCwgb3B0aW9ucy51c2VyS2V5KTtcbiAgICBpZiAoIWxhc3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKGxhc3QucmVzdWx0ICE9PSB1bmRlZmluZWQgfHwgbGFzdC5lcnJvciAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbGFzdDtcbiAgICBjb25zdCByZW1haW5pbmcgPSBkZWFkbGluZSAtIERhdGUubm93KCk7XG4gICAgaWYgKHJlbWFpbmluZyA8PSAwKSByZXR1cm4gbGFzdDtcbiAgICBhd2FpdCBhc3luYy5zbGVlcChNYXRoLm1pbihpbnRlcnZhbE1zLCByZW1haW5pbmcpLCBvcHRpb25zLnNpZ25hbCk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZWNoYXJ0cyB0aGVtZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRoZSBzbGljZSBvZiBhbiBFY2hhcnRzIG9wdGlvbiB0aGF0IGNhcnJpZXMgYnJhbmQgaWRlbnRpdHk6IHRoZSBzZXJpZXNcbiAqIGNvbG9yIGN5Y2xlIGFuZCB0aGUgYmFzZSBmb250IHN0YWNrLiBEZXJpdmVkIGZyb20gYSB7QGxpbmsgQnJhbmRDb250ZXh0fVxuICogYnkge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0gYW5kIG1lcmdlZCBpbnRvIGV2ZXJ5IHNwZWMgYnlcbiAqIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgY2FycmllcyBubyB0ZXh0IENPTE9SLiBBIHNwZWMgaXMgcGxhbm5lZCBoZXJlLCBvbiB0aGVcbiAqIHNlcnZlciwgYW5kIHJlYWQgbGF0ZXIgaW4gYSBicm93c2VyIHdob3NlIGxpZ2h0L2RhcmsgdGhlbWUgdGhpcyBjb2RlXG4gKiBjYW5ub3Qga25vdzsgYmFraW5nIGluIHRoZSBicmFuZCdzIHNpbmdsZSAobGlnaHQpIGZvcmVncm91bmQgcHJvZHVjZWRcbiAqIG5lYXItYmxhY2sgbGFiZWxzIHRoYXQgZGlzYXBwZWFyZWQgYWdhaW5zdCBhIGRhcmsgY2hhdCBzdXJmYWNlLiBUaGVcbiAqIHJlbmRlcmVyIHJlc29sdmVzIGNocm9tZSBjb2xvcnMgZnJvbSBBcHBLaXQncyBsaXZlIENTUyB0b2tlbnMgaW5zdGVhZFxuICogKGBAZGJ4LXRvb2xzL3VpLW1hc3RyYWAncyBgY2hhcnQtdGhlbWVgICsgYG5vcm1hbGl6ZUNoYXJ0T3B0aW9uYCksXG4gKiBsZWF2aW5nIHRoaXMgdGhlbWUgdGhlIHBhcnRzIHRoYXQgcmVhZCB0aGUgc2FtZSBpbiBlaXRoZXIgbW9kZS5cbiAqL1xuaW50ZXJmYWNlIENoYXJ0VGhlbWUge1xuICBjb2xvcjogc3RyaW5nW107XG4gIHRleHRTdHlsZTogeyBmb250RmFtaWx5OiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBBcHBLaXQncyBjYXRlZ29yaWNhbCBjaGFydCBwYWxldHRlIChgLS1jaGFydC1jYXQtMWAgLi4gYC0tY2hhcnQtY2F0LThgIGZyb21cbiAqIGBAZGF0YWJyaWNrcy9hcHBraXQtdWlgKSwgYXMgaGV4LiBTZXJ2ZXItcmVuZGVyZWQgY2hhcnQgc3BlY3MgY2Fubm90IHJlYWQgdGhlXG4gKiBicm93c2VyJ3MgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBzbyB0aGUgdmFsdWVzIGFyZSBtaXJyb3JlZCBoZXJlIHRvIGtlZXAgYVxuICogZ2VuZXJhdGVkIGNoYXJ0IHZpc3VhbGx5IGNvbnNpc3RlbnQgd2l0aCB0aGUgQXBwS2l0LXN0eWxlZCBVSSBhcm91bmQgaXQuXG4gKiBLZWVwIGluIHN5bmMgd2l0aCBBcHBLaXQncyBzdHlsZXNoZWV0IGlmIGl0IGNoYW5nZXMuXG4gKi9cbmNvbnN0IEFQUEtJVF9DSEFSVF9QQUxFVFRFID0gW1xuICBcIiMyNDYzRUJcIiwgLy8gYmx1ZVxuICBcIiMyRUI4OEFcIiwgLy8gdGVhbFxuICBcIiNBQjQ3QkRcIiwgLy8gcHVycGxlXG4gIFwiI0Y2OUUyM1wiLCAvLyBhbWJlclxuICBcIiNERDJDNERcIiwgLy8gcm9zZVxuICBcIiMxQkEzQkJcIiwgLy8gY3lhblxuICBcIiM5QjYxRDFcIiwgLy8gbGF2ZW5kZXJcbiAgXCIjMzRCMjYyXCIsIC8vIGVtZXJhbGRcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRXhwYW5kIHR3byBicmFuZCBoZXggY29sb3JzIGludG8gYSBsZWdpYmxlIGNhdGVnb3JpY2FsIGN5Y2xlLiBFY2hhcnRzXG4gKiByZXBlYXRzIHRoZSBgY29sb3JgIGFycmF5IGFjcm9zcyBzZXJpZXMgLyBjYXRlZ29yaWVzLCBzbyBhIGdvb2QgZGVmYXVsdFxuICogbmVlZHMgc2V2ZXJhbCBkaXN0aW5jdCBodWVzLCBub3QgdHdvLiBXZSBzZWVkIHdpdGggdGhlIGJyYW5kIHByaW1hcnkgYW5kXG4gKiBhY2NlbnQgKHRoZSBpZGVudGl0eSBjb2xvcnMpIGFuZCBmb2xsb3cgd2l0aCBBcHBLaXQncyBvd24gY2F0ZWdvcmljYWwgY2hhcnRcbiAqIHBhbGV0dGUsIHNvIG11bHRpLXNlcmllcyAvIG1hbnktc2xpY2UgY2hhcnRzIHN0YXkgcmVhZGFibGUgYW5kIG1hdGNoIHRoZVxuICogc3Vycm91bmRpbmcgQXBwS2l0IFVJIHdoaWxlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIG1hcmtzIGxhbmQgb24tYnJhbmQuXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ29sb3JDeWNsZShwcmltYXJ5OiBzdHJpbmcsIGFjY2VudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBzcHJlYWQgPSBBUFBLSVRfQ0hBUlRfUEFMRVRURTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZXR1cm4gW3ByaW1hcnksIGFjY2VudCwgLi4uc3ByZWFkXS5maWx0ZXIoKGMpID0+IHtcbiAgICBjb25zdCBrZXkgPSBjLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHNlZW4uaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICBzZWVuLmFkZChrZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYW4gRWNoYXJ0cyB7QGxpbmsgQ2hhcnRUaGVtZX0gZnJvbSBhIGJyYW5kIGNvbnRleHQ6IHRoZSBwcmltYXJ5ICtcbiAqIGFjY2VudCBjb2xvcnMgc2VlZCB0aGUgc2VyaWVzIGN5Y2xlIGFuZCB0aGUgc2FucyBzdGFjayBiZWNvbWVzIHRoZSBiYXNlXG4gKiBmb250LiBUZXh0IGNvbG9ycyBhcmUgdGhlIHJlbmRlcmVyJ3Mgam9iIC0gc2VlIHtAbGluayBDaGFydFRoZW1lfS5cbiAqL1xuZnVuY3Rpb24gYnJhbmRDaGFydFRoZW1lKGJyYW5kOiBCcmFuZENvbnRleHQpOiBDaGFydFRoZW1lIHtcbiAgcmV0dXJuIHtcbiAgICBjb2xvcjogYnJhbmRDb2xvckN5Y2xlKGJyYW5kLmNvbG9ycy5wcmltYXJ5LCBicmFuZC5jb2xvcnMuYWNjZW50KSxcbiAgICB0ZXh0U3R5bGU6IHsgZm9udEZhbWlseTogYnJhbmQudHlwb2dyYXBoeS5zYW5zIH0sXG4gIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgZXhwYW5zaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbnR5cGUgTmFtZWRTbGljZSA9IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH07XG50eXBlIFNjYXR0ZXJQb2ludCA9IFtudW1iZXIsIG51bWJlcl07XG50eXBlIEhlYXRtYXBDZWxsID0gW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogS2VlcCBvbmx5IGB7bmFtZSwgdmFsdWV9YCBzbGljZXM7IGRyb3AgbnVsbHMgLyBiYXJlIG51bWJlcnMgLyB0dXBsZXMuICovXG5mdW5jdGlvbiBuYW1lZFNsaWNlcyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBOYW1lZFNsaWNlW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoXG4gICAgKGQpOiBkIGlzIE5hbWVkU2xpY2UgPT4gZCAhPT0gbnVsbCAmJiB0eXBlb2YgZCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShkKSxcbiAgKTtcbn1cblxuLyoqIEtlZXAgb25seSBmaW5pdGUgbnVtYmVycyAoY2F0ZWdvcnkgLyByYWRhciAvIHdhdGVyZmFsbCBzZXJpZXMpLiAqL1xuZnVuY3Rpb24gbnVtZXJpY1BvaW50cyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBudW1iZXJbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcigoZCk6IGQgaXMgbnVtYmVyID0+IHR5cGVvZiBkID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZShkKSk7XG59XG5cbi8qKiBLZWVwIG9ubHkgYFt4LCB5XWAgc2NhdHRlciB0dXBsZXMuICovXG5mdW5jdGlvbiBzY2F0dGVyUG9pbnRzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IFNjYXR0ZXJQb2ludFtdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKFxuICAgIChkKTogZCBpcyBTY2F0dGVyUG9pbnQgPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMixcbiAgKSBhcyBTY2F0dGVyUG9pbnRbXTtcbn1cblxuLyoqIEtlZXAgb25seSBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gIGhlYXRtYXAgY2VsbHMuICovXG5mdW5jdGlvbiBoZWF0bWFwQ2VsbHMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogSGVhdG1hcENlbGxbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcigoZCk6IGQgaXMgSGVhdG1hcENlbGwgPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMykgYXMgSGVhdG1hcENlbGxbXTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgaGVhdG1hcCdzIGNlbGxzIGFuZCByb3cgbGFiZWxzIGZyb20gZWl0aGVyIHNoYXBlIHRoZVxuICogcGxhbm5lciBtYXkgcHJvZHVjZS5cbiAqXG4gKiBUaGUgZG9jdW1lbnRlZCBzaGFwZSBpcyBPTkUgc2VyaWVzIG9mIGBbeEluZGV4LCB5SW5kZXgsIHZhbHVlXWBcbiAqIHRyaXBsZXMsIGJ1dCBpbmRleCBhcml0aG1ldGljIGlzIGV4YWN0bHkgdGhlIGtpbmQgb2YgYm9va2tlZXBpbmcgYVxuICogZmFzdCBtb2RlbCBnZXRzIHdyb25nLCBhbmQgdGhlIGZhaWx1cmUgaXMgc2lsZW50IChldmVyeSBjZWxsIGlzXG4gKiBkcm9wcGVkIGFuZCB0aGUgZ3JpZCByZW5kZXJzIGVtcHR5KS4gU28gdGhlIHJvdy1wZXItc2VyaWVzIHNoYXBlIGl0XG4gKiBhbHJlYWR5IHByb2R1Y2VzIHJlbGlhYmx5IGZvciBiYXIgY2hhcnRzIC0gb25lIHNlcmllcyBwZXIgbWF0cml4XG4gKiByb3csIG51bWJlcnMgYWxpZ25lZCB0byBgY2F0ZWdvcmllc2AgLSBpcyBhY2NlcHRlZCB0b28gYW5kIHR1cm5lZFxuICogaW50byB0cmlwbGVzIGhlcmUuXG4gKlxuICogUm93IG9yZGVyIHJlYWRzIHRvcC10by1ib3R0b206IEVjaGFydHMnIGNhdGVnb3J5IHktYXhpcyBjb3VudHMgaW5kZXhcbiAqIDAgZnJvbSB0aGUgQk9UVE9NLCBzbyBhIHJvdy1kZXJpdmVkIG1hdHJpeCByZXZlcnNlcyBib3RoIHRoZSBheGlzXG4gKiBsYWJlbHMgYW5kIHRoZSByb3cgaW5kaWNlcywgcHV0dGluZyB0aGUgZmlyc3Qgc2VyaWVzIGF0IHRoZSB0b3AgdGhlXG4gKiB3YXkgdGhlIG1vZGVsIGxpc3RlZCBpdC5cbiAqL1xuZnVuY3Rpb24gaGVhdG1hcE1hdHJpeChwbGFuOiBDaGFydFBsYW4pOiB7IGNlbGxzOiBIZWF0bWFwQ2VsbFtdOyB5Q2F0ZWdvcmllczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHRyaXBsZXMgPSBoZWF0bWFwQ2VsbHMocGxhbi5zZXJpZXNbMF0/LmRhdGEgPz8gW10pO1xuICBpZiAodHJpcGxlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHsgY2VsbHM6IHRyaXBsZXMsIHlDYXRlZ29yaWVzOiBwbGFuLnlDYXRlZ29yaWVzID8/IFtdIH07XG4gIH1cbiAgY29uc3Qgcm93cyA9IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHsgbmFtZTogcy5uYW1lLCB2YWx1ZXM6IG51bWVyaWNQb2ludHMocy5kYXRhKSB9KSk7XG4gIGNvbnN0IGxhYmVscyA9IHBsYW4ueUNhdGVnb3JpZXMgPz8gcm93cy5tYXAoKHIpID0+IHIubmFtZSk7XG4gIGNvbnN0IGxhc3RSb3cgPSByb3dzLmxlbmd0aCAtIDE7XG4gIHJldHVybiB7XG4gICAgY2VsbHM6IHJvd3MuZmxhdE1hcCgocm93LCByb3dJbmRleCkgPT5cbiAgICAgIHJvdy52YWx1ZXMubWFwKCh2YWx1ZSwgY29sdW1uSW5kZXgpOiBIZWF0bWFwQ2VsbCA9PiBbY29sdW1uSW5kZXgsIGxhc3RSb3cgLSByb3dJbmRleCwgdmFsdWVdKSxcbiAgICApLFxuICAgIHlDYXRlZ29yaWVzOiBbLi4ubGFiZWxzXS5yZXZlcnNlKCksXG4gIH07XG59XG5cbi8qKiBTZXF1ZW50aWFsIGxpZ2h0LXRvLWJyYW5kIHJhbXAgZm9yIGhlYXRtYXAgaW50ZW5zaXR5LiAqL1xuY29uc3QgSEVBVE1BUF9SQU1QID0gW1wiI0VBRjFGRVwiLCBcIiM5Q0JERjdcIiwgXCIjNEM4NkVFXCIsIFwiIzI0NjNFQlwiLCBcIiMxNDM4N0ZcIl07XG5cbi8qKiBBYm92ZSB0aGlzIG1hbnkgY2VsbHMsIHByaW50ZWQgdmFsdWVzIG92ZXJsYXAgYW5kIGFyZSBzdXBwcmVzc2VkLiAqL1xuY29uc3QgSEVBVE1BUF9MQUJFTF9NQVhfQ0VMTFMgPSA2MDtcblxuLyoqIFJpc2luZyBzdGVwIGZpbGwgKGVtZXJhbGQpIGFuZCBmYWxsaW5nIHN0ZXAgZmlsbCAocm9zZSkuICovXG5jb25zdCBXQVRFUkZBTExfSU5DUkVBU0VfQ09MT1IgPSBcIiMyRUI4OEFcIjtcbmNvbnN0IFdBVEVSRkFMTF9ERUNSRUFTRV9DT0xPUiA9IFwiI0REMkM0RFwiO1xuXG4vKiogU2VyaWVzIG5hbWVzIHRoZSB3YXRlcmZhbGwgZXhwYW5zaW9uIGVtaXRzLiAqL1xuY29uc3QgV0FURVJGQUxMX0hFTFBFUl9OQU1FID0gXCJSdW5uaW5nIHRvdGFsXCI7XG5jb25zdCBXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSA9IFwiSW5jcmVhc2VcIjtcbmNvbnN0IFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FID0gXCJEZWNyZWFzZVwiO1xuXG4vKipcbiAqIEEgbW9kZWwgYXNrZWQgZm9yIGEgYnJpZGdlIG9mdGVuIGJ1aWxkcyB0aGUgcnVubmluZyB0b3RhbCBpdHNlbGYgYW5kXG4gKiBoYW5kcyBiYWNrIGEgY3VtdWxhdGl2ZS1iYXNlIHNlcmllcyBhbG9uZ3NpZGUgdGhlIGRlbHRhcyAtIHdoaWNoXG4gKiByZW5kZXJzIGFzIHR3byBwbGFpbiBiYXIgc2VyaWVzLCBub3QgYSB3YXRlcmZhbGwgKHRoZSBiYXNlIGJhcnMgYXJlXG4gKiB0aGUgdGFsbCBvbmVzKS4gVGhlIGJhc2UgaXMgcmVjb2duaXphYmxlIGJ5IG5hbWUsIHNvIGl0IGlzIGRyb3BwZWRcbiAqIGhlcmUgYW5kIHRoZSBydW5uaW5nIHRvdGFsIHJlY29tcHV0ZWQgZnJvbSB0aGUgZGVsdGFzLlxuICovXG5jb25zdCBXQVRFUkZBTExfQkFTRV9OQU1FID0gL1xcYihiYXNlfGN1bXVsYXRpdmV8cnVubmluZ3xoZWxwZXJ8dG90YWx8c3RhcnQoaW5nKT8pXFxiL2k7XG5cbi8qKlxuICogUGljayB0aGUgc2lnbmVkLWRlbHRhIHNlcmllcyBvdXQgb2YgYSB3YXRlcmZhbGwgcGxhbiwgaWdub3JpbmcgYW55XG4gKiBjdW11bGF0aXZlLWJhc2Ugc2VyaWVzIHRoZSBwbGFubmVyIGJ1aWx0IGJ5IGhhbmRcbiAqICh7QGxpbmsgV0FURVJGQUxMX0JBU0VfTkFNRX0pLiBGYWxscyBiYWNrIHRvIHRoZSBmaXJzdCBzZXJpZXMgd2hlblxuICogZXZlcnkgbmFtZSBsb29rcyBsaWtlIGEgYmFzZSwgc2luY2UgZHJvcHBpbmcgdGhlbSBhbGwgd291bGQgbGVhdmVcbiAqIG5vdGhpbmcgdG8gcGxvdC5cbiAqL1xuZnVuY3Rpb24gd2F0ZXJmYWxsRGVsdGFTZXJpZXMoXG4gIHNlcmllczogQ2hhcnRQbGFuW1wic2VyaWVzXCJdLFxuKTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2VyaWVzLmZpbmQoKHMpID0+ICFXQVRFUkZBTExfQkFTRV9OQU1FLnRlc3Qocy5uYW1lKSkgPz8gc2VyaWVzWzBdO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBzdGFja2VkIHRyYW5zcGFyZW50LWJhc2UgKyBpbmNyZWFzZSArIGRlY3JlYXNlIHNlcmllcyB0aGF0XG4gKiBFY2hhcnRzIHVzZXMgZm9yIGEgd2F0ZXJmYWxsIChpdCBoYXMgbm8gbmF0aXZlIHdhdGVyZmFsbCB0eXBlKS5cbiAqIFZhbHVlcyBhcmUgc2lnbmVkIGRlbHRhczsgdGhlIHRyYW5zcGFyZW50IGhlbHBlciBjYXJyaWVzIHRoZSBydW5uaW5nXG4gKiB0b3RhbCBzbyBlYWNoIHZpc2libGUgYmFyIHN0YXJ0cyB3aGVyZSB0aGUgcHJldmlvdXMgb25lIGVuZGVkLlxuICpcbiAqIFRoZSBoZWxwZXIgaXMgYHNpbGVudGAsIHNvIHdpdGggYW4gaXRlbS10cmlnZ2VyZWQgdG9vbHRpcCBpdCBpc1xuICogaW52aXNpYmxlIHRvIGJvdGggdGhlIGV5ZSBhbmQgdGhlIHBvaW50ZXIgLSB0aGUgYWx0ZXJuYXRpdmUsIGFuIGF4aXNcbiAqIHRvb2x0aXAgdGhhdCBoaWRlcyB0aGUgaGVscGVyIHJvdywgbmVlZHMgYSBmdW5jdGlvbiBmb3JtYXR0ZXIsIGFuZFxuICogdGhpcyBzcGVjIGhhcyB0byBzdXJ2aXZlIEpTT04gc2VyaWFsaXphdGlvbiB0byB0aGUgYnJvd3Nlci5cbiAqL1xuZnVuY3Rpb24gd2F0ZXJmYWxsU2VyaWVzKHZhbHVlczogbnVtYmVyW10pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBoZWxwZXJzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBpbmNyZWFzZXM6IEFycmF5PG51bWJlciB8IFwiLVwiPiA9IFtdO1xuICBjb25zdCBkZWNyZWFzZXM6IEFycmF5PG51bWJlciB8IFwiLVwiPiA9IFtdO1xuICBsZXQgY3VtdWxhdGl2ZSA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlID49IDApIHtcbiAgICAgIGhlbHBlcnMucHVzaChjdW11bGF0aXZlKTtcbiAgICAgIGluY3JlYXNlcy5wdXNoKHZhbHVlKTtcbiAgICAgIGRlY3JlYXNlcy5wdXNoKFwiLVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVscGVycy5wdXNoKGN1bXVsYXRpdmUgKyB2YWx1ZSk7XG4gICAgICBpbmNyZWFzZXMucHVzaChcIi1cIik7XG4gICAgICBkZWNyZWFzZXMucHVzaCgtdmFsdWUpO1xuICAgIH1cbiAgICBjdW11bGF0aXZlICs9IHZhbHVlO1xuICB9XG4gIGNvbnN0IHRyYW5zcGFyZW50ID0geyBib3JkZXJDb2xvcjogXCJ0cmFuc3BhcmVudFwiLCBjb2xvcjogXCJ0cmFuc3BhcmVudFwiIH07XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogV0FURVJGQUxMX0hFTFBFUl9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICBpdGVtU3R5bGU6IHRyYW5zcGFyZW50LFxuICAgICAgZW1waGFzaXM6IHsgaXRlbVN0eWxlOiB0cmFuc3BhcmVudCB9LFxuICAgICAgZGF0YTogaGVscGVycyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9JTkNSRUFTRV9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IFdBVEVSRkFMTF9JTkNSRUFTRV9DT0xPUiB9LFxuICAgICAgZGF0YTogaW5jcmVhc2VzLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogV0FURVJGQUxMX0RFQ1JFQVNFX05BTUUsXG4gICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgc3RhY2s6IFwidG90YWxcIixcbiAgICAgIGl0ZW1TdHlsZTogeyBjb2xvcjogV0FURVJGQUxMX0RFQ1JFQVNFX0NPTE9SIH0sXG4gICAgICBkYXRhOiBkZWNyZWFzZXMsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgYSB7QGxpbmsgQ2hhcnRQbGFufSBpbnRvIGEgZnVsbCBFY2hhcnRzIGBFQ2hhcnRzT3B0aW9uYFxuICogSlNPTi4gQ2VudHJhbGl6ZWQgaGVyZSBzbyB0aGUgcGxhbm5lciBhZ2VudCBvbmx5IGZpbGxzIGluIHRoZVxuICogY29tcGFjdCBwbGFuIHNoYXBlOyB0b29sdGlwIC8gYW5pbWF0aW9uIC8gY29sb3IgLyBncmlkIGRlZmF1bHRzXG4gKiBzdGF5IGNvbnNpc3RlbnQgYWNyb3NzIGNoYXJ0cyBhbmQgYXJlIGVhc3kgdG8gdHVuZSB3aXRob3V0XG4gKiByZXRyYWluaW5nIG1vZGVsIGJlaGF2aW91ci5cbiAqXG4gKiBXaGVuIGBicmFuZGAgaXMgc2V0LCB0aGUgcmVzb2x2ZWQgc3BlYyBpcyB0aGVtZWQgd2l0aCB0aGUgYnJhbmQncyBzZXJpZXNcbiAqIGNvbG9yIGN5Y2xlIGFuZCBiYXNlIHRleHQgc3R5bGUgKHNlZSB7QGxpbmsgYnJhbmRDaGFydFRoZW1lfSk7IG90aGVyd2lzZVxuICogRWNoYXJ0cycgZGVmYXVsdHMgYXBwbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGFuVG9FY2hhcnRzT3B0aW9uKFxuICBwbGFuOiBDaGFydFBsYW4sXG4gIGZhbGxiYWNrVGl0bGU6IHN0cmluZyxcbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGJhc2VUaXRsZSA9IHBsYW4udGl0bGUgPz8gZmFsbGJhY2tUaXRsZTtcbiAgY29uc3QgZ3JpZCA9IHsgbGVmdDogNDgsIHJpZ2h0OiAyNCwgdG9wOiA1NiwgYm90dG9tOiA0OCwgY29udGFpbkxhYmVsOiB0cnVlIH07XG4gIGNvbnN0IHRoZW1lID0gYnJhbmQgPyBicmFuZENoYXJ0VGhlbWUoYnJhbmQpIDogdW5kZWZpbmVkO1xuICBjb25zdCB0aGVtZWQgPSAob3B0aW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gICAgdGhlbWUgPyB7IC4uLnRoZW1lLCAuLi5vcHRpb24gfSA6IG9wdGlvbjtcbiAgY29uc3QgdGl0bGUgPSB7IHRleHQ6IGJhc2VUaXRsZSwgbGVmdDogXCJjZW50ZXJcIiB9O1xuICBjb25zdCBsZWdlbmQgPSB7IGJvdHRvbTogMCB9O1xuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIC8vIFRoZSBvcHRpb24gYXJyaXZlcyBhcyBhIEpTT04gU1RSSU5HLCBub3QgYSBuZXN0ZWQgb2JqZWN0OiB0aGlzIHBsYW4gaXNcbiAgICAvLyB0aGUgcGxhbm5lcidzIHByb3ZpZGVyLWVuZm9yY2VkIHN0cnVjdHVyZWQgb3V0cHV0LCBhbmQgYSBmcmVlLWZvcm1cbiAgICAvLyBvYmplY3QgYmVjb21lcyBhbiB1bmNvbnN0cmFpbmVkIGBhZGRpdGlvbmFsUHJvcGVydGllc2Agc2NoZW1hIHRoYXRcbiAgICAvLyBzdHJpY3QgT3BlbkFJIGFuZCBHZW1pbmkgZW5kcG9pbnRzIHJlamVjdCAtIHdoaWNoIHdvdWxkIGJyZWFrIEVWRVJZXG4gICAgLy8gY2hhcnQsIG5vdCBqdXN0IHRoaXMgb25lIChzYW1lIGNsYXNzIG9mIGhhemFyZCBhcyB0aGUgYHByZWZpeEl0ZW1zYFxuICAgIC8vIG5vdGUgb24gYGNoYXJ0RGF0YVBvaW50U2NoZW1hYCkuIEEgbWFsZm9ybWVkIHN0cmluZyBjb3N0cyBvbmUgY2hhcnQuXG4gICAgLy8gTm90aGluZyBoZXJlIGlzIGV2YWwnZDsgYSBzdHJpbmctdmFsdWVkIEVjaGFydHMgZm9ybWF0dGVyIGlzIGFcbiAgICAvLyB0ZW1wbGF0ZSwgbm90IGNvZGUuXG4gICAgY29uc3Qgb3B0aW9uID0ganNvbi5wYXJzZVJlY29yZChwbGFuLm9wdGlvbik7XG4gICAgaWYgKCFvcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2hhcnRUeXBlIFwiY3VzdG9tXCIgbmVlZHMgYW4gYG9wdGlvbmAgaG9sZGluZyBhIEpTT04gb2JqZWN0Jyk7XG4gICAgfVxuICAgIC8vIFRpdGxlIGlzIHRoZSBvbmUgZGVmYXVsdCB3b3J0aCBmaWxsaW5nOiBldmVyeSBvdGhlciBicmFuY2ggZ3VhcmFudGVlc1xuICAgIC8vIG9uZSBhbmQgdGhlIHJlbmRlcmVyIHJlc2VydmVzIGdyaWQgc3BhY2UgZm9yIGl0LiBBIHRpdGxlIHRoZSBtb2RlbCBzZXRcbiAgICAvLyB3aW5zLCBhcyBkb2VzIGV2ZXJ5IG90aGVyIGZpZWxkIGl0IGRlY2xhcmVkLlxuICAgIHJldHVybiB0aGVtZWQoeyB0aXRsZSwgLi4ub3B0aW9uIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcInBpZVwiIHx8IHBsYW4uY2hhcnRUeXBlID09PSBcImZ1bm5lbFwiIHx8IHBsYW4uY2hhcnRUeXBlID09PSBcInRyZWVtYXBcIikge1xuICAgIGNvbnN0IHNsaWNlcyA9IG5hbWVkU2xpY2VzKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKTtcbiAgICBjb25zdCBzZXJpZXNUeXBlID0gcGxhbi5jaGFydFR5cGU7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZDogc2VyaWVzVHlwZSA9PT0gXCJ0cmVlbWFwXCIgPyB1bmRlZmluZWQgOiBsZWdlbmQsXG4gICAgICBzZXJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHBsYW4uc2VyaWVzWzBdPy5uYW1lID8/IGJhc2VUaXRsZSxcbiAgICAgICAgICB0eXBlOiBzZXJpZXNUeXBlLFxuICAgICAgICAgIC4uLihzZXJpZXNUeXBlID09PSBcInBpZVwiID8geyByYWRpdXM6IFtcIjM1JVwiLCBcIjY1JVwiXSB9IDoge30pLFxuICAgICAgICAgIC4uLihzZXJpZXNUeXBlID09PSBcImZ1bm5lbFwiID8geyBzb3J0OiBcImRlc2NlbmRpbmdcIiB9IDoge30pLFxuICAgICAgICAgIGRhdGE6IHNsaWNlcyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwic2NhdHRlclwiKSB7XG4gICAgLy8gRWNoYXJ0cyBjcmFzaGVzIG9uIG51bGwgc2NhdHRlciBwb2ludHMgLSBrZWVwIG9ubHkgdmFsaWRcbiAgICAvLyBgW3gsIHldYCB0dXBsZXMuIEJhcmUgbnVtYmVycyAvIG9iamVjdHMgLyBudWxscyBmcm9tIGFcbiAgICAvLyBtaXNtYXRjaGVkIHBsYW4gZ2V0IGRyb3BwZWQgc2lsZW50bHkuXG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCB9LFxuICAgICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgIHR5cGU6IFwic2NhdHRlclwiLFxuICAgICAgICBkYXRhOiBzY2F0dGVyUG9pbnRzKHMuZGF0YSksXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiaGVhdG1hcFwiKSB7XG4gICAgY29uc3QgeyBjZWxscywgeUNhdGVnb3JpZXMgfSA9IGhlYXRtYXBNYXRyaXgocGxhbik7XG4gICAgY29uc3QgdmFsdWVzID0gY2VsbHMubWFwKChjKSA9PiBjWzJdKTtcbiAgICBjb25zdCBtaW4gPSB2YWx1ZXMubGVuZ3RoID4gMCA/IE1hdGgubWluKC4uLnZhbHVlcykgOiAwO1xuICAgIGNvbnN0IG1heCA9IHZhbHVlcy5sZW5ndGggPiAwID8gTWF0aC5tYXgoLi4udmFsdWVzKSA6IDE7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgcG9zaXRpb246IFwidG9wXCIgfSxcbiAgICAgIC8vIFRoZSB2aXN1YWxNYXAgcmFtcCBzaXRzIGJlbG93IHRoZSBwbG90LCBzbyB0aGUgZ3JpZCBnaXZlcyB1cFxuICAgICAgLy8gbW9yZSBib3R0b20gcm9vbSB0aGFuIGFuIGF4aXMtb25seSBjaGFydCBuZWVkcy5cbiAgICAgIGdyaWQ6IHsgLi4uZ3JpZCwgYm90dG9tOiA3MiB9LFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgICAgc3BsaXRBcmVhOiB7IHNob3c6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgICB5QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHlDYXRlZ29yaWVzLFxuICAgICAgICBuYW1lOiBwbGFuLnlBeGlzTGFiZWwsXG4gICAgICAgIHNwbGl0QXJlYTogeyBzaG93OiB0cnVlIH0sXG4gICAgICB9LFxuICAgICAgdmlzdWFsTWFwOiB7XG4gICAgICAgIC8vIEVjaGFydHMgaGlkZXMgZXZlcnkgY2VsbCB3aGVuIG1pbiA9PT0gbWF4IChhIHVuaWZvcm0gbWF0cml4KSxcbiAgICAgICAgLy8gc28gYSBkZWdlbmVyYXRlIHJhbmdlIGlzIHdpZGVuZWQgYnkgb25lLlxuICAgICAgICBtaW4sXG4gICAgICAgIG1heDogbWF4ID4gbWluID8gbWF4IDogbWluICsgMSxcbiAgICAgICAgY2FsY3VsYWJsZTogdHJ1ZSxcbiAgICAgICAgb3JpZW50OiBcImhvcml6b250YWxcIixcbiAgICAgICAgbGVmdDogXCJjZW50ZXJcIixcbiAgICAgICAgYm90dG9tOiA4LFxuICAgICAgICBpblJhbmdlOiB7IGNvbG9yOiBIRUFUTUFQX1JBTVAgfSxcbiAgICAgIH0sXG4gICAgICBzZXJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHBsYW4uc2VyaWVzWzBdPy5uYW1lID8/IGJhc2VUaXRsZSxcbiAgICAgICAgICB0eXBlOiBcImhlYXRtYXBcIixcbiAgICAgICAgICBkYXRhOiBjZWxscyxcbiAgICAgICAgICAvLyBQcmludGVkIGNlbGwgdmFsdWVzIGFyZSB1bnJlYWRhYmxlIG9uY2UgdGhlIGdyaWQgaXMgZGVuc2UuXG4gICAgICAgICAgbGFiZWw6IHsgc2hvdzogY2VsbHMubGVuZ3RoIDw9IEhFQVRNQVBfTEFCRUxfTUFYX0NFTExTIH0sXG4gICAgICAgICAgZW1waGFzaXM6IHsgaXRlbVN0eWxlOiB7IHNoYWRvd0JsdXI6IDEwLCBzaGFkb3dDb2xvcjogXCJyZ2JhKDAsIDAsIDAsIDAuMylcIiB9IH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcInJhZGFyXCIpIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gKHBsYW4uY2F0ZWdvcmllcyA/PyBbXSkubWFwKChuYW1lLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGVhayA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICAuLi5wbGFuLnNlcmllcy5tYXAoKHMpID0+IHtcbiAgICAgICAgICBjb25zdCBudW1zID0gbnVtZXJpY1BvaW50cyhzLmRhdGEpO1xuICAgICAgICAgIHJldHVybiBudW1zW2luZGV4XSA/PyAwO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBuYW1lLCBtYXg6IHBlYWsgPiAwID8gcGVhayA6IDEgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgcmFkYXI6IHsgaW5kaWNhdG9yOiBpbmRpY2F0b3JzIH0sXG4gICAgICBzZXJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwicmFkYXJcIixcbiAgICAgICAgICBkYXRhOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVtZXJpY1BvaW50cyhzLmRhdGEpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwid2F0ZXJmYWxsXCIpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBudW1lcmljUG9pbnRzKHdhdGVyZmFsbERlbHRhU2VyaWVzKHBsYW4uc2VyaWVzKT8uZGF0YSA/PyBbXSk7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIC8vIEl0ZW0tdHJpZ2dlcmVkIHNvIHRoZSB0cmFuc3BhcmVudCBgc2lsZW50YCBvZmZzZXQgYmFycyBuZXZlclxuICAgICAgLy8gc3VyZmFjZSBpbiBhIHRvb2x0aXAgKHNlZSBgd2F0ZXJmYWxsU2VyaWVzYCkuXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICAvLyBPbmx5IHRoZSB0d28gdmlzaWJsZSBzdGVwcyBiZWxvbmcgaW4gdGhlIGxlZ2VuZC5cbiAgICAgIGxlZ2VuZDogeyAuLi5sZWdlbmQsIGRhdGE6IFtXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSwgV0FURVJGQUxMX0RFQ1JFQVNFX05BTUVdIH0sXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiB3YXRlcmZhbGxTZXJpZXModmFsdWVzKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJob3Jpem9udGFsQmFyXCIpIHtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiwgYXhpc1BvaW50ZXI6IHsgdHlwZTogXCJzaGFkb3dcIiB9IH0sXG4gICAgICBsZWdlbmQsXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnhBeGlzTGFiZWwgfSxcbiAgICAgIHlBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICBuYW1lOiBwbGFuLnlBeGlzTGFiZWwsXG4gICAgICB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgICAgZGF0YTogcy5kYXRhLFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImNvbWJvXCIpIHtcbiAgICBjb25zdCB1c2VzUmlnaHRBeGlzID0gcGxhbi5zZXJpZXMuc29tZSgocykgPT4gcy55QXhpc0luZGV4ID09PSAxKTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgICB9LFxuICAgICAgeUF4aXM6IHVzZXNSaWdodEF4aXNcbiAgICAgICAgPyBbXG4gICAgICAgICAgICB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgXVxuICAgICAgICA6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSBzLnR5cGUgPz8gXCJiYXJcIjtcbiAgICAgICAgY29uc3Qgc2VyaWVzVHlwZSA9IG1hcmsgPT09IFwiYXJlYVwiID8gXCJsaW5lXCIgOiBtYXJrO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgICB0eXBlOiBzZXJpZXNUeXBlLFxuICAgICAgICAgIGRhdGE6IHMuZGF0YSxcbiAgICAgICAgICB5QXhpc0luZGV4OiBzLnlBeGlzSW5kZXggPz8gMCxcbiAgICAgICAgICBzbW9vdGg6IHNlcmllc1R5cGUgPT09IFwibGluZVwiLFxuICAgICAgICAgIC4uLihtYXJrID09PSBcImFyZWFcIiA/IHsgYXJlYVN0eWxlOiB7fSB9IDoge30pLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBiYXIgLyBsaW5lIC8gYXJlYSBzaGFyZSB0aGUgc2FtZSBheGlzIGxheW91dC5cbiAgY29uc3QgaXNBcmVhID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYXJlYVwiO1xuICBjb25zdCBzZXJpZXNUeXBlID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYmFyXCIgPyBcImJhclwiIDogXCJsaW5lXCI7XG4gIHJldHVybiB0aGVtZWQoe1xuICAgIHRpdGxlLFxuICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJheGlzXCIgfSxcbiAgICBsZWdlbmQsXG4gICAgZ3JpZCxcbiAgICB4QXhpczoge1xuICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgIH0sXG4gICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICBzbW9vdGg6IHNlcmllc1R5cGUgPT09IFwibGluZVwiLFxuICAgICAgLi4uKGlzQXJlYSA/IHsgYXJlYVN0eWxlOiB7fSB9IDoge30pLFxuICAgIH0pKSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlbmRlcl9kYXRhIHRvb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHJlbmRlcl9kYXRhYCBNYXN0cmEgdG9vbCBib3VuZCB0byB0aGUgZ2l2ZW4gcGx1Z2luXG4gKiBjb25maWcuIEF1dG8td2lyZWQgYXMgYSBzeXN0ZW0gdG9vbCBvbiBldmVyeSBhZ2VudCAoc2VlXG4gKiBgYWdlbnRzLnRzYCk7IHBlci1hZ2VudCB0b29scyBjYW4gc2hhZG93IGl0IGJ5IHJlZ2lzdGVyaW5nIGFcbiAqIHNhbWUtbmFtZWQgZW50cnkuXG4gKlxuICogVGhpbiB3cmFwcGVyIG92ZXIge0BsaW5rIHByZXBhcmVDaGFydH0gZm9yIGNhbGxlcnMgdGhhdCBhbHJlYWR5XG4gKiBoYXZlIGEgZGF0YXNldCBpbiBoYW5kLiBNaW50cyBhIGBjaGFydElkYCBzeW5jaHJvbm91c2x5LCBjYWNoZXNcbiAqIGFuIGVtcHR5IHBsYWNlaG9sZGVyLCBhbmQga2lja3Mgb2ZmIHRoZSBjaGFydC1wbGFubmVyIGluIHRoZVxuICogYmFja2dyb3VuZC4gUmV0dXJucyB0aGUgYGNoYXJ0SWRgIHBsdXMgaXRzIHJlYWR5LXRvLWNvcHkgYG1hcmtlcmA7IHRoZSBob3N0XG4gKiBVSSByZXNvbHZlcyB0aGF0IG1hcmtlciB0aHJvdWdoIHRoZSBwbHVnaW4ncyBgL2VtYmVkL2NoYXJ0LzppZGAgcm91dGUuXG4gKlxuICogRm9yIEdlbmllIHN0YXRlbWVudCByZXN1bHRzLCBwcmVmZXIgdGhlIEdlbmllIGFnZW50J3NcbiAqIGBwcmVwYXJlX2NoYXJ0YCB0b29sLCB3aGljaCBhY2NlcHRzIGEgYHN0YXRlbWVudF9pZGAgYW5kXG4gKiByZXNvbHZlcyB0aGUgcm93cyBsYXppbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJlbmRlckRhdGFUb29sKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKSB7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogXCJyZW5kZXJfZGF0YVwiLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcudG9EZXNjcmlwdGlvbihbXG4gICAgICBgXG4gICAgICAgIFN1Ym1pdCBhIHRhYnVsYXIgZGF0YXNldCBmb3IgaW5saW5lIHJlbmRlcmluZyBhcyBhIGNoYXJ0IGluXG4gICAgICAgIHRoZSB1c2VyJ3Mgdmlldy4gUGFzcyBhIHRpdGxlLCB0aGUgcmF3IHJvd3MgKGFycmF5IG9mIG9iamVjdHNcbiAgICAgICAga2V5ZWQgYnkgY29sdW1uIG5hbWUpLCBhbmQgYW4gb3B0aW9uYWwgb25lLWxpbmUgZGVzY3JpcHRpb25cbiAgICAgICAgb2YgdGhlIGluc2lnaHQgdG8gaGlnaGxpZ2h0LiBSZXR1cm5zIFxcYGNoYXJ0SWRcXGAgcGx1cyB0aGVcbiAgICAgICAgY29tcGxldGUgXFxgbWFya2VyXFxgOyBjb3B5IHRoZSByZXR1cm5lZCBtYXJrZXIgVkVSQkFUSU0gb250b1xuICAgICAgICBpdHMgb3duIGxpbmUgd2hlcmUgdGhlIGNoYXJ0IHNob3VsZCByZW5kZXIuIE5ldmVyIGNvbnN0cnVjdCxcbiAgICAgICAgYWx0ZXIsIG9yIGludmVudCBhIGNoYXJ0IG1hcmtlciB5b3Vyc2VsZi5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFBsYWNlbWVudCBjb250cmFjdDogZW1iZWQgdGhlIHJldHVybmVkIFxcYG1hcmtlclxcYCBvbiBpdHMgb3duXG4gICAgICAgIGxpbmUgKGJsYW5rIGxpbmVzIGFib3ZlIGFuZCBiZWxvdykgd2hlcmV2ZXIgeW91IHdhbnQgdGhlIGNoYXJ0XG4gICAgICAgIHRvIGFwcGVhciBpbiB5b3VyIHJlcGx5LiBUaGUgY2hhcnQgcmVzb2x2ZXNcbiAgICAgICAgYXN5bmNocm9ub3VzbHkgLSB0aGUgdG9vbCByZXR1cm5zIHRoZSBpZCBpbW1lZGlhdGVseSBhbmQgdGhlXG4gICAgICAgIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2hhcnQgZnJvbSB0aGUgY2FjaGUgb25jZSB0aGUgcGxhbm5lclxuICAgICAgICBsYW5kcy4gWW91IGNhbiBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIG11bHRpcGxlIHRpbWVzIGluIHRoZVxuICAgICAgICBzYW1lIHR1cm4gKHRoZSB0b29sIGlzIHBhcmFsbGVsLXNhZmUpIGFuZCBpbnRlcmxlYXZlIHRoZVxuICAgICAgICBtYXJrZXJzIHdpdGggcHJvc2Ugc28gZWFjaCBjaGFydCBzaXRzIG5leHQgdG8gaXRzXG4gICAgICAgIGNvbW1lbnRhcnkuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBVc2Ugd2hlbmV2ZXIgYSBTUUwgcm93IHNldCwgQVBJIHJlc3BvbnNlLCBvciBoYW5kLWJ1aWx0XG4gICAgICAgIGRhdGFzZXQgd291bGQgbGFuZCBiZXR0ZXIgYXMgYSBwaWN0dXJlIHRoYW4gYXMgYSBsaXN0IG9yXG4gICAgICAgIHRhYmxlLiBDYXAgaW5wdXQgYXQgYSBmZXcgaHVuZHJlZCByb3dzOyBzYW1wbGUgb3IgYWdncmVnYXRlXG4gICAgICAgIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGAsXG4gICAgXSksXG4gICAgaW5wdXRTY2hlbWE6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsXG4gICAgb3V0cHV0U2NoZW1hOiBjaGFydFRvb2xPdXRwdXRTY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IHsgdGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhIH0gPSBpbnB1dCBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0O1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIHsgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dCB9IHwgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHByZXBhcmVDaGFydCh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkoY3R4Py5yZXF1ZXN0Q29udGV4dCksXG4gICAgICAgIHRpdGxlLFxuICAgICAgICAuLi4oZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHJlc29sdmVEYXRhOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoeyByb3dzOiBkYXRhIH0pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @module
8
8
  */
9
+ import { object } from "@dbx-tools/shared-core";
9
10
  /** Coerce / clamp a `perPage` value, falling back to `bounds.fallback`. */
10
11
  export function clampPerPage(value, bounds) {
11
12
  if (value === undefined || Number.isNaN(value))
@@ -21,11 +22,9 @@ export function clampPerPage(value, bounds) {
21
22
  * can apply its built-in defaults.
22
23
  */
23
24
  export function parseIntParam(value) {
24
- if (!value)
25
- return undefined;
26
- const n = Number(value);
27
- if (!Number.isFinite(n) || n < 0)
25
+ const n = object.toNumber(value);
26
+ if (n === undefined || n < 0)
28
27
  return undefined;
29
28
  return Math.trunc(n);
30
29
  }
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYWdpbmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFVSCwyRUFBMkU7QUFDM0UsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUF5QixFQUFFLE1BQXFCO0lBQzNFLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUN2RSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDbkMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQXlCO0lBQ3JELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbkQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFF1ZXJ5LXBhcmFtZXRlciBjb2VyY2lvbiBzaGFyZWQgYnkgdGhlIHBhZ2luYXRlZCBjdXN0b20gcm91dGVzXG4gKiAoYGhpc3RvcnlgIC8gYHRocmVhZHNgKS4gRWFjaCByb3V0ZSBrZWVwcyBpdHMgb3duIHBhZ2Utc2l6ZSBkZWZhdWx0XG4gKiBhbmQgaGFyZCBjYXAgYW5kIHBhc3NlcyB0aGVtIGluLCBzbyB0aGUgY29lcmNpb24gcnVsZXMgc3RheSBpbiBvbmVcbiAqIHBsYWNlIHdpdGhvdXQgY29sbGFwc2luZyB0aGUgcm91dGVzJyBkaXN0aW5jdCBzaXppbmcuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKiBCb3VuZHMgZm9yIHtAbGluayBjbGFtcFBlclBhZ2V9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJQYWdlQm91bmRzIHtcbiAgLyoqIFBhZ2Ugc2l6ZSB1c2VkIGZvciBlbXB0eSAvIG5vbi1wb3NpdGl2ZSAvIG5vbi1udW1lcmljIGlucHV0cy4gKi9cbiAgZmFsbGJhY2s6IG51bWJlcjtcbiAgLyoqIEhhcmQgY2FwIHNvIGEgbWlzYmVoYXZpbmcgY2xpZW50IGNhbid0IGZldGNoIGV2ZXJ5dGhpbmcgYXQgb25jZS4gKi9cbiAgbWF4OiBudW1iZXI7XG59XG5cbi8qKiBDb2VyY2UgLyBjbGFtcCBhIGBwZXJQYWdlYCB2YWx1ZSwgZmFsbGluZyBiYWNrIHRvIGBib3VuZHMuZmFsbGJhY2tgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wUGVyUGFnZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBib3VuZHM6IFBlclBhZ2VCb3VuZHMpOiBudW1iZXIge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBOdW1iZXIuaXNOYU4odmFsdWUpKSByZXR1cm4gYm91bmRzLmZhbGxiYWNrO1xuICBjb25zdCBuID0gTWF0aC50cnVuYyh2YWx1ZSk7XG4gIGlmIChuIDw9IDApIHJldHVybiBib3VuZHMuZmFsbGJhY2s7XG4gIHJldHVybiBNYXRoLm1pbihuLCBib3VuZHMubWF4KTtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYSBIb25vIHF1ZXJ5IHZhbHVlIGludG8gYSBub24tbmVnYXRpdmUgaW50ZWdlci4gUmV0dXJuc1xuICogYHVuZGVmaW5lZGAgZm9yIGVtcHR5IC8gbm9uLW51bWVyaWMgLyBuZWdhdGl2ZSBpbnB1dHMgc28gdGhlIGNhbGxlclxuICogY2FuIGFwcGx5IGl0cyBidWlsdC1pbiBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW50UGFyYW0odmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG4gPSBOdW1iZXIodmFsdWUpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSB8fCBuIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGgudHJ1bmMobik7XG59XG4iXX0=
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYWdpbmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFVaEQsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBeUIsRUFBRSxNQUFxQjtJQUMzRSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDdkUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ25DLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUF5QjtJQUNyRCxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQy9DLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBRdWVyeS1wYXJhbWV0ZXIgY29lcmNpb24gc2hhcmVkIGJ5IHRoZSBwYWdpbmF0ZWQgY3VzdG9tIHJvdXRlc1xuICogKGBoaXN0b3J5YCAvIGB0aHJlYWRzYCkuIEVhY2ggcm91dGUga2VlcHMgaXRzIG93biBwYWdlLXNpemUgZGVmYXVsdFxuICogYW5kIGhhcmQgY2FwIGFuZCBwYXNzZXMgdGhlbSBpbiwgc28gdGhlIGNvZXJjaW9uIHJ1bGVzIHN0YXkgaW4gb25lXG4gKiBwbGFjZSB3aXRob3V0IGNvbGxhcHNpbmcgdGhlIHJvdXRlcycgZGlzdGluY3Qgc2l6aW5nLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKiogQm91bmRzIGZvciB7QGxpbmsgY2xhbXBQZXJQYWdlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVyUGFnZUJvdW5kcyB7XG4gIC8qKiBQYWdlIHNpemUgdXNlZCBmb3IgZW1wdHkgLyBub24tcG9zaXRpdmUgLyBub24tbnVtZXJpYyBpbnB1dHMuICovXG4gIGZhbGxiYWNrOiBudW1iZXI7XG4gIC8qKiBIYXJkIGNhcCBzbyBhIG1pc2JlaGF2aW5nIGNsaWVudCBjYW4ndCBmZXRjaCBldmVyeXRoaW5nIGF0IG9uY2UuICovXG4gIG1heDogbnVtYmVyO1xufVxuXG4vKiogQ29lcmNlIC8gY2xhbXAgYSBgcGVyUGFnZWAgdmFsdWUsIGZhbGxpbmcgYmFjayB0byBgYm91bmRzLmZhbGxiYWNrYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcFBlclBhZ2UodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgYm91bmRzOiBQZXJQYWdlQm91bmRzKTogbnVtYmVyIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgTnVtYmVyLmlzTmFOKHZhbHVlKSkgcmV0dXJuIGJvdW5kcy5mYWxsYmFjaztcbiAgY29uc3QgbiA9IE1hdGgudHJ1bmModmFsdWUpO1xuICBpZiAobiA8PSAwKSByZXR1cm4gYm91bmRzLmZhbGxiYWNrO1xuICByZXR1cm4gTWF0aC5taW4obiwgYm91bmRzLm1heCk7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgSG9ubyBxdWVyeSB2YWx1ZSBpbnRvIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIFJldHVybnNcbiAqIGB1bmRlZmluZWRgIGZvciBlbXB0eSAvIG5vbi1udW1lcmljIC8gbmVnYXRpdmUgaW5wdXRzIHNvIHRoZSBjYWxsZXJcbiAqIGNhbiBhcHBseSBpdHMgYnVpbHQtaW4gZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUludFBhcmFtKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBuID0gb2JqZWN0LnRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG4gPT09IHVuZGVmaW5lZCB8fCBuIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGgudHJ1bmMobik7XG59XG4iXX0=