cloud-ide-core 0.0.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 (53) hide show
  1. package/README.md +24 -0
  2. package/esm2022/cloud-ide-core.mjs +5 -0
  3. package/esm2022/lib/cloud-ide-core.component.mjs +19 -0
  4. package/esm2022/lib/cloud-ide-core.service.mjs +14 -0
  5. package/esm2022/lib/core/department-management/components/department-list/department-list.component.mjs +768 -0
  6. package/esm2022/lib/core/department-management/index.mjs +5 -0
  7. package/esm2022/lib/core/department-management/services/department-management.service.mjs +187 -0
  8. package/esm2022/lib/core/designation-management/components/designation-list/designation-list.component.mjs +1122 -0
  9. package/esm2022/lib/core/designation-management/index.mjs +5 -0
  10. package/esm2022/lib/core/designation-management/services/designation-management.service.mjs +194 -0
  11. package/esm2022/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.mjs +794 -0
  12. package/esm2022/lib/core/grade-level-management/index.mjs +5 -0
  13. package/esm2022/lib/core/grade-level-management/services/grade-level-management.service.mjs +172 -0
  14. package/esm2022/lib/core/menu-management/components/menu-list/menu-list.component.mjs +1135 -0
  15. package/esm2022/lib/core/menu-management/index.mjs +10 -0
  16. package/esm2022/lib/core/menu-management/interfaces/menu-item.interface.mjs +11 -0
  17. package/esm2022/lib/core/menu-management/mock-data/menu-items.json +311 -0
  18. package/esm2022/lib/core/menu-management/services/menu-management.service.mjs +230 -0
  19. package/esm2022/lib/core/page-management/components/page-controls/page-controls.component.mjs +483 -0
  20. package/esm2022/lib/core/page-management/components/page-list/page-list.component.mjs +393 -0
  21. package/esm2022/lib/core/page-management/components/page-theme/page-theme.component.mjs +767 -0
  22. package/esm2022/lib/core/page-management/index.mjs +10 -0
  23. package/esm2022/lib/core/page-management/services/page-controls.service.mjs +136 -0
  24. package/esm2022/lib/core/page-management/services/page-management.service.mjs +98 -0
  25. package/esm2022/lib/core/page-management/services/page-theme.service.mjs +107 -0
  26. package/esm2022/public-api.mjs +16 -0
  27. package/fesm2022/cloud-ide-core.mjs +6859 -0
  28. package/fesm2022/cloud-ide-core.mjs.map +1 -0
  29. package/index.d.ts +5 -0
  30. package/lib/cloud-ide-core.component.d.ts +5 -0
  31. package/lib/cloud-ide-core.service.d.ts +6 -0
  32. package/lib/core/department-management/components/department-list/department-list.component.d.ts +178 -0
  33. package/lib/core/department-management/index.d.ts +2 -0
  34. package/lib/core/department-management/services/department-management.service.d.ts +68 -0
  35. package/lib/core/designation-management/components/designation-list/designation-list.component.d.ts +242 -0
  36. package/lib/core/designation-management/index.d.ts +2 -0
  37. package/lib/core/designation-management/services/designation-management.service.d.ts +69 -0
  38. package/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.d.ts +199 -0
  39. package/lib/core/grade-level-management/index.d.ts +2 -0
  40. package/lib/core/grade-level-management/services/grade-level-management.service.d.ts +69 -0
  41. package/lib/core/menu-management/components/menu-list/menu-list.component.d.ts +278 -0
  42. package/lib/core/menu-management/index.d.ts +3 -0
  43. package/lib/core/menu-management/interfaces/menu-item.interface.d.ts +30 -0
  44. package/lib/core/menu-management/services/menu-management.service.d.ts +85 -0
  45. package/lib/core/page-management/components/page-controls/page-controls.component.d.ts +126 -0
  46. package/lib/core/page-management/components/page-list/page-list.component.d.ts +91 -0
  47. package/lib/core/page-management/components/page-theme/page-theme.component.d.ts +189 -0
  48. package/lib/core/page-management/index.d.ts +6 -0
  49. package/lib/core/page-management/services/page-controls.service.d.ts +54 -0
  50. package/lib/core/page-management/services/page-management.service.d.ts +42 -0
  51. package/lib/core/page-management/services/page-theme.service.d.ts +43 -0
  52. package/package.json +25 -0
  53. package/public-api.d.ts +7 -0
@@ -0,0 +1,5 @@
1
+ // Department Management Components
2
+ export * from './components/department-list/department-list.component';
3
+ // Department Management Services
4
+ export * from './services/department-management.service';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtY29yZS9zcmMvbGliL2NvcmUvZGVwYXJ0bWVudC1tYW5hZ2VtZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1DQUFtQztBQUNuQyxjQUFjLHdEQUF3RCxDQUFDO0FBRXZFLGlDQUFpQztBQUNqQyxjQUFjLDBDQUEwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRGVwYXJ0bWVudCBNYW5hZ2VtZW50IENvbXBvbmVudHNcclxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL2RlcGFydG1lbnQtbGlzdC9kZXBhcnRtZW50LWxpc3QuY29tcG9uZW50JztcclxuXHJcbi8vIERlcGFydG1lbnQgTWFuYWdlbWVudCBTZXJ2aWNlc1xyXG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2RlcGFydG1lbnQtbWFuYWdlbWVudC5zZXJ2aWNlJzsgIl19
@@ -0,0 +1,187 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { throwError, BehaviorSubject } from 'rxjs';
3
+ import { catchError, tap } from 'rxjs/operators';
4
+ import { cidePath, coreRoutesUrl, generateStringFromObject, hostManagerRoutesUrl } from 'cloud-ide-lms-model';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ export class DepartmentManagementService {
8
+ constructor(http) {
9
+ this.http = http;
10
+ this.departmentListSubject = new BehaviorSubject([]);
11
+ this.departmentList$ = this.departmentListSubject.asObservable();
12
+ console.log('DepartmentManagementService initialized - using real API');
13
+ }
14
+ /**
15
+ * Get department list from API
16
+ */
17
+ getDepartmentList(body) {
18
+ const query = generateStringFromObject(body);
19
+ return this.http?.get(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department, query]))
20
+ .pipe(tap((response) => {
21
+ if (response?.success) {
22
+ this.departmentListSubject.next(response?.data || []);
23
+ }
24
+ }), catchError(error => {
25
+ console.error('DepartmentManagementService API error:', error);
26
+ return this.handleError(error);
27
+ }));
28
+ }
29
+ /**
30
+ * Get department list from cache (if available)
31
+ */
32
+ getDepartmentListFromCache() {
33
+ return this.departmentListSubject.value;
34
+ }
35
+ /**
36
+ * Create new department
37
+ * POST ${coreRoutesUrl?.department} - payload: MDepartmentInsertUpdatePayload, response: departmentInsertUpdateControllerResponse
38
+ */
39
+ createDepartment(department) {
40
+ console.log('Creating department:', department);
41
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department]);
42
+ return this.http.post(url, department)
43
+ .pipe(tap((response) => {
44
+ if (response.success) {
45
+ this.refreshDepartmentList();
46
+ }
47
+ }), catchError(this.handleError));
48
+ }
49
+ /**
50
+ * Update existing department
51
+ * POST ${coreRoutesUrl?.department} - payload: MDepartmentInsertUpdatePayload, response: departmentInsertUpdateControllerResponse
52
+ */
53
+ updateDepartment(id, department) {
54
+ console.log('Updating department:', id, department);
55
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department]);
56
+ return this.http.post(url, department)
57
+ .pipe(tap((response) => {
58
+ if (response.success) {
59
+ this.refreshDepartmentList();
60
+ }
61
+ }), catchError(this.handleError));
62
+ }
63
+ /**
64
+ * Get department by ID
65
+ * GET ${coreRoutesUrl?.department}/byId/:query - payload: MDepartmentGetByIdPayload, response: departmentByIdControllerResponse
66
+ */
67
+ getDepartmentById(id) {
68
+ console.log('Getting department by ID:', id);
69
+ const payload = { sydept_id: id };
70
+ const query = generateStringFromObject(payload);
71
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department, 'byId', query]);
72
+ return this.http.get(url)
73
+ .pipe(catchError(this.handleError));
74
+ }
75
+ /**
76
+ * Delete department
77
+ * DELETE ${coreRoutesUrl?.department}/:query - payload: MDepartmentDeletePayload, response: departmentDeleteControllerResponse
78
+ */
79
+ deleteDepartment(id) {
80
+ const payload = { sydept_id: id };
81
+ const query = generateStringFromObject(payload);
82
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department, query]);
83
+ return this.http.delete(url)
84
+ .pipe(tap((response) => {
85
+ if (response.success) {
86
+ this.refreshDepartmentList();
87
+ }
88
+ }), catchError(this.handleError));
89
+ }
90
+ /**
91
+ * Delete multiple departments
92
+ */
93
+ deleteMultipleDepartments(ids) {
94
+ console.log('Deleting multiple departments:', ids);
95
+ const payload = { ids };
96
+ const query = generateStringFromObject(payload);
97
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department, query]);
98
+ return this.http.delete(url)
99
+ .pipe(tap((response) => {
100
+ if (response.success) {
101
+ this.refreshDepartmentList();
102
+ }
103
+ }), catchError(this.handleError));
104
+ }
105
+ /**
106
+ * Toggle department active status
107
+ */
108
+ toggleDepartmentStatus(payload) {
109
+ const query = generateStringFromObject(payload);
110
+ const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.department, 'toggleStatus', query]);
111
+ return this.http.put(url, {})
112
+ .pipe(tap((response) => {
113
+ if (response.success) {
114
+ this.refreshDepartmentList();
115
+ }
116
+ }), catchError(this.handleError));
117
+ }
118
+ /**
119
+ * Find department by ID
120
+ */
121
+ findDepartmentById(id, items = this.departmentListSubject.value) {
122
+ for (const item of items) {
123
+ if (item._id === id) {
124
+ return item;
125
+ }
126
+ }
127
+ return null;
128
+ }
129
+ /**
130
+ * Get parent departments for dropdown selection
131
+ */
132
+ getParentDepartments(excludeId) {
133
+ const allItems = [];
134
+ const flattenItems = (items, level = 0) => {
135
+ items.forEach(item => {
136
+ if (item._id !== excludeId) {
137
+ allItems.push({
138
+ ...item,
139
+ sydept_name: ' '.repeat(level) + item.sydept_name
140
+ });
141
+ }
142
+ });
143
+ };
144
+ flattenItems(this.departmentListSubject.value);
145
+ return allItems;
146
+ }
147
+ /**
148
+ * Refresh department list from server
149
+ */
150
+ refreshDepartmentList() {
151
+ const defaultBody = {
152
+ pageIndex: 1,
153
+ pageSize: 10
154
+ };
155
+ this.getDepartmentList(defaultBody).subscribe({
156
+ next: () => {
157
+ console.log('Department list refreshed successfully');
158
+ },
159
+ error: (error) => {
160
+ console.error('Error refreshing department list:', error);
161
+ }
162
+ });
163
+ }
164
+ /**
165
+ * Handle errors
166
+ */
167
+ handleError(error) {
168
+ let errorMessage = 'An error occurred';
169
+ if (error instanceof Error) {
170
+ errorMessage = error.message;
171
+ }
172
+ else if (typeof error === 'string') {
173
+ errorMessage = error;
174
+ }
175
+ console.error('Department Management Service Error:', errorMessage);
176
+ return throwError(() => new Error(errorMessage));
177
+ }
178
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DepartmentManagementService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
179
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DepartmentManagementService, providedIn: 'root' }); }
180
+ }
181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DepartmentManagementService, decorators: [{
182
+ type: Injectable,
183
+ args: [{
184
+ providedIn: 'root'
185
+ }]
186
+ }], ctorParameters: () => [{ type: i1.HttpClient }] });
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwYXJ0bWVudC1tYW5hZ2VtZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtY29yZS9zcmMvbGliL2NvcmUvZGVwYXJ0bWVudC1tYW5hZ2VtZW50L3NlcnZpY2VzL2RlcGFydG1lbnQtbWFuYWdlbWVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLGFBQWEsRUFDYix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBVXJCLE1BQU0scUJBQXFCLENBQUM7OztBQUs3QixNQUFNLE9BQU8sMkJBQTJCO0lBSXRDLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFINUIsMEJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLG9CQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBR2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxpQkFBaUIsQ0FBQyxJQUFpQjtRQUNqQyxNQUFNLEtBQUssR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUErQixRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMs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SUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDL0IsQ0FBQzthQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDckMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO1FBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNwRSxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7OEdBN01VLDJCQUEyQjtrSEFBM0IsMkJBQTJCLGNBRjFCLE1BQU07OzJGQUVQLDJCQUEyQjtrQkFIdkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFxyXG4gIGNpZGVQYXRoLCBcclxuICBjb3JlUm91dGVzVXJsLCBcclxuICBnZW5lcmF0ZVN0cmluZ0Zyb21PYmplY3QsIFxyXG4gIGhvc3RNYW5hZ2VyUm91dGVzVXJsLCBcclxuICBJQ29yZVN5ZGVwdCwgXHJcbiAgTURlcGFydG1lbnREZWxldGVQYXlsb2FkLCBcclxuICBNRGVwYXJ0bWVudEdldEJ5SWRQYXlsb2FkLCBcclxuICBkZXBhcnRtZW50QnlJZENvbnRyb2xsZXJSZXNwb25zZSwgXHJcbiAgZGVwYXJ0bWVudERlbGV0ZUNvbnRyb2xsZXJSZXNwb25zZSwgXHJcbiAgZGVwYXJ0bWVudENvbnRyb2xsZXJSZXNwb25zZSxcclxuICBNRGVwYXJ0bWVudCxcclxuICBNRGVwYXJ0bWVudFRvZ2dsZVN0YXR1c1BheWxvYWQsXHJcbiAgZGVwYXJ0bWVudFRvZ2dsZVN0YXR1c0NvbnRyb2xsZXJSZXNwb25zZVxyXG59IGZyb20gJ2Nsb3VkLWlkZS1sbXMtbW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRGVwYXJ0bWVudE1hbmFnZW1lbnRTZXJ2aWNlIHtcclxuICBwcml2YXRlIGRlcGFydG1lbnRMaXN0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SUNvcmVTeWRlcHRbXT4oW10pO1xyXG4gIHB1YmxpYyBkZXBhcnRtZW50TGlzdCQgPSB0aGlzLmRlcGFydG1lbnRMaXN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XHJcbiAgICBjb25zb2xlLmxvZygnRGVwYXJ0bWVudE1hbmFnZW1lbnRTZXJ2aWNlIGluaXRpYWxpemVkIC0gdXNpbmcgcmVhbCBBUEknKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkZXBhcnRtZW50IGxpc3QgZnJvbSBBUElcclxuICAgKi9cclxuICBnZXREZXBhcnRtZW50TGlzdChib2R5OiBNRGVwYXJ0bWVudCk6IE9ic2VydmFibGU8ZGVwYXJ0bWVudENvbnRyb2xsZXJSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgcXVlcnkgPSBnZW5lcmF0ZVN0cmluZ0Zyb21PYmplY3QoYm9keSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwPy5nZXQ8ZGVwYXJ0bWVudENvbnRyb2xsZXJSZXNwb25zZT4oY2lkZVBhdGg/LmpvaW4oW2hvc3RNYW5hZ2VyUm91dGVzVXJsPy5jaWRlU3VpdGVIb3N0LCBjb3JlUm91dGVzVXJsPy5tb2R1bGUsIGNvcmVSb3V0ZXNVcmw/LmRlcGFydG1lbnQsIHF1ZXJ5XSkpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgocmVzcG9uc2U6IGRlcGFydG1lbnRDb250cm9sbGVyUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZT8uc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLmRlcGFydG1lbnRMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlPy5kYXRhIHx8IFtdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlcGFydG1lbnRNYW5hZ2VtZW50U2VydmljZSBBUEkgZXJyb3I6JywgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgZGVwYXJ0bWVudCBsaXN0IGZyb20gY2FjaGUgKGlmIGF2YWlsYWJsZSlcclxuICAgKi9cclxuICBnZXREZXBhcnRtZW50TGlzdEZyb21DYWNoZSgpOiBJQ29yZVN5ZGVwdFtdIHtcclxuICAgIHJldHVybiB0aGlzLmRlcGFydG1lbnRMaXN0U3ViamVjdC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBuZXcgZGVwYXJ0bWVudFxyXG4gICAqIFBPU1QgJHtjb3JlUm91dGVzVXJsPy5kZXBhcnRtZW50fSAtIHBheWxvYWQ6IE1EZXBhcnRtZW50SW5zZXJ0VXBkYXRlUGF5bG9hZCwgcmVzcG9uc2U6IGRlcGFydG1lbnRJbnNlcnRVcGRhdGVDb250cm9sbGVyUmVzcG9uc2VcclxuICAgKi9cclxuICBjcmVhdGVEZXBhcnRtZW50KGRlcGFydG1lbnQ6IElDb3JlU3lkZXB0KTogT2JzZXJ2YWJsZTxkZXBhcnRtZW50Q29udHJvbGxlclJlc3BvbnNlPiB7XHJcbiAgICBjb25zb2xlLmxvZygnQ3JlYXRpbmcgZGVwYXJ0bWVudDonLCBkZXBhcnRtZW50KTtcclxuICAgIGNvbnN0IHVybCA9IGNpZGVQYXRoPy5qb2luKFtob3N0TWFuYWdlclJvdXRlc1VybD8uY2lkZVN1aXRlSG9zdCwgY29yZVJvdXRlc1VybD8ubW9kdWxlLCBjb3JlUm91dGVzVXJsPy5kZXBhcnRtZW50XSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8ZGVwYXJ0bWVudENvbnRyb2xsZXJSZXNwb25zZT4odXJsLCBkZXBhcnRtZW50KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHJlc3BvbnNlOiBkZXBhcnRtZW50Q29udHJvbGxlclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEZXBhcnRtZW50TGlzdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBleGlzdGluZyBkZXBhcnRtZW50XHJcbiAgICogUE9TVCAke2NvcmVSb3V0ZXNVcmw/LmRlcGFydG1lbnR9IC0gcGF5bG9hZDogTURlcGFydG1lbnRJbnNlcnRVcGRhdGVQYXlsb2FkLCByZXNwb25zZTogZGVwYXJ0bWVudEluc2VydFVwZGF0ZUNvbnRyb2xsZXJSZXNwb25zZVxyXG4gICAqL1xyXG4gIHVwZGF0ZURlcGFydG1lbnQoaWQ6IHN0cmluZywgZGVwYXJ0bWVudDogSUNvcmVTeWRlcHQpOiBPYnNlcnZhYmxlPGRlcGFydG1lbnRDb250cm9sbGVyUmVzcG9uc2U+IHtcclxuICAgIGNvbnNvbGUubG9nKCdVcGRhdGluZyBkZXBhcnRtZW50OicsIGlkLCBkZXBhcnRtZW50KTtcclxuICAgIGNvbnN0IHVybCA9IGNpZGVQYXRoPy5qb2luKFtob3N0TWFuYWdlclJvdXRlc1VybD8uY2lkZVN1aXRlSG9zdCwgY29yZVJvdXRlc1VybD8ubW9kdWxlLCBjb3JlUm91dGVzVXJsPy5kZXBhcnRtZW50XSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8ZGVwYXJ0bWVudENvbnRyb2xsZXJSZXNwb25zZT4odXJsLCBkZXBhcnRtZW50KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHJlc3BvbnNlOiBkZXBhcnRtZW50Q29udHJvbGxlclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEZXBhcnRtZW50TGlzdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkZXBhcnRtZW50IGJ5IElEXHJcbiAgICogR0VUICR7Y29yZVJvdXRlc1VybD8uZGVwYXJ0bWVudH0vYnlJZC86cXVlcnkgLSBwYXlsb2FkOiBNRGVwYXJ0bWVudEdldEJ5SWRQYXlsb2FkLCByZXNwb25zZTogZGVwYXJ0bWVudEJ5SWRDb250cm9sbGVyUmVzcG9uc2VcclxuICAgKi9cclxuICBnZXREZXBhcnRtZW50QnlJZChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxkZXBhcnRtZW50QnlJZENvbnRyb2xsZXJSZXNwb25zZT4ge1xyXG4gICAgY29uc29sZS5sb2coJ0dldHRpbmcgZGVwYXJ0bWVudCBieSBJRDonLCBpZCk7XHJcbiAgICBjb25zdCBwYXlsb2FkOiBNRGVwYXJ0bWVudEdldEJ5SWRQYXlsb2FkID0geyBzeWRlcHRfaWQ6IGlkIH07XHJcbiAgICBjb25zdCBxdWVyeSA9IGdlbmVyYXRlU3RyaW5nRnJvbU9iamVjdChwYXlsb2FkKTtcclxuICAgIGNvbnN0IHVybCA9IGNpZGVQYXRoPy5qb2luKFtob3N0TWFuYWdlclJvdXRlc1VybD8uY2lkZVN1aXRlSG9zdCwgY29yZVJvdXRlc1VybD8ubW9kdWxlLCBjb3JlUm91dGVzVXJsPy5kZXBhcnRtZW50LCAnYnlJZCcsIHF1ZXJ5XSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxkZXBhcnRtZW50QnlJZENvbnRyb2xsZXJSZXNwb25zZT4odXJsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgZGVwYXJ0bWVudFxyXG4gICAqIERFTEVURSAke2NvcmVSb3V0ZXNVcmw/LmRlcGFydG1lbnR9LzpxdWVyeSAtIHBheWxvYWQ6IE1EZXBhcnRtZW50RGVsZXRlUGF5bG9hZCwgcmVzcG9uc2U6IGRlcGFydG1lbnREZWxldGVDb250cm9sbGVyUmVzcG9uc2VcclxuICAgKi9cclxuICBkZWxldGVEZXBhcnRtZW50KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGRlcGFydG1lbnREZWxldGVDb250cm9sbGVyUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IHBheWxvYWQ6IE1EZXBhcnRtZW50RGVsZXRlUGF5bG9hZCA9IHsgc3lkZXB0X2lkOiBpZCB9O1xyXG4gICAgY29uc3QgcXVlcnkgPSBnZW5lcmF0ZVN0cmluZ0Zyb21PYmplY3QocGF5bG9hZCk7XHJcbiAgICBjb25zdCB1cmwgPSBjaWRlUGF0aD8uam9pbihbaG9zdE1hbmFnZXJSb3V0ZXNVcmw/LmNpZGVTdWl0ZUhvc3QsIGNvcmVSb3V0ZXNVcmw/Lm1vZHVsZSwgY29yZVJvdXRlc1VybD8uZGVwYXJ0bWVudCwgcXVlcnldKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPGRlcGFydG1lbnREZWxldGVDb250cm9sbGVyUmVzcG9uc2U+KHVybClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKChyZXNwb25zZTogZGVwYXJ0bWVudERlbGV0ZUNvbnRyb2xsZXJSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGVwYXJ0bWVudExpc3QoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgbXVsdGlwbGUgZGVwYXJ0bWVudHNcclxuICAgKi9cclxuICBkZWxldGVNdWx0aXBsZURlcGFydG1lbnRzKGlkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZT86IHN0cmluZzsgZGF0YT86IHVua25vd24gfT4ge1xyXG4gICAgY29uc29sZS5sb2coJ0RlbGV0aW5nIG11bHRpcGxlIGRlcGFydG1lbnRzOicsIGlkcyk7XHJcbiAgICBjb25zdCBwYXlsb2FkID0geyBpZHMgfTtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gZ2VuZXJhdGVTdHJpbmdGcm9tT2JqZWN0KHBheWxvYWQpO1xyXG4gICAgY29uc3QgdXJsID0gY2lkZVBhdGg/LmpvaW4oW2hvc3RNYW5hZ2VyUm91dGVzVXJsPy5jaWRlU3VpdGVIb3N0LCBjb3JlUm91dGVzVXJsPy5tb2R1bGUsIGNvcmVSb3V0ZXNVcmw/LmRlcGFydG1lbnQsIHF1ZXJ5XSk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U/OiBzdHJpbmc7IGRhdGE/OiB1bmtub3duIH0+KHVybClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKChyZXNwb25zZTogeyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlPzogc3RyaW5nOyBkYXRhPzogdW5rbm93biB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hEZXBhcnRtZW50TGlzdCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBkZXBhcnRtZW50IGFjdGl2ZSBzdGF0dXNcclxuICAgKi9cclxuICB0b2dnbGVEZXBhcnRtZW50U3RhdHVzKHBheWxvYWQ6IE1EZXBhcnRtZW50VG9nZ2xlU3RhdHVzUGF5bG9hZCk6IE9ic2VydmFibGU8ZGVwYXJ0bWVudFRvZ2dsZVN0YXR1c0NvbnRyb2xsZXJSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgcXVlcnkgPSBnZW5lcmF0ZVN0cmluZ0Zyb21PYmplY3QocGF5bG9hZCk7IFxyXG4gICAgY29uc3QgdXJsID0gY2lkZVBhdGg/LmpvaW4oW2hvc3RNYW5hZ2VyUm91dGVzVXJsPy5jaWRlU3VpdGVIb3N0LCBjb3JlUm91dGVzVXJsPy5tb2R1bGUsIGNvcmVSb3V0ZXNVcmw/LmRlcGFydG1lbnQsICd0b2dnbGVTdGF0dXMnLCBxdWVyeV0pO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8ZGVwYXJ0bWVudFRvZ2dsZVN0YXR1c0NvbnRyb2xsZXJSZXNwb25zZT4odXJsLCB7fSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKChyZXNwb25zZTogZGVwYXJ0bWVudFRvZ2dsZVN0YXR1c0NvbnRyb2xsZXJSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGVwYXJ0bWVudExpc3QoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5kIGRlcGFydG1lbnQgYnkgSURcclxuICAgKi9cclxuICBmaW5kRGVwYXJ0bWVudEJ5SWQoaWQ6IHN0cmluZywgaXRlbXM6IElDb3JlU3lkZXB0W10gPSB0aGlzLmRlcGFydG1lbnRMaXN0U3ViamVjdC52YWx1ZSk6IElDb3JlU3lkZXB0IHwgbnVsbCB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKGl0ZW0uX2lkID09PSBpZCkge1xyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBwYXJlbnQgZGVwYXJ0bWVudHMgZm9yIGRyb3Bkb3duIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGdldFBhcmVudERlcGFydG1lbnRzKGV4Y2x1ZGVJZD86IHN0cmluZyk6IElDb3JlU3lkZXB0W10ge1xyXG4gICAgY29uc3QgYWxsSXRlbXM6IElDb3JlU3lkZXB0W10gPSBbXTtcclxuXHJcbiAgICBjb25zdCBmbGF0dGVuSXRlbXMgPSAoaXRlbXM6IElDb3JlU3lkZXB0W10sIGxldmVsOiBudW1iZXIgPSAwKSA9PiB7XHJcbiAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uX2lkICE9PSBleGNsdWRlSWQpIHtcclxuICAgICAgICAgIGFsbEl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICBzeWRlcHRfbmFtZTogJyAgJy5yZXBlYXQobGV2ZWwpICsgaXRlbS5zeWRlcHRfbmFtZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgZmxhdHRlbkl0ZW1zKHRoaXMuZGVwYXJ0bWVudExpc3RTdWJqZWN0LnZhbHVlKTtcclxuICAgIHJldHVybiBhbGxJdGVtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZnJlc2ggZGVwYXJ0bWVudCBsaXN0IGZyb20gc2VydmVyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWZyZXNoRGVwYXJ0bWVudExpc3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkZWZhdWx0Qm9keSA9IHtcclxuICAgICAgcGFnZUluZGV4OiAxLFxyXG4gICAgICBwYWdlU2l6ZTogMTBcclxuICAgIH07XHJcbiAgICB0aGlzLmdldERlcGFydG1lbnRMaXN0KGRlZmF1bHRCb2R5KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0RlcGFydG1lbnQgbGlzdCByZWZyZXNoZWQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIGRlcGFydG1lbnQgbGlzdDonLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGVycm9yc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IHVua25vd24pOiBPYnNlcnZhYmxlPG5ldmVyPiB7XHJcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJztcclxuXHJcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9yO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUuZXJyb3IoJ0RlcGFydG1lbnQgTWFuYWdlbWVudCBTZXJ2aWNlIEVycm9yOicsIGVycm9yTWVzc2FnZSk7XHJcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XHJcbiAgfVxyXG59ICJdfQ==