@dbx-tools/model 0.9.43 → 0.9.46
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 +19 -2
- package/index.ts +1 -2
- package/lib/index.d.ts +1 -2
- package/lib/index.js +2 -2
- package/lib/package.json +1 -1
- package/lib/src/_ranking.js +30 -5
- package/lib/src/bindings.d.ts +4 -36
- package/lib/src/bindings.js +5 -37
- package/package.json +6 -6
- package/src/_ranking.ts +28 -4
- package/src/bindings.ts +4 -70
package/README.md
CHANGED
|
@@ -132,6 +132,23 @@ class ceiling logic as `selectModel()`. Classification, fuzzy scoring,
|
|
|
132
132
|
family-version order, and variant preference are implemented directly in this
|
|
133
133
|
package and require no native binding.
|
|
134
134
|
|
|
135
|
+
Filter before ranking when a caller needs a specific runtime shape. For example,
|
|
136
|
+
select the best 1,024-dimensional embedding endpoint:
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
const [embedding] = await resolve.searchModels(client, host, {
|
|
140
|
+
modelClass: "embedding",
|
|
141
|
+
dimension: 1024,
|
|
142
|
+
limit: 1,
|
|
143
|
+
});
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Search filters compose: use `name` for an exact endpoint, `search` for fuzzy
|
|
147
|
+
name and label matching, `modelClass` for class-aware ranking, `task` for an
|
|
148
|
+
exact serving task, `dimension` or `minDimension`/`maxDimension` for embedding
|
|
149
|
+
shape, `reasoningEffort` for supported reasoning levels, and `requiresTools`
|
|
150
|
+
for complete tool-call support.
|
|
151
|
+
|
|
135
152
|
## Work With A Held Catalogue
|
|
136
153
|
|
|
137
154
|
When you already have endpoint summaries, use the pure resolver functions from
|
|
@@ -226,8 +243,8 @@ a property of the model (see `isResponsesOnly()` and `responsesUpstreamUrl()`),
|
|
|
226
243
|
so a hard-coded string in one package silently diverges when that routing
|
|
227
244
|
changes. `isResponsesOnly()` covers Codex and GPT 5.4+ endpoints, which reject
|
|
228
245
|
tool-bearing Chat Completions, while keeping GPT-OSS on its supported Chat path.
|
|
229
|
-
The TypeScript helper owns this policy
|
|
230
|
-
|
|
246
|
+
The TypeScript helper owns this policy so every Node consumer shares one version
|
|
247
|
+
threshold without loading a native library.
|
|
231
248
|
|
|
232
249
|
## Read Published Model Metadata
|
|
233
250
|
|
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
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/model";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.46";
|
|
7
7
|
export * as bindings from "./src/bindings.ts";
|
|
8
8
|
export * as classes from "./src/classes.ts";
|
|
9
9
|
export * as classify from "./src/classify.ts";
|
|
@@ -17,7 +17,6 @@ export * as policy from "./src/policy.ts";
|
|
|
17
17
|
export * as reasoningTranslation from "./src/reasoning-translation.ts";
|
|
18
18
|
export * as resolve from "./src/resolve.ts";
|
|
19
19
|
export * as servingWire from "./src/serving-wire.ts";
|
|
20
|
-
export type { ResolveModelRouteOptions, ResolvedModelRoute } from "./src/bindings.ts";
|
|
21
20
|
export { CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./src/classes.ts";
|
|
22
21
|
export { FALLBACK_MODEL_IDS } from "./src/fallback.ts";
|
|
23
22
|
export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH, AI_GATEWAY_CODEX_RESPONSES_PATH, ANTHROPIC_MESSAGES_PATH } from "./src/invoke.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/model";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.46";
|
|
3
3
|
export * as bindings from "./src/bindings.ts";
|
|
4
4
|
export * as classes from "./src/classes.ts";
|
|
5
5
|
export * as classify from "./src/classify.ts";
|
|
@@ -13,7 +13,6 @@ export * as policy from "./src/policy.ts";
|
|
|
13
13
|
export * as reasoningTranslation from "./src/reasoning-translation.ts";
|
|
14
14
|
export * as resolve from "./src/resolve.ts";
|
|
15
15
|
export * as servingWire from "./src/serving-wire.ts";
|
|
16
|
-
export type { ResolveModelRouteOptions, ResolvedModelRoute } from "./src/bindings.ts";
|
|
17
16
|
export { CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./src/classes.ts";
|
|
18
17
|
export { FALLBACK_MODEL_IDS } from "./src/fallback.ts";
|
|
19
18
|
export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH, AI_GATEWAY_CODEX_RESPONSES_PATH, ANTHROPIC_MESSAGES_PATH } from "./src/invoke.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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/model";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.46";
|
|
6
6
|
export * as bindings from "./src/bindings.js";
|
|
7
7
|
export * as classes from "./src/classes.js";
|
|
8
8
|
export * as classify from "./src/classify.js";
|
|
@@ -24,4 +24,4 @@ export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model
|
|
|
24
24
|
export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.js";
|
|
25
25
|
export { REASONING_LEVELS } from "./src/reasoning-translation.js";
|
|
26
26
|
export * from "./exports.js";
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLCtCQUErQixFQUFFLHVCQUF1QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0ssT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLDJCQUEyQixFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEwsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0YsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFJbEUsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNDZcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NpZnkgZnJvbSBcIi4vc3JjL2NsYXNzaWZ5LnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtZXRhZGF0YSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhQ2FjaGUgZnJvbSBcIi4vc3JjL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2xpZW50IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdUcmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nV2lyZSBmcm9tIFwiLi9zcmMvc2VydmluZy13aXJlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCwgQUlfR0FURVdBWV9DT0RFWF9SRVNQT05TRVNfUEFUSCwgQU5USFJPUElDX01FU1NBR0VTX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUywgTU9ERUxfUkFURV9MSU1JVFNfVVJMLCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLCBSRVRJUkVEX01PREVMU19VUkwsIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlUmVjb3JkLCBNZXRhZGF0YUNhY2hlT3B0aW9ucywgTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQsIE1ldGFkYXRhQ2FjaGUgfSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsQXV0aE9wdGlvbnMsIE1vZGVsQ2xpZW50T3B0aW9ucywgTW9kZWxDbGllbnRTdGF0dXMsIE1vZGVsUHJvdG9jb2wsIE1vZGVsUm91dGVJbnB1dCwgTW9kZWxSb3V0ZSwgTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBSRUFTT05JTkdfTEVWRUxTIH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZWFzb25pbmdMZXZlbCwgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsIEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWxlY3RNb2RlbElucHV0LCBTZWFyY2hNb2RlbHNJbnB1dCB9IGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZpbmdDaGF0TWVzc2FnZSwgUmV3cml0dGVuU2VydmluZ1JlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy13aXJlLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
|
package/lib/package.json
CHANGED
package/lib/src/_ranking.js
CHANGED
|
@@ -9,8 +9,9 @@ const ModelClass = ModelClassValues;
|
|
|
9
9
|
const DEFAULT_FUZZY_THRESHOLD = 0.4;
|
|
10
10
|
/** Rank endpoint records through the TypeScript-owned model policy. */
|
|
11
11
|
export function rankEndpoints(endpoints, query = {}, options = {}) {
|
|
12
|
-
const
|
|
13
|
-
const
|
|
12
|
+
const filtered = endpoints.filter((endpoint) => matchesModelQuery(endpoint, query));
|
|
13
|
+
const originalByName = new Map(filtered.map((endpoint) => [endpoint.name, endpoint]));
|
|
14
|
+
const normalized = filtered.map((endpoint) => ({
|
|
14
15
|
...endpoint,
|
|
15
16
|
...(options.modelClass ? { class: options.modelClass } : {}),
|
|
16
17
|
...(options.task ? { task: options.task } : {}),
|
|
@@ -25,13 +26,14 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
|
|
|
25
26
|
}
|
|
26
27
|
: classifyEndpoints(normalized);
|
|
27
28
|
const requestedClass = options.modelClass ?? query.modelClass;
|
|
29
|
+
const includeDeprecated = query.includeDeprecated ?? options.includeDeprecated ?? false;
|
|
28
30
|
const eligible = requestedClass ? classesAtOrBelow(requestedClass) : CHAT_CLASS_ORDER;
|
|
29
31
|
const candidates = [];
|
|
30
32
|
const search = query.search?.trim();
|
|
31
33
|
if (search && requestedClass === undefined) {
|
|
32
34
|
const classByName = classifyEndpointClasses(normalized);
|
|
33
35
|
for (const endpoint of normalized) {
|
|
34
|
-
if (!
|
|
36
|
+
if (!includeDeprecated && endpoint.status?.deprecated)
|
|
35
37
|
continue;
|
|
36
38
|
const capabilities = endpointCapabilities(endpoint);
|
|
37
39
|
if (!capabilities.chat || (query.requiresTools && !capabilities.tools))
|
|
@@ -45,7 +47,7 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
|
|
|
45
47
|
else {
|
|
46
48
|
for (const modelClass of eligible) {
|
|
47
49
|
for (const endpoint of classified[modelClass]) {
|
|
48
|
-
if (!
|
|
50
|
+
if (!includeDeprecated && endpoint.status?.deprecated)
|
|
49
51
|
continue;
|
|
50
52
|
if (query.requiresTools && !endpointCapabilities(endpoint).tools)
|
|
51
53
|
continue;
|
|
@@ -103,6 +105,29 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
|
|
|
103
105
|
}));
|
|
104
106
|
return query.limit === undefined ? restored : restored.slice(0, Math.max(0, query.limit));
|
|
105
107
|
}
|
|
108
|
+
function matchesModelQuery(endpoint, query) {
|
|
109
|
+
if (query.name !== undefined && endpoint.name !== query.name)
|
|
110
|
+
return false;
|
|
111
|
+
if (query.task !== undefined && endpoint.task !== query.task)
|
|
112
|
+
return false;
|
|
113
|
+
if (query.reasoningEffort !== undefined &&
|
|
114
|
+
!endpoint.reasoningEfforts?.includes(query.reasoningEffort)) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
if (query.dimension !== undefined ||
|
|
118
|
+
query.minDimension !== undefined ||
|
|
119
|
+
query.maxDimension !== undefined) {
|
|
120
|
+
if (endpoint.dimension === undefined)
|
|
121
|
+
return false;
|
|
122
|
+
if (query.dimension !== undefined && endpoint.dimension !== query.dimension)
|
|
123
|
+
return false;
|
|
124
|
+
if (query.minDimension !== undefined && endpoint.dimension < query.minDimension)
|
|
125
|
+
return false;
|
|
126
|
+
if (query.maxDimension !== undefined && endpoint.dimension > query.maxDimension)
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
106
131
|
/** Classify chat and embedding endpoints through the TypeScript-owned policy. */
|
|
107
132
|
export function classifyEndpointClasses(endpoints) {
|
|
108
133
|
const classified = classifyEndpoints(endpoints);
|
|
@@ -250,4 +275,4 @@ function finiteNumber(value) {
|
|
|
250
275
|
function booleanValue(value) {
|
|
251
276
|
return typeof value === "boolean" ? value : undefined;
|
|
252
277
|
}
|
|
253
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JhbmtpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3JhbmtpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsSUFBSSxnQkFBZ0IsR0FLL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLElBQUksTUFBTSxTQUFTLENBQUM7QUFFM0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHcEYsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7QUFFcEMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFPcEMsdUVBQXVFO0FBQ3ZFLE1BQU0sVUFBVSxhQUFhLENBQzNCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUUsRUFDdEIsVUFBZ0MsRUFBRTtJQUVsQyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUMsR0FBRyxRQUFRO1FBQ1gsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxD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LEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ2hFLENBQUMsQ0FBRSxLQUFpQztRQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1QsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWM7SUFDaEMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMzQyxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYztJQUNqQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsT0FBTyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzlCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFjO0lBQ2xDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFjO0lBQ2xDLE9BQU8sT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVmFsdWVzLFxuICB0eXBlIE1vZGVsQ2xhc3MgYXMgTW9kZWxDbGFzc1R5cGUsXG4gIHR5cGUgTW9kZWxRdWVyeSxcbiAgdHlwZSBSYW5rZWRNb2RlbCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5pbXBvcnQgeyB0b01vZGVsRGlzcGxheU5hbWUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvZGlzcGxheVwiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgbW9kZWxTdGF0dXNGb3IgfSBmcm9tIFwiLi9fcmV0aXJlbWVudC50c1wiO1xuaW1wb3J0IHsgY2xhc3Nlc0F0T3JCZWxvdywgQ0hBVF9DTEFTU19PUkRFUiwgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9jbGFzc2VzLnRzXCI7XG5pbXBvcnQge1xuICBjbGFzc2lmeUVuZHBvaW50cyxcbiAgZW5kcG9pbnRDYXBhYmlsaXRpZXMsXG4gIHN1cHBvcnRzVG9vbHNCeUZhbWlseSxcbiAgdmVyc2lvblR1cGxlLFxufSBmcm9tIFwiLi9jbGFzc2lmeS50c1wiO1xuaW1wb3J0IHsgbW9kZWxGYW1pbHksIG1vZGVsUmVhc29uaW5nRWZmb3J0cywgbW9kZWxTZXJ2aWNlTmFtZXMgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gTW9kZWxDbGFzc1R5cGU7XG5jb25zdCBNb2RlbENsYXNzID0gTW9kZWxDbGFzc1ZhbHVlcztcblxuY29uc3QgREVGQVVMVF9GVVpaWV9USFJFU0hPTEQgPSAwLjQ7XG5pbnRlcmZhY2UgTmF0aXZlUmFua2luZ09wdGlvbnMge1xuICByZWFkb25seSBpbmNsdWRlRGVwcmVjYXRlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzO1xuICByZWFkb25seSB0YXNrPzogc3RyaW5nO1xufVxuXG4vKiogUmFuayBlbmRwb2ludCByZWNvcmRzIHRocm91Z2ggdGhlIFR5cGVTY3JpcHQtb3duZWQgbW9kZWwgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmtFbmRwb2ludHMoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBxdWVyeTogTW9kZWxRdWVyeSA9IHt9LFxuICBvcHRpb25zOiBOYXRpdmVSYW5raW5nT3B0aW9ucyA9IHt9LFxuKTogUmFua2VkTW9kZWxbXSB7XG4gIGNvbnN0IG9yaWdpbmFsQnlOYW1lID0gbmV3IE1hcChlbmRwb2ludHMubWFwKChlbmRwb2ludCkgPT4gW2VuZHBvaW50Lm5hbWUsIGVuZHBvaW50XSkpO1xuICBjb25zdCBub3JtYWxpemVkID0gZW5kcG9pbnRzLm1hcCgoZW5kcG9pbnQpID0+ICh7XG4gICAgLi4uZW5kcG9pbnQsXG4gICAgLi4uKG9wdGlvbnMubW9kZWxDbGFzcyA/IHsgY2xhc3M6IG9wdGlvbnMubW9kZWxDbGFzcyB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnRhc2sgPyB7IHRhc2s6IG9wdGlvbnMudGFzayB9IDoge30pLFxuICB9KSk7XG4gIGNvbnN0IGNsYXNzaWZpZWQgPSBvcHRpb25zLm1vZGVsQ2xhc3NcbiAgICA/IHtcbiAgICAgICAgW01vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nXTogW10sXG4gICAgICAgIFtNb2RlbENsYXNzLkNoYXRCYWxhbmNlZF06IFtdLFxuICAgICAgICBbTW9kZWxDbGFzcy5DaGF0RmFzdF06IFtdLFxuICAgICAgICBbTW9kZWxDbGFzcy5FbWJlZGRpbmddOiBbXSxcbiAgICAgICAgW29wdGlvbnMubW9kZWxDbGFzc106IG5vcm1hbGl6ZWQsXG4gICAgICB9XG4gICAgOiBjbGFzc2lmeUVuZHBvaW50cyhub3JtYWxpemVkKTtcbiAgY29uc3QgcmVxdWVzdGVkQ2xhc3MgPSBvcHRpb25zLm1vZGVsQ2xhc3MgPz8gcXVlcnkubW9kZWxDbGFzcztcbiAgY29uc3QgZWxpZ2libGUgPSByZXF1ZXN0ZWRDbGFzcyA/IGNsYXNzZXNBdE9yQmVsb3cocmVxdWVzdGVkQ2xhc3MpIDogQ0hBVF9DTEFTU19PUkRFUjtcbiAgY29uc3QgY2FuZGlkYXRlczogUmFua2VkTW9kZWxbXSA9IFtdO1xuICBjb25zdCBzZWFyY2ggPSBxdWVyeS5zZWFyY2g/LnRyaW0oKTtcbiAgaWYgKHNlYXJjaCAmJiByZXF1ZXN0ZWRDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xhc3NCeU5hbWUgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3Nlcyhub3JtYWxpemVkKTtcbiAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIG5vcm1hbGl6ZWQpIHtcbiAgICAgIGlmICghb3B0aW9ucy5pbmNsdWRlRGVwcmVjYXRlZCAmJiBlbmRwb2ludC5zdGF0dXM/LmRlcHJlY2F0ZWQpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpO1xuICAgICAgaWYgKCFjYXBhYmlsaXRpZXMuY2hhdCB8fCAocXVlcnkucmVxdWlyZXNUb29scyAmJiAhY2FwYWJpbGl0aWVzLnRvb2xzKSkgY29udGludWU7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgbW9kZWxDbGFzczogY2xhc3NCeU5hbWUuZ2V0KGVuZHBvaW50Lm5hbWUpID8/IE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBlbGlnaWJsZSkge1xuICAgICAgZm9yIChjb25zdCBlbmRwb2ludCBvZiBjbGFzc2lmaWVkW21vZGVsQ2xhc3NdKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5pbmNsdWRlRGVwcmVjYXRlZCAmJiBlbmRwb2ludC5zdGF0dXM/LmRlcHJlY2F0ZWQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocXVlcnkucmVxdWlyZXNUb29scyAmJiAhZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKSBjb250aW51ZTtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHsgZW5kcG9pbnQsIG1vZGVsQ2xhc3MgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IHJhbmtlZCA9IGNhbmRpZGF0ZXM7XG4gIGlmIChzZWFyY2gpIHtcbiAgICBjb25zdCBleGFjdCA9IGNhbmRpZGF0ZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuZW5kcG9pbnQubmFtZSA9PT0gc2VhcmNoKTtcbiAgICBpZiAoZXhhY3QpIHtcbiAgICAgIHJhbmtlZCA9IFt7IC4uLmV4YWN0LCBzY29yZTogMCB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGhyZXNob2xkID0gcXVlcnkudGhyZXNob2xkID8/IERFRkFVTFRfRlVaWllfVEhSRVNIT0xEO1xuICAgICAgY29uc3Qgc2VhcmNoVG9rZW5zID0gdG9rZW5pemUoc2VhcmNoKTtcbiAgICAgIGNvbnN0IHRva2VuTWF0Y2hlcyA9IGNhbmRpZGF0ZXNcbiAgICAgICAgLmZpbHRlcigoY2FuZGlkYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2FuZGlkYXRlVG9rZW5zID0gbmV3IFNldChzZWFyY2hhYmxlVmFsdWVzKGNhbmRpZGF0ZS5lbmRwb2ludCkuZmxhdE1hcCh0b2tlbml6ZSkpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzZWFyY2hUb2tlbnMubGVuZ3RoID4gMCAmJiBzZWFyY2hUb2tlbnMuZXZlcnkoKHRva2VuKSA9PiBjYW5kaWRhdGVUb2tlbnMuaGFzKHRva2VuKSlcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChjYW5kaWRhdGUpID0+ICh7IC4uLmNhbmRpZGF0ZSwgc2NvcmU6IDAgfSkpO1xuICAgICAgaWYgKHRva2VuTWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJhbmtlZCA9IHRva2VuTWF0Y2hlcy5zb3J0KGNvbXBhcmVSYW5rZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZnVzZSA9IG5ldyBGdXNlKGNhbmRpZGF0ZXMsIHtcbiAgICAgICAgICBrZXlzOiBbXG4gICAgICAgICAgICBcImVuZHBvaW50Lm5hbWVcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnQuZGlzcGxheU5hbWVcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnQuZmFtaWx5XCIsXG4gICAgICAgICAgICBcImVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWVcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnQuc2VydmljZU5hbWVzXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0aHJlc2hvbGQsXG4gICAgICAgICAgaWdub3JlTG9jYXRpb246IHRydWUsXG4gICAgICAgICAgaW5jbHVkZVNjb3JlOiB0cnVlLFxuICAgICAgICAgIHVzZUV4dGVuZGVkU2VhcmNoOiB0cnVlLFxuICAgICAgICAgIGlzQ2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gdG9rZW5pemUoc2VhcmNoKS5qb2luKFwiIFwiKTtcbiAgICAgICAgcmFua2VkID0gbm9ybWFsaXplZFNlYXJjaFxuICAgICAgICAgID8gZnVzZVxuICAgICAgICAgICAgICAuc2VhcmNoKG5vcm1hbGl6ZWRTZWFyY2gpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHJlc3VsdCkgPT4gKHJlc3VsdC5zY29yZSA/PyAwKSA8PSB0aHJlc2hvbGQpXG4gICAgICAgICAgICAgIC5tYXAoKHJlc3VsdCkgPT4gKHsgLi4ucmVzdWx0Lml0ZW0sIHNjb3JlOiByZXN1bHQuc2NvcmUgPz8gMCB9KSlcbiAgICAgICAgICAgICAgLnNvcnQoY29tcGFyZVJhbmtlZClcbiAgICAgICAgICA6IFtdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCByZXN0b3JlZCA9IHJhbmtlZC5tYXAoKHJlc3VsdCkgPT4gKHtcbiAgICAuLi5yZXN1bHQsXG4gICAgZW5kcG9pbnQ6IG9yaWdpbmFsQnlOYW1lLmdldChyZXN1bHQuZW5kcG9pbnQubmFtZSkgPz8gcmVzdWx0LmVuZHBvaW50LFxuICB9KSk7XG4gIHJldHVybiBxdWVyeS5saW1pdCA9PT0gdW5kZWZpbmVkID8gcmVzdG9yZWQgOiByZXN0b3JlZC5zbGljZSgwLCBNYXRoLm1heCgwLCBxdWVyeS5saW1pdCkpO1xufVxuXG4vKiogQ2xhc3NpZnkgY2hhdCBhbmQgZW1iZWRkaW5nIGVuZHBvaW50cyB0aHJvdWdoIHRoZSBUeXBlU2NyaXB0LW93bmVkIHBvbGljeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUVuZHBvaW50Q2xhc3NlcyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBSZWFkb25seU1hcDxzdHJpbmcsIE1vZGVsQ2xhc3M+IHtcbiAgY29uc3QgY2xhc3NpZmllZCA9IGNsYXNzaWZ5RW5kcG9pbnRzKGVuZHBvaW50cyk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBNb2RlbENsYXNzPigpO1xuICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgTU9ERUxfQ0xBU1NfT1JERVIpIHtcbiAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIGNsYXNzaWZpZWRbbW9kZWxDbGFzc10pIHJlc3VsdC5zZXQoZW5kcG9pbnQubmFtZSwgbW9kZWxDbGFzcyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIE5vcm1hbGl6ZSBzZXJpYWxpemVkIFNESyBlbmRwb2ludCByZWNvcmRzIHdpdGhvdXQgbmF0aXZlIGJpbmRpbmdzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUVuZHBvaW50cyhlbmRwb2ludHM6IHJlYWRvbmx5IHVua25vd25bXSk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSB7XG4gIGNvbnN0IHN1bW1hcmllcyA9IGVuZHBvaW50cy5mbGF0TWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gcmVjb3JkKHZhbHVlKTtcbiAgICBjb25zdCBuYW1lID0gc3RyaW5nVmFsdWUoZW5kcG9pbnQubmFtZSk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gW107XG4gICAgY29uc3QgZW50aXRpZXMgPSBhcnJheVZhbHVlKHJlY29yZChlbmRwb2ludC5jb25maWcpLnNlcnZlZF9lbnRpdGllcykubWFwKHJlY29yZCk7XG4gICAgY29uc3QgaWRlbnRpdGllcyA9IFtcbiAgICAgIG5hbWUsXG4gICAgICAuLi5lbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+XG4gICAgICAgIFtcbiAgICAgICAgICBzdHJpbmdWYWx1ZShlbnRpdHkuZW50aXR5X25hbWUpLFxuICAgICAgICAgIHN0cmluZ1ZhbHVlKHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkubmFtZSksXG4gICAgICAgICAgc3RyaW5nVmFsdWUocmVjb3JkKGVudGl0eS5leHRlcm5hbF9tb2RlbCkubmFtZSksXG4gICAgICAgIF0uZmlsdGVyKChpZGVudGl0eSk6IGlkZW50aXR5IGlzIHN0cmluZyA9PiBCb29sZWFuKGlkZW50aXR5KSksXG4gICAgICApLFxuICAgIF07XG4gICAgY29uc3QgbW9kZWxTZXJ2aWNlTmFtZSA9IGVudGl0aWVzXG4gICAgICAubWFwKFxuICAgICAgICAoZW50aXR5KSA9PlxuICAgICAgICAgIHN0cmluZ1ZhbHVlKHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkubmFtZSkgPz8gc3RyaW5nVmFsdWUoZW50aXR5LmVudGl0eV9uYW1lKSxcbiAgICAgIClcbiAgICAgIC5maW5kKEJvb2xlYW4pO1xuICAgIGNvbnN0IGZvdW5kYXRpb25Nb2RlbHMgPSBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gcmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKSk7XG4gICAgY29uc3QgZmFtaWx5ID1cbiAgICAgIGZvdW5kYXRpb25Nb2RlbHMubWFwKChtb2RlbCkgPT4gc3RyaW5nVmFsdWUobW9kZWwubW9kZWxfY2xhc3MpKS5maW5kKEJvb2xlYW4pID8/XG4gICAgICBpZGVudGl0aWVzLm1hcChtb2RlbEZhbWlseSkuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCByZWFzb25pbmdFZmZvcnRzID1cbiAgICAgIGlkZW50aXRpZXMubWFwKG1vZGVsUmVhc29uaW5nRWZmb3J0cykuc29ydCgobGVmdCwgcmlnaHQpID0+IHJpZ2h0Lmxlbmd0aCAtIGxlZnQubGVuZ3RoKVswXSA/P1xuICAgICAgW107XG4gICAgY29uc3QgcHJvZmlsZSA9IGVudGl0aWVzLm1hcChtb2RlbFByb2ZpbGUpLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgY2FwYWJpbGl0aWVzUmVjb3JkID0gcmVjb3JkKGVuZHBvaW50LmNhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZm91bmRhdGlvbkRlc2NyaXB0aW9uID0gZm91bmRhdGlvbk1vZGVsc1xuICAgICAgLm1hcCgobW9kZWwpID0+IHN0cmluZ1ZhbHVlKG1vZGVsLmRlc2NyaXB0aW9uKSlcbiAgICAgIC5maW5kKEJvb2xlYW4pO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gc3RyaW5nVmFsdWUoZW5kcG9pbnQuZGVzY3JpcHRpb24pID8/IGZvdW5kYXRpb25EZXNjcmlwdGlvbjtcbiAgICBjb25zdCBzdW1tYXJ5OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiB0b01vZGVsRGlzcGxheU5hbWUobmFtZSwgcHJvdmlkZWREaXNwbGF5TmFtZShlbmRwb2ludCwgZW50aXRpZXMpKSxcbiAgICAgIC4uLihmYW1pbHkgPyB7IGZhbWlseSB9IDoge30pLFxuICAgICAgLi4uKHN0cmluZ1ZhbHVlKGVuZHBvaW50LnRhc2spID8geyB0YXNrOiBzdHJpbmdWYWx1ZShlbmRwb2ludC50YXNrKSB9IDoge30pLFxuICAgICAgLi4uKHN0cmluZ1ZhbHVlKHJlY29yZChlbmRwb2ludC5zdGF0ZSkucmVhZHkpXG4gICAgICAgID8geyBzdGF0ZTogc3RyaW5nVmFsdWUocmVjb3JkKGVuZHBvaW50LnN0YXRlKS5yZWFkeSkgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIHN1cHBvcnRzVG9vbHM6XG4gICAgICAgIGJvb2xlYW5WYWx1ZShjYXBhYmlsaXRpZXNSZWNvcmQuZnVuY3Rpb25fY2FsbGluZykgPz8gaWRlbnRpdGllcy5zb21lKHN1cHBvcnRzVG9vbHNCeUZhbWlseSksXG4gICAgICAuLi4ocHJvZmlsZSA/IHsgcHJvZmlsZSB9IDoge30pLFxuICAgICAgc2VydmljZU5hbWVzOiBPYmplY3QuYXNzaWduKHt9LCAuLi5pZGVudGl0aWVzLm1hcChtb2RlbFNlcnZpY2VOYW1lcykpLFxuICAgICAgLi4uKG1vZGVsU2VydmljZU5hbWUgPyB7IG1vZGVsU2VydmljZU5hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihyZWFzb25pbmdFZmZvcnRzLmxlbmd0aCA/IHsgcmVhc29uaW5nRWZmb3J0cyB9IDoge30pLFxuICAgICAgc3RhdHVzOiBtb2RlbFN0YXR1c0ZvciguLi5pZGVudGl0aWVzKSxcbiAgICB9O1xuICAgIHJldHVybiBbc3VtbWFyeV07XG4gIH0pO1xuICBjb25zdCBjbGFzc2VzID0gY2xhc3NpZnlFbmRwb2ludENsYXNzZXMoc3VtbWFyaWVzKTtcbiAgcmV0dXJuIHN1bW1hcmllcy5tYXAoKHN1bW1hcnkpID0+IHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gY2xhc3Nlcy5nZXQoc3VtbWFyeS5uYW1lKTtcbiAgICByZXR1cm4gbW9kZWxDbGFzcyA/IHsgLi4uc3VtbWFyeSwgY2xhc3M6IG1vZGVsQ2xhc3MgfSA6IHN1bW1hcnk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlUmFua2VkKGxlZnQ6IFJhbmtlZE1vZGVsLCByaWdodDogUmFua2VkTW9kZWwpOiBudW1iZXIge1xuICBjb25zdCBzY29yZSA9IE1hdGgucm91bmQoKGxlZnQuc2NvcmUgPz8gMCkgKiAxMDAwKSAtIE1hdGgucm91bmQoKHJpZ2h0LnNjb3JlID8/IDApICogMTAwMCk7XG4gIGlmIChzY29yZSAhPT0gMCkgcmV0dXJuIHNjb3JlO1xuICBjb25zdCBsZWZ0VmVyc2lvbiA9IHZlcnNpb25UdXBsZShsZWZ0LmVuZHBvaW50Lm5hbWUpO1xuICBjb25zdCByaWdodFZlcnNpb24gPSB2ZXJzaW9uVHVwbGUocmlnaHQuZW5kcG9pbnQubmFtZSk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAzOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJpZ2h0VmVyc2lvbltpbmRleF0hIC0gbGVmdFZlcnNpb25baW5kZXhdITtcbiAgICBpZiAodmVyc2lvbiAhPT0gMCkgcmV0dXJuIHZlcnNpb247XG4gIH1cbiAgY29uc3QgdmFyaWFudCA9IG1vZGVsVmFyaWFudFJhbmsobGVmdC5lbmRwb2ludC5uYW1lKSAtIG1vZGVsVmFyaWFudFJhbmsocmlnaHQuZW5kcG9pbnQubmFtZSk7XG4gIGlmICh2YXJpYW50ICE9PSAwKSByZXR1cm4gdmFyaWFudDtcbiAgcmV0dXJuIE1PREVMX0NMQVNTX09SREVSLmluZGV4T2YobGVmdC5tb2RlbENsYXNzKSAtIE1PREVMX0NMQVNTX09SREVSLmluZGV4T2YocmlnaHQubW9kZWxDbGFzcyk7XG59XG5cbmZ1bmN0aW9uIG1vZGVsVmFyaWFudFJhbmsobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKCEvKD86XnxbLV8uXSlncHQoPzpbLV8uXXwkKS9pLnRlc3QobmFtZSkpIHJldHVybiAyO1xuICBpZiAoLyg/Ol58Wy1fLl0pc29sKD86Wy1fLl18JCkvaS50ZXN0KG5hbWUpKSByZXR1cm4gMDtcbiAgaWYgKC8oPzpefFstXy5dKWx1bmEoPzpbLV8uXXwkKS9pLnRlc3QobmFtZSkpIHJldHVybiAxO1xuICByZXR1cm4gMjtcbn1cblxuZnVuY3Rpb24gdG9rZW5pemUodmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkubWF0Y2goL1thLXowLTldKy9nKSA/PyBbXTtcbn1cblxuZnVuY3Rpb24gc2VhcmNoYWJsZVZhbHVlcyhlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBlbmRwb2ludC5uYW1lLFxuICAgIGVuZHBvaW50LmRpc3BsYXlOYW1lLFxuICAgIGVuZHBvaW50LmZhbWlseSxcbiAgICBlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lLFxuICAgIC4uLk9iamVjdC52YWx1ZXMoZW5kcG9pbnQuc2VydmljZU5hbWVzID8/IHt9KSxcbiAgXS5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gbW9kZWxQcm9maWxlKGVudGl0eTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgY29uc3Qgc291cmNlID0gcmVjb3JkKHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkuYWlfZ2F0ZXdheV9tb2RlbF9wcm9maWxlKTtcbiAgY29uc3QgcXVhbGl0eSA9IGZpbml0ZU51bWJlcihzb3VyY2UucXVhbGl0eSk7XG4gIGNvbnN0IHNwZWVkID0gZmluaXRlTnVtYmVyKHNvdXJjZS5zcGVlZCk7XG4gIGNvbnN0IGNvc3QgPSBmaW5pdGVOdW1iZXIoc291cmNlLmNvc3QpO1xuICBpZiAocXVhbGl0eSA9PT0gdW5kZWZpbmVkICYmIHNwZWVkID09PSB1bmRlZmluZWQgJiYgY29zdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIC4uLihxdWFsaXR5ICE9PSB1bmRlZmluZWQgPyB7IHF1YWxpdHkgfSA6IHt9KSxcbiAgICAuLi4oc3BlZWQgIT09IHVuZGVmaW5lZCA/IHsgc3BlZWQgfSA6IHt9KSxcbiAgICAuLi4oY29zdCAhPT0gdW5kZWZpbmVkID8geyBjb3N0IH0gOiB7fSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3ZpZGVkRGlzcGxheU5hbWUoXG4gIGVuZHBvaW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgZW50aXRpZXM6IHJlYWRvbmx5IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IHRhZyBvZiBhcnJheVZhbHVlKGVuZHBvaW50LnRhZ3MpLm1hcChyZWNvcmQpKSB7XG4gICAgaWYgKCFbXCJkaXNwbGF5X25hbWVcIiwgXCJkaXNwbGF5TmFtZVwiLCBcIm5hbWVcIl0uaW5jbHVkZXMoU3RyaW5nKHRhZy5rZXkpKSkgY29udGludWU7XG4gICAgY29uc3QgdmFsdWUgPSBzdHJpbmdWYWx1ZSh0YWcudmFsdWUpO1xuICAgIGlmICh2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiAoXG4gICAgZW50aXRpZXNcbiAgICAgIC5tYXAoKGVudGl0eSkgPT4gc3RyaW5nVmFsdWUocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5kaXNwbGF5X25hbWUpKVxuICAgICAgLmZpbmQoQm9vbGVhbikgPz9cbiAgICBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gc3RyaW5nVmFsdWUocmVjb3JkKGVudGl0eS5leHRlcm5hbF9tb2RlbCkubmFtZSkpLmZpbmQoQm9vbGVhbilcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgID8gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgIDoge307XG59XG5cbmZ1bmN0aW9uIGFycmF5VmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gIHJldHVybiB0cmltbWVkIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZmluaXRlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJvb2xlYW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuIl19
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JhbmtpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3JhbmtpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsSUFBSSxnQkFBZ0IsR0FLL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLElBQUksTUFBTSxTQUFTLENBQUM7QUFFM0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHcEYsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7QUFFcEMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFPcEMsdUVBQXVFO0FBQ3ZFLE1BQU0sVUFBVSxhQUFhLENBQzNCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUUsRUFDdEIsVUFBZ0MsRUFBRTtJQUVsQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRixNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sVUFBVSxHQUFH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QyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUN4RixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQWM7SUFDNUIsT0FBTyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDaEUsQ0FBQyxDQUFFLEtBQWlDO1FBQ3BDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYztJQUNoQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFjO0lBQ2pDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixPQUFPLE9BQU8sSUFBSSxTQUFTLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDakYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsT0FBTyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NWYWx1ZXMsXG4gIHR5cGUgTW9kZWxDbGFzcyBhcyBNb2RlbENsYXNzVHlwZSxcbiAgdHlwZSBNb2RlbFF1ZXJ5LFxuICB0eXBlIFJhbmtlZE1vZGVsLFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9jb250cmFjdHNcIjtcbmltcG9ydCB7IHRvTW9kZWxEaXNwbGF5TmFtZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9kaXNwbGF5XCI7XG5pbXBvcnQgRnVzZSBmcm9tIFwiZnVzZS5qc1wiO1xuXG5pbXBvcnQgeyBtb2RlbFN0YXR1c0ZvciB9IGZyb20gXCIuL19yZXRpcmVtZW50LnRzXCI7XG5pbXBvcnQgeyBjbGFzc2VzQXRPckJlbG93LCBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL2NsYXNzZXMudHNcIjtcbmltcG9ydCB7XG4gIGNsYXNzaWZ5RW5kcG9pbnRzLFxuICBlbmRwb2ludENhcGFiaWxpdGllcyxcbiAgc3VwcG9ydHNUb29sc0J5RmFtaWx5LFxuICB2ZXJzaW9uVHVwbGUsXG59IGZyb20gXCIuL2NsYXNzaWZ5LnRzXCI7XG5pbXBvcnQgeyBtb2RlbEZhbWlseSwgbW9kZWxSZWFzb25pbmdFZmZvcnRzLCBtb2RlbFNlcnZpY2VOYW1lcyB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG50eXBlIE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzVHlwZTtcbmNvbnN0IE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzVmFsdWVzO1xuXG5jb25zdCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCA9IDAuNDtcbmludGVyZmFjZSBOYXRpdmVSYW5raW5nT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGluY2x1ZGVEZXByZWNhdGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG4gIHJlYWRvbmx5IHRhc2s/OiBzdHJpbmc7XG59XG5cbi8qKiBSYW5rIGVuZHBvaW50IHJlY29yZHMgdGhyb3VnaCB0aGUgVHlwZVNjcmlwdC1vd25lZCBtb2RlbCBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gcmFua0VuZHBvaW50cyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIHF1ZXJ5OiBNb2RlbFF1ZXJ5ID0ge30sXG4gIG9wdGlvbnM6IE5hdGl2ZVJhbmtpbmdPcHRpb25zID0ge30sXG4pOiBSYW5rZWRNb2RlbFtdIHtcbiAgY29uc3QgZmlsdGVyZWQgPSBlbmRwb2ludHMuZmlsdGVyKChlbmRwb2ludCkgPT4gbWF0Y2hlc01vZGVsUXVlcnkoZW5kcG9pbnQsIHF1ZXJ5KSk7XG4gIGNvbnN0IG9yaWdpbmFsQnlOYW1lID0gbmV3IE1hcChmaWx0ZXJlZC5tYXAoKGVuZHBvaW50KSA9PiBbZW5kcG9pbnQubmFtZSwgZW5kcG9pbnRdKSk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBmaWx0ZXJlZC5tYXAoKGVuZHBvaW50KSA9PiAoe1xuICAgIC4uLmVuZHBvaW50LFxuICAgIC4uLihvcHRpb25zLm1vZGVsQ2xhc3MgPyB7IGNsYXNzOiBvcHRpb25zLm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy50YXNrID8geyB0YXNrOiBvcHRpb25zLnRhc2sgfSA6IHt9KSxcbiAgfSkpO1xuICBjb25zdCBjbGFzc2lmaWVkID0gb3B0aW9ucy5tb2RlbENsYXNzXG4gICAgPyB7XG4gICAgICAgIFtNb2RlbENsYXNzLkNoYXRUaGlua2luZ106IFtdLFxuICAgICAgICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOiBbXSxcbiAgICAgICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBbXSxcbiAgICAgICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogW10sXG4gICAgICAgIFtvcHRpb25zLm1vZGVsQ2xhc3NdOiBub3JtYWxpemVkLFxuICAgICAgfVxuICAgIDogY2xhc3NpZnlFbmRwb2ludHMobm9ybWFsaXplZCk7XG4gIGNvbnN0IHJlcXVlc3RlZENsYXNzID0gb3B0aW9ucy5tb2RlbENsYXNzID8/IHF1ZXJ5Lm1vZGVsQ2xhc3M7XG4gIGNvbnN0IGluY2x1ZGVEZXByZWNhdGVkID0gcXVlcnkuaW5jbHVkZURlcHJlY2F0ZWQgPz8gb3B0aW9ucy5pbmNsdWRlRGVwcmVjYXRlZCA/PyBmYWxzZTtcbiAgY29uc3QgZWxpZ2libGUgPSByZXF1ZXN0ZWRDbGFzcyA/IGNsYXNzZXNBdE9yQmVsb3cocmVxdWVzdGVkQ2xhc3MpIDogQ0hBVF9DTEFTU19PUkRFUjtcbiAgY29uc3QgY2FuZGlkYXRlczogUmFua2VkTW9kZWxbXSA9IFtdO1xuICBjb25zdCBzZWFyY2ggPSBxdWVyeS5zZWFyY2g/LnRyaW0oKTtcbiAgaWYgKHNlYXJjaCAmJiByZXF1ZXN0ZWRDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xhc3NCeU5hbWUgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3Nlcyhub3JtYWxpemVkKTtcbiAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIG5vcm1hbGl6ZWQpIHtcbiAgICAgIGlmICghaW5jbHVkZURlcHJlY2F0ZWQgJiYgZW5kcG9pbnQuc3RhdHVzPy5kZXByZWNhdGVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KTtcbiAgICAgIGlmICghY2FwYWJpbGl0aWVzLmNoYXQgfHwgKHF1ZXJ5LnJlcXVpcmVzVG9vbHMgJiYgIWNhcGFiaWxpdGllcy50b29scykpIGNvbnRpbnVlO1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIG1vZGVsQ2xhc3M6IGNsYXNzQnlOYW1lLmdldChlbmRwb2ludC5uYW1lKSA/PyBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgZWxpZ2libGUpIHtcbiAgICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkge1xuICAgICAgICBpZiAoIWluY2x1ZGVEZXByZWNhdGVkICYmIGVuZHBvaW50LnN0YXR1cz8uZGVwcmVjYXRlZCkgY29udGludWU7XG4gICAgICAgIGlmIChxdWVyeS5yZXF1aXJlc1Rvb2xzICYmICFlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpIGNvbnRpbnVlO1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBlbmRwb2ludCwgbW9kZWxDbGFzcyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgcmFua2VkID0gY2FuZGlkYXRlcztcbiAgaWYgKHNlYXJjaCkge1xuICAgIGNvbnN0IGV4YWN0ID0gY2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5lbmRwb2ludC5uYW1lID09PSBzZWFyY2gpO1xuICAgIGlmIChleGFjdCkge1xuICAgICAgcmFua2VkID0gW3sgLi4uZXhhY3QsIHNjb3JlOiAwIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSBxdWVyeS50aHJlc2hvbGQgPz8gREVGQVVMVF9GVVpaWV9USFJFU0hPTEQ7XG4gICAgICBjb25zdCBzZWFyY2hUb2tlbnMgPSB0b2tlbml6ZShzZWFyY2gpO1xuICAgICAgY29uc3QgdG9rZW5NYXRjaGVzID0gY2FuZGlkYXRlc1xuICAgICAgICAuZmlsdGVyKChjYW5kaWRhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBjYW5kaWRhdGVUb2tlbnMgPSBuZXcgU2V0KHNlYXJjaGFibGVWYWx1ZXMoY2FuZGlkYXRlLmVuZHBvaW50KS5mbGF0TWFwKHRva2VuaXplKSk7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHNlYXJjaFRva2Vucy5sZW5ndGggPiAwICYmIHNlYXJjaFRva2Vucy5ldmVyeSgodG9rZW4pID0+IGNhbmRpZGF0ZVRva2Vucy5oYXModG9rZW4pKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKGNhbmRpZGF0ZSkgPT4gKHsgLi4uY2FuZGlkYXRlLCBzY29yZTogMCB9KSk7XG4gICAgICBpZiAodG9rZW5NYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmFua2VkID0gdG9rZW5NYXRjaGVzLnNvcnQoY29tcGFyZVJhbmtlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmdXNlID0gbmV3IEZ1c2UoY2FuZGlkYXRlcywge1xuICAgICAgICAgIGtleXM6IFtcbiAgICAgICAgICAgIFwiZW5kcG9pbnQubmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5kaXNwbGF5TmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5mYW1pbHlcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5zZXJ2aWNlTmFtZXNcIixcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgICBpZ25vcmVMb2NhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlU2NvcmU6IHRydWUsXG4gICAgICAgICAgdXNlRXh0ZW5kZWRTZWFyY2g6IHRydWUsXG4gICAgICAgICAgaXNDYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSB0b2tlbml6ZShzZWFyY2gpLmpvaW4oXCIgXCIpO1xuICAgICAgICByYW5rZWQgPSBub3JtYWxpemVkU2VhcmNoXG4gICAgICAgICAgPyBmdXNlXG4gICAgICAgICAgICAgIC5zZWFyY2gobm9ybWFsaXplZFNlYXJjaClcbiAgICAgICAgICAgICAgLmZpbHRlcigocmVzdWx0KSA9PiAocmVzdWx0LnNjb3JlID8/IDApIDw9IHRocmVzaG9sZClcbiAgICAgICAgICAgICAgLm1hcCgocmVzdWx0KSA9PiAoeyAuLi5yZXN1bHQuaXRlbSwgc2NvcmU6IHJlc3VsdC5zY29yZSA/PyAwIH0pKVxuICAgICAgICAgICAgICAuc29ydChjb21wYXJlUmFua2VkKVxuICAgICAgICAgIDogW107XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3RvcmVkID0gcmFua2VkLm1hcCgocmVzdWx0KSA9PiAoe1xuICAgIC4uLnJlc3VsdCxcbiAgICBlbmRwb2ludDogb3JpZ2luYWxCeU5hbWUuZ2V0KHJlc3VsdC5lbmRwb2ludC5uYW1lKSA/PyByZXN1bHQuZW5kcG9pbnQsXG4gIH0pKTtcbiAgcmV0dXJuIHF1ZXJ5LmxpbWl0ID09PSB1bmRlZmluZWQgPyByZXN0b3JlZCA6IHJlc3RvcmVkLnNsaWNlKDAsIE1hdGgubWF4KDAsIHF1ZXJ5LmxpbWl0KSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNNb2RlbFF1ZXJ5KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LCBxdWVyeTogTW9kZWxRdWVyeSk6IGJvb2xlYW4ge1xuICBpZiAocXVlcnkubmFtZSAhPT0gdW5kZWZpbmVkICYmIGVuZHBvaW50Lm5hbWUgIT09IHF1ZXJ5Lm5hbWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKHF1ZXJ5LnRhc2sgIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC50YXNrICE9PSBxdWVyeS50YXNrKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICBxdWVyeS5yZWFzb25pbmdFZmZvcnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICFlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzPy5pbmNsdWRlcyhxdWVyeS5yZWFzb25pbmdFZmZvcnQpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXG4gICAgcXVlcnkuZGltZW5zaW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICBxdWVyeS5taW5EaW1lbnNpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgIHF1ZXJ5Lm1heERpbWVuc2lvbiAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGlmIChlbmRwb2ludC5kaW1lbnNpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5kaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gIT09IHF1ZXJ5LmRpbWVuc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5taW5EaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gPCBxdWVyeS5taW5EaW1lbnNpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAocXVlcnkubWF4RGltZW5zaW9uICE9PSB1bmRlZmluZWQgJiYgZW5kcG9pbnQuZGltZW5zaW9uID4gcXVlcnkubWF4RGltZW5zaW9uKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDbGFzc2lmeSBjaGF0IGFuZCBlbWJlZGRpbmcgZW5kcG9pbnRzIHRocm91Z2ggdGhlIFR5cGVTY3JpcHQtb3duZWQgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5RW5kcG9pbnRDbGFzc2VzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kZWxDbGFzcz4ge1xuICBjb25zdCBjbGFzc2lmaWVkID0gY2xhc3NpZnlFbmRwb2ludHMoZW5kcG9pbnRzKTtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIE1vZGVsQ2xhc3M+KCk7XG4gIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBNT0RFTF9DTEFTU19PUkRFUikge1xuICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkgcmVzdWx0LnNldChlbmRwb2ludC5uYW1lLCBtb2RlbENsYXNzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogTm9ybWFsaXplIHNlcmlhbGl6ZWQgU0RLIGVuZHBvaW50IHJlY29yZHMgd2l0aG91dCBuYXRpdmUgYmluZGluZ3MuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRW5kcG9pbnRzKGVuZHBvaW50czogcmVhZG9ubHkgdW5rbm93bltdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgY29uc3Qgc3VtbWFyaWVzID0gZW5kcG9pbnRzLmZsYXRNYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSByZWNvcmQodmFsdWUpO1xuICAgIGNvbnN0IG5hbWUgPSBzdHJpbmdWYWx1ZShlbmRwb2ludC5uYW1lKTtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBbXTtcbiAgICBjb25zdCBlbnRpdGllcyA9IGFycmF5VmFsdWUocmVjb3JkKGVuZHBvaW50LmNvbmZpZykuc2VydmVkX2VudGl0aWVzKS5tYXAocmVjb3JkKTtcbiAgICBjb25zdCBpZGVudGl0aWVzID0gW1xuICAgICAgbmFtZSxcbiAgICAgIC4uLmVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT5cbiAgICAgICAgW1xuICAgICAgICAgIHN0cmluZ1ZhbHVlKGVudGl0eS5lbnRpdHlfbmFtZSksXG4gICAgICAgICAgc3RyaW5nVmFsdWUocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5uYW1lKSxcbiAgICAgICAgICBzdHJpbmdWYWx1ZShyZWNvcmQoZW50aXR5LmV4dGVybmFsX21vZGVsKS5uYW1lKSxcbiAgICAgICAgXS5maWx0ZXIoKGlkZW50aXR5KTogaWRlbnRpdHkgaXMgc3RyaW5nID0+IEJvb2xlYW4oaWRlbnRpdHkpKSxcbiAgICAgICksXG4gICAgXTtcbiAgICBjb25zdCBtb2RlbFNlcnZpY2VOYW1lID0gZW50aXRpZXNcbiAgICAgIC5tYXAoXG4gICAgICAgIChlbnRpdHkpID0+XG4gICAgICAgICAgc3RyaW5nVmFsdWUocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5uYW1lKSA/PyBzdHJpbmdWYWx1ZShlbnRpdHkuZW50aXR5X25hbWUpLFxuICAgICAgKVxuICAgICAgLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgZm91bmRhdGlvbk1vZGVscyA9IGVudGl0aWVzLm1hcCgoZW50aXR5KSA9PiByZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpKTtcbiAgICBjb25zdCBmYW1pbHkgPVxuICAgICAgZm91bmRhdGlvbk1vZGVscy5tYXAoKG1vZGVsKSA9PiBzdHJpbmdWYWx1ZShtb2RlbC5tb2RlbF9jbGFzcykpLmZpbmQoQm9vbGVhbikgPz9cbiAgICAgIGlkZW50aXRpZXMubWFwKG1vZGVsRmFtaWx5KS5maW5kKEJvb2xlYW4pO1xuICAgIGNvbnN0IHJlYXNvbmluZ0VmZm9ydHMgPVxuICAgICAgaWRlbnRpdGllcy5tYXAobW9kZWxSZWFzb25pbmdFZmZvcnRzKS5zb3J0KChsZWZ0LCByaWdodCkgPT4gcmlnaHQubGVuZ3RoIC0gbGVmdC5sZW5ndGgpWzBdID8/XG4gICAgICBbXTtcbiAgICBjb25zdCBwcm9maWxlID0gZW50aXRpZXMubWFwKG1vZGVsUHJvZmlsZSkuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCBjYXBhYmlsaXRpZXNSZWNvcmQgPSByZWNvcmQoZW5kcG9pbnQuY2FwYWJpbGl0aWVzKTtcbiAgICBjb25zdCBmb3VuZGF0aW9uRGVzY3JpcHRpb24gPSBmb3VuZGF0aW9uTW9kZWxzXG4gICAgICAubWFwKChtb2RlbCkgPT4gc3RyaW5nVmFsdWUobW9kZWwuZGVzY3JpcHRpb24pKVxuICAgICAgLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBzdHJpbmdWYWx1ZShlbmRwb2ludC5kZXNjcmlwdGlvbikgPz8gZm91bmRhdGlvbkRlc2NyaXB0aW9uO1xuICAgIGNvbnN0IHN1bW1hcnk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IHRvTW9kZWxEaXNwbGF5TmFtZShuYW1lLCBwcm92aWRlZERpc3BsYXlOYW1lKGVuZHBvaW50LCBlbnRpdGllcykpLFxuICAgICAgLi4uKGZhbWlseSA/IHsgZmFtaWx5IH0gOiB7fSksXG4gICAgICAuLi4oc3RyaW5nVmFsdWUoZW5kcG9pbnQudGFzaykgPyB7IHRhc2s6IHN0cmluZ1ZhbHVlKGVuZHBvaW50LnRhc2spIH0gOiB7fSksXG4gICAgICAuLi4oc3RyaW5nVmFsdWUocmVjb3JkKGVuZHBvaW50LnN0YXRlKS5yZWFkeSlcbiAgICAgICAgPyB7IHN0YXRlOiBzdHJpbmdWYWx1ZShyZWNvcmQoZW5kcG9pbnQuc3RhdGUpLnJlYWR5KSB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKGRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgc3VwcG9ydHNUb29sczpcbiAgICAgICAgYm9vbGVhblZhbHVlKGNhcGFiaWxpdGllc1JlY29yZC5mdW5jdGlvbl9jYWxsaW5nKSA/PyBpZGVudGl0aWVzLnNvbWUoc3VwcG9ydHNUb29sc0J5RmFtaWx5KSxcbiAgICAgIC4uLihwcm9maWxlID8geyBwcm9maWxlIH0gOiB7fSksXG4gICAgICBzZXJ2aWNlTmFtZXM6IE9iamVjdC5hc3NpZ24oe30sIC4uLmlkZW50aXRpZXMubWFwKG1vZGVsU2VydmljZU5hbWVzKSksXG4gICAgICAuLi4obW9kZWxTZXJ2aWNlTmFtZSA/IHsgbW9kZWxTZXJ2aWNlTmFtZSB9IDoge30pLFxuICAgICAgLi4uKHJlYXNvbmluZ0VmZm9ydHMubGVuZ3RoID8geyByZWFzb25pbmdFZmZvcnRzIH0gOiB7fSksXG4gICAgICBzdGF0dXM6IG1vZGVsU3RhdHVzRm9yKC4uLmlkZW50aXRpZXMpLFxuICAgIH07XG4gICAgcmV0dXJuIFtzdW1tYXJ5XTtcbiAgfSk7XG4gIGNvbnN0IGNsYXNzZXMgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3NlcyhzdW1tYXJpZXMpO1xuICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBjbGFzc2VzLmdldChzdW1tYXJ5Lm5hbWUpO1xuICAgIHJldHVybiBtb2RlbENsYXNzID8geyAuLi5zdW1tYXJ5LCBjbGFzczogbW9kZWxDbGFzcyB9IDogc3VtbWFyeTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVSYW5rZWQobGVmdDogUmFua2VkTW9kZWwsIHJpZ2h0OiBSYW5rZWRNb2RlbCk6IG51bWJlciB7XG4gIGNvbnN0IHNjb3JlID0gTWF0aC5yb3VuZCgobGVmdC5zY29yZSA/PyAwKSAqIDEwMDApIC0gTWF0aC5yb3VuZCgocmlnaHQuc2NvcmUgPz8gMCkgKiAxMDAwKTtcbiAgaWYgKHNjb3JlICE9PSAwKSByZXR1cm4gc2NvcmU7XG4gIGNvbnN0IGxlZnRWZXJzaW9uID0gdmVyc2lvblR1cGxlKGxlZnQuZW5kcG9pbnQubmFtZSk7XG4gIGNvbnN0IHJpZ2h0VmVyc2lvbiA9IHZlcnNpb25UdXBsZShyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmlnaHRWZXJzaW9uW2luZGV4XSEgLSBsZWZ0VmVyc2lvbltpbmRleF0hO1xuICAgIGlmICh2ZXJzaW9uICE9PSAwKSByZXR1cm4gdmVyc2lvbjtcbiAgfVxuICBjb25zdCB2YXJpYW50ID0gbW9kZWxWYXJpYW50UmFuayhsZWZ0LmVuZHBvaW50Lm5hbWUpIC0gbW9kZWxWYXJpYW50UmFuayhyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgaWYgKHZhcmlhbnQgIT09IDApIHJldHVybiB2YXJpYW50O1xuICByZXR1cm4gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihsZWZ0Lm1vZGVsQ2xhc3MpIC0gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihyaWdodC5tb2RlbENsYXNzKTtcbn1cblxuZnVuY3Rpb24gbW9kZWxWYXJpYW50UmFuayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAoIS8oPzpefFstXy5dKWdwdCg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDI7XG4gIGlmICgvKD86XnxbLV8uXSlzb2woPzpbLV8uXXwkKS9pLnRlc3QobmFtZSkpIHJldHVybiAwO1xuICBpZiAoLyg/Ol58Wy1fLl0pbHVuYSg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDE7XG4gIHJldHVybiAyO1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xufVxuXG5mdW5jdGlvbiBzZWFyY2hhYmxlVmFsdWVzKGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGVuZHBvaW50Lm5hbWUsXG4gICAgZW5kcG9pbnQuZGlzcGxheU5hbWUsXG4gICAgZW5kcG9pbnQuZmFtaWx5LFxuICAgIGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUsXG4gICAgLi4uT2JqZWN0LnZhbHVlcyhlbmRwb2ludC5zZXJ2aWNlTmFtZXMgPz8ge30pLFxuICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBtb2RlbFByb2ZpbGUoZW50aXR5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICBjb25zdCBzb3VyY2UgPSByZWNvcmQocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5haV9nYXRld2F5X21vZGVsX3Byb2ZpbGUpO1xuICBjb25zdCBxdWFsaXR5ID0gZmluaXRlTnVtYmVyKHNvdXJjZS5xdWFsaXR5KTtcbiAgY29uc3Qgc3BlZWQgPSBmaW5pdGVOdW1iZXIoc291cmNlLnNwZWVkKTtcbiAgY29uc3QgY29zdCA9IGZpbml0ZU51bWJlcihzb3VyY2UuY29zdCk7XG4gIGlmIChxdWFsaXR5ID09PSB1bmRlZmluZWQgJiYgc3BlZWQgPT09IHVuZGVmaW5lZCAmJiBjb3N0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgLi4uKHF1YWxpdHkgIT09IHVuZGVmaW5lZCA/IHsgcXVhbGl0eSB9IDoge30pLFxuICAgIC4uLihzcGVlZCAhPT0gdW5kZWZpbmVkID8geyBzcGVlZCB9IDoge30pLFxuICAgIC4uLihjb3N0ICE9PSB1bmRlZmluZWQgPyB7IGNvc3QgfSA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvdmlkZWREaXNwbGF5TmFtZShcbiAgZW5kcG9pbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBlbnRpdGllczogcmVhZG9ubHkgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgdGFnIG9mIGFycmF5VmFsdWUoZW5kcG9pbnQudGFncykubWFwKHJlY29yZCkpIHtcbiAgICBpZiAoIVtcImRpc3BsYXlfbmFtZVwiLCBcImRpc3BsYXlOYW1lXCIsIFwibmFtZVwiXS5pbmNsdWRlcyhTdHJpbmcodGFnLmtleSkpKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZSA9IHN0cmluZ1ZhbHVlKHRhZy52YWx1ZSk7XG4gICAgaWYgKHZhbHVlKSByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBlbnRpdGllc1xuICAgICAgLm1hcCgoZW50aXR5KSA9PiBzdHJpbmdWYWx1ZShyZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpLmRpc3BsYXlfbmFtZSkpXG4gICAgICAuZmluZChCb29sZWFuKSA/P1xuICAgIGVudGl0aWVzLm1hcCgoZW50aXR5KSA9PiBzdHJpbmdWYWx1ZShyZWNvcmQoZW50aXR5LmV4dGVybmFsX21vZGVsKS5uYW1lKSkuZmluZChCb29sZWFuKVxuICApO1xufVxuXG5mdW5jdGlvbiByZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgPyAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgOiB7fTtcbn1cblxuZnVuY3Rpb24gYXJyYXlWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHVua25vd25bXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW107XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1ZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgcmV0dXJuIHRyaW1tZWQgfHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5pdGVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYm9vbGVhblZhbHVlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
package/lib/src/bindings.d.ts
CHANGED
|
@@ -1,42 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Binding-safe facade for Databricks model discovery and routing.
|
|
3
3
|
*
|
|
4
|
-
* Generated language bindings
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* to {@link createModelClient}.
|
|
4
|
+
* Generated language bindings create one canonical model client so
|
|
5
|
+
* authentication, catalogue caching, ranking, and route selection remain
|
|
6
|
+
* attached to that client.
|
|
8
7
|
*
|
|
9
8
|
* @module
|
|
10
9
|
*/
|
|
11
|
-
|
|
12
|
-
import { type ModelProtocol } from "./model-client.ts";
|
|
13
|
-
/** Binding-friendly fuzzy model route request. */
|
|
14
|
-
export interface ResolveModelRouteOptions {
|
|
15
|
-
readonly profile?: string;
|
|
16
|
-
readonly model?: string;
|
|
17
|
-
readonly fuzzy?: boolean;
|
|
18
|
-
readonly threshold?: number;
|
|
19
|
-
readonly requiresTools?: boolean;
|
|
20
|
-
readonly modelClass?: ModelClass;
|
|
21
|
-
readonly fallbacks?: readonly string[];
|
|
22
|
-
readonly liveOnly?: boolean;
|
|
23
|
-
readonly protocol?: ModelProtocol;
|
|
24
|
-
readonly refresh?: boolean;
|
|
25
|
-
readonly login?: boolean;
|
|
26
|
-
}
|
|
27
|
-
/** Binding-friendly model endpoint metadata used by Graphiti and other runtimes. */
|
|
28
|
-
export interface ResolvedModelRoute {
|
|
29
|
-
readonly modelId: string;
|
|
30
|
-
readonly endpointName?: string;
|
|
31
|
-
readonly endpointTask?: string;
|
|
32
|
-
readonly endpointDimension?: number;
|
|
33
|
-
readonly source: "explicit" | "fuzzy-match" | "class" | "fallback";
|
|
34
|
-
readonly protocol: ModelProtocol;
|
|
35
|
-
readonly host: string;
|
|
36
|
-
readonly apiBase: string;
|
|
37
|
-
readonly url: string;
|
|
38
|
-
readonly headers: Readonly<Record<string, string>>;
|
|
39
|
-
readonly metadata: ModelMetadata;
|
|
40
|
-
}
|
|
41
|
-
/** Resolve one fuzzy model request through the canonical Node model client. */
|
|
42
|
-
export declare function resolveModelRoute(options?: ResolveModelRouteOptions): Promise<ResolvedModelRoute>;
|
|
10
|
+
export { createModelClient } from "./model-client.ts";
|
package/lib/src/bindings.js
CHANGED
|
@@ -1,43 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Binding-safe facade for Databricks model discovery and routing.
|
|
3
3
|
*
|
|
4
|
-
* Generated language bindings
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* to {@link createModelClient}.
|
|
4
|
+
* Generated language bindings create one canonical model client so
|
|
5
|
+
* authentication, catalogue caching, ranking, and route selection remain
|
|
6
|
+
* attached to that client.
|
|
8
7
|
*
|
|
9
8
|
* @module
|
|
10
9
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export async function resolveModelRoute(options = {}) {
|
|
14
|
-
const client = await createModelClient({
|
|
15
|
-
...(options.profile ? { auth: { profile: options.profile } } : {}),
|
|
16
|
-
});
|
|
17
|
-
const route = await client.route({
|
|
18
|
-
...(options.model ? { explicit: options.model } : {}),
|
|
19
|
-
...(options.fuzzy === undefined ? {} : { fuzzy: options.fuzzy }),
|
|
20
|
-
...(options.threshold === undefined ? {} : { threshold: options.threshold }),
|
|
21
|
-
...(options.requiresTools === undefined ? {} : { requiresTools: options.requiresTools }),
|
|
22
|
-
...(options.modelClass ? { modelClass: options.modelClass } : {}),
|
|
23
|
-
...(options.fallbacks ? { fallbacks: [...options.fallbacks] } : {}),
|
|
24
|
-
...(options.liveOnly === undefined ? {} : { liveOnly: options.liveOnly }),
|
|
25
|
-
...(options.protocol ? { protocol: options.protocol } : {}),
|
|
26
|
-
...(options.refresh === undefined ? {} : { refresh: options.refresh }),
|
|
27
|
-
...(options.login === undefined ? {} : { login: options.login }),
|
|
28
|
-
});
|
|
29
|
-
return {
|
|
30
|
-
modelId: route.modelId,
|
|
31
|
-
...(route.endpoint?.name ? { endpointName: route.endpoint.name } : {}),
|
|
32
|
-
...(route.endpoint?.task ? { endpointTask: route.endpoint.task } : {}),
|
|
33
|
-
...(route.endpoint?.dimension ? { endpointDimension: route.endpoint.dimension } : {}),
|
|
34
|
-
source: route.source,
|
|
35
|
-
protocol: route.protocol,
|
|
36
|
-
host: route.host,
|
|
37
|
-
apiBase: route.apiBase,
|
|
38
|
-
url: route.url,
|
|
39
|
-
headers: { ...route.headers },
|
|
40
|
-
metadata: route.metadata,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluZGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBR0gsT0FBTyxFQUFFLGlCQUFpQixFQUFzQixNQUFNLG1CQUFtQixDQUFDO0FBZ0MxRSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsVUFBb0MsRUFBRTtJQUV0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFpQixDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ25FLENBQUMsQ0FBQztJQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMvQixHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoRSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVFLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEYsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pFLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pFLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RFLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDakUsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JGLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtRQUNwQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7UUFDeEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7UUFDZCxPQUFPLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUU7UUFDN0IsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO0tBQ3pCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCaW5kaW5nLXNhZmUgZmFjYWRlIGZvciBEYXRhYnJpY2tzIG1vZGVsIGRpc2NvdmVyeSBhbmQgcm91dGluZy5cbiAqXG4gKiBHZW5lcmF0ZWQgbGFuZ3VhZ2UgYmluZGluZ3Mgc2hvdWxkIHRhcmdldCB0aGlzIG1vZHVsZSBpbnN0ZWFkIG9mIGJpbmRpbmcgdGhlXG4gKiBmdWxsIG1vZGVsIHBhY2thZ2UuIEl0IGV4cG9zZXMgcGxhaW4gVHlwZVNjcmlwdCByZWNvcmRzIHdoaWxlIGRlbGVnYXRpbmcgYWxsXG4gKiBhdXRoZW50aWNhdGlvbiwgY2F0YWxvZ3VlIGNhY2hpbmcsIGZ1enp5IG1hdGNoaW5nLCBwb2xpY3ksIGFuZCBVUkwgc2VsZWN0aW9uXG4gKiB0byB7QGxpbmsgY3JlYXRlTW9kZWxDbGllbnR9LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1vZGVsQ2xhc3MsIE1vZGVsTWV0YWRhdGEgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5pbXBvcnQgeyBjcmVhdGVNb2RlbENsaWVudCwgdHlwZSBNb2RlbFByb3RvY29sIH0gZnJvbSBcIi4vbW9kZWwtY2xpZW50LnRzXCI7XG5cbi8qKiBCaW5kaW5nLWZyaWVuZGx5IGZ1enp5IG1vZGVsIHJvdXRlIHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVNb2RlbFJvdXRlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICByZWFkb25seSBmdXp6eT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRocmVzaG9sZD86IG51bWJlcjtcbiAgcmVhZG9ubHkgcmVxdWlyZXNUb29scz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzO1xuICByZWFkb25seSBmYWxsYmFja3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgbGl2ZU9ubHk/OiBib29sZWFuO1xuICByZWFkb25seSBwcm90b2NvbD86IE1vZGVsUHJvdG9jb2w7XG4gIHJlYWRvbmx5IHJlZnJlc2g/OiBib29sZWFuO1xuICByZWFkb25seSBsb2dpbj86IGJvb2xlYW47XG59XG5cbi8qKiBCaW5kaW5nLWZyaWVuZGx5IG1vZGVsIGVuZHBvaW50IG1ldGFkYXRhIHVzZWQgYnkgR3JhcGhpdGkgYW5kIG90aGVyIHJ1bnRpbWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZE1vZGVsUm91dGUge1xuICByZWFkb25seSBtb2RlbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuZHBvaW50TmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW5kcG9pbnRUYXNrPzogc3RyaW5nO1xuICByZWFkb25seSBlbmRwb2ludERpbWVuc2lvbj86IG51bWJlcjtcbiAgcmVhZG9ubHkgc291cmNlOiBcImV4cGxpY2l0XCIgfCBcImZ1enp5LW1hdGNoXCIgfCBcImNsYXNzXCIgfCBcImZhbGxiYWNrXCI7XG4gIHJlYWRvbmx5IHByb3RvY29sOiBNb2RlbFByb3RvY29sO1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFwaUJhc2U6IHN0cmluZztcbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBtZXRhZGF0YTogTW9kZWxNZXRhZGF0YTtcbn1cblxuLyoqIFJlc29sdmUgb25lIGZ1enp5IG1vZGVsIHJlcXVlc3QgdGhyb3VnaCB0aGUgY2Fub25pY2FsIE5vZGUgbW9kZWwgY2xpZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNb2RlbFJvdXRlKFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxSb3V0ZU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8UmVzb2x2ZWRNb2RlbFJvdXRlPiB7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IGNyZWF0ZU1vZGVsQ2xpZW50KHtcbiAgICAuLi4ob3B0aW9ucy5wcm9maWxlID8geyBhdXRoOiB7IHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSB9IH0gOiB7fSksXG4gIH0pO1xuICBjb25zdCByb3V0ZSA9IGF3YWl0IGNsaWVudC5yb3V0ZSh7XG4gICAgLi4uKG9wdGlvbnMubW9kZWwgPyB7IGV4cGxpY2l0OiBvcHRpb25zLm1vZGVsIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMuZnV6enkgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBmdXp6eTogb3B0aW9ucy5mdXp6eSB9KSxcbiAgICAuLi4ob3B0aW9ucy50aHJlc2hvbGQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0aHJlc2hvbGQ6IG9wdGlvbnMudGhyZXNob2xkIH0pLFxuICAgIC4uLihvcHRpb25zLnJlcXVpcmVzVG9vbHMgPT09IHVuZGVmaW5lZCA/IHt9IDogeyByZXF1aXJlc1Rvb2xzOiBvcHRpb25zLnJlcXVpcmVzVG9vbHMgfSksXG4gICAgLi4uKG9wdGlvbnMubW9kZWxDbGFzcyA/IHsgbW9kZWxDbGFzczogb3B0aW9ucy5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMuZmFsbGJhY2tzID8geyBmYWxsYmFja3M6IFsuLi5vcHRpb25zLmZhbGxiYWNrc10gfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy5saXZlT25seSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxpdmVPbmx5OiBvcHRpb25zLmxpdmVPbmx5IH0pLFxuICAgIC4uLihvcHRpb25zLnByb3RvY29sID8geyBwcm90b2NvbDogb3B0aW9ucy5wcm90b2NvbCB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnJlZnJlc2ggPT09IHVuZGVmaW5lZCA/IHt9IDogeyByZWZyZXNoOiBvcHRpb25zLnJlZnJlc2ggfSksXG4gICAgLi4uKG9wdGlvbnMubG9naW4gPT09IHVuZGVmaW5lZCA/IHt9IDogeyBsb2dpbjogb3B0aW9ucy5sb2dpbiB9KSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbW9kZWxJZDogcm91dGUubW9kZWxJZCxcbiAgICAuLi4ocm91dGUuZW5kcG9pbnQ/Lm5hbWUgPyB7IGVuZHBvaW50TmFtZTogcm91dGUuZW5kcG9pbnQubmFtZSB9IDoge30pLFxuICAgIC4uLihyb3V0ZS5lbmRwb2ludD8udGFzayA/IHsgZW5kcG9pbnRUYXNrOiByb3V0ZS5lbmRwb2ludC50YXNrIH0gOiB7fSksXG4gICAgLi4uKHJvdXRlLmVuZHBvaW50Py5kaW1lbnNpb24gPyB7IGVuZHBvaW50RGltZW5zaW9uOiByb3V0ZS5lbmRwb2ludC5kaW1lbnNpb24gfSA6IHt9KSxcbiAgICBzb3VyY2U6IHJvdXRlLnNvdXJjZSxcbiAgICBwcm90b2NvbDogcm91dGUucHJvdG9jb2wsXG4gICAgaG9zdDogcm91dGUuaG9zdCxcbiAgICBhcGlCYXNlOiByb3V0ZS5hcGlCYXNlLFxuICAgIHVybDogcm91dGUudXJsLFxuICAgIGhlYWRlcnM6IHsgLi4ucm91dGUuaGVhZGVycyB9LFxuICAgIG1ldGFkYXRhOiByb3V0ZS5tZXRhZGF0YSxcbiAgfTtcbn1cbiJdfQ==
|
|
10
|
+
export { createModelClient } from "./model-client.js";
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluZGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluZGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmluZGluZy1zYWZlIGZhY2FkZSBmb3IgRGF0YWJyaWNrcyBtb2RlbCBkaXNjb3ZlcnkgYW5kIHJvdXRpbmcuXG4gKlxuICogR2VuZXJhdGVkIGxhbmd1YWdlIGJpbmRpbmdzIGNyZWF0ZSBvbmUgY2Fub25pY2FsIG1vZGVsIGNsaWVudCBzb1xuICogYXV0aGVudGljYXRpb24sIGNhdGFsb2d1ZSBjYWNoaW5nLCByYW5raW5nLCBhbmQgcm91dGUgc2VsZWN0aW9uIHJlbWFpblxuICogYXR0YWNoZWQgdG8gdGhhdCBjbGllbnQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmV4cG9ydCB7IGNyZWF0ZU1vZGVsQ2xpZW50IH0gZnJvbSBcIi4vbW9kZWwtY2xpZW50LnRzXCI7XG4iXX0=
|
package/package.json
CHANGED
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "0.81.0",
|
|
30
|
-
"@dbx-tools/appkit": "^0.9.
|
|
31
|
-
"@dbx-tools/auth": "^0.9.
|
|
32
|
-
"@dbx-tools/shared-auth": "^0.9.
|
|
33
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
34
|
-
"@dbx-tools/shared-model": "^0.9.
|
|
30
|
+
"@dbx-tools/appkit": "^0.9.46",
|
|
31
|
+
"@dbx-tools/auth": "^0.9.46",
|
|
32
|
+
"@dbx-tools/shared-auth": "^0.9.46",
|
|
33
|
+
"@dbx-tools/shared-core": "^0.9.46",
|
|
34
|
+
"@dbx-tools/shared-model": "^0.9.46",
|
|
35
35
|
"cacache": "^21.0.1",
|
|
36
36
|
"env-paths": "^4.0.0",
|
|
37
37
|
"fuse.js": "^7.4.2"
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"./package.json": "./package.json"
|
|
103
103
|
}
|
|
104
104
|
},
|
|
105
|
-
"version": "0.9.
|
|
105
|
+
"version": "0.9.46",
|
|
106
106
|
"types": "./lib/index.d.ts",
|
|
107
107
|
"dbxToolsConfig": {
|
|
108
108
|
"tags": [
|
package/src/_ranking.ts
CHANGED
|
@@ -34,8 +34,9 @@ export function rankEndpoints(
|
|
|
34
34
|
query: ModelQuery = {},
|
|
35
35
|
options: NativeRankingOptions = {},
|
|
36
36
|
): RankedModel[] {
|
|
37
|
-
const
|
|
38
|
-
const
|
|
37
|
+
const filtered = endpoints.filter((endpoint) => matchesModelQuery(endpoint, query));
|
|
38
|
+
const originalByName = new Map(filtered.map((endpoint) => [endpoint.name, endpoint]));
|
|
39
|
+
const normalized = filtered.map((endpoint) => ({
|
|
39
40
|
...endpoint,
|
|
40
41
|
...(options.modelClass ? { class: options.modelClass } : {}),
|
|
41
42
|
...(options.task ? { task: options.task } : {}),
|
|
@@ -50,13 +51,14 @@ export function rankEndpoints(
|
|
|
50
51
|
}
|
|
51
52
|
: classifyEndpoints(normalized);
|
|
52
53
|
const requestedClass = options.modelClass ?? query.modelClass;
|
|
54
|
+
const includeDeprecated = query.includeDeprecated ?? options.includeDeprecated ?? false;
|
|
53
55
|
const eligible = requestedClass ? classesAtOrBelow(requestedClass) : CHAT_CLASS_ORDER;
|
|
54
56
|
const candidates: RankedModel[] = [];
|
|
55
57
|
const search = query.search?.trim();
|
|
56
58
|
if (search && requestedClass === undefined) {
|
|
57
59
|
const classByName = classifyEndpointClasses(normalized);
|
|
58
60
|
for (const endpoint of normalized) {
|
|
59
|
-
if (!
|
|
61
|
+
if (!includeDeprecated && endpoint.status?.deprecated) continue;
|
|
60
62
|
const capabilities = endpointCapabilities(endpoint);
|
|
61
63
|
if (!capabilities.chat || (query.requiresTools && !capabilities.tools)) continue;
|
|
62
64
|
candidates.push({
|
|
@@ -67,7 +69,7 @@ export function rankEndpoints(
|
|
|
67
69
|
} else {
|
|
68
70
|
for (const modelClass of eligible) {
|
|
69
71
|
for (const endpoint of classified[modelClass]) {
|
|
70
|
-
if (!
|
|
72
|
+
if (!includeDeprecated && endpoint.status?.deprecated) continue;
|
|
71
73
|
if (query.requiresTools && !endpointCapabilities(endpoint).tools) continue;
|
|
72
74
|
candidates.push({ endpoint, modelClass });
|
|
73
75
|
}
|
|
@@ -125,6 +127,28 @@ export function rankEndpoints(
|
|
|
125
127
|
return query.limit === undefined ? restored : restored.slice(0, Math.max(0, query.limit));
|
|
126
128
|
}
|
|
127
129
|
|
|
130
|
+
function matchesModelQuery(endpoint: ServingEndpointSummary, query: ModelQuery): boolean {
|
|
131
|
+
if (query.name !== undefined && endpoint.name !== query.name) return false;
|
|
132
|
+
if (query.task !== undefined && endpoint.task !== query.task) return false;
|
|
133
|
+
if (
|
|
134
|
+
query.reasoningEffort !== undefined &&
|
|
135
|
+
!endpoint.reasoningEfforts?.includes(query.reasoningEffort)
|
|
136
|
+
) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
if (
|
|
140
|
+
query.dimension !== undefined ||
|
|
141
|
+
query.minDimension !== undefined ||
|
|
142
|
+
query.maxDimension !== undefined
|
|
143
|
+
) {
|
|
144
|
+
if (endpoint.dimension === undefined) return false;
|
|
145
|
+
if (query.dimension !== undefined && endpoint.dimension !== query.dimension) return false;
|
|
146
|
+
if (query.minDimension !== undefined && endpoint.dimension < query.minDimension) return false;
|
|
147
|
+
if (query.maxDimension !== undefined && endpoint.dimension > query.maxDimension) return false;
|
|
148
|
+
}
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
|
|
128
152
|
/** Classify chat and embedding endpoints through the TypeScript-owned policy. */
|
|
129
153
|
export function classifyEndpointClasses(
|
|
130
154
|
endpoints: readonly ServingEndpointSummary[],
|
package/src/bindings.ts
CHANGED
|
@@ -1,77 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Binding-safe facade for Databricks model discovery and routing.
|
|
3
3
|
*
|
|
4
|
-
* Generated language bindings
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* to {@link createModelClient}.
|
|
4
|
+
* Generated language bindings create one canonical model client so
|
|
5
|
+
* authentication, catalogue caching, ranking, and route selection remain
|
|
6
|
+
* attached to that client.
|
|
8
7
|
*
|
|
9
8
|
* @module
|
|
10
9
|
*/
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
import { createModelClient, type ModelProtocol } from "./model-client.ts";
|
|
14
|
-
|
|
15
|
-
/** Binding-friendly fuzzy model route request. */
|
|
16
|
-
export interface ResolveModelRouteOptions {
|
|
17
|
-
readonly profile?: string;
|
|
18
|
-
readonly model?: string;
|
|
19
|
-
readonly fuzzy?: boolean;
|
|
20
|
-
readonly threshold?: number;
|
|
21
|
-
readonly requiresTools?: boolean;
|
|
22
|
-
readonly modelClass?: ModelClass;
|
|
23
|
-
readonly fallbacks?: readonly string[];
|
|
24
|
-
readonly liveOnly?: boolean;
|
|
25
|
-
readonly protocol?: ModelProtocol;
|
|
26
|
-
readonly refresh?: boolean;
|
|
27
|
-
readonly login?: boolean;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** Binding-friendly model endpoint metadata used by Graphiti and other runtimes. */
|
|
31
|
-
export interface ResolvedModelRoute {
|
|
32
|
-
readonly modelId: string;
|
|
33
|
-
readonly endpointName?: string;
|
|
34
|
-
readonly endpointTask?: string;
|
|
35
|
-
readonly endpointDimension?: number;
|
|
36
|
-
readonly source: "explicit" | "fuzzy-match" | "class" | "fallback";
|
|
37
|
-
readonly protocol: ModelProtocol;
|
|
38
|
-
readonly host: string;
|
|
39
|
-
readonly apiBase: string;
|
|
40
|
-
readonly url: string;
|
|
41
|
-
readonly headers: Readonly<Record<string, string>>;
|
|
42
|
-
readonly metadata: ModelMetadata;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** Resolve one fuzzy model request through the canonical Node model client. */
|
|
46
|
-
export async function resolveModelRoute(
|
|
47
|
-
options: ResolveModelRouteOptions = {},
|
|
48
|
-
): Promise<ResolvedModelRoute> {
|
|
49
|
-
const client = await createModelClient({
|
|
50
|
-
...(options.profile ? { auth: { profile: options.profile } } : {}),
|
|
51
|
-
});
|
|
52
|
-
const route = await client.route({
|
|
53
|
-
...(options.model ? { explicit: options.model } : {}),
|
|
54
|
-
...(options.fuzzy === undefined ? {} : { fuzzy: options.fuzzy }),
|
|
55
|
-
...(options.threshold === undefined ? {} : { threshold: options.threshold }),
|
|
56
|
-
...(options.requiresTools === undefined ? {} : { requiresTools: options.requiresTools }),
|
|
57
|
-
...(options.modelClass ? { modelClass: options.modelClass } : {}),
|
|
58
|
-
...(options.fallbacks ? { fallbacks: [...options.fallbacks] } : {}),
|
|
59
|
-
...(options.liveOnly === undefined ? {} : { liveOnly: options.liveOnly }),
|
|
60
|
-
...(options.protocol ? { protocol: options.protocol } : {}),
|
|
61
|
-
...(options.refresh === undefined ? {} : { refresh: options.refresh }),
|
|
62
|
-
...(options.login === undefined ? {} : { login: options.login }),
|
|
63
|
-
});
|
|
64
|
-
return {
|
|
65
|
-
modelId: route.modelId,
|
|
66
|
-
...(route.endpoint?.name ? { endpointName: route.endpoint.name } : {}),
|
|
67
|
-
...(route.endpoint?.task ? { endpointTask: route.endpoint.task } : {}),
|
|
68
|
-
...(route.endpoint?.dimension ? { endpointDimension: route.endpoint.dimension } : {}),
|
|
69
|
-
source: route.source,
|
|
70
|
-
protocol: route.protocol,
|
|
71
|
-
host: route.host,
|
|
72
|
-
apiBase: route.apiBase,
|
|
73
|
-
url: route.url,
|
|
74
|
-
headers: { ...route.headers },
|
|
75
|
-
metadata: route.metadata,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
11
|
+
export { createModelClient } from "./model-client.ts";
|