@aquera/ngx-smart-table 0.0.2-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/README.md +152 -0
  2. package/aquera-ngx-smart-table.d.ts +5 -0
  3. package/esm2020/aquera-ngx-smart-table.mjs +5 -0
  4. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
  5. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
  6. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
  7. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
  8. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
  9. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
  10. package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
  11. package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
  12. package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
  13. package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
  14. package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
  15. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
  16. package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
  17. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
  18. package/esm2020/lib/editors/index.mjs +9 -0
  19. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
  20. package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
  21. package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
  22. package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
  23. package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
  24. package/esm2020/lib/factories/column-config.factory.mjs +231 -0
  25. package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
  26. package/esm2020/lib/models/base-column-config.class.mjs +253 -0
  27. package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
  28. package/esm2020/lib/models/cell-types.mjs +147 -0
  29. package/esm2020/lib/models/column-action.interface.mjs +6 -0
  30. package/esm2020/lib/models/column-config.interface.mjs +43 -0
  31. package/esm2020/lib/models/column-config.utils.mjs +101 -0
  32. package/esm2020/lib/models/row-action.interface.mjs +5 -0
  33. package/esm2020/lib/models/row-validator.interface.mjs +2 -0
  34. package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
  35. package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
  36. package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
  37. package/esm2020/lib/models/table-config.interface.mjs +106 -0
  38. package/esm2020/lib/models/table-validator.interface.mjs +2 -0
  39. package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
  40. package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
  41. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
  42. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
  43. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
  44. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
  45. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
  46. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
  47. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
  48. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
  49. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
  50. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
  51. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
  52. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
  53. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
  54. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
  55. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
  56. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
  57. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
  58. package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
  59. package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
  60. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
  61. package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
  62. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
  63. package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
  64. package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
  65. package/esm2020/lib/renderer/models/table-types.mjs +29 -0
  66. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
  67. package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
  68. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
  69. package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
  70. package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
  71. package/esm2020/lib/services/autosave.service.mjs +92 -0
  72. package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
  73. package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
  74. package/esm2020/lib/services/row-validation.service.mjs +42 -0
  75. package/esm2020/lib/services/validation-logger.service.mjs +177 -0
  76. package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
  77. package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
  78. package/esm2020/lib/smart-table.module.mjs +124 -0
  79. package/esm2020/lib/strategies/default-editors.mjs +433 -0
  80. package/esm2020/lib/strategies/default-formatters.mjs +238 -0
  81. package/esm2020/lib/strategies/default-validators.mjs +327 -0
  82. package/esm2020/public-api.mjs +146 -0
  83. package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
  84. package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
  85. package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
  86. package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
  87. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
  88. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
  89. package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
  90. package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
  91. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
  92. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
  93. package/lib/builder/definition-builder.module.d.ts +15 -0
  94. package/lib/builder/models/builder-state.interface.d.ts +93 -0
  95. package/lib/builder/services/definition-builder.service.d.ts +80 -0
  96. package/lib/builder/services/definition-export.service.d.ts +59 -0
  97. package/lib/builder/services/definition-import.service.d.ts +31 -0
  98. package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
  99. package/lib/builder/utils/config-validator.util.d.ts +32 -0
  100. package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
  101. package/lib/editors/index.d.ts +8 -0
  102. package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
  103. package/lib/editors/nile-calendar-editor.d.ts +89 -0
  104. package/lib/editors/nile-date-picker-editor.d.ts +95 -0
  105. package/lib/editors/nile-input-editor.d.ts +67 -0
  106. package/lib/editors/nile-select-editor.d.ts +109 -0
  107. package/lib/factories/column-config.factory.d.ts +73 -0
  108. package/lib/models/autosave-config.interface.d.ts +23 -0
  109. package/lib/models/base-column-config.class.d.ts +115 -0
  110. package/lib/models/cell-strategies.interface.d.ts +181 -0
  111. package/lib/models/cell-types.d.ts +337 -0
  112. package/lib/models/column-action.interface.d.ts +86 -0
  113. package/lib/models/column-config.interface.d.ts +272 -0
  114. package/lib/models/column-config.utils.d.ts +37 -0
  115. package/lib/models/row-action.interface.d.ts +86 -0
  116. package/lib/models/row-validator.interface.d.ts +37 -0
  117. package/lib/models/schema-validation.interface.d.ts +42 -0
  118. package/lib/models/sheet-action.interface.d.ts +59 -0
  119. package/lib/models/sheet-config.interface.d.ts +41 -0
  120. package/lib/models/table-config.interface.d.ts +245 -0
  121. package/lib/models/table-validator.interface.d.ts +40 -0
  122. package/lib/models/workbook-action.interface.d.ts +90 -0
  123. package/lib/models/workbook-config.interface.d.ts +107 -0
  124. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
  125. package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
  126. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
  127. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
  128. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
  129. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
  130. package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
  131. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
  132. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
  133. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
  134. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
  135. package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
  136. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
  137. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
  138. package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
  139. package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
  140. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
  141. package/lib/renderer/models/cell-state.interface.d.ts +118 -0
  142. package/lib/renderer/models/cell.class.d.ts +174 -0
  143. package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
  144. package/lib/renderer/models/sheet-state.class.d.ts +67 -0
  145. package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
  146. package/lib/renderer/models/table-state.class.d.ts +313 -0
  147. package/lib/renderer/models/table-state.interface.d.ts +18 -0
  148. package/lib/renderer/models/table-types.d.ts +228 -0
  149. package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
  150. package/lib/renderer/models/workbook-state.class.d.ts +117 -0
  151. package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
  152. package/lib/renderer/models/z-index.enum.d.ts +44 -0
  153. package/lib/schemas/table-config.schema.d.ts +455 -0
  154. package/lib/services/autosave.service.d.ts +73 -0
  155. package/lib/services/custom-validation-rules.util.d.ts +12 -0
  156. package/lib/services/json-schema-validator.service.d.ts +49 -0
  157. package/lib/services/row-validation.service.d.ts +17 -0
  158. package/lib/services/validation-logger.service.d.ts +87 -0
  159. package/lib/services/virtual-scroll.service.d.ts +44 -0
  160. package/lib/shared/shared-table-components.module.d.ts +9 -0
  161. package/lib/smart-table.module.d.ts +26 -0
  162. package/lib/strategies/default-editors.d.ts +109 -0
  163. package/lib/strategies/default-formatters.d.ts +116 -0
  164. package/lib/strategies/default-validators.d.ts +113 -0
  165. package/package.json +42 -0
  166. package/public-api.d.ts +70 -0
  167. package/src/lib/builder/README.md +30 -0
  168. package/src/lib/editors/README.md +303 -0
  169. package/src/lib/renderer/components/st-column-filter/README.md +286 -0
@@ -0,0 +1,433 @@
1
+ /**
2
+ * Default editor implementations
3
+ */
4
+ /**
5
+ * Text editor - basic text input
6
+ */
7
+ export class TextEditor {
8
+ constructor(options) {
9
+ this.options = options;
10
+ }
11
+ edit(context) {
12
+ if (!context.container) {
13
+ console.warn('TextEditor requires a container element');
14
+ return;
15
+ }
16
+ // Create input element
17
+ this.input = document.createElement('input');
18
+ this.input.type = 'text';
19
+ this.input.value = context.value ?? '';
20
+ this.input.className = 'st-cell-editor st-text-editor';
21
+ // Apply inline styles for full width
22
+ this.input.style.width = 'inherit';
23
+ this.input.style.height = 'inherit';
24
+ this.input.style.boxSizing = 'border-box';
25
+ this.input.style.border = 'none';
26
+ this.input.style.outline = 'none';
27
+ if (this.options?.placeholder) {
28
+ this.input.placeholder = this.options.placeholder;
29
+ }
30
+ if (this.options?.maxLength) {
31
+ this.input.maxLength = this.options.maxLength;
32
+ }
33
+ // Handle Enter to save
34
+ this.input.addEventListener('keydown', (e) => {
35
+ if (e.key === 'Enter') {
36
+ e.preventDefault();
37
+ context.onSave(this.input.value);
38
+ }
39
+ else if (e.key === 'Escape') {
40
+ e.preventDefault();
41
+ context.onCancel();
42
+ }
43
+ });
44
+ // Handle blur to save
45
+ this.input.addEventListener('blur', () => {
46
+ context.onSave(this.input.value);
47
+ });
48
+ // Clear container and append input
49
+ context.container.innerHTML = '';
50
+ context.container.appendChild(this.input);
51
+ // Auto focus
52
+ if (this.options?.autoFocus !== false) {
53
+ this.input.focus();
54
+ if (this.options?.selectOnFocus !== false) {
55
+ this.input.select();
56
+ }
57
+ }
58
+ }
59
+ destroy() {
60
+ if (this.input) {
61
+ this.input.remove();
62
+ this.input = undefined;
63
+ }
64
+ }
65
+ focus() {
66
+ this.input?.focus();
67
+ }
68
+ getCurrentValue() {
69
+ return this.input?.value ?? '';
70
+ }
71
+ }
72
+ /**
73
+ * Number editor - numeric input
74
+ */
75
+ export class NumberEditor {
76
+ constructor(options) {
77
+ this.options = options;
78
+ }
79
+ edit(context) {
80
+ if (!context.container) {
81
+ console.warn('NumberEditor requires a container element');
82
+ return;
83
+ }
84
+ // Create input element
85
+ this.input = document.createElement('input');
86
+ this.input.type = 'number';
87
+ this.input.value = context.value?.toString() ?? '';
88
+ this.input.className = 'st-cell-editor st-number-editor';
89
+ // Apply inline styles with flex-grow for numbers
90
+ this.input.style.width = 'inherit';
91
+ this.input.style.height = 'inherit';
92
+ this.input.style.boxSizing = 'border-box';
93
+ this.input.style.flexGrow = '1';
94
+ this.input.style.border = 'none';
95
+ this.input.style.outline = 'none';
96
+ if (this.options?.placeholder) {
97
+ this.input.placeholder = this.options.placeholder;
98
+ }
99
+ if (this.options?.min !== undefined) {
100
+ this.input.min = this.options.min.toString();
101
+ }
102
+ if (this.options?.max !== undefined) {
103
+ this.input.max = this.options.max.toString();
104
+ }
105
+ if (this.options?.step !== undefined) {
106
+ this.input.step = this.options.step.toString();
107
+ }
108
+ // Handle Enter to save
109
+ this.input.addEventListener('keydown', (e) => {
110
+ if (e.key === 'Enter') {
111
+ e.preventDefault();
112
+ const value = parseFloat(this.input.value);
113
+ context.onSave(value);
114
+ }
115
+ else if (e.key === 'Escape') {
116
+ e.preventDefault();
117
+ context.onCancel();
118
+ }
119
+ });
120
+ // Handle blur to save
121
+ this.input.addEventListener('blur', () => {
122
+ const value = parseFloat(this.input.value);
123
+ context.onSave(value);
124
+ });
125
+ // Clear container and append input
126
+ context.container.innerHTML = '';
127
+ context.container.appendChild(this.input);
128
+ // Auto focus
129
+ if (this.options?.autoFocus !== false) {
130
+ this.input.focus();
131
+ if (this.options?.selectOnFocus !== false) {
132
+ this.input.select();
133
+ }
134
+ }
135
+ }
136
+ destroy() {
137
+ if (this.input) {
138
+ this.input.remove();
139
+ this.input = undefined;
140
+ }
141
+ }
142
+ focus() {
143
+ this.input?.focus();
144
+ }
145
+ getCurrentValue() {
146
+ return parseFloat(this.input?.value ?? '0');
147
+ }
148
+ }
149
+ /**
150
+ * Date editor - date input
151
+ */
152
+ export class DateEditor {
153
+ constructor(options) {
154
+ this.options = options;
155
+ }
156
+ edit(context) {
157
+ if (!context.container) {
158
+ console.warn('DateEditor requires a container element');
159
+ return;
160
+ }
161
+ // Create input element
162
+ this.input = document.createElement('input');
163
+ this.input.type = 'date';
164
+ this.input.className = 'st-cell-editor st-date-editor';
165
+ // Apply inline styles for full width
166
+ this.input.style.width = 'inherit';
167
+ this.input.style.height = 'inherit';
168
+ this.input.style.boxSizing = 'border-box';
169
+ // Format date value
170
+ if (context.value) {
171
+ const date = context.value instanceof Date ? context.value : new Date(context.value);
172
+ if (!isNaN(date.getTime())) {
173
+ this.input.value = date.toISOString().split('T')[0];
174
+ }
175
+ }
176
+ if (this.options?.min) {
177
+ const minDate = this.options.min instanceof Date ? this.options.min : new Date(this.options.min);
178
+ this.input.min = minDate.toISOString().split('T')[0];
179
+ }
180
+ if (this.options?.max) {
181
+ const maxDate = this.options.max instanceof Date ? this.options.max : new Date(this.options.max);
182
+ this.input.max = maxDate.toISOString().split('T')[0];
183
+ }
184
+ // Handle Enter to save
185
+ this.input.addEventListener('keydown', (e) => {
186
+ if (e.key === 'Enter') {
187
+ e.preventDefault();
188
+ const value = this.input.value ? new Date(this.input.value) : null;
189
+ context.onSave(value);
190
+ }
191
+ else if (e.key === 'Escape') {
192
+ e.preventDefault();
193
+ context.onCancel();
194
+ }
195
+ });
196
+ // Handle change to save
197
+ this.input.addEventListener('change', () => {
198
+ const value = this.input.value ? new Date(this.input.value) : null;
199
+ context.onSave(value);
200
+ });
201
+ // Handle blur to save
202
+ this.input.addEventListener('blur', () => {
203
+ const value = this.input.value ? new Date(this.input.value) : null;
204
+ context.onSave(value);
205
+ });
206
+ // Clear container and append input
207
+ context.container.innerHTML = '';
208
+ context.container.appendChild(this.input);
209
+ // Auto focus
210
+ if (this.options?.autoFocus !== false) {
211
+ this.input.focus();
212
+ }
213
+ }
214
+ destroy() {
215
+ if (this.input) {
216
+ this.input.remove();
217
+ this.input = undefined;
218
+ }
219
+ }
220
+ focus() {
221
+ this.input?.focus();
222
+ }
223
+ getCurrentValue() {
224
+ const value = this.input?.value;
225
+ return value ? new Date(value) : new Date();
226
+ }
227
+ }
228
+ /**
229
+ * Select editor - dropdown selection
230
+ */
231
+ export class SelectEditor {
232
+ constructor(options) {
233
+ this.options = options;
234
+ }
235
+ edit(context) {
236
+ if (!context.container) {
237
+ console.warn('SelectEditor requires a container element');
238
+ return;
239
+ }
240
+ // Create select element
241
+ this.select = document.createElement('select');
242
+ this.select.className = 'st-cell-editor st-select-editor';
243
+ // Apply inline styles for full width
244
+ this.select.style.width = '100%';
245
+ this.select.style.boxSizing = 'border-box';
246
+ // Add placeholder option
247
+ if (this.options.placeholder) {
248
+ const placeholderOption = document.createElement('option');
249
+ placeholderOption.value = '';
250
+ placeholderOption.textContent = this.options.placeholder;
251
+ placeholderOption.disabled = true;
252
+ this.select.appendChild(placeholderOption);
253
+ }
254
+ // Add options
255
+ this.options.options.forEach(opt => {
256
+ const option = document.createElement('option');
257
+ option.value = String(opt.value);
258
+ option.textContent = opt.label;
259
+ option.selected = opt.value === context.value;
260
+ this.select.appendChild(option);
261
+ });
262
+ // Handle change to save
263
+ this.select.addEventListener('change', () => {
264
+ const selectedOption = this.options.options.find(opt => String(opt.value) === this.select.value);
265
+ if (selectedOption) {
266
+ context.onSave(selectedOption.value);
267
+ }
268
+ });
269
+ // Handle keydown
270
+ this.select.addEventListener('keydown', (e) => {
271
+ if (e.key === 'Escape') {
272
+ e.preventDefault();
273
+ context.onCancel();
274
+ }
275
+ });
276
+ // Handle blur to cancel (already saved on change)
277
+ this.select.addEventListener('blur', () => {
278
+ // Don't save on blur since we save on change
279
+ context.onCancel();
280
+ });
281
+ // Clear container and append select
282
+ context.container.innerHTML = '';
283
+ context.container.appendChild(this.select);
284
+ // Auto focus
285
+ if (this.options.autoFocus !== false) {
286
+ this.select.focus();
287
+ }
288
+ }
289
+ destroy() {
290
+ if (this.select) {
291
+ this.select.remove();
292
+ this.select = undefined;
293
+ }
294
+ }
295
+ focus() {
296
+ this.select?.focus();
297
+ }
298
+ getCurrentValue() {
299
+ const selectedOption = this.options.options.find(opt => String(opt.value) === this.select?.value);
300
+ return selectedOption?.value ?? '';
301
+ }
302
+ }
303
+ /**
304
+ * Boolean editor - checkbox
305
+ */
306
+ export class BooleanEditor {
307
+ constructor(options) {
308
+ this.options = options;
309
+ }
310
+ edit(context) {
311
+ if (!context.container) {
312
+ console.warn('BooleanEditor requires a container element');
313
+ return;
314
+ }
315
+ // Create checkbox element
316
+ this.checkbox = document.createElement('input');
317
+ this.checkbox.type = 'checkbox';
318
+ this.checkbox.checked = !!context.value;
319
+ this.checkbox.className = 'st-cell-editor st-boolean-editor';
320
+ // Apply inline styles (centered checkbox)
321
+ this.checkbox.style.margin = '0 auto';
322
+ this.checkbox.style.display = 'block';
323
+ // Handle change to save
324
+ if (this.options?.saveOnChange !== false) {
325
+ this.checkbox.addEventListener('change', () => {
326
+ context.onSave(this.checkbox.checked);
327
+ });
328
+ }
329
+ // Handle keydown
330
+ this.checkbox.addEventListener('keydown', (e) => {
331
+ if (e.key === 'Enter') {
332
+ e.preventDefault();
333
+ context.onSave(this.checkbox.checked);
334
+ }
335
+ else if (e.key === 'Escape') {
336
+ e.preventDefault();
337
+ context.onCancel();
338
+ }
339
+ });
340
+ // Clear container and append checkbox
341
+ context.container.innerHTML = '';
342
+ context.container.appendChild(this.checkbox);
343
+ // Auto focus
344
+ if (this.options?.autoFocus !== false) {
345
+ this.checkbox.focus();
346
+ }
347
+ }
348
+ destroy() {
349
+ if (this.checkbox) {
350
+ this.checkbox.remove();
351
+ this.checkbox = undefined;
352
+ }
353
+ }
354
+ focus() {
355
+ this.checkbox?.focus();
356
+ }
357
+ getCurrentValue() {
358
+ return this.checkbox?.checked ?? false;
359
+ }
360
+ }
361
+ /**
362
+ * Textarea editor - multi-line text input
363
+ */
364
+ export class TextAreaEditor {
365
+ constructor(options) {
366
+ this.options = options;
367
+ }
368
+ edit(context) {
369
+ if (!context.container) {
370
+ console.warn('TextAreaEditor requires a container element');
371
+ return;
372
+ }
373
+ // Create textarea element
374
+ this.textarea = document.createElement('textarea');
375
+ this.textarea.value = context.value ?? '';
376
+ this.textarea.className = 'st-cell-editor st-textarea-editor';
377
+ // Apply inline styles for full width
378
+ this.textarea.style.width = 'inherit';
379
+ this.textarea.style.height = 'inherit';
380
+ this.textarea.style.boxSizing = 'border-box';
381
+ this.textarea.style.resize = 'vertical';
382
+ if (this.options?.placeholder) {
383
+ this.textarea.placeholder = this.options.placeholder;
384
+ }
385
+ if (this.options?.maxLength) {
386
+ this.textarea.maxLength = this.options.maxLength;
387
+ }
388
+ if (this.options?.rows) {
389
+ this.textarea.rows = this.options.rows;
390
+ }
391
+ if (this.options?.cols) {
392
+ this.textarea.cols = this.options.cols;
393
+ }
394
+ // Handle Ctrl+Enter to save
395
+ this.textarea.addEventListener('keydown', (e) => {
396
+ if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {
397
+ e.preventDefault();
398
+ context.onSave(this.textarea.value);
399
+ }
400
+ else if (e.key === 'Escape') {
401
+ e.preventDefault();
402
+ context.onCancel();
403
+ }
404
+ });
405
+ // Handle blur to save
406
+ this.textarea.addEventListener('blur', () => {
407
+ context.onSave(this.textarea.value);
408
+ });
409
+ // Clear container and append textarea
410
+ context.container.innerHTML = '';
411
+ context.container.appendChild(this.textarea);
412
+ // Auto focus
413
+ if (this.options?.autoFocus !== false) {
414
+ this.textarea.focus();
415
+ if (this.options?.selectOnFocus !== false) {
416
+ this.textarea.select();
417
+ }
418
+ }
419
+ }
420
+ destroy() {
421
+ if (this.textarea) {
422
+ this.textarea.remove();
423
+ this.textarea = undefined;
424
+ }
425
+ }
426
+ focus() {
427
+ this.textarea?.focus();
428
+ }
429
+ getCurrentValue() {
430
+ return this.textarea?.value ?? '';
431
+ }
432
+ }
433
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1lZGl0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9zdHJhdGVnaWVzL2RlZmF1bHQtZWRpdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUlIOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFHckIsWUFDbUIsT0FLaEI7UUFMZ0IsWUFBTyxHQUFQLE9BQU8sQ0FLdkI7SUFDQSxDQUFDO0lBRUosSUFBSSxDQUFDLE9BQWtDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQztZQUN4RCxPQUFPO1NBQ1I7UUFFRCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRywrQkFBK0IsQ0FBQztRQUN2RCxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUM7UUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFB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TyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUyxDQUFDLEtBQVksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBRUgsc0NBQXNDO1FBQ3RDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFN0MsYUFBYTtRQUNiLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsS0FBSyxLQUFLLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDeEI7U0FDRjtJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmF1bHQgZWRpdG9yIGltcGxlbWVudGF0aW9uc1xuICovXG5cbmltcG9ydCB7IENlbGxFZGl0b3IsIENlbGxFZGl0b3JDb250ZXh0IH0gZnJvbSAnLi4vbW9kZWxzL2NlbGwtc3RyYXRlZ2llcy5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIFRleHQgZWRpdG9yIC0gYmFzaWMgdGV4dCBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgVGV4dEVkaXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3I8c3RyaW5nPiB7XG4gIHByaXZhdGUgaW5wdXQ/OiBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucz86IHtcbiAgICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgICAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgICAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgICAgIHNlbGVjdE9uRm9jdXM/OiBib29sZWFuO1xuICAgIH1cbiAgKSB7fVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8c3RyaW5nPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGV4dEVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGlucHV0IGVsZW1lbnRcbiAgICB0aGlzLmlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICB0aGlzLmlucHV0LnR5cGUgPSAndGV4dCc7XG4gICAgdGhpcy5pbnB1dC52YWx1ZSA9IGNvbnRleHQudmFsdWUgPz8gJyc7XG4gICAgdGhpcy5pbnB1dC5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtdGV4dC1lZGl0b3InO1xuICAgIC8vIEFwcGx5IGlubGluZSBzdHlsZXMgZm9yIGZ1bGwgd2lkdGhcbiAgICB0aGlzLmlucHV0LnN0eWxlLndpZHRoID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUuaGVpZ2h0ID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUuYm9yZGVyID0gJ25vbmUnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUub3V0bGluZSA9ICdub25lJztcblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLmlucHV0LnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lm1heExlbmd0aCkge1xuICAgICAgdGhpcy5pbnB1dC5tYXhMZW5ndGggPSB0aGlzLm9wdGlvbnMubWF4TGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBFbnRlciB0byBzYXZlXG4gICAgdGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMuaW5wdXQhLnZhbHVlIGFzIGFueSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnRleHQub25DYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBibHVyIHRvIHNhdmVcbiAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XG4gICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLmlucHV0IS52YWx1ZSBhcyBhbnkpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2xlYXIgY29udGFpbmVyIGFuZCBhcHBlbmQgaW5wdXRcbiAgICBjb250ZXh0LmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250ZXh0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmlucHV0KTtcblxuICAgIC8vIEF1dG8gZm9jdXNcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgICBcbiAgICAgIGlmICh0aGlzLm9wdGlvbnM/LnNlbGVjdE9uRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuaW5wdXQuc2VsZWN0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnB1dCkge1xuICAgICAgdGhpcy5pbnB1dC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dD8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlucHV0Py52YWx1ZSA/PyAnJztcbiAgfVxufVxuXG4vKipcbiAqIE51bWJlciBlZGl0b3IgLSBudW1lcmljIGlucHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBOdW1iZXJFZGl0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yPG51bWJlcj4ge1xuICBwcml2YXRlIGlucHV0PzogSFRNTElucHV0RWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiB7XG4gICAgICBtaW4/OiBudW1iZXI7XG4gICAgICBtYXg/OiBudW1iZXI7XG4gICAgICBzdGVwPzogbnVtYmVyO1xuICAgICAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICAgICAgc2VsZWN0T25Gb2N1cz86IGJvb2xlYW47XG4gICAgfVxuICApIHt9XG5cbiAgZWRpdChjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxudW1iZXI+KTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdOdW1iZXJFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBpbnB1dCBlbGVtZW50XG4gICAgdGhpcy5pbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgdGhpcy5pbnB1dC50eXBlID0gJ251bWJlcic7XG4gICAgdGhpcy5pbnB1dC52YWx1ZSA9IGNvbnRleHQudmFsdWU/LnRvU3RyaW5nKCkgPz8gJyc7XG4gICAgdGhpcy5pbnB1dC5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtbnVtYmVyLWVkaXRvcic7XG4gICAgLy8gQXBwbHkgaW5saW5lIHN0eWxlcyB3aXRoIGZsZXgtZ3JvdyBmb3IgbnVtYmVyc1xuICAgIHRoaXMuaW5wdXQuc3R5bGUud2lkdGggPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5pbnB1dC5zdHlsZS5oZWlnaHQgPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5pbnB1dC5zdHlsZS5ib3hTaXppbmcgPSAnYm9yZGVyLWJveCc7XG4gICAgdGhpcy5pbnB1dC5zdHlsZS5mbGV4R3JvdyA9ICcxJztcbiAgICB0aGlzLmlucHV0LnN0eWxlLmJvcmRlciA9ICdub25lJztcbiAgICB0aGlzLmlucHV0LnN0eWxlLm91dGxpbmUgPSAnbm9uZSc7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5pbnB1dC5wbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5taW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbnB1dC5taW4gPSB0aGlzLm9wdGlvbnMubWluLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaW5wdXQubWF4ID0gdGhpcy5vcHRpb25zLm1heC50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnN0ZXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbnB1dC5zdGVwID0gdGhpcy5vcHRpb25zLnN0ZXAudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgRW50ZXIgdG8gc2F2ZVxuICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQodGhpcy5pbnB1dCEudmFsdWUpO1xuICAgICAgICBjb250ZXh0Lm9uU2F2ZSh2YWx1ZSBhcyBhbnkpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgYmx1ciB0byBzYXZlXG4gICAgdGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KHRoaXMuaW5wdXQhLnZhbHVlKTtcbiAgICAgIGNvbnRleHQub25TYXZlKHZhbHVlIGFzIGFueSk7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCBpbnB1dFxuICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGNvbnRleHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuaW5wdXQpO1xuXG4gICAgLy8gQXV0byBmb2N1c1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmF1dG9Gb2N1cyAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKTtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMub3B0aW9ucz8uc2VsZWN0T25Gb2N1cyAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5pbnB1dC5zZWxlY3QoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlucHV0KSB7XG4gICAgICB0aGlzLmlucHV0LnJlbW92ZSgpO1xuICAgICAgdGhpcy5pbnB1dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0Py5mb2N1cygpO1xuICB9XG5cbiAgZ2V0Q3VycmVudFZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpcy5pbnB1dD8udmFsdWUgPz8gJzAnKTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGUgZWRpdG9yIC0gZGF0ZSBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgRGF0ZUVkaXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3I8RGF0ZT4ge1xuICBwcml2YXRlIGlucHV0PzogSFRNTElucHV0RWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiB7XG4gICAgICBtaW4/OiBzdHJpbmcgfCBEYXRlO1xuICAgICAgbWF4Pzogc3RyaW5nIHwgRGF0ZTtcbiAgICAgIGF1dG9Gb2N1cz86IGJvb2xlYW47XG4gICAgfVxuICApIHt9XG5cbiAgZWRpdChjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxEYXRlPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignRGF0ZUVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGlucHV0IGVsZW1lbnRcbiAgICB0aGlzLmlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICB0aGlzLmlucHV0LnR5cGUgPSAnZGF0ZSc7XG4gICAgdGhpcy5pbnB1dC5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtZGF0ZS1lZGl0b3InO1xuICAgIC8vIEFwcGx5IGlubGluZSBzdHlsZXMgZm9yIGZ1bGwgd2lkdGhcbiAgICB0aGlzLmlucHV0LnN0eWxlLndpZHRoID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUuaGVpZ2h0ID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuaW5wdXQuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuXG4gICAgLy8gRm9ybWF0IGRhdGUgdmFsdWVcbiAgICBpZiAoY29udGV4dC52YWx1ZSkge1xuICAgICAgY29uc3QgZGF0ZSA9IGNvbnRleHQudmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gY29udGV4dC52YWx1ZSA6IG5ldyBEYXRlKGNvbnRleHQudmFsdWUpO1xuICAgICAgaWYgKCFpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhpcy5pbnB1dC52YWx1ZSA9IGRhdGUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lm1pbikge1xuICAgICAgY29uc3QgbWluRGF0ZSA9IHRoaXMub3B0aW9ucy5taW4gaW5zdGFuY2VvZiBEYXRlID8gdGhpcy5vcHRpb25zLm1pbiA6IG5ldyBEYXRlKHRoaXMub3B0aW9ucy5taW4pO1xuICAgICAgdGhpcy5pbnB1dC5taW4gPSBtaW5EYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5tYXgpIHtcbiAgICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm9wdGlvbnMubWF4IGluc3RhbmNlb2YgRGF0ZSA/IHRoaXMub3B0aW9ucy5tYXggOiBuZXcgRGF0ZSh0aGlzLm9wdGlvbnMubWF4KTtcbiAgICAgIHRoaXMuaW5wdXQubWF4ID0gbWF4RGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEVudGVyIHRvIHNhdmVcbiAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0IS52YWx1ZSA/IG5ldyBEYXRlKHRoaXMuaW5wdXQhLnZhbHVlKSA6IG51bGw7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHZhbHVlIGFzIGFueSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnRleHQub25DYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBjaGFuZ2UgdG8gc2F2ZVxuICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0IS52YWx1ZSA/IG5ldyBEYXRlKHRoaXMuaW5wdXQhLnZhbHVlKSA6IG51bGw7XG4gICAgICBjb250ZXh0Lm9uU2F2ZSh2YWx1ZSBhcyBhbnkpO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIGJsdXIgdG8gc2F2ZVxuICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnB1dCEudmFsdWUgPyBuZXcgRGF0ZSh0aGlzLmlucHV0IS52YWx1ZSkgOiBudWxsO1xuICAgICAgY29udGV4dC5vblNhdmUodmFsdWUgYXMgYW55KTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIGlucHV0XG4gICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5pbnB1dCk7XG5cbiAgICAvLyBBdXRvIGZvY3VzXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYXV0b0ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5wdXQpIHtcbiAgICAgIHRoaXMuaW5wdXQucmVtb3ZlKCk7XG4gICAgICB0aGlzLmlucHV0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXQ/LmZvY3VzKCk7XG4gIH1cblxuICBnZXRDdXJyZW50VmFsdWUoKTogRGF0ZSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0Py52YWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgPyBuZXcgRGF0ZSh2YWx1ZSkgOiBuZXcgRGF0ZSgpO1xuICB9XG59XG5cbi8qKlxuICogU2VsZWN0IGVkaXRvciAtIGRyb3Bkb3duIHNlbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0RWRpdG9yPFQgPSBhbnk+IGltcGxlbWVudHMgQ2VsbEVkaXRvcjxUPiB7XG4gIHByaXZhdGUgc2VsZWN0PzogSFRNTFNlbGVjdEVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiB7XG4gICAgICBvcHRpb25zOiBBcnJheTx7IHZhbHVlOiBUOyBsYWJlbDogc3RyaW5nIH0+O1xuICAgICAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICAgIH1cbiAgKSB7fVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRleHQuY29udGFpbmVyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NlbGVjdEVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHNlbGVjdCBlbGVtZW50XG4gICAgdGhpcy5zZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTtcbiAgICB0aGlzLnNlbGVjdC5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3Qtc2VsZWN0LWVkaXRvcic7XG4gICAgLy8gQXBwbHkgaW5saW5lIHN0eWxlcyBmb3IgZnVsbCB3aWR0aFxuICAgIHRoaXMuc2VsZWN0LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIHRoaXMuc2VsZWN0LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcblxuICAgIC8vIEFkZCBwbGFjZWhvbGRlciBvcHRpb25cbiAgICBpZiAodGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlck9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgcGxhY2Vob2xkZXJPcHRpb24udmFsdWUgPSAnJztcbiAgICAgIHBsYWNlaG9sZGVyT3B0aW9uLnRleHRDb250ZW50ID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgICAgcGxhY2Vob2xkZXJPcHRpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zZWxlY3QuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXJPcHRpb24pO1xuICAgIH1cblxuICAgIC8vIEFkZCBvcHRpb25zXG4gICAgdGhpcy5vcHRpb25zLm9wdGlvbnMuZm9yRWFjaChvcHQgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHRpb24udmFsdWUgPSBTdHJpbmcob3B0LnZhbHVlKTtcbiAgICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IG9wdC5sYWJlbDtcbiAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG9wdC52YWx1ZSA9PT0gY29udGV4dC52YWx1ZTtcbiAgICAgIHRoaXMuc2VsZWN0IS5hcHBlbmRDaGlsZChvcHRpb24pO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIGNoYW5nZSB0byBzYXZlXG4gICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMub3B0aW9ucy5maW5kKFxuICAgICAgICBvcHQgPT4gU3RyaW5nKG9wdC52YWx1ZSkgPT09IHRoaXMuc2VsZWN0IS52YWx1ZVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICBjb250ZXh0Lm9uU2F2ZShzZWxlY3RlZE9wdGlvbi52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUga2V5ZG93blxuICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnRleHQub25DYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBibHVyIHRvIGNhbmNlbCAoYWxyZWFkeSBzYXZlZCBvbiBjaGFuZ2UpXG4gICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgIC8vIERvbid0IHNhdmUgb24gYmx1ciBzaW5jZSB3ZSBzYXZlIG9uIGNoYW5nZVxuICAgICAgY29udGV4dC5vbkNhbmNlbCgpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2xlYXIgY29udGFpbmVyIGFuZCBhcHBlbmQgc2VsZWN0XG4gICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zZWxlY3QpO1xuXG4gICAgLy8gQXV0byBmb2N1c1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zZWxlY3QuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdCkge1xuICAgICAgdGhpcy5zZWxlY3QucmVtb3ZlKCk7XG4gICAgICB0aGlzLnNlbGVjdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdD8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMub3B0aW9ucy5vcHRpb25zLmZpbmQoXG4gICAgICBvcHQgPT4gU3RyaW5nKG9wdC52YWx1ZSkgPT09IHRoaXMuc2VsZWN0Py52YWx1ZVxuICAgICk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uPy52YWx1ZSA/PyAoJycgYXMgYW55KTtcbiAgfVxufVxuXG4vKipcbiAqIEJvb2xlYW4gZWRpdG9yIC0gY2hlY2tib3hcbiAqL1xuZXhwb3J0IGNsYXNzIEJvb2xlYW5FZGl0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yPGJvb2xlYW4+IHtcbiAgcHJpdmF0ZSBjaGVja2JveD86IEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zPzoge1xuICAgICAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgICAgIHNhdmVPbkNoYW5nZT86IGJvb2xlYW47XG4gICAgfVxuICApIHt9XG5cbiAgZWRpdChjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxib29sZWFuPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignQm9vbGVhbkVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNoZWNrYm94IGVsZW1lbnRcbiAgICB0aGlzLmNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICB0aGlzLmNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIHRoaXMuY2hlY2tib3guY2hlY2tlZCA9ICEhY29udGV4dC52YWx1ZTtcbiAgICB0aGlzLmNoZWNrYm94LmNsYXNzTmFtZSA9ICdzdC1jZWxsLWVkaXRvciBzdC1ib29sZWFuLWVkaXRvcic7XG4gICAgLy8gQXBwbHkgaW5saW5lIHN0eWxlcyAoY2VudGVyZWQgY2hlY2tib3gpXG4gICAgdGhpcy5jaGVja2JveC5zdHlsZS5tYXJnaW4gPSAnMCBhdXRvJztcbiAgICB0aGlzLmNoZWNrYm94LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgLy8gSGFuZGxlIGNoYW5nZSB0byBzYXZlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2F2ZU9uQ2hhbmdlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMuY2hlY2tib3ghLmNoZWNrZWQgYXMgYW55KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBrZXlkb3duXG4gICAgdGhpcy5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMuY2hlY2tib3ghLmNoZWNrZWQgYXMgYW55KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29udGV4dC5vbkNhbmNlbCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2xlYXIgY29udGFpbmVyIGFuZCBhcHBlbmQgY2hlY2tib3hcbiAgICBjb250ZXh0LmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250ZXh0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNoZWNrYm94KTtcblxuICAgIC8vIEF1dG8gZm9jdXNcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmNoZWNrYm94LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGVja2JveCkge1xuICAgICAgdGhpcy5jaGVja2JveC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuY2hlY2tib3ggPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja2JveD8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja2JveD8uY2hlY2tlZCA/PyBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRleHRhcmVhIGVkaXRvciAtIG11bHRpLWxpbmUgdGV4dCBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgVGV4dEFyZWFFZGl0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yPHN0cmluZz4ge1xuICBwcml2YXRlIHRleHRhcmVhPzogSFRNTFRleHRBcmVhRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiB7XG4gICAgICByb3dzPzogbnVtYmVyO1xuICAgICAgY29scz86IG51bWJlcjtcbiAgICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgICAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgICAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgICAgIHNlbGVjdE9uRm9jdXM/OiBib29sZWFuO1xuICAgIH1cbiAgKSB7fVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8c3RyaW5nPik6IHZvaWQge1xuICAgIGlmICghY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGV4dEFyZWFFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0ZXh0YXJlYSBlbGVtZW50XG4gICAgdGhpcy50ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGhpcy50ZXh0YXJlYS52YWx1ZSA9IGNvbnRleHQudmFsdWUgPz8gJyc7XG4gICAgdGhpcy50ZXh0YXJlYS5jbGFzc05hbWUgPSAnc3QtY2VsbC1lZGl0b3Igc3QtdGV4dGFyZWEtZWRpdG9yJztcbiAgICAvLyBBcHBseSBpbmxpbmUgc3R5bGVzIGZvciBmdWxsIHdpZHRoXG4gICAgdGhpcy50ZXh0YXJlYS5zdHlsZS53aWR0aCA9ICdpbmhlcml0JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICdpbmhlcml0JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLnJlc2l6ZSA9ICd2ZXJ0aWNhbCc7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy50ZXh0YXJlYS5wbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5tYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMudGV4dGFyZWEubWF4TGVuZ3RoID0gdGhpcy5vcHRpb25zLm1heExlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5yb3dzKSB7XG4gICAgICB0aGlzLnRleHRhcmVhLnJvd3MgPSB0aGlzLm9wdGlvbnMucm93cztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5jb2xzKSB7XG4gICAgICB0aGlzLnRleHRhcmVhLmNvbHMgPSB0aGlzLm9wdGlvbnMuY29scztcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgQ3RybCtFbnRlciB0byBzYXZlXG4gICAgdGhpcy50ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLnRleHRhcmVhIS52YWx1ZSBhcyBhbnkpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgYmx1ciB0byBzYXZlXG4gICAgdGhpcy50ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgY29udGV4dC5vblNhdmUodGhpcy50ZXh0YXJlYSEudmFsdWUgYXMgYW55KTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIHRleHRhcmVhXG4gICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy50ZXh0YXJlYSk7XG5cbiAgICAvLyBBdXRvIGZvY3VzXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYXV0b0ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy50ZXh0YXJlYS5mb2N1cygpO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5vcHRpb25zPy5zZWxlY3RPbkZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnRleHRhcmVhLnNlbGVjdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGV4dGFyZWEpIHtcbiAgICAgIHRoaXMudGV4dGFyZWEucmVtb3ZlKCk7XG4gICAgICB0aGlzLnRleHRhcmVhID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMudGV4dGFyZWE/LmZvY3VzKCk7XG4gIH1cblxuICBnZXRDdXJyZW50VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0YXJlYT8udmFsdWUgPz8gJyc7XG4gIH1cbn1cblxuIl19