@ieeesa-npm/groups 0.15.17 → 0.15.18

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 (28) hide show
  1. package/esm2022/lib/assets/constants.json +27 -1
  2. package/esm2022/lib/components/add-user-roster/add-user-roster.component.mjs +8 -10
  3. package/esm2022/lib/components/create-group/create-group.component.mjs +2 -2
  4. package/esm2022/lib/components/edit-user-roles/edit-user-roles.component.mjs +7 -55
  5. package/esm2022/lib/components/interest-form-management/interest-form-management.component.mjs +3 -3
  6. package/esm2022/lib/components/interest-responses/interest-responses.component.mjs +119 -0
  7. package/esm2022/lib/components/interested-rosters/interested-rosters.component.mjs +370 -15
  8. package/esm2022/lib/components/roster-import-history/roster-import-history.component.mjs +106 -8
  9. package/esm2022/lib/components/view-roster/view-roster.component.mjs +2 -2
  10. package/esm2022/lib/groups.component.mjs +58 -9
  11. package/esm2022/lib/models/interest-response.model.mjs +18 -0
  12. package/esm2022/lib/models/roster-import.model.mjs +1 -1
  13. package/esm2022/lib/services/groups.service.mjs +91 -7
  14. package/esm2022/public-api.mjs +3 -1
  15. package/fesm2022/ieeesa-npm-groups.mjs +819 -210
  16. package/fesm2022/ieeesa-npm-groups.mjs.map +1 -1
  17. package/lib/components/edit-user-roles/edit-user-roles.component.d.ts +0 -10
  18. package/lib/components/interest-responses/interest-responses.component.d.ts +80 -0
  19. package/lib/components/interested-rosters/interested-rosters.component.d.ts +143 -9
  20. package/lib/components/roster-import-history/roster-import-history.component.d.ts +42 -4
  21. package/lib/groups.component.d.ts +9 -4
  22. package/lib/models/interest-response.model.d.ts +209 -0
  23. package/lib/models/roster-import.model.d.ts +12 -0
  24. package/lib/services/groups.service.d.ts +66 -10
  25. package/package.json +1 -1
  26. package/public-api.d.ts +2 -0
  27. package/esm2022/lib/assets/country-calling-codes.mjs +0 -83
  28. package/lib/assets/country-calling-codes.d.ts +0 -14
@@ -1,28 +1,383 @@
1
- import { Component, ViewEncapsulation } from '@angular/core';
1
+ import { Component, Inject, Optional, ViewEncapsulation, } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
- import * as constants from '../../assets/constants.json';
3
+ import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
4
+ import { Subject, takeUntil } from 'rxjs';
5
+ import { ModalType } from '@ieeesa-npm/models';
6
+ import { DataTableComponent, ModalComponent, TableColumnType, } from '@ieeesa-npm/presentation';
7
+ import constants from '../../assets/constants.json';
8
+ import { InterestResponsesComponent } from '../interest-responses/interest-responses.component';
4
9
  import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/material/dialog";
11
+ import * as i2 from "../../services/groups.service";
5
12
  /**
6
- * "Interested Rosters" tab content of the Roster Interests dialog (SP3M-317).
7
- * Displays the list of users who expressed interest in the group. This is a
8
- * placeholder shell for now; the submissions table will be implemented in a
9
- * later increment once the backend is available (data will be mocked in the
10
- * service layer meanwhile).
13
+ * "Interested Rosters" tab of the Roster Interests dialog (SP3M-428). Lists the
14
+ * users who expressed interest in the group and lets a Group Admin review each
15
+ * requester's submitted responses and set/override their membership level from
16
+ * the Roster Management screen.
17
+ *
18
+ * The list is rendered through the shared {@link DataTableComponent}: the
19
+ * Name/Email/Affiliations/Submitted On columns are plain TEXT, Member Level is
20
+ * the reusable table's DROPDOWN column (an inline {@code ieeesa-select}) and
21
+ * Form is a LINK that opens the "View Responses" dialog. The Member Level
22
+ * options are sourced from the roles API
23
+ * ({@link GroupsService.getGroupTypeRoles}) filtered to the "Member Level" role
24
+ * type. Interested-roster rows are loaded from
25
+ * {@link GroupsService.getInterestResponsesByGroup} and each requester's stored
26
+ * form responses are loaded on demand from
27
+ * {@link GroupsService.getInterestResponses} using the row's `interestId`. All
28
+ * display text is sourced from constants.json.
11
29
  * @export
12
30
  * @class InterestedRostersComponent
13
31
  */
14
32
  export class InterestedRostersComponent {
15
- constructor() {
33
+ constructor(
34
+ // eslint-disable-next-line no-unused-vars
35
+ dialog,
36
+ // eslint-disable-next-line no-unused-vars
37
+ groupsService,
38
+ // eslint-disable-next-line no-unused-vars
39
+ cdr,
40
+ // eslint-disable-next-line no-unused-vars
41
+ group) {
42
+ this.dialog = dialog;
43
+ this.groupsService = groupsService;
44
+ this.cdr = cdr;
45
+ this.group = group;
16
46
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
47
  this.constants = constants;
18
- this.interestedRostersTexts = this.constants?.rosterInterests?.interestedRosters;
19
- this.placeholderMessage = this.interestedRostersTexts?.placeholderMessage;
48
+ this.texts = this.constants?.rosterInterests?.interestedRosters;
49
+ this.destroy$ = new Subject();
50
+ /**
51
+ * Member-level dropdown options, sourced from the roles API
52
+ * ({@code GET /groups/config/rolesByGroupType/{groupType}}) filtered to the "Member Level" role type.
53
+ * Each option is {@code { id: roleId, name: roleName }}.
54
+ */
55
+ this.memberLevelOptions = [];
56
+ this.rosters = [];
57
+ this.tableData = [];
58
+ this.columnSchema = [];
59
+ /** Total interested-roster rows reported by the backend (for paging/counts). */
60
+ this.totalRecords = 0;
61
+ this.paginatorConfig = {
62
+ recordsPerPage: this.texts?.pageSizeOptions?.[0],
63
+ pageSizeOptions: this.texts?.pageSizeOptions,
64
+ totalRecords: 0,
65
+ };
66
+ this.pageIndex = 0;
67
+ this.defaultSortedColumn = 'submittedOn';
68
+ this.defaultColumnSortDirection = 'desc';
69
+ this.sortedBy = this.defaultSortedColumn;
70
+ this.sortedOrderBy = this.defaultColumnSortDirection;
71
+ /** Read-only table — no search / filter / add / edit / delete actions. */
72
+ this.tableActions = {
73
+ isPaginationNeeded: true,
74
+ isSearchNeeded: false,
75
+ isFilterNeeded: false,
76
+ isAddNeeded: false,
77
+ isEditNeeded: false,
78
+ isDeleteNeeded: false,
79
+ };
80
+ this.isLoading = false;
20
81
  }
21
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InterestedRostersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: InterestedRostersComponent, isStandalone: true, selector: "ieeesa-interested-rosters", ngImport: i0, template: "<div class=\"ieeesa-interested-rosters ieeesa-body-md-16\">\r\n {{ placeholderMessage }}\r\n</div>\r\n", styles: [".ieeesa-interested-rosters{padding:16px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None }); }
82
+ /**
83
+ * Builds the reusable-table column schema and loads the interested-roster
84
+ * list for the current group from the backend.
85
+ * @memberof InterestedRostersComponent
86
+ */
87
+ ngOnInit() {
88
+ this.loadMemberLevelOptions();
89
+ this.buildColumnSchema();
90
+ this.loadInterestedRosters();
91
+ }
92
+ /**
93
+ * Cleans up in-flight subscriptions when the component is destroyed.
94
+ * @memberof InterestedRostersComponent
95
+ */
96
+ ngOnDestroy() {
97
+ this.destroy$.next(true);
98
+ this.destroy$.complete();
99
+ }
100
+ /**
101
+ * Resolves the current group id from the dialog data (falling back to the
102
+ * service's selected group) and loads the interested-roster rows for it. Maps
103
+ * each backend {@link GroupInterestResponseView} onto the flattened
104
+ * {@link InterestedRoster} shape the reusable table binds to. On failure the
105
+ * table is cleared and the error is delegated to GroupsService for alerting.
106
+ * @memberof InterestedRostersComponent
107
+ */
108
+ loadInterestedRosters() {
109
+ const groupId = this.group?.groupId ??
110
+ this.groupsService.getSelectedGroupInfo()?.groupId;
111
+ if (!groupId)
112
+ return;
113
+ this.isLoading = true;
114
+ const payload = {
115
+ payload: {
116
+ searchByNameOrEmail: '',
117
+ offset: this.pageIndex * this.paginatorConfig.recordsPerPage,
118
+ pageSize: this.paginatorConfig.recordsPerPage,
119
+ sortedBy: this.sortedBy,
120
+ sortedOrderBy: this.sortedOrderBy,
121
+ },
122
+ };
123
+ this.groupsService
124
+ .getInterestResponsesByGroup(groupId, payload)
125
+ .pipe(takeUntil(this.destroy$))
126
+ .subscribe({
127
+ next: (response) => {
128
+ this.totalRecords = response?.totalRecords ?? 0;
129
+ this.paginatorConfig = {
130
+ ...this.paginatorConfig,
131
+ totalRecords: this.totalRecords,
132
+ };
133
+ this.rosters = (response?.data ?? []).map((view) => this.mapToRoster(view));
134
+ this.tableData = this.rosters;
135
+ this.isLoading = false;
136
+ this.cdr.detectChanges();
137
+ },
138
+ error: (error) => {
139
+ this.rosters = [];
140
+ this.tableData = [];
141
+ this.totalRecords = 0;
142
+ this.paginatorConfig = { ...this.paginatorConfig, totalRecords: 0 };
143
+ this.isLoading = false;
144
+ this.groupsService.handleErrors(error);
145
+ this.cdr.detectChanges();
146
+ },
147
+ });
148
+ }
149
+ onPaginationChange(event) {
150
+ this.pageIndex = event.pageIndex;
151
+ this.paginatorConfig = {
152
+ ...this.paginatorConfig,
153
+ recordsPerPage: event.pageSize,
154
+ };
155
+ this.loadInterestedRosters();
156
+ }
157
+ onSortChange(event) {
158
+ this.sortedBy = event.direction ? event.active : this.defaultSortedColumn;
159
+ this.sortedOrderBy = event.direction || this.defaultColumnSortDirection;
160
+ this.pageIndex = 0;
161
+ this.loadInterestedRosters();
162
+ }
163
+ /**
164
+ * Maps a backend {@link GroupInterestResponseView} to the flattened
165
+ * {@link InterestedRoster} row the table renders: affiliation org names are
166
+ * joined into the affiliations list, the assigned membership level (if any)
167
+ * becomes the role name — which the Member Level dropdown binds as its
168
+ * pre-selected value — the submitted timestamp is formatted for display, and
169
+ * the interest id is carried through for the responses dialog and the level
170
+ * override.
171
+ * @param {GroupInterestResponseView} view
172
+ * @return {InterestedRoster}
173
+ * @memberof InterestedRostersComponent
174
+ */
175
+ mapToRoster(view) {
176
+ return {
177
+ interestId: view?.interestId,
178
+ userId: view?.userId,
179
+ name: view?.name,
180
+ email: view?.email,
181
+ affiliations: (view?.affiliation ?? []).map((org) => org?.orgName),
182
+ submittedOn: this.formatSubmittedOn(view?.submittedOn),
183
+ memberLevel: view?.memberLevel?.length
184
+ ? view.memberLevel[0]?.roleName ?? null
185
+ : null,
186
+ };
187
+ }
188
+ /**
189
+ * Formats the backend submitted timestamp (ISO date string) for display,
190
+ * falling back to the raw value when it is not a parseable date.
191
+ * @param {string} submittedOn
192
+ * @return {string}
193
+ * @memberof InterestedRostersComponent
194
+ */
195
+ formatSubmittedOn(submittedOn) {
196
+ if (!submittedOn)
197
+ return '';
198
+ const date = new Date(submittedOn);
199
+ return isNaN(date.getTime())
200
+ ? submittedOn
201
+ : date.toLocaleDateString('en-US');
202
+ }
203
+ /**
204
+ * Loads the Member Level dropdown options from the roles API
205
+ * ({@code GET /groups/config/rolesByGroupType/{groupType}}), keeping only roles whose
206
+ * {@code roleTypeName} is "Member Level" and mapping each to a
207
+ * {@link SelectOption} ({@code { id: roleId, name: roleName }}).
208
+ * @memberof InterestedRostersComponent
209
+ */
210
+ loadMemberLevelOptions() {
211
+ const groupType = this.group?.groupType ??
212
+ this.groupsService.getSelectedGroupInfo()?.groupType;
213
+ if (!groupType)
214
+ return;
215
+ this.groupsService
216
+ .getGroupTypeRoles(groupType)
217
+ .pipe(takeUntil(this.destroy$))
218
+ .subscribe({
219
+ next: () => {
220
+ this.memberLevelOptions = (this.groupsService.getMemberTypes() ?? [])
221
+ .map((role) => ({ id: role.roleId, name: role.roleName }));
222
+ this.buildColumnSchema();
223
+ this.cdr.detectChanges();
224
+ },
225
+ error: (error) => {
226
+ this.groupsService.handleErrors(error);
227
+ },
228
+ });
229
+ }
230
+ /**
231
+ * Persists the membership-level override when the admin picks a value in a
232
+ * row's Member Level dropdown (bound to the reusable table's
233
+ * `rowDropdownChange` output). Builds the request from the dialog's current
234
+ * group id, the row's user id and the selected option's id (the role id), and
235
+ * posts it to the backend. The row's displayed level is updated optimistically
236
+ * and reverted if the save fails.
237
+ * @param {{ row: InterestedRoster; option: SelectOption }} event
238
+ * @memberof InterestedRostersComponent
239
+ */
240
+ onMemberLevelChange(event) {
241
+ const row = event?.row;
242
+ const option = event?.option;
243
+ const groupId = this.group?.groupId ??
244
+ this.groupsService.getSelectedGroupInfo()?.groupId;
245
+ const roleId = option?.id;
246
+ if (!row?.userId || !groupId || !roleId)
247
+ return;
248
+ const previousLevel = row.memberLevel;
249
+ // Optimistically reflect the selection in the row.
250
+ row.memberLevel = option?.name ?? row.memberLevel;
251
+ const payload = {
252
+ payload: {
253
+ groupId,
254
+ userId: row.userId,
255
+ roleId,
256
+ },
257
+ };
258
+ this.groupsService
259
+ .updateInterestMemberLevel(payload)
260
+ .pipe(takeUntil(this.destroy$))
261
+ .subscribe({
262
+ error: (error) => {
263
+ // Revert the optimistic change on failure and surface the error.
264
+ row.memberLevel = previousLevel;
265
+ this.cdr.detectChanges();
266
+ this.groupsService.handleErrors(error);
267
+ },
268
+ });
269
+ }
270
+ /**
271
+ * Opens the "View Responses" dialog for a roster row (bound to the reusable
272
+ * table's LINK output) using the shared {@link ModalComponent}. The modal
273
+ * supplies the title row and X close; the requester's stored interest-form
274
+ * responses are rendered by {@link InterestResponsesComponent}, which loads
275
+ * them from the backend using the row's {@code interestId} passed via the
276
+ * ModalComponent dynamic-input pattern.
277
+ * @param {InterestedRoster} row
278
+ * @memberof InterestedRostersComponent
279
+ */
280
+ onFormLinkClick(row) {
281
+ if (!row?.interestId)
282
+ return;
283
+ const dialogOptions = {
284
+ heading: this.texts?.responses?.title,
285
+ subHeading: this.group?.groupName,
286
+ headingClass: 'ieeesa-title-lg-24',
287
+ isCloseNeeded: true,
288
+ componentReference: InterestResponsesComponent,
289
+ modalType: ModalType.FORM,
290
+ data2DynamicComponent: { interestId: row.interestId },
291
+ dataInputName: 'componentData',
292
+ };
293
+ this.dialog.open(ModalComponent, {
294
+ data: dialogOptions,
295
+ panelClass: ['ieeesa-modal-dialog', 'ieeesa-interest-responses-dialog'],
296
+ width: '800px',
297
+ maxWidth: '95vw',
298
+ maxHeight: '90vh',
299
+ ariaModal: true,
300
+ });
301
+ }
302
+ /**
303
+ * Defines the reusable-table columns for the Interested Rosters list. Every
304
+ * `cellData`/`selectedOption` is a `(row) => ...` accessor, matching the
305
+ * shared table's contract. Member Level is the DROPDOWN column seeded with the
306
+ * configured levels plus "None"; Form is a LINK that opens the responses
307
+ * dialog.
308
+ * @memberof InterestedRostersComponent
309
+ */
310
+ buildColumnSchema() {
311
+ const columns = this.texts?.columns;
312
+ this.columnSchema = [
313
+ {
314
+ id: 1,
315
+ columnDef: 'name',
316
+ heading: columns?.name,
317
+ columnType: TableColumnType.TEXT,
318
+ isSortableColumn: true,
319
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
320
+ cellData: (row) => row.name,
321
+ },
322
+ {
323
+ id: 2,
324
+ columnDef: 'email',
325
+ heading: columns?.email,
326
+ columnType: TableColumnType.TEXT,
327
+ isSortableColumn: true,
328
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
329
+ cellData: (row) => row.email,
330
+ },
331
+ {
332
+ id: 3,
333
+ columnDef: 'affiliations',
334
+ heading: columns?.affiliations,
335
+ columnType: TableColumnType.TEXT,
336
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
337
+ cellData: (row) => (row.affiliations || []).join(', '),
338
+ },
339
+ {
340
+ id: 4,
341
+ columnDef: 'submittedOn',
342
+ heading: columns?.submittedOn,
343
+ columnType: TableColumnType.TEXT,
344
+ isSortableColumn: true,
345
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
346
+ cellData: (row) => row.submittedOn,
347
+ },
348
+ {
349
+ id: 5,
350
+ columnDef: 'memberLevel',
351
+ heading: columns?.memberLevel,
352
+ columnType: TableColumnType.DROPDOWN,
353
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
354
+ cellData: (row) => row.memberLevel,
355
+ dropdownOptions: this.memberLevelOptions,
356
+ dropdownPlaceholder: this.texts?.memberLevelPlaceholder,
357
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
358
+ selectedOption: (row) => this.memberLevelOptions.find((o) => o.name === row.memberLevel) ??
359
+ null,
360
+ },
361
+ {
362
+ id: 6,
363
+ columnDef: 'form',
364
+ heading: columns?.form,
365
+ columnType: TableColumnType.LINK,
366
+ cellData: () => this.texts?.viewLabel,
367
+ ariaLabel: (row) => `${this.texts?.viewAriaLabelPrefix} ${row?.name ?? ''}`.trim(),
368
+ },
369
+ ];
370
+ }
371
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InterestedRostersComponent, deps: [{ token: i1.MatDialog }, { token: i2.GroupsService }, { token: i0.ChangeDetectorRef }, { token: MAT_DIALOG_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
372
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: InterestedRostersComponent, isStandalone: true, selector: "ieeesa-interested-rosters", ngImport: i0, template: "<section class=\"ieeesa-interested-rosters\" [attr.aria-label]=\"texts?.regionAriaLabel\">\r\n <p class=\"ieeesa-interested-rosters__count\">{{ totalRecords }} {{ texts?.countSuffix }}</p>\r\n <ieeesa-data-table\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [tableActions]=\"tableActions\"\r\n [paginatorConfig]=\"paginatorConfig\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"paginatorConfig.recordsPerPage\"\r\n [defaultSortedColumn]=\"defaultSortedColumn\"\r\n [defaultColumnSortDirection]=\"defaultColumnSortDirection\"\r\n [isClearSortNeeded]=\"false\"\r\n (paginationChange)=\"onPaginationChange($event)\"\r\n (sortChange)=\"onSortChange($event)\"\r\n (rowLink)=\"onFormLinkClick($event)\"\r\n (rowDropdownChange)=\"onMemberLevelChange($event)\"\r\n ></ieeesa-data-table>\r\n</section>\r\n", styles: [".ieeesa-interested-rosters{color:#333;font-size:14px;letter-spacing:0}.ieeesa-interested-rosters__count{margin:0;padding:24px 12px 28px;line-height:20px}.ieeesa-interested-rosters__empty{margin:0;padding:24px 12px;color:#757575}.ieeesa-interested-rosters .mat-mdc-table{width:100%;min-width:960px;table-layout:fixed}.ieeesa-interested-rosters .mat-column-name{width:16.5%}.ieeesa-interested-rosters .mat-column-email,.ieeesa-interested-rosters .mat-column-affiliations{width:18%}.ieeesa-interested-rosters .mat-column-submittedOn{width:16%}.ieeesa-interested-rosters .mat-column-memberLevel{width:22.5%}.ieeesa-interested-rosters .mat-column-form{width:9%}.ieeesa-interested-rosters tbody tr{height:64px}.ieeesa-interested-rosters td.mat-column-memberLevel{vertical-align:middle}.ieeesa-interested-rosters td.mat-column-memberLevel ieeesa-select{display:block;width:176px;max-width:100%}.ieeesa-interested-rosters td.mat-column-memberLevel .ieeesa-select-field__label,.ieeesa-interested-rosters td.mat-column-memberLevel .mat-mdc-form-field-subscript-wrapper{display:none}.ieeesa-interested-rosters td.mat-column-memberLevel .mat-mdc-form-field{display:block;width:100%}.ieeesa-interested-rosters td.mat-column-memberLevel .mat-mdc-form-field-infix{width:auto;min-width:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DataTableComponent, selector: "ieeesa-data-table", inputs: ["tableDataInfo", "nestedTableDataInfo", "columnSchemaInfo", "nestedTableColumnSchemaInfo", "tableActions", "hasNestedTable", "tableColumnActions", "tableColumnActionMenuSize", "tableRowActions", "nestedTableRowActions", "caption", "viewAll", "paginatorConfig", "nestedPaginatorConfig", "legends", "pageIndex", "pageSize", "searchPlaceHolderText", "rowEditButton", "rowDeleteButton", "tableEditButton", "tableDeleteButton", "rowExpandButton", "rowCollapseButton", "isNestedTableHeaderNeeded", "addButton", "defaultColumnSortDirection", "defaultSortedColumn", "isClearSortNeeded", "filters", "selectedFilterOptions", "appliedFilterOptions", "searchType", "className", "searchSupportMessage", "inbuiltSortingNeeded", "isCellTextOverflowEllipsis", "isTableHeaderNeeded", "tableColumnsHeaderText", "verticalColumnHeaderNumber", "scrollbarSupportMessage", "isScrollSupportMessageNeeded", "isStickyHeaderNeeded", "customStickyHeaderNeeded", "headerElementClassName", "minCharToSearch", "searchResultMessage", "rowMenuActionIcon", "canDisableCheckbox", "isEllipsisRequiredForLink"], outputs: ["rowSelected", "selectedRowToEdit", "selectedRowToDelete", "selectedRowsToDelete", "rowLink", "addRow", "columnDataOnRowLinkClick", "menuActionClick", "selectActionMenu", "paginationChange", "selectedFilter", "removeFilteredOption", "filteredOptions", "searchedValue", "sortChange", "selectedRowsInfo", "rowExpansionClick", "tableColumnMenuActionClick", "tableColumnMenuToggleButton", "rowSlideToggle", "rowDropdownChange"] }, { kind: "ngmodule", type: MatDialogModule }], encapsulation: i0.ViewEncapsulation.None }); }
23
373
  }
24
374
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InterestedRostersComponent, decorators: [{
25
375
  type: Component,
26
- args: [{ selector: 'ieeesa-interested-rosters', standalone: true, imports: [CommonModule], encapsulation: ViewEncapsulation.None, template: "<div class=\"ieeesa-interested-rosters ieeesa-body-md-16\">\r\n {{ placeholderMessage }}\r\n</div>\r\n", styles: [".ieeesa-interested-rosters{padding:16px 0}\n"] }]
27
- }] });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJlc3RlZC1yb3N0ZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyb3Vwcy9zcmMvbGliL2NvbXBvbmVudHMvaW50ZXJlc3RlZC1yb3N0ZXJzL2ludGVyZXN0ZWQtcm9zdGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL2ludGVyZXN0ZWQtcm9zdGVycy9pbnRlcmVzdGVkLXJvc3RlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFNBQVMsTUFBTSw2QkFBNkIsQ0FBQzs7QUFFekQ7Ozs7Ozs7O0dBUUc7QUFTSCxNQUFNLE9BQU8sMEJBQTBCO0lBUnZDO1FBU0UsOERBQThEO1FBQzlELGNBQVMsR0FBUSxTQUFTLENBQUM7UUFDM0IsMkJBQXNCLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLENBQUM7UUFDNUUsdUJBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLGtCQUFrQixDQUFDO0tBQ3RFOytHQUxZLDBCQUEwQjttR0FBMUIsMEJBQTBCLHFGQ3JCdkMseUdBR0EscUdEYVksWUFBWTs7NEZBS1gsMEJBQTBCO2tCQVJ0QyxTQUFTOytCQUNFLDJCQUEyQixjQUN6QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsaUJBR1IsaUJBQWlCLENBQUMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJy4uLy4uL2Fzc2V0cy9jb25zdGFudHMuanNvbic7XHJcblxyXG4vKipcclxuICogXCJJbnRlcmVzdGVkIFJvc3RlcnNcIiB0YWIgY29udGVudCBvZiB0aGUgUm9zdGVyIEludGVyZXN0cyBkaWFsb2cgKFNQM00tMzE3KS5cclxuICogRGlzcGxheXMgdGhlIGxpc3Qgb2YgdXNlcnMgd2hvIGV4cHJlc3NlZCBpbnRlcmVzdCBpbiB0aGUgZ3JvdXAuIFRoaXMgaXMgYVxyXG4gKiBwbGFjZWhvbGRlciBzaGVsbCBmb3Igbm93OyB0aGUgc3VibWlzc2lvbnMgdGFibGUgd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiBhXHJcbiAqIGxhdGVyIGluY3JlbWVudCBvbmNlIHRoZSBiYWNrZW5kIGlzIGF2YWlsYWJsZSAoZGF0YSB3aWxsIGJlIG1vY2tlZCBpbiB0aGVcclxuICogc2VydmljZSBsYXllciBtZWFud2hpbGUpLlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBJbnRlcmVzdGVkUm9zdGVyc0NvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpZWVlc2EtaW50ZXJlc3RlZC1yb3N0ZXJzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnRlcmVzdGVkLXJvc3RlcnMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ludGVyZXN0ZWQtcm9zdGVycy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbnRlcmVzdGVkUm9zdGVyc0NvbXBvbmVudCB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjb25zdGFudHM6IGFueSA9IGNvbnN0YW50cztcclxuICBpbnRlcmVzdGVkUm9zdGVyc1RleHRzID0gdGhpcy5jb25zdGFudHM/LnJvc3RlckludGVyZXN0cz8uaW50ZXJlc3RlZFJvc3RlcnM7XHJcbiAgcGxhY2Vob2xkZXJNZXNzYWdlID0gdGhpcy5pbnRlcmVzdGVkUm9zdGVyc1RleHRzPy5wbGFjZWhvbGRlck1lc3NhZ2U7XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImllZWVzYS1pbnRlcmVzdGVkLXJvc3RlcnMgaWVlZXNhLWJvZHktbWQtMTZcIj5cclxuICB7eyBwbGFjZWhvbGRlck1lc3NhZ2UgfX1cclxuPC9kaXY+XHJcbiJdfQ==
376
+ args: [{ selector: 'ieeesa-interested-rosters', standalone: true, imports: [CommonModule, DataTableComponent, ModalComponent, MatDialogModule], encapsulation: ViewEncapsulation.None, template: "<section class=\"ieeesa-interested-rosters\" [attr.aria-label]=\"texts?.regionAriaLabel\">\r\n <p class=\"ieeesa-interested-rosters__count\">{{ totalRecords }} {{ texts?.countSuffix }}</p>\r\n <ieeesa-data-table\r\n [tableDataInfo]=\"tableData\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [tableActions]=\"tableActions\"\r\n [paginatorConfig]=\"paginatorConfig\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"paginatorConfig.recordsPerPage\"\r\n [defaultSortedColumn]=\"defaultSortedColumn\"\r\n [defaultColumnSortDirection]=\"defaultColumnSortDirection\"\r\n [isClearSortNeeded]=\"false\"\r\n (paginationChange)=\"onPaginationChange($event)\"\r\n (sortChange)=\"onSortChange($event)\"\r\n (rowLink)=\"onFormLinkClick($event)\"\r\n (rowDropdownChange)=\"onMemberLevelChange($event)\"\r\n ></ieeesa-data-table>\r\n</section>\r\n", styles: [".ieeesa-interested-rosters{color:#333;font-size:14px;letter-spacing:0}.ieeesa-interested-rosters__count{margin:0;padding:24px 12px 28px;line-height:20px}.ieeesa-interested-rosters__empty{margin:0;padding:24px 12px;color:#757575}.ieeesa-interested-rosters .mat-mdc-table{width:100%;min-width:960px;table-layout:fixed}.ieeesa-interested-rosters .mat-column-name{width:16.5%}.ieeesa-interested-rosters .mat-column-email,.ieeesa-interested-rosters .mat-column-affiliations{width:18%}.ieeesa-interested-rosters .mat-column-submittedOn{width:16%}.ieeesa-interested-rosters .mat-column-memberLevel{width:22.5%}.ieeesa-interested-rosters .mat-column-form{width:9%}.ieeesa-interested-rosters tbody tr{height:64px}.ieeesa-interested-rosters td.mat-column-memberLevel{vertical-align:middle}.ieeesa-interested-rosters td.mat-column-memberLevel ieeesa-select{display:block;width:176px;max-width:100%}.ieeesa-interested-rosters td.mat-column-memberLevel .ieeesa-select-field__label,.ieeesa-interested-rosters td.mat-column-memberLevel .mat-mdc-form-field-subscript-wrapper{display:none}.ieeesa-interested-rosters td.mat-column-memberLevel .mat-mdc-form-field{display:block;width:100%}.ieeesa-interested-rosters td.mat-column-memberLevel .mat-mdc-form-field-infix{width:auto;min-width:0}\n"] }]
377
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.GroupsService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
378
+ type: Optional
379
+ }, {
380
+ type: Inject,
381
+ args: [MAT_DIALOG_DATA]
382
+ }] }]; } });
383
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJlc3RlZC1yb3N0ZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyb3Vwcy9zcmMvbGliL2NvbXBvbmVudHMvaW50ZXJlc3RlZC1yb3N0ZXJzL2ludGVyZXN0ZWQtcm9zdGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncm91cHMvc3JjL2xpYi9jb21wb25lbnRzL2ludGVyZXN0ZWQtcm9zdGVycy9pbnRlcmVzdGVkLXJvc3RlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxNQUFNLEVBR04sUUFBUSxFQUNSLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBYSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd2RixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLG9CQUFvQixDQUFDO0FBQzdELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsY0FBYyxFQUlkLGVBQWUsR0FDaEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLFNBQVMsTUFBTSw2QkFBNkIsQ0FBQztBQVNwRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7OztBQVFoRzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQVNILE1BQU0sT0FBTywwQkFBMEI7SUE0Q3JDO0lBQ0UsMENBQTBDO0lBQ2xDLE1BQWlCO0lBQ3pCLDBDQUEwQztJQUNsQyxhQUE0QjtJQUNwQywwQ0FBMEM7SUFDbEMsR0FBc0I7SUFDOUIsMENBQTBDO0lBQ0UsS0FBdUI7UUFOM0QsV0FBTSxH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SSxDQUFDLGtCQUFrQjtnQkFDeEMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxzQkFBc0I7Z0JBQ3ZELDhEQUE4RDtnQkFDOUQsY0FBYyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsV0FBVyxDQUFDO29CQUMvRCxJQUFJO2FBQ1A7WUFDRDtnQkFDRSxFQUFFLEVBQUUsQ0FBQztnQkFDTCxTQUFTLEVBQUUsTUFBTTtnQkFDakIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJO2dCQUN0QixVQUFVLEVBQUUsZUFBZSxDQUFDLElBQUk7Z0JBQ2hDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVM7Z0JBQ3JDLFNBQVMsRUFBRSxDQUFDLEdBQXFCLEVBQUUsRUFBRSxDQUNuQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLElBQUksR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUU7YUFDakU7U0FDRixDQUFDO0lBQ0osQ0FBQzsrR0F4V1UsMEJBQTBCLHlHQW9EZixlQUFlO21HQXBEMUIsMEJBQTBCLHFGQ3BFdkMseTJCQWtCQSxtekNENkNZLFlBQVksK0JBQUUsa0JBQWtCLDRpREFBa0IsZUFBZTs7NEZBS2hFLDBCQUEwQjtrQkFSdEMsU0FBUzsrQkFDRSwyQkFBMkIsY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUMsaUJBRzdELGlCQUFpQixDQUFDLElBQUk7OzBCQXNEbEMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgSW5qZWN0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nLCBNYXREaWFsb2dNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNb2RhbFR5cGUsIFNlbGVjdE9wdGlvbiB9IGZyb20gJ0BpZWVlc2EtbnBtL21vZGVscyc7XHJcbmltcG9ydCB7XHJcbiAgRGF0YVRhYmxlQ29tcG9uZW50LFxyXG4gIE1vZGFsQ29tcG9uZW50LFxyXG4gIFBhZ2luYXRvckNvbmZpZyxcclxuICBUYWJsZUFjdGlvbnMsXHJcbiAgVGFibGVDb2x1bW5TY2hlbWEsXHJcbiAgVGFibGVDb2x1bW5UeXBlLFxyXG59IGZyb20gJ0BpZWVlc2EtbnBtL3ByZXNlbnRhdGlvbic7XHJcbmltcG9ydCBjb25zdGFudHMgZnJvbSAnLi4vLi4vYXNzZXRzL2NvbnN0YW50cy5qc29uJztcclxuaW1wb3J0IHsgR3JvdXBJbmZvIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dyb3VwLWluZm8ubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEdyb3VwSW50ZXJlc3RSZXNwb25zZVZpZXcsXHJcbiAgSW50ZXJlc3RlZFJvc3RlcixcclxuICBJbnRlcmVzdGVkUm9zdGVyc1JlcXVlc3RQYXlsb2FkLFxyXG4gIFVwZGF0ZU1lbWJlckxldmVsUGF5bG9hZCxcclxufSBmcm9tICcuLi8uLi9tb2RlbHMvaW50ZXJlc3QtcmVzcG9uc2UubW9kZWwnO1xyXG5pbXBvcnQgeyBHcm91cHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ3JvdXBzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJbnRlcmVzdFJlc3BvbnNlc0NvbXBvbmVudCB9IGZyb20gJy4uL2ludGVyZXN0LXJlc3BvbnNlcy9pbnRlcmVzdC1yZXNwb25zZXMuY29tcG9uZW50JztcclxuXHJcbi8vIEdyb3VwcyBtYXkgY29tcGlsZSBhZ2FpbnN0IHB1Ymxpc2hlZCBQcmVzZW50YXRpb24gdHlwZXMgd2l0aG91dCB0aGUgcm93LWxhYmVsIGNhbGxiYWNrLlxyXG50eXBlIEludGVyZXN0ZWRSb3N0ZXJDb2x1bW5TY2hlbWEgPSBUYWJsZUNvbHVtblNjaGVtYSAmIHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICBhcmlhTGFiZWw/OiAocm93OiBJbnRlcmVzdGVkUm9zdGVyKSA9PiBzdHJpbmc7XHJcbn07XHJcblxyXG4vKipcclxuICogXCJJbnRlcmVzdGVkIFJvc3RlcnNcIiB0YWIgb2YgdGhlIFJvc3RlciBJbnRlcmVzdHMgZGlhbG9nIChTUDNNLTQyOCkuIExpc3RzIHRoZVxyXG4gKiB1c2VycyB3aG8gZXhwcmVzc2VkIGludGVyZXN0IGluIHRoZSBncm91cCBhbmQgbGV0cyBhIEdyb3VwIEFkbWluIHJldmlldyBlYWNoXHJcbiAqIHJlcXVlc3RlcidzIHN1Ym1pdHRlZCByZXNwb25zZXMgYW5kIHNldC9vdmVycmlkZSB0aGVpciBtZW1iZXJzaGlwIGxldmVsIGZyb21cclxuICogdGhlIFJvc3RlciBNYW5hZ2VtZW50IHNjcmVlbi5cclxuICpcclxuICogVGhlIGxpc3QgaXMgcmVuZGVyZWQgdGhyb3VnaCB0aGUgc2hhcmVkIHtAbGluayBEYXRhVGFibGVDb21wb25lbnR9OiB0aGVcclxuICogTmFtZS9FbWFpbC9BZmZpbGlhdGlvbnMvU3VibWl0dGVkIE9uIGNvbHVtbnMgYXJlIHBsYWluIFRFWFQsIE1lbWJlciBMZXZlbCBpc1xyXG4gKiB0aGUgcmV1c2FibGUgdGFibGUncyBEUk9QRE9XTiBjb2x1bW4gKGFuIGlubGluZSB7QGNvZGUgaWVlZXNhLXNlbGVjdH0pIGFuZFxyXG4gKiBGb3JtIGlzIGEgTElOSyB0aGF0IG9wZW5zIHRoZSBcIlZpZXcgUmVzcG9uc2VzXCIgZGlhbG9nLiBUaGUgTWVtYmVyIExldmVsXHJcbiAqIG9wdGlvbnMgYXJlIHNvdXJjZWQgZnJvbSB0aGUgcm9sZXMgQVBJXHJcbiAqICh7QGxpbmsgR3JvdXBzU2VydmljZS5nZXRHcm91cFR5cGVSb2xlc30pIGZpbHRlcmVkIHRvIHRoZSBcIk1lbWJlciBMZXZlbFwiIHJvbGVcclxuICogdHlwZS4gSW50ZXJlc3RlZC1yb3N0ZXIgcm93cyBhcmUgbG9hZGVkIGZyb21cclxuICoge0BsaW5rIEdyb3Vwc1NlcnZpY2UuZ2V0SW50ZXJlc3RSZXNwb25zZXNCeUdyb3VwfSBhbmQgZWFjaCByZXF1ZXN0ZXIncyBzdG9yZWRcclxuICogZm9ybSByZXNwb25zZXMgYXJlIGxvYWRlZCBvbiBkZW1hbmQgZnJvbVxyXG4gKiB7QGxpbmsgR3JvdXBzU2VydmljZS5nZXRJbnRlcmVzdFJlc3BvbnNlc30gdXNpbmcgdGhlIHJvdydzIGBpbnRlcmVzdElkYC4gQWxsXHJcbiAqIGRpc3BsYXkgdGV4dCBpcyBzb3VyY2VkIGZyb20gY29uc3RhbnRzLmpzb24uXHJcbiAqIEBleHBvcnRcclxuICogQGNsYXNzIEludGVyZXN0ZWRSb3N0ZXJzQ29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2llZWVzYS1pbnRlcmVzdGVkLXJvc3RlcnMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRGF0YVRhYmxlQ29tcG9uZW50LCBNb2RhbENvbXBvbmVudCwgTWF0RGlhbG9nTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vaW50ZXJlc3RlZC1yb3N0ZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9pbnRlcmVzdGVkLXJvc3RlcnMuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW50ZXJlc3RlZFJvc3RlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjb25zdGFudHM6IGFueSA9IGNvbnN0YW50cztcclxuICB0ZXh0cyA9IHRoaXMuY29uc3RhbnRzPy5yb3N0ZXJJbnRlcmVzdHM/LmludGVyZXN0ZWRSb3N0ZXJzO1xyXG5cclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogTWVtYmVyLWxldmVsIGRyb3Bkb3duIG9wdGlvbnMsIHNvdXJjZWQgZnJvbSB0aGUgcm9sZXMgQVBJXHJcbiAgKiAoe0Bjb2RlIEdFVCAvZ3JvdXBzL2NvbmZpZy9yb2xlc0J5R3JvdXBUeXBlL3tncm91cFR5cGV9fSkgZmlsdGVyZWQgdG8gdGhlIFwiTWVtYmVyIExldmVsXCIgcm9sZSB0eXBlLlxyXG4gICAqIEVhY2ggb3B0aW9uIGlzIHtAY29kZSB7IGlkOiByb2xlSWQsIG5hbWU6IHJvbGVOYW1lIH19LlxyXG4gICAqL1xyXG4gIG1lbWJlckxldmVsT3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSBbXTtcclxuXHJcbiAgcm9zdGVyczogSW50ZXJlc3RlZFJvc3RlcltdID0gW107XHJcbiAgdGFibGVEYXRhOiBJbnRlcmVzdGVkUm9zdGVyW10gPSBbXTtcclxuICBjb2x1bW5TY2hlbWE6IEludGVyZXN0ZWRSb3N0ZXJDb2x1bW5TY2hlbWFbXSA9IFtdO1xyXG5cclxuICAvKiogVG90YWwgaW50ZXJlc3RlZC1yb3N0ZXIgcm93cyByZXBvcnRlZCBieSB0aGUgYmFja2VuZCAoZm9yIHBhZ2luZy9jb3VudHMpLiAqL1xyXG4gIHRvdGFsUmVjb3JkcyA9IDA7XHJcblxyXG4gIHBhZ2luYXRvckNvbmZpZzogUGFnaW5hdG9yQ29uZmlnID0ge1xyXG4gICAgcmVjb3Jkc1BlclBhZ2U6IHRoaXMudGV4dHM/LnBhZ2VTaXplT3B0aW9ucz8uWzBdLFxyXG4gICAgcGFnZVNpemVPcHRpb25zOiB0aGlzLnRleHRzPy5wYWdlU2l6ZU9wdGlvbnMsXHJcbiAgICB0b3RhbFJlY29yZHM6IDAsXHJcbiAgfTtcclxuICBwYWdlSW5kZXggPSAwO1xyXG4gIGRlZmF1bHRTb3J0ZWRDb2x1bW4gPSAnc3VibWl0dGVkT24nO1xyXG4gIGRlZmF1bHRDb2x1bW5Tb3J0RGlyZWN0aW9uOiBTb3J0WydkaXJlY3Rpb24nXSA9ICdkZXNjJztcclxuICBwcml2YXRlIHNvcnRlZEJ5ID0gdGhpcy5kZWZhdWx0U29ydGVkQ29sdW1uO1xyXG4gIHByaXZhdGUgc29ydGVkT3JkZXJCeSA9IHRoaXMuZGVmYXVsdENvbHVtblNvcnREaXJlY3Rpb247XHJcblxyXG4gIC8qKiBSZWFkLW9ubHkgdGFibGUg4oCUIG5vIHNlYXJjaCAvIGZpbHRlciAvIGFkZCAvIGVkaXQgLyBkZWxldGUgYWN0aW9ucy4gKi9cclxuICB0YWJsZUFjdGlvbnM6IFRhYmxlQWN0aW9ucyA9IHtcclxuICAgIGlzUGFnaW5hdGlvbk5lZWRlZDogdHJ1ZSxcclxuICAgIGlzU2VhcmNoTmVlZGVkOiBmYWxzZSxcclxuICAgIGlzRmlsdGVyTmVlZGVkOiBmYWxzZSxcclxuICAgIGlzQWRkTmVlZGVkOiBmYWxzZSxcclxuICAgIGlzRWRpdE5lZWRlZDogZmFsc2UsXHJcbiAgICBpc0RlbGV0ZU5lZWRlZDogZmFsc2UsXHJcbiAgfTtcclxuXHJcbiAgaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGdyb3Vwc1NlcnZpY2U6IEdyb3Vwc1NlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBncm91cDogR3JvdXBJbmZvIHwgbnVsbFxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIHRoZSByZXVzYWJsZS10YWJsZSBjb2x1bW4gc2NoZW1hIGFuZCBsb2FkcyB0aGUgaW50ZXJlc3RlZC1yb3N0ZXJcclxuICAgKiBsaXN0IGZvciB0aGUgY3VycmVudCBncm91cCBmcm9tIHRoZSBiYWNrZW5kLlxyXG4gICAqIEBtZW1iZXJvZiBJbnRlcmVzdGVkUm9zdGVyc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkTWVtYmVyTGV2ZWxPcHRpb25zKCk7XHJcbiAgICB0aGlzLmJ1aWxkQ29sdW1uU2NoZW1hKCk7XHJcbiAgICB0aGlzLmxvYWRJbnRlcmVzdGVkUm9zdGVycygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYW5zIHVwIGluLWZsaWdodCBzdWJzY3JpcHRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXHJcbiAgICogQG1lbWJlcm9mIEludGVyZXN0ZWRSb3N0ZXJzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlcyB0aGUgY3VycmVudCBncm91cCBpZCBmcm9tIHRoZSBkaWFsb2cgZGF0YSAoZmFsbGluZyBiYWNrIHRvIHRoZVxyXG4gICAqIHNlcnZpY2UncyBzZWxlY3RlZCBncm91cCkgYW5kIGxvYWRzIHRoZSBpbnRlcmVzdGVkLXJvc3RlciByb3dzIGZvciBpdC4gTWFwc1xyXG4gICAqIGVhY2ggYmFja2VuZCB7QGxpbmsgR3JvdXBJbnRlcmVzdFJlc3BvbnNlVmlld30gb250byB0aGUgZmxhdHRlbmVkXHJcbiAgICoge0BsaW5rIEludGVyZXN0ZWRSb3N0ZXJ9IHNoYXBlIHRoZSByZXVzYWJsZSB0YWJsZSBiaW5kcyB0by4gT24gZmFpbHVyZSB0aGVcclxuICAgKiB0YWJsZSBpcyBjbGVhcmVkIGFuZCB0aGUgZXJyb3IgaXMgZGVsZWdhdGVkIHRvIEdyb3Vwc1NlcnZpY2UgZm9yIGFsZXJ0aW5nLlxyXG4gICAqIEBtZW1iZXJvZiBJbnRlcmVzdGVkUm9zdGVyc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZEludGVyZXN0ZWRSb3N0ZXJzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZ3JvdXBJZCA9XHJcbiAgICAgIHRoaXMuZ3JvdXA/Lmdyb3VwSWQgPz9cclxuICAgICAgdGhpcy5ncm91cHNTZXJ2aWNlLmdldFNlbGVjdGVkR3JvdXBJbmZvKCk/Lmdyb3VwSWQ7XHJcbiAgICBpZiAoIWdyb3VwSWQpIHJldHVybjtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHBheWxvYWQ6IEludGVyZXN0ZWRSb3N0ZXJzUmVxdWVzdFBheWxvYWQgPSB7XHJcbiAgICAgIHBheWxvYWQ6IHtcclxuICAgICAgICBzZWFyY2hCeU5hbWVPckVtYWlsOiAnJyxcclxuICAgICAgICBvZmZzZXQ6IHRoaXMucGFnZUluZGV4ICogdGhpcy5wYWdpbmF0b3JDb25maWcucmVjb3Jkc1BlclBhZ2UsXHJcbiAgICAgICAgcGFnZVNpemU6IHRoaXMucGFnaW5hdG9yQ29uZmlnLnJlY29yZHNQZXJQYWdlLFxyXG4gICAgICAgIHNvcnRlZEJ5OiB0aGlzLnNvcnRlZEJ5LFxyXG4gICAgICAgIHNvcnRlZE9yZGVyQnk6IHRoaXMuc29ydGVkT3JkZXJCeSxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICB0aGlzLmdyb3Vwc1NlcnZpY2VcclxuICAgICAgLmdldEludGVyZXN0UmVzcG9uc2VzQnlHcm91cChncm91cElkLCBwYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b3RhbFJlY29yZHMgPSByZXNwb25zZT8udG90YWxSZWNvcmRzID8/IDA7XHJcbiAgICAgICAgICB0aGlzLnBhZ2luYXRvckNvbmZpZyA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5wYWdpbmF0b3JDb25maWcsXHJcbiAgICAgICAgICAgIHRvdGFsUmVjb3JkczogdGhpcy50b3RhbFJlY29yZHMsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5yb3N0ZXJzID0gKHJlc3BvbnNlPy5kYXRhID8/IFtdKS5tYXAoKHZpZXcpID0+XHJcbiAgICAgICAgICAgIHRoaXMubWFwVG9Sb3N0ZXIodmlldylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IHRoaXMucm9zdGVycztcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJvc3RlcnMgPSBbXTtcclxuICAgICAgICAgIHRoaXMudGFibGVEYXRhID0gW107XHJcbiAgICAgICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IDA7XHJcbiAgICAgICAgICB0aGlzLnBhZ2luYXRvckNvbmZpZyA9IHsgLi4udGhpcy5wYWdpbmF0b3JDb25maWcsIHRvdGFsUmVjb3JkczogMCB9O1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBzU2VydmljZS5oYW5kbGVFcnJvcnMoZXJyb3IpO1xyXG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25QYWdpbmF0aW9uQ2hhbmdlKGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZXZlbnQucGFnZUluZGV4O1xyXG4gICAgdGhpcy5wYWdpbmF0b3JDb25maWcgPSB7XHJcbiAgICAgIC4uLnRoaXMucGFnaW5hdG9yQ29uZmlnLFxyXG4gICAgICByZWNvcmRzUGVyUGFnZTogZXZlbnQucGFnZVNpemUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5sb2FkSW50ZXJlc3RlZFJvc3RlcnMoKTtcclxuICB9XHJcblxyXG4gIG9uU29ydENoYW5nZShldmVudDogU29ydCk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0ZWRCeSA9IGV2ZW50LmRpcmVjdGlvbiA/IGV2ZW50LmFjdGl2ZSA6IHRoaXMuZGVmYXVsdFNvcnRlZENvbHVtbjtcclxuICAgIHRoaXMuc29ydGVkT3JkZXJCeSA9IGV2ZW50LmRpcmVjdGlvbiB8fCB0aGlzLmRlZmF1bHRDb2x1bW5Tb3J0RGlyZWN0aW9uO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSAwO1xyXG4gICAgdGhpcy5sb2FkSW50ZXJlc3RlZFJvc3RlcnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1hcHMgYSBiYWNrZW5kIHtAbGluayBHcm91cEludGVyZXN0UmVzcG9uc2VWaWV3fSB0byB0aGUgZmxhdHRlbmVkXHJcbiAgICoge0BsaW5rIEludGVyZXN0ZWRSb3N0ZXJ9IHJvdyB0aGUgdGFibGUgcmVuZGVyczogYWZmaWxpYXRpb24gb3JnIG5hbWVzIGFyZVxyXG4gICAqIGpvaW5lZCBpbnRvIHRoZSBhZmZpbGlhdGlvbnMgbGlzdCwgdGhlIGFzc2lnbmVkIG1lbWJlcnNoaXAgbGV2ZWwgKGlmIGFueSlcclxuICAgKiBiZWNvbWVzIHRoZSByb2xlIG5hbWUg4oCUIHdoaWNoIHRoZSBNZW1iZXIgTGV2ZWwgZHJvcGRvd24gYmluZHMgYXMgaXRzXHJcbiAgICogcHJlLXNlbGVjdGVkIHZhbHVlIOKAlCB0aGUgc3VibWl0dGVkIHRpbWVzdGFtcCBpcyBmb3JtYXR0ZWQgZm9yIGRpc3BsYXksIGFuZFxyXG4gICAqIHRoZSBpbnRlcmVzdCBpZCBpcyBjYXJyaWVkIHRocm91Z2ggZm9yIHRoZSByZXNwb25zZXMgZGlhbG9nIGFuZCB0aGUgbGV2ZWxcclxuICAgKiBvdmVycmlkZS5cclxuICAgKiBAcGFyYW0ge0dyb3VwSW50ZXJlc3RSZXNwb25zZVZpZXd9IHZpZXdcclxuICAgKiBAcmV0dXJuIHtJbnRlcmVzdGVkUm9zdGVyfVxyXG4gICAqIEBtZW1iZXJvZiBJbnRlcmVzdGVkUm9zdGVyc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWFwVG9Sb3N0ZXIodmlldzogR3JvdXBJbnRlcmVzdFJlc3BvbnNlVmlldyk6IEludGVyZXN0ZWRSb3N0ZXIge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaW50ZXJlc3RJZDogdmlldz8uaW50ZXJlc3RJZCxcclxuICAgICAgdXNlcklkOiB2aWV3Py51c2VySWQsXHJcbiAgICAgIG5hbWU6IHZpZXc/Lm5hbWUsXHJcbiAgICAgIGVtYWlsOiB2aWV3Py5lbWFpbCxcclxuICAgICAgYWZmaWxpYXRpb25zOiAodmlldz8uYWZmaWxpYXRpb24gPz8gW10pLm1hcCgob3JnKSA9PiBvcmc/Lm9yZ05hbWUpLFxyXG4gICAgICBzdWJtaXR0ZWRPbjogdGhpcy5mb3JtYXRTdWJtaXR0ZWRPbih2aWV3Py5zdWJtaXR0ZWRPbiksXHJcbiAgICAgIG1lbWJlckxldmVsOiB2aWV3Py5tZW1iZXJMZXZlbD8ubGVuZ3RoXHJcbiAgICAgICAgPyB2aWV3Lm1lbWJlckxldmVsWzBdPy5yb2xlTmFtZSA/PyBudWxsXHJcbiAgICAgICAgOiBudWxsLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvcm1hdHMgdGhlIGJhY2tlbmQgc3VibWl0dGVkIHRpbWVzdGFtcCAoSVNPIGRhdGUgc3RyaW5nKSBmb3IgZGlzcGxheSxcclxuICAgKiBmYWxsaW5nIGJhY2sgdG8gdGhlIHJhdyB2YWx1ZSB3aGVuIGl0IGlzIG5vdCBhIHBhcnNlYWJsZSBkYXRlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWJtaXR0ZWRPblxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKiBAbWVtYmVyb2YgSW50ZXJlc3RlZFJvc3RlcnNDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIGZvcm1hdFN1Ym1pdHRlZE9uKHN1Ym1pdHRlZE9uOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFzdWJtaXR0ZWRPbikgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHN1Ym1pdHRlZE9uKTtcclxuICAgIHJldHVybiBpc05hTihkYXRlLmdldFRpbWUoKSlcclxuICAgICAgPyBzdWJtaXR0ZWRPblxyXG4gICAgICA6IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZHMgdGhlIE1lbWJlciBMZXZlbCBkcm9wZG93biBvcHRpb25zIGZyb20gdGhlIHJvbGVzIEFQSVxyXG4gICogKHtAY29kZSBHRVQgL2dyb3Vwcy9jb25maWcvcm9sZXNCeUdyb3VwVHlwZS97Z3JvdXBUeXBlfX0pLCBrZWVwaW5nIG9ubHkgcm9sZXMgd2hvc2VcclxuICAgKiB7QGNvZGUgcm9sZVR5cGVOYW1lfSBpcyBcIk1lbWJlciBMZXZlbFwiIGFuZCBtYXBwaW5nIGVhY2ggdG8gYVxyXG4gICAqIHtAbGluayBTZWxlY3RPcHRpb259ICh7QGNvZGUgeyBpZDogcm9sZUlkLCBuYW1lOiByb2xlTmFtZSB9fSkuXHJcbiAgICogQG1lbWJlcm9mIEludGVyZXN0ZWRSb3N0ZXJzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkTWVtYmVyTGV2ZWxPcHRpb25zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZ3JvdXBUeXBlID1cclxuICAgICAgdGhpcy5ncm91cD8uZ3JvdXBUeXBlID8/XHJcbiAgICAgIHRoaXMuZ3JvdXBzU2VydmljZS5nZXRTZWxlY3RlZEdyb3VwSW5mbygpPy5ncm91cFR5cGU7XHJcbiAgICBpZiAoIWdyb3VwVHlwZSkgcmV0dXJuO1xyXG4gICAgdGhpcy5ncm91cHNTZXJ2aWNlXHJcbiAgICAgIC5nZXRHcm91cFR5cGVSb2xlcyhncm91cFR5cGUpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5tZW1iZXJMZXZlbE9wdGlvbnMgPSAodGhpcy5ncm91cHNTZXJ2aWNlLmdldE1lbWJlclR5cGVzKCkgPz8gW10pXHJcbiAgICAgICAgICAgIC5tYXAoKHJvbGUpID0+ICh7IGlkOiByb2xlLnJvbGVJZCwgbmFtZTogcm9sZS5yb2xlTmFtZSB9KSk7XHJcbiAgICAgICAgICB0aGlzLmJ1aWxkQ29sdW1uU2NoZW1hKCk7XHJcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdyb3Vwc1NlcnZpY2UuaGFuZGxlRXJyb3JzKGVycm9yKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcnNpc3RzIHRoZSBtZW1iZXJzaGlwLWxldmVsIG92ZXJyaWRlIHdoZW4gdGhlIGFkbWluIHBpY2tzIGEgdmFsdWUgaW4gYVxyXG4gICAqIHJvdydzIE1lbWJlciBMZXZlbCBkcm9wZG93biAoYm91bmQgdG8gdGhlIHJldXNhYmxlIHRhYmxlJ3NcclxuICAgKiBgcm93RHJvcGRvd25DaGFuZ2VgIG91dHB1dCkuIEJ1aWxkcyB0aGUgcmVxdWVzdCBmcm9tIHRoZSBkaWFsb2cncyBjdXJyZW50XHJcbiAgICogZ3JvdXAgaWQsIHRoZSByb3cncyB1c2VyIGlkIGFuZCB0aGUgc2VsZWN0ZWQgb3B0aW9uJ3MgaWQgKHRoZSByb2xlIGlkKSwgYW5kXHJcbiAgICogcG9zdHMgaXQgdG8gdGhlIGJhY2tlbmQuIFRoZSByb3cncyBkaXNwbGF5ZWQgbGV2ZWwgaXMgdXBkYXRlZCBvcHRpbWlzdGljYWxseVxyXG4gICAqIGFuZCByZXZlcnRlZCBpZiB0aGUgc2F2ZSBmYWlscy5cclxuICAgKiBAcGFyYW0ge3sgcm93OiBJbnRlcmVzdGVkUm9zdGVyOyBvcHRpb246IFNlbGVjdE9wdGlvbiB9fSBldmVudFxyXG4gICAqIEBtZW1iZXJvZiBJbnRlcmVzdGVkUm9zdGVyc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uTWVtYmVyTGV2ZWxDaGFuZ2UoZXZlbnQ6IHtcclxuICAgIHJvdzogSW50ZXJlc3RlZFJvc3RlcjtcclxuICAgIG9wdGlvbjogU2VsZWN0T3B0aW9uO1xyXG4gIH0pOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvdyA9IGV2ZW50Py5yb3c7XHJcbiAgICBjb25zdCBvcHRpb24gPSBldmVudD8ub3B0aW9uO1xyXG4gICAgY29uc3QgZ3JvdXBJZCA9XHJcbiAgICAgIHRoaXMuZ3JvdXA/Lmdyb3VwSWQgPz9cclxuICAgICAgdGhpcy5ncm91cHNTZXJ2aWNlLmdldFNlbGVjdGVkR3JvdXBJbmZvKCk/Lmdyb3VwSWQ7XHJcbiAgICBjb25zdCByb2xlSWQgPSBvcHRpb24/LmlkIGFzIHN0cmluZztcclxuICAgIGlmICghcm93Py51c2VySWQgfHwgIWdyb3VwSWQgfHwgIXJvbGVJZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHByZXZpb3VzTGV2ZWwgPSByb3cubWVtYmVyTGV2ZWw7XHJcbiAgICAvLyBPcHRpbWlzdGljYWxseSByZWZsZWN0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJvdy5cclxuICAgIHJvdy5tZW1iZXJMZXZlbCA9IG9wdGlvbj8ubmFtZSA/PyByb3cubWVtYmVyTGV2ZWw7XHJcblxyXG4gICAgY29uc3QgcGF5bG9hZDogVXBkYXRlTWVtYmVyTGV2ZWxQYXlsb2FkID0ge1xyXG4gICAgICBwYXlsb2FkOiB7XHJcbiAgICAgICAgZ3JvdXBJZCxcclxuICAgICAgICB1c2VySWQ6IHJvdy51c2VySWQsXHJcbiAgICAgICAgcm9sZUlkLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuZ3JvdXBzU2VydmljZVxyXG4gICAgICAudXBkYXRlSW50ZXJlc3RNZW1iZXJMZXZlbChwYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIC8vIFJldmVydCB0aGUgb3B0aW1pc3RpYyBjaGFuZ2Ugb24gZmFpbHVyZSBhbmQgc3VyZmFjZSB0aGUgZXJyb3IuXHJcbiAgICAgICAgICByb3cubWVtYmVyTGV2ZWwgPSBwcmV2aW91c0xldmVsO1xyXG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgdGhpcy5ncm91cHNTZXJ2aWNlLmhhbmRsZUVycm9ycyhlcnJvcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcGVucyB0aGUgXCJWaWV3IFJlc3BvbnNlc1wiIGRpYWxvZyBmb3IgYSByb3N0ZXIgcm93IChib3VuZCB0byB0aGUgcmV1c2FibGVcclxuICAgKiB0YWJsZSdzIExJTksgb3V0cHV0KSB1c2luZyB0aGUgc2hhcmVkIHtAbGluayBNb2RhbENvbXBvbmVudH0uIFRoZSBtb2RhbFxyXG4gICAqIHN1cHBsaWVzIHRoZSB0aXRsZSByb3cgYW5kIFggY2xvc2U7IHRoZSByZXF1ZXN0ZXIncyBzdG9yZWQgaW50ZXJlc3QtZm9ybVxyXG4gICAqIHJlc3BvbnNlcyBhcmUgcmVuZGVyZWQgYnkge0BsaW5rIEludGVyZXN0UmVzcG9uc2VzQ29tcG9uZW50fSwgd2hpY2ggbG9hZHNcclxuICAgKiB0aGVtIGZyb20gdGhlIGJhY2tlbmQgdXNpbmcgdGhlIHJvdydzIHtAY29kZSBpbnRlcmVzdElkfSBwYXNzZWQgdmlhIHRoZVxyXG4gICAqIE1vZGFsQ29tcG9uZW50IGR5bmFtaWMtaW5wdXQgcGF0dGVybi5cclxuICAgKiBAcGFyYW0ge0ludGVyZXN0ZWRSb3N0ZXJ9IHJvd1xyXG4gICAqIEBtZW1iZXJvZiBJbnRlcmVzdGVkUm9zdGVyc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9uRm9ybUxpbmtDbGljayhyb3c6IEludGVyZXN0ZWRSb3N0ZXIpOiB2b2lkIHtcclxuICAgIGlmICghcm93Py5pbnRlcmVzdElkKSByZXR1cm47XHJcbiAgICBjb25zdCBkaWFsb2dPcHRpb25zID0ge1xyXG4gICAgICBoZWFkaW5nOiB0aGlzLnRleHRzPy5yZXNwb25zZXM/LnRpdGxlLFxyXG4gICAgICBzdWJIZWFkaW5nOiB0aGlzLmdyb3VwPy5ncm91cE5hbWUsXHJcbiAgICAgIGhlYWRpbmdDbGFzczogJ2llZWVzYS10aXRsZS1sZy0yNCcsXHJcbiAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICAgIGNvbXBvbmVudFJlZmVyZW5jZTogSW50ZXJlc3RSZXNwb25zZXNDb21wb25lbnQsXHJcbiAgICAgIG1vZGFsVHlwZTogTW9kYWxUeXBlLkZPUk0sXHJcbiAgICAgIGRhdGEyRHluYW1pY0NvbXBvbmVudDogeyBpbnRlcmVzdElkOiByb3cuaW50ZXJlc3RJZCB9LFxyXG4gICAgICBkYXRhSW5wdXROYW1lOiAnY29tcG9uZW50RGF0YScsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5kaWFsb2cub3BlbihNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiBkaWFsb2dPcHRpb25zLFxyXG4gICAgICBwYW5lbENsYXNzOiBbJ2llZWVzYS1tb2RhbC1kaWFsb2cnLCAnaWVlZXNhLWludGVyZXN0LXJlc3BvbnNlcy1kaWFsb2cnXSxcclxuICAgICAgd2lkdGg6ICc4MDBweCcsXHJcbiAgICAgIG1heFdpZHRoOiAnOTV2dycsXHJcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLFxyXG4gICAgICBhcmlhTW9kYWw6IHRydWUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZXMgdGhlIHJldXNhYmxlLXRhYmxlIGNvbHVtbnMgZm9yIHRoZSBJbnRlcmVzdGVkIFJvc3RlcnMgbGlzdC4gRXZlcnlcclxuICAgKiBgY2VsbERhdGFgL2BzZWxlY3RlZE9wdGlvbmAgaXMgYSBgKHJvdykgPT4gLi4uYCBhY2Nlc3NvciwgbWF0Y2hpbmcgdGhlXHJcbiAgICogc2hhcmVkIHRhYmxlJ3MgY29udHJhY3QuIE1lbWJlciBMZXZlbCBpcyB0aGUgRFJPUERPV04gY29sdW1uIHNlZWRlZCB3aXRoIHRoZVxyXG4gICAqIGNvbmZpZ3VyZWQgbGV2ZWxzIHBsdXMgXCJOb25lXCI7IEZvcm0gaXMgYSBMSU5LIHRoYXQgb3BlbnMgdGhlIHJlc3BvbnNlc1xyXG4gICAqIGRpYWxvZy5cclxuICAgKiBAbWVtYmVyb2YgSW50ZXJlc3RlZFJvc3RlcnNDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkQ29sdW1uU2NoZW1hKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMudGV4dHM/LmNvbHVtbnM7XHJcbiAgICB0aGlzLmNvbHVtblNjaGVtYSA9IFtcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIGNvbHVtbkRlZjogJ25hbWUnLFxyXG4gICAgICAgIGhlYWRpbmc6IGNvbHVtbnM/Lm5hbWUsXHJcbiAgICAgICAgY29sdW1uVHlwZTogVGFibGVDb2x1bW5UeXBlLlRFWFQsXHJcbiAgICAgICAgaXNTb3J0YWJsZUNvbHVtbjogdHJ1ZSxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGNlbGxEYXRhOiAocm93OiBhbnkpID0+IHJvdy5uYW1lLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6IDIsXHJcbiAgICAgICAgY29sdW1uRGVmOiAnZW1haWwnLFxyXG4gICAgICAgIGhlYWRpbmc6IGNvbHVtbnM/LmVtYWlsLFxyXG4gICAgICAgIGNvbHVtblR5cGU6IFRhYmxlQ29sdW1uVHlwZS5URVhULFxyXG4gICAgICAgIGlzU29ydGFibGVDb2x1bW46IHRydWUsXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBjZWxsRGF0YTogKHJvdzogYW55KSA9PiByb3cuZW1haWwsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogMyxcclxuICAgICAgICBjb2x1bW5EZWY6ICdhZmZpbGlhdGlvbnMnLFxyXG4gICAgICAgIGhlYWRpbmc6IGNvbHVtbnM/LmFmZmlsaWF0aW9ucyxcclxuICAgICAgICBjb2x1bW5UeXBlOiBUYWJsZUNvbHVtblR5cGUuVEVYVCxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGNlbGxEYXRhOiAocm93OiBhbnkpID0+IChyb3cuYWZmaWxpYXRpb25zIHx8IFtdKS5qb2luKCcsICcpLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6IDQsXHJcbiAgICAgICAgY29sdW1uRGVmOiAnc3VibWl0dGVkT24nLFxyXG4gICAgICAgIGhlYWRpbmc6IGNvbHVtbnM/LnN1Ym1pdHRlZE9uLFxyXG4gICAgICAgIGNvbHVtblR5cGU6IFRhYmxlQ29sdW1uVHlwZS5URVhULFxyXG4gICAgICAgIGlzU29ydGFibGVDb2x1bW46IHRydWUsXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBjZWxsRGF0YTogKHJvdzogYW55KSA9PiByb3cuc3VibWl0dGVkT24sXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogNSxcclxuICAgICAgICBjb2x1bW5EZWY6ICdtZW1iZXJMZXZlbCcsXHJcbiAgICAgICAgaGVhZGluZzogY29sdW1ucz8ubWVtYmVyTGV2ZWwsXHJcbiAgICAgICAgY29sdW1uVHlwZTogVGFibGVDb2x1bW5UeXBlLkRST1BET1dOLFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgY2VsbERhdGE6IChyb3c6IGFueSkgPT4gcm93Lm1lbWJlckxldmVsLFxyXG4gICAgICAgIGRyb3Bkb3duT3B0aW9uczogdGhpcy5tZW1iZXJMZXZlbE9wdGlvbnMsXHJcbiAgICAgICAgZHJvcGRvd25QbGFjZWhvbGRlcjogdGhpcy50ZXh0cz8ubWVtYmVyTGV2ZWxQbGFjZWhvbGRlcixcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIHNlbGVjdGVkT3B0aW9uOiAocm93OiBhbnkpID0+XHJcbiAgICAgICAgICB0aGlzLm1lbWJlckxldmVsT3B0aW9ucy5maW5kKChvKSA9PiBvLm5hbWUgPT09IHJvdy5tZW1iZXJMZXZlbCkgPz9cclxuICAgICAgICAgIG51bGwsXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogNixcclxuICAgICAgICBjb2x1bW5EZWY6ICdmb3JtJyxcclxuICAgICAgICBoZWFkaW5nOiBjb2x1bW5zPy5mb3JtLFxyXG4gICAgICAgIGNvbHVtblR5cGU6IFRhYmxlQ29sdW1uVHlwZS5MSU5LLFxyXG4gICAgICAgIGNlbGxEYXRhOiAoKSA9PiB0aGlzLnRleHRzPy52aWV3TGFiZWwsXHJcbiAgICAgICAgYXJpYUxhYmVsOiAocm93OiBJbnRlcmVzdGVkUm9zdGVyKSA9PlxyXG4gICAgICAgICAgYCR7dGhpcy50ZXh0cz8udmlld0FyaWFMYWJlbFByZWZpeH0gJHtyb3c/Lm5hbWUgPz8gJyd9YC50cmltKCksXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBjbGFzcz1cImllZWVzYS1pbnRlcmVzdGVkLXJvc3RlcnNcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHRzPy5yZWdpb25BcmlhTGFiZWxcIj5cclxuICA8cCBjbGFzcz1cImllZWVzYS1pbnRlcmVzdGVkLXJvc3RlcnNfX2NvdW50XCI+e3sgdG90YWxSZWNvcmRzIH19IHt7IHRleHRzPy5jb3VudFN1ZmZpeCB9fTwvcD5cclxuICA8aWVlZXNhLWRhdGEtdGFibGVcclxuICAgIFt0YWJsZURhdGFJbmZvXT1cInRhYmxlRGF0YVwiXHJcbiAgICBbY29sdW1uU2NoZW1hSW5mb109XCJjb2x1bW5TY2hlbWFcIlxyXG4gICAgW3RhYmxlQWN0aW9uc109XCJ0YWJsZUFjdGlvbnNcIlxyXG4gICAgW3BhZ2luYXRvckNvbmZpZ109XCJwYWdpbmF0b3JDb25maWdcIlxyXG4gICAgW3BhZ2VJbmRleF09XCJwYWdlSW5kZXhcIlxyXG4gICAgW3BhZ2VTaXplXT1cInBhZ2luYXRvckNvbmZpZy5yZWNvcmRzUGVyUGFnZVwiXHJcbiAgICBbZGVmYXVsdFNvcnRlZENvbHVtbl09XCJkZWZhdWx0U29ydGVkQ29sdW1uXCJcclxuICAgIFtkZWZhdWx0Q29sdW1uU29ydERpcmVjdGlvbl09XCJkZWZhdWx0Q29sdW1uU29ydERpcmVjdGlvblwiXHJcbiAgICBbaXNDbGVhclNvcnROZWVkZWRdPVwiZmFsc2VcIlxyXG4gICAgKHBhZ2luYXRpb25DaGFuZ2UpPVwib25QYWdpbmF0aW9uQ2hhbmdlKCRldmVudClcIlxyXG4gICAgKHNvcnRDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKCRldmVudClcIlxyXG4gICAgKHJvd0xpbmspPVwib25Gb3JtTGlua0NsaWNrKCRldmVudClcIlxyXG4gICAgKHJvd0Ryb3Bkb3duQ2hhbmdlKT1cIm9uTWVtYmVyTGV2ZWxDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgPjwvaWVlZXNhLWRhdGEtdGFibGU+XHJcbjwvc2VjdGlvbj5cclxuIl19