@dbx-tools/model 0.9.167 → 0.9.173

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.
@@ -75,12 +75,13 @@ export declare function formatReasoning(level: ReasoningLevel): string;
75
75
  /**
76
76
  * Remap a requested effort onto the nearest supported {@link ReasoningLevel}.
77
77
  *
78
- * `none` / `off` (and disable aliases) are not a low budget: when the model
79
- * requires reasoning, they snap to the supported level closest to
80
- * {@link ReasoningLevel.Medium}. Other requests prefer the highest allowed
81
- * level at or below the request, otherwise the lowest allowed level.
78
+ * `none` / `off` (and disable aliases), null, and unrecognized explicit values
79
+ * are not treated as a low budget: when the model requires reasoning, they
80
+ * snap to the supported level closest to {@link ReasoningLevel.Medium}. Other
81
+ * requests prefer the highest allowed level at or below the request, otherwise
82
+ * the lowest allowed level.
82
83
  *
83
- * Returns `undefined` when the request cannot be parsed or `levels` is empty.
84
+ * Returns `undefined` only when `levels` is empty.
84
85
  */
85
86
  export declare function remapReasoning(requested: unknown, levels: readonly ReasoningLevel[]): ReasoningLevel | undefined;
86
87
  /** Result of adapting reasoning fields on a gateway request body. */
@@ -96,7 +97,8 @@ export interface AdaptedRequestReasoning {
96
97
  * Rewrite `reasoning_effort` / `reasoning.effort` onto a supported ladder.
97
98
  *
98
99
  * Model-agnostic: callers supply the allowed levels (learned, documented, or
99
- * defaults). Bodies without reasoning fields are returned unchanged.
100
+ * defaults). Explicit null or unrecognized values use the medium-centered
101
+ * fallback. Bodies without reasoning fields are returned unchanged.
100
102
  */
101
103
  export declare function adaptRequestReasoning(body: Readonly<Record<string, unknown>>, levels: readonly ReasoningLevel[]): AdaptedRequestReasoning;
102
104
  /** Normalize labels for alias lookup (`Extra High` → `extra-high`). */
@@ -242,22 +242,23 @@ const DISABLED_REASONING_TOKENS = new Set(["none", "off", "disable", "disabled"]
242
242
  /**
243
243
  * Remap a requested effort onto the nearest supported {@link ReasoningLevel}.
244
244
  *
245
- * `none` / `off` (and disable aliases) are not a low budget: when the model
246
- * requires reasoning, they snap to the supported level closest to
247
- * {@link ReasoningLevel.Medium}. Other requests prefer the highest allowed
248
- * level at or below the request, otherwise the lowest allowed level.
245
+ * `none` / `off` (and disable aliases), null, and unrecognized explicit values
246
+ * are not treated as a low budget: when the model requires reasoning, they
247
+ * snap to the supported level closest to {@link ReasoningLevel.Medium}. Other
248
+ * requests prefer the highest allowed level at or below the request, otherwise
249
+ * the lowest allowed level.
249
250
  *
250
- * Returns `undefined` when the request cannot be parsed or `levels` is empty.
251
+ * Returns `undefined` only when `levels` is empty.
251
252
  */
252
253
  export function remapReasoning(requested, levels) {
253
254
  if (levels.length === 0)
254
255
  return undefined;
255
- if (isDisabledReasoningToken(requested)) {
256
+ if (requested == null || isDisabledReasoningToken(requested)) {
256
257
  return nearestReasoning(ReasoningLevel.Medium, levels);
257
258
  }
258
259
  const parsed = parseReasoning(requested);
259
260
  if (!parsed)
260
- return undefined;
261
+ return nearestReasoning(ReasoningLevel.Medium, levels);
261
262
  if (levels.includes(parsed))
262
263
  return parsed;
263
264
  const requestedIndex = REASONING_LEVELS.indexOf(parsed);
@@ -302,30 +303,33 @@ function nearestReasoning(target, levels) {
302
303
  * Rewrite `reasoning_effort` / `reasoning.effort` onto a supported ladder.
303
304
  *
304
305
  * Model-agnostic: callers supply the allowed levels (learned, documented, or
305
- * defaults). Bodies without reasoning fields are returned unchanged.
306
+ * defaults). Explicit null or unrecognized values use the medium-centered
307
+ * fallback. Bodies without reasoning fields are returned unchanged.
306
308
  */
307
309
  export function adaptRequestReasoning(body, levels) {
308
310
  if (levels.length === 0)
309
311
  return { body, changed: false };
312
+ const hasTopLevel = Object.hasOwn(body, "reasoning_effort");
310
313
  const topLevel = body.reasoning_effort;
311
314
  const reasoning = isRecord(body.reasoning) ? body.reasoning : undefined;
315
+ const hasNested = reasoning ? Object.hasOwn(reasoning, "effort") : false;
312
316
  const nested = reasoning?.effort;
313
- const requested = topLevel ?? nested;
314
- if (requested === undefined)
317
+ if (!hasTopLevel && !hasNested)
315
318
  return { body, changed: false };
319
+ const requested = hasTopLevel ? topLevel : nested;
316
320
  const remapped = remapReasoning(requested, levels);
317
321
  if (!remapped)
318
322
  return { body, changed: false };
319
323
  const wire = formatReasoning(remapped);
320
324
  let changed = false;
321
325
  let next = { ...body };
322
- if (typeof topLevel === "string" || typeof topLevel === "number") {
326
+ if (hasTopLevel) {
323
327
  if (String(topLevel) !== wire) {
324
328
  next = { ...next, reasoning_effort: wire };
325
329
  changed = true;
326
330
  }
327
331
  }
328
- if (reasoning && (typeof nested === "string" || typeof nested === "number")) {
332
+ if (reasoning && hasNested) {
329
333
  if (String(nested) !== wire) {
330
334
  next = { ...next, reasoning: { ...reasoning, effort: wire } };
331
335
  changed = true;
@@ -443,4 +447,4 @@ function tryUnwrapJson(text) {
443
447
  }
444
448
  return undefined;
445
449
  }
446
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhc29uaW5nLXRyYW5zbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xGLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzVELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsUUFBUTtJQUNoQixJQUFJLEVBQUUsTUFBTTtJQUNaLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLEdBQUcsRUFBRSxLQUFLO0NBQ3VDLENBQUM7QUFFcEQsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE4QjtJQUN6RCxjQUFjLENBQUMsR0FBRztJQUNsQixjQUFjLENBQUMsTUFBTTtJQUNyQixjQUFjLENBQUMsSUFBSTtJQUNuQixjQUFjLENBQUMsU0FBUztJQUN4QixjQUFjLENBQUMsR0FBRztDQUNuQixDQUFDO0FBS0YsTUFBTSxRQUFRLEdBQThCO0lBQzFDLGNBQWMsQ0FBQyxHQUFHO0lBQ2xCLGNBQWMsQ0FBQyxNQUFNO0lBQ3JCLGNBQWMsQ0FBQyxJQUFJO0NBQ3BCLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBOEI7SUFDakQsY0FBYyxDQUFDLEdBQUc7SUFDbEIsY0FBYyxDQUFDLE1BQU07SUFDckIsY0FBYyxDQUFDLElBQUk7SUFDbkIsY0FBYyxDQUFDLFNBQVM7Q0FDekIsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUE4QjtJQUMxQyxjQUFjLENBQUMsR0FBRztJQUNs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QUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3hDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pGLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJpYyByZWFzb25pbmctYnVkZ2V0IHRyYW5zbGF0aW9uIGZvciBNb2RlbCBTZXJ2aW5nIGFuZCBnYXRld2F5IGNhbGxlcnMuXG4gKlxuICogUHJvdmlkZXIgd2lyZXMgZGlzYWdyZWUgb24gZWZmb3J0IGxhYmVscyAoYHhoaWdoYCwgYHVsdHJhYCwgYG1lZGAsIGBub25lYCwg4oCmKS5cbiAqIFRoaXMgbW9kdWxlIG93bnMgb25lIGluZHVzdHJ5LXNoYXBlZCBsYWRkZXIgYW5kIHR3byBwYXJzZXJzOlxuICpcbiAqIC0ge0BsaW5rIHBhcnNlUmVhc29uaW5nfTogZnV6enktbWF0Y2ggb25lIGxhYmVsIG9udG8ge0BsaW5rIFJlYXNvbmluZ0xldmVsfVxuICogLSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9OiB1bndyYXAgbmVzdGVkIC8gZG91YmxlLWVuY29kZWQgZXJyb3IgYm9kaWVzXG4gKiAtIHtAbGluayByZW1hcFJlYXNvbmluZ30gLyB7QGxpbmsgYWRhcHRSZXF1ZXN0UmVhc29uaW5nfTogbWFwIGEgcmVxdWVzdCBvbnRvIGFcbiAqICAgc3VwcG9ydGVkIGxhZGRlciBhbmQgcmV3cml0ZSBgcmVhc29uaW5nX2VmZm9ydGAgLyBgcmVhc29uaW5nLmVmZm9ydGBcbiAqXG4gKiBEb2N1bWVudGVkIG1vZGVsIGxhZGRlcnMgY29tZSBmcm9tIHRoZSBjb21taXR0ZWQgSFRNTCBzbmFwc2hvdCByZWZyZXNoZWQgYnlcbiAqIGBidW4gcnVuIC0tZmlsdGVyICdAZGJ4LXRvb2xzL21vZGVsJyBtZXRhZGF0YWAgKHNhbWUgY2FjaGUgcGF0aCBhc1xuICogY2FwYWJpbGl0aWVzIC8gcmF0ZSBsaW1pdHMpLiBFcnJvci1ib2R5IHBhcnNpbmcgaXMgbmV2ZXIgY2FjaGVkOyBjYWxsZXJzXG4gKiBwZXJzaXN0IGxlYXJuZWQgbGFkZGVycyB2aWEgdGhlIG1ldGFkYXRhIG1vZHVsZS5cbiAqXG4gKiBFcnJvciBib2RpZXMgYXJyaXZlIGFzIGNvbXBsZXRlIEhUVFAgSlNPTiB3aGV0aGVyIHRoZSByZXF1ZXN0IGFza2VkIGZvclxuICogc3RyZWFtaW5nIG9yIG5vdCAoRGF0YWJyaWNrcyByZWplY3RzIHVuc3VwcG9ydGVkIGVmZm9ydHMgd2l0aCA0MDAgYmVmb3JlIFNTRVxuICogc3RhcnRzKSwgc28ge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfSBhcHBsaWVzIHRvIGJvdGggcGF0aHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBhcnNlUmVjb3JkLCBwYXJzZSwgaXNSZWNvcmQsIHRyaW1Ub051bGwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgbW9kZWxGYW1pbHksIG1vZGVsU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxuLyoqIEluZHVzdHJ5LWdlbmVyaWMgcmVhc29uaW5nIGJ1ZGdldCBsZXZlbHMsIGxvd2VzdCB0byBoaWdoZXN0LiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTGV2ZWwgPSBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiIHwgXCJleHRyYS1oaWdoXCIgfCBcIm1heFwiO1xuXG4vKiogUnVudGltZSB2YWx1ZXMgZm9yIHtAbGluayBSZWFzb25pbmdMZXZlbH0uICovXG5leHBvcnQgY29uc3QgUmVhc29uaW5nTGV2ZWwgPSB7XG4gIExvdzogXCJsb3dcIixcbiAgTWVkaXVtOiBcIm1lZGl1bVwiLFxuICBIaWdoOiBcImhpZ2hcIixcbiAgRXh0cmFIaWdoOiBcImV4dHJhLWhpZ2hcIixcbiAgTWF4OiBcIm1heFwiLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+O1xuXG4vKiogQ2Fub25pY2FsIGxhZGRlciBvcmRlciB1c2VkIHdoZW4gc29ydGluZyBvciByYW5raW5nIHJlbWFwcy4gKi9cbmV4cG9ydCBjb25zdCBSRUFTT05JTkdfTEVWRUxTOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG4vKiogTW9kZWwgaWRlbnRpdHkg4oaSIGFjY2VwdGVkIHtAbGluayBSZWFzb25pbmdMZXZlbH0gbGFkZGVyLiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj47XG5cbmNvbnN0IFNUQU5EQVJEOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfRVhUUkFfSElHSDogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTG93LFxuICBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfTUFYOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG5jb25zdCBHUFRfNV81X1BSTzogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG5dO1xuXG4vKipcbiAqIEFsaWFzIHRhYmxlIGZvciBleGFjdCAvIG5lYXItZXhhY3QgbGFiZWxzLiBLZXlzIGFyZSB7QGxpbmsgbm9ybWFsaXplUmVhc29uaW5nVG9rZW59XG4gKiByZXN1bHRzLiBQcm92aWRlciB3aXJlcyAoYHhoaWdoYCkgYW5kIHBsYWluIEVuZ2xpc2ggKGB1bHRyYWAsIGBtZWRgKSBib3RoIGxhbmRcbiAqIG9uIHRoZSBnZW5lcmljIGxhZGRlci5cbiAqL1xuY29uc3QgQUxJQVNFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+PiA9IHtcbiAgbG93OiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIGw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbm9uZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBvZmY6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgZGlzYWJsZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBkaXNhYmxlZDogUmVhc29uaW5nTGV2ZWwuTG93LFxuICB6ZXJvOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIG1pbmltYWw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWluOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIHRpbnk6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbGlnaHQ6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWVkaXVtOiBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIG1lZDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBtaWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgbW9kZXJhdGU6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgZGVmYXVsdDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBub3JtYWw6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgYmFsYW5jZWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgaGlnaDogUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgaGk6IFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIGhlYXZ5OiBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBcImV4dHJhLWhpZ2hcIjogUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBleHRyYWhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGg6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmE6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgXCJ1bHRyYS1oaWdoXCI6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmFoaWdoOiBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG4gIG1heDogUmVhc29uaW5nTGV2ZWwuTWF4LFxuICBtYXhpbXVtOiBSZWFzb25pbmdMZXZlbC5NYXgsXG4gIGhpZ2hlc3Q6IFJlYXNvbmluZ0xldmVsLk1heCxcbiAgZnVsbDogUmVhc29uaW5nTGV2ZWwuTWF4LFxufTtcblxuY29uc3QgU1VQUE9SVEVEX1ZBTFVFU19QQVRURVJOID1cbiAgL3N1cHBvcnRlZFxccyt2YWx1ZXM/XFxzK2FyZVxccyo6P1xccyooLis/KSg/OlxcLj9cXHMqKD86cGFyYW18dHlwZXxjb2RlKVxcYnwkKS9pcztcbmNvbnN0IFRPS0VOX1BBVFRFUk4gPSAvJyhbXiddKyknfFwiKFteXCJdKylcInxgKFteYF0rKWB8XFxiKFthLXpdW2EtejAtOV8tXSopXFxiL2dpO1xuY29uc3QgTUFYX0pTT05fVU5XUkFQX0RFUFRIID0gODtcblxuaW50ZXJmYWNlIEFsaWFzRG9jdW1lbnQge1xuICByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICByZWFkb25seSBsZXZlbDogUmVhc29uaW5nTGV2ZWw7XG59XG5cbmNvbnN0IGFsaWFzRG9jdW1lbnRzOiByZWFkb25seSBBbGlhc0RvY3VtZW50W10gPSBPYmplY3QuZW50cmllcyhBTElBU0VTKS5tYXAoKFt0b2tlbiwgbGV2ZWxdKSA9PiAoe1xuICB0b2tlbixcbiAgbGV2ZWwsXG59KSk7XG5cbmNvbnN0IGFsaWFzRnVzZSA9IG5ldyBGdXNlKGFsaWFzRG9jdW1lbnRzLCB7XG4gIGtleXM6IFtcInRva2VuXCJdLFxuICBpbmNsdWRlU2NvcmU6IHRydWUsXG4gIHRocmVzaG9sZDogMC4zNSxcbiAgaWdub3JlTG9jYXRpb246IHRydWUsXG59KTtcblxuLyoqXG4gKiBGdXp6eS1tYXRjaCBvbmUgcmVhc29uaW5nIGxhYmVsIG9udG8ge0BsaW5rIFJlYXNvbmluZ0xldmVsfS5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGlucHV0IGlzIGVtcHR5IG9yIGNhbm5vdCBiZSBtYXBwZWQgY29uZmlkZW50bHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlYXNvbmluZyh2YWx1ZTogdW5rbm93bik6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVJlYXNvbmluZ1Rva2VuKFN0cmluZyh2YWx1ZSkpO1xuICBpZiAoIW5vcm1hbGl6ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGV4YWN0ID0gQUxJQVNFU1tub3JtYWxpemVkXSA/PyBBTElBU0VTW25vcm1hbGl6ZWQucmVwbGFjZSgvLS9nLCBcIlwiKV07XG4gIGlmIChleGFjdCkgcmV0dXJuIGV4YWN0O1xuICBjb25zdCBbbWF0Y2hdID0gYWxpYXNGdXNlLnNlYXJjaChub3JtYWxpemVkKTtcbiAgaWYgKCFtYXRjaCB8fCAobWF0Y2guc2NvcmUgPz8gMSkgPiAwLjM1KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbWF0Y2guaXRlbS5sZXZlbDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHN1cHBvcnRlZCByZWFzb25pbmcgbGV2ZWxzIGZyb20gYW4gdXBzdHJlYW0gZXJyb3IgYm9keS5cbiAqXG4gKiBBY2NlcHRzIHJhdyByZXNwb25zZSB0ZXh0LCBhbHJlYWR5LXBhcnNlZCBKU09OLCBvciBEYXRhYnJpY2tzIGVudmVsb3BlcyB0aGF0XG4gKiBuZXN0IEpTT04gc3RyaW5ncyBzZXZlcmFsIHRpbWVzLiBSZXR1cm5zIGBbXWAgd2hlbiBubyBzdXBwb3J0ZWQtdmFsdWVzIGxpc3RcbiAqIGNhbiBiZSByZWNvdmVyZWQuIFJlc3VsdHMgYXJlIG5vdCBjYWNoZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5OiB1bmtub3duKTogUmVhc29uaW5nTGV2ZWxbXSB7XG4gIGNvbnN0IGxldmVsczogUmVhc29uaW5nTGV2ZWxbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxSZWFzb25pbmdMZXZlbD4oKTtcbiAgZm9yIChjb25zdCB0ZXh0IG9mIGNvbGxlY3RUZXh0TGVhdmVzKGJvZHkpKSB7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBleHRyYWN0U3VwcG9ydGVkVG9rZW5zKHRleHQpKSB7XG4gICAgICBjb25zdCBsZXZlbCA9IHBhcnNlUmVhc29uaW5nKHRva2VuKTtcbiAgICAgIGlmICghbGV2ZWwgfHwgc2Vlbi5oYXMobGV2ZWwpKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKGxldmVsKTtcbiAgICAgIGxldmVscy5wdXNoKGxldmVsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxldmVscztcbn1cblxuLyoqXG4gKiBMb29rIHVwIGRvY3VtZW50ZWQgbGV2ZWxzIGZvciBhIG1vZGVsIGlkZW50aXR5IGluc2lkZSBhIGNhdGFsb2d1ZS5cbiAqXG4gKiBNYXRjaGVzIGV4YWN0IGNhdGFsb2d1ZSBrZXlzIGFuZCBzdWZmaXggaWRlbnRpdGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvY3VtZW50ZWRSZWFzb25pbmdMZXZlbHMoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGNhdGFsb2d1ZTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsXG4pOiBSZWFzb25pbmdMZXZlbFtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5cyA9IGNhdGFsb2d1ZUtleXNGb3IobW9kZWwpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgbGV2ZWxzID0gY2F0YWxvZ3VlW2tleV07XG4gICAgaWYgKGxldmVscz8ubGVuZ3RoKSByZXR1cm4gWy4uLmxldmVsc107XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCBsZXZlbHNdIG9mIE9iamVjdC5lbnRyaWVzKGNhdGFsb2d1ZSkpIHtcbiAgICBpZiAoa2V5cy5zb21lKChjYW5kaWRhdGUpID0+IGtleS5lbmRzV2l0aChjYW5kaWRhdGUpIHx8IGNhbmRpZGF0ZS5lbmRzV2l0aChrZXkpKSkge1xuICAgICAgcmV0dXJuIFsuLi5sZXZlbHNdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEhhcmQtY29kZWQgZmFtaWx5IGRlZmF1bHRzIHVzZWQgd2hlbiBkb2N1bWVudGF0aW9uIGhhcyBubyBlbnRyeS5cbiAqXG4gKiBVbmtub3duIGZhbWlsaWVzIHJldHVybiB0aGUgc3RhbmRhcmQgbG93L21lZGl1bS9oaWdoIGxhZGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMobW9kZWw6IHN0cmluZyk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBmYW1pbHkgPSBtb2RlbEZhbWlseShtb2RlbCk/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBtb2RlbC50b0xvd2VyQ2FzZSgpO1xuICBpZiAoZmFtaWx5ID09PSBcImdyb2tcIiB8fCBub3JtYWxpemVkLmluY2x1ZGVzKFwiZ3Jva1wiKSkgcmV0dXJuIFsuLi5XSVRIX0VYVFJBX0hJR0hdO1xuICBpZiAoZmFtaWx5ID09PSBcImdlbWluaVwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJnZW1pbmlcIikpIHJldHVybiBbLi4uU1RBTkRBUkRdO1xuICBpZiAoZmFtaWx5ID09PSBcImNsYXVkZVwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJjbGF1ZGVcIikpIHJldHVybiBbLi4uV0lUSF9NQVhdO1xuICBpZiAoZmFtaWx5ID09PSBcImdsbVwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJnbG1cIikpIHtcbiAgICByZXR1cm4gW1JlYXNvbmluZ0xldmVsLkhpZ2gsIFJlYXNvbmluZ0xldmVsLk1heF07XG4gIH1cbiAgaWYgKFxuICAgIGZhbWlseSA9PT0gXCJkZWVwc2Vla1wiIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcyhcImRlZXBzZWVrXCIpIHx8XG4gICAgZmFtaWx5ID09PSBcImtpbWlcIiB8fFxuICAgIG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJraW1pXCIpXG4gICkge1xuICAgIHJldHVybiBbUmVhc29uaW5nTGV2ZWwuTG93LCBSZWFzb25pbmdMZXZlbC5IaWdoLCBSZWFzb25pbmdMZXZlbC5NYXhdO1xuICB9XG4gIGlmIChmYW1pbHkgPT09IFwiaW5rbGluZ1wiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJpbmtsaW5nXCIpKSByZXR1cm4gWy4uLldJVEhfTUFYXTtcbiAgaWYgKGZhbWlseSA9PT0gXCJncHRcIiB8fCBub3JtYWxpemVkLmluY2x1ZGVzKFwiZ3B0XCIpIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJjb2RleFwiKSkge1xuICAgIGlmIChub3JtYWxpemVkLmluY2x1ZGVzKFwib3NzXCIpKSByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbiAgICBpZiAoLyg/Ol58Wy1fLl0pNVstXy5dPzUoPzpbLV8uXXwkKS8udGVzdChub3JtYWxpemVkKSAmJiBub3JtYWxpemVkLmluY2x1ZGVzKFwicHJvXCIpKSB7XG4gICAgICByZXR1cm4gWy4uLkdQVF81XzVfUFJPXTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgLyg/Ol58Wy1fLl0pNVstXy5dPzYoPzpbLV8uXXwkKS8udGVzdChub3JtYWxpemVkKSB8fFxuICAgICAgLyg/Ol58Wy1fLl0pNig/OlstXy5dfCQpLy50ZXN0KG5vcm1hbGl6ZWQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gWy4uLldJVEhfTUFYXTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5TVEFOREFSRF07XG4gIH1cbiAgaWYgKC8oPzpefFstXy4vXSlvKD86MXwzfDQpKD86Wy1fLi9dfCQpLy50ZXN0KG1vZGVsKSB8fCBub3JtYWxpemVkLmluY2x1ZGVzKFwiY29kZXhcIikpIHtcbiAgICByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbiAgfVxuICByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbn1cblxuLyoqXG4gKiBQcmVmZXIgYSBkb2N1bWVudGF0aW9uIGNhdGFsb2d1ZSB3aGVuIHByb3ZpZGVkLCBvdGhlcndpc2VcbiAqIHtAbGluayBkZWZhdWx0UmVhc29uaW5nTGV2ZWxzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYXNvbmluZ0xldmVsc0ZvcihcbiAgbW9kZWw6IHN0cmluZyxcbiAgY2F0YWxvZ3VlPzogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsXG4pOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgaWYgKGNhdGFsb2d1ZSkge1xuICAgIGNvbnN0IGRvY3VtZW50ZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBjYXRhbG9ndWUpO1xuICAgIGlmIChkb2N1bWVudGVkPy5sZW5ndGgpIHJldHVybiBkb2N1bWVudGVkO1xuICB9XG4gIHJldHVybiBkZWZhdWx0UmVhc29uaW5nTGV2ZWxzKG1vZGVsKTtcbn1cblxuLyoqXG4gKiBNYXAgYSBnZW5lcmljIGxldmVsIG9udG8gdGhlIG1vc3QgY29tbW9uIHByb3ZpZGVyIHdpcmUgdG9rZW4uXG4gKlxuICogYGV4dHJhLWhpZ2hgIGJlY29tZXMgYHhoaWdoYCBiZWNhdXNlIHRoYXQgaXMgd2hhdCBEYXRhYnJpY2tzIC8gT3BlbkFJIGVycm9yXG4gKiBtZXNzYWdlcyBhZHZlcnRpc2UgdG9kYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRSZWFzb25pbmcobGV2ZWw6IFJlYXNvbmluZ0xldmVsKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxldmVsID09PSBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2ggPyBcInhoaWdoXCIgOiBsZXZlbDtcbn1cblxuLyoqIFdpcmUgdG9rZW5zIHRoYXQgbWVhbiBcImRvIG5vdCByZWFzb25cIiByYXRoZXIgdGhhbiBcInVzZSBhIGxvdyBidWRnZXRcIi4gKi9cbmNvbnN0IERJU0FCTEVEX1JFQVNPTklOR19UT0tFTlMgPSBuZXcgU2V0KFtcIm5vbmVcIiwgXCJvZmZcIiwgXCJkaXNhYmxlXCIsIFwiZGlzYWJsZWRcIl0pO1xuXG4vKipcbiAqIFJlbWFwIGEgcmVxdWVzdGVkIGVmZm9ydCBvbnRvIHRoZSBuZWFyZXN0IHN1cHBvcnRlZCB7QGxpbmsgUmVhc29uaW5nTGV2ZWx9LlxuICpcbiAqIGBub25lYCAvIGBvZmZgIChhbmQgZGlzYWJsZSBhbGlhc2VzKSBhcmUgbm90IGEgbG93IGJ1ZGdldDogd2hlbiB0aGUgbW9kZWxcbiAqIHJlcXVpcmVzIHJlYXNvbmluZywgdGhleSBzbmFwIHRvIHRoZSBzdXBwb3J0ZWQgbGV2ZWwgY2xvc2VzdCB0b1xuICoge0BsaW5rIFJlYXNvbmluZ0xldmVsLk1lZGl1bX0uIE90aGVyIHJlcXVlc3RzIHByZWZlciB0aGUgaGlnaGVzdCBhbGxvd2VkXG4gKiBsZXZlbCBhdCBvciBiZWxvdyB0aGUgcmVxdWVzdCwgb3RoZXJ3aXNlIHRoZSBsb3dlc3QgYWxsb3dlZCBsZXZlbC5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIHJlcXVlc3QgY2Fubm90IGJlIHBhcnNlZCBvciBgbGV2ZWxzYCBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwUmVhc29uaW5nKFxuICByZXF1ZXN0ZWQ6IHVua25vd24sXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpc0Rpc2FibGVkUmVhc29uaW5nVG9rZW4ocmVxdWVzdGVkKSkge1xuICAgIHJldHVybiBuZWFyZXN0UmVhc29uaW5nKFJlYXNvbmluZ0xldmVsLk1lZGl1bSwgbGV2ZWxzKTtcbiAgfVxuICBjb25zdCBwYXJzZWQgPSBwYXJzZVJlYXNvbmluZyhyZXF1ZXN0ZWQpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGxldmVscy5pbmNsdWRlcyhwYXJzZWQpKSByZXR1cm4gcGFyc2VkO1xuICBjb25zdCByZXF1ZXN0ZWRJbmRleCA9IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihwYXJzZWQpO1xuICBsZXQgYmVzdDogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQ7XG4gIGxldCBiZXN0SW5kZXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgY29uc3QgaW5kZXggPSBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YobGV2ZWwpO1xuICAgIGlmIChpbmRleCA8PSByZXF1ZXN0ZWRJbmRleCAmJiBpbmRleCA+IGJlc3RJbmRleCkge1xuICAgICAgYmVzdCA9IGxldmVsO1xuICAgICAgYmVzdEluZGV4ID0gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0ID8/IGxldmVsc1swXTtcbn1cblxuZnVuY3Rpb24gaXNEaXNhYmxlZFJlYXNvbmluZ1Rva2VuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIERJU0FCTEVEX1JFQVNPTklOR19UT0tFTlMuaGFzKG5vcm1hbGl6ZVJlYXNvbmluZ1Rva2VuKFN0cmluZyh2YWx1ZSkpKTtcbn1cblxuLyoqIENsb3Nlc3Qgc3VwcG9ydGVkIGxldmVsIHRvIGB0YXJnZXRgOyB0aWVzIHByZWZlciB0aGUgaGlnaGVyIGJ1ZGdldC4gKi9cbmZ1bmN0aW9uIG5lYXJlc3RSZWFzb25pbmcoXG4gIHRhcmdldDogUmVhc29uaW5nTGV2ZWwsXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChsZXZlbHMuaW5jbHVkZXModGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgY29uc3QgdGFyZ2V0SW5kZXggPSBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YodGFyZ2V0KTtcbiAgbGV0IGJlc3Q6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkO1xuICBsZXQgYmVzdERpc3RhbmNlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICBmb3IgKGNvbnN0IGxldmVsIG9mIGxldmVscykge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKGxldmVsKSAtIHRhcmdldEluZGV4KTtcbiAgICBpZiAoXG4gICAgICBkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSB8fFxuICAgICAgKGRpc3RhbmNlID09PSBiZXN0RGlzdGFuY2UgJiZcbiAgICAgICAgUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKGxldmVsKSA+IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihiZXN0ID8/IGxldmVsKSlcbiAgICApIHtcbiAgICAgIGJlc3QgPSBsZXZlbDtcbiAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmVzdDtcbn1cblxuLyoqIFJlc3VsdCBvZiBhZGFwdGluZyByZWFzb25pbmcgZmllbGRzIG9uIGEgZ2F0ZXdheSByZXF1ZXN0IGJvZHkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIHtcbiAgLyoqIEJvZHkgd2l0aCByZW1hcHBlZCB3aXJlIHRva2VucyAoc2FtZSByZWZlcmVuY2Ugd2hlbiB1bmNoYW5nZWQpLiAqL1xuICByZWFkb25seSBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKiBUcnVlIHdoZW4gYW55IHJlYXNvbmluZyBmaWVsZCB3YXMgcmV3cml0dGVuLiAqL1xuICByZWFkb25seSBjaGFuZ2VkOiBib29sZWFuO1xuICAvKiogV2lyZSB0b2tlbiB3cml0dGVuIHdoZW4gYSByZWFzb25pbmcgZmllbGQgd2FzIHByZXNlbnQgYW5kIHJlbWFwcGVkLiAqL1xuICByZWFkb25seSB3aXJlRWZmb3J0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJld3JpdGUgYHJlYXNvbmluZ19lZmZvcnRgIC8gYHJlYXNvbmluZy5lZmZvcnRgIG9udG8gYSBzdXBwb3J0ZWQgbGFkZGVyLlxuICpcbiAqIE1vZGVsLWFnbm9zdGljOiBjYWxsZXJzIHN1cHBseSB0aGUgYWxsb3dlZCBsZXZlbHMgKGxlYXJuZWQsIGRvY3VtZW50ZWQsIG9yXG4gKiBkZWZhdWx0cykuIEJvZGllcyB3aXRob3V0IHJlYXNvbmluZyBmaWVsZHMgYXJlIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0UmVxdWVzdFJlYXNvbmluZyhcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICBsZXZlbHM6IHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10sXG4pOiBBZGFwdGVkUmVxdWVzdFJlYXNvbmluZyB7XG4gIGlmIChsZXZlbHMubGVuZ3RoID09PSAwKSByZXR1cm4geyBib2R5LCBjaGFuZ2VkOiBmYWxzZSB9O1xuXG4gIGNvbnN0IHRvcExldmVsID0gYm9keS5yZWFzb25pbmdfZWZmb3J0O1xuICBjb25zdCByZWFzb25pbmcgPSBpc1JlY29yZChib2R5LnJlYXNvbmluZykgPyBib2R5LnJlYXNvbmluZyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbmVzdGVkID0gcmVhc29uaW5nPy5lZmZvcnQ7XG4gIGNvbnN0IHJlcXVlc3RlZCA9IHRvcExldmVsID8/IG5lc3RlZDtcbiAgaWYgKHJlcXVlc3RlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4geyBib2R5LCBjaGFuZ2VkOiBmYWxzZSB9O1xuXG4gIGNvbnN0IHJlbWFwcGVkID0gcmVtYXBSZWFzb25pbmcocmVxdWVzdGVkLCBsZXZlbHMpO1xuICBpZiAoIXJlbWFwcGVkKSByZXR1cm4geyBib2R5LCBjaGFuZ2VkOiBmYWxzZSB9O1xuICBjb25zdCB3aXJlID0gZm9ybWF0UmVhc29uaW5nKHJlbWFwcGVkKTtcblxuICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICBsZXQgbmV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLmJvZHkgfTtcblxuICBpZiAodHlwZW9mIHRvcExldmVsID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB0b3BMZXZlbCA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmIChTdHJpbmcodG9wTGV2ZWwpICE9PSB3aXJlKSB7XG4gICAgICBuZXh0ID0geyAuLi5uZXh0LCByZWFzb25pbmdfZWZmb3J0OiB3aXJlIH07XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHJlYXNvbmluZyAmJiAodHlwZW9mIG5lc3RlZCA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgbmVzdGVkID09PSBcIm51bWJlclwiKSkge1xuICAgIGlmIChTdHJpbmcobmVzdGVkKSAhPT0gd2lyZSkge1xuICAgICAgbmV4dCA9IHsgLi4ubmV4dCwgcmVhc29uaW5nOiB7IC4uLnJlYXNvbmluZywgZWZmb3J0OiB3aXJlIH0gfTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGFuZ2VkXG4gICAgPyB7IGJvZHk6IG5leHQsIGNoYW5nZWQ6IHRydWUsIHdpcmVFZmZvcnQ6IHdpcmUgfVxuICAgIDogeyBib2R5LCBjaGFuZ2VkOiBmYWxzZSwgd2lyZUVmZm9ydDogd2lyZSB9O1xufVxuXG4vKiogTm9ybWFsaXplIGxhYmVscyBmb3IgYWxpYXMgbG9va3VwIChgRXh0cmEgSGlnaGAg4oaSIGBleHRyYS1oaWdoYCkuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVhc29uaW5nVG9rZW4odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgdHJpbVRvTnVsbCh2YWx1ZSlcbiAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1tfXFxzXSsvZywgXCItXCIpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTktXS9nLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoLy0rL2csIFwiLVwiKVxuICAgICAgLnJlcGxhY2UoL14tfC0kL2csIFwiXCIpID8/IFwiXCJcbiAgKTtcbn1cblxuLyoqIERlZHVwbGljYXRlIGxldmVscyB3aGlsZSBwcmVzZXJ2aW5nIGZpcnN0LXNlZW4gb3JkZXIuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxSZWFzb25pbmdMZXZlbD4oKTtcbiAgY29uc3Qgb3JkZXJlZDogUmVhc29uaW5nTGV2ZWxbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxldmVsIG9mIGxldmVscykge1xuICAgIGlmIChzZWVuLmhhcyhsZXZlbCkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGxldmVsKTtcbiAgICBvcmRlcmVkLnB1c2gobGV2ZWwpO1xuICB9XG4gIHJldHVybiBvcmRlcmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0U3VwcG9ydGVkVG9rZW5zKHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbWF0Y2ggPSBTVVBQT1JURURfVkFMVUVTX1BBVFRFUk4uZXhlYyh0ZXh0KTtcbiAgaWYgKCFtYXRjaD8uWzFdKSByZXR1cm4gW107XG4gIHJldHVybiB0b2tlbnNGcm9tRnJhZ21lbnQobWF0Y2hbMV0pO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVLZXlzRm9yKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGlyZWN0ID0gbW9kZWxDYXRhbG9ndWVLZXkobW9kZWwpO1xuICBpZiAoZGlyZWN0KSBrZXlzLmFkZChkaXJlY3QpO1xuICBjb25zdCBzdHJpcHBlZCA9IG1vZGVsXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXmRhdGFicmlja3NcXC8vLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9ec3lzdGVtXFwuYWlcXC4vLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9eZGF0YWJyaWNrcy0vLCBcIlwiKTtcbiAgY29uc3Qgc3RyaXBwZWRLZXkgPSBtb2RlbENhdGFsb2d1ZUtleShzdHJpcHBlZCk7XG4gIGlmIChzdHJpcHBlZEtleSkga2V5cy5hZGQoc3RyaXBwZWRLZXkpO1xuICBjb25zdCB3aXRoUHJlZml4ID0gbW9kZWxDYXRhbG9ndWVLZXkoYGRhdGFicmlja3MtJHtzdHJpcHBlZH1gKTtcbiAgaWYgKHdpdGhQcmVmaXgpIGtleXMuYWRkKHdpdGhQcmVmaXgpO1xuICByZXR1cm4gWy4uLmtleXNdO1xufVxuXG5mdW5jdGlvbiBtb2RlbENhdGFsb2d1ZUtleShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmltbWVkID0gdHJpbVRvTnVsbChuYW1lKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKFxuICAgIG1vZGVsU2VhcmNoUXVlcnkodHJpbW1lZCk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKSA/P1xuICAgIHRyaW1tZWRcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvXmRhdGFicmlja3MtLywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5fLV0rL2csIFwiLVwiKVxuICApO1xufVxuXG5mdW5jdGlvbiB0b2tlbnNGcm9tRnJhZ21lbnQoZnJhZ21lbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgZnJhZ21lbnQubWF0Y2hBbGwoVE9LRU5fUEFUVEVSTikpIHtcbiAgICBjb25zdCB0b2tlbiA9IHBhcnRbMV0gPz8gcGFydFsyXSA/PyBwYXJ0WzNdID8/IHBhcnRbNF07XG4gICAgaWYgKCF0b2tlbiB8fCB0b2tlbiA9PT0gXCJhbmRcIiB8fCB0b2tlbiA9PT0gXCJvclwiIHx8IHRva2VuID09PSBcIm9mXCIpIGNvbnRpbnVlO1xuICAgIHRva2Vucy5wdXNoKHRva2VuLnJlcGxhY2UoL15bXCInYF0rfFtcIidgXSskL2csIFwiXCIpKTtcbiAgfVxuICByZXR1cm4gdG9rZW5zO1xufVxuXG4vKipcbiAqIFdhbGsgYSB2YWx1ZSB0cmVlLCB1bndyYXBwaW5nIG5lc3RlZCBKU09OIHN0cmluZ3MsIGFuZCBjb2xsZWN0IHRleHQgbGVhdmVzXG4gKiB0aGF0IG1heSBjb250YWluIGEgc3VwcG9ydGVkLXZhbHVlcyBzZW50ZW5jZS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRleHRMZWF2ZXModmFsdWU6IHVua25vd24sIGRlcHRoID0gMCk6IHN0cmluZ1tdIHtcbiAgaWYgKHZhbHVlID09IG51bGwgfHwgZGVwdGggPiBNQVhfSlNPTl9VTldSQVBfREVQVEgpIHJldHVybiBbXTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gW107XG4gICAgY29uc3QgcGFyc2VkID0gdHJ5VW53cmFwSnNvbih0cmltbWVkKTtcbiAgICBpZiAocGFyc2VkICE9PSB1bmRlZmluZWQgJiYgcGFyc2VkICE9PSB0cmltbWVkKSB7XG4gICAgICByZXR1cm4gY29sbGVjdFRleHRMZWF2ZXMocGFyc2VkLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gW3RyaW1tZWRdO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFtTdHJpbmcodmFsdWUpXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKGVudHJ5KSA9PiBjb2xsZWN0VGV4dExlYXZlcyhlbnRyeSwgZGVwdGggKyAxKSk7XG4gIH1cbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXModmFsdWUpLmZsYXRNYXAoKGVudHJ5KSA9PiBjb2xsZWN0VGV4dExlYXZlcyhlbnRyeSwgZGVwdGggKyAxKSk7XG59XG5cbmZ1bmN0aW9uIHRyeVVud3JhcEpzb24odGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGFzUmVjb3JkID0gcGFyc2VSZWNvcmQodGV4dCk7XG4gIGlmIChhc1JlY29yZCkgcmV0dXJuIGFzUmVjb3JkO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZSh0ZXh0KTtcbiAgaWYgKHBhcnNlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcGFyc2VkO1xuICBpZiAodGV4dC5pbmNsdWRlcygnXFxcXFwiJykgfHwgdGV4dC5pbmNsdWRlcyhcIlxcXFxuXCIpKSB7XG4gICAgY29uc3QgdW5lc2NhcGVkID0gdGV4dC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykucmVwbGFjZSgvXFxcXG4vZywgXCJcXG5cIikucmVwbGFjZSgvXFxcXFxcXFwvZywgXCJcXFxcXCIpO1xuICAgIGlmICh1bmVzY2FwZWQgIT09IHRleHQpIHtcbiAgICAgIGNvbnN0IG5lc3RlZCA9IHBhcnNlKHVuZXNjYXBlZCk7XG4gICAgICBpZiAobmVzdGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBuZXN0ZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
450
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhc29uaW5nLXRyYW5zbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xGLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzVELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsUUFBUTtJQUNoQixJQUFJLEVBQUUsTUFBTTtJQUNaLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLEdBQUcsRUFBRSxLQUFLO0NBQ3VDLENBQUM7QUFFcEQsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE4QjtJQUN6RCxjQUFjLENBQUMsR0FBRztJQUNsQixjQUFjLENBQUMsTUFBTTtJQUNyQixjQUFjLENBQUMsSUFBSTtJQUNuQixjQUFjLENBQUMsU0FBUztJQUN4QixjQUFjLENBQUMsR0FBRztDQUNuQixDQUFDO0FBS0YsTUFBTSxRQUFRLEdBQThCO0lBQzFDLGNBQWMsQ0FBQyxHQUFHO0lBQ2xCLGNBQWMsQ0FBQyxNQUFNO0lBQ3JCLGNBQWMsQ0FBQyxJQUFJO0NBQ3BCLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBOEI7SUFDakQsY0FBYyxDQUFDLEdBQUc7SUFDbEIsY0FBYyxDQUFDLE1BQU07SUFDckIsY0FBYyxDQUFDLElBQUk7SUFDbkIsY0FBYyxDQUFDLFNBQVM7Q0FDekIsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUE4QjtJQUMxQyxjQUFjLENBQUMsR0FBRztJQUNs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LENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQ2pDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxJQUFJLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM5QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3hDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pGLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJpYyByZWFzb25pbmctYnVkZ2V0IHRyYW5zbGF0aW9uIGZvciBNb2RlbCBTZXJ2aW5nIGFuZCBnYXRld2F5IGNhbGxlcnMuXG4gKlxuICogUHJvdmlkZXIgd2lyZXMgZGlzYWdyZWUgb24gZWZmb3J0IGxhYmVscyAoYHhoaWdoYCwgYHVsdHJhYCwgYG1lZGAsIGBub25lYCwg4oCmKS5cbiAqIFRoaXMgbW9kdWxlIG93bnMgb25lIGluZHVzdHJ5LXNoYXBlZCBsYWRkZXIgYW5kIHR3byBwYXJzZXJzOlxuICpcbiAqIC0ge0BsaW5rIHBhcnNlUmVhc29uaW5nfTogZnV6enktbWF0Y2ggb25lIGxhYmVsIG9udG8ge0BsaW5rIFJlYXNvbmluZ0xldmVsfVxuICogLSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9OiB1bndyYXAgbmVzdGVkIC8gZG91YmxlLWVuY29kZWQgZXJyb3IgYm9kaWVzXG4gKiAtIHtAbGluayByZW1hcFJlYXNvbmluZ30gLyB7QGxpbmsgYWRhcHRSZXF1ZXN0UmVhc29uaW5nfTogbWFwIGEgcmVxdWVzdCBvbnRvIGFcbiAqICAgc3VwcG9ydGVkIGxhZGRlciBhbmQgcmV3cml0ZSBgcmVhc29uaW5nX2VmZm9ydGAgLyBgcmVhc29uaW5nLmVmZm9ydGBcbiAqXG4gKiBEb2N1bWVudGVkIG1vZGVsIGxhZGRlcnMgY29tZSBmcm9tIHRoZSBjb21taXR0ZWQgSFRNTCBzbmFwc2hvdCByZWZyZXNoZWQgYnlcbiAqIGBidW4gcnVuIC0tZmlsdGVyICdAZGJ4LXRvb2xzL21vZGVsJyBtZXRhZGF0YWAgKHNhbWUgY2FjaGUgcGF0aCBhc1xuICogY2FwYWJpbGl0aWVzIC8gcmF0ZSBsaW1pdHMpLiBFcnJvci1ib2R5IHBhcnNpbmcgaXMgbmV2ZXIgY2FjaGVkOyBjYWxsZXJzXG4gKiBwZXJzaXN0IGxlYXJuZWQgbGFkZGVycyB2aWEgdGhlIG1ldGFkYXRhIG1vZHVsZS5cbiAqXG4gKiBFcnJvciBib2RpZXMgYXJyaXZlIGFzIGNvbXBsZXRlIEhUVFAgSlNPTiB3aGV0aGVyIHRoZSByZXF1ZXN0IGFza2VkIGZvclxuICogc3RyZWFtaW5nIG9yIG5vdCAoRGF0YWJyaWNrcyByZWplY3RzIHVuc3VwcG9ydGVkIGVmZm9ydHMgd2l0aCA0MDAgYmVmb3JlIFNTRVxuICogc3RhcnRzKSwgc28ge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfSBhcHBsaWVzIHRvIGJvdGggcGF0aHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBhcnNlUmVjb3JkLCBwYXJzZSwgaXNSZWNvcmQsIHRyaW1Ub051bGwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgbW9kZWxGYW1pbHksIG1vZGVsU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxuLyoqIEluZHVzdHJ5LWdlbmVyaWMgcmVhc29uaW5nIGJ1ZGdldCBsZXZlbHMsIGxvd2VzdCB0byBoaWdoZXN0LiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTGV2ZWwgPSBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiIHwgXCJleHRyYS1oaWdoXCIgfCBcIm1heFwiO1xuXG4vKiogUnVudGltZSB2YWx1ZXMgZm9yIHtAbGluayBSZWFzb25pbmdMZXZlbH0uICovXG5leHBvcnQgY29uc3QgUmVhc29uaW5nTGV2ZWwgPSB7XG4gIExvdzogXCJsb3dcIixcbiAgTWVkaXVtOiBcIm1lZGl1bVwiLFxuICBIaWdoOiBcImhpZ2hcIixcbiAgRXh0cmFIaWdoOiBcImV4dHJhLWhpZ2hcIixcbiAgTWF4OiBcIm1heFwiLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+O1xuXG4vKiogQ2Fub25pY2FsIGxhZGRlciBvcmRlciB1c2VkIHdoZW4gc29ydGluZyBvciByYW5raW5nIHJlbWFwcy4gKi9cbmV4cG9ydCBjb25zdCBSRUFTT05JTkdfTEVWRUxTOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG4vKiogTW9kZWwgaWRlbnRpdHkg4oaSIGFjY2VwdGVkIHtAbGluayBSZWFzb25pbmdMZXZlbH0gbGFkZGVyLiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj47XG5cbmNvbnN0IFNUQU5EQVJEOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfRVhUUkFfSElHSDogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTG93LFxuICBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfTUFYOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG5jb25zdCBHUFRfNV81X1BSTzogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG5dO1xuXG4vKipcbiAqIEFsaWFzIHRhYmxlIGZvciBleGFjdCAvIG5lYXItZXhhY3QgbGFiZWxzLiBLZXlzIGFyZSB7QGxpbmsgbm9ybWFsaXplUmVhc29uaW5nVG9rZW59XG4gKiByZXN1bHRzLiBQcm92aWRlciB3aXJlcyAoYHhoaWdoYCkgYW5kIHBsYWluIEVuZ2xpc2ggKGB1bHRyYWAsIGBtZWRgKSBib3RoIGxhbmRcbiAqIG9uIHRoZSBnZW5lcmljIGxhZGRlci5cbiAqL1xuY29uc3QgQUxJQVNFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+PiA9IHtcbiAgbG93OiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIGw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbm9uZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBvZmY6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgZGlzYWJsZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBkaXNhYmxlZDogUmVhc29uaW5nTGV2ZWwuTG93LFxuICB6ZXJvOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIG1pbmltYWw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWluOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIHRpbnk6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbGlnaHQ6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWVkaXVtOiBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIG1lZDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBtaWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgbW9kZXJhdGU6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgZGVmYXVsdDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBub3JtYWw6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgYmFsYW5jZWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgaGlnaDogUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgaGk6IFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIGhlYXZ5OiBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBcImV4dHJhLWhpZ2hcIjogUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBleHRyYWhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGg6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmE6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgXCJ1bHRyYS1oaWdoXCI6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmFoaWdoOiBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG4gIG1heDogUmVhc29uaW5nTGV2ZWwuTWF4LFxuICBtYXhpbXVtOiBSZWFzb25pbmdMZXZlbC5NYXgsXG4gIGhpZ2hlc3Q6IFJlYXNvbmluZ0xldmVsLk1heCxcbiAgZnVsbDogUmVhc29uaW5nTGV2ZWwuTWF4LFxufTtcblxuY29uc3QgU1VQUE9SVEVEX1ZBTFVFU19QQVRURVJOID1cbiAgL3N1cHBvcnRlZFxccyt2YWx1ZXM/XFxzK2FyZVxccyo6P1xccyooLis/KSg/OlxcLj9cXHMqKD86cGFyYW18dHlwZXxjb2RlKVxcYnwkKS9pcztcbmNvbnN0IFRPS0VOX1BBVFRFUk4gPSAvJyhbXiddKyknfFwiKFteXCJdKylcInxgKFteYF0rKWB8XFxiKFthLXpdW2EtejAtOV8tXSopXFxiL2dpO1xuY29uc3QgTUFYX0pTT05fVU5XUkFQX0RFUFRIID0gODtcblxuaW50ZXJmYWNlIEFsaWFzRG9jdW1lbnQge1xuICByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICByZWFkb25seSBsZXZlbDogUmVhc29uaW5nTGV2ZWw7XG59XG5cbmNvbnN0IGFsaWFzRG9jdW1lbnRzOiByZWFkb25seSBBbGlhc0RvY3VtZW50W10gPSBPYmplY3QuZW50cmllcyhBTElBU0VTKS5tYXAoKFt0b2tlbiwgbGV2ZWxdKSA9PiAoe1xuICB0b2tlbixcbiAgbGV2ZWwsXG59KSk7XG5cbmNvbnN0IGFsaWFzRnVzZSA9IG5ldyBGdXNlKGFsaWFzRG9jdW1lbnRzLCB7XG4gIGtleXM6IFtcInRva2VuXCJdLFxuICBpbmNsdWRlU2NvcmU6IHRydWUsXG4gIHRocmVzaG9sZDogMC4zNSxcbiAgaWdub3JlTG9jYXRpb246IHRydWUsXG59KTtcblxuLyoqXG4gKiBGdXp6eS1tYXRjaCBvbmUgcmVhc29uaW5nIGxhYmVsIG9udG8ge0BsaW5rIFJlYXNvbmluZ0xldmVsfS5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGlucHV0IGlzIGVtcHR5IG9yIGNhbm5vdCBiZSBtYXBwZWQgY29uZmlkZW50bHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlYXNvbmluZyh2YWx1ZTogdW5rbm93bik6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVJlYXNvbmluZ1Rva2VuKFN0cmluZyh2YWx1ZSkpO1xuICBpZiAoIW5vcm1hbGl6ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGV4YWN0ID0gQUxJQVNFU1tub3JtYWxpemVkXSA/PyBBTElBU0VTW25vcm1hbGl6ZWQucmVwbGFjZSgvLS9nLCBcIlwiKV07XG4gIGlmIChleGFjdCkgcmV0dXJuIGV4YWN0O1xuICBjb25zdCBbbWF0Y2hdID0gYWxpYXNGdXNlLnNlYXJjaChub3JtYWxpemVkKTtcbiAgaWYgKCFtYXRjaCB8fCAobWF0Y2guc2NvcmUgPz8gMSkgPiAwLjM1KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbWF0Y2guaXRlbS5sZXZlbDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHN1cHBvcnRlZCByZWFzb25pbmcgbGV2ZWxzIGZyb20gYW4gdXBzdHJlYW0gZXJyb3IgYm9keS5cbiAqXG4gKiBBY2NlcHRzIHJhdyByZXNwb25zZSB0ZXh0LCBhbHJlYWR5LXBhcnNlZCBKU09OLCBvciBEYXRhYnJpY2tzIGVudmVsb3BlcyB0aGF0XG4gKiBuZXN0IEpTT04gc3RyaW5ncyBzZXZlcmFsIHRpbWVzLiBSZXR1cm5zIGBbXWAgd2hlbiBubyBzdXBwb3J0ZWQtdmFsdWVzIGxpc3RcbiAqIGNhbiBiZSByZWNvdmVyZWQuIFJlc3VsdHMgYXJlIG5vdCBjYWNoZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5OiB1bmtub3duKTogUmVhc29uaW5nTGV2ZWxbXSB7XG4gIGNvbnN0IGxldmVsczogUmVhc29uaW5nTGV2ZWxbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxSZWFzb25pbmdMZXZlbD4oKTtcbiAgZm9yIChjb25zdCB0ZXh0IG9mIGNvbGxlY3RUZXh0TGVhdmVzKGJvZHkpKSB7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBleHRyYWN0U3VwcG9ydGVkVG9rZW5zKHRleHQpKSB7XG4gICAgICBjb25zdCBsZXZlbCA9IHBhcnNlUmVhc29uaW5nKHRva2VuKTtcbiAgICAgIGlmICghbGV2ZWwgfHwgc2Vlbi5oYXMobGV2ZWwpKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKGxldmVsKTtcbiAgICAgIGxldmVscy5wdXNoKGxldmVsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxldmVscztcbn1cblxuLyoqXG4gKiBMb29rIHVwIGRvY3VtZW50ZWQgbGV2ZWxzIGZvciBhIG1vZGVsIGlkZW50aXR5IGluc2lkZSBhIGNhdGFsb2d1ZS5cbiAqXG4gKiBNYXRjaGVzIGV4YWN0IGNhdGFsb2d1ZSBrZXlzIGFuZCBzdWZmaXggaWRlbnRpdGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvY3VtZW50ZWRSZWFzb25pbmdMZXZlbHMoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGNhdGFsb2d1ZTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsXG4pOiBSZWFzb25pbmdMZXZlbFtdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5cyA9IGNhdGFsb2d1ZUtleXNGb3IobW9kZWwpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgbGV2ZWxzID0gY2F0YWxvZ3VlW2tleV07XG4gICAgaWYgKGxldmVscz8ubGVuZ3RoKSByZXR1cm4gWy4uLmxldmVsc107XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCBsZXZlbHNdIG9mIE9iamVjdC5lbnRyaWVzKGNhdGFsb2d1ZSkpIHtcbiAgICBpZiAoa2V5cy5zb21lKChjYW5kaWRhdGUpID0+IGtleS5lbmRzV2l0aChjYW5kaWRhdGUpIHx8IGNhbmRpZGF0ZS5lbmRzV2l0aChrZXkpKSkge1xuICAgICAgcmV0dXJuIFsuLi5sZXZlbHNdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEhhcmQtY29kZWQgZmFtaWx5IGRlZmF1bHRzIHVzZWQgd2hlbiBkb2N1bWVudGF0aW9uIGhhcyBubyBlbnRyeS5cbiAqXG4gKiBVbmtub3duIGZhbWlsaWVzIHJldHVybiB0aGUgc3RhbmRhcmQgbG93L21lZGl1bS9oaWdoIGxhZGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMobW9kZWw6IHN0cmluZyk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBmYW1pbHkgPSBtb2RlbEZhbWlseShtb2RlbCk/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBtb2RlbC50b0xvd2VyQ2FzZSgpO1xuICBpZiAoZmFtaWx5ID09PSBcImdyb2tcIiB8fCBub3JtYWxpemVkLmluY2x1ZGVzKFwiZ3Jva1wiKSkgcmV0dXJuIFsuLi5XSVRIX0VYVFJBX0hJR0hdO1xuICBpZiAoZmFtaWx5ID09PSBcImdlbWluaVwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJnZW1pbmlcIikpIHJldHVybiBbLi4uU1RBTkRBUkRdO1xuICBpZiAoZmFtaWx5ID09PSBcImNsYXVkZVwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJjbGF1ZGVcIikpIHJldHVybiBbLi4uV0lUSF9NQVhdO1xuICBpZiAoZmFtaWx5ID09PSBcImdsbVwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJnbG1cIikpIHtcbiAgICByZXR1cm4gW1JlYXNvbmluZ0xldmVsLkhpZ2gsIFJlYXNvbmluZ0xldmVsLk1heF07XG4gIH1cbiAgaWYgKFxuICAgIGZhbWlseSA9PT0gXCJkZWVwc2Vla1wiIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcyhcImRlZXBzZWVrXCIpIHx8XG4gICAgZmFtaWx5ID09PSBcImtpbWlcIiB8fFxuICAgIG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJraW1pXCIpXG4gICkge1xuICAgIHJldHVybiBbUmVhc29uaW5nTGV2ZWwuTG93LCBSZWFzb25pbmdMZXZlbC5IaWdoLCBSZWFzb25pbmdMZXZlbC5NYXhdO1xuICB9XG4gIGlmIChmYW1pbHkgPT09IFwiaW5rbGluZ1wiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJpbmtsaW5nXCIpKSByZXR1cm4gWy4uLldJVEhfTUFYXTtcbiAgaWYgKGZhbWlseSA9PT0gXCJncHRcIiB8fCBub3JtYWxpemVkLmluY2x1ZGVzKFwiZ3B0XCIpIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJjb2RleFwiKSkge1xuICAgIGlmIChub3JtYWxpemVkLmluY2x1ZGVzKFwib3NzXCIpKSByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbiAgICBpZiAoLyg/Ol58Wy1fLl0pNVstXy5dPzUoPzpbLV8uXXwkKS8udGVzdChub3JtYWxpemVkKSAmJiBub3JtYWxpemVkLmluY2x1ZGVzKFwicHJvXCIpKSB7XG4gICAgICByZXR1cm4gWy4uLkdQVF81XzVfUFJPXTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgLyg/Ol58Wy1fLl0pNVstXy5dPzYoPzpbLV8uXXwkKS8udGVzdChub3JtYWxpemVkKSB8fFxuICAgICAgLyg/Ol58Wy1fLl0pNig/OlstXy5dfCQpLy50ZXN0KG5vcm1hbGl6ZWQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gWy4uLldJVEhfTUFYXTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5TVEFOREFSRF07XG4gIH1cbiAgaWYgKC8oPzpefFstXy4vXSlvKD86MXwzfDQpKD86Wy1fLi9dfCQpLy50ZXN0KG1vZGVsKSB8fCBub3JtYWxpemVkLmluY2x1ZGVzKFwiY29kZXhcIikpIHtcbiAgICByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbiAgfVxuICByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbn1cblxuLyoqXG4gKiBQcmVmZXIgYSBkb2N1bWVudGF0aW9uIGNhdGFsb2d1ZSB3aGVuIHByb3ZpZGVkLCBvdGhlcndpc2VcbiAqIHtAbGluayBkZWZhdWx0UmVhc29uaW5nTGV2ZWxzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYXNvbmluZ0xldmVsc0ZvcihcbiAgbW9kZWw6IHN0cmluZyxcbiAgY2F0YWxvZ3VlPzogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsXG4pOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgaWYgKGNhdGFsb2d1ZSkge1xuICAgIGNvbnN0IGRvY3VtZW50ZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBjYXRhbG9ndWUpO1xuICAgIGlmIChkb2N1bWVudGVkPy5sZW5ndGgpIHJldHVybiBkb2N1bWVudGVkO1xuICB9XG4gIHJldHVybiBkZWZhdWx0UmVhc29uaW5nTGV2ZWxzKG1vZGVsKTtcbn1cblxuLyoqXG4gKiBNYXAgYSBnZW5lcmljIGxldmVsIG9udG8gdGhlIG1vc3QgY29tbW9uIHByb3ZpZGVyIHdpcmUgdG9rZW4uXG4gKlxuICogYGV4dHJhLWhpZ2hgIGJlY29tZXMgYHhoaWdoYCBiZWNhdXNlIHRoYXQgaXMgd2hhdCBEYXRhYnJpY2tzIC8gT3BlbkFJIGVycm9yXG4gKiBtZXNzYWdlcyBhZHZlcnRpc2UgdG9kYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRSZWFzb25pbmcobGV2ZWw6IFJlYXNvbmluZ0xldmVsKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxldmVsID09PSBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2ggPyBcInhoaWdoXCIgOiBsZXZlbDtcbn1cblxuLyoqIFdpcmUgdG9rZW5zIHRoYXQgbWVhbiBcImRvIG5vdCByZWFzb25cIiByYXRoZXIgdGhhbiBcInVzZSBhIGxvdyBidWRnZXRcIi4gKi9cbmNvbnN0IERJU0FCTEVEX1JFQVNPTklOR19UT0tFTlMgPSBuZXcgU2V0KFtcIm5vbmVcIiwgXCJvZmZcIiwgXCJkaXNhYmxlXCIsIFwiZGlzYWJsZWRcIl0pO1xuXG4vKipcbiAqIFJlbWFwIGEgcmVxdWVzdGVkIGVmZm9ydCBvbnRvIHRoZSBuZWFyZXN0IHN1cHBvcnRlZCB7QGxpbmsgUmVhc29uaW5nTGV2ZWx9LlxuICpcbiAqIGBub25lYCAvIGBvZmZgIChhbmQgZGlzYWJsZSBhbGlhc2VzKSwgbnVsbCwgYW5kIHVucmVjb2duaXplZCBleHBsaWNpdCB2YWx1ZXNcbiAqIGFyZSBub3QgdHJlYXRlZCBhcyBhIGxvdyBidWRnZXQ6IHdoZW4gdGhlIG1vZGVsIHJlcXVpcmVzIHJlYXNvbmluZywgdGhleVxuICogc25hcCB0byB0aGUgc3VwcG9ydGVkIGxldmVsIGNsb3Nlc3QgdG8ge0BsaW5rIFJlYXNvbmluZ0xldmVsLk1lZGl1bX0uIE90aGVyXG4gKiByZXF1ZXN0cyBwcmVmZXIgdGhlIGhpZ2hlc3QgYWxsb3dlZCBsZXZlbCBhdCBvciBiZWxvdyB0aGUgcmVxdWVzdCwgb3RoZXJ3aXNlXG4gKiB0aGUgbG93ZXN0IGFsbG93ZWQgbGV2ZWwuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBvbmx5IHdoZW4gYGxldmVsc2AgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1hcFJlYXNvbmluZyhcbiAgcmVxdWVzdGVkOiB1bmtub3duLFxuICBsZXZlbHM6IHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10sXG4pOiBSZWFzb25pbmdMZXZlbCB8IHVuZGVmaW5lZCB7XG4gIGlmIChsZXZlbHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAocmVxdWVzdGVkID09IG51bGwgfHwgaXNEaXNhYmxlZFJlYXNvbmluZ1Rva2VuKHJlcXVlc3RlZCkpIHtcbiAgICByZXR1cm4gbmVhcmVzdFJlYXNvbmluZyhSZWFzb25pbmdMZXZlbC5NZWRpdW0sIGxldmVscyk7XG4gIH1cbiAgY29uc3QgcGFyc2VkID0gcGFyc2VSZWFzb25pbmcocmVxdWVzdGVkKTtcbiAgaWYgKCFwYXJzZWQpIHJldHVybiBuZWFyZXN0UmVhc29uaW5nKFJlYXNvbmluZ0xldmVsLk1lZGl1bSwgbGV2ZWxzKTtcbiAgaWYgKGxldmVscy5pbmNsdWRlcyhwYXJzZWQpKSByZXR1cm4gcGFyc2VkO1xuICBjb25zdCByZXF1ZXN0ZWRJbmRleCA9IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihwYXJzZWQpO1xuICBsZXQgYmVzdDogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQ7XG4gIGxldCBiZXN0SW5kZXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgY29uc3QgaW5kZXggPSBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YobGV2ZWwpO1xuICAgIGlmIChpbmRleCA8PSByZXF1ZXN0ZWRJbmRleCAmJiBpbmRleCA+IGJlc3RJbmRleCkge1xuICAgICAgYmVzdCA9IGxldmVsO1xuICAgICAgYmVzdEluZGV4ID0gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0ID8/IGxldmVsc1swXTtcbn1cblxuZnVuY3Rpb24gaXNEaXNhYmxlZFJlYXNvbmluZ1Rva2VuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIERJU0FCTEVEX1JFQVNPTklOR19UT0tFTlMuaGFzKG5vcm1hbGl6ZVJlYXNvbmluZ1Rva2VuKFN0cmluZyh2YWx1ZSkpKTtcbn1cblxuLyoqIENsb3Nlc3Qgc3VwcG9ydGVkIGxldmVsIHRvIGB0YXJnZXRgOyB0aWVzIHByZWZlciB0aGUgaGlnaGVyIGJ1ZGdldC4gKi9cbmZ1bmN0aW9uIG5lYXJlc3RSZWFzb25pbmcoXG4gIHRhcmdldDogUmVhc29uaW5nTGV2ZWwsXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChsZXZlbHMuaW5jbHVkZXModGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgY29uc3QgdGFyZ2V0SW5kZXggPSBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YodGFyZ2V0KTtcbiAgbGV0IGJlc3Q6IFJlYXNvbmluZ0xldmVsIHwgdW5kZWZpbmVkO1xuICBsZXQgYmVzdERpc3RhbmNlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICBmb3IgKGNvbnN0IGxldmVsIG9mIGxldmVscykge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKGxldmVsKSAtIHRhcmdldEluZGV4KTtcbiAgICBpZiAoXG4gICAgICBkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSB8fFxuICAgICAgKGRpc3RhbmNlID09PSBiZXN0RGlzdGFuY2UgJiZcbiAgICAgICAgUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKGxldmVsKSA+IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihiZXN0ID8/IGxldmVsKSlcbiAgICApIHtcbiAgICAgIGJlc3QgPSBsZXZlbDtcbiAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmVzdDtcbn1cblxuLyoqIFJlc3VsdCBvZiBhZGFwdGluZyByZWFzb25pbmcgZmllbGRzIG9uIGEgZ2F0ZXdheSByZXF1ZXN0IGJvZHkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIHtcbiAgLyoqIEJvZHkgd2l0aCByZW1hcHBlZCB3aXJlIHRva2VucyAoc2FtZSByZWZlcmVuY2Ugd2hlbiB1bmNoYW5nZWQpLiAqL1xuICByZWFkb25seSBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKiBUcnVlIHdoZW4gYW55IHJlYXNvbmluZyBmaWVsZCB3YXMgcmV3cml0dGVuLiAqL1xuICByZWFkb25seSBjaGFuZ2VkOiBib29sZWFuO1xuICAvKiogV2lyZSB0b2tlbiB3cml0dGVuIHdoZW4gYSByZWFzb25pbmcgZmllbGQgd2FzIHByZXNlbnQgYW5kIHJlbWFwcGVkLiAqL1xuICByZWFkb25seSB3aXJlRWZmb3J0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJld3JpdGUgYHJlYXNvbmluZ19lZmZvcnRgIC8gYHJlYXNvbmluZy5lZmZvcnRgIG9udG8gYSBzdXBwb3J0ZWQgbGFkZGVyLlxuICpcbiAqIE1vZGVsLWFnbm9zdGljOiBjYWxsZXJzIHN1cHBseSB0aGUgYWxsb3dlZCBsZXZlbHMgKGxlYXJuZWQsIGRvY3VtZW50ZWQsIG9yXG4gKiBkZWZhdWx0cykuIEV4cGxpY2l0IG51bGwgb3IgdW5yZWNvZ25pemVkIHZhbHVlcyB1c2UgdGhlIG1lZGl1bS1jZW50ZXJlZFxuICogZmFsbGJhY2suIEJvZGllcyB3aXRob3V0IHJlYXNvbmluZyBmaWVsZHMgYXJlIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0UmVxdWVzdFJlYXNvbmluZyhcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICBsZXZlbHM6IHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10sXG4pOiBBZGFwdGVkUmVxdWVzdFJlYXNvbmluZyB7XG4gIGlmIChsZXZlbHMubGVuZ3RoID09PSAwKSByZXR1cm4geyBib2R5LCBjaGFuZ2VkOiBmYWxzZSB9O1xuXG4gIGNvbnN0IGhhc1RvcExldmVsID0gT2JqZWN0Lmhhc093bihib2R5LCBcInJlYXNvbmluZ19lZmZvcnRcIik7XG4gIGNvbnN0IHRvcExldmVsID0gYm9keS5yZWFzb25pbmdfZWZmb3J0O1xuICBjb25zdCByZWFzb25pbmcgPSBpc1JlY29yZChib2R5LnJlYXNvbmluZykgPyBib2R5LnJlYXNvbmluZyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgaGFzTmVzdGVkID0gcmVhc29uaW5nID8gT2JqZWN0Lmhhc093bihyZWFzb25pbmcsIFwiZWZmb3J0XCIpIDogZmFsc2U7XG4gIGNvbnN0IG5lc3RlZCA9IHJlYXNvbmluZz8uZWZmb3J0O1xuICBpZiAoIWhhc1RvcExldmVsICYmICFoYXNOZXN0ZWQpIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG4gIGNvbnN0IHJlcXVlc3RlZCA9IGhhc1RvcExldmVsID8gdG9wTGV2ZWwgOiBuZXN0ZWQ7XG5cbiAgY29uc3QgcmVtYXBwZWQgPSByZW1hcFJlYXNvbmluZyhyZXF1ZXN0ZWQsIGxldmVscyk7XG4gIGlmICghcmVtYXBwZWQpIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG4gIGNvbnN0IHdpcmUgPSBmb3JtYXRSZWFzb25pbmcocmVtYXBwZWQpO1xuXG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGxldCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uYm9keSB9O1xuXG4gIGlmIChoYXNUb3BMZXZlbCkge1xuICAgIGlmIChTdHJpbmcodG9wTGV2ZWwpICE9PSB3aXJlKSB7XG4gICAgICBuZXh0ID0geyAuLi5uZXh0LCByZWFzb25pbmdfZWZmb3J0OiB3aXJlIH07XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHJlYXNvbmluZyAmJiBoYXNOZXN0ZWQpIHtcbiAgICBpZiAoU3RyaW5nKG5lc3RlZCkgIT09IHdpcmUpIHtcbiAgICAgIG5leHQgPSB7IC4uLm5leHQsIHJlYXNvbmluZzogeyAuLi5yZWFzb25pbmcsIGVmZm9ydDogd2lyZSB9IH07XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZFxuICAgID8geyBib2R5OiBuZXh0LCBjaGFuZ2VkOiB0cnVlLCB3aXJlRWZmb3J0OiB3aXJlIH1cbiAgICA6IHsgYm9keSwgY2hhbmdlZDogZmFsc2UsIHdpcmVFZmZvcnQ6IHdpcmUgfTtcbn1cblxuLyoqIE5vcm1hbGl6ZSBsYWJlbHMgZm9yIGFsaWFzIGxvb2t1cCAoYEV4dHJhIEhpZ2hgIOKGkiBgZXh0cmEtaGlnaGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlYXNvbmluZ1Rva2VuKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHRyaW1Ub051bGwodmFsdWUpXG4gICAgICA/LnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9bX1xcc10rL2csIFwiLVwiKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05LV0vZywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC8tKy9nLCBcIi1cIilcbiAgICAgIC5yZXBsYWNlKC9eLXwtJC9nLCBcIlwiKSA/PyBcIlwiXG4gICk7XG59XG5cbi8qKiBEZWR1cGxpY2F0ZSBsZXZlbHMgd2hpbGUgcHJlc2VydmluZyBmaXJzdC1zZWVuIG9yZGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHM6IHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10pOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8UmVhc29uaW5nTGV2ZWw+KCk7XG4gIGNvbnN0IG9yZGVyZWQ6IFJlYXNvbmluZ0xldmVsW10gPSBbXTtcbiAgZm9yIChjb25zdCBsZXZlbCBvZiBsZXZlbHMpIHtcbiAgICBpZiAoc2Vlbi5oYXMobGV2ZWwpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChsZXZlbCk7XG4gICAgb3JkZXJlZC5wdXNoKGxldmVsKTtcbiAgfVxuICByZXR1cm4gb3JkZXJlZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN1cHBvcnRlZFRva2Vucyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1hdGNoID0gU1VQUE9SVEVEX1ZBTFVFU19QQVRURVJOLmV4ZWModGV4dCk7XG4gIGlmICghbWF0Y2g/LlsxXSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdG9rZW5zRnJvbUZyYWdtZW50KG1hdGNoWzFdKTtcbn1cblxuZnVuY3Rpb24gY2F0YWxvZ3VlS2V5c0Zvcihtb2RlbDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRpcmVjdCA9IG1vZGVsQ2F0YWxvZ3VlS2V5KG1vZGVsKTtcbiAgaWYgKGRpcmVjdCkga2V5cy5hZGQoZGlyZWN0KTtcbiAgY29uc3Qgc3RyaXBwZWQgPSBtb2RlbFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL15kYXRhYnJpY2tzXFwvLywgXCJcIilcbiAgICAucmVwbGFjZSgvXnN5c3RlbVxcLmFpXFwuLywgXCJcIilcbiAgICAucmVwbGFjZSgvXmRhdGFicmlja3MtLywgXCJcIik7XG4gIGNvbnN0IHN0cmlwcGVkS2V5ID0gbW9kZWxDYXRhbG9ndWVLZXkoc3RyaXBwZWQpO1xuICBpZiAoc3RyaXBwZWRLZXkpIGtleXMuYWRkKHN0cmlwcGVkS2V5KTtcbiAgY29uc3Qgd2l0aFByZWZpeCA9IG1vZGVsQ2F0YWxvZ3VlS2V5KGBkYXRhYnJpY2tzLSR7c3RyaXBwZWR9YCk7XG4gIGlmICh3aXRoUHJlZml4KSBrZXlzLmFkZCh3aXRoUHJlZml4KTtcbiAgcmV0dXJuIFsuLi5rZXlzXTtcbn1cblxuZnVuY3Rpb24gbW9kZWxDYXRhbG9ndWVLZXkobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHJpbW1lZCA9IHRyaW1Ub051bGwobmFtZSk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIChcbiAgICBtb2RlbFNlYXJjaFF1ZXJ5KHRyaW1tZWQpPy5yZXBsYWNlQWxsKFwiIFwiLCBcIi1cIikgPz9cbiAgICB0cmltbWVkXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL15kYXRhYnJpY2tzLS8sIFwiXCIpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTkuXy1dKy9nLCBcIi1cIilcbiAgKTtcbn1cblxuZnVuY3Rpb24gdG9rZW5zRnJvbUZyYWdtZW50KGZyYWdtZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIGZyYWdtZW50Lm1hdGNoQWxsKFRPS0VOX1BBVFRFUk4pKSB7XG4gICAgY29uc3QgdG9rZW4gPSBwYXJ0WzFdID8/IHBhcnRbMl0gPz8gcGFydFszXSA/PyBwYXJ0WzRdO1xuICAgIGlmICghdG9rZW4gfHwgdG9rZW4gPT09IFwiYW5kXCIgfHwgdG9rZW4gPT09IFwib3JcIiB8fCB0b2tlbiA9PT0gXCJvZlwiKSBjb250aW51ZTtcbiAgICB0b2tlbnMucHVzaCh0b2tlbi5yZXBsYWNlKC9eW1wiJ2BdK3xbXCInYF0rJC9nLCBcIlwiKSk7XG4gIH1cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuLyoqXG4gKiBXYWxrIGEgdmFsdWUgdHJlZSwgdW53cmFwcGluZyBuZXN0ZWQgSlNPTiBzdHJpbmdzLCBhbmQgY29sbGVjdCB0ZXh0IGxlYXZlc1xuICogdGhhdCBtYXkgY29udGFpbiBhIHN1cHBvcnRlZC12YWx1ZXMgc2VudGVuY2UuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RUZXh0TGVhdmVzKHZhbHVlOiB1bmtub3duLCBkZXB0aCA9IDApOiBzdHJpbmdbXSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IGRlcHRoID4gTUFYX0pTT05fVU5XUkFQX0RFUFRIKSByZXR1cm4gW107XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRyeVVud3JhcEpzb24odHJpbW1lZCk7XG4gICAgaWYgKHBhcnNlZCAhPT0gdW5kZWZpbmVkICYmIHBhcnNlZCAhPT0gdHJpbW1lZCkge1xuICAgICAgcmV0dXJuIGNvbGxlY3RUZXh0TGVhdmVzKHBhcnNlZCwgZGVwdGggKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIFt0cmltbWVkXTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBbU3RyaW5nKHZhbHVlKV07XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5mbGF0TWFwKChlbnRyeSkgPT4gY29sbGVjdFRleHRMZWF2ZXMoZW50cnksIGRlcHRoICsgMSkpO1xuICB9XG4gIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiBPYmplY3QudmFsdWVzKHZhbHVlKS5mbGF0TWFwKChlbnRyeSkgPT4gY29sbGVjdFRleHRMZWF2ZXMoZW50cnksIGRlcHRoICsgMSkpO1xufVxuXG5mdW5jdGlvbiB0cnlVbndyYXBKc29uKHRleHQ6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBhc1JlY29yZCA9IHBhcnNlUmVjb3JkKHRleHQpO1xuICBpZiAoYXNSZWNvcmQpIHJldHVybiBhc1JlY29yZDtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2UodGV4dCk7XG4gIGlmIChwYXJzZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHBhcnNlZDtcbiAgaWYgKHRleHQuaW5jbHVkZXMoJ1xcXFxcIicpIHx8IHRleHQuaW5jbHVkZXMoXCJcXFxcblwiKSkge1xuICAgIGNvbnN0IHVuZXNjYXBlZCA9IHRleHQucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoL1xcXFxuL2csIFwiXFxuXCIpLnJlcGxhY2UoL1xcXFxcXFxcL2csIFwiXFxcXFwiKTtcbiAgICBpZiAodW5lc2NhcGVkICE9PSB0ZXh0KSB7XG4gICAgICBjb25zdCBuZXN0ZWQgPSBwYXJzZSh1bmVzY2FwZWQpO1xuICAgICAgaWYgKG5lc3RlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbmVzdGVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
package/package.json CHANGED
@@ -25,14 +25,15 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@databricks/appkit": "0.81.0",
28
- "@dbx-tools/appkit": "^0.9.167",
29
- "@dbx-tools/auth": "^0.9.167",
30
- "@dbx-tools/cache": "^0.9.167",
31
- "@dbx-tools/shared-auth": "^0.9.167",
32
- "@dbx-tools/shared-core": "^0.9.167",
33
- "@dbx-tools/shared-model": "^0.9.167",
28
+ "@dbx-tools/appkit": "^0.9.173",
29
+ "@dbx-tools/auth": "^0.9.173",
30
+ "@dbx-tools/cache": "^0.9.173",
31
+ "@dbx-tools/shared-auth": "^0.9.173",
32
+ "@dbx-tools/shared-core": "^0.9.173",
33
+ "@dbx-tools/shared-model": "^0.9.173",
34
34
  "cheerio": "^1.2.0",
35
- "fuse.js": "^7.4.2"
35
+ "fuse.js": "^7.4.2",
36
+ "zod": "4.3.6"
36
37
  },
37
38
  "main": "./lib/index.js",
38
39
  "license": "Apache-2.0",
@@ -48,7 +49,7 @@
48
49
  "./package.json": "./package.json"
49
50
  }
50
51
  },
51
- "version": "0.9.167",
52
+ "version": "0.9.173",
52
53
  "types": "./lib/index.d.ts",
53
54
  "dbxToolsConfig": {
54
55
  "tags": [
@@ -1,9 +1,12 @@
1
1
  import { load, type CheerioAPI } from "cheerio";
2
+ import { z } from "zod";
2
3
 
3
4
  import type {
5
+ ModelParamsSnapshot,
4
6
  ModelCapabilitiesSnapshot,
5
7
  ModelRateLimitCatalogue,
6
8
  ModelRateLimitsSnapshot,
9
+ ModelsDevSnapshot,
7
10
  ReasoningModelsSnapshot,
8
11
  RetiredModelsSnapshot,
9
12
  } from "./metadata-contract.ts";
@@ -39,6 +42,83 @@ const DOCUMENTATION_EFFORT_TOKENS = new Set([
39
42
  "maximum",
40
43
  "disabled",
41
44
  ]);
45
+ const EFFORT_PARAMETER_PATHS = new Set([
46
+ "generationConfig.thinkingConfig.thinkingLevel",
47
+ "output_config.effort",
48
+ "reasoning.effort",
49
+ "reasoning_effort",
50
+ ]);
51
+ const EXTERNAL_ALIAS_SUFFIX_PATTERN = /-(?:customtools|latest|preview|subscription)$/i;
52
+ const EXTERNAL_DATE_TOKEN_PATTERN = /-(?:19|20)\d{6}(?=-|$)/g;
53
+
54
+ const ModelsDevModelSchema = z
55
+ .object({
56
+ id: z.string().describe("Provider-specific model identifier."),
57
+ canonical_model_id: z
58
+ .string()
59
+ .optional()
60
+ .describe("Provider-independent canonical model identifier."),
61
+ reasoning: z.boolean().optional().describe("Whether the model supports reasoning."),
62
+ tool_call: z.boolean().optional().describe("Whether the model supports tool calls."),
63
+ structured_output: z
64
+ .boolean()
65
+ .optional()
66
+ .describe("Whether the model supports structured output."),
67
+ temperature: z.boolean().optional().describe("Whether the model accepts temperature."),
68
+ modalities: z
69
+ .object({
70
+ input: z.array(z.string()).describe("Accepted input modalities."),
71
+ })
72
+ .passthrough()
73
+ .optional()
74
+ .describe("Model input and output modalities."),
75
+ })
76
+ .passthrough()
77
+ .describe("One provider model from models.dev.");
78
+
79
+ const ModelsDevApiSchema = z
80
+ .record(
81
+ z.string(),
82
+ z
83
+ .object({
84
+ models: z
85
+ .record(z.string(), ModelsDevModelSchema)
86
+ .describe("Models available through this provider."),
87
+ })
88
+ .passthrough()
89
+ .describe("One models.dev provider catalogue."),
90
+ )
91
+ .describe("models.dev provider catalogue response.");
92
+
93
+ const ModelParamsParameterSchema = z
94
+ .object({
95
+ path: z.string().describe("Request-body path for the parameter."),
96
+ group: z.string().optional().describe("Functional parameter group."),
97
+ type: z.string().describe("Parameter value type."),
98
+ values: z
99
+ .array(z.string().nullable())
100
+ .optional()
101
+ .describe("Allowed enum values, including null when omission is supported."),
102
+ })
103
+ .passthrough()
104
+ .describe("One modelparams.dev request parameter.");
105
+
106
+ const ModelParamsModelSchema = z
107
+ .object({
108
+ provider: z.string().describe("Provider identifier."),
109
+ apiSurface: z.string().describe("Provider API surface."),
110
+ model: z.string().describe("Provider model identifier."),
111
+ params: z.array(ModelParamsParameterSchema).describe("Accepted request parameters."),
112
+ })
113
+ .passthrough()
114
+ .describe("One model and API surface from modelparams.dev.");
115
+
116
+ const ModelParamsApiSchema = z
117
+ .object({
118
+ models: z.array(ModelParamsModelSchema).describe("Normalized model parameter records."),
119
+ })
120
+ .passthrough()
121
+ .describe("modelparams.dev model catalogue response.");
42
122
 
43
123
  /** Parse retired model names from Databricks retirement-policy HTML. */
44
124
  export function parseRetiredModels(html: string, generatedAt: number): RetiredModelsSnapshot {
@@ -96,6 +176,91 @@ export function parseModelCapabilities(
96
176
  };
97
177
  }
98
178
 
179
+ /** Normalize portable model capabilities and effort ladders from models.dev JSON. */
180
+ export function parseModelsDev(
181
+ input: unknown,
182
+ generatedAt: number,
183
+ ): ModelsDevSnapshot {
184
+ const providers = ModelsDevApiSchema.parse(input);
185
+ const imageInput = new Set<string>();
186
+ const reasoning = new Set<string>();
187
+ const tools = new Set<string>();
188
+ const structuredOutput = new Set<string>();
189
+ const temperatureSupported = new Set<string>();
190
+ const temperatureUnsupported = new Set<string>();
191
+
192
+ for (const [providerId, provider] of Object.entries(providers)) {
193
+ for (const [catalogueId, model] of Object.entries(provider.models)) {
194
+ const keys = externalModelKeys(catalogueId, model.id, model.canonical_model_id);
195
+ if (keys.length === 0) continue;
196
+ for (const key of keys) {
197
+ if (model.modalities?.input.includes("image")) imageInput.add(key);
198
+ if (model.reasoning === true) reasoning.add(key);
199
+ if (model.tool_call === true) tools.add(key);
200
+ if (model.structured_output === true) structuredOutput.add(key);
201
+ if (providerId === "databricks") {
202
+ if (model.temperature === true) temperatureSupported.add(key);
203
+ if (model.temperature === false) temperatureUnsupported.add(key);
204
+ }
205
+ }
206
+ }
207
+ }
208
+ if (reasoning.size === 0 && imageInput.size === 0 && tools.size === 0) {
209
+ throw new Error("models.dev contained no recognized model capabilities");
210
+ }
211
+ return {
212
+ generatedAt,
213
+ capabilities: {
214
+ imageInput: [...imageInput].sort(),
215
+ reasoning: [...reasoning].sort(),
216
+ tools: [...tools].sort(),
217
+ structuredOutput: [...structuredOutput].sort(),
218
+ temperatureSupported: [...temperatureSupported].sort(),
219
+ temperatureUnsupported: [...temperatureUnsupported].sort(),
220
+ },
221
+ };
222
+ }
223
+
224
+ /** Normalize reasoning support and effort ladders from modelparams.dev JSON. */
225
+ export function parseModelParams(
226
+ input: unknown,
227
+ generatedAt: number,
228
+ ): ModelParamsSnapshot {
229
+ const response = ModelParamsApiSchema.parse(input);
230
+ const reasoning = new Set<string>();
231
+ const models: Record<string, ReasoningLevel[]> = {};
232
+
233
+ for (const model of response.models) {
234
+ const reasoningParameters = model.params.filter((parameter) => parameter.group === "reasoning");
235
+ if (reasoningParameters.length === 0) continue;
236
+ const keys = externalModelKeys(model.model);
237
+ const levels = sortReasoningLevels(
238
+ reasoningParameters
239
+ .filter(
240
+ (parameter) =>
241
+ parameter.type === "enum" && EFFORT_PARAMETER_PATHS.has(parameter.path),
242
+ )
243
+ .flatMap((parameter) => parameter.values ?? [])
244
+ .flatMap((value) => parseReasoning(value) ?? []),
245
+ );
246
+ if (levels.length === 0) continue;
247
+ for (const key of keys) {
248
+ reasoning.add(key);
249
+ models[key] = sortReasoningLevels([...(models[key] ?? []), ...levels]);
250
+ }
251
+ }
252
+ if (reasoning.size === 0) {
253
+ throw new Error("modelparams.dev contained no recognized reasoning models");
254
+ }
255
+ return {
256
+ generatedAt,
257
+ catalogue: {
258
+ reasoning: [...reasoning].sort(),
259
+ models: sortRecord(models),
260
+ },
261
+ };
262
+ }
263
+
99
264
  /** Parse pay-per-token limits from Databricks Foundation Model API HTML. */
100
265
  export function parseModelRateLimits(html: string, generatedAt: number): ModelRateLimitsSnapshot {
101
266
  const $ = load(html);
@@ -346,6 +511,22 @@ function modelKey(value: string | undefined): string | undefined {
346
511
  return modelSearchQuery(name)?.replaceAll(" ", "-");
347
512
  }
348
513
 
514
+ function externalModelKeys(...values: readonly (string | undefined)[]): string[] {
515
+ const aliases = new Set<string>();
516
+ for (const value of values) {
517
+ if (!value) continue;
518
+ const queue = [value, value.replace(EXTERNAL_DATE_TOKEN_PATTERN, "")];
519
+ while (queue.length > 0) {
520
+ const candidate = queue.shift()!;
521
+ if (aliases.has(candidate)) continue;
522
+ aliases.add(candidate);
523
+ const trimmed = candidate.replace(EXTERNAL_ALIAS_SUFFIX_PATTERN, "");
524
+ if (trimmed !== candidate) queue.push(trimmed);
525
+ }
526
+ }
527
+ return [...new Set([...aliases].flatMap((alias) => modelKey(alias) ?? []))].sort();
528
+ }
529
+
349
530
  function number(value: string | undefined): number | null {
350
531
  if (!value) return null;
351
532
  const parsed = Number(value.replaceAll(",", "").trim());
package/src/_ranking.ts CHANGED
@@ -4,6 +4,7 @@ import {
4
4
  type ModelClass as ModelClassType,
5
5
  type ModelQuery,
6
6
  type RankedModel,
7
+ type ReasoningEffort,
7
8
  type ServingEndpointSummary,
8
9
  } from "@dbx-tools/shared-model";
9
10
  import { toModelDisplayName } from "@dbx-tools/shared-model";
@@ -16,6 +17,7 @@ import {
16
17
  supportsToolsByFamily,
17
18
  versionTuple,
18
19
  } from "./classify.ts";
20
+ import { modelCapabilitiesFor, modelReasoningLevelsFor } from "./metadata.ts";
19
21
  import {
20
22
  isOpenWeightsGpt,
21
23
  modelFamily,
@@ -225,9 +227,13 @@ export function normalizeEndpoints(endpoints: readonly unknown[]): ServingEndpoi
225
227
  const family =
226
228
  foundationModels.map((model) => trimToUndefined(model.model_class)).find(Boolean) ??
227
229
  identities.map(modelFamily).find(Boolean);
230
+ const publishedReasoning = identities
231
+ .filter((identity) => modelCapabilitiesFor(identity).reasoning)
232
+ .map((identity) => modelReasoningLevelsFor(identity).map(reasoningEffort));
228
233
  const reasoningEfforts =
229
- identities.map(modelReasoningEfforts).sort((left, right) => right.length - left.length)[0] ??
230
- [];
234
+ [...publishedReasoning, ...identities.map(modelReasoningEfforts)].sort(
235
+ (left, right) => right.length - left.length,
236
+ )[0] ?? [];
231
237
  const profile = entities.map(modelProfile).find(Boolean);
232
238
  const capabilitiesRecord = record(endpoint.capabilities);
233
239
  const foundationDescription = foundationModels
@@ -260,6 +266,10 @@ export function normalizeEndpoints(endpoints: readonly unknown[]): ServingEndpoi
260
266
  });
261
267
  }
262
268
 
269
+ function reasoningEffort(level: ReturnType<typeof modelReasoningLevelsFor>[number]): ReasoningEffort {
270
+ return level === "extra-high" ? "xhigh" : level;
271
+ }
272
+
263
273
  function compareRanked(left: RankedModel, right: RankedModel, preferSystemModels: boolean): number {
264
274
  const score = Math.round((left.score ?? 0) * 1000) - Math.round((right.score ?? 0) * 1000);
265
275
  if (score !== 0) return score;
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": 1791150180,
2
+ "generatedAt": 1793283170,
3
3
  "capabilities": {
4
4
  "responses": [
5
5
  "gpt-5",
@@ -17,6 +17,7 @@
17
17
  "gpt-5-mini",
18
18
  "gpt-5-nano",
19
19
  "gpt-6-1-sol",
20
+ "gpt-6-1-terra",
20
21
  "gpt-6-astra",
21
22
  "gpt-6-luna",
22
23
  "gpt-6-sol"
@@ -37,6 +38,7 @@
37
38
  "gpt-5-mini",
38
39
  "gpt-5-nano",
39
40
  "gpt-6-1-sol",
41
+ "gpt-6-1-terra",
40
42
  "gpt-6-astra",
41
43
  "gpt-6-luna",
42
44
  "gpt-6-sol"
@@ -57,13 +59,12 @@
57
59
  "gpt-5-mini",
58
60
  "gpt-5-nano",
59
61
  "gpt-6-1-sol",
62
+ "gpt-6-1-terra",
60
63
  "gpt-6-astra",
61
64
  "gpt-6-luna",
62
65
  "gpt-6-sol"
63
66
  ],
64
67
  "webSearch": [
65
- "gemini-2-5-flash",
66
- "gemini-2-5-pro",
67
68
  "gemini-3-1-flash-lite",
68
69
  "gemini-3-1-pro",
69
70
  "gemini-3-flash",
@@ -82,6 +83,7 @@
82
83
  "gpt-5-mini",
83
84
  "gpt-5-nano",
84
85
  "gpt-6-1-sol",
86
+ "gpt-6-1-terra",
85
87
  "gpt-6-astra",
86
88
  "gpt-6-luna",
87
89
  "gpt-6-sol"