@rjsf/core 4.2.2 → 4.2.3

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 (130) hide show
  1. package/dist/cjs/components/AddButton.js +39 -0
  2. package/dist/cjs/components/ErrorList.js +41 -0
  3. package/dist/cjs/components/Form.js +588 -0
  4. package/dist/cjs/components/IconButton.js +37 -0
  5. package/dist/cjs/components/fields/ArrayField.js +977 -0
  6. package/dist/cjs/components/fields/BooleanField.js +107 -0
  7. package/dist/cjs/components/fields/DescriptionField.js +50 -0
  8. package/dist/cjs/components/fields/MultiSchemaField.js +275 -0
  9. package/dist/cjs/components/fields/NullField.js +66 -0
  10. package/dist/cjs/components/fields/NumberField.js +156 -0
  11. package/dist/cjs/components/fields/ObjectField.js +366 -0
  12. package/dist/cjs/components/fields/SchemaField.js +546 -0
  13. package/dist/cjs/components/fields/StringField.js +98 -0
  14. package/dist/cjs/components/fields/TitleField.js +42 -0
  15. package/dist/cjs/components/fields/UnsupportedField.js +46 -0
  16. package/dist/cjs/components/fields/index.js +47 -0
  17. package/dist/cjs/components/widgets/AltDateTimeWidget.js +48 -0
  18. package/dist/cjs/components/widgets/AltDateWidget.js +301 -0
  19. package/dist/cjs/components/widgets/BaseInput.js +151 -0
  20. package/dist/cjs/components/widgets/CheckboxWidget.js +85 -0
  21. package/dist/cjs/components/widgets/CheckboxesWidget.js +121 -0
  22. package/dist/cjs/components/widgets/ColorWidget.js +45 -0
  23. package/dist/cjs/components/widgets/DateTimeWidget.js +43 -0
  24. package/dist/cjs/components/widgets/DateWidget.js +39 -0
  25. package/dist/cjs/components/widgets/EmailWidget.js +34 -0
  26. package/dist/cjs/components/widgets/FileWidget.js +215 -0
  27. package/dist/cjs/components/widgets/HiddenWidget.js +36 -0
  28. package/dist/cjs/components/widgets/PasswordWidget.js +34 -0
  29. package/dist/cjs/components/widgets/RadioWidget.js +107 -0
  30. package/dist/cjs/components/widgets/RangeWidget.js +46 -0
  31. package/dist/cjs/components/widgets/SelectWidget.js +151 -0
  32. package/dist/cjs/components/widgets/SubmitButton.js +35 -0
  33. package/dist/cjs/components/widgets/TextWidget.js +31 -0
  34. package/dist/cjs/components/widgets/TextareaWidget.js +81 -0
  35. package/dist/cjs/components/widgets/URLWidget.js +34 -0
  36. package/dist/cjs/components/widgets/UpDownWidget.js +36 -0
  37. package/dist/cjs/components/widgets/index.js +73 -0
  38. package/dist/cjs/defaultRegistry.js +23 -0
  39. package/dist/cjs/index.js +37 -0
  40. package/dist/cjs/types.js +47 -0
  41. package/dist/cjs/utils.js +1407 -0
  42. package/dist/cjs/validate.js +354 -0
  43. package/dist/cjs/withTheme.js +53 -0
  44. package/dist/es/components/AddButton.js +28 -0
  45. package/dist/es/components/ErrorList.js +31 -0
  46. package/dist/es/components/Form.js +572 -0
  47. package/dist/es/components/IconButton.js +27 -0
  48. package/dist/es/components/fields/ArrayField.js +959 -0
  49. package/dist/es/components/fields/BooleanField.js +93 -0
  50. package/dist/es/components/fields/DescriptionField.js +39 -0
  51. package/dist/es/components/fields/MultiSchemaField.js +261 -0
  52. package/dist/es/components/fields/NullField.js +55 -0
  53. package/dist/es/components/fields/NumberField.js +141 -0
  54. package/dist/es/components/fields/ObjectField.js +351 -0
  55. package/dist/es/components/fields/SchemaField.js +528 -0
  56. package/dist/es/components/fields/StringField.js +84 -0
  57. package/dist/es/components/fields/TitleField.js +30 -0
  58. package/dist/es/components/fields/UnsupportedField.js +35 -0
  59. package/dist/es/components/fields/index.js +26 -0
  60. package/dist/es/components/widgets/AltDateTimeWidget.js +36 -0
  61. package/dist/es/components/widgets/AltDateWidget.js +287 -0
  62. package/dist/es/components/widgets/BaseInput.js +140 -0
  63. package/dist/es/components/widgets/CheckboxWidget.js +73 -0
  64. package/dist/es/components/widgets/CheckboxesWidget.js +108 -0
  65. package/dist/es/components/widgets/ColorWidget.js +34 -0
  66. package/dist/es/components/widgets/DateTimeWidget.js +31 -0
  67. package/dist/es/components/widgets/DateWidget.js +28 -0
  68. package/dist/es/components/widgets/EmailWidget.js +23 -0
  69. package/dist/es/components/widgets/FileWidget.js +201 -0
  70. package/dist/es/components/widgets/HiddenWidget.js +25 -0
  71. package/dist/es/components/widgets/PasswordWidget.js +23 -0
  72. package/dist/es/components/widgets/RadioWidget.js +94 -0
  73. package/dist/es/components/widgets/RangeWidget.js +34 -0
  74. package/dist/es/components/widgets/SelectWidget.js +138 -0
  75. package/dist/es/components/widgets/SubmitButton.js +24 -0
  76. package/dist/es/components/widgets/TextWidget.js +20 -0
  77. package/dist/es/components/widgets/TextareaWidget.js +70 -0
  78. package/dist/es/components/widgets/URLWidget.js +23 -0
  79. package/dist/es/components/widgets/UpDownWidget.js +24 -0
  80. package/dist/es/components/widgets/index.js +43 -0
  81. package/dist/es/defaultRegistry.js +12 -0
  82. package/dist/es/index.js +16 -0
  83. package/dist/es/types.js +34 -0
  84. package/dist/es/utils.js +1309 -0
  85. package/dist/es/validate.js +338 -0
  86. package/dist/es/withTheme.js +39 -0
  87. package/lib/components/AddButton.js +28 -0
  88. package/lib/components/ErrorList.js +31 -0
  89. package/lib/components/Form.js +572 -0
  90. package/lib/components/IconButton.js +27 -0
  91. package/lib/components/fields/ArrayField.js +959 -0
  92. package/lib/components/fields/BooleanField.js +93 -0
  93. package/lib/components/fields/DescriptionField.js +39 -0
  94. package/lib/components/fields/MultiSchemaField.js +261 -0
  95. package/lib/components/fields/NullField.js +55 -0
  96. package/lib/components/fields/NumberField.js +141 -0
  97. package/lib/components/fields/ObjectField.js +351 -0
  98. package/lib/components/fields/SchemaField.js +528 -0
  99. package/lib/components/fields/StringField.js +84 -0
  100. package/lib/components/fields/TitleField.js +30 -0
  101. package/lib/components/fields/UnsupportedField.js +35 -0
  102. package/lib/components/fields/index.js +26 -0
  103. package/lib/components/widgets/AltDateTimeWidget.js +36 -0
  104. package/lib/components/widgets/AltDateWidget.js +287 -0
  105. package/lib/components/widgets/BaseInput.js +140 -0
  106. package/lib/components/widgets/CheckboxWidget.js +73 -0
  107. package/lib/components/widgets/CheckboxesWidget.js +108 -0
  108. package/lib/components/widgets/ColorWidget.js +34 -0
  109. package/lib/components/widgets/DateTimeWidget.js +31 -0
  110. package/lib/components/widgets/DateWidget.js +28 -0
  111. package/lib/components/widgets/EmailWidget.js +23 -0
  112. package/lib/components/widgets/FileWidget.js +201 -0
  113. package/lib/components/widgets/HiddenWidget.js +25 -0
  114. package/lib/components/widgets/PasswordWidget.js +23 -0
  115. package/lib/components/widgets/RadioWidget.js +94 -0
  116. package/lib/components/widgets/RangeWidget.js +34 -0
  117. package/lib/components/widgets/SelectWidget.js +138 -0
  118. package/lib/components/widgets/SubmitButton.js +24 -0
  119. package/lib/components/widgets/TextWidget.js +20 -0
  120. package/lib/components/widgets/TextareaWidget.js +70 -0
  121. package/lib/components/widgets/URLWidget.js +23 -0
  122. package/lib/components/widgets/UpDownWidget.js +24 -0
  123. package/lib/components/widgets/index.js +43 -0
  124. package/lib/defaultRegistry.js +12 -0
  125. package/lib/index.js +16 -0
  126. package/lib/types.js +34 -0
  127. package/lib/utils.js +1309 -0
  128. package/lib/validate.js +338 -0
  129. package/lib/withTheme.js +39 -0
  130. package/package.json +6 -3
@@ -0,0 +1,959 @@
1
+ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
2
+
3
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
4
+
5
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
6
+
7
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
8
+
9
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
10
+
11
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
12
+
13
+ function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
14
+
15
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
16
+
17
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
18
+
19
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
20
+
21
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
22
+
23
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
24
+
25
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
26
+
27
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
28
+
29
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
30
+
31
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
32
+
33
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
34
+
35
+ import AddButton from "../AddButton";
36
+ import IconButton from "../IconButton";
37
+ import React, { Component } from "react";
38
+ import includes from "core-js-pure/es/array/includes";
39
+ import * as types from "../../types";
40
+ import { getWidget, getDefaultFormState, getUiOptions, isMultiSelect, isFilesArray, isFixedItems, allowAdditionalItems, isCustomWidget, optionsList, retrieveSchema, toIdSchema } from "../../utils";
41
+ import { nanoid } from "nanoid";
42
+
43
+ function ArrayFieldTitle(_ref) {
44
+ var TitleField = _ref.TitleField,
45
+ idSchema = _ref.idSchema,
46
+ title = _ref.title,
47
+ required = _ref.required;
48
+
49
+ if (!title) {
50
+ return null;
51
+ }
52
+
53
+ var id = "".concat(idSchema.$id, "__title");
54
+ return (
55
+ /*#__PURE__*/
56
+ React.createElement(TitleField, {
57
+ id: id,
58
+ title: title,
59
+ required: required
60
+ })
61
+ );
62
+ }
63
+
64
+ function ArrayFieldDescription(_ref2) {
65
+ var DescriptionField = _ref2.DescriptionField,
66
+ idSchema = _ref2.idSchema,
67
+ description = _ref2.description;
68
+
69
+ if (!description) {
70
+ return null;
71
+ }
72
+
73
+ var id = "".concat(idSchema.$id, "__description");
74
+ return (
75
+ /*#__PURE__*/
76
+ React.createElement(DescriptionField, {
77
+ id: id,
78
+ description: description
79
+ })
80
+ );
81
+ } // Used in the two templates
82
+
83
+
84
+ function DefaultArrayItem(props) {
85
+ var btnStyle = {
86
+ flex: 1,
87
+ paddingLeft: 6,
88
+ paddingRight: 6,
89
+ fontWeight: "bold"
90
+ };
91
+ return (
92
+ /*#__PURE__*/
93
+ React.createElement("div", {
94
+ key: props.key,
95
+ className: props.className
96
+ },
97
+ /*#__PURE__*/
98
+ React.createElement("div", {
99
+ className: props.hasToolbar ? "col-xs-9" : "col-xs-12"
100
+ }, props.children), props.hasToolbar &&
101
+ /*#__PURE__*/
102
+ React.createElement("div", {
103
+ className: "col-xs-3 array-item-toolbox"
104
+ },
105
+ /*#__PURE__*/
106
+ React.createElement("div", {
107
+ className: "btn-group",
108
+ style: {
109
+ display: "flex",
110
+ justifyContent: "space-around"
111
+ }
112
+ }, (props.hasMoveUp || props.hasMoveDown) &&
113
+ /*#__PURE__*/
114
+ React.createElement(IconButton, {
115
+ icon: "arrow-up",
116
+ "aria-label": "Move up",
117
+ className: "array-item-move-up",
118
+ tabIndex: "-1",
119
+ style: btnStyle,
120
+ disabled: props.disabled || props.readonly || !props.hasMoveUp,
121
+ onClick: props.onReorderClick(props.index, props.index - 1)
122
+ }), (props.hasMoveUp || props.hasMoveDown) &&
123
+ /*#__PURE__*/
124
+ React.createElement(IconButton, {
125
+ icon: "arrow-down",
126
+ className: "array-item-move-down",
127
+ "aria-label": "Move down",
128
+ tabIndex: "-1",
129
+ style: btnStyle,
130
+ disabled: props.disabled || props.readonly || !props.hasMoveDown,
131
+ onClick: props.onReorderClick(props.index, props.index + 1)
132
+ }), props.hasRemove &&
133
+ /*#__PURE__*/
134
+ React.createElement(IconButton, {
135
+ type: "danger",
136
+ icon: "remove",
137
+ "aria-label": "Remove",
138
+ className: "array-item-remove",
139
+ tabIndex: "-1",
140
+ style: btnStyle,
141
+ disabled: props.disabled || props.readonly,
142
+ onClick: props.onDropIndexClick(props.index)
143
+ }))))
144
+ );
145
+ }
146
+
147
+ function DefaultFixedArrayFieldTemplate(props) {
148
+ return (
149
+ /*#__PURE__*/
150
+ React.createElement("fieldset", {
151
+ className: props.className,
152
+ id: props.idSchema.$id
153
+ },
154
+ /*#__PURE__*/
155
+ React.createElement(ArrayFieldTitle, {
156
+ key: "array-field-title-".concat(props.idSchema.$id),
157
+ TitleField: props.TitleField,
158
+ idSchema: props.idSchema,
159
+ title: props.uiSchema["ui:title"] || props.title,
160
+ required: props.required
161
+ }), (props.uiSchema["ui:description"] || props.schema.description) &&
162
+ /*#__PURE__*/
163
+ React.createElement("div", {
164
+ className: "field-description",
165
+ key: "field-description-".concat(props.idSchema.$id)
166
+ }, props.uiSchema["ui:description"] || props.schema.description),
167
+ /*#__PURE__*/
168
+ React.createElement("div", {
169
+ className: "row array-item-list",
170
+ key: "array-item-list-".concat(props.idSchema.$id)
171
+ }, props.items && props.items.map(DefaultArrayItem)), props.canAdd &&
172
+ /*#__PURE__*/
173
+ React.createElement(AddButton, {
174
+ className: "array-item-add",
175
+ onClick: props.onAddClick,
176
+ disabled: props.disabled || props.readonly
177
+ }))
178
+ );
179
+ }
180
+
181
+ function DefaultNormalArrayFieldTemplate(props) {
182
+ return (
183
+ /*#__PURE__*/
184
+ React.createElement("fieldset", {
185
+ className: props.className,
186
+ id: props.idSchema.$id
187
+ },
188
+ /*#__PURE__*/
189
+ React.createElement(ArrayFieldTitle, {
190
+ key: "array-field-title-".concat(props.idSchema.$id),
191
+ TitleField: props.TitleField,
192
+ idSchema: props.idSchema,
193
+ title: props.uiSchema["ui:title"] || props.title,
194
+ required: props.required
195
+ }), (props.uiSchema["ui:description"] || props.schema.description) &&
196
+ /*#__PURE__*/
197
+ React.createElement(ArrayFieldDescription, {
198
+ key: "array-field-description-".concat(props.idSchema.$id),
199
+ DescriptionField: props.DescriptionField,
200
+ idSchema: props.idSchema,
201
+ description: props.uiSchema["ui:description"] || props.schema.description
202
+ }),
203
+ /*#__PURE__*/
204
+ React.createElement("div", {
205
+ className: "row array-item-list",
206
+ key: "array-item-list-".concat(props.idSchema.$id)
207
+ }, props.items && props.items.map(function (p) {
208
+ return DefaultArrayItem(p);
209
+ })), props.canAdd &&
210
+ /*#__PURE__*/
211
+ React.createElement(AddButton, {
212
+ className: "array-item-add",
213
+ onClick: props.onAddClick,
214
+ disabled: props.disabled || props.readonly
215
+ }))
216
+ );
217
+ }
218
+
219
+ function generateRowId() {
220
+ return nanoid();
221
+ }
222
+
223
+ function generateKeyedFormData(formData) {
224
+ return !Array.isArray(formData) ? [] : formData.map(function (item) {
225
+ return {
226
+ key: generateRowId(),
227
+ item: item
228
+ };
229
+ });
230
+ }
231
+
232
+ function keyedToPlainFormData(keyedFormData) {
233
+ return keyedFormData.map(function (keyedItem) {
234
+ return keyedItem.item;
235
+ });
236
+ }
237
+
238
+ var ArrayField =
239
+ /*#__PURE__*/
240
+ function (_Component) {
241
+ _inherits(ArrayField, _Component);
242
+
243
+ function ArrayField(props) {
244
+ var _this;
245
+
246
+ _classCallCheck(this, ArrayField);
247
+
248
+ _this = _possibleConstructorReturn(this, _getPrototypeOf(ArrayField).call(this, props));
249
+
250
+ _defineProperty(_assertThisInitialized(_this), "_getNewFormDataRow", function () {
251
+ var _this$props = _this.props,
252
+ schema = _this$props.schema,
253
+ registry = _this$props.registry;
254
+ var rootSchema = registry.rootSchema;
255
+ var itemSchema = schema.items;
256
+
257
+ if (isFixedItems(schema) && allowAdditionalItems(schema)) {
258
+ itemSchema = schema.additionalItems;
259
+ }
260
+
261
+ return getDefaultFormState(itemSchema, undefined, rootSchema);
262
+ });
263
+
264
+ _defineProperty(_assertThisInitialized(_this), "onAddClick", function (event) {
265
+ if (event) {
266
+ event.preventDefault();
267
+ }
268
+
269
+ var onChange = _this.props.onChange;
270
+ var newKeyedFormDataRow = {
271
+ key: generateRowId(),
272
+ item: _this._getNewFormDataRow()
273
+ };
274
+ var newKeyedFormData = [].concat(_toConsumableArray(_this.state.keyedFormData), [newKeyedFormDataRow]);
275
+
276
+ _this.setState({
277
+ keyedFormData: newKeyedFormData,
278
+ updatedKeyedFormData: true
279
+ }, function () {
280
+ return onChange(keyedToPlainFormData(newKeyedFormData));
281
+ });
282
+ });
283
+
284
+ _defineProperty(_assertThisInitialized(_this), "onAddIndexClick", function (index) {
285
+ return function (event) {
286
+ if (event) {
287
+ event.preventDefault();
288
+ }
289
+
290
+ var onChange = _this.props.onChange;
291
+ var newKeyedFormDataRow = {
292
+ key: generateRowId(),
293
+ item: _this._getNewFormDataRow()
294
+ };
295
+
296
+ var newKeyedFormData = _toConsumableArray(_this.state.keyedFormData);
297
+
298
+ newKeyedFormData.splice(index, 0, newKeyedFormDataRow);
299
+
300
+ _this.setState({
301
+ keyedFormData: newKeyedFormData,
302
+ updatedKeyedFormData: true
303
+ }, function () {
304
+ return onChange(keyedToPlainFormData(newKeyedFormData));
305
+ });
306
+ };
307
+ });
308
+
309
+ _defineProperty(_assertThisInitialized(_this), "onDropIndexClick", function (index) {
310
+ return function (event) {
311
+ if (event) {
312
+ event.preventDefault();
313
+ }
314
+
315
+ var onChange = _this.props.onChange;
316
+ var keyedFormData = _this.state.keyedFormData; // refs #195: revalidate to ensure properly reindexing errors
317
+
318
+ var newErrorSchema;
319
+
320
+ if (_this.props.errorSchema) {
321
+ newErrorSchema = {};
322
+ var errorSchema = _this.props.errorSchema;
323
+
324
+ for (var i in errorSchema) {
325
+ i = parseInt(i);
326
+
327
+ if (i < index) {
328
+ newErrorSchema[i] = errorSchema[i];
329
+ } else if (i > index) {
330
+ newErrorSchema[i - 1] = errorSchema[i];
331
+ }
332
+ }
333
+ }
334
+
335
+ var newKeyedFormData = keyedFormData.filter(function (_, i) {
336
+ return i !== index;
337
+ });
338
+
339
+ _this.setState({
340
+ keyedFormData: newKeyedFormData,
341
+ updatedKeyedFormData: true
342
+ }, function () {
343
+ return onChange(keyedToPlainFormData(newKeyedFormData), newErrorSchema);
344
+ });
345
+ };
346
+ });
347
+
348
+ _defineProperty(_assertThisInitialized(_this), "onReorderClick", function (index, newIndex) {
349
+ return function (event) {
350
+ if (event) {
351
+ event.preventDefault();
352
+ event.target.blur();
353
+ }
354
+
355
+ var onChange = _this.props.onChange;
356
+ var newErrorSchema;
357
+
358
+ if (_this.props.errorSchema) {
359
+ newErrorSchema = {};
360
+ var errorSchema = _this.props.errorSchema;
361
+
362
+ for (var i in errorSchema) {
363
+ if (i == index) {
364
+ newErrorSchema[newIndex] = errorSchema[index];
365
+ } else if (i == newIndex) {
366
+ newErrorSchema[index] = errorSchema[newIndex];
367
+ } else {
368
+ newErrorSchema[i] = errorSchema[i];
369
+ }
370
+ }
371
+ }
372
+
373
+ var keyedFormData = _this.state.keyedFormData;
374
+
375
+ function reOrderArray() {
376
+ // Copy item
377
+ var _newKeyedFormData = keyedFormData.slice(); // Moves item from index to newIndex
378
+
379
+
380
+ _newKeyedFormData.splice(index, 1);
381
+
382
+ _newKeyedFormData.splice(newIndex, 0, keyedFormData[index]);
383
+
384
+ return _newKeyedFormData;
385
+ }
386
+
387
+ var newKeyedFormData = reOrderArray();
388
+
389
+ _this.setState({
390
+ keyedFormData: newKeyedFormData
391
+ }, function () {
392
+ return onChange(keyedToPlainFormData(newKeyedFormData), newErrorSchema);
393
+ });
394
+ };
395
+ });
396
+
397
+ _defineProperty(_assertThisInitialized(_this), "onChangeForIndex", function (index) {
398
+ return function (value, errorSchema) {
399
+ var _this$props2 = _this.props,
400
+ formData = _this$props2.formData,
401
+ onChange = _this$props2.onChange;
402
+ var newFormData = formData.map(function (item, i) {
403
+ // We need to treat undefined items as nulls to have validation.
404
+ // See https://github.com/tdegrunt/jsonschema/issues/206
405
+ var jsonValue = typeof value === "undefined" ? null : value;
406
+ return index === i ? jsonValue : item;
407
+ });
408
+ onChange(newFormData, errorSchema && _this.props.errorSchema && _objectSpread({}, _this.props.errorSchema, _defineProperty({}, index, errorSchema)));
409
+ };
410
+ });
411
+
412
+ _defineProperty(_assertThisInitialized(_this), "onSelectChange", function (value) {
413
+ _this.props.onChange(value);
414
+ });
415
+
416
+ var _formData = props.formData;
417
+
418
+ var _keyedFormData = generateKeyedFormData(_formData);
419
+
420
+ _this.state = {
421
+ keyedFormData: _keyedFormData,
422
+ updatedKeyedFormData: false
423
+ };
424
+ return _this;
425
+ }
426
+
427
+ _createClass(ArrayField, [{
428
+ key: "isItemRequired",
429
+ value: function isItemRequired(itemSchema) {
430
+ if (Array.isArray(itemSchema.type)) {
431
+ // While we don't yet support composite/nullable jsonschema types, it's
432
+ // future-proof to check for requirement against these.
433
+ return !includes(itemSchema.type, "null");
434
+ } // All non-null array item types are inherently required by design
435
+
436
+
437
+ return itemSchema.type !== "null";
438
+ }
439
+ }, {
440
+ key: "canAddItem",
441
+ value: function canAddItem(formItems) {
442
+ var _this$props3 = this.props,
443
+ schema = _this$props3.schema,
444
+ uiSchema = _this$props3.uiSchema;
445
+
446
+ var _getUiOptions = getUiOptions(uiSchema),
447
+ addable = _getUiOptions.addable;
448
+
449
+ if (addable !== false) {
450
+ // if ui:options.addable was not explicitly set to false, we can add
451
+ // another item if we have not exceeded maxItems yet
452
+ if (schema.maxItems !== undefined) {
453
+ addable = formItems.length < schema.maxItems;
454
+ } else {
455
+ addable = true;
456
+ }
457
+ }
458
+
459
+ return addable;
460
+ }
461
+ }, {
462
+ key: "render",
463
+ value: function render() {
464
+ var _this$props4 = this.props,
465
+ schema = _this$props4.schema,
466
+ uiSchema = _this$props4.uiSchema,
467
+ idSchema = _this$props4.idSchema,
468
+ registry = _this$props4.registry;
469
+ var rootSchema = registry.rootSchema;
470
+
471
+ if (!schema.hasOwnProperty("items")) {
472
+ var fields = registry.fields;
473
+ var UnsupportedField = fields.UnsupportedField;
474
+ return (
475
+ /*#__PURE__*/
476
+ React.createElement(UnsupportedField, {
477
+ schema: schema,
478
+ idSchema: idSchema,
479
+ reason: "Missing items definition"
480
+ })
481
+ );
482
+ }
483
+
484
+ if (isMultiSelect(schema, rootSchema)) {
485
+ // If array has enum or uniqueItems set to true, call renderMultiSelect() to render the default multiselect widget or a custom widget, if specified.
486
+ return this.renderMultiSelect();
487
+ }
488
+
489
+ if (isCustomWidget(uiSchema)) {
490
+ return this.renderCustomWidget();
491
+ }
492
+
493
+ if (isFixedItems(schema)) {
494
+ return this.renderFixedArray();
495
+ }
496
+
497
+ if (isFilesArray(schema, uiSchema, rootSchema)) {
498
+ return this.renderFiles();
499
+ }
500
+
501
+ return this.renderNormalArray();
502
+ }
503
+ }, {
504
+ key: "renderNormalArray",
505
+ value: function renderNormalArray() {
506
+ var _this2 = this;
507
+
508
+ var _this$props5 = this.props,
509
+ schema = _this$props5.schema,
510
+ uiSchema = _this$props5.uiSchema,
511
+ errorSchema = _this$props5.errorSchema,
512
+ idSchema = _this$props5.idSchema,
513
+ name = _this$props5.name,
514
+ required = _this$props5.required,
515
+ disabled = _this$props5.disabled,
516
+ readonly = _this$props5.readonly,
517
+ hideError = _this$props5.hideError,
518
+ autofocus = _this$props5.autofocus,
519
+ registry = _this$props5.registry,
520
+ onBlur = _this$props5.onBlur,
521
+ onFocus = _this$props5.onFocus,
522
+ idPrefix = _this$props5.idPrefix,
523
+ _this$props5$idSepara = _this$props5.idSeparator,
524
+ idSeparator = _this$props5$idSepara === void 0 ? "_" : _this$props5$idSepara,
525
+ rawErrors = _this$props5.rawErrors;
526
+ var title = schema.title === undefined ? name : schema.title;
527
+ var ArrayFieldTemplate = registry.ArrayFieldTemplate,
528
+ rootSchema = registry.rootSchema,
529
+ fields = registry.fields,
530
+ formContext = registry.formContext;
531
+ var TitleField = fields.TitleField,
532
+ DescriptionField = fields.DescriptionField;
533
+ var itemsSchema = retrieveSchema(schema.items, rootSchema);
534
+ var formData = keyedToPlainFormData(this.state.keyedFormData);
535
+ var arrayProps = {
536
+ canAdd: this.canAddItem(formData),
537
+ items: this.state.keyedFormData.map(function (keyedItem, index) {
538
+ var key = keyedItem.key,
539
+ item = keyedItem.item;
540
+ var itemSchema = retrieveSchema(schema.items, rootSchema, item);
541
+ var itemErrorSchema = errorSchema ? errorSchema[index] : undefined;
542
+ var itemIdPrefix = idSchema.$id + idSeparator + index;
543
+ var itemIdSchema = toIdSchema(itemSchema, itemIdPrefix, rootSchema, item, idPrefix, idSeparator);
544
+ return _this2.renderArrayFieldItem({
545
+ key: key,
546
+ index: index,
547
+ canMoveUp: index > 0,
548
+ canMoveDown: index < formData.length - 1,
549
+ itemSchema: itemSchema,
550
+ itemIdSchema: itemIdSchema,
551
+ itemErrorSchema: itemErrorSchema,
552
+ itemData: item,
553
+ itemUiSchema: uiSchema.items,
554
+ autofocus: autofocus && index === 0,
555
+ onBlur: onBlur,
556
+ onFocus: onFocus
557
+ });
558
+ }),
559
+ className: "field field-array field-array-of-".concat(itemsSchema.type),
560
+ DescriptionField: DescriptionField,
561
+ disabled: disabled,
562
+ idSchema: idSchema,
563
+ uiSchema: uiSchema,
564
+ onAddClick: this.onAddClick,
565
+ readonly: readonly,
566
+ hideError: hideError,
567
+ required: required,
568
+ schema: schema,
569
+ title: title,
570
+ TitleField: TitleField,
571
+ formContext: formContext,
572
+ formData: formData,
573
+ rawErrors: rawErrors,
574
+ registry: registry
575
+ }; // Check if a custom render function was passed in
576
+
577
+ var Component = uiSchema["ui:ArrayFieldTemplate"] || ArrayFieldTemplate || DefaultNormalArrayFieldTemplate;
578
+ return (
579
+ /*#__PURE__*/
580
+ React.createElement(Component, arrayProps)
581
+ );
582
+ }
583
+ }, {
584
+ key: "renderCustomWidget",
585
+ value: function renderCustomWidget() {
586
+ var _this$props6 = this.props,
587
+ schema = _this$props6.schema,
588
+ idSchema = _this$props6.idSchema,
589
+ uiSchema = _this$props6.uiSchema,
590
+ disabled = _this$props6.disabled,
591
+ readonly = _this$props6.readonly,
592
+ hideError = _this$props6.hideError,
593
+ required = _this$props6.required,
594
+ placeholder = _this$props6.placeholder,
595
+ autofocus = _this$props6.autofocus,
596
+ onBlur = _this$props6.onBlur,
597
+ onFocus = _this$props6.onFocus,
598
+ items = _this$props6.formData,
599
+ registry = _this$props6.registry,
600
+ rawErrors = _this$props6.rawErrors,
601
+ name = _this$props6.name;
602
+ var widgets = registry.widgets,
603
+ formContext = registry.formContext;
604
+ var title = schema.title || name;
605
+
606
+ var _getUiOptions2 = _objectSpread({}, getUiOptions(uiSchema)),
607
+ widget = _getUiOptions2.widget,
608
+ options = _objectWithoutProperties(_getUiOptions2, ["widget"]);
609
+
610
+ var Widget = getWidget(schema, widget, widgets);
611
+ return (
612
+ /*#__PURE__*/
613
+ React.createElement(Widget, {
614
+ id: idSchema && idSchema.$id,
615
+ multiple: true,
616
+ onChange: this.onSelectChange,
617
+ onBlur: onBlur,
618
+ onFocus: onFocus,
619
+ options: options,
620
+ schema: schema,
621
+ uiSchema: uiSchema,
622
+ registry: registry,
623
+ value: items,
624
+ disabled: disabled,
625
+ readonly: readonly,
626
+ hideError: hideError,
627
+ required: required,
628
+ label: title,
629
+ placeholder: placeholder,
630
+ formContext: formContext,
631
+ autofocus: autofocus,
632
+ rawErrors: rawErrors
633
+ })
634
+ );
635
+ }
636
+ }, {
637
+ key: "renderMultiSelect",
638
+ value: function renderMultiSelect() {
639
+ var _this$props7 = this.props,
640
+ schema = _this$props7.schema,
641
+ idSchema = _this$props7.idSchema,
642
+ uiSchema = _this$props7.uiSchema,
643
+ formData = _this$props7.formData,
644
+ disabled = _this$props7.disabled,
645
+ readonly = _this$props7.readonly,
646
+ required = _this$props7.required,
647
+ placeholder = _this$props7.placeholder,
648
+ autofocus = _this$props7.autofocus,
649
+ onBlur = _this$props7.onBlur,
650
+ onFocus = _this$props7.onFocus,
651
+ registry = _this$props7.registry,
652
+ rawErrors = _this$props7.rawErrors,
653
+ name = _this$props7.name;
654
+ var items = this.props.formData;
655
+ var widgets = registry.widgets,
656
+ rootSchema = registry.rootSchema,
657
+ formContext = registry.formContext;
658
+ var itemsSchema = retrieveSchema(schema.items, rootSchema, formData);
659
+ var title = schema.title || name;
660
+ var enumOptions = optionsList(itemsSchema);
661
+
662
+ var _getUiOptions$enumOpt = _objectSpread({}, getUiOptions(uiSchema), {
663
+ enumOptions: enumOptions
664
+ }),
665
+ _getUiOptions$enumOpt2 = _getUiOptions$enumOpt.widget,
666
+ widget = _getUiOptions$enumOpt2 === void 0 ? "select" : _getUiOptions$enumOpt2,
667
+ options = _objectWithoutProperties(_getUiOptions$enumOpt, ["widget"]);
668
+
669
+ var Widget = getWidget(schema, widget, widgets);
670
+ return (
671
+ /*#__PURE__*/
672
+ React.createElement(Widget, {
673
+ id: idSchema && idSchema.$id,
674
+ multiple: true,
675
+ onChange: this.onSelectChange,
676
+ onBlur: onBlur,
677
+ onFocus: onFocus,
678
+ options: options,
679
+ schema: schema,
680
+ uiSchema: uiSchema,
681
+ registry: registry,
682
+ value: items,
683
+ disabled: disabled,
684
+ readonly: readonly,
685
+ required: required,
686
+ label: title,
687
+ placeholder: placeholder,
688
+ formContext: formContext,
689
+ autofocus: autofocus,
690
+ rawErrors: rawErrors
691
+ })
692
+ );
693
+ }
694
+ }, {
695
+ key: "renderFiles",
696
+ value: function renderFiles() {
697
+ var _this$props8 = this.props,
698
+ schema = _this$props8.schema,
699
+ uiSchema = _this$props8.uiSchema,
700
+ idSchema = _this$props8.idSchema,
701
+ name = _this$props8.name,
702
+ disabled = _this$props8.disabled,
703
+ readonly = _this$props8.readonly,
704
+ autofocus = _this$props8.autofocus,
705
+ onBlur = _this$props8.onBlur,
706
+ onFocus = _this$props8.onFocus,
707
+ registry = _this$props8.registry,
708
+ rawErrors = _this$props8.rawErrors;
709
+ var title = schema.title || name;
710
+ var items = this.props.formData;
711
+ var widgets = registry.widgets,
712
+ formContext = registry.formContext;
713
+
714
+ var _getUiOptions3 = getUiOptions(uiSchema),
715
+ _getUiOptions3$widget = _getUiOptions3.widget,
716
+ widget = _getUiOptions3$widget === void 0 ? "files" : _getUiOptions3$widget,
717
+ options = _objectWithoutProperties(_getUiOptions3, ["widget"]);
718
+
719
+ var Widget = getWidget(schema, widget, widgets);
720
+ return (
721
+ /*#__PURE__*/
722
+ React.createElement(Widget, {
723
+ options: options,
724
+ id: idSchema && idSchema.$id,
725
+ multiple: true,
726
+ onChange: this.onSelectChange,
727
+ onBlur: onBlur,
728
+ onFocus: onFocus,
729
+ schema: schema,
730
+ uiSchema: uiSchema,
731
+ title: title,
732
+ value: items,
733
+ disabled: disabled,
734
+ readonly: readonly,
735
+ registry: registry,
736
+ formContext: formContext,
737
+ autofocus: autofocus,
738
+ rawErrors: rawErrors
739
+ })
740
+ );
741
+ }
742
+ }, {
743
+ key: "renderFixedArray",
744
+ value: function renderFixedArray() {
745
+ var _this3 = this;
746
+
747
+ var _this$props9 = this.props,
748
+ schema = _this$props9.schema,
749
+ uiSchema = _this$props9.uiSchema,
750
+ formData = _this$props9.formData,
751
+ errorSchema = _this$props9.errorSchema,
752
+ idPrefix = _this$props9.idPrefix,
753
+ _this$props9$idSepara = _this$props9.idSeparator,
754
+ idSeparator = _this$props9$idSepara === void 0 ? "_" : _this$props9$idSepara,
755
+ idSchema = _this$props9.idSchema,
756
+ name = _this$props9.name,
757
+ required = _this$props9.required,
758
+ disabled = _this$props9.disabled,
759
+ readonly = _this$props9.readonly,
760
+ autofocus = _this$props9.autofocus,
761
+ registry = _this$props9.registry,
762
+ onBlur = _this$props9.onBlur,
763
+ onFocus = _this$props9.onFocus,
764
+ rawErrors = _this$props9.rawErrors;
765
+ var title = schema.title || name;
766
+ var items = this.props.formData;
767
+ var ArrayFieldTemplate = registry.ArrayFieldTemplate,
768
+ rootSchema = registry.rootSchema,
769
+ fields = registry.fields,
770
+ formContext = registry.formContext;
771
+ var TitleField = fields.TitleField;
772
+ var itemSchemas = schema.items.map(function (item, index) {
773
+ return retrieveSchema(item, rootSchema, formData[index]);
774
+ });
775
+ var additionalSchema = allowAdditionalItems(schema) ? retrieveSchema(schema.additionalItems, rootSchema, formData) : null;
776
+
777
+ if (!items || items.length < itemSchemas.length) {
778
+ // to make sure at least all fixed items are generated
779
+ items = items || [];
780
+ items = items.concat(new Array(itemSchemas.length - items.length));
781
+ } // These are the props passed into the render function
782
+
783
+
784
+ var arrayProps = {
785
+ canAdd: this.canAddItem(items) && additionalSchema,
786
+ className: "field field-array field-array-fixed-items",
787
+ disabled: disabled,
788
+ idSchema: idSchema,
789
+ formData: formData,
790
+ items: this.state.keyedFormData.map(function (keyedItem, index) {
791
+ var key = keyedItem.key,
792
+ item = keyedItem.item;
793
+ var additional = index >= itemSchemas.length;
794
+ var itemSchema = additional ? retrieveSchema(schema.additionalItems, rootSchema, item) : itemSchemas[index];
795
+ var itemIdPrefix = idSchema.$id + idSeparator + index;
796
+ var itemIdSchema = toIdSchema(itemSchema, itemIdPrefix, rootSchema, item, idPrefix, idSeparator);
797
+ var itemUiSchema = additional ? uiSchema.additionalItems || {} : Array.isArray(uiSchema.items) ? uiSchema.items[index] : uiSchema.items || {};
798
+ var itemErrorSchema = errorSchema ? errorSchema[index] : undefined;
799
+ return _this3.renderArrayFieldItem({
800
+ key: key,
801
+ index: index,
802
+ canRemove: additional,
803
+ canMoveUp: index >= itemSchemas.length + 1,
804
+ canMoveDown: additional && index < items.length - 1,
805
+ itemSchema: itemSchema,
806
+ itemData: item,
807
+ itemUiSchema: itemUiSchema,
808
+ itemIdSchema: itemIdSchema,
809
+ itemErrorSchema: itemErrorSchema,
810
+ autofocus: autofocus && index === 0,
811
+ onBlur: onBlur,
812
+ onFocus: onFocus
813
+ });
814
+ }),
815
+ onAddClick: this.onAddClick,
816
+ readonly: readonly,
817
+ required: required,
818
+ registry: registry,
819
+ schema: schema,
820
+ uiSchema: uiSchema,
821
+ title: title,
822
+ TitleField: TitleField,
823
+ formContext: formContext,
824
+ rawErrors: rawErrors
825
+ }; // Check if a custom template template was passed in
826
+
827
+ var Template = uiSchema["ui:ArrayFieldTemplate"] || ArrayFieldTemplate || DefaultFixedArrayFieldTemplate;
828
+ return (
829
+ /*#__PURE__*/
830
+ React.createElement(Template, arrayProps)
831
+ );
832
+ }
833
+ }, {
834
+ key: "renderArrayFieldItem",
835
+ value: function renderArrayFieldItem(props) {
836
+ var key = props.key,
837
+ index = props.index,
838
+ _props$canRemove = props.canRemove,
839
+ canRemove = _props$canRemove === void 0 ? true : _props$canRemove,
840
+ _props$canMoveUp = props.canMoveUp,
841
+ canMoveUp = _props$canMoveUp === void 0 ? true : _props$canMoveUp,
842
+ _props$canMoveDown = props.canMoveDown,
843
+ canMoveDown = _props$canMoveDown === void 0 ? true : _props$canMoveDown,
844
+ itemSchema = props.itemSchema,
845
+ itemData = props.itemData,
846
+ itemUiSchema = props.itemUiSchema,
847
+ itemIdSchema = props.itemIdSchema,
848
+ itemErrorSchema = props.itemErrorSchema,
849
+ autofocus = props.autofocus,
850
+ onBlur = props.onBlur,
851
+ onFocus = props.onFocus,
852
+ rawErrors = props.rawErrors;
853
+ var _this$props10 = this.props,
854
+ disabled = _this$props10.disabled,
855
+ readonly = _this$props10.readonly,
856
+ uiSchema = _this$props10.uiSchema,
857
+ registry = _this$props10.registry;
858
+ var SchemaField = registry.fields.SchemaField;
859
+
860
+ var _getUiOptions4 = getUiOptions(uiSchema),
861
+ _getUiOptions4$ordera = _getUiOptions4.orderable,
862
+ orderable = _getUiOptions4$ordera === void 0 ? true : _getUiOptions4$ordera,
863
+ _getUiOptions4$remova = _getUiOptions4.removable,
864
+ removable = _getUiOptions4$remova === void 0 ? true : _getUiOptions4$remova;
865
+
866
+ var has = {
867
+ moveUp: orderable && canMoveUp,
868
+ moveDown: orderable && canMoveDown,
869
+ remove: removable && canRemove
870
+ };
871
+ has.toolbar = Object.keys(has).some(function (key) {
872
+ return has[key];
873
+ });
874
+ return {
875
+ children:
876
+ /*#__PURE__*/
877
+ React.createElement(SchemaField, {
878
+ index: index,
879
+ schema: itemSchema,
880
+ uiSchema: itemUiSchema,
881
+ formData: itemData,
882
+ errorSchema: itemErrorSchema,
883
+ idPrefix: this.props.idPrefix,
884
+ idSeparator: this.props.idSeparator,
885
+ idSchema: itemIdSchema,
886
+ required: this.isItemRequired(itemSchema),
887
+ onChange: this.onChangeForIndex(index),
888
+ onBlur: onBlur,
889
+ onFocus: onFocus,
890
+ registry: this.props.registry,
891
+ disabled: this.props.disabled,
892
+ readonly: this.props.readonly,
893
+ hideError: this.props.hideError,
894
+ autofocus: autofocus,
895
+ rawErrors: rawErrors
896
+ }),
897
+ className: "array-item",
898
+ disabled: disabled,
899
+ hasToolbar: has.toolbar,
900
+ hasMoveUp: has.moveUp,
901
+ hasMoveDown: has.moveDown,
902
+ hasRemove: has.remove,
903
+ index: index,
904
+ key: key,
905
+ onAddIndexClick: this.onAddIndexClick,
906
+ onDropIndexClick: this.onDropIndexClick,
907
+ onReorderClick: this.onReorderClick,
908
+ readonly: readonly
909
+ };
910
+ }
911
+ }, {
912
+ key: "itemTitle",
913
+ get: function get() {
914
+ var schema = this.props.schema;
915
+ return schema.items.title || schema.items.description || "Item";
916
+ }
917
+ }], [{
918
+ key: "getDerivedStateFromProps",
919
+ value: function getDerivedStateFromProps(nextProps, prevState) {
920
+ // Don't call getDerivedStateFromProps if keyed formdata was just updated.
921
+ if (prevState.updatedKeyedFormData) {
922
+ return {
923
+ updatedKeyedFormData: false
924
+ };
925
+ }
926
+
927
+ var nextFormData = nextProps.formData || [];
928
+ var previousKeyedFormData = prevState.keyedFormData || [];
929
+ var newKeyedFormData = nextFormData.length === previousKeyedFormData.length ? previousKeyedFormData.map(function (previousKeyedFormDatum, index) {
930
+ return {
931
+ key: previousKeyedFormDatum.key,
932
+ item: nextFormData[index]
933
+ };
934
+ }) : generateKeyedFormData(nextFormData);
935
+ return {
936
+ keyedFormData: newKeyedFormData
937
+ };
938
+ }
939
+ }]);
940
+
941
+ return ArrayField;
942
+ }(Component);
943
+
944
+ _defineProperty(ArrayField, "defaultProps", {
945
+ uiSchema: {},
946
+ formData: [],
947
+ idSchema: {},
948
+ required: false,
949
+ disabled: false,
950
+ readonly: false,
951
+ autofocus: false
952
+ });
953
+
954
+ if (process.env.NODE_ENV !== "production") {
955
+ ArrayField.propTypes = types.fieldProps;
956
+ }
957
+
958
+ export default ArrayField;
959
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2ZpZWxkcy9BcnJheUZpZWxkLmpzIl0sIm5hbWVzIjpbIkFkZEJ1dHRvbiIsIkljb25CdXR0b24iLCJSZWFjdCIsIkNvbXBvbmVudCIsImluY2x1ZGVzIiwidHlwZXMiLCJnZXRXaWRnZXQiLCJnZXREZWZhdWx0Rm9ybVN0YXRlIiwiZ2V0VWlPcHRpb25zIiwiaXNNdWx0aVNlbGVjdCIsImlzRmlsZXNBcnJheSIsImlzRml4ZWRJdGVtcyIsImFsbG93QWRkaXRpb25hbEl0ZW1zIiwiaXNDdXN0b21XaWRnZXQiLCJvcHRpb25zTGlzdCIsInJldHJpZXZlU2NoZW1hIiwidG9JZFNjaGVtYSIsIm5hbm9pZCIsIkFycmF5RmllbGRUaXRsZSIsIlRpdGxlRmllbGQiLCJpZFNjaGVtYSIsInRpdGxlIiwicmVxdWlyZWQiLCJpZCIsIiRpZCIsIkFycmF5RmllbGREZXNjcmlwdGlvbiIsIkRlc2NyaXB0aW9uRmllbGQiLCJkZXNjcmlwdGlvbiIsIkRlZmF1bHRBcnJheUl0ZW0iLCJwcm9wcyIsImJ0blN0eWxlIiwiZmxleCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwiZm9udFdlaWdodCIsImtleSIsImNsYXNzTmFtZSIsImhhc1Rvb2xiYXIiLCJjaGlsZHJlbiIsImRpc3BsYXkiLCJqdXN0aWZ5Q29udGVudCIsImhhc01vdmVVcCIsImhhc01vdmVEb3duIiwiZGlzYWJsZWQiLCJyZWFkb25seSIsIm9uUmVvcmRlckNsaWNrIiwiaW5kZXgiLCJoYXNSZW1vdmUiLCJvbkRyb3BJbmRleENsaWNrIiwiRGVmYXVsdEZpeGVkQXJyYXlGaWVsZFRlbXBsYXRlIiwidWlTY2hlbWEiLCJzY2hlbWEiLCJpdGVtcyIsIm1hcCIsImNhbkFkZCIsIm9uQWRkQ2xpY2siLCJEZWZhdWx0Tm9ybWFsQXJyYXlGaWVsZFRlbXBsYXRlIiwicCIsImdlbmVyYXRlUm93SWQiLCJnZW5lcmF0ZUtleWVkRm9ybURhdGEiLCJmb3JtRGF0YSIsIkFycmF5IiwiaXNBcnJheSIsIml0ZW0iLCJrZXllZFRvUGxhaW5Gb3JtRGF0YSIsImtleWVkRm9ybURhdGEiLCJrZXllZEl0ZW0iLCJBcnJheUZpZWxkIiwicmVnaXN0cnkiLCJyb290U2NoZW1hIiwiaXRlbVNjaGVtYSIsImFkZGl0aW9uYWxJdGVtcyIsInVuZGVmaW5lZCIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJvbkNoYW5nZSIsIm5ld0tleWVkRm9ybURhdGFSb3ciLCJfZ2V0TmV3Rm9ybURhdGFSb3ciLCJuZXdLZXllZEZvcm1EYXRhIiwic3RhdGUiLCJzZXRTdGF0ZSIsInVwZGF0ZWRLZXllZEZvcm1EYXRhIiwic3BsaWNlIiwibmV3RXJyb3JTY2hlbWEiLCJlcnJvclNjaGVtYSIsImkiLCJwYXJzZUludCIsImZpbHRlciIsIl8iLCJuZXdJbmRleCIsInRhcmdldCIsImJsdXIiLCJyZU9yZGVyQXJyYXkiLCJfbmV3S2V5ZWRGb3JtRGF0YSIsInNsaWNlIiwidmFsdWUiLCJuZXdGb3JtRGF0YSIsImpzb25WYWx1ZSIsInR5cGUiLCJmb3JtSXRlbXMiLCJhZGRhYmxlIiwibWF4SXRlbXMiLCJsZW5ndGgiLCJoYXNPd25Qcm9wZXJ0eSIsImZpZWxkcyIsIlVuc3VwcG9ydGVkRmllbGQiLCJyZW5kZXJNdWx0aVNlbGVjdCIsInJlbmRlckN1c3RvbVdpZGdldCIsInJlbmRlckZpeGVkQXJyYXkiLCJyZW5kZXJGaWxlcyIsInJlbmRlck5vcm1hbEFycmF5IiwibmFtZSIsImhpZGVFcnJvciIsImF1dG9mb2N1cyIsIm9uQmx1ciIsIm9uRm9jdXMiLCJpZFByZWZpeCIsImlkU2VwYXJhdG9yIiwicmF3RXJyb3JzIiwiQXJyYXlGaWVsZFRlbXBsYXRlIiwiZm9ybUNvbnRleHQiLCJpdGVtc1NjaGVtYSIsImFycmF5UHJvcHMiLCJjYW5BZGRJdGVtIiwiaXRlbUVycm9yU2NoZW1hIiwiaXRlbUlkUHJlZml4IiwiaXRlbUlkU2NoZW1hIiwicmVuZGVyQXJyYXlGaWVsZEl0ZW0iLCJjYW5Nb3ZlVXAiLCJjYW5Nb3ZlRG93biIsIml0ZW1EYXRhIiwiaXRlbVVpU2NoZW1hIiwicGxhY2Vob2xkZXIiLCJ3aWRnZXRzIiwid2lkZ2V0Iiwib3B0aW9ucyIsIldpZGdldCIsIm9uU2VsZWN0Q2hhbmdlIiwiZW51bU9wdGlvbnMiLCJpdGVtU2NoZW1hcyIsImFkZGl0aW9uYWxTY2hlbWEiLCJjb25jYXQiLCJhZGRpdGlvbmFsIiwiY2FuUmVtb3ZlIiwiVGVtcGxhdGUiLCJTY2hlbWFGaWVsZCIsIm9yZGVyYWJsZSIsInJlbW92YWJsZSIsImhhcyIsIm1vdmVVcCIsIm1vdmVEb3duIiwicmVtb3ZlIiwidG9vbGJhciIsIk9iamVjdCIsImtleXMiLCJzb21lIiwiaXNJdGVtUmVxdWlyZWQiLCJvbkNoYW5nZUZvckluZGV4Iiwib25BZGRJbmRleENsaWNrIiwibmV4dFByb3BzIiwicHJldlN0YXRlIiwibmV4dEZvcm1EYXRhIiwicHJldmlvdXNLZXllZEZvcm1EYXRhIiwicHJldmlvdXNLZXllZEZvcm1EYXR1bSIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInByb3BUeXBlcyIsImZpZWxkUHJvcHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPQSxTQUFQLE1BQXNCLGNBQXRCO0FBQ0EsT0FBT0MsVUFBUCxNQUF1QixlQUF2QjtBQUNBLE9BQU9DLEtBQVAsSUFBZ0JDLFNBQWhCLFFBQWlDLE9BQWpDO0FBQ0EsT0FBT0MsUUFBUCxNQUFxQixnQ0FBckI7QUFDQSxPQUFPLEtBQUtDLEtBQVosTUFBdUIsYUFBdkI7QUFFQSxTQUNFQyxTQURGLEVBRUVDLG1CQUZGLEVBR0VDLFlBSEYsRUFJRUMsYUFKRixFQUtFQyxZQUxGLEVBTUVDLFlBTkYsRUFPRUMsb0JBUEYsRUFRRUMsY0FSRixFQVNFQyxXQVRGLEVBVUVDLGNBVkYsRUFXRUMsVUFYRixRQVlPLGFBWlA7QUFhQSxTQUFTQyxNQUFULFFBQXVCLFFBQXZCOztBQUVBLFNBQVNDLGVBQVQsT0FBb0U7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RDs7QUFDRCxVQUFNZ0YsWUFBWSxHQUFHRixTQUFTLENBQUNuRyxRQUFWLElBQXNCLEVBQTNDO0FBQ0EsVUFBTXNHLHFCQUFxQixHQUFHRixTQUFTLENBQUMvRixhQUFWLElBQTJCLEVBQXpEO0FBQ0EsVUFBTWEsZ0JBQWdCLEdBQ3BCbUYsWUFBWSxDQUFDM0QsTUFBYixLQUF3QjRELHFCQUFxQixDQUFDNUQsTUFBOUMsR0FDSTRELHFCQUFxQixDQUFDN0csR0FBdEIsQ0FBMEIsVUFBQzhHLHNCQUFELEVBQXlCckgsS0FBekIsRUFBbUM7QUFDM0QsZUFBTztBQUNMWCxVQUFBQSxHQUFHLEVBQUVnSSxzQkFBc0IsQ0FBQ2hJLEdBRHZCO0FBRUw0QixVQUFBQSxJQUFJLEVBQUVrRyxZQUFZLENBQUNuSCxLQUFEO0FBRmIsU0FBUDtBQUlELE9BTEQsQ0FESixHQU9JYSxxQkFBcUIsQ0FBQ3NHLFlBQUQsQ0FSM0I7QUFTQSxhQUFPO0FBQ0xoRyxRQUFBQSxhQUFhLEVBQUVhO0FBRFYsT0FBUDtBQUdEOzs7O0VBMUNzQjNFLFM7O2dCQUFuQmdFLFUsa0JBQ2tCO0FBQ3BCakIsRUFBQUEsUUFBUSxFQUFFLEVBRFU7QUFFcEJVLEVBQUFBLFFBQVEsRUFBRSxFQUZVO0FBR3BCeEMsRUFBQUEsUUFBUSxFQUFFLEVBSFU7QUFJcEJFLEVBQUFBLFFBQVEsRUFBRSxLQUpVO0FBS3BCcUIsRUFBQUEsUUFBUSxFQUFFLEtBTFU7QUFNcEJDLEVBQUFBLFFBQVEsRUFBRSxLQU5VO0FBT3BCcUUsRUFBQUEsU0FBUyxFQUFFO0FBUFMsQzs7QUF1b0J4QixJQUFJbUQsT0FBTyxDQUFDQyxHQUFSLENBQVlDLFFBQVosS0FBeUIsWUFBN0IsRUFBMkM7QUFDekNuRyxFQUFBQSxVQUFVLENBQUNvRyxTQUFYLEdBQXVCbEssS0FBSyxDQUFDbUssVUFBN0I7QUFDRDs7QUFFRCxlQUFlckcsVUFBZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBZGRCdXR0b24gZnJvbSBcIi4uL0FkZEJ1dHRvblwiO1xuaW1wb3J0IEljb25CdXR0b24gZnJvbSBcIi4uL0ljb25CdXR0b25cIjtcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBpbmNsdWRlcyBmcm9tIFwiY29yZS1qcy1wdXJlL2VzL2FycmF5L2luY2x1ZGVzXCI7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuaW1wb3J0IHtcbiAgZ2V0V2lkZ2V0LFxuICBnZXREZWZhdWx0Rm9ybVN0YXRlLFxuICBnZXRVaU9wdGlvbnMsXG4gIGlzTXVsdGlTZWxlY3QsXG4gIGlzRmlsZXNBcnJheSxcbiAgaXNGaXhlZEl0ZW1zLFxuICBhbGxvd0FkZGl0aW9uYWxJdGVtcyxcbiAgaXNDdXN0b21XaWRnZXQsXG4gIG9wdGlvbnNMaXN0LFxuICByZXRyaWV2ZVNjaGVtYSxcbiAgdG9JZFNjaGVtYSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkXCI7XG5cbmZ1bmN0aW9uIEFycmF5RmllbGRUaXRsZSh7IFRpdGxlRmllbGQsIGlkU2NoZW1hLCB0aXRsZSwgcmVxdWlyZWQgfSkge1xuICBpZiAoIXRpdGxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgaWQgPSBgJHtpZFNjaGVtYS4kaWR9X190aXRsZWA7XG4gIHJldHVybiA8VGl0bGVGaWVsZCBpZD17aWR9IHRpdGxlPXt0aXRsZX0gcmVxdWlyZWQ9e3JlcXVpcmVkfSAvPjtcbn1cblxuZnVuY3Rpb24gQXJyYXlGaWVsZERlc2NyaXB0aW9uKHsgRGVzY3JpcHRpb25GaWVsZCwgaWRTY2hlbWEsIGRlc2NyaXB0aW9uIH0pIHtcbiAgaWYgKCFkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGlkID0gYCR7aWRTY2hlbWEuJGlkfV9fZGVzY3JpcHRpb25gO1xuICByZXR1cm4gPERlc2NyaXB0aW9uRmllbGQgaWQ9e2lkfSBkZXNjcmlwdGlvbj17ZGVzY3JpcHRpb259IC8+O1xufVxuXG4vLyBVc2VkIGluIHRoZSB0d28gdGVtcGxhdGVzXG5mdW5jdGlvbiBEZWZhdWx0QXJyYXlJdGVtKHByb3BzKSB7XG4gIGNvbnN0IGJ0blN0eWxlID0ge1xuICAgIGZsZXg6IDEsXG4gICAgcGFkZGluZ0xlZnQ6IDYsXG4gICAgcGFkZGluZ1JpZ2h0OiA2LFxuICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuICB9O1xuICByZXR1cm4gKFxuICAgIDxkaXYga2V5PXtwcm9wcy5rZXl9IGNsYXNzTmFtZT17cHJvcHMuY2xhc3NOYW1lfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtwcm9wcy5oYXNUb29sYmFyID8gXCJjb2wteHMtOVwiIDogXCJjb2wteHMtMTJcIn0+XG4gICAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7cHJvcHMuaGFzVG9vbGJhciAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXhzLTMgYXJyYXktaXRlbS10b29sYm94XCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYnRuLWdyb3VwXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1hcm91bmRcIixcbiAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgeyhwcm9wcy5oYXNNb3ZlVXAgfHwgcHJvcHMuaGFzTW92ZURvd24pICYmIChcbiAgICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgICBpY29uPVwiYXJyb3ctdXBcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJNb3ZlIHVwXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhcnJheS1pdGVtLW1vdmUtdXBcIlxuICAgICAgICAgICAgICAgIHRhYkluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXtidG5TdHlsZX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17cHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMucmVhZG9ubHkgfHwgIXByb3BzLmhhc01vdmVVcH1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtwcm9wcy5vblJlb3JkZXJDbGljayhwcm9wcy5pbmRleCwgcHJvcHMuaW5kZXggLSAxKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHsocHJvcHMuaGFzTW92ZVVwIHx8IHByb3BzLmhhc01vdmVEb3duKSAmJiAoXG4gICAgICAgICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgaWNvbj1cImFycm93LWRvd25cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFycmF5LWl0ZW0tbW92ZS1kb3duXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTW92ZSBkb3duXCJcbiAgICAgICAgICAgICAgICB0YWJJbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17YnRuU3R5bGV9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e1xuICAgICAgICAgICAgICAgICAgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMucmVhZG9ubHkgfHwgIXByb3BzLmhhc01vdmVEb3duXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3Byb3BzLm9uUmVvcmRlckNsaWNrKHByb3BzLmluZGV4LCBwcm9wcy5pbmRleCArIDEpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAge3Byb3BzLmhhc1JlbW92ZSAmJiAoXG4gICAgICAgICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgaWNvbj1cInJlbW92ZVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYXJyYXktaXRlbS1yZW1vdmVcIlxuICAgICAgICAgICAgICAgIHRhYkluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXtidG5TdHlsZX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17cHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMucmVhZG9ubHl9XG4gICAgICAgICAgICAgICAgb25DbGljaz17cHJvcHMub25Ecm9wSW5kZXhDbGljayhwcm9wcy5pbmRleCl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIERlZmF1bHRGaXhlZEFycmF5RmllbGRUZW1wbGF0ZShwcm9wcykge1xuICByZXR1cm4gKFxuICAgIDxmaWVsZHNldCBjbGFzc05hbWU9e3Byb3BzLmNsYXNzTmFtZX0gaWQ9e3Byb3BzLmlkU2NoZW1hLiRpZH0+XG4gICAgICA8QXJyYXlGaWVsZFRpdGxlXG4gICAgICAgIGtleT17YGFycmF5LWZpZWxkLXRpdGxlLSR7cHJvcHMuaWRTY2hlbWEuJGlkfWB9XG4gICAgICAgIFRpdGxlRmllbGQ9e3Byb3BzLlRpdGxlRmllbGR9XG4gICAgICAgIGlkU2NoZW1hPXtwcm9wcy5pZFNjaGVtYX1cbiAgICAgICAgdGl0bGU9e3Byb3BzLnVpU2NoZW1hW1widWk6dGl0bGVcIl0gfHwgcHJvcHMudGl0bGV9XG4gICAgICAgIHJlcXVpcmVkPXtwcm9wcy5yZXF1aXJlZH1cbiAgICAgIC8+XG5cbiAgICAgIHsocHJvcHMudWlTY2hlbWFbXCJ1aTpkZXNjcmlwdGlvblwiXSB8fCBwcm9wcy5zY2hlbWEuZGVzY3JpcHRpb24pICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImZpZWxkLWRlc2NyaXB0aW9uXCJcbiAgICAgICAgICBrZXk9e2BmaWVsZC1kZXNjcmlwdGlvbi0ke3Byb3BzLmlkU2NoZW1hLiRpZH1gfT5cbiAgICAgICAgICB7cHJvcHMudWlTY2hlbWFbXCJ1aTpkZXNjcmlwdGlvblwiXSB8fCBwcm9wcy5zY2hlbWEuZGVzY3JpcHRpb259XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJyb3cgYXJyYXktaXRlbS1saXN0XCJcbiAgICAgICAga2V5PXtgYXJyYXktaXRlbS1saXN0LSR7cHJvcHMuaWRTY2hlbWEuJGlkfWB9PlxuICAgICAgICB7cHJvcHMuaXRlbXMgJiYgcHJvcHMuaXRlbXMubWFwKERlZmF1bHRBcnJheUl0ZW0pfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtwcm9wcy5jYW5BZGQgJiYgKFxuICAgICAgICA8QWRkQnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPVwiYXJyYXktaXRlbS1hZGRcIlxuICAgICAgICAgIG9uQ2xpY2s9e3Byb3BzLm9uQWRkQ2xpY2t9XG4gICAgICAgICAgZGlzYWJsZWQ9e3Byb3BzLmRpc2FibGVkIHx8IHByb3BzLnJlYWRvbmx5fVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L2ZpZWxkc2V0PlxuICApO1xufVxuXG5mdW5jdGlvbiBEZWZhdWx0Tm9ybWFsQXJyYXlGaWVsZFRlbXBsYXRlKHByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGZpZWxkc2V0IGNsYXNzTmFtZT17cHJvcHMuY2xhc3NOYW1lfSBpZD17cHJvcHMuaWRTY2hlbWEuJGlkfT5cbiAgICAgIDxBcnJheUZpZWxkVGl0bGVcbiAgICAgICAga2V5PXtgYXJyYXktZmllbGQtdGl0bGUtJHtwcm9wcy5pZFNjaGVtYS4kaWR9YH1cbiAgICAgICAgVGl0bGVGaWVsZD17cHJvcHMuVGl0bGVGaWVsZH1cbiAgICAgICAgaWRTY2hlbWE9e3Byb3BzLmlkU2NoZW1hfVxuICAgICAgICB0aXRsZT17cHJvcHMudWlTY2hlbWFbXCJ1aTp0aXRsZVwiXSB8fCBwcm9wcy50aXRsZX1cbiAgICAgICAgcmVxdWlyZWQ9e3Byb3BzLnJlcXVpcmVkfVxuICAgICAgLz5cblxuICAgICAgeyhwcm9wcy51aVNjaGVtYVtcInVpOmRlc2NyaXB0aW9uXCJdIHx8IHByb3BzLnNjaGVtYS5kZXNjcmlwdGlvbikgJiYgKFxuICAgICAgICA8QXJyYXlGaWVsZERlc2NyaXB0aW9uXG4gICAgICAgICAga2V5PXtgYXJyYXktZmllbGQtZGVzY3JpcHRpb24tJHtwcm9wcy5pZFNjaGVtYS4kaWR9YH1cbiAgICAgICAgICBEZXNjcmlwdGlvbkZpZWxkPXtwcm9wcy5EZXNjcmlwdGlvbkZpZWxkfVxuICAgICAgICAgIGlkU2NoZW1hPXtwcm9wcy5pZFNjaGVtYX1cbiAgICAgICAgICBkZXNjcmlwdGlvbj17XG4gICAgICAgICAgICBwcm9wcy51aVNjaGVtYVtcInVpOmRlc2NyaXB0aW9uXCJdIHx8IHByb3BzLnNjaGVtYS5kZXNjcmlwdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgICl9XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwicm93IGFycmF5LWl0ZW0tbGlzdFwiXG4gICAgICAgIGtleT17YGFycmF5LWl0ZW0tbGlzdC0ke3Byb3BzLmlkU2NoZW1hLiRpZH1gfT5cbiAgICAgICAge3Byb3BzLml0ZW1zICYmIHByb3BzLml0ZW1zLm1hcChwID0+IERlZmF1bHRBcnJheUl0ZW0ocCkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtwcm9wcy5jYW5BZGQgJiYgKFxuICAgICAgICA8QWRkQnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPVwiYXJyYXktaXRlbS1hZGRcIlxuICAgICAgICAgIG9uQ2xpY2s9e3Byb3BzLm9uQWRkQ2xpY2t9XG4gICAgICAgICAgZGlzYWJsZWQ9e3Byb3BzLmRpc2FibGVkIHx8IHByb3BzLnJlYWRvbmx5fVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L2ZpZWxkc2V0PlxuICApO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVJvd0lkKCkge1xuICByZXR1cm4gbmFub2lkKCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlS2V5ZWRGb3JtRGF0YShmb3JtRGF0YSkge1xuICByZXR1cm4gIUFycmF5LmlzQXJyYXkoZm9ybURhdGEpXG4gICAgPyBbXVxuICAgIDogZm9ybURhdGEubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleTogZ2VuZXJhdGVSb3dJZCgpLFxuICAgICAgICAgIGl0ZW0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbn1cblxuZnVuY3Rpb24ga2V5ZWRUb1BsYWluRm9ybURhdGEoa2V5ZWRGb3JtRGF0YSkge1xuICByZXR1cm4ga2V5ZWRGb3JtRGF0YS5tYXAoa2V5ZWRJdGVtID0+IGtleWVkSXRlbS5pdGVtKTtcbn1cblxuY2xhc3MgQXJyYXlGaWVsZCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgdWlTY2hlbWE6IHt9LFxuICAgIGZvcm1EYXRhOiBbXSxcbiAgICBpZFNjaGVtYToge30sXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICByZWFkb25seTogZmFsc2UsXG4gICAgYXV0b2ZvY3VzOiBmYWxzZSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICBjb25zdCB7IGZvcm1EYXRhIH0gPSBwcm9wcztcbiAgICBjb25zdCBrZXllZEZvcm1EYXRhID0gZ2VuZXJhdGVLZXllZEZvcm1EYXRhKGZvcm1EYXRhKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAga2V5ZWRGb3JtRGF0YSxcbiAgICAgIHVwZGF0ZWRLZXllZEZvcm1EYXRhOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIC8vIERvbid0IGNhbGwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIGlmIGtleWVkIGZvcm1kYXRhIHdhcyBqdXN0IHVwZGF0ZWQuXG4gICAgaWYgKHByZXZTdGF0ZS51cGRhdGVkS2V5ZWRGb3JtRGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlZEtleWVkRm9ybURhdGE6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbmV4dEZvcm1EYXRhID0gbmV4dFByb3BzLmZvcm1EYXRhIHx8IFtdO1xuICAgIGNvbnN0IHByZXZpb3VzS2V5ZWRGb3JtRGF0YSA9IHByZXZTdGF0ZS5rZXllZEZvcm1EYXRhIHx8IFtdO1xuICAgIGNvbnN0IG5ld0tleWVkRm9ybURhdGEgPVxuICAgICAgbmV4dEZvcm1EYXRhLmxlbmd0aCA9PT0gcHJldmlvdXNLZXllZEZvcm1EYXRhLmxlbmd0aFxuICAgICAgICA/IHByZXZpb3VzS2V5ZWRGb3JtRGF0YS5tYXAoKHByZXZpb3VzS2V5ZWRGb3JtRGF0dW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBrZXk6IHByZXZpb3VzS2V5ZWRGb3JtRGF0dW0ua2V5LFxuICAgICAgICAgICAgICBpdGVtOiBuZXh0Rm9ybURhdGFbaW5kZXhdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICA6IGdlbmVyYXRlS2V5ZWRGb3JtRGF0YShuZXh0Rm9ybURhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICBrZXllZEZvcm1EYXRhOiBuZXdLZXllZEZvcm1EYXRhLFxuICAgIH07XG4gIH1cblxuICBnZXQgaXRlbVRpdGxlKCkge1xuICAgIGNvbnN0IHsgc2NoZW1hIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiBzY2hlbWEuaXRlbXMudGl0bGUgfHwgc2NoZW1hLml0ZW1zLmRlc2NyaXB0aW9uIHx8IFwiSXRlbVwiO1xuICB9XG5cbiAgaXNJdGVtUmVxdWlyZWQoaXRlbVNjaGVtYSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1TY2hlbWEudHlwZSkpIHtcbiAgICAgIC8vIFdoaWxlIHdlIGRvbid0IHlldCBzdXBwb3J0IGNvbXBvc2l0ZS9udWxsYWJsZSBqc29uc2NoZW1hIHR5cGVzLCBpdCdzXG4gICAgICAvLyBmdXR1cmUtcHJvb2YgdG8gY2hlY2sgZm9yIHJlcXVpcmVtZW50IGFnYWluc3QgdGhlc2UuXG4gICAgICByZXR1cm4gIWluY2x1ZGVzKGl0ZW1TY2hlbWEudHlwZSwgXCJudWxsXCIpO1xuICAgIH1cbiAgICAvLyBBbGwgbm9uLW51bGwgYXJyYXkgaXRlbSB0eXBlcyBhcmUgaW5oZXJlbnRseSByZXF1aXJlZCBieSBkZXNpZ25cbiAgICByZXR1cm4gaXRlbVNjaGVtYS50eXBlICE9PSBcIm51bGxcIjtcbiAgfVxuXG4gIGNhbkFkZEl0ZW0oZm9ybUl0ZW1zKSB7XG4gICAgY29uc3QgeyBzY2hlbWEsIHVpU2NoZW1hIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCB7IGFkZGFibGUgfSA9IGdldFVpT3B0aW9ucyh1aVNjaGVtYSk7XG4gICAgaWYgKGFkZGFibGUgIT09IGZhbHNlKSB7XG4gICAgICAvLyBpZiB1aTpvcHRpb25zLmFkZGFibGUgd2FzIG5vdCBleHBsaWNpdGx5IHNldCB0byBmYWxzZSwgd2UgY2FuIGFkZFxuICAgICAgLy8gYW5vdGhlciBpdGVtIGlmIHdlIGhhdmUgbm90IGV4Y2VlZGVkIG1heEl0ZW1zIHlldFxuICAgICAgaWYgKHNjaGVtYS5tYXhJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFkZGFibGUgPSBmb3JtSXRlbXMubGVuZ3RoIDwgc2NoZW1hLm1heEl0ZW1zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZGRhYmxlO1xuICB9XG5cbiAgX2dldE5ld0Zvcm1EYXRhUm93ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2NoZW1hLCByZWdpc3RyeSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHJvb3RTY2hlbWEgfSA9IHJlZ2lzdHJ5O1xuICAgIGxldCBpdGVtU2NoZW1hID0gc2NoZW1hLml0ZW1zO1xuICAgIGlmIChpc0ZpeGVkSXRlbXMoc2NoZW1hKSAmJiBhbGxvd0FkZGl0aW9uYWxJdGVtcyhzY2hlbWEpKSB7XG4gICAgICBpdGVtU2NoZW1hID0gc2NoZW1hLmFkZGl0aW9uYWxJdGVtcztcbiAgICB9XG4gICAgcmV0dXJuIGdldERlZmF1bHRGb3JtU3RhdGUoaXRlbVNjaGVtYSwgdW5kZWZpbmVkLCByb290U2NoZW1hKTtcbiAgfTtcblxuICBvbkFkZENsaWNrID0gZXZlbnQgPT4ge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG9uQ2hhbmdlIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG5ld0tleWVkRm9ybURhdGFSb3cgPSB7XG4gICAgICBrZXk6IGdlbmVyYXRlUm93SWQoKSxcbiAgICAgIGl0ZW06IHRoaXMuX2dldE5ld0Zvcm1EYXRhUm93KCksXG4gICAgfTtcbiAgICBjb25zdCBuZXdLZXllZEZvcm1EYXRhID0gWy4uLnRoaXMuc3RhdGUua2V5ZWRGb3JtRGF0YSwgbmV3S2V5ZWRGb3JtRGF0YVJvd107XG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHtcbiAgICAgICAga2V5ZWRGb3JtRGF0YTogbmV3S2V5ZWRGb3JtRGF0YSxcbiAgICAgICAgdXBkYXRlZEtleWVkRm9ybURhdGE6IHRydWUsXG4gICAgICB9LFxuICAgICAgKCkgPT4gb25DaGFuZ2Uoa2V5ZWRUb1BsYWluRm9ybURhdGEobmV3S2V5ZWRGb3JtRGF0YSkpXG4gICAgKTtcbiAgfTtcblxuICBvbkFkZEluZGV4Q2xpY2sgPSBpbmRleCA9PiB7XG4gICAgcmV0dXJuIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IG5ld0tleWVkRm9ybURhdGFSb3cgPSB7XG4gICAgICAgIGtleTogZ2VuZXJhdGVSb3dJZCgpLFxuICAgICAgICBpdGVtOiB0aGlzLl9nZXROZXdGb3JtRGF0YVJvdygpLFxuICAgICAgfTtcbiAgICAgIGxldCBuZXdLZXllZEZvcm1EYXRhID0gWy4uLnRoaXMuc3RhdGUua2V5ZWRGb3JtRGF0YV07XG4gICAgICBuZXdLZXllZEZvcm1EYXRhLnNwbGljZShpbmRleCwgMCwgbmV3S2V5ZWRGb3JtRGF0YVJvdyk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBrZXllZEZvcm1EYXRhOiBuZXdLZXllZEZvcm1EYXRhLFxuICAgICAgICAgIHVwZGF0ZWRLZXllZEZvcm1EYXRhOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiBvbkNoYW5nZShrZXllZFRvUGxhaW5Gb3JtRGF0YShuZXdLZXllZEZvcm1EYXRhKSlcbiAgICAgICk7XG4gICAgfTtcbiAgfTtcblxuICBvbkRyb3BJbmRleENsaWNrID0gaW5kZXggPT4ge1xuICAgIHJldHVybiBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgb25DaGFuZ2UgfSA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCB7IGtleWVkRm9ybURhdGEgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAvLyByZWZzICMxOTU6IHJldmFsaWRhdGUgdG8gZW5zdXJlIHByb3Blcmx5IHJlaW5kZXhpbmcgZXJyb3JzXG4gICAgICBsZXQgbmV3RXJyb3JTY2hlbWE7XG4gICAgICBpZiAodGhpcy5wcm9wcy5lcnJvclNjaGVtYSkge1xuICAgICAgICBuZXdFcnJvclNjaGVtYSA9IHt9O1xuICAgICAgICBjb25zdCBlcnJvclNjaGVtYSA9IHRoaXMucHJvcHMuZXJyb3JTY2hlbWE7XG4gICAgICAgIGZvciAobGV0IGkgaW4gZXJyb3JTY2hlbWEpIHtcbiAgICAgICAgICBpID0gcGFyc2VJbnQoaSk7XG4gICAgICAgICAgaWYgKGkgPCBpbmRleCkge1xuICAgICAgICAgICAgbmV3RXJyb3JTY2hlbWFbaV0gPSBlcnJvclNjaGVtYVtpXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPiBpbmRleCkge1xuICAgICAgICAgICAgbmV3RXJyb3JTY2hlbWFbaSAtIDFdID0gZXJyb3JTY2hlbWFbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdLZXllZEZvcm1EYXRhID0ga2V5ZWRGb3JtRGF0YS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICBrZXllZEZvcm1EYXRhOiBuZXdLZXllZEZvcm1EYXRhLFxuICAgICAgICAgIHVwZGF0ZWRLZXllZEZvcm1EYXRhOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiBvbkNoYW5nZShrZXllZFRvUGxhaW5Gb3JtRGF0YShuZXdLZXllZEZvcm1EYXRhKSwgbmV3RXJyb3JTY2hlbWEpXG4gICAgICApO1xuICAgIH07XG4gIH07XG5cbiAgb25SZW9yZGVyQ2xpY2sgPSAoaW5kZXgsIG5ld0luZGV4KSA9PiB7XG4gICAgcmV0dXJuIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC50YXJnZXQuYmx1cigpO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGxldCBuZXdFcnJvclNjaGVtYTtcbiAgICAgIGlmICh0aGlzLnByb3BzLmVycm9yU2NoZW1hKSB7XG4gICAgICAgIG5ld0Vycm9yU2NoZW1hID0ge307XG4gICAgICAgIGNvbnN0IGVycm9yU2NoZW1hID0gdGhpcy5wcm9wcy5lcnJvclNjaGVtYTtcbiAgICAgICAgZm9yIChsZXQgaSBpbiBlcnJvclNjaGVtYSkge1xuICAgICAgICAgIGlmIChpID09IGluZGV4KSB7XG4gICAgICAgICAgICBuZXdFcnJvclNjaGVtYVtuZXdJbmRleF0gPSBlcnJvclNjaGVtYVtpbmRleF07XG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IG5ld0luZGV4KSB7XG4gICAgICAgICAgICBuZXdFcnJvclNjaGVtYVtpbmRleF0gPSBlcnJvclNjaGVtYVtuZXdJbmRleF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0Vycm9yU2NoZW1hW2ldID0gZXJyb3JTY2hlbWFbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsga2V5ZWRGb3JtRGF0YSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGZ1bmN0aW9uIHJlT3JkZXJBcnJheSgpIHtcbiAgICAgICAgLy8gQ29weSBpdGVtXG4gICAgICAgIGxldCBfbmV3S2V5ZWRGb3JtRGF0YSA9IGtleWVkRm9ybURhdGEuc2xpY2UoKTtcblxuICAgICAgICAvLyBNb3ZlcyBpdGVtIGZyb20gaW5kZXggdG8gbmV3SW5kZXhcbiAgICAgICAgX25ld0tleWVkRm9ybURhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgX25ld0tleWVkRm9ybURhdGEuc3BsaWNlKG5ld0luZGV4LCAwLCBrZXllZEZvcm1EYXRhW2luZGV4XSk7XG5cbiAgICAgICAgcmV0dXJuIF9uZXdLZXllZEZvcm1EYXRhO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3S2V5ZWRGb3JtRGF0YSA9IHJlT3JkZXJBcnJheSgpO1xuICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAge1xuICAgICAgICAgIGtleWVkRm9ybURhdGE6IG5ld0tleWVkRm9ybURhdGEsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IG9uQ2hhbmdlKGtleWVkVG9QbGFpbkZvcm1EYXRhKG5ld0tleWVkRm9ybURhdGEpLCBuZXdFcnJvclNjaGVtYSlcbiAgICAgICk7XG4gICAgfTtcbiAgfTtcblxuICBvbkNoYW5nZUZvckluZGV4ID0gaW5kZXggPT4ge1xuICAgIHJldHVybiAodmFsdWUsIGVycm9yU2NoZW1hKSA9PiB7XG4gICAgICBjb25zdCB7IGZvcm1EYXRhLCBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IG5ld0Zvcm1EYXRhID0gZm9ybURhdGEubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdHJlYXQgdW5kZWZpbmVkIGl0ZW1zIGFzIG51bGxzIHRvIGhhdmUgdmFsaWRhdGlvbi5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZGVncnVudC9qc29uc2NoZW1hL2lzc3Vlcy8yMDZcbiAgICAgICAgY29uc3QganNvblZhbHVlID0gdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IHZhbHVlO1xuICAgICAgICByZXR1cm4gaW5kZXggPT09IGkgPyBqc29uVmFsdWUgOiBpdGVtO1xuICAgICAgfSk7XG4gICAgICBvbkNoYW5nZShcbiAgICAgICAgbmV3Rm9ybURhdGEsXG4gICAgICAgIGVycm9yU2NoZW1hICYmXG4gICAgICAgICAgdGhpcy5wcm9wcy5lcnJvclNjaGVtYSAmJiB7XG4gICAgICAgICAgICAuLi50aGlzLnByb3BzLmVycm9yU2NoZW1hLFxuICAgICAgICAgICAgW2luZGV4XTogZXJyb3JTY2hlbWEsXG4gICAgICAgICAgfVxuICAgICAgKTtcbiAgICB9O1xuICB9O1xuXG4gIG9uU2VsZWN0Q2hhbmdlID0gdmFsdWUgPT4ge1xuICAgIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IHNjaGVtYSwgdWlTY2hlbWEsIGlkU2NoZW1hLCByZWdpc3RyeSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHJvb3RTY2hlbWEgfSA9IHJlZ2lzdHJ5O1xuICAgIGlmICghc2NoZW1hLmhhc093blByb3BlcnR5KFwiaXRlbXNcIikpIHtcbiAgICAgIGNvbnN0IHsgZmllbGRzIH0gPSByZWdpc3RyeTtcbiAgICAgIGNvbnN0IHsgVW5zdXBwb3J0ZWRGaWVsZCB9ID0gZmllbGRzO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8VW5zdXBwb3J0ZWRGaWVsZFxuICAgICAgICAgIHNjaGVtYT17c2NoZW1hfVxuICAgICAgICAgIGlkU2NoZW1hPXtpZFNjaGVtYX1cbiAgICAgICAgICByZWFzb249XCJNaXNzaW5nIGl0ZW1zIGRlZmluaXRpb25cIlxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGlzTXVsdGlTZWxlY3Qoc2NoZW1hLCByb290U2NoZW1hKSkge1xuICAgICAgLy8gSWYgYXJyYXkgaGFzIGVudW0gb3IgdW5pcXVlSXRlbXMgc2V0IHRvIHRydWUsIGNhbGwgcmVuZGVyTXVsdGlTZWxlY3QoKSB0byByZW5kZXIgdGhlIGRlZmF1bHQgbXVsdGlzZWxlY3Qgd2lkZ2V0IG9yIGEgY3VzdG9tIHdpZGdldCwgaWYgc3BlY2lmaWVkLlxuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyTXVsdGlTZWxlY3QoKTtcbiAgICB9XG4gICAgaWYgKGlzQ3VzdG9tV2lkZ2V0KHVpU2NoZW1hKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ3VzdG9tV2lkZ2V0KCk7XG4gICAgfVxuICAgIGlmIChpc0ZpeGVkSXRlbXMoc2NoZW1hKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRml4ZWRBcnJheSgpO1xuICAgIH1cbiAgICBpZiAoaXNGaWxlc0FycmF5KHNjaGVtYSwgdWlTY2hlbWEsIHJvb3RTY2hlbWEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJGaWxlcygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJOb3JtYWxBcnJheSgpO1xuICB9XG5cbiAgcmVuZGVyTm9ybWFsQXJyYXkoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2NoZW1hLFxuICAgICAgdWlTY2hlbWEsXG4gICAgICBlcnJvclNjaGVtYSxcbiAgICAgIGlkU2NoZW1hLFxuICAgICAgbmFtZSxcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICByZWFkb25seSxcbiAgICAgIGhpZGVFcnJvcixcbiAgICAgIGF1dG9mb2N1cyxcbiAgICAgIHJlZ2lzdHJ5LFxuICAgICAgb25CbHVyLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIGlkUHJlZml4LFxuICAgICAgaWRTZXBhcmF0b3IgPSBcIl9cIixcbiAgICAgIHJhd0Vycm9ycyxcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB0aXRsZSA9IHNjaGVtYS50aXRsZSA9PT0gdW5kZWZpbmVkID8gbmFtZSA6IHNjaGVtYS50aXRsZTtcbiAgICBjb25zdCB7IEFycmF5RmllbGRUZW1wbGF0ZSwgcm9vdFNjaGVtYSwgZmllbGRzLCBmb3JtQ29udGV4dCB9ID0gcmVnaXN0cnk7XG4gICAgY29uc3QgeyBUaXRsZUZpZWxkLCBEZXNjcmlwdGlvbkZpZWxkIH0gPSBmaWVsZHM7XG4gICAgY29uc3QgaXRlbXNTY2hlbWEgPSByZXRyaWV2ZVNjaGVtYShzY2hlbWEuaXRlbXMsIHJvb3RTY2hlbWEpO1xuICAgIGNvbnN0IGZvcm1EYXRhID0ga2V5ZWRUb1BsYWluRm9ybURhdGEodGhpcy5zdGF0ZS5rZXllZEZvcm1EYXRhKTtcbiAgICBjb25zdCBhcnJheVByb3BzID0ge1xuICAgICAgY2FuQWRkOiB0aGlzLmNhbkFkZEl0ZW0oZm9ybURhdGEpLFxuICAgICAgaXRlbXM6IHRoaXMuc3RhdGUua2V5ZWRGb3JtRGF0YS5tYXAoKGtleWVkSXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIGl0ZW0gfSA9IGtleWVkSXRlbTtcbiAgICAgICAgY29uc3QgaXRlbVNjaGVtYSA9IHJldHJpZXZlU2NoZW1hKHNjaGVtYS5pdGVtcywgcm9vdFNjaGVtYSwgaXRlbSk7XG4gICAgICAgIGNvbnN0IGl0ZW1FcnJvclNjaGVtYSA9IGVycm9yU2NoZW1hID8gZXJyb3JTY2hlbWFbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBpdGVtSWRQcmVmaXggPSBpZFNjaGVtYS4kaWQgKyBpZFNlcGFyYXRvciArIGluZGV4O1xuICAgICAgICBjb25zdCBpdGVtSWRTY2hlbWEgPSB0b0lkU2NoZW1hKFxuICAgICAgICAgIGl0ZW1TY2hlbWEsXG4gICAgICAgICAgaXRlbUlkUHJlZml4LFxuICAgICAgICAgIHJvb3RTY2hlbWEsXG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpZFByZWZpeCxcbiAgICAgICAgICBpZFNlcGFyYXRvclxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJBcnJheUZpZWxkSXRlbSh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGNhbk1vdmVVcDogaW5kZXggPiAwLFxuICAgICAgICAgIGNhbk1vdmVEb3duOiBpbmRleCA8IGZvcm1EYXRhLmxlbmd0aCAtIDEsXG4gICAgICAgICAgaXRlbVNjaGVtYTogaXRlbVNjaGVtYSxcbiAgICAgICAgICBpdGVtSWRTY2hlbWEsXG4gICAgICAgICAgaXRlbUVycm9yU2NoZW1hLFxuICAgICAgICAgIGl0ZW1EYXRhOiBpdGVtLFxuICAgICAgICAgIGl0ZW1VaVNjaGVtYTogdWlTY2hlbWEuaXRlbXMsXG4gICAgICAgICAgYXV0b2ZvY3VzOiBhdXRvZm9jdXMgJiYgaW5kZXggPT09IDAsXG4gICAgICAgICAgb25CbHVyLFxuICAgICAgICAgIG9uRm9jdXMsXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBjbGFzc05hbWU6IGBmaWVsZCBmaWVsZC1hcnJheSBmaWVsZC1hcnJheS1vZi0ke2l0ZW1zU2NoZW1hLnR5cGV9YCxcbiAgICAgIERlc2NyaXB0aW9uRmllbGQsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGlkU2NoZW1hLFxuICAgICAgdWlTY2hlbWEsXG4gICAgICBvbkFkZENsaWNrOiB0aGlzLm9uQWRkQ2xpY2ssXG4gICAgICByZWFkb25seSxcbiAgICAgIGhpZGVFcnJvcixcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgc2NoZW1hLFxuICAgICAgdGl0bGUsXG4gICAgICBUaXRsZUZpZWxkLFxuICAgICAgZm9ybUNvbnRleHQsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIHJhd0Vycm9ycyxcbiAgICAgIHJlZ2lzdHJ5LFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiBhIGN1c3RvbSByZW5kZXIgZnVuY3Rpb24gd2FzIHBhc3NlZCBpblxuICAgIGNvbnN0IENvbXBvbmVudCA9XG4gICAgICB1aVNjaGVtYVtcInVpOkFycmF5RmllbGRUZW1wbGF0ZVwiXSB8fFxuICAgICAgQXJyYXlGaWVsZFRlbXBsYXRlIHx8XG4gICAgICBEZWZhdWx0Tm9ybWFsQXJyYXlGaWVsZFRlbXBsYXRlO1xuICAgIHJldHVybiA8Q29tcG9uZW50IHsuLi5hcnJheVByb3BzfSAvPjtcbiAgfVxuXG4gIHJlbmRlckN1c3RvbVdpZGdldCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzY2hlbWEsXG4gICAgICBpZFNjaGVtYSxcbiAgICAgIHVpU2NoZW1hLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICByZWFkb25seSxcbiAgICAgIGhpZGVFcnJvcixcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBhdXRvZm9jdXMsXG4gICAgICBvbkJsdXIsXG4gICAgICBvbkZvY3VzLFxuICAgICAgZm9ybURhdGE6IGl0ZW1zLFxuICAgICAgcmVnaXN0cnksXG4gICAgICByYXdFcnJvcnMsXG4gICAgICBuYW1lLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHsgd2lkZ2V0cywgZm9ybUNvbnRleHQgfSA9IHJlZ2lzdHJ5O1xuICAgIGNvbnN0IHRpdGxlID0gc2NoZW1hLnRpdGxlIHx8IG5hbWU7XG5cbiAgICBjb25zdCB7IHdpZGdldCwgLi4ub3B0aW9ucyB9ID0ge1xuICAgICAgLi4uZ2V0VWlPcHRpb25zKHVpU2NoZW1hKSxcbiAgICB9O1xuICAgIGNvbnN0IFdpZGdldCA9IGdldFdpZGdldChzY2hlbWEsIHdpZGdldCwgd2lkZ2V0cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxXaWRnZXRcbiAgICAgICAgaWQ9e2lkU2NoZW1hICYmIGlkU2NoZW1hLiRpZH1cbiAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgb25DaGFuZ2U9e3RoaXMub25TZWxlY3RDaGFuZ2V9XG4gICAgICAgIG9uQmx1cj17b25CbHVyfVxuICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICBzY2hlbWE9e3NjaGVtYX1cbiAgICAgICAgdWlTY2hlbWE9e3VpU2NoZW1hfVxuICAgICAgICByZWdpc3RyeT17cmVnaXN0cnl9XG4gICAgICAgIHZhbHVlPXtpdGVtc31cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICByZWFkb25seT17cmVhZG9ubHl9XG4gICAgICAgIGhpZGVFcnJvcj17aGlkZUVycm9yfVxuICAgICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICAgIGxhYmVsPXt0aXRsZX1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICBmb3JtQ29udGV4dD17Zm9ybUNvbnRleHR9XG4gICAgICAgIGF1dG9mb2N1cz17YXV0b2ZvY3VzfVxuICAgICAgICByYXdFcnJvcnM9e3Jhd0Vycm9yc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlck11bHRpU2VsZWN0KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNjaGVtYSxcbiAgICAgIGlkU2NoZW1hLFxuICAgICAgdWlTY2hlbWEsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGRpc2FibGVkLFxuICAgICAgcmVhZG9ubHksXG4gICAgICByZXF1aXJlZCxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgYXV0b2ZvY3VzLFxuICAgICAgb25CbHVyLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIHJlZ2lzdHJ5LFxuICAgICAgcmF3RXJyb3JzLFxuICAgICAgbmFtZSxcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMucHJvcHMuZm9ybURhdGE7XG4gICAgY29uc3QgeyB3aWRnZXRzLCByb290U2NoZW1hLCBmb3JtQ29udGV4dCB9ID0gcmVnaXN0cnk7XG4gICAgY29uc3QgaXRlbXNTY2hlbWEgPSByZXRyaWV2ZVNjaGVtYShzY2hlbWEuaXRlbXMsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKTtcbiAgICBjb25zdCB0aXRsZSA9IHNjaGVtYS50aXRsZSB8fCBuYW1lO1xuICAgIGNvbnN0IGVudW1PcHRpb25zID0gb3B0aW9uc0xpc3QoaXRlbXNTY2hlbWEpO1xuICAgIGNvbnN0IHsgd2lkZ2V0ID0gXCJzZWxlY3RcIiwgLi4ub3B0aW9ucyB9ID0ge1xuICAgICAgLi4uZ2V0VWlPcHRpb25zKHVpU2NoZW1hKSxcbiAgICAgIGVudW1PcHRpb25zLFxuICAgIH07XG4gICAgY29uc3QgV2lkZ2V0ID0gZ2V0V2lkZ2V0KHNjaGVtYSwgd2lkZ2V0LCB3aWRnZXRzKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFdpZGdldFxuICAgICAgICBpZD17aWRTY2hlbWEgJiYgaWRTY2hlbWEuJGlkfVxuICAgICAgICBtdWx0aXBsZVxuICAgICAgICBvbkNoYW5nZT17dGhpcy5vblNlbGVjdENoYW5nZX1cbiAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgIHNjaGVtYT17c2NoZW1hfVxuICAgICAgICB1aVNjaGVtYT17dWlTY2hlbWF9XG4gICAgICAgIHJlZ2lzdHJ5PXtyZWdpc3RyeX1cbiAgICAgICAgdmFsdWU9e2l0ZW1zfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIHJlYWRvbmx5PXtyZWFkb25seX1cbiAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICBsYWJlbD17dGl0bGV9XG4gICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgZm9ybUNvbnRleHQ9e2Zvcm1Db250ZXh0fVxuICAgICAgICBhdXRvZm9jdXM9e2F1dG9mb2N1c31cbiAgICAgICAgcmF3RXJyb3JzPXtyYXdFcnJvcnN9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICByZW5kZXJGaWxlcygpIHtcbiAgICBjb25zdCB7XG4gICAgICBzY2hlbWEsXG4gICAgICB1aVNjaGVtYSxcbiAgICAgIGlkU2NoZW1hLFxuICAgICAgbmFtZSxcbiAgICAgIGRpc2FibGVkLFxuICAgICAgcmVhZG9ubHksXG4gICAgICBhdXRvZm9jdXMsXG4gICAgICBvbkJsdXIsXG4gICAgICBvbkZvY3VzLFxuICAgICAgcmVnaXN0cnksXG4gICAgICByYXdFcnJvcnMsXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgdGl0bGUgPSBzY2hlbWEudGl0bGUgfHwgbmFtZTtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMucHJvcHMuZm9ybURhdGE7XG4gICAgY29uc3QgeyB3aWRnZXRzLCBmb3JtQ29udGV4dCB9ID0gcmVnaXN0cnk7XG4gICAgY29uc3QgeyB3aWRnZXQgPSBcImZpbGVzXCIsIC4uLm9wdGlvbnMgfSA9IGdldFVpT3B0aW9ucyh1aVNjaGVtYSk7XG4gICAgY29uc3QgV2lkZ2V0ID0gZ2V0V2lkZ2V0KHNjaGVtYSwgd2lkZ2V0LCB3aWRnZXRzKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFdpZGdldFxuICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICBpZD17aWRTY2hlbWEgJiYgaWRTY2hlbWEuJGlkfVxuICAgICAgICBtdWx0aXBsZVxuICAgICAgICBvbkNoYW5nZT17dGhpcy5vblNlbGVjdENoYW5nZX1cbiAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgIHNjaGVtYT17c2NoZW1hfVxuICAgICAgICB1aVNjaGVtYT17dWlTY2hlbWF9XG4gICAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgICAgdmFsdWU9e2l0ZW1zfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIHJlYWRvbmx5PXtyZWFkb25seX1cbiAgICAgICAgcmVnaXN0cnk9e3JlZ2lzdHJ5fVxuICAgICAgICBmb3JtQ29udGV4dD17Zm9ybUNvbnRleHR9XG4gICAgICAgIGF1dG9mb2N1cz17YXV0b2ZvY3VzfVxuICAgICAgICByYXdFcnJvcnM9e3Jhd0Vycm9yc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlckZpeGVkQXJyYXkoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2NoZW1hLFxuICAgICAgdWlTY2hlbWEsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGVycm9yU2NoZW1hLFxuICAgICAgaWRQcmVmaXgsXG4gICAgICBpZFNlcGFyYXRvciA9IFwiX1wiLFxuICAgICAgaWRTY2hlbWEsXG4gICAgICBuYW1lLFxuICAgICAgcmVxdWlyZWQsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIHJlYWRvbmx5LFxuICAgICAgYXV0b2ZvY3VzLFxuICAgICAgcmVnaXN0cnksXG4gICAgICBvbkJsdXIsXG4gICAgICBvbkZvY3VzLFxuICAgICAgcmF3RXJyb3JzLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHRpdGxlID0gc2NoZW1hLnRpdGxlIHx8IG5hbWU7XG4gICAgbGV0IGl0ZW1zID0gdGhpcy5wcm9wcy5mb3JtRGF0YTtcbiAgICBjb25zdCB7IEFycmF5RmllbGRUZW1wbGF0ZSwgcm9vdFNjaGVtYSwgZmllbGRzLCBmb3JtQ29udGV4dCB9ID0gcmVnaXN0cnk7XG4gICAgY29uc3QgeyBUaXRsZUZpZWxkIH0gPSBmaWVsZHM7XG4gICAgY29uc3QgaXRlbVNjaGVtYXMgPSBzY2hlbWEuaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT5cbiAgICAgIHJldHJpZXZlU2NoZW1hKGl0ZW0sIHJvb3RTY2hlbWEsIGZvcm1EYXRhW2luZGV4XSlcbiAgICApO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxTY2hlbWEgPSBhbGxvd0FkZGl0aW9uYWxJdGVtcyhzY2hlbWEpXG4gICAgICA/IHJldHJpZXZlU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMsIHJvb3RTY2hlbWEsIGZvcm1EYXRhKVxuICAgICAgOiBudWxsO1xuXG4gICAgaWYgKCFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPCBpdGVtU2NoZW1hcy5sZW5ndGgpIHtcbiAgICAgIC8vIHRvIG1ha2Ugc3VyZSBhdCBsZWFzdCBhbGwgZml4ZWQgaXRlbXMgYXJlIGdlbmVyYXRlZFxuICAgICAgaXRlbXMgPSBpdGVtcyB8fCBbXTtcbiAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KG5ldyBBcnJheShpdGVtU2NoZW1hcy5sZW5ndGggLSBpdGVtcy5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBhcmUgdGhlIHByb3BzIHBhc3NlZCBpbnRvIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICBjb25zdCBhcnJheVByb3BzID0ge1xuICAgICAgY2FuQWRkOiB0aGlzLmNhbkFkZEl0ZW0oaXRlbXMpICYmIGFkZGl0aW9uYWxTY2hlbWEsXG4gICAgICBjbGFzc05hbWU6IFwiZmllbGQgZmllbGQtYXJyYXkgZmllbGQtYXJyYXktZml4ZWQtaXRlbXNcIixcbiAgICAgIGRpc2FibGVkLFxuICAgICAgaWRTY2hlbWEsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGl0ZW1zOiB0aGlzLnN0YXRlLmtleWVkRm9ybURhdGEubWFwKChrZXllZEl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCBpdGVtIH0gPSBrZXllZEl0ZW07XG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWwgPSBpbmRleCA+PSBpdGVtU2NoZW1hcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGl0ZW1TY2hlbWEgPSBhZGRpdGlvbmFsXG4gICAgICAgICAgPyByZXRyaWV2ZVNjaGVtYShzY2hlbWEuYWRkaXRpb25hbEl0ZW1zLCByb290U2NoZW1hLCBpdGVtKVxuICAgICAgICAgIDogaXRlbVNjaGVtYXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBpdGVtSWRQcmVmaXggPSBpZFNjaGVtYS4kaWQgKyBpZFNlcGFyYXRvciArIGluZGV4O1xuICAgICAgICBjb25zdCBpdGVtSWRTY2hlbWEgPSB0b0lkU2NoZW1hKFxuICAgICAgICAgIGl0ZW1TY2hlbWEsXG4gICAgICAgICAgaXRlbUlkUHJlZml4LFxuICAgICAgICAgIHJvb3RTY2hlbWEsXG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpZFByZWZpeCxcbiAgICAgICAgICBpZFNlcGFyYXRvclxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpdGVtVWlTY2hlbWEgPSBhZGRpdGlvbmFsXG4gICAgICAgICAgPyB1aVNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgfHwge31cbiAgICAgICAgICA6IEFycmF5LmlzQXJyYXkodWlTY2hlbWEuaXRlbXMpXG4gICAgICAgICAgPyB1aVNjaGVtYS5pdGVtc1tpbmRleF1cbiAgICAgICAgICA6IHVpU2NoZW1hLml0ZW1zIHx8IHt9O1xuICAgICAgICBjb25zdCBpdGVtRXJyb3JTY2hlbWEgPSBlcnJvclNjaGVtYSA/IGVycm9yU2NoZW1hW2luZGV4XSA6IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJBcnJheUZpZWxkSXRlbSh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGNhblJlbW92ZTogYWRkaXRpb25hbCxcbiAgICAgICAgICBjYW5Nb3ZlVXA6IGluZGV4ID49IGl0ZW1TY2hlbWFzLmxlbmd0aCArIDEsXG4gICAgICAgICAgY2FuTW92ZURvd246IGFkZGl0aW9uYWwgJiYgaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxLFxuICAgICAgICAgIGl0ZW1TY2hlbWEsXG4gICAgICAgICAgaXRlbURhdGE6IGl0ZW0sXG4gICAgICAgICAgaXRlbVVpU2NoZW1hLFxuICAgICAgICAgIGl0ZW1JZFNjaGVtYSxcbiAgICAgICAgICBpdGVtRXJyb3JTY2hlbWEsXG4gICAgICAgICAgYXV0b2ZvY3VzOiBhdXRvZm9jdXMgJiYgaW5kZXggPT09IDAsXG4gICAgICAgICAgb25CbHVyLFxuICAgICAgICAgIG9uRm9jdXMsXG4gICAgICAgIH0pO1xuICAgICAgfSksXG4gICAgICBvbkFkZENsaWNrOiB0aGlzLm9uQWRkQ2xpY2ssXG4gICAgICByZWFkb25seSxcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgcmVnaXN0cnksXG4gICAgICBzY2hlbWEsXG4gICAgICB1aVNjaGVtYSxcbiAgICAgIHRpdGxlLFxuICAgICAgVGl0bGVGaWVsZCxcbiAgICAgIGZvcm1Db250ZXh0LFxuICAgICAgcmF3RXJyb3JzLFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiBhIGN1c3RvbSB0ZW1wbGF0ZSB0ZW1wbGF0ZSB3YXMgcGFzc2VkIGluXG4gICAgY29uc3QgVGVtcGxhdGUgPVxuICAgICAgdWlTY2hlbWFbXCJ1aTpBcnJheUZpZWxkVGVtcGxhdGVcIl0gfHxcbiAgICAgIEFycmF5RmllbGRUZW1wbGF0ZSB8fFxuICAgICAgRGVmYXVsdEZpeGVkQXJyYXlGaWVsZFRlbXBsYXRlO1xuICAgIHJldHVybiA8VGVtcGxhdGUgey4uLmFycmF5UHJvcHN9IC8+O1xuICB9XG5cbiAgcmVuZGVyQXJyYXlGaWVsZEl0ZW0ocHJvcHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBrZXksXG4gICAgICBpbmRleCxcbiAgICAgIGNhblJlbW92ZSA9IHRydWUsXG4gICAgICBjYW5Nb3ZlVXAgPSB0cnVlLFxuICAgICAgY2FuTW92ZURvd24gPSB0cnVlLFxuICAgICAgaXRlbVNjaGVtYSxcbiAgICAgIGl0ZW1EYXRhLFxuICAgICAgaXRlbVVpU2NoZW1hLFxuICAgICAgaXRlbUlkU2NoZW1hLFxuICAgICAgaXRlbUVycm9yU2NoZW1hLFxuICAgICAgYXV0b2ZvY3VzLFxuICAgICAgb25CbHVyLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIHJhd0Vycm9ycyxcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgeyBkaXNhYmxlZCwgcmVhZG9ubHksIHVpU2NoZW1hLCByZWdpc3RyeSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7XG4gICAgICBmaWVsZHM6IHsgU2NoZW1hRmllbGQgfSxcbiAgICB9ID0gcmVnaXN0cnk7XG4gICAgY29uc3QgeyBvcmRlcmFibGUgPSB0cnVlLCByZW1vdmFibGUgPSB0cnVlIH0gPSBnZXRVaU9wdGlvbnModWlTY2hlbWEpO1xuICAgIGNvbnN0IGhhcyA9IHtcbiAgICAgIG1vdmVVcDogb3JkZXJhYmxlICYmIGNhbk1vdmVVcCxcbiAgICAgIG1vdmVEb3duOiBvcmRlcmFibGUgJiYgY2FuTW92ZURvd24sXG4gICAgICByZW1vdmU6IHJlbW92YWJsZSAmJiBjYW5SZW1vdmUsXG4gICAgfTtcbiAgICBoYXMudG9vbGJhciA9IE9iamVjdC5rZXlzKGhhcykuc29tZShrZXkgPT4gaGFzW2tleV0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoaWxkcmVuOiAoXG4gICAgICAgIDxTY2hlbWFGaWVsZFxuICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICBzY2hlbWE9e2l0ZW1TY2hlbWF9XG4gICAgICAgICAgdWlTY2hlbWE9e2l0ZW1VaVNjaGVtYX1cbiAgICAgICAgICBmb3JtRGF0YT17aXRlbURhdGF9XG4gICAgICAgICAgZXJyb3JTY2hlbWE9e2l0ZW1FcnJvclNjaGVtYX1cbiAgICAgICAgICBpZFByZWZpeD17dGhpcy5wcm9wcy5pZFByZWZpeH1cbiAgICAgICAgICBpZFNlcGFyYXRvcj17dGhpcy5wcm9wcy5pZFNlcGFyYXRvcn1cbiAgICAgICAgICBpZFNjaGVtYT17aXRlbUlkU2NoZW1hfVxuICAgICAgICAgIHJlcXVpcmVkPXt0aGlzLmlzSXRlbVJlcXVpcmVkKGl0ZW1TY2hlbWEpfVxuICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlRm9ySW5kZXgoaW5kZXgpfVxuICAgICAgICAgIG9uQmx1cj17b25CbHVyfVxuICAgICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgICAgcmVnaXN0cnk9e3RoaXMucHJvcHMucmVnaXN0cnl9XG4gICAgICAgICAgZGlzYWJsZWQ9e3RoaXMucHJvcHMuZGlzYWJsZWR9XG4gICAgICAgICAgcmVhZG9ubHk9e3RoaXMucHJvcHMucmVhZG9ubHl9XG4gICAgICAgICAgaGlkZUVycm9yPXt0aGlzLnByb3BzLmhpZGVFcnJvcn1cbiAgICAgICAgICBhdXRvZm9jdXM9e2F1dG9mb2N1c31cbiAgICAgICAgICByYXdFcnJvcnM9e3Jhd0Vycm9yc31cbiAgICAgICAgLz5cbiAgICAgICksXG4gICAgICBjbGFzc05hbWU6IFwiYXJyYXktaXRlbVwiLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBoYXNUb29sYmFyOiBoYXMudG9vbGJhcixcbiAgICAgIGhhc01vdmVVcDogaGFzLm1vdmVVcCxcbiAgICAgIGhhc01vdmVEb3duOiBoYXMubW92ZURvd24sXG4gICAgICBoYXNSZW1vdmU6IGhhcy5yZW1vdmUsXG4gICAgICBpbmRleCxcbiAgICAgIGtleSxcbiAgICAgIG9uQWRkSW5kZXhDbGljazogdGhpcy5vbkFkZEluZGV4Q2xpY2ssXG4gICAgICBvbkRyb3BJbmRleENsaWNrOiB0aGlzLm9uRHJvcEluZGV4Q2xpY2ssXG4gICAgICBvblJlb3JkZXJDbGljazogdGhpcy5vblJlb3JkZXJDbGljayxcbiAgICAgIHJlYWRvbmx5LFxuICAgIH07XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBBcnJheUZpZWxkLnByb3BUeXBlcyA9IHR5cGVzLmZpZWxkUHJvcHM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFycmF5RmllbGQ7XG4iXX0=