cloud-ide-element 0.0.1 → 1.0.2

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 (50) hide show
  1. package/README.md +271 -24
  2. package/esm2022/lib/components/confirmation-modal/confirmation-modal.component.mjs +182 -0
  3. package/esm2022/lib/components/data-grid/data-grid.component.mjs +1363 -0
  4. package/esm2022/lib/components/data-grid/data-grid.types.mjs +37 -0
  5. package/esm2022/lib/components/dropdown/dropdown.component.mjs +396 -0
  6. package/esm2022/lib/components/global-notifications/global-notifications.component.mjs +30 -0
  7. package/esm2022/lib/components/json-editor/json-editor.component.mjs +521 -0
  8. package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +33 -0
  9. package/esm2022/lib/components/toast-notification/toast-notification.component.mjs +152 -0
  10. package/esm2022/lib/elements/button/cide-ele-button.component.mjs +249 -0
  11. package/esm2022/lib/elements/file-input/file-input.component.mjs +83 -0
  12. package/esm2022/lib/elements/icon/icon.component.mjs +5 -3
  13. package/esm2022/lib/elements/input/input.component.mjs +34 -20
  14. package/esm2022/lib/elements/select/select.component.mjs +471 -0
  15. package/esm2022/lib/elements/tab/cide-ele-tab.component.mjs +74 -0
  16. package/esm2022/lib/elements/textarea/textarea.component.mjs +157 -0
  17. package/esm2022/lib/services/confirmation.service.mjs +151 -0
  18. package/esm2022/lib/services/dropdown-manager.service.mjs +93 -0
  19. package/esm2022/lib/services/notification.service.mjs +196 -0
  20. package/esm2022/lib/utils/directives/resizer/resizer.directive.mjs +231 -0
  21. package/esm2022/lib/utils/directives/tooltip/tooltip.directive.mjs +294 -0
  22. package/esm2022/lib/utils/services/elements/elements.service.mjs +9 -7
  23. package/esm2022/public-api.mjs +23 -2
  24. package/fesm2022/cloud-ide-element.mjs +4646 -47
  25. package/fesm2022/cloud-ide-element.mjs.map +1 -1
  26. package/lib/components/confirmation-modal/confirmation-modal.component.d.ts +16 -0
  27. package/lib/components/data-grid/data-grid.component.d.ts +244 -0
  28. package/lib/components/data-grid/data-grid.types.d.ts +146 -0
  29. package/lib/components/dropdown/dropdown.component.d.ts +75 -0
  30. package/lib/components/global-notifications/global-notifications.component.d.ts +5 -0
  31. package/lib/components/json-editor/json-editor.component.d.ts +116 -0
  32. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +11 -0
  33. package/lib/components/toast-notification/toast-notification.component.d.ts +13 -0
  34. package/lib/elements/button/cide-ele-button.component.d.ts +85 -0
  35. package/lib/elements/file-input/file-input.component.d.ts +25 -0
  36. package/lib/elements/input/input.component.d.ts +7 -4
  37. package/lib/elements/select/select.component.d.ts +91 -0
  38. package/lib/elements/tab/cide-ele-tab.component.d.ts +26 -0
  39. package/lib/elements/textarea/textarea.component.d.ts +47 -0
  40. package/lib/services/confirmation.service.d.ts +65 -0
  41. package/lib/services/dropdown-manager.service.d.ts +22 -0
  42. package/lib/services/notification.service.d.ts +81 -0
  43. package/lib/utils/directives/resizer/resizer.directive.d.ts +44 -0
  44. package/lib/utils/directives/tooltip/tooltip.directive.d.ts +43 -0
  45. package/package.json +30 -4
  46. package/public-api.d.ts +18 -1
  47. package/src/lib/assets/css/cide-ele-style.scss +85 -0
  48. package/src/lib/assets/css/cide-ele-variable.scss +336 -0
  49. package/esm2022/lib/elements/button/button.component.mjs +0 -60
  50. package/lib/elements/button/button.component.d.ts +0 -27
@@ -0,0 +1,196 @@
1
+ import { Injectable, signal, computed } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class NotificationService {
4
+ constructor() {
5
+ this.notifications = signal([]);
6
+ this.maxNotifications = 5; // Maximum notifications to show at once
7
+ // Computed signals
8
+ this.activeNotifications = computed(() => this.notifications().filter(n => n.isVisible));
9
+ }
10
+ /**
11
+ * Show a success notification
12
+ */
13
+ success(message, options) {
14
+ return this.show({
15
+ message,
16
+ type: 'success',
17
+ icon: 'check_circle',
18
+ duration: 3000,
19
+ ...options
20
+ });
21
+ }
22
+ /**
23
+ * Show an error notification
24
+ */
25
+ error(message, options) {
26
+ return this.show({
27
+ message,
28
+ type: 'error',
29
+ icon: 'error',
30
+ duration: 5000,
31
+ ...options
32
+ });
33
+ }
34
+ /**
35
+ * Show a warning notification
36
+ */
37
+ warning(message, options) {
38
+ return this.show({
39
+ message,
40
+ type: 'warning',
41
+ icon: 'warning',
42
+ duration: 4000,
43
+ ...options
44
+ });
45
+ }
46
+ /**
47
+ * Show an info notification
48
+ */
49
+ info(message, options) {
50
+ return this.show({
51
+ message,
52
+ type: 'info',
53
+ icon: 'info',
54
+ duration: 3000,
55
+ ...options
56
+ });
57
+ }
58
+ /**
59
+ * Show a notification with undo functionality
60
+ */
61
+ showWithUndo(message, undoAction, options) {
62
+ return this.show({
63
+ message,
64
+ type: 'info',
65
+ icon: 'info',
66
+ duration: 8000,
67
+ showUndo: true,
68
+ undoAction,
69
+ undoText: 'Undo',
70
+ ...options
71
+ });
72
+ }
73
+ /**
74
+ * Show a notification for reversible destructive actions
75
+ */
76
+ showReversibleAction(action, itemName, undoAction, options) {
77
+ return this.showWithUndo(`${action} "${itemName}"`, undoAction, {
78
+ type: 'warning',
79
+ icon: 'delete',
80
+ title: `${action} completed`,
81
+ ...options
82
+ });
83
+ }
84
+ /**
85
+ * Show a notification for background tasks
86
+ */
87
+ showBackgroundTask(taskName, isComplete = true, options) {
88
+ return this.show({
89
+ message: isComplete ? `${taskName} completed successfully` : `${taskName} in progress...`,
90
+ type: isComplete ? 'success' : 'info',
91
+ icon: isComplete ? 'check_circle' : 'sync',
92
+ duration: isComplete ? 3000 : 0, // Don't auto-dismiss for in-progress tasks
93
+ ...options
94
+ });
95
+ }
96
+ /**
97
+ * Core show method
98
+ */
99
+ show(options) {
100
+ const notification = {
101
+ id: this.generateId(),
102
+ message: options.message,
103
+ type: options.type || 'info',
104
+ duration: options.duration || 3000,
105
+ showUndo: options.showUndo || false,
106
+ undoAction: options.undoAction,
107
+ undoText: options.undoText || 'Undo',
108
+ icon: options.icon || this.getDefaultIcon(options.type || 'info'),
109
+ title: options.title,
110
+ timestamp: Date.now(),
111
+ isVisible: true
112
+ };
113
+ this.addNotification(notification);
114
+ return notification.id;
115
+ }
116
+ /**
117
+ * Remove a specific notification
118
+ */
119
+ remove(id) {
120
+ this.notifications.update(notifications => notifications.map(n => n.id === id ? { ...n, isVisible: false } : n));
121
+ // Remove from array after animation
122
+ setTimeout(() => {
123
+ this.notifications.update(notifications => notifications.filter(n => n.id !== id));
124
+ }, 300);
125
+ }
126
+ /**
127
+ * Remove all notifications
128
+ */
129
+ clearAll() {
130
+ this.notifications.update(notifications => notifications.map(n => ({ ...n, isVisible: false })));
131
+ setTimeout(() => {
132
+ this.notifications.set([]);
133
+ }, 300);
134
+ }
135
+ /**
136
+ * Execute undo action for a notification
137
+ */
138
+ executeUndo(id) {
139
+ const notification = this.notifications().find(n => n.id === id);
140
+ if (notification && notification.undoAction) {
141
+ notification.undoAction();
142
+ this.remove(id);
143
+ }
144
+ }
145
+ // Internal methods
146
+ addNotification(notification) {
147
+ this.notifications.update(notifications => {
148
+ const newNotifications = [...notifications, notification];
149
+ // Limit the number of visible notifications
150
+ if (newNotifications.length > this.maxNotifications) {
151
+ // Remove oldest notifications
152
+ const toRemove = newNotifications.length - this.maxNotifications;
153
+ for (let i = 0; i < toRemove; i++) {
154
+ if (newNotifications[i]) {
155
+ newNotifications[i] = { ...newNotifications[i], isVisible: false };
156
+ }
157
+ }
158
+ }
159
+ return newNotifications;
160
+ });
161
+ // Auto-remove after duration (if not 0)
162
+ if (notification.duration > 0) {
163
+ setTimeout(() => {
164
+ this.remove(notification.id);
165
+ }, notification.duration);
166
+ }
167
+ }
168
+ generateId() {
169
+ return `notification-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
170
+ }
171
+ getDefaultIcon(type) {
172
+ const iconMap = {
173
+ success: 'check_circle',
174
+ error: 'error',
175
+ warning: 'warning',
176
+ info: 'info'
177
+ };
178
+ return iconMap[type];
179
+ }
180
+ // Public getters for components
181
+ getNotifications() {
182
+ return this.notifications;
183
+ }
184
+ getActiveNotifications() {
185
+ return this.activeNotifications;
186
+ }
187
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: NotificationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
188
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: NotificationService, providedIn: 'root' }); }
189
+ }
190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: NotificationService, decorators: [{
191
+ type: Injectable,
192
+ args: [{
193
+ providedIn: 'root'
194
+ }]
195
+ }], ctorParameters: () => [] });
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvbGliL3NlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUErQjdELE1BQU0sT0FBTyxtQkFBbUI7SUFTOUI7UUFSUSxrQkFBYSxHQUFHLE1BQU0sQ0FBcUIsRUFBRSxDQUFDLENBQUM7UUFDL0MscUJBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsd0NBQXdDO1FBRXRFLG1CQUFtQjtRQUNuQix3QkFBbUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ2xDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQzlDLENBQUM7SUFFYSxDQUFDO0lBRWhCOztPQUVHO0lBQ0gsT0FBTyxDQUFDLE9BQWUsRUFBRSxPQUFzQztRQUM3RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDZixPQUFPO1lBQ1AsSUFBSSxFQUFFLFNBQVM7WUFDZixJQUFJLEVBQUUsY0FBYztZQUNwQixRQUFRLEVBQUUsSUFBSTtZQUNkLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFlLEVBQUUsT0FBc0M7UUFDM0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2YsT0FBTztZQUNQLElBQUksRUFBRSxPQUFPO1lBQ2IsSUFBSSxFQUFFLE9BQU87WUFDYixRQUFRLEVBQUUsSUFBSTtZQUNkLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU8sQ0FB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O1lBQy9CLENBQUMsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8sZ0JBQWdCLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNqRixDQUFDO0lBRU8sY0FBYyxDQUFDLElBQThDO1FBQ25FLE1BQU0sT0FBTyxHQUFHO1lBQ2QsT0FBTyxFQUFFLGNBQWM7WUFDdkIsS0FBSyxFQUFFLE9BQU87WUFDZCxPQUFPLEVBQUUsU0FBUztZQUNsQixJQUFJLEVBQUUsTUFBTTtTQUNiLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7OEdBek9VLG1CQUFtQjtrSEFBbkIsbUJBQW1CLGNBRmxCLE1BQU07OzJGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uT3B0aW9ucyB7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIHR5cGU/OiAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ2luZm8nO1xyXG4gIGR1cmF0aW9uPzogbnVtYmVyO1xyXG4gIHNob3dVbmRvPzogYm9vbGVhbjtcclxuICB1bmRvQWN0aW9uPzogKCkgPT4gdm9pZDtcclxuICB1bmRvVGV4dD86IHN0cmluZztcclxuICBpY29uPzogc3RyaW5nO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbkl0ZW0ge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIHR5cGU6ICdzdWNjZXNzJyB8ICdlcnJvcicgfCAnd2FybmluZycgfCAnaW5mbyc7XHJcbiAgZHVyYXRpb246IG51bWJlcjtcclxuICBzaG93VW5kbzogYm9vbGVhbjtcclxuICB1bmRvQWN0aW9uPzogKCkgPT4gdm9pZDtcclxuICB1bmRvVGV4dDogc3RyaW5nO1xyXG4gIGljb246IHN0cmluZztcclxuICB0aXRsZT86IHN0cmluZztcclxuICB0aW1lc3RhbXA6IG51bWJlcjtcclxuICBpc1Zpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgbm90aWZpY2F0aW9ucyA9IHNpZ25hbDxOb3RpZmljYXRpb25JdGVtW10+KFtdKTtcclxuICBwcml2YXRlIG1heE5vdGlmaWNhdGlvbnMgPSA1OyAvLyBNYXhpbXVtIG5vdGlmaWNhdGlvbnMgdG8gc2hvdyBhdCBvbmNlXHJcblxyXG4gIC8vIENvbXB1dGVkIHNpZ25hbHNcclxuICBhY3RpdmVOb3RpZmljYXRpb25zID0gY29tcHV0ZWQoKCkgPT4gXHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMoKS5maWx0ZXIobiA9PiBuLmlzVmlzaWJsZSlcclxuICApO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgYSBzdWNjZXNzIG5vdGlmaWNhdGlvblxyXG4gICAqL1xyXG4gIHN1Y2Nlc3MobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxOb3RpZmljYXRpb25PcHRpb25zPik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93KHtcclxuICAgICAgbWVzc2FnZSxcclxuICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICBpY29uOiAnY2hlY2tfY2lyY2xlJyxcclxuICAgICAgZHVyYXRpb246IDMwMDAsXHJcbiAgICAgIC4uLm9wdGlvbnNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhbiBlcnJvciBub3RpZmljYXRpb25cclxuICAgKi9cclxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJ0aWFsPE5vdGlmaWNhdGlvbk9wdGlvbnM+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNob3coe1xyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICBpY29uOiAnZXJyb3InLFxyXG4gICAgICBkdXJhdGlvbjogNTAwMCxcclxuICAgICAgLi4ub3B0aW9uc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGEgd2FybmluZyBub3RpZmljYXRpb25cclxuICAgKi9cclxuICB3YXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8Tm90aWZpY2F0aW9uT3B0aW9ucz4pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvdyh7XHJcbiAgICAgIG1lc3NhZ2UsXHJcbiAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgaWNvbjogJ3dhcm5pbmcnLFxyXG4gICAgICBkdXJhdGlvbjogNDAwMCxcclxuICAgICAgLi4ub3B0aW9uc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGFuIGluZm8gbm90aWZpY2F0aW9uXHJcbiAgICovXHJcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJ0aWFsPE5vdGlmaWNhdGlvbk9wdGlvbnM+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNob3coe1xyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0eXBlOiAnaW5mbycsXHJcbiAgICAgIGljb246ICdpbmZvJyxcclxuICAgICAgZHVyYXRpb246IDMwMDAsXHJcbiAgICAgIC4uLm9wdGlvbnNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhIG5vdGlmaWNhdGlvbiB3aXRoIHVuZG8gZnVuY3Rpb25hbGl0eVxyXG4gICAqL1xyXG4gIHNob3dXaXRoVW5kbyhcclxuICAgIG1lc3NhZ2U6IHN0cmluZywgXHJcbiAgICB1bmRvQWN0aW9uOiAoKSA9PiB2b2lkLCBcclxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPE5vdGlmaWNhdGlvbk9wdGlvbnM+XHJcbiAgKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNob3coe1xyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0eXBlOiAnaW5mbycsXHJcbiAgICAgIGljb246ICdpbmZvJyxcclxuICAgICAgZHVyYXRpb246IDgwMDAsXHJcbiAgICAgIHNob3dVbmRvOiB0cnVlLFxyXG4gICAgICB1bmRvQWN0aW9uLFxyXG4gICAgICB1bmRvVGV4dDogJ1VuZG8nLFxyXG4gICAgICAuLi5vcHRpb25zXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgYSBub3RpZmljYXRpb24gZm9yIHJldmVyc2libGUgZGVzdHJ1Y3RpdmUgYWN0aW9uc1xyXG4gICAqL1xyXG4gIHNob3dSZXZlcnNpYmxlQWN0aW9uKFxyXG4gICAgYWN0aW9uOiBzdHJpbmcsXHJcbiAgICBpdGVtTmFtZTogc3RyaW5nLFxyXG4gICAgdW5kb0FjdGlvbjogKCkgPT4gdm9pZCxcclxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPE5vdGlmaWNhdGlvbk9wdGlvbnM+XHJcbiAgKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dXaXRoVW5kbyhcclxuICAgICAgYCR7YWN0aW9ufSBcIiR7aXRlbU5hbWV9XCJgLFxyXG4gICAgICB1bmRvQWN0aW9uLFxyXG4gICAgICB7XHJcbiAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgIGljb246ICdkZWxldGUnLFxyXG4gICAgICAgIHRpdGxlOiBgJHthY3Rpb259IGNvbXBsZXRlZGAsXHJcbiAgICAgICAgLi4ub3B0aW9uc1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhIG5vdGlmaWNhdGlvbiBmb3IgYmFja2dyb3VuZCB0YXNrc1xyXG4gICAqL1xyXG4gIHNob3dCYWNrZ3JvdW5kVGFzayhcclxuICAgIHRhc2tOYW1lOiBzdHJpbmcsXHJcbiAgICBpc0NvbXBsZXRlOiBib29sZWFuID0gdHJ1ZSxcclxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPE5vdGlmaWNhdGlvbk9wdGlvbnM+XHJcbiAgKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNob3coe1xyXG4gICAgICBtZXNzYWdlOiBpc0NvbXBsZXRlID8gYCR7dGFza05hbWV9IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgIDogYCR7dGFza05hbWV9IGluIHByb2dyZXNzLi4uYCxcclxuICAgICAgdHlwZTogaXNDb21wbGV0ZSA/ICdzdWNjZXNzJyA6ICdpbmZvJyxcclxuICAgICAgaWNvbjogaXNDb21wbGV0ZSA/ICdjaGVja19jaXJjbGUnIDogJ3N5bmMnLFxyXG4gICAgICBkdXJhdGlvbjogaXNDb21wbGV0ZSA/IDMwMDAgOiAwLCAvLyBEb24ndCBhdXRvLWRpc21pc3MgZm9yIGluLXByb2dyZXNzIHRhc2tzXHJcbiAgICAgIC4uLm9wdGlvbnNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29yZSBzaG93IG1ldGhvZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2hvdyhvcHRpb25zOiBOb3RpZmljYXRpb25PcHRpb25zKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uSXRlbSA9IHtcclxuICAgICAgaWQ6IHRoaXMuZ2VuZXJhdGVJZCgpLFxyXG4gICAgICBtZXNzYWdlOiBvcHRpb25zLm1lc3NhZ2UsXHJcbiAgICAgIHR5cGU6IG9wdGlvbnMudHlwZSB8fCAnaW5mbycsXHJcbiAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uIHx8IDMwMDAsXHJcbiAgICAgIHNob3dVbmRvOiBvcHRpb25zLnNob3dVbmRvIHx8IGZhbHNlLFxyXG4gICAgICB1bmRvQWN0aW9uOiBvcHRpb25zLnVuZG9BY3Rpb24sXHJcbiAgICAgIHVuZG9UZXh0OiBvcHRpb25zLnVuZG9UZXh0IHx8ICdVbmRvJyxcclxuICAgICAgaWNvbjogb3B0aW9ucy5pY29uIHx8IHRoaXMuZ2V0RGVmYXVsdEljb24ob3B0aW9ucy50eXBlIHx8ICdpbmZvJyksXHJcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxyXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXHJcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFkZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xyXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbi5pZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhIHNwZWNpZmljIG5vdGlmaWNhdGlvblxyXG4gICAqL1xyXG4gIHJlbW92ZShpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMudXBkYXRlKG5vdGlmaWNhdGlvbnMgPT4gXHJcbiAgICAgIG5vdGlmaWNhdGlvbnMubWFwKG4gPT4gXHJcbiAgICAgICAgbi5pZCA9PT0gaWQgPyB7IC4uLm4sIGlzVmlzaWJsZTogZmFsc2UgfSA6IG5cclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBSZW1vdmUgZnJvbSBhcnJheSBhZnRlciBhbmltYXRpb25cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMudXBkYXRlKG5vdGlmaWNhdGlvbnMgPT4gXHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy5maWx0ZXIobiA9PiBuLmlkICE9PSBpZClcclxuICAgICAgKTtcclxuICAgIH0sIDMwMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYWxsIG5vdGlmaWNhdGlvbnNcclxuICAgKi9cclxuICBjbGVhckFsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMubm90aWZpY2F0aW9ucy51cGRhdGUobm90aWZpY2F0aW9ucyA9PiBcclxuICAgICAgbm90aWZpY2F0aW9ucy5tYXAobiA9PiAoeyAuLi5uLCBpc1Zpc2libGU6IGZhbHNlIH0pKVxyXG4gICAgKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNldChbXSk7XHJcbiAgICB9LCAzMDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhlY3V0ZSB1bmRvIGFjdGlvbiBmb3IgYSBub3RpZmljYXRpb25cclxuICAgKi9cclxuICBleGVjdXRlVW5kbyhpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLm5vdGlmaWNhdGlvbnMoKS5maW5kKG4gPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKG5vdGlmaWNhdGlvbiAmJiBub3RpZmljYXRpb24udW5kb0FjdGlvbikge1xyXG4gICAgICBub3RpZmljYXRpb24udW5kb0FjdGlvbigpO1xyXG4gICAgICB0aGlzLnJlbW92ZShpZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBJbnRlcm5hbCBtZXRob2RzXHJcbiAgcHJpdmF0ZSBhZGROb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb25JdGVtKTogdm9pZCB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMudXBkYXRlKG5vdGlmaWNhdGlvbnMgPT4ge1xyXG4gICAgICBjb25zdCBuZXdOb3RpZmljYXRpb25zID0gWy4uLm5vdGlmaWNhdGlvbnMsIG5vdGlmaWNhdGlvbl07XHJcbiAgICAgIFxyXG4gICAgICAvLyBMaW1pdCB0aGUgbnVtYmVyIG9mIHZpc2libGUgbm90aWZpY2F0aW9uc1xyXG4gICAgICBpZiAobmV3Tm90aWZpY2F0aW9ucy5sZW5ndGggPiB0aGlzLm1heE5vdGlmaWNhdGlvbnMpIHtcclxuICAgICAgICAvLyBSZW1vdmUgb2xkZXN0IG5vdGlmaWNhdGlvbnNcclxuICAgICAgICBjb25zdCB0b1JlbW92ZSA9IG5ld05vdGlmaWNhdGlvbnMubGVuZ3RoIC0gdGhpcy5tYXhOb3RpZmljYXRpb25zO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9SZW1vdmU7IGkrKykge1xyXG4gICAgICAgICAgaWYgKG5ld05vdGlmaWNhdGlvbnNbaV0pIHtcclxuICAgICAgICAgICAgbmV3Tm90aWZpY2F0aW9uc1tpXSA9IHsgLi4ubmV3Tm90aWZpY2F0aW9uc1tpXSwgaXNWaXNpYmxlOiBmYWxzZSB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgcmV0dXJuIG5ld05vdGlmaWNhdGlvbnM7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBdXRvLXJlbW92ZSBhZnRlciBkdXJhdGlvbiAoaWYgbm90IDApXHJcbiAgICBpZiAobm90aWZpY2F0aW9uLmR1cmF0aW9uID4gMCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnJlbW92ZShub3RpZmljYXRpb24uaWQpO1xyXG4gICAgICB9LCBub3RpZmljYXRpb24uZHVyYXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYG5vdGlmaWNhdGlvbi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERlZmF1bHRJY29uKHR5cGU6ICdzdWNjZXNzJyB8ICdlcnJvcicgfCAnd2FybmluZycgfCAnaW5mbycpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWNvbk1hcCA9IHtcclxuICAgICAgc3VjY2VzczogJ2NoZWNrX2NpcmNsZScsXHJcbiAgICAgIGVycm9yOiAnZXJyb3InLFxyXG4gICAgICB3YXJuaW5nOiAnd2FybmluZycsXHJcbiAgICAgIGluZm86ICdpbmZvJ1xyXG4gICAgfTtcclxuICAgIHJldHVybiBpY29uTWFwW3R5cGVdO1xyXG4gIH1cclxuXHJcbiAgLy8gUHVibGljIGdldHRlcnMgZm9yIGNvbXBvbmVudHNcclxuICBnZXROb3RpZmljYXRpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9ucztcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZU5vdGlmaWNhdGlvbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVOb3RpZmljYXRpb25zO1xyXG4gIH1cclxufVxyXG5cclxuIl19
@@ -0,0 +1,231 @@
1
+ import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ <!-- Basic horizontal (left-right) layout -->
5
+ <div class="panel-container">
6
+ <div class="left-panel">
7
+ Left Panel Content
8
+ </div>
9
+
10
+ <div cideEleResizer direction="horizontal" [minPrevSize]="100" [minNextSize]="100">resize
11
+ </div>
12
+
13
+ <div class="right-panel">
14
+ Right Panel Content
15
+ </div>
16
+ </div>
17
+
18
+ <!-- Basic vertical (top-bottom) layout -->
19
+ <div class="panel-container-vertical">
20
+ <div class="top-panel">
21
+ Top Panel Content
22
+ </div>
23
+
24
+ <div cideEleResizer direction="vertical" [minPrevSize]="50" [minNextSize]="50">resize
25
+ </div>
26
+
27
+ <div class="bottom-panel">
28
+ Bottom Panel Content
29
+ </div>
30
+ </div>
31
+
32
+ <!-- Using with custom selectors -->
33
+ <div class="complex-layout">
34
+ <div id="panel1">Panel 1</div>
35
+ <div id="panel2">Panel 2</div>
36
+
37
+ <div cideEleResizer direction="horizontal" prevElementSelector="#panel1" nextElementSelector="#panel2"
38
+ [usePercentage]="true">resize
39
+ </div>
40
+
41
+ <div id="panel3">Panel 3</div>
42
+ </div>
43
+ */
44
+ export class CideEleResizerDirective {
45
+ constructor(el, renderer) {
46
+ this.el = el;
47
+ this.renderer = renderer;
48
+ this.direction = 'horizontal';
49
+ this.to = "";
50
+ this.prevElementSelector = ''; // Selector for previous element
51
+ this.nextElementSelector = ''; // Selector for next element
52
+ this.parentElementSelector = ''; // Selector for parent element
53
+ this.minPrevSize = 0; // Minimum size of previous element (px)
54
+ this.minNextSize = 0; // Minimum size of next element (px)
55
+ this.usePercentage = false; // Use percentage instead of pixels
56
+ this.resizeStart = new EventEmitter();
57
+ this.resizing = new EventEmitter();
58
+ this.resizeEnd = new EventEmitter();
59
+ this.isResizing = false;
60
+ this.startPosition = 0;
61
+ this.prevElement = null;
62
+ this.nextElement = null;
63
+ this.prevSize = 0;
64
+ this.nextSize = 0;
65
+ this.containerSize = 0;
66
+ this.startPrevSize = 0;
67
+ this.startNextSize = 0;
68
+ this.onMouseMove = (event) => {
69
+ if (!this.isResizing)
70
+ return;
71
+ // Calculate movement
72
+ const currentPosition = this.direction === 'horizontal' ? event.clientX : event.clientY;
73
+ const delta = currentPosition - this.startPosition;
74
+ // Calculate new sizes
75
+ let newPrevSize = this.startPrevSize + delta;
76
+ let newNextSize = this.startNextSize - delta;
77
+ // Apply constraints
78
+ if (newPrevSize < this.minPrevSize) {
79
+ const diff = this.minPrevSize - newPrevSize;
80
+ newPrevSize = this.minPrevSize;
81
+ newNextSize = this.startNextSize - delta + diff;
82
+ // skip if previsus size is equal to the minimum size, note above code is dark code which will not be executed
83
+ return;
84
+ }
85
+ if (newNextSize < this.minNextSize) {
86
+ const diff = this.minNextSize - newNextSize;
87
+ newNextSize = this.minNextSize;
88
+ newPrevSize = this.startPrevSize + delta - diff;
89
+ // skip if next size is equal to the minimum size, note above code is dark code which will not be executed
90
+ return;
91
+ }
92
+ // Update sizes
93
+ this.prevSize = newPrevSize;
94
+ this.nextSize = newNextSize;
95
+ // Apply new sizes
96
+ if (this.usePercentage) {
97
+ const prevPercent = (newPrevSize / this.containerSize) * 100;
98
+ const nextPercent = (newNextSize / this.containerSize) * 100;
99
+ this.renderer.setStyle(this.prevElement, this.getSizeProperty(), `${prevPercent}%`);
100
+ this.renderer.setStyle(this.nextElement, this.getSizeProperty(), `${nextPercent}%`);
101
+ }
102
+ else {
103
+ this.renderer.setStyle(this.prevElement, this.getSizeProperty(), `${newPrevSize}px`);
104
+ this.renderer.setStyle(this.nextElement, this.getSizeProperty(), `${newNextSize}px`);
105
+ }
106
+ // Emit resizing event
107
+ this.resizing.emit({ prevSize: newPrevSize, nextSize: newNextSize });
108
+ };
109
+ this.onMouseUp = () => {
110
+ this.isResizing = false;
111
+ // Remove event listeners
112
+ document.removeEventListener('mousemove', this.onMouseMove);
113
+ document.removeEventListener('mouseup', this.onMouseUp);
114
+ // Restore text selection
115
+ document.body.style.userSelect = '';
116
+ // Emit resizeEnd event
117
+ if (this.prevElement && this.nextElement) {
118
+ this.resizeEnd.emit({ prevSize: this.prevSize, nextSize: this.nextSize });
119
+ }
120
+ // Remove visual feedback
121
+ this.renderer.removeClass(this.el.nativeElement, 'resizing');
122
+ };
123
+ }
124
+ ngOnInit() {
125
+ // Set cursor style based on direction
126
+ this.renderer.setStyle(this.el.nativeElement, 'cursor', this.direction === 'horizontal' ? 'ew-resize' : 'ns-resize');
127
+ // Add a class to help with styling
128
+ this.renderer.addClass(this.el.nativeElement, 'panel-resizer');
129
+ this.renderer.addClass(this.el.nativeElement, `panel-resizer-${this.direction}`);
130
+ this.renderer.addClass(this.el.nativeElement, `cide-lyt-devider-${this.direction}`);
131
+ if (this.to) {
132
+ this.renderer.addClass(this.el.nativeElement, `cide-lyt-devider-${this.direction}-${this.to}`);
133
+ }
134
+ }
135
+ onMouseDown(event) {
136
+ event.preventDefault();
137
+ // Get the elements to resize
138
+ this.prevElement = this.getPrevElement();
139
+ this.nextElement = this.getNextElement();
140
+ // if (!this.prevElement || !this.nextElement) {
141
+ // console.error('Could not find elements to resize');
142
+ // return;
143
+ // }
144
+ // Get container size
145
+ const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;
146
+ if (parent) {
147
+ console.log(parent.offsetWidth, "parent.offsetWidth");
148
+ this.containerSize = this.direction === 'horizontal'
149
+ ? parent.offsetWidth
150
+ : parent.offsetHeight;
151
+ }
152
+ // Store initial positions and sizes
153
+ this.startPosition = this.direction === 'horizontal' ? event.clientX : event.clientY;
154
+ if (this.prevElement) {
155
+ console.log(this.prevElement.offsetWidth, "this.prevElement.offsetWidth");
156
+ this.startPrevSize = this.direction === 'horizontal'
157
+ ? this.prevElement.offsetWidth
158
+ : this.prevElement.offsetHeight;
159
+ }
160
+ if (this.nextElement) {
161
+ console.log(this.nextElement.offsetWidth, "this.nextElement.offsetWidth");
162
+ this.startNextSize = this.direction === 'horizontal'
163
+ ? this.nextElement.offsetWidth
164
+ : this.nextElement.offsetHeight;
165
+ }
166
+ this.prevSize = this.startPrevSize;
167
+ this.nextSize = this.startNextSize;
168
+ this.isResizing = true;
169
+ // Add event listeners
170
+ document.addEventListener('mousemove', this.onMouseMove);
171
+ document.addEventListener('mouseup', this.onMouseUp);
172
+ // Disable text selection
173
+ document.body.style.userSelect = 'none';
174
+ // Emit resizeStart event
175
+ this.resizeStart.emit();
176
+ // Add visual feedback
177
+ this.renderer.addClass(this.el.nativeElement, 'resizing');
178
+ }
179
+ getPrevElement() {
180
+ if (this.prevElementSelector) {
181
+ const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;
182
+ return parent?.querySelector(this.prevElementSelector) || null;
183
+ }
184
+ return this.el.nativeElement.previousElementSibling;
185
+ }
186
+ getNextElement() {
187
+ if (this.nextElementSelector) {
188
+ const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;
189
+ return parent?.querySelector(this.nextElementSelector) || null;
190
+ }
191
+ return this.el.nativeElement.nextElementSibling;
192
+ }
193
+ getSizeProperty() {
194
+ return this.direction === 'horizontal' ? 'width' : 'height';
195
+ }
196
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleResizerDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
197
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: CideEleResizerDirective, isStandalone: true, selector: "[cideEleResizer]", inputs: { direction: "direction", to: "to", prevElementSelector: "prevElementSelector", nextElementSelector: "nextElementSelector", parentElementSelector: "parentElementSelector", minPrevSize: "minPrevSize", minNextSize: "minNextSize", usePercentage: "usePercentage" }, outputs: { resizeStart: "resizeStart", resizing: "resizing", resizeEnd: "resizeEnd" }, host: { listeners: { "mousedown": "onMouseDown($event)" } }, ngImport: i0 }); }
198
+ }
199
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleResizerDirective, decorators: [{
200
+ type: Directive,
201
+ args: [{
202
+ selector: '[cideEleResizer]',
203
+ standalone: true
204
+ }]
205
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { direction: [{
206
+ type: Input
207
+ }], to: [{
208
+ type: Input
209
+ }], prevElementSelector: [{
210
+ type: Input
211
+ }], nextElementSelector: [{
212
+ type: Input
213
+ }], parentElementSelector: [{
214
+ type: Input
215
+ }], minPrevSize: [{
216
+ type: Input
217
+ }], minNextSize: [{
218
+ type: Input
219
+ }], usePercentage: [{
220
+ type: Input
221
+ }], resizeStart: [{
222
+ type: Output
223
+ }], resizing: [{
224
+ type: Output
225
+ }], resizeEnd: [{
226
+ type: Output
227
+ }], onMouseDown: [{
228
+ type: HostListener,
229
+ args: ['mousedown', ['$event']]
230
+ }] } });
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvbGliL3V0aWxzL2RpcmVjdGl2ZXMvcmVzaXplci9yZXNpemVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQzs7QUFVcEg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBdUJsQyxZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUF0QnRELGNBQVMsR0FBNEIsWUFBWSxDQUFDO1FBQ2xELE9BQUUsR0FBOEIsRUFBRSxDQUFDO1FBQ25DLHdCQUFtQixHQUFHLEVBQUUsQ0FBQyxDQUFFLGdDQUFnQztRQUMzRCx3QkFBbUIsR0FBRyxFQUFFLENBQUMsQ0FBRSw0QkFBNEI7UUFDdkQsMEJBQXFCLEdBQUcsRUFBRSxDQUFDLENBQUUsOEJBQThCO1FBQzNELGdCQUFXLEdBQUcsQ0FBQyxDQUFDLENBQVcsd0NBQXdDO1FBQ25FLGdCQUFXLEdBQUcsQ0FBQyxDQUFDLENBQVcsb0NBQW9DO1FBQy9ELGtCQUFhLEdBQUcsS0FBSyxDQUFDLENBQUssbUNBQW1DO1FBQzdELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN2QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQTBDLENBQUM7UUFDdEUsY0FBUyxHQUFHLElBQUksWUFBWSxFQUEwQyxDQUFDO1FBRXpFLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsZ0JBQVcs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YUFBYSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNqRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxrQkFBaUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sZUFBZTtRQUNyQixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUM5RCxDQUFDOzhHQXpMVSx1QkFBdUI7a0dBQXZCLHVCQUF1Qjs7MkZBQXZCLHVCQUF1QjtrQkE5Q25DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO3VHQTRDVSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFnQ1AsV0FBVztzQkFEVixZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgdHlwZSBDaWRlRWxlUmVzaXplckRpcmVjdGlvbiA9ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XHJcbmV4cG9ydCB0eXBlIENpZGVFbGVSZXNpemVyRGlyZWN0aW9uVG8gPSBcInJpZ2h0LXRvLWxlZnRcIiB8IFwibGVmdC10by1yaWdodFwiIHwgXCJcIjtcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2NpZGVFbGVSZXNpemVyXScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZVxyXG59KVxyXG5cclxuLyoqXHJcbjwhLS0gQmFzaWMgaG9yaXpvbnRhbCAobGVmdC1yaWdodCkgbGF5b3V0IC0tPlxyXG48ZGl2IGNsYXNzPVwicGFuZWwtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGVmdC1wYW5lbFwiPlxyXG4gICAgICAgIExlZnQgUGFuZWwgQ29udGVudFxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjaWRlRWxlUmVzaXplciBkaXJlY3Rpb249XCJob3Jpem9udGFsXCIgW21pblByZXZTaXplXT1cIjEwMFwiIFttaW5OZXh0U2l6ZV09XCIxMDBcIj5yZXNpemVcclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1wYW5lbFwiPlxyXG4gICAgICAgIFJpZ2h0IFBhbmVsIENvbnRlbnRcclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gQmFzaWMgdmVydGljYWwgKHRvcC1ib3R0b20pIGxheW91dCAtLT5cclxuPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRhaW5lci12ZXJ0aWNhbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRvcC1wYW5lbFwiPlxyXG4gICAgICAgIFRvcCBQYW5lbCBDb250ZW50XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNpZGVFbGVSZXNpemVyIGRpcmVjdGlvbj1cInZlcnRpY2FsXCIgW21pblByZXZTaXplXT1cIjUwXCIgW21pbk5leHRTaXplXT1cIjUwXCI+cmVzaXplXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLXBhbmVsXCI+XHJcbiAgICAgICAgQm90dG9tIFBhbmVsIENvbnRlbnRcclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gVXNpbmcgd2l0aCBjdXN0b20gc2VsZWN0b3JzIC0tPlxyXG48ZGl2IGNsYXNzPVwiY29tcGxleC1sYXlvdXRcIj5cclxuICAgIDxkaXYgaWQ9XCJwYW5lbDFcIj5QYW5lbCAxPC9kaXY+XHJcbiAgICA8ZGl2IGlkPVwicGFuZWwyXCI+UGFuZWwgMjwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2lkZUVsZVJlc2l6ZXIgZGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiIHByZXZFbGVtZW50U2VsZWN0b3I9XCIjcGFuZWwxXCIgbmV4dEVsZW1lbnRTZWxlY3Rvcj1cIiNwYW5lbDJcIlxyXG4gICAgICAgIFt1c2VQZXJjZW50YWdlXT1cInRydWVcIj5yZXNpemVcclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgaWQ9XCJwYW5lbDNcIj5QYW5lbCAzPC9kaXY+XHJcbjwvZGl2PlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENpZGVFbGVSZXNpemVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBkaXJlY3Rpb246IENpZGVFbGVSZXNpemVyRGlyZWN0aW9uID0gJ2hvcml6b250YWwnO1xyXG4gIEBJbnB1dCgpIHRvOiBDaWRlRWxlUmVzaXplckRpcmVjdGlvblRvID0gXCJcIjtcclxuICBASW5wdXQoKSBwcmV2RWxlbWVudFNlbGVjdG9yID0gJyc7ICAvLyBTZWxlY3RvciBmb3IgcHJldmlvdXMgZWxlbWVudFxyXG4gIEBJbnB1dCgpIG5leHRFbGVtZW50U2VsZWN0b3IgPSAnJzsgIC8vIFNlbGVjdG9yIGZvciBuZXh0IGVsZW1lbnRcclxuICBASW5wdXQoKSBwYXJlbnRFbGVtZW50U2VsZWN0b3IgPSAnJzsgIC8vIFNlbGVjdG9yIGZvciBwYXJlbnQgZWxlbWVudFxyXG4gIEBJbnB1dCgpIG1pblByZXZTaXplID0gMDsgICAgICAgICAgIC8vIE1pbmltdW0gc2l6ZSBvZiBwcmV2aW91cyBlbGVtZW50IChweClcclxuICBASW5wdXQoKSBtaW5OZXh0U2l6ZSA9IDA7ICAgICAgICAgICAvLyBNaW5pbXVtIHNpemUgb2YgbmV4dCBlbGVtZW50IChweClcclxuICBASW5wdXQoKSB1c2VQZXJjZW50YWdlID0gZmFsc2U7ICAgICAvLyBVc2UgcGVyY2VudGFnZSBpbnN0ZWFkIG9mIHBpeGVsc1xyXG4gIEBPdXRwdXQoKSByZXNpemVTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgcmVzaXppbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcHJldlNpemU6IG51bWJlciwgbmV4dFNpemU6IG51bWJlciB9PigpO1xyXG4gIEBPdXRwdXQoKSByZXNpemVFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcHJldlNpemU6IG51bWJlciwgbmV4dFNpemU6IG51bWJlciB9PigpO1xyXG5cclxuICBwcml2YXRlIGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHN0YXJ0UG9zaXRpb24gPSAwO1xyXG4gIHByaXZhdGUgcHJldkVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBuZXh0RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHByZXZTaXplID0gMDtcclxuICBwcml2YXRlIG5leHRTaXplID0gMDtcclxuICBwcml2YXRlIGNvbnRhaW5lclNpemUgPSAwO1xyXG4gIHByaXZhdGUgc3RhcnRQcmV2U2l6ZSA9IDA7XHJcbiAgcHJpdmF0ZSBzdGFydE5leHRTaXplID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBTZXQgY3Vyc29yIHN0eWxlIGJhc2VkIG9uIGRpcmVjdGlvblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAnY3Vyc29yJyxcclxuICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/ICdldy1yZXNpemUnIDogJ25zLXJlc2l6ZSdcclxuICAgICk7XHJcblxyXG4gICAgLy8gQWRkIGEgY2xhc3MgdG8gaGVscCB3aXRoIHN0eWxpbmdcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAncGFuZWwtcmVzaXplcicpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIGBwYW5lbC1yZXNpemVyLSR7dGhpcy5kaXJlY3Rpb259YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgYGNpZGUtbHl0LWRldmlkZXItJHt0aGlzLmRpcmVjdGlvbn1gKTtcclxuICAgIGlmICh0aGlzLnRvKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCBgY2lkZS1seXQtZGV2aWRlci0ke3RoaXMuZGlyZWN0aW9ufS0ke3RoaXMudG99YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgIC8vIEdldCB0aGUgZWxlbWVudHMgdG8gcmVzaXplXHJcbiAgICB0aGlzLnByZXZFbGVtZW50ID0gdGhpcy5nZXRQcmV2RWxlbWVudCgpO1xyXG4gICAgdGhpcy5uZXh0RWxlbWVudCA9IHRoaXMuZ2V0TmV4dEVsZW1lbnQoKTtcclxuXHJcbiAgICAvLyBpZiAoIXRoaXMucHJldkVsZW1lbnQgfHwgIXRoaXMubmV4dEVsZW1lbnQpIHtcclxuICAgIC8vICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGZpbmQgZWxlbWVudHMgdG8gcmVzaXplJyk7XHJcbiAgICAvLyAgIHJldHVybjtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBHZXQgY29udGFpbmVyIHNpemVcclxuXHJcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudEVsZW1lbnRTZWxlY3RvciA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5wYXJlbnRFbGVtZW50U2VsZWN0b3IpIDogdGhpcy5lbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHBhcmVudC5vZmZzZXRXaWR0aCwgXCJwYXJlbnQub2Zmc2V0V2lkdGhcIilcclxuICAgICAgdGhpcy5jb250YWluZXJTaXplID0gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xyXG4gICAgICAgID8gcGFyZW50Lm9mZnNldFdpZHRoXHJcbiAgICAgICAgOiBwYXJlbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgLy8gU3RvcmUgaW5pdGlhbCBwb3NpdGlvbnMgYW5kIHNpemVzXHJcbiAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XHJcbiAgICBpZiAodGhpcy5wcmV2RWxlbWVudCkge1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLnByZXZFbGVtZW50Lm9mZnNldFdpZHRoLCBcInRoaXMucHJldkVsZW1lbnQub2Zmc2V0V2lkdGhcIilcclxuICAgICAgdGhpcy5zdGFydFByZXZTaXplID0gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xyXG4gICAgICAgID8gdGhpcy5wcmV2RWxlbWVudC5vZmZzZXRXaWR0aFxyXG4gICAgICAgIDogdGhpcy5wcmV2RWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5uZXh0RWxlbWVudCkge1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLm5leHRFbGVtZW50Lm9mZnNldFdpZHRoLCBcInRoaXMubmV4dEVsZW1lbnQub2Zmc2V0V2lkdGhcIilcclxuICAgICAgdGhpcy5zdGFydE5leHRTaXplID0gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xyXG4gICAgICAgID8gdGhpcy5uZXh0RWxlbWVudC5vZmZzZXRXaWR0aFxyXG4gICAgICAgIDogdGhpcy5uZXh0RWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcmV2U2l6ZSA9IHRoaXMuc3RhcnRQcmV2U2l6ZTtcclxuICAgIHRoaXMubmV4dFNpemUgPSB0aGlzLnN0YXJ0TmV4dFNpemU7XHJcblxyXG4gICAgdGhpcy5pc1Jlc2l6aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XHJcblxyXG4gICAgLy8gRGlzYWJsZSB0ZXh0IHNlbGVjdGlvblxyXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnO1xyXG5cclxuICAgIC8vIEVtaXQgcmVzaXplU3RhcnQgZXZlbnRcclxuICAgIHRoaXMucmVzaXplU3RhcnQuZW1pdCgpO1xyXG5cclxuICAgIC8vIEFkZCB2aXN1YWwgZmVlZGJhY2tcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAncmVzaXppbmcnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGlmICghdGhpcy5pc1Jlc2l6aW5nKSByZXR1cm47XHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIG1vdmVtZW50XHJcbiAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPSB0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XHJcbiAgICBjb25zdCBkZWx0YSA9IGN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbjtcclxuXHJcbiAgICAvLyBDYWxjdWxhdGUgbmV3IHNpemVzXHJcbiAgICBsZXQgbmV3UHJldlNpemUgPSB0aGlzLnN0YXJ0UHJldlNpemUgKyBkZWx0YTtcclxuICAgIGxldCBuZXdOZXh0U2l6ZSA9IHRoaXMuc3RhcnROZXh0U2l6ZSAtIGRlbHRhO1xyXG5cclxuICAgIC8vIEFwcGx5IGNvbnN0cmFpbnRzXHJcbiAgICBpZiAobmV3UHJldlNpemUgPCB0aGlzLm1pblByZXZTaXplKSB7XHJcbiAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLm1pblByZXZTaXplIC0gbmV3UHJldlNpemU7XHJcbiAgICAgIG5ld1ByZXZTaXplID0gdGhpcy5taW5QcmV2U2l6ZTtcclxuICAgICAgbmV3TmV4dFNpemUgPSB0aGlzLnN0YXJ0TmV4dFNpemUgLSBkZWx0YSArIGRpZmY7XHJcbiAgICAgIC8vIHNraXAgaWYgcHJldmlzdXMgc2l6ZSBpcyBlcXVhbCB0byB0aGUgbWluaW11bSBzaXplLCBub3RlIGFib3ZlIGNvZGUgaXMgZGFyayBjb2RlIHdoaWNoIHdpbGwgbm90IGJlIGV4ZWN1dGVkXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobmV3TmV4dFNpemUgPCB0aGlzLm1pbk5leHRTaXplKSB7XHJcbiAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLm1pbk5leHRTaXplIC0gbmV3TmV4dFNpemU7XHJcbiAgICAgIG5ld05leHRTaXplID0gdGhpcy5taW5OZXh0U2l6ZTtcclxuICAgICAgbmV3UHJldlNpemUgPSB0aGlzLnN0YXJ0UHJldlNpemUgKyBkZWx0YSAtIGRpZmY7XHJcbiAgICAgIC8vIHNraXAgaWYgbmV4dCBzaXplIGlzIGVxdWFsIHRvIHRoZSBtaW5pbXVtIHNpemUsIG5vdGUgYWJvdmUgY29kZSBpcyBkYXJrIGNvZGUgd2hpY2ggd2lsbCBub3QgYmUgZXhlY3V0ZWRcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBzaXplc1xyXG4gICAgdGhpcy5wcmV2U2l6ZSA9IG5ld1ByZXZTaXplO1xyXG4gICAgdGhpcy5uZXh0U2l6ZSA9IG5ld05leHRTaXplO1xyXG5cclxuICAgIC8vIEFwcGx5IG5ldyBzaXplc1xyXG4gICAgaWYgKHRoaXMudXNlUGVyY2VudGFnZSkge1xyXG4gICAgICBjb25zdCBwcmV2UGVyY2VudCA9IChuZXdQcmV2U2l6ZSAvIHRoaXMuY29udGFpbmVyU2l6ZSkgKiAxMDA7XHJcbiAgICAgIGNvbnN0IG5leHRQZXJjZW50ID0gKG5ld05leHRTaXplIC8gdGhpcy5jb250YWluZXJTaXplKSAqIDEwMDtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2RWxlbWVudCwgdGhpcy5nZXRTaXplUHJvcGVydHkoKSwgYCR7cHJldlBlcmNlbnR9JWApO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubmV4dEVsZW1lbnQsIHRoaXMuZ2V0U2l6ZVByb3BlcnR5KCksIGAke25leHRQZXJjZW50fSVgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2RWxlbWVudCwgdGhpcy5nZXRTaXplUHJvcGVydHkoKSwgYCR7bmV3UHJldlNpemV9cHhgKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLm5leHRFbGVtZW50LCB0aGlzLmdldFNpemVQcm9wZXJ0eSgpLCBgJHtuZXdOZXh0U2l6ZX1weGApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEVtaXQgcmVzaXppbmcgZXZlbnRcclxuICAgIHRoaXMucmVzaXppbmcuZW1pdCh7IHByZXZTaXplOiBuZXdQcmV2U2l6ZSwgbmV4dFNpemU6IG5ld05leHRTaXplIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vdXNlVXAgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzUmVzaXppbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XHJcblxyXG4gICAgLy8gUmVzdG9yZSB0ZXh0IHNlbGVjdGlvblxyXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJyc7XHJcblxyXG4gICAgLy8gRW1pdCByZXNpemVFbmQgZXZlbnRcclxuICAgIGlmICh0aGlzLnByZXZFbGVtZW50ICYmIHRoaXMubmV4dEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5yZXNpemVFbmQuZW1pdCh7IHByZXZTaXplOiB0aGlzLnByZXZTaXplLCBuZXh0U2l6ZTogdGhpcy5uZXh0U2l6ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgdmlzdWFsIGZlZWRiYWNrXHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3Jlc2l6aW5nJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByZXZFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5wcmV2RWxlbWVudFNlbGVjdG9yKSB7XHJcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudFNlbGVjdG9yID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnBhcmVudEVsZW1lbnRTZWxlY3RvcikgOiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgcmV0dXJuIHBhcmVudD8ucXVlcnlTZWxlY3Rvcih0aGlzLnByZXZFbGVtZW50U2VsZWN0b3IpIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5leHRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5uZXh0RWxlbWVudFNlbGVjdG9yKSB7XHJcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudFNlbGVjdG9yID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnBhcmVudEVsZW1lbnRTZWxlY3RvcikgOiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgcmV0dXJuIHBhcmVudD8ucXVlcnlTZWxlY3Rvcih0aGlzLm5leHRFbGVtZW50U2VsZWN0b3IpIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2l6ZVByb3BlcnR5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcclxuICB9XHJcbn0iXX0=