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