@pie-lib/editable-html-tip-tap 2.1.20-beta.5 → 2.1.20-beta.7

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 (94) hide show
  1. package/lib/__tests__/EditableHtml.test.js +831 -0
  2. package/lib/__tests__/constants.test.js +21 -0
  3. package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
  4. package/lib/__tests__/extensions.test.js +209 -0
  5. package/lib/__tests__/index.test.js +250 -0
  6. package/lib/__tests__/size-utils.test.js +57 -0
  7. package/lib/__tests__/spellcheck.test.js +142 -0
  8. package/lib/__tests__/theme.test.js +17 -0
  9. package/lib/components/__tests__/AltDialog.test.js +201 -0
  10. package/lib/components/__tests__/CharacterPicker.test.js +455 -0
  11. package/lib/components/__tests__/CssIcon.test.js +58 -0
  12. package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
  13. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
  14. package/lib/components/__tests__/ImageToolbar.test.js +185 -0
  15. package/lib/components/__tests__/InlineDropdown.test.js +839 -0
  16. package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
  17. package/lib/components/__tests__/MediaDialog.test.js +433 -0
  18. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  19. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  20. package/lib/components/__tests__/MenuBar.test.js +502 -0
  21. package/lib/components/__tests__/RespArea.test.js +171 -0
  22. package/lib/components/__tests__/TableIcons.test.js +153 -0
  23. package/lib/components/__tests__/TextAlign.test.js +209 -0
  24. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  25. package/lib/components/__tests__/characterUtils.test.js +178 -0
  26. package/lib/components/__tests__/choice.test.js +213 -0
  27. package/lib/components/__tests__/custom-popper.test.js +108 -0
  28. package/lib/components/__tests__/done-button.test.js +72 -0
  29. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  30. package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
  31. package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
  32. package/lib/extensions/__tests__/css.test.js +214 -0
  33. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
  34. package/lib/extensions/__tests__/divNode.test.js +108 -0
  35. package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
  36. package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
  37. package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
  38. package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
  39. package/lib/extensions/__tests__/extended-table.test.js +200 -0
  40. package/lib/extensions/__tests__/image-component.test.js +432 -0
  41. package/lib/extensions/__tests__/image.test.js +313 -0
  42. package/lib/extensions/__tests__/math.test.js +1411 -0
  43. package/lib/extensions/__tests__/media-node-view.test.js +307 -0
  44. package/lib/extensions/__tests__/media.test.js +292 -0
  45. package/lib/extensions/__tests__/responseArea.test.js +736 -0
  46. package/lib/utils/__tests__/helper.test.js +107 -0
  47. package/lib/utils/__tests__/toolbar.test.js +38 -0
  48. package/package.json +3 -3
  49. package/src/__tests__/EditableHtml.test.jsx +588 -0
  50. package/src/__tests__/constants.test.js +19 -0
  51. package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
  52. package/src/__tests__/extensions.test.js +208 -0
  53. package/src/__tests__/index.test.jsx +154 -0
  54. package/src/__tests__/size-utils.test.js +64 -0
  55. package/src/__tests__/theme.test.js +17 -0
  56. package/src/components/__tests__/AltDialog.test.jsx +147 -0
  57. package/src/components/__tests__/CharacterPicker.test.jsx +270 -0
  58. package/src/components/__tests__/CssIcon.test.jsx +46 -0
  59. package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
  60. package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +209 -0
  61. package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
  62. package/src/components/__tests__/InlineDropdown.test.jsx +557 -0
  63. package/src/components/__tests__/InsertImageHandler.test.js +161 -0
  64. package/src/components/__tests__/MediaDialog.test.jsx +293 -0
  65. package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
  66. package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
  67. package/src/components/__tests__/MenuBar.test.jsx +250 -0
  68. package/src/components/__tests__/RespArea.test.jsx +122 -0
  69. package/src/components/__tests__/TableIcons.test.jsx +149 -0
  70. package/src/components/__tests__/TextAlign.test.jsx +167 -0
  71. package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
  72. package/src/components/__tests__/characterUtils.test.js +166 -0
  73. package/src/components/__tests__/choice.test.jsx +171 -0
  74. package/src/components/__tests__/custom-popper.test.jsx +82 -0
  75. package/src/components/__tests__/done-button.test.jsx +54 -0
  76. package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
  77. package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
  78. package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
  79. package/src/extensions/__tests__/css.test.js +196 -0
  80. package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
  81. package/src/extensions/__tests__/divNode.test.js +87 -0
  82. package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
  83. package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
  84. package/src/extensions/__tests__/extended-list-item.test.js +13 -0
  85. package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
  86. package/src/extensions/__tests__/extended-table.test.js +183 -0
  87. package/src/extensions/__tests__/image-component.test.jsx +346 -0
  88. package/src/extensions/__tests__/image.test.js +237 -0
  89. package/src/extensions/__tests__/math.test.js +900 -0
  90. package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
  91. package/src/extensions/__tests__/media.test.js +271 -0
  92. package/src/extensions/__tests__/responseArea.test.js +655 -0
  93. package/src/utils/__tests__/helper.test.js +126 -0
  94. package/src/utils/__tests__/toolbar.test.js +43 -0
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _react = _interopRequireDefault(require("react"));
5
+ var _react2 = require("@testing-library/react");
6
+ var _toolbarButtons = require("../common/toolbar-buttons");
7
+ describe('RawButton', function () {
8
+ it('renders without crashing', function () {
9
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
10
+ onClick: jest.fn()
11
+ }, "Click me")),
12
+ container = _render.container;
13
+ expect(container).toBeInTheDocument();
14
+ });
15
+ it('renders children', function () {
16
+ var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
17
+ onClick: jest.fn()
18
+ }, "Test Button")),
19
+ getByText = _render2.getByText;
20
+ expect(getByText('Test Button')).toBeInTheDocument();
21
+ });
22
+ it('calls onClick on mouse down', function () {
23
+ var onClick = jest.fn();
24
+ var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
25
+ onClick: onClick
26
+ }, "Click")),
27
+ getByText = _render3.getByText;
28
+ _react2.fireEvent.mouseDown(getByText('Click'));
29
+ expect(onClick).toHaveBeenCalled();
30
+ });
31
+ it('prevents default on mouse down', function () {
32
+ var onClick = jest.fn();
33
+ var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
34
+ onClick: onClick
35
+ }, "Click")),
36
+ getByText = _render4.getByText;
37
+ var button = getByText('Click');
38
+ var event = new MouseEvent('mousedown', {
39
+ bubbles: true,
40
+ cancelable: true
41
+ });
42
+ var preventDefaultSpy = jest.spyOn(event, 'preventDefault');
43
+ button.dispatchEvent(event);
44
+ expect(preventDefaultSpy).toHaveBeenCalled();
45
+ });
46
+ it('calls onClick on Enter key press', function () {
47
+ var onClick = jest.fn();
48
+ var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
49
+ onClick: onClick
50
+ }, "Click")),
51
+ getByText = _render5.getByText;
52
+ _react2.fireEvent.keyDown(getByText('Click'), {
53
+ key: 'Enter'
54
+ });
55
+ expect(onClick).toHaveBeenCalled();
56
+ });
57
+ it('calls onClick on Space key press', function () {
58
+ var onClick = jest.fn();
59
+ var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
60
+ onClick: onClick
61
+ }, "Click")),
62
+ getByText = _render6.getByText;
63
+ _react2.fireEvent.keyDown(getByText('Click'), {
64
+ key: ' '
65
+ });
66
+ expect(onClick).toHaveBeenCalled();
67
+ });
68
+ it('does not call onClick on other key press', function () {
69
+ var onClick = jest.fn();
70
+ var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
71
+ onClick: onClick
72
+ }, "Click")),
73
+ getByText = _render7.getByText;
74
+ _react2.fireEvent.keyDown(getByText('Click'), {
75
+ key: 'a'
76
+ });
77
+ expect(onClick).not.toHaveBeenCalled();
78
+ });
79
+ it('applies active style when active is true', function () {
80
+ var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
81
+ onClick: jest.fn(),
82
+ active: true
83
+ }, "Active")),
84
+ getByText = _render8.getByText;
85
+ var button = getByText('Active');
86
+ expect(button).toHaveStyle({
87
+ color: 'black'
88
+ });
89
+ });
90
+ it('applies disabled style when disabled is true', function () {
91
+ var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
92
+ onClick: jest.fn(),
93
+ disabled: true
94
+ }, "Disabled")),
95
+ getByText = _render9.getByText;
96
+ var button = getByText('Disabled');
97
+ expect(button).toHaveStyle({
98
+ cursor: 'not-allowed'
99
+ });
100
+ });
101
+ it('applies extraStyles when provided', function () {
102
+ var extraStyles = {
103
+ backgroundColor: 'red'
104
+ };
105
+ var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
106
+ onClick: jest.fn(),
107
+ extraStyles: extraStyles
108
+ }, "Styled")),
109
+ getByText = _render0.getByText;
110
+ var button = getByText('Styled');
111
+ expect(button).toHaveStyle({
112
+ backgroundColor: 'red'
113
+ });
114
+ });
115
+ it('has aria-label when provided', function () {
116
+ var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
117
+ onClick: jest.fn(),
118
+ ariaLabel: "Test Button"
119
+ }, "Button")),
120
+ getByLabelText = _render1.getByLabelText;
121
+ expect(getByLabelText('Test Button')).toBeInTheDocument();
122
+ });
123
+ it('has aria-pressed attribute', function () {
124
+ var _render10 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
125
+ onClick: jest.fn(),
126
+ active: true
127
+ }, "Button")),
128
+ getByText = _render10.getByText;
129
+ expect(getByText('Button')).toHaveAttribute('aria-pressed', 'true');
130
+ });
131
+ it('is focusable with tabIndex', function () {
132
+ var _render11 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawButton, {
133
+ onClick: jest.fn()
134
+ }, "Button")),
135
+ getByText = _render11.getByText;
136
+ expect(getByText('Button')).toHaveAttribute('tabIndex', '0');
137
+ });
138
+ });
139
+ describe('Button', function () {
140
+ it('is the same as RawButton', function () {
141
+ expect(_toolbarButtons.Button).toBe(_toolbarButtons.RawButton);
142
+ });
143
+ });
144
+ describe('RawMarkButton', function () {
145
+ it('renders without crashing', function () {
146
+ var _render12 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
147
+ onToggle: jest.fn(),
148
+ mark: "bold",
149
+ label: "Bold"
150
+ }, "B")),
151
+ container = _render12.container;
152
+ expect(container).toBeInTheDocument();
153
+ });
154
+ it('renders children', function () {
155
+ var _render13 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
156
+ onToggle: jest.fn(),
157
+ mark: "bold",
158
+ label: "Bold"
159
+ }, "Bold")),
160
+ getByText = _render13.getByText;
161
+ expect(getByText('Bold')).toBeInTheDocument();
162
+ });
163
+ it('calls onToggle with mark on mouse down', function () {
164
+ var onToggle = jest.fn();
165
+ var _render14 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
166
+ onToggle: onToggle,
167
+ mark: "italic",
168
+ label: "Italic"
169
+ }, "I")),
170
+ getByText = _render14.getByText;
171
+ _react2.fireEvent.mouseDown(getByText('I'));
172
+ expect(onToggle).toHaveBeenCalledWith('italic');
173
+ });
174
+ it('prevents default on mouse down', function () {
175
+ var onToggle = jest.fn();
176
+ var _render15 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
177
+ onToggle: onToggle,
178
+ mark: "bold",
179
+ label: "Bold"
180
+ }, "B")),
181
+ getByText = _render15.getByText;
182
+ var button = getByText('B');
183
+ var event = new MouseEvent('mousedown', {
184
+ bubbles: true,
185
+ cancelable: true
186
+ });
187
+ var preventDefaultSpy = jest.spyOn(event, 'preventDefault');
188
+ button.dispatchEvent(event);
189
+ expect(preventDefaultSpy).toHaveBeenCalled();
190
+ });
191
+ it('calls onToggle on Enter key press', function () {
192
+ var onToggle = jest.fn();
193
+ var _render16 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
194
+ onToggle: onToggle,
195
+ mark: "underline",
196
+ label: "Underline"
197
+ }, "U")),
198
+ getByText = _render16.getByText;
199
+ _react2.fireEvent.keyDown(getByText('U'), {
200
+ key: 'Enter'
201
+ });
202
+ expect(onToggle).toHaveBeenCalledWith('underline');
203
+ });
204
+ it('calls onToggle on Space key press', function () {
205
+ var onToggle = jest.fn();
206
+ var _render17 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
207
+ onToggle: onToggle,
208
+ mark: "strike",
209
+ label: "Strike"
210
+ }, "S")),
211
+ getByText = _render17.getByText;
212
+ _react2.fireEvent.keyDown(getByText('S'), {
213
+ key: ' '
214
+ });
215
+ expect(onToggle).toHaveBeenCalledWith('strike');
216
+ });
217
+ it('does not call onToggle on other key press', function () {
218
+ var onToggle = jest.fn();
219
+ var _render18 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
220
+ onToggle: onToggle,
221
+ mark: "bold",
222
+ label: "Bold"
223
+ }, "B")),
224
+ getByText = _render18.getByText;
225
+ _react2.fireEvent.keyDown(getByText('B'), {
226
+ key: 'a'
227
+ });
228
+ expect(onToggle).not.toHaveBeenCalled();
229
+ });
230
+ it('applies active style when active is true', function () {
231
+ var _render19 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
232
+ onToggle: jest.fn(),
233
+ mark: "bold",
234
+ label: "Bold",
235
+ active: true
236
+ }, "B")),
237
+ getByText = _render19.getByText;
238
+ var button = getByText('B');
239
+ expect(button).toHaveStyle({
240
+ color: 'black'
241
+ });
242
+ });
243
+ it('has aria-label from label prop', function () {
244
+ var _render20 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
245
+ onToggle: jest.fn(),
246
+ mark: "bold",
247
+ label: "Toggle Bold"
248
+ }, "B")),
249
+ getByLabelText = _render20.getByLabelText;
250
+ expect(getByLabelText('Toggle Bold')).toBeInTheDocument();
251
+ });
252
+ it('has aria-pressed attribute', function () {
253
+ var _render21 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
254
+ onToggle: jest.fn(),
255
+ mark: "bold",
256
+ label: "Bold",
257
+ active: true
258
+ }, "B")),
259
+ getByText = _render21.getByText;
260
+ expect(getByText('B')).toHaveAttribute('aria-pressed', 'true');
261
+ });
262
+ it('is focusable with tabIndex', function () {
263
+ var _render22 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_toolbarButtons.RawMarkButton, {
264
+ onToggle: jest.fn(),
265
+ mark: "bold",
266
+ label: "Bold"
267
+ }, "B")),
268
+ getByText = _render22.getByText;
269
+ expect(getByText('B')).toHaveAttribute('tabIndex', '0');
270
+ });
271
+ });
272
+ describe('MarkButton', function () {
273
+ it('is the same as RawMarkButton', function () {
274
+ expect(_toolbarButtons.MarkButton).toBe(_toolbarButtons.RawMarkButton);
275
+ });
276
+ });
277
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfdG9vbGJhckJ1dHRvbnMiLCJkZXNjcmliZSIsIml0IiwiX3JlbmRlciIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJSYXdCdXR0b24iLCJvbkNsaWNrIiwiamVzdCIsImZuIiwiY29udGFpbmVyIiwiZXhwZWN0IiwidG9CZUluVGhlRG9jdW1lbnQiLCJfcmVuZGVyMiIsImdldEJ5VGV4dCIsIl9yZW5kZXIzIiwiZmlyZUV2ZW50IiwibW91c2VEb3duIiwidG9IYXZlQmVlbkNhbGxlZCIsIl9yZW5kZXI0IiwiYnV0dG9uIiwiZXZlbnQiLCJNb3VzZUV2ZW50IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJwcmV2ZW50RGVmYXVsdFNweSIsInNweU9uIiwiZGlzcGF0Y2hFdmVudCIsIl9yZW5kZXI1Iiwia2V5RG93biIsImtleSIsIl9yZW5kZXI2IiwiX3JlbmRlcjciLCJub3QiLCJfcmVuZGVyOCIsImFjdGl2ZSIsInRvSGF2ZVN0eWxlIiwiY29sb3IiLCJfcmVuZGVyOSIsImRpc2FibGVkIiwiY3Vyc29yIiwiZXh0cmFTdHlsZXMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJfcmVuZGVyMCIsIl9yZW5kZXIxIiwiYXJpYUxhYmVsIiwiZ2V0QnlMYWJlbFRleHQiLCJfcmVuZGVyMTAiLCJ0b0hhdmVBdHRyaWJ1dGUiLCJfcmVuZGVyMTEiLCJCdXR0b24iLCJ0b0JlIiwiX3JlbmRlcjEyIiwiUmF3TWFya0J1dHRvbiIsIm9uVG9nZ2xlIiwibWFyayIsImxhYmVsIiwiX3JlbmRlcjEzIiwiX3JlbmRlcjE0IiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJfcmVuZGVyMTUiLCJfcmVuZGVyMTYiLCJfcmVuZGVyMTciLCJfcmVuZGVyMTgiLCJfcmVuZGVyMTkiLCJfcmVuZGVyMjAiLCJfcmVuZGVyMjEiLCJfcmVuZGVyMjIiLCJNYXJrQnV0dG9uIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvX190ZXN0c19fL3Rvb2xiYXItYnV0dG9ucy50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmlyZUV2ZW50LCByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCB7IEJ1dHRvbiwgTWFya0J1dHRvbiwgUmF3QnV0dG9uLCBSYXdNYXJrQnV0dG9uIH0gZnJvbSAnLi4vY29tbW9uL3Rvb2xiYXItYnV0dG9ucyc7XG5cbmRlc2NyaWJlKCdSYXdCdXR0b24nLCAoKSA9PiB7XG4gIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e2plc3QuZm4oKX0+Q2xpY2sgbWU8L1Jhd0J1dHRvbj4pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoPFJhd0J1dHRvbiBvbkNsaWNrPXtqZXN0LmZuKCl9PlRlc3QgQnV0dG9uPC9SYXdCdXR0b24+KTtcbiAgICBleHBlY3QoZ2V0QnlUZXh0KCdUZXN0IEJ1dHRvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnY2FsbHMgb25DbGljayBvbiBtb3VzZSBkb3duJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e29uQ2xpY2t9PkNsaWNrPC9SYXdCdXR0b24+KTtcbiAgICBmaXJlRXZlbnQubW91c2VEb3duKGdldEJ5VGV4dCgnQ2xpY2snKSk7XG4gICAgZXhwZWN0KG9uQ2xpY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3ByZXZlbnRzIGRlZmF1bHQgb24gbW91c2UgZG93bicsICgpID0+IHtcbiAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoPFJhd0J1dHRvbiBvbkNsaWNrPXtvbkNsaWNrfT5DbGljazwvUmF3QnV0dG9uPik7XG4gICAgY29uc3QgYnV0dG9uID0gZ2V0QnlUZXh0KCdDbGljaycpO1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBwcmV2ZW50RGVmYXVsdFNweSA9IGplc3Quc3B5T24oZXZlbnQsICdwcmV2ZW50RGVmYXVsdCcpO1xuICAgIGJ1dHRvbi5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICBleHBlY3QocHJldmVudERlZmF1bHRTcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbGxzIG9uQ2xpY2sgb24gRW50ZXIga2V5IHByZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e29uQ2xpY2t9PkNsaWNrPC9SYXdCdXR0b24+KTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ0NsaWNrJyksIHsga2V5OiAnRW50ZXInIH0pO1xuICAgIGV4cGVjdChvbkNsaWNrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvbkNsaWNrIG9uIFNwYWNlIGtleSBwcmVzcycsICgpID0+IHtcbiAgICBjb25zdCBvbkNsaWNrID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoPFJhd0J1dHRvbiBvbkNsaWNrPXtvbkNsaWNrfT5DbGljazwvUmF3QnV0dG9uPik7XG4gICAgZmlyZUV2ZW50LmtleURvd24oZ2V0QnlUZXh0KCdDbGljaycpLCB7IGtleTogJyAnIH0pO1xuICAgIGV4cGVjdChvbkNsaWNrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBjYWxsIG9uQ2xpY2sgb24gb3RoZXIga2V5IHByZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uQ2xpY2sgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8UmF3QnV0dG9uIG9uQ2xpY2s9e29uQ2xpY2t9PkNsaWNrPC9SYXdCdXR0b24+KTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ0NsaWNrJyksIHsga2V5OiAnYScgfSk7XG4gICAgZXhwZWN0KG9uQ2xpY2spLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGFjdGl2ZSBzdHlsZSB3aGVuIGFjdGl2ZSBpcyB0cnVlJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3QnV0dG9uIG9uQ2xpY2s9e2plc3QuZm4oKX0gYWN0aXZlPXt0cnVlfT5cbiAgICAgICAgQWN0aXZlXG4gICAgICA8L1Jhd0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ0FjdGl2ZScpO1xuICAgIGV4cGVjdChidXR0b24pLnRvSGF2ZVN0eWxlKHsgY29sb3I6ICdibGFjaycgfSk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGRpc2FibGVkIHN0eWxlIHdoZW4gZGlzYWJsZWQgaXMgdHJ1ZScsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKFxuICAgICAgPFJhd0J1dHRvbiBvbkNsaWNrPXtqZXN0LmZuKCl9IGRpc2FibGVkPXt0cnVlfT5cbiAgICAgICAgRGlzYWJsZWRcbiAgICAgIDwvUmF3QnV0dG9uPixcbiAgICApO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGdldEJ5VGV4dCgnRGlzYWJsZWQnKTtcbiAgICBleHBlY3QoYnV0dG9uKS50b0hhdmVTdHlsZSh7IGN1cnNvcjogJ25vdC1hbGxvd2VkJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FwcGxpZXMgZXh0cmFTdHlsZXMgd2hlbiBwcm92aWRlZCcsICgpID0+IHtcbiAgICBjb25zdCBleHRyYVN0eWxlcyA9IHsgYmFja2dyb3VuZENvbG9yOiAncmVkJyB9O1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3QnV0dG9uIG9uQ2xpY2s9e2plc3QuZm4oKX0gZXh0cmFTdHlsZXM9e2V4dHJhU3R5bGVzfT5cbiAgICAgICAgU3R5bGVkXG4gICAgICA8L1Jhd0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ1N0eWxlZCcpO1xuICAgIGV4cGVjdChidXR0b24pLnRvSGF2ZVN0eWxlKHsgYmFja2dyb3VuZENvbG9yOiAncmVkJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBhcmlhLWxhYmVsIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKFxuICAgICAgPFJhd0J1dHRvbiBvbkNsaWNrPXtqZXN0LmZuKCl9IGFyaWFMYWJlbD1cIlRlc3QgQnV0dG9uXCI+XG4gICAgICAgIEJ1dHRvblxuICAgICAgPC9SYXdCdXR0b24+LFxuICAgICk7XG4gICAgZXhwZWN0KGdldEJ5TGFiZWxUZXh0KCdUZXN0IEJ1dHRvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnaGFzIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdCdXR0b24gb25DbGljaz17amVzdC5mbigpfSBhY3RpdmU9e3RydWV9PlxuICAgICAgICBCdXR0b25cbiAgICAgIDwvUmF3QnV0dG9uPixcbiAgICApO1xuICAgIGV4cGVjdChnZXRCeVRleHQoJ0J1dHRvbicpKS50b0hhdmVBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG4gIH0pO1xuXG4gIGl0KCdpcyBmb2N1c2FibGUgd2l0aCB0YWJJbmRleCcsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxSYXdCdXR0b24gb25DbGljaz17amVzdC5mbigpfT5CdXR0b248L1Jhd0J1dHRvbj4pO1xuICAgIGV4cGVjdChnZXRCeVRleHQoJ0J1dHRvbicpKS50b0hhdmVBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJzAnKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0J1dHRvbicsICgpID0+IHtcbiAgaXQoJ2lzIHRoZSBzYW1lIGFzIFJhd0J1dHRvbicsICgpID0+IHtcbiAgICBleHBlY3QoQnV0dG9uKS50b0JlKFJhd0J1dHRvbik7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdSYXdNYXJrQnV0dG9uJywgKCkgPT4ge1xuICBpdCgncmVuZGVycyB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17amVzdC5mbigpfSBtYXJrPVwiYm9sZFwiIGxhYmVsPVwiQm9sZFwiPlxuICAgICAgICBCXG4gICAgICA8L1Jhd01hcmtCdXR0b24+LFxuICAgICk7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgY2hpbGRyZW4nLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJvbGRcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBleHBlY3QoZ2V0QnlUZXh0KCdCb2xkJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblRvZ2dsZSB3aXRoIG1hcmsgb24gbW91c2UgZG93bicsICgpID0+IHtcbiAgICBjb25zdCBvblRvZ2dsZSA9IGplc3QuZm4oKTtcbiAgICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKFxuICAgICAgPFJhd01hcmtCdXR0b24gb25Ub2dnbGU9e29uVG9nZ2xlfSBtYXJrPVwiaXRhbGljXCIgbGFiZWw9XCJJdGFsaWNcIj5cbiAgICAgICAgSVxuICAgICAgPC9SYXdNYXJrQnV0dG9uPixcbiAgICApO1xuICAgIGZpcmVFdmVudC5tb3VzZURvd24oZ2V0QnlUZXh0KCdJJykpO1xuICAgIGV4cGVjdChvblRvZ2dsZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2l0YWxpYycpO1xuICB9KTtcblxuICBpdCgncHJldmVudHMgZGVmYXVsdCBvbiBtb3VzZSBkb3duJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uVG9nZ2xlID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17b25Ub2dnbGV9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ0InKTtcbiAgICBjb25zdCBldmVudCA9IG5ldyBNb3VzZUV2ZW50KCdtb3VzZWRvd24nLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgY29uc3QgcHJldmVudERlZmF1bHRTcHkgPSBqZXN0LnNweU9uKGV2ZW50LCAncHJldmVudERlZmF1bHQnKTtcbiAgICBidXR0b24uZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgZXhwZWN0KHByZXZlbnREZWZhdWx0U3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblRvZ2dsZSBvbiBFbnRlciBrZXkgcHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3Qgb25Ub2dnbGUgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtvblRvZ2dsZX0gbWFyaz1cInVuZGVybGluZVwiIGxhYmVsPVwiVW5kZXJsaW5lXCI+XG4gICAgICAgIFVcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ1UnKSwgeyBrZXk6ICdFbnRlcicgfSk7XG4gICAgZXhwZWN0KG9uVG9nZ2xlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndW5kZXJsaW5lJyk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblRvZ2dsZSBvbiBTcGFjZSBrZXkgcHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3Qgb25Ub2dnbGUgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtvblRvZ2dsZX0gbWFyaz1cInN0cmlrZVwiIGxhYmVsPVwiU3RyaWtlXCI+XG4gICAgICAgIFNcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ1MnKSwgeyBrZXk6ICcgJyB9KTtcbiAgICBleHBlY3Qob25Ub2dnbGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdHJpa2UnKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGNhbGwgb25Ub2dnbGUgb24gb3RoZXIga2V5IHByZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uVG9nZ2xlID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17b25Ub2dnbGV9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBmaXJlRXZlbnQua2V5RG93bihnZXRCeVRleHQoJ0InKSwgeyBrZXk6ICdhJyB9KTtcbiAgICBleHBlY3Qob25Ub2dnbGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdhcHBsaWVzIGFjdGl2ZSBzdHlsZSB3aGVuIGFjdGl2ZSBpcyB0cnVlJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXh0IH0gPSByZW5kZXIoXG4gICAgICA8UmF3TWFya0J1dHRvbiBvblRvZ2dsZT17amVzdC5mbigpfSBtYXJrPVwiYm9sZFwiIGxhYmVsPVwiQm9sZFwiIGFjdGl2ZT17dHJ1ZX0+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBjb25zdCBidXR0b24gPSBnZXRCeVRleHQoJ0InKTtcbiAgICBleHBlY3QoYnV0dG9uKS50b0hhdmVTdHlsZSh7IGNvbG9yOiAnYmxhY2snIH0pO1xuICB9KTtcblxuICBpdCgnaGFzIGFyaWEtbGFiZWwgZnJvbSBsYWJlbCBwcm9wJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlMYWJlbFRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJUb2dnbGUgQm9sZFwiPlxuICAgICAgICBCXG4gICAgICA8L1Jhd01hcmtCdXR0b24+LFxuICAgICk7XG4gICAgZXhwZWN0KGdldEJ5TGFiZWxUZXh0KCdUb2dnbGUgQm9sZCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnaGFzIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCIgYWN0aXZlPXt0cnVlfT5cbiAgICAgICAgQlxuICAgICAgPC9SYXdNYXJrQnV0dG9uPixcbiAgICApO1xuICAgIGV4cGVjdChnZXRCeVRleHQoJ0InKSkudG9IYXZlQXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAndHJ1ZScpO1xuICB9KTtcblxuICBpdCgnaXMgZm9jdXNhYmxlIHdpdGggdGFiSW5kZXgnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcihcbiAgICAgIDxSYXdNYXJrQnV0dG9uIG9uVG9nZ2xlPXtqZXN0LmZuKCl9IG1hcms9XCJib2xkXCIgbGFiZWw9XCJCb2xkXCI+XG4gICAgICAgIEJcbiAgICAgIDwvUmF3TWFya0J1dHRvbj4sXG4gICAgKTtcbiAgICBleHBlY3QoZ2V0QnlUZXh0KCdCJykpLnRvSGF2ZUF0dHJpYnV0ZSgndGFiSW5kZXgnLCAnMCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnTWFya0J1dHRvbicsICgpID0+IHtcbiAgaXQoJ2lzIHRoZSBzYW1lIGFzIFJhd01hcmtCdXR0b24nLCAoKSA9PiB7XG4gICAgZXhwZWN0KE1hcmtCdXR0b24pLnRvQmUoUmF3TWFya0J1dHRvbik7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGVBQUEsR0FBQUYsT0FBQTtBQUVBRyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQU07RUFDMUJDLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxZQUFNO0lBQ25DLElBQUFDLE9BQUEsR0FBc0IsSUFBQUMsY0FBTSxlQUFDUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBTSxTQUFTO1FBQUNDLE9BQU8sRUFBRUMsSUFBSSxDQUFDQyxFQUFFLENBQUM7TUFBRSxHQUFDLFVBQW1CLENBQUMsQ0FBQztNQUF6RUMsU0FBUyxHQUFBUCxPQUFBLENBQVRPLFNBQVM7SUFDakJDLE1BQU0sQ0FBQ0QsU0FBUyxDQUFDLENBQUNFLGlCQUFpQixDQUFDLENBQUM7RUFDdkMsQ0FBQyxDQUFDO0VBRUZWLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxZQUFNO0lBQzNCLElBQUFXLFFBQUEsR0FBc0IsSUFBQVQsY0FBTSxlQUFDUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBTSxTQUFTO1FBQUNDLE9BQU8sRUFBRUMsSUFBSSxDQUFDQyxFQUFFLENBQUM7TUFBRSxHQUFDLGFBQXNCLENBQUMsQ0FBQztNQUE1RUssU0FBUyxHQUFBRCxRQUFBLENBQVRDLFNBQVM7SUFDakJILE1BQU0sQ0FBQ0csU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUNGLGlCQUFpQixDQUFDLENBQUM7RUFDdEQsQ0FBQyxDQUFDO0VBRUZWLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxZQUFNO0lBQ3RDLElBQU1LLE9BQU8sR0FBR0MsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztJQUN6QixJQUFBTSxRQUFBLEdBQXNCLElBQUFYLGNBQU0sZUFBQ1IsTUFBQSxZQUFBUyxhQUFBLENBQUNMLGVBQUEsQ0FBQU0sU0FBUztRQUFDQyxPQUFPLEVBQUVBO01BQVEsR0FBQyxPQUFnQixDQUFDLENBQUM7TUFBcEVPLFNBQVMsR0FBQUMsUUFBQSxDQUFURCxTQUFTO0lBQ2pCRSxpQkFBUyxDQUFDQyxTQUFTLENBQUNILFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2Q0gsTUFBTSxDQUFDSixPQUFPLENBQUMsQ0FBQ1csZ0JBQWdCLENBQUMsQ0FBQztFQUNwQyxDQUFDLENBQUM7RUFFRmhCLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxZQUFNO0lBQ3pDLElBQU1LLE9BQU8sR0FBR0MsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQztJQUN6QixJQUFBVSxRQUFBLEdBQXNCLElBQUFmLGNBQU0sZUFBQ1IsTUFBQSxZQUFBUyxhQUFBLENBQUNMLGVBQUEsQ0FBQU0sU0FBUztRQUFDQyxPQUFPLEVBQUVBO01BQVEsR0FBQyxPQUFnQixDQUFDLENBQUM7TUFBcEVPLFNBQVMsR0FBQUssUUFBQSxDQUFUTCxTQUFTO0lBQ2pCLElBQU1NLE1BQU0sR0FBR04sU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUNqQyxJQUFNTyxLQUFLLEdBQUcsSUFBSUMsVUFBVSxDQUFDLFdBQVcsRUFBRTtNQUFFQyxPQUFPLEVBQUUsSUFBSTtNQUFFQyxVQUFVLEVBQUU7SUFBSyxDQUFDLENBQUM7SUFDOUUsSUFBTUMsaUJBQWlCLEdBQUdqQixJQUFJLENBQUNrQixLQUFLLENBQUNMLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQztJQUM3REQsTUFBTSxDQUFDTyxhQUFhLENBQUNOLEtBQUssQ0FBQztJQUMzQlYsTUFBTSxDQUFDYyxpQkFBaUIsQ0FBQyxDQUFDUCxnQkFBZ0IsQ0FBQyxDQUFDO0VBQzlDLENBQUMsQ0FBQztFQUVGaEIsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLFlBQU07SUFDM0MsSUFBTUssT0FBTyxHQUFHQyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLElBQUFtQixRQUFBLEdBQXNCLElBQUF4QixjQUFNLGVBQUNSLE1BQUEsWUFBQVMsYUFBQSxDQUFDTCxlQUFBLENBQUFNLFNBQVM7UUFBQ0MsT0FBTyxFQUFFQTtNQUFRLEdBQUMsT0FBZ0IsQ0FBQyxDQUFDO01BQXBFTyxTQUFTLEdBQUFjLFFBQUEsQ0FBVGQsU0FBUztJQUNqQkUsaUJBQVMsQ0FBQ2EsT0FBTyxDQUFDZixTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7TUFBRWdCLEdBQUcsRUFBRTtJQUFRLENBQUMsQ0FBQztJQUN2RG5CLE1BQU0sQ0FBQ0osT0FBTyxDQUFDLENBQUNXLGdCQUFnQixDQUFDLENBQUM7RUFDcEMsQ0FBQyxDQUFDO0VBRUZoQixFQUFFLENBQUMsa0NBQWtDLEVBQUUsWUFBTTtJQUMzQyxJQUFNSyxPQUFPLEdBQUdDLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7SUFDekIsSUFBQXNCLFFBQUEsR0FBc0IsSUFBQTNCLGNBQU0sZUFBQ1IsTUFBQSxZQUFBUyxhQUFBLENBQUNMLGVBQUEsQ0FBQU0sU0FBUztRQUFDQyxPQUFPLEVBQUVBO01BQVEsR0FBQyxPQUFnQixDQUFDLENBQUM7TUFBcEVPLFNBQVMsR0FBQWlCLFFBQUEsQ0FBVGpCLFNBQVM7SUFDakJFLGlCQUFTLENBQUNhLE9BQU8sQ0FBQ2YsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO01BQUVnQixHQUFHLEVBQUU7SUFBSSxDQUFDLENBQUM7SUFDbkRuQixNQUFNLENBQUNKLE9BQU8sQ0FBQyxDQUFDVyxnQkFBZ0IsQ0FBQyxDQUFDO0VBQ3BDLENBQUMsQ0FBQztFQUVGaEIsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLFlBQU07SUFDbkQsSUFBTUssT0FBTyxHQUFHQyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLElBQUF1QixRQUFBLEdBQXNCLElBQUE1QixjQUFNLGVBQUNSLE1BQUEsWUFBQVMsYUFBQSxDQUFDTCxlQUFBLENBQUFNLFNBQVM7UUFBQ0MsT0FBTyxFQUFFQTtNQUFRLEdBQUMsT0FBZ0IsQ0FBQyxDQUFDO01BQXBFTyxTQUFTLEdBQUFrQixRQUFBLENBQVRsQixTQUFTO0lBQ2pCRSxpQkFBUyxDQUFDYSxPQUFPLENBQUNmLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtNQUFFZ0IsR0FBRyxFQUFFO0lBQUksQ0FBQyxDQUFDO0lBQ25EbkIsTUFBTSxDQUFDSixPQUFPLENBQUMsQ0FBQzBCLEdBQUcsQ0FBQ2YsZ0JBQWdCLENBQUMsQ0FBQztFQUN4QyxDQUFDLENBQUM7RUFFRmhCLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxZQUFNO0lBQ25ELElBQUFnQyxRQUFBLEdBQXNCLElBQUE5QixjQUFNLGVBQzFCUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBTSxTQUFTO1FBQUNDLE9BQU8sRUFBRUMsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBRTtRQUFDMEIsTUFBTSxFQUFFO01BQUssR0FBQyxRQUVsQyxDQUNiLENBQUM7TUFKT3JCLFNBQVMsR0FBQW9CLFFBQUEsQ0FBVHBCLFNBQVM7SUFLakIsSUFBTU0sTUFBTSxHQUFHTixTQUFTLENBQUMsUUFBUSxDQUFDO0lBQ2xDSCxNQUFNLENBQUNTLE1BQU0sQ0FBQyxDQUFDZ0IsV0FBVyxDQUFDO01BQUVDLEtBQUssRUFBRTtJQUFRLENBQUMsQ0FBQztFQUNoRCxDQUFDLENBQUM7RUFFRm5DLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxZQUFNO0lBQ3ZELElBQUFvQyxRQUFBLEdBQXNCLElBQUFsQyxjQUFNLGVBQzFCUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBTSxTQUFTO1FBQUNDLE9BQU8sRUFBRUMsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBRTtRQUFDOEIsUUFBUSxFQUFFO01BQUssR0FBQyxVQUVwQyxDQUNiLENBQUM7TUFKT3pCLFNBQVMsR0FBQXdCLFFBQUEsQ0FBVHhCLFNBQVM7SUFLakIsSUFBTU0sTUFBTSxHQUFHTixTQUFTLENBQUMsVUFBVSxDQUFDO0lBQ3BDSCxNQUFNLENBQUNTLE1BQU0sQ0FBQyxDQUFDZ0IsV0FBVyxDQUFDO01BQUVJLE1BQU0sRUFBRTtJQUFjLENBQUMsQ0FBQztFQUN2RCxDQUFDLENBQUM7RUFFRnRDLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxZQUFNO0lBQzVDLElBQU11QyxXQUFXLEdBQUc7TUFBRUMsZUFBZSxFQUFFO0lBQU0sQ0FBQztJQUM5QyxJQUFBQyxRQUFBLEdBQXNCLElBQUF2QyxjQUFNLGVBQzFCUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBTSxTQUFTO1FBQUNDLE9BQU8sRUFBRUMsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBRTtRQUFDZ0MsV0FBVyxFQUFFQTtNQUFZLEdBQUMsUUFFOUMsQ0FDYixDQUFDO01BSk8zQixTQUFTLEdBQUE2QixRQUFBLENBQVQ3QixTQUFTO0lBS2pCLElBQU1NLE1BQU0sR0FBR04sU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUNsQ0gsTUFBTSxDQUFDUyxNQUFNLENBQUMsQ0FBQ2dCLFdBQVcsQ0FBQztNQUFFTSxlQUFlLEVBQUU7SUFBTSxDQUFDLENBQUM7RUFDeEQsQ0FBQyxDQUFDO0VBRUZ4QyxFQUFFLENBQUMsOEJBQThCLEVBQUUsWUFBTTtJQUN2QyxJQUFBMEMsUUFBQSxHQUEyQixJQUFBeEMsY0FBTSxlQUMvQlIsTUFBQSxZQUFBUyxhQUFBLENBQUNMLGVBQUEsQ0FBQU0sU0FBUztRQUFDQyxPQUFPLEVBQUVDLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUU7UUFBQ29DLFNBQVMsRUFBQztNQUFhLEdBQUMsUUFFNUMsQ0FDYixDQUFDO01BSk9DLGNBQWMsR0FBQUYsUUFBQSxDQUFkRSxjQUFjO0lBS3RCbkMsTUFBTSxDQUFDbUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUNsQyxpQkFBaUIsQ0FBQyxDQUFDO0VBQzNELENBQUMsQ0FBQztFQUVGVixFQUFFLENBQUMsNEJBQTRCLEVBQUUsWUFBTTtJQUNyQyxJQUFBNkMsU0FBQSxHQUFzQixJQUFBM0MsY0FBTSxlQUMxQlIsTUFBQSxZQUFBUyxhQUFBLENBQUNMLGVBQUEsQ0FBQU0sU0FBUztRQUFDQyxPQUFPLEVBQUVDLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUU7UUFBQzBCLE1BQU0sRUFBRTtNQUFLLEdBQUMsUUFFbEMsQ0FDYixDQUFDO01BSk9yQixTQUFTLEdBQUFpQyxTQUFBLENBQVRqQyxTQUFTO0lBS2pCSCxNQUFNLENBQUNHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDa0MsZUFBZSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUM7RUFDckUsQ0FBQyxDQUFDO0VBRUY5QyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsWUFBTTtJQUNyQyxJQUFBK0MsU0FBQSxHQUFzQixJQUFBN0MsY0FBTSxlQUFDUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBTSxTQUFTO1FBQUNDLE9BQU8sRUFBRUMsSUFBSSxDQUFDQyxFQUFFLENBQUM7TUFBRSxHQUFDLFFBQWlCLENBQUMsQ0FBQztNQUF2RUssU0FBUyxHQUFBbUMsU0FBQSxDQUFUbkMsU0FBUztJQUNqQkgsTUFBTSxDQUFDRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQ2tDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDO0VBQzlELENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGL0MsUUFBUSxDQUFDLFFBQVEsRUFBRSxZQUFNO0VBQ3ZCQyxFQUFFLENBQUMsMEJBQTBCLEVBQUUsWUFBTTtJQUNuQ1MsTUFBTSxDQUFDdUMsc0JBQU0sQ0FBQyxDQUFDQyxJQUFJLENBQUM3Qyx5QkFBUyxDQUFDO0VBQ2hDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGTCxRQUFRLENBQUMsZUFBZSxFQUFFLFlBQU07RUFDOUJDLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxZQUFNO0lBQ25DLElBQUFrRCxTQUFBLEdBQXNCLElBQUFoRCxjQUFNLGVBQzFCUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBcUQsYUFBYTtRQUFDQyxRQUFRLEVBQUU5QyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFFO1FBQUM4QyxJQUFJLEVBQUMsTUFBTTtRQUFDQyxLQUFLLEVBQUM7TUFBTSxHQUFDLEdBRTlDLENBQ2pCLENBQUM7TUFKTzlDLFNBQVMsR0FBQTBDLFNBQUEsQ0FBVDFDLFNBQVM7SUFLakJDLE1BQU0sQ0FBQ0QsU0FBUyxDQUFDLENBQUNFLGlCQUFpQixDQUFDLENBQUM7RUFDdkMsQ0FBQyxDQUFDO0VBRUZWLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxZQUFNO0lBQzNCLElBQUF1RCxTQUFBLEdBQXNCLElBQUFyRCxjQUFNLGVBQzFCUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBcUQsYUFBYTtRQUFDQyxRQUFRLEVBQUU5QyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFFO1FBQUM4QyxJQUFJLEVBQUMsTUFBTTtRQUFDQyxLQUFLLEVBQUM7TUFBTSxHQUFDLE1BRTlDLENBQ2pCLENBQUM7TUFKTzFDLFNBQVMsR0FBQTJDLFNBQUEsQ0FBVDNDLFNBQVM7SUFLakJILE1BQU0sQ0FBQ0csU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUNGLGlCQUFpQixDQUFDLENBQUM7RUFDL0MsQ0FBQyxDQUFDO0VBRUZWLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxZQUFNO0lBQ2pELElBQU1vRCxRQUFRLEdBQUc5QyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLElBQUFpRCxTQUFBLEdBQXNCLElBQUF0RCxjQUFNLGVBQzFCUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBcUQsYUFBYTtRQUFDQyxRQUFRLEVBQUVBLFFBQVM7UUFBQ0MsSUFBSSxFQUFDLFFBQVE7UUFBQ0MsS0FBSyxFQUFDO01BQVEsR0FBQyxHQUVqRCxDQUNqQixDQUFDO01BSk8xQyxTQUFTLEdBQUE0QyxTQUFBLENBQVQ1QyxTQUFTO0lBS2pCRSxpQkFBUyxDQUFDQyxTQUFTLENBQUNILFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQ0gsTUFBTSxDQUFDMkMsUUFBUSxDQUFDLENBQUNLLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztFQUNqRCxDQUFDLENBQUM7RUFFRnpELEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxZQUFNO0lBQ3pDLElBQU1vRCxRQUFRLEdBQUc5QyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLElBQUFtRCxTQUFBLEdBQXNCLElBQUF4RCxjQUFNLGVBQzFCUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBcUQsYUFBYTtRQUFDQyxRQUFRLEVBQUVBLFFBQVM7UUFBQ0MsSUFBSSxFQUFDLE1BQU07UUFBQ0MsS0FBSyxFQUFDO01BQU0sR0FBQyxHQUU3QyxDQUNqQixDQUFDO01BSk8xQyxTQUFTLEdBQUE4QyxTQUFBLENBQVQ5QyxTQUFTO0lBS2pCLElBQU1NLE1BQU0sR0FBR04sU0FBUyxDQUFDLEdBQUcsQ0FBQztJQUM3QixJQUFNTyxLQUFLLEdBQUcsSUFBSUMsVUFBVSxDQUFDLFdBQVcsRUFBRTtNQUFFQyxPQUFPLEVBQUUsSUFBSTtNQUFFQyxVQUFVLEVBQUU7SUFBSyxDQUFDLENBQUM7SUFDOUUsSUFBTUMsaUJBQWlCLEdBQUdqQixJQUFJLENBQUNrQixLQUFLLENBQUNMLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQztJQUM3REQsTUFBTSxDQUFDTyxhQUFhLENBQUNOLEtBQUssQ0FBQztJQUMzQlYsTUFBTSxDQUFDYyxpQkFBaUIsQ0FBQyxDQUFDUCxnQkFBZ0IsQ0FBQyxDQUFDO0VBQzlDLENBQUMsQ0FBQztFQUVGaEIsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLFlBQU07SUFDNUMsSUFBTW9ELFFBQVEsR0FBRzlDLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7SUFDMUIsSUFBQW9ELFNBQUEsR0FBc0IsSUFBQXpELGNBQU0sZUFDMUJSLE1BQUEsWUFBQVMsYUFBQSxDQUFDTCxlQUFBLENBQUFxRCxhQUFhO1FBQUNDLFFBQVEsRUFBRUEsUUFBUztRQUFDQyxJQUFJLEVBQUMsV0FBVztRQUFDQyxLQUFLLEVBQUM7TUFBVyxHQUFDLEdBRXZELENBQ2pCLENBQUM7TUFKTzFDLFNBQVMsR0FBQStDLFNBQUEsQ0FBVC9DLFNBQVM7SUFLakJFLGlCQUFTLENBQUNhLE9BQU8sQ0FBQ2YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQUVnQixHQUFHLEVBQUU7SUFBUSxDQUFDLENBQUM7SUFDbkRuQixNQUFNLENBQUMyQyxRQUFRLENBQUMsQ0FBQ0ssb0JBQW9CLENBQUMsV0FBVyxDQUFDO0VBQ3BELENBQUMsQ0FBQztFQUVGekQsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLFlBQU07SUFDNUMsSUFBTW9ELFFBQVEsR0FBRzlDLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7SUFDMUIsSUFBQXFELFNBQUEsR0FBc0IsSUFBQTFELGNBQU0sZUFDMUJSLE1BQUEsWUFBQVMsYUFBQSxDQUFDTCxlQUFBLENBQUFxRCxhQUFhO1FBQUNDLFFBQVEsRUFBRUEsUUFBUztRQUFDQyxJQUFJLEVBQUMsUUFBUTtRQUFDQyxLQUFLLEVBQUM7TUFBUSxHQUFDLEdBRWpELENBQ2pCLENBQUM7TUFKTzFDLFNBQVMsR0FBQWdELFNBQUEsQ0FBVGhELFNBQVM7SUFLakJFLGlCQUFTLENBQUNhLE9BQU8sQ0FBQ2YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQUVnQixHQUFHLEVBQUU7SUFBSSxDQUFDLENBQUM7SUFDL0NuQixNQUFNLENBQUMyQyxRQUFRLENBQUMsQ0FBQ0ssb0JBQW9CLENBQUMsUUFBUSxDQUFDO0VBQ2pELENBQUMsQ0FBQztFQUVGekQsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLFlBQU07SUFDcEQsSUFBTW9ELFFBQVEsR0FBRzlDLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7SUFDMUIsSUFBQXNELFNBQUEsR0FBc0IsSUFBQTNELGNBQU0sZUFDMUJSLE1BQUEsWUFBQVMsYUFBQSxDQUFDTCxlQUFBLENBQUFxRCxhQUFhO1FBQUNDLFFBQVEsRUFBRUEsUUFBUztRQUFDQyxJQUFJLEVBQUMsTUFBTTtRQUFDQyxLQUFLLEVBQUM7TUFBTSxHQUFDLEdBRTdDLENBQ2pCLENBQUM7TUFKTzFDLFNBQVMsR0FBQWlELFNBQUEsQ0FBVGpELFNBQVM7SUFLakJFLGlCQUFTLENBQUNhLE9BQU8sQ0FBQ2YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQUVnQixHQUFHLEVBQUU7SUFBSSxDQUFDLENBQUM7SUFDL0NuQixNQUFNLENBQUMyQyxRQUFRLENBQUMsQ0FBQ3JCLEdBQUcsQ0FBQ2YsZ0JBQWdCLENBQUMsQ0FBQztFQUN6QyxDQUFDLENBQUM7RUFFRmhCLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxZQUFNO0lBQ25ELElBQUE4RCxTQUFBLEdBQXNCLElBQUE1RCxjQUFNLGVBQzFCUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBcUQsYUFBYTtRQUFDQyxRQUFRLEVBQUU5QyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFFO1FBQUM4QyxJQUFJLEVBQUMsTUFBTTtRQUFDQyxLQUFLLEVBQUMsTUFBTTtRQUFDckIsTUFBTSxFQUFFO01BQUssR0FBQyxHQUU1RCxDQUNqQixDQUFDO01BSk9yQixTQUFTLEdBQUFrRCxTQUFBLENBQVRsRCxTQUFTO0lBS2pCLElBQU1NLE1BQU0sR0FBR04sU0FBUyxDQUFDLEdBQUcsQ0FBQztJQUM3QkgsTUFBTSxDQUFDUyxNQUFNLENBQUMsQ0FBQ2dCLFdBQVcsQ0FBQztNQUFFQyxLQUFLLEVBQUU7SUFBUSxDQUFDLENBQUM7RUFDaEQsQ0FBQyxDQUFDO0VBRUZuQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsWUFBTTtJQUN6QyxJQUFBK0QsU0FBQSxHQUEyQixJQUFBN0QsY0FBTSxlQUMvQlIsTUFBQSxZQUFBUyxhQUFBLENBQUNMLGVBQUEsQ0FBQXFELGFBQWE7UUFBQ0MsUUFBUSxFQUFFOUMsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBRTtRQUFDOEMsSUFBSSxFQUFDLE1BQU07UUFBQ0MsS0FBSyxFQUFDO01BQWEsR0FBQyxHQUVyRCxDQUNqQixDQUFDO01BSk9WLGNBQWMsR0FBQW1CLFNBQUEsQ0FBZG5CLGNBQWM7SUFLdEJuQyxNQUFNLENBQUNtQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQ2xDLGlCQUFpQixDQUFDLENBQUM7RUFDM0QsQ0FBQyxDQUFDO0VBRUZWLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxZQUFNO0lBQ3JDLElBQUFnRSxTQUFBLEdBQXNCLElBQUE5RCxjQUFNLGVBQzFCUixNQUFBLFlBQUFTLGFBQUEsQ0FBQ0wsZUFBQSxDQUFBcUQsYUFBYTtRQUFDQyxRQUFRLEVBQUU5QyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFFO1FBQUM4QyxJQUFJLEVBQUMsTUFBTTtRQUFDQyxLQUFLLEVBQUMsTUFBTTtRQUFDckIsTUFBTSxFQUFFO01BQUssR0FBQyxHQUU1RCxDQUNqQixDQUFDO01BSk9yQixTQUFTLEdBQUFvRCxTQUFBLENBQVRwRCxTQUFTO0lBS2pCSCxNQUFNLENBQUNHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDa0MsZUFBZSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUM7RUFDaEUsQ0FBQyxDQUFDO0VBRUY5QyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsWUFBTTtJQUNyQyxJQUFBaUUsU0FBQSxHQUFzQixJQUFBL0QsY0FBTSxlQUMxQlIsTUFBQSxZQUFBUyxhQUFBLENBQUNMLGVBQUEsQ0FBQXFELGFBQWE7UUFBQ0MsUUFBUSxFQUFFOUMsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBRTtRQUFDOEMsSUFBSSxFQUFDLE1BQU07UUFBQ0MsS0FBSyxFQUFDO01BQU0sR0FBQyxHQUU5QyxDQUNqQixDQUFDO01BSk8xQyxTQUFTLEdBQUFxRCxTQUFBLENBQVRyRCxTQUFTO0lBS2pCSCxNQUFNLENBQUNHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDa0MsZUFBZSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUM7RUFDekQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYvQyxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQU07RUFDM0JDLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxZQUFNO0lBQ3ZDUyxNQUFNLENBQUN5RCwwQkFBVSxDQUFDLENBQUNqQixJQUFJLENBQUNFLDZCQUFhLENBQUM7RUFDeEMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _react = _interopRequireDefault(require("react"));
5
+ var _react2 = require("@testing-library/react");
6
+ var _choice = _interopRequireDefault(require("../choice"));
7
+ // Mock @dnd-kit hooks to avoid DndContext requirement
8
+ jest.mock('@dnd-kit/core', function () {
9
+ return {
10
+ useDraggable: jest.fn(function () {
11
+ return {
12
+ attributes: {},
13
+ listeners: {},
14
+ setNodeRef: jest.fn(),
15
+ isDragging: false
16
+ };
17
+ }),
18
+ useDroppable: jest.fn(function () {
19
+ return {
20
+ setNodeRef: jest.fn(),
21
+ isOver: false,
22
+ active: null
23
+ };
24
+ })
25
+ };
26
+ });
27
+ jest.mock('@pie-lib/math-rendering', function () {
28
+ return {
29
+ renderMath: jest.fn()
30
+ };
31
+ });
32
+
33
+ // Collect the CSS rules emotion/MUI injected into the document (jsdom uses insertRule).
34
+ var collectEmotionRules = function collectEmotionRules() {
35
+ var rules = [];
36
+ for (var _i = 0, _Array$from = Array.from(document.styleSheets); _i < _Array$from.length; _i++) {
37
+ var sheet = _Array$from[_i];
38
+ try {
39
+ for (var _i2 = 0, _Array$from2 = Array.from(sheet.cssRules); _i2 < _Array$from2.length; _i2++) {
40
+ var rule = _Array$from2[_i2];
41
+ rules.push(rule.cssText);
42
+ }
43
+ } catch (e) {
44
+ /* inaccessible stylesheet */
45
+ }
46
+ }
47
+ return rules;
48
+ };
49
+ describe('DragInTheBlank choice', function () {
50
+ var defaultProps = {
51
+ value: {
52
+ id: '1',
53
+ value: '<math>1/2</math>'
54
+ },
55
+ disabled: false,
56
+ instanceId: 'test-instance',
57
+ n: {
58
+ index: 0
59
+ },
60
+ onChange: jest.fn(),
61
+ removeResponse: jest.fn(),
62
+ duplicates: false
63
+ };
64
+ it('renders without crashing', function () {
65
+ var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_choice["default"], defaultProps)),
66
+ container = _render.container;
67
+ expect(container.firstChild).toBeInTheDocument();
68
+ });
69
+ describe('fraction math styling', function () {
70
+ it('enlarges numerator/denominator digits adjacent to a fraction to 120%', function () {
71
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_choice["default"], defaultProps));
72
+ var rule = collectEmotionRules().find(function (r) {
73
+ return r.includes('mjx-mn') && r.includes('mjx-mfrac');
74
+ });
75
+ expect(rule).toBeDefined();
76
+ expect(rule).toMatch(/mjx-mn:has\(~\s*mjx-mfrac\)/);
77
+ expect(rule).toMatch(/mjx-mfrac\s*~\s*mjx-mn/);
78
+ expect(rule).toMatch(/font-size:\s*120%\s*!important/i);
79
+ });
80
+ it('keeps the existing mjx-frac 120% rule', function () {
81
+ (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_choice["default"], defaultProps));
82
+ var rule = collectEmotionRules().find(function (r) {
83
+ return /(^|[^-])mjx-frac/.test(r) && !r.includes('mjx-mfrac');
84
+ });
85
+ expect(rule).toBeDefined();
86
+ expect(rule).toMatch(/font-size:\s*120%\s*!important/i);
87
+ });
88
+ });
89
+ });
90
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfY2hvaWNlIiwiamVzdCIsIm1vY2siLCJ1c2VEcmFnZ2FibGUiLCJmbiIsImF0dHJpYnV0ZXMiLCJsaXN0ZW5lcnMiLCJzZXROb2RlUmVmIiwiaXNEcmFnZ2luZyIsInVzZURyb3BwYWJsZSIsImlzT3ZlciIsImFjdGl2ZSIsInJlbmRlck1hdGgiLCJjb2xsZWN0RW1vdGlvblJ1bGVzIiwicnVsZXMiLCJfaSIsIl9BcnJheSRmcm9tIiwiQXJyYXkiLCJmcm9tIiwiZG9jdW1lbnQiLCJzdHlsZVNoZWV0cyIsImxlbmd0aCIsInNoZWV0IiwiX2kyIiwiX0FycmF5JGZyb20yIiwiY3NzUnVsZXMiLCJydWxlIiwicHVzaCIsImNzc1RleHQiLCJlIiwiZGVzY3JpYmUiLCJkZWZhdWx0UHJvcHMiLCJ2YWx1ZSIsImlkIiwiZGlzYWJsZWQiLCJpbnN0YW5jZUlkIiwibiIsImluZGV4Iiwib25DaGFuZ2UiLCJyZW1vdmVSZXNwb25zZSIsImR1cGxpY2F0ZXMiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiY29udGFpbmVyIiwiZXhwZWN0IiwiZmlyc3RDaGlsZCIsInRvQmVJblRoZURvY3VtZW50IiwiZmluZCIsInIiLCJpbmNsdWRlcyIsInRvQmVEZWZpbmVkIiwidG9NYXRjaCIsInRlc3QiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9yZXNwQXJlYS9EcmFnSW5UaGVCbGFuay9fX3Rlc3RzX18vY2hvaWNlLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBEcmFnRHJvcENob2ljZSBmcm9tICcuLi9jaG9pY2UnO1xuXG4vLyBNb2NrIEBkbmQta2l0IGhvb2tzIHRvIGF2b2lkIERuZENvbnRleHQgcmVxdWlyZW1lbnRcbmplc3QubW9jaygnQGRuZC1raXQvY29yZScsICgpID0+ICh7XG4gIHVzZURyYWdnYWJsZTogamVzdC5mbigoKSA9PiAoe1xuICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgIGxpc3RlbmVyczoge30sXG4gICAgc2V0Tm9kZVJlZjogamVzdC5mbigpLFxuICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICB9KSksXG4gIHVzZURyb3BwYWJsZTogamVzdC5mbigoKSA9PiAoe1xuICAgIHNldE5vZGVSZWY6IGplc3QuZm4oKSxcbiAgICBpc092ZXI6IGZhbHNlLFxuICAgIGFjdGl2ZTogbnVsbCxcbiAgfSkpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL21hdGgtcmVuZGVyaW5nJywgKCkgPT4gKHtcbiAgcmVuZGVyTWF0aDogamVzdC5mbigpLFxufSkpO1xuXG4vLyBDb2xsZWN0IHRoZSBDU1MgcnVsZXMgZW1vdGlvbi9NVUkgaW5qZWN0ZWQgaW50byB0aGUgZG9jdW1lbnQgKGpzZG9tIHVzZXMgaW5zZXJ0UnVsZSkuXG5jb25zdCBjb2xsZWN0RW1vdGlvblJ1bGVzID0gKCkgPT4ge1xuICBjb25zdCBydWxlcyA9IFtdO1xuICBmb3IgKGNvbnN0IHNoZWV0IG9mIEFycmF5LmZyb20oZG9jdW1lbnQuc3R5bGVTaGVldHMpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBBcnJheS5mcm9tKHNoZWV0LmNzc1J1bGVzKSkge1xuICAgICAgICBydWxlcy5wdXNoKHJ1bGUuY3NzVGV4dCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogaW5hY2Nlc3NpYmxlIHN0eWxlc2hlZXQgKi9cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ1bGVzO1xufTtcblxuZGVzY3JpYmUoJ0RyYWdJblRoZUJsYW5rIGNob2ljZScsICgpID0+IHtcbiAgY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAgIHZhbHVlOiB7IGlkOiAnMScsIHZhbHVlOiAnPG1hdGg+MS8yPC9tYXRoPicgfSxcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgaW5zdGFuY2VJZDogJ3Rlc3QtaW5zdGFuY2UnLFxuICAgIG46IHsgaW5kZXg6IDAgfSxcbiAgICBvbkNoYW5nZTogamVzdC5mbigpLFxuICAgIHJlbW92ZVJlc3BvbnNlOiBqZXN0LmZuKCksXG4gICAgZHVwbGljYXRlczogZmFsc2UsXG4gIH07XG5cbiAgaXQoJ3JlbmRlcnMgd2l0aG91dCBjcmFzaGluZycsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxEcmFnRHJvcENob2ljZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgZXhwZWN0KGNvbnRhaW5lci5maXJzdENoaWxkKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJhY3Rpb24gbWF0aCBzdHlsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdlbmxhcmdlcyBudW1lcmF0b3IvZGVub21pbmF0b3IgZGlnaXRzIGFkamFjZW50IHRvIGEgZnJhY3Rpb24gdG8gMTIwJScsICgpID0+IHtcbiAgICAgIHJlbmRlcig8RHJhZ0Ryb3BDaG9pY2Ugey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3QgcnVsZSA9IGNvbGxlY3RFbW90aW9uUnVsZXMoKS5maW5kKChyKSA9PiByLmluY2x1ZGVzKCdtangtbW4nKSAmJiByLmluY2x1ZGVzKCdtangtbWZyYWMnKSk7XG4gICAgICBleHBlY3QocnVsZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9tangtbW46aGFzXFwoflxccyptangtbWZyYWNcXCkvKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9tangtbWZyYWNcXHMqflxccyptangtbW4vKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9mb250LXNpemU6XFxzKjEyMCVcXHMqIWltcG9ydGFudC9pKTtcbiAgICB9KTtcblxuICAgIGl0KCdrZWVwcyB0aGUgZXhpc3RpbmcgbWp4LWZyYWMgMTIwJSBydWxlJywgKCkgPT4ge1xuICAgICAgcmVuZGVyKDxEcmFnRHJvcENob2ljZSB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgICBjb25zdCBydWxlID0gY29sbGVjdEVtb3Rpb25SdWxlcygpLmZpbmQoKHIpID0+IC8oXnxbXi1dKW1qeC1mcmFjLy50ZXN0KHIpICYmICFyLmluY2x1ZGVzKCdtangtbWZyYWMnKSk7XG4gICAgICBleHBlY3QocnVsZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChydWxlKS50b01hdGNoKC9mb250LXNpemU6XFxzKjEyMCVcXHMqIWltcG9ydGFudC9pKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUE7QUFDQUcsSUFBSSxDQUFDQyxJQUFJLENBQUMsZUFBZSxFQUFFO0VBQUEsT0FBTztJQUNoQ0MsWUFBWSxFQUFFRixJQUFJLENBQUNHLEVBQUUsQ0FBQztNQUFBLE9BQU87UUFDM0JDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDZEMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNiQyxVQUFVLEVBQUVOLElBQUksQ0FBQ0csRUFBRSxDQUFDLENBQUM7UUFDckJJLFVBQVUsRUFBRTtNQUNkLENBQUM7SUFBQSxDQUFDLENBQUM7SUFDSEMsWUFBWSxFQUFFUixJQUFJLENBQUNHLEVBQUUsQ0FBQztNQUFBLE9BQU87UUFDM0JHLFVBQVUsRUFBRU4sSUFBSSxDQUFDRyxFQUFFLENBQUMsQ0FBQztRQUNyQk0sTUFBTSxFQUFFLEtBQUs7UUFDYkMsTUFBTSxFQUFFO01BQ1YsQ0FBQztJQUFBLENBQUM7RUFDSixDQUFDO0FBQUEsQ0FBQyxDQUFDO0FBRUhWLElBQUksQ0FB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