nuxeo-development-framework 4.2.2 → 4.2.4

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 (26) hide show
  1. package/bundles/nuxeo-development-framework.umd.js +504 -477
  2. package/bundles/nuxeo-development-framework.umd.js.map +1 -1
  3. package/esm2015/lib/components/comments/components/comment-item/comment-item.component.js +30 -23
  4. package/esm2015/lib/components/correspondence-relation/components/correspondence-relation/correspondence-relation.component.js +27 -32
  5. package/esm2015/lib/components/correspondence-relation/components/correspondence-relation-list/correspondence-relation-list.component.js +27 -32
  6. package/esm2015/lib/components/documents/components/document-list/documents-list.component.js +22 -19
  7. package/esm2015/lib/components/file-manger/components/add-to-collection/add-to-collection.component.js +2 -2
  8. package/esm2015/lib/components/file-manger/components/create-directory/create-directory.component.js +2 -2
  9. package/esm2015/lib/components/file-manger/components/move/move.component.js +2 -2
  10. package/esm2015/lib/components/file-manger/file-manager.abstract.js +260 -258
  11. package/esm2015/lib/components/permissions/permissions/permissions.component.js +100 -57
  12. package/esm2015/lib/components/permissions/permissions-template/permissions-template.component.js +36 -52
  13. package/esm2015/lib/shared-services/dialog-mangment.service.js +27 -23
  14. package/esm2015/lib/shared-services/shared-docs.service.js +22 -27
  15. package/fesm2015/nuxeo-development-framework.js +487 -460
  16. package/fesm2015/nuxeo-development-framework.js.map +1 -1
  17. package/lib/components/comments/components/comment-item/comment-item.component.d.ts +3 -1
  18. package/lib/components/correspondence-relation/components/correspondence-relation/correspondence-relation.component.d.ts +4 -2
  19. package/lib/components/correspondence-relation/components/correspondence-relation-list/correspondence-relation-list.component.d.ts +4 -2
  20. package/lib/components/documents/components/document-list/documents-list.component.d.ts +3 -1
  21. package/lib/components/file-manger/file-manager.abstract.d.ts +24 -22
  22. package/lib/components/permissions/permissions/permissions.component.d.ts +3 -1
  23. package/lib/components/permissions/permissions-template/permissions-template.component.d.ts +3 -3
  24. package/lib/shared-services/dialog-mangment.service.d.ts +3 -3
  25. package/lib/shared-services/shared-docs.service.d.ts +4 -2
  26. package/package.json +2 -2
@@ -1,5 +1,4 @@
1
1
  import { Component, Input } from '@angular/core';
2
- import { MatDialogConfig } from '@angular/material/dialog';
3
2
  import { AddPermissionsDialogComponent } from '../add-permissions-dialog/add-permissions-dialog.component';
4
3
  import * as i0 from "@angular/core";
5
4
  import * as i1 from "../permission.service";
@@ -9,14 +8,15 @@ import * as i4 from "../../../core/services/translation/translation.service";
9
8
  import * as i5 from "../../../core/services/nuxeo/nuxeo.service";
10
9
  import * as i6 from "../../../shared-services/user.service";
11
10
  import * as i7 from "../../../directive/permissions/evaluators.service";
12
- import * as i8 from "@angular/material/divider";
13
- import * as i9 from "../permissions-template/permissions-template.component";
14
- import * as i10 from "@angular/material/progress-bar";
15
- import * as i11 from "@angular/material/progress-spinner";
16
- import * as i12 from "@angular/common";
17
- import * as i13 from "@ngx-translate/core";
11
+ import * as i8 from "../../../shared/components/nuxeo-dialog/services/nuxeo-dialog.service";
12
+ import * as i9 from "@angular/material/divider";
13
+ import * as i10 from "../permissions-template/permissions-template.component";
14
+ import * as i11 from "@angular/material/progress-bar";
15
+ import * as i12 from "@angular/material/progress-spinner";
16
+ import * as i13 from "@angular/common";
17
+ import * as i14 from "@ngx-translate/core";
18
18
  export class PermissionsComponent {
19
- constructor(permissionService, addPermissionsDialog, tosterService, translateService, nuxeoService, userServ, evaluatorService) {
19
+ constructor(permissionService, addPermissionsDialog, tosterService, translateService, nuxeoService, userServ, evaluatorService, nuxeoDialogService) {
20
20
  this.permissionService = permissionService;
21
21
  this.addPermissionsDialog = addPermissionsDialog;
22
22
  this.tosterService = tosterService;
@@ -24,6 +24,7 @@ export class PermissionsComponent {
24
24
  this.nuxeoService = nuxeoService;
25
25
  this.userServ = userServ;
26
26
  this.evaluatorService = evaluatorService;
27
+ this.nuxeoDialogService = nuxeoDialogService;
27
28
  this.sourcePage = '';
28
29
  this.subscriptions$ = [];
29
30
  this.localPermissions = [];
@@ -39,17 +40,19 @@ export class PermissionsComponent {
39
40
  }
40
41
  ngOnInit() {
41
42
  this.subscriptions$.concat([
42
- this.permissionService.createAndAddAnother.subscribe(res => {
43
+ this.permissionService.createAndAddAnother.subscribe((res) => {
43
44
  this.getPermissions();
44
45
  })
45
46
  ]);
46
47
  this.loading = true;
47
48
  this.checkIfUserCanDoActionsOnPermissions();
48
49
  this.getPermissions();
49
- (this.inheritedPermissions.length > 0) ? this.status = 'unblock' : this.status = 'block';
50
+ this.inheritedPermissions.length > 0
51
+ ? (this.status = 'unblock')
52
+ : (this.status = 'block');
50
53
  }
51
54
  addPermissionLabel(arr, permissionArr) {
52
- arr.forEach(element => {
55
+ arr.forEach((element) => {
53
56
  if (!this.isItemContainAdministratorGroup(element)) {
54
57
  element.permissionLabel = this.translateService.instant(`rights.${element.permission}`);
55
58
  permissionArr.push(element);
@@ -61,11 +64,13 @@ export class PermissionsComponent {
61
64
  if (element.granted === false) {
62
65
  isAdministrator = true;
63
66
  }
64
- else if (element.username && element.username['entity-type'] === 'group' && element.username.groupname === 'administrators') {
67
+ else if (element.username &&
68
+ element.username['entity-type'] === 'group' &&
69
+ element.username.groupname === 'administrators') {
65
70
  isAdministrator = true;
66
71
  }
67
72
  else if (element.username.userGroups) {
68
- element.username.userGroups.map(group => {
73
+ element.username.userGroups.map((group) => {
69
74
  if (group.name === 'administrators') {
70
75
  isAdministrator = true;
71
76
  }
@@ -74,16 +79,23 @@ export class PermissionsComponent {
74
79
  return isAdministrator;
75
80
  }
76
81
  getPermissions() {
77
- this.subscriptions$.concat([this.permissionService.getPermissionsForDocument(this.documentId).subscribe(res => {
82
+ this.subscriptions$.concat([
83
+ this.permissionService
84
+ .getPermissionsForDocument(this.documentId)
85
+ .subscribe((res) => {
78
86
  this.permissionsType = res.contextParameters.acls;
79
- this.userVisiblePermissions = res.contextParameters.userVisiblePermissions;
87
+ this.userVisiblePermissions =
88
+ res.contextParameters.userVisiblePermissions;
80
89
  for (let p of this.permissionsType) {
81
90
  if (p.name == 'local') {
82
91
  this.localPermissions = [];
83
92
  this.addPermissionLabel(p.aces, this.localPermissions);
84
- this.localPermissions = this.localPermissions.map(element => {
93
+ this.localPermissions = this.localPermissions.map((element) => {
85
94
  var _a, _b;
86
- if (element.creator === null || element.creator === 'system' || ((_b = (_a = element.creator) === null || _a === void 0 ? void 0 : _a.properties) === null || _b === void 0 ? void 0 : _b.username) != this.nuxeoService.nuxeoClient.user.properties.username) {
95
+ if (element.creator === null ||
96
+ element.creator === 'system' ||
97
+ ((_b = (_a = element.creator) === null || _a === void 0 ? void 0 : _a.properties) === null || _b === void 0 ? void 0 : _b.username) !=
98
+ this.nuxeoService.nuxeoClient.user.properties.username) {
87
99
  element['currentUserIsPermissionOwner'] = false;
88
100
  }
89
101
  else {
@@ -109,62 +121,77 @@ export class PermissionsComponent {
109
121
  this.addPermissionLabel(p.aces, this.workflowPermissions);
110
122
  }
111
123
  }
112
- (this.inheritedPermissions.length == 0) ? this.status = 'block' : this.status = 'unblock';
124
+ this.inheritedPermissions.length == 0
125
+ ? (this.status = 'block')
126
+ : (this.status = 'unblock');
113
127
  this.loading = false;
114
- }, err => this.loading = false)]);
128
+ }, (err) => (this.loading = false))
129
+ ]);
115
130
  }
116
131
  blockPermissionInheritance() {
117
132
  this.blockOrUnblock = true;
118
- this.subscriptions$.concat([this.permissionService.blockPermissionInheritance(this.documentId).subscribe(res => {
133
+ this.subscriptions$.concat([
134
+ this.permissionService
135
+ .blockPermissionInheritance(this.documentId)
136
+ .subscribe((res) => {
119
137
  if (res) {
120
138
  this.getPermissions();
121
- this.tosterService.show('success', 'TOASTER.SUCCESS', "TOASTER.PERMISSION_BLOCK_SUCCESS");
139
+ this.tosterService.show('success', 'TOASTER.SUCCESS', 'TOASTER.PERMISSION_BLOCK_SUCCESS');
122
140
  this.blockOrUnblock = false;
123
- this.status = "unblock";
141
+ this.status = 'unblock';
124
142
  this.inheritedPermissions = [];
125
143
  }
126
- }, err => {
144
+ }, (err) => {
127
145
  this.blockOrUnblock = false;
128
146
  this.tosterService.show('error', 'TOASTER.ERROR', 'TOASTER.PERMISSION_BLOCK_FAIL');
129
- })]);
147
+ })
148
+ ]);
130
149
  }
131
150
  unblockPermissionInheritance() {
132
151
  this.blockOrUnblock = true;
133
- this.subscriptions$.concat([this.permissionService.unblockPermissionInheritance(this.documentId).subscribe(res => {
152
+ this.subscriptions$.concat([
153
+ this.permissionService
154
+ .unblockPermissionInheritance(this.documentId)
155
+ .subscribe((res) => {
134
156
  if (res) {
135
157
  this.getPermissions();
136
- this.tosterService.show('success', 'TOASTER.SUCCESS', "TOASTER.PERMISSION_UNBLOCK_SUCCESS");
137
- this.status = "block";
158
+ this.tosterService.show('success', 'TOASTER.SUCCESS', 'TOASTER.PERMISSION_UNBLOCK_SUCCESS');
159
+ this.status = 'block';
138
160
  this.blockOrUnblock = false;
139
161
  }
140
- }, err => {
162
+ }, (err) => {
141
163
  this.blockOrUnblock = false;
142
164
  this.tosterService.show('error', 'TOASTER.ERROR', 'TOASTER.PERMISSION_UNBLOCK_FAIL');
143
- })]);
165
+ })
166
+ ]);
144
167
  }
145
168
  addNewLocalPermissions() {
146
169
  this.permissionService.departmentUsers = [...this.allDepartmentUsers];
147
- this.localPermissions.forEach(perm => {
170
+ this.localPermissions.forEach((perm) => {
148
171
  this.permissionService.departmentUsers.forEach((user, index) => {
149
- if (perm.username.properties.username === user.properties.username
150
- && perm.creator.properties.username === this.nuxeoService.nuxeoClient.user.properties.username) {
172
+ if (perm.username.properties.username === user.properties.username &&
173
+ perm.creator.properties.username ===
174
+ this.nuxeoService.nuxeoClient.user.properties.username) {
151
175
  this.permissionService.departmentUsers.splice(index, 1);
152
176
  }
153
177
  });
154
178
  });
155
- const dialogConfig = new MatDialogConfig();
156
- dialogConfig.disableClose = false;
157
- dialogConfig.autoFocus = true;
158
- dialogConfig.data = {
159
- id: this.documentId,
160
- rights: this.userVisiblePermissions
161
- };
162
- dialogConfig.width = '35%';
163
- dialogConfig.height = '70%';
164
179
  // befor opening modal we diable clickout side effect to prevent details side menu from closing when clicking in the modal
165
180
  this.permissionService.disableClickOutSide = true;
166
- let dialofRef = this.addPermissionsDialog.open(AddPermissionsDialogComponent, dialogConfig);
167
- dialofRef.afterClosed().subscribe(res => {
181
+ this.nuxeoDialogService
182
+ .open({
183
+ component: AddPermissionsDialogComponent,
184
+ width: '35%',
185
+ height: '70%',
186
+ panelClass: 'watcher-dialog-container',
187
+ data: {
188
+ id: this.documentId,
189
+ rights: this.userVisiblePermissions
190
+ }
191
+ //disableClose: true,
192
+ })
193
+ .afterClosed()
194
+ .subscribe((res) => {
168
195
  // return click outside effect to work to close side menu when clicking out side it
169
196
  this.permissionService.disableClickOutSide = false;
170
197
  if (res) {
@@ -173,9 +200,15 @@ export class PermissionsComponent {
173
200
  });
174
201
  }
175
202
  checkIfUserCanDoActionsOnPermissions() {
176
- this.evaluatorService.evaluateRule('isManagePermissionEnabled').then(isEnabled => {
203
+ this.evaluatorService
204
+ .evaluateRule('isManagePermissionEnabled')
205
+ .then((isEnabled) => {
177
206
  if (isEnabled) {
178
- this.evaluatorService.evaluateRule('isDepartmentDocumentController', { entity: this.document }).then(userInControllerGroup => {
207
+ this.evaluatorService
208
+ .evaluateRule('isDepartmentDocumentController', {
209
+ entity: this.document
210
+ })
211
+ .then((userInControllerGroup) => {
179
212
  // let userInControllerGroup = false;
180
213
  // this.nuxeoService.nuxeoClient.user.userGroups.forEach(group => {
181
214
  // if (group.name === 'dms_document_controller') {
@@ -184,15 +217,25 @@ export class PermissionsComponent {
184
217
  // });
185
218
  if (userInControllerGroup) {
186
219
  let depCode = this.userServ.getUserDepartmentFromPath(this.document.path);
187
- this.permissionService.getDepMembers(depCode).subscribe(res => {
188
- this.permissionService.departmentUsers = res.users.map(e => {
189
- e['displayLabel'] = e.properties.firstName + ' ' + e.properties.lastName;
220
+ this.permissionService
221
+ .getDepMembers(depCode)
222
+ .subscribe((res) => {
223
+ this.permissionService.departmentUsers = res.users.map((e) => {
224
+ e['displayLabel'] =
225
+ e.properties.firstName + ' ' + e.properties.lastName;
190
226
  return e;
191
227
  });
192
- this.allDepartmentUsers = [...this.permissionService.departmentUsers];
193
- res.users.forEach(user => {
194
- if (user.properties.username === this.nuxeoService.nuxeoClient.user.properties.username
195
- && ((this.document.type === 'DmsFolder' && this.document.path.includes('/default-domain/workspaces/DMS/')) || (this.document.type === 'Folder' && this.document.path.includes('/default-domain/workspaces/DMSWorkspaces/')))) {
228
+ this.allDepartmentUsers = [
229
+ ...this.permissionService.departmentUsers
230
+ ];
231
+ res.users.forEach((user) => {
232
+ if (user.properties.username ===
233
+ this.nuxeoService.nuxeoClient.user.properties
234
+ .username &&
235
+ ((this.document.type === 'DmsFolder' &&
236
+ this.document.path.includes('/default-domain/workspaces/DMS/')) ||
237
+ (this.document.type === 'Folder' &&
238
+ this.document.path.includes('/default-domain/workspaces/DMSWorkspaces/')))) {
196
239
  this.allowAdd_Block_DeletePermission = true;
197
240
  }
198
241
  });
@@ -211,11 +254,11 @@ export class PermissionsComponent {
211
254
  ngOnDestroy() {
212
255
  // return click outside effect to work to close side menu when clicking out side it
213
256
  this.permissionService.disableClickOutSide = false;
214
- this.subscriptions$.forEach(e => e.unsubscribe());
257
+ this.subscriptions$.forEach((e) => e.unsubscribe());
215
258
  }
216
259
  }
217
- PermissionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PermissionsComponent, deps: [{ token: i1.PermissionService }, { token: i2.MatDialog }, { token: i3.CustomToastrService }, { token: i4.TranslationService }, { token: i5.NuxeoService }, { token: i6.UserService }, { token: i7.EvaluatorsService }], target: i0.ɵɵFactoryTarget.Component });
218
- PermissionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: PermissionsComponent, selector: "app-permissions", inputs: { documentId: "documentId", document: "document", allowAddAndBlock: "allowAddAndBlock", sourcePage: "sourcePage" }, ngImport: i0, template: "<div class=\"h-auto mt-3 px-0 pb-4\" *ngIf=\"!loading; else loader\">\r\n <!--LocalPermission List Items-->\r\n <div *ngIf=\"sourcePage != 'myFiles'\">\r\n <div class=\"flex flex-row justify-between\">\r\n <span class=\"font-bold text-gray-500 text-base\">{{\r\n \"permission.local\" | translate\r\n }}</span>\r\n <span *ngIf=\"allowAdd_Block_DeletePermission && !inheritedPermissions.length\">\r\n <button\r\n *ngIf=\"allowAddAndBlock\"\r\n class=\"hover:text-blue-700 text-blue-500 mb-1 text-base\"\r\n (click)=\"addNewLocalPermissions()\"\r\n [disabled]=\"!permissionsType\"\r\n >\r\n {{ \"permission.new\" | translate }}\r\n </button>\r\n </span>\r\n </div>\r\n <mat-divider class=\"mat-divider\"></mat-divider>\r\n <app-permissions-template\r\n [documentId]=\"documentId\"\r\n [userVisiblePermissions]=\"userVisiblePermissions\"\r\n (getPermissions)=\"getPermissions()\"\r\n [allowDeleteAndEdit]=\"allowAdd_Block_DeletePermission\"\r\n [permissionsArray]=\"localPermissions\"\r\n *ngIf=\"localPermissions.length > 0; else nolocalPermissions\"\r\n >\r\n </app-permissions-template>\r\n </div>\r\n <ng-template #nolocalPermissions>\r\n <div class=\"single-permssion p-3 text-center\">\r\n {{ \"permission.noLocal\" | translate }}\r\n </div>\r\n </ng-template>\r\n <!--InheritedPermission List Items-->\r\n <div>\r\n <div class=\"flex flex-row justify-between mt-3\">\r\n <span class=\"font-bold text-gray-500 text-base\">{{\r\n \"permission.inherited\" | translate\r\n }}</span>\r\n <span *ngIf=\"allowAdd_Block_DeletePermission\">\r\n <button\r\n class=\"hover:text-blue-700 text-blue-500 mb-1 text-base\"\r\n *ngIf=\"status != null && allowAddAndBlock\"\r\n >\r\n <span\r\n *ngIf=\"status == 'block'; else unblock\"\r\n (click)=\"unblockPermissionInheritance()\"\r\n >\r\n {{ \"permission.unblock\" | translate }}\r\n </span>\r\n <ng-template #unblock>\r\n <span (click)=\"blockPermissionInheritance()\">\r\n {{ \"permission.block\" | translate }}\r\n </span>\r\n </ng-template>\r\n </button>\r\n </span>\r\n </div>\r\n <mat-divider class=\"mat-divider\" *ngIf=\"!blockOrUnblock\"></mat-divider>\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"blockOrUnblock\"></mat-progress-bar>\r\n <app-permissions-template\r\n *ngIf=\"inheritedPermissions.length > 0; else noinheritedPermissions\"\r\n [documentId]=\"documentId\"\r\n [userVisiblePermissions]=\"userVisiblePermissions\"\r\n [permissionsArray]=\"inheritedPermissions\"\r\n (getPermissions)=\"getPermissions()\"\r\n >\r\n </app-permissions-template>\r\n </div>\r\n <ng-template #noinheritedPermissions>\r\n <div class=\"single-permssion p-3 text-center\">\r\n {{\"permission.noInherited\" | translate }}</div>\r\n </ng-template>\r\n <!--departmentPermissions List Items-->\r\n <div *ngIf=\"departmentPermissions.length > 0\">\r\n <div class=\"flex flex-row justify-between\">\r\n <span class=\"font-bold text-gray-500 text-base\">{{\r\n \"permission.departmentPermissions\" | translate\r\n }}</span>\r\n </div>\r\n <mat-divider class=\"mat-divider\"></mat-divider>\r\n <app-permissions-template\r\n [documentId]=\"documentId\"\r\n [userVisiblePermissions]=\"userVisiblePermissions\"\r\n (getPermissions)=\"getPermissions()\"\r\n [permissionsArray]=\"departmentPermissions\"\r\n >\r\n </app-permissions-template>\r\n </div>\r\n <!--sharePermissions List Items-->\r\n <div *ngIf=\"sharePermissions.length > 0\">\r\n <div class=\"flex flex-row justify-between\">\r\n <span class=\"font-bold text-gray-500 text-base\">{{\r\n \"permission.sharePermissions\" | translate\r\n }}</span>\r\n </div>\r\n <mat-divider class=\"mat-divider\"></mat-divider>\r\n <app-permissions-template\r\n [documentId]=\"documentId\"\r\n [userVisiblePermissions]=\"userVisiblePermissions\"\r\n (getPermissions)=\"getPermissions()\"\r\n [permissionsArray]=\"sharePermissions\"\r\n >\r\n </app-permissions-template>\r\n </div>\r\n <!--workflowPermissions List Items-->\r\n <div *ngIf=\"workflowPermissions.length > 0\">\r\n <div class=\"flex flex-row justify-between\">\r\n <span class=\"font-bold text-gray-500 text-base\">{{\r\n \"permission.workflowPermissions\" | translate\r\n }}</span>\r\n </div>\r\n <mat-divider class=\"mat-divider\"></mat-divider>\r\n <app-permissions-template\r\n [documentId]=\"documentId\"\r\n [userVisiblePermissions]=\"userVisiblePermissions\"\r\n (getPermissions)=\"getPermissions()\"\r\n [permissionsArray]=\"workflowPermissions\"\r\n >\r\n </app-permissions-template>\r\n </div>\r\n</div>\r\n\r\n<ng-template #loader>\r\n <div class=\"flex items-center justify-center w-full h-full\">\r\n <mat-spinner [value]=\"90\" [strokeWidth]=\"6\" overlay=\"true\" [diameter]=\"75\"></mat-spinner>\r\n </div>\r\n</ng-template>\r\n", styles: [""], components: [{ type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: i9.PermissionsTemplateComponent, selector: "app-permissions-template", inputs: ["allowDeleteAndEdit", "documentId", "userVisiblePermissions", "permissionsArray"], outputs: ["getPermissions"] }, { type: i10.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "mode", "value", "bufferValue"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { type: i11.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "translate": i13.TranslatePipe } });
260
+ PermissionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PermissionsComponent, deps: [{ token: i1.PermissionService }, { token: i2.MatDialog }, { token: i3.CustomToastrService }, { token: i4.TranslationService }, { token: i5.NuxeoService }, { token: i6.UserService }, { token: i7.EvaluatorsService }, { token: i8.NuxeoDialogService }], target: i0.ɵɵFactoryTarget.Component });
261
+ PermissionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: PermissionsComponent, selector: "app-permissions", inputs: { documentId: "documentId", document: "document", allowAddAndBlock: "allowAddAndBlock", sourcePage: "sourcePage" }, ngImport: i0, template: "<div class=\"h-auto mt-3 px-0 pb-4\" *ngIf=\"!loading; else loader\">\r\n <!--LocalPermission List Items-->\r\n <div *ngIf=\"sourcePage != 'myFiles'\">\r\n <div class=\"flex flex-row justify-between\">\r\n <span class=\"font-bold text-gray-500 text-base\">{{\r\n \"permission.local\" | translate\r\n }}</span>\r\n <span *ngIf=\"allowAdd_Block_DeletePermission && !inheritedPermissions.length\">\r\n <button\r\n *ngIf=\"allowAddAndBlock\"\r\n class=\"hover:text-blue-700 text-blue-500 mb-1 text-base\"\r\n (click)=\"addNewLocalPermissions()\"\r\n [disabled]=\"!permissionsType\"\r\n >\r\n {{ \"permission.new\" | translate }}\r\n </button>\r\n </span>\r\n </div>\r\n <mat-divider class=\"mat-divider\"></mat-divider>\r\n <app-permissions-template\r\n [documentId]=\"documentId\"\r\n [userVisiblePermissions]=\"userVisiblePermissions\"\r\n (getPermissions)=\"getPermissions()\"\r\n [allowDeleteAndEdit]=\"allowAdd_Block_DeletePermission\"\r\n [permissionsArray]=\"localPermissions\"\r\n *ngIf=\"localPermissions.length > 0; else nolocalPermissions\"\r\n >\r\n </app-permissions-template>\r\n </div>\r\n <ng-template #nolocalPermissions>\r\n <div class=\"single-permssion p-3 text-center\">\r\n {{ \"permission.noLocal\" | translate }}\r\n </div>\r\n </ng-template>\r\n <!--InheritedPermission List Items-->\r\n <div>\r\n <div class=\"flex flex-row justify-between mt-3\">\r\n <span class=\"font-bold text-gray-500 text-base\">{{\r\n \"permission.inherited\" | translate\r\n }}</span>\r\n <span *ngIf=\"allowAdd_Block_DeletePermission\">\r\n <button\r\n class=\"hover:text-blue-700 text-blue-500 mb-1 text-base\"\r\n *ngIf=\"status != null && allowAddAndBlock\"\r\n >\r\n <span\r\n *ngIf=\"status == 'block'; else unblock\"\r\n (click)=\"unblockPermissionInheritance()\"\r\n >\r\n {{ \"permission.unblock\" | translate }}\r\n </span>\r\n <ng-template #unblock>\r\n <span (click)=\"blockPermissionInheritance()\">\r\n {{ \"permission.block\" | translate }}\r\n </span>\r\n </ng-template>\r\n </button>\r\n </span>\r\n </div>\r\n <mat-divider class=\"mat-divider\" *ngIf=\"!blockOrUnblock\"></mat-divider>\r\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"blockOrUnblock\"></mat-progress-bar>\r\n <app-permissions-template\r\n *ngIf=\"inheritedPermissions.length > 0; else noinheritedPermissions\"\r\n [documentId]=\"documentId\"\r\n [userVisiblePermissions]=\"userVisiblePermissions\"\r\n [permissionsArray]=\"inheritedPermissions\"\r\n (getPermissions)=\"getPermissions()\"\r\n >\r\n </app-permissions-template>\r\n </div>\r\n <ng-template #noinheritedPermissions>\r\n <div class=\"single-permssion p-3 text-center\">\r\n {{\"permission.noInherited\" | translate }}</div>\r\n </ng-template>\r\n <!--departmentPermissions List Items-->\r\n <div *ngIf=\"departmentPermissions.length > 0\">\r\n <div class=\"flex flex-row justify-between\">\r\n <span class=\"font-bold text-gray-500 text-base\">{{\r\n \"permission.departmentPermissions\" | translate\r\n }}</span>\r\n </div>\r\n <mat-divider class=\"mat-divider\"></mat-divider>\r\n <app-permissions-template\r\n [documentId]=\"documentId\"\r\n [userVisiblePermissions]=\"userVisiblePermissions\"\r\n (getPermissions)=\"getPermissions()\"\r\n [permissionsArray]=\"departmentPermissions\"\r\n >\r\n </app-permissions-template>\r\n </div>\r\n <!--sharePermissions List Items-->\r\n <div *ngIf=\"sharePermissions.length > 0\">\r\n <div class=\"flex flex-row justify-between\">\r\n <span class=\"font-bold text-gray-500 text-base\">{{\r\n \"permission.sharePermissions\" | translate\r\n }}</span>\r\n </div>\r\n <mat-divider class=\"mat-divider\"></mat-divider>\r\n <app-permissions-template\r\n [documentId]=\"documentId\"\r\n [userVisiblePermissions]=\"userVisiblePermissions\"\r\n (getPermissions)=\"getPermissions()\"\r\n [permissionsArray]=\"sharePermissions\"\r\n >\r\n </app-permissions-template>\r\n </div>\r\n <!--workflowPermissions List Items-->\r\n <div *ngIf=\"workflowPermissions.length > 0\">\r\n <div class=\"flex flex-row justify-between\">\r\n <span class=\"font-bold text-gray-500 text-base\">{{\r\n \"permission.workflowPermissions\" | translate\r\n }}</span>\r\n </div>\r\n <mat-divider class=\"mat-divider\"></mat-divider>\r\n <app-permissions-template\r\n [documentId]=\"documentId\"\r\n [userVisiblePermissions]=\"userVisiblePermissions\"\r\n (getPermissions)=\"getPermissions()\"\r\n [permissionsArray]=\"workflowPermissions\"\r\n >\r\n </app-permissions-template>\r\n </div>\r\n</div>\r\n\r\n<ng-template #loader>\r\n <div class=\"flex items-center justify-center w-full h-full\">\r\n <mat-spinner [value]=\"90\" [strokeWidth]=\"6\" overlay=\"true\" [diameter]=\"75\"></mat-spinner>\r\n </div>\r\n</ng-template>\r\n", styles: [""], components: [{ type: i9.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: i10.PermissionsTemplateComponent, selector: "app-permissions-template", inputs: ["allowDeleteAndEdit", "documentId", "userVisiblePermissions", "permissionsArray"], outputs: ["getPermissions"] }, { type: i11.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "mode", "value", "bufferValue"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { type: i12.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "translate": i14.TranslatePipe } });
219
262
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PermissionsComponent, decorators: [{
220
263
  type: Component,
221
264
  args: [{
@@ -223,7 +266,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
223
266
  templateUrl: './permissions.component.html',
224
267
  styleUrls: ['./permissions.component.scss']
225
268
  }]
226
- }], ctorParameters: function () { return [{ type: i1.PermissionService }, { type: i2.MatDialog }, { type: i3.CustomToastrService }, { type: i4.TranslationService }, { type: i5.NuxeoService }, { type: i6.UserService }, { type: i7.EvaluatorsService }]; }, propDecorators: { documentId: [{
269
+ }], ctorParameters: function () { return [{ type: i1.PermissionService }, { type: i2.MatDialog }, { type: i3.CustomToastrService }, { type: i4.TranslationService }, { type: i5.NuxeoService }, { type: i6.UserService }, { type: i7.EvaluatorsService }, { type: i8.NuxeoDialogService }]; }, propDecorators: { documentId: [{
227
270
  type: Input
228
271
  }], document: [{
229
272
  type: Input
@@ -232,4 +275,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
232
275
  }], sourcePage: [{
233
276
  type: Input
234
277
  }] } });
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnV4ZW8tZGV2ZWxvcG1lbnQtZnJhbWV3b3JrL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9jb21wb25lbnRzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJdEUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNERBQTRELENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVczRyxNQUFNLE9BQU8sb0JBQW9CO0lBc0IvQixZQUFvQixpQkFBb0MsRUFDOUMsb0JBQStCLEVBQy9CLGFBQWtDLEVBQ2xDLGdCQUFvQyxFQUNwQyxZQUEwQixFQUMxQixRQUFxQixFQUNyQixnQkFBb0M7UUFOMUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUM5Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQVc7UUFDL0Isa0JBQWEsR0FBYixhQUFhLENBQXFCO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNyQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW9CO1FBbkI5QyxlQUFVLEdBQUcsRUFBRSxDQUFBO1FBQ2YsbUJBQWMsR0FBbUIsRUFBRSxDQUFDO1FBRXBDLHFCQUFn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LENBQUM7UUFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQTtJQUNuRCxDQUFDOztrSEFwTlUsb0JBQW9CO3NHQUFwQixvQkFBb0IsbUxDaEJqQyx1MExBaUlBOzRGRGpIYSxvQkFBb0I7a0JBTGhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsV0FBVyxFQUFFLDhCQUE4QjtvQkFDM0MsU0FBUyxFQUFFLENBQUMsOEJBQThCLENBQUM7aUJBQzVDO3dSQUlDLFVBQVU7c0JBRFQsS0FBSztnQkFHTixRQUFRO3NCQURQLEtBQUs7Z0JBR04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBR04sVUFBVTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICcuLi9wZXJtaXNzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC1zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBZGRQZXJtaXNzaW9uc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2FkZC1wZXJtaXNzaW9ucy1kaWFsb2cvYWRkLXBlcm1pc3Npb25zLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFdmFsdWF0b3JzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9wZXJtaXNzaW9ucy9ldmFsdWF0b3JzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21Ub2FzdHJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY3VzdG9tLXRvYXN0ci9zZXJ2aWNlcy9jdXN0b20tdG9hc3RyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3RyYW5zbGF0aW9uL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOdXhlb1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL251eGVvL251eGVvLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtcGVybWlzc2lvbnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wZXJtaXNzaW9ucy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGVybWlzc2lvbnMuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgcGVybWlzc2lvbnNUeXBlOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBkb2N1bWVudElkO1xyXG4gIEBJbnB1dCgpXHJcbiAgZG9jdW1lbnQ7XHJcbiAgQElucHV0KClcclxuICBhbGxvd0FkZEFuZEJsb2NrXHJcbiAgQElucHV0KClcclxuICBzb3VyY2VQYWdlID0gJydcclxuICBzdWJzY3JpcHRpb25zJDogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICB1c2VyVmlzaWJsZVBlcm1pc3Npb25zOiBhbnk7XHJcbiAgbG9jYWxQZXJtaXNzaW9ucyA9IFtdO1xyXG4gIGluaGVyaXRlZFBlcm1pc3Npb25zID0gW107XHJcbiAgZGVwYXJ0bWVudFBlcm1pc3Npb25zID0gW107XHJcbiAgc2hhcmVQZXJtaXNzaW9ucyA9IFtdO1xyXG4gIHdvcmtmbG93UGVybWlzc2lvbnMgPSBbXTtcclxuICBzdGF0dXM9bnVsbDsvL3RvIGtub3cgaW5oZXJpdGVkIFBlcm1pc3Npb25zIGlmIGJsb2NrIG9yIG5vdFxyXG4gIGFsbG93QWRkX0Jsb2NrX0RlbGV0ZVBlcm1pc3Npb24gPWZhbHNlO1xyXG4gIGJsb2NrT3JVbmJsb2NrID0gZmFsc2U7XHJcbiAgbG9hZGluZyA9IGZhbHNlO1xyXG4gIGFsbERlcGFydG1lbnRVc2VycyA9IFtdO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGVybWlzc2lvblNlcnZpY2U6IFBlcm1pc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhZGRQZXJtaXNzaW9uc0RpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSB0b3N0ZXJTZXJ2aWNlOiBDdXN0b21Ub2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG51eGVvU2VydmljZTogTnV4ZW9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydjogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGV2YWx1YXRvclNlcnZpY2UgOiBFdmFsdWF0b3JzU2VydmljZSkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMkLmNvbmNhdChbXHJcbiAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UuY3JlYXRlQW5kQWRkQW5vdGhlci5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICB0aGlzLmdldFBlcm1pc3Npb25zKCk7XHJcbiAgICAgIH0pXHJcbiAgICBdKTtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmNoZWNrSWZVc2VyQ2FuRG9BY3Rpb25zT25QZXJtaXNzaW9ucygpO1xyXG4gICAgdGhpcy5nZXRQZXJtaXNzaW9ucygpO1xyXG4gICAgKHRoaXMuaW5oZXJpdGVkUGVybWlzc2lvbnMubGVuZ3RoID4gMCkgPyB0aGlzLnN0YXR1cyA9ICd1bmJsb2NrJyA6IHRoaXMuc3RhdHVzID0gJ2Jsb2NrJztcclxuICB9XHJcblxyXG4gIGFkZFBlcm1pc3Npb25MYWJlbChhcnIscGVybWlzc2lvbkFycikge1xyXG4gICAgYXJyLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGlmKCF0aGlzLmlzSXRlbUNvbnRhaW5BZG1pbmlzdHJhdG9yR3JvdXAoZWxlbWVudCkpe1xyXG4gICAgICAgIGVsZW1lbnQucGVybWlzc2lvbkxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHJpZ2h0cy4ke2VsZW1lbnQucGVybWlzc2lvbn1gKVxyXG4gICAgICAgIHBlcm1pc3Npb25BcnIucHVzaChlbGVtZW50KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlzSXRlbUNvbnRhaW5BZG1pbmlzdHJhdG9yR3JvdXAoZWxlbWVudCl7XHJcbiAgICBsZXQgaXNBZG1pbmlzdHJhdG9yID0gZmFsc2U7XHJcbiAgICBpZihlbGVtZW50LmdyYW50ZWQgPT09IGZhbHNlKXtcclxuICAgICAgaXNBZG1pbmlzdHJhdG9yID0gdHJ1ZTtcclxuICAgIH1lbHNlIGlmIChlbGVtZW50LnVzZXJuYW1lICYmIGVsZW1lbnQudXNlcm5hbWVbJ2VudGl0eS10eXBlJ10gPT09ICdncm91cCcgJiYgZWxlbWVudC51c2VybmFtZS5ncm91cG5hbWUgPT09ICdhZG1pbmlzdHJhdG9ycycpe1xyXG4gICAgICBpc0FkbWluaXN0cmF0b3IgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmKGVsZW1lbnQudXNlcm5hbWUudXNlckdyb3Vwcyl7XHJcbiAgICAgICAgZWxlbWVudC51c2VybmFtZS51c2VyR3JvdXBzLm1hcChncm91cCA9PiB7XHJcbiAgICAgICAgICBpZihncm91cC5uYW1lID09PSAnYWRtaW5pc3RyYXRvcnMnKXtcclxuICAgICAgICAgICAgaXNBZG1pbmlzdHJhdG9yID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzQWRtaW5pc3RyYXRvcjtcclxuICB9XHJcblxyXG4gIGdldFBlcm1pc3Npb25zKCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zJC5jb25jYXQoW3RoaXMucGVybWlzc2lvblNlcnZpY2UuZ2V0UGVybWlzc2lvbnNGb3JEb2N1bWVudCh0aGlzLmRvY3VtZW50SWQpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB0aGlzLnBlcm1pc3Npb25zVHlwZSA9IHJlcy5jb250ZXh0UGFyYW1ldGVycy5hY2xzO1xyXG4gICAgICB0aGlzLnVzZXJWaXNpYmxlUGVybWlzc2lvbnMgPSByZXMuY29udGV4dFBhcmFtZXRlcnMudXNlclZpc2libGVQZXJtaXNzaW9ucztcclxuICAgICAgZm9yIChsZXQgcCBvZiB0aGlzLnBlcm1pc3Npb25zVHlwZSkge1xyXG4gICAgICAgIGlmIChwLm5hbWUgPT0gJ2xvY2FsJykge1xyXG4gICAgICAgICAgdGhpcy5sb2NhbFBlcm1pc3Npb25zID0gW107XHJcbiAgICAgICAgICB0aGlzLmFkZFBlcm1pc3Npb25MYWJlbChwLmFjZXMsdGhpcy5sb2NhbFBlcm1pc3Npb25zKTtcclxuICAgICAgICAgIHRoaXMubG9jYWxQZXJtaXNzaW9ucyA9IHRoaXMubG9jYWxQZXJtaXNzaW9ucy5tYXAoZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmNyZWF0b3IgPT09IG51bGwgfHwgZWxlbWVudC5jcmVhdG9yID09PSAnc3lzdGVtJyB8fCBlbGVtZW50LmNyZWF0b3I/LnByb3BlcnRpZXM/LnVzZXJuYW1lICE9IHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50LnVzZXIucHJvcGVydGllcy51c2VybmFtZSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGVsZW1lbnRbJ2N1cnJlbnRVc2VySXNQZXJtaXNzaW9uT3duZXInXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGVsZW1lbnRbJ2N1cnJlbnRVc2VySXNQZXJtaXNzaW9uT3duZXInXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocC5uYW1lID09ICdpbmhlcml0ZWQnKSB7XHJcbiAgICAgICAgICB0aGlzLmluaGVyaXRlZFBlcm1pc3Npb25zID0gW107XHJcbiAgICAgICAgICB0aGlzLmFkZFBlcm1pc3Npb25MYWJlbChwLmFjZXMsdGhpcy5pbmhlcml0ZWRQZXJtaXNzaW9ucylcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocC5uYW1lLmluY2x1ZGVzKCdkZXB0U3BhY2UnKSkge1xyXG4gICAgICAgICAgdGhpcy5kZXBhcnRtZW50UGVybWlzc2lvbnMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuYWRkUGVybWlzc2lvbkxhYmVsKHAuYWNlcyx0aGlzLmRlcGFydG1lbnRQZXJtaXNzaW9ucylcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocC5uYW1lLmluY2x1ZGVzKCdzaGFyZScpKSB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlUGVybWlzc2lvbnMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuYWRkUGVybWlzc2lvbkxhYmVsKHAuYWNlcyx0aGlzLnNoYXJlUGVybWlzc2lvbnMpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHAubmFtZS5pbmNsdWRlcygncm91dGluZycpKSB7XHJcbiAgICAgICAgICB0aGlzLndvcmtmbG93UGVybWlzc2lvbnMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuYWRkUGVybWlzc2lvbkxhYmVsKHAuYWNlcyx0aGlzLndvcmtmbG93UGVybWlzc2lvbnMpXHJcbiAgICAgICAgfSAgICBcclxuICAgICAgfVxyXG4gICAgICAodGhpcy5pbmhlcml0ZWRQZXJtaXNzaW9ucy5sZW5ndGggPT0gMCkgPyB0aGlzLnN0YXR1cyA9ICdibG9jaycgOiB0aGlzLnN0YXR1cyA9ICd1bmJsb2NrJzsgIFxyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0sZXJyID0+IHRoaXMubG9hZGluZyA9IGZhbHNlXHJcbiAgICApXSk7XHJcbiAgICBcclxuICB9XHJcblxyXG4gIGJsb2NrUGVybWlzc2lvbkluaGVyaXRhbmNlKCkge1xyXG4gICAgdGhpcy5ibG9ja09yVW5ibG9jayA9IHRydWU7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMkLmNvbmNhdChbdGhpcy5wZXJtaXNzaW9uU2VydmljZS5ibG9ja1Blcm1pc3Npb25Jbmhlcml0YW5jZSh0aGlzLmRvY3VtZW50SWQpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy5nZXRQZXJtaXNzaW9ucygpO1xyXG4gICAgICAgIHRoaXMudG9zdGVyU2VydmljZS5zaG93KCdzdWNjZXNzJywgJ1RPQVNURVIuU1VDQ0VTUycsIFwiVE9BU1RFUi5QRVJNSVNTSU9OX0JMT0NLX1NVQ0NFU1NcIik7XHJcbiAgICAgICAgdGhpcy5ibG9ja09yVW5ibG9jayA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzID0gXCJ1bmJsb2NrXCI7XHJcbiAgICAgICAgdGhpcy5pbmhlcml0ZWRQZXJtaXNzaW9ucyA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9LCBlcnIgPT4ge1xyXG4gICAgICB0aGlzLmJsb2NrT3JVbmJsb2NrID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudG9zdGVyU2VydmljZS5zaG93KCdlcnJvcicsICdUT0FTVEVSLkVSUk9SJywgJ1RPQVNURVIuUEVSTUlTU0lPTl9CTE9DS19GQUlMJyk7XHJcbiAgICB9XHJcbiAgICApXSlcclxuICB9XHJcblxyXG4gIHVuYmxvY2tQZXJtaXNzaW9uSW5oZXJpdGFuY2UoKSB7XHJcbiAgICB0aGlzLmJsb2NrT3JVbmJsb2NrID0gdHJ1ZTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQuY29uY2F0KFt0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLnVuYmxvY2tQZXJtaXNzaW9uSW5oZXJpdGFuY2UodGhpcy5kb2N1bWVudElkKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykgeyAgIFxyXG4gICAgICAgIHRoaXMuZ2V0UGVybWlzc2lvbnMoKTtcclxuICAgICAgICB0aGlzLnRvc3RlclNlcnZpY2Uuc2hvdygnc3VjY2VzcycsICdUT0FTVEVSLlNVQ0NFU1MnLCBcIlRPQVNURVIuUEVSTUlTU0lPTl9VTkJMT0NLX1NVQ0NFU1NcIik7XHJcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBcImJsb2NrXCI7XHJcbiAgICAgICAgdGhpcy5ibG9ja09yVW5ibG9jayA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9LCBlcnIgPT4ge1xyXG4gICAgICB0aGlzLmJsb2NrT3JVbmJsb2NrID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudG9zdGVyU2VydmljZS5zaG93KCdlcnJvcicsICdUT0FTVEVSLkVSUk9SJywgJ1RPQVNURVIuUEVSTUlTU0lPTl9VTkJMT0NLX0ZBSUwnKTtcclxuICAgIH0pXSlcclxuICB9XHJcblxyXG4gIGFkZE5ld0xvY2FsUGVybWlzc2lvbnMoKSB7XHJcbiAgICB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmRlcGFydG1lbnRVc2VycyA9IFsuLi50aGlzLmFsbERlcGFydG1lbnRVc2Vyc107XHJcbiAgICB0aGlzLmxvY2FsUGVybWlzc2lvbnMuZm9yRWFjaChwZXJtID0+IHtcclxuICAgICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5kZXBhcnRtZW50VXNlcnMuZm9yRWFjaCgodXNlciwgaW5kZXgpID0+IHtcclxuICAgICAgICBpZiAocGVybS51c2VybmFtZS5wcm9wZXJ0aWVzLnVzZXJuYW1lID09PSB1c2VyLnByb3BlcnRpZXMudXNlcm5hbWVcclxuICAgICAgICAgICYmIHBlcm0uY3JlYXRvci5wcm9wZXJ0aWVzLnVzZXJuYW1lID09PSB0aGlzLm51eGVvU2VydmljZS5udXhlb0NsaWVudC51c2VyLnByb3BlcnRpZXMudXNlcm5hbWUpIHtcclxuICAgICAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UuZGVwYXJ0bWVudFVzZXJzLnNwbGljZShpbmRleCwgMSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBkaWFsb2dDb25maWcgPSBuZXcgTWF0RGlhbG9nQ29uZmlnKCk7XHJcbiAgICBkaWFsb2dDb25maWcuZGlzYWJsZUNsb3NlID0gZmFsc2U7XHJcbiAgICBkaWFsb2dDb25maWcuYXV0b0ZvY3VzID0gdHJ1ZTtcclxuICAgIGRpYWxvZ0NvbmZpZy5kYXRhID0ge1xyXG4gICAgICBpZDogdGhpcy5kb2N1bWVudElkLFxyXG4gICAgICByaWdodHM6IHRoaXMudXNlclZpc2libGVQZXJtaXNzaW9uc1xyXG4gICAgfTtcclxuICAgIGRpYWxvZ0NvbmZpZy53aWR0aCA9ICczNSUnO1xyXG4gICAgZGlhbG9nQ29uZmlnLmhlaWdodCA9ICc3MCUnO1xyXG4gICAgLy8gYmVmb3Igb3BlbmluZyBtb2RhbCB3ZSBkaWFibGUgY2xpY2tvdXQgc2lkZSBlZmZlY3QgdG8gcHJldmVudCBkZXRhaWxzIHNpZGUgbWVudSBmcm9tIGNsb3Npbmcgd2hlbiBjbGlja2luZyBpbiB0aGUgbW9kYWxcclxuICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UuZGlzYWJsZUNsaWNrT3V0U2lkZSA9IHRydWU7XHJcbiAgICBsZXQgZGlhbG9mUmVmID0gdGhpcy5hZGRQZXJtaXNzaW9uc0RpYWxvZy5vcGVuKFxyXG4gICAgICBBZGRQZXJtaXNzaW9uc0RpYWxvZ0NvbXBvbmVudCwgXHJcbiAgICAgIGRpYWxvZ0NvbmZpZyk7XHJcbiAgICBkaWFsb2ZSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgLy8gcmV0dXJuIGNsaWNrIG91dHNpZGUgZWZmZWN0IHRvIHdvcmsgdG8gY2xvc2Ugc2lkZSBtZW51IHdoZW4gY2xpY2tpbmcgb3V0IHNpZGUgaXRcclxuICAgICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5kaXNhYmxlQ2xpY2tPdXRTaWRlID0gZmFsc2U7XHJcbiAgICAgIGlmKHJlcykge1xyXG4gICAgICAgIHRoaXMuZ2V0UGVybWlzc2lvbnMoKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBjaGVja0lmVXNlckNhbkRvQWN0aW9uc09uUGVybWlzc2lvbnMoKSB7XHJcbiAgICB0aGlzLmV2YWx1YXRvclNlcnZpY2UuZXZhbHVhdGVSdWxlKCdpc01hbmFnZVBlcm1pc3Npb25FbmFibGVkJykudGhlbihpc0VuYWJsZWQgPT4ge1xyXG4gICAgICBpZiAoaXNFbmFibGVkKSB7XHJcbiAgICAgICB0aGlzLmV2YWx1YXRvclNlcnZpY2UuZXZhbHVhdGVSdWxlKCdpc0RlcGFydG1lbnREb2N1bWVudENvbnRyb2xsZXInICwge2VudGl0eSA6IHRoaXMuZG9jdW1lbnR9KS50aGVuKHVzZXJJbkNvbnRyb2xsZXJHcm91cCA9PiB7XHJcbiAgICAgICAgLy8gbGV0IHVzZXJJbkNvbnRyb2xsZXJHcm91cCA9IGZhbHNlO1xyXG4gICAgICAgIC8vIHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50LnVzZXIudXNlckdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcclxuICAgICAgICAvLyAgIGlmIChncm91cC5uYW1lID09PSAnZG1zX2RvY3VtZW50X2NvbnRyb2xsZXInKSB7XHJcbiAgICAgICAgLy8gICAgIHVzZXJJbkNvbnRyb2xsZXJHcm91cCA9IHRydWU7XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgaWYgKHVzZXJJbkNvbnRyb2xsZXJHcm91cCkge1xyXG4gICAgICAgICAgbGV0IGRlcENvZGUgPSB0aGlzLnVzZXJTZXJ2LmdldFVzZXJEZXBhcnRtZW50RnJvbVBhdGgodGhpcy5kb2N1bWVudC5wYXRoKTtcclxuICAgICAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UuZ2V0RGVwTWVtYmVycyhkZXBDb2RlKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5kZXBhcnRtZW50VXNlcnMgPSByZXMudXNlcnMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgIGVbJ2Rpc3BsYXlMYWJlbCddID0gZS5wcm9wZXJ0aWVzLmZpcnN0TmFtZSArICcgJyArIGUucHJvcGVydGllcy5sYXN0TmFtZTtcclxuICAgICAgICAgICAgICByZXR1cm4gZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuYWxsRGVwYXJ0bWVudFVzZXJzID0gWy4uLnRoaXMucGVybWlzc2lvblNlcnZpY2UuZGVwYXJ0bWVudFVzZXJzXTtcclxuICAgICAgICAgICAgcmVzLnVzZXJzLmZvckVhY2godXNlciA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHVzZXIucHJvcGVydGllcy51c2VybmFtZSA9PT0gdGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnQudXNlci5wcm9wZXJ0aWVzLnVzZXJuYW1lXHJcbiAgICAgICAgICAgICAgICAmJiAoKHRoaXMuZG9jdW1lbnQudHlwZSA9PT0gJ0Rtc0ZvbGRlcicgJiYgdGhpcy5kb2N1bWVudC5wYXRoLmluY2x1ZGVzKCcvZGVmYXVsdC1kb21haW4vd29ya3NwYWNlcy9ETVMvJykpIHx8ICh0aGlzLmRvY3VtZW50LnR5cGUgPT09ICdGb2xkZXInICYmIHRoaXMuZG9jdW1lbnQucGF0aC5pbmNsdWRlcygnL2RlZmF1bHQtZG9tYWluL3dvcmtzcGFjZXMvRE1TV29ya3NwYWNlcy8nKSkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93QWRkX0Jsb2NrX0RlbGV0ZVBlcm1pc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmFsbG93QWRkX0Jsb2NrX0RlbGV0ZVBlcm1pc3Npb24gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWxsb3dBZGRfQmxvY2tfRGVsZXRlUGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAvLyByZXR1cm4gY2xpY2sgb3V0c2lkZSBlZmZlY3QgdG8gd29yayB0byBjbG9zZSBzaWRlIG1lbnUgd2hlbiBjbGlja2luZyBvdXQgc2lkZSBpdFxyXG4gICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5kaXNhYmxlQ2xpY2tPdXRTaWRlID0gZmFsc2U7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMkLmZvckVhY2goZSA9PiBlLnVuc3Vic2NyaWJlKCkpXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJoLWF1dG8gbXQtMyBweC0wIHBiLTRcIiAqbmdJZj1cIiFsb2FkaW5nOyBlbHNlIGxvYWRlclwiPlxyXG4gICAgPCEtLUxvY2FsUGVybWlzc2lvbiBMaXN0IEl0ZW1zLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic291cmNlUGFnZSAhPSAnbXlGaWxlcydcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgdGV4dC1ncmF5LTUwMCB0ZXh0LWJhc2VcIj57e1xyXG4gICAgICAgICAgICAgICAgXCJwZXJtaXNzaW9uLmxvY2FsXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYWxsb3dBZGRfQmxvY2tfRGVsZXRlUGVybWlzc2lvbiAmJiAhaW5oZXJpdGVkUGVybWlzc2lvbnMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhbGxvd0FkZEFuZEJsb2NrXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhvdmVyOnRleHQtYmx1ZS03MDAgdGV4dC1ibHVlLTUwMCBtYi0xIHRleHQtYmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5ld0xvY2FsUGVybWlzc2lvbnMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFwZXJtaXNzaW9uc1R5cGVcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IFwicGVybWlzc2lvbi5uZXdcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWRpdmlkZXIgY2xhc3M9XCJtYXQtZGl2aWRlclwiPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgPGFwcC1wZXJtaXNzaW9ucy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbZG9jdW1lbnRJZF09XCJkb2N1bWVudElkXCJcclxuICAgICAgICAgICAgW3VzZXJWaXNpYmxlUGVybWlzc2lvbnNdPVwidXNlclZpc2libGVQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgIChnZXRQZXJtaXNzaW9ucyk9XCJnZXRQZXJtaXNzaW9ucygpXCJcclxuICAgICAgICAgICAgW2FsbG93RGVsZXRlQW5kRWRpdF09XCJhbGxvd0FkZF9CbG9ja19EZWxldGVQZXJtaXNzaW9uXCJcclxuICAgICAgICAgICAgW3Blcm1pc3Npb25zQXJyYXldPVwibG9jYWxQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwibG9jYWxQZXJtaXNzaW9ucy5sZW5ndGggPiAwOyBlbHNlIG5vbG9jYWxQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvYXBwLXBlcm1pc3Npb25zLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctdGVtcGxhdGUgI25vbG9jYWxQZXJtaXNzaW9ucz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLXBlcm1zc2lvbiBwLTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAge3sgXCJwZXJtaXNzaW9uLm5vTG9jYWxcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwhLS1Jbmhlcml0ZWRQZXJtaXNzaW9uIExpc3QgSXRlbXMtLT5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIG10LTNcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgdGV4dC1ncmF5LTUwMCB0ZXh0LWJhc2VcIj57e1xyXG4gICAgICAgICAgICAgICAgXCJwZXJtaXNzaW9uLmluaGVyaXRlZFwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFsbG93QWRkX0Jsb2NrX0RlbGV0ZVBlcm1pc3Npb25cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhvdmVyOnRleHQtYmx1ZS03MDAgdGV4dC1ibHVlLTUwMCBtYi0xIHRleHQtYmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXMgIT0gbnVsbCAmJiBhbGxvd0FkZEFuZEJsb2NrXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1cyA9PSAnYmxvY2snOyBlbHNlIHVuYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidW5ibG9ja1Blcm1pc3Npb25Jbmhlcml0YW5jZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IFwicGVybWlzc2lvbi51bmJsb2NrXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN1bmJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiYmxvY2tQZXJtaXNzaW9uSW5oZXJpdGFuY2UoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgXCJwZXJtaXNzaW9uLmJsb2NrXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxtYXQtZGl2aWRlciBjbGFzcz1cIm1hdC1kaXZpZGVyXCIgKm5nSWY9XCIhYmxvY2tPclVuYmxvY2tcIj48L21hdC1kaXZpZGVyPlxyXG4gICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgKm5nSWY9XCJibG9ja09yVW5ibG9ja1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuICAgICAgICA8YXBwLXBlcm1pc3Npb25zLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaW5oZXJpdGVkUGVybWlzc2lvbnMubGVuZ3RoID4gMDsgZWxzZSBub2luaGVyaXRlZFBlcm1pc3Npb25zXCJcclxuICAgICAgICAgICAgW2RvY3VtZW50SWRdPVwiZG9jdW1lbnRJZFwiXHJcbiAgICAgICAgICAgIFt1c2VyVmlzaWJsZVBlcm1pc3Npb25zXT1cInVzZXJWaXNpYmxlUGVybWlzc2lvbnNcIlxyXG4gICAgICAgICAgICBbcGVybWlzc2lvbnNBcnJheV09XCJpbmhlcml0ZWRQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgIChnZXRQZXJtaXNzaW9ucyk9XCJnZXRQZXJtaXNzaW9ucygpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9hcHAtcGVybWlzc2lvbnMtdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjbm9pbmhlcml0ZWRQZXJtaXNzaW9ucz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLXBlcm1zc2lvbiBwLTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAge3tcInBlcm1pc3Npb24ubm9Jbmhlcml0ZWRcIiB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwhLS1kZXBhcnRtZW50UGVybWlzc2lvbnMgTGlzdCBJdGVtcy0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImRlcGFydG1lbnRQZXJtaXNzaW9ucy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHRleHQtZ3JheS01MDAgdGV4dC1iYXNlXCI+e3tcclxuICAgICAgICAgICAgICAgIFwicGVybWlzc2lvbi5kZXBhcnRtZW50UGVybWlzc2lvbnNcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWRpdmlkZXIgY2xhc3M9XCJtYXQtZGl2aWRlclwiPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgPGFwcC1wZXJtaXNzaW9ucy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbZG9jdW1lbnRJZF09XCJkb2N1bWVudElkXCJcclxuICAgICAgICAgICAgW3VzZXJWaXNpYmxlUGVybWlzc2lvbnNdPVwidXNlclZpc2libGVQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgIChnZXRQZXJtaXNzaW9ucyk9XCJnZXRQZXJtaXNzaW9ucygpXCJcclxuICAgICAgICAgICAgW3Blcm1pc3Npb25zQXJyYXldPVwiZGVwYXJ0bWVudFBlcm1pc3Npb25zXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9hcHAtcGVybWlzc2lvbnMtdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1zaGFyZVBlcm1pc3Npb25zIExpc3QgSXRlbXMtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJzaGFyZVBlcm1pc3Npb25zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgdGV4dC1ncmF5LTUwMCB0ZXh0LWJhc2VcIj57e1xyXG4gICAgICAgICAgICAgICAgXCJwZXJtaXNzaW9uLnNoYXJlUGVybWlzc2lvbnNcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWRpdmlkZXIgY2xhc3M9XCJtYXQtZGl2aWRlclwiPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgPGFwcC1wZXJtaXNzaW9ucy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbZG9jdW1lbnRJZF09XCJkb2N1bWVudElkXCJcclxuICAgICAgICAgICAgW3VzZXJWaXNpYmxlUGVybWlzc2lvbnNdPVwidXNlclZpc2libGVQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgIChnZXRQZXJtaXNzaW9ucyk9XCJnZXRQZXJtaXNzaW9ucygpXCJcclxuICAgICAgICAgICAgW3Blcm1pc3Npb25zQXJyYXldPVwic2hhcmVQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvYXBwLXBlcm1pc3Npb25zLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0td29ya2Zsb3dQZXJtaXNzaW9ucyBMaXN0IEl0ZW1zLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwid29ya2Zsb3dQZXJtaXNzaW9ucy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHRleHQtZ3JheS01MDAgdGV4dC1iYXNlXCI+e3tcclxuICAgICAgICAgICAgICAgIFwicGVybWlzc2lvbi53b3JrZmxvd1Blcm1pc3Npb25zXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG1hdC1kaXZpZGVyIGNsYXNzPVwibWF0LWRpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxyXG4gICAgICAgIDxhcHAtcGVybWlzc2lvbnMtdGVtcGxhdGVcclxuICAgICAgICAgICAgW2RvY3VtZW50SWRdPVwiZG9jdW1lbnRJZFwiXHJcbiAgICAgICAgICAgIFt1c2VyVmlzaWJsZVBlcm1pc3Npb25zXT1cInVzZXJWaXNpYmxlUGVybWlzc2lvbnNcIlxyXG4gICAgICAgICAgICAoZ2V0UGVybWlzc2lvbnMpPVwiZ2V0UGVybWlzc2lvbnMoKVwiXHJcbiAgICAgICAgICAgIFtwZXJtaXNzaW9uc0FycmF5XT1cIndvcmtmbG93UGVybWlzc2lvbnNcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L2FwcC1wZXJtaXNzaW9ucy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbG9hZGVyPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGxcIj5cclxuICAgICAgICA8bWF0LXNwaW5uZXIgW3ZhbHVlXT1cIjkwXCIgW3N0cm9rZVdpZHRoXT1cIjZcIiBvdmVybGF5PVwidHJ1ZVwiIFtkaWFtZXRlcl09XCI3NVwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnV4ZW8tZGV2ZWxvcG1lbnQtZnJhbWV3b3JrL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9jb21wb25lbnRzL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zL3Blcm1pc3Npb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUtwRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVkzRyxNQUFNLE9BQU8sb0JBQW9CO0lBc0JoQyxZQUNTLGlCQUFvQyxFQUNwQyxvQkFBK0IsRUFDL0IsYUFBa0MsRUFDbEMsZ0JBQW9DLEVBQ3BDLFlBQTBCLEVBQzFCLFFBQXFCLEVBQ3JCLGdCQUFtQyxFQUNwQyxrQkFBc0M7UUFQckMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQVc7UUFDL0Isa0JBQWEsR0FBYixhQUFhLENBQXFCO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNyQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW1CO1FBQ3BDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFyQjlDLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsbUJBQWMsR0FBbUIsRUFBRSxDQUFDO1FBRXBDLHFC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bkYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNuRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQzs7a0hBbFNXLG9CQUFvQjtzR0FBcEIsb0JBQW9CLG1MQ2pCakMsdTBMQWlJQTs0RkRoSGEsb0JBQW9CO2tCQUxoQyxTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFdBQVcsRUFBRSw4QkFBOEI7b0JBQzNDLFNBQVMsRUFBRSxDQUFDLDhCQUE4QixDQUFDO2lCQUMzQzt5VEFJQSxVQUFVO3NCQURULEtBQUs7Z0JBR04sUUFBUTtzQkFEUCxLQUFLO2dCQUdOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUdOLFVBQVU7c0JBRFQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQ29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vcGVybWlzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQtc2VydmljZXMvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWRkUGVybWlzc2lvbnNEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9hZGQtcGVybWlzc2lvbnMtZGlhbG9nL2FkZC1wZXJtaXNzaW9ucy1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRXZhbHVhdG9yc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvcGVybWlzc2lvbnMvZXZhbHVhdG9ycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3VzdG9tVG9hc3RyU2VydmljZSB9IGZyb20gJy4uLy4uL2N1c3RvbS10b2FzdHIvc2VydmljZXMvY3VzdG9tLXRvYXN0ci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy90cmFuc2xhdGlvbi90cmFuc2xhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTnV4ZW9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9udXhlby9udXhlby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTnV4ZW9EaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudHMvbnV4ZW8tZGlhbG9nL3NlcnZpY2VzL251eGVvLWRpYWxvZy5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnYXBwLXBlcm1pc3Npb25zJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vcGVybWlzc2lvbnMuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL3Blcm1pc3Npb25zLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cdHBlcm1pc3Npb25zVHlwZTogYW55O1xyXG5cdEBJbnB1dCgpXHJcblx0ZG9jdW1lbnRJZDtcclxuXHRASW5wdXQoKVxyXG5cdGRvY3VtZW50O1xyXG5cdEBJbnB1dCgpXHJcblx0YWxsb3dBZGRBbmRCbG9jaztcclxuXHRASW5wdXQoKVxyXG5cdHNvdXJjZVBhZ2UgPSAnJztcclxuXHRzdWJzY3JpcHRpb25zJDogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHR1c2VyVmlzaWJsZVBlcm1pc3Npb25zOiBhbnk7XHJcblx0bG9jYWxQZXJtaXNzaW9ucyA9IFtdO1xyXG5cdGluaGVyaXRlZFBlcm1pc3Npb25zID0gW107XHJcblx0ZGVwYXJ0bWVudFBlcm1pc3Npb25zID0gW107XHJcblx0c2hhcmVQZXJtaXNzaW9ucyA9IFtdO1xyXG5cdHdvcmtmbG93UGVybWlzc2lvbnMgPSBbXTtcclxuXHRzdGF0dXMgPSBudWxsOyAvL3RvIGtub3cgaW5oZXJpdGVkIFBlcm1pc3Npb25zIGlmIGJsb2NrIG9yIG5vdFxyXG5cdGFsbG93QWRkX0Jsb2NrX0RlbGV0ZVBlcm1pc3Npb24gPSBmYWxzZTtcclxuXHRibG9ja09yVW5ibG9jayA9IGZhbHNlO1xyXG5cdGxvYWRpbmcgPSBmYWxzZTtcclxuXHRhbGxEZXBhcnRtZW50VXNlcnMgPSBbXTtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByaXZhdGUgcGVybWlzc2lvblNlcnZpY2U6IFBlcm1pc3Npb25TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBhZGRQZXJtaXNzaW9uc0RpYWxvZzogTWF0RGlhbG9nLFxyXG5cdFx0cHJpdmF0ZSB0b3N0ZXJTZXJ2aWNlOiBDdXN0b21Ub2FzdHJTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UsXHJcblx0XHRwcml2YXRlIG51eGVvU2VydmljZTogTnV4ZW9TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSB1c2VyU2VydjogVXNlclNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGV2YWx1YXRvclNlcnZpY2U6IEV2YWx1YXRvcnNTZXJ2aWNlLFxyXG5cdFx0cHVibGljIG51eGVvRGlhbG9nU2VydmljZTogTnV4ZW9EaWFsb2dTZXJ2aWNlXHJcblx0KSB7fVxyXG5cclxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucyQuY29uY2F0KFtcclxuXHRcdFx0dGhpcy5wZXJtaXNzaW9uU2VydmljZS5jcmVhdGVBbmRBZGRBbm90aGVyLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5nZXRQZXJtaXNzaW9ucygpO1xyXG5cdFx0XHR9KVxyXG5cdFx0XSk7XHJcblx0XHR0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG5cdFx0dGhpcy5jaGVja0lmVXNlckNhbkRvQWN0aW9uc09uUGVybWlzc2lvbnMoKTtcclxuXHRcdHRoaXMuZ2V0UGVybWlzc2lvbnMoKTtcclxuXHRcdHRoaXMuaW5oZXJpdGVkUGVybWlzc2lvbnMubGVuZ3RoID4gMFxyXG5cdFx0XHQ/ICh0aGlzLnN0YXR1cyA9ICd1bmJsb2NrJylcclxuXHRcdFx0OiAodGhpcy5zdGF0dXMgPSAnYmxvY2snKTtcclxuXHR9XHJcblxyXG5cdGFkZFBlcm1pc3Npb25MYWJlbChhcnIsIHBlcm1pc3Npb25BcnIpIHtcclxuXHRcdGFyci5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcblx0XHRcdGlmICghdGhpcy5pc0l0ZW1Db250YWluQWRtaW5pc3RyYXRvckdyb3VwKGVsZW1lbnQpKSB7XHJcblx0XHRcdFx0ZWxlbWVudC5wZXJtaXNzaW9uTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcclxuXHRcdFx0XHRcdGByaWdodHMuJHtlbGVtZW50LnBlcm1pc3Npb259YFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0cGVybWlzc2lvbkFyci5wdXNoKGVsZW1lbnQpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGlzSXRlbUNvbnRhaW5BZG1pbmlzdHJhdG9yR3JvdXAoZWxlbWVudCkge1xyXG5cdFx0bGV0IGlzQWRtaW5pc3RyYXRvciA9IGZhbHNlO1xyXG5cdFx0aWYgKGVsZW1lbnQuZ3JhbnRlZCA9PT0gZmFsc2UpIHtcclxuXHRcdFx0aXNBZG1pbmlzdHJhdG9yID0gdHJ1ZTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdGVsZW1lbnQudXNlcm5hbWUgJiZcclxuXHRcdFx0ZWxlbWVudC51c2VybmFtZVsnZW50aXR5LXR5cGUnXSA9PT0gJ2dyb3VwJyAmJlxyXG5cdFx0XHRlbGVtZW50LnVzZXJuYW1lLmdyb3VwbmFtZSA9PT0gJ2FkbWluaXN0cmF0b3JzJ1xyXG5cdFx0KSB7XHJcblx0XHRcdGlzQWRtaW5pc3RyYXRvciA9IHRydWU7XHJcblx0XHR9IGVsc2UgaWYgKGVsZW1lbnQudXNlcm5hbWUudXNlckdyb3Vwcykge1xyXG5cdFx0XHRlbGVtZW50LnVzZXJuYW1lLnVzZXJHcm91cHMubWFwKChncm91cCkgPT4ge1xyXG5cdFx0XHRcdGlmIChncm91cC5uYW1lID09PSAnYWRtaW5pc3RyYXRvcnMnKSB7XHJcblx0XHRcdFx0XHRpc0FkbWluaXN0cmF0b3IgPSB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gaXNBZG1pbmlzdHJhdG9yO1xyXG5cdH1cclxuXHJcblx0Z2V0UGVybWlzc2lvbnMoKSB7XHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMkLmNvbmNhdChbXHJcblx0XHRcdHRoaXMucGVybWlzc2lvblNlcnZpY2VcclxuXHRcdFx0XHQuZ2V0UGVybWlzc2lvbnNGb3JEb2N1bWVudCh0aGlzLmRvY3VtZW50SWQpXHJcblx0XHRcdFx0LnN1YnNjcmliZShcclxuXHRcdFx0XHRcdChyZXMpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wZXJtaXNzaW9uc1R5cGUgPSByZXMuY29udGV4dFBhcmFtZXRlcnMuYWNscztcclxuXHRcdFx0XHRcdFx0dGhpcy51c2VyVmlzaWJsZVBlcm1pc3Npb25zID1cclxuXHRcdFx0XHRcdFx0XHRyZXMuY29udGV4dFBhcmFtZXRlcnMudXNlclZpc2libGVQZXJtaXNzaW9ucztcclxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgcCBvZiB0aGlzLnBlcm1pc3Npb25zVHlwZSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChwLm5hbWUgPT0gJ2xvY2FsJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5sb2NhbFBlcm1pc3Npb25zID0gW107XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFkZFBlcm1pc3Npb25MYWJlbChwLmFjZXMsIHRoaXMubG9jYWxQZXJtaXNzaW9ucyk7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmxvY2FsUGVybWlzc2lvbnMgPSB0aGlzLmxvY2FsUGVybWlzc2lvbnMubWFwKChlbGVtZW50KSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbGVtZW50LmNyZWF0b3IgPT09IG51bGwgfHxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbGVtZW50LmNyZWF0b3IgPT09ICdzeXN0ZW0nIHx8XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWxlbWVudC5jcmVhdG9yPy5wcm9wZXJ0aWVzPy51c2VybmFtZSAhPVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnQudXNlci5wcm9wZXJ0aWVzLnVzZXJuYW1lXHJcblx0XHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVsZW1lbnRbJ2N1cnJlbnRVc2VySXNQZXJtaXNzaW9uT3duZXInXSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVsZW1lbnRbJ2N1cnJlbnRVc2VySXNQZXJtaXNzaW9uT3duZXInXSA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnQ7XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHAubmFtZSA9PSAnaW5oZXJpdGVkJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5pbmhlcml0ZWRQZXJtaXNzaW9ucyA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hZGRQZXJtaXNzaW9uTGFiZWwocC5hY2VzLCB0aGlzLmluaGVyaXRlZFBlcm1pc3Npb25zKTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHAubmFtZS5pbmNsdWRlcygnZGVwdFNwYWNlJykpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZGVwYXJ0bWVudFBlcm1pc3Npb25zID0gW107XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFkZFBlcm1pc3Npb25MYWJlbChwLmFjZXMsIHRoaXMuZGVwYXJ0bWVudFBlcm1pc3Npb25zKTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHAubmFtZS5pbmNsdWRlcygnc2hhcmUnKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zaGFyZVBlcm1pc3Npb25zID0gW107XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFkZFBlcm1pc3Npb25MYWJlbChwLmFjZXMsIHRoaXMuc2hhcmVQZXJtaXNzaW9ucyk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwLm5hbWUuaW5jbHVkZXMoJ3JvdXRpbmcnKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy53b3JrZmxvd1Blcm1pc3Npb25zID0gW107XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFkZFBlcm1pc3Npb25MYWJlbChwLmFjZXMsIHRoaXMud29ya2Zsb3dQZXJtaXNzaW9ucyk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHRoaXMuaW5oZXJpdGVkUGVybWlzc2lvbnMubGVuZ3RoID09IDBcclxuXHRcdFx0XHRcdFx0XHQ/ICh0aGlzLnN0YXR1cyA9ICdibG9jaycpXHJcblx0XHRcdFx0XHRcdFx0OiAodGhpcy5zdGF0dXMgPSAndW5ibG9jaycpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHQoZXJyKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpXHJcblx0XHRcdFx0KVxyXG5cdFx0XSk7XHJcblx0fVxyXG5cclxuXHRibG9ja1Blcm1pc3Npb25Jbmhlcml0YW5jZSgpIHtcclxuXHRcdHRoaXMuYmxvY2tPclVuYmxvY2sgPSB0cnVlO1xyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zJC5jb25jYXQoW1xyXG5cdFx0XHR0aGlzLnBlcm1pc3Npb25TZXJ2aWNlXHJcblx0XHRcdFx0LmJsb2NrUGVybWlzc2lvbkluaGVyaXRhbmNlKHRoaXMuZG9jdW1lbnRJZClcclxuXHRcdFx0XHQuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdFx0KHJlcykgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAocmVzKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQZXJtaXNzaW9ucygpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMudG9zdGVyU2VydmljZS5zaG93KFxyXG5cdFx0XHRcdFx0XHRcdFx0J3N1Y2Nlc3MnLFxyXG5cdFx0XHRcdFx0XHRcdFx0J1RPQVNURVIuU1VDQ0VTUycsXHJcblx0XHRcdFx0XHRcdFx0XHQnVE9BU1RFUi5QRVJNSVNTSU9OX0JMT0NLX1NVQ0NFU1MnXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmJsb2NrT3JVbmJsb2NrID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zdGF0dXMgPSAndW5ibG9jayc7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5pbmhlcml0ZWRQZXJtaXNzaW9ucyA9IFtdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0KGVycikgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmJsb2NrT3JVbmJsb2NrID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdHRoaXMudG9zdGVyU2VydmljZS5zaG93KFxyXG5cdFx0XHRcdFx0XHRcdCdlcnJvcicsXHJcblx0XHRcdFx0XHRcdFx0J1RPQVNURVIuRVJST1InLFxyXG5cdFx0XHRcdFx0XHRcdCdUT0FTVEVSLlBFUk1JU1NJT05fQkxPQ0tfRkFJTCdcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpXHJcblx0XHRdKTtcclxuXHR9XHJcblxyXG5cdHVuYmxvY2tQZXJtaXNzaW9uSW5oZXJpdGFuY2UoKSB7XHJcblx0XHR0aGlzLmJsb2NrT3JVbmJsb2NrID0gdHJ1ZTtcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucyQuY29uY2F0KFtcclxuXHRcdFx0dGhpcy5wZXJtaXNzaW9uU2VydmljZVxyXG5cdFx0XHRcdC51bmJsb2NrUGVybWlzc2lvbkluaGVyaXRhbmNlKHRoaXMuZG9jdW1lbnRJZClcclxuXHRcdFx0XHQuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdFx0KHJlcykgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAocmVzKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQZXJtaXNzaW9ucygpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMudG9zdGVyU2VydmljZS5zaG93KFxyXG5cdFx0XHRcdFx0XHRcdFx0J3N1Y2Nlc3MnLFxyXG5cdFx0XHRcdFx0XHRcdFx0J1RPQVNURVIuU1VDQ0VTUycsXHJcblx0XHRcdFx0XHRcdFx0XHQnVE9BU1RFUi5QRVJNSVNTSU9OX1VOQkxPQ0tfU1VDQ0VTUydcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc3RhdHVzID0gJ2Jsb2NrJztcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmJsb2NrT3JVbmJsb2NrID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHQoZXJyKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMuYmxvY2tPclVuYmxvY2sgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0dGhpcy50b3N0ZXJTZXJ2aWNlLnNob3coXHJcblx0XHRcdFx0XHRcdFx0J2Vycm9yJyxcclxuXHRcdFx0XHRcdFx0XHQnVE9BU1RFUi5FUlJPUicsXHJcblx0XHRcdFx0XHRcdFx0J1RPQVNURVIuUEVSTUlTU0lPTl9VTkJMT0NLX0ZBSUwnXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KVxyXG5cdFx0XSk7XHJcblx0fVxyXG5cclxuXHRhZGROZXdMb2NhbFBlcm1pc3Npb25zKCkge1xyXG5cdFx0dGhpcy5wZXJtaXNzaW9uU2VydmljZS5kZXBhcnRtZW50VXNlcnMgPSBbLi4udGhpcy5hbGxEZXBhcnRtZW50VXNlcnNdO1xyXG5cdFx0dGhpcy5sb2NhbFBlcm1pc3Npb25zLmZvckVhY2goKHBlcm0pID0+IHtcclxuXHRcdFx0dGhpcy5wZXJtaXNzaW9uU2VydmljZS5kZXBhcnRtZW50VXNlcnMuZm9yRWFjaCgodXNlciwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRwZXJtLnVzZXJuYW1lLnByb3BlcnRpZXMudXNlcm5hbWUgPT09IHVzZXIucHJvcGVydGllcy51c2VybmFtZSAmJlxyXG5cdFx0XHRcdFx0cGVybS5jcmVhdG9yLnByb3BlcnRpZXMudXNlcm5hbWUgPT09XHJcblx0XHRcdFx0XHRcdHRoaXMubnV4ZW9TZXJ2aWNlLm51eGVvQ2xpZW50LnVzZXIucHJvcGVydGllcy51c2VybmFtZVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0dGhpcy5wZXJtaXNzaW9uU2VydmljZS5kZXBhcnRtZW50VXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gYmVmb3Igb3BlbmluZyBtb2RhbCB3ZSBkaWFibGUgY2xpY2tvdXQgc2lkZSBlZmZlY3QgdG8gcHJldmVudCBkZXRhaWxzIHNpZGUgbWVudSBmcm9tIGNsb3Npbmcgd2hlbiBjbGlja2luZyBpbiB0aGUgbW9kYWxcclxuXHRcdHRoaXMucGVybWlzc2lvblNlcnZpY2UuZGlzYWJsZUNsaWNrT3V0U2lkZSA9IHRydWU7XHJcblx0XHR0aGlzLm51eGVvRGlhbG9nU2VydmljZVxyXG5cdFx0XHQub3Blbih7XHJcblx0XHRcdFx0Y29tcG9uZW50OiBBZGRQZXJtaXNzaW9uc0RpYWxvZ0NvbXBvbmVudCxcclxuXHRcdFx0XHR3aWR0aDogJzM1JScsXHJcblx0XHRcdFx0aGVpZ2h0OiAnNzAlJyxcclxuXHRcdFx0XHRwYW5lbENsYXNzOiAnd2F0Y2hlci1kaWFsb2ctY29udGFpbmVyJyxcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRpZDogdGhpcy5kb2N1bWVudElkLFxyXG5cdFx0XHRcdFx0cmlnaHRzOiB0aGlzLnVzZXJWaXNpYmxlUGVybWlzc2lvbnNcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly9kaXNhYmxlQ2xvc2U6IHRydWUsXHJcblx0XHRcdH0pXHJcblx0XHRcdC5hZnRlckNsb3NlZCgpXHJcblx0XHRcdC5zdWJzY3JpYmUoKHJlcykgPT4ge1xyXG5cdFx0XHRcdC8vIHJldHVybiBjbGljayBvdXRzaWRlIGVmZmVjdCB0byB3b3JrIHRvIGNsb3NlIHNpZGUgbWVudSB3aGVuIGNsaWNraW5nIG91dCBzaWRlIGl0XHJcblx0XHRcdFx0dGhpcy5wZXJtaXNzaW9uU2VydmljZS5kaXNhYmxlQ2xpY2tPdXRTaWRlID0gZmFsc2U7XHJcblx0XHRcdFx0aWYgKHJlcykge1xyXG5cdFx0XHRcdFx0dGhpcy5nZXRQZXJtaXNzaW9ucygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cdGNoZWNrSWZVc2VyQ2FuRG9BY3Rpb25zT25QZXJtaXNzaW9ucygpIHtcclxuXHRcdHRoaXMuZXZhbHVhdG9yU2VydmljZVxyXG5cdFx0XHQuZXZhbHVhdGVSdWxlKCdpc01hbmFnZVBlcm1pc3Npb25FbmFibGVkJylcclxuXHRcdFx0LnRoZW4oKGlzRW5hYmxlZCkgPT4ge1xyXG5cdFx0XHRcdGlmIChpc0VuYWJsZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuZXZhbHVhdG9yU2VydmljZVxyXG5cdFx0XHRcdFx0XHQuZXZhbHVhdGVSdWxlKCdpc0RlcGFydG1lbnREb2N1bWVudENvbnRyb2xsZXInLCB7XHJcblx0XHRcdFx0XHRcdFx0ZW50aXR5OiB0aGlzLmRvY3VtZW50XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdC50aGVuKCh1c2VySW5Db250cm9sbGVyR3JvdXApID0+IHtcclxuXHRcdFx0XHRcdFx0XHQvLyBsZXQgdXNlckluQ29udHJvbGxlckdyb3VwID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0Ly8gdGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnQudXNlci51c2VyR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdC8vICAgaWYgKGdyb3VwLm5hbWUgPT09ICdkbXNfZG9jdW1lbnRfY29udHJvbGxlcicpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyAgICAgdXNlckluQ29udHJvbGxlckdyb3VwID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHQvLyAgIH1cclxuXHRcdFx0XHRcdFx0XHQvLyB9KTtcclxuXHRcdFx0XHRcdFx0XHRpZiAodXNlckluQ29udHJvbGxlckdyb3VwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgZGVwQ29kZSA9IHRoaXMudXNlclNlcnYuZ2V0VXNlckRlcGFydG1lbnRGcm9tUGF0aChcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5kb2N1bWVudC5wYXRoXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wZXJtaXNzaW9uU2VydmljZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQuZ2V0RGVwTWVtYmVycyhkZXBDb2RlKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmRlcGFydG1lbnRVc2VycyA9IHJlcy51c2Vycy5tYXAoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlWydkaXNwbGF5TGFiZWwnXSA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZS5wcm9wZXJ0aWVzLmZpcnN0TmFtZSArICcgJyArIGUucHJvcGVydGllcy5sYXN0TmFtZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmFsbERlcGFydG1lbnRVc2VycyA9IFtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC4uLnRoaXMucGVybWlzc2lvblNlcnZpY2UuZGVwYXJ0bWVudFVzZXJzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXMudXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyLnByb3BlcnRpZXMudXNlcm5hbWUgPT09XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5udXhlb1NlcnZpY2UubnV4ZW9DbGllbnQudXNlci5wcm9wZXJ0aWVzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQudXNlcm5hbWUgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KCh0aGlzLmRvY3VtZW50LnR5cGUgPT09ICdEbXNGb2xkZXInICYmXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5kb2N1bWVudC5wYXRoLmluY2x1ZGVzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Jy9kZWZhdWx0LWRvbWFpbi93b3Jrc3BhY2VzL0RNUy8nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSkgfHxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQodGhpcy5kb2N1bWVudC50eXBlID09PSAnRm9sZGVyJyAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5kb2N1bWVudC5wYXRoLmluY2x1ZGVzKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnL2RlZmF1bHQtZG9tYWluL3dvcmtzcGFjZXMvRE1TV29ya3NwYWNlcy8nXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpKSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmFsbG93QWRkX0Jsb2NrX0RlbGV0ZVBlcm1pc3Npb24gPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hbGxvd0FkZF9CbG9ja19EZWxldGVQZXJtaXNzaW9uID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5hbGxvd0FkZF9CbG9ja19EZWxldGVQZXJtaXNzaW9uID0gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblx0bmdPbkRlc3Ryb3koKSB7XHJcblx0XHQvLyByZXR1cm4gY2xpY2sgb3V0c2lkZSBlZmZlY3QgdG8gd29yayB0byBjbG9zZSBzaWRlIG1lbnUgd2hlbiBjbGlja2luZyBvdXQgc2lkZSBpdFxyXG5cdFx0dGhpcy5wZXJtaXNzaW9uU2VydmljZS5kaXNhYmxlQ2xpY2tPdXRTaWRlID0gZmFsc2U7XHJcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMkLmZvckVhY2goKGUpID0+IGUudW5zdWJzY3JpYmUoKSk7XHJcblx0fVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJoLWF1dG8gbXQtMyBweC0wIHBiLTRcIiAqbmdJZj1cIiFsb2FkaW5nOyBlbHNlIGxvYWRlclwiPlxyXG4gICAgPCEtLUxvY2FsUGVybWlzc2lvbiBMaXN0IEl0ZW1zLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic291cmNlUGFnZSAhPSAnbXlGaWxlcydcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgdGV4dC1ncmF5LTUwMCB0ZXh0LWJhc2VcIj57e1xyXG4gICAgICAgICAgICAgICAgXCJwZXJtaXNzaW9uLmxvY2FsXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYWxsb3dBZGRfQmxvY2tfRGVsZXRlUGVybWlzc2lvbiAmJiAhaW5oZXJpdGVkUGVybWlzc2lvbnMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhbGxvd0FkZEFuZEJsb2NrXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhvdmVyOnRleHQtYmx1ZS03MDAgdGV4dC1ibHVlLTUwMCBtYi0xIHRleHQtYmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE5ld0xvY2FsUGVybWlzc2lvbnMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFwZXJtaXNzaW9uc1R5cGVcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IFwicGVybWlzc2lvbi5uZXdcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWRpdmlkZXIgY2xhc3M9XCJtYXQtZGl2aWRlclwiPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgPGFwcC1wZXJtaXNzaW9ucy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbZG9jdW1lbnRJZF09XCJkb2N1bWVudElkXCJcclxuICAgICAgICAgICAgW3VzZXJWaXNpYmxlUGVybWlzc2lvbnNdPVwidXNlclZpc2libGVQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgIChnZXRQZXJtaXNzaW9ucyk9XCJnZXRQZXJtaXNzaW9ucygpXCJcclxuICAgICAgICAgICAgW2FsbG93RGVsZXRlQW5kRWRpdF09XCJhbGxvd0FkZF9CbG9ja19EZWxldGVQZXJtaXNzaW9uXCJcclxuICAgICAgICAgICAgW3Blcm1pc3Npb25zQXJyYXldPVwibG9jYWxQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwibG9jYWxQZXJtaXNzaW9ucy5sZW5ndGggPiAwOyBlbHNlIG5vbG9jYWxQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvYXBwLXBlcm1pc3Npb25zLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctdGVtcGxhdGUgI25vbG9jYWxQZXJtaXNzaW9ucz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLXBlcm1zc2lvbiBwLTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAge3sgXCJwZXJtaXNzaW9uLm5vTG9jYWxcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwhLS1Jbmhlcml0ZWRQZXJtaXNzaW9uIExpc3QgSXRlbXMtLT5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIG10LTNcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgdGV4dC1ncmF5LTUwMCB0ZXh0LWJhc2VcIj57e1xyXG4gICAgICAgICAgICAgICAgXCJwZXJtaXNzaW9uLmluaGVyaXRlZFwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFsbG93QWRkX0Jsb2NrX0RlbGV0ZVBlcm1pc3Npb25cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhvdmVyOnRleHQtYmx1ZS03MDAgdGV4dC1ibHVlLTUwMCBtYi0xIHRleHQtYmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXMgIT0gbnVsbCAmJiBhbGxvd0FkZEFuZEJsb2NrXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1cyA9PSAnYmxvY2snOyBlbHNlIHVuYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidW5ibG9ja1Blcm1pc3Npb25Jbmhlcml0YW5jZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IFwicGVybWlzc2lvbi51bmJsb2NrXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN1bmJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiYmxvY2tQZXJtaXNzaW9uSW5oZXJpdGFuY2UoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgXCJwZXJtaXNzaW9uLmJsb2NrXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxtYXQtZGl2aWRlciBjbGFzcz1cIm1hdC1kaXZpZGVyXCIgKm5nSWY9XCIhYmxvY2tPclVuYmxvY2tcIj48L21hdC1kaXZpZGVyPlxyXG4gICAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgKm5nSWY9XCJibG9ja09yVW5ibG9ja1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuICAgICAgICA8YXBwLXBlcm1pc3Npb25zLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaW5oZXJpdGVkUGVybWlzc2lvbnMubGVuZ3RoID4gMDsgZWxzZSBub2luaGVyaXRlZFBlcm1pc3Npb25zXCJcclxuICAgICAgICAgICAgW2RvY3VtZW50SWRdPVwiZG9jdW1lbnRJZFwiXHJcbiAgICAgICAgICAgIFt1c2VyVmlzaWJsZVBlcm1pc3Npb25zXT1cInVzZXJWaXNpYmxlUGVybWlzc2lvbnNcIlxyXG4gICAgICAgICAgICBbcGVybWlzc2lvbnNBcnJheV09XCJpbmhlcml0ZWRQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgIChnZXRQZXJtaXNzaW9ucyk9XCJnZXRQZXJtaXNzaW9ucygpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9hcHAtcGVybWlzc2lvbnMtdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjbm9pbmhlcml0ZWRQZXJtaXNzaW9ucz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLXBlcm1zc2lvbiBwLTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAge3tcInBlcm1pc3Npb24ubm9Jbmhlcml0ZWRcIiB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwhLS1kZXBhcnRtZW50UGVybWlzc2lvbnMgTGlzdCBJdGVtcy0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImRlcGFydG1lbnRQZXJtaXNzaW9ucy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHRleHQtZ3JheS01MDAgdGV4dC1iYXNlXCI+e3tcclxuICAgICAgICAgICAgICAgIFwicGVybWlzc2lvbi5kZXBhcnRtZW50UGVybWlzc2lvbnNcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWRpdmlkZXIgY2xhc3M9XCJtYXQtZGl2aWRlclwiPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgPGFwcC1wZXJtaXNzaW9ucy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbZG9jdW1lbnRJZF09XCJkb2N1bWVudElkXCJcclxuICAgICAgICAgICAgW3VzZXJWaXNpYmxlUGVybWlzc2lvbnNdPVwidXNlclZpc2libGVQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgIChnZXRQZXJtaXNzaW9ucyk9XCJnZXRQZXJtaXNzaW9ucygpXCJcclxuICAgICAgICAgICAgW3Blcm1pc3Npb25zQXJyYXldPVwiZGVwYXJ0bWVudFBlcm1pc3Npb25zXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9hcHAtcGVybWlzc2lvbnMtdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1zaGFyZVBlcm1pc3Npb25zIExpc3QgSXRlbXMtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJzaGFyZVBlcm1pc3Npb25zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgdGV4dC1ncmF5LTUwMCB0ZXh0LWJhc2VcIj57e1xyXG4gICAgICAgICAgICAgICAgXCJwZXJtaXNzaW9uLnNoYXJlUGVybWlzc2lvbnNcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWRpdmlkZXIgY2xhc3M9XCJtYXQtZGl2aWRlclwiPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgPGFwcC1wZXJtaXNzaW9ucy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbZG9jdW1lbnRJZF09XCJkb2N1bWVudElkXCJcclxuICAgICAgICAgICAgW3VzZXJWaXNpYmxlUGVybWlzc2lvbnNdPVwidXNlclZpc2libGVQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgIChnZXRQZXJtaXNzaW9ucyk9XCJnZXRQZXJtaXNzaW9ucygpXCJcclxuICAgICAgICAgICAgW3Blcm1pc3Npb25zQXJyYXldPVwic2hhcmVQZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvYXBwLXBlcm1pc3Npb25zLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0td29ya2Zsb3dQZXJtaXNzaW9ucyBMaXN0IEl0ZW1zLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwid29ya2Zsb3dQZXJtaXNzaW9ucy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHRleHQtZ3JheS01MDAgdGV4dC1iYXNlXCI+e3tcclxuICAgICAgICAgICAgICAgIFwicGVybWlzc2lvbi53b3JrZmxvd1Blcm1pc3Npb25zXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG1hdC1kaXZpZGVyIGNsYXNzPVwibWF0LWRpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxyXG4gICAgICAgIDxhcHAtcGVybWlzc2lvbnMtdGVtcGxhdGVcclxuICAgICAgICAgICAgW2RvY3VtZW50SWRdPVwiZG9jdW1lbnRJZFwiXHJcbiAgICAgICAgICAgIFt1c2VyVmlzaWJsZVBlcm1pc3Npb25zXT1cInVzZXJWaXNpYmxlUGVybWlzc2lvbnNcIlxyXG4gICAgICAgICAgICAoZ2V0UGVybWlzc2lvbnMpPVwiZ2V0UGVybWlzc2lvbnMoKVwiXHJcbiAgICAgICAgICAgIFtwZXJtaXNzaW9uc0FycmF5XT1cIndvcmtmbG93UGVybWlzc2lvbnNcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L2FwcC1wZXJtaXNzaW9ucy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbG9hZGVyPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGxcIj5cclxuICAgICAgICA8bWF0LXNwaW5uZXIgW3ZhbHVlXT1cIjkwXCIgW3N0cm9rZVdpZHRoXT1cIjZcIiBvdmVybGF5PVwidHJ1ZVwiIFtkaWFtZXRlcl09XCI3NVwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19