@pie-element/hotspot 9.1.0 → 9.2.0-mui-update.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/configure/CHANGELOG.md +66 -0
  3. package/configure/lib/DeleteWidget.js +31 -44
  4. package/configure/lib/DeleteWidget.js.map +1 -1
  5. package/configure/lib/__tests__/DeleteWidget.test.js +60 -0
  6. package/configure/lib/__tests__/hotspot-container.test.js +377 -0
  7. package/configure/lib/__tests__/hotspot-drawable.test.js +233 -0
  8. package/configure/lib/__tests__/index.test.js +211 -0
  9. package/configure/lib/__tests__/root.test.js +440 -0
  10. package/configure/lib/__tests__/utils.test.js +287 -0
  11. package/configure/lib/button.js +27 -46
  12. package/configure/lib/button.js.map +1 -1
  13. package/configure/lib/buttons/circle.js +21 -28
  14. package/configure/lib/buttons/circle.js.map +1 -1
  15. package/configure/lib/buttons/polygon.js +27 -34
  16. package/configure/lib/buttons/polygon.js.map +1 -1
  17. package/configure/lib/buttons/rectangle.js +27 -34
  18. package/configure/lib/buttons/rectangle.js.map +1 -1
  19. package/configure/lib/defaults.js +3 -4
  20. package/configure/lib/defaults.js.map +1 -1
  21. package/configure/lib/hotspot-circle.js +133 -199
  22. package/configure/lib/hotspot-circle.js.map +1 -1
  23. package/configure/lib/hotspot-container.js +251 -356
  24. package/configure/lib/hotspot-container.js.map +1 -1
  25. package/configure/lib/hotspot-drawable.js +361 -473
  26. package/configure/lib/hotspot-drawable.js.map +1 -1
  27. package/configure/lib/hotspot-palette.js +93 -140
  28. package/configure/lib/hotspot-palette.js.map +1 -1
  29. package/configure/lib/hotspot-polygon.js +213 -318
  30. package/configure/lib/hotspot-polygon.js.map +1 -1
  31. package/configure/lib/hotspot-rectangle.js +129 -193
  32. package/configure/lib/hotspot-rectangle.js.map +1 -1
  33. package/configure/lib/icons.js +1 -1
  34. package/configure/lib/icons.js.map +1 -1
  35. package/configure/lib/image-konva.js +47 -87
  36. package/configure/lib/image-konva.js.map +1 -1
  37. package/configure/lib/index.js +163 -223
  38. package/configure/lib/index.js.map +1 -1
  39. package/configure/lib/root.js +302 -394
  40. package/configure/lib/root.js.map +1 -1
  41. package/configure/lib/shapes/circle.js +70 -102
  42. package/configure/lib/shapes/circle.js.map +1 -1
  43. package/configure/lib/shapes/index.js +5 -13
  44. package/configure/lib/shapes/index.js.map +1 -1
  45. package/configure/lib/shapes/polygon.js +65 -97
  46. package/configure/lib/shapes/polygon.js.map +1 -1
  47. package/configure/lib/shapes/rectagle.js +70 -102
  48. package/configure/lib/shapes/rectagle.js.map +1 -1
  49. package/configure/lib/shapes/utils.js +3 -9
  50. package/configure/lib/shapes/utils.js.map +1 -1
  51. package/configure/lib/upload-control.js +26 -53
  52. package/configure/lib/upload-control.js.map +1 -1
  53. package/configure/lib/utils.js +85 -138
  54. package/configure/lib/utils.js.map +1 -1
  55. package/configure/package.json +11 -10
  56. package/configure/src/__tests__/index.test.js +11 -5
  57. package/configure/src/button.jsx +12 -20
  58. package/configure/src/hotspot-circle.jsx +5 -18
  59. package/configure/src/hotspot-container.jsx +82 -98
  60. package/configure/src/hotspot-drawable.jsx +43 -45
  61. package/configure/src/hotspot-palette.jsx +45 -37
  62. package/configure/src/hotspot-polygon.jsx +4 -20
  63. package/configure/src/hotspot-rectangle.jsx +4 -17
  64. package/configure/src/index.js +12 -2
  65. package/configure/src/root.jsx +85 -79
  66. package/configure/src/upload-control.jsx +6 -16
  67. package/controller/CHANGELOG.md +52 -0
  68. package/controller/lib/__tests__/index.test.js +586 -0
  69. package/controller/lib/__tests__/utils.test.js +8 -0
  70. package/controller/lib/defaults.js +3 -4
  71. package/controller/lib/defaults.js.map +1 -1
  72. package/controller/lib/index.js +152 -206
  73. package/controller/lib/index.js.map +1 -1
  74. package/controller/lib/utils.js +15 -35
  75. package/controller/lib/utils.js.map +1 -1
  76. package/controller/package.json +2 -2
  77. package/docs/demo/pie.manifest.json +11 -0
  78. package/lib/__tests__/container.test.js +221 -0
  79. package/lib/__tests__/index.test.js +113 -0
  80. package/lib/__tests__/polygon.test.js +245 -0
  81. package/lib/__tests__/rectangle.test.js +236 -0
  82. package/lib/__tests__/session-updater.test.js +69 -0
  83. package/lib/hotspot/circle.js +111 -170
  84. package/lib/hotspot/circle.js.map +1 -1
  85. package/lib/hotspot/container.js +175 -261
  86. package/lib/hotspot/container.js.map +1 -1
  87. package/lib/hotspot/icons.js +1 -1
  88. package/lib/hotspot/icons.js.map +1 -1
  89. package/lib/hotspot/image-konva-tooltip.js +66 -113
  90. package/lib/hotspot/image-konva-tooltip.js.map +1 -1
  91. package/lib/hotspot/index.js +136 -199
  92. package/lib/hotspot/index.js.map +1 -1
  93. package/lib/hotspot/polygon.js +151 -215
  94. package/lib/hotspot/polygon.js.map +1 -1
  95. package/lib/hotspot/rectangle.js +130 -186
  96. package/lib/hotspot/rectangle.js.map +1 -1
  97. package/lib/index.js +188 -257
  98. package/lib/index.js.map +1 -1
  99. package/lib/session-updater.js +13 -19
  100. package/lib/session-updater.js.map +1 -1
  101. package/package.json +14 -11
  102. package/src/hotspot/circle.jsx +2 -13
  103. package/src/hotspot/container.jsx +35 -50
  104. package/src/hotspot/index.jsx +16 -28
  105. package/src/hotspot/polygon.jsx +4 -13
  106. package/src/hotspot/rectangle.jsx +4 -13
  107. package/src/index.js +21 -12
  108. package/LICENSE.md +0 -5
  109. package/configure/node_modules/debug/CHANGELOG.md +0 -395
  110. package/configure/node_modules/debug/LICENSE +0 -19
  111. package/configure/node_modules/debug/README.md +0 -437
  112. package/configure/node_modules/debug/node.js +0 -1
  113. package/configure/node_modules/debug/package.json +0 -51
  114. package/configure/node_modules/debug/src/browser.js +0 -180
  115. package/configure/node_modules/debug/src/common.js +0 -249
  116. package/configure/node_modules/debug/src/index.js +0 -12
  117. package/configure/node_modules/debug/src/node.js +0 -177
@@ -1,422 +1,330 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
- exports["default"] = exports.Root = void 0;
9
-
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
15
-
16
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
-
18
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
19
-
20
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
21
-
7
+ exports.default = exports.Root = void 0;
22
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
23
-
24
9
  var _react = _interopRequireDefault(require("react"));
25
-
26
10
  var _configUi = require("@pie-lib/config-ui");
27
-
28
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
29
-
30
12
  var _editableHtml = _interopRequireDefault(require("@pie-lib/editable-html"));
31
-
32
- var _styles = require("@material-ui/core/styles");
33
-
34
- var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
35
-
36
- var _Info = _interopRequireDefault(require("@material-ui/icons/Info"));
37
-
38
- var _Tooltip = _interopRequireDefault(require("@material-ui/core/Tooltip"));
39
-
13
+ var _styles = require("@mui/material/styles");
14
+ var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
15
+ var _Info = _interopRequireDefault(require("@mui/icons-material/Info"));
16
+ var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
40
17
  var _hotspotPalette = _interopRequireDefault(require("./hotspot-palette"));
41
-
42
18
  var _hotspotContainer = _interopRequireDefault(require("./hotspot-container"));
43
-
44
19
  var _utils = require("./utils");
45
-
46
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
47
-
48
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
49
-
50
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
51
-
52
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
53
-
54
- var Panel = _configUi.settings.Panel,
55
- toggle = _configUi.settings.toggle,
56
- dropdown = _configUi.settings.dropdown;
57
-
58
- var Root = /*#__PURE__*/function (_React$Component) {
59
- (0, _inherits2["default"])(Root, _React$Component);
60
-
61
- var _super = _createSuper(Root);
62
-
63
- function Root() {
64
- var _this;
65
-
66
- (0, _classCallCheck2["default"])(this, Root);
67
-
68
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
69
- args[_key] = arguments[_key];
70
- }
71
-
72
- _this = _super.call.apply(_super, [this].concat(args));
73
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleColorChange", function (fieldType, color) {
74
- var onColorChanged = _this.props.onColorChanged;
75
- var cType = "".concat(fieldType, "Color");
20
+ const {
21
+ Panel,
22
+ toggle,
23
+ dropdown
24
+ } = _configUi.settings;
25
+ const DimensionsContainer = (0, _styles.styled)('div')(({
26
+ theme
27
+ }) => ({
28
+ display: 'flex',
29
+ marginBottom: theme.spacing(1.5)
30
+ }));
31
+ const FieldContainer = (0, _styles.styled)('div')({
32
+ flex: 1,
33
+ width: '90%'
34
+ });
35
+ const PromptContainer = (0, _styles.styled)(_configUi.InputContainer)(({
36
+ theme
37
+ }) => ({
38
+ paddingTop: theme.spacing(1),
39
+ marginTop: theme.spacing(2),
40
+ marginBottom: theme.spacing(2),
41
+ width: '100%'
42
+ }));
43
+ const SubHeading = (0, _styles.styled)(_Typography.default)(({
44
+ theme
45
+ }) => ({
46
+ marginRight: theme.spacing(1)
47
+ }));
48
+ const FlexContainer = (0, _styles.styled)('div')({
49
+ display: 'flex',
50
+ alignItems: 'center'
51
+ });
52
+ const StyledTooltip = (0, _styles.styled)(_Tooltip.default)(({
53
+ theme
54
+ }) => ({
55
+ '& .MuiTooltip-tooltip': {
56
+ fontSize: theme.typography.fontSize - 2,
57
+ whiteSpace: 'pre',
58
+ maxWidth: '500px'
59
+ }
60
+ }));
61
+ const ErrorText = (0, _styles.styled)('div')(({
62
+ theme
63
+ }) => ({
64
+ fontSize: theme.typography.fontSize - 2,
65
+ color: theme.palette.error.main,
66
+ paddingTop: theme.spacing(1)
67
+ }));
68
+ class Root extends _react.default.Component {
69
+ constructor(...args) {
70
+ super(...args);
71
+ (0, _defineProperty2.default)(this, "handleColorChange", (fieldType, color) => {
72
+ const {
73
+ onColorChanged
74
+ } = this.props;
75
+ const cType = `${fieldType}Color`;
76
76
  onColorChanged(cType, color);
77
77
  });
78
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOnUpdateImageDimensions", function (value, resizeType) {
79
- var _this$props = _this.props,
80
- _this$props$model = _this$props.model,
81
- dimensions = _this$props$model.dimensions,
82
- shapes = _this$props$model.shapes,
83
- _this$props$configura = _this$props.configuration.preserveAspectRatio,
84
- preserveAspectRatio = _this$props$configura === void 0 ? {} : _this$props$configura,
85
- onUpdateImageDimension = _this$props.onUpdateImageDimension,
86
- onUpdateShapes = _this$props.onUpdateShapes;
87
-
88
- var nextImageDimensions = _objectSpread(_objectSpread({}, dimensions), {}, (0, _defineProperty2["default"])({}, resizeType, value)); // if preserveAspectRatio.enabled, updateImageDimensions function makes sure aspect ratio is kept
89
-
90
-
91
- var updatedDimensions = (0, _utils.updateImageDimensions)(dimensions, nextImageDimensions, preserveAspectRatio.enabled, resizeType); // transform shapes map into shapes array
92
-
93
- var shapesArray = (0, _utils.getAllShapes)(shapes); // transform all the shapes to fit the re-sized image
78
+ (0, _defineProperty2.default)(this, "handleOnUpdateImageDimensions", (value, resizeType) => {
79
+ const {
80
+ model: {
81
+ dimensions,
82
+ shapes
83
+ },
84
+ configuration: {
85
+ preserveAspectRatio = {}
86
+ },
87
+ onUpdateImageDimension,
88
+ onUpdateShapes
89
+ } = this.props;
90
+ const nextImageDimensions = {
91
+ ...dimensions,
92
+ [resizeType]: value
93
+ };
94
94
 
95
- var updatedShapes = (0, _utils.getUpdatedShapes)(dimensions, updatedDimensions, shapesArray); // transform shapes array back into shapes map
95
+ // if preserveAspectRatio.enabled, updateImageDimensions function makes sure aspect ratio is kept
96
+ const updatedDimensions = (0, _utils.updateImageDimensions)(dimensions, nextImageDimensions, preserveAspectRatio.enabled, resizeType);
97
+ // transform shapes map into shapes array
98
+ const shapesArray = (0, _utils.getAllShapes)(shapes);
99
+ // transform all the shapes to fit the re-sized image
100
+ const updatedShapes = (0, _utils.getUpdatedShapes)(dimensions, updatedDimensions, shapesArray);
101
+ // transform shapes array back into shapes map
96
102
 
97
103
  onUpdateShapes((0, _utils.groupShapes)(updatedShapes));
98
104
  onUpdateImageDimension(updatedDimensions);
99
105
  });
100
- return _this;
101
106
  }
102
-
103
- (0, _createClass2["default"])(Root, [{
104
- key: "render",
105
- value: function render() {
106
- var _this2 = this;
107
-
108
- var _this$props2 = this.props,
109
- classes = _this$props2.classes,
110
- configuration = _this$props2.configuration,
111
- model = _this$props2.model,
112
- imageSupport = _this$props2.imageSupport,
113
- uploadSoundSupport = _this$props2.uploadSoundSupport,
114
- onConfigurationChanged = _this$props2.onConfigurationChanged,
115
- onImageUpload = _this$props2.onImageUpload,
116
- onModelChangedByConfig = _this$props2.onModelChangedByConfig,
117
- onPromptChanged = _this$props2.onPromptChanged,
118
- onRationaleChanged = _this$props2.onRationaleChanged,
119
- onUpdateImageDimension = _this$props2.onUpdateImageDimension,
120
- onTeacherInstructionsChanged = _this$props2.onTeacherInstructionsChanged,
121
- onUpdateShapes = _this$props2.onUpdateShapes;
122
-
123
- var _ref = configuration || {},
124
- _ref$baseInputConfigu = _ref.baseInputConfiguration,
125
- baseInputConfiguration = _ref$baseInputConfigu === void 0 ? {} : _ref$baseInputConfigu,
126
- _ref$contentDimension = _ref.contentDimensions,
127
- contentDimensions = _ref$contentDimension === void 0 ? {} : _ref$contentDimension,
128
- _ref$maxImageWidth = _ref.maxImageWidth,
129
- maxImageWidth = _ref$maxImageWidth === void 0 ? {} : _ref$maxImageWidth,
130
- _ref$maxImageHeight = _ref.maxImageHeight,
131
- maxImageHeight = _ref$maxImageHeight === void 0 ? {} : _ref$maxImageHeight,
132
- _ref$multipleCorrect = _ref.multipleCorrect,
133
- multipleCorrect = _ref$multipleCorrect === void 0 ? {} : _ref$multipleCorrect,
134
- _ref$partialScoring = _ref.partialScoring,
135
- partialScoring = _ref$partialScoring === void 0 ? {} : _ref$partialScoring,
136
- _ref$preserveAspectRa = _ref.preserveAspectRatio,
137
- preserveAspectRatio = _ref$preserveAspectRa === void 0 ? {} : _ref$preserveAspectRa,
138
- _ref$prompt = _ref.prompt,
139
- prompt = _ref$prompt === void 0 ? {} : _ref$prompt,
140
- _ref$rationale = _ref.rationale,
141
- rationale = _ref$rationale === void 0 ? {} : _ref$rationale,
142
- settingsPanelDisabled = _ref.settingsPanelDisabled,
143
- _ref$spellCheck = _ref.spellCheck,
144
- spellCheck = _ref$spellCheck === void 0 ? {} : _ref$spellCheck,
145
- _ref$teacherInstructi = _ref.teacherInstructions,
146
- teacherInstructions = _ref$teacherInstructi === void 0 ? {} : _ref$teacherInstructi,
147
- _ref$withRubric = _ref.withRubric,
148
- withRubric = _ref$withRubric === void 0 ? {} : _ref$withRubric,
149
- _ref$mathMlOptions = _ref.mathMlOptions,
150
- mathMlOptions = _ref$mathMlOptions === void 0 ? {} : _ref$mathMlOptions,
151
- _ref$language = _ref.language,
152
- language = _ref$language === void 0 ? {} : _ref$language,
153
- _ref$languageChoices = _ref.languageChoices,
154
- languageChoices = _ref$languageChoices === void 0 ? {} : _ref$languageChoices;
155
-
156
- var _ref2 = model || {},
157
- errors = _ref2.errors,
158
- extraCSSRules = _ref2.extraCSSRules,
159
- promptEnabled = _ref2.promptEnabled,
160
- rationaleEnabled = _ref2.rationaleEnabled,
161
- spellCheckEnabled = _ref2.spellCheckEnabled,
162
- teacherInstructionsEnabled = _ref2.teacherInstructionsEnabled,
163
- toolbarEditorPosition = _ref2.toolbarEditorPosition;
164
-
165
- var _ref3 = errors || {},
166
- promptError = _ref3.prompt,
167
- rationaleError = _ref3.rationale,
168
- shapesError = _ref3.shapes,
169
- selectionsError = _ref3.selections,
170
- teacherInstructionsError = _ref3.teacherInstructions;
171
-
172
- var validationMessage = (0, _utils.generateValidationMessage)(configuration);
173
- var defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
174
- var defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
175
- var toolbarOpts = {
176
- position: toolbarEditorPosition === 'top' ? 'top' : 'bottom'
177
- };
178
- var panelSettings = {
179
- multipleCorrect: multipleCorrect.settings && toggle(multipleCorrect.label),
180
- partialScoring: partialScoring.settings && toggle(partialScoring.label),
181
- promptEnabled: prompt.settings && toggle(prompt.label),
182
- 'language.enabled': language.settings && toggle(language.label, true),
183
- language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options)
184
- };
185
- var panelProperties = {
186
- teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
187
- rationaleEnabled: rationale.settings && toggle(rationale.label),
188
- spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
189
- rubricEnabled: (withRubric === null || withRubric === void 0 ? void 0 : withRubric.settings) && toggle(withRubric === null || withRubric === void 0 ? void 0 : withRubric.label)
190
- };
191
-
192
- var getPluginProps = function getPluginProps() {
193
- var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
194
- return _objectSpread(_objectSpread({}, baseInputConfiguration), props);
195
- };
196
-
197
- return /*#__PURE__*/_react["default"].createElement(_configUi.layout.ConfigLayout, {
198
- extraCSSRules: extraCSSRules,
199
- dimensions: contentDimensions,
200
- hideSettings: settingsPanelDisabled,
201
- settings: /*#__PURE__*/_react["default"].createElement(Panel, {
202
- model: model,
203
- onChangeModel: onModelChangedByConfig,
204
- configuration: configuration,
205
- onChangeConfiguration: onConfigurationChanged,
206
- groups: {
207
- Settings: panelSettings,
208
- Properties: panelProperties
209
- }
210
- })
211
- }, teacherInstructionsEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
212
- label: teacherInstructions.label,
213
- className: classes.promptContainer
214
- }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
215
- markup: model.teacherInstructions || '',
216
- onChange: onTeacherInstructionsChanged,
217
- imageSupport: imageSupport,
218
- nonEmpty: false,
219
- error: teacherInstructionsError,
220
- toolbarOpts: toolbarOpts,
221
- pluginProps: getPluginProps(teacherInstructions === null || teacherInstructions === void 0 ? void 0 : teacherInstructions.inputConfiguration),
222
- spellCheck: spellCheckEnabled,
223
- maxImageWidth: maxImageWidth && maxImageWidth.teacherInstructions || defaultImageMaxWidth,
224
- maxImageHeight: maxImageHeight && maxImageHeight.teacherInstructions || defaultImageMaxHeight,
225
- uploadSoundSupport: uploadSoundSupport,
226
- languageCharactersProps: [{
227
- language: 'spanish'
228
- }, {
229
- language: 'special'
230
- }],
231
- mathMlOptions: mathMlOptions
232
- }), teacherInstructionsError && /*#__PURE__*/_react["default"].createElement("div", {
233
- className: classes.errorText
234
- }, teacherInstructionsError)), promptEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
235
- label: prompt.label,
236
- className: classes.promptContainer
237
- }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
238
- markup: model.prompt || '',
239
- onChange: onPromptChanged,
240
- imageSupport: imageSupport,
241
- nonEmpty: false,
242
- error: promptError,
243
- toolbarOpts: toolbarOpts,
244
- pluginProps: getPluginProps(prompt === null || prompt === void 0 ? void 0 : prompt.inputConfiguration),
245
- spellCheck: spellCheckEnabled,
246
- maxImageWidth: defaultImageMaxWidth,
247
- maxImageHeight: defaultImageMaxHeight,
248
- uploadSoundSupport: uploadSoundSupport,
249
- languageCharactersProps: [{
250
- language: 'spanish'
251
- }, {
252
- language: 'special'
253
- }],
254
- mathMlOptions: mathMlOptions
255
- }), promptError && /*#__PURE__*/_react["default"].createElement("div", {
256
- className: classes.errorText
257
- }, promptError)), /*#__PURE__*/_react["default"].createElement("div", {
258
- className: classes.flexContainer
259
- }, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
260
- className: classes.subheading,
261
- variant: "subheading"
262
- }, "Define Hotspot"), /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
263
- classes: {
264
- tooltip: classes.tooltip
265
- },
266
- disableFocusListener: true,
267
- disableTouchListener: true,
268
- placement: 'left',
269
- title: validationMessage
270
- }, /*#__PURE__*/_react["default"].createElement(_Info["default"], {
271
- fontSize: 'small',
272
- color: 'primary',
273
- style: {
274
- "float": 'right'
275
- }
276
- }))), /*#__PURE__*/_react["default"].createElement(_hotspotPalette["default"], {
277
- hotspotColor: model.hotspotColor,
278
- hotspotList: model.hotspotList,
279
- outlineColor: model.outlineColor,
280
- outlineList: model.outlineList,
281
- onHotspotColorChange: function onHotspotColorChange(color) {
282
- return _this2.handleColorChange('hotspot', color);
283
- },
284
- onOutlineColorChange: function onOutlineColorChange(color) {
285
- return _this2.handleColorChange('outline', color);
107
+ render() {
108
+ const {
109
+ configuration,
110
+ model,
111
+ imageSupport,
112
+ uploadSoundSupport,
113
+ onConfigurationChanged,
114
+ onImageUpload,
115
+ onModelChangedByConfig,
116
+ onPromptChanged,
117
+ onRationaleChanged,
118
+ onUpdateImageDimension,
119
+ onTeacherInstructionsChanged,
120
+ onUpdateShapes
121
+ } = this.props;
122
+ const {
123
+ baseInputConfiguration = {},
124
+ contentDimensions = {},
125
+ maxImageWidth = {},
126
+ maxImageHeight = {},
127
+ multipleCorrect = {},
128
+ partialScoring = {},
129
+ preserveAspectRatio = {},
130
+ prompt = {},
131
+ rationale = {},
132
+ settingsPanelDisabled,
133
+ spellCheck = {},
134
+ teacherInstructions = {},
135
+ withRubric = {},
136
+ mathMlOptions = {},
137
+ language = {},
138
+ languageChoices = {}
139
+ } = configuration || {};
140
+ const {
141
+ errors,
142
+ extraCSSRules,
143
+ promptEnabled,
144
+ rationaleEnabled,
145
+ spellCheckEnabled,
146
+ teacherInstructionsEnabled,
147
+ toolbarEditorPosition
148
+ } = model || {};
149
+ const {
150
+ prompt: promptError,
151
+ rationale: rationaleError,
152
+ shapes: shapesError,
153
+ selections: selectionsError,
154
+ teacherInstructions: teacherInstructionsError
155
+ } = errors || {};
156
+ const validationMessage = (0, _utils.generateValidationMessage)(configuration);
157
+ const defaultImageMaxWidth = maxImageWidth && maxImageWidth.prompt;
158
+ const defaultImageMaxHeight = maxImageHeight && maxImageHeight.prompt;
159
+ const toolbarOpts = {
160
+ position: toolbarEditorPosition === 'top' ? 'top' : 'bottom'
161
+ };
162
+ const panelSettings = {
163
+ multipleCorrect: multipleCorrect.settings && toggle(multipleCorrect.label),
164
+ partialScoring: partialScoring.settings && toggle(partialScoring.label),
165
+ promptEnabled: prompt.settings && toggle(prompt.label),
166
+ 'language.enabled': language.settings && toggle(language.label, true),
167
+ language: language.settings && language.enabled && dropdown(languageChoices.label, languageChoices.options)
168
+ };
169
+ const panelProperties = {
170
+ teacherInstructionsEnabled: teacherInstructions.settings && toggle(teacherInstructions.label),
171
+ rationaleEnabled: rationale.settings && toggle(rationale.label),
172
+ spellCheckEnabled: spellCheck.settings && toggle(spellCheck.label),
173
+ rubricEnabled: withRubric?.settings && toggle(withRubric?.label)
174
+ };
175
+ const getPluginProps = (props = {}) => ({
176
+ ...baseInputConfiguration,
177
+ ...props
178
+ });
179
+ return /*#__PURE__*/_react.default.createElement(_configUi.layout.ConfigLayout, {
180
+ extraCSSRules: extraCSSRules,
181
+ dimensions: contentDimensions,
182
+ hideSettings: settingsPanelDisabled,
183
+ settings: /*#__PURE__*/_react.default.createElement(Panel, {
184
+ model: model,
185
+ onChangeModel: onModelChangedByConfig,
186
+ configuration: configuration,
187
+ onChangeConfiguration: onConfigurationChanged,
188
+ groups: {
189
+ Settings: panelSettings,
190
+ Properties: panelProperties
286
191
  }
287
- }), /*#__PURE__*/_react["default"].createElement(_hotspotContainer["default"], {
288
- dimensions: model.dimensions,
289
- imageUrl: model.imageUrl,
290
- multipleCorrect: model.multipleCorrect,
291
- hasErrors: !!shapesError || !!selectionsError,
292
- hotspotColor: model.hotspotColor,
293
- outlineColor: model.outlineColor,
294
- selectedHotspotColor: model.selectedHotspotColor,
295
- hoverOutlineColor: model.hoverOutlineColor,
296
- onUpdateImageDimension: onUpdateImageDimension,
297
- onUpdateShapes: onUpdateShapes,
298
- onImageUpload: onImageUpload,
299
- shapes: model.shapes,
300
- strokeWidth: model.strokeWidth,
301
- preserveAspectRatioEnabled: preserveAspectRatio.enabled,
302
- insertImage: imageSupport && imageSupport.add
303
- }), shapesError && /*#__PURE__*/_react["default"].createElement("div", {
304
- className: classes.errorText
305
- }, shapesError), selectionsError && /*#__PURE__*/_react["default"].createElement("div", {
306
- className: classes.errorText
307
- }, selectionsError), model.imageUrl && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
308
- variant: "subheading"
309
- }, "Image Dimensions"), /*#__PURE__*/_react["default"].createElement("div", {
310
- className: classes.dimensions
311
- }, /*#__PURE__*/_react["default"].createElement(_configUi.NumberTextField, {
312
- key: "hotspot-manual-width",
313
- label: "Width",
314
- value: model.dimensions.width,
315
- min: 0,
316
- onChange: function onChange(e, value) {
317
- return _this2.handleOnUpdateImageDimensions(value, 'width');
318
- },
319
- showErrorWhenOutsideRange: true,
320
- className: classes.field
321
- }), /*#__PURE__*/_react["default"].createElement(_configUi.NumberTextField, {
322
- key: "hotspot-manual-height",
323
- label: "Height",
324
- value: model.dimensions.height,
325
- min: 0,
326
- onChange: function onChange(e, value) {
327
- return _this2.handleOnUpdateImageDimensions(value, 'height');
328
- },
329
- showErrorWhenOutsideRange: true,
330
- className: classes.field
331
- }))), rationaleEnabled && /*#__PURE__*/_react["default"].createElement(_configUi.InputContainer, {
332
- label: rationale.label,
333
- className: classes.promptContainer
334
- }, /*#__PURE__*/_react["default"].createElement(_editableHtml["default"], {
335
- markup: model.rationale || '',
336
- onChange: onRationaleChanged,
337
- imageSupport: imageSupport,
338
- error: rationaleError,
339
- toolbarOpts: toolbarOpts,
340
- pluginProps: getPluginProps(rationale === null || rationale === void 0 ? void 0 : rationale.inputConfiguration),
341
- spellCheck: spellCheckEnabled,
342
- maxImageWidth: maxImageWidth && maxImageWidth.rationale || defaultImageMaxWidth,
343
- maxImageHeight: maxImageHeight && maxImageHeight.rationale || defaultImageMaxHeight,
344
- uploadSoundSupport: uploadSoundSupport,
345
- languageCharactersProps: [{
346
- language: 'spanish'
347
- }, {
348
- language: 'special'
349
- }],
350
- mathMlOptions: mathMlOptions
351
- }), rationaleError && /*#__PURE__*/_react["default"].createElement("div", {
352
- className: classes.errorText
353
- }, rationaleError)));
354
- }
355
- }]);
356
- return Root;
357
- }(_react["default"].Component);
358
-
192
+ })
193
+ }, teacherInstructionsEnabled && /*#__PURE__*/_react.default.createElement(PromptContainer, {
194
+ label: teacherInstructions.label
195
+ }, /*#__PURE__*/_react.default.createElement(_editableHtml.default, {
196
+ markup: model.teacherInstructions || '',
197
+ onChange: onTeacherInstructionsChanged,
198
+ imageSupport: imageSupport,
199
+ nonEmpty: false,
200
+ error: teacherInstructionsError,
201
+ toolbarOpts: toolbarOpts,
202
+ pluginProps: getPluginProps(teacherInstructions?.inputConfiguration),
203
+ spellCheck: spellCheckEnabled,
204
+ maxImageWidth: maxImageWidth && maxImageWidth.teacherInstructions || defaultImageMaxWidth,
205
+ maxImageHeight: maxImageHeight && maxImageHeight.teacherInstructions || defaultImageMaxHeight,
206
+ uploadSoundSupport: uploadSoundSupport,
207
+ languageCharactersProps: [{
208
+ language: 'spanish'
209
+ }, {
210
+ language: 'special'
211
+ }],
212
+ mathMlOptions: mathMlOptions
213
+ }), teacherInstructionsError && /*#__PURE__*/_react.default.createElement(ErrorText, null, teacherInstructionsError)), promptEnabled && /*#__PURE__*/_react.default.createElement(PromptContainer, {
214
+ label: prompt.label
215
+ }, /*#__PURE__*/_react.default.createElement(_editableHtml.default, {
216
+ markup: model.prompt || '',
217
+ onChange: onPromptChanged,
218
+ imageSupport: imageSupport,
219
+ nonEmpty: false,
220
+ error: promptError,
221
+ toolbarOpts: toolbarOpts,
222
+ pluginProps: getPluginProps(prompt?.inputConfiguration),
223
+ spellCheck: spellCheckEnabled,
224
+ maxImageWidth: defaultImageMaxWidth,
225
+ maxImageHeight: defaultImageMaxHeight,
226
+ uploadSoundSupport: uploadSoundSupport,
227
+ languageCharactersProps: [{
228
+ language: 'spanish'
229
+ }, {
230
+ language: 'special'
231
+ }],
232
+ mathMlOptions: mathMlOptions
233
+ }), promptError && /*#__PURE__*/_react.default.createElement(ErrorText, null, promptError)), /*#__PURE__*/_react.default.createElement(FlexContainer, null, /*#__PURE__*/_react.default.createElement(SubHeading, {
234
+ variant: "h6"
235
+ }, "Define Hotspot"), /*#__PURE__*/_react.default.createElement(StyledTooltip, {
236
+ disableFocusListener: true,
237
+ disableTouchListener: true,
238
+ placement: 'left',
239
+ title: validationMessage
240
+ }, /*#__PURE__*/_react.default.createElement(_Info.default, {
241
+ fontSize: 'small',
242
+ color: 'primary',
243
+ style: {
244
+ float: 'right'
245
+ }
246
+ }))), /*#__PURE__*/_react.default.createElement(_hotspotPalette.default, {
247
+ hotspotColor: model.hotspotColor,
248
+ hotspotList: model.hotspotList,
249
+ outlineColor: model.outlineColor,
250
+ outlineList: model.outlineList,
251
+ onHotspotColorChange: color => this.handleColorChange('hotspot', color),
252
+ onOutlineColorChange: color => this.handleColorChange('outline', color)
253
+ }), /*#__PURE__*/_react.default.createElement(_hotspotContainer.default, {
254
+ dimensions: model.dimensions,
255
+ imageUrl: model.imageUrl,
256
+ multipleCorrect: model.multipleCorrect,
257
+ hasErrors: !!shapesError || !!selectionsError,
258
+ hotspotColor: model.hotspotColor,
259
+ outlineColor: model.outlineColor,
260
+ selectedHotspotColor: model.selectedHotspotColor,
261
+ hoverOutlineColor: model.hoverOutlineColor,
262
+ onUpdateImageDimension: onUpdateImageDimension,
263
+ onUpdateShapes: onUpdateShapes,
264
+ onImageUpload: onImageUpload,
265
+ shapes: model.shapes,
266
+ strokeWidth: model.strokeWidth,
267
+ preserveAspectRatioEnabled: preserveAspectRatio.enabled,
268
+ insertImage: imageSupport && imageSupport.add
269
+ }), shapesError && /*#__PURE__*/_react.default.createElement(ErrorText, null, shapesError), selectionsError && /*#__PURE__*/_react.default.createElement(ErrorText, null, selectionsError), model.imageUrl && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Typography.default, {
270
+ variant: "h6"
271
+ }, "Image Dimensions"), /*#__PURE__*/_react.default.createElement(DimensionsContainer, null, /*#__PURE__*/_react.default.createElement(FieldContainer, null, /*#__PURE__*/_react.default.createElement(_configUi.NumberTextField, {
272
+ key: "hotspot-manual-width",
273
+ label: "Width",
274
+ value: model.dimensions.width,
275
+ min: 0,
276
+ onChange: (e, value) => this.handleOnUpdateImageDimensions(value, 'width'),
277
+ showErrorWhenOutsideRange: true
278
+ })), /*#__PURE__*/_react.default.createElement(FieldContainer, null, /*#__PURE__*/_react.default.createElement(_configUi.NumberTextField, {
279
+ key: "hotspot-manual-height",
280
+ label: "Height",
281
+ value: model.dimensions.height,
282
+ min: 0,
283
+ onChange: (e, value) => this.handleOnUpdateImageDimensions(value, 'height'),
284
+ showErrorWhenOutsideRange: true
285
+ })))), rationaleEnabled && /*#__PURE__*/_react.default.createElement(PromptContainer, {
286
+ label: rationale.label
287
+ }, /*#__PURE__*/_react.default.createElement(_editableHtml.default, {
288
+ markup: model.rationale || '',
289
+ onChange: onRationaleChanged,
290
+ imageSupport: imageSupport,
291
+ error: rationaleError,
292
+ toolbarOpts: toolbarOpts,
293
+ pluginProps: getPluginProps(rationale?.inputConfiguration),
294
+ spellCheck: spellCheckEnabled,
295
+ maxImageWidth: maxImageWidth && maxImageWidth.rationale || defaultImageMaxWidth,
296
+ maxImageHeight: maxImageHeight && maxImageHeight.rationale || defaultImageMaxHeight,
297
+ uploadSoundSupport: uploadSoundSupport,
298
+ languageCharactersProps: [{
299
+ language: 'spanish'
300
+ }, {
301
+ language: 'special'
302
+ }],
303
+ mathMlOptions: mathMlOptions
304
+ }), rationaleError && /*#__PURE__*/_react.default.createElement(ErrorText, null, rationaleError)));
305
+ }
306
+ }
359
307
  exports.Root = Root;
360
-
361
- var styles = function styles(theme) {
362
- return {
363
- dimensions: {
364
- display: 'flex',
365
- marginBottom: theme.spacing.unit * 1.5
366
- },
367
- field: {
368
- flex: 1,
369
- width: '90%'
370
- },
371
- promptContainer: {
372
- paddingTop: theme.spacing.unit * 2,
373
- marginBottom: theme.spacing.unit * 2,
374
- width: '100%'
375
- },
376
- subheading: {
377
- marginRight: theme.spacing.unit
378
- },
379
- flexContainer: {
380
- display: 'flex',
381
- alignItems: 'center'
382
- },
383
- tooltip: {
384
- fontSize: theme.typography.fontSize - 2,
385
- whiteSpace: 'pre',
386
- maxWidth: '500px'
387
- },
388
- errorText: {
389
- fontSize: theme.typography.fontSize - 2,
390
- color: theme.palette.error.main,
391
- paddingTop: theme.spacing.unit
392
- }
393
- };
394
- };
395
-
396
308
  Root.propTypes = {
397
- classes: _propTypes["default"].object.isRequired,
398
- configuration: _propTypes["default"].object,
399
- model: _propTypes["default"].object.isRequired,
400
- imageSupport: _propTypes["default"].shape({
401
- add: _propTypes["default"].func,
402
- "delete": _propTypes["default"].func
309
+ configuration: _propTypes.default.object,
310
+ model: _propTypes.default.object.isRequired,
311
+ imageSupport: _propTypes.default.shape({
312
+ add: _propTypes.default.func,
313
+ delete: _propTypes.default.func
403
314
  }),
404
- uploadSoundSupport: _propTypes["default"].shape({
405
- add: _propTypes["default"].func,
406
- "delete": _propTypes["default"].func
315
+ uploadSoundSupport: _propTypes.default.shape({
316
+ add: _propTypes.default.func,
317
+ delete: _propTypes.default.func
407
318
  }),
408
- onImageUpload: _propTypes["default"].func.isRequired,
409
- onColorChanged: _propTypes["default"].func.isRequired,
410
- onPromptChanged: _propTypes["default"].func.isRequired,
411
- onUpdateImageDimension: _propTypes["default"].func.isRequired,
412
- onUpdateShapes: _propTypes["default"].func.isRequired,
413
- onModelChangedByConfig: _propTypes["default"].func.isRequired,
414
- onRationaleChanged: _propTypes["default"].func.isRequired,
415
- onConfigurationChanged: _propTypes["default"].func.isRequired,
416
- onTeacherInstructionsChanged: _propTypes["default"].func.isRequired
319
+ onImageUpload: _propTypes.default.func.isRequired,
320
+ onColorChanged: _propTypes.default.func.isRequired,
321
+ onPromptChanged: _propTypes.default.func.isRequired,
322
+ onUpdateImageDimension: _propTypes.default.func.isRequired,
323
+ onUpdateShapes: _propTypes.default.func.isRequired,
324
+ onModelChangedByConfig: _propTypes.default.func.isRequired,
325
+ onRationaleChanged: _propTypes.default.func.isRequired,
326
+ onConfigurationChanged: _propTypes.default.func.isRequired,
327
+ onTeacherInstructionsChanged: _propTypes.default.func.isRequired
417
328
  };
418
-
419
- var _default = (0, _styles.withStyles)(styles)(Root);
420
-
421
- exports["default"] = _default;
422
- //# sourceMappingURL=root.js.map
329
+ var _default = exports.default = Root;
330
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jb25maWdVaSIsIl9wcm9wVHlwZXMiLCJfZWRpdGFibGVIdG1sIiwiX3N0eWxlcyIsIl9UeXBvZ3JhcGh5IiwiX0luZm8iLCJfVG9vbHRpcCIsIl9ob3RzcG90UGFsZXR0ZSIsIl9ob3RzcG90Q29udGFpbmVyIiwiX3V0aWxzIiwiUGFuZWwiLCJ0b2dnbGUiLCJkcm9wZG93biIsInNldHRpbmdzIiwiRGltZW5zaW9uc0NvbnRhaW5lciIsInN0eWxlZCIsInRoZW1lIiwiZGlzcGxheSIsIm1hcmdpbkJvdHRvbSIsInNwYWNpbmciLCJGaWVsZENvbnRhaW5lciIsImZsZXgiLCJ3aWR0aCIsIlByb21wdENvbnRhaW5lciIsIklucHV0Q29udGFpbmVyIiwicGFkZGluZ1RvcCIsIm1hcmdpblRvcCIsIlN1YkhlYWRpbmciLCJUeXBvZ3JhcGh5IiwibWFyZ2luUmlnaHQiLCJGbGV4Q29udGFpbmVyIiwiYWxpZ25JdGVtcyIsIlN0eWxlZFRvb2x0aXAiLCJUb29sdGlwIiwiZm9udFNpemUiLCJ0eXBvZ3JhcGh5Iiwid2hpdGVTcGFjZSIsIm1heFdpZHRoIiwiRXJyb3JUZXh0IiwiY29sb3IiLCJwYWxldHRlIiwiZXJyb3IiLCJtYWluIiwiUm9vdCIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJhcmdzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJmaWVsZFR5cGUiLCJvbkNvbG9yQ2hhbmdlZCIsInByb3BzIiwiY1R5cGUiLCJ2YWx1ZSIsInJlc2l6ZVR5cGUiLCJtb2RlbCIsImRpbWVuc2lvbnMiLCJzaGFwZXMiLCJjb25maWd1cmF0aW9uIiwicHJlc2VydmVBc3BlY3RSYXRpbyIsIm9uVXBkYXRlSW1hZ2VEaW1lbnNpb24iLCJvblVwZGF0ZVNoYXBlcyIsIm5leHRJbWFnZURpbWVuc2lvbnMiLCJ1cGRhdGVkRGltZW5zaW9ucyIsInVwZGF0ZUltYWdlRGltZW5zaW9ucyIsImVuYWJsZWQiLCJzaGFwZXNBcnJheSIsImdldEFsbFNoYXBlcyIsInVwZGF0ZWRTaGFwZXMiLCJnZXRVcGRhdGVkU2hhcGVzIiwiZ3JvdXBTaGFwZXMiLCJyZW5kZXIiLCJpbWFnZVN1cHBvcnQiLCJ1cGxvYWRTb3VuZFN1cHBvcnQiLCJvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIiwib25JbWFnZVVwbG9hZCIsIm9uTW9kZWxDaGFuZ2VkQnlDb25maWciLCJvblByb21wdENoYW5nZWQiLCJvblJhdGlvbmFsZUNoYW5nZWQiLCJvblRlYWNoZXJJbnN0cnVjdGlvbnNDaGFuZ2VkIiwiYmFzZUlucHV0Q29uZmlndXJhdGlvbiIsImNvbnRlbnREaW1lbnNpb25zIiwibWF4SW1hZ2VXaWR0aCIsIm1heEltYWdlSGVpZ2h0IiwibXVsdGlwbGVDb3JyZWN0IiwicGFydGlhbFNjb3JpbmciLCJwcm9tcHQiLCJyYXRpb25hbGUiLCJzZXR0aW5nc1BhbmVsRGlzYWJsZWQiLCJzcGVsbENoZWNrIiwidGVhY2hlckluc3RydWN0aW9ucyIsIndpdGhSdWJyaWMiLCJtYXRoTWxPcHRpb25zIiwibGFuZ3VhZ2UiLCJsYW5ndWFnZUNob2ljZXMiLCJlcnJvcnMiLCJleHRyYUNTU1J1bGVzIiwicHJvbXB0RW5hYmxlZCIsInJhdGlvbmFsZUVuYWJsZWQiLCJzcGVsbENoZWNrRW5hYmxlZCIsInRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkIiwidG9vbGJhckVkaXRvclBvc2l0aW9uIiwicHJvbXB0RXJyb3IiLCJyYXRpb25hbGVFcnJvciIsInNoYXBlc0Vycm9yIiwic2VsZWN0aW9ucyIsInNlbGVjdGlvbnNFcnJvciIsInRlYWNoZXJJbnN0cnVjdGlvbnNFcnJvciIsInZhbGlkYXRpb25NZXNzYWdlIiwiZ2VuZXJhdGVWYWxpZGF0aW9uTWVzc2FnZSIsImRlZmF1bHRJbWFnZU1heFdpZHRoIiwiZGVmYXVsdEltYWdlTWF4SGVpZ2h0IiwidG9vbGJhck9wdHMiLCJwb3NpdGlvbiIsInBhbmVsU2V0dGluZ3MiLCJsYWJlbCIsIm9wdGlvbnMiLCJwYW5lbFByb3BlcnRpZXMiLCJydWJyaWNFbmFibGVkIiwiZ2V0UGx1Z2luUHJvcHMiLCJjcmVhdGVFbGVtZW50IiwibGF5b3V0IiwiQ29uZmlnTGF5b3V0IiwiaGlkZVNldHRpbmdzIiwib25DaGFuZ2VNb2RlbCIsIm9uQ2hhbmdlQ29uZmlndXJhdGlvbiIsImdyb3VwcyIsIlNldHRpbmdzIiwiUHJvcGVydGllcyIsIm1hcmt1cCIsIm9uQ2hhbmdlIiwibm9uRW1wdHkiLCJwbHVnaW5Qcm9wcyIsImlucHV0Q29uZmlndXJhdGlvbiIsImxhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzIiwidmFyaWFudCIsImRpc2FibGVGb2N1c0xpc3RlbmVyIiwiZGlzYWJsZVRvdWNoTGlzdGVuZXIiLCJwbGFjZW1lbnQiLCJ0aXRsZSIsInN0eWxlIiwiZmxvYXQiLCJob3RzcG90Q29sb3IiLCJob3RzcG90TGlzdCIsIm91dGxpbmVDb2xvciIsIm91dGxpbmVMaXN0Iiwib25Ib3RzcG90Q29sb3JDaGFuZ2UiLCJoYW5kbGVDb2xvckNoYW5nZSIsIm9uT3V0bGluZUNvbG9yQ2hhbmdlIiwiaW1hZ2VVcmwiLCJoYXNFcnJvcnMiLCJzZWxlY3RlZEhvdHNwb3RDb2xvciIsImhvdmVyT3V0bGluZUNvbG9yIiwic3Ryb2tlV2lkdGgiLCJwcmVzZXJ2ZUFzcGVjdFJhdGlvRW5hYmxlZCIsImluc2VydEltYWdlIiwiYWRkIiwiRnJhZ21lbnQiLCJOdW1iZXJUZXh0RmllbGQiLCJrZXkiLCJtaW4iLCJlIiwiaGFuZGxlT25VcGRhdGVJbWFnZURpbWVuc2lvbnMiLCJzaG93RXJyb3JXaGVuT3V0c2lkZVJhbmdlIiwiaGVpZ2h0IiwiZXhwb3J0cyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJzaGFwZSIsImZ1bmMiLCJkZWxldGUiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9yb290LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgc2V0dGluZ3MsIGxheW91dCwgSW5wdXRDb250YWluZXIsIE51bWJlclRleHRGaWVsZCB9IGZyb20gJ0BwaWUtbGliL2NvbmZpZy11aSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEVkaXRhYmxlSHRtbCBmcm9tICdAcGllLWxpYi9lZGl0YWJsZS1odG1sJztcbmltcG9ydCB7IHN0eWxlZCB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJ0BtdWkvbWF0ZXJpYWwvVHlwb2dyYXBoeSc7XG5pbXBvcnQgSW5mbyBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0luZm8nO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnQG11aS9tYXRlcmlhbC9Ub29sdGlwJztcbmltcG9ydCBIb3RzcG90UGFsZXR0ZSBmcm9tICcuL2hvdHNwb3QtcGFsZXR0ZSc7XG5pbXBvcnQgSG90c3BvdENvbnRhaW5lciBmcm9tICcuL2hvdHNwb3QtY29udGFpbmVyJztcbmltcG9ydCB7IHVwZGF0ZUltYWdlRGltZW5zaW9ucywgZ2VuZXJhdGVWYWxpZGF0aW9uTWVzc2FnZSwgZ2V0VXBkYXRlZFNoYXBlcywgZ2V0QWxsU2hhcGVzLCBncm91cFNoYXBlcyB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCB7IFBhbmVsLCB0b2dnbGUsIGRyb3Bkb3duIH0gPSBzZXR0aW5ncztcblxuY29uc3QgRGltZW5zaW9uc0NvbnRhaW5lciA9IHN0eWxlZCgnZGl2JykoKHsgdGhlbWUgfSkgPT4gKHtcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBtYXJnaW5Cb3R0b206IHRoZW1lLnNwYWNpbmcoMS41KSxcbn0pKTtcblxuY29uc3QgRmllbGRDb250YWluZXIgPSBzdHlsZWQoJ2RpdicpKHtcbiAgZmxleDogMSxcbiAgd2lkdGg6ICc5MCUnLFxufSk7XG5cbmNvbnN0IFByb21wdENvbnRhaW5lciA9IHN0eWxlZChJbnB1dENvbnRhaW5lcikoKHsgdGhlbWUgfSkgPT4gKHtcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygxKSxcbiAgbWFyZ2luVG9wOiB0aGVtZS5zcGFjaW5nKDIpLFxuICBtYXJnaW5Cb3R0b206IHRoZW1lLnNwYWNpbmcoMiksXG4gIHdpZHRoOiAnMTAwJScsXG59KSk7XG5cbmNvbnN0IFN1YkhlYWRpbmcgPSBzdHlsZWQoVHlwb2dyYXBoeSkoKHsgdGhlbWUgfSkgPT4gKHtcbiAgbWFyZ2luUmlnaHQ6IHRoZW1lLnNwYWNpbmcoMSksXG59KSk7XG5cbmNvbnN0IEZsZXhDb250YWluZXIgPSBzdHlsZWQoJ2RpdicpKHtcbiAgZGlzcGxheTogJ2ZsZXgnLFxuICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbn0pO1xuXG5jb25zdCBTdHlsZWRUb29sdGlwID0gc3R5bGVkKFRvb2x0aXApKCh7IHRoZW1lIH0pID0+ICh7XG4gICcmIC5NdWlUb29sdGlwLXRvb2x0aXAnOiB7XG4gICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkuZm9udFNpemUgLSAyLFxuICAgIHdoaXRlU3BhY2U6ICdwcmUnLFxuICAgIG1heFdpZHRoOiAnNTAwcHgnLFxuICB9LFxufSkpO1xuXG5jb25zdCBFcnJvclRleHQgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+ICh7XG4gIGZvbnRTaXplOiB0aGVtZS50eXBvZ3JhcGh5LmZvbnRTaXplIC0gMixcbiAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgcGFkZGluZ1RvcDogdGhlbWUuc3BhY2luZygxKSxcbn0pKTtcblxuZXhwb3J0IGNsYXNzIFJvb3QgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBoYW5kbGVDb2xvckNoYW5nZSA9IChmaWVsZFR5cGUsIGNvbG9yKSA9PiB7XG4gICAgY29uc3QgeyBvbkNvbG9yQ2hhbmdlZCB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBjVHlwZSA9IGAke2ZpZWxkVHlwZX1Db2xvcmA7XG5cbiAgICBvbkNvbG9yQ2hhbmdlZChjVHlwZSwgY29sb3IpO1xuICB9O1xuXG4gIGhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zID0gKHZhbHVlLCByZXNpemVUeXBlKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgbW9kZWw6IHsgZGltZW5zaW9ucywgc2hhcGVzIH0sXG4gICAgICBjb25maWd1cmF0aW9uOiB7IHByZXNlcnZlQXNwZWN0UmF0aW8gPSB7fSB9LFxuICAgICAgb25VcGRhdGVJbWFnZURpbWVuc2lvbixcbiAgICAgIG9uVXBkYXRlU2hhcGVzLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgbmV4dEltYWdlRGltZW5zaW9ucyA9IHsgLi4uZGltZW5zaW9ucywgW3Jlc2l6ZVR5cGVdOiB2YWx1ZSB9O1xuXG4gICAgLy8gaWYgcHJlc2VydmVBc3BlY3RSYXRpby5lbmFibGVkLCB1cGRhdGVJbWFnZURpbWVuc2lvbnMgZnVuY3Rpb24gbWFrZXMgc3VyZSBhc3BlY3QgcmF0aW8gaXMga2VwdFxuICAgIGNvbnN0IHVwZGF0ZWREaW1lbnNpb25zID0gdXBkYXRlSW1hZ2VEaW1lbnNpb25zKFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIG5leHRJbWFnZURpbWVuc2lvbnMsXG4gICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvLmVuYWJsZWQsXG4gICAgICByZXNpemVUeXBlLFxuICAgICk7XG4gICAgLy8gdHJhbnNmb3JtIHNoYXBlcyBtYXAgaW50byBzaGFwZXMgYXJyYXlcbiAgICBjb25zdCBzaGFwZXNBcnJheSA9IGdldEFsbFNoYXBlcyhzaGFwZXMpO1xuICAgIC8vIHRyYW5zZm9ybSBhbGwgdGhlIHNoYXBlcyB0byBmaXQgdGhlIHJlLXNpemVkIGltYWdlXG4gICAgY29uc3QgdXBkYXRlZFNoYXBlcyA9IGdldFVwZGF0ZWRTaGFwZXMoZGltZW5zaW9ucywgdXBkYXRlZERpbWVuc2lvbnMsIHNoYXBlc0FycmF5KTtcbiAgICAvLyB0cmFuc2Zvcm0gc2hhcGVzIGFycmF5IGJhY2sgaW50byBzaGFwZXMgbWFwXG5cbiAgICBvblVwZGF0ZVNoYXBlcyhncm91cFNoYXBlcyh1cGRhdGVkU2hhcGVzKSk7XG4gICAgb25VcGRhdGVJbWFnZURpbWVuc2lvbih1cGRhdGVkRGltZW5zaW9ucyk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICBtb2RlbCxcbiAgICAgIGltYWdlU3VwcG9ydCxcbiAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydCxcbiAgICAgIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQsXG4gICAgICBvbkltYWdlVXBsb2FkLFxuICAgICAgb25Nb2RlbENoYW5nZWRCeUNvbmZpZyxcbiAgICAgIG9uUHJvbXB0Q2hhbmdlZCxcbiAgICAgIG9uUmF0aW9uYWxlQ2hhbmdlZCxcbiAgICAgIG9uVXBkYXRlSW1hZ2VEaW1lbnNpb24sXG4gICAgICBvblRlYWNoZXJJbnN0cnVjdGlvbnNDaGFuZ2VkLFxuICAgICAgb25VcGRhdGVTaGFwZXMsXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge1xuICAgICAgYmFzZUlucHV0Q29uZmlndXJhdGlvbiA9IHt9LFxuICAgICAgY29udGVudERpbWVuc2lvbnMgPSB7fSxcbiAgICAgIG1heEltYWdlV2lkdGggPSB7fSxcbiAgICAgIG1heEltYWdlSGVpZ2h0ID0ge30sXG4gICAgICBtdWx0aXBsZUNvcnJlY3QgPSB7fSxcbiAgICAgIHBhcnRpYWxTY29yaW5nID0ge30sXG4gICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvID0ge30sXG4gICAgICBwcm9tcHQgPSB7fSxcbiAgICAgIHJhdGlvbmFsZSA9IHt9LFxuICAgICAgc2V0dGluZ3NQYW5lbERpc2FibGVkLFxuICAgICAgc3BlbGxDaGVjayA9IHt9LFxuICAgICAgdGVhY2hlckluc3RydWN0aW9ucyA9IHt9LFxuICAgICAgd2l0aFJ1YnJpYyA9IHt9LFxuICAgICAgbWF0aE1sT3B0aW9ucyA9IHt9LFxuICAgICAgbGFuZ3VhZ2UgPSB7fSxcbiAgICAgIGxhbmd1YWdlQ2hvaWNlcyA9IHt9LFxuICAgIH0gPSBjb25maWd1cmF0aW9uIHx8IHt9O1xuICAgIGNvbnN0IHtcbiAgICAgIGVycm9ycyxcbiAgICAgIGV4dHJhQ1NTUnVsZXMsXG4gICAgICBwcm9tcHRFbmFibGVkLFxuICAgICAgcmF0aW9uYWxlRW5hYmxlZCxcbiAgICAgIHNwZWxsQ2hlY2tFbmFibGVkLFxuICAgICAgdGVhY2hlckluc3RydWN0aW9uc0VuYWJsZWQsXG4gICAgICB0b29sYmFyRWRpdG9yUG9zaXRpb24sXG4gICAgfSA9IG1vZGVsIHx8IHt9O1xuICAgIGNvbnN0IHtcbiAgICAgIHByb21wdDogcHJvbXB0RXJyb3IsXG4gICAgICByYXRpb25hbGU6IHJhdGlvbmFsZUVycm9yLFxuICAgICAgc2hhcGVzOiBzaGFwZXNFcnJvcixcbiAgICAgIHNlbGVjdGlvbnM6IHNlbGVjdGlvbnNFcnJvcixcbiAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnM6IHRlYWNoZXJJbnN0cnVjdGlvbnNFcnJvcixcbiAgICB9ID0gZXJyb3JzIHx8IHt9O1xuICAgIGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlID0gZ2VuZXJhdGVWYWxpZGF0aW9uTWVzc2FnZShjb25maWd1cmF0aW9uKTtcblxuICAgIGNvbnN0IGRlZmF1bHRJbWFnZU1heFdpZHRoID0gbWF4SW1hZ2VXaWR0aCAmJiBtYXhJbWFnZVdpZHRoLnByb21wdDtcbiAgICBjb25zdCBkZWZhdWx0SW1hZ2VNYXhIZWlnaHQgPSBtYXhJbWFnZUhlaWdodCAmJiBtYXhJbWFnZUhlaWdodC5wcm9tcHQ7XG5cbiAgICBjb25zdCB0b29sYmFyT3B0cyA9IHtcbiAgICAgIHBvc2l0aW9uOiB0b29sYmFyRWRpdG9yUG9zaXRpb24gPT09ICd0b3AnID8gJ3RvcCcgOiAnYm90dG9tJyxcbiAgICB9O1xuXG4gICAgY29uc3QgcGFuZWxTZXR0aW5ncyA9IHtcbiAgICAgIG11bHRpcGxlQ29ycmVjdDogbXVsdGlwbGVDb3JyZWN0LnNldHRpbmdzICYmIHRvZ2dsZShtdWx0aXBsZUNvcnJlY3QubGFiZWwpLFxuICAgICAgcGFydGlhbFNjb3Jpbmc6IHBhcnRpYWxTY29yaW5nLnNldHRpbmdzICYmIHRvZ2dsZShwYXJ0aWFsU2NvcmluZy5sYWJlbCksXG4gICAgICBwcm9tcHRFbmFibGVkOiBwcm9tcHQuc2V0dGluZ3MgJiYgdG9nZ2xlKHByb21wdC5sYWJlbCksXG4gICAgICAnbGFuZ3VhZ2UuZW5hYmxlZCc6IGxhbmd1YWdlLnNldHRpbmdzICYmIHRvZ2dsZShsYW5ndWFnZS5sYWJlbCwgdHJ1ZSksXG4gICAgICBsYW5ndWFnZTogbGFuZ3VhZ2Uuc2V0dGluZ3MgJiYgbGFuZ3VhZ2UuZW5hYmxlZCAmJiBkcm9wZG93bihsYW5ndWFnZUNob2ljZXMubGFiZWwsIGxhbmd1YWdlQ2hvaWNlcy5vcHRpb25zKSxcbiAgICB9O1xuICAgIGNvbnN0IHBhbmVsUHJvcGVydGllcyA9IHtcbiAgICAgIHRlYWNoZXJJbnN0cnVjdGlvbnNFbmFibGVkOiB0ZWFjaGVySW5zdHJ1Y3Rpb25zLnNldHRpbmdzICYmIHRvZ2dsZSh0ZWFjaGVySW5zdHJ1Y3Rpb25zLmxhYmVsKSxcbiAgICAgIHJhdGlvbmFsZUVuYWJsZWQ6IHJhdGlvbmFsZS5zZXR0aW5ncyAmJiB0b2dnbGUocmF0aW9uYWxlLmxhYmVsKSxcbiAgICAgIHNwZWxsQ2hlY2tFbmFibGVkOiBzcGVsbENoZWNrLnNldHRpbmdzICYmIHRvZ2dsZShzcGVsbENoZWNrLmxhYmVsKSxcbiAgICAgIHJ1YnJpY0VuYWJsZWQ6IHdpdGhSdWJyaWM/LnNldHRpbmdzICYmIHRvZ2dsZSh3aXRoUnVicmljPy5sYWJlbCksXG4gICAgfTtcblxuICAgIGNvbnN0IGdldFBsdWdpblByb3BzID0gKHByb3BzID0ge30pID0+ICh7XG4gICAgICAuLi5iYXNlSW5wdXRDb25maWd1cmF0aW9uLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGxheW91dC5Db25maWdMYXlvdXRcbiAgICAgICAgZXh0cmFDU1NSdWxlcz17ZXh0cmFDU1NSdWxlc31cbiAgICAgICAgZGltZW5zaW9ucz17Y29udGVudERpbWVuc2lvbnN9XG4gICAgICAgIGhpZGVTZXR0aW5ncz17c2V0dGluZ3NQYW5lbERpc2FibGVkfVxuICAgICAgICBzZXR0aW5ncz17XG4gICAgICAgICAgPFBhbmVsXG4gICAgICAgICAgICBtb2RlbD17bW9kZWx9XG4gICAgICAgICAgICBvbkNoYW5nZU1vZGVsPXtvbk1vZGVsQ2hhbmdlZEJ5Q29uZmlnfVxuICAgICAgICAgICAgY29uZmlndXJhdGlvbj17Y29uZmlndXJhdGlvbn1cbiAgICAgICAgICAgIG9uQ2hhbmdlQ29uZmlndXJhdGlvbj17b25Db25maWd1cmF0aW9uQ2hhbmdlZH1cbiAgICAgICAgICAgIGdyb3Vwcz17e1xuICAgICAgICAgICAgICBTZXR0aW5nczogcGFuZWxTZXR0aW5ncyxcbiAgICAgICAgICAgICAgUHJvcGVydGllczogcGFuZWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICA+XG4gICAgICAgIHt0ZWFjaGVySW5zdHJ1Y3Rpb25zRW5hYmxlZCAmJiAoXG4gICAgICAgICAgPFByb21wdENvbnRhaW5lciBsYWJlbD17dGVhY2hlckluc3RydWN0aW9ucy5sYWJlbH0+XG4gICAgICAgICAgICA8RWRpdGFibGVIdG1sXG4gICAgICAgICAgICAgIG1hcmt1cD17bW9kZWwudGVhY2hlckluc3RydWN0aW9ucyB8fCAnJ31cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e29uVGVhY2hlckluc3RydWN0aW9uc0NoYW5nZWR9XG4gICAgICAgICAgICAgIGltYWdlU3VwcG9ydD17aW1hZ2VTdXBwb3J0fVxuICAgICAgICAgICAgICBub25FbXB0eT17ZmFsc2V9XG4gICAgICAgICAgICAgIGVycm9yPXt0ZWFjaGVySW5zdHJ1Y3Rpb25zRXJyb3J9XG4gICAgICAgICAgICAgIHRvb2xiYXJPcHRzPXt0b29sYmFyT3B0c31cbiAgICAgICAgICAgICAgcGx1Z2luUHJvcHM9e2dldFBsdWdpblByb3BzKHRlYWNoZXJJbnN0cnVjdGlvbnM/LmlucHV0Q29uZmlndXJhdGlvbil9XG4gICAgICAgICAgICAgIHNwZWxsQ2hlY2s9e3NwZWxsQ2hlY2tFbmFibGVkfVxuICAgICAgICAgICAgICBtYXhJbWFnZVdpZHRoPXsobWF4SW1hZ2VXaWR0aCAmJiBtYXhJbWFnZVdpZHRoLnRlYWNoZXJJbnN0cnVjdGlvbnMpIHx8IGRlZmF1bHRJbWFnZU1heFdpZHRofVxuICAgICAgICAgICAgICBtYXhJbWFnZUhlaWdodD17KG1heEltYWdlSGVpZ2h0ICYmIG1heEltYWdlSGVpZ2h0LnRlYWNoZXJJbnN0cnVjdGlvbnMpIHx8IGRlZmF1bHRJbWFnZU1heEhlaWdodH1cbiAgICAgICAgICAgICAgdXBsb2FkU291bmRTdXBwb3J0PXt1cGxvYWRTb3VuZFN1cHBvcnR9XG4gICAgICAgICAgICAgIGxhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzPXtbeyBsYW5ndWFnZTogJ3NwYW5pc2gnIH0sIHsgbGFuZ3VhZ2U6ICdzcGVjaWFsJyB9XX1cbiAgICAgICAgICAgICAgbWF0aE1sT3B0aW9ucz17bWF0aE1sT3B0aW9uc31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7dGVhY2hlckluc3RydWN0aW9uc0Vycm9yICYmIDxFcnJvclRleHQ+e3RlYWNoZXJJbnN0cnVjdGlvbnNFcnJvcn08L0Vycm9yVGV4dD59XG4gICAgICAgICAgPC9Qcm9tcHRDb250YWluZXI+XG4gICAgICAgICl9XG5cbiAgICAgICAge3Byb21wdEVuYWJsZWQgJiYgKFxuICAgICAgICAgIDxQcm9tcHRDb250YWluZXIgbGFiZWw9e3Byb21wdC5sYWJlbH0+XG4gICAgICAgICAgICA8RWRpdGFibGVIdG1sXG4gICAgICAgICAgICAgIG1hcmt1cD17bW9kZWwucHJvbXB0IHx8ICcnfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17b25Qcm9tcHRDaGFuZ2VkfVxuICAgICAgICAgICAgICBpbWFnZVN1cHBvcnQ9e2ltYWdlU3VwcG9ydH1cbiAgICAgICAgICAgICAgbm9uRW1wdHk9e2ZhbHNlfVxuICAgICAgICAgICAgICBlcnJvcj17cHJvbXB0RXJyb3J9XG4gICAgICAgICAgICAgIHRvb2xiYXJPcHRzPXt0b29sYmFyT3B0c31cbiAgICAgICAgICAgICAgcGx1Z2luUHJvcHM9e2dldFBsdWdpblByb3BzKHByb21wdD8uaW5wdXRDb25maWd1cmF0aW9uKX1cbiAgICAgICAgICAgICAgc3BlbGxDaGVjaz17c3BlbGxDaGVja0VuYWJsZWR9XG4gICAgICAgICAgICAgIG1heEltYWdlV2lkdGg9e2RlZmF1bHRJbWFnZU1heFdpZHRofVxuICAgICAgICAgICAgICBtYXhJbWFnZUhlaWdodD17ZGVmYXVsdEltYWdlTWF4SGVpZ2h0fVxuICAgICAgICAgICAgICB1cGxvYWRTb3VuZFN1cHBvcnQ9e3VwbG9hZFNvdW5kU3VwcG9ydH1cbiAgICAgICAgICAgICAgbGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHM9e1t7IGxhbmd1YWdlOiAnc3BhbmlzaCcgfSwgeyBsYW5ndWFnZTogJ3NwZWNpYWwnIH1dfVxuICAgICAgICAgICAgICBtYXRoTWxPcHRpb25zPXttYXRoTWxPcHRpb25zfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtwcm9tcHRFcnJvciAmJiA8RXJyb3JUZXh0Pntwcm9tcHRFcnJvcn08L0Vycm9yVGV4dD59XG4gICAgICAgICAgPC9Qcm9tcHRDb250YWluZXI+XG4gICAgICAgICl9XG5cbiAgICAgICAgPEZsZXhDb250YWluZXI+XG4gICAgICAgICAgPFN1YkhlYWRpbmcgdmFyaWFudD1cImg2XCI+XG4gICAgICAgICAgICBEZWZpbmUgSG90c3BvdFxuICAgICAgICAgIDwvU3ViSGVhZGluZz5cbiAgICAgICAgICA8U3R5bGVkVG9vbHRpcFxuICAgICAgICAgICAgZGlzYWJsZUZvY3VzTGlzdGVuZXJcbiAgICAgICAgICAgIGRpc2FibGVUb3VjaExpc3RlbmVyXG4gICAgICAgICAgICBwbGFjZW1lbnQ9eydsZWZ0J31cbiAgICAgICAgICAgIHRpdGxlPXt2YWxpZGF0aW9uTWVzc2FnZX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8SW5mbyBmb250U2l6ZT17J3NtYWxsJ30gY29sb3I9eydwcmltYXJ5J30gc3R5bGU9e3sgZmxvYXQ6ICdyaWdodCcgfX0gLz5cbiAgICAgICAgICA8L1N0eWxlZFRvb2x0aXA+XG4gICAgICAgIDwvRmxleENvbnRhaW5lcj5cblxuICAgICAgICA8SG90c3BvdFBhbGV0dGVcbiAgICAgICAgICBob3RzcG90Q29sb3I9e21vZGVsLmhvdHNwb3RDb2xvcn1cbiAgICAgICAgICBob3RzcG90TGlzdD17bW9kZWwuaG90c3BvdExpc3R9XG4gICAgICAgICAgb3V0bGluZUNvbG9yPXttb2RlbC5vdXRsaW5lQ29sb3J9XG4gICAgICAgICAgb3V0bGluZUxpc3Q9e21vZGVsLm91dGxpbmVMaXN0fVxuICAgICAgICAgIG9uSG90c3BvdENvbG9yQ2hhbmdlPXsoY29sb3IpID0+IHRoaXMuaGFuZGxlQ29sb3JDaGFuZ2UoJ2hvdHNwb3QnLCBjb2xvcil9XG4gICAgICAgICAgb25PdXRsaW5lQ29sb3JDaGFuZ2U9eyhjb2xvcikgPT4gdGhpcy5oYW5kbGVDb2xvckNoYW5nZSgnb3V0bGluZScsIGNvbG9yKX1cbiAgICAgICAgLz5cblxuICAgICAgICA8SG90c3BvdENvbnRhaW5lclxuICAgICAgICAgIGRpbWVuc2lvbnM9e21vZGVsLmRpbWVuc2lvbnN9XG4gICAgICAgICAgaW1hZ2VVcmw9e21vZGVsLmltYWdlVXJsfVxuICAgICAgICAgIG11bHRpcGxlQ29ycmVjdD17bW9kZWwubXVsdGlwbGVDb3JyZWN0fVxuICAgICAgICAgIGhhc0Vycm9ycz17ISFzaGFwZXNFcnJvciB8fCAhIXNlbGVjdGlvbnNFcnJvcn1cbiAgICAgICAgICBob3RzcG90Q29sb3I9e21vZGVsLmhvdHNwb3RDb2xvcn1cbiAgICAgICAgICBvdXRsaW5lQ29sb3I9e21vZGVsLm91dGxpbmVDb2xvcn1cbiAgICAgICAgICBzZWxlY3RlZEhvdHNwb3RDb2xvcj17bW9kZWwuc2VsZWN0ZWRIb3RzcG90Q29sb3J9XG4gICAgICAgICAgaG92ZXJPdXRsaW5lQ29sb3I9e21vZGVsLmhvdmVyT3V0bGluZUNvbG9yfVxuICAgICAgICAgIG9uVXBkYXRlSW1hZ2VEaW1lbnNpb249e29uVXBkYXRlSW1hZ2VEaW1lbnNpb259XG4gICAgICAgICAgb25VcGRhdGVTaGFwZXM9e29uVXBkYXRlU2hhcGVzfVxuICAgICAgICAgIG9uSW1hZ2VVcGxvYWQ9e29uSW1hZ2VVcGxvYWR9XG4gICAgICAgICAgc2hhcGVzPXttb2RlbC5zaGFwZXN9XG4gICAgICAgICAgc3Ryb2tlV2lkdGg9e21vZGVsLnN0cm9rZVdpZHRofVxuICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW9FbmFibGVkPXtwcmVzZXJ2ZUFzcGVjdFJhdGlvLmVuYWJsZWR9XG4gICAgICAgICAgaW5zZXJ0SW1hZ2U9e2ltYWdlU3VwcG9ydCAmJiBpbWFnZVN1cHBvcnQuYWRkfVxuICAgICAgICAvPlxuICAgICAgICB7c2hhcGVzRXJyb3IgJiYgPEVycm9yVGV4dD57c2hhcGVzRXJyb3J9PC9FcnJvclRleHQ+fVxuICAgICAgICB7c2VsZWN0aW9uc0Vycm9yICYmIDxFcnJvclRleHQ+e3NlbGVjdGlvbnNFcnJvcn08L0Vycm9yVGV4dD59XG5cbiAgICAgICAge21vZGVsLmltYWdlVXJsICYmIChcbiAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICA8VHlwb2dyYXBoeSB2YXJpYW50PVwiaDZcIj5JbWFnZSBEaW1lbnNpb25zPC9UeXBvZ3JhcGh5PlxuXG4gICAgICAgICAgICA8RGltZW5zaW9uc0NvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPEZpZWxkQ29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxOdW1iZXJUZXh0RmllbGRcbiAgICAgICAgICAgICAgICAgIGtleT1cImhvdHNwb3QtbWFudWFsLXdpZHRoXCJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9e21vZGVsLmRpbWVuc2lvbnMud2lkdGh9XG4gICAgICAgICAgICAgICAgICBtaW49ezB9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUsIHZhbHVlKSA9PiB0aGlzLmhhbmRsZU9uVXBkYXRlSW1hZ2VEaW1lbnNpb25zKHZhbHVlLCAnd2lkdGgnKX1cbiAgICAgICAgICAgICAgICAgIHNob3dFcnJvcldoZW5PdXRzaWRlUmFuZ2VcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L0ZpZWxkQ29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxGaWVsZENvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8TnVtYmVyVGV4dEZpZWxkXG4gICAgICAgICAgICAgICAgICBrZXk9XCJob3RzcG90LW1hbnVhbC1oZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9e21vZGVsLmRpbWVuc2lvbnMuaGVpZ2h0fVxuICAgICAgICAgICAgICAgICAgbWluPXswfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlLCB2YWx1ZSkgPT4gdGhpcy5oYW5kbGVPblVwZGF0ZUltYWdlRGltZW5zaW9ucyh2YWx1ZSwgJ2hlaWdodCcpfVxuICAgICAgICAgICAgICAgICAgc2hvd0Vycm9yV2hlbk91dHNpZGVSYW5nZVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvRmllbGRDb250YWluZXI+XG4gICAgICAgICAgICA8L0RpbWVuc2lvbnNDb250YWluZXI+XG4gICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgKX1cblxuICAgICAgICB7cmF0aW9uYWxlRW5hYmxlZCAmJiAoXG4gICAgICAgICAgPFByb21wdENvbnRhaW5lciBsYWJlbD17cmF0aW9uYWxlLmxhYmVsfT5cbiAgICAgICAgICAgIDxFZGl0YWJsZUh0bWxcbiAgICAgICAgICAgICAgbWFya3VwPXttb2RlbC5yYXRpb25hbGUgfHwgJyd9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtvblJhdGlvbmFsZUNoYW5nZWR9XG4gICAgICAgICAgICAgIGltYWdlU3VwcG9ydD17aW1hZ2VTdXBwb3J0fVxuICAgICAgICAgICAgICBlcnJvcj17cmF0aW9uYWxlRXJyb3J9XG4gICAgICAgICAgICAgIHRvb2xiYXJPcHRzPXt0b29sYmFyT3B0c31cbiAgICAgICAgICAgICAgcGx1Z2luUHJvcHM9e2dldFBsdWdpblByb3BzKHJhdGlvbmFsZT8uaW5wdXRDb25maWd1cmF0aW9uKX1cbiAgICAgICAgICAgICAgc3BlbGxDaGVjaz17c3BlbGxDaGVja0VuYWJsZWR9XG4gICAgICAgICAgICAgIG1heEltYWdlV2lkdGg9eyhtYXhJbWFnZVdpZHRoICYmIG1heEltYWdlV2lkdGgucmF0aW9uYWxlKSB8fCBkZWZhdWx0SW1hZ2VNYXhXaWR0aH1cbiAgICAgICAgICAgICAgbWF4SW1hZ2VIZWlnaHQ9eyhtYXhJbWFnZUhlaWdodCAmJiBtYXhJbWFnZUhlaWdodC5yYXRpb25hbGUpIHx8IGRlZmF1bHRJbWFnZU1heEhlaWdodH1cbiAgICAgICAgICAgICAgdXBsb2FkU291bmRTdXBwb3J0PXt1cGxvYWRTb3VuZFN1cHBvcnR9XG4gICAgICAgICAgICAgIGxhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzPXtbeyBsYW5ndWFnZTogJ3NwYW5pc2gnIH0sIHsgbGFuZ3VhZ2U6ICdzcGVjaWFsJyB9XX1cbiAgICAgICAgICAgICAgbWF0aE1sT3B0aW9ucz17bWF0aE1sT3B0aW9uc31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7cmF0aW9uYWxlRXJyb3IgJiYgPEVycm9yVGV4dD57cmF0aW9uYWxlRXJyb3J9PC9FcnJvclRleHQ+fVxuICAgICAgICAgIDwvUHJvbXB0Q29udGFpbmVyPlxuICAgICAgICApfVxuICAgICAgPC9sYXlvdXQuQ29uZmlnTGF5b3V0PlxuICAgICk7XG4gIH1cbn1cblxuUm9vdC5wcm9wVHlwZXMgPSB7XG4gIGNvbmZpZ3VyYXRpb246IFByb3BUeXBlcy5vYmplY3QsXG4gIG1vZGVsOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGltYWdlU3VwcG9ydDogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBhZGQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIGRlbGV0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIH0pLFxuICB1cGxvYWRTb3VuZFN1cHBvcnQ6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgYWRkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBkZWxldGU6IFByb3BUeXBlcy5mdW5jLFxuICB9KSxcbiAgb25JbWFnZVVwbG9hZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25Db2xvckNoYW5nZWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uUHJvbXB0Q2hhbmdlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25VcGRhdGVJbWFnZURpbWVuc2lvbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25VcGRhdGVTaGFwZXM6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uTW9kZWxDaGFuZ2VkQnlDb25maWc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uUmF0aW9uYWxlQ2hhbmdlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25Db25maWd1cmF0aW9uQ2hhbmdlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25UZWFjaGVySW5zdHJ1Y3Rpb25zQ2hhbmdlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJvb3Q7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFB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