@pie-element/hotspot 4.10.16-next.1 → 4.11.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 (52) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/LICENSE.md +5 -0
  3. package/configure/CHANGELOG.md +75 -0
  4. package/configure/lib/button.js +1 -1
  5. package/configure/lib/defaults.js +3 -2
  6. package/configure/lib/defaults.js.map +1 -1
  7. package/configure/lib/hotspot-container.js +1 -1
  8. package/configure/lib/hotspot-drawable.js +2 -2
  9. package/configure/lib/hotspot-palette.js +1 -1
  10. package/configure/lib/hotspot-polygon.js +1 -1
  11. package/configure/lib/hotspot-rectangle.js +1 -1
  12. package/configure/lib/index.js +1 -1
  13. package/configure/lib/root.js +23 -18
  14. package/configure/lib/root.js.map +1 -1
  15. package/configure/lib/upload-control.js +1 -1
  16. package/configure/lib/utils.js +14 -2
  17. package/configure/lib/utils.js.map +1 -1
  18. package/configure/package.json +3 -3
  19. package/configure/src/__tests__/__snapshots__/root.test.js.snap +32 -4
  20. package/configure/src/defaults.js +2 -1
  21. package/configure/src/hotspot-drawable.jsx +1 -1
  22. package/configure/src/root.jsx +33 -26
  23. package/configure/src/utils.js +23 -1
  24. package/controller/CHANGELOG.md +12 -0
  25. package/controller/lib/defaults.js +1 -1
  26. package/controller/lib/index.js +1 -1
  27. package/controller/lib/index.js.map +1 -1
  28. package/controller/lib/utils.js +1 -1
  29. package/controller/package.json +1 -1
  30. package/lib/hotspot/container.js +1 -1
  31. package/lib/hotspot/icons.js +1 -1
  32. package/lib/hotspot/image.js +1 -1
  33. package/lib/hotspot/index.js +1 -1
  34. package/lib/hotspot/polygon.js +1 -1
  35. package/lib/hotspot/rectangle.js +1 -1
  36. package/lib/index.js +4 -1
  37. package/lib/session-updater.js +1 -1
  38. package/package.json +4 -4
  39. package/src/index.js +5 -0
  40. package/configure/lib/__tests__/hotspot-container.test.js +0 -281
  41. package/configure/lib/__tests__/hotspot-drawable.test.js +0 -241
  42. package/configure/lib/__tests__/index.test.js +0 -224
  43. package/configure/lib/__tests__/root.test.js +0 -443
  44. package/configure/lib/__tests__/utils.test.js +0 -335
  45. package/controller/lib/__tests__/index.test.js +0 -921
  46. package/controller/lib/__tests__/utils.test.js +0 -8
  47. package/docs/demo/pie.manifest.json +0 -11
  48. package/lib/__tests__/container-test.js +0 -185
  49. package/lib/__tests__/image-test.js +0 -63
  50. package/lib/__tests__/polygon-test.js +0 -99
  51. package/lib/__tests__/rectangle-test.js +0 -92
  52. package/lib/__tests__/session-updater-test.js +0 -78
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-element/hotspot",
3
- "version": "4.10.16-next.1",
3
+ "version": "4.11.0",
4
4
  "description": "",
5
5
  "repository": "pie-framework/pie-elements",
6
6
  "publishConfig": {
@@ -9,8 +9,8 @@
9
9
  "dependencies": {
10
10
  "@material-ui/core": "^3.9.3",
11
11
  "@pie-framework/pie-player-events": "^0.1.0",
12
- "@pie-lib/math-rendering": "^2.3.13",
13
- "@pie-lib/render-ui": "^4.12.5",
12
+ "@pie-lib/math-rendering": "^2.4.0",
13
+ "@pie-lib/render-ui": "^4.12.6",
14
14
  "konva": "^3.2.5",
15
15
  "prop-types": "^15.6.1",
16
16
  "react": "^16.8.1",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "author": "pie framework developers",
21
21
  "license": "ISC",
22
- "gitHead": "0e14ff981bcdc8a89a0e58484026496701bfdbc3",
22
+ "gitHead": "87c4247b2cca04380c8638f88e57bba47fb6c06a",
23
23
  "scripts": {
24
24
  "postpublish": "../../scripts/postpublish"
25
25
  },
package/src/index.js CHANGED
@@ -42,6 +42,10 @@ export default class Hotspot extends HTMLElement {
42
42
  this._render();
43
43
  }
44
44
 
45
+ get session() {
46
+ return this._session;
47
+ }
48
+
45
49
  onSelectChoice(data) {
46
50
  updateSessionValue(this._session, this._model, data);
47
51
 
@@ -63,6 +67,7 @@ export default class Hotspot extends HTMLElement {
63
67
  session: this._session,
64
68
  onSelectChoice: this.onSelectChoice.bind(this)
65
69
  });
70
+
66
71
  ReactDOM.render(el, this, () => {
67
72
  renderMath(this);
68
73
  });
@@ -1,281 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
6
-
7
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
-
9
- var _enzyme = require("enzyme");
10
-
11
- var _react = _interopRequireDefault(require("react"));
12
-
13
- var _hotspotContainer = require("../hotspot-container");
14
-
15
- var _utils = require("../utils");
16
-
17
- 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; }
18
-
19
- 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; }
20
-
21
- var model = function model() {
22
- return {
23
- imageUrl: 'https://cdn.fluence.net/image/0240eb1455ce4c4bb6180232347b6aef_W',
24
- shapes: (0, _utils.groupShapes)((0, _utils.getAllShapes)({
25
- rectangles: [{
26
- id: '0',
27
- height: 140,
28
- width: 130,
29
- x: 1,
30
- y: 1,
31
- correct: true
32
- }, {
33
- id: '1',
34
- height: 140,
35
- width: 130,
36
- x: 140,
37
- y: 1
38
- }, {
39
- id: '2',
40
- height: 140,
41
- width: 130,
42
- x: 280,
43
- y: 1
44
- }],
45
- polygons: [{
46
- id: '3',
47
- points: [{
48
- x: 1,
49
- y: 148
50
- }, {
51
- x: 1,
52
- y: 288
53
- }, {
54
- y: 288,
55
- x: 129
56
- }, {
57
- y: 148,
58
- x: 129
59
- }],
60
- correct: true
61
- }, {
62
- id: '4',
63
- points: [{
64
- y: 151,
65
- x: 141
66
- }, {
67
- y: 289,
68
- x: 141
69
- }, {
70
- y: 289,
71
- x: 269
72
- }, {
73
- x: 269,
74
- y: 151
75
- }],
76
- correct: false
77
- }, {
78
- id: '5',
79
- points: [{
80
- x: 279,
81
- y: 150
82
- }, {
83
- x: 279,
84
- y: 289
85
- }, {
86
- x: 407,
87
- y: 289
88
- }, {
89
- x: 407,
90
- y: 150
91
- }],
92
- correct: false
93
- }]
94
- })),
95
- dimensions: {
96
- height: 291,
97
- width: 410
98
- },
99
- hotspotColor: 'rgba(137, 183, 244, 0.65)',
100
- outlineColor: 'blue',
101
- multipleCorrect: true
102
- };
103
- };
104
-
105
- describe('HotspotContainer', function () {
106
- var w,
107
- onImageUpload = jest.fn(),
108
- onUpdateImageDimension = jest.fn(),
109
- onUpdateShapes = jest.fn(),
110
- initialModel = model();
111
- beforeEach(function () {
112
- w = function w(extras) {
113
- var props = _objectSpread({
114
- classes: {},
115
- dimensions: initialModel.dimensions,
116
- imageUrl: initialModel.imageUrl,
117
- multipleCorrect: initialModel.multipleCorrect,
118
- hotspotColor: initialModel.hotspotColor,
119
- outlineColor: initialModel.outlineColor,
120
- onUpdateImageDimension: onUpdateImageDimension,
121
- onUpdateShapes: onUpdateShapes,
122
- onImageUpload: onImageUpload,
123
- shapes: initialModel.shapes
124
- }, extras);
125
-
126
- return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_hotspotContainer.Container, props));
127
- };
128
- });
129
- describe('render', function () {
130
- it('renders', function () {
131
- expect(w()).toMatchSnapshot();
132
- });
133
- });
134
- describe('logic', function () {
135
- var wrapper;
136
- var formattedShapes = [{
137
- id: '0',
138
- height: 140,
139
- width: 130,
140
- x: 1,
141
- y: 1,
142
- correct: true,
143
- group: 'rectangles',
144
- index: 0
145
- }, {
146
- id: '1',
147
- height: 140,
148
- width: 130,
149
- x: 140,
150
- y: 1,
151
- group: 'rectangles',
152
- index: 1
153
- }, {
154
- id: '2',
155
- height: 140,
156
- width: 130,
157
- x: 280,
158
- y: 1,
159
- group: 'rectangles',
160
- index: 2
161
- }, {
162
- id: '3',
163
- points: [{
164
- x: 1,
165
- y: 148
166
- }, {
167
- x: 1,
168
- y: 288
169
- }, {
170
- y: 288,
171
- x: 129
172
- }, {
173
- y: 148,
174
- x: 129
175
- }],
176
- correct: true,
177
- group: 'polygons',
178
- index: 3
179
- }, {
180
- id: '4',
181
- points: [{
182
- y: 151,
183
- x: 141
184
- }, {
185
- y: 289,
186
- x: 141
187
- }, {
188
- y: 289,
189
- x: 269
190
- }, {
191
- x: 269,
192
- y: 151
193
- }],
194
- correct: false,
195
- group: 'polygons',
196
- index: 4
197
- }, {
198
- id: '5',
199
- points: [{
200
- x: 279,
201
- y: 150
202
- }, {
203
- x: 279,
204
- y: 289
205
- }, {
206
- x: 407,
207
- y: 289
208
- }, {
209
- x: 407,
210
- y: 150
211
- }],
212
- correct: false,
213
- group: 'polygons',
214
- index: 5
215
- }];
216
- beforeEach(function () {
217
- wrapper = w();
218
- });
219
- it('state will contain formatted shapes', function () {
220
- expect(wrapper.instance().state.shapes).toEqual(expect.arrayContaining(formattedShapes));
221
- });
222
- it('onUpdateShapes with new added shape', function () {
223
- var newShape = {
224
- id: '7',
225
- height: 140,
226
- width: 130,
227
- x: 280,
228
- y: 1,
229
- group: 'rectangles'
230
- };
231
- wrapper.instance().onUpdateShapes([].concat(formattedShapes, [newShape]));
232
- expect(onUpdateShapes).toHaveBeenLastCalledWith({
233
- rectangles: [].concat((0, _toConsumableArray2["default"])(initialModel.shapes.rectangles), [{
234
- id: '7',
235
- height: 140,
236
- width: 130,
237
- x: 280,
238
- y: 1
239
- }]),
240
- polygons: initialModel.shapes.polygons
241
- });
242
- });
243
- it('onUpdateShapes with no shapes', function () {
244
- wrapper.instance().onUpdateShapes([]);
245
- expect(onUpdateShapes).toHaveBeenLastCalledWith({
246
- rectangles: [],
247
- polygons: []
248
- });
249
- });
250
- it('handleUndo if no new shape was added', function () {
251
- wrapper.instance().handleUndo();
252
- expect(onUpdateShapes).toHaveBeenLastCalledWith(_objectSpread(_objectSpread({}, initialModel.shapes), {}, {
253
- polygons: initialModel.shapes.polygons.slice(0, -1)
254
- }));
255
- });
256
- it('handleUndo if new shape was added', function () {
257
- var newShape = {
258
- id: '7',
259
- height: 140,
260
- width: 130,
261
- x: 280,
262
- y: 1,
263
- index: 6
264
- }; // first, add a new shape
265
-
266
- wrapper.instance().state.shapes = (0, _utils.getAllShapes)(_objectSpread(_objectSpread({}, initialModel.shapes), {}, {
267
- rectangles: [].concat((0, _toConsumableArray2["default"])(initialModel.shapes.rectangles), [newShape])
268
- }));
269
- wrapper.instance().handleUndo();
270
- expect(onUpdateShapes).toBeCalledWith(initialModel.shapes);
271
- });
272
- it('handleClearAll', function () {
273
- wrapper.instance().handleClearAll();
274
- expect(onUpdateShapes).toHaveBeenLastCalledWith({
275
- rectangles: [],
276
- polygons: []
277
- });
278
- });
279
- });
280
- });
281
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaG90c3BvdC1jb250YWluZXIudGVzdC5qcyJdLCJuYW1lcyI6WyJtb2RlbCIsImltYWdlVXJsIiwic2hhcGVzIiwicmVjdGFuZ2xlcyIsImlkIiwiaGVpZ2h0Iiwid2lkdGgiLCJ4IiwieSIsImNvcnJlY3QiLCJwb2x5Z29ucyIsInBvaW50cyIsImRpbWVuc2lvbnMiLCJob3RzcG90Q29sb3IiLCJvdXRsaW5lQ29sb3IiLCJtdWx0aXBsZUNvcnJlY3QiLCJkZXNjcmliZSIsInciLCJvbkltYWdlVXBsb2FkIiwiamVzdCIsImZuIiwib25VcGRhdGVJbWFnZURpbWVuc2lvbiIsIm9uVXBkYXRlU2hhcGVzIiwiaW5pdGlhbE1vZGVsIiwiYmVmb3JlRWFjaCIsImV4dHJhcyIsInByb3BzIiwiY2xhc3NlcyIsIml0IiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90Iiwid3JhcHBlciIsImZvcm1hdHRlZFNoYXBlcyIsImdyb3VwIiwiaW5kZXgiLCJpbnN0YW5jZSIsInN0YXRlIiwidG9FcXVhbCIsImFycmF5Q29udGFpbmluZyIsIm5ld1NoYXBlIiwidG9IYXZlQmVlbkxhc3RDYWxsZWRXaXRoIiwiaGFuZGxlVW5kbyIsInNsaWNlIiwidG9CZUNhbGxlZFdpdGgiLCJoYW5kbGVDbGVhckFsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsSUFBTUEsS0FBSyxHQUFHLFNBQVJBLEtBQVE7QUFBQSxTQUFPO0FBQ25CQyxJQUFBQSxRQUFRLEVBQUUsa0VBRFM7QUFFbkJDLElBQUFBLE1BQU0sRUFBRSx3QkFBWSx5QkFBYTtBQUMvQkMsTUFBQUEsVUFBVSxFQUFFLENBQ1Y7QUFDRUMsUUFBQUEsRUFBRSxFQUFFLEdBRE47QUFFRUMsUUFBQUEsTUFBTSxFQUFFLEdBRlY7QUFHRUMsUUFBQUEsS0FBSyxFQUFFLEdBSFQ7QUFJRUMsUUFBQUEsQ0FBQyxFQUFFLENBSkw7QUFLRUMsUUFB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QUlBUixNQUFBQSxPQUFPLENBQUNJLFFBQVIsR0FBbUJNLFVBQW5CO0FBQ0FaLE1BQUFBLE1BQU0sQ0FBQ1AsY0FBRCxDQUFOLENBQXVCcUIsY0FBdkIsQ0FBc0NwQixZQUFZLENBQUNyQixNQUFuRDtBQUNELEtBakJDLENBQUY7QUFtQkEwQixJQUFBQSxFQUFFLENBQUMsZ0JBQUQsRUFBbUIsWUFBTTtBQUN6QkcsTUFBQUEsT0FBTyxDQUFDSSxRQUFSLEdBQW1CUyxjQUFuQjtBQUNBZixNQUFBQSxNQUFNLENBQUNQLGNBQUQsQ0FBTixDQUF1QmtCLHdCQUF2QixDQUFnRDtBQUM5Q3JDLFFBQUFBLFVBQVUsRUFBRSxFQURrQztBQUU5Q08sUUFBQUEsUUFBUSxFQUFFO0FBRm9DLE9BQWhEO0FBSUQsS0FOQyxDQUFGO0FBT0QsR0E3SU8sQ0FBUjtBQThJRCxDQWhMTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2hhbGxvdyB9IGZyb20gJ2VuenltZSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSAnLi4vaG90c3BvdC1jb250YWluZXInO1xuaW1wb3J0IHsgZ2V0QWxsU2hhcGVzLCBncm91cFNoYXBlcyB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgbW9kZWwgPSAoKSA9PiAoe1xuICBpbWFnZVVybDogJ2h0dHBzOi8vY2RuLmZsdWVuY2UubmV0L2ltYWdlLzAyNDBlYjE0NTVjZTRjNGJiNjE4MDIzMjM0N2I2YWVmX1cnLFxuICBzaGFwZXM6IGdyb3VwU2hhcGVzKGdldEFsbFNoYXBlcyh7XG4gICAgcmVjdGFuZ2xlczogW1xuICAgICAge1xuICAgICAgICBpZDogJzAnLFxuICAgICAgICBoZWlnaHQ6IDE0MCxcbiAgICAgICAgd2lkdGg6IDEzMCxcbiAgICAgICAgeDogMSxcbiAgICAgICAgeTogMSxcbiAgICAgICAgY29ycmVjdDogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBpZDogJzEnLFxuICAgICAgICBoZWlnaHQ6IDE0MCxcbiAgICAgICAgd2lkdGg6IDEzMCxcbiAgICAgICAgeDogMTQwLFxuICAgICAgICB5OiAxXG4gICAgICB9LCB7XG4gICAgICAgIGlkOiAnMicsXG4gICAgICAgIGhlaWdodDogMTQwLFxuICAgICAgICB3aWR0aDogMTMwLFxuICAgICAgICB4OiAyODAsXG4gICAgICAgIHk6IDFcbiAgICAgIH1cbiAgICBdLFxuICAgIHBvbHlnb25zOiBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnMycsXG4gICAgICAgIHBvaW50czogW3sgeDogMSwgeTogMTQ4IH0sIHsgeDogMSwgeTogMjg4IH0sIHsgeTogMjg4LCB4OiAxMjkgfSwgeyB5OiAxNDgsIHg6IDEyOSB9XSxcbiAgICAgICAgY29ycmVjdDogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBpZDogJzQnLFxuICAgICAgICBwb2ludHM6IFt7IHk6IDE1MSwgeDogMTQxIH0sIHsgeTogMjg5LCB4OiAxNDEgfSwgeyB5OiAyODksIHg6IDI2OSB9LCB7IHg6IDI2OSwgeTogMTUxIH1dLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBpZDogJzUnLFxuICAgICAgICBwb2ludHM6IFt7IHg6IDI3OSwgeTogMTUwIH0sIHsgeDogMjc5LCB5OiAyODkgfSwgeyB4OiA0MDcsIHk6IDI4OSB9LCB7IHg6IDQwNywgeTogMTUwIH1dLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZVxuICAgICAgfV1cbiAgfSkpLFxuICBkaW1lbnNpb25zOiB7XG4gICAgaGVpZ2h0OiAyOTEsIHdpZHRoOiA0MTBcbiAgfSxcbiAgaG90c3BvdENvbG9yOiAncmdiYSgxMzcsIDE4MywgMjQ0LCAwLjY1KScsXG4gIG91dGxpbmVDb2xvcjogJ2JsdWUnLFxuICBtdWx0aXBsZUNvcnJlY3Q6IHRydWVcbn0pO1xuXG5kZXNjcmliZSgnSG90c3BvdENvbnRhaW5lcicsICgpID0+IHtcbiAgbGV0IHcsXG4gICAgb25JbWFnZVVwbG9hZCA9IGplc3QuZm4oKSxcbiAgICBvblVwZGF0ZUltYWdlRGltZW5zaW9uID0gamVzdC5mbigpLFxuICAgIG9uVXBkYXRlU2hhcGVzID0gamVzdC5mbigpLFxuICAgIGluaXRpYWxNb2RlbCA9IG1vZGVsKClcbiAgO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHcgPSBleHRyYXMgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgICBkaW1lbnNpb25zOiBpbml0aWFsTW9kZWwuZGltZW5zaW9ucyxcbiAgICAgICAgaW1hZ2VVcmw6IGluaXRpYWxNb2RlbC5pbWFnZVVybCxcbiAgICAgICAgbXVsdGlwbGVDb3JyZWN0OiBpbml0aWFsTW9kZWwubXVsdGlwbGVDb3JyZWN0LFxuICAgICAgICBob3RzcG90Q29sb3I6IGluaXRpYWxNb2RlbC5ob3RzcG90Q29sb3IsXG4gICAgICAgIG91dGxpbmVDb2xvcjogaW5pdGlhbE1vZGVsLm91dGxpbmVDb2xvcixcbiAgICAgICAgb25VcGRhdGVJbWFnZURpbWVuc2lvbjogb25VcGRhdGVJbWFnZURpbWVuc2lvbixcbiAgICAgICAgb25VcGRhdGVTaGFwZXM6IG9uVXBkYXRlU2hhcGVzLFxuICAgICAgICBvbkltYWdlVXBsb2FkOiBvbkltYWdlVXBsb2FkLFxuICAgICAgICBzaGFwZXM6IGluaXRpYWxNb2RlbC5zaGFwZXMsXG4gICAgICAgIC4uLmV4dHJhc1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHNoYWxsb3coPENvbnRhaW5lciB7Li4ucHJvcHN9IC8+KTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXInLCAoKSA9PiB7XG4gICAgaXQoJ3JlbmRlcnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodygpKS50b01hdGNoU25hcHNob3QoKTtcbiAgICB9KVxuICB9KTtcblxuICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgbGV0IHdyYXBwZXI7XG4gICAgbGV0IGZvcm1hdHRlZFNoYXBlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICcwJyxcbiAgICAgICAgaGVpZ2h0OiAxNDAsXG4gICAgICAgIHdpZHRoOiAxMzAsXG4gICAgICAgIHg6IDEsXG4gICAgICAgIHk6IDEsXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIGdyb3VwOiAncmVjdGFuZ2xlcycsXG4gICAgICAgIGluZGV4OiAwXG4gICAgICB9LCB7XG4gICAgICAgIGlkOiAnMScsXG4gICAgICAgIGhlaWdodDogMTQwLFxuICAgICAgICB3aWR0aDogMTMwLFxuICAgICAgICB4OiAxNDAsXG4gICAgICAgIHk6IDEsXG4gICAgICAgIGdyb3VwOiAncmVjdGFuZ2xlcycsXG4gICAgICAgIGluZGV4OiAxXG4gICAgICB9LCB7XG4gICAgICAgIGlkOiAnMicsXG4gICAgICAgIGhlaWdodDogMTQwLFxuICAgICAgICB3aWR0aDogMTMwLFxuICAgICAgICB4OiAyODAsXG4gICAgICAgIHk6IDEsXG4gICAgICAgIGdyb3VwOiAncmVjdGFuZ2xlcycsXG4gICAgICAgIGluZGV4OiAyXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJzMnLFxuICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICB7IHg6IDEsIHk6IDE0OCB9LFxuICAgICAgICAgIHsgeDogMSwgeTogMjg4IH0sXG4gICAgICAgICAgeyB5OiAyODgsIHg6IDEyOSB9LFxuICAgICAgICAgIHsgeTogMTQ4LCB4OiAxMjkgfV0sXG4gICAgICAgIGNvcnJlY3Q6IHRydWUsXG4gICAgICAgIGdyb3VwOiAncG9seWdvbnMnLFxuICAgICAgICBpbmRleDogM1xuICAgICAgfSwge1xuICAgICAgICBpZDogJzQnLFxuICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICB7IHk6IDE1MSwgeDogMTQxIH0sXG4gICAgICAgICAgeyB5OiAyODksIHg6IDE0MSB9LFxuICAgICAgICAgIHsgeTogMjg5LCB4OiAyNjkgfSxcbiAgICAgICAgICB7IHg6IDI2OSwgeTogMTUxIH1dLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgZ3JvdXA6ICdwb2x5Z29ucycsXG4gICAgICAgIGluZGV4OiA0XG4gICAgICB9LCB7XG4gICAgICAgIGlkOiAnNScsXG4gICAgICAgIHBvaW50czogW1xuICAgICAgICAgIHsgeDogMjc5LCB5OiAxNTAgfSxcbiAgICAgICAgICB7IHg6IDI3OSwgeTogMjg5IH0sXG4gICAgICAgICAgeyB4OiA0MDcsIHk6IDI4OSB9LFxuICAgICAgICAgIHsgeDogNDA3LCB5OiAxNTAgfVxuICAgICAgICBdLFxuICAgICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgICAgZ3JvdXA6ICdwb2x5Z29ucycsXG4gICAgICAgIGluZGV4OiA1XG4gICAgICB9XG4gICAgXTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgd3JhcHBlciA9IHcoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdGF0ZSB3aWxsIGNvbnRhaW4gZm9ybWF0dGVkIHNoYXBlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmluc3RhbmNlKCkuc3RhdGUuc2hhcGVzKS50b0VxdWFsKGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoZm9ybWF0dGVkU2hhcGVzKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnb25VcGRhdGVTaGFwZXMgd2l0aCBuZXcgYWRkZWQgc2hhcGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXdTaGFwZSA9IHtcbiAgICAgICAgaWQ6ICc3JyxcbiAgICAgICAgaGVpZ2h0OiAxNDAsXG4gICAgICAgIHdpZHRoOiAxMzAsXG4gICAgICAgIHg6IDI4MCxcbiAgICAgICAgeTogMSxcbiAgICAgICAgZ3JvdXA6ICdyZWN0YW5nbGVzJ1xuICAgICAgfTtcblxuICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLm9uVXBkYXRlU2hhcGVzKFsuLi5mb3JtYXR0ZWRTaGFwZXMsIG5ld1NoYXBlXSk7XG5cbiAgICAgIGV4cGVjdChvblVwZGF0ZVNoYXBlcykudG9IYXZlQmVlbkxhc3RDYWxsZWRXaXRoKHtcbiAgICAgICAgcmVjdGFuZ2xlczogW1xuICAgICAgICAgIC4uLmluaXRpYWxNb2RlbC5zaGFwZXMucmVjdGFuZ2xlcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJzcnLFxuICAgICAgICAgICAgaGVpZ2h0OiAxNDAsXG4gICAgICAgICAgICB3aWR0aDogMTMwLFxuICAgICAgICAgICAgeDogMjgwLFxuICAgICAgICAgICAgeTogMSxcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHBvbHlnb25zOiBpbml0aWFsTW9kZWwuc2hhcGVzLnBvbHlnb25zXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgaXQoJ29uVXBkYXRlU2hhcGVzIHdpdGggbm8gc2hhcGVzJywgKCkgPT4ge1xuICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLm9uVXBkYXRlU2hhcGVzKFtdKTtcblxuICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0hhdmVCZWVuTGFzdENhbGxlZFdpdGgoe1xuICAgICAgICByZWN0YW5nbGVzOiBbXSxcbiAgICAgICAgcG9seWdvbnM6IFtdXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZVVuZG8gaWYgbm8gbmV3IHNoYXBlIHdhcyBhZGRlZCcsICgpID0+IHtcbiAgICAgIHdyYXBwZXIuaW5zdGFuY2UoKS5oYW5kbGVVbmRvKCk7XG4gICAgICBleHBlY3Qob25VcGRhdGVTaGFwZXMpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCh7XG4gICAgICAgIC4uLmluaXRpYWxNb2RlbC5zaGFwZXMsXG4gICAgICAgIHBvbHlnb25zOiBpbml0aWFsTW9kZWwuc2hhcGVzLnBvbHlnb25zLnNsaWNlKDAsIC0xKVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlVW5kbyBpZiBuZXcgc2hhcGUgd2FzIGFkZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbmV3U2hhcGUgPSB7XG4gICAgICAgIGlkOiAnNycsXG4gICAgICAgIGhlaWdodDogMTQwLFxuICAgICAgICB3aWR0aDogMTMwLFxuICAgICAgICB4OiAyODAsXG4gICAgICAgIHk6IDEsXG4gICAgICAgIGluZGV4OiA2XG4gICAgICB9O1xuXG4gICAgICAvLyBmaXJzdCwgYWRkIGEgbmV3IHNoYXBlXG4gICAgICB3cmFwcGVyLmluc3RhbmNlKCkuc3RhdGUuc2hhcGVzID0gZ2V0QWxsU2hhcGVzKHtcbiAgICAgICAgLi4uaW5pdGlhbE1vZGVsLnNoYXBlcyxcbiAgICAgICAgcmVjdGFuZ2xlczogWyAuLi5pbml0aWFsTW9kZWwuc2hhcGVzLnJlY3RhbmdsZXMsIG5ld1NoYXBlXSxcbiAgICAgIH0pO1xuICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZVVuZG8oKTtcbiAgICAgIGV4cGVjdChvblVwZGF0ZVNoYXBlcykudG9CZUNhbGxlZFdpdGgoaW5pdGlhbE1vZGVsLnNoYXBlcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlQ2xlYXJBbGwnLCAoKSA9PiB7XG4gICAgICB3cmFwcGVyLmluc3RhbmNlKCkuaGFuZGxlQ2xlYXJBbGwoKTtcbiAgICAgIGV4cGVjdChvblVwZGF0ZVNoYXBlcykudG9IYXZlQmVlbkxhc3RDYWxsZWRXaXRoKHtcbiAgICAgICAgcmVjdGFuZ2xlczogW10sXG4gICAgICAgIHBvbHlnb25zOiBbXVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -1,241 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
6
-
7
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
-
9
- var _enzyme = require("enzyme");
10
-
11
- var _react = _interopRequireDefault(require("react"));
12
-
13
- var _hotspotDrawable = require("../hotspot-drawable");
14
-
15
- 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; }
16
-
17
- 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; }
18
-
19
- var model = function model() {
20
- return {
21
- imageUrl: 'https://cdn.fluence.net/image/0240eb1455ce4c4bb6180232347b6aef_W',
22
- shapes: [{
23
- id: '0',
24
- height: 140,
25
- width: 130,
26
- x: 1,
27
- y: 1,
28
- correct: true,
29
- group: 'rectangles'
30
- }, {
31
- id: '1',
32
- height: 140,
33
- width: 130,
34
- x: 140,
35
- y: 1,
36
- group: 'rectangles'
37
- }, {
38
- id: '2',
39
- height: 140,
40
- width: 130,
41
- x: 280,
42
- y: 1,
43
- group: 'rectangles'
44
- }, {
45
- id: '3',
46
- points: [{
47
- x: 1,
48
- y: 148
49
- }, {
50
- x: 1,
51
- y: 288
52
- }, {
53
- y: 288,
54
- x: 129
55
- }, {
56
- y: 148,
57
- x: 129
58
- }],
59
- correct: true,
60
- group: 'polygons'
61
- }, {
62
- id: '4',
63
- points: [{
64
- y: 151,
65
- x: 141
66
- }, {
67
- y: 289,
68
- x: 141
69
- }, {
70
- y: 289,
71
- x: 269
72
- }, {
73
- x: 269,
74
- y: 151
75
- }],
76
- correct: false,
77
- group: 'polygons'
78
- }, {
79
- id: '5',
80
- points: [{
81
- x: 279,
82
- y: 150
83
- }, {
84
- x: 279,
85
- y: 289
86
- }, {
87
- x: 407,
88
- y: 289
89
- }, {
90
- x: 407,
91
- y: 150
92
- }],
93
- correct: false,
94
- group: 'polygons'
95
- }],
96
- dimensions: {
97
- height: 291,
98
- width: 410
99
- },
100
- hotspotColor: 'rgba(137, 183, 244, 0.65)',
101
- outlineColor: 'blue',
102
- multipleCorrect: true
103
- };
104
- };
105
-
106
- describe('HotspotDrawable', function () {
107
- var w,
108
- handleDisableDrag = jest.fn(),
109
- handleEnableDrag = jest.fn(),
110
- onUpdateImageDimension = jest.fn(),
111
- onUpdateShapes = jest.fn(),
112
- initialModel = model();
113
- beforeEach(function () {
114
- w = function w(extras) {
115
- var props = _objectSpread({
116
- classes: {},
117
- dimensions: initialModel.dimensions,
118
- disableDrag: handleDisableDrag,
119
- enableDrag: handleEnableDrag,
120
- imageUrl: initialModel.imageUrl,
121
- hotspotColor: initialModel.hotspotColor,
122
- multipleCorrect: initialModel.multipleCorrect,
123
- onUpdateImageDimension: onUpdateImageDimension,
124
- onUpdateShapes: onUpdateShapes,
125
- outlineColor: initialModel.outlineColor,
126
- shapes: initialModel.shapes,
127
- strokeWidth: 5
128
- }, extras);
129
-
130
- return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_hotspotDrawable.Drawable, props));
131
- };
132
- });
133
- describe('render', function () {
134
- it('renders with default strokeWidth', function () {
135
- expect(w()).toMatchSnapshot();
136
- });
137
- it('renders with given strokeWidth', function () {
138
- expect(w({
139
- strokeWidth: 10
140
- })).toMatchSnapshot();
141
- });
142
- it('renders', function () {
143
- expect(w()).toMatchSnapshot();
144
- });
145
- });
146
- describe('logic', function () {
147
- var wrapper;
148
- beforeEach(function () {
149
- wrapper = w();
150
- });
151
- it('handleOnMouseDown target != Stage', function () {
152
- wrapper.instance().state.stateShapes = initialModel.shapes;
153
- var event = {
154
- target: 'Line',
155
- currentTarget: 'Stage',
156
- evt: {
157
- layerX: 20,
158
- layerY: 30
159
- }
160
- };
161
- wrapper.instance().handleOnMouseDown(event);
162
- expect(onUpdateShapes).not.toBeCalled();
163
- });
164
- it('handleOnMouseDown target = Stage', function () {
165
- var event = {
166
- target: 'Stage',
167
- currentTarget: 'Stage',
168
- evt: {
169
- layerX: 20,
170
- layerY: 30
171
- }
172
- };
173
- wrapper.instance().handleOnMouseDown(event);
174
- expect(onUpdateShapes).toHaveBeenCalledWith([].concat((0, _toConsumableArray2["default"])(initialModel.shapes), [{
175
- id: '6',
176
- height: 0,
177
- width: 0,
178
- x: 20,
179
- y: 30,
180
- group: 'rectangles',
181
- index: 6
182
- }]));
183
- });
184
- it('handleOnMouseUp isDrawing = true', function () {
185
- wrapper.instance().state.isDrawing = true;
186
- wrapper.instance().state.stateShapes = initialModel.shapes.slice(0, 2);
187
- wrapper.instance().handleOnMouseUp({
188
- evt: {
189
- layerX: 20,
190
- layerY: 30
191
- }
192
- });
193
- expect(onUpdateShapes).toHaveBeenCalledWith((0, _toConsumableArray2["default"])(initialModel.shapes.slice(0, 2))); // at this point, state.stateShapes is false, so we don't want to update shapes with false (onUpdateShapes)
194
-
195
- expect(wrapper.instance().state.stateShapes).toEqual(false);
196
- wrapper.instance().handleOnMouseUp({
197
- evt: {
198
- layerX: 20,
199
- layerY: 30
200
- }
201
- });
202
- expect(onUpdateShapes).not.toBeCalledWith(false);
203
- wrapper.instance().handleOnMouseUp({});
204
- expect(onUpdateShapes).toHaveBeenCalledWith(initialModel.shapes.slice(0, 2));
205
- });
206
- it('handleOnSetAsCorrect correct', function () {
207
- wrapper.instance().handleOnSetAsCorrect({
208
- id: '1'
209
- });
210
- expect(onUpdateShapes).toHaveBeenCalledWith([initialModel.shapes[0], _objectSpread(_objectSpread({}, initialModel.shapes[1]), {}, {
211
- correct: true
212
- })].concat((0, _toConsumableArray2["default"])(initialModel.shapes.slice(2))));
213
- });
214
- it('handleOnSetAsCorrect incorrect', function () {
215
- wrapper.instance().handleOnSetAsCorrect({
216
- id: '0'
217
- });
218
- expect(onUpdateShapes).toHaveBeenCalledWith([_objectSpread(_objectSpread({}, initialModel.shapes[0]), {}, {
219
- correct: false
220
- })].concat((0, _toConsumableArray2["default"])(initialModel.shapes.slice(1))));
221
- });
222
- it('handleOnDragEnd', function () {
223
- wrapper.instance().handleOnDragEnd('0', {
224
- x: 1,
225
- y: 1
226
- });
227
- expect(onUpdateShapes).toHaveBeenCalledWith([_objectSpread(_objectSpread({}, initialModel.shapes[0]), {}, {
228
- x: 1,
229
- y: 1
230
- })].concat((0, _toConsumableArray2["default"])(initialModel.shapes.slice(1))));
231
- });
232
- it('handleOnDragEnd unexistent id', function () {
233
- wrapper.instance().handleOnDragEnd('10', {
234
- x: 1,
235
- y: 1
236
- });
237
- expect(onUpdateShapes).toHaveBeenCalledWith(initialModel.shapes);
238
- });
239
- });
240
- });
241
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaG90c3BvdC1kcmF3YWJsZS50ZXN0LmpzIl0sIm5hbWVzIjpbIm1vZGVsIiwiaW1hZ2VVcmwiLCJzaGFwZXMiLCJpZCIsImhlaWdodCIsIndpZHRoIiwieCIsInkiLCJjb3JyZWN0IiwiZ3JvdXAiLCJwb2ludHMiLCJkaW1lbnNpb25zIiwiaG90c3BvdENvbG9yIiwib3V0bGluZUNvbG9yIiwibXVsdGlwbGVDb3JyZWN0IiwiZGVzY3JpYmUiLCJ3IiwiaGFuZGxlRGlzYWJsZURyYWciLCJqZXN0IiwiZm4iLCJoYW5kbGVFbmFibGVEcmFnIiwib25VcGRhdGVJbWFnZURpbWVuc2lvbiIsIm9uVXBkYXRlU2hhcGVzIiwiaW5pdGlhbE1vZGVsIiwiYmVmb3JlRWFjaCIsImV4dHJhcyIsInByb3BzIiwiY2xhc3NlcyIsImRpc2FibGVEcmFnIiwiZW5hYmxlRHJhZyIsInN0cm9rZVdpZHRoIiwiaXQiLCJleHBlY3QiLCJ0b01hdGNoU25hcHNob3QiLCJ3cmFwcGVyIiwiaW5zdGFuY2UiLCJzdGF0ZSIsInN0YXRlU2hhcGVzIiwiZXZlbnQiLCJ0YXJnZXQiLCJjdXJyZW50VGFyZ2V0IiwiZXZ0IiwibGF5ZXJYIiwibGF5ZXJZIiwiaGFuZGxlT25Nb3VzZURvd24iLCJub3QiLCJ0b0JlQ2FsbGVkIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJpbmRleCIsImlzRHJhd2luZyIsInNsaWNlIiwiaGFuZGxlT25Nb3VzZVVwIiwidG9FcXVhbCIsInRvQmVDYWxsZWRXaXRoIiwiaGFuZGxlT25TZXRBc0NvcnJlY3QiLCJoYW5kbGVPbkRyYWdFbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLEtBQUssR0FBRyxTQUFSQSxLQUFRO0FBQUEsU0FBTztBQUNuQkMsSUFBQUEsUUFBUSxFQUFFLGtFQURTO0FBRW5CQyxJQUFBQSxNQUFNLEVBQUUsQ0FDTjtBQUNFQyxNQUFBQSxFQUFFLEVB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QUFDQyxRQUFSLEdBQW1Cb0IsZUFBbkIsQ0FBbUMsSUFBbkMsRUFBeUM7QUFBRWpELFFBQUFBLENBQUMsRUFBRSxDQUFMO0FBQVFDLFFBQUFBLENBQUMsRUFBRTtBQUFYLE9BQXpDO0FBRUF5QixNQUFBQSxNQUFNLENBQUNWLGNBQUQsQ0FBTixDQUF1QnlCLG9CQUF2QixDQUE0Q3hCLFlBQVksQ0FBQ3JCLE1BQXpEO0FBQ0QsS0FKQyxDQUFGO0FBTUQsR0FySU8sQ0FBUjtBQXNJRCxDQW5MTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2hhbGxvdyB9IGZyb20gJ2VuenltZSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRHJhd2FibGUgfSBmcm9tICcuLi9ob3RzcG90LWRyYXdhYmxlJztcblxuY29uc3QgbW9kZWwgPSAoKSA9PiAoe1xuICBpbWFnZVVybDogJ2h0dHBzOi8vY2RuLmZsdWVuY2UubmV0L2ltYWdlLzAyNDBlYjE0NTVjZTRjNGJiNjE4MDIzMjM0N2I2YWVmX1cnLFxuICBzaGFwZXM6IFtcbiAgICB7XG4gICAgICBpZDogJzAnLFxuICAgICAgaGVpZ2h0OiAxNDAsXG4gICAgICB3aWR0aDogMTMwLFxuICAgICAgeDogMSxcbiAgICAgIHk6IDEsXG4gICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgZ3JvdXA6ICdyZWN0YW5nbGVzJ1xuICAgIH0sIHtcbiAgICAgIGlkOiAnMScsXG4gICAgICBoZWlnaHQ6IDE0MCxcbiAgICAgIHdpZHRoOiAxMzAsXG4gICAgICB4OiAxNDAsXG4gICAgICB5OiAxLFxuICAgICAgZ3JvdXA6ICdyZWN0YW5nbGVzJ1xuICAgIH0sIHtcbiAgICAgIGlkOiAnMicsXG4gICAgICBoZWlnaHQ6IDE0MCxcbiAgICAgIHdpZHRoOiAxMzAsXG4gICAgICB4OiAyODAsXG4gICAgICB5OiAxLFxuICAgICAgZ3JvdXA6ICdyZWN0YW5nbGVzJ1xuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICczJyxcbiAgICAgIHBvaW50czogW1xuICAgICAgICB7IHg6IDEsIHk6IDE0OCB9LFxuICAgICAgICB7IHg6IDEsIHk6IDI4OCB9LFxuICAgICAgICB7IHk6IDI4OCwgeDogMTI5IH0sXG4gICAgICAgIHsgeTogMTQ4LCB4OiAxMjkgfV0sXG4gICAgICBjb3JyZWN0OiB0cnVlLFxuICAgICAgZ3JvdXA6ICdwb2x5Z29ucydcbiAgICB9LCB7XG4gICAgICBpZDogJzQnLFxuICAgICAgcG9pbnRzOiBbXG4gICAgICAgIHsgeTogMTUxLCB4OiAxNDEgfSxcbiAgICAgICAgeyB5OiAyODksIHg6IDE0MSB9LFxuICAgICAgICB7IHk6IDI4OSwgeDogMjY5IH0sXG4gICAgICAgIHsgeDogMjY5LCB5OiAxNTEgfV0sXG4gICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgIGdyb3VwOiAncG9seWdvbnMnXG4gICAgfSwge1xuICAgICAgaWQ6ICc1JyxcbiAgICAgIHBvaW50czogW1xuICAgICAgICB7IHg6IDI3OSwgeTogMTUwIH0sXG4gICAgICAgIHsgeDogMjc5LCB5OiAyODkgfSxcbiAgICAgICAgeyB4OiA0MDcsIHk6IDI4OSB9LFxuICAgICAgICB7IHg6IDQwNywgeTogMTUwIH1cbiAgICAgIF0sXG4gICAgICBjb3JyZWN0OiBmYWxzZSxcbiAgICAgIGdyb3VwOiAncG9seWdvbnMnXG4gICAgfVxuICBdLFxuICBkaW1lbnNpb25zOiB7XG4gICAgaGVpZ2h0OiAyOTEsIHdpZHRoOiA0MTBcbiAgfSxcbiAgaG90c3BvdENvbG9yOiAncmdiYSgxMzcsIDE4MywgMjQ0LCAwLjY1KScsXG4gIG91dGxpbmVDb2xvcjogJ2JsdWUnLFxuICBtdWx0aXBsZUNvcnJlY3Q6IHRydWUsXG59KTtcblxuZGVzY3JpYmUoJ0hvdHNwb3REcmF3YWJsZScsICgpID0+IHtcbiAgbGV0IHcsXG4gICAgaGFuZGxlRGlzYWJsZURyYWcgPSBqZXN0LmZuKCksXG4gICAgaGFuZGxlRW5hYmxlRHJhZyA9IGplc3QuZm4oKSxcbiAgICBvblVwZGF0ZUltYWdlRGltZW5zaW9uID0gamVzdC5mbigpLFxuICAgIG9uVXBkYXRlU2hhcGVzID0gamVzdC5mbigpLFxuICAgIGluaXRpYWxNb2RlbCA9IG1vZGVsKClcbiAgO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHcgPSBleHRyYXMgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgICBkaW1lbnNpb25zOiBpbml0aWFsTW9kZWwuZGltZW5zaW9ucyxcbiAgICAgICAgZGlzYWJsZURyYWc6IGhhbmRsZURpc2FibGVEcmFnLFxuICAgICAgICBlbmFibGVEcmFnOiBoYW5kbGVFbmFibGVEcmFnLFxuICAgICAgICBpbWFnZVVybDogaW5pdGlhbE1vZGVsLmltYWdlVXJsLFxuICAgICAgICBob3RzcG90Q29sb3I6IGluaXRpYWxNb2RlbC5ob3RzcG90Q29sb3IsXG4gICAgICAgIG11bHRpcGxlQ29ycmVjdDogaW5pdGlhbE1vZGVsLm11bHRpcGxlQ29ycmVjdCxcbiAgICAgICAgb25VcGRhdGVJbWFnZURpbWVuc2lvbjogb25VcGRhdGVJbWFnZURpbWVuc2lvbixcbiAgICAgICAgb25VcGRhdGVTaGFwZXM6IG9uVXBkYXRlU2hhcGVzLFxuICAgICAgICBvdXRsaW5lQ29sb3I6IGluaXRpYWxNb2RlbC5vdXRsaW5lQ29sb3IsXG4gICAgICAgIHNoYXBlczogaW5pdGlhbE1vZGVsLnNoYXBlcyxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDUsXG4gICAgICAgIC4uLmV4dHJhc1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHNoYWxsb3coPERyYXdhYmxlIHsuLi5wcm9wc30gLz4pO1xuICAgIH1cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcicsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyB3aXRoIGRlZmF1bHQgc3Ryb2tlV2lkdGgnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodygpKS50b01hdGNoU25hcHNob3QoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHdpdGggZ2l2ZW4gc3Ryb2tlV2lkdGgnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qodyh7IHN0cm9rZVdpZHRoOiAxMCB9KSkudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh3KCkpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgbGV0IHdyYXBwZXI7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHdyYXBwZXIgPSB3KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlT25Nb3VzZURvd24gdGFyZ2V0ICE9IFN0YWdlJywgKCkgPT4ge1xuICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLnN0YXRlLnN0YXRlU2hhcGVzID0gaW5pdGlhbE1vZGVsLnNoYXBlcztcblxuICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgIHRhcmdldDogJ0xpbmUnLFxuICAgICAgICBjdXJyZW50VGFyZ2V0OiAnU3RhZ2UnLFxuICAgICAgICBldnQ6IHtcbiAgICAgICAgICBsYXllclg6IDIwLFxuICAgICAgICAgIGxheWVyWTogMzBcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uTW91c2VEb3duKGV2ZW50KTtcblxuICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS5ub3QudG9CZUNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZU9uTW91c2VEb3duIHRhcmdldCA9IFN0YWdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgIHRhcmdldDogJ1N0YWdlJyxcbiAgICAgICAgY3VycmVudFRhcmdldDogJ1N0YWdlJyxcbiAgICAgICAgZXZ0OiB7XG4gICAgICAgICAgbGF5ZXJYOiAyMCxcbiAgICAgICAgICBsYXllclk6IDMwXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHdyYXBwZXIuaW5zdGFuY2UoKS5oYW5kbGVPbk1vdXNlRG93bihldmVudCk7XG5cbiAgICAgIGV4cGVjdChvblVwZGF0ZVNoYXBlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoW1xuICAgICAgICAuLi5pbml0aWFsTW9kZWwuc2hhcGVzLFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICc2JyxcbiAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgeDogMjAsXG4gICAgICAgICAgeTogMzAsXG4gICAgICAgICAgZ3JvdXA6ICdyZWN0YW5nbGVzJyxcbiAgICAgICAgICBpbmRleDogNlxuICAgICAgICB9XG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVPbk1vdXNlVXAgaXNEcmF3aW5nID0gdHJ1ZScsICgpID0+IHtcbiAgICAgIHdyYXBwZXIuaW5zdGFuY2UoKS5zdGF0ZS5pc0RyYXdpbmcgPSB0cnVlO1xuICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLnN0YXRlLnN0YXRlU2hhcGVzID0gaW5pdGlhbE1vZGVsLnNoYXBlcy5zbGljZSgwLCAyKTtcblxuICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uTW91c2VVcCh7XG4gICAgICAgIGV2dDoge1xuICAgICAgICAgIGxheWVyWDogMjAsXG4gICAgICAgICAgbGF5ZXJZOiAzMFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChbLi4uaW5pdGlhbE1vZGVsLnNoYXBlcy5zbGljZSgwLCAyKV0pO1xuXG4gICAgICAvLyBhdCB0aGlzIHBvaW50LCBzdGF0ZS5zdGF0ZVNoYXBlcyBpcyBmYWxzZSwgc28gd2UgZG9uJ3Qgd2FudCB0byB1cGRhdGUgc2hhcGVzIHdpdGggZmFsc2UgKG9uVXBkYXRlU2hhcGVzKVxuICAgICAgZXhwZWN0KHdyYXBwZXIuaW5zdGFuY2UoKS5zdGF0ZS5zdGF0ZVNoYXBlcykudG9FcXVhbChmYWxzZSk7XG5cbiAgICAgIHdyYXBwZXIuaW5zdGFuY2UoKS5oYW5kbGVPbk1vdXNlVXAoe1xuICAgICAgICBldnQ6IHtcbiAgICAgICAgICBsYXllclg6IDIwLFxuICAgICAgICAgIGxheWVyWTogMzBcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChvblVwZGF0ZVNoYXBlcykubm90LnRvQmVDYWxsZWRXaXRoKGZhbHNlKTtcblxuXG4gICAgICB3cmFwcGVyLmluc3RhbmNlKCkuaGFuZGxlT25Nb3VzZVVwKHt9KTtcblxuICAgICAgZXhwZWN0KG9uVXBkYXRlU2hhcGVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChpbml0aWFsTW9kZWwuc2hhcGVzLnNsaWNlKDAsIDIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVPblNldEFzQ29ycmVjdCBjb3JyZWN0JywgKCkgPT4ge1xuICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uU2V0QXNDb3JyZWN0KFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICcxJ1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBleHBlY3Qob25VcGRhdGVTaGFwZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFtcbiAgICAgICAgaW5pdGlhbE1vZGVsLnNoYXBlc1swXSxcbiAgICAgICAge1xuICAgICAgICAgIC4uLmluaXRpYWxNb2RlbC5zaGFwZXNbMV0sXG4gICAgICAgICAgY29ycmVjdDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICAuLi5pbml0aWFsTW9kZWwuc2hhcGVzLnNsaWNlKDIpXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVPblNldEFzQ29ycmVjdCBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICB3cmFwcGVyLmluc3RhbmNlKCkuaGFuZGxlT25TZXRBc0NvcnJlY3QoXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJzAnXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChvblVwZGF0ZVNoYXBlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoW1xuICAgICAgICB7XG4gICAgICAgICAgLi4uaW5pdGlhbE1vZGVsLnNoYXBlc1swXSxcbiAgICAgICAgICBjb3JyZWN0OiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICAuLi5pbml0aWFsTW9kZWwuc2hhcGVzLnNsaWNlKDEpXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVPbkRyYWdFbmQnLCAoKSA9PiB7XG4gICAgICB3cmFwcGVyLmluc3RhbmNlKCkuaGFuZGxlT25EcmFnRW5kKCcwJywgeyB4OiAxLCB5OiAxIH0pO1xuXG4gICAgICBleHBlY3Qob25VcGRhdGVTaGFwZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFtcbiAgICAgICAge1xuICAgICAgICAgIC4uLmluaXRpYWxNb2RlbC5zaGFwZXNbMF0sXG4gICAgICAgICAgeDogMSxcbiAgICAgICAgICB5OiAxXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmluaXRpYWxNb2RlbC5zaGFwZXMuc2xpY2UoMSlcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZU9uRHJhZ0VuZCB1bmV4aXN0ZW50IGlkJywgKCkgPT4ge1xuICAgICAgd3JhcHBlci5pbnN0YW5jZSgpLmhhbmRsZU9uRHJhZ0VuZCgnMTAnLCB7IHg6IDEsIHk6IDEgfSk7XG5cbiAgICAgIGV4cGVjdChvblVwZGF0ZVNoYXBlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoaW5pdGlhbE1vZGVsLnNoYXBlcyk7XG4gICAgfSk7XG5cbiAgfSk7XG59KTtcbiJdfQ==