@pie-lib/math-input-mathlive 1.0.12 → 1.0.13
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__/composites.test.js +255 -0
- package/lib/__tests__/drop-in-compat.test.js +133 -0
- package/lib/__tests__/index.test.js +118 -0
- package/lib/__tests__/input-imperative.test.js +155 -0
- package/lib/__tests__/keypad-label.test.js +216 -0
- package/lib/__tests__/keypad-render.test.js +206 -0
- package/lib/__tests__/latex-bridge.test.js +301 -0
- package/lib/__tests__/mathlive-instance.test.js +415 -0
- package/lib/__tests__/mount-race.test.js +198 -0
- package/lib/__tests__/static-prompts.test.js +405 -0
- package/lib/__tests__/tmp-markup.test.js +26 -0
- package/lib/keypad/index.js +4 -4
- package/lib/keypad/index.js.map +1 -1
- package/lib/mathlive-instance.js +6 -1
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/common-styles.js +41 -6
- package/lib/mf/common-styles.js.map +1 -1
- package/lib/mf/index.js +6 -0
- package/lib/mf/index.js.map +1 -1
- package/lib/mf/static.js +2 -2
- package/lib/mf/static.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/keypad-label.test.jsx +73 -0
- package/src/__tests__/mathlive-instance.test.js +22 -0
- package/src/keypad/index.jsx +4 -1
- package/src/mathlive-instance.js +6 -1
- package/src/mf/common-styles.js +45 -4
- package/src/mf/index.js +2 -0
- package/src/mf/static.jsx +4 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
6
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
7
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _react2 = require("@testing-library/react");
|
|
10
|
+
var _keypad = _interopRequireWildcard(require("../keypad"));
|
|
11
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
12
|
+
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; }
|
|
13
|
+
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; }
|
|
14
|
+
/**
|
|
15
|
+
* Keypad behaviour that is new in this package: labels are static markup from
|
|
16
|
+
* convertLatexToMarkup (the MathQuill version created a live StaticMath per
|
|
17
|
+
* button), with a raw-latex fallback when the engine is unavailable.
|
|
18
|
+
*/
|
|
19
|
+
describe('LatexLabel', function () {
|
|
20
|
+
it('falls back to raw latex when MathLive is unavailable', function () {
|
|
21
|
+
// jsdom cannot load MathLive, so latexToMarkup returns '' - the button must
|
|
22
|
+
// still show something rather than render blank.
|
|
23
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
|
|
24
|
+
latex: '\\pi'
|
|
25
|
+
})),
|
|
26
|
+
container = _render.container;
|
|
27
|
+
expect(container.textContent).toContain('\\pi');
|
|
28
|
+
});
|
|
29
|
+
it('re-renders when the latex prop changes', function () {
|
|
30
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
|
|
31
|
+
latex: '\\pi'
|
|
32
|
+
})),
|
|
33
|
+
container = _render2.container,
|
|
34
|
+
rerender = _render2.rerender;
|
|
35
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_keypad.LatexLabel, {
|
|
36
|
+
latex: '\\theta'
|
|
37
|
+
}));
|
|
38
|
+
expect(container.textContent).toContain('\\theta');
|
|
39
|
+
});
|
|
40
|
+
it('does not warn more than once about a missing engine', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
41
|
+
var a, b;
|
|
42
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
43
|
+
while (1) switch (_context.prev = _context.next) {
|
|
44
|
+
case 0:
|
|
45
|
+
_keypad.LatexLabel.warned = false;
|
|
46
|
+
a = new _keypad.LatexLabel({
|
|
47
|
+
latex: '\\pi'
|
|
48
|
+
});
|
|
49
|
+
b = new _keypad.LatexLabel({
|
|
50
|
+
latex: '\\theta'
|
|
51
|
+
});
|
|
52
|
+
a.state = {
|
|
53
|
+
markup: ''
|
|
54
|
+
};
|
|
55
|
+
b.state = {
|
|
56
|
+
markup: ''
|
|
57
|
+
};
|
|
58
|
+
a.setState = function () {};
|
|
59
|
+
b.setState = function () {};
|
|
60
|
+
_context.next = 1;
|
|
61
|
+
return a.componentDidMount();
|
|
62
|
+
case 1:
|
|
63
|
+
_context.next = 2;
|
|
64
|
+
return b.componentDidMount();
|
|
65
|
+
case 2:
|
|
66
|
+
expect(_keypad.LatexLabel.warned).toBe(true);
|
|
67
|
+
case 3:
|
|
68
|
+
case "end":
|
|
69
|
+
return _context.stop();
|
|
70
|
+
}
|
|
71
|
+
}, _callee);
|
|
72
|
+
})));
|
|
73
|
+
});
|
|
74
|
+
describe('KeyPad', function () {
|
|
75
|
+
var key = function key() {
|
|
76
|
+
var over = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
77
|
+
return _objectSpread({
|
|
78
|
+
name: 'x',
|
|
79
|
+
label: 'x',
|
|
80
|
+
write: 'x',
|
|
81
|
+
category: 'vars'
|
|
82
|
+
}, over);
|
|
83
|
+
};
|
|
84
|
+
it('renders a button per key', function () {
|
|
85
|
+
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
|
|
86
|
+
onPress: function onPress() {},
|
|
87
|
+
baseSet: [[key(), key({
|
|
88
|
+
name: 'y',
|
|
89
|
+
label: 'y'
|
|
90
|
+
})]]
|
|
91
|
+
})),
|
|
92
|
+
container = _render3.container;
|
|
93
|
+
expect(container.querySelectorAll('button').length).toBe(2);
|
|
94
|
+
});
|
|
95
|
+
it('calls onPress with the whole key definition', function () {
|
|
96
|
+
var onPress = jest.fn();
|
|
97
|
+
var k = key();
|
|
98
|
+
var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
|
|
99
|
+
onPress: onPress,
|
|
100
|
+
baseSet: [[k]]
|
|
101
|
+
})),
|
|
102
|
+
container = _render4.container;
|
|
103
|
+
container.querySelector('button').click();
|
|
104
|
+
expect(onPress).toHaveBeenCalledWith(k);
|
|
105
|
+
});
|
|
106
|
+
it('renders a latex key through LatexLabel', function () {
|
|
107
|
+
var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
|
|
108
|
+
onPress: function onPress() {},
|
|
109
|
+
baseSet: [[{
|
|
110
|
+
name: 'pi',
|
|
111
|
+
latex: '\\pi'
|
|
112
|
+
}]]
|
|
113
|
+
})),
|
|
114
|
+
container = _render5.container;
|
|
115
|
+
expect(container.textContent).toContain('\\pi');
|
|
116
|
+
});
|
|
117
|
+
it('disables the decimal separators when noDecimal is set', function () {
|
|
118
|
+
var dot = key({
|
|
119
|
+
name: '.',
|
|
120
|
+
label: '.',
|
|
121
|
+
write: '.'
|
|
122
|
+
});
|
|
123
|
+
var comma = key({
|
|
124
|
+
name: ',',
|
|
125
|
+
label: ',',
|
|
126
|
+
write: ','
|
|
127
|
+
});
|
|
128
|
+
var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
|
|
129
|
+
onPress: function onPress() {},
|
|
130
|
+
noDecimal: true,
|
|
131
|
+
baseSet: [[dot, comma]]
|
|
132
|
+
})),
|
|
133
|
+
container = _render6.container;
|
|
134
|
+
var disabled = Array.from(container.querySelectorAll('button')).filter(function (b) {
|
|
135
|
+
return b.disabled;
|
|
136
|
+
});
|
|
137
|
+
expect(disabled.length).toBe(2);
|
|
138
|
+
});
|
|
139
|
+
it('leaves the separators enabled otherwise', function () {
|
|
140
|
+
var dot = key({
|
|
141
|
+
name: '.',
|
|
142
|
+
label: '.',
|
|
143
|
+
write: '.'
|
|
144
|
+
});
|
|
145
|
+
var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
|
|
146
|
+
onPress: function onPress() {},
|
|
147
|
+
baseSet: [[dot]]
|
|
148
|
+
})),
|
|
149
|
+
container = _render7.container;
|
|
150
|
+
expect(container.querySelector('button').disabled).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
it('renders a placeholder for empty grid slots', function () {
|
|
153
|
+
expect(function () {
|
|
154
|
+
return (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
|
|
155
|
+
onPress: function onPress() {},
|
|
156
|
+
baseSet: [[null]]
|
|
157
|
+
}));
|
|
158
|
+
}).not.toThrow();
|
|
159
|
+
});
|
|
160
|
+
it('notifies setKeypadInteraction on pointer interaction', function () {
|
|
161
|
+
var setKeypadInteraction = jest.fn();
|
|
162
|
+
var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
|
|
163
|
+
onPress: function onPress() {},
|
|
164
|
+
setKeypadInteraction: setKeypadInteraction,
|
|
165
|
+
baseSet: [[key()]]
|
|
166
|
+
})),
|
|
167
|
+
container = _render8.container;
|
|
168
|
+
container.firstChild.dispatchEvent(new MouseEvent('mousedown', {
|
|
169
|
+
bubbles: true
|
|
170
|
+
}));
|
|
171
|
+
expect(setKeypadInteraction).toHaveBeenCalledWith(true);
|
|
172
|
+
});
|
|
173
|
+
it('uses the mode as a class so mode-specific styling applies', function () {
|
|
174
|
+
var _render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
|
|
175
|
+
onPress: function onPress() {},
|
|
176
|
+
mode: "language",
|
|
177
|
+
baseSet: [[key()]]
|
|
178
|
+
})),
|
|
179
|
+
container = _render9.container;
|
|
180
|
+
expect(container.firstChild.className).toContain('language');
|
|
181
|
+
});
|
|
182
|
+
it('drops the base set for the modes that supply their own keys', function () {
|
|
183
|
+
var _render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
|
|
184
|
+
onPress: function onPress() {},
|
|
185
|
+
mode: "language",
|
|
186
|
+
baseSet: [[key(), key()]],
|
|
187
|
+
additionalKeys: [[key()]]
|
|
188
|
+
})),
|
|
189
|
+
container = _render0.container;
|
|
190
|
+
|
|
191
|
+
// base set ignored, only the additional key renders
|
|
192
|
+
expect(container.querySelectorAll('button').length).toBe(1);
|
|
193
|
+
});
|
|
194
|
+
it('unmounts without throwing', function () {
|
|
195
|
+
var _render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_keypad["default"], {
|
|
196
|
+
onPress: function onPress() {},
|
|
197
|
+
controlledKeypadMode: true,
|
|
198
|
+
baseSet: [[key()]]
|
|
199
|
+
})),
|
|
200
|
+
unmount = _render1.unmount;
|
|
201
|
+
expect(function () {
|
|
202
|
+
return unmount();
|
|
203
|
+
}).not.toThrow();
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfa2V5cGFkIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJfdHlwZW9mIiwiaGFzIiwiZ2V0Iiwic2V0IiwiX3QiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVzY3JpYmUiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiTGF0ZXhMYWJlbCIsImxhdGV4IiwiY29udGFpbmVyIiwiZXhwZWN0IiwidGV4dENvbnRlbnQiLCJ0b0NvbnRhaW4iLCJfcmVuZGVyMiIsInJlcmVuZGVyIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJhIiwiYiIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0Iiwid2FybmVkIiwic3RhdGUiLCJtYXJrdXAiLCJzZXRTdGF0ZSIsImNvbXBvbmVudERpZE1vdW50IiwidG9CZSIsInN0b3AiLCJrZXkiLCJvdmVyIiwidW5kZWZpbmVkIiwibmFtZSIsImxhYmVsIiwid3JpdGUiLCJjYXRlZ29yeSIsIl9yZW5kZXIzIiwib25QcmVzcyIsImJhc2VTZXQiLCJxdWVyeVNlbGVjdG9yQWxsIiwiamVzdCIsImZuIiwiayIsIl9yZW5kZXI0IiwicXVlcnlTZWxlY3RvciIsImNsaWNrIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJfcmVuZGVyNSIsImRvdCIsImNvbW1hIiwiX3JlbmRlcjYiLCJub0RlY2ltYWwiLCJkaXNhYmxlZCIsIkFycmF5IiwiZnJvbSIsIl9yZW5kZXI3Iiwibm90IiwidG9UaHJvdyIsInNldEtleXBhZEludGVyYWN0aW9uIiwiX3JlbmRlcjgiLCJmaXJzdENoaWxkIiwiZGlzcGF0Y2hFdmVudCIsIk1vdXNlRXZlbnQiLCJidWJibGVzIiwiX3JlbmRlcjkiLCJtb2RlIiwiY2xhc3NOYW1lIiwiX3JlbmRlcjAiLCJhZGRpdGlvbmFsS2V5cyIsIl9yZW5kZXIxIiwiY29udHJvbGxlZEtleXBhZE1vZGUiLCJ1bm1vdW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9rZXlwYWQtcmVuZGVyLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcblxuaW1wb3J0IEtleVBhZCwgeyBMYXRleExhYmVsIH0gZnJvbSAnLi4va2V5cGFkJztcblxuLyoqXG4gKiBLZXlwYWQgYmVoYXZpb3VyIHRoYXQgaXMgbmV3IGluIHRoaXMgcGFja2FnZTogbGFiZWxzIGFyZSBzdGF0aWMgbWFya3VwIGZyb21cbiAqIGNvbnZlcnRMYXRleFRvTWFya3VwICh0aGUgTWF0aFF1aWxsIHZlcnNpb24gY3JlYXRlZCBhIGxpdmUgU3RhdGljTWF0aCBwZXJcbiAqIGJ1dHRvbiksIHdpdGggYSByYXctbGF0ZXggZmFsbGJhY2sgd2hlbiB0aGUgZW5naW5lIGlzIHVuYXZhaWxhYmxlLlxuICovXG5kZXNjcmliZSgnTGF0ZXhMYWJlbCcsICgpID0+IHtcbiAgaXQoJ2ZhbGxzIGJhY2sgdG8gcmF3IGxhdGV4IHdoZW4gTWF0aExpdmUgaXMgdW5hdmFpbGFibGUnLCAoKSA9PiB7XG4gICAgLy8ganNkb20gY2Fubm90IGxvYWQgTWF0aExpdmUsIHNvIGxhdGV4VG9NYXJrdXAgcmV0dXJucyAnJyAtIHRoZSBidXR0b24gbXVzdFxuICAgIC8vIHN0aWxsIHNob3cgc29tZXRoaW5nIHJhdGhlciB0aGFuIHJlbmRlciBibGFuay5cbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxMYXRleExhYmVsIGxhdGV4PXsnXFxcXHBpJ30gLz4pO1xuXG4gICAgZXhwZWN0KGNvbnRhaW5lci50ZXh0Q29udGVudCkudG9Db250YWluKCdcXFxccGknKTtcbiAgfSk7XG5cbiAgaXQoJ3JlLXJlbmRlcnMgd2hlbiB0aGUgbGF0ZXggcHJvcCBjaGFuZ2VzJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyLCByZXJlbmRlciB9ID0gcmVuZGVyKDxMYXRleExhYmVsIGxhdGV4PXsnXFxcXHBpJ30gLz4pO1xuXG4gICAgcmVyZW5kZXIoPExhdGV4TGFiZWwgbGF0ZXg9eydcXFxcdGhldGEnfSAvPik7XG5cbiAgICBleHBlY3QoY29udGFpbmVyLnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1xcXFx0aGV0YScpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3Qgd2FybiBtb3JlIHRoYW4gb25jZSBhYm91dCBhIG1pc3NpbmcgZW5naW5lJywgYXN5bmMgKCkgPT4ge1xuICAgIExhdGV4TGFiZWwud2FybmVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBhID0gbmV3IExhdGV4TGFiZWwoeyBsYXRleDogJ1xcXFxwaScgfSk7XG4gICAgY29uc3QgYiA9IG5ldyBMYXRleExhYmVsKHsgbGF0ZXg6ICdcXFxcdGhldGEnIH0pO1xuXG4gICAgYS5zdGF0ZSA9IHsgbWFya3VwOiAnJyB9O1xuICAgIGIuc3RhdGUgPSB7IG1hcmt1cDogJycgfTtcbiAgICBhLnNldFN0YXRlID0gKCkgPT4ge307XG4gICAgYi5zZXRTdGF0ZSA9ICgpID0+IHt9O1xuXG4gICAgYXdhaXQgYS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIGF3YWl0IGIuY29tcG9uZW50RGlkTW91bnQoKTtcblxuICAgIGV4cGVjdChMYXRleExhYmVsLndhcm5lZCkudG9CZSh0cnVlKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0tleVBhZCcsICgpID0+IHtcbiAgY29uc3Qga2V5ID0gKG92ZXIgPSB7fSkgPT4gKHsgbmFtZTogJ3gnLCBsYWJlbDogJ3gnLCB3cml0ZTogJ3gnLCBjYXRlZ29yeTogJ3ZhcnMnLCAuLi5vdmVyIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGEgYnV0dG9uIHBlciBrZXknLCAoKSA9PiB7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8S2V5UGFkIG9uUHJlc3M9eygpID0+IHt9fSBiYXNlU2V0PXtbW2tleSgpLCBrZXkoeyBuYW1lOiAneScsIGxhYmVsOiAneScgfSldXX0gLz4pO1xuXG4gICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKS5sZW5ndGgpLnRvQmUoMik7XG4gIH0pO1xuXG4gIGl0KCdjYWxscyBvblByZXNzIHdpdGggdGhlIHdob2xlIGtleSBkZWZpbml0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uUHJlc3MgPSBqZXN0LmZuKCk7XG4gICAgY29uc3QgayA9IGtleSgpO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEtleVBhZCBvblByZXNzPXtvblByZXNzfSBiYXNlU2V0PXtbW2tdXX0gLz4pO1xuXG4gICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLmNsaWNrKCk7XG5cbiAgICBleHBlY3Qob25QcmVzcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoayk7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIGEgbGF0ZXgga2V5IHRocm91Z2ggTGF0ZXhMYWJlbCcsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxLZXlQYWQgb25QcmVzcz17KCkgPT4ge319IGJhc2VTZXQ9e1tbeyBuYW1lOiAncGknLCBsYXRleDogJ1xcXFxwaScgfV1dfSAvPik7XG5cbiAgICBleHBlY3QoY29udGFpbmVyLnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1xcXFxwaScpO1xuICB9KTtcblxuICBpdCgnZGlzYWJsZXMgdGhlIGRlY2ltYWwgc2VwYXJhdG9ycyB3aGVuIG5vRGVjaW1hbCBpcyBzZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgZG90ID0ga2V5KHsgbmFtZTogJy4nLCBsYWJlbDogJy4nLCB3cml0ZTogJy4nIH0pO1xuICAgIGNvbnN0IGNvbW1hID0ga2V5KHsgbmFtZTogJywnLCBsYWJlbDogJywnLCB3cml0ZTogJywnIH0pO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEtleVBhZCBvblByZXNzPXsoKSA9PiB7fX0gbm9EZWNpbWFsIGJhc2VTZXQ9e1tbZG90LCBjb21tYV1dfSAvPik7XG5cbiAgICBjb25zdCBkaXNhYmxlZCA9IEFycmF5LmZyb20oY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpKS5maWx0ZXIoKGIpID0+IGIuZGlzYWJsZWQpO1xuXG4gICAgZXhwZWN0KGRpc2FibGVkLmxlbmd0aCkudG9CZSgyKTtcbiAgfSk7XG5cbiAgaXQoJ2xlYXZlcyB0aGUgc2VwYXJhdG9ycyBlbmFibGVkIG90aGVyd2lzZScsICgpID0+IHtcbiAgICBjb25zdCBkb3QgPSBrZXkoeyBuYW1lOiAnLicsIGxhYmVsOiAnLicsIHdyaXRlOiAnLicgfSk7XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8S2V5UGFkIG9uUHJlc3M9eygpID0+IHt9fSBiYXNlU2V0PXtbW2RvdF1dfSAvPik7XG5cbiAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbicpLmRpc2FibGVkKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgYSBwbGFjZWhvbGRlciBmb3IgZW1wdHkgZ3JpZCBzbG90cycsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT4gcmVuZGVyKDxLZXlQYWQgb25QcmVzcz17KCkgPT4ge319IGJhc2VTZXQ9e1tbbnVsbF1dfSAvPikpLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0KCdub3RpZmllcyBzZXRLZXlwYWRJbnRlcmFjdGlvbiBvbiBwb2ludGVyIGludGVyYWN0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IHNldEtleXBhZEludGVyYWN0aW9uID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICA8S2V5UGFkIG9uUHJlc3M9eygpID0+IHt9fSBzZXRLZXlwYWRJbnRlcmFjdGlvbj17c2V0S2V5cGFkSW50ZXJhY3Rpb259IGJhc2VTZXQ9e1tba2V5KCldXX0gLz4sXG4gICAgKTtcblxuICAgIGNvbnRhaW5lci5maXJzdENoaWxkLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG5cbiAgICBleHBlY3Qoc2V0S2V5cGFkSW50ZXJhY3Rpb24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRydWUpO1xuICB9KTtcblxuICBpdCgndXNlcyB0aGUgbW9kZSBhcyBhIGNsYXNzIHNvIG1vZGUtc3BlY2lmaWMgc3R5bGluZyBhcHBsaWVzJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPEtleVBhZCBvblByZXNzPXsoKSA9PiB7fX0gbW9kZT1cImxhbmd1YWdlXCIgYmFzZVNldD17W1trZXkoKV1dfSAvPik7XG5cbiAgICBleHBlY3QoY29udGFpbmVyLmZpcnN0Q2hpbGQuY2xhc3NOYW1lKS50b0NvbnRhaW4oJ2xhbmd1YWdlJyk7XG4gIH0pO1xuXG4gIGl0KCdkcm9wcyB0aGUgYmFzZSBzZXQgZm9yIHRoZSBtb2RlcyB0aGF0IHN1cHBseSB0aGVpciBvd24ga2V5cycsICgpID0+IHtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgPEtleVBhZCBvblByZXNzPXsoKSA9PiB7fX0gbW9kZT1cImxhbmd1YWdlXCIgYmFzZVNldD17W1trZXkoKSwga2V5KCldXX0gYWRkaXRpb25hbEtleXM9e1tba2V5KCldXX0gLz4sXG4gICAgKTtcblxuICAgIC8vIGJhc2Ugc2V0IGlnbm9yZWQsIG9ubHkgdGhlIGFkZGl0aW9uYWwga2V5IHJlbmRlcnNcbiAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbicpLmxlbmd0aCkudG9CZSgxKTtcbiAgfSk7XG5cbiAgaXQoJ3VubW91bnRzIHdpdGhvdXQgdGhyb3dpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyB1bm1vdW50IH0gPSByZW5kZXIoPEtleVBhZCBvblByZXNzPXsoKSA9PiB7fX0gY29udHJvbGxlZEtleXBhZE1vZGUgYmFzZVNldD17W1trZXkoKV1dfSAvPik7XG5cbiAgICBleHBlY3QoKCkgPT4gdW5tb3VudCgpKS5ub3QudG9UaHJvdygpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsT0FBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQStDLFNBQUFHLHdCQUFBQyxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBSCx1QkFBQSxZQUFBQSx3QkFBQUMsQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLG1CQUFBVCxDQUFBLGlCQUFBQSxDQUFBLGdCQUFBVSxPQUFBLENBQUFWLENBQUEsMEJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxH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
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
5
|
+
var _latexBridge = require("../latex-bridge");
|
|
6
|
+
describe('latex-bridge', function () {
|
|
7
|
+
describe('toMathLive', function () {
|
|
8
|
+
it('passes plain latex through', function () {
|
|
9
|
+
expect((0, _latexBridge.toMathLive)('\\frac{1}{2}')).toEqual('\\frac{1}{2}');
|
|
10
|
+
});
|
|
11
|
+
it('handles empty/nullish', function () {
|
|
12
|
+
expect((0, _latexBridge.toMathLive)('')).toEqual('');
|
|
13
|
+
expect((0, _latexBridge.toMathLive)(undefined)).toEqual('');
|
|
14
|
+
expect((0, _latexBridge.toMathLive)(null)).toEqual('');
|
|
15
|
+
});
|
|
16
|
+
it('converts a newLine embed to a multiline environment', function () {
|
|
17
|
+
expect((0, _latexBridge.toMathLive)("a".concat(_latexBridge.NEWLINE_EMBED, "b"))).toEqual('\\displaylines{a \\\\ b}');
|
|
18
|
+
});
|
|
19
|
+
it('converts multiple newLine embeds', function () {
|
|
20
|
+
expect((0, _latexBridge.toMathLive)("a".concat(_latexBridge.NEWLINE_EMBED, "b").concat(_latexBridge.NEWLINE_EMBED, "c"))).toEqual('\\displaylines{a \\\\ b \\\\ c}');
|
|
21
|
+
});
|
|
22
|
+
it('converts MathQuill answer blocks to placeholders', function () {
|
|
23
|
+
expect((0, _latexBridge.toMathLive)('x=\\MathQuillMathField[r1]{}')).toEqual('x=\\placeholder[r1]{}');
|
|
24
|
+
});
|
|
25
|
+
it('preserves answer block content', function () {
|
|
26
|
+
expect((0, _latexBridge.toMathLive)('\\MathQuillMathField[r2]{7}')).toEqual('\\placeholder[r2]{7}');
|
|
27
|
+
});
|
|
28
|
+
it('defaults an unnamed answer block id', function () {
|
|
29
|
+
expect((0, _latexBridge.toMathLive)('\\MathQuillMathField[]{}')).toEqual("\\placeholder[".concat(_latexBridge.DEFAULT_FIELD_ID, "]{}"));
|
|
30
|
+
});
|
|
31
|
+
it('handles answer blocks and newlines together', function () {
|
|
32
|
+
expect((0, _latexBridge.toMathLive)("\\MathQuillMathField[r1]{}".concat(_latexBridge.NEWLINE_EMBED, "x"))).toEqual('\\displaylines{\\placeholder[r1]{} \\\\ x}');
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('fromMathLive', function () {
|
|
36
|
+
it('passes plain latex through', function () {
|
|
37
|
+
expect((0, _latexBridge.fromMathLive)('\\frac{1}{2}')).toEqual('\\frac{1}{2}');
|
|
38
|
+
});
|
|
39
|
+
it('unwraps displaylines back to newLine embeds', function () {
|
|
40
|
+
expect((0, _latexBridge.fromMathLive)('\\displaylines{a \\\\ b}')).toEqual("a".concat(_latexBridge.NEWLINE_EMBED, "b"));
|
|
41
|
+
});
|
|
42
|
+
it('converts placeholders back to MathQuill answer blocks', function () {
|
|
43
|
+
expect((0, _latexBridge.fromMathLive)('x=\\placeholder[r1]{}')).toEqual('x=\\MathQuillMathField[r1]{}');
|
|
44
|
+
});
|
|
45
|
+
it('round-trips a newline document', function () {
|
|
46
|
+
var stored = "a".concat(_latexBridge.NEWLINE_EMBED, "b").concat(_latexBridge.NEWLINE_EMBED, "c");
|
|
47
|
+
expect((0, _latexBridge.fromMathLive)((0, _latexBridge.toMathLive)(stored))).toEqual(stored);
|
|
48
|
+
});
|
|
49
|
+
it('round-trips an answer-block document', function () {
|
|
50
|
+
var stored = 'x=\\MathQuillMathField[r1]{}+\\MathQuillMathField[r2]{3}';
|
|
51
|
+
expect((0, _latexBridge.fromMathLive)((0, _latexBridge.toMathLive)(stored))).toEqual(stored);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// MathLive serialises empty slots as \placeholder{}, which MathJax (used by
|
|
55
|
+
// @pie-lib/math-rendering for prompts/previews) renders as red error text.
|
|
56
|
+
it('strips unnamed placeholders that MathLive adds', function () {
|
|
57
|
+
expect((0, _latexBridge.fromMathLive)('\\longdiv{\\placeholder{}}')).toEqual('\\longdiv{}');
|
|
58
|
+
expect((0, _latexBridge.fromMathLive)('\\frac{\\placeholder{}}{\\placeholder{}}')).toEqual('\\frac{}{}');
|
|
59
|
+
});
|
|
60
|
+
it('keeps content inside an unnamed placeholder', function () {
|
|
61
|
+
expect((0, _latexBridge.fromMathLive)('\\sqrt{\\placeholder{7}}')).toEqual('\\sqrt{7}');
|
|
62
|
+
});
|
|
63
|
+
it('handles a bare \\placeholder with no argument', function () {
|
|
64
|
+
expect((0, _latexBridge.fromMathLive)('\\longdiv{\\placeholder}')).toEqual('\\longdiv{}');
|
|
65
|
+
});
|
|
66
|
+
it('never leaks the token \\placeholder', function () {
|
|
67
|
+
['\\longdiv{\\placeholder{}}', '\\frac{\\placeholder{}}{x}', '\\placeholder{}'].forEach(function (l) {
|
|
68
|
+
expect((0, _latexBridge.fromMathLive)(l)).not.toContain('\\placeholder');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
it('still maps NAMED placeholders to answer blocks', function () {
|
|
72
|
+
// named ones are answer blocks and must survive
|
|
73
|
+
expect((0, _latexBridge.fromMathLive)('\\placeholder[r1]{}')).toEqual('\\MathQuillMathField[r1]{}');
|
|
74
|
+
});
|
|
75
|
+
it('round-trips answer blocks combined with newlines', function () {
|
|
76
|
+
var stored = "\\MathQuillMathField[r1]{}".concat(_latexBridge.NEWLINE_EMBED, "y");
|
|
77
|
+
expect((0, _latexBridge.fromMathLive)((0, _latexBridge.toMathLive)(stored))).toEqual(stored);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// A MathLive macro serialises from the arguments it was created with, so text
|
|
82
|
+
// typed inside its expansion never comes back out of getValue('latex').
|
|
83
|
+
// Argument-taking pie commands must therefore become native constructs before
|
|
84
|
+
// they reach a mathfield.
|
|
85
|
+
describe('toNativeCommands', function () {
|
|
86
|
+
it('expands \\longdiv to native \\enclose', function () {
|
|
87
|
+
expect((0, _latexBridge.toNativeCommands)('\\longdiv{1234}')).toEqual('\\enclose{longdiv}{1234}');
|
|
88
|
+
expect((0, _latexBridge.toNativeCommands)('\\longdiv{}')).toEqual('\\enclose{longdiv}{}');
|
|
89
|
+
});
|
|
90
|
+
it('expands \\overarc to native \\overparen', function () {
|
|
91
|
+
expect((0, _latexBridge.toNativeCommands)('\\overarc{AB}')).toEqual('\\overparen{AB}');
|
|
92
|
+
});
|
|
93
|
+
it('expands \\abs to native \\left|..\\right|', function () {
|
|
94
|
+
expect((0, _latexBridge.toNativeCommands)('\\abs{x}')).toEqual('\\left|x\\right|');
|
|
95
|
+
expect((0, _latexBridge.toNativeCommands)('\\abs{}')).toEqual('\\left|\\right|');
|
|
96
|
+
});
|
|
97
|
+
it('handles nested braces inside \\abs', function () {
|
|
98
|
+
expect((0, _latexBridge.toNativeCommands)('\\abs{\\frac{1}{2}}')).toEqual('\\left|\\frac{1}{2}\\right|');
|
|
99
|
+
});
|
|
100
|
+
it('handles several occurrences', function () {
|
|
101
|
+
expect((0, _latexBridge.toNativeCommands)('\\abs{a}+\\abs{b}')).toEqual('\\left|a\\right|+\\left|b\\right|');
|
|
102
|
+
expect((0, _latexBridge.toNativeCommands)('\\longdiv{1}\\longdiv{2}')).toEqual('\\enclose{longdiv}{1}\\enclose{longdiv}{2}');
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// `%` starts a comment in real LaTeX, so MathLive drops it and everything
|
|
106
|
+
// after it. MathQuill had no comments, so latex authored under it - or by
|
|
107
|
+
// hand - can carry a bare `%` that would silently truncate the expression.
|
|
108
|
+
it('escapes a bare % so it cannot comment out the rest of the line', function () {
|
|
109
|
+
expect((0, _latexBridge.toNativeCommands)('%')).toEqual('\\%');
|
|
110
|
+
expect((0, _latexBridge.toNativeCommands)('50%')).toEqual('50\\%');
|
|
111
|
+
expect((0, _latexBridge.toNativeCommands)('x%y')).toEqual('x\\%y');
|
|
112
|
+
expect((0, _latexBridge.toNativeCommands)('a%b%c')).toEqual('a\\%b\\%c');
|
|
113
|
+
});
|
|
114
|
+
it('leaves an already-escaped % alone', function () {
|
|
115
|
+
expect((0, _latexBridge.toNativeCommands)('\\%')).toEqual('\\%');
|
|
116
|
+
expect((0, _latexBridge.toNativeCommands)('50\\%')).toEqual('50\\%');
|
|
117
|
+
// idempotent: toMathLive may run over latex that came back out of a field
|
|
118
|
+
expect((0, _latexBridge.toNativeCommands)((0, _latexBridge.toNativeCommands)('50%'))).toEqual('50\\%');
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// `\\` is a line break, not an escape, so the `%` after it is still bare.
|
|
122
|
+
it('counts backslashes to decide whether a % is escaped', function () {
|
|
123
|
+
expect((0, _latexBridge.toNativeCommands)('a\\\\%b')).toEqual('a\\\\\\%b');
|
|
124
|
+
});
|
|
125
|
+
it('leaves other latex untouched', function () {
|
|
126
|
+
['\\frac{1}{2}', '\\pi', '\\sqrt{x}', '\\overline{AB}'].forEach(function (l) {
|
|
127
|
+
expect((0, _latexBridge.toNativeCommands)(l)).toEqual(l);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
it('handles nullish input', function () {
|
|
131
|
+
expect((0, _latexBridge.toNativeCommands)(undefined)).toEqual('');
|
|
132
|
+
expect((0, _latexBridge.toNativeCommands)('')).toEqual('');
|
|
133
|
+
});
|
|
134
|
+
it('is applied by toMathLive', function () {
|
|
135
|
+
expect((0, _latexBridge.toMathLive)('\\longdiv{5}')).toEqual('\\enclose{longdiv}{5}');
|
|
136
|
+
});
|
|
137
|
+
it('does not leave a pie macro in what reaches the field', function () {
|
|
138
|
+
['\\longdiv{7}', '\\abs{7}', '\\overarc{7}'].forEach(function (l) {
|
|
139
|
+
var out = (0, _latexBridge.toMathLive)(l);
|
|
140
|
+
expect(out).not.toMatch(/\\longdiv|\\abs|\\overarc/);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('fieldIds', function () {
|
|
145
|
+
it('returns ids in document order', function () {
|
|
146
|
+
expect((0, _latexBridge.fieldIds)('\\MathQuillMathField[r1]{}+\\MathQuillMathField[r2]{}')).toEqual(['r1', 'r2']);
|
|
147
|
+
});
|
|
148
|
+
it('returns [] when there are none', function () {
|
|
149
|
+
expect((0, _latexBridge.fieldIds)('x+y')).toEqual([]);
|
|
150
|
+
expect((0, _latexBridge.fieldIds)(undefined)).toEqual([]);
|
|
151
|
+
});
|
|
152
|
+
it('is repeatable (regex lastIndex is reset)', function () {
|
|
153
|
+
var latex = '\\MathQuillMathField[r1]{}';
|
|
154
|
+
expect((0, _latexBridge.fieldIds)(latex)).toEqual(['r1']);
|
|
155
|
+
expect((0, _latexBridge.fieldIds)(latex)).toEqual(['r1']);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('keyToAction', function () {
|
|
159
|
+
it('prefers latex when there is no command', function () {
|
|
160
|
+
expect((0, _latexBridge.keyToAction)({
|
|
161
|
+
latex: '\\pi',
|
|
162
|
+
write: 'p'
|
|
163
|
+
})).toEqual({
|
|
164
|
+
type: 'insert',
|
|
165
|
+
value: '\\pi'
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
it('uses write', function () {
|
|
169
|
+
expect((0, _latexBridge.keyToAction)({
|
|
170
|
+
write: 'x'
|
|
171
|
+
})).toEqual({
|
|
172
|
+
type: 'insert',
|
|
173
|
+
value: 'x'
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
it('expands commands that take arguments into placeholders', function () {
|
|
177
|
+
expect((0, _latexBridge.keyToAction)({
|
|
178
|
+
command: '\\frac'
|
|
179
|
+
})).toEqual({
|
|
180
|
+
type: 'insert',
|
|
181
|
+
value: '\\frac{#?}{#?}'
|
|
182
|
+
});
|
|
183
|
+
expect((0, _latexBridge.keyToAction)({
|
|
184
|
+
command: '\\sqrt'
|
|
185
|
+
})).toEqual({
|
|
186
|
+
type: 'insert',
|
|
187
|
+
value: '\\sqrt{#?}'
|
|
188
|
+
});
|
|
189
|
+
expect((0, _latexBridge.keyToAction)({
|
|
190
|
+
command: '^'
|
|
191
|
+
})).toEqual({
|
|
192
|
+
type: 'insert',
|
|
193
|
+
value: '^{#?}'
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
// MathQuill's `/` turned the preceding expression into the numerator: type
|
|
198
|
+
// 5, press the key, get 5/_ with the caret in the denominator. `#@` is
|
|
199
|
+
// MathLive's "selection, or the item before the cursor" token, and is what
|
|
200
|
+
// MathLive binds to `/` itself.
|
|
201
|
+
it('division takes the preceding item as the numerator', function () {
|
|
202
|
+
expect((0, _latexBridge.keyToAction)({
|
|
203
|
+
command: '/'
|
|
204
|
+
})).toEqual({
|
|
205
|
+
type: 'insert',
|
|
206
|
+
value: '\\frac{#@}{#?}'
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
it('an explicit blank-over-blank fraction stays empty', function () {
|
|
210
|
+
// distinct from `/`: this key is meant to insert two empty slots
|
|
211
|
+
expect((0, _latexBridge.keyToAction)({
|
|
212
|
+
command: '\\frac'
|
|
213
|
+
})).toEqual({
|
|
214
|
+
type: 'insert',
|
|
215
|
+
value: '\\frac{#?}{#?}'
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
it('the x-over-blank key routes through division', function () {
|
|
219
|
+
// eslint-disable-next-line global-require
|
|
220
|
+
var _require = require('../keys/fractions'),
|
|
221
|
+
xOverBlank = _require.xOverBlank;
|
|
222
|
+
expect(xOverBlank.command).toEqual('/');
|
|
223
|
+
expect((0, _latexBridge.keyToAction)(xOverBlank).value).toEqual('\\frac{#@}{#?}');
|
|
224
|
+
});
|
|
225
|
+
it('passes argument-less commands through', function () {
|
|
226
|
+
expect((0, _latexBridge.keyToAction)({
|
|
227
|
+
command: '\\pi'
|
|
228
|
+
})).toEqual({
|
|
229
|
+
type: 'insert',
|
|
230
|
+
value: '\\pi'
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
it('concatenates array commands (MathQuill cmd() applied them in sequence)', function () {
|
|
234
|
+
// Measured Angle
|
|
235
|
+
expect((0, _latexBridge.keyToAction)({
|
|
236
|
+
command: ['m', '\\angle']
|
|
237
|
+
})).toEqual({
|
|
238
|
+
type: 'insert',
|
|
239
|
+
value: 'm\\angle'
|
|
240
|
+
});
|
|
241
|
+
// log base n - the `_` part must still expand to a placeholder
|
|
242
|
+
expect((0, _latexBridge.keyToAction)({
|
|
243
|
+
command: ['\\log', '_']
|
|
244
|
+
})).toEqual({
|
|
245
|
+
type: 'insert',
|
|
246
|
+
value: '\\log_{#?}'
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
it('always returns a string value for insert actions', function () {
|
|
250
|
+
[{
|
|
251
|
+
command: ['m', '\\angle']
|
|
252
|
+
}, {
|
|
253
|
+
command: '\\frac'
|
|
254
|
+
}, {
|
|
255
|
+
write: 'x'
|
|
256
|
+
}, {
|
|
257
|
+
latex: '\\pi'
|
|
258
|
+
}].forEach(function (k) {
|
|
259
|
+
expect((0, _typeof2["default"])((0, _latexBridge.keyToAction)(k).value)).toBe('string');
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
it('maps keystrokes to MathLive selectors', function () {
|
|
263
|
+
expect((0, _latexBridge.keyToAction)({
|
|
264
|
+
keystroke: 'Left'
|
|
265
|
+
})).toEqual({
|
|
266
|
+
type: 'command',
|
|
267
|
+
value: 'moveToPreviousChar'
|
|
268
|
+
});
|
|
269
|
+
expect((0, _latexBridge.keyToAction)({
|
|
270
|
+
keystroke: 'Right'
|
|
271
|
+
})).toEqual({
|
|
272
|
+
type: 'command',
|
|
273
|
+
value: 'moveToNextChar'
|
|
274
|
+
});
|
|
275
|
+
expect((0, _latexBridge.keyToAction)({
|
|
276
|
+
keystroke: 'Backspace'
|
|
277
|
+
})).toEqual({
|
|
278
|
+
type: 'command',
|
|
279
|
+
value: 'deleteBackward'
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
it('returns undefined for unknown/empty input', function () {
|
|
283
|
+
expect((0, _latexBridge.keyToAction)(undefined)).toBeUndefined();
|
|
284
|
+
expect((0, _latexBridge.keyToAction)({})).toBeUndefined();
|
|
285
|
+
expect((0, _latexBridge.keyToAction)({
|
|
286
|
+
keystroke: 'Nope'
|
|
287
|
+
})).toBeUndefined();
|
|
288
|
+
});
|
|
289
|
+
it('latex wins over command only when command is absent', function () {
|
|
290
|
+
// a key with both should use the command path (matches MathInput.keypadPress)
|
|
291
|
+
expect((0, _latexBridge.keyToAction)({
|
|
292
|
+
latex: '\\frac{}{}',
|
|
293
|
+
command: '\\frac'
|
|
294
|
+
})).toEqual({
|
|
295
|
+
type: 'insert',
|
|
296
|
+
value: '\\frac{#?}{#?}'
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF0ZXhCcmlkZ2UiLCJyZXF1aXJlIiwiZGVzY3JpYmUiLCJpdCIsImV4cGVjdCIsInRvTWF0aExpdmUiLCJ0b0VxdWFsIiwidW5kZWZpbmVkIiwiY29uY2F0IiwiTkVXTElORV9FTUJFRCIsIkRFRkFVTFRfRklFTERfSUQiLCJmcm9tTWF0aExpdmUiLCJzdG9yZWQiLCJmb3JFYWNoIiwibCIsIm5vdCIsInRvQ29udGFpbiIsInRvTmF0aXZlQ29tbWFuZHMiLCJvdXQiLCJ0b01hdGNoIiwiZmllbGRJZHMiLCJsYXRleCIsImtleVRvQWN0aW9uIiwid3JpdGUiLCJ0eXBlIiwidmFsdWUiLCJjb21tYW5kIiwiX3JlcXVpcmUiLCJ4T3ZlckJsYW5rIiwiayIsIl90eXBlb2YyIiwidG9CZSIsImtleXN0cm9rZSIsInRvQmVVbmRlZmluZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2xhdGV4LWJyaWRnZS50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHRvTWF0aExpdmUsXG4gIGZyb21NYXRoTGl2ZSxcbiAgZmllbGRJZHMsXG4gIGtleVRvQWN0aW9uLFxuICB0b05hdGl2ZUNvbW1hbmRzLFxuICBORVdMSU5FX0VNQkVELFxuICBERUZBVUxUX0ZJRUxEX0lELFxufSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuXG5kZXNjcmliZSgnbGF0ZXgtYnJpZGdlJywgKCkgPT4ge1xuICBkZXNjcmliZSgndG9NYXRoTGl2ZScsICgpID0+IHtcbiAgICBpdCgncGFzc2VzIHBsYWluIGxhdGV4IHRocm91Z2gnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9NYXRoTGl2ZSgnXFxcXGZyYWN7MX17Mn0nKSkudG9FcXVhbCgnXFxcXGZyYWN7MX17Mn0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIGVtcHR5L251bGxpc2gnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9NYXRoTGl2ZSgnJykpLnRvRXF1YWwoJycpO1xuICAgICAgZXhwZWN0KHRvTWF0aExpdmUodW5kZWZpbmVkKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QodG9NYXRoTGl2ZShudWxsKSkudG9FcXVhbCgnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29udmVydHMgYSBuZXdMaW5lIGVtYmVkIHRvIGEgbXVsdGlsaW5lIGVudmlyb25tZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTWF0aExpdmUoYGEke05FV0xJTkVfRU1CRUR9YmApKS50b0VxdWFsKCdcXFxcZGlzcGxheWxpbmVze2EgXFxcXFxcXFwgYn0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb252ZXJ0cyBtdWx0aXBsZSBuZXdMaW5lIGVtYmVkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b01hdGhMaXZlKGBhJHtORVdMSU5FX0VNQkVEfWIke05FV0xJTkVfRU1CRUR9Y2ApKS50b0VxdWFsKCdcXFxcZGlzcGxheWxpbmVze2EgXFxcXFxcXFwgYiBcXFxcXFxcXCBjfScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbnZlcnRzIE1hdGhRdWlsbCBhbnN3ZXIgYmxvY2tzIHRvIHBsYWNlaG9sZGVycycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b01hdGhMaXZlKCd4PVxcXFxNYXRoUXVpbGxNYXRoRmllbGRbcjFde30nKSkudG9FcXVhbCgneD1cXFxccGxhY2Vob2xkZXJbcjFde30nKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgYW5zd2VyIGJsb2NrIGNvbnRlbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9NYXRoTGl2ZSgnXFxcXE1hdGhRdWlsbE1hdGhGaWVsZFtyMl17N30nKSkudG9FcXVhbCgnXFxcXHBsYWNlaG9sZGVyW3IyXXs3fScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlZmF1bHRzIGFuIHVubmFtZWQgYW5zd2VyIGJsb2NrIGlkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTWF0aExpdmUoJ1xcXFxNYXRoUXVpbGxNYXRoRmllbGRbXXt9JykpLnRvRXF1YWwoYFxcXFxwbGFjZWhvbGRlclske0RFRkFVTFRfRklFTERfSUR9XXt9YCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBhbnN3ZXIgYmxvY2tzIGFuZCBuZXdsaW5lcyB0b2dldGhlcicsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b01hdGhMaXZlKGBcXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9JHtORVdMSU5FX0VNQkVEfXhgKSkudG9FcXVhbChcbiAgICAgICAgJ1xcXFxkaXNwbGF5bGluZXN7XFxcXHBsYWNlaG9sZGVyW3IxXXt9IFxcXFxcXFxcIHh9JyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmcm9tTWF0aExpdmUnLCAoKSA9PiB7XG4gICAgaXQoJ3Bhc3NlcyBwbGFpbiBsYXRleCB0aHJvdWdoJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZyb21NYXRoTGl2ZSgnXFxcXGZyYWN7MX17Mn0nKSkudG9FcXVhbCgnXFxcXGZyYWN7MX17Mn0nKTtcbiAgICB9KTtcblxuICAgIGl0KCd1bndyYXBzIGRpc3BsYXlsaW5lcyBiYWNrIHRvIG5ld0xpbmUgZW1iZWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZyb21NYXRoTGl2ZSgnXFxcXGRpc3BsYXlsaW5lc3thIFxcXFxcXFxcIGJ9JykpLnRvRXF1YWwoYGEke05FV0xJTkVfRU1CRUR9YmApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbnZlcnRzIHBsYWNlaG9sZGVycyBiYWNrIHRvIE1hdGhRdWlsbCBhbnN3ZXIgYmxvY2tzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZyb21NYXRoTGl2ZSgneD1cXFxccGxhY2Vob2xkZXJbcjFde30nKSkudG9FcXVhbCgneD1cXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcHMgYSBuZXdsaW5lIGRvY3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVkID0gYGEke05FV0xJTkVfRU1CRUR9YiR7TkVXTElORV9FTUJFRH1jYDtcblxuICAgICAgZXhwZWN0KGZyb21NYXRoTGl2ZSh0b01hdGhMaXZlKHN0b3JlZCkpKS50b0VxdWFsKHN0b3JlZCk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcHMgYW4gYW5zd2VyLWJsb2NrIGRvY3VtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVkID0gJ3g9XFxcXE1hdGhRdWlsbE1hdGhGaWVsZFtyMV17fStcXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IyXXszfSc7XG5cbiAgICAgIGV4cGVjdChmcm9tTWF0aExpdmUodG9NYXRoTGl2ZShzdG9yZWQpKSkudG9FcXVhbChzdG9yZWQpO1xuICAgIH0pO1xuXG4gICAgLy8gTWF0aExpdmUgc2VyaWFsaXNlcyBlbXB0eSBzbG90cyBhcyBcXHBsYWNlaG9sZGVye30sIHdoaWNoIE1hdGhKYXggKHVzZWQgYnlcbiAgICAvLyBAcGllLWxpYi9tYXRoLXJlbmRlcmluZyBmb3IgcHJvbXB0cy9wcmV2aWV3cykgcmVuZGVycyBhcyByZWQgZXJyb3IgdGV4dC5cbiAgICBpdCgnc3RyaXBzIHVubmFtZWQgcGxhY2Vob2xkZXJzIHRoYXQgTWF0aExpdmUgYWRkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChmcm9tTWF0aExpdmUoJ1xcXFxsb25nZGl2e1xcXFxwbGFjZWhvbGRlcnt9fScpKS50b0VxdWFsKCdcXFxcbG9uZ2Rpdnt9Jyk7XG4gICAgICBleHBlY3QoZnJvbU1hdGhMaXZlKCdcXFxcZnJhY3tcXFxccGxhY2Vob2xkZXJ7fX17XFxcXHBsYWNlaG9sZGVye319JykpLnRvRXF1YWwoJ1xcXFxmcmFje317fScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2tlZXBzIGNvbnRlbnQgaW5zaWRlIGFuIHVubmFtZWQgcGxhY2Vob2xkZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZnJvbU1hdGhMaXZlKCdcXFxcc3FydHtcXFxccGxhY2Vob2xkZXJ7N319JykpLnRvRXF1YWwoJ1xcXFxzcXJ0ezd9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBhIGJhcmUgXFxcXHBsYWNlaG9sZGVyIHdpdGggbm8gYXJndW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZnJvbU1hdGhMaXZlKCdcXFxcbG9uZ2RpdntcXFxccGxhY2Vob2xkZXJ9JykpLnRvRXF1YWwoJ1xcXFxsb25nZGl2e30nKTtcbiAgICB9KTtcblxuICAgIGl0KCduZXZlciBsZWFrcyB0aGUgdG9rZW4gXFxcXHBsYWNlaG9sZGVyJywgKCkgPT4ge1xuICAgICAgWydcXFxcbG9uZ2RpdntcXFxccGxhY2Vob2xkZXJ7fX0nLCAnXFxcXGZyYWN7XFxcXHBsYWNlaG9sZGVye319e3h9JywgJ1xcXFxwbGFjZWhvbGRlcnt9J10uZm9yRWFjaCgobCkgPT4ge1xuICAgICAgICBleHBlY3QoZnJvbU1hdGhMaXZlKGwpKS5ub3QudG9Db250YWluKCdcXFxccGxhY2Vob2xkZXInKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N0aWxsIG1hcHMgTkFNRUQgcGxhY2Vob2xkZXJzIHRvIGFuc3dlciBibG9ja3MnLCAoKSA9PiB7XG4gICAgICAvLyBuYW1lZCBvbmVzIGFyZSBhbnN3ZXIgYmxvY2tzIGFuZCBtdXN0IHN1cnZpdmVcbiAgICAgIGV4cGVjdChmcm9tTWF0aExpdmUoJ1xcXFxwbGFjZWhvbGRlcltyMV17fScpKS50b0VxdWFsKCdcXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcHMgYW5zd2VyIGJsb2NrcyBjb21iaW5lZCB3aXRoIG5ld2xpbmVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVkID0gYFxcXFxNYXRoUXVpbGxNYXRoRmllbGRbcjFde30ke05FV0xJTkVfRU1CRUR9eWA7XG5cbiAgICAgIGV4cGVjdChmcm9tTWF0aExpdmUodG9NYXRoTGl2ZShzdG9yZWQpKSkudG9FcXVhbChzdG9yZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBIE1hdGhMaXZlIG1hY3JvIHNlcmlhbGlzZXMgZnJvbSB0aGUgYXJndW1lbnRzIGl0IHdhcyBjcmVhdGVkIHdpdGgsIHNvIHRleHRcbiAgLy8gdHlwZWQgaW5zaWRlIGl0cyBleHBhbnNpb24gbmV2ZXIgY29tZXMgYmFjayBvdXQgb2YgZ2V0VmFsdWUoJ2xhdGV4JykuXG4gIC8vIEFyZ3VtZW50LXRha2luZyBwaWUgY29tbWFuZHMgbXVzdCB0aGVyZWZvcmUgYmVjb21lIG5hdGl2ZSBjb25zdHJ1Y3RzIGJlZm9yZVxuICAvLyB0aGV5IHJlYWNoIGEgbWF0aGZpZWxkLlxuICBkZXNjcmliZSgndG9OYXRpdmVDb21tYW5kcycsICgpID0+IHtcbiAgICBpdCgnZXhwYW5kcyBcXFxcbG9uZ2RpdiB0byBuYXRpdmUgXFxcXGVuY2xvc2UnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnXFxcXGxvbmdkaXZ7MTIzNH0nKSkudG9FcXVhbCgnXFxcXGVuY2xvc2V7bG9uZ2Rpdn17MTIzNH0nKTtcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKCdcXFxcbG9uZ2Rpdnt9JykpLnRvRXF1YWwoJ1xcXFxlbmNsb3Nle2xvbmdkaXZ9e30nKTtcbiAgICB9KTtcblxuICAgIGl0KCdleHBhbmRzIFxcXFxvdmVyYXJjIHRvIG5hdGl2ZSBcXFxcb3ZlcnBhcmVuJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHMoJ1xcXFxvdmVyYXJje0FCfScpKS50b0VxdWFsKCdcXFxcb3ZlcnBhcmVue0FCfScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2V4cGFuZHMgXFxcXGFicyB0byBuYXRpdmUgXFxcXGxlZnR8Li5cXFxccmlnaHR8JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHMoJ1xcXFxhYnN7eH0nKSkudG9FcXVhbCgnXFxcXGxlZnR8eFxcXFxyaWdodHwnKTtcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKCdcXFxcYWJze30nKSkudG9FcXVhbCgnXFxcXGxlZnR8XFxcXHJpZ2h0fCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZXMgbmVzdGVkIGJyYWNlcyBpbnNpZGUgXFxcXGFicycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKCdcXFxcYWJze1xcXFxmcmFjezF9ezJ9fScpKS50b0VxdWFsKCdcXFxcbGVmdHxcXFxcZnJhY3sxfXsyfVxcXFxyaWdodHwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVzIHNldmVyYWwgb2NjdXJyZW5jZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnXFxcXGFic3thfStcXFxcYWJze2J9JykpLnRvRXF1YWwoJ1xcXFxsZWZ0fGFcXFxccmlnaHR8K1xcXFxsZWZ0fGJcXFxccmlnaHR8Jyk7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnXFxcXGxvbmdkaXZ7MX1cXFxcbG9uZ2RpdnsyfScpKS50b0VxdWFsKCdcXFxcZW5jbG9zZXtsb25nZGl2fXsxfVxcXFxlbmNsb3Nle2xvbmdkaXZ9ezJ9Jyk7XG4gICAgfSk7XG5cbiAgICAvLyBgJWAgc3RhcnRzIGEgY29tbWVudCBpbiByZWFsIExhVGVYLCBzbyBNYXRoTGl2ZSBkcm9wcyBpdCBhbmQgZXZlcnl0aGluZ1xuICAgIC8vIGFmdGVyIGl0LiBNYXRoUXVpbGwgaGFkIG5vIGNvbW1lbnRzLCBzbyBsYXRleCBhdXRob3JlZCB1bmRlciBpdCAtIG9yIGJ5XG4gICAgLy8gaGFuZCAtIGNhbiBjYXJyeSBhIGJhcmUgYCVgIHRoYXQgd291bGQgc2lsZW50bHkgdHJ1bmNhdGUgdGhlIGV4cHJlc3Npb24uXG4gICAgaXQoJ2VzY2FwZXMgYSBiYXJlICUgc28gaXQgY2Fubm90IGNvbW1lbnQgb3V0IHRoZSByZXN0IG9mIHRoZSBsaW5lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHMoJyUnKSkudG9FcXVhbCgnXFxcXCUnKTtcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKCc1MCUnKSkudG9FcXVhbCgnNTBcXFxcJScpO1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHMoJ3gleScpKS50b0VxdWFsKCd4XFxcXCV5Jyk7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnYSViJWMnKSkudG9FcXVhbCgnYVxcXFwlYlxcXFwlYycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2xlYXZlcyBhbiBhbHJlYWR5LWVzY2FwZWQgJSBhbG9uZScsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKCdcXFxcJScpKS50b0VxdWFsKCdcXFxcJScpO1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHMoJzUwXFxcXCUnKSkudG9FcXVhbCgnNTBcXFxcJScpO1xuICAgICAgLy8gaWRlbXBvdGVudDogdG9NYXRoTGl2ZSBtYXkgcnVuIG92ZXIgbGF0ZXggdGhhdCBjYW1lIGJhY2sgb3V0IG9mIGEgZmllbGRcbiAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKHRvTmF0aXZlQ29tbWFuZHMoJzUwJScpKSkudG9FcXVhbCgnNTBcXFxcJScpO1xuICAgIH0pO1xuXG4gICAgLy8gYFxcXFxgIGlzIGEgbGluZSBicmVhaywgbm90IGFuIGVzY2FwZSwgc28gdGhlIGAlYCBhZnRlciBpdCBpcyBzdGlsbCBiYXJlLlxuICAgIGl0KCdjb3VudHMgYmFja3NsYXNoZXMgdG8gZGVjaWRlIHdoZXRoZXIgYSAlIGlzIGVzY2FwZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnYVxcXFxcXFxcJWInKSkudG9FcXVhbCgnYVxcXFxcXFxcXFxcXCViJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGVhdmVzIG90aGVyIGxhdGV4IHVudG91Y2hlZCcsICgpID0+IHtcbiAgICAgIFsnXFxcXGZyYWN7MX17Mn0nLCAnXFxcXHBpJywgJ1xcXFxzcXJ0e3h9JywgJ1xcXFxvdmVybGluZXtBQn0nXS5mb3JFYWNoKChsKSA9PiB7XG4gICAgICAgIGV4cGVjdCh0b05hdGl2ZUNvbW1hbmRzKGwpKS50b0VxdWFsKGwpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBudWxsaXNoIGlucHV0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHRvTmF0aXZlQ29tbWFuZHModW5kZWZpbmVkKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QodG9OYXRpdmVDb21tYW5kcygnJykpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGFwcGxpZWQgYnkgdG9NYXRoTGl2ZScsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0b01hdGhMaXZlKCdcXFxcbG9uZ2Rpdns1fScpKS50b0VxdWFsKCdcXFxcZW5jbG9zZXtsb25nZGl2fXs1fScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGxlYXZlIGEgcGllIG1hY3JvIGluIHdoYXQgcmVhY2hlcyB0aGUgZmllbGQnLCAoKSA9PiB7XG4gICAgICBbJ1xcXFxsb25nZGl2ezd9JywgJ1xcXFxhYnN7N30nLCAnXFxcXG92ZXJhcmN7N30nXS5mb3JFYWNoKChsKSA9PiB7XG4gICAgICAgIGNvbnN0IG91dCA9IHRvTWF0aExpdmUobCk7XG5cbiAgICAgICAgZXhwZWN0KG91dCkubm90LnRvTWF0Y2goL1xcXFxsb25nZGl2fFxcXFxhYnN8XFxcXG92ZXJhcmMvKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmllbGRJZHMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgaWRzIGluIGRvY3VtZW50IG9yZGVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZpZWxkSWRzKCdcXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9K1xcXFxNYXRoUXVpbGxNYXRoRmllbGRbcjJde30nKSkudG9FcXVhbChbJ3IxJywgJ3IyJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgW10gd2hlbiB0aGVyZSBhcmUgbm9uZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChmaWVsZElkcygneCt5JykpLnRvRXF1YWwoW10pO1xuICAgICAgZXhwZWN0KGZpZWxkSWRzKHVuZGVmaW5lZCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIHJlcGVhdGFibGUgKHJlZ2V4IGxhc3RJbmRleCBpcyByZXNldCknLCAoKSA9PiB7XG4gICAgICBjb25zdCBsYXRleCA9ICdcXFxcTWF0aFF1aWxsTWF0aEZpZWxkW3IxXXt9JztcblxuICAgICAgZXhwZWN0KGZpZWxkSWRzKGxhdGV4KSkudG9FcXVhbChbJ3IxJ10pO1xuICAgICAgZXhwZWN0KGZpZWxkSWRzKGxhdGV4KSkudG9FcXVhbChbJ3IxJ10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgna2V5VG9BY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3ByZWZlcnMgbGF0ZXggd2hlbiB0aGVyZSBpcyBubyBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsgbGF0ZXg6ICdcXFxccGknLCB3cml0ZTogJ3AnIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXFxcXHBpJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIHdyaXRlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsgd3JpdGU6ICd4JyB9KSkudG9FcXVhbCh7IHR5cGU6ICdpbnNlcnQnLCB2YWx1ZTogJ3gnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2V4cGFuZHMgY29tbWFuZHMgdGhhdCB0YWtlIGFyZ3VtZW50cyBpbnRvIHBsYWNlaG9sZGVycycsICgpID0+IHtcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGNvbW1hbmQ6ICdcXFxcZnJhYycgfSkpLnRvRXF1YWwoeyB0eXBlOiAnaW5zZXJ0JywgdmFsdWU6ICdcXFxcZnJhY3sjP317Iz99JyB9KTtcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGNvbW1hbmQ6ICdcXFxcc3FydCcgfSkpLnRvRXF1YWwoeyB0eXBlOiAnaW5zZXJ0JywgdmFsdWU6ICdcXFxcc3FydHsjP30nIH0pO1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsgY29tbWFuZDogJ14nIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXnsjP30nIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gTWF0aFF1aWxsJ3MgYC9gIHR1cm5lZCB0aGUgcHJlY2VkaW5nIGV4cHJlc3Npb24gaW50byB0aGUgbnVtZXJhdG9yOiB0eXBlXG4gICAgLy8gNSwgcHJlc3MgdGhlIGtleSwgZ2V0IDUvXyB3aXRoIHRoZSBjYXJldCBpbiB0aGUgZGVub21pbmF0b3IuIGAjQGAgaXNcbiAgICAvLyBNYXRoTGl2ZSdzIFwic2VsZWN0aW9uLCBvciB0aGUgaXRlbSBiZWZvcmUgdGhlIGN1cnNvclwiIHRva2VuLCBhbmQgaXMgd2hhdFxuICAgIC8vIE1hdGhMaXZlIGJpbmRzIHRvIGAvYCBpdHNlbGYuXG4gICAgaXQoJ2RpdmlzaW9uIHRha2VzIHRoZSBwcmVjZWRpbmcgaXRlbSBhcyB0aGUgbnVtZXJhdG9yJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsgY29tbWFuZDogJy8nIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXFxcXGZyYWN7I0B9eyM/fScgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gZXhwbGljaXQgYmxhbmstb3Zlci1ibGFuayBmcmFjdGlvbiBzdGF5cyBlbXB0eScsICgpID0+IHtcbiAgICAgIC8vIGRpc3RpbmN0IGZyb20gYC9gOiB0aGlzIGtleSBpcyBtZWFudCB0byBpbnNlcnQgdHdvIGVtcHR5IHNsb3RzXG4gICAgICBleHBlY3Qoa2V5VG9BY3Rpb24oeyBjb21tYW5kOiAnXFxcXGZyYWMnIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXFxcXGZyYWN7Iz99eyM/fScgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhlIHgtb3Zlci1ibGFuayBrZXkgcm91dGVzIHRocm91Z2ggZGl2aXNpb24nLCAoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICAgIGNvbnN0IHsgeE92ZXJCbGFuayB9ID0gcmVxdWlyZSgnLi4va2V5cy9mcmFjdGlvbnMnKTtcblxuICAgICAgZXhwZWN0KHhPdmVyQmxhbmsuY29tbWFuZCkudG9FcXVhbCgnLycpO1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHhPdmVyQmxhbmspLnZhbHVlKS50b0VxdWFsKCdcXFxcZnJhY3sjQH17Iz99Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIGFyZ3VtZW50LWxlc3MgY29tbWFuZHMgdGhyb3VnaCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGNvbW1hbmQ6ICdcXFxccGknIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXFxcXHBpJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjb25jYXRlbmF0ZXMgYXJyYXkgY29tbWFuZHMgKE1hdGhRdWlsbCBjbWQoKSBhcHBsaWVkIHRoZW0gaW4gc2VxdWVuY2UpJywgKCkgPT4ge1xuICAgICAgLy8gTWVhc3VyZWQgQW5nbGVcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGNvbW1hbmQ6IFsnbScsICdcXFxcYW5nbGUnXSB9KSkudG9FcXVhbCh7IHR5cGU6ICdpbnNlcnQnLCB2YWx1ZTogJ21cXFxcYW5nbGUnIH0pO1xuICAgICAgLy8gbG9nIGJhc2UgbiAtIHRoZSBgX2AgcGFydCBtdXN0IHN0aWxsIGV4cGFuZCB0byBhIHBsYWNlaG9sZGVyXG4gICAgICBleHBlY3Qoa2V5VG9BY3Rpb24oeyBjb21tYW5kOiBbJ1xcXFxsb2cnLCAnXyddIH0pKS50b0VxdWFsKHsgdHlwZTogJ2luc2VydCcsIHZhbHVlOiAnXFxcXGxvZ197Iz99JyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdhbHdheXMgcmV0dXJucyBhIHN0cmluZyB2YWx1ZSBmb3IgaW5zZXJ0IGFjdGlvbnMnLCAoKSA9PiB7XG4gICAgICBbeyBjb21tYW5kOiBbJ20nLCAnXFxcXGFuZ2xlJ10gfSwgeyBjb21tYW5kOiAnXFxcXGZyYWMnIH0sIHsgd3JpdGU6ICd4JyB9LCB7IGxhdGV4OiAnXFxcXHBpJyB9XS5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgIGV4cGVjdCh0eXBlb2Yga2V5VG9BY3Rpb24oaykudmFsdWUpLnRvQmUoJ3N0cmluZycpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWFwcyBrZXlzdHJva2VzIHRvIE1hdGhMaXZlIHNlbGVjdG9ycycsICgpID0+IHtcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGtleXN0cm9rZTogJ0xlZnQnIH0pKS50b0VxdWFsKHsgdHlwZTogJ2NvbW1hbmQnLCB2YWx1ZTogJ21vdmVUb1ByZXZpb3VzQ2hhcicgfSk7XG4gICAgICBleHBlY3Qoa2V5VG9BY3Rpb24oeyBrZXlzdHJva2U6ICdSaWdodCcgfSkpLnRvRXF1YWwoeyB0eXBlOiAnY29tbWFuZCcsIHZhbHVlOiAnbW92ZVRvTmV4dENoYXInIH0pO1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsga2V5c3Ryb2tlOiAnQmFja3NwYWNlJyB9KSkudG9FcXVhbCh7IHR5cGU6ICdjb21tYW5kJywgdmFsdWU6ICdkZWxldGVCYWNrd2FyZCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyB1bmRlZmluZWQgZm9yIHVua25vd24vZW1wdHkgaW5wdXQnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoa2V5VG9BY3Rpb24odW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHt9KSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsga2V5c3Ryb2tlOiAnTm9wZScgfSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdsYXRleCB3aW5zIG92ZXIgY29tbWFuZCBvbmx5IHdoZW4gY29tbWFuZCBpcyBhYnNlbnQnLCAoKSA9PiB7XG4gICAgICAvLyBhIGtleSB3aXRoIGJvdGggc2hvdWxkIHVzZSB0aGUgY29tbWFuZCBwYXRoIChtYXRjaGVzIE1hdGhJbnB1dC5rZXlwYWRQcmVzcylcbiAgICAgIGV4cGVjdChrZXlUb0FjdGlvbih7IGxhdGV4OiAnXFxcXGZyYWN7fXt9JywgY29tbWFuZDogJ1xcXFxmcmFjJyB9KSkudG9FcXVhbCh7XG4gICAgICAgIHR5cGU6ICdpbnNlcnQnLFxuICAgICAgICB2YWx1ZTogJ1xcXFxmcmFjeyM/fXsjP30nLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxZQUFBLEdBQUFDLE9BQUE7QUFVQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxZQUFNO0VBQzdCQSxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQU07SUFDM0JDLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxZQUFNO01BQ3JDQyxNQUFNLENBQUMsSUFBQUMsdUJBQVUsRUFBQyxjQUFjLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQzVELENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsdUJBQXVCLEVBQUUsWUFBTTtNQUNoQ0MsTUFBTSxDQUFDLElBQUFDLHVCQUFVLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLEVBQUUsQ0FBQztNQUNsQ0YsTUFBTSxDQUFDLElBQUFDLHVCQUFVLEVBQUNFLFNBQVMsQ0FBQyxDQUFDLENBQUNELE9BQU8sQ0FBQyxFQUFFLENBQUM7TUFDekNGLE1BQU0sQ0FBQyxJQUFBQyx1QkFBVSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxZQUFNO01BQzlEQyxNQUFNLENBQUMsSUFBQUMsdUJBQVUsTUFBQUcsTUFBQSxDQUFLQywwQkFBYSxNQUFHLENBQUMsQ0FBQyxDQUFDSCxPQUFPLENBQUMsMEJBQTBCLENBQUM7SUFDOUUsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxZQUFNO01BQzNDQyxNQUFNLENBQUMsSUFBQUMsdUJBQVUsTUFBQUcsTUFBQSxDQUFLQywwQkFBYSxPQUFBRCxNQUFBLENBQUlDLDBCQUFhLE1BQUcsQ0FBQyxDQUFDLENBQUNILE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQztJQUN0RyxDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLFlBQU07TUFDM0RDLE1BQU0sQ0FBQyxJQUFBQyx1QkFBVSxFQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLHVCQUF1QixDQUFDO0lBQ3JGLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsWUFBTTtNQUN6Q0MsTUFBTSxDQUFDLElBQUFDLHVCQUFVLEVBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsc0JBQXNCLENBQUM7SUFDbkYsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxZQUFNO01BQzlDQyxNQUFNLENBQUMsSUFBQUMsdUJBQVUsRUFBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUNDLE9BQU8sa0JBQUFFLE1BQUEsQ0FBa0JFLDZCQUFnQixRQUFLLENBQUM7SUFDaEcsQ0FBQyxDQUFDO0lBRUZQLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxZQUFNO01BQ3REQyxNQUFNLENBQUMsSUFBQUMsdUJBQVUsK0JBQUFHLE1BQUEsQ0FBOEJDLDBCQUFhLE1BQUcsQ0FBQyxDQUFDLENBQUNILE9BQU8sQ0FDdkUsNENBQ0YsQ0FBQztJQUNILENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGSixRQUFRLENBQUMsY0FBYyxFQUFFLFlBQU07SUFDN0JDLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxZQUFNO01BQ3JDQyxNQUFNLENBQUMsSUFBQU8seUJBQVksRUFBQyxjQUFjLENBQUMsQ0FBQyxDQUFDTCxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQzlELENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsWUFBTTtNQUN0REMsTUFBTSxDQUFDLElBQUFPLHlCQUFZLEVBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDTCxPQUFPLEtBQUFFLE1BQUEsQ0FBS0MsMEJBQWEsTUFBRyxDQUFDO0lBQ2hGLENBQUMsQ0FBQztJQUVGTixFQUFFLENBQUMsdURBQXVELEVBQUUsWUFBTTtNQUNoRUMsTUFBTSxDQUFDLElBQUFPLHlCQUFZLEVBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDTCxPQUFPLENBQUMsOEJBQThCLENBQUM7SUFDdkYsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxZQUFNO01BQ3pDLElBQU1TLE1BQU0sT0FBQUosTUFBQSxDQUFPQywwQkFBYSxPQUFBRCxNQUFBLENBQUlDLDBCQUFhLE1BQUc7TUFFcERMLE1BQU0sQ0FBQyxJQUFBTyx5QkFBWSxFQUFDLElBQUFOLHVCQUFVLEVBQUNPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQ04sT0FBTyxDQUFDTSxNQUFNLENBQUM7SUFDMUQsQ0FBQyxDQUFDO0lBRUZULEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxZQUFNO01BQy9DLElBQU1TLE1BQU0sR0FBRywwREFBMEQ7TUFFekVSLE1BQU0sQ0FBQyxJQUFBTyx5QkFBWSxFQUFDLElBQUFOLHVCQUFVLEVBQUNPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQ04sT0FBTyxDQUFDTSxNQUFNLENBQUM7SUFDMUQsQ0FBQyxDQUFDOztJQUVGO0lBQ0E7SUFDQVQsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLFlBQU07TUFDekRDLE1BQU0sQ0FBQyxJQUFBTyx5QkFBWSxFQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQ0wsT0FBTyxDQUFDLGFBQWEsQ0FBQztNQUN6RUYsTUFBTSxDQUFDLElBQUFPLHlCQUFZLEVBQUMsMENBQTBDLENBQUMsQ0FBQyxDQUFDTCxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ3hGLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsWUFBTTtNQUN0REMsTUFBTSxDQUFDLElBQUFPLHlCQUFZLEVBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDTCxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsWUFBTTtNQUN4REMsTUFBTSxDQUFDLElBQUFPLHlCQUFZLEVBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDTCxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQ3pFLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMscUNBQXFDLEVBQUUsWUFBTTtNQUM5QyxDQUFDLDRCQUE0QixFQUFFLDRCQUE0QixFQUFFLGlCQUFpQixDQUFDLENBQUNVLE9BQU8sQ0FBQyxVQUFDQyxDQUFDLEVBQUs7UUFDN0ZWLE1BQU0sQ0FBQyxJQUFBTyx5QkFBWSxFQUFDRyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxHQUFHLENBQUNDLFNBQVMsQ0FBQyxlQUFlLENBQUM7TUFDeEQsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUZiLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxZQUFNO01BQ3pEO01BQ0FDLE1BQU0sQ0FBQyxJQUFBTyx5QkFBWSxFQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQ0wsT0FBTyxDQUFDLDRCQUE0QixDQUFDO0lBQ25GLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsWUFBTTtNQUMzRCxJQUFNUyxNQUFNLGdDQUFBSixNQUFBLENBQWdDQywwQkFBYSxNQUFHO01BRTVETCxNQUFNLENBQUMsSUFBQU8seUJBQVksRUFBQyxJQUFBTix1QkFBVSxFQUFDTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUNOLE9BQU8sQ0FBQ00sTUFBTSxDQUFDO0lBQzFELENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQzs7RUFFRjtFQUNBO0VBQ0E7RUFDQTtFQUNBVixRQUFRLENBQUMsa0JBQWtCLEVBQUUsWUFBTTtJQUNqQ0MsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLFlBQU07TUFDaERDLE1BQU0sQ0FBQyxJQUFBYSw2QkFBZ0IsRUFBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUNYLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQztNQUMvRUYsTUFBTSxDQUFDLElBQUFhLDZCQUFnQixFQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUNYLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztJQUN6RSxDQUFDLENBQUM7SUFFRkgsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLFlBQU07TUFDbERDLE1BQU0sQ0FBQyxJQUFBYSw2QkFBZ0IsRUFBQyxlQUFlLENBQUMsQ0FBQyxDQUFDWCxPQUFPLENBQUMsaUJBQWlCLENBQUM7SUFDdEUsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxZQUFNO01BQ3BEQyxNQUFNLENBQUMsSUFBQWEsNkJBQWdCLEVBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQ1gsT0FBTyxDQUFDLGtCQUFrQixDQUFDO01BQ2hFRixNQUFNLENBQUMsSUFBQWEsNkJBQWdCLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQ1gsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0lBQ2hFLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsWUFBTTtNQUM3Q0MsTUFBTSxDQUFDLElBQUFhLDZCQUFnQixFQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQ1gsT0FBTyxDQUFDLDZCQUE2QixDQUFDO0lBQ3hGLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsNkJBQTZCLEVBQUUsWUFBTTtNQUN0Q0MsTUFBTSxDQUFDLElBQUFhLDZCQUFnQixFQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQ1gsT0FBTyxDQUFDLG1DQUFtQyxDQUFDO01BQzFGRixNQUFNLENBQUMsSUFBQWEsNkJBQWdCLEVBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDWCxPQUFPLENBQUMsNENBQTRDLENBQUM7SUFDNUcsQ0FBQyxDQUFDOztJQUVGO0lBQ0E7SUFDQTtJQUNBSCxFQUFFLENBQUMsZ0VBQWdFLEVBQUUsWUFBTTtNQUN6RUMsTUFBTSxDQUFDLElBQUFhLDZCQUFnQixFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUM7TUFDNUNGLE1BQU0sQ0FBQyxJQUFBYSw2QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDWCxPQUFPLENBQUMsT0FBTyxDQUFDO01BQ2hERixNQUFNLENBQUMsSUFBQWEsNkJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQ1gsT0FBTyxDQUFDLE9BQU8sQ0FBQztNQUNoREYsTUFBTSxDQUFDLElBQUFhLDZCQUFnQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUNYLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDeEQsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxZQUFNO01BQzVDQyxNQUFNLENBQUMsSUFBQWEsNkJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQztNQUM5Q0YsTUFBTSxDQUFDLElBQUFhLDZCQUFnQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUNYLE9BQU8sQ0FBQyxPQUFPLENBQUM7TUFDbEQ7TUFDQUYsTUFBTSxDQUFDLElBQUFhLDZCQUFnQixFQUFDLElBQUFBLDZCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQ1gsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNwRSxDQUFDLENBQUM7O0lBRUY7SUFDQUgsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLFlBQU07TUFDOURDLE1BQU0sQ0FBQyxJQUFBYSw2QkFBZ0IsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDWCxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQzFELENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsWUFBTTtNQUN2QyxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUNVLE9BQU8sQ0FBQyxVQUFDQyxDQUFDLEVBQUs7UUFDckVWLE1BQU0sQ0FBQyxJQUFBYSw2QkFBZ0IsRUFBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQ1IsT0FBTyxDQUFDUSxDQUFDLENBQUM7TUFDeEMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUZYLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxZQUFNO01BQ2hDQyxNQUFNLENBQUMsSUFBQWEsNkJBQWdCLEVBQUNWLFNBQVMsQ0FBQyxDQUFDLENBQUNELE9BQU8sQ0FBQyxFQUFFLENBQUM7TUFDL0NGLE1BQU0sQ0FBQyxJQUFBYSw2QkFBZ0IsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDWCxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQzFDLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsMEJBQTBCLEVBQUUsWUFBTTtNQUNuQ0MsTUFBTSxDQUFDLElBQUFDLHVCQUFVLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLHVCQUF1QixDQUFDO0lBQ3JFLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsc0RBQXNELEVBQUUsWUFBTTtNQUMvRCxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUNVLE9BQU8sQ0FBQyxVQUFDQyxDQUFDLEVBQUs7UUFDMUQsSUFBTUksR0FBRyxHQUFHLElBQUFiLHVCQUFVLEVBQUNTLENBQUMsQ0FBQztRQUV6QlYsTUFBTSxDQUFDYyxHQUFHLENBQUMsQ0FBQ0gsR0FBRyxDQUFDSSxPQUFPLENBQUMsMkJBQTJCLENBQUM7TUFDdEQsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZqQixRQUFRLENBQUMsVUFBVSxFQUFFLFlBQU07SUFDekJDLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxZQUFNO01BQ3hDQyxNQUFNLENBQUMsSUFBQWdCLHFCQUFRLEVBQUMsdURBQXVELENBQUMsQ0FBQyxDQUFDZCxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakcsQ0FBQyxDQUFDO0lBRUZILEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxZQUFNO01BQ3pDQyxNQUFNLENBQUMsSUFBQWdCLHFCQUFRLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQ2QsT0FBTyxDQUFDLEVBQUUsQ0FBQztNQUNuQ0YsTUFBTSxDQUFDLElBQUFnQixxQkFBUSxFQUFDYixTQUFTLENBQUMsQ0FBQyxDQUFDRCxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ3pDLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsWUFBTTtNQUNuRCxJQUFNa0IsS0FBSyxHQUFHLDRCQUE0QjtNQUUxQ2pCLE1BQU0sQ0FBQyxJQUFBZ0IscUJBQVEsRUFBQ0MsS0FBSyxDQUFDLENBQUMsQ0FBQ2YsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDdkNGLE1BQU0sQ0FBQyxJQUFBZ0IscUJBQVEsRUFBQ0MsS0FBSyxDQUFDLENBQUMsQ0FBQ2YsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZKLFFBQVEsQ0FBQyxhQUFhLEVBQUUsWUFBTTtJQUM1QkMsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLFlBQU07TUFDakRDLE1BQU0sQ0FBQyxJQUFBa0Isd0JBQVcsRUFBQztRQUFFRCxLQUFLLEVBQUUsTUFBTTtRQUFFRSxLQUFLLEVBQUU7TUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDakIsT0FBTyxDQUFDO1FBQUVrQixJQUFJLEVBQUUsUUFBUTtRQUFFQyxLQUFLLEVBQUU7TUFBTyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDO0lBRUZ0QixFQUFFLENBQUMsWUFBWSxFQUFFLFlBQU07TUFDckJDLE1BQU0sQ0FBQyxJQUFBa0Isd0JBQVcsRUFBQztRQUFFQyxLQUFLLEVBQUU7TUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDakIsT0FBTyxDQUFDO1FBQUVrQixJQUFJLEVBQUUsUUFBUTtRQUFFQyxLQUFLLEVBQUU7TUFBSSxDQUFDLENBQUM7SUFDN0UsQ0FBQyxDQUFDO0lBRUZ0QixFQUFFLENBQUMsd0RBQXdELEVBQUUsWUFBTTtNQUNqRUMsTUFBTSxDQUFDLElBQUFrQix3QkFBVyxFQUFDO1FBQUVJLE9BQU8sRUFBRTtNQUFTLENBQUMsQ0FBQyxDQUFDLENBQUNwQixPQUFPLENBQUM7UUFBRWtCLElBQUksRUFBRSxRQUFRO1FBQUVDLEtBQUssRUFBRTtNQUFpQixDQUFDLENBQUM7TUFDL0ZyQixNQUFNLENBQUMsSUFBQWtCLHdCQUFXLEVBQUM7UUFBRUksT0FBTyxFQUFFO01BQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQ3BCLE9BQU8sQ0FBQztRQUFFa0IsSUFBSSxFQUFFLFFBQVE7UUFBRUMsS0FBSyxFQUFFO01BQWEsQ0FBQyxDQUFDO01BQzNGckIsTUFBTSxDQUFDLElBQUFrQix3QkFBVyxFQUFDO1FBQUVJLE9BQU8sRUFBRTtNQUFJLENBQUMsQ0FBQyxDQUFDLENBQUNwQixPQUFPLENBQUM7UUFBRWtCLElBQUksRUFBRSxRQUFRO1FBQUVDLEtBQUssRUFBRTtNQUFRLENBQUMsQ0FBQztJQUNuRixDQUFDLENBQUM7O0lBRUY7SUFDQTtJQUNBO0lBQ0E7SUFDQXRCLEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxZQUFNO01BQzdEQyxNQUFNLENBQUMsSUFBQWtCLHdCQUFXLEVBQUM7UUFBRUksT0FBTyxFQUFFO01BQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ3BCLE9BQU8sQ0FBQztRQUFFa0IsSUFBSSxFQUFFLFFBQVE7UUFBRUMsS0FBSyxFQUFFO01BQWlCLENBQUMsQ0FBQztJQUM1RixDQUFDLENBQUM7SUFFRnRCLEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxZQUFNO01BQzVEO01BQ0FDLE1BQU0sQ0FBQyxJQUFBa0Isd0JBQVcsRUFBQztRQUFFSSxPQUFPLEVBQUU7TUFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDcEIsT0FBTyxDQUFDO1FBQUVrQixJQUFJLEVBQUUsUUFBUTtRQUFFQyxLQUFLLEVBQUU7TUFBaUIsQ0FBQyxDQUFDO0lBQ2pHLENBQUMsQ0FBQztJQUVGdEIsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLFlBQU07TUFDdkQ7TUFDQSxJQUFBd0IsUUFBQSxHQUF1QjFCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztRQUEzQzJCLFVBQVUsR0FBQUQsUUFBQSxDQUFWQyxVQUFVO01BRWxCeEIsTUFBTSxDQUFDd0IsVUFBVSxDQUFDRixPQUFPLENBQUMsQ0FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUM7TUFDdkNGLE1BQU0sQ0FBQyxJQUFBa0Isd0JBQVcsRUFBQ00sVUFBVSxDQUFDLENBQUNILEtBQUssQ0FBQyxDQUFDbkIsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0lBQ2pFLENBQUMsQ0FBQztJQUVGSCxFQUFFLENBQUMsdUNBQXVDLEVBQUUsWUFBTTtNQUNoREMsTUFBTSxDQUFDLElBQUFrQix3QkFBVyxFQUFDO1FBQUVJLE9BQU8sRUFBRTtNQUFPLENBQUMsQ0FBQyxDQUFDLENBQUNwQixPQUFPLENBQUM7UUFBRWtCLElBQUksRUFBRSxRQUFRO1FBQUVDLEtBQUssRUFBRTtNQUFPLENBQUMsQ0FBQztJQUNyRixDQUFDLENBQUM7SUFFRnRCLEVBQUUsQ0FBQyx3RUFBd0UsRUFBRSxZQUFNO01BQ2pGO01BQ0FDLE1BQU0sQ0FBQyxJQUFBa0Isd0JBQVcsRUFBQztRQUFFSSxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsU0FBUztNQUFFLENBQUMsQ0FBQyxDQUFDLENBQUNwQixPQUFPLENBQUM7UUFBRWtCLElBQUksRUFBRSxRQUFRO1FBQUVDLEtBQUssRUFBRTtNQUFXLENBQUMsQ0FBQztNQUNqRztNQUNBckIsTUFBTSxDQUFDLElBQUFrQix3QkFBVyxFQUFDO1FBQUVJLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHO01BQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ3BCLE9BQU8sQ0FBQztRQUFFa0IsSUFBSSxFQUFFLFFBQVE7UUFBRUMsS0FBSyxFQUFFO01BQWEsQ0FBQyxDQUFDO0lBQ25HLENBQUMsQ0FBQztJQUVGdEIsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLFlBQU07TUFDM0QsQ0FBQztRQUFFdUIsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLFNBQVM7TUFBRSxDQUFDLEVBQUU7UUFBRUEsT0FBTyxFQUFFO01BQVMsQ0FBQyxFQUFFO1FBQUVILEtBQUssRUFBRTtNQUFJLENBQUMsRUFBRTtRQUFFRixLQUFLLEVBQUU7TUFBTyxDQUFDLENBQUMsQ0FBQ1IsT0FBTyxDQUFDLFVBQUNnQixDQUFDLEVBQUs7UUFDdkd6QixNQUFNLEtBQUEwQixRQUFBLGFBQVEsSUFBQVIsd0JBQVcsRUFBQ08sQ0FBQyxDQUFDLENBQUNKLEtBQUssRUFBQyxDQUFDTSxJQUFJLENBQUMsUUFBUSxDQUFDO01BQ3BELENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGNUIsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLFlBQU07TUFDaERDLE1BQU0sQ0FBQyxJQUFBa0Isd0JBQVcsRUFBQztRQUFFVSxTQUFTLEVBQUU7TUFBTyxDQUFDLENBQUMsQ0FBQyxDQUFDMUIsT0FBTyxDQUFDO1FBQUVrQixJQUFJLEVBQUUsU0FBUztRQUFFQyxLQUFLLEVBQUU7TUFBcUIsQ0FBQyxDQUFDO01BQ3BHckIsTUFBTSxDQUFDLElBQUFrQix3QkFBVyxFQUFDO1FBQUVVLFNBQVMsRUFBRTtNQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMxQixPQUFPLENBQUM7UUFBRWtCLElBQUksRUFBRSxTQUFTO1FBQUVDLEtBQUssRUFBRTtNQUFpQixDQUFDLENBQUM7TUFDakdyQixNQUFNLENBQUMsSUFBQWtCLHdCQUFXLEVBQUM7UUFBRVUsU0FBUyxFQUFFO01BQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzFCLE9BQU8sQ0FBQztRQUFFa0IsSUFBSSxFQUFFLFNBQVM7UUFBRUMsS0FBSyxFQUFFO01BQWlCLENBQUMsQ0FBQztJQUN2RyxDQUFDLENBQUM7SUFFRnRCLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxZQUFNO01BQ3BEQyxNQUFNLENBQUMsSUFBQWtCLHdCQUFXLEVBQUNmLFNBQVMsQ0FBQyxDQUFDLENBQUMwQixhQUFhLENBQUMsQ0FBQztNQUM5QzdCLE1BQU0sQ0FBQyxJQUFBa0Isd0JBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNXLGFBQWEsQ0FBQyxDQUFDO01BQ3ZDN0IsTUFBTSxDQUFDLElBQUFrQix3QkFBVyxFQUFDO1FBQUVVLFNBQVMsRUFBRTtNQUFPLENBQUMsQ0FBQyxDQUFDLENBQUNDLGFBQWEsQ0FBQyxDQUFDO0lBQzVELENBQUMsQ0FBQztJQUVGOUIsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLFlBQU07TUFDOUQ7TUFDQUMsTUFBTSxDQUFDLElBQUFrQix3QkFBVyxFQUFDO1FBQUVELEtBQUssRUFBRSxZQUFZO1FBQUVLLE9BQU8sRUFBRTtNQUFTLENBQUMsQ0FBQyxDQUFDLENBQUNwQixPQUFPLENBQUM7UUFDdEVrQixJQUFJLEVBQUUsUUFBUTtRQUNkQyxLQUFLLEVBQUU7TUFDVCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|