@gnwebsoft/ui 4.0.0 → 4.0.1

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 (54) hide show
  1. package/dist/chunk-246MYJX6.js +479 -0
  2. package/dist/chunk-CE4CSA36.cjs +2262 -0
  3. package/dist/chunk-DJSMLHFO.js +140 -0
  4. package/dist/chunk-GHW77WIM.cjs +72 -0
  5. package/dist/chunk-L3QQX3BK.js +1596 -0
  6. package/dist/chunk-MULSVYFT.js +72 -0
  7. package/dist/chunk-MVPLBJRK.cjs +1 -1
  8. package/dist/chunk-NC3JINIM.cjs +1596 -0
  9. package/dist/chunk-R45OPW5A.js +2262 -0
  10. package/dist/chunk-UEBN47RB.cjs +140 -0
  11. package/dist/chunk-YUVXLOSA.cjs +479 -0
  12. package/dist/core/index.cjs +121 -0
  13. package/dist/core/index.js +121 -0
  14. package/dist/hooks/index.cjs +3 -3
  15. package/dist/hooks/index.js +1 -1
  16. package/dist/index.cjs +81 -7
  17. package/dist/index.js +126 -52
  18. package/dist/types/index.cjs +3 -3
  19. package/dist/types/index.js +1 -1
  20. package/dist/utils/index.cjs +3 -25
  21. package/dist/utils/index.js +3 -25
  22. package/dist/wrappers/index.cjs +4 -4
  23. package/dist/wrappers/index.js +16 -16
  24. package/package.json +22 -17
  25. package/dist/AsyncSelectPayload-B9-6l33R.d.cts +0 -10
  26. package/dist/AsyncSelectPayload-B9-6l33R.d.ts +0 -10
  27. package/dist/chunk-3OPVOWQK.js +0 -140
  28. package/dist/chunk-AEOF2TUF.cjs +0 -2273
  29. package/dist/chunk-ALHC7RLK.js +0 -575
  30. package/dist/chunk-BRRLB22L.js +0 -72
  31. package/dist/chunk-CHZU4PZB.js +0 -2273
  32. package/dist/chunk-EBRUE2WR.cjs +0 -493
  33. package/dist/chunk-HEHPKM4B.cjs +0 -140
  34. package/dist/chunk-K2EJ4YKO.cjs +0 -72
  35. package/dist/chunk-U6SDYCWF.js +0 -493
  36. package/dist/chunk-XY4U6A77.cjs +0 -575
  37. package/dist/components/index.cjs +0 -25
  38. package/dist/components/index.d.cts +0 -752
  39. package/dist/components/index.d.ts +0 -752
  40. package/dist/components/index.js +0 -25
  41. package/dist/enhanced-CDTkKUlj.d.ts +0 -134
  42. package/dist/enhanced-ZQoS03Cd.d.cts +0 -134
  43. package/dist/events-BcHVCLBz.d.cts +0 -77
  44. package/dist/events-BcHVCLBz.d.ts +0 -77
  45. package/dist/hooks/index.d.cts +0 -96
  46. package/dist/hooks/index.d.ts +0 -96
  47. package/dist/index.d.cts +0 -16
  48. package/dist/index.d.ts +0 -16
  49. package/dist/types/index.d.cts +0 -820
  50. package/dist/types/index.d.ts +0 -820
  51. package/dist/utils/index.d.cts +0 -683
  52. package/dist/utils/index.d.ts +0 -683
  53. package/dist/wrappers/index.d.cts +0 -1753
  54. package/dist/wrappers/index.d.ts +0 -1753
@@ -1,2273 +0,0 @@
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==