@dbx-tools/appkit-model-gateway 0.9.190 → 0.9.194
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 +6 -0
- package/index.ts +7 -1
- package/lib/index.d.ts +7 -1
- package/lib/index.js +6 -2
- package/lib/src/ai-decide.d.ts +50 -0
- package/lib/src/ai-decide.js +406 -0
- package/lib/src/gateway.d.ts +6 -2
- package/lib/src/gateway.js +72 -16
- package/lib/src/model-context.d.ts +32 -0
- package/lib/src/model-context.js +270 -0
- package/lib/src/models.d.ts +3 -3
- package/lib/src/models.js +55 -8
- package/lib/src/reasoning-adapt.js +2 -5
- package/lib/src/routes.js +18 -2
- package/lib/src/smart-router.d.ts +4 -7
- package/lib/src/smart-router.js +7 -175
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/ai-decide.ts +552 -0
- package/src/gateway.ts +96 -14
- package/src/model-context.ts +306 -0
- package/src/models.ts +66 -4
- package/src/reasoning-adapt.ts +1 -5
- package/src/routes.ts +16 -0
- package/src/smart-router.ts +8 -187
package/lib/src/gateway.js
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
import { modelTemperatureSupportFor } from "@dbx-tools/model";
|
|
7
7
|
import { log } from "@dbx-tools/shared-core";
|
|
8
8
|
import { ModelClass, ModelClassSchema, } from "@dbx-tools/shared-model";
|
|
9
|
-
import { MODEL_GATEWAY_DEFAULTS, SMART_ROUTER_HARNESS_HEADER, SMART_ROUTER_MODEL_ID, SMART_ROUTER_PROFILER_STATUS_HEADER, SMART_ROUTER_ROUTE_MODEL_HEADER, SMART_ROUTER_SELECTED_MODEL_HEADER, SMART_ROUTER_SERVED_TIER_HEADER, SMART_ROUTER_SOURCE_HEADER, SMART_ROUTER_TASK_TIER_HEADER, isSmartRouterModelId, } from "@dbx-tools/shared-model-gateway";
|
|
9
|
+
import { AI_DECIDE_CONFIDENCE_HEADER, AI_DECIDE_MODEL_ID, AI_DECIDE_SELECTED_MODEL_HEADER, AI_DECIDE_STRATEGY_HEADER, AiDecideStrategySchema, MODEL_GATEWAY_DEFAULTS, SMART_ROUTER_HARNESS_HEADER, SMART_ROUTER_MODEL_ID, SMART_ROUTER_PROFILER_STATUS_HEADER, SMART_ROUTER_ROUTE_MODEL_HEADER, SMART_ROUTER_SELECTED_MODEL_HEADER, SMART_ROUTER_SERVED_TIER_HEADER, SMART_ROUTER_SOURCE_HEADER, SMART_ROUTER_TASK_TIER_HEADER, isAiDecideModelId, isSmartRouterModelId, } from "@dbx-tools/shared-model-gateway";
|
|
10
|
+
import { AiDecideRouterService } from "./ai-decide.js";
|
|
10
11
|
import { listModelsPayload } from "./models.js";
|
|
11
12
|
import { adaptInferenceReasoning, learnAndAdaptReasoningRetry } from "./reasoning-adapt.js";
|
|
12
13
|
import { DatabricksModelRegistry, } from "./registry.js";
|
|
@@ -30,6 +31,7 @@ export class ModelGatewayError extends Error {
|
|
|
30
31
|
export class ModelGateway {
|
|
31
32
|
registry;
|
|
32
33
|
smartRouter;
|
|
34
|
+
aiDecide;
|
|
33
35
|
smartRouterMode;
|
|
34
36
|
model;
|
|
35
37
|
modelClass;
|
|
@@ -43,6 +45,7 @@ export class ModelGateway {
|
|
|
43
45
|
: {}),
|
|
44
46
|
};
|
|
45
47
|
this.registry = registry ?? new DatabricksModelRegistry(registryOptions);
|
|
48
|
+
this.aiDecide = options.aiDecideService ?? new AiDecideRouterService();
|
|
46
49
|
this.smartRouterMode = options.smartRouter ?? MODEL_GATEWAY_DEFAULTS.smartRouter;
|
|
47
50
|
if (this.smartRouterMode !== "false") {
|
|
48
51
|
this.smartRouter = new SmartModelRouter({
|
|
@@ -62,23 +65,35 @@ export class ModelGateway {
|
|
|
62
65
|
options.preferSystemModels ?? MODEL_GATEWAY_DEFAULTS.preferSystemModels;
|
|
63
66
|
}
|
|
64
67
|
/** Return the live OpenAI model list, including Codex metadata when requested. */
|
|
65
|
-
async models(originator, search) {
|
|
68
|
+
async models(originator, search, modelSource = "foundation", includeMetadata = false) {
|
|
66
69
|
const codex = isCodexOriginator(originator);
|
|
67
70
|
logger.debug("listing models", { codex, search });
|
|
68
71
|
const query = search?.trim();
|
|
69
72
|
const smartRouterSearch = query !== undefined && SMART_ROUTER_MODEL_ID.includes(query.toLowerCase());
|
|
70
|
-
const
|
|
73
|
+
const aiDecideSearch = query !== undefined && AI_DECIDE_MODEL_ID.includes(query.toLowerCase());
|
|
74
|
+
const discovered = query && !smartRouterSearch && !aiDecideSearch
|
|
75
|
+
? await this.registry.search(query)
|
|
76
|
+
: await this.registry.list();
|
|
77
|
+
const targets = modelSource === "all"
|
|
78
|
+
? discovered
|
|
79
|
+
: discovered.filter((target) => target.endpoint?.modelSource === modelSource);
|
|
71
80
|
const smartRouterTargets = this.smartRouterMode === "true" && query && !smartRouterSearch
|
|
72
|
-
? await this.registry.list()
|
|
81
|
+
? (await this.registry.list()).filter((target) => modelSource === "all" || target.endpoint?.modelSource === modelSource)
|
|
73
82
|
: targets;
|
|
74
83
|
const shouldProbeSmartRouter = Boolean(this.smartRouter) && (this.smartRouterMode === "true" || !query || smartRouterSearch);
|
|
75
84
|
const smartRouterEnabled = shouldProbeSmartRouter && (await this.smartRouter.isEnabled(smartRouterTargets));
|
|
85
|
+
const aiDecideEnabled = (!query || aiDecideSearch) &&
|
|
86
|
+
(await this.aiDecide.isEnabled(targets
|
|
87
|
+
.map((target) => target.endpoint)
|
|
88
|
+
.filter((endpoint) => endpoint !== undefined)));
|
|
76
89
|
if (this.smartRouterMode === "true" && !smartRouterEnabled) {
|
|
77
90
|
throw new ModelGatewayError(503, "Databricks Smart Router is required but unavailable for the active workspace identity");
|
|
78
91
|
}
|
|
79
92
|
logger.debug("listed models", { codex, count: targets.length });
|
|
80
|
-
const payload = listModelsPayload(targets, codex, query !== undefined && query.length > 0, this.preferSystemModels, smartRouterEnabled && (!query || smartRouterSearch));
|
|
81
|
-
return smartRouterSearch
|
|
93
|
+
const payload = listModelsPayload(targets, codex, query !== undefined && query.length > 0, this.preferSystemModels, smartRouterEnabled && (!query || smartRouterSearch), aiDecideEnabled && (!query || aiDecideSearch), includeMetadata);
|
|
94
|
+
return smartRouterSearch || aiDecideSearch
|
|
95
|
+
? onlyVirtualModel(payload, smartRouterSearch ? SMART_ROUTER_MODEL_ID : AI_DECIDE_MODEL_ID)
|
|
96
|
+
: payload;
|
|
82
97
|
}
|
|
83
98
|
/** Resolve and execute one inference request. */
|
|
84
99
|
async inference(protocol, body, headers, signal) {
|
|
@@ -89,6 +104,7 @@ export class ModelGateway {
|
|
|
89
104
|
}, protocol);
|
|
90
105
|
logger.debug("resolving request", {
|
|
91
106
|
smartRouter: selection.smartRouter === true,
|
|
107
|
+
aiDecide: selection.aiDecide === true,
|
|
92
108
|
clientProtocol: protocol,
|
|
93
109
|
model: selection.model,
|
|
94
110
|
modelClass: selection.modelClass,
|
|
@@ -96,8 +112,8 @@ export class ModelGateway {
|
|
|
96
112
|
stream: sanitizedBody.stream === true,
|
|
97
113
|
});
|
|
98
114
|
const features = requestedFeatures(sanitizedBody);
|
|
99
|
-
if (selection.smartRouter && protocol === "openai-embeddings") {
|
|
100
|
-
throw new ModelGatewayError(400, "
|
|
115
|
+
if ((selection.smartRouter || selection.aiDecide) && protocol === "openai-embeddings") {
|
|
116
|
+
throw new ModelGatewayError(400, "Virtual model routers are available only for chat requests");
|
|
101
117
|
}
|
|
102
118
|
const smartRouter = selection.smartRouter && this.smartRouter
|
|
103
119
|
? await this.smartRouter.resolve({
|
|
@@ -113,7 +129,23 @@ export class ModelGateway {
|
|
|
113
129
|
if (selection.smartRouter && !smartRouter) {
|
|
114
130
|
throw new ModelGatewayError(404, "Databricks Smart Router is disabled");
|
|
115
131
|
}
|
|
132
|
+
const registryTargets = smartRouter ? undefined : await this.registry.list();
|
|
133
|
+
const aiDecide = selection.aiDecide
|
|
134
|
+
? await this.aiDecide.select(sanitizedBody, (registryTargets ?? [])
|
|
135
|
+
.map((candidate) => candidate.endpoint)
|
|
136
|
+
.filter((endpoint) => endpoint !== undefined), undefined, {
|
|
137
|
+
strategy: aiDecideStrategy(headers),
|
|
138
|
+
filters: {
|
|
139
|
+
...(features.tools ? { requiresTools: true } : {}),
|
|
140
|
+
...(features.structuredOutput ? { requiresStructuredOutput: true } : {}),
|
|
141
|
+
},
|
|
142
|
+
signal,
|
|
143
|
+
})
|
|
144
|
+
: undefined;
|
|
116
145
|
const target = smartRouter?.target ??
|
|
146
|
+
(aiDecide
|
|
147
|
+
? registryTargets?.find((candidate) => candidate.id === aiDecide.endpoint.name)
|
|
148
|
+
: undefined) ??
|
|
117
149
|
(await this.registry.resolve(selection.model, {
|
|
118
150
|
...(protocol === "openai-embeddings" ? { modelClass: ModelClass.Embedding } : {}),
|
|
119
151
|
...(selection.modelClass ? { modelClass: selection.modelClass } : {}),
|
|
@@ -126,7 +158,7 @@ export class ModelGateway {
|
|
|
126
158
|
}
|
|
127
159
|
const route = resolveRoute({
|
|
128
160
|
clientProtocol: protocol,
|
|
129
|
-
...(!smartRouter && selection.model ? { requestedModel: selection.model } : {}),
|
|
161
|
+
...(!smartRouter && !aiDecide && selection.model ? { requestedModel: selection.model } : {}),
|
|
130
162
|
originator: headers.get("originator") ?? undefined,
|
|
131
163
|
preferSystemModels: this.preferSystemModels,
|
|
132
164
|
features,
|
|
@@ -156,12 +188,16 @@ export class ModelGateway {
|
|
|
156
188
|
if (smartRouter) {
|
|
157
189
|
applySmartRouterObservationHeaders(response.headers, smartRouter.observation);
|
|
158
190
|
}
|
|
191
|
+
if (aiDecide)
|
|
192
|
+
applyAiDecideObservationHeaders(response.headers, aiDecide.observation);
|
|
159
193
|
return response;
|
|
160
194
|
}
|
|
161
195
|
const forwarded = gatewayResponseHeaders(response.headers);
|
|
162
196
|
forwarded.set("x-dbx-tools-upstream", route.upstreamProtocol);
|
|
163
197
|
if (smartRouter)
|
|
164
198
|
applySmartRouterObservationHeaders(forwarded, smartRouter.observation);
|
|
199
|
+
if (aiDecide)
|
|
200
|
+
applyAiDecideObservationHeaders(forwarded, aiDecide.observation);
|
|
165
201
|
return new Response(response.body, {
|
|
166
202
|
status: response.status,
|
|
167
203
|
statusText: response.statusText,
|
|
@@ -220,12 +256,21 @@ export function gatewayModelSelection(body, headers, defaults = {}, protocol) {
|
|
|
220
256
|
if (model && parsedClass?.data) {
|
|
221
257
|
throw new ModelGatewayError(400, "Model and model class are mutually exclusive");
|
|
222
258
|
}
|
|
223
|
-
if (model)
|
|
224
|
-
|
|
259
|
+
if (model) {
|
|
260
|
+
if (isSmartRouterModelId(model))
|
|
261
|
+
return { smartRouter: true };
|
|
262
|
+
if (isAiDecideModelId(model))
|
|
263
|
+
return { aiDecide: true };
|
|
264
|
+
return { model };
|
|
265
|
+
}
|
|
225
266
|
if (parsedClass?.data)
|
|
226
267
|
return { modelClass: parsedClass.data };
|
|
227
268
|
if (defaults.model) {
|
|
228
|
-
|
|
269
|
+
if (isSmartRouterModelId(defaults.model))
|
|
270
|
+
return { smartRouter: true };
|
|
271
|
+
if (isAiDecideModelId(defaults.model))
|
|
272
|
+
return { aiDecide: true };
|
|
273
|
+
return { model: defaults.model };
|
|
229
274
|
}
|
|
230
275
|
if (defaults.modelClass)
|
|
231
276
|
return { modelClass: defaults.modelClass };
|
|
@@ -248,19 +293,30 @@ function applySmartRouterObservationHeaders(headers, observation) {
|
|
|
248
293
|
if (profilerStatus)
|
|
249
294
|
headers.set(SMART_ROUTER_PROFILER_STATUS_HEADER, profilerStatus);
|
|
250
295
|
}
|
|
296
|
+
function applyAiDecideObservationHeaders(headers, observation) {
|
|
297
|
+
headers.set(AI_DECIDE_SELECTED_MODEL_HEADER, observation.selectedModel);
|
|
298
|
+
headers.set(AI_DECIDE_STRATEGY_HEADER, observation.strategy);
|
|
299
|
+
if (observation.confidence !== undefined) {
|
|
300
|
+
headers.set(AI_DECIDE_CONFIDENCE_HEADER, String(observation.confidence));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
function aiDecideStrategy(headers) {
|
|
304
|
+
const value = headers.get(AI_DECIDE_STRATEGY_HEADER)?.trim().toLowerCase();
|
|
305
|
+
return value ? AiDecideStrategySchema.parse(value) : "balanced";
|
|
306
|
+
}
|
|
251
307
|
function stringParam(params, key) {
|
|
252
308
|
const value = params?.[key];
|
|
253
309
|
return typeof value === "string" && value ? value : undefined;
|
|
254
310
|
}
|
|
255
|
-
function
|
|
311
|
+
function onlyVirtualModel(payload, modelId) {
|
|
256
312
|
if ("models" in payload) {
|
|
257
313
|
return {
|
|
258
|
-
models: payload.models.filter((model) => model.slug.toLowerCase().endsWith(`/${
|
|
314
|
+
models: payload.models.filter((model) => model.slug.toLowerCase().endsWith(`/${modelId}`)),
|
|
259
315
|
};
|
|
260
316
|
}
|
|
261
317
|
return {
|
|
262
318
|
object: "list",
|
|
263
|
-
data: payload.data.filter((model) => model.id ===
|
|
319
|
+
data: payload.data.filter((model) => model.id === modelId),
|
|
264
320
|
};
|
|
265
321
|
}
|
|
266
322
|
function logResponse(upstreamProtocol, model, response) {
|
|
@@ -275,4 +331,4 @@ function logResponse(upstreamProtocol, model, response) {
|
|
|
275
331
|
else
|
|
276
332
|
logger.warn("upstream request failed", details);
|
|
277
333
|
}
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FHakIsTUFBTSx5QkFBeUIsQ0FBQztBQVNqQyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQixxQkFBcUIsRUFDckIsbUNBQW1DLEVBQ25DLCtCQUErQixFQUMvQixrQ0FBa0MsRUFDbEMsK0JBQStCLEVBQy9CLDBCQUEwQixFQUMxQiw2QkFBNkIsRUFDN0Isb0JBQW9CLEdBQ3JCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVGLE9BQU8sRUFDTCx1QkFBdUIsR0FHeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRixPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUNsRCxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQztBQUNyQyxNQUFNLDBCQUEwQixHQUFHLENBQUMs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QUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBMEI7SUFDakQsSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEIsT0FBTztZQUNMLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUkscUJBQXFCLEVBQUUsQ0FBQyxDQUMvRDtTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNO1FBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLHFCQUFxQixDQUFDO0tBQ3pFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsZ0JBQXdCLEVBQUUsS0FBYSxFQUFFLFFBQWtCO0lBQzlFLE1BQU0sT0FBTyxHQUFHO1FBQ2QsV0FBVyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztRQUNqRCxLQUFLO1FBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLGdCQUFnQjtLQUNqQixDQUFDO0lBQ0YsSUFBSSxRQUFRLENBQUMsRUFBRTtRQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7O1FBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdG9jb2wtaW5kZXBlbmRlbnQgZ2F0ZXdheSBzZXJ2aWNlIHVzZWQgYnkgcGx1Z2luIGFuZCBzdGFuZGFsb25lIHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIE1vZGVsQ2xhc3NTY2hlbWEsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgdHlwZSBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NUeXBlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2xpZW50UHJvdG9jb2wsXG4gIEdhdGV3YXlSb3V0ZSxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsTGlzdFJlc3BvbnNlLFxuICBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuICBTbWFydFJvdXRlck1vZGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQge1xuICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLFxuICBTTUFSVF9ST1VURVJfSEFSTkVTU19IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9NT0RFTF9JRCxcbiAgU01BUlRfUk9VVEVSX1BST0ZJTEVSX1NUQVRVU19IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9ST1VURV9NT0RFTF9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TRVJWRURfVElFUl9IRUFERVIsXG4gIFNNQVJUX1JPVVRFUl9TT1VSQ0VfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfVEFTS19USUVSX0hFQURFUixcbiAgaXNTbWFydFJvdXRlck1vZGVsSWQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5cbmltcG9ydCB7IGxpc3RNb2RlbHNQYXlsb2FkIH0gZnJvbSBcIi4vbW9kZWxzLnRzXCI7XG5pbXBvcnQgeyBhZGFwdEluZmVyZW5jZVJlYXNvbmluZywgbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5IH0gZnJvbSBcIi4vcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5pbXBvcnQge1xuICBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5LFxuICB0eXBlIE1vZGVsUmVnaXN0cnlPcHRpb25zLFxufSBmcm9tIFwiLi9yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgaXNDb2RleE9yaWdpbmF0b3IsIHJlcXVlc3RlZEZlYXR1cmVzLCByZXNvbHZlUm91dGUgfSBmcm9tIFwiLi9yb3V0ZXIudHNcIjtcbmltcG9ydCB7XG4gIFNtYXJ0TW9kZWxSb3V0ZXIsXG4gIHR5cGUgU21hcnRSb3V0ZXJTZXJ2aWNlLFxuICB0eXBlIFNtYXJ0Um91dGVyU3RvcmUsXG59IGZyb20gXCIuL3NtYXJ0LXJvdXRlci50c1wiO1xuaW1wb3J0IHsgdHJhbnNsYXRlR2F0ZXdheVJlcXVlc3QgfSBmcm9tIFwiLi90cmFuc2xhdGlvbi50c1wiO1xuaW1wb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBnYXRld2F5UmVzcG9uc2VIZWFkZXJzIH0gZnJvbSBcIi4vdHJhbnNwb3J0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheVwiKTtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUlOID0gMDtcbmNvbnN0IERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUFYID0gMjtcblxuLyoqIE1vZGVsIGdhdGV3YXkgcnVudGltZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEdhdGV3YXlPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2FjaGVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydFJvdXRlck1vZGU7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0PzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclByb2JlUmVmcmVzaEludGVydmFsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyUHJvYmVUdGxNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJSb3V0ZVR0bFNlY29uZHM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyVGltZW91dE1zPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclNlcnZpY2U/OiBTbWFydFJvdXRlclNlcnZpY2U7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyU3RvcmU/OiBTbWFydFJvdXRlclN0b3JlO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuICByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlO1xuICByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuO1xufVxuXG4vKiogRXJyb3IgY2FycnlpbmcgYW4gSFRUUCBzdGF0dXMgYW5kIHByb3RvY29sLXNhZmUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1vZGVsR2F0ZXdheUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIEFwcEtpdC1zY29wZWQgbW9kZWwgZ2F0ZXdheSB3aXRoIGR5bmFtaWMgbW9kZWwgZGlzY292ZXJ5IGFuZCBzdHJlYW1pbmcgaW5mZXJlbmNlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnk6IE1vZGVsUmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydE1vZGVsUm91dGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNtYXJ0Um91dGVyTW9kZTogU21hcnRSb3V0ZXJNb2RlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9LCByZWdpc3RyeT86IE1vZGVsUmVnaXN0cnkpIHtcbiAgICBjb25zdCByZWdpc3RyeU9wdGlvbnM6IE1vZGVsUmVnaXN0cnlPcHRpb25zID0ge1xuICAgICAgLi4uKG9wdGlvbnMuY2FjaGVUdGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogb3B0aW9ucy5jYWNoZVR0bE1zIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5vdmVycmlkZXMgPyB7IG92ZXJyaWRlczogb3B0aW9ucy5vdmVycmlkZXMgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLnByZWZlclN5c3RlbU1vZGVscyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBwcmVmZXJTeXN0ZW1Nb2RlbHM6IG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzIH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnkgPz8gbmV3IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5KHJlZ2lzdHJ5T3B0aW9ucyk7XG4gICAgdGhpcy5zbWFydFJvdXRlck1vZGUgPSBvcHRpb25zLnNtYXJ0Um91dGVyID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXI7XG4gICAgaWYgKHRoaXMuc21hcnRSb3V0ZXJNb2RlICE9PSBcImZhbHNlXCIpIHtcbiAgICAgIHRoaXMuc21hcnRSb3V0ZXIgPSBuZXcgU21hcnRNb2RlbFJvdXRlcihcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRleHRUb2tlbkJ1ZGdldDpcbiAgICAgICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJDb250ZXh0VG9rZW5CdWRnZXQgPz9cbiAgICAgICAgICAgIE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJDb250ZXh0VG9rZW5CdWRnZXQsXG4gICAgICAgICAgcHJvYmVSZWZyZXNoSW50ZXJ2YWxNczpcbiAgICAgICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJQcm9iZVJlZnJlc2hJbnRlcnZhbE1zID8/XG4gICAgICAgICAgICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUHJvYmVSZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICAgICAgICBwcm9iZVR0bE1zOiBvcHRpb25zLnNtYXJ0Um91dGVyUHJvYmVUdGxNcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUHJvYmVUdGxNcyxcbiAgICAgICAgICByb3V0ZVR0bFNlY29uZHM6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJSb3V0ZVR0bFNlY29uZHMsXG4gICAgICAgICAgcm91dGVyTmFtZTogXCJ0YXNrX3YzXCIsXG4gICAgICAgICAgdGltZW91dE1zOiBvcHRpb25zLnNtYXJ0Um91dGVyVGltZW91dE1zID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMuc21hcnRSb3V0ZXJUaW1lb3V0TXMsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMuc21hcnRSb3V0ZXJTZXJ2aWNlLFxuICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyU3RvcmUsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLm1vZGVsID0gb3B0aW9ucy5tb2RlbDtcbiAgICB0aGlzLm1vZGVsQ2xhc3MgPSBvcHRpb25zLm1vZGVsQ2xhc3M7XG4gICAgdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPVxuICAgICAgb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgPz8gTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5wcmVmZXJTeXN0ZW1Nb2RlbHM7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBsaXZlIE9wZW5BSSBtb2RlbCBsaXN0LCBpbmNsdWRpbmcgQ29kZXggbWV0YWRhdGEgd2hlbiByZXF1ZXN0ZWQuICovXG4gIGFzeW5jIG1vZGVscyhvcmlnaW5hdG9yPzogc3RyaW5nLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsTGlzdFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29kZXggPSBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0aW5nIG1vZGVsc1wiLCB7IGNvZGV4LCBzZWFyY2ggfSk7XG4gICAgY29uc3QgcXVlcnkgPSBzZWFyY2g/LnRyaW0oKTtcbiAgICBjb25zdCBzbWFydFJvdXRlclNlYXJjaCA9XG4gICAgICBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIFNNQVJUX1JPVVRFUl9NT0RFTF9JRC5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCB0YXJnZXRzID1cbiAgICAgIHF1ZXJ5ICYmICFzbWFydFJvdXRlclNlYXJjaCA/IGF3YWl0IHRoaXMucmVnaXN0cnkuc2VhcmNoKHF1ZXJ5KSA6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpO1xuICAgIGNvbnN0IHNtYXJ0Um91dGVyVGFyZ2V0cyA9XG4gICAgICB0aGlzLnNtYXJ0Um91dGVyTW9kZSA9PT0gXCJ0cnVlXCIgJiYgcXVlcnkgJiYgIXNtYXJ0Um91dGVyU2VhcmNoXG4gICAgICAgID8gYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KClcbiAgICAgICAgOiB0YXJnZXRzO1xuICAgIGNvbnN0IHNob3VsZFByb2JlU21hcnRSb3V0ZXIgPVxuICAgICAgQm9vbGVhbih0aGlzLnNtYXJ0Um91dGVyKSAmJiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiIHx8ICFxdWVyeSB8fCBzbWFydFJvdXRlclNlYXJjaCk7XG4gICAgY29uc3Qgc21hcnRSb3V0ZXJFbmFibGVkID1cbiAgICAgIHNob3VsZFByb2JlU21hcnRSb3V0ZXIgJiYgKGF3YWl0IHRoaXMuc21hcnRSb3V0ZXIhLmlzRW5hYmxlZChzbWFydFJvdXRlclRhcmdldHMpKTtcbiAgICBpZiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiICYmICFzbWFydFJvdXRlckVuYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcihcbiAgICAgICAgNTAzLFxuICAgICAgICBcIkRhdGFicmlja3MgU21hcnQgUm91dGVyIGlzIHJlcXVpcmVkIGJ1dCB1bmF2YWlsYWJsZSBmb3IgdGhlIGFjdGl2ZSB3b3Jrc3BhY2UgaWRlbnRpdHlcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBtb2RlbHNcIiwgeyBjb2RleCwgY291bnQ6IHRhcmdldHMubGVuZ3RoIH0pO1xuICAgIGNvbnN0IHBheWxvYWQgPSBsaXN0TW9kZWxzUGF5bG9hZChcbiAgICAgIHRhcmdldHMsXG4gICAgICBjb2RleCxcbiAgICAgIHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgcXVlcnkubGVuZ3RoID4gMCxcbiAgICAgIHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgc21hcnRSb3V0ZXJFbmFibGVkICYmICghcXVlcnkgfHwgc21hcnRSb3V0ZXJTZWFyY2gpLFxuICAgICk7XG4gICAgcmV0dXJuIHNtYXJ0Um91dGVyU2VhcmNoID8gb25seVNtYXJ0Um91dGVyKHBheWxvYWQpIDogcGF5bG9hZDtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIGFuZCBleGVjdXRlIG9uZSBpbmZlcmVuY2UgcmVxdWVzdC4gKi9cbiAgYXN5bmMgaW5mZXJlbmNlKFxuICAgIHByb3RvY29sOiBDbGllbnRQcm90b2NvbCxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkQm9keSA9IHNhbml0aXplSW5mZXJlbmNlQm9keShib2R5KTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBnYXRld2F5TW9kZWxTZWxlY3Rpb24oXG4gICAgICBzYW5pdGl6ZWRCb2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIHtcbiAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgIG1vZGVsQ2xhc3M6IHRoaXMubW9kZWxDbGFzcyxcbiAgICAgIH0sXG4gICAgICBwcm90b2NvbCxcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmluZyByZXF1ZXN0XCIsIHtcbiAgICAgIHNtYXJ0Um91dGVyOiBzZWxlY3Rpb24uc21hcnRSb3V0ZXIgPT09IHRydWUsXG4gICAgICBjbGllbnRQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICBtb2RlbDogc2VsZWN0aW9uLm1vZGVsLFxuICAgICAgbW9kZWxDbGFzczogc2VsZWN0aW9uLm1vZGVsQ2xhc3MsXG4gICAgICBvcmlnaW5hdG9yOiBoZWFkZXJzLmdldChcIm9yaWdpbmF0b3JcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiBzYW5pdGl6ZWRCb2R5LnN0cmVhbSA9PT0gdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHJlcXVlc3RlZEZlYXR1cmVzKHNhbml0aXplZEJvZHkpO1xuICAgIGlmIChzZWxlY3Rpb24uc21hcnRSb3V0ZXIgJiYgcHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBzbWFydC1yb3V0ZXIgaXMgYXZhaWxhYmxlIG9ubHkgZm9yIGNoYXQgcmVxdWVzdHNcIik7XG4gICAgfVxuICAgIGNvbnN0IHNtYXJ0Um91dGVyID1cbiAgICAgIHNlbGVjdGlvbi5zbWFydFJvdXRlciAmJiB0aGlzLnNtYXJ0Um91dGVyXG4gICAgICAgID8gYXdhaXQgdGhpcy5zbWFydFJvdXRlci5yZXNvbHZlKHtcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCBhcyBFeGNsdWRlPENsaWVudFByb3RvY29sLCBcIm9wZW5haS1lbWJlZGRpbmdzXCI+LFxuICAgICAgICAgICAgYm9keTogc2FuaXRpemVkQm9keSxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBmZWF0dXJlcyxcbiAgICAgICAgICAgIHRhcmdldHM6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpLFxuICAgICAgICAgICAgcHJlZmVyU3lzdGVtTW9kZWxzOiB0aGlzLnByZWZlclN5c3RlbU1vZGVscyxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VsZWN0aW9uLnNtYXJ0Um91dGVyICYmICFzbWFydFJvdXRlcikge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwNCwgXCJEYXRhYnJpY2tzIFNtYXJ0IFJvdXRlciBpcyBkaXNhYmxlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgIHNtYXJ0Um91dGVyPy50YXJnZXQgPz9cbiAgICAgIChhd2FpdCB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUoc2VsZWN0aW9uLm1vZGVsLCB7XG4gICAgICAgIC4uLihwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiID8geyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9IDoge30pLFxuICAgICAgICAuLi4oc2VsZWN0aW9uLm1vZGVsQ2xhc3MgPyB7IG1vZGVsQ2xhc3M6IHNlbGVjdGlvbi5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgICAgIC4uLihmZWF0dXJlcy50b29scyA/IHsgcmVxdWlyZXNUb29sczogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoXG4gICAgICAgIDQwNCxcbiAgICAgICAgc2VsZWN0aW9uLm1vZGVsXG4gICAgICAgICAgPyBgTW9kZWwgbm90IGZvdW5kOiAke3NlbGVjdGlvbi5tb2RlbH1gXG4gICAgICAgICAgOiBcIk5vIG1vZGVsIG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBjbGFzc1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgcm91dGUgPSByZXNvbHZlUm91dGUoe1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgLi4uKCFzbWFydFJvdXRlciAmJiBzZWxlY3Rpb24ubW9kZWwgPyB7IHJlcXVlc3RlZE1vZGVsOiBzZWxlY3Rpb24ubW9kZWwgfSA6IHt9KSxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgZmVhdHVyZXMsXG4gICAgICB0YXJnZXQsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwicm91dGVkXCIsIHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiB0YXJnZXQuaWQsXG4gICAgICB1cHN0cmVhbVByb3RvY29sOiByb3V0ZS51cHN0cmVhbVByb3RvY29sLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGVyYXR1cmVCb2R5ID0gYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZShcbiAgICAgIHRhcmdldC5lbmRwb2ludCA/PyB0YXJnZXQuaWQsXG4gICAgICBzbWFydFJvdXRlcj8uYm9keSA/PyBzYW5pdGl6ZWRCb2R5LFxuICAgICk7XG4gICAgY29uc3QgYWRhcHRlZCA9IGFkYXB0SW5mZXJlbmNlUmVhc29uaW5nKHRhcmdldC5pZCwgdGVtcGVyYXR1cmVCb2R5KTtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIGFkYXB0ZWQuYm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICBjb25zdCByZXRyeUJvZHkgPSBhd2FpdCBsZWFybkFuZEFkYXB0UmVhc29uaW5nUmV0cnkoe1xuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIGJvZHk6IHRlbXBlcmF0dXJlQm9keSxcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgcHJldmlvdXNXaXJlRWZmb3J0OiBhZGFwdGVkLndpcmVFZmZvcnQsXG4gICAgfSk7XG4gICAgaWYgKHJldHJ5Qm9keSkge1xuICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mb3J3YXJkKHJvdXRlLCByZXRyeUJvZHksIGhlYWRlcnMsIHNpZ25hbCk7XG4gICAgfVxuXG4gICAgbG9nUmVzcG9uc2Uocm91dGUudXBzdHJlYW1Qcm90b2NvbCwgdGFyZ2V0LmlkLCByZXNwb25zZSk7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KFwieC1kYngtdG9vbHMtdXBzdHJlYW1cIiwgcm91dGUudXBzdHJlYW1Qcm90b2NvbCk7XG4gICAgICBpZiAoc21hcnRSb3V0ZXIpIHtcbiAgICAgICAgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzLCBzbWFydFJvdXRlci5vYnNlcnZhdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIGNvbnN0IGZvcndhcmRlZCA9IGdhdGV3YXlSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gICAgZm9yd2FyZGVkLnNldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIsIHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wpO1xuICAgIGlmIChzbWFydFJvdXRlcikgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhmb3J3YXJkZWQsIHNtYXJ0Um91dGVyLm9ic2VydmF0aW9uKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgIGhlYWRlcnM6IGZvcndhcmRlZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWZyZXNoIHRoZSBhY3RpdmUgcHJpbmNpcGFsJ3MgbW9kZWwgY2F0YWxvZ3VlLiAqL1xuICByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlZnJlc2hpbmcgbW9kZWwgY2F0YWxvZ3VlXCIpO1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZm9yd2FyZChcbiAgICByb3V0ZTogR2F0ZXdheVJvdXRlLFxuICAgIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0KHJvdXRlLCBib2R5LCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gZmV0Y2hEYXRhYnJpY2tzKHsgcm91dGUsIGJvZHksIGhlYWRlcnMsIHNpZ25hbCB9KTtcbiAgfVxufVxuXG4vKiogUmVtb3ZlIG51bGwgdGVtcGVyYXR1cmUgYW5kIHJlamVjdCBleHBsaWNpdCBub25udW1lcmljIHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUluZmVyZW5jZUJvZHkoXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihib2R5LCBcInRlbXBlcmF0dXJlXCIpKSByZXR1cm4gYm9keTtcbiAgaWYgKGJvZHkudGVtcGVyYXR1cmUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGJvZHkudGVtcGVyYXR1cmUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0Zpbml0ZShib2R5LnRlbXBlcmF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJ0ZW1wZXJhdHVyZSBtdXN0IGJlIGEgZmluaXRlIG51bWJlciwgbnVsbCwgb3Igb21pdHRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cbiAgY29uc3Qgc2FuaXRpemVkID0geyAuLi5ib2R5IH07XG4gIGRlbGV0ZSBzYW5pdGl6ZWQudGVtcGVyYXR1cmU7XG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbi8qKiBBcHBseSBwdWJsaXNoZWQgRGF0YWJyaWNrcyB0ZW1wZXJhdHVyZSBzdXBwb3J0IGFuZCByYW5nZSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZShcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihib2R5LCBcInRlbXBlcmF0dXJlXCIpIHx8IHR5cGVvZiBib2R5LnRlbXBlcmF0dXJlICE9PSBcIm51bWJlclwiKSByZXR1cm4gYm9keTtcbiAgY29uc3Qgc3VwcG9ydGVkID0gbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IobW9kZWwpO1xuICBpZiAoc3VwcG9ydGVkID09PSB1bmRlZmluZWQpIHJldHVybiBib2R5O1xuICBpZiAoIXN1cHBvcnRlZCkge1xuICAgIGNvbnN0IGFkYXB0ZWQgPSB7IC4uLmJvZHkgfTtcbiAgICBkZWxldGUgYWRhcHRlZC50ZW1wZXJhdHVyZTtcbiAgICByZXR1cm4gYWRhcHRlZDtcbiAgfVxuICBjb25zdCB0ZW1wZXJhdHVyZSA9IE1hdGgubWluKFxuICAgIERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUFYLFxuICAgIE1hdGgubWF4KERBVEFCUklDS1NfVEVNUEVSQVRVUkVfTUlOLCBib2R5LnRlbXBlcmF0dXJlKSxcbiAgKTtcbiAgcmV0dXJuIHRlbXBlcmF0dXJlID09PSBib2R5LnRlbXBlcmF0dXJlID8gYm9keSA6IHsgLi4uYm9keSwgdGVtcGVyYXR1cmUgfTtcbn1cblxuLyoqIFJlc29sdmUgcmVxdWVzdCwgaGVhZGVyLCBjb25maWd1cmVkLCBhbmQgcHJvdG9jb2wgbW9kZWwtc2VsZWN0aW9uIGlucHV0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnYXRld2F5TW9kZWxTZWxlY3Rpb24oXG4gIGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgaGVhZGVyczogSGVhZGVycyxcbiAgZGVmYXVsdHM6IHsgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7IHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZSB9ID0ge30sXG4gIHByb3RvY29sPzogQ2xpZW50UHJvdG9jb2wsXG4pOiB7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbn0ge1xuICBjb25zdCBtb2RlbCA9IHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiICYmIGJvZHkubW9kZWwudHJpbSgpID8gYm9keS5tb2RlbC50cmltKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuZ2V0KFwieC1kYngtdG9vbHMtbW9kZWwtY2xhc3NcIik/LnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkQ2xhc3MgPSBoZWFkZXIgPyBNb2RlbENsYXNzU2NoZW1hLnNhZmVQYXJzZShoZWFkZXIpIDogdW5kZWZpbmVkO1xuICBpZiAocGFyc2VkQ2xhc3MgJiYgIXBhcnNlZENsYXNzLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBgSW52YWxpZCBtb2RlbCBjbGFzczogJHtoZWFkZXJ9YCk7XG4gIH1cbiAgaWYgKG1vZGVsICYmIHBhcnNlZENsYXNzPy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBhbmQgbW9kZWwgY2xhc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKTtcbiAgfVxuICBpZiAobW9kZWwpIHJldHVybiBpc1NtYXJ0Um91dGVyTW9kZWxJZChtb2RlbCkgPyB7IHNtYXJ0Um91dGVyOiB0cnVlIH0gOiB7IG1vZGVsIH07XG4gIGlmIChwYXJzZWRDbGFzcz8uZGF0YSkgcmV0dXJuIHsgbW9kZWxDbGFzczogcGFyc2VkQ2xhc3MuZGF0YSB9O1xuICBpZiAoZGVmYXVsdHMubW9kZWwpIHtcbiAgICByZXR1cm4gaXNTbWFydFJvdXRlck1vZGVsSWQoZGVmYXVsdHMubW9kZWwpID8geyBzbWFydFJvdXRlcjogdHJ1ZSB9IDogeyBtb2RlbDogZGVmYXVsdHMubW9kZWwgfTtcbiAgfVxuICBpZiAoZGVmYXVsdHMubW9kZWxDbGFzcykgcmV0dXJuIHsgbW9kZWxDbGFzczogZGVmYXVsdHMubW9kZWxDbGFzcyB9O1xuICBpZiAocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIikgcmV0dXJuIHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfTtcbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBhcHBseVNtYXJ0Um91dGVyT2JzZXJ2YXRpb25IZWFkZXJzKFxuICBoZWFkZXJzOiBIZWFkZXJzLFxuICBvYnNlcnZhdGlvbjogU21hcnRSb3V0ZXJPYnNlcnZhdGlvbixcbik6IHZvaWQge1xuICBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfU0VMRUNURURfTU9ERUxfSEVBREVSLCBvYnNlcnZhdGlvbi5zZWxlY3RlZE1vZGVsKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1JPVVRFX01PREVMX0hFQURFUiwgb2JzZXJ2YXRpb24ucm91dGVNb2RlbCk7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9IQVJORVNTX0hFQURFUiwgb2JzZXJ2YXRpb24uaGFybmVzcyk7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9TT1VSQ0VfSEVBREVSLCBvYnNlcnZhdGlvbi5zb3VyY2UpO1xuICBjb25zdCB0YXNrVGllciA9IHN0cmluZ1BhcmFtKG9ic2VydmF0aW9uLnBhcmFtcywgXCJ0YXNrX3RpZXJcIik7XG4gIGNvbnN0IHNlcnZlZFRpZXIgPSBzdHJpbmdQYXJhbShvYnNlcnZhdGlvbi5wYXJhbXMsIFwic2VydmVkX3RpZXJcIik7XG4gIGNvbnN0IHByb2ZpbGVyU3RhdHVzID0gc3RyaW5nUGFyYW0ob2JzZXJ2YXRpb24ucGFyYW1zLCBcInByb2ZpbGVyX3N0YXR1c1wiKTtcbiAgaWYgKHRhc2tUaWVyKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfVEFTS19USUVSX0hFQURFUiwgdGFza1RpZXIpO1xuICBpZiAoc2VydmVkVGllcikgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1NFUlZFRF9USUVSX0hFQURFUiwgc2VydmVkVGllcik7XG4gIGlmIChwcm9maWxlclN0YXR1cykgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1BST0ZJTEVSX1NUQVRVU19IRUFERVIsIHByb2ZpbGVyU3RhdHVzKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5nUGFyYW0oXG4gIHBhcmFtczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zPy5ba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBvbmx5U21hcnRSb3V0ZXIocGF5bG9hZDogTW9kZWxMaXN0UmVzcG9uc2UpOiBNb2RlbExpc3RSZXNwb25zZSB7XG4gIGlmIChcIm1vZGVsc1wiIGluIHBheWxvYWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBwYXlsb2FkLm1vZGVscy5maWx0ZXIoKG1vZGVsKSA9PlxuICAgICAgICBtb2RlbC5zbHVnLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoYC8ke1NNQVJUX1JPVVRFUl9NT0RFTF9JRH1gKSxcbiAgICAgICksXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG9iamVjdDogXCJsaXN0XCIsXG4gICAgZGF0YTogcGF5bG9hZC5kYXRhLmZpbHRlcigobW9kZWwpID0+IG1vZGVsLmlkID09PSBTTUFSVF9ST1VURVJfTU9ERUxfSUQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBsb2dSZXNwb25zZSh1cHN0cmVhbVByb3RvY29sOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcsIHJlc3BvbnNlOiBSZXNwb25zZSk6IHZvaWQge1xuICBjb25zdCBkZXRhaWxzID0ge1xuICAgIGNvbnRlbnRUeXBlOiByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSxcbiAgICBtb2RlbCxcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB1cHN0cmVhbVByb3RvY29sLFxuICB9O1xuICBpZiAocmVzcG9uc2Uub2spIGxvZ2dlci5kZWJ1ZyhcInVwc3RyZWFtIHJlc3BvbnNlXCIsIGRldGFpbHMpO1xuICBlbHNlIGxvZ2dlci53YXJuKFwidXBzdHJlYW0gcmVxdWVzdCBmYWlsZWRcIiwgZGV0YWlscyk7XG59XG4iXX0=
|
|
334
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLFVBQVUsRUFDVixnQkFBZ0IsR0FJakIsTUFBTSx5QkFBeUIsQ0FBQztBQVVqQyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLGtCQUFrQixFQUNsQiwrQkFBK0IsRUFDL0IseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHFCQUFxQixFQUNyQixtQ0FBbUMsRUFDbkMsK0JBQStCLEVBQy9CLGtDQUFrQyxFQUNsQywrQkFBK0IsRUFDL0IsMEJBQTBCLEVBQzFCLDZCQUE2QixFQUM3QixpQkFBaUIsRUFDakIsb0JBQW9CLEdBQ3JCLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVGLE9BQU8sRUFDTCx1QkFBdUIsR0FHeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRixPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixD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ZXBlbmRlbnQgZ2F0ZXdheSBzZXJ2aWNlIHVzZWQgYnkgcGx1Z2luIGFuZCBzdGFuZGFsb25lIHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MsXG4gIE1vZGVsQ2xhc3NTY2hlbWEsXG4gIHR5cGUgTW9kZWxTb3VyY2UsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgdHlwZSBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NUeXBlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWlEZWNpZGVPYnNlcnZhdGlvbixcbiAgQ2xpZW50UHJvdG9jb2wsXG4gIEdhdGV3YXlSb3V0ZSxcbiAgTW9kZWxDYXBhYmlsaXR5T3ZlcnJpZGUsXG4gIE1vZGVsTGlzdFJlc3BvbnNlLFxuICBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuICBTbWFydFJvdXRlck1vZGUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQge1xuICBBSV9ERUNJREVfQ09ORklERU5DRV9IRUFERVIsXG4gIEFJX0RFQ0lERV9NT0RFTF9JRCxcbiAgQUlfREVDSURFX1NFTEVDVEVEX01PREVMX0hFQURFUixcbiAgQUlfREVDSURFX1NUUkFURUdZX0hFQURFUixcbiAgQWlEZWNpZGVTdHJhdGVneVNjaGVtYSxcbiAgTU9ERUxfR0FURVdBWV9ERUZBVUxUUyxcbiAgU01BUlRfUk9VVEVSX0hBUk5FU1NfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfTU9ERUxfSUQsXG4gIFNNQVJUX1JPVVRFUl9QUk9GSUxFUl9TVEFUVVNfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfUk9VVEVfTU9ERUxfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU0VMRUNURURfTU9ERUxfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU0VSVkVEX1RJRVJfSEVBREVSLFxuICBTTUFSVF9ST1VURVJfU09VUkNFX0hFQURFUixcbiAgU01BUlRfUk9VVEVSX1RBU0tfVElFUl9IRUFERVIsXG4gIGlzQWlEZWNpZGVNb2RlbElkLFxuICBpc1NtYXJ0Um91dGVyTW9kZWxJZCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcblxuaW1wb3J0IHsgQWlEZWNpZGVSb3V0ZXJTZXJ2aWNlIH0gZnJvbSBcIi4vYWktZGVjaWRlLnRzXCI7XG5pbXBvcnQgeyBsaXN0TW9kZWxzUGF5bG9hZCB9IGZyb20gXCIuL21vZGVscy50c1wiO1xuaW1wb3J0IHsgYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcsIGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSB9IGZyb20gXCIuL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuaW1wb3J0IHtcbiAgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnksXG4gIHR5cGUgTW9kZWxSZWdpc3RyeSxcbiAgdHlwZSBNb2RlbFJlZ2lzdHJ5T3B0aW9ucyxcbn0gZnJvbSBcIi4vcmVnaXN0cnkudHNcIjtcbmltcG9ydCB7IGlzQ29kZXhPcmlnaW5hdG9yLCByZXF1ZXN0ZWRGZWF0dXJlcywgcmVzb2x2ZVJvdXRlIH0gZnJvbSBcIi4vcm91dGVyLnRzXCI7XG5pbXBvcnQge1xuICBTbWFydE1vZGVsUm91dGVyLFxuICB0eXBlIFNtYXJ0Um91dGVyU2VydmljZSxcbiAgdHlwZSBTbWFydFJvdXRlclN0b3JlLFxufSBmcm9tIFwiLi9zbWFydC1yb3V0ZXIudHNcIjtcbmltcG9ydCB7IHRyYW5zbGF0ZUdhdGV3YXlSZXF1ZXN0IH0gZnJvbSBcIi4vdHJhbnNsYXRpb24udHNcIjtcbmltcG9ydCB7IGZldGNoRGF0YWJyaWNrcywgZ2F0ZXdheVJlc3BvbnNlSGVhZGVycyB9IGZyb20gXCIuL3RyYW5zcG9ydC50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXlcIik7XG5jb25zdCBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01JTiA9IDA7XG5jb25zdCBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01BWCA9IDI7XG5cbi8qKiBNb2RlbCBnYXRld2F5IHJ1bnRpbWUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxHYXRld2F5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNhY2hlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyPzogU21hcnRSb3V0ZXJNb2RlO1xuICByZWFkb25seSBzbWFydFJvdXRlckNvbnRleHRUb2tlbkJ1ZGdldD86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJQcm9iZVJlZnJlc2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclByb2JlVHRsTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzPzogbnVtYmVyO1xuICByZWFkb25seSBzbWFydFJvdXRlclRpbWVvdXRNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgc21hcnRSb3V0ZXJTZXJ2aWNlPzogU21hcnRSb3V0ZXJTZXJ2aWNlO1xuICByZWFkb25seSBzbWFydFJvdXRlclN0b3JlPzogU21hcnRSb3V0ZXJTdG9yZTtcbiAgcmVhZG9ubHkgYWlEZWNpZGVTZXJ2aWNlPzogQWlEZWNpZGVSb3V0ZXJTZXJ2aWNlO1xuICByZWFkb25seSBvdmVycmlkZXM/OiByZWFkb25seSBNb2RlbENhcGFiaWxpdHlPdmVycmlkZVtdO1xuICByZWFkb25seSBtb2RlbD86IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlO1xuICByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM/OiBib29sZWFuO1xufVxuXG4vKiogRXJyb3IgY2FycnlpbmcgYW4gSFRUUCBzdGF0dXMgYW5kIHByb3RvY29sLXNhZmUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbEdhdGV3YXlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1vZGVsR2F0ZXdheUVycm9yXCI7XG4gIH1cbn1cblxuLyoqIEFwcEtpdC1zY29wZWQgbW9kZWwgZ2F0ZXdheSB3aXRoIGR5bmFtaWMgbW9kZWwgZGlzY292ZXJ5IGFuZCBzdHJlYW1pbmcgaW5mZXJlbmNlLiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsR2F0ZXdheSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnk6IE1vZGVsUmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXI/OiBTbWFydE1vZGVsUm91dGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGFpRGVjaWRlOiBBaURlY2lkZVJvdXRlclNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc21hcnRSb3V0ZXJNb2RlOiBTbWFydFJvdXRlck1vZGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3NUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWZlclN5c3RlbU1vZGVsczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb2RlbEdhdGV3YXlPcHRpb25zID0ge30sIHJlZ2lzdHJ5PzogTW9kZWxSZWdpc3RyeSkge1xuICAgIGNvbnN0IHJlZ2lzdHJ5T3B0aW9uczogTW9kZWxSZWdpc3RyeU9wdGlvbnMgPSB7XG4gICAgICAuLi4ob3B0aW9ucy5jYWNoZVR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBvcHRpb25zLmNhY2hlVHRsTXMgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLm92ZXJyaWRlcyA/IHsgb3ZlcnJpZGVzOiBvcHRpb25zLm92ZXJyaWRlcyB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHByZWZlclN5c3RlbU1vZGVsczogb3B0aW9ucy5wcmVmZXJTeXN0ZW1Nb2RlbHMgfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeSA/PyBuZXcgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnkocmVnaXN0cnlPcHRpb25zKTtcbiAgICB0aGlzLmFpRGVjaWRlID0gb3B0aW9ucy5haURlY2lkZVNlcnZpY2UgPz8gbmV3IEFpRGVjaWRlUm91dGVyU2VydmljZSgpO1xuICAgIHRoaXMuc21hcnRSb3V0ZXJNb2RlID0gb3B0aW9ucy5zbWFydFJvdXRlciA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyO1xuICAgIGlmICh0aGlzLnNtYXJ0Um91dGVyTW9kZSAhPT0gXCJmYWxzZVwiKSB7XG4gICAgICB0aGlzLnNtYXJ0Um91dGVyID0gbmV3IFNtYXJ0TW9kZWxSb3V0ZXIoXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZXh0VG9rZW5CdWRnZXQ6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0ID8/XG4gICAgICAgICAgICBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0LFxuICAgICAgICAgIHByb2JlUmVmcmVzaEludGVydmFsTXM6XG4gICAgICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyUHJvYmVSZWZyZXNoSW50ZXJ2YWxNcyA/P1xuICAgICAgICAgICAgTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5zbWFydFJvdXRlclByb2JlUmVmcmVzaEludGVydmFsTXMsXG4gICAgICAgICAgcHJvYmVUdGxNczogb3B0aW9ucy5zbWFydFJvdXRlclByb2JlVHRsTXMgPz8gTU9ERUxfR0FURVdBWV9ERUZBVUxUUy5zbWFydFJvdXRlclByb2JlVHRsTXMsXG4gICAgICAgICAgcm91dGVUdGxTZWNvbmRzOlxuICAgICAgICAgICAgb3B0aW9ucy5zbWFydFJvdXRlclJvdXRlVHRsU2Vjb25kcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzLFxuICAgICAgICAgIHJvdXRlck5hbWU6IFwidGFza192M1wiLFxuICAgICAgICAgIHRpbWVvdXRNczogb3B0aW9ucy5zbWFydFJvdXRlclRpbWVvdXRNcyA/PyBNT0RFTF9HQVRFV0FZX0RFRkFVTFRTLnNtYXJ0Um91dGVyVGltZW91dE1zLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLnNtYXJ0Um91dGVyU2VydmljZSxcbiAgICAgICAgb3B0aW9ucy5zbWFydFJvdXRlclN0b3JlLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbCA9IG9wdGlvbnMubW9kZWw7XG4gICAgdGhpcy5tb2RlbENsYXNzID0gb3B0aW9ucy5tb2RlbENsYXNzO1xuICAgIHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzID1cbiAgICAgIG9wdGlvbnMucHJlZmVyU3lzdGVtTW9kZWxzID8/IE1PREVMX0dBVEVXQVlfREVGQVVMVFMucHJlZmVyU3lzdGVtTW9kZWxzO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgbGl2ZSBPcGVuQUkgbW9kZWwgbGlzdCwgaW5jbHVkaW5nIENvZGV4IG1ldGFkYXRhIHdoZW4gcmVxdWVzdGVkLiAqL1xuICBhc3luYyBtb2RlbHMoXG4gICAgb3JpZ2luYXRvcj86IHN0cmluZyxcbiAgICBzZWFyY2g/OiBzdHJpbmcsXG4gICAgbW9kZWxTb3VyY2U6IE1vZGVsU291cmNlIHwgXCJhbGxcIiA9IFwiZm91bmRhdGlvblwiLFxuICAgIGluY2x1ZGVNZXRhZGF0YSA9IGZhbHNlLFxuICApOiBQcm9taXNlPE1vZGVsTGlzdFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY29kZXggPSBpc0NvZGV4T3JpZ2luYXRvcihvcmlnaW5hdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0aW5nIG1vZGVsc1wiLCB7IGNvZGV4LCBzZWFyY2ggfSk7XG4gICAgY29uc3QgcXVlcnkgPSBzZWFyY2g/LnRyaW0oKTtcbiAgICBjb25zdCBzbWFydFJvdXRlclNlYXJjaCA9XG4gICAgICBxdWVyeSAhPT0gdW5kZWZpbmVkICYmIFNNQVJUX1JPVVRFUl9NT0RFTF9JRC5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCBhaURlY2lkZVNlYXJjaCA9IHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgQUlfREVDSURFX01PREVMX0lELmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IGRpc2NvdmVyZWQgPVxuICAgICAgcXVlcnkgJiYgIXNtYXJ0Um91dGVyU2VhcmNoICYmICFhaURlY2lkZVNlYXJjaFxuICAgICAgICA/IGF3YWl0IHRoaXMucmVnaXN0cnkuc2VhcmNoKHF1ZXJ5KVxuICAgICAgICA6IGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpO1xuICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgbW9kZWxTb3VyY2UgPT09IFwiYWxsXCJcbiAgICAgICAgPyBkaXNjb3ZlcmVkXG4gICAgICAgIDogZGlzY292ZXJlZC5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmVuZHBvaW50Py5tb2RlbFNvdXJjZSA9PT0gbW9kZWxTb3VyY2UpO1xuICAgIGNvbnN0IHNtYXJ0Um91dGVyVGFyZ2V0cyA9XG4gICAgICB0aGlzLnNtYXJ0Um91dGVyTW9kZSA9PT0gXCJ0cnVlXCIgJiYgcXVlcnkgJiYgIXNtYXJ0Um91dGVyU2VhcmNoXG4gICAgICAgID8gKGF3YWl0IHRoaXMucmVnaXN0cnkubGlzdCgpKS5maWx0ZXIoXG4gICAgICAgICAgICAodGFyZ2V0KSA9PiBtb2RlbFNvdXJjZSA9PT0gXCJhbGxcIiB8fCB0YXJnZXQuZW5kcG9pbnQ/Lm1vZGVsU291cmNlID09PSBtb2RlbFNvdXJjZSxcbiAgICAgICAgICApXG4gICAgICAgIDogdGFyZ2V0cztcbiAgICBjb25zdCBzaG91bGRQcm9iZVNtYXJ0Um91dGVyID1cbiAgICAgIEJvb2xlYW4odGhpcy5zbWFydFJvdXRlcikgJiYgKHRoaXMuc21hcnRSb3V0ZXJNb2RlID09PSBcInRydWVcIiB8fCAhcXVlcnkgfHwgc21hcnRSb3V0ZXJTZWFyY2gpO1xuICAgIGNvbnN0IHNtYXJ0Um91dGVyRW5hYmxlZCA9XG4gICAgICBzaG91bGRQcm9iZVNtYXJ0Um91dGVyICYmIChhd2FpdCB0aGlzLnNtYXJ0Um91dGVyIS5pc0VuYWJsZWQoc21hcnRSb3V0ZXJUYXJnZXRzKSk7XG4gICAgY29uc3QgYWlEZWNpZGVFbmFibGVkID1cbiAgICAgICghcXVlcnkgfHwgYWlEZWNpZGVTZWFyY2gpICYmXG4gICAgICAoYXdhaXQgdGhpcy5haURlY2lkZS5pc0VuYWJsZWQoXG4gICAgICAgIHRhcmdldHNcbiAgICAgICAgICAubWFwKCh0YXJnZXQpID0+IHRhcmdldC5lbmRwb2ludClcbiAgICAgICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCksXG4gICAgICApKTtcbiAgICBpZiAodGhpcy5zbWFydFJvdXRlck1vZGUgPT09IFwidHJ1ZVwiICYmICFzbWFydFJvdXRlckVuYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcihcbiAgICAgICAgNTAzLFxuICAgICAgICBcIkRhdGFicmlja3MgU21hcnQgUm91dGVyIGlzIHJlcXVpcmVkIGJ1dCB1bmF2YWlsYWJsZSBmb3IgdGhlIGFjdGl2ZSB3b3Jrc3BhY2UgaWRlbnRpdHlcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBtb2RlbHNcIiwgeyBjb2RleCwgY291bnQ6IHRhcmdldHMubGVuZ3RoIH0pO1xuICAgIGNvbnN0IHBheWxvYWQgPSBsaXN0TW9kZWxzUGF5bG9hZChcbiAgICAgIHRhcmdldHMsXG4gICAgICBjb2RleCxcbiAgICAgIHF1ZXJ5ICE9PSB1bmRlZmluZWQgJiYgcXVlcnkubGVuZ3RoID4gMCxcbiAgICAgIHRoaXMucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgc21hcnRSb3V0ZXJFbmFibGVkICYmICghcXVlcnkgfHwgc21hcnRSb3V0ZXJTZWFyY2gpLFxuICAgICAgYWlEZWNpZGVFbmFibGVkICYmICghcXVlcnkgfHwgYWlEZWNpZGVTZWFyY2gpLFxuICAgICAgaW5jbHVkZU1ldGFkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIHNtYXJ0Um91dGVyU2VhcmNoIHx8IGFpRGVjaWRlU2VhcmNoXG4gICAgICA/IG9ubHlWaXJ0dWFsTW9kZWwocGF5bG9hZCwgc21hcnRSb3V0ZXJTZWFyY2ggPyBTTUFSVF9ST1VURVJfTU9ERUxfSUQgOiBBSV9ERUNJREVfTU9ERUxfSUQpXG4gICAgICA6IHBheWxvYWQ7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBhbmQgZXhlY3V0ZSBvbmUgaW5mZXJlbmNlIHJlcXVlc3QuICovXG4gIGFzeW5jIGluZmVyZW5jZShcbiAgICBwcm90b2NvbDogQ2xpZW50UHJvdG9jb2wsXG4gICAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHNhbml0aXplZEJvZHkgPSBzYW5pdGl6ZUluZmVyZW5jZUJvZHkoYm9keSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICAgICAgc2FuaXRpemVkQm9keSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB7XG4gICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLm1vZGVsQ2xhc3MsXG4gICAgICB9LFxuICAgICAgcHJvdG9jb2wsXG4gICAgKTtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZpbmcgcmVxdWVzdFwiLCB7XG4gICAgICBzbWFydFJvdXRlcjogc2VsZWN0aW9uLnNtYXJ0Um91dGVyID09PSB0cnVlLFxuICAgICAgYWlEZWNpZGU6IHNlbGVjdGlvbi5haURlY2lkZSA9PT0gdHJ1ZSxcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIG1vZGVsOiBzZWxlY3Rpb24ubW9kZWwsXG4gICAgICBtb2RlbENsYXNzOiBzZWxlY3Rpb24ubW9kZWxDbGFzcyxcbiAgICAgIG9yaWdpbmF0b3I6IGhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBzdHJlYW06IHNhbml0aXplZEJvZHkuc3RyZWFtID09PSB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGZlYXR1cmVzID0gcmVxdWVzdGVkRmVhdHVyZXMoc2FuaXRpemVkQm9keSk7XG4gICAgaWYgKChzZWxlY3Rpb24uc21hcnRSb3V0ZXIgfHwgc2VsZWN0aW9uLmFpRGVjaWRlKSAmJiBwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiKSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoXG4gICAgICAgIDQwMCxcbiAgICAgICAgXCJWaXJ0dWFsIG1vZGVsIHJvdXRlcnMgYXJlIGF2YWlsYWJsZSBvbmx5IGZvciBjaGF0IHJlcXVlc3RzXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzbWFydFJvdXRlciA9XG4gICAgICBzZWxlY3Rpb24uc21hcnRSb3V0ZXIgJiYgdGhpcy5zbWFydFJvdXRlclxuICAgICAgICA/IGF3YWl0IHRoaXMuc21hcnRSb3V0ZXIucmVzb2x2ZSh7XG4gICAgICAgICAgICBwcm90b2NvbDogcHJvdG9jb2wgYXMgRXhjbHVkZTxDbGllbnRQcm90b2NvbCwgXCJvcGVuYWktZW1iZWRkaW5nc1wiPixcbiAgICAgICAgICAgIGJvZHk6IHNhbml0aXplZEJvZHksXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgZmVhdHVyZXMsXG4gICAgICAgICAgICB0YXJnZXRzOiBhd2FpdCB0aGlzLnJlZ2lzdHJ5Lmxpc3QoKSxcbiAgICAgICAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHNlbGVjdGlvbi5zbWFydFJvdXRlciAmJiAhc21hcnRSb3V0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDQsIFwiRGF0YWJyaWNrcyBTbWFydCBSb3V0ZXIgaXMgZGlzYWJsZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdHJ5VGFyZ2V0cyA9IHNtYXJ0Um91dGVyID8gdW5kZWZpbmVkIDogYXdhaXQgdGhpcy5yZWdpc3RyeS5saXN0KCk7XG4gICAgY29uc3QgYWlEZWNpZGUgPSBzZWxlY3Rpb24uYWlEZWNpZGVcbiAgICAgID8gYXdhaXQgdGhpcy5haURlY2lkZS5zZWxlY3QoXG4gICAgICAgICAgc2FuaXRpemVkQm9keSxcbiAgICAgICAgICAocmVnaXN0cnlUYXJnZXRzID8/IFtdKVxuICAgICAgICAgICAgLm1hcCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuZW5kcG9pbnQpXG4gICAgICAgICAgICAuZmlsdGVyKChlbmRwb2ludCk6IGVuZHBvaW50IGlzIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPT4gZW5kcG9pbnQgIT09IHVuZGVmaW5lZCksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0cmF0ZWd5OiBhaURlY2lkZVN0cmF0ZWd5KGhlYWRlcnMpLFxuICAgICAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgICAuLi4oZmVhdHVyZXMudG9vbHMgPyB7IHJlcXVpcmVzVG9vbHM6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uKGZlYXR1cmVzLnN0cnVjdHVyZWRPdXRwdXQgPyB7IHJlcXVpcmVzU3RydWN0dXJlZE91dHB1dDogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgc21hcnRSb3V0ZXI/LnRhcmdldCA/P1xuICAgICAgKGFpRGVjaWRlXG4gICAgICAgID8gcmVnaXN0cnlUYXJnZXRzPy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gYWlEZWNpZGUuZW5kcG9pbnQubmFtZSlcbiAgICAgICAgOiB1bmRlZmluZWQpID8/XG4gICAgICAoYXdhaXQgdGhpcy5yZWdpc3RyeS5yZXNvbHZlKHNlbGVjdGlvbi5tb2RlbCwge1xuICAgICAgICAuLi4ocHJvdG9jb2wgPT09IFwib3BlbmFpLWVtYmVkZGluZ3NcIiA/IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNlbGVjdGlvbi5tb2RlbENsYXNzID8geyBtb2RlbENsYXNzOiBzZWxlY3Rpb24ubW9kZWxDbGFzcyB9IDoge30pLFxuICAgICAgICAuLi4oZmVhdHVyZXMudG9vbHMgPyB7IHJlcXVpcmVzVG9vbHM6IHRydWUgfSA6IHt9KSxcbiAgICAgIH0pKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKFxuICAgICAgICA0MDQsXG4gICAgICAgIHNlbGVjdGlvbi5tb2RlbFxuICAgICAgICAgID8gYE1vZGVsIG5vdCBmb3VuZDogJHtzZWxlY3Rpb24ubW9kZWx9YFxuICAgICAgICAgIDogXCJObyBtb2RlbCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgY2xhc3NcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHJvdXRlID0gcmVzb2x2ZVJvdXRlKHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBwcm90b2NvbCxcbiAgICAgIC4uLighc21hcnRSb3V0ZXIgJiYgIWFpRGVjaWRlICYmIHNlbGVjdGlvbi5tb2RlbCA/IHsgcmVxdWVzdGVkTW9kZWw6IHNlbGVjdGlvbi5tb2RlbCB9IDoge30pLFxuICAgICAgb3JpZ2luYXRvcjogaGVhZGVycy5nZXQoXCJvcmlnaW5hdG9yXCIpID8/IHVuZGVmaW5lZCxcbiAgICAgIHByZWZlclN5c3RlbU1vZGVsczogdGhpcy5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIHRhcmdldCxcbiAgICB9KTtcbiAgICBsb2dnZXIuZGVidWcoXCJyb3V0ZWRcIiwge1xuICAgICAgY2xpZW50UHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgbW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIHVwc3RyZWFtUHJvdG9jb2w6IHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wsXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wZXJhdHVyZUJvZHkgPSBhZGFwdEluZmVyZW5jZVRlbXBlcmF0dXJlKFxuICAgICAgdGFyZ2V0LmVuZHBvaW50ID8/IHRhcmdldC5pZCxcbiAgICAgIHNtYXJ0Um91dGVyPy5ib2R5ID8/IHNhbml0aXplZEJvZHksXG4gICAgKTtcbiAgICBjb25zdCBhZGFwdGVkID0gYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcodGFyZ2V0LmlkLCB0ZW1wZXJhdHVyZUJvZHkpO1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZm9yd2FyZChyb3V0ZSwgYWRhcHRlZC5ib2R5LCBoZWFkZXJzLCBzaWduYWwpO1xuICAgIGNvbnN0IHJldHJ5Qm9keSA9IGF3YWl0IGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSh7XG4gICAgICBtb2RlbDogdGFyZ2V0LmlkLFxuICAgICAgYm9keTogdGVtcGVyYXR1cmVCb2R5LFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBwcmV2aW91c1dpcmVFZmZvcnQ6IGFkYXB0ZWQud2lyZUVmZm9ydCxcbiAgICB9KTtcbiAgICBpZiAocmV0cnlCb2R5KSB7XG4gICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZvcndhcmQocm91dGUsIHJldHJ5Qm9keSwgaGVhZGVycywgc2lnbmFsKTtcbiAgICB9XG5cbiAgICBsb2dSZXNwb25zZShyb3V0ZS51cHN0cmVhbVByb3RvY29sLCB0YXJnZXQuaWQsIHJlc3BvbnNlKTtcbiAgICBpZiAocm91dGUudXBzdHJlYW1Qcm90b2NvbCA9PT0gXCJhaS1zZGtcIikge1xuICAgICAgcmVzcG9uc2UuaGVhZGVycy5zZXQoXCJ4LWRieC10b29scy11cHN0cmVhbVwiLCByb3V0ZS51cHN0cmVhbVByb3RvY29sKTtcbiAgICAgIGlmIChzbWFydFJvdXRlcikge1xuICAgICAgICBhcHBseVNtYXJ0Um91dGVyT2JzZXJ2YXRpb25IZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMsIHNtYXJ0Um91dGVyLm9ic2VydmF0aW9uKTtcbiAgICAgIH1cbiAgICAgIGlmIChhaURlY2lkZSkgYXBwbHlBaURlY2lkZU9ic2VydmF0aW9uSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzLCBhaURlY2lkZS5vYnNlcnZhdGlvbik7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIGNvbnN0IGZvcndhcmRlZCA9IGdhdGV3YXlSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gICAgZm9yd2FyZGVkLnNldChcIngtZGJ4LXRvb2xzLXVwc3RyZWFtXCIsIHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wpO1xuICAgIGlmIChzbWFydFJvdXRlcikgYXBwbHlTbWFydFJvdXRlck9ic2VydmF0aW9uSGVhZGVycyhmb3J3YXJkZWQsIHNtYXJ0Um91dGVyLm9ic2VydmF0aW9uKTtcbiAgICBpZiAoYWlEZWNpZGUpIGFwcGx5QWlEZWNpZGVPYnNlcnZhdGlvbkhlYWRlcnMoZm9yd2FyZGVkLCBhaURlY2lkZS5vYnNlcnZhdGlvbik7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBmb3J3YXJkZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVmcmVzaCB0aGUgYWN0aXZlIHByaW5jaXBhbCdzIG1vZGVsIGNhdGFsb2d1ZS4gKi9cbiAgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoaW5nIG1vZGVsIGNhdGFsb2d1ZVwiKTtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZvcndhcmQoXG4gICAgcm91dGU6IEdhdGV3YXlSb3V0ZSxcbiAgICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgaGVhZGVyczogSGVhZGVycyxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKHJvdXRlLnVwc3RyZWFtUHJvdG9jb2wgPT09IFwiYWktc2RrXCIpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdChyb3V0ZSwgYm9keSwgc2lnbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoRGF0YWJyaWNrcyh7IHJvdXRlLCBib2R5LCBoZWFkZXJzLCBzaWduYWwgfSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBudWxsIHRlbXBlcmF0dXJlIGFuZCByZWplY3QgZXhwbGljaXQgbm9ubnVtZXJpYyB2YWx1ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbmZlcmVuY2VCb2R5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSkgcmV0dXJuIGJvZHk7XG4gIGlmIChib2R5LnRlbXBlcmF0dXJlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnRlbXBlcmF0dXJlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNGaW5pdGUoYm9keS50ZW1wZXJhdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBNb2RlbEdhdGV3YXlFcnJvcig0MDAsIFwidGVtcGVyYXR1cmUgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIsIG51bGwsIG9yIG9taXR0ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG4gIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc2FuaXRpemVkLnRlbXBlcmF0dXJlO1xuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKiogQXBwbHkgcHVibGlzaGVkIERhdGFicmlja3MgdGVtcGVyYXR1cmUgc3VwcG9ydCBhbmQgcmFuZ2UgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkYXB0SW5mZXJlbmNlVGVtcGVyYXR1cmUoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJ0ZW1wZXJhdHVyZVwiKSB8fCB0eXBlb2YgYm9keS50ZW1wZXJhdHVyZSAhPT0gXCJudW1iZXJcIikgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IHN1cHBvcnRlZCA9IG1vZGVsVGVtcGVyYXR1cmVTdXBwb3J0Rm9yKG1vZGVsKTtcbiAgaWYgKHN1cHBvcnRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYm9keTtcbiAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICBjb25zdCBhZGFwdGVkID0geyAuLi5ib2R5IH07XG4gICAgZGVsZXRlIGFkYXB0ZWQudGVtcGVyYXR1cmU7XG4gICAgcmV0dXJuIGFkYXB0ZWQ7XG4gIH1cbiAgY29uc3QgdGVtcGVyYXR1cmUgPSBNYXRoLm1pbihcbiAgICBEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01BWCxcbiAgICBNYXRoLm1heChEQVRBQlJJQ0tTX1RFTVBFUkFUVVJFX01JTiwgYm9keS50ZW1wZXJhdHVyZSksXG4gICk7XG4gIHJldHVybiB0ZW1wZXJhdHVyZSA9PT0gYm9keS50ZW1wZXJhdHVyZSA/IGJvZHkgOiB7IC4uLmJvZHksIHRlbXBlcmF0dXJlIH07XG59XG5cbi8qKiBSZXNvbHZlIHJlcXVlc3QsIGhlYWRlciwgY29uZmlndXJlZCwgYW5kIHByb3RvY29sIG1vZGVsLXNlbGVjdGlvbiBpbnB1dHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZXdheU1vZGVsU2VsZWN0aW9uKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIGRlZmF1bHRzOiB7IHJlYWRvbmx5IG1vZGVsPzogc3RyaW5nOyByZWFkb25seSBtb2RlbENsYXNzPzogTW9kZWxDbGFzc1R5cGUgfSA9IHt9LFxuICBwcm90b2NvbD86IENsaWVudFByb3RvY29sLFxuKToge1xuICByZWFkb25seSBzbWFydFJvdXRlcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFpRGVjaWRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzVHlwZTtcbn0ge1xuICBjb25zdCBtb2RlbCA9IHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiICYmIGJvZHkubW9kZWwudHJpbSgpID8gYm9keS5tb2RlbC50cmltKCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuZ2V0KFwieC1kYngtdG9vbHMtbW9kZWwtY2xhc3NcIik/LnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkQ2xhc3MgPSBoZWFkZXIgPyBNb2RlbENsYXNzU2NoZW1hLnNhZmVQYXJzZShoZWFkZXIpIDogdW5kZWZpbmVkO1xuICBpZiAocGFyc2VkQ2xhc3MgJiYgIXBhcnNlZENsYXNzLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgTW9kZWxHYXRld2F5RXJyb3IoNDAwLCBgSW52YWxpZCBtb2RlbCBjbGFzczogJHtoZWFkZXJ9YCk7XG4gIH1cbiAgaWYgKG1vZGVsICYmIHBhcnNlZENsYXNzPy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IE1vZGVsR2F0ZXdheUVycm9yKDQwMCwgXCJNb2RlbCBhbmQgbW9kZWwgY2xhc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKTtcbiAgfVxuICBpZiAobW9kZWwpIHtcbiAgICBpZiAoaXNTbWFydFJvdXRlck1vZGVsSWQobW9kZWwpKSByZXR1cm4geyBzbWFydFJvdXRlcjogdHJ1ZSB9O1xuICAgIGlmIChpc0FpRGVjaWRlTW9kZWxJZChtb2RlbCkpIHJldHVybiB7IGFpRGVjaWRlOiB0cnVlIH07XG4gICAgcmV0dXJuIHsgbW9kZWwgfTtcbiAgfVxuICBpZiAocGFyc2VkQ2xhc3M/LmRhdGEpIHJldHVybiB7IG1vZGVsQ2xhc3M6IHBhcnNlZENsYXNzLmRhdGEgfTtcbiAgaWYgKGRlZmF1bHRzLm1vZGVsKSB7XG4gICAgaWYgKGlzU21hcnRSb3V0ZXJNb2RlbElkKGRlZmF1bHRzLm1vZGVsKSkgcmV0dXJuIHsgc21hcnRSb3V0ZXI6IHRydWUgfTtcbiAgICBpZiAoaXNBaURlY2lkZU1vZGVsSWQoZGVmYXVsdHMubW9kZWwpKSByZXR1cm4geyBhaURlY2lkZTogdHJ1ZSB9O1xuICAgIHJldHVybiB7IG1vZGVsOiBkZWZhdWx0cy5tb2RlbCB9O1xuICB9XG4gIGlmIChkZWZhdWx0cy5tb2RlbENsYXNzKSByZXR1cm4geyBtb2RlbENsYXNzOiBkZWZhdWx0cy5tb2RlbENsYXNzIH07XG4gIGlmIChwcm90b2NvbCA9PT0gXCJvcGVuYWktZW1iZWRkaW5nc1wiKSByZXR1cm4geyBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9O1xuICByZXR1cm4ge307XG59XG5cbmZ1bmN0aW9uIGFwcGx5U21hcnRSb3V0ZXJPYnNlcnZhdGlvbkhlYWRlcnMoXG4gIGhlYWRlcnM6IEhlYWRlcnMsXG4gIG9ic2VydmF0aW9uOiBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuKTogdm9pZCB7XG4gIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsIG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwpO1xuICBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfUk9VVEVfTU9ERUxfSEVBREVSLCBvYnNlcnZhdGlvbi5yb3V0ZU1vZGVsKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX0hBUk5FU1NfSEVBREVSLCBvYnNlcnZhdGlvbi5oYXJuZXNzKTtcbiAgaGVhZGVycy5zZXQoU01BUlRfUk9VVEVSX1NPVVJDRV9IRUFERVIsIG9ic2VydmF0aW9uLnNvdXJjZSk7XG4gIGNvbnN0IHRhc2tUaWVyID0gc3RyaW5nUGFyYW0ob2JzZXJ2YXRpb24ucGFyYW1zLCBcInRhc2tfdGllclwiKTtcbiAgY29uc3Qgc2VydmVkVGllciA9IHN0cmluZ1BhcmFtKG9ic2VydmF0aW9uLnBhcmFtcywgXCJzZXJ2ZWRfdGllclwiKTtcbiAgY29uc3QgcHJvZmlsZXJTdGF0dXMgPSBzdHJpbmdQYXJhbShvYnNlcnZhdGlvbi5wYXJhbXMsIFwicHJvZmlsZXJfc3RhdHVzXCIpO1xuICBpZiAodGFza1RpZXIpIGhlYWRlcnMuc2V0KFNNQVJUX1JPVVRFUl9UQVNLX1RJRVJfSEVBREVSLCB0YXNrVGllcik7XG4gIGlmIChzZXJ2ZWRUaWVyKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfU0VSVkVEX1RJRVJfSEVBREVSLCBzZXJ2ZWRUaWVyKTtcbiAgaWYgKHByb2ZpbGVyU3RhdHVzKSBoZWFkZXJzLnNldChTTUFSVF9ST1VURVJfUFJPRklMRVJfU1RBVFVTX0hFQURFUiwgcHJvZmlsZXJTdGF0dXMpO1xufVxuXG5mdW5jdGlvbiBhcHBseUFpRGVjaWRlT2JzZXJ2YXRpb25IZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnMsIG9ic2VydmF0aW9uOiBBaURlY2lkZU9ic2VydmF0aW9uKTogdm9pZCB7XG4gIGhlYWRlcnMuc2V0KEFJX0RFQ0lERV9TRUxFQ1RFRF9NT0RFTF9IRUFERVIsIG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwpO1xuICBoZWFkZXJzLnNldChBSV9ERUNJREVfU1RSQVRFR1lfSEVBREVSLCBvYnNlcnZhdGlvbi5zdHJhdGVneSk7XG4gIGlmIChvYnNlcnZhdGlvbi5jb25maWRlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBoZWFkZXJzLnNldChBSV9ERUNJREVfQ09ORklERU5DRV9IRUFERVIsIFN0cmluZyhvYnNlcnZhdGlvbi5jb25maWRlbmNlKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWlEZWNpZGVTdHJhdGVneShoZWFkZXJzOiBIZWFkZXJzKSB7XG4gIGNvbnN0IHZhbHVlID0gaGVhZGVycy5nZXQoQUlfREVDSURFX1NUUkFURUdZX0hFQURFUik/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gdmFsdWUgPyBBaURlY2lkZVN0cmF0ZWd5U2NoZW1hLnBhcnNlKHZhbHVlKSA6IFwiYmFsYW5jZWRcIjtcbn1cblxuZnVuY3Rpb24gc3RyaW5nUGFyYW0oXG4gIHBhcmFtczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zPy5ba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBvbmx5VmlydHVhbE1vZGVsKHBheWxvYWQ6IE1vZGVsTGlzdFJlc3BvbnNlLCBtb2RlbElkOiBzdHJpbmcpOiBNb2RlbExpc3RSZXNwb25zZSB7XG4gIGlmIChcIm1vZGVsc1wiIGluIHBheWxvYWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxzOiBwYXlsb2FkLm1vZGVscy5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5zbHVnLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoYC8ke21vZGVsSWR9YCkpLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBvYmplY3Q6IFwibGlzdFwiLFxuICAgIGRhdGE6IHBheWxvYWQuZGF0YS5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5pZCA9PT0gbW9kZWxJZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvZ1Jlc3BvbnNlKHVwc3RyZWFtUHJvdG9jb2w6IHN0cmluZywgbW9kZWw6IHN0cmluZywgcmVzcG9uc2U6IFJlc3BvbnNlKTogdm9pZCB7XG4gIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgY29udGVudFR5cGU6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpLFxuICAgIG1vZGVsLFxuICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHVwc3RyZWFtUHJvdG9jb2wsXG4gIH07XG4gIGlmIChyZXNwb25zZS5vaykgbG9nZ2VyLmRlYnVnKFwidXBzdHJlYW0gcmVzcG9uc2VcIiwgZGV0YWlscyk7XG4gIGVsc2UgbG9nZ2VyLndhcm4oXCJ1cHN0cmVhbSByZXF1ZXN0IGZhaWxlZFwiLCBkZXRhaWxzKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forgiving model-context normalization for routing and suggestion generation.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
/** One useful conversational event retained from arbitrary caller input. */
|
|
7
|
+
export interface ModelContextEvent {
|
|
8
|
+
readonly role: "assistant" | "system" | "tool" | "user";
|
|
9
|
+
readonly text: string;
|
|
10
|
+
}
|
|
11
|
+
/** Controls for converting arbitrary values into bounded model context. */
|
|
12
|
+
export interface NormalizeModelContextOptions {
|
|
13
|
+
/** Maximum retained tokens. Defaults to 4096. */
|
|
14
|
+
readonly tokenLimit?: number;
|
|
15
|
+
/** Remove reasoning, tool calls/results, metadata, and other non-conversational noise. */
|
|
16
|
+
readonly removeNonUsefulMessages?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Bounded context plus logical-turn metadata used by model routers. */
|
|
19
|
+
export interface NormalizedModelContext {
|
|
20
|
+
readonly continuation: boolean;
|
|
21
|
+
readonly events: readonly ModelContextEvent[];
|
|
22
|
+
readonly logicalTurn: string;
|
|
23
|
+
readonly task: string;
|
|
24
|
+
readonly tokenCount: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Normalize strings, JSON, AI SDK messages, Responses input, and task-shaped objects.
|
|
28
|
+
*
|
|
29
|
+
* AI SDK UI/model message parsing is preferred. The fallback handles external wire
|
|
30
|
+
* shapes and arbitrary JSON without retaining credentials, metadata, or tool arguments.
|
|
31
|
+
*/
|
|
32
|
+
export declare function normalizeModelContext(input: unknown, options?: NormalizeModelContextOptions): Promise<NormalizedModelContext>;
|