@dbx-tools/model 0.9.166 → 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.
- package/README.md +4 -1
- package/index.ts +4 -4
- package/lib/index.d.ts +4 -4
- package/lib/index.js +4 -4
- package/lib/scripts/generate-metadata.js +15 -3
- package/lib/src/_metadata-generator.d.ts +5 -1
- package/lib/src/_metadata-generator.js +168 -1
- package/lib/src/_ranking.js +9 -3
- package/lib/src/generated/model-capabilities.json +5 -3
- package/lib/src/generated/model-rate-limits.json +76 -71
- package/lib/src/generated/model-reasoning.json +24 -1
- package/lib/src/generated/modelparams-reasoning.json +477 -0
- package/lib/src/generated/models-dev-capabilities.json +3622 -0
- package/lib/src/generated/retired-models.json +3 -1
- package/lib/src/metadata-contract.d.ts +27 -0
- package/lib/src/metadata-contract.js +5 -1
- package/lib/src/metadata.d.ts +17 -9
- package/lib/src/metadata.js +147 -27
- package/lib/src/reasoning-translation.d.ts +8 -6
- package/lib/src/reasoning-translation.js +17 -13
- package/package.json +9 -8
- package/src/_metadata-generator.ts +181 -0
- package/src/_ranking.ts +12 -2
- package/src/generated/model-capabilities.json +5 -3
- package/src/generated/model-rate-limits.json +76 -71
- package/src/generated/model-reasoning.json +24 -1
- package/src/generated/modelparams-reasoning.json +477 -0
- package/src/generated/models-dev-capabilities.json +3622 -0
- package/src/generated/retired-models.json +3 -1
- package/src/metadata-contract.ts +33 -0
- package/src/metadata.ts +204 -33
- package/src/reasoning-translation.ts +16 -12
|
@@ -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)
|
|
79
|
-
*
|
|
80
|
-
* {@link ReasoningLevel.Medium}. Other
|
|
81
|
-
* level at or below the request, otherwise
|
|
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
|
|
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).
|
|
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)
|
|
246
|
-
*
|
|
247
|
-
* {@link ReasoningLevel.Medium}. Other
|
|
248
|
-
* level at or below the request, otherwise
|
|
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
|
|
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
|
|
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).
|
|
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
|
-
|
|
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 (
|
|
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 &&
|
|
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.
|
|
29
|
-
"@dbx-tools/auth": "^0.9.
|
|
30
|
-
"@dbx-tools/cache": "^0.9.
|
|
31
|
-
"@dbx-tools/shared-auth": "^0.9.
|
|
32
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
33
|
-
"@dbx-tools/shared-model": "^0.9.
|
|
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.
|
|
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(
|
|
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":
|
|
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"
|