@pie-lib/editable-html-tip-tap 2.1.20-beta.6 → 2.1.20-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/__tests__/EditableHtml.test.js +831 -0
- package/lib/__tests__/constants.test.js +21 -0
- package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
- package/lib/__tests__/extensions.test.js +209 -0
- package/lib/__tests__/index.test.js +250 -0
- package/lib/__tests__/size-utils.test.js +57 -0
- package/lib/__tests__/spellcheck.test.js +142 -0
- package/lib/__tests__/theme.test.js +17 -0
- package/lib/components/__tests__/AltDialog.test.js +201 -0
- package/lib/components/__tests__/CharacterPicker.test.js +455 -0
- package/lib/components/__tests__/CssIcon.test.js +58 -0
- package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
- package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
- package/lib/components/__tests__/ImageToolbar.test.js +185 -0
- package/lib/components/__tests__/InlineDropdown.test.js +839 -0
- package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
- package/lib/components/__tests__/MediaDialog.test.js +433 -0
- package/lib/components/__tests__/MediaToolbar.test.js +126 -0
- package/lib/components/__tests__/MediaWrapper.test.js +96 -0
- package/lib/components/__tests__/MenuBar.test.js +502 -0
- package/lib/components/__tests__/RespArea.test.js +171 -0
- package/lib/components/__tests__/TableIcons.test.js +153 -0
- package/lib/components/__tests__/TextAlign.test.js +209 -0
- package/lib/components/__tests__/TiptapContainer.test.js +196 -0
- package/lib/components/__tests__/characterUtils.test.js +178 -0
- package/lib/components/__tests__/choice.test.js +213 -0
- package/lib/components/__tests__/custom-popper.test.js +108 -0
- package/lib/components/__tests__/done-button.test.js +72 -0
- package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
- package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
- package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
- package/lib/extensions/__tests__/css.test.js +214 -0
- package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
- package/lib/extensions/__tests__/divNode.test.js +108 -0
- package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
- package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
- package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
- package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
- package/lib/extensions/__tests__/extended-table.test.js +200 -0
- package/lib/extensions/__tests__/image-component.test.js +432 -0
- package/lib/extensions/__tests__/image.test.js +313 -0
- package/lib/extensions/__tests__/math.test.js +1411 -0
- package/lib/extensions/__tests__/media-node-view.test.js +307 -0
- package/lib/extensions/__tests__/media.test.js +292 -0
- package/lib/extensions/__tests__/responseArea.test.js +736 -0
- package/lib/utils/__tests__/helper.test.js +107 -0
- package/lib/utils/__tests__/toolbar.test.js +38 -0
- package/package.json +3 -3
- package/src/__tests__/EditableHtml.test.jsx +588 -0
- package/src/__tests__/constants.test.js +19 -0
- package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
- package/src/__tests__/extensions.test.js +208 -0
- package/src/__tests__/index.test.jsx +154 -0
- package/src/__tests__/size-utils.test.js +64 -0
- package/src/__tests__/theme.test.js +17 -0
- package/src/components/__tests__/AltDialog.test.jsx +147 -0
- package/src/components/__tests__/CharacterPicker.test.jsx +270 -0
- package/src/components/__tests__/CssIcon.test.jsx +46 -0
- package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
- package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +209 -0
- package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
- package/src/components/__tests__/InlineDropdown.test.jsx +557 -0
- package/src/components/__tests__/InsertImageHandler.test.js +161 -0
- package/src/components/__tests__/MediaDialog.test.jsx +293 -0
- package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
- package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
- package/src/components/__tests__/MenuBar.test.jsx +250 -0
- package/src/components/__tests__/RespArea.test.jsx +122 -0
- package/src/components/__tests__/TableIcons.test.jsx +149 -0
- package/src/components/__tests__/TextAlign.test.jsx +167 -0
- package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
- package/src/components/__tests__/characterUtils.test.js +166 -0
- package/src/components/__tests__/choice.test.jsx +171 -0
- package/src/components/__tests__/custom-popper.test.jsx +82 -0
- package/src/components/__tests__/done-button.test.jsx +54 -0
- package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
- package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
- package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
- package/src/extensions/__tests__/css.test.js +196 -0
- package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
- package/src/extensions/__tests__/divNode.test.js +87 -0
- package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
- package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
- package/src/extensions/__tests__/extended-list-item.test.js +13 -0
- package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
- package/src/extensions/__tests__/extended-table.test.js +183 -0
- package/src/extensions/__tests__/image-component.test.jsx +346 -0
- package/src/extensions/__tests__/image.test.js +237 -0
- package/src/extensions/__tests__/math.test.js +900 -0
- package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
- package/src/extensions/__tests__/media.test.js +271 -0
- package/src/extensions/__tests__/responseArea.test.js +655 -0
- package/src/utils/__tests__/helper.test.js +126 -0
- package/src/utils/__tests__/toolbar.test.js +43 -0
|
@@ -0,0 +1,839 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
5
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
6
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
7
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
var _react2 = require("@testing-library/react");
|
|
12
|
+
var _mathRendering = require("@pie-lib/math-rendering");
|
|
13
|
+
var _InlineDropdown = _interopRequireDefault(require("../respArea/InlineDropdown"));
|
|
14
|
+
var _excluded = ["children"];
|
|
15
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
16
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
|
+
jest.mock('@pie-lib/math-rendering', function () {
|
|
18
|
+
return {
|
|
19
|
+
renderMath: jest.fn()
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
jest.mock('@tiptap/react', function () {
|
|
23
|
+
return {
|
|
24
|
+
NodeViewWrapper: function NodeViewWrapper(_ref) {
|
|
25
|
+
var children = _ref.children,
|
|
26
|
+
props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
27
|
+
return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
|
|
28
|
+
"data-testid": "node-view-wrapper"
|
|
29
|
+
}, props), children);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
var mockCreatePortal = jest.fn(function (node) {
|
|
34
|
+
return node;
|
|
35
|
+
});
|
|
36
|
+
jest.mock('react-dom', function () {
|
|
37
|
+
return _objectSpread(_objectSpread({}, jest.requireActual('react-dom')), {}, {
|
|
38
|
+
createPortal: function createPortal() {
|
|
39
|
+
return mockCreatePortal.apply(void 0, arguments);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('InlineDropdown', function () {
|
|
44
|
+
var buildMockEditor = function buildMockEditor() {
|
|
45
|
+
var overrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
46
|
+
var mockNodeAt = jest.fn(function (pos) {
|
|
47
|
+
return pos === 5 ? {
|
|
48
|
+
nodeSize: 1
|
|
49
|
+
} : null;
|
|
50
|
+
});
|
|
51
|
+
var mockDoc = {
|
|
52
|
+
descendants: jest.fn(),
|
|
53
|
+
nodeAt: mockNodeAt
|
|
54
|
+
};
|
|
55
|
+
var mockTr = {
|
|
56
|
+
"delete": jest.fn(),
|
|
57
|
+
doc: {
|
|
58
|
+
nodeAt: mockNodeAt
|
|
59
|
+
},
|
|
60
|
+
setSelection: jest.fn(),
|
|
61
|
+
setMeta: jest.fn(function setMeta() {
|
|
62
|
+
return mockTr;
|
|
63
|
+
})
|
|
64
|
+
};
|
|
65
|
+
return _objectSpread({
|
|
66
|
+
state: {
|
|
67
|
+
selection: {
|
|
68
|
+
from: 0,
|
|
69
|
+
to: 1
|
|
70
|
+
},
|
|
71
|
+
tr: mockTr,
|
|
72
|
+
doc: mockDoc
|
|
73
|
+
},
|
|
74
|
+
view: {
|
|
75
|
+
coordsAtPos: jest.fn(function () {
|
|
76
|
+
return {
|
|
77
|
+
top: 100,
|
|
78
|
+
left: 50
|
|
79
|
+
};
|
|
80
|
+
}),
|
|
81
|
+
dispatch: jest.fn()
|
|
82
|
+
},
|
|
83
|
+
commands: {
|
|
84
|
+
focus: jest.fn()
|
|
85
|
+
},
|
|
86
|
+
_tiptapContainerEl: document.createElement('div'),
|
|
87
|
+
_toolbarOpened: false
|
|
88
|
+
}, overrides);
|
|
89
|
+
};
|
|
90
|
+
var mockEditor;
|
|
91
|
+
var mockNode = {
|
|
92
|
+
attrs: {
|
|
93
|
+
index: '0',
|
|
94
|
+
value: 'Selected Option',
|
|
95
|
+
error: false
|
|
96
|
+
},
|
|
97
|
+
nodeSize: 1
|
|
98
|
+
};
|
|
99
|
+
var mockOptions = {
|
|
100
|
+
respAreaToolbar: jest.fn(function () {
|
|
101
|
+
return function () {
|
|
102
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
103
|
+
"data-testid": "inline-dropdown-toolbar"
|
|
104
|
+
}, "Toolbar");
|
|
105
|
+
};
|
|
106
|
+
})
|
|
107
|
+
};
|
|
108
|
+
var defaultProps = {
|
|
109
|
+
editor: mockEditor,
|
|
110
|
+
node: mockNode,
|
|
111
|
+
getPos: function getPos() {
|
|
112
|
+
return 5;
|
|
113
|
+
},
|
|
114
|
+
options: mockOptions,
|
|
115
|
+
selected: false
|
|
116
|
+
};
|
|
117
|
+
beforeEach(function () {
|
|
118
|
+
jest.clearAllMocks();
|
|
119
|
+
mockCreatePortal.mockClear();
|
|
120
|
+
mockEditor = buildMockEditor();
|
|
121
|
+
defaultProps.editor = mockEditor;
|
|
122
|
+
Object.defineProperty(document.body, 'getBoundingClientRect', {
|
|
123
|
+
value: jest.fn(function () {
|
|
124
|
+
return {
|
|
125
|
+
top: 0,
|
|
126
|
+
left: 0
|
|
127
|
+
};
|
|
128
|
+
}),
|
|
129
|
+
configurable: true
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
it('renders without crashing', function () {
|
|
133
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
134
|
+
container = _render.container;
|
|
135
|
+
expect(container).toBeInTheDocument();
|
|
136
|
+
});
|
|
137
|
+
it('renders NodeViewWrapper', function () {
|
|
138
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
139
|
+
getByTestId = _render2.getByTestId;
|
|
140
|
+
expect(getByTestId('node-view-wrapper')).toBeInTheDocument();
|
|
141
|
+
});
|
|
142
|
+
it('displays selected value', function () {
|
|
143
|
+
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
144
|
+
container = _render3.container;
|
|
145
|
+
var valueDiv = container.querySelector('div[style*="border"]');
|
|
146
|
+
expect(valueDiv).toBeInTheDocument();
|
|
147
|
+
});
|
|
148
|
+
it('renders math inside the value control on mount', function () {
|
|
149
|
+
var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
150
|
+
container = _render4.container;
|
|
151
|
+
var valueDiv = container.querySelector('div[style*="border"]');
|
|
152
|
+
expect(_mathRendering.renderMath).toHaveBeenCalledWith(valueDiv);
|
|
153
|
+
});
|
|
154
|
+
it('re-renders math when the value changes', function () {
|
|
155
|
+
var updatedNode = _objectSpread(_objectSpread({}, mockNode), {}, {
|
|
156
|
+
attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
|
|
157
|
+
value: '<span>Updated math</span>'
|
|
158
|
+
})
|
|
159
|
+
});
|
|
160
|
+
var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
161
|
+
container = _render5.container,
|
|
162
|
+
rerender = _render5.rerender;
|
|
163
|
+
_mathRendering.renderMath.mockClear();
|
|
164
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
165
|
+
node: updatedNode
|
|
166
|
+
})));
|
|
167
|
+
var valueDiv = container.querySelector('div[style*="border"]');
|
|
168
|
+
expect(_mathRendering.renderMath).toHaveBeenCalledWith(valueDiv);
|
|
169
|
+
});
|
|
170
|
+
it('uses 2px horizontal margin on the value control and no horizontal margin on the wrapper', function () {
|
|
171
|
+
var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
172
|
+
container = _render6.container,
|
|
173
|
+
getByTestId = _render6.getByTestId;
|
|
174
|
+
var valueDiv = container.querySelector('div[style*="border"]');
|
|
175
|
+
expect(valueDiv).toHaveStyle({
|
|
176
|
+
margin: '0 2px'
|
|
177
|
+
});
|
|
178
|
+
var wrapper = getByTestId('node-view-wrapper');
|
|
179
|
+
expect(wrapper.getAttribute('style') || '').not.toMatch(/margin/);
|
|
180
|
+
});
|
|
181
|
+
it('renders chevron icon', function () {
|
|
182
|
+
var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
183
|
+
container = _render7.container;
|
|
184
|
+
var chevron = container.querySelector('svg');
|
|
185
|
+
expect(chevron).toBeInTheDocument();
|
|
186
|
+
});
|
|
187
|
+
it('shows toolbar when selected and only this node is selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
188
|
+
var _render8, queryByTestId;
|
|
189
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
190
|
+
while (1) switch (_context.prev = _context.next) {
|
|
191
|
+
case 0:
|
|
192
|
+
_render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
193
|
+
selected: true
|
|
194
|
+
}))), queryByTestId = _render8.queryByTestId;
|
|
195
|
+
_context.next = 1;
|
|
196
|
+
return (0, _react2.waitFor)(function () {
|
|
197
|
+
// Toolbar is shown via portal
|
|
198
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
199
|
+
});
|
|
200
|
+
case 1:
|
|
201
|
+
case "end":
|
|
202
|
+
return _context.stop();
|
|
203
|
+
}
|
|
204
|
+
}, _callee);
|
|
205
|
+
})));
|
|
206
|
+
it('does not show toolbar when not selected', function () {
|
|
207
|
+
var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
208
|
+
selected: false
|
|
209
|
+
}))),
|
|
210
|
+
queryByTestId = _render9.queryByTestId;
|
|
211
|
+
expect(queryByTestId('inline-dropdown-toolbar')).not.toBeInTheDocument();
|
|
212
|
+
});
|
|
213
|
+
it('shows toolbar on click', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
214
|
+
var _render0, container, queryByTestId, dropdown;
|
|
215
|
+
return _regenerator["default"].wrap(function (_context2) {
|
|
216
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
217
|
+
case 0:
|
|
218
|
+
_render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)), container = _render0.container, queryByTestId = _render0.queryByTestId;
|
|
219
|
+
dropdown = container.querySelector('div[style*="border"]');
|
|
220
|
+
if (!dropdown) {
|
|
221
|
+
_context2.next = 2;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
_react2.fireEvent.click(dropdown);
|
|
225
|
+
_context2.next = 1;
|
|
226
|
+
return (0, _react2.waitFor)(function () {
|
|
227
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
228
|
+
});
|
|
229
|
+
case 1:
|
|
230
|
+
_context2.next = 3;
|
|
231
|
+
break;
|
|
232
|
+
case 2:
|
|
233
|
+
// If dropdown is not found, just verify the component rendered
|
|
234
|
+
expect(container).toBeInTheDocument();
|
|
235
|
+
case 3:
|
|
236
|
+
case "end":
|
|
237
|
+
return _context2.stop();
|
|
238
|
+
}
|
|
239
|
+
}, _callee2);
|
|
240
|
+
})));
|
|
241
|
+
it('has correct minimum dimensions', function () {
|
|
242
|
+
var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
243
|
+
container = _render1.container;
|
|
244
|
+
var wrapper = container.querySelector('[data-testid="node-view-wrapper"]');
|
|
245
|
+
expect(wrapper).toHaveStyle({
|
|
246
|
+
height: '50px'
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
it('has inline-flex display', function () {
|
|
250
|
+
var _render10 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
251
|
+
container = _render10.container;
|
|
252
|
+
var wrapper = container.querySelector('[data-testid="node-view-wrapper"]');
|
|
253
|
+
expect(wrapper).toHaveStyle({
|
|
254
|
+
display: 'inline-flex'
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
it('has cursor pointer style', function () {
|
|
258
|
+
var _render11 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
259
|
+
container = _render11.container;
|
|
260
|
+
var wrapper = container.querySelector('[data-testid="node-view-wrapper"]');
|
|
261
|
+
expect(wrapper).toHaveStyle({
|
|
262
|
+
cursor: 'pointer'
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
it('renders with empty value as nbsp', function () {
|
|
266
|
+
var emptyNode = _objectSpread(_objectSpread({}, mockNode), {}, {
|
|
267
|
+
attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
|
|
268
|
+
value: ''
|
|
269
|
+
})
|
|
270
|
+
});
|
|
271
|
+
var _render12 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
272
|
+
node: emptyNode
|
|
273
|
+
}))),
|
|
274
|
+
container = _render12.container;
|
|
275
|
+
expect(container).toBeInTheDocument();
|
|
276
|
+
});
|
|
277
|
+
it('calls respAreaToolbar with correct params', function () {
|
|
278
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps));
|
|
279
|
+
expect(mockOptions.respAreaToolbar).toHaveBeenCalledWith([mockNode, 5], mockEditor, expect.any(Function));
|
|
280
|
+
});
|
|
281
|
+
it('closes toolbar on outside click', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
282
|
+
var _render13, container, queryByTestId;
|
|
283
|
+
return _regenerator["default"].wrap(function (_context3) {
|
|
284
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
285
|
+
case 0:
|
|
286
|
+
_render13 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
287
|
+
selected: true
|
|
288
|
+
}))), container = _render13.container, queryByTestId = _render13.queryByTestId;
|
|
289
|
+
_context3.next = 1;
|
|
290
|
+
return (0, _react2.waitFor)(function () {
|
|
291
|
+
_react2.fireEvent.mouseDown(document.body);
|
|
292
|
+
});
|
|
293
|
+
case 1:
|
|
294
|
+
_context3.next = 2;
|
|
295
|
+
return (0, _react2.waitFor)(function () {
|
|
296
|
+
expect(queryByTestId('inline-dropdown-toolbar')).not.toBeInTheDocument();
|
|
297
|
+
});
|
|
298
|
+
case 2:
|
|
299
|
+
case "end":
|
|
300
|
+
return _context3.stop();
|
|
301
|
+
}
|
|
302
|
+
}, _callee3);
|
|
303
|
+
})));
|
|
304
|
+
it('calls close callback when toolbar closes on outside click', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
305
|
+
var onInlineDropdownToolbarClose, options, _render14, queryByTestId;
|
|
306
|
+
return _regenerator["default"].wrap(function (_context4) {
|
|
307
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
308
|
+
case 0:
|
|
309
|
+
onInlineDropdownToolbarClose = jest.fn();
|
|
310
|
+
options = _objectSpread(_objectSpread({}, mockOptions), {}, {
|
|
311
|
+
onInlineDropdownToolbarClose: onInlineDropdownToolbarClose
|
|
312
|
+
});
|
|
313
|
+
_render14 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
314
|
+
options: options,
|
|
315
|
+
selected: true
|
|
316
|
+
}))), queryByTestId = _render14.queryByTestId;
|
|
317
|
+
_context4.next = 1;
|
|
318
|
+
return (0, _react2.waitFor)(function () {
|
|
319
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
320
|
+
});
|
|
321
|
+
case 1:
|
|
322
|
+
_react2.fireEvent.mouseDown(document.body);
|
|
323
|
+
_context4.next = 2;
|
|
324
|
+
return (0, _react2.waitFor)(function () {
|
|
325
|
+
expect(queryByTestId('inline-dropdown-toolbar')).not.toBeInTheDocument();
|
|
326
|
+
});
|
|
327
|
+
case 2:
|
|
328
|
+
expect(onInlineDropdownToolbarClose).toHaveBeenCalledWith(mockEditor);
|
|
329
|
+
case 3:
|
|
330
|
+
case "end":
|
|
331
|
+
return _context4.stop();
|
|
332
|
+
}
|
|
333
|
+
}, _callee4);
|
|
334
|
+
})));
|
|
335
|
+
it('uses the current node when closing on outside click after the node prop changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
336
|
+
var onToolbarCloseRequest, options, updatedNode, _render15, queryByTestId, rerender;
|
|
337
|
+
return _regenerator["default"].wrap(function (_context5) {
|
|
338
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
339
|
+
case 0:
|
|
340
|
+
onToolbarCloseRequest = jest.fn(function (_tuple, _editor, onConfirm) {
|
|
341
|
+
return onConfirm();
|
|
342
|
+
});
|
|
343
|
+
options = _objectSpread(_objectSpread({}, mockOptions), {}, {
|
|
344
|
+
onToolbarCloseRequest: onToolbarCloseRequest
|
|
345
|
+
});
|
|
346
|
+
updatedNode = {
|
|
347
|
+
attrs: {
|
|
348
|
+
index: '1',
|
|
349
|
+
value: 'Updated Option',
|
|
350
|
+
error: false
|
|
351
|
+
},
|
|
352
|
+
nodeSize: 1
|
|
353
|
+
};
|
|
354
|
+
_render15 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
355
|
+
options: options,
|
|
356
|
+
selected: true
|
|
357
|
+
}))), queryByTestId = _render15.queryByTestId, rerender = _render15.rerender;
|
|
358
|
+
_context5.next = 1;
|
|
359
|
+
return (0, _react2.waitFor)(function () {
|
|
360
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
361
|
+
});
|
|
362
|
+
case 1:
|
|
363
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
364
|
+
options: options,
|
|
365
|
+
node: updatedNode,
|
|
366
|
+
selected: true
|
|
367
|
+
})));
|
|
368
|
+
_react2.fireEvent.mouseDown(document.body);
|
|
369
|
+
_context5.next = 2;
|
|
370
|
+
return (0, _react2.waitFor)(function () {
|
|
371
|
+
expect(onToolbarCloseRequest).toHaveBeenCalledWith([updatedNode, 5], expect.anything(), expect.any(Function), expect.any(Function));
|
|
372
|
+
});
|
|
373
|
+
case 2:
|
|
374
|
+
case "end":
|
|
375
|
+
return _context5.stop();
|
|
376
|
+
}
|
|
377
|
+
}, _callee5);
|
|
378
|
+
})));
|
|
379
|
+
it('respects hold state for the current node after the node prop changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
380
|
+
var updatedNode, _render16, queryByTestId, rerender;
|
|
381
|
+
return _regenerator["default"].wrap(function (_context6) {
|
|
382
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
383
|
+
case 0:
|
|
384
|
+
updatedNode = {
|
|
385
|
+
attrs: {
|
|
386
|
+
index: '1',
|
|
387
|
+
value: 'Updated Option',
|
|
388
|
+
error: false
|
|
389
|
+
},
|
|
390
|
+
nodeSize: 1
|
|
391
|
+
};
|
|
392
|
+
mockEditor._holdInlineDropdownToolbarIndex = '1';
|
|
393
|
+
_render16 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
394
|
+
selected: true
|
|
395
|
+
}))), queryByTestId = _render16.queryByTestId, rerender = _render16.rerender;
|
|
396
|
+
_context6.next = 1;
|
|
397
|
+
return (0, _react2.waitFor)(function () {
|
|
398
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
399
|
+
});
|
|
400
|
+
case 1:
|
|
401
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
402
|
+
node: updatedNode,
|
|
403
|
+
selected: true
|
|
404
|
+
})));
|
|
405
|
+
_react2.fireEvent.mouseDown(document.body);
|
|
406
|
+
_context6.next = 2;
|
|
407
|
+
return (0, _react2.waitFor)(function () {
|
|
408
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
409
|
+
});
|
|
410
|
+
case 2:
|
|
411
|
+
case "end":
|
|
412
|
+
return _context6.stop();
|
|
413
|
+
}
|
|
414
|
+
}, _callee6);
|
|
415
|
+
})));
|
|
416
|
+
it('rebinds the outside-click listener when the node prop changes while the toolbar is open', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
417
|
+
var addSpy, removeSpy, updatedNode, _render17, rerender, removeCallsBeforeRerender;
|
|
418
|
+
return _regenerator["default"].wrap(function (_context7) {
|
|
419
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
420
|
+
case 0:
|
|
421
|
+
addSpy = jest.spyOn(document, 'addEventListener');
|
|
422
|
+
removeSpy = jest.spyOn(document, 'removeEventListener');
|
|
423
|
+
updatedNode = _objectSpread(_objectSpread({}, mockNode), {}, {
|
|
424
|
+
attrs: _objectSpread(_objectSpread({}, mockNode.attrs), {}, {
|
|
425
|
+
value: 'Updated Option'
|
|
426
|
+
})
|
|
427
|
+
});
|
|
428
|
+
_render17 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
429
|
+
selected: true
|
|
430
|
+
}))), rerender = _render17.rerender;
|
|
431
|
+
_context7.next = 1;
|
|
432
|
+
return (0, _react2.waitFor)(function () {
|
|
433
|
+
expect(addSpy).toHaveBeenCalledWith('mousedown', expect.any(Function));
|
|
434
|
+
});
|
|
435
|
+
case 1:
|
|
436
|
+
removeCallsBeforeRerender = removeSpy.mock.calls.filter(function (_ref9) {
|
|
437
|
+
var _ref0 = (0, _slicedToArray2["default"])(_ref9, 1),
|
|
438
|
+
type = _ref0[0];
|
|
439
|
+
return type === 'mousedown';
|
|
440
|
+
}).length;
|
|
441
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
442
|
+
node: updatedNode,
|
|
443
|
+
selected: true
|
|
444
|
+
})));
|
|
445
|
+
_context7.next = 2;
|
|
446
|
+
return (0, _react2.waitFor)(function () {
|
|
447
|
+
var removeCallsAfterRerender = removeSpy.mock.calls.filter(function (_ref1) {
|
|
448
|
+
var _ref10 = (0, _slicedToArray2["default"])(_ref1, 1),
|
|
449
|
+
type = _ref10[0];
|
|
450
|
+
return type === 'mousedown';
|
|
451
|
+
}).length;
|
|
452
|
+
expect(removeCallsAfterRerender).toBeGreaterThan(removeCallsBeforeRerender);
|
|
453
|
+
expect(addSpy).toHaveBeenCalledWith('mousedown', expect.any(Function));
|
|
454
|
+
});
|
|
455
|
+
case 2:
|
|
456
|
+
addSpy.mockRestore();
|
|
457
|
+
removeSpy.mockRestore();
|
|
458
|
+
case 3:
|
|
459
|
+
case "end":
|
|
460
|
+
return _context7.stop();
|
|
461
|
+
}
|
|
462
|
+
}, _callee7);
|
|
463
|
+
})));
|
|
464
|
+
it('has correct border styling', function () {
|
|
465
|
+
var _render18 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
466
|
+
container = _render18.container;
|
|
467
|
+
var dropdownDiv = container.querySelector('div[style*="border"]');
|
|
468
|
+
expect(dropdownDiv).toHaveStyle({
|
|
469
|
+
border: '1px solid #C0C3CF'
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
it('has correct min width', function () {
|
|
473
|
+
var _render19 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
474
|
+
container = _render19.container;
|
|
475
|
+
var dropdownDiv = container.querySelector('div[style*="border"]');
|
|
476
|
+
expect(dropdownDiv).toHaveStyle({
|
|
477
|
+
minWidth: '178px'
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
it('positions chevron correctly', function () {
|
|
481
|
+
var _render20 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
482
|
+
container = _render20.container;
|
|
483
|
+
var chevron = container.querySelector('svg');
|
|
484
|
+
// Chevron styling is applied inline, just verify it rendered
|
|
485
|
+
if (chevron) {
|
|
486
|
+
expect(chevron).toBeInTheDocument();
|
|
487
|
+
} else {
|
|
488
|
+
expect(container).toBeInTheDocument();
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
it('has ellipsis for overflow text', function () {
|
|
492
|
+
var _render21 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], defaultProps)),
|
|
493
|
+
container = _render21.container;
|
|
494
|
+
var textContainer = container.querySelector('div[style*="overflow"]');
|
|
495
|
+
expect(textContainer).toHaveStyle({
|
|
496
|
+
textOverflow: 'ellipsis',
|
|
497
|
+
whiteSpace: 'nowrap'
|
|
498
|
+
});
|
|
499
|
+
});
|
|
500
|
+
it('portals toolbar into editor container when _tiptapContainerEl is set', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
|
|
501
|
+
var containerEl, editor;
|
|
502
|
+
return _regenerator["default"].wrap(function (_context8) {
|
|
503
|
+
while (1) switch (_context8.prev = _context8.next) {
|
|
504
|
+
case 0:
|
|
505
|
+
containerEl = document.createElement('div');
|
|
506
|
+
editor = buildMockEditor({
|
|
507
|
+
_tiptapContainerEl: containerEl
|
|
508
|
+
});
|
|
509
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
510
|
+
editor: editor,
|
|
511
|
+
selected: true
|
|
512
|
+
})));
|
|
513
|
+
_context8.next = 1;
|
|
514
|
+
return (0, _react2.waitFor)(function () {
|
|
515
|
+
expect(mockCreatePortal).toHaveBeenCalled();
|
|
516
|
+
});
|
|
517
|
+
case 1:
|
|
518
|
+
expect(mockCreatePortal.mock.calls[0][1]).toBe(containerEl);
|
|
519
|
+
case 2:
|
|
520
|
+
case "end":
|
|
521
|
+
return _context8.stop();
|
|
522
|
+
}
|
|
523
|
+
}, _callee8);
|
|
524
|
+
})));
|
|
525
|
+
it('portals toolbar into document.body when _tiptapContainerEl is missing', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
526
|
+
var editor;
|
|
527
|
+
return _regenerator["default"].wrap(function (_context9) {
|
|
528
|
+
while (1) switch (_context9.prev = _context9.next) {
|
|
529
|
+
case 0:
|
|
530
|
+
editor = buildMockEditor({
|
|
531
|
+
_tiptapContainerEl: undefined
|
|
532
|
+
});
|
|
533
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
534
|
+
editor: editor,
|
|
535
|
+
selected: true
|
|
536
|
+
})));
|
|
537
|
+
_context9.next = 1;
|
|
538
|
+
return (0, _react2.waitFor)(function () {
|
|
539
|
+
expect(mockCreatePortal).toHaveBeenCalled();
|
|
540
|
+
});
|
|
541
|
+
case 1:
|
|
542
|
+
expect(mockCreatePortal.mock.calls[0][1]).toBe(document.body);
|
|
543
|
+
case 2:
|
|
544
|
+
case "end":
|
|
545
|
+
return _context9.stop();
|
|
546
|
+
}
|
|
547
|
+
}, _callee9);
|
|
548
|
+
})));
|
|
549
|
+
it('passes editorCallback to InlineDropdownToolbar', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
|
|
550
|
+
var mockToolbarComponent, mockOptionsWithCallback, _render22, queryByTestId;
|
|
551
|
+
return _regenerator["default"].wrap(function (_context0) {
|
|
552
|
+
while (1) switch (_context0.prev = _context0.next) {
|
|
553
|
+
case 0:
|
|
554
|
+
mockToolbarComponent = jest.fn(function (_ref14) {
|
|
555
|
+
var editorCallback = _ref14.editorCallback;
|
|
556
|
+
editorCallback === null || editorCallback === void 0 || editorCallback({
|
|
557
|
+
instanceId: 'test-instance'
|
|
558
|
+
});
|
|
559
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
560
|
+
"data-testid": "inline-dropdown-toolbar"
|
|
561
|
+
}, "Toolbar");
|
|
562
|
+
});
|
|
563
|
+
mockOptionsWithCallback = {
|
|
564
|
+
respAreaToolbar: jest.fn(function () {
|
|
565
|
+
return mockToolbarComponent;
|
|
566
|
+
})
|
|
567
|
+
};
|
|
568
|
+
_render22 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
569
|
+
options: mockOptionsWithCallback,
|
|
570
|
+
selected: true
|
|
571
|
+
}))), queryByTestId = _render22.queryByTestId;
|
|
572
|
+
_context0.next = 1;
|
|
573
|
+
return (0, _react2.waitFor)(function () {
|
|
574
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
575
|
+
});
|
|
576
|
+
case 1:
|
|
577
|
+
case "end":
|
|
578
|
+
return _context0.stop();
|
|
579
|
+
}
|
|
580
|
+
}, _callee0);
|
|
581
|
+
})));
|
|
582
|
+
it('stores toolbar editor instance in ref when editorCallback is called', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
|
|
583
|
+
var capturedCallback, mockToolbarComponent, mockOptionsWithCallback, _render23, queryByTestId;
|
|
584
|
+
return _regenerator["default"].wrap(function (_context1) {
|
|
585
|
+
while (1) switch (_context1.prev = _context1.next) {
|
|
586
|
+
case 0:
|
|
587
|
+
mockToolbarComponent = function mockToolbarComponent(_ref16) {
|
|
588
|
+
var editorCallback = _ref16.editorCallback;
|
|
589
|
+
capturedCallback = editorCallback;
|
|
590
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
591
|
+
"data-testid": "inline-dropdown-toolbar"
|
|
592
|
+
}, "Toolbar");
|
|
593
|
+
};
|
|
594
|
+
mockOptionsWithCallback = {
|
|
595
|
+
respAreaToolbar: jest.fn(function () {
|
|
596
|
+
return mockToolbarComponent;
|
|
597
|
+
})
|
|
598
|
+
};
|
|
599
|
+
_render23 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
600
|
+
options: mockOptionsWithCallback,
|
|
601
|
+
selected: true
|
|
602
|
+
}))), queryByTestId = _render23.queryByTestId;
|
|
603
|
+
_context1.next = 1;
|
|
604
|
+
return (0, _react2.waitFor)(function () {
|
|
605
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
606
|
+
});
|
|
607
|
+
case 1:
|
|
608
|
+
// Verify callback exists
|
|
609
|
+
expect(capturedCallback).toBeDefined();
|
|
610
|
+
case 2:
|
|
611
|
+
case "end":
|
|
612
|
+
return _context1.stop();
|
|
613
|
+
}
|
|
614
|
+
}, _callee1);
|
|
615
|
+
})));
|
|
616
|
+
it('handles click outside logic with data-toolbar-for attribute', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
|
|
617
|
+
var editorWithInstanceId, capturedCallback, mockToolbarComponent, mockOptionsWithCallback, _render24, container, queryByTestId, otherToolbar;
|
|
618
|
+
return _regenerator["default"].wrap(function (_context10) {
|
|
619
|
+
while (1) switch (_context10.prev = _context10.next) {
|
|
620
|
+
case 0:
|
|
621
|
+
editorWithInstanceId = _objectSpread(_objectSpread({}, mockEditor), {}, {
|
|
622
|
+
instanceId: 'editor-123',
|
|
623
|
+
_toolbarOpened: false
|
|
624
|
+
}); // Mock the toolbar callback to set the toolbar editor instance
|
|
625
|
+
mockToolbarComponent = function mockToolbarComponent(_ref18) {
|
|
626
|
+
var editorCallback = _ref18.editorCallback;
|
|
627
|
+
_react["default"].useEffect(function () {
|
|
628
|
+
capturedCallback = editorCallback;
|
|
629
|
+
if (editorCallback) {
|
|
630
|
+
editorCallback({
|
|
631
|
+
instanceId: 'editor-123'
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
}, [editorCallback]);
|
|
635
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
636
|
+
"data-testid": "inline-dropdown-toolbar"
|
|
637
|
+
}, "Toolbar");
|
|
638
|
+
};
|
|
639
|
+
mockOptionsWithCallback = {
|
|
640
|
+
respAreaToolbar: jest.fn(function () {
|
|
641
|
+
return mockToolbarComponent;
|
|
642
|
+
})
|
|
643
|
+
};
|
|
644
|
+
_render24 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
645
|
+
editor: editorWithInstanceId,
|
|
646
|
+
options: mockOptionsWithCallback,
|
|
647
|
+
selected: true
|
|
648
|
+
}))), container = _render24.container, queryByTestId = _render24.queryByTestId;
|
|
649
|
+
_context10.next = 1;
|
|
650
|
+
return (0, _react2.waitFor)(function () {
|
|
651
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
652
|
+
});
|
|
653
|
+
case 1:
|
|
654
|
+
// Create an element with data-toolbar-for attribute
|
|
655
|
+
otherToolbar = document.createElement('div');
|
|
656
|
+
otherToolbar.setAttribute('data-toolbar-for', 'editor-456');
|
|
657
|
+
document.body.appendChild(otherToolbar);
|
|
658
|
+
_context10.next = 2;
|
|
659
|
+
return (0, _react2.waitFor)(function () {
|
|
660
|
+
_react2.fireEvent.mouseDown(otherToolbar);
|
|
661
|
+
});
|
|
662
|
+
case 2:
|
|
663
|
+
// Cleanup
|
|
664
|
+
document.body.removeChild(otherToolbar);
|
|
665
|
+
expect(container).toBeInTheDocument();
|
|
666
|
+
case 3:
|
|
667
|
+
case "end":
|
|
668
|
+
return _context10.stop();
|
|
669
|
+
}
|
|
670
|
+
}, _callee10);
|
|
671
|
+
})));
|
|
672
|
+
it('does not close when clicking inside same editor toolbar', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11() {
|
|
673
|
+
var editorWithInstanceId, toolbarEditorInstance, mockToolbarComponent, mockOptionsWithCallback;
|
|
674
|
+
return _regenerator["default"].wrap(function (_context11) {
|
|
675
|
+
while (1) switch (_context11.prev = _context11.next) {
|
|
676
|
+
case 0:
|
|
677
|
+
editorWithInstanceId = _objectSpread(_objectSpread({}, mockEditor), {}, {
|
|
678
|
+
instanceId: 'editor-123',
|
|
679
|
+
_toolbarOpened: false
|
|
680
|
+
});
|
|
681
|
+
mockToolbarComponent = function mockToolbarComponent(_ref20) {
|
|
682
|
+
var editorCallback = _ref20.editorCallback;
|
|
683
|
+
_react["default"].useEffect(function () {
|
|
684
|
+
if (editorCallback) {
|
|
685
|
+
editorCallback({
|
|
686
|
+
instanceId: 'editor-123'
|
|
687
|
+
});
|
|
688
|
+
toolbarEditorInstance = {
|
|
689
|
+
instanceId: 'editor-123'
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
}, [editorCallback]);
|
|
693
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
694
|
+
"data-testid": "inline-dropdown-toolbar"
|
|
695
|
+
}, "Toolbar");
|
|
696
|
+
};
|
|
697
|
+
mockOptionsWithCallback = {
|
|
698
|
+
respAreaToolbar: jest.fn(function () {
|
|
699
|
+
return mockToolbarComponent;
|
|
700
|
+
})
|
|
701
|
+
};
|
|
702
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
703
|
+
editor: editorWithInstanceId,
|
|
704
|
+
options: mockOptionsWithCallback,
|
|
705
|
+
selected: true
|
|
706
|
+
})));
|
|
707
|
+
_context11.next = 1;
|
|
708
|
+
return (0, _react2.waitFor)(function () {
|
|
709
|
+
expect(mockOptionsWithCallback.respAreaToolbar).toHaveBeenCalled();
|
|
710
|
+
});
|
|
711
|
+
case 1:
|
|
712
|
+
case "end":
|
|
713
|
+
return _context11.stop();
|
|
714
|
+
}
|
|
715
|
+
}, _callee11);
|
|
716
|
+
})));
|
|
717
|
+
it('checks editor._toolbarOpened in click outside handler', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee12() {
|
|
718
|
+
var editorWithToolbarOpened, _render25, queryByTestId;
|
|
719
|
+
return _regenerator["default"].wrap(function (_context12) {
|
|
720
|
+
while (1) switch (_context12.prev = _context12.next) {
|
|
721
|
+
case 0:
|
|
722
|
+
editorWithToolbarOpened = buildMockEditor({
|
|
723
|
+
_toolbarOpened: true
|
|
724
|
+
});
|
|
725
|
+
_render25 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
726
|
+
editor: editorWithToolbarOpened,
|
|
727
|
+
selected: true
|
|
728
|
+
}))), queryByTestId = _render25.queryByTestId;
|
|
729
|
+
_context12.next = 1;
|
|
730
|
+
return (0, _react2.waitFor)(function () {
|
|
731
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
732
|
+
});
|
|
733
|
+
case 1:
|
|
734
|
+
// When _toolbarOpened is true, clicking outside should not close
|
|
735
|
+
_react2.fireEvent.mouseDown(document.body);
|
|
736
|
+
|
|
737
|
+
// Toolbar should still be visible
|
|
738
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
739
|
+
case 2:
|
|
740
|
+
case "end":
|
|
741
|
+
return _context12.stop();
|
|
742
|
+
}
|
|
743
|
+
}, _callee12);
|
|
744
|
+
})));
|
|
745
|
+
it('does not close toolbar when clicking the page scrollbar (documentElement)', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee13() {
|
|
746
|
+
var _render26, queryByTestId;
|
|
747
|
+
return _regenerator["default"].wrap(function (_context13) {
|
|
748
|
+
while (1) switch (_context13.prev = _context13.next) {
|
|
749
|
+
case 0:
|
|
750
|
+
_render26 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
751
|
+
selected: true
|
|
752
|
+
}))), queryByTestId = _render26.queryByTestId;
|
|
753
|
+
_context13.next = 1;
|
|
754
|
+
return (0, _react2.waitFor)(function () {
|
|
755
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
756
|
+
});
|
|
757
|
+
case 1:
|
|
758
|
+
_react2.fireEvent.mouseDown(document.documentElement);
|
|
759
|
+
_context13.next = 2;
|
|
760
|
+
return (0, _react2.waitFor)(function () {
|
|
761
|
+
expect(queryByTestId('inline-dropdown-toolbar')).toBeInTheDocument();
|
|
762
|
+
});
|
|
763
|
+
case 2:
|
|
764
|
+
case "end":
|
|
765
|
+
return _context13.stop();
|
|
766
|
+
}
|
|
767
|
+
}, _callee13);
|
|
768
|
+
})));
|
|
769
|
+
it('renders delete control on portaled custom toolbar when container el is set', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee14() {
|
|
770
|
+
var _render27, findByLabelText, _t;
|
|
771
|
+
return _regenerator["default"].wrap(function (_context14) {
|
|
772
|
+
while (1) switch (_context14.prev = _context14.next) {
|
|
773
|
+
case 0:
|
|
774
|
+
_render27 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
775
|
+
selected: true
|
|
776
|
+
}))), findByLabelText = _render27.findByLabelText;
|
|
777
|
+
_t = expect;
|
|
778
|
+
_context14.next = 1;
|
|
779
|
+
return findByLabelText('Delete');
|
|
780
|
+
case 1:
|
|
781
|
+
_t(_context14.sent).toBeInTheDocument();
|
|
782
|
+
case 2:
|
|
783
|
+
case "end":
|
|
784
|
+
return _context14.stop();
|
|
785
|
+
}
|
|
786
|
+
}, _callee14);
|
|
787
|
+
})));
|
|
788
|
+
it('does not render portaled delete control when _tiptapContainerEl is missing', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee15() {
|
|
789
|
+
var editor, _render28, queryByLabelText, findByTestId, _t2;
|
|
790
|
+
return _regenerator["default"].wrap(function (_context15) {
|
|
791
|
+
while (1) switch (_context15.prev = _context15.next) {
|
|
792
|
+
case 0:
|
|
793
|
+
editor = buildMockEditor({
|
|
794
|
+
_tiptapContainerEl: undefined
|
|
795
|
+
});
|
|
796
|
+
_render28 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
797
|
+
editor: editor,
|
|
798
|
+
selected: true
|
|
799
|
+
}))), queryByLabelText = _render28.queryByLabelText, findByTestId = _render28.findByTestId;
|
|
800
|
+
_t2 = expect;
|
|
801
|
+
_context15.next = 1;
|
|
802
|
+
return findByTestId('inline-dropdown-toolbar');
|
|
803
|
+
case 1:
|
|
804
|
+
_t2(_context15.sent).toBeInTheDocument();
|
|
805
|
+
expect(queryByLabelText('Delete')).not.toBeInTheDocument();
|
|
806
|
+
case 2:
|
|
807
|
+
case "end":
|
|
808
|
+
return _context15.stop();
|
|
809
|
+
}
|
|
810
|
+
}, _callee15);
|
|
811
|
+
})));
|
|
812
|
+
it('delete clears toolbar flag, removes node range, dispatches, and focuses', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee16() {
|
|
813
|
+
var _render29, findByLabelText, _t3;
|
|
814
|
+
return _regenerator["default"].wrap(function (_context16) {
|
|
815
|
+
while (1) switch (_context16.prev = _context16.next) {
|
|
816
|
+
case 0:
|
|
817
|
+
mockEditor._toolbarOpened = true;
|
|
818
|
+
_render29 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_InlineDropdown["default"], (0, _extends2["default"])({}, defaultProps, {
|
|
819
|
+
selected: true
|
|
820
|
+
}))), findByLabelText = _render29.findByLabelText;
|
|
821
|
+
_t3 = _react2.fireEvent;
|
|
822
|
+
_context16.next = 1;
|
|
823
|
+
return findByLabelText('Delete');
|
|
824
|
+
case 1:
|
|
825
|
+
_t3.mouseDown.call(_t3, _context16.sent);
|
|
826
|
+
expect(mockEditor.state.tr["delete"]).toHaveBeenCalledWith(5, 6);
|
|
827
|
+
expect(mockEditor.view.dispatch).toHaveBeenCalledTimes(2);
|
|
828
|
+
expect(mockEditor.view.dispatch).toHaveBeenNthCalledWith(1, mockEditor.state.tr);
|
|
829
|
+
expect(mockEditor.view.dispatch).toHaveBeenNthCalledWith(2, mockEditor.state.tr);
|
|
830
|
+
expect(mockEditor._toolbarOpened).toBe(false);
|
|
831
|
+
expect(mockEditor.commands.focus).toHaveBeenCalled();
|
|
832
|
+
case 2:
|
|
833
|
+
case "end":
|
|
834
|
+
return _context16.stop();
|
|
835
|
+
}
|
|
836
|
+
}, _callee16);
|
|
837
|
+
})));
|
|
838
|
+
});
|
|
839
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfbWF0aFJlbmRlcmluZyIsIl9JbmxpbmVEcm9wZG93biIsIl9leGNsdWRlZCIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiamVzdCIsIm1vY2siLCJyZW5kZXJNYXRoIiwiZm4iLCJOb2RlVmlld1dyYXBwZXIiLCJfcmVmIiwiY2hpbGRyZW4iLCJwcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJjcmVhdGVFbGVtZW50IiwiX2V4dGVuZHMyIiwibW9ja0NyZWF0ZVBvcnRhbCIsIm5vZGUiLCJyZXF1aXJlQWN0dWFsIiwiY3JlYXRlUG9ydGFsIiwiZGVzY3JpYmUiLCJidWlsZE1vY2tFZGl0b3IiLCJvdmVycmlkZXMiLCJ1bmRlZmluZWQiLCJtb2NrTm9kZUF0IiwicG9zIiwibm9kZVNpemUiLCJtb2NrRG9jIiwiZGVzY2VuZGFudHMiLCJub2RlQXQiLCJtb2NrVHIiLCJkb2MiLCJzZXRTZWxlY3Rpb24iLCJzZXRNZXRhIiwic3RhdGUiLCJzZWxlY3Rpb24iLCJmcm9tIiwidG8iLCJ0ciIsInZpZXciLCJjb29yZHNBdFBvcyIsInRvcCIsImxlZnQiLCJkaXNwYXRjaCIsImNvbW1hbmRzIiwiZm9jdXMiLCJfdGlwdGFwQ29udGFpbmVyRWwiLCJkb2N1bWVudCIsIl90b29sYmFyT3BlbmVkIiwibW9ja0VkaXRvciIsIm1vY2tOb2RlIiwiYXR0cnMiLCJpbmRleCIsInZhbHVlIiwiZXJyb3IiLCJtb2NrT3B0aW9ucyIsInJlc3BBcmVhVG9vbGJhciIsImRlZmF1bHRQcm9wcyIsImVkaXRvciIsImdldFBvcyIsIm9wdGlvbnMiLCJzZWxlY3RlZCIsImJlZm9yZUVhY2giLCJjbGVhckFsbE1vY2tzIiwibW9ja0NsZWFyIiwiYm9keSIsImNvbmZpZ3VyYWJsZSIsIml0IiwiX3JlbmRlciIsInJlbmRlciIsImNvbnRhaW5lciIsImV4cGVjdCIsInRvQmVJblRoZURvY3VtZW50IiwiX3JlbmRlcjIiLCJnZXRCeVRlc3RJZCIsIl9yZW5kZXIzIiwidmFsdWVEaXYiLCJxdWVyeVNlbGVjdG9yIiwiX3JlbmRlcjQiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInVwZGF0ZWROb2RlIiwiX3JlbmRlcjUiLCJyZXJlbmRlciIsIl9yZW5kZXI2IiwidG9IYXZlU3R5bGUiLCJtYXJnaW4iLCJ3cmFwcGVyIiwiZ2V0QXR0cmlidXRlIiwibm90IiwidG9NYXRjaCIsIl9yZW5kZXI3IiwiY2hldnJvbiIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlbmRlcjgiLCJxdWVyeUJ5VGVzdElkIiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJ3YWl0Rm9yIiwic3RvcCIsIl9yZW5kZXI5IiwiX2NhbGxlZTIiLCJfcmVuZGVyMCIsImRyb3Bkb3duIiwiX2NvbnRleHQyIiwiZmlyZUV2ZW50IiwiY2xpY2siLCJfcmVuZGVyMSIsImhlaWdodCIsIl9yZW5kZXIxMCIsImRpc3BsYXkiLCJfcmVuZGVyMTEiLCJjdXJzb3IiLCJlbXB0eU5vZGUiLCJfcmVuZGVyMTIiLCJhbnkiLCJGdW5jdGlvbiIsIl9jYWxsZWUzIiwiX3JlbmRlcjEzIiwiX2NvbnRleHQzIiwibW91c2VEb3duIiwiX2NhbGxlZTQiLCJvbklubGluZURyb3Bkb3duVG9vbGJhckNsb3NlIiwiX3JlbmRlcjE0IiwiX2NvbnRleHQ0IiwiX2NhbGxlZTUiLCJvblRvb2xiYXJDbG9zZVJlcXVlc3QiLCJfcmVuZGVyMTUiLCJfY29udGV4dDUiLCJfdHVwbGUiLCJfZWRpdG9yIiwib25Db25maXJtIiwiYW55dGhpbmciLCJfY2FsbGVlNiIsIl9yZW5kZXIxNiIsIl9jb250ZXh0NiIsIl9ob2xkSW5saW5lRHJvcGRvd25Ub29sYmFySW5kZXgiLCJfY2FsbGVlNyIsImFkZFNweSIsInJlbW92ZVNweSIsIl9yZW5kZXIxNyIsInJlbW92ZUNhbGxzQmVmb3JlUmVyZW5kZXIiLCJfY29udGV4dDciLCJzcHlPbiIsImNhbGxzIiwiX3JlZjkiLCJfcmVmMCIsIl9zbGljZWRUb0FycmF5MiIsInR5cGUiLCJyZW1vdmVDYWxsc0FmdGVyUmVyZW5kZXIiLCJfcmVmMSIsIl9yZWYxMCIsInRvQmVHcmVhdGVyVGhhbiIsIm1vY2tSZXN0b3JlIiwiX3JlbmRlcjE4IiwiZHJvcGRvd25EaXYiLCJib3JkZXIiLCJfcmVuZGVyMTkiLCJtaW5XaWR0aCIsIl9yZW5kZXIyMCIsIl9yZW5kZXIyMSIsInRleHRDb250YWluZXIiLCJ0ZXh0T3ZlcmZsb3ciLCJ3aGl0ZVNwYWNlIiwiX2NhbGxlZTgiLCJjb250YWluZXJFbCIsIl9jb250ZXh0OCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJ0b0JlIiwiX2NhbGxlZTkiLCJfY29udGV4dDkiLCJfY2FsbGVlMCIsIm1vY2tUb29sYmFyQ29tcG9uZW50IiwibW9ja09wdGlvbnNXaXRoQ2FsbGJhY2siLCJfcmVuZGVyMjIiLCJfY29udGV4dDAiLCJfcmVmMTQiLCJlZGl0b3JDYWxsYmFjayIsImluc3RhbmNlSWQiLCJfY2FsbGVlMSIsImNhcHR1cmVkQ2FsbGJhY2siLCJfcmVuZGVyMjMiLCJfY29udGV4dDEiLCJfcmVmMTYiLCJ0b0JlRGVmaW5lZCIsIl9jYWxsZWUxMCIsImVkaXRvcldpdGhJbnN0YW5jZUlkIiwiX3JlbmRlcjI0Iiwib3RoZXJUb29sYmFyIiwiX2NvbnRleHQxMCIsIl9yZWYxOCIsIlJlYWN0IiwidXNlRWZmZWN0Iiwic2V0QXR0cmlidXRlIiwiYXBwZW5kQ2hpbGQiLCJyZW1vdmVDaGlsZCIsIl9jYWxsZWUxMSIsInRvb2xiYXJFZGl0b3JJbnN0YW5jZSIsIl9jb250ZXh0MTEiLCJfcmVmMjAiLCJfY2FsbGVlMTIiLCJlZGl0b3JXaXRoVG9vbGJhck9wZW5lZCIsIl9yZW5kZXIyNSIsIl9jb250ZXh0MTIiLCJfY2FsbGVlMTMiLCJfcmVuZGVyMjYiLCJfY29udGV4dDEzIiwiZG9jdW1lbnRFbGVtZW50IiwiX2NhbGxlZTE0IiwiX3JlbmRlcjI3IiwiZmluZEJ5TGFiZWxUZXh0IiwiX3QiLCJfY29udGV4dDE0Iiwic2VudCIsIl9jYWxsZWUxNSIsIl9yZW5kZXIyOCIsInF1ZXJ5QnlMYWJlbFRleHQiLCJmaW5kQnlUZXN0SWQiLCJfdDIiLCJfY29udGV4dDE1IiwiX2NhbGxlZTE2IiwiX3JlbmRlcjI5IiwiX3QzIiwiX2NvbnRleHQxNiIsImNhbGwiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJ0b0hhdmVCZWVuTnRoQ2FsbGVkV2l0aCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL19fdGVzdHNfXy9JbmxpbmVEcm9wZG93bi50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmlyZUV2ZW50LCByZW5kZXIsIHdhaXRGb3IgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCB7IHJlbmRlck1hdGggfSBmcm9tICdAcGllLWxpYi9tYXRoLXJlbmRlcmluZyc7XG5pbXBvcnQgSW5saW5lRHJvcGRvd24gZnJvbSAnLi4vcmVzcEFyZWEvSW5saW5lRHJvcGRvd24nO1xuXG5qZXN0Lm1vY2soJ0BwaWUtbGliL21hdGgtcmVuZGVyaW5nJywgKCkgPT4gKHtcbiAgcmVuZGVyTWF0aDogamVzdC5mbigpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cIm5vZGUtdmlldy13cmFwcGVyXCIgey4uLnByb3BzfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKSxcbn0pKTtcblxuY29uc3QgbW9ja0NyZWF0ZVBvcnRhbCA9IGplc3QuZm4oKG5vZGUpID0+IG5vZGUpO1xuXG5qZXN0Lm1vY2soJ3JlYWN0LWRvbScsICgpID0+ICh7XG4gIC4uLmplc3QucmVxdWlyZUFjdHVhbCgncmVhY3QtZG9tJyksXG4gIGNyZWF0ZVBvcnRhbDogKC4uLmFyZ3MpID0+IG1vY2tDcmVhdGVQb3J0YWwoLi4uYXJncyksXG59KSk7XG5cbmRlc2NyaWJlKCdJbmxpbmVEcm9wZG93bicsICgpID0+IHtcbiAgY29uc3QgYnVpbGRNb2NrRWRpdG9yID0gKG92ZXJyaWRlcyA9IHt9KSA9PiB7XG4gICAgY29uc3QgbW9ja05vZGVBdCA9IGplc3QuZm4oKHBvcykgPT4gKHBvcyA9PT0gNSA/IHsgbm9kZVNpemU6IDEgfSA6IG51bGwpKTtcbiAgICBjb25zdCBtb2NrRG9jID0ge1xuICAgICAgZGVzY2VuZGFudHM6IGplc3QuZm4oKSxcbiAgICAgIG5vZGVBdDogbW9ja05vZGVBdCxcbiAgICB9O1xuICAgIGNvbnN0IG1vY2tUciA9IHtcbiAgICAgIGRlbGV0ZTogamVzdC5mbigpLFxuICAgICAgZG9jOiB7IG5vZGVBdDogbW9ja05vZGVBdCB9LFxuICAgICAgc2V0U2VsZWN0aW9uOiBqZXN0LmZuKCksXG4gICAgICBzZXRNZXRhOiBqZXN0LmZuKGZ1bmN0aW9uIHNldE1ldGEoKSB7XG4gICAgICAgIHJldHVybiBtb2NrVHI7XG4gICAgICB9KSxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgIHRvOiAxLFxuICAgICAgICB9LFxuICAgICAgICB0cjogbW9ja1RyLFxuICAgICAgICBkb2M6IG1vY2tEb2MsXG4gICAgICB9LFxuICAgICAgdmlldzoge1xuICAgICAgICBjb29yZHNBdFBvczogamVzdC5mbigoKSA9PiAoeyB0b3A6IDEwMCwgbGVmdDogNTAgfSkpLFxuICAgICAgICBkaXNwYXRjaDogamVzdC5mbigpLFxuICAgICAgfSxcbiAgICAgIGNvbW1hbmRzOiB7XG4gICAgICAgIGZvY3VzOiBqZXN0LmZuKCksXG4gICAgICB9LFxuICAgICAgX3RpcHRhcENvbnRhaW5lckVsOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxcbiAgICAgIF90b29sYmFyT3BlbmVkOiBmYWxzZSxcbiAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICB9O1xuICB9O1xuXG4gIGxldCBtb2NrRWRpdG9yO1xuXG4gIGNvbnN0IG1vY2tOb2RlID0ge1xuICAgIGF0dHJzOiB7XG4gICAgICBpbmRleDogJzAnLFxuICAgICAgdmFsdWU6ICdTZWxlY3RlZCBPcHRpb24nLFxuICAgICAgZXJyb3I6IGZhbHNlLFxuICAgIH0sXG4gICAgbm9kZVNpemU6IDEsXG4gIH07XG5cbiAgY29uc3QgbW9ja09wdGlvbnMgPSB7XG4gICAgcmVzcEFyZWFUb29sYmFyOiBqZXN0LmZuKCgpID0+ICgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJpbmxpbmUtZHJvcGRvd24tdG9vbGJhclwiPlRvb2xiYXI8L2Rpdj4pLFxuICB9O1xuXG4gIGNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgICBlZGl0b3I6IG1vY2tFZGl0b3IsXG4gICAgbm9kZTogbW9ja05vZGUsXG4gICAgZ2V0UG9zOiAoKSA9PiA1LFxuICAgIG9wdGlvbnM6IG1vY2tPcHRpb25zLFxuICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgfTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICBtb2NrQ3JlYXRlUG9ydGFsLm1vY2tDbGVhcigpO1xuICAgIG1vY2tFZGl0b3IgPSBidWlsZE1vY2tFZGl0b3IoKTtcbiAgICBkZWZhdWx0UHJvcHMuZWRpdG9yID0gbW9ja0VkaXRvcjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQuYm9keSwgJ2dldEJvdW5kaW5nQ2xpZW50UmVjdCcsIHtcbiAgICAgIHZhbHVlOiBqZXN0LmZuKCgpID0+ICh7IHRvcDogMCwgbGVmdDogMCB9KSksXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIHdpdGhvdXQgY3Jhc2hpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIE5vZGVWaWV3V3JhcHBlcicsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ25vZGUtdmlldy13cmFwcGVyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkaXNwbGF5cyBzZWxlY3RlZCB2YWx1ZScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgdmFsdWVEaXYgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlclwiXScpO1xuICAgIGV4cGVjdCh2YWx1ZURpdikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgbWF0aCBpbnNpZGUgdGhlIHZhbHVlIGNvbnRyb2wgb24gbW91bnQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGNvbnN0IHZhbHVlRGl2ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2RpdltzdHlsZSo9XCJib3JkZXJcIl0nKTtcblxuICAgIGV4cGVjdChyZW5kZXJNYXRoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh2YWx1ZURpdik7XG4gIH0pO1xuXG4gIGl0KCdyZS1yZW5kZXJzIG1hdGggd2hlbiB0aGUgdmFsdWUgY2hhbmdlcycsICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkTm9kZSA9IHtcbiAgICAgIC4uLm1vY2tOb2RlLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgLi4ubW9ja05vZGUuYXR0cnMsXG4gICAgICAgIHZhbHVlOiAnPHNwYW4+VXBkYXRlZCBtYXRoPC9zcGFuPicsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCB7IGNvbnRhaW5lciwgcmVyZW5kZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuXG4gICAgcmVuZGVyTWF0aC5tb2NrQ2xlYXIoKTtcblxuICAgIHJlcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBub2RlPXt1cGRhdGVkTm9kZX0gLz4pO1xuXG4gICAgY29uc3QgdmFsdWVEaXYgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlclwiXScpO1xuICAgIGV4cGVjdChyZW5kZXJNYXRoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh2YWx1ZURpdik7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIDJweCBob3Jpem9udGFsIG1hcmdpbiBvbiB0aGUgdmFsdWUgY29udHJvbCBhbmQgbm8gaG9yaXpvbnRhbCBtYXJnaW4gb24gdGhlIHdyYXBwZXInLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIsIGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCB2YWx1ZURpdiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdkaXZbc3R5bGUqPVwiYm9yZGVyXCJdJyk7XG4gICAgZXhwZWN0KHZhbHVlRGl2KS50b0hhdmVTdHlsZSh7IG1hcmdpbjogJzAgMnB4JyB9KTtcbiAgICBjb25zdCB3cmFwcGVyID0gZ2V0QnlUZXN0SWQoJ25vZGUtdmlldy13cmFwcGVyJyk7XG4gICAgZXhwZWN0KHdyYXBwZXIuZ2V0QXR0cmlidXRlKCdzdHlsZScpIHx8ICcnKS5ub3QudG9NYXRjaCgvbWFyZ2luLyk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGNoZXZyb24gaWNvbicsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgY2hldnJvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICBleHBlY3QoY2hldnJvbikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3dzIHRvb2xiYXIgd2hlbiBzZWxlY3RlZCBhbmQgb25seSB0aGlzIG5vZGUgaXMgc2VsZWN0ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAvLyBUb29sYmFyIGlzIHNob3duIHZpYSBwb3J0YWxcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdpbmxpbmUtZHJvcGRvd24tdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3Qgc2hvdyB0b29sYmFyIHdoZW4gbm90IHNlbGVjdGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17ZmFsc2V9IC8+KTtcbiAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdzaG93cyB0b29sYmFyIG9uIGNsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyLCBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCBkcm9wZG93biA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdkaXZbc3R5bGUqPVwiYm9yZGVyXCJdJyk7XG4gICAgaWYgKGRyb3Bkb3duKSB7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZHJvcGRvd24pO1xuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdpbmxpbmUtZHJvcGRvd24tdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIGRyb3Bkb3duIGlzIG5vdCBmb3VuZCwganVzdCB2ZXJpZnkgdGhlIGNvbXBvbmVudCByZW5kZXJlZFxuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdoYXMgY29ycmVjdCBtaW5pbXVtIGRpbWVuc2lvbnMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGNvbnN0IHdyYXBwZXIgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignW2RhdGEtdGVzdGlkPVwibm9kZS12aWV3LXdyYXBwZXJcIl0nKTtcbiAgICBleHBlY3Qod3JhcHBlcikudG9IYXZlU3R5bGUoeyBoZWlnaHQ6ICc1MHB4JyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBpbmxpbmUtZmxleCBkaXNwbGF5JywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCB3cmFwcGVyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRlc3RpZD1cIm5vZGUtdmlldy13cmFwcGVyXCJdJyk7XG4gICAgZXhwZWN0KHdyYXBwZXIpLnRvSGF2ZVN0eWxlKHsgZGlzcGxheTogJ2lubGluZS1mbGV4JyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBjdXJzb3IgcG9pbnRlciBzdHlsZScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3Qgd3JhcHBlciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10ZXN0aWQ9XCJub2RlLXZpZXctd3JhcHBlclwiXScpO1xuICAgIGV4cGVjdCh3cmFwcGVyKS50b0hhdmVTdHlsZSh7IGN1cnNvcjogJ3BvaW50ZXInIH0pO1xuICB9KTtcblxuICBpdCgncmVuZGVycyB3aXRoIGVtcHR5IHZhbHVlIGFzIG5ic3AnLCAoKSA9PiB7XG4gICAgY29uc3QgZW1wdHlOb2RlID0geyAuLi5tb2NrTm9kZSwgYXR0cnM6IHsgLi4ubW9ja05vZGUuYXR0cnMsIHZhbHVlOiAnJyB9IH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gbm9kZT17ZW1wdHlOb2RlfSAvPik7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ2NhbGxzIHJlc3BBcmVhVG9vbGJhciB3aXRoIGNvcnJlY3QgcGFyYW1zJywgKCkgPT4ge1xuICAgIHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChtb2NrT3B0aW9ucy5yZXNwQXJlYVRvb2xiYXIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFttb2NrTm9kZSwgNV0sIG1vY2tFZGl0b3IsIGV4cGVjdC5hbnkoRnVuY3Rpb24pKTtcbiAgfSk7XG5cbiAgaXQoJ2Nsb3NlcyB0b29sYmFyIG9uIG91dHNpZGUgY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIsIHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGZpcmVFdmVudC5tb3VzZURvd24oZG9jdW1lbnQuYm9keSk7XG4gICAgfSk7XG4gICAgLy8gQWZ0ZXIgY2xpY2tpbmcgb3V0c2lkZSwgdG9vbGJhciBzaG91bGQgYmUgaGlkZGVuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBjbG9zZSBjYWxsYmFjayB3aGVuIHRvb2xiYXIgY2xvc2VzIG9uIG91dHNpZGUgY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb25JbmxpbmVEcm9wZG93blRvb2xiYXJDbG9zZSA9IGplc3QuZm4oKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgLi4ubW9ja09wdGlvbnMsXG4gICAgICBvbklubGluZURyb3Bkb3duVG9vbGJhckNsb3NlLFxuICAgIH07XG5cbiAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gb3B0aW9ucz17b3B0aW9uc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBmaXJlRXZlbnQubW91c2VEb3duKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBleHBlY3Qob25JbmxpbmVEcm9wZG93blRvb2xiYXJDbG9zZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgobW9ja0VkaXRvcik7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIHRoZSBjdXJyZW50IG5vZGUgd2hlbiBjbG9zaW5nIG9uIG91dHNpZGUgY2xpY2sgYWZ0ZXIgdGhlIG5vZGUgcHJvcCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9uVG9vbGJhckNsb3NlUmVxdWVzdCA9IGplc3QuZm4oKF90dXBsZSwgX2VkaXRvciwgb25Db25maXJtKSA9PiBvbkNvbmZpcm0oKSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm1vY2tPcHRpb25zLFxuICAgICAgb25Ub29sYmFyQ2xvc2VSZXF1ZXN0LFxuICAgIH07XG4gICAgY29uc3QgdXBkYXRlZE5vZGUgPSB7XG4gICAgICBhdHRyczogeyBpbmRleDogJzEnLCB2YWx1ZTogJ1VwZGF0ZWQgT3B0aW9uJywgZXJyb3I6IGZhbHNlIH0sXG4gICAgICBub2RlU2l6ZTogMSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkLCByZXJlbmRlciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBvcHRpb25zPXtvcHRpb25zfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIHJlcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBvcHRpb25zPXtvcHRpb25zfSBub2RlPXt1cGRhdGVkTm9kZX0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGZpcmVFdmVudC5tb3VzZURvd24oZG9jdW1lbnQuYm9keSk7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChvblRvb2xiYXJDbG9zZVJlcXVlc3QpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBbdXBkYXRlZE5vZGUsIDVdLFxuICAgICAgICBleHBlY3QuYW55dGhpbmcoKSxcbiAgICAgICAgZXhwZWN0LmFueShGdW5jdGlvbiksXG4gICAgICAgIGV4cGVjdC5hbnkoRnVuY3Rpb24pLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Jlc3BlY3RzIGhvbGQgc3RhdGUgZm9yIHRoZSBjdXJyZW50IG5vZGUgYWZ0ZXIgdGhlIG5vZGUgcHJvcCBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWROb2RlID0ge1xuICAgICAgYXR0cnM6IHsgaW5kZXg6ICcxJywgdmFsdWU6ICdVcGRhdGVkIE9wdGlvbicsIGVycm9yOiBmYWxzZSB9LFxuICAgICAgbm9kZVNpemU6IDEsXG4gICAgfTtcblxuICAgIG1vY2tFZGl0b3IuX2hvbGRJbmxpbmVEcm9wZG93blRvb2xiYXJJbmRleCA9ICcxJztcblxuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCwgcmVyZW5kZXIgfSA9IHJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICByZXJlbmRlcig8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gbm9kZT17dXBkYXRlZE5vZGV9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG5cbiAgICBmaXJlRXZlbnQubW91c2VEb3duKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3JlYmluZHMgdGhlIG91dHNpZGUtY2xpY2sgbGlzdGVuZXIgd2hlbiB0aGUgbm9kZSBwcm9wIGNoYW5nZXMgd2hpbGUgdGhlIHRvb2xiYXIgaXMgb3BlbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBhZGRTcHkgPSBqZXN0LnNweU9uKGRvY3VtZW50LCAnYWRkRXZlbnRMaXN0ZW5lcicpO1xuICAgIGNvbnN0IHJlbW92ZVNweSA9IGplc3Quc3B5T24oZG9jdW1lbnQsICdyZW1vdmVFdmVudExpc3RlbmVyJyk7XG4gICAgY29uc3QgdXBkYXRlZE5vZGUgPSB7IC4uLm1vY2tOb2RlLCBhdHRyczogeyAuLi5tb2NrTm9kZS5hdHRycywgdmFsdWU6ICdVcGRhdGVkIE9wdGlvbicgfSB9O1xuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QoYWRkU3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnbW91c2Vkb3duJywgZXhwZWN0LmFueShGdW5jdGlvbikpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVtb3ZlQ2FsbHNCZWZvcmVSZXJlbmRlciA9IHJlbW92ZVNweS5tb2NrLmNhbGxzLmZpbHRlcigoW3R5cGVdKSA9PiB0eXBlID09PSAnbW91c2Vkb3duJykubGVuZ3RoO1xuXG4gICAgcmVyZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IG5vZGU9e3VwZGF0ZWROb2RlfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVDYWxsc0FmdGVyUmVyZW5kZXIgPSByZW1vdmVTcHkubW9jay5jYWxscy5maWx0ZXIoKFt0eXBlXSkgPT4gdHlwZSA9PT0gJ21vdXNlZG93bicpLmxlbmd0aDtcbiAgICAgIGV4cGVjdChyZW1vdmVDYWxsc0FmdGVyUmVyZW5kZXIpLnRvQmVHcmVhdGVyVGhhbihyZW1vdmVDYWxsc0JlZm9yZVJlcmVuZGVyKTtcbiAgICAgIGV4cGVjdChhZGRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdtb3VzZWRvd24nLCBleHBlY3QuYW55KEZ1bmN0aW9uKSk7XG4gICAgfSk7XG5cbiAgICBhZGRTcHkubW9ja1Jlc3RvcmUoKTtcbiAgICByZW1vdmVTcHkubW9ja1Jlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBjb3JyZWN0IGJvcmRlciBzdHlsaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBjb25zdCBkcm9wZG93bkRpdiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdkaXZbc3R5bGUqPVwiYm9yZGVyXCJdJyk7XG4gICAgZXhwZWN0KGRyb3Bkb3duRGl2KS50b0hhdmVTdHlsZSh7IGJvcmRlcjogJzFweCBzb2xpZCAjQzBDM0NGJyB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhcyBjb3JyZWN0IG1pbiB3aWR0aCcsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgZHJvcGRvd25EaXYgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlclwiXScpO1xuICAgIGV4cGVjdChkcm9wZG93bkRpdikudG9IYXZlU3R5bGUoeyBtaW5XaWR0aDogJzE3OHB4JyB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Bvc2l0aW9ucyBjaGV2cm9uIGNvcnJlY3RseScsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgY2hldnJvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICAvLyBDaGV2cm9uIHN0eWxpbmcgaXMgYXBwbGllZCBpbmxpbmUsIGp1c3QgdmVyaWZ5IGl0IHJlbmRlcmVkXG4gICAgaWYgKGNoZXZyb24pIHtcbiAgICAgIGV4cGVjdChjaGV2cm9uKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBlY3QoY29udGFpbmVyKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ2hhcyBlbGxpcHNpcyBmb3Igb3ZlcmZsb3cgdGV4dCcsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3QgdGV4dENvbnRhaW5lciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdkaXZbc3R5bGUqPVwib3ZlcmZsb3dcIl0nKTtcbiAgICBleHBlY3QodGV4dENvbnRhaW5lcikudG9IYXZlU3R5bGUoeyB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcycsIHdoaXRlU3BhY2U6ICdub3dyYXAnIH0pO1xuICB9KTtcblxuICBpdCgncG9ydGFscyB0b29sYmFyIGludG8gZWRpdG9yIGNvbnRhaW5lciB3aGVuIF90aXB0YXBDb250YWluZXJFbCBpcyBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBlZGl0b3IgPSBidWlsZE1vY2tFZGl0b3IoeyBfdGlwdGFwQ29udGFpbmVyRWw6IGNvbnRhaW5lckVsIH0pO1xuXG4gICAgcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KG1vY2tDcmVhdGVQb3J0YWwpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGV4cGVjdChtb2NrQ3JlYXRlUG9ydGFsLm1vY2suY2FsbHNbMF1bMV0pLnRvQmUoY29udGFpbmVyRWwpO1xuICB9KTtcblxuICBpdCgncG9ydGFscyB0b29sYmFyIGludG8gZG9jdW1lbnQuYm9keSB3aGVuIF90aXB0YXBDb250YWluZXJFbCBpcyBtaXNzaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvciA9IGJ1aWxkTW9ja0VkaXRvcih7IF90aXB0YXBDb250YWluZXJFbDogdW5kZWZpbmVkIH0pO1xuXG4gICAgcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KG1vY2tDcmVhdGVQb3J0YWwpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGV4cGVjdChtb2NrQ3JlYXRlUG9ydGFsLm1vY2suY2FsbHNbMF1bMV0pLnRvQmUoZG9jdW1lbnQuYm9keSk7XG4gIH0pO1xuXG4gIGl0KCdwYXNzZXMgZWRpdG9yQ2FsbGJhY2sgdG8gSW5saW5lRHJvcGRvd25Ub29sYmFyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tUb29sYmFyQ29tcG9uZW50ID0gamVzdC5mbigoeyBlZGl0b3JDYWxsYmFjayB9KSA9PiB7XG4gICAgICBlZGl0b3JDYWxsYmFjaz8uKHsgaW5zdGFuY2VJZDogJ3Rlc3QtaW5zdGFuY2UnIH0pO1xuICAgICAgcmV0dXJuIDxkaXYgZGF0YS10ZXN0aWQ9XCJpbmxpbmUtZHJvcGRvd24tdG9vbGJhclwiPlRvb2xiYXI8L2Rpdj47XG4gICAgfSk7XG5cbiAgICBjb25zdCBtb2NrT3B0aW9uc1dpdGhDYWxsYmFjayA9IHtcbiAgICAgIHJlc3BBcmVhVG9vbGJhcjogamVzdC5mbigoKSA9PiBtb2NrVG9vbGJhckNvbXBvbmVudCksXG4gICAgfTtcblxuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKFxuICAgICAgPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IG9wdGlvbnM9e21vY2tPcHRpb25zV2l0aENhbGxiYWNrfSBzZWxlY3RlZD17dHJ1ZX0gLz4sXG4gICAgKTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzdG9yZXMgdG9vbGJhciBlZGl0b3IgaW5zdGFuY2UgaW4gcmVmIHdoZW4gZWRpdG9yQ2FsbGJhY2sgaXMgY2FsbGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBjYXB0dXJlZENhbGxiYWNrO1xuICAgIGNvbnN0IG1vY2tUb29sYmFyQ29tcG9uZW50ID0gKHsgZWRpdG9yQ2FsbGJhY2sgfSkgPT4ge1xuICAgICAgY2FwdHVyZWRDYWxsYmFjayA9IGVkaXRvckNhbGxiYWNrO1xuICAgICAgcmV0dXJuIDxkaXYgZGF0YS10ZXN0aWQ9XCJpbmxpbmUtZHJvcGRvd24tdG9vbGJhclwiPlRvb2xiYXI8L2Rpdj47XG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tPcHRpb25zV2l0aENhbGxiYWNrID0ge1xuICAgICAgcmVzcEFyZWFUb29sYmFyOiBqZXN0LmZuKCgpID0+IG1vY2tUb29sYmFyQ29tcG9uZW50KSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoXG4gICAgICA8SW5saW5lRHJvcGRvd24gey4uLmRlZmF1bHRQcm9wc30gb3B0aW9ucz17bW9ja09wdGlvbnNXaXRoQ2FsbGJhY2t9IHNlbGVjdGVkPXt0cnVlfSAvPixcbiAgICApO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIC8vIFZlcmlmeSBjYWxsYmFjayBleGlzdHNcbiAgICBleHBlY3QoY2FwdHVyZWRDYWxsYmFjaykudG9CZURlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ2hhbmRsZXMgY2xpY2sgb3V0c2lkZSBsb2dpYyB3aXRoIGRhdGEtdG9vbGJhci1mb3IgYXR0cmlidXRlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvcldpdGhJbnN0YW5jZUlkID0ge1xuICAgICAgLi4ubW9ja0VkaXRvcixcbiAgICAgIGluc3RhbmNlSWQ6ICdlZGl0b3ItMTIzJyxcbiAgICAgIF90b29sYmFyT3BlbmVkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gTW9jayB0aGUgdG9vbGJhciBjYWxsYmFjayB0byBzZXQgdGhlIHRvb2xiYXIgZWRpdG9yIGluc3RhbmNlXG4gICAgbGV0IGNhcHR1cmVkQ2FsbGJhY2s7XG4gICAgY29uc3QgbW9ja1Rvb2xiYXJDb21wb25lbnQgPSAoeyBlZGl0b3JDYWxsYmFjayB9KSA9PiB7XG4gICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjYXB0dXJlZENhbGxiYWNrID0gZWRpdG9yQ2FsbGJhY2s7XG4gICAgICAgIGlmIChlZGl0b3JDYWxsYmFjaykge1xuICAgICAgICAgIGVkaXRvckNhbGxiYWNrKHsgaW5zdGFuY2VJZDogJ2VkaXRvci0xMjMnIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBbZWRpdG9yQ2FsbGJhY2tdKTtcbiAgICAgIHJldHVybiA8ZGl2IGRhdGEtdGVzdGlkPVwiaW5saW5lLWRyb3Bkb3duLXRvb2xiYXJcIj5Ub29sYmFyPC9kaXY+O1xuICAgIH07XG5cbiAgICBjb25zdCBtb2NrT3B0aW9uc1dpdGhDYWxsYmFjayA9IHtcbiAgICAgIHJlc3BBcmVhVG9vbGJhcjogamVzdC5mbigoKSA9PiBtb2NrVG9vbGJhckNvbXBvbmVudCksXG4gICAgfTtcblxuICAgIGNvbnN0IHsgY29udGFpbmVyLCBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoXG4gICAgICA8SW5saW5lRHJvcGRvd25cbiAgICAgICAgey4uLmRlZmF1bHRQcm9wc31cbiAgICAgICAgZWRpdG9yPXtlZGl0b3JXaXRoSW5zdGFuY2VJZH1cbiAgICAgICAgb3B0aW9ucz17bW9ja09wdGlvbnNXaXRoQ2FsbGJhY2t9XG4gICAgICAgIHNlbGVjdGVkPXt0cnVlfVxuICAgICAgLz4sXG4gICAgKTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYW4gZWxlbWVudCB3aXRoIGRhdGEtdG9vbGJhci1mb3IgYXR0cmlidXRlXG4gICAgY29uc3Qgb3RoZXJUb29sYmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgb3RoZXJUb29sYmFyLnNldEF0dHJpYnV0ZSgnZGF0YS10b29sYmFyLWZvcicsICdlZGl0b3ItNDU2Jyk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdGhlclRvb2xiYXIpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBmaXJlRXZlbnQubW91c2VEb3duKG90aGVyVG9vbGJhcik7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChvdGhlclRvb2xiYXIpO1xuICAgIGV4cGVjdChjb250YWluZXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBjbG9zZSB3aGVuIGNsaWNraW5nIGluc2lkZSBzYW1lIGVkaXRvciB0b29sYmFyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvcldpdGhJbnN0YW5jZUlkID0ge1xuICAgICAgLi4ubW9ja0VkaXRvcixcbiAgICAgIGluc3RhbmNlSWQ6ICdlZGl0b3ItMTIzJyxcbiAgICAgIF90b29sYmFyT3BlbmVkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgbGV0IHRvb2xiYXJFZGl0b3JJbnN0YW5jZTtcbiAgICBjb25zdCBtb2NrVG9vbGJhckNvbXBvbmVudCA9ICh7IGVkaXRvckNhbGxiYWNrIH0pID0+IHtcbiAgICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChlZGl0b3JDYWxsYmFjaykge1xuICAgICAgICAgIGVkaXRvckNhbGxiYWNrKHsgaW5zdGFuY2VJZDogJ2VkaXRvci0xMjMnIH0pO1xuICAgICAgICAgIHRvb2xiYXJFZGl0b3JJbnN0YW5jZSA9IHsgaW5zdGFuY2VJZDogJ2VkaXRvci0xMjMnIH07XG4gICAgICAgIH1cbiAgICAgIH0sIFtlZGl0b3JDYWxsYmFja10pO1xuICAgICAgcmV0dXJuIDxkaXYgZGF0YS10ZXN0aWQ9XCJpbmxpbmUtZHJvcGRvd24tdG9vbGJhclwiPlRvb2xiYXI8L2Rpdj47XG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tPcHRpb25zV2l0aENhbGxiYWNrID0ge1xuICAgICAgcmVzcEFyZWFUb29sYmFyOiBqZXN0LmZuKCgpID0+IG1vY2tUb29sYmFyQ29tcG9uZW50KSxcbiAgICB9O1xuXG4gICAgcmVuZGVyKFxuICAgICAgPElubGluZURyb3Bkb3duXG4gICAgICAgIHsuLi5kZWZhdWx0UHJvcHN9XG4gICAgICAgIGVkaXRvcj17ZWRpdG9yV2l0aEluc3RhbmNlSWR9XG4gICAgICAgIG9wdGlvbnM9e21vY2tPcHRpb25zV2l0aENhbGxiYWNrfVxuICAgICAgICBzZWxlY3RlZD17dHJ1ZX1cbiAgICAgIC8+LFxuICAgICk7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChtb2NrT3B0aW9uc1dpdGhDYWxsYmFjay5yZXNwQXJlYVRvb2xiYXIpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2NoZWNrcyBlZGl0b3IuX3Rvb2xiYXJPcGVuZWQgaW4gY2xpY2sgb3V0c2lkZSBoYW5kbGVyJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRvcldpdGhUb29sYmFyT3BlbmVkID0gYnVpbGRNb2NrRWRpdG9yKHsgX3Rvb2xiYXJPcGVuZWQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCB7IHF1ZXJ5QnlUZXN0SWQgfSA9IHJlbmRlcihcbiAgICAgIDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcldpdGhUb29sYmFyT3BlbmVkfSBzZWxlY3RlZD17dHJ1ZX0gLz4sXG4gICAgKTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICAvLyBXaGVuIF90b29sYmFyT3BlbmVkIGlzIHRydWUsIGNsaWNraW5nIG91dHNpZGUgc2hvdWxkIG5vdCBjbG9zZVxuICAgIGZpcmVFdmVudC5tb3VzZURvd24oZG9jdW1lbnQuYm9keSk7XG5cbiAgICAvLyBUb29sYmFyIHNob3VsZCBzdGlsbCBiZSB2aXNpYmxlXG4gICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBjbG9zZSB0b29sYmFyIHdoZW4gY2xpY2tpbmcgdGhlIHBhZ2Ugc2Nyb2xsYmFyIChkb2N1bWVudEVsZW1lbnQpJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnaW5saW5lLWRyb3Bkb3duLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGZpcmVFdmVudC5tb3VzZURvd24oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGRlbGV0ZSBjb250cm9sIG9uIHBvcnRhbGVkIGN1c3RvbSB0b29sYmFyIHdoZW4gY29udGFpbmVyIGVsIGlzIHNldCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGZpbmRCeUxhYmVsVGV4dCB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZCAvPik7XG4gICAgZXhwZWN0KGF3YWl0IGZpbmRCeUxhYmVsVGV4dCgnRGVsZXRlJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCByZW5kZXIgcG9ydGFsZWQgZGVsZXRlIGNvbnRyb2wgd2hlbiBfdGlwdGFwQ29udGFpbmVyRWwgaXMgbWlzc2luZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBidWlsZE1vY2tFZGl0b3IoeyBfdGlwdGFwQ29udGFpbmVyRWw6IHVuZGVmaW5lZCB9KTtcbiAgICBjb25zdCB7IHF1ZXJ5QnlMYWJlbFRleHQsIGZpbmRCeVRlc3RJZCB9ID0gcmVuZGVyKDxJbmxpbmVEcm9wZG93biB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQgLz4pO1xuICAgIGV4cGVjdChhd2FpdCBmaW5kQnlUZXN0SWQoJ2lubGluZS1kcm9wZG93bi10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgZXhwZWN0KHF1ZXJ5QnlMYWJlbFRleHQoJ0RlbGV0ZScpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ2RlbGV0ZSBjbGVhcnMgdG9vbGJhciBmbGFnLCByZW1vdmVzIG5vZGUgcmFuZ2UsIGRpc3BhdGNoZXMsIGFuZCBmb2N1c2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tFZGl0b3IuX3Rvb2xiYXJPcGVuZWQgPSB0cnVlO1xuICAgIGNvbnN0IHsgZmluZEJ5TGFiZWxUZXh0IH0gPSByZW5kZXIoPElubGluZURyb3Bkb3duIHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkIC8+KTtcbiAgICBmaXJlRXZlbnQubW91c2VEb3duKGF3YWl0IGZpbmRCeUxhYmVsVGV4dCgnRGVsZXRlJykpO1xuICAgIGV4cGVjdChtb2NrRWRpdG9yLnN0YXRlLnRyLmRlbGV0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoNSwgNik7XG4gICAgZXhwZWN0KG1vY2tFZGl0b3Iudmlldy5kaXNwYXRjaCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpO1xuICAgIGV4cGVjdChtb2NrRWRpdG9yLnZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5OdGhDYWxsZWRXaXRoKDEsIG1vY2tFZGl0b3Iuc3RhdGUudHIpO1xuICAgIGV4cGVjdChtb2NrRWRpdG9yLnZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5OdGhDYWxsZWRXaXRoKDIsIG1vY2tFZGl0b3Iuc3RhdGUudHIpO1xuICAgIGV4cGVjdChtb2NrRWRpdG9yLl90b29sYmFyT3BlbmVkKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3QobW9ja0VkaXRvci5jb21tYW5kcy5mb2N1cykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxjQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxlQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFBd0QsSUFBQUksU0FBQTtBQUFBLFNBQUFDLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEs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
|