@dbx-tools/model 0.6.62 → 0.6.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/lib/src/resolve.d.ts +2 -0
- package/lib/src/resolve.js +31 -3
- package/lib/src/serving.d.ts +2 -0
- package/lib/src/serving.js +2 -1
- package/package.json +4 -4
- package/src/resolve.ts +35 -2
- package/src/serving.ts +3 -0
package/README.md
CHANGED
|
@@ -21,6 +21,8 @@ Key features:
|
|
|
21
21
|
endpoint id.
|
|
22
22
|
- Supports class ceilings so callers can ask for a capability band without
|
|
23
23
|
accidentally escalating to a larger model.
|
|
24
|
+
- Supports `requiresTools` filtering so agent/model-proxy callers select only
|
|
25
|
+
endpoints verified for a complete function-call and result-replay round-trip.
|
|
24
26
|
- Caches enriched catalogues per workspace host through AppKit cache utilities,
|
|
25
27
|
and re-lists once on a resolve miss so a newly deployed model still resolves.
|
|
26
28
|
- Builds the invocations URL and mints per-request auth headers for callers that
|
|
@@ -80,6 +82,7 @@ import { resolve } from "@dbx-tools/model";
|
|
|
80
82
|
const ranked = await resolve.searchModels(client, host, {
|
|
81
83
|
search: "opus",
|
|
82
84
|
modelClass: "chat-thinking",
|
|
85
|
+
requiresTools: true,
|
|
83
86
|
limit: 5,
|
|
84
87
|
});
|
|
85
88
|
```
|
|
@@ -101,6 +104,7 @@ const ranked = resolve.rankModels(endpoints, { search: "sonnet", limit: 3 });
|
|
|
101
104
|
const picked = resolve.resolveModel(endpoints, {
|
|
102
105
|
explicit: "claude sonnet",
|
|
103
106
|
modelClass: "chat-balanced",
|
|
107
|
+
requiresTools: true,
|
|
104
108
|
});
|
|
105
109
|
```
|
|
106
110
|
|
package/lib/src/resolve.d.ts
CHANGED
|
@@ -38,6 +38,8 @@ export interface ResolveModelInput {
|
|
|
38
38
|
fuzzy?: boolean;
|
|
39
39
|
/** Fuse.js threshold forwarded to the fuzzy `search` match ({@link searchServingEndpoints}). */
|
|
40
40
|
threshold?: number;
|
|
41
|
+
/** Require a model that supports a complete function-tool round-trip. */
|
|
42
|
+
requiresTools?: boolean;
|
|
41
43
|
/**
|
|
42
44
|
* Chat capability class to resolve when no `explicit` id is given. The live
|
|
43
45
|
* catalogue is classified by its Foundation Model API scores and the top
|
package/lib/src/resolve.js
CHANGED
|
@@ -57,8 +57,11 @@ export function rankModels(endpoints, query = {}) {
|
|
|
57
57
|
// class; bucket order is already best-first.
|
|
58
58
|
const candidates = [];
|
|
59
59
|
for (const modelClass of eligible) {
|
|
60
|
-
for (const endpoint of classified[modelClass])
|
|
60
|
+
for (const endpoint of classified[modelClass]) {
|
|
61
|
+
if (query.requiresTools && !classify.endpointCapabilities(endpoint).tools)
|
|
62
|
+
continue;
|
|
61
63
|
candidates.push({ endpoint, modelClass });
|
|
64
|
+
}
|
|
62
65
|
}
|
|
63
66
|
const search = query.search?.trim();
|
|
64
67
|
let ranked;
|
|
@@ -101,6 +104,7 @@ export function rankModelId(endpoints, search, options = {}) {
|
|
|
101
104
|
search,
|
|
102
105
|
limit: 1,
|
|
103
106
|
...(options.threshold !== undefined ? { threshold: options.threshold } : {}),
|
|
107
|
+
...(options.requiresTools !== undefined ? { requiresTools: options.requiresTools } : {}),
|
|
104
108
|
});
|
|
105
109
|
if (!top)
|
|
106
110
|
return { modelId: search, matched: false };
|
|
@@ -179,15 +183,22 @@ export async function selectModel(client, host, input = {}) {
|
|
|
179
183
|
export function resolveModel(endpoints, input = {}) {
|
|
180
184
|
if (input.explicit !== undefined) {
|
|
181
185
|
if (input.fuzzy === false) {
|
|
186
|
+
if (input.requiresTools)
|
|
187
|
+
assertToolSupport(endpoints, input.explicit);
|
|
182
188
|
return { modelId: input.explicit, source: "explicit" };
|
|
183
189
|
}
|
|
184
190
|
const [top] = rankModels(endpoints, buildQuery(input, input.explicit));
|
|
191
|
+
if (input.requiresTools && !top) {
|
|
192
|
+
throw new Error(`No tool-capable model matches "${input.explicit}"`);
|
|
193
|
+
}
|
|
185
194
|
return { modelId: top?.endpoint.name ?? input.explicit, source: "fuzzy-match" };
|
|
186
195
|
}
|
|
187
196
|
// Operator-pinned fallbacks win when present and live (e.g. a regulated
|
|
188
197
|
// workspace restricted to an approved subset).
|
|
189
198
|
if (input.modelClass === undefined && input.fallbacks && input.fallbacks.length > 0) {
|
|
190
|
-
const present = new Set(endpoints
|
|
199
|
+
const present = new Set(endpoints
|
|
200
|
+
.filter((endpoint) => !input.requiresTools || classify.endpointCapabilities(endpoint).tools)
|
|
201
|
+
.map((endpoint) => endpoint.name));
|
|
191
202
|
const pinned = input.fallbacks.find((id) => present.has(id));
|
|
192
203
|
if (pinned)
|
|
193
204
|
return { modelId: pinned, source: "fallback" };
|
|
@@ -199,6 +210,15 @@ export function resolveModel(endpoints, input = {}) {
|
|
|
199
210
|
// Live catalogue yielded nothing in range: walk the static floor.
|
|
200
211
|
const floorSource = input.modelClass !== undefined ? modelsForClass(input.modelClass) : (input.fallbacks ?? []);
|
|
201
212
|
const floor = object.sequence(floorSource).concat(FALLBACK_MODEL_IDS).distinct().toArray();
|
|
213
|
+
if (input.requiresTools) {
|
|
214
|
+
const available = new Set(endpoints
|
|
215
|
+
.filter((endpoint) => classify.endpointCapabilities(endpoint).tools)
|
|
216
|
+
.map((endpoint) => endpoint.name));
|
|
217
|
+
const selected = floor.find((id) => available.has(id));
|
|
218
|
+
if (!selected)
|
|
219
|
+
throw new Error("No tool-capable model is available");
|
|
220
|
+
return { modelId: selected, source };
|
|
221
|
+
}
|
|
202
222
|
return { modelId: pickFirstAvailable(floor, endpoints), source };
|
|
203
223
|
}
|
|
204
224
|
/** Build a {@link ModelQuery} from {@link ResolveModelInput} for the `limit: 1` delegation. */
|
|
@@ -206,10 +226,18 @@ function buildQuery(input, search) {
|
|
|
206
226
|
return {
|
|
207
227
|
...(search !== undefined ? { search } : {}),
|
|
208
228
|
...(input.modelClass !== undefined ? { modelClass: input.modelClass } : {}),
|
|
229
|
+
...(input.requiresTools !== undefined ? { requiresTools: input.requiresTools } : {}),
|
|
209
230
|
...(input.threshold !== undefined ? { threshold: input.threshold } : {}),
|
|
210
231
|
limit: 1,
|
|
211
232
|
};
|
|
212
233
|
}
|
|
234
|
+
/** Throw when an explicit id is absent or not verified for function tools. */
|
|
235
|
+
function assertToolSupport(endpoints, modelId) {
|
|
236
|
+
const endpoint = endpoints.find((candidate) => candidate.name === modelId);
|
|
237
|
+
if (!endpoint || !classify.endpointCapabilities(endpoint).tools) {
|
|
238
|
+
throw new Error(`Model "${modelId}" does not support function tools`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
213
241
|
/**
|
|
214
242
|
* Find the first id in `candidates` whose endpoint is present in `endpoints`.
|
|
215
243
|
* Returns the top candidate when the workspace has none of them so callers
|
|
@@ -224,4 +252,4 @@ function pickFirstAvailable(candidates, endpoints) {
|
|
|
224
252
|
}
|
|
225
253
|
return candidates[0] ?? FALLBACK_MODEL_IDS[0];
|
|
226
254
|
}
|
|
227
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsUUFBUSxHQUtULE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixzQkFBc0IsR0FJdkIsTUFBTSxjQUFjLENBQUM7QUFxRHRCOzs7OztHQUtHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBeUI7SUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUU7SUFFdEIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO0lBRXpGLHlFQUF5RTtJQUN6RSw2Q0FBNkM7SUFDN0MsTUFBTSxVQUFVLEdBQWtCLEVBQUUsQ0FBQztJQUNyQyxLQUFLLE1BQU0sVUFBVSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLEtBQUssTUFBTSxRQUFR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LENBQUM7QUFDbkUsQ0FBQztBQUVELCtGQUErRjtBQUMvRixTQUFTLFVBQVUsQ0FBQyxLQUF3QixFQUFFLE1BQTBCO0lBQ3RFLE9BQU87UUFDTCxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0UsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4RSxLQUFLLEVBQUUsQ0FBQztLQUNULENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixVQUE2QixFQUM3QixTQUE0QztJQUU1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFFLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV29ya3NwYWNlLWF3YXJlIG1vZGVsIHNlbGVjdGlvbi5cbiAqXG4gKiBHaXZlbiBhIGNhbGxlcidzIGludGVudCAtIGEgc2VhcmNoIHN0cmluZywgYSBjYXBhYmlsaXR5IHtAbGluayBNb2RlbENsYXNzfVxuICogY2VpbGluZywgYm90aCwgb3Igbm90aGluZyAtIHRoZSB0b29sa2l0IHJldHVybnMgbWF0Y2hpbmcgZW5kcG9pbnRzIHJhbmtlZCBieVxuICogbWF0Y2ggcXVhbGl0eSB0aGVuIGNsYXNzLCBvciBjb2xsYXBzZXMgdG8gdGhlIHNpbmdsZSBiZXN0IGlkIHRoZSB3b3Jrc3BhY2VcbiAqIGFjdHVhbGx5IGhhcywgZGVncmFkaW5nIGZyb20gXCJiZXN0IGluIHJhbmdlXCIgZG93biB0byB0aGUgc3RhdGljIGZhbGxiYWNrXG4gKiBmbG9vci4gU2VsZWN0aW9uIGlzIGNoYXQtb25seTogZW1iZWRkaW5nIGVuZHBvaW50cyBzdXJmYWNlIG9ubHkgd2hlblxuICogYG1vZGVsQ2xhc3NgIGlzIGV4cGxpY2l0bHkge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfS5cbiAqXG4gKiBUd28gc2hhcGVzIG9mIHNlbGVjdGlvbiwgZWFjaCBpbiBhIHB1cmUgZm9ybSAob3ZlciBhbiBlbmRwb2ludCBsaXN0IHRoZVxuICogY2FsbGVyIGFscmVhZHkgaG9sZHMpIGFuZCBhbiBJL08gd3JhcHBlciAodGhhdCBsaXN0cyBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICogZmlyc3QpOiByYW5raW5nLCB3aGljaCByZXR1cm5zIGEgbWF0Y2gtIHRoZW4gY2xhc3Mtb3JkZXJlZCBsaXN0LCBhbmRcbiAqIHNpbmdsZS1zZWxlY3Rpb24sIHdoaWNoIGNvbGxhcHNlcyB0byBvbmUgaWQgcGx1cyBob3cgaXQgd2FzIHJlYWNoZWQgYW5kXG4gKiBsYXllcnMgdGhlIG9wZXJhdG9yLXBpbm5lZCBmYWxsYmFjayAvIHN0YXRpYy1mbG9vciBzYWZldHkgbmV0IG9uIHRvcC4gQSBjaGF0XG4gKiBgbW9kZWxDbGFzc2AgYWN0cyBhcyBhIGNlaWxpbmc6IHRoYXQgYmFuZCBhbmQgdGhlIGxlc3MtY2FwYWJsZSBjaGF0IGJhbmRzXG4gKiBiZWxvdyBpdCBhcmUgZWxpZ2libGUgKHNlZSB7QGxpbmsgY2xhc3Nlc0F0T3JCZWxvd30pLCBzbyBhIGBjaGF0LWJhbGFuY2VkYFxuICogYXNrIGNhbiBmYWxsIHRvIGBjaGF0LWZhc3RgIGJ1dCBuZXZlciBlc2NhbGF0ZSB0byBgY2hhdC10aGlua2luZ2AuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBjbGFzc2lmeSxcbiAgbW9kZWwsXG4gIHR5cGUgTW9kZWxRdWVyeSxcbiAgdHlwZSBSYW5rZWRNb2RlbCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcblxuaW1wb3J0IHsgQ0hBVF9DTEFTU19PUkRFUiwgY2xhc3Nlc0F0T3JCZWxvdywgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9jbGFzc2VzLnRzXCI7XG5pbXBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMsIG1vZGVsc0ZvckNsYXNzIH0gZnJvbSBcIi4vZmFsbGJhY2sudHNcIjtcbmltcG9ydCB7XG4gIGxpc3RTZXJ2aW5nRW5kcG9pbnRzLFxuICBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzLFxuICB0eXBlIFJlc29sdmVkTW9kZWwsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsT3B0aW9ucyxcbiAgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IG1vZGVsLk1vZGVsQ2xhc3M7XG5cbi8qKiBDYWxsZXIgaW50ZW50IHBhc3NlZCB0byB7QGxpbmsgcmVzb2x2ZU1vZGVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZU1vZGVsSW5wdXQge1xuICAvKipcbiAgICogRXhwbGljaXQgbW9kZWwgaWQgLyBsb29zZSBuYW1lIChwZXItcmVxdWVzdCBvdmVycmlkZSwgYWdlbnQgLyBwbHVnaW5cbiAgICogZGVmYXVsdCwgb3IgZW52IHZhcikuIFdoZW4gc2V0IGl0IHdpbnMgb3ZlciBgbW9kZWxDbGFzc2AgYW5kIGBmYWxsYmFja3NgLlxuICAgKi9cbiAgZXhwbGljaXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdXp6eS1tYXRjaCBhbiBgZXhwbGljaXRgIG5hbWUgYWdhaW5zdCB0aGUgbGl2ZSBjYXRhbG9ndWUgc28gbG9vc2UgbmFtZXNcbiAgICogbGlrZSBgXCJjbGF1ZGUgc29ubmV0XCJgIHJlc29sdmUuIERlZmF1bHQgYHRydWVgLiBXaGVuIGBmYWxzZWAgdGhlIGV4cGxpY2l0XG4gICAqIGlucHV0IGlzIHJldHVybmVkIHZlcmJhdGltIChEYXRhYnJpY2tzIHN1cmZhY2VzIHRoZSBjYW5vbmljYWwgNDA0IGlmIGl0XG4gICAqIGRvZXNuJ3QgZXhpc3QpLlxuICAgKi9cbiAgZnV6enk/OiBib29sZWFuO1xuICAvKiogRnVzZS5qcyB0aHJlc2hvbGQgZm9yd2FyZGVkIHRvIHRoZSBmdXp6eSBgc2VhcmNoYCBtYXRjaCAoe0BsaW5rIHNlYXJjaFNlcnZpbmdFbmRwb2ludHN9KS4gKi9cbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICAvKipcbiAgICogQ2hhdCBjYXBhYmlsaXR5IGNsYXNzIHRvIHJlc29sdmUgd2hlbiBubyBgZXhwbGljaXRgIGlkIGlzIGdpdmVuLiBUaGUgbGl2ZVxuICAgKiBjYXRhbG9ndWUgaXMgY2xhc3NpZmllZCBieSBpdHMgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmVzIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgKGFuZCB0aGUgY2hhdCBiYW5kcyBiZWxvdyBpdCkgd2lucywgZmFsbGluZ1xuICAgKiBiYWNrIHRvIHRoZSBjbGFzcydzIHNtYWxsIHN0YXRpYyBsaXN0LlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG4gIC8qKlxuICAgKiBPcGVyYXRvci1zdXBwbGllZCBmYWxsYmFjayBpZHMgdHJpZWQgKmZpcnN0KiBpbiB0aGUgbm8tZXhwbGljaXQsIG5vLWNsYXNzXG4gICAqIHBhdGggKGUuZy4gYSByZWd1bGF0ZWQgd29ya3NwYWNlIHBpbm5lZCB0byBhbiBhcHByb3ZlZCBzdWJzZXQpLCBhaGVhZCBvZlxuICAgKiB0aGUgYXV0by1jbGFzc2lmaWVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIGZhbGxiYWNrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKiogT3V0Y29tZSBvZiB7QGxpbmsgcmVzb2x2ZU1vZGVsfTogdGhlIGNob3NlbiBpZCBwbHVzIGhvdyBpdCB3YXMgcmVhY2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbiB7XG4gIG1vZGVsSWQ6IHN0cmluZztcbiAgc291cmNlOiBcImV4cGxpY2l0XCIgfCBcImZ1enp5LW1hdGNoXCIgfCBcImNsYXNzXCIgfCBcImZhbGxiYWNrXCI7XG59XG5cbi8qKiBJbnRlbnQgKyBjYXRhbG9ndWUga25vYnMgcGFzc2VkIHRvIHtAbGluayBzZWxlY3RNb2RlbH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE1vZGVsSW5wdXQgZXh0ZW5kcyBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIC8qKiBUVEwgb3ZlcnJpZGUgZm9yIHRoZSBjYWNoZWQgYC9zZXJ2aW5nLWVuZHBvaW50c2AgbGlzdGluZywgaW4gbXMuICovXG4gIHR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogVFRMIG92ZXJyaWRlIG1lcmdlZCBpbnRvIGEge0BsaW5rIE1vZGVsUXVlcnl9IGZvciB7QGxpbmsgc2VhcmNoTW9kZWxzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoTW9kZWxzSW5wdXQgZXh0ZW5kcyBNb2RlbFF1ZXJ5IHtcbiAgLyoqIFRUTCBvdmVycmlkZSBmb3IgdGhlIGNhY2hlZCBgL3NlcnZpbmctZW5kcG9pbnRzYCBsaXN0aW5nLCBpbiBtcy4gKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUm91bmQgYSBGdXNlIHNjb3JlIHRvIHRoZSBkaXNwbGF5IHByZWNpc2lvbiBzbyB2ZXJzaW9uIHNpYmxpbmdzIHRoYXQgbWF0Y2ggYVxuICogdG9rZW4gaWRlbnRpY2FsbHkgKGUuZy4gYG9wdXMtNC03YCB2cyBgb3B1cy00LThgIGZvciB0aGUgcXVlcnkgYFwib3B1c1wiYCkgdGllXG4gKiBvbiBtYXRjaCBhbmQgbGV0IHRoZSBjbGFzcyAvIHdpdGhpbi1jbGFzcyByYW5rIGRlY2lkZSAtIHdoaWNoIGlzIHdoYXRcbiAqIHN1cmZhY2VzIHRoZSBuZXdlciwgaGlnaGVyLXF1YWxpdHkgc2libGluZy5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hCdWNrZXQoc2NvcmU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKChzY29yZSA/PyAwKSAqIDEwMDApO1xufVxuXG4vKipcbiAqIFJhbmsgdGhlIGxpdmUgY2F0YWxvZ3VlIGFnYWluc3QgYSB7QGxpbmsgTW9kZWxRdWVyeX0sIGJlc3QtZmlyc3QuXG4gKlxuICogQ2FuZGlkYXRlcyBhcmUgdGhlIGNsYXNzaWZpZWQgZW5kcG9pbnRzIGluIHRoZSBlbGlnaWJsZSBjbGFzc2VzOlxuICoge0BsaW5rIGNsYXNzZXNBdE9yQmVsb3d9IHRoZSByZXF1ZXN0ZWQgYG1vZGVsQ2xhc3NgLCBvciAtIHdoZW4gbm9uZSBpcyBnaXZlblxuICogLSB0aGUgY2hhdCBiYW5kcyBvbmx5ICh7QGxpbmsgQ0hBVF9DTEFTU19PUkRFUn0pLCBzbyBhIGdlbmVyYWwgYXNrIG5ldmVyXG4gKiBzdXJmYWNlcyBhbiBlbWJlZGRpbmcgZW5kcG9pbnQuIEVhY2ggY2xhc3MgYnVja2V0IGlzIGFscmVhZHkgYmVzdC1maXJzdCBmcm9tXG4gKiB7QGxpbmsgY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHN9LiBSYW5raW5nIGlzICoqbWF0Y2ggdGhlbiBjbGFzcyoqOlxuICpcbiAqIDEuIFdpdGggYSBgc2VhcmNoYCwgb25seSBlbmRwb2ludHMgbWF0Y2hpbmcgaXQgc3Vydml2ZSwgb3JkZXJlZCBieSBtYXRjaFxuICogICAgZGlzdGFuY2UgKGJ1Y2tldGVkIHZpYSB7QGxpbmsgbWF0Y2hCdWNrZXR9IHNvIG5lYXItaWRlbnRpY2FsIHNjb3JlcyB0aWUpLFxuICogICAgdGhlbiBieSBjbGFzcyAobW9yZSBjYXBhYmxlIGZpcnN0KSwgdGhlbiBieSB0aGUgc3RhYmxlIHdpdGhpbi1jbGFzcyByYW5rLlxuICogMi4gV2l0aG91dCBhIGBzZWFyY2hgLCB0aGUgY2xhc3MtdGhlbi1yYW5rIGNhbmRpZGF0ZSBvcmRlciBzdGFuZHMuXG4gKlxuICogQSBgbGltaXRgIHRydW5jYXRlcyB0aGUgcmVzdWx0LiBSZXR1cm5zIGBbXWAgd2hlbiBub3RoaW5nIGlzIGVsaWdpYmxlIG9yXG4gKiBtYXRjaGVzIC0gY2FsbGVycyBsYXllciB0aGVpciBvd24gZmFsbGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5rTW9kZWxzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgcXVlcnk6IE1vZGVsUXVlcnkgPSB7fSxcbik6IFJhbmtlZE1vZGVsW10ge1xuICBjb25zdCBjbGFzc2lmaWVkID0gY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHMoZW5kcG9pbnRzKTtcbiAgY29uc3QgZWxpZ2libGUgPVxuICAgIHF1ZXJ5Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IGNsYXNzZXNBdE9yQmVsb3cocXVlcnkubW9kZWxDbGFzcykgOiBDSEFUX0NMQVNTX09SREVSO1xuXG4gIC8vIEZsYXR0ZW4gZWxpZ2libGUgY2xhc3NlcyBpbiBjYXBhYmlsaXR5IG9yZGVyLCBjYXJyeWluZyBlYWNoIGVuZHBvaW50J3NcbiAgLy8gY2xhc3M7IGJ1Y2tldCBvcmRlciBpcyBhbHJlYWR5IGJlc3QtZmlyc3QuXG4gIGNvbnN0IGNhbmRpZGF0ZXM6IFJhbmtlZE1vZGVsW10gPSBbXTtcbiAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIGVsaWdpYmxlKSB7XG4gICAgZm9yIChjb25zdCBlbmRwb2ludCBvZiBjbGFzc2lmaWVkW21vZGVsQ2xhc3NdKSBjYW5kaWRhdGVzLnB1c2goeyBlbmRwb2ludCwgbW9kZWxDbGFzcyB9KTtcbiAgfVxuXG4gIGNvbnN0IHNlYXJjaCA9IHF1ZXJ5LnNlYXJjaD8udHJpbSgpO1xuICBsZXQgcmFua2VkOiBSYW5rZWRNb2RlbFtdO1xuICBpZiAoc2VhcmNoKSB7XG4gICAgY29uc3Qgc2NvcmVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoXG4gICAgICBzZWFyY2gsXG4gICAgICBjYW5kaWRhdGVzLm1hcCgoYykgPT4gYy5lbmRwb2ludCksXG4gICAgICBxdWVyeS50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBxdWVyeS50aHJlc2hvbGQgfSA6IHt9LFxuICAgICkpIHtcbiAgICAgIHNjb3Jlcy5zZXQobWF0Y2guZW5kcG9pbnQubmFtZSwgbWF0Y2guc2NvcmUpO1xuICAgIH1cbiAgICAvLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGlzIHN0YWJsZSwgc28gZW5kcG9pbnRzIGVxdWFsIG9uIG1hdGNoIGFuZCBjbGFzc1xuICAgIC8vIGtlZXAgdGhlaXIgYmVzdC1maXJzdCB3aXRoaW4tY2xhc3Mgb3JkZXIuXG4gICAgcmFua2VkID0gY2FuZGlkYXRlc1xuICAgICAgLmZpbHRlcigoYykgPT4gc2NvcmVzLmhhcyhjLmVuZHBvaW50Lm5hbWUpKVxuICAgICAgLm1hcCgoYykgPT4gKHsgLi4uYywgc2NvcmU6IHNjb3Jlcy5nZXQoYy5lbmRwb2ludC5uYW1lKSB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5TWF0Y2ggPSBtYXRjaEJ1Y2tldChhLnNjb3JlKSAtIG1hdGNoQnVja2V0KGIuc2NvcmUpO1xuICAgICAgICBpZiAoYnlNYXRjaCAhPT0gMCkgcmV0dXJuIGJ5TWF0Y2g7XG4gICAgICAgIHJldHVybiBNT0RFTF9DTEFTU19PUkRFUi5pbmRleE9mKGEubW9kZWxDbGFzcykgLSBNT0RFTF9DTEFTU19PUkRFUi5pbmRleE9mKGIubW9kZWxDbGFzcyk7XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByYW5rZWQgPSBjYW5kaWRhdGVzO1xuICB9XG5cbiAgcmV0dXJuIHF1ZXJ5LmxpbWl0ICE9PSB1bmRlZmluZWQgPyByYW5rZWQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgcXVlcnkubGltaXQpKSA6IHJhbmtlZDtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZSB7QGxpbmsgcmFua01vZGVsc30gdG8gYSBzaW5nbGUgaWQ6IHRoZSBjbG9zZXN0IGVuZHBvaW50IHRvIGBzZWFyY2hgXG4gKiBpbiBhIGNhdGFsb2d1ZSBzbmFwc2hvdCwgb3IgdGhlIGlucHV0IHZlcmJhdGltIHdoZW4gbm90aGluZyBzY29yZXMgd2l0aGluIHRoZVxuICogdGhyZXNob2xkLlxuICpcbiAqIFRoZSByYW5rLWJhc2VkIGNvdW50ZXJwYXJ0IHRvIHRoZSBGdXNlLW9ubHkge0BsaW5rIHJlc29sdmVNb2RlbElkfTogZXF1YWxcbiAqIG1hdGNoIHNjb3JlcyBhcmUgYnJva2VuIGJ5IGNsYXNzIGFuZCB0aGVuIHdpdGhpbi1jbGFzcyB2ZXJzaW9uLCBzbyBhIGxvb3NlXG4gKiBgXCJvcHVzXCJgIHByZWZlcnMgYG9wdXMtNWAgb3ZlciBgb3B1cy00LTdgIGluc3RlYWQgb2YgcGlja2luZyB3aGljaGV2ZXJcbiAqIHNpYmxpbmcgRnVzZSBoYXBwZW5lZCB0byBvcmRlciBmaXJzdC4gUmV0dXJuaW5nIHRoZSBpbnB1dCB1bm1hdGNoZWQgKHJhdGhlclxuICogdGhhbiBhIG5lYXIgbmVpZ2hib3VyKSBpcyBkZWxpYmVyYXRlIC0gYSBkZWxpYmVyYXRlIGVuZHBvaW50IGlkIGlzIG5ldmVyXG4gKiBzaWxlbnRseSByZXdyaXR0ZW4sIGFuZCBEYXRhYnJpY2tzIHN1cmZhY2VzIGEgY2xlYW4gNDA0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFua01vZGVsSWQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBzZWFyY2g6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbCB7XG4gIGNvbnN0IFt0b3BdID0gcmFua01vZGVscyhlbmRwb2ludHMsIHtcbiAgICBzZWFyY2gsXG4gICAgbGltaXQ6IDEsXG4gICAgLi4uKG9wdGlvbnMudGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHRocmVzaG9sZDogb3B0aW9ucy50aHJlc2hvbGQgfSA6IHt9KSxcbiAgfSk7XG4gIGlmICghdG9wKSByZXR1cm4geyBtb2RlbElkOiBzZWFyY2gsIG1hdGNoZWQ6IGZhbHNlIH07XG4gIHJldHVybiB7IG1vZGVsSWQ6IHRvcC5lbmRwb2ludC5uYW1lLCBtYXRjaGVkOiB0cnVlLCBzY29yZTogdG9wLnNjb3JlIH07XG59XG5cbi8qKlxuICoge0BsaW5rIHJhbmtNb2RlbElkfSBhZ2FpbnN0IGEgY2F0YWxvZ3VlIHRoZSBjYWxsZXIgbWF5IGJlIGhvbGRpbmcgc3RhbGU6XG4gKiBtYXRjaCB0aGUgbG9hZGVkIHNuYXBzaG90LCBhbmQgb24gYSBtaXNzIHJlbG9hZCBvbmNlIHdpdGggYGZvcmNlYCBhbmQgbWF0Y2hcbiAqIGFnYWluLiBUaGF0IHdheSBhIG1vZGVsIGRlcGxveWVkIGFmdGVyIHRoZSBjYXRhbG9ndWUgd2FzIGNhY2hlZCBzdGlsbFxuICogcmVzb2x2ZXMgb24gZmlyc3QgdXNlLCB3aXRob3V0IGEgcmVzdGFydCBhbmQgd2l0aG91dCBnaXZpbmcgdXAgY2FjaGluZy5cbiAqXG4gKiBUaGUgY2F0YWxvZ3VlIGFycml2ZXMgYXMgYSBsb2FkZXIgcmF0aGVyIHRoYW4gYSBjbGllbnQgc28gdGhlIGNhbGxlciBrZWVwc1xuICogb3duZXJzaGlwIG9mICpob3cqIGl0IGlzIGNhY2hlZCAtIHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gYW5kIGl0c1xuICogYENhY2hlTWFuYWdlcmAsIGEgcGxhaW4gcHJvY2Vzcy1saWZldGltZSBmaWVsZCBpbiBhIENMSSwgb3IgYSB0ZXN0IGRvdWJsZS5cbiAqIE9ubHkgb25lIHJlbG9hZCBpcyBhdHRlbXB0ZWQ6IGEgZ2VudWluZWx5IHVua25vd24gbmFtZSBzaG91bGQgZmFpbCBmYXN0XG4gKiByYXRoZXIgdGhhbiByZS1saXN0IG9uIGV2ZXJ5IHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGxvYWQgLSBSZXR1cm5zIHRoZSBjYXRhbG9ndWU7IGBmb3JjZWAgYXNrcyBpdCB0byBieXBhc3MgaXRzIGNhY2hlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmFua01vZGVsSWRMaXZlKFxuICBsb2FkOiAoZm9yY2U6IGJvb2xlYW4pID0+IFByb21pc2U8cmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPixcbiAgc2VhcmNoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVNb2RlbE9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8UmVzb2x2ZWRNb2RlbD4ge1xuICBjb25zdCByZXNvbHZlZCA9IHJhbmtNb2RlbElkKGF3YWl0IGxvYWQoZmFsc2UpLCBzZWFyY2gsIG9wdGlvbnMpO1xuICBpZiAocmVzb2x2ZWQubWF0Y2hlZCkgcmV0dXJuIHJlc29sdmVkO1xuICByZXR1cm4gcmFua01vZGVsSWQoYXdhaXQgbG9hZCh0cnVlKSwgc2VhcmNoLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSYW5rIGEgd29ya3NwYWNlJ3MgY2F0YWxvZ3VlIGluIG9uZSBjYWxsOiBsaXN0IGl0cyBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICogKGNhY2hlZCkgYW5kIHJ1biB7QGxpbmsgcmFua01vZGVsc30gb3ZlciB0aGUgcmVzdWx0LiBUaGUgbGlzdCBjb3VudGVycGFydCB0b1xuICoge0BsaW5rIHNlbGVjdE1vZGVsfSwgZm9yIGEgY29uc3VtZXIgdGhhdCB3YW50cyB0aGUgZnVsbCByYW5rZWQgc2V0IChhIG1vZGVsXG4gKiBwaWNrZXIsIGEgQ0xJKSByYXRoZXIgdGhhbiBhIHNpbmdsZSBpZC4gQ2F0YWxvZ3VlIGZldGNoZXMgZmFpbCBsb3VkOiBuZXR3b3JrXG4gKiAvIGF1dGggZXJyb3JzIHByb3BhZ2F0ZSBzbyB0aGUgY2FsbGVyIHNlZXMgdGhlIHJlYWwgU0RLIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGhvc3QgLSBXb3Jrc3BhY2UgaG9zdCB1c2VkIGFzIHRoZSBjYWNoZSBrZXkuIFBhc3MgdGhlIHZhbHVlIHJlc29sdmVkXG4gKiAgIGZyb20gYGNsaWVudC5jb25maWcuZ2V0SG9zdCgpYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaE1vZGVscyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBob3N0OiBzdHJpbmcsXG4gIGlucHV0OiBTZWFyY2hNb2RlbHNJbnB1dCA9IHt9LFxuKTogUHJvbWlzZTxSYW5rZWRNb2RlbFtdPiB7XG4gIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RTZXJ2aW5nRW5kcG9pbnRzKFxuICAgIGNsaWVudCxcbiAgICBob3N0LFxuICAgIGlucHV0LnR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBpbnB1dC50dGxNcyB9IDoge30sXG4gICk7XG4gIHJldHVybiByYW5rTW9kZWxzKGVuZHBvaW50cywgaW5wdXQpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBtb2RlbCBpZCBmb3IgYSB3b3Jrc3BhY2UgaW4gb25lIGNhbGw6IGxpc3QgaXRzIGAvc2VydmluZy1lbmRwb2ludHNgXG4gKiAoY2FjaGVkKSBhbmQgcnVuIHtAbGluayByZXNvbHZlTW9kZWx9IG92ZXIgdGhlIHJlc3VsdC4gVGhpcyBpcyB0aGUgZW50cnlcbiAqIHBvaW50IGZvciBhbnkgY29uc3VtZXIgdGhhdCBob2xkcyBhIGBXb3Jrc3BhY2VDbGllbnRgIGFuZCBqdXN0IHdhbnRzIGEgdXNhYmxlXG4gKiBtb2RlbCBuYW1lIC0gYSBMYWtlZmxvdyBqb2IsIGEgb25lLW9mZiBzY3JpcHQsIG9yIHRoZSBNYXN0cmEgcGx1Z2luIGFsaWtlLlxuICpcbiAqIENoZWFwIGV4aXQ6IHdoZW4gYW4gYGV4cGxpY2l0YCBuYW1lIGlzIGdpdmVuIGFuZCBgZnV6enlgIGlzIG9mZiwgdGhlXG4gKiBjYXRhbG9ndWUgaXMgbmV2ZXIgZmV0Y2hlZCAtIHRoZSBuYW1lIGlzIHJldHVybmVkIHZlcmJhdGltIGFuZCBEYXRhYnJpY2tzXG4gKiBzdXJmYWNlcyB0aGUgY2Fub25pY2FsIDQwNCBpZiBpdCBkb2Vzbid0IGV4aXN0LiBDYXRhbG9ndWUgZmV0Y2hlcyBvdGhlcndpc2VcbiAqIGZhaWwgbG91ZDogbmV0d29yayAvIGF1dGggZXJyb3JzIHByb3BhZ2F0ZSBzbyB0aGUgY2FsbGVyIHNlZXMgdGhlIHJlYWwgU0RLXG4gKiBtZXNzYWdlIGluc3RlYWQgb2YgYSBzaWxlbnQgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIGhvc3QgLSBXb3Jrc3BhY2UgaG9zdCB1c2VkIGFzIHRoZSBjYWNoZSBrZXkuIFBhc3MgdGhlIHZhbHVlIHJlc29sdmVkXG4gKiAgIGZyb20gYGNsaWVudC5jb25maWcuZ2V0SG9zdCgpYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdE1vZGVsKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIGhvc3Q6IHN0cmluZyxcbiAgaW5wdXQ6IFNlbGVjdE1vZGVsSW5wdXQgPSB7fSxcbik6IFByb21pc2U8UmVzb2x2ZWRNb2RlbFNlbGVjdGlvbj4ge1xuICBpZiAoaW5wdXQuZXhwbGljaXQgIT09IHVuZGVmaW5lZCAmJiBpbnB1dC5mdXp6eSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4geyBtb2RlbElkOiBpbnB1dC5leHBsaWNpdCwgc291cmNlOiBcImV4cGxpY2l0XCIgfTtcbiAgfVxuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhjbGllbnQsIGhvc3QsIHtcbiAgICAuLi4oaW5wdXQudHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgdHRsTXM6IGlucHV0LnR0bE1zIH0gOiB7fSksXG4gIH0pO1xuICByZXR1cm4gcmVzb2x2ZU1vZGVsKGVuZHBvaW50cywgaW5wdXQpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBzaW5nbGUgbW9kZWwgaWQgZnJvbSB0aGUgbGl2ZSBjYXRhbG9ndWUgYW5kIGNhbGxlciBpbnRlbnQsXG4gKiBkZWxlZ2F0aW5nIHRoZSBsaXZlIHNlbGVjdGlvbiB0byB7QGxpbmsgcmFua01vZGVsc30gd2l0aCBgbGltaXQ6IDFgLlxuICpcbiAqIDEuICoqRXhwbGljaXQgYXNrKio6IHdpdGggYGZ1enp5YCBvZmYsIHJldHVybmVkIHZlcmJhdGltOyBvdGhlcndpc2VcbiAqICAgIGZ1enp5LXJhbmtlZCB3aXRoaW4gdGhlIChvcHRpb25hbCkgY2xhc3MgY2VpbGluZyBhbmQgdGhlIGJlc3QgdGFrZW4sXG4gKiAgICBmYWxsaW5nIGJhY2sgdG8gdGhlIGlucHV0IHZlcmJhdGltIHdoZW4gbm90aGluZyBtYXRjaGVzLlxuICogMi4gKipObyBleHBsaWNpdCBhc2sqKjogYW4gb3BlcmF0b3ItcGlubmVkIGBmYWxsYmFja2AgdGhhdCBleGlzdHMgaW4gdGhlIGxpdmVcbiAqICAgIGNhdGFsb2d1ZSB3aW5zIGZpcnN0OyB0aGVuIHRoZSByYW5rZWQgbGl2ZSBjYXRhbG9ndWUgKGNsYXNzIGNlaWxpbmdcbiAqICAgIGFwcGxpZWQpOyB0aGVuIHRoZSBzdGF0aWMge0BsaW5rIEZBTExCQUNLX01PREVMX0lEU30gZmxvb3Igd2hlbiB0aGVcbiAqICAgIGNhdGFsb2d1ZSB5aWVsZHMgbm90aGluZyBpbiByYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNb2RlbChcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIGlucHV0OiBSZXNvbHZlTW9kZWxJbnB1dCA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbiB7XG4gIGlmIChpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlucHV0LmZ1enp5ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHsgbW9kZWxJZDogaW5wdXQuZXhwbGljaXQsIHNvdXJjZTogXCJleHBsaWNpdFwiIH07XG4gICAgfVxuICAgIGNvbnN0IFt0b3BdID0gcmFua01vZGVscyhlbmRwb2ludHMsIGJ1aWxkUXVlcnkoaW5wdXQsIGlucHV0LmV4cGxpY2l0KSk7XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogdG9wPy5lbmRwb2ludC5uYW1lID8/IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZnV6enktbWF0Y2hcIiB9O1xuICB9XG5cbiAgLy8gT3BlcmF0b3ItcGlubmVkIGZhbGxiYWNrcyB3aW4gd2hlbiBwcmVzZW50IGFuZCBsaXZlIChlLmcuIGEgcmVndWxhdGVkXG4gIC8vIHdvcmtzcGFjZSByZXN0cmljdGVkIHRvIGFuIGFwcHJvdmVkIHN1YnNldCkuXG4gIGlmIChpbnB1dC5tb2RlbENsYXNzID09PSB1bmRlZmluZWQgJiYgaW5wdXQuZmFsbGJhY2tzICYmIGlucHV0LmZhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcHJlc2VudCA9IG5ldyBTZXQoZW5kcG9pbnRzLm1hcCgoZSkgPT4gZS5uYW1lKSk7XG4gICAgY29uc3QgcGlubmVkID0gaW5wdXQuZmFsbGJhY2tzLmZpbmQoKGlkKSA9PiBwcmVzZW50LmhhcyhpZCkpO1xuICAgIGlmIChwaW5uZWQpIHJldHVybiB7IG1vZGVsSWQ6IHBpbm5lZCwgc291cmNlOiBcImZhbGxiYWNrXCIgfTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IFwiY2xhc3NcIiA6IFwiZmFsbGJhY2tcIjtcbiAgY29uc3QgW3RvcF0gPSByYW5rTW9kZWxzKGVuZHBvaW50cywgYnVpbGRRdWVyeShpbnB1dCwgdW5kZWZpbmVkKSk7XG4gIGlmICh0b3ApIHJldHVybiB7IG1vZGVsSWQ6IHRvcC5lbmRwb2ludC5uYW1lLCBzb3VyY2UgfTtcblxuICAvLyBMaXZlIGNhdGFsb2d1ZSB5aWVsZGVkIG5vdGhpbmcgaW4gcmFuZ2U6IHdhbGsgdGhlIHN0YXRpYyBmbG9vci5cbiAgY29uc3QgZmxvb3JTb3VyY2UgPVxuICAgIGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IG1vZGVsc0ZvckNsYXNzKGlucHV0Lm1vZGVsQ2xhc3MpIDogKGlucHV0LmZhbGxiYWNrcyA/PyBbXSk7XG4gIGNvbnN0IGZsb29yID0gb2JqZWN0LnNlcXVlbmNlKGZsb29yU291cmNlKS5jb25jYXQoRkFMTEJBQ0tfTU9ERUxfSURTKS5kaXN0aW5jdCgpLnRvQXJyYXkoKTtcbiAgcmV0dXJuIHsgbW9kZWxJZDogcGlja0ZpcnN0QXZhaWxhYmxlKGZsb29yLCBlbmRwb2ludHMpLCBzb3VyY2UgfTtcbn1cblxuLyoqIEJ1aWxkIGEge0BsaW5rIE1vZGVsUXVlcnl9IGZyb20ge0BsaW5rIFJlc29sdmVNb2RlbElucHV0fSBmb3IgdGhlIGBsaW1pdDogMWAgZGVsZWdhdGlvbi4gKi9cbmZ1bmN0aW9uIGJ1aWxkUXVlcnkoaW5wdXQ6IFJlc29sdmVNb2RlbElucHV0LCBzZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZCk6IE1vZGVsUXVlcnkge1xuICByZXR1cm4ge1xuICAgIC4uLihzZWFyY2ggIT09IHVuZGVmaW5lZCA/IHsgc2VhcmNoIH0gOiB7fSksXG4gICAgLi4uKGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IHsgbW9kZWxDbGFzczogaW5wdXQubW9kZWxDbGFzcyB9IDoge30pLFxuICAgIC4uLihpbnB1dC50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBpbnB1dC50aHJlc2hvbGQgfSA6IHt9KSxcbiAgICBsaW1pdDogMSxcbiAgfTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBmaXJzdCBpZCBpbiBgY2FuZGlkYXRlc2Agd2hvc2UgZW5kcG9pbnQgaXMgcHJlc2VudCBpbiBgZW5kcG9pbnRzYC5cbiAqIFJldHVybnMgdGhlIHRvcCBjYW5kaWRhdGUgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBub25lIG9mIHRoZW0gc28gY2FsbGVyc1xuICogYWx3YXlzIGdldCBhIHN0cmluZzsgYW4gb2ZmbGluZSB3b3Jrc3BhY2UgdGhlbiByZWNlaXZlcyBhIGNsZWFuIDQwNCBmcm9tXG4gKiBEYXRhYnJpY2tzIGluc3RlYWQgb2YgYSBtYWxmb3JtZWQgY29uZmlnLlxuICovXG5mdW5jdGlvbiBwaWNrRmlyc3RBdmFpbGFibGUoXG4gIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KGVuZHBvaW50cy5tYXAoKGUpID0+IGUubmFtZSkpO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHByZXNlbnQuaGFzKGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gRkFMTEJBQ0tfTU9ERUxfSURTWzBdITtcbn1cbiJdfQ==
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsUUFBUSxHQUtULE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixzQkFBc0IsR0FJdkIsTUFBTSxjQUFjLENBQUM7QUF1RHRCOzs7OztHQUtHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBeUI7SUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUU7SUFFdEIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO0lBRXpGLHlFQUF5RTtJQUN6RSw2Q0FBNkM7SUFDN0MsTUFBTSxVQUFVLEdBQWtCLEVBQUUsQ0FBQztJQUNyQyxLQUFLLE1BQU0sVUFBVSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLEtBQUssTUFBTSxRQUFR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RSxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsT0FBTyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixVQUE2QixFQUM3QixTQUE0QztJQUU1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFFLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV29ya3NwYWNlLWF3YXJlIG1vZGVsIHNlbGVjdGlvbi5cbiAqXG4gKiBHaXZlbiBhIGNhbGxlcidzIGludGVudCAtIGEgc2VhcmNoIHN0cmluZywgYSBjYXBhYmlsaXR5IHtAbGluayBNb2RlbENsYXNzfVxuICogY2VpbGluZywgYm90aCwgb3Igbm90aGluZyAtIHRoZSB0b29sa2l0IHJldHVybnMgbWF0Y2hpbmcgZW5kcG9pbnRzIHJhbmtlZCBieVxuICogbWF0Y2ggcXVhbGl0eSB0aGVuIGNsYXNzLCBvciBjb2xsYXBzZXMgdG8gdGhlIHNpbmdsZSBiZXN0IGlkIHRoZSB3b3Jrc3BhY2VcbiAqIGFjdHVhbGx5IGhhcywgZGVncmFkaW5nIGZyb20gXCJiZXN0IGluIHJhbmdlXCIgZG93biB0byB0aGUgc3RhdGljIGZhbGxiYWNrXG4gKiBmbG9vci4gU2VsZWN0aW9uIGlzIGNoYXQtb25seTogZW1iZWRkaW5nIGVuZHBvaW50cyBzdXJmYWNlIG9ubHkgd2hlblxuICogYG1vZGVsQ2xhc3NgIGlzIGV4cGxpY2l0bHkge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfS5cbiAqXG4gKiBUd28gc2hhcGVzIG9mIHNlbGVjdGlvbiwgZWFjaCBpbiBhIHB1cmUgZm9ybSAob3ZlciBhbiBlbmRwb2ludCBsaXN0IHRoZVxuICogY2FsbGVyIGFscmVhZHkgaG9sZHMpIGFuZCBhbiBJL08gd3JhcHBlciAodGhhdCBsaXN0cyBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICogZmlyc3QpOiByYW5raW5nLCB3aGljaCByZXR1cm5zIGEgbWF0Y2gtIHRoZW4gY2xhc3Mtb3JkZXJlZCBsaXN0LCBhbmRcbiAqIHNpbmdsZS1zZWxlY3Rpb24sIHdoaWNoIGNvbGxhcHNlcyB0byBvbmUgaWQgcGx1cyBob3cgaXQgd2FzIHJlYWNoZWQgYW5kXG4gKiBsYXllcnMgdGhlIG9wZXJhdG9yLXBpbm5lZCBmYWxsYmFjayAvIHN0YXRpYy1mbG9vciBzYWZldHkgbmV0IG9uIHRvcC4gQSBjaGF0XG4gKiBgbW9kZWxDbGFzc2AgYWN0cyBhcyBhIGNlaWxpbmc6IHRoYXQgYmFuZCBhbmQgdGhlIGxlc3MtY2FwYWJsZSBjaGF0IGJhbmRzXG4gKiBiZWxvdyBpdCBhcmUgZWxpZ2libGUgKHNlZSB7QGxpbmsgY2xhc3Nlc0F0T3JCZWxvd30pLCBzbyBhIGBjaGF0LWJhbGFuY2VkYFxuICogYXNrIGNhbiBmYWxsIHRvIGBjaGF0LWZhc3RgIGJ1dCBuZXZlciBlc2NhbGF0ZSB0byBgY2hhdC10aGlua2luZ2AuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBjbGFzc2lmeSxcbiAgbW9kZWwsXG4gIHR5cGUgTW9kZWxRdWVyeSxcbiAgdHlwZSBSYW5rZWRNb2RlbCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcblxuaW1wb3J0IHsgQ0hBVF9DTEFTU19PUkRFUiwgY2xhc3Nlc0F0T3JCZWxvdywgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9jbGFzc2VzLnRzXCI7XG5pbXBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMsIG1vZGVsc0ZvckNsYXNzIH0gZnJvbSBcIi4vZmFsbGJhY2sudHNcIjtcbmltcG9ydCB7XG4gIGxpc3RTZXJ2aW5nRW5kcG9pbnRzLFxuICBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzLFxuICB0eXBlIFJlc29sdmVkTW9kZWwsXG4gIHR5cGUgUmVzb2x2ZU1vZGVsT3B0aW9ucyxcbiAgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IG1vZGVsLk1vZGVsQ2xhc3M7XG5cbi8qKiBDYWxsZXIgaW50ZW50IHBhc3NlZCB0byB7QGxpbmsgcmVzb2x2ZU1vZGVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZU1vZGVsSW5wdXQge1xuICAvKipcbiAgICogRXhwbGljaXQgbW9kZWwgaWQgLyBsb29zZSBuYW1lIChwZXItcmVxdWVzdCBvdmVycmlkZSwgYWdlbnQgLyBwbHVnaW5cbiAgICogZGVmYXVsdCwgb3IgZW52IHZhcikuIFdoZW4gc2V0IGl0IHdpbnMgb3ZlciBgbW9kZWxDbGFzc2AgYW5kIGBmYWxsYmFja3NgLlxuICAgKi9cbiAgZXhwbGljaXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdXp6eS1tYXRjaCBhbiBgZXhwbGljaXRgIG5hbWUgYWdhaW5zdCB0aGUgbGl2ZSBjYXRhbG9ndWUgc28gbG9vc2UgbmFtZXNcbiAgICogbGlrZSBgXCJjbGF1ZGUgc29ubmV0XCJgIHJlc29sdmUuIERlZmF1bHQgYHRydWVgLiBXaGVuIGBmYWxzZWAgdGhlIGV4cGxpY2l0XG4gICAqIGlucHV0IGlzIHJldHVybmVkIHZlcmJhdGltIChEYXRhYnJpY2tzIHN1cmZhY2VzIHRoZSBjYW5vbmljYWwgNDA0IGlmIGl0XG4gICAqIGRvZXNuJ3QgZXhpc3QpLlxuICAgKi9cbiAgZnV6enk/OiBib29sZWFuO1xuICAvKiogRnVzZS5qcyB0aHJlc2hvbGQgZm9yd2FyZGVkIHRvIHRoZSBmdXp6eSBgc2VhcmNoYCBtYXRjaCAoe0BsaW5rIHNlYXJjaFNlcnZpbmdFbmRwb2ludHN9KS4gKi9cbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogUmVxdWlyZSBhIG1vZGVsIHRoYXQgc3VwcG9ydHMgYSBjb21wbGV0ZSBmdW5jdGlvbi10b29sIHJvdW5kLXRyaXAuICovXG4gIHJlcXVpcmVzVG9vbHM/OiBib29sZWFuO1xuICAvKipcbiAgICogQ2hhdCBjYXBhYmlsaXR5IGNsYXNzIHRvIHJlc29sdmUgd2hlbiBubyBgZXhwbGljaXRgIGlkIGlzIGdpdmVuLiBUaGUgbGl2ZVxuICAgKiBjYXRhbG9ndWUgaXMgY2xhc3NpZmllZCBieSBpdHMgRm91bmRhdGlvbiBNb2RlbCBBUEkgc2NvcmVzIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgKGFuZCB0aGUgY2hhdCBiYW5kcyBiZWxvdyBpdCkgd2lucywgZmFsbGluZ1xuICAgKiBiYWNrIHRvIHRoZSBjbGFzcydzIHNtYWxsIHN0YXRpYyBsaXN0LlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG4gIC8qKlxuICAgKiBPcGVyYXRvci1zdXBwbGllZCBmYWxsYmFjayBpZHMgdHJpZWQgKmZpcnN0KiBpbiB0aGUgbm8tZXhwbGljaXQsIG5vLWNsYXNzXG4gICAqIHBhdGggKGUuZy4gYSByZWd1bGF0ZWQgd29ya3NwYWNlIHBpbm5lZCB0byBhbiBhcHByb3ZlZCBzdWJzZXQpLCBhaGVhZCBvZlxuICAgKiB0aGUgYXV0by1jbGFzc2lmaWVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIGZhbGxiYWNrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKiogT3V0Y29tZSBvZiB7QGxpbmsgcmVzb2x2ZU1vZGVsfTogdGhlIGNob3NlbiBpZCBwbHVzIGhvdyBpdCB3YXMgcmVhY2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbiB7XG4gIG1vZGVsSWQ6IHN0cmluZztcbiAgc291cmNlOiBcImV4cGxpY2l0XCIgfCBcImZ1enp5LW1hdGNoXCIgfCBcImNsYXNzXCIgfCBcImZhbGxiYWNrXCI7XG59XG5cbi8qKiBJbnRlbnQgKyBjYXRhbG9ndWUga25vYnMgcGFzc2VkIHRvIHtAbGluayBzZWxlY3RNb2RlbH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE1vZGVsSW5wdXQgZXh0ZW5kcyBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIC8qKiBUVEwgb3ZlcnJpZGUgZm9yIHRoZSBjYWNoZWQgYC9zZXJ2aW5nLWVuZHBvaW50c2AgbGlzdGluZywgaW4gbXMuICovXG4gIHR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogVFRMIG92ZXJyaWRlIG1lcmdlZCBpbnRvIGEge0BsaW5rIE1vZGVsUXVlcnl9IGZvciB7QGxpbmsgc2VhcmNoTW9kZWxzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoTW9kZWxzSW5wdXQgZXh0ZW5kcyBNb2RlbFF1ZXJ5IHtcbiAgLyoqIFRUTCBvdmVycmlkZSBmb3IgdGhlIGNhY2hlZCBgL3NlcnZpbmctZW5kcG9pbnRzYCBsaXN0aW5nLCBpbiBtcy4gKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUm91bmQgYSBGdXNlIHNjb3JlIHRvIHRoZSBkaXNwbGF5IHByZWNpc2lvbiBzbyB2ZXJzaW9uIHNpYmxpbmdzIHRoYXQgbWF0Y2ggYVxuICogdG9rZW4gaWRlbnRpY2FsbHkgKGUuZy4gYG9wdXMtNC03YCB2cyBgb3B1cy00LThgIGZvciB0aGUgcXVlcnkgYFwib3B1c1wiYCkgdGllXG4gKiBvbiBtYXRjaCBhbmQgbGV0IHRoZSBjbGFzcyAvIHdpdGhpbi1jbGFzcyByYW5rIGRlY2lkZSAtIHdoaWNoIGlzIHdoYXRcbiAqIHN1cmZhY2VzIHRoZSBuZXdlciwgaGlnaGVyLXF1YWxpdHkgc2libGluZy5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hCdWNrZXQoc2NvcmU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKChzY29yZSA/PyAwKSAqIDEwMDApO1xufVxuXG4vKipcbiAqIFJhbmsgdGhlIGxpdmUgY2F0YWxvZ3VlIGFnYWluc3QgYSB7QGxpbmsgTW9kZWxRdWVyeX0sIGJlc3QtZmlyc3QuXG4gKlxuICogQ2FuZGlkYXRlcyBhcmUgdGhlIGNsYXNzaWZpZWQgZW5kcG9pbnRzIGluIHRoZSBlbGlnaWJsZSBjbGFzc2VzOlxuICoge0BsaW5rIGNsYXNzZXNBdE9yQmVsb3d9IHRoZSByZXF1ZXN0ZWQgYG1vZGVsQ2xhc3NgLCBvciAtIHdoZW4gbm9uZSBpcyBnaXZlblxuICogLSB0aGUgY2hhdCBiYW5kcyBvbmx5ICh7QGxpbmsgQ0hBVF9DTEFTU19PUkRFUn0pLCBzbyBhIGdlbmVyYWwgYXNrIG5ldmVyXG4gKiBzdXJmYWNlcyBhbiBlbWJlZGRpbmcgZW5kcG9pbnQuIEVhY2ggY2xhc3MgYnVja2V0IGlzIGFscmVhZHkgYmVzdC1maXJzdCBmcm9tXG4gKiB7QGxpbmsgY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHN9LiBSYW5raW5nIGlzICoqbWF0Y2ggdGhlbiBjbGFzcyoqOlxuICpcbiAqIDEuIFdpdGggYSBgc2VhcmNoYCwgb25seSBlbmRwb2ludHMgbWF0Y2hpbmcgaXQgc3Vydml2ZSwgb3JkZXJlZCBieSBtYXRjaFxuICogICAgZGlzdGFuY2UgKGJ1Y2tldGVkIHZpYSB7QGxpbmsgbWF0Y2hCdWNrZXR9IHNvIG5lYXItaWRlbnRpY2FsIHNjb3JlcyB0aWUpLFxuICogICAgdGhlbiBieSBjbGFzcyAobW9yZSBjYXBhYmxlIGZpcnN0KSwgdGhlbiBieSB0aGUgc3RhYmxlIHdpdGhpbi1jbGFzcyByYW5rLlxuICogMi4gV2l0aG91dCBhIGBzZWFyY2hgLCB0aGUgY2xhc3MtdGhlbi1yYW5rIGNhbmRpZGF0ZSBvcmRlciBzdGFuZHMuXG4gKlxuICogQSBgbGltaXRgIHRydW5jYXRlcyB0aGUgcmVzdWx0LiBSZXR1cm5zIGBbXWAgd2hlbiBub3RoaW5nIGlzIGVsaWdpYmxlIG9yXG4gKiBtYXRjaGVzIC0gY2FsbGVycyBsYXllciB0aGVpciBvd24gZmFsbGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5rTW9kZWxzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgcXVlcnk6IE1vZGVsUXVlcnkgPSB7fSxcbik6IFJhbmtlZE1vZGVsW10ge1xuICBjb25zdCBjbGFzc2lmaWVkID0gY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHMoZW5kcG9pbnRzKTtcbiAgY29uc3QgZWxpZ2libGUgPVxuICAgIHF1ZXJ5Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IGNsYXNzZXNBdE9yQmVsb3cocXVlcnkubW9kZWxDbGFzcykgOiBDSEFUX0NMQVNTX09SREVSO1xuXG4gIC8vIEZsYXR0ZW4gZWxpZ2libGUgY2xhc3NlcyBpbiBjYXBhYmlsaXR5IG9yZGVyLCBjYXJyeWluZyBlYWNoIGVuZHBvaW50J3NcbiAgLy8gY2xhc3M7IGJ1Y2tldCBvcmRlciBpcyBhbHJlYWR5IGJlc3QtZmlyc3QuXG4gIGNvbnN0IGNhbmRpZGF0ZXM6IFJhbmtlZE1vZGVsW10gPSBbXTtcbiAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIGVsaWdpYmxlKSB7XG4gICAgZm9yIChjb25zdCBlbmRwb2ludCBvZiBjbGFzc2lmaWVkW21vZGVsQ2xhc3NdKSB7XG4gICAgICBpZiAocXVlcnkucmVxdWlyZXNUb29scyAmJiAhY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKSBjb250aW51ZTtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGVuZHBvaW50LCBtb2RlbENsYXNzIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlYXJjaCA9IHF1ZXJ5LnNlYXJjaD8udHJpbSgpO1xuICBsZXQgcmFua2VkOiBSYW5rZWRNb2RlbFtdO1xuICBpZiAoc2VhcmNoKSB7XG4gICAgY29uc3Qgc2NvcmVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoXG4gICAgICBzZWFyY2gsXG4gICAgICBjYW5kaWRhdGVzLm1hcCgoYykgPT4gYy5lbmRwb2ludCksXG4gICAgICBxdWVyeS50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBxdWVyeS50aHJlc2hvbGQgfSA6IHt9LFxuICAgICkpIHtcbiAgICAgIHNjb3Jlcy5zZXQobWF0Y2guZW5kcG9pbnQubmFtZSwgbWF0Y2guc2NvcmUpO1xuICAgIH1cbiAgICAvLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGlzIHN0YWJsZSwgc28gZW5kcG9pbnRzIGVxdWFsIG9uIG1hdGNoIGFuZCBjbGFzc1xuICAgIC8vIGtlZXAgdGhlaXIgYmVzdC1maXJzdCB3aXRoaW4tY2xhc3Mgb3JkZXIuXG4gICAgcmFua2VkID0gY2FuZGlkYXRlc1xuICAgICAgLmZpbHRlcigoYykgPT4gc2NvcmVzLmhhcyhjLmVuZHBvaW50Lm5hbWUpKVxuICAgICAgLm1hcCgoYykgPT4gKHsgLi4uYywgc2NvcmU6IHNjb3Jlcy5nZXQoYy5lbmRwb2ludC5uYW1lKSB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5TWF0Y2ggPSBtYXRjaEJ1Y2tldChhLnNjb3JlKSAtIG1hdGNoQnVja2V0KGIuc2NvcmUpO1xuICAgICAgICBpZiAoYnlNYXRjaCAhPT0gMCkgcmV0dXJuIGJ5TWF0Y2g7XG4gICAgICAgIHJldHVybiBNT0RFTF9DTEFTU19PUkRFUi5pbmRleE9mKGEubW9kZWxDbGFzcykgLSBNT0RFTF9DTEFTU19PUkRFUi5pbmRleE9mKGIubW9kZWxDbGFzcyk7XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByYW5rZWQgPSBjYW5kaWRhdGVzO1xuICB9XG5cbiAgcmV0dXJuIHF1ZXJ5LmxpbWl0ICE9PSB1bmRlZmluZWQgPyByYW5rZWQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgcXVlcnkubGltaXQpKSA6IHJhbmtlZDtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZSB7QGxpbmsgcmFua01vZGVsc30gdG8gYSBzaW5nbGUgaWQ6IHRoZSBjbG9zZXN0IGVuZHBvaW50IHRvIGBzZWFyY2hgXG4gKiBpbiBhIGNhdGFsb2d1ZSBzbmFwc2hvdCwgb3IgdGhlIGlucHV0IHZlcmJhdGltIHdoZW4gbm90aGluZyBzY29yZXMgd2l0aGluIHRoZVxuICogdGhyZXNob2xkLlxuICpcbiAqIFRoZSByYW5rLWJhc2VkIGNvdW50ZXJwYXJ0IHRvIHRoZSBGdXNlLW9ubHkge0BsaW5rIHJlc29sdmVNb2RlbElkfTogZXF1YWxcbiAqIG1hdGNoIHNjb3JlcyBhcmUgYnJva2VuIGJ5IGNsYXNzIGFuZCB0aGVuIHdpdGhpbi1jbGFzcyB2ZXJzaW9uLCBzbyBhIGxvb3NlXG4gKiBgXCJvcHVzXCJgIHByZWZlcnMgYG9wdXMtNWAgb3ZlciBgb3B1cy00LTdgIGluc3RlYWQgb2YgcGlja2luZyB3aGljaGV2ZXJcbiAqIHNpYmxpbmcgRnVzZSBoYXBwZW5lZCB0byBvcmRlciBmaXJzdC4gUmV0dXJuaW5nIHRoZSBpbnB1dCB1bm1hdGNoZWQgKHJhdGhlclxuICogdGhhbiBhIG5lYXIgbmVpZ2hib3VyKSBpcyBkZWxpYmVyYXRlIC0gYSBkZWxpYmVyYXRlIGVuZHBvaW50IGlkIGlzIG5ldmVyXG4gKiBzaWxlbnRseSByZXdyaXR0ZW4sIGFuZCBEYXRhYnJpY2tzIHN1cmZhY2VzIGEgY2xlYW4gNDA0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFua01vZGVsSWQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBzZWFyY2g6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbCB7XG4gIGNvbnN0IFt0b3BdID0gcmFua01vZGVscyhlbmRwb2ludHMsIHtcbiAgICBzZWFyY2gsXG4gICAgbGltaXQ6IDEsXG4gICAgLi4uKG9wdGlvbnMudGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHRocmVzaG9sZDogb3B0aW9ucy50aHJlc2hvbGQgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy5yZXF1aXJlc1Rvb2xzICE9PSB1bmRlZmluZWQgPyB7IHJlcXVpcmVzVG9vbHM6IG9wdGlvbnMucmVxdWlyZXNUb29scyB9IDoge30pLFxuICB9KTtcbiAgaWYgKCF0b3ApIHJldHVybiB7IG1vZGVsSWQ6IHNlYXJjaCwgbWF0Y2hlZDogZmFsc2UgfTtcbiAgcmV0dXJuIHsgbW9kZWxJZDogdG9wLmVuZHBvaW50Lm5hbWUsIG1hdGNoZWQ6IHRydWUsIHNjb3JlOiB0b3Auc2NvcmUgfTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgcmFua01vZGVsSWR9IGFnYWluc3QgYSBjYXRhbG9ndWUgdGhlIGNhbGxlciBtYXkgYmUgaG9sZGluZyBzdGFsZTpcbiAqIG1hdGNoIHRoZSBsb2FkZWQgc25hcHNob3QsIGFuZCBvbiBhIG1pc3MgcmVsb2FkIG9uY2Ugd2l0aCBgZm9yY2VgIGFuZCBtYXRjaFxuICogYWdhaW4uIFRoYXQgd2F5IGEgbW9kZWwgZGVwbG95ZWQgYWZ0ZXIgdGhlIGNhdGFsb2d1ZSB3YXMgY2FjaGVkIHN0aWxsXG4gKiByZXNvbHZlcyBvbiBmaXJzdCB1c2UsIHdpdGhvdXQgYSByZXN0YXJ0IGFuZCB3aXRob3V0IGdpdmluZyB1cCBjYWNoaW5nLlxuICpcbiAqIFRoZSBjYXRhbG9ndWUgYXJyaXZlcyBhcyBhIGxvYWRlciByYXRoZXIgdGhhbiBhIGNsaWVudCBzbyB0aGUgY2FsbGVyIGtlZXBzXG4gKiBvd25lcnNoaXAgb2YgKmhvdyogaXQgaXMgY2FjaGVkIC0ge0BsaW5rIGxpc3RTZXJ2aW5nRW5kcG9pbnRzfSBhbmQgaXRzXG4gKiBgQ2FjaGVNYW5hZ2VyYCwgYSBwbGFpbiBwcm9jZXNzLWxpZmV0aW1lIGZpZWxkIGluIGEgQ0xJLCBvciBhIHRlc3QgZG91YmxlLlxuICogT25seSBvbmUgcmVsb2FkIGlzIGF0dGVtcHRlZDogYSBnZW51aW5lbHkgdW5rbm93biBuYW1lIHNob3VsZCBmYWlsIGZhc3RcbiAqIHJhdGhlciB0aGFuIHJlLWxpc3Qgb24gZXZlcnkgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gbG9hZCAtIFJldHVybnMgdGhlIGNhdGFsb2d1ZTsgYGZvcmNlYCBhc2tzIGl0IHRvIGJ5cGFzcyBpdHMgY2FjaGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYW5rTW9kZWxJZExpdmUoXG4gIGxvYWQ6IChmb3JjZTogYm9vbGVhbikgPT4gUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+LFxuICBzZWFyY2g6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxSZXNvbHZlZE1vZGVsPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmFua01vZGVsSWQoYXdhaXQgbG9hZChmYWxzZSksIHNlYXJjaCwgb3B0aW9ucyk7XG4gIGlmIChyZXNvbHZlZC5tYXRjaGVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gIHJldHVybiByYW5rTW9kZWxJZChhd2FpdCBsb2FkKHRydWUpLCBzZWFyY2gsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJhbmsgYSB3b3Jrc3BhY2UncyBjYXRhbG9ndWUgaW4gb25lIGNhbGw6IGxpc3QgaXRzIGAvc2VydmluZy1lbmRwb2ludHNgXG4gKiAoY2FjaGVkKSBhbmQgcnVuIHtAbGluayByYW5rTW9kZWxzfSBvdmVyIHRoZSByZXN1bHQuIFRoZSBsaXN0IGNvdW50ZXJwYXJ0IHRvXG4gKiB7QGxpbmsgc2VsZWN0TW9kZWx9LCBmb3IgYSBjb25zdW1lciB0aGF0IHdhbnRzIHRoZSBmdWxsIHJhbmtlZCBzZXQgKGEgbW9kZWxcbiAqIHBpY2tlciwgYSBDTEkpIHJhdGhlciB0aGFuIGEgc2luZ2xlIGlkLiBDYXRhbG9ndWUgZmV0Y2hlcyBmYWlsIGxvdWQ6IG5ldHdvcmtcbiAqIC8gYXV0aCBlcnJvcnMgcHJvcGFnYXRlIHNvIHRoZSBjYWxsZXIgc2VlcyB0aGUgcmVhbCBTREsgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gaG9zdCAtIFdvcmtzcGFjZSBob3N0IHVzZWQgYXMgdGhlIGNhY2hlIGtleS4gUGFzcyB0aGUgdmFsdWUgcmVzb2x2ZWRcbiAqICAgZnJvbSBgY2xpZW50LmNvbmZpZy5nZXRIb3N0KClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoTW9kZWxzKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIGhvc3Q6IHN0cmluZyxcbiAgaW5wdXQ6IFNlYXJjaE1vZGVsc0lucHV0ID0ge30sXG4pOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHMoXG4gICAgY2xpZW50LFxuICAgIGhvc3QsXG4gICAgaW5wdXQudHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgdHRsTXM6IGlucHV0LnR0bE1zIH0gOiB7fSxcbiAgKTtcbiAgcmV0dXJuIHJhbmtNb2RlbHMoZW5kcG9pbnRzLCBpbnB1dCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIG1vZGVsIGlkIGZvciBhIHdvcmtzcGFjZSBpbiBvbmUgY2FsbDogbGlzdCBpdHMgYC9zZXJ2aW5nLWVuZHBvaW50c2BcbiAqIChjYWNoZWQpIGFuZCBydW4ge0BsaW5rIHJlc29sdmVNb2RlbH0gb3ZlciB0aGUgcmVzdWx0LiBUaGlzIGlzIHRoZSBlbnRyeVxuICogcG9pbnQgZm9yIGFueSBjb25zdW1lciB0aGF0IGhvbGRzIGEgYFdvcmtzcGFjZUNsaWVudGAgYW5kIGp1c3Qgd2FudHMgYSB1c2FibGVcbiAqIG1vZGVsIG5hbWUgLSBhIExha2VmbG93IGpvYiwgYSBvbmUtb2ZmIHNjcmlwdCwgb3IgdGhlIE1hc3RyYSBwbHVnaW4gYWxpa2UuXG4gKlxuICogQ2hlYXAgZXhpdDogd2hlbiBhbiBgZXhwbGljaXRgIG5hbWUgaXMgZ2l2ZW4gYW5kIGBmdXp6eWAgaXMgb2ZmLCB0aGVcbiAqIGNhdGFsb2d1ZSBpcyBuZXZlciBmZXRjaGVkIC0gdGhlIG5hbWUgaXMgcmV0dXJuZWQgdmVyYmF0aW0gYW5kIERhdGFicmlja3NcbiAqIHN1cmZhY2VzIHRoZSBjYW5vbmljYWwgNDA0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuIENhdGFsb2d1ZSBmZXRjaGVzIG90aGVyd2lzZVxuICogZmFpbCBsb3VkOiBuZXR3b3JrIC8gYXV0aCBlcnJvcnMgcHJvcGFnYXRlIHNvIHRoZSBjYWxsZXIgc2VlcyB0aGUgcmVhbCBTREtcbiAqIG1lc3NhZ2UgaW5zdGVhZCBvZiBhIHNpbGVudCBmYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0gaG9zdCAtIFdvcmtzcGFjZSBob3N0IHVzZWQgYXMgdGhlIGNhY2hlIGtleS4gUGFzcyB0aGUgdmFsdWUgcmVzb2x2ZWRcbiAqICAgZnJvbSBgY2xpZW50LmNvbmZpZy5nZXRIb3N0KClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VsZWN0TW9kZWwoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgaG9zdDogc3RyaW5nLFxuICBpbnB1dDogU2VsZWN0TW9kZWxJbnB1dCA9IHt9LFxuKTogUHJvbWlzZTxSZXNvbHZlZE1vZGVsU2VsZWN0aW9uPiB7XG4gIGlmIChpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkICYmIGlucHV0LmZ1enp5ID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZXhwbGljaXRcIiB9O1xuICB9XG4gIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCwge1xuICAgIC4uLihpbnB1dC50dGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogaW5wdXQudHRsTXMgfSA6IHt9KSxcbiAgfSk7XG4gIHJldHVybiByZXNvbHZlTW9kZWwoZW5kcG9pbnRzLCBpbnB1dCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHNpbmdsZSBtb2RlbCBpZCBmcm9tIHRoZSBsaXZlIGNhdGFsb2d1ZSBhbmQgY2FsbGVyIGludGVudCxcbiAqIGRlbGVnYXRpbmcgdGhlIGxpdmUgc2VsZWN0aW9uIHRvIHtAbGluayByYW5rTW9kZWxzfSB3aXRoIGBsaW1pdDogMWAuXG4gKlxuICogMS4gKipFeHBsaWNpdCBhc2sqKjogd2l0aCBgZnV6enlgIG9mZiwgcmV0dXJuZWQgdmVyYmF0aW07IG90aGVyd2lzZVxuICogICAgZnV6enktcmFua2VkIHdpdGhpbiB0aGUgKG9wdGlvbmFsKSBjbGFzcyBjZWlsaW5nIGFuZCB0aGUgYmVzdCB0YWtlbixcbiAqICAgIGZhbGxpbmcgYmFjayB0byB0aGUgaW5wdXQgdmVyYmF0aW0gd2hlbiBub3RoaW5nIG1hdGNoZXMuXG4gKiAyLiAqKk5vIGV4cGxpY2l0IGFzayoqOiBhbiBvcGVyYXRvci1waW5uZWQgYGZhbGxiYWNrYCB0aGF0IGV4aXN0cyBpbiB0aGUgbGl2ZVxuICogICAgY2F0YWxvZ3VlIHdpbnMgZmlyc3Q7IHRoZW4gdGhlIHJhbmtlZCBsaXZlIGNhdGFsb2d1ZSAoY2xhc3MgY2VpbGluZ1xuICogICAgYXBwbGllZCk7IHRoZW4gdGhlIHN0YXRpYyB7QGxpbmsgRkFMTEJBQ0tfTU9ERUxfSURTfSBmbG9vciB3aGVuIHRoZVxuICogICAgY2F0YWxvZ3VlIHlpZWxkcyBub3RoaW5nIGluIHJhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1vZGVsKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgaW5wdXQ6IFJlc29sdmVNb2RlbElucHV0ID0ge30sXG4pOiBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uIHtcbiAgaWYgKGlucHV0LmV4cGxpY2l0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoaW5wdXQuZnV6enkgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoaW5wdXQucmVxdWlyZXNUb29scykgYXNzZXJ0VG9vbFN1cHBvcnQoZW5kcG9pbnRzLCBpbnB1dC5leHBsaWNpdCk7XG4gICAgICByZXR1cm4geyBtb2RlbElkOiBpbnB1dC5leHBsaWNpdCwgc291cmNlOiBcImV4cGxpY2l0XCIgfTtcbiAgICB9XG4gICAgY29uc3QgW3RvcF0gPSByYW5rTW9kZWxzKGVuZHBvaW50cywgYnVpbGRRdWVyeShpbnB1dCwgaW5wdXQuZXhwbGljaXQpKTtcbiAgICBpZiAoaW5wdXQucmVxdWlyZXNUb29scyAmJiAhdG9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRvb2wtY2FwYWJsZSBtb2RlbCBtYXRjaGVzIFwiJHtpbnB1dC5leHBsaWNpdH1cImApO1xuICAgIH1cbiAgICByZXR1cm4geyBtb2RlbElkOiB0b3A/LmVuZHBvaW50Lm5hbWUgPz8gaW5wdXQuZXhwbGljaXQsIHNvdXJjZTogXCJmdXp6eS1tYXRjaFwiIH07XG4gIH1cblxuICAvLyBPcGVyYXRvci1waW5uZWQgZmFsbGJhY2tzIHdpbiB3aGVuIHByZXNlbnQgYW5kIGxpdmUgKGUuZy4gYSByZWd1bGF0ZWRcbiAgLy8gd29ya3NwYWNlIHJlc3RyaWN0ZWQgdG8gYW4gYXBwcm92ZWQgc3Vic2V0KS5cbiAgaWYgKGlucHV0Lm1vZGVsQ2xhc3MgPT09IHVuZGVmaW5lZCAmJiBpbnB1dC5mYWxsYmFja3MgJiYgaW5wdXQuZmFsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBwcmVzZW50ID0gbmV3IFNldChcbiAgICAgIGVuZHBvaW50c1xuICAgICAgICAuZmlsdGVyKChlbmRwb2ludCkgPT4gIWlucHV0LnJlcXVpcmVzVG9vbHMgfHwgY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKVxuICAgICAgICAubWFwKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBwaW5uZWQgPSBpbnB1dC5mYWxsYmFja3MuZmluZCgoaWQpID0+IHByZXNlbnQuaGFzKGlkKSk7XG4gICAgaWYgKHBpbm5lZCkgcmV0dXJuIHsgbW9kZWxJZDogcGlubmVkLCBzb3VyY2U6IFwiZmFsbGJhY2tcIiB9O1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gaW5wdXQubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8gXCJjbGFzc1wiIDogXCJmYWxsYmFja1wiO1xuICBjb25zdCBbdG9wXSA9IHJhbmtNb2RlbHMoZW5kcG9pbnRzLCBidWlsZFF1ZXJ5KGlucHV0LCB1bmRlZmluZWQpKTtcbiAgaWYgKHRvcCkgcmV0dXJuIHsgbW9kZWxJZDogdG9wLmVuZHBvaW50Lm5hbWUsIHNvdXJjZSB9O1xuXG4gIC8vIExpdmUgY2F0YWxvZ3VlIHlpZWxkZWQgbm90aGluZyBpbiByYW5nZTogd2FsayB0aGUgc3RhdGljIGZsb29yLlxuICBjb25zdCBmbG9vclNvdXJjZSA9XG4gICAgaW5wdXQubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8gbW9kZWxzRm9yQ2xhc3MoaW5wdXQubW9kZWxDbGFzcykgOiAoaW5wdXQuZmFsbGJhY2tzID8/IFtdKTtcbiAgY29uc3QgZmxvb3IgPSBvYmplY3Quc2VxdWVuY2UoZmxvb3JTb3VyY2UpLmNvbmNhdChGQUxMQkFDS19NT0RFTF9JRFMpLmRpc3RpbmN0KCkudG9BcnJheSgpO1xuICBpZiAoaW5wdXQucmVxdWlyZXNUb29scykge1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IG5ldyBTZXQoXG4gICAgICBlbmRwb2ludHNcbiAgICAgICAgLmZpbHRlcigoZW5kcG9pbnQpID0+IGNsYXNzaWZ5LmVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KS50b29scylcbiAgICAgICAgLm1hcCgoZW5kcG9pbnQpID0+IGVuZHBvaW50Lm5hbWUpLFxuICAgICk7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBmbG9vci5maW5kKChpZCkgPT4gYXZhaWxhYmxlLmhhcyhpZCkpO1xuICAgIGlmICghc2VsZWN0ZWQpIHRocm93IG5ldyBFcnJvcihcIk5vIHRvb2wtY2FwYWJsZSBtb2RlbCBpcyBhdmFpbGFibGVcIik7XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogc2VsZWN0ZWQsIHNvdXJjZSB9O1xuICB9XG4gIHJldHVybiB7IG1vZGVsSWQ6IHBpY2tGaXJzdEF2YWlsYWJsZShmbG9vciwgZW5kcG9pbnRzKSwgc291cmNlIH07XG59XG5cbi8qKiBCdWlsZCBhIHtAbGluayBNb2RlbFF1ZXJ5fSBmcm9tIHtAbGluayBSZXNvbHZlTW9kZWxJbnB1dH0gZm9yIHRoZSBgbGltaXQ6IDFgIGRlbGVnYXRpb24uICovXG5mdW5jdGlvbiBidWlsZFF1ZXJ5KGlucHV0OiBSZXNvbHZlTW9kZWxJbnB1dCwgc2VhcmNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBNb2RlbFF1ZXJ5IHtcbiAgcmV0dXJuIHtcbiAgICAuLi4oc2VhcmNoICE9PSB1bmRlZmluZWQgPyB7IHNlYXJjaCB9IDoge30pLFxuICAgIC4uLihpbnB1dC5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyB7IG1vZGVsQ2xhc3M6IGlucHV0Lm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAuLi4oaW5wdXQucmVxdWlyZXNUb29scyAhPT0gdW5kZWZpbmVkID8geyByZXF1aXJlc1Rvb2xzOiBpbnB1dC5yZXF1aXJlc1Rvb2xzIH0gOiB7fSksXG4gICAgLi4uKGlucHV0LnRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyB0aHJlc2hvbGQ6IGlucHV0LnRocmVzaG9sZCB9IDoge30pLFxuICAgIGxpbWl0OiAxLFxuICB9O1xufVxuXG4vKiogVGhyb3cgd2hlbiBhbiBleHBsaWNpdCBpZCBpcyBhYnNlbnQgb3Igbm90IHZlcmlmaWVkIGZvciBmdW5jdGlvbiB0b29scy4gKi9cbmZ1bmN0aW9uIGFzc2VydFRvb2xTdXBwb3J0KGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLCBtb2RlbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZW5kcG9pbnQgPSBlbmRwb2ludHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gbW9kZWxJZCk7XG4gIGlmICghZW5kcG9pbnQgfHwgIWNsYXNzaWZ5LmVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KS50b29scykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgXCIke21vZGVsSWR9XCIgZG9lcyBub3Qgc3VwcG9ydCBmdW5jdGlvbiB0b29sc2ApO1xuICB9XG59XG5cbi8qKlxuICogRmluZCB0aGUgZmlyc3QgaWQgaW4gYGNhbmRpZGF0ZXNgIHdob3NlIGVuZHBvaW50IGlzIHByZXNlbnQgaW4gYGVuZHBvaW50c2AuXG4gKiBSZXR1cm5zIHRoZSB0b3AgY2FuZGlkYXRlIHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm9uZSBvZiB0aGVtIHNvIGNhbGxlcnNcbiAqIGFsd2F5cyBnZXQgYSBzdHJpbmc7IGFuIG9mZmxpbmUgd29ya3NwYWNlIHRoZW4gcmVjZWl2ZXMgYSBjbGVhbiA0MDQgZnJvbVxuICogRGF0YWJyaWNrcyBpbnN0ZWFkIG9mIGEgbWFsZm9ybWVkIGNvbmZpZy5cbiAqL1xuZnVuY3Rpb24gcGlja0ZpcnN0QXZhaWxhYmxlKFxuICBjYW5kaWRhdGVzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBzdHJpbmcge1xuICBjb25zdCBwcmVzZW50ID0gbmV3IFNldChlbmRwb2ludHMubWFwKChlKSA9PiBlLm5hbWUpKTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChwcmVzZW50LmhhcyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzWzBdID8/IEZBTExCQUNLX01PREVMX0lEU1swXSE7XG59XG4iXX0=
|
package/lib/src/serving.d.ts
CHANGED
|
@@ -96,6 +96,8 @@ export interface ResolvedModel {
|
|
|
96
96
|
export interface ResolveModelOptions {
|
|
97
97
|
/** Fuse.js threshold (0 = exact, 1 = anything). Default `0.4`. */
|
|
98
98
|
threshold?: number;
|
|
99
|
+
/** Require a model verified for a complete function-tool round-trip. */
|
|
100
|
+
requiresTools?: boolean;
|
|
99
101
|
}
|
|
100
102
|
/** A serving endpoint paired with its fuzzy-match distance for a query. */
|
|
101
103
|
export interface ScoredEndpoint {
|
package/lib/src/serving.js
CHANGED
|
@@ -90,6 +90,7 @@ export async function listServingEndpointsUncached(client) {
|
|
|
90
90
|
...(ep.task !== undefined ? { task: ep.task } : {}),
|
|
91
91
|
...(ep.state?.ready !== undefined ? { state: String(ep.state.ready) } : {}),
|
|
92
92
|
...(ep.description !== undefined ? { description: ep.description } : {}),
|
|
93
|
+
supportsTools: classify.supportsToolsByFamily(ep.name),
|
|
93
94
|
...(profile ? { profile } : {}),
|
|
94
95
|
});
|
|
95
96
|
}
|
|
@@ -283,4 +284,4 @@ export function resolveModelId(input, endpoints, options = {}) {
|
|
|
283
284
|
}
|
|
284
285
|
return { modelId: input, matched: false };
|
|
285
286
|
}
|
|
286
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUNMLFFBQVEsRUFDUixPQUFPLEVBQ1AsS0FBSyxHQUdOLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRTNCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVqRCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBRTdCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFTM0MsMEdBQTBHO0FBQzFHLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXhELDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFM0MsZ0VBQWdFO0FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7QUFFaEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQVd2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLE1BQTJCLEVBQzNCLElBQVksRUFDWixVQUF1QyxFQUFFO0lBRXpDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJ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QUM7U0FDYixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7U0FDMUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixLQUFhLEVBQ2IsU0FBNEMsRUFDNUMsVUFBK0IsRUFBRTtJQUVqQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMaXZlIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBjYXRhbG9ndWUgYWNjZXNzLlxuICpcbiAqIExpc3RzIHRoZSB3b3Jrc3BhY2UncyBgL3NlcnZpbmctZW5kcG9pbnRzYCBvbmNlIHBlciBob3N0IGFuZCBjYWNoZXMgdGhlXG4gKiByZXN1bHQgd2l0aCBhIFRUTCB2aWEgQXBwS2l0J3MgYENhY2hlTWFuYWdlcmAsIHdpdGggY29uY3VycmVudCBjYWxsZXJzXG4gKiBzaGFyaW5nIG9uZSBpbi1mbGlnaHQgcHJvbWlzZSAodGhlIGNvYWxlc2NpbmcgcGF0dGVybiBvZiBQeXRob24nc1xuICogYGNhY2hldG9vbHMtYXN5bmNgKS4gU3VyZmFjZXMgZWFjaCBlbmRwb2ludCBhcyBhIHN0YWJsZVxuICoge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnl9IC0gaW5jbHVkaW5nIHRoZSBGb3VuZGF0aW9uIE1vZGVsIEFQSVxuICogYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBwcm9maWxlIHdoZW4gcHJlc2VudCwgdGhlIGNsYXNzaWZpZWRcbiAqIHtAbGluayBNb2RlbENsYXNzfSwgYW5kIChmb3IgZW1iZWRkaW5nIGVuZHBvaW50cykgdGhlIG1lYXN1cmVkIHZlY3RvclxuICogYGRpbWVuc2lvbmAgLSBhbmQgc25hcHMgbG9vc2UsIGh1bWFuLXR5cGVkIG5hbWVzIHRvIHJlYWwgZW5kcG9pbnQgaWRzXG4gKiB0aHJvdWdoIGBmdXNlLmpzYCBleHRlbmRlZCBzZWFyY2ggc28gdG9rZW5zIGxpa2UgYFwiY2xhdWRlIHNvbm5ldFwiYCByZXNvbHZlIHRvXG4gKiBgZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNmAuXG4gKlxuICogVGhlIGNsYXNzIHN0YW1wIGFuZCBlbWJlZGRpbmcgZGltZW5zaW9uIGFyZSBjb21wdXRlZCBvbmNlIHBlciBjYWNoZSBsb2FkOlxuICogZXZlcnkgZW1iZWRkaW5nIGVuZHBvaW50IGlzIFwicGluZ2VkXCIgaW4gcGFyYWxsZWwgYW5kIHRoZSByZXN1bHRpbmcgdmVjdG9yXG4gKiBsZW5ndGggcmVjb3JkZWQsIHNvIHRoZSBjb3N0IGlzIHBhaWQgb24gYSBjYWNoZSBtaXNzLCBub3QgcGVyIHJlYWQuIFRoZSBwaW5nXG4gKiBpcyBiZXN0LWVmZm9ydCAtIGEgZmFpbHVyZSBsb2dzIGF0IGRlYnVnIGFuZCBsZWF2ZXMgYGRpbWVuc2lvbmAgdW5zZXQgcmF0aGVyXG4gKiB0aGFuIGZhaWxpbmcgdGhlIHdob2xlIGxpc3RpbmcuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXJyb3IsIGxvZywgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIGNsYXNzaWZ5LFxuICBkaXNwbGF5LFxuICBtb2RlbCxcbiAgdHlwZSBNb2RlbFByb2ZpbGUsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgRnVzZSBmcm9tIFwiZnVzZS5qc1wiO1xuXG5pbXBvcnQgeyBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL2NsYXNzZXMudHNcIjtcblxuY29uc3QgeyBNb2RlbENsYXNzIH0gPSBtb2RlbDtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1vZGVsL3NlcnZpbmdcIik7XG5cbi8qKlxuICogU3RydWN0dXJhbCB0eXBlIGZvciB0aGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgY2xpZW50LCByZS1leHBvcnRlZCBzbyB0aGUgcmVzdFxuICogb2YgdGhpcyBwYWNrYWdlIGNhbiBrZWVwIGltcG9ydGluZyBpdCBmcm9tIGhlcmUuIFNlZVxuICogYGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlYCAobm9kZS1hcHBraXQpIGZvciB0aGUgY2Fub25pY2FsIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZUNsaWVudExpa2UgPSBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZTtcblxuLyoqIERlZmF1bHQgVFRMIGZvciB0aGUgaW4tbWVtb3J5IGVuZHBvaW50IGNhY2hlLiBNYXRjaGVzIHRoZSBEYXRhYnJpY2tzIFNESydzIHNlc3Npb24gbGlmZXRpbWUgYnVkZ2V0LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TID0gNSAqIDYwICogMTAwMDtcblxuLyoqIERlZmF1bHQgRnVzZS5qcyBzY29yZSB0aHJlc2hvbGQgYmVsb3cgd2hpY2ggYSBmdXp6eSBtYXRjaCBpcyBhY2NlcHRlZC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCA9IDAuNDtcblxuLyoqIENhY2hlIGtleSBwYXJ0cyB1bmRlciB3aGljaCBlbmRwb2ludCBsaXN0aW5ncyBhcmUgc3RvcmVkLiAqL1xuY29uc3QgQ0FDSEVfS0VZX05BTUVTUEFDRSA9IFwic2VydmluZy1lbmRwb2ludHNcIjtcblxuLyoqXG4gKiBTdGFibGUgYHVzZXJLZXlgIGFyZyBmb3IgQXBwS2l0J3MgYENhY2hlTWFuYWdlci5nZXRPckV4ZWN1dGVgLiBFbmRwb2ludFxuICogdmlzaWJpbGl0eSBpcyBlZmZlY3RpdmVseSB3b3Jrc3BhY2Utc2NvcGVkICh3ZSBjYWNoZSBieSBob3N0IGluIHRoZSBrZXlcbiAqIHBhcnRzKSwgc28gYSBzaW5nbGUgc2hhcmVkIGtleSBsZXRzIGV2ZXJ5IHVzZXIgb2YgdGhlIHNhbWUgd29ya3NwYWNlIHNoYXJlXG4gKiBvbmUgY2FjaGVkIGZldGNoIGFuZCBjb2FsZXNjZSBvbiB0aGUgaW4tZmxpZ2h0IHByb21pc2UuIFBlcm1pc3Npb25zIGNhblxuICogZGlmZmVyIGluIHRoZW9yeSwgYnV0IHRoZSBGb3VuZGF0aW9uIE1vZGVsIEFQSSBjYXRhbG9ndWUgaXMgdGhlIHNhbWUgdmlldyBmb3JcbiAqIGV2ZXJ5IGNhbGxlci5cbiAqL1xuY29uc3QgU0hBUkVEX1VTRVJfS0VZID0gXCJtb2RlbC1zaGFyZWRcIjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30uICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBjYWNoZSBUVEwgZm9yIHRoaXMgY2FsbCwgaW4gbWlsbGlzZWNvbmRzLiBGb3J3YXJkZWQgdG9cbiAgICogYENhY2hlTWFuYWdlcmAgYXMgc2Vjb25kcy5cbiAgICovXG4gIHR0bE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIExpc3QgTW9kZWwgU2VydmluZyBlbmRwb2ludHMgZm9yIHRoZSB3b3Jrc3BhY2Ugb3duaW5nIGBjbGllbnRgLCByb3V0ZWRcbiAqIHRocm91Z2ggQXBwS2l0J3MgYENhY2hlTWFuYWdlcmAuIFRoZSBtYW5hZ2VyIGdpdmVzIHVzIGV2ZXJ5dGhpbmdcbiAqIGBjYWNoZXRvb2xzLlRUTENhY2hlYCBwcm92aWRlcyBwbHVzIHdoYXQgYGNhY2hldG9vbHMtYXN5bmNgIGFkZHMgb24gdG9wOlxuICogcGVyLWVudHJ5IFRUTCwgaW4tZmxpZ2h0IHJlcXVlc3QgY29hbGVzY2luZyAoY29uY3VycmVudCBjYWxsZXJzIHNoYXJlIG9uZVxuICogZmV0Y2ggdmlhIHRoZSBtYW5hZ2VyJ3MgaW50ZXJuYWwgYGluRmxpZ2h0UmVxdWVzdHNgIG1hcCksIGJvdW5kZWQgc2l6ZSxcbiAqIHRlbGVtZXRyeSBzcGFucyAoYGNhY2hlLmdldE9yRXhlY3V0ZWApLCBhbmQgb3B0aW9uYWwgTGFrZWJhc2UgcGVyc2lzdGVuY2Ugc29cbiAqIHRoZSBjYXRhbG9ndWUgc3Vydml2ZXMgcmVzdGFydHMgd2hlbiB0aGUgbGFrZWJhc2UgcGx1Z2luIGlzIHdpcmVkIHVwLlxuICpcbiAqIFJldHVybnMgcGxhaW4ge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnl9IG9iamVjdHMgKGEgc3RhYmxlIHN1YnNldCBvZiB0aGVcbiAqIFNESyB0eXBlKSBzbyBjYWNoZSBoaXRzIG5ldmVyIGV4cG9zZSBzdGFsZSBTREsgaW50ZXJuYWxzLiBFcnJvcnMgZnJvbVxuICogYENhY2hlTWFuYWdlcmAgb3IgdGhlIFNESyBmZXRjaCBwcm9wYWdhdGUgdG8gdGhlIGNhbGxlciAtIHdlIGRvbid0IHN3YWxsb3dcbiAqIHRoZW0gc28gdXNlcnMgc2VlIHRoZSByZWFsIGF1dGggLyBuZXR3b3JrIGlzc3VlLlxuICpcbiAqIEBwYXJhbSBob3N0IC0gV29ya3NwYWNlIGhvc3QgdXNlZCBhcyB0aGUgY2FjaGUga2V5LiBQYXNzIHRoZSB2YWx1ZSByZXNvbHZlZFxuICogICBmcm9tIGBjbGllbnQuY29uZmlnLmdldEhvc3QoKWAgc28gbXVsdGktaG9zdCBhcHBzIHNoYXJlIG9uZSBlbnRyeSBwZXJcbiAqICAgd29ya3NwYWNlLlxuICogQHBhcmFtIG9wdGlvbnMudHRsTXMgLSBPdmVycmlkZSB0aGUgZGVmYXVsdCBUVEwganVzdCBmb3IgdGhpcyBjYWxsLiBGb3J3YXJkZWRcbiAqICAgdG8gYENhY2hlTWFuYWdlcmAgYXMgc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2aW5nRW5kcG9pbnRzKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIGhvc3Q6IHN0cmluZyxcbiAgb3B0aW9uczogTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICBjb25zdCB0dGxTZWMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKChvcHRpb25zLnR0bE1zID8/IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TKSAvIDEwMDApKTtcbiAgcmV0dXJuIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5nZXRPckV4ZWN1dGUoXG4gICAgW0NBQ0hFX0tFWV9OQU1FU1BBQ0UsIGhvc3RdLFxuICAgICgpID0+IGZldGNoRW5kcG9pbnRzKGNsaWVudCksXG4gICAgU0hBUkVEX1VTRVJfS0VZLFxuICAgIHsgdHRsOiB0dGxTZWMgfSxcbiAgKTtcbn1cblxuLyoqXG4gKiBMaXN0IHRoZSB3b3Jrc3BhY2UncyBzZXJ2aW5nIGVuZHBvaW50cyBhcyBtaW5pbWFsXG4gKiB7QGxpbmsgU2VydmluZ0VuZHBvaW50U3VtbWFyeX0gb2JqZWN0cyBzdHJhaWdodCBmcm9tIHRoZSBTREs6IG5vIGNhY2hpbmcsIGFuZFxuICogbm9uZSBvZiB0aGUgY2FjaGUtbG9hZCBlbnJpY2htZW50ICh7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9IGFkZHMgdGhlXG4gKiB7QGxpbmsgTW9kZWxDbGFzc30gc3RhbXAgYW5kIHRoZSBlbWJlZGRpbmctZGltZW5zaW9uIHByb2JlKS4gVXNlIHRoaXMgZm9yIGFcbiAqIG9uZS1zaG90LCBkZXBlbmRlbmN5LWxpZ2h0IGxpc3RpbmcgLSBlLmcuIGEgQ0xJIHRoYXQgb25seSBuZWVkcyBuYW1lcy90YXNrc1xuICogZm9yIGZ1enp5IHJlc29sdXRpb24gYW5kIGRvZXNuJ3Qgd2FudCBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYCBvciB0aGVcbiAqIHBlci1lbWJlZGRpbmcgcGluZyBjb3N0LiBQcmVmZXIge0BsaW5rIGxpc3RTZXJ2aW5nRW5kcG9pbnRzfSBmb3IgdGhlIGNhY2hlZCxcbiAqIGVucmljaGVkIHZpZXcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmluZ0VuZHBvaW50c1VuY2FjaGVkKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICBjb25zdCBvdXQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGVwIG9mIGNsaWVudC5zZXJ2aW5nRW5kcG9pbnRzLmxpc3QoKSkge1xuICAgIGlmICghZXAubmFtZSkgY29udGludWU7XG4gICAgY29uc3QgcHJvZmlsZSA9IGV4dHJhY3RQcm9maWxlKGVwKTtcbiAgICBvdXQucHVzaCh7XG4gICAgICBuYW1lOiBlcC5uYW1lLFxuICAgICAgLy8gUHJlZmVyIGEgRGF0YWJyaWNrcy1wcm92aWRlZCBodW1hbiBuYW1lIChhIGRpc3BsYXktbmFtZSB0YWcgb3IgYW5cbiAgICAgIC8vIGV4dGVybmFsLW1vZGVsIG5hbWUpOyBlbHNlIGRlcml2ZSBhIHRpdGxlLWNhc2VkIGxhYmVsIGZyb20gdGhlIGlkLlxuICAgICAgZGlzcGxheU5hbWU6IGRpc3BsYXkudG9Nb2RlbERpc3BsYXlOYW1lKGVwLm5hbWUsIHByb3ZpZGVkRGlzcGxheU5hbWUoZXApKSxcbiAgICAgIC4uLihlcC50YXNrICE9PSB1bmRlZmluZWQgPyB7IHRhc2s6IGVwLnRhc2sgfSA6IHt9KSxcbiAgICAgIC4uLihlcC5zdGF0ZT8ucmVhZHkgIT09IHVuZGVmaW5lZCA/IHsgc3RhdGU6IFN0cmluZyhlcC5zdGF0ZS5yZWFkeSkgfSA6IHt9KSxcbiAgICAgIC4uLihlcC5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkID8geyBkZXNjcmlwdGlvbjogZXAuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLihwcm9maWxlID8geyBwcm9maWxlIH0gOiB7fSksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBQdWxsIGEgRGF0YWJyaWNrcy1wcm92aWRlZCBodW1hbiBuYW1lIG9mZiBhIHNlcnZpbmcgZW5kcG9pbnQsIGlmIGFueTpcbiAqIGEgYGRpc3BsYXlfbmFtZWAgLyBgZGlzcGxheU5hbWVgIC8gYG5hbWVgIHRhZyBmaXJzdCwgdGhlbiBhblxuICogZXh0ZXJuYWwtbW9kZWwgYG5hbWVgIGZyb20gdGhlIHNlcnZlZC1lbnRpdHkgY29uZmlnLiBSZXR1cm5zIGBudWxsYFxuICogd2hlbiB0aGUgZW5kcG9pbnQgY2FycmllcyBubyBleHBsaWNpdCBuYW1lICh0aGUgY29tbW9uIGNhc2UgZm9yXG4gKiBGb3VuZGF0aW9uIE1vZGVsIEFQSSBlbmRwb2ludHMpLCBzbyB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gZGVyaXZpbmdcbiAqIG9uZSBmcm9tIHRoZSBpZC5cbiAqL1xuZnVuY3Rpb24gcHJvdmlkZWREaXNwbGF5TmFtZShlcDoge1xuICB0YWdzPzogQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfT47XG4gIGNvbmZpZz86IHsgc2VydmVkX2VudGl0aWVzPzogQXJyYXk8eyBleHRlcm5hbF9tb2RlbD86IHsgbmFtZT86IHN0cmluZyB9IH0+IH07XG59KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHRhZyA9IGVwLnRhZ3M/LmZpbmQoXG4gICAgKHQpID0+IHQua2V5ID09PSBcImRpc3BsYXlfbmFtZVwiIHx8IHQua2V5ID09PSBcImRpc3BsYXlOYW1lXCIgfHwgdC5rZXkgPT09IFwibmFtZVwiLFxuICApO1xuICBjb25zdCBmcm9tVGFnID0gc3RyaW5nLnRyaW1Ub051bGwodGFnPy52YWx1ZSk7XG4gIGlmIChmcm9tVGFnKSByZXR1cm4gZnJvbVRhZztcbiAgZm9yIChjb25zdCBlbnRpdHkgb2YgZXAuY29uZmlnPy5zZXJ2ZWRfZW50aXRpZXMgPz8gW10pIHtcbiAgICBjb25zdCBleHRlcm5hbCA9IHN0cmluZy50cmltVG9OdWxsKGVudGl0eS5leHRlcm5hbF9tb2RlbD8ubmFtZSk7XG4gICAgaWYgKGV4dGVybmFsKSByZXR1cm4gZXh0ZXJuYWw7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRW5kcG9pbnRzKGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGxpc3RTZXJ2aW5nRW5kcG9pbnRzVW5jYWNoZWQoY2xpZW50KTtcbiAgc3RhbXBNb2RlbENsYXNzZXMob3V0KTtcbiAgYXdhaXQgbWVhc3VyZUVtYmVkZGluZ0RpbWVuc2lvbnMoY2xpZW50LCBvdXQpO1xuICBsb2dnZXIuZGVidWcoXCJsaXN0ZWRcIiwgeyBjb3VudDogb3V0Lmxlbmd0aCwgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0IH0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFN0YW1wIGVhY2ggc3VtbWFyeSdzIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LmNsYXNzfSBmcm9tIHRoZSByZWxhdGl2ZVxuICogY2xhc3NpZmljYXRpb24gb2YgdGhlIHdob2xlIHNldC4gTXV0YXRlcyBgc3VtbWFyaWVzYCBpbiBwbGFjZS4gRW5kcG9pbnRzIHRoZVxuICogY2xhc3NpZmllciBkb2Vzbid0IHJlY29nbml6ZSAoY3VzdG9tLCB1bnNjb3JlZCwgbm9uLUxMTSkgYXJlIGxlZnQgd2l0aG91dCBhXG4gKiBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gc3RhbXBNb2RlbENsYXNzZXMoc3VtbWFyaWVzOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10pOiB2b2lkIHtcbiAgY29uc3QgYnVja2V0cyA9IGNsYXNzaWZ5LmNsYXNzaWZ5RW5kcG9pbnRzKHN1bW1hcmllcyk7XG4gIGNvbnN0IGNsYXNzT2YgPSBuZXcgTWFwPHN0cmluZywgbW9kZWwuTW9kZWxDbGFzcz4oKTtcbiAgZm9yIChjb25zdCBjbHMgb2YgTU9ERUxfQ0xBU1NfT1JERVIpIHtcbiAgICBmb3IgKGNvbnN0IGVwIG9mIGJ1Y2tldHNbY2xzXSkgY2xhc3NPZi5zZXQoZXAubmFtZSwgY2xzKTtcbiAgfVxuICBmb3IgKGNvbnN0IHN1bW1hcnkgb2Ygc3VtbWFyaWVzKSB7XG4gICAgY29uc3QgY2xzID0gY2xhc3NPZi5nZXQoc3VtbWFyeS5uYW1lKTtcbiAgICBpZiAoY2xzICE9PSB1bmRlZmluZWQpIHN1bW1hcnkuY2xhc3MgPSBjbHM7XG4gIH1cbn1cblxuLyoqXG4gKiBNZWFzdXJlIHRoZSBlbWJlZGRpbmcgdmVjdG9yIGRpbWVuc2lvbiBvZiBldmVyeSB7QGxpbmsgTW9kZWxDbGFzcy5FbWJlZGRpbmd9XG4gKiBlbmRwb2ludCBieSBwaW5naW5nIGl0IG9uY2UsIGFsbCBpbiBwYXJhbGxlbC4gTXV0YXRlcyB0aGUgbWF0Y2hpbmcgc3VtbWFyaWVzXG4gKiBpbiBwbGFjZSB3aXRoIHRoZSByZXN1bHRpbmcgYGRpbWVuc2lvbmAuIFJ1bnMgb25seSBvbiBhIGNhY2hlIG1pc3MgKGl0J3NcbiAqIGNhbGxlZCBmcm9tIHtAbGluayBmZXRjaEVuZHBvaW50c30pLCBzbyB0aGUgcHJvYmUgY29zdCBpcyBhbW9ydGl6ZWQgYWNyb3NzIHRoZVxuICogY2FjaGVkIFRUTCB3aW5kb3cuIFBlci1lbmRwb2ludCBmYWlsdXJlcyBhcmUgc3dhbGxvd2VkIChsb2dnZWQgYXQgd2Fybikgc29cbiAqIG9uZSB1bnJlYWNoYWJsZSBlbWJlZGRpbmcgbW9kZWwgbmV2ZXIgZmFpbHMgdGhlIGxpc3RpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1lYXN1cmVFbWJlZGRpbmdEaW1lbnNpb25zKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIHN1bW1hcmllczogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHN1bW1hcmllc1xuICAgICAgLmZpbHRlcigocykgPT4gcy5jbGFzcyA9PT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcpXG4gICAgICAubWFwKGFzeW5jIChzdW1tYXJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbiA9IGF3YWl0IHBpbmdFbWJlZGRpbmdEaW1lbnNpb24oY2xpZW50LCBzdW1tYXJ5Lm5hbWUpO1xuICAgICAgICBpZiAoZGltZW5zaW9uICE9PSB1bmRlZmluZWQpIHN1bW1hcnkuZGltZW5zaW9uID0gZGltZW5zaW9uO1xuICAgICAgfSksXG4gICk7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgZW1iZWRkaW5nIGRpbWVuc2lvbiBwcm9iZTogcXVlcnkgYG5hbWVgIHdpdGggYSB0aW55IGBcInBpbmdcImBcbiAqIGlucHV0IGFuZCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgdmVjdG9yLiBSZXR1cm5zIGB1bmRlZmluZWRgIChhbmRcbiAqIGxvZ3MgYXQgd2Fybikgd2hlbiB0aGUgZW5kcG9pbnQgY2FuJ3QgYmUgcXVlcmllZCBvciByZXR1cm5zIG5vIHZlY3RvciAtIHRoZVxuICogZGltZW5zaW9uIGlzIGluZm9ybWF0aW9uYWwsIG5ldmVyIHJlcXVpcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaW5nRW1iZWRkaW5nRGltZW5zaW9uKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIG5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuc2VydmluZ0VuZHBvaW50cy5xdWVyeSh7IG5hbWUsIGlucHV0OiBcInBpbmdcIiB9KTtcbiAgICBjb25zdCBkaW1lbnNpb24gPSByZXNwb25zZS5kYXRhPy5bMF0/LmVtYmVkZGluZz8ubGVuZ3RoO1xuICAgIGlmICh0eXBlb2YgZGltZW5zaW9uID09PSBcIm51bWJlclwiICYmIGRpbWVuc2lvbiA+IDApIHJldHVybiBkaW1lbnNpb247XG4gICAgbG9nZ2VyLndhcm4oXCJlbWJlZGRpbmcgcGluZyByZXR1cm5lZCBubyB2ZWN0b3JcIiwgeyBuYW1lIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZW1iZWRkaW5nIHBpbmcgZmFpbGVkXCIsIHsgbmFtZSwgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQdWxsIHRoZSBGb3VuZGF0aW9uIE1vZGVsIEFQSSBgcXVhbGl0eWAgLyBgc3BlZWRgIC8gYGNvc3RgIHNjb3JlcyBvZmYgYVxuICogc2VydmluZy1lbmRwb2ludCBsaXN0aW5nIGVudHJ5LiBEYXRhYnJpY2tzIHJldHVybnMgdGhlc2UgdW5kZXJcbiAqIGBjb25maWcuc2VydmVkX2VudGl0aWVzW10uZm91bmRhdGlvbl9tb2RlbC5haV9nYXRld2F5X21vZGVsX3Byb2ZpbGVgXG4gKiAoc25ha2VfY2FzZSBhdCB0aGUgd2lyZSBsZXZlbCwgcHJlc2VydmVkIHZlcmJhdGltIGJ5IHRoZSBTREspLCBidXQgdGhlIGZpZWxkXG4gKiBpcyBuZXdlciB0aGFuIHRoZSB0eXBlZCBgRm91bmRhdGlvbk1vZGVsYCBpbnRlcmZhY2UsIHNvIHdlIHJlYWQgaXQgdGhyb3VnaCBhXG4gKiBzdHJ1Y3R1cmFsIGNhc3QuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBubyBzZXJ2ZWQgZW50aXR5IGNhcnJpZXMgYSBwcm9maWxlXG4gKiAoY3VzdG9tIG1vZGVscywgZW1iZWRkaW5ncywgYW5kIGJyYW5kLW5ldyBlbmRwb2ludHMgdGhhdCBEYXRhYnJpY2tzIGhhcyBub3RcbiAqIHNjb3JlZCB5ZXQpLlxuICovXG5mdW5jdGlvbiBleHRyYWN0UHJvZmlsZShlcDogdW5rbm93bik6IE1vZGVsUHJvZmlsZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVudGl0aWVzID0gKFxuICAgIGVwIGFzIHtcbiAgICAgIGNvbmZpZz86IHtcbiAgICAgICAgc2VydmVkX2VudGl0aWVzPzogQXJyYXk8e1xuICAgICAgICAgIGZvdW5kYXRpb25fbW9kZWw/OiB7XG4gICAgICAgICAgICBhaV9nYXRld2F5X21vZGVsX3Byb2ZpbGU/OiB7XG4gICAgICAgICAgICAgIHF1YWxpdHk/OiBudW1iZXI7XG4gICAgICAgICAgICAgIHNwZWVkPzogbnVtYmVyO1xuICAgICAgICAgICAgICBjb3N0PzogbnVtYmVyO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICB9PjtcbiAgICAgIH07XG4gICAgfVxuICApLmNvbmZpZz8uc2VydmVkX2VudGl0aWVzO1xuICBpZiAoIWVudGl0aWVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgIGNvbnN0IHJhdyA9IGVudGl0eS5mb3VuZGF0aW9uX21vZGVsPy5haV9nYXRld2F5X21vZGVsX3Byb2ZpbGU7XG4gICAgaWYgKCFyYXcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHByb2ZpbGU6IE1vZGVsUHJvZmlsZSA9IHt9O1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocmF3LnF1YWxpdHkpKSBwcm9maWxlLnF1YWxpdHkgPSByYXcucXVhbGl0eTtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHJhdy5zcGVlZCkpIHByb2ZpbGUuc3BlZWQgPSByYXcuc3BlZWQ7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShyYXcuY29zdCkpIHByb2ZpbGUuY29zdCA9IHJhdy5jb3N0O1xuICAgIGlmIChPYmplY3Qua2V5cyhwcm9maWxlKS5sZW5ndGggPiAwKSByZXR1cm4gcHJvZmlsZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZvcmNlLWV2aWN0IGNhY2hlZCBlbmRwb2ludCBsaXN0aW5ncyB2aWEgQXBwS2l0J3MgYENhY2hlTWFuYWdlcmAuIFdpdGggYVxuICogYGhvc3RgIGRlbGV0ZXMgdGhhdCBvbmUgd29ya3NwYWNlJ3MgZW50cnk7IHdpdGhvdXQgb25lIGNsZWFycyBldmVyeSBjYWNoZVxuICogZW50cnkgb24gdGhlIG1hbmFnZXIgKHNpbmNlIGBDYWNoZU1hbmFnZXJgIGRvZXNuJ3QgZXhwb3NlIGEgbmFtZXNwYWNlLXNjb3BlZFxuICogY2xlYXIsIHRoaXMgaXMgdGhlIGJydXRlLWZvcmNlIHBhdGggLSBmaW5lIGZvciB0ZXN0cywgYXZvaWQgaW4gc3RlYWR5LXN0YXRlXG4gKiBjb2RlKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyU2VydmluZ0VuZHBvaW50c0NhY2hlKGhvc3Q/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCk7XG4gIGlmIChob3N0KSB7XG4gICAgY29uc3Qga2V5ID0gY2FjaGUuZ2VuZXJhdGVLZXkoW0NBQ0hFX0tFWV9OQU1FU1BBQ0UsIGhvc3RdLCBTSEFSRURfVVNFUl9LRVkpO1xuICAgIGF3YWl0IGNhY2hlLmRlbGV0ZShrZXkpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGNhY2hlLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgZnV6enktcmVzb2x2aW5nIGEgdXNlci1zdXBwbGllZCBtb2RlbCBuYW1lIGFnYWluc3QgdGhlIGxpdmVcbiAqIGVuZHBvaW50IGxpc3QuIGBzY29yZWAgaXMgRnVzZS5qcydzIGRpc3RhbmNlIChgMGAgaXMgZXhhY3QsIGAxYCBpcyBubyBtYXRjaCk7XG4gKiBgbWF0Y2hlZGAgaXMgYGZhbHNlYCB3aGVuIHRoZSBzY29yZSBleGNlZWRzIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZCBzb1xuICogY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBpbnB1dCAoRGF0YWJyaWNrcyB3aWxsIHRoZW4gcmV0dXJuIGFcbiAqIGNsZWFuIDQwNCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRNb2RlbCB7XG4gIG1vZGVsSWQ6IHN0cmluZztcbiAgbWF0Y2hlZDogYm9vbGVhbjtcbiAgc2NvcmU/OiBudW1iZXI7XG59XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IHtAbGluayByZXNvbHZlTW9kZWxJZH0gLyB7QGxpbmsgc2VhcmNoU2VydmluZ0VuZHBvaW50c30uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVNb2RlbE9wdGlvbnMge1xuICAvKiogRnVzZS5qcyB0aHJlc2hvbGQgKDAgPSBleGFjdCwgMSA9IGFueXRoaW5nKS4gRGVmYXVsdCBgMC40YC4gKi9cbiAgdGhyZXNob2xkPzogbnVtYmVyO1xufVxuXG4vKiogQSBzZXJ2aW5nIGVuZHBvaW50IHBhaXJlZCB3aXRoIGl0cyBmdXp6eS1tYXRjaCBkaXN0YW5jZSBmb3IgYSBxdWVyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcmVkRW5kcG9pbnQge1xuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeTtcbiAgLyoqIEZ1c2UuanMgZGlzdGFuY2U6IGAwYCBpcyBleGFjdCwgYDFgIGlzIG5vIG1hdGNoLiAqL1xuICBzY29yZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZ1enp5LXJhbmsgZW5kcG9pbnRzIGJ5IGhvdyBjbG9zZWx5IHRoZWlyIGBuYW1lYCBtYXRjaGVzIGBpbnB1dGAsIGJlc3RcbiAqIChsb3dlc3Qgc2NvcmUpIGZpcnN0LCBrZWVwaW5nIG9ubHkgdGhvc2Ugd2l0aGluIGB0aHJlc2hvbGRgOlxuICpcbiAqIDEuIEFuIGV4YWN0IG5hbWUgbWF0Y2ggc2hvcnQtY2lyY3VpdHMgdG8gYSBzaW5nbGUgYHNjb3JlOiAwYCByZXN1bHQuXG4gKiAyLiBPdGhlcndpc2UgdGhlIGlucHV0IGlzIHRva2VuaXplZCAoZGFzaGVzIC8gdW5kZXJzY29yZXMgLyBzcGFjZXMgYmVjb21lXG4gKiAgICBzZXBhcmF0b3JzKSBhbmQgZmVkIHRocm91Z2ggRnVzZS5qcyBleHRlbmRlZCBzZWFyY2gsIHdoaWNoIEFORC1zIGVhY2hcbiAqICAgIHRva2VuIHdpdGggZnV6enkgbWF0Y2hpbmcgZW5hYmxlZCAtIHRoZSBcInRva2VuaXplZCBmdXp6eSBtYXRjaFwiIGEgY2FsbGVyXG4gKiAgICByZWFjaGVzIGZvciB3aGVuIHRoZXkgdHlwZSBgXCJjbGF1ZGUgc29ubmV0XCJgIGluc3RlYWQgb2YgdGhlIGZ1bGwgZW5kcG9pbnRcbiAqICAgIG5hbWUuXG4gKlxuICogUmV0dXJucyBgW11gIGZvciBhbiBlbXB0eSBlbmRwb2ludCBsaXN0IG9yIHdoZW4gYGlucHV0YCB0b2tlbml6ZXMgdG8gbm90aGluZyxcbiAqIHNvIGNhbGxlcnMgZmFsbCBiYWNrIHRvIHRoZSByYXcgaW5wdXQgYW5kIGxldCBEYXRhYnJpY2tzIHN1cmZhY2UgYSBjbGVhbiA0MDQuXG4gKiBUaGlzIG11bHRpLXJlc3VsdCBjb3JlIGlzIHNoYXJlZCBieSB7QGxpbmsgcmVzb2x2ZU1vZGVsSWR9IChzaW5nbGUgYmVzdCkgYW5kXG4gKiB0aGUgcmFua2VkIGByYW5rTW9kZWxzYCBzZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoXG4gIGlucHV0OiBzdHJpbmcsXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBTY29yZWRFbmRwb2ludFtdIHtcbiAgaWYgKGVuZHBvaW50cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgZm9yIChjb25zdCBlcCBvZiBlbmRwb2ludHMpIHtcbiAgICBpZiAoZXAubmFtZSA9PT0gaW5wdXQpIHJldHVybiBbeyBlbmRwb2ludDogZXAsIHNjb3JlOiAwIH1dO1xuICB9XG4gIGNvbnN0IHRocmVzaG9sZCA9IG9wdGlvbnMudGhyZXNob2xkID8/IERFRkFVTFRfRlVaWllfVEhSRVNIT0xEO1xuICAvLyBGdXNlIDcuMyBoYXMgbm8gYnVpbHQtaW4gdG9rZW5pemUgaG9vazsgaW4gZXh0ZW5kZWQgc2VhcmNoLCBzcGFjZS1zZXBhcmF0ZWRcbiAgLy8gdG9rZW5zIGFyZSBBTkQtZWQgd2l0aCBmdXp6eSBtYXRjaGluZyBlbmFibGVkLiBXZSBsZWFuIG9uIHRoZSBzaGFyZWRcbiAgLy8gdG9rZW5pemVyIHNvIHRoZSBzcGxpdHRpbmcgcnVsZXMgc3RheSBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRvb2xraXQuXG4gIGNvbnN0IHF1ZXJ5ID0gQXJyYXkuZnJvbShcbiAgICBzdHJpbmcudG9rZW5pemVXaXRoT3B0aW9ucyh7IGxvd2VyQ2FzZTogdHJ1ZSwgY2FtZWxDYXNlOiBmYWxzZSB9LCBpbnB1dCksXG4gICkuam9pbihcIiBcIik7XG4gIGlmICghcXVlcnkpIHJldHVybiBbXTtcbiAgY29uc3QgZnVzZSA9IG5ldyBGdXNlKGVuZHBvaW50cywge1xuICAgIGtleXM6IFtcIm5hbWVcIl0sXG4gICAgdGhyZXNob2xkLFxuICAgIGlnbm9yZUxvY2F0aW9uOiB0cnVlLFxuICAgIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgICB1c2VFeHRlbmRlZFNlYXJjaDogdHJ1ZSxcbiAgICBpc0Nhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIGZ1c2VcbiAgICAuc2VhcmNoKHF1ZXJ5KVxuICAgIC5maWx0ZXIoKHIpID0+IChyLnNjb3JlID8/IDApIDw9IHRocmVzaG9sZClcbiAgICAubWFwKChyKSA9PiAoeyBlbmRwb2ludDogci5pdGVtLCBzY29yZTogci5zY29yZSA/PyAwIH0pKTtcbn1cblxuLyoqXG4gKiBTbmFwIGEgdXNlci1zdXBwbGllZCBtb2RlbCBuYW1lIHRvIHRoZSBzaW5nbGUgY2xvc2VzdCBjb25maWd1cmVkIHNlcnZpbmdcbiAqIGVuZHBvaW50IHZpYSB7QGxpbmsgc2VhcmNoU2VydmluZ0VuZHBvaW50c30uIFJldHVybnMgdGhlIGlucHV0IHVuY2hhbmdlZCB3aXRoXG4gKiBgbWF0Y2hlZDogZmFsc2VgIHdoZW4gbm90aGluZyBzY29yZXMgd2l0aGluIHRoZSB0aHJlc2hvbGQgKG9yIHRoZSBjYXRhbG9ndWVcbiAqIGlzIGVtcHR5KSwgc28gYSBkZWxpYmVyYXRlIG1vZGVsIGlkIGlzIG5ldmVyIHNpbGVudGx5IHJld3JpdHRlbiB0byBhXG4gKiBzaW1pbGFyLWxvb2tpbmcgbmVpZ2hib3VyIGFuZCB0aGUgdXBzdHJlYW0gY2FsbCBzdXJmYWNlcyB0aGUgY2Fub25pY2FsIDQwNC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNb2RlbElkKFxuICBpbnB1dDogc3RyaW5nLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbCB7XG4gIGNvbnN0IFtiZXN0XSA9IHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoaW5wdXQsIGVuZHBvaW50cywgb3B0aW9ucyk7XG4gIGlmIChiZXN0KSB7XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogYmVzdC5lbmRwb2ludC5uYW1lLCBtYXRjaGVkOiB0cnVlLCBzY29yZTogYmVzdC5zY29yZSB9O1xuICB9XG4gIHJldHVybiB7IG1vZGVsSWQ6IGlucHV0LCBtYXRjaGVkOiBmYWxzZSB9O1xufVxuIl19
|
|
287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUNMLFFBQVEsRUFDUixPQUFPLEVBQ1AsS0FBSyxHQUdOLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRTNCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVqRCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBRTdCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFTM0MsMEdBQTBHO0FBQzFHLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXhELDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFM0MsZ0VBQWdFO0FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7QUFFaEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQVd2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLE1BQTJCLEVBQzNCLElBQVksRUFDWixVQUF1QyxFQUFFO0lBRXpDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJ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S0FBSztLQUN2QixDQUFDLENBQUM7SUFDSCxPQUFPLElBQUk7U0FDUixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO1NBQzFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsS0FBYSxFQUNiLFNBQTRDLEVBQzVDLFVBQStCLEVBQUU7SUFFakMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLHNCQUFzQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGl2ZSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgY2F0YWxvZ3VlIGFjY2Vzcy5cbiAqXG4gKiBMaXN0cyB0aGUgd29ya3NwYWNlJ3MgYC9zZXJ2aW5nLWVuZHBvaW50c2Agb25jZSBwZXIgaG9zdCBhbmQgY2FjaGVzIHRoZVxuICogcmVzdWx0IHdpdGggYSBUVEwgdmlhIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgLCB3aXRoIGNvbmN1cnJlbnQgY2FsbGVyc1xuICogc2hhcmluZyBvbmUgaW4tZmxpZ2h0IHByb21pc2UgKHRoZSBjb2FsZXNjaW5nIHBhdHRlcm4gb2YgUHl0aG9uJ3NcbiAqIGBjYWNoZXRvb2xzLWFzeW5jYCkuIFN1cmZhY2VzIGVhY2ggZW5kcG9pbnQgYXMgYSBzdGFibGVcbiAqIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSAtIGluY2x1ZGluZyB0aGUgRm91bmRhdGlvbiBNb2RlbCBBUElcbiAqIGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgcHJvZmlsZSB3aGVuIHByZXNlbnQsIHRoZSBjbGFzc2lmaWVkXG4gKiB7QGxpbmsgTW9kZWxDbGFzc30sIGFuZCAoZm9yIGVtYmVkZGluZyBlbmRwb2ludHMpIHRoZSBtZWFzdXJlZCB2ZWN0b3JcbiAqIGBkaW1lbnNpb25gIC0gYW5kIHNuYXBzIGxvb3NlLCBodW1hbi10eXBlZCBuYW1lcyB0byByZWFsIGVuZHBvaW50IGlkc1xuICogdGhyb3VnaCBgZnVzZS5qc2AgZXh0ZW5kZWQgc2VhcmNoIHNvIHRva2VucyBsaWtlIGBcImNsYXVkZSBzb25uZXRcImAgcmVzb2x2ZSB0b1xuICogYGRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZgLlxuICpcbiAqIFRoZSBjbGFzcyBzdGFtcCBhbmQgZW1iZWRkaW5nIGRpbWVuc2lvbiBhcmUgY29tcHV0ZWQgb25jZSBwZXIgY2FjaGUgbG9hZDpcbiAqIGV2ZXJ5IGVtYmVkZGluZyBlbmRwb2ludCBpcyBcInBpbmdlZFwiIGluIHBhcmFsbGVsIGFuZCB0aGUgcmVzdWx0aW5nIHZlY3RvclxuICogbGVuZ3RoIHJlY29yZGVkLCBzbyB0aGUgY29zdCBpcyBwYWlkIG9uIGEgY2FjaGUgbWlzcywgbm90IHBlciByZWFkLiBUaGUgcGluZ1xuICogaXMgYmVzdC1lZmZvcnQgLSBhIGZhaWx1cmUgbG9ncyBhdCBkZWJ1ZyBhbmQgbGVhdmVzIGBkaW1lbnNpb25gIHVuc2V0IHJhdGhlclxuICogdGhhbiBmYWlsaW5nIHRoZSB3aG9sZSBsaXN0aW5nLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBjbGFzc2lmeSxcbiAgZGlzcGxheSxcbiAgbW9kZWwsXG4gIHR5cGUgTW9kZWxQcm9maWxlLFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9jbGFzc2VzLnRzXCI7XG5cbmNvbnN0IHsgTW9kZWxDbGFzcyB9ID0gbW9kZWw7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtb2RlbC9zZXJ2aW5nXCIpO1xuXG4vKipcbiAqIFN0cnVjdHVyYWwgdHlwZSBmb3IgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudCwgcmUtZXhwb3J0ZWQgc28gdGhlIHJlc3RcbiAqIG9mIHRoaXMgcGFja2FnZSBjYW4ga2VlcCBpbXBvcnRpbmcgaXQgZnJvbSBoZXJlLiBTZWVcbiAqIGBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZWAgKG5vZGUtYXBwa2l0KSBmb3IgdGhlIGNhbm9uaWNhbCBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gYXBwa2l0LldvcmtzcGFjZUNsaWVudExpa2U7XG5cbi8qKiBEZWZhdWx0IFRUTCBmb3IgdGhlIGluLW1lbW9yeSBlbmRwb2ludCBjYWNoZS4gTWF0Y2hlcyB0aGUgRGF0YWJyaWNrcyBTREsncyBzZXNzaW9uIGxpZmV0aW1lIGJ1ZGdldC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREVMX0NBQ0hFX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKiBEZWZhdWx0IEZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGJlbG93IHdoaWNoIGEgZnV6enkgbWF0Y2ggaXMgYWNjZXB0ZWQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GVVpaWV9USFJFU0hPTEQgPSAwLjQ7XG5cbi8qKiBDYWNoZSBrZXkgcGFydHMgdW5kZXIgd2hpY2ggZW5kcG9pbnQgbGlzdGluZ3MgYXJlIHN0b3JlZC4gKi9cbmNvbnN0IENBQ0hFX0tFWV9OQU1FU1BBQ0UgPSBcInNlcnZpbmctZW5kcG9pbnRzXCI7XG5cbi8qKlxuICogU3RhYmxlIGB1c2VyS2V5YCBhcmcgZm9yIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXIuZ2V0T3JFeGVjdXRlYC4gRW5kcG9pbnRcbiAqIHZpc2liaWxpdHkgaXMgZWZmZWN0aXZlbHkgd29ya3NwYWNlLXNjb3BlZCAod2UgY2FjaGUgYnkgaG9zdCBpbiB0aGUga2V5XG4gKiBwYXJ0cyksIHNvIGEgc2luZ2xlIHNoYXJlZCBrZXkgbGV0cyBldmVyeSB1c2VyIG9mIHRoZSBzYW1lIHdvcmtzcGFjZSBzaGFyZVxuICogb25lIGNhY2hlZCBmZXRjaCBhbmQgY29hbGVzY2Ugb24gdGhlIGluLWZsaWdodCBwcm9taXNlLiBQZXJtaXNzaW9ucyBjYW5cbiAqIGRpZmZlciBpbiB0aGVvcnksIGJ1dCB0aGUgRm91bmRhdGlvbiBNb2RlbCBBUEkgY2F0YWxvZ3VlIGlzIHRoZSBzYW1lIHZpZXcgZm9yXG4gKiBldmVyeSBjYWxsZXIuXG4gKi9cbmNvbnN0IFNIQVJFRF9VU0VSX0tFWSA9IFwibW9kZWwtc2hhcmVkXCI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMge1xuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgY2FjaGUgVFRMIGZvciB0aGlzIGNhbGwsIGluIG1pbGxpc2Vjb25kcy4gRm9yd2FyZGVkIHRvXG4gICAqIGBDYWNoZU1hbmFnZXJgIGFzIHNlY29uZHMuXG4gICAqL1xuICB0dGxNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBMaXN0IE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzIGZvciB0aGUgd29ya3NwYWNlIG93bmluZyBgY2xpZW50YCwgcm91dGVkXG4gKiB0aHJvdWdoIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgLiBUaGUgbWFuYWdlciBnaXZlcyB1cyBldmVyeXRoaW5nXG4gKiBgY2FjaGV0b29scy5UVExDYWNoZWAgcHJvdmlkZXMgcGx1cyB3aGF0IGBjYWNoZXRvb2xzLWFzeW5jYCBhZGRzIG9uIHRvcDpcbiAqIHBlci1lbnRyeSBUVEwsIGluLWZsaWdodCByZXF1ZXN0IGNvYWxlc2NpbmcgKGNvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSBvbmVcbiAqIGZldGNoIHZpYSB0aGUgbWFuYWdlcidzIGludGVybmFsIGBpbkZsaWdodFJlcXVlc3RzYCBtYXApLCBib3VuZGVkIHNpemUsXG4gKiB0ZWxlbWV0cnkgc3BhbnMgKGBjYWNoZS5nZXRPckV4ZWN1dGVgKSwgYW5kIG9wdGlvbmFsIExha2ViYXNlIHBlcnNpc3RlbmNlIHNvXG4gKiB0aGUgY2F0YWxvZ3VlIHN1cnZpdmVzIHJlc3RhcnRzIHdoZW4gdGhlIGxha2ViYXNlIHBsdWdpbiBpcyB3aXJlZCB1cC5cbiAqXG4gKiBSZXR1cm5zIHBsYWluIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSBvYmplY3RzIChhIHN0YWJsZSBzdWJzZXQgb2YgdGhlXG4gKiBTREsgdHlwZSkgc28gY2FjaGUgaGl0cyBuZXZlciBleHBvc2Ugc3RhbGUgU0RLIGludGVybmFscy4gRXJyb3JzIGZyb21cbiAqIGBDYWNoZU1hbmFnZXJgIG9yIHRoZSBTREsgZmV0Y2ggcHJvcGFnYXRlIHRvIHRoZSBjYWxsZXIgLSB3ZSBkb24ndCBzd2FsbG93XG4gKiB0aGVtIHNvIHVzZXJzIHNlZSB0aGUgcmVhbCBhdXRoIC8gbmV0d29yayBpc3N1ZS5cbiAqXG4gKiBAcGFyYW0gaG9zdCAtIFdvcmtzcGFjZSBob3N0IHVzZWQgYXMgdGhlIGNhY2hlIGtleS4gUGFzcyB0aGUgdmFsdWUgcmVzb2x2ZWRcbiAqICAgZnJvbSBgY2xpZW50LmNvbmZpZy5nZXRIb3N0KClgIHNvIG11bHRpLWhvc3QgYXBwcyBzaGFyZSBvbmUgZW50cnkgcGVyXG4gKiAgIHdvcmtzcGFjZS5cbiAqIEBwYXJhbSBvcHRpb25zLnR0bE1zIC0gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgVFRMIGp1c3QgZm9yIHRoaXMgY2FsbC4gRm9yd2FyZGVkXG4gKiAgIHRvIGBDYWNoZU1hbmFnZXJgIGFzIHNlY29uZHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmluZ0VuZHBvaW50cyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBob3N0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgY29uc3QgdHRsU2VjID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCgob3B0aW9ucy50dGxNcyA/PyBERUZBVUxUX01PREVMX0NBQ0hFX1RUTF9NUykgLyAxMDAwKSk7XG4gIHJldHVybiBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuZ2V0T3JFeGVjdXRlKFxuICAgIFtDQUNIRV9LRVlfTkFNRVNQQUNFLCBob3N0XSxcbiAgICAoKSA9PiBmZXRjaEVuZHBvaW50cyhjbGllbnQpLFxuICAgIFNIQVJFRF9VU0VSX0tFWSxcbiAgICB7IHR0bDogdHRsU2VjIH0sXG4gICk7XG59XG5cbi8qKlxuICogTGlzdCB0aGUgd29ya3NwYWNlJ3Mgc2VydmluZyBlbmRwb2ludHMgYXMgbWluaW1hbFxuICoge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnl9IG9iamVjdHMgc3RyYWlnaHQgZnJvbSB0aGUgU0RLOiBubyBjYWNoaW5nLCBhbmRcbiAqIG5vbmUgb2YgdGhlIGNhY2hlLWxvYWQgZW5yaWNobWVudCAoe0BsaW5rIGxpc3RTZXJ2aW5nRW5kcG9pbnRzfSBhZGRzIHRoZVxuICoge0BsaW5rIE1vZGVsQ2xhc3N9IHN0YW1wIGFuZCB0aGUgZW1iZWRkaW5nLWRpbWVuc2lvbiBwcm9iZSkuIFVzZSB0aGlzIGZvciBhXG4gKiBvbmUtc2hvdCwgZGVwZW5kZW5jeS1saWdodCBsaXN0aW5nIC0gZS5nLiBhIENMSSB0aGF0IG9ubHkgbmVlZHMgbmFtZXMvdGFza3NcbiAqIGZvciBmdXp6eSByZXNvbHV0aW9uIGFuZCBkb2Vzbid0IHdhbnQgQXBwS2l0J3MgYENhY2hlTWFuYWdlcmAgb3IgdGhlXG4gKiBwZXItZW1iZWRkaW5nIHBpbmcgY29zdC4gUHJlZmVyIHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gZm9yIHRoZSBjYWNoZWQsXG4gKiBlbnJpY2hlZCB2aWV3LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNlcnZpbmdFbmRwb2ludHNVbmNhY2hlZChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgY29uc3Qgb3V0OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10gPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBlcCBvZiBjbGllbnQuc2VydmluZ0VuZHBvaW50cy5saXN0KCkpIHtcbiAgICBpZiAoIWVwLm5hbWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHByb2ZpbGUgPSBleHRyYWN0UHJvZmlsZShlcCk7XG4gICAgb3V0LnB1c2goe1xuICAgICAgbmFtZTogZXAubmFtZSxcbiAgICAgIC8vIFByZWZlciBhIERhdGFicmlja3MtcHJvdmlkZWQgaHVtYW4gbmFtZSAoYSBkaXNwbGF5LW5hbWUgdGFnIG9yIGFuXG4gICAgICAvLyBleHRlcm5hbC1tb2RlbCBuYW1lKTsgZWxzZSBkZXJpdmUgYSB0aXRsZS1jYXNlZCBsYWJlbCBmcm9tIHRoZSBpZC5cbiAgICAgIGRpc3BsYXlOYW1lOiBkaXNwbGF5LnRvTW9kZWxEaXNwbGF5TmFtZShlcC5uYW1lLCBwcm92aWRlZERpc3BsYXlOYW1lKGVwKSksXG4gICAgICAuLi4oZXAudGFzayAhPT0gdW5kZWZpbmVkID8geyB0YXNrOiBlcC50YXNrIH0gOiB7fSksXG4gICAgICAuLi4oZXAuc3RhdGU/LnJlYWR5ICE9PSB1bmRlZmluZWQgPyB7IHN0YXRlOiBTdHJpbmcoZXAuc3RhdGUucmVhZHkpIH0gOiB7fSksXG4gICAgICAuLi4oZXAuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCA/IHsgZGVzY3JpcHRpb246IGVwLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICBzdXBwb3J0c1Rvb2xzOiBjbGFzc2lmeS5zdXBwb3J0c1Rvb2xzQnlGYW1pbHkoZXAubmFtZSksXG4gICAgICAuLi4ocHJvZmlsZSA/IHsgcHJvZmlsZSB9IDoge30pLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUHVsbCBhIERhdGFicmlja3MtcHJvdmlkZWQgaHVtYW4gbmFtZSBvZmYgYSBzZXJ2aW5nIGVuZHBvaW50LCBpZiBhbnk6XG4gKiBhIGBkaXNwbGF5X25hbWVgIC8gYGRpc3BsYXlOYW1lYCAvIGBuYW1lYCB0YWcgZmlyc3QsIHRoZW4gYW5cbiAqIGV4dGVybmFsLW1vZGVsIGBuYW1lYCBmcm9tIHRoZSBzZXJ2ZWQtZW50aXR5IGNvbmZpZy4gUmV0dXJucyBgbnVsbGBcbiAqIHdoZW4gdGhlIGVuZHBvaW50IGNhcnJpZXMgbm8gZXhwbGljaXQgbmFtZSAodGhlIGNvbW1vbiBjYXNlIGZvclxuICogRm91bmRhdGlvbiBNb2RlbCBBUEkgZW5kcG9pbnRzKSwgc28gdGhlIGNhbGxlciBmYWxscyBiYWNrIHRvIGRlcml2aW5nXG4gKiBvbmUgZnJvbSB0aGUgaWQuXG4gKi9cbmZ1bmN0aW9uIHByb3ZpZGVkRGlzcGxheU5hbWUoZXA6IHtcbiAgdGFncz86IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIH0+O1xuICBjb25maWc/OiB7IHNlcnZlZF9lbnRpdGllcz86IEFycmF5PHsgZXh0ZXJuYWxfbW9kZWw/OiB7IG5hbWU/OiBzdHJpbmcgfSB9PiB9O1xufSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB0YWcgPSBlcC50YWdzPy5maW5kKFxuICAgICh0KSA9PiB0LmtleSA9PT0gXCJkaXNwbGF5X25hbWVcIiB8fCB0LmtleSA9PT0gXCJkaXNwbGF5TmFtZVwiIHx8IHQua2V5ID09PSBcIm5hbWVcIixcbiAgKTtcbiAgY29uc3QgZnJvbVRhZyA9IHN0cmluZy50cmltVG9OdWxsKHRhZz8udmFsdWUpO1xuICBpZiAoZnJvbVRhZykgcmV0dXJuIGZyb21UYWc7XG4gIGZvciAoY29uc3QgZW50aXR5IG9mIGVwLmNvbmZpZz8uc2VydmVkX2VudGl0aWVzID8/IFtdKSB7XG4gICAgY29uc3QgZXh0ZXJuYWwgPSBzdHJpbmcudHJpbVRvTnVsbChlbnRpdHkuZXh0ZXJuYWxfbW9kZWw/Lm5hbWUpO1xuICAgIGlmIChleHRlcm5hbCkgcmV0dXJuIGV4dGVybmFsO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEVuZHBvaW50cyhjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBvdXQgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50c1VuY2FjaGVkKGNsaWVudCk7XG4gIHN0YW1wTW9kZWxDbGFzc2VzKG91dCk7XG4gIGF3YWl0IG1lYXN1cmVFbWJlZGRpbmdEaW1lbnNpb25zKGNsaWVudCwgb3V0KTtcbiAgbG9nZ2VyLmRlYnVnKFwibGlzdGVkXCIsIHsgY291bnQ6IG91dC5sZW5ndGgsIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCB9KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTdGFtcCBlYWNoIHN1bW1hcnkncyB7QGxpbmsgU2VydmluZ0VuZHBvaW50U3VtbWFyeS5jbGFzc30gZnJvbSB0aGUgcmVsYXRpdmVcbiAqIGNsYXNzaWZpY2F0aW9uIG9mIHRoZSB3aG9sZSBzZXQuIE11dGF0ZXMgYHN1bW1hcmllc2AgaW4gcGxhY2UuIEVuZHBvaW50cyB0aGVcbiAqIGNsYXNzaWZpZXIgZG9lc24ndCByZWNvZ25pemUgKGN1c3RvbSwgdW5zY29yZWQsIG5vbi1MTE0pIGFyZSBsZWZ0IHdpdGhvdXQgYVxuICogY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIHN0YW1wTW9kZWxDbGFzc2VzKHN1bW1hcmllczogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdKTogdm9pZCB7XG4gIGNvbnN0IGJ1Y2tldHMgPSBjbGFzc2lmeS5jbGFzc2lmeUVuZHBvaW50cyhzdW1tYXJpZXMpO1xuICBjb25zdCBjbGFzc09mID0gbmV3IE1hcDxzdHJpbmcsIG1vZGVsLk1vZGVsQ2xhc3M+KCk7XG4gIGZvciAoY29uc3QgY2xzIG9mIE1PREVMX0NMQVNTX09SREVSKSB7XG4gICAgZm9yIChjb25zdCBlcCBvZiBidWNrZXRzW2Nsc10pIGNsYXNzT2Yuc2V0KGVwLm5hbWUsIGNscyk7XG4gIH1cbiAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIHN1bW1hcmllcykge1xuICAgIGNvbnN0IGNscyA9IGNsYXNzT2YuZ2V0KHN1bW1hcnkubmFtZSk7XG4gICAgaWYgKGNscyAhPT0gdW5kZWZpbmVkKSBzdW1tYXJ5LmNsYXNzID0gY2xzO1xuICB9XG59XG5cbi8qKlxuICogTWVhc3VyZSB0aGUgZW1iZWRkaW5nIHZlY3RvciBkaW1lbnNpb24gb2YgZXZlcnkge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfVxuICogZW5kcG9pbnQgYnkgcGluZ2luZyBpdCBvbmNlLCBhbGwgaW4gcGFyYWxsZWwuIE11dGF0ZXMgdGhlIG1hdGNoaW5nIHN1bW1hcmllc1xuICogaW4gcGxhY2Ugd2l0aCB0aGUgcmVzdWx0aW5nIGBkaW1lbnNpb25gLiBSdW5zIG9ubHkgb24gYSBjYWNoZSBtaXNzIChpdCdzXG4gKiBjYWxsZWQgZnJvbSB7QGxpbmsgZmV0Y2hFbmRwb2ludHN9KSwgc28gdGhlIHByb2JlIGNvc3QgaXMgYW1vcnRpemVkIGFjcm9zcyB0aGVcbiAqIGNhY2hlZCBUVEwgd2luZG93LiBQZXItZW5kcG9pbnQgZmFpbHVyZXMgYXJlIHN3YWxsb3dlZCAobG9nZ2VkIGF0IHdhcm4pIHNvXG4gKiBvbmUgdW5yZWFjaGFibGUgZW1iZWRkaW5nIG1vZGVsIG5ldmVyIGZhaWxzIHRoZSBsaXN0aW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBtZWFzdXJlRW1iZWRkaW5nRGltZW5zaW9ucyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBzdW1tYXJpZXM6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBzdW1tYXJpZXNcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMuY2xhc3MgPT09IE1vZGVsQ2xhc3MuRW1iZWRkaW5nKVxuICAgICAgLm1hcChhc3luYyAoc3VtbWFyeSkgPT4ge1xuICAgICAgICBjb25zdCBkaW1lbnNpb24gPSBhd2FpdCBwaW5nRW1iZWRkaW5nRGltZW5zaW9uKGNsaWVudCwgc3VtbWFyeS5uYW1lKTtcbiAgICAgICAgaWYgKGRpbWVuc2lvbiAhPT0gdW5kZWZpbmVkKSBzdW1tYXJ5LmRpbWVuc2lvbiA9IGRpbWVuc2lvbjtcbiAgICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEJlc3QtZWZmb3J0IGVtYmVkZGluZyBkaW1lbnNpb24gcHJvYmU6IHF1ZXJ5IGBuYW1lYCB3aXRoIGEgdGlueSBgXCJwaW5nXCJgXG4gKiBpbnB1dCBhbmQgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIHZlY3Rvci4gUmV0dXJucyBgdW5kZWZpbmVkYCAoYW5kXG4gKiBsb2dzIGF0IHdhcm4pIHdoZW4gdGhlIGVuZHBvaW50IGNhbid0IGJlIHF1ZXJpZWQgb3IgcmV0dXJucyBubyB2ZWN0b3IgLSB0aGVcbiAqIGRpbWVuc2lvbiBpcyBpbmZvcm1hdGlvbmFsLCBuZXZlciByZXF1aXJlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGluZ0VtYmVkZGluZ0RpbWVuc2lvbihcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBuYW1lOiBzdHJpbmcsXG4pOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnNlcnZpbmdFbmRwb2ludHMucXVlcnkoeyBuYW1lLCBpbnB1dDogXCJwaW5nXCIgfSk7XG4gICAgY29uc3QgZGltZW5zaW9uID0gcmVzcG9uc2UuZGF0YT8uWzBdPy5lbWJlZGRpbmc/Lmxlbmd0aDtcbiAgICBpZiAodHlwZW9mIGRpbWVuc2lvbiA9PT0gXCJudW1iZXJcIiAmJiBkaW1lbnNpb24gPiAwKSByZXR1cm4gZGltZW5zaW9uO1xuICAgIGxvZ2dlci53YXJuKFwiZW1iZWRkaW5nIHBpbmcgcmV0dXJuZWQgbm8gdmVjdG9yXCIsIHsgbmFtZSB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImVtYmVkZGluZyBwaW5nIGZhaWxlZFwiLCB7IG5hbWUsIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogUHVsbCB0aGUgRm91bmRhdGlvbiBNb2RlbCBBUEkgYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBzY29yZXMgb2ZmIGFcbiAqIHNlcnZpbmctZW5kcG9pbnQgbGlzdGluZyBlbnRyeS4gRGF0YWJyaWNrcyByZXR1cm5zIHRoZXNlIHVuZGVyXG4gKiBgY29uZmlnLnNlcnZlZF9lbnRpdGllc1tdLmZvdW5kYXRpb25fbW9kZWwuYWlfZ2F0ZXdheV9tb2RlbF9wcm9maWxlYFxuICogKHNuYWtlX2Nhc2UgYXQgdGhlIHdpcmUgbGV2ZWwsIHByZXNlcnZlZCB2ZXJiYXRpbSBieSB0aGUgU0RLKSwgYnV0IHRoZSBmaWVsZFxuICogaXMgbmV3ZXIgdGhhbiB0aGUgdHlwZWQgYEZvdW5kYXRpb25Nb2RlbGAgaW50ZXJmYWNlLCBzbyB3ZSByZWFkIGl0IHRocm91Z2ggYVxuICogc3RydWN0dXJhbCBjYXN0LiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gbm8gc2VydmVkIGVudGl0eSBjYXJyaWVzIGEgcHJvZmlsZVxuICogKGN1c3RvbSBtb2RlbHMsIGVtYmVkZGluZ3MsIGFuZCBicmFuZC1uZXcgZW5kcG9pbnRzIHRoYXQgRGF0YWJyaWNrcyBoYXMgbm90XG4gKiBzY29yZWQgeWV0KS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFByb2ZpbGUoZXA6IHVua25vd24pOiBNb2RlbFByb2ZpbGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRpdGllcyA9IChcbiAgICBlcCBhcyB7XG4gICAgICBjb25maWc/OiB7XG4gICAgICAgIHNlcnZlZF9lbnRpdGllcz86IEFycmF5PHtcbiAgICAgICAgICBmb3VuZGF0aW9uX21vZGVsPzoge1xuICAgICAgICAgICAgYWlfZ2F0ZXdheV9tb2RlbF9wcm9maWxlPzoge1xuICAgICAgICAgICAgICBxdWFsaXR5PzogbnVtYmVyO1xuICAgICAgICAgICAgICBzcGVlZD86IG51bWJlcjtcbiAgICAgICAgICAgICAgY29zdD86IG51bWJlcjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfTtcbiAgICAgICAgfT47XG4gICAgICB9O1xuICAgIH1cbiAgKS5jb25maWc/LnNlcnZlZF9lbnRpdGllcztcbiAgaWYgKCFlbnRpdGllcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICBjb25zdCByYXcgPSBlbnRpdHkuZm91bmRhdGlvbl9tb2RlbD8uYWlfZ2F0ZXdheV9tb2RlbF9wcm9maWxlO1xuICAgIGlmICghcmF3KSBjb250aW51ZTtcbiAgICBjb25zdCBwcm9maWxlOiBNb2RlbFByb2ZpbGUgPSB7fTtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHJhdy5xdWFsaXR5KSkgcHJvZmlsZS5xdWFsaXR5ID0gcmF3LnF1YWxpdHk7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShyYXcuc3BlZWQpKSBwcm9maWxlLnNwZWVkID0gcmF3LnNwZWVkO1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocmF3LmNvc3QpKSBwcm9maWxlLmNvc3QgPSByYXcuY29zdDtcbiAgICBpZiAoT2JqZWN0LmtleXMocHJvZmlsZSkubGVuZ3RoID4gMCkgcmV0dXJuIHByb2ZpbGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGb3JjZS1ldmljdCBjYWNoZWQgZW5kcG9pbnQgbGlzdGluZ3MgdmlhIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgLiBXaXRoIGFcbiAqIGBob3N0YCBkZWxldGVzIHRoYXQgb25lIHdvcmtzcGFjZSdzIGVudHJ5OyB3aXRob3V0IG9uZSBjbGVhcnMgZXZlcnkgY2FjaGVcbiAqIGVudHJ5IG9uIHRoZSBtYW5hZ2VyIChzaW5jZSBgQ2FjaGVNYW5hZ2VyYCBkb2Vzbid0IGV4cG9zZSBhIG5hbWVzcGFjZS1zY29wZWRcbiAqIGNsZWFyLCB0aGlzIGlzIHRoZSBicnV0ZS1mb3JjZSBwYXRoIC0gZmluZSBmb3IgdGVzdHMsIGF2b2lkIGluIHN0ZWFkeS1zdGF0ZVxuICogY29kZSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShob3N0Pzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNhY2hlID0gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpO1xuICBpZiAoaG9zdCkge1xuICAgIGNvbnN0IGtleSA9IGNhY2hlLmdlbmVyYXRlS2V5KFtDQUNIRV9LRVlfTkFNRVNQQUNFLCBob3N0XSwgU0hBUkVEX1VTRVJfS0VZKTtcbiAgICBhd2FpdCBjYWNoZS5kZWxldGUoa2V5KTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBjYWNoZS5jbGVhcigpO1xuICB9XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGZ1enp5LXJlc29sdmluZyBhIHVzZXItc3VwcGxpZWQgbW9kZWwgbmFtZSBhZ2FpbnN0IHRoZSBsaXZlXG4gKiBlbmRwb2ludCBsaXN0LiBgc2NvcmVgIGlzIEZ1c2UuanMncyBkaXN0YW5jZSAoYDBgIGlzIGV4YWN0LCBgMWAgaXMgbm8gbWF0Y2gpO1xuICogYG1hdGNoZWRgIGlzIGBmYWxzZWAgd2hlbiB0aGUgc2NvcmUgZXhjZWVkcyB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQgc29cbiAqIGNhbGxlcnMgY2FuIGZhbGwgYmFjayB0byB0aGUgb3JpZ2luYWwgaW5wdXQgKERhdGFicmlja3Mgd2lsbCB0aGVuIHJldHVybiBhXG4gKiBjbGVhbiA0MDQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkTW9kZWwge1xuICBtb2RlbElkOiBzdHJpbmc7XG4gIG1hdGNoZWQ6IGJvb2xlYW47XG4gIHNjb3JlPzogbnVtYmVyO1xufVxuXG4vKiogT3B0aW9ucyBhY2NlcHRlZCBieSB7QGxpbmsgcmVzb2x2ZU1vZGVsSWR9IC8ge0BsaW5rIHNlYXJjaFNlcnZpbmdFbmRwb2ludHN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlTW9kZWxPcHRpb25zIHtcbiAgLyoqIEZ1c2UuanMgdGhyZXNob2xkICgwID0gZXhhY3QsIDEgPSBhbnl0aGluZykuIERlZmF1bHQgYDAuNGAuICovXG4gIHRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIFJlcXVpcmUgYSBtb2RlbCB2ZXJpZmllZCBmb3IgYSBjb21wbGV0ZSBmdW5jdGlvbi10b29sIHJvdW5kLXRyaXAuICovXG4gIHJlcXVpcmVzVG9vbHM/OiBib29sZWFuO1xufVxuXG4vKiogQSBzZXJ2aW5nIGVuZHBvaW50IHBhaXJlZCB3aXRoIGl0cyBmdXp6eS1tYXRjaCBkaXN0YW5jZSBmb3IgYSBxdWVyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NvcmVkRW5kcG9pbnQge1xuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeTtcbiAgLyoqIEZ1c2UuanMgZGlzdGFuY2U6IGAwYCBpcyBleGFjdCwgYDFgIGlzIG5vIG1hdGNoLiAqL1xuICBzY29yZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZ1enp5LXJhbmsgZW5kcG9pbnRzIGJ5IGhvdyBjbG9zZWx5IHRoZWlyIGBuYW1lYCBtYXRjaGVzIGBpbnB1dGAsIGJlc3RcbiAqIChsb3dlc3Qgc2NvcmUpIGZpcnN0LCBrZWVwaW5nIG9ubHkgdGhvc2Ugd2l0aGluIGB0aHJlc2hvbGRgOlxuICpcbiAqIDEuIEFuIGV4YWN0IG5hbWUgbWF0Y2ggc2hvcnQtY2lyY3VpdHMgdG8gYSBzaW5nbGUgYHNjb3JlOiAwYCByZXN1bHQuXG4gKiAyLiBPdGhlcndpc2UgdGhlIGlucHV0IGlzIHRva2VuaXplZCAoZGFzaGVzIC8gdW5kZXJzY29yZXMgLyBzcGFjZXMgYmVjb21lXG4gKiAgICBzZXBhcmF0b3JzKSBhbmQgZmVkIHRocm91Z2ggRnVzZS5qcyBleHRlbmRlZCBzZWFyY2gsIHdoaWNoIEFORC1zIGVhY2hcbiAqICAgIHRva2VuIHdpdGggZnV6enkgbWF0Y2hpbmcgZW5hYmxlZCAtIHRoZSBcInRva2VuaXplZCBmdXp6eSBtYXRjaFwiIGEgY2FsbGVyXG4gKiAgICByZWFjaGVzIGZvciB3aGVuIHRoZXkgdHlwZSBgXCJjbGF1ZGUgc29ubmV0XCJgIGluc3RlYWQgb2YgdGhlIGZ1bGwgZW5kcG9pbnRcbiAqICAgIG5hbWUuXG4gKlxuICogUmV0dXJucyBgW11gIGZvciBhbiBlbXB0eSBlbmRwb2ludCBsaXN0IG9yIHdoZW4gYGlucHV0YCB0b2tlbml6ZXMgdG8gbm90aGluZyxcbiAqIHNvIGNhbGxlcnMgZmFsbCBiYWNrIHRvIHRoZSByYXcgaW5wdXQgYW5kIGxldCBEYXRhYnJpY2tzIHN1cmZhY2UgYSBjbGVhbiA0MDQuXG4gKiBUaGlzIG11bHRpLXJlc3VsdCBjb3JlIGlzIHNoYXJlZCBieSB7QGxpbmsgcmVzb2x2ZU1vZGVsSWR9IChzaW5nbGUgYmVzdCkgYW5kXG4gKiB0aGUgcmFua2VkIGByYW5rTW9kZWxzYCBzZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoXG4gIGlucHV0OiBzdHJpbmcsXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBTY29yZWRFbmRwb2ludFtdIHtcbiAgaWYgKGVuZHBvaW50cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgZm9yIChjb25zdCBlcCBvZiBlbmRwb2ludHMpIHtcbiAgICBpZiAoZXAubmFtZSA9PT0gaW5wdXQpIHJldHVybiBbeyBlbmRwb2ludDogZXAsIHNjb3JlOiAwIH1dO1xuICB9XG4gIGNvbnN0IHRocmVzaG9sZCA9IG9wdGlvbnMudGhyZXNob2xkID8/IERFRkFVTFRfRlVaWllfVEhSRVNIT0xEO1xuICAvLyBGdXNlIDcuMyBoYXMgbm8gYnVpbHQtaW4gdG9rZW5pemUgaG9vazsgaW4gZXh0ZW5kZWQgc2VhcmNoLCBzcGFjZS1zZXBhcmF0ZWRcbiAgLy8gdG9rZW5zIGFyZSBBTkQtZWQgd2l0aCBmdXp6eSBtYXRjaGluZyBlbmFibGVkLiBXZSBsZWFuIG9uIHRoZSBzaGFyZWRcbiAgLy8gdG9rZW5pemVyIHNvIHRoZSBzcGxpdHRpbmcgcnVsZXMgc3RheSBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRvb2xraXQuXG4gIGNvbnN0IHF1ZXJ5ID0gQXJyYXkuZnJvbShcbiAgICBzdHJpbmcudG9rZW5pemVXaXRoT3B0aW9ucyh7IGxvd2VyQ2FzZTogdHJ1ZSwgY2FtZWxDYXNlOiBmYWxzZSB9LCBpbnB1dCksXG4gICkuam9pbihcIiBcIik7XG4gIGlmICghcXVlcnkpIHJldHVybiBbXTtcbiAgY29uc3QgZnVzZSA9IG5ldyBGdXNlKGVuZHBvaW50cywge1xuICAgIGtleXM6IFtcIm5hbWVcIl0sXG4gICAgdGhyZXNob2xkLFxuICAgIGlnbm9yZUxvY2F0aW9uOiB0cnVlLFxuICAgIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgICB1c2VFeHRlbmRlZFNlYXJjaDogdHJ1ZSxcbiAgICBpc0Nhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIGZ1c2VcbiAgICAuc2VhcmNoKHF1ZXJ5KVxuICAgIC5maWx0ZXIoKHIpID0+IChyLnNjb3JlID8/IDApIDw9IHRocmVzaG9sZClcbiAgICAubWFwKChyKSA9PiAoeyBlbmRwb2ludDogci5pdGVtLCBzY29yZTogci5zY29yZSA/PyAwIH0pKTtcbn1cblxuLyoqXG4gKiBTbmFwIGEgdXNlci1zdXBwbGllZCBtb2RlbCBuYW1lIHRvIHRoZSBzaW5nbGUgY2xvc2VzdCBjb25maWd1cmVkIHNlcnZpbmdcbiAqIGVuZHBvaW50IHZpYSB7QGxpbmsgc2VhcmNoU2VydmluZ0VuZHBvaW50c30uIFJldHVybnMgdGhlIGlucHV0IHVuY2hhbmdlZCB3aXRoXG4gKiBgbWF0Y2hlZDogZmFsc2VgIHdoZW4gbm90aGluZyBzY29yZXMgd2l0aGluIHRoZSB0aHJlc2hvbGQgKG9yIHRoZSBjYXRhbG9ndWVcbiAqIGlzIGVtcHR5KSwgc28gYSBkZWxpYmVyYXRlIG1vZGVsIGlkIGlzIG5ldmVyIHNpbGVudGx5IHJld3JpdHRlbiB0byBhXG4gKiBzaW1pbGFyLWxvb2tpbmcgbmVpZ2hib3VyIGFuZCB0aGUgdXBzdHJlYW0gY2FsbCBzdXJmYWNlcyB0aGUgY2Fub25pY2FsIDQwNC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNb2RlbElkKFxuICBpbnB1dDogc3RyaW5nLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbCB7XG4gIGNvbnN0IFtiZXN0XSA9IHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoaW5wdXQsIGVuZHBvaW50cywgb3B0aW9ucyk7XG4gIGlmIChiZXN0KSB7XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogYmVzdC5lbmRwb2ludC5uYW1lLCBtYXRjaGVkOiB0cnVlLCBzY29yZTogYmVzdC5zY29yZSB9O1xuICB9XG4gIHJldHVybiB7IG1vZGVsSWQ6IGlucHV0LCBtYXRjaGVkOiBmYWxzZSB9O1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@databricks/appkit": "^0.43.0",
|
|
27
|
-
"@dbx-tools/appkit": "0.6.
|
|
28
|
-
"@dbx-tools/shared-core": "0.6.
|
|
29
|
-
"@dbx-tools/shared-model": "0.6.
|
|
27
|
+
"@dbx-tools/appkit": "0.6.64",
|
|
28
|
+
"@dbx-tools/shared-core": "0.6.64",
|
|
29
|
+
"@dbx-tools/shared-model": "0.6.64",
|
|
30
30
|
"fuse.js": "^7.4.2"
|
|
31
31
|
},
|
|
32
32
|
"main": "./lib/index.js",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"./package.json": "./package.json"
|
|
44
44
|
}
|
|
45
45
|
},
|
|
46
|
-
"version": "0.6.
|
|
46
|
+
"version": "0.6.64",
|
|
47
47
|
"types": "./lib/index.d.ts",
|
|
48
48
|
"type": "module",
|
|
49
49
|
"exports": {
|
package/src/resolve.ts
CHANGED
|
@@ -57,6 +57,8 @@ export interface ResolveModelInput {
|
|
|
57
57
|
fuzzy?: boolean;
|
|
58
58
|
/** Fuse.js threshold forwarded to the fuzzy `search` match ({@link searchServingEndpoints}). */
|
|
59
59
|
threshold?: number;
|
|
60
|
+
/** Require a model that supports a complete function-tool round-trip. */
|
|
61
|
+
requiresTools?: boolean;
|
|
60
62
|
/**
|
|
61
63
|
* Chat capability class to resolve when no `explicit` id is given. The live
|
|
62
64
|
* catalogue is classified by its Foundation Model API scores and the top
|
|
@@ -129,7 +131,10 @@ export function rankModels(
|
|
|
129
131
|
// class; bucket order is already best-first.
|
|
130
132
|
const candidates: RankedModel[] = [];
|
|
131
133
|
for (const modelClass of eligible) {
|
|
132
|
-
for (const endpoint of classified[modelClass])
|
|
134
|
+
for (const endpoint of classified[modelClass]) {
|
|
135
|
+
if (query.requiresTools && !classify.endpointCapabilities(endpoint).tools) continue;
|
|
136
|
+
candidates.push({ endpoint, modelClass });
|
|
137
|
+
}
|
|
133
138
|
}
|
|
134
139
|
|
|
135
140
|
const search = query.search?.trim();
|
|
@@ -181,6 +186,7 @@ export function rankModelId(
|
|
|
181
186
|
search,
|
|
182
187
|
limit: 1,
|
|
183
188
|
...(options.threshold !== undefined ? { threshold: options.threshold } : {}),
|
|
189
|
+
...(options.requiresTools !== undefined ? { requiresTools: options.requiresTools } : {}),
|
|
184
190
|
});
|
|
185
191
|
if (!top) return { modelId: search, matched: false };
|
|
186
192
|
return { modelId: top.endpoint.name, matched: true, score: top.score };
|
|
@@ -280,16 +286,24 @@ export function resolveModel(
|
|
|
280
286
|
): ResolvedModelSelection {
|
|
281
287
|
if (input.explicit !== undefined) {
|
|
282
288
|
if (input.fuzzy === false) {
|
|
289
|
+
if (input.requiresTools) assertToolSupport(endpoints, input.explicit);
|
|
283
290
|
return { modelId: input.explicit, source: "explicit" };
|
|
284
291
|
}
|
|
285
292
|
const [top] = rankModels(endpoints, buildQuery(input, input.explicit));
|
|
293
|
+
if (input.requiresTools && !top) {
|
|
294
|
+
throw new Error(`No tool-capable model matches "${input.explicit}"`);
|
|
295
|
+
}
|
|
286
296
|
return { modelId: top?.endpoint.name ?? input.explicit, source: "fuzzy-match" };
|
|
287
297
|
}
|
|
288
298
|
|
|
289
299
|
// Operator-pinned fallbacks win when present and live (e.g. a regulated
|
|
290
300
|
// workspace restricted to an approved subset).
|
|
291
301
|
if (input.modelClass === undefined && input.fallbacks && input.fallbacks.length > 0) {
|
|
292
|
-
const present = new Set(
|
|
302
|
+
const present = new Set(
|
|
303
|
+
endpoints
|
|
304
|
+
.filter((endpoint) => !input.requiresTools || classify.endpointCapabilities(endpoint).tools)
|
|
305
|
+
.map((endpoint) => endpoint.name),
|
|
306
|
+
);
|
|
293
307
|
const pinned = input.fallbacks.find((id) => present.has(id));
|
|
294
308
|
if (pinned) return { modelId: pinned, source: "fallback" };
|
|
295
309
|
}
|
|
@@ -302,6 +316,16 @@ export function resolveModel(
|
|
|
302
316
|
const floorSource =
|
|
303
317
|
input.modelClass !== undefined ? modelsForClass(input.modelClass) : (input.fallbacks ?? []);
|
|
304
318
|
const floor = object.sequence(floorSource).concat(FALLBACK_MODEL_IDS).distinct().toArray();
|
|
319
|
+
if (input.requiresTools) {
|
|
320
|
+
const available = new Set(
|
|
321
|
+
endpoints
|
|
322
|
+
.filter((endpoint) => classify.endpointCapabilities(endpoint).tools)
|
|
323
|
+
.map((endpoint) => endpoint.name),
|
|
324
|
+
);
|
|
325
|
+
const selected = floor.find((id) => available.has(id));
|
|
326
|
+
if (!selected) throw new Error("No tool-capable model is available");
|
|
327
|
+
return { modelId: selected, source };
|
|
328
|
+
}
|
|
305
329
|
return { modelId: pickFirstAvailable(floor, endpoints), source };
|
|
306
330
|
}
|
|
307
331
|
|
|
@@ -310,11 +334,20 @@ function buildQuery(input: ResolveModelInput, search: string | undefined): Model
|
|
|
310
334
|
return {
|
|
311
335
|
...(search !== undefined ? { search } : {}),
|
|
312
336
|
...(input.modelClass !== undefined ? { modelClass: input.modelClass } : {}),
|
|
337
|
+
...(input.requiresTools !== undefined ? { requiresTools: input.requiresTools } : {}),
|
|
313
338
|
...(input.threshold !== undefined ? { threshold: input.threshold } : {}),
|
|
314
339
|
limit: 1,
|
|
315
340
|
};
|
|
316
341
|
}
|
|
317
342
|
|
|
343
|
+
/** Throw when an explicit id is absent or not verified for function tools. */
|
|
344
|
+
function assertToolSupport(endpoints: readonly ServingEndpointSummary[], modelId: string): void {
|
|
345
|
+
const endpoint = endpoints.find((candidate) => candidate.name === modelId);
|
|
346
|
+
if (!endpoint || !classify.endpointCapabilities(endpoint).tools) {
|
|
347
|
+
throw new Error(`Model "${modelId}" does not support function tools`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
318
351
|
/**
|
|
319
352
|
* Find the first id in `candidates` whose endpoint is present in `endpoints`.
|
|
320
353
|
* Returns the top candidate when the workspace has none of them so callers
|
package/src/serving.ts
CHANGED
|
@@ -133,6 +133,7 @@ export async function listServingEndpointsUncached(
|
|
|
133
133
|
...(ep.task !== undefined ? { task: ep.task } : {}),
|
|
134
134
|
...(ep.state?.ready !== undefined ? { state: String(ep.state.ready) } : {}),
|
|
135
135
|
...(ep.description !== undefined ? { description: ep.description } : {}),
|
|
136
|
+
supportsTools: classify.supportsToolsByFamily(ep.name),
|
|
136
137
|
...(profile ? { profile } : {}),
|
|
137
138
|
});
|
|
138
139
|
}
|
|
@@ -307,6 +308,8 @@ export interface ResolvedModel {
|
|
|
307
308
|
export interface ResolveModelOptions {
|
|
308
309
|
/** Fuse.js threshold (0 = exact, 1 = anything). Default `0.4`. */
|
|
309
310
|
threshold?: number;
|
|
311
|
+
/** Require a model verified for a complete function-tool round-trip. */
|
|
312
|
+
requiresTools?: boolean;
|
|
310
313
|
}
|
|
311
314
|
|
|
312
315
|
/** A serving endpoint paired with its fuzzy-match distance for a query. */
|