@dbx-tools/shared-model 0.6.186 → 0.6.191

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 CHANGED
@@ -35,7 +35,7 @@ display.toModelDisplayName("x", "Claude 4.6 (Preview)"); // provided name wins
35
35
 
36
36
  `ServingEndpointSummary.displayName` is the optional friendly label for the
37
37
  picker; `name` stays the invoke id. A Databricks-provided name (a
38
- `display_name`/`displayName`/`name` endpoint tag, or an external-model name —
38
+ `display_name`/`displayName`/`name` endpoint tag, or an external-model name
39
39
  extracted in [`@dbx-tools/model`](../../node/model)'s `serving.ts`) wins;
40
40
  otherwise the pure helper strips leading vendor prefixes and title-cases via
41
41
  `@dbx-tools/shared-core`'s tokenizer. It flows through `GET /models`
@@ -68,7 +68,8 @@ const ranked: RankedModel = model.RankedModelSchema.parse(response);
68
68
 
69
69
  `model.ServingEndpointSummarySchema` describes the stable endpoint fields exposed
70
70
  to clients: endpoint name, task, state, optional profile scores, classified
71
- class, `supportsTools`, and embedding dimension. `requiresTools: true` filters
71
+ class, `supportsTools`, provider service names, reasoning efforts, lifecycle
72
+ status, and embedding dimension. `requiresTools: true` filters
72
73
  search/ranking to endpoints that can complete both a function call and the
73
74
  subsequent `function_call_output` replay.
74
75
 
@@ -176,8 +177,8 @@ one-by-one (`openaiResponses.responsesToChat`) already can't leak them. Pass
176
177
 
177
178
  ## Modules
178
179
 
179
- - `model` - `ModelClass`, zod schemas, and inferred types for profiles,
180
- endpoint summaries, lookup requests, and ranked results.
180
+ - `model` - `ModelClass`, `ReasoningEffort`, zod schemas, and inferred types
181
+ for profiles, endpoint summaries, lookup requests, and ranked results.
181
182
  - `classify` - family parsing, version tuple parsing, endpoint classification,
182
183
  and capability flags.
183
184
  - `display` - human-readable endpoint labels.
package/index.ts CHANGED
@@ -3,15 +3,15 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model";
6
- export const PACKAGE_VERSION = "0.6.186";
6
+ export const PACKAGE_VERSION = "0.6.191";
7
7
  export * as classify from "./src/classify.ts";
8
8
  export * as display from "./src/display.ts";
9
9
  export * as model from "./src/model.ts";
10
10
  export * as openaiChat from "./src/openai-chat.ts";
11
11
  export * as openaiResponses from "./src/openai-responses.ts";
12
12
  export type { EndpointCapabilities, FamilyClass } from "./src/classify.ts";
13
- export { ModelClass, ModelClassSchema, ModelProfileSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
14
- export type { ModelProfile, ServingEndpointSummary, ModelQuery, RankedModel } from "./src/model.ts";
13
+ export { ModelClass, ModelClassSchema, ModelProfileSchema, ReasoningEffort, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
14
+ export type { ModelProfile, ModelStatus, ServingEndpointSummary, ModelQuery, RankedModel } from "./src/model.ts";
15
15
  export { UNSUPPORTED_CHAT_FIELDS } from "./src/openai-chat.ts";
16
16
  export type { ChatRole, ChatContentPart, ChatToolCallFunction, ChatToolCall, ChatMessage, ChatContentToTextOptions } from "./src/openai-chat.ts";
17
17
  export { REASONING_TYPES } from "./src/openai-responses.ts";
package/lib/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model";
2
- export declare const PACKAGE_VERSION = "0.6.186";
2
+ export declare const PACKAGE_VERSION = "0.6.191";
3
3
  export * as classify from "./src/classify.ts";
4
4
  export * as display from "./src/display.ts";
5
5
  export * as model from "./src/model.ts";
6
6
  export * as openaiChat from "./src/openai-chat.ts";
7
7
  export * as openaiResponses from "./src/openai-responses.ts";
8
8
  export type { EndpointCapabilities, FamilyClass } from "./src/classify.ts";
9
- export { ModelClass, ModelClassSchema, ModelProfileSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
10
- export type { ModelProfile, ServingEndpointSummary, ModelQuery, RankedModel } from "./src/model.ts";
9
+ export { ModelClass, ModelClassSchema, ModelProfileSchema, ReasoningEffort, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
10
+ export type { ModelProfile, ModelStatus, ServingEndpointSummary, ModelQuery, RankedModel } from "./src/model.ts";
11
11
  export { UNSUPPORTED_CHAT_FIELDS } from "./src/openai-chat.ts";
12
12
  export type { ChatRole, ChatContentPart, ChatToolCallFunction, ChatToolCall, ChatMessage, ChatContentToTextOptions } from "./src/openai-chat.ts";
13
13
  export { REASONING_TYPES } from "./src/openai-responses.ts";
package/lib/index.js CHANGED
@@ -2,13 +2,13 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model";
5
- export const PACKAGE_VERSION = "0.6.186";
5
+ export const PACKAGE_VERSION = "0.6.191";
6
6
  export * as classify from "./src/classify.js";
7
7
  export * as display from "./src/display.js";
8
8
  export * as model from "./src/model.js";
9
9
  export * as openaiChat from "./src/openai-chat.js";
10
10
  export * as openaiResponses from "./src/openai-responses.js";
11
- export { ModelClass, ModelClassSchema, ModelProfileSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.js";
11
+ export { ModelClass, ModelClassSchema, ModelProfileSchema, ReasoningEffort, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.js";
12
12
  export { UNSUPPORTED_CHAT_FIELDS } from "./src/openai-chat.js";
13
13
  export { REASONING_TYPES } from "./src/openai-responses.js";
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLDRCQUE0QixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckosT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuNi4xODZcIjtcbmV4cG9ydCAqIGFzIGNsYXNzaWZ5IGZyb20gXCIuL3NyYy9jbGFzc2lmeS50c1wiO1xuZXhwb3J0ICogYXMgZGlzcGxheSBmcm9tIFwiLi9zcmMvZGlzcGxheS50c1wiO1xuZXhwb3J0ICogYXMgbW9kZWwgZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgKiBhcyBvcGVuYWlDaGF0IGZyb20gXCIuL3NyYy9vcGVuYWktY2hhdC50c1wiO1xuZXhwb3J0ICogYXMgb3BlbmFpUmVzcG9uc2VzIGZyb20gXCIuL3NyYy9vcGVuYWktcmVzcG9uc2VzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEVuZHBvaW50Q2FwYWJpbGl0aWVzLCBGYW1pbHlDbGFzcyB9IGZyb20gXCIuL3NyYy9jbGFzc2lmeS50c1wiO1xuZXhwb3J0IHsgTW9kZWxDbGFzcywgTW9kZWxDbGFzc1NjaGVtYSwgTW9kZWxQcm9maWxlU2NoZW1hLCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5U2NoZW1hLCBNb2RlbFF1ZXJ5U2NoZW1hLCBSYW5rZWRNb2RlbFNjaGVtYSB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbFByb2ZpbGUsIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksIE1vZGVsUXVlcnksIFJhbmtlZE1vZGVsIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgeyBVTlNVUFBPUlRFRF9DSEFUX0ZJRUxEUyB9IGZyb20gXCIuL3NyYy9vcGVuYWktY2hhdC50c1wiO1xuZXhwb3J0IHR5cGUgeyBDaGF0Um9sZSwgQ2hhdENvbnRlbnRQYXJ0LCBDaGF0VG9vbENhbGxGdW5jdGlvbiwgQ2hhdFRvb2xDYWxsLCBDaGF0TWVzc2FnZSwgQ2hhdENvbnRlbnRUb1RleHRPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29wZW5haS1jaGF0LnRzXCI7XG5leHBvcnQgeyBSRUFTT05JTkdfVFlQRVMgfSBmcm9tIFwiLi9zcmMvb3BlbmFpLXJlc3BvbnNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNwb25zZXNTdHJlYW1UcmFuc2xhdG9yLCBSZXNwb25zZXNDaXRhdGlvbiwgUmVzcG9uc2VzT3V0cHV0IH0gZnJvbSBcIi4vc3JjL29wZW5haS1yZXNwb25zZXMudHNcIjtcbiJdfQ==
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhOLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMTkxXCI7XG5leHBvcnQgKiBhcyBjbGFzc2lmeSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCAqIGFzIGRpc3BsYXkgZnJvbSBcIi4vc3JjL2Rpc3BsYXkudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgb3BlbmFpQ2hhdCBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbmV4cG9ydCAqIGFzIG9wZW5haVJlc3BvbnNlcyBmcm9tIFwiLi9zcmMvb3BlbmFpLXJlc3BvbnNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFbmRwb2ludENhcGFiaWxpdGllcywgRmFtaWx5Q2xhc3MgfSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCB7IE1vZGVsQ2xhc3MsIE1vZGVsQ2xhc3NTY2hlbWEsIE1vZGVsUHJvZmlsZVNjaGVtYSwgUmVhc29uaW5nRWZmb3J0LCBSZWFzb25pbmdFZmZvcnRTY2hlbWEsIE1vZGVsU3RhdHVzU2NoZW1hLCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5U2NoZW1hLCBNb2RlbFF1ZXJ5U2NoZW1hLCBSYW5rZWRNb2RlbFNjaGVtYSB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbFByb2ZpbGUsIE1vZGVsU3RhdHVzLCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LCBNb2RlbFF1ZXJ5LCBSYW5rZWRNb2RlbCB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHsgVU5TVVBQT1JURURfQ0hBVF9GSUVMRFMgfSBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhdFJvbGUsIENoYXRDb250ZW50UGFydCwgQ2hhdFRvb2xDYWxsRnVuY3Rpb24sIENoYXRUb29sQ2FsbCwgQ2hhdE1lc3NhZ2UsIENoYXRDb250ZW50VG9UZXh0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9vcGVuYWktY2hhdC50c1wiO1xuZXhwb3J0IHsgUkVBU09OSU5HX1RZUEVTIH0gZnJvbSBcIi4vc3JjL29wZW5haS1yZXNwb25zZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvciwgUmVzcG9uc2VzQ2l0YXRpb24sIFJlc3BvbnNlc091dHB1dCB9IGZyb20gXCIuL3NyYy9vcGVuYWktcmVzcG9uc2VzLnRzXCI7XG4iXX0=
@@ -30,6 +30,26 @@ import { ModelClass } from "./model.js";
30
30
  const CHAT_TASK = "llm/v1/chat";
31
31
  /** Task hint Databricks stamps on embedding endpoints. */
32
32
  const EMBEDDING_TASK = "llm/v1/embeddings";
33
+ function parsedFamily(name) {
34
+ const tokens = name.toLowerCase().match(/[a-z0-9]+/g) ?? [];
35
+ const familyToken = tokens.find((token) => {
36
+ return (token === "claude" ||
37
+ token === "gemini" ||
38
+ token === "gemma" ||
39
+ token === "glm" ||
40
+ token === "gpt" ||
41
+ token === "llama" ||
42
+ token === "qwen" ||
43
+ /^qwen\d/.test(token));
44
+ });
45
+ if (!familyToken)
46
+ return undefined;
47
+ const family = (familyToken.startsWith("qwen") ? "qwen" : familyToken);
48
+ return {
49
+ family,
50
+ parts: new Set(tokens),
51
+ };
52
+ }
33
53
  /**
34
54
  * Provider families verified against Databricks Responses/Open Responses with
35
55
  * both a forced function call and a stateless `function_call_output` replay.
@@ -41,14 +61,12 @@ const EMBEDDING_TASK = "llm/v1/embeddings";
41
61
  * passthrough entirely.
42
62
  */
43
63
  export function supportsToolsByFamily(name) {
44
- const n = name.toLowerCase();
45
- if (n.includes("gemini") || n.includes("gpt-oss"))
64
+ const parsed = parsedFamily(name);
65
+ if (!parsed || parsed.family === "gemini")
66
+ return false;
67
+ if (parsed.family === "gpt" && parsed.parts.has("oss"))
46
68
  return false;
47
- return (n.includes("claude") ||
48
- n.includes("gpt") ||
49
- n.includes("qwen") ||
50
- n.includes("glm") ||
51
- n.includes("llama"));
69
+ return ["claude", "gpt", "qwen", "glm", "llama"].includes(parsed.family);
52
70
  }
53
71
  /**
54
72
  * Derive an endpoint's capabilities from its Databricks task hint and its
@@ -127,48 +145,53 @@ function versionScore(name) {
127
145
  */
128
146
  export function classifyByFamily(name) {
129
147
  const n = name.toLowerCase();
148
+ const parsed = parsedFamily(n);
149
+ if (!parsed)
150
+ return null;
151
+ const { family, parts } = parsed;
152
+ const has = (part) => parts.has(part);
130
153
  const at = (cls) => ({ class: cls, rank: versionScore(n) });
131
154
  // Anthropic Claude
132
- if (n.includes("opus"))
155
+ if (family === "claude" && has("opus"))
133
156
  return at(ModelClass.ChatThinking);
134
- if (n.includes("sonnet"))
157
+ if (family === "claude" && has("sonnet"))
135
158
  return at(ModelClass.ChatBalanced);
136
- if (n.includes("haiku"))
159
+ if (family === "claude" && has("haiku"))
137
160
  return at(ModelClass.ChatFast);
138
161
  // OpenAI open-weights (check before the generic gpt branch)
139
- if (n.includes("gpt-oss")) {
140
- return at(n.includes("120b") ? ModelClass.ChatBalanced : ModelClass.ChatFast);
162
+ if (family === "gpt" && has("oss")) {
163
+ return at(has("120b") ? ModelClass.ChatBalanced : ModelClass.ChatFast);
141
164
  }
142
165
  // OpenAI GPT family
143
- if (n.includes("gpt")) {
144
- if (n.includes("pro"))
166
+ if (family === "gpt") {
167
+ if (has("pro"))
145
168
  return at(ModelClass.ChatThinking);
146
- if (n.includes("mini") || n.includes("nano"))
169
+ if (has("mini") || has("nano"))
147
170
  return at(ModelClass.ChatFast);
148
171
  return at(ModelClass.ChatBalanced);
149
172
  }
150
173
  // Google Gemini / Gemma
151
- if (n.includes("gemini")) {
152
- if (n.includes("flash-lite"))
174
+ if (family === "gemini") {
175
+ if (has("flash") && has("lite"))
153
176
  return at(ModelClass.ChatFast);
154
- if (n.includes("pro"))
177
+ if (has("pro"))
155
178
  return at(ModelClass.ChatThinking);
156
179
  return at(ModelClass.ChatBalanced);
157
180
  }
158
- if (n.includes("gemma"))
181
+ if (family === "gemma")
159
182
  return at(ModelClass.ChatFast);
160
183
  // Meta Llama
161
- if (n.includes("llama")) {
162
- if (n.includes("maverick") || n.includes("405b"))
184
+ if (family === "llama") {
185
+ if (has("maverick") || has("405b"))
163
186
  return at(ModelClass.ChatThinking);
164
- if (n.includes("70b"))
187
+ if (has("70b"))
165
188
  return at(ModelClass.ChatBalanced);
166
- if (n.includes("8b") || n.includes("1b"))
189
+ if (has("8b") || has("1b"))
167
190
  return at(ModelClass.ChatFast);
168
191
  return at(ModelClass.ChatBalanced);
169
192
  }
170
193
  // Alibaba Qwen
171
- if (n.includes("qwen"))
194
+ if (family === "qwen")
172
195
  return at(ModelClass.ChatBalanced);
173
196
  return null;
174
197
  }
@@ -279,4 +302,4 @@ export function classifyEndpoints(endpoints) {
279
302
  [ModelClass.Embedding]: embeddings,
280
303
  };
281
304
  }
282
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xhc3NpZnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBK0IsTUFBTSxZQUFZLENBQUM7QUFFckUsZ0VBQWdFO0FBQ2hFLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQztBQUVoQywwREFBMEQ7QUFDMUQsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUM7QUFZM0M7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBQVk7SUFDaEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2hFLE9BQU8sQ0FDTCxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNwQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNsQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUNwQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxRQUFnQztJQUNuRSxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsSUFBSSxRQUFRLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDOUYsOEVBQThFO0lBQzlFLDhDQUE4QztJQUM5QyxNQUFNLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDekYsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN2RixPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNwQyxDQUFDO0FBVUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQVk7SUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSTtTQUNkLEtBQUssQ0FBQyxLQUFLLENBQUM7U0FDWixLQUFLLENBQUMsYUFBYSxDQUFDO1NBQ3BCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBb0IsRUFBRSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUM7U0FDMUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixTQUFTLGtCQUFrQixDQUFDLENBQW9CLEVBQUUsQ0FBb0I7SUFDcEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztJQUM5QixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsT0FBTyxLQUFLLEdBQUcsU0FBUyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBWTtJQUMzQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFlLEVBQWUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXJGLG1CQUFtQjtJQUNuQixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0QsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV4RCw0REFBNEQ7SUFDNUQsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxvQkFBb0I7SUFDcEIsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0UsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFELE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV4RCxhQUFhO0lBQ2IsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsZUFBZTtJQUNmLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFM0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLFNBQVMsUUFBUSxDQUFDLFNBQTRCLEVBQUUsQ0FBUztJQUN2RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUM5QyxNQUFNLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLEVBQUUsS0FBSyxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUMsRUFBRSxDQUFFLENBQUM7SUFDckMsT0FBTyxTQUFTLENBQUMsRUFBRSxDQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQWVELFNBQVMsU0FBUyxDQUFDLENBQVMsRUFBRSxDQUFTO0lBQ3JDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTTtRQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUk7UUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM5QyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLE9BQU87UUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUMxRCxJQUFJLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLFFBQVE7UUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUM5RCxrRUFBa0U7SUFDbEUsMkRBQTJEO0lBQzNELCtCQUErQjtJQUMvQixPQUFPLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixTQUE0QztJQUU1QyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sU0FBUyxHQUFHLElBQUk7U0FDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztTQUM5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sT0FBTyxHQUFpQztRQUM1QyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFO1FBQzdCLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUU7UUFDN0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUN6QixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFO0tBQzNCLENBQUM7SUFFRixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO1FBQzlCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sT0FBTyxHQUFHLENBQVcsQ0FBQztZQUM1QixNQUFNLEdBQUcsR0FDUCxPQUFPLElBQUksSUFBSTtnQkFDYixDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVk7Z0JBQ3pCLENBQUMsQ0FBQyxPQUFPLElBQUksR0FBRztvQkFDZCxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVE7b0JBQ3JCLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hCLEVBQUU7Z0JBQ0YsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsTUFBTSxFQUFFLElBQUk7Z0JBQ1osT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUI7Z0JBQ3JELFFBQVEsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDO2dCQUNoQyxPQUFPLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7YUFDL0IsQ0FBQyxDQUFDO1lBQ0gsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU07WUFBRSxTQUFTO1FBQ3RCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3pCLEVBQUU7WUFDRixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsTUFBTSxFQUFFLEtBQUs7WUFDYixPQUFPLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtZQUNqQyxRQUFRLEVBQUUsQ0FBQztZQUNYLE9BQU8sRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLENBQUM7SUFFdEUsT0FBTztRQUNMLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RixDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUYsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BGLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVU7S0FDbkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZGVsLWNsYXNzIGNsYXNzaWZpY2F0aW9uIGZvciBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzLlxuICpcbiAqIENoYXQgY2FwYWJpbGl0eSBiYW5kcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBsaXZlIHdvcmtzcGFjZSBjYXRhbG9ndWVcbiAqIHJhdGhlciB0aGFuIGEgaGFuZC1tYWludGFpbmVkIHRhYmxlLiBEYXRhYnJpY2tzIHB1Ymxpc2hlc1xuICogcGVyLWVuZHBvaW50IGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgc2NvcmVzICh0aGUgQUkgUGxheWdyb3VuZFxuICogYmFycykgb24gdGhlIHNlcnZpbmcgbGlzdDsge0BsaW5rIGNsYXNzaWZ5RW5kcG9pbnRzfSBidWNrZXRzIHNjb3JlZFxuICogY2hhdCBtb2RlbHMgaW50byB0aGUgY2hhdCB7QGxpbmsgTW9kZWxDbGFzc30gYmFuZHMgYnkgdGhlICpyZWxhdGl2ZSpcbiAqIGRpc3RyaWJ1dGlvbiBvZiB0aG9zZSBzY29yZXMgKHF1YW50aWxlcywgbm90IGZpeGVkIGN1dC1vZmZzKSBzbyBhXG4gKiBicmFuZC1uZXcgbW9kZWwgdGhhdCBsYW5kcyBvdXRzaWRlIHRvZGF5J3Mgc2NvcmUgcmFuZ2Ugc3RpbGwgc2xvdHMgaW5cbiAqIG5leHQgdG8gaXRzIHBlZXJzLiBFbWJlZGRpbmcgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiYClcbiAqIGFyZSBidWNrZXRlZCBpbnRvIHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ30gYnkgdGFzaywgaW5kZXBlbmRlbnQgb2ZcbiAqIGFueSBzY29yZS5cbiAqXG4gKiBVbnNjb3JlZC1idXQtcmVjb2duaXphYmxlIGNoYXQgZW5kcG9pbnRzIGFyZSBzdGlsbCBwbGFjZWQgYnkgYSBzbWFsbFxuICogZmFtaWx5IGhldXJpc3RpYyAoe0BsaW5rIGNsYXNzaWZ5QnlGYW1pbHl9KSBzbyBhIHdvcmtzcGFjZSB3aG9zZVxuICogbW9kZWxzIHByZWRhdGUgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmluZyBrZWVwcyB3b3JraW5nLiBUaGVcbiAqIG9mZmxpbmUgZmFsbGJhY2sgZmxvb3IgLSB0aGUgaGFyZC1jb2RlZCBtb2RlbCBsaXN0IHJlYWNoZWQgZm9yIHdoZW5cbiAqIHRoZSBsaXZlIGNhdGFsb2d1ZSBjYW4ndCBiZSByZWFkIGF0IGFsbCAtIGlzIGEgc2VydmVyIGNvbmNlcm4gYW5kXG4gKiBsaXZlcyBpbiBgQGRieC10b29scy9tb2RlbGAsIG5vdCBoZXJlOiBhIGJyb3dzZXIgY2xpZW50IG5ldmVyIHRhbGtzXG4gKiB0byBEYXRhYnJpY2tzIGRpcmVjdGx5LCBzbyBpdCBoYXMgbm90aGluZyB0byBmYWxsIGJhY2sgdG8uXG4gKlxuICogUHVyZSAobm8gTm9kZS1vbmx5IGltcG9ydHMpLCBzbyBhIGNsaWVudCBjYW4gY2xhc3NpZnkgYSBgL21vZGVsc2BcbiAqIHJlc3BvbnNlIHdpdGhvdXQgc2VydmVyIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgTW9kZWxDbGFzcywgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcblxuLyoqIFRhc2sgaGludCBEYXRhYnJpY2tzIHN0YW1wcyBvbiBjaGF0IGNvbXBsZXRpb24gZW5kcG9pbnRzLiAqL1xuY29uc3QgQ0hBVF9UQVNLID0gXCJsbG0vdjEvY2hhdFwiO1xuXG4vKiogVGFzayBoaW50IERhdGFicmlja3Mgc3RhbXBzIG9uIGVtYmVkZGluZyBlbmRwb2ludHMuICovXG5jb25zdCBFTUJFRERJTkdfVEFTSyA9IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcblxuLyoqIFdoYXQgYW4gZW5kcG9pbnQgY2FuIGJlIGFza2VkIHRvIGRvLCBhcyBkZXJpdmVkIGJ5IHtAbGluayBlbmRwb2ludENhcGFiaWxpdGllc30uICovXG5leHBvcnQgaW50ZXJmYWNlIEVuZHBvaW50Q2FwYWJpbGl0aWVzIHtcbiAgLyoqIE9wZW5BSSBjaGF0L2NvbXBsZXRpb25zICsgUmVzcG9uc2VzOiB0aGUgc3VyZmFjZSBhIGNoYXQgYWdlbnQgbmVlZHMuICovXG4gIGNoYXQ6IGJvb2xlYW47XG4gIC8qKiBFbWJlZGRpbmcgKHZlY3RvcikgZW5kcG9pbnQuICovXG4gIGVtYmVkZGluZzogYm9vbGVhbjtcbiAgLyoqIENvbXBsZXRlIGZ1bmN0aW9uLXRvb2wgcm91bmQtdHJpcCAoY2FsbCBwbHVzIGZ1bmN0aW9uX2NhbGxfb3V0cHV0IHJlcGxheSkuICovXG4gIHRvb2xzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3ZpZGVyIGZhbWlsaWVzIHZlcmlmaWVkIGFnYWluc3QgRGF0YWJyaWNrcyBSZXNwb25zZXMvT3BlbiBSZXNwb25zZXMgd2l0aFxuICogYm90aCBhIGZvcmNlZCBmdW5jdGlvbiBjYWxsIGFuZCBhIHN0YXRlbGVzcyBgZnVuY3Rpb25fY2FsbF9vdXRwdXRgIHJlcGxheS5cbiAqXG4gKiBEYXRhYnJpY2tzJyBlbmRwb2ludCBsaXN0L09wZW5BUEkgY3VycmVudGx5IGV4cG9zZXMgbm8gdG9vbHMgY2FwYWJpbGl0eSBiaXQuXG4gKiBLZWVwIHRoaXMgY29uc2VydmF0aXZlOiBhbiB1bmtub3duIGNoYXQgZmFtaWx5IGlzIG5vdCBhZ2VudC1zYWZlIHVudGlsIGl0IGlzXG4gKiB2ZXJpZmllZC4gR2VtaW5pIGlzIGV4Y2x1ZGVkIGJlY2F1c2UgaXQgZW1pdHMgYSBjYWxsIGJ1dCBPcGVuIFJlc3BvbnNlc1xuICogY2Fubm90IHJlcGxheSB0aGUgcmVxdWlyZWQgdGhvdWdodCBzaWduYXR1cmU7IEdQVC1PU1MgcmVqZWN0cyBSZXNwb25zZXNcbiAqIHBhc3N0aHJvdWdoIGVudGlyZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNUb29sc0J5RmFtaWx5KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBuID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBpZiAobi5pbmNsdWRlcyhcImdlbWluaVwiKSB8fCBuLmluY2x1ZGVzKFwiZ3B0LW9zc1wiKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKFxuICAgIG4uaW5jbHVkZXMoXCJjbGF1ZGVcIikgfHxcbiAgICBuLmluY2x1ZGVzKFwiZ3B0XCIpIHx8XG4gICAgbi5pbmNsdWRlcyhcInF3ZW5cIikgfHxcbiAgICBuLmluY2x1ZGVzKFwiZ2xtXCIpIHx8XG4gICAgbi5pbmNsdWRlcyhcImxsYW1hXCIpXG4gICk7XG59XG5cbi8qKlxuICogRGVyaXZlIGFuIGVuZHBvaW50J3MgY2FwYWJpbGl0aWVzIGZyb20gaXRzIERhdGFicmlja3MgdGFzayBoaW50IGFuZCBpdHNcbiAqIGNsYXNzaWZpZWQge0BsaW5rIE1vZGVsQ2xhc3N9LCBzbyBjb25zdW1lcnMgZmlsdGVyIG9uIGNhcGFiaWxpdHkgaW5zdGVhZCBvZlxuICogcmUtZGVyaXZpbmcgaXQgZnJvbSByYXcgYHRhc2tgIC8gYGNsYXNzYCBzdHJpbmdzLlxuICpcbiAqIEVpdGhlciBzaWduYWwgYWxvbmUgaXMgZW5vdWdoOiB0aGUgdGFzayBoaW50IGlzIGF1dGhvcml0YXRpdmUgd2hlbiBwcmVzZW50LFxuICogYW5kIHRoZSBjbGFzcyBjb3ZlcnMgZW5kcG9pbnRzIERhdGFicmlja3MgbGVmdCB1bnRhc2tlZCBidXQgdGhlIGNsYXNzaWZpZXJcbiAqIHJlY29nbml6ZWQuIEVtYmVkZGluZyB3aW5zIG92ZXIgY2hhdCB3aGVuIGJvdGggcG9pbnQgYXQgaXQsIHNpbmNlIHRoZSB0d28gYXJlXG4gKiBub3QgaW50ZXJjaGFuZ2VhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBFbmRwb2ludENhcGFiaWxpdGllcyB7XG4gIGNvbnN0IGVtYmVkZGluZyA9IGVuZHBvaW50LnRhc2sgPT09IEVNQkVERElOR19UQVNLIHx8IGVuZHBvaW50LmNsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZztcbiAgLy8gRXZlcnkgbm9uLWVtYmVkZGluZyBjbGFzcyBpcyBhIGNoYXQgYmFuZCwgc28gXCJjbGFzc2lmaWVkIGJ1dCBub3QgZW1iZWRkaW5nXCJcbiAgLy8gaXMgdGhlIGNsYXNzLXNpZGUgdGVzdCBmb3IgY2hhdCBjYXBhYmlsaXR5LlxuICBjb25zdCBjaGF0ID0gIWVtYmVkZGluZyAmJiAoZW5kcG9pbnQudGFzayA9PT0gQ0hBVF9UQVNLIHx8IGVuZHBvaW50LmNsYXNzICE9PSB1bmRlZmluZWQpO1xuICBjb25zdCB0b29scyA9IGNoYXQgJiYgKGVuZHBvaW50LnN1cHBvcnRzVG9vbHMgPz8gc3VwcG9ydHNUb29sc0J5RmFtaWx5KGVuZHBvaW50Lm5hbWUpKTtcbiAgcmV0dXJuIHsgY2hhdCwgZW1iZWRkaW5nLCB0b29scyB9O1xufVxuXG4vKiogRmFtaWx5LWhldXJpc3RpYyBjbGFzc2lmaWNhdGlvbiBvZiBhIHNpbmdsZSBlbmRwb2ludCBuYW1lLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYW1pbHlDbGFzcyB7XG4gIC8qKiBDaGF0IGNhcGFiaWxpdHkgYmFuZCB0aGUgZmFtaWx5IG1hcHMgdG8gKG5ldmVyIGVtYmVkZGluZykuICovXG4gIGNsYXNzOiBNb2RlbENsYXNzO1xuICAvKiogSW50cmEtZmFtaWx5IG9yZGVyaW5nIGhpbnQgKGhpZ2hlciBpcyBuZXdlciAvIG1vcmUgY2FwYWJsZSkuICovXG4gIHJhbms6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBOdW1lcmljIGBbbWFqb3IsIG1pbm9yLCBwYXRjaF1gIHZlcnNpb24gcGFyc2VkIGZyb20gYW4gZW5kcG9pbnRcbiAqIG5hbWUsIHVzZWQgdG8gb3JkZXIgc2libGluZ3Mgd2l0aGluIGEgZmFtaWx5L3RpZXIuIFN0YXJ0cyBhdCB0aGVcbiAqIGZpcnN0IGRpZ2l0IGluIHRoZSBuYW1lLCB0aGVuIHJlYWRzIHN1Y2Nlc3NpdmUgc2VwYXJhdG9yLWRlbGltaXRlZCxcbiAqIGRpZ2l0LXByZWZpeGVkIGNodW5rcyBhcyB0aGUgdGhyZWUgY29tcG9uZW50cyAobWlzc2luZyBvbmVzIGRlZmF1bHRcbiAqIHRvIGAwYCk6XG4gKlxuICogICAtIGBkYXRhYnJpY2tzLWNsYXVkZS1vcHVzLTQtOGAgICAtPiBgWzQsIDgsIDBdYFxuICogICAtIGBkYXRhYnJpY2tzLWNsYXVkZS1vcHVzLTQtMTBgICAtPiBgWzQsIDEwLCAwXWAgKHNvcnRzIGFib3ZlIDQtOClcbiAqICAgLSBgZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGJgLT4gYFszLCAzLCA3MF1gXG4gKiAgIC0gYGRhdGFicmlja3MtYmdlLWxhcmdlLWVuYCAgICAgIC0+IGBbMCwgMCwgMF1gIChubyBkaWdpdHMpXG4gKlxuICogQ29tcG9uZW50LXdpc2UgY29tcGFyaXNvbiAobm90IGEgZGVjaW1hbCBjb2xsYXBzZSkgc28gYDQuMTBgIGJlYXRzXG4gKiBgNC44YCAtIHRoZSBidWcgYSBgbWFqb3IgKyBtaW5vci8xMGAgc2NvcmUgd291bGQgaGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvblR1cGxlKG5hbWU6IHN0cmluZyk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IHN0YXJ0ID0gbmFtZS5zZWFyY2goL1xcZC8pO1xuICBpZiAoc3RhcnQgPCAwKSByZXR1cm4gWzAsIDAsIDBdO1xuICBjb25zdCBudW1zID0gbmFtZVxuICAgIC5zbGljZShzdGFydClcbiAgICAuc3BsaXQoL1teYS16MC05XSsvaSlcbiAgICAubWFwKChjaHVuaykgPT4gY2h1bmsubWF0Y2goL15cXGQrLyk/LlswXSlcbiAgICAuZmlsdGVyKChkaWdpdHMpOiBkaWdpdHMgaXMgc3RyaW5nID0+IGRpZ2l0cyAhPT0gdW5kZWZpbmVkKVxuICAgIC5tYXAoTnVtYmVyKTtcbiAgcmV0dXJuIFtudW1zWzBdID8/IDAsIG51bXNbMV0gPz8gMCwgbnVtc1syXSA/PyAwXTtcbn1cblxuLyoqIENvbXBhcmUgdHdvIHZlcnNpb24gdHVwbGVzIHNvIHRoZSBoaWdoZXIgdmVyc2lvbiBzb3J0cyBmaXJzdCAoZGVzY2VuZGluZykuICovXG5mdW5jdGlvbiBjb21wYXJlVmVyc2lvbkRlc2MoYTogcmVhZG9ubHkgbnVtYmVyW10sIGI6IHJlYWRvbmx5IG51bWJlcltdKTogbnVtYmVyIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICBjb25zdCBkaWZmID0gKGJbaV0gPz8gMCkgLSAoYVtpXSA/PyAwKTtcbiAgICBpZiAoZGlmZiAhPT0gMCkgcmV0dXJuIGRpZmY7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogTW9ub3RvbmljIHZlcnNpb24ga2V5IGZvciBvcmRlcmluZyBzaWJsaW5ncyB3aXRoaW4gYSBmYW1pbHkvdGllclxuICogKGUuZy4gYG9wdXMtNC04YCBvdmVyIGBvcHVzLTQtN2ApLiBFbmNvZGVzIHRoZSB7QGxpbmsgdmVyc2lvblR1cGxlfVxuICogYXMgYSBzaW5nbGUgbnVtYmVyIHNvIGNhbGxlcnMgdGhhdCBuZWVkIGEgc2NhbGFyIHJhbmsgKHRoZSBmYW1pbHlcbiAqIGhldXJpc3RpYywgdGhlIHN0YXRpYyBmYWxsYmFjayBvcmRlcmluZykga2VlcCB3b3JraW5nOyB0aGUgZW5jb2RpbmdcbiAqIHByZXNlcnZlcyBjb21wb25lbnQgb3JkZXIgd2l0aG91dCB0aGUgZGVjaW1hbC1jb2xsYXBzZSBidWcuXG4gKi9cbmZ1bmN0aW9uIHZlcnNpb25TY29yZShuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSB2ZXJzaW9uVHVwbGUobmFtZSk7XG4gIHJldHVybiBtYWpvciAqIDFfMDAwXzAwMCArIG1pbm9yICogMV8wMDAgKyBwYXRjaDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBjaGF0IGNhcGFiaWxpdHkgYmFuZCBmb3IgYW4gZW5kcG9pbnQgd2UgaGF2ZSBubyBsaXZlXG4gKiBzY29yZSBmb3IsIGtleWVkIG9mZiBwcm92aWRlciBmYW1pbHkgYW5kIHRoZSB3ZWxsLWtub3duIHZhcmlhbnQgd29yZHNcbiAqIGluIHRoZSBuYW1lIChgb3B1c2AvYHNvbm5ldGAvYGhhaWt1YCwgYHByb2AvYG1pbmlgL2BuYW5vYCxcbiAqIGBmbGFzaGAvYGZsYXNoLWxpdGVgLCBMbGFtYSBwYXJhbWV0ZXIgc2l6ZXMsIGV0YykuIFJldHVybnMgYG51bGxgIGZvclxuICogbmFtZXMgd2UgZG9uJ3QgcmVjb2duaXplIHNvIHVua25vd24gY3VzdG9tIGVuZHBvaW50cyBhcmUgbmV2ZXJcbiAqIGF1dG8tc2VsZWN0ZWQgYXMgYSBkZWZhdWx0LiBUaGUgYWNjb21wYW55aW5nIGByYW5rYCBvcmRlcnMgc2libGluZ3NcbiAqIHdpdGhpbiBhIGNsYXNzLiBPbmx5IGV2ZXIgcmV0dXJucyBhIGNoYXQgYmFuZCAtIGVtYmVkZGluZyBlbmRwb2ludHNcbiAqIGFyZSBjbGFzc2lmaWVkIGJ5IHRhc2ssIG5vdCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlCeUZhbWlseShuYW1lOiBzdHJpbmcpOiBGYW1pbHlDbGFzcyB8IG51bGwge1xuICBjb25zdCBuID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBhdCA9IChjbHM6IE1vZGVsQ2xhc3MpOiBGYW1pbHlDbGFzcyA9PiAoeyBjbGFzczogY2xzLCByYW5rOiB2ZXJzaW9uU2NvcmUobikgfSk7XG5cbiAgLy8gQW50aHJvcGljIENsYXVkZVxuICBpZiAobi5pbmNsdWRlcyhcIm9wdXNcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gIGlmIChuLmluY2x1ZGVzKFwic29ubmV0XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICBpZiAobi5pbmNsdWRlcyhcImhhaWt1XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG5cbiAgLy8gT3BlbkFJIG9wZW4td2VpZ2h0cyAoY2hlY2sgYmVmb3JlIHRoZSBnZW5lcmljIGdwdCBicmFuY2gpXG4gIGlmIChuLmluY2x1ZGVzKFwiZ3B0LW9zc1wiKSkge1xuICAgIHJldHVybiBhdChuLmluY2x1ZGVzKFwiMTIwYlwiKSA/IE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkIDogTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gIH1cbiAgLy8gT3BlbkFJIEdQVCBmYW1pbHlcbiAgaWYgKG4uaW5jbHVkZXMoXCJncHRcIikpIHtcbiAgICBpZiAobi5pbmNsdWRlcyhcInByb1wiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIm1pbmlcIikgfHwgbi5pbmNsdWRlcyhcIm5hbm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRGYXN0KTtcbiAgICByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICB9XG5cbiAgLy8gR29vZ2xlIEdlbWluaSAvIEdlbW1hXG4gIGlmIChuLmluY2x1ZGVzKFwiZ2VtaW5pXCIpKSB7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJmbGFzaC1saXRlXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJwcm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gICAgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgfVxuICBpZiAobi5pbmNsdWRlcyhcImdlbW1hXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG5cbiAgLy8gTWV0YSBMbGFtYVxuICBpZiAobi5pbmNsdWRlcyhcImxsYW1hXCIpKSB7XG4gICAgaWYgKG4uaW5jbHVkZXMoXCJtYXZlcmlja1wiKSB8fCBuLmluY2x1ZGVzKFwiNDA1YlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIjcwYlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgICBpZiAobi5pbmNsdWRlcyhcIjhiXCIpIHx8IG4uaW5jbHVkZXMoXCIxYlwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICAgIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCk7XG4gIH1cblxuICAvLyBBbGliYWJhIFF3ZW5cbiAgaWYgKG4uaW5jbHVkZXMoXCJxd2VuXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogTGluZWFyLWludGVycG9sYXRlZCBxdWFudGlsZSBvZiBhbiBhc2NlbmRpbmctc29ydGVkIG51bWVyaWMgYXJyYXkuICovXG5mdW5jdGlvbiBxdWFudGlsZShzb3J0ZWRBc2M6IHJlYWRvbmx5IG51bWJlcltdLCBwOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoc29ydGVkQXNjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIE51bWJlci5OYU47XG4gIGNvbnN0IGlkeCA9IChzb3J0ZWRBc2MubGVuZ3RoIC0gMSkgKiBwO1xuICBjb25zdCBsbyA9IE1hdGguZmxvb3IoaWR4KTtcbiAgY29uc3QgaGkgPSBNYXRoLmNlaWwoaWR4KTtcbiAgaWYgKGxvID09PSBoaSkgcmV0dXJuIHNvcnRlZEFzY1tsb10hO1xuICByZXR1cm4gc29ydGVkQXNjW2xvXSEgKyAoc29ydGVkQXNjW2hpXSEgLSBzb3J0ZWRBc2NbbG9dISkgKiAoaWR4IC0gbG8pO1xufVxuXG4vKiogSW50ZXJuYWwgc29ydGFibGUgd3JhcHBlciBjYXJyeWluZyB0aGUgb3JkZXJpbmcga2V5cyBmb3IgYSBidWNrZXQgZW50cnkuICovXG5pbnRlcmZhY2UgUmFua2VkIHtcbiAgZXA6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnk7XG4gIC8qKiBRdWFsaXR5IChzY29yZWQpIG9yIGZhbWlseSB2ZXJzaW9uICh1bnNjb3JlZCkgLSBoaWdoZXIgZmlyc3QuICovXG4gIHNvcnQ6IG51bWJlcjtcbiAgLyoqIFNjb3JlZCBlbmRwb2ludHMgcmFuayBhaGVhZCBvZiBmYW1pbHktb25seSBndWVzc2VzLiAqL1xuICBzY29yZWQ6IGJvb2xlYW47XG4gIHRpZUNvc3Q6IG51bWJlcjtcbiAgdGllU3BlZWQ6IG51bWJlcjtcbiAgLyoqIFBhcnNlZCBuYW1lIHZlcnNpb24sIHRoZSBmaW5hbCB0aWUtYnJlYWtlciAobmV3ZXIgc2libGluZyBmaXJzdCkuICovXG4gIHZlcnNpb246IHJlYWRvbmx5IG51bWJlcltdO1xufVxuXG5mdW5jdGlvbiByYW5rT3JkZXIoYTogUmFua2VkLCBiOiBSYW5rZWQpOiBudW1iZXIge1xuICBpZiAoYS5zY29yZWQgIT09IGIuc2NvcmVkKSByZXR1cm4gYS5zY29yZWQgPyAtMSA6IDE7XG4gIGlmIChiLnNvcnQgIT09IGEuc29ydCkgcmV0dXJuIGIuc29ydCAtIGEuc29ydDtcbiAgaWYgKGEudGllQ29zdCAhPT0gYi50aWVDb3N0KSByZXR1cm4gYS50aWVDb3N0IC0gYi50aWVDb3N0O1xuICBpZiAoYi50aWVTcGVlZCAhPT0gYS50aWVTcGVlZCkgcmV0dXJuIGIudGllU3BlZWQgLSBhLnRpZVNwZWVkO1xuICAvLyBTYW1lIHNjb3JlZC1uZXNzLCBxdWFsaXR5LCBjb3N0LCBhbmQgc3BlZWQgKGUuZy4gc2V2ZXJhbCBDbGF1ZGVcbiAgLy8gT3B1cyBwb2ludCByZWxlYXNlcyk6IHByZWZlciB0aGUgbmV3ZXIgcGFyc2VkIHZlcnNpb24gc29cbiAgLy8gYG9wdXMtNC04YCBiZWF0cyBgb3B1cy00LTdgLlxuICByZXR1cm4gY29tcGFyZVZlcnNpb25EZXNjKGEudmVyc2lvbiwgYi52ZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBCdWNrZXQgbGl2ZSBlbmRwb2ludHMgaW50byB7QGxpbmsgTW9kZWxDbGFzc31lcywgcmFua2VkIGJlc3QtZmlyc3RcbiAqIHdpdGhpbiBlYWNoIGNoYXQgYmFuZC5cbiAqXG4gKiBFbWJlZGRpbmcgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiYCkgZ28gaW50b1xuICoge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfSBieSB0YXNrLCBpbiBsaXN0aW5nIG9yZGVyICh0aGV5IGNhcnJ5IG5vXG4gKiBjYXBhYmlsaXR5IHNjb3JlIHRvIHJhbmsgb24pLlxuICpcbiAqIENoYXQgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvY2hhdFwiYCkgc3BsaXQgaW50byB0aGUgdGhyZWUgY2hhdFxuICogYmFuZHMuIFNjb3JlZCBlbmRwb2ludHMgKHRob3NlIGNhcnJ5aW5nIGEgYHByb2ZpbGUucXVhbGl0eWApIGRyaXZlXG4gKiB0aGUgYmFuZGluZzogdGhlIG9ic2VydmVkIHF1YWxpdHkgZGlzdHJpYnV0aW9uIGlzIHNwbGl0IGF0IGl0cyAxLzNcbiAqIGFuZCAyLzMgcXVhbnRpbGVzLCBzbyB0aGUgdG9wIHRoaXJkIGlzIHtAbGluayBNb2RlbENsYXNzLkNoYXRUaGlua2luZ30sXG4gKiB0aGUgYm90dG9tIHRoaXJkIHtAbGluayBNb2RlbENsYXNzLkNoYXRGYXN0fSwgYW5kIHRoZSBtaWRkbGVcbiAqIHtAbGluayBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZH0uIEJlY2F1c2UgdGhlIHRocmVzaG9sZHMgY29tZSBmcm9tIHRoZVxuICogZGF0YSwgdGhlIHNwbGl0IGFkYXB0cyBhcyBEYXRhYnJpY2tzIGFkZHMgb3IgcmVzY29yZXMgbW9kZWxzIC1cbiAqIG5vdGhpbmcgaXMgcGlubmVkIHRvIGEgZml4ZWQgc2NvcmUgYmFuZC5cbiAqXG4gKiBVbnNjb3JlZCBjaGF0IGVuZHBvaW50cyBhcmUgcGxhY2VkIGJ5IHtAbGluayBjbGFzc2lmeUJ5RmFtaWx5fSBhbmRcbiAqIHJhbmtlZCBhZnRlciB0aGUgc2NvcmVkIG9uZXMgaW4gdGhlaXIgYmFuZDsgdW5yZWNvZ25pemVkLCB1bnNjb3JlZFxuICogZW5kcG9pbnRzIChlLmcuIGN1c3RvbSBleHRlcm5hbCBtb2RlbHMpIGFyZSBvbWl0dGVkIGVudGlyZWx5IHNvIHRoZXlcbiAqIGFyZSBuZXZlciBwaWNrZWQgYXMgYW4gYXV0b21hdGljIGRlZmF1bHQuXG4gKlxuICogV2l0aGluIGEgY2hhdCBiYW5kLCBzY29yZWQgbW9kZWxzIHNvcnQgYnkgYHF1YWxpdHlgIGRlc2MsIHRoZW4gYGNvc3RgXG4gKiBhc2MsIHRoZW4gYHNwZWVkYCBkZXNjLCB0aGVuIHBhcnNlZCBuYW1lIHZlcnNpb24gZGVzYzsgZmFtaWx5LW9ubHlcbiAqIG1vZGVscyBzb3J0IGJ5IHZlcnNpb24gcmFuayB0aGVuIHBhcnNlZCB2ZXJzaW9uLiBUaGUgdmVyc2lvblxuICogdGllLWJyZWFrICh7QGxpbmsgdmVyc2lvblR1cGxlfSkgaXMgd2hhdCBzZXBhcmF0ZXMgcG9pbnQgcmVsZWFzZXNcbiAqIHRoYXQgc2hhcmUgYSBzY29yZSBwcm9maWxlIChlLmcuIGBvcHVzLTQtOGAgYWhlYWQgb2YgYG9wdXMtNC03YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUVuZHBvaW50cyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBSZWNvcmQ8TW9kZWxDbGFzcywgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IGNoYXQgPSBlbmRwb2ludHMuZmlsdGVyKChlKSA9PiBlLnRhc2sgPT09IENIQVRfVEFTSyk7XG4gIGNvbnN0IHF1YWxpdGllcyA9IGNoYXRcbiAgICAubWFwKChlKSA9PiBlLnByb2ZpbGU/LnF1YWxpdHkpXG4gICAgLmZpbHRlcigocSk6IHEgaXMgbnVtYmVyID0+IE51bWJlci5pc0Zpbml0ZShxKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICBjb25zdCBsb3cgPSBxdWFudGlsZShxdWFsaXRpZXMsIDEgLyAzKTtcbiAgY29uc3QgaGlnaCA9IHF1YW50aWxlKHF1YWxpdGllcywgMiAvIDMpO1xuXG4gIGNvbnN0IGJ1Y2tldHM6IFJlY29yZDxNb2RlbENsYXNzLCBSYW5rZWRbXT4gPSB7XG4gICAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTogW10sXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTogW10sXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBbXSxcbiAgICBbTW9kZWxDbGFzcy5FbWJlZGRpbmddOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IGVwIG9mIGNoYXQpIHtcbiAgICBjb25zdCBxID0gZXAucHJvZmlsZT8ucXVhbGl0eTtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHEpKSB7XG4gICAgICBjb25zdCBxdWFsaXR5ID0gcSBhcyBudW1iZXI7XG4gICAgICBjb25zdCBjbHMgPVxuICAgICAgICBxdWFsaXR5ID49IGhpZ2hcbiAgICAgICAgICA/IE1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXG4gICAgICAgICAgOiBxdWFsaXR5IDw9IGxvd1xuICAgICAgICAgICAgPyBNb2RlbENsYXNzLkNoYXRGYXN0XG4gICAgICAgICAgICA6IE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkO1xuICAgICAgYnVja2V0c1tjbHNdLnB1c2goe1xuICAgICAgICBlcCxcbiAgICAgICAgc29ydDogcXVhbGl0eSxcbiAgICAgICAgc2NvcmVkOiB0cnVlLFxuICAgICAgICB0aWVDb3N0OiBlcC5wcm9maWxlPy5jb3N0ID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgdGllU3BlZWQ6IGVwLnByb2ZpbGU/LnNwZWVkID8/IDAsXG4gICAgICAgIHZlcnNpb246IHZlcnNpb25UdXBsZShlcC5uYW1lKSxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGZhbWlseSA9IGNsYXNzaWZ5QnlGYW1pbHkoZXAubmFtZSk7XG4gICAgaWYgKCFmYW1pbHkpIGNvbnRpbnVlO1xuICAgIGJ1Y2tldHNbZmFtaWx5LmNsYXNzXS5wdXNoKHtcbiAgICAgIGVwLFxuICAgICAgc29ydDogZmFtaWx5LnJhbmssXG4gICAgICBzY29yZWQ6IGZhbHNlLFxuICAgICAgdGllQ29zdDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgdGllU3BlZWQ6IDAsXG4gICAgICB2ZXJzaW9uOiB2ZXJzaW9uVHVwbGUoZXAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBFbWJlZGRpbmdzIGFyZSBidWNrZXRlZCBieSB0YXNrIGluIGxpc3Rpbmcgb3JkZXIgLSBubyBzY29yZSB0byByYW5rLlxuICBjb25zdCBlbWJlZGRpbmdzID0gZW5kcG9pbnRzLmZpbHRlcigoZSkgPT4gZS50YXNrID09PSBFTUJFRERJTkdfVEFTSyk7XG5cbiAgcmV0dXJuIHtcbiAgICBbTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmddOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXS5zb3J0KHJhbmtPcmRlcikubWFwKCh4KSA9PiB4LmVwKSxcbiAgICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXS5zb3J0KHJhbmtPcmRlcikubWFwKCh4KSA9PiB4LmVwKSxcbiAgICBbTW9kZWxDbGFzcy5DaGF0RmFzdF06IGJ1Y2tldHNbTW9kZWxDbGFzcy5DaGF0RmFzdF0uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogZW1iZWRkaW5ncyxcbiAgfTtcbn1cbiJdfQ==
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xhc3NpZnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBK0IsTUFBTSxZQUFZLENBQUM7QUFFckUsZ0VBQWdFO0FBQ2hFLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQztBQUVoQywwREFBMEQ7QUFDMUQsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUM7QUFTM0MsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1RCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDeEMsT0FBTyxDQUNMLEtBQUssS0FBSyxRQUFRO1lBQ2xCLEtBQUssS0FBSyxRQUFRO1lBQ2xCLEtBQUssS0FBSyxPQUFPO1lBQ2pCLEtBQUssS0FBSyxLQUFLO1lBQ2YsS0FBSyxLQUFLLEtBQUs7WUFDZixLQUFLLEtBQUssT0FBTztZQUNqQixLQUFLLEtBQUssTUFBTTtZQUNoQixTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUN0QixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25DLE1BQU0sTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQWdCLENBQUM7SUFDdEYsT0FBTztRQUNMLE1BQU07UUFDTixLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDO0tBQ3ZCLENBQUM7QUFDSixDQUFDO0FBWUQ7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T0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BGLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVU7S0FDbkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZGVsLWNsYXNzIGNsYXNzaWZpY2F0aW9uIGZvciBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzLlxuICpcbiAqIENoYXQgY2FwYWJpbGl0eSBiYW5kcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBsaXZlIHdvcmtzcGFjZSBjYXRhbG9ndWVcbiAqIHJhdGhlciB0aGFuIGEgaGFuZC1tYWludGFpbmVkIHRhYmxlLiBEYXRhYnJpY2tzIHB1Ymxpc2hlc1xuICogcGVyLWVuZHBvaW50IGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgc2NvcmVzICh0aGUgQUkgUGxheWdyb3VuZFxuICogYmFycykgb24gdGhlIHNlcnZpbmcgbGlzdDsge0BsaW5rIGNsYXNzaWZ5RW5kcG9pbnRzfSBidWNrZXRzIHNjb3JlZFxuICogY2hhdCBtb2RlbHMgaW50byB0aGUgY2hhdCB7QGxpbmsgTW9kZWxDbGFzc30gYmFuZHMgYnkgdGhlICpyZWxhdGl2ZSpcbiAqIGRpc3RyaWJ1dGlvbiBvZiB0aG9zZSBzY29yZXMgKHF1YW50aWxlcywgbm90IGZpeGVkIGN1dC1vZmZzKSBzbyBhXG4gKiBicmFuZC1uZXcgbW9kZWwgdGhhdCBsYW5kcyBvdXRzaWRlIHRvZGF5J3Mgc2NvcmUgcmFuZ2Ugc3RpbGwgc2xvdHMgaW5cbiAqIG5leHQgdG8gaXRzIHBlZXJzLiBFbWJlZGRpbmcgZW5kcG9pbnRzIChgdGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiYClcbiAqIGFyZSBidWNrZXRlZCBpbnRvIHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ30gYnkgdGFzaywgaW5kZXBlbmRlbnQgb2ZcbiAqIGFueSBzY29yZS5cbiAqXG4gKiBVbnNjb3JlZC1idXQtcmVjb2duaXphYmxlIGNoYXQgZW5kcG9pbnRzIGFyZSBzdGlsbCBwbGFjZWQgYnkgYSBzbWFsbFxuICogZmFtaWx5IGhldXJpc3RpYyAoe0BsaW5rIGNsYXNzaWZ5QnlGYW1pbHl9KSBzbyBhIHdvcmtzcGFjZSB3aG9zZVxuICogbW9kZWxzIHByZWRhdGUgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmluZyBrZWVwcyB3b3JraW5nLiBUaGVcbiAqIG9mZmxpbmUgZmFsbGJhY2sgZmxvb3IgLSB0aGUgaGFyZC1jb2RlZCBtb2RlbCBsaXN0IHJlYWNoZWQgZm9yIHdoZW5cbiAqIHRoZSBsaXZlIGNhdGFsb2d1ZSBjYW4ndCBiZSByZWFkIGF0IGFsbCAtIGlzIGEgc2VydmVyIGNvbmNlcm4gYW5kXG4gKiBsaXZlcyBpbiBgQGRieC10b29scy9tb2RlbGAsIG5vdCBoZXJlOiBhIGJyb3dzZXIgY2xpZW50IG5ldmVyIHRhbGtzXG4gKiB0byBEYXRhYnJpY2tzIGRpcmVjdGx5LCBzbyBpdCBoYXMgbm90aGluZyB0byBmYWxsIGJhY2sgdG8uXG4gKlxuICogUHVyZSAobm8gTm9kZS1vbmx5IGltcG9ydHMpLCBzbyBhIGNsaWVudCBjYW4gY2xhc3NpZnkgYSBgL21vZGVsc2BcbiAqIHJlc3BvbnNlIHdpdGhvdXQgc2VydmVyIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgTW9kZWxDbGFzcywgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcblxuLyoqIFRhc2sgaGludCBEYXRhYnJpY2tzIHN0YW1wcyBvbiBjaGF0IGNvbXBsZXRpb24gZW5kcG9pbnRzLiAqL1xuY29uc3QgQ0hBVF9UQVNLID0gXCJsbG0vdjEvY2hhdFwiO1xuXG4vKiogVGFzayBoaW50IERhdGFicmlja3Mgc3RhbXBzIG9uIGVtYmVkZGluZyBlbmRwb2ludHMuICovXG5jb25zdCBFTUJFRERJTkdfVEFTSyA9IFwibGxtL3YxL2VtYmVkZGluZ3NcIjtcblxudHlwZSBNb2RlbEZhbWlseSA9IFwiY2xhdWRlXCIgfCBcImdlbWluaVwiIHwgXCJnZW1tYVwiIHwgXCJnbG1cIiB8IFwiZ3B0XCIgfCBcImxsYW1hXCIgfCBcInF3ZW5cIjtcblxuaW50ZXJmYWNlIFBhcnNlZEZhbWlseSB7XG4gIGZhbWlseTogTW9kZWxGYW1pbHk7XG4gIHBhcnRzOiBSZWFkb25seVNldDxzdHJpbmc+O1xufVxuXG5mdW5jdGlvbiBwYXJzZWRGYW1pbHkobmFtZTogc3RyaW5nKTogUGFyc2VkRmFtaWx5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gbmFtZS50b0xvd2VyQ2FzZSgpLm1hdGNoKC9bYS16MC05XSsvZykgPz8gW107XG4gIGNvbnN0IGZhbWlseVRva2VuID0gdG9rZW5zLmZpbmQoKHRva2VuKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRva2VuID09PSBcImNsYXVkZVwiIHx8XG4gICAgICB0b2tlbiA9PT0gXCJnZW1pbmlcIiB8fFxuICAgICAgdG9rZW4gPT09IFwiZ2VtbWFcIiB8fFxuICAgICAgdG9rZW4gPT09IFwiZ2xtXCIgfHxcbiAgICAgIHRva2VuID09PSBcImdwdFwiIHx8XG4gICAgICB0b2tlbiA9PT0gXCJsbGFtYVwiIHx8XG4gICAgICB0b2tlbiA9PT0gXCJxd2VuXCIgfHxcbiAgICAgIC9ecXdlblxcZC8udGVzdCh0b2tlbilcbiAgICApO1xuICB9KTtcbiAgaWYgKCFmYW1pbHlUb2tlbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZmFtaWx5ID0gKGZhbWlseVRva2VuLnN0YXJ0c1dpdGgoXCJxd2VuXCIpID8gXCJxd2VuXCIgOiBmYW1pbHlUb2tlbikgYXMgTW9kZWxGYW1pbHk7XG4gIHJldHVybiB7XG4gICAgZmFtaWx5LFxuICAgIHBhcnRzOiBuZXcgU2V0KHRva2VucyksXG4gIH07XG59XG5cbi8qKiBXaGF0IGFuIGVuZHBvaW50IGNhbiBiZSBhc2tlZCB0byBkbywgYXMgZGVyaXZlZCBieSB7QGxpbmsgZW5kcG9pbnRDYXBhYmlsaXRpZXN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmRwb2ludENhcGFiaWxpdGllcyB7XG4gIC8qKiBPcGVuQUkgY2hhdC9jb21wbGV0aW9ucyArIFJlc3BvbnNlczogdGhlIHN1cmZhY2UgYSBjaGF0IGFnZW50IG5lZWRzLiAqL1xuICBjaGF0OiBib29sZWFuO1xuICAvKiogRW1iZWRkaW5nICh2ZWN0b3IpIGVuZHBvaW50LiAqL1xuICBlbWJlZGRpbmc6IGJvb2xlYW47XG4gIC8qKiBDb21wbGV0ZSBmdW5jdGlvbi10b29sIHJvdW5kLXRyaXAgKGNhbGwgcGx1cyBmdW5jdGlvbl9jYWxsX291dHB1dCByZXBsYXkpLiAqL1xuICB0b29sczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm92aWRlciBmYW1pbGllcyB2ZXJpZmllZCBhZ2FpbnN0IERhdGFicmlja3MgUmVzcG9uc2VzL09wZW4gUmVzcG9uc2VzIHdpdGhcbiAqIGJvdGggYSBmb3JjZWQgZnVuY3Rpb24gY2FsbCBhbmQgYSBzdGF0ZWxlc3MgYGZ1bmN0aW9uX2NhbGxfb3V0cHV0YCByZXBsYXkuXG4gKlxuICogRGF0YWJyaWNrcycgZW5kcG9pbnQgbGlzdC9PcGVuQVBJIGN1cnJlbnRseSBleHBvc2VzIG5vIHRvb2xzIGNhcGFiaWxpdHkgYml0LlxuICogS2VlcCB0aGlzIGNvbnNlcnZhdGl2ZTogYW4gdW5rbm93biBjaGF0IGZhbWlseSBpcyBub3QgYWdlbnQtc2FmZSB1bnRpbCBpdCBpc1xuICogdmVyaWZpZWQuIEdlbWluaSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IGVtaXRzIGEgY2FsbCBidXQgT3BlbiBSZXNwb25zZXNcbiAqIGNhbm5vdCByZXBsYXkgdGhlIHJlcXVpcmVkIHRob3VnaHQgc2lnbmF0dXJlOyBHUFQtT1NTIHJlamVjdHMgUmVzcG9uc2VzXG4gKiBwYXNzdGhyb3VnaCBlbnRpcmVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzVG9vbHNCeUZhbWlseShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VkRmFtaWx5KG5hbWUpO1xuICBpZiAoIXBhcnNlZCB8fCBwYXJzZWQuZmFtaWx5ID09PSBcImdlbWluaVwiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChwYXJzZWQuZmFtaWx5ID09PSBcImdwdFwiICYmIHBhcnNlZC5wYXJ0cy5oYXMoXCJvc3NcIikpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFtcImNsYXVkZVwiLCBcImdwdFwiLCBcInF3ZW5cIiwgXCJnbG1cIiwgXCJsbGFtYVwiXS5pbmNsdWRlcyhwYXJzZWQuZmFtaWx5KTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYW4gZW5kcG9pbnQncyBjYXBhYmlsaXRpZXMgZnJvbSBpdHMgRGF0YWJyaWNrcyB0YXNrIGhpbnQgYW5kIGl0c1xuICogY2xhc3NpZmllZCB7QGxpbmsgTW9kZWxDbGFzc30sIHNvIGNvbnN1bWVycyBmaWx0ZXIgb24gY2FwYWJpbGl0eSBpbnN0ZWFkIG9mXG4gKiByZS1kZXJpdmluZyBpdCBmcm9tIHJhdyBgdGFza2AgLyBgY2xhc3NgIHN0cmluZ3MuXG4gKlxuICogRWl0aGVyIHNpZ25hbCBhbG9uZSBpcyBlbm91Z2g6IHRoZSB0YXNrIGhpbnQgaXMgYXV0aG9yaXRhdGl2ZSB3aGVuIHByZXNlbnQsXG4gKiBhbmQgdGhlIGNsYXNzIGNvdmVycyBlbmRwb2ludHMgRGF0YWJyaWNrcyBsZWZ0IHVudGFza2VkIGJ1dCB0aGUgY2xhc3NpZmllclxuICogcmVjb2duaXplZC4gRW1iZWRkaW5nIHdpbnMgb3ZlciBjaGF0IHdoZW4gYm90aCBwb2ludCBhdCBpdCwgc2luY2UgdGhlIHR3byBhcmVcbiAqIG5vdCBpbnRlcmNoYW5nZWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IEVuZHBvaW50Q2FwYWJpbGl0aWVzIHtcbiAgY29uc3QgZW1iZWRkaW5nID0gZW5kcG9pbnQudGFzayA9PT0gRU1CRURESU5HX1RBU0sgfHwgZW5kcG9pbnQuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nO1xuICAvLyBFdmVyeSBub24tZW1iZWRkaW5nIGNsYXNzIGlzIGEgY2hhdCBiYW5kLCBzbyBcImNsYXNzaWZpZWQgYnV0IG5vdCBlbWJlZGRpbmdcIlxuICAvLyBpcyB0aGUgY2xhc3Mtc2lkZSB0ZXN0IGZvciBjaGF0IGNhcGFiaWxpdHkuXG4gIGNvbnN0IGNoYXQgPSAhZW1iZWRkaW5nICYmIChlbmRwb2ludC50YXNrID09PSBDSEFUX1RBU0sgfHwgZW5kcG9pbnQuY2xhc3MgIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHRvb2xzID0gY2hhdCAmJiAoZW5kcG9pbnQuc3VwcG9ydHNUb29scyA/PyBzdXBwb3J0c1Rvb2xzQnlGYW1pbHkoZW5kcG9pbnQubmFtZSkpO1xuICByZXR1cm4geyBjaGF0LCBlbWJlZGRpbmcsIHRvb2xzIH07XG59XG5cbi8qKiBGYW1pbHktaGV1cmlzdGljIGNsYXNzaWZpY2F0aW9uIG9mIGEgc2luZ2xlIGVuZHBvaW50IG5hbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhbWlseUNsYXNzIHtcbiAgLyoqIENoYXQgY2FwYWJpbGl0eSBiYW5kIHRoZSBmYW1pbHkgbWFwcyB0byAobmV2ZXIgZW1iZWRkaW5nKS4gKi9cbiAgY2xhc3M6IE1vZGVsQ2xhc3M7XG4gIC8qKiBJbnRyYS1mYW1pbHkgb3JkZXJpbmcgaGludCAoaGlnaGVyIGlzIG5ld2VyIC8gbW9yZSBjYXBhYmxlKS4gKi9cbiAgcmFuazogbnVtYmVyO1xufVxuXG4vKipcbiAqIE51bWVyaWMgYFttYWpvciwgbWlub3IsIHBhdGNoXWAgdmVyc2lvbiBwYXJzZWQgZnJvbSBhbiBlbmRwb2ludFxuICogbmFtZSwgdXNlZCB0byBvcmRlciBzaWJsaW5ncyB3aXRoaW4gYSBmYW1pbHkvdGllci4gU3RhcnRzIGF0IHRoZVxuICogZmlyc3QgZGlnaXQgaW4gdGhlIG5hbWUsIHRoZW4gcmVhZHMgc3VjY2Vzc2l2ZSBzZXBhcmF0b3ItZGVsaW1pdGVkLFxuICogZGlnaXQtcHJlZml4ZWQgY2h1bmtzIGFzIHRoZSB0aHJlZSBjb21wb25lbnRzIChtaXNzaW5nIG9uZXMgZGVmYXVsdFxuICogdG8gYDBgKTpcbiAqXG4gKiAgIC0gYGRhdGFicmlja3MtY2xhdWRlLW9wdXMtNC04YCAgIC0+IGBbNCwgOCwgMF1gXG4gKiAgIC0gYGRhdGFicmlja3MtY2xhdWRlLW9wdXMtNC0xMGAgIC0+IGBbNCwgMTAsIDBdYCAoc29ydHMgYWJvdmUgNC04KVxuICogICAtIGBkYXRhYnJpY2tzLW1ldGEtbGxhbWEtMy0zLTcwYmAtPiBgWzMsIDMsIDcwXWBcbiAqICAgLSBgZGF0YWJyaWNrcy1iZ2UtbGFyZ2UtZW5gICAgICAgLT4gYFswLCAwLCAwXWAgKG5vIGRpZ2l0cylcbiAqXG4gKiBDb21wb25lbnQtd2lzZSBjb21wYXJpc29uIChub3QgYSBkZWNpbWFsIGNvbGxhcHNlKSBzbyBgNC4xMGAgYmVhdHNcbiAqIGA0LjhgIC0gdGhlIGJ1ZyBhIGBtYWpvciArIG1pbm9yLzEwYCBzY29yZSB3b3VsZCBoaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJzaW9uVHVwbGUobmFtZTogc3RyaW5nKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3Qgc3RhcnQgPSBuYW1lLnNlYXJjaCgvXFxkLyk7XG4gIGlmIChzdGFydCA8IDApIHJldHVybiBbMCwgMCwgMF07XG4gIGNvbnN0IG51bXMgPSBuYW1lXG4gICAgLnNsaWNlKHN0YXJ0KVxuICAgIC5zcGxpdCgvW15hLXowLTldKy9pKVxuICAgIC5tYXAoKGNodW5rKSA9PiBjaHVuay5tYXRjaCgvXlxcZCsvKT8uWzBdKVxuICAgIC5maWx0ZXIoKGRpZ2l0cyk6IGRpZ2l0cyBpcyBzdHJpbmcgPT4gZGlnaXRzICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcChOdW1iZXIpO1xuICByZXR1cm4gW251bXNbMF0gPz8gMCwgbnVtc1sxXSA/PyAwLCBudW1zWzJdID8/IDBdO1xufVxuXG4vKiogQ29tcGFyZSB0d28gdmVyc2lvbiB0dXBsZXMgc28gdGhlIGhpZ2hlciB2ZXJzaW9uIHNvcnRzIGZpcnN0IChkZXNjZW5kaW5nKS4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9uRGVzYyhhOiByZWFkb25seSBudW1iZXJbXSwgYjogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXIge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIGNvbnN0IGRpZmYgPSAoYltpXSA/PyAwKSAtIChhW2ldID8/IDApO1xuICAgIGlmIChkaWZmICE9PSAwKSByZXR1cm4gZGlmZjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLyoqXG4gKiBNb25vdG9uaWMgdmVyc2lvbiBrZXkgZm9yIG9yZGVyaW5nIHNpYmxpbmdzIHdpdGhpbiBhIGZhbWlseS90aWVyXG4gKiAoZS5nLiBgb3B1cy00LThgIG92ZXIgYG9wdXMtNC03YCkuIEVuY29kZXMgdGhlIHtAbGluayB2ZXJzaW9uVHVwbGV9XG4gKiBhcyBhIHNpbmdsZSBudW1iZXIgc28gY2FsbGVycyB0aGF0IG5lZWQgYSBzY2FsYXIgcmFuayAodGhlIGZhbWlseVxuICogaGV1cmlzdGljLCB0aGUgc3RhdGljIGZhbGxiYWNrIG9yZGVyaW5nKSBrZWVwIHdvcmtpbmc7IHRoZSBlbmNvZGluZ1xuICogcHJlc2VydmVzIGNvbXBvbmVudCBvcmRlciB3aXRob3V0IHRoZSBkZWNpbWFsLWNvbGxhcHNlIGJ1Zy5cbiAqL1xuZnVuY3Rpb24gdmVyc2lvblNjb3JlKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvciwgbWlub3IsIHBhdGNoXSA9IHZlcnNpb25UdXBsZShuYW1lKTtcbiAgcmV0dXJuIG1ham9yICogMV8wMDBfMDAwICsgbWlub3IgKiAxXzAwMCArIHBhdGNoO1xufVxuXG4vKipcbiAqIEJlc3QtZWZmb3J0IGNoYXQgY2FwYWJpbGl0eSBiYW5kIGZvciBhbiBlbmRwb2ludCB3ZSBoYXZlIG5vIGxpdmVcbiAqIHNjb3JlIGZvciwga2V5ZWQgb2ZmIHByb3ZpZGVyIGZhbWlseSBhbmQgdGhlIHdlbGwta25vd24gdmFyaWFudCB3b3Jkc1xuICogaW4gdGhlIG5hbWUgKGBvcHVzYC9gc29ubmV0YC9gaGFpa3VgLCBgcHJvYC9gbWluaWAvYG5hbm9gLFxuICogYGZsYXNoYC9gZmxhc2gtbGl0ZWAsIExsYW1hIHBhcmFtZXRlciBzaXplcywgZXRjKS4gUmV0dXJucyBgbnVsbGAgZm9yXG4gKiBuYW1lcyB3ZSBkb24ndCByZWNvZ25pemUgc28gdW5rbm93biBjdXN0b20gZW5kcG9pbnRzIGFyZSBuZXZlclxuICogYXV0by1zZWxlY3RlZCBhcyBhIGRlZmF1bHQuIFRoZSBhY2NvbXBhbnlpbmcgYHJhbmtgIG9yZGVycyBzaWJsaW5nc1xuICogd2l0aGluIGEgY2xhc3MuIE9ubHkgZXZlciByZXR1cm5zIGEgY2hhdCBiYW5kIC0gZW1iZWRkaW5nIGVuZHBvaW50c1xuICogYXJlIGNsYXNzaWZpZWQgYnkgdGFzaywgbm90IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUJ5RmFtaWx5KG5hbWU6IHN0cmluZyk6IEZhbWlseUNsYXNzIHwgbnVsbCB7XG4gIGNvbnN0IG4gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlZEZhbWlseShuKTtcbiAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICBjb25zdCB7IGZhbWlseSwgcGFydHMgfSA9IHBhcnNlZDtcbiAgY29uc3QgaGFzID0gKHBhcnQ6IHN0cmluZyk6IGJvb2xlYW4gPT4gcGFydHMuaGFzKHBhcnQpO1xuICBjb25zdCBhdCA9IChjbHM6IE1vZGVsQ2xhc3MpOiBGYW1pbHlDbGFzcyA9PiAoeyBjbGFzczogY2xzLCByYW5rOiB2ZXJzaW9uU2NvcmUobikgfSk7XG5cbiAgLy8gQW50aHJvcGljIENsYXVkZVxuICBpZiAoZmFtaWx5ID09PSBcImNsYXVkZVwiICYmIGhhcyhcIm9wdXNcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gIGlmIChmYW1pbHkgPT09IFwiY2xhdWRlXCIgJiYgaGFzKFwic29ubmV0XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICBpZiAoZmFtaWx5ID09PSBcImNsYXVkZVwiICYmIGhhcyhcImhhaWt1XCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG5cbiAgLy8gT3BlbkFJIG9wZW4td2VpZ2h0cyAoY2hlY2sgYmVmb3JlIHRoZSBnZW5lcmljIGdwdCBicmFuY2gpXG4gIGlmIChmYW1pbHkgPT09IFwiZ3B0XCIgJiYgaGFzKFwib3NzXCIpKSB7XG4gICAgcmV0dXJuIGF0KGhhcyhcIjEyMGJcIikgPyBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCA6IE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICB9XG4gIC8vIE9wZW5BSSBHUFQgZmFtaWx5XG4gIGlmIChmYW1pbHkgPT09IFwiZ3B0XCIpIHtcbiAgICBpZiAoaGFzKFwicHJvXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmcpO1xuICAgIGlmIChoYXMoXCJtaW5pXCIpIHx8IGhhcyhcIm5hbm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRGYXN0KTtcbiAgICByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQpO1xuICB9XG5cbiAgLy8gR29vZ2xlIEdlbWluaSAvIEdlbW1hXG4gIGlmIChmYW1pbHkgPT09IFwiZ2VtaW5pXCIpIHtcbiAgICBpZiAoaGFzKFwiZmxhc2hcIikgJiYgaGFzKFwibGl0ZVwiKSkgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEZhc3QpO1xuICAgIGlmIChoYXMoXCJwcm9cIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRUaGlua2luZyk7XG4gICAgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgfVxuICBpZiAoZmFtaWx5ID09PSBcImdlbW1hXCIpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRGYXN0KTtcblxuICAvLyBNZXRhIExsYW1hXG4gIGlmIChmYW1pbHkgPT09IFwibGxhbWFcIikge1xuICAgIGlmIChoYXMoXCJtYXZlcmlja1wiKSB8fCBoYXMoXCI0MDViXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmcpO1xuICAgIGlmIChoYXMoXCI3MGJcIikpIHJldHVybiBhdChNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCk7XG4gICAgaWYgKGhhcyhcIjhiXCIpIHx8IGhhcyhcIjFiXCIpKSByZXR1cm4gYXQoTW9kZWxDbGFzcy5DaGF0RmFzdCk7XG4gICAgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcbiAgfVxuXG4gIC8vIEFsaWJhYmEgUXdlblxuICBpZiAoZmFtaWx5ID09PSBcInF3ZW5cIikgcmV0dXJuIGF0KE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKTtcblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIExpbmVhci1pbnRlcnBvbGF0ZWQgcXVhbnRpbGUgb2YgYW4gYXNjZW5kaW5nLXNvcnRlZCBudW1lcmljIGFycmF5LiAqL1xuZnVuY3Rpb24gcXVhbnRpbGUoc29ydGVkQXNjOiByZWFkb25seSBudW1iZXJbXSwgcDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHNvcnRlZEFzYy5sZW5ndGggPT09IDApIHJldHVybiBOdW1iZXIuTmFOO1xuICBjb25zdCBpZHggPSAoc29ydGVkQXNjLmxlbmd0aCAtIDEpICogcDtcbiAgY29uc3QgbG8gPSBNYXRoLmZsb29yKGlkeCk7XG4gIGNvbnN0IGhpID0gTWF0aC5jZWlsKGlkeCk7XG4gIGlmIChsbyA9PT0gaGkpIHJldHVybiBzb3J0ZWRBc2NbbG9dITtcbiAgcmV0dXJuIHNvcnRlZEFzY1tsb10hICsgKHNvcnRlZEFzY1toaV0hIC0gc29ydGVkQXNjW2xvXSEpICogKGlkeCAtIGxvKTtcbn1cblxuLyoqIEludGVybmFsIHNvcnRhYmxlIHdyYXBwZXIgY2FycnlpbmcgdGhlIG9yZGVyaW5nIGtleXMgZm9yIGEgYnVja2V0IGVudHJ5LiAqL1xuaW50ZXJmYWNlIFJhbmtlZCB7XG4gIGVwOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5O1xuICAvKiogUXVhbGl0eSAoc2NvcmVkKSBvciBmYW1pbHkgdmVyc2lvbiAodW5zY29yZWQpIC0gaGlnaGVyIGZpcnN0LiAqL1xuICBzb3J0OiBudW1iZXI7XG4gIC8qKiBTY29yZWQgZW5kcG9pbnRzIHJhbmsgYWhlYWQgb2YgZmFtaWx5LW9ubHkgZ3Vlc3Nlcy4gKi9cbiAgc2NvcmVkOiBib29sZWFuO1xuICB0aWVDb3N0OiBudW1iZXI7XG4gIHRpZVNwZWVkOiBudW1iZXI7XG4gIC8qKiBQYXJzZWQgbmFtZSB2ZXJzaW9uLCB0aGUgZmluYWwgdGllLWJyZWFrZXIgKG5ld2VyIHNpYmxpbmcgZmlyc3QpLiAqL1xuICB2ZXJzaW9uOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuZnVuY3Rpb24gcmFua09yZGVyKGE6IFJhbmtlZCwgYjogUmFua2VkKTogbnVtYmVyIHtcbiAgaWYgKGEuc2NvcmVkICE9PSBiLnNjb3JlZCkgcmV0dXJuIGEuc2NvcmVkID8gLTEgOiAxO1xuICBpZiAoYi5zb3J0ICE9PSBhLnNvcnQpIHJldHVybiBiLnNvcnQgLSBhLnNvcnQ7XG4gIGlmIChhLnRpZUNvc3QgIT09IGIudGllQ29zdCkgcmV0dXJuIGEudGllQ29zdCAtIGIudGllQ29zdDtcbiAgaWYgKGIudGllU3BlZWQgIT09IGEudGllU3BlZWQpIHJldHVybiBiLnRpZVNwZWVkIC0gYS50aWVTcGVlZDtcbiAgLy8gU2FtZSBzY29yZWQtbmVzcywgcXVhbGl0eSwgY29zdCwgYW5kIHNwZWVkIChlLmcuIHNldmVyYWwgQ2xhdWRlXG4gIC8vIE9wdXMgcG9pbnQgcmVsZWFzZXMpOiBwcmVmZXIgdGhlIG5ld2VyIHBhcnNlZCB2ZXJzaW9uIHNvXG4gIC8vIGBvcHVzLTQtOGAgYmVhdHMgYG9wdXMtNC03YC5cbiAgcmV0dXJuIGNvbXBhcmVWZXJzaW9uRGVzYyhhLnZlcnNpb24sIGIudmVyc2lvbik7XG59XG5cbi8qKlxuICogQnVja2V0IGxpdmUgZW5kcG9pbnRzIGludG8ge0BsaW5rIE1vZGVsQ2xhc3N9ZXMsIHJhbmtlZCBiZXN0LWZpcnN0XG4gKiB3aXRoaW4gZWFjaCBjaGF0IGJhbmQuXG4gKlxuICogRW1iZWRkaW5nIGVuZHBvaW50cyAoYHRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcImApIGdvIGludG9cbiAqIHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ30gYnkgdGFzaywgaW4gbGlzdGluZyBvcmRlciAodGhleSBjYXJyeSBub1xuICogY2FwYWJpbGl0eSBzY29yZSB0byByYW5rIG9uKS5cbiAqXG4gKiBDaGF0IGVuZHBvaW50cyAoYHRhc2sgPT09IFwibGxtL3YxL2NoYXRcImApIHNwbGl0IGludG8gdGhlIHRocmVlIGNoYXRcbiAqIGJhbmRzLiBTY29yZWQgZW5kcG9pbnRzICh0aG9zZSBjYXJyeWluZyBhIGBwcm9maWxlLnF1YWxpdHlgKSBkcml2ZVxuICogdGhlIGJhbmRpbmc6IHRoZSBvYnNlcnZlZCBxdWFsaXR5IGRpc3RyaWJ1dGlvbiBpcyBzcGxpdCBhdCBpdHMgMS8zXG4gKiBhbmQgMi8zIHF1YW50aWxlcywgc28gdGhlIHRvcCB0aGlyZCBpcyB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmd9LFxuICogdGhlIGJvdHRvbSB0aGlyZCB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0RmFzdH0sIGFuZCB0aGUgbWlkZGxlXG4gKiB7QGxpbmsgTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWR9LiBCZWNhdXNlIHRoZSB0aHJlc2hvbGRzIGNvbWUgZnJvbSB0aGVcbiAqIGRhdGEsIHRoZSBzcGxpdCBhZGFwdHMgYXMgRGF0YWJyaWNrcyBhZGRzIG9yIHJlc2NvcmVzIG1vZGVscyAtXG4gKiBub3RoaW5nIGlzIHBpbm5lZCB0byBhIGZpeGVkIHNjb3JlIGJhbmQuXG4gKlxuICogVW5zY29yZWQgY2hhdCBlbmRwb2ludHMgYXJlIHBsYWNlZCBieSB7QGxpbmsgY2xhc3NpZnlCeUZhbWlseX0gYW5kXG4gKiByYW5rZWQgYWZ0ZXIgdGhlIHNjb3JlZCBvbmVzIGluIHRoZWlyIGJhbmQ7IHVucmVjb2duaXplZCwgdW5zY29yZWRcbiAqIGVuZHBvaW50cyAoZS5nLiBjdXN0b20gZXh0ZXJuYWwgbW9kZWxzKSBhcmUgb21pdHRlZCBlbnRpcmVseSBzbyB0aGV5XG4gKiBhcmUgbmV2ZXIgcGlja2VkIGFzIGFuIGF1dG9tYXRpYyBkZWZhdWx0LlxuICpcbiAqIFdpdGhpbiBhIGNoYXQgYmFuZCwgc2NvcmVkIG1vZGVscyBzb3J0IGJ5IGBxdWFsaXR5YCBkZXNjLCB0aGVuIGBjb3N0YFxuICogYXNjLCB0aGVuIGBzcGVlZGAgZGVzYywgdGhlbiBwYXJzZWQgbmFtZSB2ZXJzaW9uIGRlc2M7IGZhbWlseS1vbmx5XG4gKiBtb2RlbHMgc29ydCBieSB2ZXJzaW9uIHJhbmsgdGhlbiBwYXJzZWQgdmVyc2lvbi4gVGhlIHZlcnNpb25cbiAqIHRpZS1icmVhayAoe0BsaW5rIHZlcnNpb25UdXBsZX0pIGlzIHdoYXQgc2VwYXJhdGVzIHBvaW50IHJlbGVhc2VzXG4gKiB0aGF0IHNoYXJlIGEgc2NvcmUgcHJvZmlsZSAoZS5nLiBgb3B1cy00LThgIGFoZWFkIG9mIGBvcHVzLTQtN2ApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlFbmRwb2ludHMoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuKTogUmVjb3JkPE1vZGVsQ2xhc3MsIFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICBjb25zdCBjaGF0ID0gZW5kcG9pbnRzLmZpbHRlcigoZSkgPT4gZS50YXNrID09PSBDSEFUX1RBU0spO1xuICBjb25zdCBxdWFsaXRpZXMgPSBjaGF0XG4gICAgLm1hcCgoZSkgPT4gZS5wcm9maWxlPy5xdWFsaXR5KVxuICAgIC5maWx0ZXIoKHEpOiBxIGlzIG51bWJlciA9PiBOdW1iZXIuaXNGaW5pdGUocSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgY29uc3QgbG93ID0gcXVhbnRpbGUocXVhbGl0aWVzLCAxIC8gMyk7XG4gIGNvbnN0IGhpZ2ggPSBxdWFudGlsZShxdWFsaXRpZXMsIDIgLyAzKTtcblxuICBjb25zdCBidWNrZXRzOiBSZWNvcmQ8TW9kZWxDbGFzcywgUmFua2VkW10+ID0ge1xuICAgIFtNb2RlbENsYXNzLkNoYXRUaGlua2luZ106IFtdLFxuICAgIFtNb2RlbENsYXNzLkNoYXRCYWxhbmNlZF06IFtdLFxuICAgIFtNb2RlbENsYXNzLkNoYXRGYXN0XTogW10sXG4gICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogW10sXG4gIH07XG5cbiAgZm9yIChjb25zdCBlcCBvZiBjaGF0KSB7XG4gICAgY29uc3QgcSA9IGVwLnByb2ZpbGU/LnF1YWxpdHk7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShxKSkge1xuICAgICAgY29uc3QgcXVhbGl0eSA9IHEgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgY2xzID1cbiAgICAgICAgcXVhbGl0eSA+PSBoaWdoXG4gICAgICAgICAgPyBNb2RlbENsYXNzLkNoYXRUaGlua2luZ1xuICAgICAgICAgIDogcXVhbGl0eSA8PSBsb3dcbiAgICAgICAgICAgID8gTW9kZWxDbGFzcy5DaGF0RmFzdFxuICAgICAgICAgICAgOiBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZDtcbiAgICAgIGJ1Y2tldHNbY2xzXS5wdXNoKHtcbiAgICAgICAgZXAsXG4gICAgICAgIHNvcnQ6IHF1YWxpdHksXG4gICAgICAgIHNjb3JlZDogdHJ1ZSxcbiAgICAgICAgdGllQ29zdDogZXAucHJvZmlsZT8uY29zdCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICAgIHRpZVNwZWVkOiBlcC5wcm9maWxlPy5zcGVlZCA/PyAwLFxuICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uVHVwbGUoZXAubmFtZSksXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBmYW1pbHkgPSBjbGFzc2lmeUJ5RmFtaWx5KGVwLm5hbWUpO1xuICAgIGlmICghZmFtaWx5KSBjb250aW51ZTtcbiAgICBidWNrZXRzW2ZhbWlseS5jbGFzc10ucHVzaCh7XG4gICAgICBlcCxcbiAgICAgIHNvcnQ6IGZhbWlseS5yYW5rLFxuICAgICAgc2NvcmVkOiBmYWxzZSxcbiAgICAgIHRpZUNvc3Q6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgIHRpZVNwZWVkOiAwLFxuICAgICAgdmVyc2lvbjogdmVyc2lvblR1cGxlKGVwLm5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gRW1iZWRkaW5ncyBhcmUgYnVja2V0ZWQgYnkgdGFzayBpbiBsaXN0aW5nIG9yZGVyIC0gbm8gc2NvcmUgdG8gcmFuay5cbiAgY29uc3QgZW1iZWRkaW5ncyA9IGVuZHBvaW50cy5maWx0ZXIoKGUpID0+IGUudGFzayA9PT0gRU1CRURESU5HX1RBU0spO1xuXG4gIHJldHVybiB7XG4gICAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTogYnVja2V0c1tNb2RlbENsYXNzLkNoYXRUaGlua2luZ10uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTogYnVja2V0c1tNb2RlbENsYXNzLkNoYXRCYWxhbmNlZF0uc29ydChyYW5rT3JkZXIpLm1hcCgoeCkgPT4geC5lcCksXG4gICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBidWNrZXRzW01vZGVsQ2xhc3MuQ2hhdEZhc3RdLnNvcnQocmFua09yZGVyKS5tYXAoKHgpID0+IHguZXApLFxuICAgIFtNb2RlbENsYXNzLkVtYmVkZGluZ106IGVtYmVkZGluZ3MsXG4gIH07XG59XG4iXX0=
@@ -43,6 +43,22 @@ export declare const ModelProfileSchema: z.ZodObject<{
43
43
  cost: z.ZodOptional<z.ZodNumber>;
44
44
  }, z.core.$strip>;
45
45
  export type ModelProfile = z.infer<typeof ModelProfileSchema>;
46
+ /** Reasoning effort accepted by a Databricks model endpoint. */
47
+ export declare enum ReasoningEffort {
48
+ None = "none",
49
+ Minimal = "minimal",
50
+ Low = "low",
51
+ Medium = "medium",
52
+ High = "high",
53
+ Xhigh = "xhigh",
54
+ Max = "max"
55
+ }
56
+ export declare const ReasoningEffortSchema: z.ZodEnum<typeof ReasoningEffort>;
57
+ /** Lifecycle flags associated with one discovered model. */
58
+ export declare const ModelStatusSchema: z.ZodObject<{
59
+ deprecated: z.ZodDefault<z.ZodBoolean>;
60
+ }, z.core.$strip>;
61
+ export type ModelStatus = z.infer<typeof ModelStatusSchema>;
46
62
  /**
47
63
  * Minimal descriptor for a Databricks Model Serving endpoint - a
48
64
  * stable subset of the SDK type so cache hits and `/models` responses
@@ -61,6 +77,12 @@ export declare const ServingEndpointSummarySchema: z.ZodObject<{
61
77
  cost: z.ZodOptional<z.ZodNumber>;
62
78
  }, z.core.$strip>>;
63
79
  class: z.ZodOptional<z.ZodEnum<typeof ModelClass>>;
80
+ serviceNames: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
81
+ modelServiceName: z.ZodOptional<z.ZodString>;
82
+ reasoningEfforts: z.ZodOptional<z.ZodArray<z.ZodEnum<typeof ReasoningEffort>>>;
83
+ status: z.ZodOptional<z.ZodObject<{
84
+ deprecated: z.ZodDefault<z.ZodBoolean>;
85
+ }, z.core.$strip>>;
64
86
  dimension: z.ZodOptional<z.ZodNumber>;
65
87
  }, z.core.$strip>;
66
88
  export type ServingEndpointSummary = z.infer<typeof ServingEndpointSummarySchema>;
@@ -102,6 +124,12 @@ export declare const RankedModelSchema: z.ZodObject<{
102
124
  cost: z.ZodOptional<z.ZodNumber>;
103
125
  }, z.core.$strip>>;
104
126
  class: z.ZodOptional<z.ZodEnum<typeof ModelClass>>;
127
+ serviceNames: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
128
+ modelServiceName: z.ZodOptional<z.ZodString>;
129
+ reasoningEfforts: z.ZodOptional<z.ZodArray<z.ZodEnum<typeof ReasoningEffort>>>;
130
+ status: z.ZodOptional<z.ZodObject<{
131
+ deprecated: z.ZodDefault<z.ZodBoolean>;
132
+ }, z.core.$strip>>;
105
133
  dimension: z.ZodOptional<z.ZodNumber>;
106
134
  }, z.core.$strip>;
107
135
  modelClass: z.ZodEnum<typeof ModelClass>;
package/lib/src/model.js CHANGED
@@ -53,6 +53,22 @@ export const ModelProfileSchema = z.object({
53
53
  speed: z.number().optional().describe("Relative throughput score; higher is faster."),
54
54
  cost: z.number().optional().describe("Relative price score; lower is cheaper."),
55
55
  });
56
+ /** Reasoning effort accepted by a Databricks model endpoint. */
57
+ export var ReasoningEffort;
58
+ (function (ReasoningEffort) {
59
+ ReasoningEffort["None"] = "none";
60
+ ReasoningEffort["Minimal"] = "minimal";
61
+ ReasoningEffort["Low"] = "low";
62
+ ReasoningEffort["Medium"] = "medium";
63
+ ReasoningEffort["High"] = "high";
64
+ ReasoningEffort["Xhigh"] = "xhigh";
65
+ ReasoningEffort["Max"] = "max";
66
+ })(ReasoningEffort || (ReasoningEffort = {}));
67
+ export const ReasoningEffortSchema = z.enum(ReasoningEffort);
68
+ /** Lifecycle flags associated with one discovered model. */
69
+ export const ModelStatusSchema = z.object({
70
+ deprecated: z.boolean().default(false),
71
+ });
56
72
  /**
57
73
  * Minimal descriptor for a Databricks Model Serving endpoint - a
58
74
  * stable subset of the SDK type so cache hits and `/models` responses
@@ -75,6 +91,19 @@ export const ServingEndpointSummarySchema = z.object({
75
91
  .describe("Whether this endpoint supports a complete function-tool round-trip (call plus function_call_output replay). Derived from verified provider-family policy when Databricks exposes no capability attribute."),
76
92
  profile: ModelProfileSchema.optional().describe("Foundation Model API quality/speed/cost scores when the endpoint is a scored pay-per-token model; absent otherwise."),
77
93
  class: ModelClassSchema.optional().describe("Class the endpoint was classified into; absent when the classifier doesn't recognize it."),
94
+ serviceNames: z
95
+ .record(z.string(), z.string())
96
+ .optional()
97
+ .describe("Provider-specific model service names derived from Databricks metadata."),
98
+ modelServiceName: z
99
+ .string()
100
+ .optional()
101
+ .describe("Preferred first-party model service name for Databricks AI Gateway calls."),
102
+ reasoningEfforts: z
103
+ .array(ReasoningEffortSchema)
104
+ .optional()
105
+ .describe("Reasoning effort levels accepted by the endpoint."),
106
+ status: ModelStatusSchema.optional().describe("Lifecycle status derived from model metadata."),
78
107
  dimension: z
79
108
  .number()
80
109
  .optional()
@@ -128,4 +157,4 @@ export const RankedModelSchema = z.object({
128
157
  .optional()
129
158
  .describe("Fuzzy-match distance (0 = exact .. 1 = worst) when the query carried a search; absent for class-only ranking."),
130
159
  });
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFOLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQiw0Q0FBOEIsQ0FBQTtJQUM5Qiw0Q0FBOEIsQ0FBQTtJQUM5QixvQ0FBc0IsQ0FBQTtJQUN0QixxQ0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFFRCxNQUFNLHNCQUFzQixHQUErQjtJQUN6RCxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFDdkIsZ0ZBQWdGO0lBQ2xGLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUN2QiwrRUFBK0U7SUFDakYsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQ25CLGdHQUFnRztJQUNsRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFDcEIsNkZBQTZGO0NBQ2hHLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FDekQsd0JBQXlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFrQjtLQUNoRSxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUNsQixPQUFPLElBQUksVUFBVSxNQUFNLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0tBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2pCLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pDLE9BQU8sRUFBRSxDQUFDLENB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LCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdpcmUtZm9ybWF0IHR5cGVzIGZvciB0aGUgbW9kZWwgdG9vbGtpdDogdGhlIG1vZGVsIGNsYXNzIHRheG9ub215LFxuICogdGhlIEZvdW5kYXRpb24gTW9kZWwgQVBJIHNjb3JlIHByb2ZpbGUsIHRoZSBtaW5pbWFsIHNlcnZpbmctZW5kcG9pbnRcbiAqIGRlc2NyaXB0b3IsIGFuZCB0aGUgbW9kZWwtbG9va3VwIHJlcXVlc3QgLyByYW5rZWQtcmVzdWx0IGNvbnRyYWN0LlxuICogUHVyZSB0eXBlcyBhbmQgem9kIHNjaGVtYXMgLSBubyBOb2RlLW9ubHkgaW1wb3J0cyAtIHNvIGEgYnJvd3NlclxuICogY2xpZW50IChvciBhbiBhZ2VudCB0b29sJ3MgYGlucHV0U2NoZW1hYCkgY2FuIHZhbGlkYXRlIGEgbG9va3VwXG4gKiByZXF1ZXN0IGFuZCB0eXBlIGEgcmFua2VkIHJlc3BvbnNlIHdpdGhvdXQgZHJhZ2dpbmcgaW4gc2VydmVyXG4gKiBkZXBlbmRlbmNpZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8qKlxuICogQ2xhc3Mgb2YgYSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgLSBpdHMgbW9kYWxpdHkgcGx1cyxcbiAqIGZvciBjaGF0IG1vZGVscywgYSBjYXBhYmlsaXR5IGJhbmQuIENoYXQgZW5kcG9pbnRzIHNwbGl0IGJ5IG1lYXN1cmVkXG4gKiBgcXVhbGl0eWAgaW50byBhIHRocmVlLXJ1bmcgbGFkZGVyOyBlbWJlZGRpbmdzIGFyZSBhIHNlcGFyYXRlXG4gKiBtb2RhbGl0eSwgbm90IGEgcnVuZyBvbiB0aGF0IGxhZGRlci5cbiAqXG4gKiBTdHJpbmcgZW51bSBzbyB0aGUgdmFsdWUgaXMgdGhlIHNsdWcgdXNlZCBpbiBjYWNoZSBrZXlzLCBsb2dzLCBxdWVyeVxuICogc3RyaW5ncywgYW5kIHNlcmlhbGl6ZWQgY29uZmlncyAtIGFuZCBpcyB3aGF0IGEgY2xpZW50IHNlbmRzIHRvXG4gKiByZXF1ZXN0IGEgY2xhc3MuXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsQ2xhc3Mge1xuICBDaGF0VGhpbmtpbmcgPSBcImNoYXQtdGhpbmtpbmdcIixcbiAgQ2hhdEJhbGFuY2VkID0gXCJjaGF0LWJhbGFuY2VkXCIsXG4gIENoYXRGYXN0ID0gXCJjaGF0LWZhc3RcIixcbiAgRW1iZWRkaW5nID0gXCJlbWJlZGRpbmdcIixcbn1cblxuY29uc3QgTW9kZWxDbGFzc0Rlc2NyaXB0aW9uczogUmVjb3JkPE1vZGVsQ2xhc3MsIHN0cmluZz4gPSB7XG4gIFtNb2RlbENsYXNzLkNoYXRUaGlua2luZ106XG4gICAgXCJNb3N0IGNhcGFibGUgcmVhc29uaW5nIGZvciBoYXJkLCBtdWx0aS1zdGVwIHRhc2tzOyBzbG93ZXN0IGFuZCBtb3N0IGV4cGVuc2l2ZS5cIixcbiAgW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTpcbiAgICBcIkdvb2QgZGVmYXVsdCBmb3IgbW9zdCBjaGF0IGFuZCBhZ2VudCB3b3JrOyBiYWxhbmNlcyBxdWFsaXR5LCBzcGVlZCwgYW5kIGNvc3QuXCIsXG4gIFtNb2RlbENsYXNzLkNoYXRGYXN0XTpcbiAgICBcIkZhc3Rlc3QgYW5kIGNoZWFwZXN0OyBiZXN0IGZvciBzaW1wbGUgdGFza3MgbGlrZSBjbGFzc2lmaWNhdGlvbiwgcm91dGluZywgYW5kIHNob3J0IHN1bW1hcmllcy5cIixcbiAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTpcbiAgICBcIlByb2R1Y2VzIHRleHQgZW1iZWRkaW5ncyAodmVjdG9ycyksIG5vdCBjaGF0IHJlcGxpZXM7IG5vdCBpbnRlcmNoYW5nZWFibGUgd2l0aCBjaGF0IG1vZGVscy5cIixcbn07XG5cbmV4cG9ydCBjb25zdCBNb2RlbENsYXNzU2NoZW1hID0gei5lbnVtKE1vZGVsQ2xhc3MpLmRlc2NyaWJlKFxuICBgRW5kcG9pbnQgY2xhc3Mgc2x1ZzogJHsoT2JqZWN0LnZhbHVlcyhNb2RlbENsYXNzKSBhcyBNb2RlbENsYXNzW10pXG4gICAgLm1hcCgobW9kZWxDbGFzcykgPT4ge1xuICAgICAgcmV0dXJuIGAnJHttb2RlbENsYXNzfScgKCR7TW9kZWxDbGFzc0Rlc2NyaXB0aW9uc1ttb2RlbENsYXNzXX0pYDtcbiAgICB9KVxuICAgIC5qb2luKFwiLCBcIil9LmAsXG4pO1xuXG4vKipcbiAqIEZvdW5kYXRpb24gTW9kZWwgQVBJIHF1YWxpdHkgLyBzcGVlZCAvIGNvc3Qgc2NvcmVzIERhdGFicmlja3NcbiAqIHB1Ymxpc2hlcyBwZXIgcGF5LXBlci10b2tlbiBlbmRwb2ludCAodGhlIGJhcnMgc2hvd24gaW4gdGhlIEFJXG4gKiBQbGF5Z3JvdW5kKS4gU3VyZmFjZWQgZnJvbSB0aGUgc2VydmluZyBsaXN0IHVuZGVyXG4gKiBgY29uZmlnLnNlcnZlZF9lbnRpdGllc1tdLmZvdW5kYXRpb25fbW9kZWwuYWlfZ2F0ZXdheV9tb2RlbF9wcm9maWxlYFxuICogc28gdGhlIGNsYXNzIGNsYXNzaWZpZXIgY2FuIHJhbmsgbW9kZWxzIGZyb20gbGl2ZSwgd29ya3NwYWNlLWxvY2FsXG4gKiBudW1iZXJzIGluc3RlYWQgb2YgYSBoYW5kLW1haW50YWluZWQgdGFibGUuIFNjYWxlcyBhcmUgcmVsYXRpdmUgYW5kXG4gKiB1bml0bGVzczsgYWxsIGF4ZXMgYXJlIGFic2VudCBmb3IgY3VzdG9tIG9yIGJyYW5kLW5ldyBlbmRwb2ludHMgdGhhdFxuICogaGF2ZSBubyBwcm9maWxlIHlldC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vZGVsUHJvZmlsZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgcXVhbGl0eTogei5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiUmVsYXRpdmUgcXVhbGl0eSBzY29yZTsgaGlnaGVyIGlzIGJldHRlci5cIiksXG4gIHNwZWVkOiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJSZWxhdGl2ZSB0aHJvdWdocHV0IHNjb3JlOyBoaWdoZXIgaXMgZmFzdGVyLlwiKSxcbiAgY29zdDogei5udW1iZXIoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiUmVsYXRpdmUgcHJpY2Ugc2NvcmU7IGxvd2VyIGlzIGNoZWFwZXIuXCIpLFxufSk7XG5leHBvcnQgdHlwZSBNb2RlbFByb2ZpbGUgPSB6LmluZmVyPHR5cGVvZiBNb2RlbFByb2ZpbGVTY2hlbWE+O1xuXG4vKipcbiAqIE1pbmltYWwgZGVzY3JpcHRvciBmb3IgYSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgLSBhXG4gKiBzdGFibGUgc3Vic2V0IG9mIHRoZSBTREsgdHlwZSBzbyBjYWNoZSBoaXRzIGFuZCBgL21vZGVsc2AgcmVzcG9uc2VzXG4gKiBuZXZlciBleHBvc2UgU0RLIGludGVybmFscy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHpcbiAgICAuc3RyaW5nKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIkVuZHBvaW50IG5hbWUgYXMgbGlzdGVkIGJ5IHRoZSBNb2RlbCBTZXJ2aW5nIFJFU1QgQVBJOyB0aGUgaWQgdXNlZCB0byBpbnZva2UgdGhlIG1vZGVsLlwiLFxuICAgICksXG4gIGRpc3BsYXlOYW1lOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIkh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgZW5kcG9pbnQ6IGEgRGF0YWJyaWNrcy1wcm92aWRlZCBuYW1lIHdoZW4gcHJlc2VudCAoYSBkaXNwbGF5LW5hbWUgdGFnIG9yIGV4dGVybmFsLW1vZGVsIG5hbWUpLCBlbHNlIGEgdGl0bGUtY2FzZWQgcmVuZGVyaW5nIG9mIGBuYW1lYCB3aXRoIHZlbmRvciBwcmVmaXhlcyBzdHJpcHBlZC4gYG5hbWVgIHJlbWFpbnMgdGhlIGludm9rZSBpZC5cIixcbiAgICApLFxuICB0YXNrOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJUYXNrIGhpbnQsIGUuZy4gJ2xsbS92MS9jaGF0JyBvciAnbGxtL3YxL2VtYmVkZGluZ3MnLlwiKSxcbiAgc3RhdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkRlcGxveW1lbnQgc3RhdGUsIGUuZy4gcmVhZHksIHVwZGF0aW5nLCBvciBmYWlsZWQuXCIpLFxuICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRnJlZS1mb3JtIGVuZHBvaW50IGRlc2NyaXB0aW9uOyBpbmZvcm1hdGlvbmFsLlwiKSxcbiAgc3VwcG9ydHNUb29sczogelxuICAgIC5ib29sZWFuKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiV2hldGhlciB0aGlzIGVuZHBvaW50IHN1cHBvcnRzIGEgY29tcGxldGUgZnVuY3Rpb24tdG9vbCByb3VuZC10cmlwIChjYWxsIHBsdXMgZnVuY3Rpb25fY2FsbF9vdXRwdXQgcmVwbGF5KS4gRGVyaXZlZCBmcm9tIHZlcmlmaWVkIHByb3ZpZGVyLWZhbWlseSBwb2xpY3kgd2hlbiBEYXRhYnJpY2tzIGV4cG9zZXMgbm8gY2FwYWJpbGl0eSBhdHRyaWJ1dGUuXCIsXG4gICAgKSxcbiAgcHJvZmlsZTogTW9kZWxQcm9maWxlU2NoZW1hLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgXCJGb3VuZGF0aW9uIE1vZGVsIEFQSSBxdWFsaXR5L3NwZWVkL2Nvc3Qgc2NvcmVzIHdoZW4gdGhlIGVuZHBvaW50IGlzIGEgc2NvcmVkIHBheS1wZXItdG9rZW4gbW9kZWw7IGFic2VudCBvdGhlcndpc2UuXCIsXG4gICksXG4gIGNsYXNzOiBNb2RlbENsYXNzU2NoZW1hLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgXCJDbGFzcyB0aGUgZW5kcG9pbnQgd2FzIGNsYXNzaWZpZWQgaW50bzsgYWJzZW50IHdoZW4gdGhlIGNsYXNzaWZpZXIgZG9lc24ndCByZWNvZ25pemUgaXQuXCIsXG4gICksXG4gIGRpbWVuc2lvbjogelxuICAgIC5udW1iZXIoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJFbWJlZGRpbmcgdmVjdG9yIGxlbmd0aCwgbWVhc3VyZWQgYnkgYSBiZXN0LWVmZm9ydCBzZXJ2ZXItc2lkZSBwaW5nLiBPbmx5IHNldCBmb3IgZW1iZWRkaW5nIGVuZHBvaW50cywgYW5kIG9ubHkgd2hlbiB0aGUgcHJvYmUgc3VjY2VlZGVkLlwiLFxuICAgICksXG59KTtcbmV4cG9ydCB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPSB6LmluZmVyPHR5cGVvZiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5U2NoZW1hPjtcblxuLyoqXG4gKiBBIG1vZGVsLWxvb2t1cCByZXF1ZXN0OiBzZWFyY2ggc3RyaW5nLCBjYXBhYmlsaXR5IGNlaWxpbmcsIGJvdGgsIG9yXG4gKiBub3RoaW5nLiBUaGlzIGlzIHRoZSBjYWxsZXItZmFjaW5nIHF1ZXJ5IHRoZSBgQGRieC10b29scy9tb2RlbGBcbiAqIHJhbmtlciByZWFkcyAtIHNoYXBlZCBhcyBhIHpvZCBzY2hlbWEgKHdpdGggcGVyLWZpZWxkIGRlc2NyaXB0aW9ucylcbiAqIHNvIGFuIGFnZW50IHRvb2wgY2FuIGFkb3B0IGl0IGRpcmVjdGx5IGFzIGl0cyBgaW5wdXRTY2hlbWFgIGFuZCBhXG4gKiBicm93c2VyIGNsaWVudCBjYW4gdmFsaWRhdGUgYXJncyBiZWZvcmUgY2FsbGluZyB0aGUgbW9kZWwgc2VydmljZS5cbiAqXG4gKiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbDogYW4gZW1wdHkgcXVlcnkgcmFua3MgdGhlIGxpdmUgY2F0YWxvZ3VlIGJ5XG4gKiBjbGFzcyBhbG9uZS4gVGhlIFwidGhpcyBjbGFzcyBhbmQgYmVsb3dcIiBjZWlsaW5nIHNlbWFudGljcyBhbmQgdGhlXG4gKiBtYXRjaC10aGVuLWNsYXNzIG9yZGVyaW5nIGxpdmUgaW4gdGhlIHNlcnZpY2UsIG5vdCBoZXJlIC0gdGhpc1xuICogc3VyZmFjZSBpcyBkZWNsYXJhdGl2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1vZGVsUXVlcnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNlYXJjaDogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJMb29zZSBuYW1lIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCBlbmRwb2ludCBuYW1lcywgZS5nLiAnY2xhdWRlIHNvbm5ldCcuIE9taXQgdG8gcmFuayBieSBjbGFzcyBhbG9uZS5cIixcbiAgICApLFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzU2NoZW1hLm9wdGlvbmFsKCkuZGVzY3JpYmUoXG4gICAgXCJDYXBhYmlsaXR5IGNlaWxpbmc6IGEgY2hhdCBjbGFzcyByZXN0cmljdHMgdG8gdGhhdCBiYW5kIGFuZCB0aGUgbGVzcy1jYXBhYmxlIGNoYXQgYmFuZHMgYmVsb3cgaXQ7ICdlbWJlZGRpbmcnIHJlc3RyaWN0cyB0byBlbWJlZGRpbmcgZW5kcG9pbnRzLiBPbWl0IHRvIGNvbnNpZGVyIGV2ZXJ5IGNoYXQgYmFuZC5cIixcbiAgKSxcbiAgcmVxdWlyZXNUb29sczogelxuICAgIC5ib29sZWFuKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiV2hlbiB0cnVlLCBjb25zaWRlciBvbmx5IGVuZHBvaW50cyB0aGF0IHN1cHBvcnQgYSBjb21wbGV0ZSBmdW5jdGlvbi10b29sIHJvdW5kLXRyaXAuXCIsXG4gICAgKSxcbiAgbGltaXQ6IHpcbiAgICAubnVtYmVyKClcbiAgICAuaW50KClcbiAgICAucG9zaXRpdmUoKVxuICAgIC5tYXgoNTApXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJNYXhpbXVtIG51bWJlciBvZiByYW5rZWQgcmVzdWx0cyB0byByZXR1cm4uXCIpLFxuICB0aHJlc2hvbGQ6IHpcbiAgICAubnVtYmVyKClcbiAgICAubWluKDApXG4gICAgLm1heCgxKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiRnV6enktbWF0Y2ggZGlzdGFuY2UgY3V0b2ZmICgwID0gZXhhY3QsIDEgPSBtYXRjaCBhbnl0aGluZykuIERlZmF1bHQgMC40LlwiKSxcbn0pO1xuZXhwb3J0IHR5cGUgTW9kZWxRdWVyeSA9IHouaW5mZXI8dHlwZW9mIE1vZGVsUXVlcnlTY2hlbWE+O1xuXG4vKipcbiAqIE9uZSByYW5rZWQgbG9va3VwIHJlc3VsdC4gQmFja3MgYW4gYWdlbnQgdG9vbCdzIGBvdXRwdXRTY2hlbWFgIGFuZCBhXG4gKiBgL21vZGVsc2AgcmFua2VkIHJlc3BvbnNlLlxuICovXG5leHBvcnQgY29uc3QgUmFua2VkTW9kZWxTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5U2NoZW1hLmRlc2NyaWJlKFwiVGhlIG1hdGNoZWQgc2VydmluZyBlbmRwb2ludC5cIiksXG4gIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3NTY2hlbWEuZGVzY3JpYmUoXCJDbGFzcyB0aGUgZW5kcG9pbnQgd2FzIGNsYXNzaWZpZWQgaW50by5cIiksXG4gIHNjb3JlOiB6XG4gICAgLm51bWJlcigpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIkZ1enp5LW1hdGNoIGRpc3RhbmNlICgwID0gZXhhY3QgLi4gMSA9IHdvcnN0KSB3aGVuIHRoZSBxdWVyeSBjYXJyaWVkIGEgc2VhcmNoOyBhYnNlbnQgZm9yIGNsYXNzLW9ubHkgcmFua2luZy5cIixcbiAgICApLFxufSk7XG5leHBvcnQgdHlwZSBSYW5rZWRNb2RlbCA9IHouaW5mZXI8dHlwZW9mIFJhbmtlZE1vZGVsU2NoZW1hPjtcbiJdfQ==
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFOLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQiw0Q0FBOEIsQ0FBQTtJQUM5Qiw0Q0FBOEIsQ0FBQTtJQUM5QixvQ0FBc0IsQ0FBQTtJQUN0QixxQ0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFFRCxNQUFNLHNCQUFzQixHQUErQjtJQUN6RCxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFDdkIsZ0ZBQWdGO0lBQ2xGLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUN2QiwrRUFBK0U7SUFDakYsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQ25CLGdHQUFnRztJQUNsRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFDcEIsNkZBQTZGO0NBQ2hHLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FDekQsd0JBQXlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFrQjtLQUNoRSxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtJQUNsQixPQUFPLElBQUksVUFBVSxNQUFNLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0tBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2pCLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pDLE9BQU8sRUFBRSxDQUFDLENB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Z0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxDQUFDO1NBQ04sTUFBTSxFQUFFO1NBQ1IsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUNQLHFHQUFxRyxDQUN0RztJQUNILFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQzlDLG1MQUFtTCxDQUNwTDtJQUNELGFBQWEsRUFBRSxDQUFDO1NBQ2IsT0FBTyxFQUFFO1NBQ1QsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUNQLHNGQUFzRixDQUN2RjtJQUNILEtBQUssRUFBRSxDQUFDO1NBQ0wsTUFBTSxFQUFFO1NBQ1IsR0FBRyxFQUFFO1NBQ0wsUUFBUSxFQUFFO1NBQ1YsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNQLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyw2Q0FBNkMsQ0FBQztJQUMxRCxTQUFTLEVBQUUsQ0FBQztTQUNULE1BQU0sRUFBRTtTQUNSLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDTixHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ04sUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUFDLDJFQUEyRSxDQUFDO0NBQ3pGLENBQUMsQ0FBQztBQUdIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDeEMsUUFBUSxFQUFFLDRCQUE0QixDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQztJQUNoRixVQUFVLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLHlDQUF5QyxDQUFDO0lBQ2hGLEtBQUssRUFBRSxDQUFDO1NBQ0wsTUFBTSxFQUFFO1NBQ1IsUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUNQLCtHQUErRyxDQUNoSDtDQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2lyZS1mb3JtYXQgdHlwZXMgZm9yIHRoZSBtb2RlbCB0b29sa2l0OiB0aGUgbW9kZWwgY2xhc3MgdGF4b25vbXksXG4gKiB0aGUgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmUgcHJvZmlsZSwgdGhlIG1pbmltYWwgc2VydmluZy1lbmRwb2ludFxuICogZGVzY3JpcHRvciwgYW5kIHRoZSBtb2RlbC1sb29rdXAgcmVxdWVzdCAvIHJhbmtlZC1yZXN1bHQgY29udHJhY3QuXG4gKiBQdXJlIHR5cGVzIGFuZCB6b2Qgc2NoZW1hcyAtIG5vIE5vZGUtb25seSBpbXBvcnRzIC0gc28gYSBicm93c2VyXG4gKiBjbGllbnQgKG9yIGFuIGFnZW50IHRvb2wncyBgaW5wdXRTY2hlbWFgKSBjYW4gdmFsaWRhdGUgYSBsb29rdXBcbiAqIHJlcXVlc3QgYW5kIHR5cGUgYSByYW5rZWQgcmVzcG9uc2Ugd2l0aG91dCBkcmFnZ2luZyBpbiBzZXJ2ZXJcbiAqIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLyoqXG4gKiBDbGFzcyBvZiBhIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBlbmRwb2ludCAtIGl0cyBtb2RhbGl0eSBwbHVzLFxuICogZm9yIGNoYXQgbW9kZWxzLCBhIGNhcGFiaWxpdHkgYmFuZC4gQ2hhdCBlbmRwb2ludHMgc3BsaXQgYnkgbWVhc3VyZWRcbiAqIGBxdWFsaXR5YCBpbnRvIGEgdGhyZWUtcnVuZyBsYWRkZXI7IGVtYmVkZGluZ3MgYXJlIGEgc2VwYXJhdGVcbiAqIG1vZGFsaXR5LCBub3QgYSBydW5nIG9uIHRoYXQgbGFkZGVyLlxuICpcbiAqIFN0cmluZyBlbnVtIHNvIHRoZSB2YWx1ZSBpcyB0aGUgc2x1ZyB1c2VkIGluIGNhY2hlIGtleXMsIGxvZ3MsIHF1ZXJ5XG4gKiBzdHJpbmdzLCBhbmQgc2VyaWFsaXplZCBjb25maWdzIC0gYW5kIGlzIHdoYXQgYSBjbGllbnQgc2VuZHMgdG9cbiAqIHJlcXVlc3QgYSBjbGFzcy5cbiAqL1xuZXhwb3J0IGVudW0gTW9kZWxDbGFzcyB7XG4gIENoYXRUaGlua2luZyA9IFwiY2hhdC10aGlua2luZ1wiLFxuICBDaGF0QmFsYW5jZWQgPSBcImNoYXQtYmFsYW5jZWRcIixcbiAgQ2hhdEZhc3QgPSBcImNoYXQtZmFzdFwiLFxuICBFbWJlZGRpbmcgPSBcImVtYmVkZGluZ1wiLFxufVxuXG5jb25zdCBNb2RlbENsYXNzRGVzY3JpcHRpb25zOiBSZWNvcmQ8TW9kZWxDbGFzcywgc3RyaW5nPiA9IHtcbiAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTpcbiAgICBcIk1vc3QgY2FwYWJsZSByZWFzb25pbmcgZm9yIGhhcmQsIG11bHRpLXN0ZXAgdGFza3M7IHNsb3dlc3QgYW5kIG1vc3QgZXhwZW5zaXZlLlwiLFxuICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOlxuICAgIFwiR29vZCBkZWZhdWx0IGZvciBtb3N0IGNoYXQgYW5kIGFnZW50IHdvcms7IGJhbGFuY2VzIHF1YWxpdHksIHNwZWVkLCBhbmQgY29zdC5cIixcbiAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOlxuICAgIFwiRmFzdGVzdCBhbmQgY2hlYXBlc3Q7IGJlc3QgZm9yIHNpbXBsZSB0YXNrcyBsaWtlIGNsYXNzaWZpY2F0aW9uLCByb3V0aW5nLCBhbmQgc2hvcnQgc3VtbWFyaWVzLlwiLFxuICBbTW9kZWxDbGFzcy5FbWJlZGRpbmddOlxuICAgIFwiUHJvZHVjZXMgdGV4dCBlbWJlZGRpbmdzICh2ZWN0b3JzKSwgbm90IGNoYXQgcmVwbGllczsgbm90IGludGVyY2hhbmdlYWJsZSB3aXRoIGNoYXQgbW9kZWxzLlwiLFxufTtcblxuZXhwb3J0IGNvbnN0IE1vZGVsQ2xhc3NTY2hlbWEgPSB6LmVudW0oTW9kZWxDbGFzcykuZGVzY3JpYmUoXG4gIGBFbmRwb2ludCBjbGFzcyBzbHVnOiAkeyhPYmplY3QudmFsdWVzKE1vZGVsQ2xhc3MpIGFzIE1vZGVsQ2xhc3NbXSlcbiAgICAubWFwKChtb2RlbENsYXNzKSA9PiB7XG4gICAgICByZXR1cm4gYCcke21vZGVsQ2xhc3N9JyAoJHtNb2RlbENsYXNzRGVzY3JpcHRpb25zW21vZGVsQ2xhc3NdfSlgO1xuICAgIH0pXG4gICAgLmpvaW4oXCIsIFwiKX0uYCxcbik7XG5cbi8qKlxuICogRm91bmRhdGlvbiBNb2RlbCBBUEkgcXVhbGl0eSAvIHNwZWVkIC8gY29zdCBzY29yZXMgRGF0YWJyaWNrc1xuICogcHVibGlzaGVzIHBlciBwYXktcGVyLXRva2VuIGVuZHBvaW50ICh0aGUgYmFycyBzaG93biBpbiB0aGUgQUlcbiAqIFBsYXlncm91bmQpLiBTdXJmYWNlZCBmcm9tIHRoZSBzZXJ2aW5nIGxpc3QgdW5kZXJcbiAqIGBjb25maWcuc2VydmVkX2VudGl0aWVzW10uZm91bmRhdGlvbl9tb2RlbC5haV9nYXRld2F5X21vZGVsX3Byb2ZpbGVgXG4gKiBzbyB0aGUgY2xhc3MgY2xhc3NpZmllciBjYW4gcmFuayBtb2RlbHMgZnJvbSBsaXZlLCB3b3Jrc3BhY2UtbG9jYWxcbiAqIG51bWJlcnMgaW5zdGVhZCBvZiBhIGhhbmQtbWFpbnRhaW5lZCB0YWJsZS4gU2NhbGVzIGFyZSByZWxhdGl2ZSBhbmRcbiAqIHVuaXRsZXNzOyBhbGwgYXhlcyBhcmUgYWJzZW50IGZvciBjdXN0b20gb3IgYnJhbmQtbmV3IGVuZHBvaW50cyB0aGF0XG4gKiBoYXZlIG5vIHByb2ZpbGUgeWV0LlxuICovXG5leHBvcnQgY29uc3QgTW9kZWxQcm9maWxlU2NoZW1hID0gei5vYmplY3Qoe1xuICBxdWFsaXR5OiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJSZWxhdGl2ZSBxdWFsaXR5IHNjb3JlOyBoaWdoZXIgaXMgYmV0dGVyLlwiKSxcbiAgc3BlZWQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlJlbGF0aXZlIHRocm91Z2hwdXQgc2NvcmU7IGhpZ2hlciBpcyBmYXN0ZXIuXCIpLFxuICBjb3N0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJSZWxhdGl2ZSBwcmljZSBzY29yZTsgbG93ZXIgaXMgY2hlYXBlci5cIiksXG59KTtcbmV4cG9ydCB0eXBlIE1vZGVsUHJvZmlsZSA9IHouaW5mZXI8dHlwZW9mIE1vZGVsUHJvZmlsZVNjaGVtYT47XG5cbi8qKiBSZWFzb25pbmcgZWZmb3J0IGFjY2VwdGVkIGJ5IGEgRGF0YWJyaWNrcyBtb2RlbCBlbmRwb2ludC4gKi9cbmV4cG9ydCBlbnVtIFJlYXNvbmluZ0VmZm9ydCB7XG4gIE5vbmUgPSBcIm5vbmVcIixcbiAgTWluaW1hbCA9IFwibWluaW1hbFwiLFxuICBMb3cgPSBcImxvd1wiLFxuICBNZWRpdW0gPSBcIm1lZGl1bVwiLFxuICBIaWdoID0gXCJoaWdoXCIsXG4gIFhoaWdoID0gXCJ4aGlnaFwiLFxuICBNYXggPSBcIm1heFwiLFxufVxuXG5leHBvcnQgY29uc3QgUmVhc29uaW5nRWZmb3J0U2NoZW1hID0gei5lbnVtKFJlYXNvbmluZ0VmZm9ydCk7XG5cbi8qKiBMaWZlY3ljbGUgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIG9uZSBkaXNjb3ZlcmVkIG1vZGVsLiAqL1xuZXhwb3J0IGNvbnN0IE1vZGVsU3RhdHVzU2NoZW1hID0gei5vYmplY3Qoe1xuICBkZXByZWNhdGVkOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbn0pO1xuZXhwb3J0IHR5cGUgTW9kZWxTdGF0dXMgPSB6LmluZmVyPHR5cGVvZiBNb2RlbFN0YXR1c1NjaGVtYT47XG5cbi8qKlxuICogTWluaW1hbCBkZXNjcmlwdG9yIGZvciBhIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBlbmRwb2ludCAtIGFcbiAqIHN0YWJsZSBzdWJzZXQgb2YgdGhlIFNESyB0eXBlIHNvIGNhY2hlIGhpdHMgYW5kIGAvbW9kZWxzYCByZXNwb25zZXNcbiAqIG5ldmVyIGV4cG9zZSBTREsgaW50ZXJuYWxzLlxuICovXG5leHBvcnQgY29uc3QgU2VydmluZ0VuZHBvaW50U3VtbWFyeVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiRW5kcG9pbnQgbmFtZSBhcyBsaXN0ZWQgYnkgdGhlIE1vZGVsIFNlcnZpbmcgUkVTVCBBUEk7IHRoZSBpZCB1c2VkIHRvIGludm9rZSB0aGUgbW9kZWwuXCIsXG4gICAgKSxcbiAgZGlzcGxheU5hbWU6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiSHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBlbmRwb2ludDogYSBEYXRhYnJpY2tzLXByb3ZpZGVkIG5hbWUgd2hlbiBwcmVzZW50IChhIGRpc3BsYXktbmFtZSB0YWcgb3IgZXh0ZXJuYWwtbW9kZWwgbmFtZSksIGVsc2UgYSB0aXRsZS1jYXNlZCByZW5kZXJpbmcgb2YgYG5hbWVgIHdpdGggdmVuZG9yIHByZWZpeGVzIHN0cmlwcGVkLiBgbmFtZWAgcmVtYWlucyB0aGUgaW52b2tlIGlkLlwiLFxuICAgICksXG4gIHRhc2s6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlRhc2sgaGludCwgZS5nLiAnbGxtL3YxL2NoYXQnIG9yICdsbG0vdjEvZW1iZWRkaW5ncycuXCIpLFxuICBzdGF0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRGVwbG95bWVudCBzdGF0ZSwgZS5nLiByZWFkeSwgdXBkYXRpbmcsIG9yIGZhaWxlZC5cIiksXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJGcmVlLWZvcm0gZW5kcG9pbnQgZGVzY3JpcHRpb247IGluZm9ybWF0aW9uYWwuXCIpLFxuICBzdXBwb3J0c1Rvb2xzOiB6XG4gICAgLmJvb2xlYW4oKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJXaGV0aGVyIHRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYSBjb21wbGV0ZSBmdW5jdGlvbi10b29sIHJvdW5kLXRyaXAgKGNhbGwgcGx1cyBmdW5jdGlvbl9jYWxsX291dHB1dCByZXBsYXkpLiBEZXJpdmVkIGZyb20gdmVyaWZpZWQgcHJvdmlkZXItZmFtaWx5IHBvbGljeSB3aGVuIERhdGFicmlja3MgZXhwb3NlcyBubyBjYXBhYmlsaXR5IGF0dHJpYnV0ZS5cIixcbiAgICApLFxuICBwcm9maWxlOiBNb2RlbFByb2ZpbGVTY2hlbWEub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICBcIkZvdW5kYXRpb24gTW9kZWwgQVBJIHF1YWxpdHkvc3BlZWQvY29zdCBzY29yZXMgd2hlbiB0aGUgZW5kcG9pbnQgaXMgYSBzY29yZWQgcGF5LXBlci10b2tlbiBtb2RlbDsgYWJzZW50IG90aGVyd2lzZS5cIixcbiAgKSxcbiAgY2xhc3M6IE1vZGVsQ2xhc3NTY2hlbWEub3B0aW9uYWwoKS5kZXNjcmliZShcbiAgICBcIkNsYXNzIHRoZSBlbmRwb2ludCB3YXMgY2xhc3NpZmllZCBpbnRvOyBhYnNlbnQgd2hlbiB0aGUgY2xhc3NpZmllciBkb2Vzbid0IHJlY29nbml6ZSBpdC5cIixcbiAgKSxcbiAgc2VydmljZU5hbWVzOiB6XG4gICAgLnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiUHJvdmlkZXItc3BlY2lmaWMgbW9kZWwgc2VydmljZSBuYW1lcyBkZXJpdmVkIGZyb20gRGF0YWJyaWNrcyBtZXRhZGF0YS5cIiksXG4gIG1vZGVsU2VydmljZU5hbWU6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIlByZWZlcnJlZCBmaXJzdC1wYXJ0eSBtb2RlbCBzZXJ2aWNlIG5hbWUgZm9yIERhdGFicmlja3MgQUkgR2F0ZXdheSBjYWxscy5cIiksXG4gIHJlYXNvbmluZ0VmZm9ydHM6IHpcbiAgICAuYXJyYXkoUmVhc29uaW5nRWZmb3J0U2NoZW1hKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiUmVhc29uaW5nIGVmZm9ydCBsZXZlbHMgYWNjZXB0ZWQgYnkgdGhlIGVuZHBvaW50LlwiKSxcbiAgc3RhdHVzOiBNb2RlbFN0YXR1c1NjaGVtYS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiTGlmZWN5Y2xlIHN0YXR1cyBkZXJpdmVkIGZyb20gbW9kZWwgbWV0YWRhdGEuXCIpLFxuICBkaW1lbnNpb246IHpcbiAgICAubnVtYmVyKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiRW1iZWRkaW5nIHZlY3RvciBsZW5ndGgsIG1lYXN1cmVkIGJ5IGEgYmVzdC1lZmZvcnQgc2VydmVyLXNpZGUgcGluZy4gT25seSBzZXQgZm9yIGVtYmVkZGluZyBlbmRwb2ludHMsIGFuZCBvbmx5IHdoZW4gdGhlIHByb2JlIHN1Y2NlZWRlZC5cIixcbiAgICApLFxufSk7XG5leHBvcnQgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0gei5pbmZlcjx0eXBlb2YgU2VydmluZ0VuZHBvaW50U3VtbWFyeVNjaGVtYT47XG5cbi8qKlxuICogQSBtb2RlbC1sb29rdXAgcmVxdWVzdDogc2VhcmNoIHN0cmluZywgY2FwYWJpbGl0eSBjZWlsaW5nLCBib3RoLCBvclxuICogbm90aGluZy4gVGhpcyBpcyB0aGUgY2FsbGVyLWZhY2luZyBxdWVyeSB0aGUgYEBkYngtdG9vbHMvbW9kZWxgXG4gKiByYW5rZXIgcmVhZHMgLSBzaGFwZWQgYXMgYSB6b2Qgc2NoZW1hICh3aXRoIHBlci1maWVsZCBkZXNjcmlwdGlvbnMpXG4gKiBzbyBhbiBhZ2VudCB0b29sIGNhbiBhZG9wdCBpdCBkaXJlY3RseSBhcyBpdHMgYGlucHV0U2NoZW1hYCBhbmQgYVxuICogYnJvd3NlciBjbGllbnQgY2FuIHZhbGlkYXRlIGFyZ3MgYmVmb3JlIGNhbGxpbmcgdGhlIG1vZGVsIHNlcnZpY2UuXG4gKlxuICogRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw6IGFuIGVtcHR5IHF1ZXJ5IHJhbmtzIHRoZSBsaXZlIGNhdGFsb2d1ZSBieVxuICogY2xhc3MgYWxvbmUuIFRoZSBcInRoaXMgY2xhc3MgYW5kIGJlbG93XCIgY2VpbGluZyBzZW1hbnRpY3MgYW5kIHRoZVxuICogbWF0Y2gtdGhlbi1jbGFzcyBvcmRlcmluZyBsaXZlIGluIHRoZSBzZXJ2aWNlLCBub3QgaGVyZSAtIHRoaXNcbiAqIHN1cmZhY2UgaXMgZGVjbGFyYXRpdmUuXG4gKi9cbmV4cG9ydCBjb25zdCBNb2RlbFF1ZXJ5U2NoZW1hID0gei5vYmplY3Qoe1xuICBzZWFyY2g6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiTG9vc2UgbmFtZSBmdXp6eS1tYXRjaGVkIGFnYWluc3QgZW5kcG9pbnQgbmFtZXMsIGUuZy4gJ2NsYXVkZSBzb25uZXQnLiBPbWl0IHRvIHJhbmsgYnkgY2xhc3MgYWxvbmUuXCIsXG4gICAgKSxcbiAgbW9kZWxDbGFzczogTW9kZWxDbGFzc1NjaGVtYS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgIFwiQ2FwYWJpbGl0eSBjZWlsaW5nOiBhIGNoYXQgY2xhc3MgcmVzdHJpY3RzIHRvIHRoYXQgYmFuZCBhbmQgdGhlIGxlc3MtY2FwYWJsZSBjaGF0IGJhbmRzIGJlbG93IGl0OyAnZW1iZWRkaW5nJyByZXN0cmljdHMgdG8gZW1iZWRkaW5nIGVuZHBvaW50cy4gT21pdCB0byBjb25zaWRlciBldmVyeSBjaGF0IGJhbmQuXCIsXG4gICksXG4gIHJlcXVpcmVzVG9vbHM6IHpcbiAgICAuYm9vbGVhbigpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIldoZW4gdHJ1ZSwgY29uc2lkZXIgb25seSBlbmRwb2ludHMgdGhhdCBzdXBwb3J0IGEgY29tcGxldGUgZnVuY3Rpb24tdG9vbCByb3VuZC10cmlwLlwiLFxuICAgICksXG4gIGxpbWl0OiB6XG4gICAgLm51bWJlcigpXG4gICAgLmludCgpXG4gICAgLnBvc2l0aXZlKClcbiAgICAubWF4KDUwKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFwiTWF4aW11bSBudW1iZXIgb2YgcmFua2VkIHJlc3VsdHMgdG8gcmV0dXJuLlwiKSxcbiAgdGhyZXNob2xkOiB6XG4gICAgLm51bWJlcigpXG4gICAgLm1pbigwKVxuICAgIC5tYXgoMSlcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIkZ1enp5LW1hdGNoIGRpc3RhbmNlIGN1dG9mZiAoMCA9IGV4YWN0LCAxID0gbWF0Y2ggYW55dGhpbmcpLiBEZWZhdWx0IDAuNC5cIiksXG59KTtcbmV4cG9ydCB0eXBlIE1vZGVsUXVlcnkgPSB6LmluZmVyPHR5cGVvZiBNb2RlbFF1ZXJ5U2NoZW1hPjtcblxuLyoqXG4gKiBPbmUgcmFua2VkIGxvb2t1cCByZXN1bHQuIEJhY2tzIGFuIGFnZW50IHRvb2wncyBgb3V0cHV0U2NoZW1hYCBhbmQgYVxuICogYC9tb2RlbHNgIHJhbmtlZCByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJhbmtlZE1vZGVsU2NoZW1hID0gei5vYmplY3Qoe1xuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeVNjaGVtYS5kZXNjcmliZShcIlRoZSBtYXRjaGVkIHNlcnZpbmcgZW5kcG9pbnQuXCIpLFxuICBtb2RlbENsYXNzOiBNb2RlbENsYXNzU2NoZW1hLmRlc2NyaWJlKFwiQ2xhc3MgdGhlIGVuZHBvaW50IHdhcyBjbGFzc2lmaWVkIGludG8uXCIpLFxuICBzY29yZTogelxuICAgIC5udW1iZXIoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJGdXp6eS1tYXRjaCBkaXN0YW5jZSAoMCA9IGV4YWN0IC4uIDEgPSB3b3JzdCkgd2hlbiB0aGUgcXVlcnkgY2FycmllZCBhIHNlYXJjaDsgYWJzZW50IGZvciBjbGFzcy1vbmx5IHJhbmtpbmcuXCIsXG4gICAgKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmFua2VkTW9kZWwgPSB6LmluZmVyPHR5cGVvZiBSYW5rZWRNb2RlbFNjaGVtYT47XG4iXX0=
package/package.json CHANGED
@@ -18,13 +18,12 @@
18
18
  "projen": "projen"
19
19
  },
20
20
  "devDependencies": {
21
- "@dbx-tools/test-polyglot": "0.6.186",
22
21
  "@types/bun": "1.3.14",
23
22
  "@types/node": "^24.6.0",
24
23
  "typescript": "^5.9.3"
25
24
  },
26
25
  "dependencies": {
27
- "@dbx-tools/shared-core": "0.6.186",
26
+ "@dbx-tools/shared-core": "0.6.191",
28
27
  "zod": "4.3.6"
29
28
  },
30
29
  "main": "./lib/index.js",
@@ -41,7 +40,7 @@
41
40
  "./package.json": "./package.json"
42
41
  }
43
42
  },
44
- "version": "0.6.186",
43
+ "version": "0.6.191",
45
44
  "types": "./lib/index.d.ts",
46
45
  "type": "module",
47
46
  "exports": {
package/src/classify.ts CHANGED
@@ -34,6 +34,35 @@ const CHAT_TASK = "llm/v1/chat";
34
34
  /** Task hint Databricks stamps on embedding endpoints. */
35
35
  const EMBEDDING_TASK = "llm/v1/embeddings";
36
36
 
37
+ type ModelFamily = "claude" | "gemini" | "gemma" | "glm" | "gpt" | "llama" | "qwen";
38
+
39
+ interface ParsedFamily {
40
+ family: ModelFamily;
41
+ parts: ReadonlySet<string>;
42
+ }
43
+
44
+ function parsedFamily(name: string): ParsedFamily | undefined {
45
+ const tokens = name.toLowerCase().match(/[a-z0-9]+/g) ?? [];
46
+ const familyToken = tokens.find((token) => {
47
+ return (
48
+ token === "claude" ||
49
+ token === "gemini" ||
50
+ token === "gemma" ||
51
+ token === "glm" ||
52
+ token === "gpt" ||
53
+ token === "llama" ||
54
+ token === "qwen" ||
55
+ /^qwen\d/.test(token)
56
+ );
57
+ });
58
+ if (!familyToken) return undefined;
59
+ const family = (familyToken.startsWith("qwen") ? "qwen" : familyToken) as ModelFamily;
60
+ return {
61
+ family,
62
+ parts: new Set(tokens),
63
+ };
64
+ }
65
+
37
66
  /** What an endpoint can be asked to do, as derived by {@link endpointCapabilities}. */
38
67
  export interface EndpointCapabilities {
39
68
  /** OpenAI chat/completions + Responses: the surface a chat agent needs. */
@@ -55,15 +84,10 @@ export interface EndpointCapabilities {
55
84
  * passthrough entirely.
56
85
  */
57
86
  export function supportsToolsByFamily(name: string): boolean {
58
- const n = name.toLowerCase();
59
- if (n.includes("gemini") || n.includes("gpt-oss")) return false;
60
- return (
61
- n.includes("claude") ||
62
- n.includes("gpt") ||
63
- n.includes("qwen") ||
64
- n.includes("glm") ||
65
- n.includes("llama")
66
- );
87
+ const parsed = parsedFamily(name);
88
+ if (!parsed || parsed.family === "gemini") return false;
89
+ if (parsed.family === "gpt" && parsed.parts.has("oss")) return false;
90
+ return ["claude", "gpt", "qwen", "glm", "llama"].includes(parsed.family);
67
91
  }
68
92
 
69
93
  /**
@@ -153,42 +177,46 @@ function versionScore(name: string): number {
153
177
  */
154
178
  export function classifyByFamily(name: string): FamilyClass | null {
155
179
  const n = name.toLowerCase();
180
+ const parsed = parsedFamily(n);
181
+ if (!parsed) return null;
182
+ const { family, parts } = parsed;
183
+ const has = (part: string): boolean => parts.has(part);
156
184
  const at = (cls: ModelClass): FamilyClass => ({ class: cls, rank: versionScore(n) });
157
185
 
158
186
  // Anthropic Claude
159
- if (n.includes("opus")) return at(ModelClass.ChatThinking);
160
- if (n.includes("sonnet")) return at(ModelClass.ChatBalanced);
161
- if (n.includes("haiku")) return at(ModelClass.ChatFast);
187
+ if (family === "claude" && has("opus")) return at(ModelClass.ChatThinking);
188
+ if (family === "claude" && has("sonnet")) return at(ModelClass.ChatBalanced);
189
+ if (family === "claude" && has("haiku")) return at(ModelClass.ChatFast);
162
190
 
163
191
  // OpenAI open-weights (check before the generic gpt branch)
164
- if (n.includes("gpt-oss")) {
165
- return at(n.includes("120b") ? ModelClass.ChatBalanced : ModelClass.ChatFast);
192
+ if (family === "gpt" && has("oss")) {
193
+ return at(has("120b") ? ModelClass.ChatBalanced : ModelClass.ChatFast);
166
194
  }
167
195
  // OpenAI GPT family
168
- if (n.includes("gpt")) {
169
- if (n.includes("pro")) return at(ModelClass.ChatThinking);
170
- if (n.includes("mini") || n.includes("nano")) return at(ModelClass.ChatFast);
196
+ if (family === "gpt") {
197
+ if (has("pro")) return at(ModelClass.ChatThinking);
198
+ if (has("mini") || has("nano")) return at(ModelClass.ChatFast);
171
199
  return at(ModelClass.ChatBalanced);
172
200
  }
173
201
 
174
202
  // Google Gemini / Gemma
175
- if (n.includes("gemini")) {
176
- if (n.includes("flash-lite")) return at(ModelClass.ChatFast);
177
- if (n.includes("pro")) return at(ModelClass.ChatThinking);
203
+ if (family === "gemini") {
204
+ if (has("flash") && has("lite")) return at(ModelClass.ChatFast);
205
+ if (has("pro")) return at(ModelClass.ChatThinking);
178
206
  return at(ModelClass.ChatBalanced);
179
207
  }
180
- if (n.includes("gemma")) return at(ModelClass.ChatFast);
208
+ if (family === "gemma") return at(ModelClass.ChatFast);
181
209
 
182
210
  // Meta Llama
183
- if (n.includes("llama")) {
184
- if (n.includes("maverick") || n.includes("405b")) return at(ModelClass.ChatThinking);
185
- if (n.includes("70b")) return at(ModelClass.ChatBalanced);
186
- if (n.includes("8b") || n.includes("1b")) return at(ModelClass.ChatFast);
211
+ if (family === "llama") {
212
+ if (has("maverick") || has("405b")) return at(ModelClass.ChatThinking);
213
+ if (has("70b")) return at(ModelClass.ChatBalanced);
214
+ if (has("8b") || has("1b")) return at(ModelClass.ChatFast);
187
215
  return at(ModelClass.ChatBalanced);
188
216
  }
189
217
 
190
218
  // Alibaba Qwen
191
- if (n.includes("qwen")) return at(ModelClass.ChatBalanced);
219
+ if (family === "qwen") return at(ModelClass.ChatBalanced);
192
220
 
193
221
  return null;
194
222
  }
package/src/model.ts CHANGED
@@ -65,6 +65,25 @@ export const ModelProfileSchema = z.object({
65
65
  });
66
66
  export type ModelProfile = z.infer<typeof ModelProfileSchema>;
67
67
 
68
+ /** Reasoning effort accepted by a Databricks model endpoint. */
69
+ export enum ReasoningEffort {
70
+ None = "none",
71
+ Minimal = "minimal",
72
+ Low = "low",
73
+ Medium = "medium",
74
+ High = "high",
75
+ Xhigh = "xhigh",
76
+ Max = "max",
77
+ }
78
+
79
+ export const ReasoningEffortSchema = z.enum(ReasoningEffort);
80
+
81
+ /** Lifecycle flags associated with one discovered model. */
82
+ export const ModelStatusSchema = z.object({
83
+ deprecated: z.boolean().default(false),
84
+ });
85
+ export type ModelStatus = z.infer<typeof ModelStatusSchema>;
86
+
68
87
  /**
69
88
  * Minimal descriptor for a Databricks Model Serving endpoint - a
70
89
  * stable subset of the SDK type so cache hits and `/models` responses
@@ -97,6 +116,19 @@ export const ServingEndpointSummarySchema = z.object({
97
116
  class: ModelClassSchema.optional().describe(
98
117
  "Class the endpoint was classified into; absent when the classifier doesn't recognize it.",
99
118
  ),
119
+ serviceNames: z
120
+ .record(z.string(), z.string())
121
+ .optional()
122
+ .describe("Provider-specific model service names derived from Databricks metadata."),
123
+ modelServiceName: z
124
+ .string()
125
+ .optional()
126
+ .describe("Preferred first-party model service name for Databricks AI Gateway calls."),
127
+ reasoningEfforts: z
128
+ .array(ReasoningEffortSchema)
129
+ .optional()
130
+ .describe("Reasoning effort levels accepted by the endpoint."),
131
+ status: ModelStatusSchema.optional().describe("Lifecycle status derived from model metadata."),
100
132
  dimension: z
101
133
  .number()
102
134
  .optional()