@1money/component-ui 0.0.75 → 0.0.77
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/es/components/ProForm/ProForm.d.ts +1 -1
- package/es/components/ProForm/ProForm.js +46 -34
- package/es/components/ProForm/ProFormDependency.d.ts +2 -1
- package/es/components/ProForm/ProFormDependency.js +6 -16
- package/es/components/ProForm/ProFormItem.d.ts +7 -2
- package/es/components/ProForm/ProFormItem.js +5 -7
- package/es/components/ProForm/ProFormList.d.ts +6 -1
- package/es/components/ProForm/ProFormList.js +122 -42
- package/es/components/ProForm/SchemaForm.d.ts +1 -1
- package/es/components/ProForm/SchemaForm.js +8 -5
- package/es/components/ProForm/context.d.ts +8 -7
- package/es/components/ProForm/context.js +1 -1
- package/es/components/ProForm/core/constants.d.ts +3 -1
- package/es/components/ProForm/core/constants.js +8 -2
- package/es/components/ProForm/core/devWarning.d.ts +3 -0
- package/es/components/ProForm/core/devWarning.js +22 -0
- package/es/components/ProForm/core/formStore.d.ts +14 -6
- package/es/components/ProForm/core/formStore.js +21 -2
- package/es/components/ProForm/core/hooks/useForm.d.ts +1 -1
- package/es/components/ProForm/core/hooks/useForm.js +275 -107
- package/es/components/ProForm/core/hooks/useFormCore.d.ts +2 -2
- package/es/components/ProForm/core/hooks/useFormCore.js +121 -121
- package/es/components/ProForm/core/interface.d.ts +157 -103
- package/es/components/ProForm/core/namePathType.d.ts +25 -0
- package/es/components/ProForm/core/namePathType.js +2 -0
- package/es/components/ProForm/core/pathUtils.d.ts +5 -3
- package/es/components/ProForm/core/pathUtils.js +19 -1
- package/es/components/ProForm/core/runRules.d.ts +40 -17
- package/es/components/ProForm/core/runRules.js +480 -136
- package/es/components/ProForm/core/useFormItem.d.ts +7 -8
- package/es/components/ProForm/core/useFormItem.js +52 -82
- package/es/components/ProForm/core/validationError.d.ts +13 -0
- package/es/components/ProForm/core/validationError.js +29 -0
- package/es/components/ProForm/fields/ProFormCheckbox.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormCheckboxGroup.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormCheckboxGroup.js +19 -5
- package/es/components/ProForm/fields/ProFormDatePicker.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormDatePicker.js +1 -1
- package/es/components/ProForm/fields/ProFormFieldSet.d.ts +7 -2
- package/es/components/ProForm/fields/ProFormFieldSet.js +49 -12
- package/es/components/ProForm/fields/ProFormPassword.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormRadioGroup.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormRadioGroup.js +8 -3
- package/es/components/ProForm/fields/ProFormSelect.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormSelect.js +13 -7
- package/es/components/ProForm/fields/ProFormSlider.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormSwitch.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormText.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormTextArea.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormUpload.d.ts +1 -1
- package/es/components/ProForm/fields/ProFormUpload.js +1 -1
- package/es/components/ProForm/fields/createProFormField.d.ts +8 -2
- package/es/components/ProForm/fields/createProFormField.js +20 -27
- package/es/components/ProForm/hooks/useFieldRequest.d.ts +1 -1
- package/es/components/ProForm/hooks/useFieldRequest.js +10 -8
- package/es/components/ProForm/hooks/useUrlSync.d.ts +8 -7
- package/es/components/ProForm/hooks/useUrlSync.js +1 -1
- package/es/components/ProForm/index.d.ts +37 -27
- package/es/components/ProForm/index.js +4 -1
- package/es/components/ProForm/interface.d.ts +115 -119
- package/es/components/ProForm/layouts/DialogForm.d.ts +1 -1
- package/es/components/ProForm/layouts/DialogForm.js +1 -1
- package/es/components/ProForm/layouts/DrawerForm.d.ts +1 -1
- package/es/components/ProForm/layouts/DrawerForm.js +1 -1
- package/es/components/ProForm/layouts/QueryFilter.d.ts +1 -1
- package/es/components/ProForm/layouts/QueryFilter.js +24 -16
- package/es/components/ProForm/layouts/useOverlayForm.d.ts +2 -2
- package/es/components/ProForm/layouts/useOverlayForm.js +1 -1
- package/es/components/ProForm/utils.d.ts +15 -7
- package/es/components/ProForm/utils.js +51 -3
- package/es/components/Table/core/useTableSetup.js +2 -2
- package/es/components/Table/interface.d.ts +1 -1
- package/es/index.css +1 -1
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/lib/components/ProForm/ProForm.d.ts +1 -1
- package/lib/components/ProForm/ProForm.js +45 -33
- package/lib/components/ProForm/ProFormDependency.d.ts +2 -1
- package/lib/components/ProForm/ProFormDependency.js +5 -15
- package/lib/components/ProForm/ProFormItem.d.ts +7 -2
- package/lib/components/ProForm/ProFormItem.js +5 -7
- package/lib/components/ProForm/ProFormList.d.ts +6 -1
- package/lib/components/ProForm/ProFormList.js +120 -40
- package/lib/components/ProForm/SchemaForm.d.ts +1 -1
- package/lib/components/ProForm/SchemaForm.js +8 -5
- package/lib/components/ProForm/context.d.ts +8 -7
- package/lib/components/ProForm/context.js +1 -1
- package/lib/components/ProForm/core/constants.d.ts +3 -1
- package/lib/components/ProForm/core/constants.js +9 -3
- package/lib/components/ProForm/core/devWarning.d.ts +3 -0
- package/lib/components/ProForm/core/devWarning.js +29 -0
- package/lib/components/ProForm/core/formStore.d.ts +14 -6
- package/lib/components/ProForm/core/formStore.js +23 -2
- package/lib/components/ProForm/core/hooks/useForm.d.ts +1 -1
- package/lib/components/ProForm/core/hooks/useForm.js +271 -103
- package/lib/components/ProForm/core/hooks/useFormCore.d.ts +2 -2
- package/lib/components/ProForm/core/hooks/useFormCore.js +119 -119
- package/lib/components/ProForm/core/interface.d.ts +157 -103
- package/lib/components/ProForm/core/namePathType.d.ts +25 -0
- package/lib/components/ProForm/core/namePathType.js +6 -0
- package/lib/components/ProForm/core/pathUtils.d.ts +5 -3
- package/lib/components/ProForm/core/pathUtils.js +20 -1
- package/lib/components/ProForm/core/runRules.d.ts +40 -17
- package/lib/components/ProForm/core/runRules.js +483 -137
- package/lib/components/ProForm/core/useFormItem.d.ts +7 -8
- package/lib/components/ProForm/core/useFormItem.js +54 -84
- package/lib/components/ProForm/core/validationError.d.ts +13 -0
- package/lib/components/ProForm/core/validationError.js +36 -0
- package/lib/components/ProForm/fields/ProFormCheckbox.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormCheckboxGroup.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormCheckboxGroup.js +18 -4
- package/lib/components/ProForm/fields/ProFormDatePicker.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormDatePicker.js +1 -1
- package/lib/components/ProForm/fields/ProFormFieldSet.d.ts +7 -2
- package/lib/components/ProForm/fields/ProFormFieldSet.js +49 -12
- package/lib/components/ProForm/fields/ProFormPassword.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormRadioGroup.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormRadioGroup.js +7 -2
- package/lib/components/ProForm/fields/ProFormSelect.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormSelect.js +13 -7
- package/lib/components/ProForm/fields/ProFormSlider.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormSwitch.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormText.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormTextArea.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormUpload.d.ts +1 -1
- package/lib/components/ProForm/fields/ProFormUpload.js +1 -1
- package/lib/components/ProForm/fields/createProFormField.d.ts +8 -2
- package/lib/components/ProForm/fields/createProFormField.js +20 -27
- package/lib/components/ProForm/hooks/useFieldRequest.d.ts +1 -1
- package/lib/components/ProForm/hooks/useFieldRequest.js +10 -8
- package/lib/components/ProForm/hooks/useUrlSync.d.ts +8 -7
- package/lib/components/ProForm/hooks/useUrlSync.js +1 -1
- package/lib/components/ProForm/index.d.ts +37 -27
- package/lib/components/ProForm/index.js +10 -1
- package/lib/components/ProForm/interface.d.ts +115 -119
- package/lib/components/ProForm/layouts/DialogForm.d.ts +1 -1
- package/lib/components/ProForm/layouts/DialogForm.js +1 -1
- package/lib/components/ProForm/layouts/DrawerForm.d.ts +1 -1
- package/lib/components/ProForm/layouts/DrawerForm.js +1 -1
- package/lib/components/ProForm/layouts/QueryFilter.d.ts +1 -1
- package/lib/components/ProForm/layouts/QueryFilter.js +24 -16
- package/lib/components/ProForm/layouts/useOverlayForm.d.ts +2 -2
- package/lib/components/ProForm/layouts/useOverlayForm.js +1 -1
- package/lib/components/ProForm/utils.d.ts +15 -7
- package/lib/components/ProForm/utils.js +52 -3
- package/lib/components/Table/core/useTableSetup.js +2 -2
- package/lib/components/Table/interface.d.ts +1 -1
- package/lib/index.css +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server/examples.generated.json +95 -53
- package/scripts/mcp-server/index.generated.json +1715 -185
|
@@ -41,23 +41,46 @@ var __rest = this && this.__rest || function (s, e) {
|
|
|
41
41
|
}
|
|
42
42
|
return t;
|
|
43
43
|
};
|
|
44
|
-
import { useMemo, useEffect, memo, Fragment } from 'react';
|
|
44
|
+
import { useMemo, useEffect, useRef, memo, Fragment } from 'react';
|
|
45
45
|
import React from 'react';
|
|
46
46
|
import useEventCallback from '@1money/hooks/useEventCallback';
|
|
47
47
|
import useMemoizedFn from '@1money/hooks/useMemoizedFn';
|
|
48
48
|
import { useFormCore } from './useFormCore';
|
|
49
|
-
import { resolveValue } from '../pathUtils';
|
|
50
|
-
import { runRulesAsync } from '../runRules';
|
|
51
|
-
import { useStoreSelector, shallowEqualArrays } from '../formStore';
|
|
49
|
+
import { resolveValue, setNestedValue } from '../pathUtils';
|
|
50
|
+
import { coerceFailureReason, filterRulesByTrigger, normalizeTriggers, resolveRules, runRulesAsync } from '../runRules';
|
|
51
|
+
import { useStoreSelector, shallowEqualArrays, sameValidationNode } from '../formStore';
|
|
52
|
+
import { FormValidationError } from '../validationError';
|
|
52
53
|
/**
|
|
53
54
|
* Only rules with a custom `validator` can be genuinely asynchronous —
|
|
54
55
|
* builtin rules resolve within a microtask, so flipping `validating` for
|
|
55
|
-
* them would only churn subscribers without ever being visible.
|
|
56
|
+
* them would only churn subscribers without ever being visible. Decided on
|
|
57
|
+
* RESOLVED rules: a function-form rule that resolves to builtin-only checks
|
|
58
|
+
* must not flicker the flag.
|
|
59
|
+
*
|
|
60
|
+
* The async engine awaits validators nested inside `fields` / `defaultField`
|
|
61
|
+
* too, so the decision must descend the same way — otherwise a deep-only
|
|
62
|
+
* validator (e.g. `{ defaultField: { validator } }`) runs pending with the
|
|
63
|
+
* flag stuck false, and `isFieldValidating(name)` under-reports for the whole
|
|
64
|
+
* window. Over-flagging when the deep validator won't actually fire (empty /
|
|
65
|
+
* primitive value) is acceptable: the flag is decided on rule SHAPE, exactly
|
|
66
|
+
* as the top-level case already over-flags a validator short-circuited by an
|
|
67
|
+
* earlier builtin failure; the run clears it on settle either way.
|
|
56
68
|
*/
|
|
57
|
-
var
|
|
58
|
-
return
|
|
59
|
-
|
|
60
|
-
|
|
69
|
+
var asRuleArray = function asRuleArray(rule) {
|
|
70
|
+
return rule ? Array.isArray(rule) ? rule : [rule] : [];
|
|
71
|
+
};
|
|
72
|
+
var _ruleHasValidator = function ruleHasValidator(rule) {
|
|
73
|
+
if (typeof rule.validator === 'function') return true;
|
|
74
|
+
if (asRuleArray(rule.defaultField).some(_ruleHasValidator)) return true;
|
|
75
|
+
if (rule.fields) {
|
|
76
|
+
return Object.values(rule.fields).some(function (sub) {
|
|
77
|
+
return asRuleArray(sub).some(_ruleHasValidator);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
};
|
|
82
|
+
var hasResolvedValidator = function hasResolvedValidator(resolved) {
|
|
83
|
+
return resolved.some(_ruleHasValidator);
|
|
61
84
|
};
|
|
62
85
|
// ---------------------------------------------------------------------------
|
|
63
86
|
// useForm
|
|
@@ -71,6 +94,12 @@ export var useForm = function useForm() {
|
|
|
71
94
|
validateTrigger = _config$validateTrigg === void 0 ? 'onChange' : _config$validateTrigg;
|
|
72
95
|
var formCore = useFormCore(config);
|
|
73
96
|
var store = formCore.store;
|
|
97
|
+
// Epoch of the LATEST async run that raised each field's `validating` flag.
|
|
98
|
+
// A settling run clears the flag only while it is still the latest raiser —
|
|
99
|
+
// an older run must not blank the spinner of a newer one, and a run
|
|
100
|
+
// superseded by a SYNC commit (which never touches flags) must still clean
|
|
101
|
+
// up after itself.
|
|
102
|
+
var lastAsyncEpochRef = useRef({});
|
|
74
103
|
// Mark fields as validating in ONE commit. validating / touched live in the
|
|
75
104
|
// store alongside values — flipping them (e.g. async validation around a
|
|
76
105
|
// blur) must not re-render the form root, only the fields that subscribed.
|
|
@@ -108,7 +137,7 @@ export var useForm = function useForm() {
|
|
|
108
137
|
delete newErrors[name];
|
|
109
138
|
errorsChanged = true;
|
|
110
139
|
}
|
|
111
|
-
} else if (newErrors[name]
|
|
140
|
+
} else if (!sameValidationNode(newErrors[name], error)) {
|
|
112
141
|
newErrors[name] = error;
|
|
113
142
|
errorsChanged = true;
|
|
114
143
|
}
|
|
@@ -117,7 +146,7 @@ export var useForm = function useForm() {
|
|
|
117
146
|
delete newWarnings[name];
|
|
118
147
|
warningsChanged = true;
|
|
119
148
|
}
|
|
120
|
-
} else if (newWarnings[name]
|
|
149
|
+
} else if (!sameValidationNode(newWarnings[name], warning)) {
|
|
121
150
|
newWarnings[name] = warning;
|
|
122
151
|
warningsChanged = true;
|
|
123
152
|
}
|
|
@@ -147,7 +176,7 @@ export var useForm = function useForm() {
|
|
|
147
176
|
// ---------------------------------------------------------------------------
|
|
148
177
|
var validateFieldAsync = useMemoizedFn(function (name, value, rules) {
|
|
149
178
|
return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
150
|
-
var flagged, outcome, _yield$runRulesAsync, error, warning;
|
|
179
|
+
var _a, epoch, values, resolved, flagged, outcome, _yield$runRulesAsync, error, warning, isCurrent, clearFlags, _t;
|
|
151
180
|
return _regeneratorRuntime.wrap(function (_context) {
|
|
152
181
|
while (1) switch (_context.prev = _context.next) {
|
|
153
182
|
case 0:
|
|
@@ -160,8 +189,18 @@ export var useForm = function useForm() {
|
|
|
160
189
|
error: null
|
|
161
190
|
});
|
|
162
191
|
case 1:
|
|
163
|
-
|
|
192
|
+
// Capture this run's epoch: if a NEWER run (sync or async) starts for
|
|
193
|
+
// the field before this one settles, the outcome below is stale and is
|
|
194
|
+
// discarded instead of overwriting the newer result.
|
|
195
|
+
epoch = formCore.beginValidationRun(name); // Resolve once: the flag decision needs resolved rules, and passing the
|
|
196
|
+
// resolved array onward spares the engine a re-resolution.
|
|
197
|
+
values = formCore.getFieldsValue();
|
|
198
|
+
resolved = resolveRules(rules, values, formCore.getRuleContextInstance());
|
|
199
|
+
flagged = hasResolvedValidator(resolved) ? [name] : [];
|
|
164
200
|
markValidating(flagged);
|
|
201
|
+
flagged.forEach(function (flaggedName) {
|
|
202
|
+
lastAsyncEpochRef.current[flaggedName] = epoch;
|
|
203
|
+
});
|
|
165
204
|
outcome = {
|
|
166
205
|
name: name,
|
|
167
206
|
error: null,
|
|
@@ -169,7 +208,7 @@ export var useForm = function useForm() {
|
|
|
169
208
|
};
|
|
170
209
|
_context.prev = 2;
|
|
171
210
|
_context.next = 3;
|
|
172
|
-
return runRulesAsync(name, value, formCore.
|
|
211
|
+
return runRulesAsync(name, value, values, resolved, formCore.getRuleContextInstance());
|
|
173
212
|
case 3:
|
|
174
213
|
_yield$runRulesAsync = _context.sent;
|
|
175
214
|
error = _yield$runRulesAsync.error;
|
|
@@ -179,28 +218,45 @@ export var useForm = function useForm() {
|
|
|
179
218
|
error: error,
|
|
180
219
|
warning: warning
|
|
181
220
|
};
|
|
221
|
+
_context.next = 5;
|
|
222
|
+
break;
|
|
182
223
|
case 4:
|
|
183
224
|
_context.prev = 4;
|
|
184
|
-
|
|
185
|
-
|
|
225
|
+
_t = _context["catch"](2);
|
|
226
|
+
// The engine contains rule-level throws itself; this is a last-resort
|
|
227
|
+
// net so an unexpected failure surfaces as a field error instead of
|
|
228
|
+
// leaving the field marked valid.
|
|
229
|
+
outcome = {
|
|
230
|
+
name: name,
|
|
231
|
+
error: (_a = coerceFailureReason(_t)) !== null && _a !== void 0 ? _a : 'Validation failed',
|
|
232
|
+
warning: null
|
|
233
|
+
};
|
|
186
234
|
case 5:
|
|
235
|
+
_context.prev = 5;
|
|
236
|
+
isCurrent = formCore.isValidationRunCurrent(name, epoch);
|
|
237
|
+
clearFlags = flagged.filter(function (flaggedName) {
|
|
238
|
+
return lastAsyncEpochRef.current[flaggedName] === epoch;
|
|
239
|
+
});
|
|
240
|
+
commitRuleOutcomes(isCurrent ? [outcome] : [], clearFlags);
|
|
241
|
+
return _context.finish(5);
|
|
242
|
+
case 6:
|
|
187
243
|
return _context.abrupt("return", {
|
|
188
244
|
isValid: outcome.error === null,
|
|
189
245
|
error: outcome.error
|
|
190
246
|
});
|
|
191
|
-
case
|
|
247
|
+
case 7:
|
|
192
248
|
case "end":
|
|
193
249
|
return _context.stop();
|
|
194
250
|
}
|
|
195
|
-
}, _callee, null, [[2
|
|
251
|
+
}, _callee, null, [[2, 4, 5, 6]]);
|
|
196
252
|
}));
|
|
197
253
|
});
|
|
198
254
|
// ---------------------------------------------------------------------------
|
|
199
255
|
// Async field blur handler
|
|
200
256
|
// ---------------------------------------------------------------------------
|
|
201
|
-
var handleFieldBlur = useEventCallback(function (name) {
|
|
257
|
+
var handleFieldBlur = useEventCallback(function (name, fieldTrigger) {
|
|
202
258
|
return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
203
|
-
var touched, rules;
|
|
259
|
+
var touched, rules, values, applicable;
|
|
204
260
|
return _regeneratorRuntime.wrap(function (_context2) {
|
|
205
261
|
while (1) switch (_context2.prev = _context2.next) {
|
|
206
262
|
case 0:
|
|
@@ -211,13 +267,21 @@ export var useForm = function useForm() {
|
|
|
211
267
|
});
|
|
212
268
|
}
|
|
213
269
|
rules = formCore.getFieldRules(name);
|
|
214
|
-
if (
|
|
270
|
+
if (rules) {
|
|
215
271
|
_context2.next = 1;
|
|
216
272
|
break;
|
|
217
273
|
}
|
|
218
|
-
_context2.
|
|
219
|
-
return validateFieldAsync(name, resolveValue(formCore.getFieldsValue(), name), rules);
|
|
274
|
+
return _context2.abrupt("return");
|
|
220
275
|
case 1:
|
|
276
|
+
values = formCore.getFieldsValue();
|
|
277
|
+
applicable = filterRulesByTrigger(resolveRules(rules, values, formCore.getRuleContextInstance()), 'onBlur', normalizeTriggers(fieldTrigger, validateTrigger), name);
|
|
278
|
+
if (!(applicable.length > 0)) {
|
|
279
|
+
_context2.next = 2;
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
_context2.next = 2;
|
|
283
|
+
return validateFieldAsync(name, resolveValue(values, name), applicable);
|
|
284
|
+
case 2:
|
|
221
285
|
case "end":
|
|
222
286
|
return _context2.stop();
|
|
223
287
|
}
|
|
@@ -229,68 +293,111 @@ export var useForm = function useForm() {
|
|
|
229
293
|
// ---------------------------------------------------------------------------
|
|
230
294
|
var validateFieldsAsync = useMemoizedFn(function (nameList) {
|
|
231
295
|
return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
|
|
232
|
-
var fieldsToValidate, fieldErrors, flagged, outcomes,
|
|
296
|
+
var fieldsToValidate, fieldErrors, resolvedByField, epochByField, _iterator2, _step2, name, rules, flagged, outcomes, clearFlags;
|
|
233
297
|
return _regeneratorRuntime.wrap(function (_context4) {
|
|
234
298
|
while (1) switch (_context4.prev = _context4.next) {
|
|
235
299
|
case 0:
|
|
236
300
|
fieldsToValidate = nameList || Object.keys(formCore.fieldRules);
|
|
237
|
-
fieldErrors = {}; //
|
|
238
|
-
//
|
|
301
|
+
fieldErrors = {}; // Resolve every field once up front: the flag decision needs resolved
|
|
302
|
+
// rules, and the resolved arrays are reused for the actual runs. Each
|
|
303
|
+
// field also captures its validation epoch — a field whose value
|
|
304
|
+
// changes mid-submit gets a newer run, and this run's stale outcome
|
|
305
|
+
// must not overwrite it in the store.
|
|
306
|
+
resolvedByField = new Map();
|
|
307
|
+
epochByField = new Map();
|
|
308
|
+
_iterator2 = _createForOfIteratorHelper(fieldsToValidate);
|
|
309
|
+
try {
|
|
310
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
311
|
+
name = _step2.value;
|
|
312
|
+
rules = formCore.fieldRules[name];
|
|
313
|
+
if (rules) {
|
|
314
|
+
epochByField.set(name, formCore.beginValidationRun(name));
|
|
315
|
+
resolvedByField.set(name, resolveRules(rules, formCore.getFieldsValue(), formCore.getRuleContextInstance()));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// One commit to raise the validating flags (validator-bearing fields
|
|
319
|
+
// only), one commit to land every error/warning and clear the flags.
|
|
320
|
+
} catch (err) {
|
|
321
|
+
_iterator2.e(err);
|
|
322
|
+
} finally {
|
|
323
|
+
_iterator2.f();
|
|
324
|
+
}
|
|
239
325
|
flagged = fieldsToValidate.filter(function (name) {
|
|
240
|
-
var
|
|
241
|
-
return
|
|
326
|
+
var resolved = resolvedByField.get(name);
|
|
327
|
+
return resolved ? hasResolvedValidator(resolved) : false;
|
|
242
328
|
});
|
|
243
329
|
markValidating(flagged);
|
|
330
|
+
flagged.forEach(function (name) {
|
|
331
|
+
lastAsyncEpochRef.current[name] = epochByField.get(name);
|
|
332
|
+
});
|
|
244
333
|
outcomes = [];
|
|
245
334
|
_context4.prev = 1;
|
|
246
335
|
_context4.next = 2;
|
|
247
336
|
return Promise.all(fieldsToValidate.map(function (name) {
|
|
248
337
|
return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
249
|
-
var
|
|
338
|
+
var _a, resolved, error, warning, _yield$runRulesAsync2, epoch, _t2;
|
|
250
339
|
return _regeneratorRuntime.wrap(function (_context3) {
|
|
251
340
|
while (1) switch (_context3.prev = _context3.next) {
|
|
252
341
|
case 0:
|
|
253
|
-
|
|
254
|
-
if (
|
|
342
|
+
resolved = resolvedByField.get(name);
|
|
343
|
+
if (resolved) {
|
|
255
344
|
_context3.next = 1;
|
|
256
345
|
break;
|
|
257
346
|
}
|
|
258
347
|
return _context3.abrupt("return");
|
|
259
348
|
case 1:
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
349
|
+
error = null;
|
|
350
|
+
warning = null;
|
|
351
|
+
_context3.prev = 2;
|
|
352
|
+
_context3.next = 3;
|
|
353
|
+
return runRulesAsync(name, resolveValue(formCore.getFieldsValue(), name), formCore.getFieldsValue(), resolved, formCore.getRuleContextInstance());
|
|
354
|
+
case 3:
|
|
263
355
|
_yield$runRulesAsync2 = _context3.sent;
|
|
264
356
|
error = _yield$runRulesAsync2.error;
|
|
265
357
|
warning = _yield$runRulesAsync2.warning;
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
358
|
+
_context3.next = 5;
|
|
359
|
+
break;
|
|
360
|
+
case 4:
|
|
361
|
+
_context3.prev = 4;
|
|
362
|
+
_t2 = _context3["catch"](2);
|
|
363
|
+
// Last-resort net (see validateFieldAsync) — keep the normal
|
|
364
|
+
// constructed-error flow so onFinishFailed gets a real payload.
|
|
365
|
+
error = (_a = coerceFailureReason(_t2)) !== null && _a !== void 0 ? _a : 'Validation failed';
|
|
366
|
+
case 5:
|
|
367
|
+
// The store commit is staleness-guarded; the SUBMIT decision
|
|
368
|
+
// (fieldErrors / the thrown FormValidationError) still reflects
|
|
369
|
+
// this run's own results for the values it validated.
|
|
370
|
+
epoch = epochByField.get(name);
|
|
371
|
+
if (epoch !== undefined && formCore.isValidationRunCurrent(name, epoch)) {
|
|
372
|
+
outcomes.push({
|
|
373
|
+
name: name,
|
|
374
|
+
error: error,
|
|
375
|
+
warning: warning
|
|
376
|
+
});
|
|
377
|
+
}
|
|
271
378
|
if (error !== null) {
|
|
272
379
|
fieldErrors[name] = error;
|
|
273
380
|
}
|
|
274
|
-
case
|
|
381
|
+
case 6:
|
|
275
382
|
case "end":
|
|
276
383
|
return _context3.stop();
|
|
277
384
|
}
|
|
278
|
-
}, _callee3);
|
|
385
|
+
}, _callee3, null, [[2, 4]]);
|
|
279
386
|
}));
|
|
280
387
|
}));
|
|
281
388
|
case 2:
|
|
282
389
|
_context4.prev = 2;
|
|
283
|
-
|
|
390
|
+
clearFlags = flagged.filter(function (name) {
|
|
391
|
+
return lastAsyncEpochRef.current[name] === epochByField.get(name);
|
|
392
|
+
});
|
|
393
|
+
commitRuleOutcomes(outcomes, clearFlags);
|
|
284
394
|
return _context4.finish(2);
|
|
285
395
|
case 3:
|
|
286
396
|
if (!(Object.keys(fieldErrors).length > 0)) {
|
|
287
397
|
_context4.next = 4;
|
|
288
398
|
break;
|
|
289
399
|
}
|
|
290
|
-
|
|
291
|
-
error.values = formCore.getFieldsValue();
|
|
292
|
-
error.errors = fieldErrors;
|
|
293
|
-
throw error;
|
|
400
|
+
throw new FormValidationError(formCore.getFieldsValue(), fieldErrors);
|
|
294
401
|
case 4:
|
|
295
402
|
if (!nameList) {
|
|
296
403
|
_context4.next = 5;
|
|
@@ -321,10 +428,11 @@ export var useForm = function useForm() {
|
|
|
321
428
|
render = _a.render,
|
|
322
429
|
props = __rest(_a, ["children", "render"]);
|
|
323
430
|
// Per-field store subscription: this field re-renders only when its
|
|
324
|
-
// own value/error/touched/validating slice changes.
|
|
431
|
+
// own value/error/touched/validating slice changes. Dot-paths
|
|
432
|
+
// resolve into the nested values like everywhere else.
|
|
325
433
|
var _useStoreSelector = useStoreSelector(store, function (state) {
|
|
326
434
|
var _a;
|
|
327
|
-
return [(_a = state.values
|
|
435
|
+
return [(_a = resolveValue(state.values, name)) !== null && _a !== void 0 ? _a : '', state.errors[name], state.touched[name], state.validating[name]];
|
|
328
436
|
}, shallowEqualArrays),
|
|
329
437
|
_useStoreSelector2 = _slicedToArray(_useStoreSelector, 4),
|
|
330
438
|
fieldValue = _useStoreSelector2[0],
|
|
@@ -332,22 +440,39 @@ export var useForm = function useForm() {
|
|
|
332
440
|
fieldTouched = _useStoreSelector2[2],
|
|
333
441
|
fieldValidating = _useStoreSelector2[3];
|
|
334
442
|
useEffect(function () {
|
|
443
|
+
// Mount-counted: releaseField removes the rules only when the
|
|
444
|
+
// LAST same-name instance unmounts — an instance that piggybacked
|
|
445
|
+
// on an existing registration (e.g. a ProForm.Item's) can never
|
|
446
|
+
// wipe it on its own unmount.
|
|
447
|
+
formCore.retainField(name);
|
|
335
448
|
var existingRules = formCore.getFieldRules(name);
|
|
336
449
|
if (!existingRules && rules.length > 0) {
|
|
337
450
|
formCore.registerField(name, rules);
|
|
338
451
|
}
|
|
339
452
|
return function () {
|
|
340
|
-
formCore.
|
|
453
|
+
formCore.releaseField(name);
|
|
341
454
|
};
|
|
342
455
|
}, []); // Only register on mount
|
|
343
456
|
var handleFieldChange = useEventCallback(function (value) {
|
|
344
457
|
formCore.setFieldValue(name, value);
|
|
345
|
-
|
|
346
|
-
|
|
458
|
+
// Touched is set by the user change trigger (matching the
|
|
459
|
+
// ProForm.Item path) — programmatic setFieldsValue does not.
|
|
460
|
+
var touched = store.getState().touched;
|
|
461
|
+
if (!touched[name]) {
|
|
462
|
+
store.setState({
|
|
463
|
+
touched: Object.assign(Object.assign({}, touched), _defineProperty({}, name, true))
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
var applicable = filterRulesByTrigger(resolveRules(rules, formCore.getFieldsValue(), formCore.getRuleContextInstance()), 'onChange', normalizeTriggers(fieldOptions.validateTrigger, validateTrigger), name);
|
|
467
|
+
if (applicable.length > 0) {
|
|
468
|
+
// Async path (matching ProForm.Item) so a Promise-returning
|
|
469
|
+
// validator is honored on change instead of being silently
|
|
470
|
+
// skipped; fire-and-forget — the result lands on the store.
|
|
471
|
+
validateFieldAsync(name, value, applicable);
|
|
347
472
|
}
|
|
348
473
|
});
|
|
349
474
|
var handleBlur = useEventCallback(function () {
|
|
350
|
-
handleFieldBlur(name);
|
|
475
|
+
handleFieldBlur(name, fieldOptions.validateTrigger);
|
|
351
476
|
});
|
|
352
477
|
var fieldProps = Object.assign({
|
|
353
478
|
name: name,
|
|
@@ -379,22 +504,25 @@ export var useForm = function useForm() {
|
|
|
379
504
|
if (typeof children === 'function') {
|
|
380
505
|
return children(fieldProps);
|
|
381
506
|
}
|
|
507
|
+
// Element children receive only DOM-safe props — error/touched/
|
|
508
|
+
// validating are field META, not control props; spreading them onto
|
|
509
|
+
// a host element would leak any attributes. Render-prop and
|
|
510
|
+
// function children keep the full fieldProps.
|
|
511
|
+
var domSafeProps = Object.assign({
|
|
512
|
+
name: name,
|
|
513
|
+
value: fieldValue,
|
|
514
|
+
onChange: handleMergeChange,
|
|
515
|
+
onBlur: handleMergeBlur
|
|
516
|
+
}, props);
|
|
382
517
|
if (/*#__PURE__*/React.isValidElement(children)) {
|
|
383
|
-
|
|
384
|
-
onChange: handleMergeChange,
|
|
385
|
-
onBlur: handleMergeBlur
|
|
386
|
-
});
|
|
387
|
-
return /*#__PURE__*/React.cloneElement(children, mergedProps);
|
|
518
|
+
return /*#__PURE__*/React.cloneElement(children, domSafeProps);
|
|
388
519
|
}
|
|
389
520
|
if (Array.isArray(children)) {
|
|
390
521
|
return /*#__PURE__*/React.createElement.apply(React, [Fragment, null].concat(_toConsumableArray(children.map(function (child, index) {
|
|
391
522
|
if (/*#__PURE__*/React.isValidElement(child)) {
|
|
392
|
-
|
|
393
|
-
key: child.key || index
|
|
394
|
-
|
|
395
|
-
onBlur: handleMergeBlur
|
|
396
|
-
});
|
|
397
|
-
return /*#__PURE__*/React.cloneElement(child, _mergedProps);
|
|
523
|
+
return /*#__PURE__*/React.cloneElement(child, Object.assign(Object.assign({}, domSafeProps), {
|
|
524
|
+
key: child.key || index
|
|
525
|
+
}));
|
|
398
526
|
}
|
|
399
527
|
return child;
|
|
400
528
|
}))));
|
|
@@ -409,7 +537,7 @@ export var useForm = function useForm() {
|
|
|
409
537
|
// ---------------------------------------------------------------------------
|
|
410
538
|
var handleSubmit = useEventCallback(function (e) {
|
|
411
539
|
return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
|
|
412
|
-
var validatedValues,
|
|
540
|
+
var validatedValues, _t3;
|
|
413
541
|
return _regeneratorRuntime.wrap(function (_context5) {
|
|
414
542
|
while (1) switch (_context5.prev = _context5.next) {
|
|
415
543
|
case 0:
|
|
@@ -424,12 +552,18 @@ export var useForm = function useForm() {
|
|
|
424
552
|
break;
|
|
425
553
|
case 3:
|
|
426
554
|
_context5.prev = 3;
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
555
|
+
_t3 = _context5["catch"](1);
|
|
556
|
+
// Only a VALIDATION failure reaches onFinishFailed — an exception out
|
|
557
|
+
// of the consumer's own onFinish is not a validation result and is
|
|
558
|
+
// surfaced instead of being misreported.
|
|
559
|
+
if (_t3 instanceof FormValidationError) {
|
|
560
|
+
onFinishFailed === null || onFinishFailed === void 0 ? void 0 : onFinishFailed({
|
|
561
|
+
values: _t3.values,
|
|
562
|
+
errors: _t3.errors
|
|
563
|
+
});
|
|
564
|
+
} else {
|
|
565
|
+
console.error('[ProForm] onFinish threw during submit:', _t3);
|
|
566
|
+
}
|
|
433
567
|
case 4:
|
|
434
568
|
case "end":
|
|
435
569
|
return _context5.stop();
|
|
@@ -512,34 +646,45 @@ export var useForm = function useForm() {
|
|
|
512
646
|
var resetFormFields = useMemoizedFn(function (fields) {
|
|
513
647
|
if (!fields) {
|
|
514
648
|
formCore.resetFields();
|
|
515
|
-
|
|
516
|
-
var resetValues = {};
|
|
517
|
-
fields.forEach(function (field) {
|
|
518
|
-
// Mount-frozen initialValues — consistent with the full resetFields.
|
|
519
|
-
resetValues[field] = formCore.getInitialValues()[field];
|
|
520
|
-
});
|
|
521
|
-
formCore.setFieldsValue(resetValues);
|
|
522
|
-
var _store$getState = store.getState(),
|
|
523
|
-
touched = _store$getState.touched,
|
|
524
|
-
validating = _store$getState.validating;
|
|
525
|
-
var newTouched = Object.assign({}, touched);
|
|
526
|
-
var newValidating = Object.assign({}, validating);
|
|
527
|
-
fields.forEach(function (field) {
|
|
528
|
-
delete newTouched[field];
|
|
529
|
-
delete newValidating[field];
|
|
530
|
-
});
|
|
531
|
-
store.setState({
|
|
532
|
-
touched: newTouched,
|
|
533
|
-
validating: newValidating
|
|
534
|
-
});
|
|
535
|
-
fields.forEach(function (field) {
|
|
536
|
-
formCore.setFieldError(field, null);
|
|
537
|
-
});
|
|
649
|
+
return;
|
|
538
650
|
}
|
|
651
|
+
// Mount-frozen initialValues — consistent with the full resetFields.
|
|
652
|
+
// Reads AND writes are nested-path aware, so dot-path names
|
|
653
|
+
// (`address.city`, `items.0.title`) reset correctly instead of probing a
|
|
654
|
+
// literal key and shallow-merging one back.
|
|
655
|
+
var initialValues = formCore.getInitialValues();
|
|
656
|
+
var state = store.getState();
|
|
657
|
+
var newValues = state.values;
|
|
658
|
+
fields.forEach(function (field) {
|
|
659
|
+
var initial = resolveValue(initialValues, field);
|
|
660
|
+
newValues = field.includes('.') ? setNestedValue(newValues, field, initial) : Object.assign(Object.assign({}, newValues), _defineProperty({}, field, initial));
|
|
661
|
+
});
|
|
662
|
+
// Like the full reset: clear ALL per-field meta (errors AND warnings AND
|
|
663
|
+
// touched/validating), invalidate in-flight validation runs, and land
|
|
664
|
+
// everything in ONE commit. No onValuesChange — reset is not a change
|
|
665
|
+
// event on either path.
|
|
666
|
+
formCore.invalidateValidationRuns(fields);
|
|
667
|
+
var newErrors = Object.assign({}, state.errors);
|
|
668
|
+
var newWarnings = Object.assign({}, state.warnings);
|
|
669
|
+
var newTouched = Object.assign({}, state.touched);
|
|
670
|
+
var newValidating = Object.assign({}, state.validating);
|
|
671
|
+
fields.forEach(function (field) {
|
|
672
|
+
delete newErrors[field];
|
|
673
|
+
delete newWarnings[field];
|
|
674
|
+
delete newTouched[field];
|
|
675
|
+
delete newValidating[field];
|
|
676
|
+
});
|
|
677
|
+
store.setState({
|
|
678
|
+
values: newValues,
|
|
679
|
+
errors: newErrors,
|
|
680
|
+
warnings: newWarnings,
|
|
681
|
+
touched: newTouched,
|
|
682
|
+
validating: newValidating
|
|
683
|
+
});
|
|
539
684
|
});
|
|
540
685
|
var submitWithValidation = useMemoizedFn(function (callback) {
|
|
541
686
|
return __awaiter(void 0, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
|
|
542
|
-
var validatedValues,
|
|
687
|
+
var validatedValues, _t4, _t5;
|
|
543
688
|
return _regeneratorRuntime.wrap(function (_context6) {
|
|
544
689
|
while (1) switch (_context6.prev = _context6.next) {
|
|
545
690
|
case 0:
|
|
@@ -548,29 +693,47 @@ export var useForm = function useForm() {
|
|
|
548
693
|
return validateFieldsAsync();
|
|
549
694
|
case 1:
|
|
550
695
|
validatedValues = _context6.sent;
|
|
696
|
+
_context6.next = 3;
|
|
697
|
+
break;
|
|
698
|
+
case 2:
|
|
699
|
+
_context6.prev = 2;
|
|
700
|
+
_t4 = _context6["catch"](0);
|
|
701
|
+
return _context6.abrupt("return", undefined);
|
|
702
|
+
case 3:
|
|
551
703
|
if (!callback) {
|
|
552
|
-
_context6.next =
|
|
704
|
+
_context6.next = 7;
|
|
553
705
|
break;
|
|
554
706
|
}
|
|
555
|
-
_context6.
|
|
707
|
+
_context6.prev = 4;
|
|
708
|
+
_context6.next = 5;
|
|
556
709
|
return callback(validatedValues);
|
|
557
|
-
case
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
710
|
+
case 5:
|
|
711
|
+
_context6.next = 7;
|
|
712
|
+
break;
|
|
713
|
+
case 6:
|
|
714
|
+
_context6.prev = 6;
|
|
715
|
+
_t5 = _context6["catch"](4);
|
|
716
|
+
// A throwing callback is a consumer bug, not a validation failure —
|
|
717
|
+
// surface it (mirroring rc-field-form's onFinish handling) instead
|
|
718
|
+
// of swallowing it silently.
|
|
719
|
+
console.error('[ProForm] submit callback threw:', _t5);
|
|
562
720
|
return _context6.abrupt("return", undefined);
|
|
563
|
-
case
|
|
721
|
+
case 7:
|
|
722
|
+
return _context6.abrupt("return", validatedValues);
|
|
723
|
+
case 8:
|
|
564
724
|
case "end":
|
|
565
725
|
return _context6.stop();
|
|
566
726
|
}
|
|
567
|
-
}, _callee6, null, [[0,
|
|
727
|
+
}, _callee6, null, [[0, 2], [4, 6]]);
|
|
568
728
|
}));
|
|
569
729
|
});
|
|
570
730
|
var formInstance = useMemo(function () {
|
|
571
731
|
return Object.assign(Object.assign({}, formCore.formInstance), {
|
|
732
|
+
getFieldValue: formCore.getFieldValue,
|
|
733
|
+
getFieldsValue: formCore.getFieldsValue,
|
|
572
734
|
validateFields: validateFieldsAsync,
|
|
573
735
|
setFieldValue: formCore.setFieldValue,
|
|
736
|
+
setFieldsValue: formCore.setFieldsValue,
|
|
574
737
|
getFieldError: getFieldError,
|
|
575
738
|
getFieldWarning: getFieldWarning,
|
|
576
739
|
getFieldsError: getFieldsError,
|
|
@@ -587,7 +750,11 @@ export var useForm = function useForm() {
|
|
|
587
750
|
registerField: formCore.registerField,
|
|
588
751
|
unregisterField: formCore.unregisterField
|
|
589
752
|
});
|
|
590
|
-
}, [formCore.formInstance, formCore.setFieldValue, formCore.setFieldError, formCore.registerField, formCore.unregisterField, validateFieldsAsync, getFieldError, getFieldWarning, getFieldsError, isFieldTouched, isFieldsTouched, isFieldValidating, setFieldsError, setFieldTouched, setFieldsTouched, resetFormFields, submitWithValidation, defineField]);
|
|
753
|
+
}, [formCore.formInstance, formCore.getFieldValue, formCore.getFieldsValue, formCore.setFieldValue, formCore.setFieldsValue, formCore.setFieldError, formCore.registerField, formCore.unregisterField, validateFieldsAsync, getFieldError, getFieldWarning, getFieldsError, isFieldTouched, isFieldsTouched, isFieldValidating, setFieldsError, setFieldTouched, setFieldsTouched, resetFormFields, submitWithValidation, defineField]);
|
|
754
|
+
// Function-form rules get the FULL form instance (error getters, touched
|
|
755
|
+
// state, mutators) instead of the bare core methods. Ref write — cheap and
|
|
756
|
+
// idempotent per render.
|
|
757
|
+
formCore.setRuleContextInstance(formInstance);
|
|
591
758
|
// ---------------------------------------------------------------------------
|
|
592
759
|
// Internals – exposed for ProForm integration. Data fields are GETTERS that
|
|
593
760
|
// read the live store, so the object is identity-stable yet never stale.
|
|
@@ -613,14 +780,15 @@ export var useForm = function useForm() {
|
|
|
613
780
|
setFieldValue: formCore.setFieldValue,
|
|
614
781
|
setFieldError: formCore.setFieldError,
|
|
615
782
|
setFieldWarning: formCore.setFieldWarning,
|
|
616
|
-
validateField: formCore.validateField,
|
|
617
783
|
validateFieldAsync: validateFieldAsync,
|
|
618
784
|
registerField: formCore.registerField,
|
|
619
785
|
unregisterField: formCore.unregisterField,
|
|
786
|
+
retainField: formCore.retainField,
|
|
787
|
+
releaseField: formCore.releaseField,
|
|
620
788
|
handleSubmit: handleSubmit,
|
|
621
789
|
handleReset: handleReset
|
|
622
790
|
};
|
|
623
|
-
}, [store, formCore.fieldRules, formCore.setFieldValue, formCore.setFieldError, formCore.setFieldWarning, formCore.
|
|
791
|
+
}, [store, formCore.fieldRules, formCore.setFieldValue, formCore.setFieldError, formCore.setFieldWarning, validateFieldAsync, formCore.registerField, formCore.unregisterField, formCore.retainField, formCore.releaseField, handleSubmit, handleReset]);
|
|
624
792
|
return {
|
|
625
793
|
formInstance: formInstance,
|
|
626
794
|
internals: internals,
|
|
@@ -628,4 +796,4 @@ export var useForm = function useForm() {
|
|
|
628
796
|
};
|
|
629
797
|
};
|
|
630
798
|
export default useForm;
|
|
631
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm0uanMiLCJjb21wb25lbnRzL1Byb0Zvcm0vY29yZS9zcmMvY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvaG9va3MvdXNlRm9ybS50cyJdLCJuYW1lcyI6WyJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInZhbHVlIiwicmVzb2x2ZSIsIlByb21pc2UiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJfX3Jlc3QiLCJzIiwidCIsInAiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpbmRleE9mIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiaSIsImxlbmd0aCIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidXNlTWVtbyIsInVzZUVmZmVjdCIsIm1lbW8iLCJGcmFnbWVudCIsIlJlYWN0IiwidXNlRXZlbnRDYWxsYmFjayIsInVzZU1lbW9pemVkRm4iLCJ1c2VGb3JtQ29yZSIsInJlc29sdmVWYWx1ZSIsInJ1blJ1bGVzQXN5bmMiLCJ1c2VTdG9yZVNlbGVjdG9yIiwic2hhbGxvd0VxdWFsQXJyYXlzIiwiaGFzQ3VzdG9tVmFsaWRhdG9yIiwicnVsZXMiLCJzb21lIiwicnVsZSIsInZhbGlkYXRvciIsInVzZUZvcm0iLCJjb25maWciLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJvbkZpbmlzaCIsIm9uRmluaXNoRmFpbGVkIiwib25SZXNldCIsIl9jb25maWckdmFsaWRhdGVUcmlnZyIsInZhbGlkYXRlVHJpZ2dlciIsImZvcm1Db3JlIiwic3RvcmUiLCJtYXJrVmFsaWRhdGluZyIsIm5hbWVzIiwiYXNzaWduIiwiZ2V0U3RhdGUiLCJ2YWxpZGF0aW5nIiwiZm9yRWFjaCIsIm5hbWUiLCJzZXRTdGF0ZSIsImNvbW1pdFJ1bGVPdXRjb21lcyIsIm91dGNvbWVzIiwiY2xlYXJWYWxpZGF0aW5nIiwic3RhdGUiLCJlcnJvcnNDaGFuZ2VkIiwid2FybmluZ3NDaGFuZ2VkIiwibmV3RXJyb3JzIiwiZXJyb3JzIiwibmV3V2FybmluZ3MiLCJ3YXJuaW5ncyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJuIiwiX3N0ZXAkdmFsdWUiLCJlcnJvciIsIndhcm5pbmciLCJlcnIiLCJmIiwiZmxhZ3NUb0NsZWFyIiwiZmlsdGVyIiwicGF0Y2giLCJuZXdWYWxpZGF0aW5nIiwia2V5cyIsInZhbGlkYXRlRmllbGRBc3luYyIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsImZsYWdnZWQiLCJvdXRjb21lIiwiX3lpZWxkJHJ1blJ1bGVzQXN5bmMiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwiYWJydXB0IiwiaXNWYWxpZCIsImdldEZpZWxkc1ZhbHVlIiwic2VudCIsImZpbmlzaCIsInN0b3AiLCJoYW5kbGVGaWVsZEJsdXIiLCJfY2FsbGVlMiIsInRvdWNoZWQiLCJfY29udGV4dDIiLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRGaWVsZFJ1bGVzIiwidmFsaWRhdGVGaWVsZHNBc3luYyIsIm5hbWVMaXN0IiwiX2NhbGxlZTQiLCJmaWVsZHNUb1ZhbGlkYXRlIiwiZmllbGRFcnJvcnMiLCJfY29udGV4dDQiLCJmaWVsZFJ1bGVzIiwiYWxsIiwibWFwIiwiX2NhbGxlZTMiLCJfeWllbGQkcnVuUnVsZXNBc3luYzIiLCJfY29udGV4dDMiLCJwdXNoIiwiRXJyb3IiLCJ2YWx1ZXMiLCJyZWR1Y2UiLCJhY2MiLCJkZWZpbmVGaWVsZCIsImZpZWxkT3B0aW9ucyIsIl9maWVsZE9wdGlvbnMkcnVsZXMiLCJGaWVsZENvbXBvbmVudCIsIl9hIiwiY2hpbGRyZW4iLCJyZW5kZXIiLCJwcm9wcyIsIl91c2VTdG9yZVNlbGVjdG9yIiwiX3VzZVN0b3JlU2VsZWN0b3IyIiwiX3NsaWNlZFRvQXJyYXkiLCJmaWVsZFZhbHVlIiwiZmllbGRFcnJvciIsImZpZWxkVG91Y2hlZCIsImZpZWxkVmFsaWRhdGluZyIsImV4aXN0aW5nUnVsZXMiLCJyZWdpc3RlckZpZWxkIiwidW5yZWdpc3RlckZpZWxkIiwiaGFuZGxlRmllbGRDaGFuZ2UiLCJzZXRGaWVsZFZhbHVlIiwidmFsaWRhdGVGaWVsZCIsImhhbmRsZUJsdXIiLCJmaWVsZFByb3BzIiwib25DaGFuZ2UiLCJvbkJsdXIiLCJoYW5kbGVNZXJnZUNoYW5nZSIsIl90eXBlb2YiLCJ0YXJnZXQiLCJpc1ZhbGlkRWxlbWVudCIsImhhbmRsZU1lcmdlQmx1ciIsIm1lcmdlZFByb3BzIiwiY2xvbmVFbGVtZW50IiwiQXJyYXkiLCJpc0FycmF5IiwiY3JlYXRlRWxlbWVudCIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheSIsImNoaWxkIiwiaW5kZXgiLCJrZXkiLCJkaXNwbGF5TmFtZSIsImhhbmRsZVN1Ym1pdCIsIl9jYWxsZWU1IiwidmFsaWRhdGVkVmFsdWVzIiwidHlwZWQiLCJfdCIsIl9jb250ZXh0NSIsInByZXZlbnREZWZhdWx0IiwiaGFuZGxlUmVzZXQiLCJyZXNldEZpZWxkcyIsImdldEZpZWxkRXJyb3IiLCJnZXRGaWVsZFdhcm5pbmciLCJnZXRGaWVsZHNFcnJvciIsImlzRmllbGRUb3VjaGVkIiwiaXNGaWVsZHNUb3VjaGVkIiwiYWxsRmllbGRzVG91Y2hlZCIsImV2ZXJ5IiwiaXNGaWVsZFZhbGlkYXRpbmciLCJzZXRGaWVsZHNFcnJvciIsImZpZWxkc0Vycm9yIiwiZW50cmllcyIsIl9yZWYiLCJfcmVmMiIsInNldEZpZWxkRXJyb3IiLCJzZXRGaWVsZFRvdWNoZWQiLCJpc1RvdWNoZWQiLCJzZXRGaWVsZHNUb3VjaGVkIiwiZmllbGRzVG91Y2giLCJyZXNldEZvcm1GaWVsZHMiLCJmaWVsZHMiLCJyZXNldFZhbHVlcyIsImZpZWxkIiwiZ2V0SW5pdGlhbFZhbHVlcyIsInNldEZpZWxkc1ZhbHVlIiwiX3N0b3JlJGdldFN0YXRlIiwibmV3VG91Y2hlZCIsInN1Ym1pdFdpdGhWYWxpZGF0aW9uIiwiY2FsbGJhY2siLCJfY2FsbGVlNiIsIl90MiIsIl9jb250ZXh0NiIsImZvcm1JbnN0YW5jZSIsInZhbGlkYXRlRmllbGRzIiwic3VibWl0IiwiaW50ZXJuYWxzIiwic2V0RmllbGRXYXJuaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUlBLFNBQVMsR0FBSSxJQUFJLElBQUksSUFBSSxDQUFDQSxTQUFTLElBQUssVUFBVUMsT0FBTyxFQUFFQyxVQUFVLEVBQUVDLENBQUMsRUFBRUMsU0FBUyxFQUFFO0VBQ3JGLFNBQVNDLEtBQUtBLENBQUNDLEtBQUssRUFBRTtJQUFFLE9BQU9BLEtBQUssWUFBWUgsQ0FBQyxHQUFHRyxLQUFLLEdBQUcsSUFBSUgsQ0FBQyxDQUFDLFVBQVVJLE9BQU8sRUFBRTtNQUFFQSxPQUFPLENBQUNELEtBQUssQ0FBQztJQUFFLENBQUMsQ0FBQztFQUFFO0VBQzNHLE9BQU8sS0FBS0gsQ0FBQyxLQUFLQSxDQUFDLEdBQUdLLE9BQU8sQ0FBQyxFQUFFLFVBQVVELE9BQU8sRUFBRUUsTUFBTSxFQUFFO0lBQ3ZELFNBQVNDLFNBQVNBLENBQUNKLEtBQUssRUFBRTtNQUFFLElBQUk7UUFBRUssSUFBSSxDQUFDUCxTQUFTLENBQUNRLElBQUksQ0FBQ04sS0FBSyxDQUFDLENBQUM7TUFBRSxDQUFDLENBQUMsT0FBT08sQ0FBQyxFQUFFO1FBQUVKLE1BQU0sQ0FBQ0ksQ0FBQyxDQUFDO01BQUU7SUFBRTtJQUMxRixTQUFTQyxRQUFRQSxDQUFDUixLQUFLLEVBQUU7TUFBRSxJQUFJO1FBQUVLLElBQUksQ0FBQ1AsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDRSxLQUFLLENBQUMsQ0FBQztNQUFFLENBQUMsQ0FBQyxPQUFPTyxDQUFDLEVBQUU7UUFBRUosTUFBTSxDQUFDSSxDQUFDLENBQUM7TUFBRTtJQUFFO0lBQzdGLFNBQVNGLElBQUlBLENBQUNJLE1BQU0sRUFBRTtNQUFFQSxN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QzZGLGFBQWE7TUFDckMzRCxrQkFBa0IsRUFBbEJBLGtCQUFrQjtNQUNsQnVELGFBQWEsRUFBRXpGLFFBQVEsQ0FBQ3lGLGFBQWE7TUFDckNDLGVBQWUsRUFBRTFGLFFBQVEsQ0FBQzBGLGVBQWU7TUFDekN3QixZQUFZLEVBQVpBLFlBQVk7TUFDWk8sV0FBVyxFQUFYQTtJRDFHRixDQzJHQztFQUFBLENBQUMsRUFDRixDQUNFeEgsS0FBSyxFQUNMRCxRQUFRLENBQUM4RCxVQUFVLEVBQ25COUQsUUFBUSxDQUFDNEYsYUFBYSxFQUN0QjVGLFFBQVEsQ0FBQ3dJLGFBQWEsRUFDdEJ4SSxRQUFRLENBQUM4SixlQUFlLEVBQ3hCOUosUUFBUSxDQUFDNkYsYUFBYSxFQUN0QjNELGtCQUFrQixFQUNsQmxDLFFBQVEsQ0FBQ3lGLGFBQWEsRUFDdEJ6RixRQUFRLENBQUMwRixlQUFlLEVBQ3hCd0IsWUFBWSxFQUNaTyxXQUFXLENBQ1osQ0FDRjtFQUVELE9BQU87SUFBRWlDLFlBQVksRUFBWkEsWUFBWTtJQUFFRyxTQUFTLEVBQVRBLFNBQVM7SUFBRTVKLEtBQUssRUFBTEE7RUFBSyxDQUFFO0FBQzNDLENBQUM7QUFFRCxlQUFlVixPQUFPIiwiZmlsZSI6ImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm0uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IHVzZU1lbW8sIHVzZUVmZmVjdCwgbWVtbywgRnJhZ21lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQDFtb25leS9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCB1c2VNZW1vaXplZEZuIGZyb20gJ0AxbW9uZXkvaG9va3MvdXNlTWVtb2l6ZWRGbic7XG5pbXBvcnQgeyB1c2VGb3JtQ29yZSB9IGZyb20gJy4vdXNlRm9ybUNvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi4vcGF0aFV0aWxzJztcbmltcG9ydCB7IHJ1blJ1bGVzQXN5bmMgfSBmcm9tICcuLi9ydW5SdWxlcyc7XG5pbXBvcnQgeyB1c2VTdG9yZVNlbGVjdG9yLCBzaGFsbG93RXF1YWxBcnJheXMgfSBmcm9tICcuLi9mb3JtU3RvcmUnO1xuLyoqXG4gKiBPbmx5IHJ1bGVzIHdpdGggYSBjdXN0b20gYHZhbGlkYXRvcmAgY2FuIGJlIGdlbnVpbmVseSBhc3luY2hyb25vdXMg4oCUXG4gKiBidWlsdGluIHJ1bGVzIHJlc29sdmUgd2l0aGluIGEgbWljcm90YXNrLCBzbyBmbGlwcGluZyBgdmFsaWRhdGluZ2AgZm9yXG4gKiB0aGVtIHdvdWxkIG9ubHkgY2h1cm4gc3Vic2NyaWJlcnMgd2l0aG91dCBldmVyIGJlaW5nIHZpc2libGUuXG4gKi9cbmNvbnN0IGhhc0N1c3RvbVZhbGlkYXRvciA9IChydWxlcykgPT4gcnVsZXMuc29tZSgocnVsZSkgPT4gdHlwZW9mIHJ1bGUudmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKTtcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gdXNlRm9ybVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY29uc3QgdXNlRm9ybSA9IChjb25maWcgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgb25GaW5pc2gsIG9uRmluaXNoRmFpbGVkLCBvblJlc2V0LCB2YWxpZGF0ZVRyaWdnZXIgPSAnb25DaGFuZ2UnLCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IGZvcm1Db3JlID0gdXNlRm9ybUNvcmUoY29uZmlnKTtcbiAgICBjb25zdCB7IHN0b3JlIH0gPSBmb3JtQ29yZTtcbiAgICAvLyBNYXJrIGZpZWxkcyBhcyB2YWxpZGF0aW5nIGluIE9ORSBjb21taXQuIHZhbGlkYXRpbmcgLyB0b3VjaGVkIGxpdmUgaW4gdGhlXG4gICAgLy8gc3RvcmUgYWxvbmdzaWRlIHZhbHVlcyDigJQgZmxpcHBpbmcgdGhlbSAoZS5nLiBhc3luYyB2YWxpZGF0aW9uIGFyb3VuZCBhXG4gICAgLy8gYmx1cikgbXVzdCBub3QgcmUtcmVuZGVyIHRoZSBmb3JtIHJvb3QsIG9ubHkgdGhlIGZpZWxkcyB0aGF0IHN1YnNjcmliZWQuXG4gICAgY29uc3QgbWFya1ZhbGlkYXRpbmcgPSB1c2VNZW1vaXplZEZuKChuYW1lcykgPT4ge1xuICAgICAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBuZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgc3RvcmUuZ2V0U3RhdGUoKS52YWxpZGF0aW5nKTtcbiAgICAgICAgbmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgbmV4dFtuYW1lXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHZhbGlkYXRpbmc6IG5leHQgfSk7XG4gICAgfSk7XG4gICAgLy8gRm9sZCBwZXItZmllbGQgcnVsZSBvdXRjb21lcyBpbnRvIEFUIE1PU1Qgb25lIHN0b3JlIGNvbW1pdDogZXJyb3JzIGFuZFxuICAgIC8vIHdhcm5pbmdzIGFyZSBtZXJnZWQgb3ZlciB0aGUgY3VycmVudCBtYXBzIGFuZCB0aGUgYGNsZWFyVmFsaWRhdGluZ2AgZmxhZ3NcbiAgICAvLyBhcmUgcmVtb3ZlZCBpbiB0aGUgU0FNRSBwYXRjaC4gQSBuby1vcCBvdXRjb21lIGNvbW1pdHMgbm90aGluZyBhdCBhbGwg4oCUXG4gICAgLy8gcGVyLWZpZWxkIGNvbW1pdHMgaGVyZSBwcmV2aW91c2x5IG1hZGUgc3VibWl0LXRpbWUgdmFsaWRhdGlvbiBzd2VlcCBldmVyeVxuICAgIC8vIHN1YnNjcmliZXIgTyhmaWVsZHMpIHRpbWVzLlxuICAgIGNvbnN0IGNvbW1pdFJ1bGVPdXRjb21lcyA9IHVzZU1lbW9pemVkRm4oKG91dGNvbWVzLCBjbGVhclZhbGlkYXRpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgZXJyb3JzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgd2FybmluZ3NDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5ld0Vycm9ycyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmVycm9ycyk7XG4gICAgICAgIGNvbnN0IG5ld1dhcm5pbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUud2FybmluZ3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgZXJyb3IsIHdhcm5pbmcgfSBvZiBvdXRjb21lcykge1xuICAgICAgICAgICAgaWYgKGVycm9yID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gbmV3RXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdFcnJvcnNbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGVycm9yc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5ld0Vycm9yc1tuYW1lXSAhPT0gZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBuZXdFcnJvcnNbbmFtZV0gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBlcnJvcnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3YXJuaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gbmV3V2FybmluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5ld1dhcm5pbmdzW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5ld1dhcm5pbmdzW25hbWVdICE9PSB3YXJuaW5nKSB7XG4gICAgICAgICAgICAgICAgbmV3V2FybmluZ3NbbmFtZV0gPSB3YXJuaW5nO1xuICAgICAgICAgICAgICAgIHdhcm5pbmdzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmxhZ3NUb0NsZWFyID0gY2xlYXJWYWxpZGF0aW5nLmZpbHRlcigobmFtZSkgPT4gbmFtZSBpbiBzdGF0ZS52YWxpZGF0aW5nKTtcbiAgICAgICAgY29uc3QgcGF0Y2ggPSB7fTtcbiAgICAgICAgaWYgKGVycm9yc0NoYW5nZWQpXG4gICAgICAgICAgICBwYXRjaC5lcnJvcnMgPSBuZXdFcnJvcnM7XG4gICAgICAgIGlmICh3YXJuaW5nc0NoYW5nZWQpXG4gICAgICAgICAgICBwYXRjaC53YXJuaW5ncyA9IG5ld1dhcm5pbmdzO1xuICAgICAgICBpZiAoZmxhZ3NUb0NsZWFyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbGlkYXRpbmcgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS52YWxpZGF0aW5nKTtcbiAgICAgICAgICAgIGZsYWdzVG9DbGVhci5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld1ZhbGlkYXRpbmdbbmFtZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhdGNoLnZhbGlkYXRpbmcgPSBuZXdWYWxpZGF0aW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHBhdGNoKTtcbiAgICB9KTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBBc3luYyBmaWVsZCB2YWxpZGF0aW9uIOKAkyBlYWNoIHJ1bGUgaXMgcHJvY2Vzc2VkIGV4YWN0bHkgb25jZVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IHZhbGlkYXRlRmllbGRBc3luYyA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIHZhbHVlLCBydWxlcykgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghcnVsZXMgfHwgcnVsZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgY29uc3QgZmxhZ2dlZCA9IGhhc0N1c3RvbVZhbGlkYXRvcihydWxlcykgPyBbbmFtZV0gOiBbXTtcbiAgICAgICAgbWFya1ZhbGlkYXRpbmcoZmxhZ2dlZCk7XG4gICAgICAgIGxldCBvdXRjb21lID0geyBuYW1lLCBlcnJvcjogbnVsbCwgd2FybmluZzogbnVsbCB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBlcnJvciwgd2FybmluZyB9ID0geWllbGQgcnVuUnVsZXNBc3luYyhuYW1lLCB2YWx1ZSwgZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgcnVsZXMpO1xuICAgICAgICAgICAgb3V0Y29tZSA9IHsgbmFtZSwgZXJyb3IsIHdhcm5pbmcgfTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNvbW1pdFJ1bGVPdXRjb21lcyhbb3V0Y29tZV0sIGZsYWdnZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IG91dGNvbWUuZXJyb3IgPT09IG51bGwsIGVycm9yOiBvdXRjb21lLmVycm9yIH07XG4gICAgfSkpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEFzeW5jIGZpZWxkIGJsdXIgaGFuZGxlclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGhhbmRsZUZpZWxkQmx1ciA9IHVzZUV2ZW50Q2FsbGJhY2soKG5hbWUpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB0b3VjaGVkID0gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICBpZiAoIXRvdWNoZWRbbmFtZV0pIHtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdG91Y2hlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0b3VjaGVkKSwgeyBbbmFtZV06IHRydWUgfSkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZXMgPSBmb3JtQ29yZS5nZXRGaWVsZFJ1bGVzKG5hbWUpO1xuICAgICAgICBpZiAocnVsZXMgJiYgdmFsaWRhdGVUcmlnZ2VyID09PSAnb25CbHVyJykge1xuICAgICAgICAgICAgeWllbGQgdmFsaWRhdGVGaWVsZEFzeW5jKG5hbWUsIHJlc29sdmVWYWx1ZShmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBuYW1lKSwgcnVsZXMpO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFZhbGlkYXRlIGFsbCBmaWVsZHMgYXN5bmNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCB2YWxpZGF0ZUZpZWxkc0FzeW5jID0gdXNlTWVtb2l6ZWRGbigobmFtZUxpc3QpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBmaWVsZHNUb1ZhbGlkYXRlID0gbmFtZUxpc3QgfHwgT2JqZWN0LmtleXMoZm9ybUNvcmUuZmllbGRSdWxlcyk7XG4gICAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0ge307XG4gICAgICAgIC8vIE9uZSBjb21taXQgdG8gcmFpc2UgdGhlIHZhbGlkYXRpbmcgZmxhZ3MgKHZhbGlkYXRvci1iZWFyaW5nIGZpZWxkc1xuICAgICAgICAvLyBvbmx5KSwgb25lIGNvbW1pdCB0byBsYW5kIGV2ZXJ5IGVycm9yL3dhcm5pbmcgYW5kIGNsZWFyIHRoZSBmbGFncy5cbiAgICAgICAgY29uc3QgZmxhZ2dlZCA9IGZpZWxkc1RvVmFsaWRhdGUuZmlsdGVyKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBydWxlcyA9IGZvcm1Db3JlLmZpZWxkUnVsZXNbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gcnVsZXMgPyBoYXNDdXN0b21WYWxpZGF0b3IocnVsZXMpIDogZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBtYXJrVmFsaWRhdGluZyhmbGFnZ2VkKTtcbiAgICAgICAgY29uc3Qgb3V0Y29tZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHlpZWxkIFByb21pc2UuYWxsKGZpZWxkc1RvVmFsaWRhdGUubWFwKChuYW1lKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBydWxlcyA9IGZvcm1Db3JlLmZpZWxkUnVsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCFydWxlcylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IsIHdhcm5pbmcgfSA9IHlpZWxkIHJ1blJ1bGVzQXN5bmMobmFtZSwgcmVzb2x2ZVZhbHVlKGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCksIG5hbWUpLCBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBydWxlcyk7XG4gICAgICAgICAgICAgICAgb3V0Y29tZXMucHVzaCh7IG5hbWUsIGVycm9yLCB3YXJuaW5nIH0pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tuYW1lXSA9IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBjb21taXRSdWxlT3V0Y29tZXMob3V0Y29tZXMsIGZsYWdnZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhmaWVsZEVycm9ycykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1ZhbGlkYXRpb24gZmFpbGVkJyk7XG4gICAgICAgICAgICBlcnJvci52YWx1ZXMgPSBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpO1xuICAgICAgICAgICAgZXJyb3IuZXJyb3JzID0gZmllbGRFcnJvcnM7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZUxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBuYW1lTGlzdC5yZWR1Y2UoKGFjYywgbmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGFjY1tuYW1lXSA9IHJlc29sdmVWYWx1ZShmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpO1xuICAgIH0pKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBkZWZpbmVGaWVsZCDigJMgdXNlZCBieSBzdGFuZGFsb25lIChub24tUHJvRm9ybSkgY29uc3VtZXJzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgZGVmaW5lRmllbGQgPSB1c2VNZW1vaXplZEZuKChuYW1lLCBmaWVsZE9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCB7IHJ1bGVzID0gW10gfSA9IGZpZWxkT3B0aW9ucztcbiAgICAgICAgY29uc3QgRmllbGRDb21wb25lbnQgPSBtZW1vKChfYSkgPT4ge1xuICAgICAgICAgICAgdmFyIHsgY2hpbGRyZW4sIHJlbmRlciB9ID0gX2EsIHByb3BzID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiLCBcInJlbmRlclwiXSk7XG4gICAgICAgICAgICAvLyBQZXItZmllbGQgc3RvcmUgc3Vic2NyaXB0aW9uOiB0aGlzIGZpZWxkIHJlLXJlbmRlcnMgb25seSB3aGVuIGl0c1xuICAgICAgICAgICAgLy8gb3duIHZhbHVlL2Vycm9yL3RvdWNoZWQvdmFsaWRhdGluZyBzbGljZSBjaGFuZ2VzLlxuICAgICAgICAgICAgY29uc3QgW2ZpZWxkVmFsdWUsIGZpZWxkRXJyb3IsIGZpZWxkVG91Y2hlZCwgZmllbGRWYWxpZGF0aW5nXSA9IHVzZVN0b3JlU2VsZWN0b3Ioc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSBzdGF0ZS52YWx1ZXNbbmFtZV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcnNbbmFtZV0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnRvdWNoZWRbbmFtZV0sXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbGlkYXRpbmdbbmFtZV0sXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0sIHNoYWxsb3dFcXVhbEFycmF5cyk7XG4gICAgICAgICAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUnVsZXMgPSBmb3JtQ29yZS5nZXRGaWVsZFJ1bGVzKG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3RpbmdSdWxlcyAmJiBydWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQobmFtZSwgcnVsZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ29yZS51bnJlZ2lzdGVyRmllbGQobmFtZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sIFtdKTsgLy8gT25seSByZWdpc3RlciBvbiBtb3VudFxuICAgICAgICAgICAgY29uc3QgaGFuZGxlRmllbGRDaGFuZ2UgPSB1c2VFdmVudENhbGxiYWNrKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcm1Db3JlLnNldEZpZWxkVmFsdWUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZVRyaWdnZXIgPT09ICdvbkNoYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvcmUudmFsaWRhdGVGaWVsZChuYW1lLCBydWxlcywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlQmx1ciA9IHVzZUV2ZW50Q2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZUZpZWxkQmx1cihuYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZmllbGRQcm9wcyA9IE9iamVjdC5hc3NpZ24oeyBuYW1lLCB2YWx1ZTogZmllbGRWYWx1ZSwgZXJyb3I6IGZpZWxkRXJyb3IsIHRvdWNoZWQ6IGZpZWxkVG91Y2hlZCwgdmFsaWRhdGluZzogZmllbGRWYWxpZGF0aW5nLCBvbkNoYW5nZTogaGFuZGxlRmllbGRDaGFuZ2UsIG9uQmx1cjogaGFuZGxlQmx1ciB9LCBwcm9wcyk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVNZXJnZUNoYW5nZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZSAmJiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgJ3RhcmdldCcgaW4gZVxuICAgICAgICAgICAgICAgICAgICA/IGUudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogZTtcbiAgICAgICAgICAgICAgICBoYW5kbGVGaWVsZENoYW5nZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSAmJlxuICAgICAgICAgICAgICAgICAgICAoKF9hID0gY2hpbGRyZW4ucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkNoYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHJvcHMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVNZXJnZUJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGhhbmRsZUJsdXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pICYmXG4gICAgICAgICAgICAgICAgICAgICgoX2EgPSBjaGlsZHJlbi5wcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uQmx1cikpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHJvcHMub25CbHVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyZW5kZXIgJiYgdHlwZW9mIHJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXIoZmllbGRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKGZpZWxkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmaWVsZFByb3BzKSwgeyBvbkNoYW5nZTogaGFuZGxlTWVyZ2VDaGFuZ2UsIG9uQmx1cjogaGFuZGxlTWVyZ2VCbHVyIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIG1lcmdlZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCAuLi5jaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZmllbGRQcm9wcyksIHsga2V5OiBjaGlsZC5rZXkgfHwgaW5kZXgsIG9uQ2hhbmdlOiBoYW5kbGVNZXJnZUNoYW5nZSwgb25CbHVyOiBoYW5kbGVNZXJnZUJsdXIgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkLCBtZXJnZWRQcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgICAgRmllbGRDb21wb25lbnQuZGlzcGxheU5hbWUgPSBgRmllbGQoJHtuYW1lfSlgO1xuICAgICAgICByZXR1cm4gRmllbGRDb21wb25lbnQ7XG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gaGFuZGxlU3VibWl0IC8gaGFuZGxlUmVzZXQg4oCTIGZvciA8Zm9ybT4gZXZlbnQgaGFuZGxlcnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBoYW5kbGVTdWJtaXQgPSB1c2VFdmVudENhbGxiYWNrKChlKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRWYWx1ZXMgPSB5aWVsZCB2YWxpZGF0ZUZpZWxkc0FzeW5jKCk7XG4gICAgICAgICAgICBvbkZpbmlzaCA9PT0gbnVsbCB8fCBvbkZpbmlzaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25GaW5pc2godmFsaWRhdGVkVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZCA9IGVycjtcbiAgICAgICAgICAgIG9uRmluaXNoRmFpbGVkID09PSBudWxsIHx8IG9uRmluaXNoRmFpbGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZpbmlzaEZhaWxlZCh7IHZhbHVlczogdHlwZWQudmFsdWVzLCBlcnJvcnM6IHR5cGVkLmVycm9ycyB9KTtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBoYW5kbGVSZXNldCA9IHVzZUV2ZW50Q2FsbGJhY2soKGUpID0+IHtcbiAgICAgICAgZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGZvcm1Db3JlLnJlc2V0RmllbGRzKCk7XG4gICAgICAgIG9uUmVzZXQgPT09IG51bGwgfHwgb25SZXNldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25SZXNldCgpO1xuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEZvcm1JbnN0YW5jZSDigJMgZW5oYW5jZWQgQVBJIGZvciBjb25zdW1lcnMuXG4gICAgLy9cbiAgICAvLyBFdmVyeSBtZXRob2QgaXMgd3JhcHBlZCBpbiB1c2VNZW1vaXplZEZuIChzdGFibGUgaWRlbnRpdHksIGFsd2F5cyByZWFkcyB0aGVcbiAgICAvLyBsYXRlc3Qgc3RvcmUgc3RhdGUpIHNvIHRoZSBpbnN0YW5jZSBvYmplY3QgaXRzZWxmIGlzIElERU5USVRZLVNUQUJMRSBmb3JcbiAgICAvLyB0aGUgbGlmZXRpbWUgb2YgdGhlIGZvcm0g4oCUIHRoaXMgaXMgd2hhdCBsZXRzIFByb0Zvcm0gcHVibGlzaCBpdCB0aHJvdWdoIHRoZVxuICAgIC8vIHN0YWJsZSBjb250ZXh0IHdpdGhvdXQgcmUtcmVuZGVyaW5nIHN1YnNjcmliZXJzIG9uIGVhY2gga2V5c3Ryb2tlLlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGdldEZpZWxkRXJyb3IgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLmVycm9yc1tuYW1lXSk7XG4gICAgY29uc3QgZ2V0RmllbGRXYXJuaW5nID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4gc3RvcmUuZ2V0U3RhdGUoKS53YXJuaW5nc1tuYW1lXSk7XG4gICAgY29uc3QgZ2V0RmllbGRzRXJyb3IgPSB1c2VNZW1vaXplZEZuKChuYW1lTGlzdCkgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBzdG9yZS5nZXRTdGF0ZSgpLmVycm9ycztcbiAgICAgICAgaWYgKCFuYW1lTGlzdClcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBuYW1lTGlzdC5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3JzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gZXJyb3JzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICBjb25zdCBpc0ZpZWxkVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZFtuYW1lXSB8fCBmYWxzZSk7XG4gICAgY29uc3QgaXNGaWVsZHNUb3VjaGVkID0gdXNlTWVtb2l6ZWRGbigobmFtZUxpc3QsIGFsbEZpZWxkc1RvdWNoZWQgPSBmYWxzZSkgPT4ge1xuICAgICAgICBjb25zdCB0b3VjaGVkID0gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICBpZiAoIW5hbWVMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModG91Y2hlZCkuc29tZSgoa2V5KSA9PiB0b3VjaGVkW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxGaWVsZHNUb3VjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZUxpc3QuZXZlcnkoKG5hbWUpID0+IHRvdWNoZWRbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lTGlzdC5zb21lKChuYW1lKSA9PiB0b3VjaGVkW25hbWVdKTtcbiAgICB9KTtcbiAgICBjb25zdCBpc0ZpZWxkVmFsaWRhdGluZyA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHN0b3JlLmdldFN0YXRlKCkudmFsaWRhdGluZ1tuYW1lXSB8fCBmYWxzZSk7XG4gICAgY29uc3Qgc2V0RmllbGRzRXJyb3IgPSB1c2VNZW1vaXplZEZuKChmaWVsZHNFcnJvcikgPT4ge1xuICAgICAgICBPYmplY3QuZW50cmllcyhmaWVsZHNFcnJvcikuZm9yRWFjaCgoW25hbWUsIGVycm9yXSkgPT4ge1xuICAgICAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRFcnJvcihuYW1lLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIGlzVG91Y2hlZCA9IHRydWUpID0+IHtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB0b3VjaGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZCksIHsgW25hbWVdOiBpc1RvdWNoZWQgfSkgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RmllbGRzVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKGZpZWxkc1RvdWNoKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdG91Y2hlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdG9yZS5nZXRTdGF0ZSgpLnRvdWNoZWQpLCBmaWVsZHNUb3VjaCkgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVzZXRGb3JtRmllbGRzID0gdXNlTWVtb2l6ZWRGbigoZmllbGRzKSA9PiB7XG4gICAgICAgIGlmICghZmllbGRzKSB7XG4gICAgICAgICAgICBmb3JtQ29yZS5yZXNldEZpZWxkcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzZXRWYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE1vdW50LWZyb3plbiBpbml0aWFsVmFsdWVzIOKAlCBjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgcmVzZXRGaWVsZHMuXG4gICAgICAgICAgICAgICAgcmVzZXRWYWx1ZXNbZmllbGRdID0gZm9ybUNvcmUuZ2V0SW5pdGlhbFZhbHVlcygpW2ZpZWxkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRzVmFsdWUocmVzZXRWYWx1ZXMpO1xuICAgICAgICAgICAgY29uc3QgeyB0b3VjaGVkLCB2YWxpZGF0aW5nIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgbmV3VG91Y2hlZCA9IE9iamVjdC5hc3NpZ24oe30sIHRvdWNoZWQpO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsaWRhdGluZyA9IE9iamVjdC5hc3NpZ24oe30sIHZhbGlkYXRpbmcpO1xuICAgICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld1RvdWNoZWRbZmllbGRdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdWYWxpZGF0aW5nW2ZpZWxkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB0b3VjaGVkOiBuZXdUb3VjaGVkLCB2YWxpZGF0aW5nOiBuZXdWYWxpZGF0aW5nIH0pO1xuICAgICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRFcnJvcihmaWVsZCwgbnVsbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHN1Ym1pdFdpdGhWYWxpZGF0aW9uID0gdXNlTWVtb2l6ZWRGbigoY2FsbGJhY2spID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVkVmFsdWVzID0geWllbGQgdmFsaWRhdGVGaWVsZHNBc3luYygpO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgY2FsbGJhY2sodmFsaWRhdGVkVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZWRWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IGZvcm1JbnN0YW5jZSA9IHVzZU1lbW8oKCkgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZm9ybUNvcmUuZm9ybUluc3RhbmNlKSwgeyB2YWxpZGF0ZUZpZWxkczogdmFsaWRhdGVGaWVsZHNBc3luYywgc2V0RmllbGRWYWx1ZTogZm9ybUNvcmUuc2V0RmllbGRWYWx1ZSwgZ2V0RmllbGRFcnJvcixcbiAgICAgICAgZ2V0RmllbGRXYXJuaW5nLFxuICAgICAgICBnZXRGaWVsZHNFcnJvcixcbiAgICAgICAgaXNGaWVsZFRvdWNoZWQsXG4gICAgICAgIGlzRmllbGRzVG91Y2hlZCxcbiAgICAgICAgaXNGaWVsZFZhbGlkYXRpbmcsIHNldEZpZWxkRXJyb3I6IGZvcm1Db3JlLnNldEZpZWxkRXJyb3IsIHNldEZpZWxkc0Vycm9yLFxuICAgICAgICBzZXRGaWVsZFRvdWNoZWQsXG4gICAgICAgIHNldEZpZWxkc1RvdWNoZWQsIHJlc2V0RmllbGRzOiByZXNldEZvcm1GaWVsZHMsIHN1Ym1pdDogc3VibWl0V2l0aFZhbGlkYXRpb24sIGRlZmluZUZpZWxkLCByZWdpc3RlckZpZWxkOiBmb3JtQ29yZS5yZWdpc3RlckZpZWxkLCB1bnJlZ2lzdGVyRmllbGQ6IGZvcm1Db3JlLnVucmVnaXN0ZXJGaWVsZCB9KSksIFtcbiAgICAgICAgZm9ybUNvcmUuZm9ybUluc3RhbmNlLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZEVycm9yLFxuICAgICAgICBmb3JtQ29yZS5yZWdpc3RlckZpZWxkLFxuICAgICAgICBmb3JtQ29yZS51bnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHZhbGlkYXRlRmllbGRzQXN5bmMsXG4gICAgICAgIGdldEZpZWxkRXJyb3IsXG4gICAgICAgIGdldEZpZWxkV2FybmluZyxcbiAgICAgICAgZ2V0RmllbGRzRXJyb3IsXG4gICAgICAgIGlzRmllbGRUb3VjaGVkLFxuICAgICAgICBpc0ZpZWxkc1RvdWNoZWQsXG4gICAgICAgIGlzRmllbGRWYWxpZGF0aW5nLFxuICAgICAgICBzZXRGaWVsZHNFcnJvcixcbiAgICAgICAgc2V0RmllbGRUb3VjaGVkLFxuICAgICAgICBzZXRGaWVsZHNUb3VjaGVkLFxuICAgICAgICByZXNldEZvcm1GaWVsZHMsXG4gICAgICAgIHN1Ym1pdFdpdGhWYWxpZGF0aW9uLFxuICAgICAgICBkZWZpbmVGaWVsZCxcbiAgICBdKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBJbnRlcm5hbHMg4oCTIGV4cG9zZWQgZm9yIFByb0Zvcm0gaW50ZWdyYXRpb24uIERhdGEgZmllbGRzIGFyZSBHRVRURVJTIHRoYXRcbiAgICAvLyByZWFkIHRoZSBsaXZlIHN0b3JlLCBzbyB0aGUgb2JqZWN0IGlzIGlkZW50aXR5LXN0YWJsZSB5ZXQgbmV2ZXIgc3RhbGUuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgaW50ZXJuYWxzID0gdXNlTWVtbygoKSA9PiAoe1xuICAgICAgICBnZXQgdmFsdWVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkudmFsdWVzO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgZXJyb3JzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkuZXJyb3JzO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgd2FybmluZ3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS53YXJuaW5ncztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHRvdWNoZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgdmFsaWRhdGluZygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpLnZhbGlkYXRpbmc7XG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkUnVsZXM6IGZvcm1Db3JlLmZpZWxkUnVsZXMsXG4gICAgICAgIHNldEZpZWxkVmFsdWU6IGZvcm1Db3JlLnNldEZpZWxkVmFsdWUsXG4gICAgICAgIHNldEZpZWxkRXJyb3I6IGZvcm1Db3JlLnNldEZpZWxkRXJyb3IsXG4gICAgICAgIHNldEZpZWxkV2FybmluZzogZm9ybUNvcmUuc2V0RmllbGRXYXJuaW5nLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkOiBmb3JtQ29yZS52YWxpZGF0ZUZpZWxkLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkQXN5bmMsXG4gICAgICAgIHJlZ2lzdGVyRmllbGQ6IGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHVucmVnaXN0ZXJGaWVsZDogZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIGhhbmRsZVJlc2V0LFxuICAgIH0pLCBbXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBmb3JtQ29yZS5maWVsZFJ1bGVzLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZEVycm9yLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFdhcm5pbmcsXG4gICAgICAgIGZvcm1Db3JlLnZhbGlkYXRlRmllbGQsXG4gICAgICAgIHZhbGlkYXRlRmllbGRBc3luYyxcbiAgICAgICAgZm9ybUNvcmUucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIGhhbmRsZVJlc2V0LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGZvcm1JbnN0YW5jZSwgaW50ZXJuYWxzLCBzdG9yZSB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZUZvcm07IixudWxsXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyJ9
|
|
799
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvRm9ybS9jb3JlL2hvb2tzL3VzZUZvcm0uanMiLCJjb21wb25lbnRzL1Byb0Zvcm0vY29yZS9zcmMvY29tcG9uZW50cy9Qcm9Gb3JtL2NvcmUvaG9va3MvdXNlRm9ybS50cyJdLCJuYW1lcyI6WyJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInZhbHVlIiwicmVzb2x2ZSIsIlByb21pc2UiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJfX3Jlc3QiLCJzIiwidCIsInAiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpbmRleE9mIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiaSIsImxlbmd0aCIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidXNlTWVtbyIsInVzZUVmZmVjdCIsInVzZVJlZiIsIm1lbW8iLCJGcmFnbWVudCIsIlJlYWN0IiwidXNlRXZlbnRDYWxsYmFjayIsInVzZU1lbW9pemVkRm4iLCJ1c2VGb3JtQ29yZSIsInJlc29sdmVWYWx1ZSIsInNldE5lc3RlZFZhbHVlIiwiY29lcmNlRmFpbHVyZVJlYXNvbiIsImZpbHRlclJ1bGVzQnlUcmlnZ2VyIiwibm9ybWFsaXplVHJpZ2dlcnMiLCJyZXNvbHZlUnVsZXMiLCJydW5SdWxlc0FzeW5jIiwidXNlU3RvcmVTZWxlY3RvciIsInNoYWxsb3dFcXVhbEFycmF5cyIsInNhbWVWYWxpZGF0aW9uTm9kZSIsIkZvcm1WYWxpZGF0aW9uRXJyb3IiLCJhc1J1bGVBcnJheSIsInJ1bGUiLCJBcnJheSIsImlzQXJyYXkiLCJydWxlSGFzVmFsaWRhdG9yIiwidmFsaWRhdG9yIiwiZGVmYXVsdEZpZWxkIiwic29tZSIsImZpZWxkcyIsInZhbHVlcyIsInN1YiIsImhhc1Jlc29sdmVkVmFsaWRhdG9yIiwicmVzb2x2ZWQiLCJ1c2VGb3JtIiwiY29uZmlnIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwib25GaW5pc2giLCJvbkZpbmlzaEZhaWxlZCIsIm9uUmVzZXQiLCJfY29uZmlnJHZhbGlkYXRlVHJpZ2ciLCJ2YWxpZGF0ZVRyaWdnZXIiLCJmb3JtQ29yZSIsInN0b3JlIiwibGFzdEFzeW5jRXBvY2hSZWYiLCJtYXJrVmFsaWRhdGluZyIsIm5hbWVzIiwiYXNzaWduIiwiZ2V0U3RhdGUiLCJ2YWxpZGF0aW5nIiwiZm9yRWFjaCIsIm5hbWUiLCJzZXRTdGF0ZSIsImNvbW1pdFJ1bGVPdXRjb21lcyIsIm91dGNvbWVzIiwiY2xlYXJWYWxpZGF0aW5nIiwic3RhdGUiLCJlcnJvcnNDaGFuZ2VkIiwid2FybmluZ3NDaGFuZ2VkIiwibmV3RXJyb3JzIiwiZXJyb3JzIiwibmV3V2FybmluZ3MiLCJ3YXJuaW5ncyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJuIiwiX3N0ZXAkdmFsdWUiLCJlcnJvciIsIndhcm5pbmciLCJlcnIiLCJmIiwiZmxhZ3NUb0NsZWFyIiwiZmlsdGVyIiwicGF0Y2giLCJuZXdWYWxpZGF0aW5nIiwia2V5cyIsInZhbGlkYXRlRmllbGRBc3luYyIsInJ1bGVzIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX2EiLCJlcG9jaCIsImZsYWdnZWQiLCJvdXRjb21lIiwiX3lpZWxkJHJ1blJ1bGVzQXN5bmMiLCJpc0N1cnJlbnQiLCJjbGVhckZsYWdzIiwiX3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwiYWJydXB0IiwiaXNWYWxpZCIsImJlZ2luVmFsaWRhdGlvblJ1biIsImdldEZpZWxkc1ZhbHVlIiwiZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSIsImZsYWdnZWROYW1lIiwiY3VycmVudCIsInNlbnQiLCJpc1ZhbGlkYXRpb25SdW5DdXJyZW50IiwiZmluaXNoIiwic3RvcCIsImhhbmRsZUZpZWxkQmx1ciIsImZpZWxkVHJpZ2dlciIsIl9jYWxsZWUyIiwidG91Y2hlZCIsImFwcGxpY2FibGUiLCJfY29udGV4dDIiLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRGaWVsZFJ1bGVzIiwidmFsaWRhdGVGaWVsZHNBc3luYyIsIm5hbWVMaXN0IiwiX2NhbGxlZTQiLCJmaWVsZHNUb1ZhbGlkYXRlIiwiZmllbGRFcnJvcnMiLCJyZXNvbHZlZEJ5RmllbGQiLCJlcG9jaEJ5RmllbGQiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiX2NvbnRleHQ0IiwiZmllbGRSdWxlcyIsIk1hcCIsInNldCIsImdldCIsImFsbCIsIm1hcCIsIl9jYWxsZWUzIiwiX3lpZWxkJHJ1blJ1bGVzQXN5bmMyIiwiX3QyIiwiX2NvbnRleHQzIiwicHVzaCIsInJlZHVjZSIsImFjYyIsImRlZmluZUZpZWxkIiwiZmllbGRPcHRpb25zIiwiX2ZpZWxkT3B0aW9ucyRydWxlcyIsIkZpZWxkQ29tcG9uZW50IiwiY2hpbGRyZW4iLCJyZW5kZXIiLCJwcm9wcyIsIl91c2VTdG9yZVNlbGVjdG9yIiwiX3VzZVN0b3JlU2VsZWN0b3IyIiwiX3NsaWNlZFRvQXJyYXkiLCJmaWVsZFZhbHVlIiwiZmllbGRFcnJvciIsImZpZWxkVG91Y2hlZCIsImZpZWxkVmFsaWRhdGluZyIsInJldGFpbkZpZWxkIiwiZXhpc3RpbmdSdWxlcyIsInJlZ2lzdGVyRmllbGQiLCJyZWxlYXNlRmllbGQiLCJoYW5kbGVGaWVsZENoYW5nZSIsInNldEZpZWxkVmFsdWUiLCJoYW5kbGVCbHVyIiwiZmllbGRQcm9wcyIsIm9uQ2hhbmdlIiwib25CbHVyIiwiaGFuZGxlTWVyZ2VDaGFuZ2UiLCJfdHlwZW9mIiwidGFyZ2V0IiwiaXNWYWxpZEVsZW1lbnQiLCJoYW5kbGVNZXJnZUJsdXIiLCJkb21TYWZlUHJvcHMiLCJjbG9uZUVsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiY2hpbGQiLCJpbmRleCIsImtleSIsImRpc3BsYXlOYW1lIiwiaGFuZGxlU3VibWl0IiwiX2NhbGxlZTUiLCJ2YWxpZGF0ZWRWYWx1ZXMiLCJfdDMiLCJfY29udGV4dDUiLCJwcmV2ZW50RGVmYXVsdCIsImNvbnNvbGUiLCJoYW5kbGVSZXNldCIsInJlc2V0RmllbGRzIiwiZ2V0RmllbGRFcnJvciIsImdldEZpZWxkV2FybmluZyIsImdldEZpZWxkc0Vycm9yIiwiaXNGaWVsZFRvdWNoZWQiLCJpc0ZpZWxkc1RvdWNoZWQiLCJhbGxGaWVsZHNUb3VjaGVkIiwiZXZlcnkiLCJpc0ZpZWxkVmFsaWRhdGluZyIsInNldEZpZWxkc0Vycm9yIiwiZmllbGRzRXJyb3IiLCJlbnRyaWVzIiwiX3JlZiIsIl9yZWYyIiwic2V0RmllbGRFcnJvciIsInNldEZpZWxkVG91Y2hlZCIsImlzVG91Y2hlZCIsInNldEZpZWxkc1RvdWNoZWQiLCJmaWVsZHNUb3VjaCIsInJlc2V0Rm9ybUZpZWxkcyIsImluaXRpYWxWYWx1ZXMiLCJnZXRJbml0aWFsVmFsdWVzIiwibmV3VmFsdWVzIiwiZmllbGQiLCJpbml0aWFsIiwiaW5jbHVkZXMiLCJpbnZhbGlkYXRlVmFsaWRhdGlvblJ1bnMiLCJuZXdUb3VjaGVkIiwic3VibWl0V2l0aFZhbGlkYXRpb24iLCJjYWxsYmFjayIsIl9jYWxsZWU2IiwiX3Q0IiwiX3Q1IiwiX2NvbnRleHQ2IiwiZm9ybUluc3RhbmNlIiwiZ2V0RmllbGRWYWx1ZSIsInZhbGlkYXRlRmllbGRzIiwic2V0RmllbGRzVmFsdWUiLCJzdWJtaXQiLCJ1bnJlZ2lzdGVyRmllbGQiLCJzZXRSdWxlQ29udGV4dEluc3RhbmNlIiwiaW50ZXJuYWxzIiwic2V0RmllbGRXYXJuaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUlBLFNBQVMsR0FBSSxJQUFJLElBQUksSUFBSSxDQUFDQSxTQUFTLElBQUssVUFBVUMsT0FBTyxFQUFFQyxVQUFVLEVBQUVDLENBQUMsRUFBRUMsU0FBUyxFQUFFO0VBQ3JGLFNBQVNDLEtBQUtBLENBQUNDLEtBQUssRUFBRTtJQUFF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RU8sU0FBUyxFQUFUQSxTQUFTO0lBQUVuTCxLQUFLLEVBQUxBO0VBQUssQ0FBRTtBQUMzQyxDQUFDO0FBRUQsZUFBZVYsT0FBTyIsImZpbGUiOiJjb21wb25lbnRzL1Byb0Zvcm0vY29yZS9ob29rcy91c2VGb3JtLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyB1c2VNZW1vLCB1c2VFZmZlY3QsIHVzZVJlZiwgbWVtbywgRnJhZ21lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVzZUV2ZW50Q2FsbGJhY2sgZnJvbSAnQDFtb25leS9ob29rcy91c2VFdmVudENhbGxiYWNrJztcbmltcG9ydCB1c2VNZW1vaXplZEZuIGZyb20gJ0AxbW9uZXkvaG9va3MvdXNlTWVtb2l6ZWRGbic7XG5pbXBvcnQgeyB1c2VGb3JtQ29yZSB9IGZyb20gJy4vdXNlRm9ybUNvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlLCBzZXROZXN0ZWRWYWx1ZSB9IGZyb20gJy4uL3BhdGhVdGlscyc7XG5pbXBvcnQgeyBjb2VyY2VGYWlsdXJlUmVhc29uLCBmaWx0ZXJSdWxlc0J5VHJpZ2dlciwgbm9ybWFsaXplVHJpZ2dlcnMsIHJlc29sdmVSdWxlcywgcnVuUnVsZXNBc3luYywgfSBmcm9tICcuLi9ydW5SdWxlcyc7XG5pbXBvcnQgeyB1c2VTdG9yZVNlbGVjdG9yLCBzaGFsbG93RXF1YWxBcnJheXMsIHNhbWVWYWxpZGF0aW9uTm9kZSB9IGZyb20gJy4uL2Zvcm1TdG9yZSc7XG5pbXBvcnQgeyBGb3JtVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vdmFsaWRhdGlvbkVycm9yJztcbi8qKlxuICogT25seSBydWxlcyB3aXRoIGEgY3VzdG9tIGB2YWxpZGF0b3JgIGNhbiBiZSBnZW51aW5lbHkgYXN5bmNocm9ub3VzIOKAlFxuICogYnVpbHRpbiBydWxlcyByZXNvbHZlIHdpdGhpbiBhIG1pY3JvdGFzaywgc28gZmxpcHBpbmcgYHZhbGlkYXRpbmdgIGZvclxuICogdGhlbSB3b3VsZCBvbmx5IGNodXJuIHN1YnNjcmliZXJzIHdpdGhvdXQgZXZlciBiZWluZyB2aXNpYmxlLiBEZWNpZGVkIG9uXG4gKiBSRVNPTFZFRCBydWxlczogYSBmdW5jdGlvbi1mb3JtIHJ1bGUgdGhhdCByZXNvbHZlcyB0byBidWlsdGluLW9ubHkgY2hlY2tzXG4gKiBtdXN0IG5vdCBmbGlja2VyIHRoZSBmbGFnLlxuICpcbiAqIFRoZSBhc3luYyBlbmdpbmUgYXdhaXRzIHZhbGlkYXRvcnMgbmVzdGVkIGluc2lkZSBgZmllbGRzYCAvIGBkZWZhdWx0RmllbGRgXG4gKiB0b28sIHNvIHRoZSBkZWNpc2lvbiBtdXN0IGRlc2NlbmQgdGhlIHNhbWUgd2F5IOKAlCBvdGhlcndpc2UgYSBkZWVwLW9ubHlcbiAqIHZhbGlkYXRvciAoZS5nLiBgeyBkZWZhdWx0RmllbGQ6IHsgdmFsaWRhdG9yIH0gfWApIHJ1bnMgcGVuZGluZyB3aXRoIHRoZVxuICogZmxhZyBzdHVjayBmYWxzZSwgYW5kIGBpc0ZpZWxkVmFsaWRhdGluZyhuYW1lKWAgdW5kZXItcmVwb3J0cyBmb3IgdGhlIHdob2xlXG4gKiB3aW5kb3cuIE92ZXItZmxhZ2dpbmcgd2hlbiB0aGUgZGVlcCB2YWxpZGF0b3Igd29uJ3QgYWN0dWFsbHkgZmlyZSAoZW1wdHkgL1xuICogcHJpbWl0aXZlIHZhbHVlKSBpcyBhY2NlcHRhYmxlOiB0aGUgZmxhZyBpcyBkZWNpZGVkIG9uIHJ1bGUgU0hBUEUsIGV4YWN0bHlcbiAqIGFzIHRoZSB0b3AtbGV2ZWwgY2FzZSBhbHJlYWR5IG92ZXItZmxhZ3MgYSB2YWxpZGF0b3Igc2hvcnQtY2lyY3VpdGVkIGJ5IGFuXG4gKiBlYXJsaWVyIGJ1aWx0aW4gZmFpbHVyZTsgdGhlIHJ1biBjbGVhcnMgaXQgb24gc2V0dGxlIGVpdGhlciB3YXkuXG4gKi9cbmNvbnN0IGFzUnVsZUFycmF5ID0gKHJ1bGUpID0+IHJ1bGUgPyAoQXJyYXkuaXNBcnJheShydWxlKSA/IHJ1bGUgOiBbcnVsZV0pIDogW107XG5jb25zdCBydWxlSGFzVmFsaWRhdG9yID0gKHJ1bGUpID0+IHtcbiAgICBpZiAodHlwZW9mIHJ1bGUudmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoYXNSdWxlQXJyYXkocnVsZS5kZWZhdWx0RmllbGQpLnNvbWUocnVsZUhhc1ZhbGlkYXRvcikpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChydWxlLmZpZWxkcykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhydWxlLmZpZWxkcykuc29tZSgoc3ViKSA9PiBhc1J1bGVBcnJheShzdWIpLnNvbWUocnVsZUhhc1ZhbGlkYXRvcikpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuY29uc3QgaGFzUmVzb2x2ZWRWYWxpZGF0b3IgPSAocmVzb2x2ZWQpID0+IHJlc29sdmVkLnNvbWUocnVsZUhhc1ZhbGlkYXRvcik7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIHVzZUZvcm1cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNvbnN0IHVzZUZvcm0gPSAoY29uZmlnID0ge30pID0+IHtcbiAgICBjb25zdCB7IG9uRmluaXNoLCBvbkZpbmlzaEZhaWxlZCwgb25SZXNldCwgdmFsaWRhdGVUcmlnZ2VyID0gJ29uQ2hhbmdlJywgfSA9IGNvbmZpZztcbiAgICBjb25zdCBmb3JtQ29yZSA9IHVzZUZvcm1Db3JlKGNvbmZpZyk7XG4gICAgY29uc3QgeyBzdG9yZSB9ID0gZm9ybUNvcmU7XG4gICAgLy8gRXBvY2ggb2YgdGhlIExBVEVTVCBhc3luYyBydW4gdGhhdCByYWlzZWQgZWFjaCBmaWVsZCdzIGB2YWxpZGF0aW5nYCBmbGFnLlxuICAgIC8vIEEgc2V0dGxpbmcgcnVuIGNsZWFycyB0aGUgZmxhZyBvbmx5IHdoaWxlIGl0IGlzIHN0aWxsIHRoZSBsYXRlc3QgcmFpc2VyIOKAlFxuICAgIC8vIGFuIG9sZGVyIHJ1biBtdXN0IG5vdCBibGFuayB0aGUgc3Bpbm5lciBvZiBhIG5ld2VyIG9uZSwgYW5kIGEgcnVuXG4gICAgLy8gc3VwZXJzZWRlZCBieSBhIFNZTkMgY29tbWl0ICh3aGljaCBuZXZlciB0b3VjaGVzIGZsYWdzKSBtdXN0IHN0aWxsIGNsZWFuXG4gICAgLy8gdXAgYWZ0ZXIgaXRzZWxmLlxuICAgIGNvbnN0IGxhc3RBc3luY0Vwb2NoUmVmID0gdXNlUmVmKHt9KTtcbiAgICAvLyBNYXJrIGZpZWxkcyBhcyB2YWxpZGF0aW5nIGluIE9ORSBjb21taXQuIHZhbGlkYXRpbmcgLyB0b3VjaGVkIGxpdmUgaW4gdGhlXG4gICAgLy8gc3RvcmUgYWxvbmdzaWRlIHZhbHVlcyDigJQgZmxpcHBpbmcgdGhlbSAoZS5nLiBhc3luYyB2YWxpZGF0aW9uIGFyb3VuZCBhXG4gICAgLy8gYmx1cikgbXVzdCBub3QgcmUtcmVuZGVyIHRoZSBmb3JtIHJvb3QsIG9ubHkgdGhlIGZpZWxkcyB0aGF0IHN1YnNjcmliZWQuXG4gICAgY29uc3QgbWFya1ZhbGlkYXRpbmcgPSB1c2VNZW1vaXplZEZuKChuYW1lcykgPT4ge1xuICAgICAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBuZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgc3RvcmUuZ2V0U3RhdGUoKS52YWxpZGF0aW5nKTtcbiAgICAgICAgbmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgbmV4dFtuYW1lXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHZhbGlkYXRpbmc6IG5leHQgfSk7XG4gICAgfSk7XG4gICAgLy8gRm9sZCBwZXItZmllbGQgcnVsZSBvdXRjb21lcyBpbnRvIEFUIE1PU1Qgb25lIHN0b3JlIGNvbW1pdDogZXJyb3JzIGFuZFxuICAgIC8vIHdhcm5pbmdzIGFyZSBtZXJnZWQgb3ZlciB0aGUgY3VycmVudCBtYXBzIGFuZCB0aGUgYGNsZWFyVmFsaWRhdGluZ2AgZmxhZ3NcbiAgICAvLyBhcmUgcmVtb3ZlZCBpbiB0aGUgU0FNRSBwYXRjaC4gQSBuby1vcCBvdXRjb21lIGNvbW1pdHMgbm90aGluZyBhdCBhbGwg4oCUXG4gICAgLy8gcGVyLWZpZWxkIGNvbW1pdHMgaGVyZSBwcmV2aW91c2x5IG1hZGUgc3VibWl0LXRpbWUgdmFsaWRhdGlvbiBzd2VlcCBldmVyeVxuICAgIC8vIHN1YnNjcmliZXIgTyhmaWVsZHMpIHRpbWVzLlxuICAgIGNvbnN0IGNvbW1pdFJ1bGVPdXRjb21lcyA9IHVzZU1lbW9pemVkRm4oKG91dGNvbWVzLCBjbGVhclZhbGlkYXRpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgZXJyb3JzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgd2FybmluZ3NDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5ld0Vycm9ycyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmVycm9ycyk7XG4gICAgICAgIGNvbnN0IG5ld1dhcm5pbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUud2FybmluZ3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHsgbmFtZSwgZXJyb3IsIHdhcm5pbmcgfSBvZiBvdXRjb21lcykge1xuICAgICAgICAgICAgaWYgKGVycm9yID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gbmV3RXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdFcnJvcnNbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGVycm9yc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFzYW1lVmFsaWRhdGlvbk5vZGUobmV3RXJyb3JzW25hbWVdLCBlcnJvcikpIHtcbiAgICAgICAgICAgICAgICBuZXdFcnJvcnNbbmFtZV0gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBlcnJvcnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3YXJuaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gbmV3V2FybmluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5ld1dhcm5pbmdzW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFzYW1lVmFsaWRhdGlvbk5vZGUobmV3V2FybmluZ3NbbmFtZV0sIHdhcm5pbmcpKSB7XG4gICAgICAgICAgICAgICAgbmV3V2FybmluZ3NbbmFtZV0gPSB3YXJuaW5nO1xuICAgICAgICAgICAgICAgIHdhcm5pbmdzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmxhZ3NUb0NsZWFyID0gY2xlYXJWYWxpZGF0aW5nLmZpbHRlcigobmFtZSkgPT4gbmFtZSBpbiBzdGF0ZS52YWxpZGF0aW5nKTtcbiAgICAgICAgY29uc3QgcGF0Y2ggPSB7fTtcbiAgICAgICAgaWYgKGVycm9yc0NoYW5nZWQpXG4gICAgICAgICAgICBwYXRjaC5lcnJvcnMgPSBuZXdFcnJvcnM7XG4gICAgICAgIGlmICh3YXJuaW5nc0NoYW5nZWQpXG4gICAgICAgICAgICBwYXRjaC53YXJuaW5ncyA9IG5ld1dhcm5pbmdzO1xuICAgICAgICBpZiAoZmxhZ3NUb0NsZWFyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbGlkYXRpbmcgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS52YWxpZGF0aW5nKTtcbiAgICAgICAgICAgIGZsYWdzVG9DbGVhci5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5ld1ZhbGlkYXRpbmdbbmFtZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhdGNoLnZhbGlkYXRpbmcgPSBuZXdWYWxpZGF0aW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHBhdGNoKTtcbiAgICB9KTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBBc3luYyBmaWVsZCB2YWxpZGF0aW9uIOKAkyBlYWNoIHJ1bGUgaXMgcHJvY2Vzc2VkIGV4YWN0bHkgb25jZVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IHZhbGlkYXRlRmllbGRBc3luYyA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIHZhbHVlLCBydWxlcykgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCFydWxlcyB8fCBydWxlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAvLyBDYXB0dXJlIHRoaXMgcnVuJ3MgZXBvY2g6IGlmIGEgTkVXRVIgcnVuIChzeW5jIG9yIGFzeW5jKSBzdGFydHMgZm9yXG4gICAgICAgIC8vIHRoZSBmaWVsZCBiZWZvcmUgdGhpcyBvbmUgc2V0dGxlcywgdGhlIG91dGNvbWUgYmVsb3cgaXMgc3RhbGUgYW5kIGlzXG4gICAgICAgIC8vIGRpc2NhcmRlZCBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIHRoZSBuZXdlciByZXN1bHQuXG4gICAgICAgIGNvbnN0IGVwb2NoID0gZm9ybUNvcmUuYmVnaW5WYWxpZGF0aW9uUnVuKG5hbWUpO1xuICAgICAgICAvLyBSZXNvbHZlIG9uY2U6IHRoZSBmbGFnIGRlY2lzaW9uIG5lZWRzIHJlc29sdmVkIHJ1bGVzLCBhbmQgcGFzc2luZyB0aGVcbiAgICAgICAgLy8gcmVzb2x2ZWQgYXJyYXkgb253YXJkIHNwYXJlcyB0aGUgZW5naW5lIGEgcmUtcmVzb2x1dGlvbi5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlUnVsZXMocnVsZXMsIHZhbHVlcywgZm9ybUNvcmUuZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSgpKTtcbiAgICAgICAgY29uc3QgZmxhZ2dlZCA9IGhhc1Jlc29sdmVkVmFsaWRhdG9yKHJlc29sdmVkKSA/IFtuYW1lXSA6IFtdO1xuICAgICAgICBtYXJrVmFsaWRhdGluZyhmbGFnZ2VkKTtcbiAgICAgICAgZmxhZ2dlZC5mb3JFYWNoKChmbGFnZ2VkTmFtZSkgPT4ge1xuICAgICAgICAgICAgbGFzdEFzeW5jRXBvY2hSZWYuY3VycmVudFtmbGFnZ2VkTmFtZV0gPSBlcG9jaDtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBvdXRjb21lID0geyBuYW1lLCBlcnJvcjogbnVsbCwgd2FybmluZzogbnVsbCB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBlcnJvciwgd2FybmluZyB9ID0geWllbGQgcnVuUnVsZXNBc3luYyhuYW1lLCB2YWx1ZSwgdmFsdWVzLCByZXNvbHZlZCwgZm9ybUNvcmUuZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSgpKTtcbiAgICAgICAgICAgIG91dGNvbWUgPSB7IG5hbWUsIGVycm9yLCB3YXJuaW5nIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gVGhlIGVuZ2luZSBjb250YWlucyBydWxlLWxldmVsIHRocm93cyBpdHNlbGY7IHRoaXMgaXMgYSBsYXN0LXJlc29ydFxuICAgICAgICAgICAgLy8gbmV0IHNvIGFuIHVuZXhwZWN0ZWQgZmFpbHVyZSBzdXJmYWNlcyBhcyBhIGZpZWxkIGVycm9yIGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIGxlYXZpbmcgdGhlIGZpZWxkIG1hcmtlZCB2YWxpZC5cbiAgICAgICAgICAgIG91dGNvbWUgPSB7IG5hbWUsIGVycm9yOiAoX2EgPSBjb2VyY2VGYWlsdXJlUmVhc29uKGVycikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdWYWxpZGF0aW9uIGZhaWxlZCcsIHdhcm5pbmc6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudCA9IGZvcm1Db3JlLmlzVmFsaWRhdGlvblJ1bkN1cnJlbnQobmFtZSwgZXBvY2gpO1xuICAgICAgICAgICAgY29uc3QgY2xlYXJGbGFncyA9IGZsYWdnZWQuZmlsdGVyKChmbGFnZ2VkTmFtZSkgPT4gbGFzdEFzeW5jRXBvY2hSZWYuY3VycmVudFtmbGFnZ2VkTmFtZV0gPT09IGVwb2NoKTtcbiAgICAgICAgICAgIGNvbW1pdFJ1bGVPdXRjb21lcyhpc0N1cnJlbnQgPyBbb3V0Y29tZV0gOiBbXSwgY2xlYXJGbGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIENBTExFUiBnZXRzIHRoaXMgcnVuJ3Mgb3duIHJlc3VsdCBlaXRoZXIgd2F5IChpdHMgcHJvbWlzZSBpc1xuICAgICAgICAvLyBhYm91dCB0aGUgdmFsdWUgaXQgd2FzIGFza2VkIHRvIHZhbGlkYXRlKTsgb25seSB0aGUgU1RPUkUgY29tbWl0IGlzXG4gICAgICAgIC8vIHN0YWxlbmVzcy1ndWFyZGVkLlxuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBvdXRjb21lLmVycm9yID09PSBudWxsLCBlcnJvcjogb3V0Y29tZS5lcnJvciB9O1xuICAgIH0pKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBBc3luYyBmaWVsZCBibHVyIGhhbmRsZXJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBoYW5kbGVGaWVsZEJsdXIgPSB1c2VFdmVudENhbGxiYWNrKChuYW1lLCBmaWVsZFRyaWdnZXIpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB0b3VjaGVkID0gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICBpZiAoIXRvdWNoZWRbbmFtZV0pIHtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdG91Y2hlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0b3VjaGVkKSwgeyBbbmFtZV06IHRydWUgfSkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZXMgPSBmb3JtQ29yZS5nZXRGaWVsZFJ1bGVzKG5hbWUpO1xuICAgICAgICBpZiAoIXJ1bGVzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpO1xuICAgICAgICBjb25zdCBhcHBsaWNhYmxlID0gZmlsdGVyUnVsZXNCeVRyaWdnZXIocmVzb2x2ZVJ1bGVzKHJ1bGVzLCB2YWx1ZXMsIGZvcm1Db3JlLmdldFJ1bGVDb250ZXh0SW5zdGFuY2UoKSksICdvbkJsdXInLCBub3JtYWxpemVUcmlnZ2VycyhmaWVsZFRyaWdnZXIsIHZhbGlkYXRlVHJpZ2dlciksIG5hbWUpO1xuICAgICAgICBpZiAoYXBwbGljYWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB5aWVsZCB2YWxpZGF0ZUZpZWxkQXN5bmMobmFtZSwgcmVzb2x2ZVZhbHVlKHZhbHVlcywgbmFtZSksIGFwcGxpY2FibGUpO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFZhbGlkYXRlIGFsbCBmaWVsZHMgYXN5bmNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCB2YWxpZGF0ZUZpZWxkc0FzeW5jID0gdXNlTWVtb2l6ZWRGbigobmFtZUxpc3QpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBmaWVsZHNUb1ZhbGlkYXRlID0gbmFtZUxpc3QgfHwgT2JqZWN0LmtleXMoZm9ybUNvcmUuZmllbGRSdWxlcyk7XG4gICAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0ge307XG4gICAgICAgIC8vIFJlc29sdmUgZXZlcnkgZmllbGQgb25jZSB1cCBmcm9udDogdGhlIGZsYWcgZGVjaXNpb24gbmVlZHMgcmVzb2x2ZWRcbiAgICAgICAgLy8gcnVsZXMsIGFuZCB0aGUgcmVzb2x2ZWQgYXJyYXlzIGFyZSByZXVzZWQgZm9yIHRoZSBhY3R1YWwgcnVucy4gRWFjaFxuICAgICAgICAvLyBmaWVsZCBhbHNvIGNhcHR1cmVzIGl0cyB2YWxpZGF0aW9uIGVwb2NoIOKAlCBhIGZpZWxkIHdob3NlIHZhbHVlXG4gICAgICAgIC8vIGNoYW5nZXMgbWlkLXN1Ym1pdCBnZXRzIGEgbmV3ZXIgcnVuLCBhbmQgdGhpcyBydW4ncyBzdGFsZSBvdXRjb21lXG4gICAgICAgIC8vIG11c3Qgbm90IG92ZXJ3cml0ZSBpdCBpbiB0aGUgc3RvcmUuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkQnlGaWVsZCA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgZXBvY2hCeUZpZWxkID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgZmllbGRzVG9WYWxpZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgcnVsZXMgPSBmb3JtQ29yZS5maWVsZFJ1bGVzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgZXBvY2hCeUZpZWxkLnNldChuYW1lLCBmb3JtQ29yZS5iZWdpblZhbGlkYXRpb25SdW4obmFtZSkpO1xuICAgICAgICAgICAgICAgIHJlc29sdmVkQnlGaWVsZC5zZXQobmFtZSwgcmVzb2x2ZVJ1bGVzKHJ1bGVzLCBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCBmb3JtQ29yZS5nZXRSdWxlQ29udGV4dEluc3RhbmNlKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPbmUgY29tbWl0IHRvIHJhaXNlIHRoZSB2YWxpZGF0aW5nIGZsYWdzICh2YWxpZGF0b3ItYmVhcmluZyBmaWVsZHNcbiAgICAgICAgLy8gb25seSksIG9uZSBjb21taXQgdG8gbGFuZCBldmVyeSBlcnJvci93YXJuaW5nIGFuZCBjbGVhciB0aGUgZmxhZ3MuXG4gICAgICAgIGNvbnN0IGZsYWdnZWQgPSBmaWVsZHNUb1ZhbGlkYXRlLmZpbHRlcigobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlZEJ5RmllbGQuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkID8gaGFzUmVzb2x2ZWRWYWxpZGF0b3IocmVzb2x2ZWQpIDogZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBtYXJrVmFsaWRhdGluZyhmbGFnZ2VkKTtcbiAgICAgICAgZmxhZ2dlZC5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBsYXN0QXN5bmNFcG9jaFJlZi5jdXJyZW50W25hbWVdID0gZXBvY2hCeUZpZWxkLmdldChuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG91dGNvbWVzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB5aWVsZCBQcm9taXNlLmFsbChmaWVsZHNUb1ZhbGlkYXRlLm1hcCgobmFtZSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZWRCeUZpZWxkLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgd2FybmluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgKHsgZXJyb3IsIHdhcm5pbmcgfSA9IHlpZWxkIHJ1blJ1bGVzQXN5bmMobmFtZSwgcmVzb2x2ZVZhbHVlKGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCksIG5hbWUpLCBmb3JtQ29yZS5nZXRGaWVsZHNWYWx1ZSgpLCByZXNvbHZlZCwgZm9ybUNvcmUuZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSgpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTGFzdC1yZXNvcnQgbmV0IChzZWUgdmFsaWRhdGVGaWVsZEFzeW5jKSDigJQga2VlcCB0aGUgbm9ybWFsXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdGVkLWVycm9yIGZsb3cgc28gb25GaW5pc2hGYWlsZWQgZ2V0cyBhIHJlYWwgcGF5bG9hZC5cbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAoX2EgPSBjb2VyY2VGYWlsdXJlUmVhc29uKGVycikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdWYWxpZGF0aW9uIGZhaWxlZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSBzdG9yZSBjb21taXQgaXMgc3RhbGVuZXNzLWd1YXJkZWQ7IHRoZSBTVUJNSVQgZGVjaXNpb25cbiAgICAgICAgICAgICAgICAvLyAoZmllbGRFcnJvcnMgLyB0aGUgdGhyb3duIEZvcm1WYWxpZGF0aW9uRXJyb3IpIHN0aWxsIHJlZmxlY3RzXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBydW4ncyBvd24gcmVzdWx0cyBmb3IgdGhlIHZhbHVlcyBpdCB2YWxpZGF0ZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgZXBvY2ggPSBlcG9jaEJ5RmllbGQuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChlcG9jaCAhPT0gdW5kZWZpbmVkICYmIGZvcm1Db3JlLmlzVmFsaWRhdGlvblJ1bkN1cnJlbnQobmFtZSwgZXBvY2gpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dGNvbWVzLnB1c2goeyBuYW1lLCBlcnJvciwgd2FybmluZyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzW25hbWVdID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFyRmxhZ3MgPSBmbGFnZ2VkLmZpbHRlcigobmFtZSkgPT4gbGFzdEFzeW5jRXBvY2hSZWYuY3VycmVudFtuYW1lXSA9PT0gZXBvY2hCeUZpZWxkLmdldChuYW1lKSk7XG4gICAgICAgICAgICBjb21taXRSdWxlT3V0Y29tZXMob3V0Y29tZXMsIGNsZWFyRmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhmaWVsZEVycm9ycykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1WYWxpZGF0aW9uRXJyb3IoZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgZmllbGRFcnJvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVMaXN0LnJlZHVjZSgoYWNjLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW25hbWVdID0gcmVzb2x2ZVZhbHVlKGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCksIG5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlKCk7XG4gICAgfSkpO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIGRlZmluZUZpZWxkIOKAkyB1c2VkIGJ5IHN0YW5kYWxvbmUgKG5vbi1Qcm9Gb3JtKSBjb25zdW1lcnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBkZWZpbmVGaWVsZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIGZpZWxkT3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcnVsZXMgPSBbXSB9ID0gZmllbGRPcHRpb25zO1xuICAgICAgICBjb25zdCBGaWVsZENvbXBvbmVudCA9IG1lbW8oKF9hKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyBjaGlsZHJlbiwgcmVuZGVyIH0gPSBfYSwgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNoaWxkcmVuXCIsIFwicmVuZGVyXCJdKTtcbiAgICAgICAgICAgIC8vIFBlci1maWVsZCBzdG9yZSBzdWJzY3JpcHRpb246IHRoaXMgZmllbGQgcmUtcmVuZGVycyBvbmx5IHdoZW4gaXRzXG4gICAgICAgICAgICAvLyBvd24gdmFsdWUvZXJyb3IvdG91Y2hlZC92YWxpZGF0aW5nIHNsaWNlIGNoYW5nZXMuIERvdC1wYXRoc1xuICAgICAgICAgICAgLy8gcmVzb2x2ZSBpbnRvIHRoZSBuZXN0ZWQgdmFsdWVzIGxpa2UgZXZlcnl3aGVyZSBlbHNlLlxuICAgICAgICAgICAgY29uc3QgW2ZpZWxkVmFsdWUsIGZpZWxkRXJyb3IsIGZpZWxkVG91Y2hlZCwgZmllbGRWYWxpZGF0aW5nXSA9IHVzZVN0b3JlU2VsZWN0b3Ioc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSByZXNvbHZlVmFsdWUoc3RhdGUudmFsdWVzLCBuYW1lKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJycsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yc1tuYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudG91Y2hlZFtuYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsaWRhdGluZ1tuYW1lXSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSwgc2hhbGxvd0VxdWFsQXJyYXlzKTtcbiAgICAgICAgICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTW91bnQtY291bnRlZDogcmVsZWFzZUZpZWxkIHJlbW92ZXMgdGhlIHJ1bGVzIG9ubHkgd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAvLyBMQVNUIHNhbWUtbmFtZSBpbnN0YW5jZSB1bm1vdW50cyDigJQgYW4gaW5zdGFuY2UgdGhhdCBwaWdneWJhY2tlZFxuICAgICAgICAgICAgICAgIC8vIG9uIGFuIGV4aXN0aW5nIHJlZ2lzdHJhdGlvbiAoZS5nLiBhIFByb0Zvcm0uSXRlbSdzKSBjYW4gbmV2ZXJcbiAgICAgICAgICAgICAgICAvLyB3aXBlIGl0IG9uIGl0cyBvd24gdW5tb3VudC5cbiAgICAgICAgICAgICAgICBmb3JtQ29yZS5yZXRhaW5GaWVsZChuYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1J1bGVzID0gZm9ybUNvcmUuZ2V0RmllbGRSdWxlcyhuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nUnVsZXMgJiYgcnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JtQ29yZS5yZWdpc3RlckZpZWxkKG5hbWUsIHJ1bGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvcmUucmVsZWFzZUZpZWxkKG5hbWUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LCBbXSk7IC8vIE9ubHkgcmVnaXN0ZXIgb24gbW91bnRcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUZpZWxkQ2hhbmdlID0gdXNlRXZlbnRDYWxsYmFjaygodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBUb3VjaGVkIGlzIHNldCBieSB0aGUgdXNlciBjaGFuZ2UgdHJpZ2dlciAobWF0Y2hpbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gUHJvRm9ybS5JdGVtIHBhdGgpIOKAlCBwcm9ncmFtbWF0aWMgc2V0RmllbGRzVmFsdWUgZG9lcyBub3QuXG4gICAgICAgICAgICAgICAgY29uc3QgdG91Y2hlZCA9IHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZDtcbiAgICAgICAgICAgICAgICBpZiAoIXRvdWNoZWRbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB0b3VjaGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRvdWNoZWQpLCB7IFtuYW1lXTogdHJ1ZSB9KSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYXBwbGljYWJsZSA9IGZpbHRlclJ1bGVzQnlUcmlnZ2VyKHJlc29sdmVSdWxlcyhydWxlcywgZm9ybUNvcmUuZ2V0RmllbGRzVmFsdWUoKSwgZm9ybUNvcmUuZ2V0UnVsZUNvbnRleHRJbnN0YW5jZSgpKSwgJ29uQ2hhbmdlJywgbm9ybWFsaXplVHJpZ2dlcnMoZmllbGRPcHRpb25zLnZhbGlkYXRlVHJpZ2dlciwgdmFsaWRhdGVUcmlnZ2VyKSwgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxpY2FibGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3luYyBwYXRoIChtYXRjaGluZyBQcm9Gb3JtLkl0ZW0pIHNvIGEgUHJvbWlzZS1yZXR1cm5pbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWRhdG9yIGlzIGhvbm9yZWQgb24gY2hhbmdlIGluc3RlYWQgb2YgYmVpbmcgc2lsZW50bHlcbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcHBlZDsgZmlyZS1hbmQtZm9yZ2V0IOKAlCB0aGUgcmVzdWx0IGxhbmRzIG9uIHRoZSBzdG9yZS5cbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVGaWVsZEFzeW5jKG5hbWUsIHZhbHVlLCBhcHBsaWNhYmxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUJsdXIgPSB1c2VFdmVudENhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVGaWVsZEJsdXIobmFtZSwgZmllbGRPcHRpb25zLnZhbGlkYXRlVHJpZ2dlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUHJvcHMgPSBPYmplY3QuYXNzaWduKHsgbmFtZSwgdmFsdWU6IGZpZWxkVmFsdWUsIGVycm9yOiBmaWVsZEVycm9yLCB0b3VjaGVkOiBmaWVsZFRvdWNoZWQsIHZhbGlkYXRpbmc6IGZpZWxkVmFsaWRhdGluZywgb25DaGFuZ2U6IGhhbmRsZUZpZWxkQ2hhbmdlLCBvbkJsdXI6IGhhbmRsZUJsdXIgfSwgcHJvcHMpO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlTWVyZ2VDaGFuZ2UgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGUgJiYgdHlwZW9mIGUgPT09ICdvYmplY3QnICYmICd0YXJnZXQnIGluIGVcbiAgICAgICAgICAgICAgICAgICAgPyBlLnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGU7XG4gICAgICAgICAgICAgICAgaGFuZGxlRmllbGRDaGFuZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikgJiZcbiAgICAgICAgICAgICAgICAgICAgKChfYSA9IGNoaWxkcmVuLnByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25DaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlTWVyZ2VCbHVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBoYW5kbGVCbHVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSAmJlxuICAgICAgICAgICAgICAgICAgICAoKF9hID0gY2hpbGRyZW4ucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkJsdXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnByb3BzLm9uQmx1cigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocmVuZGVyICYmIHR5cGVvZiByZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyKGZpZWxkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihmaWVsZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVsZW1lbnQgY2hpbGRyZW4gcmVjZWl2ZSBvbmx5IERPTS1zYWZlIHByb3BzIOKAlCBlcnJvci90b3VjaGVkL1xuICAgICAgICAgICAgLy8gdmFsaWRhdGluZyBhcmUgZmllbGQgTUVUQSwgbm90IGNvbnRyb2wgcHJvcHM7IHNwcmVhZGluZyB0aGVtIG9udG9cbiAgICAgICAgICAgIC8vIGEgaG9zdCBlbGVtZW50IHdvdWxkIGxlYWsgYW55IGF0dHJpYnV0ZXMuIFJlbmRlci1wcm9wIGFuZFxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gY2hpbGRyZW4ga2VlcCB0aGUgZnVsbCBmaWVsZFByb3BzLlxuICAgICAgICAgICAgY29uc3QgZG9tU2FmZVByb3BzID0gT2JqZWN0LmFzc2lnbih7IG5hbWUsIHZhbHVlOiBmaWVsZFZhbHVlLCBvbkNoYW5nZTogaGFuZGxlTWVyZ2VDaGFuZ2UsIG9uQmx1cjogaGFuZGxlTWVyZ2VCbHVyIH0sIHByb3BzKTtcbiAgICAgICAgICAgIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBkb21TYWZlUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIC4uLmNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZG9tU2FmZVByb3BzKSwgeyBrZXk6IGNoaWxkLmtleSB8fCBpbmRleCB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgICAgRmllbGRDb21wb25lbnQuZGlzcGxheU5hbWUgPSBgRmllbGQoJHtuYW1lfSlgO1xuICAgICAgICByZXR1cm4gRmllbGRDb21wb25lbnQ7XG4gICAgfSk7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gaGFuZGxlU3VibWl0IC8gaGFuZGxlUmVzZXQg4oCTIGZvciA8Zm9ybT4gZXZlbnQgaGFuZGxlcnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBoYW5kbGVTdWJtaXQgPSB1c2VFdmVudENhbGxiYWNrKChlKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRWYWx1ZXMgPSB5aWVsZCB2YWxpZGF0ZUZpZWxkc0FzeW5jKCk7XG4gICAgICAgICAgICBvbkZpbmlzaCA9PT0gbnVsbCB8fCBvbkZpbmlzaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25GaW5pc2godmFsaWRhdGVkVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBPbmx5IGEgVkFMSURBVElPTiBmYWlsdXJlIHJlYWNoZXMgb25GaW5pc2hGYWlsZWQg4oCUIGFuIGV4Y2VwdGlvbiBvdXRcbiAgICAgICAgICAgIC8vIG9mIHRoZSBjb25zdW1lcidzIG93biBvbkZpbmlzaCBpcyBub3QgYSB2YWxpZGF0aW9uIHJlc3VsdCBhbmQgaXNcbiAgICAgICAgICAgIC8vIHN1cmZhY2VkIGluc3RlYWQgb2YgYmVpbmcgbWlzcmVwb3J0ZWQuXG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRm9ybVZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgIG9uRmluaXNoRmFpbGVkID09PSBudWxsIHx8IG9uRmluaXNoRmFpbGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZpbmlzaEZhaWxlZCh7IHZhbHVlczogZXJyLnZhbHVlcywgZXJyb3JzOiBlcnIuZXJyb3JzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1Byb0Zvcm1dIG9uRmluaXNoIHRocmV3IGR1cmluZyBzdWJtaXQ6JywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBoYW5kbGVSZXNldCA9IHVzZUV2ZW50Q2FsbGJhY2soKGUpID0+IHtcbiAgICAgICAgZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGZvcm1Db3JlLnJlc2V0RmllbGRzKCk7XG4gICAgICAgIG9uUmVzZXQgPT09IG51bGwgfHwgb25SZXNldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25SZXNldCgpO1xuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEZvcm1JbnN0YW5jZSDigJMgZW5oYW5jZWQgQVBJIGZvciBjb25zdW1lcnMuXG4gICAgLy9cbiAgICAvLyBFdmVyeSBtZXRob2QgaXMgd3JhcHBlZCBpbiB1c2VNZW1vaXplZEZuIChzdGFibGUgaWRlbnRpdHksIGFsd2F5cyByZWFkcyB0aGVcbiAgICAvLyBsYXRlc3Qgc3RvcmUgc3RhdGUpIHNvIHRoZSBpbnN0YW5jZSBvYmplY3QgaXRzZWxmIGlzIElERU5USVRZLVNUQUJMRSBmb3JcbiAgICAvLyB0aGUgbGlmZXRpbWUgb2YgdGhlIGZvcm0g4oCUIHRoaXMgaXMgd2hhdCBsZXRzIFByb0Zvcm0gcHVibGlzaCBpdCB0aHJvdWdoIHRoZVxuICAgIC8vIHN0YWJsZSBjb250ZXh0IHdpdGhvdXQgcmUtcmVuZGVyaW5nIHN1YnNjcmliZXJzIG9uIGVhY2gga2V5c3Ryb2tlLlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IGdldEZpZWxkRXJyb3IgPSB1c2VNZW1vaXplZEZuKChuYW1lKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLmVycm9yc1tuYW1lXSk7XG4gICAgY29uc3QgZ2V0RmllbGRXYXJuaW5nID0gdXNlTWVtb2l6ZWRGbigobmFtZSkgPT4gc3RvcmUuZ2V0U3RhdGUoKS53YXJuaW5nc1tuYW1lXSk7XG4gICAgY29uc3QgZ2V0RmllbGRzRXJyb3IgPSB1c2VNZW1vaXplZEZuKChuYW1lTGlzdCkgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBzdG9yZS5nZXRTdGF0ZSgpLmVycm9ycztcbiAgICAgICAgaWYgKCFuYW1lTGlzdClcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBuYW1lTGlzdC5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3JzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gZXJyb3JzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICBjb25zdCBpc0ZpZWxkVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZFtuYW1lXSB8fCBmYWxzZSk7XG4gICAgY29uc3QgaXNGaWVsZHNUb3VjaGVkID0gdXNlTWVtb2l6ZWRGbigobmFtZUxpc3QsIGFsbEZpZWxkc1RvdWNoZWQgPSBmYWxzZSkgPT4ge1xuICAgICAgICBjb25zdCB0b3VjaGVkID0gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICBpZiAoIW5hbWVMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModG91Y2hlZCkuc29tZSgoa2V5KSA9PiB0b3VjaGVkW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxGaWVsZHNUb3VjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZUxpc3QuZXZlcnkoKG5hbWUpID0+IHRvdWNoZWRbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lTGlzdC5zb21lKChuYW1lKSA9PiB0b3VjaGVkW25hbWVdKTtcbiAgICB9KTtcbiAgICBjb25zdCBpc0ZpZWxkVmFsaWRhdGluZyA9IHVzZU1lbW9pemVkRm4oKG5hbWUpID0+IHN0b3JlLmdldFN0YXRlKCkudmFsaWRhdGluZ1tuYW1lXSB8fCBmYWxzZSk7XG4gICAgY29uc3Qgc2V0RmllbGRzRXJyb3IgPSB1c2VNZW1vaXplZEZuKChmaWVsZHNFcnJvcikgPT4ge1xuICAgICAgICBPYmplY3QuZW50cmllcyhmaWVsZHNFcnJvcikuZm9yRWFjaCgoW25hbWUsIGVycm9yXSkgPT4ge1xuICAgICAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRFcnJvcihuYW1lLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldEZpZWxkVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKG5hbWUsIGlzVG91Y2hlZCA9IHRydWUpID0+IHtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB0b3VjaGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0b3JlLmdldFN0YXRlKCkudG91Y2hlZCksIHsgW25hbWVdOiBpc1RvdWNoZWQgfSkgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2V0RmllbGRzVG91Y2hlZCA9IHVzZU1lbW9pemVkRm4oKGZpZWxkc1RvdWNoKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdG91Y2hlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdG9yZS5nZXRTdGF0ZSgpLnRvdWNoZWQpLCBmaWVsZHNUb3VjaCkgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVzZXRGb3JtRmllbGRzID0gdXNlTWVtb2l6ZWRGbigoZmllbGRzKSA9PiB7XG4gICAgICAgIGlmICghZmllbGRzKSB7XG4gICAgICAgICAgICBmb3JtQ29yZS5yZXNldEZpZWxkcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1vdW50LWZyb3plbiBpbml0aWFsVmFsdWVzIOKAlCBjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgcmVzZXRGaWVsZHMuXG4gICAgICAgIC8vIFJlYWRzIEFORCB3cml0ZXMgYXJlIG5lc3RlZC1wYXRoIGF3YXJlLCBzbyBkb3QtcGF0aCBuYW1lc1xuICAgICAgICAvLyAoYGFkZHJlc3MuY2l0eWAsIGBpdGVtcy4wLnRpdGxlYCkgcmVzZXQgY29ycmVjdGx5IGluc3RlYWQgb2YgcHJvYmluZyBhXG4gICAgICAgIC8vIGxpdGVyYWwga2V5IGFuZCBzaGFsbG93LW1lcmdpbmcgb25lIGJhY2suXG4gICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZXMgPSBmb3JtQ29yZS5nZXRJbml0aWFsVmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IG5ld1ZhbHVlcyA9IHN0YXRlLnZhbHVlcztcbiAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsID0gcmVzb2x2ZVZhbHVlKGluaXRpYWxWYWx1ZXMsIGZpZWxkKTtcbiAgICAgICAgICAgIG5ld1ZhbHVlcyA9IGZpZWxkLmluY2x1ZGVzKCcuJylcbiAgICAgICAgICAgICAgICA/IHNldE5lc3RlZFZhbHVlKG5ld1ZhbHVlcywgZmllbGQsIGluaXRpYWwpXG4gICAgICAgICAgICAgICAgOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5ld1ZhbHVlcyksIHsgW2ZpZWxkXTogaW5pdGlhbCB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIExpa2UgdGhlIGZ1bGwgcmVzZXQ6IGNsZWFyIEFMTCBwZXItZmllbGQgbWV0YSAoZXJyb3JzIEFORCB3YXJuaW5ncyBBTkRcbiAgICAgICAgLy8gdG91Y2hlZC92YWxpZGF0aW5nKSwgaW52YWxpZGF0ZSBpbi1mbGlnaHQgdmFsaWRhdGlvbiBydW5zLCBhbmQgbGFuZFxuICAgICAgICAvLyBldmVyeXRoaW5nIGluIE9ORSBjb21taXQuIE5vIG9uVmFsdWVzQ2hhbmdlIOKAlCByZXNldCBpcyBub3QgYSBjaGFuZ2VcbiAgICAgICAgLy8gZXZlbnQgb24gZWl0aGVyIHBhdGguXG4gICAgICAgIGZvcm1Db3JlLmludmFsaWRhdGVWYWxpZGF0aW9uUnVucyhmaWVsZHMpO1xuICAgICAgICBjb25zdCBuZXdFcnJvcnMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5lcnJvcnMpO1xuICAgICAgICBjb25zdCBuZXdXYXJuaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLndhcm5pbmdzKTtcbiAgICAgICAgY29uc3QgbmV3VG91Y2hlZCA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnRvdWNoZWQpO1xuICAgICAgICBjb25zdCBuZXdWYWxpZGF0aW5nID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUudmFsaWRhdGluZyk7XG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIG5ld0Vycm9yc1tmaWVsZF07XG4gICAgICAgICAgICBkZWxldGUgbmV3V2FybmluZ3NbZmllbGRdO1xuICAgICAgICAgICAgZGVsZXRlIG5ld1RvdWNoZWRbZmllbGRdO1xuICAgICAgICAgICAgZGVsZXRlIG5ld1ZhbGlkYXRpbmdbZmllbGRdO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgdmFsdWVzOiBuZXdWYWx1ZXMsXG4gICAgICAgICAgICBlcnJvcnM6IG5ld0Vycm9ycyxcbiAgICAgICAgICAgIHdhcm5pbmdzOiBuZXdXYXJuaW5ncyxcbiAgICAgICAgICAgIHRvdWNoZWQ6IG5ld1RvdWNoZWQsXG4gICAgICAgICAgICB2YWxpZGF0aW5nOiBuZXdWYWxpZGF0aW5nLFxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBzdWJtaXRXaXRoVmFsaWRhdGlvbiA9IHVzZU1lbW9pemVkRm4oKGNhbGxiYWNrKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHZhbGlkYXRlZFZhbHVlcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbGlkYXRlZFZhbHVlcyA9IHlpZWxkIHZhbGlkYXRlRmllbGRzQXN5bmMoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgIC8vIFZhbGlkYXRpb24gZmFpbHVyZSDigJQgdGhlIGZpZWxkIGVycm9ycyBhcmUgYWxyZWFkeSBpbiB0aGUgc3RvcmUuXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB5aWVsZCBjYWxsYmFjayh2YWxpZGF0ZWRWYWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIEEgdGhyb3dpbmcgY2FsbGJhY2sgaXMgYSBjb25zdW1lciBidWcsIG5vdCBhIHZhbGlkYXRpb24gZmFpbHVyZSDigJRcbiAgICAgICAgICAgICAgICAvLyBzdXJmYWNlIGl0IChtaXJyb3JpbmcgcmMtZmllbGQtZm9ybSdzIG9uRmluaXNoIGhhbmRsaW5nKSBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgLy8gb2Ygc3dhbGxvd2luZyBpdCBzaWxlbnRseS5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUHJvRm9ybV0gc3VibWl0IGNhbGxiYWNrIHRocmV3OicsIGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWRhdGVkVmFsdWVzO1xuICAgIH0pKTtcbiAgICBjb25zdCBmb3JtSW5zdGFuY2UgPSB1c2VNZW1vKCgpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZvcm1Db3JlLmZvcm1JbnN0YW5jZSksIHsgZ2V0RmllbGRWYWx1ZTogZm9ybUNvcmUuZ2V0RmllbGRWYWx1ZSwgZ2V0RmllbGRzVmFsdWU6IGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlLCB2YWxpZGF0ZUZpZWxkczogdmFsaWRhdGVGaWVsZHNBc3luYywgc2V0RmllbGRWYWx1ZTogZm9ybUNvcmUuc2V0RmllbGRWYWx1ZSwgc2V0RmllbGRzVmFsdWU6IGZvcm1Db3JlLnNldEZpZWxkc1ZhbHVlLCBnZXRGaWVsZEVycm9yOiBnZXRGaWVsZEVycm9yLCBnZXRGaWVsZFdhcm5pbmc6IGdldEZpZWxkV2FybmluZywgZ2V0RmllbGRzRXJyb3I6IGdldEZpZWxkc0Vycm9yLCBpc0ZpZWxkVG91Y2hlZDogaXNGaWVsZFRvdWNoZWQsIGlzRmllbGRzVG91Y2hlZDogaXNGaWVsZHNUb3VjaGVkLCBpc0ZpZWxkVmFsaWRhdGluZzogaXNGaWVsZFZhbGlkYXRpbmcsIHNldEZpZWxkRXJyb3I6IGZvcm1Db3JlLnNldEZpZWxkRXJyb3IsIHNldEZpZWxkc0Vycm9yLCBzZXRGaWVsZFRvdWNoZWQ6IHNldEZpZWxkVG91Y2hlZCwgc2V0RmllbGRzVG91Y2hlZCwgcmVzZXRGaWVsZHM6IHJlc2V0Rm9ybUZpZWxkcywgc3VibWl0OiBzdWJtaXRXaXRoVmFsaWRhdGlvbiwgZGVmaW5lRmllbGQsIHJlZ2lzdGVyRmllbGQ6IGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQsIHVucmVnaXN0ZXJGaWVsZDogZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkIH0pKSwgW1xuICAgICAgICBmb3JtQ29yZS5mb3JtSW5zdGFuY2UsXG4gICAgICAgIGZvcm1Db3JlLmdldEZpZWxkVmFsdWUsXG4gICAgICAgIGZvcm1Db3JlLmdldEZpZWxkc1ZhbHVlLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZHNWYWx1ZSxcbiAgICAgICAgZm9ybUNvcmUuc2V0RmllbGRFcnJvcixcbiAgICAgICAgZm9ybUNvcmUucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkc0FzeW5jLFxuICAgICAgICBnZXRGaWVsZEVycm9yLFxuICAgICAgICBnZXRGaWVsZFdhcm5pbmcsXG4gICAgICAgIGdldEZpZWxkc0Vycm9yLFxuICAgICAgICBpc0ZpZWxkVG91Y2hlZCxcbiAgICAgICAgaXNGaWVsZHNUb3VjaGVkLFxuICAgICAgICBpc0ZpZWxkVmFsaWRhdGluZyxcbiAgICAgICAgc2V0RmllbGRzRXJyb3IsXG4gICAgICAgIHNldEZpZWxkVG91Y2hlZCxcbiAgICAgICAgc2V0RmllbGRzVG91Y2hlZCxcbiAgICAgICAgcmVzZXRGb3JtRmllbGRzLFxuICAgICAgICBzdWJtaXRXaXRoVmFsaWRhdGlvbixcbiAgICAgICAgZGVmaW5lRmllbGQsXG4gICAgXSk7XG4gICAgLy8gRnVuY3Rpb24tZm9ybSBydWxlcyBnZXQgdGhlIEZVTEwgZm9ybSBpbnN0YW5jZSAoZXJyb3IgZ2V0dGVycywgdG91Y2hlZFxuICAgIC8vIHN0YXRlLCBtdXRhdG9ycykgaW5zdGVhZCBvZiB0aGUgYmFyZSBjb3JlIG1ldGhvZHMuIFJlZiB3cml0ZSDigJQgY2hlYXAgYW5kXG4gICAgLy8gaWRlbXBvdGVudCBwZXIgcmVuZGVyLlxuICAgIGZvcm1Db3JlLnNldFJ1bGVDb250ZXh0SW5zdGFuY2UoZm9ybUluc3RhbmNlKTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBJbnRlcm5hbHMg4oCTIGV4cG9zZWQgZm9yIFByb0Zvcm0gaW50ZWdyYXRpb24uIERhdGEgZmllbGRzIGFyZSBHRVRURVJTIHRoYXRcbiAgICAvLyByZWFkIHRoZSBsaXZlIHN0b3JlLCBzbyB0aGUgb2JqZWN0IGlzIGlkZW50aXR5LXN0YWJsZSB5ZXQgbmV2ZXIgc3RhbGUuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgaW50ZXJuYWxzID0gdXNlTWVtbygoKSA9PiAoe1xuICAgICAgICBnZXQgdmFsdWVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkudmFsdWVzO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgZXJyb3JzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkuZXJyb3JzO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgd2FybmluZ3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS53YXJuaW5ncztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHRvdWNoZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS50b3VjaGVkO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgdmFsaWRhdGluZygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5nZXRTdGF0ZSgpLnZhbGlkYXRpbmc7XG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkUnVsZXM6IGZvcm1Db3JlLmZpZWxkUnVsZXMsXG4gICAgICAgIHNldEZpZWxkVmFsdWU6IGZvcm1Db3JlLnNldEZpZWxkVmFsdWUsXG4gICAgICAgIHNldEZpZWxkRXJyb3I6IGZvcm1Db3JlLnNldEZpZWxkRXJyb3IsXG4gICAgICAgIHNldEZpZWxkV2FybmluZzogZm9ybUNvcmUuc2V0RmllbGRXYXJuaW5nLFxuICAgICAgICB2YWxpZGF0ZUZpZWxkQXN5bmMsXG4gICAgICAgIHJlZ2lzdGVyRmllbGQ6IGZvcm1Db3JlLnJlZ2lzdGVyRmllbGQsXG4gICAgICAgIHVucmVnaXN0ZXJGaWVsZDogZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkLFxuICAgICAgICByZXRhaW5GaWVsZDogZm9ybUNvcmUucmV0YWluRmllbGQsXG4gICAgICAgIHJlbGVhc2VGaWVsZDogZm9ybUNvcmUucmVsZWFzZUZpZWxkLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIGhhbmRsZVJlc2V0LFxuICAgIH0pLCBbXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBmb3JtQ29yZS5maWVsZFJ1bGVzLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFZhbHVlLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZEVycm9yLFxuICAgICAgICBmb3JtQ29yZS5zZXRGaWVsZFdhcm5pbmcsXG4gICAgICAgIHZhbGlkYXRlRmllbGRBc3luYyxcbiAgICAgICAgZm9ybUNvcmUucmVnaXN0ZXJGaWVsZCxcbiAgICAgICAgZm9ybUNvcmUudW5yZWdpc3RlckZpZWxkLFxuICAgICAgICBmb3JtQ29yZS5yZXRhaW5GaWVsZCxcbiAgICAgICAgZm9ybUNvcmUucmVsZWFzZUZpZWxkLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIGhhbmRsZVJlc2V0LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGZvcm1JbnN0YW5jZSwgaW50ZXJuYWxzLCBzdG9yZSB9O1xufTtcbmV4cG9ydCBkZWZhdWx0IHVzZUZvcm07IixudWxsXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyJ9
|