nuxeo-development-framework 2.0.9 → 3.0.0

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 (133) hide show
  1. package/bundles/nuxeo-development-framework.umd.js +8328 -454
  2. package/bundles/nuxeo-development-framework.umd.js.map +1 -1
  3. package/esm2015/lib/components/activities-log/activities-log/activities-log.component.js +84 -0
  4. package/esm2015/lib/components/activities-log/activities-log/activities-log.service.js +35 -0
  5. package/esm2015/lib/components/activities-log/activities-log.module.js +30 -0
  6. package/esm2015/lib/components/attachment-item/attachment-item/attachment-item.component.js +54 -0
  7. package/esm2015/lib/components/attachment-item/attachment-item.module.js +44 -0
  8. package/esm2015/lib/components/attachment-modal/attachment-modal.module.js +40 -0
  9. package/esm2015/lib/components/attachment-modal/attachments/attachments.component.js +157 -0
  10. package/esm2015/lib/components/confirmation-dialog/confirmation-dialog/confirmation-dialog.component.js +30 -0
  11. package/esm2015/lib/components/confirmation-dialog/confirmation-dialog.module.js +30 -0
  12. package/esm2015/lib/components/display-suitable-icon/display-suitable-icon/display-suitable-icon.component.js +44 -0
  13. package/esm2015/lib/components/display-suitable-icon/display-suitable-icon/icon.service.js +140 -0
  14. package/esm2015/lib/components/display-suitable-icon/display-suitable-icon.module.js +24 -0
  15. package/esm2015/lib/components/dynamic-fields-renderer/dynamic-fields-renderer/dynamic-fields-renderer.component.js +177 -0
  16. package/esm2015/lib/components/dynamic-fields-renderer/dynamic-fields-renderer.module.js +43 -0
  17. package/esm2015/lib/components/dynamic-tabs/dynamic-tabs/dynamic-tabs.component.js +39 -0
  18. package/esm2015/lib/components/dynamic-tabs/dynamic-tabs.module.js +34 -0
  19. package/esm2015/lib/components/file-manger/components/add-to-collection/add-to-collection.component.js +132 -0
  20. package/esm2015/lib/components/file-manger/components/copy/copy.component.js +119 -0
  21. package/esm2015/lib/components/file-manger/components/create-directory/create-directory.component.js +91 -0
  22. package/esm2015/lib/components/file-manger/components/create-modal/create-modal.component.js +455 -0
  23. package/esm2015/lib/components/file-manger/components/creation-type/creation-type.component.js +26 -0
  24. package/esm2015/lib/components/file-manger/components/delete/delete.component.js +77 -0
  25. package/esm2015/lib/components/file-manger/components/folder-modal/folder-modal.component.js +114 -0
  26. package/esm2015/lib/components/file-manger/components/loan-request/loan-request.component.js +80 -0
  27. package/esm2015/lib/components/file-manger/components/move/move.component.js +108 -0
  28. package/esm2015/lib/components/file-manger/components/publish-dialog/publish-dialog.component.js +111 -0
  29. package/esm2015/lib/components/file-manger/components/rename/rename.component.js +86 -0
  30. package/esm2015/lib/components/file-manger/components/scan-modal/scan-modal.component.js +313 -0
  31. package/esm2015/lib/components/file-manger/components/share-dialog/share-dialog.component.js +294 -0
  32. package/esm2015/lib/components/file-manger/components/sidepanel/sidepanel.component.js +256 -0
  33. package/esm2015/lib/components/file-manger/components/template-modal/template-modal.component.js +64 -0
  34. package/esm2015/lib/components/file-manger/components/transfer-doc/transfer-doc.component.js +71 -0
  35. package/esm2015/lib/components/file-manger/components/update-modal/update-modal.component.js +358 -0
  36. package/esm2015/lib/components/file-manger/file-manager.abstract.js +1004 -0
  37. package/esm2015/lib/components/file-manger/file-manger.module.js +275 -0
  38. package/esm2015/lib/components/mutiple-dynamic-form-viewer/multiple-dynamic-form-viewer/multiple-dynamic-form-viewer.component.js +51 -0
  39. package/esm2015/lib/components/mutiple-dynamic-form-viewer/mutiple-dynamic-form-viewer.module.js +30 -0
  40. package/esm2015/lib/components/permissions/add-permissions-dialog/add-permissions-dialog.component.js +177 -0
  41. package/esm2015/lib/components/permissions/permission.service.js +118 -0
  42. package/esm2015/lib/components/permissions/permissions/permissions.component.js +232 -0
  43. package/esm2015/lib/components/permissions/permissions-template/permissions-template.component.js +117 -0
  44. package/esm2015/lib/components/permissions/permissions.module.js +71 -0
  45. package/esm2015/lib/components/select-users-by-department/select-users-by-department.module.js +47 -0
  46. package/esm2015/lib/components/select-users-by-department/select-users-by-departments/department-management.service.js +27 -0
  47. package/esm2015/lib/components/select-users-by-department/select-users-by-departments/select-users-by-departments.component.js +116 -0
  48. package/esm2015/lib/components/user/user/user.component.js +29 -0
  49. package/esm2015/lib/components/user/user.module.js +30 -0
  50. package/esm2015/lib/directive/directive.module.js +9 -4
  51. package/esm2015/lib/directive/drag-and-drop/drag-and-drop.directive.js +46 -0
  52. package/esm2015/lib/shared/libraryShared.module.js +1 -4
  53. package/esm2015/lib/shared-services/dialog-mangment.service.js +61 -0
  54. package/esm2015/lib/shared-services/dynamic-form.service.js +241 -0
  55. package/esm2015/lib/shared-services/file-manager.adapter.js +74 -0
  56. package/esm2015/lib/shared-services/file-manager.service.js +741 -0
  57. package/esm2015/lib/shared-services/global-pdftron.service.js +46 -0
  58. package/esm2015/lib/shared-services/mainfolder.service.js +157 -0
  59. package/esm2015/lib/shared-services/publishing-document.service.js +202 -0
  60. package/esm2015/lib/shared-services/recently-viewed.service.js +57 -0
  61. package/esm2015/lib/shared-services/shared-docs.service.js +135 -0
  62. package/esm2015/lib/shared-services/shared-services.module.js +20 -0
  63. package/esm2015/lib/shared-services/upload-file.service.js +29 -0
  64. package/esm2015/lib/shared-services/upload-managment.service.js +151 -0
  65. package/esm2015/lib/shared-services/user.service.js +54 -0
  66. package/esm2015/public-api.js +64 -1
  67. package/fesm2015/nuxeo-development-framework.js +7621 -153
  68. package/fesm2015/nuxeo-development-framework.js.map +1 -1
  69. package/lib/components/activities-log/activities-log/activities-log.component.d.ts +23 -0
  70. package/lib/components/activities-log/activities-log/activities-log.service.d.ts +9 -0
  71. package/lib/components/activities-log/activities-log.module.d.ts +10 -0
  72. package/lib/components/attachment-item/attachment-item/attachment-item.component.d.ts +21 -0
  73. package/lib/components/attachment-item/attachment-item.module.d.ts +13 -0
  74. package/lib/components/attachment-modal/attachment-modal.module.d.ts +12 -0
  75. package/lib/components/attachment-modal/attachments/attachments.component.d.ts +50 -0
  76. package/lib/components/confirmation-dialog/confirmation-dialog/confirmation-dialog.component.d.ts +12 -0
  77. package/lib/components/confirmation-dialog/confirmation-dialog.module.d.ts +10 -0
  78. package/lib/components/display-suitable-icon/display-suitable-icon/display-suitable-icon.component.d.ts +17 -0
  79. package/lib/components/display-suitable-icon/display-suitable-icon/icon.service.d.ts +8 -0
  80. package/lib/components/display-suitable-icon/display-suitable-icon.module.d.ts +8 -0
  81. package/lib/components/dynamic-fields-renderer/dynamic-fields-renderer/dynamic-fields-renderer.component.d.ts +137 -0
  82. package/lib/components/dynamic-fields-renderer/dynamic-fields-renderer.module.d.ts +12 -0
  83. package/lib/components/dynamic-tabs/dynamic-tabs/dynamic-tabs.component.d.ts +13 -0
  84. package/lib/components/dynamic-tabs/dynamic-tabs.module.d.ts +11 -0
  85. package/lib/components/file-manger/components/add-to-collection/add-to-collection.component.d.ts +31 -0
  86. package/lib/components/file-manger/components/copy/copy.component.d.ts +32 -0
  87. package/lib/components/file-manger/components/create-directory/create-directory.component.d.ts +24 -0
  88. package/lib/components/file-manger/components/create-modal/create-modal.component.d.ts +108 -0
  89. package/lib/components/file-manger/components/creation-type/creation-type.component.d.ts +11 -0
  90. package/lib/components/file-manger/components/delete/delete.component.d.ts +30 -0
  91. package/lib/components/file-manger/components/folder-modal/folder-modal.component.d.ts +56 -0
  92. package/lib/components/file-manger/components/loan-request/loan-request.component.d.ts +23 -0
  93. package/lib/components/file-manger/components/move/move.component.d.ts +32 -0
  94. package/lib/components/file-manger/components/publish-dialog/publish-dialog.component.d.ts +32 -0
  95. package/lib/components/file-manger/components/rename/rename.component.d.ts +25 -0
  96. package/lib/components/file-manger/components/scan-modal/scan-modal.component.d.ts +95 -0
  97. package/lib/components/file-manger/components/share-dialog/share-dialog.component.d.ts +58 -0
  98. package/lib/components/file-manger/components/sidepanel/sidepanel.component.d.ts +62 -0
  99. package/lib/components/file-manger/components/template-modal/template-modal.component.d.ts +34 -0
  100. package/lib/components/file-manger/components/transfer-doc/transfer-doc.component.d.ts +24 -0
  101. package/lib/components/file-manger/components/update-modal/update-modal.component.d.ts +194 -0
  102. package/lib/components/file-manger/file-manager.abstract.d.ts +169 -0
  103. package/lib/components/file-manger/file-manger.module.d.ts +55 -0
  104. package/lib/components/mutiple-dynamic-form-viewer/multiple-dynamic-form-viewer/multiple-dynamic-form-viewer.component.d.ts +17 -0
  105. package/lib/components/mutiple-dynamic-form-viewer/mutiple-dynamic-form-viewer.module.d.ts +10 -0
  106. package/lib/components/permissions/add-permissions-dialog/add-permissions-dialog.component.d.ts +44 -0
  107. package/lib/components/permissions/permission.service.d.ts +21 -0
  108. package/lib/components/permissions/permissions/permissions.component.d.ts +48 -0
  109. package/lib/components/permissions/permissions-template/permissions-template.component.d.ts +22 -0
  110. package/lib/components/permissions/permissions.module.d.ts +21 -0
  111. package/lib/components/select-users-by-department/select-users-by-department.module.d.ts +13 -0
  112. package/lib/components/select-users-by-department/select-users-by-departments/department-management.service.d.ts +10 -0
  113. package/lib/components/select-users-by-department/select-users-by-departments/select-users-by-departments.component.d.ts +33 -0
  114. package/lib/components/user/user/user.component.d.ts +12 -0
  115. package/lib/components/user/user.module.d.ts +10 -0
  116. package/lib/directive/directive.module.d.ts +3 -2
  117. package/lib/directive/drag-and-drop/drag-and-drop.directive.d.ts +11 -0
  118. package/lib/shared/libraryShared.module.d.ts +1 -1
  119. package/lib/shared-services/dialog-mangment.service.d.ts +15 -0
  120. package/lib/shared-services/dynamic-form.service.d.ts +24 -0
  121. package/lib/shared-services/file-manager.adapter.d.ts +48 -0
  122. package/lib/shared-services/file-manager.service.d.ts +89 -0
  123. package/lib/shared-services/global-pdftron.service.d.ts +10 -0
  124. package/lib/shared-services/mainfolder.service.d.ts +29 -0
  125. package/lib/shared-services/publishing-document.service.d.ts +25 -0
  126. package/lib/shared-services/recently-viewed.service.d.ts +17 -0
  127. package/lib/shared-services/shared-docs.service.d.ts +21 -0
  128. package/lib/shared-services/shared-services.module.d.ts +7 -0
  129. package/lib/shared-services/upload-file.service.d.ts +10 -0
  130. package/lib/shared-services/upload-managment.service.d.ts +72 -0
  131. package/lib/shared-services/user.service.d.ts +12 -0
  132. package/package.json +7 -6
  133. package/public-api.d.ts +61 -0
@@ -0,0 +1,741 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { saveAs } from 'file-saver';
3
+ import { combineLatest, EMPTY, from, Observable, of, Subject } from 'rxjs';
4
+ import { catchError, delay, expand, first, map, mergeMap, switchMap, toArray } from 'rxjs/operators';
5
+ import { ConfirmationDialogComponent } from '../components/confirmation-dialog/confirmation-dialog/confirmation-dialog.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../Core/services/callApi/call-api.service";
8
+ import * as i2 from "../Core/adapters/adapter.service";
9
+ import * as i3 from "./file-manager.adapter";
10
+ import * as i4 from "../configuration/app-config.service";
11
+ import * as i5 from "../Core/services/nuxeo/nuxeo.service";
12
+ import * as i6 from "../directive/permissions/evaluators.service";
13
+ import * as i7 from "./mainfolder.service";
14
+ import * as i8 from "@angular/common/http";
15
+ import * as i9 from "../Core/services/translation/translation.service";
16
+ import * as i10 from "../components/custom-toastr/services/custom-toastr.service";
17
+ import * as i11 from "@angular/material/dialog";
18
+ import * as i12 from "@angular/router";
19
+ import * as i13 from "./recently-viewed.service";
20
+ export class FileManagerService {
21
+ constructor(callApi, adapter, environment, fileManagerAdapter, appConfService, nuxeoService, permissionEvaluatorService, mainFolderService, http, translationService, toaster, dialog, router, recentlyViewedService) {
22
+ this.callApi = callApi;
23
+ this.adapter = adapter;
24
+ this.environment = environment;
25
+ this.fileManagerAdapter = fileManagerAdapter;
26
+ this.appConfService = appConfService;
27
+ this.nuxeoService = nuxeoService;
28
+ this.permissionEvaluatorService = permissionEvaluatorService;
29
+ this.mainFolderService = mainFolderService;
30
+ this.http = http;
31
+ this.translationService = translationService;
32
+ this.toaster = toaster;
33
+ this.dialog = dialog;
34
+ this.router = router;
35
+ this.recentlyViewedService = recentlyViewedService;
36
+ this.onRefreshingFileManger = new Subject();
37
+ this.permissionsList = ['canDelete', 'canCreate', 'canDownload', 'canUpdate', 'canPublish', 'canPublishFolders', 'canGet', 'canCopy', 'canCopyFile', 'canDeleteFromSourceParent',
38
+ 'canRenameToSourceParent', 'setSynchronize', 'setUnSynchronize', 'canAddToQuickAccess', 'canShare', 'canRename', 'canMove', 'canMoveFile', 'lockOwnerIfLocked', 'notSecretFile', 'isUserSubscriberToFile', 'canSubscribe'];
39
+ this.userPermittedTypes = [];
40
+ this.userPermittedTypesTotalSize = -1;
41
+ this.userPermittedFilesOnly = [];
42
+ this.isArabic = false;
43
+ // getTreeNodeChildren = (parent) => {
44
+ // let params = {
45
+ // queryParams: parent ? parent : '',
46
+ // pageSize: 50,
47
+ // };
48
+ // // don't refresh all table in case of sorting only
49
+ // return this.callApi.query(
50
+ // {
51
+ // pageProvider: 'tree_children',
52
+ // ...params,
53
+ // },
54
+ // {
55
+ // headers: {
56
+ // properties: '*',
57
+ // 'enrichers-document': 'hasFolderishChild',
58
+ // 'X-NXenrichers-document': 'permissions',
59
+ // },
60
+ // }
61
+ // )
62
+ // };
63
+ this.parseNodeChildren = (observable, parent = true) => {
64
+ return observable.pipe(map((data) => data.entries.map((item) => this.adapter.adaptIn(item, this.fields))), map((entries) => entries.map((item) => this.fileManagerAdapter.treeViewAdapt(item, parent))), mergeMap((entries) => from(entries).pipe(mergeMap((item) => {
65
+ const permissionsCalls = this.permissionsList.map((permission) => {
66
+ return this.permissionEvaluatorService.evaluateRule(permission, { entity: item.entity });
67
+ });
68
+ return combineLatest(permissionsCalls);
69
+ }, (original, detail) => {
70
+ this.permissionsList.forEach((value, index) => {
71
+ original[value] = detail[index];
72
+ });
73
+ }), toArray(), map((entry) => [...entries]))), catchError((err) => {
74
+ throw err;
75
+ }), first())
76
+ .toPromise();
77
+ };
78
+ this.setMyTableConfiguration();
79
+ this.langSubscription = this.translationService.isArabic$.subscribe(res => {
80
+ this.isArabic = res;
81
+ this.userPermittedTypes = this.sortingTypes(this.userPermittedTypes);
82
+ this.userPermittedFilesOnly = this.sortingTypes(this.userPermittedFilesOnly);
83
+ });
84
+ }
85
+ ngOnDestroy() {
86
+ this.langSubscription ? this.langSubscription.unsubscribe() : null;
87
+ }
88
+ setMyTableConfiguration() {
89
+ this.allFilesConfig = this.appConfService.myConfiguration.tables.allFiles;
90
+ this.headers = this.allFilesConfig.headers;
91
+ this.fields = this.allFilesConfig.fields;
92
+ this.pageProvider = this.allFilesConfig.pageProvider;
93
+ }
94
+ sortingTypes(types) {
95
+ if (this.isArabic) {
96
+ types = types.sort((item1, item2) => {
97
+ if (item1['arabicTitle'] > item2['arabicTitle'])
98
+ return 1;
99
+ if (item1['arabicTitle'] < item2['arabicTitle'])
100
+ return -1;
101
+ return 0;
102
+ });
103
+ }
104
+ else {
105
+ types = types.sort((item1, item2) => {
106
+ if (item1['title'] > item2['title'])
107
+ return 1;
108
+ if (item1['title'] < item2['title'])
109
+ return -1;
110
+ return 0;
111
+ });
112
+ }
113
+ return types;
114
+ }
115
+ CreateLoanRequest(input, context, params = {}) {
116
+ return from(this.nuxeoService.nuxeoClient
117
+ .operation('AC_UA_LoanRequest_Create_Records', {
118
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
119
+ })
120
+ .input(input)
121
+ .params(params)
122
+ .context(context)
123
+ .execute()).pipe(catchError((err) => {
124
+ throw err;
125
+ }));
126
+ }
127
+ CreateTransferRequest(input, context, params = {}) {
128
+ return from(this.nuxeoService.nuxeoClient
129
+ .operation('AC_UA_TransferRequest_Create_Records', {
130
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
131
+ })
132
+ .input(input)
133
+ .params(params)
134
+ .context(context)
135
+ .execute()).pipe(catchError((err) => {
136
+ throw err;
137
+ }));
138
+ }
139
+ subscribe_OR_unSubscribeToItem(item, isUserSubscriberToFile) {
140
+ let ToDo = '';
141
+ let confirmDialogMessage = '';
142
+ let successMessage = '';
143
+ let failMessage = '';
144
+ let confirmButtonText = '';
145
+ if (isUserSubscriberToFile) {
146
+ ToDo = 'unsubscribe';
147
+ successMessage = 'unsubscribe_To_Item_success';
148
+ failMessage = 'unsubscribe_To_Item_fail';
149
+ confirmButtonText = "unSubscribe";
150
+ confirmDialogMessage = 'unsubscribeToDocument';
151
+ }
152
+ else {
153
+ ToDo = 'subscribe';
154
+ successMessage = 'subscribe_To_Item_success';
155
+ failMessage = 'subscribe_To_Item_fail';
156
+ confirmDialogMessage = 'subscribeToDocument';
157
+ confirmButtonText = "subscribe";
158
+ }
159
+ const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
160
+ width: '510px',
161
+ data: {
162
+ title: this.translationService.instant("confirmDialog.confirm"),
163
+ message: this.translationService.instant(`confirmDialog.${confirmDialogMessage}`),
164
+ confirmButton: `BUTTONS.${confirmButtonText}`,
165
+ cancelButton: "BUTTONS.Cancel"
166
+ },
167
+ disableClose: true,
168
+ });
169
+ return dialogRef.afterClosed().pipe(switchMap((result) => {
170
+ if (result) {
171
+ return this.subscribeOrUnsubscribeUserToItem(item.uid, ToDo);
172
+ }
173
+ else {
174
+ return of(false);
175
+ }
176
+ }));
177
+ // const dialogRef = this.fuseConfirmationService.open(
178
+ // {
179
+ // dismissible: true,
180
+ // title: this.translationService.instant("confirmDialog.confirm"),
181
+ // message: this.translationService.instant(`confirmDialog.${confirmDialogMessage}`),
182
+ // actions: {
183
+ // confirm: {
184
+ // show: true,
185
+ // label: this.translationService.instant(`BUTTONS.${confirmButtonText}`),
186
+ // color: "warn"
187
+ // },
188
+ // cancel: {
189
+ // show: true,
190
+ // label: this.translationService.instant("BUTTONS.Cancel"),
191
+ // }
192
+ // }
193
+ // }
194
+ // );
195
+ }
196
+ openFile(Data, fileId, dynaimcFormType, searchString = '') {
197
+ this.recentlyViewedService.setIdsInLocalStorage(fileId);
198
+ if (Data) {
199
+ if (Data.includes('image')) {
200
+ //open image viewer
201
+ this.router.navigate([{ outlets: { viewer: ['view', 'image', fileId] } }], {
202
+ queryParams: { location: this.router.url, formType: dynaimcFormType, searchString: searchString },
203
+ });
204
+ }
205
+ else if (Data.includes('video')) {
206
+ this.router.navigate([{ outlets: { viewer: ['view', 'video', fileId] } }], {
207
+ queryParams: { location: this.router.url, formType: dynaimcFormType, searchString: searchString },
208
+ });
209
+ }
210
+ else {
211
+ this.router.navigate([{ outlets: { viewer: ['view', 'file', fileId] } }], {
212
+ queryParams: { location: this.router.url, formType: dynaimcFormType, searchString: searchString },
213
+ });
214
+ }
215
+ this.registerAuditLog(fileId, 'preview');
216
+ }
217
+ }
218
+ registerAuditLog(docId, eventType) {
219
+ this.nuxeoService.nuxeoClient
220
+ .operation('AC_AU_RegisterAuditLog')
221
+ .params({
222
+ "event": eventType
223
+ })
224
+ .input(docId)
225
+ .execute();
226
+ }
227
+ subscribeOrUnsubscribeUserToItem(itemId, ToDo) {
228
+ let api = '';
229
+ if (ToDo === 'subscribe') {
230
+ api = 'Document.Subscribe';
231
+ }
232
+ else if (ToDo === 'unsubscribe') {
233
+ api = 'Document.Unsubscribe';
234
+ }
235
+ return from(this.nuxeoService.nuxeoClient
236
+ .operation(api)
237
+ .input(itemId)
238
+ .execute());
239
+ }
240
+ getUserAcceptedTypes(contentTypee) {
241
+ if (this.userPermittedTypes.length === 0 || this.userPermittedTypesTotalSize === -1 || this.userPermittedTypesTotalSize > this.userPermittedTypes.length || contentTypee) {
242
+ this.userPermittedTypes = [];
243
+ return new Observable(op => {
244
+ let offset = 0, pageSize = 1000;
245
+ this.fetchUserPermittedTypesRecursively(offset, pageSize, op, contentTypee);
246
+ });
247
+ }
248
+ else {
249
+ return of(this.userPermittedTypes);
250
+ }
251
+ }
252
+ fetchUserPermittedTypesRecursively(offset, pageSize, op, contentTypee) {
253
+ let data = [];
254
+ let singlEntry;
255
+ this.callApi.query({
256
+ pageProvider: 'PP_DocumentTypee',
257
+ offset: '' + offset,
258
+ pageSize: '' + pageSize,
259
+ documenttypee_contentTypee: contentTypee
260
+ }, {
261
+ headers: { "properties": "*" },
262
+ }).pipe(map(res => {
263
+ this.userPermittedTypesTotalSize = res === null || res === void 0 ? void 0 : res.totalSize;
264
+ res === null || res === void 0 ? void 0 : res.entries.map(entry => {
265
+ singlEntry = this.adapter.adaptIn(entry, this.fields);
266
+ singlEntry.properties['path'] = entry.path;
267
+ data.push(singlEntry.properties);
268
+ if (singlEntry.properties.contentTypee === 'File') {
269
+ // construct aaray of document file type only to use it in document form builder page
270
+ this.userPermittedFilesOnly.push(singlEntry.properties);
271
+ }
272
+ });
273
+ this.userPermittedTypes.push(...data);
274
+ return this.userPermittedTypes;
275
+ })).subscribe(result => {
276
+ if (this.userPermittedTypesTotalSize > this.userPermittedTypes.length) {
277
+ return this.fetchUserPermittedTypesRecursively(this.userPermittedTypes.length, pageSize, op);
278
+ }
279
+ else {
280
+ // when finish fetching data start sorting it
281
+ this.userPermittedTypes = this.sortingTypes(this.userPermittedTypes);
282
+ this.userPermittedFilesOnly = this.sortingTypes(this.userPermittedFilesOnly);
283
+ }
284
+ return op.next(this.userPermittedTypes);
285
+ }, error => {
286
+ console.error(error);
287
+ return op.error(error);
288
+ });
289
+ }
290
+ refreshUserAcceptedTypes() {
291
+ this.userPermittedTypes = [];
292
+ this.getUserAcceptedTypes().subscribe(res => { });
293
+ }
294
+ checkIfDocumentIsFile(document) {
295
+ if (document.facets.length > 0 && document.facets.indexOf('Folderish') === -1) {
296
+ return 'File';
297
+ }
298
+ else {
299
+ return 'Folder';
300
+ }
301
+ }
302
+ getChildren(id) {
303
+ let params = {
304
+ system_parentId: id,
305
+ system_isTrashed: false,
306
+ pageSize: 500
307
+ };
308
+ return (id == 'root' ? of(this.mainFolderService.get_fileManagerObj_FromLocalStorage()) : this.callApi
309
+ .query(Object.assign({ pageProvider: this.pageProvider }, params), {
310
+ headers: this.headers,
311
+ }))
312
+ .pipe(map((data) => data.entries.map((item) => this.adapter.adaptIn(item, this.fields))), map((entries) => entries.map((item) => this.fileManagerAdapter.adapt(item))), mergeMap((entries) => from(entries).pipe(mergeMap((item) => {
313
+ const permissionsCalls = this.permissionsList.map(permission => {
314
+ return this.permissionEvaluatorService.evaluateRule(permission, { entity: item.entity });
315
+ });
316
+ return combineLatest(permissionsCalls);
317
+ }, (original, detail) => {
318
+ this.permissionsList.forEach((value, index) => {
319
+ original[value] = detail[index];
320
+ });
321
+ }), toArray(), map(entry => ([...entries])))),
322
+ // tap(ent => console.log(ent)),
323
+ catchError((err) => {
324
+ throw err;
325
+ }));
326
+ }
327
+ getChildrenForSharedDocumentRoot(id) {
328
+ let sortObj = {
329
+ "sortBy": "dc:title",
330
+ "sortOrder": "asc",
331
+ "pageSize": 500
332
+ };
333
+ return from(this.nuxeoService.nuxeoClient
334
+ .operation('AC_UA_Document_GetSharesWithMe')
335
+ .params(Object.assign({}, sortObj))
336
+ .execute({
337
+ headers: {
338
+ properties: '*',
339
+ "enrichers-document": "breadcrumb, hasFolderishChild, favorites, thumbnail, collections",
340
+ "X-NXenrichers-document": "tags,permissions",
341
+ "fetch-document": "lock,dc:creator, dc:lastContributor, sharedInfo:sharedList"
342
+ },
343
+ }))
344
+ .pipe(map((data) => {
345
+ data.entries.map((item) => this.adapter.adaptIn(item, this.fields));
346
+ this.sharedFiles = data;
347
+ return data.entries;
348
+ }), map((entries) => entries.map((item) => this.fileManagerAdapter.adapt(item))), mergeMap((entries) => from(entries).pipe(mergeMap((item) => {
349
+ const permissionsCalls = this.permissionsList.map(permission => {
350
+ return this.permissionEvaluatorService.evaluateRule(permission, { entity: item.entity });
351
+ });
352
+ return combineLatest(permissionsCalls);
353
+ }, (original, detail) => {
354
+ this.permissionsList.forEach((value, index) => {
355
+ original[value] = detail[index];
356
+ });
357
+ }), toArray(), map(entry => ([...entries])))),
358
+ // tap(ent => console.log(ent)),
359
+ catchError((err) => {
360
+ throw err;
361
+ }));
362
+ }
363
+ refreshData(id) {
364
+ let params = {
365
+ system_parentId: id,
366
+ system_isTrashed: false,
367
+ offset: 0,
368
+ currentPageIndex: 0,
369
+ pageSize: 500,
370
+ };
371
+ return (id == 'root' ? this.mainFolderService.save_fileManagerObj_ToLocalStorage(true) : this.callApi
372
+ .query(Object.assign({ pageProvider: 'PP_Document_Content_DB' }, params), {
373
+ headers: this.headers,
374
+ }))
375
+ .pipe(map((data) => data.entries.map((item) => this.adapter.adaptIn(item, this.fields))), map((entries) => entries.map((item) => this.fileManagerAdapter.adapt(item))), mergeMap((entries) => from(entries).pipe(mergeMap((item) => {
376
+ const permissionsCalls = this.permissionsList.map(permission => {
377
+ return this.permissionEvaluatorService.evaluateRule(permission, { entity: item.entity });
378
+ });
379
+ return combineLatest(permissionsCalls);
380
+ }, (original, detail) => {
381
+ this.permissionsList.forEach((value, index) => {
382
+ original[value] = detail[index];
383
+ });
384
+ }), toArray(), map(entry => ([...entries])))),
385
+ // tap(ent => console.log(ent)),
386
+ catchError((err) => {
387
+ throw err;
388
+ }));
389
+ }
390
+ createFolder(params, id) {
391
+ return from(this.nuxeoService.nuxeoClient
392
+ .operation('Document.DynamicRegister', {
393
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
394
+ })
395
+ .params(Object.assign({}, params))
396
+ .input(id)
397
+ .execute()).pipe(catchError((err) => {
398
+ throw err;
399
+ }));
400
+ }
401
+ createDirectory(params, id) {
402
+ return from(this.nuxeoService.nuxeoClient
403
+ .operation('Document.Create', {
404
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
405
+ })
406
+ .params({
407
+ type: "Folder",
408
+ name: params.title,
409
+ properties: this.adapter.adaptOut(params, this.fields),
410
+ })
411
+ .input(id)
412
+ .execute()).pipe(catchError((err) => {
413
+ throw err;
414
+ }));
415
+ }
416
+ UpdateFolder(params, id) {
417
+ return from(this.nuxeoService.nuxeoClient
418
+ .operation('Document.Update', {
419
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
420
+ })
421
+ .params(Object.assign({}, params))
422
+ .input(id)
423
+ .execute()).pipe(catchError((err) => {
424
+ throw err;
425
+ }));
426
+ }
427
+ deleteFolder(folderId) {
428
+ return from(this.nuxeoService.nuxeoClient
429
+ .operation('Document.Trash', { url: `${this.environment.nuxeo}${this.environment.customAutomation}` })
430
+ .input(`docs:${folderId}`)
431
+ .execute()).pipe(catchError((err) => {
432
+ throw err;
433
+ }));
434
+ }
435
+ addToCollection(id, collectionId) {
436
+ return from(this.nuxeoService.nuxeoClient
437
+ .operation('Document.AddToCollection', {
438
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
439
+ })
440
+ .params({
441
+ collection: collectionId
442
+ })
443
+ .input(`docs:${id}`)
444
+ .execute()).pipe(catchError((err) => {
445
+ throw err;
446
+ }));
447
+ }
448
+ renameFolder(body, id) {
449
+ return from(this.nuxeoService.nuxeoClient
450
+ .operation('AC_UA_Document_Rename', {
451
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
452
+ })
453
+ .params({
454
+ name: body.title
455
+ })
456
+ .input(id)
457
+ .execute()).pipe(catchError((err) => {
458
+ throw err;
459
+ }));
460
+ }
461
+ createFile(payload, id) {
462
+ return from(this.nuxeoService.nuxeoClient
463
+ .operation('Document.DynamicRegister', {
464
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
465
+ })
466
+ .params(Object.assign({}, payload.params))
467
+ .input(id)
468
+ .execute()).pipe(catchError(error => of({ status: 'failed', originFile: payload.originFile })));
469
+ }
470
+ createNewCollection(name) {
471
+ return from(this.nuxeoService.nuxeoClient
472
+ .operation('Collection.Create', {
473
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
474
+ })
475
+ .params({
476
+ name: name,
477
+ description: "New Collection Test"
478
+ })
479
+ .execute()).pipe(catchError((err) => {
480
+ throw err;
481
+ }));
482
+ }
483
+ copyTo(destination, id) {
484
+ return from(this.nuxeoService.nuxeoClient
485
+ .operation('Document.Copy', {
486
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
487
+ })
488
+ .params({
489
+ target: destination.id,
490
+ name: destination.name
491
+ })
492
+ .input(`docs:${id}`)
493
+ .execute()).pipe(catchError((err) => {
494
+ throw err;
495
+ }));
496
+ }
497
+ moveTo(destination, id) {
498
+ return from(this.nuxeoService.nuxeoClient
499
+ .operation('Document.Move', {
500
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
501
+ })
502
+ .params({
503
+ target: destination.id
504
+ })
505
+ .input(`docs:${id}`)
506
+ .execute()).pipe(catchError((err) => {
507
+ throw err;
508
+ }));
509
+ }
510
+ getCollectionSuggestion(term) {
511
+ return from(this.nuxeoService.nuxeoClient
512
+ .operation('Collection.Suggestion', {
513
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
514
+ })
515
+ .params({
516
+ "currentPageIndex": "0",
517
+ "pageSize": "10",
518
+ searchTerm: term
519
+ })
520
+ .execute()).pipe(catchError((err) => {
521
+ throw err;
522
+ }));
523
+ }
524
+ getCollectionFromPP(searchTerm) {
525
+ return this.callApi.query({
526
+ pageProvider: 'PP_DMS_User_Collections',
527
+ queryParams: `%${searchTerm}%`,
528
+ sortBy: "dc:modified",
529
+ sortOrder: "desc",
530
+ currentPageIndex: 0,
531
+ offset: 0,
532
+ pageSize: 40,
533
+ }, {
534
+ headers: {
535
+ "X-NXproperties": "*",
536
+ }
537
+ });
538
+ }
539
+ setSync(id) {
540
+ return from(this.nuxeoService.nuxeoClient
541
+ .operation('NuxeoDrive.SetSynchronization', {
542
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
543
+ })
544
+ .params({ enable: true })
545
+ .input(`${id}`)
546
+ .execute()).pipe(catchError((err) => {
547
+ throw err;
548
+ }));
549
+ }
550
+ unSetSync(id) {
551
+ return from(this.nuxeoService.nuxeoClient
552
+ .operation('NuxeoDrive.SetSynchronization', {
553
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
554
+ })
555
+ .params({ enable: false })
556
+ .input(`${id}`)
557
+ .execute()).pipe(catchError((err) => {
558
+ throw err;
559
+ }));
560
+ }
561
+ addToFavorites(id) {
562
+ return from(this.nuxeoService.nuxeoClient
563
+ .operation('Document.AddToFavorites', {
564
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
565
+ })
566
+ .params({})
567
+ .input(`docs:${id}`)
568
+ .execute()).pipe(catchError((err) => {
569
+ throw err;
570
+ }));
571
+ }
572
+ defineNewPerson(title, titleEn, ids) {
573
+ return from(this.nuxeoService.nuxeoClient
574
+ .operation('Document.DefineNewPerson', {
575
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
576
+ })
577
+ .params({
578
+ title_ar: title,
579
+ title_en: titleEn
580
+ })
581
+ .input(`docs:${ids}`)
582
+ .execute()).pipe(catchError((err) => {
583
+ throw err;
584
+ }));
585
+ }
586
+ addToQuickAccess(id) {
587
+ return from(this.nuxeoService.nuxeoClient
588
+ .operation('AC_UA_Collection_AddDocumentToQuickAccess', {
589
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
590
+ })
591
+ .params({})
592
+ .input(`${id}`)
593
+ .execute()).pipe(catchError((err) => {
594
+ throw err;
595
+ }));
596
+ }
597
+ removeFromQuickAccess(id) {
598
+ return from(this.nuxeoService.nuxeoClient
599
+ .operation('AC_UA_Collection_RemoveDocumentFromQuickAccess', {
600
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
601
+ })
602
+ .params({})
603
+ .input(`${id}`)
604
+ .execute()).pipe(catchError((err) => {
605
+ throw err;
606
+ }));
607
+ }
608
+ removeFromFavorites(id) {
609
+ return from(this.nuxeoService.nuxeoClient
610
+ .operation('Document.RemoveFromFavorites', {
611
+ url: `${this.environment.nuxeo}${this.environment.customAutomation}`,
612
+ })
613
+ .params({})
614
+ .input(`docs:${id}`)
615
+ .execute()).pipe(catchError((err) => {
616
+ throw err;
617
+ }));
618
+ }
619
+ getFolder(uid) {
620
+ return from(this.nuxeoService.nuxeoClient
621
+ .repository()
622
+ .headers({
623
+ "properties": "*",
624
+ "enrichers-document": "hasFolderishChild, favorites, breadcrumb",
625
+ "X-NXenrichers-document": "permissions",
626
+ })
627
+ .fetch(uid)).pipe(map((data) => {
628
+ return data;
629
+ }), catchError((err) => {
630
+ throw err;
631
+ }));
632
+ }
633
+ getLogs(id, pageIndex = 0, pageSize = 5) {
634
+ const path = 'id/' + id + '/@audit';
635
+ return from(this.nuxeoService.nuxeoClient.request(path)
636
+ .queryParams({
637
+ currentPageIndex: pageIndex,
638
+ pageSize: pageSize
639
+ })
640
+ .get({
641
+ headers: {
642
+ "properties": "*"
643
+ }
644
+ }))
645
+ .pipe(catchError((err) => {
646
+ throw err;
647
+ }));
648
+ }
649
+ getFileSchemas(type) {
650
+ return from(this.nuxeoService.nuxeoClient.request(`config/types/${type}`)
651
+ .get({
652
+ headers: {
653
+ 'fetch.schema': 'fields'
654
+ }
655
+ })).pipe(map((data) => {
656
+ if (data.schemas) {
657
+ return data.schemas;
658
+ }
659
+ else {
660
+ return [];
661
+ }
662
+ }));
663
+ }
664
+ downloadAsZip(selectedItems, fileTitle) {
665
+ let location = '';
666
+ this.toaster.show('notification', 'TOASTER.SUCCESS', "TOASTER.preparingDownloadAsZip", {
667
+ timeOut: 2500
668
+ });
669
+ let title = (fileTitle) ? fileTitle : `selection-${Date.now()}`;
670
+ title = (title.indexOf('.') > -1) ? title.substring(0, title.indexOf('.')) : title;
671
+ const endpoint = `${this.environment.nuxeo}/api/v1/automation/Blob.BulkDownload/@async`;
672
+ return this.http
673
+ .post(endpoint, {
674
+ params: {
675
+ filename: 'selection.zip'
676
+ },
677
+ input: `docs:${selectedItems}`
678
+ }, {
679
+ observe: 'response',
680
+ }).pipe(switchMap(res => {
681
+ location = res.headers.get('location');
682
+ return this.http.get(location, {
683
+ responseType: 'blob'
684
+ });
685
+ })).pipe(expand(res => (res.type === 'application/json') ?
686
+ this.http.get(location, {
687
+ responseType: 'blob'
688
+ }).pipe(delay(5000))
689
+ : EMPTY)).subscribe(res => {
690
+ if (res.type === 'application/zip') {
691
+ this.toaster.show('notification', 'TOASTER.SUCCESS', "TOASTER.DownloadAsZip", {
692
+ timeOut: 1000
693
+ });
694
+ let binaryData = [];
695
+ binaryData.push(res);
696
+ let blob = new Blob(binaryData, { type: res.type });
697
+ saveAs(blob, `${title}.zip`);
698
+ }
699
+ });
700
+ }
701
+ createTreeNodeChildren(parent) {
702
+ let params = {
703
+ queryParams: parent,
704
+ pageSize: 50,
705
+ };
706
+ // don't refresh all table in case of sorting only
707
+ return this.callApi
708
+ .query(Object.assign({ pageProvider: 'tree_children' }, params), {
709
+ headers: {
710
+ properties: '*',
711
+ 'enrichers-document': 'hasFolderishChild',
712
+ 'X-NXenrichers-document': 'permissions',
713
+ },
714
+ })
715
+ .pipe(map((data) => data.entries.map((item) => this.adapter.adaptIn(item, this.fields))), map((entries) => entries.map((item) => this.fileManagerAdapter.treeViewAdapt(item))), mergeMap((entries) => from(entries).pipe(mergeMap((item) => {
716
+ const permissionsCalls = this.permissionsList.map((permission) => {
717
+ return this.permissionEvaluatorService.evaluateRule(permission, { entity: item.entity });
718
+ });
719
+ return combineLatest(permissionsCalls);
720
+ }, (original, detail) => {
721
+ this.permissionsList.forEach((value, index) => {
722
+ original[value] = detail[index];
723
+ });
724
+ }), toArray(), map((entry) => [...entries]))), catchError((err) => {
725
+ throw err;
726
+ }), first())
727
+ .toPromise();
728
+ }
729
+ }
730
+ FileManagerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FileManagerService, deps: [{ token: i1.CallApiService }, { token: i2.AdapterService }, { token: 'environment' }, { token: i3.FileManagerAdapter }, { token: i4.AppConfigService }, { token: i5.NuxeoService }, { token: i6.EvaluatorsService }, { token: i7.MainfolderService }, { token: i8.HttpClient }, { token: i9.TranslationService }, { token: i10.CustomToastrService }, { token: i11.MatDialog }, { token: i12.Router }, { token: i13.RecentlyViewedService }], target: i0.ɵɵFactoryTarget.Injectable });
731
+ FileManagerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FileManagerService, providedIn: 'root' });
732
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FileManagerService, decorators: [{
733
+ type: Injectable,
734
+ args: [{
735
+ providedIn: 'root'
736
+ }]
737
+ }], ctorParameters: function () { return [{ type: i1.CallApiService }, { type: i2.AdapterService }, { type: undefined, decorators: [{
738
+ type: Inject,
739
+ args: ['environment']
740
+ }] }, { type: i3.FileManagerAdapter }, { type: i4.AppConfigService }, { type: i5.NuxeoService }, { type: i6.EvaluatorsService }, { type: i7.MainfolderService }, { type: i8.HttpClient }, { type: i9.TranslationService }, { type: i10.CustomToastrService }, { type: i11.MatDialog }, { type: i12.Router }, { type: i13.RecentlyViewedService }]; } });
741
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9zaGFyZWQtc2VydmljZXMvZmlsZS1tYW5hZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQU8sT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFTMUcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0scUZBQXFGLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVNsSSxNQUFNLE9BQU8sa0JBQWtCO0lBZTdCLFlBQW9CLE9BQXVCLEVBQ2pDLE9BQXVCLEVBQ0EsV0FBVyxFQUNsQyxrQkFBc0MsRUFDdEMsY0FBZ0MsRUFDaEMsWUFBMEIsRUFDMUIsMEJBQTZDLEVBQzdDLGlCQUFvQyxFQUNwQyxJQUFnQixFQUNoQixrQkFBdUMsRUFDdkMsT0FBNEIsRUFDNUIsTUFBa0IsRUFDbEIsTUFBZSxFQUNmLHFCQUE2QztRQWJuQyxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUNqQyxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUNBLGdCQUFXLEdBQVgsV0FBVyxDQUFBO1FBQ2xDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsbUJBQWMsR0FBZCxjQUFjLENBQWtCO1FBQ2hDLGlC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LFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2YsTUFBTSxHQUFHLENBQUM7UUFDZCxDQUFDLENBQUMsRUFDRixLQUFLLEVBQUUsQ0FDVjthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7OytHQWo5QlUsa0JBQWtCLDhFQWlCbkIsYUFBYTttSEFqQlosa0JBQWtCLGNBSGpCLE1BQU07MkZBR1Asa0JBQWtCO2tCQUo5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBbUJJLE1BQU07MkJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZpbGVNYW5hZ2VyQWRhcHRlciB9IGZyb20gJy4vZmlsZS1tYW5hZ2VyLmFkYXB0ZXInO1xyXG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcclxuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgRU1QVFksIGZyb20sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpYmVyLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGVsYXksIGV4cGFuZCwgZmlyc3QsIG1hcCwgbWVyZ2VNYXAsIHN3aXRjaE1hcCwgdGFwLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNYWluZm9sZGVyU2VydmljZSB9IGZyb20gJy4vbWFpbmZvbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2FsbEFwaVNlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3NlcnZpY2VzL2NhbGxBcGkvY2FsbC1hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IEFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vQ29yZS9hZGFwdGVycy9hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOdXhlb1NlcnZpY2UgfSBmcm9tICcuLi9Db3JlL3NlcnZpY2VzL251eGVvL251eGVvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcHBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbi9hcHAtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFdmFsdWF0b3JzU2VydmljZSB9IGZyb20gJy4uL2RpcmVjdGl2ZS9wZXJtaXNzaW9ucy9ldmFsdWF0b3JzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21Ub2FzdHJTZXJ2aWNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jdXN0b20tdG9hc3RyL3NlcnZpY2VzL2N1c3RvbS10b2FzdHIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uL0NvcmUvc2VydmljZXMvdHJhbnNsYXRpb24vdHJhbnNsYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgUmVjZW50bHlWaWV3ZWRTZXJ2aWNlIH0gZnJvbSAnLi9yZWNlbnRseS12aWV3ZWQuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZU1hbmFnZXJTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95e1xyXG4gIHBhZ2VQcm92aWRlcjogYW55O1xyXG4gIGhlYWRlcnM6IGFueTtcclxuICBmaWVsZHM6IGFueTtcclxuICBhbGxGaWxlc0NvbmZpZztcclxuICBzZWxlY3RlZEZvbGRlcklkO1xyXG4gIG9uUmVmcmVzaGluZ0ZpbGVNYW5nZXIgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcGVybWlzc2lvbnNMaXN0ID0gWydjYW5EZWxldGUnLCAnY2FuQ3JlYXRlJywgJ2NhbkRvd25sb2FkJywgJ2NhblVwZGF0ZScsICdjYW5QdWJsaXNoJywnY2FuUHVibGlzaEZvbGRlcnMnICwnY2FuR2V0JywgJ2NhbkNvcHknLCAnY2FuQ29weUZpbGUnLCAnY2FuRGVsZXRlRnJvbVNvdXJjZVBhcmVudCcsXHJcbiAgICAnY2FuUmVuYW1lVG9Tb3VyY2VQYXJlbnQnLCAnc2V0U3luY2hyb25pemUnLCAnc2V0VW5TeW5jaHJvbml6ZScsICdjYW5BZGRUb1F1aWNrQWNjZXNzJywgJ2NhblNoYXJlJywgJ2NhblJlbmFtZScsICdjYW5Nb3ZlJywgJ2Nhbk1vdmVGaWxlJywgJ2xvY2tPd25lcklmTG9ja2VkJywgJ25vdFNlY3JldEZpbGUnLCAnaXNVc2VyU3Vic2NyaWJlclRvRmlsZScsICdjYW5TdWJzY3JpYmUnXTtcclxuICB1c2VyUGVybWl0dGVkVHlwZXMgOiBhbnlbXSA9IFtdO1xyXG4gIHVzZXJQZXJtaXR0ZWRUeXBlc1RvdGFsU2l6ZSA9IC0xO1xyXG4gIHVzZXJQZXJtaXR0ZWRGaWxlc09ubHkgOiBhbnlbXSA9IFtdO1xyXG4gIHNoYXJlZEZpbGVzO1xyXG4gIGlzQXJhYmljID0gZmFsc2U7XHJcbiAgbGFuZ1N1YnNjcmlwdGlvbiA6IFN1YnNjcmlwdGlvbjtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhbGxBcGk6IENhbGxBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhZGFwdGVyOiBBZGFwdGVyU2VydmljZSxcclxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudCxcclxuICAgIHByaXZhdGUgZmlsZU1hbmFnZXJBZGFwdGVyOiBGaWxlTWFuYWdlckFkYXB0ZXIsXHJcbiAgICBwcml2YXRlIGFwcENvbmZTZXJ2aWNlOiBBcHBDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBudXhlb1NlcnZpY2U6IE51eGVvU2VydmljZSxcclxuICAgIHByaXZhdGUgcGVybWlzc2lvbkV2YWx1YXRvclNlcnZpY2U6IEV2YWx1YXRvcnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtYWluRm9sZGVyU2VydmljZTogTWFpbmZvbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZSA6IFRyYW5zbGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RlcjogQ3VzdG9tVG9hc3RyU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nIDogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXIgOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlY2VudGx5Vmlld2VkU2VydmljZSA6IFJlY2VudGx5Vmlld2VkU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5zZXRNeVRhYmxlQ29uZmlndXJhdGlvbigpO1xyXG4gICAgdGhpcy5sYW5nU3Vic2NyaXB0aW9uID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuaXNBcmFiaWMkLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB0aGlzLmlzQXJhYmljID0gcmVzIDtcclxuICAgICAgdGhpcy51c2VyUGVybWl0dGVkVHlwZXMgPSB0aGlzLnNvcnRpbmdUeXBlcyh0aGlzLnVzZXJQZXJtaXR0ZWRUeXBlcyk7XHJcbiAgICAgIHRoaXMudXNlclBlcm1pdHRlZEZpbGVzT25seSA9IHRoaXMuc29ydGluZ1R5cGVzKHRoaXMudXNlclBlcm1pdHRlZEZpbGVzT25seSk7XHJcbiAgICB9KVxyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMubGFuZ1N1YnNjcmlwdGlvbiA/IHRoaXMubGFuZ1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpIDogbnVsbDtcclxuICB9XHJcbiAgc2V0TXlUYWJsZUNvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICB0aGlzLmFsbEZpbGVzQ29uZmlnID0gdGhpcy5hcHBDb25mU2VydmljZS5teUNvbmZpZ3VyYXRpb24udGFibGVzLmFsbEZpbGVzO1xyXG4gICAgdGhpcy5oZWFkZXJzID0gdGhpcy5hbGxGaWxlc0NvbmZpZy5oZWFkZXJzO1xyXG4gICAgdGhpcy5maWVsZHMgPSB0aGlzLmFsbEZpbGVzQ29uZmlnLmZpZWxkcztcclxuICAgIHRoaXMucGFnZVByb3ZpZGVyID0gdGhpcy5hbGxGaWxlc0NvbmZpZy5wYWdlUHJvdmlkZXI7XHJcblxyXG4gIH1cclxuXHJcbiAgc29ydGluZ1R5cGVzKHR5cGVzKXtcclxuICAgIGlmKHRoaXMuaXNBcmFiaWMpe1xyXG4gICAgICB0eXBlcyA9IHR5cGVzLnNvcnQoKGl0ZW0xLGl0ZW0yKSA9PiB7XHJcbiAgICAgICAgaWYoaXRlbTFbJ2FyYWJpY1RpdGxlJ10gPiBpdGVtMlsnYXJhYmljVGl0bGUnXSkgcmV0dXJuIDE7XHJcbiAgICAgICAgaWYoaXRlbTFbJ2FyYWJpY1RpdGxlJ10gPCBpdGVtMlsnYXJhYmljVGl0bGUnXSkgcmV0dXJuIC0xO1xyXG4gICAgICAgIHJldHVybiAwO1xyXG5cclxuICAgICAgfSk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdHlwZXMgPSB0eXBlcy5zb3J0KChpdGVtMSxpdGVtMikgPT4ge1xyXG4gICAgICAgIGlmKGl0ZW0xWyd0aXRsZSddID4gaXRlbTJbJ3RpdGxlJ10pIHJldHVybiAxO1xyXG4gICAgICAgIGlmKGl0ZW0xWyd0aXRsZSddIDwgaXRlbTJbJ3RpdGxlJ10pIHJldHVybiAtMTtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHlwZXM7XHJcbiAgfVxyXG5cclxuICBDcmVhdGVMb2FuUmVxdWVzdChpbnB1dCwgY29udGV4dCwgcGFyYW1zID0ge30pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgdGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnRcclxuICAgICAgICAgICAgLm9wZXJhdGlvbignQUNfVUFfTG9hblJlcXVlc3RfQ3JlYXRlX1JlY29yZHMnLCB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IGAke3RoaXMuZW52aXJvbm1lbnQubnV4ZW99JHt0aGlzLmVudmlyb25tZW50LmN1c3RvbUF1dG9tYXRpb259YCxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmlucHV0KGlucHV0KVxyXG4gICAgICAgICAgICAucGFyYW1zKHBhcmFtcylcclxuICAgICAgICAgICAgLmNvbnRleHQoY29udGV4dClcclxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxyXG4gICAgKS5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbn1cclxuXHJcbkNyZWF0ZVRyYW5zZmVyUmVxdWVzdChpbnB1dCwgY29udGV4dCwgcGFyYW1zID0ge30pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudFxyXG4gICAgICAgICAgLm9wZXJhdGlvbignQUNfVUFfVHJhbnNmZXJSZXF1ZXN0X0NyZWF0ZV9SZWNvcmRzJywge1xyXG4gICAgICAgICAgICAgIHVybDogYCR7dGhpcy5lbnZpcm9ubWVudC5udXhlb30ke3RoaXMuZW52aXJvbm1lbnQuY3VzdG9tQXV0b21hdGlvbn1gLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5pbnB1dChpbnB1dClcclxuICAgICAgICAgIC5wYXJhbXMocGFyYW1zKVxyXG4gICAgICAgICAgLmNvbnRleHQoY29udGV4dClcclxuICAgICAgICAgIC5leGVjdXRlKClcclxuICApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICk7XHJcbn1cclxuXHJcbnN1YnNjcmliZV9PUl91blN1YnNjcmliZVRvSXRlbShpdGVtLCBpc1VzZXJTdWJzY3JpYmVyVG9GaWxlKSB7XHJcbiAgbGV0IFRvRG8gPSAnJztcclxuICBsZXQgY29uZmlybURpYWxvZ01lc3NhZ2UgPSAnJztcclxuICBsZXQgc3VjY2Vzc01lc3NhZ2UgPSAnJztcclxuICBsZXQgZmFpbE1lc3NhZ2UgPSAnJztcclxuICBsZXQgY29uZmlybUJ1dHRvblRleHQgPSAnJztcclxuICBpZiAoaXNVc2VyU3Vic2NyaWJlclRvRmlsZSkge1xyXG4gICAgICBUb0RvID0gJ3Vuc3Vic2NyaWJlJztcclxuICAgICAgc3VjY2Vzc01lc3NhZ2UgPSAndW5zdWJzY3JpYmVfVG9fSXRlbV9zdWNjZXNzJztcclxuICAgICAgZmFpbE1lc3NhZ2UgPSAndW5zdWJzY3JpYmVfVG9fSXRlbV9mYWlsJztcclxuICAgICAgY29uZmlybUJ1dHRvblRleHQgPSBcInVuU3Vic2NyaWJlXCI7XHJcbiAgICAgIGNvbmZpcm1EaWFsb2dNZXNzYWdlID0gJ3Vuc3Vic2NyaWJlVG9Eb2N1bWVudCc7XHJcblxyXG4gIH0gZWxzZSB7XHJcbiAgICAgIFRvRG8gPSAnc3Vic2NyaWJlJztcclxuICAgICAgc3VjY2Vzc01lc3NhZ2UgPSAnc3Vic2NyaWJlX1RvX0l0ZW1fc3VjY2Vzcyc7XHJcbiAgICAgIGZhaWxNZXNzYWdlID0gJ3N1YnNjcmliZV9Ub19JdGVtX2ZhaWwnO1xyXG4gICAgICBjb25maXJtRGlhbG9nTWVzc2FnZSA9ICdzdWJzY3JpYmVUb0RvY3VtZW50JztcclxuICAgICAgY29uZmlybUJ1dHRvblRleHQgPSBcInN1YnNjcmliZVwiO1xyXG5cclxuICB9XHJcbiAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQgLCB7XHJcbiAgICB3aWR0aDogJzUxMHB4JyxcclxuICAgIGRhdGE6IHtcclxuICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuaW5zdGFudChcImNvbmZpcm1EaWFsb2cuY29uZmlybVwiKSxcclxuICAgICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5pbnN0YW50KGBjb25maXJtRGlhbG9nLiR7Y29uZmlybURpYWxvZ01lc3NhZ2V9YCksXHJcbiAgICAgICAgY29uZmlybUJ1dHRvbiA6IGBCVVRUT05TLiR7Y29uZmlybUJ1dHRvblRleHR9YCxcclxuICAgICAgICBjYW5jZWxCdXR0b24gOiBcIkJVVFRPTlMuQ2FuY2VsXCJcclxuICAgIH0sXHJcbiAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgfSlcclxuICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkucGlwZShzd2l0Y2hNYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmVPclVuc3Vic2NyaWJlVXNlclRvSXRlbShpdGVtLnVpZCwgVG9EbylcclxuICAgIH1lbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKGZhbHNlKVxyXG4gICAgfVxyXG59KSlcclxuICAvLyBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmZ1c2VDb25maXJtYXRpb25TZXJ2aWNlLm9wZW4oXHJcbiAgLy8gICAgIHtcclxuICAvLyAgICAgICAgIGRpc21pc3NpYmxlOiB0cnVlLFxyXG4gIC8vICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmluc3RhbnQoXCJjb25maXJtRGlhbG9nLmNvbmZpcm1cIiksXHJcbiAgLy8gICAgICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5pbnN0YW50KGBjb25maXJtRGlhbG9nLiR7Y29uZmlybURpYWxvZ01lc3NhZ2V9YCksXHJcbiAgLy8gICAgICAgICBhY3Rpb25zOiB7XHJcbiAgLy8gICAgICAgICAgICAgY29uZmlybToge1xyXG4gIC8vICAgICAgICAgICAgICAgICBzaG93OiB0cnVlLFxyXG4gIC8vICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuaW5zdGFudChgQlVUVE9OUy4ke2NvbmZpcm1CdXR0b25UZXh0fWApLFxyXG4gIC8vICAgICAgICAgICAgICAgICBjb2xvcjogXCJ3YXJuXCJcclxuICAvLyAgICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICAgIGNhbmNlbDoge1xyXG4gIC8vICAgICAgICAgICAgICAgICBzaG93OiB0cnVlLFxyXG4gIC8vICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuaW5zdGFudChcIkJVVFRPTlMuQ2FuY2VsXCIpLFxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICk7XHJcblxyXG59XHJcblxyXG5vcGVuRmlsZShEYXRhLCBmaWxlSWQsIGR5bmFpbWNGb3JtVHlwZT86ICcnICwgc2VhcmNoU3RyaW5nIDogc3RyaW5nID0gJycpIHtcclxuICB0aGlzLnJlY2VudGx5Vmlld2VkU2VydmljZS5zZXRJZHNJbkxvY2FsU3RvcmFnZShmaWxlSWQpO1xyXG4gIGlmIChEYXRhKSB7XHJcbiAgICAgIGlmIChEYXRhLmluY2x1ZGVzKCdpbWFnZScpKSB7XHJcbiAgICAgICAgICAvL29wZW4gaW1hZ2Ugdmlld2VyXHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcclxuICAgICAgICAgICAgICBbeyBvdXRsZXRzOiB7IHZpZXdlcjogWyd2aWV3JywgJ2ltYWdlJywgZmlsZUlkXSB9IH1dLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgbG9jYXRpb246IHRoaXMucm91dGVyLnVybCwgZm9ybVR5cGU6IGR5bmFpbWNGb3JtVHlwZSAsIHNlYXJjaFN0cmluZyA6IHNlYXJjaFN0cmluZ30sXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIGlmIChEYXRhLmluY2x1ZGVzKCd2aWRlbycpKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcclxuICAgICAgICAgICAgICBbeyBvdXRsZXRzOiB7IHZpZXdlcjogWyd2aWV3JywgJ3ZpZGVvJywgZmlsZUlkXSB9IH1dLFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgbG9jYXRpb246IHRoaXMucm91dGVyLnVybCwgZm9ybVR5cGU6IGR5bmFpbWNGb3JtVHlwZSAsIHNlYXJjaFN0cmluZyA6IHNlYXJjaFN0cmluZ30sXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxyXG4gICAgICAgICAgICAgIFt7IG91dGxldHM6IHsgdmlld2VyOiBbJ3ZpZXcnLCAnZmlsZScsIGZpbGVJZF0gfSB9XSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGxvY2F0aW9uOiB0aGlzLnJvdXRlci51cmwsIGZvcm1UeXBlOiBkeW5haW1jRm9ybVR5cGUgLCBzZWFyY2hTdHJpbmcgOiBzZWFyY2hTdHJpbmd9LFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZWdpc3RlckF1ZGl0TG9nKGZpbGVJZCwgJ3ByZXZpZXcnKVxyXG4gIH1cclxufVxyXG5cclxucmVnaXN0ZXJBdWRpdExvZyhkb2NJZCwgZXZlbnRUeXBlKSB7XHJcbiAgdGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnRcclxuICAgICAgLm9wZXJhdGlvbignQUNfQVVfUmVnaXN0ZXJBdWRpdExvZycpXHJcbiAgICAgIC5wYXJhbXMoe1xyXG4gICAgICAgICAgXCJldmVudFwiOiBldmVudFR5cGVcclxuICAgICAgfSlcclxuICAgICAgLmlucHV0KGRvY0lkKVxyXG4gICAgICAuZXhlY3V0ZSgpXHJcbn1cclxuXHJcbnN1YnNjcmliZU9yVW5zdWJzY3JpYmVVc2VyVG9JdGVtKGl0ZW1JZCwgVG9Ebykge1xyXG4gIGxldCBhcGkgPSAnJztcclxuICBpZiAoVG9EbyA9PT0gJ3N1YnNjcmliZScpIHtcclxuICAgICAgYXBpID0gJ0RvY3VtZW50LlN1YnNjcmliZSdcclxuICB9IGVsc2UgaWYgKFRvRG8gPT09ICd1bnN1YnNjcmliZScpIHtcclxuICAgICAgYXBpID0gJ0RvY3VtZW50LlVuc3Vic2NyaWJlJ1xyXG4gIH1cclxuICByZXR1cm4gZnJvbShcclxuICAgICAgdGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnRcclxuICAgICAgICAgIC5vcGVyYXRpb24oYXBpKVxyXG4gICAgICAgICAgLmlucHV0KGl0ZW1JZClcclxuICAgICAgICAgIC5leGVjdXRlKClcclxuICApXHJcbn1cclxuXHJcbiAgZ2V0VXNlckFjY2VwdGVkVHlwZXMoY29udGVudFR5cGVlPykge1xyXG4gICAgaWYgKHRoaXMudXNlclBlcm1pdHRlZFR5cGVzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLnVzZXJQZXJtaXR0ZWRUeXBlc1RvdGFsU2l6ZSA9PT0gLTEgfHwgdGhpcy51c2VyUGVybWl0dGVkVHlwZXNUb3RhbFNpemUgPiB0aGlzLnVzZXJQZXJtaXR0ZWRUeXBlcy5sZW5ndGggfHwgY29udGVudFR5cGVlKSB7XHJcbiAgICAgIHRoaXMudXNlclBlcm1pdHRlZFR5cGVzID0gW107XHJcbiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxhbnlbXT4ob3AgPT4ge1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSAwLCBwYWdlU2l6ZSA9IDEwMDA7XHJcblxyXG4gICAgICAgICAgdGhpcy5mZXRjaFVzZXJQZXJtaXR0ZWRUeXBlc1JlY3Vyc2l2ZWx5KG9mZnNldCwgcGFnZVNpemUsIG9wLGNvbnRlbnRUeXBlZSk7XHJcblxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBvZih0aGlzLnVzZXJQZXJtaXR0ZWRUeXBlcyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZldGNoVXNlclBlcm1pdHRlZFR5cGVzUmVjdXJzaXZlbHkob2Zmc2V0LCBwYWdlU2l6ZSwgIG9wOiBTdWJzY3JpYmVyPGFueVtdPixjb250ZW50VHlwZWU/KTogdm9pZCB7XHJcbiAgICAgIGxldCBkYXRhIDogYW55W10gPSBbXTtcclxuICAgICAgbGV0IHNpbmdsRW50cnk7XHJcbiAgICAgIHRoaXMuY2FsbEFwaS5xdWVyeShcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBwYWdlUHJvdmlkZXI6ICdQUF9Eb2N1bWVudFR5cGVlJyxcclxuICAgICAgICAgICAgICBvZmZzZXQ6ICcnICsgb2Zmc2V0LFxyXG4gICAgICAgICAgICAgIHBhZ2VTaXplOiAnJyArIHBhZ2VTaXplLFxyXG4gICAgICAgICAgICAgIGRvY3VtZW50dHlwZWVfY29udGVudFR5cGVlOiBjb250ZW50VHlwZWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGVhZGVyczogeyBcInByb3BlcnRpZXNcIjogXCIqXCIgfSxcclxuICAgICAgICAgIH1cclxuICAgICAgKS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgdGhpcy51c2VyUGVybWl0dGVkVHlwZXNUb3RhbFNpemUgPSByZXM/LnRvdGFsU2l6ZTtcclxuICAgICAgICAgIHJlcz8uZW50cmllcy5tYXAoZW50cnkgPT4ge1xyXG4gICAgICAgICAgICAgIHNpbmdsRW50cnkgPSB0aGlzLmFkYXB0ZXIuYWRhcHRJbihlbnRyeSwgdGhpcy5maWVsZHMpXHJcbiAgICAgICAgICAgICAgc2luZ2xFbnRyeS5wcm9wZXJ0aWVzWydwYXRoJ10gPSBlbnRyeS5wYXRoO1xyXG4gICAgICAgICAgICAgIGRhdGEucHVzaChzaW5nbEVudHJ5LnByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICAgIGlmKHNpbmdsRW50cnkucHJvcGVydGllcy5jb250ZW50VHlwZWUgPT09ICdGaWxlJyl7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgYWFyYXkgb2YgZG9jdW1lbnQgZmlsZSB0eXBlIG9ubHkgdG8gdXNlIGl0IGluIGRvY3VtZW50IGZvcm0gYnVpbGRlciBwYWdlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJQZXJtaXR0ZWRGaWxlc09ubHkucHVzaChzaW5nbEVudHJ5LnByb3BlcnRpZXMpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRoaXMudXNlclBlcm1pdHRlZFR5cGVzLnB1c2goLi4uZGF0YSk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy51c2VyUGVybWl0dGVkVHlwZXM7XHJcbiAgICB9KSkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnVzZXJQZXJtaXR0ZWRUeXBlc1RvdGFsU2l6ZSA+IHRoaXMudXNlclBlcm1pdHRlZFR5cGVzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoVXNlclBlcm1pdHRlZFR5cGVzUmVjdXJzaXZlbHkodGhpcy51c2VyUGVybWl0dGVkVHlwZXMubGVuZ3RoLCBwYWdlU2l6ZSwgb3ApO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICAvLyB3aGVuIGZpbmlzaCBmZXRjaGluZyBkYXRhIHN0YXJ0IHNvcnRpbmcgaXRcclxuICAgICAgICB0aGlzLnVzZXJQZXJtaXR0ZWRUeXBlcyA9IHRoaXMuc29ydGluZ1R5cGVzKHRoaXMudXNlclBlcm1pdHRlZFR5cGVzKTtcclxuICAgICAgICB0aGlzLnVzZXJQZXJtaXR0ZWRGaWxlc09ubHkgPSB0aGlzLnNvcnRpbmdUeXBlcyh0aGlzLnVzZXJQZXJtaXR0ZWRGaWxlc09ubHkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvcC5uZXh0KHRoaXMudXNlclBlcm1pdHRlZFR5cGVzKTtcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHJldHVybiBvcC5lcnJvcihlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmVmcmVzaFVzZXJBY2NlcHRlZFR5cGVzKCkge1xyXG4gICAgdGhpcy51c2VyUGVybWl0dGVkVHlwZXMgPSBbXTtcclxuICAgIHRoaXMuZ2V0VXNlckFjY2VwdGVkVHlwZXMoKS5zdWJzY3JpYmUocmVzID0+IHsgfSlcclxuICB9XHJcblxyXG4gIGNoZWNrSWZEb2N1bWVudElzRmlsZShkb2N1bWVudCkge1xyXG4gICAgaWYgKGRvY3VtZW50LmZhY2V0cy5sZW5ndGggPiAwICYmIGRvY3VtZW50LmZhY2V0cy5pbmRleE9mKCdGb2xkZXJpc2gnKSA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuICdGaWxlJ1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdGb2xkZXInXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDaGlsZHJlbihpZCkge1xyXG4gICAgbGV0IHBhcmFtcyA9IHtcclxuICAgICAgc3lzdGVtX3BhcmVudElkOiBpZCxcclxuICAgICAgc3lzdGVtX2lzVHJhc2hlZDogZmFsc2UsXHJcbiAgICAgIHBhZ2VTaXplOiA1MDBcclxuICAgIH07XHJcbiAgICByZXR1cm4gKGlkID09ICdyb290JyA/IG9mKHRoaXMubWFpbkZvbGRlclNlcnZpY2UuZ2V0X2ZpbGVNYW5hZ2VyT2JqX0Zyb21Mb2NhbFN0b3JhZ2UoKSkgOiB0aGlzLmNhbGxBcGlcclxuICAgICAgLnF1ZXJ5KFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHBhZ2VQcm92aWRlcjogdGhpcy5wYWdlUHJvdmlkZXIsXHJcbiAgICAgICAgICAuLi5wYXJhbXMsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXHJcbiAgICAgICAgfVxyXG4gICAgICApKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4gZGF0YS5lbnRyaWVzLm1hcCgoaXRlbSkgPT4gdGhpcy5hZGFwdGVyLmFkYXB0SW4oaXRlbSwgdGhpcy5maWVsZHMpKSksXHJcbiAgICAgICAgbWFwKChlbnRyaWVzOiBhbnkpID0+IGVudHJpZXMubWFwKChpdGVtKSA9PiB0aGlzLmZpbGVNYW5hZ2VyQWRhcHRlci5hZGFwdChpdGVtKSkpLFxyXG4gICAgICAgIG1lcmdlTWFwKChlbnRyaWVzOiBhbnkpID0+XHJcbiAgICAgICAgICBmcm9tKGVudHJpZXMpLnBpcGUoXHJcbiAgICAgICAgICAgIG1lcmdlTWFwKFxyXG4gICAgICAgICAgICAgIChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb25zQ2FsbHM6IEFycmF5PFByb21pc2U8Ym9vbGVhbj4+ID0gdGhpcy5wZXJtaXNzaW9uc0xpc3QubWFwKHBlcm1pc3Npb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uRXZhbHVhdG9yU2VydmljZS5ldmFsdWF0ZVJ1bGUocGVybWlzc2lvbiwgeyBlbnRpdHk6IGl0ZW0uZW50aXR5IH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChwZXJtaXNzaW9uc0NhbGxzKVxyXG5cclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIChvcmlnaW5hbDogYW55LCBkZXRhaWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNMaXN0LmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbFt2YWx1ZV0gPSBkZXRhaWxbaW5kZXhdXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRvQXJyYXkoKSxcclxuICAgICAgICAgICAgbWFwKGVudHJ5ID0+IChbLi4uZW50cmllc10pKSkpLFxyXG4gICAgICAgIC8vIHRhcChlbnQgPT4gY29uc29sZS5sb2coZW50KSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gIH1cclxuXHJcbiAgZ2V0Q2hpbGRyZW5Gb3JTaGFyZWREb2N1bWVudFJvb3QoaWQpIHtcclxuICAgIGxldCBzb3J0T2JqID0ge1xyXG4gICAgICBcInNvcnRCeVwiOiBcImRjOnRpdGxlXCIsXHJcbiAgICAgIFwic29ydE9yZGVyXCI6IFwiYXNjXCIsXHJcbiAgICAgIFwicGFnZVNpemVcIjo1MDBcclxuICAgIH07XHJcbiAgICByZXR1cm4gZnJvbShcclxuICAgICAgdGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnRcclxuICAgICAgICAub3BlcmF0aW9uKCdBQ19VQV9Eb2N1bWVudF9HZXRTaGFyZXNXaXRoTWUnKVxyXG4gICAgICAgIC5wYXJhbXMoe1xyXG4gICAgICAgICAgLi4uc29ydE9ialxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmV4ZWN1dGUoe1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiAnKicsXHJcbiAgICAgICAgICAgIFwiZW5yaWNoZXJzLWRvY3VtZW50XCI6IFwiYnJlYWRjcnVtYiwgaGFzRm9sZGVyaXNoQ2hpbGQsIGZhdm9yaXRlcywgdGh1bWJuYWlsLCBjb2xsZWN0aW9uc1wiLFxyXG4gICAgICAgICAgICBcIlgtTlhlbnJpY2hlcnMtZG9jdW1lbnRcIjogXCJ0YWdzLHBlcm1pc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiZmV0Y2gtZG9jdW1lbnRcIjogXCJsb2NrLGRjOmNyZWF0b3IsIGRjOmxhc3RDb250cmlidXRvciwgc2hhcmVkSW5mbzpzaGFyZWRMaXN0XCJcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSlcclxuICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIGRhdGEuZW50cmllcy5tYXAoKGl0ZW0pID0+IHRoaXMuYWRhcHRlci5hZGFwdEluKGl0ZW0sIHRoaXMuZmllbGRzKSk7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlZEZpbGVzID0gZGF0YTtcclxuICAgICAgICAgIHJldHVybiBkYXRhLmVudHJpZXM7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgbWFwKChlbnRyaWVzOiBhbnkpID0+IGVudHJpZXMubWFwKChpdGVtKSA9PiB0aGlzLmZpbGVNYW5hZ2VyQWRhcHRlci5hZGFwdChpdGVtKSkpLFxyXG4gICAgICAgIG1lcmdlTWFwKChlbnRyaWVzOiBhbnkpID0+XHJcbiAgICAgICAgICBmcm9tKGVudHJpZXMpLnBpcGUoXHJcbiAgICAgICAgICAgIG1lcmdlTWFwKFxyXG4gICAgICAgICAgICAgIChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb25zQ2FsbHM6IEFycmF5PFByb21pc2U8Ym9vbGVhbj4+ID0gdGhpcy5wZXJtaXNzaW9uc0xpc3QubWFwKHBlcm1pc3Npb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uRXZhbHVhdG9yU2VydmljZS5ldmFsdWF0ZVJ1bGUocGVybWlzc2lvbiwgeyBlbnRpdHk6IGl0ZW0uZW50aXR5IH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChwZXJtaXNzaW9uc0NhbGxzKVxyXG5cclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIChvcmlnaW5hbDogYW55LCBkZXRhaWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNMaXN0LmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbFt2YWx1ZV0gPSBkZXRhaWxbaW5kZXhdXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRvQXJyYXkoKSxcclxuICAgICAgICAgICAgbWFwKGVudHJ5ID0+IChbLi4uZW50cmllc10pKSkpLFxyXG4gICAgICAgIC8vIHRhcChlbnQgPT4gY29uc29sZS5sb2coZW50KSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaERhdGEoaWQpIHtcclxuICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgIHN5c3RlbV9wYXJlbnRJZDogaWQsXHJcbiAgICAgIHN5c3RlbV9pc1RyYXNoZWQ6IGZhbHNlLFxyXG4gICAgICBvZmZzZXQ6IDAsXHJcbiAgICAgIGN1cnJlbnRQYWdlSW5kZXg6IDAsXHJcbiAgICAgIHBhZ2VTaXplOiA1MDAsXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIChpZCA9PSAncm9vdCcgPyB0aGlzLm1haW5Gb2xkZXJTZXJ2aWNlLnNhdmVfZmlsZU1hbmFnZXJPYmpfVG9Mb2NhbFN0b3JhZ2UodHJ1ZSkgOiB0aGlzLmNhbGxBcGlcclxuICAgICAgLnF1ZXJ5KFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHBhZ2VQcm92aWRlcjogJ1BQX0RvY3VtZW50X0NvbnRlbnRfREInLFxyXG4gICAgICAgICAgLi4ucGFyYW1zLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxyXG4gICAgICAgIH1cclxuICAgICAgKSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChkYXRhOiBhbnkpID0+IGRhdGEuZW50cmllcy5tYXAoKGl0ZW0pID0+IHRoaXMuYWRhcHRlci5hZGFwdEluKGl0ZW0sIHRoaXMuZmllbGRzKSkpLFxyXG4gICAgICAgIG1hcCgoZW50cmllczogYW55KSA9PiBlbnRyaWVzLm1hcCgoaXRlbSkgPT4gdGhpcy5maWxlTWFuYWdlckFkYXB0ZXIuYWRhcHQoaXRlbSkpKSxcclxuICAgICAgICBtZXJnZU1hcCgoZW50cmllczogYW55KSA9PlxyXG4gICAgICAgICAgZnJvbShlbnRyaWVzKS5waXBlKFxyXG4gICAgICAgICAgICBtZXJnZU1hcChcclxuICAgICAgICAgICAgICAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJtaXNzaW9uc0NhbGxzOiBBcnJheTxQcm9taXNlPGJvb2xlYW4+PiA9IHRoaXMucGVybWlzc2lvbnNMaXN0Lm1hcChwZXJtaXNzaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbkV2YWx1YXRvclNlcnZpY2UuZXZhbHVhdGVSdWxlKHBlcm1pc3Npb24sIHsgZW50aXR5OiBpdGVtLmVudGl0eSB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QocGVybWlzc2lvbnNDYWxscylcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIChvcmlnaW5hbDogYW55LCBkZXRhaWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNMaXN0LmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbFt2YWx1ZV0gPSBkZXRhaWxbaW5kZXhdXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRvQXJyYXkoKSxcclxuICAgICAgICAgICAgbWFwKGVudHJ5ID0+IChbLi4uZW50cmllc10pKSkpLFxyXG4gICAgICAgIC8vIHRhcChlbnQgPT4gY29uc29sZS5sb2coZW50KSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlRm9sZGVyKHBhcmFtcywgaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50XHJcbiAgICAgICAgLm9wZXJhdGlvbignRG9jdW1lbnQuRHluYW1pY1JlZ2lzdGVyJywge1xyXG4gICAgICAgICAgdXJsOiBgJHt0aGlzLmVudmlyb25tZW50Lm51eGVvfSR7dGhpcy5lbnZpcm9ubWVudC5jdXN0b21BdXRvbWF0aW9ufWAsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGFyYW1zKHtcclxuICAgICAgICAgIC4uLnBhcmFtc1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmlucHV0KGlkKVxyXG4gICAgICAgIC5leGVjdXRlKClcclxuICAgICkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZURpcmVjdG9yeShwYXJhbXMsIGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudFxyXG4gICAgICAgIC5vcGVyYXRpb24oJ0RvY3VtZW50LkNyZWF0ZScsIHtcclxuICAgICAgICAgIHVybDogYCR7dGhpcy5lbnZpcm9ubWVudC5udXhlb30ke3RoaXMuZW52aXJvbm1lbnQuY3VzdG9tQXV0b21hdGlvbn1gLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnBhcmFtcyh7XHJcbiAgICAgICAgICB0eXBlOiBcIkZvbGRlclwiLFxyXG4gICAgICAgICAgbmFtZTogcGFyYW1zLnRpdGxlLFxyXG4gICAgICAgICAgcHJvcGVydGllczogdGhpcy5hZGFwdGVyLmFkYXB0T3V0KHBhcmFtcywgdGhpcy5maWVsZHMpLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmlucHV0KGlkKVxyXG4gICAgICAgIC5leGVjdXRlKClcclxuICAgICkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIFVwZGF0ZUZvbGRlcihwYXJhbXMsIGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudFxyXG4gICAgICAgIC5vcGVyYXRpb24oJ0RvY3VtZW50LlVwZGF0ZScsIHtcclxuICAgICAgICAgIHVybDogYCR7dGhpcy5lbnZpcm9ubWVudC5udXhlb30ke3RoaXMuZW52aXJvbm1lbnQuY3VzdG9tQXV0b21hdGlvbn1gLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnBhcmFtcyh7XHJcbiAgICAgICAgICAuLi5wYXJhbXNcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5pbnB1dChpZClcclxuICAgICAgICAuZXhlY3V0ZSgpXHJcbiAgICApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgIHRocm93IGVycjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGRlbGV0ZUZvbGRlcihmb2xkZXJJZCkge1xyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50XHJcbiAgICAgICAgLm9wZXJhdGlvbihcclxuICAgICAgICAgICdEb2N1bWVudC5UcmFzaCcsXHJcbiAgICAgICAgICB7IHVybDogYCR7dGhpcy5lbnZpcm9ubWVudC5udXhlb30ke3RoaXMuZW52aXJvbm1lbnQuY3VzdG9tQXV0b21hdGlvbn1gIH1cclxuICAgICAgICApXHJcbiAgICAgICAgLmlucHV0KGBkb2NzOiR7Zm9sZGVySWR9YClcclxuICAgICAgICAuZXhlY3V0ZSgpXHJcbiAgICApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgIHRocm93IGVycjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhZGRUb0NvbGxlY3Rpb24oaWQsIGNvbGxlY3Rpb25JZCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gZnJvbShcclxuICAgICAgdGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnRcclxuICAgICAgICAub3BlcmF0aW9uKCdEb2N1bWVudC5BZGRUb0NvbGxlY3Rpb24nLCB7XHJcbiAgICAgICAgICB1cmw6IGAke3RoaXMuZW52aXJvbm1lbnQubnV4ZW99JHt0aGlzLmVudmlyb25tZW50LmN1c3RvbUF1dG9tYXRpb259YCxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5wYXJhbXMoe1xyXG4gICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbklkXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuaW5wdXQoYGRvY3M6JHtpZH1gKVxyXG4gICAgICAgIC5leGVjdXRlKClcclxuICAgICkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJlbmFtZUZvbGRlcihib2R5LCBpZCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gZnJvbShcclxuICAgICAgdGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnRcclxuICAgICAgICAub3BlcmF0aW9uKCdBQ19VQV9Eb2N1bWVudF9SZW5hbWUnLCB7XHJcbiAgICAgICAgICB1cmw6IGAke3RoaXMuZW52aXJvbm1lbnQubnV4ZW99JHt0aGlzLmVudmlyb25tZW50LmN1c3RvbUF1dG9tYXRpb259YCxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5wYXJhbXMoe1xyXG4gICAgICAgICAgbmFtZTogYm9keS50aXRsZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmlucHV0KGlkKVxyXG4gICAgICAgIC5leGVjdXRlKClcclxuICAgICkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUZpbGUocGF5bG9hZCwgaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50XHJcbiAgICAgICAgLm9wZXJhdGlvbignRG9jdW1lbnQuRHluYW1pY1JlZ2lzdGVyJywge1xyXG4gICAgICAgICAgdXJsOiBgJHt0aGlzLmVudmlyb25tZW50Lm51eGVvfSR7dGhpcy5lbnZpcm9ubWVudC5jdXN0b21BdXRvbWF0aW9ufWAsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGFyYW1zKHtcclxuICAgICAgICAgIC4uLnBheWxvYWQucGFyYW1zXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuaW5wdXQoaWQpXHJcbiAgICAgICAgLmV4ZWN1dGUoKVxyXG4gICAgKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IG9mKHsgc3RhdHVzOiAnZmFpbGVkJywgb3JpZ2luRmlsZTogcGF5bG9hZC5vcmlnaW5GaWxlIH0pKSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVOZXdDb2xsZWN0aW9uKG5hbWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50XHJcbiAgICAgICAgLm9wZXJhdGlvbignQ29sbGVjdGlvbi5DcmVhdGUnLCB7XHJcbiAgICAgICAgICB1cmw6IGAke3RoaXMuZW52aXJvbm1lbnQubnV4ZW99JHt0aGlzLmVudmlyb25tZW50LmN1c3RvbUF1dG9tYXRpb259YCxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5wYXJhbXMoe1xyXG4gICAgICAgICAgbmFtZTogbmFtZSxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk5ldyBDb2xsZWN0aW9uIFRlc3RcIlxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmV4ZWN1dGUoKVxyXG4gICAgKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY29weVRvKGRlc3RpbmF0aW9uLCBpZCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gZnJvbShcclxuICAgICAgdGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnRcclxuICAgICAgICAub3BlcmF0aW9uKCdEb2N1bWVudC5Db3B5Jywge1xyXG4gICAgICAgICAgdXJsOiBgJHt0aGlzLmVudmlyb25tZW50Lm51eGVvfSR7dGhpcy5lbnZpcm9ubWVudC5jdXN0b21BdXRvbWF0aW9ufWAsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGFyYW1zKHtcclxuICAgICAgICAgIHRhcmdldDogZGVzdGluYXRpb24uaWQsXHJcbiAgICAgICAgICBuYW1lOiBkZXN0aW5hdGlvbi5uYW1lXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuaW5wdXQoYGRvY3M6JHtpZH1gKVxyXG4gICAgICAgIC5leGVjdXRlKClcclxuICAgICkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG1vdmVUbyhkZXN0aW5hdGlvbiwgaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50XHJcbiAgICAgICAgLm9wZXJhdGlvbignRG9jdW1lbnQuTW92ZScsIHtcclxuICAgICAgICAgIHVybDogYCR7dGhpcy5lbnZpcm9ubWVudC5udXhlb30ke3RoaXMuZW52aXJvbm1lbnQuY3VzdG9tQXV0b21hdGlvbn1gLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnBhcmFtcyh7XHJcbiAgICAgICAgICB0YXJnZXQ6IGRlc3RpbmF0aW9uLmlkXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuaW5wdXQoYGRvY3M6JHtpZH1gKVxyXG4gICAgICAgIC5leGVjdXRlKClcclxuICAgICkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldENvbGxlY3Rpb25TdWdnZXN0aW9uKHRlcm0pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50XHJcbiAgICAgICAgLm9wZXJhdGlvbignQ29sbGVjdGlvbi5TdWdnZXN0aW9uJywge1xyXG4gICAgICAgICAgdXJsOiBgJHt0aGlzLmVudmlyb25tZW50Lm51eGVvfSR7dGhpcy5lbnZpcm9ubWVudC5jdXN0b21BdXRvbWF0aW9ufWAsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGFyYW1zKHtcclxuICAgICAgICAgIFwiY3VycmVudFBhZ2VJbmRleFwiOiBcIjBcIixcclxuICAgICAgICAgIFwicGFnZVNpemVcIjogXCIxMFwiLFxyXG4gICAgICAgICAgc2VhcmNoVGVybTogdGVybVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmV4ZWN1dGUoKVxyXG4gICAgKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29sbGVjdGlvbkZyb21QUChzZWFyY2hUZXJtKXtcclxuICAgIHJldHVybiB0aGlzLmNhbGxBcGkucXVlcnkoXHJcbiAgICAgIHtcclxuICAgICAgICBwYWdlUHJvdmlkZXI6ICdQUF9ETVNfVXNlcl9Db2xsZWN0aW9ucycsXHJcbiAgICAgICAgcXVlcnlQYXJhbXM6YCUke3NlYXJjaFRlcm19JWAsXHJcbiAgICAgICAgc29ydEJ5OiBcImRjOm1vZGlmaWVkXCIsXHJcbiAgICAgICAgc29ydE9yZGVyOiBcImRlc2NcIixcclxuICAgICAgICBjdXJyZW50UGFnZUluZGV4OiAwLFxyXG4gICAgICAgIG9mZnNldDogMCxcclxuICAgICAgICBwYWdlU2l6ZTogNDAsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBcIlgtTlhwcm9wZXJ0aWVzXCI6IFwiKlwiLFxyXG4gICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRTeW5jKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudFxyXG4gICAgICAgIC5vcGVyYXRpb24oJ051eGVvRHJpdmUuU2V0U3luY2hyb25pemF0aW9uJywge1xyXG4gICAgICAgICAgdXJsOiBgJHt0aGlzLmVudmlyb25tZW50Lm51eGVvfSR7dGhpcy5lbnZpcm9ubWVudC5jdXN0b21BdXRvbWF0aW9ufWAsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGFyYW1zKHsgZW5hYmxlOiB0cnVlIH0pXHJcbiAgICAgICAgLmlucHV0KGAke2lkfWApXHJcbiAgICAgICAgLmV4ZWN1dGUoKVxyXG4gICAgKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdW5TZXRTeW5jKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudFxyXG4gICAgICAgIC5vcGVyYXRpb24oJ051eGVvRHJpdmUuU2V0U3luY2hyb25pemF0aW9uJywge1xyXG4gICAgICAgICAgdXJsOiBgJHt0aGlzLmVudmlyb25tZW50Lm51eGVvfSR7dGhpcy5lbnZpcm9ubWVudC5jdXN0b21BdXRvbWF0aW9ufWAsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGFyYW1zKHsgZW5hYmxlOiBmYWxzZSB9KVxyXG4gICAgICAgIC5pbnB1dChgJHtpZH1gKVxyXG4gICAgICAgIC5leGVjdXRlKClcclxuICAgICkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFkZFRvRmF2b3JpdGVzKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudFxyXG4gICAgICAgIC5vcGVyYXRpb24oJ0RvY3VtZW50LkFkZFRvRmF2b3JpdGVzJywge1xyXG4gICAgICAgICAgdXJsOiBgJHt0aGlzLmVudmlyb25tZW50Lm51eGVvfSR7dGhpcy5lbnZpcm9ubWVudC5jdXN0b21BdXRvbWF0aW9ufWAsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGFyYW1zKHt9KVxyXG4gICAgICAgIC5pbnB1dChgZG9jczoke2lkfWApXHJcbiAgICAgICAgLmV4ZWN1dGUoKVxyXG4gICAgKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZGVmaW5lTmV3UGVyc29uKHRpdGxlLCB0aXRsZUVuLCBpZHM6IGFueSkge1xyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50XHJcbiAgICAgICAgLm9wZXJhdGlvbignRG9jdW1lbnQuRGVmaW5lTmV3UGVyc29uJywge1xyXG4gICAgICAgICAgdXJsOiBgJHt0aGlzLmVudmlyb25tZW50Lm51eGVvfSR7dGhpcy5lbnZpcm9ubWVudC5jdXN0b21BdXRvbWF0aW9ufWAsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGFyYW1zKHtcclxuICAgICAgICAgIHRpdGxlX2FyOiB0aXRsZSxcclxuICAgICAgICAgIHRpdGxlX2VuOiB0aXRsZUVuXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuaW5wdXQoYGRvY3M6JHtpZHN9YClcclxuICAgICAgICAuZXhlY3V0ZSgpXHJcbiAgICApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgIHRocm93IGVycjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhZGRUb1F1aWNrQWNjZXNzKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudFxyXG4gICAgICAgIC5vcGVyYXRpb24oJ0FDX1VBX0NvbGxlY3Rpb25fQWRkRG9jdW1lbnRUb1F1aWNrQWNjZXNzJywge1xyXG4gICAgICAgICAgdXJsOiBgJHt0aGlzLmVudmlyb25tZW50Lm51eGVvfSR7dGhpcy5lbnZpcm9ubWVudC5jdXN0b21BdXRvbWF0aW9ufWAsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGFyYW1zKHt9KVxyXG4gICAgICAgIC5pbnB1dChgJHtpZH1gKVxyXG4gICAgICAgIC5leGVjdXRlKClcclxuICAgICkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZyb21RdWlja0FjY2VzcyhpZCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gZnJvbShcclxuICAgICAgdGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnRcclxuICAgICAgICAub3BlcmF0aW9uKCdBQ19VQV9Db2xsZWN0aW9uX1JlbW92ZURvY3VtZW50RnJvbVF1aWNrQWNjZXNzJywge1xyXG4gICAgICAgICAgdXJsOiBgJHt0aGlzLmVudmlyb25tZW50Lm51eGVvfSR7dGhpcy5lbnZpcm9ubWVudC5jdXN0b21BdXRvbWF0aW9ufWAsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGFyYW1zKHt9KVxyXG4gICAgICAgIC5pbnB1dChgJHtpZH1gKVxyXG4gICAgICAgIC5leGVjdXRlKClcclxuICAgICkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZyb21GYXZvcml0ZXMoaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50XHJcbiAgICAgICAgLm9wZXJhdGlvbignRG9jdW1lbnQuUmVtb3ZlRnJvbUZhdm9yaXRlcycsIHtcclxuICAgICAgICAgIHVybDogYCR7dGhpcy5lbnZpcm9ubWVudC5udXhlb30ke3RoaXMuZW52aXJvbm1lbnQuY3VzdG9tQXV0b21hdGlvbn1gLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnBhcmFtcyh7fSlcclxuICAgICAgICAuaW5wdXQoYGRvY3M6JHtpZH1gKVxyXG4gICAgICAgIC5leGVjdXRlKClcclxuICAgICkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldEZvbGRlcih1aWQpIHtcclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudFxyXG4gICAgICAgIC5yZXBvc2l0b3J5KClcclxuICAgICAgICAuaGVhZGVycyh7XHJcbiAgICAgICAgICBcInByb3BlcnRpZXNcIjogXCIqXCIsXHJcbiAgICAgICAgICBcImVucmljaGVycy1kb2N1bWVudFwiOiBcImhhc0ZvbGRlcmlzaENoaWxkLCBmYXZvcml0ZXMsIGJyZWFkY3J1bWJcIixcclxuICAgICAgICAgIFwiWC1OWGVucmljaGVycy1kb2N1bWVudFwiOiBcInBlcm1pc3Npb25zXCIsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmV0Y2godWlkKVxyXG4gICAgKS5waXBlKFxyXG4gICAgICBtYXAoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldExvZ3MoaWQsIHBhZ2VJbmRleCA9IDAsIHBhZ2VTaXplID0gNSkge1xyXG4gICAgY29uc3QgcGF0aCA9ICdpZC8nICsgaWQgKyAnL0BhdWRpdCc7XHJcbiAgICByZXR1cm4gZnJvbSh0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudC5yZXF1ZXN0KHBhdGgpXHJcbiAgICAgIC5xdWVyeVBhcmFtcyh7XHJcbiAgICAgICAgY3VycmVudFBhZ2VJbmRleDogcGFnZUluZGV4LFxyXG4gICAgICAgIHBhZ2VTaXplOiBwYWdlU2l6ZVxyXG4gICAgICB9KVxyXG4gICAgICAuZ2V0KHtcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBcInByb3BlcnRpZXNcIjogXCIqXCJcclxuICAgICAgICB9XHJcbiAgICAgIH0pKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlU2NoZW1hcyh0eXBlKSB7XHJcbiAgICByZXR1cm4gZnJvbSh0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudC5yZXF1ZXN0KGBjb25maWcvdHlwZXMvJHt0eXBlfWApXHJcbiAgICAgIC5nZXQoe1xyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICdmZXRjaC5zY2hlbWEnOiAnZmllbGRzJ1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpLnBpcGUobWFwKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZGF0YS5zY2hlbWFzKSB7XHJcbiAgICAgICAgICByZXR1cm4gZGF0YS5zY2hlbWFzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEFzWmlwKHNlbGVjdGVkSXRlbXMsIGZpbGVUaXRsZSkge1xyXG4gICAgbGV0IGxvY2F0aW9uIDogYW55ID0gJyc7XHJcbiAgICB0aGlzLnRvYXN0ZXIuc2hvdygnbm90aWZpY2F0aW9uJywgJ1RPQVNURVIuU1VDQ0VTUycsIFwiVE9BU1RFUi5wcmVwYXJpbmdEb3dubG9hZEFzWmlwXCIsIHtcclxuICAgICAgdGltZU91dDogMjUwMFxyXG4gICAgfSlcclxuICAgIGxldCB0aXRsZSA9IChmaWxlVGl0bGUpID8gZmlsZVRpdGxlIDogYHNlbGVjdGlvbi0ke0RhdGUubm93KCl9YDtcclxuICAgIHRpdGxlID0gKHRpdGxlLmluZGV4T2YoJy4nKSA+IC0xKSA/IHRpdGxlLnN1YnN0cmluZygwLCB0aXRsZS5pbmRleE9mKCcuJykpIDogdGl0bGU7XHJcbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMuZW52aXJvbm1lbnQubnV4ZW99L2FwaS92MS9hdXRvbWF0aW9uL0Jsb2IuQnVsa0Rvd25sb2FkL0Bhc3luY2A7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgIC5wb3N0PGFueT4oZW5kcG9pbnQsIHtcclxuICAgICAgICBwYXJhbXM6IHtcclxuICAgICAgICAgIGZpbGVuYW1lOiAnc2VsZWN0aW9uLnppcCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIGlucHV0OiBgZG9jczoke3NlbGVjdGVkSXRlbXN9YFxyXG4gICAgICB9LCB7XHJcbiAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAocmVzID0+IHtcclxuICAgICAgICAgIGxvY2F0aW9uID0gcmVzLmhlYWRlcnMuZ2V0KCdsb2NhdGlvbicpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQobG9jYXRpb24sIHtcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYidcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgKS5waXBlKFxyXG4gICAgICAgIGV4cGFuZChyZXMgPT5cclxuICAgICAgICAgIChyZXMudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSA/XHJcbiAgICAgICAgICAgIHRoaXMuaHR0cC5nZXQobG9jYXRpb24sIHtcclxuICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdibG9iJ1xyXG4gICAgICAgICAgICB9KS5waXBlKGRlbGF5KDUwMDApKVxyXG4gICAgICAgICAgICA6IEVNUFRZXHJcbiAgICAgICAgKVxyXG4gICAgICApLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIGlmIChyZXMudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ppcCcpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3Rlci5zaG93KCdub3RpZmljYXRpb24nLCAnVE9BU1RFUi5TVUNDRVNTJywgXCJUT0FTVEVSLkRvd25sb2FkQXNaaXBcIiwge1xyXG4gICAgICAgICAgICB0aW1lT3V0OiAxMDAwXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgbGV0IGJpbmFyeURhdGEgOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgICAgYmluYXJ5RGF0YS5wdXNoKHJlcyk7XHJcbiAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKGJpbmFyeURhdGEsIHsgdHlwZTogcmVzLnR5cGUgfSk7XHJcbiAgICAgICAgICBzYXZlQXMoYmxvYiwgYCR7dGl0bGV9LnppcGApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIC8vIGdldFRyZWVOb2RlQ2hpbGRyZW4gPSAocGFyZW50KSA9PiB7XHJcbiAgLy8gICBsZXQgcGFyYW1zID0ge1xyXG4gIC8vICAgICBxdWVyeVBhcmFtczogcGFyZW50ID8gcGFyZW50IDogJycsXHJcbiAgLy8gICAgIHBhZ2VTaXplOiA1MCxcclxuICAvLyAgIH07XHJcbiAgLy8gICAvLyBkb24ndCByZWZyZXNoIGFsbCB0YWJsZSBpbiBjYXNlIG9mIHNvcnRpbmcgb25seVxyXG4gIC8vICAgcmV0dXJuIHRoaXMuY2FsbEFwaS5xdWVyeShcclxuICAvLyAgICAge1xyXG4gIC8vICAgICAgIHBhZ2VQcm92aWRlcjogJ3RyZWVfY2hpbGRyZW4nLFxyXG4gIC8vICAgICAgIC4uLnBhcmFtcyxcclxuICAvLyAgICAgfSxcclxuICAvLyAgICAge1xyXG4gIC8vICAgICAgIGhlYWRlcnM6IHtcclxuICAvLyAgICAgICAgIHByb3BlcnRpZXM6ICcqJyxcclxuICAvLyAgICAgICAgICdlbnJpY2hlcnMtZG9jdW1lbnQnOiAnaGFzRm9sZGVyaXNoQ2hpbGQnLFxyXG4gIC8vICAgICAgICAgJ1gtTlhlbnJpY2hlcnMtZG9jdW1lbnQnOiAncGVybWlzc2lvbnMnLFxyXG4gIC8vICAgICAgIH0sXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIClcclxuXHJcbiAgLy8gfTtcclxuXHJcbiAgcGFyc2VOb2RlQ2hpbGRyZW4gPSAob2JzZXJ2YWJsZSwgcGFyZW50ID0gdHJ1ZSkgPT4ge1xyXG4gICAgcmV0dXJuIG9ic2VydmFibGUucGlwZShcclxuICAgICAgbWFwKChkYXRhOiBhbnkpID0+XHJcbiAgICAgICAgZGF0YS5lbnRyaWVzLm1hcCgoaXRlbSkgPT5cclxuICAgICAgICAgIHRoaXMuYWRhcHRlci5hZGFwdEluKGl0ZW0sIHRoaXMuZmllbGRzKVxyXG4gICAgICAgIClcclxuICAgICAgKSxcclxuICAgICAgbWFwKChlbnRyaWVzOiBhbnkpID0+XHJcbiAgICAgICAgZW50cmllcy5tYXAoKGl0ZW0pID0+XHJcbiAgICAgICAgICB0aGlzLmZpbGVNYW5hZ2VyQWRhcHRlci50cmVlVmlld0FkYXB0KGl0ZW0sIHBhcmVudClcclxuICAgICAgICApXHJcbiAgICAgICksXHJcbiAgICAgIG1lcmdlTWFwKChlbnRyaWVzOiBhbnkpID0+XHJcbiAgICAgICAgZnJvbShlbnRyaWVzKS5waXBlKFxyXG4gICAgICAgICAgbWVyZ2VNYXAoXHJcbiAgICAgICAgICAgIChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBwZXJtaXNzaW9uc0NhbGxzOiBBcnJheTxcclxuICAgICAgICAgICAgICAgIFByb21pc2U8Ym9vbGVhbj5cclxuICAgICAgICAgICAgICA+ID0gdGhpcy5wZXJtaXNzaW9uc0xpc3QubWFwKChwZXJtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uRXZhbHVhdG9yU2VydmljZS5ldmFsdWF0ZVJ1bGUoXHJcbiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24sXHJcbiAgICAgICAgICAgICAgICAgIHsgZW50aXR5OiBpdGVtLmVudGl0eSB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHBlcm1pc3Npb25zQ2FsbHMpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAob3JpZ2luYWw6IGFueSwgZGV0YWlsKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uc0xpc3QuZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFt2YWx1ZV0gPSBkZXRhaWxbaW5kZXhdO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgdG9BcnJheSgpLFxyXG4gICAgICAgICAgbWFwKChlbnRyeSkgPT4gWy4uLmVudHJpZXNdKVxyXG4gICAgICAgIClcclxuICAgICAgKSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KSxcclxuICAgICAgZmlyc3QoKVxyXG4gICAgKVxyXG4gICAgICAudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVUcmVlTm9kZUNoaWxkcmVuKHBhcmVudCl7XHJcbiAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICBxdWVyeVBhcmFtczogcGFyZW50LFxyXG4gICAgICBwYWdlU2l6ZTogNTAsXHJcbiAgfTtcclxuICAvLyBkb24ndCByZWZyZXNoIGFsbCB0YWJsZSBpbiBjYXNlIG9mIHNvcnRpbmcgb25seVxyXG4gIHJldHVybiB0aGlzLmNhbGxBcGlcclxuICAgICAgLnF1ZXJ5KFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHBhZ2VQcm92aWRlcjogJ3RyZWVfY2hpbGRyZW4nLFxyXG4gICAgICAgICAgICAgIC4uLnBhcmFtcyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiAnKicsXHJcbiAgICAgICAgICAgICAgICAgICdlbnJpY2hlcnMtZG9jdW1lbnQnOiAnaGFzRm9sZGVyaXNoQ2hpbGQnLFxyXG4gICAgICAgICAgICAgICAgICAnWC1OWGVucmljaGVycy1kb2N1bWVudCc6ICdwZXJtaXNzaW9ucycsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgoZGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAgIGRhdGEuZW50cmllcy5tYXAoKGl0ZW0pID0+XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlci5hZGFwdEluKGl0ZW0sIHRoaXMuZmllbGRzKVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBtYXAoKGVudHJpZXM6IGFueSkgPT5cclxuICAgICAgICAgICAgICBlbnRyaWVzLm1hcCgoaXRlbSkgPT5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5maWxlTWFuYWdlckFkYXB0ZXIudHJlZVZpZXdBZGFwdChpdGVtKVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBtZXJnZU1hcCgoZW50cmllczogYW55KSA9PlxyXG4gICAgICAgICAgICAgIGZyb20oZW50cmllcykucGlwZShcclxuICAgICAgICAgICAgICAgICAgbWVyZ2VNYXAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVybWlzc2lvbnNDYWxsczogQXJyYXk8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2U8Ym9vbGVhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+ID0gdGhpcy5wZXJtaXNzaW9uc0xpc3QubWFwKChwZXJtaXNzaW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25FdmFsdWF0b3JTZXJ2aWNlLmV2YWx1YXRlUnVsZShwZXJtaXNzaW9uLCB7IGVudGl0eTogaXRlbS5lbnRpdHkgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QocGVybWlzc2lvbnNDYWxscyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgKG9yaWdpbmFsOiBhbnksIGRldGFpbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNMaXN0LmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFt2YWx1ZV0gPSBkZXRhaWxbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICB0b0FycmF5KCksXHJcbiAgICAgICAgICAgICAgICAgIG1hcCgoZW50cnkpID0+IFsuLi5lbnRyaWVzXSlcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaXJzdCgpXHJcbiAgICAgIClcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxufVxyXG4iXX0=