@dbx-tools/appkit-mastra 0.6.221 → 0.6.223

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
@@ -126,7 +126,7 @@ const chartDataPointSchema = z
126
126
  /** Per-series mark type used by `combo` charts (bar + line overlay). */
127
127
  const seriesMarkTypeSchema = z
128
128
  .union([z.literal("bar"), z.literal("line"), z.literal("area")])
129
- .describe("Mark type for this series. Required for `combo` (mix bar and line/area); ignored for other chart types.");
129
+ .describe("Mark type for this series. Required for `combo` (mix bar and line/area); use null for other chart types.");
130
130
  /**
131
131
  * Compact, model-friendly representation of an Echarts spec. The
132
132
  * planner agent emits this; {@link planToEchartsOption} expands it
@@ -141,56 +141,62 @@ export const chartPlanSchema = z.object({
141
141
  chartType: wire.ChartTypeSchema,
142
142
  title: z
143
143
  .string()
144
- .optional()
144
+ .nullable()
145
+ .default(null)
145
146
  .describe(string.toDescription(`
146
- Short title shown above the chart. Optional; defaults to the
147
+ Short title shown above the chart. Use null to fall back to the
147
148
  \`title\` argument the caller passed in.
148
149
  `)),
149
150
  xAxisLabel: z
150
151
  .string()
151
- .optional()
152
+ .nullable()
153
+ .default(null)
152
154
  .describe(string.toDescription(`
153
155
  Axis label for the primary (usually bottom / value) axis.
154
156
  Used for bar / horizontalBar / line / area / combo / waterfall
155
- / scatter / heatmap; ignored for pie / funnel / treemap / radar.
157
+ / scatter / heatmap; use null for pie / funnel / treemap / radar.
156
158
  `)),
157
159
  yAxisLabel: z
158
160
  .string()
159
- .optional()
161
+ .nullable()
162
+ .default(null)
160
163
  .describe(string.toDescription(`
161
164
  Axis label for the secondary (usually left) axis. Used for
162
165
  bar / horizontalBar / line / area / combo / waterfall /
163
- scatter / heatmap; ignored for pie / funnel / treemap / radar.
166
+ scatter / heatmap; use null for pie / funnel / treemap / radar.
164
167
  `)),
165
168
  categories: z
166
169
  .array(z.string())
167
- .optional()
170
+ .nullable()
171
+ .default(null)
168
172
  .describe(string.toDescription(`
169
173
  Primary category labels. For \`bar\` / \`horizontalBar\` /
170
174
  \`line\` / \`area\` / \`combo\` / \`waterfall\`: one label per
171
175
  data point. For \`heatmap\`: x-axis categories. For \`radar\`:
172
- indicator names. Omit for \`scatter\` (\`[x, y]\` tuples) and
176
+ indicator names. Use null for \`scatter\` (\`[x, y]\` tuples) and
173
177
  slice charts (\`pie\` / \`funnel\` / \`treemap\`, each slice
174
178
  carries its own \`name\`).
175
179
  `)),
176
180
  yCategories: z
177
181
  .array(z.string())
178
- .optional()
182
+ .nullable()
183
+ .default(null)
179
184
  .describe(string.toDescription(`
180
- Y-axis (row) labels for \`heatmap\`. Optional - when omitted the
185
+ Y-axis (row) labels for \`heatmap\`. Use null when the
181
186
  row labels come from the series names, which is the preferred
182
- way to build a heatmap. Omit for every other chart type.
187
+ way to build a heatmap. Use null for every other chart type.
183
188
  `)),
184
189
  series: z
185
190
  .array(z.object({
186
191
  name: z.string().describe(string.toDescription(`
187
192
  Legend name for this series.
188
193
  `)),
189
- type: seriesMarkTypeSchema.optional(),
194
+ type: seriesMarkTypeSchema.nullable().default(null),
190
195
  yAxisIndex: z
191
196
  .union([z.literal(0), z.literal(1)])
192
- .optional()
193
- .describe("Which y-axis to bind (0 = left, 1 = right). Use on `combo` when series have different units or scales."),
197
+ .nullable()
198
+ .default(null)
199
+ .describe("Which y-axis to bind (0 = left, 1 = right). Use on `combo` when series have different units or scales; use null otherwise."),
194
200
  data: z.array(chartDataPointSchema).describe(string.toDescription(`
195
201
  Data points. For category charts (\`bar\` / \`horizontalBar\`
196
202
  / \`line\` / \`area\` / \`combo\` / \`waterfall\` / \`radar\`),
@@ -214,9 +220,10 @@ export const chartPlanSchema = z.object({
214
220
  `)),
215
221
  option: z
216
222
  .string()
217
- .optional()
223
+ .nullable()
224
+ .default(null)
218
225
  .describe(string.toDescription(`
219
- Required for \`custom\`, ignored for every other chart type. A
226
+ Required for \`custom\`; use null for every other chart type. A
220
227
  COMPLETE Echarts option, as a JSON object encoded in a string:
221
228
  \`series\` (each with its own \`type\` and that series' own data
222
229
  shape) plus whatever else the chart needs - a coordinate system,
@@ -729,7 +736,8 @@ function waterfallSeries(values) {
729
736
  * color cycle and base text style (see {@link brandChartTheme}); otherwise
730
737
  * Echarts' defaults apply.
731
738
  */
732
- export function planToEchartsOption(plan, fallbackTitle, brand) {
739
+ export function planToEchartsOption(input, fallbackTitle, brand) {
740
+ const plan = chartPlanSchema.parse(input);
733
741
  const baseTitle = plan.title ?? fallbackTitle;
734
742
  const grid = { left: 48, right: 24, top: 56, bottom: 48, containLabel: true };
735
743
  const theme = brand ? brandChartTheme(brand) : undefined;
@@ -1017,4 +1025,4 @@ export function buildRenderDataTool(config) {
1017
1025
  },
1018
1026
  });
1019
1027
  }
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=
1028
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILE1BQU0sRUFDTixNQUFNLEdBRVAsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBZ0MsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyw2RUFBNkU7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXBDLHNEQUFzRDtBQUN0RCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFeEMsdURBQXVEO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRXRDLG9FQUFvRTtBQUNwRSxNQUFN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QUM7WUFDaEM7Ozs7Ozs7O09BUUM7WUFDRDs7Ozs7Ozs7OztPQVVDO1lBQ0Q7Ozs7O09BS0M7U0FDRixDQUFDO1FBQ0YsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxZQUFZLEVBQUUscUJBQXFCO1FBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQTRCLENBQUM7WUFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBeUQsQ0FBQztZQUN0RSxPQUFPLFlBQVksQ0FBQztnQkFDbEIsTUFBTTtnQkFDTixPQUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLEtBQUs7Z0JBQ0wsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGFydCBwbGFubmVyICsgY2hhcnQgY2FjaGUuXG4gKlxuICogU2VsZi1jb250YWluZWQgY2hhcnQgc3Vic3lzdGVtIHdpdGggdHdvIGxheWVyczpcbiAqXG4gKiAgIDEuIElubmVyIHBsYW5uZXIgYWdlbnQgKHByaXZhdGUpLiBQdXJlIGRhdGFzZXQtaW4gL1xuICogICAgICBgRUNoYXJ0c09wdGlvbmAtb3V0IGJyYWluLiBEcml2ZW4gYnkge0BsaW5rIHByZXBhcmVDaGFydH07XG4gKiAgICAgIGNhbGxlcnMgbmV2ZXIgaW5zdGFudGlhdGUgaXQgZGlyZWN0bHkuXG4gKiAgIDIuIHtAbGluayBwcmVwYXJlQ2hhcnR9OiBvcmNoZXN0cmF0aW9uIG9uIHRvcCBvZiB0aGUgcGxhbm5lci5cbiAqICAgICAgTWludHMgYSBgY2hhcnRJZGAsIGNhY2hlcyBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHJlY29yZFxuICogICAgICBzeW5jaHJvbm91c2x5LCB0aGVuIHJlc29sdmVzIHRoZSBkYXRhc2V0IGFuZCBydW5zIHRoZVxuICogICAgICBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgdGVybWluYWwgZW50cnkgc2V0dGxlcyB3aXRoXG4gKiAgICAgIGVpdGhlciBgcmVzdWx0YCAoc3VjY2Vzcykgb3IgYGVycm9yYCAoZmFpbHVyZSkuIEJvdGhcbiAqICAgICAgdW5kZWZpbmVkIG1lYW5zIHRoZSBlbnRyeSBpcyBzdGlsbCBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBjYWNoZSBzdXJmYWNlICh7QGxpbmsgZmV0Y2hDaGFydH0pIGlzIHRoZSBvbmx5IHN0YXRlIHRoZVxuICogSFRUUCByb3V0ZSBhbmQgdGhlIGNoYXJ0LXByb2R1Y2luZyB0b29scyBzaGFyZS4gYHByZXBhcmVDaGFydGBcbiAqIGlzIGRhdGFzZXQtYWdub3N0aWMgLSBjYWxsZXJzIHN1cHBseSBhIGByZXNvbHZlRGF0YWAgY2FsbGJhY2tcbiAqIHRoYXQgZmV0Y2hlcyB0aGUgcm93cyBob3dldmVyIHRoZXkgbGlrZSAoR2VuaWUgc3RhdGVtZW50LCBpbmxpbmVcbiAqIGRhdGFzZXQsIGN1c3RvbSBBUEkpLiBUaGUgbW9kdWxlIGhhcyBubyBrbm93bGVkZ2Ugb2YgR2VuaWUgb3JcbiAqIHN0YXRlbWVudCBpZHM7IHRob3NlIGNvbmNlcm5zIGxpdmUgaW4gdGhlIHRvb2xzIHRoYXQgd3JhcCBpdC5cbiAqXG4gKiBXaXJlLWZvcm1hdCBzY2hlbWFzIGxpdmUgaW4gYEBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYWAgc29cbiAqIHRoZSBkZW1vIGNsaWVudCBhbmQgYW55IG90aGVyIFVJIGNvbnN1bWVyIHNoYXJlIHRoZSBleGFjdCBzYW1lXG4gKiBzaGFwZSB0aGlzIG1vZHVsZSByZWFkcyBhbmQgd3JpdGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBcHBLaXRFcnJvciwgQ2FjaGVNYW5hZ2VyLCBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGFzeW5jLFxuICBlcnJvcixcbiAgaGFzaCxcbiAganNvbixcbiAgbG9nLFxuICBvYmplY3QsXG4gIHN0cmluZyxcbiAgdHlwZSBCcmFuZENvbnRleHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtYXJrZXIsIHdpcmUsIHR5cGUgQ2hhcnQsIHR5cGUgQ2hhcnRSZXN1bHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7IGNyZWF0ZVRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyByZXNvbHZlVXNlcktleSwgdHlwZSBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2NoYXJ0XCIpO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRUTCBmb3IgY2FjaGVkIGNoYXJ0IGVudHJpZXMuIE9uZSBob3VyIGJhbGFuY2VzIFwibG9uZyBlbm91Z2ggZm9yXG4gKiB0aGUgaG9zdCBVSSB0byBmZXRjaCB0aGUgY2hhcnQgd2VsbCBhZnRlciB0aGUgbW9kZWwgZmluaXNoZWRcbiAqIHRhbGtpbmdcIiBhZ2FpbnN0IFwic2hvcnQgZW5vdWdoIHRoYXQgYWJhbmRvbmVkIGNoYXJ0IGlkcyBkb24ndFxuICogcGluIHN0b3JhZ2VcIi4gTWF0Y2hlcyB0aGUgdHlwaWNhbCBEYXRhYnJpY2tzIE9CTyB0b2tlbiBsaWZldGltZVxuICogc28gYW55IGRhdGEgcmUtcmVzb2x1dGlvbiBzdGF5cyBpbnNpZGUgdGhlIG9yaWdpbmFsIGF1dGggd2luZG93LlxuICovXG5jb25zdCBDSEFSVF9DQUNIRV9UVExfU0VDID0gNjAgKiA2MDtcblxuLyoqIENhY2hlIG5hbWVzcGFjZTsga2VlcHMgdGhlIGNoYXJ0IGtleXNwYWNlIHRpZHkuICovXG5jb25zdCBDSEFSVF9DQUNIRV9OQU1FU1BBQ0UgPSBcIm1hc3RyYTpjaGFydFwiO1xuXG4vKiogRGVmYXVsdCBzZXJ2ZXItc2lkZSBsb25nLXBvbGwgYnVkZ2V0IGZvciB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5jb25zdCBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVMgPSA2MF8wMDA7XG5cbi8qKiBEZWZhdWx0IGludGVyLXBvbGwgc2xlZXAgZm9yIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmNvbnN0IERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVMgPSAyNTA7XG5cbi8qKiBTdGFibGUgdGV4dCBzdG9yZWQgb24gYSBjaGFydCBlbnRyeSB3aG9zZSBwbGFubmVyIHJ1biBmYWlsZWQuICovXG5jb25zdCBDSEFSVF9GQUlMRURfTUVTU0FHRSA9IFwiQ2hhcnQgZ2VuZXJhdGlvbiBmYWlsZWRcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzY2hlbWFzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgc2VyaWVzIGRhdGEgcG9pbnQuIFdpZGUgdmFyaWFudCBzZXQgc28gdGhlIHBsYW5uZXIgYWdlbnQgY2FuXG4gKiBmYWl0aGZ1bGx5IHBhc3MgdGhyb3VnaCB3aGF0ZXZlciB0aGUgU1FMIHJvdyBzZXQgY29udGFpbmVkXG4gKiAobnVtYmVycywgc3RyaW5naWZpZWQgbnVtYmVycywgbnVsbHMgZm9yIG1pc3NpbmcgbWVhc3VyZW1lbnRzLFxuICogYFt4LCB5XWAgdHVwbGVzIGZvciBzY2F0dGVyLCBgW3gsIHksIHZhbHVlXWAgdHJpcGxlcyBmb3IgaGVhdG1hcCxcbiAqIGB7bmFtZSwgdmFsdWV9YCBzbGljZXMgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXApIHdpdGhvdXQgdGhlXG4gKiBzdHJ1Y3R1cmVkLW91dHB1dCBndWFyZCByZWplY3RpbmcgdGhlIHdob2xlIHBsYW4uXG4gKlxuICogVGhyZWUgbGF5ZXJzIG9mIHRvbGVyYW5jZTpcbiAqXG4gKiAgIDEuIHtAbGluayB6LnByZXByb2Nlc3N9IG5vcm1hbGl6ZXMgd2lyZSBzaGFwZXMgQkVGT1JFIHVuaW9uXG4gKiAgICAgIGRpc3BhdGNoOiBzdHJpbmdpZmllZCBudW1iZXJzIHBhcnNlIHRvIG51bWJlcnMsIGZpbml0ZVxuICogICAgICBjaGVja3MgcmVqZWN0IGBOYU5gIC8gYEluZmluaXR5YCwgMi0vMy1lbGVtZW50IGFycmF5cyBjb2VyY2VcbiAqICAgICAgdHVwbGUgY29tcG9uZW50cywgYW5kIGB7dmFsdWV9YCBvYmplY3RzIHdpdGggbWlzc2luZyAvXG4gKiAgICAgIHN0cmluZ2lmaWVkIGB2YWx1ZWAgZ2V0IGNvZXJjZWQgb3IgcmVqZWN0ZWQgdW5pZm9ybWx5LlxuICogICAgICBBbnl0aGluZyBub3QgaGFuZGxlYWJsZSBiZWNvbWVzIGBudWxsYC5cbiAqICAgMi4gVGhlIHVuaW9uIGFjY2VwdHMgYG51bGxgIGFzIGEgZmlyc3QtY2xhc3MgdmFyaWFudC4gRWNoYXJ0c1xuICogICAgICByZW5kZXJzIG51bGwgYXMgYSBnYXAgb24gYmFyIC8gbGluZSAvIGFyZWEgKHdoaWNoIGlzIHRoZVxuICogICAgICByaWdodCB2aXN1YWwgc2lnbmFsIGZvciBcIm1pc3NpbmcgcmVhZGluZ1wiKS4gU2NhdHRlciwgaGVhdG1hcCxcbiAqICAgICAgYW5kIHNsaWNlIGNoYXJ0cyBmaWx0ZXIgbnVsbHMgaW4ge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259XG4gKiAgICAgIGJlY2F1c2UgRWNoYXJ0cyBjcmFzaGVzIG9uIG51bGwgdHVwbGVzIC8gc2xpY2VzLlxuICogICAzLiB7QGxpbmsgei51bmlvbiNjYXRjaH0gYmFja3N0b3BzIHRoZSB3aG9sZSB0aGluZzogaWZcbiAqICAgICAgcHJlcHJvY2VzcyBzb21laG93IHByb2R1Y2VzIGEgc2hhcGUgdGhhdCBzdGlsbCBkb2Vzbid0XG4gKiAgICAgIG1hdGNoIGFueSB2YXJpYW50LCB0aGUgYmFkIGl0ZW0gYmVjb21lcyBgbnVsbGAgaW5zdGVhZCBvZlxuICogICAgICB0YWtpbmcgZG93biB0aGUgZW50aXJlIGNoYXJ0IHdpdGggYVxuICogICAgICBgU3RydWN0dXJlZCBvdXRwdXQgdmFsaWRhdGlvbiBmYWlsZWRgIGVycm9yLlxuICovXG5jb25zdCBjaGFydERhdGFQb2ludFNjaGVtYSA9IHpcbiAgLnByZXByb2Nlc3MoXG4gICAgKHYpID0+IHtcbiAgICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodikgPyB2IDogbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gb2JqZWN0LnRvTnVtYmVyKHYpID8/IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBTY2F0dGVyIGBbeCwgeV1gIG9yIGhlYXRtYXAgYFt4SW5kZXgsIHlJbmRleCwgdmFsdWVdYC4gQ29lcmNlXG4gICAgICAvLyBzdHJpbmdpZmllZCBjb21wb25lbnRzOyByZWplY3QgaWYgYW55IGNvbXBvbmVudCBpcyBub24tZmluaXRlLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgKHYubGVuZ3RoID09PSAyIHx8IHYubGVuZ3RoID09PSAzKSkge1xuICAgICAgICBjb25zdCBudW1zID0gdi5tYXAoKGMpID0+IG9iamVjdC50b051bWJlcihjKSk7XG4gICAgICAgIHJldHVybiBudW1zLmV2ZXJ5KChuKSA9PiBuICE9PSB1bmRlZmluZWQpID8gbnVtcyA6IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiBcInZhbHVlXCIgaW4gdikge1xuICAgICAgICBjb25zdCBvYmogPSB2IGFzIHsgbmFtZT86IHVua25vd247IHZhbHVlOiB1bmtub3duIH07XG4gICAgICAgIGNvbnN0IHZhbCA9IG9iamVjdC50b051bWJlcihvYmoudmFsdWUpO1xuICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDb2VyY2UgbnVtZXJpYyAvIGJvb2xlYW4gLyBudWxsaXNoIG5hbWVzIHRvIHN0cmluZ3Mgc28gYVxuICAgICAgICAvLyBwaWUgc2xpY2Uga2V5ZWQgb24gYSB5ZWFyIChgMjAyNGApIG9yIGNhdGVnb3J5IGlkIGlzXG4gICAgICAgIC8vIGFjY2VwdGVkIHdpdGhvdXQgcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgY2F0Y2ggYXJtLlxuICAgICAgICBjb25zdCByYXdOYW1lID0gb2JqLm5hbWU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmF3TmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhd05hbWUgOiByYXdOYW1lID09IG51bGwgPyBcIlwiIDogU3RyaW5nKHJhd05hbWUpO1xuICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHoudW5pb24oW1xuICAgICAgei5udW1iZXIoKSxcbiAgICAgIHoubnVsbCgpLFxuICAgICAgLy8gYFt4LCB5XWAgc2NhdHRlciBvciBgW3gsIHksIHZhbHVlXWAgaGVhdG1hcCBjZWxsLiBNb2RlbGxlZCBhcyBhXG4gICAgICAvLyBsZW5ndGgtY29uc3RyYWluZWQgaG9tb2dlbmVvdXMgYXJyYXkgcmF0aGVyIHRoYW4gYHoudHVwbGVgOlxuICAgICAgLy8gWm9kIGVtaXRzIGEgdHVwbGUgYXMgSlNPTiBTY2hlbWEgMjAyMC0xMiBgcHJlZml4SXRlbXNgLCBhbmRcbiAgICAgIC8vIERhdGFicmlja3MnIEdlbWluaSBlbmRwb2ludHMgcmVqZWN0IGEgYHJlc3BvbnNlX2pzb25fc2NoZW1hYFxuICAgICAgLy8gY29udGFpbmluZyBpdCAoXCJtdXN0IGJlIGEgYm9vbGVhbiBvciBhbiBvYmplY3RcIiwgc2luY2VcbiAgICAgIC8vIGBpdGVtc2AgaXMgYWJzZW50KS4gYG1pbkl0ZW1zYCAvIGBtYXhJdGVtc2AgKyBgaXRlbXNgIGlzIHdoYXRcbiAgICAgIC8vIGV2ZXJ5IHByb3ZpZGVyIHVuZGVyc3RhbmRzLlxuICAgICAgei5hcnJheSh6Lm51bWJlcigpKS5taW4oMikubWF4KDMpLFxuICAgICAgei5vYmplY3QoeyBuYW1lOiB6LnN0cmluZygpLCB2YWx1ZTogei5udW1iZXIoKSB9KSxcbiAgICBdKSxcbiAgKVxuICAuY2F0Y2gobnVsbCk7XG5cbi8qKiBQZXItc2VyaWVzIG1hcmsgdHlwZSB1c2VkIGJ5IGBjb21ib2AgY2hhcnRzIChiYXIgKyBsaW5lIG92ZXJsYXkpLiAqL1xuY29uc3Qgc2VyaWVzTWFya1R5cGVTY2hlbWEgPSB6XG4gIC51bmlvbihbei5saXRlcmFsKFwiYmFyXCIpLCB6LmxpdGVyYWwoXCJsaW5lXCIpLCB6LmxpdGVyYWwoXCJhcmVhXCIpXSlcbiAgLmRlc2NyaWJlKFxuICAgIFwiTWFyayB0eXBlIGZvciB0aGlzIHNlcmllcy4gUmVxdWlyZWQgZm9yIGBjb21ib2AgKG1peCBiYXIgYW5kIGxpbmUvYXJlYSk7IHVzZSBudWxsIGZvciBvdGhlciBjaGFydCB0eXBlcy5cIixcbiAgKTtcblxuLyoqXG4gKiBDb21wYWN0LCBtb2RlbC1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiBhbiBFY2hhcnRzIHNwZWMuIFRoZVxuICogcGxhbm5lciBhZ2VudCBlbWl0cyB0aGlzOyB7QGxpbmsgcGxhblRvRWNoYXJ0c09wdGlvbn0gZXhwYW5kcyBpdFxuICogaW50byBhIHJlYWwgYEVDaGFydHNPcHRpb25gIEpTT04uIFR3byBsYXllcnMgYmVjYXVzZSBsZXR0aW5nIHRoZVxuICogbW9kZWwgZmlsbCBpbiBhIGZ1bGx5LXR5cGVkIGBFQ2hhcnRzT3B0aW9uYCBpcyBicml0dGxlIChodW5kcmVkc1xuICogb2Ygb3B0aW9uYWwgZmllbGRzLCBkZWVwIHVuaW9ucywgdmVyc2lvbi1kZXBlbmRlbnQgc2hhcGVzKS4gQVxuICogc21hbGwgXCJjaGFydCBwbGFuXCIgc2NoZW1hIGlzIG11Y2ggbW9yZSByZWxpYWJsZSBmb3IgYSBmYXN0IG1vZGVsXG4gKiBhbmQga2VlcHMgYW5pbWF0aW9uIC8gdG9vbHRpcCAvIHN0eWxpbmcgZGVmYXVsdHMgY29uc2lzdGVudFxuICogYWNyb3NzIGNoYXJ0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0UGxhblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgY2hhcnRUeXBlOiB3aXJlLkNoYXJ0VHlwZVNjaGVtYSxcbiAgdGl0bGU6IHpcbiAgICAuc3RyaW5nKClcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIFVzZSBudWxsIHRvIGZhbGwgYmFjayB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgQXhpcyBsYWJlbCBmb3IgdGhlIHByaW1hcnkgKHVzdWFsbHkgYm90dG9tIC8gdmFsdWUpIGF4aXMuXG4gICAgICAgIFVzZWQgZm9yIGJhciAvIGhvcml6b250YWxCYXIgLyBsaW5lIC8gYXJlYSAvIGNvbWJvIC8gd2F0ZXJmYWxsXG4gICAgICAgIC8gc2NhdHRlciAvIGhlYXRtYXA7IHVzZSBudWxsIGZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwIC8gcmFkYXIuXG4gICAgICBgKSxcbiAgICApLFxuICB5QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgQXhpcyBsYWJlbCBmb3IgdGhlIHNlY29uZGFyeSAodXN1YWxseSBsZWZ0KSBheGlzLiBVc2VkIGZvclxuICAgICAgICBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbCAvXG4gICAgICAgIHNjYXR0ZXIgLyBoZWF0bWFwOyB1c2UgbnVsbCBmb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcCAvIHJhZGFyLlxuICAgICAgYCksXG4gICAgKSxcbiAgY2F0ZWdvcmllczogelxuICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgIC5udWxsYWJsZSgpXG4gICAgLmRlZmF1bHQobnVsbClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFByaW1hcnkgY2F0ZWdvcnkgbGFiZWxzLiBGb3IgXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYCAvXG4gICAgICAgIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGB3YXRlcmZhbGxcXGA6IG9uZSBsYWJlbCBwZXJcbiAgICAgICAgZGF0YSBwb2ludC4gRm9yIFxcYGhlYXRtYXBcXGA6IHgtYXhpcyBjYXRlZ29yaWVzLiBGb3IgXFxgcmFkYXJcXGA6XG4gICAgICAgIGluZGljYXRvciBuYW1lcy4gVXNlIG51bGwgZm9yIFxcYHNjYXR0ZXJcXGAgKFxcYFt4LCB5XVxcYCB0dXBsZXMpIGFuZFxuICAgICAgICBzbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGAsIGVhY2ggc2xpY2VcbiAgICAgICAgY2FycmllcyBpdHMgb3duIFxcYG5hbWVcXGApLlxuICAgICAgYCksXG4gICAgKSxcbiAgeUNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBZLWF4aXMgKHJvdykgbGFiZWxzIGZvciBcXGBoZWF0bWFwXFxgLiBVc2UgbnVsbCB3aGVuIHRoZVxuICAgICAgICByb3cgbGFiZWxzIGNvbWUgZnJvbSB0aGUgc2VyaWVzIG5hbWVzLCB3aGljaCBpcyB0aGUgcHJlZmVycmVkXG4gICAgICAgIHdheSB0byBidWlsZCBhIGhlYXRtYXAuIFVzZSBudWxsIGZvciBldmVyeSBvdGhlciBjaGFydCB0eXBlLlxuICAgICAgYCksXG4gICAgKSxcbiAgc2VyaWVzOiB6XG4gICAgLmFycmF5KFxuICAgICAgei5vYmplY3Qoe1xuICAgICAgICBuYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKFxuICAgICAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICAgIExlZ2VuZCBuYW1lIGZvciB0aGlzIHNlcmllcy5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZTogc2VyaWVzTWFya1R5cGVTY2hlbWEubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICAgICAgICB5QXhpc0luZGV4OiB6XG4gICAgICAgICAgLnVuaW9uKFt6LmxpdGVyYWwoMCksIHoubGl0ZXJhbCgxKV0pXG4gICAgICAgICAgLm51bGxhYmxlKClcbiAgICAgICAgICAuZGVmYXVsdChudWxsKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFwiV2hpY2ggeS1heGlzIHRvIGJpbmQgKDAgPSBsZWZ0LCAxID0gcmlnaHQpLiBVc2Ugb24gYGNvbWJvYCB3aGVuIHNlcmllcyBoYXZlIGRpZmZlcmVudCB1bml0cyBvciBzY2FsZXM7IHVzZSBudWxsIG90aGVyd2lzZS5cIixcbiAgICAgICAgICApLFxuICAgICAgICBkYXRhOiB6LmFycmF5KGNoYXJ0RGF0YVBvaW50U2NoZW1hKS5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBEYXRhIHBvaW50cy4gRm9yIGNhdGVnb3J5IGNoYXJ0cyAoXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYFxuICAgICAgICAgICAgLyBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgd2F0ZXJmYWxsXFxgIC8gXFxgcmFkYXJcXGApLFxuICAgICAgICAgICAgYW4gYXJyYXkgb2YgbnVtYmVycyBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGA7IGZvclxuICAgICAgICAgICAgXFxgd2F0ZXJmYWxsXFxgIHRob3NlIG51bWJlcnMgYXJlIHNpZ25lZCBkZWx0YXMgKG9uZSBzZXJpZXNcbiAgICAgICAgICAgIG9ubHkgLSBuZXZlciBhIGN1bXVsYXRpdmUgYmFzZSBzZXJpZXMpLiBGb3IgXFxgaGVhdG1hcFxcYCxcbiAgICAgICAgICAgIG9uZSBzZXJpZXMgcGVyIG1hdHJpeCByb3csIGhvbGRpbmcgdGhhdCByb3cncyBudW1iZXJzXG4gICAgICAgICAgICBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGAuIEZvciBcXGBzY2F0dGVyXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgXFxgW3gsIHldXFxgIG51bWVyaWMgdHVwbGVzLiBGb3IgXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC9cbiAgICAgICAgICAgIFxcYHRyZWVtYXBcXGAsIGFuIGFycmF5IG9mIFxcYHtuYW1lLCB2YWx1ZX1cXGAgb2JqZWN0cy5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIClcbiAgICAuZGVmYXVsdChbXSlcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIE9uZSBvciBtb3JlIHNlcmllcyB0byBwbG90LiBSZXF1aXJlZCBmb3IgZXZlcnkgY2hhcnQgdHlwZVxuICAgICAgICBleGNlcHQgXFxgY3VzdG9tXFxgLCB3aGljaCBjYXJyaWVzIGl0cyBzZXJpZXMgaW5zaWRlIFxcYG9wdGlvblxcYC5cbiAgICAgICAgU2xpY2UgY2hhcnRzIChcXGBwaWVcXGAgLyBcXGBmdW5uZWxcXGAgLyBcXGB0cmVlbWFwXFxgKSBhbmRcbiAgICAgICAgXFxgd2F0ZXJmYWxsXFxgIC8gXFxgaGVhdG1hcFxcYCB1c2UgZXhhY3RseSBvbmUgc2VyaWVzOyBcXGBiYXJcXGAgL1xuICAgICAgICBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgcmFkYXJcXGAgLyBcXGBzY2F0dGVyXFxgIGNhblxuICAgICAgICBjYXJyeSBtdWx0aXBsZSBzZXJpZXMuXG4gICAgICBgKSxcbiAgICApLFxuICBvcHRpb246IHpcbiAgICAuc3RyaW5nKClcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBSZXF1aXJlZCBmb3IgXFxgY3VzdG9tXFxgOyB1c2UgbnVsbCBmb3IgZXZlcnkgb3RoZXIgY2hhcnQgdHlwZS4gQVxuICAgICAgICBDT01QTEVURSBFY2hhcnRzIG9wdGlvbiwgYXMgYSBKU09OIG9iamVjdCBlbmNvZGVkIGluIGEgc3RyaW5nOlxuICAgICAgICBcXGBzZXJpZXNcXGAgKGVhY2ggd2l0aCBpdHMgb3duIFxcYHR5cGVcXGAgYW5kIHRoYXQgc2VyaWVzJyBvd24gZGF0YVxuICAgICAgICBzaGFwZSkgcGx1cyB3aGF0ZXZlciBlbHNlIHRoZSBjaGFydCBuZWVkcyAtIGEgY29vcmRpbmF0ZSBzeXN0ZW0sXG4gICAgICAgIFxcYHZpc3VhbE1hcFxcYCwgYXhlcy4gUGxhaW4gSlNPTiB2YWx1ZXMgb25seSwgbmV2ZXIgYSBKYXZhU2NyaXB0XG4gICAgICAgIGZ1bmN0aW9uLiBBIGNlbnRlcmVkIHRpdGxlIGlzIGZpbGxlZCBpbiB3aGVuIHRoZSBvYmplY3Qgb21pdHNcbiAgICAgICAgb25lLlxuICAgICAgYCksXG4gICAgKSxcbn0pO1xuXG50eXBlIENoYXJ0UGxhbiA9IHouaW5mZXI8dHlwZW9mIGNoYXJ0UGxhblNjaGVtYT47XG50eXBlIENoYXJ0UGxhbklucHV0ID0gei5pbnB1dDx0eXBlb2YgY2hhcnRQbGFuU2NoZW1hPjtcblxuLyoqXG4gKiBDYW5vbmljYWwgcGxhbm5lciBpbnB1dCBzaGFwZS4gVG9vbHMgdGhhdCBzb3VyY2Ugcm93cyBmcm9tIGFuXG4gKiBpbmxpbmUgZGF0YXNldCAoYHJlbmRlcl9kYXRhYCkgdXNlIGl0IGFzIHRoZWlyIGBpbnB1dFNjaGVtYWBcbiAqIHZlcmJhdGltOyB0b29scyB0aGF0IHJlc29sdmUgcm93cyBmcm9tIGEgcmVtb3RlIChgcHJlcGFyZV9jaGFydGBcbiAqIG92ZXIgYSBHZW5pZSBzdGF0ZW1lbnQpIGBvbWl0KHsgZGF0YSB9KWAgYW5kIGBleHRlbmRgIHdpdGggdGhlaXJcbiAqIG93biBpZGVudGlmaWVyIGZpZWxkLCBzbyB0aGUgZmllbGQtbGV2ZWwgYC5kZXNjcmliZSgpYCB0ZXh0XG4gKiBzdGF5cyBhIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguIFNlcnZlci1vbmx5IC0gdGhlIFVJIG5ldmVyXG4gKiBzZWVzIGEgcGxhbm5lciByZXF1ZXN0LCBvbmx5IHRoZSByZXNvbHZlZCB7QGxpbmsgQ2hhcnR9LlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdGl0bGU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXG4gICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBDb25jaXNlIHRpdGxlIHNob3duIGFib3ZlIHRoZSBjaGFydCAoZS5nLiBcIlRvcCAxMCBTS1VzIGJ5IFJldmVudWVcIikuXG4gICAgICBgKSxcbiAgKSxcbiAgZGVzY3JpcHRpb246IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgT25lLWxpbmUgaW50ZW50IHRoZSBjaGFydC1wbGFubmVyIHVzZXMgd2hlbiBwaWNraW5nIGEgY2hhcnQgdHlwZVxuICAgICAgICBhbmQgYXhpcyBlbmNvZGluZ3MgKGUuZy4gXCJjb21wYXJlIHF1YXJ0ZXJseSByZXZlbnVlIGFjcm9zc1xuICAgICAgICByZWdpb25zXCIsIFwiaGlnaGxpZ2h0IHRoZSBzdGVlcCBkcm9wIGFmdGVyIHBvc2l0aW9uIDVcIikuIE5vdCBzaG93blxuICAgICAgICB0byB0aGUgdXNlci5cbiAgICAgIGApLFxuICAgICksXG4gIGRhdGE6IHpcbiAgICAuYXJyYXkoei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpKVxuICAgIC5ub25lbXB0eShcIkRhdGEgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSByb3dcIilcbiAgICAucmVhZG9ubHkoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgVGFidWxhciBkYXRhc2V0IHRvIGNoYXJ0LiBPbmUgb2JqZWN0IHBlciByb3csIGtleWVkIGJ5IGNvbHVtblxuICAgICAgICBuYW1lLiBWYWx1ZXMgbWF5IGJlIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLCBvciBudWxsLiBUaGVcbiAgICAgICAgY2hhcnQtcGxhbm5lciBkZWNpZGVzIHdoaWNoIGNvbHVtbnMgYXJlIGNhdGVnb3JpZXMgdnMuIG51bWVyaWNcbiAgICAgICAgc2VyaWVzLiBDYXAgYXQgYSBmZXcgaHVuZHJlZCByb3dzIGZvciBsZWdpYmlsaXR5OyBzYW1wbGUgL1xuICAgICAgICBhZ2dyZWdhdGUgbGFyZ2VyIGRhdGFzZXRzIGZpcnN0LlxuICAgICAgYCksXG4gICAgKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBDaGFydFBsYW5uZXJSZXF1ZXN0ID0gei5pbmZlcjx0eXBlb2YgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYT47XG5cbi8qKlxuICogQWdlbnQtZmFjaW5nIHJlc3VsdCBvZiBlaXRoZXIgY2hhcnQtcHJvZHVjaW5nIHRvb2wuXG4gKlxuICogYG1hcmtlcmAgaXMgZGVsaWJlcmF0ZWx5IHJlZHVuZGFudCB3aXRoIGBjaGFydElkYDogdGhlIGhvc3Qgc3RpbGwga2V5cyB0aGVcbiAqIGNhY2hlIGJ5IGlkLCB3aGlsZSB0aGUgbW9kZWwgZ2V0cyB0aGUgZXhhY3Qgb3BhcXVlIHRva2VuIHRvIGNvcHkgaW50byBwcm9zZVxuICogYW5kIGhhcyBubyByZWFzb24gdG8gaW52ZW50IG9yIHJldHlwZSBhIFVVSUQuXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFRvb2xPdXRwdXRTY2hlbWEgPSB3aXJlLkNoYXJ0U2NoZW1hLnBpY2soeyBjaGFydElkOiB0cnVlIH0pLmV4dGVuZCh7XG4gIG1hcmtlcjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiRXhhY3QgZW1iZWQgbWFya2VyLiBDb3B5IHRoaXMgY29tcGxldGUgdmFsdWUgdmVyYmF0aW0gb250byBpdHMgb3duIGxpbmU7IG5ldmVyIGNvbnN0cnVjdCBhIG1hcmtlciBmcm9tIGNoYXJ0SWQuXCIsXG4gICAgKSxcbn0pO1xuXG4vKiogUmVzdWx0IHJldHVybmVkIHN5bmNocm9ub3VzbHkgd2hpbGUgY2hhcnQgcGxhbm5pbmcgY29udGludWVzIGluIHRoZSBiYWNrZ3JvdW5kLiAqL1xuZXhwb3J0IHR5cGUgQ2hhcnRUb29sT3V0cHV0ID0gei5pbmZlcjx0eXBlb2YgY2hhcnRUb29sT3V0cHV0U2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgaW5zdHJ1Y3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEZvcm1hdCB7QGxpbmsgd2lyZS5DaGFydFR5cGVTY2hlbWF9J3MgdmFyaWFudHMgYXMgYSBzaW5nbGVcbiAqIGh1bWFuLWZyaWVuZGx5IHN0cmluZyBvZiBgYCBgPHZhbHVlPmAgZm9yIDxkZXNjcmlwdGlvbj4gYGBcbiAqIGNsYXVzZXMgam9pbmVkIGJ5IHNlbWljb2xvbnMsIGRyYXduIGZyb20gZWFjaCB2YXJpYW50J3Mgb3duXG4gKiBgLmRlc2NyaWJlKClgIHNvIHRoZSBwbGFubmVyIHByb21wdCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aFxuICogdGhlIHNjaGVtYSBieSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdENoYXJ0VHlwZVBpY2tlcigpOiBzdHJpbmcge1xuICByZXR1cm4gd2lyZS5DaGFydFR5cGVTY2hlbWEub3B0aW9uc1xuICAgIC5tYXAoKG9wdCkgPT4gYFxcYCR7b3B0LnZhbHVlfVxcYCBmb3IgJHtvcHQuZGVzY3JpcHRpb24gPz8gXCJcIn1gKVxuICAgIC5qb2luKFwiOyBcIik7XG59XG5cbi8qKlxuICogU3lzdGVtIHByb21wdCBmb3IgdGhlIGlubmVyIGNoYXJ0LXBsYW5uaW5nIGFnZW50LiBUdW5lZCBmb3IgYVxuICogZmFzdC10aWVyIG1vZGVsIChIYWlrdSwgR1BULTUtbWluaSwgR2VtaW5pIEZsYXNoIExpdGUpLlxuICovXG5jb25zdCBDSEFSVF9QTEFOTkVSX0lOU1RSVUNUSU9OUyA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgWW91IGRlc2lnbiBBcGFjaGUgRWNoYXJ0cyB2aXN1YWxpemF0aW9ucy4gVGhlIHVzZXIgZ2l2ZXMgeW91IGFcbiAgdGFidWxhciBkYXRhc2V0IChyb3dzIG9mIG9iamVjdHMpIHBsdXMgYSB0aXRsZSBhbmQgYW4gb3B0aW9uYWxcbiAgZGVzY3JpcHRpb24gb2YgdGhlIGludGVudC4gWW91IHByb2R1Y2UgYSBzbWFsbCBjaGFydCBwbGFuIChjaGFydFxuICB0eXBlLCBheGlzIGxhYmVscywgY2F0ZWdvcmllcywgc2VyaWVzKSB0aGF0IGJlc3QgY29udmV5cyB0aGUgZGF0YS5cblxuICBEZWNpc2lvbiBndWlkZS4gUGljayB0aGUgY2hhcnQgdHlwZSB3aG9zZSBkYXRhIHNoYXBlIG1hdGNoZXMgdGhlXG4gIGRhdGFzZXQgYW5kIHRoZSB1c2VyJ3MgaW50ZW50OiAke2Zvcm1hdENoYXJ0VHlwZVBpY2tlcigpfS5cblxuICBXaGVuIGluIGRvdWJ0IGJldHdlZW4gYmFyIGFuZCBsaW5lLCBwcmVmZXIgYmFyIGZvciB1bm9yZGVyZWRcbiAgY2F0ZWdvcmllcyBhbmQgbGluZSBmb3Igb3JkZXJlZCBvbmVzIChkYXRlcywgdGltZSBidWNrZXRzLCByYW5rcykuXG4gIFByZWZlciBcXGBob3Jpem9udGFsQmFyXFxgIHdoZW4gY2F0ZWdvcnkgbGFiZWxzIGFyZSBsb25nLiBQcmVmZXJcbiAgXFxgY29tYm9cXGAgd2hlbiBvbmUgbWVhc3VyZSBpcyBhIGNvdW50L3ZvbHVtZSBhbmQgYW5vdGhlciBpcyBhXG4gIHJhdGUvdHJlbmQuIFByZWZlciBcXGB3YXRlcmZhbGxcXGAgZm9yIGJyaWRnZXMgb2Ygc2lnbmVkIGRlbHRhcy5cbiAgUHJlZmVyIFxcYHNjYXR0ZXJcXGAgd2hlbiBjb3JyZWxhdGluZyB0d28gbnVtZXJpYyBmaWVsZHMgKG5vXG4gIGNhdGVnb3J5IGF4aXMpLiBQcmVmZXIgXFxgaGVhdG1hcFxcYCBmb3IgYSBjYXRlZ29yeSB4IGNhdGVnb3J5XG4gIG1hdHJpeC4gUHJlZmVyIFxcYHJhZGFyXFxgIGZvciBzY29yaW5nIHRoZSBzYW1lIGVudGl0aWVzIGFjcm9zcyBhXG4gIGZpeGVkIHNldCBvZiBkaW1lbnNpb25zLiBOZXZlciBwaWNrIHBpZSBmb3IgbW9yZSB0aGFuIDcgc2xpY2VzXG4gICh1c2UgXFxgdHJlZW1hcFxcYCBpbnN0ZWFkKS4gUHJlZmVyIFxcYGZ1bm5lbFxcYCBmb3Igb3JkZXJlZCBjb252ZXJzaW9uXG4gIHN0YWdlcy5cblxuICBGb3IgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGw6IHBpY2sgb25lXG4gIGNvbHVtbiBhcyB0aGUgY2F0ZWdvcnkgYXhpcyAodXN1YWxseSB0aGUgb25seSBzdHJpbmctdmFsdWVkIGNvbHVtbilcbiAgYW5kIG9uZSBvciBtb3JlIG51bWVyaWMgY29sdW1ucyBhcyBzZXJpZXMuIFNvcnQgY2F0ZWdvcmllcyBieSB0aGVcbiAgcHJpbWFyeSBzZXJpZXMgdmFsdWUgZGVzY2VuZGluZyB1bmxlc3MgdGhlIGRhdGEgaXMgbmF0dXJhbGx5IG9yZGVyZWRcbiAgKGRhdGVzLCByYW5rcywgZnVubmVsIHN0YWdlcywgd2F0ZXJmYWxsIHN0ZXBzKS4gRm9yIFxcYGNvbWJvXFxgLCBzZXRcbiAgZWFjaCBzZXJpZXMnIFxcYHR5cGVcXGAgdG8gXFxgYmFyXFxgLCBcXGBsaW5lXFxgLCBvciBcXGBhcmVhXFxgLCBhbmQgdXNlXG4gIFxcYHlBeGlzSW5kZXg6IDFcXGAgd2hlbiBhIHNlcmllcyBuZWVkcyBhIHNlY29uZCBzY2FsZS5cblxuICBGb3Igd2F0ZXJmYWxsLCBlbWl0IGV4YWN0bHkgT05FIHNlcmllcyBob2xkaW5nIHRoZSBzaWduZWQgc3RlcCB2YWx1ZXNcbiAgKGRlbHRhcyksIG9uZSBwZXIgY2F0ZWdvcnksIGluIG9yZGVyIC0gcG9zaXRpdmUgZm9yIGEgcmlzZSwgbmVnYXRpdmVcbiAgZm9yIGEgZHJvcC4gRG8gTk9UIGFkZCBhIGN1bXVsYXRpdmUgLyBydW5uaW5nLXRvdGFsIC8gYmFzZSBzZXJpZXMgYW5kXG4gIGRvIE5PVCBjb252ZXJ0IHRoZSBkZWx0YXMgaW50byBydW5uaW5nIHRvdGFscyB5b3Vyc2VsZjsgdGhlIHJ1bm5pbmdcbiAgdG90YWwgaXMgY29tcHV0ZWQgZm9yIHlvdSwgYW5kIGEgaGFuZC1idWlsdCBiYXNlIHNlcmllcyByZW5kZXJzIGFzIGFcbiAgcGxhaW4gYmFyIGNoYXJ0IGluc3RlYWQgb2YgYSBicmlkZ2UuXG5cbiAgRm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXA6IHBpY2sgdGhlIGNhdGVnb3J5IGNvbHVtbiBmb3Igc2xpY2UgbmFtZXNcbiAgYW5kIG9uZSBudW1lcmljIGNvbHVtbiBmb3Igc2xpY2UgdmFsdWVzLiBFbWl0IGEgc2luZ2xlIHNlcmllcyBvZlxuICBcXGB7bmFtZSwgdmFsdWV9XFxgIG9iamVjdHMuXG5cbiAgRm9yIHNjYXR0ZXI6IHBpY2sgdHdvIG51bWVyaWMgY29sdW1ucyBhbmQgZW1pdCBcXGBbeCwgeV1cXGAgdHVwbGVzIGluXG4gIG9uZSBvciBtb3JlIHNlcmllcyAob25lIHNlcmllcyBwZXIgZ3JvdXAgaWYgYSBncm91cGluZyBjb2x1bW4gZXhpc3RzKS5cblxuICBGb3IgaGVhdG1hcDogcGljayB0d28gY2F0ZWdvcnkgY29sdW1ucyBhbmQgb25lIG51bWVyaWMgbWVhc3VyZS4gUHV0XG4gIHRoZSB4LWF4aXMgY2F0ZWdvcmllcyBpbiBcXGBjYXRlZ29yaWVzXFxgLCB0aGVuIGVtaXQgT05FIFNFUklFUyBQRVIgUk9XXG4gIG9mIHRoZSBtYXRyaXggLSB0aGUgc2VyaWVzIFxcYG5hbWVcXGAgaXMgdGhlIHJvdyBsYWJlbCBhbmQgXFxgZGF0YVxcYCBpc1xuICB0aGUgcm93J3MgbnVtYmVycywgb25lIHBlciBlbnRyeSBpbiBcXGBjYXRlZ29yaWVzXFxgLCBpbiB0aGUgc2FtZSBvcmRlci5cbiAgRG8gbm90IGNvbXB1dGUgY2VsbCBpbmRpY2VzLlxuXG4gIEZvciByYWRhcjogXFxgY2F0ZWdvcmllc1xcYCBhcmUgdGhlIGluZGljYXRvciBuYW1lczsgZWFjaCBzZXJpZXMgaXMgYW5cbiAgYXJyYXkgb2YgbnVtYmVycyAob25lIHZhbHVlIHBlciBpbmRpY2F0b3IpLlxuXG4gIEZvciBhbnl0aGluZyB0aGUgdHlwZXMgYWJvdmUgY2Fubm90IGV4cHJlc3MgLSBhIHNhbmtleSwgYm94cGxvdCxcbiAgY2FuZGxlc3RpY2ssIHN1bmJ1cnN0LCBnYXVnZSwgbmV0d29yayBncmFwaCwgY2FsZW5kYXIsIHBhcmFsbGVsLVxuICBjb29yZGluYXRlcyBwbG90LCBvciBhbnkgb3RoZXIgRWNoYXJ0cyBzZXJpZXMgLSB1c2UgXFxgY3VzdG9tXFxgIGFuZFxuICBoYW5kLXdyaXRlIHRoZSB3aG9sZSBFY2hhcnRzIG9wdGlvbiBpbnRvIFxcYG9wdGlvblxcYCBhcyBhIEpTT04gc3RyaW5nLlxuICBJbmNsdWRlIGV2ZXJ5IHBhcnQgdGhhdCBjaGFydCBuZWVkczogdGhlIHNlcmllcyB3aXRoIHRoZWlyIG93blxuICBcXGB0eXBlXFxgIGFuZCBkYXRhIHNoYXBlLCBwbHVzIGFueSBjb29yZGluYXRlIHN5c3RlbSwgXFxgdmlzdWFsTWFwXFxgLFxuICBvciBheGVzLiBMZWF2ZSBcXGBzZXJpZXNcXGAsIFxcYGNhdGVnb3JpZXNcXGAsIGFuZCB0aGUgYXhpcyBsYWJlbHMgb3V0O1xuICB0aGV5IGFyZSBpZ25vcmVkIGZvciBcXGBjdXN0b21cXGAuIFByZWZlciBhIGxpc3RlZCB0eXBlIHdoZW5ldmVyIG9uZVxuICBnZW51aW5lbHkgZml0cyAtIFxcYGN1c3RvbVxcYCBnaXZlcyB1cCB0aGUgc2hhcmVkIHRvb2x0aXAsIGxlZ2VuZCwgYW5kXG4gIGdyaWQgZGVmYXVsdHMsIHNvIGl0IGlzIHRoZSBhbnN3ZXIgZm9yIGFuIHVuc3VwcG9ydGVkIGNoYXJ0IHNoYXBlLFxuICBub3QgYSB3YXkgdG8gcmVzdHlsZSBhIHN1cHBvcnRlZCBvbmUuXG5cbiAgS2VlcCBzZXJpZXMgbmFtZXMgaHVtYW4tcmVhZGFibGUgKHVzZSB0aGUgY29sdW1uIG5hbWU7IHRpdGxlIGNhc2UgaXRcbiAgbGlnaHRseSBpZiBuZWVkZWQpLiBLZWVwIHRpdGxlcyBjb25jaXNlOyBkbyBub3QgcmVwZWF0IHRoZSB1c2VyJ3NcbiAgdGl0bGUgaW4geEF4aXNMYWJlbCAvIHlBeGlzTGFiZWwuXG5gKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGxhbm5lciBhZ2VudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSBwbGFubmVyIGBBZ2VudGAgcGVyIHBsdWdpbiBjb25maWcuIENhY2hlZCBvbiBjb25maWcgb2JqZWN0XG4gKiBpZGVudGl0eSBzbyBjYWxsZXJzIGNhbiBgcHJlcGFyZUNoYXJ0KHsgY29uZmlnLCAuLi4gfSlgIGZyb20gYVxuICogaG90IHBhdGggd2l0aG91dCBwYXlpbmcgdGhlIEFnZW50LWNvbnN0cnVjdG9yIGNvc3QgZXZlcnkgY2FsbC5cbiAqIGBXZWFrTWFwYCBsZXRzIHJldGlyZWQgY29uZmlncyAoZS5nLiB0ZXN0IHJlY29uZmlndXJhdGlvbnMpXG4gKiByZWxlYXNlIHRoZWlyIGFnZW50IHdpdGhvdXQgbWFudWFsIGV2aWN0aW9uLlxuICovXG5jb25zdCBwbGFubmVyQWdlbnRzID0gbmV3IFdlYWtNYXA8TWFzdHJhUGx1Z2luQ29uZmlnLCBBZ2VudD4oKTtcblxuZnVuY3Rpb24gZ2V0UGxhbm5lckFnZW50KGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogQWdlbnQge1xuICBsZXQgYWdlbnQgPSBwbGFubmVyQWdlbnRzLmdldChjb25maWcpO1xuICBpZiAoIWFnZW50KSB7XG4gICAgYWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgICAgaWQ6IFwiY2hhcnRfcGxhbm5lclwiLFxuICAgICAgbmFtZTogXCJDaGFydCBQbGFubmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJQaWNrcyBjaGFydCB0eXBlIGFuZCBheGlzIGVuY29kaW5ncyBmb3IgYSBkYXRhc2V0LlwiLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBDSEFSVF9QTEFOTkVSX0lOU1RSVUNUSU9OUyxcbiAgICAgIG1vZGVsOiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PlxuICAgICAgICBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQsIHsgbW9kZWxDbGFzczogbW9kZWwuTW9kZWxDbGFzcy5DaGF0RmFzdCB9KSxcbiAgICB9KTtcbiAgICBwbGFubmVyQWdlbnRzLnNldChjb25maWcsIGFnZW50KTtcbiAgfVxuICByZXR1cm4gYWdlbnQ7XG59XG5cbi8qKlxuICogUnVuIHRoZSBwbGFubmVyIGFnYWluc3QgYHJlcXVlc3RgIGFuZCByZXR1cm4gdGhlIHJlc29sdmVkXG4gKiBFY2hhcnRzIHNwZWMuIFRocm93cyBvbiBwbGFubmVyIGZhaWx1cmUgLSB7QGxpbmsgcHJlcGFyZUNoYXJ0fVxuICogY2F0Y2hlcyBhbmQgc3Rhc2hlcyB0aGUgZXJyb3IgaW4gdGhlIGNhY2hlIGVudHJ5LlxuICovXG5hc3luYyBmdW5jdGlvbiBydW5DaGFydFBsYW5uZXIoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICByZXF1ZXN0OiBDaGFydFBsYW5uZXJSZXF1ZXN0LFxuICBvcHRpb25zOiB7IHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQ7IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwgfSA9IHt9LFxuKTogUHJvbWlzZTxDaGFydFJlc3VsdD4ge1xuICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSB9ID0gcmVxdWVzdDtcbiAgY29uc3QgeyByZXF1ZXN0Q29udGV4dCwgYWJvcnRTaWduYWwgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHByb21wdCA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKHtcbiAgICBUaXRsZTogdGl0bGUsXG4gICAgLi4uKGRlc2NyaXB0aW9uID8geyBEZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICBcIkRhdGFzZXQgKEpTT04sIG9uZSByb3cgcGVyIG9iamVjdClcIjogSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMiksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRQbGFubmVyQWdlbnQoY29uZmlnKS5nZW5lcmF0ZShwcm9tcHQsIHtcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiB7IHNjaGVtYTogY2hhcnRQbGFuU2NoZW1hIH0sXG4gICAgLi4uKHJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgIC4uLihhYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWwgfSA6IHt9KSxcbiAgfSk7XG4gIGNvbnN0IHBsYW4gPSBjaGFydFBsYW5TY2hlbWEucGFyc2UocmVzdWx0Lm9iamVjdCk7XG4gIGNvbnN0IG9wdGlvbiA9IHBsYW5Ub0VjaGFydHNPcHRpb24ocGxhbiwgdGl0bGUsIGNvbmZpZy5icmFuZCk7XG4gIHJldHVybiB7IGNoYXJ0VHlwZTogcGxhbi5jaGFydFR5cGUsIG9wdGlvbiB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2FjaGUgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIGNhY2hlIGtleSBmb3IgYSBgY2hhcnRJZGAgb3duZWQgYnkgYHVzZXJLZXlgLlxuICpcbiAqIFRoZSBpZGVudGl0eSBpcyBwYXJ0IG9mIHRoZSBrZXksIG5vdCBhIGZpbHRlciBhcHBsaWVkIGFmdGVyIHRoZSByZWFkLCBzbyBhXG4gKiBjaGFydCBpZCBndWVzc2VkIG9yIGNvcGllZCBmcm9tIGFub3RoZXIgdXNlcidzIHRyYW5zY3JpcHQgcmVzb2x2ZXMgdG8gYVxuICogZGlmZmVyZW50IGtleSBhbmQgc2ltcGx5IG1pc3Nlcy4gVGhhdCBtaXNzIGlzIHdoYXQgdGhlIEhUVFAgcm91dGUgdHVybnMgaW50b1xuICogYSA0MDQsIHdoaWNoIGlzIGFsc28gdGhlIGFuc3dlciB0aGF0IGxlYWtzIHRoZSBsZWFzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hhcnRDYWNoZUtleShjaGFydElkOiBzdHJpbmcsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiAoYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpLmdlbmVyYXRlS2V5KFtDSEFSVF9DQUNIRV9OQU1FU1BBQ0UsIGNoYXJ0SWRdLCB1c2VyS2V5KTtcbn1cblxuLyoqXG4gKiBQZXJzaXN0IGEge0BsaW5rIENoYXJ0fSBlbnRyeSB1bmRlciBpdHMgYGNoYXJ0SWRgLCBvd25lZCBieSBgdXNlcktleWAuXG4gKiBSZWZyZXNoZXMgdGhlIFRUTCBvbiBldmVyeSB3cml0ZS4gQ2FjaGUtbGF5ZXIgZmFpbHVyZXMgYXJlIGxvZ2dlZCBhbmRcbiAqIHN3YWxsb3dlZCBzbyBiYWNrZ3JvdW5kIHJ1bm5lcnMgbmV2ZXIgdGhyb3cgaW50byB0aGVcbiAqIHVuaGFuZGxlZC1yZWplY3Rpb24gc3RyZWFtLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNoYXJ0KGVudHJ5OiBDaGFydCwgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2hhcnRDYWNoZUtleShlbnRyeS5jaGFydElkLCB1c2VyS2V5KTtcbiAgICBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuc2V0KGtleSwgZW50cnksIHtcbiAgICAgIHR0bDogQ0hBUlRfQ0FDSEVfVFRMX1NFQyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJ3cml0ZS1lcnJvclwiLCB7XG4gICAgICBjaGFydElkOiBlbnRyeS5jaGFydElkLFxuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTG9vayB1cCBhIGNoYXJ0IGB1c2VyS2V5YCBvd25zLiBSZXR1cm5zIGB1bmRlZmluZWRgIG9uIG1pc3MsIG9uXG4gKiBleHBpcnksIHdoZW4gYW5vdGhlciBpZGVudGl0eSBvd25zIHRoZSBpZCwgb3Igd2hlbiB0aGUgY2FjaGUgbGF5ZXIgaXNcbiAqIHVuaGVhbHRoeSAtIG5ldmVyIHRocm93cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZENoYXJ0KGNoYXJ0SWQ6IHN0cmluZywgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTxDaGFydCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNoYXJ0Q2FjaGVLZXkoY2hhcnRJZCwgdXNlcktleSk7XG4gICAgY29uc3QgdiA9IGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5nZXQ8Q2hhcnQ+KGtleSk7XG4gICAgcmV0dXJuIHYgPz8gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcInJlYWQtZXJyb3JcIiwge1xuICAgICAgY2hhcnRJZCxcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlQ2hhcnQgb3JjaGVzdHJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogSW5wdXRzIHRvIHtAbGluayBwcmVwYXJlQ2hhcnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlQ2hhcnRPcHRpb25zIHtcbiAgLyoqIFBsdWdpbiBjb25maWc7IHJlc29sdmVzIHRoZSBwbGFubmVyIGFnZW50J3MgbW9kZWwuICovXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICAvKipcbiAgICogSWRlbnRpdHkgdGhhdCBvd25zIHRoZSBtaW50ZWQgY2hhcnQuIE9ubHkgYSB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbFxuICAgKiBjYXJyeWluZyB0aGUgc2FtZSBrZXkgcmVzb2x2ZXMgaXQuIFVzZSB7QGxpbmsgcmVzb2x2ZVVzZXJLZXl9LlxuICAgKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKiogRGlzcGxheSB0aXRsZSBmb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQuICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaW50ZW50IGhpbnQgZm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50LiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByb3dzIHRvIGNoYXJ0LiBDYWxsZWQgb25jZSwgaW4gdGhlIGJhY2tncm91bmQuXG4gICAqIEFueSB0aHJvd24gZXJyb3IgbGFuZHMgaW4gdGhlIGNhY2hlIGFzIHRoZSBlbnRyeSdzIGBlcnJvcmBcbiAgICogZmllbGQgKG5ldmVyIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlciBvZiB7QGxpbmsgcHJlcGFyZUNoYXJ0fSkuXG4gICAqIEFuIGVtcHR5IGByb3dzYCBhcnJheSBpcyByZWplY3RlZCBhcyBgXCJkYXRhc2V0IGhhcyBubyByb3dzO1xuICAgKiBub3RoaW5nIHRvIGNoYXJ0XCJgLlxuICAgKi9cbiAgcmVzb2x2ZURhdGE6IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTx7IHJvd3M6IFJlYWRvbmx5QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IH0+O1xuICAvKipcbiAgICogUGVyLXJlcXVlc3QgYFJlcXVlc3RDb250ZXh0YC4gRm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50IHNvXG4gICAqIHVzZXItc2NvcGVkIG1vZGVsIHJlc29sdXRpb24gKE9CTykgc3RheXMgaW4gZWZmZWN0LlxuICAgKi9cbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgLyoqXG4gICAqIENvb3BlcmF0aXZlIGNhbmNlbGxhdGlvbi4gRm9yd2FyZGVkIHRvIGByZXNvbHZlRGF0YWAgYW5kIHRoZVxuICAgKiBwbGFubmVyIGFnZW50LiBOb3RlOiB0aGUgY2hhcnQgdGFzayBjb250aW51ZXMgcnVubmluZyBpbiB0aGVcbiAgICogYmFja2dyb3VuZCBhZnRlciB0aGUgcGFyZW50IHJlcXVlc3QgZW5kcywgc28gZXh0ZXJuYWwgYWJvcnRcbiAgICogc2lnbmFscyBhcmUgYmVzdC1lZmZvcnQ7IHR5cGljYWwgdXNlIGlzIHRvIGxlYXZlIHRoaXMgdW5zZXRcbiAgICogYW5kIGxldCB0aGUgMWggVFRMIGNhcCBzdGFsZSBlbnRyaWVzLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogTWludCBhIGBjaGFydElkYCwgY2FjaGUgYW4gZW1wdHkgYHsgY2hhcnRJZCB9YCBwbGFjZWhvbGRlclxuICogc3luY2hyb25vdXNseSwgYW5kIGtpY2sgb2ZmIGEgYmFja2dyb3VuZCB0YXNrIHRoYXQgcmVzb2x2ZXMgdGhlXG4gKiBkYXRhc2V0IGFuZCBydW5zIHRoZSBwbGFubmVyLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgb25jZSB0aGVcbiAqIHBsYWNlaG9sZGVyIGxhbmRzIHNvIHRoZSBmaXJzdCB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbCBhbHdheXNcbiAqIHNlZXMgYW4gZW50cnkgKG5vIHNwdXJpb3VzIDQwNCByYWNlKS5cbiAqXG4gKiBUaGUgYmFja2dyb3VuZCB0YXNrIHN3YWxsb3dzIGl0cyBvd24gZmFpbHVyZXMgYW5kIHdyaXRlcyB0aGVtXG4gKiBhcyBgZXJyb3JgIGVudHJpZXMsIHNvIGNhbGxlcnMgbmV2ZXIgc2VlIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAqIENhY2hlIHN0YXRlIG1hY2hpbmU6XG4gKlxuICogICAtIGp1c3QgYWZ0ZXIgdGhpcyBjYWxsIHJldHVybnM6IGB7IGNoYXJ0SWQgfWAgKHByb2Nlc3NpbmcpXG4gKiAgIC0gb24gcGxhbm5lciBzdWNjZXNzOiAgICAgICAgICAgYHsgY2hhcnRJZCwgcmVzdWx0IH1gXG4gKiAgIC0gb24gZGF0YSAvIHBsYW5uZXIgZmFpbHVyZTogICAgYHsgY2hhcnRJZCwgZXJyb3IgfWBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDaGFydChvcHRzOiBQcmVwYXJlQ2hhcnRPcHRpb25zKTogUHJvbWlzZTxDaGFydFRvb2xPdXRwdXQ+IHtcbiAgY29uc3QgY2hhcnRJZCA9IGhhc2guaWQoKTtcbiAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQgfSwgb3B0cy51c2VyS2V5KTtcbiAgbG9nZ2VyLmRlYnVnKFwicXVldWVkXCIsIHsgY2hhcnRJZCB9KTtcbiAgLy8gRmlyZS1hbmQtZm9yZ2V0LiBGYWlsdXJlcyBsYW5kIGluIHRoZSBjYWNoZSBhcyBgZXJyb3JgIGVudHJpZXM7XG4gIC8vIG5ldmVyIGVzY2FwZSBpbnRvIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gIHZvaWQgcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQsIG9wdHMpO1xuICByZXR1cm4geyBjaGFydElkLCBtYXJrZXI6IG1hcmtlci5mb3JtYXRNYXJrZXIoXCJjaGFydFwiLCBjaGFydElkKSB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QcmVwYXJlQ2hhcnQoY2hhcnRJZDogc3RyaW5nLCBvcHRzOiBQcmVwYXJlQ2hhcnRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG9wdHMucmVzb2x2ZURhdGEob3B0cy5zaWduYWwpO1xuICAgIGlmIChkYXRhLnJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJEYXRhc2V0IGhhcyBubyByb3dzOyBub3RoaW5nIHRvIGNoYXJ0XCIpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5DaGFydFBsYW5uZXIoXG4gICAgICBvcHRzLmNvbmZpZyxcbiAgICAgIHtcbiAgICAgICAgdGl0bGU6IG9wdHMudGl0bGUgPz8gXCJDaGFydFwiLFxuICAgICAgICAuLi4ob3B0cy5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IG9wdHMuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgZGF0YTogZGF0YS5yb3dzIGFzIENoYXJ0UGxhbm5lclJlcXVlc3RbXCJkYXRhXCJdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLi4uKG9wdHMucmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0OiBvcHRzLnJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgICAgIC4uLihvcHRzLnNpZ25hbCA/IHsgYWJvcnRTaWduYWw6IG9wdHMuc2lnbmFsIH0gOiB7fSksXG4gICAgICB9LFxuICAgICk7XG4gICAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQsIHJlc3VsdCB9LCBvcHRzLnVzZXJLZXkpO1xuICAgIGxvZ2dlci5pbmZvKFwiZG9uZVwiLCB7XG4gICAgICBjaGFydElkLFxuICAgICAgY2hhcnRUeXBlOiByZXN1bHQuY2hhcnRUeXBlLFxuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImVycm9yXCIsIHsgY2hhcnRJZCwgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIC8vIFRoZSBlbnRyeSdzIGBlcnJvcmAgaXMgcmVuZGVyZWQgaW4gdGhlIGNoYXQsIHNvIG9ubHkgYW4gQXBwS2l0RXJyb3Inc1xuICAgIC8vIG93biBtZXNzYWdlIHRyYXZlbHM7IGFueXRoaW5nIGVsc2UgY291bGQgY2FycnkgdXBzdHJlYW0gcHJvdmlkZXIgZGV0YWlsLlxuICAgIGNvbnN0IGVyclRleHQgPSBlcnIgaW5zdGFuY2VvZiBBcHBLaXRFcnJvciA/IGVyci5tZXNzYWdlIDogQ0hBUlRfRkFJTEVEX01FU1NBR0U7XG4gICAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQsIGVycm9yOiBlcnJUZXh0IH0sIG9wdHMudXNlcktleSk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsb25nLXBvbGwgZmV0Y2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogSW5wdXRzIHRvIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hDaGFydE9wdGlvbnMge1xuICAvKipcbiAgICogSWRlbnRpdHkgdGhlIGNoYXJ0IG11c3QgYmVsb25nIHRvLiBBIGNoYXJ0IG1pbnRlZCB1bmRlciBhIGRpZmZlcmVudCBrZXlcbiAgICogaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiB1bmtub3duIGlkLiBVc2Uge0BsaW5rIHJlc29sdmVVc2VyS2V5fS5cbiAgICovXG4gIHVzZXJLZXk6IHN0cmluZztcbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIHBvbGxpbmcgYnVkZ2V0IGluIG1zLiBXaGVuIHRoZSBlbnRyeSBzdGF5cyBpblxuICAgKiB0aGUgcHJvY2Vzc2luZyBzdGF0ZSBwYXN0IHRoaXMgd2luZG93LCB0aGUgaGVscGVyIHJldHVybnMgdGhlXG4gICAqIGxhc3Qgc2VlbiB2YWx1ZSAoc3RpbGwgcHJvY2Vzc2luZykgc28gdGhlIGNsaWVudCBjYW4gcmUtcG9sbC5cbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NU30gKDYwcykuXG4gICAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQb2xsIGludGVydmFsIGluIG1zLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NU30gKDI1MG1zKS5cbiAgICovXG4gIGludGVydmFsTXM/OiBudW1iZXI7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24gaGFuZGxlIChlLmcuIHJlcXVlc3QgYHJlcS5zaWduYWxgKS4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogTG9uZy1wb2xsIHRoZSBjaGFydCBjYWNoZSB1bnRpbCB0aGUgZW50cnkgc2V0dGxlcyAoYHJlc3VsdGAgb3JcbiAqIGBlcnJvcmAgc2V0KSwgdGhlIGVudHJ5IGlzIG1pc3NpbmcsIG9yIHRoZSBzZXJ2ZXItc2lkZSB0aW1lb3V0XG4gKiBlbGFwc2VzLlxuICpcbiAqIFJldHVybnM6XG4gKiAgIC0gdGhlIHJlc29sdmVkIHtAbGluayBDaGFydH0gd2hlbiBpdCBzZXR0bGVkLCBlcnJvcmVkLCBvclxuICogICAgIHN0YXllZCBpbiBwcm9jZXNzaW5nIHBhc3QgYHRpbWVvdXRNc2AgKHNvIHRoZSBjbGllbnQgY2FuXG4gKiAgICAgcmUtcG9sbCk7XG4gKiAgIC0gYHVuZGVmaW5lZGAgd2hlbiB0aGUgZW50cnkgaXMgbWlzc2luZywgZXhwaXJlZCwgb3Igb3duZWQgYnlcbiAqICAgICBhbm90aGVyIGlkZW50aXR5ICh0aGUgY29uc3VtZXIgc2hvdWxkIHRyZWF0IGFzIDQwNCkuXG4gKlxuICogYHNpZ25hbGAgbGV0cyB0aGUgY2FsbGVyIGNhbmNlbCBhaGVhZCBvZiB0aW1lb3V0IChlLmcuIHRoZSBIVFRQXG4gKiByZXF1ZXN0IGNsb3NlZCkuIENhbmNlbGxhdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBpbnRlci1wb2xsIHNsZWVwXG4gKiBzbyB0aGUgaGVscGVyIHJldHVybnMgaW1tZWRpYXRlbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaENoYXJ0KFxuICBjaGFydElkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEZldGNoQ2hhcnRPcHRpb25zLFxuKTogUHJvbWlzZTxDaGFydCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyA/PyBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVM7XG4gIGNvbnN0IGludGVydmFsTXMgPSBvcHRpb25zLmludGVydmFsTXMgPz8gREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NUztcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGltZW91dE1zO1xuXG4gIGxldCBsYXN0OiBDaGFydCB8IHVuZGVmaW5lZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBsYXN0ID0gYXdhaXQgcmVhZENoYXJ0KGNoYXJ0SWQsIG9wdGlvbnMudXNlcktleSk7XG4gICAgaWYgKCFsYXN0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChsYXN0LnJlc3VsdCAhPT0gdW5kZWZpbmVkIHx8IGxhc3QuZXJyb3IgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGxhc3Q7XG4gICAgY29uc3QgcmVtYWluaW5nID0gZGVhZGxpbmUgLSBEYXRlLm5vdygpO1xuICAgIGlmIChyZW1haW5pbmcgPD0gMCkgcmV0dXJuIGxhc3Q7XG4gICAgYXdhaXQgYXN5bmMuc2xlZXAoTWF0aC5taW4oaW50ZXJ2YWxNcywgcmVtYWluaW5nKSwgb3B0aW9ucy5zaWduYWwpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgdGhlbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgc2xpY2Ugb2YgYW4gRWNoYXJ0cyBvcHRpb24gdGhhdCBjYXJyaWVzIGJyYW5kIGlkZW50aXR5OiB0aGUgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgdGhlIGJhc2UgZm9udCBzdGFjay4gRGVyaXZlZCBmcm9tIGEge0BsaW5rIEJyYW5kQ29udGV4dH1cbiAqIGJ5IHtAbGluayBicmFuZENoYXJ0VGhlbWV9IGFuZCBtZXJnZWQgaW50byBldmVyeSBzcGVjIGJ5XG4gKiB7QGxpbmsgcGxhblRvRWNoYXJ0c09wdGlvbn0uXG4gKlxuICogRGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gdGV4dCBDT0xPUi4gQSBzcGVjIGlzIHBsYW5uZWQgaGVyZSwgb24gdGhlXG4gKiBzZXJ2ZXIsIGFuZCByZWFkIGxhdGVyIGluIGEgYnJvd3NlciB3aG9zZSBsaWdodC9kYXJrIHRoZW1lIHRoaXMgY29kZVxuICogY2Fubm90IGtub3c7IGJha2luZyBpbiB0aGUgYnJhbmQncyBzaW5nbGUgKGxpZ2h0KSBmb3JlZ3JvdW5kIHByb2R1Y2VkXG4gKiBuZWFyLWJsYWNrIGxhYmVscyB0aGF0IGRpc2FwcGVhcmVkIGFnYWluc3QgYSBkYXJrIGNoYXQgc3VyZmFjZS4gVGhlXG4gKiByZW5kZXJlciByZXNvbHZlcyBjaHJvbWUgY29sb3JzIGZyb20gQXBwS2l0J3MgbGl2ZSBDU1MgdG9rZW5zIGluc3RlYWRcbiAqIChgQGRieC10b29scy91aS1tYXN0cmFgJ3MgYGNoYXJ0LXRoZW1lYCArIGBub3JtYWxpemVDaGFydE9wdGlvbmApLFxuICogbGVhdmluZyB0aGlzIHRoZW1lIHRoZSBwYXJ0cyB0aGF0IHJlYWQgdGhlIHNhbWUgaW4gZWl0aGVyIG1vZGUuXG4gKi9cbmludGVyZmFjZSBDaGFydFRoZW1lIHtcbiAgY29sb3I6IHN0cmluZ1tdO1xuICB0ZXh0U3R5bGU6IHsgZm9udEZhbWlseTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQXBwS2l0J3MgY2F0ZWdvcmljYWwgY2hhcnQgcGFsZXR0ZSAoYC0tY2hhcnQtY2F0LTFgIC4uIGAtLWNoYXJ0LWNhdC04YCBmcm9tXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0LXVpYCksIGFzIGhleC4gU2VydmVyLXJlbmRlcmVkIGNoYXJ0IHNwZWNzIGNhbm5vdCByZWFkIHRoZVxuICogYnJvd3NlcidzIENTUyBjdXN0b20gcHJvcGVydGllcywgc28gdGhlIHZhbHVlcyBhcmUgbWlycm9yZWQgaGVyZSB0byBrZWVwIGFcbiAqIGdlbmVyYXRlZCBjaGFydCB2aXN1YWxseSBjb25zaXN0ZW50IHdpdGggdGhlIEFwcEtpdC1zdHlsZWQgVUkgYXJvdW5kIGl0LlxuICogS2VlcCBpbiBzeW5jIHdpdGggQXBwS2l0J3Mgc3R5bGVzaGVldCBpZiBpdCBjaGFuZ2VzLlxuICovXG5jb25zdCBBUFBLSVRfQ0hBUlRfUEFMRVRURSA9IFtcbiAgXCIjMjQ2M0VCXCIsIC8vIGJsdWVcbiAgXCIjMkVCODhBXCIsIC8vIHRlYWxcbiAgXCIjQUI0N0JEXCIsIC8vIHB1cnBsZVxuICBcIiNGNjlFMjNcIiwgLy8gYW1iZXJcbiAgXCIjREQyQzREXCIsIC8vIHJvc2VcbiAgXCIjMUJBM0JCXCIsIC8vIGN5YW5cbiAgXCIjOUI2MUQxXCIsIC8vIGxhdmVuZGVyXG4gIFwiIzM0QjI2MlwiLCAvLyBlbWVyYWxkXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEV4cGFuZCB0d28gYnJhbmQgaGV4IGNvbG9ycyBpbnRvIGEgbGVnaWJsZSBjYXRlZ29yaWNhbCBjeWNsZS4gRWNoYXJ0c1xuICogcmVwZWF0cyB0aGUgYGNvbG9yYCBhcnJheSBhY3Jvc3Mgc2VyaWVzIC8gY2F0ZWdvcmllcywgc28gYSBnb29kIGRlZmF1bHRcbiAqIG5lZWRzIHNldmVyYWwgZGlzdGluY3QgaHVlcywgbm90IHR3by4gV2Ugc2VlZCB3aXRoIHRoZSBicmFuZCBwcmltYXJ5IGFuZFxuICogYWNjZW50ICh0aGUgaWRlbnRpdHkgY29sb3JzKSBhbmQgZm9sbG93IHdpdGggQXBwS2l0J3Mgb3duIGNhdGVnb3JpY2FsIGNoYXJ0XG4gKiBwYWxldHRlLCBzbyBtdWx0aS1zZXJpZXMgLyBtYW55LXNsaWNlIGNoYXJ0cyBzdGF5IHJlYWRhYmxlIGFuZCBtYXRjaCB0aGVcbiAqIHN1cnJvdW5kaW5nIEFwcEtpdCBVSSB3aGlsZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBtYXJrcyBsYW5kIG9uLWJyYW5kLlxuICovXG5mdW5jdGlvbiBicmFuZENvbG9yQ3ljbGUocHJpbWFyeTogc3RyaW5nLCBhY2NlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc3ByZWFkID0gQVBQS0lUX0NIQVJUX1BBTEVUVEU7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcmV0dXJuIFtwcmltYXJ5LCBhY2NlbnQsIC4uLnNwcmVhZF0uZmlsdGVyKChjKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYy50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGVyaXZlIGFuIEVjaGFydHMge0BsaW5rIENoYXJ0VGhlbWV9IGZyb20gYSBicmFuZCBjb250ZXh0OiB0aGUgcHJpbWFyeSArXG4gKiBhY2NlbnQgY29sb3JzIHNlZWQgdGhlIHNlcmllcyBjeWNsZSBhbmQgdGhlIHNhbnMgc3RhY2sgYmVjb21lcyB0aGUgYmFzZVxuICogZm9udC4gVGV4dCBjb2xvcnMgYXJlIHRoZSByZW5kZXJlcidzIGpvYiAtIHNlZSB7QGxpbmsgQ2hhcnRUaGVtZX0uXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ2hhcnRUaGVtZShicmFuZDogQnJhbmRDb250ZXh0KTogQ2hhcnRUaGVtZSB7XG4gIHJldHVybiB7XG4gICAgY29sb3I6IGJyYW5kQ29sb3JDeWNsZShicmFuZC5jb2xvcnMucHJpbWFyeSwgYnJhbmQuY29sb3JzLmFjY2VudCksXG4gICAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IGJyYW5kLnR5cG9ncmFwaHkuc2FucyB9LFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlY2hhcnRzIGV4cGFuc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG50eXBlIE5hbWVkU2xpY2UgPSB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IG51bWJlciB9O1xudHlwZSBTY2F0dGVyUG9pbnQgPSBbbnVtYmVyLCBudW1iZXJdO1xudHlwZSBIZWF0bWFwQ2VsbCA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuLyoqIEtlZXAgb25seSBge25hbWUsIHZhbHVlfWAgc2xpY2VzOyBkcm9wIG51bGxzIC8gYmFyZSBudW1iZXJzIC8gdHVwbGVzLiAqL1xuZnVuY3Rpb24gbmFtZWRTbGljZXMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogTmFtZWRTbGljZVtdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKFxuICAgIChkKTogZCBpcyBOYW1lZFNsaWNlID0+IGQgIT09IG51bGwgJiYgdHlwZW9mIGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZCksXG4gICk7XG59XG5cbi8qKiBLZWVwIG9ubHkgZmluaXRlIG51bWJlcnMgKGNhdGVnb3J5IC8gcmFkYXIgLyB3YXRlcmZhbGwgc2VyaWVzKS4gKi9cbmZ1bmN0aW9uIG51bWVyaWNQb2ludHMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogbnVtYmVyW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoKGQpOiBkIGlzIG51bWJlciA9PiB0eXBlb2YgZCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUoZCkpO1xufVxuXG4vKiogS2VlcCBvbmx5IGBbeCwgeV1gIHNjYXR0ZXIgdHVwbGVzLiAqL1xuZnVuY3Rpb24gc2NhdHRlclBvaW50cyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBTY2F0dGVyUG9pbnRbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcihcbiAgICAoZCk6IGQgaXMgU2NhdHRlclBvaW50ID0+IEFycmF5LmlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDIsXG4gICkgYXMgU2NhdHRlclBvaW50W107XG59XG5cbi8qKiBLZWVwIG9ubHkgYFt4SW5kZXgsIHlJbmRleCwgdmFsdWVdYCBoZWF0bWFwIGNlbGxzLiAqL1xuZnVuY3Rpb24gaGVhdG1hcENlbGxzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IEhlYXRtYXBDZWxsW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoKGQpOiBkIGlzIEhlYXRtYXBDZWxsID0+IEFycmF5LmlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDMpIGFzIEhlYXRtYXBDZWxsW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGhlYXRtYXAncyBjZWxscyBhbmQgcm93IGxhYmVscyBmcm9tIGVpdGhlciBzaGFwZSB0aGVcbiAqIHBsYW5uZXIgbWF5IHByb2R1Y2UuXG4gKlxuICogVGhlIGRvY3VtZW50ZWQgc2hhcGUgaXMgT05FIHNlcmllcyBvZiBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gXG4gKiB0cmlwbGVzLCBidXQgaW5kZXggYXJpdGhtZXRpYyBpcyBleGFjdGx5IHRoZSBraW5kIG9mIGJvb2trZWVwaW5nIGFcbiAqIGZhc3QgbW9kZWwgZ2V0cyB3cm9uZywgYW5kIHRoZSBmYWlsdXJlIGlzIHNpbGVudCAoZXZlcnkgY2VsbCBpc1xuICogZHJvcHBlZCBhbmQgdGhlIGdyaWQgcmVuZGVycyBlbXB0eSkuIFNvIHRoZSByb3ctcGVyLXNlcmllcyBzaGFwZSBpdFxuICogYWxyZWFkeSBwcm9kdWNlcyByZWxpYWJseSBmb3IgYmFyIGNoYXJ0cyAtIG9uZSBzZXJpZXMgcGVyIG1hdHJpeFxuICogcm93LCBudW1iZXJzIGFsaWduZWQgdG8gYGNhdGVnb3JpZXNgIC0gaXMgYWNjZXB0ZWQgdG9vIGFuZCB0dXJuZWRcbiAqIGludG8gdHJpcGxlcyBoZXJlLlxuICpcbiAqIFJvdyBvcmRlciByZWFkcyB0b3AtdG8tYm90dG9tOiBFY2hhcnRzJyBjYXRlZ29yeSB5LWF4aXMgY291bnRzIGluZGV4XG4gKiAwIGZyb20gdGhlIEJPVFRPTSwgc28gYSByb3ctZGVyaXZlZCBtYXRyaXggcmV2ZXJzZXMgYm90aCB0aGUgYXhpc1xuICogbGFiZWxzIGFuZCB0aGUgcm93IGluZGljZXMsIHB1dHRpbmcgdGhlIGZpcnN0IHNlcmllcyBhdCB0aGUgdG9wIHRoZVxuICogd2F5IHRoZSBtb2RlbCBsaXN0ZWQgaXQuXG4gKi9cbmZ1bmN0aW9uIGhlYXRtYXBNYXRyaXgocGxhbjogQ2hhcnRQbGFuKTogeyBjZWxsczogSGVhdG1hcENlbGxbXTsgeUNhdGVnb3JpZXM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCB0cmlwbGVzID0gaGVhdG1hcENlbGxzKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKTtcbiAgaWYgKHRyaXBsZXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7IGNlbGxzOiB0cmlwbGVzLCB5Q2F0ZWdvcmllczogcGxhbi55Q2F0ZWdvcmllcyA/PyBbXSB9O1xuICB9XG4gIGNvbnN0IHJvd3MgPSBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7IG5hbWU6IHMubmFtZSwgdmFsdWVzOiBudW1lcmljUG9pbnRzKHMuZGF0YSkgfSkpO1xuICBjb25zdCBsYWJlbHMgPSBwbGFuLnlDYXRlZ29yaWVzID8/IHJvd3MubWFwKChyKSA9PiByLm5hbWUpO1xuICBjb25zdCBsYXN0Um93ID0gcm93cy5sZW5ndGggLSAxO1xuICByZXR1cm4ge1xuICAgIGNlbGxzOiByb3dzLmZsYXRNYXAoKHJvdywgcm93SW5kZXgpID0+XG4gICAgICByb3cudmFsdWVzLm1hcCgodmFsdWUsIGNvbHVtbkluZGV4KTogSGVhdG1hcENlbGwgPT4gW2NvbHVtbkluZGV4LCBsYXN0Um93IC0gcm93SW5kZXgsIHZhbHVlXSksXG4gICAgKSxcbiAgICB5Q2F0ZWdvcmllczogWy4uLmxhYmVsc10ucmV2ZXJzZSgpLFxuICB9O1xufVxuXG4vKiogU2VxdWVudGlhbCBsaWdodC10by1icmFuZCByYW1wIGZvciBoZWF0bWFwIGludGVuc2l0eS4gKi9cbmNvbnN0IEhFQVRNQVBfUkFNUCA9IFtcIiNFQUYxRkVcIiwgXCIjOUNCREY3XCIsIFwiIzRDODZFRVwiLCBcIiMyNDYzRUJcIiwgXCIjMTQzODdGXCJdO1xuXG4vKiogQWJvdmUgdGhpcyBtYW55IGNlbGxzLCBwcmludGVkIHZhbHVlcyBvdmVybGFwIGFuZCBhcmUgc3VwcHJlc3NlZC4gKi9cbmNvbnN0IEhFQVRNQVBfTEFCRUxfTUFYX0NFTExTID0gNjA7XG5cbi8qKiBSaXNpbmcgc3RlcCBmaWxsIChlbWVyYWxkKSBhbmQgZmFsbGluZyBzdGVwIGZpbGwgKHJvc2UpLiAqL1xuY29uc3QgV0FURVJGQUxMX0lOQ1JFQVNFX0NPTE9SID0gXCIjMkVCODhBXCI7XG5jb25zdCBXQVRFUkZBTExfREVDUkVBU0VfQ09MT1IgPSBcIiNERDJDNERcIjtcblxuLyoqIFNlcmllcyBuYW1lcyB0aGUgd2F0ZXJmYWxsIGV4cGFuc2lvbiBlbWl0cy4gKi9cbmNvbnN0IFdBVEVSRkFMTF9IRUxQRVJfTkFNRSA9IFwiUnVubmluZyB0b3RhbFwiO1xuY29uc3QgV0FURVJGQUxMX0lOQ1JFQVNFX05BTUUgPSBcIkluY3JlYXNlXCI7XG5jb25zdCBXQVRFUkZBTExfREVDUkVBU0VfTkFNRSA9IFwiRGVjcmVhc2VcIjtcblxuLyoqXG4gKiBBIG1vZGVsIGFza2VkIGZvciBhIGJyaWRnZSBvZnRlbiBidWlsZHMgdGhlIHJ1bm5pbmcgdG90YWwgaXRzZWxmIGFuZFxuICogaGFuZHMgYmFjayBhIGN1bXVsYXRpdmUtYmFzZSBzZXJpZXMgYWxvbmdzaWRlIHRoZSBkZWx0YXMgLSB3aGljaFxuICogcmVuZGVycyBhcyB0d28gcGxhaW4gYmFyIHNlcmllcywgbm90IGEgd2F0ZXJmYWxsICh0aGUgYmFzZSBiYXJzIGFyZVxuICogdGhlIHRhbGwgb25lcykuIFRoZSBiYXNlIGlzIHJlY29nbml6YWJsZSBieSBuYW1lLCBzbyBpdCBpcyBkcm9wcGVkXG4gKiBoZXJlIGFuZCB0aGUgcnVubmluZyB0b3RhbCByZWNvbXB1dGVkIGZyb20gdGhlIGRlbHRhcy5cbiAqL1xuY29uc3QgV0FURVJGQUxMX0JBU0VfTkFNRSA9IC9cXGIoYmFzZXxjdW11bGF0aXZlfHJ1bm5pbmd8aGVscGVyfHRvdGFsfHN0YXJ0KGluZyk/KVxcYi9pO1xuXG4vKipcbiAqIFBpY2sgdGhlIHNpZ25lZC1kZWx0YSBzZXJpZXMgb3V0IG9mIGEgd2F0ZXJmYWxsIHBsYW4sIGlnbm9yaW5nIGFueVxuICogY3VtdWxhdGl2ZS1iYXNlIHNlcmllcyB0aGUgcGxhbm5lciBidWlsdCBieSBoYW5kXG4gKiAoe0BsaW5rIFdBVEVSRkFMTF9CQVNFX05BTUV9KS4gRmFsbHMgYmFjayB0byB0aGUgZmlyc3Qgc2VyaWVzIHdoZW5cbiAqIGV2ZXJ5IG5hbWUgbG9va3MgbGlrZSBhIGJhc2UsIHNpbmNlIGRyb3BwaW5nIHRoZW0gYWxsIHdvdWxkIGxlYXZlXG4gKiBub3RoaW5nIHRvIHBsb3QuXG4gKi9cbmZ1bmN0aW9uIHdhdGVyZmFsbERlbHRhU2VyaWVzKFxuICBzZXJpZXM6IENoYXJ0UGxhbltcInNlcmllc1wiXSxcbik6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNlcmllcy5maW5kKChzKSA9PiAhV0FURVJGQUxMX0JBU0VfTkFNRS50ZXN0KHMubmFtZSkpID8/IHNlcmllc1swXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgc3RhY2tlZCB0cmFuc3BhcmVudC1iYXNlICsgaW5jcmVhc2UgKyBkZWNyZWFzZSBzZXJpZXMgdGhhdFxuICogRWNoYXJ0cyB1c2VzIGZvciBhIHdhdGVyZmFsbCAoaXQgaGFzIG5vIG5hdGl2ZSB3YXRlcmZhbGwgdHlwZSkuXG4gKiBWYWx1ZXMgYXJlIHNpZ25lZCBkZWx0YXM7IHRoZSB0cmFuc3BhcmVudCBoZWxwZXIgY2FycmllcyB0aGUgcnVubmluZ1xuICogdG90YWwgc28gZWFjaCB2aXNpYmxlIGJhciBzdGFydHMgd2hlcmUgdGhlIHByZXZpb3VzIG9uZSBlbmRlZC5cbiAqXG4gKiBUaGUgaGVscGVyIGlzIGBzaWxlbnRgLCBzbyB3aXRoIGFuIGl0ZW0tdHJpZ2dlcmVkIHRvb2x0aXAgaXQgaXNcbiAqIGludmlzaWJsZSB0byBib3RoIHRoZSBleWUgYW5kIHRoZSBwb2ludGVyIC0gdGhlIGFsdGVybmF0aXZlLCBhbiBheGlzXG4gKiB0b29sdGlwIHRoYXQgaGlkZXMgdGhlIGhlbHBlciByb3csIG5lZWRzIGEgZnVuY3Rpb24gZm9ybWF0dGVyLCBhbmRcbiAqIHRoaXMgc3BlYyBoYXMgdG8gc3Vydml2ZSBKU09OIHNlcmlhbGl6YXRpb24gdG8gdGhlIGJyb3dzZXIuXG4gKi9cbmZ1bmN0aW9uIHdhdGVyZmFsbFNlcmllcyh2YWx1ZXM6IG51bWJlcltdKTogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgaGVscGVyczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgaW5jcmVhc2VzOiBBcnJheTxudW1iZXIgfCBcIi1cIj4gPSBbXTtcbiAgY29uc3QgZGVjcmVhc2VzOiBBcnJheTxudW1iZXIgfCBcIi1cIj4gPSBbXTtcbiAgbGV0IGN1bXVsYXRpdmUgPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICBoZWxwZXJzLnB1c2goY3VtdWxhdGl2ZSk7XG4gICAgICBpbmNyZWFzZXMucHVzaCh2YWx1ZSk7XG4gICAgICBkZWNyZWFzZXMucHVzaChcIi1cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlbHBlcnMucHVzaChjdW11bGF0aXZlICsgdmFsdWUpO1xuICAgICAgaW5jcmVhc2VzLnB1c2goXCItXCIpO1xuICAgICAgZGVjcmVhc2VzLnB1c2goLXZhbHVlKTtcbiAgICB9XG4gICAgY3VtdWxhdGl2ZSArPSB2YWx1ZTtcbiAgfVxuICBjb25zdCB0cmFuc3BhcmVudCA9IHsgYm9yZGVyQ29sb3I6IFwidHJhbnNwYXJlbnRcIiwgY29sb3I6IFwidHJhbnNwYXJlbnRcIiB9O1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9IRUxQRVJfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgaXRlbVN0eWxlOiB0cmFuc3BhcmVudCxcbiAgICAgIGVtcGhhc2lzOiB7IGl0ZW1TdHlsZTogdHJhbnNwYXJlbnQgfSxcbiAgICAgIGRhdGE6IGhlbHBlcnMsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgaXRlbVN0eWxlOiB7IGNvbG9yOiBXQVRFUkZBTExfSU5DUkVBU0VfQ09MT1IgfSxcbiAgICAgIGRhdGE6IGluY3JlYXNlcyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IFdBVEVSRkFMTF9ERUNSRUFTRV9DT0xPUiB9LFxuICAgICAgZGF0YTogZGVjcmVhc2VzLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogRXhwYW5kIGEge0BsaW5rIENoYXJ0UGxhbn0gaW50byBhIGZ1bGwgRWNoYXJ0cyBgRUNoYXJ0c09wdGlvbmBcbiAqIEpTT04uIENlbnRyYWxpemVkIGhlcmUgc28gdGhlIHBsYW5uZXIgYWdlbnQgb25seSBmaWxscyBpbiB0aGVcbiAqIGNvbXBhY3QgcGxhbiBzaGFwZTsgdG9vbHRpcCAvIGFuaW1hdGlvbiAvIGNvbG9yIC8gZ3JpZCBkZWZhdWx0c1xuICogc3RheSBjb25zaXN0ZW50IGFjcm9zcyBjaGFydHMgYW5kIGFyZSBlYXN5IHRvIHR1bmUgd2l0aG91dFxuICogcmV0cmFpbmluZyBtb2RlbCBiZWhhdmlvdXIuXG4gKlxuICogV2hlbiBgYnJhbmRgIGlzIHNldCwgdGhlIHJlc29sdmVkIHNwZWMgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3Mgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgYmFzZSB0ZXh0IHN0eWxlIChzZWUge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0pOyBvdGhlcndpc2VcbiAqIEVjaGFydHMnIGRlZmF1bHRzIGFwcGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGxhblRvRWNoYXJ0c09wdGlvbihcbiAgaW5wdXQ6IENoYXJ0UGxhbklucHV0LFxuICBmYWxsYmFja1RpdGxlOiBzdHJpbmcsXG4gIGJyYW5kPzogQnJhbmRDb250ZXh0LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBwbGFuID0gY2hhcnRQbGFuU2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgY29uc3QgYmFzZVRpdGxlID0gcGxhbi50aXRsZSA/PyBmYWxsYmFja1RpdGxlO1xuICBjb25zdCBncmlkID0geyBsZWZ0OiA0OCwgcmlnaHQ6IDI0LCB0b3A6IDU2LCBib3R0b206IDQ4LCBjb250YWluTGFiZWw6IHRydWUgfTtcbiAgY29uc3QgdGhlbWUgPSBicmFuZCA/IGJyYW5kQ2hhcnRUaGVtZShicmFuZCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRoZW1lZCA9IChvcHRpb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgICB0aGVtZSA/IHsgLi4udGhlbWUsIC4uLm9wdGlvbiB9IDogb3B0aW9uO1xuICBjb25zdCB0aXRsZSA9IHsgdGV4dDogYmFzZVRpdGxlLCBsZWZ0OiBcImNlbnRlclwiIH07XG4gIGNvbnN0IGxlZ2VuZCA9IHsgYm90dG9tOiAwIH07XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgLy8gVGhlIG9wdGlvbiBhcnJpdmVzIGFzIGEgSlNPTiBTVFJJTkcsIG5vdCBhIG5lc3RlZCBvYmplY3Q6IHRoaXMgcGxhbiBpc1xuICAgIC8vIHRoZSBwbGFubmVyJ3MgcHJvdmlkZXItZW5mb3JjZWQgc3RydWN0dXJlZCBvdXRwdXQsIGFuZCBhIGZyZWUtZm9ybVxuICAgIC8vIG9iamVjdCBiZWNvbWVzIGFuIHVuY29uc3RyYWluZWQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBzY2hlbWEgdGhhdFxuICAgIC8vIHN0cmljdCBPcGVuQUkgYW5kIEdlbWluaSBlbmRwb2ludHMgcmVqZWN0IC0gd2hpY2ggd291bGQgYnJlYWsgRVZFUllcbiAgICAvLyBjaGFydCwgbm90IGp1c3QgdGhpcyBvbmUgKHNhbWUgY2xhc3Mgb2YgaGF6YXJkIGFzIHRoZSBgcHJlZml4SXRlbXNgXG4gICAgLy8gbm90ZSBvbiBgY2hhcnREYXRhUG9pbnRTY2hlbWFgKS4gQSBtYWxmb3JtZWQgc3RyaW5nIGNvc3RzIG9uZSBjaGFydC5cbiAgICAvLyBOb3RoaW5nIGhlcmUgaXMgZXZhbCdkOyBhIHN0cmluZy12YWx1ZWQgRWNoYXJ0cyBmb3JtYXR0ZXIgaXMgYVxuICAgIC8vIHRlbXBsYXRlLCBub3QgY29kZS5cbiAgICBjb25zdCBvcHRpb24gPSBqc29uLnBhcnNlUmVjb3JkKHBsYW4ub3B0aW9uKTtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFydFR5cGUgXCJjdXN0b21cIiBuZWVkcyBhbiBgb3B0aW9uYCBob2xkaW5nIGEgSlNPTiBvYmplY3QnKTtcbiAgICB9XG4gICAgLy8gVGl0bGUgaXMgdGhlIG9uZSBkZWZhdWx0IHdvcnRoIGZpbGxpbmc6IGV2ZXJ5IG90aGVyIGJyYW5jaCBndWFyYW50ZWVzXG4gICAgLy8gb25lIGFuZCB0aGUgcmVuZGVyZXIgcmVzZXJ2ZXMgZ3JpZCBzcGFjZSBmb3IgaXQuIEEgdGl0bGUgdGhlIG1vZGVsIHNldFxuICAgIC8vIHdpbnMsIGFzIGRvZXMgZXZlcnkgb3RoZXIgZmllbGQgaXQgZGVjbGFyZWQuXG4gICAgcmV0dXJuIHRoZW1lZCh7IHRpdGxlLCAuLi5vcHRpb24gfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicGllXCIgfHwgcGxhbi5jaGFydFR5cGUgPT09IFwiZnVubmVsXCIgfHwgcGxhbi5jaGFydFR5cGUgPT09IFwidHJlZW1hcFwiKSB7XG4gICAgY29uc3Qgc2xpY2VzID0gbmFtZWRTbGljZXMocGxhbi5zZXJpZXNbMF0/LmRhdGEgPz8gW10pO1xuICAgIGNvbnN0IHNlcmllc1R5cGUgPSBwbGFuLmNoYXJ0VHlwZTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kOiBzZXJpZXNUeXBlID09PSBcInRyZWVtYXBcIiA/IHVuZGVmaW5lZCA6IGxlZ2VuZCxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICAgICAgLi4uKHNlcmllc1R5cGUgPT09IFwicGllXCIgPyB7IHJhZGl1czogW1wiMzUlXCIsIFwiNjUlXCJdIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHNlcmllc1R5cGUgPT09IFwiZnVubmVsXCIgPyB7IHNvcnQ6IFwiZGVzY2VuZGluZ1wiIH0gOiB7fSksXG4gICAgICAgICAgZGF0YTogc2xpY2VzLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJzY2F0dGVyXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBzY2F0dGVyIHBvaW50cyAtIGtlZXAgb25seSB2YWxpZFxuICAgIC8vIGBbeCwgeV1gIHR1cGxlcy4gQmFyZSBudW1iZXJzIC8gb2JqZWN0cyAvIG51bGxzIGZyb20gYVxuICAgIC8vIG1pc21hdGNoZWQgcGxhbiBnZXQgZHJvcHBlZCBzaWxlbnRseS5cbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi54QXhpc0xhYmVsIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICAgIGRhdGE6IHNjYXR0ZXJQb2ludHMocy5kYXRhKSxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJoZWF0bWFwXCIpIHtcbiAgICBjb25zdCB7IGNlbGxzLCB5Q2F0ZWdvcmllcyB9ID0gaGVhdG1hcE1hdHJpeChwbGFuKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBjZWxscy5tYXAoKGMpID0+IGNbMl0pO1xuICAgIGNvbnN0IG1pbiA9IHZhbHVlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4udmFsdWVzKSA6IDA7XG4gICAgY29uc3QgbWF4ID0gdmFsdWVzLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi52YWx1ZXMpIDogMTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyBwb3NpdGlvbjogXCJ0b3BcIiB9LFxuICAgICAgLy8gVGhlIHZpc3VhbE1hcCByYW1wIHNpdHMgYmVsb3cgdGhlIHBsb3QsIHNvIHRoZSBncmlkIGdpdmVzIHVwXG4gICAgICAvLyBtb3JlIGJvdHRvbSByb29tIHRoYW4gYW4gYXhpcy1vbmx5IGNoYXJ0IG5lZWRzLlxuICAgICAgZ3JpZDogeyAuLi5ncmlkLCBib3R0b206IDcyIH0sXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgICBzcGxpdEFyZWE6IHsgc2hvdzogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogeUNhdGVnb3JpZXMsXG4gICAgICAgIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCxcbiAgICAgICAgc3BsaXRBcmVhOiB7IHNob3c6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgICB2aXN1YWxNYXA6IHtcbiAgICAgICAgLy8gRWNoYXJ0cyBoaWRlcyBldmVyeSBjZWxsIHdoZW4gbWluID09PSBtYXggKGEgdW5pZm9ybSBtYXRyaXgpLFxuICAgICAgICAvLyBzbyBhIGRlZ2VuZXJhdGUgcmFuZ2UgaXMgd2lkZW5lZCBieSBvbmUuXG4gICAgICAgIG1pbixcbiAgICAgICAgbWF4OiBtYXggPiBtaW4gPyBtYXggOiBtaW4gKyAxLFxuICAgICAgICBjYWxjdWxhYmxlOiB0cnVlLFxuICAgICAgICBvcmllbnQ6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICBsZWZ0OiBcImNlbnRlclwiLFxuICAgICAgICBib3R0b206IDgsXG4gICAgICAgIGluUmFuZ2U6IHsgY29sb3I6IEhFQVRNQVBfUkFNUCB9LFxuICAgICAgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IFwiaGVhdG1hcFwiLFxuICAgICAgICAgIGRhdGE6IGNlbGxzLFxuICAgICAgICAgIC8vIFByaW50ZWQgY2VsbCB2YWx1ZXMgYXJlIHVucmVhZGFibGUgb25jZSB0aGUgZ3JpZCBpcyBkZW5zZS5cbiAgICAgICAgICBsYWJlbDogeyBzaG93OiBjZWxscy5sZW5ndGggPD0gSEVBVE1BUF9MQUJFTF9NQVhfQ0VMTFMgfSxcbiAgICAgICAgICBlbXBoYXNpczogeyBpdGVtU3R5bGU6IHsgc2hhZG93Qmx1cjogMTAsIHNoYWRvd0NvbG9yOiBcInJnYmEoMCwgMCwgMCwgMC4zKVwiIH0gfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicmFkYXJcIikge1xuICAgIGNvbnN0IGluZGljYXRvcnMgPSAocGxhbi5jYXRlZ29yaWVzID8/IFtdKS5tYXAoKG5hbWUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwZWFrID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIC4uLnBsYW4uc2VyaWVzLm1hcCgocykgPT4ge1xuICAgICAgICAgIGNvbnN0IG51bXMgPSBudW1lcmljUG9pbnRzKHMuZGF0YSk7XG4gICAgICAgICAgcmV0dXJuIG51bXNbaW5kZXhdID8/IDA7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IG5hbWUsIG1heDogcGVhayA+IDAgPyBwZWFrIDogMSB9O1xuICAgIH0pO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICByYWRhcjogeyBpbmRpY2F0b3I6IGluZGljYXRvcnMgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJyYWRhclwiLFxuICAgICAgICAgIGRhdGE6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBudW1lcmljUG9pbnRzKHMuZGF0YSksXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJ3YXRlcmZhbGxcIikge1xuICAgIGNvbnN0IHZhbHVlcyA9IG51bWVyaWNQb2ludHMod2F0ZXJmYWxsRGVsdGFTZXJpZXMocGxhbi5zZXJpZXMpPy5kYXRhID8/IFtdKTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgLy8gSXRlbS10cmlnZ2VyZWQgc28gdGhlIHRyYW5zcGFyZW50IGBzaWxlbnRgIG9mZnNldCBiYXJzIG5ldmVyXG4gICAgICAvLyBzdXJmYWNlIGluIGEgdG9vbHRpcCAoc2VlIGB3YXRlcmZhbGxTZXJpZXNgKS5cbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIC8vIE9ubHkgdGhlIHR3byB2aXNpYmxlIHN0ZXBzIGJlbG9uZyBpbiB0aGUgbGVnZW5kLlxuICAgICAgbGVnZW5kOiB7IC4uLmxlZ2VuZCwgZGF0YTogW1dBVEVSRkFMTF9JTkNSRUFTRV9OQU1FLCBXQVRFUkZBTExfREVDUkVBU0VfTkFNRV0gfSxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICBzZXJpZXM6IHdhdGVyZmFsbFNlcmllcyh2YWx1ZXMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImhvcml6b250YWxCYXJcIikge1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiLCBheGlzUG9pbnRlcjogeyB0eXBlOiBcInNoYWRvd1wiIH0gfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCB9LFxuICAgICAgeUF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiY29tYm9cIikge1xuICAgIGNvbnN0IHVzZXNSaWdodEF4aXMgPSBwbGFuLnNlcmllcy5zb21lKChzKSA9PiBzLnlBeGlzSW5kZXggPT09IDEpO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICB5QXhpczogdXNlc1JpZ2h0QXhpc1xuICAgICAgICA/IFtcbiAgICAgICAgICAgIHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgICAgICAgIHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHMudHlwZSA/PyBcImJhclwiO1xuICAgICAgICBjb25zdCBzZXJpZXNUeXBlID0gbWFyayA9PT0gXCJhcmVhXCIgPyBcImxpbmVcIiA6IG1hcms7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICAgICAgZGF0YTogcy5kYXRhLFxuICAgICAgICAgIHlBeGlzSW5kZXg6IHMueUF4aXNJbmRleCA/PyAwLFxuICAgICAgICAgIHNtb290aDogc2VyaWVzVHlwZSA9PT0gXCJsaW5lXCIsXG4gICAgICAgICAgLi4uKG1hcmsgPT09IFwiYXJlYVwiID8geyBhcmVhU3R5bGU6IHt9IH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGJhciAvIGxpbmUgLyBhcmVhIHNoYXJlIHRoZSBzYW1lIGF4aXMgbGF5b3V0LlxuICBjb25zdCBpc0FyZWEgPSBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJhcmVhXCI7XG4gIGNvbnN0IHNlcmllc1R5cGUgPSBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJiYXJcIiA/IFwiYmFyXCIgOiBcImxpbmVcIjtcbiAgcmV0dXJuIHRoZW1lZCh7XG4gICAgdGl0bGUsXG4gICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiB9LFxuICAgIGxlZ2VuZCxcbiAgICBncmlkLFxuICAgIHhBeGlzOiB7XG4gICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgfSxcbiAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgdHlwZTogc2VyaWVzVHlwZSxcbiAgICAgIGRhdGE6IHMuZGF0YSxcbiAgICAgIHNtb290aDogc2VyaWVzVHlwZSA9PT0gXCJsaW5lXCIsXG4gICAgICAuLi4oaXNBcmVhID8geyBhcmVhU3R5bGU6IHt9IH0gOiB7fSksXG4gICAgfSkpLFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVuZGVyX2RhdGEgdG9vbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBgcmVuZGVyX2RhdGFgIE1hc3RyYSB0b29sIGJvdW5kIHRvIHRoZSBnaXZlbiBwbHVnaW5cbiAqIGNvbmZpZy4gQXV0by13aXJlZCBhcyBhIHN5c3RlbSB0b29sIG9uIGV2ZXJ5IGFnZW50IChzZWVcbiAqIGBhZ2VudHMudHNgKTsgcGVyLWFnZW50IHRvb2xzIGNhbiBzaGFkb3cgaXQgYnkgcmVnaXN0ZXJpbmcgYVxuICogc2FtZS1uYW1lZCBlbnRyeS5cbiAqXG4gKiBUaGluIHdyYXBwZXIgb3ZlciB7QGxpbmsgcHJlcGFyZUNoYXJ0fSBmb3IgY2FsbGVycyB0aGF0IGFscmVhZHlcbiAqIGhhdmUgYSBkYXRhc2V0IGluIGhhbmQuIE1pbnRzIGEgYGNoYXJ0SWRgIHN5bmNocm9ub3VzbHksIGNhY2hlc1xuICogYW4gZW1wdHkgcGxhY2Vob2xkZXIsIGFuZCBraWNrcyBvZmYgdGhlIGNoYXJ0LXBsYW5uZXIgaW4gdGhlXG4gKiBiYWNrZ3JvdW5kLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgcGx1cyBpdHMgcmVhZHktdG8tY29weSBgbWFya2VyYDsgdGhlIGhvc3RcbiAqIFVJIHJlc29sdmVzIHRoYXQgbWFya2VyIHRocm91Z2ggdGhlIHBsdWdpbidzIGAvZW1iZWQvY2hhcnQvOmlkYCByb3V0ZS5cbiAqXG4gKiBGb3IgR2VuaWUgc3RhdGVtZW50IHJlc3VsdHMsIHByZWZlciB0aGUgR2VuaWUgYWdlbnQnc1xuICogYHByZXBhcmVfY2hhcnRgIHRvb2wsIHdoaWNoIGFjY2VwdHMgYSBgc3RhdGVtZW50X2lkYCBhbmRcbiAqIHJlc29sdmVzIHRoZSByb3dzIGxhemlseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBcInJlbmRlcl9kYXRhXCIsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKFtcbiAgICAgIGBcbiAgICAgICAgU3VibWl0IGEgdGFidWxhciBkYXRhc2V0IGZvciBpbmxpbmUgcmVuZGVyaW5nIGFzIGEgY2hhcnQgaW5cbiAgICAgICAgdGhlIHVzZXIncyB2aWV3LiBQYXNzIGEgdGl0bGUsIHRoZSByYXcgcm93cyAoYXJyYXkgb2Ygb2JqZWN0c1xuICAgICAgICBrZXllZCBieSBjb2x1bW4gbmFtZSksIGFuZCBhbiBvcHRpb25hbCBvbmUtbGluZSBkZXNjcmlwdGlvblxuICAgICAgICBvZiB0aGUgaW5zaWdodCB0byBoaWdobGlnaHQuIFJldHVybnMgXFxgY2hhcnRJZFxcYCBwbHVzIHRoZVxuICAgICAgICBjb21wbGV0ZSBcXGBtYXJrZXJcXGA7IGNvcHkgdGhlIHJldHVybmVkIG1hcmtlciBWRVJCQVRJTSBvbnRvXG4gICAgICAgIGl0cyBvd24gbGluZSB3aGVyZSB0aGUgY2hhcnQgc2hvdWxkIHJlbmRlci4gTmV2ZXIgY29uc3RydWN0LFxuICAgICAgICBhbHRlciwgb3IgaW52ZW50IGEgY2hhcnQgbWFya2VyIHlvdXJzZWxmLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgUGxhY2VtZW50IGNvbnRyYWN0OiBlbWJlZCB0aGUgcmV0dXJuZWQgXFxgbWFya2VyXFxgIG9uIGl0cyBvd25cbiAgICAgICAgbGluZSAoYmxhbmsgbGluZXMgYWJvdmUgYW5kIGJlbG93KSB3aGVyZXZlciB5b3Ugd2FudCB0aGUgY2hhcnRcbiAgICAgICAgdG8gYXBwZWFyIGluIHlvdXIgcmVwbHkuIFRoZSBjaGFydCByZXNvbHZlc1xuICAgICAgICBhc3luY2hyb25vdXNseSAtIHRoZSB0b29sIHJldHVybnMgdGhlIGlkIGltbWVkaWF0ZWx5IGFuZCB0aGVcbiAgICAgICAgaG9zdCBVSSBmZXRjaGVzIHRoZSBjaGFydCBmcm9tIHRoZSBjYWNoZSBvbmNlIHRoZSBwbGFubmVyXG4gICAgICAgIGxhbmRzLiBZb3UgY2FuIGNhbGwgXFxgcmVuZGVyX2RhdGFcXGAgbXVsdGlwbGUgdGltZXMgaW4gdGhlXG4gICAgICAgIHNhbWUgdHVybiAodGhlIHRvb2wgaXMgcGFyYWxsZWwtc2FmZSkgYW5kIGludGVybGVhdmUgdGhlXG4gICAgICAgIG1hcmtlcnMgd2l0aCBwcm9zZSBzbyBlYWNoIGNoYXJ0IHNpdHMgbmV4dCB0byBpdHNcbiAgICAgICAgY29tbWVudGFyeS5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFVzZSB3aGVuZXZlciBhIFNRTCByb3cgc2V0LCBBUEkgcmVzcG9uc2UsIG9yIGhhbmQtYnVpbHRcbiAgICAgICAgZGF0YXNldCB3b3VsZCBsYW5kIGJldHRlciBhcyBhIHBpY3R1cmUgdGhhbiBhcyBhIGxpc3Qgb3JcbiAgICAgICAgdGFibGUuIENhcCBpbnB1dCBhdCBhIGZldyBodW5kcmVkIHJvd3M7IHNhbXBsZSBvciBhZ2dyZWdhdGVcbiAgICAgICAgbGFyZ2VyIGRhdGFzZXRzIGZpcnN0LlxuICAgICAgYCxcbiAgICBdKSxcbiAgICBpbnB1dFNjaGVtYTogY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSxcbiAgICBvdXRwdXRTY2hlbWE6IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQsIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgeyB0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEgfSA9IGlucHV0IGFzIENoYXJ0UGxhbm5lclJlcXVlc3Q7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgeyByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0IH0gfCB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gcHJlcGFyZUNoYXJ0KHtcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB1c2VyS2V5OiByZXNvbHZlVXNlcktleShjdHg/LnJlcXVlc3RDb250ZXh0KSxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgcmVzb2x2ZURhdGE6ICgpID0+IFByb21pc2UucmVzb2x2ZSh7IHJvd3M6IGRhdGEgfSksXG4gICAgICAgIC4uLihjdHg/LnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogY3R4LnJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
@@ -27,6 +27,12 @@ import type { MastraModelConfig } from "@mastra/core/llm";
27
27
  import type { RequestContext } from "@mastra/core/request-context";
28
28
  import { type MastraPluginConfig } from "./config.ts";
29
29
  type ModelClass = model.ModelClass;
30
+ /** Keep Responses turns stateless so tool continuations replay encrypted reasoning inline. */
31
+ export declare const RESPONSES_PROVIDER_OPTIONS: {
32
+ readonly openai: {
33
+ readonly store: false;
34
+ };
35
+ };
30
36
  /** Pick the native Databricks inference surface required by a resolved model. */
31
37
  export declare function servingApi(modelId: string): "chat" | "responses";
32
38
  /** Optional overrides accepted by {@link buildModel}. */