@gnwebsoft/ui 4.1.2 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/{chunk-KSJAR3NE.cjs → chunk-7AOABVLH.cjs} +137 -79
  2. package/dist/chunk-EQQROKNQ.js +3015 -0
  3. package/dist/chunk-FMN47XRJ.cjs +1 -1
  4. package/dist/{chunk-73DUUDND.cjs → chunk-JCF64O7K.cjs} +38 -11
  5. package/dist/chunk-QYHJIPSZ.cjs +1 -1
  6. package/dist/chunk-VDANRHRZ.js +568 -0
  7. package/dist/chunk-ZZDLWPNL.cjs +1 -1
  8. package/dist/core/index.cjs +1 -1
  9. package/dist/hooks/index.cjs +1 -1
  10. package/dist/index.cjs +16 -4
  11. package/dist/index.js +14 -2
  12. package/dist/types/index.cjs +1 -1
  13. package/dist/utils/fileUtils.d.ts +13 -0
  14. package/dist/utils/fileUtils.d.ts.map +1 -0
  15. package/dist/utils/index.cjs +15 -3
  16. package/dist/utils/index.d.ts +1 -0
  17. package/dist/utils/index.d.ts.map +1 -1
  18. package/dist/utils/index.js +13 -1
  19. package/dist/utils/schemaTools.d.ts.map +1 -1
  20. package/dist/wrappers/AsyncMultiSelect/AsyncMultiSelect.d.ts.map +1 -1
  21. package/dist/wrappers/AsyncMultiSelect/types.d.ts +0 -2
  22. package/dist/wrappers/AsyncMultiSelect/types.d.ts.map +1 -1
  23. package/dist/wrappers/AsyncSelect/index.d.ts.map +1 -1
  24. package/dist/wrappers/AsyncSelect/types.d.ts +0 -2
  25. package/dist/wrappers/AsyncSelect/types.d.ts.map +1 -1
  26. package/dist/wrappers/DatePickerElement/DatePickerElementCore.d.ts.map +1 -1
  27. package/dist/wrappers/DatePickerElement/types.d.ts +9 -18
  28. package/dist/wrappers/DatePickerElement/types.d.ts.map +1 -1
  29. package/dist/wrappers/DateTimePickerElement/DateTimePickerElement.d.ts +0 -2
  30. package/dist/wrappers/DateTimePickerElement/DateTimePickerElement.d.ts.map +1 -1
  31. package/dist/wrappers/FileUploadElement/FileUploadElement.d.ts +2 -0
  32. package/dist/wrappers/FileUploadElement/FileUploadElement.d.ts.map +1 -1
  33. package/dist/wrappers/NumberFieldElement/NumberFieldElement.d.ts +0 -2
  34. package/dist/wrappers/NumberFieldElement/NumberFieldElement.d.ts.map +1 -1
  35. package/dist/wrappers/PasswordElement/PasswordElement.d.ts +0 -2
  36. package/dist/wrappers/PasswordElement/PasswordElement.d.ts.map +1 -1
  37. package/dist/wrappers/PhoneNumberElement/PhoneNumberElement.d.ts +1 -3
  38. package/dist/wrappers/PhoneNumberElement/PhoneNumberElement.d.ts.map +1 -1
  39. package/dist/wrappers/SelectCascadeElement/SelectCascadeElement.d.ts +0 -2
  40. package/dist/wrappers/SelectCascadeElement/SelectCascadeElement.d.ts.map +1 -1
  41. package/dist/wrappers/SelectElement/SelectElement.d.ts +0 -2
  42. package/dist/wrappers/SelectElement/SelectElement.d.ts.map +1 -1
  43. package/dist/wrappers/SelectMultiElement/SelectMultiElement.d.ts +0 -2
  44. package/dist/wrappers/SelectMultiElement/SelectMultiElement.d.ts.map +1 -1
  45. package/dist/wrappers/TextFieldElement/TextFieldElement.d.ts +0 -2
  46. package/dist/wrappers/TextFieldElement/TextFieldElement.d.ts.map +1 -1
  47. package/dist/wrappers/TimePickerElement/TimePickerElement.d.ts +0 -2
  48. package/dist/wrappers/TimePickerElement/TimePickerElement.d.ts.map +1 -1
  49. package/dist/wrappers/index.cjs +4 -4
  50. package/dist/wrappers/index.js +2 -2
  51. package/package.json +1 -1
  52. package/dist/chunk-AHYFDQIK.js +0 -2957
  53. package/dist/chunk-N37HXJT5.js +0 -541
  54. package/dist/core/components/FieldTooltip/FieldTooltip.d.ts +0 -15
  55. package/dist/core/components/FieldTooltip/FieldTooltip.d.ts.map +0 -1
  56. package/dist/core/components/FieldTooltip/index.d.ts +0 -2
  57. package/dist/core/components/FieldTooltip/index.d.ts.map +0 -1
@@ -1,2957 +0,0 @@
1
- import {
2
- useEnhancedTransform,
3
- useTransform
4
- } from "./chunk-PW777IOX.js";
5
- import {
6
- readValueAsDate
7
- } from "./chunk-N37HXJT5.js";
8
-
9
- // src/wrappers/types/common.ts
10
- function isValidOption(value) {
11
- return typeof value === "object" && value !== null && "Label" in value && "Value" in value && typeof value.Label === "string" && (typeof value.Value === "string" || typeof value.Value === "number" || typeof value.Value === "boolean");
12
- }
13
- function normalizeOptions(options, labelField = "Label", valueField = "Value") {
14
- return options.map((option) => ({
15
- Label: String(option[labelField] ?? ""),
16
- Value: option[valueField],
17
- disabled: Boolean(option.disabled)
18
- }));
19
- }
20
-
21
- // src/wrappers/AsyncMultiSelect/AsyncMultiSelect.tsx
22
- import {
23
- Autocomplete,
24
- CircularProgress,
25
- debounce,
26
- Grid,
27
- TextField,
28
- useTheme
29
- } from "@mui/material";
30
- import match from "autosuggest-highlight/match";
31
- import parse from "autosuggest-highlight/parse";
32
- import {
33
- useState,
34
- useRef,
35
- useMemo,
36
- useEffect,
37
- useCallback,
38
- Fragment
39
- } from "react";
40
- import { useController } from "react-hook-form";
41
-
42
- // src/core/components/FieldTooltip/FieldTooltip.tsx
43
- import { Stack, Tooltip, Typography } from "@mui/material";
44
- import { jsx, jsxs } from "react/jsx-runtime";
45
- var FieldTooltip = ({ tooltipSlot, children }) => {
46
- if (!tooltipSlot) return children;
47
- const {
48
- text,
49
- primary: description,
50
- secondary: example,
51
- tooltipProps
52
- } = tooltipSlot;
53
- const title = text ?? (description || example ? /* @__PURE__ */ jsxs(Stack, { spacing: 0.5, children: [
54
- description && /* @__PURE__ */ jsx(Typography, { variant: "caption", children: description }),
55
- example && /* @__PURE__ */ jsxs(Typography, { variant: "caption", sx: { opacity: 0.75 }, children: [
56
- "e.g. ",
57
- example
58
- ] })
59
- ] }) : null);
60
- if (!title) return children;
61
- return /* @__PURE__ */ jsx(Tooltip, { title, arrow: true, placement: "top", ...tooltipProps, children });
62
- };
63
-
64
- // src/wrappers/AsyncMultiSelect/AsyncMultiSelect.tsx
65
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
66
- var Component = function AsyncSelectMultiElement(props) {
67
- const {
68
- name,
69
- disabled,
70
- control,
71
- placeholder,
72
- label,
73
- queryFn,
74
- variant,
75
- labelField = "Label",
76
- valueField = "Value",
77
- tooltipSlot = {},
78
- ...rest
79
- } = props;
80
- const {
81
- field,
82
- fieldState: { error }
83
- } = useController({
84
- name,
85
- control
86
- });
87
- const theme = useTheme();
88
- const [selectedOptions, setSelectedOptions] = useState([]);
89
- const [inputValue, setInputValue] = useState("");
90
- const [options, setOptions] = useState([]);
91
- const [loading, setLoading] = useState(false);
92
- const loadedValuesRef = useRef([]);
93
- const isInitialPopulationActive = useRef(false);
94
- const lastFetchedSearchTermRef = useRef(null);
95
- const initialLoadCompleteRef = useRef(false);
96
- const selectedOptionsRef = useRef([]);
97
- const getOptionValue = useCallback(
98
- (option) => option ? String(option[valueField]) : "",
99
- [valueField]
100
- );
101
- const getOptionLabel = useCallback(
102
- (option) => option ? String(option[labelField]) : "",
103
- [labelField]
104
- );
105
- const fetchData = useMemo(
106
- () => debounce(
107
- (payload, callback) => {
108
- queryFn(payload).then((c) => {
109
- if (Array.isArray(c)) {
110
- callback(c);
111
- } else if (c && Array.isArray(c.data)) {
112
- callback(
113
- c.data
114
- );
115
- } else if (c && Array.isArray(c.Data)) {
116
- callback(
117
- c.Data
118
- );
119
- } else {
120
- callback([]);
121
- }
122
- });
123
- },
124
- 400
125
- ),
126
- [queryFn]
127
- );
128
- useEffect(() => {
129
- selectedOptionsRef.current = selectedOptions;
130
- }, [selectedOptions]);
131
- useEffect(() => {
132
- const formValues = Array.isArray(field.value) ? field.value : [];
133
- if (initialLoadCompleteRef.current && JSON.stringify(formValues) === JSON.stringify(loadedValuesRef.current)) {
134
- return;
135
- }
136
- if (formValues.length === 0) {
137
- setSelectedOptions([]);
138
- setOptions([]);
139
- loadedValuesRef.current = [];
140
- lastFetchedSearchTermRef.current = null;
141
- initialLoadCompleteRef.current = true;
142
- return;
143
- }
144
- let active = true;
145
- setLoading(true);
146
- isInitialPopulationActive.current = true;
147
- loadedValuesRef.current = formValues;
148
- initialLoadCompleteRef.current = true;
149
- fetchData({ Query: null, SelectedValue: formValues }, (results) => {
150
- if (active) {
151
- const fetchedOptions = results || [];
152
- setSelectedOptions([...fetchedOptions]);
153
- setOptions(fetchedOptions);
154
- }
155
- setLoading(false);
156
- isInitialPopulationActive.current = false;
157
- });
158
- return () => {
159
- active = false;
160
- };
161
- }, [field.value, fetchData]);
162
- useEffect(() => {
163
- if (isInitialPopulationActive.current || !initialLoadCompleteRef.current) {
164
- return;
165
- }
166
- if (!inputValue) {
167
- if (selectedOptionsRef.current.length === 0) {
168
- setOptions([]);
169
- } else {
170
- setOptions(selectedOptionsRef.current);
171
- }
172
- lastFetchedSearchTermRef.current = null;
173
- return;
174
- }
175
- if (inputValue === lastFetchedSearchTermRef.current) {
176
- return;
177
- }
178
- let active = true;
179
- setLoading(true);
180
- fetchData({ Query: inputValue, SelectedValue: null }, (searchResults) => {
181
- if (active) {
182
- const results = searchResults || [];
183
- const currentSelected = selectedOptionsRef.current;
184
- const selectedOptionIds = new Set(
185
- currentSelected.map((opt) => getOptionValue(opt))
186
- );
187
- const combined = [...currentSelected];
188
- results.forEach((result) => {
189
- if (!selectedOptionIds.has(getOptionValue(result))) {
190
- combined.push(result);
191
- }
192
- });
193
- setOptions(combined);
194
- lastFetchedSearchTermRef.current = inputValue;
195
- }
196
- setLoading(false);
197
- });
198
- return () => {
199
- active = false;
200
- };
201
- }, [inputValue, fetchData, getOptionValue]);
202
- const handleChange = (_, newSelectedOptions) => {
203
- setSelectedOptions(newSelectedOptions);
204
- const newValues = newSelectedOptions.map((c) => c[valueField]);
205
- field.onChange(newValues.length === 0 ? null : newValues);
206
- loadedValuesRef.current = newValues;
207
- setOptions(newSelectedOptions);
208
- setInputValue("");
209
- lastFetchedSearchTermRef.current = null;
210
- };
211
- const isDisabled = useMemo(() => {
212
- return disabled ?? false;
213
- }, [disabled]);
214
- return /* @__PURE__ */ jsx2(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx2(
215
- Autocomplete,
216
- {
217
- multiple: true,
218
- loading,
219
- getOptionLabel,
220
- isOptionEqualToValue: (option, val) => getOptionValue(option) === getOptionValue(val),
221
- options,
222
- value: selectedOptions,
223
- disabled,
224
- filterSelectedOptions: true,
225
- filterOptions: (x) => x,
226
- noOptionsText: "Type Something...",
227
- onChange: handleChange,
228
- sx: {
229
- "&.Mui-disabled": {
230
- cursor: "not-allowed !important"
231
- },
232
- "& .MuiInputBase-root.Mui-disabled": {
233
- backgroundColor: theme.palette.action.disabledBackground,
234
- cursor: "not-allowed !important"
235
- },
236
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
237
- cursor: "not-allowed !important"
238
- },
239
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
240
- borderColor: error ? "red" : void 0
241
- },
242
- "& .MuiFilledInput-root.Mui-disabled": {
243
- borderColor: error ? "red" : void 0
244
- }
245
- },
246
- onInputChange: (_, newInputValue) => setInputValue(newInputValue),
247
- renderInput: (params) => /* @__PURE__ */ jsx2(
248
- TextField,
249
- {
250
- ...params,
251
- label,
252
- error: !!error,
253
- helperText: error ? error.message : "",
254
- placeholder,
255
- InputProps: {
256
- ...params.InputProps,
257
- endAdornment: /* @__PURE__ */ jsxs2(Fragment, { children: [
258
- loading ? /* @__PURE__ */ jsx2(CircularProgress, { color: "inherit", size: 20 }) : null,
259
- params.InputProps.endAdornment
260
- ] })
261
- },
262
- variant: variant ? variant : "outlined"
263
- }
264
- ),
265
- renderOption: (props2, option, state) => {
266
- const { key, ...optionProps } = props2;
267
- const optionLabel = getOptionLabel(option);
268
- const matches = match(optionLabel, state.inputValue, {
269
- insideWords: true
270
- });
271
- const parts = parse(optionLabel, matches);
272
- return /* @__PURE__ */ jsx2("li", { ...optionProps, children: /* @__PURE__ */ jsx2("div", { children: parts.map((part, index) => /* @__PURE__ */ jsx2(
273
- "span",
274
- {
275
- style: {
276
- fontWeight: part.highlight ? 700 : 400
277
- },
278
- children: part.text
279
- },
280
- index
281
- )) }) }, key);
282
- },
283
- ...rest
284
- }
285
- ) });
286
- };
287
- var AsyncSelectMultiElement2 = ({
288
- gridProps,
289
- ...props
290
- }) => {
291
- if (gridProps) {
292
- return /* @__PURE__ */ jsx2(
293
- Grid,
294
- {
295
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
296
- children: /* @__PURE__ */ jsx2(
297
- Component,
298
- {
299
- ...props
300
- }
301
- )
302
- }
303
- );
304
- }
305
- return /* @__PURE__ */ jsx2(Component, { ...props });
306
- };
307
- AsyncSelectMultiElement2.displayName = "AsyncSelectMulti";
308
-
309
- // src/wrappers/CheckboxElement/CheckboxElement.tsx
310
- import {
311
- Checkbox,
312
- FormControl,
313
- FormControlLabel,
314
- FormGroup,
315
- FormHelperText,
316
- Grid as Grid2
317
- } from "@mui/material";
318
- import { useController as useController2 } from "react-hook-form";
319
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
320
- var Component2 = function CheckboxElement(props) {
321
- const {
322
- name,
323
- control,
324
- label,
325
- labelProps,
326
- helperText,
327
- parseError,
328
- transform,
329
- disabled,
330
- onChange: customOnChange,
331
- ...rest
332
- } = props;
333
- const {
334
- field,
335
- fieldState: { error }
336
- } = useController2({
337
- name,
338
- control,
339
- disabled
340
- });
341
- if (field.value == null || field.value == void 0) {
342
- field.onChange(false);
343
- }
344
- const customOutputTransform = transform?.output;
345
- const { value, onChange } = useTransform({
346
- value: field.value,
347
- onChange: field.onChange,
348
- transform: {
349
- input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
350
- output: typeof customOutputTransform === "function" ? (eventOrValue, _value) => {
351
- const event = eventOrValue;
352
- const checked = _value;
353
- return customOutputTransform(event, checked);
354
- } : (eventOrValue, _value) => {
355
- const checked = _value;
356
- return checked;
357
- }
358
- }
359
- });
360
- const handleChange = (event, checked) => {
361
- onChange(event, checked);
362
- if (typeof customOnChange === "function") {
363
- customOnChange(event, checked);
364
- }
365
- };
366
- const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
367
- return /* @__PURE__ */ jsxs3(FormControl, { error: !!error, disabled, children: [
368
- /* @__PURE__ */ jsx3(FormGroup, { row: true, children: /* @__PURE__ */ jsx3(
369
- FormControlLabel,
370
- {
371
- label: label || "",
372
- ...labelProps,
373
- disabled,
374
- control: /* @__PURE__ */ jsx3(
375
- Checkbox,
376
- {
377
- ...rest,
378
- color: rest.color || "primary",
379
- checked: value,
380
- disabled,
381
- onChange: handleChange,
382
- ref: field.ref
383
- }
384
- )
385
- }
386
- ) }),
387
- (displayError || helperText) && /* @__PURE__ */ jsx3(FormHelperText, { error: !!error, children: displayError || helperText })
388
- ] });
389
- };
390
- var CheckboxElement2 = ({
391
- gridProps = {},
392
- ...props
393
- }) => {
394
- return /* @__PURE__ */ jsx3(Grid2, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx3(Component2, { ...props }) });
395
- };
396
-
397
- // src/wrappers/CheckboxGroup/CheckboxGroup.tsx
398
- import {
399
- Checkbox as Checkbox2,
400
- FormControl as FormControl2,
401
- FormControlLabel as FormControlLabel2,
402
- FormGroup as FormGroup2,
403
- FormHelperText as FormHelperText2,
404
- FormLabel,
405
- Grid as Grid3
406
- } from "@mui/material";
407
- import { useCallback as useCallback2 } from "react";
408
- import { useController as useController3 } from "react-hook-form";
409
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
410
- var Component3 = function CheckboxGroup(props) {
411
- const {
412
- name,
413
- control,
414
- label,
415
- required,
416
- formLabelProps,
417
- labelProps,
418
- labelKey = "Label",
419
- valueKey = "Value",
420
- options,
421
- ...rest
422
- } = props;
423
- const {
424
- field,
425
- fieldState: { error }
426
- } = useController3({
427
- name,
428
- control,
429
- disabled: rest.disabled
430
- });
431
- const selectedValuesAsString = (Array.isArray(field.value) ? field.value : []).map(String);
432
- const handleChange = useCallback2(
433
- (event) => {
434
- const changedValueString = event.target.value;
435
- const isChecked = event.target.checked;
436
- const newSelectedValuesString = isChecked ? [...selectedValuesAsString, changedValueString] : selectedValuesAsString.filter((v) => v !== changedValueString);
437
- const optionsAreNumeric = options.length > 0 && typeof options[0][valueKey] === "number";
438
- if (optionsAreNumeric) {
439
- const newValuesAsNumbers = newSelectedValuesString.map((v) => parseInt(v, 10)).filter((v) => !isNaN(v));
440
- field.onChange(newValuesAsNumbers);
441
- } else {
442
- field.onChange(newSelectedValuesString);
443
- }
444
- },
445
- [field, options, valueKey, selectedValuesAsString]
446
- );
447
- return /* @__PURE__ */ jsxs4(FormControl2, { error: !!error, children: [
448
- label && /* @__PURE__ */ jsx4(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
449
- /* @__PURE__ */ jsx4(FormGroup2, { row: true, children: options && options.map((option) => /* @__PURE__ */ jsx4(
450
- FormControlLabel2,
451
- {
452
- label: option[labelKey],
453
- ...labelProps,
454
- control: /* @__PURE__ */ jsx4(
455
- Checkbox2,
456
- {
457
- ...rest,
458
- color: rest.color || "primary",
459
- value: option[valueKey],
460
- checked: selectedValuesAsString.includes(
461
- String(option[valueKey])
462
- ),
463
- onChange: handleChange
464
- }
465
- )
466
- },
467
- `${option[valueKey]}`
468
- )) }),
469
- error && /* @__PURE__ */ jsx4(FormHelperText2, { error: !!error, children: error.message })
470
- ] });
471
- };
472
- var CheckboxGroupElement = ({
473
- gridProps = {},
474
- ...props
475
- }) => {
476
- return /* @__PURE__ */ jsx4(Grid3, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx4(Component3, { ...props }) });
477
- };
478
- CheckboxGroupElement.displayName = "CheckboxGroup";
479
-
480
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
481
- import { Grid as Grid4 } from "@mui/material";
482
- import { forwardRef as forwardRef2 } from "react";
483
-
484
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
485
- import { useForkRef } from "@mui/material";
486
- import { DatePicker } from "@mui/x-date-pickers";
487
- import { forwardRef, useCallback as useCallback4, useMemo as useMemo5 } from "react";
488
- import { useController as useController4 } from "react-hook-form";
489
-
490
- // src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
491
- import { useLocalizationContext } from "@mui/x-date-pickers/internals";
492
- import { useCallback as useCallback3, useMemo as useMemo2 } from "react";
493
- function readDatePickerValueAsDate(adapter, value) {
494
- if (value === null || value === void 0) {
495
- return null;
496
- }
497
- if (typeof value === "string") {
498
- if (value === "") {
499
- return null;
500
- }
501
- const parsedDate = adapter.utils.date(value);
502
- return parsedDate;
503
- }
504
- return value;
505
- }
506
- function useDatePickerValue(options) {
507
- const { field, transform } = options;
508
- const adapter = useLocalizationContext();
509
- const value = useMemo2(() => {
510
- if (typeof transform?.input === "function") {
511
- return transform.input(field.value);
512
- }
513
- return readDatePickerValueAsDate(adapter, field.value);
514
- }, [field.value, transform?.input, adapter]);
515
- const onChange = useCallback3(
516
- (newValue, context) => {
517
- if (typeof transform?.output === "function") {
518
- const transformedValue = transform.output(newValue, context);
519
- field.onChange(transformedValue);
520
- } else {
521
- field.onChange(newValue);
522
- }
523
- },
524
- // eslint-disable-next-line react-hooks/exhaustive-deps
525
- [field.onChange, transform?.output]
526
- );
527
- return {
528
- value,
529
- onChange
530
- };
531
- }
532
-
533
- // src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
534
- import { useMemo as useMemo3 } from "react";
535
- var DEFAULT_ERROR_MESSAGES = {
536
- invalidDate: "Please enter a valid date",
537
- minDate: "Date must be after the minimum allowed date",
538
- maxDate: "Date must be before the maximum allowed date",
539
- disabledDate: "This date is not allowed",
540
- required: "This field is required"
541
- };
542
- function useDatePickerValidation(options) {
543
- const { fieldState, validation, parseError, value } = options;
544
- const validationResult = useMemo3(() => {
545
- const { error: fieldError, invalid } = fieldState;
546
- let currentError = fieldError;
547
- if (!fieldError && value && validation) {
548
- const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
549
- if (minDate && value < minDate) {
550
- currentError = {
551
- type: "minDate",
552
- message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
553
- };
554
- } else if (maxDate && value > maxDate) {
555
- currentError = {
556
- type: "maxDate",
557
- message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
558
- };
559
- } else if (shouldDisableDate && shouldDisableDate(value)) {
560
- currentError = {
561
- type: "disabledDate",
562
- message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
563
- };
564
- }
565
- }
566
- const hasError = Boolean(currentError);
567
- return {
568
- hasError,
569
- error: currentError,
570
- invalid: invalid || hasError
571
- };
572
- }, [fieldState, validation, value]);
573
- const errorMessage = useMemo3(() => {
574
- if (!validationResult.error) {
575
- return null;
576
- }
577
- if (parseError) {
578
- return parseError(validationResult.error);
579
- }
580
- if (typeof validationResult.error === "string") {
581
- return validationResult.error;
582
- }
583
- if ("message" in validationResult.error && validationResult.error.message) {
584
- return validationResult.error.message;
585
- }
586
- if ("type" in validationResult.error) {
587
- const errorType = validationResult.error.type;
588
- switch (errorType) {
589
- case "required":
590
- return DEFAULT_ERROR_MESSAGES.required;
591
- case "minDate":
592
- return DEFAULT_ERROR_MESSAGES.minDate;
593
- case "maxDate":
594
- return DEFAULT_ERROR_MESSAGES.maxDate;
595
- case "disabledDate":
596
- return DEFAULT_ERROR_MESSAGES.disabledDate;
597
- case "invalidDate":
598
- default:
599
- return DEFAULT_ERROR_MESSAGES.invalidDate;
600
- }
601
- }
602
- return DEFAULT_ERROR_MESSAGES.invalidDate;
603
- }, [validationResult.error, parseError]);
604
- return {
605
- ...validationResult,
606
- errorMessage
607
- };
608
- }
609
-
610
- // src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
611
- import { useTheme as useTheme2 } from "@mui/material";
612
- import { useMemo as useMemo4 } from "react";
613
- function useDatePickerStyles(options = {}) {
614
- const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
615
- const theme = useTheme2();
616
- const computedSx = useMemo4(() => {
617
- const baseStyles = {
618
- // Input field styling
619
- "& .MuiOutlinedInput-root": {
620
- backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
621
- // Transition for smooth state changes
622
- transition: theme.transitions.create([
623
- "background-color",
624
- "border-color",
625
- "color"
626
- ], {
627
- duration: theme.transitions.duration.short
628
- }),
629
- // Error state styling
630
- ...hasError && {
631
- borderColor: theme.palette.error.main,
632
- "&:hover": {
633
- borderColor: theme.palette.error.main
634
- },
635
- "&.Mui-focused": {
636
- borderColor: theme.palette.error.main,
637
- boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
638
- // 25 is 15% opacity in hex
639
- }
640
- },
641
- // Loading state styling
642
- ...loading && {
643
- opacity: 0.7,
644
- pointerEvents: "none"
645
- }
646
- },
647
- // Input element styling
648
- "& .MuiInputBase-input": {
649
- cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
650
- // Read-only specific styling
651
- ...textReadOnly && !disabled && {
652
- cursor: "pointer",
653
- userSelect: "none",
654
- caretColor: "transparent"
655
- // Hide text cursor in read-only mode
656
- },
657
- // Loading state
658
- ...loading && {
659
- cursor: "wait"
660
- }
661
- },
662
- // Required field asterisk styling
663
- "& .MuiInputLabel-asterisk": {
664
- color: theme.palette.error.main,
665
- fontSize: "1.2em"
666
- },
667
- // Label styling with better contrast
668
- "& .MuiInputLabel-root": {
669
- color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
670
- // Ensure proper contrast for disabled state
671
- ...disabled && {
672
- color: theme.palette.text.disabled
673
- }
674
- },
675
- // Helper text styling
676
- "& .MuiFormHelperText-root": {
677
- marginLeft: theme.spacing(1),
678
- marginRight: theme.spacing(1),
679
- // Error state
680
- ...hasError && {
681
- color: theme.palette.error.main
682
- }
683
- },
684
- // Calendar icon styling
685
- "& .MuiInputAdornment-root": {
686
- color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
687
- },
688
- // Focus ring for accessibility
689
- "& .MuiOutlinedInput-root.Mui-focused": {
690
- outline: `2px solid ${theme.palette.primary.main}50`,
691
- // 50 is 31% opacity
692
- outlineOffset: "2px"
693
- },
694
- // Enhanced contrast for dark themes
695
- ...theme.palette.mode === "dark" && {
696
- "& .MuiOutlinedInput-root": {
697
- borderWidth: 2
698
- }
699
- }
700
- };
701
- return customSx ? [baseStyles, customSx] : baseStyles;
702
- }, [
703
- theme,
704
- disabled,
705
- hasError,
706
- loading,
707
- textReadOnly,
708
- customSx
709
- ]);
710
- const className = useMemo4(() => {
711
- const classes = [];
712
- if (disabled) classes.push("DatePickerElement--disabled");
713
- if (hasError) classes.push("DatePickerElement--error");
714
- if (loading) classes.push("DatePickerElement--loading");
715
- if (textReadOnly) classes.push("DatePickerElement--readOnly");
716
- return classes.length > 0 ? classes.join(" ") : void 0;
717
- }, [disabled, hasError, loading, textReadOnly]);
718
- return {
719
- sx: computedSx,
720
- className
721
- };
722
- }
723
-
724
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
725
- import { jsx as jsx5 } from "react/jsx-runtime";
726
- var DatePickerElementCore = forwardRef(
727
- (props, ref) => {
728
- const {
729
- name,
730
- required = false,
731
- control,
732
- parseError,
733
- transform,
734
- validation,
735
- label,
736
- placeholder,
737
- textReadOnly = false,
738
- helperText,
739
- inputProps = {},
740
- slotProps = {},
741
- datePickerProps = {},
742
- variant = "outlined",
743
- loading = false,
744
- LoadingComponent,
745
- tooltipSlot = {},
746
- ...restProps
747
- } = props;
748
- const {
749
- disabled,
750
- inputRef: externalInputRef,
751
- onClose,
752
- ...restDatePickerProps
753
- } = datePickerProps;
754
- const { field, fieldState } = useController4({
755
- name,
756
- control,
757
- defaultValue: null
758
- // Let react-hook-form handle the default value typing
759
- });
760
- const { value, onChange: onValueChange } = useDatePickerValue({
761
- field,
762
- transform
763
- });
764
- const { hasError, errorMessage, invalid } = useDatePickerValidation({
765
- fieldState,
766
- validation,
767
- parseError,
768
- value
769
- });
770
- const { className } = useDatePickerStyles({
771
- disabled,
772
- hasError,
773
- loading,
774
- textReadOnly
775
- });
776
- const handleInputRef = useForkRef(field.ref, externalInputRef);
777
- const handleChange = useCallback4(
778
- (newValue, context) => {
779
- onValueChange(newValue, context);
780
- },
781
- [onValueChange]
782
- );
783
- const handleClose = useCallback4(
784
- (...args) => {
785
- field.onBlur();
786
- if (onClose) {
787
- onClose(...args);
788
- }
789
- },
790
- // eslint-disable-next-line react-hooks/exhaustive-deps
791
- [field.onBlur, onClose]
792
- );
793
- const handleTextFieldBlur = useCallback4(
794
- (event) => {
795
- field.onBlur();
796
- if (typeof inputProps.onBlur === "function") {
797
- inputProps.onBlur(event);
798
- }
799
- },
800
- // eslint-disable-next-line react-hooks/exhaustive-deps
801
- [field.onBlur, inputProps.onBlur]
802
- );
803
- const memoizedSlotProps = useMemo5(
804
- () => ({
805
- ...slotProps,
806
- actionBar: {
807
- actions: ["clear", "today", "cancel", "accept"],
808
- ...slotProps.actionBar
809
- },
810
- textField: {
811
- ...inputProps,
812
- required,
813
- placeholder,
814
- fullWidth: true,
815
- variant,
816
- onBlur: handleTextFieldBlur,
817
- error: hasError,
818
- helperText: hasError ? errorMessage : helperText,
819
- inputProps: {
820
- readOnly: textReadOnly,
821
- "aria-invalid": invalid,
822
- "aria-describedby": hasError ? `${name}-error` : void 0,
823
- ...inputProps.inputProps
824
- },
825
- // Add loading indicator if provided
826
- ...loading && LoadingComponent && {
827
- InputProps: {
828
- endAdornment: /* @__PURE__ */ jsx5(LoadingComponent, {}),
829
- ...inputProps.InputProps
830
- }
831
- },
832
- ...slotProps.textField
833
- }
834
- }),
835
- [
836
- slotProps,
837
- inputProps,
838
- required,
839
- placeholder,
840
- variant,
841
- handleTextFieldBlur,
842
- hasError,
843
- errorMessage,
844
- helperText,
845
- textReadOnly,
846
- invalid,
847
- name,
848
- loading,
849
- LoadingComponent
850
- ]
851
- );
852
- return /* @__PURE__ */ jsx5(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx5(
853
- DatePicker,
854
- {
855
- ...restProps,
856
- ...restDatePickerProps,
857
- ref,
858
- name,
859
- value,
860
- onChange: handleChange,
861
- onClose: handleClose,
862
- inputRef: handleInputRef,
863
- label,
864
- disabled,
865
- className,
866
- slotProps: memoizedSlotProps,
867
- "aria-invalid": invalid,
868
- "aria-describedby": hasError ? `${name}-error` : void 0
869
- }
870
- ) });
871
- }
872
- );
873
- DatePickerElementCore.displayName = "DatePickerElementCore";
874
-
875
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
876
- import { jsx as jsx6 } from "react/jsx-runtime";
877
- var DatePickerElement = forwardRef2((props, ref) => {
878
- const {
879
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
880
- ...coreProps
881
- } = props;
882
- if (gridProps === false) {
883
- return /* @__PURE__ */ jsx6(
884
- DatePickerElementCore,
885
- {
886
- ref,
887
- ...coreProps
888
- }
889
- );
890
- }
891
- return /* @__PURE__ */ jsx6(
892
- Grid4,
893
- {
894
- ref,
895
- ...gridProps,
896
- children: /* @__PURE__ */ jsx6(
897
- DatePickerElementCore,
898
- {
899
- ...coreProps
900
- }
901
- )
902
- }
903
- );
904
- });
905
- DatePickerElement.displayName = "DatePickerElement";
906
-
907
- // src/wrappers/DatePickerElement/utils.ts
908
- function isValidDate(value) {
909
- if (value === null || value === void 0) {
910
- return false;
911
- }
912
- if (value instanceof Date) {
913
- return !isNaN(value.getTime());
914
- }
915
- if (typeof value === "object" && value !== null) {
916
- if ("isValid" in value && typeof value.isValid === "function") {
917
- return value.isValid();
918
- }
919
- if ("isValid" in value && typeof value.isValid === "boolean") {
920
- return value.isValid;
921
- }
922
- }
923
- return false;
924
- }
925
- function isParsableDateString(value) {
926
- if (typeof value !== "string" || value === "") {
927
- return false;
928
- }
929
- const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
930
- if (isoDateRegex.test(value)) {
931
- return true;
932
- }
933
- const parsed = new Date(value);
934
- return !isNaN(parsed.getTime());
935
- }
936
- function createDateInputTransform(adapter) {
937
- return (value) => {
938
- if (value === null || value === void 0) {
939
- return null;
940
- }
941
- if (typeof value === "string") {
942
- if (value === "") {
943
- return null;
944
- }
945
- try {
946
- const parsed = adapter.utils.date(value);
947
- return isValidDate(parsed) ? parsed : null;
948
- } catch {
949
- return null;
950
- }
951
- }
952
- if (isValidDate(value)) {
953
- return value;
954
- }
955
- return null;
956
- };
957
- }
958
- function createDateOutputTransform(format) {
959
- return (value) => {
960
- if (value === null || value === void 0) {
961
- return null;
962
- }
963
- if (!isValidDate(value)) {
964
- return null;
965
- }
966
- if (!format) {
967
- return value;
968
- }
969
- try {
970
- if (value instanceof Date) {
971
- if (format === "iso") {
972
- return value.toISOString();
973
- }
974
- if (format === "date-only") {
975
- return value.toISOString().split("T")[0];
976
- }
977
- }
978
- if (typeof value.format === "function") {
979
- return value.format(format);
980
- }
981
- if (typeof value.format === "function") {
982
- return value.format(format);
983
- }
984
- if (typeof value.toFormat === "function") {
985
- return value.toFormat(format);
986
- }
987
- return value;
988
- } catch {
989
- return null;
990
- }
991
- };
992
- }
993
- function createDefaultDatePickerConfig() {
994
- return {
995
- // Default slot props for consistent behavior
996
- slotProps: {
997
- actionBar: {
998
- actions: ["clear", "today", "cancel", "accept"]
999
- },
1000
- textField: {
1001
- fullWidth: true,
1002
- variant: "outlined"
1003
- }
1004
- },
1005
- // Default grid props for layout consistency
1006
- gridProps: {
1007
- size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
1008
- },
1009
- // Default validation configuration
1010
- validation: {
1011
- errorMessages: {
1012
- invalidDate: "Please enter a valid date",
1013
- minDate: "Date must be after the minimum allowed date",
1014
- maxDate: "Date must be before the maximum allowed date",
1015
- disabledDate: "This date is not allowed"
1016
- }
1017
- }
1018
- };
1019
- }
1020
- function extractErrorMessage(error) {
1021
- if (error === null || error === void 0) {
1022
- return "";
1023
- }
1024
- if (typeof error === "string") {
1025
- return error;
1026
- }
1027
- if (typeof error === "object" && error !== null) {
1028
- if ("message" in error && typeof error.message === "string") {
1029
- return error.message;
1030
- }
1031
- if ("type" in error && typeof error.type === "string") {
1032
- const errorType = error.type;
1033
- switch (errorType) {
1034
- case "invalidDate":
1035
- return "Please enter a valid date";
1036
- case "minDate":
1037
- return "Date is too early";
1038
- case "maxDate":
1039
- return "Date is too late";
1040
- case "disabledDate":
1041
- return "This date is not available";
1042
- default:
1043
- return "Invalid date selection";
1044
- }
1045
- }
1046
- }
1047
- return "Invalid input";
1048
- }
1049
- function createStableKey(config) {
1050
- try {
1051
- return JSON.stringify(config, (key, value) => {
1052
- if (typeof value === "object" && value !== null && !Array.isArray(value)) {
1053
- const sorted = {};
1054
- Object.keys(value).sort().forEach((k) => {
1055
- sorted[k] = value[k];
1056
- });
1057
- return sorted;
1058
- }
1059
- return value;
1060
- });
1061
- } catch {
1062
- return Object.keys(config).sort().join("-");
1063
- }
1064
- }
1065
-
1066
- // src/wrappers/PasswordElement/PasswordElement.tsx
1067
- import Visibility from "@mui/icons-material/Visibility";
1068
- import VisibilityOff from "@mui/icons-material/VisibilityOff";
1069
- import {
1070
- IconButton,
1071
- InputAdornment,
1072
- TextField as TextField2,
1073
- useForkRef as useForkRef2,
1074
- Grid as Grid5
1075
- } from "@mui/material";
1076
- import { useState as useState2 } from "react";
1077
- import { useController as useController5 } from "react-hook-form";
1078
- import { jsx as jsx7 } from "react/jsx-runtime";
1079
- var Component4 = function PasswordEl(props) {
1080
- const {
1081
- iconColor,
1082
- renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx7(Visibility, {}) : /* @__PURE__ */ jsx7(VisibilityOff, {}),
1083
- slotProps,
1084
- name,
1085
- control,
1086
- inputRef,
1087
- onBlur,
1088
- tooltipSlot = {},
1089
- ...rest
1090
- } = props;
1091
- const [password, setPassword] = useState2(true);
1092
- const endAdornment = /* @__PURE__ */ jsx7(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx7(
1093
- IconButton,
1094
- {
1095
- onMouseDown: (e) => e.preventDefault(),
1096
- onClick: () => setPassword(!password),
1097
- tabIndex: -1,
1098
- color: iconColor ?? "default",
1099
- children: renderIcon(password)
1100
- }
1101
- ) });
1102
- const {
1103
- field,
1104
- fieldState: { error }
1105
- } = useController5({
1106
- name,
1107
- control
1108
- });
1109
- const handleInputRef = useForkRef2(field.ref, inputRef);
1110
- return /* @__PURE__ */ jsx7(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx7(
1111
- TextField2,
1112
- {
1113
- ...rest,
1114
- inputRef: handleInputRef,
1115
- type: password ? "password" : "text",
1116
- value: field.value ?? "",
1117
- fullWidth: true,
1118
- variant: rest.variant ?? "outlined",
1119
- onChange: (event) => {
1120
- field.onChange(event);
1121
- if (typeof rest.onChange === "function") {
1122
- rest.onChange(event);
1123
- }
1124
- },
1125
- onBlur: (event) => {
1126
- field.onBlur();
1127
- if (typeof onBlur === "function") {
1128
- onBlur(event);
1129
- }
1130
- },
1131
- ...typeof slotProps === "undefined" ? {
1132
- InputProps: {
1133
- endAdornment
1134
- }
1135
- } : {
1136
- slotProps: {
1137
- ...slotProps,
1138
- input: {
1139
- endAdornment,
1140
- ...slotProps?.input
1141
- }
1142
- }
1143
- },
1144
- error: !!error,
1145
- helperText: error ? error.message : ""
1146
- }
1147
- ) });
1148
- };
1149
- var PasswordElement = ({
1150
- gridProps = {},
1151
- ...props
1152
- }) => {
1153
- return /* @__PURE__ */ jsx7(Grid5, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx7(Component4, { ...props }) });
1154
- };
1155
-
1156
- // src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
1157
- import {
1158
- FormControl as FormControl3,
1159
- FormControlLabel as FormControlLabel3,
1160
- FormHelperText as FormHelperText3,
1161
- FormLabel as FormLabel2,
1162
- Radio,
1163
- RadioGroup,
1164
- Grid as Grid6
1165
- } from "@mui/material";
1166
- import { useController as useController6 } from "react-hook-form";
1167
- import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
1168
- var Component5 = function RadioButtonGroup(props) {
1169
- const {
1170
- options,
1171
- label,
1172
- name,
1173
- labelKey = "label",
1174
- valueKey = "id",
1175
- disabledKey = "disabled",
1176
- required,
1177
- emptyOptionLabel,
1178
- returnObject,
1179
- row = true,
1180
- control,
1181
- type,
1182
- labelProps,
1183
- disabled,
1184
- formLabelProps,
1185
- radioProps,
1186
- transform,
1187
- ...rest
1188
- } = props;
1189
- const {
1190
- field,
1191
- fieldState: { error }
1192
- } = useController6({
1193
- name,
1194
- disabled,
1195
- control
1196
- });
1197
- const { value, onChange } = useTransform({
1198
- value: field.value,
1199
- onChange: field.onChange,
1200
- transform: {
1201
- input: typeof transform?.input === "function" ? transform.input : (value2) => {
1202
- return value2 || "";
1203
- },
1204
- output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
1205
- if (value2 && type === "number") {
1206
- return Number(value2);
1207
- }
1208
- if (value2 && type === "boolean") {
1209
- return Boolean(value2);
1210
- }
1211
- return value2;
1212
- }
1213
- }
1214
- });
1215
- const onRadioChange = (event, radioValue) => {
1216
- const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
1217
- onChange(event, returnValue);
1218
- if (typeof rest.onChange === "function") {
1219
- rest.onChange(returnValue);
1220
- }
1221
- };
1222
- return /* @__PURE__ */ jsxs5(FormControl3, { error: !!error, children: [
1223
- label && /* @__PURE__ */ jsx8(FormLabel2, { ...formLabelProps, required, error: !!error, children: label }),
1224
- /* @__PURE__ */ jsxs5(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
1225
- emptyOptionLabel && /* @__PURE__ */ jsx8(
1226
- FormControlLabel3,
1227
- {
1228
- ...labelProps,
1229
- control: /* @__PURE__ */ jsx8(
1230
- Radio,
1231
- {
1232
- ...radioProps,
1233
- checked: !value
1234
- }
1235
- ),
1236
- label: emptyOptionLabel,
1237
- value: ""
1238
- }
1239
- ),
1240
- options.map((option) => {
1241
- const optionKey = option[valueKey];
1242
- const optionDisabled = option[disabledKey] || false;
1243
- let val = returnObject ? value?.[valueKey] : value;
1244
- if (type === "number" && val !== void 0) {
1245
- val = Number(val);
1246
- } else if (type === "boolean" && val !== void 0) {
1247
- val = Boolean(val);
1248
- }
1249
- const isChecked = val === optionKey;
1250
- return /* @__PURE__ */ jsx8(
1251
- FormControlLabel3,
1252
- {
1253
- ...labelProps,
1254
- control: /* @__PURE__ */ jsx8(
1255
- Radio,
1256
- {
1257
- ...radioProps,
1258
- disabled: disabled || optionDisabled,
1259
- checked: isChecked
1260
- }
1261
- ),
1262
- value: optionKey,
1263
- label: option[labelKey]
1264
- },
1265
- String(optionKey)
1266
- );
1267
- })
1268
- ] }),
1269
- error && /* @__PURE__ */ jsx8(FormHelperText3, { children: error.message })
1270
- ] });
1271
- };
1272
- var RadioButtonGroup2 = ({
1273
- gridProps = {},
1274
- ...props
1275
- }) => {
1276
- return /* @__PURE__ */ jsx8(Grid6, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx8(
1277
- Component5,
1278
- {
1279
- ...props
1280
- }
1281
- ) });
1282
- };
1283
- RadioButtonGroup2.displayName = "RadioButtonGroup";
1284
-
1285
- // src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
1286
- import { Grid as Grid7, TextField as TextField3, Autocomplete as Autocomplete2 } from "@mui/material";
1287
- import { useTheme as useTheme3 } from "@mui/material/styles";
1288
- import { useRef as useRef2, useEffect as useEffect2, useCallback as useCallback5, useMemo as useMemo6 } from "react";
1289
- import { useController as useController7 } from "react-hook-form";
1290
- import { jsx as jsx9 } from "react/jsx-runtime";
1291
- var Component6 = function SelectCascadeElement(props) {
1292
- const theme = useTheme3();
1293
- const {
1294
- labelField = "Label",
1295
- valueField = "Value",
1296
- name,
1297
- onBlur,
1298
- onChange,
1299
- disabled,
1300
- options: optionsInput,
1301
- control,
1302
- loading = false,
1303
- placeholder,
1304
- label,
1305
- dependsOn,
1306
- textFieldProps = {},
1307
- variant,
1308
- isNullable = false,
1309
- disableDefaultSelected = false,
1310
- tooltipSlot = {},
1311
- ...rest
1312
- } = props;
1313
- const { required, ...restTextProps } = textFieldProps;
1314
- const options = useMemo6(() => optionsInput || [], [optionsInput]);
1315
- const getOptionKey = useCallback5(
1316
- (option) => {
1317
- if (typeof option === "string" || typeof option === "number")
1318
- return option;
1319
- const key = option ? option[valueField] : void 0;
1320
- return key !== void 0 && key !== null ? String(key) : "";
1321
- },
1322
- [valueField]
1323
- );
1324
- const getOptionLabel = useCallback5(
1325
- (option) => {
1326
- if (typeof option === "string") return option;
1327
- return option ? String(option[labelField]) : "";
1328
- },
1329
- [labelField]
1330
- );
1331
- const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
1332
- const {
1333
- field,
1334
- fieldState: { error }
1335
- } = useController7({
1336
- name,
1337
- control
1338
- });
1339
- const { field: dependentField } = useController7({
1340
- name: dependsOn,
1341
- control
1342
- });
1343
- const parentValueRef = useRef2(dependentField.value);
1344
- useEffect2(() => {
1345
- if (parentValueRef.current !== dependentField.value) {
1346
- field.onChange(null);
1347
- parentValueRef.current = dependentField.value;
1348
- }
1349
- }, [dependentField.value, field]);
1350
- useEffect2(() => {
1351
- if (disableDefaultSelected && options.length === 1 && field.value == null) {
1352
- field.onChange(null);
1353
- }
1354
- }, [disableDefaultSelected, options.length]);
1355
- useEffect2(() => {
1356
- const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
1357
- if (options.length === 1 && !hasValue && !disableDefaultSelected) {
1358
- if (disabled) return;
1359
- field.onChange(getOptionKey(options[0]));
1360
- }
1361
- }, [
1362
- options,
1363
- disabled,
1364
- getOptionKey,
1365
- field.onChange,
1366
- dependentField.value,
1367
- disableDefaultSelected
1368
- ]);
1369
- const isDisabled = useMemo6(() => {
1370
- if (disabled) return true;
1371
- if (dependentField.value === null || dependentField.value === void 0 || dependentField.value === "")
1372
- return true;
1373
- if (options.length === 1 && !isNullable && !disableDefaultSelected) {
1374
- return true;
1375
- }
1376
- return false;
1377
- }, [
1378
- disabled,
1379
- dependentField.value,
1380
- options.length,
1381
- isNullable,
1382
- disableDefaultSelected
1383
- ]);
1384
- return /* @__PURE__ */ jsx9(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx9(
1385
- Autocomplete2,
1386
- {
1387
- ...rest,
1388
- value: options.map(
1389
- (option) => getOptionKey(option) === field.value ? option : null
1390
- ).find(Boolean) || null,
1391
- loading,
1392
- options,
1393
- getOptionKey,
1394
- getOptionLabel,
1395
- isOptionEqualToValue,
1396
- ref: field.ref,
1397
- disabled: isDisabled,
1398
- sx: {
1399
- "&.Mui-disabled": {
1400
- cursor: "not-allowed !important"
1401
- },
1402
- "& .MuiInputBase-root.Mui-disabled": {
1403
- backgroundColor: theme.palette.action.disabledBackground,
1404
- cursor: "not-allowed !important"
1405
- },
1406
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1407
- cursor: "not-allowed !important"
1408
- },
1409
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1410
- borderColor: error ? "red" : void 0
1411
- },
1412
- "& .MuiFilledInput-root.Mui-disabled": {
1413
- borderColor: error ? "red" : void 0
1414
- }
1415
- },
1416
- onChange: (event, newValue, reason) => {
1417
- field.onChange(newValue ? getOptionKey(newValue) : null);
1418
- if (onChange && typeof onChange === "function") {
1419
- onChange(event, newValue, reason);
1420
- }
1421
- },
1422
- onBlur: (event) => {
1423
- field.onBlur();
1424
- if (typeof onBlur === "function") {
1425
- onBlur(event);
1426
- }
1427
- },
1428
- fullWidth: true,
1429
- renderInput: (params) => /* @__PURE__ */ jsx9(
1430
- TextField3,
1431
- {
1432
- ...params,
1433
- ...restTextProps,
1434
- fullWidth: true,
1435
- error: !!error,
1436
- required,
1437
- helperText: error ? error.message : "",
1438
- placeholder,
1439
- label,
1440
- variant: variant ? variant : "outlined"
1441
- }
1442
- )
1443
- }
1444
- ) });
1445
- };
1446
- var SelectCascadeElement2 = ({
1447
- gridProps = {},
1448
- ...props
1449
- }) => {
1450
- return /* @__PURE__ */ jsx9(Grid7, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx9(Component6, { ...props }) });
1451
- };
1452
- SelectCascadeElement2.displayName = "SelectCascadeElement";
1453
-
1454
- // src/wrappers/SelectElement/SelectElement.tsx
1455
- import { Grid as Grid8, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
1456
- import { useTheme as useTheme4 } from "@mui/material/styles";
1457
- import { useMemo as useMemo7, useEffect as useEffect3, useCallback as useCallback6 } from "react";
1458
- import { useController as useController8 } from "react-hook-form";
1459
- import { jsx as jsx10 } from "react/jsx-runtime";
1460
- var Component7 = function SelectElement(props) {
1461
- const theme = useTheme4();
1462
- const {
1463
- name,
1464
- control,
1465
- onChange,
1466
- options: optionsInput,
1467
- label,
1468
- variant,
1469
- disabled,
1470
- labelField = "Label",
1471
- valueField = "Value",
1472
- placeholder,
1473
- textFieldProps = {},
1474
- isNullable = false,
1475
- disableDefaultSelected = false,
1476
- tooltipSlot = {},
1477
- ...rest
1478
- } = props;
1479
- const { required, ...restTextProps } = textFieldProps;
1480
- const options = useMemo7(() => optionsInput || [], [optionsInput]);
1481
- const {
1482
- field,
1483
- fieldState: { error }
1484
- } = useController8({
1485
- name,
1486
- control
1487
- });
1488
- const getOptionValue = useCallback6(
1489
- (option) => {
1490
- if (typeof option === "string") return option;
1491
- return option ? option[valueField] : null;
1492
- },
1493
- [valueField]
1494
- );
1495
- const getOptionLabel = useCallback6(
1496
- (option) => {
1497
- if (typeof option === "string") return option;
1498
- return option ? String(option[labelField]) : "";
1499
- },
1500
- [labelField]
1501
- );
1502
- useEffect3(() => {
1503
- if (disableDefaultSelected && options.length === 1 && field.value == null) {
1504
- field.onChange(null);
1505
- }
1506
- }, [disableDefaultSelected, options.length]);
1507
- useEffect3(() => {
1508
- const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
1509
- if (options.length === 1 && !hasValue && !disableDefaultSelected) {
1510
- if (disabled) return;
1511
- field.onChange(getOptionValue(options[0]));
1512
- }
1513
- }, [
1514
- options,
1515
- disabled,
1516
- getOptionValue,
1517
- field.onChange,
1518
- disableDefaultSelected
1519
- ]);
1520
- const isDisabled = useMemo7(() => {
1521
- if (disabled) return true;
1522
- if (options.length === 0) return true;
1523
- if (options.length === 1 && !isNullable && !disableDefaultSelected)
1524
- return true;
1525
- return false;
1526
- }, [disabled, options.length, isNullable, disableDefaultSelected]);
1527
- const autocompleteValue = useMemo7(
1528
- () => options.find((option) => getOptionValue(option) === field.value) ?? null,
1529
- [field.value, options, getOptionValue]
1530
- );
1531
- return /* @__PURE__ */ jsx10(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx10(
1532
- Autocomplete3,
1533
- {
1534
- ...rest,
1535
- filterSelectedOptions: false,
1536
- options,
1537
- value: autocompleteValue,
1538
- onChange: (event, newValue, reason) => {
1539
- const option = newValue;
1540
- field.onChange(option ? getOptionValue(option) : null);
1541
- onChange?.(event, newValue, reason);
1542
- },
1543
- disabled: isDisabled,
1544
- sx: {
1545
- "&.Mui-disabled": {
1546
- cursor: "not-allowed !important"
1547
- },
1548
- "& .MuiInputBase-root.Mui-disabled": {
1549
- backgroundColor: theme.palette.action.disabledBackground,
1550
- cursor: "not-allowed !important"
1551
- },
1552
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1553
- cursor: "not-allowed !important"
1554
- },
1555
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1556
- borderColor: error ? "red" : void 0
1557
- },
1558
- "& .MuiFilledInput-root.Mui-disabled": {
1559
- borderColor: error ? "red" : void 0
1560
- }
1561
- },
1562
- getOptionLabel: (option) => getOptionLabel(option),
1563
- ref: field.ref,
1564
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1565
- renderInput: (params) => /* @__PURE__ */ jsx10(
1566
- TextField4,
1567
- {
1568
- ...params,
1569
- ...restTextProps,
1570
- fullWidth: true,
1571
- required,
1572
- error: !!error,
1573
- helperText: error ? error.message : "",
1574
- label,
1575
- placeholder,
1576
- variant: variant ? variant : "outlined"
1577
- }
1578
- )
1579
- }
1580
- ) });
1581
- };
1582
- var SelectElement2 = ({
1583
- gridProps = {},
1584
- ...props
1585
- }) => {
1586
- return /* @__PURE__ */ jsx10(Grid8, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx10(Component7, { ...props }) });
1587
- };
1588
- SelectElement2.displayName = "SelectElement";
1589
-
1590
- // src/wrappers/SelectMultiElement/SelectMultiElement.tsx
1591
- import CheckBoxIcon from "@mui/icons-material/CheckBox";
1592
- import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
1593
- import {
1594
- Grid as Grid9,
1595
- Checkbox as Checkbox3,
1596
- TextField as TextField5,
1597
- Autocomplete as Autocomplete4,
1598
- CircularProgress as CircularProgress2,
1599
- useTheme as useTheme5
1600
- } from "@mui/material";
1601
- import { Fragment as Fragment2, useEffect as useEffect4, useMemo as useMemo8 } from "react";
1602
- import { useController as useController9 } from "react-hook-form";
1603
- import { jsx as jsx11, jsxs as jsxs6 } from "react/jsx-runtime";
1604
- var Component8 = function SelectMultiElement(props) {
1605
- const {
1606
- name,
1607
- control,
1608
- onBlur,
1609
- disabled,
1610
- options: optionsInput,
1611
- loading = false,
1612
- placeholder,
1613
- label,
1614
- isNullable,
1615
- disableDefaultSelected = true,
1616
- variant,
1617
- labelField = "Label",
1618
- valueField = "Value",
1619
- tooltipSlot = {},
1620
- ...rest
1621
- } = props;
1622
- const theme = useTheme5();
1623
- const options = useMemo8(() => optionsInput || [], [optionsInput]);
1624
- const {
1625
- field,
1626
- fieldState: { error }
1627
- } = useController9({
1628
- name,
1629
- control
1630
- });
1631
- const getOptionValue = (option) => {
1632
- if (typeof option === "string") return option;
1633
- return option ? option[valueField] : null;
1634
- };
1635
- const getOptionLabel = (option) => {
1636
- if (typeof option === "string") return option;
1637
- return option ? String(option[labelField]) : "";
1638
- };
1639
- const isDisabled = useMemo8(() => {
1640
- if (disabled) return true;
1641
- if (options.length === 0) return true;
1642
- if (options.length === 1 && !isNullable && !disableDefaultSelected)
1643
- return true;
1644
- return false;
1645
- }, [disabled, options.length, isNullable, disableDefaultSelected]);
1646
- const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
1647
- useEffect4(() => {
1648
- if (disableDefaultSelected && options.length === 1 && field.value == null) {
1649
- field.onChange(null);
1650
- }
1651
- }, [disableDefaultSelected, options.length]);
1652
- useEffect4(() => {
1653
- const hasValue = Array.isArray(field.value) && field.value.length > 0;
1654
- if (options.length === 1 && !hasValue && !isNullable && !disableDefaultSelected) {
1655
- field.onChange([getOptionValue(options[0])]);
1656
- }
1657
- }, [
1658
- options,
1659
- getOptionValue,
1660
- field.onChange,
1661
- isNullable,
1662
- disableDefaultSelected
1663
- ]);
1664
- const handleChange = (_, selectedOptions, reason) => {
1665
- if (reason === "clear") {
1666
- field.onChange(null);
1667
- } else if (reason === "selectOption" || reason === "removeOption") {
1668
- const newValues = selectedOptions.map((option) => getOptionValue(option));
1669
- field.onChange(newValues.length === 0 ? null : newValues);
1670
- }
1671
- };
1672
- const icon = /* @__PURE__ */ jsx11(CheckBoxOutlineBlankIcon, { fontSize: "small" });
1673
- const checkedIcon = /* @__PURE__ */ jsx11(CheckBoxIcon, { fontSize: "small" });
1674
- return /* @__PURE__ */ jsx11(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx11(
1675
- Autocomplete4,
1676
- {
1677
- multiple: true,
1678
- value: selectedValue,
1679
- loading,
1680
- options,
1681
- getOptionLabel,
1682
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1683
- filterSelectedOptions: true,
1684
- disableCloseOnSelect: true,
1685
- ref: field.ref,
1686
- disabled: isDisabled,
1687
- onChange: handleChange,
1688
- onBlur: (event) => {
1689
- field.onBlur();
1690
- if (typeof onBlur === "function") {
1691
- onBlur(event);
1692
- }
1693
- },
1694
- sx: {
1695
- "&.Mui-disabled": {
1696
- cursor: "not-allowed !important"
1697
- },
1698
- "& .MuiInputBase-root.Mui-disabled": {
1699
- backgroundColor: theme.palette.action.disabledBackground,
1700
- cursor: "not-allowed !important"
1701
- },
1702
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1703
- cursor: "not-allowed !important"
1704
- },
1705
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1706
- borderColor: error ? "red" : void 0
1707
- },
1708
- "& .MuiFilledInput-root.Mui-disabled": {
1709
- borderColor: error ? "red" : void 0
1710
- }
1711
- },
1712
- fullWidth: true,
1713
- renderOption: (props1, option, { selected }) => {
1714
- return /* @__PURE__ */ jsxs6("li", { ...props1, children: [
1715
- /* @__PURE__ */ jsx11(
1716
- Checkbox3,
1717
- {
1718
- icon,
1719
- checkedIcon,
1720
- checked: selected
1721
- }
1722
- ),
1723
- getOptionLabel(option)
1724
- ] });
1725
- },
1726
- renderInput: (params) => /* @__PURE__ */ jsx11(
1727
- TextField5,
1728
- {
1729
- ...params,
1730
- label,
1731
- error: !!error,
1732
- helperText: error ? error.message : "",
1733
- placeholder,
1734
- InputProps: {
1735
- ...params.InputProps,
1736
- endAdornment: /* @__PURE__ */ jsxs6(Fragment2, { children: [
1737
- loading ? /* @__PURE__ */ jsx11(CircularProgress2, { color: "inherit", size: 20 }) : null,
1738
- params.InputProps.endAdornment
1739
- ] })
1740
- },
1741
- variant: variant ? variant : "outlined"
1742
- }
1743
- ),
1744
- ...rest
1745
- }
1746
- ) });
1747
- };
1748
- var SelectMultiElement2 = ({
1749
- gridProps = {},
1750
- ...props
1751
- }) => {
1752
- return /* @__PURE__ */ jsx11(Grid9, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx11(Component8, { ...props }) });
1753
- };
1754
- SelectMultiElement2.displayName = "SelectMultiElement";
1755
-
1756
- // src/wrappers/TextFieldElement/TextFieldElement.tsx
1757
- import { Grid as Grid10, TextField as TextField6, useForkRef as useForkRef3, useTheme as useTheme6 } from "@mui/material";
1758
- import { useController as useController10 } from "react-hook-form";
1759
- import { jsx as jsx12 } from "react/jsx-runtime";
1760
- var Component9 = function TextFieldElement(props) {
1761
- const {
1762
- parseError,
1763
- name,
1764
- control,
1765
- component: TextFieldComponent = TextField6,
1766
- transform,
1767
- fieldType = "text",
1768
- // Default to text type
1769
- defaultValue,
1770
- label,
1771
- placeholder,
1772
- textFieldProps = {},
1773
- variant,
1774
- onChange: customOnChange,
1775
- enableWarnings = process.env.NODE_ENV === "development",
1776
- tooltipSlot = {},
1777
- ...rest
1778
- } = props;
1779
- const {
1780
- type,
1781
- required,
1782
- helperText,
1783
- inputRef,
1784
- onInput,
1785
- onBlur,
1786
- disabled,
1787
- ...restTextProps
1788
- } = textFieldProps;
1789
- const {
1790
- field,
1791
- fieldState: { error }
1792
- } = useController10({
1793
- name,
1794
- control
1795
- });
1796
- const theme = useTheme6();
1797
- const { value, onChange } = useEnhancedTransform(
1798
- {
1799
- value: field.value,
1800
- onChange: field.onChange,
1801
- transform: transform ? {
1802
- input: transform.input,
1803
- output: transform.output
1804
- } : void 0,
1805
- fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
1806
- // Auto-detect number type
1807
- defaultValue,
1808
- enableWarnings
1809
- }
1810
- );
1811
- const handleInputRef = useForkRef3(field.ref, inputRef);
1812
- return /* @__PURE__ */ jsx12(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx12(
1813
- TextFieldComponent,
1814
- {
1815
- ...rest,
1816
- ...restTextProps,
1817
- name: field.name,
1818
- value,
1819
- onChange: (event) => {
1820
- const input = event.target.value;
1821
- if (input === "") {
1822
- field.onChange(null);
1823
- } else {
1824
- onChange(event);
1825
- }
1826
- if (typeof customOnChange === "function") {
1827
- customOnChange(event);
1828
- }
1829
- return;
1830
- },
1831
- onBlur: (event) => {
1832
- field.onBlur();
1833
- if (typeof onBlur === "function") {
1834
- onBlur(event);
1835
- }
1836
- },
1837
- onInput: (event) => {
1838
- if (typeof onInput === "function") {
1839
- onInput(event);
1840
- }
1841
- },
1842
- disabled,
1843
- label,
1844
- placeholder,
1845
- fullWidth: true,
1846
- required,
1847
- type,
1848
- error: !!error,
1849
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
1850
- inputRef: handleInputRef,
1851
- variant: variant ? variant : "outlined",
1852
- sx: {
1853
- "&.Mui-disabled": {
1854
- cursor: "not-allowed !important"
1855
- },
1856
- "& .MuiInputBase-root.Mui-disabled": {
1857
- backgroundColor: theme.palette.action.disabledBackground,
1858
- cursor: "not-allowed !important"
1859
- }
1860
- }
1861
- }
1862
- ) });
1863
- };
1864
- var TextFieldElement2 = ({
1865
- gridProps = {},
1866
- ...props
1867
- }) => {
1868
- return /* @__PURE__ */ jsx12(Grid10, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx12(Component9, { ...props }) });
1869
- };
1870
-
1871
- // src/wrappers/TimePickerElement/TimePickerElement.tsx
1872
- import { Grid as Grid11, useForkRef as useForkRef4 } from "@mui/material";
1873
- import { TimePicker } from "@mui/x-date-pickers";
1874
- import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
1875
- import { renderTimeViewClock } from "@mui/x-date-pickers/timeViewRenderers";
1876
- import dayjs from "dayjs";
1877
- import { useState as useState3 } from "react";
1878
- import { useController as useController11 } from "react-hook-form";
1879
- import { jsx as jsx13 } from "react/jsx-runtime";
1880
- var Component10 = function TimePickerElement(props) {
1881
- const {
1882
- name,
1883
- required,
1884
- inputProps,
1885
- control,
1886
- label,
1887
- placeholder,
1888
- slotProps,
1889
- timePickerProps = {},
1890
- transform,
1891
- tooltipSlot = {},
1892
- ...rest
1893
- } = props;
1894
- const adapter = useLocalizationContext2();
1895
- const [open, setOpen] = useState3(false);
1896
- const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
1897
- const {
1898
- field,
1899
- fieldState: { error }
1900
- } = useController11({
1901
- name,
1902
- control,
1903
- defaultValue: null
1904
- });
1905
- const { value, onChange } = useTransform({
1906
- value: field.value,
1907
- onChange: field.onChange,
1908
- transform: {
1909
- input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
1910
- output: (data) => {
1911
- if (!dayjs.isDayjs(data)) {
1912
- return null;
1913
- }
1914
- return data;
1915
- }
1916
- }
1917
- });
1918
- const handleInputRef = useForkRef4(field.ref, inputRef);
1919
- return /* @__PURE__ */ jsx13(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx13(
1920
- TimePicker,
1921
- {
1922
- ...rest,
1923
- ...restTimePickerProps,
1924
- value,
1925
- label,
1926
- disabled,
1927
- open,
1928
- inputRef: handleInputRef,
1929
- viewRenderers: {
1930
- hours: renderTimeViewClock,
1931
- minutes: renderTimeViewClock,
1932
- seconds: renderTimeViewClock
1933
- },
1934
- onOpen: () => setOpen(true),
1935
- onClose: (...args) => {
1936
- setOpen(false);
1937
- field.onBlur();
1938
- onClose?.(...args);
1939
- },
1940
- onChange: (newValue, context) => {
1941
- onChange(newValue);
1942
- timePickerProps.onChange?.(newValue, context);
1943
- },
1944
- slotProps: {
1945
- ...slotProps,
1946
- actionBar: {
1947
- actions: ["clear", "cancel", "accept"]
1948
- },
1949
- textField: {
1950
- ...inputProps,
1951
- required,
1952
- placeholder,
1953
- fullWidth: true,
1954
- readOnly: true,
1955
- sx: {
1956
- cursor: disabled ? "not-allowed" : "pointer"
1957
- },
1958
- onClick: () => {
1959
- if (!disabled) {
1960
- setOpen(true);
1961
- }
1962
- },
1963
- onBlur: (event) => {
1964
- field.onBlur();
1965
- inputProps?.onBlur?.(event);
1966
- },
1967
- error: !!error,
1968
- helperText: error ? error.message : inputProps?.helperText || rest.helperText,
1969
- inputProps: {
1970
- readOnly: true,
1971
- inputMode: "none",
1972
- ...inputProps?.inputProps
1973
- }
1974
- }
1975
- }
1976
- }
1977
- ) });
1978
- };
1979
- var TimePickerElement2 = ({
1980
- gridProps = {},
1981
- ...props
1982
- }) => {
1983
- return /* @__PURE__ */ jsx13(Grid11, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx13(Component10, { ...props }) });
1984
- };
1985
- TimePickerElement2.displayName = "TimePickerElement";
1986
-
1987
- // src/wrappers/SliderElement/SliderElement.tsx
1988
- import {
1989
- Box,
1990
- FormControl as FormControl4,
1991
- FormHelperText as FormHelperText4,
1992
- FormLabel as FormLabel3,
1993
- Grid as Grid12,
1994
- Slider
1995
- } from "@mui/material";
1996
- import { useController as useController12 } from "react-hook-form";
1997
- import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
1998
- var Component11 = function SliderElementCore(props) {
1999
- const {
2000
- name,
2001
- control,
2002
- label,
2003
- helperText,
2004
- parseError,
2005
- min = 0,
2006
- max = 100,
2007
- step = 1,
2008
- marks = false,
2009
- required = false,
2010
- disabled = false,
2011
- sliderProps = {}
2012
- } = props;
2013
- const {
2014
- field,
2015
- fieldState: { error }
2016
- } = useController12({
2017
- name,
2018
- control
2019
- });
2020
- const errorMessage = error ? parseError ? parseError(error) : error.message : null;
2021
- return /* @__PURE__ */ jsxs7(
2022
- FormControl4,
2023
- {
2024
- fullWidth: true,
2025
- margin: "normal",
2026
- error: !!error,
2027
- required,
2028
- disabled,
2029
- children: [
2030
- label && /* @__PURE__ */ jsx14(FormLabel3, { sx: { mb: 2 }, children: label }),
2031
- /* @__PURE__ */ jsx14(Box, { sx: { px: 2 }, children: /* @__PURE__ */ jsx14(
2032
- Slider,
2033
- {
2034
- ...sliderProps,
2035
- ref: field.ref,
2036
- name: field.name,
2037
- value: typeof field.value === "number" ? field.value : min,
2038
- onChange: (_, newValue) => field.onChange(newValue),
2039
- onBlur: field.onBlur,
2040
- min,
2041
- max,
2042
- step,
2043
- marks,
2044
- valueLabelDisplay: "auto",
2045
- disabled
2046
- }
2047
- ) }),
2048
- (errorMessage || helperText) && /* @__PURE__ */ jsx14(FormHelperText4, { children: errorMessage || helperText })
2049
- ]
2050
- }
2051
- );
2052
- };
2053
- var SliderElement = ({
2054
- gridProps = {},
2055
- ...props
2056
- }) => {
2057
- return /* @__PURE__ */ jsx14(Grid12, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx14(Component11, { ...props }) });
2058
- };
2059
- SliderElement.displayName = "SliderElement";
2060
-
2061
- // src/wrappers/FileUploadElement/FileUploadElement.tsx
2062
- import {
2063
- Box as Box2,
2064
- Button,
2065
- Chip,
2066
- FormControl as FormControl5,
2067
- FormHelperText as FormHelperText5,
2068
- FormLabel as FormLabel4,
2069
- Grid as Grid13,
2070
- Stack as Stack2
2071
- } from "@mui/material";
2072
- import CloudUploadIcon from "@mui/icons-material/CloudUpload";
2073
- import { useCallback as useCallback7, useRef as useRef3 } from "react";
2074
- import { useController as useController13, useFormContext } from "react-hook-form";
2075
- import { jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
2076
- var Component12 = function FileUploadElementCore(props) {
2077
- const {
2078
- name,
2079
- control,
2080
- label,
2081
- helperText,
2082
- parseError,
2083
- maxFiles = 5,
2084
- maxSizeMB = 10,
2085
- allowedExtensions = [".jpg", ".jpeg", ".png", ".pdf", ".doc", ".docx", ".xls", ".xlsx"],
2086
- required = false,
2087
- disabled = false,
2088
- buttonText = "Choose Files"
2089
- } = props;
2090
- const { setError, clearErrors } = useFormContext();
2091
- const fileInputRef = useRef3(null);
2092
- const {
2093
- field,
2094
- fieldState: { error }
2095
- } = useController13({
2096
- name,
2097
- control
2098
- });
2099
- const files = Array.isArray(field.value) ? field.value : [];
2100
- const validateFiles = useCallback7(
2101
- (fileList) => {
2102
- if (!fileList || fileList.length === 0) {
2103
- return [];
2104
- }
2105
- if (fileList.length > maxFiles) {
2106
- return `Maximum ${maxFiles} files allowed`;
2107
- }
2108
- const maxSizeBytes = maxSizeMB * 1024 * 1024;
2109
- const validFiles = [];
2110
- for (let i = 0; i < fileList.length; i++) {
2111
- const file = fileList[i];
2112
- if (file.size > maxSizeBytes) {
2113
- return `File "${file.name}" exceeds ${maxSizeMB}MB size limit`;
2114
- }
2115
- const extension = "." + file.name.split(".").pop()?.toLowerCase();
2116
- if (!allowedExtensions.includes(extension)) {
2117
- return `File "${file.name}" has invalid extension. Allowed: ${allowedExtensions.join(", ")}`;
2118
- }
2119
- validFiles.push(file);
2120
- }
2121
- return validFiles;
2122
- },
2123
- [maxFiles, maxSizeMB, allowedExtensions]
2124
- );
2125
- const handleFileChange = useCallback7(
2126
- (event) => {
2127
- const result = validateFiles(event.target.files);
2128
- if (typeof result === "string") {
2129
- setError(name, { type: "validation", message: result });
2130
- if (fileInputRef.current) {
2131
- fileInputRef.current.value = "";
2132
- }
2133
- return;
2134
- }
2135
- clearErrors(name);
2136
- field.onChange(result);
2137
- },
2138
- [validateFiles, setError, clearErrors, name, field]
2139
- );
2140
- const handleRemoveFile = useCallback7(
2141
- (index) => {
2142
- const newFiles = files.filter((_, i) => i !== index);
2143
- field.onChange(newFiles);
2144
- if (fileInputRef.current) {
2145
- fileInputRef.current.value = "";
2146
- }
2147
- },
2148
- [files, field]
2149
- );
2150
- const errorMessage = error ? parseError ? parseError(error) : error.message : null;
2151
- return /* @__PURE__ */ jsxs8(
2152
- FormControl5,
2153
- {
2154
- fullWidth: true,
2155
- margin: "normal",
2156
- error: !!error,
2157
- required,
2158
- disabled,
2159
- children: [
2160
- label && /* @__PURE__ */ jsx15(FormLabel4, { sx: { mb: 1 }, children: label }),
2161
- /* @__PURE__ */ jsxs8(Box2, { children: [
2162
- /* @__PURE__ */ jsxs8(
2163
- Button,
2164
- {
2165
- variant: "outlined",
2166
- component: "label",
2167
- startIcon: /* @__PURE__ */ jsx15(CloudUploadIcon, {}),
2168
- disabled: disabled || files.length >= maxFiles,
2169
- children: [
2170
- buttonText,
2171
- /* @__PURE__ */ jsx15(
2172
- "input",
2173
- {
2174
- ref: fileInputRef,
2175
- type: "file",
2176
- multiple: true,
2177
- accept: allowedExtensions.join(","),
2178
- hidden: true,
2179
- onChange: handleFileChange
2180
- }
2181
- )
2182
- ]
2183
- }
2184
- ),
2185
- files.length > 0 && /* @__PURE__ */ jsx15(Stack2, { direction: "row", spacing: 1, flexWrap: "wrap", sx: { mt: 2 }, children: files.map((file, index) => /* @__PURE__ */ jsx15(
2186
- Chip,
2187
- {
2188
- label: `${file.name} (${(file.size / 1024).toFixed(1)} KB)`,
2189
- onDelete: disabled ? void 0 : () => handleRemoveFile(index),
2190
- sx: { mb: 1 }
2191
- },
2192
- `${file.name}-${index}`
2193
- )) })
2194
- ] }),
2195
- (errorMessage || helperText) && /* @__PURE__ */ jsx15(FormHelperText5, { children: errorMessage || helperText })
2196
- ]
2197
- }
2198
- );
2199
- };
2200
- var FileUploadElement = ({
2201
- gridProps = {},
2202
- ...props
2203
- }) => {
2204
- return /* @__PURE__ */ jsx15(Grid13, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx15(Component12, { ...props }) });
2205
- };
2206
- FileUploadElement.displayName = "FileUploadElement";
2207
-
2208
- // src/wrappers/PhoneNumberElement/PhoneNumberElement.tsx
2209
- import { Grid as Grid14 } from "@mui/material";
2210
- import { MuiTelInput } from "mui-tel-input";
2211
- import { useController as useController14 } from "react-hook-form";
2212
- import { jsx as jsx16 } from "react/jsx-runtime";
2213
- var TelInput = MuiTelInput;
2214
- var Component13 = function PhoneNumberEl(props) {
2215
- const {
2216
- name,
2217
- control,
2218
- label,
2219
- placeholder,
2220
- defaultCountry = "US",
2221
- preferredCountries,
2222
- onlyCountries,
2223
- excludeCountries,
2224
- disabled = false,
2225
- required = false,
2226
- parseError,
2227
- textFieldProps,
2228
- tooltipSlot = {}
2229
- } = props;
2230
- const {
2231
- field,
2232
- fieldState: { error }
2233
- } = useController14({ name, control });
2234
- const errorMessage = error ? parseError ? parseError(error) : error.message : textFieldProps?.helperText;
2235
- return /* @__PURE__ */ jsx16(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx16(
2236
- TelInput,
2237
- {
2238
- value: field.value ?? "",
2239
- onChange: (val) => field.onChange(val),
2240
- onBlur: () => field.onBlur(),
2241
- inputRef: field.ref,
2242
- label,
2243
- placeholder,
2244
- defaultCountry,
2245
- preferredCountries,
2246
- onlyCountries,
2247
- excludedCountries: excludeCountries,
2248
- forceCallingCode: true,
2249
- focusOnSelectFlag: true,
2250
- fullWidth: true,
2251
- required,
2252
- disabled,
2253
- error: !!error,
2254
- helperText: errorMessage,
2255
- size: textFieldProps?.size
2256
- }
2257
- ) });
2258
- };
2259
- var PhoneNumberElement = ({
2260
- gridProps = {},
2261
- ...props
2262
- }) => {
2263
- return /* @__PURE__ */ jsx16(Grid14, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx16(Component13, { ...props }) });
2264
- };
2265
-
2266
- // src/wrappers/EditableTableElement/EditableTableElement.tsx
2267
- import DeleteOutline from "@mui/icons-material/DeleteOutline";
2268
- import Button2 from "@mui/material/Button";
2269
- import Grid16 from "@mui/material/Grid";
2270
- import IconButton2 from "@mui/material/IconButton";
2271
- import Paper from "@mui/material/Paper";
2272
- import Table from "@mui/material/Table";
2273
- import TableBody from "@mui/material/TableBody";
2274
- import TableCell from "@mui/material/TableCell";
2275
- import TableContainer from "@mui/material/TableContainer";
2276
- import TableHead from "@mui/material/TableHead";
2277
- import TableRow from "@mui/material/TableRow";
2278
- import Typography2 from "@mui/material/Typography";
2279
- import dayjs2 from "dayjs";
2280
- import { forwardRef as forwardRef3, useImperativeHandle } from "react";
2281
- import { useFieldArray } from "react-hook-form";
2282
-
2283
- // src/wrappers/NumberFieldElement/NumberFieldElement.tsx
2284
- import { Grid as Grid15, TextField as TextField7, useForkRef as useForkRef5, useTheme as useTheme7 } from "@mui/material";
2285
- import { useController as useController15 } from "react-hook-form";
2286
- import { jsx as jsx17 } from "react/jsx-runtime";
2287
- var Component14 = function NumberFieldElement(props) {
2288
- const {
2289
- parseError,
2290
- name,
2291
- control,
2292
- component: TextFieldComponent = TextField7,
2293
- transform,
2294
- fieldType = "text",
2295
- // Default to text type
2296
- defaultValue,
2297
- label,
2298
- placeholder,
2299
- textFieldProps = {},
2300
- variant,
2301
- onChange: customOnChange,
2302
- enableWarnings = process.env.NODE_ENV === "development",
2303
- maxLength,
2304
- tooltipSlot = {},
2305
- ...rest
2306
- } = props;
2307
- const {
2308
- type = "number",
2309
- required,
2310
- helperText,
2311
- inputRef,
2312
- onInput,
2313
- onBlur,
2314
- disabled,
2315
- ...restTextProps
2316
- } = textFieldProps;
2317
- const {
2318
- field,
2319
- fieldState: { error }
2320
- } = useController15({
2321
- name,
2322
- control
2323
- });
2324
- const theme = useTheme7();
2325
- const { value, onChange } = useEnhancedTransform(
2326
- {
2327
- value: field.value,
2328
- onChange: field.onChange,
2329
- transform: transform ? {
2330
- input: transform.input,
2331
- output: transform.output
2332
- } : void 0,
2333
- fieldType: !transform ? type === "number" ? maxLength && maxLength > 5 ? "text" : "number" : fieldType : void 0,
2334
- // Auto-detect number type
2335
- defaultValue,
2336
- enableWarnings
2337
- }
2338
- );
2339
- const handleInputRef = useForkRef5(field.ref, inputRef);
2340
- return /* @__PURE__ */ jsx17(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx17(
2341
- TextFieldComponent,
2342
- {
2343
- ...rest,
2344
- ...restTextProps,
2345
- name: field.name,
2346
- value,
2347
- onChange: (event) => {
2348
- const input = event.target.value;
2349
- if (input === "") {
2350
- field.onChange(null);
2351
- }
2352
- onChange(event);
2353
- if (typeof customOnChange === "function") {
2354
- customOnChange(event);
2355
- }
2356
- },
2357
- onBlur: (event) => {
2358
- field.onBlur();
2359
- if (typeof onBlur === "function") {
2360
- onBlur(event);
2361
- }
2362
- },
2363
- onInput: (event) => {
2364
- if (type === "number" && maxLength && event.target.value.length > maxLength) {
2365
- event.target.value = event.target.value.slice(0, maxLength);
2366
- }
2367
- if (typeof onInput === "function") {
2368
- onInput(event);
2369
- }
2370
- },
2371
- onWheel: (e) => {
2372
- e.target.blur();
2373
- },
2374
- onKeyDown: (e) => {
2375
- if (["e", "E", "ArrowDown", "ArrowUp"].includes(e.key)) {
2376
- e.preventDefault();
2377
- }
2378
- },
2379
- disabled,
2380
- label,
2381
- placeholder,
2382
- fullWidth: true,
2383
- required,
2384
- type,
2385
- error: !!error,
2386
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
2387
- inputRef: handleInputRef,
2388
- slotProps: { htmlInput: { maxLength } },
2389
- variant: variant ? variant : "outlined",
2390
- sx: {
2391
- "&.Mui-disabled": {
2392
- cursor: "not-allowed !important"
2393
- },
2394
- "& .MuiInputBase-root.Mui-disabled": {
2395
- backgroundColor: theme.palette.action.disabledBackground,
2396
- cursor: "not-allowed !important"
2397
- }
2398
- }
2399
- }
2400
- ) });
2401
- };
2402
- var NumberFieldElement2 = ({
2403
- gridProps = {},
2404
- ...props
2405
- }) => {
2406
- return /* @__PURE__ */ jsx17(Grid15, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx17(Component14, { ...props }) });
2407
- };
2408
-
2409
- // src/wrappers/EditableTableElement/EditableTableElement.tsx
2410
- import { jsx as jsx18, jsxs as jsxs9 } from "react/jsx-runtime";
2411
- function renderCell(col, fieldName, control, cellDisabled) {
2412
- const label = col.label + (col.required ? " *" : "");
2413
- switch (col.type) {
2414
- case "checkbox":
2415
- return /* @__PURE__ */ jsx18(
2416
- CheckboxElement2,
2417
- {
2418
- control,
2419
- name: fieldName,
2420
- label: "",
2421
- disabled: cellDisabled
2422
- }
2423
- );
2424
- case "select":
2425
- return /* @__PURE__ */ jsx18(
2426
- SelectElement2,
2427
- {
2428
- control,
2429
- name: fieldName,
2430
- label,
2431
- options: col.options,
2432
- disabled: cellDisabled
2433
- }
2434
- );
2435
- case "date":
2436
- return /* @__PURE__ */ jsx18(
2437
- DatePickerElement,
2438
- {
2439
- control,
2440
- name: fieldName,
2441
- label,
2442
- gridProps: false,
2443
- datePickerProps: {
2444
- disabled: cellDisabled,
2445
- minDate: col.minDate ? dayjs2(col.minDate) : void 0,
2446
- maxDate: col.maxDate ? dayjs2(col.maxDate) : void 0
2447
- }
2448
- }
2449
- );
2450
- case "number":
2451
- return /* @__PURE__ */ jsx18(
2452
- NumberFieldElement2,
2453
- {
2454
- control,
2455
- name: fieldName,
2456
- label,
2457
- textFieldProps: { disabled: cellDisabled }
2458
- }
2459
- );
2460
- case "text":
2461
- default:
2462
- return /* @__PURE__ */ jsx18(
2463
- TextFieldElement2,
2464
- {
2465
- control,
2466
- name: fieldName,
2467
- label,
2468
- textFieldProps: { disabled: cellDisabled }
2469
- }
2470
- );
2471
- }
2472
- }
2473
- var EditableTableElementInner = ({
2474
- name,
2475
- control,
2476
- columns,
2477
- defaultRowValue,
2478
- title,
2479
- addButtonLabel = "Add",
2480
- emptyMessage = "No items added.",
2481
- gridProps = {},
2482
- showRowNumbers = true,
2483
- disabled = false,
2484
- deleteIcon
2485
- }, ref) => {
2486
- const { fields, append, remove, update, replace, move, swap, insert } = useFieldArray({ control, name });
2487
- useImperativeHandle(ref, () => ({
2488
- append,
2489
- remove,
2490
- update,
2491
- replace,
2492
- move,
2493
- swap,
2494
- insert,
2495
- fields
2496
- }));
2497
- const handleAdd = () => {
2498
- const row = defaultRowValue ?? Object.fromEntries(columns.map((col) => [col.field, null]));
2499
- append(row);
2500
- };
2501
- const colSpan = columns.length + (showRowNumbers ? 1 : 0) + 1;
2502
- const baseControl = control;
2503
- return /* @__PURE__ */ jsxs9(Grid16, { size: 12, ...gridProps, children: [
2504
- /* @__PURE__ */ jsxs9(Grid16, { container: true, justifyContent: "space-between", alignItems: "center", marginBottom: 1, children: [
2505
- title && /* @__PURE__ */ jsx18(Typography2, { variant: "subtitle1", children: title }),
2506
- /* @__PURE__ */ jsx18(
2507
- Button2,
2508
- {
2509
- variant: "outlined",
2510
- size: "small",
2511
- onClick: handleAdd,
2512
- disabled,
2513
- children: addButtonLabel
2514
- }
2515
- )
2516
- ] }),
2517
- /* @__PURE__ */ jsx18(TableContainer, { component: Paper, variant: "outlined", children: /* @__PURE__ */ jsxs9(Table, { size: "small", stickyHeader: true, children: [
2518
- /* @__PURE__ */ jsx18(TableHead, { children: /* @__PURE__ */ jsxs9(TableRow, { children: [
2519
- showRowNumbers && /* @__PURE__ */ jsx18(TableCell, { children: "#" }),
2520
- columns.map((col) => /* @__PURE__ */ jsx18(TableCell, { width: col.width, children: col.label }, col.field)),
2521
- /* @__PURE__ */ jsx18(TableCell, {})
2522
- ] }) }),
2523
- /* @__PURE__ */ jsxs9(TableBody, { children: [
2524
- fields.map((field, index) => /* @__PURE__ */ jsxs9(TableRow, { children: [
2525
- showRowNumbers && /* @__PURE__ */ jsx18(TableCell, { children: index + 1 }),
2526
- columns.map((col) => {
2527
- const fieldName = `${name}.${index}.${col.field}`;
2528
- const cellDisabled = disabled || col.disabled;
2529
- return /* @__PURE__ */ jsx18(TableCell, { width: col.width, children: renderCell(col, fieldName, baseControl, cellDisabled) }, col.field);
2530
- }),
2531
- /* @__PURE__ */ jsx18(TableCell, { children: /* @__PURE__ */ jsx18(
2532
- IconButton2,
2533
- {
2534
- color: "error",
2535
- onClick: () => remove(index),
2536
- disabled,
2537
- children: deleteIcon ?? /* @__PURE__ */ jsx18(DeleteOutline, {})
2538
- }
2539
- ) })
2540
- ] }, field.id)),
2541
- fields.length === 0 && /* @__PURE__ */ jsx18(TableRow, { children: /* @__PURE__ */ jsx18(TableCell, { colSpan, align: "center", children: /* @__PURE__ */ jsx18(Typography2, { variant: "body2", color: "text.secondary", children: emptyMessage }) }) })
2542
- ] })
2543
- ] }) })
2544
- ] });
2545
- };
2546
- var EditableTableElement = forwardRef3(EditableTableElementInner);
2547
-
2548
- // src/wrappers/AsyncSelect/index.tsx
2549
- import {
2550
- Autocomplete as Autocomplete5,
2551
- CircularProgress as CircularProgress3,
2552
- Grid as Grid17,
2553
- TextField as TextField8,
2554
- useTheme as useTheme8
2555
- } from "@mui/material";
2556
- import { debounce as debounce2 } from "@mui/material/utils";
2557
- import {
2558
- Fragment as Fragment3,
2559
- useCallback as useCallback8,
2560
- useEffect as useEffect5,
2561
- useMemo as useMemo9,
2562
- useRef as useRef4,
2563
- useState as useState4
2564
- } from "react";
2565
- import {
2566
- useController as useController16
2567
- } from "react-hook-form";
2568
- import { jsx as jsx19, jsxs as jsxs10 } from "react/jsx-runtime";
2569
- var Component15 = function AsyncSelectElement(props) {
2570
- const {
2571
- name,
2572
- disabled,
2573
- control,
2574
- placeholder,
2575
- // initialValue,
2576
- // isNullable,
2577
- label,
2578
- queryFn,
2579
- variant,
2580
- labelField = "Label",
2581
- valueField = "Value",
2582
- tooltipSlot = {},
2583
- ...rest
2584
- } = props;
2585
- const {
2586
- field,
2587
- fieldState: { error }
2588
- } = useController16({
2589
- name,
2590
- control
2591
- });
2592
- const theme = useTheme8();
2593
- const [loading, setLoading] = useState4(false);
2594
- const [selectedOption, setSelectedOption] = useState4(null);
2595
- const [inputValue, setInputValue] = useState4("");
2596
- const [options, setOptions] = useState4([]);
2597
- const [open, setOpen] = useState4(false);
2598
- const loadedValueRef = useRef4(
2599
- void 0
2600
- );
2601
- const fetchData = useMemo9(
2602
- () => debounce2(
2603
- (payload, callback) => {
2604
- queryFn(payload).then((c) => callback(c));
2605
- },
2606
- 400
2607
- ),
2608
- [queryFn]
2609
- );
2610
- const getOptionValue = useCallback8(
2611
- (option) => {
2612
- return option ? String(option[valueField]) : "";
2613
- },
2614
- [valueField]
2615
- );
2616
- const getOptionLabel = useCallback8(
2617
- (option) => {
2618
- return option ? String(option[labelField]) : "";
2619
- },
2620
- [labelField]
2621
- );
2622
- useEffect5(() => {
2623
- const currentValue = field.value;
2624
- if (currentValue && loadedValueRef.current !== currentValue) {
2625
- if (selectedOption && getOptionValue(selectedOption) === currentValue) {
2626
- loadedValueRef.current = currentValue;
2627
- return;
2628
- }
2629
- const active = true;
2630
- setLoading(true);
2631
- loadedValueRef.current = currentValue;
2632
- fetchData({ Query: null, SelectedValue: currentValue }, (results) => {
2633
- if (!active) return;
2634
- setLoading(false);
2635
- const matchedOption = results?.find(
2636
- (option) => String(getOptionValue(option)) === String(currentValue)
2637
- );
2638
- if (matchedOption) {
2639
- setOptions([matchedOption]);
2640
- setSelectedOption(matchedOption);
2641
- setInputValue(getOptionLabel(matchedOption));
2642
- }
2643
- });
2644
- return;
2645
- }
2646
- if (inputValue !== (selectedOption ? getOptionLabel(selectedOption) : "")) {
2647
- if (inputValue === "") {
2648
- setOptions([]);
2649
- setLoading(false);
2650
- return;
2651
- }
2652
- const active = true;
2653
- setLoading(true);
2654
- fetchData({ Query: inputValue, SelectedValue: null }, (results) => {
2655
- if (!active) return;
2656
- setLoading(false);
2657
- setOptions(results || []);
2658
- });
2659
- return;
2660
- }
2661
- if (!currentValue && selectedOption) {
2662
- setSelectedOption(null);
2663
- setInputValue("");
2664
- setOptions([]);
2665
- loadedValueRef.current = void 0;
2666
- }
2667
- }, [
2668
- field.value,
2669
- inputValue,
2670
- fetchData,
2671
- getOptionLabel,
2672
- getOptionValue,
2673
- selectedOption,
2674
- labelField,
2675
- valueField
2676
- ]);
2677
- const isDisabled = useMemo9(() => {
2678
- return disabled ?? false;
2679
- }, [disabled]);
2680
- const handleChange = useCallback8(
2681
- (_, newSelectedOption) => {
2682
- setSelectedOption(newSelectedOption);
2683
- const newValue = newSelectedOption ? getOptionValue(newSelectedOption) : null;
2684
- field.onChange(newValue);
2685
- loadedValueRef.current = newValue;
2686
- if (newSelectedOption) {
2687
- setInputValue(getOptionLabel(newSelectedOption));
2688
- } else {
2689
- setInputValue("");
2690
- setOptions([]);
2691
- }
2692
- },
2693
- [field, getOptionValue, getOptionLabel]
2694
- );
2695
- const handleInputChange = useCallback8(
2696
- (_, newInputValue) => {
2697
- setInputValue(newInputValue);
2698
- },
2699
- []
2700
- );
2701
- const handleBlur = useCallback8(() => {
2702
- if (selectedOption) {
2703
- setInputValue(getOptionLabel(selectedOption));
2704
- } else {
2705
- setInputValue("");
2706
- }
2707
- }, [selectedOption, getOptionLabel]);
2708
- const handleOpen = useCallback8(() => {
2709
- setOpen(true);
2710
- }, []);
2711
- const handleClose = useCallback8(() => {
2712
- setOpen(false);
2713
- }, []);
2714
- return /* @__PURE__ */ jsx19(FieldTooltip, { tooltipSlot, children: /* @__PURE__ */ jsx19(
2715
- Autocomplete5,
2716
- {
2717
- ...rest,
2718
- fullWidth: true,
2719
- open,
2720
- onOpen: handleOpen,
2721
- onClose: handleClose,
2722
- onBlur: handleBlur,
2723
- loading,
2724
- getOptionLabel,
2725
- getOptionKey: getOptionValue,
2726
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
2727
- autoComplete: true,
2728
- disabled: isDisabled,
2729
- includeInputInList: true,
2730
- options,
2731
- value: selectedOption,
2732
- filterSelectedOptions: true,
2733
- filterOptions: (x) => x,
2734
- onChange: handleChange,
2735
- onInputChange: handleInputChange,
2736
- sx: {
2737
- "&.Mui-disabled": {
2738
- cursor: "not-allowed !important"
2739
- },
2740
- "& .MuiInputBase-root.Mui-disabled": {
2741
- backgroundColor: theme.palette.action.disabledBackground,
2742
- cursor: "not-allowed !important"
2743
- },
2744
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
2745
- cursor: "not-allowed !important"
2746
- },
2747
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
2748
- borderColor: error ? "red" : void 0
2749
- },
2750
- "& .MuiFilledInput-root.Mui-disabled": {
2751
- borderColor: error ? "red" : void 0
2752
- }
2753
- },
2754
- noOptionsText: "Type Something...",
2755
- renderInput: (params) => /* @__PURE__ */ jsx19(
2756
- TextField8,
2757
- {
2758
- ...params,
2759
- label,
2760
- error: !!error,
2761
- helperText: error ? error.message : "",
2762
- placeholder,
2763
- slotProps: {
2764
- input: {
2765
- ...params.InputProps,
2766
- endAdornment: /* @__PURE__ */ jsxs10(Fragment3, { children: [
2767
- loading ? /* @__PURE__ */ jsx19(CircularProgress3, { color: "inherit", size: 20 }) : null,
2768
- params.InputProps.endAdornment
2769
- ] })
2770
- }
2771
- },
2772
- variant: variant ? variant : "outlined"
2773
- }
2774
- ),
2775
- renderOption: (renderProps, option) => {
2776
- const { key, ...optionProps } = renderProps;
2777
- return /* @__PURE__ */ jsx19("li", { ...optionProps, children: option[labelField] }, key);
2778
- }
2779
- }
2780
- ) });
2781
- };
2782
- var AsyncSelectElement2 = ({
2783
- gridProps = {},
2784
- ...props
2785
- }) => {
2786
- return /* @__PURE__ */ jsx19(Grid17, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx19(
2787
- Component15,
2788
- {
2789
- ...props
2790
- }
2791
- ) });
2792
- };
2793
- AsyncSelectElement2.displayName = "AsyncSelectElement";
2794
-
2795
- // src/wrappers/OTPInputElement/OTPInputElement.tsx
2796
- import { Box as Box3, Grid as Grid18, inputBaseClasses } from "@mui/material";
2797
- import {
2798
- MuiOtpInput
2799
- } from "mui-one-time-password-input";
2800
- import { Controller } from "react-hook-form";
2801
-
2802
- // src/wrappers/OTPInputElement/HelperText.tsx
2803
- import FormHelperText6 from "@mui/material/FormHelperText";
2804
- import { jsx as jsx20 } from "react/jsx-runtime";
2805
- function HelperText({
2806
- sx,
2807
- helperText,
2808
- errorMessage,
2809
- disableGutters,
2810
- ...other
2811
- }) {
2812
- if (errorMessage || helperText) {
2813
- return /* @__PURE__ */ jsx20(
2814
- FormHelperText6,
2815
- {
2816
- error: !!errorMessage,
2817
- sx: [
2818
- {
2819
- mx: disableGutters ? 0 : 1.75
2820
- },
2821
- ...Array.isArray(sx) ? sx : [sx]
2822
- ],
2823
- ...other,
2824
- children: errorMessage || helperText
2825
- }
2826
- );
2827
- }
2828
- return null;
2829
- }
2830
-
2831
- // src/wrappers/OTPInputElement/OTPInputElement.tsx
2832
- import { jsx as jsx21, jsxs as jsxs11 } from "react/jsx-runtime";
2833
- var Component16 = function OTPInputElement(props) {
2834
- const {
2835
- // parseError,
2836
- name,
2837
- control,
2838
- slotProps,
2839
- helperText,
2840
- maxSize = 56,
2841
- placeholder = "-",
2842
- ...rest
2843
- } = props;
2844
- return /* @__PURE__ */ jsx21(
2845
- Controller,
2846
- {
2847
- name,
2848
- control,
2849
- render: ({ field, fieldState: { error } }) => /* @__PURE__ */ jsxs11(
2850
- Box3,
2851
- {
2852
- ...slotProps?.wrapper,
2853
- sx: [
2854
- {
2855
- display: "flex",
2856
- justifyContent: "center",
2857
- [`& .${inputBaseClasses.input}`]: {
2858
- p: 0,
2859
- height: "auto",
2860
- aspectRatio: "1/1",
2861
- maxWidth: maxSize
2862
- }
2863
- },
2864
- ...Array.isArray(slotProps?.wrapper?.sx) ? slotProps?.wrapper?.sx ?? [] : [slotProps?.wrapper?.sx]
2865
- ],
2866
- children: [
2867
- /* @__PURE__ */ jsx21(
2868
- MuiOtpInput,
2869
- {
2870
- ...field,
2871
- autoFocus: true,
2872
- gap: 1.5,
2873
- length: 4,
2874
- TextFieldsProps: {
2875
- placeholder,
2876
- error: !!error,
2877
- ...slotProps?.textfield
2878
- },
2879
- ...rest
2880
- }
2881
- ),
2882
- /* @__PURE__ */ jsx21(
2883
- HelperText,
2884
- {
2885
- ...slotProps?.helperText,
2886
- errorMessage: error?.message,
2887
- helperText
2888
- }
2889
- )
2890
- ]
2891
- }
2892
- )
2893
- }
2894
- );
2895
- };
2896
- var OTPInputElement2 = ({
2897
- gridProps = {},
2898
- ...props
2899
- }) => {
2900
- return /* @__PURE__ */ jsx21(Grid18, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx21(Component16, { ...props }) });
2901
- };
2902
-
2903
- // src/wrappers/Field/index.ts
2904
- var Field = {
2905
- Text: TextFieldElement2,
2906
- Number: NumberFieldElement2,
2907
- Checkbox: CheckboxElement2,
2908
- Date: DatePickerElement,
2909
- RadioGroup: RadioButtonGroup2,
2910
- Password: PasswordElement,
2911
- Phone: PhoneNumberElement,
2912
- Time: TimePickerElement2,
2913
- Select: SelectElement2,
2914
- SelectMulti: SelectMultiElement2,
2915
- SelectCascade: SelectCascadeElement2,
2916
- AsyncSelect: AsyncSelectElement2,
2917
- AsyncMultiSelect: AsyncSelectMultiElement2,
2918
- CheckboxGroup: CheckboxGroupElement,
2919
- OTPInput: OTPInputElement2,
2920
- Slider: SliderElement,
2921
- FileUpload: FileUploadElement,
2922
- EditableTable: EditableTableElement
2923
- };
2924
-
2925
- export {
2926
- isValidOption,
2927
- normalizeOptions,
2928
- AsyncSelectMultiElement2 as AsyncSelectMultiElement,
2929
- CheckboxElement2 as CheckboxElement,
2930
- CheckboxGroupElement,
2931
- readDatePickerValueAsDate,
2932
- useDatePickerValue,
2933
- useDatePickerValidation,
2934
- useDatePickerStyles,
2935
- DatePickerElementCore,
2936
- DatePickerElement,
2937
- isValidDate,
2938
- isParsableDateString,
2939
- createDateInputTransform,
2940
- createDateOutputTransform,
2941
- createDefaultDatePickerConfig,
2942
- extractErrorMessage,
2943
- createStableKey,
2944
- PasswordElement,
2945
- RadioButtonGroup2 as RadioButtonGroup,
2946
- SelectCascadeElement2 as SelectCascadeElement,
2947
- SelectElement2 as SelectElement,
2948
- SelectMultiElement2 as SelectMultiElement,
2949
- TextFieldElement2 as TextFieldElement,
2950
- TimePickerElement2 as TimePickerElement,
2951
- SliderElement,
2952
- FileUploadElement,
2953
- PhoneNumberElement,
2954
- EditableTableElement,
2955
- Field
2956
- };
2957
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL3R5cGVzL2NvbW1vbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdC9Bc3luY011bHRpU2VsZWN0LnRzeCIsICIuLi9zcmMvY29yZS9jb21wb25lbnRzL0ZpZWxkVG9vbHRpcC9GaWVsZFRvb2x0aXAudHN4IiwgIi4uL3NyYy93cmFwcGVycy9DaGVja2JveEVsZW1lbnQvQ2hlY2tib3hFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hHcm91cC9DaGVja2JveEdyb3VwLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9EYXRlUGlja2VyRWxlbWVudENvcmUudHN4IiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsdWUudHMiLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L2hvb2tzL3VzZURhdGVQaWNrZXJWYWxpZGF0aW9uLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyU3R5bGVzLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC91dGlscy50cyIsICIuLi9zcmMvd3JhcHBlcnMvUGFzc3dvcmRFbGVtZW50L1Bhc3N3b3JkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1JhZGlvQnV0dG9uR3JvdXAvUmFkaW9CdXR0b25Hcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdENhc2NhZGVFbGVtZW50L1NlbGVjdENhc2NhZGVFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvU2VsZWN0RWxlbWVudC9TZWxlY3RFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvU2VsZWN0TXVsdGlFbGVtZW50L1NlbGVjdE11bHRpRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1RleHRGaWVsZEVsZW1lbnQvVGV4dEZpZWxkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1RpbWVQaWNrZXJFbGVtZW50L1RpbWVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvU2xpZGVyRWxlbWVudC9TbGlkZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRmlsZVVwbG9hZEVsZW1lbnQvRmlsZVVwbG9hZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9QaG9uZU51bWJlckVsZW1lbnQvUGhvbmVOdW1iZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRWRpdGFibGVUYWJsZUVsZW1lbnQvRWRpdGFibGVUYWJsZUVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9OdW1iZXJGaWVsZEVsZW1lbnQvTnVtYmVyRmllbGRFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNTZWxlY3QvaW5kZXgudHN4IiwgIi4uL3NyYy93cmFwcGVycy9PVFBJbnB1dEVsZW1lbnQvT1RQSW5wdXRFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvT1RQSW5wdXRFbGVtZW50L0hlbHBlclRleHQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9GaWVsZC9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb21tb24gdHlwZSBkZWZpbml0aW9ucyBmb3Igd3JhcHBlciBjb21wb25lbnRzXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuLyoqXG4gKiBCYXNlIG9wdGlvbiB0eXBlIGZvciBzZWxlY3QtYmFzZWQgY29tcG9uZW50c1xuICpcbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHZhbHVlIHR5cGUgKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VPcHRpb248ViA9IHN0cmluZyB8IG51bWJlcj4ge1xuICAvKipcbiAgICogRGlzcGxheSBsYWJlbCBmb3IgdGhlIG9wdGlvblxuICAgKi9cbiAgTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBvcHRpb25cbiAgICovXG4gIFZhbHVlOiBWO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGbGV4aWJsZSBvcHRpb24gdHlwZSB0aGF0IGV4dGVuZHMgYmFzZSBvcHRpb24gd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbiAqXG4gKiBAdGVtcGxhdGUgVCAtIEFkZGl0aW9uYWwgcHJvcGVydGllcyBvYmplY3RcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEZsZXhpYmxlT3B0aW9uPFxuICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbj4gPSBUICYgQmFzZU9wdGlvbjtcblxuLyoqXG4gKiBPcHRpb24gdHlwZSB3aXRoIGN1c3RvbWl6YWJsZSBrZXkgbmFtZXNcbiAqIFVzZWZ1bCBmb3IgY29tcG9uZW50cyB0aGF0IGFjY2VwdCBjdXN0b20gbGFiZWxGaWVsZC92YWx1ZUZpZWxkIHByb3BzXG4gKlxuICogQHRlbXBsYXRlIFRWYWx1ZUtleSAtIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciB2YWx1ZVxuICogQHRlbXBsYXRlIFRMYWJlbEtleSAtIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciBsYWJlbFxuICogQHRlbXBsYXRlIFREaXNhYmxlZEtleSAtIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciBkaXNhYmxlZCBmbGFnXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBDdXN0b21LZXlPcHRpb248XG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0gUmVjb3JkPFRWYWx1ZUtleSwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4gJlxuICBSZWNvcmQ8VExhYmVsS2V5LCBzdHJpbmc+ICZcbiAgUGFydGlhbDxSZWNvcmQ8VERpc2FibGVkS2V5LCBib29sZWFuPj4gJlxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiBMZWdhY3kgb3B0aW9uIHR5cGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlXG4gKiBVc2VzIFZhbHVlL0xhYmVsIG5hbWluZyBjb252ZW50aW9uXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIEJhc2VPcHRpb24gb3IgRmxleGlibGVPcHRpb24gaW5zdGVhZFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExlZ2FjeU9wdGlvbiB7XG4gIC8qKlxuICAgKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3B0aW9uIChjYXBpdGFsaXplZCBrZXkgbmFtZSlcbiAgICovXG4gIExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uIChjYXBpdGFsaXplZCBrZXkgbmFtZSlcbiAgICovXG4gIFZhbHVlOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBkaXNhYmxlZFxuICAgKi9cbiAgRGlzYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgdmFsaWQgb3B0aW9uXG4gKlxuICogQHBhcmFtIFZhbHVlIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgb3B0aW9uIG9iamVjdFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRPcHRpb24odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBCYXNlT3B0aW9uIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAnTGFiZWwnIGluIHZhbHVlICYmXG4gICAgJ1ZhbHVlJyBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgQmFzZU9wdGlvbikuTGFiZWwgPT09ICdzdHJpbmcnICYmXG4gICAgKHR5cGVvZiAodmFsdWUgYXMgQmFzZU9wdGlvbikuVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLlZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5WYWx1ZSA9PT0gJ2Jvb2xlYW4nKVxuICApO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBub3JtYWxpemUgb3B0aW9ucyB0byBCYXNlT3B0aW9uIGZvcm1hdFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBhcnJheSB0byBub3JtYWxpemVcbiAqIEBwYXJhbSBsYWJlbEZpZWxkIC0gQ3VzdG9tIGxhYmVsIGZpZWxkIG5hbWUgaW4gb3B0aW9uIG9iamVjdHNcbiAqIEBwYXJhbSB2YWx1ZUZpZWxkIC0gQ3VzdG9tIHZhbHVlIGZpZWxkIG5hbWUgaW4gb3B0aW9uIG9iamVjdHNcbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgb3B0aW9ucyBhcnJheVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9wdGlvbnM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgb3B0aW9uczogVFtdLFxuICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgdmFsdWVGaWVsZCA9ICdWYWx1ZSdcbik6IEJhc2VPcHRpb25bXSB7XG4gIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICBMYWJlbDogU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSA/PyAnJyksXG4gICAgVmFsdWU6IG9wdGlvblt2YWx1ZUZpZWxkXSBhcyBzdHJpbmcgfCBudW1iZXIsXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4ob3B0aW9uLmRpc2FibGVkKSxcbiAgfSkpO1xufVxuIiwgImltcG9ydCB7XG4gIEF1dG9jb21wbGV0ZSxcbiAgQ2lyY3VsYXJQcm9ncmVzcyxcbiAgZGVib3VuY2UsXG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbiAgdXNlVGhlbWUsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IG1hdGNoIGZyb20gJ2F1dG9zdWdnZXN0LWhpZ2hsaWdodC9tYXRjaCc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnYXV0b3N1Z2dlc3QtaGlnaGxpZ2h0L3BhcnNlJztcbmltcG9ydCBSZWFjdCwge1xuICB1c2VTdGF0ZSxcbiAgdXNlUmVmLFxuICB1c2VNZW1vLFxuICB1c2VFZmZlY3QsXG4gIHVzZUNhbGxiYWNrLFxuICBGcmFnbWVudCxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBIVE1MQXR0cmlidXRlcywgU3ludGhldGljRXZlbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNNdWx0aVNlbGVjdEVsZW1lbnRQcm9wcywgT3B0aW9uT2JqZWN0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7IEZpZWxkVG9vbHRpcCB9IGZyb20gJ0AvY29yZS9jb21wb25lbnRzL0ZpZWxkVG9vbHRpcCc7XG5pbXBvcnQgdHlwZSB7IEFzeW5jTXVsdGlTZWxlY3RQYXlsb2FkIH0gZnJvbSAnQC90eXBlcyc7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oXG4gIHByb3BzOiBBc3luY011bHRpU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFRPcHRpb25cbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgcXVlcnlGbixcbiAgICB2YXJpYW50LFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgdG9vbHRpcFNsb3QgPSB7fSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IFtzZWxlY3RlZE9wdGlvbnMsIHNldFNlbGVjdGVkT3B0aW9uc10gPSB1c2VTdGF0ZTxUT3B0aW9uW10+KFtdKTtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxyZWFkb25seSBUT3B0aW9uW10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbnN0IGxvYWRlZFZhbHVlc1JlZiA9IHVzZVJlZjxUT3B0aW9uW10+KFtdKTtcbiAgY29uc3QgaXNJbml0aWFsUG9wdWxhdGlvbkFjdGl2ZSA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgaW5pdGlhbExvYWRDb21wbGV0ZVJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIC8vIFN0b3JlIHNlbGVjdGVkIG9wdGlvbnMgaW4gYSByZWYgc28gRWZmZWN0IDIgY2FuIGFjY2VzcyB3aXRob3V0IGRlcGVuZGVuY3lcbiAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zUmVmID0gdXNlUmVmPFRPcHRpb25bXT4oW10pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4gKG9wdGlvbiA/IFN0cmluZyhvcHRpb25bdmFsdWVGaWVsZF0pIDogJycpLFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4gKG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZF0pIDogJycpLFxuICAgIFtsYWJlbEZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGZldGNoRGF0YSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGRlYm91bmNlKFxuICAgICAgICAoXG4gICAgICAgICAgcGF5bG9hZDogQXN5bmNNdWx0aVNlbGVjdFBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB2b2lkXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Rm4ocGF5bG9hZCkudGhlbihjID0+IHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgYyAmJlxuICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KChjIGFzIHsgZGF0YTogcmVhZG9ubHkgVE9wdGlvbltdIH0pLmRhdGEpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgKGMgYXMgeyBkYXRhOiByZWFkb25seSBUT3B0aW9uW10gfSkuZGF0YSBhcyByZWFkb25seSBUT3B0aW9uW11cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGMgJiZcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSgoYyBhcyB7IERhdGE6IHJlYWRvbmx5IFRPcHRpb25bXSB9KS5EYXRhKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKFxuICAgICAgICAgICAgICAgIChjIGFzIHsgRGF0YTogcmVhZG9ubHkgVE9wdGlvbltdIH0pLkRhdGEgYXMgcmVhZG9ubHkgVE9wdGlvbltdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjYWxsYmFjayhbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIDQwMFxuICAgICAgKSxcbiAgICBbcXVlcnlGbl1cbiAgKTtcblxuICAvLyBTeW5jIHJlZiB3aGVuZXZlciBzZWxlY3RlZE9wdGlvbnMgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNlbGVjdGVkT3B0aW9uc1JlZi5jdXJyZW50ID0gc2VsZWN0ZWRPcHRpb25zO1xuICB9LCBbc2VsZWN0ZWRPcHRpb25zXSk7XG5cbiAgLy8gRWZmZWN0IDE6IFN5bmMgd2l0aCBleHRlcm5hbCBmaWVsZC52YWx1ZSBjaGFuZ2VzIGZyb20gcmVhY3QtaG9vay1mb3JtIChJTklUSUFMIExPQUQgT05MWSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBmb3JtVmFsdWVzID0gQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgPyBmaWVsZC52YWx1ZSA6IFtdO1xuXG4gICAgLy8gQ2hlY2sgaWYgaW5pdGlhbCBsb2FkIGlzIGNvbXBsZXRlIGFuZCBjdXJyZW50IGZvcm0gdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBsb2FkZWQgb25lcy5cbiAgICAvLyBJZiBzbywgbm8gbmVlZCB0byByZWZldGNoIGZvciBpbml0aWFsIHBvcHVsYXRpb24uXG4gICAgaWYgKFxuICAgICAgaW5pdGlhbExvYWRDb21wbGV0ZVJlZi5jdXJyZW50ICYmXG4gICAgICBKU09OLnN0cmluZ2lmeShmb3JtVmFsdWVzKSA9PT0gSlNPTi5zdHJpbmdpZnkobG9hZGVkVmFsdWVzUmVmLmN1cnJlbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIGZvcm0gdmFsdWVzLCByZXNldCBhbmQgbWFyayBpbml0aWFsIGxvYWQgYXMgY29tcGxldGUuXG4gICAgaWYgKGZvcm1WYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbnMoW10pO1xuICAgICAgc2V0T3B0aW9ucyhbXSk7XG4gICAgICBsb2FkZWRWYWx1ZXNSZWYuY3VycmVudCA9IFtdO1xuICAgICAgbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgaW5pdGlhbExvYWRDb21wbGV0ZVJlZi5jdXJyZW50ID0gdHJ1ZTsgLy8gTWFyayBhcyBjb21wbGV0ZSBhcyB0aGVyZSdzIG5vdGhpbmcgdG8gZmV0Y2hcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgcHJvY2VlZCBpZiBmb3JtVmFsdWVzIGFyZSBwcmVzZW50IGFuZCB3ZSBoYXZlbid0IGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBsb2FkIGZvciB0aGVzZSBzcGVjaWZpYyB2YWx1ZXNcbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgaXNJbml0aWFsUG9wdWxhdGlvbkFjdGl2ZS5jdXJyZW50ID0gdHJ1ZTtcbiAgICAvLyBTZXQgbG9hZGVkVmFsdWVzUmVmIGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgcmUtdHJpZ2dlcmluZyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuICAgIGxvYWRlZFZhbHVlc1JlZi5jdXJyZW50ID0gZm9ybVZhbHVlcztcbiAgICAvLyBNYXJrIGluaXRpYWwgbG9hZCBhcyBjb21wbGV0ZSBwcm9hY3RpdmVseSBiZWZvcmUgZmV0Y2hpbmcgdG8gcHJldmVudCBtdWx0aXBsZSBjYWxsc1xuICAgIGluaXRpYWxMb2FkQ29tcGxldGVSZWYuY3VycmVudCA9IHRydWU7XG5cbiAgICBmZXRjaERhdGEoeyBRdWVyeTogbnVsbCwgU2VsZWN0ZWRWYWx1ZTogZm9ybVZhbHVlcyB9LCByZXN1bHRzID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgY29uc3QgZmV0Y2hlZE9wdGlvbnMgPSByZXN1bHRzIHx8IFtdO1xuXG4gICAgICAgIHNldFNlbGVjdGVkT3B0aW9ucyhbLi4uZmV0Y2hlZE9wdGlvbnNdKTtcbiAgICAgICAgc2V0T3B0aW9ucyhmZXRjaGVkT3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgaXNJbml0aWFsUG9wdWxhdGlvbkFjdGl2ZS5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW2ZpZWxkLnZhbHVlLCBmZXRjaERhdGFdKTtcblxuICAvLyBFZmZlY3QgMjogSGFuZGxlIHVzZXIgc2VhcmNoIGlucHV0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gRG9uJ3Qgc2VhcmNoIGR1cmluZyBpbml0aWFsIHBvcHVsYXRpb25cbiAgICBpZiAoaXNJbml0aWFsUG9wdWxhdGlvbkFjdGl2ZS5jdXJyZW50IHx8ICFpbml0aWFsTG9hZENvbXBsZXRlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBpbnB1dCBpcyBlbXB0eSwganVzdCBzaG93IHRoZSBzZWxlY3RlZCBvcHRpb25zXG4gICAgaWYgKCFpbnB1dFZhbHVlKSB7XG4gICAgICAvLyBJZiBubyBvcHRpb25zIGFyZSBzZWxlY3RlZCwgY2xlYXIgdGhlIG9wdGlvbnMgdG8gZGlzcGxheSBcIm5vT3B0aW9uc1RleHRcIlxuICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uc1JlZi5jdXJyZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzZXRPcHRpb25zKFtdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2hvdyB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICBzZXRPcHRpb25zKHNlbGVjdGVkT3B0aW9uc1JlZi5jdXJyZW50KTtcbiAgICAgIH1cblxuICAgICAgbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSBmZXRjaCBpZiB0aGUgaW5wdXQgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICBmZXRjaERhdGEoeyBRdWVyeTogaW5wdXRWYWx1ZSwgU2VsZWN0ZWRWYWx1ZTogbnVsbCB9LCBzZWFyY2hSZXN1bHRzID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHNlYXJjaFJlc3VsdHMgfHwgW107XG4gICAgICAgIC8vIFVzZSByZWYgdG8gZ2V0IGN1cnJlbnQgc2VsZWN0ZWQgb3B0aW9ucyB3aXRob3V0IGFkZGluZyB0byBkZXBlbmRlbmNpZXNcbiAgICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkID0gc2VsZWN0ZWRPcHRpb25zUmVmLmN1cnJlbnQ7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uSWRzID0gbmV3IFNldChcbiAgICAgICAgICBjdXJyZW50U2VsZWN0ZWQubWFwKG9wdCA9PiBnZXRPcHRpb25WYWx1ZShvcHQpKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb21iaW5lZCA9IFsuLi5jdXJyZW50U2VsZWN0ZWRdO1xuXG4gICAgICAgIHJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmICghc2VsZWN0ZWRPcHRpb25JZHMuaGFzKGdldE9wdGlvblZhbHVlKHJlc3VsdCkpKSB7XG4gICAgICAgICAgICBjb21iaW5lZC5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc2V0T3B0aW9ucyhjb21iaW5lZCk7XG4gICAgICAgIGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZi5jdXJyZW50ID0gaW5wdXRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgICAvLyBDUklUSUNBTDogUmVtb3ZlZCBzZWxlY3RlZE9wdGlvbnMgZnJvbSBkZXBlbmRlbmNpZXMgLSB1c2UgcmVmIGluc3RlYWRcbiAgfSwgW2lucHV0VmFsdWUsIGZldGNoRGF0YSwgZ2V0T3B0aW9uVmFsdWVdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXzogU3ludGhldGljRXZlbnQsIG5ld1NlbGVjdGVkT3B0aW9uczogVE9wdGlvbltdKSA9PiB7XG4gICAgc2V0U2VsZWN0ZWRPcHRpb25zKG5ld1NlbGVjdGVkT3B0aW9ucyk7XG4gICAgY29uc3QgbmV3VmFsdWVzID0gbmV3U2VsZWN0ZWRPcHRpb25zLm1hcChjID0+IGNbdmFsdWVGaWVsZF0pO1xuXG4gICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWVzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBuZXdWYWx1ZXMpO1xuICAgIGxvYWRlZFZhbHVlc1JlZi5jdXJyZW50ID0gbmV3VmFsdWVzIGFzIHVua25vd24gYXMgVE9wdGlvbltdO1xuICAgIHNldE9wdGlvbnMobmV3U2VsZWN0ZWRPcHRpb25zKTtcbiAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICAvLyBDbGVhciBsYXN0IHNlYXJjaCB0ZXJtIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXNcbiAgICBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYuY3VycmVudCA9IG51bGw7XG4gIH07XG5cbiAgY29uc3QgaXNEaXNhYmxlZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBkaXNhYmxlZCA/PyBmYWxzZTtcbiAgfSwgW2Rpc2FibGVkXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RmllbGRUb29sdGlwIHRvb2x0aXBTbG90PXt0b29sdGlwU2xvdH0+XG4gICAgICA8QXV0b2NvbXBsZXRlXG4gICAgICAgIG11bHRpcGxlXG4gICAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbCkgPT5cbiAgICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWwpXG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgdmFsdWU9e3NlbGVjdGVkT3B0aW9uc31cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgICAgZmlsdGVyT3B0aW9ucz17eCA9PiB4fVxuICAgICAgICBub09wdGlvbnNUZXh0PVwiVHlwZSBTb21ldGhpbmcuLi5cIlxuICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICBzeD17e1xuICAgICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgJyYgLk11aUZpbGxlZElucHV0LXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfX1cbiAgICAgICAgb25JbnB1dENoYW5nZT17KF8sIG5ld0lucHV0VmFsdWUpID0+IHNldElucHV0VmFsdWUobmV3SW5wdXRWYWx1ZSl9XG4gICAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgICAgSW5wdXRQcm9wcz17e1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHJlbmRlck9wdGlvbj17KHByb3BzLCBvcHRpb24sIHN0YXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBrZXksIC4uLm9wdGlvblByb3BzIH0gPVxuICAgICAgICAgICAgcHJvcHMgYXMgSFRNTEF0dHJpYnV0ZXM8SFRNTExJRWxlbWVudD4gJiB7IGtleTogc3RyaW5nIH07XG4gICAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSBnZXRPcHRpb25MYWJlbChvcHRpb24pO1xuICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBtYXRjaChvcHRpb25MYWJlbCwgc3RhdGUuaW5wdXRWYWx1ZSwge1xuICAgICAgICAgICAgaW5zaWRlV29yZHM6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZShvcHRpb25MYWJlbCwgbWF0Y2hlcyk7XG5cbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGxpIGtleT17a2V5fSB7Li4ub3B0aW9uUHJvcHN9PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtwYXJ0cy5tYXAoKHBhcnQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHBhcnQuaGlnaGxpZ2h0ID8gNzAwIDogNDAwLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7cGFydC50ZXh0fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgKTtcbiAgICAgICAgfX1cbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAvPlxuICAgIDwvRmllbGRUb29sdGlwPlxuICApO1xufTtcblxuY29uc3QgQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleVxuICA+LFxuPih7XG4gIGdyaWRQcm9wcyxcbiAgLi4ucHJvcHNcbn06IEFzeW5jTXVsdGlTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBUT3B0aW9uXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPlxuICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPiB7Li4ucHJvcHN9IC8+XG4gICk7XG59O1xuXG5Bc3luY1NlbGVjdE11bHRpRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdBc3luY1NlbGVjdE11bHRpJztcblxuZXhwb3J0IHsgQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQgfTtcbiIsICJpbXBvcnQgdHlwZSB7IFRvb2x0aXBQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgU3RhY2ssIFRvb2x0aXAsIFR5cG9ncmFwaHkgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlLCBSZWFjdEVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRUb29sdGlwU2xvdCB7XG4gIHRleHQ/OiBSZWFjdE5vZGU7XG4gIHByaW1hcnk/OiBSZWFjdE5vZGU7XG4gIHNlY29uZGFyeT86IFJlYWN0Tm9kZTtcbiAgdG9vbHRpcFByb3BzPzogVG9vbHRpcFByb3BzO1xufVxuXG5pbnRlcmZhY2UgRmllbGRUb29sdGlwUHJvcHMge1xuICB0b29sdGlwU2xvdD86IEZpZWxkVG9vbHRpcFNsb3Q7XG4gIGNoaWxkcmVuOiBSZWFjdEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBGaWVsZFRvb2x0aXAgPSAoeyB0b29sdGlwU2xvdCwgY2hpbGRyZW4gfTogRmllbGRUb29sdGlwUHJvcHMpID0+IHtcbiAgaWYgKCF0b29sdGlwU2xvdCkgcmV0dXJuIGNoaWxkcmVuO1xuXG4gIGNvbnN0IHtcbiAgICB0ZXh0LFxuICAgIHByaW1hcnk6IGRlc2NyaXB0aW9uLFxuICAgIHNlY29uZGFyeTogZXhhbXBsZSxcbiAgICB0b29sdGlwUHJvcHMsXG4gIH0gPSB0b29sdGlwU2xvdDtcblxuICBjb25zdCB0aXRsZSA9XG4gICAgdGV4dCA/P1xuICAgIChkZXNjcmlwdGlvbiB8fCBleGFtcGxlID8gKFxuICAgICAgPFN0YWNrIHNwYWNpbmc9ezAuNX0+XG4gICAgICAgIHtkZXNjcmlwdGlvbiAmJiAoXG4gICAgICAgICAgPFR5cG9ncmFwaHkgdmFyaWFudD1cImNhcHRpb25cIj57ZGVzY3JpcHRpb259PC9UeXBvZ3JhcGh5PlxuICAgICAgICApfVxuXG4gICAgICAgIHtleGFtcGxlICYmIChcbiAgICAgICAgICA8VHlwb2dyYXBoeSB2YXJpYW50PVwiY2FwdGlvblwiIHN4PXt7IG9wYWNpdHk6IDAuNzUgfX0+XG4gICAgICAgICAgICBlLmcuIHtleGFtcGxlfVxuICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgKX1cbiAgICAgIDwvU3RhY2s+XG4gICAgKSA6IG51bGwpO1xuXG4gIGlmICghdGl0bGUpIHJldHVybiBjaGlsZHJlbjtcblxuICByZXR1cm4gKFxuICAgIDxUb29sdGlwIHRpdGxlPXt0aXRsZX0gYXJyb3cgcGxhY2VtZW50PVwidG9wXCIgey4uLnRvb2x0aXBQcm9wc30+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9Ub29sdGlwPlxuICApO1xufTtcbiIsICJpbXBvcnQge1xuICBDaGVja2JveCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Db250cm9sTGFiZWwsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEdyaWQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMsIFBhdGhWYWx1ZSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgdXNlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtJztcblxuaW1wb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBDaGVja2JveEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgbGFiZWwsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBoZWxwZXJUZXh0LFxuICAgIHBhcnNlRXJyb3IsXG4gICAgdHJhbnNmb3JtLFxuICAgIGRpc2FibGVkLFxuICAgIG9uQ2hhbmdlOiBjdXN0b21PbkNoYW5nZSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRpc2FibGVkLFxuICB9KTtcblxuICBpZiAoZmllbGQudmFsdWUgPT0gbnVsbCB8fCBmaWVsZC52YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICBmaWVsZC5vbkNoYW5nZShmYWxzZSk7XG4gIH1cblxuICBjb25zdCBjdXN0b21PdXRwdXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm0/Lm91dHB1dDtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIGJvb2xlYW4+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6IHZhbHVlID0+ICEhdmFsdWUsXG4gICAgICBvdXRwdXQ6XG4gICAgICAgIHR5cGVvZiBjdXN0b21PdXRwdXRUcmFuc2Zvcm0gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IChldmVudE9yVmFsdWUsIF92YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAvLyBBZGFwdGVyOiBFeHRyYWN0IGV2ZW50IGFuZCBjaGVja2VkIGZyb20gdGhlIGNoZWNrYm94IG9uQ2hhbmdlIHNpZ25hdHVyZVxuICAgICAgICAgICAgICAvLyBDaGVja2JveEVsZW1lbnQgcGFzc2VzIChldmVudCwgY2hlY2tlZCksIGJ1dCB1c2VUcmFuc2Zvcm0gZXhwZWN0cyAoZXZlbnRPclZhbHVlLCB2YWx1ZSlcbiAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBldmVudE9yVmFsdWUgYXMgUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD47XG4gICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSBfdmFsdWUgYXMgdW5rbm93biBhcyBib29sZWFuO1xuXG4gICAgICAgICAgICAgIHJldHVybiBjdXN0b21PdXRwdXRUcmFuc2Zvcm0oZXZlbnQsIGNoZWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIDogKGV2ZW50T3JWYWx1ZSwgX3ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIERlZmF1bHQ6IGV4dHJhY3QgY2hlY2tlZCBzdGF0ZSBmcm9tIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSBfdmFsdWUgYXMgdW5rbm93biBhcyBib29sZWFuO1xuXG4gICAgICAgICAgICAgIHJldHVybiBjaGVja2VkIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PixcbiAgICBjaGVja2VkOiBib29sZWFuXG4gICkgPT4ge1xuICAgIG9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjdXN0b21PbkNoYW5nZShldmVudCwgY2hlY2tlZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRpc3BsYXlFcnJvcjogUmVhY3ROb2RlID0gZXJyb3JcbiAgICA/IHR5cGVvZiBwYXJzZUVycm9yID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHBhcnNlRXJyb3IoZXJyb3IpXG4gICAgICA6IGVycm9yLm1lc3NhZ2VcbiAgICA6IG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2wgZXJyb3I9eyEhZXJyb3J9IGRpc2FibGVkPXtkaXNhYmxlZH0+XG4gICAgICA8Rm9ybUdyb3VwIHJvdz5cbiAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICBsYWJlbD17bGFiZWwgfHwgJyd9XG4gICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCAncHJpbWFyeSd9XG4gICAgICAgICAgICAgIGNoZWNrZWQ9e3ZhbHVlfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIHsoZGlzcGxheUVycm9yIHx8IGhlbHBlclRleHQpICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7ZGlzcGxheUVycm9yIHx8IGhlbHBlclRleHR9XG4gICAgICAgIDwvRm9ybUhlbHBlclRleHQ+XG4gICAgICApfVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQ2hlY2tib3ggY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24gYW5kIGdyaWQgbGF5b3V0LlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBjaGVja2JveCBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIG9wdGlvbmFsIEdyaWQgd3JhcHBlciBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvbiB3aXRoIHVzZUNvbnRyb2xsZXJcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZyBzdXBwb3J0XG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHdpdGggdXNlVHJhbnNmb3JtIGhvb2sgZm9yIGJvb2xlYW4gdmFsdWVzXG4gKiAtIEN1c3RvbWl6YWJsZSBsYWJlbCBhbmQgcG9zaXRpb25pbmdcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlciB3aXRoIHJlc3BvbnNpdmUgZGVzaWduXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHkgd2l0aCBnZW5lcmljIGNvbnN0cmFpbnRzXG4gKiAtIERpc2FibGVkIHN0YXRlIHN1cHBvcnQgd2l0aCBwcm9wZXIgdGhlbWluZ1xuICogLSBIZWxwZXIgdGV4dCBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIGNvbnRleHRcbiAqIC0gQ3VzdG9tIGVycm9yIHBhcnNpbmcgZm9yIGludGVybmF0aW9uYWxpemF0aW9uXG4gKiAtIFNpbXBsZSBib29sZWFuIHZhbHVlIGhhbmRsaW5nIHdpdGggb3B0aW9uYWwgY3VzdG9tIHRyYW5zZm9ybXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFjY2VwdFRlcm1zXCJcbiAqICAgbGFiZWw9XCJJIGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1wiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggdmFsaWRhdGlvbiBhbmQgaGVscGVyIHRleHQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cIm5ld3NsZXR0ZXJcIlxuICogICBsYWJlbD1cIlN1YnNjcmliZSB0byBuZXdzbGV0dGVyXCJcbiAqICAgaGVscGVyVGV4dD1cIllvdSBjYW4gdW5zdWJzY3JpYmUgYXQgYW55IHRpbWVcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ1BsZWFzZSBhY2NlcHQgdG8gY29udGludWUnIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBncmlkIGxheW91dCBhbmQgc3R5bGluZzpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiaXNQdWJsaWNcIlxuICogICBsYWJlbD1cIk1ha2UgdGhpcyBwdWJsaWNcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgbGFiZWxQcm9wcz17eyBzeDogeyBmb250V2VpZ2h0OiAnYm9sZCcgfSB9fVxuICogICBzeD17eyBjb2xvcjogJ3ByaW1hcnkubWFpbicgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiAoc3RyaW5nIHRvIGJvb2xlYW4pOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJzdGF0dXNcIlxuICogICBsYWJlbD1cIkFjdGl2ZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID09PSAnYWN0aXZlJyxcbiAqICAgICBvdXRwdXQ6IChjaGVja2VkKSA9PiBjaGVja2VkID8gJ2FjdGl2ZScgOiAnaW5hY3RpdmUnXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFNpbXBsZSBib29sZWFuIGZpZWxkOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJpc0VuYWJsZWRcIlxuICogICBsYWJlbD1cIkVuYWJsZSBmZWF0dXJlXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGVycm9yIHBhcnNpbmcgZm9yIGludGVybmF0aW9uYWxpemF0aW9uOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ0ZXJtc1wiXG4gKiAgIGxhYmVsPVwiQWNjZXB0IFRlcm1zXCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiB0KGB2YWxpZGF0aW9uLiR7ZXJyb3IudHlwZX1gLCB7IGZpZWxkOiAnVGVybXMnIH0pfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQ2hlY2tib3hFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBDaGVja2JveEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZT4gey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbmV4cG9ydCB7IENoZWNrYm94RWxlbWVudCB9O1xuXG5leHBvcnQgdHlwZSB7IENoZWNrYm94RWxlbWVudFByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBDaGVja2JveFByb3BzLFxuICBGb3JtQ29udHJvbExhYmVsUHJvcHMsXG4gIEZvcm1MYWJlbFByb3BzLFxuICBHcmlkUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBGb3JtTGFiZWwsXG4gIEdyaWQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgQ2hlY2tib3hHcm91cCBjb21wb25lbnRcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdmFsdWUgYXJyYXkgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG4vLyBUeXBlIGZvciBwcmltaXRpdmUgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgcmFkaW8gYnV0dG9uIHZhbHVlc1xudHlwZSBQcmltaXRpdmVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIENvbnN0cmFpbnQgdG8gZW5zdXJlIG9wdGlvbiBvYmplY3RzIGhhdmUgdGhlIHJlcXVpcmVkIGtleXNcbnR5cGUgT3B0aW9uT2JqZWN0PFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IFJlY29yZDxUVmFsdWVLZXksIFByaW1pdGl2ZVZhbHVlPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PjtcblxuZXhwb3J0IHR5cGUgQ2hlY2tib3hHcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4gPSBPbWl0PENoZWNrYm94UHJvcHMsICduYW1lJz4gJiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG5cbiAgLyoqXG4gICAqIExhYmVsIGZvciB0aGUgY2hlY2tib3ggZ3JvdXBcbiAgICovXG4gIGxhYmVsPzogRm9ybUNvbnRyb2xMYWJlbFByb3BzWydsYWJlbCddO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciBGb3JtQ29udHJvbExhYmVsXG4gICAqL1xuICBsYWJlbFByb3BzPzogT21pdDxGb3JtQ29udHJvbExhYmVsUHJvcHMsICdsYWJlbCcgfCAnY29udHJvbCc+O1xuXG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXJcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG5cbiAgb3B0aW9uczogVE9wdGlvbltdO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGZvcm1MYWJlbFByb3BzPzogT21pdDxGb3JtTGFiZWxQcm9wcywgJ3JlcXVpcmVkJyB8ICdlcnJvcic+O1xuXG4gIGxhYmVsS2V5PzogVExhYmVsS2V5O1xuICB2YWx1ZUtleT86IFRWYWx1ZUtleTtcbiAgZGlzYWJsZWRLZXk/OiBURGlzYWJsZWRLZXk7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBDaGVja2JveEdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4oXG4gIHByb3BzOiBDaGVja2JveEdyb3VwUHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb24sXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgbGFiZWwsXG4gICAgcmVxdWlyZWQsXG4gICAgZm9ybUxhYmVsUHJvcHMsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBsYWJlbEtleSA9ICdMYWJlbCcgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlS2V5ID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgb3B0aW9ucyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRpc2FibGVkOiByZXN0LmRpc2FibGVkLFxuICB9KTtcblxuICBjb25zdCBzZWxlY3RlZFZhbHVlc0FzU3RyaW5nID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpID8gZmllbGQudmFsdWUgOiBbXVxuICApLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZWRWYWx1ZVN0cmluZyA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xuXG4gICAgICBjb25zdCBuZXdTZWxlY3RlZFZhbHVlc1N0cmluZyA9IGlzQ2hlY2tlZFxuICAgICAgICA/IFsuLi5zZWxlY3RlZFZhbHVlc0FzU3RyaW5nLCBjaGFuZ2VkVmFsdWVTdHJpbmddXG4gICAgICAgIDogc2VsZWN0ZWRWYWx1ZXNBc1N0cmluZy5maWx0ZXIodiA9PiB2ICE9PSBjaGFuZ2VkVmFsdWVTdHJpbmcpO1xuXG4gICAgICBjb25zdCBvcHRpb25zQXJlTnVtZXJpYyA9XG4gICAgICAgIG9wdGlvbnMubGVuZ3RoID4gMCAmJiB0eXBlb2Ygb3B0aW9uc1swXVt2YWx1ZUtleV0gPT09ICdudW1iZXInO1xuXG4gICAgICBpZiAob3B0aW9uc0FyZU51bWVyaWMpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzQXNOdW1iZXJzID0gbmV3U2VsZWN0ZWRWYWx1ZXNTdHJpbmdcbiAgICAgICAgICAubWFwKHYgPT4gcGFyc2VJbnQodiwgMTApKVxuICAgICAgICAgIC5maWx0ZXIodiA9PiAhaXNOYU4odikpO1xuXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlc0FzTnVtYmVycyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdTZWxlY3RlZFZhbHVlc1N0cmluZyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmllbGQsIG9wdGlvbnMsIHZhbHVlS2V5LCBzZWxlY3RlZFZhbHVlc0FzU3RyaW5nXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIHtsYWJlbCAmJiAoXG4gICAgICAgIDxGb3JtTGFiZWwgey4uLmZvcm1MYWJlbFByb3BzfSByZXF1aXJlZD17cmVxdWlyZWR9IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvRm9ybUxhYmVsPlxuICAgICAgKX1cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICB7b3B0aW9ucyAmJlxuICAgICAgICAgIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgICBrZXk9e2Ake29wdGlvblt2YWx1ZUtleV19YH1cbiAgICAgICAgICAgICAgbGFiZWw9e29wdGlvbltsYWJlbEtleV19XG4gICAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICAgICAgY29sb3I9e3Jlc3QuY29sb3IgfHwgJ3ByaW1hcnknfVxuICAgICAgICAgICAgICAgICAgdmFsdWU9e29wdGlvblt2YWx1ZUtleV19XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZFZhbHVlc0FzU3RyaW5nLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICBTdHJpbmcob3B0aW9uW3ZhbHVlS2V5XSlcbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIHtlcnJvciAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dCBlcnJvcj17ISFlcnJvcn0+e2Vycm9yLm1lc3NhZ2V9PC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBDaGVja2JveEdyb3VwIGNvbXBvbmVudCBmb3IgbXVsdGlwbGUgY2hlY2tib3ggc2VsZWN0aW9uLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZ3JvdXAgb2YgY2hlY2tib3hlcyB0aGF0IHdvcmsgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIG1hbmFnaW5nIGFuIGFycmF5IG9mIHNlbGVjdGVkIHZhbHVlcyB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGFuZCBlcnJvciBoYW5kbGluZy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gTXVsdGlwbGUgY2hlY2tib3ggc2VsZWN0aW9uIHdpdGggYXJyYXkgdmFsdWUgbWFuYWdlbWVudFxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydFxuICogLSBOYU4gdmFsaWRhdGlvbiBmb3IgbnVtZXJpYyB2YWx1ZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEdyb3VwXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJzZWxlY3RlZENhdGVnb3JpZXNcIlxuICogICBvcHRpb25zPXtbXG4gKiAgICAgeyBWYWx1ZTogMSwgTGFiZWw6ICdDYXRlZ29yeSAxJyB9LFxuICogICAgIHsgVmFsdWU6IDIsIExhYmVsOiAnQ2F0ZWdvcnkgMicgfSxcbiAqICAgICB7IFZhbHVlOiAzLCBMYWJlbDogJ0NhdGVnb3J5IDMnIH0sXG4gKiAgIF19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hHcm91cFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicGVybWlzc2lvbnNcIlxuICogICBvcHRpb25zPXtwZXJtaXNzaW9uT3B0aW9uc31cbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIGRpc2FibGVkPXshaGFzRWRpdFBlcm1pc3Npb259XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHZhbHVlIGFycmF5IHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IENoZWNrYm94R3JvdXBFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IENoZWNrYm94R3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVE9wdGlvbixcbiAgVFZhbHVlS2V5LFxuICBUTGFiZWxLZXksXG4gIFREaXNhYmxlZEtleVxuPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbkNoZWNrYm94R3JvdXBFbGVtZW50LmRpc3BsYXlOYW1lID0gJ0NoZWNrYm94R3JvdXAnO1xuXG5leHBvcnQgeyBDaGVja2JveEdyb3VwRWxlbWVudCB9O1xuIiwgImltcG9ydCB7IEdyaWQgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9IGZyb20gXCIuL0RhdGVQaWNrZXJFbGVtZW50Q29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyRWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBBIGZ1bGx5LWZlYXR1cmVkLCB0eXBlLXNhZmUgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IGZvciByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgY29tYmluZXMgdGhlIGNvcmUgZGF0ZSBwaWNrZXIgZnVuY3Rpb25hbGl0eSB3aXRoIG9wdGlvbmFsIEdyaWQgbGF5b3V0IHdyYXBwaW5nLFxuICogcHJvdmlkaW5nIGEgY29tcGxldGUgc29sdXRpb24gZm9yIGZvcm0tYmFzZWQgZGF0ZSBzZWxlY3Rpb24gd2l0aCBjb21wcmVoZW5zaXZlIFR5cGVTY3JpcHQgc3VwcG9ydC5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIFx1RDgzQ1x1REZBRiAqKlR5cGUgU2FmZXR5Kio6IEZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2UgZm9yIGZvcm0gZmllbGQgdHlwZXMgYW5kIGRhdGUgdmFsdWVzXG4gKiAtIFx1RDgzRFx1REQyNyAqKlJlYWN0IEhvb2sgRm9ybSBJbnRlZ3JhdGlvbioqOiBTZWFtbGVzcyBpbnRlZ3JhdGlvbiB3aXRoIHJlYWN0LWhvb2stZm9ybSB2YWxpZGF0aW9uXG4gKiAtIFx1RDgzQ1x1REZBOCAqKlRoZW1pbmcqKjogQXV0b21hdGljIGFkYXB0YXRpb24gdG8gTVVJIHRoZW1lIHdpdGggY3VzdG9taXphYmxlIHN0eWxlc1xuICogLSBcdTI2N0YgKipBY2Nlc3NpYmlsaXR5Kio6IFdDQUctY29tcGxpYW50IHdpdGggcHJvcGVyIEFSSUEgYXR0cmlidXRlcyBhbmQga2V5Ym9hcmQgbmF2aWdhdGlvblxuICogLSBcdUQ4M0RcdURFODAgKipQZXJmb3JtYW5jZSoqOiBPcHRpbWl6ZWQgd2l0aCBtZW1vaXphdGlvbiBhbmQgZWZmaWNpZW50IHJlLXJlbmRlcmluZ1xuICogLSBcdUQ4M0RcdURDRjEgKipSZXNwb25zaXZlKio6IEJ1aWx0LWluIEdyaWQgbGF5b3V0IHdpdGggY29uZmlndXJhYmxlIGJyZWFrcG9pbnRzXG4gKiAtIFx1RDgzRFx1REVFMVx1RkUwRiAqKlZhbGlkYXRpb24qKjogQ29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKiAtIFx1RDgzRFx1REQwNCAqKlRyYW5zZm9ybWF0aW9uKio6IEZsZXhpYmxlIHZhbHVlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gZm9ybSBhbmQgcGlja2VyIGZvcm1hdHNcbiAqIC0gXHVEODNEXHVEQ0RBICoqRGV2ZWxvcGVyIEV4cGVyaWVuY2UqKjogUmljaCBUeXBlU2NyaXB0IEludGVsbGlTZW5zZSBhbmQgY29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIEdyaWQgd3JhcHBlcjpcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlRm9ybSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG4gKiBpbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gJ0BnbndlYnNvZnQvdWkvd3JhcHBlcnMnO1xuICpcbiAqIGZ1bmN0aW9uIE15Rm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgYmlydGhEYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICBuYW1lPVwiYmlydGhEYXRlXCJcbiAqICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICAgICAgcmVxdWlyZWRcbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIHRyYW5zZm9ybWF0aW9uIGFuZCB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBZHZhbmNlZEZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IHN0YXJ0RGF0ZTogRGF0ZSB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJzdGFydERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiUHJvamVjdCBTdGFydCBEYXRlXCJcbiAqICAgICAgIHRyYW5zZm9ybT17e1xuICogICAgICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgICAgICB9fVxuICogICAgICAgdmFsaWRhdGlvbj17e1xuICogICAgICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICogICAgICAgICBtYXhEYXRlOiBhZGRZZWFycyhuZXcgRGF0ZSgpLCAyKSxcbiAqICAgICAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgICAgIG1pbkRhdGU6ICdTdGFydCBkYXRlIG11c3QgYmUgdG9kYXkgb3IgbGF0ZXInLFxuICogICAgICAgICAgIG1heERhdGU6ICdTdGFydCBkYXRlIGNhbm5vdCBiZSBtb3JlIHRoYW4gMiB5ZWFycyBpbiB0aGUgZnV0dXJlJ1xuICogICAgICAgICB9XG4gKiAgICAgICB9fVxuICogICAgICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgICAgICBzeD17e1xuICogICAgICAgICAnJiAuTXVpSW5wdXRMYWJlbC1yb290Jzoge1xuICogICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJ1xuICogICAgICAgICB9XG4gKiAgICAgICB9fVxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aG91dCBHcmlkIHdyYXBwZXIgZm9yIGN1c3RvbSBsYXlvdXRzOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBDdXN0b21MYXlvdXQoKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IGV2ZW50RGF0ZTogc3RyaW5nIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxCb3ggZGlzcGxheT1cImZsZXhcIiBnYXA9ezJ9PlxuICogICAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICAgIG5hbWU9XCJldmVudERhdGVcIlxuICogICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgICBsYWJlbD1cIkV2ZW50IERhdGVcIlxuICogICAgICAgICBncmlkUHJvcHM9e2ZhbHNlfSAvLyBEaXNhYmxlcyBHcmlkIHdyYXBwZXJcbiAqICAgICAgIC8+XG4gKiAgICAgICA8QnV0dG9uIHR5cGU9XCJzdWJtaXRcIj5TdWJtaXQ8L0J1dHRvbj5cbiAqICAgICA8L0JveD5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGxvYWRpbmcgc3RhdGUgYW5kIGN1c3RvbSBlcnJvciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gTG9hZGluZ0Zvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybSgpO1xuICogICBjb25zdCBbaXNWYWxpZGF0aW5nLCBzZXRJc1ZhbGlkYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJhcHBvaW50bWVudERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiQXBwb2ludG1lbnQgRGF0ZVwiXG4gKiAgICAgICBsb2FkaW5nPXtpc1ZhbGlkYXRpbmd9XG4gKiAgICAgICBMb2FkaW5nQ29tcG9uZW50PXsoKSA9PiA8Q2lyY3VsYXJQcm9ncmVzcyBzaXplPXsyMH0gLz59XG4gKiAgICAgICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHtcbiAqICAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3I/LnR5cGUgPT09ICdjdXN0b20nKSB7XG4gKiAgICAgICAgICAgcmV0dXJuICdUaGlzIGRhdGUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBhcHBvaW50bWVudCc7XG4gKiAgICAgICAgIH1cbiAqICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBkYXRlJztcbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZSAoaW5mZXJyZWQgZnJvbSBjb250cm9sKVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZSAoaW5mZXJyZWQgZnJvbSBuYW1lIHByb3ApXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGUgKGluZmVycmVkIGZyb20gdHJhbnNmb3JtIGZ1bmN0aW9ucylcbiAqIEB0ZW1wbGF0ZSBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIC0gV2hldGhlciBhY2Nlc3NpYmxlIGZpZWxkIERPTSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyB3aXRoIGZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2VcbiAqIEBwYXJhbSByZWYgLSBGb3J3YXJkIHJlZiBmb3IgdGhlIHJvb3QgZWxlbWVudCAoR3JpZCBvciBEYXRlUGlja2VyIGNvbnRhaW5lcilcbiAqIEByZXR1cm5zIFJlbmRlcmVkIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICovXG5jb25zdCBEYXRlUGlja2VyRWxlbWVudCA9IGZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBEYXRlUGlja2VyRWxlbWVudFByb3BzPGFueSwgYW55LCBhbnksIGFueT5cbj4oPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIHByb3BzOiBEYXRlUGlja2VyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSwgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gIHJlZjogUmVhY3QuUmVmPEhUTUxEaXZFbGVtZW50PlxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAgIC4uLmNvcmVQcm9wc1xuICB9ID0gcHJvcHM7XG5cbiAgLy8gSWYgZ3JpZFByb3BzIGlzIGV4cGxpY2l0bHkgZmFsc2UsIHJlbmRlciB3aXRob3V0IEdyaWQgd3JhcHBlclxuICBpZiAoZ3JpZFByb3BzID09PSBmYWxzZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICB7Li4uY29yZVByb3BzfVxuICAgICAgLz5cbiAgICApO1xuICB9XG5cbiAgLy8gUmVuZGVyIHdpdGggR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dFxuICByZXR1cm4gKFxuICAgIDxHcmlkXG4gICAgICByZWY9e3JlZn1cbiAgICAgIHsuLi5ncmlkUHJvcHN9XG4gICAgPlxuICAgICAgPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICAgICAgICB7Li4uY29yZVByb3BzfVxuICAgICAgLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59KTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgUmVhY3QgRGV2ZWxvcGVyIFRvb2xzXG5EYXRlUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiRGF0ZVBpY2tlckVsZW1lbnRcIjtcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnQgfTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBpY2tlckVsZW1lbnQ7XG4iLCAiaW1wb3J0IHsgVG9vbHRpcCwgdXNlRm9ya1JlZiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlciB9IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMnO1xuaW1wb3J0IHR5cGUge1xuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxuICBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dCxcbiAgUGlja2VyVmFsaWREYXRlLFxufSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFZhbHVlcywgRmllbGRQYXRoIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHtcbiAgdXNlRGF0ZVBpY2tlclZhbHVlLFxuICB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbixcbiAgdXNlRGF0ZVBpY2tlclN0eWxlcyxcbn0gZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBGaWVsZFRvb2x0aXAgfSBmcm9tICdAL2NvcmUvY29tcG9uZW50cy9GaWVsZFRvb2x0aXAnO1xuXG4vKipcbiAqIFRoZSBjb3JlIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCB3aXRob3V0IEdyaWQgd3JhcHBlci5cbiAqXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQsIHBlcmZvcm1hbnQgZGF0ZSBwaWNrZXIgY29tcG9uZW50IHRoYXQgaW50ZWdyYXRlcyBzZWFtbGVzc2x5XG4gKiB3aXRoIHJlYWN0LWhvb2stZm9ybSB3aGlsZSBwcm92aWRpbmcgY29tcHJlaGVuc2l2ZSBUeXBlU2NyaXB0IHN1cHBvcnQgYW5kXG4gKiBhY2Nlc3NpYmlsaXR5IGZlYXR1cmVzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBmb3JtIGZpZWxkIHR5cGVzXG4gKiAtIEF1dG9tYXRpYyB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGZvcm0gYW5kIHBpY2tlciBmb3JtYXRzXG4gKiAtIENvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlc1xuICogLSBUaGVtZS1hd2FyZSBzdHlsaW5nIHdpdGggYWNjZXNzaWJpbGl0eSBzdXBwb3J0XG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXplZCB3aXRoIHByb3BlciBtZW1vaXphdGlvblxuICogLSBGb3J3YXJkIHJlZiBzdXBwb3J0IGZvciBhZHZhbmNlZCB1c2UgY2FzZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAqICAgbmFtZT1cImJpcnRoRGF0ZVwiXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgIHJlcXVpcmVkXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHRyYW5zZm9ybWF0aW9uOlxuICogYGBgdHN4XG4gKiA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gKiAgIG5hbWU9XCJzdGFydERhdGVcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIlN0YXJ0IERhdGVcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfX1cbiAqICAgdmFsaWRhdGlvbj17e1xuICogICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcidcbiAqICAgICB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIC0gV2hldGhlciBhY2Nlc3NpYmxlIGZpZWxkIERPTSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZFxuICovXG5jb25zdCBEYXRlUGlja2VyRWxlbWVudENvcmUgPSBmb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPihcbiAgPFxuICAgIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gICAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICAgIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICA+KFxuICAgIHByb3BzOiBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wczxcbiAgICAgIFRGaWVsZFZhbHVlcyxcbiAgICAgIFROYW1lLFxuICAgICAgVFZhbHVlLFxuICAgICAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZVxuICAgID4sXG4gICAgcmVmOiBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+XG4gICkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICByZXF1aXJlZCA9IGZhbHNlLFxuICAgICAgY29udHJvbCxcbiAgICAgIHBhcnNlRXJyb3IsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB2YWxpZGF0aW9uLFxuICAgICAgbGFiZWwsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHRleHRSZWFkT25seSA9IGZhbHNlLFxuICAgICAgaGVscGVyVGV4dCxcbiAgICAgIGlucHV0UHJvcHMgPSB7fSxcbiAgICAgIHNsb3RQcm9wcyA9IHt9LFxuICAgICAgZGF0ZVBpY2tlclByb3BzID0ge30sXG4gICAgICB2YXJpYW50ID0gJ291dGxpbmVkJyxcbiAgICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgICB0b29sdGlwU2xvdCA9IHt9LFxuICAgICAgLi4ucmVzdFByb3BzXG4gICAgfSA9IHByb3BzO1xuXG4gICAgLy8gRXh0cmFjdCBEYXRlUGlja2VyLXNwZWNpZmljIHByb3BzXG4gICAgY29uc3Qge1xuICAgICAgZGlzYWJsZWQsXG4gICAgICBpbnB1dFJlZjogZXh0ZXJuYWxJbnB1dFJlZixcbiAgICAgIG9uQ2xvc2UsXG4gICAgICAuLi5yZXN0RGF0ZVBpY2tlclByb3BzXG4gICAgfSA9IGRhdGVQaWNrZXJQcm9wcztcblxuICAgIC8vIFNldCB1cCBmb3JtIGNvbnRyb2xsZXJcbiAgICBjb25zdCB7IGZpZWxkLCBmaWVsZFN0YXRlIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICAgIG5hbWUsXG4gICAgICBjb250cm9sLFxuICAgICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIGFueSwgLy8gTGV0IHJlYWN0LWhvb2stZm9ybSBoYW5kbGUgdGhlIGRlZmF1bHQgdmFsdWUgdHlwaW5nXG4gICAgfSk7XG5cbiAgICAvLyBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBob29rXG4gICAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2U6IG9uVmFsdWVDaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gICAgICBmaWVsZCxcbiAgICAgIHRyYW5zZm9ybSxcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRpb24gaG9va1xuICAgIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSwgaW52YWxpZCB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICAgICAgZmllbGRTdGF0ZSxcbiAgICAgIHZhbGlkYXRpb24sXG4gICAgICBwYXJzZUVycm9yLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG5cbiAgICAvLyBTdHlsaW5nIGhvb2tcbiAgICBjb25zdCB7IGNsYXNzTmFtZSB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGhhc0Vycm9yLFxuICAgICAgbG9hZGluZyxcbiAgICAgIHRleHRSZWFkT25seSxcbiAgICB9KTtcblxuICAgIC8vIE1lcmdlIGlucHV0IHJlZnNcbiAgICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBleHRlcm5hbElucHV0UmVmKTtcblxuICAgIC8vIE1lbW9pemVkIGNoYW5nZSBoYW5kbGVyIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKFxuICAgICAgICBuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCxcbiAgICAgICAgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj5cbiAgICAgICkgPT4ge1xuICAgICAgICBvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICBbb25WYWx1ZUNoYW5nZV1cbiAgICApO1xuXG4gICAgLy8gTWVtb2l6ZWQgY2xvc2UgaGFuZGxlclxuICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soXG4gICAgICAoLi4uYXJnczogUGFyYW1ldGVyczxOb25OdWxsYWJsZTx0eXBlb2Ygb25DbG9zZT4+KSA9PiB7XG4gICAgICAgIC8vIFRyaWdnZXIgZm9ybSBmaWVsZCBibHVyIGZvciB2YWxpZGF0aW9uXG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuXG4gICAgICAgIC8vIENhbGwgZXh0ZXJuYWwgb25DbG9zZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICAgIG9uQ2xvc2UoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgICBbZmllbGQub25CbHVyLCBvbkNsb3NlXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBibHVyIGhhbmRsZXIgZm9yIHRleHQgZmllbGRcbiAgICBjb25zdCBoYW5kbGVUZXh0RmllbGRCbHVyID0gdXNlQ2FsbGJhY2soXG4gICAgICAoZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBleHRlcm5hbCBvbkJsdXIgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzLm9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlucHV0UHJvcHMub25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICAgIFtmaWVsZC5vbkJsdXIsIGlucHV0UHJvcHMub25CbHVyXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBzbG90IHByb3BzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIGNvbnN0IG1lbW9pemVkU2xvdFByb3BzID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgQXJyYXk8XG4gICAgICAgICAgICAnYWNjZXB0JyB8ICdjYW5jZWwnIHwgJ2NsZWFyJyB8ICduZXh0JyB8ICduZXh0T3JBY2NlcHQnIHwgJ3RvZGF5J1xuICAgICAgICAgID4sXG4gICAgICAgICAgLi4uc2xvdFByb3BzLmFjdGlvbkJhcixcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgICAgdmFyaWFudCxcbiAgICAgICAgICBvbkJsdXI6IGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgICAgICAgZXJyb3I6IGhhc0Vycm9yLFxuICAgICAgICAgIGhlbHBlclRleHQ6IGhhc0Vycm9yID8gZXJyb3JNZXNzYWdlIDogaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogdGV4dFJlYWRPbmx5LFxuICAgICAgICAgICAgJ2FyaWEtaW52YWxpZCc6IGludmFsaWQsXG4gICAgICAgICAgICAnYXJpYS1kZXNjcmliZWRieSc6IGhhc0Vycm9yID8gYCR7bmFtZX0tZXJyb3JgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLi4uaW5wdXRQcm9wcy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gQWRkIGxvYWRpbmcgaW5kaWNhdG9yIGlmIHByb3ZpZGVkXG4gICAgICAgICAgLi4uKGxvYWRpbmcgJiZcbiAgICAgICAgICAgIExvYWRpbmdDb21wb25lbnQgJiYge1xuICAgICAgICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiA8TG9hZGluZ0NvbXBvbmVudCAvPixcbiAgICAgICAgICAgICAgICAuLi5pbnB1dFByb3BzLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5zbG90UHJvcHMudGV4dEZpZWxkLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBbXG4gICAgICAgIHNsb3RQcm9wcyxcbiAgICAgICAgaW5wdXRQcm9wcyxcbiAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBoYW5kbGVUZXh0RmllbGRCbHVyLFxuICAgICAgICBoYXNFcnJvcixcbiAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICBoZWxwZXJUZXh0LFxuICAgICAgICB0ZXh0UmVhZE9ubHksXG4gICAgICAgIGludmFsaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgICBdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8RmllbGRUb29sdGlwIHRvb2x0aXBTbG90PXt0b29sdGlwU2xvdH0+XG4gICAgICAgIDxEYXRlUGlja2VyXG4gICAgICAgICAgLy8gU3ByZWFkIHJlc3QgcHJvcHMgZmlyc3Qgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlblxuICAgICAgICAgIHsuLi5yZXN0UHJvcHN9XG4gICAgICAgICAgey4uLnJlc3REYXRlUGlja2VyUHJvcHN9XG4gICAgICAgICAgLy8gQ29yZSBwcm9wc1xuICAgICAgICAgIHJlZj17cmVmfVxuICAgICAgICAgIG5hbWU9e25hbWV9XG4gICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2V9XG4gICAgICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgICAgIC8vIFVJIHByb3BzXG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgICAvLyBTbG90IHByb3BzXG4gICAgICAgICAgc2xvdFByb3BzPXttZW1vaXplZFNsb3RQcm9wc31cbiAgICAgICAgICAvLyBBY2Nlc3NpYmlsaXR5IHByb3BzXG4gICAgICAgICAgYXJpYS1pbnZhbGlkPXtpbnZhbGlkfVxuICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e2hhc0Vycm9yID8gYCR7bmFtZX0tZXJyb3JgIDogdW5kZWZpbmVkfVxuICAgICAgICAvPlxuICAgICAgPC9GaWVsZFRvb2x0aXA+XG4gICAgKTtcbiAgfVxuKTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgZGVidWdnaW5nXG5EYXRlUGlja2VyRWxlbWVudENvcmUuZGlzcGxheU5hbWUgPSAnRGF0ZVBpY2tlckVsZW1lbnRDb3JlJztcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlIH07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVQaWNrZXJFbGVtZW50Q29yZTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIFVzZUNvbnRyb2xsZXJSZXR1cm4sXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBEYXRlVHJhbnNmb3JtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogVHlwZS1zYWZlIGRhdGUgdmFsdWUgcmVhZGVyIHRoYXQgaGFuZGxlcyBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIGZyb20gdGhlIGRhdGUgYWRhcHRlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgbG9jYWxpemF0aW9uIGNvbnRleHQgZnJvbSBNVUkgZGF0ZSBwaWNrZXJzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydCAoc3RyaW5nLCBkYXRlLCBvciBudWxsKVxuICogQHJldHVybnMgUHJvcGVybHkgdHlwZWQgZGF0ZSB2YWx1ZSBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgVERhdGUgfCB1bmRlZmluZWRcbik6IFREYXRlIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIGEgZGF0ZVxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgcmV0dXJuIHBhcnNlZERhdGUgYXMgVERhdGU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgY29udHJvbGxlciBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBmaWVsZDogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdO1xuICAvKiogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zICovXG4gIHRyYW5zZm9ybT86IERhdGVUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPiB7XG4gIC8qKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIHBpY2tlciAqL1xuICB2YWx1ZTogVFZhbHVlIHwgbnVsbDtcbiAgLyoqIENoYW5nZSBoYW5kbGVyIGZvciBwaWNrZXIgdmFsdWUgdXBkYXRlcyAqL1xuICBvbkNoYW5nZTogKFxuICAgIHZhbHVlOiBUVmFsdWUgfCBudWxsLFxuICAgIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+XG4gICkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWx1ZSB0cmFuc2Zvcm1hdGlvbnMgd2l0aCB0eXBlIHNhZmV0eVxuICogXG4gKiBUaGlzIGhvb2sgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIGZvcm0gZmllbGQgdmFsdWVzIGFuZCBkYXRlIHBpY2tlciB2YWx1ZXMsXG4gKiBhcHBseWluZyBjdXN0b20gdHJhbnNmb3JtYXRpb25zIHdoaWxlIG1haW50YWluaW5nIHN0cmljdCBUeXBlU2NyaXB0IHR5cGluZy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFVzYWdlIHdpdGggRGF5LmpzIGRhdGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAqICAgZmllbGQsXG4gKiAgIHRyYW5zZm9ybToge1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IGRheWpzKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB2YWx1ZSB0cmFuc2Zvcm1hdGlvblxuICogQHJldHVybnMgT2JqZWN0IHdpdGggdHJhbnNmb3JtZWQgdmFsdWUgYW5kIGNoYW5nZSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclZhbHVlT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlPiB7XG4gIGNvbnN0IHsgZmllbGQsIHRyYW5zZm9ybSB9ID0gb3B0aW9ucztcbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICAvLyBUcmFuc2Zvcm0gdGhlIGZpZWxkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXJcbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKCgpOiBUVmFsdWUgfCBudWxsID0+IHtcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybS5pbnB1dChmaWVsZC52YWx1ZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IGhhbmRsZSBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gICAgcmV0dXJuIHJlYWREYXRlUGlja2VyVmFsdWVBc0RhdGUoYWRhcHRlciwgZmllbGQudmFsdWUpIGFzIFRWYWx1ZSB8IG51bGw7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZmllbGQudmFsdWUsIHRyYW5zZm9ybT8uaW5wdXQsIGFkYXB0ZXJdKTtcblxuICAvLyBDcmVhdGUgYSBzdGFibGUgY2hhbmdlIGhhbmRsZXJcbiAgY29uc3Qgb25DaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3VmFsdWU6IFRWYWx1ZSB8IG51bGwsIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRyYW5zZm9ybS5vdXRwdXQobmV3VmFsdWUsIGNvbnRleHQpO1xuXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKHRyYW5zZm9ybWVkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0cmFuc2Zvcm1hdGlvbjogc3RvcmUgdGhlIGRhdGUgYXMtaXNcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbZmllbGQub25DaGFuZ2UsIHRyYW5zZm9ybT8ub3V0cHV0XVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWx1ZTsiLCAiaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZEVycm9yLFxuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBVc2VDb250cm9sbGVyUmV0dXJuLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24gaG9va1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgc3RhdGUgZnJvbSByZWFjdC1ob29rLWZvcm0gY29udHJvbGxlciAqL1xuICBmaWVsZFN0YXRlOiBVc2VDb250cm9sbGVyUmV0dXJuPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wiZmllbGRTdGF0ZVwiXTtcbiAgLyoqIFZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGRhdGUgcGlja2VyICovXG4gIHZhbGlkYXRpb24/OiBEYXRlUGlja2VyVmFsaWRhdGlvbkNvbmZpZzxUVmFsdWU+O1xuICAvKiogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKiBUaGUgY3VycmVudCBkYXRlIHZhbHVlIGZvciB2YWxpZGF0aW9uICovXG4gIHZhbHVlPzogVFZhbHVlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBoYXMgYW55IHZhbGlkYXRpb24gZXJyb3JzICovXG4gIGhhc0Vycm9yOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBlcnJvciAoZm9ybSBvciBkYXRlLXNwZWNpZmljKSAqL1xuICBlcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U6IFJlYWN0Tm9kZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGluIGFuIGludmFsaWQgc3RhdGUgKi9cbiAgaW52YWxpZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGVycm9yIG1lc3NhZ2VzIGZvciBjb21tb24gZGF0ZSB2YWxpZGF0aW9uIHNjZW5hcmlvc1xuICovXG5jb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTID0ge1xuICBpbnZhbGlkRGF0ZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIsXG4gIG1pbkRhdGU6IFwiRGF0ZSBtdXN0IGJlIGFmdGVyIHRoZSBtaW5pbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBtYXhEYXRlOiBcIkRhdGUgbXVzdCBiZSBiZWZvcmUgdGhlIG1heGltdW0gYWxsb3dlZCBkYXRlXCIsXG4gIGRpc2FibGVkRGF0ZTogXCJUaGlzIGRhdGUgaXMgbm90IGFsbG93ZWRcIixcbiAgcmVxdWlyZWQ6IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWxpZGF0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBlcnJvciBoYW5kbGluZ1xuICogXG4gKiBUaGlzIGhvb2sgY2VudHJhbGl6ZXMgdmFsaWRhdGlvbiBsb2dpYyBmb3IgZGF0ZSBwaWNrZXJzLCBoYW5kbGluZyBib3RoXG4gKiByZWFjdC1ob29rLWZvcm0gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbiBlcnJvcnNcbiAqIGZyb20gTVVJIGRhdGUgcGlja2Vycy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggZm9ybSB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGludmFsaWQgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgdmFsaWRhdGlvbjoge1xuICogICAgIG1pbkRhdGU6IGRheWpzKCkuc3VidHJhY3QoMSwgJ3llYXInKSxcbiAqICAgICBtYXhEYXRlOiBkYXlqcygpLmFkZCgxLCAneWVhcicpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdEYXRlIG11c3QgYmUgd2l0aGluIHRoZSBsYXN0IHllYXInLFxuICogICAgICAgbWF4RGF0ZTogJ0RhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAxIHllYXIgaW4gdGhlIGZ1dHVyZSdcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBVc2FnZSB3aXRoIGN1c3RvbSBlcnJvciBwYXJzZXI6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICogICBmaWVsZFN0YXRlLFxuICogICBwYXJzZUVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICogICAgICAgcmV0dXJuIGBEYXRlIEVycm9yOiAke2Vycm9yfWA7XG4gKiAgICAgfVxuICogICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdJbnZhbGlkIGRhdGUnO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHBhcmFtIG9wdGlvbnMgLSBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVmFsaWRhdGlvbiBzdGF0ZSBhbmQgZXJyb3IgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJWYWxpZGF0aW9uT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIGNvbnN0IHsgZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgcGFyc2VFcnJvciwgdmFsdWUgfSA9IG9wdGlvbnM7XG5cbiAgLy8gTWVtb2l6ZSB2YWxpZGF0aW9uIHJlc3VsdHMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7IGVycm9yOiBmaWVsZEVycm9yLCBpbnZhbGlkIH0gPSBmaWVsZFN0YXRlO1xuICAgIFxuICAgIC8vIFN0YXJ0IHdpdGggZm9ybSB2YWxpZGF0aW9uIGVycm9yXG4gICAgbGV0IGN1cnJlbnRFcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQgPSBmaWVsZEVycm9yO1xuICAgIFxuICAgIC8vIENoZWNrIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbnMgaWYgbm8gZm9ybSBlcnJvciBhbmQgd2UgaGF2ZSBhIHZhbHVlXG4gICAgaWYgKCFmaWVsZEVycm9yICYmIHZhbHVlICYmIHZhbGlkYXRpb24pIHtcbiAgICAgIGNvbnN0IHsgbWluRGF0ZSwgbWF4RGF0ZSwgc2hvdWxkRGlzYWJsZURhdGUsIGVycm9yTWVzc2FnZXMgfSA9IHZhbGlkYXRpb247XG4gICAgICBcbiAgICAgIC8vIENoZWNrIG1pbmltdW0gZGF0ZVxuICAgICAgaWYgKG1pbkRhdGUgJiYgdmFsdWUgPCBtaW5EYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWluRGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWluRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1pbkRhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBtYXhpbXVtIGRhdGVcbiAgICAgIGVsc2UgaWYgKG1heERhdGUgJiYgdmFsdWUgPiBtYXhEYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWF4RGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWF4RGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1heERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBkaXNhYmxlZCBkYXRlXG4gICAgICBlbHNlIGlmIChzaG91bGREaXNhYmxlRGF0ZSAmJiBzaG91bGREaXNhYmxlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgY3VycmVudEVycm9yID0ge1xuICAgICAgICAgIHR5cGU6ICdkaXNhYmxlZERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/LmRpc2FibGVkRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIERhdGVWYWxpZGF0aW9uRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGhhc0Vycm9yID0gQm9vbGVhbihjdXJyZW50RXJyb3IpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcixcbiAgICAgIGVycm9yOiBjdXJyZW50RXJyb3IsXG4gICAgICBpbnZhbGlkOiBpbnZhbGlkIHx8IGhhc0Vycm9yLFxuICAgIH07XG4gIH0sIFtmaWVsZFN0YXRlLCB2YWxpZGF0aW9uLCB2YWx1ZV0pO1xuXG4gIC8vIE1lbW9pemUgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHVzZU1lbW8oKCk6IFJlYWN0Tm9kZSA9PiB7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgY3VzdG9tIGVycm9yIHBhcnNlciBpZiBwcm92aWRlZFxuICAgIGlmIChwYXJzZUVycm9yKSB7XG4gICAgICByZXR1cm4gcGFyc2VFcnJvcih2YWxpZGF0aW9uUmVzdWx0LmVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoJ21lc3NhZ2UnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgJiYgdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGVycm9yIG1lc3NhZ2VzIGJhc2VkIG9uIGVycm9yIHR5cGVcbiAgICBpZiAoJ3R5cGUnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IHZhbGlkYXRpb25SZXN1bHQuZXJyb3IudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLnJlcXVpcmVkO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZTtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICB9LCBbdmFsaWRhdGlvblJlc3VsdC5lcnJvciwgcGFyc2VFcnJvcl0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4udmFsaWRhdGlvblJlc3VsdCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uOyIsICJpbXBvcnQgdHlwZSB7IFN4UHJvcHMsIFRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IHVzZVRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclN0eWxlcyBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclN0eWxlc09wdGlvbnMge1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgYSB2YWxpZGF0aW9uIGVycm9yICovXG4gIGhhc0Vycm9yPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBsb2FkaW5nIHN0YXRlICovXG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdGV4dCBpbnB1dCBpcyByZWFkLW9ubHkgKi9cbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqIEN1c3RvbSBzdHlsZXMgdG8gbWVyZ2Ugd2l0aCBkZWZhdWx0cyAqL1xuICBzeD86IFN4UHJvcHM8VGhlbWU+O1xufVxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgdXNlRGF0ZVBpY2tlclN0eWxlcyBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclN0eWxlc1JldHVybiB7XG4gIC8qKiBDb21wdXRlZCBzdHlsZXMgZm9yIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnQgKi9cbiAgc3g6IFN4UHJvcHM8VGhlbWU+O1xuICAvKiogQWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3Igc3R5bGluZyAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgdGhlbWUtYXdhcmUgZGF0ZSBwaWNrZXIgc3R5bGVzIHdpdGggY29uc2lzdGVudCBkZXNpZ24gc3lzdGVtIGludGVncmF0aW9uXG4gKiBcbiAqIFRoaXMgaG9vayBwcm92aWRlcyBvcHRpbWl6ZWQsIG1lbW9pemVkIHN0eWxlcyBmb3IgZGF0ZSBwaWNrZXIgY29tcG9uZW50cyB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIGFkYXB0IHRvIHRoZSBjdXJyZW50IE1VSSB0aGVtZSBhbmQgY29tcG9uZW50IHN0YXRlIChkaXNhYmxlZCwgZXJyb3IsIGxvYWRpbmcsIGV0Yy4pLlxuICogSXQgZW5zdXJlcyBjb25zaXN0ZW50IHN0eWxpbmcgYWNyb3NzIGFsbCBkYXRlIHBpY2tlciBpbnN0YW5jZXMgd2hpbGUgYWxsb3dpbmcgY3VzdG9taXphdGlvbi5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHN4IH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAqICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gKiAgIGhhc0Vycm9yOiAhIWVycm9yLFxuICogICBsb2FkaW5nOiBpc0xvYWRpbmdcbiAqIH0pO1xuICogXG4gKiByZXR1cm4gPERhdGVQaWNrZXIgc3g9e3N4fSAuLi4gLz47XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHN0eWxlczpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzeCB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gKiAgIGhhc0Vycm9yOiAhIWVycm9yLFxuICogICBzeDoge1xuICogICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICBjb2xvcjogJ3ByaW1hcnkubWFpbidcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3R5bGUgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBDb21wdXRlZCBzdHlsZXMgYW5kIGNsYXNzIG5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyU3R5bGVzKFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyU3R5bGVzT3B0aW9ucyA9IHt9XG4pOiBVc2VEYXRlUGlja2VyU3R5bGVzUmV0dXJuIHtcbiAgY29uc3QgeyBkaXNhYmxlZCwgaGFzRXJyb3IsIGxvYWRpbmcsIHRleHRSZWFkT25seSwgc3g6IGN1c3RvbVN4IH0gPSBvcHRpb25zO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgLy8gTWVtb2l6ZSBjb21wdXRlZCBzdHlsZXMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IGNvbXB1dGVkU3ggPSB1c2VNZW1vKCgpOiBTeFByb3BzPFRoZW1lPiA9PiB7XG4gICAgY29uc3QgYmFzZVN0eWxlczogU3hQcm9wczxUaGVtZT4gPSB7XG4gICAgICAvLyBJbnB1dCBmaWVsZCBzdHlsaW5nXG4gICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQgXG4gICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIFxuICAgICAgICAvLyBUcmFuc2l0aW9uIGZvciBzbW9vdGggc3RhdGUgY2hhbmdlc1xuICAgICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoW1xuICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICAgICAgICAnYm9yZGVyLWNvbG9yJyxcbiAgICAgICAgICAnY29sb3InXG4gICAgICAgIF0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuZHVyYXRpb24uc2hvcnQsXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIEVycm9yIHN0YXRlIHN0eWxpbmdcbiAgICAgICAgLi4uKGhhc0Vycm9yICYmIHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmLk11aS1mb2N1c2VkJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICAgIGJveFNoYWRvdzogYDAgMCAwIDJweCAke3RoZW1lLnBhbGV0dGUuZXJyb3IubWFpbn0yNWAsIC8vIDI1IGlzIDE1JSBvcGFjaXR5IGluIGhleFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIExvYWRpbmcgc3RhdGUgc3R5bGluZ1xuICAgICAgICAuLi4obG9hZGluZyAmJiB7XG4gICAgICAgICAgb3BhY2l0eTogMC43LFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnB1dCBlbGVtZW50IHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IFwibm90LWFsbG93ZWRcIiBcbiAgICAgICAgICA6IHRleHRSZWFkT25seSBcbiAgICAgICAgICAgID8gXCJwb2ludGVyXCIgXG4gICAgICAgICAgICA6IFwidGV4dFwiLFxuICAgICAgICBcbiAgICAgICAgLy8gUmVhZC1vbmx5IHNwZWNpZmljIHN0eWxpbmdcbiAgICAgICAgLi4uKHRleHRSZWFkT25seSAmJiAhZGlzYWJsZWQgJiYge1xuICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgICAgdXNlclNlbGVjdDogXCJub25lXCIsXG4gICAgICAgICAgY2FyZXRDb2xvcjogXCJ0cmFuc3BhcmVudFwiLCAvLyBIaWRlIHRleHQgY3Vyc29yIGluIHJlYWQtb25seSBtb2RlXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIExvYWRpbmcgc3RhdGVcbiAgICAgICAgLi4uKGxvYWRpbmcgJiYge1xuICAgICAgICAgIGN1cnNvcjogXCJ3YWl0XCIsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gUmVxdWlyZWQgZmllbGQgYXN0ZXJpc2sgc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrXCI6IHsgXG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgIGZvbnRTaXplOiBcIjEuMmVtXCIsXG4gICAgICB9LFxuXG4gICAgICAvLyBMYWJlbCBzdHlsaW5nIHdpdGggYmV0dGVyIGNvbnRyYXN0XG4gICAgICBcIiYgLk11aUlucHV0TGFiZWwtcm9vdFwiOiB7XG4gICAgICAgIGNvbG9yOiBoYXNFcnJvciBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiBcbiAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUudGV4dC5zZWNvbmRhcnksXG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgcHJvcGVyIGNvbnRyYXN0IGZvciBkaXNhYmxlZCBzdGF0ZVxuICAgICAgICAuLi4oZGlzYWJsZWQgJiYge1xuICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQuZGlzYWJsZWQsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gSGVscGVyIHRleHQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlGb3JtSGVscGVyVGV4dC1yb290XCI6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogdGhlbWUuc3BhY2luZygxKSxcbiAgICAgICAgbWFyZ2luUmlnaHQ6IHRoZW1lLnNwYWNpbmcoMSksXG4gICAgICAgIFxuICAgICAgICAvLyBFcnJvciBzdGF0ZVxuICAgICAgICAuLi4oaGFzRXJyb3IgJiYge1xuICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gQ2FsZW5kYXIgaWNvbiBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0QWRvcm5tZW50LXJvb3RcIjoge1xuICAgICAgICBjb2xvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZCBcbiAgICAgICAgICA6IGhhc0Vycm9yIFxuICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gXG4gICAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmFjdGl2ZSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEZvY3VzIHJpbmcgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1mb2N1c2VkXCI6IHtcbiAgICAgICAgb3V0bGluZTogYDJweCBzb2xpZCAke3RoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWlufTUwYCwgLy8gNTAgaXMgMzElIG9wYWNpdHlcbiAgICAgICAgb3V0bGluZU9mZnNldDogXCIycHhcIixcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuaGFuY2VkIGNvbnRyYXN0IGZvciBkYXJrIHRoZW1lc1xuICAgICAgLi4uKHRoZW1lLnBhbGV0dGUubW9kZSA9PT0gJ2RhcmsnICYmIHtcbiAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIC8vIE1lcmdlIHdpdGggY3VzdG9tIHN0eWxlc1xuICAgIHJldHVybiBjdXN0b21TeCA/IFtiYXNlU3R5bGVzLCBjdXN0b21TeF0gYXMgU3hQcm9wczxUaGVtZT4gOiBiYXNlU3R5bGVzO1xuICB9LCBbXG4gICAgdGhlbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgaGFzRXJyb3IsXG4gICAgbG9hZGluZyxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgY3VzdG9tU3gsXG4gIF0pO1xuXG4gIC8vIEdlbmVyYXRlIGFkZGl0aW9uYWwgY2xhc3MgbmFtZXMgZm9yIGV4dGVybmFsIHN0eWxpbmcgaG9va3NcbiAgY29uc3QgY2xhc3NOYW1lID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICBpZiAoZGlzYWJsZWQpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWRpc2FibGVkJyk7XG4gICAgaWYgKGhhc0Vycm9yKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1lcnJvcicpO1xuICAgIGlmIChsb2FkaW5nKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1sb2FkaW5nJyk7XG4gICAgaWYgKHRleHRSZWFkT25seSkgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tcmVhZE9ubHknKTtcbiAgICBcbiAgICByZXR1cm4gY2xhc3Nlcy5sZW5ndGggPiAwID8gY2xhc3Nlcy5qb2luKCcgJykgOiB1bmRlZmluZWQ7XG4gIH0sIFtkaXNhYmxlZCwgaGFzRXJyb3IsIGxvYWRpbmcsIHRleHRSZWFkT25seV0pO1xuXG4gIHJldHVybiB7XG4gICAgc3g6IGNvbXB1dGVkU3gsXG4gICAgY2xhc3NOYW1lLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyU3R5bGVzOyIsICJpbXBvcnQgdHlwZSB7IFBpY2tlclZhbGlkRGF0ZSB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIEZpZWxkUGF0aCwgUGF0aFZhbHVlIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSBmb3IgY3JlYXRpbmcgYnJhbmRlZCBkYXRlIHR5cGVzIHRvIHByZXZlbnQgbWl4aW5nIGRpZmZlcmVudCBkYXRlIGZvcm1hdHNcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBiYXNlIGRhdGUgdHlwZVxuICogQHRlbXBsYXRlIFRCcmFuZCAtIFRoZSBicmFuZCBzdHJpbmcgZm9yIHR5cGUgc2FmZXR5XG4gKi9cbmV4cG9ydCB0eXBlIEJyYW5kZWREYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlLCBUQnJhbmQgZXh0ZW5kcyBzdHJpbmc+ID0gXG4gIFREYXRlICYgeyByZWFkb25seSBfX2JyYW5kOiBUQnJhbmQgfTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZS1saWtlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQaWNrZXJWYWxpZERhdGUge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBEYXRlIG9iamVjdFxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGRhdGUtbGlrZSBvYmplY3RzIHdpdGggY29tbW9uIGRhdGUgbGlicmFyeSBtZXRob2RzXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgLy8gRGF5LmpzLCBNb21lbnQuanMsIG9yIHNpbWlsYXJcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuaXNWYWxpZCgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBMdXhvbiBEYXRlVGltZVxuICAgIGlmICgnaXNWYWxpZCcgaW4gdmFsdWUgJiYgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgYXMgYSBkYXRlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGFyc2VhYmxlIGRhdGUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnNhYmxlRGF0ZVN0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEJhc2ljIElTTyBkYXRlIGZvcm1hdCBjaGVja1xuICBjb25zdCBpc29EYXRlUmVnZXggPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9KD86VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezN9KT8oPzpafFsrLV1cXGR7Mn06XFxkezJ9KT8pPyQvO1xuXG4gIGlmIChpc29EYXRlUmVnZXgudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIERhdGUgY29uc3RydWN0b3IgY2FuIHBhcnNlIGl0XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHZhbHVlKTtcblxuICByZXR1cm4gIWlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlLXNhZmUgZGF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGZvcm0gdmFsdWVzIHRvIGRhdGUgcGlja2VyIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgZGF0ZSBhZGFwdGVyIGZyb20gTVVJIGxvY2FsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGZvcm0gdmFsdWVzIHRvIGRhdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlSW5wdXRUcmFuc2Zvcm08XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4pIHtcbiAgcmV0dXJuICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogVERhdGUgfCBudWxsID0+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGFkYXB0ZXIudXRpbHMuZGF0ZSh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGlzVmFsaWREYXRlKHBhcnNlZCkgPyAocGFyc2VkIGFzIFREYXRlKSA6IG51bGw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFREYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlLXNhZmUgZGF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGRhdGUgcGlja2VyIHZhbHVlcyBiYWNrIHRvIGZvcm0gdmFsdWVzXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGUgdXNlZCBieSB0aGUgcGlja2VyXG4gKiBAcGFyYW0gZm9ybWF0IC0gVGhlIGZvcm1hdCB0byB1c2UgZm9yIHN0cmluZyBjb252ZXJzaW9uIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEEgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBzYWZlbHkgY29udmVydHMgZGF0ZXMgdG8gZm9ybSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGVPdXRwdXRUcmFuc2Zvcm08XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oZm9ybWF0Pzogc3RyaW5nKSB7XG4gIHJldHVybiAodmFsdWU6IFREYXRlIHwgbnVsbCk6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPiA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICBpZiAoIWlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIC8vIElmIG5vIGZvcm1hdCBzcGVjaWZpZWQsIHJldHVybiB0aGUgZGF0ZSBhcy1pc1xuICAgIGlmICghZm9ybWF0KSB7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGRhdGUgbGlicmFyeSBmb3JtYXRzXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdpc28nKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RhdGUtb25seScpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEYXkuanMgZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuZm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBNb21lbnQuanMgZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuZm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBMdXhvbiBmb3JtYXRcbiAgICAgIGlmICh0eXBlb2YgKHZhbHVlIGFzIGFueSkudG9Gb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjazogcmV0dXJuIGFzLWlzXG4gICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBkZWZhdWx0IGRhdGUgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGVcbiAqIEByZXR1cm5zIERlZmF1bHQgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRlUGlja2VyQ29uZmlnPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPigpIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBEZWZhdWx0IHNsb3QgcHJvcHMgZm9yIGNvbnNpc3RlbnQgYmVoYXZpb3JcbiAgICBzbG90UHJvcHM6IHtcbiAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ3RvZGF5JywgJ2NhbmNlbCcsICdhY2NlcHQnXSBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgICB2YXJpYW50OiAnb3V0bGluZWQnIGFzIGNvbnN0LFxuICAgICAgfSxcbiAgICB9LFxuICAgIFxuICAgIC8vIERlZmF1bHQgZ3JpZCBwcm9wcyBmb3IgbGF5b3V0IGNvbnNpc3RlbmN5XG4gICAgZ3JpZFByb3BzOiB7XG4gICAgICBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gYXMgY29uc3QsXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IHZhbGlkYXRpb24gY29uZmlndXJhdGlvblxuICAgIHZhbGlkYXRpb246IHtcbiAgICAgIGVycm9yTWVzc2FnZXM6IHtcbiAgICAgICAgaW52YWxpZERhdGU6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiLFxuICAgICAgICBtaW5EYXRlOiBcIkRhdGUgbXVzdCBiZSBhZnRlciB0aGUgbWluaW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgbWF4RGF0ZTogXCJEYXRlIG11c3QgYmUgYmVmb3JlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICAgICAgICBkaXNhYmxlZERhdGU6IFwiVGhpcyBkYXRlIGlzIG5vdCBhbGxvd2VkXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0gYXMgY29uc3Q7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBzYWZlbHkgZXh0cmFjdCBlcnJvciBtZXNzYWdlIGZyb20gdmFyaW91cyBlcnJvciB0eXBlc1xuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCAoY291bGQgYmUgZnJvbSByZWFjdC1ob29rLWZvcm0gb3IgTVVJIGRhdGUgcGlja2VyKVxuICogQHJldHVybnMgQSB1c2VyLWZyaWVuZGx5IGVycm9yIG1lc3NhZ2Ugc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsKSB7XG4gICAgLy8gUmVhY3QgSG9vayBGb3JtIEZpZWxkRXJyb3JcbiAgICBpZiAoJ21lc3NhZ2UnIGluIGVycm9yICYmIHR5cGVvZiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIChlcnJvciBhcyBhbnkpLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gTVVJIERhdGVWYWxpZGF0aW9uRXJyb3JcbiAgICBpZiAoJ3R5cGUnIGluIGVycm9yICYmIHR5cGVvZiAoZXJyb3IgYXMgYW55KS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gKGVycm9yIGFzIGFueSkudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICAgIHJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSc7XG4gICAgICAgIGNhc2UgJ21pbkRhdGUnOlxuICAgICAgICAgIHJldHVybiAnRGF0ZSBpcyB0b28gZWFybHknO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGxhdGUnO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiAnVGhpcyBkYXRlIGlzIG5vdCBhdmFpbGFibGUnO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnSW52YWxpZCBkYXRlIHNlbGVjdGlvbic7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICdJbnZhbGlkIGlucHV0Jztcbn1cblxuLyoqXG4gKiBQZXJmb3JtYW5jZSB1dGlsaXR5IHRvIGNyZWF0ZSBzdGFibGUgcmVmZXJlbmNlcyBmb3IgY29tcGxleCBwcm9wc1xuICogVGhpcyBoZWxwcyBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMgd2hlbiB1c2luZyBjb21wbGV4IGNvbmZpZ3VyYXRpb24gb2JqZWN0c1xuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgSlNPTiBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGRlcGVuZGVuY3kgaW4gdXNlTWVtby91c2VDYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhYmxlS2V5PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oY29uZmlnOiBUKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29uZmlnLCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgLy8gU29ydCBvYmplY3Qga2V5cyBmb3IgY29uc2lzdGVudCBzZXJpYWxpemF0aW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc29ydGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICBzb3J0ZWRba10gPSAodmFsdWUgYXMgYW55KVtrXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNvcnRlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNlcmlhbGl6YWJsZSBvYmplY3RzXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykuc29ydCgpLmpvaW4oJy0nKTtcbiAgfVxufSIsICJpbXBvcnQgVmlzaWJpbGl0eSBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL1Zpc2liaWxpdHknO1xuaW1wb3J0IFZpc2liaWxpdHlPZmYgZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5T2ZmJztcbmltcG9ydCB0eXBlIHsgSWNvbkJ1dHRvblByb3BzLCBUZXh0RmllbGRQcm9wcywgR3JpZFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBJY29uQnV0dG9uLFxuICBJbnB1dEFkb3JubWVudCxcbiAgVGV4dEZpZWxkLFxuICB1c2VGb3JrUmVmLFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgTW91c2VFdmVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7XG4gIEZpZWxkVG9vbHRpcFxufSBmcm9tICdAL2NvcmUvY29tcG9uZW50cy9GaWVsZFRvb2x0aXAvRmllbGRUb29sdGlwJztcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRUb29sdGlwU2xvdH0gZnJvbSAnQC9jb3JlL2NvbXBvbmVudHMvRmllbGRUb29sdGlwL0ZpZWxkVG9vbHRpcCc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBQYXNzd29yZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgUGFzc3dvcmRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4gPSBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZScgfCAnc2l6ZSc+ICYge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJwYXNzd29yZFwiIHwgXCJ1c2VyLmN1cnJlbnRQYXNzd29yZFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgdmlzaWJpbGl0eSB0b2dnbGUgaWNvbiBidXR0b25cbiAgICogQGRlZmF1bHRWYWx1ZSBcImRlZmF1bHRcIlxuICAgKi9cbiAgaWNvbkNvbG9yPzogSWNvbkJ1dHRvblByb3BzWydjb2xvciddO1xuICAvKipcbiAgICogQ3VzdG9tIHJlbmRlciBmdW5jdGlvbiBmb3IgdGhlIHZpc2liaWxpdHkgdG9nZ2xlIGljb25cbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gV2hldGhlciBwYXNzd29yZCBpcyBjdXJyZW50bHkgaGlkZGVuXG4gICAqIEByZXR1cm5zIFJlYWN0Tm9kZSB0byByZW5kZXIgYXMgdGhlIGljb25cbiAgICogQGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZpc2liaWxpdHkvdmlzaWJpbGl0eS1vZmYgaWNvbnNcbiAgICovXG4gIHJlbmRlckljb24/OiAocGFzc3dvcmQ6IGJvb2xlYW4pID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgdG9vbHRpcFNsb3Q/OiBGaWVsZFRvb2x0aXBTbG90O1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gUGFzc3dvcmRFbDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIGljb25Db2xvcixcbiAgICByZW5kZXJJY29uID0gcGFzc3dvcmQgPT4gKHBhc3N3b3JkID8gPFZpc2liaWxpdHkgLz4gOiA8VmlzaWJpbGl0eU9mZiAvPiksXG4gICAgc2xvdFByb3BzLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBpbnB1dFJlZixcbiAgICBvbkJsdXIsXG4gICAgdG9vbHRpcFNsb3QgPSB7fSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBbcGFzc3dvcmQsIHNldFBhc3N3b3JkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KHRydWUpO1xuXG4gIGNvbnN0IGVuZEFkb3JubWVudCA9IChcbiAgICA8SW5wdXRBZG9ybm1lbnQgcG9zaXRpb249eydlbmQnfT5cbiAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgIG9uTW91c2VEb3duPXsoZTogTW91c2VFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IGUucHJldmVudERlZmF1bHQoKX1cbiAgICAgICAgb25DbGljaz17KCkgPT4gc2V0UGFzc3dvcmQoIXBhc3N3b3JkKX1cbiAgICAgICAgdGFiSW5kZXg9ey0xfVxuICAgICAgICBjb2xvcj17aWNvbkNvbG9yID8/ICdkZWZhdWx0J31cbiAgICAgID5cbiAgICAgICAge3JlbmRlckljb24ocGFzc3dvcmQpfVxuICAgICAgPC9JY29uQnV0dG9uPlxuICAgIDwvSW5wdXRBZG9ybm1lbnQ+XG4gICk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPEZpZWxkVG9vbHRpcCB0b29sdGlwU2xvdD17dG9vbHRpcFNsb3R9PlxuICAgICAgPFRleHRGaWVsZFxuICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgICB0eXBlPXtwYXNzd29yZCA/ICdwYXNzd29yZCcgOiAndGV4dCd9XG4gICAgICAgIHZhbHVlPXtmaWVsZC52YWx1ZSA/PyAnJ31cbiAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgIHZhcmlhbnQ9e3Jlc3QudmFyaWFudCA/PyAnb3V0bGluZWQnfVxuICAgICAgICBvbkNoYW5nZT17ZXZlbnQgPT4ge1xuICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3Qub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlc3Qub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICB7Li4uKHR5cGVvZiBzbG90UHJvcHMgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIElucHV0UHJvcHM6IHtcbiAgICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIHNsb3RQcm9wczoge1xuICAgICAgICAgICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAgICAgZW5kQWRvcm5tZW50LFxuICAgICAgICAgICAgICAgICAgLi4uc2xvdFByb3BzPy5pbnB1dCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9IGFzIFRleHRGaWVsZFByb3BzWydzbG90UHJvcHMnXSxcbiAgICAgICAgICAgIH0pfVxuICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAvPlxuICAgIDwvRmllbGRUb29sdGlwPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIHBhc3N3b3JkIFRleHRGaWVsZCB3aXRoIHNob3cvaGlkZSBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBwYXNzd29yZCBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgYSBidWlsdC1pbiB2aXNpYmlsaXR5IHRvZ2dsZSBidXR0b24uIFRoZSBwYXNzd29yZFxuICogY2FuIGJlIHNob3duIG9yIGhpZGRlbiBieSBjbGlja2luZyB0aGUgZXllIGljb24gaW4gdGhlIGlucHV0J3MgZW5kIGFkb3JubWVudC5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gUGFzc3dvcmQgdmlzaWJpbGl0eSB0b2dnbGVcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gQ3VzdG9taXphYmxlIHZpc2liaWxpdHkgaWNvbnNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIERpc2FibGVkIHN0YXRlIHN1cHBvcnRcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInBhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJQYXNzd29yZFwiXG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdQYXNzd29yZCBpcyByZXF1aXJlZCcsXG4gKiAgICAgbWluTGVuZ3RoOiB7IHZhbHVlOiA4LCBtZXNzYWdlOiAnTWluaW11bSA4IGNoYXJhY3RlcnMnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gaWNvbiBjb2xvcjpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiY29uZmlybVBhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJDb25maXJtIFBhc3N3b3JkXCJcbiAqICAgaWNvbkNvbG9yPVwicHJpbWFyeVwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiUmUtZW50ZXIgeW91ciBwYXNzd29yZFwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwibmV3UGFzc3dvcmRcIlxuICogICBsYWJlbD1cIk5ldyBQYXNzd29yZFwiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICByZW5kZXJJY29uPXsoaGlkZGVuKSA9PiBoaWRkZW4gPyA8Q3VzdG9tSGlkZUljb24gLz4gOiA8Q3VzdG9tU2hvd0ljb24gLz59XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBQYXNzd29yZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFBhc3N3b3JkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuZXhwb3J0IHsgUGFzc3dvcmRFbGVtZW50IH07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBGb3JtQ29udHJvbExhYmVsUHJvcHMsXG4gIEZvcm1MYWJlbFByb3BzLFxuICBSYWRpb0dyb3VwUHJvcHMsXG4gIFJhZGlvUHJvcHMsXG4gIEdyaWRQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEZvcm1MYWJlbCxcbiAgUmFkaW8sXG4gIFJhZGlvR3JvdXAsXG4gIEdyaWQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuXG4vLyBUeXBlIGZvciBwcmltaXRpdmUgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgcmFkaW8gYnV0dG9uIHZhbHVlc1xudHlwZSBQcmltaXRpdmVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIENvbnN0cmFpbnQgdG8gZW5zdXJlIG9wdGlvbiBvYmplY3RzIGhhdmUgdGhlIHJlcXVpcmVkIGtleXNcbnR5cGUgT3B0aW9uT2JqZWN0PFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IFJlY29yZDxUVmFsdWVLZXksIFByaW1pdGl2ZVZhbHVlPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PiA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFkaW9CdXR0b25Hcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdpZCcsXG4gIFRMYWJlbEtleSBleHRlbmRzICBzdHJpbmcgPSAnbGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4ge1xuICBvcHRpb25zOiBUT3B0aW9uW107XG4gIGhlbHBlclRleHQ/OiBSZWFjdE5vZGU7XG4gIG5hbWU6IFROYW1lO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGxhYmVsS2V5PzogVExhYmVsS2V5O1xuICB2YWx1ZUtleT86IFRWYWx1ZUtleTtcbiAgZGlzYWJsZWRLZXk/OiBURGlzYWJsZWRLZXk7XG4gIHR5cGU/OiAnbnVtYmVyJyB8ICdzdHJpbmcnIHwgJ2Jvb2xlYW4nO1xuICBlbXB0eU9wdGlvbkxhYmVsPzogc3RyaW5nO1xuICBvbkNoYW5nZT86ICh2YWx1ZTogVE9wdGlvbltUVmFsdWVLZXldIHwgVE9wdGlvbiB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgcmV0dXJuT2JqZWN0PzogYm9vbGVhbjtcbiAgcm93PzogYm9vbGVhbjtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgbGFiZWxQcm9wcz86IE9taXQ8Rm9ybUNvbnRyb2xMYWJlbFByb3BzLCAnbGFiZWwnIHwgJ2NvbnRyb2wnIHwgJ3ZhbHVlJz47XG4gIGZvcm1MYWJlbFByb3BzPzogT21pdDxGb3JtTGFiZWxQcm9wcywgJ3JlcXVpcmVkJyB8ICdlcnJvcic+O1xuICByYWRpb1Byb3BzPzogUmFkaW9Qcm9wcztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVE9wdGlvbltUVmFsdWVLZXldO1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFJhZGlvQnV0dG9uR3JvdXA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnaWQnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnbGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPihcbiAgcHJvcHM6IFJhZGlvQnV0dG9uR3JvdXBQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVE9wdGlvbixcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG9wdGlvbnMsXG4gICAgbGFiZWwsXG4gICAgbmFtZSxcbiAgICBsYWJlbEtleSA9ICdsYWJlbCcgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlS2V5ID0gJ2lkJyBhcyBUVmFsdWVLZXksXG4gICAgZGlzYWJsZWRLZXkgPSAnZGlzYWJsZWQnIGFzIFREaXNhYmxlZEtleSxcbiAgICByZXF1aXJlZCxcbiAgICBlbXB0eU9wdGlvbkxhYmVsLFxuICAgIHJldHVybk9iamVjdCxcbiAgICByb3cgPSB0cnVlLFxuICAgIGNvbnRyb2wsXG4gICAgdHlwZSxcbiAgICBsYWJlbFByb3BzLFxuICAgIGRpc2FibGVkLFxuICAgIGZvcm1MYWJlbFByb3BzLFxuICAgIHJhZGlvUHJvcHMsXG4gICAgdHJhbnNmb3JtLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb25cbiAgPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiB2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZSB8fCAoJycgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcbiAgICAgICAgICAgIH0sXG4gICAgICBvdXRwdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtPy5vdXRwdXRcbiAgICAgICAgICA6IChfZXZlbnQsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3Qgb25SYWRpb0NoYW5nZTogUmFkaW9Hcm91cFByb3BzWydvbkNoYW5nZSddID0gKGV2ZW50LCByYWRpb1ZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSByZXR1cm5PYmplY3RcbiAgICAgID8gKG9wdGlvbnMgYXMgVE9wdGlvbltdKS5maW5kKG9wdGlvbiA9PiBvcHRpb25bdmFsdWVLZXldID09PSByYWRpb1ZhbHVlKVxuICAgICAgOiAocmFkaW9WYWx1ZSBhcyBUT3B0aW9uW1RWYWx1ZUtleV0pO1xuXG4gICAgb25DaGFuZ2UoZXZlbnQsIHJldHVyblZhbHVlKTtcbiAgICBpZiAodHlwZW9mIHJlc3Qub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlc3Qub25DaGFuZ2UocmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICB7bGFiZWwgJiYgKFxuICAgICAgICA8Rm9ybUxhYmVsIHsuLi5mb3JtTGFiZWxQcm9wc30gcmVxdWlyZWQ9e3JlcXVpcmVkfSBlcnJvcj17ISFlcnJvcn0+XG4gICAgICAgICAge2xhYmVsfVxuICAgICAgICA8L0Zvcm1MYWJlbD5cbiAgICAgICl9XG4gICAgICA8UmFkaW9Hcm91cCBvbkNoYW5nZT17b25SYWRpb0NoYW5nZX0gbmFtZT17bmFtZX0gcm93PXtyb3d9IHZhbHVlPXt2YWx1ZX0+XG4gICAgICAgIHtlbXB0eU9wdGlvbkxhYmVsICYmIChcbiAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgey4uLnJhZGlvUHJvcHN9XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17IXZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFiZWw9e2VtcHR5T3B0aW9uTGFiZWx9XG4gICAgICAgICAgICB2YWx1ZT1cIlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge29wdGlvbnMubWFwKG9wdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uW3ZhbHVlS2V5XTtcbiAgICAgICAgICBjb25zdCBvcHRpb25EaXNhYmxlZCA9IG9wdGlvbltkaXNhYmxlZEtleV0gfHwgZmFsc2U7XG4gICAgICAgICAgbGV0IHZhbDogVE9wdGlvbltUVmFsdWVLZXldIHwgdW5kZWZpbmVkID0gcmV0dXJuT2JqZWN0XG4gICAgICAgICAgICA/ICh2YWx1ZSBhcyBUT3B0aW9uKT8uW3ZhbHVlS2V5XVxuICAgICAgICAgICAgOiAodmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcblxuICAgICAgICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gTnVtYmVyKHZhbCkgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWwgPSBCb29sZWFuKHZhbCkgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IHZhbCA9PT0gb3B0aW9uS2V5O1xuXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICAgIGtleT17U3RyaW5nKG9wdGlvbktleSl9XG4gICAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICAgIHsuLi5yYWRpb1Byb3BzfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8IG9wdGlvbkRpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNDaGVja2VkfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWU9e29wdGlvbktleX1cbiAgICAgICAgICAgICAgbGFiZWw9e29wdGlvbltsYWJlbEtleV19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICk7XG4gICAgICAgIH0pfVxuICAgICAgPC9SYWRpb0dyb3VwPlxuICAgICAge2Vycm9yICYmIDxGb3JtSGVscGVyVGV4dD57ZXJyb3IubWVzc2FnZX08L0Zvcm1IZWxwZXJUZXh0Pn1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuY29uc3QgUmFkaW9CdXR0b25Hcm91cCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzICBzdHJpbmcgPSAnaWQnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRPcHRpb24sXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBURGlzYWJsZWRLZXlcbj4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50PFxuICAgICAgICBURmllbGRWYWx1ZXMsXG4gICAgICAgIFROYW1lLFxuICAgICAgICBUT3B0aW9uLFxuICAgICAgICBUVmFsdWVLZXksXG4gICAgICAgIFRMYWJlbEtleSxcbiAgICAgICAgVERpc2FibGVkS2V5XG4gICAgICA+XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuUmFkaW9CdXR0b25Hcm91cC5kaXNwbGF5TmFtZSA9ICdSYWRpb0J1dHRvbkdyb3VwJztcblxuZXhwb3J0IHsgUmFkaW9CdXR0b25Hcm91cCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIEF1dG9jb21wbGV0ZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7XG4gIEZpZWxkVG9vbHRpcCxcbiAgdHlwZSBGaWVsZFRvb2x0aXBTbG90LFxufSBmcm9tICdAL2NvcmUvY29tcG9uZW50cy9GaWVsZFRvb2x0aXAvRmllbGRUb29sdGlwJztcblxuZXhwb3J0IHR5cGUgU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+ID0gT21pdDxcbiAgQXV0b2NvbXBsZXRlUHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPixcbiAgfCAnbmFtZSdcbiAgfCAncmVuZGVySW5wdXQnXG4gIHwgJ2lzT3B0aW9uRXF1YWxUb1ZhbHVlJ1xuICB8ICdnZXRPcHRpb25MYWJlbCdcbiAgfCAnZGlzYWJsZWQnXG4+ICYge1xuICBuYW1lOiBUTmFtZTtcbiAgZGVwZW5kc09uOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBpc051bGxhYmxlPzogYm9vbGVhbjtcbiAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZD86IGJvb2xlYW47XG4gIGxhYmVsRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICB2YWx1ZUZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICBvcHRpb25zPzogcmVhZG9ubHkgVE9wdGlvbltdIHwgbnVsbDtcbiAgdG9vbHRpcFNsb3Q/OiBGaWVsZFRvb2x0aXBTbG90O1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0Q2FzY2FkZUVsZW1lbnQ8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8VE9wdGlvbiwgVEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuICBjb25zdCB7XG4gICAgbGFiZWxGaWVsZCA9ICdMYWJlbCcsXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScsXG4gICAgbmFtZSxcbiAgICBvbkJsdXIsXG4gICAgb25DaGFuZ2UsXG4gICAgZGlzYWJsZWQsXG4gICAgb3B0aW9uczogb3B0aW9uc0lucHV0LFxuICAgIGNvbnRyb2wsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIGRlcGVuZHNPbixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgaXNOdWxsYWJsZSA9IGZhbHNlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQgPSBmYWxzZSxcbiAgICB0b29sdGlwU2xvdCA9IHt9LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVxdWlyZWQsIC4uLnJlc3RUZXh0UHJvcHMgfSA9IHRleHRGaWVsZFByb3BzO1xuICBjb25zdCBvcHRpb25zID0gdXNlTWVtbygoKSA9PiBvcHRpb25zSW5wdXQgfHwgW10sIFtvcHRpb25zSW5wdXRdKTtcblxuICBjb25zdCBnZXRPcHRpb25LZXkgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3B0aW9uID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICAgIGNvbnN0IGtleSA9IG9wdGlvbiA/IG9wdGlvblt2YWx1ZUZpZWxkIGFzIGtleW9mIFRPcHRpb25dIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5ICE9PSBudWxsID8gU3RyaW5nKGtleSkgOiAnJztcbiAgICB9LFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkIGFzIGtleW9mIFRPcHRpb25dKSA6ICcnO1xuICAgIH0sXG4gICAgW2xhYmVsRmllbGRdXG4gICk7XG5cbiAgY29uc3QgaXNPcHRpb25FcXVhbFRvVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uLCB2YWx1ZTogVE9wdGlvbikgPT5cbiAgICBnZXRPcHRpb25LZXkob3B0aW9uKSA9PT0gZ2V0T3B0aW9uS2V5KHZhbHVlKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB7IGZpZWxkOiBkZXBlbmRlbnRGaWVsZCB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZTogZGVwZW5kc09uLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmVudFZhbHVlUmVmID0gdXNlUmVmKGRlcGVuZGVudEZpZWxkLnZhbHVlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwYXJlbnRWYWx1ZVJlZi5jdXJyZW50ICE9PSBkZXBlbmRlbnRGaWVsZC52YWx1ZSkge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICBwYXJlbnRWYWx1ZVJlZi5jdXJyZW50ID0gZGVwZW5kZW50RmllbGQudmFsdWU7XG4gICAgfVxuICB9LCBbZGVwZW5kZW50RmllbGQudmFsdWUsIGZpZWxkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZURlZmF1bHRTZWxlY3RlZCAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiBmaWVsZC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLCBvcHRpb25zLmxlbmd0aF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFzVmFsdWUgPVxuICAgICAgZmllbGQudmFsdWUgIT09IG51bGwgJiYgZmllbGQudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWVsZC52YWx1ZSAhPT0gJyc7XG5cbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgIWhhc1ZhbHVlICYmICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKGdldE9wdGlvbktleShvcHRpb25zWzBdKSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW1xuICAgIG9wdGlvbnMsXG4gICAgZGlzYWJsZWQsXG4gICAgZ2V0T3B0aW9uS2V5LFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQsXG4gIF0pO1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybiB0cnVlO1xuICAgIGlmIChcbiAgICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlID09PSBudWxsIHx8XG4gICAgICBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PT0gJydcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaXNOdWxsYWJsZSAmJiAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbXG4gICAgZGlzYWJsZWQsXG4gICAgZGVwZW5kZW50RmllbGQudmFsdWUsXG4gICAgb3B0aW9ucy5sZW5ndGgsXG4gICAgaXNOdWxsYWJsZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLFxuICBdKTtcblxuICByZXR1cm4gKFxuICAgIDxGaWVsZFRvb2x0aXAgdG9vbHRpcFNsb3Q9e3Rvb2x0aXBTbG90fT5cbiAgICAgIDxBdXRvY29tcGxldGVcbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAgIHZhbHVlPXtcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICAubWFwKG9wdGlvbiA9PlxuICAgICAgICAgICAgICBnZXRPcHRpb25LZXkob3B0aW9uKSA9PT0gZmllbGQudmFsdWUgPyBvcHRpb24gOiBudWxsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuZmluZChCb29sZWFuKSB8fCBudWxsXG4gICAgICAgIH1cbiAgICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25LZXl9XG4gICAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9e2lzT3B0aW9uRXF1YWxUb1ZhbHVlfVxuICAgICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgICAgZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICAgIHN4PXt7XG4gICAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQsXG4gICAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmLk11aS1kaXNhYmxlZCAuTXVpQXV0b2NvbXBsZXRlLXBvcHVwSW5kaWNhdG9yJzoge1xuICAgICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCAuTXVpT3V0bGluZWRJbnB1dC1ub3RjaGVkT3V0bGluZSc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAnJiAuTXVpRmlsbGVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9fVxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKSA9PiB7XG4gICAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUgPyBnZXRPcHRpb25LZXkobmV3VmFsdWUpIDogbnVsbCk7XG4gICAgICAgICAgaWYgKG9uQ2hhbmdlICYmIHR5cGVvZiBvbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb25DaGFuZ2UoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAvPlxuICAgIDwvRmllbGRUb29sdGlwPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFNlbGVjdENhc2NhZGVFbGVtZW50ID0gPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5TZWxlY3RDYXNjYWRlRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RDYXNjYWRlRWxlbWVudCc7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVWYWx1ZSxcbiAgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmcsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IHVzZVRoZW1lIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuaW1wb3J0IHsgdXNlTWVtbywgdXNlRWZmZWN0LCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgRmllbGRUb29sdGlwIH0gZnJvbSAnQC9jb3JlL2NvbXBvbmVudHMvRmllbGRUb29sdGlwL0ZpZWxkVG9vbHRpcCc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVG9vbHRpcFNsb3QgfSBmcm9tICdAL2NvcmUvY29tcG9uZW50cy9GaWVsZFRvb2x0aXAvRmllbGRUb29sdGlwJztcblxuZXhwb3J0IHR5cGUgU2VsZWN0RWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+LFxuICB8ICduYW1lJ1xuICB8ICdyZW5kZXJJbnB1dCdcbiAgfCAnaXNPcHRpb25FcXVhbFRvVmFsdWUnXG4gIHwgJ2dldE9wdGlvbkxhYmVsJ1xuICB8ICdkaXNhYmxlZCdcbiAgfCAnb3B0aW9ucydcbj4gJiB7XG4gIG5hbWU6IFROYW1lO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBpc051bGxhYmxlPzogYm9vbGVhbjtcbiAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZD86IGJvb2xlYW47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgbGFiZWxGaWVsZD86IHN0cmluZztcbiAgdmFsdWVGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgb3B0aW9ucz86IHJlYWRvbmx5IFRPcHRpb25bXSB8IG51bGw7XG4gIHRvb2x0aXBTbG90PzogRmllbGRUb29sdGlwU2xvdDtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNlbGVjdEVsZW1lbnQ8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPihcbiAgcHJvcHM6IFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPlxuKSB7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkNoYW5nZSxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgbGFiZWwsXG4gICAgdmFyaWFudCxcbiAgICBkaXNhYmxlZCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyBhcyBrZXlvZiBUT3B0aW9uLFxuICAgIHZhbHVlRmllbGQgPSAnVmFsdWUnIGFzIGtleW9mIFRPcHRpb24sXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICBpc051bGxhYmxlID0gZmFsc2UsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCA9IGZhbHNlLFxuICAgIHRvb2x0aXBTbG90ID0ge30sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCwgLi4ucmVzdFRleHRQcm9wcyB9ID0gdGV4dEZpZWxkUHJvcHM7XG4gIGNvbnN0IG9wdGlvbnMgPSB1c2VNZW1vKCgpID0+IG9wdGlvbnNJbnB1dCB8fCBbXSwgW29wdGlvbnNJbnB1dF0pO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3ZhbHVlRmllbGQgYXMga2V5b2YgVE9wdGlvbl0gOiBudWxsO1xuICAgIH0sXG4gICAgW3ZhbHVlRmllbGRdXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGQgYXMga2V5b2YgVE9wdGlvbl0pIDogJyc7XG4gICAgfSxcbiAgICBbbGFiZWxGaWVsZF1cbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlRGVmYXVsdFNlbGVjdGVkICYmIG9wdGlvbnMubGVuZ3RoID09PSAxICYmIGZpZWxkLnZhbHVlID09IG51bGwpIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgIH1cbiAgfSwgW2Rpc2FibGVEZWZhdWx0U2VsZWN0ZWQsIG9wdGlvbnMubGVuZ3RoXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYXNWYWx1ZSA9XG4gICAgICBmaWVsZC52YWx1ZSAhPT0gbnVsbCAmJiBmaWVsZC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpZWxkLnZhbHVlICE9PSAnJztcblxuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaGFzVmFsdWUgJiYgIWRpc2FibGVEZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgZmllbGQub25DaGFuZ2UoZ2V0T3B0aW9uVmFsdWUob3B0aW9uc1swXSkpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtcbiAgICBvcHRpb25zLFxuICAgIGRpc2FibGVkLFxuICAgIGdldE9wdGlvblZhbHVlLFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQsXG4gIF0pO1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmICFpc051bGxhYmxlICYmICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkKVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZCwgb3B0aW9ucy5sZW5ndGgsIGlzTnVsbGFibGUsIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWRdKTtcblxuICBjb25zdCBhdXRvY29tcGxldGVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIG9wdGlvbnMuZmluZChvcHRpb24gPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZmllbGQudmFsdWUpID8/IG51bGwsXG4gICAgW2ZpZWxkLnZhbHVlLCBvcHRpb25zLCBnZXRPcHRpb25WYWx1ZV1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxGaWVsZFRvb2x0aXAgdG9vbHRpcFNsb3Q9e3Rvb2x0aXBTbG90fT5cbiAgICAgIDxBdXRvY29tcGxldGVcbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9ucz17ZmFsc2V9XG4gICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgIHZhbHVlPXtcbiAgICAgICAgICBhdXRvY29tcGxldGVWYWx1ZSBhcyBBdXRvY29tcGxldGVWYWx1ZTxcbiAgICAgICAgICAgIFRPcHRpb24sXG4gICAgICAgICAgICBNdWx0aXBsZSxcbiAgICAgICAgICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgICAgICAgICBGcmVlU29sb1xuICAgICAgICAgID5cbiAgICAgICAgfVxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uID0gbmV3VmFsdWUgYXMgVE9wdGlvbiB8IG51bGw7XG5cbiAgICAgICAgICBmaWVsZC5vbkNoYW5nZShvcHRpb24gPyBnZXRPcHRpb25WYWx1ZShvcHRpb24pIDogbnVsbCk7XG4gICAgICAgICAgb25DaGFuZ2U/LihldmVudCwgbmV3VmFsdWUsIHJlYXNvbik7XG4gICAgICAgIH19XG4gICAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgICBzeD17e1xuICAgICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgJyYgLk11aUZpbGxlZElucHV0LXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfX1cbiAgICAgICAgZ2V0T3B0aW9uTGFiZWw9e29wdGlvbiA9PiBnZXRPcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgLz5cbiAgICA8L0ZpZWxkVG9vbHRpcD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBBdXRvY29tcGxldGUgY29tcG9uZW50IGZvciBzZWxlY3RpbmcgZnJvbSBwcmVkZWZpbmVkIG9wdGlvbnMuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIHNlbGVjdC9hdXRvY29tcGxldGUgaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5XG4gKiB3aXRoIHJlYWN0LWhvb2stZm9ybSwgaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgYW5kIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICogZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy4gSXQgc3VwcG9ydHMgYm90aCBzaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdGlvbiBtb2Rlcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b2NvbXBsZXRlIHdpdGggZmlsdGVyaW5nXG4gKiAtIFNpbmdsZSBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uIHN1cHBvcnRcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gQ3VzdG9taXphYmxlIG9wdGlvbiBkaXNwbGF5IChsYWJlbEtleS92YWx1ZUtleSlcbiAqIC0gQXV0by1zZWxlY3Rpb24gd2hlbiBvbmx5IG9uZSBvcHRpb24gZXhpc3RzXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiY2F0ZWdvcnlcIlxuICogICBsYWJlbD1cIkNhdGVnb3J5XCJcbiAqICAgb3B0aW9ucz17W1xuICogICAgIHsgTGFiZWw6ICdUZWNobm9sb2d5JywgVmFsdWU6ICd0ZWNoJyB9XG4gKiAgIF19XG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIHNlbGVjdCBhIGNhdGVnb3J5JyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBrZXlzOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcklkXCJcbiAqICAgbGFiZWw9XCJBc3NpZ24gdG8gVXNlclwiXG4gKiAgIG9wdGlvbnM9e3VzZXJzfVxuICogICBsYWJlbEtleT1cImZ1bGxOYW1lXCJcbiAqICAgdmFsdWVLZXk9XCJpZFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGEgdXNlci4uLlwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIE11bHRpcGxlIHNlbGVjdGlvbjpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRhZ3NcIlxuICogICBsYWJlbD1cIlRhZ3NcIlxuICogICBvcHRpb25zPXthdmFpbGFibGVUYWdzfVxuICogICBtdWx0aXBsZVxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA4IH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVE9wdGlvbiAtIFRoZSBvcHRpb24gb2JqZWN0IHR5cGVcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIE11bHRpcGxlIC0gV2hldGhlciBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIERpc2FibGVDbGVhcmFibGUgLSBXaGV0aGVyIHRoZSBjbGVhciBidXR0b24gaXMgZGlzYWJsZWRcbiAqIEB0ZW1wbGF0ZSBGcmVlU29sbyAtIFdoZXRoZXIgZnJlZSB0ZXh0IGlucHV0IGlzIGFsbG93ZWRcbiAqIEB0ZW1wbGF0ZSBDaGlwQ29tcG9uZW50IC0gVGhlIGNoaXAgY29tcG9uZW50IHR5cGUgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdEVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0RWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBNdWx0aXBsZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgRnJlZVNvbG8sXG4gIENoaXBDb21wb25lbnRcbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblNlbGVjdEVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0RWxlbWVudCc7XG4iLCAiaW1wb3J0IENoZWNrQm94SWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0NoZWNrQm94JztcbmltcG9ydCBDaGVja0JveE91dGxpbmVCbGFua0ljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveE91dGxpbmVCbGFuayc7XG5pbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIEF1dG9jb21wbGV0ZVByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIEdyaWQsXG4gIENoZWNrYm94LFxuICBUZXh0RmllbGQsXG4gIEF1dG9jb21wbGV0ZSxcbiAgQ2lyY3VsYXJQcm9ncmVzcyxcbiAgdXNlVGhlbWUsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZyYWdtZW50LCB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7XG4gIEZpZWxkVG9vbHRpcFxufSBmcm9tICdAL2NvcmUvY29tcG9uZW50cy9GaWVsZFRvb2x0aXAvRmllbGRUb29sdGlwJztcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRUb29sdGlwU2xvdH0gZnJvbSAnQC9jb3JlL2NvbXBvbmVudHMvRmllbGRUb29sdGlwL0ZpZWxkVG9vbHRpcCc7XG5cbnR5cGUgQmFzZUF1dG9jb21wbGV0ZVByb3BzPFxuICBUT3B0aW9uLFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+LFxuICAnbmFtZScgfCAncmVuZGVySW5wdXQnIHwgJ211bHRpcGxlJyB8ICdvbkNoYW5nZScgfCAndmFsdWUnXG4+O1xuXG5leHBvcnQgdHlwZSBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSB0cnVlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlLFxuICBEaXNhYmxlQ2xlYXJhYmxlLFxuICBGcmVlU29sbyxcbiAgQ2hpcENvbXBvbmVudFxuPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBpc051bGxhYmxlPzogYm9vbGVhbjtcbiAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZD86IGJvb2xlYW47XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgbGFiZWxGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICBvcHRpb25zPzogcmVhZG9ubHkgVE9wdGlvbltdIHwgbnVsbDtcbiAgdG9vbHRpcFNsb3Q/OiBGaWVsZFRvb2x0aXBTbG90O1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0TXVsdGlFbGVtZW50PFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIGlzTnVsbGFibGUsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCA9IHRydWUsXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyxcbiAgICB0b29sdGlwU2xvdCA9IHt9LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gb3B0aW9uc0lucHV0IHx8IFtdLCBbb3B0aW9uc0lucHV0XSk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvblt2YWx1ZUZpZWxkIGFzIGtleW9mIFRPcHRpb25dIDogbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGQgYXMga2V5b2YgVE9wdGlvbl0pIDogJyc7XG4gIH07XG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmICFpc051bGxhYmxlICYmICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkKVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZCwgb3B0aW9ucy5sZW5ndGgsIGlzTnVsbGFibGUsIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWRdKTtcblxuICBjb25zdCBzZWxlY3RlZFZhbHVlID1cbiAgICBmaWVsZC52YWx1ZSAmJiBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKVxuICAgICAgPyBvcHRpb25zLmZpbHRlcihvcHRpb24gPT4gZmllbGQudmFsdWUuaW5jbHVkZXMoZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSkpXG4gICAgICA6IFtdO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQgJiYgb3B0aW9ucy5sZW5ndGggPT09IDEgJiYgZmllbGQudmFsdWUgPT0gbnVsbCkge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgfVxuICB9LCBbZGlzYWJsZURlZmF1bHRTZWxlY3RlZCwgb3B0aW9ucy5sZW5ndGhdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhc1ZhbHVlID0gQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgJiYgZmllbGQudmFsdWUubGVuZ3RoID4gMDtcblxuICAgIGlmIChcbiAgICAgIG9wdGlvbnMubGVuZ3RoID09PSAxICYmXG4gICAgICAhaGFzVmFsdWUgJiZcbiAgICAgICFpc051bGxhYmxlICYmXG4gICAgICAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZFxuICAgICkge1xuICAgICAgZmllbGQub25DaGFuZ2UoW2dldE9wdGlvblZhbHVlKG9wdGlvbnNbMF0pXSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW1xuICAgIG9wdGlvbnMsXG4gICAgZ2V0T3B0aW9uVmFsdWUsXG4gICAgZmllbGQub25DaGFuZ2UsXG4gICAgaXNOdWxsYWJsZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLFxuICBdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogU3ludGhldGljRXZlbnQsXG4gICAgc2VsZWN0ZWRPcHRpb25zOiBUT3B0aW9uW10sXG4gICAgcmVhc29uOiBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb25cbiAgKSA9PiB7XG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgfSBlbHNlIGlmIChyZWFzb24gPT09ICdzZWxlY3RPcHRpb24nIHx8IHJlYXNvbiA9PT0gJ3JlbW92ZU9wdGlvbicpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHNlbGVjdGVkT3B0aW9ucy5tYXAob3B0aW9uID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikpO1xuXG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXMubGVuZ3RoID09PSAwID8gbnVsbCA6IG5ld1ZhbHVlcyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGljb24gPSA8Q2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZvbnRTaXplPVwic21hbGxcIiAvPjtcbiAgY29uc3QgY2hlY2tlZEljb24gPSA8Q2hlY2tCb3hJY29uIGZvbnRTaXplPVwic21hbGxcIiAvPjtcblxuICByZXR1cm4gKFxuICAgIDxGaWVsZFRvb2x0aXAgdG9vbHRpcFNsb3Q9e3Rvb2x0aXBTbG90fT5cbiAgICAgIDxBdXRvY29tcGxldGVcbiAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgdmFsdWU9e3NlbGVjdGVkVmFsdWV9XG4gICAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgICBkaXNhYmxlQ2xvc2VPblNlbGVjdFxuICAgICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgICAgZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgICAgc3g9e3tcbiAgICAgICAgICAnJi5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmIC5NdWlJbnB1dEJhc2Utcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCxcbiAgICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYuTXVpLWRpc2FibGVkIC5NdWlBdXRvY29tcGxldGUtcG9wdXBJbmRpY2F0b3InOiB7XG4gICAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWRpc2FibGVkIC5NdWlPdXRsaW5lZElucHV0LW5vdGNoZWRPdXRsaW5lJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH19XG4gICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICByZW5kZXJPcHRpb249eyhwcm9wczEsIG9wdGlvbiwgeyBzZWxlY3RlZCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxsaSB7Li4ucHJvcHMxfT5cbiAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgaWNvbj17aWNvbn1cbiAgICAgICAgICAgICAgICBjaGVja2VkSWNvbj17Y2hlY2tlZEljb259XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWR9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIHtnZXRPcHRpb25MYWJlbChvcHRpb24gYXMgVE9wdGlvbil9XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICk7XG4gICAgICAgIH19XG4gICAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgICAgSW5wdXRQcm9wcz17e1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHsuLi5yZXN0fVxuICAgICAgLz5cbiAgICA8L0ZpZWxkVG9vbHRpcD5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5TZWxlY3RNdWx0aUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0TXVsdGlFbGVtZW50JztcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIFRleHRGaWVsZCwgdXNlRm9ya1JlZiwgdXNlVGhlbWUgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQsIFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHsgdXNlRW5oYW5jZWRUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuXG5pbXBvcnQgeyBGaWVsZFRvb2x0aXAgfSBmcm9tICdAL2NvcmUvY29tcG9uZW50cy9GaWVsZFRvb2x0aXAnO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFRvb2x0aXBTbG90IH0gZnJvbSAnQC9jb3JlL2NvbXBvbmVudHMvRmllbGRUb29sdGlwL0ZpZWxkVG9vbHRpcCc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBUZXh0RmllbGRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXh0RmllbGRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImZpcnN0TmFtZVwiIHwgXCJ1c2VyLmVtYWlsXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBmaWVsZCBlcnJvciBvYmplY3RcbiAgICogQHJldHVybnMgQ3VzdG9tIGVycm9yIG1lc3NhZ2Ugb3IgY29tcG9uZW50XG4gICAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ3VzdG9tIFRleHRGaWVsZCBjb21wb25lbnQgdG8gdXNlIGluc3RlYWQgb2YgZGVmYXVsdCBNVUkgVGV4dEZpZWxkXG4gICAqL1xuICBjb21wb25lbnQ/OiB0eXBlb2YgVGV4dEZpZWxkO1xuICAvKipcbiAgICogVmFsdWUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGZvciBpbnB1dC9vdXRwdXRcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGZpZWxkVHlwZSBmb3IgY29tbW9uIHBhdHRlcm5zIG9yIGN1c3RvbSB0cmFuc2Zvcm1zIGZvciBjb21wbGV4IGNhc2VzXG4gICAqL1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgLyoqIFRyYW5zZm9ybSB2YWx1ZSBiZWZvcmUgZGlzcGxheWluZyBpbiBpbnB1dCAqL1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZTtcbiAgICAvKiogVHJhbnNmb3JtIGlucHV0IGV2ZW50IHRvIGZvcm0gdmFsdWUgKi9cbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IEV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgLyoqXG4gICAqIEJ1aWx0LWluIGZpZWxkIHR5cGUgZm9yIGF1dG9tYXRpYyB0cmFuc2Zvcm1hdGlvblxuICAgKiBAZXhhbXBsZSAndGV4dCcgfCAnbnVtYmVyJyB8ICdkYXRlJyB8ICd0aW1lJyB8ICdzZWxlY3QnXG4gICAqL1xuICBmaWVsZFR5cGU/OiBGaWVsZFR5cGU7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlIHRvIGRpc3BsYXkgd2hlbiBmaWVsZCB2YWx1ZSBpcyBudWxsL3VuZGVmaW5lZFxuICAgKiBAZXhhbXBsZSBcIlwiXG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBUVmFsdWU7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgbGFiZWwgdGV4dFxuICAgKiBAZXhhbXBsZSBcIkVtYWlsIEFkZHJlc3NcIlxuICAgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgaW5wdXRcbiAgICogQGV4YW1wbGUgXCJFbnRlciB5b3VyIGVtYWlsXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICAvKipcbiAgICogVGhlIFRleHRGaWVsZCB2YXJpYW50XG4gICAqIEBkZWZhdWx0VmFsdWUgXCJvdXRsaW5lZFwiXG4gICAqL1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGZvciB0aGUgVGV4dEZpZWxkXG4gICAqL1xuICAvKipcbiAgICogQ3VzdG9tIG9uQ2hhbmdlIGhhbmRsZXIgY2FsbGVkIGFmdGVyIHRyYW5zZm9ybWF0aW9uXG4gICAqL1xuICBvbkNoYW5nZT86IChcbiAgICBldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZSBkZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nIHRyYW5zZm9ybWF0aW9uIGlzc3Vlc1xuICAgKiBAZGVmYXVsdFZhbHVlIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAqL1xuICBlbmFibGVXYXJuaW5ncz86IGJvb2xlYW47XG4gIHRvb2x0aXBTbG90PzogRmllbGRUb29sdGlwU2xvdDtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gVGV4dEZpZWxkRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+KHByb3BzOiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgcGFyc2VFcnJvcixcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgY29tcG9uZW50OiBUZXh0RmllbGRDb21wb25lbnQgPSBUZXh0RmllbGQsXG4gICAgdHJhbnNmb3JtLFxuICAgIGZpZWxkVHlwZSA9ICd0ZXh0JywgLy8gRGVmYXVsdCB0byB0ZXh0IHR5cGVcbiAgICBkZWZhdWx0VmFsdWUsXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIG9uQ2hhbmdlOiBjdXN0b21PbkNoYW5nZSxcbiAgICBlbmFibGVXYXJuaW5ncyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnLFxuICAgIHRvb2x0aXBTbG90ID0ge30sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcmVxdWlyZWQsXG4gICAgaGVscGVyVGV4dCxcbiAgICBpbnB1dFJlZixcbiAgICBvbklucHV0LFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgLy8gVXNlIHRoZSBlbmhhbmNlZCB0cmFuc2Zvcm0gaG9vayB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnNcbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZUVuaGFuY2VkVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oXG4gICAge1xuICAgICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpbnB1dDogdHJhbnNmb3JtLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB0cmFuc2Zvcm0ub3V0cHV0LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBmaWVsZFR5cGU6ICF0cmFuc2Zvcm1cbiAgICAgICAgPyB0eXBlID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gJ251bWJlcidcbiAgICAgICAgICA6IGZpZWxkVHlwZVxuICAgICAgICA6IHVuZGVmaW5lZCwgLy8gQXV0by1kZXRlY3QgbnVtYmVyIHR5cGVcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIGVuYWJsZVdhcm5pbmdzLFxuICAgIH1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8RmllbGRUb29sdGlwIHRvb2x0aXBTbG90PXt0b29sdGlwU2xvdH0+XG4gICAgICA8VGV4dEZpZWxkQ29tcG9uZW50XG4gICAgICAgIHsuLi5yZXN0fVxuICAgICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgICAgbmFtZT17ZmllbGQubmFtZX1cbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBvbkNoYW5nZT17ZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgICAgaWYgKGlucHV0ID09PSAnJykge1xuICAgICAgICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjdXN0b21PbkNoYW5nZShldmVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9fVxuICAgICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICAgIG9uSW5wdXQ9eyhldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIG9uSW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9uSW5wdXQoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgdHlwZT17dHlwZX1cbiAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgIGhlbHBlclRleHQ9e1xuICAgICAgICAgIGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogaGVscGVyVGV4dFxuICAgICAgICB9XG4gICAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICBzeD17e1xuICAgICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgPC9GaWVsZFRvb2x0aXA+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgVGV4dEZpZWxkIGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uLFxuICogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucywgYW5kIGJ1aWx0LWluIGZpZWxkIHR5cGUgaGFuZGxpbmcuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5IHdpdGggY3VzdG9tIHBhcnNpbmdcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gc3VwcG9ydFxuICogLSBCdWlsdC1pbiBmaWVsZCB0eXBlcyBmb3IgY29tbW9uIHBhdHRlcm5zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBPcHRpbWl6ZWQgbnVtYmVyIGlucHV0IGhhbmRsaW5nXG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyB3aXRoIG1lbW9pemVkIHRyYW5zZm9ybWF0aW9uc1xuICogLSBEZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nXG4gKiAtIFN0YWJsZSByZWZlcmVuY2VzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGJ1aWx0LWluIG51bWJlciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFnZVwiXG4gKiAgIGxhYmVsPVwiQWdlXCJcbiAqICAgZmllbGRUeXBlPVwibnVtYmVyXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdBZ2UgaXMgcmVxdWlyZWQnLCBtaW46IHsgdmFsdWU6IDAsIG1lc3NhZ2U6ICdBZ2UgbXVzdCBiZSBwb3NpdGl2ZScgfSB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImVtYWlsXCJcbiAqICAgbGFiZWw9XCJFbWFpbFwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgZW1haWwgYWRkcmVzc1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnRW1haWwgaXMgcmVxdWlyZWQnLFxuICogICAgIHBhdHRlcm46IHsgdmFsdWU6IC9cXFMrQFxcUytcXC5cXFMrLywgbWVzc2FnZTogJ0ludmFsaWQgZW1haWwnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIHRyYW5zZm9ybWF0aW9uOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicHJpY2VcIlxuICogICBsYWJlbD1cIlByaWNlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPyBgJCR7dmFsdWV9YCA6ICcnLFxuICogICAgIG91dHB1dDogKGV2ZW50KSA9PiBwYXJzZUZsb2F0KGV2ZW50LnRhcmdldC52YWx1ZS5yZXBsYWNlKCckJywgJycpKSB8fCBudWxsXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGVycm9yIHBhcnNpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VybmFtZVwiXG4gKiAgIGxhYmVsPVwiVXNlcm5hbWVcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiAoXG4gKiAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICdyZWQnIH19PlxuICogICAgICAgXHUyNkEwXHVGRTBGIHtlcnJvci5tZXNzYWdlfVxuICogICAgIDwvc3Bhbj5cbiAqICAgKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgVGltZVBpY2tlclByb3BzLFxuICBUaW1lUGlja2VyU2xvdFByb3BzLFxuICBUaW1lVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCB7IFRpbWVQaWNrZXIgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFscyc7XG5pbXBvcnQgeyByZW5kZXJUaW1lVmlld0Nsb2NrIH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycy90aW1lVmlld1JlbmRlcmVycyc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgRmllbGRUb29sdGlwU2xvdCB9IGZyb20gJ0AvY29yZS9jb21wb25lbnRzL0ZpZWxkVG9vbHRpcC9GaWVsZFRvb2x0aXAnO1xuaW1wb3J0IHsgRmllbGRUb29sdGlwIH0gZnJvbSAnQC9jb3JlL2NvbXBvbmVudHMvRmllbGRUb29sdGlwL0ZpZWxkVG9vbHRpcCc7XG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICdAL2hvb2tzJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnQC90eXBlcyc7XG5pbXBvcnQgeyByZWFkVmFsdWVBc0RhdGUgfSBmcm9tICdAL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lUGlja2VyRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgVGltZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBpbnB1dFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgaGVscGVyVGV4dD86IFRleHRGaWVsZFByb3BzWydoZWxwZXJUZXh0J107XG4gIGxhYmVsPzogUmVhY3ROb2RlO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgc2xvdFByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyU2xvdFByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgICd0ZXh0RmllbGQnXG4gID47XG4gIHRyYW5zZm9ybT86IHtcbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWUgfCBudWxsO1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHRpbWVQaWNrZXJQcm9wcz86IE9taXQ8XG4gICAgVGltZVBpY2tlclByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgICd2YWx1ZScgfCAnc2xvdFByb3BzJ1xuICA+O1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIHRvb2x0aXBTbG90PzogRmllbGRUb29sdGlwU2xvdDtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gVGltZVBpY2tlckVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihwcm9wczogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIHJlcXVpcmVkLFxuICAgIGlucHV0UHJvcHMsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBzbG90UHJvcHMsXG4gICAgdGltZVBpY2tlclByb3BzID0ge30sXG4gICAgdHJhbnNmb3JtLFxuICAgIHRvb2x0aXBTbG90ID0ge30sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIGNvbnN0IHsgZGlzYWJsZWQsIGlucHV0UmVmLCBvbkNsb3NlLCAuLi5yZXN0VGltZVBpY2tlclByb3BzIH0gPVxuICAgIHRpbWVQaWNrZXJQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlIHwgbnVsbD4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogbmV3VmFsdWUgPT4gcmVhZFZhbHVlQXNEYXRlKGFkYXB0ZXIsIG5ld1ZhbHVlKSxcbiAgICAgIG91dHB1dDogZGF0YSA9PiB7XG4gICAgICAgIGlmICghZGF5anMuaXNEYXlqcyhkYXRhKSkge1xuICAgICAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPEZpZWxkVG9vbHRpcCB0b29sdGlwU2xvdD17dG9vbHRpcFNsb3R9PlxuICAgICAgPFRpbWVQaWNrZXJcbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAgIHsuLi5yZXN0VGltZVBpY2tlclByb3BzfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBvcGVuPXtvcGVufVxuICAgICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICAgIHZpZXdSZW5kZXJlcnM9e3tcbiAgICAgICAgICBob3VyczogcmVuZGVyVGltZVZpZXdDbG9jayxcbiAgICAgICAgICBtaW51dGVzOiByZW5kZXJUaW1lVmlld0Nsb2NrLFxuICAgICAgICAgIHNlY29uZHM6IHJlbmRlclRpbWVWaWV3Q2xvY2ssXG4gICAgICAgIH19XG4gICAgICAgIG9uT3Blbj17KCkgPT4gc2V0T3Blbih0cnVlKX1cbiAgICAgICAgb25DbG9zZT17KC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBzZXRPcGVuKGZhbHNlKTtcbiAgICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgICBvbkNsb3NlPy4oLi4uYXJncyk7XG4gICAgICAgIH19XG4gICAgICAgIG9uQ2hhbmdlPXsobmV3VmFsdWUsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZSk7XG4gICAgICAgICAgdGltZVBpY2tlclByb3BzLm9uQ2hhbmdlPy4obmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9fVxuICAgICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ2NhbmNlbCcsICdhY2NlcHQnXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRleHRGaWVsZDoge1xuICAgICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgIHN4OiB7XG4gICAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIHNldE9wZW4odHJ1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkJsdXI6IChcbiAgICAgICAgICAgICAgZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgICAgICAgIGlucHV0UHJvcHM/Lm9uQmx1cj8uKGV2ZW50KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogISFlcnJvcixcbiAgICAgICAgICAgIGhlbHBlclRleHQ6IGVycm9yXG4gICAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICA6IGlucHV0UHJvcHM/LmhlbHBlclRleHQgfHwgcmVzdC5oZWxwZXJUZXh0LFxuICAgICAgICAgICAgaW5wdXRQcm9wczoge1xuICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5wdXRNb2RlOiAnbm9uZScsXG4gICAgICAgICAgICAgIC4uLmlucHV0UHJvcHM/LmlucHV0UHJvcHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvRmllbGRUb29sdGlwPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFRpbWVQaWNrZXJFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblRpbWVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1RpbWVQaWNrZXJFbGVtZW50JztcbiIsICJpbXBvcnQge1xuICBCb3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgRm9ybUxhYmVsLFxuICBHcmlkLFxuICBTbGlkZXIsXG4gIHR5cGUgR3JpZFByb3BzLFxuICB0eXBlIFNsaWRlclByb3BzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkRXJyb3IsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBTbGlkZXJFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGlkZXJFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ge1xuICAvKiogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm0gKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKiBUaGUgaW5wdXQgbGFiZWwgdGV4dCAqL1xuICBsYWJlbD86IFJlYWN0Tm9kZTtcbiAgLyoqIEhlbHBlciB0ZXh0IHRvIGRpc3BsYXkgYmVsb3cgdGhlIHNsaWRlciAqL1xuICBoZWxwZXJUZXh0PzogUmVhY3ROb2RlO1xuICAvKiogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqIE1pbmltdW0gdmFsdWUgKi9cbiAgbWluPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSB2YWx1ZSAqL1xuICBtYXg/OiBudW1iZXI7XG4gIC8qKiBTdGVwIGluY3JlbWVudCAqL1xuICBzdGVwPzogbnVtYmVyO1xuICAvKiogU2hvdyBtYXJrcyBvbiB0aGUgc2xpZGVyICovXG4gIG1hcmtzPzogYm9vbGVhbiB8IHsgdmFsdWU6IG51bWJlcjsgbGFiZWw/OiBzdHJpbmcgfVtdO1xuICAvKiogV2hldGhlciB0aGUgZmllbGQgaXMgcmVxdWlyZWQgKi9cbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgZmllbGQgaXMgZGlzYWJsZWQgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSBTbGlkZXIgY29tcG9uZW50ICovXG4gIHNsaWRlclByb3BzPzogT21pdDxTbGlkZXJQcm9wcywgJ3ZhbHVlJyB8ICdvbkNoYW5nZScgfCAnbWluJyB8ICdtYXgnIHwgJ3N0ZXAnIHwgJ21hcmtzJyB8ICdkaXNhYmxlZCc+O1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTbGlkZXJFbGVtZW50Q29yZTxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogT21pdDxTbGlkZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4sICdncmlkUHJvcHMnPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGxhYmVsLFxuICAgIGhlbHBlclRleHQsXG4gICAgcGFyc2VFcnJvcixcbiAgICBtaW4gPSAwLFxuICAgIG1heCA9IDEwMCxcbiAgICBzdGVwID0gMSxcbiAgICBtYXJrcyA9IGZhbHNlLFxuICAgIHJlcXVpcmVkID0gZmFsc2UsXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgICBzbGlkZXJQcm9wcyA9IHt9LFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgPyAocGFyc2VFcnJvciA/IHBhcnNlRXJyb3IoZXJyb3IpIDogZXJyb3IubWVzc2FnZSkgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sXG4gICAgICBmdWxsV2lkdGhcbiAgICAgIG1hcmdpbj1cIm5vcm1hbFwiXG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICA+XG4gICAgICB7bGFiZWwgJiYgPEZvcm1MYWJlbCBzeD17eyBtYjogMiB9fT57bGFiZWx9PC9Gb3JtTGFiZWw+fVxuICAgICAgPEJveCBzeD17eyBweDogMiB9fT5cbiAgICAgICAgPFNsaWRlclxuICAgICAgICAgIHsuLi5zbGlkZXJQcm9wc31cbiAgICAgICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgICAgIHZhbHVlPXt0eXBlb2YgZmllbGQudmFsdWUgPT09ICdudW1iZXInID8gZmllbGQudmFsdWUgOiBtaW59XG4gICAgICAgICAgb25DaGFuZ2U9eyhfLCBuZXdWYWx1ZSkgPT4gZmllbGQub25DaGFuZ2UobmV3VmFsdWUpfVxuICAgICAgICAgIG9uQmx1cj17ZmllbGQub25CbHVyfVxuICAgICAgICAgIG1pbj17bWlufVxuICAgICAgICAgIG1heD17bWF4fVxuICAgICAgICAgIHN0ZXA9e3N0ZXB9XG4gICAgICAgICAgbWFya3M9e21hcmtzfVxuICAgICAgICAgIHZhbHVlTGFiZWxEaXNwbGF5PVwiYXV0b1wiXG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAvPlxuICAgICAgPC9Cb3g+XG4gICAgICB7KGVycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0KSAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dD57ZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHR9PC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBTbGlkZXIgY29tcG9uZW50LlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBDdXN0b21pemFibGUgbWluL21heC9zdGVwIHZhbHVlc1xuICogLSBPcHRpb25hbCBtYXJrcyBkaXNwbGF5XG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIDxTbGlkZXJFbGVtZW50XG4gKiAgIG5hbWU9XCJyYXRpbmdcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIlJhdGluZ1wiXG4gKiAgIG1pbj17MH1cbiAqICAgbWF4PXsxMH1cbiAqICAgc3RlcD17MX1cbiAqICAgbWFya3NcbiAqIC8+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IFNsaWRlckVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNsaWRlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPik6IFJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuU2xpZGVyRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTbGlkZXJFbGVtZW50JztcbiIsICJpbXBvcnQge1xuICBCb3gsXG4gIEJ1dHRvbixcbiAgQ2hpcCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBGb3JtTGFiZWwsXG4gIEdyaWQsXG4gIFN0YWNrLFxuICB0eXBlIEdyaWRQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgQ2xvdWRVcGxvYWRJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2xvdWRVcGxvYWQnO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCwgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZEVycm9yLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIsIHVzZUZvcm1Db250ZXh0IH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEZpbGVVcGxvYWRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlVXBsb2FkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+IHtcbiAgLyoqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtICovXG4gIG5hbWU6IFROYW1lO1xuICAvKiogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKiogVGhlIGlucHV0IGxhYmVsIHRleHQgKi9cbiAgbGFiZWw/OiBSZWFjdE5vZGU7XG4gIC8qKiBIZWxwZXIgdGV4dCB0byBkaXNwbGF5IGJlbG93IHRoZSB1cGxvYWQgKi9cbiAgaGVscGVyVGV4dD86IFJlYWN0Tm9kZTtcbiAgLyoqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlciAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBmaWxlcyBhbGxvd2VkICovXG4gIG1heEZpbGVzPzogbnVtYmVyO1xuICAvKiogTWF4aW11bSBmaWxlIHNpemUgaW4gTUIgKi9cbiAgbWF4U2l6ZU1CPzogbnVtYmVyO1xuICAvKiogQWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgKGUuZy4sIFsnLmpwZycsICcucG5nJywgJy5wZGYnXSkgKi9cbiAgYWxsb3dlZEV4dGVuc2lvbnM/OiBzdHJpbmdbXTtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlcXVpcmVkICovXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGRpc2FibGVkICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKiBCdXR0b24gdGV4dCAqL1xuICBidXR0b25UZXh0Pzogc3RyaW5nO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBGaWxlVXBsb2FkRWxlbWVudENvcmU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IE9taXQ8RmlsZVVwbG9hZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPiwgJ2dyaWRQcm9wcyc+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgbGFiZWwsXG4gICAgaGVscGVyVGV4dCxcbiAgICBwYXJzZUVycm9yLFxuICAgIG1heEZpbGVzID0gNSxcbiAgICBtYXhTaXplTUIgPSAxMCxcbiAgICBhbGxvd2VkRXh0ZW5zaW9ucyA9IFsnLmpwZycsICcuanBlZycsICcucG5nJywgJy5wZGYnLCAnLmRvYycsICcuZG9jeCcsICcueGxzJywgJy54bHN4J10sXG4gICAgcmVxdWlyZWQgPSBmYWxzZSxcbiAgICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgIGJ1dHRvblRleHQgPSAnQ2hvb3NlIEZpbGVzJyxcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgc2V0RXJyb3IsIGNsZWFyRXJyb3JzIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xuICBjb25zdCBmaWxlSW5wdXRSZWYgPSB1c2VSZWY8SFRNTElucHV0RWxlbWVudD4obnVsbCk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgZmlsZXM6IEZpbGVbXSA9IEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpID8gZmllbGQudmFsdWUgOiBbXTtcblxuICBjb25zdCB2YWxpZGF0ZUZpbGVzID0gdXNlQ2FsbGJhY2soXG4gICAgKGZpbGVMaXN0OiBGaWxlTGlzdCB8IG51bGwpOiBGaWxlW10gfCBzdHJpbmcgPT4ge1xuICAgICAgaWYgKCFmaWxlTGlzdCB8fCBmaWxlTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZUxpc3QubGVuZ3RoID4gbWF4RmlsZXMpIHtcbiAgICAgICAgcmV0dXJuIGBNYXhpbXVtICR7bWF4RmlsZXN9IGZpbGVzIGFsbG93ZWRgO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXhTaXplQnl0ZXMgPSBtYXhTaXplTUIgKiAxMDI0ICogMTAyNDtcbiAgICAgIGNvbnN0IHZhbGlkRmlsZXM6IEZpbGVbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBmaWxlTGlzdFtpXTtcblxuICAgICAgICBpZiAoZmlsZS5zaXplID4gbWF4U2l6ZUJ5dGVzKSB7XG4gICAgICAgICAgcmV0dXJuIGBGaWxlIFwiJHtmaWxlLm5hbWV9XCIgZXhjZWVkcyAke21heFNpemVNQn1NQiBzaXplIGxpbWl0YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9ICcuJyArIGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIWFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICByZXR1cm4gYEZpbGUgXCIke2ZpbGUubmFtZX1cIiBoYXMgaW52YWxpZCBleHRlbnNpb24uIEFsbG93ZWQ6ICR7YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCAnKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsaWRGaWxlcztcbiAgICB9LFxuICAgIFttYXhGaWxlcywgbWF4U2l6ZU1CLCBhbGxvd2VkRXh0ZW5zaW9uc11cbiAgKTtcblxuICBjb25zdCBoYW5kbGVGaWxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVGaWxlcyhldmVudC50YXJnZXQuZmlsZXMpO1xuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2V0RXJyb3IobmFtZSwgeyB0eXBlOiAndmFsaWRhdGlvbicsIG1lc3NhZ2U6IHJlc3VsdCB9KTtcbiAgICAgICAgaWYgKGZpbGVJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgZmlsZUlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNsZWFyRXJyb3JzKG5hbWUpO1xuICAgICAgZmllbGQub25DaGFuZ2UocmVzdWx0KTtcbiAgICB9LFxuICAgIFt2YWxpZGF0ZUZpbGVzLCBzZXRFcnJvciwgY2xlYXJFcnJvcnMsIG5hbWUsIGZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVJlbW92ZUZpbGUgPSB1c2VDYWxsYmFjayhcbiAgICAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbmV3RmlsZXMgPSBmaWxlcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld0ZpbGVzKTtcblxuICAgICAgaWYgKGZpbGVJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50LnZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmlsZXMsIGZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbFxuICAgICAgZnVsbFdpZHRoXG4gICAgICBtYXJnaW49XCJub3JtYWxcIlxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgPlxuICAgICAge2xhYmVsICYmIDxGb3JtTGFiZWwgc3g9e3sgbWI6IDEgfX0+e2xhYmVsfTwvRm9ybUxhYmVsPn1cbiAgICAgIDxCb3g+XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgIGNvbXBvbmVudD1cImxhYmVsXCJcbiAgICAgICAgICBzdGFydEljb249ezxDbG91ZFVwbG9hZEljb24gLz59XG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8IGZpbGVzLmxlbmd0aCA+PSBtYXhGaWxlc31cbiAgICAgICAgPlxuICAgICAgICAgIHtidXR0b25UZXh0fVxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgcmVmPXtmaWxlSW5wdXRSZWZ9XG4gICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgYWNjZXB0PXthbGxvd2VkRXh0ZW5zaW9ucy5qb2luKCcsJyl9XG4gICAgICAgICAgICBoaWRkZW5cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVGaWxlQ2hhbmdlfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgICB7ZmlsZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPFN0YWNrIGRpcmVjdGlvbj1cInJvd1wiIHNwYWNpbmc9ezF9IGZsZXhXcmFwPVwid3JhcFwiIHN4PXt7IG10OiAyIH19PlxuICAgICAgICAgICAge2ZpbGVzLm1hcCgoZmlsZTogRmlsZSwgaW5kZXg6IG51bWJlcikgPT4gKFxuICAgICAgICAgICAgICA8Q2hpcFxuICAgICAgICAgICAgICAgIGtleT17YCR7ZmlsZS5uYW1lfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgbGFiZWw9e2Ake2ZpbGUubmFtZX0gKCR7KGZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCKWB9XG4gICAgICAgICAgICAgICAgb25EZWxldGU9e2Rpc2FibGVkID8gdW5kZWZpbmVkIDogKCkgPT4gaGFuZGxlUmVtb3ZlRmlsZShpbmRleCl9XG4gICAgICAgICAgICAgICAgc3g9e3sgbWI6IDEgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvU3RhY2s+XG4gICAgICAgICl9XG4gICAgICA8L0JveD5cbiAgICAgIHsoZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHQpICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0PntlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dH08L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIEZpbGUgVXBsb2FkIGNvbXBvbmVudC5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gTXVsdGlwbGUgZmlsZSBzdXBwb3J0XG4gKiAtIEZpbGUgc2l6ZSB2YWxpZGF0aW9uXG4gKiAtIEZpbGUgdHlwZSB2YWxpZGF0aW9uXG4gKiAtIFZpc3VhbCBmaWxlIGxpc3Qgd2l0aCByZW1vdmUgY2FwYWJpbGl0eVxuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiA8RmlsZVVwbG9hZEVsZW1lbnRcbiAqICAgbmFtZT1cImRvY3VtZW50c1wiXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIGxhYmVsPVwiVXBsb2FkIERvY3VtZW50c1wiXG4gKiAgIG1heEZpbGVzPXszfVxuICogICBtYXhTaXplTUI9ezV9XG4gKiAgIGFsbG93ZWRFeHRlbnNpb25zPXtbJy5wZGYnLCAnLmRvYycsICcuZG9jeCddfVxuICogLz5cbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgRmlsZVVwbG9hZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IEZpbGVVcGxvYWRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbkZpbGVVcGxvYWRFbGVtZW50LmRpc3BsYXlOYW1lID0gJ0ZpbGVVcGxvYWRFbGVtZW50JztcbiIsICJpbXBvcnQgdHlwZSB7IFRleHRGaWVsZFByb3BzLCBHcmlkUHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IE11aVRlbElucHV0IH0gZnJvbSAnbXVpLXRlbC1pbnB1dCc7XG5pbXBvcnQgdHlwZSB7IE11aVRlbElucHV0Q291bnRyeSB9IGZyb20gJ211aS10ZWwtaW5wdXQnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBGaWVsZFRvb2x0aXBTbG90IH0gZnJvbSAnQC9jb3JlL2NvbXBvbmVudHMvRmllbGRUb29sdGlwL0ZpZWxkVG9vbHRpcCc7XG5pbXBvcnQgeyBGaWVsZFRvb2x0aXAgfSBmcm9tICdAL2NvcmUvY29tcG9uZW50cy9GaWVsZFRvb2x0aXAvRmllbGRUb29sdGlwJztcblxuLy8gQ2FzdCByZXF1aXJlZDogTXVpVGVsSW5wdXRQcm9wcyBpcyBhIGRpc2NyaW1pbmF0ZWQgdW5pb24gdGhhdCBjb25mbGljdHMgd2l0aCBKU1ggaW5mZXJlbmNlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgVGVsSW5wdXQgPSBNdWlUZWxJbnB1dCBhcyBSZWFjdC5Db21wb25lbnRUeXBlPGFueT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVOdW1iZXJFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBjb3VudHJ5IElTTyAzMTY2LTEgYWxwaGEtMiBjb2RlIChlLmcuICdVUycsICdJTicpLiBAZGVmYXVsdFZhbHVlICdVUycgKi9cbiAgZGVmYXVsdENvdW50cnk/OiBzdHJpbmc7XG4gIHByZWZlcnJlZENvdW50cmllcz86IHN0cmluZ1tdO1xuICBvbmx5Q291bnRyaWVzPzogc3RyaW5nW107XG4gIGV4Y2x1ZGVDb3VudHJpZXM/OiBzdHJpbmdbXTtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJyB8ICd0eXBlJz47XG4gIHRvb2x0aXBTbG90PzogRmllbGRUb29sdGlwU2xvdDtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gUGhvbmVOdW1iZXJFbDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogUGhvbmVOdW1iZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBkZWZhdWx0Q291bnRyeSA9ICdVUycsXG4gICAgcHJlZmVycmVkQ291bnRyaWVzLFxuICAgIG9ubHlDb3VudHJpZXMsXG4gICAgZXhjbHVkZUNvdW50cmllcyxcbiAgICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgIHJlcXVpcmVkID0gZmFsc2UsXG4gICAgcGFyc2VFcnJvcixcbiAgICB0ZXh0RmllbGRQcm9wcyxcbiAgICB0b29sdGlwU2xvdCA9IHt9LFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoeyBuYW1lLCBjb250cm9sIH0pO1xuXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yXG4gICAgPyBwYXJzZUVycm9yXG4gICAgICA/IHBhcnNlRXJyb3IoZXJyb3IpXG4gICAgICA6IGVycm9yLm1lc3NhZ2VcbiAgICA6IHRleHRGaWVsZFByb3BzPy5oZWxwZXJUZXh0O1xuXG4gIHJldHVybiAoXG4gICAgPEZpZWxkVG9vbHRpcCB0b29sdGlwU2xvdD17dG9vbHRpcFNsb3R9PlxuICAgICAgPFRlbElucHV0XG4gICAgICAgIHZhbHVlPXsoZmllbGQudmFsdWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyAnJ31cbiAgICAgICAgb25DaGFuZ2U9eyh2YWw6IHN0cmluZykgPT4gZmllbGQub25DaGFuZ2UodmFsKX1cbiAgICAgICAgb25CbHVyPXsoKSA9PiBmaWVsZC5vbkJsdXIoKX1cbiAgICAgICAgaW5wdXRSZWY9e2ZpZWxkLnJlZiBhcyBSZWFjdC5SZWY8SFRNTElucHV0RWxlbWVudD59XG4gICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICBkZWZhdWx0Q291bnRyeT17ZGVmYXVsdENvdW50cnkgYXMgTXVpVGVsSW5wdXRDb3VudHJ5fVxuICAgICAgICBwcmVmZXJyZWRDb3VudHJpZXM9e1xuICAgICAgICAgIHByZWZlcnJlZENvdW50cmllcyBhcyBNdWlUZWxJbnB1dENvdW50cnlbXSB8IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIG9ubHlDb3VudHJpZXM9e29ubHlDb3VudHJpZXMgYXMgTXVpVGVsSW5wdXRDb3VudHJ5W10gfCB1bmRlZmluZWR9XG4gICAgICAgIGV4Y2x1ZGVkQ291bnRyaWVzPXtleGNsdWRlQ291bnRyaWVzIGFzIE11aVRlbElucHV0Q291bnRyeVtdIHwgdW5kZWZpbmVkfVxuICAgICAgICBmb3JjZUNhbGxpbmdDb2RlXG4gICAgICAgIGZvY3VzT25TZWxlY3RGbGFnXG4gICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgIGhlbHBlclRleHQ9e2Vycm9yTWVzc2FnZX1cbiAgICAgICAgc2l6ZT17dGV4dEZpZWxkUHJvcHM/LnNpemV9XG4gICAgICAvPlxuICAgIDwvRmllbGRUb29sdGlwPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFBob25lTnVtYmVyRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogUGhvbmVOdW1iZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuIiwgImltcG9ydCBEZWxldGVPdXRsaW5lIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvRGVsZXRlT3V0bGluZSc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJ0BtdWkvbWF0ZXJpYWwvQnV0dG9uJztcbmltcG9ydCB0eXBlIHsgR3JpZFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9HcmlkJztcbmltcG9ydCBHcmlkIGZyb20gJ0BtdWkvbWF0ZXJpYWwvR3JpZCc7XG5pbXBvcnQgSWNvbkJ1dHRvbiBmcm9tICdAbXVpL21hdGVyaWFsL0ljb25CdXR0b24nO1xuaW1wb3J0IFBhcGVyIGZyb20gJ0BtdWkvbWF0ZXJpYWwvUGFwZXInO1xuaW1wb3J0IFRhYmxlIGZyb20gJ0BtdWkvbWF0ZXJpYWwvVGFibGUnO1xuaW1wb3J0IFRhYmxlQm9keSBmcm9tICdAbXVpL21hdGVyaWFsL1RhYmxlQm9keSc7XG5pbXBvcnQgVGFibGVDZWxsIGZyb20gJ0BtdWkvbWF0ZXJpYWwvVGFibGVDZWxsJztcbmltcG9ydCBUYWJsZUNvbnRhaW5lciBmcm9tICdAbXVpL21hdGVyaWFsL1RhYmxlQ29udGFpbmVyJztcbmltcG9ydCBUYWJsZUhlYWQgZnJvbSAnQG11aS9tYXRlcmlhbC9UYWJsZUhlYWQnO1xuaW1wb3J0IFRhYmxlUm93IGZyb20gJ0BtdWkvbWF0ZXJpYWwvVGFibGVSb3cnO1xuaW1wb3J0IFR5cG9ncmFwaHkgZnJvbSAnQG11aS9tYXRlcmlhbC9UeXBvZ3JhcGh5JztcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSwgUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9yd2FyZFJlZiwgdXNlSW1wZXJhdGl2ZUhhbmRsZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRBcnJheVBhdGgsXG4gIEZpZWxkQXJyYXlXaXRoSWQsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFVzZUZpZWxkQXJyYXlBcHBlbmQsXG4gIFVzZUZpZWxkQXJyYXlJbnNlcnQsXG4gIFVzZUZpZWxkQXJyYXlNb3ZlLFxuICBVc2VGaWVsZEFycmF5UmVtb3ZlLFxuICBVc2VGaWVsZEFycmF5UmVwbGFjZSxcbiAgVXNlRmllbGRBcnJheVN3YXAsXG4gIFVzZUZpZWxkQXJyYXlVcGRhdGUsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VGaWVsZEFycmF5IH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgQ2hlY2tib3hFbGVtZW50IH0gZnJvbSAnLi4vQ2hlY2tib3hFbGVtZW50JztcbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSAnLi4vRGF0ZVBpY2tlckVsZW1lbnQnO1xuaW1wb3J0IHsgTnVtYmVyRmllbGRFbGVtZW50IH0gZnJvbSAnLi4vTnVtYmVyRmllbGRFbGVtZW50JztcbmltcG9ydCB7IFNlbGVjdEVsZW1lbnQgfSBmcm9tICcuLi9TZWxlY3RFbGVtZW50JztcbmltcG9ydCB7IFRleHRGaWVsZEVsZW1lbnQgfSBmcm9tICcuLi9UZXh0RmllbGRFbGVtZW50JztcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENvbHVtbiBUeXBlcyAoRGlzY3JpbWluYXRlZCBVbmlvbikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmludGVyZmFjZSBCYXNlQ29sdW1uIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICB3aWR0aD86IHN0cmluZztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVGV4dENvbHVtbiBleHRlbmRzIEJhc2VDb2x1bW4ge1xuICB0eXBlOiAndGV4dCc7XG59XG5cbmludGVyZmFjZSBOdW1iZXJDb2x1bW4gZXh0ZW5kcyBCYXNlQ29sdW1uIHtcbiAgdHlwZTogJ251bWJlcic7XG59XG5cbmludGVyZmFjZSBDaGVja2JveENvbHVtbiBleHRlbmRzIEJhc2VDb2x1bW4ge1xuICB0eXBlOiAnY2hlY2tib3gnO1xufVxuXG5pbnRlcmZhY2UgU2VsZWN0Q29sdW1uIGV4dGVuZHMgQmFzZUNvbHVtbiB7XG4gIHR5cGU6ICdzZWxlY3QnO1xuICBvcHRpb25zOiBBcnJheTx7IFZhbHVlOiBzdHJpbmcgfCBudW1iZXI7IExhYmVsOiBzdHJpbmcgfT47XG59XG5cbmludGVyZmFjZSBEYXRlQ29sdW1uIGV4dGVuZHMgQmFzZUNvbHVtbiB7XG4gIHR5cGU6ICdkYXRlJztcbiAgbWluRGF0ZT86IERhdGU7XG4gIG1heERhdGU/OiBEYXRlO1xufVxuXG50eXBlIEVkaXRhYmxlVGFibGVDb2x1bW4gPVxuICB8IFRleHRDb2x1bW5cbiAgfCBOdW1iZXJDb2x1bW5cbiAgfCBDaGVja2JveENvbHVtblxuICB8IFNlbGVjdENvbHVtblxuICB8IERhdGVDb2x1bW47XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBJbXBlcmF0aXZlIEhhbmRsZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuaW50ZXJmYWNlIEVkaXRhYmxlVGFibGVIYW5kbGU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRBcnJheVBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkQXJyYXlQYXRoPFRGaWVsZFZhbHVlcz4sXG4+IHtcbiAgYXBwZW5kOiBVc2VGaWVsZEFycmF5QXBwZW5kPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICByZW1vdmU6IFVzZUZpZWxkQXJyYXlSZW1vdmU7XG4gIHVwZGF0ZTogVXNlRmllbGRBcnJheVVwZGF0ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgcmVwbGFjZTogVXNlRmllbGRBcnJheVJlcGxhY2U8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIG1vdmU6IFVzZUZpZWxkQXJyYXlNb3ZlO1xuICBzd2FwOiBVc2VGaWVsZEFycmF5U3dhcDtcbiAgaW5zZXJ0OiBVc2VGaWVsZEFycmF5SW5zZXJ0PFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICBmaWVsZHM6IEFycmF5PEZpZWxkQXJyYXlXaXRoSWQ8VEZpZWxkVmFsdWVzLCBUTmFtZT4+O1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ29tcG9uZW50IFByb3BzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5pbnRlcmZhY2UgRWRpdGFibGVUYWJsZUVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZEFycmF5UGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRBcnJheVBhdGg8VEZpZWxkVmFsdWVzPixcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgY29sdW1uczogRWRpdGFibGVUYWJsZUNvbHVtbltdO1xuICBkZWZhdWx0Um93VmFsdWU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIGFkZEJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuICBlbXB0eU1lc3NhZ2U/OiBzdHJpbmc7XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgc2hvd1Jvd051bWJlcnM/OiBib29sZWFuO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGRlbGV0ZUljb24/OiBSZWFjdE5vZGU7XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDZWxsIFJlbmRlcmVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5mdW5jdGlvbiByZW5kZXJDZWxsKFxuICBjb2w6IEVkaXRhYmxlVGFibGVDb2x1bW4sXG4gIGZpZWxkTmFtZTogRmllbGRQYXRoPEZpZWxkVmFsdWVzPixcbiAgY29udHJvbDogQ29udHJvbDxGaWVsZFZhbHVlcz4gfCB1bmRlZmluZWQsXG4gIGNlbGxEaXNhYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBsYWJlbCA9IGNvbC5sYWJlbCArIChjb2wucmVxdWlyZWQgPyAnIConIDogJycpO1xuXG4gIHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Q2hlY2tib3hFbGVtZW50XG4gICAgICAgICAgY29udHJvbD17Y29udHJvbH1cbiAgICAgICAgICBuYW1lPXtmaWVsZE5hbWV9XG4gICAgICAgICAgbGFiZWw9XCJcIlxuICAgICAgICAgIGRpc2FibGVkPXtjZWxsRGlzYWJsZWR9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTZWxlY3RFbGVtZW50XG4gICAgICAgICAgY29udHJvbD17Y29udHJvbH1cbiAgICAgICAgICBuYW1lPXtmaWVsZE5hbWV9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIG9wdGlvbnM9e2NvbC5vcHRpb25zfVxuICAgICAgICAgIGRpc2FibGVkPXtjZWxsRGlzYWJsZWR9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgY2FzZSAnZGF0ZSc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAgICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICAgICAgICAgIG5hbWU9e2ZpZWxkTmFtZX1cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZ3JpZFByb3BzPXtmYWxzZX1cbiAgICAgICAgICBkYXRlUGlja2VyUHJvcHM9e3tcbiAgICAgICAgICAgIGRpc2FibGVkOiBjZWxsRGlzYWJsZWQsXG4gICAgICAgICAgICBtaW5EYXRlOiBjb2wubWluRGF0ZSA/IGRheWpzKGNvbC5taW5EYXRlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1heERhdGU6IGNvbC5tYXhEYXRlID8gZGF5anMoY29sLm1heERhdGUpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxOdW1iZXJGaWVsZEVsZW1lbnRcbiAgICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICAgICAgICAgIG5hbWU9e2ZpZWxkTmFtZX1cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgdGV4dEZpZWxkUHJvcHM9e3sgZGlzYWJsZWQ6IGNlbGxEaXNhYmxlZCB9fVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgIGNhc2UgJ3RleHQnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8VGV4dEZpZWxkRWxlbWVudFxuICAgICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gICAgICAgICAgbmFtZT17ZmllbGROYW1lfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICB0ZXh0RmllbGRQcm9wcz17eyBkaXNhYmxlZDogY2VsbERpc2FibGVkIH19XG4gICAgICAgIC8+XG4gICAgICApO1xuICB9XG59XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBNYWluIENvbXBvbmVudCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgRWRpdGFibGVUYWJsZUVsZW1lbnRJbm5lciA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZEFycmF5UGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRBcnJheVBhdGg8VEZpZWxkVmFsdWVzPixcbj4oXG4gIHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgY29sdW1ucyxcbiAgICBkZWZhdWx0Um93VmFsdWUsXG4gICAgdGl0bGUsXG4gICAgYWRkQnV0dG9uTGFiZWwgPSAnQWRkJyxcbiAgICBlbXB0eU1lc3NhZ2UgPSAnTm8gaXRlbXMgYWRkZWQuJyxcbiAgICBncmlkUHJvcHMgPSB7fSxcbiAgICBzaG93Um93TnVtYmVycyA9IHRydWUsXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgICBkZWxldGVJY29uLFxuICB9OiBFZGl0YWJsZVRhYmxlRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuICByZWY6IFJlZjxFZGl0YWJsZVRhYmxlSGFuZGxlPFRGaWVsZFZhbHVlcywgVE5hbWU+PlxuKSA9PiB7XG4gIGNvbnN0IHsgZmllbGRzLCBhcHBlbmQsIHJlbW92ZSwgdXBkYXRlLCByZXBsYWNlLCBtb3ZlLCBzd2FwLCBpbnNlcnQgfSA9XG4gICAgdXNlRmllbGRBcnJheSh7IGNvbnRyb2wsIG5hbWUgfSk7XG5cbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgYXBwZW5kLFxuICAgIHJlbW92ZSxcbiAgICB1cGRhdGUsXG4gICAgcmVwbGFjZSxcbiAgICBtb3ZlLFxuICAgIHN3YXAsXG4gICAgaW5zZXJ0LFxuICAgIGZpZWxkcyxcbiAgfSkpO1xuXG4gIGNvbnN0IGhhbmRsZUFkZCA9ICgpID0+IHtcbiAgICBjb25zdCByb3cgPVxuICAgICAgZGVmYXVsdFJvd1ZhbHVlID8/XG4gICAgICBPYmplY3QuZnJvbUVudHJpZXMoY29sdW1ucy5tYXAoY29sID0+IFtjb2wuZmllbGQsIG51bGxdKSk7XG5cbiAgICBhcHBlbmQocm93IGFzIFBhcmFtZXRlcnM8dHlwZW9mIGFwcGVuZD5bMF0pO1xuICB9O1xuXG4gIGNvbnN0IGNvbFNwYW4gPSBjb2x1bW5zLmxlbmd0aCArIChzaG93Um93TnVtYmVycyA/IDEgOiAwKSArIDE7XG5cbiAgLy8gQ2FzdCBjb250cm9sIHRvIGJhc2UgdHlwZSBmb3IgY2VsbCByZW5kZXJpbmcgKHNhZmU6IFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzKVxuICBjb25zdCBiYXNlQ29udHJvbCA9IGNvbnRyb2wgYXMgQ29udHJvbDxGaWVsZFZhbHVlcz4gfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8R3JpZCBjb250YWluZXIganVzdGlmeUNvbnRlbnQ9XCJzcGFjZS1iZXR3ZWVuXCIgYWxpZ25JdGVtcz1cImNlbnRlclwiIG1hcmdpbkJvdHRvbT17MX0+XG4gICAgICAgIHt0aXRsZSAmJiA8VHlwb2dyYXBoeSB2YXJpYW50PVwic3VidGl0bGUxXCI+e3RpdGxlfTwvVHlwb2dyYXBoeT59XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgb25DbGljaz17aGFuZGxlQWRkfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgPlxuICAgICAgICAgIHthZGRCdXR0b25MYWJlbH1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L0dyaWQ+XG4gICAgICA8VGFibGVDb250YWluZXIgY29tcG9uZW50PXtQYXBlcn0gdmFyaWFudD1cIm91dGxpbmVkXCI+XG4gICAgICAgIDxUYWJsZSBzaXplPVwic21hbGxcIiBzdGlja3lIZWFkZXI+XG4gICAgICAgICAgPFRhYmxlSGVhZD5cbiAgICAgICAgICAgIDxUYWJsZVJvdz5cbiAgICAgICAgICAgICAge3Nob3dSb3dOdW1iZXJzICYmIDxUYWJsZUNlbGw+IzwvVGFibGVDZWxsPn1cbiAgICAgICAgICAgICAge2NvbHVtbnMubWFwKGNvbCA9PiAoXG4gICAgICAgICAgICAgICAgPFRhYmxlQ2VsbCBrZXk9e2NvbC5maWVsZH0gd2lkdGg9e2NvbC53aWR0aH0+XG4gICAgICAgICAgICAgICAgICB7Y29sLmxhYmVsfVxuICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPFRhYmxlQ2VsbCAvPlxuICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICA8L1RhYmxlSGVhZD5cbiAgICAgICAgICA8VGFibGVCb2R5PlxuICAgICAgICAgICAge2ZpZWxkcy5tYXAoKGZpZWxkLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8VGFibGVSb3cga2V5PXtmaWVsZC5pZH0+XG4gICAgICAgICAgICAgICAge3Nob3dSb3dOdW1iZXJzICYmIDxUYWJsZUNlbGw+e2luZGV4ICsgMX08L1RhYmxlQ2VsbD59XG4gICAgICAgICAgICAgICAge2NvbHVtbnMubWFwKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBgJHtuYW1lfS4ke2luZGV4fS4ke2NvbC5maWVsZH1gIGFzIEZpZWxkUGF0aDxGaWVsZFZhbHVlcz47XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxEaXNhYmxlZCA9IGRpc2FibGVkIHx8IGNvbC5kaXNhYmxlZDtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlQ2VsbCBrZXk9e2NvbC5maWVsZH0gd2lkdGg9e2NvbC53aWR0aH0+XG4gICAgICAgICAgICAgICAgICAgICAge3JlbmRlckNlbGwoY29sLCBmaWVsZE5hbWUsIGJhc2VDb250cm9sLCBjZWxsRGlzYWJsZWQpfVxuICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPFRhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwiZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiByZW1vdmUoaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtkZWxldGVJY29uID8/IDxEZWxldGVPdXRsaW5lIC8+fVxuICAgICAgICAgICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICA8L1RhYmxlUm93PlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICB7ZmllbGRzLmxlbmd0aCA9PT0gMCAmJiAoXG4gICAgICAgICAgICAgIDxUYWJsZVJvdz5cbiAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGNvbFNwYW49e2NvbFNwYW59IGFsaWduPVwiY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8VHlwb2dyYXBoeSB2YXJpYW50PVwiYm9keTJcIiBjb2xvcj1cInRleHQuc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIHtlbXB0eU1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICA8L1R5cG9ncmFwaHk+XG4gICAgICAgICAgICAgICAgPC9UYWJsZUNlbGw+XG4gICAgICAgICAgICAgIDwvVGFibGVSb3c+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvVGFibGVCb2R5PlxuICAgICAgICA8L1RhYmxlPlxuICAgICAgPC9UYWJsZUNvbnRhaW5lcj5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5jb25zdCBFZGl0YWJsZVRhYmxlRWxlbWVudCA9IGZvcndhcmRSZWYoRWRpdGFibGVUYWJsZUVsZW1lbnRJbm5lcikgYXMgPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkQXJyYXlQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZEFycmF5UGF0aDxURmllbGRWYWx1ZXM+LFxuPihcbiAgcHJvcHM6IEVkaXRhYmxlVGFibGVFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4gJiB7XG4gICAgcmVmPzogUmVmPEVkaXRhYmxlVGFibGVIYW5kbGU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+O1xuICB9XG4pID0+IFJldHVyblR5cGU8dHlwZW9mIEVkaXRhYmxlVGFibGVFbGVtZW50SW5uZXI+O1xuXG5leHBvcnQgeyBFZGl0YWJsZVRhYmxlRWxlbWVudCB9O1xuXG5leHBvcnQgdHlwZSB7XG4gIEVkaXRhYmxlVGFibGVDb2x1bW4sXG4gIEVkaXRhYmxlVGFibGVFbGVtZW50UHJvcHMsXG4gIEVkaXRhYmxlVGFibGVIYW5kbGUsXG4gIFRleHRDb2x1bW4sXG4gIE51bWJlckNvbHVtbixcbiAgQ2hlY2tib3hDb2x1bW4sXG4gIFNlbGVjdENvbHVtbixcbiAgRGF0ZUNvbHVtbixcbiAgQmFzZUNvbHVtbixcbn07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIHVzZUZvcmtSZWYsIHVzZVRoZW1lIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgRmllbGRUb29sdGlwU2xvdCB9IGZyb20gJ0AvY29yZS9jb21wb25lbnRzL0ZpZWxkVG9vbHRpcC9GaWVsZFRvb2x0aXAnO1xuaW1wb3J0IHsgRmllbGRUb29sdGlwIH0gZnJvbSAnQC9jb3JlL2NvbXBvbmVudHMvRmllbGRUb29sdGlwL0ZpZWxkVG9vbHRpcCc7XG5pbXBvcnQgeyB1c2VFbmhhbmNlZFRyYW5zZm9ybSB9IGZyb20gJ0AvaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFR5cGUgfSBmcm9tICdAL2hvb2tzJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnQC90eXBlcyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBUZXh0RmllbGRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDdXN0b20gVGV4dEZpZWxkIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBkZWZhdWx0IE1VSSBUZXh0RmllbGRcbiAgICovXG4gIGNvbXBvbmVudD86IHR5cGVvZiBUZXh0RmllbGQ7XG4gIC8qKlxuICAgKiBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgZm9yIGlucHV0L291dHB1dFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZmllbGRUeXBlIGZvciBjb21tb24gcGF0dGVybnMgb3IgY3VzdG9tIHRyYW5zZm9ybXMgZm9yIGNvbXBsZXggY2FzZXNcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICAvKipcbiAgICogQnVpbHQtaW4gZmllbGQgdHlwZSBmb3IgYXV0b21hdGljIHRyYW5zZm9ybWF0aW9uXG4gICAqIEBleGFtcGxlICd0ZXh0JyB8ICdudW1iZXInIHwgJ2RhdGUnIHwgJ3RpbWUnIHwgJ3NlbGVjdCdcbiAgICovXG4gIGZpZWxkVHlwZT86IEZpZWxkVHlwZTtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWUgdG8gZGlzcGxheSB3aGVuIGZpZWxkIHZhbHVlIGlzIG51bGwvdW5kZWZpbmVkXG4gICAqIEBleGFtcGxlIFwiXCJcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IFRWYWx1ZTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkVudGVyIHlvdXIgZW1haWxcIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBvbkNoYW5nZSBoYW5kbGVyIGNhbGxlZCBhZnRlciB0cmFuc2Zvcm1hdGlvblxuICAgKi9cbiAgb25DaGFuZ2U/OiAoXG4gICAgZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PlxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGUgZGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyB0cmFuc2Zvcm1hdGlvbiBpc3N1ZXNcbiAgICogQGRlZmF1bHRWYWx1ZSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xuICAgKi9cbiAgZW5hYmxlV2FybmluZ3M/OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIHRvb2x0aXBTbG90PzogRmllbGRUb29sdGlwU2xvdDtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gTnVtYmVyRmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ocHJvcHM6IE51bWJlckZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIHRyYW5zZm9ybSxcbiAgICBmaWVsZFR5cGUgPSAndGV4dCcsIC8vIERlZmF1bHQgdG8gdGV4dCB0eXBlXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgZW5hYmxlV2FybmluZ3MgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICBtYXhMZW5ndGgsXG4gICAgdG9vbHRpcFNsb3QgPSB7fSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgdHlwZSA9ICdudW1iZXInLFxuICAgIHJlcXVpcmVkLFxuICAgIGhlbHBlclRleHQsXG4gICAgaW5wdXRSZWYsXG4gICAgb25JbnB1dCxcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgLi4ucmVzdFRleHRQcm9wc1xuICB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIC8vIFVzZSB0aGUgZW5oYW5jZWQgdHJhbnNmb3JtIGhvb2sgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KFxuICAgIHtcbiAgICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW5wdXQ6IHRyYW5zZm9ybS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdHJhbnNmb3JtLm91dHB1dCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZmllbGRUeXBlOiAhdHJhbnNmb3JtXG4gICAgICAgID8gdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IG1heExlbmd0aCAmJiBtYXhMZW5ndGggPiA1XG4gICAgICAgICAgICA/ICd0ZXh0J1xuICAgICAgICAgICAgOiAnbnVtYmVyJ1xuICAgICAgICAgIDogZmllbGRUeXBlXG4gICAgICAgIDogdW5kZWZpbmVkLCAvLyBBdXRvLWRldGVjdCBudW1iZXIgdHlwZVxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZW5hYmxlV2FybmluZ3MsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxGaWVsZFRvb2x0aXAgdG9vbHRpcFNsb3Q9e3Rvb2x0aXBTbG90fT5cbiAgICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgICAgey4uLnJlc3R9XG4gICAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICAgICAgICBpZiAoaW5wdXQgPT09ICcnKSB7XG4gICAgICAgICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICBvbklucHV0PXsoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIG1heExlbmd0aCAmJlxuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlLmxlbmd0aCA+IG1heExlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlLnNsaWNlKDAsIG1heExlbmd0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBvbklucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvbklucHV0KGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICAgIG9uV2hlZWw9e2UgPT4ge1xuICAgICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuYmx1cigpO1xuICAgICAgICB9fVxuICAgICAgICBvbktleURvd249e2UgPT4ge1xuICAgICAgICAgIGlmIChbJ2UnLCAnRScsICdBcnJvd0Rvd24nLCAnQXJyb3dVcCddLmluY2x1ZGVzKGUua2V5KSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgdHlwZT17dHlwZX1cbiAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgIGhlbHBlclRleHQ9e1xuICAgICAgICAgIGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogaGVscGVyVGV4dFxuICAgICAgICB9XG4gICAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgICAgc2xvdFByb3BzPXt7IGh0bWxJbnB1dDogeyBtYXhMZW5ndGggfSB9fVxuICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIHN4PXt7XG4gICAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQsXG4gICAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgICB9LFxuICAgICAgICB9fVxuICAgICAgLz5cbiAgICA8L0ZpZWxkVG9vbHRpcD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBUZXh0RmllbGQgY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24sXG4gKiBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLCBhbmQgYnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZ1xuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBzdXBwb3J0XG4gKiAtIEJ1aWx0LWluIGZpZWxkIHR5cGVzIGZvciBjb21tb24gcGF0dGVybnNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIE9wdGltaXplZCBudW1iZXIgaW5wdXQgaGFuZGxpbmdcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIHdpdGggbWVtb2l6ZWQgdHJhbnNmb3JtYXRpb25zXG4gKiAtIERldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmdcbiAqIC0gU3RhYmxlIHJlZmVyZW5jZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYnVpbHQtaW4gbnVtYmVyIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWdlXCJcbiAqICAgbGFiZWw9XCJBZ2VcIlxuICogICBmaWVsZFR5cGU9XCJudW1iZXJcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ0FnZSBpcyByZXF1aXJlZCcsIG1pbjogeyB2YWx1ZTogMCwgbWVzc2FnZTogJ0FnZSBtdXN0IGJlIHBvc2l0aXZlJyB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZW1haWxcIlxuICogICBsYWJlbD1cIkVtYWlsXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBlbWFpbCBhZGRyZXNzXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gKiAgICAgcGF0dGVybjogeyB2YWx1ZTogL1xcUytAXFxTK1xcLlxcUysvLCBtZXNzYWdlOiAnSW52YWxpZCBlbWFpbCcgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gdHJhbnNmb3JtYXRpb246XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwcmljZVwiXG4gKiAgIGxhYmVsPVwiUHJpY2VcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZSA/IGAkJHt2YWx1ZX1gIDogJycsXG4gKiAgICAgb3V0cHV0OiAoZXZlbnQpID0+IHBhcnNlRmxvYXQoZXZlbnQudGFyZ2V0LnZhbHVlLnJlcGxhY2UoJyQnLCAnJykpIHx8IG51bGxcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gZXJyb3IgcGFyc2luZzpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJuYW1lXCJcbiAqICAgbGFiZWw9XCJVc2VybmFtZVwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IChcbiAqICAgICA8c3BhbiBzdHlsZT17eyBjb2xvcjogJ3JlZCcgfX0+XG4gKiAgICAgICBcdTI2QTBcdUZFMEYge2Vycm9yLm1lc3NhZ2V9XG4gKiAgICAgPC9zcGFuPlxuICogICApfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgTnVtYmVyRmllbGRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IE51bWJlckZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICBHcmlkLFxuICBUZXh0RmllbGQsXG4gIHVzZVRoZW1lLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnQG11aS9tYXRlcmlhbC91dGlscyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBGcmFnbWVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZFBhdGgsXG4gIHR5cGUgRmllbGRWYWx1ZXMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNTZWxlY3RFbGVtZW50UHJvcHMsIE9wdGlvbk9iamVjdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgeyBGaWVsZFRvb2x0aXAgfSBmcm9tICdAL2NvcmUvY29tcG9uZW50cy9GaWVsZFRvb2x0aXAnO1xuaW1wb3J0IHR5cGUgeyBBc3luY1NlbGVjdFBheWxvYWQgfSBmcm9tICdAL3R5cGVzJztcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQXN5bmNTZWxlY3RFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oXG4gIHByb3BzOiBBc3luY1NlbGVjdEVsZW1lbnRQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBUT3B0aW9uXG4gID5cbikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjb250cm9sLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIC8vIGluaXRpYWxWYWx1ZSxcbiAgICAvLyBpc051bGxhYmxlLFxuICAgIGxhYmVsLFxuICAgIHF1ZXJ5Rm4sXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScgYXMgVFZhbHVlS2V5LFxuICAgIHRvb2x0aXBTbG90ID0ge30sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9uLCBzZXRTZWxlY3RlZE9wdGlvbl0gPSB1c2VTdGF0ZTxUT3B0aW9uIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8cmVhZG9ubHkgVE9wdGlvbltdPihbXSk7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAvLyBUcmFjayB3aGF0IHZhbHVlIHdlJ3ZlIGxvYWRlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBBUEkgY2FsbHNcbiAgY29uc3QgbG9hZGVkVmFsdWVSZWYgPSB1c2VSZWY8VE9wdGlvbltUVmFsdWVLZXldIHwgbnVsbCB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG5cbiAgY29uc3QgZmV0Y2hEYXRhID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoXG4gICAgICAgIChcbiAgICAgICAgICBwYXlsb2FkOiBBc3luY1NlbGVjdFBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB2b2lkXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Rm4ocGF5bG9hZCkudGhlbihjID0+IGNhbGxiYWNrKGMpKTtcbiAgICAgICAgfSxcbiAgICAgICAgNDAwXG4gICAgICApLFxuICAgIFtxdWVyeUZuXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvblt2YWx1ZUZpZWxkXSkgOiAnJztcbiAgICB9LFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEZpZWxkXVxuICApO1xuXG4gIC8vIEVmZmVjdDogSGFuZGxlIHNlYXJjaCBxdWVyeSBpbnB1dFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGZpZWxkLnZhbHVlO1xuXG4gICAgLy8gQ29uZGl0aW9uIDE6IEEgdmFsdWUgaXMgc2V0IGZyb20gdGhlIGZvcm0sIGFuZCB3ZSBoYXZlbid0IGxvYWRlZCBpdCB5ZXQuXG4gICAgaWYgKGN1cnJlbnRWYWx1ZSAmJiBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ICE9PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgIC8vIERvbid0IGZldGNoIGlmIHRoZSBzZWxlY3RlZCBvcHRpb24gaXMgYWxyZWFkeSBjb3JyZWN0XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgZ2V0T3B0aW9uVmFsdWUoc2VsZWN0ZWRPcHRpb24pID09PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ID0gY3VycmVudFZhbHVlO1xuXG4gICAgICBmZXRjaERhdGEoeyBRdWVyeTogbnVsbCwgU2VsZWN0ZWRWYWx1ZTogY3VycmVudFZhbHVlIH0sIHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZE9wdGlvbiA9IHJlc3VsdHM/LmZpbmQoXG4gICAgICAgICAgb3B0aW9uID0+IFN0cmluZyhnZXRPcHRpb25WYWx1ZShvcHRpb24pKSA9PT0gU3RyaW5nKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobWF0Y2hlZE9wdGlvbikge1xuICAgICAgICAgIHNldE9wdGlvbnMoW21hdGNoZWRPcHRpb25dKTtcbiAgICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbihtYXRjaGVkT3B0aW9uKTtcbiAgICAgICAgICBzZXRJbnB1dFZhbHVlKGdldE9wdGlvbkxhYmVsKG1hdGNoZWRPcHRpb24pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjsgLy8gRW5kIG9mIGVmZmVjdFxuICAgIH1cblxuICAgIC8vIENvbmRpdGlvbiAyOiBUaGUgdXNlciBpcyB0eXBpbmcgYSBzZWFyY2ggcXVlcnksIG9yIHRoZSBpbnB1dCBpcyBjbGVhcmVkLlxuICAgIC8vIFRoaXMgcnVucyBpZiB0aGUgaW5wdXQgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzZWxlY3RlZCBvcHRpb24ncyBsYWJlbC5cbiAgICBpZiAoaW5wdXRWYWx1ZSAhPT0gKHNlbGVjdGVkT3B0aW9uID8gZ2V0T3B0aW9uTGFiZWwoc2VsZWN0ZWRPcHRpb24pIDogJycpKSB7XG4gICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgZW1wdHksIGNsZWFyIG9wdGlvbnMgaW1tZWRpYXRlbHkgd2l0aG91dCBhbiBBUEkgY2FsbC5cbiAgICAgIGlmIChpbnB1dFZhbHVlID09PSAnJykge1xuICAgICAgICBzZXRPcHRpb25zKFtdKTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlcndpc2UsIGZldGNoIG5ldyBvcHRpb25zIGJhc2VkIG9uIHRoZSBpbnB1dC5cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICAgIGZldGNoRGF0YSh7IFF1ZXJ5OiBpbnB1dFZhbHVlLCBTZWxlY3RlZFZhbHVlOiBudWxsIH0sIHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgc2V0T3B0aW9ucyhyZXN1bHRzIHx8IFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47IC8vIEVuZCBvZiBlZmZlY3RcbiAgICB9XG5cbiAgICAvLyBDb25kaXRpb24gMzogVGhlIHZhbHVlIGhhcyBiZWVuIGNsZWFyZWQgZnJvbSB0aGUgZm9ybS5cbiAgICBpZiAoIWN1cnJlbnRWYWx1ZSAmJiBzZWxlY3RlZE9wdGlvbikge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obnVsbCk7XG4gICAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICAgIHNldE9wdGlvbnMoW10pO1xuICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIFtcbiAgICBmaWVsZC52YWx1ZSxcbiAgICBpbnB1dFZhbHVlLFxuICAgIGZldGNoRGF0YSxcbiAgICBnZXRPcHRpb25MYWJlbCxcbiAgICBnZXRPcHRpb25WYWx1ZSxcbiAgICBzZWxlY3RlZE9wdGlvbixcbiAgICBsYWJlbEZpZWxkLFxuICAgIHZhbHVlRmllbGQsXG4gIF0pO1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gZGlzYWJsZWQgPz8gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZF0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChfOiBSZWFjdC5TeW50aGV0aWNFdmVudCwgbmV3U2VsZWN0ZWRPcHRpb246IFRPcHRpb24gfCBudWxsKSA9PiB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihuZXdTZWxlY3RlZE9wdGlvbik7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld1NlbGVjdGVkT3B0aW9uXG4gICAgICAgID8gZ2V0T3B0aW9uVmFsdWUobmV3U2VsZWN0ZWRPcHRpb24pXG4gICAgICAgIDogbnVsbDtcblxuICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IG5ld1ZhbHVlIGFzXG4gICAgICAgIHwgVE9wdGlvbltUVmFsdWVLZXldXG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDsgLy8gVHJhY2sgY2hhbmdlXG5cbiAgICAgIC8vIFN5bmMgaW5wdXQgdmFsdWUgd2l0aCB0aGUgc2VsZWN0aW9uXG4gICAgICBpZiAobmV3U2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZShnZXRPcHRpb25MYWJlbChuZXdTZWxlY3RlZE9wdGlvbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgICAgIHNldE9wdGlvbnMoW10pOyAvLyBDbGVhciBvcHRpb25zIHdoZW4gc2VsZWN0aW9uIGlzIGNsZWFyZWRcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWVsZCwgZ2V0T3B0aW9uVmFsdWUsIGdldE9wdGlvbkxhYmVsXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKF86IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdJbnB1dFZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHNldElucHV0VmFsdWUobmV3SW5wdXRWYWx1ZSk7XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUJsdXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gV2hlbiBmb2N1cyBpcyBsb3N0LCBzeW5jIHRoZSBpbnB1dCB2YWx1ZSBiYWNrIHRvIHRoZSBzZWxlY3RlZCBvcHRpb24ncyBsYWJlbFxuICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgc2V0SW5wdXRWYWx1ZShnZXRPcHRpb25MYWJlbChzZWxlY3RlZE9wdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBub3RoaW5nIGlzIHNlbGVjdGVkLCBjbGVhciB0aGUgaW5wdXRcbiAgICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIH1cbiAgfSwgW3NlbGVjdGVkT3B0aW9uLCBnZXRPcHRpb25MYWJlbF0pO1xuXG4gIGNvbnN0IGhhbmRsZU9wZW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0T3Blbih0cnVlKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldE9wZW4oZmFsc2UpO1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RmllbGRUb29sdGlwIHRvb2x0aXBTbG90PXt0b29sdGlwU2xvdH0+XG4gICAgICA8QXV0b2NvbXBsZXRlXG4gICAgICAgIHsuLi5yZXN0fVxuICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgb3Blbj17b3Blbn1cbiAgICAgICAgb25PcGVuPXtoYW5kbGVPcGVufVxuICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZX1cbiAgICAgICAgb25CbHVyPXtoYW5kbGVCbHVyfVxuICAgICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uVmFsdWV9XG4gICAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT5cbiAgICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICBhdXRvQ29tcGxldGVcbiAgICAgICAgZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICAgIGluY2x1ZGVJbnB1dEluTGlzdFxuICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICB2YWx1ZT17c2VsZWN0ZWRPcHRpb259XG4gICAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgICBmaWx0ZXJPcHRpb25zPXt4ID0+IHh9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uSW5wdXRDaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICBzeD17e1xuICAgICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgJyYgLk11aUZpbGxlZElucHV0LXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfX1cbiAgICAgICAgbm9PcHRpb25zVGV4dD1cIlR5cGUgU29tZXRoaW5nLi4uXCJcbiAgICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICByZW5kZXJPcHRpb249eyhyZW5kZXJQcm9wcywgb3B0aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBrZXksIC4uLm9wdGlvblByb3BzIH0gPSByZW5kZXJQcm9wcztcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8bGkga2V5PXtrZXl9IHsuLi5vcHRpb25Qcm9wc30+XG4gICAgICAgICAgICAgIHtvcHRpb25bbGFiZWxGaWVsZF19XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICk7XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvRmllbGRUb29sdGlwPlxuICApO1xufTtcblxuY29uc3QgQXN5bmNTZWxlY3RFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVE9wdGlvblxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj5cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5Bc3luY1NlbGVjdEVsZW1lbnQuZGlzcGxheU5hbWUgPSAnQXN5bmNTZWxlY3RFbGVtZW50JztcblxuZXhwb3J0IHsgQXN5bmNTZWxlY3RFbGVtZW50IH07XG4iLCAiaW1wb3J0IHR5cGUgeyBCb3hQcm9wcywgRm9ybUhlbHBlclRleHRQcm9wcywgR3JpZFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBCb3gsIEdyaWQsIGlucHV0QmFzZUNsYXNzZXMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIE11aU90cElucHV0LFxuICB0eXBlIE11aU90cElucHV0UHJvcHMsXG59IGZyb20gJ211aS1vbmUtdGltZS1wYXNzd29yZC1pbnB1dCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IEhlbHBlclRleHQgfSBmcm9tICcuL0hlbHBlclRleHQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9UUElucHV0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG5cbiAgbWF4U2l6ZT86IG51bWJlcjtcblxuICBwbGFjZWhvbGRlcj86IHN0cmluZztcblxuICBoZWxwZXJUZXh0PzogUmVhY3QuUmVhY3ROb2RlO1xuXG4gIHNsb3RQcm9wcz86IHtcbiAgICB3cmFwcGVyPzogQm94UHJvcHM7XG4gICAgaGVscGVyVGV4dD86IEZvcm1IZWxwZXJUZXh0UHJvcHM7XG4gICAgdGV4dGZpZWxkPzogTXVpT3RwSW5wdXRQcm9wc1snVGV4dEZpZWxkc1Byb3BzJ107XG4gIH07XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gT1RQSW5wdXRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBPVFBJbnB1dEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgLy8gcGFyc2VFcnJvcixcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgc2xvdFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgbWF4U2l6ZSA9IDU2LFxuICAgIHBsYWNlaG9sZGVyID0gJy0nLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIC8vIGNvbnN0IHtcbiAgLy8gICBmaWVsZCxcbiAgLy8gICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIC8vIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgLy8gICBuYW1lLFxuICAvLyAgIGNvbnRyb2wsXG4gIC8vIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPENvbnRyb2xsZXJcbiAgICAgIG5hbWU9e25hbWV9XG4gICAgICBjb250cm9sPXtjb250cm9sfVxuICAgICAgcmVuZGVyPXsoeyBmaWVsZCwgZmllbGRTdGF0ZTogeyBlcnJvciB9IH0pID0+IChcbiAgICAgICAgPEJveFxuICAgICAgICAgIHsuLi5zbG90UHJvcHM/LndyYXBwZXJ9XG4gICAgICAgICAgc3g9e1tcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIFtgJiAuJHtpbnB1dEJhc2VDbGFzc2VzLmlucHV0fWBdOiB7XG4gICAgICAgICAgICAgICAgcDogMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBhc3BlY3RSYXRpbzogJzEvMScsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IG1heFNpemUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoc2xvdFByb3BzPy53cmFwcGVyPy5zeClcbiAgICAgICAgICAgICAgPyAoc2xvdFByb3BzPy53cmFwcGVyPy5zeCA/PyBbXSlcbiAgICAgICAgICAgICAgOiBbc2xvdFByb3BzPy53cmFwcGVyPy5zeF0pLFxuICAgICAgICAgIF19XG4gICAgICAgID5cbiAgICAgICAgICA8TXVpT3RwSW5wdXRcbiAgICAgICAgICAgIHsuLi5maWVsZH1cbiAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgZ2FwPXsxLjV9XG4gICAgICAgICAgICBsZW5ndGg9ezR9XG4gICAgICAgICAgICBUZXh0RmllbGRzUHJvcHM9e3tcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgIGVycm9yOiAhIWVycm9yLFxuICAgICAgICAgICAgICAuLi5zbG90UHJvcHM/LnRleHRmaWVsZCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPEhlbHBlclRleHRcbiAgICAgICAgICAgIHsuLi5zbG90UHJvcHM/LmhlbHBlclRleHR9XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U9e2Vycm9yPy5tZXNzYWdlfVxuICAgICAgICAgICAgaGVscGVyVGV4dD17aGVscGVyVGV4dH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0JveD5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBPVFBJbnB1dEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IE9UUElucHV0RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgRm9ybUhlbHBlclRleHRQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUhlbHBlclRleHQnO1xuaW1wb3J0IEZvcm1IZWxwZXJUZXh0IGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUhlbHBlclRleHQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEhlbHBlclRleHRQcm9wcyA9IEZvcm1IZWxwZXJUZXh0UHJvcHMgJiB7XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgZGlzYWJsZUd1dHRlcnM/OiBib29sZWFuO1xuICBoZWxwZXJUZXh0PzogUmVhY3QuUmVhY3ROb2RlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIEhlbHBlclRleHQoe1xuICBzeCxcbiAgaGVscGVyVGV4dCxcbiAgZXJyb3JNZXNzYWdlLFxuICBkaXNhYmxlR3V0dGVycyxcbiAgLi4ub3RoZXJcbn06IEhlbHBlclRleHRQcm9wcykge1xuICBpZiAoZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEZvcm1IZWxwZXJUZXh0XG4gICAgICAgIGVycm9yPXshIWVycm9yTWVzc2FnZX1cbiAgICAgICAgc3g9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBteDogZGlzYWJsZUd1dHRlcnMgPyAwIDogMS43NSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KHN4KSA/IHN4IDogW3N4XSksXG4gICAgICAgIF19XG4gICAgICAgIHsuLi5vdGhlcn1cbiAgICAgID5cbiAgICAgICAge2Vycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0fVxuICAgICAgPC9Gb3JtSGVscGVyVGV4dD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCAiaW1wb3J0IHsgQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQgfSBmcm9tICcuLi9Bc3luY011bHRpU2VsZWN0L0FzeW5jTXVsdGlTZWxlY3QnO1xuaW1wb3J0IHsgQXN5bmNTZWxlY3RFbGVtZW50IH0gZnJvbSAnLi4vQXN5bmNTZWxlY3QnO1xuaW1wb3J0IHsgQ2hlY2tib3hFbGVtZW50IH0gZnJvbSAnLi4vQ2hlY2tib3hFbGVtZW50JztcbmltcG9ydCB7IENoZWNrYm94R3JvdXBFbGVtZW50IH0gZnJvbSAnLi4vQ2hlY2tib3hHcm91cCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gJy4uL0RhdGVQaWNrZXJFbGVtZW50JztcbmltcG9ydCB7IEVkaXRhYmxlVGFibGVFbGVtZW50IH0gZnJvbSAnLi4vRWRpdGFibGVUYWJsZUVsZW1lbnQnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZEVsZW1lbnQgfSBmcm9tICcuLi9GaWxlVXBsb2FkRWxlbWVudCc7XG5pbXBvcnQgeyBOdW1iZXJGaWVsZEVsZW1lbnQgfSBmcm9tICcuLi9OdW1iZXJGaWVsZEVsZW1lbnQnO1xuaW1wb3J0IHsgT1RQSW5wdXRFbGVtZW50IH0gZnJvbSAnLi4vT1RQSW5wdXRFbGVtZW50L09UUElucHV0RWxlbWVudCc7XG5pbXBvcnQgeyBQYXNzd29yZEVsZW1lbnQgfSBmcm9tICcuLi9QYXNzd29yZEVsZW1lbnQnO1xuaW1wb3J0IHsgUGhvbmVOdW1iZXJFbGVtZW50IH0gZnJvbSAnLi4vUGhvbmVOdW1iZXJFbGVtZW50JztcbmltcG9ydCB7IFJhZGlvQnV0dG9uR3JvdXAgfSBmcm9tICcuLi9SYWRpb0J1dHRvbkdyb3VwJztcbmltcG9ydCB7IFNlbGVjdENhc2NhZGVFbGVtZW50IH0gZnJvbSAnLi4vU2VsZWN0Q2FzY2FkZUVsZW1lbnQnO1xuaW1wb3J0IHsgU2VsZWN0RWxlbWVudCB9IGZyb20gJy4uL1NlbGVjdEVsZW1lbnQnO1xuaW1wb3J0IHsgU2VsZWN0TXVsdGlFbGVtZW50IH0gZnJvbSAnLi4vU2VsZWN0TXVsdGlFbGVtZW50JztcbmltcG9ydCB7IFNsaWRlckVsZW1lbnQgfSBmcm9tICcuLi9TbGlkZXJFbGVtZW50JztcbmltcG9ydCB7IFRleHRGaWVsZEVsZW1lbnQgfSBmcm9tICcuLi9UZXh0RmllbGRFbGVtZW50JztcbmltcG9ydCB7IFRpbWVQaWNrZXJFbGVtZW50IH0gZnJvbSAnLi4vVGltZVBpY2tlckVsZW1lbnQnO1xuXG5jb25zdCBGaWVsZCA9IHtcbiAgVGV4dDogVGV4dEZpZWxkRWxlbWVudCxcbiAgTnVtYmVyOiBOdW1iZXJGaWVsZEVsZW1lbnQsXG4gIENoZWNrYm94OiBDaGVja2JveEVsZW1lbnQsXG4gIERhdGU6IERhdGVQaWNrZXJFbGVtZW50LFxuICBSYWRpb0dyb3VwOiBSYWRpb0J1dHRvbkdyb3VwLFxuICBQYXNzd29yZDogUGFzc3dvcmRFbGVtZW50LFxuICBQaG9uZTogUGhvbmVOdW1iZXJFbGVtZW50LFxuICBUaW1lOiBUaW1lUGlja2VyRWxlbWVudCxcbiAgU2VsZWN0OiBTZWxlY3RFbGVtZW50LFxuICBTZWxlY3RNdWx0aTogU2VsZWN0TXVsdGlFbGVtZW50LFxuICBTZWxlY3RDYXNjYWRlOiBTZWxlY3RDYXNjYWRlRWxlbWVudCxcbiAgQXN5bmNTZWxlY3Q6IEFzeW5jU2VsZWN0RWxlbWVudCxcbiAgQXN5bmNNdWx0aVNlbGVjdDogQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQsXG4gIENoZWNrYm94R3JvdXA6IENoZWNrYm94R3JvdXBFbGVtZW50LFxuICBPVFBJbnB1dDogT1RQSW5wdXRFbGVtZW50LFxuICBTbGlkZXI6IFNsaWRlckVsZW1lbnQsXG4gIEZpbGVVcGxvYWQ6IEZpbGVVcGxvYWRFbGVtZW50LFxuICBFZGl0YWJsZVRhYmxlOiBFZGl0YWJsZVRhYmxlRWxlbWVudCxcbn07XG5cbmV4cG9ydCB7IEZpZWxkIH07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7QUE0Rk8sU0FBUyxjQUFjLE9BQXFDO0FBQ2pFLFNBQ0UsT0FBTyxVQUFVLFlBQ2pCLFVBQVUsUUFDVixXQUFXLFNBQ1gsV0FBVyxTQUNYLE9BQVEsTUFBcUIsVUFBVSxhQUN0QyxPQUFRLE1BQXFCLFVBQVUsWUFDdEMsT0FBUSxNQUFxQixVQUFVLFlBQ3ZDLE9BQVEsTUFBcUIsVUFBVTtBQUU3QztBQVlPLFNBQVMsaUJBQ2QsU0FDQSxhQUFhLFNBQ2IsYUFBYSxTQUNDO0FBQ2QsU0FBTyxRQUFRLElBQUksYUFBVztBQUFBLElBQzVCLE9BQU8sT0FBTyxPQUFPLFVBQVUsS0FBSyxFQUFFO0FBQUEsSUFDdEMsT0FBTyxPQUFPLFVBQVU7QUFBQSxJQUN4QixVQUFVLFFBQVEsT0FBTyxRQUFRO0FBQUEsRUFDbkMsRUFBRTtBQUNKOzs7QUM3SEE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxXQUFXO0FBQ2xCLE9BQU8sV0FBVztBQUNsQjtBQUFBLEVBQ0U7QUFB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Z0JBQ1IsaUJBQWlCO0FBQUEsa0JBQ2Y7QUFBQSxrQkFDQSxPQUFPLENBQUMsQ0FBQztBQUFBLGtCQUNULEdBQUcsV0FBVztBQUFBLGdCQUNoQjtBQUFBLGdCQUNDLEdBQUc7QUFBQTtBQUFBLFlBQ047QUFBQSxZQUVBLGdCQUFBQTtBQUFBLGNBQUM7QUFBQTtBQUFBLGdCQUNFLEdBQUcsV0FBVztBQUFBLGdCQUNmLGNBQWMsT0FBTztBQUFBLGdCQUNyQjtBQUFBO0FBQUEsWUFDRjtBQUFBO0FBQUE7QUFBQSxNQUNGO0FBQUE7QUFBQSxFQUVKO0FBRUo7QUFFTyxJQUFNSSxtQkFBa0IsQ0FHN0I7QUFBQSxFQUNBLFlBQVksQ0FBQztBQUFBLEVBQ2IsR0FBRztBQUNMLE1BQStEO0FBQzdELFNBQ0UsZ0JBQUFKLE1BQUNLLFFBQUEsRUFBSyxNQUFNLElBQUssR0FBRyxXQUNsQiwwQkFBQUwsTUFBQ0UsYUFBQSxFQUFXLEdBQUcsT0FBTyxHQUN4QjtBQUVKOzs7QUVsSEEsSUFBTSxRQUFRO0FBQUEsRUFDWixNQUFNSTtBQUFBLEVBQ04sUUFBUUM7QUFBQSxFQUNSLFVBQVVDO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixZQUFZQztBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsT0FBTztBQUFBLEVBQ1AsTUFBTUM7QUFBQSxFQUNOLFFBQVFDO0FBQUEsRUFDUixhQUFhQztBQUFBLEVBQ2IsZUFBZUM7QUFBQSxFQUNmLGFBQWFDO0FBQUEsRUFDYixrQkFBa0JDO0FBQUEsRUFDbEIsZUFBZTtBQUFBLEVBQ2YsVUFBVUM7QUFBQSxFQUNWLFFBQVE7QUFBQSxFQUNSLFlBQVk7QUFBQSxFQUNaLGVBQWU7QUFDakI7IiwKICAibmFtZXMiOiBbImpzeCIsICJqc3hzIiwgInByb3BzIiwgIkFzeW5jU2VsZWN0TXVsdGlFbGVtZW50IiwgIkdyaWQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAidXNlQ29udHJvbGxlciIsICJ2YWx1ZSIsICJDaGVja2JveEVsZW1lbnQiLCAiR3JpZCIsICJDaGVja2JveCIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1Hcm91cCIsICJGb3JtSGVscGVyVGV4dCIsICJHcmlkIiwgInVzZUNhbGxiYWNrIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIkdyaWQiLCAiZm9yd2FyZFJlZiIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VNZW1vIiwgInVzZVRoZW1lIiwgInVzZU1lbW8iLCAianN4IiwgInVzZUNvbnRyb2xsZXIiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJqc3giLCAiZm9yd2FyZFJlZiIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VGb3JrUmVmIiwgIkdyaWQiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgInBhc3N3b3JkIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlRm9ya1JlZiIsICJUZXh0RmllbGQiLCAiR3JpZCIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkZvcm1MYWJlbCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUxhYmVsIiwgIkZvcm1Db250cm9sTGFiZWwiLCAiRm9ybUhlbHBlclRleHQiLCAiUmFkaW9CdXR0b25Hcm91cCIsICJHcmlkIiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgIkF1dG9jb21wbGV0ZSIsICJ1c2VUaGVtZSIsICJ1c2VSZWYiLCAidXNlRWZmZWN0IiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgInVzZVRoZW1lIiwgInVzZU1lbW8iLCAidXNlQ2FsbGJhY2siLCAidXNlQ29udHJvbGxlciIsICJ1c2VSZWYiLCAidXNlRWZmZWN0IiwgIkF1dG9jb21wbGV0ZSIsICJUZXh0RmllbGQiLCAiU2VsZWN0Q2FzY2FkZUVsZW1lbnQiLCAiR3JpZCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlVGhlbWUiLCAidXNlTWVtbyIsICJ1c2VFZmZlY3QiLCAidXNlQ2FsbGJhY2siLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgInVzZVRoZW1lIiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAiQXV0b2NvbXBsZXRlIiwgIlRleHRGaWVsZCIsICJTZWxlY3RFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJDaGVja2JveCIsICJUZXh0RmllbGQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAidXNlVGhlbWUiLCAiRnJhZ21lbnQiLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAidXNlVGhlbWUiLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgInVzZUVmZmVjdCIsICJBdXRvY29tcGxldGUiLCAiQ2hlY2tib3giLCAiVGV4dEZpZWxkIiwgIkZyYWdtZW50IiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJ1c2VUaGVtZSIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiVGV4dEZpZWxkIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlVGhlbWUiLCAidXNlRm9ya1JlZiIsICJUZXh0RmllbGRFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJ1c2VGb3JrUmVmIiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJ1c2VGb3JrUmVmIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIkdyaWQiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUhlbHBlclRleHQiLCAiRm9ybUxhYmVsIiwgIkdyaWQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQm94IiwgIkZvcm1Db250cm9sIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkZvcm1MYWJlbCIsICJHcmlkIiwgIlN0YWNrIiwgInVzZUNhbGxiYWNrIiwgInVzZVJlZiIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJ1c2VDb250cm9sbGVyIiwgIkdyaWQiLCAiQnV0dG9uIiwgIkdyaWQiLCAiSWNvbkJ1dHRvbiIsICJUeXBvZ3JhcGh5IiwgImRheWpzIiwgImZvcndhcmRSZWYiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJ1c2VUaGVtZSIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiVGV4dEZpZWxkIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlVGhlbWUiLCAidXNlRm9ya1JlZiIsICJOdW1iZXJGaWVsZEVsZW1lbnQiLCAiR3JpZCIsICJqc3giLCAianN4cyIsICJDaGVja2JveEVsZW1lbnQiLCAiU2VsZWN0RWxlbWVudCIsICJkYXlqcyIsICJOdW1iZXJGaWVsZEVsZW1lbnQiLCAiVGV4dEZpZWxkRWxlbWVudCIsICJHcmlkIiwgIlR5cG9ncmFwaHkiLCAiQnV0dG9uIiwgIkljb25CdXR0b24iLCAiZm9yd2FyZFJlZiIsICJBdXRvY29tcGxldGUiLCAiQ2lyY3VsYXJQcm9ncmVzcyIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VUaGVtZSIsICJkZWJvdW5jZSIsICJGcmFnbWVudCIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAidXNlTWVtbyIsICJ1c2VSZWYiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAidXNlQ29udHJvbGxlciIsICJ1c2VUaGVtZSIsICJ1c2VTdGF0ZSIsICJ1c2VSZWYiLCAidXNlTWVtbyIsICJkZWJvdW5jZSIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAiQXV0b2NvbXBsZXRlIiwgIlRleHRGaWVsZCIsICJGcmFnbWVudCIsICJDaXJjdWxhclByb2dyZXNzIiwgIkFzeW5jU2VsZWN0RWxlbWVudCIsICJHcmlkIiwgIkJveCIsICJHcmlkIiwgIkZvcm1IZWxwZXJUZXh0IiwgImpzeCIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQm94IiwgIk9UUElucHV0RWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZEVsZW1lbnQiLCAiTnVtYmVyRmllbGRFbGVtZW50IiwgIkNoZWNrYm94RWxlbWVudCIsICJSYWRpb0J1dHRvbkdyb3VwIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIlNlbGVjdEVsZW1lbnQiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIlNlbGVjdENhc2NhZGVFbGVtZW50IiwgIkFzeW5jU2VsZWN0RWxlbWVudCIsICJBc3luY1NlbGVjdE11bHRpRWxlbWVudCIsICJPVFBJbnB1dEVsZW1lbnQiXQp9Cg==