@progress-chef/platform-shared-components 0.0.154 → 0.0.156-rc.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.
Files changed (135) hide show
  1. package/assets/icons/IconFont.css +6 -3
  2. package/assets/icons/IconFont.scss +6 -3
  3. package/assets/icons/IconFont.ttf +0 -0
  4. package/assets/icons/IconFont.woff +0 -0
  5. package/assets/icons/IconFont.woff2 +0 -0
  6. package/esm2022/lib/atoms/alert/alert.component.mjs +3 -3
  7. package/esm2022/lib/atoms/alert/alert.module.mjs +4 -4
  8. package/esm2022/lib/atoms/angular-popup/angular-popup.component.mjs +3 -3
  9. package/esm2022/lib/atoms/angular-popup/angular-popup.module.mjs +4 -4
  10. package/esm2022/lib/atoms/atoms.module.mjs +19 -5
  11. package/esm2022/lib/atoms/avatar/avatar.component.mjs +3 -3
  12. package/esm2022/lib/atoms/avatar/avatar.module.mjs +4 -4
  13. package/esm2022/lib/atoms/breadcrumb/breadcrumb.component.mjs +3 -3
  14. package/esm2022/lib/atoms/breadcrumb/breadcrumb.module.mjs +4 -4
  15. package/esm2022/lib/atoms/button/button.component.mjs +3 -3
  16. package/esm2022/lib/atoms/button/button.module.mjs +4 -4
  17. package/esm2022/lib/atoms/button-group/button-group.component.mjs +3 -3
  18. package/esm2022/lib/atoms/button-group/button-group.module.mjs +4 -4
  19. package/esm2022/lib/atoms/checkbox/checkbox.component.mjs +3 -3
  20. package/esm2022/lib/atoms/checkbox/checkbox.module.mjs +4 -4
  21. package/esm2022/lib/atoms/chip/chip.component.mjs +3 -3
  22. package/esm2022/lib/atoms/chip/chip.module.mjs +4 -4
  23. package/esm2022/lib/atoms/chip-list/chip-list.component.mjs +3 -3
  24. package/esm2022/lib/atoms/chip-list/chip-list.module.mjs +4 -4
  25. package/esm2022/lib/atoms/clipboard/clipboard.component.mjs +3 -3
  26. package/esm2022/lib/atoms/clipboard/clipboard.module.mjs +4 -4
  27. package/esm2022/lib/atoms/container/container.component.mjs +3 -3
  28. package/esm2022/lib/atoms/container/container.module.mjs +4 -4
  29. package/esm2022/lib/atoms/date-range/date-range.component.mjs +3 -3
  30. package/esm2022/lib/atoms/date-range/date-range.module.mjs +4 -4
  31. package/esm2022/lib/atoms/datepicker/datepicker.component.mjs +3 -3
  32. package/esm2022/lib/atoms/datepicker/datepicker.module.mjs +4 -4
  33. package/esm2022/lib/atoms/drag-and-drop/drag-and-drop.component.mjs +33 -5
  34. package/esm2022/lib/atoms/drag-and-drop/drag-and-drop.module.mjs +4 -4
  35. package/esm2022/lib/atoms/dropdown/dropdown.component.mjs +3 -3
  36. package/esm2022/lib/atoms/dropdown/dropdown.module.mjs +4 -4
  37. package/esm2022/lib/atoms/dropdown-button/dropdown-button.component.mjs +3 -3
  38. package/esm2022/lib/atoms/dropdown-button/dropdown-button.module.mjs +4 -4
  39. package/esm2022/lib/atoms/dropdown-tree/dropdowntree.component.mjs +3 -3
  40. package/esm2022/lib/atoms/dropdown-tree/dropdowntree.module.mjs +4 -4
  41. package/esm2022/lib/atoms/expansion-panel/expansion-panel.component.mjs +3 -3
  42. package/esm2022/lib/atoms/expansion-panel/expansion-panel.module.mjs +4 -4
  43. package/esm2022/lib/atoms/icon/icon.component.mjs +4 -4
  44. package/esm2022/lib/atoms/icon/icon.module.mjs +4 -4
  45. package/esm2022/lib/atoms/labels/label.component.mjs +3 -3
  46. package/esm2022/lib/atoms/labels/label.module.mjs +4 -4
  47. package/esm2022/lib/atoms/list-views/list-view.component.mjs +3 -3
  48. package/esm2022/lib/atoms/list-views/list-view.module.mjs +4 -4
  49. package/esm2022/lib/atoms/loader/loader.component.mjs +3 -3
  50. package/esm2022/lib/atoms/loader/loader.module.mjs +4 -4
  51. package/esm2022/lib/atoms/loading-spinner/loading-spinner.component.mjs +3 -3
  52. package/esm2022/lib/atoms/loading-spinner/loading-spinner.module.mjs +4 -4
  53. package/esm2022/lib/atoms/markdown-display/markdown-display.component.mjs +39 -0
  54. package/esm2022/lib/atoms/markdown-display/markdown-display.module.mjs +26 -0
  55. package/esm2022/lib/atoms/markdown-display/markdown-display.service.mjs +53 -0
  56. package/esm2022/lib/atoms/multi-select-dropdown/multi-select-dropdown.component.mjs +3 -3
  57. package/esm2022/lib/atoms/multi-select-dropdown/multi-select-dropdown.module.mjs +4 -4
  58. package/esm2022/lib/atoms/notification/notification.component.mjs +3 -3
  59. package/esm2022/lib/atoms/notification/notification.module.mjs +4 -4
  60. package/esm2022/lib/atoms/numeric-textbox/numeric-textbox.component.mjs +3 -3
  61. package/esm2022/lib/atoms/numeric-textbox/numeric-textbox.module.mjs +4 -4
  62. package/esm2022/lib/atoms/progress-bar/progress-bar.component.mjs +3 -3
  63. package/esm2022/lib/atoms/progress-bar/progress-bar.module.mjs +4 -4
  64. package/esm2022/lib/atoms/radio-button/radio-button.component.mjs +3 -3
  65. package/esm2022/lib/atoms/radio-button/radio-button.module.mjs +4 -4
  66. package/esm2022/lib/atoms/search-box/search-box.component.mjs +3 -3
  67. package/esm2022/lib/atoms/search-box/search-box.module.mjs +4 -4
  68. package/esm2022/lib/atoms/slider/slider.component.mjs +3 -3
  69. package/esm2022/lib/atoms/slider/slider.module.mjs +4 -4
  70. package/esm2022/lib/atoms/stepper/stepper.component.mjs +3 -3
  71. package/esm2022/lib/atoms/stepper/stepper.module.mjs +4 -4
  72. package/esm2022/lib/atoms/switch/switch.component.mjs +3 -3
  73. package/esm2022/lib/atoms/switch/switch.module.mjs +4 -4
  74. package/esm2022/lib/atoms/text-area/text-area.component.mjs +3 -3
  75. package/esm2022/lib/atoms/text-area/text-area.module.mjs +4 -4
  76. package/esm2022/lib/atoms/textbox/textbox.component.mjs +3 -3
  77. package/esm2022/lib/atoms/textbox/textbox.module.mjs +4 -4
  78. package/esm2022/lib/atoms/time-picker/time-picker.component.mjs +3 -3
  79. package/esm2022/lib/atoms/time-picker/time-picker.module.mjs +4 -4
  80. package/esm2022/lib/atoms/timescheduler/timescheduler.component.mjs +3 -3
  81. package/esm2022/lib/atoms/timescheduler/timescheduler.module.mjs +4 -4
  82. package/esm2022/lib/atoms/tooltip/tooltip.component.mjs +3 -3
  83. package/esm2022/lib/atoms/tooltip/tooltip.module.mjs +4 -4
  84. package/esm2022/lib/atoms/tree-list/tree-list.component.mjs +404 -0
  85. package/esm2022/lib/atoms/tree-list/tree-list.interfaces.mjs +2 -0
  86. package/esm2022/lib/atoms/tree-list/tree-list.module.mjs +44 -0
  87. package/esm2022/lib/atoms/tree-view/tree-view.component.mjs +521 -0
  88. package/esm2022/lib/atoms/tree-view/tree-view.interfaces.mjs +2 -0
  89. package/esm2022/lib/atoms/tree-view/tree-view.module.mjs +44 -0
  90. package/esm2022/lib/atoms/typography/typography.component.mjs +3 -3
  91. package/esm2022/lib/atoms/typography/typography.module.mjs +4 -4
  92. package/esm2022/lib/atoms/uploader/uploader.component.mjs +3 -3
  93. package/esm2022/lib/atoms/uploader/uploader.module.mjs +4 -4
  94. package/esm2022/lib/molecules/card/card-actions/card-actions.component.mjs +3 -3
  95. package/esm2022/lib/molecules/card/card-body/card-body.component.mjs +3 -3
  96. package/esm2022/lib/molecules/card/card-footer/card-footer.component.mjs +3 -3
  97. package/esm2022/lib/molecules/card/card-header/card-header.component.mjs +3 -3
  98. package/esm2022/lib/molecules/card/card.component.mjs +3 -3
  99. package/esm2022/lib/molecules/card/card.module.mjs +4 -4
  100. package/esm2022/lib/molecules/dialog/confirmation-dialog/confirmation-dialog.component.mjs +3 -3
  101. package/esm2022/lib/molecules/dialog/dialog-actions/dialog-actions.component.mjs +3 -3
  102. package/esm2022/lib/molecules/dialog/dialog-titlebar/dialog-titlebar.component.mjs +3 -3
  103. package/esm2022/lib/molecules/dialog/dialog.component.mjs +3 -3
  104. package/esm2022/lib/molecules/dialog/dialog.module.mjs +4 -4
  105. package/esm2022/lib/molecules/grid-form/grid-form.component.mjs +3 -3
  106. package/esm2022/lib/molecules/grid-form/grid-form.module.mjs +4 -4
  107. package/esm2022/lib/molecules/grid-layout/grid-layout-item/grid-layout-item.component.mjs +3 -3
  108. package/esm2022/lib/molecules/grid-layout/grid-layout.component.mjs +3 -3
  109. package/esm2022/lib/molecules/grid-layout/grid-layout.module.mjs +4 -4
  110. package/esm2022/lib/molecules/grid-pagination/grid-pagination-spacer/grid-pagination-spacer.component.mjs +3 -3
  111. package/esm2022/lib/molecules/grid-pagination/grid-pagination.component.mjs +6 -6
  112. package/esm2022/lib/molecules/grid-pagination/grid-pagination.module.mjs +4 -4
  113. package/esm2022/lib/molecules/grid-pagination/kebab-menu-filter.pipe.mjs +3 -3
  114. package/esm2022/lib/molecules/molecules.module.mjs +4 -4
  115. package/esm2022/lib/molecules/tabstrip/tabstrip-tab/tabstrip-tab.component.mjs +3 -3
  116. package/esm2022/lib/molecules/tabstrip/tabstrip.component.mjs +3 -3
  117. package/esm2022/lib/molecules/tabstrip/tabstrip.module.mjs +4 -4
  118. package/esm2022/lib/shared.component.mjs +3 -3
  119. package/esm2022/lib/shared.module.mjs +4 -4
  120. package/esm2022/public-api.mjs +7 -1
  121. package/fesm2022/progress-chef-platform-shared-components.mjs +1501 -375
  122. package/fesm2022/progress-chef-platform-shared-components.mjs.map +1 -1
  123. package/lib/atoms/atoms.module.d.ts +5 -3
  124. package/lib/atoms/drag-and-drop/drag-and-drop.component.d.ts +10 -1
  125. package/lib/atoms/markdown-display/markdown-display.component.d.ts +22 -0
  126. package/lib/atoms/markdown-display/markdown-display.module.d.ts +8 -0
  127. package/lib/atoms/markdown-display/markdown-display.service.d.ts +23 -0
  128. package/lib/atoms/tree-list/tree-list.component.d.ts +288 -0
  129. package/lib/atoms/tree-list/tree-list.interfaces.d.ts +31 -0
  130. package/lib/atoms/tree-list/tree-list.module.d.ts +13 -0
  131. package/lib/atoms/tree-view/tree-view.component.d.ts +279 -0
  132. package/lib/atoms/tree-view/tree-view.interfaces.d.ts +23 -0
  133. package/lib/atoms/tree-view/tree-view.module.d.ts +13 -0
  134. package/package.json +2 -1
  135. package/public-api.d.ts +6 -0
@@ -0,0 +1,521 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { of } from 'rxjs';
4
+ import { TreeViewModule } from '@progress/kendo-angular-treeview';
5
+ import { IconsModule } from '@progress/kendo-angular-icons';
6
+ import { ButtonComponent } from '../button/button.component';
7
+ import { IconComponent } from '../icon/icon.component';
8
+ import { LoaderComponent } from '../loader/loader.component';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/common";
11
+ import * as i2 from "@progress/kendo-angular-treeview";
12
+ /**
13
+ * Custom TreeView component that wraps Kendo's TreeView with design system styling.
14
+ *
15
+ * This component provides a hierarchical tree structure for displaying and navigating data.
16
+ * It supports selection, expansion, icons, and custom templates.
17
+ */
18
+ export class TreeViewComponent {
19
+ constructor() {
20
+ /**
21
+ * The data source for the tree view
22
+ */
23
+ this.data = [];
24
+ // Basic Properties
25
+ this.selectable = false;
26
+ this.filterable = false;
27
+ this.checkboxes = false;
28
+ this.checkable = false;
29
+ this.dragAndDrop = false;
30
+ this.expandable = true;
31
+ this.loading = false;
32
+ this.animate = true;
33
+ this.size = 'medium';
34
+ // Field Configuration
35
+ this.textField = 'text';
36
+ this.childrenField = 'children';
37
+ this.hasChildrenField = 'hasChildren';
38
+ this.expandedField = 'expanded';
39
+ this.selectedField = 'selected';
40
+ this.disabledField = 'disabled';
41
+ this.checkedField = 'checked';
42
+ this.iconClassField = 'iconClass';
43
+ this.iconField = 'icon';
44
+ this.imageUrlField = 'imageUrl';
45
+ this.spriteCssClassField = 'spriteCssClass';
46
+ // Selection and Expansion
47
+ this.disabledKeys = [];
48
+ this.expandBy = ''; //if expandBy is empty, expandedKeys will use index to track expansion. Otherwise, it will use the field name to decide the expandedKeys.
49
+ this.expandedKeys = [];
50
+ this.selectedKeys = [];
51
+ this.checkedKeys = [];
52
+ this.expandDisabledNodes = false;
53
+ this.disableNodes = false;
54
+ // Checkbox Configuration
55
+ this.enableCheck = false;
56
+ this.checkChildren = false;
57
+ this.checkDisabledChildren = false;
58
+ this.checkParents = false;
59
+ this.checkOnClick = false;
60
+ this.uncheckCollapsedChildren = false;
61
+ this.checkMode = "multiple";
62
+ this.pageSize = 0;
63
+ this.loadOnDemand = false;
64
+ // Filtering
65
+ this.filter = '';
66
+ // Keyboard Navigation
67
+ this.navigable = true;
68
+ // Basic Events
69
+ this.selectionChange = new EventEmitter();
70
+ this.expand = new EventEmitter();
71
+ this.collapse = new EventEmitter();
72
+ this.checkedChange = new EventEmitter();
73
+ this.nodeClick = new EventEmitter();
74
+ this.nodeDblClick = new EventEmitter();
75
+ // Drag and Drop Events
76
+ this.nodeDragStart = new EventEmitter();
77
+ this.nodeDrag = new EventEmitter();
78
+ this.nodeDrop = new EventEmitter();
79
+ this.nodeDragEnd = new EventEmitter();
80
+ this.addItem = new EventEmitter();
81
+ this.removeItem = new EventEmitter();
82
+ // Key Change Events (Two-way binding support)
83
+ this.expandedKeysChange = new EventEmitter();
84
+ this.selectedKeysChange = new EventEmitter();
85
+ this.checkedKeysChange = new EventEmitter();
86
+ // Filter Events
87
+ this.filterChange = new EventEmitter();
88
+ // Load More Events
89
+ this.loadMore = new EventEmitter();
90
+ // Children Loading Events
91
+ this.childrenLoaded = new EventEmitter();
92
+ /**
93
+ * Currently selected items
94
+ */
95
+ this.selectedItems = [];
96
+ /**
97
+ * Currently checked items
98
+ */
99
+ this.checkedItems = [];
100
+ /**
101
+ * Extracts and returns child items from a tree node using the configured children field.
102
+ * Provides a standardized way for the Kendo TreeView to access hierarchical child data
103
+ * regardless of the actual field name used in the data structure.
104
+ *
105
+ * @param dataItem - The tree node data item to extract children from
106
+ * @returns Observable array of child items or empty array if no children exist
107
+ */
108
+ this.children = (dataItem) => of(dataItem[this.childrenField]);
109
+ /**
110
+ * Determines whether a tree node has child items for proper expand/collapse icon display.
111
+ * Checks for the existence of children property and logs the result for debugging purposes.
112
+ * Used by the TreeView to decide whether to show expansion indicators for each node.
113
+ *
114
+ * @param dataItem - The tree node data item to check for children
115
+ * @returns Boolean indicating whether the node has children that can be expanded
116
+ */
117
+ this.hasChildren = (dataItem) => { return !!dataItem[this.childrenField]; };
118
+ }
119
+ /**
120
+ * Generates CSS classes for the tree-view container element based on current component state.
121
+ * Applies conditional styling classes to reflect loading states and enable appropriate visual feedback.
122
+ *
123
+ * @returns A space-separated string of CSS class names to apply to the tree-view container
124
+ */
125
+ getTreeViewClasses() {
126
+ const classes = ['lib-tree-view'];
127
+ if (this.loading) {
128
+ classes.push('lib-tree-view--loading');
129
+ }
130
+ return classes.join(' ');
131
+ }
132
+ /**
133
+ * Provides comprehensive checkable settings configuration for the Kendo TreeView component.
134
+ * Aggregates all checkbox-related input properties into a single configuration object
135
+ * that controls checkbox behavior including parent-child relationships and interaction modes.
136
+ *
137
+ * @returns CheckableSettings object with all checkbox configuration options
138
+ */
139
+ get checkableSettings() {
140
+ return {
141
+ checkChildren: this.checkChildren,
142
+ checkDisabledChildren: this.checkDisabledChildren,
143
+ checkParents: this.checkParents,
144
+ enabled: this.enableCheck,
145
+ mode: this.checkMode,
146
+ checkOnClick: this.checkOnClick,
147
+ uncheckCollapsedChildren: this.uncheckCollapsedChildren,
148
+ };
149
+ }
150
+ // Event Handlers
151
+ /**
152
+ * Handles tree node selection changes when users select or deselect nodes.
153
+ * Updates the internal selected items state and propagates the selection event
154
+ * to parent components for external handling and synchronization.
155
+ *
156
+ * @param event - The selection change event containing the newly selected items array
157
+ */
158
+ onSelectionChange(event) {
159
+ this.selectedItems = event;
160
+ this.selectionChange.emit(event);
161
+ }
162
+ /**
163
+ * Handles checkbox state changes when users check or uncheck tree nodes.
164
+ * Updates the internal checked items state and emits the change event to notify
165
+ * parent components of the new checkbox selections for form validation or data processing.
166
+ *
167
+ * @param event - The checked change event containing the newly checked items array
168
+ */
169
+ onCheckedChange(event) {
170
+ this.checkedItems = event;
171
+ this.checkedChange.emit(event);
172
+ }
173
+ /**
174
+ * Handles tree node expansion events when users click expand icons or use keyboard navigation.
175
+ * Updates the node's expanded state in the data model and emits the expand event
176
+ * for parent components to handle lazy loading of child data or state persistence.
177
+ *
178
+ * @param event - The expand event containing the expanded node data and context information
179
+ */
180
+ onExpand(event) {
181
+ if (event.dataItem) {
182
+ event.dataItem[this.expandedField] = true;
183
+ }
184
+ this.expand.emit(event);
185
+ }
186
+ /**
187
+ * Handles tree node collapse events when users click collapse icons or use keyboard navigation.
188
+ * Updates the node's expanded state in the data model and emits the collapse event
189
+ * for parent components to handle state cleanup or memory optimization.
190
+ *
191
+ * @param event - The collapse event containing the collapsed node data and context information
192
+ */
193
+ onCollapse(event) {
194
+ if (event.dataItem) {
195
+ event.dataItem[this.expandedField] = false;
196
+ }
197
+ this.collapse.emit(event);
198
+ }
199
+ /**
200
+ * Handles single-click events on tree nodes for custom interaction handling.
201
+ * Propagates click events to parent components for navigation, selection logic,
202
+ * or custom actions based on the clicked node's data and context.
203
+ *
204
+ * @param event - The node click event containing clicked node data and mouse event details
205
+ */
206
+ onNodeClick(event) {
207
+ this.nodeClick.emit(event);
208
+ }
209
+ /**
210
+ * Handles double-click events on tree nodes for enhanced interaction patterns.
211
+ * Typically used for opening detailed views, editing modes, or quick actions
212
+ * that differ from single-click behavior. Emits event for parent component handling.
213
+ *
214
+ * @param event - The node double-click event containing node data and mouse event details
215
+ */
216
+ onNodeDblClick(event) {
217
+ this.nodeDblClick.emit(event);
218
+ }
219
+ /**
220
+ * Handles the initiation of drag operations when users start dragging tree nodes.
221
+ * Validates that drag-and-drop functionality is enabled before proceeding and
222
+ * emits the drag start event for parent components to handle drag state setup.
223
+ *
224
+ * @param event - The tree item drag start event containing source node and drag context
225
+ */
226
+ onNodeDragStart(event) {
227
+ if (!this.dragAndDrop) {
228
+ return;
229
+ }
230
+ this.nodeDragStart.emit(event);
231
+ }
232
+ /**
233
+ * Handles ongoing drag operations as users move nodes during drag-and-drop actions.
234
+ * Provides real-time feedback and validation during the drag process, allowing
235
+ * parent components to update UI indicators or validate drop targets.
236
+ *
237
+ * @param event - The tree item drag event containing current drag position and target information
238
+ */
239
+ onNodeDrag(event) {
240
+ this.nodeDrag.emit(event);
241
+ }
242
+ /**
243
+ * Handles the completion of drag operations when users finish dragging nodes.
244
+ * Provides cleanup and final processing for drag-and-drop operations, allowing
245
+ * parent components to finalize data updates and reset drag-related UI states.
246
+ *
247
+ * @param event - The tree item drag end event containing final drag state and completion context
248
+ */
249
+ onNodeDragEnd(event) {
250
+ this.nodeDragEnd.emit(event);
251
+ }
252
+ /**
253
+ * Handles item addition events when new nodes are added to the tree structure.
254
+ * Propagates add events to parent components for data persistence, validation,
255
+ * and tree structure updates to maintain data integrity.
256
+ *
257
+ * @param event - The tree item add event containing new item data and insertion context
258
+ */
259
+ onAddItem(event) {
260
+ this.addItem.emit(event);
261
+ }
262
+ /**
263
+ * Handles item removal events when nodes are deleted from the tree structure.
264
+ * Propagates remove events to parent components for confirmation dialogs, data cleanup,
265
+ * and cascading deletions of child nodes when necessary.
266
+ *
267
+ * @param event - The tree item remove event containing deleted item data and context
268
+ */
269
+ onRemoveItem(event) {
270
+ this.removeItem.emit(event);
271
+ }
272
+ /**
273
+ * Handles expanded keys changes for two-way binding support with parent components.
274
+ * Synchronizes internal expanded state with external data binding, enabling
275
+ * programmatic control of tree expansion and state persistence across component updates.
276
+ *
277
+ * @param keys - Array of string keys representing currently expanded tree nodes
278
+ */
279
+ onExpandedKeysChange(keys) {
280
+ this.expandedKeys = keys;
281
+ this.expandedKeysChange.emit(keys);
282
+ }
283
+ /**
284
+ * Handles selected keys changes for two-way binding support with parent components.
285
+ * Synchronizes internal selection state with external data binding, enabling
286
+ * programmatic control of tree selection and form integration capabilities.
287
+ *
288
+ * @param keys - Array of string keys representing currently selected tree nodes
289
+ */
290
+ onSelectedKeysChange(keys) {
291
+ this.selectedKeys = keys;
292
+ this.selectedKeysChange.emit(keys);
293
+ }
294
+ /**
295
+ * Handles checked keys changes for two-way binding support with parent components.
296
+ * Synchronizes internal checkbox state with external data binding, enabling
297
+ * programmatic control of checkbox selections and form validation integration.
298
+ *
299
+ * @param keys - Array of string keys representing currently checked tree nodes
300
+ */
301
+ onCheckedKeysChange(keys) {
302
+ this.checkedKeys = keys;
303
+ this.checkedKeysChange.emit(keys);
304
+ }
305
+ /**
306
+ * Handles filter text changes when users type in search fields or apply filtering criteria.
307
+ * Updates the internal filter state and propagates changes to parent components
308
+ * for server-side filtering or custom search logic implementation.
309
+ *
310
+ * @param filter - The filter string entered by the user for tree node searching
311
+ */
312
+ onFilterChange(filter) {
313
+ this.filter = filter;
314
+ this.filterChange.emit(filter);
315
+ }
316
+ /**
317
+ * Handle load more event
318
+ */
319
+ onLoadMore(event) {
320
+ this.loadMore.emit(event);
321
+ }
322
+ /**
323
+ * Handle children loaded event
324
+ */
325
+ onChildrenLoaded(event) {
326
+ this.childrenLoaded.emit(event);
327
+ }
328
+ // Utility Methods
329
+ /**
330
+ * Expand all nodes
331
+ */
332
+ expandAll() {
333
+ if (this.treeViewElement) {
334
+ // Implementation depends on Kendo TreeView API
335
+ }
336
+ }
337
+ /**
338
+ * Get item from lookup
339
+ */
340
+ itemLookup(index) {
341
+ if (this.treeViewElement) {
342
+ return this.treeViewElement.itemLookup(index);
343
+ }
344
+ return undefined;
345
+ }
346
+ /**
347
+ * Log function for debugging events
348
+ */
349
+ log(eventName, event) {
350
+ console.log(`${eventName}:`, event);
351
+ }
352
+ /**
353
+ * Handle drop event with custom logic
354
+ */
355
+ handleDrop(event) {
356
+ console.log('handleDrop:', event);
357
+ // Add custom drop handling logic here
358
+ this.nodeDrop.emit(event);
359
+ }
360
+ /**
361
+ * Handle node drag start event
362
+ */
363
+ onDragStart(event) {
364
+ if (!this.dragAndDrop) {
365
+ event.preventDefault();
366
+ }
367
+ }
368
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: TreeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
369
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: TreeViewComponent, isStandalone: true, selector: "lib-tree-view", inputs: { data: "data", selectable: "selectable", filterable: "filterable", checkboxes: "checkboxes", checkable: "checkable", dragAndDrop: "dragAndDrop", expandable: "expandable", loading: "loading", animate: "animate", size: "size", textField: "textField", childrenField: "childrenField", hasChildrenField: "hasChildrenField", expandedField: "expandedField", selectedField: "selectedField", disabledField: "disabledField", checkedField: "checkedField", iconClassField: "iconClassField", iconField: "iconField", imageUrlField: "imageUrlField", spriteCssClassField: "spriteCssClassField", disabledKeys: "disabledKeys", expandBy: "expandBy", expandedKeys: "expandedKeys", selectedKeys: "selectedKeys", checkedKeys: "checkedKeys", expandDisabledNodes: "expandDisabledNodes", disableNodes: "disableNodes", enableCheck: "enableCheck", checkChildren: "checkChildren", checkDisabledChildren: "checkDisabledChildren", checkParents: "checkParents", checkOnClick: "checkOnClick", uncheckCollapsedChildren: "uncheckCollapsedChildren", checkMode: "checkMode", fetchChildren: "fetchChildren", isChecked: "isChecked", isDisabled: "isDisabled", isExpanded: "isExpanded", isSelected: "isSelected", isVisible: "isVisible", nodeTemplate: "nodeTemplate", loadMoreButtonTemplate: "loadMoreButtonTemplate", loadMoreService: "loadMoreService", pageSize: "pageSize", loadOnDemand: "loadOnDemand", filter: "filter", filterSettings: "filterSettings", navigable: "navigable", trackBy: "trackBy" }, outputs: { selectionChange: "selectionChange", expand: "expand", collapse: "collapse", checkedChange: "checkedChange", nodeClick: "nodeClick", nodeDblClick: "nodeDblClick", nodeDragStart: "nodeDragStart", nodeDrag: "nodeDrag", nodeDrop: "nodeDrop", nodeDragEnd: "nodeDragEnd", addItem: "addItem", removeItem: "removeItem", expandedKeysChange: "expandedKeysChange", selectedKeysChange: "selectedKeysChange", checkedKeysChange: "checkedKeysChange", filterChange: "filterChange", loadMore: "loadMore", childrenLoaded: "childrenLoaded" }, viewQueries: [{ propertyName: "treeViewElement", first: true, predicate: ["treeViewElement"], descendants: true }], ngImport: i0, template: "<div [class]=\"getTreeViewClasses()\">\n\n <div class=\"treeview-panel\">\n\n <ng-container [ngSwitch]=\"checkable\">\n\n <kendo-treeview #treeViewElement *ngSwitchCase=\"true\" [children]=\"children\" kendoTreeViewHierarchyBinding\n kendoTreeViewExpandable [kendoTreeViewCheckable]=\"checkableSettings\" kendoTreeViewDragAndDrop\n kendoTreeViewDragAndDropEditing [nodes]=\"data\" [textField]=\"textField\" [childrenField]=\"childrenField\"\n [filterable]=\"filterable\" [expandBy]=\"expandBy\" [(expandedKeys)]=\"expandedKeys\"\n [expandDisabledNodes]=\"expandDisabledNodes\" (selectionChange)=\"onSelectionChange($event)\"\n (checkedChange)=\"onCheckedChange($event)\" (expand)=\"onExpand($event)\" (collapse)=\"onCollapse($event)\"\n (nodeClick)=\"onNodeClick($event)\" (expandedKeysChange)=\"onExpandedKeysChange($event)\"\n (nodeDragStart)=\"onDragStart($event)\" (nodeDrop)=\"handleDrop($event)\" (addItem)=\"log('addItem', $event)\"\n (removeItem)=\"log('removeItem', $event)\" (nodeDragEnd)=\"log('nodeDragEnd', $event)\"\n (nodeDrag)=\"onNodeDrag($event)\" class=\"lib-tree-view__kendo-tree\" [kendoTreeViewSelectable]=\"selectable\"\n [filter]=\"filter\" [size]=\"size\" [navigable]=\"navigable\" [loadOnDemand]=\"loadOnDemand\" [trackBy]=\"trackBy\"\n [hasChildren]=\"hasChildren\" [(selectedKeys)]=\"selectedKeys\" (filterChange)=\"onFilterChange($event)\">\n\n <!-- Custom Node Template -->\n <ng-template *ngIf=\"nodeTemplate\" kendoTreeViewNodeTemplate let-dataItem=\"dataItem\" let-index=\"index\">\n <ng-container [ngTemplateOutlet]=\"nodeTemplate\" [ngTemplateOutletContext]=\"{ \n $implicit: dataItem, \n dataItem: dataItem, \n index: index \n }\">\n </ng-container>\n </ng-template>\n\n <!-- Load More Button Template -->\n <ng-template *ngIf=\"loadMoreButtonTemplate\" kendoTreeViewLoadMoreButtonTemplate let-dataItem=\"dataItem\">\n <ng-container [ngTemplateOutlet]=\"loadMoreButtonTemplate\" [ngTemplateOutletContext]=\"{ \n $implicit: dataItem, \n dataItem: dataItem \n }\">\n </ng-container>\n </ng-template>\n\n </kendo-treeview>\n\n <!-- TreeView without checkable functionality -->\n <kendo-treeview #treeViewElement *ngSwitchDefault kendoTreeViewHierarchyBinding kendoTreeViewExpandable\n kendoTreeViewDragAndDrop kendoTreeViewDragAndDropEditing [nodes]=\"data\" [textField]=\"textField\"\n [childrenField]=\"childrenField\" [filterable]=\"filterable\" [expandBy]=\"expandBy\" [(expandedKeys)]=\"expandedKeys\"\n [expandDisabledNodes]=\"expandDisabledNodes\" (selectionChange)=\"onSelectionChange($event)\"\n (checkedChange)=\"onCheckedChange($event)\" (expand)=\"onExpand($event)\" (collapse)=\"onCollapse($event)\"\n (nodeClick)=\"onNodeClick($event)\" (expandedKeysChange)=\"onExpandedKeysChange($event)\"\n (nodeDragStart)=\"onDragStart($event)\" (nodeDrag)=\"onNodeDrag($event)\" (nodeDrop)=\"handleDrop($event)\"\n (addItem)=\"log('addItem', $event)\" (removeItem)=\"log('removeItem', $event)\"\n (nodeDragEnd)=\"log('nodeDragEnd', $event)\" class=\"lib-tree-view__kendo-tree\"\n [kendoTreeViewSelectable]=\"selectable\" [size]=\"size\" [navigable]=\"navigable\" [loadOnDemand]=\"loadOnDemand\"\n [trackBy]=\"trackBy\" [hasChildren]=\"hasChildren\" [(selectedKeys)]=\"selectedKeys\"\n (filterChange)=\"onFilterChange($event)\">\n\n <!-- Custom Node Template -->\n <ng-template *ngIf=\"nodeTemplate\" kendoTreeViewNodeTemplate let-dataItem=\"dataItem\" let-index=\"index\">\n <ng-container [ngTemplateOutlet]=\"nodeTemplate\" [ngTemplateOutletContext]=\"{ \n $implicit: dataItem, \n dataItem: dataItem, \n index: index \n }\">\n </ng-container>\n </ng-template>\n\n <!-- Load More Button Template -->\n <ng-template *ngIf=\"loadMoreButtonTemplate\" kendoTreeViewLoadMoreButtonTemplate let-dataItem=\"dataItem\">\n <ng-container [ngTemplateOutlet]=\"loadMoreButtonTemplate\" [ngTemplateOutletContext]=\"{ \n $implicit: dataItem, \n dataItem: dataItem \n }\">\n </ng-container>\n </ng-template>\n\n </kendo-treeview>\n </ng-container>\n\n <!-- Loading indicator -->\n <div *ngIf=\"loading\" class=\"lib-tree-view__loading\">\n <lib-loader size=\"medium\" type=\"pulsing\" themeColor=\"primary\"></lib-loader>\n </div>\n </div>\n", styles: [".lib-tree-view{position:relative;width:100%}.lib-tree-view__loading{position:absolute;inset:0;z-index:10;display:flex;align-items:center;justify-content:center;background-color:#fffc}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: TreeViewModule }, { kind: "component", type: i2.TreeViewComponent, selector: "kendo-treeview", inputs: ["filterInputPlaceholder", "expandDisabledNodes", "animate", "nodeTemplate", "loadMoreButtonTemplate", "trackBy", "nodes", "textField", "hasChildren", "isChecked", "isDisabled", "hasCheckbox", "isExpanded", "isSelected", "isVisible", "navigable", "children", "loadOnDemand", "filterable", "filter", "size", "disableParentNodesOnly"], outputs: ["childrenLoaded", "blur", "focus", "expand", "collapse", "nodeDragStart", "nodeDrag", "filterStateChange", "nodeDrop", "nodeDragEnd", "addItem", "removeItem", "checkedChange", "selectionChange", "filterChange", "nodeClick", "nodeDblClick"], exportAs: ["kendoTreeView"] }, { kind: "directive", type: i2.NodeTemplateDirective, selector: "[kendoTreeViewNodeTemplate]" }, { kind: "directive", type: i2.CheckDirective, selector: "[kendoTreeViewCheckable]", inputs: ["isChecked", "checkBy", "checkedKeys", "kendoTreeViewCheckable"], outputs: ["checkedKeysChange"] }, { kind: "directive", type: i2.ExpandDirective, selector: "[kendoTreeViewExpandable]", inputs: ["isExpanded", "expandBy", "expandOnFilter", "expandedKeys"], outputs: ["expandedKeysChange"] }, { kind: "directive", type: i2.SelectDirective, selector: "[kendoTreeViewSelectable]", inputs: ["isSelected", "selectBy", "kendoTreeViewSelectable", "selectedKeys"], outputs: ["selectedKeysChange"] }, { kind: "directive", type: i2.HierarchyBindingDirective, selector: "[kendoTreeViewHierarchyBinding]", inputs: ["childrenField", "nodes", "isVisible", "loadOnDemand"] }, { kind: "directive", type: i2.DragAndDropDirective, selector: "[kendoTreeViewDragAndDrop]", inputs: ["allowCopy", "dropZoneTreeViews", "startDragAfter", "autoScroll"] }, { kind: "directive", type: i2.DragAndDropEditingDirective, selector: "[kendoTreeViewDragAndDropEditing]", inputs: ["editService"] }, { kind: "directive", type: i2.LoadMoreButtonTemplateDirective, selector: "[kendoTreeViewLoadMoreButtonTemplate]" }, { kind: "ngmodule", type: IconsModule }, { kind: "component", type: LoaderComponent, selector: "lib-loader", inputs: ["size", "type", "themeColor"] }] }); }
370
+ }
371
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: TreeViewComponent, decorators: [{
372
+ type: Component,
373
+ args: [{ standalone: true, selector: 'lib-tree-view', imports: [
374
+ CommonModule,
375
+ TreeViewModule,
376
+ IconsModule,
377
+ ButtonComponent,
378
+ IconComponent,
379
+ LoaderComponent
380
+ ], template: "<div [class]=\"getTreeViewClasses()\">\n\n <div class=\"treeview-panel\">\n\n <ng-container [ngSwitch]=\"checkable\">\n\n <kendo-treeview #treeViewElement *ngSwitchCase=\"true\" [children]=\"children\" kendoTreeViewHierarchyBinding\n kendoTreeViewExpandable [kendoTreeViewCheckable]=\"checkableSettings\" kendoTreeViewDragAndDrop\n kendoTreeViewDragAndDropEditing [nodes]=\"data\" [textField]=\"textField\" [childrenField]=\"childrenField\"\n [filterable]=\"filterable\" [expandBy]=\"expandBy\" [(expandedKeys)]=\"expandedKeys\"\n [expandDisabledNodes]=\"expandDisabledNodes\" (selectionChange)=\"onSelectionChange($event)\"\n (checkedChange)=\"onCheckedChange($event)\" (expand)=\"onExpand($event)\" (collapse)=\"onCollapse($event)\"\n (nodeClick)=\"onNodeClick($event)\" (expandedKeysChange)=\"onExpandedKeysChange($event)\"\n (nodeDragStart)=\"onDragStart($event)\" (nodeDrop)=\"handleDrop($event)\" (addItem)=\"log('addItem', $event)\"\n (removeItem)=\"log('removeItem', $event)\" (nodeDragEnd)=\"log('nodeDragEnd', $event)\"\n (nodeDrag)=\"onNodeDrag($event)\" class=\"lib-tree-view__kendo-tree\" [kendoTreeViewSelectable]=\"selectable\"\n [filter]=\"filter\" [size]=\"size\" [navigable]=\"navigable\" [loadOnDemand]=\"loadOnDemand\" [trackBy]=\"trackBy\"\n [hasChildren]=\"hasChildren\" [(selectedKeys)]=\"selectedKeys\" (filterChange)=\"onFilterChange($event)\">\n\n <!-- Custom Node Template -->\n <ng-template *ngIf=\"nodeTemplate\" kendoTreeViewNodeTemplate let-dataItem=\"dataItem\" let-index=\"index\">\n <ng-container [ngTemplateOutlet]=\"nodeTemplate\" [ngTemplateOutletContext]=\"{ \n $implicit: dataItem, \n dataItem: dataItem, \n index: index \n }\">\n </ng-container>\n </ng-template>\n\n <!-- Load More Button Template -->\n <ng-template *ngIf=\"loadMoreButtonTemplate\" kendoTreeViewLoadMoreButtonTemplate let-dataItem=\"dataItem\">\n <ng-container [ngTemplateOutlet]=\"loadMoreButtonTemplate\" [ngTemplateOutletContext]=\"{ \n $implicit: dataItem, \n dataItem: dataItem \n }\">\n </ng-container>\n </ng-template>\n\n </kendo-treeview>\n\n <!-- TreeView without checkable functionality -->\n <kendo-treeview #treeViewElement *ngSwitchDefault kendoTreeViewHierarchyBinding kendoTreeViewExpandable\n kendoTreeViewDragAndDrop kendoTreeViewDragAndDropEditing [nodes]=\"data\" [textField]=\"textField\"\n [childrenField]=\"childrenField\" [filterable]=\"filterable\" [expandBy]=\"expandBy\" [(expandedKeys)]=\"expandedKeys\"\n [expandDisabledNodes]=\"expandDisabledNodes\" (selectionChange)=\"onSelectionChange($event)\"\n (checkedChange)=\"onCheckedChange($event)\" (expand)=\"onExpand($event)\" (collapse)=\"onCollapse($event)\"\n (nodeClick)=\"onNodeClick($event)\" (expandedKeysChange)=\"onExpandedKeysChange($event)\"\n (nodeDragStart)=\"onDragStart($event)\" (nodeDrag)=\"onNodeDrag($event)\" (nodeDrop)=\"handleDrop($event)\"\n (addItem)=\"log('addItem', $event)\" (removeItem)=\"log('removeItem', $event)\"\n (nodeDragEnd)=\"log('nodeDragEnd', $event)\" class=\"lib-tree-view__kendo-tree\"\n [kendoTreeViewSelectable]=\"selectable\" [size]=\"size\" [navigable]=\"navigable\" [loadOnDemand]=\"loadOnDemand\"\n [trackBy]=\"trackBy\" [hasChildren]=\"hasChildren\" [(selectedKeys)]=\"selectedKeys\"\n (filterChange)=\"onFilterChange($event)\">\n\n <!-- Custom Node Template -->\n <ng-template *ngIf=\"nodeTemplate\" kendoTreeViewNodeTemplate let-dataItem=\"dataItem\" let-index=\"index\">\n <ng-container [ngTemplateOutlet]=\"nodeTemplate\" [ngTemplateOutletContext]=\"{ \n $implicit: dataItem, \n dataItem: dataItem, \n index: index \n }\">\n </ng-container>\n </ng-template>\n\n <!-- Load More Button Template -->\n <ng-template *ngIf=\"loadMoreButtonTemplate\" kendoTreeViewLoadMoreButtonTemplate let-dataItem=\"dataItem\">\n <ng-container [ngTemplateOutlet]=\"loadMoreButtonTemplate\" [ngTemplateOutletContext]=\"{ \n $implicit: dataItem, \n dataItem: dataItem \n }\">\n </ng-container>\n </ng-template>\n\n </kendo-treeview>\n </ng-container>\n\n <!-- Loading indicator -->\n <div *ngIf=\"loading\" class=\"lib-tree-view__loading\">\n <lib-loader size=\"medium\" type=\"pulsing\" themeColor=\"primary\"></lib-loader>\n </div>\n </div>\n", styles: [".lib-tree-view{position:relative;width:100%}.lib-tree-view__loading{position:absolute;inset:0;z-index:10;display:flex;align-items:center;justify-content:center;background-color:#fffc}\n"] }]
381
+ }], propDecorators: { treeViewElement: [{
382
+ type: ViewChild,
383
+ args: ['treeViewElement', { static: false }]
384
+ }], data: [{
385
+ type: Input
386
+ }], selectable: [{
387
+ type: Input
388
+ }], filterable: [{
389
+ type: Input
390
+ }], checkboxes: [{
391
+ type: Input
392
+ }], checkable: [{
393
+ type: Input
394
+ }], dragAndDrop: [{
395
+ type: Input
396
+ }], expandable: [{
397
+ type: Input
398
+ }], loading: [{
399
+ type: Input
400
+ }], animate: [{
401
+ type: Input
402
+ }], size: [{
403
+ type: Input
404
+ }], textField: [{
405
+ type: Input
406
+ }], childrenField: [{
407
+ type: Input
408
+ }], hasChildrenField: [{
409
+ type: Input
410
+ }], expandedField: [{
411
+ type: Input
412
+ }], selectedField: [{
413
+ type: Input
414
+ }], disabledField: [{
415
+ type: Input
416
+ }], checkedField: [{
417
+ type: Input
418
+ }], iconClassField: [{
419
+ type: Input
420
+ }], iconField: [{
421
+ type: Input
422
+ }], imageUrlField: [{
423
+ type: Input
424
+ }], spriteCssClassField: [{
425
+ type: Input
426
+ }], disabledKeys: [{
427
+ type: Input
428
+ }], expandBy: [{
429
+ type: Input
430
+ }], expandedKeys: [{
431
+ type: Input
432
+ }], selectedKeys: [{
433
+ type: Input
434
+ }], checkedKeys: [{
435
+ type: Input
436
+ }], expandDisabledNodes: [{
437
+ type: Input
438
+ }], disableNodes: [{
439
+ type: Input
440
+ }], enableCheck: [{
441
+ type: Input
442
+ }], checkChildren: [{
443
+ type: Input
444
+ }], checkDisabledChildren: [{
445
+ type: Input
446
+ }], checkParents: [{
447
+ type: Input
448
+ }], checkOnClick: [{
449
+ type: Input
450
+ }], uncheckCollapsedChildren: [{
451
+ type: Input
452
+ }], checkMode: [{
453
+ type: Input
454
+ }], fetchChildren: [{
455
+ type: Input
456
+ }], isChecked: [{
457
+ type: Input
458
+ }], isDisabled: [{
459
+ type: Input
460
+ }], isExpanded: [{
461
+ type: Input
462
+ }], isSelected: [{
463
+ type: Input
464
+ }], isVisible: [{
465
+ type: Input
466
+ }], nodeTemplate: [{
467
+ type: Input
468
+ }], loadMoreButtonTemplate: [{
469
+ type: Input
470
+ }], loadMoreService: [{
471
+ type: Input
472
+ }], pageSize: [{
473
+ type: Input
474
+ }], loadOnDemand: [{
475
+ type: Input
476
+ }], filter: [{
477
+ type: Input
478
+ }], filterSettings: [{
479
+ type: Input
480
+ }], navigable: [{
481
+ type: Input
482
+ }], trackBy: [{
483
+ type: Input
484
+ }], selectionChange: [{
485
+ type: Output
486
+ }], expand: [{
487
+ type: Output
488
+ }], collapse: [{
489
+ type: Output
490
+ }], checkedChange: [{
491
+ type: Output
492
+ }], nodeClick: [{
493
+ type: Output
494
+ }], nodeDblClick: [{
495
+ type: Output
496
+ }], nodeDragStart: [{
497
+ type: Output
498
+ }], nodeDrag: [{
499
+ type: Output
500
+ }], nodeDrop: [{
501
+ type: Output
502
+ }], nodeDragEnd: [{
503
+ type: Output
504
+ }], addItem: [{
505
+ type: Output
506
+ }], removeItem: [{
507
+ type: Output
508
+ }], expandedKeysChange: [{
509
+ type: Output
510
+ }], selectedKeysChange: [{
511
+ type: Output
512
+ }], checkedKeysChange: [{
513
+ type: Output
514
+ }], filterChange: [{
515
+ type: Output
516
+ }], loadMore: [{
517
+ type: Output
518
+ }], childrenLoaded: [{
519
+ type: Output
520
+ }] } });
521
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2F0b21zL3RyZWUtdmlldy90cmVlLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvYXRvbXMvdHJlZS12aWV3L3RyZWUtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUNMLGNBQWMsRUFTZixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7OztBQUc3RDs7Ozs7R0FLRztBQWVILE1BQU0sT0FBTyxpQkFBaUI7SUFkOUI7UUFxQkU7O1dBRUc7UUFDTSxTQUFJLEdBQW1CLEVBQUUsQ0FBQztRQUVuQyxtQkFBbUI7UUFDVixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFD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WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBSZW5kZXJlcjIsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFRyZWVWaWV3TW9kdWxlLFxuICBUcmVlVmlld0NvbXBvbmVudCBhcyBLZW5kb1RyZWVWaWV3Q29tcG9uZW50LFxuICBUcmVlSXRlbUxvb2t1cCxcbiAgVHJlZUl0ZW1BZGRSZW1vdmVBcmdzLFxuICBUcmVlSXRlbURyb3BFdmVudCxcbiAgVHJlZUl0ZW1EcmFnU3RhcnRFdmVudCxcbiAgVHJlZUl0ZW1EcmFnRXZlbnQsXG4gIENoZWNrYWJsZVNldHRpbmdzLFxuICBDaGVja01vZGVcbn0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItdHJlZXZpZXcnO1xuaW1wb3J0IHsgSWNvbnNNb2R1bGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1pY29ucyc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2FkZXJDb21wb25lbnQgfSBmcm9tICcuLi9sb2FkZXIvbG9hZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmVlVmlld05vZGUgfSBmcm9tICcuL3RyZWUtdmlldy5pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBDdXN0b20gVHJlZVZpZXcgY29tcG9uZW50IHRoYXQgd3JhcHMgS2VuZG8ncyBUcmVlVmlldyB3aXRoIGRlc2lnbiBzeXN0ZW0gc3R5bGluZy5cbiAqIFxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBoaWVyYXJjaGljYWwgdHJlZSBzdHJ1Y3R1cmUgZm9yIGRpc3BsYXlpbmcgYW5kIG5hdmlnYXRpbmcgZGF0YS5cbiAqIEl0IHN1cHBvcnRzIHNlbGVjdGlvbiwgZXhwYW5zaW9uLCBpY29ucywgYW5kIGN1c3RvbSB0ZW1wbGF0ZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2xpYi10cmVlLXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vdHJlZS12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdHJlZS12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgVHJlZVZpZXdNb2R1bGUsXG4gICAgSWNvbnNNb2R1bGUsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIEljb25Db21wb25lbnQsXG4gICAgTG9hZGVyQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVHJlZVZpZXdDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBWaWV3Q2hpbGQgcmVmZXJlbmNlIHRvIHRoZSBLZW5kbyBUcmVlVmlldyBjb21wb25lbnQgaW5zdGFuY2VcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ3RyZWVWaWV3RWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSB0cmVlVmlld0VsZW1lbnQhOiBhbnk7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIHRyZWUgdmlld1xuICAgKi9cbiAgQElucHV0KCkgZGF0YTogVHJlZVZpZXdOb2RlW10gPSBbXTtcblxuICAvLyBCYXNpYyBQcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZmlsdGVyYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjaGVja2JveGVzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNoZWNrYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkcmFnQW5kRHJvcDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBleHBhbmRhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbmltYXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2l6ZTogJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyB8ICdub25lJyA9ICdtZWRpdW0nO1xuXG4gIC8vIEZpZWxkIENvbmZpZ3VyYXRpb25cbiAgQElucHV0KCkgdGV4dEZpZWxkOiBzdHJpbmcgPSAndGV4dCc7XG4gIEBJbnB1dCgpIGNoaWxkcmVuRmllbGQ6IHN0cmluZyA9ICdjaGlsZHJlbic7XG4gIEBJbnB1dCgpIGhhc0NoaWxkcmVuRmllbGQ6IHN0cmluZyA9ICdoYXNDaGlsZHJlbic7XG4gIEBJbnB1dCgpIGV4cGFuZGVkRmllbGQ6IHN0cmluZyA9ICdleHBhbmRlZCc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkRmllbGQ6IHN0cmluZyA9ICdzZWxlY3RlZCc7XG4gIEBJbnB1dCgpIGRpc2FibGVkRmllbGQ6IHN0cmluZyA9ICdkaXNhYmxlZCc7XG4gIEBJbnB1dCgpIGNoZWNrZWRGaWVsZDogc3RyaW5nID0gJ2NoZWNrZWQnO1xuICBASW5wdXQoKSBpY29uQ2xhc3NGaWVsZDogc3RyaW5nID0gJ2ljb25DbGFzcyc7XG4gIEBJbnB1dCgpIGljb25GaWVsZDogc3RyaW5nID0gJ2ljb24nO1xuICBASW5wdXQoKSBpbWFnZVVybEZpZWxkOiBzdHJpbmcgPSAnaW1hZ2VVcmwnO1xuICBASW5wdXQoKSBzcHJpdGVDc3NDbGFzc0ZpZWxkOiBzdHJpbmcgPSAnc3ByaXRlQ3NzQ2xhc3MnO1xuXG4gIC8vIFNlbGVjdGlvbiBhbmQgRXhwYW5zaW9uXG4gIEBJbnB1dCgpIGRpc2FibGVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgZXhwYW5kQnk6IHN0cmluZyB8ICgoaXRlbTogVHJlZVZpZXdOb2RlKSA9PiBzdHJpbmcpID0gJyc7Ly9pZiBleHBhbmRCeSBpcyBlbXB0eSwgZXhwYW5kZWRLZXlzIHdpbGwgdXNlIGluZGV4IHRvIHRyYWNrIGV4cGFuc2lvbi4gT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgZmllbGQgbmFtZSB0byBkZWNpZGUgdGhlIGV4cGFuZGVkS2V5cy5cbiAgQElucHV0KCkgZXhwYW5kZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3RlZEtleXM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIGNoZWNrZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBleHBhbmREaXNhYmxlZE5vZGVzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVOb2RlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIENoZWNrYm94IENvbmZpZ3VyYXRpb25cbiAgQElucHV0KCkgZW5hYmxlQ2hlY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2hlY2tDaGlsZHJlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjaGVja0Rpc2FibGVkQ2hpbGRyZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2hlY2tQYXJlbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNoZWNrT25DbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB1bmNoZWNrQ29sbGFwc2VkQ2hpbGRyZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2hlY2tNb2RlOiBDaGVja01vZGUgPSBcIm11bHRpcGxlXCI7XG5cbiAgLy8gRGF0YSBMb2FkaW5nXG4gIEBJbnB1dCgpIGZldGNoQ2hpbGRyZW46ICgoaXRlbTogYW55KSA9PiBhbnlbXSkgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGlzQ2hlY2tlZDogKChpdGVtOiBhbnkpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBpc0Rpc2FibGVkOiAoKGl0ZW06IGFueSkgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGlzRXhwYW5kZWQ6ICgoaXRlbTogYW55KSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgaXNTZWxlY3RlZDogKChpdGVtOiBhbnkpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBpc1Zpc2libGU6ICgoaXRlbTogYW55KSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZDtcblxuICAvLyBUZW1wbGF0ZXNcbiAgQElucHV0KCkgbm9kZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBsb2FkTW9yZUJ1dHRvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gIC8vIExvYWQgTW9yZSBDb25maWd1cmF0aW9uXG4gIEBJbnB1dCgpIGxvYWRNb3JlU2VydmljZTogKChpdGVtOiBhbnkpID0+IGFueVtdKSB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgcGFnZVNpemU6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGxvYWRPbkRlbWFuZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEZpbHRlcmluZ1xuICBASW5wdXQoKSBmaWx0ZXI6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBmaWx0ZXJTZXR0aW5nczogYW55O1xuXG4gIC8vIEtleWJvYXJkIE5hdmlnYXRpb25cbiAgQElucHV0KCkgbmF2aWdhYmxlOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBUcmFjayBieSBmdW5jdGlvblxuICBASW5wdXQoKSB0cmFja0J5OiAoKGluZGV4OiBudW1iZXIsIGl0ZW06IFRyZWVWaWV3Tm9kZSkgPT4gYW55KSB8IHVuZGVmaW5lZDtcblxuICAvLyBCYXNpYyBFdmVudHNcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgZXhwYW5kID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBjb2xsYXBzZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgY2hlY2tlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgbm9kZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBub2RlRGJsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvLyBEcmFnIGFuZCBEcm9wIEV2ZW50c1xuICBAT3V0cHV0KCkgbm9kZURyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUl0ZW1EcmFnU3RhcnRFdmVudD4oKTtcbiAgQE91dHB1dCgpIG5vZGVEcmFnID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlSXRlbURyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIG5vZGVEcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlSXRlbURyb3BFdmVudD4oKTtcbiAgQE91dHB1dCgpIG5vZGVEcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlSXRlbURyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGFkZEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVJdGVtQWRkUmVtb3ZlQXJncz4oKTtcbiAgQE91dHB1dCgpIHJlbW92ZUl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVJdGVtQWRkUmVtb3ZlQXJncz4oKTtcblxuICAvLyBLZXkgQ2hhbmdlIEV2ZW50cyAoVHdvLXdheSBiaW5kaW5nIHN1cHBvcnQpXG4gIEBPdXRwdXQoKSBleHBhbmRlZEtleXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0ZWRLZXlzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcbiAgQE91dHB1dCgpIGNoZWNrZWRLZXlzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcblxuICAvLyBGaWx0ZXIgRXZlbnRzXG4gIEBPdXRwdXQoKSBmaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvLyBMb2FkIE1vcmUgRXZlbnRzXG4gIEBPdXRwdXQoKSBsb2FkTW9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vIENoaWxkcmVuIExvYWRpbmcgRXZlbnRzXG4gIEBPdXRwdXQoKSBjaGlsZHJlbkxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAvKipcbiAgICogQ3VycmVudGx5IHNlbGVjdGVkIGl0ZW1zXG4gICAqL1xuICBzZWxlY3RlZEl0ZW1zOiBUcmVlVmlld05vZGVbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDdXJyZW50bHkgY2hlY2tlZCBpdGVtc1xuICAgKi9cbiAgY2hlY2tlZEl0ZW1zOiBUcmVlVmlld05vZGVbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgQ1NTIGNsYXNzZXMgZm9yIHRoZSB0cmVlLXZpZXcgY29udGFpbmVyIGVsZW1lbnQgYmFzZWQgb24gY3VycmVudCBjb21wb25lbnQgc3RhdGUuXG4gICAqIEFwcGxpZXMgY29uZGl0aW9uYWwgc3R5bGluZyBjbGFzc2VzIHRvIHJlZmxlY3QgbG9hZGluZyBzdGF0ZXMgYW5kIGVuYWJsZSBhcHByb3ByaWF0ZSB2aXN1YWwgZmVlZGJhY2suXG4gICAqIFxuICAgKiBAcmV0dXJucyBBIHNwYWNlLXNlcGFyYXRlZCBzdHJpbmcgb2YgQ1NTIGNsYXNzIG5hbWVzIHRvIGFwcGx5IHRvIHRoZSB0cmVlLXZpZXcgY29udGFpbmVyXG4gICAqL1xuICBnZXRUcmVlVmlld0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc2VzID0gWydsaWItdHJlZS12aWV3J107XG5cbiAgICBpZiAodGhpcy5sb2FkaW5nKSB7XG4gICAgICBjbGFzc2VzLnB1c2goJ2xpYi10cmVlLXZpZXctLWxvYWRpbmcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBjaGVja2FibGUgc2V0dGluZ3MgY29uZmlndXJhdGlvbiBmb3IgdGhlIEtlbmRvIFRyZWVWaWV3IGNvbXBvbmVudC5cbiAgICogQWdncmVnYXRlcyBhbGwgY2hlY2tib3gtcmVsYXRlZCBpbnB1dCBwcm9wZXJ0aWVzIGludG8gYSBzaW5nbGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICogdGhhdCBjb250cm9scyBjaGVja2JveCBiZWhhdmlvciBpbmNsdWRpbmcgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMgYW5kIGludGVyYWN0aW9uIG1vZGVzLlxuICAgKiBcbiAgICogQHJldHVybnMgQ2hlY2thYmxlU2V0dGluZ3Mgb2JqZWN0IHdpdGggYWxsIGNoZWNrYm94IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldCBjaGVja2FibGVTZXR0aW5ncygpOiBDaGVja2FibGVTZXR0aW5ncyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrQ2hpbGRyZW46IHRoaXMuY2hlY2tDaGlsZHJlbixcbiAgICAgIGNoZWNrRGlzYWJsZWRDaGlsZHJlbjogdGhpcy5jaGVja0Rpc2FibGVkQ2hpbGRyZW4sXG4gICAgICBjaGVja1BhcmVudHM6IHRoaXMuY2hlY2tQYXJlbnRzLFxuICAgICAgZW5hYmxlZDogdGhpcy5lbmFibGVDaGVjayxcbiAgICAgIG1vZGU6IHRoaXMuY2hlY2tNb2RlLFxuICAgICAgY2hlY2tPbkNsaWNrOiB0aGlzLmNoZWNrT25DbGljayxcbiAgICAgIHVuY2hlY2tDb2xsYXBzZWRDaGlsZHJlbjogdGhpcy51bmNoZWNrQ29sbGFwc2VkQ2hpbGRyZW4sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBhbmQgcmV0dXJucyBjaGlsZCBpdGVtcyBmcm9tIGEgdHJlZSBub2RlIHVzaW5nIHRoZSBjb25maWd1cmVkIGNoaWxkcmVuIGZpZWxkLlxuICAgKiBQcm92aWRlcyBhIHN0YW5kYXJkaXplZCB3YXkgZm9yIHRoZSBLZW5kbyBUcmVlVmlldyB0byBhY2Nlc3MgaGllcmFyY2hpY2FsIGNoaWxkIGRhdGFcbiAgICogcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIGZpZWxkIG5hbWUgdXNlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqIFxuICAgKiBAcGFyYW0gZGF0YUl0ZW0gLSBUaGUgdHJlZSBub2RlIGRhdGEgaXRlbSB0byBleHRyYWN0IGNoaWxkcmVuIGZyb21cbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBhcnJheSBvZiBjaGlsZCBpdGVtcyBvciBlbXB0eSBhcnJheSBpZiBubyBjaGlsZHJlbiBleGlzdFxuICAgKi9cbiAgcHVibGljIGNoaWxkcmVuID0gKGRhdGFJdGVtOiBhbnkpOiBPYnNlcnZhYmxlPGFueVtdPiA9PiBvZihkYXRhSXRlbVt0aGlzLmNoaWxkcmVuRmllbGRdKTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgdHJlZSBub2RlIGhhcyBjaGlsZCBpdGVtcyBmb3IgcHJvcGVyIGV4cGFuZC9jb2xsYXBzZSBpY29uIGRpc3BsYXkuXG4gICAqIENoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBjaGlsZHJlbiBwcm9wZXJ0eSBhbmQgbG9ncyB0aGUgcmVzdWx0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAqIFVzZWQgYnkgdGhlIFRyZWVWaWV3IHRvIGRlY2lkZSB3aGV0aGVyIHRvIHNob3cgZXhwYW5zaW9uIGluZGljYXRvcnMgZm9yIGVhY2ggbm9kZS5cbiAgICogXG4gICAqIEBwYXJhbSBkYXRhSXRlbSAtIFRoZSB0cmVlIG5vZGUgZGF0YSBpdGVtIHRvIGNoZWNrIGZvciBjaGlsZHJlblxuICAgKiBAcmV0dXJucyBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbm9kZSBoYXMgY2hpbGRyZW4gdGhhdCBjYW4gYmUgZXhwYW5kZWRcbiAgICovXG4gIHB1YmxpYyBoYXNDaGlsZHJlbiA9IChkYXRhSXRlbTogYW55KTogYm9vbGVhbiA9PiB7IHJldHVybiAhIWRhdGFJdGVtW3RoaXMuY2hpbGRyZW5GaWVsZF0gfTtcblxuICAvLyBFdmVudCBIYW5kbGVyc1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRyZWUgbm9kZSBzZWxlY3Rpb24gY2hhbmdlcyB3aGVuIHVzZXJzIHNlbGVjdCBvciBkZXNlbGVjdCBub2Rlcy5cbiAgICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgc2VsZWN0ZWQgaXRlbXMgc3RhdGUgYW5kIHByb3BhZ2F0ZXMgdGhlIHNlbGVjdGlvbiBldmVudFxuICAgKiB0byBwYXJlbnQgY29tcG9uZW50cyBmb3IgZXh0ZXJuYWwgaGFuZGxpbmcgYW5kIHN5bmNocm9uaXphdGlvbi5cbiAgICogXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG5ld2x5IHNlbGVjdGVkIGl0ZW1zIGFycmF5XG4gICAqL1xuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gZXZlbnQ7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjaGVja2JveCBzdGF0ZSBjaGFuZ2VzIHdoZW4gdXNlcnMgY2hlY2sgb3IgdW5jaGVjayB0cmVlIG5vZGVzLlxuICAgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBjaGVja2VkIGl0ZW1zIHN0YXRlIGFuZCBlbWl0cyB0aGUgY2hhbmdlIGV2ZW50IHRvIG5vdGlmeVxuICAgKiBwYXJlbnQgY29tcG9uZW50cyBvZiB0aGUgbmV3IGNoZWNrYm94IHNlbGVjdGlvbnMgZm9yIGZvcm0gdmFsaWRhdGlvbiBvciBkYXRhIHByb2Nlc3NpbmcuXG4gICAqIFxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgY2hlY2tlZCBjaGFuZ2UgZXZlbnQgY29udGFpbmluZyB0aGUgbmV3bHkgY2hlY2tlZCBpdGVtcyBhcnJheVxuICAgKi9cbiAgb25DaGVja2VkQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrZWRJdGVtcyA9IGV2ZW50O1xuICAgIHRoaXMuY2hlY2tlZENoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRyZWUgbm9kZSBleHBhbnNpb24gZXZlbnRzIHdoZW4gdXNlcnMgY2xpY2sgZXhwYW5kIGljb25zIG9yIHVzZSBrZXlib2FyZCBuYXZpZ2F0aW9uLlxuICAgKiBVcGRhdGVzIHRoZSBub2RlJ3MgZXhwYW5kZWQgc3RhdGUgaW4gdGhlIGRhdGEgbW9kZWwgYW5kIGVtaXRzIHRoZSBleHBhbmQgZXZlbnRcbiAgICogZm9yIHBhcmVudCBjb21wb25lbnRzIHRvIGhhbmRsZSBsYXp5IGxvYWRpbmcgb2YgY2hpbGQgZGF0YSBvciBzdGF0ZSBwZXJzaXN0ZW5jZS5cbiAgICogXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBleHBhbmQgZXZlbnQgY29udGFpbmluZyB0aGUgZXhwYW5kZWQgbm9kZSBkYXRhIGFuZCBjb250ZXh0IGluZm9ybWF0aW9uXG4gICAqL1xuICBvbkV4cGFuZChldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmRhdGFJdGVtKSB7XG4gICAgICBldmVudC5kYXRhSXRlbVt0aGlzLmV4cGFuZGVkRmllbGRdID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5leHBhbmQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0cmVlIG5vZGUgY29sbGFwc2UgZXZlbnRzIHdoZW4gdXNlcnMgY2xpY2sgY29sbGFwc2UgaWNvbnMgb3IgdXNlIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gICAqIFVwZGF0ZXMgdGhlIG5vZGUncyBleHBhbmRlZCBzdGF0ZSBpbiB0aGUgZGF0YSBtb2RlbCBhbmQgZW1pdHMgdGhlIGNvbGxhcHNlIGV2ZW50XG4gICAqIGZvciBwYXJlbnQgY29tcG9uZW50cyB0byBoYW5kbGUgc3RhdGUgY2xlYW51cCBvciBtZW1vcnkgb3B0aW1pemF0aW9uLlxuICAgKiBcbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIGNvbGxhcHNlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIGNvbGxhcHNlZCBub2RlIGRhdGEgYW5kIGNvbnRleHQgaW5mb3JtYXRpb25cbiAgICovXG4gIG9uQ29sbGFwc2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudC5kYXRhSXRlbSkge1xuICAgICAgZXZlbnQuZGF0YUl0ZW1bdGhpcy5leHBhbmRlZEZpZWxkXSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNvbGxhcHNlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgc2luZ2xlLWNsaWNrIGV2ZW50cyBvbiB0cmVlIG5vZGVzIGZvciBjdXN0b20gaW50ZXJhY3Rpb24gaGFuZGxpbmcuXG4gICAqIFByb3BhZ2F0ZXMgY2xpY2sgZXZlbnRzIHRvIHBhcmVudCBjb21wb25lbnRzIGZvciBuYXZpZ2F0aW9uLCBzZWxlY3Rpb24gbG9naWMsXG4gICAqIG9yIGN1c3RvbSBhY3Rpb25zIGJhc2VkIG9uIHRoZSBjbGlja2VkIG5vZGUncyBkYXRhIGFuZCBjb250ZXh0LlxuICAgKiBcbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIG5vZGUgY2xpY2sgZXZlbnQgY29udGFpbmluZyBjbGlja2VkIG5vZGUgZGF0YSBhbmQgbW91c2UgZXZlbnQgZGV0YWlsc1xuICAgKi9cbiAgb25Ob2RlQ2xpY2soZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubm9kZUNsaWNrLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgZG91YmxlLWNsaWNrIGV2ZW50cyBvbiB0cmVlIG5vZGVzIGZvciBlbmhhbmNlZCBpbnRlcmFjdGlvbiBwYXR0ZXJucy5cbiAgICogVHlwaWNhbGx5IHVzZWQgZm9yIG9wZW5pbmcgZGV0YWlsZWQgdmlld3MsIGVkaXRpbmcgbW9kZXMsIG9yIHF1aWNrIGFjdGlvbnNcbiAgICogdGhhdCBkaWZmZXIgZnJvbSBzaW5nbGUtY2xpY2sgYmVoYXZpb3IuIEVtaXRzIGV2ZW50IGZvciBwYXJlbnQgY29tcG9uZW50IGhhbmRsaW5nLlxuICAgKiBcbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIG5vZGUgZG91YmxlLWNsaWNrIGV2ZW50IGNvbnRhaW5pbmcgbm9kZSBkYXRhIGFuZCBtb3VzZSBldmVudCBkZXRhaWxzXG4gICAqL1xuICBvbk5vZGVEYmxDbGljayhldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5ub2RlRGJsQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgaW5pdGlhdGlvbiBvZiBkcmFnIG9wZXJhdGlvbnMgd2hlbiB1c2VycyBzdGFydCBkcmFnZ2luZyB0cmVlIG5vZGVzLlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBkcmFnLWFuZC1kcm9wIGZ1bmN0aW9uYWxpdHkgaXMgZW5hYmxlZCBiZWZvcmUgcHJvY2VlZGluZyBhbmRcbiAgICogZW1pdHMgdGhlIGRyYWcgc3RhcnQgZXZlbnQgZm9yIHBhcmVudCBjb21wb25lbnRzIHRvIGhhbmRsZSBkcmFnIHN0YXRlIHNldHVwLlxuICAgKiBcbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHRyZWUgaXRlbSBkcmFnIHN0YXJ0IGV2ZW50IGNvbnRhaW5pbmcgc291cmNlIG5vZGUgYW5kIGRyYWcgY29udGV4dFxuICAgKi9cbiAgb25Ob2RlRHJhZ1N0YXJ0KGV2ZW50OiBUcmVlSXRlbURyYWdTdGFydEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdBbmREcm9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubm9kZURyYWdTdGFydC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIG9uZ29pbmcgZHJhZyBvcGVyYXRpb25zIGFzIHVzZXJzIG1vdmUgbm9kZXMgZHVyaW5nIGRyYWctYW5kLWRyb3AgYWN0aW9ucy5cbiAgICogUHJvdmlkZXMgcmVhbC10aW1lIGZlZWRiYWNrIGFuZCB2YWxpZGF0aW9uIGR1cmluZyB0aGUgZHJhZyBwcm9jZXNzLCBhbGxvd2luZ1xuICAgKiBwYXJlbnQgY29tcG9uZW50cyB0byB1cGRhdGUgVUkgaW5kaWNhdG9ycyBvciB2YWxpZGF0ZSBkcm9wIHRhcmdldHMuXG4gICAqIFxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgdHJlZSBpdGVtIGRyYWcgZXZlbnQgY29udGFpbmluZyBjdXJyZW50IGRyYWcgcG9zaXRpb24gYW5kIHRhcmdldCBpbmZvcm1hdGlvblxuICAgKi9cbiAgb25Ob2RlRHJhZyhldmVudDogVHJlZUl0ZW1EcmFnRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVEcmFnLmVtaXQoZXZlbnQpO1xuICB9XG5cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY29tcGxldGlvbiBvZiBkcmFnIG9wZXJhdGlvbnMgd2hlbiB1c2VycyBmaW5pc2ggZHJhZ2dpbmcgbm9kZXMuXG4gICAqIFByb3ZpZGVzIGNsZWFudXAgYW5kIGZpbmFsIHByb2Nlc3NpbmcgZm9yIGRyYWctYW5kLWRyb3Agb3BlcmF0aW9ucywgYWxsb3dpbmdcbiAgICogcGFyZW50IGNvbXBvbmVudHMgdG8gZmluYWxpemUgZGF0YSB1cGRhdGVzIGFuZCByZXNldCBkcmFnLXJlbGF0ZWQgVUkgc3RhdGVzLlxuICAgKiBcbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHRyZWUgaXRlbSBkcmFnIGVuZCBldmVudCBjb250YWluaW5nIGZpbmFsIGRyYWcgc3RhdGUgYW5kIGNvbXBsZXRpb24gY29udGV4dFxuICAgKi9cbiAgb25Ob2RlRHJhZ0VuZChldmVudDogVHJlZUl0ZW1EcmFnRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVEcmFnRW5kLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaXRlbSBhZGRpdGlvbiBldmVudHMgd2hlbiBuZXcgbm9kZXMgYXJlIGFkZGVkIHRvIHRoZSB0cmVlIHN0cnVjdHVyZS5cbiAgICogUHJvcGFnYXRlcyBhZGQgZXZlbnRzIHRvIHBhcmVudCBjb21wb25lbnRzIGZvciBkYXRhIHBlcnNpc3RlbmNlLCB2YWxpZGF0aW9uLFxuICAgKiBhbmQgdHJlZSBzdHJ1Y3R1cmUgdXBkYXRlcyB0byBtYWludGFpbiBkYXRhIGludGVncml0eS5cbiAgICogXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSB0cmVlIGl0ZW0gYWRkIGV2ZW50IGNvbnRhaW5pbmcgbmV3IGl0ZW0gZGF0YSBhbmQgaW5zZXJ0aW9uIGNvbnRleHRcbiAgICovXG4gIG9uQWRkSXRlbShldmVudDogVHJlZUl0ZW1BZGRSZW1vdmVBcmdzKTogdm9pZCB7XG4gICAgdGhpcy5hZGRJdGVtLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaXRlbSByZW1vdmFsIGV2ZW50cyB3aGVuIG5vZGVzIGFyZSBkZWxldGVkIGZyb20gdGhlIHRyZWUgc3RydWN0dXJlLlxuICAgKiBQcm9wYWdhdGVzIHJlbW92ZSBldmVudHMgdG8gcGFyZW50IGNvbXBvbmVudHMgZm9yIGNvbmZpcm1hdGlvbiBkaWFsb2dzLCBkYXRhIGNsZWFudXAsXG4gICAqIGFuZCBjYXNjYWRpbmcgZGVsZXRpb25zIG9mIGNoaWxkIG5vZGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAgKiBcbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHRyZWUgaXRlbSByZW1vdmUgZXZlbnQgY29udGFpbmluZyBkZWxldGVkIGl0ZW0gZGF0YSBhbmQgY29udGV4dFxuICAgKi9cbiAgb25SZW1vdmVJdGVtKGV2ZW50OiBUcmVlSXRlbUFkZFJlbW92ZUFyZ3MpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUl0ZW0uZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBleHBhbmRlZCBrZXlzIGNoYW5nZXMgZm9yIHR3by13YXkgYmluZGluZyBzdXBwb3J0IHdpdGggcGFyZW50IGNvbXBvbmVudHMuXG4gICAqIFN5bmNocm9uaXplcyBpbnRlcm5hbCBleHBhbmRlZCBzdGF0ZSB3aXRoIGV4dGVybmFsIGRhdGEgYmluZGluZywgZW5hYmxpbmdcbiAgICogcHJvZ3JhbW1hdGljIGNvbnRyb2wgb2YgdHJlZSBleHBhbnNpb24gYW5kIHN0YXRlIHBlcnNpc3RlbmNlIGFjcm9zcyBjb21wb25lbnQgdXBkYXRlcy5cbiAgICogXG4gICAqIEBwYXJhbSBrZXlzIC0gQXJyYXkgb2Ygc3RyaW5nIGtleXMgcmVwcmVzZW50aW5nIGN1cnJlbnRseSBleHBhbmRlZCB0cmVlIG5vZGVzXG4gICAqL1xuICBvbkV4cGFuZGVkS2V5c0NoYW5nZShrZXlzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRLZXlzID0ga2V5cztcbiAgICB0aGlzLmV4cGFuZGVkS2V5c0NoYW5nZS5lbWl0KGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgc2VsZWN0ZWQga2V5cyBjaGFuZ2VzIGZvciB0d28td2F5IGJpbmRpbmcgc3VwcG9ydCB3aXRoIHBhcmVudCBjb21wb25lbnRzLlxuICAgKiBTeW5jaHJvbml6ZXMgaW50ZXJuYWwgc2VsZWN0aW9uIHN0YXRlIHdpdGggZXh0ZXJuYWwgZGF0YSBiaW5kaW5nLCBlbmFibGluZ1xuICAgKiBwcm9ncmFtbWF0aWMgY29udHJvbCBvZiB0cmVlIHNlbGVjdGlvbiBhbmQgZm9ybSBpbnRlZ3JhdGlvbiBjYXBhYmlsaXRpZXMuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5cyAtIEFycmF5IG9mIHN0cmluZyBrZXlzIHJlcHJlc2VudGluZyBjdXJyZW50bHkgc2VsZWN0ZWQgdHJlZSBub2Rlc1xuICAgKi9cbiAgb25TZWxlY3RlZEtleXNDaGFuZ2Uoa2V5czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkS2V5cyA9IGtleXM7XG4gICAgdGhpcy5zZWxlY3RlZEtleXNDaGFuZ2UuZW1pdChrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNoZWNrZWQga2V5cyBjaGFuZ2VzIGZvciB0d28td2F5IGJpbmRpbmcgc3VwcG9ydCB3aXRoIHBhcmVudCBjb21wb25lbnRzLlxuICAgKiBTeW5jaHJvbml6ZXMgaW50ZXJuYWwgY2hlY2tib3ggc3RhdGUgd2l0aCBleHRlcm5hbCBkYXRhIGJpbmRpbmcsIGVuYWJsaW5nXG4gICAqIHByb2dyYW1tYXRpYyBjb250cm9sIG9mIGNoZWNrYm94IHNlbGVjdGlvbnMgYW5kIGZvcm0gdmFsaWRhdGlvbiBpbnRlZ3JhdGlvbi5cbiAgICogXG4gICAqIEBwYXJhbSBrZXlzIC0gQXJyYXkgb2Ygc3RyaW5nIGtleXMgcmVwcmVzZW50aW5nIGN1cnJlbnRseSBjaGVja2VkIHRyZWUgbm9kZXNcbiAgICovXG4gIG9uQ2hlY2tlZEtleXNDaGFuZ2Uoa2V5czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrZWRLZXlzID0ga2V5cztcbiAgICB0aGlzLmNoZWNrZWRLZXlzQ2hhbmdlLmVtaXQoa2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBmaWx0ZXIgdGV4dCBjaGFuZ2VzIHdoZW4gdXNlcnMgdHlwZSBpbiBzZWFyY2ggZmllbGRzIG9yIGFwcGx5IGZpbHRlcmluZyBjcml0ZXJpYS5cbiAgICogVXBkYXRlcyB0aGUgaW50ZXJuYWwgZmlsdGVyIHN0YXRlIGFuZCBwcm9wYWdhdGVzIGNoYW5nZXMgdG8gcGFyZW50IGNvbXBvbmVudHNcbiAgICogZm9yIHNlcnZlci1zaWRlIGZpbHRlcmluZyBvciBjdXN0b20gc2VhcmNoIGxvZ2ljIGltcGxlbWVudGF0aW9uLlxuICAgKiBcbiAgICogQHBhcmFtIGZpbHRlciAtIFRoZSBmaWx0ZXIgc3RyaW5nIGVudGVyZWQgYnkgdGhlIHVzZXIgZm9yIHRyZWUgbm9kZSBzZWFyY2hpbmdcbiAgICovXG4gIG9uRmlsdGVyQ2hhbmdlKGZpbHRlcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UuZW1pdChmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBsb2FkIG1vcmUgZXZlbnRcbiAgICovXG4gIG9uTG9hZE1vcmUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmUuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNoaWxkcmVuIGxvYWRlZCBldmVudFxuICAgKi9cbiAgb25DaGlsZHJlbkxvYWRlZChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jaGlsZHJlbkxvYWRlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8vIFV0aWxpdHkgTWV0aG9kc1xuXG4gIC8qKlxuICAgKiBFeHBhbmQgYWxsIG5vZGVzXG4gICAqL1xuICBleHBhbmRBbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHJlZVZpZXdFbGVtZW50KSB7XG4gICAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZXBlbmRzIG9uIEtlbmRvIFRyZWVWaWV3IEFQSVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaXRlbSBmcm9tIGxvb2t1cFxuICAgKi9cbiAgaXRlbUxvb2t1cChpbmRleDogc3RyaW5nKTogVHJlZUl0ZW1Mb29rdXAgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnRyZWVWaWV3RWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZVZpZXdFbGVtZW50Lml0ZW1Mb29rdXAoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZyBmdW5jdGlvbiBmb3IgZGVidWdnaW5nIGV2ZW50c1xuICAgKi9cbiAgbG9nKGV2ZW50TmFtZTogc3RyaW5nLCBldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coYCR7ZXZlbnROYW1lfTpgLCBldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGRyb3AgZXZlbnQgd2l0aCBjdXN0b20gbG9naWNcbiAgICovXG4gIGhhbmRsZURyb3AoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdoYW5kbGVEcm9wOicsIGV2ZW50KTtcbiAgICAvLyBBZGQgY3VzdG9tIGRyb3AgaGFuZGxpbmcgbG9naWMgaGVyZVxuICAgIHRoaXMubm9kZURyb3AuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG5vZGUgZHJhZyBzdGFydCBldmVudFxuICAgKi9cbiAgb25EcmFnU3RhcnQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnQW5kRHJvcCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cImdldFRyZWVWaWV3Q2xhc3NlcygpXCI+XG5cbiAgPGRpdiBjbGFzcz1cInRyZWV2aWV3LXBhbmVsXCI+XG5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjaGVja2FibGVcIj5cblxuICAgICAgPGtlbmRvLXRyZWV2aWV3ICN0cmVlVmlld0VsZW1lbnQgKm5nU3dpdGNoQ2FzZT1cInRydWVcIiBbY2hpbGRyZW5dPVwiY2hpbGRyZW5cIiBrZW5kb1RyZWVWaWV3SGllcmFyY2h5QmluZGluZ1xuICAgICAgICBrZW5kb1RyZWVWaWV3RXhwYW5kYWJsZSBba2VuZG9UcmVlVmlld0NoZWNrYWJsZV09XCJjaGVja2FibGVTZXR0aW5nc1wiIGtlbmRvVHJlZVZpZXdEcmFnQW5kRHJvcFxuICAgICAgICBrZW5kb1RyZWVWaWV3RHJhZ0FuZERyb3BFZGl0aW5nIFtub2Rlc109XCJkYXRhXCIgW3RleHRGaWVsZF09XCJ0ZXh0RmllbGRcIiBbY2hpbGRyZW5GaWVsZF09XCJjaGlsZHJlbkZpZWxkXCJcbiAgICAgICAgW2ZpbHRlcmFibGVdPVwiZmlsdGVyYWJsZVwiIFtleHBhbmRCeV09XCJleHBhbmRCeVwiIFsoZXhwYW5kZWRLZXlzKV09XCJleHBhbmRlZEtleXNcIlxuICAgICAgICBbZXhwYW5kRGlzYWJsZWROb2Rlc109XCJleHBhbmREaXNhYmxlZE5vZGVzXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwib25DaGVja2VkQ2hhbmdlKCRldmVudClcIiAoZXhwYW5kKT1cIm9uRXhwYW5kKCRldmVudClcIiAoY29sbGFwc2UpPVwib25Db2xsYXBzZSgkZXZlbnQpXCJcbiAgICAgICAgKG5vZGVDbGljayk9XCJvbk5vZGVDbGljaygkZXZlbnQpXCIgKGV4cGFuZGVkS2V5c0NoYW5nZSk9XCJvbkV4cGFuZGVkS2V5c0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKG5vZGVEcmFnU3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50KVwiIChub2RlRHJvcCk9XCJoYW5kbGVEcm9wKCRldmVudClcIiAoYWRkSXRlbSk9XCJsb2coJ2FkZEl0ZW0nLCAkZXZlbnQpXCJcbiAgICAgICAgKHJlbW92ZUl0ZW0pPVwibG9nKCdyZW1vdmVJdGVtJywgJGV2ZW50KVwiIChub2RlRHJhZ0VuZCk9XCJsb2coJ25vZGVEcmFnRW5kJywgJGV2ZW50KVwiXG4gICAgICAgIChub2RlRHJhZyk9XCJvbk5vZGVEcmFnKCRldmVudClcIiBjbGFzcz1cImxpYi10cmVlLXZpZXdfX2tlbmRvLXRyZWVcIiBba2VuZG9UcmVlVmlld1NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gICAgICAgIFtmaWx0ZXJdPVwiZmlsdGVyXCIgW3NpemVdPVwic2l6ZVwiIFtuYXZpZ2FibGVdPVwibmF2aWdhYmxlXCIgW2xvYWRPbkRlbWFuZF09XCJsb2FkT25EZW1hbmRcIiBbdHJhY2tCeV09XCJ0cmFja0J5XCJcbiAgICAgICAgW2hhc0NoaWxkcmVuXT1cImhhc0NoaWxkcmVuXCIgWyhzZWxlY3RlZEtleXMpXT1cInNlbGVjdGVkS2V5c1wiIChmaWx0ZXJDaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoJGV2ZW50KVwiPlxuXG4gICAgICAgIDwhLS0gQ3VzdG9tIE5vZGUgVGVtcGxhdGUgLS0+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIm5vZGVUZW1wbGF0ZVwiIGtlbmRvVHJlZVZpZXdOb2RlVGVtcGxhdGUgbGV0LWRhdGFJdGVtPVwiZGF0YUl0ZW1cIiBsZXQtaW5kZXg9XCJpbmRleFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgXG4gICAgICAgICRpbXBsaWNpdDogZGF0YUl0ZW0sIFxuICAgICAgICBkYXRhSXRlbTogZGF0YUl0ZW0sIFxuICAgICAgICBpbmRleDogaW5kZXggXG4gICAgICB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPCEtLSBMb2FkIE1vcmUgQnV0dG9uIFRlbXBsYXRlIC0tPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJsb2FkTW9yZUJ1dHRvblRlbXBsYXRlXCIga2VuZG9UcmVlVmlld0xvYWRNb3JlQnV0dG9uVGVtcGxhdGUgbGV0LWRhdGFJdGVtPVwiZGF0YUl0ZW1cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxvYWRNb3JlQnV0dG9uVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBcbiAgICAgICAgJGltcGxpY2l0OiBkYXRhSXRlbSwgXG4gICAgICAgIGRhdGFJdGVtOiBkYXRhSXRlbSBcbiAgICAgIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPC9rZW5kby10cmVldmlldz5cblxuICAgICAgPCEtLSBUcmVlVmlldyB3aXRob3V0IGNoZWNrYWJsZSBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgPGtlbmRvLXRyZWV2aWV3ICN0cmVlVmlld0VsZW1lbnQgKm5nU3dpdGNoRGVmYXVsdCBrZW5kb1RyZWVWaWV3SGllcmFyY2h5QmluZGluZyBrZW5kb1RyZWVWaWV3RXhwYW5kYWJsZVxuICAgICAgICBrZW5kb1RyZWVWaWV3RHJhZ0FuZERyb3Aga2VuZG9UcmVlVmlld0RyYWdBbmREcm9wRWRpdGluZyBbbm9kZXNdPVwiZGF0YVwiIFt0ZXh0RmllbGRdPVwidGV4dEZpZWxkXCJcbiAgICAgICAgW2NoaWxkcmVuRmllbGRdPVwiY2hpbGRyZW5GaWVsZFwiIFtmaWx0ZXJhYmxlXT1cImZpbHRlcmFibGVcIiBbZXhwYW5kQnldPVwiZXhwYW5kQnlcIiBbKGV4cGFuZGVkS2V5cyldPVwiZXhwYW5kZWRLZXlzXCJcbiAgICAgICAgW2V4cGFuZERpc2FibGVkTm9kZXNdPVwiZXhwYW5kRGlzYWJsZWROb2Rlc1wiIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChjaGVja2VkQ2hhbmdlKT1cIm9uQ2hlY2tlZENoYW5nZSgkZXZlbnQpXCIgKGV4cGFuZCk9XCJvbkV4cGFuZCgkZXZlbnQpXCIgKGNvbGxhcHNlKT1cIm9uQ29sbGFwc2UoJGV2ZW50KVwiXG4gICAgICAgIChub2RlQ2xpY2spPVwib25Ob2RlQ2xpY2soJGV2ZW50KVwiIChleHBhbmRlZEtleXNDaGFuZ2UpPVwib25FeHBhbmRlZEtleXNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChub2RlRHJhZ1N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudClcIiAobm9kZURyYWcpPVwib25Ob2RlRHJhZygkZXZlbnQpXCIgKG5vZGVEcm9wKT1cImhhbmRsZURyb3AoJGV2ZW50KVwiXG4gICAgICAgIChhZGRJdGVtKT1cImxvZygnYWRkSXRlbScsICRldmVudClcIiAocmVtb3ZlSXRlbSk9XCJsb2coJ3JlbW92ZUl0ZW0nLCAkZXZlbnQpXCJcbiAgICAgICAgKG5vZGVEcmFnRW5kKT1cImxvZygnbm9kZURyYWdFbmQnLCAkZXZlbnQpXCIgY2xhc3M9XCJsaWItdHJlZS12aWV3X19rZW5kby10cmVlXCJcbiAgICAgICAgW2tlbmRvVHJlZVZpZXdTZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIiBbc2l6ZV09XCJzaXplXCIgW25hdmlnYWJsZV09XCJuYXZpZ2FibGVcIiBbbG9hZE9uRGVtYW5kXT1cImxvYWRPbkRlbWFuZFwiXG4gICAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlcIiBbaGFzQ2hpbGRyZW5dPVwiaGFzQ2hpbGRyZW5cIiBbKHNlbGVjdGVkS2V5cyldPVwic2VsZWN0ZWRLZXlzXCJcbiAgICAgICAgKGZpbHRlckNoYW5nZSk9XCJvbkZpbHRlckNoYW5nZSgkZXZlbnQpXCI+XG5cbiAgICAgICAgPCEtLSBDdXN0b20gTm9kZSBUZW1wbGF0ZSAtLT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwibm9kZVRlbXBsYXRlXCIga2VuZG9UcmVlVmlld05vZGVUZW1wbGF0ZSBsZXQtZGF0YUl0ZW09XCJkYXRhSXRlbVwiIGxldC1pbmRleD1cImluZGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJub2RlVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBcbiAgICAgICAgJGltcGxpY2l0OiBkYXRhSXRlbSwgXG4gICAgICAgIGRhdGFJdGVtOiBkYXRhSXRlbSwgXG4gICAgICAgIGluZGV4OiBpbmRleCBcbiAgICAgIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8IS0tIExvYWQgTW9yZSBCdXR0b24gVGVtcGxhdGUgLS0+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImxvYWRNb3JlQnV0dG9uVGVtcGxhdGVcIiBrZW5kb1RyZWVWaWV3TG9hZE1vcmVCdXR0b25UZW1wbGF0ZSBsZXQtZGF0YUl0ZW09XCJkYXRhSXRlbVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZE1vcmVCdXR0b25UZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IFxuICAgICAgICAkaW1wbGljaXQ6IGRhdGFJdGVtLCBcbiAgICAgICAgZGF0YUl0ZW06IGRhdGFJdGVtIFxuICAgICAgfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8L2tlbmRvLXRyZWV2aWV3PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBMb2FkaW5nIGluZGljYXRvciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwibGliLXRyZWUtdmlld19fbG9hZGluZ1wiPlxuICAgICAgPGxpYi1sb2FkZXIgc2l6ZT1cIm1lZGl1bVwiIHR5cGU9XCJwdWxzaW5nXCIgdGhlbWVDb2xvcj1cInByaW1hcnlcIj48L2xpYi1sb2FkZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS12aWV3LmludGVyZmFjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9hdG9tcy90cmVlLXZpZXcvdHJlZS12aWV3LmludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJlZVZpZXcgbm9kZSBpbnRlcmZhY2Ugd2l0aCBjb21wcmVoZW5zaXZlIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmVlVmlld05vZGUge1xuICAvLyBDb3JlIFByb3BlcnRpZXNcbiAgdGV4dDogc3RyaW5nO1xuICB2YWx1ZT86IGFueTtcbiAgaWQ/OiBzdHJpbmcgfCBudW1iZXI7XG5cbiAgLy8gU3RhdGUgUHJvcGVydGllc1xuICBleHBhbmRlZD86IGJvb2xlYW47XG4gIHNlbGVjdGVkPzogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBjaGVja2VkPzogYm9vbGVhbjtcbiAgdmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLy8gSGllcmFyY2h5IFByb3BlcnRpZXNcbiAgY2hpbGRyZW4/OiBUcmVlVmlld05vZGVbXTtcbiAgcGFyZW50SWQ/OiBzdHJpbmcgfCBudW1iZXI7XG5cbiAgLy8gVmlzdWFsIFByb3BlcnRpZXNcbiAgaWNvbj86IHN0cmluZztcbiAgaWNvbkNsYXNzPzogc3RyaW5nO1xuICBpbWFnZVVybD86IHN0cmluZztcbiAgc3ByaXRlQ3NzQ2xhc3M/OiBzdHJpbmc7XG4gIGNzc0NsYXNzPzogc3RyaW5nO1xuXG4gIC8vIExvYWQgTW9yZSBQcm9wZXJ0aWVzXG4gIGhhc01vcmU/OiBib29sZWFuO1xuICBsb2FkTW9yZVRleHQ/OiBzdHJpbmc7XG5cbiAgLy8gQ3VzdG9tIFByb3BlcnRpZXNcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuIl19