@libs-ui/components-inputs-quill 0.1.1-1
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/README.md +3 -0
- package/blots-custom/div.component.d.ts +5 -0
- package/blots-custom/image.component.d.ts +6 -0
- package/blots-custom/mention.component.d.ts +19 -0
- package/esm2022/blots-custom/div.component.mjs +6 -0
- package/esm2022/blots-custom/image.component.mjs +13 -0
- package/esm2022/blots-custom/mention.component.mjs +34 -0
- package/esm2022/indent-attributor/indent-attributor.component.mjs +20 -0
- package/esm2022/index.mjs +4 -0
- package/esm2022/interfaces/quill.interface.mjs +2 -0
- package/esm2022/libs-ui-components-inputs-quill.mjs +5 -0
- package/esm2022/link/link.component.mjs +52 -0
- package/esm2022/quill.component.mjs +878 -0
- package/esm2022/quill2x.component.mjs +150 -0
- package/esm2022/upload-image/upload-image.component.mjs +67 -0
- package/esm2022/utils/quill.define.mjs +429 -0
- package/esm2022/utils/quill2x.define.mjs +210 -0
- package/fesm2022/libs-ui-components-inputs-quill.mjs +1836 -0
- package/fesm2022/libs-ui-components-inputs-quill.mjs.map +1 -0
- package/indent-attributor/indent-attributor.component.d.ts +8 -0
- package/index.d.ts +3 -0
- package/interfaces/quill.interface.d.ts +89 -0
- package/link/link.component.d.ts +27 -0
- package/package.json +47 -0
- package/quill.component.d.ts +157 -0
- package/quill2x.component.d.ts +18 -0
- package/upload-image/upload-image.component.d.ts +15 -0
- package/utils/quill.define.d.ts +25 -0
- package/utils/quill2x.define.d.ts +3 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { setStylesElement } from '@libs-ui/utils';
|
|
2
|
+
import Quill2x from 'quill2x';
|
|
3
|
+
import { fromEvent } from 'rxjs';
|
|
4
|
+
//region Function Table
|
|
5
|
+
export const createTableSelector = (quill, anchorEl) => {
|
|
6
|
+
// Đóng popup cũ nếu còn tồn tại
|
|
7
|
+
document.querySelectorAll('.manual-table-creator').forEach((el) => el.parentElement?.removeChild(el));
|
|
8
|
+
const popup = document.createElement('div');
|
|
9
|
+
popup.className = 'manual-table-creator';
|
|
10
|
+
// Inline style để đảm bảo hiển thị ngay cả khi CSS component không áp dụng
|
|
11
|
+
popup.style.position = 'absolute';
|
|
12
|
+
popup.style.background = '#fff';
|
|
13
|
+
popup.style.border = '1px solid #ddd';
|
|
14
|
+
popup.style.borderRadius = '6px';
|
|
15
|
+
popup.style.boxShadow = '0 6px 16px rgba(0,0,0,0.12)';
|
|
16
|
+
popup.style.padding = '12px';
|
|
17
|
+
popup.style.zIndex = '10000';
|
|
18
|
+
popup.style.minWidth = '200px';
|
|
19
|
+
setStylesElement(popup, {
|
|
20
|
+
position: 'absolute',
|
|
21
|
+
background: '#fff',
|
|
22
|
+
border: '1px solid #ddd',
|
|
23
|
+
borderRadius: '6px',
|
|
24
|
+
boxShadow: '0 6px 16px rgba(0,0,0,0.12)',
|
|
25
|
+
padding: '12px',
|
|
26
|
+
zIndex: '10000',
|
|
27
|
+
minWidth: '200px',
|
|
28
|
+
});
|
|
29
|
+
const info = document.createElement('div');
|
|
30
|
+
info.textContent = 'Chọn kích thước (hàng × cột)';
|
|
31
|
+
setStylesElement(info, {
|
|
32
|
+
fontSize: '12px',
|
|
33
|
+
color: '#333',
|
|
34
|
+
marginBottom: '10px',
|
|
35
|
+
textAlign: 'center',
|
|
36
|
+
fontWeight: '600',
|
|
37
|
+
});
|
|
38
|
+
popup.appendChild(info);
|
|
39
|
+
const grid = document.createElement('div');
|
|
40
|
+
setStylesElement(grid, {
|
|
41
|
+
display: 'grid',
|
|
42
|
+
gridTemplateColumns: 'repeat(8, 18px)',
|
|
43
|
+
gap: '4px',
|
|
44
|
+
});
|
|
45
|
+
const max = 8;
|
|
46
|
+
for (let r = 1; r <= max; r++) {
|
|
47
|
+
for (let c = 1; c <= max; c++) {
|
|
48
|
+
const cell = document.createElement('div');
|
|
49
|
+
cell.style.width = '18px';
|
|
50
|
+
cell.style.height = '18px';
|
|
51
|
+
cell.style.border = '1px solid #e5e7eb';
|
|
52
|
+
cell.style.background = '#fff';
|
|
53
|
+
cell.style.cursor = 'pointer';
|
|
54
|
+
cell.addEventListener('mouseenter', () => {
|
|
55
|
+
info.textContent = `Chọn kích thước: ${r} × ${c}`;
|
|
56
|
+
Array.from(grid.children).forEach((el, idx) => {
|
|
57
|
+
const rr = Math.floor(idx / max) + 1;
|
|
58
|
+
const cc = (idx % max) + 1;
|
|
59
|
+
el.style.background = rr <= r && cc <= c ? '#dbeafe' : '#fff';
|
|
60
|
+
el.style.borderColor = rr <= r && cc <= c ? '#93c5fd' : '#e5e7eb';
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
cell.addEventListener('click', () => {
|
|
64
|
+
try {
|
|
65
|
+
quill.focus();
|
|
66
|
+
const tableModule = quill.getModule('table');
|
|
67
|
+
if (tableModule && typeof tableModule.insertTable === 'function') {
|
|
68
|
+
tableModule.insertTable(r, c);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
if (document.body.contains(popup)) {
|
|
73
|
+
document.body.removeChild(popup);
|
|
74
|
+
}
|
|
75
|
+
document.removeEventListener('click', onOutsideClick, true);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
grid.appendChild(cell);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
popup.appendChild(grid);
|
|
82
|
+
const placePopup = () => {
|
|
83
|
+
const rect = anchorEl?.getBoundingClientRect();
|
|
84
|
+
const top = rect ? rect.bottom + window.scrollY + 6 : 100;
|
|
85
|
+
const left = rect ? rect.left + window.scrollX : 100;
|
|
86
|
+
popup.style.top = `${top}px`;
|
|
87
|
+
popup.style.left = `${left}px`;
|
|
88
|
+
};
|
|
89
|
+
const onOutsideClick = (ev) => {
|
|
90
|
+
if (!popup.contains(ev.target)) {
|
|
91
|
+
if (document.body.contains(popup)) {
|
|
92
|
+
document.body.removeChild(popup);
|
|
93
|
+
}
|
|
94
|
+
document.removeEventListener('click', onOutsideClick, true);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
document.body.appendChild(popup);
|
|
98
|
+
placePopup();
|
|
99
|
+
setTimeout(() => document.addEventListener('click', onOutsideClick, true));
|
|
100
|
+
};
|
|
101
|
+
export const createContextMenuOptionTable = (quill) => {
|
|
102
|
+
let lastContextIndex = null;
|
|
103
|
+
const closeAnyMenu = () => {
|
|
104
|
+
document.querySelectorAll('.manual-table-menu').forEach((el) => el.parentElement?.removeChild(el));
|
|
105
|
+
};
|
|
106
|
+
const runWithSelection = (fn) => {
|
|
107
|
+
try {
|
|
108
|
+
quill.focus();
|
|
109
|
+
if (typeof lastContextIndex === 'number') {
|
|
110
|
+
quill.setSelection(lastContextIndex, 0, 'silent');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
/* no-op: giữ yên nếu không thể set selection */
|
|
115
|
+
}
|
|
116
|
+
fn();
|
|
117
|
+
};
|
|
118
|
+
const createMenuItem = (label, onClick) => {
|
|
119
|
+
const item = document.createElement('div');
|
|
120
|
+
item.textContent = label;
|
|
121
|
+
item.style.padding = '6px 12px';
|
|
122
|
+
item.style.cursor = 'pointer';
|
|
123
|
+
item.addEventListener('click', () => {
|
|
124
|
+
runWithSelection(onClick);
|
|
125
|
+
closeAnyMenu();
|
|
126
|
+
});
|
|
127
|
+
item.addEventListener('mouseenter', () => {
|
|
128
|
+
item.style.background = '#f5f5f5';
|
|
129
|
+
});
|
|
130
|
+
item.addEventListener('mouseleave', () => {
|
|
131
|
+
item.style.background = 'transparent';
|
|
132
|
+
});
|
|
133
|
+
return item;
|
|
134
|
+
};
|
|
135
|
+
const openContextMenu = (pageX, pageY) => {
|
|
136
|
+
closeAnyMenu();
|
|
137
|
+
const menu = document.createElement('div');
|
|
138
|
+
menu.className = 'manual-table-menu';
|
|
139
|
+
menu.style.position = 'absolute';
|
|
140
|
+
menu.style.top = `${pageY}px`;
|
|
141
|
+
menu.style.left = `${pageX}px`;
|
|
142
|
+
menu.style.background = '#fff';
|
|
143
|
+
menu.style.border = '1px solid #ccc';
|
|
144
|
+
menu.style.borderRadius = '4px';
|
|
145
|
+
menu.style.boxShadow = '0 4px 12px rgba(0,0,0,0.2)';
|
|
146
|
+
menu.style.zIndex = '10001';
|
|
147
|
+
menu.style.padding = '4px';
|
|
148
|
+
menu.style.minWidth = '180px';
|
|
149
|
+
const tableModule = quill.getModule('table');
|
|
150
|
+
const safeCall = (method, ...args) => {
|
|
151
|
+
if (tableModule && typeof tableModule[method] === 'function') {
|
|
152
|
+
tableModule[method](...args);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
menu.appendChild(createMenuItem('Thêm hàng bên trên', () => safeCall('insertRowAbove')));
|
|
156
|
+
menu.appendChild(createMenuItem('Thêm hàng bên dưới', () => safeCall('insertRowBelow')));
|
|
157
|
+
menu.appendChild(createMenuItem('Thêm cột bên trái', () => safeCall('insertColumnLeft')));
|
|
158
|
+
menu.appendChild(createMenuItem('Thêm cột bên phải', () => safeCall('insertColumnRight')));
|
|
159
|
+
const divider = document.createElement('div');
|
|
160
|
+
divider.style.height = '1px';
|
|
161
|
+
divider.style.background = '#eee';
|
|
162
|
+
divider.style.margin = '4px 0';
|
|
163
|
+
menu.appendChild(divider);
|
|
164
|
+
menu.appendChild(createMenuItem('Xóa hàng', () => safeCall('deleteRow')));
|
|
165
|
+
menu.appendChild(createMenuItem('Xóa cột', () => safeCall('deleteColumn')));
|
|
166
|
+
menu.appendChild(createMenuItem('Xóa bảng', () => safeCall('deleteTable')));
|
|
167
|
+
document.body.appendChild(menu);
|
|
168
|
+
const onOutside = (ev) => {
|
|
169
|
+
if (!menu.contains(ev.target)) {
|
|
170
|
+
closeAnyMenu();
|
|
171
|
+
document.removeEventListener('click', onOutside, true);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
setTimeout(() => document.addEventListener('click', onOutside, true));
|
|
175
|
+
const onScroll = () => {
|
|
176
|
+
closeAnyMenu();
|
|
177
|
+
window.removeEventListener('scroll', onScroll, true);
|
|
178
|
+
window.removeEventListener('resize', onScroll, true);
|
|
179
|
+
};
|
|
180
|
+
window.addEventListener('scroll', onScroll, true);
|
|
181
|
+
window.addEventListener('resize', onScroll, true);
|
|
182
|
+
};
|
|
183
|
+
fromEvent(quill.root, 'contextmenu').subscribe((ev) => {
|
|
184
|
+
const target = ev.target;
|
|
185
|
+
const isCell = !!target.closest('td,th,table,.ql-table');
|
|
186
|
+
if (!isCell)
|
|
187
|
+
return;
|
|
188
|
+
ev.preventDefault();
|
|
189
|
+
try {
|
|
190
|
+
// Ưu tiên lấy index từ blot tương ứng node
|
|
191
|
+
const QuillAny = Quill2x;
|
|
192
|
+
const blot = QuillAny?.find?.(target);
|
|
193
|
+
if (blot && typeof blot.offset === 'function') {
|
|
194
|
+
lastContextIndex = blot.offset(quill.scroll);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
// Fallback: đặt selection hiện tại nếu không xác định được
|
|
198
|
+
const sel = quill.getSelection(true);
|
|
199
|
+
lastContextIndex = sel ? sel.index : 0;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
const sel = quill.getSelection(true);
|
|
204
|
+
lastContextIndex = sel ? sel.index : 0;
|
|
205
|
+
}
|
|
206
|
+
quill.focus();
|
|
207
|
+
openContextMenu(ev.pageX, ev.pageY);
|
|
208
|
+
});
|
|
209
|
+
};
|
|
210
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpbGwyeC5kZWZpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL3F1aWxsL3NyYy91dGlscy9xdWlsbDJ4LmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqQyx1QkFBdUI7QUFDdkIsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxLQUFjLEVBQUUsUUFBNEIsRUFBRSxFQUFFO0lBQ2xGLGdDQUFnQztJQUNoQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFdEcsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxLQUFLLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO0lBQ3pDLDJFQUEyRTtJQUMzRSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDbEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO0lBQ2hDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDO0lBQ3RDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNqQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyw2QkFBNkIsQ0FBQztJQUN0RCxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFD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L3V0aWxzJztcbmltcG9ydCBRdWlsbDJ4IGZyb20gJ3F1aWxsMngnO1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5cbi8vcmVnaW9uIEZ1bmN0aW9uIFRhYmxlXG5leHBvcnQgY29uc3QgY3JlYXRlVGFibGVTZWxlY3RvciA9IChxdWlsbDogUXVpbGwyeCwgYW5jaG9yRWw6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAvLyDEkMOzbmcgcG9wdXAgY8WpIG7hur91IGPDsm4gdOG7k24gdOG6oWlcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1hbnVhbC10YWJsZS1jcmVhdG9yJykuZm9yRWFjaCgoZWwpID0+IGVsLnBhcmVudEVsZW1lbnQ/LnJlbW92ZUNoaWxkKGVsKSk7XG5cbiAgY29uc3QgcG9wdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcG9wdXAuY2xhc3NOYW1lID0gJ21hbnVhbC10YWJsZS1jcmVhdG9yJztcbiAgLy8gSW5saW5lIHN0eWxlIMSR4buDIMSR4bqjbSBi4bqjbyBoaeG7g24gdGjhu4sgbmdheSBj4bqjIGtoaSBDU1MgY29tcG9uZW50IGtow7RuZyDDoXAgZOG7pW5nXG4gIHBvcHVwLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgcG9wdXAuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJztcbiAgcG9wdXAuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjZGRkJztcbiAgcG9wdXAuc3R5bGUuYm9yZGVyUmFkaXVzID0gJzZweCc7XG4gIHBvcHVwLnN0eWxlLmJveFNoYWRvdyA9ICcwIDZweCAxNnB4IHJnYmEoMCwwLDAsMC4xMiknO1xuICBwb3B1cC5zdHlsZS5wYWRkaW5nID0gJzEycHgnO1xuICBwb3B1cC5zdHlsZS56SW5kZXggPSAnMTAwMDAnO1xuICBwb3B1cC5zdHlsZS5taW5XaWR0aCA9ICcyMDBweCc7XG4gIHNldFN0eWxlc0VsZW1lbnQocG9wdXAsIHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICBiYWNrZ3JvdW5kOiAnI2ZmZicsXG4gICAgYm9yZGVyOiAnMXB4IHNvbGlkICNkZGQnLFxuICAgIGJvcmRlclJhZGl1czogJzZweCcsXG4gICAgYm94U2hhZG93OiAnMCA2cHggMTZweCByZ2JhKDAsMCwwLDAuMTIpJyxcbiAgICBwYWRkaW5nOiAnMTJweCcsXG4gICAgekluZGV4OiAnMTAwMDAnLFxuICAgIG1pbldpZHRoOiAnMjAwcHgnLFxuICB9KTtcblxuICBjb25zdCBpbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGluZm8udGV4dENvbnRlbnQgPSAnQ2jhu41uIGvDrWNoIHRoxrDhu5tjIChow6BuZyDDlyBj4buZdCknO1xuICBzZXRTdHlsZXNFbGVtZW50KGluZm8sIHtcbiAgICBmb250U2l6ZTogJzEycHgnLFxuICAgIGNvbG9yOiAnIzMzMycsXG4gICAgbWFyZ2luQm90dG9tOiAnMTBweCcsXG4gICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICBmb250V2VpZ2h0OiAnNjAwJyxcbiAgfSk7XG4gIHBvcHVwLmFwcGVuZENoaWxkKGluZm8pO1xuXG4gIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc2V0U3R5bGVzRWxlbWVudChncmlkLCB7XG4gICAgZGlzcGxheTogJ2dyaWQnLFxuICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICdyZXBlYXQoOCwgMThweCknLFxuICAgIGdhcDogJzRweCcsXG4gIH0pO1xuXG4gIGNvbnN0IG1heCA9IDg7XG4gIGZvciAobGV0IHIgPSAxOyByIDw9IG1heDsgcisrKSB7XG4gICAgZm9yIChsZXQgYyA9IDE7IGMgPD0gbWF4OyBjKyspIHtcbiAgICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNlbGwuc3R5bGUud2lkdGggPSAnMThweCc7XG4gICAgICBjZWxsLnN0eWxlLmhlaWdodCA9ICcxOHB4JztcbiAgICAgIGNlbGwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjZTVlN2ViJztcbiAgICAgIGNlbGwuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJztcbiAgICAgIGNlbGwuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuXG4gICAgICBjZWxsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICAgIGluZm8udGV4dENvbnRlbnQgPSBgQ2jhu41uIGvDrWNoIHRoxrDhu5tjOiAke3J9IMOXICR7Y31gO1xuICAgICAgICBBcnJheS5mcm9tKGdyaWQuY2hpbGRyZW4pLmZvckVhY2goKGVsLCBpZHgpID0+IHtcbiAgICAgICAgICBjb25zdCByciA9IE1hdGguZmxvb3IoaWR4IC8gbWF4KSArIDE7XG4gICAgICAgICAgY29uc3QgY2MgPSAoaWR4ICUgbWF4KSArIDE7XG4gICAgICAgICAgKGVsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kID0gcnIgPD0gciAmJiBjYyA8PSBjID8gJyNkYmVhZmUnIDogJyNmZmYnO1xuICAgICAgICAgIChlbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUuYm9yZGVyQ29sb3IgPSByciA8PSByICYmIGNjIDw9IGMgPyAnIzkzYzVmZCcgOiAnI2U1ZTdlYic7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNlbGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcXVpbGwuZm9jdXMoKTtcbiAgICAgICAgICBjb25zdCB0YWJsZU1vZHVsZSA9IHF1aWxsLmdldE1vZHVsZSgndGFibGUnKSBhcyBhbnk7XG4gICAgICAgICAgaWYgKHRhYmxlTW9kdWxlICYmIHR5cGVvZiB0YWJsZU1vZHVsZS5pbnNlcnRUYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGFibGVNb2R1bGUuaW5zZXJ0VGFibGUociwgYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHBvcHVwKSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChwb3B1cCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25PdXRzaWRlQ2xpY2ssIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgZ3JpZC5hcHBlbmRDaGlsZChjZWxsKTtcbiAgICB9XG4gIH1cbiAgcG9wdXAuYXBwZW5kQ2hpbGQoZ3JpZCk7XG5cbiAgY29uc3QgcGxhY2VQb3B1cCA9ICgpID0+IHtcbiAgICBjb25zdCByZWN0ID0gYW5jaG9yRWw/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvcCA9IHJlY3QgPyByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgNiA6IDEwMDtcbiAgICBjb25zdCBsZWZ0ID0gcmVjdCA/IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYIDogMTAwO1xuICAgIHBvcHVwLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgcG9wdXAuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuICB9O1xuXG4gIGNvbnN0IG9uT3V0c2lkZUNsaWNrID0gKGV2OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKCFwb3B1cC5jb250YWlucyhldi50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHBvcHVwKSkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHBvcHVwKTtcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25PdXRzaWRlQ2xpY2ssIHRydWUpO1xuICAgIH1cbiAgfTtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBvcHVwKTtcbiAgcGxhY2VQb3B1cCgpO1xuICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25PdXRzaWRlQ2xpY2ssIHRydWUpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDb250ZXh0TWVudU9wdGlvblRhYmxlID0gKHF1aWxsOiBRdWlsbDJ4KSA9PiB7XG4gIGxldCBsYXN0Q29udGV4dEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBjbG9zZUFueU1lbnUgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1hbnVhbC10YWJsZS1tZW51JykuZm9yRWFjaCgoZWwpID0+IGVsLnBhcmVudEVsZW1lbnQ/LnJlbW92ZUNoaWxkKGVsKSk7XG4gIH07XG5cbiAgY29uc3QgcnVuV2l0aFNlbGVjdGlvbiA9IChmbjogKCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBxdWlsbC5mb2N1cygpO1xuICAgICAgaWYgKHR5cGVvZiBsYXN0Q29udGV4dEluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICBxdWlsbC5zZXRTZWxlY3Rpb24obGFzdENvbnRleHRJbmRleCwgMCwgJ3NpbGVudCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogbm8tb3A6IGdp4buvIHnDqm4gbuG6v3Uga2jDtG5nIHRo4buDIHNldCBzZWxlY3Rpb24gKi9cbiAgICB9XG4gICAgZm4oKTtcbiAgfTtcblxuICBjb25zdCBjcmVhdGVNZW51SXRlbSA9IChsYWJlbDogc3RyaW5nLCBvbkNsaWNrOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgY29uc3QgaXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGl0ZW0udGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICBpdGVtLnN0eWxlLnBhZGRpbmcgPSAnNnB4IDEycHgnO1xuICAgIGl0ZW0uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBydW5XaXRoU2VsZWN0aW9uKG9uQ2xpY2spO1xuICAgICAgY2xvc2VBbnlNZW51KCk7XG4gICAgfSk7XG4gICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmNWY1ZjUnO1xuICAgIH0pO1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgfSk7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH07XG5cbiAgY29uc3Qgb3BlbkNvbnRleHRNZW51ID0gKHBhZ2VYOiBudW1iZXIsIHBhZ2VZOiBudW1iZXIpID0+IHtcbiAgICBjbG9zZUFueU1lbnUoKTtcblxuICAgIGNvbnN0IG1lbnUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBtZW51LmNsYXNzTmFtZSA9ICdtYW51YWwtdGFibGUtbWVudSc7XG4gICAgbWVudS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgbWVudS5zdHlsZS50b3AgPSBgJHtwYWdlWX1weGA7XG4gICAgbWVudS5zdHlsZS5sZWZ0ID0gYCR7cGFnZVh9cHhgO1xuICAgIG1lbnUuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJztcbiAgICBtZW51LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2NjYyc7XG4gICAgbWVudS5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNHB4JztcbiAgICBtZW51LnN0eWxlLmJveFNoYWRvdyA9ICcwIDRweCAxMnB4IHJnYmEoMCwwLDAsMC4yKSc7XG4gICAgbWVudS5zdHlsZS56SW5kZXggPSAnMTAwMDEnO1xuICAgIG1lbnUuc3R5bGUucGFkZGluZyA9ICc0cHgnO1xuICAgIG1lbnUuc3R5bGUubWluV2lkdGggPSAnMTgwcHgnO1xuXG4gICAgY29uc3QgdGFibGVNb2R1bGUgPSBxdWlsbC5nZXRNb2R1bGUoJ3RhYmxlJykgYXMgUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGw7XG4gICAgY29uc3Qgc2FmZUNhbGwgPSAobWV0aG9kOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBpZiAodGFibGVNb2R1bGUgJiYgdHlwZW9mIHRhYmxlTW9kdWxlW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGFibGVNb2R1bGVbbWV0aG9kXSguLi5hcmdzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVudS5hcHBlbmRDaGlsZChjcmVhdGVNZW51SXRlbSgnVGjDqm0gaMOgbmcgYsOqbiB0csOqbicsICgpID0+IHNhZmVDYWxsKCdpbnNlcnRSb3dBYm92ZScpKSk7XG4gICAgbWVudS5hcHBlbmRDaGlsZChjcmVhdGVNZW51SXRlbSgnVGjDqm0gaMOgbmcgYsOqbiBkxrDhu5tpJywgKCkgPT4gc2FmZUNhbGwoJ2luc2VydFJvd0JlbG93JykpKTtcbiAgICBtZW51LmFwcGVuZENoaWxkKGNyZWF0ZU1lbnVJdGVtKCdUaMOqbSBj4buZdCBiw6puIHRyw6FpJywgKCkgPT4gc2FmZUNhbGwoJ2luc2VydENvbHVtbkxlZnQnKSkpO1xuICAgIG1lbnUuYXBwZW5kQ2hpbGQoY3JlYXRlTWVudUl0ZW0oJ1Row6ptIGPhu5l0IGLDqm4gcGjhuqNpJywgKCkgPT4gc2FmZUNhbGwoJ2luc2VydENvbHVtblJpZ2h0JykpKTtcbiAgICBjb25zdCBkaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2aWRlci5zdHlsZS5oZWlnaHQgPSAnMXB4JztcbiAgICBkaXZpZGVyLnN0eWxlLmJhY2tncm91bmQgPSAnI2VlZSc7XG4gICAgZGl2aWRlci5zdHlsZS5tYXJnaW4gPSAnNHB4IDAnO1xuICAgIG1lbnUuYXBwZW5kQ2hpbGQoZGl2aWRlcik7XG4gICAgbWVudS5hcHBlbmRDaGlsZChjcmVhdGVNZW51SXRlbSgnWMOzYSBow6BuZycsICgpID0+IHNhZmVDYWxsKCdkZWxldGVSb3cnKSkpO1xuICAgIG1lbnUuYXBwZW5kQ2hpbGQoY3JlYXRlTWVudUl0ZW0oJ1jDs2EgY+G7mXQnLCAoKSA9PiBzYWZlQ2FsbCgnZGVsZXRlQ29sdW1uJykpKTtcbiAgICBtZW51LmFwcGVuZENoaWxkKGNyZWF0ZU1lbnVJdGVtKCdYw7NhIGLhuqNuZycsICgpID0+IHNhZmVDYWxsKCdkZWxldGVUYWJsZScpKSk7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1lbnUpO1xuXG4gICAgY29uc3Qgb25PdXRzaWRlID0gKGV2OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIW1lbnUuY29udGFpbnMoZXYudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIGNsb3NlQW55TWVudSgpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uT3V0c2lkZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25PdXRzaWRlLCB0cnVlKSk7XG5cbiAgICBjb25zdCBvblNjcm9sbCA9ICgpID0+IHtcbiAgICAgIGNsb3NlQW55TWVudSgpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsLCB0cnVlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblNjcm9sbCwgdHJ1ZSk7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGwsIHRydWUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvblNjcm9sbCwgdHJ1ZSk7XG4gIH07XG5cbiAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHF1aWxsLnJvb3QsICdjb250ZXh0bWVudScpLnN1YnNjcmliZSgoZXY6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBldi50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgaXNDZWxsID0gISF0YXJnZXQuY2xvc2VzdCgndGQsdGgsdGFibGUsLnFsLXRhYmxlJyk7XG4gICAgaWYgKCFpc0NlbGwpIHJldHVybjtcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRyeSB7XG4gICAgICAvLyDGr3UgdGnDqm4gbOG6pXkgaW5kZXggdOG7qyBibG90IHTGsMahbmcg4bupbmcgbm9kZVxuICAgICAgY29uc3QgUXVpbGxBbnkgPSBRdWlsbDJ4IGFzIGFueTtcbiAgICAgIGNvbnN0IGJsb3QgPSBRdWlsbEFueT8uZmluZD8uKHRhcmdldCk7XG4gICAgICBpZiAoYmxvdCAmJiB0eXBlb2YgYmxvdC5vZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbGFzdENvbnRleHRJbmRleCA9IGJsb3Qub2Zmc2V0KHF1aWxsLnNjcm9sbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGYWxsYmFjazogxJHhurd0IHNlbGVjdGlvbiBoaeG7h24gdOG6oWkgbuG6v3Uga2jDtG5nIHjDoWMgxJHhu4tuaCDEkcaw4bujY1xuICAgICAgICBjb25zdCBzZWwgPSBxdWlsbC5nZXRTZWxlY3Rpb24odHJ1ZSk7XG4gICAgICAgIGxhc3RDb250ZXh0SW5kZXggPSBzZWwgPyBzZWwuaW5kZXggOiAwO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc3Qgc2VsID0gcXVpbGwuZ2V0U2VsZWN0aW9uKHRydWUpO1xuICAgICAgbGFzdENvbnRleHRJbmRleCA9IHNlbCA/IHNlbC5pbmRleCA6IDA7XG4gICAgfVxuICAgIHF1aWxsLmZvY3VzKCk7XG4gICAgb3BlbkNvbnRleHRNZW51KGV2LnBhZ2VYLCBldi5wYWdlWSk7XG4gIH0pO1xufTtcbiJdfQ==
|