@seniorsistemas/components-ai 0.0.0-master-d4a804fe

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 (76) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/CONTRIBUTING.md +317 -0
  3. package/README.md +161 -0
  4. package/docs/API.md +486 -0
  5. package/docs/COMPONENTS.md +272 -0
  6. package/docs/EXAMPLES.md +559 -0
  7. package/docs/MIGRATION.md +367 -0
  8. package/esm2022/lib/angular-components.module.mjs +25 -0
  9. package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +121 -0
  10. package/esm2022/lib/components/bulk-delete-dialog/bulk-delete-dialog.component.mjs +176 -0
  11. package/esm2022/lib/components/dynamic-form/dynamic-form.component.mjs +625 -0
  12. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-date.component.mjs +86 -0
  13. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-dropdown.component.mjs +103 -0
  14. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-lookup.component.mjs +599 -0
  15. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-number.component.mjs +92 -0
  16. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-text.component.mjs +163 -0
  17. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-textarea.component.mjs +81 -0
  18. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-wrapper.component.mjs +93 -0
  19. package/esm2022/lib/components/dynamic-form/fields/index.mjs +8 -0
  20. package/esm2022/lib/components/dynamic-form/models/dynamic-form.models.mjs +2 -0
  21. package/esm2022/lib/components/export-dialog/export-dialog.component.mjs +219 -0
  22. package/esm2022/lib/config/translation.config.mjs +70 -0
  23. package/esm2022/lib/directives/cep-mask.directive.mjs +79 -0
  24. package/esm2022/lib/directives/document-mask.directive.mjs +62 -0
  25. package/esm2022/lib/directives/phone-mask.directive.mjs +59 -0
  26. package/esm2022/lib/interceptors/api.interceptor.mjs +55 -0
  27. package/esm2022/lib/models/base-entity.interface.mjs +2 -0
  28. package/esm2022/lib/models/entity-list.config.mjs +2 -0
  29. package/esm2022/lib/pipes/translate.pipe.mjs +74 -0
  30. package/esm2022/lib/services/auth.service.mjs +169 -0
  31. package/esm2022/lib/services/cookie.service.mjs +90 -0
  32. package/esm2022/lib/services/entity.service.mjs +208 -0
  33. package/esm2022/lib/services/mask.service.mjs +121 -0
  34. package/esm2022/lib/services/permission.service.mjs +180 -0
  35. package/esm2022/lib/services/senior-token.service.mjs +209 -0
  36. package/esm2022/lib/services/theme.service.mjs +85 -0
  37. package/esm2022/lib/services/translation.service.mjs +232 -0
  38. package/esm2022/public-api.mjs +90 -0
  39. package/esm2022/seniorsistemas-components-ai.mjs +5 -0
  40. package/fesm2022/seniorsistemas-components-ai.mjs +4006 -0
  41. package/fesm2022/seniorsistemas-components-ai.mjs.map +1 -0
  42. package/index.d.ts +5 -0
  43. package/lib/angular-components.module.d.ts +13 -0
  44. package/lib/components/breadcrumb/breadcrumb.component.d.ts +23 -0
  45. package/lib/components/bulk-delete-dialog/bulk-delete-dialog.component.d.ts +46 -0
  46. package/lib/components/dynamic-form/dynamic-form.component.d.ts +97 -0
  47. package/lib/components/dynamic-form/fields/dynamic-field-date.component.d.ts +16 -0
  48. package/lib/components/dynamic-form/fields/dynamic-field-dropdown.component.d.ts +17 -0
  49. package/lib/components/dynamic-form/fields/dynamic-field-lookup.component.d.ts +52 -0
  50. package/lib/components/dynamic-form/fields/dynamic-field-number.component.d.ts +16 -0
  51. package/lib/components/dynamic-form/fields/dynamic-field-text.component.d.ts +17 -0
  52. package/lib/components/dynamic-form/fields/dynamic-field-textarea.component.d.ts +16 -0
  53. package/lib/components/dynamic-form/fields/dynamic-field-wrapper.component.d.ts +20 -0
  54. package/lib/components/dynamic-form/fields/index.d.ts +7 -0
  55. package/lib/components/dynamic-form/models/dynamic-form.models.d.ts +178 -0
  56. package/lib/components/export-dialog/export-dialog.component.d.ts +56 -0
  57. package/lib/config/translation.config.d.ts +24 -0
  58. package/lib/directives/cep-mask.directive.d.ts +13 -0
  59. package/lib/directives/document-mask.directive.d.ts +19 -0
  60. package/lib/directives/phone-mask.directive.d.ts +11 -0
  61. package/lib/interceptors/api.interceptor.d.ts +2 -0
  62. package/lib/models/base-entity.interface.d.ts +7 -0
  63. package/lib/models/entity-list.config.d.ts +161 -0
  64. package/lib/pipes/translate.pipe.d.ts +21 -0
  65. package/lib/services/auth.service.d.ts +82 -0
  66. package/lib/services/cookie.service.d.ts +31 -0
  67. package/lib/services/entity.service.d.ts +99 -0
  68. package/lib/services/mask.service.d.ts +36 -0
  69. package/lib/services/permission.service.d.ts +91 -0
  70. package/lib/services/senior-token.service.d.ts +70 -0
  71. package/lib/services/theme.service.d.ts +16 -0
  72. package/lib/services/translation.service.d.ts +54 -0
  73. package/package.json +53 -0
  74. package/public-api.d.ts +17 -0
  75. package/src/lib/styles/entity-list.shared.scss +383 -0
  76. package/src/lib/styles/index.scss +10 -0
@@ -0,0 +1,208 @@
1
+ import { HttpParams } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { throwError } from 'rxjs';
4
+ import { catchError, map } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ export class EntityService {
8
+ http;
9
+ translationService;
10
+ queriesUrl = '';
11
+ constructor(http, translationService) {
12
+ this.http = http;
13
+ this.translationService = translationService;
14
+ // Initialize queriesUrl in ngOnInit or a separate method
15
+ // since abstract properties can't be accessed in constructor
16
+ }
17
+ /**
18
+ * Initialize the service - call this after setting actionsUrl
19
+ */
20
+ initializeService() {
21
+ this.queriesUrl = this.actionsUrl.replace('actions', 'queries');
22
+ }
23
+ /**
24
+ * Convert ListParams to HttpParams for GET requests
25
+ */
26
+ getListQueryParams(listParams) {
27
+ const { page = 0, size = 10, sort = [], filterQuery = '', displayFields = [] } = listParams;
28
+ let params = new HttpParams();
29
+ params = params.append('size', String(size));
30
+ params = params.append('offset', String(page));
31
+ if (sort && sort.length) {
32
+ const orderBy = sort
33
+ .map((s) => {
34
+ let order = '';
35
+ if (s.order === 1)
36
+ order = ' asc';
37
+ else if (s.order === -1)
38
+ order = ' desc';
39
+ return `${s.field}${order}`;
40
+ })
41
+ .join(', ');
42
+ params = params.append('orderby', orderBy);
43
+ }
44
+ if (filterQuery) {
45
+ params = params.append('filter', filterQuery);
46
+ }
47
+ if (displayFields && displayFields.length) {
48
+ params = params.append('displayfields', displayFields.join(','));
49
+ }
50
+ return params;
51
+ }
52
+ /**
53
+ * Convert ListParams to body parameters for POST requests
54
+ */
55
+ getBodyParams(listParams) {
56
+ const { page = 0, size = 10, sort = [], filterQuery = '', displayFields = [] } = listParams;
57
+ const bodyParams = {};
58
+ bodyParams.size = size;
59
+ bodyParams.offset = page;
60
+ if (sort && sort.length) {
61
+ bodyParams.orderBy = sort
62
+ .map((s) => {
63
+ let order = '';
64
+ if (s.order === 1)
65
+ order = ' asc';
66
+ else if (s.order === -1)
67
+ order = ' desc';
68
+ return `${s.field}${order}`;
69
+ })
70
+ .join(', ');
71
+ }
72
+ if (filterQuery) {
73
+ bodyParams.filter = filterQuery;
74
+ }
75
+ if (displayFields && displayFields.length) {
76
+ bodyParams.displayfields = displayFields.join(',');
77
+ }
78
+ return bodyParams;
79
+ }
80
+ /**
81
+ * Default error handler
82
+ */
83
+ handleError = (error) => {
84
+ let errorMessage = 'An error occurred';
85
+ if (this.translationService) {
86
+ errorMessage = this.translationService.translate('error.generic');
87
+ }
88
+ if (error.status) {
89
+ switch (error.status) {
90
+ case 401:
91
+ errorMessage = this.translationService
92
+ ? this.translationService.translate('error.unauthorized')
93
+ : 'Unauthorized';
94
+ break;
95
+ case 403:
96
+ errorMessage = this.translationService
97
+ ? this.translationService.translate('error.forbidden')
98
+ : 'Forbidden';
99
+ break;
100
+ case 404:
101
+ errorMessage = this.translationService
102
+ ? this.translationService.translate('error.not_found')
103
+ : 'Not found';
104
+ break;
105
+ case 500:
106
+ errorMessage = this.translationService
107
+ ? this.translationService.translate('error.server_error')
108
+ : 'Server error';
109
+ break;
110
+ default:
111
+ if (error.error && error.error.message) {
112
+ errorMessage = error.error.message;
113
+ }
114
+ else if (error.statusText) {
115
+ errorMessage = error.statusText;
116
+ }
117
+ }
118
+ }
119
+ else if (error.message) {
120
+ errorMessage = error.message;
121
+ }
122
+ console.error('EntityService Error:', error);
123
+ return throwError(() => new Error(errorMessage));
124
+ };
125
+ /**
126
+ * List entities with pagination, sorting, and filtering
127
+ */
128
+ list(listParams = {}) {
129
+ const params = this.getListQueryParams(listParams);
130
+ return this.http.get(this.entityUrl, { params })
131
+ .pipe(catchError(this.handleError));
132
+ }
133
+ /**
134
+ * Get entity by ID
135
+ */
136
+ get(id) {
137
+ return this.http.get(`${this.entityUrl}/${id}`)
138
+ .pipe(catchError(this.handleError));
139
+ }
140
+ /**
141
+ * Create new entity
142
+ */
143
+ insert(entity) {
144
+ return this.http.post(this.entityUrl, entity)
145
+ .pipe(catchError(this.handleError));
146
+ }
147
+ /**
148
+ * Update existing entity
149
+ */
150
+ update(id, entity) {
151
+ return this.http.put(`${this.entityUrl}/${id}`, entity)
152
+ .pipe(catchError(this.handleError));
153
+ }
154
+ /**
155
+ * Delete entity by ID
156
+ */
157
+ delete(id) {
158
+ return this.http.delete(`${this.entityUrl}/${id}`, { observe: 'response' })
159
+ .pipe(map(() => undefined), catchError(this.handleError));
160
+ }
161
+ /**
162
+ * Execute custom filter action
163
+ */
164
+ listCustomFilter(listParams, action) {
165
+ const bodyParams = this.getBodyParams(listParams);
166
+ return this.http.post(`${this.actionsUrl}/${action}`, bodyParams)
167
+ .pipe(catchError(this.handleError));
168
+ }
169
+ /**
170
+ * Execute custom query
171
+ */
172
+ executeQuery(queryName, params = {}) {
173
+ return this.http.post(`${this.queriesUrl}/${queryName}`, params)
174
+ .pipe(catchError(this.handleError));
175
+ }
176
+ /**
177
+ * Execute custom action
178
+ */
179
+ executeAction(actionName, params = {}) {
180
+ return this.http.post(`${this.actionsUrl}/${actionName}`, params)
181
+ .pipe(catchError(this.handleError));
182
+ }
183
+ /**
184
+ * Check if entity exists by ID
185
+ */
186
+ exists(id) {
187
+ return this.http.head(`${this.entityUrl}/${id}`)
188
+ .pipe(map(() => true), catchError((error) => {
189
+ if (error.status === 404) {
190
+ return [false];
191
+ }
192
+ return this.handleError(error);
193
+ }));
194
+ }
195
+ /**
196
+ * Bulk delete entities
197
+ */
198
+ bulkDelete(ids) {
199
+ return this.http.post(`${this.actionsUrl}/bulkDelete`, { ids }, { observe: 'response' })
200
+ .pipe(map(() => undefined), catchError(this.handleError));
201
+ }
202
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityService, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable });
203
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityService });
204
+ }
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityService, decorators: [{
206
+ type: Injectable
207
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined }] });
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzLWFpL3NyYy9saWIvc2VydmljZXMvZW50aXR5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUF1Q2pELE1BQU0sT0FBZ0IsYUFBYTtJQU1yQjtJQUNBO0lBSkYsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUVsQyxZQUNZLElBQWdCLEVBQ2hCLGtCQUF1QztRQUR2QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBcUI7UUFFakQseURBQXlEO1FBQ3pELDZEQUE2RDtJQUMvRCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxpQkFBaUI7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ08sa0JBQWtCLENBQUMsVUFBc0I7UUFDakQsTUFBTSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLFdBQVcsR0FBRyxFQUFFLEVBQUUsYUFBYSxHQUFHLEVBQUUsRUFBRSxHQUFHLFVBQVUsQ0FBQztRQUM1RixJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBRTlCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFL0MsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUk7aUJBQ2pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNULElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQztvQkFBRSxLQUFLLEdBQUcsTUFBTSxDQUFDO3FCQUM3QixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO29CQUFFLEtBQUssR0FBRyxPQUFPLENBQUM7Z0JBQ3pDLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQzlCLENBQUMsQ0FBQztpQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ08sYUFBYSxDQUFDLFVBQXNCO1FBQzVDLE1BQU0sRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxXQUFXLEdBQUcsRUFBRSxFQUFFLGFBQWEsR0FBRyxFQUFFLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDNUYsTUFBTSxVQUFVLEdBQWUsRUFBRSxDQUFDO1FBRWxDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRXpCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QixVQUFVLENBQUMsT0FBTyxHQUFHLElBQUk7aUJBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNULElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQztvQkFBRSxLQUFLLEdBQUcsTUFBTSxDQUFDO3FCQUM3QixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO29CQUFFLEtBQUssR0FBRyxPQUFPLENBQUM7Z0JBQ3pDLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQzlCLENBQUMsQ0FBQztpQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEIsQ0FBQztRQUVELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsVUFBVSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxVQUFVLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNPLFdBQVcsR0FBRyxDQUFDLEtBQVUsRUFBcUIsRUFBRTtRQUN4RCxJQUFJLFlBQVksR0FBRyxtQkFBbUIsQ0FBQztRQUV2QyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixRQUFRLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDckIsS0FBSyxHQUFHO29CQUNOLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCO3dCQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQzt3QkFDekQsQ0FBQyxDQUFDLGNBQWMsQ0FBQztvQkFDbkIsTUFBTTtnQkFDUixLQUFLLEdBQUc7b0JBQ04sWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0I7d0JBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO3dCQUN0RCxDQUFDLENBQUMsV0FBVyxDQUFDO29CQUNoQixNQUFNO2dCQUNSLEtBQUssR0FBRztvQkFDTixZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjt3QkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7d0JBQ3RELENBQUMsQ0FBQyxXQUFXLENBQUM7b0JBQ2hCLE1BQU07Z0JBQ1IsS0FBSyxHQUFHO29CQUNOLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCO3dCQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQzt3QkFDekQsQ0FBQyxDQUFDLGNBQWMsQ0FBQztvQkFDbkIsTUFBTTtnQkFDUjtvQkFDRSxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDdkMsWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO29CQUNyQyxDQUFDO3lCQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO3dCQUM1QixZQUFZLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztvQkFDbEMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDL0IsQ0FBQztRQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0MsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUM7SUFFRjs7T0FFRztJQUNILElBQUksQ0FBQyxhQUF5QixFQUFFO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUF3QixJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7YUFDcEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxHQUFHLENBQUMsRUFBTztRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO2FBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO2FBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEVBQU8sRUFBRSxNQUFTO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQzthQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxFQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7YUFDOUUsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFDcEIsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDN0IsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLFVBQXNCLEVBQUUsTUFBYztRQUNyRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQXdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUUsRUFBRSxVQUFVLENBQUM7YUFDckYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsU0FBaUIsRUFBRSxTQUFjLEVBQUU7UUFDOUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBTSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksU0FBUyxFQUFFLEVBQUUsTUFBTSxDQUFDO2FBQ2xFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLFVBQWtCLEVBQUUsU0FBYyxFQUFFO1FBQ2hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsRUFBRSxFQUFFLE1BQU0sQ0FBQzthQUNuRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxFQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLENBQUM7YUFDN0MsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFDZixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsR0FBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsYUFBYSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7YUFDM0YsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFDcEIsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDN0IsQ0FBQztJQUNOLENBQUM7d0dBbE9tQixhQUFhOzRHQUFiLGFBQWE7OzRGQUFiLGFBQWE7a0JBRGxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRNZXRhIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgb3JkZXI6IG51bWJlcjsgLy8gMSBmb3IgYXNjLCAtMSBmb3IgZGVzY1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RQYXJhbXMge1xuICBwYWdlPzogbnVtYmVyO1xuICBzaXplPzogbnVtYmVyO1xuICBzb3J0PzogU29ydE1ldGFbXTtcbiAgZmlsdGVyUXVlcnk/OiBzdHJpbmc7XG4gIGRpc3BsYXlGaWVsZHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb2R5UGFyYW1zIHtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBzaXplPzogbnVtYmVyO1xuICBvcmRlckJ5Pzogc3RyaW5nO1xuICBmaWx0ZXI/OiBzdHJpbmc7XG4gIGRpc3BsYXlmaWVsZHM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5TGlzdFJlc3BvbnNlPFQ+IHtcbiAgY29udGVudHM6IFRbXTtcbiAgdG90YWxFbGVtZW50czogbnVtYmVyO1xuICB0b3RhbFBhZ2VzOiBudW1iZXI7XG4gIHNpemU/OiBudW1iZXI7XG4gIG51bWJlcj86IG51bWJlcjtcbiAgZmlyc3Q/OiBib29sZWFuO1xuICBsYXN0PzogYm9vbGVhbjtcbn1cblxuLy8gSW50ZXJmYWNlIHBhcmEgbyBzZXJ2acOnbyBkZSB0cmFkdcOnw6NvIChkdWNrIHR5cGluZylcbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25TZXJ2aWNlIHtcbiAgdHJhbnNsYXRlKGtleTogc3RyaW5nLCBwYXJhbXM/OiBhbnkpOiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbnRpdHlTZXJ2aWNlPFQ+IHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGVudGl0eVVybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYWN0aW9uc1VybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcXVlcmllc1VybDogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0aW9uU2VydmljZT86IFRyYW5zbGF0aW9uU2VydmljZVxuICApIHtcbiAgICAvLyBJbml0aWFsaXplIHF1ZXJpZXNVcmwgaW4gbmdPbkluaXQgb3IgYSBzZXBhcmF0ZSBtZXRob2RcbiAgICAvLyBzaW5jZSBhYnN0cmFjdCBwcm9wZXJ0aWVzIGNhbid0IGJlIGFjY2Vzc2VkIGluIGNvbnN0cnVjdG9yXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgc2VydmljZSAtIGNhbGwgdGhpcyBhZnRlciBzZXR0aW5nIGFjdGlvbnNVcmxcbiAgICovXG4gIHByb3RlY3RlZCBpbml0aWFsaXplU2VydmljZSgpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJpZXNVcmwgPSB0aGlzLmFjdGlvbnNVcmwucmVwbGFjZSgnYWN0aW9ucycsICdxdWVyaWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBMaXN0UGFyYW1zIHRvIEh0dHBQYXJhbXMgZm9yIEdFVCByZXF1ZXN0c1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldExpc3RRdWVyeVBhcmFtcyhsaXN0UGFyYW1zOiBMaXN0UGFyYW1zKTogSHR0cFBhcmFtcyB7XG4gICAgY29uc3QgeyBwYWdlID0gMCwgc2l6ZSA9IDEwLCBzb3J0ID0gW10sIGZpbHRlclF1ZXJ5ID0gJycsIGRpc3BsYXlGaWVsZHMgPSBbXSB9ID0gbGlzdFBhcmFtcztcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCdzaXplJywgU3RyaW5nKHNpemUpKTtcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCdvZmZzZXQnLCBTdHJpbmcocGFnZSkpO1xuICAgIFxuICAgIGlmIChzb3J0ICYmIHNvcnQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBvcmRlckJ5ID0gc29ydFxuICAgICAgICAubWFwKChzKSA9PiB7XG4gICAgICAgICAgbGV0IG9yZGVyID0gJyc7XG4gICAgICAgICAgaWYgKHMub3JkZXIgPT09IDEpIG9yZGVyID0gJyBhc2MnO1xuICAgICAgICAgIGVsc2UgaWYgKHMub3JkZXIgPT09IC0xKSBvcmRlciA9ICcgZGVzYyc7XG4gICAgICAgICAgcmV0dXJuIGAke3MuZmllbGR9JHtvcmRlcn1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbignLCAnKTtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoJ29yZGVyYnknLCBvcmRlckJ5KTtcbiAgICB9XG5cbiAgICBpZiAoZmlsdGVyUXVlcnkpIHtcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoJ2ZpbHRlcicsIGZpbHRlclF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAoZGlzcGxheUZpZWxkcyAmJiBkaXNwbGF5RmllbGRzLmxlbmd0aCkge1xuICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgnZGlzcGxheWZpZWxkcycsIGRpc3BsYXlGaWVsZHMuam9pbignLCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgTGlzdFBhcmFtcyB0byBib2R5IHBhcmFtZXRlcnMgZm9yIFBPU1QgcmVxdWVzdHNcbiAgICovXG4gIHByb3RlY3RlZCBnZXRCb2R5UGFyYW1zKGxpc3RQYXJhbXM6IExpc3RQYXJhbXMpOiBCb2R5UGFyYW1zIHtcbiAgICBjb25zdCB7IHBhZ2UgPSAwLCBzaXplID0gMTAsIHNvcnQgPSBbXSwgZmlsdGVyUXVlcnkgPSAnJywgZGlzcGxheUZpZWxkcyA9IFtdIH0gPSBsaXN0UGFyYW1zO1xuICAgIGNvbnN0IGJvZHlQYXJhbXM6IEJvZHlQYXJhbXMgPSB7fTtcblxuICAgIGJvZHlQYXJhbXMuc2l6ZSA9IHNpemU7XG4gICAgYm9keVBhcmFtcy5vZmZzZXQgPSBwYWdlO1xuXG4gICAgaWYgKHNvcnQgJiYgc29ydC5sZW5ndGgpIHtcbiAgICAgIGJvZHlQYXJhbXMub3JkZXJCeSA9IHNvcnRcbiAgICAgICAgLm1hcCgocykgPT4ge1xuICAgICAgICAgIGxldCBvcmRlciA9ICcnO1xuICAgICAgICAgIGlmIChzLm9yZGVyID09PSAxKSBvcmRlciA9ICcgYXNjJztcbiAgICAgICAgICBlbHNlIGlmIChzLm9yZGVyID09PSAtMSkgb3JkZXIgPSAnIGRlc2MnO1xuICAgICAgICAgIHJldHVybiBgJHtzLmZpZWxkfSR7b3JkZXJ9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlclF1ZXJ5KSB7XG4gICAgICBib2R5UGFyYW1zLmZpbHRlciA9IGZpbHRlclF1ZXJ5O1xuICAgIH1cblxuICAgIGlmIChkaXNwbGF5RmllbGRzICYmIGRpc3BsYXlGaWVsZHMubGVuZ3RoKSB7XG4gICAgICBib2R5UGFyYW1zLmRpc3BsYXlmaWVsZHMgPSBkaXNwbGF5RmllbGRzLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm9keVBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGVycm9yIGhhbmRsZXJcbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVFcnJvciA9IChlcnJvcjogYW55KTogT2JzZXJ2YWJsZTxuZXZlcj4gPT4ge1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnQW4gZXJyb3Igb2NjdXJyZWQnO1xuICAgIFxuICAgIGlmICh0aGlzLnRyYW5zbGF0aW9uU2VydmljZSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdlcnJvci5nZW5lcmljJyk7XG4gICAgfVxuICAgIFxuICAgIGlmIChlcnJvci5zdGF0dXMpIHtcbiAgICAgIHN3aXRjaCAoZXJyb3Iuc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgNDAxOlxuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlIFxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ2Vycm9yLnVuYXV0aG9yaXplZCcpXG4gICAgICAgICAgICA6ICdVbmF1dGhvcml6ZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwMzpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZVxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ2Vycm9yLmZvcmJpZGRlbicpXG4gICAgICAgICAgICA6ICdGb3JiaWRkZW4nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwNDpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZVxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ2Vycm9yLm5vdF9mb3VuZCcpXG4gICAgICAgICAgICA6ICdOb3QgZm91bmQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZVxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoJ2Vycm9yLnNlcnZlcl9lcnJvcicpXG4gICAgICAgICAgICA6ICdTZXJ2ZXIgZXJyb3InO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChlcnJvci5lcnJvciAmJiBlcnJvci5lcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvci5lcnJvci5tZXNzYWdlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3Iuc3RhdHVzVGV4dCkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3Iuc3RhdHVzVGV4dDtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ0VudGl0eVNlcnZpY2UgRXJyb3I6JywgZXJyb3IpO1xuICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgfTtcblxuICAvKipcbiAgICogTGlzdCBlbnRpdGllcyB3aXRoIHBhZ2luYXRpb24sIHNvcnRpbmcsIGFuZCBmaWx0ZXJpbmdcbiAgICovXG4gIGxpc3QobGlzdFBhcmFtczogTGlzdFBhcmFtcyA9IHt9KTogT2JzZXJ2YWJsZTxFbnRpdHlMaXN0UmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldExpc3RRdWVyeVBhcmFtcyhsaXN0UGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxFbnRpdHlMaXN0UmVzcG9uc2U8VD4+KHRoaXMuZW50aXR5VXJsLCB7IHBhcmFtcyB9KVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVudGl0eSBieSBJRFxuICAgKi9cbiAgZ2V0KGlkOiBhbnkpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPihgJHt0aGlzLmVudGl0eVVybH0vJHtpZH1gKVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG5ldyBlbnRpdHlcbiAgICovXG4gIGluc2VydChlbnRpdHk6IFQpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8VD4odGhpcy5lbnRpdHlVcmwsIGVudGl0eSlcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBleGlzdGluZyBlbnRpdHlcbiAgICovXG4gIHVwZGF0ZShpZDogYW55LCBlbnRpdHk6IFQpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxUPihgJHt0aGlzLmVudGl0eVVybH0vJHtpZH1gLCBlbnRpdHkpXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgZW50aXR5IGJ5IElEXG4gICAqL1xuICBkZWxldGUoaWQ6IGFueSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPHZvaWQ+KGAke3RoaXMuZW50aXR5VXJsfS8ke2lkfWAsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgY3VzdG9tIGZpbHRlciBhY3Rpb25cbiAgICovXG4gIGxpc3RDdXN0b21GaWx0ZXIobGlzdFBhcmFtczogTGlzdFBhcmFtcywgYWN0aW9uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEVudGl0eUxpc3RSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGJvZHlQYXJhbXMgPSB0aGlzLmdldEJvZHlQYXJhbXMobGlzdFBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEVudGl0eUxpc3RSZXNwb25zZTxUPj4oYCR7dGhpcy5hY3Rpb25zVXJsfS8ke2FjdGlvbn1gLCBib2R5UGFyYW1zKVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBjdXN0b20gcXVlcnlcbiAgICovXG4gIGV4ZWN1dGVRdWVyeShxdWVyeU5hbWU6IHN0cmluZywgcGFyYW1zOiBhbnkgPSB7fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oYCR7dGhpcy5xdWVyaWVzVXJsfS8ke3F1ZXJ5TmFtZX1gLCBwYXJhbXMpXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGN1c3RvbSBhY3Rpb25cbiAgICovXG4gIGV4ZWN1dGVBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nLCBwYXJhbXM6IGFueSA9IHt9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihgJHt0aGlzLmFjdGlvbnNVcmx9LyR7YWN0aW9uTmFtZX1gLCBwYXJhbXMpXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbnRpdHkgZXhpc3RzIGJ5IElEXG4gICAqL1xuICBleGlzdHMoaWQ6IGFueSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuaGVhZChgJHt0aGlzLmVudGl0eVVybH0vJHtpZH1gKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBbZmFsc2VdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1bGsgZGVsZXRlIGVudGl0aWVzXG4gICAqL1xuICBidWxrRGVsZXRlKGlkczogYW55W10pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8dm9pZD4oYCR7dGhpcy5hY3Rpb25zVXJsfS9idWxrRGVsZXRlYCwgeyBpZHMgfSwgeyBvYnNlcnZlOiAncmVzcG9uc2UnIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcbiAgICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,121 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class MaskService {
4
+ /**
5
+ * Aplica máscara de CPF (999.999.999-99) - 100% numérico
6
+ */
7
+ applyCpfMask(value) {
8
+ if (!value)
9
+ return '';
10
+ // Remove todos os caracteres não numéricos
11
+ const numbers = value.replace(/\D/g, '');
12
+ // Limita a 11 dígitos
13
+ const limitedNumbers = numbers.substring(0, 11);
14
+ // Aplica a máscara progressivamente
15
+ if (limitedNumbers.length <= 3) {
16
+ return limitedNumbers;
17
+ }
18
+ else if (limitedNumbers.length <= 6) {
19
+ return limitedNumbers.replace(/(\d{3})(\d+)/, '$1.$2');
20
+ }
21
+ else if (limitedNumbers.length <= 9) {
22
+ return limitedNumbers.replace(/(\d{3})(\d{3})(\d+)/, '$1.$2.$3');
23
+ }
24
+ else {
25
+ return limitedNumbers.replace(/(\d{3})(\d{3})(\d{3})(\d+)/, '$1.$2.$3-$4');
26
+ }
27
+ }
28
+ /**
29
+ * Aplica máscara de CNPJ alfanumérico (XX.XXX.XXX/XXXX-XX)
30
+ * Aceita letras e números em todos os caracteres
31
+ */
32
+ applyCnpjMask(value) {
33
+ if (!value)
34
+ return '';
35
+ // Remove caracteres especiais, mantém letras e números
36
+ const cleaned = value.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();
37
+ // Limita a 14 caracteres
38
+ const limitedChars = cleaned.substring(0, 14);
39
+ // Aplica a máscara progressivamente
40
+ if (limitedChars.length <= 2) {
41
+ return limitedChars;
42
+ }
43
+ else if (limitedChars.length <= 5) {
44
+ return limitedChars.replace(/(\w{2})(\w+)/, '$1.$2');
45
+ }
46
+ else if (limitedChars.length <= 8) {
47
+ return limitedChars.replace(/(\w{2})(\w{3})(\w+)/, '$1.$2.$3');
48
+ }
49
+ else if (limitedChars.length <= 12) {
50
+ return limitedChars.replace(/(\w{2})(\w{3})(\w{3})(\w+)/, '$1.$2.$3/$4');
51
+ }
52
+ else {
53
+ return limitedChars.replace(/(\w{2})(\w{3})(\w{3})(\w{4})(\w+)/, '$1.$2.$3/$4-$5');
54
+ }
55
+ }
56
+ /**
57
+ * Aplica a máscara apropriada baseada no tipo de pessoa
58
+ * CPF: 100% numérico (999.999.999-99)
59
+ * CNPJ: alfanumérico (XX.XXX.XXX/XXXX-XX)
60
+ */
61
+ applyDocumentMask(value, typePerson) {
62
+ if (!value)
63
+ return '';
64
+ if (typePerson === 'NATURAL_PERSON') {
65
+ return this.applyCpfMask(value);
66
+ }
67
+ else {
68
+ return this.applyCnpjMask(value);
69
+ }
70
+ }
71
+ /**
72
+ * Remove a máscara de um documento (mantém apenas alfanuméricos)
73
+ */
74
+ removeMask(value) {
75
+ if (!value)
76
+ return '';
77
+ return value.replace(/[^a-zA-Z0-9]/g, '');
78
+ }
79
+ /**
80
+ * Determina se um documento é CPF ou CNPJ baseado no comprimento
81
+ */
82
+ getDocumentType(value) {
83
+ if (!value)
84
+ return 'unknown';
85
+ const cleaned = this.removeMask(value);
86
+ if (cleaned.length <= 11) {
87
+ return 'cpf';
88
+ }
89
+ else if (cleaned.length <= 14) {
90
+ return 'cnpj';
91
+ }
92
+ return 'unknown';
93
+ }
94
+ /**
95
+ * Valida se um CPF tem formato válido (11 dígitos numéricos)
96
+ */
97
+ isValidCpfFormat(value) {
98
+ if (!value)
99
+ return false;
100
+ const cleaned = value.replace(/\D/g, '');
101
+ return cleaned.length === 11 && /^\d{11}$/.test(cleaned);
102
+ }
103
+ /**
104
+ * Valida se um CNPJ tem formato válido (14 caracteres alfanuméricos)
105
+ */
106
+ isValidCnpjFormat(value) {
107
+ if (!value)
108
+ return false;
109
+ const cleaned = this.removeMask(value);
110
+ return cleaned.length === 14;
111
+ }
112
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MaskService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
113
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MaskService, providedIn: 'root' });
114
+ }
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MaskService, decorators: [{
116
+ type: Injectable,
117
+ args: [{
118
+ providedIn: 'root'
119
+ }]
120
+ }] });
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL3NlcnZpY2VzL21hc2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sV0FBVztJQUV0Qjs7T0FFRztJQUNILFlBQVksQ0FBQyxLQUFhO1FBQ3hCLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFdEIsMkNBQTJDO1FBQzNDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLHNCQUFzQjtRQUN0QixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVoRCxvQ0FBb0M7UUFDcEMsSUFBSSxjQUFjLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7YUFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEMsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxDQUFDO2FBQU0sSUFBSSxjQUFjLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM3RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLElBQUks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TyxPQUFPLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQztJQUMvQixDQUFDO3dHQTdHVSxXQUFXOzRHQUFYLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTWFza1NlcnZpY2Uge1xuXG4gIC8qKlxuICAgKiBBcGxpY2EgbcOhc2NhcmEgZGUgQ1BGICg5OTkuOTk5Ljk5OS05OSkgLSAxMDAlIG51bcOpcmljb1xuICAgKi9cbiAgYXBwbHlDcGZNYXNrKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdmFsdWUpIHJldHVybiAnJztcbiAgICBcbiAgICAvLyBSZW1vdmUgdG9kb3Mgb3MgY2FyYWN0ZXJlcyBuw6NvIG51bcOpcmljb3NcbiAgICBjb25zdCBudW1iZXJzID0gdmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICBcbiAgICAvLyBMaW1pdGEgYSAxMSBkw61naXRvc1xuICAgIGNvbnN0IGxpbWl0ZWROdW1iZXJzID0gbnVtYmVycy5zdWJzdHJpbmcoMCwgMTEpO1xuICAgIFxuICAgIC8vIEFwbGljYSBhIG3DoXNjYXJhIHByb2dyZXNzaXZhbWVudGVcbiAgICBpZiAobGltaXRlZE51bWJlcnMubGVuZ3RoIDw9IDMpIHtcbiAgICAgIHJldHVybiBsaW1pdGVkTnVtYmVycztcbiAgICB9IGVsc2UgaWYgKGxpbWl0ZWROdW1iZXJzLmxlbmd0aCA8PSA2KSB7XG4gICAgICByZXR1cm4gbGltaXRlZE51bWJlcnMucmVwbGFjZSgvKFxcZHszfSkoXFxkKykvLCAnJDEuJDInKTtcbiAgICB9IGVsc2UgaWYgKGxpbWl0ZWROdW1iZXJzLmxlbmd0aCA8PSA5KSB7XG4gICAgICByZXR1cm4gbGltaXRlZE51bWJlcnMucmVwbGFjZSgvKFxcZHszfSkoXFxkezN9KShcXGQrKS8sICckMS4kMi4kMycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGltaXRlZE51bWJlcnMucmVwbGFjZSgvKFxcZHszfSkoXFxkezN9KShcXGR7M30pKFxcZCspLywgJyQxLiQyLiQzLSQ0Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwbGljYSBtw6FzY2FyYSBkZSBDTlBKIGFsZmFudW3DqXJpY28gKFhYLlhYWC5YWFgvWFhYWC1YWClcbiAgICogQWNlaXRhIGxldHJhcyBlIG7Dum1lcm9zIGVtIHRvZG9zIG9zIGNhcmFjdGVyZXNcbiAgICovXG4gIGFwcGx5Q25wak1hc2sodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnO1xuICAgIFxuICAgIC8vIFJlbW92ZSBjYXJhY3RlcmVzIGVzcGVjaWFpcywgbWFudMOpbSBsZXRyYXMgZSBuw7ptZXJvc1xuICAgIGNvbnN0IGNsZWFuZWQgPSB2YWx1ZS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgJycpLnRvVXBwZXJDYXNlKCk7XG4gICAgXG4gICAgLy8gTGltaXRhIGEgMTQgY2FyYWN0ZXJlc1xuICAgIGNvbnN0IGxpbWl0ZWRDaGFycyA9IGNsZWFuZWQuc3Vic3RyaW5nKDAsIDE0KTtcbiAgICBcbiAgICAvLyBBcGxpY2EgYSBtw6FzY2FyYSBwcm9ncmVzc2l2YW1lbnRlXG4gICAgaWYgKGxpbWl0ZWRDaGFycy5sZW5ndGggPD0gMikge1xuICAgICAgcmV0dXJuIGxpbWl0ZWRDaGFycztcbiAgICB9IGVsc2UgaWYgKGxpbWl0ZWRDaGFycy5sZW5ndGggPD0gNSkge1xuICAgICAgcmV0dXJuIGxpbWl0ZWRDaGFycy5yZXBsYWNlKC8oXFx3ezJ9KShcXHcrKS8sICckMS4kMicpO1xuICAgIH0gZWxzZSBpZiAobGltaXRlZENoYXJzLmxlbmd0aCA8PSA4KSB7XG4gICAgICByZXR1cm4gbGltaXRlZENoYXJzLnJlcGxhY2UoLyhcXHd7Mn0pKFxcd3szfSkoXFx3KykvLCAnJDEuJDIuJDMnKTtcbiAgICB9IGVsc2UgaWYgKGxpbWl0ZWRDaGFycy5sZW5ndGggPD0gMTIpIHtcbiAgICAgIHJldHVybiBsaW1pdGVkQ2hhcnMucmVwbGFjZSgvKFxcd3syfSkoXFx3ezN9KShcXHd7M30pKFxcdyspLywgJyQxLiQyLiQzLyQ0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsaW1pdGVkQ2hhcnMucmVwbGFjZSgvKFxcd3syfSkoXFx3ezN9KShcXHd7M30pKFxcd3s0fSkoXFx3KykvLCAnJDEuJDIuJDMvJDQtJDUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBsaWNhIGEgbcOhc2NhcmEgYXByb3ByaWFkYSBiYXNlYWRhIG5vIHRpcG8gZGUgcGVzc29hXG4gICAqIENQRjogMTAwJSBudW3DqXJpY28gKDk5OS45OTkuOTk5LTk5KVxuICAgKiBDTlBKOiBhbGZhbnVtw6lyaWNvIChYWC5YWFguWFhYL1hYWFgtWFgpXG4gICAqL1xuICBhcHBseURvY3VtZW50TWFzayh2YWx1ZTogc3RyaW5nLCB0eXBlUGVyc29uOiAnTkFUVVJBTF9QRVJTT04nIHwgJ0pVUklESUNBTF9QRVJTT04nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XG4gICAgXG4gICAgaWYgKHR5cGVQZXJzb24gPT09ICdOQVRVUkFMX1BFUlNPTicpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5Q3BmTWFzayh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5Q25wak1hc2sodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBtw6FzY2FyYSBkZSB1bSBkb2N1bWVudG8gKG1hbnTDqW0gYXBlbmFzIGFsZmFudW3DqXJpY29zKVxuICAgKi9cbiAgcmVtb3ZlTWFzayh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCAnJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5hIHNlIHVtIGRvY3VtZW50byDDqSBDUEYgb3UgQ05QSiBiYXNlYWRvIG5vIGNvbXByaW1lbnRvXG4gICAqL1xuICBnZXREb2N1bWVudFR5cGUodmFsdWU6IHN0cmluZyk6ICdjcGYnIHwgJ2NucGonIHwgJ3Vua25vd24nIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJ3Vua25vd24nO1xuICAgIFxuICAgIGNvbnN0IGNsZWFuZWQgPSB0aGlzLnJlbW92ZU1hc2sodmFsdWUpO1xuICAgIFxuICAgIGlmIChjbGVhbmVkLmxlbmd0aCA8PSAxMSkge1xuICAgICAgcmV0dXJuICdjcGYnO1xuICAgIH0gZWxzZSBpZiAoY2xlYW5lZC5sZW5ndGggPD0gMTQpIHtcbiAgICAgIHJldHVybiAnY25waic7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiAndW5rbm93bic7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhIHNlIHVtIENQRiB0ZW0gZm9ybWF0byB2w6FsaWRvICgxMSBkw61naXRvcyBudW3DqXJpY29zKVxuICAgKi9cbiAgaXNWYWxpZENwZkZvcm1hdCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNsZWFuZWQgPSB2YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgIHJldHVybiBjbGVhbmVkLmxlbmd0aCA9PT0gMTEgJiYgL15cXGR7MTF9JC8udGVzdChjbGVhbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGEgc2UgdW0gQ05QSiB0ZW0gZm9ybWF0byB2w6FsaWRvICgxNCBjYXJhY3RlcmVzIGFsZmFudW3DqXJpY29zKVxuICAgKi9cbiAgaXNWYWxpZENucGpGb3JtYXQodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjbGVhbmVkID0gdGhpcy5yZW1vdmVNYXNrKHZhbHVlKTtcbiAgICByZXR1cm4gY2xlYW5lZC5sZW5ndGggPT09IDE0O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,180 @@
1
+ import { Injectable, Optional, Inject } from '@angular/core';
2
+ import { of } from 'rxjs';
3
+ import { map, catchError } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common/http";
6
+ export class PermissionService {
7
+ http;
8
+ authService;
9
+ PERMISSION_ENDPOINT = 'platform/authorization/queries/checkAccess';
10
+ permissionCache = new Map();
11
+ cacheExpiry = new Map();
12
+ CACHE_DURATION = 5 * 60 * 1000; // 5 minutes in milliseconds
13
+ constructor(http, authService) {
14
+ this.http = http;
15
+ this.authService = authService;
16
+ }
17
+ /**
18
+ * Check access for a single permission
19
+ */
20
+ checkAccess(resource, action, context) {
21
+ const cacheKey = this.getCacheKey(resource, action, context);
22
+ // Check cache first
23
+ const cachedResult = this.getCachedPermission(cacheKey);
24
+ if (cachedResult !== null) {
25
+ return of(cachedResult.allowed);
26
+ }
27
+ // Make API request
28
+ const request = {
29
+ permissions: [{ resource, action, context }]
30
+ };
31
+ return this.http.post(this.PERMISSION_ENDPOINT, request).pipe(map(response => {
32
+ if (response.results && response.results.length > 0) {
33
+ const result = response.results[0];
34
+ this.cachePermission(cacheKey, result);
35
+ return result.allowed;
36
+ }
37
+ return false;
38
+ }), catchError(error => {
39
+ console.error('Permission check failed:', error);
40
+ // On error, deny access by default
41
+ return of(false);
42
+ }));
43
+ }
44
+ /**
45
+ * Check access for multiple permissions
46
+ */
47
+ checkMultipleAccess(permissions) {
48
+ const uncachedPermissions = [];
49
+ const results = [];
50
+ // Check cache for each permission
51
+ permissions.forEach(permission => {
52
+ const cacheKey = this.getCacheKey(permission.resource, permission.action, permission.context);
53
+ const cachedResult = this.getCachedPermission(cacheKey);
54
+ if (cachedResult !== null) {
55
+ results.push(cachedResult);
56
+ }
57
+ else {
58
+ uncachedPermissions.push(permission);
59
+ }
60
+ });
61
+ // If all permissions are cached, return immediately
62
+ if (uncachedPermissions.length === 0) {
63
+ return of(results);
64
+ }
65
+ // Make API request for uncached permissions
66
+ const request = {
67
+ permissions: uncachedPermissions
68
+ };
69
+ return this.http.post(this.PERMISSION_ENDPOINT, request).pipe(map(response => {
70
+ if (response.results) {
71
+ // Cache the new results
72
+ response.results.forEach(result => {
73
+ const cacheKey = this.getCacheKey(result.resource, result.action);
74
+ this.cachePermission(cacheKey, result);
75
+ });
76
+ // Combine cached and new results
77
+ return [...results, ...response.results];
78
+ }
79
+ return results;
80
+ }), catchError(error => {
81
+ console.error('Multiple permission check failed:', error);
82
+ // On error, return cached results and deny uncached ones
83
+ const deniedResults = uncachedPermissions.map(permission => ({
84
+ allowed: false,
85
+ resource: permission.resource,
86
+ action: permission.action,
87
+ reason: 'Permission check failed'
88
+ }));
89
+ return of([...results, ...deniedResults]);
90
+ }));
91
+ }
92
+ /**
93
+ * Check if user can read a resource
94
+ */
95
+ canRead(resource, context) {
96
+ return this.checkAccess(resource, 'read', context);
97
+ }
98
+ /**
99
+ * Check if user can write to a resource
100
+ */
101
+ canWrite(resource, context) {
102
+ return this.checkAccess(resource, 'write', context);
103
+ }
104
+ /**
105
+ * Check if user can delete a resource
106
+ */
107
+ canDelete(resource, context) {
108
+ return this.checkAccess(resource, 'delete', context);
109
+ }
110
+ /**
111
+ * Check if user can execute an action on a resource
112
+ */
113
+ canExecute(resource, action, context) {
114
+ return this.checkAccess(resource, action, context);
115
+ }
116
+ /**
117
+ * Clear permission cache
118
+ */
119
+ clearCache() {
120
+ this.permissionCache.clear();
121
+ this.cacheExpiry.clear();
122
+ }
123
+ /**
124
+ * Clear expired cache entries
125
+ */
126
+ clearExpiredCache() {
127
+ const now = Date.now();
128
+ const expiredKeys = [];
129
+ this.cacheExpiry.forEach((expiry, key) => {
130
+ if (expiry < now) {
131
+ expiredKeys.push(key);
132
+ }
133
+ });
134
+ expiredKeys.forEach(key => {
135
+ this.permissionCache.delete(key);
136
+ this.cacheExpiry.delete(key);
137
+ });
138
+ }
139
+ /**
140
+ * Generate cache key for permission
141
+ */
142
+ getCacheKey(resource, action, context) {
143
+ const contextStr = context ? JSON.stringify(context) : '';
144
+ return `${resource}:${action}:${contextStr}`;
145
+ }
146
+ /**
147
+ * Get cached permission result
148
+ */
149
+ getCachedPermission(cacheKey) {
150
+ const expiry = this.cacheExpiry.get(cacheKey);
151
+ if (expiry && expiry > Date.now()) {
152
+ return this.permissionCache.get(cacheKey) || null;
153
+ }
154
+ // Remove expired entry
155
+ this.permissionCache.delete(cacheKey);
156
+ this.cacheExpiry.delete(cacheKey);
157
+ return null;
158
+ }
159
+ /**
160
+ * Cache permission result
161
+ */
162
+ cachePermission(cacheKey, result) {
163
+ this.permissionCache.set(cacheKey, result);
164
+ this.cacheExpiry.set(cacheKey, Date.now() + this.CACHE_DURATION);
165
+ }
166
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionService, deps: [{ token: i1.HttpClient }, { token: 'AuthService', optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
167
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionService, providedIn: 'root' });
168
+ }
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionService, decorators: [{
170
+ type: Injectable,
171
+ args: [{
172
+ providedIn: 'root'
173
+ }]
174
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
175
+ type: Optional
176
+ }, {
177
+ type: Inject,
178
+ args: ['AuthService']
179
+ }] }] });
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL3NlcnZpY2VzL3Blcm1pc3Npb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFnQ2pELE1BQU0sT0FBTyxpQkFBaUI7SUFPbEI7SUFDbUM7SUFQNUIsbUJBQW1CLEdBQUcsNENBQTRDLENBQUM7SUFDNUUsZUFBZSxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0lBQ3hELFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUMvQixjQUFjLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyw0QkFBNEI7SUFFN0UsWUFDVSxJQUFnQixFQUNtQixXQUFrQztRQURyRSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ21CLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtJQUM1RSxDQUFDO0lBRUo7O09BRUc7SUFDSCxXQUFXLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsT0FBZ0M7UUFDNUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTdELG9CQUFvQjtRQUNwQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDMUIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFD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QUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNwRCxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZSxDQUFDLFFBQWdCLEVBQUUsTUFBMEI7UUFDbEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7d0dBMUxVLGlCQUFpQiw0Q0FRTixhQUFhOzRHQVJ4QixpQkFBaUIsY0FGaEIsTUFBTTs7NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBU0ksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvblJlcXVlc3Qge1xuICByZXNvdXJjZTogc3RyaW5nO1xuICBhY3Rpb246IHN0cmluZztcbiAgY29udGV4dD86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvblJlc3BvbnNlIHtcbiAgYWxsb3dlZDogYm9vbGVhbjtcbiAgcmVzb3VyY2U6IHN0cmluZztcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIHJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGVja0FjY2Vzc1JlcXVlc3Qge1xuICBwZXJtaXNzaW9uczogUGVybWlzc2lvblJlcXVlc3RbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGVja0FjY2Vzc1Jlc3BvbnNlIHtcbiAgcmVzdWx0czogUGVybWlzc2lvblJlc3BvbnNlW107XG59XG5cbi8vIEludGVyZmFjZSBwYXJhIEF1dGhTZXJ2aWNlIChkdWNrIHR5cGluZylcbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFNlcnZpY2VJbnRlcmZhY2Uge1xuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbjtcbiAgZ2V0QWNjZXNzVG9rZW4oKTogc3RyaW5nIHwgbnVsbDtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFBFUk1JU1NJT05fRU5EUE9JTlQgPSAncGxhdGZvcm0vYXV0aG9yaXphdGlvbi9xdWVyaWVzL2NoZWNrQWNjZXNzJztcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUGVybWlzc2lvblJlc3BvbnNlPigpO1xuICBwcml2YXRlIGNhY2hlRXhwaXJ5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBDQUNIRV9EVVJBVElPTiA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlcyBpbiBtaWxsaXNlY29uZHNcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdCgnQXV0aFNlcnZpY2UnKSBwcml2YXRlIGF1dGhTZXJ2aWNlPzogQXV0aFNlcnZpY2VJbnRlcmZhY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDaGVjayBhY2Nlc3MgZm9yIGEgc2luZ2xlIHBlcm1pc3Npb25cbiAgICovXG4gIGNoZWNrQWNjZXNzKHJlc291cmNlOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBjb250ZXh0PzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZXRDYWNoZUtleShyZXNvdXJjZSwgYWN0aW9uLCBjb250ZXh0KTtcbiAgICBcbiAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IHRoaXMuZ2V0Q2FjaGVkUGVybWlzc2lvbihjYWNoZUtleSk7XG4gICAgaWYgKGNhY2hlZFJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9mKGNhY2hlZFJlc3VsdC5hbGxvd2VkKTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIEFQSSByZXF1ZXN0XG4gICAgY29uc3QgcmVxdWVzdDogQ2hlY2tBY2Nlc3NSZXF1ZXN0ID0ge1xuICAgICAgcGVybWlzc2lvbnM6IFt7IHJlc291cmNlLCBhY3Rpb24sIGNvbnRleHQgfV1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENoZWNrQWNjZXNzUmVzcG9uc2U+KHRoaXMuUEVSTUlTU0lPTl9FTkRQT0lOVCwgcmVxdWVzdCkucGlwZShcbiAgICAgIG1hcChyZXNwb25zZSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHRzICYmIHJlc3BvbnNlLnJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdHNbMF07XG4gICAgICAgICAgdGhpcy5jYWNoZVBlcm1pc3Npb24oY2FjaGVLZXksIHJlc3VsdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5hbGxvd2VkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Blcm1pc3Npb24gY2hlY2sgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgLy8gT24gZXJyb3IsIGRlbnkgYWNjZXNzIGJ5IGRlZmF1bHRcbiAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhY2Nlc3MgZm9yIG11bHRpcGxlIHBlcm1pc3Npb25zXG4gICAqL1xuICBjaGVja011bHRpcGxlQWNjZXNzKHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uUmVxdWVzdFtdKTogT2JzZXJ2YWJsZTxQZXJtaXNzaW9uUmVzcG9uc2VbXT4ge1xuICAgIGNvbnN0IHVuY2FjaGVkUGVybWlzc2lvbnM6IFBlcm1pc3Npb25SZXF1ZXN0W10gPSBbXTtcbiAgICBjb25zdCByZXN1bHRzOiBQZXJtaXNzaW9uUmVzcG9uc2VbXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgY2FjaGUgZm9yIGVhY2ggcGVybWlzc2lvblxuICAgIHBlcm1pc3Npb25zLmZvckVhY2gocGVybWlzc2lvbiA9PiB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2V0Q2FjaGVLZXkocGVybWlzc2lvbi5yZXNvdXJjZSwgcGVybWlzc2lvbi5hY3Rpb24sIHBlcm1pc3Npb24uY29udGV4dCk7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSB0aGlzLmdldENhY2hlZFBlcm1pc3Npb24oY2FjaGVLZXkpO1xuICAgICAgXG4gICAgICBpZiAoY2FjaGVkUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChjYWNoZWRSZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5jYWNoZWRQZXJtaXNzaW9ucy5wdXNoKHBlcm1pc3Npb24pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSWYgYWxsIHBlcm1pc3Npb25zIGFyZSBjYWNoZWQsIHJldHVybiBpbW1lZGlhdGVseVxuICAgIGlmICh1bmNhY2hlZFBlcm1pc3Npb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG9mKHJlc3VsdHMpO1xuICAgIH1cblxuICAgIC8vIE1ha2UgQVBJIHJlcXVlc3QgZm9yIHVuY2FjaGVkIHBlcm1pc3Npb25zXG4gICAgY29uc3QgcmVxdWVzdDogQ2hlY2tBY2Nlc3NSZXF1ZXN0ID0ge1xuICAgICAgcGVybWlzc2lvbnM6IHVuY2FjaGVkUGVybWlzc2lvbnNcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENoZWNrQWNjZXNzUmVzcG9uc2U+KHRoaXMuUEVSTUlTU0lPTl9FTkRQT0lOVCwgcmVxdWVzdCkucGlwZShcbiAgICAgIG1hcChyZXNwb25zZSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHRzKSB7XG4gICAgICAgICAgLy8gQ2FjaGUgdGhlIG5ldyByZXN1bHRzXG4gICAgICAgICAgcmVzcG9uc2UucmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2V0Q2FjaGVLZXkocmVzdWx0LnJlc291cmNlLCByZXN1bHQuYWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVQZXJtaXNzaW9uKGNhY2hlS2V5LCByZXN1bHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIENvbWJpbmUgY2FjaGVkIGFuZCBuZXcgcmVzdWx0c1xuICAgICAgICAgIHJldHVybiBbLi4ucmVzdWx0cywgLi4ucmVzcG9uc2UucmVzdWx0c107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdNdWx0aXBsZSBwZXJtaXNzaW9uIGNoZWNrIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIC8vIE9uIGVycm9yLCByZXR1cm4gY2FjaGVkIHJlc3VsdHMgYW5kIGRlbnkgdW5jYWNoZWQgb25lc1xuICAgICAgICBjb25zdCBkZW5pZWRSZXN1bHRzID0gdW5jYWNoZWRQZXJtaXNzaW9ucy5tYXAocGVybWlzc2lvbiA9PiAoe1xuICAgICAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgICAgIHJlc291cmNlOiBwZXJtaXNzaW9uLnJlc291cmNlLFxuICAgICAgICAgIGFjdGlvbjogcGVybWlzc2lvbi5hY3Rpb24sXG4gICAgICAgICAgcmVhc29uOiAnUGVybWlzc2lvbiBjaGVjayBmYWlsZWQnXG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuIG9mKFsuLi5yZXN1bHRzLCAuLi5kZW5pZWRSZXN1bHRzXSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBjYW4gcmVhZCBhIHJlc291cmNlXG4gICAqL1xuICBjYW5SZWFkKHJlc291cmNlOiBzdHJpbmcsIGNvbnRleHQ/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tBY2Nlc3MocmVzb3VyY2UsICdyZWFkJywgY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBjYW4gd3JpdGUgdG8gYSByZXNvdXJjZVxuICAgKi9cbiAgY2FuV3JpdGUocmVzb3VyY2U6IHN0cmluZywgY29udGV4dD86IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0FjY2VzcyhyZXNvdXJjZSwgJ3dyaXRlJywgY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBjYW4gZGVsZXRlIGEgcmVzb3VyY2VcbiAgICovXG4gIGNhbkRlbGV0ZShyZXNvdXJjZTogc3RyaW5nLCBjb250ZXh0PzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrQWNjZXNzKHJlc291cmNlLCAnZGVsZXRlJywgY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBjYW4gZXhlY3V0ZSBhbiBhY3Rpb24gb24gYSByZXNvdXJjZVxuICAgKi9cbiAgY2FuRXhlY3V0ZShyZXNvdXJjZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgY29udGV4dD86IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0FjY2VzcyhyZXNvdXJjZSwgYWN0aW9uLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBwZXJtaXNzaW9uIGNhY2hlXG4gICAqL1xuICBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMucGVybWlzc2lvbkNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5jYWNoZUV4cGlyeS5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGV4cGlyZWQgY2FjaGUgZW50cmllc1xuICAgKi9cbiAgY2xlYXJFeHBpcmVkQ2FjaGUoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBleHBpcmVkS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIHRoaXMuY2FjaGVFeHBpcnkuZm9yRWFjaCgoZXhwaXJ5LCBrZXkpID0+IHtcbiAgICAgIGlmIChleHBpcnkgPCBub3cpIHtcbiAgICAgICAgZXhwaXJlZEtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwaXJlZEtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmNhY2hlRXhwaXJ5LmRlbGV0ZShrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGNhY2hlIGtleSBmb3IgcGVybWlzc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDYWNoZUtleShyZXNvdXJjZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgY29udGV4dD86IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRleHRTdHIgPSBjb250ZXh0ID8gSlNPTi5zdHJpbmdpZnkoY29udGV4dCkgOiAnJztcbiAgICByZXR1cm4gYCR7cmVzb3VyY2V9OiR7YWN0aW9ufToke2NvbnRleHRTdHJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGVkIHBlcm1pc3Npb24gcmVzdWx0XG4gICAqL1xuICBwcml2YXRlIGdldENhY2hlZFBlcm1pc3Npb24oY2FjaGVLZXk6IHN0cmluZyk6IFBlcm1pc3Npb25SZXNwb25zZSB8IG51bGwge1xuICAgIGNvbnN0IGV4cGlyeSA9IHRoaXMuY2FjaGVFeHBpcnkuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoZXhwaXJ5ICYmIGV4cGlyeSA+IERhdGUubm93KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25DYWNoZS5nZXQoY2FjaGVLZXkpIHx8IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlbW92ZSBleHBpcmVkIGVudHJ5XG4gICAgdGhpcy5wZXJtaXNzaW9uQ2FjaGUuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICB0aGlzLmNhY2hlRXhwaXJ5LmRlbGV0ZShjYWNoZUtleSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2FjaGUgcGVybWlzc2lvbiByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgY2FjaGVQZXJtaXNzaW9uKGNhY2hlS2V5OiBzdHJpbmcsIHJlc3VsdDogUGVybWlzc2lvblJlc3BvbnNlKTogdm9pZCB7XG4gICAgdGhpcy5wZXJtaXNzaW9uQ2FjaGUuc2V0KGNhY2hlS2V5LCByZXN1bHQpO1xuICAgIHRoaXMuY2FjaGVFeHBpcnkuc2V0KGNhY2hlS2V5LCBEYXRlLm5vdygpICsgdGhpcy5DQUNIRV9EVVJBVElPTik7XG4gIH1cbn1cbiJdfQ==