@ruvector/ruvllm 2.6.2 → 3.0.0

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.
Files changed (45) hide show
  1. package/README.md +144 -38
  2. package/bin/cli.js +38 -18
  3. package/dist/cjs/engine.d.ts +79 -12
  4. package/dist/cjs/engine.d.ts.map +1 -1
  5. package/dist/cjs/engine.js +264 -55
  6. package/dist/cjs/native.d.ts +54 -6
  7. package/dist/cjs/native.d.ts.map +1 -1
  8. package/dist/cjs/native.js +30 -9
  9. package/dist/cjs/types.d.ts +95 -7
  10. package/dist/cjs/types.d.ts.map +1 -1
  11. package/dist/cjs/types.js +1 -1
  12. package/dist/esm/engine.d.ts +79 -12
  13. package/dist/esm/engine.d.ts.map +1 -1
  14. package/dist/esm/engine.js +263 -54
  15. package/dist/esm/native.d.ts +54 -6
  16. package/dist/esm/native.d.ts.map +1 -1
  17. package/dist/esm/native.js +31 -10
  18. package/dist/esm/types.d.ts +95 -7
  19. package/dist/esm/types.d.ts.map +1 -1
  20. package/dist/esm/types.js +1 -1
  21. package/package.json +4 -3
  22. package/dist/cjs/rlm/controller.d.ts +0 -245
  23. package/dist/cjs/rlm/controller.d.ts.map +0 -1
  24. package/dist/cjs/rlm/controller.js +0 -554
  25. package/dist/cjs/rlm/index.d.ts +0 -62
  26. package/dist/cjs/rlm/index.d.ts.map +0 -1
  27. package/dist/cjs/rlm/index.js +0 -97
  28. package/dist/cjs/rlm/training.d.ts +0 -333
  29. package/dist/cjs/rlm/training.d.ts.map +0 -1
  30. package/dist/cjs/rlm/training.js +0 -680
  31. package/dist/cjs/rlm/types.d.ts +0 -189
  32. package/dist/cjs/rlm/types.d.ts.map +0 -1
  33. package/dist/cjs/rlm/types.js +0 -10
  34. package/dist/esm/rlm/controller.d.ts +0 -245
  35. package/dist/esm/rlm/controller.d.ts.map +0 -1
  36. package/dist/esm/rlm/controller.js +0 -550
  37. package/dist/esm/rlm/index.d.ts +0 -62
  38. package/dist/esm/rlm/index.d.ts.map +0 -1
  39. package/dist/esm/rlm/index.js +0 -71
  40. package/dist/esm/rlm/training.d.ts +0 -333
  41. package/dist/esm/rlm/training.d.ts.map +0 -1
  42. package/dist/esm/rlm/training.js +0 -672
  43. package/dist/esm/rlm/types.d.ts +0 -189
  44. package/dist/esm/rlm/types.d.ts.map +0 -1
  45. package/dist/esm/rlm/types.js +0 -9
@@ -25,31 +25,109 @@ function toNativeConfig(config) {
25
25
  function toNativeGenConfig(config) {
26
26
  if (!config)
27
27
  return undefined;
28
+ // camelCase: napi-rs ignores snake_case keys on `#[napi(object)]` inputs.
28
29
  return {
29
- max_tokens: config.maxTokens,
30
+ maxTokens: config.maxTokens,
30
31
  temperature: config.temperature,
31
- top_p: config.topP,
32
- top_k: config.topK,
33
- repetition_penalty: config.repetitionPenalty,
32
+ topP: config.topP,
33
+ topK: config.topK,
34
+ repetitionPenalty: config.repetitionPenalty,
35
+ stopSequences: config.stopSequences,
36
+ seed: config.seed,
34
37
  };
35
38
  }
39
+ function toGenerationResult(r) {
40
+ return {
41
+ text: r.text,
42
+ promptTokens: r.promptTokens,
43
+ completionTokens: r.completionTokens,
44
+ finishReason: r.finishReason,
45
+ };
46
+ }
47
+ function toModelInfo(i) {
48
+ return {
49
+ name: i.name,
50
+ architecture: i.architecture,
51
+ numParameters: i.numParameters,
52
+ vocabSize: i.vocabSize,
53
+ hiddenSize: i.hiddenSize,
54
+ numLayers: i.numLayers,
55
+ maxContextLength: i.maxContextLength,
56
+ quantization: i.quantization ?? null,
57
+ memoryUsageBytes: i.memoryUsageBytes,
58
+ chatTemplate: i.chatTemplate ?? null,
59
+ };
60
+ }
61
+ const warned = new Set();
62
+ /** Warn once per process (or throw when `strict`). */
63
+ function notice(code, message, strict) {
64
+ if (strict)
65
+ throw codedError(code, message);
66
+ if (warned.has(code))
67
+ return;
68
+ warned.add(code);
69
+ const g = globalThis;
70
+ if (typeof g.process?.emitWarning === 'function')
71
+ g.process.emitWarning(message, { code });
72
+ else
73
+ g.console?.warn?.(`${code}: ${message}`);
74
+ }
75
+ /** An Error whose message starts with, and whose `code` is, `code`. */
76
+ function codedError(code, message) {
77
+ const err = new Error(`${code}: ${message}`);
78
+ err.code = code;
79
+ return err;
80
+ }
81
+ /**
82
+ * Call into the native engine, giving its errors the same `code` as the
83
+ * wrapper's own: native messages start with `RUVLLM_<CODE>:`, but napi-rs
84
+ * sets `code` to a generic status such as `GenericFailure`.
85
+ */
86
+ function callNative(f) {
87
+ try {
88
+ return f();
89
+ }
90
+ catch (e) {
91
+ const match = /^(RUVLLM_[A-Z_]+):/.exec(e instanceof Error ? e.message : '');
92
+ if (match)
93
+ e.code = match[1];
94
+ throw e;
95
+ }
96
+ }
97
+ function platformKey() {
98
+ const p = globalThis.process;
99
+ return `${p?.platform ?? 'unknown'}-${p?.arch ?? 'unknown'}`;
100
+ }
101
+ function envAllowsPlaceholder() {
102
+ const p = globalThis.process;
103
+ return p?.env?.RUVLLM_ALLOW_MOCK === '1';
104
+ }
105
+ /** Returned by generate()/query() only with `allowPlaceholder` / `RUVLLM_ALLOW_MOCK=1`. */
106
+ export const PLACEHOLDER_TEXT = '[RuvLLM placeholder: no language model is loaded; this text is not model output]';
36
107
  /**
37
108
  * RuvLLM - Self-learning LLM orchestrator
38
109
  *
39
- * Combines SONA adaptive learning with HNSW memory,
40
- * FastGRNN routing, and SIMD-optimized inference.
110
+ * Combines SONA adaptive learning with HNSW memory, FastGRNN routing, and
111
+ * GGUF inference through the native candle backend.
112
+ *
113
+ * Text comes only from a model loaded with `loadModel()` (or the `modelPath`
114
+ * option). Without one, `generate()`, `query()`, `chat()` and
115
+ * `generateDetailed()` throw `RUVLLM_NO_LANGUAGE_MODEL`.
41
116
  *
42
117
  * @example
43
118
  * ```typescript
44
119
  * import { RuvLLM } from '@ruvector/ruvllm';
45
120
  *
46
- * const llm = new RuvLLM({ embeddingDim: 768 });
121
+ * const llm = new RuvLLM();
122
+ * llm.loadModel('./qwen2.5-0.5b-instruct-q4_k_m.gguf');
47
123
  *
48
- * // Query with automatic routing
49
- * const response = await llm.query('What is machine learning?');
50
- * console.log(response.text);
124
+ * const out = llm.chat([{ role: 'user', content: 'What is machine learning?' }], {
125
+ * maxTokens: 128,
126
+ * });
127
+ * console.log(out.text, out.finishReason, out.completionTokens);
51
128
  *
52
- * // Provide feedback for learning
129
+ * // Routed query, answered by the loaded model
130
+ * const response = llm.query('What is machine learning?');
53
131
  * llm.feedback({ requestId: response.requestId, rating: 5 });
54
132
  * ```
55
133
  */
@@ -59,6 +137,7 @@ export class RuvLLM {
59
137
  */
60
138
  constructor(config) {
61
139
  this.native = null;
140
+ this.nativeVersion = null;
62
141
  // Fallback state for when native module is not available
63
142
  this.fallbackState = {
64
143
  memory: new Map(),
@@ -66,72 +145,202 @@ export class RuvLLM {
66
145
  queryCount: 0,
67
146
  };
68
147
  this.config = config ?? {};
148
+ this.allowPlaceholder = this.config.allowPlaceholder === true || envAllowsPlaceholder();
149
+ const extra = this.config;
150
+ if (extra.backend !== undefined) {
151
+ notice('RUVLLM_UNSUPPORTED_OPTION', '`backend` is not supported by @ruvector/ruvllm and is ignored: models loaded with ' +
152
+ 'loadModel() run on the built-in candle backend.', this.config.strict);
153
+ }
69
154
  const mod = getNativeModule();
70
155
  if (mod) {
71
156
  try {
72
157
  this.native = new mod.RuvLLMEngine(toNativeConfig(config));
158
+ this.nativeVersion = mod.version();
73
159
  }
74
160
  catch {
75
161
  // Silently fall back to JS implementation
76
162
  }
77
163
  }
164
+ if (this.config.modelPath !== undefined) {
165
+ this.loadModel(this.config.modelPath, this.config.modelOptions);
166
+ }
167
+ }
168
+ /**
169
+ * Whether the native binary can load and run a language model. False
170
+ * without a native binary, for binaries that predate `loadModel` (the 2.0.x
171
+ * `@ruvector/ruvllm-<platform>` packages), and for binaries built without
172
+ * the `candle` inference backend.
173
+ */
174
+ supportsModelLoading() {
175
+ const native = this.native;
176
+ if (typeof native?.loadModel !== 'function')
177
+ return false;
178
+ // Builds that predate this probe all had the backend (they were local
179
+ // `npm run build:native` builds, which enable `candle`).
180
+ return typeof native.supportsModelLoading === 'function' ? native.supportsModelLoading() : true;
181
+ }
182
+ /** Error for a binary that has `loadModel` but no inference backend. */
183
+ noBackendError() {
184
+ return codedError('RUVLLM_NO_INFERENCE_BACKEND', `the installed native binary (version ${this.nativeVersion ?? 'unknown'}) was built ` +
185
+ 'without the `candle` inference backend and cannot load models. Rebuild it with ' +
186
+ '`npm run build:native` (which enables `candle`) and set RUVLLM_NATIVE_PATH to it, ' +
187
+ 'or use the ruvllm CLI (`ruvllm serve <model>`).');
188
+ }
189
+ /**
190
+ * Load a GGUF model (or a directory holding one) for `generate()`,
191
+ * `chat()` and `query()`. Supported GGUF architectures: llama, mistral,
192
+ * qwen2, qwen3; others fail with an error naming the architecture. The
193
+ * tokenizer comes from a `tokenizer.json` beside the file, else from the
194
+ * GGUF itself. Replaces any loaded model; if loading fails, no model is
195
+ * loaded. Synchronous: blocks the event loop while the weights load.
196
+ *
197
+ * @throws `RUVLLM_NATIVE_UNAVAILABLE` without a native binary,
198
+ * `RUVLLM_NATIVE_TOO_OLD` when the binary predates model loading,
199
+ * `RUVLLM_NO_INFERENCE_BACKEND` when it was built without `candle`,
200
+ * `RUVLLM_MODEL_NOT_FOUND` / `RUVLLM_MODEL_LOAD_FAILED` from the backend.
201
+ */
202
+ loadModel(path, options) {
203
+ if (typeof path !== 'string' || path.length === 0) {
204
+ throw new TypeError('loadModel: path must be a non-empty string');
205
+ }
206
+ if (!this.native) {
207
+ throw codedError('RUVLLM_NATIVE_UNAVAILABLE', `no native RuvLLM binary could be loaded for ${platformKey()}, so models cannot be ` +
208
+ 'loaded. Install the matching @ruvector/ruvllm-<platform> package, or build one ' +
209
+ '(`npm run build:native`) and set RUVLLM_NATIVE_PATH to it.');
210
+ }
211
+ if (typeof this.native.loadModel !== 'function') {
212
+ throw codedError('RUVLLM_NATIVE_TOO_OLD', `the installed native binary (version ${this.nativeVersion ?? 'unknown'}) cannot load ` +
213
+ 'models: it predates loadModel(). The @ruvector/ruvllm-<platform> 2.0.x packages are ' +
214
+ 'such builds. Install the 3.x platform package, or build the binary from source ' +
215
+ '(`npm run build:native`, which enables the `candle` feature) and set ' +
216
+ 'RUVLLM_NATIVE_PATH to it, or use the ruvllm CLI (`ruvllm serve <model>`).');
217
+ }
218
+ if (!this.supportsModelLoading())
219
+ throw this.noBackendError();
220
+ const native = this.native;
221
+ return toModelInfo(callNative(() => native.loadModel(path, options)));
78
222
  }
79
223
  /**
80
- * Query the LLM with automatic routing
224
+ * Unload the language model and free its memory
225
+ */
226
+ unloadModel() {
227
+ this.native?.unloadModel?.();
228
+ }
229
+ /**
230
+ * Whether a language model is loaded
231
+ */
232
+ isModelLoaded() {
233
+ return this.native?.isModelLoaded?.() ?? false;
234
+ }
235
+ /**
236
+ * The loaded language model, or null
237
+ */
238
+ modelInfo() {
239
+ const info = this.native?.modelInfo?.();
240
+ return info ? toModelInfo(info) : null;
241
+ }
242
+ /**
243
+ * Route `text`, then answer it with the loaded model (as one user message
244
+ * under the model's chat template).
245
+ *
246
+ * @throws `RUVLLM_NO_LANGUAGE_MODEL` when no model is loaded, unless
247
+ * `allowPlaceholder` is set (then `text` is `PLACEHOLDER_TEXT`).
81
248
  */
82
249
  query(text, config) {
83
- if (this.native) {
84
- const result = this.native.query(text, toNativeGenConfig(config));
85
- // napi-rs camelCases Rust field names on the way out, so the native
86
- // object carries `contextSize`/`latencyMs`/`requestId`. The snake_case
87
- // reads are kept as a fallback for older native builds.
250
+ if (!this.isModelLoaded()) {
251
+ const placeholder = this.placeholderOrThrow();
252
+ this.fallbackState.queryCount++;
253
+ const route = this.route(text);
88
254
  return {
89
- text: result.text,
90
- confidence: result.confidence,
91
- model: result.model,
92
- contextSize: result.contextSize ?? result.context_size,
93
- latencyMs: result.latencyMs ?? result.latency_ms,
94
- requestId: result.requestId ?? result.request_id,
255
+ text: placeholder,
256
+ confidence: route.confidence,
257
+ model: route.model,
258
+ contextSize: route.contextSize,
259
+ latencyMs: 0,
260
+ requestId: `placeholder-${Date.now()}-${Math.random().toString(36).slice(2)}`,
95
261
  };
96
262
  }
97
- // Fallback implementation
98
- this.fallbackState.queryCount++;
263
+ const native = this.native;
264
+ const result = callNative(() => native.query(text, toNativeGenConfig(config)));
99
265
  return {
100
- text: `[Fallback] Response to: ${text.slice(0, 50)}...`,
101
- confidence: 0.5,
102
- model: 'fallback',
103
- contextSize: 512,
104
- latencyMs: 1.0,
105
- requestId: `fb-${Date.now()}-${Math.random().toString(36).slice(2)}`,
266
+ text: result.text,
267
+ confidence: result.confidence,
268
+ model: result.model,
269
+ contextSize: result.contextSize,
270
+ latencyMs: result.latencyMs,
271
+ requestId: result.requestId,
272
+ promptTokens: result.promptTokens,
273
+ completionTokens: result.completionTokens,
274
+ finishReason: result.finishReason,
106
275
  };
107
276
  }
108
277
  /**
109
- * Generate text with SIMD-optimized inference
278
+ * Continue `prompt` verbatim with the loaded model (no chat template; use
279
+ * `chat()` for instruction-tuned models). Returns the generated text.
110
280
  *
111
- * Note: If no trained model is loaded (demo mode), returns an informational
112
- * message instead of garbled output.
281
+ * @throws `RUVLLM_NO_LANGUAGE_MODEL` when no model is loaded, unless
282
+ * `allowPlaceholder` is set (then it returns `PLACEHOLDER_TEXT`).
113
283
  */
114
284
  generate(prompt, config) {
115
- if (this.native) {
116
- return this.native.generate(prompt, toNativeGenConfig(config));
285
+ if (!this.isModelLoaded())
286
+ return this.placeholderOrThrow();
287
+ return this.generateDetailed(prompt, config).text;
288
+ }
289
+ /**
290
+ * Like `generate()`, with token counts (from the model's tokenizer) and
291
+ * the finish reason. Always throws `RUVLLM_NO_LANGUAGE_MODEL` without a
292
+ * loaded model.
293
+ */
294
+ generateDetailed(prompt, config) {
295
+ const native = this.requireModel();
296
+ return toGenerationResult(callNative(() => native.generate(prompt, toNativeGenConfig(config))));
297
+ }
298
+ /**
299
+ * Run the loaded model on a conversation, formatted with the model's chat
300
+ * template (ChatML for Qwen, Llama 3 / Mistral formats for those models).
301
+ * Always throws `RUVLLM_NO_LANGUAGE_MODEL` without a loaded model.
302
+ */
303
+ chat(messages, config) {
304
+ const native = this.requireModel();
305
+ return toGenerationResult(callNative(() => native.chat(messages, toNativeGenConfig(config))));
306
+ }
307
+ requireModel() {
308
+ if (!this.isModelLoaded())
309
+ throw this.noModelError();
310
+ return this.native;
311
+ }
312
+ noModelError() {
313
+ let fix;
314
+ if (!this.native) {
315
+ fix =
316
+ `no native RuvLLM binary is available for ${platformKey()}, so no model can be loaded ` +
317
+ '(see RUVLLM_NATIVE_UNAVAILABLE in the README)';
318
+ }
319
+ else if (typeof this.native.loadModel !== 'function') {
320
+ fix =
321
+ `the installed native binary (version ${this.nativeVersion ?? 'unknown'}) cannot load ` +
322
+ 'models (see RUVLLM_NATIVE_TOO_OLD in the README)';
117
323
  }
118
- // Fallback - provide helpful message instead of garbled output
119
- const maxTokens = config?.maxTokens ?? 256;
120
- const temp = config?.temperature ?? 0.7;
121
- const topP = config?.topP ?? 0.9;
122
- return `[RuvLLM JavaScript Fallback Mode]
123
- No native SIMD module loaded. Running in JavaScript fallback mode.
124
-
125
- Your prompt: "${prompt.slice(0, 100)}${prompt.length > 100 ? '...' : ''}"
126
-
127
- To enable native SIMD inference:
128
- 1. Install the native bindings: npm install @ruvector/ruvllm-${process.platform}-${process.arch}
129
- 2. Or load a GGUF model file
130
- 3. Or connect to an external LLM API
131
-
132
- Config: temp=${temp.toFixed(2)}, top_p=${topP.toFixed(2)}, max_tokens=${maxTokens}
133
-
134
- This fallback provides routing, memory, and embedding features but not full text generation.`;
324
+ else if (!this.supportsModelLoading()) {
325
+ fix =
326
+ `the installed native binary (version ${this.nativeVersion ?? 'unknown'}) was built ` +
327
+ 'without the candle inference backend, so it cannot load models (see ' +
328
+ 'RUVLLM_NO_INFERENCE_BACKEND in the README)';
329
+ }
330
+ else {
331
+ fix = 'call loadModel(<path to a GGUF file>) first';
332
+ }
333
+ return codedError('RUVLLM_NO_LANGUAGE_MODEL', `no language model is loaded, so there is no model output to return: ${fix}. Routing, ` +
334
+ 'memory and embeddings work without a model. For an HTTP server use the ruvllm CLI ' +
335
+ '(`ruvllm serve <model>`).');
336
+ }
337
+ /** Throw `RUVLLM_NO_LANGUAGE_MODEL`, or return the labelled placeholder when opted in. */
338
+ placeholderOrThrow() {
339
+ if (!this.allowPlaceholder)
340
+ throw this.noModelError();
341
+ notice('RUVLLM_PLACEHOLDER_TEXT', 'no language model is loaded: generate()/query() are returning a labelled placeholder, ' +
342
+ 'not model output, because allowPlaceholder (or RUVLLM_ALLOW_MOCK=1) is set.', false);
343
+ return PLACEHOLDER_TEXT;
135
344
  }
136
345
  /**
137
346
  * Get routing decision for a query
@@ -336,4 +545,4 @@ This fallback provides routing, memory, and embedding features but not full text
336
545
  return this.native !== null;
337
546
  }
338
547
  }
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQWdCSCxPQUFPLEVBQ0wsZUFBZSxHQUloQixNQUFNLFVBQVUsQ0FBQztBQUVsQjs7R0FFRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQXFCO0lBQzNDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFOUIsT0FBTztRQUNMLGFBQWEsRUFBRSxNQUFNLENBQUMsWUFBWTtRQUNsQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsZUFBZTtRQUN6QyxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7UUFDcEIsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLGtCQUFrQjtRQUMvQyxjQUFjLEVBQUUsTUFBTSxDQUFDLFlBQVk7UUFDbkMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGVBQWU7UUFDeEMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtRQUMxQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVM7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsaUJBQWlCLENBQUMsTUFBeUI7SUFDbEQsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU5QixPQUFPO1FBQ0wsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTO1FBQzVCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztRQUMvQixLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDbEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2xCLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7S0FDN0MsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sT0FBTyxNQUFNO0lBV2pCOztPQUVHO0lBQ0gsWUFBWSxNQUFxQjtRQWJ6QixXQUFNLEdBQXdCLElBQUksQ0FB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bUIsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxPQUEwQjtRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDekIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxRSxPQUFPO1lBQ0wsU0FBUztZQUNULGNBQWMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSztTQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSdXZMTE0gRW5naW5lIC0gTWFpbiBvcmNoZXN0cmF0b3IgZm9yIHNlbGYtbGVhcm5pbmcgTExNXG4gKi9cblxuaW1wb3J0IHtcbiAgUnV2TExNQ29uZmlnLFxuICBHZW5lcmF0aW9uQ29uZmlnLFxuICBRdWVyeVJlc3BvbnNlLFxuICBSb3V0aW5nRGVjaXNpb24sXG4gIE1lbW9yeVJlc3VsdCxcbiAgTWVtb3J5SWQsXG4gIFJ1dkxMTVN0YXRzLFxuICBGZWVkYmFjayxcbiAgRW1iZWRkaW5nLFxuICBCYXRjaFF1ZXJ5UmVxdWVzdCxcbiAgQmF0Y2hRdWVyeVJlc3BvbnNlLFxufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHtcbiAgZ2V0TmF0aXZlTW9kdWxlLFxuICBOYXRpdmVFbmdpbmUsXG4gIE5hdGl2ZUNvbmZpZyxcbiAgTmF0aXZlR2VuQ29uZmlnLFxufSBmcm9tICcuL25hdGl2ZSc7XG5cbi8qKlxuICogQ29udmVydCBKUyBjb25maWcgdG8gbmF0aXZlIGNvbmZpZyBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gdG9OYXRpdmVDb25maWcoY29uZmlnPzogUnV2TExNQ29uZmlnKTogTmF0aXZlQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBlbWJlZGRpbmdfZGltOiBjb25maWcuZW1iZWRkaW5nRGltLFxuICAgIHJvdXRlcl9oaWRkZW5fZGltOiBjb25maWcucm91dGVySGlkZGVuRGltLFxuICAgIGhuc3dfbTogY29uZmlnLmhuc3dNLFxuICAgIGhuc3dfZWZfY29uc3RydWN0aW9uOiBjb25maWcuaG5zd0VmQ29uc3RydWN0aW9uLFxuICAgIGhuc3dfZWZfc2VhcmNoOiBjb25maWcuaG5zd0VmU2VhcmNoLFxuICAgIGxlYXJuaW5nX2VuYWJsZWQ6IGNvbmZpZy5sZWFybmluZ0VuYWJsZWQsXG4gICAgcXVhbGl0eV90aHJlc2hvbGQ6IGNvbmZpZy5xdWFsaXR5VGhyZXNob2xkLFxuICAgIGV3Y19sYW1iZGE6IGNvbmZpZy5ld2NMYW1iZGEsXG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydCBKUyBnZW5lcmF0aW9uIGNvbmZpZyB0byBuYXRpdmUgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIHRvTmF0aXZlR2VuQ29uZmlnKGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBOYXRpdmVHZW5Db25maWcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIG1heF90b2tlbnM6IGNvbmZpZy5tYXhUb2tlbnMsXG4gICAgdGVtcGVyYXR1cmU6IGNvbmZpZy50ZW1wZXJhdHVyZSxcbiAgICB0b3BfcDogY29uZmlnLnRvcFAsXG4gICAgdG9wX2s6IGNvbmZpZy50b3BLLFxuICAgIHJlcGV0aXRpb25fcGVuYWx0eTogY29uZmlnLnJlcGV0aXRpb25QZW5hbHR5LFxuICB9O1xufVxuXG4vKipcbiAqIFJ1dkxMTSAtIFNlbGYtbGVhcm5pbmcgTExNIG9yY2hlc3RyYXRvclxuICpcbiAqIENvbWJpbmVzIFNPTkEgYWRhcHRpdmUgbGVhcm5pbmcgd2l0aCBITlNXIG1lbW9yeSxcbiAqIEZhc3RHUk5OIHJvdXRpbmcsIGFuZCBTSU1ELW9wdGltaXplZCBpbmZlcmVuY2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFJ1dkxMTSB9IGZyb20gJ0BydXZlY3Rvci9ydXZsbG0nO1xuICpcbiAqIGNvbnN0IGxsbSA9IG5ldyBSdXZMTE0oeyBlbWJlZGRpbmdEaW06IDc2OCB9KTtcbiAqXG4gKiAvLyBRdWVyeSB3aXRoIGF1dG9tYXRpYyByb3V0aW5nXG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGxsbS5xdWVyeSgnV2hhdCBpcyBtYWNoaW5lIGxlYXJuaW5nPycpO1xuICogY29uc29sZS5sb2cocmVzcG9uc2UudGV4dCk7XG4gKlxuICogLy8gUHJvdmlkZSBmZWVkYmFjayBmb3IgbGVhcm5pbmdcbiAqIGxsbS5mZWVkYmFjayh7IHJlcXVlc3RJZDogcmVzcG9uc2UucmVxdWVzdElkLCByYXRpbmc6IDUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1dkxMTSB7XG4gIHByaXZhdGUgbmF0aXZlOiBOYXRpdmVFbmdpbmUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25maWc6IFJ1dkxMTUNvbmZpZztcblxuICAvLyBGYWxsYmFjayBzdGF0ZSBmb3Igd2hlbiBuYXRpdmUgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGVcbiAgcHJpdmF0ZSBmYWxsYmFja1N0YXRlID0ge1xuICAgIG1lbW9yeTogbmV3IE1hcDxudW1iZXIsIHsgY29udGVudDogc3RyaW5nOyBlbWJlZGRpbmc6IG51bWJlcltdOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4oKSxcbiAgICBuZXh0SWQ6IDEsXG4gICAgcXVlcnlDb3VudDogMCxcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IFJ1dkxMTSBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnPzogUnV2TExNQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWcgPz8ge307XG5cbiAgICBjb25zdCBtb2QgPSBnZXROYXRpdmVNb2R1bGUoKTtcbiAgICBpZiAobW9kKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm5hdGl2ZSA9IG5ldyBtb2QuUnV2TExNRW5naW5lKHRvTmF0aXZlQ29uZmlnKGNvbmZpZykpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNpbGVudGx5IGZhbGwgYmFjayB0byBKUyBpbXBsZW1lbnRhdGlvblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyeSB0aGUgTExNIHdpdGggYXV0b21hdGljIHJvdXRpbmdcbiAgICovXG4gIHF1ZXJ5KHRleHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZyk6IFF1ZXJ5UmVzcG9uc2Uge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmUucXVlcnkodGV4dCwgdG9OYXRpdmVHZW5Db25maWcoY29uZmlnKSk7XG4gICAgICAvLyBuYXBpLXJzIGNhbWVsQ2FzZXMgUnVzdCBmaWVsZCBuYW1lcyBvbiB0aGUgd2F5IG91dCwgc28gdGhlIG5hdGl2ZVxuICAgICAgLy8gb2JqZWN0IGNhcnJpZXMgYGNvbnRleHRTaXplYC9gbGF0ZW5jeU1zYC9gcmVxdWVzdElkYC4gVGhlIHNuYWtlX2Nhc2VcbiAgICAgIC8vIHJlYWRzIGFyZSBrZXB0IGFzIGEgZmFsbGJhY2sgZm9yIG9sZGVyIG5hdGl2ZSBidWlsZHMuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgICAgY29uZmlkZW5jZTogcmVzdWx0LmNvbmZpZGVuY2UsXG4gICAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICAgIGNvbnRleHRTaXplOiByZXN1bHQuY29udGV4dFNpemUgPz8gcmVzdWx0LmNvbnRleHRfc2l6ZSxcbiAgICAgICAgbGF0ZW5jeU1zOiByZXN1bHQubGF0ZW5jeU1zID8/IHJlc3VsdC5sYXRlbmN5X21zLFxuICAgICAgICByZXF1ZXN0SWQ6IHJlc3VsdC5yZXF1ZXN0SWQgPz8gcmVzdWx0LnJlcXVlc3RfaWQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGltcGxlbWVudGF0aW9uXG4gICAgdGhpcy5mYWxsYmFja1N0YXRlLnF1ZXJ5Q291bnQrKztcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogYFtGYWxsYmFja10gUmVzcG9uc2UgdG86ICR7dGV4dC5zbGljZSgwLCA1MCl9Li4uYCxcbiAgICAgIGNvbmZpZGVuY2U6IDAuNSxcbiAgICAgIG1vZGVsOiAnZmFsbGJhY2snLFxuICAgICAgY29udGV4dFNpemU6IDUxMixcbiAgICAgIGxhdGVuY3lNczogMS4wLFxuICAgICAgcmVxdWVzdElkOiBgZmItJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0ZXh0IHdpdGggU0lNRC1vcHRpbWl6ZWQgaW5mZXJlbmNlXG4gICAqXG4gICAqIE5vdGU6IElmIG5vIHRyYWluZWQgbW9kZWwgaXMgbG9hZGVkIChkZW1vIG1vZGUpLCByZXR1cm5zIGFuIGluZm9ybWF0aW9uYWxcbiAgICogbWVzc2FnZSBpbnN0ZWFkIG9mIGdhcmJsZWQgb3V0cHV0LlxuICAgKi9cbiAgZ2VuZXJhdGUocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmdlbmVyYXRlKHByb21wdCwgdG9OYXRpdmVHZW5Db25maWcoY29uZmlnKSk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgLSBwcm92aWRlIGhlbHBmdWwgbWVzc2FnZSBpbnN0ZWFkIG9mIGdhcmJsZWQgb3V0cHV0XG4gICAgY29uc3QgbWF4VG9rZW5zID0gY29uZmlnPy5tYXhUb2tlbnMgPz8gMjU2O1xuICAgIGNvbnN0IHRlbXAgPSBjb25maWc/LnRlbXBlcmF0dXJlID8/IDAuNztcbiAgICBjb25zdCB0b3BQID0gY29uZmlnPy50b3BQID8/IDAuOTtcblxuICAgIHJldHVybiBgW1J1dkxMTSBKYXZhU2NyaXB0IEZhbGxiYWNrIE1vZGVdXG5ObyBuYXRpdmUgU0lNRCBtb2R1bGUgbG9hZGVkLiBSdW5uaW5nIGluIEphdmFTY3JpcHQgZmFsbGJhY2sgbW9kZS5cblxuWW91ciBwcm9tcHQ6IFwiJHtwcm9tcHQuc2xpY2UoMCwgMTAwKX0ke3Byb21wdC5sZW5ndGggPiAxMDAgPyAnLi4uJyA6ICcnfVwiXG5cblRvIGVuYWJsZSBuYXRpdmUgU0lNRCBpbmZlcmVuY2U6XG4xLiBJbnN0YWxsIHRoZSBuYXRpdmUgYmluZGluZ3M6IG5wbSBpbnN0YWxsIEBydXZlY3Rvci9ydXZsbG0tJHtwcm9jZXNzLnBsYXRmb3JtfS0ke3Byb2Nlc3MuYXJjaH1cbjIuIE9yIGxvYWQgYSBHR1VGIG1vZGVsIGZpbGVcbjMuIE9yIGNvbm5lY3QgdG8gYW4gZXh0ZXJuYWwgTExNIEFQSVxuXG5Db25maWc6IHRlbXA9JHt0ZW1wLnRvRml4ZWQoMil9LCB0b3BfcD0ke3RvcFAudG9GaXhlZCgyKX0sIG1heF90b2tlbnM9JHttYXhUb2tlbnN9XG5cblRoaXMgZmFsbGJhY2sgcHJvdmlkZXMgcm91dGluZywgbWVtb3J5LCBhbmQgZW1iZWRkaW5nIGZlYXR1cmVzIGJ1dCBub3QgZnVsbCB0ZXh0IGdlbmVyYXRpb24uYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcm91dGluZyBkZWNpc2lvbiBmb3IgYSBxdWVyeVxuICAgKi9cbiAgcm91dGUodGV4dDogc3RyaW5nKTogUm91dGluZ0RlY2lzaW9uIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlLnJvdXRlKHRleHQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZWw6IHJlc3VsdC5tb2RlbCBhcyBhbnksXG4gICAgICAgIGNvbnRleHRTaXplOiByZXN1bHQuY29udGV4dFNpemUgPz8gcmVzdWx0LmNvbnRleHRfc2l6ZSxcbiAgICAgICAgdGVtcGVyYXR1cmU6IHJlc3VsdC50ZW1wZXJhdHVyZSxcbiAgICAgICAgdG9wUDogcmVzdWx0LnRvcFAgPz8gcmVzdWx0LnRvcF9wLFxuICAgICAgICBjb25maWRlbmNlOiByZXN1bHQuY29uZmlkZW5jZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2tcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWw6ICdNNzAwJyxcbiAgICAgIGNvbnRleHRTaXplOiA1MTIsXG4gICAgICB0ZW1wZXJhdHVyZTogMC43LFxuICAgICAgdG9wUDogMC45LFxuICAgICAgY29uZmlkZW5jZTogMC41LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIG1lbW9yeSBmb3Igc2ltaWxhciBjb250ZW50XG4gICAqL1xuICBzZWFyY2hNZW1vcnkodGV4dDogc3RyaW5nLCBrID0gMTApOiBNZW1vcnlSZXN1bHRbXSB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5uYXRpdmUuc2VhcmNoTWVtb3J5KHRleHQsIGspO1xuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKHIgPT4ge1xuICAgICAgICAvLyBUaGUgbmF0aXZlIHNpZGUgcmVwb3J0cyBgZGlzdGFuY2VgIChzbWFsbGVyIGlzIGNsb3NlcikuIE1lbW9yeVJlc3VsdFxuICAgICAgICAvLyBkb2N1bWVudHMgYHNjb3JlYCBhcyBhIHNpbWlsYXJpdHksIHNvIGNvbnZlcnQgcmF0aGVyIHRoYW4gcGFzc2luZyBhXG4gICAgICAgIC8vIGRpc3RhbmNlIHRocm91Z2ggdW5kZXIgYSBzaW1pbGFyaXR5J3MgbmFtZS4gT2xkZXIgYnVpbGRzIHRoYXQgYWxyZWFkeVxuICAgICAgICAvLyBlbWl0IGBzY29yZWAgYXJlIHVzZWQgYXMtaXMuXG4gICAgICAgIGNvbnN0IGFueVIgPSByIGFzIGFueTtcbiAgICAgICAgY29uc3Qgc2NvcmUgPVxuICAgICAgICAgIHR5cGVvZiBhbnlSLnNjb3JlID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBhbnlSLnNjb3JlXG4gICAgICAgICAgICA6IHR5cGVvZiBhbnlSLmRpc3RhbmNlID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICA/IDEgLyAoMSArIE1hdGgubWF4KDAsIGFueVIuZGlzdGFuY2UpKVxuICAgICAgICAgICAgICA6IDA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgICAgc2NvcmUsXG4gICAgICAgICAgY29udGVudDogci5jb250ZW50LFxuICAgICAgICAgIG1ldGFkYXRhOiBKU09OLnBhcnNlKHIubWV0YWRhdGEgfHwgJ3t9JyksXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAtIHNpbXBsZSBzZWFyY2hcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmZhbGxiYWNrU3RhdGUubWVtb3J5LmVudHJpZXMoKSlcbiAgICAgIC5zbGljZSgwLCBrKVxuICAgICAgLm1hcCgoW2lkLCBkYXRhXSkgPT4gKHtcbiAgICAgICAgaWQsXG4gICAgICAgIHNjb3JlOiAwLjUsXG4gICAgICAgIGNvbnRlbnQ6IGRhdGEuY29udGVudCxcbiAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGNvbnRlbnQgdG8gbWVtb3J5XG4gICAqL1xuICBhZGRNZW1vcnkoY29udGVudDogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogTWVtb3J5SWQge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmFkZE1lbW9yeShjb250ZW50LCBtZXRhZGF0YSA/IEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2tcbiAgICBjb25zdCBpZCA9IHRoaXMuZmFsbGJhY2tTdGF0ZS5uZXh0SWQrKztcbiAgICB0aGlzLmZhbGxiYWNrU3RhdGUubWVtb3J5LnNldChpZCwge1xuICAgICAgY29udGVudCxcbiAgICAgIGVtYmVkZGluZzogdGhpcy5lbWJlZChjb250ZW50KSxcbiAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSA/PyB7fSxcbiAgICB9KTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBmZWVkYmFjayBmb3IgbGVhcm5pbmdcbiAgICovXG4gIGZlZWRiYWNrKGZiOiBGZWVkYmFjayk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmZlZWRiYWNrKGZiLnJlcXVlc3RJZCwgZmIucmF0aW5nLCBmYi5jb3JyZWN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbmdpbmUgc3RhdGlzdGljc1xuICAgKi9cbiAgc3RhdHMoKTogUnV2TExNU3RhdHMge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgY29uc3QgcyA9IHRoaXMubmF0aXZlLnN0YXRzKCk7XG4gICAgICAvLyBNYXAgbmF0aXZlIHN0YXRzIChzbmFrZV9jYXNlKSB0byBUeXBlU2NyaXB0IGludGVyZmFjZSAoY2FtZWxDYXNlKVxuICAgICAgLy8gSGFuZGxlIGJvdGggb2xkIGFuZCBuZXcgZmllbGQgbmFtZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsUXVlcmllczogKHMgYXMgYW55KS50b3RhbFF1ZXJpZXMgPz8gcy50b3RhbF9xdWVyaWVzID8/IDAsXG4gICAgICAgIG1lbW9yeU5vZGVzOiAocyBhcyBhbnkpLm1lbW9yeU5vZGVzID8/IHMubWVtb3J5X25vZGVzID8/IDAsXG4gICAgICAgIHBhdHRlcm5zTGVhcm5lZDpcbiAgICAgICAgICAocyBhcyBhbnkpLnRyYWluaW5nU3RlcHMgPz9cbiAgICAgICAgICBzLnBhdHRlcm5zX2xlYXJuZWQgPz9cbiAgICAgICAgICAocyBhcyBhbnkpLnRyYWluaW5nX3N0ZXBzID8/XG4gICAgICAgICAgMCxcbiAgICAgICAgYXZnTGF0ZW5jeU1zOiAocyBhcyBhbnkpLmF2Z0xhdGVuY3lNcyA/PyBzLmF2Z19sYXRlbmN5X21zID8/IDAsXG4gICAgICAgIGNhY2hlSGl0UmF0ZTogKHMgYXMgYW55KS5jYWNoZUhpdFJhdGUgPz8gcy5jYWNoZV9oaXRfcmF0ZSA/PyAwLFxuICAgICAgICByb3V0ZXJBY2N1cmFjeTogKHMgYXMgYW55KS5yb3V0ZXJBY2N1cmFjeSA/PyBzLnJvdXRlcl9hY2N1cmFjeSA/PyAwLjUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsUXVlcmllczogdGhpcy5mYWxsYmFja1N0YXRlLnF1ZXJ5Q291bnQsXG4gICAgICBtZW1vcnlOb2RlczogdGhpcy5mYWxsYmFja1N0YXRlLm1lbW9yeS5zaXplLFxuICAgICAgcGF0dGVybnNMZWFybmVkOiAwLFxuICAgICAgYXZnTGF0ZW5jeU1zOiAxLjAsXG4gICAgICBjYWNoZUhpdFJhdGU6IDAuMCxcbiAgICAgIHJvdXRlckFjY3VyYWN5OiAwLjUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSByb3V0ZXIgbGVhcm5pbmcgY3ljbGVcbiAgICovXG4gIGZvcmNlTGVhcm4oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5mb3JjZUxlYXJuKCk7XG4gICAgfVxuICAgIHJldHVybiAnTGVhcm5pbmcgbm90IGF2YWlsYWJsZSBpbiBmYWxsYmFjayBtb2RlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW1iZWRkaW5nIGZvciB0ZXh0XG4gICAqL1xuICBlbWJlZCh0ZXh0OiBzdHJpbmcpOiBFbWJlZGRpbmcge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmVtYmVkKHRleHQpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIC0gc2ltcGxlIGhhc2gtYmFzZWQgZW1iZWRkaW5nXG4gICAgY29uc3QgZGltID0gdGhpcy5jb25maWcuZW1iZWRkaW5nRGltID8/IDc2ODtcbiAgICBjb25zdCBlbWJlZGRpbmcgPSBuZXcgQXJyYXkoZGltKS5maWxsKDApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpZHggPSAodGV4dC5jaGFyQ29kZUF0KGkpICogKGkgKyAxKSkgJSBkaW07XG4gICAgICBlbWJlZGRpbmdbaWR4XSArPSAwLjE7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplXG4gICAgY29uc3Qgbm9ybSA9IE1hdGguc3FydChlbWJlZGRpbmcucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHggKiB4LCAwKSkgfHwgMTtcbiAgICByZXR1cm4gZW1iZWRkaW5nLm1hcCh4ID0+IHggLyBub3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gdGV4dHNcbiAgICovXG4gIHNpbWlsYXJpdHkodGV4dDE6IHN0cmluZywgdGV4dDI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICAvLyBmMzIgYWNjdW11bGF0aW9uIGNhbiBsYW5kIGp1c3Qgb3V0c2lkZSB0aGUgbWF0aGVtYXRpY2FsIHJhbmdlIOKAlCBhblxuICAgICAgLy8gaWRlbnRpY2FsIHBhaXIgbWVhc3VyZXMgMS4wMDAwMDAxIOKAlCB3aGljaCB0dXJucyBNYXRoLmFjb3Moc2ltKSBpbnRvXG4gICAgICAvLyBOYU4gZG93bnN0cmVhbS4gQ29zaW5lIHNpbWlsYXJpdHkgaXMgZGVmaW5lZCBvbiBbLTEsIDFdLCBzbyBjbGFtcC5cbiAgICAgIGNvbnN0IHJhdyA9IHRoaXMubmF0aXZlLnNpbWlsYXJpdHkodGV4dDEsIHRleHQyKTtcbiAgICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgtMSwgcmF3KSk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgLSBjb3NpbmUgc2ltaWxhcml0eVxuICAgIGNvbnN0IGVtYjEgPSB0aGlzLmVtYmVkKHRleHQxKTtcbiAgICBjb25zdCBlbWIyID0gdGhpcy5lbWJlZCh0ZXh0Mik7XG5cbiAgICBsZXQgZG90ID0gMDtcbiAgICBsZXQgbm9ybTEgPSAwO1xuICAgIGxldCBub3JtMiA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVtYjEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRvdCArPSBlbWIxW2ldICogZW1iMltpXTtcbiAgICAgIG5vcm0xICs9IGVtYjFbaV0gKiBlbWIxW2ldO1xuICAgICAgbm9ybTIgKz0gZW1iMltpXSAqIGVtYjJbaV07XG4gICAgfVxuXG4gICAgY29uc3QgZGVub20gPSBNYXRoLnNxcnQobm9ybTEpICogTWF0aC5zcXJ0KG5vcm0yKTtcbiAgICBjb25zdCBzaW1pbGFyaXR5ID0gZGVub20gPiAwID8gZG90IC8gZGVub20gOiAwO1xuICAgIC8vIENsYW1wIHRvIFswLCAxXSB0byBoYW5kbGUgZmxvYXRpbmcgcG9pbnQgZXJyb3JzXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHNpbWlsYXJpdHkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBTSU1EIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgaGFzU2ltZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5oYXNTaW1kKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgU0lNRCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIHNpbWRDYXBhYmlsaXRpZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLnNpbWRDYXBhYmlsaXRpZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIFsnU2NhbGFyIChmYWxsYmFjayknXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBxdWVyeSBtdWx0aXBsZSBwcm9tcHRzXG4gICAqL1xuICBiYXRjaFF1ZXJ5KHJlcXVlc3Q6IEJhdGNoUXVlcnlSZXF1ZXN0KTogQmF0Y2hRdWVyeVJlc3BvbnNlIHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVxdWVzdC5xdWVyaWVzLm1hcChxID0+IHRoaXMucXVlcnkocSwgcmVxdWVzdC5jb25maWcpKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzcG9uc2VzLFxuICAgICAgdG90YWxMYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG5hdGl2ZSBtb2R1bGUgaXMgbG9hZGVkXG4gICAqL1xuICBpc05hdGl2ZUxvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYXRpdmUgIT09IG51bGw7XG4gIH1cbn1cbiJdfQ==
548
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQXFCSCxPQUFPLEVBQ0wsZUFBZSxHQU1oQixNQUFNLFVBQVUsQ0FBQztBQUVsQjs7R0FFRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQXFCO0lBQzNDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFOUIsT0FBTztRQUNMLGFBQWEsRUFBRSxNQUFNLENBQUMsWUFBWTtRQUNsQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsZUFBZTtRQUN6QyxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7UUFDcEIsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLGtCQUFrQjtRQUMvQyxjQUFjLEVBQUUsTUFBTSxDQUFDLFlBQVk7UUFDbkMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGVBQWU7UUFDeEMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtRQUMxQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVM7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsaUJBQWlCLENBQUMsTUFBeUI7SUFDbEQsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU5QiwwRUFBMEU7SUFDMUUsT0FBTztRQUNMLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztRQUMzQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7UUFDL0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO1FBQzNDLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtRQUNuQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7S0FDbEIsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLENBQXlC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RUFBRSxHQUFHLEtBQUs7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUnV2TExNIEVuZ2luZSAtIE1haW4gb3JjaGVzdHJhdG9yIGZvciBzZWxmLWxlYXJuaW5nIExMTVxuICovXG5cbmltcG9ydCB7XG4gIFJ1dkxMTUNvbmZpZyxcbiAgR2VuZXJhdGlvbkNvbmZpZyxcbiAgUXVlcnlSZXNwb25zZSxcbiAgUm91dGluZ0RlY2lzaW9uLFxuICBNZW1vcnlSZXN1bHQsXG4gIE1lbW9yeUlkLFxuICBSdXZMTE1TdGF0cyxcbiAgRmVlZGJhY2ssXG4gIEVtYmVkZGluZyxcbiAgQmF0Y2hRdWVyeVJlcXVlc3QsXG4gIEJhdGNoUXVlcnlSZXNwb25zZSxcbiAgQ2hhdE1lc3NhZ2UsXG4gIEZpbmlzaFJlYXNvbixcbiAgR2VuZXJhdGlvblJlc3VsdCxcbiAgTG9hZE1vZGVsT3B0aW9ucyxcbiAgTG9hZGVkTW9kZWxJbmZvLFxufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHtcbiAgZ2V0TmF0aXZlTW9kdWxlLFxuICBOYXRpdmVFbmdpbmUsXG4gIE5hdGl2ZUNvbmZpZyxcbiAgTmF0aXZlR2VuQ29uZmlnLFxuICBOYXRpdmVHZW5lcmF0aW9uUmVzdWx0LFxuICBOYXRpdmVNb2RlbEluZm8sXG59IGZyb20gJy4vbmF0aXZlJztcblxuLyoqXG4gKiBDb252ZXJ0IEpTIGNvbmZpZyB0byBuYXRpdmUgY29uZmlnIGZvcm1hdFxuICovXG5mdW5jdGlvbiB0b05hdGl2ZUNvbmZpZyhjb25maWc/OiBSdXZMTE1Db25maWcpOiBOYXRpdmVDb25maWcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIGVtYmVkZGluZ19kaW06IGNvbmZpZy5lbWJlZGRpbmdEaW0sXG4gICAgcm91dGVyX2hpZGRlbl9kaW06IGNvbmZpZy5yb3V0ZXJIaWRkZW5EaW0sXG4gICAgaG5zd19tOiBjb25maWcuaG5zd00sXG4gICAgaG5zd19lZl9jb25zdHJ1Y3Rpb246IGNvbmZpZy5obnN3RWZDb25zdHJ1Y3Rpb24sXG4gICAgaG5zd19lZl9zZWFyY2g6IGNvbmZpZy5obnN3RWZTZWFyY2gsXG4gICAgbGVhcm5pbmdfZW5hYmxlZDogY29uZmlnLmxlYXJuaW5nRW5hYmxlZCxcbiAgICBxdWFsaXR5X3RocmVzaG9sZDogY29uZmlnLnF1YWxpdHlUaHJlc2hvbGQsXG4gICAgZXdjX2xhbWJkYTogY29uZmlnLmV3Y0xhbWJkYSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IEpTIGdlbmVyYXRpb24gY29uZmlnIHRvIG5hdGl2ZSBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gdG9OYXRpdmVHZW5Db25maWcoY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZyk6IE5hdGl2ZUdlbkNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIGNhbWVsQ2FzZTogbmFwaS1ycyBpZ25vcmVzIHNuYWtlX2Nhc2Uga2V5cyBvbiBgI1tuYXBpKG9iamVjdCldYCBpbnB1dHMuXG4gIHJldHVybiB7XG4gICAgbWF4VG9rZW5zOiBjb25maWcubWF4VG9rZW5zLFxuICAgIHRlbXBlcmF0dXJlOiBjb25maWcudGVtcGVyYXR1cmUsXG4gICAgdG9wUDogY29uZmlnLnRvcFAsXG4gICAgdG9wSzogY29uZmlnLnRvcEssXG4gICAgcmVwZXRpdGlvblBlbmFsdHk6IGNvbmZpZy5yZXBldGl0aW9uUGVuYWx0eSxcbiAgICBzdG9wU2VxdWVuY2VzOiBjb25maWcuc3RvcFNlcXVlbmNlcyxcbiAgICBzZWVkOiBjb25maWcuc2VlZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9HZW5lcmF0aW9uUmVzdWx0KHI6IE5hdGl2ZUdlbmVyYXRpb25SZXN1bHQpOiBHZW5lcmF0aW9uUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiByLnRleHQsXG4gICAgcHJvbXB0VG9rZW5zOiByLnByb21wdFRva2VucyxcbiAgICBjb21wbGV0aW9uVG9rZW5zOiByLmNvbXBsZXRpb25Ub2tlbnMsXG4gICAgZmluaXNoUmVhc29uOiByLmZpbmlzaFJlYXNvbiBhcyBGaW5pc2hSZWFzb24sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvTW9kZWxJbmZvKGk6IE5hdGl2ZU1vZGVsSW5mbyk6IExvYWRlZE1vZGVsSW5mbyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogaS5uYW1lLFxuICAgIGFyY2hpdGVjdHVyZTogaS5hcmNoaXRlY3R1cmUsXG4gICAgbnVtUGFyYW1ldGVyczogaS5udW1QYXJhbWV0ZXJzLFxuICAgIHZvY2FiU2l6ZTogaS52b2NhYlNpemUsXG4gICAgaGlkZGVuU2l6ZTogaS5oaWRkZW5TaXplLFxuICAgIG51bUxheWVyczogaS5udW1MYXllcnMsXG4gICAgbWF4Q29udGV4dExlbmd0aDogaS5tYXhDb250ZXh0TGVuZ3RoLFxuICAgIHF1YW50aXphdGlvbjogaS5xdWFudGl6YXRpb24gPz8gbnVsbCxcbiAgICBtZW1vcnlVc2FnZUJ5dGVzOiBpLm1lbW9yeVVzYWdlQnl0ZXMsXG4gICAgY2hhdFRlbXBsYXRlOiBpLmNoYXRUZW1wbGF0ZSA/PyBudWxsLFxuICB9O1xufVxuXG5jb25zdCB3YXJuZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqIFdhcm4gb25jZSBwZXIgcHJvY2VzcyAob3IgdGhyb3cgd2hlbiBgc3RyaWN0YCkuICovXG5mdW5jdGlvbiBub3RpY2UoY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIHN0cmljdDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoc3RyaWN0KSB0aHJvdyBjb2RlZEVycm9yKGNvZGUsIG1lc3NhZ2UpO1xuICBpZiAod2FybmVkLmhhcyhjb2RlKSkgcmV0dXJuO1xuICB3YXJuZWQuYWRkKGNvZGUpO1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIHtcbiAgICBwcm9jZXNzPzogeyBlbWl0V2FybmluZz86IChtOiBzdHJpbmcsIG8/OiB7IGNvZGU/OiBzdHJpbmcgfSkgPT4gdm9pZCB9O1xuICAgIGNvbnNvbGU/OiB7IHdhcm4/OiAobTogc3RyaW5nKSA9PiB2b2lkIH07XG4gIH07XG4gIGlmICh0eXBlb2YgZy5wcm9jZXNzPy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJykgZy5wcm9jZXNzLmVtaXRXYXJuaW5nKG1lc3NhZ2UsIHsgY29kZSB9KTtcbiAgZWxzZSBnLmNvbnNvbGU/Lndhcm4/LihgJHtjb2RlfTogJHttZXNzYWdlfWApO1xufVxuXG4vKiogQW4gRXJyb3Igd2hvc2UgbWVzc2FnZSBzdGFydHMgd2l0aCwgYW5kIHdob3NlIGBjb2RlYCBpcywgYGNvZGVgLiAqL1xuZnVuY3Rpb24gY29kZWRFcnJvcihjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IEVycm9yICYgeyBjb2RlOiBzdHJpbmcgfSB7XG4gIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgJHtjb2RlfTogJHttZXNzYWdlfWApIGFzIEVycm9yICYgeyBjb2RlOiBzdHJpbmcgfTtcbiAgZXJyLmNvZGUgPSBjb2RlO1xuICByZXR1cm4gZXJyO1xufVxuXG4vKipcbiAqIENhbGwgaW50byB0aGUgbmF0aXZlIGVuZ2luZSwgZ2l2aW5nIGl0cyBlcnJvcnMgdGhlIHNhbWUgYGNvZGVgIGFzIHRoZVxuICogd3JhcHBlcidzIG93bjogbmF0aXZlIG1lc3NhZ2VzIHN0YXJ0IHdpdGggYFJVVkxMTV88Q09ERT46YCwgYnV0IG5hcGktcnNcbiAqIHNldHMgYGNvZGVgIHRvIGEgZ2VuZXJpYyBzdGF0dXMgc3VjaCBhcyBgR2VuZXJpY0ZhaWx1cmVgLlxuICovXG5mdW5jdGlvbiBjYWxsTmF0aXZlPFQ+KGY6ICgpID0+IFQpOiBUIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSAvXihSVVZMTE1fW0EtWl9dKyk6Ly5leGVjKGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6ICcnKTtcbiAgICBpZiAobWF0Y2gpIChlIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlID0gbWF0Y2hbMV07XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwbGF0Zm9ybUtleSgpOiBzdHJpbmcge1xuICBjb25zdCBwID0gKGdsb2JhbFRoaXMgYXMgeyBwcm9jZXNzPzogeyBwbGF0Zm9ybT86IHN0cmluZzsgYXJjaD86IHN0cmluZyB9IH0pLnByb2Nlc3M7XG4gIHJldHVybiBgJHtwPy5wbGF0Zm9ybSA/PyAndW5rbm93bid9LSR7cD8uYXJjaCA/PyAndW5rbm93bid9YDtcbn1cblxuZnVuY3Rpb24gZW52QWxsb3dzUGxhY2Vob2xkZXIoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHAgPSAoZ2xvYmFsVGhpcyBhcyB7IHByb2Nlc3M/OiB7IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5wcm9jZXNzO1xuICByZXR1cm4gcD8uZW52Py5SVVZMTE1fQUxMT1dfTU9DSyA9PT0gJzEnO1xufVxuXG4vKiogUmV0dXJuZWQgYnkgZ2VuZXJhdGUoKS9xdWVyeSgpIG9ubHkgd2l0aCBgYWxsb3dQbGFjZWhvbGRlcmAgLyBgUlVWTExNX0FMTE9XX01PQ0s9MWAuICovXG5leHBvcnQgY29uc3QgUExBQ0VIT0xERVJfVEVYVCA9XG4gICdbUnV2TExNIHBsYWNlaG9sZGVyOiBubyBsYW5ndWFnZSBtb2RlbCBpcyBsb2FkZWQ7IHRoaXMgdGV4dCBpcyBub3QgbW9kZWwgb3V0cHV0XSc7XG5cbi8qKlxuICogUnV2TExNIC0gU2VsZi1sZWFybmluZyBMTE0gb3JjaGVzdHJhdG9yXG4gKlxuICogQ29tYmluZXMgU09OQSBhZGFwdGl2ZSBsZWFybmluZyB3aXRoIEhOU1cgbWVtb3J5LCBGYXN0R1JOTiByb3V0aW5nLCBhbmRcbiAqIEdHVUYgaW5mZXJlbmNlIHRocm91Z2ggdGhlIG5hdGl2ZSBjYW5kbGUgYmFja2VuZC5cbiAqXG4gKiBUZXh0IGNvbWVzIG9ubHkgZnJvbSBhIG1vZGVsIGxvYWRlZCB3aXRoIGBsb2FkTW9kZWwoKWAgKG9yIHRoZSBgbW9kZWxQYXRoYFxuICogb3B0aW9uKS4gV2l0aG91dCBvbmUsIGBnZW5lcmF0ZSgpYCwgYHF1ZXJ5KClgLCBgY2hhdCgpYCBhbmRcbiAqIGBnZW5lcmF0ZURldGFpbGVkKClgIHRocm93IGBSVVZMTE1fTk9fTEFOR1VBR0VfTU9ERUxgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBSdXZMTE0gfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcbiAqXG4gKiBjb25zdCBsbG0gPSBuZXcgUnV2TExNKCk7XG4gKiBsbG0ubG9hZE1vZGVsKCcuL3F3ZW4yLjUtMC41Yi1pbnN0cnVjdC1xNF9rX20uZ2d1ZicpO1xuICpcbiAqIGNvbnN0IG91dCA9IGxsbS5jaGF0KFt7IHJvbGU6ICd1c2VyJywgY29udGVudDogJ1doYXQgaXMgbWFjaGluZSBsZWFybmluZz8nIH1dLCB7XG4gKiAgIG1heFRva2VuczogMTI4LFxuICogfSk7XG4gKiBjb25zb2xlLmxvZyhvdXQudGV4dCwgb3V0LmZpbmlzaFJlYXNvbiwgb3V0LmNvbXBsZXRpb25Ub2tlbnMpO1xuICpcbiAqIC8vIFJvdXRlZCBxdWVyeSwgYW5zd2VyZWQgYnkgdGhlIGxvYWRlZCBtb2RlbFxuICogY29uc3QgcmVzcG9uc2UgPSBsbG0ucXVlcnkoJ1doYXQgaXMgbWFjaGluZSBsZWFybmluZz8nKTtcbiAqIGxsbS5mZWVkYmFjayh7IHJlcXVlc3RJZDogcmVzcG9uc2UucmVxdWVzdElkLCByYXRpbmc6IDUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1dkxMTSB7XG4gIHByaXZhdGUgbmF0aXZlOiBOYXRpdmVFbmdpbmUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBuYXRpdmVWZXJzaW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25maWc6IFJ1dkxMTUNvbmZpZztcbiAgcHJpdmF0ZSBhbGxvd1BsYWNlaG9sZGVyOiBib29sZWFuO1xuXG4gIC8vIEZhbGxiYWNrIHN0YXRlIGZvciB3aGVuIG5hdGl2ZSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZVxuICBwcml2YXRlIGZhbGxiYWNrU3RhdGUgPSB7XG4gICAgbWVtb3J5OiBuZXcgTWFwPG51bWJlciwgeyBjb250ZW50OiBzdHJpbmc7IGVtYmVkZGluZzogbnVtYmVyW107IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PigpLFxuICAgIG5leHRJZDogMSxcbiAgICBxdWVyeUNvdW50OiAwLFxuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgUnV2TExNIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc/OiBSdXZMTE1Db25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyA/PyB7fTtcbiAgICB0aGlzLmFsbG93UGxhY2Vob2xkZXIgPSB0aGlzLmNvbmZpZy5hbGxvd1BsYWNlaG9sZGVyID09PSB0cnVlIHx8IGVudkFsbG93c1BsYWNlaG9sZGVyKCk7XG4gICAgY29uc3QgZXh0cmEgPSB0aGlzLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoZXh0cmEuYmFja2VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBub3RpY2UoXG4gICAgICAgICdSVVZMTE1fVU5TVVBQT1JURURfT1BUSU9OJyxcbiAgICAgICAgJ2BiYWNrZW5kYCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEBydXZlY3Rvci9ydXZsbG0gYW5kIGlzIGlnbm9yZWQ6IG1vZGVscyBsb2FkZWQgd2l0aCAnICtcbiAgICAgICAgICAnbG9hZE1vZGVsKCkgcnVuIG9uIHRoZSBidWlsdC1pbiBjYW5kbGUgYmFja2VuZC4nLFxuICAgICAgICB0aGlzLmNvbmZpZy5zdHJpY3QsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9IGdldE5hdGl2ZU1vZHVsZSgpO1xuICAgIGlmIChtb2QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMubmF0aXZlID0gbmV3IG1vZC5SdXZMTE1FbmdpbmUodG9OYXRpdmVDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHRoaXMubmF0aXZlVmVyc2lvbiA9IG1vZC52ZXJzaW9uKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU2lsZW50bHkgZmFsbCBiYWNrIHRvIEpTIGltcGxlbWVudGF0aW9uXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm1vZGVsUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvYWRNb2RlbCh0aGlzLmNvbmZpZy5tb2RlbFBhdGgsIHRoaXMuY29uZmlnLm1vZGVsT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5hdGl2ZSBiaW5hcnkgY2FuIGxvYWQgYW5kIHJ1biBhIGxhbmd1YWdlIG1vZGVsLiBGYWxzZVxuICAgKiB3aXRob3V0IGEgbmF0aXZlIGJpbmFyeSwgZm9yIGJpbmFyaWVzIHRoYXQgcHJlZGF0ZSBgbG9hZE1vZGVsYCAodGhlIDIuMC54XG4gICAqIGBAcnV2ZWN0b3IvcnV2bGxtLTxwbGF0Zm9ybT5gIHBhY2thZ2VzKSwgYW5kIGZvciBiaW5hcmllcyBidWlsdCB3aXRob3V0XG4gICAqIHRoZSBgY2FuZGxlYCBpbmZlcmVuY2UgYmFja2VuZC5cbiAgICovXG4gIHN1cHBvcnRzTW9kZWxMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5hdGl2ZSA9IHRoaXMubmF0aXZlO1xuICAgIGlmICh0eXBlb2YgbmF0aXZlPy5sb2FkTW9kZWwgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAvLyBCdWlsZHMgdGhhdCBwcmVkYXRlIHRoaXMgcHJvYmUgYWxsIGhhZCB0aGUgYmFja2VuZCAodGhleSB3ZXJlIGxvY2FsXG4gICAgLy8gYG5wbSBydW4gYnVpbGQ6bmF0aXZlYCBidWlsZHMsIHdoaWNoIGVuYWJsZSBgY2FuZGxlYCkuXG4gICAgcmV0dXJuIHR5cGVvZiBuYXRpdmUuc3VwcG9ydHNNb2RlbExvYWRpbmcgPT09ICdmdW5jdGlvbicgPyBuYXRpdmUuc3VwcG9ydHNNb2RlbExvYWRpbmcoKSA6IHRydWU7XG4gIH1cblxuICAvKiogRXJyb3IgZm9yIGEgYmluYXJ5IHRoYXQgaGFzIGBsb2FkTW9kZWxgIGJ1dCBubyBpbmZlcmVuY2UgYmFja2VuZC4gKi9cbiAgcHJpdmF0ZSBub0JhY2tlbmRFcnJvcigpOiBFcnJvciB7XG4gICAgcmV0dXJuIGNvZGVkRXJyb3IoXG4gICAgICAnUlVWTExNX05PX0lORkVSRU5DRV9CQUNLRU5EJyxcbiAgICAgIGB0aGUgaW5zdGFsbGVkIG5hdGl2ZSBiaW5hcnkgKHZlcnNpb24gJHt0aGlzLm5hdGl2ZVZlcnNpb24gPz8gJ3Vua25vd24nfSkgd2FzIGJ1aWx0IGAgK1xuICAgICAgICAnd2l0aG91dCB0aGUgYGNhbmRsZWAgaW5mZXJlbmNlIGJhY2tlbmQgYW5kIGNhbm5vdCBsb2FkIG1vZGVscy4gUmVidWlsZCBpdCB3aXRoICcgK1xuICAgICAgICAnYG5wbSBydW4gYnVpbGQ6bmF0aXZlYCAod2hpY2ggZW5hYmxlcyBgY2FuZGxlYCkgYW5kIHNldCBSVVZMTE1fTkFUSVZFX1BBVEggdG8gaXQsICcgK1xuICAgICAgICAnb3IgdXNlIHRoZSBydXZsbG0gQ0xJIChgcnV2bGxtIHNlcnZlIDxtb2RlbD5gKS4nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIEdHVUYgbW9kZWwgKG9yIGEgZGlyZWN0b3J5IGhvbGRpbmcgb25lKSBmb3IgYGdlbmVyYXRlKClgLFxuICAgKiBgY2hhdCgpYCBhbmQgYHF1ZXJ5KClgLiBTdXBwb3J0ZWQgR0dVRiBhcmNoaXRlY3R1cmVzOiBsbGFtYSwgbWlzdHJhbCxcbiAgICogcXdlbjIsIHF3ZW4zOyBvdGhlcnMgZmFpbCB3aXRoIGFuIGVycm9yIG5hbWluZyB0aGUgYXJjaGl0ZWN0dXJlLiBUaGVcbiAgICogdG9rZW5pemVyIGNvbWVzIGZyb20gYSBgdG9rZW5pemVyLmpzb25gIGJlc2lkZSB0aGUgZmlsZSwgZWxzZSBmcm9tIHRoZVxuICAgKiBHR1VGIGl0c2VsZi4gUmVwbGFjZXMgYW55IGxvYWRlZCBtb2RlbDsgaWYgbG9hZGluZyBmYWlscywgbm8gbW9kZWwgaXNcbiAgICogbG9hZGVkLiBTeW5jaHJvbm91czogYmxvY2tzIHRoZSBldmVudCBsb29wIHdoaWxlIHRoZSB3ZWlnaHRzIGxvYWQuXG4gICAqXG4gICAqIEB0aHJvd3MgYFJVVkxMTV9OQVRJVkVfVU5BVkFJTEFCTEVgIHdpdGhvdXQgYSBuYXRpdmUgYmluYXJ5LFxuICAgKiAgIGBSVVZMTE1fTkFUSVZFX1RPT19PTERgIHdoZW4gdGhlIGJpbmFyeSBwcmVkYXRlcyBtb2RlbCBsb2FkaW5nLFxuICAgKiAgIGBSVVZMTE1fTk9fSU5GRVJFTkNFX0JBQ0tFTkRgIHdoZW4gaXQgd2FzIGJ1aWx0IHdpdGhvdXQgYGNhbmRsZWAsXG4gICAqICAgYFJVVkxMTV9NT0RFTF9OT1RfRk9VTkRgIC8gYFJVVkxMTV9NT0RFTF9MT0FEX0ZBSUxFRGAgZnJvbSB0aGUgYmFja2VuZC5cbiAgICovXG4gIGxvYWRNb2RlbChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBMb2FkTW9kZWxPcHRpb25zKTogTG9hZGVkTW9kZWxJbmZvIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnIHx8IHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdsb2FkTW9kZWw6IHBhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm5hdGl2ZSkge1xuICAgICAgdGhyb3cgY29kZWRFcnJvcihcbiAgICAgICAgJ1JVVkxMTV9OQVRJVkVfVU5BVkFJTEFCTEUnLFxuICAgICAgICBgbm8gbmF0aXZlIFJ1dkxMTSBiaW5hcnkgY291bGQgYmUgbG9hZGVkIGZvciAke3BsYXRmb3JtS2V5KCl9LCBzbyBtb2RlbHMgY2Fubm90IGJlIGAgK1xuICAgICAgICAgICdsb2FkZWQuIEluc3RhbGwgdGhlIG1hdGNoaW5nIEBydXZlY3Rvci9ydXZsbG0tPHBsYXRmb3JtPiBwYWNrYWdlLCBvciBidWlsZCBvbmUgJyArXG4gICAgICAgICAgJyhgbnBtIHJ1biBidWlsZDpuYXRpdmVgKSBhbmQgc2V0IFJVVkxMTV9OQVRJVkVfUEFUSCB0byBpdC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLm5hdGl2ZS5sb2FkTW9kZWwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGNvZGVkRXJyb3IoXG4gICAgICAgICdSVVZMTE1fTkFUSVZFX1RPT19PTEQnLFxuICAgICAgICBgdGhlIGluc3RhbGxlZCBuYXRpdmUgYmluYXJ5ICh2ZXJzaW9uICR7dGhpcy5uYXRpdmVWZXJzaW9uID8/ICd1bmtub3duJ30pIGNhbm5vdCBsb2FkIGAgK1xuICAgICAgICAgICdtb2RlbHM6IGl0IHByZWRhdGVzIGxvYWRNb2RlbCgpLiBUaGUgQHJ1dmVjdG9yL3J1dmxsbS08cGxhdGZvcm0+IDIuMC54IHBhY2thZ2VzIGFyZSAnICtcbiAgICAgICAgICAnc3VjaCBidWlsZHMuIEluc3RhbGwgdGhlIDMueCBwbGF0Zm9ybSBwYWNrYWdlLCBvciBidWlsZCB0aGUgYmluYXJ5IGZyb20gc291cmNlICcgK1xuICAgICAgICAgICcoYG5wbSBydW4gYnVpbGQ6bmF0aXZlYCwgd2hpY2ggZW5hYmxlcyB0aGUgYGNhbmRsZWAgZmVhdHVyZSkgYW5kIHNldCAnICtcbiAgICAgICAgICAnUlVWTExNX05BVElWRV9QQVRIIHRvIGl0LCBvciB1c2UgdGhlIHJ1dmxsbSBDTEkgKGBydXZsbG0gc2VydmUgPG1vZGVsPmApLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3VwcG9ydHNNb2RlbExvYWRpbmcoKSkgdGhyb3cgdGhpcy5ub0JhY2tlbmRFcnJvcigpO1xuICAgIGNvbnN0IG5hdGl2ZSA9IHRoaXMubmF0aXZlO1xuICAgIHJldHVybiB0b01vZGVsSW5mbyhjYWxsTmF0aXZlKCgpID0+IG5hdGl2ZS5sb2FkTW9kZWwhKHBhdGgsIG9wdGlvbnMpKSk7XG4gIH1cblxuICAvKipcbiAgICogVW5sb2FkIHRoZSBsYW5ndWFnZSBtb2RlbCBhbmQgZnJlZSBpdHMgbWVtb3J5XG4gICAqL1xuICB1bmxvYWRNb2RlbCgpOiB2b2lkIHtcbiAgICB0aGlzLm5hdGl2ZT8udW5sb2FkTW9kZWw/LigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBsYW5ndWFnZSBtb2RlbCBpcyBsb2FkZWRcbiAgICovXG4gIGlzTW9kZWxMb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmF0aXZlPy5pc01vZGVsTG9hZGVkPy4oKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbG9hZGVkIGxhbmd1YWdlIG1vZGVsLCBvciBudWxsXG4gICAqL1xuICBtb2RlbEluZm8oKTogTG9hZGVkTW9kZWxJbmZvIHwgbnVsbCB7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMubmF0aXZlPy5tb2RlbEluZm8/LigpO1xuICAgIHJldHVybiBpbmZvID8gdG9Nb2RlbEluZm8oaW5mbykgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIGB0ZXh0YCwgdGhlbiBhbnN3ZXIgaXQgd2l0aCB0aGUgbG9hZGVkIG1vZGVsIChhcyBvbmUgdXNlciBtZXNzYWdlXG4gICAqIHVuZGVyIHRoZSBtb2RlbCdzIGNoYXQgdGVtcGxhdGUpLlxuICAgKlxuICAgKiBAdGhyb3dzIGBSVVZMTE1fTk9fTEFOR1VBR0VfTU9ERUxgIHdoZW4gbm8gbW9kZWwgaXMgbG9hZGVkLCB1bmxlc3NcbiAgICogICBgYWxsb3dQbGFjZWhvbGRlcmAgaXMgc2V0ICh0aGVuIGB0ZXh0YCBpcyBgUExBQ0VIT0xERVJfVEVYVGApLlxuICAgKi9cbiAgcXVlcnkodGV4dDogc3RyaW5nLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKTogUXVlcnlSZXNwb25zZSB7XG4gICAgaWYgKCF0aGlzLmlzTW9kZWxMb2FkZWQoKSkge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyT3JUaHJvdygpO1xuICAgICAgdGhpcy5mYWxsYmFja1N0YXRlLnF1ZXJ5Q291bnQrKztcbiAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5yb3V0ZSh0ZXh0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHQ6IHBsYWNlaG9sZGVyLFxuICAgICAgICBjb25maWRlbmNlOiByb3V0ZS5jb25maWRlbmNlLFxuICAgICAgICBtb2RlbDogcm91dGUubW9kZWwsXG4gICAgICAgIGNvbnRleHRTaXplOiByb3V0ZS5jb250ZXh0U2l6ZSxcbiAgICAgICAgbGF0ZW5jeU1zOiAwLFxuICAgICAgICByZXF1ZXN0SWQ6IGBwbGFjZWhvbGRlci0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgbmF0aXZlID0gdGhpcy5uYXRpdmUhO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxOYXRpdmUoKCkgPT4gbmF0aXZlLnF1ZXJ5KHRleHQsIHRvTmF0aXZlR2VuQ29uZmlnKGNvbmZpZykpKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgICBjb25maWRlbmNlOiByZXN1bHQuY29uZmlkZW5jZSxcbiAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICBjb250ZXh0U2l6ZTogcmVzdWx0LmNvbnRleHRTaXplLFxuICAgICAgbGF0ZW5jeU1zOiByZXN1bHQubGF0ZW5jeU1zLFxuICAgICAgcmVxdWVzdElkOiByZXN1bHQucmVxdWVzdElkLFxuICAgICAgcHJvbXB0VG9rZW5zOiByZXN1bHQucHJvbXB0VG9rZW5zLFxuICAgICAgY29tcGxldGlvblRva2VuczogcmVzdWx0LmNvbXBsZXRpb25Ub2tlbnMsXG4gICAgICBmaW5pc2hSZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24gYXMgRmluaXNoUmVhc29uIHwgdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udGludWUgYHByb21wdGAgdmVyYmF0aW0gd2l0aCB0aGUgbG9hZGVkIG1vZGVsIChubyBjaGF0IHRlbXBsYXRlOyB1c2VcbiAgICogYGNoYXQoKWAgZm9yIGluc3RydWN0aW9uLXR1bmVkIG1vZGVscykuIFJldHVybnMgdGhlIGdlbmVyYXRlZCB0ZXh0LlxuICAgKlxuICAgKiBAdGhyb3dzIGBSVVZMTE1fTk9fTEFOR1VBR0VfTU9ERUxgIHdoZW4gbm8gbW9kZWwgaXMgbG9hZGVkLCB1bmxlc3NcbiAgICogICBgYWxsb3dQbGFjZWhvbGRlcmAgaXMgc2V0ICh0aGVuIGl0IHJldHVybnMgYFBMQUNFSE9MREVSX1RFWFRgKS5cbiAgICovXG4gIGdlbmVyYXRlKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaXNNb2RlbExvYWRlZCgpKSByZXR1cm4gdGhpcy5wbGFjZWhvbGRlck9yVGhyb3coKTtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURldGFpbGVkKHByb21wdCwgY29uZmlnKS50ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgYGdlbmVyYXRlKClgLCB3aXRoIHRva2VuIGNvdW50cyAoZnJvbSB0aGUgbW9kZWwncyB0b2tlbml6ZXIpIGFuZFxuICAgKiB0aGUgZmluaXNoIHJlYXNvbi4gQWx3YXlzIHRocm93cyBgUlVWTExNX05PX0xBTkdVQUdFX01PREVMYCB3aXRob3V0IGFcbiAgICogbG9hZGVkIG1vZGVsLlxuICAgKi9cbiAgZ2VuZXJhdGVEZXRhaWxlZChwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZyk6IEdlbmVyYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IG5hdGl2ZSA9IHRoaXMucmVxdWlyZU1vZGVsKCk7XG4gICAgcmV0dXJuIHRvR2VuZXJhdGlvblJlc3VsdChcbiAgICAgIGNhbGxOYXRpdmUoKCkgPT4gbmF0aXZlLmdlbmVyYXRlKHByb21wdCwgdG9OYXRpdmVHZW5Db25maWcoY29uZmlnKSkpIGFzIE5hdGl2ZUdlbmVyYXRpb25SZXN1bHQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIGxvYWRlZCBtb2RlbCBvbiBhIGNvbnZlcnNhdGlvbiwgZm9ybWF0dGVkIHdpdGggdGhlIG1vZGVsJ3MgY2hhdFxuICAgKiB0ZW1wbGF0ZSAoQ2hhdE1MIGZvciBRd2VuLCBMbGFtYSAzIC8gTWlzdHJhbCBmb3JtYXRzIGZvciB0aG9zZSBtb2RlbHMpLlxuICAgKiBBbHdheXMgdGhyb3dzIGBSVVZMTE1fTk9fTEFOR1VBR0VfTU9ERUxgIHdpdGhvdXQgYSBsb2FkZWQgbW9kZWwuXG4gICAqL1xuICBjaGF0KG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKTogR2VuZXJhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgbmF0aXZlID0gdGhpcy5yZXF1aXJlTW9kZWwoKTtcbiAgICByZXR1cm4gdG9HZW5lcmF0aW9uUmVzdWx0KGNhbGxOYXRpdmUoKCkgPT4gbmF0aXZlLmNoYXQhKG1lc3NhZ2VzLCB0b05hdGl2ZUdlbkNvbmZpZyhjb25maWcpKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1aXJlTW9kZWwoKTogTmF0aXZlRW5naW5lIHtcbiAgICBpZiAoIXRoaXMuaXNNb2RlbExvYWRlZCgpKSB0aHJvdyB0aGlzLm5vTW9kZWxFcnJvcigpO1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZSE7XG4gIH1cblxuICBwcml2YXRlIG5vTW9kZWxFcnJvcigpOiBFcnJvciB7XG4gICAgbGV0IGZpeDogc3RyaW5nO1xuICAgIGlmICghdGhpcy5uYXRpdmUpIHtcbiAgICAgIGZpeCA9XG4gICAgICAgIGBubyBuYXRpdmUgUnV2TExNIGJpbmFyeSBpcyBhdmFpbGFibGUgZm9yICR7cGxhdGZvcm1LZXkoKX0sIHNvIG5vIG1vZGVsIGNhbiBiZSBsb2FkZWQgYCArXG4gICAgICAgICcoc2VlIFJVVkxMTV9OQVRJVkVfVU5BVkFJTEFCTEUgaW4gdGhlIFJFQURNRSknO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubmF0aXZlLmxvYWRNb2RlbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZml4ID1cbiAgICAgICAgYHRoZSBpbnN0YWxsZWQgbmF0aXZlIGJpbmFyeSAodmVyc2lvbiAke3RoaXMubmF0aXZlVmVyc2lvbiA/PyAndW5rbm93bid9KSBjYW5ub3QgbG9hZCBgICtcbiAgICAgICAgJ21vZGVscyAoc2VlIFJVVkxMTV9OQVRJVkVfVE9PX09MRCBpbiB0aGUgUkVBRE1FKSc7XG4gICAgfSBlbHNlIGlmICghdGhpcy5zdXBwb3J0c01vZGVsTG9hZGluZygpKSB7XG4gICAgICBmaXggPVxuICAgICAgICBgdGhlIGluc3RhbGxlZCBuYXRpdmUgYmluYXJ5ICh2ZXJzaW9uICR7dGhpcy5uYXRpdmVWZXJzaW9uID8/ICd1bmtub3duJ30pIHdhcyBidWlsdCBgICtcbiAgICAgICAgJ3dpdGhvdXQgdGhlIGNhbmRsZSBpbmZlcmVuY2UgYmFja2VuZCwgc28gaXQgY2Fubm90IGxvYWQgbW9kZWxzIChzZWUgJyArXG4gICAgICAgICdSVVZMTE1fTk9fSU5GRVJFTkNFX0JBQ0tFTkQgaW4gdGhlIFJFQURNRSknO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaXggPSAnY2FsbCBsb2FkTW9kZWwoPHBhdGggdG8gYSBHR1VGIGZpbGU+KSBmaXJzdCc7XG4gICAgfVxuICAgIHJldHVybiBjb2RlZEVycm9yKFxuICAgICAgJ1JVVkxMTV9OT19MQU5HVUFHRV9NT0RFTCcsXG4gICAgICBgbm8gbGFuZ3VhZ2UgbW9kZWwgaXMgbG9hZGVkLCBzbyB0aGVyZSBpcyBubyBtb2RlbCBvdXRwdXQgdG8gcmV0dXJuOiAke2ZpeH0uIFJvdXRpbmcsIGAgK1xuICAgICAgICAnbWVtb3J5IGFuZCBlbWJlZGRpbmdzIHdvcmsgd2l0aG91dCBhIG1vZGVsLiBGb3IgYW4gSFRUUCBzZXJ2ZXIgdXNlIHRoZSBydXZsbG0gQ0xJICcgK1xuICAgICAgICAnKGBydXZsbG0gc2VydmUgPG1vZGVsPmApLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBUaHJvdyBgUlVWTExNX05PX0xBTkdVQUdFX01PREVMYCwgb3IgcmV0dXJuIHRoZSBsYWJlbGxlZCBwbGFjZWhvbGRlciB3aGVuIG9wdGVkIGluLiAqL1xuICBwcml2YXRlIHBsYWNlaG9sZGVyT3JUaHJvdygpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5hbGxvd1BsYWNlaG9sZGVyKSB0aHJvdyB0aGlzLm5vTW9kZWxFcnJvcigpO1xuICAgIG5vdGljZShcbiAgICAgICdSVVZMTE1fUExBQ0VIT0xERVJfVEVYVCcsXG4gICAgICAnbm8gbGFuZ3VhZ2UgbW9kZWwgaXMgbG9hZGVkOiBnZW5lcmF0ZSgpL3F1ZXJ5KCkgYXJlIHJldHVybmluZyBhIGxhYmVsbGVkIHBsYWNlaG9sZGVyLCAnICtcbiAgICAgICAgJ25vdCBtb2RlbCBvdXRwdXQsIGJlY2F1c2UgYWxsb3dQbGFjZWhvbGRlciAob3IgUlVWTExNX0FMTE9XX01PQ0s9MSkgaXMgc2V0LicsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIHJldHVybiBQTEFDRUhPTERFUl9URVhUO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByb3V0aW5nIGRlY2lzaW9uIGZvciBhIHF1ZXJ5XG4gICAqL1xuICByb3V0ZSh0ZXh0OiBzdHJpbmcpOiBSb3V0aW5nRGVjaXNpb24ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmUucm91dGUodGV4dCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2RlbDogcmVzdWx0Lm1vZGVsIGFzIGFueSxcbiAgICAgICAgY29udGV4dFNpemU6IHJlc3VsdC5jb250ZXh0U2l6ZSA/PyByZXN1bHQuY29udGV4dF9zaXplLFxuICAgICAgICB0ZW1wZXJhdHVyZTogcmVzdWx0LnRlbXBlcmF0dXJlLFxuICAgICAgICB0b3BQOiByZXN1bHQudG9wUCA/PyByZXN1bHQudG9wX3AsXG4gICAgICAgIGNvbmZpZGVuY2U6IHJlc3VsdC5jb25maWRlbmNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFja1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbDogJ003MDAnLFxuICAgICAgY29udGV4dFNpemU6IDUxMixcbiAgICAgIHRlbXBlcmF0dXJlOiAwLjcsXG4gICAgICB0b3BQOiAwLjksXG4gICAgICBjb25maWRlbmNlOiAwLjUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbWVtb3J5IGZvciBzaW1pbGFyIGNvbnRlbnRcbiAgICovXG4gIHNlYXJjaE1lbW9yeSh0ZXh0OiBzdHJpbmcsIGsgPSAxMCk6IE1lbW9yeVJlc3VsdFtdIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLm5hdGl2ZS5zZWFyY2hNZW1vcnkodGV4dCwgayk7XG4gICAgICByZXR1cm4gcmVzdWx0cy5tYXAociA9PiB7XG4gICAgICAgIC8vIFRoZSBuYXRpdmUgc2lkZSByZXBvcnRzIGBkaXN0YW5jZWAgKHNtYWxsZXIgaXMgY2xvc2VyKS4gTWVtb3J5UmVzdWx0XG4gICAgICAgIC8vIGRvY3VtZW50cyBgc2NvcmVgIGFzIGEgc2ltaWxhcml0eSwgc28gY29udmVydCByYXRoZXIgdGhhbiBwYXNzaW5nIGFcbiAgICAgICAgLy8gZGlzdGFuY2UgdGhyb3VnaCB1bmRlciBhIHNpbWlsYXJpdHkncyBuYW1lLiBPbGRlciBidWlsZHMgdGhhdCBhbHJlYWR5XG4gICAgICAgIC8vIGVtaXQgYHNjb3JlYCBhcmUgdXNlZCBhcy1pcy5cbiAgICAgICAgY29uc3QgYW55UiA9IHIgYXMgYW55O1xuICAgICAgICBjb25zdCBzY29yZSA9XG4gICAgICAgICAgdHlwZW9mIGFueVIuc2NvcmUgPT09ICdudW1iZXInXG4gICAgICAgICAgICA/IGFueVIuc2NvcmVcbiAgICAgICAgICAgIDogdHlwZW9mIGFueVIuZGlzdGFuY2UgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgID8gMSAvICgxICsgTWF0aC5tYXgoMCwgYW55Ui5kaXN0YW5jZSkpXG4gICAgICAgICAgICAgIDogMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICBzY29yZSxcbiAgICAgICAgICBjb250ZW50OiByLmNvbnRlbnQsXG4gICAgICAgICAgbWV0YWRhdGE6IEpTT04ucGFyc2Uoci5tZXRhZGF0YSB8fCAne30nKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIC0gc2ltcGxlIHNlYXJjaFxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZmFsbGJhY2tTdGF0ZS5tZW1vcnkuZW50cmllcygpKVxuICAgICAgLnNsaWNlKDAsIGspXG4gICAgICAubWFwKChbaWQsIGRhdGFdKSA9PiAoe1xuICAgICAgICBpZCxcbiAgICAgICAgc2NvcmU6IDAuNSxcbiAgICAgICAgY29udGVudDogZGF0YS5jb250ZW50LFxuICAgICAgICBtZXRhZGF0YTogZGF0YS5tZXRhZGF0YSxcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgY29udGVudCB0byBtZW1vcnlcbiAgICovXG4gIGFkZE1lbW9yeShjb250ZW50OiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBNZW1vcnlJZCB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuYWRkTWVtb3J5KGNvbnRlbnQsIG1ldGFkYXRhID8gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpIDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFja1xuICAgIGNvbnN0IGlkID0gdGhpcy5mYWxsYmFja1N0YXRlLm5leHRJZCsrO1xuICAgIHRoaXMuZmFsbGJhY2tTdGF0ZS5tZW1vcnkuc2V0KGlkLCB7XG4gICAgICBjb250ZW50LFxuICAgICAgZW1iZWRkaW5nOiB0aGlzLmVtYmVkKGNvbnRlbnQpLFxuICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhID8/IHt9LFxuICAgIH0pO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlIGZlZWRiYWNrIGZvciBsZWFybmluZ1xuICAgKi9cbiAgZmVlZGJhY2soZmI6IEZlZWRiYWNrKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZmVlZGJhY2soZmIucmVxdWVzdElkLCBmYi5yYXRpbmcsIGZiLmNvcnJlY3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVuZ2luZSBzdGF0aXN0aWNzXG4gICAqL1xuICBzdGF0cygpOiBSdXZMTE1TdGF0cyB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICBjb25zdCBzID0gdGhpcy5uYXRpdmUuc3RhdHMoKTtcbiAgICAgIC8vIE1hcCBuYXRpdmUgc3RhdHMgKHNuYWtlX2Nhc2UpIHRvIFR5cGVTY3JpcHQgaW50ZXJmYWNlIChjYW1lbENhc2UpXG4gICAgICAvLyBIYW5kbGUgYm90aCBvbGQgYW5kIG5ldyBmaWVsZCBuYW1lcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG90YWxRdWVyaWVzOiAocyBhcyBhbnkpLnRvdGFsUXVlcmllcyA/PyBzLnRvdGFsX3F1ZXJpZXMgPz8gMCxcbiAgICAgICAgbWVtb3J5Tm9kZXM6IChzIGFzIGFueSkubWVtb3J5Tm9kZXMgPz8gcy5tZW1vcnlfbm9kZXMgPz8gMCxcbiAgICAgICAgcGF0dGVybnNMZWFybmVkOlxuICAgICAgICAgIChzIGFzIGFueSkudHJhaW5pbmdTdGVwcyA/P1xuICAgICAgICAgIHMucGF0dGVybnNfbGVhcm5lZCA/P1xuICAgICAgICAgIChzIGFzIGFueSkudHJhaW5pbmdfc3RlcHMgPz9cbiAgICAgICAgICAwLFxuICAgICAgICBhdmdMYXRlbmN5TXM6IChzIGFzIGFueSkuYXZnTGF0ZW5jeU1zID8/IHMuYXZnX2xhdGVuY3lfbXMgPz8gMCxcbiAgICAgICAgY2FjaGVIaXRSYXRlOiAocyBhcyBhbnkpLmNhY2hlSGl0UmF0ZSA/PyBzLmNhY2hlX2hpdF9yYXRlID8/IDAsXG4gICAgICAgIHJvdXRlckFjY3VyYWN5OiAocyBhcyBhbnkpLnJvdXRlckFjY3VyYWN5ID8/IHMucm91dGVyX2FjY3VyYWN5ID8/IDAuNSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2tcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxRdWVyaWVzOiB0aGlzLmZhbGxiYWNrU3RhdGUucXVlcnlDb3VudCxcbiAgICAgIG1lbW9yeU5vZGVzOiB0aGlzLmZhbGxiYWNrU3RhdGUubWVtb3J5LnNpemUsXG4gICAgICBwYXR0ZXJuc0xlYXJuZWQ6IDAsXG4gICAgICBhdmdMYXRlbmN5TXM6IDEuMCxcbiAgICAgIGNhY2hlSGl0UmF0ZTogMC4wLFxuICAgICAgcm91dGVyQWNjdXJhY3k6IDAuNSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIHJvdXRlciBsZWFybmluZyBjeWNsZVxuICAgKi9cbiAgZm9yY2VMZWFybigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmZvcmNlTGVhcm4oKTtcbiAgICB9XG4gICAgcmV0dXJuICdMZWFybmluZyBub3QgYXZhaWxhYmxlIGluIGZhbGxiYWNrIG1vZGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbWJlZGRpbmcgZm9yIHRleHRcbiAgICovXG4gIGVtYmVkKHRleHQ6IHN0cmluZyk6IEVtYmVkZGluZyB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZW1iZWQodGV4dCk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgLSBzaW1wbGUgaGFzaC1iYXNlZCBlbWJlZGRpbmdcbiAgICBjb25zdCBkaW0gPSB0aGlzLmNvbmZpZy5lbWJlZGRpbmdEaW0gPz8gNzY4O1xuICAgIGNvbnN0IGVtYmVkZGluZyA9IG5ldyBBcnJheShkaW0pLmZpbGwoMCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGlkeCA9ICh0ZXh0LmNoYXJDb2RlQXQoaSkgKiAoaSArIDEpKSAlIGRpbTtcbiAgICAgIGVtYmVkZGluZ1tpZHhdICs9IDAuMTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemVcbiAgICBjb25zdCBub3JtID0gTWF0aC5zcXJ0KGVtYmVkZGluZy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeCAqIHgsIDApKSB8fCAxO1xuICAgIHJldHVybiBlbWJlZGRpbmcubWFwKHggPT4geCAvIG5vcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byB0ZXh0c1xuICAgKi9cbiAgc2ltaWxhcml0eSh0ZXh0MTogc3RyaW5nLCB0ZXh0Mjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIC8vIGYzMiBhY2N1bXVsYXRpb24gY2FuIGxhbmQganVzdCBvdXRzaWRlIHRoZSBtYXRoZW1hdGljYWwgcmFuZ2Ug4oCUIGFuXG4gICAgICAvLyBpZGVudGljYWwgcGFpciBtZWFzdXJlcyAxLjAwMDAwMDEg4oCUIHdoaWNoIHR1cm5zIE1hdGguYWNvcyhzaW0pIGludG9cbiAgICAgIC8vIE5hTiBkb3duc3RyZWFtLiBDb3NpbmUgc2ltaWxhcml0eSBpcyBkZWZpbmVkIG9uIFstMSwgMV0sIHNvIGNsYW1wLlxuICAgICAgY29uc3QgcmF3ID0gdGhpcy5uYXRpdmUuc2ltaWxhcml0eSh0ZXh0MSwgdGV4dDIpO1xuICAgICAgcmV0dXJuIE1hdGgubWluKDEsIE1hdGgubWF4KC0xLCByYXcpKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAtIGNvc2luZSBzaW1pbGFyaXR5XG4gICAgY29uc3QgZW1iMSA9IHRoaXMuZW1iZWQodGV4dDEpO1xuICAgIGNvbnN0IGVtYjIgPSB0aGlzLmVtYmVkKHRleHQyKTtcblxuICAgIGxldCBkb3QgPSAwO1xuICAgIGxldCBub3JtMSA9IDA7XG4gICAgbGV0IG5vcm0yID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iMS5sZW5ndGg7IGkrKykge1xuICAgICAgZG90ICs9IGVtYjFbaV0gKiBlbWIyW2ldO1xuICAgICAgbm9ybTEgKz0gZW1iMVtpXSAqIGVtYjFbaV07XG4gICAgICBub3JtMiArPSBlbWIyW2ldICogZW1iMltpXTtcbiAgICB9XG5cbiAgICBjb25zdCBkZW5vbSA9IE1hdGguc3FydChub3JtMSkgKiBNYXRoLnNxcnQobm9ybTIpO1xuICAgIGNvbnN0IHNpbWlsYXJpdHkgPSBkZW5vbSA+IDAgPyBkb3QgLyBkZW5vbSA6IDA7XG4gICAgLy8gQ2xhbXAgdG8gWzAsIDFdIHRvIGhhbmRsZSBmbG9hdGluZyBwb2ludCBlcnJvcnNcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgc2ltaWxhcml0eSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIFNJTUQgaXMgYXZhaWxhYmxlXG4gICAqL1xuICBoYXNTaW1kKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmhhc1NpbWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBTSU1EIGNhcGFiaWxpdGllc1xuICAgKi9cbiAgc2ltZENhcGFiaWxpdGllcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuc2ltZENhcGFiaWxpdGllcygpO1xuICAgIH1cbiAgICByZXR1cm4gWydTY2FsYXIgKGZhbGxiYWNrKSddO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhdGNoIHF1ZXJ5IG11bHRpcGxlIHByb21wdHNcbiAgICovXG4gIGJhdGNoUXVlcnkocmVxdWVzdDogQmF0Y2hRdWVyeVJlcXVlc3QpOiBCYXRjaFF1ZXJ5UmVzcG9uc2Uge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXNwb25zZXMgPSByZXF1ZXN0LnF1ZXJpZXMubWFwKHEgPT4gdGhpcy5xdWVyeShxLCByZXF1ZXN0LmNvbmZpZykpO1xuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zZXMsXG4gICAgICB0b3RhbExhdGVuY3lNczogRGF0ZS5ub3coKSAtIHN0YXJ0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgbmF0aXZlIG1vZHVsZSBpcyBsb2FkZWRcbiAgICovXG4gIGlzTmF0aXZlTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZSAhPT0gbnVsbDtcbiAgfVxufVxuIl19
@@ -21,7 +21,24 @@ interface NativeConfig {
21
21
  }
22
22
  interface NativeEngine {
23
23
  query(text: string, config?: NativeGenConfig): NativeQueryResponse;
24
- generate(prompt: string, config?: NativeGenConfig): string;
24
+ /**
25
+ * Builds with `loadModel` return a generation result and throw while no
26
+ * model is loaded; older builds (the 2.0.x platform packages) return a
27
+ * string that is not model output, so the wrapper never calls them.
28
+ */
29
+ generate(prompt: string, config?: NativeGenConfig): NativeGenerationResult | string;
30
+ /**
31
+ * Present on builds since model loading was added. Those built without the
32
+ * `candle` feature throw `RUVLLM_NO_INFERENCE_BACKEND`; see
33
+ * `supportsModelLoading`.
34
+ */
35
+ loadModel?(path: string, options?: NativeLoadModelOptions): NativeModelInfo;
36
+ /** Whether the binary was built with the `candle` feature (absent on older builds). */
37
+ supportsModelLoading?(): boolean;
38
+ unloadModel?(): void;
39
+ isModelLoaded?(): boolean;
40
+ modelInfo?(): NativeModelInfo | null;
41
+ chat?(messages: NativeChatMessage[], config?: NativeGenConfig): NativeGenerationResult;
25
42
  route(text: string): NativeRoutingDecision;
26
43
  searchMemory(text: string, k?: number): NativeMemoryResult[];
27
44
  /** Current native builds return a UUID string; older ones returned a number. */
@@ -35,11 +52,38 @@ interface NativeEngine {
35
52
  simdCapabilities(): string[];
36
53
  }
37
54
  interface NativeGenConfig {
38
- max_tokens?: number;
55
+ maxTokens?: number;
39
56
  temperature?: number;
40
- top_p?: number;
41
- top_k?: number;
42
- repetition_penalty?: number;
57
+ topP?: number;
58
+ topK?: number;
59
+ repetitionPenalty?: number;
60
+ stopSequences?: string[];
61
+ seed?: number;
62
+ }
63
+ interface NativeLoadModelOptions {
64
+ maxContext?: number;
65
+ }
66
+ interface NativeChatMessage {
67
+ role: string;
68
+ content: string;
69
+ }
70
+ interface NativeGenerationResult {
71
+ text: string;
72
+ promptTokens: number;
73
+ completionTokens: number;
74
+ finishReason: string;
75
+ }
76
+ interface NativeModelInfo {
77
+ name: string;
78
+ architecture: string;
79
+ numParameters: number;
80
+ vocabSize: number;
81
+ hiddenSize: number;
82
+ numLayers: number;
83
+ maxContextLength: number;
84
+ quantization?: string | null;
85
+ memoryUsageBytes: number;
86
+ chatTemplate?: string | null;
43
87
  }
44
88
  interface NativeQueryResponse {
45
89
  text: string;
@@ -48,6 +92,10 @@ interface NativeQueryResponse {
48
92
  contextSize: number;
49
93
  latencyMs: number;
50
94
  requestId: string;
95
+ /** Builds with `loadModel` also report token usage. */
96
+ promptTokens?: number;
97
+ completionTokens?: number;
98
+ finishReason?: string;
51
99
  context_size?: number;
52
100
  latency_ms?: number;
53
101
  request_id?: string;
@@ -88,5 +136,5 @@ interface NativeSimdOps {
88
136
  export declare function getNativeModule(): NativeRuvLLM | null;
89
137
  export declare function version(): string;
90
138
  export declare function hasSimdSupport(): boolean;
91
- export type { NativeRuvLLM, NativeConfig, NativeEngine, NativeGenConfig, NativeQueryResponse, NativeRoutingDecision, NativeMemoryResult, NativeStats, NativeSimdOps, };
139
+ export type { NativeRuvLLM, NativeConfig, NativeEngine, NativeGenConfig, NativeLoadModelOptions, NativeChatMessage, NativeGenerationResult, NativeModelInfo, NativeQueryResponse, NativeRoutingDecision, NativeMemoryResult, NativeStats, NativeSimdOps, };
92
140
  //# sourceMappingURL=native.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/native.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/native.ts"],"names":[],"mappings":"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"}