@cleavelandprice/ngx-lib 4.4.0 → 4.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/active-directory/material/components/user-chooser/user-chooser.component.d.ts +18 -18
- package/authentication/model/abstract-authentication-service.d.ts +4 -4
- package/authentication/object/services/authentication-object.service.d.ts +4 -3
- package/authentication/token/services/authentication-token.service.d.ts +4 -3
- package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs +13 -13
- package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs +7 -7
- package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs +17 -17
- package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs +22 -12
- package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs +22 -12
- package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication.mjs +4 -4
- package/fesm2022/cleavelandprice-ngx-lib-authentication.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs +25 -25
- package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-msgraph.mjs +4 -4
- package/fesm2022/cleavelandprice-ngx-lib-msgraph.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-quill-mention.mjs +10 -10
- package/fesm2022/cleavelandprice-ngx-lib-quill-mention.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-quill.mjs +15 -15
- package/fesm2022/cleavelandprice-ngx-lib-quill.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs +14 -14
- package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-table.mjs +14 -14
- package/fesm2022/cleavelandprice-ngx-lib-table.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-upload.mjs +15 -16
- package/fesm2022/cleavelandprice-ngx-lib-upload.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs +13 -13
- package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib.mjs +7 -7
- package/fesm2022/cleavelandprice-ngx-lib.mjs.map +1 -1
- package/package.json +3 -33
- package/esm2022/active-directory/active-directory.api.mjs +0 -11
- package/esm2022/active-directory/active-directory.module.mjs +0 -40
- package/esm2022/active-directory/cleavelandprice-ngx-lib-active-directory.mjs +0 -5
- package/esm2022/active-directory/material/cleavelandprice-ngx-lib-active-directory-material.mjs +0 -5
- package/esm2022/active-directory/material/components/user-chooser/user-chooser.component.mjs +0 -437
- package/esm2022/active-directory/material/components/user-form-field/user-form-field.component.mjs +0 -159
- package/esm2022/active-directory/material/mat-active-directory.api.mjs +0 -11
- package/esm2022/active-directory/material/mat-active-directory.module.mjs +0 -100
- package/esm2022/active-directory/material/model/default-user-chooser-data.mjs +0 -15
- package/esm2022/active-directory/material/model/default-user-chooser-filter-options.mjs +0 -8
- package/esm2022/active-directory/material/model/selectable-group.mjs +0 -2
- package/esm2022/active-directory/material/model/selectable-user.mjs +0 -2
- package/esm2022/active-directory/material/model/user-chooser-data.mjs +0 -2
- package/esm2022/active-directory/material/model/user-chooser-filter-options.mjs +0 -3
- package/esm2022/active-directory/material/model/user-chooser-mode.mjs +0 -6
- package/esm2022/active-directory/material/model/user-chooser-pre-processing-group.mjs +0 -3
- package/esm2022/active-directory/model/active-directory-service-options-token.mjs +0 -3
- package/esm2022/active-directory/model/active-directory-service-options.mjs +0 -2
- package/esm2022/active-directory/model/ad-object-with-children.mjs +0 -2
- package/esm2022/active-directory/model/ad-object.mjs +0 -2
- package/esm2022/active-directory/model/cache-object.mjs +0 -3
- package/esm2022/active-directory/model/cleaveland-price-user.mjs +0 -2
- package/esm2022/active-directory/model/group.mjs +0 -2
- package/esm2022/active-directory/model/user-or-group.mjs +0 -2
- package/esm2022/active-directory/model/user.mjs +0 -2
- package/esm2022/active-directory/services/active-directory.service.mjs +0 -125
- package/esm2022/authentication/authentication.api.mjs +0 -7
- package/esm2022/authentication/authentication.base.module.mjs +0 -40
- package/esm2022/authentication/cleavelandprice-ngx-lib-authentication.mjs +0 -5
- package/esm2022/authentication/material/cleavelandprice-ngx-lib-authentication-material.mjs +0 -5
- package/esm2022/authentication/material/components/login/login.component.mjs +0 -49
- package/esm2022/authentication/material/components/login-form/login-form.component.mjs +0 -82
- package/esm2022/authentication/material/mat-authentication.api.mjs +0 -8
- package/esm2022/authentication/material/mat-authentication.module.mjs +0 -84
- package/esm2022/authentication/material/model/login-form-data.mjs +0 -2
- package/esm2022/authentication/material/model/mat-authentication-service-options-token.mjs +0 -3
- package/esm2022/authentication/material/model/mat-authentication-service-options.mjs +0 -2
- package/esm2022/authentication/material/services/mat-authentication.service.mjs +0 -67
- package/esm2022/authentication/model/abstract-authentication-service.mjs +0 -2
- package/esm2022/authentication/model/authenticated-user.mjs +0 -2
- package/esm2022/authentication/model/authentication-request.mjs +0 -2
- package/esm2022/authentication/model/authentication-service-options-token.mjs +0 -3
- package/esm2022/authentication/model/authentication-service-options.mjs +0 -2
- package/esm2022/authentication/object/authentication-object.api.mjs +0 -6
- package/esm2022/authentication/object/authentication-object.module.mjs +0 -40
- package/esm2022/authentication/object/cleavelandprice-ngx-lib-authentication-object.mjs +0 -5
- package/esm2022/authentication/object/services/authentication-object.service.mjs +0 -119
- package/esm2022/authentication/token/authentication-token.api.mjs +0 -6
- package/esm2022/authentication/token/authetiction-token.module.mjs +0 -40
- package/esm2022/authentication/token/cleavelandprice-ngx-lib-authentication-token.mjs +0 -5
- package/esm2022/authentication/token/model/authentication-token-service-options-token.mjs +0 -3
- package/esm2022/authentication/token/model/authentication-token-service-options.mjs +0 -2
- package/esm2022/authentication/token/model/authentication-token.mjs +0 -2
- package/esm2022/authentication/token/services/authentication-token.service.mjs +0 -128
- package/esm2022/cleavelandprice-ngx-lib.mjs +0 -5
- package/esm2022/dialog/cleavelandprice-ngx-lib-dialog.mjs +0 -5
- package/esm2022/dialog/components/base/base.component.mjs +0 -102
- package/esm2022/dialog/components/choice/choice.component.mjs +0 -21
- package/esm2022/dialog/components/confirmation/confirmation.component.mjs +0 -21
- package/esm2022/dialog/components/input/input.component.mjs +0 -21
- package/esm2022/dialog/components/message/message.component.mjs +0 -21
- package/esm2022/dialog/dialog.api.mjs +0 -20
- package/esm2022/dialog/dialog.module.mjs +0 -73
- package/esm2022/dialog/model/confirmation-dialog-mode.mjs +0 -8
- package/esm2022/dialog/model/dialog-base-data.mjs +0 -2
- package/esm2022/dialog/model/dialog-choice-data.mjs +0 -2
- package/esm2022/dialog/model/dialog-type.mjs +0 -8
- package/esm2022/lib/model/app-path-config.mjs +0 -2
- package/esm2022/lib/model/app-type.mjs +0 -2
- package/esm2022/lib/model/app.mjs +0 -2
- package/esm2022/lib/model/caching-config.mjs +0 -2
- package/esm2022/lib/model/credentials.mjs +0 -2
- package/esm2022/lib/model/logging-config.mjs +0 -2
- package/esm2022/lib/model/service-options-token.mjs +0 -3
- package/esm2022/lib/model/service-options.mjs +0 -2
- package/esm2022/lib/ngx-lib.module.mjs +0 -37
- package/esm2022/lib/services/app-path-config.service.mjs +0 -50
- package/esm2022/lib/services/service-base.mjs +0 -26
- package/esm2022/msgraph/cleavelandprice-ngx-lib-msgraph.mjs +0 -5
- package/esm2022/msgraph/model/address.mjs +0 -2
- package/esm2022/msgraph/model/attendee.mjs +0 -2
- package/esm2022/msgraph/model/bulk-calendar-events.mjs +0 -2
- package/esm2022/msgraph/model/bulk-calendar-request.mjs +0 -2
- package/esm2022/msgraph/model/calendar-event.mjs +0 -2
- package/esm2022/msgraph/model/coordinates.mjs +0 -2
- package/esm2022/msgraph/model/email-address.mjs +0 -2
- package/esm2022/msgraph/model/location.mjs +0 -2
- package/esm2022/msgraph/model/online-meeting-info.mjs +0 -2
- package/esm2022/msgraph/model/patterned-recurrence.mjs +0 -2
- package/esm2022/msgraph/model/phone.mjs +0 -2
- package/esm2022/msgraph/model/recipient.mjs +0 -2
- package/esm2022/msgraph/model/recurrence-pattern.mjs +0 -2
- package/esm2022/msgraph/model/recurrence-range.mjs +0 -2
- package/esm2022/msgraph/model/response-status.mjs +0 -2
- package/esm2022/msgraph/model/room.mjs +0 -6
- package/esm2022/msgraph/model/user.mjs +0 -132
- package/esm2022/msgraph/msgraph.api.mjs +0 -19
- package/esm2022/msgraph/msgraph.module.mjs +0 -27
- package/esm2022/public_api.mjs +0 -15
- package/esm2022/quill/cleavelandprice-ngx-lib-quill.mjs +0 -5
- package/esm2022/quill/components/editor/editor.component.mjs +0 -282
- package/esm2022/quill/components/raw/raw.component.mjs +0 -30
- package/esm2022/quill/mention/cleavelandprice-ngx-lib-quill-mention.mjs +0 -5
- package/esm2022/quill/mention/components/editor/editor.component.mjs +0 -151
- package/esm2022/quill/mention/model/dialog-data.mjs +0 -2
- package/esm2022/quill/mention/quill-mention.api.mjs +0 -9
- package/esm2022/quill/mention/quill-mention.module.mjs +0 -65
- package/esm2022/quill/model/buttons.mjs +0 -3
- package/esm2022/quill/model/config.mjs +0 -3
- package/esm2022/quill/model/default-buttons.mjs +0 -50
- package/esm2022/quill/model/default-config.mjs +0 -28
- package/esm2022/quill/model/default-icons.mjs +0 -7
- package/esm2022/quill/model/default-tooltips.mjs +0 -53
- package/esm2022/quill/model/dialog-data.mjs +0 -2
- package/esm2022/quill/model/icons.mjs +0 -3
- package/esm2022/quill/model/tooltips.mjs +0 -3
- package/esm2022/quill/quill.api.mjs +0 -13
- package/esm2022/quill/quill.module.mjs +0 -75
- package/esm2022/sharepoint/cleavelandprice-ngx-lib-sharepoint.mjs +0 -5
- package/esm2022/sharepoint/components/user-photo/user-photo.component.mjs +0 -40
- package/esm2022/sharepoint/default-credentials.mjs +0 -6
- package/esm2022/sharepoint/model/base-item.mjs +0 -2
- package/esm2022/sharepoint/model/base-request-credential.mjs +0 -2
- package/esm2022/sharepoint/model/base-request.mjs +0 -2
- package/esm2022/sharepoint/model/cache-object.mjs +0 -3
- package/esm2022/sharepoint/model/file-request.mjs +0 -2
- package/esm2022/sharepoint/model/folder-request.mjs +0 -2
- package/esm2022/sharepoint/model/list-item.mjs +0 -2
- package/esm2022/sharepoint/model/list-items-request.mjs +0 -2
- package/esm2022/sharepoint/model/photo-item.mjs +0 -2
- package/esm2022/sharepoint/model/sharepoint-service-options.mjs +0 -3
- package/esm2022/sharepoint/model/uri-request.mjs +0 -2
- package/esm2022/sharepoint/model/user-request.mjs +0 -2
- package/esm2022/sharepoint/model/user.mjs +0 -2
- package/esm2022/sharepoint/pipes/user-photo-url.pipe.mjs +0 -37
- package/esm2022/sharepoint/services/sharepoint.service.mjs +0 -155
- package/esm2022/sharepoint/sharepoint.api.mjs +0 -17
- package/esm2022/sharepoint/sharepoint.module.mjs +0 -50
- package/esm2022/table/cleavelandprice-ngx-lib-table.mjs +0 -5
- package/esm2022/table/components/table/table.component.mjs +0 -120
- package/esm2022/table/model/table-column.mjs +0 -2
- package/esm2022/table/pipes/decimalPoints.mjs +0 -14
- package/esm2022/table/pipes/roundNumber.mjs +0 -14
- package/esm2022/table/table.api.mjs +0 -6
- package/esm2022/table/table.module.mjs +0 -78
- package/esm2022/upload/cleavelandprice-ngx-lib-upload.mjs +0 -5
- package/esm2022/upload/components/upload/upload.component.mjs +0 -32
- package/esm2022/upload/components/upload-dialog/upload-dialog.component.mjs +0 -98
- package/esm2022/upload/model/database-file-info.mjs +0 -2
- package/esm2022/upload/model/file-upload-request.mjs +0 -2
- package/esm2022/upload/model/filesystem-file-info.mjs +0 -2
- package/esm2022/upload/model/msg-file-content.mjs +0 -5
- package/esm2022/upload/model/upload-service-options-token.mjs +0 -3
- package/esm2022/upload/model/upload-service-options.mjs +0 -3
- package/esm2022/upload/model/upload-status.mjs +0 -2
- package/esm2022/upload/services/upload.service.mjs +0 -106
- package/esm2022/upload/upload.api.mjs +0 -11
- package/esm2022/upload/upload.module.mjs +0 -68
- package/esm2022/url-utilities/cleavelandprice-ngx-lib-url-utilities.mjs +0 -5
- package/esm2022/url-utilities/pipes/safe-resource-url.pipe.mjs +0 -19
- package/esm2022/url-utilities/pipes/safe-url.pipe.mjs +0 -19
- package/esm2022/url-utilities/pipes/uri-scheme.pipe.mjs +0 -106
- package/esm2022/url-utilities/url-utilities.api.mjs +0 -13
- package/esm2022/url-utilities/url-utilities.module.mjs +0 -34
package/esm2022/active-directory/material/components/user-chooser/user-chooser.component.mjs
DELETED
|
@@ -1,437 +0,0 @@
|
|
|
1
|
-
import { Component, inject, ViewChild, viewChild } from '@angular/core';
|
|
2
|
-
import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
-
import { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
|
|
4
|
-
import { MatListItemAvatar, MatListOption, MatSelectionList } from '@angular/material/list';
|
|
5
|
-
import { MatTableDataSource } from '@angular/material/table';
|
|
6
|
-
import { debounceTime, forkJoin, of } from 'rxjs';
|
|
7
|
-
import { ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';
|
|
8
|
-
import { SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';
|
|
9
|
-
import { MatButton, MatIconButton } from '@angular/material/button';
|
|
10
|
-
import { MatFormField } from '@angular/material/form-field';
|
|
11
|
-
import { MatIcon } from '@angular/material/icon';
|
|
12
|
-
import { MatInput } from '@angular/material/input';
|
|
13
|
-
import { MatProgressSpinner } from '@angular/material/progress-spinner';
|
|
14
|
-
import { MatSlideToggle } from '@angular/material/slide-toggle';
|
|
15
|
-
import { MatTooltip } from '@angular/material/tooltip';
|
|
16
|
-
import { DefaultUserChooserData } from '../../model/default-user-chooser-data';
|
|
17
|
-
import { UserChooserMode } from '../../model/user-chooser-mode';
|
|
18
|
-
import * as i0 from "@angular/core";
|
|
19
|
-
import * as i1 from "@angular/forms";
|
|
20
|
-
export class UserChooserComponent {
|
|
21
|
-
constructor() {
|
|
22
|
-
this.#services = {
|
|
23
|
-
dialogRef: inject((MatDialogRef)),
|
|
24
|
-
activeDirectory: inject(ActiveDirectoryService),
|
|
25
|
-
sharePoint: inject(SharePointService),
|
|
26
|
-
data: inject(MAT_DIALOG_DATA)
|
|
27
|
-
};
|
|
28
|
-
this._data = { ...DefaultUserChooserData, ...this.#services.data };
|
|
29
|
-
//#region Fields
|
|
30
|
-
//@ViewChild(MatSelectionList) selectionList?: MatSelectionList;
|
|
31
|
-
this.selectionList = viewChild(MatSelectionList);
|
|
32
|
-
//filterInput = viewChild<ElementRef>('filterInput');
|
|
33
|
-
this.filterForm = new FormGroup({
|
|
34
|
-
filter: new FormControl()
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
#services;
|
|
38
|
-
set filterInput(elRef) {
|
|
39
|
-
if (elRef) {
|
|
40
|
-
elRef.nativeElement.focus();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
;
|
|
44
|
-
//#endregion
|
|
45
|
-
//#region Properties
|
|
46
|
-
get isMultiMode() {
|
|
47
|
-
return this._data.mode === UserChooserMode.Multiple;
|
|
48
|
-
}
|
|
49
|
-
get selectedOptions() {
|
|
50
|
-
return this.selectionList()?.options.filter(o => o.selected) ?? [];
|
|
51
|
-
}
|
|
52
|
-
get selectedUsers() {
|
|
53
|
-
return this.dataSource?.data?.filter(d => d.selected) ?? [];
|
|
54
|
-
}
|
|
55
|
-
get filterValue() {
|
|
56
|
-
return this.filterForm.value.filter;
|
|
57
|
-
}
|
|
58
|
-
get adGroupsNeeded() {
|
|
59
|
-
// If any are these are true, then we need to pull AD groups for use later
|
|
60
|
-
return (this._data.showGroupMembershipTooltips ?? false) ||
|
|
61
|
-
(this._data.exclusions?.groups?.length ?? 0) > 0 ||
|
|
62
|
-
(this._data.inclusions?.groups?.length ?? 0) > 0 ||
|
|
63
|
-
(this._data.preSelections?.groups?.length ?? 0) > 0 ||
|
|
64
|
-
this._data.filterOptions?.groupMembership ||
|
|
65
|
-
(this._data.selectableGroupNames?.length ?? 0) > 0 ||
|
|
66
|
-
(this._data.groups?.length ?? 0) > 0;
|
|
67
|
-
}
|
|
68
|
-
//#endregion
|
|
69
|
-
//#region Lifecycle
|
|
70
|
-
ngOnInit() {
|
|
71
|
-
this.#getData();
|
|
72
|
-
this.#listenForFilterChanges();
|
|
73
|
-
}
|
|
74
|
-
//#endregion
|
|
75
|
-
//#region Events
|
|
76
|
-
listSelectionChanged(options) {
|
|
77
|
-
if (this._data.mode === UserChooserMode.Single &&
|
|
78
|
-
this.selectedOptions.length &&
|
|
79
|
-
this._data.closeWhenSelectionMade) {
|
|
80
|
-
this.close();
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
optionSelectionChanged(option) {
|
|
84
|
-
const user = this.dataSource?.data
|
|
85
|
-
.find(u => u.sAMAccountName.toLocaleLowerCase() === option.value.sAMAccountName.toLowerCase());
|
|
86
|
-
if (user) {
|
|
87
|
-
// If we are in single user selection mode, deselect any existing selections first
|
|
88
|
-
if (!this.isMultiMode && option.selected) {
|
|
89
|
-
this.dataSource?.data
|
|
90
|
-
.filter(u => u.sAMAccountName.toLowerCase() !== option.value.sAMAccountName.toLowerCase())
|
|
91
|
-
.forEach(u => u.selected = false);
|
|
92
|
-
}
|
|
93
|
-
user.selected = option.selected;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
hideUnselectedChanged(selected) {
|
|
97
|
-
this.filterForm.get('filter')?.setValue(selected ? '{selected:true}' : null);
|
|
98
|
-
}
|
|
99
|
-
selectAll() {
|
|
100
|
-
this.selectionList()?.selectAll();
|
|
101
|
-
if (this.selectionList()?.options) {
|
|
102
|
-
this.listSelectionChanged(this.selectionList().options.toArray());
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
deselectAll() {
|
|
106
|
-
this.selectionList()?.deselectAll();
|
|
107
|
-
}
|
|
108
|
-
//#endregion
|
|
109
|
-
//#region Utilities
|
|
110
|
-
isUser(userOrGroup) {
|
|
111
|
-
return 'title' in userOrGroup;
|
|
112
|
-
}
|
|
113
|
-
castUser(userOrGroup) {
|
|
114
|
-
return userOrGroup;
|
|
115
|
-
}
|
|
116
|
-
#getData() {
|
|
117
|
-
const observables$ = [
|
|
118
|
-
this._data.users?.length ?
|
|
119
|
-
// Users were passed in
|
|
120
|
-
of(this._data.users) :
|
|
121
|
-
// Users need to be retrieved
|
|
122
|
-
this.#services.activeDirectory.getUsers(false, this._data.includeDisabledUsers, this._data.parentOu),
|
|
123
|
-
this._data.photos?.length ?
|
|
124
|
-
// Photos were passed in
|
|
125
|
-
of(this._data.photos) :
|
|
126
|
-
// Photos need to be retrieved
|
|
127
|
-
this.#services.sharePoint.getPhotos()
|
|
128
|
-
];
|
|
129
|
-
// Do we need AD groups?
|
|
130
|
-
if (this.adGroupsNeeded) {
|
|
131
|
-
observables$.push(this._data.groups?.length ?
|
|
132
|
-
// Groups were passed in
|
|
133
|
-
of(this._data.groups) :
|
|
134
|
-
// Groups need to be retrieved
|
|
135
|
-
this.#services.activeDirectory.getGroups());
|
|
136
|
-
}
|
|
137
|
-
forkJoin(observables$)
|
|
138
|
-
//.subscribe(([users, photos]) => {
|
|
139
|
-
.subscribe(data => {
|
|
140
|
-
// Need groups in place before we handle exclusions/inclusions/pre-selections
|
|
141
|
-
this.groups = this.adGroupsNeeded ?
|
|
142
|
-
data[2] :
|
|
143
|
-
null;
|
|
144
|
-
let users = data[0];
|
|
145
|
-
users.forEach(u => u.selected = false); // In case existing data was re-used
|
|
146
|
-
users = this.#includeUsersByAccountName(users);
|
|
147
|
-
users = this.#includeUsersByGroupName(users);
|
|
148
|
-
users = this.#includeUsersByDepartment(users);
|
|
149
|
-
users = this.#includeUsersByTitle(users);
|
|
150
|
-
users = this.#excludeUsersByAccountName(users);
|
|
151
|
-
users = this.#excludeUsersByGroupName(users);
|
|
152
|
-
users = this.#excludeUsersByDepartment(users);
|
|
153
|
-
users = this.#excludeUsersByTitle(users);
|
|
154
|
-
users = this.#preSelectUsersByAccountName(users);
|
|
155
|
-
users = this.#preSelectUsersByGroupName(users);
|
|
156
|
-
users = this.#preSelectUsersByDepartment(users);
|
|
157
|
-
users = this.#preSelectUsersByTitle(users);
|
|
158
|
-
this.#preSelectGroupsByAccountName();
|
|
159
|
-
const usersAndGroups = [];
|
|
160
|
-
// Should we allow users to be selected?
|
|
161
|
-
if (['users', '*'].includes(this._data.objectTypes)) {
|
|
162
|
-
usersAndGroups.push(...users);
|
|
163
|
-
}
|
|
164
|
-
// Should we allow groups to be selected
|
|
165
|
-
if (['groups', '*'].includes(this._data.objectTypes)) {
|
|
166
|
-
if (this._data.selectableGroupNames?.length) {
|
|
167
|
-
if (this._data.selectableGroupNames.includes('*')) {
|
|
168
|
-
usersAndGroups.push(...this.groups);
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
this._data.selectableGroupNames
|
|
172
|
-
.forEach(groupName => {
|
|
173
|
-
const group = this.groups.find(g => g.displayName === groupName);
|
|
174
|
-
if (group) {
|
|
175
|
-
usersAndGroups.push({
|
|
176
|
-
...group,
|
|
177
|
-
selected: group.selected
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
this.dataSource = new MatTableDataSource(usersAndGroups);
|
|
185
|
-
this.photos = data[1];
|
|
186
|
-
this.#setFilterPredicate();
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
close() {
|
|
190
|
-
if (!this.selectedUsers?.length) {
|
|
191
|
-
this.#services.dialogRef.close(this._data.allowCloseWithoutSelections ? [] : undefined);
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
const value = this.selectedUsers
|
|
195
|
-
.map(u => this._data.returnUserObjects ? u : u.sAMAccountName);
|
|
196
|
-
this.#services.dialogRef.close(this._data.mode === UserChooserMode.Multiple ?
|
|
197
|
-
value :
|
|
198
|
-
value[0]);
|
|
199
|
-
}
|
|
200
|
-
getPhoto(user) {
|
|
201
|
-
if (!this.isUser(user)) {
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
return this.photos?.find(p => (p.employeeNumber && p.employeeNumber.toString() === user.employeeNumber) ||
|
|
205
|
-
p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||
|
|
206
|
-
p.displayName?.toLowerCase() === (user.displayName ?? user.name).toLowerCase() ||
|
|
207
|
-
p.title?.toLowerCase() === (user.displayName ?? user.name).toLowerCase())?.encodedAbsUrl;
|
|
208
|
-
}
|
|
209
|
-
//#region Exclusions - won't be included in the dataSource at all
|
|
210
|
-
#excludeUsersByAccountName(users) {
|
|
211
|
-
this._data.exclusions?.accountNames
|
|
212
|
-
?.forEach(accountName => {
|
|
213
|
-
const index = users.findIndex(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());
|
|
214
|
-
if (index === -1) {
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
users.splice(index, 1);
|
|
218
|
-
});
|
|
219
|
-
return users;
|
|
220
|
-
}
|
|
221
|
-
#excludeUsersByGroupName(users) {
|
|
222
|
-
this._data.exclusions?.groups
|
|
223
|
-
?.forEach(groupName => {
|
|
224
|
-
const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());
|
|
225
|
-
if (!group) {
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
group.member.forEach(groupMemberDn => {
|
|
229
|
-
const index = users.findIndex(u => u.distinguishedName === groupMemberDn);
|
|
230
|
-
if (index === -1) {
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
users.splice(index, 1);
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
return users;
|
|
237
|
-
}
|
|
238
|
-
#excludeUsersByDepartment(users) {
|
|
239
|
-
this._data.exclusions?.departments
|
|
240
|
-
?.forEach(department => {
|
|
241
|
-
const excludedUsers = users.filter(u => u.department?.toLowerCase() === department.toLowerCase());
|
|
242
|
-
excludedUsers.forEach(user => {
|
|
243
|
-
const index = users.indexOf(user);
|
|
244
|
-
users.splice(index, 1);
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
return users;
|
|
248
|
-
}
|
|
249
|
-
#excludeUsersByTitle(users) {
|
|
250
|
-
this._data.exclusions?.titles
|
|
251
|
-
?.forEach(title => {
|
|
252
|
-
const excludedUsers = users.filter(u => u.title?.toLowerCase() === title.toLowerCase());
|
|
253
|
-
excludedUsers.forEach(user => {
|
|
254
|
-
const index = users.indexOf(user);
|
|
255
|
-
users.splice(index, 1);
|
|
256
|
-
});
|
|
257
|
-
});
|
|
258
|
-
return users;
|
|
259
|
-
}
|
|
260
|
-
//#endregion
|
|
261
|
-
//#region Inclusions - only these will be included in the dataSource
|
|
262
|
-
#includeUsersByAccountName(users) {
|
|
263
|
-
return users.filter(user => !this._data.inclusions?.accountNames?.length || // No account inclusions specified
|
|
264
|
-
this._data.inclusions.accountNames.find(accountName => accountName.toLowerCase() === user.sAMAccountName.toLowerCase()));
|
|
265
|
-
}
|
|
266
|
-
#includeUsersByDepartment(users) {
|
|
267
|
-
return users.filter(user => !this._data.inclusions?.departments?.length || // No department inclusions specified
|
|
268
|
-
this._data.inclusions.departments.find(department => department.toLowerCase() === user.department?.toLowerCase()));
|
|
269
|
-
}
|
|
270
|
-
#includeUsersByTitle(users) {
|
|
271
|
-
return users.filter(user => !this._data.inclusions?.titles?.length || // No title inclusions specified
|
|
272
|
-
this._data.inclusions.titles.find(title => title.toLowerCase() === user.title?.toLowerCase()));
|
|
273
|
-
}
|
|
274
|
-
#includeUsersByGroupName(users) {
|
|
275
|
-
if (!this._data.inclusions?.groups?.length) {
|
|
276
|
-
return users; // No group inclusions specified
|
|
277
|
-
}
|
|
278
|
-
// Cheating a bit and leveraging the 'selected' property to keep track of who should be included
|
|
279
|
-
// Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done
|
|
280
|
-
this._data.inclusions.groups
|
|
281
|
-
.forEach(groupName => {
|
|
282
|
-
const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());
|
|
283
|
-
if (!group) {
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
users
|
|
287
|
-
.filter(user => group.member.find(groupMemberDn => groupMemberDn === user.distinguishedName))
|
|
288
|
-
.forEach(user => user.selected = true);
|
|
289
|
-
});
|
|
290
|
-
// At this point, all of the appropriate users should have 'selected' set to true
|
|
291
|
-
const selectedUsers = users.filter(user => user.selected); // Subset of the original list
|
|
292
|
-
// Reset 'selected' to false, and return
|
|
293
|
-
selectedUsers.forEach(user => user.selected = false);
|
|
294
|
-
return selectedUsers;
|
|
295
|
-
}
|
|
296
|
-
//#endregion
|
|
297
|
-
//#region Pre-Selections
|
|
298
|
-
#preSelectUsersByAccountName(users) {
|
|
299
|
-
this._data.preSelections?.accountNames
|
|
300
|
-
?.forEach(accountName => {
|
|
301
|
-
const user = users.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());
|
|
302
|
-
if (!user) {
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
user.selected = true;
|
|
306
|
-
});
|
|
307
|
-
return users;
|
|
308
|
-
}
|
|
309
|
-
#preSelectGroupsByAccountName() {
|
|
310
|
-
this._data.preSelections?.accountNames
|
|
311
|
-
?.forEach(accountName => {
|
|
312
|
-
const group = this.groups?.find(g => g.sAMAccountName.toLowerCase() === accountName.toLowerCase());
|
|
313
|
-
if (!group) {
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
group.selected = true;
|
|
317
|
-
});
|
|
318
|
-
;
|
|
319
|
-
}
|
|
320
|
-
#preSelectUsersByDepartment(users) {
|
|
321
|
-
this._data.preSelections?.departments
|
|
322
|
-
?.forEach(department => users
|
|
323
|
-
.filter(u => u.department?.toLowerCase() === department.toLowerCase())
|
|
324
|
-
.forEach(user => user.selected = true));
|
|
325
|
-
return users;
|
|
326
|
-
}
|
|
327
|
-
#preSelectUsersByTitle(users) {
|
|
328
|
-
this._data.preSelections?.titles
|
|
329
|
-
?.forEach(title => users
|
|
330
|
-
.filter(u => u.title?.toLowerCase() === title.toLowerCase())
|
|
331
|
-
.forEach(user => user.selected = true));
|
|
332
|
-
return users;
|
|
333
|
-
}
|
|
334
|
-
#preSelectUsersByGroupName(users) {
|
|
335
|
-
this._data.preSelections?.groups
|
|
336
|
-
?.forEach(groupName => {
|
|
337
|
-
const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());
|
|
338
|
-
if (!group) {
|
|
339
|
-
return;
|
|
340
|
-
}
|
|
341
|
-
group.member.forEach(groupMemberDn => {
|
|
342
|
-
const user = users.find(u => u.distinguishedName === groupMemberDn);
|
|
343
|
-
if (!user) {
|
|
344
|
-
return;
|
|
345
|
-
}
|
|
346
|
-
user.selected = true;
|
|
347
|
-
});
|
|
348
|
-
});
|
|
349
|
-
return users;
|
|
350
|
-
}
|
|
351
|
-
//#endregion
|
|
352
|
-
#setFilterPredicate() {
|
|
353
|
-
if (!this.dataSource) {
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
this.dataSource.filterPredicate = (user, filter) => {
|
|
357
|
-
if (filter === '{selected:true}') {
|
|
358
|
-
return user.selected;
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
const regex = new RegExp(filter, 'i'); // Case-insensitive
|
|
362
|
-
let match = false; // The end result - whether or not a employee matches the filter
|
|
363
|
-
const filterProperties = ['displayName'];
|
|
364
|
-
if (this._data.filterOptions?.accountName) {
|
|
365
|
-
filterProperties.push('sAMAccountName');
|
|
366
|
-
}
|
|
367
|
-
if (this._data.filterOptions?.title) {
|
|
368
|
-
filterProperties.push('title');
|
|
369
|
-
}
|
|
370
|
-
if (this._data.filterOptions?.department) {
|
|
371
|
-
filterProperties.push('department');
|
|
372
|
-
}
|
|
373
|
-
if (this._data.filterOptions?.phoneNumber) {
|
|
374
|
-
filterProperties.push('telephoneNumber');
|
|
375
|
-
}
|
|
376
|
-
// Match on the properties configured above
|
|
377
|
-
filterProperties
|
|
378
|
-
.forEach(field => {
|
|
379
|
-
// @ts-ignore
|
|
380
|
-
if (user[field] && user[field].match(regex)) {
|
|
381
|
-
match = true;
|
|
382
|
-
}
|
|
383
|
-
});
|
|
384
|
-
// Match on group membership (group name)
|
|
385
|
-
if (this._data.filterOptions?.groupMembership) {
|
|
386
|
-
user.memberOf.forEach(groupDn => {
|
|
387
|
-
const group = this.groups?.find(group => group.distinguishedName === groupDn && group.name.match(regex));
|
|
388
|
-
if (group) {
|
|
389
|
-
match = true;
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
return match;
|
|
394
|
-
}
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
#listenForFilterChanges() {
|
|
398
|
-
this.filterForm.get('filter')?.valueChanges
|
|
399
|
-
.pipe(debounceTime(250))
|
|
400
|
-
.subscribe(() => this.dataSource.filter = this.filterForm.value.filter?.trim().toLowerCase());
|
|
401
|
-
}
|
|
402
|
-
tooltip(user) {
|
|
403
|
-
return this._data.showGroupMembershipTooltips ?
|
|
404
|
-
user.memberOf
|
|
405
|
-
.map(groupDn => this.groups
|
|
406
|
-
?.find(group => group.distinguishedName === groupDn)?.name)
|
|
407
|
-
.sort((a, b) => a > b ? 1 : -1)
|
|
408
|
-
.join('\n') :
|
|
409
|
-
'';
|
|
410
|
-
}
|
|
411
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: UserChooserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
412
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: UserChooserComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true, isSignal: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }], ngImport: i0, template: "<div id=\"dialog-title\">\r\n <h2 mat-dialog-title>{{ _data.title }}</h2>\r\n\r\n <div id=\"num-selected\">\r\n {{ selectedOptions.length }} selected\r\n </div>\r\n</div>\r\n\r\n<mat-dialog-content>\r\n @if (dataSource && photos) {\r\n <form [formGroup]=\"filterForm\">\r\n @if (dataSource) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\r\n @if (filterForm.value.filter) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n }\r\n </mat-form-field>\r\n }\r\n </form>\r\n <mat-selection-list [multiple]=\"isMultiMode\"\r\n (selectionChange)=\"listSelectionChanged($event.options)\">\r\n @for (user of dataSource.filteredData; track user) {\r\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\r\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\r\n @if (getPhoto(user)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\r\n } @else {\r\n <mat-icon matListItemAvatar class=\"no-photo\"\r\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\r\n }\r\n <div class=\"user\">\r\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\r\n {{ user.displayName ?? user.name }}\r\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\r\n <div>{{ castUser(user).telephoneNumber }}</div>\r\n }\r\n </div>\r\n @if (isUser(user)) {\r\n <div>{{ castUser(user).department }}</div>\r\n <div class=\"title\">{{ castUser(user).title }}</div>\r\n }\r\n </div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n } @else {\r\n <div>\r\n <mat-spinner [diameter]=\"50\"/>\r\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\r\n </div>\r\n }\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n @if (dataSource && photos) {\r\n @if (selectedOptions.length) {\r\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\r\n Hide Unselected\r\n </mat-slide-toggle>\r\n }\r\n @if (isMultiMode) {\r\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\r\n >\r\n <mat-icon fontIcon=\"select_all\"/>\r\n <span class=\"hide-mobile\">Select All</span>\r\n </button>\r\n }\r\n @if (isMultiMode && selectedOptions.length) {\r\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\r\n >\r\n <mat-icon fontIcon=\"clear_all\"/>\r\n <span class=\"hide-mobile\">Clear All</span>\r\n </button>\r\n }\r\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\r\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\r\n [disabled]=\"!_data.allowCloseWithoutSelections && !selectedOptions.length\">\r\n <mat-icon fontIcon=\"check\"/>\r\n <span class=\"hide-mobile\">Ok</span>\r\n </button>\r\n }\r\n }\r\n\r\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\r\n <mat-icon fontIcon=\"close\"/>\r\n <span class=\"hide-mobile\">Cancel</span>\r\n </button>\r\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}#num-selected{margin:1em 1em 0 0}mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width: 801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "component", type: MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
|
|
413
|
-
}
|
|
414
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: UserChooserComponent, decorators: [{
|
|
415
|
-
type: Component,
|
|
416
|
-
args: [{ standalone: true, imports: [
|
|
417
|
-
MatButton,
|
|
418
|
-
MatDialogActions,
|
|
419
|
-
MatDialogClose,
|
|
420
|
-
MatDialogContent,
|
|
421
|
-
MatFormField,
|
|
422
|
-
MatIcon,
|
|
423
|
-
MatIconButton,
|
|
424
|
-
MatInput,
|
|
425
|
-
MatListItemAvatar,
|
|
426
|
-
MatListOption,
|
|
427
|
-
MatProgressSpinner,
|
|
428
|
-
MatSelectionList,
|
|
429
|
-
MatSlideToggle,
|
|
430
|
-
MatTooltip,
|
|
431
|
-
ReactiveFormsModule,
|
|
432
|
-
], template: "<div id=\"dialog-title\">\r\n <h2 mat-dialog-title>{{ _data.title }}</h2>\r\n\r\n <div id=\"num-selected\">\r\n {{ selectedOptions.length }} selected\r\n </div>\r\n</div>\r\n\r\n<mat-dialog-content>\r\n @if (dataSource && photos) {\r\n <form [formGroup]=\"filterForm\">\r\n @if (dataSource) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\r\n @if (filterForm.value.filter) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n }\r\n </mat-form-field>\r\n }\r\n </form>\r\n <mat-selection-list [multiple]=\"isMultiMode\"\r\n (selectionChange)=\"listSelectionChanged($event.options)\">\r\n @for (user of dataSource.filteredData; track user) {\r\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\r\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\r\n @if (getPhoto(user)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\r\n } @else {\r\n <mat-icon matListItemAvatar class=\"no-photo\"\r\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\r\n }\r\n <div class=\"user\">\r\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\r\n {{ user.displayName ?? user.name }}\r\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\r\n <div>{{ castUser(user).telephoneNumber }}</div>\r\n }\r\n </div>\r\n @if (isUser(user)) {\r\n <div>{{ castUser(user).department }}</div>\r\n <div class=\"title\">{{ castUser(user).title }}</div>\r\n }\r\n </div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n } @else {\r\n <div>\r\n <mat-spinner [diameter]=\"50\"/>\r\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\r\n </div>\r\n }\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n @if (dataSource && photos) {\r\n @if (selectedOptions.length) {\r\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\r\n Hide Unselected\r\n </mat-slide-toggle>\r\n }\r\n @if (isMultiMode) {\r\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\r\n >\r\n <mat-icon fontIcon=\"select_all\"/>\r\n <span class=\"hide-mobile\">Select All</span>\r\n </button>\r\n }\r\n @if (isMultiMode && selectedOptions.length) {\r\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\r\n >\r\n <mat-icon fontIcon=\"clear_all\"/>\r\n <span class=\"hide-mobile\">Clear All</span>\r\n </button>\r\n }\r\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\r\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\r\n [disabled]=\"!_data.allowCloseWithoutSelections && !selectedOptions.length\">\r\n <mat-icon fontIcon=\"check\"/>\r\n <span class=\"hide-mobile\">Ok</span>\r\n </button>\r\n }\r\n }\r\n\r\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\r\n <mat-icon fontIcon=\"close\"/>\r\n <span class=\"hide-mobile\">Cancel</span>\r\n </button>\r\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}#num-selected{margin:1em 1em 0 0}mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width: 801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"] }]
|
|
433
|
-
}], propDecorators: { filterInput: [{
|
|
434
|
-
type: ViewChild,
|
|
435
|
-
args: ['filterInput']
|
|
436
|
-
}] } });
|
|
437
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvbWF0ZXJpYWwvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hY3RpdmUtZGlyZWN0b3J5L21hdGVyaWFsL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQVUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxFQUFhLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFbkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUs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YixRQUFRLGlVQUNSLGlCQUFpQixnRUFDakIsYUFBYSxvTUFDYixrQkFBa0IsK0tBQ2xCLGdCQUFnQix1TkFDaEIsY0FBYyxtVEFDZCxVQUFVLGdSQUNWLG1CQUFtQjs7MkZBT1Ysb0JBQW9CO2tCQXpCaEMsU0FBUztpQ0FDSSxJQUFJLFdBRVA7d0JBQ1AsU0FBUzt3QkFDVCxnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixRQUFRO3dCQUNSLGlCQUFpQjt3QkFDakIsYUFBYTt3QkFDYixrQkFBa0I7d0JBQ2xCLGdCQUFnQjt3QkFDaEIsY0FBYzt3QkFDZCxVQUFVO3dCQUNWLG1CQUFtQjtxQkFDcEI7OEJBb0I2QixXQUFXO3NCQUF4QyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGluamVjdCwgT25Jbml0LCBWaWV3Q2hpbGQsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlLCBNYXREaWFsb2dDb250ZW50LCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNYXRMaXN0SXRlbUF2YXRhciwgTWF0TGlzdE9wdGlvbiwgTWF0U2VsZWN0aW9uTGlzdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xpc3QnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnknO1xyXG5pbXBvcnQgeyBQaG90b0l0ZW0sIFNoYXJlUG9pbnRTZXJ2aWNlIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL3NoYXJlcG9pbnQnO1xyXG5cclxuaW1wb3J0IHsgTWF0QnV0dG9uLCBNYXRJY29uQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xyXG5pbXBvcnQgeyBNYXRTbGlkZVRvZ2dsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlLXRvZ2dsZSc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgRGVmYXVsdFVzZXJDaG9vc2VyRGF0YSB9IGZyb20gJy4uLy4uL21vZGVsL2RlZmF1bHQtdXNlci1jaG9vc2VyLWRhdGEnO1xyXG5pbXBvcnQgeyBTZWxlY3RhYmxlR3JvdXAgfSBmcm9tICcuLi8uLi9tb2RlbC9zZWxlY3RhYmxlLWdyb3VwJztcclxuaW1wb3J0IHsgU2VsZWN0YWJsZVVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9zZWxlY3RhYmxlLXVzZXInO1xyXG5pbXBvcnQgeyBVc2VyQ2hvb3NlckRhdGEgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyLWNob29zZXItZGF0YSc7XHJcbmltcG9ydCB7IFVzZXJDaG9vc2VyTW9kZSB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXItY2hvb3Nlci1tb2RlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItY2hvb3Nlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTWF0QnV0dG9uLFxyXG4gICAgTWF0RGlhbG9nQWN0aW9ucyxcclxuICAgIE1hdERpYWxvZ0Nsb3NlLFxyXG4gICAgTWF0RGlhbG9nQ29udGVudCxcclxuICAgIE1hdEZvcm1GaWVsZCxcclxuICAgIE1hdEljb24sXHJcbiAgICBNYXRJY29uQnV0dG9uLFxyXG4gICAgTWF0SW5wdXQsXHJcbiAgICBNYXRMaXN0SXRlbUF2YXRhcixcclxuICAgIE1hdExpc3RPcHRpb24sXHJcbiAgICBNYXRQcm9ncmVzc1NwaW5uZXIsXHJcbiAgICBNYXRTZWxlY3Rpb25MaXN0LFxyXG4gICAgTWF0U2xpZGVUb2dnbGUsXHJcbiAgICBNYXRUb29sdGlwLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBdLFxyXG4gIHN0eWxlVXJsczogW1xyXG4gICAgJy4vdXNlci1jaG9vc2VyLmNvbXBvbmVudC5zY3NzJyxcclxuICAgICcuLi8uLi8uLi8uLi8uLi9zdHlsZXMvbWF0LWljb24uc2NzcydcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyQ2hvb3NlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgI3NlcnZpY2VzID0ge1xyXG4gICAgZGlhbG9nUmVmOiBpbmplY3QoTWF0RGlhbG9nUmVmPFVzZXJDaG9vc2VyQ29tcG9uZW50PiksXHJcbiAgICBhY3RpdmVEaXJlY3Rvcnk6IGluamVjdChBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlKSxcclxuICAgIHNoYXJlUG9pbnQ6IGluamVjdChTaGFyZVBvaW50U2VydmljZSksXHJcbiAgICBkYXRhOiBpbmplY3Q8VXNlckNob29zZXJEYXRhPihNQVRfRElBTE9HX0RBVEEpXHJcbiAgfTtcclxuICBfZGF0YSA9IHsuLi5EZWZhdWx0VXNlckNob29zZXJEYXRhLCAuLi50aGlzLiNzZXJ2aWNlcy5kYXRhfTtcclxuICBcclxuICAvLyNyZWdpb24gRmllbGRzXHJcbiAgXHJcbiAgLy9AVmlld0NoaWxkKE1hdFNlbGVjdGlvbkxpc3QpIHNlbGVjdGlvbkxpc3Q/OiBNYXRTZWxlY3Rpb25MaXN0O1xyXG4gIHNlbGVjdGlvbkxpc3QgPSB2aWV3Q2hpbGQoTWF0U2VsZWN0aW9uTGlzdCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlcklucHV0Jykgc2V0IGZpbHRlcklucHV0KGVsUmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+KSB7XHJcbiAgICBpZiAoZWxSZWYpIHtcclxuICAgICAgZWxSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgLy9maWx0ZXJJbnB1dCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZmlsdGVySW5wdXQnKTtcclxuXHJcbiAgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgZmlsdGVyOiBuZXcgRm9ybUNvbnRyb2woKVxyXG4gIH0pO1xyXG5cclxuICBkYXRhU291cmNlPzogTWF0VGFibGVEYXRhU291cmNlPFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwPjtcclxuICBwaG90b3M/OiBQaG90b0l0ZW1bXTtcclxuICBncm91cHM/OiBTZWxlY3RhYmxlR3JvdXBbXTsgLy8gTWF5IG9yIG1heSBub3QgZ2V0IHBvcHVsYXRlZCwgZGVwZW5kaW5nIG9uIGNvbmZpZyBkYXRhIHNlbnQgaW5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIFByb3BlcnRpZXNcclxuICBnZXQgaXNNdWx0aU1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuTXVsdGlwbGU7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRPcHRpb25zKCk6IE1hdExpc3RPcHRpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25MaXN0KCk/Lm9wdGlvbnMuZmlsdGVyKG8gPT4gby5zZWxlY3RlZCkgPz8gW107XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRVc2VycygpOiAoU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8uZGF0YT8uZmlsdGVyKGQgPT4gZC5zZWxlY3RlZCkgPz8gW107XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckZvcm0udmFsdWUuZmlsdGVyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFkR3JvdXBzTmVlZGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gSWYgYW55IGFyZSB0aGVzZSBhcmUgdHJ1ZSwgdGhlbiB3ZSBuZWVkIHRvIHB1bGwgQUQgZ3JvdXBzIGZvciB1c2UgbGF0ZXJcclxuICAgIHJldHVybiAodGhpcy5fZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgPz8gZmFsc2UpIHx8XHJcbiAgICAgICh0aGlzLl9kYXRhLmV4Y2x1c2lvbnM/Lmdyb3Vwcz8ubGVuZ3RoID8/IDApID4gMCB8fFxyXG4gICAgICAodGhpcy5fZGF0YS5pbmNsdXNpb25zPy5ncm91cHM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcclxuICAgICAgKHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8uZ3JvdXBzPy5sZW5ndGggPz8gMCkgPiAwIHx8XHJcbiAgICAgIHRoaXMuX2RhdGEuZmlsdGVyT3B0aW9ucz8uZ3JvdXBNZW1iZXJzaGlwIHx8XHJcbiAgICAgICh0aGlzLl9kYXRhLnNlbGVjdGFibGVHcm91cE5hbWVzPy5sZW5ndGggPz8gMCkgPiAwIHx8XHJcbiAgICAgICh0aGlzLl9kYXRhLmdyb3Vwcz8ubGVuZ3RoID8/IDApID4gMDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBMaWZlY3ljbGVcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuI2dldERhdGEoKTtcclxuICAgIHRoaXMuI2xpc3RlbkZvckZpbHRlckNoYW5nZXMoKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBFdmVudHNcclxuICBsaXN0U2VsZWN0aW9uQ2hhbmdlZChvcHRpb25zOiBNYXRMaXN0T3B0aW9uW10pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5TaW5nbGUgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoICYmXHJcbiAgICAgIHRoaXMuX2RhdGEuY2xvc2VXaGVuU2VsZWN0aW9uTWFkZVxyXG4gICAgICApIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcHRpb246IE1hdExpc3RPcHRpb24pOiB2b2lkIHtcclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmRhdGFTb3VyY2U/LmRhdGFcclxuICAgICAgLmZpbmQodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IChvcHRpb24udmFsdWUgYXMgU2VsZWN0YWJsZVVzZXIpLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xyXG5cclxuICAgIGlmICh1c2VyKSB7XHJcbiAgICAgIC8vIElmIHdlIGFyZSBpbiBzaW5nbGUgdXNlciBzZWxlY3Rpb24gbW9kZSwgZGVzZWxlY3QgYW55IGV4aXN0aW5nIHNlbGVjdGlvbnMgZmlyc3RcclxuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlNb2RlICYmIG9wdGlvbi5zZWxlY3RlZCkge1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZT8uZGF0YVxyXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSAhPT0gKG9wdGlvbi52YWx1ZSBhcyBTZWxlY3RhYmxlVXNlcikuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICAgIC5mb3JFYWNoKHUgPT4gdS5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdXNlci5zZWxlY3RlZCA9IG9wdGlvbi5zZWxlY3RlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhpZGVVbnNlbGVjdGVkQ2hhbmdlZChzZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnNldFZhbHVlKHNlbGVjdGVkID8gJ3tzZWxlY3RlZDp0cnVlfScgOiBudWxsKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEFsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uTGlzdCgpPy5zZWxlY3RBbGwoKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25MaXN0KCk/Lm9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5saXN0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzLnNlbGVjdGlvbkxpc3QoKSEub3B0aW9ucy50b0FycmF5KCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGVzZWxlY3RBbGwoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkxpc3QoKT8uZGVzZWxlY3RBbGwoKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBVdGlsaXRpZXNcclxuICBpc1VzZXIodXNlck9yR3JvdXA6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gJ3RpdGxlJyBpbiB1c2VyT3JHcm91cDtcclxuICB9XHJcbiAgY2FzdFVzZXIodXNlck9yR3JvdXA6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogU2VsZWN0YWJsZVVzZXIge1xyXG4gICAgcmV0dXJuIHVzZXJPckdyb3VwIGFzIFNlbGVjdGFibGVVc2VyO1xyXG4gIH1cclxuXHJcbiAgI2dldERhdGEoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvYnNlcnZhYmxlcyQ6IE9ic2VydmFibGU8YW55PltdID0gW1xyXG4gICAgICB0aGlzLl9kYXRhLnVzZXJzPy5sZW5ndGggP1xyXG4gICAgICAgIC8vIFVzZXJzIHdlcmUgcGFzc2VkIGluXHJcbiAgICAgICAgb2YodGhpcy5fZGF0YS51c2VycykgOlxyXG4gICAgICAgIC8vIFVzZXJzIG5lZWQgdG8gYmUgcmV0cmlldmVkXHJcbiAgICAgICAgdGhpcy4jc2VydmljZXMuYWN0aXZlRGlyZWN0b3J5LmdldFVzZXJzKGZhbHNlLCB0aGlzLl9kYXRhLmluY2x1ZGVEaXNhYmxlZFVzZXJzLCB0aGlzLl9kYXRhLnBhcmVudE91KSxcclxuXHJcbiAgICAgIHRoaXMuX2RhdGEucGhvdG9zPy5sZW5ndGggP1xyXG4gICAgICAgIC8vIFBob3RvcyB3ZXJlIHBhc3NlZCBpblxyXG4gICAgICAgIG9mKHRoaXMuX2RhdGEucGhvdG9zKSA6XHJcbiAgICAgICAgLy8gUGhvdG9zIG5lZWQgdG8gYmUgcmV0cmlldmVkXHJcbiAgICAgICAgdGhpcy4jc2VydmljZXMuc2hhcmVQb2ludC5nZXRQaG90b3MoKVxyXG4gICAgXTtcclxuXHJcbiAgICAvLyBEbyB3ZSBuZWVkIEFEIGdyb3Vwcz9cclxuICAgIGlmICh0aGlzLmFkR3JvdXBzTmVlZGVkKSB7XHJcbiAgICAgIG9ic2VydmFibGVzJC5wdXNoKFxyXG4gICAgICAgIHRoaXMuX2RhdGEuZ3JvdXBzPy5sZW5ndGggP1xyXG4gICAgICAgICAgLy8gR3JvdXBzIHdlcmUgcGFzc2VkIGluXHJcbiAgICAgICAgICBvZih0aGlzLl9kYXRhLmdyb3VwcykgOlxyXG4gICAgICAgICAgLy8gR3JvdXBzIG5lZWQgdG8gYmUgcmV0cmlldmVkXHJcbiAgICAgICAgICB0aGlzLiNzZXJ2aWNlcy5hY3RpdmVEaXJlY3RvcnkuZ2V0R3JvdXBzKClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JrSm9pbihvYnNlcnZhYmxlcyQpXHJcbiAgICAgIC8vLnN1YnNjcmliZSgoW3VzZXJzLCBwaG90b3NdKSA9PiB7XHJcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgLy8gTmVlZCBncm91cHMgaW4gcGxhY2UgYmVmb3JlIHdlIGhhbmRsZSBleGNsdXNpb25zL2luY2x1c2lvbnMvcHJlLXNlbGVjdGlvbnNcclxuICAgICAgICB0aGlzLmdyb3VwcyA9IHRoaXMuYWRHcm91cHNOZWVkZWQgP1xyXG4gICAgICAgICAgZGF0YVsyXSA6XHJcbiAgICAgICAgICBudWxsO1xyXG5cclxuICAgICAgICBsZXQgdXNlcnMgPSBkYXRhWzBdIGFzIFNlbGVjdGFibGVVc2VyW107XHJcbiAgICAgICAgdXNlcnMuZm9yRWFjaCh1ID0+IHUuc2VsZWN0ZWQgPSBmYWxzZSk7IC8vIEluIGNhc2UgZXhpc3RpbmcgZGF0YSB3YXMgcmUtdXNlZFxyXG4gICAgICAgIHVzZXJzID0gdGhpcy4jaW5jbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNpbmNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2Vycyk7XHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xyXG4gICAgICAgIHVzZXJzID0gdGhpcy4jaW5jbHVkZVVzZXJzQnlUaXRsZSh1c2Vycyk7XHJcblxyXG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNleGNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2Vycyk7XHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNleGNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xyXG4gICAgICAgIHVzZXJzID0gdGhpcy4jZXhjbHVkZVVzZXJzQnlUaXRsZSh1c2Vycyk7XHJcblxyXG4gICAgICAgIHVzZXJzID0gdGhpcy4jcHJlU2VsZWN0VXNlcnNCeUFjY291bnROYW1lKHVzZXJzKTtcclxuICAgICAgICB1c2VycyA9IHRoaXMuI3ByZVNlbGVjdFVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xyXG4gICAgICAgIHVzZXJzID0gdGhpcy4jcHJlU2VsZWN0VXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xyXG4gICAgICAgIHVzZXJzID0gdGhpcy4jcHJlU2VsZWN0VXNlcnNCeVRpdGxlKHVzZXJzKTtcclxuXHJcbiAgICAgICAgdGhpcy4jcHJlU2VsZWN0R3JvdXBzQnlBY2NvdW50TmFtZSgpO1xyXG5cclxuICAgICAgICBjb25zdCB1c2Vyc0FuZEdyb3VwczogKFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKVtdID0gW107XHJcblxyXG4gICAgICAgIC8vIFNob3VsZCB3ZSBhbGxvdyB1c2VycyB0byBiZSBzZWxlY3RlZD9cclxuICAgICAgICBpZiAoWyd1c2VycycsICcqJ10uaW5jbHVkZXModGhpcy5fZGF0YS5vYmplY3RUeXBlcyEpKSB7XHJcbiAgICAgICAgICB1c2Vyc0FuZEdyb3Vwcy5wdXNoKC4uLnVzZXJzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNob3VsZCB3ZSBhbGxvdyBncm91cHMgdG8gYmUgc2VsZWN0ZWRcclxuXHJcbiAgICAgICAgaWYgKFsnZ3JvdXBzJywgJyonXS5pbmNsdWRlcyh0aGlzLl9kYXRhLm9iamVjdFR5cGVzISkpIHtcclxuICAgICAgICAgIGlmICh0aGlzLl9kYXRhLnNlbGVjdGFibGVHcm91cE5hbWVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXMuaW5jbHVkZXMoJyonKSkge1xyXG4gICAgICAgICAgICAgIHVzZXJzQW5kR3JvdXBzLnB1c2goLi4udGhpcy5ncm91cHMhKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLl9kYXRhLnNlbGVjdGFibGVHcm91cE5hbWVzXHJcbiAgICAgICAgICAgICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzIS5maW5kKGcgPT4gZy5kaXNwbGF5TmFtZSA9PT0gZ3JvdXBOYW1lKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICBpZiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICB1c2Vyc0FuZEdyb3Vwcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgIC4uLmdyb3VwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGdyb3VwLnNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHVzZXJzQW5kR3JvdXBzKTtcclxuICAgICAgXHJcbiAgICAgICAgdGhpcy5waG90b3MgPSBkYXRhWzFdO1xyXG5cclxuICAgICAgICB0aGlzLiNzZXRGaWx0ZXJQcmVkaWNhdGUoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZFVzZXJzPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy4jc2VydmljZXMuZGlhbG9nUmVmLmNsb3NlKHRoaXMuX2RhdGEuYWxsb3dDbG9zZVdpdGhvdXRTZWxlY3Rpb25zID8gW10gOiB1bmRlZmluZWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRVc2Vyc1xyXG4gICAgICAubWFwKHUgPT4gdGhpcy5fZGF0YS5yZXR1cm5Vc2VyT2JqZWN0cyA/IHUgOiB1LnNBTUFjY291bnROYW1lKTtcclxuXHJcbiAgICB0aGlzLiNzZXJ2aWNlcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5fZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuTXVsdGlwbGUgP1xyXG4gICAgICB2YWx1ZSA6XHJcbiAgICAgIHZhbHVlWzBdXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGhvdG8odXNlcjogU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCF0aGlzLmlzVXNlcih1c2VyKSkgeyByZXR1cm47IH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5waG90b3M/LmZpbmQocCA9PlxyXG4gICAgICAocC5lbXBsb3llZU51bWJlciAmJiBwLmVtcGxveWVlTnVtYmVyLnRvU3RyaW5nKCkgPT09ICh1c2VyIGFzIFNlbGVjdGFibGVVc2VyKS5lbXBsb3llZU51bWJlcikgfHxcclxuICAgICAgcC5hY2NvdW50TmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpIHx8XHJcbiAgICAgIHAuZGlzcGxheU5hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICh1c2VyLmRpc3BsYXlOYW1lID8/IHVzZXIubmFtZSkudG9Mb3dlckNhc2UoKSB8fFxyXG4gICAgICBwLnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSAodXNlci5kaXNwbGF5TmFtZSA/PyB1c2VyLm5hbWUpLnRvTG93ZXJDYXNlKClcclxuICAgICk/LmVuY29kZWRBYnNVcmw7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gRXhjbHVzaW9ucyAtIHdvbid0IGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhU291cmNlIGF0IGFsbFxyXG4gICNleGNsdWRlVXNlcnNCeUFjY291bnROYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICB0aGlzLl9kYXRhLmV4Y2x1c2lvbnM/LmFjY291bnROYW1lc1xyXG4gICAgICA/LmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuZmluZEluZGV4KHUgPT4gdS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSBhY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdXNlcnM7XHJcbiAgfVxyXG5cclxuICAjZXhjbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcclxuICAgIHRoaXMuX2RhdGEuZXhjbHVzaW9ucz8uZ3JvdXBzXHJcbiAgICAgID8uZm9yRWFjaChncm91cE5hbWUgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIGlmICghZ3JvdXApIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgZ3JvdXAubWVtYmVyLmZvckVhY2goZ3JvdXBNZW1iZXJEbiA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmZpbmRJbmRleCh1ID0+IHUuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwTWVtYmVyRG4pO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdXNlcnM7XHJcbiAgfVxyXG5cclxuICAjZXhjbHVkZVVzZXJzQnlEZXBhcnRtZW50KHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICB0aGlzLl9kYXRhLmV4Y2x1c2lvbnM/LmRlcGFydG1lbnRzXHJcbiAgICAgID8uZm9yRWFjaChkZXBhcnRtZW50ID0+IHtcclxuICAgICAgICBjb25zdCBleGNsdWRlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHUgPT4gdS5kZXBhcnRtZW50Py50b0xvd2VyQ2FzZSgpID09PSBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkpO1xyXG5cclxuICAgICAgICBleGNsdWRlZFVzZXJzLmZvckVhY2godXNlciA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmluZGV4T2YodXNlcik7XHJcbiAgICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdXNlcnM7XHJcbiAgfVxyXG5cclxuICAjZXhjbHVkZVVzZXJzQnlUaXRsZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xyXG4gICAgdGhpcy5fZGF0YS5leGNsdXNpb25zPy50aXRsZXNcclxuICAgICAgPy5mb3JFYWNoKHRpdGxlID0+IHtcclxuICAgICAgICBjb25zdCBleGNsdWRlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHUgPT4gdS50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gdGl0bGUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZXhjbHVkZWRVc2Vycy5mb3JFYWNoKHVzZXIgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB1c2Vycy5pbmRleE9mKHVzZXIpO1xyXG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHVzZXJzO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEluY2x1c2lvbnMgLSBvbmx5IHRoZXNlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGFTb3VyY2VcclxuICAjaW5jbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xyXG4gICAgcmV0dXJuIHVzZXJzLmZpbHRlcih1c2VyID0+XHJcbiAgICAgICF0aGlzLl9kYXRhLmluY2x1c2lvbnM/LmFjY291bnROYW1lcz8ubGVuZ3RoIHx8IC8vIE5vIGFjY291bnQgaW5jbHVzaW9ucyBzcGVjaWZpZWRcclxuXHJcbiAgICAgIHRoaXMuX2RhdGEuaW5jbHVzaW9ucy5hY2NvdW50TmFtZXMuZmluZChhY2NvdW50TmFtZSA9PlxyXG4gICAgICAgIGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKVxyXG4gICAgICApKTtcclxuICB9XHJcblxyXG4gICNpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcclxuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxyXG4gICAgICAhdGhpcy5fZGF0YS5pbmNsdXNpb25zPy5kZXBhcnRtZW50cz8ubGVuZ3RoIHx8IC8vIE5vIGRlcGFydG1lbnQgaW5jbHVzaW9ucyBzcGVjaWZpZWRcclxuXHJcbiAgICAgIHRoaXMuX2RhdGEuaW5jbHVzaW9ucy5kZXBhcnRtZW50cy5maW5kKGRlcGFydG1lbnQgPT5cclxuICAgICAgICBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKVxyXG4gICAgICApKTtcclxuICB9XHJcblxyXG4gICNpbmNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cclxuICAgICAgIXRoaXMuX2RhdGEuaW5jbHVzaW9ucz8udGl0bGVzPy5sZW5ndGggfHwgLy8gTm8gdGl0bGUgaW5jbHVzaW9ucyBzcGVjaWZpZWRcclxuXHJcbiAgICAgIHRoaXMuX2RhdGEuaW5jbHVzaW9ucy50aXRsZXMuZmluZCh0aXRsZSA9PlxyXG4gICAgICAgIHRpdGxlLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIudGl0bGU/LnRvTG93ZXJDYXNlKClcclxuICAgICAgKSk7XHJcbiAgfVxyXG5cclxuICAjaW5jbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcclxuICAgIGlmICghdGhpcy5fZGF0YS5pbmNsdXNpb25zPy5ncm91cHM/Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gdXNlcnM7IC8vIE5vIGdyb3VwIGluY2x1c2lvbnMgc3BlY2lmaWVkXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlYXRpbmcgYSBiaXQgYW5kIGxldmVyYWdpbmcgdGhlICdzZWxlY3RlZCcgcHJvcGVydHkgdG8ga2VlcCB0cmFjayBvZiB3aG8gc2hvdWxkIGJlIGluY2x1ZGVkXHJcbiAgICAvLyBTaW5jZSBpbmNsdXNpb25zIGhhcHBlbiBiZWZvciBwcmUtc2VsZWN0aW9ucywgd2UgY2FuIGRvIHRoYXQsIGFzIGxvbmcgYXMgd2Ugc2V0ICdzZWxlY3RlZCcgYmFjayB0byBmYWxzZSB3aGVuIHdlJ3JlIGRvbmVcclxuICAgIHRoaXMuX2RhdGEuaW5jbHVzaW9ucy5ncm91cHNcclxuICAgICAgLmZvckVhY2goZ3JvdXBOYW1lID0+IHtcclxuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICB1c2Vyc1xyXG4gICAgICAgICAgLmZpbHRlcih1c2VyID0+XHJcbiAgICAgICAgICAgICAgZ3JvdXAubWVtYmVyLmZpbmQoZ3JvdXBNZW1iZXJEbiA9PiBncm91cE1lbWJlckRuID09PSB1c2VyLmRpc3Rpbmd1aXNoZWROYW1lKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBcclxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIGFsbCBvZiB0aGUgYXBwcm9wcmlhdGUgdXNlcnMgc2hvdWxkIGhhdmUgJ3NlbGVjdGVkJyBzZXQgdG8gdHJ1ZVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRVc2VycyA9IHVzZXJzLmZpbHRlcih1c2VyID0+IHVzZXIuc2VsZWN0ZWQpOyAvLyBTdWJzZXQgb2YgdGhlIG9yaWdpbmFsIGxpc3RcclxuICAgIC8vIFJlc2V0ICdzZWxlY3RlZCcgdG8gZmFsc2UsIGFuZCByZXR1cm5cclxuICAgIHNlbGVjdGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRVc2VycztcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiAgUHJlLVNlbGVjdGlvbnNcclxuICAjcHJlU2VsZWN0VXNlcnNCeUFjY291bnROYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICB0aGlzLl9kYXRhLnByZVNlbGVjdGlvbnM/LmFjY291bnROYW1lc1xyXG4gICAgICA/LmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHUgPT4gdS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSBhY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoIXVzZXIpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIHVzZXIuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdXNlcnM7XHJcbiAgfVxyXG5cclxuICAjcHJlU2VsZWN0R3JvdXBzQnlBY2NvdW50TmFtZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8uYWNjb3VudE5hbWVzXHJcbiAgICAgID8uZm9yRWFjaChhY2NvdW50TmFtZSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwcz8uZmluZChnID0+IGcuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgZ3JvdXAuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9KTs7XHJcbiAgfVxyXG5cclxuICAjcHJlU2VsZWN0VXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcclxuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8uZGVwYXJ0bWVudHNcclxuICAgICAgPy5mb3JFYWNoKGRlcGFydG1lbnQgPT5cclxuICAgICAgICB1c2Vyc1xyXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKSA9PT0gZGVwYXJ0bWVudC50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSlcclxuICAgICAgKTtcclxuXHJcbiAgICByZXR1cm4gdXNlcnM7XHJcbiAgfVxyXG5cclxuICAjcHJlU2VsZWN0VXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICB0aGlzLl9kYXRhLnByZVNlbGVjdGlvbnM/LnRpdGxlc1xyXG4gICAgICA/LmZvckVhY2godGl0bGUgPT5cclxuICAgICAgICB1c2Vyc1xyXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHRpdGxlLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICAuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSB0cnVlKVxyXG4gICAgICApO1xyXG5cclxuICAgIHJldHVybiB1c2VycztcclxuICB9XHJcblxyXG4gICNwcmVTZWxlY3RVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICB0aGlzLl9kYXRhLnByZVNlbGVjdGlvbnM/Lmdyb3Vwc1xyXG4gICAgICA/LmZvckVhY2goZ3JvdXBOYW1lID0+IHtcclxuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcclxuICAgICAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHUgPT4gdS5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBNZW1iZXJEbik7XHJcbiAgICAgICAgICBpZiAoIXVzZXIpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgdXNlci5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB1c2VycztcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbiAgXHJcbiAgI3NldEZpbHRlclByZWRpY2F0ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlID0gKHVzZXI6IChTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cCksIGZpbHRlcjogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmIChmaWx0ZXIgPT09ICd7c2VsZWN0ZWQ6dHJ1ZX0nKSB7XHJcbiAgICAgICAgcmV0dXJuIHVzZXIuc2VsZWN0ZWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGZpbHRlciwgJ2knKTsgLy8gQ2FzZS1pbnNlbnNpdGl2ZVxyXG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlOyAvLyBUaGUgZW5kIHJlc3VsdCAtIHdoZXRoZXIgb3Igbm90IGEgZW1wbG95ZWUgbWF0Y2hlcyB0aGUgZmlsdGVyXHJcblxyXG4gICAgICAgIGNvbnN0IGZpbHRlclByb3BlcnRpZXMgPSBbICdkaXNwbGF5TmFtZScgXTtcclxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zPy5hY2NvdW50TmFtZSkge1xyXG4gICAgICAgICAgZmlsdGVyUHJvcGVydGllcy5wdXNoKCdzQU1BY2NvdW50TmFtZScpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhLmZpbHRlck9wdGlvbnM/LnRpdGxlKSB7XHJcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3RpdGxlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhLmZpbHRlck9wdGlvbnM/LmRlcGFydG1lbnQpIHtcclxuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgnZGVwYXJ0bWVudCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zPy5waG9uZU51bWJlcikge1xyXG4gICAgICAgICAgZmlsdGVyUHJvcGVydGllcy5wdXNoKCd0ZWxlcGhvbmVOdW1iZXInKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgLy8gTWF0Y2ggb24gdGhlIHByb3BlcnRpZXMgY29uZmlndXJlZCBhYm92ZVxyXG4gICAgICAgIGZpbHRlclByb3BlcnRpZXNcclxuICAgICAgICAgIC5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBpZiAodXNlcltmaWVsZF0gJiYgdXNlcltmaWVsZF0ubWF0Y2gocmVnZXgpKSB7XHJcbiAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICBcclxuICAgICAgICAvLyBNYXRjaCBvbiBncm91cCBtZW1iZXJzaGlwIChncm91cCBuYW1lKVxyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhLmZpbHRlck9wdGlvbnM/Lmdyb3VwTWVtYmVyc2hpcCkge1xyXG4gICAgICAgICAgdXNlci5tZW1iZXJPZi5mb3JFYWNoKGdyb3VwRG4gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGdyb3VwID0+IGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuICYmIGdyb3VwLm5hbWUubWF0Y2gocmVnZXgpKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChncm91cCkge1xyXG4gICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWF0Y2g7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAjbGlzdGVuRm9yRmlsdGVyQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDI1MClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGF0YVNvdXJjZSEuZmlsdGVyID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLmZpbHRlcj8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcbiAgdG9vbHRpcCh1c2VyOiBTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgP1xyXG4gICAgICB1c2VyLm1lbWJlck9mXHJcbiAgICAgICAgLm1hcChncm91cERuID0+XHJcbiAgICAgICAgICB0aGlzLmdyb3Vwc1xyXG4gICAgICAgICAgICA/LmZpbmQoZ3JvdXAgPT5cclxuICAgICAgICAgICAgICBncm91cC5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBEblxyXG4gICAgICAgICAgICApPy5uYW1lXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSEgPiBiISA/IDEgOiAtMSlcclxuICAgICAgICAgIC5qb2luKCdcXG4nKSA6XHJcbiAgICAgICcnO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufSIsIjxkaXYgaWQ9XCJkaWFsb2ctdGl0bGVcIj5cclxuICA8aDIgbWF0LWRpYWxvZy10aXRsZT57eyBfZGF0YS50aXRsZSB9fTwvaDI+XHJcblxyXG4gIDxkaXYgaWQ9XCJudW0tc2VsZWN0ZWRcIj5cclxuICAgIHt7IHNlbGVjdGVkT3B0aW9ucy5sZW5ndGggfX0gc2VsZWN0ZWRcclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIEBpZiAoZGF0YVNvdXJjZSAmJiBwaG90b3MpIHtcclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiPlxyXG4gICAgICBAaWYgKGRhdGFTb3VyY2UpIHtcclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJcIiAjZmlsdGVySW5wdXQ+XHJcbiAgICAgICAgICBAaWYgKGZpbHRlckZvcm0udmFsdWUuZmlsdGVyKSB7XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiQ2xlYXJcIiAoY2xpY2spPVwiZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy5zZXRWYWx1ZSgnJylcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjbG9zZVwiLz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgfVxyXG4gICAgPC9mb3JtPlxyXG4gICAgPG1hdC1zZWxlY3Rpb24tbGlzdCBbbXVsdGlwbGVdPVwiaXNNdWx0aU1vZGVcIlxyXG4gICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImxpc3RTZWxlY3Rpb25DaGFuZ2VkKCRldmVudC5vcHRpb25zKVwiPlxyXG4gICAgICBAZm9yICh1c2VyIG9mIGRhdGFTb3VyY2UuZmlsdGVyZWREYXRhOyB0cmFjayB1c2VyKSB7XHJcbiAgICAgICAgPG1hdC1saXN0LW9wdGlvbiBbdmFsdWVdPVwidXNlclwiIFtzZWxlY3RlZF09XCJ1c2VyLnNlbGVjdGVkXCJcclxuICAgICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvcHRpb25TZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbilcIiAjb3B0aW9uPlxyXG4gICAgICAgICAgQGlmIChnZXRQaG90byh1c2VyKSkge1xyXG4gICAgICAgICAgICA8aW1nIG1hdExpc3RJdGVtQXZhdGFyIGFsdD1cIlwiIFtzcmNdPVwiZ2V0UGhvdG8odXNlcilcIj5cclxuICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICA8bWF0LWljb24gbWF0TGlzdEl0ZW1BdmF0YXIgY2xhc3M9XCJuby1waG90b1wiXHJcbiAgICAgICAgICAgICAgW2ZvbnRJY29uXT1cImlzVXNlcih1c2VyKSA/ICdhY2NvdW50X2NpcmNsZScgOiAnZ3JvdXAnXCIvPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBbbWF0VG9vbHRpcF09XCJ0b29sdGlwKHVzZXIpXCIgY2xhc3M9XCJ1c2VyLW5hbWVcIj5cclxuICAgICAgICAgICAgICB7eyB1c2VyLmRpc3BsYXlOYW1lID8/IHVzZXIubmFtZSB9fVxyXG4gICAgICAgICAgICAgIEBpZiAoaXNVc2VyKHVzZXIpICYmIF9kYXRhLnNob3dQaG9uZSAmJiBjYXN0VXNlcih1c2VyKS50ZWxlcGhvbmVOdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgIDxkaXY+e3sgY2FzdFVzZXIodXNlcikudGVsZXBob25lTnVtYmVyIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgQGlmIChpc1VzZXIodXNlcikpIHtcclxuICAgICAgICAgICAgICA8ZGl2Pnt7IGNhc3RVc2VyKHVzZXIpLmRlcGFydG1lbnQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57eyBjYXN0VXNlcih1c2VyKS50aXRsZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cclxuICAgICAgfVxyXG4gICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XHJcbiAgfSBAZWxzZSB7XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjUwXCIvPlxyXG4gICAgICA8aDIgaWQ9XCJzcGlubmVyLW1lc3NhZ2VcIj5HZXR0aW5nIHVzZXJzIGFuZCBwaG90b3MuLi48L2gyPlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG48L21hdC1kaWFsb2ctY29udGVudD5cclxuXHJcbjxtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgQGlmIChkYXRhU291cmNlICYmIHBob3Rvcykge1xyXG4gICAgQGlmIChzZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIChjaGFuZ2UpPVwiaGlkZVVuc2VsZWN0ZWRDaGFuZ2VkKCRldmVudC5jaGVja2VkKVwiPlxyXG4gICAgICAgIEhpZGUgVW5zZWxlY3RlZFxyXG4gICAgICA8L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgICB9XHJcbiAgICBAaWYgKGlzTXVsdGlNb2RlKSB7XHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInNlbGVjdEFsbCgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwic2VsZWN0X2FsbFwiLz5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+U2VsZWN0IEFsbDwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICBAaWYgKGlzTXVsdGlNb2RlICYmIHNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZGVzZWxlY3RBbGwoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsZWFyX2FsbFwiLz5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+Q2xlYXIgQWxsPC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICAgIEBpZiAoaXNNdWx0aU1vZGUgfHwgIV9kYXRhLmNsb3NlV2hlblNlbGVjdGlvbk1hZGUpIHtcclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2UoKVwiIG1hdFRvb2x0aXA9XCJBY2NlcHQgeW91ciBzZWxlY3Rpb25cIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhX2RhdGEuYWxsb3dDbG9zZVdpdGhvdXRTZWxlY3Rpb25zICYmICFzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXCI+XHJcbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2hlY2tcIi8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPk9rPC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJ3YXJuXCIgbWF0LWRpYWxvZy1jbG9zZSBtYXRUb29sdGlwPVwiQ2xvc2UgdGhpcyB3aW5kb3dcIj5cclxuICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsb3NlXCIvPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPkNhbmNlbDwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+Il19
|