commons-assessment 12.1.0 → 12.1.2-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +11 -0
  2. package/bundles/commons-assessment.umd.js +2304 -247
  3. package/bundles/commons-assessment.umd.js.map +1 -1
  4. package/esm2015/lib/modules/assessment-maker/assessment-maker.component.js +293 -32
  5. package/esm2015/lib/modules/assessment-maker/assessment-maker.module.js +10 -5
  6. package/esm2015/lib/modules/assessment-maker/components/add-edit-section-introduction/add-edit-section-introduction.component.js +1 -1
  7. package/esm2015/lib/modules/assessment-maker/components/assessment-builder/assessment-builder.component.js +77 -22
  8. package/esm2015/lib/modules/assessment-maker/components/question-bank-picker/question-bank-picker.component.js +276 -0
  9. package/esm2015/lib/modules/assessment-maker/components/question-details/question-details.component.js +22 -2
  10. package/esm2015/lib/modules/assessment-maker/services/assessment-builder.service.js +22 -7
  11. package/esm2015/lib/modules/assessment-maker/services/assessment-maker.service.js +32 -5
  12. package/esm2015/lib/modules/assessment-taker/assessment-taker.component.js +365 -42
  13. package/esm2015/lib/modules/assessment-taker/assessment-taker.module.js +9 -3
  14. package/esm2015/lib/modules/assessment-taker/components/proctoring-consent/proctoring-consent.component.js +137 -0
  15. package/esm2015/lib/modules/assessment-taker/components/proctoring-result/proctoring-result.component.js +177 -0
  16. package/esm2015/lib/modules/assessment-taker/components/question-type-date-picker/question-type-date-picker.component.js +2 -3
  17. package/esm2015/lib/modules/assessment-taker/components/question-type-editor/question-type-editor.component.js +1 -1
  18. package/esm2015/lib/modules/assessment-taker/components/question-type-file-upload/question-type-file-upload.component.js +5 -2
  19. package/esm2015/lib/modules/assessment-taker/components/question-type-long/question-type-long.component.js +1 -1
  20. package/esm2015/lib/modules/assessment-taker/components/question-type-multiselect/question-type-multiselect.component.js +7 -3
  21. package/esm2015/lib/modules/assessment-taker/components/question-type-objective/question-type-objective.component.js +7 -3
  22. package/esm2015/lib/modules/assessment-taker/components/question-type-preference/question-type-preference.component.js +9 -4
  23. package/esm2015/lib/modules/assessment-taker/components/question-type-short/question-type-short.component.js +78 -8
  24. package/esm2015/lib/modules/assessment-taker/components/section-instructions/section-instructions.component.js +1 -1
  25. package/esm2015/lib/modules/assessment-taker/services/assessment-taker.service.js +18 -3
  26. package/esm2015/lib/modules/assessment-taker/services/proctoring.service.js +125 -0
  27. package/esm2015/lib/modules/assessment-taker/services/response-builder.service.js +15 -1
  28. package/esm2015/lib/modules/question-bank/question-bank.component.js +313 -0
  29. package/esm2015/lib/modules/question-bank/question-bank.module.js +45 -0
  30. package/esm2015/lib/shared/components/confirmation-dialog/confirmation-dialog.component.js +56 -0
  31. package/esm2015/lib/shared/components/skill-allocation/skill-allocation.component.js +5 -2
  32. package/esm2015/lib/shared/controllers.js +18 -4
  33. package/esm2015/lib/shared/interfaces/assessment.interface.js +1 -1
  34. package/esm2015/lib/shared/interfaces/proctoring.interface.js +2 -0
  35. package/esm2015/lib/shared/material-modules.js +1 -16
  36. package/esm2015/lib/shared/shared.module.js +8 -3
  37. package/esm2015/lib/shared/utils.js +19 -1
  38. package/esm2015/public-api.js +4 -1
  39. package/fesm2015/commons-assessment.js +2071 -152
  40. package/fesm2015/commons-assessment.js.map +1 -1
  41. package/lib/modules/assessment-maker/assessment-maker.component.d.ts +40 -2
  42. package/lib/modules/assessment-maker/assessment-maker.module.d.ts +6 -5
  43. package/lib/modules/assessment-maker/components/assessment-builder/assessment-builder.component.d.ts +7 -0
  44. package/lib/modules/assessment-maker/components/question-bank-picker/question-bank-picker.component.d.ts +81 -0
  45. package/lib/modules/assessment-maker/components/question-details/question-details.component.d.ts +6 -1
  46. package/lib/modules/assessment-maker/services/assessment-builder.service.d.ts +10 -3
  47. package/lib/modules/assessment-maker/services/assessment-maker.service.d.ts +15 -11
  48. package/lib/modules/assessment-taker/assessment-taker.component.d.ts +81 -2
  49. package/lib/modules/assessment-taker/assessment-taker.module.d.ts +7 -5
  50. package/lib/modules/assessment-taker/components/proctoring-consent/proctoring-consent.component.d.ts +39 -0
  51. package/lib/modules/assessment-taker/components/proctoring-result/proctoring-result.component.d.ts +82 -0
  52. package/lib/modules/assessment-taker/components/question-type-file-upload/question-type-file-upload.component.d.ts +1 -0
  53. package/lib/modules/assessment-taker/components/question-type-multiselect/question-type-multiselect.component.d.ts +1 -0
  54. package/lib/modules/assessment-taker/components/question-type-objective/question-type-objective.component.d.ts +1 -0
  55. package/lib/modules/assessment-taker/components/question-type-preference/question-type-preference.component.d.ts +1 -0
  56. package/lib/modules/assessment-taker/components/question-type-short/question-type-short.component.d.ts +14 -2
  57. package/lib/modules/assessment-taker/services/assessment-taker.service.d.ts +5 -0
  58. package/lib/modules/assessment-taker/services/proctoring.service.d.ts +40 -0
  59. package/lib/modules/assessment-taker/services/response-builder.service.d.ts +9 -0
  60. package/lib/modules/question-bank/question-bank.component.d.ts +65 -0
  61. package/lib/modules/question-bank/question-bank.module.d.ts +12 -0
  62. package/lib/shared/components/confirmation-dialog/confirmation-dialog.component.d.ts +36 -0
  63. package/lib/shared/components/skill-allocation/skill-allocation.component.d.ts +1 -0
  64. package/lib/shared/controllers.d.ts +14 -1
  65. package/lib/shared/interfaces/assessment.interface.d.ts +8 -0
  66. package/lib/shared/interfaces/proctoring.interface.d.ts +101 -0
  67. package/lib/shared/material-modules.d.ts +5 -8
  68. package/lib/shared/shared.module.d.ts +5 -4
  69. package/lib/shared/utils.d.ts +4 -0
  70. package/package.json +1 -1
  71. package/public-api.d.ts +3 -0
  72. package/src/lib/assets/images/arrow-down-blue.svg +3 -0
  73. package/src/lib/assets/images/arrow-up-blue.svg +3 -0
  74. package/src/lib/assets/images/file-import.svg +11 -0
  75. package/src/lib/assets/images/plus-white.svg +1 -0
  76. package/src/lib/assets/images/proctoring.svg +3 -0
  77. package/src/lib/assets/images/user.svg +3 -0
  78. package/src/lib/assets/json/imageConfig.json +7 -1
  79. package/src/lib/assets/json/labelConfig.json +107 -2
  80. package/src/lib/assets/theme/_theme.global.scss +6 -0
  81. package/src/lib/assets/theme/_theme.scss +17 -346
  82. package/src/lib/assets/theme/styles.scss +13 -0
@@ -0,0 +1,276 @@
1
+ import { Component, Inject } from '@angular/core';
2
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
+ import { Subject } from 'rxjs';
4
+ import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../services/assessment-maker.service";
7
+ import * as i2 from "@angular/material/dialog";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "@angular/forms";
10
+ export class QuestionBankPickerComponent {
11
+ constructor(assessmentMakerService, dialogRef, dialogData) {
12
+ this.assessmentMakerService = assessmentMakerService;
13
+ this.dialogRef = dialogRef;
14
+ this.dialogData = dialogData;
15
+ this.labelConfig = {};
16
+ this.imageConfig = {};
17
+ this.questionTypes = [];
18
+ this.existingQuestionIds = new Set();
19
+ this.targetSectionName = '';
20
+ // Pagination & Infinite Scroll
21
+ this.allQuestions = [];
22
+ this.filteredQuestions = [];
23
+ this.currentPage = 0;
24
+ this.pageSize = 20;
25
+ this.totalElements = 0;
26
+ this.hasNext = false;
27
+ this.isLoading = false;
28
+ this.isInitialLoading = true;
29
+ // Server-side search & filters
30
+ this.searchTerm = '';
31
+ this.selectedTypeCode = '';
32
+ // Multi-selection & Expanded Options
33
+ this.selectedQuestions = new Map();
34
+ this.expandedQuestionIds = new Set();
35
+ this.questionBankConfig = {};
36
+ this.searchSubject$ = new Subject();
37
+ this.destroy$ = new Subject();
38
+ }
39
+ ngOnInit() {
40
+ var _a, _b, _c, _d, _e, _f;
41
+ this.labelConfig = ((_a = this.dialogData) === null || _a === void 0 ? void 0 : _a.labelConfig) || {};
42
+ this.imageConfig = ((_b = this.dialogData) === null || _b === void 0 ? void 0 : _b.imageConfig) || {};
43
+ this.questionTypes = ((_c = this.dialogData) === null || _c === void 0 ? void 0 : _c.questionTypes) || [];
44
+ this.existingQuestionIds = ((_d = this.dialogData) === null || _d === void 0 ? void 0 : _d.existingQuestionIds) || new Set();
45
+ this.questionBankConfig = ((_e = this.dialogData) === null || _e === void 0 ? void 0 : _e.questionBankConfig) || {};
46
+ this.targetSectionName = ((_f = this.dialogData) === null || _f === void 0 ? void 0 : _f.targetSectionName) || '';
47
+ this.searchSubject$.pipe(debounceTime(350), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(term => {
48
+ this.searchTerm = term;
49
+ this.currentPage = 0;
50
+ this.allQuestions = [];
51
+ this.loadPage(0, false);
52
+ });
53
+ this.loadPage(0, false);
54
+ }
55
+ ngOnDestroy() {
56
+ this.destroy$.next();
57
+ this.destroy$.complete();
58
+ }
59
+ loadPage(page, append = false) {
60
+ var _a, _b, _c;
61
+ this.isLoading = true;
62
+ const params = { page, size: this.pageSize };
63
+ if ((_a = this.questionBankConfig) === null || _a === void 0 ? void 0 : _a.domain) {
64
+ params.domain = this.questionBankConfig.domain;
65
+ }
66
+ if ((_b = this.questionBankConfig) === null || _b === void 0 ? void 0 : _b.tenant) {
67
+ params.tenant = this.questionBankConfig.tenant;
68
+ }
69
+ if ((_c = this.searchTerm) === null || _c === void 0 ? void 0 : _c.trim()) {
70
+ params.questionText = this.searchTerm.trim();
71
+ }
72
+ if (this.selectedTypeCode) {
73
+ params.questionType = this.selectedTypeCode;
74
+ }
75
+ this.assessmentMakerService.getQuestionBankQuestions(params).subscribe({
76
+ next: (res) => {
77
+ var _a;
78
+ const elements = (res === null || res === void 0 ? void 0 : res.elements) || (res === null || res === void 0 ? void 0 : res.content) || (Array.isArray(res) ? res : []);
79
+ if (append) {
80
+ this.allQuestions = [...this.allQuestions, ...elements];
81
+ }
82
+ else {
83
+ this.allQuestions = elements;
84
+ }
85
+ this.totalElements = (_a = res === null || res === void 0 ? void 0 : res.totalElements) !== null && _a !== void 0 ? _a : (append ? this.allQuestions.length : elements.length);
86
+ this.hasNext = (res === null || res === void 0 ? void 0 : res.hasNext) !== undefined ? !!res.hasNext : (elements.length === this.pageSize);
87
+ this.currentPage = page;
88
+ this.isLoading = false;
89
+ this.isInitialLoading = false;
90
+ this.filteredQuestions = this.allQuestions;
91
+ },
92
+ error: () => {
93
+ this.isLoading = false;
94
+ this.isInitialLoading = false;
95
+ }
96
+ });
97
+ }
98
+ loadMore() {
99
+ if (this.hasNext && !this.isLoading) {
100
+ this.loadPage(this.currentPage + 1, true);
101
+ }
102
+ }
103
+ onScroll(event) {
104
+ const target = event.target;
105
+ if (!target)
106
+ return;
107
+ const threshold = 160;
108
+ const reachedBottom = target.scrollHeight - target.scrollTop - target.clientHeight <= threshold;
109
+ if (reachedBottom && this.hasNext && !this.isLoading) {
110
+ this.loadMore();
111
+ }
112
+ }
113
+ applyFilters() {
114
+ this.filteredQuestions = this.allQuestions;
115
+ }
116
+ onSearchChange(term) {
117
+ this.searchSubject$.next(term || '');
118
+ }
119
+ clearSearch() {
120
+ this.searchTerm = '';
121
+ this.currentPage = 0;
122
+ this.allQuestions = [];
123
+ this.loadPage(0, false);
124
+ }
125
+ onTypeFilterChange(typeCode) {
126
+ this.selectedTypeCode = typeCode || '';
127
+ this.currentPage = 0;
128
+ this.allQuestions = [];
129
+ this.loadPage(0, false);
130
+ }
131
+ selectQuickTypeFilter(typeCode) {
132
+ const code = typeCode || '';
133
+ this.selectedTypeCode = this.selectedTypeCode === code ? '' : code;
134
+ this.currentPage = 0;
135
+ this.allQuestions = [];
136
+ this.loadPage(0, false);
137
+ }
138
+ toggleSelection(question) {
139
+ if (!question.id || this.isAlreadyInAssessment(question.id))
140
+ return;
141
+ if (this.selectedQuestions.has(question.id)) {
142
+ this.selectedQuestions.delete(question.id);
143
+ }
144
+ else {
145
+ this.selectedQuestions.set(question.id, question);
146
+ }
147
+ }
148
+ isSelected(question) {
149
+ return !!question.id && this.selectedQuestions.has(question.id);
150
+ }
151
+ isAlreadyInAssessment(questionId) {
152
+ return !!questionId && this.existingQuestionIds.has(questionId);
153
+ }
154
+ // Bulk selection methods
155
+ get eligibleVisibleQuestions() {
156
+ return this.filteredQuestions.filter(q => q.id && !this.isAlreadyInAssessment(q.id));
157
+ }
158
+ get isAllVisibleSelected() {
159
+ const eligible = this.eligibleVisibleQuestions;
160
+ return eligible.length > 0 && eligible.every(q => this.selectedQuestions.has(q.id));
161
+ }
162
+ get isSomeVisibleSelected() {
163
+ const eligible = this.eligibleVisibleQuestions;
164
+ return eligible.some(q => this.selectedQuestions.has(q.id)) && !this.isAllVisibleSelected;
165
+ }
166
+ toggleSelectAllVisible() {
167
+ const eligible = this.eligibleVisibleQuestions;
168
+ if (this.isAllVisibleSelected) {
169
+ eligible.forEach(q => {
170
+ if (q.id)
171
+ this.selectedQuestions.delete(q.id);
172
+ });
173
+ }
174
+ else {
175
+ eligible.forEach(q => {
176
+ if (q.id)
177
+ this.selectedQuestions.set(q.id, q);
178
+ });
179
+ }
180
+ }
181
+ clearAllSelection() {
182
+ this.selectedQuestions.clear();
183
+ }
184
+ // Option preview methods
185
+ hasOptions(question) {
186
+ return !!(question.defaultOptionsList && question.defaultOptionsList.length > 0);
187
+ }
188
+ toggleExpandOptions(questionId, event) {
189
+ event.stopPropagation();
190
+ if (!questionId)
191
+ return;
192
+ if (this.expandedQuestionIds.has(questionId)) {
193
+ this.expandedQuestionIds.delete(questionId);
194
+ }
195
+ else {
196
+ this.expandedQuestionIds.add(questionId);
197
+ }
198
+ }
199
+ isOptionsExpanded(questionId) {
200
+ return !!questionId && this.expandedQuestionIds.has(questionId);
201
+ }
202
+ // Calculated metrics
203
+ get selectedCount() {
204
+ return this.selectedQuestions.size;
205
+ }
206
+ get totalSelectedMarks() {
207
+ let total = 0;
208
+ this.selectedQuestions.forEach(q => {
209
+ total += (q.weight || 0);
210
+ });
211
+ return total;
212
+ }
213
+ getTypeCount(typeCode) {
214
+ if (!typeCode)
215
+ return this.allQuestions.length;
216
+ return this.allQuestions.filter(q => { var _a; return ((_a = q.questionType) === null || _a === void 0 ? void 0 : _a.code) === typeCode; }).length;
217
+ }
218
+ getCategoryClass(question) {
219
+ var _a;
220
+ const code = ((_a = question === null || question === void 0 ? void 0 : question.questionType) === null || _a === void 0 ? void 0 : _a.code) || '';
221
+ if (code.includes('OBJECTIVE') || code.includes('CHOICE') || code.includes('MCQ')) {
222
+ return 'badge-objective';
223
+ }
224
+ if (code.includes('SUBJECTIVE') || code.includes('ESSAY') || code.includes('TEXT')) {
225
+ return 'badge-subjective';
226
+ }
227
+ if (code.includes('DATE') || code.includes('TIME')) {
228
+ return 'badge-date';
229
+ }
230
+ return 'badge-generic';
231
+ }
232
+ importSelected() {
233
+ if (this.selectedCount > 0) {
234
+ this.dialogRef.close(Array.from(this.selectedQuestions.values()));
235
+ }
236
+ }
237
+ close() {
238
+ this.dialogRef.close(null);
239
+ }
240
+ capitalizeFirst(text) {
241
+ if (!text)
242
+ return '';
243
+ return text.toLowerCase().split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
244
+ }
245
+ getQuestionTypeLabel(question) {
246
+ var _a, _b, _c, _d;
247
+ return this.capitalizeFirst(((_c = (_b = (_a = question === null || question === void 0 ? void 0 : question.questionType) === null || _a === void 0 ? void 0 : _a.labels) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.text) || ((_d = question === null || question === void 0 ? void 0 : question.questionType) === null || _d === void 0 ? void 0 : _d.code));
248
+ }
249
+ imageErrorHandler(event, filePath) {
250
+ if (!(event === null || event === void 0 ? void 0 : event.target))
251
+ return;
252
+ if (event.target.getAttribute('data-error-handled') === 'true') {
253
+ event.target.style.display = 'none';
254
+ return;
255
+ }
256
+ event.target.setAttribute('data-error-handled', 'true');
257
+ event.target.src = filePath;
258
+ }
259
+ trackByQuestionId(index, question) {
260
+ return (question === null || question === void 0 ? void 0 : question.id) ? 'q' + question.id : 'i' + index;
261
+ }
262
+ }
263
+ QuestionBankPickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: QuestionBankPickerComponent, deps: [{ token: i1.AssessmentMakerService }, { token: i2.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
264
+ QuestionBankPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: QuestionBankPickerComponent, selector: "lib-question-bank-picker", ngImport: i0, template: "<div class=\"d-flex flex-column h-100 question-bank-picker\">\r\n <!-- Header: Back Arrow + Title + Subtitle -->\r\n <div class=\"d-flex align-items-center justify-content-between px-4 py-3 border-bottom picker-header\">\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <button (click)=\"close()\" class=\"btn-icon-back\" [attr.aria-label]=\"labelConfig['COMMONS_ASSESSMENT.LABEL.GO_BACK'] || 'Go Back'\">\r\n <img [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.GO_BACK']\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/go-back.svg')\"\r\n class=\"action-icon\" />\r\n </button>\r\n <div>\r\n <h4 class=\"mb-0 fw-bold picker-title\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.IMPORT_FROM_QUESTION_BANK'] || 'Import from Question Bank'}}\r\n </h4>\r\n <p class=\"mb-0 picker-subtitle\">\r\n <span class=\"text-secondary\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.SELECTED_SECTION'] || 'Selected Section'}}:</span>\r\n <span class=\"text-primary fw-semibold ms-1\" *ngIf=\"targetSectionName\">{{targetSectionName}}</span>\r\n <span class=\"text-secondary ms-1\" *ngIf=\"!targetSectionName\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.IMPORT_QUESTIONS_INTO_NEW_SECTION'] || 'Import questions into a new section'}}</span>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Search & Filter Controls Deck -->\r\n <div class=\"picker-search-deck px-4 pt-3 pb-2 border-bottom\">\r\n <div class=\"d-flex gap-3 align-items-center mb-2\">\r\n <!-- Search Box -->\r\n <div class=\"search-input-wrapper flex-grow-1 position-relative\">\r\n <input type=\"text\"\r\n class=\"form-control search-input\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.LABEL.SEARCH_QUESTION'] || 'Search Question'\"\r\n [ngModel]=\"searchTerm\"\r\n (ngModelChange)=\"onSearchChange($event)\">\r\n <button *ngIf=\"searchTerm\" (click)=\"clearSearch()\" class=\"search-clear-btn\" aria-label=\"Clear Search\">\r\n \u2715\r\n </button>\r\n </div>\r\n\r\n <!-- Type Filter Dropdown using arrow-down-black.svg -->\r\n <div class=\"type-filter-wrapper position-relative\">\r\n <select class=\"form-select filter-select cursor-pointer\"\r\n [ngModel]=\"selectedTypeCode\"\r\n (ngModelChange)=\"onTypeFilterChange($event)\">\r\n <option value=\"\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.ALL_TYPES'] || 'All Types'}}</option>\r\n <option *ngFor=\"let type of questionTypes\" [value]=\"type.code\">\r\n {{type.label || type.code}}\r\n </option>\r\n </select>\r\n <img [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.ARROW_DOWN_BLACK']\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/arrow-down-black.svg')\"\r\n class=\"select-arrow-icon pointer-events-none\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Section Header: Question Count & Select All -->\r\n <div class=\"d-flex align-items-center justify-content-between pt-2 pb-1\">\r\n <h5 class=\"mb-0 fw-bold questions-heading\">\r\n {{totalElements || filteredQuestions.length}} {{labelConfig['COMMONS_ASSESSMENT.LABEL.QUESTIONS'] || 'Questions'}}\r\n </h5>\r\n <div class=\"form-check d-flex align-items-center gap-2 mb-0\">\r\n <input class=\"form-check-input select-all-checkbox cursor-pointer\"\r\n type=\"checkbox\"\r\n id=\"selectAllQuestions\"\r\n [checked]=\"isAllVisibleSelected\"\r\n [indeterminate]=\"isSomeVisibleSelected\"\r\n [disabled]=\"eligibleVisibleQuestions.length === 0\"\r\n (change)=\"toggleSelectAllVisible()\">\r\n <label class=\"form-check-label select-all-label cursor-pointer\" for=\"selectAllQuestions\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.SELECT_ALL_QUESTIONS'] || 'Select All Questions'}}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Questions Viewport Box -->\r\n <div class=\"flex-grow-1 overflow-auto p-3\" (scroll)=\"onScroll($event)\">\r\n <!-- Skeleton Loading State -->\r\n <div *ngIf=\"isInitialLoading\" class=\"d-flex flex-column gap-3 py-1\">\r\n <div *ngFor=\"let i of [1, 2, 3, 4, 5]\" class=\"skeleton-card\">\r\n <div class=\"skeleton-line line-full\"></div>\r\n <div class=\"skeleton-meta\"></div>\r\n </div>\r\n </div>\r\n\r\n <!-- Question Cards -->\r\n <div *ngIf=\"!isInitialLoading && filteredQuestions.length > 0\" class=\"d-flex flex-column gap-3\">\r\n <div *ngFor=\"let question of filteredQuestions; trackBy: trackByQuestionId\"\r\n class=\"question-card\"\r\n [class.disabled-card]=\"isAlreadyInAssessment(question.id)\"\r\n [class.selected-card]=\"isSelected(question)\"\r\n (click)=\"toggleSelection(question)\">\r\n\r\n <!-- Main Card Header: Checkbox + Question Text + #ID -->\r\n <div class=\"d-flex align-items-start gap-3\">\r\n <div class=\"pt-1 flex-shrink-0\">\r\n <input class=\"form-check-input card-checkbox cursor-pointer\"\r\n type=\"checkbox\"\r\n [checked]=\"isSelected(question)\"\r\n [disabled]=\"isAlreadyInAssessment(question.id)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"toggleSelection(question)\">\r\n </div>\r\n\r\n <div class=\"flex-grow-1 min-w-0\">\r\n <div class=\"d-flex align-items-start justify-content-between gap-3 mb-2\">\r\n <div class=\"question-body-text fw-medium text-break\"\r\n [innerHTML]=\"question?.questionText?.[0]?.text\"></div>\r\n <span class=\"question-id-badge flex-shrink-0\" *ngIf=\"question?.id\">#{{question.id}}</span>\r\n </div>\r\n\r\n <!-- Badges Row: Type Pill, Marks Pill, Mandatory Pill, and Added Pill -->\r\n <div class=\"d-flex align-items-center justify-content-between flex-wrap gap-2 mt-1\">\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n <!-- Question Type Pill (Orange/Amber) -->\r\n <span class=\"badge-pill badge-type-pill p-2 rounded\" *ngIf=\"question?.questionType\">\r\n {{getQuestionTypeLabel(question)}}\r\n </span>\r\n\r\n <!-- Marks Pill (Blue/Indigo) -->\r\n <span class=\"badge-pill badge-marks-pill p-2 rounded\" *ngIf=\"question?.weight !== undefined && question?.weight !== null\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.MARKS'] || 'Marks'}} {{question.weight}}\r\n </span>\r\n\r\n <!-- Mandatory Pill (Green) -->\r\n <span class=\"badge-pill badge-mandatory-pill p-2 rounded\" *ngIf=\"question?.isMandatory\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.MANDATORY'] || 'Mandatory'}}\r\n </span>\r\n </div>\r\n\r\n <!-- Right-aligned Already Added Pill -->\r\n <span *ngIf=\"isAlreadyInAssessment(question.id)\" class=\"badge-pill badge-added-pill p-2\">\r\n <span class=\"dot-indicator\"></span>\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.ADDED'] || 'Added'}}\r\n </span>\r\n </div>\r\n\r\n <!-- Options Accordion (if question has defaultOptionsList) -->\r\n <div *ngIf=\"hasOptions(question)\" class=\"options-accordion-section mt-3 pt-2\">\r\n <!-- Toggle Button Row with Arrow & Divider Line -->\r\n <div class=\"d-flex align-items-center gap-2 cursor-pointer options-toggle-row\"\r\n (click)=\"toggleExpandOptions(question.id, $event)\">\r\n <span class=\"options-count-text text-primary fw-semibold\">\r\n {{question.defaultOptionsList?.length || 0}} {{labelConfig['COMMONS_ASSESSMENT.LABEL.OPTIONS'] || 'Options'}}\r\n </span>\r\n <img [src]=\"isOptionsExpanded(question.id) ? (imageConfig['COMMONS_ASSESSMENT.ICON.ARROW_UP_BLUE'] || 'assets/commons-assessment/images/arrow-up-blue.svg') : (imageConfig['COMMONS_ASSESSMENT.ICON.ARROW_DOWN_BLUE'] || 'assets/commons-assessment/images/arrow-down-blue.svg')\"\r\n (error)=\"imageErrorHandler($event, isOptionsExpanded(question.id) ? 'assets/commons-assessment/images/arrow-up-blue.svg' : 'assets/commons-assessment/images/arrow-down-blue.svg')\"\r\n class=\"options-arrow-icon\" />\r\n <div class=\"options-divider-line flex-grow-1\"></div>\r\n <span class=\"text-secondary text-12 options-hint-text\">\r\n \u2022 {{labelConfig['COMMONS_ASSESSMENT.LABEL.CLICK_TO_VIEW'] || 'Click to view'}}\r\n </span>\r\n </div>\r\n\r\n <!-- Expanded Options List (Radio options) -->\r\n <div *ngIf=\"isOptionsExpanded(question.id)\"\r\n class=\"options-list-container d-flex flex-column gap-2 mt-3 ps-1\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div *ngFor=\"let opt of question.defaultOptionsList\"\r\n class=\"d-flex align-items-center gap-2 option-item-row\">\r\n <span class=\"option-radio-circle\"></span>\r\n <span class=\"option-text text-break\">\r\n {{opt.options?.optionName?.[0]?.text || opt.options?.optionCode || 'Option'}}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Empty State: No matching filter results -->\r\n <div *ngIf=\"!isInitialLoading && filteredQuestions.length === 0 && allQuestions.length > 0\"\r\n class=\"empty-state-box py-5 text-center\">\r\n <p class=\"empty-state-title fw-semibold text-15 mb-1\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.NO_MATCHING_QUESTIONS'] || 'No matching questions found'}}\r\n </p>\r\n <p class=\"empty-state-desc text-secondary text-13 mb-3\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.NO_MATCHING_QUESTIONS_DESC'] || 'Try adjusting your search terms or clearing selected question type filters.'}}\r\n </p>\r\n <button (click)=\"clearSearch(); selectedTypeCode = ''; applyFilters();\"\r\n class=\"btn btn-outline-primary btn-sm px-3\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.CLEAR_FILTERS'] || 'Clear Filters'}}\r\n </button>\r\n </div>\r\n\r\n <!-- Empty State: Question bank is empty -->\r\n <div *ngIf=\"!isInitialLoading && allQuestions.length === 0\"\r\n class=\"empty-state-box py-5 text-center\">\r\n <img [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.NO_QUESTIONS']\" class=\"empty-state-img mb-3\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/no-questions.svg')\" />\r\n <p class=\"empty-state-title fw-semibold text-15 mb-1\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.NO_QUESTIONS_IN_BANK'] || 'No Questions in Bank!'}}\r\n </p>\r\n <p class=\"empty-state-desc text-secondary text-13 mb-0\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.NO_QUESTIONS_IN_BANK_DESC'] || 'Create standalone questions in the Question Bank to reuse them here.'}}\r\n </p>\r\n </div>\r\n\r\n <!-- Infinite Scroll Bottom Loader -->\r\n <div *ngIf=\"isLoading && !isInitialLoading\" class=\"py-3 d-flex align-items-center justify-content-center gap-2\">\r\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n <span class=\"text-secondary text-13\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.LOADING_MORE_QUESTIONS'] || 'Loading more questions...'}}\r\n </span>\r\n </div>\r\n\r\n <!-- End of list reached -->\r\n <div *ngIf=\"!hasNext && allQuestions.length > 0 && !isLoading\" class=\"text-center py-3 text-secondary text-12\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.ALL_QUESTIONS_LOADED'] || 'All questions loaded'}} ({{totalElements}})\r\n </div>\r\n </div>\r\n\r\n <!-- Sticky Footer -->\r\n <div class=\"px-4 py-3 border-top picker-footer d-flex align-items-center justify-content-between bg-white\">\r\n <div class=\"footer-summary\">\r\n <span class=\"text-secondary text-13\" *ngIf=\"selectedCount === 0\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.NO_QUESTIONS_SELECTED'] || 'No questions selected'}}\r\n </span>\r\n <span class=\"text-secondary text-13\" *ngIf=\"selectedCount > 0\">\r\n <strong class=\"text-primary\">{{selectedCount}}</strong> {{labelConfig['COMMONS_ASSESSMENT.LABEL.QUESTIONS_SELECTED'] || 'questions selected'}}\r\n &middot; <strong class=\"text-dark\">{{totalSelectedMarks}}</strong> {{labelConfig['COMMONS_ASSESSMENT.LABEL.MARKS'] || 'Marks'}}\r\n </span>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <button (click)=\"close()\" class=\"btn btn-outline-secondary px-4 py-2 footer-btn\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.CANCEL'] || 'Cancel'}}\r\n </button>\r\n <button (click)=\"importSelected()\"\r\n [disabled]=\"selectedCount === 0\"\r\n class=\"btn btn-primary px-4 py-2 footer-btn footer-btn-import\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.IMPORT_COUNT'] || 'Import'}}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".question-bank-picker{background-color:var(--assessment-bg-white, #ffffff);color:var(--assessment-text-grey-ten, #202124);font-family:var(--assessment-font-family, inherit)}.question-bank-picker .picker-header{background-color:var(--assessment-bg-white, #ffffff);border-color:var(--assessment-grey-four, #e8eaed)!important}.question-bank-picker .picker-header .btn-icon-back{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:50%;border:none;background-color:transparent;cursor:pointer;transition:background-color .15s ease}.question-bank-picker .picker-header .btn-icon-back:hover{background-color:var(--assessment-palette-EDF3FD, #EDF3FD)}.question-bank-picker .picker-header .btn-icon-back .action-icon{width:1.125rem;height:1.125rem}.question-bank-picker .picker-header .picker-title{font-size:1.25rem;font-weight:700;color:var(--assessment-text-grey-ten, #1e293b);line-height:1.25}.question-bank-picker .picker-header .picker-subtitle{font-size:.8125rem;margin-top:2px}.question-bank-picker .picker-search-deck{background-color:var(--assessment-bg-white, #ffffff);border-color:var(--assessment-grey-four, #e8eaed)!important}.question-bank-picker .picker-search-deck .search-input-wrapper{position:relative}.question-bank-picker .picker-search-deck .search-input-wrapper .search-input{height:2.6rem;padding-right:2rem;padding-left:.875rem;font-size:.875rem;border-radius:var(--assessment-border-radius-two, .375rem);border:1px solid var(--assessment-grey-four, #e2e8f0);background-color:var(--assessment-bg-white, #ffffff);color:var(--assessment-text-grey-ten, #202124)}.question-bank-picker .picker-search-deck .search-input-wrapper .search-input::placeholder{color:var(--assessment-text-grey-seven, #94a3b8)}.question-bank-picker .picker-search-deck .search-input-wrapper .search-input:focus{border-color:var(--assessment-primary-one, #467DD6);box-shadow:0 0 0 2px #467dd626}.question-bank-picker .picker-search-deck .search-input-wrapper .search-clear-btn{position:absolute;right:.75rem;top:50%;transform:translateY(-50%);border:none;background:transparent;color:var(--assessment-text-grey-seven, #94a3b8);font-size:.75rem;cursor:pointer;padding:2px 4px;border-radius:4px}.question-bank-picker .picker-search-deck .search-input-wrapper .search-clear-btn:hover{color:var(--assessment-text-grey-ten, #202124);background-color:var(--assessment-palette-EDF3FD, #EDF3FD)}.question-bank-picker .picker-search-deck .type-filter-wrapper{min-width:11rem;max-width:14rem}.question-bank-picker .picker-search-deck .type-filter-wrapper .filter-select{height:2.6rem;padding-right:2rem;font-size:.875rem;font-weight:500;border-radius:var(--assessment-border-radius-two, .375rem);border:1px solid var(--assessment-grey-four, #e2e8f0);background-color:var(--assessment-bg-white, #ffffff);color:var(--assessment-text-grey-ten, #334155);appearance:none;-webkit-appearance:none;-moz-appearance:none}.question-bank-picker .picker-search-deck .type-filter-wrapper .filter-select:focus{border-color:var(--assessment-primary-one, #467DD6);box-shadow:0 0 0 2px #467dd626}.question-bank-picker .picker-search-deck .type-filter-wrapper .select-arrow-icon{position:absolute;right:.75rem;top:50%;transform:translateY(-50%);width:.875rem;height:.875rem}.question-bank-picker .picker-search-deck .questions-heading{font-size:1.125rem;color:var(--assessment-text-grey-ten, #1e293b)}.question-bank-picker .picker-search-deck .select-all-label{font-size:.875rem;font-weight:600;color:var(--assessment-text-grey-nine, #334155);-webkit-user-select:none;user-select:none}.question-bank-picker .form-check-input{width:1.2rem;height:1.2rem;border-radius:4px;border:1.5px solid var(--assessment-grey-five, #cbd5e1);cursor:pointer}.question-bank-picker .form-check-input:checked{background-color:var(--assessment-primary-one, #467DD6);border-color:var(--assessment-primary-one, #467DD6)}.question-bank-picker .form-check-input:focus{box-shadow:0 0 0 2px #467dd633}.question-bank-picker .form-check-input:disabled{cursor:not-allowed;opacity:.5}.question-bank-picker .question-card{border:1px solid var(--assessment-grey-four, #e2e8f0);border-radius:var(--assessment-border-radius-two, .5rem);background-color:var(--assessment-bg-grey-one, #f8f9fa);padding:1rem 1.125rem;transition:border-color .15s ease,box-shadow .15s ease;cursor:pointer}.question-bank-picker .question-card:hover:not(.disabled-card){border-color:var(--assessment-palette-ADC9F6, #93c5fd);box-shadow:0 2px 6px #467dd60f}.question-bank-picker .question-card.selected-card{border-color:var(--assessment-primary-one, #467DD6);background-color:var(--assessment-bg-white, #ffffff)}.question-bank-picker .question-card.disabled-card{background-color:var(--assessment-bg-grey-one, #f8fafc);opacity:.75;cursor:not-allowed!important}.question-bank-picker .question-card .question-body-text{font-size:.9375rem;color:var(--assessment-text-grey-ten, #1e293b);line-height:1.45;word-break:break-word}.question-bank-picker .question-card .question-body-text ::ng-deep p,.question-bank-picker .question-card .question-body-text ::ng-deep div,.question-bank-picker .question-card .question-body-text p,.question-bank-picker .question-card .question-body-text div{margin:0!important;padding:0!important}.question-bank-picker .question-card .question-id-badge{font-size:.8125rem;font-weight:500;color:var(--assessment-text-grey-seven, #94a3b8)}.question-bank-picker .badge-pill{display:inline-flex;align-items:center;grid-gap:4px;gap:4px;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;line-height:1.2}.question-bank-picker .badge-type-pill{background-color:#fffbeb;color:#b45309;border:1px solid #fde68a}.question-bank-picker .badge-marks-pill{background-color:#eff6ff;color:#2563eb;border:1px solid #bfdbfe}.question-bank-picker .badge-mandatory-pill{background-color:#ecfdf5;color:#059669;border:1px solid #a7f3d0}.question-bank-picker .badge-added-pill{background-color:#f0fdf4;color:#16a34a;border:1px solid #bbf7d0;font-weight:600}.question-bank-picker .badge-added-pill .dot-indicator{width:6px;height:6px;border-radius:50%;background-color:#16a34a;display:inline-block}.question-bank-picker .options-accordion-section .options-toggle-row{-webkit-user-select:none;user-select:none}.question-bank-picker .options-accordion-section .options-toggle-row .options-count-text{font-size:.8125rem;font-weight:600;color:var(--assessment-primary-one, #467DD6)}.question-bank-picker .options-accordion-section .options-toggle-row .options-arrow-icon{width:.875rem;height:.875rem}.question-bank-picker .options-accordion-section .options-toggle-row .options-divider-line{height:1px;background-color:var(--assessment-grey-four, #e2e8f0)}.question-bank-picker .options-accordion-section .options-toggle-row .options-hint-text{font-size:.75rem;color:var(--assessment-text-grey-seven, #94a3b8)}.question-bank-picker .options-accordion-section .options-list-container .option-item-row{font-size:.875rem;color:var(--assessment-text-grey-nine, #334155)}.question-bank-picker .options-accordion-section .options-list-container .option-item-row .option-radio-circle{width:.875rem;height:.875rem;border-radius:50%;border:1.5px solid var(--assessment-text-grey-nine, #334155);flex-shrink:0}.question-bank-picker .options-accordion-section .options-list-container .option-item-row .option-text{font-size:.875rem;color:var(--assessment-text-grey-nine, #334155)}.question-bank-picker .skeleton-card{border:1px solid var(--assessment-grey-four, #e2e8f0);border-radius:var(--assessment-border-radius-two, .5rem);background:var(--assessment-bg-white, #ffffff);padding:1rem 1.125rem}.question-bank-picker .skeleton-card .skeleton-line{height:14px;border-radius:4px;margin-bottom:12px;background:linear-gradient(90deg,#f1f5f9 25%,#e2e8f0 50%,#f1f5f9 75%);background-size:200% 100%;animation:shimmer 1.5s infinite}.question-bank-picker .skeleton-card .skeleton-line.line-full{width:75%}.question-bank-picker .skeleton-card .skeleton-meta{height:18px;width:160px;border-radius:9999px;background:linear-gradient(90deg,#f1f5f9 25%,#e2e8f0 50%,#f1f5f9 75%);background-size:200% 100%;animation:shimmer 1.5s infinite}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.question-bank-picker .empty-state-box .empty-state-img{max-width:5.5rem}.question-bank-picker .empty-state-box .empty-state-title{color:var(--assessment-text-grey-ten, #1e293b)}.question-bank-picker .empty-state-box .empty-state-desc{max-width:22rem;margin:0 auto}.question-bank-picker .picker-footer{border-color:var(--assessment-grey-four, #e8eaed)!important}.question-bank-picker .picker-footer .footer-btn{font-size:.875rem;font-weight:600;border-radius:var(--assessment-border-radius-two, .375rem)}.question-bank-picker .picker-footer .footer-btn-import{background-color:var(--assessment-primary-one, #467DD6);border-color:var(--assessment-primary-one, #467DD6)}.question-bank-picker .picker-footer .footer-btn-import:hover:not(:disabled){background-color:var(--assessment-primary-four, #295eb7);border-color:var(--assessment-primary-four, #295eb7)}.question-bank-picker .pointer-events-none{pointer-events:none}.question-bank-picker .min-w-0{min-width:0}.question-bank-picker .text-12{font-size:.75rem}.question-bank-picker .text-13{font-size:.8125rem}.question-bank-picker .text-15{font-size:.9375rem}\n"], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
265
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: QuestionBankPickerComponent, decorators: [{
266
+ type: Component,
267
+ args: [{
268
+ selector: 'lib-question-bank-picker',
269
+ templateUrl: './question-bank-picker.component.html',
270
+ styleUrls: ['./question-bank-picker.component.scss']
271
+ }]
272
+ }], ctorParameters: function () { return [{ type: i1.AssessmentMakerService }, { type: i2.MatDialogRef }, { type: undefined, decorators: [{
273
+ type: Inject,
274
+ args: [MAT_DIALOG_DATA]
275
+ }] }]; } });
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb24tYmFuay1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9ucy1hc3Nlc3NtZW50L3NyYy9saWIvbW9kdWxlcy9hc3Nlc3NtZW50LW1ha2VyL2NvbXBvbmVudHMvcXVlc3Rpb24tYmFuay1waWNrZXIvcXVlc3Rpb24tYmFuay1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9ucy1hc3Nlc3NtZW50L3NyYy9saWIvbW9kdWxlcy9hc3Nlc3NtZW50LW1ha2VyL2NvbXBvbmVudHMvcXVlc3Rpb24tYmFuay1waWNrZXIvcXVlc3Rpb24tYmFuay1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFtQi9FLE1BQU0sT0FBTywyQkFBMkI7SUE2QnBDLFlBQ1ksc0JBQThDLEVBQy9DLFNBQW9ELEVBQzNCLFVBQXdDO1FBRmhFLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDL0MsY0FBUyxHQUFULFNBQVMsQ0FBMkM7UUFDM0IsZUFBVSxHQUFWLFVBQVUsQ0FBOEI7UUEvQjVFLGdCQUFXLEdBQThCLEVBQUUsQ0FBQztRQUM1QyxnQkFBVyxHQUE4QixFQUFFLENBQUM7UUFDNUMsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBQ25DLHdCQUFtQixHQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FB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LENBQUMsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUMxRCxDQUFDOzt5SEExUlEsMkJBQTJCLG9GQWdDeEIsZUFBZTs2R0FoQ2xCLDJCQUEyQixnRUN0QnhDLHM2ZUE4T0E7NEZEeE5hLDJCQUEyQjtrQkFMdkMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsMEJBQTBCO29CQUNwQyxXQUFXLEVBQUUsdUNBQXVDO29CQUNwRCxTQUFTLEVBQUUsQ0FBQyx1Q0FBdUMsQ0FBQztpQkFDdkQ7OzBCQWlDUSxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUXVlc3Rpb25CYW5rQ29uZmlnLCBRdWVzdGlvblR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlcy9hc3Nlc3NtZW50LmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEFzc2Vzc21lbnRRdWVzdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9pbnRlcmZhY2VzL3F1ZXN0aW9uLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEFzc2Vzc21lbnRNYWtlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hc3Nlc3NtZW50LW1ha2VyLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBRdWVzdGlvbkJhbmtQaWNrZXJEaWFsb2dEYXRhIHtcclxuICAgIHF1ZXN0aW9uQmFua0NvbmZpZzogUXVlc3Rpb25CYW5rQ29uZmlnO1xyXG4gICAgZXhpc3RpbmdRdWVzdGlvbklkczogU2V0PG51bWJlcj47XHJcbiAgICBsYWJlbENvbmZpZzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICAgIGltYWdlQ29uZmlnOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xyXG4gICAgcXVlc3Rpb25UeXBlczogUXVlc3Rpb25UeXBlW107XHJcbiAgICB0YXJnZXRTZWN0aW9uTmFtZT86IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1xdWVzdGlvbi1iYW5rLXBpY2tlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcXVlc3Rpb24tYmFuay1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vcXVlc3Rpb24tYmFuay1waWNrZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25CYW5rUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgbGFiZWxDb25maWc6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcclxuICAgIGltYWdlQ29uZmlnOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICBxdWVzdGlvblR5cGVzOiBRdWVzdGlvblR5cGVbXSA9IFtdO1xyXG4gICAgZXhpc3RpbmdRdWVzdGlvbklkczogU2V0PG51bWJlcj4gPSBuZXcgU2V0KCk7XHJcbiAgICB0YXJnZXRTZWN0aW9uTmFtZTogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgLy8gUGFnaW5hdGlvbiAmIEluZmluaXRlIFNjcm9sbFxyXG4gICAgYWxsUXVlc3Rpb25zOiBBc3Nlc3NtZW50UXVlc3Rpb25bXSA9IFtdO1xyXG4gICAgZmlsdGVyZWRRdWVzdGlvbnM6IEFzc2Vzc21lbnRRdWVzdGlvbltdID0gW107XHJcbiAgICBjdXJyZW50UGFnZSA9IDA7XHJcbiAgICBwYWdlU2l6ZSA9IDIwO1xyXG4gICAgdG90YWxFbGVtZW50cyA9IDA7XHJcbiAgICBoYXNOZXh0ID0gZmFsc2U7XHJcbiAgICBpc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgIGlzSW5pdGlhbExvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgIC8vIFNlcnZlci1zaWRlIHNlYXJjaCAmIGZpbHRlcnNcclxuICAgIHNlYXJjaFRlcm0gPSAnJztcclxuICAgIHNlbGVjdGVkVHlwZUNvZGUgPSAnJztcclxuXHJcbiAgICAvLyBNdWx0aS1zZWxlY3Rpb24gJiBFeHBhbmRlZCBPcHRpb25zXHJcbiAgICBzZWxlY3RlZFF1ZXN0aW9ucyA9IG5ldyBNYXA8bnVtYmVyLCBBc3Nlc3NtZW50UXVlc3Rpb24+KCk7XHJcbiAgICBleHBhbmRlZFF1ZXN0aW9uSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBxdWVzdGlvbkJhbmtDb25maWc6IFF1ZXN0aW9uQmFua0NvbmZpZyA9IHt9O1xyXG4gICAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYXNzZXNzbWVudE1ha2VyU2VydmljZTogQXNzZXNzbWVudE1ha2VyU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8UXVlc3Rpb25CYW5rUGlja2VyQ29tcG9uZW50PixcclxuICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRpYWxvZ0RhdGE6IFF1ZXN0aW9uQmFua1BpY2tlckRpYWxvZ0RhdGFcclxuICAgICkge31cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxhYmVsQ29uZmlnID0gdGhpcy5kaWFsb2dEYXRhPy5sYWJlbENvbmZpZyB8fCB7fTtcclxuICAgICAgICB0aGlzLmltYWdlQ29uZmlnID0gdGhpcy5kaWFsb2dEYXRhPy5pbWFnZUNvbmZpZyB8fCB7fTtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uVHlwZXMgPSB0aGlzLmRpYWxvZ0RhdGE/LnF1ZXN0aW9uVHlwZXMgfHwgW107XHJcbiAgICAgICAgdGhpcy5leGlzdGluZ1F1ZXN0aW9uSWRzID0gdGhpcy5kaWFsb2dEYXRhPy5leGlzdGluZ1F1ZXN0aW9uSWRzIHx8IG5ldyBTZXQoKTtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uQmFua0NvbmZpZyA9IHRoaXMuZGlhbG9nRGF0YT8ucXVlc3Rpb25CYW5rQ29uZmlnIHx8IHt9O1xyXG4gICAgICAgIHRoaXMudGFyZ2V0U2VjdGlvbk5hbWUgPSB0aGlzLmRpYWxvZ0RhdGE/LnRhcmdldFNlY3Rpb25OYW1lIHx8ICcnO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaFN1YmplY3QkLnBpcGUoXHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgzNTApLFxyXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICAgICApLnN1YnNjcmliZSh0ZXJtID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXJtID0gdGVybTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYWxsUXVlc3Rpb25zID0gW107XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFBhZ2UoMCwgZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmxvYWRQYWdlKDAsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZFBhZ2UocGFnZTogbnVtYmVyLCBhcHBlbmQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBwYXJhbXM6IGFueSA9IHsgcGFnZSwgc2l6ZTogdGhpcy5wYWdlU2l6ZSB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkJhbmtDb25maWc/LmRvbWFpbikge1xyXG4gICAgICAgICAgICBwYXJhbXMuZG9tYWluID0gdGhpcy5xdWVzdGlvbkJhbmtDb25maWcuZG9tYWluO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkJhbmtDb25maWc/LnRlbmFudCkge1xyXG4gICAgICAgICAgICBwYXJhbXMudGVuYW50ID0gdGhpcy5xdWVzdGlvbkJhbmtDb25maWcudGVuYW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUZXJtPy50cmltKCkpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnF1ZXN0aW9uVGV4dCA9IHRoaXMuc2VhcmNoVGVybS50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVHlwZUNvZGUpIHtcclxuICAgICAgICAgICAgcGFyYW1zLnF1ZXN0aW9uVHlwZSA9IHRoaXMuc2VsZWN0ZWRUeXBlQ29kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXNzZXNzbWVudE1ha2VyU2VydmljZS5nZXRRdWVzdGlvbkJhbmtRdWVzdGlvbnMocGFyYW1zKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzOiBBc3Nlc3NtZW50UXVlc3Rpb25bXSA9IHJlcz8uZWxlbWVudHMgfHwgcmVzPy5jb250ZW50IHx8IChBcnJheS5pc0FycmF5KHJlcykgPyByZXMgOiBbXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBwZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxRdWVzdGlvbnMgPSBbLi4udGhpcy5hbGxRdWVzdGlvbnMsIC4uLmVsZW1lbnRzXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxRdWVzdGlvbnMgPSBlbGVtZW50cztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudG90YWxFbGVtZW50cyA9IHJlcz8udG90YWxFbGVtZW50cyA/PyAoYXBwZW5kID8gdGhpcy5hbGxRdWVzdGlvbnMubGVuZ3RoIDogZWxlbWVudHMubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFzTmV4dCA9IHJlcz8uaGFzTmV4dCAhPT0gdW5kZWZpbmVkID8gISFyZXMuaGFzTmV4dCA6IChlbGVtZW50cy5sZW5ndGggPT09IHRoaXMucGFnZVNpemUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0luaXRpYWxMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkUXVlc3Rpb25zID0gdGhpcy5hbGxRdWVzdGlvbnM7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0luaXRpYWxMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkTW9yZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNOZXh0ICYmICF0aGlzLmlzTG9hZGluZykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRQYWdlKHRoaXMuY3VycmVudFBhZ2UgKyAxLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25TY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gMTYwO1xyXG4gICAgICAgIGNvbnN0IHJlYWNoZWRCb3R0b20gPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0IC0gdGFyZ2V0LnNjcm9sbFRvcCAtIHRhcmdldC5jbGllbnRIZWlnaHQgPD0gdGhyZXNob2xkO1xyXG5cclxuICAgICAgICBpZiAocmVhY2hlZEJvdHRvbSAmJiB0aGlzLmhhc05leHQgJiYgIXRoaXMuaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRRdWVzdGlvbnMgPSB0aGlzLmFsbFF1ZXN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBvblNlYXJjaENoYW5nZSh0ZXJtOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlYXJjaFN1YmplY3QkLm5leHQodGVybSB8fCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJTZWFyY2goKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDA7XHJcbiAgICAgICAgdGhpcy5hbGxRdWVzdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmxvYWRQYWdlKDAsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBvblR5cGVGaWx0ZXJDaGFuZ2UodHlwZUNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUeXBlQ29kZSA9IHR5cGVDb2RlIHx8ICcnO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAwO1xyXG4gICAgICAgIHRoaXMuYWxsUXVlc3Rpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5sb2FkUGFnZSgwLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0UXVpY2tUeXBlRmlsdGVyKHR5cGVDb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb2RlID0gdHlwZUNvZGUgfHwgJyc7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFR5cGVDb2RlID0gdGhpcy5zZWxlY3RlZFR5cGVDb2RlID09PSBjb2RlID8gJycgOiBjb2RlO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAwO1xyXG4gICAgICAgIHRoaXMuYWxsUXVlc3Rpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5sb2FkUGFnZSgwLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlU2VsZWN0aW9uKHF1ZXN0aW9uOiBBc3Nlc3NtZW50UXVlc3Rpb24pOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXF1ZXN0aW9uLmlkIHx8IHRoaXMuaXNBbHJlYWR5SW5Bc3Nlc3NtZW50KHF1ZXN0aW9uLmlkKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFF1ZXN0aW9ucy5oYXMocXVlc3Rpb24uaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRRdWVzdGlvbnMuZGVsZXRlKHF1ZXN0aW9uLmlkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUXVlc3Rpb25zLnNldChxdWVzdGlvbi5pZCwgcXVlc3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc1NlbGVjdGVkKHF1ZXN0aW9uOiBBc3Nlc3NtZW50UXVlc3Rpb24pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISFxdWVzdGlvbi5pZCAmJiB0aGlzLnNlbGVjdGVkUXVlc3Rpb25zLmhhcyhxdWVzdGlvbi5pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNBbHJlYWR5SW5Bc3Nlc3NtZW50KHF1ZXN0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhIXF1ZXN0aW9uSWQgJiYgdGhpcy5leGlzdGluZ1F1ZXN0aW9uSWRzLmhhcyhxdWVzdGlvbklkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCdWxrIHNlbGVjdGlvbiBtZXRob2RzXHJcbiAgICBnZXQgZWxpZ2libGVWaXNpYmxlUXVlc3Rpb25zKCk6IEFzc2Vzc21lbnRRdWVzdGlvbltdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZFF1ZXN0aW9ucy5maWx0ZXIocSA9PiBxLmlkICYmICF0aGlzLmlzQWxyZWFkeUluQXNzZXNzbWVudChxLmlkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzQWxsVmlzaWJsZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGVsaWdpYmxlID0gdGhpcy5lbGlnaWJsZVZpc2libGVRdWVzdGlvbnM7XHJcbiAgICAgICAgcmV0dXJuIGVsaWdpYmxlLmxlbmd0aCA+IDAgJiYgZWxpZ2libGUuZXZlcnkocSA9PiB0aGlzLnNlbGVjdGVkUXVlc3Rpb25zLmhhcyhxLmlkISkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc1NvbWVWaXNpYmxlU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSB0aGlzLmVsaWdpYmxlVmlzaWJsZVF1ZXN0aW9ucztcclxuICAgICAgICByZXR1cm4gZWxpZ2libGUuc29tZShxID0+IHRoaXMuc2VsZWN0ZWRRdWVzdGlvbnMuaGFzKHEuaWQhKSkgJiYgIXRoaXMuaXNBbGxWaXNpYmxlU2VsZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlU2VsZWN0QWxsVmlzaWJsZSgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9IHRoaXMuZWxpZ2libGVWaXNpYmxlUXVlc3Rpb25zO1xyXG4gICAgICAgIGlmICh0aGlzLmlzQWxsVmlzaWJsZVNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIGVsaWdpYmxlLmZvckVhY2gocSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocS5pZCkgdGhpcy5zZWxlY3RlZFF1ZXN0aW9ucy5kZWxldGUocS5pZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVsaWdpYmxlLmZvckVhY2gocSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocS5pZCkgdGhpcy5zZWxlY3RlZFF1ZXN0aW9ucy5zZXQocS5pZCwgcSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhckFsbFNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUXVlc3Rpb25zLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3B0aW9uIHByZXZpZXcgbWV0aG9kc1xyXG4gICAgaGFzT3B0aW9ucyhxdWVzdGlvbjogQXNzZXNzbWVudFF1ZXN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhKHF1ZXN0aW9uLmRlZmF1bHRPcHRpb25zTGlzdCAmJiBxdWVzdGlvbi5kZWZhdWx0T3B0aW9uc0xpc3QubGVuZ3RoID4gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlRXhwYW5kT3B0aW9ucyhxdWVzdGlvbklkOiBudW1iZXIgfCB1bmRlZmluZWQsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGlmICghcXVlc3Rpb25JZCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICh0aGlzLmV4cGFuZGVkUXVlc3Rpb25JZHMuaGFzKHF1ZXN0aW9uSWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kZWRRdWVzdGlvbklkcy5kZWxldGUocXVlc3Rpb25JZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5leHBhbmRlZFF1ZXN0aW9uSWRzLmFkZChxdWVzdGlvbklkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNPcHRpb25zRXhwYW5kZWQocXVlc3Rpb25JZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhcXVlc3Rpb25JZCAmJiB0aGlzLmV4cGFuZGVkUXVlc3Rpb25JZHMuaGFzKHF1ZXN0aW9uSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhbGN1bGF0ZWQgbWV0cmljc1xyXG4gICAgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFF1ZXN0aW9ucy5zaXplO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0b3RhbFNlbGVjdGVkTWFya3MoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRRdWVzdGlvbnMuZm9yRWFjaChxID0+IHtcclxuICAgICAgICAgICAgdG90YWwgKz0gKHEud2VpZ2h0IHx8IDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0b3RhbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUeXBlQ291bnQodHlwZUNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKCF0eXBlQ29kZSkgcmV0dXJuIHRoaXMuYWxsUXVlc3Rpb25zLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gdGhpcy5hbGxRdWVzdGlvbnMuZmlsdGVyKHEgPT4gcS5xdWVzdGlvblR5cGU/LmNvZGUgPT09IHR5cGVDb2RlKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2F0ZWdvcnlDbGFzcyhxdWVzdGlvbjogQXNzZXNzbWVudFF1ZXN0aW9uKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBjb2RlID0gcXVlc3Rpb24/LnF1ZXN0aW9uVHlwZT8uY29kZSB8fCAnJztcclxuICAgICAgICBpZiAoY29kZS5pbmNsdWRlcygnT0JKRUNUSVZFJykgfHwgY29kZS5pbmNsdWRlcygnQ0hPSUNFJykgfHwgY29kZS5pbmNsdWRlcygnTUNRJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdiYWRnZS1vYmplY3RpdmUnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29kZS5pbmNsdWRlcygnU1VCSkVDVElWRScpIHx8IGNvZGUuaW5jbHVkZXMoJ0VTU0FZJykgfHwgY29kZS5pbmNsdWRlcygnVEVYVCcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnYmFkZ2Utc3ViamVjdGl2ZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb2RlLmluY2x1ZGVzKCdEQVRFJykgfHwgY29kZS5pbmNsdWRlcygnVElNRScpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnYmFkZ2UtZGF0ZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnYmFkZ2UtZ2VuZXJpYyc7XHJcbiAgICB9XHJcblxyXG4gICAgaW1wb3J0U2VsZWN0ZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkUXVlc3Rpb25zLnZhbHVlcygpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGNhcGl0YWxpemVGaXJzdCh0ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xyXG4gICAgICAgIHJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCkuc3BsaXQoJyAnKS5tYXAod29yZCA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKSkuam9pbignICcpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFF1ZXN0aW9uVHlwZUxhYmVsKHF1ZXN0aW9uOiBBc3Nlc3NtZW50UXVlc3Rpb24pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhcGl0YWxpemVGaXJzdChcclxuICAgICAgICAgICAgcXVlc3Rpb24/LnF1ZXN0aW9uVHlwZT8ubGFiZWxzPy5bMF0/LnRleHQgfHwgcXVlc3Rpb24/LnF1ZXN0aW9uVHlwZT8uY29kZVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaW1hZ2VFcnJvckhhbmRsZXIoZXZlbnQ6IGFueSwgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZXZlbnQ/LnRhcmdldCkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWVycm9yLWhhbmRsZWQnKSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2ZW50LnRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZXJyb3ItaGFuZGxlZCcsICd0cnVlJyk7XHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnNyYyA9IGZpbGVQYXRoO1xyXG4gICAgfVxyXG5cclxuICAgIHRyYWNrQnlRdWVzdGlvbklkKGluZGV4OiBudW1iZXIsIHF1ZXN0aW9uOiBBc3Nlc3NtZW50UXVlc3Rpb24pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBxdWVzdGlvbj8uaWQgPyAncScgKyBxdWVzdGlvbi5pZCA6ICdpJyArIGluZGV4O1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gaC0xMDAgcXVlc3Rpb24tYmFuay1waWNrZXJcIj5cclxuICAgIDwhLS0gSGVhZGVyOiBCYWNrIEFycm93ICsgVGl0bGUgKyBTdWJ0aXRsZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHB4LTQgcHktMyBib3JkZXItYm90dG9tIHBpY2tlci1oZWFkZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbG9zZSgpXCIgY2xhc3M9XCJidG4taWNvbi1iYWNrXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLkdPX0JBQ0snXSB8fCAnR28gQmFjaydcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZUNvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULklDT04uR09fQkFDSyddXCJcclxuICAgICAgICAgICAgICAgICAgICAgKGVycm9yKT1cImltYWdlRXJyb3JIYW5kbGVyKCRldmVudCwgJ2Fzc2V0cy9jb21tb25zLWFzc2Vzc21lbnQvaW1hZ2VzL2dvLWJhY2suc3ZnJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1pY29uXCIgLz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtYi0wIGZ3LWJvbGQgcGlja2VyLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLklNUE9SVF9GUk9NX1FVRVNUSU9OX0JBTksnXSB8fCAnSW1wb3J0IGZyb20gUXVlc3Rpb24gQmFuayd9fVxyXG4gICAgICAgICAgICAgICAgPC9oND5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMCBwaWNrZXItc3VidGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLlNFTEVDVEVEX1NFQ1RJT04nXSB8fCAnU2VsZWN0ZWQgU2VjdGlvbid9fTo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXByaW1hcnkgZnctc2VtaWJvbGQgbXMtMVwiICpuZ0lmPVwidGFyZ2V0U2VjdGlvbk5hbWVcIj57e3RhcmdldFNlY3Rpb25OYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeSBtcy0xXCIgKm5nSWY9XCIhdGFyZ2V0U2VjdGlvbk5hbWVcIj57e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuSU1QT1JUX1FVRVNUSU9OU19JTlRPX05FV19TRUNUSU9OJ10gfHwgJ0ltcG9ydCBxdWVzdGlvbnMgaW50byBhIG5ldyBzZWN0aW9uJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU2VhcmNoICYgRmlsdGVyIENvbnRyb2xzIERlY2sgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGlja2VyLXNlYXJjaC1kZWNrIHB4LTQgcHQtMyBwYi0yIGJvcmRlci1ib3R0b21cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0zIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XHJcbiAgICAgICAgICAgIDwhLS0gU2VhcmNoIEJveCAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dC13cmFwcGVyIGZsZXgtZ3Jvdy0xIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuU0VBUkNIX1FVRVNUSU9OJ10gfHwgJ1NlYXJjaCBRdWVzdGlvbidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlYXJjaFRlcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzZWFyY2hUZXJtXCIgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIiBjbGFzcz1cInNlYXJjaC1jbGVhci1idG5cIiBhcmlhLWxhYmVsPVwiQ2xlYXIgU2VhcmNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4pyVXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFR5cGUgRmlsdGVyIERyb3Bkb3duIHVzaW5nIGFycm93LWRvd24tYmxhY2suc3ZnIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHlwZS1maWx0ZXItd3JhcHBlciBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZpbHRlci1zZWxlY3QgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFR5cGVDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25UeXBlRmlsdGVyQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLkFMTF9UWVBFUyddIHx8ICdBbGwgVHlwZXMnfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB0eXBlIG9mIHF1ZXN0aW9uVHlwZXNcIiBbdmFsdWVdPVwidHlwZS5jb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7dHlwZS5sYWJlbCB8fCB0eXBlLmNvZGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5JQ09OLkFSUk9XX0RPV05fQkxBQ0snXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJpbWFnZUVycm9ySGFuZGxlcigkZXZlbnQsICdhc3NldHMvY29tbW9ucy1hc3Nlc3NtZW50L2ltYWdlcy9hcnJvdy1kb3duLWJsYWNrLnN2ZycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QtYXJyb3ctaWNvbiBwb2ludGVyLWV2ZW50cy1ub25lXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2VjdGlvbiBIZWFkZXI6IFF1ZXN0aW9uIENvdW50ICYgU2VsZWN0IEFsbCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBwdC0yIHBiLTFcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMCBmdy1ib2xkIHF1ZXN0aW9ucy1oZWFkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICB7e3RvdGFsRWxlbWVudHMgfHwgZmlsdGVyZWRRdWVzdGlvbnMubGVuZ3RofX0ge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLlFVRVNUSU9OUyddIHx8ICdRdWVzdGlvbnMnfX1cclxuICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IHNlbGVjdC1hbGwtY2hlY2tib3ggY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RBbGxRdWVzdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsVmlzaWJsZVNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJpc1NvbWVWaXNpYmxlU2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJlbGlnaWJsZVZpc2libGVRdWVzdGlvbnMubGVuZ3RoID09PSAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbFZpc2libGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBzZWxlY3QtYWxsLWxhYmVsIGN1cnNvci1wb2ludGVyXCIgZm9yPVwic2VsZWN0QWxsUXVlc3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLlNFTEVDVF9BTExfUVVFU1RJT05TJ10gfHwgJ1NlbGVjdCBBbGwgUXVlc3Rpb25zJ319XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gUXVlc3Rpb25zIFZpZXdwb3J0IEJveCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSBvdmVyZmxvdy1hdXRvIHAtM1wiIChzY3JvbGwpPVwib25TY3JvbGwoJGV2ZW50KVwiPlxyXG4gICAgICAgIDwhLS0gU2tlbGV0b24gTG9hZGluZyBTdGF0ZSAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNJbml0aWFsTG9hZGluZ1wiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0zIHB5LTFcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaSBvZiBbMSwgMiwgMywgNCwgNV1cIiBjbGFzcz1cInNrZWxldG9uLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi1saW5lIGxpbmUtZnVsbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLW1ldGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUXVlc3Rpb24gQ2FyZHMgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0luaXRpYWxMb2FkaW5nICYmIGZpbHRlcmVkUXVlc3Rpb25zLmxlbmd0aCA+IDBcIiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtM1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBxdWVzdGlvbiBvZiBmaWx0ZXJlZFF1ZXN0aW9uczsgdHJhY2tCeTogdHJhY2tCeVF1ZXN0aW9uSWRcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwicXVlc3Rpb24tY2FyZFwiXHJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNhcmRdPVwiaXNBbHJlYWR5SW5Bc3Nlc3NtZW50KHF1ZXN0aW9uLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkLWNhcmRdPVwiaXNTZWxlY3RlZChxdWVzdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb24ocXVlc3Rpb24pXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBNYWluIENhcmQgSGVhZGVyOiBDaGVja2JveCArIFF1ZXN0aW9uIFRleHQgKyAjSUQgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTEgZmxleC1zaHJpbmstMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGNhcmQtY2hlY2tib3ggY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQocXVlc3Rpb24pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0FscmVhZHlJbkFzc2Vzc21lbnQocXVlc3Rpb24uaWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3Rpb24ocXVlc3Rpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSBtaW4tdy0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTMgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1ZXN0aW9uLWJvZHktdGV4dCBmdy1tZWRpdW0gdGV4dC1icmVha1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwicXVlc3Rpb24/LnF1ZXN0aW9uVGV4dD8uWzBdPy50ZXh0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1ZXN0aW9uLWlkLWJhZGdlIGZsZXgtc2hyaW5rLTBcIiAqbmdJZj1cInF1ZXN0aW9uPy5pZFwiPiN7e3F1ZXN0aW9uLmlkfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCYWRnZXMgUm93OiBUeXBlIFBpbGwsIE1hcmtzIFBpbGwsIE1hbmRhdG9yeSBQaWxsLCBhbmQgQWRkZWQgUGlsbCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gZmxleC13cmFwIGdhcC0yIG10LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUXVlc3Rpb24gVHlwZSBQaWxsIChPcmFuZ2UvQW1iZXIpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UtcGlsbCBiYWRnZS10eXBlLXBpbGwgcC0yIHJvdW5kZWRcIiAqbmdJZj1cInF1ZXN0aW9uPy5xdWVzdGlvblR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRRdWVzdGlvblR5cGVMYWJlbChxdWVzdGlvbil9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNYXJrcyBQaWxsIChCbHVlL0luZGlnbykgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZS1waWxsIGJhZGdlLW1hcmtzLXBpbGwgcC0yIHJvdW5kZWRcIiAqbmdJZj1cInF1ZXN0aW9uPy53ZWlnaHQgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbj8ud2VpZ2h0ICE9PSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5NQVJLUyddIHx8ICdNYXJrcyd9fSB7e3F1ZXN0aW9uLndlaWdodH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1hbmRhdG9yeSBQaWxsIChHcmVlbikgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZS1waWxsIGJhZGdlLW1hbmRhdG9yeS1waWxsIHAtMiByb3VuZGVkXCIgKm5nSWY9XCJxdWVzdGlvbj8uaXNNYW5kYXRvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLk1BTkRBVE9SWSddIHx8ICdNYW5kYXRvcnknfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJpZ2h0LWFsaWduZWQgQWxyZWFkeSBBZGRlZCBQaWxsIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0FscmVhZHlJbkFzc2Vzc21lbnQocXVlc3Rpb24uaWQpXCIgY2xhc3M9XCJiYWRnZS1waWxsIGJhZGdlLWFkZGVkLXBpbGwgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3QtaW5kaWNhdG9yXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5BRERFRCddIHx8ICdBZGRlZCd9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3B0aW9ucyBBY2NvcmRpb24gKGlmIHF1ZXN0aW9uIGhhcyBkZWZhdWx0T3B0aW9uc0xpc3QpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzT3B0aW9ucyhxdWVzdGlvbilcIiBjbGFzcz1cIm9wdGlvbnMtYWNjb3JkaW9uLXNlY3Rpb24gbXQtMyBwdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRvZ2dsZSBCdXR0b24gUm93IHdpdGggQXJyb3cgJiBEaXZpZGVyIExpbmUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBjdXJzb3ItcG9pbnRlciBvcHRpb25zLXRvZ2dsZS1yb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5kT3B0aW9ucyhxdWVzdGlvbi5pZCwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ucy1jb3VudC10ZXh0IHRleHQtcHJpbWFyeSBmdy1zZW1pYm9sZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3F1ZXN0aW9uLmRlZmF1bHRPcHRpb25zTGlzdD8ubGVuZ3RoIHx8IDB9fSB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuT1BUSU9OUyddIHx8ICdPcHRpb25zJ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpc09wdGlvbnNFeHBhbmRlZChxdWVzdGlvbi5pZCkgPyAoaW1hZ2VDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5JQ09OLkFSUk9XX1VQX0JMVUUnXSB8fCAnYXNzZXRzL2NvbW1vbnMtYXNzZXNzbWVudC9pbWFnZXMvYXJyb3ctdXAtYmx1ZS5zdmcnKSA6IChpbWFnZUNvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULklDT04uQVJST1dfRE9XTl9CTFVFJ10gfHwgJ2Fzc2V0cy9jb21tb25zLWFzc2Vzc21lbnQvaW1hZ2VzL2Fycm93LWRvd24tYmx1ZS5zdmcnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaW1hZ2VFcnJvckhhbmRsZXIoJGV2ZW50LCBpc09wdGlvbnNFeHBhbmRlZChxdWVzdGlvbi5pZCkgPyAnYXNzZXRzL2NvbW1vbnMtYXNzZXNzbWVudC9pbWFnZXMvYXJyb3ctdXAtYmx1ZS5zdmcnIDogJ2Fzc2V0cy9jb21tb25zLWFzc2Vzc21lbnQvaW1hZ2VzL2Fycm93LWRvd24tYmx1ZS5zdmcnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm9wdGlvbnMtYXJyb3ctaWNvblwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnMtZGl2aWRlci1saW5lIGZsZXgtZ3Jvdy0xXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeSB0ZXh0LTEyIG9wdGlvbnMtaGludC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKAoiB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuQ0xJQ0tfVE9fVklFVyddIHx8ICdDbGljayB0byB2aWV3J319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFeHBhbmRlZCBPcHRpb25zIExpc3QgKFJhZGlvIG9wdGlvbnMpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzT3B0aW9uc0V4cGFuZGVkKHF1ZXN0aW9uLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwib3B0aW9ucy1saXN0LWNvbnRhaW5lciBkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTIgbXQtMyBwcy0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdCBvZiBxdWVzdGlvbi5kZWZhdWx0T3B0aW9uc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG9wdGlvbi1pdGVtLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbi1yYWRpby1jaXJjbGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9uLXRleHQgdGV4dC1icmVha1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHQub3B0aW9ucz8ub3B0aW9uTmFtZT8uWzBdPy50ZXh0IHx8IG9wdC5vcHRpb25zPy5vcHRpb25Db2RlIHx8ICdPcHRpb24nfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBFbXB0eSBTdGF0ZTogTm8gbWF0Y2hpbmcgZmlsdGVyIHJlc3VsdHMgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0luaXRpYWxMb2FkaW5nICYmIGZpbHRlcmVkUXVlc3Rpb25zLmxlbmd0aCA9PT0gMCAmJiBhbGxRdWVzdGlvbnMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cImVtcHR5LXN0YXRlLWJveCBweS01IHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZW1wdHktc3RhdGUtdGl0bGUgZnctc2VtaWJvbGQgdGV4dC0xNSBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuTk9fTUFUQ0hJTkdfUVVFU1RJT05TJ10gfHwgJ05vIG1hdGNoaW5nIHF1ZXN0aW9ucyBmb3VuZCd9fVxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZW1wdHktc3RhdGUtZGVzYyB0ZXh0LXNlY29uZGFyeSB0ZXh0LTEzIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5OT19NQVRDSElOR19RVUVTVElPTlNfREVTQyddIHx8ICdUcnkgYWRqdXN0aW5nIHlvdXIgc2VhcmNoIHRlcm1zIG9yIGNsZWFyaW5nIHNlbGVjdGVkIHF1ZXN0aW9uIHR5cGUgZmlsdGVycy4nfX1cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbGVhclNlYXJjaCgpOyBzZWxlY3RlZFR5cGVDb2RlID0gJyc7IGFwcGx5RmlsdGVycygpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tc20gcHgtM1wiPlxyXG4gICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLkNMRUFSX0ZJTFRFUlMnXSB8fCAnQ2xlYXIgRmlsdGVycyd9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBFbXB0eSBTdGF0ZTogUXVlc3Rpb24gYmFuayBpcyBlbXB0eSAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzSW5pdGlhbExvYWRpbmcgJiYgYWxsUXVlc3Rpb25zLmxlbmd0aCA9PT0gMFwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cImVtcHR5LXN0YXRlLWJveCBweS01IHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZUNvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULklDT04uTk9fUVVFU1RJT05TJ11cIiBjbGFzcz1cImVtcHR5LXN0YXRlLWltZyBtYi0zXCJcclxuICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaW1hZ2VFcnJvckhhbmRsZXIoJGV2ZW50LCAnYXNzZXRzL2NvbW1vbnMtYXNzZXNzbWVudC9pbWFnZXMvbm8tcXVlc3Rpb25zLnN2ZycpXCIgLz5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJlbXB0eS1zdGF0ZS10aXRsZSBmdy1zZW1pYm9sZCB0ZXh0LTE1IG1iLTFcIj5cclxuICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5OT19RVUVTVElPTlNfSU5fQkFOSyddIHx8ICdObyBRdWVzdGlvbnMgaW4gQmFuayEnfX1cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cImVtcHR5LXN0YXRlLWRlc2MgdGV4dC1zZWNvbmRhcnkgdGV4dC0xMyBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuTk9fUVVFU1RJT05TX0lOX0JBTktfREVTQyddIHx8ICdDcmVhdGUgc3RhbmRhbG9uZSBxdWVzdGlvbnMgaW4gdGhlIFF1ZXN0aW9uIEJhbmsgdG8gcmV1c2UgdGhlbSBoZXJlLid9fVxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gSW5maW5pdGUgU2Nyb2xsIEJvdHRvbSBMb2FkZXIgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZyAmJiAhaXNJbml0aWFsTG9hZGluZ1wiIGNsYXNzPVwicHktMyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtIHRleHQtcHJpbWFyeVwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zZWNvbmRhcnkgdGV4dC0xM1wiPlxyXG4gICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLkxPQURJTkdfTU9SRV9RVUVTVElPTlMnXSB8fCAnTG9hZGluZyBtb3JlIHF1ZXN0aW9ucy4uLid9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gRW5kIG9mIGxpc3QgcmVhY2hlZCAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWhhc05leHQgJiYgYWxsUXVlc3Rpb25zLmxlbmd0aCA+IDAgJiYgIWlzTG9hZGluZ1wiIGNsYXNzPVwidGV4dC1jZW50ZXIgcHktMyB0ZXh0LXNlY29uZGFyeSB0ZXh0LTEyXCI+XHJcbiAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5BTExfUVVFU1RJT05TX0xPQURFRCddIHx8ICdBbGwgcXVlc3Rpb25zIGxvYWRlZCd9fSAoe3t0b3RhbEVsZW1lbnRzfX0pXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFN0aWNreSBGb290ZXIgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHgtNCBweS0zIGJvcmRlci10b3AgcGlja2VyLWZvb3RlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGJnLXdoaXRlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1zdW1tYXJ5XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zZWNvbmRhcnkgdGV4dC0xM1wiICpuZ0lmPVwic2VsZWN0ZWRDb3VudCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLk5PX1FVRVNUSU9OU19TRUxFQ1RFRCddIHx8ICdObyBxdWVzdGlvbnMgc2VsZWN0ZWQnfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc2Vjb25kYXJ5IHRleHQtMTNcIiAqbmdJZj1cInNlbGVjdGVkQ291bnQgPiAwXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPVwidGV4dC1wcmltYXJ5XCI+e3tzZWxlY3RlZENvdW50fX08L3N0cm9uZz4ge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLlFVRVNUSU9OU19TRUxFQ1RFRCddIHx8ICdxdWVzdGlvbnMgc2VsZWN0ZWQnfX1cclxuICAgICAgICAgICAgICAgICZtaWRkb3Q7IDxzdHJvbmcgY2xhc3M9XCJ0ZXh0LWRhcmtcIj57e3RvdGFsU2VsZWN0ZWRNYXJrc319PC9zdHJvbmc+IHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5NQVJLUyddIHx8ICdNYXJrcyd9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xvc2UoKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBweC00IHB5LTIgZm9vdGVyLWJ0blwiPlxyXG4gICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLkNBTkNFTCddIHx8ICdDYW5jZWwnfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImltcG9ydFNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZENvdW50ID09PSAwXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBweC00IHB5LTIgZm9vdGVyLWJ0biBmb290ZXItYnRuLWltcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLklNUE9SVF9DT1VOVCddIHx8ICdJbXBvcnQnfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==