@gnwebsoft/ui 3.0.7 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/AsyncSelectPayload-B9-6l33R.d.cts +10 -0
  2. package/dist/AsyncSelectPayload-B9-6l33R.d.ts +10 -0
  3. package/dist/chunk-3OPVOWQK.js +140 -0
  4. package/dist/chunk-AEOF2TUF.cjs +2273 -0
  5. package/dist/chunk-ALHC7RLK.js +575 -0
  6. package/dist/chunk-BRRLB22L.js +72 -0
  7. package/dist/chunk-CHZU4PZB.js +2273 -0
  8. package/dist/chunk-EBRUE2WR.cjs +1 -1
  9. package/dist/chunk-HEHPKM4B.cjs +140 -0
  10. package/dist/chunk-K2EJ4YKO.cjs +72 -0
  11. package/dist/chunk-MVPLBJRK.cjs +1 -1
  12. package/dist/chunk-XY4U6A77.cjs +575 -0
  13. package/dist/components/index.cjs +1 -1
  14. package/dist/{enhanced-z-I7EHVS.d.cts → enhanced-CDTkKUlj.d.ts} +5 -5
  15. package/dist/{enhanced-z-I7EHVS.d.ts → enhanced-ZQoS03Cd.d.cts} +5 -5
  16. package/dist/events-BcHVCLBz.d.cts +77 -0
  17. package/dist/events-BcHVCLBz.d.ts +77 -0
  18. package/dist/hooks/index.cjs +3 -3
  19. package/dist/hooks/index.d.cts +3 -2
  20. package/dist/hooks/index.d.ts +3 -2
  21. package/dist/hooks/index.js +1 -1
  22. package/dist/index.cjs +67 -6
  23. package/dist/index.d.cts +5 -3
  24. package/dist/index.d.ts +5 -3
  25. package/dist/index.js +65 -4
  26. package/dist/types/index.cjs +31 -2
  27. package/dist/types/index.d.cts +589 -10
  28. package/dist/types/index.d.ts +589 -10
  29. package/dist/types/index.js +30 -1
  30. package/dist/utils/index.cjs +37 -3
  31. package/dist/utils/index.d.cts +330 -13
  32. package/dist/utils/index.d.ts +330 -13
  33. package/dist/utils/index.js +35 -1
  34. package/dist/wrappers/index.cjs +4 -4
  35. package/dist/wrappers/index.d.cts +41 -19
  36. package/dist/wrappers/index.d.ts +41 -19
  37. package/dist/wrappers/index.js +2 -2
  38. package/package.json +15 -14
  39. package/dist/chunk-4H3AFH7A.js +0 -505
  40. package/dist/chunk-55VNGODF.cjs +0 -2265
  41. package/dist/chunk-BWC3LJIB.js +0 -2265
  42. package/dist/chunk-DE62KYFK.js +0 -122
  43. package/dist/chunk-DEPJRTVT.js +0 -1
  44. package/dist/chunk-FD57PCAC.cjs +0 -1
  45. package/dist/chunk-R2YK4LTT.cjs +0 -122
  46. package/dist/chunk-ZC7FGYL2.cjs +0 -505
@@ -0,0 +1,2273 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+ var _chunkHEHPKM4Bcjs = require('./chunk-HEHPKM4B.cjs');
5
+
6
+ // src/wrappers/AsyncMultiSelect2/AsyncMultiSelect2.tsx
7
+
8
+
9
+
10
+
11
+
12
+
13
+ var _material = require('@mui/material');
14
+ var _lodash = require('lodash');
15
+ var _react = require('react'); var React7 = _interopRequireWildcard(_react);
16
+ var _reacthookform = require('react-hook-form');
17
+ var _jsxruntime = require('react/jsx-runtime');
18
+ var initialState = {
19
+ options: [],
20
+ selectedOptions: [],
21
+ inputValue: "",
22
+ loading: false,
23
+ initialLoaded: false
24
+ };
25
+ function componentReducer(state, action) {
26
+ switch (action.type) {
27
+ case "SET_OPTIONS":
28
+ return { ...state, options: action.payload, loading: false };
29
+ case "SET_SELECTED_OPTIONS":
30
+ return { ...state, selectedOptions: action.payload };
31
+ case "SET_INPUT_VALUE":
32
+ return { ...state, inputValue: action.payload };
33
+ case "SET_LOADING":
34
+ return { ...state, loading: action.payload };
35
+ case "SET_INITIAL_LOADED":
36
+ return { ...state, initialLoaded: action.payload };
37
+ case "RESET_OPTIONS":
38
+ return { ...state, options: state.selectedOptions };
39
+ default:
40
+ return state;
41
+ }
42
+ }
43
+ var AsyncMultiSelect2Component = ({
44
+ name,
45
+ control,
46
+ placeholder,
47
+ initialValues,
48
+ label,
49
+ queryFn,
50
+ variant = "outlined",
51
+ sx,
52
+ disabled = false,
53
+ debounceMs = 400,
54
+ loadingText = "Loading...",
55
+ noOptionsText = "No options",
56
+ renderInput,
57
+ ...rest
58
+ }) => {
59
+ const [state, dispatch] = _react.useReducer.call(void 0, componentReducer, initialState);
60
+ const theme = _material.useTheme.call(void 0, );
61
+ const {
62
+ field,
63
+ fieldState: { error }
64
+ } = _reacthookform.useController.call(void 0, {
65
+ name,
66
+ control
67
+ });
68
+ const debouncedFetch = _react.useMemo.call(void 0,
69
+ () => _lodash.debounce.call(void 0, async (payload) => {
70
+ try {
71
+ const results = await queryFn(payload);
72
+ const mergedOptions = [
73
+ ...state.selectedOptions,
74
+ ...results.filter(
75
+ (option) => !state.selectedOptions.some((selected) => selected.value === option.value)
76
+ )
77
+ ];
78
+ dispatch({ type: "SET_OPTIONS", payload: mergedOptions });
79
+ } catch (_error) {
80
+ dispatch({ type: "SET_LOADING", payload: false });
81
+ }
82
+ }, debounceMs),
83
+ [queryFn, state.selectedOptions, debounceMs]
84
+ );
85
+ _react.useEffect.call(void 0, () => {
86
+ if (!_optionalChain([initialValues, 'optionalAccess', _2 => _2.length]) || state.initialLoaded) return;
87
+ dispatch({ type: "SET_LOADING", payload: true });
88
+ const payload = {
89
+ query: null,
90
+ initialValues
91
+ };
92
+ queryFn(payload).then((results) => {
93
+ if (results) {
94
+ dispatch({ type: "SET_SELECTED_OPTIONS", payload: results });
95
+ dispatch({ type: "SET_OPTIONS", payload: results });
96
+ dispatch({ type: "SET_INITIAL_LOADED", payload: true });
97
+ field.onChange(results.map((option) => option.value));
98
+ }
99
+ dispatch({ type: "SET_LOADING", payload: false });
100
+ }).catch((_error) => {
101
+ dispatch({ type: "SET_LOADING", payload: false });
102
+ });
103
+ }, [initialValues, state.initialLoaded, queryFn, field]);
104
+ _react.useEffect.call(void 0, () => {
105
+ if (!state.initialLoaded) return;
106
+ if (state.inputValue === "") {
107
+ dispatch({ type: "RESET_OPTIONS" });
108
+ return;
109
+ }
110
+ dispatch({ type: "SET_LOADING", payload: true });
111
+ const payload = {
112
+ query: state.inputValue,
113
+ initialValues: null
114
+ };
115
+ debouncedFetch(payload);
116
+ }, [state.inputValue, state.initialLoaded, debouncedFetch]);
117
+ const handleChange = _react.useCallback.call(void 0,
118
+ (event, newValue) => {
119
+ dispatch({ type: "SET_SELECTED_OPTIONS", payload: newValue });
120
+ field.onChange(newValue.map((option) => option.value));
121
+ },
122
+ [field]
123
+ );
124
+ const handleInputChange = _react.useCallback.call(void 0,
125
+ (event, newInputValue) => {
126
+ dispatch({ type: "SET_INPUT_VALUE", payload: newInputValue });
127
+ },
128
+ []
129
+ );
130
+ const isOptionEqualToValue = _react.useCallback.call(void 0,
131
+ (option, value) => option.value === value.value,
132
+ []
133
+ );
134
+ const getOptionLabel = _react.useCallback.call(void 0, (option) => option.label, []);
135
+ const defaultRenderInput = _react.useCallback.call(void 0,
136
+ (params) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
137
+ _material.TextField,
138
+ {
139
+ ...params,
140
+ label,
141
+ placeholder,
142
+ variant,
143
+ error: !!error,
144
+ helperText: _optionalChain([error, 'optionalAccess', _3 => _3.message]),
145
+ slotProps: {
146
+ input: {
147
+ ...params.InputProps,
148
+ endAdornment: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
149
+ state.loading && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CircularProgress, { color: "inherit", size: 20 }),
150
+ params.InputProps.endAdornment
151
+ ] })
152
+ }
153
+ },
154
+ sx: {
155
+ "& .MuiInputBase-input": {
156
+ cursor: disabled ? "not-allowed" : "default"
157
+ },
158
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
159
+ ...sx
160
+ }
161
+ }
162
+ ),
163
+ [label, placeholder, variant, error, state.loading, disabled, theme.palette.action.disabledBackground, sx]
164
+ );
165
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
166
+ _material.Autocomplete,
167
+ {
168
+ multiple: true,
169
+ options: state.options,
170
+ value: state.selectedOptions,
171
+ loading: state.loading,
172
+ disabled,
173
+ isOptionEqualToValue,
174
+ getOptionLabel,
175
+ filterSelectedOptions: true,
176
+ onChange: handleChange,
177
+ onInputChange: handleInputChange,
178
+ loadingText,
179
+ noOptionsText,
180
+ renderInput: renderInput || defaultRenderInput,
181
+ ...rest
182
+ }
183
+ );
184
+ };
185
+ var AsyncMultiSelect2 = ({
186
+ gridProps,
187
+ ...props
188
+ }) => {
189
+ if (gridProps) {
190
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AsyncMultiSelect2Component, { ...props }) });
191
+ }
192
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AsyncMultiSelect2Component, { ...props });
193
+ };
194
+ AsyncMultiSelect2.displayName = "AsyncMultiSelect2";
195
+
196
+ // src/wrappers/CheckboxElement/CheckboxElement.tsx
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+
208
+
209
+
210
+ var Component = function CheckboxElement(props) {
211
+ const {
212
+ name,
213
+ control,
214
+ label,
215
+ labelProps,
216
+ helperText,
217
+ parseError,
218
+ transform,
219
+ disabled,
220
+ sx,
221
+ onChange: customOnChange,
222
+ ...rest
223
+ } = props;
224
+ const theme = _material.useTheme.call(void 0, );
225
+ const {
226
+ field,
227
+ fieldState: { error }
228
+ } = _reacthookform.useController.call(void 0, {
229
+ name,
230
+ control,
231
+ disabled
232
+ });
233
+ const { value, onChange } = _chunkHEHPKM4Bcjs.useTransform.call(void 0, {
234
+ value: field.value,
235
+ onChange: field.onChange,
236
+ transform: {
237
+ input: typeof _optionalChain([transform, 'optionalAccess', _4 => _4.input]) === "function" ? transform.input : (value2) => !!value2,
238
+ output: typeof _optionalChain([transform, 'optionalAccess', _5 => _5.output]) === "function" ? (eventOrValue, _value) => {
239
+ const event = eventOrValue;
240
+ const checked = _value;
241
+ return transform.output(event, checked);
242
+ } : (eventOrValue, _value) => {
243
+ const checked = _value;
244
+ return checked;
245
+ }
246
+ }
247
+ });
248
+ const handleChange = (event, checked) => {
249
+ onChange(event, checked);
250
+ if (typeof customOnChange === "function") {
251
+ customOnChange(event, checked);
252
+ }
253
+ };
254
+ const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
255
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.FormControl, { error: !!error, disabled, children: [
256
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormGroup, { row: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
257
+ _material.FormControlLabel,
258
+ {
259
+ label: label || "",
260
+ ...labelProps,
261
+ disabled,
262
+ control: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
263
+ _material.Checkbox,
264
+ {
265
+ ...rest,
266
+ color: rest.color || "primary",
267
+ sx: [
268
+ ...Array.isArray(sx) ? sx : [sx],
269
+ {
270
+ color: error ? theme.palette.error.main : disabled ? theme.palette.action.disabled : void 0,
271
+ "&.Mui-disabled": {
272
+ color: theme.palette.action.disabled
273
+ }
274
+ }
275
+ ],
276
+ checked: value,
277
+ disabled,
278
+ onChange: handleChange,
279
+ ref: field.ref
280
+ }
281
+ )
282
+ }
283
+ ) }),
284
+ (displayError || helperText) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormHelperText, { error: !!error, children: displayError || helperText })
285
+ ] });
286
+ };
287
+ var CheckboxElement2 = ({
288
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
289
+ ...props
290
+ }) => {
291
+ if (gridProps) {
292
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
293
+ _material.Grid,
294
+ {
295
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
296
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, { ...props })
297
+ }
298
+ );
299
+ }
300
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component, { ...props });
301
+ };
302
+ CheckboxElement2.displayName = "CheckboxElement";
303
+
304
+ // src/wrappers/CheckboxGroup/CheckboxGroup.tsx
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+ var Component2 = function CheckboxGroup(props) {
319
+ const { name, control, label, labelProps, inputRef, options, ...rest } = props;
320
+ const {
321
+ field,
322
+ fieldState: { error }
323
+ } = _reacthookform.useController.call(void 0, {
324
+ name,
325
+ control,
326
+ disabled: rest.disabled
327
+ });
328
+ const [selectedValues, setSelectedValues] = _react.useState.call(void 0,
329
+ options.filter((c) => _optionalChain([field, 'access', _6 => _6.value, 'optionalAccess', _7 => _7.includes, 'call', _8 => _8(c.Value)])).map((c) => c.Value) || []
330
+ );
331
+ _react.useEffect.call(void 0, () => {
332
+ field.onChange(selectedValues ? [...selectedValues] : []);
333
+ }, [selectedValues]);
334
+ const handleChange = (event) => {
335
+ const value = parseInt(event.target.value, 10);
336
+ if (event.target.checked) {
337
+ setSelectedValues([...selectedValues, value]);
338
+ } else {
339
+ setSelectedValues(selectedValues.filter((item) => item !== value));
340
+ }
341
+ };
342
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.FormControl, { error: !!error, children: [
343
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormGroup, { row: true, children: options.map((option) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
344
+ _material.FormControlLabel,
345
+ {
346
+ label: option.Label,
347
+ ...labelProps,
348
+ control: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
349
+ _material.Checkbox,
350
+ {
351
+ ...rest,
352
+ color: rest.color || "primary",
353
+ sx: [
354
+ ...Array.isArray(rest.sx) ? rest.sx : [rest.sx],
355
+ {
356
+ color: error ? "error.main" : void 0
357
+ }
358
+ ],
359
+ value: option.Value,
360
+ checked: selectedValues.includes(option.Value),
361
+ onChange: handleChange
362
+ }
363
+ )
364
+ },
365
+ `${option.Value}`
366
+ )) }),
367
+ error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormHelperText, { error: !!error, children: error.message })
368
+ ] });
369
+ };
370
+ var CheckboxGroup2 = ({
371
+ gridProps,
372
+ ...props
373
+ }) => {
374
+ if (gridProps) {
375
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component2, { ...props }) });
376
+ }
377
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component2, { ...props });
378
+ };
379
+ CheckboxGroup2.displayName = "CheckboxGroup";
380
+
381
+ // src/wrappers/DatePickerElement/DatePickerElement.tsx
382
+
383
+
384
+
385
+ // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
386
+
387
+ var _xdatepickers = require('@mui/x-date-pickers');
388
+
389
+
390
+
391
+ // src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
392
+ var _internals = require('@mui/x-date-pickers/internals');
393
+
394
+ function readDatePickerValueAsDate(adapter, value) {
395
+ if (value === null || value === void 0) {
396
+ return null;
397
+ }
398
+ if (typeof value === "string") {
399
+ if (value === "") {
400
+ return null;
401
+ }
402
+ const parsedDate = adapter.utils.date(value);
403
+ return parsedDate;
404
+ }
405
+ return value;
406
+ }
407
+ function useDatePickerValue(options) {
408
+ const { field, transform } = options;
409
+ const adapter = _internals.useLocalizationContext.call(void 0, );
410
+ const value = _react.useMemo.call(void 0, () => {
411
+ if (typeof _optionalChain([transform, 'optionalAccess', _9 => _9.input]) === "function") {
412
+ return transform.input(field.value);
413
+ }
414
+ return readDatePickerValueAsDate(adapter, field.value);
415
+ }, [field.value, _optionalChain([transform, 'optionalAccess', _10 => _10.input]), adapter]);
416
+ const onChange = _react.useCallback.call(void 0,
417
+ (newValue, context) => {
418
+ if (typeof _optionalChain([transform, 'optionalAccess', _11 => _11.output]) === "function") {
419
+ const transformedValue = transform.output(newValue, context);
420
+ field.onChange(transformedValue);
421
+ } else {
422
+ field.onChange(newValue);
423
+ }
424
+ },
425
+ [field.onChange, _optionalChain([transform, 'optionalAccess', _12 => _12.output])]
426
+ );
427
+ return {
428
+ value,
429
+ onChange
430
+ };
431
+ }
432
+
433
+ // src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
434
+
435
+ var DEFAULT_ERROR_MESSAGES = {
436
+ invalidDate: "Please enter a valid date",
437
+ minDate: "Date must be after the minimum allowed date",
438
+ maxDate: "Date must be before the maximum allowed date",
439
+ disabledDate: "This date is not allowed",
440
+ required: "This field is required"
441
+ };
442
+ function useDatePickerValidation(options) {
443
+ const { fieldState, validation, parseError, value } = options;
444
+ const validationResult = _react.useMemo.call(void 0, () => {
445
+ const { error: fieldError, invalid } = fieldState;
446
+ let currentError = fieldError;
447
+ if (!fieldError && value && validation) {
448
+ const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
449
+ if (minDate && value < minDate) {
450
+ currentError = {
451
+ type: "minDate",
452
+ message: _optionalChain([errorMessages, 'optionalAccess', _13 => _13.minDate]) || DEFAULT_ERROR_MESSAGES.minDate
453
+ };
454
+ } else if (maxDate && value > maxDate) {
455
+ currentError = {
456
+ type: "maxDate",
457
+ message: _optionalChain([errorMessages, 'optionalAccess', _14 => _14.maxDate]) || DEFAULT_ERROR_MESSAGES.maxDate
458
+ };
459
+ } else if (shouldDisableDate && shouldDisableDate(value)) {
460
+ currentError = {
461
+ type: "disabledDate",
462
+ message: _optionalChain([errorMessages, 'optionalAccess', _15 => _15.disabledDate]) || DEFAULT_ERROR_MESSAGES.disabledDate
463
+ };
464
+ }
465
+ }
466
+ const hasError = Boolean(currentError);
467
+ return {
468
+ hasError,
469
+ error: currentError,
470
+ invalid: invalid || hasError
471
+ };
472
+ }, [fieldState, validation, value]);
473
+ const errorMessage = _react.useMemo.call(void 0, () => {
474
+ if (!validationResult.error) {
475
+ return null;
476
+ }
477
+ if (parseError) {
478
+ return parseError(validationResult.error);
479
+ }
480
+ if (typeof validationResult.error === "string") {
481
+ return validationResult.error;
482
+ }
483
+ if ("message" in validationResult.error && validationResult.error.message) {
484
+ return validationResult.error.message;
485
+ }
486
+ if ("type" in validationResult.error) {
487
+ const errorType = validationResult.error.type;
488
+ switch (errorType) {
489
+ case "required":
490
+ return DEFAULT_ERROR_MESSAGES.required;
491
+ case "minDate":
492
+ return DEFAULT_ERROR_MESSAGES.minDate;
493
+ case "maxDate":
494
+ return DEFAULT_ERROR_MESSAGES.maxDate;
495
+ case "disabledDate":
496
+ return DEFAULT_ERROR_MESSAGES.disabledDate;
497
+ case "invalidDate":
498
+ default:
499
+ return DEFAULT_ERROR_MESSAGES.invalidDate;
500
+ }
501
+ }
502
+ return DEFAULT_ERROR_MESSAGES.invalidDate;
503
+ }, [validationResult.error, parseError]);
504
+ return {
505
+ ...validationResult,
506
+ errorMessage
507
+ };
508
+ }
509
+
510
+ // src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
511
+
512
+
513
+ function useDatePickerStyles(options = {}) {
514
+ const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
515
+ const theme = _material.useTheme.call(void 0, );
516
+ const computedSx = _react.useMemo.call(void 0, () => {
517
+ const baseStyles = {
518
+ // Input field styling
519
+ "& .MuiOutlinedInput-root": {
520
+ backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
521
+ // Transition for smooth state changes
522
+ transition: theme.transitions.create([
523
+ "background-color",
524
+ "border-color",
525
+ "color"
526
+ ], {
527
+ duration: theme.transitions.duration.short
528
+ }),
529
+ // Error state styling
530
+ ...hasError && {
531
+ borderColor: theme.palette.error.main,
532
+ "&:hover": {
533
+ borderColor: theme.palette.error.main
534
+ },
535
+ "&.Mui-focused": {
536
+ borderColor: theme.palette.error.main,
537
+ boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
538
+ // 25 is 15% opacity in hex
539
+ }
540
+ },
541
+ // Loading state styling
542
+ ...loading && {
543
+ opacity: 0.7,
544
+ pointerEvents: "none"
545
+ }
546
+ },
547
+ // Input element styling
548
+ "& .MuiInputBase-input": {
549
+ cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
550
+ // Read-only specific styling
551
+ ...textReadOnly && !disabled && {
552
+ cursor: "pointer",
553
+ userSelect: "none",
554
+ caretColor: "transparent"
555
+ // Hide text cursor in read-only mode
556
+ },
557
+ // Loading state
558
+ ...loading && {
559
+ cursor: "wait"
560
+ }
561
+ },
562
+ // Required field asterisk styling
563
+ "& .MuiInputLabel-asterisk": {
564
+ color: theme.palette.error.main,
565
+ fontSize: "1.2em"
566
+ },
567
+ // Label styling with better contrast
568
+ "& .MuiInputLabel-root": {
569
+ color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
570
+ // Ensure proper contrast for disabled state
571
+ ...disabled && {
572
+ color: theme.palette.text.disabled
573
+ }
574
+ },
575
+ // Helper text styling
576
+ "& .MuiFormHelperText-root": {
577
+ marginLeft: theme.spacing(1),
578
+ marginRight: theme.spacing(1),
579
+ // Error state
580
+ ...hasError && {
581
+ color: theme.palette.error.main
582
+ }
583
+ },
584
+ // Calendar icon styling
585
+ "& .MuiInputAdornment-root": {
586
+ color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
587
+ },
588
+ // Focus ring for accessibility
589
+ "& .MuiOutlinedInput-root.Mui-focused": {
590
+ outline: `2px solid ${theme.palette.primary.main}50`,
591
+ // 50 is 31% opacity
592
+ outlineOffset: "2px"
593
+ },
594
+ // Enhanced contrast for dark themes
595
+ ...theme.palette.mode === "dark" && {
596
+ "& .MuiOutlinedInput-root": {
597
+ borderWidth: 2
598
+ }
599
+ }
600
+ };
601
+ return customSx ? [baseStyles, customSx] : baseStyles;
602
+ }, [
603
+ theme,
604
+ disabled,
605
+ hasError,
606
+ loading,
607
+ textReadOnly,
608
+ customSx
609
+ ]);
610
+ const className = _react.useMemo.call(void 0, () => {
611
+ const classes = [];
612
+ if (disabled) classes.push("DatePickerElement--disabled");
613
+ if (hasError) classes.push("DatePickerElement--error");
614
+ if (loading) classes.push("DatePickerElement--loading");
615
+ if (textReadOnly) classes.push("DatePickerElement--readOnly");
616
+ return classes.length > 0 ? classes.join(" ") : void 0;
617
+ }, [disabled, hasError, loading, textReadOnly]);
618
+ return {
619
+ sx: computedSx,
620
+ className
621
+ };
622
+ }
623
+
624
+ // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
625
+
626
+ var DatePickerElementCore = _react.forwardRef.call(void 0, (props, ref) => {
627
+ const {
628
+ name,
629
+ required = false,
630
+ rules,
631
+ control,
632
+ parseError,
633
+ transform,
634
+ validation,
635
+ label,
636
+ placeholder,
637
+ textReadOnly = false,
638
+ helperText,
639
+ inputProps = {},
640
+ slotProps = {},
641
+ datePickerProps = {},
642
+ variant = "outlined",
643
+ sx: customSx,
644
+ loading = false,
645
+ LoadingComponent,
646
+ ...restProps
647
+ } = props;
648
+ const {
649
+ disabled,
650
+ inputRef: externalInputRef,
651
+ onClose,
652
+ ...restDatePickerProps
653
+ } = datePickerProps;
654
+ const {
655
+ field,
656
+ fieldState
657
+ } = _reacthookform.useController.call(void 0, {
658
+ name,
659
+ control,
660
+ rules,
661
+ defaultValue: null
662
+ // Let react-hook-form handle the default value typing
663
+ });
664
+ const { value, onChange: onValueChange } = useDatePickerValue({
665
+ field,
666
+ transform
667
+ });
668
+ const { hasError, errorMessage, invalid } = useDatePickerValidation({
669
+ fieldState,
670
+ validation,
671
+ parseError,
672
+ value
673
+ });
674
+ const { sx: computedSx, className } = useDatePickerStyles({
675
+ disabled,
676
+ hasError,
677
+ loading,
678
+ textReadOnly,
679
+ sx: customSx
680
+ });
681
+ const handleInputRef = _material.useForkRef.call(void 0, field.ref, externalInputRef);
682
+ const handleChange = _react.useCallback.call(void 0,
683
+ (newValue, context) => {
684
+ onValueChange(newValue, context);
685
+ },
686
+ [onValueChange]
687
+ );
688
+ const handleClose = _react.useCallback.call(void 0,
689
+ (...args) => {
690
+ field.onBlur();
691
+ if (onClose) {
692
+ onClose(...args);
693
+ }
694
+ },
695
+ [field.onBlur, onClose]
696
+ );
697
+ const handleTextFieldBlur = _react.useCallback.call(void 0,
698
+ (event) => {
699
+ field.onBlur();
700
+ if (typeof inputProps.onBlur === "function") {
701
+ inputProps.onBlur(event);
702
+ }
703
+ },
704
+ [field.onBlur, inputProps.onBlur]
705
+ );
706
+ const memoizedSlotProps = _react.useMemo.call(void 0, () => ({
707
+ ...slotProps,
708
+ actionBar: {
709
+ actions: ["clear", "today", "cancel", "accept"],
710
+ ...slotProps.actionBar
711
+ },
712
+ textField: {
713
+ ...inputProps,
714
+ required,
715
+ placeholder,
716
+ fullWidth: true,
717
+ variant,
718
+ onBlur: handleTextFieldBlur,
719
+ error: hasError,
720
+ helperText: hasError ? errorMessage : helperText,
721
+ inputProps: {
722
+ readOnly: textReadOnly,
723
+ "aria-invalid": invalid,
724
+ "aria-describedby": hasError ? `${name}-error` : void 0,
725
+ ...inputProps.inputProps
726
+ },
727
+ // Add loading indicator if provided
728
+ ...loading && LoadingComponent && {
729
+ InputProps: {
730
+ endAdornment: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LoadingComponent, {}),
731
+ ...inputProps.InputProps
732
+ }
733
+ },
734
+ ...slotProps.textField
735
+ }
736
+ }), [
737
+ slotProps,
738
+ inputProps,
739
+ required,
740
+ placeholder,
741
+ variant,
742
+ handleTextFieldBlur,
743
+ hasError,
744
+ errorMessage,
745
+ helperText,
746
+ textReadOnly,
747
+ invalid,
748
+ name,
749
+ loading,
750
+ LoadingComponent
751
+ ]);
752
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
753
+ _xdatepickers.DatePicker,
754
+ {
755
+ ...restProps,
756
+ ...restDatePickerProps,
757
+ ref,
758
+ name,
759
+ value,
760
+ onChange: handleChange,
761
+ onClose: handleClose,
762
+ inputRef: handleInputRef,
763
+ label,
764
+ disabled,
765
+ sx: computedSx,
766
+ className,
767
+ slotProps: memoizedSlotProps,
768
+ "aria-invalid": invalid,
769
+ "aria-describedby": hasError ? `${name}-error` : void 0
770
+ }
771
+ );
772
+ });
773
+ DatePickerElementCore.displayName = "DatePickerElementCore";
774
+
775
+ // src/wrappers/DatePickerElement/DatePickerElement.tsx
776
+
777
+ var DatePickerElement = _react.forwardRef.call(void 0, (props, ref) => {
778
+ const {
779
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
780
+ ...coreProps
781
+ } = props;
782
+ if (gridProps === false) {
783
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
784
+ DatePickerElementCore,
785
+ {
786
+ ref,
787
+ ...coreProps
788
+ }
789
+ );
790
+ }
791
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
792
+ _material.Grid,
793
+ {
794
+ ref,
795
+ ...gridProps,
796
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
797
+ DatePickerElementCore,
798
+ {
799
+ ...coreProps
800
+ }
801
+ )
802
+ }
803
+ );
804
+ });
805
+ DatePickerElement.displayName = "DatePickerElement";
806
+
807
+ // src/wrappers/DatePickerElement/utils.ts
808
+ function isValidDate(value) {
809
+ if (value === null || value === void 0) {
810
+ return false;
811
+ }
812
+ if (value instanceof Date) {
813
+ return !isNaN(value.getTime());
814
+ }
815
+ if (typeof value === "object" && value !== null) {
816
+ if ("isValid" in value && typeof value.isValid === "function") {
817
+ return value.isValid();
818
+ }
819
+ if ("isValid" in value && typeof value.isValid === "boolean") {
820
+ return value.isValid;
821
+ }
822
+ }
823
+ return false;
824
+ }
825
+ function isParsableDateString(value) {
826
+ if (typeof value !== "string" || value === "") {
827
+ return false;
828
+ }
829
+ const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
830
+ if (isoDateRegex.test(value)) {
831
+ return true;
832
+ }
833
+ const parsed = new Date(value);
834
+ return !isNaN(parsed.getTime());
835
+ }
836
+ function createDateInputTransform(adapter) {
837
+ return (value) => {
838
+ if (value === null || value === void 0) {
839
+ return null;
840
+ }
841
+ if (typeof value === "string") {
842
+ if (value === "") {
843
+ return null;
844
+ }
845
+ try {
846
+ const parsed = adapter.utils.date(value);
847
+ return isValidDate(parsed) ? parsed : null;
848
+ } catch (e2) {
849
+ return null;
850
+ }
851
+ }
852
+ if (isValidDate(value)) {
853
+ return value;
854
+ }
855
+ return null;
856
+ };
857
+ }
858
+ function createDateOutputTransform(format) {
859
+ return (value) => {
860
+ if (value === null || value === void 0) {
861
+ return null;
862
+ }
863
+ if (!isValidDate(value)) {
864
+ return null;
865
+ }
866
+ if (!format) {
867
+ return value;
868
+ }
869
+ try {
870
+ if (value instanceof Date) {
871
+ if (format === "iso") {
872
+ return value.toISOString();
873
+ }
874
+ if (format === "date-only") {
875
+ return value.toISOString().split("T")[0];
876
+ }
877
+ }
878
+ if (typeof value.format === "function") {
879
+ return value.format(format);
880
+ }
881
+ if (typeof value.format === "function") {
882
+ return value.format(format);
883
+ }
884
+ if (typeof value.toFormat === "function") {
885
+ return value.toFormat(format);
886
+ }
887
+ return value;
888
+ } catch (e3) {
889
+ return null;
890
+ }
891
+ };
892
+ }
893
+ function createDefaultDatePickerConfig() {
894
+ return {
895
+ // Default slot props for consistent behavior
896
+ slotProps: {
897
+ actionBar: {
898
+ actions: ["clear", "today", "cancel", "accept"]
899
+ },
900
+ textField: {
901
+ fullWidth: true,
902
+ variant: "outlined"
903
+ }
904
+ },
905
+ // Default grid props for layout consistency
906
+ gridProps: {
907
+ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
908
+ },
909
+ // Default validation configuration
910
+ validation: {
911
+ errorMessages: {
912
+ invalidDate: "Please enter a valid date",
913
+ minDate: "Date must be after the minimum allowed date",
914
+ maxDate: "Date must be before the maximum allowed date",
915
+ disabledDate: "This date is not allowed"
916
+ }
917
+ }
918
+ };
919
+ }
920
+ function extractErrorMessage(error) {
921
+ if (error === null || error === void 0) {
922
+ return "";
923
+ }
924
+ if (typeof error === "string") {
925
+ return error;
926
+ }
927
+ if (typeof error === "object" && error !== null) {
928
+ if ("message" in error && typeof error.message === "string") {
929
+ return error.message;
930
+ }
931
+ if ("type" in error && typeof error.type === "string") {
932
+ const errorType = error.type;
933
+ switch (errorType) {
934
+ case "invalidDate":
935
+ return "Please enter a valid date";
936
+ case "minDate":
937
+ return "Date is too early";
938
+ case "maxDate":
939
+ return "Date is too late";
940
+ case "disabledDate":
941
+ return "This date is not available";
942
+ default:
943
+ return "Invalid date selection";
944
+ }
945
+ }
946
+ }
947
+ return "Invalid input";
948
+ }
949
+ function createStableKey(config) {
950
+ try {
951
+ return JSON.stringify(config, (key, value) => {
952
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
953
+ const sorted = {};
954
+ Object.keys(value).sort().forEach((k) => {
955
+ sorted[k] = value[k];
956
+ });
957
+ return sorted;
958
+ }
959
+ return value;
960
+ });
961
+ } catch (e4) {
962
+ return Object.keys(config).sort().join("-");
963
+ }
964
+ }
965
+
966
+ // src/wrappers/PasswordElement/PasswordElement.tsx
967
+ var _Visibility = require('@mui/icons-material/Visibility'); var _Visibility2 = _interopRequireDefault(_Visibility);
968
+ var _VisibilityOff = require('@mui/icons-material/VisibilityOff'); var _VisibilityOff2 = _interopRequireDefault(_VisibilityOff);
969
+
970
+
971
+
972
+
973
+
974
+
975
+
976
+
977
+
978
+
979
+
980
+
981
+ var Component3 = function PasswordEl(props) {
982
+ const {
983
+ type,
984
+ required,
985
+ iconColor,
986
+ renderIcon = (password2) => password2 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Visibility2.default, {}) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _VisibilityOff2.default, {}),
987
+ slotProps,
988
+ name,
989
+ control,
990
+ component: TextFieldComponent = _material.TextField,
991
+ inputRef,
992
+ onBlur,
993
+ ...rest
994
+ } = props;
995
+ const [password, setPassword] = _react.useState.call(void 0, true);
996
+ const endAdornment = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.InputAdornment, { position: "end", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
997
+ _material.IconButton,
998
+ {
999
+ onMouseDown: (e) => e.preventDefault(),
1000
+ onClick: () => setPassword(!password),
1001
+ tabIndex: -1,
1002
+ color: _nullishCoalesce(iconColor, () => ( "default")),
1003
+ children: renderIcon(password)
1004
+ }
1005
+ ) });
1006
+ const {
1007
+ field,
1008
+ fieldState: { error }
1009
+ } = _reacthookform.useController.call(void 0, {
1010
+ name,
1011
+ control
1012
+ });
1013
+ const handleInputRef = _material.useForkRef.call(void 0, field.ref, inputRef);
1014
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1015
+ _material.TextField,
1016
+ {
1017
+ ...rest,
1018
+ inputRef: handleInputRef,
1019
+ type: password ? "password" : "text",
1020
+ value: field.value,
1021
+ fullWidth: true,
1022
+ onChange: (event) => {
1023
+ field.onChange(event);
1024
+ if (typeof rest.onChange === "function") {
1025
+ rest.onChange(event);
1026
+ }
1027
+ },
1028
+ onBlur: (event) => {
1029
+ field.onBlur();
1030
+ if (typeof onBlur === "function") {
1031
+ onBlur(event);
1032
+ }
1033
+ },
1034
+ ...typeof slotProps === "undefined" ? {
1035
+ InputProps: {
1036
+ endAdornment
1037
+ }
1038
+ } : {
1039
+ slotProps: {
1040
+ ...slotProps,
1041
+ input: {
1042
+ endAdornment,
1043
+ ..._optionalChain([slotProps, 'optionalAccess', _16 => _16.input])
1044
+ }
1045
+ }
1046
+ },
1047
+ error: !!error,
1048
+ helperText: error ? error.message : ""
1049
+ }
1050
+ );
1051
+ };
1052
+ var PasswordElement = ({
1053
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1054
+ ...props
1055
+ }) => {
1056
+ if (gridProps) {
1057
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1058
+ _material.Grid,
1059
+ {
1060
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1061
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component3, { ...props })
1062
+ }
1063
+ );
1064
+ }
1065
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component3, { ...props });
1066
+ };
1067
+ PasswordElement.displayName = "PasswordElement";
1068
+ var PasswordElement_default = PasswordElement;
1069
+
1070
+ // src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
1071
+
1072
+
1073
+
1074
+
1075
+
1076
+
1077
+
1078
+
1079
+
1080
+
1081
+
1082
+
1083
+
1084
+
1085
+ var Component4 = function RadioButtonGroup(props) {
1086
+ const {
1087
+ options,
1088
+ label,
1089
+ name,
1090
+ labelKey = "label",
1091
+ valueKey = "id",
1092
+ disabledKey = "disabled",
1093
+ required,
1094
+ emptyOptionLabel,
1095
+ returnObject,
1096
+ row,
1097
+ control,
1098
+ type,
1099
+ labelProps,
1100
+ disabled,
1101
+ formLabelProps,
1102
+ radioProps,
1103
+ transform,
1104
+ ...rest
1105
+ } = props;
1106
+ const theme = _material.useTheme.call(void 0, );
1107
+ const {
1108
+ field,
1109
+ fieldState: { error }
1110
+ } = _reacthookform.useController.call(void 0, {
1111
+ name,
1112
+ disabled,
1113
+ control
1114
+ });
1115
+ const { value, onChange } = _chunkHEHPKM4Bcjs.useTransform.call(void 0, {
1116
+ value: field.value,
1117
+ onChange: field.onChange,
1118
+ transform: {
1119
+ input: typeof _optionalChain([transform, 'optionalAccess', _17 => _17.input]) === "function" ? transform.input : (value2) => {
1120
+ return value2 || "";
1121
+ },
1122
+ output: typeof _optionalChain([transform, 'optionalAccess', _18 => _18.output]) === "function" ? _optionalChain([transform, 'optionalAccess', _19 => _19.output]) : (_event, value2) => {
1123
+ if (value2 && type === "number") {
1124
+ return Number(value2);
1125
+ }
1126
+ if (value2 && type === "boolean") {
1127
+ return Boolean(value2);
1128
+ }
1129
+ return value2;
1130
+ }
1131
+ }
1132
+ });
1133
+ const onRadioChange = (event, radioValue) => {
1134
+ const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
1135
+ onChange(event, returnValue);
1136
+ if (typeof rest.onChange === "function") {
1137
+ rest.onChange(returnValue);
1138
+ }
1139
+ };
1140
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.FormControl, { error: !!error, children: [
1141
+ label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
1142
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _material.RadioGroup, { onChange: onRadioChange, name, row, value, children: [
1143
+ emptyOptionLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1144
+ _material.FormControlLabel,
1145
+ {
1146
+ ...labelProps,
1147
+ control: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1148
+ _material.Radio,
1149
+ {
1150
+ ...radioProps,
1151
+ sx: {
1152
+ color: error ? theme.palette.error.main : void 0
1153
+ },
1154
+ checked: !value
1155
+ }
1156
+ ),
1157
+ label: emptyOptionLabel,
1158
+ value: ""
1159
+ }
1160
+ ),
1161
+ options.map((option) => {
1162
+ const optionKey = option[valueKey];
1163
+ const optionDisabled = option[disabledKey] || false;
1164
+ let val = returnObject ? _optionalChain([value, 'optionalAccess', _20 => _20[valueKey]]) : value;
1165
+ if (type === "number" && val !== void 0) {
1166
+ val = Number(val);
1167
+ } else if (type === "boolean" && val !== void 0) {
1168
+ val = Boolean(val);
1169
+ }
1170
+ const isChecked = val === optionKey;
1171
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1172
+ _material.FormControlLabel,
1173
+ {
1174
+ ...labelProps,
1175
+ control: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1176
+ _material.Radio,
1177
+ {
1178
+ ...radioProps,
1179
+ sx: {
1180
+ color: error ? theme.palette.error.main : void 0
1181
+ },
1182
+ disabled: disabled || optionDisabled,
1183
+ checked: isChecked
1184
+ }
1185
+ ),
1186
+ value: optionKey,
1187
+ label: option[labelKey]
1188
+ },
1189
+ String(optionKey)
1190
+ );
1191
+ })
1192
+ ] }),
1193
+ error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.FormHelperText, { children: error.message })
1194
+ ] });
1195
+ };
1196
+ var RadioButtonGroup2 = ({
1197
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1198
+ ...props
1199
+ }) => {
1200
+ if (gridProps) {
1201
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1202
+ _material.Grid,
1203
+ {
1204
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1205
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component4, { ...props })
1206
+ }
1207
+ );
1208
+ }
1209
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component4, { ...props });
1210
+ };
1211
+ RadioButtonGroup2.displayName = "RadioButtonGroup";
1212
+ var RadioButtonGroup_default = RadioButtonGroup2;
1213
+
1214
+ // src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
1215
+
1216
+
1217
+
1218
+
1219
+
1220
+
1221
+
1222
+
1223
+
1224
+
1225
+
1226
+ var Component5 = function SelectCascadeElement(props) {
1227
+ const {
1228
+ labelKey = "Label",
1229
+ valueKey = "Value",
1230
+ name,
1231
+ onBlur,
1232
+ onChange,
1233
+ disabled,
1234
+ options,
1235
+ control,
1236
+ loading = false,
1237
+ placeholder,
1238
+ label,
1239
+ dependsOn,
1240
+ textFieldProps = {},
1241
+ variant,
1242
+ sx,
1243
+ isEdit = false,
1244
+ ...rest
1245
+ } = props;
1246
+ const { required } = textFieldProps;
1247
+ const getOptionKey = _react.useCallback.call(void 0,
1248
+ (option) => {
1249
+ if (typeof option === "string" || typeof option === "number") return option;
1250
+ const key = option ? option[valueKey] : void 0;
1251
+ return key !== void 0 && key !== null ? String(key) : "";
1252
+ },
1253
+ [valueKey]
1254
+ );
1255
+ const getOptionLabel = _react.useCallback.call(void 0,
1256
+ (option) => {
1257
+ if (typeof option === "string") return option;
1258
+ return option ? String(option[labelKey]) : "";
1259
+ },
1260
+ [labelKey]
1261
+ );
1262
+ const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
1263
+ const {
1264
+ field,
1265
+ fieldState: { error }
1266
+ } = _reacthookform.useController.call(void 0, {
1267
+ name,
1268
+ control
1269
+ });
1270
+ const theme = _material.useTheme.call(void 0, );
1271
+ const { field: dependentField } = _reacthookform.useController.call(void 0, {
1272
+ name: dependsOn,
1273
+ control
1274
+ });
1275
+ const parentValueRef = _react.useRef.call(void 0, _nullishCoalesce(dependentField.value, () => ( null)));
1276
+ const [hasAutoSelected, setHasAutoSelected] = _react.useState.call(void 0, false);
1277
+ _react.useEffect.call(void 0, () => {
1278
+ if (!!dependentField.value && _optionalChain([parentValueRef, 'optionalAccess', _21 => _21.current]) !== dependentField.value || dependentField.value === null) {
1279
+ field.onChange(null);
1280
+ setHasAutoSelected(false);
1281
+ }
1282
+ }, [dependentField.value]);
1283
+ _react.useEffect.call(void 0, () => {
1284
+ if (isEdit && !disabled && options.length === 1 && field.value == null && !hasAutoSelected) {
1285
+ field.onChange(getOptionKey(options[0]));
1286
+ setHasAutoSelected(true);
1287
+ } else {
1288
+ if (options.length === 1 && field.value == null && !hasAutoSelected) {
1289
+ field.onChange(getOptionKey(options[0]));
1290
+ setHasAutoSelected(true);
1291
+ }
1292
+ }
1293
+ }, [
1294
+ options,
1295
+ field.value,
1296
+ field.onChange,
1297
+ hasAutoSelected,
1298
+ isEdit,
1299
+ disabled,
1300
+ field,
1301
+ getOptionKey,
1302
+ dependentField.onChange
1303
+ ]);
1304
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1305
+ _material.Autocomplete,
1306
+ {
1307
+ ...rest,
1308
+ value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
1309
+ size: "small",
1310
+ loading,
1311
+ options,
1312
+ getOptionKey,
1313
+ getOptionLabel,
1314
+ isOptionEqualToValue,
1315
+ ref: field.ref,
1316
+ disabled: dependentField.value == null || disabled,
1317
+ onChange: (event, newValue, reason) => {
1318
+ field.onChange(newValue ? getOptionKey(newValue) : null);
1319
+ if (onChange && typeof onChange === "function") {
1320
+ onChange(event, newValue, reason);
1321
+ }
1322
+ },
1323
+ onBlur: (event) => {
1324
+ field.onBlur();
1325
+ if (typeof onBlur === "function") {
1326
+ onBlur(event);
1327
+ }
1328
+ },
1329
+ fullWidth: true,
1330
+ renderInput: (params) => (
1331
+ // @ts-ignore
1332
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1333
+ _material.TextField,
1334
+ {
1335
+ ...params,
1336
+ fullWidth: true,
1337
+ error: !!error,
1338
+ required,
1339
+ helperText: error ? error.message : "",
1340
+ placeholder,
1341
+ label,
1342
+ variant: variant ? variant : "outlined",
1343
+ sx: {
1344
+ "& .MuiOutlinedInput-root": {
1345
+ bgcolor: disabled || dependentField.value == null ? theme.palette.action.disabledBackground : "transparent"
1346
+ },
1347
+ "& .MuiInputLabel-asterisk": { color: "red" },
1348
+ "& .MuiInputBase-input": {
1349
+ cursor: disabled || dependentField.value == null ? "not-allowed" : "default"
1350
+ },
1351
+ ...sx
1352
+ }
1353
+ }
1354
+ )
1355
+ )
1356
+ }
1357
+ );
1358
+ };
1359
+ var SelectCascadeElement2 = ({
1360
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1361
+ ...props
1362
+ }) => {
1363
+ if (gridProps) {
1364
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component5, { ...props }) });
1365
+ }
1366
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component5, { ...props });
1367
+ };
1368
+ SelectCascadeElement2.displayName = "SelectCascadeElement";
1369
+ var SelectCascadeElement_default = SelectCascadeElement2;
1370
+
1371
+ // src/wrappers/SelectElement/SelectElement.tsx
1372
+
1373
+
1374
+
1375
+
1376
+
1377
+
1378
+
1379
+
1380
+
1381
+
1382
+ var Component6 = function SelectElement(props) {
1383
+ const {
1384
+ name,
1385
+ control,
1386
+ onChange,
1387
+ isEdit,
1388
+ options,
1389
+ label,
1390
+ sx,
1391
+ variant,
1392
+ disabled,
1393
+ labelKey = "Label",
1394
+ valueKey = "Value",
1395
+ placeholder,
1396
+ textFieldProps = {},
1397
+ ...rest
1398
+ } = props;
1399
+ const { required } = textFieldProps;
1400
+ const {
1401
+ field,
1402
+ fieldState: { error }
1403
+ } = _reacthookform.useController.call(void 0, {
1404
+ name,
1405
+ control
1406
+ });
1407
+ const theme = _material.useTheme.call(void 0, );
1408
+ const getOptionValue = _react.useCallback.call(void 0,
1409
+ (option) => {
1410
+ if (typeof option === "string") return option;
1411
+ return option ? option[valueKey] : null;
1412
+ },
1413
+ [valueKey]
1414
+ );
1415
+ const getOptionLabel = _react.useCallback.call(void 0,
1416
+ (option) => {
1417
+ if (typeof option === "string") return option;
1418
+ return option ? String(option[labelKey]) : "";
1419
+ },
1420
+ [labelKey]
1421
+ );
1422
+ const handleChange = (event, newValue, reason) => {
1423
+ const option = newValue;
1424
+ field.onChange(option ? getOptionValue(option) : null);
1425
+ _optionalChain([onChange, 'optionalCall', _22 => _22(event, newValue, reason)]);
1426
+ };
1427
+ _react.useEffect.call(void 0, () => {
1428
+ if (!isEdit && options.length === 1 && (field.value == null || field.value == void 0 || field.value === "")) {
1429
+ const defaultOption = options[0];
1430
+ const defaultValue = getOptionValue(defaultOption);
1431
+ field.onChange(defaultValue);
1432
+ }
1433
+ }, [isEdit, options]);
1434
+ const autocompleteValue = _react.useMemo.call(void 0,
1435
+ () => _nullishCoalesce(options.find((option) => getOptionValue(option) === field.value), () => ( null)),
1436
+ [field.value, options, getOptionValue]
1437
+ );
1438
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1439
+ _material.Autocomplete,
1440
+ {
1441
+ ...rest,
1442
+ filterSelectedOptions: false,
1443
+ options,
1444
+ value: autocompleteValue,
1445
+ onChange: handleChange,
1446
+ disabled,
1447
+ getOptionLabel: (option) => getOptionLabel(option),
1448
+ ref: field.ref,
1449
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1450
+ renderInput: (params) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1451
+ _material.TextField,
1452
+ {
1453
+ ...params,
1454
+ fullWidth: true,
1455
+ required,
1456
+ error: !!error,
1457
+ helperText: error ? error.message : "",
1458
+ label,
1459
+ placeholder,
1460
+ variant: variant ? variant : "outlined",
1461
+ sx: {
1462
+ "& .MuiOutlinedInput-root": {
1463
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent"
1464
+ },
1465
+ "& .MuiInputLabel-asterisk": { color: "red" },
1466
+ "& .MuiInputBase-input": {
1467
+ cursor: disabled ? "not-allowed" : "default"
1468
+ },
1469
+ ...sx
1470
+ }
1471
+ }
1472
+ )
1473
+ }
1474
+ );
1475
+ };
1476
+ var SelectElement2 = ({
1477
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1478
+ ...props
1479
+ }) => {
1480
+ if (gridProps) {
1481
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1482
+ _material.Grid,
1483
+ {
1484
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1485
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component6, { ...props })
1486
+ }
1487
+ );
1488
+ }
1489
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component6, { ...props });
1490
+ };
1491
+ SelectElement2.displayName = "SelectElement";
1492
+ var SelectElement_default = SelectElement2;
1493
+
1494
+ // src/wrappers/SelectMultiElement/SelectMultiElement.tsx
1495
+ var _CheckBox = require('@mui/icons-material/CheckBox'); var _CheckBox2 = _interopRequireDefault(_CheckBox);
1496
+ var _CheckBoxOutlineBlank = require('@mui/icons-material/CheckBoxOutlineBlank'); var _CheckBoxOutlineBlank2 = _interopRequireDefault(_CheckBoxOutlineBlank);
1497
+
1498
+
1499
+
1500
+
1501
+ var Component7 = function SelectMultiElement(props) {
1502
+ const {
1503
+ name,
1504
+ control,
1505
+ onBlur,
1506
+ disabled,
1507
+ options,
1508
+ loading = false,
1509
+ placeholder,
1510
+ label,
1511
+ variant,
1512
+ sx,
1513
+ labelKey = "Label",
1514
+ valueKey = "Value",
1515
+ ...rest
1516
+ } = props;
1517
+ const {
1518
+ field,
1519
+ fieldState: { error }
1520
+ } = _reacthookform.useController.call(void 0, {
1521
+ name,
1522
+ control
1523
+ });
1524
+ const getOptionValue = (option) => {
1525
+ if (typeof option === "string") return option;
1526
+ return option ? option[valueKey] : null;
1527
+ };
1528
+ const getOptionLabel = (option) => {
1529
+ if (typeof option === "string") return option;
1530
+ return option ? option[labelKey] : "";
1531
+ };
1532
+ const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
1533
+ const handleChange = (_, selectedOptions, reason) => {
1534
+ if (reason === "clear") {
1535
+ field.onChange([]);
1536
+ } else if (reason === "selectOption" || reason === "removeOption") {
1537
+ const newValues = selectedOptions.map((option) => getOptionValue(option));
1538
+ field.onChange(newValues);
1539
+ }
1540
+ };
1541
+ const icon = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CheckBoxOutlineBlank2.default, { fontSize: "small" });
1542
+ const checkedIcon = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _CheckBox2.default, { fontSize: "small" });
1543
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1544
+ _material.Autocomplete,
1545
+ {
1546
+ multiple: true,
1547
+ value: selectedValue,
1548
+ loading,
1549
+ options,
1550
+ getOptionLabel,
1551
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1552
+ filterSelectedOptions: true,
1553
+ disableCloseOnSelect: true,
1554
+ ref: field.ref,
1555
+ disabled: _nullishCoalesce(disabled, () => ( field.disabled)),
1556
+ onChange: handleChange,
1557
+ onBlur: (event) => {
1558
+ field.onBlur();
1559
+ if (typeof onBlur === "function") {
1560
+ onBlur(event);
1561
+ }
1562
+ },
1563
+ fullWidth: true,
1564
+ renderOption: (props1, option, { selected }) => {
1565
+ const { key, ...optionProps } = props1;
1566
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "li", { ...optionProps, children: [
1567
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Checkbox, { icon, checkedIcon, checked: selected }),
1568
+ getOptionLabel(option)
1569
+ ] }, key);
1570
+ },
1571
+ renderInput: (params) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1572
+ _material.TextField,
1573
+ {
1574
+ ...params,
1575
+ label,
1576
+ error: !!error,
1577
+ helperText: error ? error.message : "",
1578
+ placeholder,
1579
+ slotProps: {
1580
+ input: {
1581
+ ...params.InputProps,
1582
+ endAdornment: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _react.Fragment, { children: [
1583
+ loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CircularProgress, { color: "inherit", size: 20 }) : null,
1584
+ params.InputProps.endAdornment
1585
+ ] })
1586
+ }
1587
+ },
1588
+ variant: variant ? variant : "outlined",
1589
+ sx: {
1590
+ ...sx
1591
+ }
1592
+ }
1593
+ ),
1594
+ ...rest
1595
+ }
1596
+ );
1597
+ };
1598
+ var SelectMultiElement2 = ({
1599
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1600
+ ...props
1601
+ }) => {
1602
+ if (gridProps) {
1603
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component7, { ...props }) });
1604
+ }
1605
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component7, { ...props });
1606
+ };
1607
+ SelectMultiElement2.displayName = "SelectMultiElement";
1608
+ var SelectMultiElement_default = SelectMultiElement2;
1609
+
1610
+ // src/wrappers/TextFieldElement/TextFieldElement.tsx
1611
+
1612
+
1613
+
1614
+
1615
+
1616
+
1617
+
1618
+
1619
+
1620
+
1621
+ var Component8 = function TextFieldElement(props) {
1622
+ const {
1623
+ rules = {},
1624
+ parseError,
1625
+ name,
1626
+ control,
1627
+ component: TextFieldComponent = _material.TextField,
1628
+ gridProps,
1629
+ transform,
1630
+ label,
1631
+ placeholder,
1632
+ textFieldProps = {},
1633
+ variant,
1634
+ sx,
1635
+ ...rest
1636
+ } = props;
1637
+ const {
1638
+ type,
1639
+ required,
1640
+ helperText,
1641
+ inputRef,
1642
+ onBlur,
1643
+ disabled,
1644
+ ...restTextProps
1645
+ } = textFieldProps;
1646
+ const {
1647
+ field,
1648
+ fieldState: { error }
1649
+ } = _reacthookform.useController.call(void 0, {
1650
+ name,
1651
+ control
1652
+ });
1653
+ const theme = _material.useTheme.call(void 0, );
1654
+ const { value, onChange } = _chunkHEHPKM4Bcjs.useTransform.call(void 0, {
1655
+ value: field.value,
1656
+ onChange: field.onChange,
1657
+ transform: {
1658
+ input: typeof _optionalChain([transform, 'optionalAccess', _23 => _23.input]) === "function" ? transform.input : (value2) => {
1659
+ return _nullishCoalesce(value2, () => ( ""));
1660
+ },
1661
+ output: typeof _optionalChain([transform, 'optionalAccess', _24 => _24.output]) === "function" ? transform.output : (eventOrValue, value2) => {
1662
+ const extractedValue = value2 !== void 0 ? value2 : typeof eventOrValue === "object" && eventOrValue !== null && "target" in eventOrValue && typeof eventOrValue.target === "object" && eventOrValue.target !== null && "value" in eventOrValue.target ? eventOrValue.target.value : eventOrValue;
1663
+ if (type !== "number") {
1664
+ return extractedValue;
1665
+ }
1666
+ if (extractedValue === "") {
1667
+ return null;
1668
+ }
1669
+ if (extractedValue == null) {
1670
+ return extractedValue;
1671
+ }
1672
+ return Number(extractedValue);
1673
+ }
1674
+ }
1675
+ });
1676
+ const handleInputRef = _material.useForkRef.call(void 0, field.ref, inputRef);
1677
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1678
+ TextFieldComponent,
1679
+ {
1680
+ ...rest,
1681
+ ...restTextProps,
1682
+ name: field.name,
1683
+ value,
1684
+ onChange: (event) => {
1685
+ field.onChange(event);
1686
+ if (typeof onChange === "function") {
1687
+ onChange(event);
1688
+ }
1689
+ },
1690
+ onBlur: (event) => {
1691
+ field.onBlur();
1692
+ if (typeof onBlur === "function") {
1693
+ onBlur(event);
1694
+ }
1695
+ },
1696
+ disabled,
1697
+ label,
1698
+ placeholder,
1699
+ fullWidth: true,
1700
+ required,
1701
+ type,
1702
+ error: !!error,
1703
+ helperText: error ? error.message : helperText,
1704
+ inputRef: handleInputRef,
1705
+ variant: variant ? variant : "outlined",
1706
+ size: "small",
1707
+ sx: {
1708
+ "& .MuiInputLabel-asterisk": { color: "red" },
1709
+ "& .MuiInputBase-input": {
1710
+ cursor: disabled ? "not-allowed" : "default"
1711
+ },
1712
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
1713
+ ...sx
1714
+ }
1715
+ }
1716
+ );
1717
+ };
1718
+ var TextFieldElement2 = ({
1719
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1720
+ ...props
1721
+ }) => {
1722
+ if (gridProps) {
1723
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1724
+ _material.Grid,
1725
+ {
1726
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1727
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component8, { ...props })
1728
+ }
1729
+ );
1730
+ }
1731
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component8, { ...props });
1732
+ };
1733
+ TextFieldElement2.displayName = "TextFieldElement";
1734
+ var TextFieldElement_default = TextFieldElement2;
1735
+
1736
+ // src/wrappers/TextFieldElement/EnhancedTextFieldElement.tsx
1737
+
1738
+
1739
+
1740
+
1741
+
1742
+
1743
+
1744
+
1745
+
1746
+
1747
+ var Component9 = function EnhancedTextFieldElement(props) {
1748
+ const {
1749
+ rules = {},
1750
+ parseError,
1751
+ name,
1752
+ control,
1753
+ component: TextFieldComponent = _material.TextField,
1754
+ gridProps,
1755
+ transform,
1756
+ fieldType = "text",
1757
+ // Default to text type
1758
+ defaultValue,
1759
+ label,
1760
+ placeholder,
1761
+ textFieldProps = {},
1762
+ variant,
1763
+ sx,
1764
+ onChange: customOnChange,
1765
+ enableWarnings = process.env.NODE_ENV === "development",
1766
+ ...rest
1767
+ } = props;
1768
+ const {
1769
+ type,
1770
+ required,
1771
+ helperText,
1772
+ inputRef,
1773
+ onBlur,
1774
+ disabled,
1775
+ ...restTextProps
1776
+ } = textFieldProps;
1777
+ const {
1778
+ field,
1779
+ fieldState: { error }
1780
+ } = _reacthookform.useController.call(void 0, {
1781
+ name,
1782
+ control,
1783
+ rules
1784
+ });
1785
+ const theme = _material.useTheme.call(void 0, );
1786
+ const { value, onChange } = _chunkHEHPKM4Bcjs.useEnhancedTransform.call(void 0, {
1787
+ value: field.value,
1788
+ onChange: field.onChange,
1789
+ transform: transform ? {
1790
+ input: transform.input,
1791
+ output: transform.output
1792
+ } : void 0,
1793
+ fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
1794
+ // Auto-detect number type
1795
+ defaultValue,
1796
+ enableWarnings
1797
+ });
1798
+ const handleInputRef = _material.useForkRef.call(void 0, field.ref, inputRef);
1799
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1800
+ TextFieldComponent,
1801
+ {
1802
+ ...rest,
1803
+ ...restTextProps,
1804
+ name: field.name,
1805
+ value,
1806
+ onChange: (event) => {
1807
+ onChange(event);
1808
+ if (typeof customOnChange === "function") {
1809
+ customOnChange(event);
1810
+ }
1811
+ },
1812
+ onBlur: (event) => {
1813
+ field.onBlur();
1814
+ if (typeof onBlur === "function") {
1815
+ onBlur(event);
1816
+ }
1817
+ },
1818
+ disabled,
1819
+ label,
1820
+ placeholder,
1821
+ fullWidth: true,
1822
+ required,
1823
+ type,
1824
+ error: !!error,
1825
+ helperText: error ? parseError ? parseError(error) : error.message : helperText,
1826
+ inputRef: handleInputRef,
1827
+ variant: variant ? variant : "outlined",
1828
+ size: "small",
1829
+ sx: {
1830
+ "& .MuiInputLabel-asterisk": { color: "red" },
1831
+ "& .MuiInputBase-input": {
1832
+ cursor: disabled ? "not-allowed" : "default"
1833
+ },
1834
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
1835
+ ...sx
1836
+ }
1837
+ }
1838
+ );
1839
+ };
1840
+ var EnhancedTextFieldElement2 = ({
1841
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1842
+ ...props
1843
+ }) => {
1844
+ if (gridProps) {
1845
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1846
+ _material.Grid,
1847
+ {
1848
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1849
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component9, { ...props })
1850
+ }
1851
+ );
1852
+ }
1853
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component9, { ...props });
1854
+ };
1855
+ EnhancedTextFieldElement2.displayName = "EnhancedTextFieldElement";
1856
+
1857
+ // src/wrappers/TimePickerElement/TimePickerElement.tsx
1858
+
1859
+
1860
+
1861
+
1862
+
1863
+
1864
+ function readValueAsDate(adapter, value) {
1865
+ if (typeof value === "string") {
1866
+ if (value === "") {
1867
+ return null;
1868
+ }
1869
+ return adapter.utils.date(value);
1870
+ }
1871
+ return value;
1872
+ }
1873
+ function useTransform2(options) {
1874
+ const value = typeof _optionalChain([options, 'access', _25 => _25.transform, 'optionalAccess', _26 => _26.input]) === "function" ? options.transform.input(options.value) : options.value;
1875
+ const onChange = _react.useCallback.call(void 0,
1876
+ (eventOrValue, value2) => {
1877
+ if (typeof _optionalChain([options, 'access', _27 => _27.transform, 'optionalAccess', _28 => _28.output]) === "function") {
1878
+ options.onChange(options.transform.output(eventOrValue, value2));
1879
+ } else {
1880
+ options.onChange(eventOrValue);
1881
+ }
1882
+ },
1883
+ [options]
1884
+ );
1885
+ return {
1886
+ value,
1887
+ onChange
1888
+ };
1889
+ }
1890
+ var Component10 = function TimePickerElement(props) {
1891
+ const {
1892
+ name,
1893
+ required,
1894
+ inputProps,
1895
+ control,
1896
+ textReadOnly,
1897
+ label,
1898
+ placeholder,
1899
+ slotProps,
1900
+ timePickerProps = {},
1901
+ transform,
1902
+ sx,
1903
+ ...rest
1904
+ } = props;
1905
+ const adapter = _internals.useLocalizationContext.call(void 0, );
1906
+ const theme = _material.useTheme.call(void 0, );
1907
+ const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
1908
+ const {
1909
+ field,
1910
+ fieldState: { error }
1911
+ } = _reacthookform.useController.call(void 0, {
1912
+ name,
1913
+ control,
1914
+ defaultValue: null
1915
+ });
1916
+ const { value, onChange } = useTransform2({
1917
+ value: field.value,
1918
+ onChange: field.onChange,
1919
+ transform: {
1920
+ input: typeof _optionalChain([transform, 'optionalAccess', _29 => _29.input]) === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
1921
+ output: (eventOrValue, value2) => {
1922
+ const actualValue = value2 !== void 0 ? value2 : eventOrValue;
1923
+ if (actualValue === null) return null;
1924
+ return actualValue;
1925
+ }
1926
+ }
1927
+ });
1928
+ const handleInputRef = _material.useForkRef.call(void 0, field.ref, inputRef);
1929
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1930
+ _xdatepickers.TimePicker,
1931
+ {
1932
+ ...rest,
1933
+ ...restTimePickerProps,
1934
+ ...field,
1935
+ value,
1936
+ label,
1937
+ disabled,
1938
+ ...timePickerProps,
1939
+ inputRef: handleInputRef,
1940
+ onClose: (...args) => {
1941
+ field.onBlur();
1942
+ if (onClose) {
1943
+ onClose(...args);
1944
+ }
1945
+ },
1946
+ onChange: (newValue, context) => {
1947
+ onChange(newValue, context);
1948
+ if (typeof timePickerProps.onChange === "function") {
1949
+ timePickerProps.onChange(newValue, context);
1950
+ }
1951
+ },
1952
+ sx: {
1953
+ "& .MuiOutlinedInput-root": {
1954
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent"
1955
+ },
1956
+ "& .MuiInputLabel-asterisk": { color: "red" },
1957
+ "& .MuiInputBase-input": {
1958
+ cursor: disabled ? "not-allowed" : "default"
1959
+ },
1960
+ ...sx
1961
+ },
1962
+ slotProps: {
1963
+ ...slotProps,
1964
+ actionBar: {
1965
+ actions: ["clear", "cancel", "accept"]
1966
+ },
1967
+ textField: {
1968
+ ...inputProps,
1969
+ required,
1970
+ placeholder,
1971
+ fullWidth: true,
1972
+ onBlur: (event) => {
1973
+ field.onBlur();
1974
+ if (typeof _optionalChain([inputProps, 'optionalAccess', _30 => _30.onBlur]) === "function") {
1975
+ inputProps.onBlur(event);
1976
+ }
1977
+ },
1978
+ error: !!error,
1979
+ helperText: error ? error.message : _optionalChain([inputProps, 'optionalAccess', _31 => _31.helperText]) || rest.helperText,
1980
+ inputProps: {
1981
+ readOnly: !!textReadOnly,
1982
+ ..._optionalChain([inputProps, 'optionalAccess', _32 => _32.inputProps])
1983
+ }
1984
+ }
1985
+ }
1986
+ }
1987
+ );
1988
+ };
1989
+ var TimePickerElement2 = ({
1990
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1991
+ ...props
1992
+ }) => {
1993
+ if (gridProps) {
1994
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1995
+ _material.Grid,
1996
+ {
1997
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1998
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component10, { ...props })
1999
+ }
2000
+ );
2001
+ }
2002
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component10, { ...props });
2003
+ };
2004
+ TimePickerElement2.displayName = "TimePickerElement";
2005
+ var TimePickerElement_default = TimePickerElement2;
2006
+
2007
+ // src/wrappers/AsyncSelect/index.tsx
2008
+
2009
+ var _utils = require('@mui/material/utils');
2010
+
2011
+
2012
+
2013
+
2014
+
2015
+
2016
+
2017
+
2018
+
2019
+
2020
+
2021
+ var Component11 = function AsyncSelectElement(props) {
2022
+ const {
2023
+ name,
2024
+ disabled,
2025
+ control,
2026
+ placeholder,
2027
+ initialValue,
2028
+ label,
2029
+ queryFn,
2030
+ variant,
2031
+ labelKey = "Label",
2032
+ valueKey = "Value",
2033
+ sx,
2034
+ ...rest
2035
+ } = props;
2036
+ const {
2037
+ field,
2038
+ fieldState: { error }
2039
+ } = _reacthookform.useController.call(void 0, {
2040
+ name,
2041
+ control
2042
+ });
2043
+ const theme = _material.useTheme.call(void 0, );
2044
+ const [loading, setLoading] = _react.useState.call(void 0, false);
2045
+ const [selectedOption, setSelectedOption] = _react.useState.call(void 0, null);
2046
+ const [inputValue, setInputValue] = _react.useState.call(void 0, "");
2047
+ const inputValue2 = _react.useMemo.call(void 0, () => inputValue, [inputValue]);
2048
+ const setInputValue2 = _react.useCallback.call(void 0,
2049
+ (newValue) => setInputValue(newValue),
2050
+ []
2051
+ );
2052
+ const [options, setOptions] = _react.useState.call(void 0, []);
2053
+ const initialValueLoaded = _react.useRef.call(void 0,
2054
+ !initialValue ? true : !(initialValue != null)
2055
+ );
2056
+ const fieldValue = _react.useRef.call(void 0, field.value);
2057
+ const fetchData = _react.useMemo.call(void 0,
2058
+ () => _utils.debounce.call(void 0,
2059
+ (payload, callback) => {
2060
+ queryFn(payload).then((c) => callback(c));
2061
+ },
2062
+ 400
2063
+ ),
2064
+ [queryFn]
2065
+ );
2066
+ const fillOptions = _react.useCallback.call(void 0, (results) => {
2067
+ let newOptions = [];
2068
+ if (selectedOption) {
2069
+ newOptions = [selectedOption];
2070
+ }
2071
+ if (results) {
2072
+ newOptions = [...newOptions, ...results];
2073
+ }
2074
+ setOptions(newOptions);
2075
+ setLoading(false);
2076
+ }, [selectedOption]);
2077
+ _react.useEffect.call(void 0, () => {
2078
+ if (initialValueLoaded.current) return void 0;
2079
+ let active = true;
2080
+ const payload = {
2081
+ query: null,
2082
+ initialValue
2083
+ };
2084
+ setLoading(true);
2085
+ fetchData(payload, (results) => {
2086
+ if (active) {
2087
+ if (!!results && results.length > 0) {
2088
+ fillOptions(_optionalChain([results, 'optionalAccess', _33 => _33.filter, 'call', _34 => _34((c) => c[valueKey] == initialValue)]));
2089
+ setSelectedOption(results[0]);
2090
+ field.onChange(results[0][valueKey]);
2091
+ fieldValue.current = results[0][valueKey];
2092
+ }
2093
+ initialValueLoaded.current = true;
2094
+ setLoading(false);
2095
+ }
2096
+ });
2097
+ return () => {
2098
+ active = false;
2099
+ };
2100
+ }, [initialValue, fetchData, field, fillOptions, valueKey]);
2101
+ React7.useEffect(() => {
2102
+ let active = true;
2103
+ if (inputValue2 === "" || initialValueLoaded.current === false) {
2104
+ setOptions(selectedOption ? [selectedOption] : []);
2105
+ setLoading(false);
2106
+ return void 0;
2107
+ }
2108
+ if (fieldValue.current) {
2109
+ if (field.value === fieldValue.current) {
2110
+ return void 0;
2111
+ }
2112
+ }
2113
+ setLoading(true);
2114
+ const payload = {
2115
+ query: inputValue2,
2116
+ initialValue: null
2117
+ };
2118
+ fetchData(payload, (results) => {
2119
+ if (active) {
2120
+ fillOptions(results);
2121
+ }
2122
+ });
2123
+ return () => {
2124
+ active = false;
2125
+ };
2126
+ }, [initialValue, inputValue2, fetchData, field.value, fillOptions, selectedOption]);
2127
+ const selectRef = _react.useRef.call(void 0, null);
2128
+ const handleChange = (_, newSelectedOption, reason) => {
2129
+ if (reason === "clear") {
2130
+ setSelectedOption(null);
2131
+ field.onChange(null);
2132
+ setLoading(false);
2133
+ } else if (reason === "selectOption" || reason === "removeOption") {
2134
+ if (newSelectedOption) {
2135
+ setSelectedOption(newSelectedOption);
2136
+ field.onChange(newSelectedOption[valueKey]);
2137
+ fieldValue.current = newSelectedOption[valueKey];
2138
+ setLoading(false);
2139
+ }
2140
+ }
2141
+ setOptions([]);
2142
+ setLoading(false);
2143
+ };
2144
+ _react.useEffect.call(void 0, () => {
2145
+ if (!field.value) {
2146
+ setInputValue("");
2147
+ setSelectedOption(null);
2148
+ setLoading(false);
2149
+ }
2150
+ }, [field.value]);
2151
+ const getOptionValue = (option) => {
2152
+ return option ? String(option[valueKey]) : "";
2153
+ };
2154
+ const getOptionLabel = (option) => {
2155
+ return option ? String(option[labelKey]) : "";
2156
+ };
2157
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2158
+ _material.Autocomplete,
2159
+ {
2160
+ ...rest,
2161
+ ref: selectRef,
2162
+ fullWidth: true,
2163
+ loading,
2164
+ getOptionLabel,
2165
+ getOptionKey: getOptionValue,
2166
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
2167
+ autoComplete: true,
2168
+ disabled,
2169
+ includeInputInList: true,
2170
+ options,
2171
+ filterOptions: (x) => x,
2172
+ value: selectedOption,
2173
+ filterSelectedOptions: true,
2174
+ onChange: handleChange,
2175
+ onInputChange: (_, newInputValue) => {
2176
+ setInputValue2(newInputValue);
2177
+ },
2178
+ noOptionsText: "Type Something...",
2179
+ renderInput: (params) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2180
+ _material.TextField,
2181
+ {
2182
+ ...params,
2183
+ label,
2184
+ error: !!error,
2185
+ helperText: error ? error.message : "",
2186
+ placeholder,
2187
+ slotProps: {
2188
+ input: {
2189
+ ...params.InputProps,
2190
+ endAdornment: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _react.Fragment, { children: [
2191
+ loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _material.CircularProgress, { color: "inherit", size: 20 }) : null,
2192
+ params.InputProps.endAdornment
2193
+ ] })
2194
+ }
2195
+ },
2196
+ variant: variant ? variant : "outlined",
2197
+ sx: {
2198
+ "& .MuiInputBase-input": {
2199
+ cursor: disabled ? "not-allowed" : "default"
2200
+ },
2201
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
2202
+ ...sx
2203
+ }
2204
+ }
2205
+ ),
2206
+ renderOption: (renderProps, option) => {
2207
+ const { key, ...optionProps } = renderProps;
2208
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { ...optionProps, children: option[labelKey] }, key);
2209
+ }
2210
+ }
2211
+ );
2212
+ };
2213
+ var AsyncSelectElement2 = ({
2214
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
2215
+ ...props
2216
+ }) => {
2217
+ if (gridProps) {
2218
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2219
+ _material.Grid,
2220
+ {
2221
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
2222
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component11, { ...props })
2223
+ }
2224
+ );
2225
+ }
2226
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Component11, { ...props });
2227
+ };
2228
+ AsyncSelectElement2.displayName = "AsyncSelectElement";
2229
+
2230
+ // src/wrappers/Field/index.ts
2231
+ var Field = {
2232
+ Text: TextFieldElement_default,
2233
+ Checkbox: CheckboxElement2,
2234
+ Date: DatePickerElement,
2235
+ RadioGroup: RadioButtonGroup_default,
2236
+ Password: PasswordElement_default,
2237
+ Time: TimePickerElement_default,
2238
+ Select: SelectElement_default,
2239
+ SelectMulti: SelectMultiElement_default,
2240
+ SelectCascade: SelectCascadeElement_default,
2241
+ AsyncSelect: AsyncSelectElement2,
2242
+ AsyncMultiSelect: AsyncMultiSelect2,
2243
+ CheckboxGroup: CheckboxGroup2
2244
+ };
2245
+
2246
+
2247
+
2248
+
2249
+
2250
+
2251
+
2252
+
2253
+
2254
+
2255
+
2256
+
2257
+
2258
+
2259
+
2260
+
2261
+
2262
+
2263
+
2264
+
2265
+
2266
+
2267
+
2268
+
2269
+
2270
+
2271
+
2272
+ exports.AsyncMultiSelect2 = AsyncMultiSelect2; exports.CheckboxElement = CheckboxElement2; exports.CheckboxGroup = CheckboxGroup2; exports.readDatePickerValueAsDate = readDatePickerValueAsDate; exports.useDatePickerValue = useDatePickerValue; exports.useDatePickerValidation = useDatePickerValidation; exports.useDatePickerStyles = useDatePickerStyles; exports.DatePickerElementCore = DatePickerElementCore; exports.DatePickerElement = DatePickerElement; exports.isValidDate = isValidDate; exports.isParsableDateString = isParsableDateString; exports.createDateInputTransform = createDateInputTransform; exports.createDateOutputTransform = createDateOutputTransform; exports.createDefaultDatePickerConfig = createDefaultDatePickerConfig; exports.extractErrorMessage = extractErrorMessage; exports.createStableKey = createStableKey; exports.PasswordElement_default = PasswordElement_default; exports.RadioButtonGroup_default = RadioButtonGroup_default; exports.SelectCascadeElement_default = SelectCascadeElement_default; exports.SelectElement_default = SelectElement_default; exports.SelectMultiElement_default = SelectMultiElement_default; exports.TextFieldElement_default = TextFieldElement_default; exports.EnhancedTextFieldElement = EnhancedTextFieldElement2; exports.TimePickerElement_default = TimePickerElement_default; exports.Field = Field;
2273
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9idWlsZHMvbGlicy9HTldlYlNvZnQuVUkvcGFja2FnZXMvdWkvZGlzdC9jaHVuay1BRU9GMlRVRi5janMiLCIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdDIvQXN5bmNNdWx0aVNlbGVjdDIudHN4IiwiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94RWxlbWVudC9DaGVja2JveEVsZW1lbnQudHN4IiwiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnQudHN4IiwiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50Q29yZS50c3giLCIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L2hvb2tzL3VzZURhdGVQaWNrZXJWYWxpZGF0aW9uLnRzIiwiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L2hvb2tzL3VzZURhdGVQaWNrZXJTdHlsZXMudHMiLCIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCIuLi9zcmMvd3JhcHBlcnMvUGFzc3dvcmRFbGVtZW50L1Bhc3N3b3JkRWxlbWVudC50c3giLCIuLi9zcmMvd3JhcHBlcnMvUmFkaW9CdXR0b25Hcm91cC9SYWRpb0J1dHRvbkdyb3VwLnRzeCIsIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCIuLi9zcmMvd3JhcHBlcnMvU2VsZWN0RWxlbWVudC9TZWxlY3RFbGVtZW50LnRzeCIsIi4uL3NyYy93cmFwcGVycy9TZWxlY3RNdWx0aUVsZW1lbnQvU2VsZWN0TXVsdGlFbGVtZW50LnRzeCIsIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwiLi4vc3JjL3dyYXBwZXJzL1RleHRGaWVsZEVsZW1lbnQvRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50LnRzeCIsIi4uL3NyYy93cmFwcGVycy9UaW1lUGlja2VyRWxlbWVudC9UaW1lUGlja2VyRWxlbWVudC50c3giLCIuLi9zcmMvd3JhcHBlcnMvQXN5bmNTZWxlY3QvaW5kZXgudHN4IiwiLi4vc3JjL3dyYXBwZXJzL0ZpZWxkL2luZGV4LnRzIl0sIm5hbWVzIjpbInVzZVRoZW1lIiwidXNlQ29udHJvbGxlciIsInZhbHVlIiwianN4cyIsImpzeCIsIkNoZWNrYm94RWxlbWVudCIsIkdyaWQiLCJDb21wb25lbnQiLCJ1c2VFZmZlY3QiLCJGb3JtQ29udHJvbCIsIkZvcm1Hcm91cCIsIkZvcm1Db250cm9sTGFiZWwiLCJDaGVja2JveCIsIkNoZWNrYm94R3JvdXAiLCJUZXh0RmllbGQiLCJSYWRpb0J1dHRvbkdyb3VwIiwiQXV0b2NvbXBsZXRlIiwiU2VsZWN0Q2FzY2FkZUVsZW1lbnQiLCJTZWxlY3RFbGVtZW50IiwiU2VsZWN0TXVsdGlFbGVtZW50IiwiVGV4dEZpZWxkRWxlbWVudCIsIkVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudCIsIlRpbWVQaWNrZXJFbGVtZW50IiwiQXN5bmNTZWxlY3RFbGVtZW50Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNFO0FBQ0E7QUFDRix3REFBNkI7QUFDN0I7QUFDQTtBQ0xBO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBLHlDQUNLO0FBQ1AsZ0NBQXlCO0FBQ3pCLDRFQUFtRTtBQUNuRSxnREFBOEI7QUFvTGhCLCtDQUFBO0FBL0pkLElBQU0sYUFBQSxFQUErQjtBQUFBLEVBQ25DLE9BQUEsRUFBUyxDQUFDLENBQUE7QUFBQSxFQUNWLGVBQUEsRUFBaUIsQ0FBQyxDQUFBO0FBQUEsRUFDbEIsVUFBQSxFQUFZLEVBQUE7QUFBQSxFQUNaLE9BQUEsRUFBUyxLQUFBO0FB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QTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDRyxJQUFBO0FBQ0QsRUFBQTtBQUdKLEVBQUE7QUFDRSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDRyxJQUFBO0FBQ0QsRUFBQTtBQUdKLEVBQUE7QUFDRSxJQUFBO0FBQ0EsSUFBQTtBQUNFWixFQUFBQTtBQUNGLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFBYztBQUNmLEVBQUE7QUFHRCxFQUFBO0FBQ0UsSUFBQTtBQUNBLElBQUE7QUFDRCxFQUFBO0FBR0QsRUFBQTtBQUNFLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDRCxFQUFBO0FBR0QsRUFBQTtBQUNFLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0QsRUFBQTtBQUdELEVBQUE7QUFHQSxFQUFBO0FBQ0csSUFBQTtBQUNDLE1BQUE7QUFDRixJQUFBO0FBQ0MsSUFBQTtBQUNILEVBQUE7QUFHQSxFQUFBO0FBQ0UsSUFBQTtBQUVFLE1BQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFDRixJQUFBO0FBQ0MsSUFBQTtBQUNILEVBQUE7QUFHQSxFQUFBO0FBQ0csSUFBQTtBQUNDLE1BQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFDRixJQUFBO0FBQ0MsSUFBQTtBQUNILEVBQUE7QUFHQSxFQUFBO0FBQ0ssSUFBQTtBQUNILElBQUE7QUFDRSxNQUFBO0FBQ0EsTUFBQTtBQUNGLElBQUE7QUFDQSxJQUFBO0FBQ0UsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQVksUUFBQTtBQUNBLFFBQUE7QUFDTSxRQUFBO0FBQ2lDLFFBQUE7QUFFbkQsTUFBQTtBQUFBO0FBRUEsTUFBQTtBQUFtQyxRQUFBO0FBQ3JCLFVBQUE7QUFDc0IsVUFBQTtBQUNsQixRQUFBO0FBRWxCLE1BQUE7QUFDQSxNQUFBO0FBQ0YsSUFBQTtBQUNFLEVBQUE7QUFDRixJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNELEVBQUE7QUFFRCxFQUFBO0FBQ0csSUFBQTtBQUFBLElBQUE7QUFFRSxNQUFBO0FBQ0EsTUFBQTtBQUdELE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUdBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFHQSxNQUFBO0FBR0EsTUFBQTtBQUNBLE1BQUE7QUFBK0MsSUFBQTtBQUNqRCxFQUFBO0FBRUg7QUFHRDtBTCtmTztBQUNBO0FJeG1CRDtBQXBCQTtBQVlKLEVBQUE7QUFDRSxJQUFBO0FBQ0csSUFBQTtBQUNELEVBQUE7QUFHQSxFQUFBO0FBQ0YsSUFBQTtBQUNHLE1BQUE7QUFBQSxNQUFBO0FBQUEsUUFBQTtBQUNDLFFBQUE7QUFDSSxNQUFBO0FBQ04sSUFBQTtBQUVKLEVBQUE7QUFHQSxFQUFBO0FBQ0dLLElBQUFBO0FBQUEsSUFBQTtBQUNDLE1BQUE7QUFDQyxNQUFBO0FBRUQsTUFBQTtBQUFBLFFBQUE7QUFBQyxRQUFBO0FBQUEsVUFBQTtBQUNLLFFBQUE7QUFDTixNQUFBO0FBQUEsSUFBQTtBQUNGLEVBQUE7QUFFSDtBQUdEO0FKa25CTztBQUNBO0FTcnhCQTtBQUNELEVBQUE7QUFDRixJQUFBO0FBQ0YsRUFBQTtBQUdJLEVBQUE7QUFDRixJQUFBO0FBQ0YsRUFBQTtBQUdJLEVBQUE7QUFFRixJQUFBO0FBQ0UsTUFBQTtBQUNGLElBQUE7QUFHQSxJQUFBO0FBQ0UsTUFBQTtBQUNGLElBQUE7QUFDRixFQUFBO0FBRUEsRUFBQTtBQUNGO0FBT087QUFDRCxFQUFBO0FBQ0YsSUFBQTtBQUNGLEVBQUE7QUFHQSxFQUFBO0FBRUksRUFBQTtBQUNGLElBQUE7QUFDRixFQUFBO0FBR0EsRUFBQTtBQUVBLEVBQUE7QUFDRjtBQVVPO0FBS0wsRUFBQTtBQUNFLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFDRSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFFQSxNQUFBO0FBQ0UsUUFBQTtBQUVBLFFBQUE7QUFDRixNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFDRixJQUFBO0FBRUEsSUFBQTtBQUNFLE1BQUE7QUFDRixJQUFBO0FBRUEsSUFBQTtBQUNGLEVBQUE7QUFDRjtBQVVPO0FBS0wsRUFBQTtBQUNFLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUdBLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFFRSxNQUFBO0FBQ0UsUUFBQTtBQUNFLFVBQUE7QUFBeUIsUUFBQTtBQUczQixRQUFBO0FBQ0UsVUFBQTtBQUF1QyxRQUFBO0FBRTNDLE1BQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFHQSxNQUFBO0FBQ0YsSUFBQTtBQUNFLE1BQUE7QUFDRixJQUFBO0FBQ0YsRUFBQTtBQUNGO0FBT087QUFDTCxFQUFBO0FBQU87QUFFTCxJQUFBO0FBQ0UsTUFBQTtBQUFXLFFBQUE7QUFFWCxNQUFBO0FBQ0EsTUFBQTtBQUFXLFFBQUE7QUFDRSxRQUFBO0FBRWIsTUFBQTtBQUNGLElBQUE7QUFBQTtBQUdBLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUFBO0FBR0EsSUFBQTtBQUNFLE1BQUE7QUFB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QUNGLElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFDRixFQUFBO0FBRUEsRUFBQTtBQUNGO0FBRU87QUFPTCxFQUFBO0FBS0EsRUFBQTtBQUVJLElBQUE7QUFHQSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFDRSxRQUFBO0FBQ0YsTUFBQTtBQUNGLElBQUE7QUFDQyxJQUFBO0FBQ0gsRUFBQTtBQUVBLEVBQUE7QUFDRSxJQUFBO0FBQ0EsSUFBQTtBQUNGLEVBQUE7QUFDRjtBQStDTWQ7QUFLSixFQUFBO0FBQ0UsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDRyxJQUFBO0FBQ0QsRUFBQTtBQUVKLEVBQUE7QUFFQSxFQUFBO0FBRUEsRUFBQTtBQUdBLEVBQUE7QUFDRSxJQUFBO0FBQ0EsSUFBQTtBQUNFTixFQUFBQTtBQUNGLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNELEVBQUE7QUFFRCxFQUFBO0FBQ0UsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0UsTUFBQTtBQUlBLE1BQUE7QUFFRSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDRixNQUFBO0FBQ0YsSUFBQTtBQUNELEVBQUE7QUFFRCxFQUFBO0FBRUEsRUFBQTtBQUNHLElBQUE7QUFBQSxJQUFBO0FBQ0UsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0QsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0MsTUFBQTtBQUNELE1BQUE7QUFDQSxNQUFBO0FBQ0UsUUFBQTtBQUNBLFFBQUE7QUFDRSxVQUFBO0FBQWUsUUFBQTtBQUVuQixNQUFBO0FBQ0EsTUFBQTtBQUNFLFFBQUE7QUFDQSxRQUFBO0FBQ0UsVUFBQTtBQUEwQyxRQUFBO0FBRTlDLE1BQUE7QUFDQSxNQUFBO0FBQUksUUFBQTtBQUMwQixVQUFBO0FBR3RCLFFBQUE7QUFDTixRQUFBO0FBQzRDLFFBQUE7QUFDbkIsVUFBQTtBQUNZLFFBQUE7QUFDckMsUUFBQTtBQUVGLE1BQUE7QUFDQSxNQUFBO0FBQVcsUUFBQTtBQUNOLFFBQUE7QUFDUSxVQUFBO0FBQzRCLFFBQUE7QUFDdkMsUUFBQTtBQUNXLFVBQUE7QUFDTixVQUFBO0FBQ0gsVUFBQTtBQUNBLFVBQUE7QUFDVyxVQUFBO0FBRVQsWUFBQTtBQUNBLFlBQUE7QUFDRSxjQUFBO0FBQXVCLFlBQUE7QUFDekIsVUFBQTtBQUNGLFVBQUE7QUFDUyxVQUFBO0FBRzBCLFVBQUE7QUFDdkIsWUFBQTtBQUNFLFlBQUE7QUFDRyxVQUFBO0FBQ2pCLFFBQUE7QUFFSixNQUFBO0FBQUEsSUFBQTtBQUNGLEVBQUE7QUFFSjtBQUVhcUI7QUFLWCxFQUFBO0FBQ0csRUFBQTtBQUMwRTtBQUN6RSxFQUFBO0FBQ0YsSUFBQTtBQUNHaEIsTUFBQUE7QUFBQSxNQUFBO0FBQUEsUUFBQTtBQUNzRSxRQUFBO0FBRS9DLE1BQUE7QUFDeEIsSUFBQTtBQUVKLEVBQUE7QUFFQSxFQUFBO0FBQ0Y7QUFFQWdCO0FBRU87QWpCOHNEQTtBQUNBO0FrQnQ5RFA7QUFFQTtBQUNBO0FBQ0E7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDSztBQUNQO0FBOE5nQjtBQXhOVmY7QUFPSixFQUFBO0FBQ0UsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDQSxJQUFBO0FBQ0EsSUFBQTtBQUNBLElBQUE7QUFDRyxJQUFBO0FBQ0QsRUFBQTtBQUVKLEVBQUE7QUFDRSxJQUFBO0FBQ0EsSUFBQTtBQUNFTixFQUFBQTtBQUNGLElBQUE7QUFDQSxJQUFBO0FBQ0QsRUFBQTtBQUVELEVBQUE7QUFFQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNHLElBQUE7QUFDQSxJQUFBO0FBQ0gsRUFBQTtBQUNBLEVBQUE7QUFFQSxFQUFBO0FBQ0csSUFBQTtBQUNILEVBQUE7QUFFQSxFQUFBO0FBRUEsRUFBQTtBQUNFLElBQUE7QUFHTSxNQUFBO0FBR0EsUUFBQTtBQUNGLE1BQUE7QUFDQSxNQUFBO0FBQ0YsSUFBQTtBQUNELElBQUE7QUFDSCxFQUFBO0FBRUEsRUFBQTtBQUNFLElBQUE7QUFFQSxJQUFBO0FBQ0UsTUFBQTtBQUNGLElBQUE7QUFFQSxJQUFBO0FBQ0UsTUFBQTtBQUNGLElBQUE7QUFFQSxJQUFBO0FBQ0EsSUFBQTtBQUNFLEVBQUE7QUFFSk8sRUFBQUE7QUFDRSxJQUFBO0FBRUEsSUFBQTtBQUVBLElBQUE7QUFDRSxNQUFBO0FBQ0EsTUFBQTtBQUNGLElBQUE7QUFFQSxJQUFBO0FBRUEsSUFBQTtBQUNFLE1BQUE7QUFDRSxRQUFBO0FBQ0UsVUFBQTtBQUNBLFVBQUE7QUFDQSxVQUFBO0FBQ0EsVUFBQTtBQUF3QyxRQUFBO0FBRzFDLFFBQUE7QUFDQSxRQUFBO0FBQ0YsTUFBQTtBQUNELElBQUE7QUFFRCxJQUFBO0FBQ0UsTUFBQTtBQUNGLElBQUE7QUFDRSxFQUFBO0FBRUUsRUFBQTtBQUNKLElBQUE7QUFFQSxJQUFBO0FBQ0UsTUFBQTtBQUNBLE1BQUE7QUFFQSxNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFDRSxNQUFBO0FBQ0UsUUFBQTtBQUNGLE1BQUE7QUFDRixJQUFBO0FBRUEsSUFBQTtBQUVBLElBQUE7QUFDRSxNQUFBO0FBQ0EsTUFBQTtBQUNGLElBQUE7QUFFQSxJQUFBO0FBQ0UsTUFBQTtBQUNFLFFBQUE7QUFDRixNQUFBO0FBQ0QsSUFBQTtBQUVELElBQUE7QUFDRSxNQUFBO0FBQ0YsSUFBQTtBQUNFLEVBQUE7QUFFSixFQUFBO0FBRUEsRUFBQTtBQUtFLElBQUE7QUFDRSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDRixJQUFBO0FBQ0UsTUFBQTtBQUNFLFFBQUE7QUFDQSxRQUFBO0FBQ0EsUUFBQTtBQUNBLFFBQUE7QUFDRixNQUFBO0FBQ0YsSUFBQTtBQUVBLElBQUE7QUFDQSxJQUFBO0FBQ0YsRUFBQTtBQUVBQSxFQUFBQTtBQUNFLElBQUE7QUFDRSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDRixJQUFBO0FBQ0UsRUFBQTtBQUVKLEVBQUE7QUFDRSxJQUFBO0FBQ0YsRUFBQTtBQUVBLEVBQUE7QUFDRSxJQUFBO0FBQ0YsRUFBQTtBQUVBLEVBQUE7QUFDR1EsSUFBQUE7QUFBQSxJQUFBO0FBQ0UsTUFBQTtBQUNELE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUdBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDQSxNQUFBO0FBQ0EsTUFBQTtBQUNFLFFBQUE7QUFDRixNQUFBO0FBQ0EsTUFBQTtBQUNBLE1BQUE7QUFDRSxRQUFBO0FBQUMsUUFBQTtBQUFBLFVBQUE7QUFDSyxVQUFBO0FBQ0osVUFBQTtBQUNTLFVBQUE7QUFDMkIsVUFBQTtBQUNwQyxVQUFBO0FBQ1csWUFBQTtBQUNGLGNBQUE7QUFDSyxjQUFBO0FBR0wsZ0JBQUE7QUFFRyxnQkFBQTtBQUNlLGNBQUE7QUFDckIsWUFBQTtBQUVKLFVBQUE7QUFDRixVQUFBO0FBQzZCLFVBQUE7QUFDekIsWUFBQTtBQUN1QixjQUFBO0FBQ1ksWUFBQTtBQUNyQyxZQUFBO0FBR0ksWUFBQTtBQUNELFVBQUE7QUFDTCxRQUFBO0FBQ0YsTUFBQTtBQUVGLE1BQUE7QUFDRSxRQUFBO0FBRUEsUUFBQTtBQUtGLE1BQUE7QUFBQSxJQUFBO0FBQ0YsRUFBQTtBQUVKO0FBRU1PO0FBT0osRUFBQTtBQUNHLEVBQUE7QUFPcUI7QUFDcEIsRUFBQTtBQUNGLElBQUE7QUFDR2pCLE1BQUFBO0FBQUEsTUFBQTtBQUFBLFFBQUE7QUFDc0UsUUFBQTtBQUVLLE1BQUE7QUFDNUUsSUFBQTtBQUVKLEVBQUE7QUFFQSxFQUFBO0FBQ0Y7QUFFQWlCO0FsQjI0RE87QUFDQTtBbUJ4cUVEO0FBQ0osRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0EsRUFBQTtBQUNBLEVBQUE7QUFDQSxFQUFBO0FBQ0Y7QW5CMHFFTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIvYnVpbGRzL2xpYnMvR05XZWJTb2Z0LlVJL3BhY2thZ2VzL3VpL2Rpc3QvY2h1bmstQUVPRjJUVUYuY2pzIiwic291cmNlc0NvbnRlbnQiOltudWxsLCJpbXBvcnQge1xuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbiAgdXNlVGhlbWUsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWR1Y2VyLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jTXVsdGlTZWxlY3QyUHJvcHMsIEFzeW5jU2VsZWN0MlBheWxvYWQsIE9wdGlvbjJJdGVtIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW50ZXJmYWNlIENvbXBvbmVudFN0YXRlIHtcbiAgb3B0aW9uczogT3B0aW9uMkl0ZW1bXTtcbiAgc2VsZWN0ZWRPcHRpb25zOiBPcHRpb24ySXRlbVtdO1xuICBpbnB1dFZhbHVlOiBzdHJpbmc7XG4gIGxvYWRpbmc6IGJvb2xlYW47XG4gIGluaXRpYWxMb2FkZWQ6IGJvb2xlYW47XG59XG5cbnR5cGUgQ29tcG9uZW50QWN0aW9uID1cbiAgfCB7IHR5cGU6IFwiU0VUX09QVElPTlNcIjsgcGF5bG9hZDogT3B0aW9uMkl0ZW1bXSB9XG4gIHwgeyB0eXBlOiBcIlNFVF9TRUxFQ1RFRF9PUFRJT05TXCI7IHBheWxvYWQ6IE9wdGlvbjJJdGVtW10gfVxuICB8IHsgdHlwZTogXCJTRVRfSU5QVVRfVkFMVUVcIjsgcGF5bG9hZDogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwiU0VUX0xPQURJTkdcIjsgcGF5bG9hZDogYm9vbGVhbiB9XG4gIHwgeyB0eXBlOiBcIlNFVF9JTklUSUFMX0xPQURFRFwiOyBwYXlsb2FkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6IFwiUkVTRVRfT1BUSU9OU1wiIH07XG5cbmNvbnN0IGluaXRpYWxTdGF0ZTogQ29tcG9uZW50U3RhdGUgPSB7XG4gIG9wdGlvbnM6IFtdLFxuICBzZWxlY3RlZE9wdGlvbnM6IFtdLFxuICBpbnB1dFZhbHVlOiBcIlwiLFxuICBsb2FkaW5nOiBmYWxzZSxcbiAgaW5pdGlhbExvYWRlZDogZmFsc2UsXG59O1xuXG5mdW5jdGlvbiBjb21wb25lbnRSZWR1Y2VyKHN0YXRlOiBDb21wb25lbnRTdGF0ZSwgYWN0aW9uOiBDb21wb25lbnRBY3Rpb24pOiBDb21wb25lbnRTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFwiU0VUX09QVElPTlNcIjpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBvcHRpb25zOiBhY3Rpb24ucGF5bG9hZCwgbG9hZGluZzogZmFsc2UgfTtcbiAgICBjYXNlIFwiU0VUX1NFTEVDVEVEX09QVElPTlNcIjpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBzZWxlY3RlZE9wdGlvbnM6IGFjdGlvbi5wYXlsb2FkIH07XG4gICAgY2FzZSBcIlNFVF9JTlBVVF9WQUxVRVwiOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGlucHV0VmFsdWU6IGFjdGlvbi5wYXlsb2FkIH07XG4gICAgY2FzZSBcIlNFVF9MT0FESU5HXCI6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgbG9hZGluZzogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlIFwiU0VUX0lOSVRJQUxfTE9BREVEXCI6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgaW5pdGlhbExvYWRlZDogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlIFwiUkVTRVRfT1BUSU9OU1wiOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIG9wdGlvbnM6IHN0YXRlLnNlbGVjdGVkT3B0aW9ucyB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuY29uc3QgQXN5bmNNdWx0aVNlbGVjdDJDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPlxuPih7XG4gIG5hbWUsXG4gIGNvbnRyb2wsXG4gIHBsYWNlaG9sZGVyLFxuICBpbml0aWFsVmFsdWVzLFxuICBsYWJlbCxcbiAgcXVlcnlGbixcbiAgdmFyaWFudCA9IFwib3V0bGluZWRcIixcbiAgc3gsXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGRlYm91bmNlTXMgPSA0MDAsXG4gIGxvYWRpbmdUZXh0ID0gXCJMb2FkaW5nLi4uXCIsXG4gIG5vT3B0aW9uc1RleHQgPSBcIk5vIG9wdGlvbnNcIixcbiAgcmVuZGVySW5wdXQsXG4gIC4uLnJlc3Rcbn06IEFzeW5jTXVsdGlTZWxlY3QyUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgY29uc3QgW3N0YXRlLCBkaXNwYXRjaF0gPSB1c2VSZWR1Y2VyKGNvbXBvbmVudFJlZHVjZXIsIGluaXRpYWxTdGF0ZSk7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBkZWJvdW5jZWRGZXRjaCA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGRlYm91bmNlKGFzeW5jIChwYXlsb2FkOiBBc3luY1NlbGVjdDJQYXlsb2FkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5Rm4ocGF5bG9hZCk7XG5cbiAgICAgICAgICAvLyBNZXJnZSBzZWxlY3RlZCBvcHRpb25zIHdpdGggc2VhcmNoIHJlc3VsdHMsIGF2b2lkaW5nIGR1cGxpY2F0ZXNcbiAgICAgICAgICBjb25zdCBtZXJnZWRPcHRpb25zID0gW1xuICAgICAgICAgICAgLi4uc3RhdGUuc2VsZWN0ZWRPcHRpb25zLFxuICAgICAgICAgICAgLi4ucmVzdWx0cy5maWx0ZXIoXG4gICAgICAgICAgICAgIChvcHRpb24pID0+ICFzdGF0ZS5zZWxlY3RlZE9wdGlvbnMuc29tZSgoc2VsZWN0ZWQpID0+IHNlbGVjdGVkLnZhbHVlID09PSBvcHRpb24udmFsdWUpXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX09QVElPTlNcIiwgcGF5bG9hZDogbWVyZ2VkT3B0aW9ucyB9KTtcbiAgICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9MT0FESU5HXCIsIHBheWxvYWQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBkZWJvdW5jZU1zKSxcbiAgICBbcXVlcnlGbiwgc3RhdGUuc2VsZWN0ZWRPcHRpb25zLCBkZWJvdW5jZU1zXVxuICApO1xuXG4gIC8vIExvYWQgaW5pdGlhbCB2YWx1ZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWluaXRpYWxWYWx1ZXM/Lmxlbmd0aCB8fCBzdGF0ZS5pbml0aWFsTG9hZGVkKSByZXR1cm47XG5cbiAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0xPQURJTkdcIiwgcGF5bG9hZDogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0MlBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogbnVsbCxcbiAgICAgIGluaXRpYWxWYWx1ZXMsXG4gICAgfTtcblxuICAgIHF1ZXJ5Rm4ocGF5bG9hZCkudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9TRUxFQ1RFRF9PUFRJT05TXCIsIHBheWxvYWQ6IHJlc3VsdHMgfSk7XG4gICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfT1BUSU9OU1wiLCBwYXlsb2FkOiByZXN1bHRzIH0pO1xuICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0lOSVRJQUxfTE9BREVEXCIsIHBheWxvYWQ6IHRydWUgfSk7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKHJlc3VsdHMubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSkpO1xuICAgICAgfVxuXG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0xPQURJTkdcIiwgcGF5bG9hZDogZmFsc2UgfSk7XG4gICAgfSkuY2F0Y2goKF9lcnJvcikgPT4ge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9MT0FESU5HXCIsIHBheWxvYWQ6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9LCBbaW5pdGlhbFZhbHVlcywgc3RhdGUuaW5pdGlhbExvYWRlZCwgcXVlcnlGbiwgZmllbGRdKTtcblxuICAvLyBIYW5kbGUgc2VhcmNoIGlucHV0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXN0YXRlLmluaXRpYWxMb2FkZWQpIHJldHVybjtcblxuICAgIGlmIChzdGF0ZS5pbnB1dFZhbHVlID09PSBcIlwiKSB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiUkVTRVRfT1BUSU9OU1wiIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9MT0FESU5HXCIsIHBheWxvYWQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCBwYXlsb2FkOiBBc3luY1NlbGVjdDJQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IHN0YXRlLmlucHV0VmFsdWUsXG4gICAgICBpbml0aWFsVmFsdWVzOiBudWxsLFxuICAgIH07XG5cbiAgICBkZWJvdW5jZWRGZXRjaChwYXlsb2FkKTtcbiAgfSwgW3N0YXRlLmlucHV0VmFsdWUsIHN0YXRlLmluaXRpYWxMb2FkZWQsIGRlYm91bmNlZEZldGNoXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCwgbmV3VmFsdWU6IE9wdGlvbjJJdGVtW10pID0+IHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfU0VMRUNURURfT1BUSU9OU1wiLCBwYXlsb2FkOiBuZXdWYWx1ZSB9KTtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlLm1hcCgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUpKTtcbiAgICB9LFxuICAgIFtmaWVsZF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuU3ludGhldGljRXZlbnQsIG5ld0lucHV0VmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9JTlBVVF9WQUxVRVwiLCBwYXlsb2FkOiBuZXdJbnB1dFZhbHVlIH0pO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBpc09wdGlvbkVxdWFsVG9WYWx1ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IE9wdGlvbjJJdGVtLCB2YWx1ZTogT3B0aW9uMkl0ZW0pID0+IG9wdGlvbi52YWx1ZSA9PT0gdmFsdWUudmFsdWUsXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKChvcHRpb246IE9wdGlvbjJJdGVtKSA9PiBvcHRpb24ubGFiZWwsIFtdKTtcblxuICBjb25zdCBkZWZhdWx0UmVuZGVySW5wdXQgPSB1c2VDYWxsYmFjayhcbiAgICAocGFyYW1zOiBQYXJhbWV0ZXJzPFJlcXVpcmVkPEFzeW5jTXVsdGlTZWxlY3QyUHJvcHM+W1wicmVuZGVySW5wdXRcIl0+WzBdKSA9PiAoXG4gICAgICA8VGV4dEZpZWxkXG4gICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICB2YXJpYW50PXt2YXJpYW50fVxuICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgaGVscGVyVGV4dD17ZXJyb3I/Lm1lc3NhZ2V9XG4gICAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIHtzdGF0ZS5sb2FkaW5nICYmIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPn1cbiAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfX1cbiAgICAgICAgc3g9e3tcbiAgICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiZ2NvbG9yOiBkaXNhYmxlZFxuICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgIC4uLnN4LFxuICAgICAgICB9fVxuICAgICAgLz5cbiAgICApLFxuICAgIFtsYWJlbCwgcGxhY2Vob2xkZXIsIHZhcmlhbnQsIGVycm9yLCBzdGF0ZS5sb2FkaW5nLCBkaXNhYmxlZCwgdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLCBzeF1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIG11bHRpcGxlXG4gICAgICBvcHRpb25zPXtzdGF0ZS5vcHRpb25zfVxuICAgICAgdmFsdWU9e3N0YXRlLnNlbGVjdGVkT3B0aW9uc31cbiAgICAgIGxvYWRpbmc9e3N0YXRlLmxvYWRpbmd9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17aXNPcHRpb25FcXVhbFRvVmFsdWV9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbklucHV0Q2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgIGxvYWRpbmdUZXh0PXtsb2FkaW5nVGV4dH1cbiAgICAgIG5vT3B0aW9uc1RleHQ9e25vT3B0aW9uc1RleHR9XG4gICAgICByZW5kZXJJbnB1dD17cmVuZGVySW5wdXQgfHwgZGVmYXVsdFJlbmRlcklucHV0fVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jTXVsdGlTZWxlY3QyID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz5cbj4oe1xuICBncmlkUHJvcHMsXG4gIC4uLnByb3BzXG59OiBBc3luY011bHRpU2VsZWN0MlByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX0+XG4gICAgICAgIDxBc3luY011bHRpU2VsZWN0MkNvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8QXN5bmNNdWx0aVNlbGVjdDJDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cbkFzeW5jTXVsdGlTZWxlY3QyLmRpc3BsYXlOYW1lID0gXCJBc3luY011bHRpU2VsZWN0MlwiO1xuXG5leHBvcnQgeyBBc3luY011bHRpU2VsZWN0MiB9O1xuIiwiaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxuICB1c2VUaGVtZSxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZVxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihcbiAgcHJvcHM6IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBsYWJlbFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgcGFyc2VFcnJvcixcbiAgICB0cmFuc2Zvcm0sXG4gICAgZGlzYWJsZWQsXG4gICAgc3gsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRpc2FibGVkLFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIGJvb2xlYW4+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogKHZhbHVlKSA9PiAhIXZhbHVlLFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gKGV2ZW50T3JWYWx1ZSwgX3ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEFkYXB0ZXI6IEV4dHJhY3QgZXZlbnQgYW5kIGNoZWNrZWQgZnJvbSB0aGUgY2hlY2tib3ggb25DaGFuZ2Ugc2lnbmF0dXJlXG4gICAgICAgICAgICAgIC8vIENoZWNrYm94RWxlbWVudCBwYXNzZXMgKGV2ZW50LCBjaGVja2VkKSwgYnV0IHVzZVRyYW5zZm9ybSBleHBlY3RzIChldmVudE9yVmFsdWUsIHZhbHVlKVxuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGV2ZW50T3JWYWx1ZSBhcyBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PjtcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG4gICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm0ub3V0cHV0IShldmVudCwgY2hlY2tlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiAoZXZlbnRPclZhbHVlLCBfdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZXh0cmFjdCBjaGVja2VkIHN0YXRlIGZyb20gdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG4gICAgICAgICAgICAgIHJldHVybiBjaGVja2VkIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PiwgY2hlY2tlZDogYm9vbGVhbikgPT4ge1xuICAgIG9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGlzcGxheUVycm9yOiBSZWFjdE5vZGUgPSBlcnJvclxuICAgID8gdHlwZW9mIHBhcnNlRXJyb3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBwYXJzZUVycm9yKGVycm9yKVxuICAgICAgOiBlcnJvci5tZXNzYWdlXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfSBkaXNhYmxlZD17ZGlzYWJsZWR9PlxuICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgbGFiZWw9e2xhYmVsIHx8IFwiXCJ9XG4gICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCBcInByaW1hcnlcIn1cbiAgICAgICAgICAgICAgc3g9e1tcbiAgICAgICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShzeCkgPyBzeCA6IFtzeF0pLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvclxuICAgICAgICAgICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpblxuICAgICAgICAgICAgICAgICAgICA6IGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgXCImLk11aS1kaXNhYmxlZFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXX1cbiAgICAgICAgICAgICAgY2hlY2tlZD17dmFsdWV9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgeyhkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dCkgJiYgKFxuICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dH1cbiAgICAgICAgPC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBDaGVja2JveCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgZ3JpZCBsYXlvdXQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIGNoZWNrYm94IGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIHZhbHVlIHRyYW5zZm9ybWF0aW9uLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uIHdpdGggdXNlQ29udHJvbGxlclxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nIHN1cHBvcnRcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gd2l0aCB1c2VUcmFuc2Zvcm0gaG9vayBmb3IgYm9vbGVhbiB2YWx1ZXNcbiAqIC0gQ3VzdG9taXphYmxlIGxhYmVsIGFuZCBwb3NpdGlvbmluZ1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyIHdpdGggcmVzcG9uc2l2ZSBkZXNpZ25cbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eSB3aXRoIGdlbmVyaWMgY29uc3RyYWludHNcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydCB3aXRoIHByb3BlciB0aGVtaW5nXG4gKiAtIEhlbHBlciB0ZXh0IHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgY29udGV4dFxuICogLSBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb25cbiAqIC0gU2ltcGxlIGJvb2xlYW4gdmFsdWUgaGFuZGxpbmcgd2l0aCBvcHRpb25hbCBjdXN0b20gdHJhbnNmb3Jtc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWNjZXB0VGVybXNcIlxuICogICBsYWJlbD1cIkkgYWdyZWUgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCB2YWxpZGF0aW9uIGFuZCBoZWxwZXIgdGV4dDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwibmV3c2xldHRlclwiXG4gKiAgIGxhYmVsPVwiU3Vic2NyaWJlIHRvIG5ld3NsZXR0ZXJcIlxuICogICBoZWxwZXJUZXh0PVwiWW91IGNhbiB1bnN1YnNjcmliZSBhdCBhbnkgdGltZVwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIGFjY2VwdCB0byBjb250aW51ZScgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0IGFuZCBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJpc1B1YmxpY1wiXG4gKiAgIGxhYmVsPVwiTWFrZSB0aGlzIHB1YmxpY1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBsYWJlbFByb3BzPXt7IHN4OiB7IGZvbnRXZWlnaHQ6ICdib2xkJyB9IH19XG4gKiAgIHN4PXt7IGNvbG9yOiAncHJpbWFyeS5tYWluJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHZhbHVlIHRyYW5zZm9ybWF0aW9uIChzdHJpbmcgdG8gYm9vbGVhbik6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInN0YXR1c1wiXG4gKiAgIGxhYmVsPVwiQWN0aXZlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPT09ICdhY3RpdmUnLFxuICogICAgIG91dHB1dDogKGNoZWNrZWQpID0+IGNoZWNrZWQgPyAnYWN0aXZlJyA6ICdpbmFjdGl2ZSdcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogU2ltcGxlIGJvb2xlYW4gZmllbGQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImlzRW5hYmxlZFwiXG4gKiAgIGxhYmVsPVwiRW5hYmxlIGZlYXR1cmVcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb246XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRlcm1zXCJcbiAqICAgbGFiZWw9XCJBY2NlcHQgVGVybXNcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHQoYHZhbGlkYXRpb24uJHtlcnJvci50eXBlfWAsIHsgZmllbGQ6ICdUZXJtcycgfSl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBDaGVja2JveEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWU+IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZT4gey4uLnByb3BzfSAvPjtcbn07XG5cbkNoZWNrYm94RWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiQ2hlY2tib3hFbGVtZW50XCI7XG5cbmV4cG9ydCB7IENoZWNrYm94RWxlbWVudCB9O1xuXG5leHBvcnQgdHlwZSB7IENoZWNrYm94RWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbiIsImltcG9ydCB0eXBlIHtcbiAgQ2hlY2tib3hQcm9wcyxcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBHcmlkUHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIENoZWNrYm94LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgR3JpZCxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXNcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlcixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5leHBvcnQgdHlwZSBDaGVja2JveEdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgbnVtYmVyW10gPSBudW1iZXJbXVxuPiA9IE9taXQ8Q2hlY2tib3hQcm9wcywgXCJuYW1lXCI+ICYge1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgbGFiZWw/OiBGb3JtQ29udHJvbExhYmVsUHJvcHNbXCJsYWJlbFwiXTtcbiAgbGFiZWxQcm9wcz86IE9taXQ8Rm9ybUNvbnRyb2xMYWJlbFByb3BzLCBcImxhYmVsXCIgfCBcImNvbnRyb2xcIj47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgb3B0aW9uczogQXJyYXk8eyBWYWx1ZTogbnVtYmVyOyBMYWJlbDogc3RyaW5nIH0+O1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ2hlY2tib3hHcm91cDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBudW1iZXJbXSA9IG51bWJlcltdXG4+KHByb3BzOiBDaGVja2JveEdyb3VwUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7IG5hbWUsIGNvbnRyb2wsIGxhYmVsLCBsYWJlbFByb3BzLCBpbnB1dFJlZiwgb3B0aW9ucywgLi4ucmVzdCB9ID1cbiAgICBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRpc2FibGVkOiByZXN0LmRpc2FibGVkLFxuICB9KTtcblxuICBjb25zdCBbc2VsZWN0ZWRWYWx1ZXMsIHNldFNlbGVjdGVkVmFsdWVzXSA9IHVzZVN0YXRlPG51bWJlcltdPihcbiAgICBvcHRpb25zLmZpbHRlcigoYykgPT4gZmllbGQudmFsdWU/LmluY2x1ZGVzKGMuVmFsdWUpKS5tYXAoKGMpID0+IGMuVmFsdWUpIHx8XG4gICAgW11cbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGZpZWxkLm9uQ2hhbmdlKHNlbGVjdGVkVmFsdWVzID8gWy4uLnNlbGVjdGVkVmFsdWVzXSA6IFtdKTtcbiAgfSwgW3NlbGVjdGVkVmFsdWVzXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlLCAxMCk7XG5cbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgIHNldFNlbGVjdGVkVmFsdWVzKFsuLi5zZWxlY3RlZFZhbHVlcywgdmFsdWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U2VsZWN0ZWRWYWx1ZXMoc2VsZWN0ZWRWYWx1ZXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB2YWx1ZSkpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICA8Rm9ybUdyb3VwIHJvdz5cbiAgICAgICAge29wdGlvbnMubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAga2V5PXtgJHtvcHRpb24uVmFsdWV9YH1cbiAgICAgICAgICAgIGxhYmVsPXtvcHRpb24uTGFiZWx9XG4gICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCBcInByaW1hcnlcIn1cbiAgICAgICAgICAgICAgICBzeD17W1xuICAgICAgICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkocmVzdC5zeCkgPyByZXN0LnN4IDogW3Jlc3Quc3hdKSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6IGVycm9yID8gXCJlcnJvci5tYWluXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF19XG4gICAgICAgICAgICAgICAgdmFsdWU9e29wdGlvbi5WYWx1ZX1cbiAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZFZhbHVlcy5pbmNsdWRlcyhvcHRpb24uVmFsdWUpfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIHtlcnJvciAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dCBlcnJvcj17ISFlcnJvcn0+e2Vycm9yLm1lc3NhZ2V9PC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbmNvbnN0IENoZWNrYm94R3JvdXAgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgbnVtYmVyW10gPSBudW1iZXJbXVxuPih7XG4gIGdyaWRQcm9wcyxcbiAgLi4ucHJvcHNcbn06IENoZWNrYm94R3JvdXBQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuQ2hlY2tib3hHcm91cC5kaXNwbGF5TmFtZSA9IFwiQ2hlY2tib3hHcm91cFwiO1xuXG5leHBvcnQgeyBDaGVja2JveEdyb3VwIH07XG5cbiIsImltcG9ydCB7IEdyaWQgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9IGZyb20gXCIuL0RhdGVQaWNrZXJFbGVtZW50Q29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyRWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBBIGZ1bGx5LWZlYXR1cmVkLCB0eXBlLXNhZmUgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IGZvciByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgY29tYmluZXMgdGhlIGNvcmUgZGF0ZSBwaWNrZXIgZnVuY3Rpb25hbGl0eSB3aXRoIG9wdGlvbmFsIEdyaWQgbGF5b3V0IHdyYXBwaW5nLFxuICogcHJvdmlkaW5nIGEgY29tcGxldGUgc29sdXRpb24gZm9yIGZvcm0tYmFzZWQgZGF0ZSBzZWxlY3Rpb24gd2l0aCBjb21wcmVoZW5zaXZlIFR5cGVTY3JpcHQgc3VwcG9ydC5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIPCfjq8gKipUeXBlIFNhZmV0eSoqOiBGdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBmb3JtIGZpZWxkIHR5cGVzIGFuZCBkYXRlIHZhbHVlc1xuICogLSDwn5SnICoqUmVhY3QgSG9vayBGb3JtIEludGVncmF0aW9uKio6IFNlYW1sZXNzIGludGVncmF0aW9uIHdpdGggcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb25cbiAqIC0g8J+OqCAqKlRoZW1pbmcqKjogQXV0b21hdGljIGFkYXB0YXRpb24gdG8gTVVJIHRoZW1lIHdpdGggY3VzdG9taXphYmxlIHN0eWxlc1xuICogLSDimb8gKipBY2Nlc3NpYmlsaXR5Kio6IFdDQUctY29tcGxpYW50IHdpdGggcHJvcGVyIEFSSUEgYXR0cmlidXRlcyBhbmQga2V5Ym9hcmQgbmF2aWdhdGlvblxuICogLSDwn5qAICoqUGVyZm9ybWFuY2UqKjogT3B0aW1pemVkIHdpdGggbWVtb2l6YXRpb24gYW5kIGVmZmljaWVudCByZS1yZW5kZXJpbmdcbiAqIC0g8J+TsSAqKlJlc3BvbnNpdmUqKjogQnVpbHQtaW4gR3JpZCBsYXlvdXQgd2l0aCBjb25maWd1cmFibGUgYnJlYWtwb2ludHNcbiAqIC0g8J+boe+4jyAqKlZhbGlkYXRpb24qKjogQ29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKiAtIPCflIQgKipUcmFuc2Zvcm1hdGlvbioqOiBGbGV4aWJsZSB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGZvcm0gYW5kIHBpY2tlciBmb3JtYXRzXG4gKiAtIPCfk5ogKipEZXZlbG9wZXIgRXhwZXJpZW5jZSoqOiBSaWNoIFR5cGVTY3JpcHQgSW50ZWxsaVNlbnNlIGFuZCBjb21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBhdXRvbWF0aWMgR3JpZCB3cmFwcGVyOlxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VGb3JtIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbiAqIGltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSAnQGdud2Vic29mdC91aS93cmFwcGVycyc7XG4gKlxuICogZnVuY3Rpb24gTXlGb3JtKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08eyBiaXJ0aERhdGU6IHN0cmluZyB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgICAgICByZXF1aXJlZFxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gdHJhbnNmb3JtYXRpb24gYW5kIHZhbGlkYXRpb246XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFkdmFuY2VkRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgc3RhcnREYXRlOiBEYXRlIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cInN0YXJ0RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJQcm9qZWN0IFN0YXJ0IERhdGVcIlxuICogICAgICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgICAgIH19XG4gKiAgICAgICB2YWxpZGF0aW9uPXt7XG4gKiAgICAgICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgICAgIG1heERhdGU6IGFkZFllYXJzKG5ldyBEYXRlKCksIDIpLFxuICogICAgICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcicsXG4gKiAgICAgICAgICAgbWF4RGF0ZTogJ1N0YXJ0IGRhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAyIHllYXJzIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgICAgIHN4PXt7XG4gKiAgICAgICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRob3V0IEdyaWQgd3JhcHBlciBmb3IgY3VzdG9tIGxheW91dHM6XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEN1c3RvbUxheW91dCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgZXZlbnREYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiIGdhcD17Mn0+XG4gKiAgICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgICAgbmFtZT1cImV2ZW50RGF0ZVwiXG4gKiAgICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICAgIGxhYmVsPVwiRXZlbnQgRGF0ZVwiXG4gKiAgICAgICAgIGdyaWRQcm9wcz17ZmFsc2V9IC8vIERpc2FibGVzIEdyaWQgd3JhcHBlclxuICogICAgICAgLz5cbiAqICAgICAgIDxCdXR0b24gdHlwZT1cInN1Ym1pdFwiPlN1Ym1pdDwvQnV0dG9uPlxuICogICAgIDwvQm94PlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggbG9hZGluZyBzdGF0ZSBhbmQgY3VzdG9tIGVycm9yIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBMb2FkaW5nRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtKCk7XG4gKiAgIGNvbnN0IFtpc1ZhbGlkYXRpbmcsIHNldElzVmFsaWRhdGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cImFwcG9pbnRtZW50RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJBcHBvaW50bWVudCBEYXRlXCJcbiAqICAgICAgIGxvYWRpbmc9e2lzVmFsaWRhdGluZ31cbiAqICAgICAgIExvYWRpbmdDb21wb25lbnQ9eygpID0+IDxDaXJjdWxhclByb2dyZXNzIHNpemU9ezIwfSAvPn1cbiAqICAgICAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4ge1xuICogICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvcj8udHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAqICAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIGFwcG9pbnRtZW50JztcbiAqICAgICAgICAgfVxuICogICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIGRhdGUnO1xuICogICAgICAgfX1cbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlIChpbmZlcnJlZCBmcm9tIGNvbnRyb2wpXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlIChpbmZlcnJlZCBmcm9tIG5hbWUgcHJvcClcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZSAoaW5mZXJyZWQgZnJvbSB0cmFuc2Zvcm0gZnVuY3Rpb25zKVxuICogQHRlbXBsYXRlIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgLSBXaGV0aGVyIGFjY2Vzc2libGUgZmllbGQgRE9NIHN0cnVjdHVyZSBpcyBlbmFibGVkXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIHdpdGggZnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZVxuICogQHBhcmFtIHJlZiAtIEZvcndhcmQgcmVmIGZvciB0aGUgcm9vdCBlbGVtZW50IChHcmlkIG9yIERhdGVQaWNrZXIgY29udGFpbmVyKVxuICogQHJldHVybnMgUmVuZGVyZWQgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKi9cbmNvbnN0IERhdGVQaWNrZXJFbGVtZW50ID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50UHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPig8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgcHJvcHM6IERhdGVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlLCBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgcmVmOiBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+XG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gICAgLi4uY29yZVByb3BzXG4gIH0gPSBwcm9wcztcblxuICAvLyBJZiBncmlkUHJvcHMgaXMgZXhwbGljaXRseSBmYWxzZSwgcmVuZGVyIHdpdGhvdXQgR3JpZCB3cmFwcGVyXG4gIGlmIChncmlkUHJvcHMgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICAvLyBSZW5kZXIgd2l0aCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0XG4gIHJldHVybiAoXG4gICAgPEdyaWRcbiAgICAgIHJlZj17cmVmfVxuICAgICAgey4uLmdyaWRQcm9wc31cbiAgICA+XG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn0pO1xuXG4vLyBTZXQgZGlzcGxheSBuYW1lIGZvciBSZWFjdCBEZXZlbG9wZXIgVG9vbHNcbkRhdGVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJEYXRlUGlja2VyRWxlbWVudFwiO1xuXG5leHBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudDtcbiIsImltcG9ydCB7IHVzZUZvcmtSZWYgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgRGF0ZVBpY2tlciB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0LFxuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGggfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7XG4gIHVzZURhdGVQaWNrZXJWYWx1ZSxcbiAgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24sXG4gIHVzZURhdGVQaWNrZXJTdHlsZXMsXG59IGZyb20gXCIuL2hvb2tzXCI7XG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBUaGUgY29yZSBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgd2l0aG91dCBHcmlkIHdyYXBwZXIuXG4gKlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0LCBwZXJmb3JtYW50IGRhdGUgcGlja2VyIGNvbXBvbmVudCB0aGF0IGludGVncmF0ZXMgc2VhbWxlc3NseVxuICogd2l0aCByZWFjdC1ob29rLWZvcm0gd2hpbGUgcHJvdmlkaW5nIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBzdXBwb3J0IGFuZFxuICogYWNjZXNzaWJpbGl0eSBmZWF0dXJlcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSBmb3IgZm9ybSBmaWVsZCB0eXBlc1xuICogLSBBdXRvbWF0aWMgdmFsdWUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiBmb3JtIGFuZCBwaWNrZXIgZm9ybWF0c1xuICogLSBDb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZXNcbiAqIC0gVGhlbWUtYXdhcmUgc3R5bGluZyB3aXRoIGFjY2Vzc2liaWxpdHkgc3VwcG9ydFxuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6ZWQgd2l0aCBwcm9wZXIgbWVtb2l6YXRpb25cbiAqIC0gRm9yd2FyZCByZWYgc3VwcG9ydCBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gKiAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICByZXF1aXJlZFxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICogICBuYW1lPVwic3RhcnREYXRlXCJcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbGFiZWw9XCJTdGFydCBEYXRlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gbmV3IERhdGUoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgIH19XG4gKiAgIHZhbGlkYXRpb249e3tcbiAqICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdTdGFydCBkYXRlIG11c3QgYmUgdG9kYXkgb3IgbGF0ZXInXG4gKiAgICAgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKiBAdGVtcGxhdGUgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSAtIFdoZXRoZXIgYWNjZXNzaWJsZSBmaWVsZCBET00gc3RydWN0dXJlIGlzIGVuYWJsZWRcbiAqL1xuY29uc3QgRGF0ZVBpY2tlckVsZW1lbnRDb3JlID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzPGFueSwgYW55LCBhbnksIGFueT5cbj4oPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIHByb3BzOiBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWUsIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICByZWY6IFJlYWN0LlJlZjxIVE1MRGl2RWxlbWVudD5cbikgPT4ge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICByZXF1aXJlZCA9IGZhbHNlLFxuICAgIHJ1bGVzLFxuICAgIGNvbnRyb2wsXG4gICAgcGFyc2VFcnJvcixcbiAgICB0cmFuc2Zvcm0sXG4gICAgdmFsaWRhdGlvbixcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0UmVhZE9ubHkgPSBmYWxzZSxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UHJvcHMgPSB7fSxcbiAgICBzbG90UHJvcHMgPSB7fSxcbiAgICBkYXRlUGlja2VyUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50ID0gXCJvdXRsaW5lZFwiLFxuICAgIHN4OiBjdXN0b21TeCxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgTG9hZGluZ0NvbXBvbmVudCxcbiAgICAuLi5yZXN0UHJvcHNcbiAgfSA9IHByb3BzO1xuXG4gIC8vIEV4dHJhY3QgRGF0ZVBpY2tlci1zcGVjaWZpYyBwcm9wc1xuICBjb25zdCB7XG4gICAgZGlzYWJsZWQsXG4gICAgaW5wdXRSZWY6IGV4dGVybmFsSW5wdXRSZWYsXG4gICAgb25DbG9zZSxcbiAgICAuLi5yZXN0RGF0ZVBpY2tlclByb3BzXG4gIH0gPSBkYXRlUGlja2VyUHJvcHM7XG5cbiAgLy8gU2V0IHVwIGZvcm0gY29udHJvbGxlclxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBydWxlcyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGwgYXMgYW55LCAvLyBMZXQgcmVhY3QtaG9vay1mb3JtIGhhbmRsZSB0aGUgZGVmYXVsdCB2YWx1ZSB0eXBpbmdcbiAgfSk7XG5cbiAgLy8gVmFsdWUgdHJhbnNmb3JtYXRpb24gaG9va1xuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZTogb25WYWx1ZUNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAgICBmaWVsZCxcbiAgICB0cmFuc2Zvcm0sXG4gIH0pO1xuXG4gIC8vIFZhbGlkYXRpb24gaG9va1xuICBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGludmFsaWQgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAgICBmaWVsZFN0YXRlLFxuICAgIHZhbGlkYXRpb24sXG4gICAgcGFyc2VFcnJvcixcbiAgICB2YWx1ZSxcbiAgfSk7XG5cbiAgLy8gU3R5bGluZyBob29rXG4gIGNvbnN0IHsgc3g6IGNvbXB1dGVkU3gsIGNsYXNzTmFtZSB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gICAgZGlzYWJsZWQsXG4gICAgaGFzRXJyb3IsXG4gICAgbG9hZGluZyxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgc3g6IGN1c3RvbVN4LFxuICB9KTtcblxuICAvLyBNZXJnZSBpbnB1dCByZWZzXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGV4dGVybmFsSW5wdXRSZWYpO1xuXG4gIC8vIE1lbW9pemVkIGNoYW5nZSBoYW5kbGVyIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3VmFsdWU6IFRWYWx1ZSB8IG51bGwsIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+KSA9PiB7XG4gICAgICBvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICB9LFxuICAgIFtvblZhbHVlQ2hhbmdlXVxuICApO1xuXG4gIC8vIE1lbW9pemVkIGNsb3NlIGhhbmRsZXJcbiAgY29uc3QgaGFuZGxlQ2xvc2UgPSB1c2VDYWxsYmFjayhcbiAgICAoLi4uYXJnczogUGFyYW1ldGVyczxOb25OdWxsYWJsZTx0eXBlb2Ygb25DbG9zZT4+KSA9PiB7XG4gICAgICAvLyBUcmlnZ2VyIGZvcm0gZmllbGQgYmx1ciBmb3IgdmFsaWRhdGlvblxuICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgIC8vIENhbGwgZXh0ZXJuYWwgb25DbG9zZSBpZiBwcm92aWRlZFxuICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgb25DbG9zZSguLi5hcmdzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWVsZC5vbkJsdXIsIG9uQ2xvc2VdXG4gICk7XG5cbiAgLy8gTWVtb2l6ZWQgYmx1ciBoYW5kbGVyIGZvciB0ZXh0IGZpZWxkXG4gIGNvbnN0IGhhbmRsZVRleHRGaWVsZEJsdXIgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGZpZWxkLm9uQmx1cigpO1xuXG4gICAgICAvLyBDYWxsIGV4dGVybmFsIG9uQmx1ciBpZiBwcm92aWRlZFxuICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzLm9uQmx1ciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGlucHV0UHJvcHMub25CbHVyKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWVsZC5vbkJsdXIsIGlucHV0UHJvcHMub25CbHVyXVxuICApO1xuXG4gIC8vIE1lbW9pemVkIHNsb3QgcHJvcHMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gIGNvbnN0IG1lbW9pemVkU2xvdFByb3BzID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIC4uLnNsb3RQcm9wcyxcbiAgICBhY3Rpb25CYXI6IHtcbiAgICAgIGFjdGlvbnM6IFtcImNsZWFyXCIsIFwidG9kYXlcIiwgXCJjYW5jZWxcIiwgXCJhY2NlcHRcIl0gYXMgQXJyYXk8XCJhY2NlcHRcIiB8IFwiY2FuY2VsXCIgfCBcImNsZWFyXCIgfCBcIm5leHRcIiB8IFwibmV4dE9yQWNjZXB0XCIgfCBcInRvZGF5XCI+LFxuICAgICAgLi4uc2xvdFByb3BzLmFjdGlvbkJhcixcbiAgICB9LFxuICAgIHRleHRGaWVsZDoge1xuICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICB2YXJpYW50LFxuICAgICAgb25CbHVyOiBoYW5kbGVUZXh0RmllbGRCbHVyLFxuICAgICAgZXJyb3I6IGhhc0Vycm9yLFxuICAgICAgaGVscGVyVGV4dDogaGFzRXJyb3IgPyBlcnJvck1lc3NhZ2UgOiBoZWxwZXJUZXh0LFxuICAgICAgaW5wdXRQcm9wczoge1xuICAgICAgICByZWFkT25seTogdGV4dFJlYWRPbmx5LFxuICAgICAgICBcImFyaWEtaW52YWxpZFwiOiBpbnZhbGlkLFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogaGFzRXJyb3IgPyBgJHtuYW1lfS1lcnJvcmAgOiB1bmRlZmluZWQsXG4gICAgICAgIC4uLmlucHV0UHJvcHMuaW5wdXRQcm9wcyxcbiAgICAgIH0sXG4gICAgICAvLyBBZGQgbG9hZGluZyBpbmRpY2F0b3IgaWYgcHJvdmlkZWRcbiAgICAgIC4uLihsb2FkaW5nICYmIExvYWRpbmdDb21wb25lbnQgJiYge1xuICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgZW5kQWRvcm5tZW50OiA8TG9hZGluZ0NvbXBvbmVudCAvPixcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLklucHV0UHJvcHMsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIC4uLnNsb3RQcm9wcy50ZXh0RmllbGQsXG4gICAgfSxcbiAgfSksIFtcbiAgICBzbG90UHJvcHMsXG4gICAgaW5wdXRQcm9wcyxcbiAgICByZXF1aXJlZCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB2YXJpYW50LFxuICAgIGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgaGFzRXJyb3IsXG4gICAgZXJyb3JNZXNzYWdlLFxuICAgIGhlbHBlclRleHQsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGludmFsaWQsXG4gICAgbmFtZSxcbiAgICBsb2FkaW5nLFxuICAgIExvYWRpbmdDb21wb25lbnQsXG4gIF0pO1xuXG4gIHJldHVybiAoXG4gICAgPERhdGVQaWNrZXJcbiAgICAgIC8vIFNwcmVhZCByZXN0IHByb3BzIGZpcnN0IHNvIHRoZXkgY2FuIGJlIG92ZXJyaWRkZW5cbiAgICAgIHsuLi5yZXN0UHJvcHN9XG4gICAgICB7Li4ucmVzdERhdGVQaWNrZXJQcm9wc31cblxuICAgICAgLy8gQ29yZSBwcm9wc1xuICAgICAgcmVmPXtyZWZ9XG4gICAgICBuYW1lPXtuYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlfVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuXG4gICAgICAvLyBVSSBwcm9wc1xuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgc3g9e2NvbXB1dGVkU3h9XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cblxuICAgICAgLy8gU2xvdCBwcm9wc1xuICAgICAgc2xvdFByb3BzPXttZW1vaXplZFNsb3RQcm9wc31cblxuICAgICAgLy8gQWNjZXNzaWJpbGl0eSBwcm9wc1xuICAgICAgYXJpYS1pbnZhbGlkPXtpbnZhbGlkfVxuICAgICAgYXJpYS1kZXNjcmliZWRieT17aGFzRXJyb3IgPyBgJHtuYW1lfS1lcnJvcmAgOiB1bmRlZmluZWR9XG4gICAgLz5cbiAgKTtcbn0pO1xuXG4vLyBTZXQgZGlzcGxheSBuYW1lIGZvciBkZWJ1Z2dpbmdcbkRhdGVQaWNrZXJFbGVtZW50Q29yZS5kaXNwbGF5TmFtZSA9IFwiRGF0ZVBpY2tlckVsZW1lbnRDb3JlXCI7XG5cbmV4cG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudENvcmU7XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIFVzZUNvbnRyb2xsZXJSZXR1cm4sXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBEYXRlVHJhbnNmb3JtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogVHlwZS1zYWZlIGRhdGUgdmFsdWUgcmVhZGVyIHRoYXQgaGFuZGxlcyBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIGZyb20gdGhlIGRhdGUgYWRhcHRlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgbG9jYWxpemF0aW9uIGNvbnRleHQgZnJvbSBNVUkgZGF0ZSBwaWNrZXJzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydCAoc3RyaW5nLCBkYXRlLCBvciBudWxsKVxuICogQHJldHVybnMgUHJvcGVybHkgdHlwZWQgZGF0ZSB2YWx1ZSBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgVERhdGUgfCB1bmRlZmluZWRcbik6IFREYXRlIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIGEgZGF0ZVxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgcmV0dXJuIHBhcnNlZERhdGUgYXMgVERhdGU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgY29udHJvbGxlciBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBmaWVsZDogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdO1xuICAvKiogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zICovXG4gIHRyYW5zZm9ybT86IERhdGVUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPiB7XG4gIC8qKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIHBpY2tlciAqL1xuICB2YWx1ZTogVFZhbHVlIHwgbnVsbDtcbiAgLyoqIENoYW5nZSBoYW5kbGVyIGZvciBwaWNrZXIgdmFsdWUgdXBkYXRlcyAqL1xuICBvbkNoYW5nZTogKFxuICAgIHZhbHVlOiBUVmFsdWUgfCBudWxsLFxuICAgIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+XG4gICkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWx1ZSB0cmFuc2Zvcm1hdGlvbnMgd2l0aCB0eXBlIHNhZmV0eVxuICogXG4gKiBUaGlzIGhvb2sgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIGZvcm0gZmllbGQgdmFsdWVzIGFuZCBkYXRlIHBpY2tlciB2YWx1ZXMsXG4gKiBhcHBseWluZyBjdXN0b20gdHJhbnNmb3JtYXRpb25zIHdoaWxlIG1haW50YWluaW5nIHN0cmljdCBUeXBlU2NyaXB0IHR5cGluZy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFVzYWdlIHdpdGggRGF5LmpzIGRhdGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAqICAgZmllbGQsXG4gKiAgIHRyYW5zZm9ybToge1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IGRheWpzKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB2YWx1ZSB0cmFuc2Zvcm1hdGlvblxuICogQHJldHVybnMgT2JqZWN0IHdpdGggdHJhbnNmb3JtZWQgdmFsdWUgYW5kIGNoYW5nZSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclZhbHVlT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlPiB7XG4gIGNvbnN0IHsgZmllbGQsIHRyYW5zZm9ybSB9ID0gb3B0aW9ucztcbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICAvLyBUcmFuc2Zvcm0gdGhlIGZpZWxkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXJcbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKCgpOiBUVmFsdWUgfCBudWxsID0+IHtcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybS5pbnB1dChmaWVsZC52YWx1ZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IGhhbmRsZSBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gICAgcmV0dXJuIHJlYWREYXRlUGlja2VyVmFsdWVBc0RhdGUoYWRhcHRlciwgZmllbGQudmFsdWUpIGFzIFRWYWx1ZSB8IG51bGw7XG4gIH0sIFtmaWVsZC52YWx1ZSwgdHJhbnNmb3JtPy5pbnB1dCwgYWRhcHRlcl0pO1xuXG4gIC8vIENyZWF0ZSBhIHN0YWJsZSBjaGFuZ2UgaGFuZGxlclxuICBjb25zdCBvbkNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCwgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdHJhbnNmb3JtLm91dHB1dChuZXdWYWx1ZSwgY29udGV4dCk7XG5cbiAgICAgICAgZmllbGQub25DaGFuZ2UodHJhbnNmb3JtZWRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRyYW5zZm9ybWF0aW9uOiBzdG9yZSB0aGUgZGF0ZSBhcy1pc1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLm9uQ2hhbmdlLCB0cmFuc2Zvcm0/Lm91dHB1dF1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsdWU7IiwiaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZEVycm9yLFxuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBVc2VDb250cm9sbGVyUmV0dXJuLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24gaG9va1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgc3RhdGUgZnJvbSByZWFjdC1ob29rLWZvcm0gY29udHJvbGxlciAqL1xuICBmaWVsZFN0YXRlOiBVc2VDb250cm9sbGVyUmV0dXJuPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wiZmllbGRTdGF0ZVwiXTtcbiAgLyoqIFZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGRhdGUgcGlja2VyICovXG4gIHZhbGlkYXRpb24/OiBEYXRlUGlja2VyVmFsaWRhdGlvbkNvbmZpZzxUVmFsdWU+O1xuICAvKiogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKiBUaGUgY3VycmVudCBkYXRlIHZhbHVlIGZvciB2YWxpZGF0aW9uICovXG4gIHZhbHVlPzogVFZhbHVlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBoYXMgYW55IHZhbGlkYXRpb24gZXJyb3JzICovXG4gIGhhc0Vycm9yOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBlcnJvciAoZm9ybSBvciBkYXRlLXNwZWNpZmljKSAqL1xuICBlcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U6IFJlYWN0Tm9kZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGluIGFuIGludmFsaWQgc3RhdGUgKi9cbiAgaW52YWxpZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGVycm9yIG1lc3NhZ2VzIGZvciBjb21tb24gZGF0ZSB2YWxpZGF0aW9uIHNjZW5hcmlvc1xuICovXG5jb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTID0ge1xuICBpbnZhbGlkRGF0ZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIsXG4gIG1pbkRhdGU6IFwiRGF0ZSBtdXN0IGJlIGFmdGVyIHRoZSBtaW5pbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBtYXhEYXRlOiBcIkRhdGUgbXVzdCBiZSBiZWZvcmUgdGhlIG1heGltdW0gYWxsb3dlZCBkYXRlXCIsXG4gIGRpc2FibGVkRGF0ZTogXCJUaGlzIGRhdGUgaXMgbm90IGFsbG93ZWRcIixcbiAgcmVxdWlyZWQ6IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWxpZGF0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBlcnJvciBoYW5kbGluZ1xuICogXG4gKiBUaGlzIGhvb2sgY2VudHJhbGl6ZXMgdmFsaWRhdGlvbiBsb2dpYyBmb3IgZGF0ZSBwaWNrZXJzLCBoYW5kbGluZyBib3RoXG4gKiByZWFjdC1ob29rLWZvcm0gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbiBlcnJvcnNcbiAqIGZyb20gTVVJIGRhdGUgcGlja2Vycy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggZm9ybSB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGludmFsaWQgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgdmFsaWRhdGlvbjoge1xuICogICAgIG1pbkRhdGU6IGRheWpzKCkuc3VidHJhY3QoMSwgJ3llYXInKSxcbiAqICAgICBtYXhEYXRlOiBkYXlqcygpLmFkZCgxLCAneWVhcicpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdEYXRlIG11c3QgYmUgd2l0aGluIHRoZSBsYXN0IHllYXInLFxuICogICAgICAgbWF4RGF0ZTogJ0RhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAxIHllYXIgaW4gdGhlIGZ1dHVyZSdcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBVc2FnZSB3aXRoIGN1c3RvbSBlcnJvciBwYXJzZXI6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICogICBmaWVsZFN0YXRlLFxuICogICBwYXJzZUVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICogICAgICAgcmV0dXJuIGBEYXRlIEVycm9yOiAke2Vycm9yfWA7XG4gKiAgICAgfVxuICogICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdJbnZhbGlkIGRhdGUnO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHBhcmFtIG9wdGlvbnMgLSBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVmFsaWRhdGlvbiBzdGF0ZSBhbmQgZXJyb3IgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJWYWxpZGF0aW9uT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIGNvbnN0IHsgZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgcGFyc2VFcnJvciwgdmFsdWUgfSA9IG9wdGlvbnM7XG5cbiAgLy8gTWVtb2l6ZSB2YWxpZGF0aW9uIHJlc3VsdHMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7IGVycm9yOiBmaWVsZEVycm9yLCBpbnZhbGlkIH0gPSBmaWVsZFN0YXRlO1xuICAgIFxuICAgIC8vIFN0YXJ0IHdpdGggZm9ybSB2YWxpZGF0aW9uIGVycm9yXG4gICAgbGV0IGN1cnJlbnRFcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQgPSBmaWVsZEVycm9yO1xuICAgIFxuICAgIC8vIENoZWNrIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbnMgaWYgbm8gZm9ybSBlcnJvciBhbmQgd2UgaGF2ZSBhIHZhbHVlXG4gICAgaWYgKCFmaWVsZEVycm9yICYmIHZhbHVlICYmIHZhbGlkYXRpb24pIHtcbiAgICAgIGNvbnN0IHsgbWluRGF0ZSwgbWF4RGF0ZSwgc2hvdWxkRGlzYWJsZURhdGUsIGVycm9yTWVzc2FnZXMgfSA9IHZhbGlkYXRpb247XG4gICAgICBcbiAgICAgIC8vIENoZWNrIG1pbmltdW0gZGF0ZVxuICAgICAgaWYgKG1pbkRhdGUgJiYgdmFsdWUgPCBtaW5EYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWluRGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWluRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1pbkRhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBtYXhpbXVtIGRhdGVcbiAgICAgIGVsc2UgaWYgKG1heERhdGUgJiYgdmFsdWUgPiBtYXhEYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWF4RGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWF4RGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1heERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBkaXNhYmxlZCBkYXRlXG4gICAgICBlbHNlIGlmIChzaG91bGREaXNhYmxlRGF0ZSAmJiBzaG91bGREaXNhYmxlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgY3VycmVudEVycm9yID0ge1xuICAgICAgICAgIHR5cGU6ICdkaXNhYmxlZERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/LmRpc2FibGVkRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIERhdGVWYWxpZGF0aW9uRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGhhc0Vycm9yID0gQm9vbGVhbihjdXJyZW50RXJyb3IpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcixcbiAgICAgIGVycm9yOiBjdXJyZW50RXJyb3IsXG4gICAgICBpbnZhbGlkOiBpbnZhbGlkIHx8IGhhc0Vycm9yLFxuICAgIH07XG4gIH0sIFtmaWVsZFN0YXRlLCB2YWxpZGF0aW9uLCB2YWx1ZV0pO1xuXG4gIC8vIE1lbW9pemUgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHVzZU1lbW8oKCk6IFJlYWN0Tm9kZSA9PiB7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgY3VzdG9tIGVycm9yIHBhcnNlciBpZiBwcm92aWRlZFxuICAgIGlmIChwYXJzZUVycm9yKSB7XG4gICAgICByZXR1cm4gcGFyc2VFcnJvcih2YWxpZGF0aW9uUmVzdWx0LmVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoJ21lc3NhZ2UnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgJiYgdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGVycm9yIG1lc3NhZ2VzIGJhc2VkIG9uIGVycm9yIHR5cGVcbiAgICBpZiAoJ3R5cGUnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IHZhbGlkYXRpb25SZXN1bHQuZXJyb3IudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLnJlcXVpcmVkO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZTtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICB9LCBbdmFsaWRhdGlvblJlc3VsdC5lcnJvciwgcGFyc2VFcnJvcl0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4udmFsaWRhdGlvblJlc3VsdCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uOyIsImltcG9ydCB0eXBlIHsgU3hQcm9wcywgVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB1c2VEYXRlUGlja2VyU3R5bGVzIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyU3R5bGVzT3B0aW9ucyB7XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGhhcyBhIHZhbGlkYXRpb24gZXJyb3IgKi9cbiAgaGFzRXJyb3I/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIGxvYWRpbmcgc3RhdGUgKi9cbiAgbG9hZGluZz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSB0ZXh0IGlucHV0IGlzIHJlYWQtb25seSAqL1xuICB0ZXh0UmVhZE9ubHk/OiBib29sZWFuO1xuICAvKiogQ3VzdG9tIHN0eWxlcyB0byBtZXJnZSB3aXRoIGRlZmF1bHRzICovXG4gIHN4PzogU3hQcm9wczxUaGVtZT47XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyU3R5bGVzIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyU3R5bGVzUmV0dXJuIHtcbiAgLyoqIENvbXB1dGVkIHN0eWxlcyBmb3IgdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudCAqL1xuICBzeDogU3hQcm9wczxUaGVtZT47XG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzIG5hbWVzIGZvciBzdHlsaW5nICovXG4gIGNsYXNzTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyB0aGVtZS1hd2FyZSBkYXRlIHBpY2tlciBzdHlsZXMgd2l0aCBjb25zaXN0ZW50IGRlc2lnbiBzeXN0ZW0gaW50ZWdyYXRpb25cbiAqIFxuICogVGhpcyBob29rIHByb3ZpZGVzIG9wdGltaXplZCwgbWVtb2l6ZWQgc3R5bGVzIGZvciBkYXRlIHBpY2tlciBjb21wb25lbnRzIHRoYXQgYXV0b21hdGljYWxseVxuICogYWRhcHQgdG8gdGhlIGN1cnJlbnQgTVVJIHRoZW1lIGFuZCBjb21wb25lbnQgc3RhdGUgKGRpc2FibGVkLCBlcnJvciwgbG9hZGluZywgZXRjLikuXG4gKiBJdCBlbnN1cmVzIGNvbnNpc3RlbnQgc3R5bGluZyBhY3Jvc3MgYWxsIGRhdGUgcGlja2VyIGluc3RhbmNlcyB3aGlsZSBhbGxvd2luZyBjdXN0b21pemF0aW9uLlxuICogXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc3ggfSA9IHVzZURhdGVQaWNrZXJTdHlsZXMoe1xuICogICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAqICAgaGFzRXJyb3I6ICEhZXJyb3IsXG4gKiAgIGxvYWRpbmc6IGlzTG9hZGluZ1xuICogfSk7XG4gKiBcbiAqIHJldHVybiA8RGF0ZVBpY2tlciBzeD17c3h9IC4uLiAvPjtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gc3R5bGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHN4IH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAqICAgaGFzRXJyb3I6ICEhZXJyb3IsXG4gKiAgIHN4OiB7XG4gKiAgICAgJyYgLk11aUlucHV0TGFiZWwtcm9vdCc6IHtcbiAqICAgICAgIGNvbG9yOiAncHJpbWFyeS5tYWluJ1xuICogICAgIH1cbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHBhcmFtIG9wdGlvbnMgLSBTdHlsZSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIENvbXB1dGVkIHN0eWxlcyBhbmQgY2xhc3MgbmFtZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJTdHlsZXMoXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJTdHlsZXNPcHRpb25zID0ge31cbik6IFVzZURhdGVQaWNrZXJTdHlsZXNSZXR1cm4ge1xuICBjb25zdCB7IGRpc2FibGVkLCBoYXNFcnJvciwgbG9hZGluZywgdGV4dFJlYWRPbmx5LCBzeDogY3VzdG9tU3ggfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICAvLyBNZW1vaXplIGNvbXB1dGVkIHN0eWxlcyBmb3IgcGVyZm9ybWFuY2VcbiAgY29uc3QgY29tcHV0ZWRTeCA9IHVzZU1lbW8oKCk6IFN4UHJvcHM8VGhlbWU+ID0+IHtcbiAgICBjb25zdCBiYXNlU3R5bGVzOiBTeFByb3BzPFRoZW1lPiA9IHtcbiAgICAgIC8vIElucHV0IGZpZWxkIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290XCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCBcbiAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgXG4gICAgICAgIC8vIFRyYW5zaXRpb24gZm9yIHNtb290aCBzdGF0ZSBjaGFuZ2VzXG4gICAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZShbXG4gICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InLFxuICAgICAgICAgICdib3JkZXItY29sb3InLFxuICAgICAgICAgICdjb2xvcidcbiAgICAgICAgXSwge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydCxcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gRXJyb3Igc3RhdGUgc3R5bGluZ1xuICAgICAgICAuLi4oaGFzRXJyb3IgJiYge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYuTXVpLWZvY3VzZWQnOiB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgICAgYm94U2hhZG93OiBgMCAwIDAgMnB4ICR7dGhlbWUucGFsZXR0ZS5lcnJvci5tYWlufTI1YCwgLy8gMjUgaXMgMTUlIG9wYWNpdHkgaW4gaGV4XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gTG9hZGluZyBzdGF0ZSBzdHlsaW5nXG4gICAgICAgIC4uLihsb2FkaW5nICYmIHtcbiAgICAgICAgICBvcGFjaXR5OiAwLjcsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIElucHV0IGVsZW1lbnQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dEJhc2UtaW5wdXRcIjoge1xuICAgICAgICBjdXJzb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gXCJub3QtYWxsb3dlZFwiIFxuICAgICAgICAgIDogdGV4dFJlYWRPbmx5IFxuICAgICAgICAgICAgPyBcInBvaW50ZXJcIiBcbiAgICAgICAgICAgIDogXCJ0ZXh0XCIsXG4gICAgICAgIFxuICAgICAgICAvLyBSZWFkLW9ubHkgc3BlY2lmaWMgc3R5bGluZ1xuICAgICAgICAuLi4odGV4dFJlYWRPbmx5ICYmICFkaXNhYmxlZCAmJiB7XG4gICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgICAgICB1c2VyU2VsZWN0OiBcIm5vbmVcIixcbiAgICAgICAgICBjYXJldENvbG9yOiBcInRyYW5zcGFyZW50XCIsIC8vIEhpZGUgdGV4dCBjdXJzb3IgaW4gcmVhZC1vbmx5IG1vZGVcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gTG9hZGluZyBzdGF0ZVxuICAgICAgICAuLi4obG9hZGluZyAmJiB7XG4gICAgICAgICAgY3Vyc29yOiBcIndhaXRcIixcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBSZXF1aXJlZCBmaWVsZCBhc3RlcmlzayBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0TGFiZWwtYXN0ZXJpc2tcIjogeyBcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgZm9udFNpemU6IFwiMS4yZW1cIixcbiAgICAgIH0sXG5cbiAgICAgIC8vIExhYmVsIHN0eWxpbmcgd2l0aCBiZXR0ZXIgY29udHJhc3RcbiAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1yb290XCI6IHtcbiAgICAgICAgY29sb3I6IGhhc0Vycm9yIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIFxuICAgICAgICAgIDogdGhlbWUucGFsZXR0ZS50ZXh0LnNlY29uZGFyeSxcbiAgICAgICAgXG4gICAgICAgIC8vIEVuc3VyZSBwcm9wZXIgY29udHJhc3QgZm9yIGRpc2FibGVkIHN0YXRlXG4gICAgICAgIC4uLihkaXNhYmxlZCAmJiB7XG4gICAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUudGV4dC5kaXNhYmxlZCxcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBIZWxwZXIgdGV4dCBzdHlsaW5nXG4gICAgICBcIiYgLk11aUZvcm1IZWxwZXJUZXh0LXJvb3RcIjoge1xuICAgICAgICBtYXJnaW5MZWZ0OiB0aGVtZS5zcGFjaW5nKDEpLFxuICAgICAgICBtYXJnaW5SaWdodDogdGhlbWUuc3BhY2luZygxKSxcbiAgICAgICAgXG4gICAgICAgIC8vIEVycm9yIHN0YXRlXG4gICAgICAgIC4uLihoYXNFcnJvciAmJiB7XG4gICAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBDYWxlbmRhciBpY29uIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRBZG9ybm1lbnQtcm9vdFwiOiB7XG4gICAgICAgIGNvbG9yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkIFxuICAgICAgICAgIDogaGFzRXJyb3IgXG4gICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiBcbiAgICAgICAgICAgIDogdGhlbWUucGFsZXR0ZS5hY3Rpb24uYWN0aXZlLFxuICAgICAgfSxcblxuICAgICAgLy8gRm9jdXMgcmluZyBmb3IgYWNjZXNzaWJpbGl0eVxuICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWZvY3VzZWRcIjoge1xuICAgICAgICBvdXRsaW5lOiBgMnB4IHNvbGlkICR7dGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW59NTBgLCAvLyA1MCBpcyAzMSUgb3BhY2l0eVxuICAgICAgICBvdXRsaW5lT2Zmc2V0OiBcIjJweFwiLFxuICAgICAgfSxcblxuICAgICAgLy8gRW5oYW5jZWQgY29udHJhc3QgZm9yIGRhcmsgdGhlbWVzXG4gICAgICAuLi4odGhlbWUucGFsZXR0ZS5tb2RlID09PSAnZGFyaycgJiYge1xuICAgICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdFwiOiB7XG4gICAgICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgLy8gTWVyZ2Ugd2l0aCBjdXN0b20gc3R5bGVzXG4gICAgcmV0dXJuIGN1c3RvbVN4ID8gW2Jhc2VTdHlsZXMsIGN1c3RvbVN4XSBhcyBTeFByb3BzPFRoZW1lPiA6IGJhc2VTdHlsZXM7XG4gIH0sIFtcbiAgICB0aGVtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBoYXNFcnJvcixcbiAgICBsb2FkaW5nLFxuICAgIHRleHRSZWFkT25seSxcbiAgICBjdXN0b21TeCxcbiAgXSk7XG5cbiAgLy8gR2VuZXJhdGUgYWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3IgZXh0ZXJuYWwgc3R5bGluZyBob29rc1xuICBjb25zdCBjbGFzc05hbWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIFxuICAgIGlmIChkaXNhYmxlZCkgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tZGlzYWJsZWQnKTtcbiAgICBpZiAoaGFzRXJyb3IpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWVycm9yJyk7XG4gICAgaWYgKGxvYWRpbmcpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWxvYWRpbmcnKTtcbiAgICBpZiAodGV4dFJlYWRPbmx5KSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1yZWFkT25seScpO1xuICAgIFxuICAgIHJldHVybiBjbGFzc2VzLmxlbmd0aCA+IDAgPyBjbGFzc2VzLmpvaW4oJyAnKSA6IHVuZGVmaW5lZDtcbiAgfSwgW2Rpc2FibGVkLCBoYXNFcnJvciwgbG9hZGluZywgdGV4dFJlYWRPbmx5XSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzeDogY29tcHV0ZWRTeCxcbiAgICBjbGFzc05hbWUsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJTdHlsZXM7IiwiaW1wb3J0IHR5cGUgeyBQaWNrZXJWYWxpZERhdGUgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGgsIFBhdGhWYWx1ZSB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgZm9yIGNyZWF0aW5nIGJyYW5kZWQgZGF0ZSB0eXBlcyB0byBwcmV2ZW50IG1peGluZyBkaWZmZXJlbnQgZGF0ZSBmb3JtYXRzXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgYmFzZSBkYXRlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUQnJhbmQgLSBUaGUgYnJhbmQgc3RyaW5nIGZvciB0eXBlIHNhZmV0eVxuICovXG5leHBvcnQgdHlwZSBCcmFuZGVkRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSwgVEJyYW5kIGV4dGVuZHMgc3RyaW5nPiA9IFxuICBURGF0ZSAmIHsgcmVhZG9ubHkgX19icmFuZDogVEJyYW5kIH07XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGRhdGUtbGlrZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGlja2VyVmFsaWREYXRlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgRGF0ZSBvYmplY3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBkYXRlLWxpa2Ugb2JqZWN0cyB3aXRoIGNvbW1vbiBkYXRlIGxpYnJhcnkgbWV0aG9kc1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIC8vIERheS5qcywgTW9tZW50LmpzLCBvciBzaW1pbGFyXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTHV4b24gRGF0ZVRpbWVcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFyc2VkIGFzIGEgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBhcnNlYWJsZSBkYXRlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzYWJsZURhdGVTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBCYXNpYyBJU08gZGF0ZSBmb3JtYXQgY2hlY2tcbiAgY29uc3QgaXNvRGF0ZVJlZ2V4ID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSg/OlRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHszfSk/KD86WnxbKy1dXFxkezJ9OlxcZHsyfSk/KT8kLztcblxuICBpZiAoaXNvRGF0ZVJlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiBEYXRlIGNvbnN0cnVjdG9yIGNhbiBwYXJzZSBpdFxuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cbiAgcmV0dXJuICFpc05hTihwYXJzZWQuZ2V0VGltZSgpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlIHBpY2tlciB2YWx1ZXNcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSB1c2VkIGJ5IHRoZSBwaWNrZXJcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGRhdGUgYWRhcHRlciBmcm9tIE1VSSBsb2NhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgQSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IHNhZmVseSBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0ZUlucHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+KSB7XG4gIHJldHVybiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik6IFREYXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZShwYXJzZWQpID8gKHBhcnNlZCBhcyBURGF0ZSkgOiBudWxsO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBURGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBkYXRlIHBpY2tlciB2YWx1ZXMgYmFjayB0byBmb3JtIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGZvcm1hdCAtIFRoZSBmb3JtYXQgdG8gdXNlIGZvciBzdHJpbmcgY29udmVyc2lvbiAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGRhdGVzIHRvIGZvcm0gdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlT3V0cHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGZvcm1hdD86IHN0cmluZykge1xuICByZXR1cm4gKHZhbHVlOiBURGF0ZSB8IG51bGwpOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfVxuXG4gICAgaWYgKCFpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBmb3JtYXQgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGRhdGUgYXMtaXNcbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBkYXRlIGxpYnJhcnkgZm9ybWF0c1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaXNvJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkYXRlLW9ubHknKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGF5LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTW9tZW50LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTHV4b24gZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS50b0Zvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2s6IHJldHVybiBhcy1pc1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBjcmVhdGUgZGVmYXVsdCBkYXRlIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlXG4gKiBAcmV0dXJucyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0RGF0ZVBpY2tlckNvbmZpZzxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZT4oKSB7XG4gIHJldHVybiB7XG4gICAgLy8gRGVmYXVsdCBzbG90IHByb3BzIGZvciBjb25zaXN0ZW50IGJlaGF2aW9yXG4gICAgc2xvdFByb3BzOiB7XG4gICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgY29uc3QsXG4gICAgICB9LFxuICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgdmFyaWFudDogJ291dGxpbmVkJyBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IGdyaWQgcHJvcHMgZm9yIGxheW91dCBjb25zaXN0ZW5jeVxuICAgIGdyaWRQcm9wczoge1xuICAgICAgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IGFzIGNvbnN0LFxuICAgIH0sXG4gICAgXG4gICAgLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICB2YWxpZGF0aW9uOiB7XG4gICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gICAgICAgIGludmFsaWREYXRlOiBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGVcIixcbiAgICAgICAgbWluRGF0ZTogXCJEYXRlIG11c3QgYmUgYWZ0ZXIgdGhlIG1pbmltdW0gYWxsb3dlZCBkYXRlXCIsXG4gICAgICAgIG1heERhdGU6IFwiRGF0ZSBtdXN0IGJlIGJlZm9yZSB0aGUgbWF4aW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgZGlzYWJsZWREYXRlOiBcIlRoaXMgZGF0ZSBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgfSxcbiAgICB9LFxuICB9IGFzIGNvbnN0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gc2FmZWx5IGV4dHJhY3QgZXJyb3IgbWVzc2FnZSBmcm9tIHZhcmlvdXMgZXJyb3IgdHlwZXNcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciBvYmplY3QgKGNvdWxkIGJlIGZyb20gcmVhY3QtaG9vay1mb3JtIG9yIE1VSSBkYXRlIHBpY2tlcilcbiAqIEByZXR1cm5zIEEgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCkge1xuICAgIC8vIFJlYWN0IEhvb2sgRm9ybSBGaWVsZEVycm9yXG4gICAgaWYgKCdtZXNzYWdlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIE1VSSBEYXRlVmFsaWRhdGlvbkVycm9yXG4gICAgaWYgKCd0eXBlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IChlcnJvciBhcyBhbnkpLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUnO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGVhcmx5JztcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuICdEYXRlIGlzIHRvbyBsYXRlJztcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBpcyBub3QgYXZhaWxhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgZGF0ZSBzZWxlY3Rpb24nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnSW52YWxpZCBpbnB1dCc7XG59XG5cbi8qKlxuICogUGVyZm9ybWFuY2UgdXRpbGl0eSB0byBjcmVhdGUgc3RhYmxlIHJlZmVyZW5jZXMgZm9yIGNvbXBsZXggcHJvcHNcbiAqIFRoaXMgaGVscHMgcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzIHdoZW4gdXNpbmcgY29tcGxleCBjb25maWd1cmF0aW9uIG9iamVjdHNcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBBIEpTT04gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBkZXBlbmRlbmN5IGluIHVzZU1lbW8vdXNlQ2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWJsZUtleTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGNvbmZpZzogVCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIC8vIFNvcnQgb2JqZWN0IGtleXMgZm9yIGNvbnNpc3RlbnQgc2VyaWFsaXphdGlvblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgc29ydGVkW2tdID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zZXJpYWxpemFibGUgb2JqZWN0c1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLnNvcnQoKS5qb2luKCctJyk7XG4gIH1cbn0iLCJpbXBvcnQgVmlzaWJpbGl0eSBmcm9tIFwiQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5XCI7XG5pbXBvcnQgVmlzaWJpbGl0eU9mZiBmcm9tIFwiQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5T2ZmXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEljb25CdXR0b25Qcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIEdyaWRQcm9wc1xufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHtcbiAgSWNvbkJ1dHRvbixcbiAgSW5wdXRBZG9ybm1lbnQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgR3JpZFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBNb3VzZUV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXIsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFBhc3N3b3JkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHZhbHVlIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFBhc3N3b3JkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4gPSBPbWl0PFRleHRGaWVsZFByb3BzLCBcIm5hbWVcIj4gJiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcInBhc3N3b3JkXCIgfCBcInVzZXIuY3VycmVudFBhc3N3b3JkXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIENvbG9yIG9mIHRoZSB2aXNpYmlsaXR5IHRvZ2dsZSBpY29uIGJ1dHRvblxuICAgKiBAZGVmYXVsdFZhbHVlIFwiZGVmYXVsdFwiXG4gICAqL1xuICBpY29uQ29sb3I/OiBJY29uQnV0dG9uUHJvcHNbXCJjb2xvclwiXTtcbiAgLyoqXG4gICAqIEN1c3RvbSByZW5kZXIgZnVuY3Rpb24gZm9yIHRoZSB2aXNpYmlsaXR5IHRvZ2dsZSBpY29uXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFdoZXRoZXIgcGFzc3dvcmQgaXMgY3VycmVudGx5IGhpZGRlblxuICAgKiBAcmV0dXJucyBSZWFjdE5vZGUgdG8gcmVuZGVyIGFzIHRoZSBpY29uXG4gICAqIEBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2aXNpYmlsaXR5L3Zpc2liaWxpdHktb2ZmIGljb25zXG4gICAqL1xuICByZW5kZXJJY29uPzogKHBhc3N3b3JkOiBib29sZWFuKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG59O1xuXG50eXBlIFBhc3N3b3JkRWxlbWVudENvbXBvbmVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+XG4+KFxuICBwcm9wczogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbikgPT4gUmVhY3QuSlNYLkVsZW1lbnQ7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFBhc3N3b3JkRWw8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPihwcm9wczogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBpY29uQ29sb3IsXG4gICAgcmVuZGVySWNvbiA9IChwYXNzd29yZCkgPT4gKHBhc3N3b3JkID8gPFZpc2liaWxpdHkgLz4gOiA8VmlzaWJpbGl0eU9mZiAvPiksXG4gICAgc2xvdFByb3BzLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICBpbnB1dFJlZixcbiAgICBvbkJsdXIsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgW3Bhc3N3b3JkLCBzZXRQYXNzd29yZF0gPSB1c2VTdGF0ZTxib29sZWFuPih0cnVlKTtcblxuICBjb25zdCBlbmRBZG9ybm1lbnQgPSAoXG4gICAgPElucHV0QWRvcm5tZW50IHBvc2l0aW9uPXtcImVuZFwifT5cbiAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgIG9uTW91c2VEb3duPXsoZTogTW91c2VFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IGUucHJldmVudERlZmF1bHQoKX1cbiAgICAgICAgb25DbGljaz17KCkgPT4gc2V0UGFzc3dvcmQoIXBhc3N3b3JkKX1cbiAgICAgICAgdGFiSW5kZXg9ey0xfVxuICAgICAgICBjb2xvcj17aWNvbkNvbG9yID8/IFwiZGVmYXVsdFwifVxuICAgICAgPlxuICAgICAgICB7cmVuZGVySWNvbihwYXNzd29yZCl9XG4gICAgICA8L0ljb25CdXR0b24+XG4gICAgPC9JbnB1dEFkb3JubWVudD5cbiAgKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHR5cGU9e3Bhc3N3b3JkID8gXCJwYXNzd29yZFwiIDogXCJ0ZXh0XCJ9XG4gICAgICB2YWx1ZT17ZmllbGQudmFsdWV9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gdGhpcyB3aWxsIGJlIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBhbnlvbmUgdXNpbmcgdHJhbnNmb3JtLm91dHB1dFxuICAgICAgICAvLyBiZWNhdXNlIG5vdyB3ZSBhcmUgcGFzc2luZyBldmVudCBpbnN0ZWFkIG9mIGV2ZW50LnRhcmdldC52YWx1ZSBvciArZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN0Lm9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXN0Lm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIHsuLi4odHlwZW9mIHNsb3RQcm9wcyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IHtcbiAgICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICBzbG90UHJvcHM6IHtcbiAgICAgICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudCxcbiAgICAgICAgICAgICAgLi4uc2xvdFByb3BzPy5pbnB1dCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBUZXh0RmllbGRQcm9wc1tcInNsb3RQcm9wc1wiXSxcbiAgICAgICAgfSl9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiXCJ9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBwYXNzd29yZCBUZXh0RmllbGQgd2l0aCBzaG93L2hpZGUgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgcGFzc3dvcmQgaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgYW5kIGEgYnVpbHQtaW4gdmlzaWJpbGl0eSB0b2dnbGUgYnV0dG9uLiBUaGUgcGFzc3dvcmRcbiAqIGNhbiBiZSBzaG93biBvciBoaWRkZW4gYnkgY2xpY2tpbmcgdGhlIGV5ZSBpY29uIGluIHRoZSBpbnB1dCdzIGVuZCBhZG9ybm1lbnQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIFBhc3N3b3JkIHZpc2liaWxpdHkgdG9nZ2xlXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEN1c3RvbWl6YWJsZSB2aXNpYmlsaXR5IGljb25zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0XG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiUGFzc3dvcmRcIlxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnLFxuICogICAgIG1pbkxlbmd0aDogeyB2YWx1ZTogOCwgbWVzc2FnZTogJ01pbmltdW0gOCBjaGFyYWN0ZXJzJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGljb24gY29sb3I6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiQ29uZmlybSBQYXNzd29yZFwiXG4gKiAgIGljb25Db2xvcj1cInByaW1hcnlcIlxuICogICBwbGFjZWhvbGRlcj1cIlJlLWVudGVyIHlvdXIgcGFzc3dvcmRcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cIm5ld1Bhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJOZXcgUGFzc3dvcmRcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcmVuZGVySWNvbj17KGhpZGRlbikgPT4gaGlkZGVuID8gPEN1c3RvbUhpZGVJY29uIC8+IDogPEN1c3RvbVNob3dJY29uIC8+fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBQYXNzd29yZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBQYXNzd29yZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5QYXNzd29yZEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIlBhc3N3b3JkRWxlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBQYXNzd29yZEVsZW1lbnQ7XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEZvcm1Db250cm9sTGFiZWxQcm9wcyxcbiAgRm9ybUxhYmVsUHJvcHMsXG4gIFJhZGlvR3JvdXBQcm9wcyxcbiAgUmFkaW9Qcm9wcyxcbiAgR3JpZFByb3BzXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQge1xuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEZvcm1MYWJlbCxcbiAgUmFkaW8sXG4gIFJhZGlvR3JvdXAsXG4gIHVzZVRoZW1lLFxuICBHcmlkXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXJcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtXCI7XG5cbi8vIFR5cGUgZm9yIHByaW1pdGl2ZSB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBhcyByYWRpbyBidXR0b24gdmFsdWVzXG50eXBlIFByaW1pdGl2ZVZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxuLy8gQ29uc3RyYWludCB0byBlbnN1cmUgb3B0aW9uIG9iamVjdHMgaGF2ZSB0aGUgcmVxdWlyZWQga2V5c1xudHlwZSBPcHRpb25PYmplY3Q8XG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmdcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBQcmltaXRpdmVWYWx1ZT4gJlxuICBSZWNvcmQ8VExhYmVsS2V5LCBzdHJpbmc+ICZcbiAgUGFydGlhbDxSZWNvcmQ8VERpc2FibGVkS2V5LCBib29sZWFuPj4gJlxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuZXhwb3J0IGludGVyZmFjZSBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5PiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwiaWRcIixcbiAgVExhYmVsS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwibGFiZWxcIixcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMga2V5b2YgVE9wdGlvbiAmIHN0cmluZyA9IFwiZGlzYWJsZWRcIlxuPiB7XG4gIG9wdGlvbnM6IFRPcHRpb25bXTtcbiAgaGVscGVyVGV4dD86IFJlYWN0Tm9kZTtcbiAgbmFtZTogVE5hbWU7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICBsYWJlbD86IHN0cmluZztcbiAgbGFiZWxLZXk/OiBUTGFiZWxLZXk7XG4gIHZhbHVlS2V5PzogVFZhbHVlS2V5O1xuICBkaXNhYmxlZEtleT86IFREaXNhYmxlZEtleTtcbiAgdHlwZT86IFwibnVtYmVyXCIgfCBcInN0cmluZ1wiIHwgXCJib29sZWFuXCI7XG4gIGVtcHR5T3B0aW9uTGFiZWw/OiBzdHJpbmc7XG4gIG9uQ2hhbmdlPzogKHZhbHVlOiBUT3B0aW9uW1RWYWx1ZUtleV0gfCBUT3B0aW9uIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuICByZXR1cm5PYmplY3Q/OiBib29sZWFuO1xuICByb3c/OiBib29sZWFuO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBsYWJlbFByb3BzPzogT21pdDxGb3JtQ29udHJvbExhYmVsUHJvcHMsIFwibGFiZWxcIiB8IFwiY29udHJvbFwiIHwgXCJ2YWx1ZVwiPjtcbiAgZm9ybUxhYmVsUHJvcHM/OiBPbWl0PEZvcm1MYWJlbFByb3BzLCBcInJlcXVpcmVkXCIgfCBcImVycm9yXCI+O1xuICByYWRpb1Byb3BzPzogUmFkaW9Qcm9wcztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVE9wdGlvbltUVmFsdWVLZXldO1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogaW1wb3J0KFwiLi4vLi4vdHlwZXMvZXZlbnRzXCIpLkV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBSYWRpb0J1dHRvbkdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImlkXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImxhYmVsXCIsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImRpc2FibGVkXCJcbj4ocHJvcHM6IFJhZGlvQnV0dG9uR3JvdXBQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5Pikge1xuICBjb25zdCB7XG4gICAgb3B0aW9ucyxcbiAgICBsYWJlbCxcbiAgICBuYW1lLFxuICAgIGxhYmVsS2V5ID0gXCJsYWJlbFwiIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUtleSA9IFwiaWRcIiBhcyBUVmFsdWVLZXksXG4gICAgZGlzYWJsZWRLZXkgPSBcImRpc2FibGVkXCIgYXMgVERpc2FibGVkS2V5LFxuICAgIHJlcXVpcmVkLFxuICAgIGVtcHR5T3B0aW9uTGFiZWwsXG4gICAgcmV0dXJuT2JqZWN0LFxuICAgIHJvdyxcbiAgICBjb250cm9sLFxuICAgIHR5cGUsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBkaXNhYmxlZCxcbiAgICBmb3JtTGFiZWxQcm9wcyxcbiAgICByYWRpb1Byb3BzLFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb25cbiAgPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIHx8IChcIlwiIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG4gICAgICAgICAgfSxcbiAgICAgIG91dHB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybT8ub3V0cHV0XG4gICAgICAgICAgOiAoX2V2ZW50LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG9uUmFkaW9DaGFuZ2U6IFJhZGlvR3JvdXBQcm9wc1tcIm9uQ2hhbmdlXCJdID0gKGV2ZW50LCByYWRpb1ZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSByZXR1cm5PYmplY3RcbiAgICAgID8gKG9wdGlvbnMgYXMgVE9wdGlvbltdKS5maW5kKChvcHRpb24pID0+IG9wdGlvblt2YWx1ZUtleV0gPT09IHJhZGlvVmFsdWUpXG4gICAgICA6IHJhZGlvVmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuXG4gICAgb25DaGFuZ2UoZXZlbnQsIHJldHVyblZhbHVlKTtcbiAgICBpZiAodHlwZW9mIHJlc3Qub25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmVzdC5vbkNoYW5nZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIHtsYWJlbCAmJiAoXG4gICAgICAgIDxGb3JtTGFiZWwgey4uLmZvcm1MYWJlbFByb3BzfSByZXF1aXJlZD17cmVxdWlyZWR9IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvRm9ybUxhYmVsPlxuICAgICAgKX1cbiAgICAgIDxSYWRpb0dyb3VwIG9uQ2hhbmdlPXtvblJhZGlvQ2hhbmdlfSBuYW1lPXtuYW1lfSByb3c9e3Jvd30gdmFsdWU9e3ZhbHVlfT5cbiAgICAgICAge2VtcHR5T3B0aW9uTGFiZWwgJiYgKFxuICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgICAgY29sb3I6IGVycm9yID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17IXZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFiZWw9e2VtcHR5T3B0aW9uTGFiZWx9XG4gICAgICAgICAgICB2YWx1ZT1cIlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge29wdGlvbnMubWFwKChvcHRpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb25bdmFsdWVLZXldO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbkRpc2FibGVkID0gb3B0aW9uW2Rpc2FibGVkS2V5XSB8fCBmYWxzZTtcbiAgICAgICAgICBsZXQgdmFsOiBUT3B0aW9uW1RWYWx1ZUtleV0gfCB1bmRlZmluZWQgPSByZXR1cm5PYmplY3RcbiAgICAgICAgICAgID8gKHZhbHVlIGFzIFRPcHRpb24pPy5bdmFsdWVLZXldXG4gICAgICAgICAgICA6IHZhbHVlIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcblxuICAgICAgICAgIGlmICh0eXBlID09PSBcIm51bWJlclwiICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWwgPSBOdW1iZXIodmFsKSBhcyBUT3B0aW9uW1RWYWx1ZUtleV07XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcImJvb2xlYW5cIiAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gQm9vbGVhbih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc0NoZWNrZWQgPSB2YWwgPT09IG9wdGlvbktleTtcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgICBrZXk9e1N0cmluZyhvcHRpb25LZXkpfVxuICAgICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgb3B0aW9uRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0NoZWNrZWR9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZT17b3B0aW9uS2V5fVxuICAgICAgICAgICAgICBsYWJlbD17b3B0aW9uW2xhYmVsS2V5XX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICB7ZXJyb3IgJiYgPEZvcm1IZWxwZXJUZXh0PntlcnJvci5tZXNzYWdlfTwvRm9ybUhlbHBlclRleHQ+fVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG5jb25zdCBSYWRpb0J1dHRvbkdyb3VwID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImlkXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImxhYmVsXCIsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImRpc2FibGVkXCJcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogUmFkaW9CdXR0b25Hcm91cFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24sIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5PiB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24sIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+IHsuLi5wcm9wc30gLz47XG59O1xuXG5SYWRpb0J1dHRvbkdyb3VwLmRpc3BsYXlOYW1lID0gXCJSYWRpb0J1dHRvbkdyb3VwXCI7XG5cbmV4cG9ydCBkZWZhdWx0IFJhZGlvQnV0dG9uR3JvdXA7XG4iLCJpbXBvcnQge1xuICBHcmlkLFxuICB1c2VUaGVtZSxcbiAgVGV4dEZpZWxkLFxuICB0eXBlIFN4UHJvcHMsXG4gIEF1dG9jb21wbGV0ZSxcbiAgdHlwZSBHcmlkUHJvcHMsXG4gIHR5cGUgQ2hpcFR5cGVNYXAsXG4gIHR5cGUgVGV4dEZpZWxkUHJvcHMsXG4gIHR5cGUgVGV4dEZpZWxkVmFyaWFudHMsXG4gIHR5cGUgQXV0b2NvbXBsZXRlUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBKU1ggfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgdHlwZSBDb250cm9sLFxuICB1c2VDb250cm9sbGVyLFxuICB0eXBlIEZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFZhbHVlcyxcbiAgdHlwZSBVc2VDb250cm9sbGVyUHJvcHMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmV4cG9ydCB0eXBlIFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4sXG4gICduYW1lJyB8ICdyZW5kZXJJbnB1dCcgfCAnaXNPcHRpb25FcXVhbFRvVmFsdWUnIHwgJ2dldE9wdGlvbkxhYmVsJyB8ICdkaXNhYmxlZCdcbj4gJiB7XG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+WydydWxlcyddO1xuICBuYW1lOiBUTmFtZTtcbiAgZGVwZW5kc09uOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBzeD86IFN4UHJvcHM7XG4gIGlzRWRpdD86IGJvb2xlYW47XG4gIGxhYmVsS2V5Pzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVLZXk/OiBrZXlvZiBUT3B0aW9uO1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG59O1xuXG50eXBlIFNlbGVjdENhc2NhZGVFbGVtZW50Q29tcG9uZW50ID0gPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4oXG4gIHByb3BzOiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RDYXNjYWRlRWxlbWVudDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbGFiZWxLZXkgPSAnTGFiZWwnLFxuICAgIHZhbHVlS2V5ID0gJ1ZhbHVlJyxcbiAgICBuYW1lLFxuICAgIG9uQmx1cixcbiAgICBvbkNoYW5nZSxcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zLFxuICAgIGNvbnRyb2wsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIGRlcGVuZHNPbixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgc3gsXG4gICAgaXNFZGl0ID0gZmFsc2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3QgZ2V0T3B0aW9uS2V5ID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9wdGlvbiA9PT0gJ251bWJlcicpIHJldHVybiBvcHRpb247XG4gICAgICBjb25zdCBrZXkgPSBvcHRpb24gPyBvcHRpb25bdmFsdWVLZXkgYXMga2V5b2YgVE9wdGlvbl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXkgIT09IG51bGwgPyBTdHJpbmcoa2V5KSA6ICcnO1xuICAgIH0sXG4gICAgW3ZhbHVlS2V5XVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEtleSBhcyBrZXlvZiBUT3B0aW9uXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEtleV1cbiAgKTtcblxuICBjb25zdCBpc09wdGlvbkVxdWFsVG9WYWx1ZSA9IChvcHRpb246IFRPcHRpb24sIHZhbHVlOiBUT3B0aW9uKSA9PlxuICAgIGdldE9wdGlvbktleShvcHRpb24pID09PSBnZXRPcHRpb25LZXkodmFsdWUpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7IGZpZWxkOiBkZXBlbmRlbnRGaWVsZCB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZTogZGVwZW5kc09uLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmVudFZhbHVlUmVmID0gdXNlUmVmPFRPcHRpb24+KGRlcGVuZGVudEZpZWxkLnZhbHVlID8/IG51bGwpO1xuICBjb25zdCBbaGFzQXV0b1NlbGVjdGVkLCBzZXRIYXNBdXRvU2VsZWN0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgKCEhZGVwZW5kZW50RmllbGQudmFsdWUgJiYgcGFyZW50VmFsdWVSZWY/LmN1cnJlbnQgIT09IGRlcGVuZGVudEZpZWxkLnZhbHVlKSB8fFxuICAgICAgZGVwZW5kZW50RmllbGQudmFsdWUgPT09IG51bGxcbiAgICApIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgc2V0SGFzQXV0b1NlbGVjdGVkKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtkZXBlbmRlbnRGaWVsZC52YWx1ZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzRWRpdCAmJiAhZGlzYWJsZWQgJiYgb3B0aW9ucy5sZW5ndGggPT09IDEgJiYgZmllbGQudmFsdWUgPT0gbnVsbCAmJiAhaGFzQXV0b1NlbGVjdGVkKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShnZXRPcHRpb25LZXkob3B0aW9uc1swXSkpO1xuICAgICAgc2V0SGFzQXV0b1NlbGVjdGVkKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgZmllbGQudmFsdWUgPT0gbnVsbCAmJiAhaGFzQXV0b1NlbGVjdGVkKSB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKGdldE9wdGlvbktleShvcHRpb25zWzBdKSk7XG4gICAgICAgIHNldEhhc0F1dG9TZWxlY3RlZCh0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBvcHRpb25zLFxuICAgIGZpZWxkLnZhbHVlLFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGhhc0F1dG9TZWxlY3RlZCxcbiAgICBpc0VkaXQsXG4gICAgZGlzYWJsZWQsXG4gICAgZmllbGQsXG4gICAgZ2V0T3B0aW9uS2V5LFxuICAgIGRlcGVuZGVudEZpZWxkLm9uQ2hhbmdlLFxuICBdKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgdmFsdWU9e1xuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiAoZ2V0T3B0aW9uS2V5KG9wdGlvbikgPT09IGZpZWxkLnZhbHVlID8gb3B0aW9uIDogbnVsbCkpXG4gICAgICAgICAgLmZpbmQoQm9vbGVhbikgfHwgbnVsbFxuICAgICAgfVxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25LZXl9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17aXNPcHRpb25FcXVhbFRvVmFsdWV9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PSBudWxsIHx8IGRpc2FibGVkfVxuICAgICAgb25DaGFuZ2U9eyhldmVudCwgbmV3VmFsdWUsIHJlYXNvbikgPT4ge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSA/IGdldE9wdGlvbktleShuZXdWYWx1ZSkgOiBudWxsKTtcbiAgICAgICAgaWYgKG9uQ2hhbmdlICYmIHR5cGVvZiBvbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlbmRlcklucHV0PXsocGFyYW1zKSA9PiAoXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdCc6IHtcbiAgICAgICAgICAgICAgYmdjb2xvcjpcbiAgICAgICAgICAgICAgICBkaXNhYmxlZCB8fCBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcmIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrJzogeyBjb2xvcjogJ3JlZCcgfSxcbiAgICAgICAgICAgICcmIC5NdWlJbnB1dEJhc2UtaW5wdXQnOiB7XG4gICAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgfHwgZGVwZW5kZW50RmllbGQudmFsdWUgPT0gbnVsbCA/ICdub3QtYWxsb3dlZCcgOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uc3gsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RDYXNjYWRlRWxlbWVudCA9IDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFRPcHRpb24sIFRGaWVsZFZhbHVlcywgVE5hbWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fT5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5TZWxlY3RDYXNjYWRlRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RDYXNjYWRlRWxlbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdENhc2NhZGVFbGVtZW50O1xuIiwiaW1wb3J0IHsgR3JpZCwgdXNlVGhlbWUsIFRleHRGaWVsZCwgQXV0b2NvbXBsZXRlIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgU3hQcm9wcyxcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIEF1dG9jb21wbGV0ZVByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlVmFsdWUsXG4gIEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbixcbiAgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmcsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQge1xuICB1c2VNZW1vLFxuICB0eXBlIEpTWCxcbiAgdXNlRWZmZWN0LFxuICB1c2VDYWxsYmFjayxcbiAgdHlwZSBTeW50aGV0aWNFdmVudCxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnRyb2wsXG4gIHVzZUNvbnRyb2xsZXIsXG4gIHR5cGUgRmllbGRQYXRoLFxuICB0eXBlIEZpZWxkVmFsdWVzLFxuICB0eXBlIFVzZUNvbnRyb2xsZXJQcm9wcyxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgU2VsZWN0RWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRPcHRpb24gLSBUaGUgb3B0aW9uIG9iamVjdCB0eXBlXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBNdWx0aXBsZSAtIFdoZXRoZXIgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBEaXNhYmxlQ2xlYXJhYmxlIC0gV2hldGhlciB0aGUgY2xlYXIgYnV0dG9uIGlzIGRpc2FibGVkXG4gKiBAdGVtcGxhdGUgRnJlZVNvbG8gLSBXaGV0aGVyIGZyZWUgdGV4dCBpbnB1dCBpcyBhbGxvd2VkXG4gKiBAdGVtcGxhdGUgQ2hpcENvbXBvbmVudCAtIFRoZSBjaGlwIGNvbXBvbmVudCB0eXBlIGZvciBtdWx0aXBsZSBzZWxlY3Rpb25cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwW1wiZGVmYXVsdENvbXBvbmVudFwiXVxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gIHwgXCJuYW1lXCJcbiAgfCBcInJlbmRlcklucHV0XCJcbiAgfCBcImlzT3B0aW9uRXF1YWxUb1ZhbHVlXCJcbiAgfCBcImdldE9wdGlvbkxhYmVsXCJcbiAgfCBcImRpc2FibGVkXCJcbj4gJiB7XG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIHJ1bGVzIGZvciB0aGUgZmllbGRcbiAgICogQGV4YW1wbGUgeyByZXF1aXJlZDogJ1BsZWFzZSBzZWxlY3QgYW4gb3B0aW9uJyB9XG4gICAqL1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPltcInJ1bGVzXCJdO1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJjYXRlZ29yeVwiIHwgXCJ1c2VyLmRlcGFydG1lbnRcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIHNlbGVjdCBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkNob29zZSBhbiBvcHRpb24uLi5cIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgbGFiZWwgdGV4dFxuICAgKiBAZXhhbXBsZSBcIkNhdGVnb3J5XCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFRleHRGaWVsZCB2YXJpYW50XG4gICAqIEBkZWZhdWx0VmFsdWUgXCJvdXRsaW5lZFwiXG4gICAqL1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGZvciB0aGUgY29tcG9uZW50XG4gICAqL1xuICBzeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaW4gZWRpdCBtb2RlIChhZmZlY3RzIGF1dG8tc2VsZWN0aW9uIGJlaGF2aW9yKVxuICAgKiBXaGVuIGZhbHNlIGFuZCBvbmx5IG9uZSBvcHRpb24gZXhpc3RzLCB0aGF0IG9wdGlvbiBpcyBhdXRvLXNlbGVjdGVkXG4gICAqIEBkZWZhdWx0VmFsdWUgZmFsc2VcbiAgICovXG4gIGlzRWRpdD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzZWxlY3QgaXMgZGlzYWJsZWRcbiAgICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBuYW1lIGluIG9wdGlvbiBvYmplY3RzIHRvIHVzZSBhcyBkaXNwbGF5IGxhYmVsXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJMYWJlbFwiXG4gICAqIEBleGFtcGxlIFwibmFtZVwiIHwgXCJ0aXRsZVwiXG4gICAqL1xuICBsYWJlbEtleT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBuYW1lIGluIG9wdGlvbiBvYmplY3RzIHRvIHVzZSBhcyB0aGUgdmFsdWVcbiAgICogQGRlZmF1bHRWYWx1ZSBcIlZhbHVlXCJcbiAgICogQGV4YW1wbGUgXCJpZFwiIHwgXCJjb2RlXCJcbiAgICovXG4gIHZhbHVlS2V5Pzoga2V5b2YgVE9wdGlvbjtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgXCJuYW1lXCI+O1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0RWxlbWVudDxcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbXCJkZWZhdWx0Q29tcG9uZW50XCJdXG4+KFxuICBwcm9wczogU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkNoYW5nZSxcbiAgICBpc0VkaXQsXG4gICAgb3B0aW9ucyxcbiAgICBsYWJlbCxcbiAgICBzeCxcbiAgICB2YXJpYW50LFxuICAgIGRpc2FibGVkLFxuICAgIGxhYmVsS2V5ID0gXCJMYWJlbFwiLFxuICAgIHZhbHVlS2V5ID0gXCJWYWx1ZVwiLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09IFwic3RyaW5nXCIpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVLZXldIDogbnVsbDsgLy8gUmV0dXJuIG51bGwgZm9yIGNvbnNpc3RlbmN5XG4gICAgfSxcbiAgICBbdmFsdWVLZXldXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxLZXldKSA6IFwiXCI7XG4gICAgfSxcbiAgICBbbGFiZWxLZXldXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIGV2ZW50OiBTeW50aGV0aWNFdmVudCxcbiAgICBuZXdWYWx1ZTogQXV0b2NvbXBsZXRlVmFsdWU8VE9wdGlvbiwgTXVsdGlwbGUsIERpc2FibGVDbGVhcmFibGUsIEZyZWVTb2xvPixcbiAgICByZWFzb246IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvblxuICApID0+IHtcbiAgICBjb25zdCBvcHRpb24gPSBuZXdWYWx1ZSBhcyBUT3B0aW9uIHwgbnVsbDtcblxuICAgIGZpZWxkLm9uQ2hhbmdlKG9wdGlvbiA/IGdldE9wdGlvblZhbHVlKG9wdGlvbikgOiBudWxsKTtcbiAgICBvbkNoYW5nZT8uKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFpc0VkaXQgJiZcbiAgICAgIG9wdGlvbnMubGVuZ3RoID09PSAxICYmXG4gICAgICAoZmllbGQudmFsdWUgPT0gbnVsbCB8fCBmaWVsZC52YWx1ZSA9PSB1bmRlZmluZWQgfHwgZmllbGQudmFsdWUgPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICBjb25zdCBkZWZhdWx0T3B0aW9uID0gb3B0aW9uc1swXTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGdldE9wdGlvblZhbHVlKGRlZmF1bHRPcHRpb24pO1xuXG4gICAgICBmaWVsZC5vbkNoYW5nZShkZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgfSwgW2lzRWRpdCwgb3B0aW9uc10pO1xuXG4gIGNvbnN0IGF1dG9jb21wbGV0ZVZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgb3B0aW9ucy5maW5kKChvcHRpb24pID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGZpZWxkLnZhbHVlKSA/PyBudWxsLFxuICAgIFtmaWVsZC52YWx1ZSwgb3B0aW9ucywgZ2V0T3B0aW9uVmFsdWVdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9ucz17ZmFsc2V9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgdmFsdWU9e1xuICAgICAgICBhdXRvY29tcGxldGVWYWx1ZSBhcyBBdXRvY29tcGxldGVWYWx1ZTxcbiAgICAgICAgICBUT3B0aW9uLFxuICAgICAgICAgIE11bHRpcGxlLFxuICAgICAgICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgICAgICAgRnJlZVNvbG9cbiAgICAgICAgPlxuICAgICAgfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGdldE9wdGlvbkxhYmVsPXsoXG4gICAgICAgIG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPlxuICAgICAgKSA9PiBnZXRPcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgcmVuZGVySW5wdXQ9eyhwYXJhbXMpID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiXCJ9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6IFwib3V0bGluZWRcIn1cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290XCI6IHtcbiAgICAgICAgICAgICAgYmdjb2xvcjogZGlzYWJsZWRcbiAgICAgICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyBcIm5vdC1hbGxvd2VkXCIgOiBcImRlZmF1bHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5zeCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIEF1dG9jb21wbGV0ZSBjb21wb25lbnQgZm9yIHNlbGVjdGluZyBmcm9tIHByZWRlZmluZWQgb3B0aW9ucy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgc2VsZWN0L2F1dG9jb21wbGV0ZSBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHlcbiAqIHdpdGggcmVhY3QtaG9vay1mb3JtLCBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKiBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRzLiBJdCBzdXBwb3J0cyBib3RoIHNpbmdsZSBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGVzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvY29tcGxldGUgd2l0aCBmaWx0ZXJpbmdcbiAqIC0gU2luZ2xlIGFuZCBtdWx0aXBsZSBzZWxlY3Rpb24gc3VwcG9ydFxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBDdXN0b21pemFibGUgb3B0aW9uIGRpc3BsYXkgKGxhYmVsS2V5L3ZhbHVlS2V5KVxuICogLSBBdXRvLXNlbGVjdGlvbiB3aGVuIG9ubHkgb25lIG9wdGlvbiBleGlzdHNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJjYXRlZ29yeVwiXG4gKiAgIGxhYmVsPVwiQ2F0ZWdvcnlcIlxuICogICBvcHRpb25zPXtbXG4gKiAgICAgeyBMYWJlbDogJ1RlY2hub2xvZ3knLCBWYWx1ZTogJ3RlY2gnIH0sXG4gKiAgICAgeyBMYWJlbDogJ0ZpbmFuY2UnLCBWYWx1ZTogJ2ZpbmFuY2UnIH1cbiAqICAgXX1cbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdQbGVhc2Ugc2VsZWN0IGEgY2F0ZWdvcnknIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGtleXM6XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VySWRcIlxuICogICBsYWJlbD1cIkFzc2lnbiB0byBVc2VyXCJcbiAqICAgb3B0aW9ucz17dXNlcnN9XG4gKiAgIGxhYmVsS2V5PVwiZnVsbE5hbWVcIlxuICogICB2YWx1ZUtleT1cImlkXCJcbiAqICAgcGxhY2Vob2xkZXI9XCJDaG9vc2UgYSB1c2VyLi4uXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogTXVsdGlwbGUgc2VsZWN0aW9uOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidGFnc1wiXG4gKiAgIGxhYmVsPVwiVGFnc1wiXG4gKiAgIG9wdGlvbnM9e2F2YWlsYWJsZVRhZ3N9XG4gKiAgIG11bHRpcGxlXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDggfSB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBUT3B0aW9uIC0gVGhlIG9wdGlvbiBvYmplY3QgdHlwZVxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgTXVsdGlwbGUgLSBXaGV0aGVyIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgRGlzYWJsZUNsZWFyYWJsZSAtIFdoZXRoZXIgdGhlIGNsZWFyIGJ1dHRvbiBpcyBkaXNhYmxlZFxuICogQHRlbXBsYXRlIEZyZWVTb2xvIC0gV2hldGhlciBmcmVlIHRleHQgaW5wdXQgaXMgYWxsb3dlZFxuICogQHRlbXBsYXRlIENoaXBDb21wb25lbnQgLSBUaGUgY2hpcCBjb21wb25lbnQgdHlwZSBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgU2VsZWN0RWxlbWVudCA9IDxcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbXCJkZWZhdWx0Q29tcG9uZW50XCJdXG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgTXVsdGlwbGUsXG4gIERpc2FibGVDbGVhcmFibGUsXG4gIEZyZWVTb2xvLFxuICBDaGlwQ29tcG9uZW50XG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cblNlbGVjdEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIlNlbGVjdEVsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0RWxlbWVudDtcbiIsImltcG9ydCBDaGVja0JveEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveCc7XG5pbXBvcnQgQ2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2tCb3hPdXRsaW5lQmxhbmsnO1xuaW1wb3J0IHR5cGUge1xuICBTeFByb3BzLFxuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbixcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBDaGVja2JveCwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUsIENpcmN1bGFyUHJvZ3Jlc3MgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgSlNYLCBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBQYXRoLCBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzLCBVc2VDb250cm9sbGVyUHJvcHMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuLy9AdHMtbm9jaGVja1xuXG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxudHlwZSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4sXG4gICduYW1lJyB8ICdyZW5kZXJJbnB1dCcgfCAnbXVsdGlwbGUnIHwgJ29uQ2hhbmdlJyB8ICd2YWx1ZSdcbj47XG5cbmV4cG9ydCB0eXBlIFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gdHJ1ZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+ID0gQmFzZUF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4gJiB7XG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+WydydWxlcyddO1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgc3g/OiBTeFByb3BzO1xuICBsYWJlbEtleT86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlS2V5Pzoga2V5b2YgVE9wdGlvbjtcbn07XG5cbnR5cGUgU2VsZWN0TXVsdGlFbGVtZW50Q29tcG9uZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWUsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPihcbiAgcHJvcHM6IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RNdWx0aUVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPihwcm9wczogU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVE9wdGlvbj4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgb3B0aW9ucyxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgdmFyaWFudCxcbiAgICBzeCxcbiAgICBsYWJlbEtleSA9ICdMYWJlbCcsXG4gICAgdmFsdWVLZXkgPSAnVmFsdWUnLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVLZXldIDogbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW2xhYmVsS2V5XSA6ICcnO1xuICB9O1xuXG4gIGNvbnN0IHNlbGVjdGVkVmFsdWUgPVxuICAgIGZpZWxkLnZhbHVlICYmIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICA/IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IGZpZWxkLnZhbHVlLmluY2x1ZGVzKGdldE9wdGlvblZhbHVlKG9wdGlvbikpKVxuICAgICAgOiBbXTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogU3ludGhldGljRXZlbnQsXG4gICAgc2VsZWN0ZWRPcHRpb25zOiBUT3B0aW9uW10sXG4gICAgcmVhc29uOiBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb25cbiAgKSA9PiB7XG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgZmllbGQub25DaGFuZ2UoW10pO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSAnc2VsZWN0T3B0aW9uJyB8fCByZWFzb24gPT09ICdyZW1vdmVPcHRpb24nKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZXMgPSBzZWxlY3RlZE9wdGlvbnMubWFwKChvcHRpb24pID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikpO1xuXG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXMpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBpY29uID0gPENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG4gIGNvbnN0IGNoZWNrZWRJY29uID0gPENoZWNrQm94SWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgdmFsdWU9e3NlbGVjdGVkVmFsdWV9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBkaXNhYmxlQ2xvc2VPblNlbGVjdFxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgPz8gZmllbGQuZGlzYWJsZWR9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25CbHVyPXsoZXZlbnQpID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVuZGVyT3B0aW9uPXsocHJvcHMxLCBvcHRpb24sIHsgc2VsZWN0ZWQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9IHByb3BzMTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIDxDaGVja2JveCBpY29uPXtpY29ufSBjaGVja2VkSWNvbj17Y2hlY2tlZEljb259IGNoZWNrZWQ9e3NlbGVjdGVkfSAvPlxuICAgICAgICAgICAge2dldE9wdGlvbkxhYmVsKG9wdGlvbiBhcyBUT3B0aW9uKX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAgIHJlbmRlcklucHV0PXsocGFyYW1zKSA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz4gOiBudWxsfVxuICAgICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgIC4uLnN4LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuU2VsZWN0TXVsdGlFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdE11bHRpRWxlbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdE11bHRpRWxlbWVudDtcbiIsImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBTeFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgdXNlVGhlbWUsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxuICBVc2VDb250cm9sbGVyUHJvcHNcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlclxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm1cIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRleHRGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmaWVsZFxuICAgKiBAZXhhbXBsZSB7IHJlcXVpcmVkOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsIG1pbkxlbmd0aDogeyB2YWx1ZTogMywgbWVzc2FnZTogJ01pbmltdW0gMyBjaGFyYWN0ZXJzJyB9IH1cbiAgICovXG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wicnVsZXNcIl07XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImZpcnN0TmFtZVwiIHwgXCJ1c2VyLmVtYWlsXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBmaWVsZCBlcnJvciBvYmplY3RcbiAgICogQHJldHVybnMgQ3VzdG9tIGVycm9yIG1lc3NhZ2Ugb3IgY29tcG9uZW50XG4gICAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ3VzdG9tIFRleHRGaWVsZCBjb21wb25lbnQgdG8gdXNlIGluc3RlYWQgb2YgZGVmYXVsdCBNVUkgVGV4dEZpZWxkXG4gICAqL1xuICBjb21wb25lbnQ/OiB0eXBlb2YgVGV4dEZpZWxkO1xuICAvKipcbiAgICogVmFsdWUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGZvciBpbnB1dC9vdXRwdXRcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogaW1wb3J0KFwiLi4vLi4vdHlwZXMvZXZlbnRzXCIpLkV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkVudGVyIHlvdXIgZW1haWxcIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsIFwibmFtZVwiPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBmb3IgdGhlIFRleHRGaWVsZFxuICAgKi9cbiAgc3g/OiBTeFByb3BzO1xufVxuXG50eXBlIFRleHRGaWVsZEVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPihcbiAgcHJvcHM6IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUZXh0RmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4ocHJvcHM6IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBydWxlcyA9IHt9LFxuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIGdyaWRQcm9wcyxcbiAgICB0cmFuc2Zvcm0sXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIHN4LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHJlcXVpcmVkLFxuICAgIGhlbHBlclRleHQsXG4gICAgaW5wdXRSZWYsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIC4uLnJlc3RUZXh0UHJvcHNcbiAgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/PyAoXCJcIiBhcyBUVmFsdWUpO1xuICAgICAgICAgIH0sXG4gICAgICBvdXRwdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0ub3V0cHV0XG4gICAgICAgICAgOiAoZXZlbnRPclZhbHVlOiBpbXBvcnQoXCIuLi8uLi90eXBlcy9ldmVudHNcIikuRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gICAgICAgICAgICAvLyBFeHRyYWN0IHZhbHVlIGZyb20gZXZlbnQgb3IgdXNlIGRpcmVjdCB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgZXh0cmFjdGVkVmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkIFxuICAgICAgICAgICAgICA/IHZhbHVlIFxuICAgICAgICAgICAgICA6ICh0eXBlb2YgZXZlbnRPclZhbHVlID09PSAnb2JqZWN0JyAmJiBldmVudE9yVmFsdWUgIT09IG51bGwgJiYgJ3RhcmdldCcgaW4gZXZlbnRPclZhbHVlICYmIHR5cGVvZiBldmVudE9yVmFsdWUudGFyZ2V0ID09PSAnb2JqZWN0JyAmJiBldmVudE9yVmFsdWUudGFyZ2V0ICE9PSBudWxsICYmICd2YWx1ZScgaW4gZXZlbnRPclZhbHVlLnRhcmdldClcbiAgICAgICAgICAgICAgICA/IChldmVudE9yVmFsdWUudGFyZ2V0IGFzIHsgdmFsdWU6IHVua25vd24gfSkudmFsdWVcbiAgICAgICAgICAgICAgICA6IGV2ZW50T3JWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKHR5cGUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RlZFZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZFZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RlZFZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIE51bWJlcihleHRyYWN0ZWRWYWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZENvbXBvbmVudFxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgIG5hbWU9e2ZpZWxkLm5hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIHRoaXMgd2lsbCBiZSBhIGJyZWFraW5nIGNoYW5nZSBmb3IgYW55b25lIHVzaW5nIHRyYW5zZm9ybS5vdXRwdXRcbiAgICAgICAgLy8gYmVjYXVzZSBub3cgd2UgYXJlIHBhc3NpbmcgZXZlbnQgaW5zdGVhZCBvZiBldmVudC50YXJnZXQudmFsdWUgb3IgK2V2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICBmaWVsZC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogaGVscGVyVGV4dH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogXCJvdXRsaW5lZFwifVxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIHN4PXt7XG4gICAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgLi4uc3gsXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgVGV4dEZpZWxkIGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGFuZCBncmlkIGxheW91dC5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgVGV4dEZpZWxkIHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gc3VwcG9ydFxuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gTnVtYmVyIGlucHV0IGhhbmRsaW5nXG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJmaXJzdE5hbWVcIlxuICogICBsYWJlbD1cIkZpcnN0IE5hbWVcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ0ZpcnN0IG5hbWUgaXMgcmVxdWlyZWQnIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZW1haWxcIlxuICogICBsYWJlbD1cIkVtYWlsXCJcbiAqICAgdHlwZT1cImVtYWlsXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gKiAgICAgcGF0dGVybjogeyB2YWx1ZTogL1xcUytAXFxTK1xcLlxcUysvLCBtZXNzYWdlOiAnSW52YWxpZCBlbWFpbCcgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBOdW1iZXIgaW5wdXQgd2l0aCB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFnZVwiXG4gKiAgIGxhYmVsPVwiQWdlXCJcbiAqICAgdGV4dEZpZWxkUHJvcHM9e3sgdHlwZTogJ251bWJlcicgfX1cbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWU/LnRvU3RyaW5nKCkgfHwgJycsXG4gKiAgICAgb3V0cHV0OiAoZXZlbnQpID0+IHBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgVGV4dEZpZWxkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cblRleHRGaWVsZEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIlRleHRGaWVsZEVsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgVGV4dEZpZWxkRWxlbWVudDtcbiIsImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBTeFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgdXNlVGhlbWUsXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxuICBVc2VDb250cm9sbGVyUHJvcHNcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlclxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZUVuaGFuY2VkVHJhbnNmb3JtLCB0eXBlIEZpZWxkVHlwZSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWRcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4+IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmaWVsZFxuICAgKiBAZXhhbXBsZSB7IHJlcXVpcmVkOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsIG1pbkxlbmd0aDogeyB2YWx1ZTogMywgbWVzc2FnZTogJ01pbmltdW0gMyBjaGFyYWN0ZXJzJyB9IH1cbiAgICovXG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wicnVsZXNcIl07XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImZpcnN0TmFtZVwiIHwgXCJ1c2VyLmVtYWlsXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBmaWVsZCBlcnJvciBvYmplY3RcbiAgICogQHJldHVybnMgQ3VzdG9tIGVycm9yIG1lc3NhZ2Ugb3IgY29tcG9uZW50XG4gICAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ3VzdG9tIFRleHRGaWVsZCBjb21wb25lbnQgdG8gdXNlIGluc3RlYWQgb2YgZGVmYXVsdCBNVUkgVGV4dEZpZWxkXG4gICAqL1xuICBjb21wb25lbnQ/OiB0eXBlb2YgVGV4dEZpZWxkO1xuICAvKipcbiAgICogVmFsdWUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGZvciBpbnB1dC9vdXRwdXRcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGZpZWxkVHlwZSBmb3IgY29tbW9uIHBhdHRlcm5zIG9yIGN1c3RvbSB0cmFuc2Zvcm1zIGZvciBjb21wbGV4IGNhc2VzXG4gICAqL1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgLyoqIFRyYW5zZm9ybSB2YWx1ZSBiZWZvcmUgZGlzcGxheWluZyBpbiBpbnB1dCAqL1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZTtcbiAgICAvKiogVHJhbnNmb3JtIGlucHV0IGV2ZW50IHRvIGZvcm0gdmFsdWUgKi9cbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IGltcG9ydChcIi4uLy4uL3R5cGVzL2V2ZW50c1wiKS5FdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBCdWlsdC1pbiBmaWVsZCB0eXBlIGZvciBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb25cbiAgICogQGV4YW1wbGUgJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAndGltZScgfCAnc2VsZWN0J1xuICAgKi9cbiAgZmllbGRUeXBlPzogRmllbGRUeXBlO1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZSB0byBkaXNwbGF5IHdoZW4gZmllbGQgdmFsdWUgaXMgbnVsbC91bmRlZmluZWRcbiAgICogQGV4YW1wbGUgXCJcIlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVFZhbHVlO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJFbWFpbCBBZGRyZXNzXCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGlucHV0XG4gICAqIEBleGFtcGxlIFwiRW50ZXIgeW91ciBlbWFpbFwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgXCJuYW1lXCI+O1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICAvKipcbiAgICogVGhlIFRleHRGaWVsZCB2YXJpYW50XG4gICAqIEBkZWZhdWx0VmFsdWUgXCJvdXRsaW5lZFwiXG4gICAqL1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGZvciB0aGUgVGV4dEZpZWxkXG4gICAqL1xuICBzeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBDdXN0b20gb25DaGFuZ2UgaGFuZGxlciBjYWxsZWQgYWZ0ZXIgdHJhbnNmb3JtYXRpb25cbiAgICovXG4gIG9uQ2hhbmdlPzogKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGUgZGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyB0cmFuc2Zvcm1hdGlvbiBpc3N1ZXNcbiAgICogQGRlZmF1bHRWYWx1ZSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xuICAgKi9cbiAgZW5hYmxlV2FybmluZ3M/OiBib29sZWFuO1xufVxuXG50eXBlIEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudENvbXBvbmVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbj4oXG4gIHByb3BzOiBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4+KHByb3BzOiBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBydWxlcyA9IHt9LFxuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIGdyaWRQcm9wcyxcbiAgICB0cmFuc2Zvcm0sXG4gICAgZmllbGRUeXBlID0gJ3RleHQnLCAvLyBEZWZhdWx0IHRvIHRleHQgdHlwZVxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgc3gsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIGVuYWJsZVdhcm5pbmdzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcmVxdWlyZWQsXG4gICAgaGVscGVyVGV4dCxcbiAgICBpbnB1dFJlZixcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgLi4ucmVzdFRleHRQcm9wc1xuICB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBydWxlcyxcbiAgfSk7XG5cbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIC8vIFVzZSB0aGUgZW5oYW5jZWQgdHJhbnNmb3JtIGhvb2sgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtID8ge1xuICAgICAgaW5wdXQ6IHRyYW5zZm9ybS5pbnB1dCxcbiAgICAgIG91dHB1dDogdHJhbnNmb3JtLm91dHB1dCxcbiAgICB9IDogdW5kZWZpbmVkLFxuICAgIGZpZWxkVHlwZTogIXRyYW5zZm9ybSA/ICh0eXBlID09PSAnbnVtYmVyJyA/ICdudW1iZXInIDogZmllbGRUeXBlKSA6IHVuZGVmaW5lZCwgLy8gQXV0by1kZXRlY3QgbnVtYmVyIHR5cGVcbiAgICBkZWZhdWx0VmFsdWUsXG4gICAgZW5hYmxlV2FybmluZ3MsXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4ge1xuICAgICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tT25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyAocGFyc2VFcnJvciA/IHBhcnNlRXJyb3IoZXJyb3IpIDogZXJyb3IubWVzc2FnZSkgOiBoZWxwZXJUZXh0fVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiBcIm91dGxpbmVkXCJ9XG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgc3g9e3tcbiAgICAgICAgXCImIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrXCI6IHsgY29sb3I6IFwicmVkXCIgfSxcbiAgICAgICAgXCImIC5NdWlJbnB1dEJhc2UtaW5wdXRcIjoge1xuICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyBcIm5vdC1hbGxvd2VkXCIgOiBcImRlZmF1bHRcIixcbiAgICAgICAgfSxcbiAgICAgICAgYmdjb2xvcjogZGlzYWJsZWRcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAuLi5zeCxcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQW4gZW5oYW5jZWQgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgVGV4dEZpZWxkIGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uLFxuICogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucywgYW5kIGJ1aWx0LWluIGZpZWxkIHR5cGUgaGFuZGxpbmcuXG4gKlxuICogVGhpcyBlbmhhbmNlZCB2ZXJzaW9uIHByb3ZpZGVzIGFsbCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgb3JpZ2luYWwgVGV4dEZpZWxkRWxlbWVudFxuICogcGx1cyBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIHdpdGggbWVtb2l6ZWQgdHJhbnNmb3JtYXRpb25zXG4gKiAtIEJ1aWx0LWluIGZpZWxkIHR5cGUgaGFuZGxpbmcgKG51bWJlciwgdGV4dCwgZXRjLilcbiAqIC0gQmV0dGVyIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGFuZCB0eXBlIHNhZmV0eVxuICogLSBEZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nXG4gKiAtIFN0YWJsZSByZWZlcmVuY2VzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICogLSBFbmhhbmNlZCBlcnJvciBoYW5kbGluZyB3aXRoIGN1c3RvbSBwYXJzZUVycm9yIHN1cHBvcnRcbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZ1xuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBzdXBwb3J0IChiYWNrd2FyZCBjb21wYXRpYmxlKVxuICogLSBCdWlsdC1pbiBmaWVsZCB0eXBlcyBmb3IgY29tbW9uIHBhdHRlcm5zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gRW5oYW5jZWQgVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBPcHRpbWl6ZWQgbnVtYmVyIGlucHV0IGhhbmRsaW5nXG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGJ1aWx0LWluIG51bWJlciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogPEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWdlXCJcbiAqICAgbGFiZWw9XCJBZ2VcIlxuICogICBmaWVsZFR5cGU9XCJudW1iZXJcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ0FnZSBpcyByZXF1aXJlZCcsIG1pbjogeyB2YWx1ZTogMCwgbWVzc2FnZTogJ0FnZSBtdXN0IGJlIHBvc2l0aXZlJyB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8RW5oYW5jZWRUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJlbWFpbFwiXG4gKiAgIGxhYmVsPVwiRW1haWxcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGVtYWlsIGFkZHJlc3NcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ0VtYWlsIGlzIHJlcXVpcmVkJyxcbiAqICAgICBwYXR0ZXJuOiB7IHZhbHVlOiAvXFxTK0BcXFMrXFwuXFxTKy8sIG1lc3NhZ2U6ICdJbnZhbGlkIGVtYWlsJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSB0cmFuc2Zvcm1hdGlvbiAoYmFja3dhcmQgY29tcGF0aWJsZSk6XG4gKiBgYGB0c3hcbiAqIDxFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInByaWNlXCJcbiAqICAgbGFiZWw9XCJQcmljZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID8gYCQke3ZhbHVlfWAgOiAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gcGFyc2VGbG9hdChldmVudC50YXJnZXQudmFsdWUucmVwbGFjZSgnJCcsICcnKSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBlcnJvciBwYXJzaW5nOlxuICogYGBgdHN4XG4gKiA8RW5oYW5jZWRUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VybmFtZVwiXG4gKiAgIGxhYmVsPVwiVXNlcm5hbWVcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiAoXG4gKiAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICdyZWQnIH19PlxuICogICAgICAg4pqg77iPIHtlcnJvci5tZXNzYWdlfVxuICogICAgIDwvc3Bhbj5cbiAqICAgKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5FbmhhbmNlZFRleHRGaWVsZEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIkVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnQ7XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHMsXG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgR3JpZCwgdXNlRm9ya1JlZiwgdXNlVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIFRpbWVQaWNrZXJQcm9wcyxcbiAgVGltZVBpY2tlclNsb3RQcm9wcyxcbiAgVGltZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyBUaW1lUGlja2VyIH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdHlwZSBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkVmFsdWVzLFxuICBVc2VDb250cm9sbGVyUHJvcHMsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgVXNlVHJhbnNmb3JtT3B0aW9ucywgVXNlVHJhbnNmb3JtUmV0dXJuIH0gZnJvbSBcIkAvaG9va3NcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRWYWx1ZUFzRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IFREYXRlXG4pOiBURGF0ZSB8IG51bGwge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKSBhcyBURGF0ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRyYW5zZm9ybTxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+KFxuICBvcHRpb25zOiBVc2VUcmFuc2Zvcm1PcHRpb25zPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbik6IFVzZVRyYW5zZm9ybVJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+IHtcbiAgY29uc3QgdmFsdWUgPVxuICAgIHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBvcHRpb25zLnRyYW5zZm9ybS5pbnB1dChvcHRpb25zLnZhbHVlKVxuICAgICAgOiBvcHRpb25zLnZhbHVlO1xuXG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnRPclZhbHVlOiBpbXBvcnQoXCIuLi8uLi90eXBlcy9ldmVudHNcIikuRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb3B0aW9ucy5vbkNoYW5nZShvcHRpb25zLnRyYW5zZm9ybS5vdXRwdXQoZXZlbnRPclZhbHVlLCB2YWx1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5vbkNoYW5nZShldmVudE9yVmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtvcHRpb25zXVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVBpY2tlckVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2Vcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBpc0RhdGU/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgVGltZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPltcInJ1bGVzXCJdO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBpbnB1dFByb3BzPzogVGV4dEZpZWxkUHJvcHM7XG4gIGhlbHBlclRleHQ/OiBUZXh0RmllbGRQcm9wc1tcImhlbHBlclRleHRcIl07XG4gIGxhYmVsPzogUmVhY3ROb2RlO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgc2xvdFByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyU2xvdFByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgIFwidGV4dEZpZWxkXCJcbiAgPjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZSB8IG51bGw7XG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBpbXBvcnQoXCIuLi8uLi90eXBlcy9ldmVudHNcIikuRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHRpbWVQaWNrZXJQcm9wcz86IE9taXQ8XG4gICAgVGltZVBpY2tlclByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgIFwidmFsdWVcIiB8IFwic2xvdFByb3BzXCJcbiAgPjtcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBzeD86IFN4UHJvcHM7XG59XG5cbnR5cGUgVGltZVBpY2tlckVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlXG4+KFxuICBwcm9wczogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUaW1lUGlja2VyRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGVcbj4ocHJvcHM6IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICByZXF1aXJlZCxcbiAgICBpbnB1dFByb3BzLFxuICAgIGNvbnRyb2wsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHNsb3RQcm9wcyxcbiAgICB0aW1lUGlja2VyUHJvcHMgPSB7fSxcbiAgICB0cmFuc2Zvcm0sXG4gICAgc3gsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgeyBkaXNhYmxlZCwgaW5wdXRSZWYsIG9uQ2xvc2UsIC4uLnJlc3RUaW1lUGlja2VyUHJvcHMgfSA9XG4gICAgdGltZVBpY2tlclByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbiAgfSk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWUgfCBudWxsPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6IChuZXdWYWx1ZSkgPT4gcmVhZFZhbHVlQXNEYXRlKGFkYXB0ZXIsIG5ld1ZhbHVlKSxcbiAgICAgIG91dHB1dDogKGV2ZW50T3JWYWx1ZSwgdmFsdWUpID0+IHtcbiAgICAgICAgLy8gTVVJIERhdGVQaWNrZXIgcGFzc2VzICh2YWx1ZSwgY29udGV4dCksIHNvIHdlIGNoZWNrIHRoZSBzZWNvbmQgcGFyYW1cbiAgICAgICAgY29uc3QgYWN0dWFsVmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBldmVudE9yVmFsdWU7XG4gICAgICAgIGlmIChhY3R1YWxWYWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICByZXR1cm4gYWN0dWFsVmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGltZVBpY2tlclxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRpbWVQaWNrZXJQcm9wc31cbiAgICAgIHsuLi5maWVsZH1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIHsuLi50aW1lUGlja2VyUHJvcHN9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICBvbkNsb3NlPXsoLi4uYXJncykgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgICBvbkNsb3NlKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25DaGFuZ2U9eyhuZXdWYWx1ZSwgY29udGV4dCkgPT4ge1xuICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgICAgIGlmICh0eXBlb2YgdGltZVBpY2tlclByb3BzLm9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aW1lUGlja2VyUHJvcHMub25DaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgc3g9e3tcbiAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnN4LFxuICAgICAgfX1cbiAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICAgIGFjdGlvbnM6IFtcImNsZWFyXCIsIFwiY2FuY2VsXCIsIFwiYWNjZXB0XCJdLFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgICBvbkJsdXI6IChldmVudDogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzPy5vbkJsdXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICBpbnB1dFByb3BzLm9uQmx1cihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogISFlcnJvcixcbiAgICAgICAgICBoZWxwZXJUZXh0OiBlcnJvclxuICAgICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICA6IGlucHV0UHJvcHM/LmhlbHBlclRleHQgfHwgcmVzdC5oZWxwZXJUZXh0LFxuICAgICAgICAgIGlucHV0UHJvcHM6IHtcbiAgICAgICAgICAgIHJlYWRPbmx5OiAhIXRleHRSZWFkT25seSxcbiAgICAgICAgICAgIC4uLmlucHV0UHJvcHM/LmlucHV0UHJvcHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBUaW1lUGlja2VyRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGVcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cblRpbWVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJUaW1lUGlja2VyRWxlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBUaW1lUGlja2VyRWxlbWVudDtcbiIsImltcG9ydCB7IEF1dG9jb21wbGV0ZSwgQ2lyY3VsYXJQcm9ncmVzcywgR3JpZCwgVGV4dEZpZWxkLCB1c2VUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbiB9IGZyb20gXCJAbXVpL21hdGVyaWFsL0F1dG9jb21wbGV0ZVwiO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIFwiQG11aS9tYXRlcmlhbC91dGlsc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICBGcmFnbWVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyLCB0eXBlIEZpZWxkUGF0aCwgdHlwZSBGaWVsZFZhbHVlcyB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBBc3luY1NlbGVjdFBheWxvYWQgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuaW1wb3J0IHR5cGUgeyBBc3luY1NlbGVjdEVsZW1lbnRQcm9wcywgT3B0aW9uT2JqZWN0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQXN5bmNTZWxlY3RFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IFwiVmFsdWVcIixcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gXCJMYWJlbFwiLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT5cbj4ocHJvcHM6IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjb250cm9sLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGluaXRpYWxWYWx1ZSxcbiAgICBsYWJlbCxcbiAgICBxdWVyeUZuLFxuICAgIHZhcmlhbnQsXG4gICAgbGFiZWxLZXkgPSBcIkxhYmVsXCIgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlS2V5ID0gXCJWYWx1ZVwiIGFzIFRWYWx1ZUtleSxcbiAgICBzeCxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbc2VsZWN0ZWRPcHRpb24sIHNldFNlbGVjdGVkT3B0aW9uXSA9IHVzZVN0YXRlPFRPcHRpb24gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IGlucHV0VmFsdWUyOiBzdHJpbmcgPSB1c2VNZW1vKCgpID0+IGlucHV0VmFsdWUsIFtpbnB1dFZhbHVlXSk7XG4gIGNvbnN0IHNldElucHV0VmFsdWUyID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZhbHVlOiBzdHJpbmcpID0+IHNldElucHV0VmFsdWUobmV3VmFsdWUpLFxuICAgIFtdXG4gICk7XG4gIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVN0YXRlPHJlYWRvbmx5IFRPcHRpb25bXT4oW10pO1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZUxvYWRlZCA9IHVzZVJlZjxib29sZWFuPihcbiAgICAhaW5pdGlhbFZhbHVlID8gdHJ1ZSA6ICEoaW5pdGlhbFZhbHVlICE9IG51bGwpXG4gICk7XG5cbiAgY29uc3QgZmllbGRWYWx1ZSA9IHVzZVJlZjxUT3B0aW9uW1RWYWx1ZUtleV0gfCBudWxsPihmaWVsZC52YWx1ZSk7XG5cbiAgY29uc3QgZmV0Y2hEYXRhID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoXG4gICAgICAgIChcbiAgICAgICAgICBwYXlsb2FkOiBBc3luY1NlbGVjdFBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB2b2lkXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Rm4ocGF5bG9hZCkudGhlbigoYykgPT4gY2FsbGJhY2soYykpO1xuICAgICAgICB9LFxuICAgICAgICA0MDBcbiAgICAgICksXG4gICAgW3F1ZXJ5Rm5dXG4gICk7XG5cbiAgY29uc3QgZmlsbE9wdGlvbnMgPSB1c2VDYWxsYmFjaygocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4ge1xuICAgIGxldCBuZXdPcHRpb25zOiByZWFkb25seSBUT3B0aW9uW10gPSBbXTtcblxuICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgbmV3T3B0aW9ucyA9IFtzZWxlY3RlZE9wdGlvbl07XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgIG5ld09wdGlvbnMgPSBbLi4ubmV3T3B0aW9ucywgLi4ucmVzdWx0c107XG4gICAgfVxuXG4gICAgc2V0T3B0aW9ucyhuZXdPcHRpb25zKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgfSwgW3NlbGVjdGVkT3B0aW9uXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5pdGlhbFZhbHVlTG9hZGVkLmN1cnJlbnQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0UGF5bG9hZCA9IHtcbiAgICAgIHF1ZXJ5OiBudWxsLFxuICAgICAgaW5pdGlhbFZhbHVlLFxuICAgIH07XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuXG4gICAgZmV0Y2hEYXRhKHBheWxvYWQsIChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGlmICghIXJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmlsbE9wdGlvbnMocmVzdWx0cz8uZmlsdGVyKChjKSA9PiBjW3ZhbHVlS2V5XSA9PSBpbml0aWFsVmFsdWUpKTtcbiAgICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbihyZXN1bHRzWzBdKTtcbiAgICAgICAgICBmaWVsZC5vbkNoYW5nZShyZXN1bHRzWzBdW3ZhbHVlS2V5XSk7XG4gICAgICAgICAgZmllbGRWYWx1ZS5jdXJyZW50ID0gcmVzdWx0c1swXVt2YWx1ZUtleV07XG4gICAgICAgIH1cblxuICAgICAgICBpbml0aWFsVmFsdWVMb2FkZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtpbml0aWFsVmFsdWUsIGZldGNoRGF0YSwgZmllbGQsIGZpbGxPcHRpb25zLCB2YWx1ZUtleV0pO1xuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICBpZiAoaW5wdXRWYWx1ZTIgPT09IFwiXCIgfHwgaW5pdGlhbFZhbHVlTG9hZGVkLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICBzZXRPcHRpb25zKHNlbGVjdGVkT3B0aW9uID8gW3NlbGVjdGVkT3B0aW9uXSA6IFtdKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChmaWVsZFZhbHVlLmN1cnJlbnQpIHtcbiAgICAgIGlmIChmaWVsZC52YWx1ZSA9PT0gZmllbGRWYWx1ZS5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0UGF5bG9hZCA9IHtcbiAgICAgIHF1ZXJ5OiBpbnB1dFZhbHVlMixcbiAgICAgIGluaXRpYWxWYWx1ZTogbnVsbCxcbiAgICB9O1xuXG4gICAgZmV0Y2hEYXRhKHBheWxvYWQsIChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGZpbGxPcHRpb25zKHJlc3VsdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtpbml0aWFsVmFsdWUsIGlucHV0VmFsdWUyLCBmZXRjaERhdGEsIGZpZWxkLnZhbHVlLCBmaWxsT3B0aW9ucywgc2VsZWN0ZWRPcHRpb25dKTtcblxuICBjb25zdCBzZWxlY3RSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIF86IFJlYWN0LlN5bnRoZXRpY0V2ZW50LFxuICAgIG5ld1NlbGVjdGVkT3B0aW9uOiBUT3B0aW9uIHwgbnVsbCxcbiAgICByZWFzb246IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvblxuICApID0+IHtcbiAgICBpZiAocmVhc29uID09PSBcImNsZWFyXCIpIHtcbiAgICAgIHNldFNlbGVjdGVkT3B0aW9uKG51bGwpO1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gXCJzZWxlY3RPcHRpb25cIiB8fCByZWFzb24gPT09IFwicmVtb3ZlT3B0aW9uXCIpIHtcbiAgICAgIGlmIChuZXdTZWxlY3RlZE9wdGlvbikge1xuICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbihuZXdTZWxlY3RlZE9wdGlvbik7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1NlbGVjdGVkT3B0aW9uW3ZhbHVlS2V5XSk7XG4gICAgICAgIGZpZWxkVmFsdWUuY3VycmVudCA9IG5ld1NlbGVjdGVkT3B0aW9uW3ZhbHVlS2V5XTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0T3B0aW9ucyhbXSk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWZpZWxkLnZhbHVlKSB7XG4gICAgICBzZXRJbnB1dFZhbHVlKFwiXCIpO1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obnVsbCk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtmaWVsZC52YWx1ZV0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bdmFsdWVLZXldKSA6IFwiXCI7XG4gIH07XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEtleV0pIDogXCJcIjtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgcmVmPXtzZWxlY3RSZWZ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBnZXRPcHRpb25LZXk9e2dldE9wdGlvblZhbHVlfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGF1dG9Db21wbGV0ZVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgaW5jbHVkZUlucHV0SW5MaXN0XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZmlsdGVyT3B0aW9ucz17KHgpID0+IHh9XG4gICAgICB2YWx1ZT17c2VsZWN0ZWRPcHRpb259XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbklucHV0Q2hhbmdlPXsoXywgbmV3SW5wdXRWYWx1ZSkgPT4ge1xuICAgICAgICBzZXRJbnB1dFZhbHVlMihuZXdJbnB1dFZhbHVlKTtcbiAgICAgIH19XG4gICAgICBub09wdGlvbnNUZXh0PVwiVHlwZSBTb21ldGhpbmcuLi5cIlxuICAgICAgcmVuZGVySW5wdXQ9eyhwYXJhbXMpID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiXCJ9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxuICAgICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgICA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogXCJvdXRsaW5lZFwifVxuICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyBcIm5vdC1hbGxvd2VkXCIgOiBcImRlZmF1bHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiZ2NvbG9yOiBkaXNhYmxlZFxuICAgICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICAgIC4uLnN4LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgcmVuZGVyT3B0aW9uPXsocmVuZGVyUHJvcHMsIG9wdGlvbikgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9IHJlbmRlclByb3BzO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGxpIGtleT17a2V5fSB7Li4ub3B0aW9uUHJvcHN9PlxuICAgICAgICAgICAge29wdGlvbltsYWJlbEtleV19XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jU2VsZWN0RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBcIlZhbHVlXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IFwiTGFiZWxcIixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+XG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVE9wdGlvblxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj4gey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj4gey4uLnByb3BzfSAvPjtcbn07XG5cbkFzeW5jU2VsZWN0RWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiQXN5bmNTZWxlY3RFbGVtZW50XCI7XG5cbmV4cG9ydCB7IEFzeW5jU2VsZWN0RWxlbWVudCB9O1xuIiwiaW1wb3J0IHsgQXN5bmNNdWx0aVNlbGVjdDIgfSBmcm9tIFwiLi4vQXN5bmNNdWx0aVNlbGVjdDJcIjtcbmltcG9ydCB7IEFzeW5jU2VsZWN0RWxlbWVudCB9IGZyb20gXCIuLi9Bc3luY1NlbGVjdFwiO1xuaW1wb3J0IHsgQ2hlY2tib3hFbGVtZW50IH0gZnJvbSBcIi4uL0NoZWNrYm94RWxlbWVudFwiO1xuaW1wb3J0IHsgQ2hlY2tib3hHcm91cCB9IGZyb20gXCIuLi9DaGVja2JveEdyb3VwXCI7XG5pbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gXCIuLi9EYXRlUGlja2VyRWxlbWVudFwiO1xuaW1wb3J0IHsgUGFzc3dvcmRFbGVtZW50IH0gZnJvbSBcIi4uL1Bhc3N3b3JkRWxlbWVudFwiO1xuaW1wb3J0IHsgUmFkaW9CdXR0b25Hcm91cCB9IGZyb20gXCIuLi9SYWRpb0J1dHRvbkdyb3VwXCI7XG5pbXBvcnQgeyBTZWxlY3RDYXNjYWRlRWxlbWVudCB9IGZyb20gXCIuLi9TZWxlY3RDYXNjYWRlRWxlbWVudFwiO1xuaW1wb3J0IHsgU2VsZWN0RWxlbWVudCB9IGZyb20gXCIuLi9TZWxlY3RFbGVtZW50XCI7XG5pbXBvcnQgeyBTZWxlY3RNdWx0aUVsZW1lbnQgfSBmcm9tIFwiLi4vU2VsZWN0TXVsdGlFbGVtZW50XCI7XG5pbXBvcnQgeyBUZXh0RmllbGRFbGVtZW50IH0gZnJvbSBcIi4uL1RleHRGaWVsZEVsZW1lbnRcIjtcbmltcG9ydCB7IFRpbWVQaWNrZXJFbGVtZW50IH0gZnJvbSBcIi4uL1RpbWVQaWNrZXJFbGVtZW50XCI7XG5cbmNvbnN0IEZpZWxkID0ge1xuICBUZXh0OiBUZXh0RmllbGRFbGVtZW50LFxuICBDaGVja2JveDogQ2hlY2tib3hFbGVtZW50LFxuICBEYXRlOiBEYXRlUGlja2VyRWxlbWVudCxcbiAgUmFkaW9Hcm91cDogUmFkaW9CdXR0b25Hcm91cCxcbiAgUGFzc3dvcmQ6IFBhc3N3b3JkRWxlbWVudCxcbiAgVGltZTogVGltZVBpY2tlckVsZW1lbnQsXG4gIFNlbGVjdDogU2VsZWN0RWxlbWVudCxcbiAgU2VsZWN0TXVsdGk6IFNlbGVjdE11bHRpRWxlbWVudCxcbiAgU2VsZWN0Q2FzY2FkZTogU2VsZWN0Q2FzY2FkZUVsZW1lbnQsXG4gIEFzeW5jU2VsZWN0OiBBc3luY1NlbGVjdEVsZW1lbnQsXG4gIEFzeW5jTXVsdGlTZWxlY3Q6IEFzeW5jTXVsdGlTZWxlY3QyLFxuICBDaGVja2JveEdyb3VwLFxufTtcblxuZXhwb3J0IHsgRmllbGQgfTtcbiJdfQ==