@ruvector/ruvllm 2.7.0 → 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.
- package/README.md +133 -34
- package/bin/cli.js +38 -18
- package/dist/cjs/engine.d.ts +79 -14
- package/dist/cjs/engine.d.ts.map +1 -1
- package/dist/cjs/engine.js +249 -69
- package/dist/cjs/native.d.ts +54 -6
- package/dist/cjs/native.d.ts.map +1 -1
- package/dist/cjs/native.js +30 -9
- package/dist/cjs/types.d.ts +92 -11
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/types.js +1 -1
- package/dist/esm/engine.d.ts +79 -14
- package/dist/esm/engine.d.ts.map +1 -1
- package/dist/esm/engine.js +248 -68
- package/dist/esm/native.d.ts +54 -6
- package/dist/esm/native.d.ts.map +1 -1
- package/dist/esm/native.js +31 -10
- package/dist/esm/types.d.ts +92 -11
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +1 -1
- package/package.json +4 -3
package/dist/cjs/engine.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* RuvLLM Engine - Main orchestrator for self-learning LLM
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.RuvLLM = void 0;
|
|
6
|
+
exports.RuvLLM = exports.PLACEHOLDER_TEXT = void 0;
|
|
7
7
|
const native_1 = require("./native");
|
|
8
8
|
/**
|
|
9
9
|
* Convert JS config to native config format
|
|
@@ -28,19 +28,44 @@ function toNativeConfig(config) {
|
|
|
28
28
|
function toNativeGenConfig(config) {
|
|
29
29
|
if (!config)
|
|
30
30
|
return undefined;
|
|
31
|
+
// camelCase: napi-rs ignores snake_case keys on `#[napi(object)]` inputs.
|
|
31
32
|
return {
|
|
32
|
-
|
|
33
|
+
maxTokens: config.maxTokens,
|
|
33
34
|
temperature: config.temperature,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
topP: config.topP,
|
|
36
|
+
topK: config.topK,
|
|
37
|
+
repetitionPenalty: config.repetitionPenalty,
|
|
38
|
+
stopSequences: config.stopSequences,
|
|
39
|
+
seed: config.seed,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function toGenerationResult(r) {
|
|
43
|
+
return {
|
|
44
|
+
text: r.text,
|
|
45
|
+
promptTokens: r.promptTokens,
|
|
46
|
+
completionTokens: r.completionTokens,
|
|
47
|
+
finishReason: r.finishReason,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function toModelInfo(i) {
|
|
51
|
+
return {
|
|
52
|
+
name: i.name,
|
|
53
|
+
architecture: i.architecture,
|
|
54
|
+
numParameters: i.numParameters,
|
|
55
|
+
vocabSize: i.vocabSize,
|
|
56
|
+
hiddenSize: i.hiddenSize,
|
|
57
|
+
numLayers: i.numLayers,
|
|
58
|
+
maxContextLength: i.maxContextLength,
|
|
59
|
+
quantization: i.quantization ?? null,
|
|
60
|
+
memoryUsageBytes: i.memoryUsageBytes,
|
|
61
|
+
chatTemplate: i.chatTemplate ?? null,
|
|
37
62
|
};
|
|
38
63
|
}
|
|
39
64
|
const warned = new Set();
|
|
40
65
|
/** Warn once per process (or throw when `strict`). */
|
|
41
66
|
function notice(code, message, strict) {
|
|
42
67
|
if (strict)
|
|
43
|
-
throw
|
|
68
|
+
throw codedError(code, message);
|
|
44
69
|
if (warned.has(code))
|
|
45
70
|
return;
|
|
46
71
|
warned.add(code);
|
|
@@ -50,27 +75,62 @@ function notice(code, message, strict) {
|
|
|
50
75
|
else
|
|
51
76
|
g.console?.warn?.(`${code}: ${message}`);
|
|
52
77
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
78
|
+
/** An Error whose message starts with, and whose `code` is, `code`. */
|
|
79
|
+
function codedError(code, message) {
|
|
80
|
+
const err = new Error(`${code}: ${message}`);
|
|
81
|
+
err.code = code;
|
|
82
|
+
return err;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Call into the native engine, giving its errors the same `code` as the
|
|
86
|
+
* wrapper's own: native messages start with `RUVLLM_<CODE>:`, but napi-rs
|
|
87
|
+
* sets `code` to a generic status such as `GenericFailure`.
|
|
88
|
+
*/
|
|
89
|
+
function callNative(f) {
|
|
90
|
+
try {
|
|
91
|
+
return f();
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
const match = /^(RUVLLM_[A-Z_]+):/.exec(e instanceof Error ? e.message : '');
|
|
95
|
+
if (match)
|
|
96
|
+
e.code = match[1];
|
|
97
|
+
throw e;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function platformKey() {
|
|
101
|
+
const p = globalThis.process;
|
|
102
|
+
return `${p?.platform ?? 'unknown'}-${p?.arch ?? 'unknown'}`;
|
|
103
|
+
}
|
|
104
|
+
function envAllowsPlaceholder() {
|
|
105
|
+
const p = globalThis.process;
|
|
106
|
+
return p?.env?.RUVLLM_ALLOW_MOCK === '1';
|
|
107
|
+
}
|
|
108
|
+
/** Returned by generate()/query() only with `allowPlaceholder` / `RUVLLM_ALLOW_MOCK=1`. */
|
|
109
|
+
exports.PLACEHOLDER_TEXT = '[RuvLLM placeholder: no language model is loaded; this text is not model output]';
|
|
57
110
|
/**
|
|
58
111
|
* RuvLLM - Self-learning LLM orchestrator
|
|
59
112
|
*
|
|
60
|
-
* Combines SONA adaptive learning with HNSW memory,
|
|
61
|
-
*
|
|
113
|
+
* Combines SONA adaptive learning with HNSW memory, FastGRNN routing, and
|
|
114
|
+
* GGUF inference through the native candle backend.
|
|
115
|
+
*
|
|
116
|
+
* Text comes only from a model loaded with `loadModel()` (or the `modelPath`
|
|
117
|
+
* option). Without one, `generate()`, `query()`, `chat()` and
|
|
118
|
+
* `generateDetailed()` throw `RUVLLM_NO_LANGUAGE_MODEL`.
|
|
62
119
|
*
|
|
63
120
|
* @example
|
|
64
121
|
* ```typescript
|
|
65
122
|
* import { RuvLLM } from '@ruvector/ruvllm';
|
|
66
123
|
*
|
|
67
|
-
* const llm = new RuvLLM(
|
|
124
|
+
* const llm = new RuvLLM();
|
|
125
|
+
* llm.loadModel('./qwen2.5-0.5b-instruct-q4_k_m.gguf');
|
|
68
126
|
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
127
|
+
* const out = llm.chat([{ role: 'user', content: 'What is machine learning?' }], {
|
|
128
|
+
* maxTokens: 128,
|
|
129
|
+
* });
|
|
130
|
+
* console.log(out.text, out.finishReason, out.completionTokens);
|
|
72
131
|
*
|
|
73
|
-
* //
|
|
132
|
+
* // Routed query, answered by the loaded model
|
|
133
|
+
* const response = llm.query('What is machine learning?');
|
|
74
134
|
* llm.feedback({ requestId: response.requestId, rating: 5 });
|
|
75
135
|
* ```
|
|
76
136
|
*/
|
|
@@ -80,6 +140,7 @@ class RuvLLM {
|
|
|
80
140
|
*/
|
|
81
141
|
constructor(config) {
|
|
82
142
|
this.native = null;
|
|
143
|
+
this.nativeVersion = null;
|
|
83
144
|
// Fallback state for when native module is not available
|
|
84
145
|
this.fallbackState = {
|
|
85
146
|
memory: new Map(),
|
|
@@ -87,83 +148,202 @@ class RuvLLM {
|
|
|
87
148
|
queryCount: 0,
|
|
88
149
|
};
|
|
89
150
|
this.config = config ?? {};
|
|
151
|
+
this.allowPlaceholder = this.config.allowPlaceholder === true || envAllowsPlaceholder();
|
|
90
152
|
const extra = this.config;
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
'load model files. For GGUF inference use the ruvllm CLI (`ruvllm serve <model> --strict`).', this.config.strict);
|
|
95
|
-
}
|
|
153
|
+
if (extra.backend !== undefined) {
|
|
154
|
+
notice('RUVLLM_UNSUPPORTED_OPTION', '`backend` is not supported by @ruvector/ruvllm and is ignored: models loaded with ' +
|
|
155
|
+
'loadModel() run on the built-in candle backend.', this.config.strict);
|
|
96
156
|
}
|
|
97
157
|
const mod = (0, native_1.getNativeModule)();
|
|
98
158
|
if (mod) {
|
|
99
159
|
try {
|
|
100
160
|
this.native = new mod.RuvLLMEngine(toNativeConfig(config));
|
|
161
|
+
this.nativeVersion = mod.version();
|
|
101
162
|
}
|
|
102
163
|
catch {
|
|
103
164
|
// Silently fall back to JS implementation
|
|
104
165
|
}
|
|
105
166
|
}
|
|
167
|
+
if (this.config.modelPath !== undefined) {
|
|
168
|
+
this.loadModel(this.config.modelPath, this.config.modelOptions);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Whether the native binary can load and run a language model. False
|
|
173
|
+
* without a native binary, for binaries that predate `loadModel` (the 2.0.x
|
|
174
|
+
* `@ruvector/ruvllm-<platform>` packages), and for binaries built without
|
|
175
|
+
* the `candle` inference backend.
|
|
176
|
+
*/
|
|
177
|
+
supportsModelLoading() {
|
|
178
|
+
const native = this.native;
|
|
179
|
+
if (typeof native?.loadModel !== 'function')
|
|
180
|
+
return false;
|
|
181
|
+
// Builds that predate this probe all had the backend (they were local
|
|
182
|
+
// `npm run build:native` builds, which enable `candle`).
|
|
183
|
+
return typeof native.supportsModelLoading === 'function' ? native.supportsModelLoading() : true;
|
|
184
|
+
}
|
|
185
|
+
/** Error for a binary that has `loadModel` but no inference backend. */
|
|
186
|
+
noBackendError() {
|
|
187
|
+
return codedError('RUVLLM_NO_INFERENCE_BACKEND', `the installed native binary (version ${this.nativeVersion ?? 'unknown'}) was built ` +
|
|
188
|
+
'without the `candle` inference backend and cannot load models. Rebuild it with ' +
|
|
189
|
+
'`npm run build:native` (which enables `candle`) and set RUVLLM_NATIVE_PATH to it, ' +
|
|
190
|
+
'or use the ruvllm CLI (`ruvllm serve <model>`).');
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Load a GGUF model (or a directory holding one) for `generate()`,
|
|
194
|
+
* `chat()` and `query()`. Supported GGUF architectures: llama, mistral,
|
|
195
|
+
* qwen2, qwen3; others fail with an error naming the architecture. The
|
|
196
|
+
* tokenizer comes from a `tokenizer.json` beside the file, else from the
|
|
197
|
+
* GGUF itself. Replaces any loaded model; if loading fails, no model is
|
|
198
|
+
* loaded. Synchronous: blocks the event loop while the weights load.
|
|
199
|
+
*
|
|
200
|
+
* @throws `RUVLLM_NATIVE_UNAVAILABLE` without a native binary,
|
|
201
|
+
* `RUVLLM_NATIVE_TOO_OLD` when the binary predates model loading,
|
|
202
|
+
* `RUVLLM_NO_INFERENCE_BACKEND` when it was built without `candle`,
|
|
203
|
+
* `RUVLLM_MODEL_NOT_FOUND` / `RUVLLM_MODEL_LOAD_FAILED` from the backend.
|
|
204
|
+
*/
|
|
205
|
+
loadModel(path, options) {
|
|
206
|
+
if (typeof path !== 'string' || path.length === 0) {
|
|
207
|
+
throw new TypeError('loadModel: path must be a non-empty string');
|
|
208
|
+
}
|
|
209
|
+
if (!this.native) {
|
|
210
|
+
throw codedError('RUVLLM_NATIVE_UNAVAILABLE', `no native RuvLLM binary could be loaded for ${platformKey()}, so models cannot be ` +
|
|
211
|
+
'loaded. Install the matching @ruvector/ruvllm-<platform> package, or build one ' +
|
|
212
|
+
'(`npm run build:native`) and set RUVLLM_NATIVE_PATH to it.');
|
|
213
|
+
}
|
|
214
|
+
if (typeof this.native.loadModel !== 'function') {
|
|
215
|
+
throw codedError('RUVLLM_NATIVE_TOO_OLD', `the installed native binary (version ${this.nativeVersion ?? 'unknown'}) cannot load ` +
|
|
216
|
+
'models: it predates loadModel(). The @ruvector/ruvllm-<platform> 2.0.x packages are ' +
|
|
217
|
+
'such builds. Install the 3.x platform package, or build the binary from source ' +
|
|
218
|
+
'(`npm run build:native`, which enables the `candle` feature) and set ' +
|
|
219
|
+
'RUVLLM_NATIVE_PATH to it, or use the ruvllm CLI (`ruvllm serve <model>`).');
|
|
220
|
+
}
|
|
221
|
+
if (!this.supportsModelLoading())
|
|
222
|
+
throw this.noBackendError();
|
|
223
|
+
const native = this.native;
|
|
224
|
+
return toModelInfo(callNative(() => native.loadModel(path, options)));
|
|
106
225
|
}
|
|
107
226
|
/**
|
|
108
|
-
*
|
|
227
|
+
* Unload the language model and free its memory
|
|
228
|
+
*/
|
|
229
|
+
unloadModel() {
|
|
230
|
+
this.native?.unloadModel?.();
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Whether a language model is loaded
|
|
234
|
+
*/
|
|
235
|
+
isModelLoaded() {
|
|
236
|
+
return this.native?.isModelLoaded?.() ?? false;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* The loaded language model, or null
|
|
240
|
+
*/
|
|
241
|
+
modelInfo() {
|
|
242
|
+
const info = this.native?.modelInfo?.();
|
|
243
|
+
return info ? toModelInfo(info) : null;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Route `text`, then answer it with the loaded model (as one user message
|
|
247
|
+
* under the model's chat template).
|
|
248
|
+
*
|
|
249
|
+
* @throws `RUVLLM_NO_LANGUAGE_MODEL` when no model is loaded, unless
|
|
250
|
+
* `allowPlaceholder` is set (then `text` is `PLACEHOLDER_TEXT`).
|
|
109
251
|
*/
|
|
110
252
|
query(text, config) {
|
|
111
|
-
if (this.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
// object carries `contextSize`/`latencyMs`/`requestId`. The snake_case
|
|
116
|
-
// reads are kept as a fallback for older native builds.
|
|
253
|
+
if (!this.isModelLoaded()) {
|
|
254
|
+
const placeholder = this.placeholderOrThrow();
|
|
255
|
+
this.fallbackState.queryCount++;
|
|
256
|
+
const route = this.route(text);
|
|
117
257
|
return {
|
|
118
|
-
text:
|
|
119
|
-
confidence:
|
|
120
|
-
model:
|
|
121
|
-
contextSize:
|
|
122
|
-
latencyMs:
|
|
123
|
-
requestId:
|
|
258
|
+
text: placeholder,
|
|
259
|
+
confidence: route.confidence,
|
|
260
|
+
model: route.model,
|
|
261
|
+
contextSize: route.contextSize,
|
|
262
|
+
latencyMs: 0,
|
|
263
|
+
requestId: `placeholder-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
124
264
|
};
|
|
125
265
|
}
|
|
126
|
-
|
|
127
|
-
|
|
266
|
+
const native = this.native;
|
|
267
|
+
const result = callNative(() => native.query(text, toNativeGenConfig(config)));
|
|
128
268
|
return {
|
|
129
|
-
text:
|
|
130
|
-
confidence:
|
|
131
|
-
model:
|
|
132
|
-
contextSize:
|
|
133
|
-
latencyMs:
|
|
134
|
-
requestId:
|
|
269
|
+
text: result.text,
|
|
270
|
+
confidence: result.confidence,
|
|
271
|
+
model: result.model,
|
|
272
|
+
contextSize: result.contextSize,
|
|
273
|
+
latencyMs: result.latencyMs,
|
|
274
|
+
requestId: result.requestId,
|
|
275
|
+
promptTokens: result.promptTokens,
|
|
276
|
+
completionTokens: result.completionTokens,
|
|
277
|
+
finishReason: result.finishReason,
|
|
135
278
|
};
|
|
136
279
|
}
|
|
137
280
|
/**
|
|
138
|
-
*
|
|
281
|
+
* Continue `prompt` verbatim with the loaded model (no chat template; use
|
|
282
|
+
* `chat()` for instruction-tuned models). Returns the generated text.
|
|
139
283
|
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
* warning (or throws with `strict: true`). Without the native module this
|
|
143
|
-
* returns an informational message.
|
|
284
|
+
* @throws `RUVLLM_NO_LANGUAGE_MODEL` when no model is loaded, unless
|
|
285
|
+
* `allowPlaceholder` is set (then it returns `PLACEHOLDER_TEXT`).
|
|
144
286
|
*/
|
|
145
287
|
generate(prompt, config) {
|
|
146
|
-
if (this.
|
|
147
|
-
|
|
148
|
-
|
|
288
|
+
if (!this.isModelLoaded())
|
|
289
|
+
return this.placeholderOrThrow();
|
|
290
|
+
return this.generateDetailed(prompt, config).text;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Like `generate()`, with token counts (from the model's tokenizer) and
|
|
294
|
+
* the finish reason. Always throws `RUVLLM_NO_LANGUAGE_MODEL` without a
|
|
295
|
+
* loaded model.
|
|
296
|
+
*/
|
|
297
|
+
generateDetailed(prompt, config) {
|
|
298
|
+
const native = this.requireModel();
|
|
299
|
+
return toGenerationResult(callNative(() => native.generate(prompt, toNativeGenConfig(config))));
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Run the loaded model on a conversation, formatted with the model's chat
|
|
303
|
+
* template (ChatML for Qwen, Llama 3 / Mistral formats for those models).
|
|
304
|
+
* Always throws `RUVLLM_NO_LANGUAGE_MODEL` without a loaded model.
|
|
305
|
+
*/
|
|
306
|
+
chat(messages, config) {
|
|
307
|
+
const native = this.requireModel();
|
|
308
|
+
return toGenerationResult(callNative(() => native.chat(messages, toNativeGenConfig(config))));
|
|
309
|
+
}
|
|
310
|
+
requireModel() {
|
|
311
|
+
if (!this.isModelLoaded())
|
|
312
|
+
throw this.noModelError();
|
|
313
|
+
return this.native;
|
|
314
|
+
}
|
|
315
|
+
noModelError() {
|
|
316
|
+
let fix;
|
|
317
|
+
if (!this.native) {
|
|
318
|
+
fix =
|
|
319
|
+
`no native RuvLLM binary is available for ${platformKey()}, so no model can be loaded ` +
|
|
320
|
+
'(see RUVLLM_NATIVE_UNAVAILABLE in the README)';
|
|
321
|
+
}
|
|
322
|
+
else if (typeof this.native.loadModel !== 'function') {
|
|
323
|
+
fix =
|
|
324
|
+
`the installed native binary (version ${this.nativeVersion ?? 'unknown'}) cannot load ` +
|
|
325
|
+
'models (see RUVLLM_NATIVE_TOO_OLD in the README)';
|
|
149
326
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
327
|
+
else if (!this.supportsModelLoading()) {
|
|
328
|
+
fix =
|
|
329
|
+
`the installed native binary (version ${this.nativeVersion ?? 'unknown'}) was built ` +
|
|
330
|
+
'without the candle inference backend, so it cannot load models (see ' +
|
|
331
|
+
'RUVLLM_NO_INFERENCE_BACKEND in the README)';
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
fix = 'call loadModel(<path to a GGUF file>) first';
|
|
335
|
+
}
|
|
336
|
+
return codedError('RUVLLM_NO_LANGUAGE_MODEL', `no language model is loaded, so there is no model output to return: ${fix}. Routing, ` +
|
|
337
|
+
'memory and embeddings work without a model. For an HTTP server use the ruvllm CLI ' +
|
|
338
|
+
'(`ruvllm serve <model>`).');
|
|
339
|
+
}
|
|
340
|
+
/** Throw `RUVLLM_NO_LANGUAGE_MODEL`, or return the labelled placeholder when opted in. */
|
|
341
|
+
placeholderOrThrow() {
|
|
342
|
+
if (!this.allowPlaceholder)
|
|
343
|
+
throw this.noModelError();
|
|
344
|
+
notice('RUVLLM_PLACEHOLDER_TEXT', 'no language model is loaded: generate()/query() are returning a labelled placeholder, ' +
|
|
345
|
+
'not model output, because allowPlaceholder (or RUVLLM_ALLOW_MOCK=1) is set.', false);
|
|
346
|
+
return exports.PLACEHOLDER_TEXT;
|
|
167
347
|
}
|
|
168
348
|
/**
|
|
169
349
|
* Get routing decision for a query
|
|
@@ -369,4 +549,4 @@ This fallback provides routing, memory, and embedding features but not full text
|
|
|
369
549
|
}
|
|
370
550
|
}
|
|
371
551
|
exports.RuvLLM = RuvLLM;
|
|
372
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQWdCSCxxQ0FLa0I7QUFFbEI7O0dBRUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFxQjtJQUMzQyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRTlCLE9BQU87UUFDTCxhQUFhLEVBQUUsTUFBTSxDQUFDLFlBQVk7UUFDbEMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGVBQWU7UUFDekMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ3BCLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0I7UUFDL0MsY0FBYyxFQUFFLE1BQU0sQ0FBQyxZQUFZO1FBQ25DLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxlQUFlO1FBQ3hDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDMUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTO0tBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE1BQXlCO0lBQ2xELElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFOUIsT0FBTztRQUNMLFVBQVUsRUFBRSxNQUFNLENBQUMsU0FBUztRQUM1QixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7UUFDL0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2xCLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNsQixrQkFBa0IsRUFBRSxNQUFNLENBQUMsaUJBQWlCO0tBQzdDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUVqQyxzREFBc0Q7QUFDdEQsU0FBUyxNQUFNLENBQUMsSUFBWSxFQUFFLE9BQWUsRUFBRSxNQUEyQjtJQUN4RSxJQUFJLE1BQU07UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbkQsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU87SUFDN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQixNQUFNLENBQUMsR0FBRyxVQUdULENBQUM7SUFDRixJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssVUFBVTtRQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7O1FBQ3RGLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsTUFBTSxhQUFhLEdBQ2pCLHdGQUF3RjtJQUN4Riw0RkFBNEY7SUFDNUYsc0ZBQXNGO0lBQ3RGLHlDQUF5QyxDQUFDO0FBRTVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBYSxNQUFNO0lBV2pCOztPQUVHO0lBQ0gsWUFBWSxNQUFxQjtRQWJ6QixXQUFNLEdBQXdCLElBQUksQ0FBQztRQUczQyx5REFBeUQ7UUFDakQsa0JBQWEsR0FBRztZQUN0QixNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQXVGO1lBQ3RHLE1BQU0sRUFBRSxDQUFDO1lBQ1QsVUFBVSxFQUFFLENBQUM7U0FDZCxDQUFDO1FBTUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFpQyxDQUFDO1FBQ3JELEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxDQUNKLDJCQUEyQixFQUMzQixLQUFLLEdBQUcsZ0ZBQWdGO29CQUN0Riw0RkFBNEYsRUFDOUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ25CLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUEsd0JBQWUsR0FBRSxDQUFDO1FBQzlCLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCwwQ0FBMEM7WUFDNUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBWSxFQUFFLE1BQXlCO1FBQzNDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNsRSxvRUFBb0U7WUFDcEUsdUVBQXVFO1lBQ3ZFLHdEQUF3RDtZQUN4RCxPQUFPO2dCQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUM3QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxZQUFZO2dCQUN0RCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsVUFBVTtnQkFDaEQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFVBQVU7YUFDakQsQ0FBQztRQUNKLENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLDJCQUEyQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSztZQUN2RCxVQUFVLEVBQUUsR0FBRztZQUNmLEtBQUssRUFBRSxVQUFVO1lBQ2pCLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLFNBQVMsRUFBRSxHQUFHO1lBQ2QsU0FBUyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ3JFLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFFBQVEsQ0FBQyxNQUFjLEVBQUUsTUFBeUI7UUFDaEQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLDBCQUEwQixFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsU0FBUyxJQUFJLEdBQUcsQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsV0FBVyxJQUFJLEdBQUcsQ0FBQztRQUN4QyxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUVqQyxPQUFPOzs7Z0JBR0ssTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTs7OytEQUdSLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLElBQUk7Ozs7ZUFJaEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsU0FBUzs7NkZBRVksQ0FBQztJQUM1RixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBWTtRQUNoQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxPQUFPO2dCQUNMLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBWTtnQkFDMUIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFlBQVk7Z0JBQ3RELFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztnQkFDL0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUs7Z0JBQ2pDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTthQUM5QixDQUFDO1FBQ0osQ0FBQztRQUVELFdBQVc7UUFDWCxPQUFPO1lBQ0wsS0FBSyxFQUFFLE1BQU07WUFDYixXQUFXLEVBQUUsR0FBRztZQUNoQixXQUFXLEVBQUUsR0FBRztZQUNoQixJQUFJLEVBQUUsR0FBRztZQUNULFVBQVUsRUFBRSxHQUFHO1NBQ2hCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsSUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFO1FBQy9CLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JCLHVFQUF1RTtnQkFDdkUsc0VBQXNFO2dCQUN0RSx3RUFBd0U7Z0JBQ3hFLCtCQUErQjtnQkFDL0IsTUFBTSxJQUFJLEdBQUcsQ0FBUSxDQUFDO2dCQUN0QixNQUFNLEtBQUssR0FDVCxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtvQkFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO29CQUNaLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUTt3QkFDakMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3RDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1YsT0FBTztvQkFDTCxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7b0JBQ1IsS0FBSztvQkFDTCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO2lCQUN6QyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNuRCxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLEVBQUU7WUFDRixLQUFLLEVBQUUsR0FBRztZQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDeEIsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTLENBQUMsT0FBZSxFQUFFLFFBQWtDO1FBQzNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUVELFdBQVc7UUFDWCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsT0FBTztZQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUM5QixRQUFRLEVBQUUsUUFBUSxJQUFJLEVBQUU7U0FDekIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsRUFBWTtRQUNuQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsb0VBQW9FO1lBQ3BFLGlFQUFpRTtZQUNqRSxPQUFPO2dCQUNMLFlBQVksRUFBRyxDQUFTLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxhQUFhLElBQUksQ0FBQztnQkFDN0QsV0FBVyxFQUFHLENBQVMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDO2dCQUMxRCxlQUFlLEVBQ1osQ0FBUyxDQUFDLGFBQWE7b0JBQ3hCLENBQUMsQ0FBQyxnQkFBZ0I7b0JBQ2pCLENBQVMsQ0FBQyxjQUFjO29CQUN6QixDQUFDO2dCQUNILFlBQVksRUFBRyxDQUFTLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQztnQkFDOUQsWUFBWSxFQUFHLENBQVMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLGNBQWMsSUFBSSxDQUFDO2dCQUM5RCxjQUFjLEVBQUcsQ0FBUyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLEdBQUc7YUFDdEUsQ0FBQztRQUNKLENBQUM7UUFFRCxXQUFXO1FBQ1gsT0FBTztZQUNMLFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVU7WUFDM0MsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDM0MsZUFBZSxFQUFFLENBQUM7WUFDbEIsWUFBWSxFQUFFLEdBQUc7WUFDakIsWUFBWSxFQUFFLEdBQUc7WUFDakIsY0FBYyxFQUFFLEdBQUc7U0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELE9BQU8seUNBQXlDLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQVk7UUFDaEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQseUNBQXlDO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDakQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQztRQUN4QixDQUFDO1FBRUQsWUFBWTtRQUNaLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFFLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDckMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIscUVBQXFFO1lBQ3JFLHNFQUFzRTtZQUN0RSxxRUFBcUU7WUFDckUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9CLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxNQUFNLFVBQVUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0Msa0RBQWtEO1FBQ2xELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsT0FBMEI7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDMUUsT0FBTztZQUNMLFNBQVM7WUFDVCxjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUs7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQTFVRCx3QkEwVUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJ1dkxMTSBFbmdpbmUgLSBNYWluIG9yY2hlc3RyYXRvciBmb3Igc2VsZi1sZWFybmluZyBMTE1cbiAqL1xuXG5pbXBvcnQge1xuICBSdXZMTE1Db25maWcsXG4gIEdlbmVyYXRpb25Db25maWcsXG4gIFF1ZXJ5UmVzcG9uc2UsXG4gIFJvdXRpbmdEZWNpc2lvbixcbiAgTWVtb3J5UmVzdWx0LFxuICBNZW1vcnlJZCxcbiAgUnV2TExNU3RhdHMsXG4gIEZlZWRiYWNrLFxuICBFbWJlZGRpbmcsXG4gIEJhdGNoUXVlcnlSZXF1ZXN0LFxuICBCYXRjaFF1ZXJ5UmVzcG9uc2UsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQge1xuICBnZXROYXRpdmVNb2R1bGUsXG4gIE5hdGl2ZUVuZ2luZSxcbiAgTmF0aXZlQ29uZmlnLFxuICBOYXRpdmVHZW5Db25maWcsXG59IGZyb20gJy4vbmF0aXZlJztcblxuLyoqXG4gKiBDb252ZXJ0IEpTIGNvbmZpZyB0byBuYXRpdmUgY29uZmlnIGZvcm1hdFxuICovXG5mdW5jdGlvbiB0b05hdGl2ZUNvbmZpZyhjb25maWc/OiBSdXZMTE1Db25maWcpOiBOYXRpdmVDb25maWcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIGVtYmVkZGluZ19kaW06IGNvbmZpZy5lbWJlZGRpbmdEaW0sXG4gICAgcm91dGVyX2hpZGRlbl9kaW06IGNvbmZpZy5yb3V0ZXJIaWRkZW5EaW0sXG4gICAgaG5zd19tOiBjb25maWcuaG5zd00sXG4gICAgaG5zd19lZl9jb25zdHJ1Y3Rpb246IGNvbmZpZy5obnN3RWZDb25zdHJ1Y3Rpb24sXG4gICAgaG5zd19lZl9zZWFyY2g6IGNvbmZpZy5obnN3RWZTZWFyY2gsXG4gICAgbGVhcm5pbmdfZW5hYmxlZDogY29uZmlnLmxlYXJuaW5nRW5hYmxlZCxcbiAgICBxdWFsaXR5X3RocmVzaG9sZDogY29uZmlnLnF1YWxpdHlUaHJlc2hvbGQsXG4gICAgZXdjX2xhbWJkYTogY29uZmlnLmV3Y0xhbWJkYSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IEpTIGdlbmVyYXRpb24gY29uZmlnIHRvIG5hdGl2ZSBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gdG9OYXRpdmVHZW5Db25maWcoY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZyk6IE5hdGl2ZUdlbkNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgbWF4X3Rva2VuczogY29uZmlnLm1heFRva2VucyxcbiAgICB0ZW1wZXJhdHVyZTogY29uZmlnLnRlbXBlcmF0dXJlLFxuICAgIHRvcF9wOiBjb25maWcudG9wUCxcbiAgICB0b3BfazogY29uZmlnLnRvcEssXG4gICAgcmVwZXRpdGlvbl9wZW5hbHR5OiBjb25maWcucmVwZXRpdGlvblBlbmFsdHksXG4gIH07XG59XG5cbmNvbnN0IHdhcm5lZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKiogV2FybiBvbmNlIHBlciBwcm9jZXNzIChvciB0aHJvdyB3aGVuIGBzdHJpY3RgKS4gKi9cbmZ1bmN0aW9uIG5vdGljZShjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgc3RyaWN0OiBib29sZWFuIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChzdHJpY3QpIHRocm93IG5ldyBFcnJvcihgJHtjb2RlfTogJHttZXNzYWdlfWApO1xuICBpZiAod2FybmVkLmhhcyhjb2RlKSkgcmV0dXJuO1xuICB3YXJuZWQuYWRkKGNvZGUpO1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIHtcbiAgICBwcm9jZXNzPzogeyBlbWl0V2FybmluZz86IChtOiBzdHJpbmcsIG8/OiB7IGNvZGU/OiBzdHJpbmcgfSkgPT4gdm9pZCB9O1xuICAgIGNvbnNvbGU/OiB7IHdhcm4/OiAobTogc3RyaW5nKSA9PiB2b2lkIH07XG4gIH07XG4gIGlmICh0eXBlb2YgZy5wcm9jZXNzPy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJykgZy5wcm9jZXNzLmVtaXRXYXJuaW5nKG1lc3NhZ2UsIHsgY29kZSB9KTtcbiAgZWxzZSBnLmNvbnNvbGU/Lndhcm4/LihgJHtjb2RlfTogJHttZXNzYWdlfWApO1xufVxuXG5jb25zdCBOT19MTV9NRVNTQUdFID1cbiAgJ3RoZSBuYXRpdmUgUnV2TExNIGVuZ2luZSBoYXMgbm8gbGFuZ3VhZ2UtbW9kZWwgd2VpZ2h0cywgc28gZ2VuZXJhdGUoKS9xdWVyeSgpIHRleHQgaXMgJyArXG4gICdub3QgbW9kZWwgb3V0cHV0LiBGb3IgR0dVRiBpbmZlcmVuY2UgdXNlIHRoZSBydXZsbG0gQ0xJIChgcnV2bGxtIHNlcnZlIDxtb2RlbD4gLS1zdHJpY3RgKSAnICtcbiAgJ29yIGFub3RoZXIgT3BlbkFJLWNvbXBhdGlibGUgc2VydmVyLiBSb3V0aW5nLCBtZW1vcnkgYW5kIGVtYmVkZGluZ3MgYXJlIHVuYWZmZWN0ZWQuICcgK1xuICAnUGFzcyB7IHN0cmljdDogdHJ1ZSB9IHRvIHRocm93IGluc3RlYWQuJztcblxuLyoqXG4gKiBSdXZMTE0gLSBTZWxmLWxlYXJuaW5nIExMTSBvcmNoZXN0cmF0b3JcbiAqXG4gKiBDb21iaW5lcyBTT05BIGFkYXB0aXZlIGxlYXJuaW5nIHdpdGggSE5TVyBtZW1vcnksXG4gKiBGYXN0R1JOTiByb3V0aW5nLCBhbmQgU0lNRC1vcHRpbWl6ZWQgaW5mZXJlbmNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBSdXZMTE0gfSBmcm9tICdAcnV2ZWN0b3IvcnV2bGxtJztcbiAqXG4gKiBjb25zdCBsbG0gPSBuZXcgUnV2TExNKHsgZW1iZWRkaW5nRGltOiA3NjggfSk7XG4gKlxuICogLy8gUXVlcnkgd2l0aCBhdXRvbWF0aWMgcm91dGluZ1xuICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBsbG0ucXVlcnkoJ1doYXQgaXMgbWFjaGluZSBsZWFybmluZz8nKTtcbiAqIGNvbnNvbGUubG9nKHJlc3BvbnNlLnRleHQpO1xuICpcbiAqIC8vIFByb3ZpZGUgZmVlZGJhY2sgZm9yIGxlYXJuaW5nXG4gKiBsbG0uZmVlZGJhY2soeyByZXF1ZXN0SWQ6IHJlc3BvbnNlLnJlcXVlc3RJZCwgcmF0aW5nOiA1IH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSdXZMTE0ge1xuICBwcml2YXRlIG5hdGl2ZTogTmF0aXZlRW5naW5lIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29uZmlnOiBSdXZMTE1Db25maWc7XG5cbiAgLy8gRmFsbGJhY2sgc3RhdGUgZm9yIHdoZW4gbmF0aXZlIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlXG4gIHByaXZhdGUgZmFsbGJhY2tTdGF0ZSA9IHtcbiAgICBtZW1vcnk6IG5ldyBNYXA8bnVtYmVyLCB7IGNvbnRlbnQ6IHN0cmluZzsgZW1iZWRkaW5nOiBudW1iZXJbXTsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KCksXG4gICAgbmV4dElkOiAxLFxuICAgIHF1ZXJ5Q291bnQ6IDAsXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBSdXZMTE0gaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IFJ1dkxMTUNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnID8/IHt9O1xuICAgIGNvbnN0IGV4dHJhID0gdGhpcy5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBrZXkgb2YgWydtb2RlbFBhdGgnLCAnYmFja2VuZCddKSB7XG4gICAgICBpZiAoZXh0cmFba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vdGljZShcbiAgICAgICAgICAnUlVWTExNX1VOU1VQUE9SVEVEX09QVElPTicsXG4gICAgICAgICAgYFxcYCR7a2V5fVxcYCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEBydXZlY3Rvci9ydXZsbG0gYW5kIGlzIGlnbm9yZWQ6IHRoaXMgcGFja2FnZSBkb2VzIG5vdCBgICtcbiAgICAgICAgICAgICdsb2FkIG1vZGVsIGZpbGVzLiBGb3IgR0dVRiBpbmZlcmVuY2UgdXNlIHRoZSBydXZsbG0gQ0xJIChgcnV2bGxtIHNlcnZlIDxtb2RlbD4gLS1zdHJpY3RgKS4nLFxuICAgICAgICAgIHRoaXMuY29uZmlnLnN0cmljdCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtb2QgPSBnZXROYXRpdmVNb2R1bGUoKTtcbiAgICBpZiAobW9kKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm5hdGl2ZSA9IG5ldyBtb2QuUnV2TExNRW5naW5lKHRvTmF0aXZlQ29uZmlnKGNvbmZpZykpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNpbGVudGx5IGZhbGwgYmFjayB0byBKUyBpbXBsZW1lbnRhdGlvblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyeSB0aGUgTExNIHdpdGggYXV0b21hdGljIHJvdXRpbmdcbiAgICovXG4gIHF1ZXJ5KHRleHQ6IHN0cmluZywgY29uZmlnPzogR2VuZXJhdGlvbkNvbmZpZyk6IFF1ZXJ5UmVzcG9uc2Uge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgbm90aWNlKCdSVVZMTE1fTk9fTEFOR1VBR0VfTU9ERUwnLCBOT19MTV9NRVNTQUdFLCB0aGlzLmNvbmZpZy5zdHJpY3QpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmUucXVlcnkodGV4dCwgdG9OYXRpdmVHZW5Db25maWcoY29uZmlnKSk7XG4gICAgICAvLyBuYXBpLXJzIGNhbWVsQ2FzZXMgUnVzdCBmaWVsZCBuYW1lcyBvbiB0aGUgd2F5IG91dCwgc28gdGhlIG5hdGl2ZVxuICAgICAgLy8gb2JqZWN0IGNhcnJpZXMgYGNvbnRleHRTaXplYC9gbGF0ZW5jeU1zYC9gcmVxdWVzdElkYC4gVGhlIHNuYWtlX2Nhc2VcbiAgICAgIC8vIHJlYWRzIGFyZSBrZXB0IGFzIGEgZmFsbGJhY2sgZm9yIG9sZGVyIG5hdGl2ZSBidWlsZHMuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgICAgY29uZmlkZW5jZTogcmVzdWx0LmNvbmZpZGVuY2UsXG4gICAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICAgIGNvbnRleHRTaXplOiByZXN1bHQuY29udGV4dFNpemUgPz8gcmVzdWx0LmNvbnRleHRfc2l6ZSxcbiAgICAgICAgbGF0ZW5jeU1zOiByZXN1bHQubGF0ZW5jeU1zID8/IHJlc3VsdC5sYXRlbmN5X21zLFxuICAgICAgICByZXF1ZXN0SWQ6IHJlc3VsdC5yZXF1ZXN0SWQgPz8gcmVzdWx0LnJlcXVlc3RfaWQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGltcGxlbWVudGF0aW9uXG4gICAgdGhpcy5mYWxsYmFja1N0YXRlLnF1ZXJ5Q291bnQrKztcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogYFtGYWxsYmFja10gUmVzcG9uc2UgdG86ICR7dGV4dC5zbGljZSgwLCA1MCl9Li4uYCxcbiAgICAgIGNvbmZpZGVuY2U6IDAuNSxcbiAgICAgIG1vZGVsOiAnZmFsbGJhY2snLFxuICAgICAgY29udGV4dFNpemU6IDUxMixcbiAgICAgIGxhdGVuY3lNczogMS4wLFxuICAgICAgcmVxdWVzdElkOiBgZmItJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0ZXh0IHdpdGggU0lNRC1vcHRpbWl6ZWQgaW5mZXJlbmNlXG4gICAqXG4gICAqIE5vdGU6IHRoZSBuYXRpdmUgZW5naW5lIGhhcyBubyBsYW5ndWFnZS1tb2RlbCB3ZWlnaHRzLCBzbyBpdHMgdGV4dCBpc1xuICAgKiBub3QgbW9kZWwgb3V0cHV0OyB0aGUgZmlyc3QgY2FsbCBlbWl0cyBhIGBSVVZMTE1fTk9fTEFOR1VBR0VfTU9ERUxgXG4gICAqIHdhcm5pbmcgKG9yIHRocm93cyB3aXRoIGBzdHJpY3Q6IHRydWVgKS4gV2l0aG91dCB0aGUgbmF0aXZlIG1vZHVsZSB0aGlzXG4gICAqIHJldHVybnMgYW4gaW5mb3JtYXRpb25hbCBtZXNzYWdlLlxuICAgKi9cbiAgZ2VuZXJhdGUocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgbm90aWNlKCdSVVZMTE1fTk9fTEFOR1VBR0VfTU9ERUwnLCBOT19MTV9NRVNTQUdFLCB0aGlzLmNvbmZpZy5zdHJpY3QpO1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmdlbmVyYXRlKHByb21wdCwgdG9OYXRpdmVHZW5Db25maWcoY29uZmlnKSk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgLSBwcm92aWRlIGhlbHBmdWwgbWVzc2FnZSBpbnN0ZWFkIG9mIGdhcmJsZWQgb3V0cHV0XG4gICAgY29uc3QgbWF4VG9rZW5zID0gY29uZmlnPy5tYXhUb2tlbnMgPz8gMjU2O1xuICAgIGNvbnN0IHRlbXAgPSBjb25maWc/LnRlbXBlcmF0dXJlID8/IDAuNztcbiAgICBjb25zdCB0b3BQID0gY29uZmlnPy50b3BQID8/IDAuOTtcblxuICAgIHJldHVybiBgW1J1dkxMTSBKYXZhU2NyaXB0IEZhbGxiYWNrIE1vZGVdXG5ObyBuYXRpdmUgU0lNRCBtb2R1bGUgbG9hZGVkLiBSdW5uaW5nIGluIEphdmFTY3JpcHQgZmFsbGJhY2sgbW9kZS5cblxuWW91ciBwcm9tcHQ6IFwiJHtwcm9tcHQuc2xpY2UoMCwgMTAwKX0ke3Byb21wdC5sZW5ndGggPiAxMDAgPyAnLi4uJyA6ICcnfVwiXG5cblRvIGVuYWJsZSBuYXRpdmUgU0lNRCBpbmZlcmVuY2U6XG4xLiBJbnN0YWxsIHRoZSBuYXRpdmUgYmluZGluZ3M6IG5wbSBpbnN0YWxsIEBydXZlY3Rvci9ydXZsbG0tJHtwcm9jZXNzLnBsYXRmb3JtfS0ke3Byb2Nlc3MuYXJjaH1cbjIuIE9yIGxvYWQgYSBHR1VGIG1vZGVsIGZpbGVcbjMuIE9yIGNvbm5lY3QgdG8gYW4gZXh0ZXJuYWwgTExNIEFQSVxuXG5Db25maWc6IHRlbXA9JHt0ZW1wLnRvRml4ZWQoMil9LCB0b3BfcD0ke3RvcFAudG9GaXhlZCgyKX0sIG1heF90b2tlbnM9JHttYXhUb2tlbnN9XG5cblRoaXMgZmFsbGJhY2sgcHJvdmlkZXMgcm91dGluZywgbWVtb3J5LCBhbmQgZW1iZWRkaW5nIGZlYXR1cmVzIGJ1dCBub3QgZnVsbCB0ZXh0IGdlbmVyYXRpb24uYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcm91dGluZyBkZWNpc2lvbiBmb3IgYSBxdWVyeVxuICAgKi9cbiAgcm91dGUodGV4dDogc3RyaW5nKTogUm91dGluZ0RlY2lzaW9uIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlLnJvdXRlKHRleHQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZWw6IHJlc3VsdC5tb2RlbCBhcyBhbnksXG4gICAgICAgIGNvbnRleHRTaXplOiByZXN1bHQuY29udGV4dFNpemUgPz8gcmVzdWx0LmNvbnRleHRfc2l6ZSxcbiAgICAgICAgdGVtcGVyYXR1cmU6IHJlc3VsdC50ZW1wZXJhdHVyZSxcbiAgICAgICAgdG9wUDogcmVzdWx0LnRvcFAgPz8gcmVzdWx0LnRvcF9wLFxuICAgICAgICBjb25maWRlbmNlOiByZXN1bHQuY29uZmlkZW5jZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2tcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWw6ICdNNzAwJyxcbiAgICAgIGNvbnRleHRTaXplOiA1MTIsXG4gICAgICB0ZW1wZXJhdHVyZTogMC43LFxuICAgICAgdG9wUDogMC45LFxuICAgICAgY29uZmlkZW5jZTogMC41LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIG1lbW9yeSBmb3Igc2ltaWxhciBjb250ZW50XG4gICAqL1xuICBzZWFyY2hNZW1vcnkodGV4dDogc3RyaW5nLCBrID0gMTApOiBNZW1vcnlSZXN1bHRbXSB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5uYXRpdmUuc2VhcmNoTWVtb3J5KHRleHQsIGspO1xuICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKHIgPT4ge1xuICAgICAgICAvLyBUaGUgbmF0aXZlIHNpZGUgcmVwb3J0cyBgZGlzdGFuY2VgIChzbWFsbGVyIGlzIGNsb3NlcikuIE1lbW9yeVJlc3VsdFxuICAgICAgICAvLyBkb2N1bWVudHMgYHNjb3JlYCBhcyBhIHNpbWlsYXJpdHksIHNvIGNvbnZlcnQgcmF0aGVyIHRoYW4gcGFzc2luZyBhXG4gICAgICAgIC8vIGRpc3RhbmNlIHRocm91Z2ggdW5kZXIgYSBzaW1pbGFyaXR5J3MgbmFtZS4gT2xkZXIgYnVpbGRzIHRoYXQgYWxyZWFkeVxuICAgICAgICAvLyBlbWl0IGBzY29yZWAgYXJlIHVzZWQgYXMtaXMuXG4gICAgICAgIGNvbnN0IGFueVIgPSByIGFzIGFueTtcbiAgICAgICAgY29uc3Qgc2NvcmUgPVxuICAgICAgICAgIHR5cGVvZiBhbnlSLnNjb3JlID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBhbnlSLnNjb3JlXG4gICAgICAgICAgICA6IHR5cGVvZiBhbnlSLmRpc3RhbmNlID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICA/IDEgLyAoMSArIE1hdGgubWF4KDAsIGFueVIuZGlzdGFuY2UpKVxuICAgICAgICAgICAgICA6IDA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgICAgc2NvcmUsXG4gICAgICAgICAgY29udGVudDogci5jb250ZW50LFxuICAgICAgICAgIG1ldGFkYXRhOiBKU09OLnBhcnNlKHIubWV0YWRhdGEgfHwgJ3t9JyksXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAtIHNpbXBsZSBzZWFyY2hcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmZhbGxiYWNrU3RhdGUubWVtb3J5LmVudHJpZXMoKSlcbiAgICAgIC5zbGljZSgwLCBrKVxuICAgICAgLm1hcCgoW2lkLCBkYXRhXSkgPT4gKHtcbiAgICAgICAgaWQsXG4gICAgICAgIHNjb3JlOiAwLjUsXG4gICAgICAgIGNvbnRlbnQ6IGRhdGEuY29udGVudCxcbiAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGNvbnRlbnQgdG8gbWVtb3J5XG4gICAqL1xuICBhZGRNZW1vcnkoY29udGVudDogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogTWVtb3J5SWQge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmFkZE1lbW9yeShjb250ZW50LCBtZXRhZGF0YSA/IEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2tcbiAgICBjb25zdCBpZCA9IHRoaXMuZmFsbGJhY2tTdGF0ZS5uZXh0SWQrKztcbiAgICB0aGlzLmZhbGxiYWNrU3RhdGUubWVtb3J5LnNldChpZCwge1xuICAgICAgY29udGVudCxcbiAgICAgIGVtYmVkZGluZzogdGhpcy5lbWJlZChjb250ZW50KSxcbiAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSA/PyB7fSxcbiAgICB9KTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBmZWVkYmFjayBmb3IgbGVhcm5pbmdcbiAgICovXG4gIGZlZWRiYWNrKGZiOiBGZWVkYmFjayk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmZlZWRiYWNrKGZiLnJlcXVlc3RJZCwgZmIucmF0aW5nLCBmYi5jb3JyZWN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbmdpbmUgc3RhdGlzdGljc1xuICAgKi9cbiAgc3RhdHMoKTogUnV2TExNU3RhdHMge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgY29uc3QgcyA9IHRoaXMubmF0aXZlLnN0YXRzKCk7XG4gICAgICAvLyBNYXAgbmF0aXZlIHN0YXRzIChzbmFrZV9jYXNlKSB0byBUeXBlU2NyaXB0IGludGVyZmFjZSAoY2FtZWxDYXNlKVxuICAgICAgLy8gSGFuZGxlIGJvdGggb2xkIGFuZCBuZXcgZmllbGQgbmFtZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsUXVlcmllczogKHMgYXMgYW55KS50b3RhbFF1ZXJpZXMgPz8gcy50b3RhbF9xdWVyaWVzID8/IDAsXG4gICAgICAgIG1lbW9yeU5vZGVzOiAocyBhcyBhbnkpLm1lbW9yeU5vZGVzID8/IHMubWVtb3J5X25vZGVzID8/IDAsXG4gICAgICAgIHBhdHRlcm5zTGVhcm5lZDpcbiAgICAgICAgICAocyBhcyBhbnkpLnRyYWluaW5nU3RlcHMgPz9cbiAgICAgICAgICBzLnBhdHRlcm5zX2xlYXJuZWQgPz9cbiAgICAgICAgICAocyBhcyBhbnkpLnRyYWluaW5nX3N0ZXBzID8/XG4gICAgICAgICAgMCxcbiAgICAgICAgYXZnTGF0ZW5jeU1zOiAocyBhcyBhbnkpLmF2Z0xhdGVuY3lNcyA/PyBzLmF2Z19sYXRlbmN5X21zID8/IDAsXG4gICAgICAgIGNhY2hlSGl0UmF0ZTogKHMgYXMgYW55KS5jYWNoZUhpdFJhdGUgPz8gcy5jYWNoZV9oaXRfcmF0ZSA/PyAwLFxuICAgICAgICByb3V0ZXJBY2N1cmFjeTogKHMgYXMgYW55KS5yb3V0ZXJBY2N1cmFjeSA/PyBzLnJvdXRlcl9hY2N1cmFjeSA/PyAwLjUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsUXVlcmllczogdGhpcy5mYWxsYmFja1N0YXRlLnF1ZXJ5Q291bnQsXG4gICAgICBtZW1vcnlOb2RlczogdGhpcy5mYWxsYmFja1N0YXRlLm1lbW9yeS5zaXplLFxuICAgICAgcGF0dGVybnNMZWFybmVkOiAwLFxuICAgICAgYXZnTGF0ZW5jeU1zOiAxLjAsXG4gICAgICBjYWNoZUhpdFJhdGU6IDAuMCxcbiAgICAgIHJvdXRlckFjY3VyYWN5OiAwLjUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSByb3V0ZXIgbGVhcm5pbmcgY3ljbGVcbiAgICovXG4gIGZvcmNlTGVhcm4oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5mb3JjZUxlYXJuKCk7XG4gICAgfVxuICAgIHJldHVybiAnTGVhcm5pbmcgbm90IGF2YWlsYWJsZSBpbiBmYWxsYmFjayBtb2RlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW1iZWRkaW5nIGZvciB0ZXh0XG4gICAqL1xuICBlbWJlZCh0ZXh0OiBzdHJpbmcpOiBFbWJlZGRpbmcge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmVtYmVkKHRleHQpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIC0gc2ltcGxlIGhhc2gtYmFzZWQgZW1iZWRkaW5nXG4gICAgY29uc3QgZGltID0gdGhpcy5jb25maWcuZW1iZWRkaW5nRGltID8/IDc2ODtcbiAgICBjb25zdCBlbWJlZGRpbmcgPSBuZXcgQXJyYXkoZGltKS5maWxsKDApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpZHggPSAodGV4dC5jaGFyQ29kZUF0KGkpICogKGkgKyAxKSkgJSBkaW07XG4gICAgICBlbWJlZGRpbmdbaWR4XSArPSAwLjE7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplXG4gICAgY29uc3Qgbm9ybSA9IE1hdGguc3FydChlbWJlZGRpbmcucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHggKiB4LCAwKSkgfHwgMTtcbiAgICByZXR1cm4gZW1iZWRkaW5nLm1hcCh4ID0+IHggLyBub3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gdGV4dHNcbiAgICovXG4gIHNpbWlsYXJpdHkodGV4dDE6IHN0cmluZywgdGV4dDI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICAvLyBmMzIgYWNjdW11bGF0aW9uIGNhbiBsYW5kIGp1c3Qgb3V0c2lkZSB0aGUgbWF0aGVtYXRpY2FsIHJhbmdlIOKAlCBhblxuICAgICAgLy8gaWRlbnRpY2FsIHBhaXIgbWVhc3VyZXMgMS4wMDAwMDAxIOKAlCB3aGljaCB0dXJucyBNYXRoLmFjb3Moc2ltKSBpbnRvXG4gICAgICAvLyBOYU4gZG93bnN0cmVhbS4gQ29zaW5lIHNpbWlsYXJpdHkgaXMgZGVmaW5lZCBvbiBbLTEsIDFdLCBzbyBjbGFtcC5cbiAgICAgIGNvbnN0IHJhdyA9IHRoaXMubmF0aXZlLnNpbWlsYXJpdHkodGV4dDEsIHRleHQyKTtcbiAgICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgtMSwgcmF3KSk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgLSBjb3NpbmUgc2ltaWxhcml0eVxuICAgIGNvbnN0IGVtYjEgPSB0aGlzLmVtYmVkKHRleHQxKTtcbiAgICBjb25zdCBlbWIyID0gdGhpcy5lbWJlZCh0ZXh0Mik7XG5cbiAgICBsZXQgZG90ID0gMDtcbiAgICBsZXQgbm9ybTEgPSAwO1xuICAgIGxldCBub3JtMiA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVtYjEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRvdCArPSBlbWIxW2ldICogZW1iMltpXTtcbiAgICAgIG5vcm0xICs9IGVtYjFbaV0gKiBlbWIxW2ldO1xuICAgICAgbm9ybTIgKz0gZW1iMltpXSAqIGVtYjJbaV07XG4gICAgfVxuXG4gICAgY29uc3QgZGVub20gPSBNYXRoLnNxcnQobm9ybTEpICogTWF0aC5zcXJ0KG5vcm0yKTtcbiAgICBjb25zdCBzaW1pbGFyaXR5ID0gZGVub20gPiAwID8gZG90IC8gZGVub20gOiAwO1xuICAgIC8vIENsYW1wIHRvIFswLCAxXSB0byBoYW5kbGUgZmxvYXRpbmcgcG9pbnQgZXJyb3JzXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHNpbWlsYXJpdHkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBTSU1EIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgaGFzU2ltZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5oYXNTaW1kKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgU0lNRCBjYXBhYmlsaXRpZXNcbiAgICovXG4gIHNpbWRDYXBhYmlsaXRpZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLnNpbWRDYXBhYmlsaXRpZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIFsnU2NhbGFyIChmYWxsYmFjayknXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBxdWVyeSBtdWx0aXBsZSBwcm9tcHRzXG4gICAqL1xuICBiYXRjaFF1ZXJ5KHJlcXVlc3Q6IEJhdGNoUXVlcnlSZXF1ZXN0KTogQmF0Y2hRdWVyeVJlc3BvbnNlIHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVxdWVzdC5xdWVyaWVzLm1hcChxID0+IHRoaXMucXVlcnkocSwgcmVxdWVzdC5jb25maWcpKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzcG9uc2VzLFxuICAgICAgdG90YWxMYXRlbmN5TXM6IERhdGUubm93KCkgLSBzdGFydCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG5hdGl2ZSBtb2R1bGUgaXMgbG9hZGVkXG4gICAqL1xuICBpc05hdGl2ZUxvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYXRpdmUgIT09IG51bGw7XG4gIH1cbn1cbiJdfQ==
|
|
552
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQXFCSCxxQ0FPa0I7QUFFbEI7O0dBRUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFxQjtJQUMzQyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRTlCLE9BQU87UUFDTCxhQUFhLEVBQUUsTUFBTSxDQUFDLFlBQVk7UUFDbEMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGVBQWU7UUFDekMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ3BCLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0I7UUFDL0MsY0FBYyxFQUFFLE1BQU0sQ0FBQyxZQUFZO1FBQ25DLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxlQUFlO1FBQ3hDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDMUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTO0tBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE1BQXlCO0lBQ2xELElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFOUIsMEVBQTBFO0lBQzFFLE9BQU87UUFDTCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDM0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtRQUMzQyxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7UUFDbkMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO0tBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxDQUF5QjtJQUNuRCxPQUFPO1FBQ0wsSUFBSSxFQUFF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O0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUF2ZEQsd0JBdWRDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSdXZMTE0gRW5naW5lIC0gTWFpbiBvcmNoZXN0cmF0b3IgZm9yIHNlbGYtbGVhcm5pbmcgTExNXG4gKi9cblxuaW1wb3J0IHtcbiAgUnV2TExNQ29uZmlnLFxuICBHZW5lcmF0aW9uQ29uZmlnLFxuICBRdWVyeVJlc3BvbnNlLFxuICBSb3V0aW5nRGVjaXNpb24sXG4gIE1lbW9yeVJlc3VsdCxcbiAgTWVtb3J5SWQsXG4gIFJ1dkxMTVN0YXRzLFxuICBGZWVkYmFjayxcbiAgRW1iZWRkaW5nLFxuICBCYXRjaFF1ZXJ5UmVxdWVzdCxcbiAgQmF0Y2hRdWVyeVJlc3BvbnNlLFxuICBDaGF0TWVzc2FnZSxcbiAgRmluaXNoUmVhc29uLFxuICBHZW5lcmF0aW9uUmVzdWx0LFxuICBMb2FkTW9kZWxPcHRpb25zLFxuICBMb2FkZWRNb2RlbEluZm8sXG59IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQge1xuICBnZXROYXRpdmVNb2R1bGUsXG4gIE5hdGl2ZUVuZ2luZSxcbiAgTmF0aXZlQ29uZmlnLFxuICBOYXRpdmVHZW5Db25maWcsXG4gIE5hdGl2ZUdlbmVyYXRpb25SZXN1bHQsXG4gIE5hdGl2ZU1vZGVsSW5mbyxcbn0gZnJvbSAnLi9uYXRpdmUnO1xuXG4vKipcbiAqIENvbnZlcnQgSlMgY29uZmlnIHRvIG5hdGl2ZSBjb25maWcgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIHRvTmF0aXZlQ29uZmlnKGNvbmZpZz86IFJ1dkxMTUNvbmZpZyk6IE5hdGl2ZUNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgZW1iZWRkaW5nX2RpbTogY29uZmlnLmVtYmVkZGluZ0RpbSxcbiAgICByb3V0ZXJfaGlkZGVuX2RpbTogY29uZmlnLnJvdXRlckhpZGRlbkRpbSxcbiAgICBobnN3X206IGNvbmZpZy5obnN3TSxcbiAgICBobnN3X2VmX2NvbnN0cnVjdGlvbjogY29uZmlnLmhuc3dFZkNvbnN0cnVjdGlvbixcbiAgICBobnN3X2VmX3NlYXJjaDogY29uZmlnLmhuc3dFZlNlYXJjaCxcbiAgICBsZWFybmluZ19lbmFibGVkOiBjb25maWcubGVhcm5pbmdFbmFibGVkLFxuICAgIHF1YWxpdHlfdGhyZXNob2xkOiBjb25maWcucXVhbGl0eVRocmVzaG9sZCxcbiAgICBld2NfbGFtYmRhOiBjb25maWcuZXdjTGFtYmRhLFxuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnQgSlMgZ2VuZXJhdGlvbiBjb25maWcgdG8gbmF0aXZlIGZvcm1hdFxuICovXG5mdW5jdGlvbiB0b05hdGl2ZUdlbkNvbmZpZyhjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKTogTmF0aXZlR2VuQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gY2FtZWxDYXNlOiBuYXBpLXJzIGlnbm9yZXMgc25ha2VfY2FzZSBrZXlzIG9uIGAjW25hcGkob2JqZWN0KV1gIGlucHV0cy5cbiAgcmV0dXJuIHtcbiAgICBtYXhUb2tlbnM6IGNvbmZpZy5tYXhUb2tlbnMsXG4gICAgdGVtcGVyYXR1cmU6IGNvbmZpZy50ZW1wZXJhdHVyZSxcbiAgICB0b3BQOiBjb25maWcudG9wUCxcbiAgICB0b3BLOiBjb25maWcudG9wSyxcbiAgICByZXBldGl0aW9uUGVuYWx0eTogY29uZmlnLnJlcGV0aXRpb25QZW5hbHR5LFxuICAgIHN0b3BTZXF1ZW5jZXM6IGNvbmZpZy5zdG9wU2VxdWVuY2VzLFxuICAgIHNlZWQ6IGNvbmZpZy5zZWVkLFxuICB9O1xufVxuXG5mdW5jdGlvbiB0b0dlbmVyYXRpb25SZXN1bHQocjogTmF0aXZlR2VuZXJhdGlvblJlc3VsdCk6IEdlbmVyYXRpb25SZXN1bHQge1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHIudGV4dCxcbiAgICBwcm9tcHRUb2tlbnM6IHIucHJvbXB0VG9rZW5zLFxuICAgIGNvbXBsZXRpb25Ub2tlbnM6IHIuY29tcGxldGlvblRva2VucyxcbiAgICBmaW5pc2hSZWFzb246IHIuZmluaXNoUmVhc29uIGFzIEZpbmlzaFJlYXNvbixcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9Nb2RlbEluZm8oaTogTmF0aXZlTW9kZWxJbmZvKTogTG9hZGVkTW9kZWxJbmZvIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBpLm5hbWUsXG4gICAgYXJjaGl0ZWN0dXJlOiBpLmFyY2hpdGVjdHVyZSxcbiAgICBudW1QYXJhbWV0ZXJzOiBpLm51bVBhcmFtZXRlcnMsXG4gICAgdm9jYWJTaXplOiBpLnZvY2FiU2l6ZSxcbiAgICBoaWRkZW5TaXplOiBpLmhpZGRlblNpemUsXG4gICAgbnVtTGF5ZXJzOiBpLm51bUxheWVycyxcbiAgICBtYXhDb250ZXh0TGVuZ3RoOiBpLm1heENvbnRleHRMZW5ndGgsXG4gICAgcXVhbnRpemF0aW9uOiBpLnF1YW50aXphdGlvbiA/PyBudWxsLFxuICAgIG1lbW9yeVVzYWdlQnl0ZXM6IGkubWVtb3J5VXNhZ2VCeXRlcyxcbiAgICBjaGF0VGVtcGxhdGU6IGkuY2hhdFRlbXBsYXRlID8/IG51bGwsXG4gIH07XG59XG5cbmNvbnN0IHdhcm5lZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKiogV2FybiBvbmNlIHBlciBwcm9jZXNzIChvciB0aHJvdyB3aGVuIGBzdHJpY3RgKS4gKi9cbmZ1bmN0aW9uIG5vdGljZShjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgc3RyaWN0OiBib29sZWFuIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChzdHJpY3QpIHRocm93IGNvZGVkRXJyb3IoY29kZSwgbWVzc2FnZSk7XG4gIGlmICh3YXJuZWQuaGFzKGNvZGUpKSByZXR1cm47XG4gIHdhcm5lZC5hZGQoY29kZSk7XG4gIGNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIHVua25vd24gYXMge1xuICAgIHByb2Nlc3M/OiB7IGVtaXRXYXJuaW5nPzogKG06IHN0cmluZywgbz86IHsgY29kZT86IHN0cmluZyB9KSA9PiB2b2lkIH07XG4gICAgY29uc29sZT86IHsgd2Fybj86IChtOiBzdHJpbmcpID0+IHZvaWQgfTtcbiAgfTtcbiAgaWYgKHR5cGVvZiBnLnByb2Nlc3M/LmVtaXRXYXJuaW5nID09PSAnZnVuY3Rpb24nKSBnLnByb2Nlc3MuZW1pdFdhcm5pbmcobWVzc2FnZSwgeyBjb2RlIH0pO1xuICBlbHNlIGcuY29uc29sZT8ud2Fybj8uKGAke2NvZGV9OiAke21lc3NhZ2V9YCk7XG59XG5cbi8qKiBBbiBFcnJvciB3aG9zZSBtZXNzYWdlIHN0YXJ0cyB3aXRoLCBhbmQgd2hvc2UgYGNvZGVgIGlzLCBgY29kZWAuICovXG5mdW5jdGlvbiBjb2RlZEVycm9yKGNvZGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogRXJyb3IgJiB7IGNvZGU6IHN0cmluZyB9IHtcbiAgY29uc3QgZXJyID0gbmV3IEVycm9yKGAke2NvZGV9OiAke21lc3NhZ2V9YCkgYXMgRXJyb3IgJiB7IGNvZGU6IHN0cmluZyB9O1xuICBlcnIuY29kZSA9IGNvZGU7XG4gIHJldHVybiBlcnI7XG59XG5cbi8qKlxuICogQ2FsbCBpbnRvIHRoZSBuYXRpdmUgZW5naW5lLCBnaXZpbmcgaXRzIGVycm9ycyB0aGUgc2FtZSBgY29kZWAgYXMgdGhlXG4gKiB3cmFwcGVyJ3Mgb3duOiBuYXRpdmUgbWVzc2FnZXMgc3RhcnQgd2l0aCBgUlVWTExNXzxDT0RFPjpgLCBidXQgbmFwaS1yc1xuICogc2V0cyBgY29kZWAgdG8gYSBnZW5lcmljIHN0YXR1cyBzdWNoIGFzIGBHZW5lcmljRmFpbHVyZWAuXG4gKi9cbmZ1bmN0aW9uIGNhbGxOYXRpdmU8VD4oZjogKCkgPT4gVCk6IFQge1xuICB0cnkge1xuICAgIHJldHVybiBmKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCBtYXRjaCA9IC9eKFJVVkxMTV9bQS1aX10rKTovLmV4ZWMoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogJycpO1xuICAgIGlmIChtYXRjaCkgKGUgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGUgPSBtYXRjaFsxXTtcbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBsYXRmb3JtS2V5KCk6IHN0cmluZyB7XG4gIGNvbnN0IHAgPSAoZ2xvYmFsVGhpcyBhcyB7IHByb2Nlc3M/OiB7IHBsYXRmb3JtPzogc3RyaW5nOyBhcmNoPzogc3RyaW5nIH0gfSkucHJvY2VzcztcbiAgcmV0dXJuIGAke3A/LnBsYXRmb3JtID8/ICd1bmtub3duJ30tJHtwPy5hcmNoID8/ICd1bmtub3duJ31gO1xufVxuXG5mdW5jdGlvbiBlbnZBbGxvd3NQbGFjZWhvbGRlcigpOiBib29sZWFuIHtcbiAgY29uc3QgcCA9IChnbG9iYWxUaGlzIGFzIHsgcHJvY2Vzcz86IHsgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnByb2Nlc3M7XG4gIHJldHVybiBwPy5lbnY/LlJVVkxMTV9BTExPV19NT0NLID09PSAnMSc7XG59XG5cbi8qKiBSZXR1cm5lZCBieSBnZW5lcmF0ZSgpL3F1ZXJ5KCkgb25seSB3aXRoIGBhbGxvd1BsYWNlaG9sZGVyYCAvIGBSVVZMTE1fQUxMT1dfTU9DSz0xYC4gKi9cbmV4cG9ydCBjb25zdCBQTEFDRUhPTERFUl9URVhUID1cbiAgJ1tSdXZMTE0gcGxhY2Vob2xkZXI6IG5vIGxhbmd1YWdlIG1vZGVsIGlzIGxvYWRlZDsgdGhpcyB0ZXh0IGlzIG5vdCBtb2RlbCBvdXRwdXRdJztcblxuLyoqXG4gKiBSdXZMTE0gLSBTZWxmLWxlYXJuaW5nIExMTSBvcmNoZXN0cmF0b3JcbiAqXG4gKiBDb21iaW5lcyBTT05BIGFkYXB0aXZlIGxlYXJuaW5nIHdpdGggSE5TVyBtZW1vcnksIEZhc3RHUk5OIHJvdXRpbmcsIGFuZFxuICogR0dVRiBpbmZlcmVuY2UgdGhyb3VnaCB0aGUgbmF0aXZlIGNhbmRsZSBiYWNrZW5kLlxuICpcbiAqIFRleHQgY29tZXMgb25seSBmcm9tIGEgbW9kZWwgbG9hZGVkIHdpdGggYGxvYWRNb2RlbCgpYCAob3IgdGhlIGBtb2RlbFBhdGhgXG4gKiBvcHRpb24pLiBXaXRob3V0IG9uZSwgYGdlbmVyYXRlKClgLCBgcXVlcnkoKWAsIGBjaGF0KClgIGFuZFxuICogYGdlbmVyYXRlRGV0YWlsZWQoKWAgdGhyb3cgYFJVVkxMTV9OT19MQU5HVUFHRV9NT0RFTGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFJ1dkxMTSB9IGZyb20gJ0BydXZlY3Rvci9ydXZsbG0nO1xuICpcbiAqIGNvbnN0IGxsbSA9IG5ldyBSdXZMTE0oKTtcbiAqIGxsbS5sb2FkTW9kZWwoJy4vcXdlbjIuNS0wLjViLWluc3RydWN0LXE0X2tfbS5nZ3VmJyk7XG4gKlxuICogY29uc3Qgb3V0ID0gbGxtLmNoYXQoW3sgcm9sZTogJ3VzZXInLCBjb250ZW50OiAnV2hhdCBpcyBtYWNoaW5lIGxlYXJuaW5nPycgfV0sIHtcbiAqICAgbWF4VG9rZW5zOiAxMjgsXG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKG91dC50ZXh0LCBvdXQuZmluaXNoUmVhc29uLCBvdXQuY29tcGxldGlvblRva2Vucyk7XG4gKlxuICogLy8gUm91dGVkIHF1ZXJ5LCBhbnN3ZXJlZCBieSB0aGUgbG9hZGVkIG1vZGVsXG4gKiBjb25zdCByZXNwb25zZSA9IGxsbS5xdWVyeSgnV2hhdCBpcyBtYWNoaW5lIGxlYXJuaW5nPycpO1xuICogbGxtLmZlZWRiYWNrKHsgcmVxdWVzdElkOiByZXNwb25zZS5yZXF1ZXN0SWQsIHJhdGluZzogNSB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUnV2TExNIHtcbiAgcHJpdmF0ZSBuYXRpdmU6IE5hdGl2ZUVuZ2luZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG5hdGl2ZVZlcnNpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbmZpZzogUnV2TExNQ29uZmlnO1xuICBwcml2YXRlIGFsbG93UGxhY2Vob2xkZXI6IGJvb2xlYW47XG5cbiAgLy8gRmFsbGJhY2sgc3RhdGUgZm9yIHdoZW4gbmF0aXZlIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlXG4gIHByaXZhdGUgZmFsbGJhY2tTdGF0ZSA9IHtcbiAgICBtZW1vcnk6IG5ldyBNYXA8bnVtYmVyLCB7IGNvbnRlbnQ6IHN0cmluZzsgZW1iZWRkaW5nOiBudW1iZXJbXTsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KCksXG4gICAgbmV4dElkOiAxLFxuICAgIHF1ZXJ5Q291bnQ6IDAsXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBSdXZMTE0gaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IFJ1dkxMTUNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnID8/IHt9O1xuICAgIHRoaXMuYWxsb3dQbGFjZWhvbGRlciA9IHRoaXMuY29uZmlnLmFsbG93UGxhY2Vob2xkZXIgPT09IHRydWUgfHwgZW52QWxsb3dzUGxhY2Vob2xkZXIoKTtcbiAgICBjb25zdCBleHRyYSA9IHRoaXMuY29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChleHRyYS5iYWNrZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5vdGljZShcbiAgICAgICAgJ1JVVkxMTV9VTlNVUFBPUlRFRF9PUFRJT04nLFxuICAgICAgICAnYGJhY2tlbmRgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQHJ1dmVjdG9yL3J1dmxsbSBhbmQgaXMgaWdub3JlZDogbW9kZWxzIGxvYWRlZCB3aXRoICcgK1xuICAgICAgICAgICdsb2FkTW9kZWwoKSBydW4gb24gdGhlIGJ1aWx0LWluIGNhbmRsZSBiYWNrZW5kLicsXG4gICAgICAgIHRoaXMuY29uZmlnLnN0cmljdCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kID0gZ2V0TmF0aXZlTW9kdWxlKCk7XG4gICAgaWYgKG1vZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5uYXRpdmUgPSBuZXcgbW9kLlJ1dkxMTUVuZ2luZSh0b05hdGl2ZUNvbmZpZyhjb25maWcpKTtcbiAgICAgICAgdGhpcy5uYXRpdmVWZXJzaW9uID0gbW9kLnZlcnNpb24oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTaWxlbnRseSBmYWxsIGJhY2sgdG8gSlMgaW1wbGVtZW50YXRpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcubW9kZWxQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9hZE1vZGVsKHRoaXMuY29uZmlnLm1vZGVsUGF0aCwgdGhpcy5jb25maWcubW9kZWxPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbmF0aXZlIGJpbmFyeSBjYW4gbG9hZCBhbmQgcnVuIGEgbGFuZ3VhZ2UgbW9kZWwuIEZhbHNlXG4gICAqIHdpdGhvdXQgYSBuYXRpdmUgYmluYXJ5LCBmb3IgYmluYXJpZXMgdGhhdCBwcmVkYXRlIGBsb2FkTW9kZWxgICh0aGUgMi4wLnhcbiAgICogYEBydXZlY3Rvci9ydXZsbG0tPHBsYXRmb3JtPmAgcGFja2FnZXMpLCBhbmQgZm9yIGJpbmFyaWVzIGJ1aWx0IHdpdGhvdXRcbiAgICogdGhlIGBjYW5kbGVgIGluZmVyZW5jZSBiYWNrZW5kLlxuICAgKi9cbiAgc3VwcG9ydHNNb2RlbExvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbmF0aXZlID0gdGhpcy5uYXRpdmU7XG4gICAgaWYgKHR5cGVvZiBuYXRpdmU/LmxvYWRNb2RlbCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEJ1aWxkcyB0aGF0IHByZWRhdGUgdGhpcyBwcm9iZSBhbGwgaGFkIHRoZSBiYWNrZW5kICh0aGV5IHdlcmUgbG9jYWxcbiAgICAvLyBgbnBtIHJ1biBidWlsZDpuYXRpdmVgIGJ1aWxkcywgd2hpY2ggZW5hYmxlIGBjYW5kbGVgKS5cbiAgICByZXR1cm4gdHlwZW9mIG5hdGl2ZS5zdXBwb3J0c01vZGVsTG9hZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IG5hdGl2ZS5zdXBwb3J0c01vZGVsTG9hZGluZygpIDogdHJ1ZTtcbiAgfVxuXG4gIC8qKiBFcnJvciBmb3IgYSBiaW5hcnkgdGhhdCBoYXMgYGxvYWRNb2RlbGAgYnV0IG5vIGluZmVyZW5jZSBiYWNrZW5kLiAqL1xuICBwcml2YXRlIG5vQmFja2VuZEVycm9yKCk6IEVycm9yIHtcbiAgICByZXR1cm4gY29kZWRFcnJvcihcbiAgICAgICdSVVZMTE1fTk9fSU5GRVJFTkNFX0JBQ0tFTkQnLFxuICAgICAgYHRoZSBpbnN0YWxsZWQgbmF0aXZlIGJpbmFyeSAodmVyc2lvbiAke3RoaXMubmF0aXZlVmVyc2lvbiA/PyAndW5rbm93bid9KSB3YXMgYnVpbHQgYCArXG4gICAgICAgICd3aXRob3V0IHRoZSBgY2FuZGxlYCBpbmZlcmVuY2UgYmFja2VuZCBhbmQgY2Fubm90IGxvYWQgbW9kZWxzLiBSZWJ1aWxkIGl0IHdpdGggJyArXG4gICAgICAgICdgbnBtIHJ1biBidWlsZDpuYXRpdmVgICh3aGljaCBlbmFibGVzIGBjYW5kbGVgKSBhbmQgc2V0IFJVVkxMTV9OQVRJVkVfUEFUSCB0byBpdCwgJyArXG4gICAgICAgICdvciB1c2UgdGhlIHJ1dmxsbSBDTEkgKGBydXZsbG0gc2VydmUgPG1vZGVsPmApLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgR0dVRiBtb2RlbCAob3IgYSBkaXJlY3RvcnkgaG9sZGluZyBvbmUpIGZvciBgZ2VuZXJhdGUoKWAsXG4gICAqIGBjaGF0KClgIGFuZCBgcXVlcnkoKWAuIFN1cHBvcnRlZCBHR1VGIGFyY2hpdGVjdHVyZXM6IGxsYW1hLCBtaXN0cmFsLFxuICAgKiBxd2VuMiwgcXdlbjM7IG90aGVycyBmYWlsIHdpdGggYW4gZXJyb3IgbmFtaW5nIHRoZSBhcmNoaXRlY3R1cmUuIFRoZVxuICAgKiB0b2tlbml6ZXIgY29tZXMgZnJvbSBhIGB0b2tlbml6ZXIuanNvbmAgYmVzaWRlIHRoZSBmaWxlLCBlbHNlIGZyb20gdGhlXG4gICAqIEdHVUYgaXRzZWxmLiBSZXBsYWNlcyBhbnkgbG9hZGVkIG1vZGVsOyBpZiBsb2FkaW5nIGZhaWxzLCBubyBtb2RlbCBpc1xuICAgKiBsb2FkZWQuIFN5bmNocm9ub3VzOiBibG9ja3MgdGhlIGV2ZW50IGxvb3Agd2hpbGUgdGhlIHdlaWdodHMgbG9hZC5cbiAgICpcbiAgICogQHRocm93cyBgUlVWTExNX05BVElWRV9VTkFWQUlMQUJMRWAgd2l0aG91dCBhIG5hdGl2ZSBiaW5hcnksXG4gICAqICAgYFJVVkxMTV9OQVRJVkVfVE9PX09MRGAgd2hlbiB0aGUgYmluYXJ5IHByZWRhdGVzIG1vZGVsIGxvYWRpbmcsXG4gICAqICAgYFJVVkxMTV9OT19JTkZFUkVOQ0VfQkFDS0VORGAgd2hlbiBpdCB3YXMgYnVpbHQgd2l0aG91dCBgY2FuZGxlYCxcbiAgICogICBgUlVWTExNX01PREVMX05PVF9GT1VORGAgLyBgUlVWTExNX01PREVMX0xPQURfRkFJTEVEYCBmcm9tIHRoZSBiYWNrZW5kLlxuICAgKi9cbiAgbG9hZE1vZGVsKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IExvYWRNb2RlbE9wdGlvbnMpOiBMb2FkZWRNb2RlbEluZm8ge1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycgfHwgcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xvYWRNb2RlbDogcGF0aCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubmF0aXZlKSB7XG4gICAgICB0aHJvdyBjb2RlZEVycm9yKFxuICAgICAgICAnUlVWTExNX05BVElWRV9VTkFWQUlMQUJMRScsXG4gICAgICAgIGBubyBuYXRpdmUgUnV2TExNIGJpbmFyeSBjb3VsZCBiZSBsb2FkZWQgZm9yICR7cGxhdGZvcm1LZXkoKX0sIHNvIG1vZGVscyBjYW5ub3QgYmUgYCArXG4gICAgICAgICAgJ2xvYWRlZC4gSW5zdGFsbCB0aGUgbWF0Y2hpbmcgQHJ1dmVjdG9yL3J1dmxsbS08cGxhdGZvcm0+IHBhY2thZ2UsIG9yIGJ1aWxkIG9uZSAnICtcbiAgICAgICAgICAnKGBucG0gcnVuIGJ1aWxkOm5hdGl2ZWApIGFuZCBzZXQgUlVWTExNX05BVElWRV9QQVRIIHRvIGl0LicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMubmF0aXZlLmxvYWRNb2RlbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgY29kZWRFcnJvcihcbiAgICAgICAgJ1JVVkxMTV9OQVRJVkVfVE9PX09MRCcsXG4gICAgICAgIGB0aGUgaW5zdGFsbGVkIG5hdGl2ZSBiaW5hcnkgKHZlcnNpb24gJHt0aGlzLm5hdGl2ZVZlcnNpb24gPz8gJ3Vua25vd24nfSkgY2Fubm90IGxvYWQgYCArXG4gICAgICAgICAgJ21vZGVsczogaXQgcHJlZGF0ZXMgbG9hZE1vZGVsKCkuIFRoZSBAcnV2ZWN0b3IvcnV2bGxtLTxwbGF0Zm9ybT4gMi4wLnggcGFja2FnZXMgYXJlICcgK1xuICAgICAgICAgICdzdWNoIGJ1aWxkcy4gSW5zdGFsbCB0aGUgMy54IHBsYXRmb3JtIHBhY2thZ2UsIG9yIGJ1aWxkIHRoZSBiaW5hcnkgZnJvbSBzb3VyY2UgJyArXG4gICAgICAgICAgJyhgbnBtIHJ1biBidWlsZDpuYXRpdmVgLCB3aGljaCBlbmFibGVzIHRoZSBgY2FuZGxlYCBmZWF0dXJlKSBhbmQgc2V0ICcgK1xuICAgICAgICAgICdSVVZMTE1fTkFUSVZFX1BBVEggdG8gaXQsIG9yIHVzZSB0aGUgcnV2bGxtIENMSSAoYHJ1dmxsbSBzZXJ2ZSA8bW9kZWw+YCkuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zdXBwb3J0c01vZGVsTG9hZGluZygpKSB0aHJvdyB0aGlzLm5vQmFja2VuZEVycm9yKCk7XG4gICAgY29uc3QgbmF0aXZlID0gdGhpcy5uYXRpdmU7XG4gICAgcmV0dXJuIHRvTW9kZWxJbmZvKGNhbGxOYXRpdmUoKCkgPT4gbmF0aXZlLmxvYWRNb2RlbCEocGF0aCwgb3B0aW9ucykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvYWQgdGhlIGxhbmd1YWdlIG1vZGVsIGFuZCBmcmVlIGl0cyBtZW1vcnlcbiAgICovXG4gIHVubG9hZE1vZGVsKCk6IHZvaWQge1xuICAgIHRoaXMubmF0aXZlPy51bmxvYWRNb2RlbD8uKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIGxhbmd1YWdlIG1vZGVsIGlzIGxvYWRlZFxuICAgKi9cbiAgaXNNb2RlbExvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYXRpdmU/LmlzTW9kZWxMb2FkZWQ/LigpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsb2FkZWQgbGFuZ3VhZ2UgbW9kZWwsIG9yIG51bGxcbiAgICovXG4gIG1vZGVsSW5mbygpOiBMb2FkZWRNb2RlbEluZm8gfCBudWxsIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5uYXRpdmU/Lm1vZGVsSW5mbz8uKCk7XG4gICAgcmV0dXJuIGluZm8gPyB0b01vZGVsSW5mbyhpbmZvKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgYHRleHRgLCB0aGVuIGFuc3dlciBpdCB3aXRoIHRoZSBsb2FkZWQgbW9kZWwgKGFzIG9uZSB1c2VyIG1lc3NhZ2VcbiAgICogdW5kZXIgdGhlIG1vZGVsJ3MgY2hhdCB0ZW1wbGF0ZSkuXG4gICAqXG4gICAqIEB0aHJvd3MgYFJVVkxMTV9OT19MQU5HVUFHRV9NT0RFTGAgd2hlbiBubyBtb2RlbCBpcyBsb2FkZWQsIHVubGVzc1xuICAgKiAgIGBhbGxvd1BsYWNlaG9sZGVyYCBpcyBzZXQgKHRoZW4gYHRleHRgIGlzIGBQTEFDRUhPTERFUl9URVhUYCkuXG4gICAqL1xuICBxdWVyeSh0ZXh0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBRdWVyeVJlc3BvbnNlIHtcbiAgICBpZiAoIXRoaXMuaXNNb2RlbExvYWRlZCgpKSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXJPclRocm93KCk7XG4gICAgICB0aGlzLmZhbGxiYWNrU3RhdGUucXVlcnlDb3VudCsrO1xuICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLnJvdXRlKHRleHQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogcGxhY2Vob2xkZXIsXG4gICAgICAgIGNvbmZpZGVuY2U6IHJvdXRlLmNvbmZpZGVuY2UsXG4gICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgY29udGV4dFNpemU6IHJvdXRlLmNvbnRleHRTaXplLFxuICAgICAgICBsYXRlbmN5TXM6IDAsXG4gICAgICAgIHJlcXVlc3RJZDogYHBsYWNlaG9sZGVyLSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXRpdmUgPSB0aGlzLm5hdGl2ZSE7XG4gICAgY29uc3QgcmVzdWx0ID0gY2FsbE5hdGl2ZSgoKSA9PiBuYXRpdmUucXVlcnkodGV4dCwgdG9OYXRpdmVHZW5Db25maWcoY29uZmlnKSkpO1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgIGNvbmZpZGVuY2U6IHJlc3VsdC5jb25maWRlbmNlLFxuICAgICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICAgIGNvbnRleHRTaXplOiByZXN1bHQuY29udGV4dFNpemUsXG4gICAgICBsYXRlbmN5TXM6IHJlc3VsdC5sYXRlbmN5TXMsXG4gICAgICByZXF1ZXN0SWQ6IHJlc3VsdC5yZXF1ZXN0SWQsXG4gICAgICBwcm9tcHRUb2tlbnM6IHJlc3VsdC5wcm9tcHRUb2tlbnMsXG4gICAgICBjb21wbGV0aW9uVG9rZW5zOiByZXN1bHQuY29tcGxldGlvblRva2VucyxcbiAgICAgIGZpbmlzaFJlYXNvbjogcmVzdWx0LmZpbmlzaFJlYXNvbiBhcyBGaW5pc2hSZWFzb24gfCB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250aW51ZSBgcHJvbXB0YCB2ZXJiYXRpbSB3aXRoIHRoZSBsb2FkZWQgbW9kZWwgKG5vIGNoYXQgdGVtcGxhdGU7IHVzZVxuICAgKiBgY2hhdCgpYCBmb3IgaW5zdHJ1Y3Rpb24tdHVuZWQgbW9kZWxzKS4gUmV0dXJucyB0aGUgZ2VuZXJhdGVkIHRleHQuXG4gICAqXG4gICAqIEB0aHJvd3MgYFJVVkxMTV9OT19MQU5HVUFHRV9NT0RFTGAgd2hlbiBubyBtb2RlbCBpcyBsb2FkZWQsIHVubGVzc1xuICAgKiAgIGBhbGxvd1BsYWNlaG9sZGVyYCBpcyBzZXQgKHRoZW4gaXQgcmV0dXJucyBgUExBQ0VIT0xERVJfVEVYVGApLlxuICAgKi9cbiAgZ2VuZXJhdGUocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5pc01vZGVsTG9hZGVkKCkpIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyT3JUaHJvdygpO1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRGV0YWlsZWQocHJvbXB0LCBjb25maWcpLnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogTGlrZSBgZ2VuZXJhdGUoKWAsIHdpdGggdG9rZW4gY291bnRzIChmcm9tIHRoZSBtb2RlbCdzIHRva2VuaXplcikgYW5kXG4gICAqIHRoZSBmaW5pc2ggcmVhc29uLiBBbHdheXMgdGhyb3dzIGBSVVZMTE1fTk9fTEFOR1VBR0VfTU9ERUxgIHdpdGhvdXQgYVxuICAgKiBsb2FkZWQgbW9kZWwuXG4gICAqL1xuICBnZW5lcmF0ZURldGFpbGVkKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBHZW5lcmF0aW9uQ29uZmlnKTogR2VuZXJhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgbmF0aXZlID0gdGhpcy5yZXF1aXJlTW9kZWwoKTtcbiAgICByZXR1cm4gdG9HZW5lcmF0aW9uUmVzdWx0KFxuICAgICAgY2FsbE5hdGl2ZSgoKSA9PiBuYXRpdmUuZ2VuZXJhdGUocHJvbXB0LCB0b05hdGl2ZUdlbkNvbmZpZyhjb25maWcpKSkgYXMgTmF0aXZlR2VuZXJhdGlvblJlc3VsdCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgbG9hZGVkIG1vZGVsIG9uIGEgY29udmVyc2F0aW9uLCBmb3JtYXR0ZWQgd2l0aCB0aGUgbW9kZWwncyBjaGF0XG4gICAqIHRlbXBsYXRlIChDaGF0TUwgZm9yIFF3ZW4sIExsYW1hIDMgLyBNaXN0cmFsIGZvcm1hdHMgZm9yIHRob3NlIG1vZGVscykuXG4gICAqIEFsd2F5cyB0aHJvd3MgYFJVVkxMTV9OT19MQU5HVUFHRV9NT0RFTGAgd2l0aG91dCBhIGxvYWRlZCBtb2RlbC5cbiAgICovXG4gIGNoYXQobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIGNvbmZpZz86IEdlbmVyYXRpb25Db25maWcpOiBHZW5lcmF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBuYXRpdmUgPSB0aGlzLnJlcXVpcmVNb2RlbCgpO1xuICAgIHJldHVybiB0b0dlbmVyYXRpb25SZXN1bHQoY2FsbE5hdGl2ZSgoKSA9PiBuYXRpdmUuY2hhdCEobWVzc2FnZXMsIHRvTmF0aXZlR2VuQ29uZmlnKGNvbmZpZykpKSk7XG4gIH1cblxuICBwcml2YXRlIHJlcXVpcmVNb2RlbCgpOiBOYXRpdmVFbmdpbmUge1xuICAgIGlmICghdGhpcy5pc01vZGVsTG9hZGVkKCkpIHRocm93IHRoaXMubm9Nb2RlbEVycm9yKCk7XG4gICAgcmV0dXJuIHRoaXMubmF0aXZlITtcbiAgfVxuXG4gIHByaXZhdGUgbm9Nb2RlbEVycm9yKCk6IEVycm9yIHtcbiAgICBsZXQgZml4OiBzdHJpbmc7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZSkge1xuICAgICAgZml4ID1cbiAgICAgICAgYG5vIG5hdGl2ZSBSdXZMTE0gYmluYXJ5IGlzIGF2YWlsYWJsZSBmb3IgJHtwbGF0Zm9ybUtleSgpfSwgc28gbm8gbW9kZWwgY2FuIGJlIGxvYWRlZCBgICtcbiAgICAgICAgJyhzZWUgUlVWTExNX05BVElWRV9VTkFWQUlMQUJMRSBpbiB0aGUgUkVBRE1FKSc7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5uYXRpdmUubG9hZE1vZGVsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmaXggPVxuICAgICAgICBgdGhlIGluc3RhbGxlZCBuYXRpdmUgYmluYXJ5ICh2ZXJzaW9uICR7dGhpcy5uYXRpdmVWZXJzaW9uID8/ICd1bmtub3duJ30pIGNhbm5vdCBsb2FkIGAgK1xuICAgICAgICAnbW9kZWxzIChzZWUgUlVWTExNX05BVElWRV9UT09fT0xEIGluIHRoZSBSRUFETUUpJztcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnN1cHBvcnRzTW9kZWxMb2FkaW5nKCkpIHtcbiAgICAgIGZpeCA9XG4gICAgICAgIGB0aGUgaW5zdGFsbGVkIG5hdGl2ZSBiaW5hcnkgKHZlcnNpb24gJHt0aGlzLm5hdGl2ZVZlcnNpb24gPz8gJ3Vua25vd24nfSkgd2FzIGJ1aWx0IGAgK1xuICAgICAgICAnd2l0aG91dCB0aGUgY2FuZGxlIGluZmVyZW5jZSBiYWNrZW5kLCBzbyBpdCBjYW5ub3QgbG9hZCBtb2RlbHMgKHNlZSAnICtcbiAgICAgICAgJ1JVVkxMTV9OT19JTkZFUkVOQ0VfQkFDS0VORCBpbiB0aGUgUkVBRE1FKSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpeCA9ICdjYWxsIGxvYWRNb2RlbCg8cGF0aCB0byBhIEdHVUYgZmlsZT4pIGZpcnN0JztcbiAgICB9XG4gICAgcmV0dXJuIGNvZGVkRXJyb3IoXG4gICAgICAnUlVWTExNX05PX0xBTkdVQUdFX01PREVMJyxcbiAgICAgIGBubyBsYW5ndWFnZSBtb2RlbCBpcyBsb2FkZWQsIHNvIHRoZXJlIGlzIG5vIG1vZGVsIG91dHB1dCB0byByZXR1cm46ICR7Zml4fS4gUm91dGluZywgYCArXG4gICAgICAgICdtZW1vcnkgYW5kIGVtYmVkZGluZ3Mgd29yayB3aXRob3V0IGEgbW9kZWwuIEZvciBhbiBIVFRQIHNlcnZlciB1c2UgdGhlIHJ1dmxsbSBDTEkgJyArXG4gICAgICAgICcoYHJ1dmxsbSBzZXJ2ZSA8bW9kZWw+YCkuJyxcbiAgICApO1xuICB9XG5cbiAgLyoqIFRocm93IGBSVVZMTE1fTk9fTEFOR1VBR0VfTU9ERUxgLCBvciByZXR1cm4gdGhlIGxhYmVsbGVkIHBsYWNlaG9sZGVyIHdoZW4gb3B0ZWQgaW4uICovXG4gIHByaXZhdGUgcGxhY2Vob2xkZXJPclRocm93KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmFsbG93UGxhY2Vob2xkZXIpIHRocm93IHRoaXMubm9Nb2RlbEVycm9yKCk7XG4gICAgbm90aWNlKFxuICAgICAgJ1JVVkxMTV9QTEFDRUhPTERFUl9URVhUJyxcbiAgICAgICdubyBsYW5ndWFnZSBtb2RlbCBpcyBsb2FkZWQ6IGdlbmVyYXRlKCkvcXVlcnkoKSBhcmUgcmV0dXJuaW5nIGEgbGFiZWxsZWQgcGxhY2Vob2xkZXIsICcgK1xuICAgICAgICAnbm90IG1vZGVsIG91dHB1dCwgYmVjYXVzZSBhbGxvd1BsYWNlaG9sZGVyIChvciBSVVZMTE1fQUxMT1dfTU9DSz0xKSBpcyBzZXQuJyxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgcmV0dXJuIFBMQUNFSE9MREVSX1RFWFQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJvdXRpbmcgZGVjaXNpb24gZm9yIGEgcXVlcnlcbiAgICovXG4gIHJvdXRlKHRleHQ6IHN0cmluZyk6IFJvdXRpbmdEZWNpc2lvbiB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZS5yb3V0ZSh0ZXh0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwgYXMgYW55LFxuICAgICAgICBjb250ZXh0U2l6ZTogcmVzdWx0LmNvbnRleHRTaXplID8/IHJlc3VsdC5jb250ZXh0X3NpemUsXG4gICAgICAgIHRlbXBlcmF0dXJlOiByZXN1bHQudGVtcGVyYXR1cmUsXG4gICAgICAgIHRvcFA6IHJlc3VsdC50b3BQID8/IHJlc3VsdC50b3BfcCxcbiAgICAgICAgY29uZmlkZW5jZTogcmVzdWx0LmNvbmZpZGVuY2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsOiAnTTcwMCcsXG4gICAgICBjb250ZXh0U2l6ZTogNTEyLFxuICAgICAgdGVtcGVyYXR1cmU6IDAuNyxcbiAgICAgIHRvcFA6IDAuOSxcbiAgICAgIGNvbmZpZGVuY2U6IDAuNSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBtZW1vcnkgZm9yIHNpbWlsYXIgY29udGVudFxuICAgKi9cbiAgc2VhcmNoTWVtb3J5KHRleHQ6IHN0cmluZywgayA9IDEwKTogTWVtb3J5UmVzdWx0W10ge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMubmF0aXZlLnNlYXJjaE1lbW9yeSh0ZXh0LCBrKTtcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcChyID0+IHtcbiAgICAgICAgLy8gVGhlIG5hdGl2ZSBzaWRlIHJlcG9ydHMgYGRpc3RhbmNlYCAoc21hbGxlciBpcyBjbG9zZXIpLiBNZW1vcnlSZXN1bHRcbiAgICAgICAgLy8gZG9jdW1lbnRzIGBzY29yZWAgYXMgYSBzaW1pbGFyaXR5LCBzbyBjb252ZXJ0IHJhdGhlciB0aGFuIHBhc3NpbmcgYVxuICAgICAgICAvLyBkaXN0YW5jZSB0aHJvdWdoIHVuZGVyIGEgc2ltaWxhcml0eSdzIG5hbWUuIE9sZGVyIGJ1aWxkcyB0aGF0IGFscmVhZHlcbiAgICAgICAgLy8gZW1pdCBgc2NvcmVgIGFyZSB1c2VkIGFzLWlzLlxuICAgICAgICBjb25zdCBhbnlSID0gciBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHNjb3JlID1cbiAgICAgICAgICB0eXBlb2YgYW55Ui5zY29yZSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgID8gYW55Ui5zY29yZVxuICAgICAgICAgICAgOiB0eXBlb2YgYW55Ui5kaXN0YW5jZSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgPyAxIC8gKDEgKyBNYXRoLm1heCgwLCBhbnlSLmRpc3RhbmNlKSlcbiAgICAgICAgICAgICAgOiAwO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiByLmlkLFxuICAgICAgICAgIHNjb3JlLFxuICAgICAgICAgIGNvbnRlbnQ6IHIuY29udGVudCxcbiAgICAgICAgICBtZXRhZGF0YTogSlNPTi5wYXJzZShyLm1ldGFkYXRhIHx8ICd7fScpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgLSBzaW1wbGUgc2VhcmNoXG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5mYWxsYmFja1N0YXRlLm1lbW9yeS5lbnRyaWVzKCkpXG4gICAgICAuc2xpY2UoMCwgaylcbiAgICAgIC5tYXAoKFtpZCwgZGF0YV0pID0+ICh7XG4gICAgICAgIGlkLFxuICAgICAgICBzY29yZTogMC41LFxuICAgICAgICBjb250ZW50OiBkYXRhLmNvbnRlbnQsXG4gICAgICAgIG1ldGFkYXRhOiBkYXRhLm1ldGFkYXRhLFxuICAgICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjb250ZW50IHRvIG1lbW9yeVxuICAgKi9cbiAgYWRkTWVtb3J5KGNvbnRlbnQ6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IE1lbW9yeUlkIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5hZGRNZW1vcnkoY29udGVudCwgbWV0YWRhdGEgPyBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSkgOiB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrXG4gICAgY29uc3QgaWQgPSB0aGlzLmZhbGxiYWNrU3RhdGUubmV4dElkKys7XG4gICAgdGhpcy5mYWxsYmFja1N0YXRlLm1lbW9yeS5zZXQoaWQsIHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBlbWJlZGRpbmc6IHRoaXMuZW1iZWQoY29udGVudCksXG4gICAgICBtZXRhZGF0YTogbWV0YWRhdGEgPz8ge30sXG4gICAgfSk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgZmVlZGJhY2sgZm9yIGxlYXJuaW5nXG4gICAqL1xuICBmZWVkYmFjayhmYjogRmVlZGJhY2spOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5mZWVkYmFjayhmYi5yZXF1ZXN0SWQsIGZiLnJhdGluZywgZmIuY29ycmVjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW5naW5lIHN0YXRpc3RpY3NcbiAgICovXG4gIHN0YXRzKCk6IFJ1dkxMTVN0YXRzIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIGNvbnN0IHMgPSB0aGlzLm5hdGl2ZS5zdGF0cygpO1xuICAgICAgLy8gTWFwIG5hdGl2ZSBzdGF0cyAoc25ha2VfY2FzZSkgdG8gVHlwZVNjcmlwdCBpbnRlcmZhY2UgKGNhbWVsQ2FzZSlcbiAgICAgIC8vIEhhbmRsZSBib3RoIG9sZCBhbmQgbmV3IGZpZWxkIG5hbWVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b3RhbFF1ZXJpZXM6IChzIGFzIGFueSkudG90YWxRdWVyaWVzID8/IHMudG90YWxfcXVlcmllcyA/PyAwLFxuICAgICAgICBtZW1vcnlOb2RlczogKHMgYXMgYW55KS5tZW1vcnlOb2RlcyA/PyBzLm1lbW9yeV9ub2RlcyA/PyAwLFxuICAgICAgICBwYXR0ZXJuc0xlYXJuZWQ6XG4gICAgICAgICAgKHMgYXMgYW55KS50cmFpbmluZ1N0ZXBzID8/XG4gICAgICAgICAgcy5wYXR0ZXJuc19sZWFybmVkID8/XG4gICAgICAgICAgKHMgYXMgYW55KS50cmFpbmluZ19zdGVwcyA/P1xuICAgICAgICAgIDAsXG4gICAgICAgIGF2Z0xhdGVuY3lNczogKHMgYXMgYW55KS5hdmdMYXRlbmN5TXMgPz8gcy5hdmdfbGF0ZW5jeV9tcyA/PyAwLFxuICAgICAgICBjYWNoZUhpdFJhdGU6IChzIGFzIGFueSkuY2FjaGVIaXRSYXRlID8/IHMuY2FjaGVfaGl0X3JhdGUgPz8gMCxcbiAgICAgICAgcm91dGVyQWNjdXJhY3k6IChzIGFzIGFueSkucm91dGVyQWNjdXJhY3kgPz8gcy5yb3V0ZXJfYWNjdXJhY3kgPz8gMC41LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFja1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbFF1ZXJpZXM6IHRoaXMuZmFsbGJhY2tTdGF0ZS5xdWVyeUNvdW50LFxuICAgICAgbWVtb3J5Tm9kZXM6IHRoaXMuZmFsbGJhY2tTdGF0ZS5tZW1vcnkuc2l6ZSxcbiAgICAgIHBhdHRlcm5zTGVhcm5lZDogMCxcbiAgICAgIGF2Z0xhdGVuY3lNczogMS4wLFxuICAgICAgY2FjaGVIaXRSYXRlOiAwLjAsXG4gICAgICByb3V0ZXJBY2N1cmFjeTogMC41LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRm9yY2Ugcm91dGVyIGxlYXJuaW5nIGN5Y2xlXG4gICAqL1xuICBmb3JjZUxlYXJuKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuZm9yY2VMZWFybigpO1xuICAgIH1cbiAgICByZXR1cm4gJ0xlYXJuaW5nIG5vdCBhdmFpbGFibGUgaW4gZmFsbGJhY2sgbW9kZSc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVtYmVkZGluZyBmb3IgdGV4dFxuICAgKi9cbiAgZW1iZWQodGV4dDogc3RyaW5nKTogRW1iZWRkaW5nIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5lbWJlZCh0ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAtIHNpbXBsZSBoYXNoLWJhc2VkIGVtYmVkZGluZ1xuICAgIGNvbnN0IGRpbSA9IHRoaXMuY29uZmlnLmVtYmVkZGluZ0RpbSA/PyA3Njg7XG4gICAgY29uc3QgZW1iZWRkaW5nID0gbmV3IEFycmF5KGRpbSkuZmlsbCgwKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaWR4ID0gKHRleHQuY2hhckNvZGVBdChpKSAqIChpICsgMSkpICUgZGltO1xuICAgICAgZW1iZWRkaW5nW2lkeF0gKz0gMC4xO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIGNvbnN0IG5vcm0gPSBNYXRoLnNxcnQoZW1iZWRkaW5nLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4ICogeCwgMCkpIHx8IDE7XG4gICAgcmV0dXJuIGVtYmVkZGluZy5tYXAoeCA9PiB4IC8gbm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSBzaW1pbGFyaXR5IGJldHdlZW4gdHdvIHRleHRzXG4gICAqL1xuICBzaW1pbGFyaXR5KHRleHQxOiBzdHJpbmcsIHRleHQyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLm5hdGl2ZSkge1xuICAgICAgLy8gZjMyIGFjY3VtdWxhdGlvbiBjYW4gbGFuZCBqdXN0IG91dHNpZGUgdGhlIG1hdGhlbWF0aWNhbCByYW5nZSDigJQgYW5cbiAgICAgIC8vIGlkZW50aWNhbCBwYWlyIG1lYXN1cmVzIDEuMDAwMDAwMSDigJQgd2hpY2ggdHVybnMgTWF0aC5hY29zKHNpbSkgaW50b1xuICAgICAgLy8gTmFOIGRvd25zdHJlYW0uIENvc2luZSBzaW1pbGFyaXR5IGlzIGRlZmluZWQgb24gWy0xLCAxXSwgc28gY2xhbXAuXG4gICAgICBjb25zdCByYXcgPSB0aGlzLm5hdGl2ZS5zaW1pbGFyaXR5KHRleHQxLCB0ZXh0Mik7XG4gICAgICByZXR1cm4gTWF0aC5taW4oMSwgTWF0aC5tYXgoLTEsIHJhdykpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIC0gY29zaW5lIHNpbWlsYXJpdHlcbiAgICBjb25zdCBlbWIxID0gdGhpcy5lbWJlZCh0ZXh0MSk7XG4gICAgY29uc3QgZW1iMiA9IHRoaXMuZW1iZWQodGV4dDIpO1xuXG4gICAgbGV0IGRvdCA9IDA7XG4gICAgbGV0IG5vcm0xID0gMDtcbiAgICBsZXQgbm9ybTIgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbWIxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkb3QgKz0gZW1iMVtpXSAqIGVtYjJbaV07XG4gICAgICBub3JtMSArPSBlbWIxW2ldICogZW1iMVtpXTtcbiAgICAgIG5vcm0yICs9IGVtYjJbaV0gKiBlbWIyW2ldO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbm9tID0gTWF0aC5zcXJ0KG5vcm0xKSAqIE1hdGguc3FydChub3JtMik7XG4gICAgY29uc3Qgc2ltaWxhcml0eSA9IGRlbm9tID4gMCA/IGRvdCAvIGRlbm9tIDogMDtcbiAgICAvLyBDbGFtcCB0byBbMCwgMV0gdG8gaGFuZGxlIGZsb2F0aW5nIHBvaW50IGVycm9yc1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBzaW1pbGFyaXR5KSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgU0lNRCBpcyBhdmFpbGFibGVcbiAgICovXG4gIGhhc1NpbWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubmF0aXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXRpdmUuaGFzU2ltZCgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IFNJTUQgY2FwYWJpbGl0aWVzXG4gICAqL1xuICBzaW1kQ2FwYWJpbGl0aWVzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5uYXRpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5zaW1kQ2FwYWJpbGl0aWVzKCk7XG4gICAgfVxuICAgIHJldHVybiBbJ1NjYWxhciAoZmFsbGJhY2spJ107XG4gIH1cblxuICAvKipcbiAgICogQmF0Y2ggcXVlcnkgbXVsdGlwbGUgcHJvbXB0c1xuICAgKi9cbiAgYmF0Y2hRdWVyeShyZXF1ZXN0OiBCYXRjaFF1ZXJ5UmVxdWVzdCk6IEJhdGNoUXVlcnlSZXNwb25zZSB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3BvbnNlcyA9IHJlcXVlc3QucXVlcmllcy5tYXAocSA9PiB0aGlzLnF1ZXJ5KHEsIHJlcXVlc3QuY29uZmlnKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3BvbnNlcyxcbiAgICAgIHRvdGFsTGF0ZW5jeU1zOiBEYXRlLm5vdygpIC0gc3RhcnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBuYXRpdmUgbW9kdWxlIGlzIGxvYWRlZFxuICAgKi9cbiAgaXNOYXRpdmVMb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmF0aXZlICE9PSBudWxsO1xuICB9XG59XG4iXX0=
|