@rangertechnologies/ngnxt 2.1.76 → 2.1.78

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 (114) hide show
  1. package/README.md +29 -29
  2. package/esm2022/lib/ar.i18n.mjs +29 -29
  3. package/esm2022/lib/components/custom-button/custom-button.component.mjs +39 -39
  4. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +366 -366
  5. package/esm2022/lib/components/custom-date/custom-date.component.mjs +47 -47
  6. package/esm2022/lib/components/custom-date-picker/custom-date-picker.component.mjs +48 -48
  7. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +219 -212
  8. package/esm2022/lib/components/custom-image/custom-image.component.mjs +34 -34
  9. package/esm2022/lib/components/custom-input/custom-input.component.mjs +93 -93
  10. package/esm2022/lib/components/custom-label/custom-label.component.mjs +21 -21
  11. package/esm2022/lib/components/custom-model/custom-model.component.mjs +48 -48
  12. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +115 -115
  13. package/esm2022/lib/components/custom-table/custom-table.component.mjs +169 -169
  14. package/esm2022/lib/components/custom-text-area/custom-text-area.component.mjs +65 -65
  15. package/esm2022/lib/components/custom-time/custom-time.component.mjs +61 -61
  16. package/esm2022/lib/components/dependent-table/dependent-table.component.mjs +42 -42
  17. package/esm2022/lib/components/dropdown-with-flag/dropdown-with-flag.component.mjs +39 -39
  18. package/esm2022/lib/components/file-upload/file-upload.component.mjs +233 -233
  19. package/esm2022/lib/components/file-view/file-view.component.mjs +46 -46
  20. package/esm2022/lib/components/loader/loader.component.mjs +23 -23
  21. package/esm2022/lib/components/pick-location/pick-location.component.mjs +188 -188
  22. package/esm2022/lib/components/search-box/search-box.component.mjs +130 -130
  23. package/esm2022/lib/components/table-appendix/table-appendix.component.mjs +123 -123
  24. package/esm2022/lib/directives/componenthost/componenthost.directive.mjs +19 -19
  25. package/esm2022/lib/en.i18n.mjs +29 -29
  26. package/esm2022/lib/i18n-config.service.mjs +4 -4
  27. package/esm2022/lib/i18n.component.mjs +47 -47
  28. package/esm2022/lib/i18n.module.mjs +38 -38
  29. package/esm2022/lib/i18n.pipe.mjs +25 -25
  30. package/esm2022/lib/i18n.service.mjs +56 -56
  31. package/esm2022/lib/interfaces/actionMeta.mjs +2 -2
  32. package/esm2022/lib/interfaces/apimeta.mjs +2 -2
  33. package/esm2022/lib/interfaces/dependencyMeta.mjs +2 -2
  34. package/esm2022/lib/model/bookletWrapper.mjs +9 -9
  35. package/esm2022/lib/model/changeWrapper.mjs +11 -11
  36. package/esm2022/lib/model/errorWrapper.mjs +6 -6
  37. package/esm2022/lib/model/tableWrapper.mjs +20 -20
  38. package/esm2022/lib/nxt-app.component.mjs +22 -22
  39. package/esm2022/lib/nxt-app.module.mjs +352 -352
  40. package/esm2022/lib/nxt-app.service.mjs +14 -14
  41. package/esm2022/lib/pages/booklet/booklet.component.mjs +541 -541
  42. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +407 -407
  43. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +2373 -2373
  44. package/esm2022/lib/pages/summary-page/summary-page.component.mjs +76 -76
  45. package/esm2022/lib/pipe/get-value.pipe.mjs +50 -50
  46. package/esm2022/lib/sample.mjs +3430 -3430
  47. package/esm2022/lib/services/change.service.mjs +53 -53
  48. package/esm2022/lib/services/data.service.mjs +80 -80
  49. package/esm2022/lib/services/salesforce.service.mjs +46 -46
  50. package/esm2022/lib/services/shared.service.mjs +100 -100
  51. package/esm2022/lib/services/storage.service.mjs +44 -44
  52. package/esm2022/lib/tam.i18n.mjs +29 -29
  53. package/esm2022/lib/wrapper.mjs +175 -175
  54. package/esm2022/public-api.mjs +15 -15
  55. package/esm2022/rangertechnologies-ngnxt.mjs +4 -4
  56. package/fesm2022/rangertechnologies-ngnxt.mjs +9812 -9805
  57. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  58. package/index.d.ts +5 -5
  59. package/lib/ar.i18n.d.ts +24 -24
  60. package/lib/components/custom-button/custom-button.component.d.ts +16 -16
  61. package/lib/components/custom-calendar/custom-calendar.component.d.ts +65 -65
  62. package/lib/components/custom-date/custom-date.component.d.ts +18 -18
  63. package/lib/components/custom-date-picker/custom-date-picker.component.d.ts +19 -19
  64. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +39 -39
  65. package/lib/components/custom-image/custom-image.component.d.ts +13 -13
  66. package/lib/components/custom-input/custom-input.component.d.ts +31 -31
  67. package/lib/components/custom-label/custom-label.component.d.ts +10 -10
  68. package/lib/components/custom-model/custom-model.component.d.ts +19 -19
  69. package/lib/components/custom-radio/custom-radio.component.d.ts +33 -33
  70. package/lib/components/custom-table/custom-table.component.d.ts +43 -43
  71. package/lib/components/custom-text-area/custom-text-area.component.d.ts +22 -22
  72. package/lib/components/custom-time/custom-time.component.d.ts +18 -18
  73. package/lib/components/dependent-table/dependent-table.component.d.ts +15 -15
  74. package/lib/components/dropdown-with-flag/dropdown-with-flag.component.d.ts +16 -16
  75. package/lib/components/file-upload/file-upload.component.d.ts +42 -42
  76. package/lib/components/file-view/file-view.component.d.ts +16 -16
  77. package/lib/components/loader/loader.component.d.ts +11 -11
  78. package/lib/components/pick-location/pick-location.component.d.ts +42 -42
  79. package/lib/components/search-box/search-box.component.d.ts +40 -40
  80. package/lib/components/table-appendix/table-appendix.component.d.ts +30 -30
  81. package/lib/directives/componenthost/componenthost.directive.d.ts +8 -8
  82. package/lib/en.i18n.d.ts +24 -24
  83. package/lib/i18n-config.service.d.ts +2 -2
  84. package/lib/i18n.component.d.ts +11 -11
  85. package/lib/i18n.module.d.ts +9 -9
  86. package/lib/i18n.pipe.d.ts +10 -10
  87. package/lib/i18n.service.d.ts +14 -14
  88. package/lib/interfaces/actionMeta.d.ts +5 -5
  89. package/lib/interfaces/apimeta.d.ts +14 -13
  90. package/lib/interfaces/dependencyMeta.d.ts +8 -8
  91. package/lib/model/bookletWrapper.d.ts +5 -5
  92. package/lib/model/changeWrapper.d.ts +10 -10
  93. package/lib/model/errorWrapper.d.ts +5 -5
  94. package/lib/model/tableWrapper.d.ts +18 -18
  95. package/lib/nxt-app.component.d.ts +8 -8
  96. package/lib/nxt-app.module.d.ts +46 -46
  97. package/lib/nxt-app.service.d.ts +6 -6
  98. package/lib/pages/booklet/booklet.component.d.ts +68 -68
  99. package/lib/pages/questionbook/questionbook.component.d.ts +66 -66
  100. package/lib/pages/questionnaire/questionnaire.component.d.ts +218 -218
  101. package/lib/pages/summary-page/summary-page.component.d.ts +20 -20
  102. package/lib/pipe/get-value.pipe.d.ts +7 -7
  103. package/lib/sample.d.ts +10 -10
  104. package/lib/services/change.service.d.ts +22 -22
  105. package/lib/services/data.service.d.ts +13 -13
  106. package/lib/services/salesforce.service.d.ts +11 -11
  107. package/lib/services/shared.service.d.ts +15 -15
  108. package/lib/services/storage.service.d.ts +13 -13
  109. package/lib/tam.i18n.d.ts +24 -24
  110. package/lib/wrapper.d.ts +203 -203
  111. package/package.json +1 -1
  112. package/public-api.d.ts +10 -10
  113. package/rangertechnologies-ngnxt-2.1.78.tgz +0 -0
  114. package/rangertechnologies-ngnxt-2.1.76.tgz +0 -0
@@ -1,212 +1,219 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { ChangeWrapper } from '../../model/changeWrapper';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../../services/change.service";
5
- import * as i2 from "../../services/data.service";
6
- import * as i3 from "../../i18n.service";
7
- import * as i4 from "@angular/common";
8
- import * as i5 from "@angular/forms";
9
- import * as i6 from "@ng-select/ng-select";
10
- export class CustomDropdownComponent {
11
- changeService;
12
- dataService;
13
- i18nService;
14
- options;
15
- placeholder;
16
- apiMeta;
17
- selectedValue;
18
- progressBar;
19
- id;
20
- readOnly = false; // VD 12Jun24 - readonly change
21
- errorMessage;
22
- error;
23
- fromShengel = false;
24
- question;
25
- referenceField;
26
- token; // VD 19JAN24 - getting token as input
27
- valueChange = new EventEmitter();
28
- invalidFieldIds = [];
29
- constructor(changeService, dataService, i18nService) {
30
- this.changeService = changeService;
31
- this.dataService = dataService;
32
- this.i18nService = i18nService;
33
- this.changeService.submitValidate$.subscribe((data) => {
34
- // to get the error message's field id's
35
- this.invalidFieldIds.push(data);
36
- });
37
- }
38
- labelField;
39
- valueField;
40
- subscription;
41
- apiObj;
42
- uniqueKey;
43
- ngOnInit() {
44
- }
45
- getOptions() {
46
- console.log('test click');
47
- // console.log('inside oninit of custom-dropdown of ' + this.id);
48
- // console.log(this.apiMeta);
49
- //VD 07Aug24 - isDependentField change
50
- // VD 25Oct24 - changes
51
- this.placeholder = this.placeholder ? this.placeholder : '---Select option---';
52
- if (this.apiMeta) {
53
- try {
54
- this.apiObj = JSON.parse(this.apiMeta);
55
- // Check if apiObj and apiObj.field are defined
56
- if (this.apiObj && this.apiObj.field) {
57
- this.labelField = this.apiObj.field;
58
- this.uniqueKey = this.apiObj.uniqueKey;
59
- const cachedOptions = localStorage.getItem(this.uniqueKey);
60
- if (cachedOptions) {
61
- this.options = JSON.parse(cachedOptions);
62
- }
63
- else {
64
- if (!this.apiObj.isDependentField) {
65
- this.options = [];
66
- // VD 09Sep24- setup the query param for api call
67
- let fullEndPoint;
68
- if (this.apiObj.endpoint) {
69
- if (this.apiObj.queryValueReference && this.apiObj.queryField) {
70
- // process the end point with query param
71
- let queryReferences = this.apiObj.queryValueReference.split(',');
72
- let queryParams = [];
73
- // Iterate over queryReferences and find the corresponding element in referenceData
74
- queryReferences.forEach(reference => {
75
- // Find the element in referenceData that matches the current reference
76
- // RS 09DEC24 Changed keys
77
- let matchingElement = this.question?.referenceQueryData.find(element => element.referenceField === reference);
78
- // If a matching element is found, get its input value and create a query parameter
79
- if (matchingElement) {
80
- queryParams.push(`${reference}=${matchingElement.input}`);
81
- }
82
- });
83
- fullEndPoint = this.apiObj.endpoint + '?' + queryParams.join('&');
84
- console.log(fullEndPoint);
85
- }
86
- else {
87
- // if no query param get the actual endPoint
88
- fullEndPoint = this.apiObj.endpoint;
89
- }
90
- // VD 19JAN24 - added one more param for authentication
91
- this.dataService.apiResponse(fullEndPoint)?.subscribe((apiResponse) => {
92
- // HA 18-JAN-24 Assigned apiresponse directly if we have the response in array also
93
- // VD 19JAN24 - if response has key with value(which is array)
94
- let responses;
95
- if (this.apiObj.variable) {
96
- // VD 21May24 - handling multiple child objects
97
- // VD 22May24 - used common service file
98
- responses = this.dataService.getValue(apiResponse, this.apiObj.variable);
99
- let results = [];
100
- // HA 19JAN24 To avoid undefined error in console
101
- for (let i = 0; i < responses?.length; i++) {
102
- var resp = responses[i];
103
- results.push(resp);
104
- }
105
- this.options = results;
106
- }
107
- else { // VD 19JAN24 - if response has value(which is array) only
108
- responses = apiResponse;
109
- this.options = responses;
110
- }
111
- // VD 25Oct24 - Store fetched options in local storage
112
- if (this.uniqueKey) {
113
- localStorage.setItem(this.uniqueKey, JSON.stringify(this.options));
114
- }
115
- // Reference https://www.npmjs.com/package/@ng-select/ng-select
116
- });
117
- }
118
- }
119
- // VD NOV23 - handle the dependent update for dropdown
120
- // // VD 09Sep24- push the dependent field values for dropdown
121
- let sourceId = this.apiObj.sourceQuestionId;
122
- if (sourceId && this.apiObj.variable || this.apiObj.valueField) {
123
- // Subscribe for the changes
124
- this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => {
125
- if (changeValue != undefined) {
126
- // console.log('inside subscription for the change');
127
- if (changeValue.valueObj != undefined && changeValue.fromQuestionId == this.apiObj.sourceQuestionId) {
128
- // this.selectedValue = changeValue.valueObj[this.apiObj.valueField];
129
- // let value ={};
130
- // value['name'] = this.selectedValue;
131
- let responses;
132
- if (this.apiObj.variable) {
133
- responses = this.dataService.getValue(changeValue.valueObj, this.apiObj.variable);
134
- let results = [];
135
- for (let i = 0; i < responses?.length; i++) {
136
- var resp = responses[i];
137
- results.push(resp);
138
- }
139
- this.options = results;
140
- }
141
- else {
142
- responses = changeValue.valueObj;
143
- this.options = responses;
144
- }
145
- // VD 25Oct24 - Store fetched options in local storage
146
- if (this.uniqueKey) {
147
- localStorage.setItem(this.uniqueKey, JSON.stringify(this.options));
148
- }
149
- }
150
- this.changeService.confirmChange(this.apiObj.sourceQuestionId);
151
- }
152
- });
153
- }
154
- }
155
- }
156
- }
157
- catch (error) {
158
- console.error('Error parsing apiMeta:', error);
159
- }
160
- }
161
- }
162
- // VD 22May24 - used common service file
163
- selectChange(event) {
164
- console.log('inside selectChange from ' + this.id);
165
- // console.log(event);
166
- let change = new ChangeWrapper(); // ChangeWrapper = JSON.parse('{}');
167
- change.fromQuestionId = this.id;
168
- change.valueObj = event ? event : '';
169
- change.referenceField = this.referenceField;
170
- change.selectedObj = event ? event[this.labelField] : '';
171
- this.valueChange.emit(change);
172
- // once got value in dropdown remove the error validation
173
- if (event) {
174
- this.invalidFieldIds = [];
175
- }
176
- }
177
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CustomDropdownComponent, deps: [{ token: i1.ChangeService }, { token: i2.DataService }, { token: i3.I18nService }], target: i0.ɵɵFactoryTarget.Component });
178
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CustomDropdownComponent, selector: "app-custom-dropdown", inputs: { options: "options", placeholder: "placeholder", apiMeta: "apiMeta", selectedValue: "selectedValue", progressBar: "progressBar", id: "id", readOnly: "readOnly", errorMessage: "errorMessage", error: "error", fromShengel: "fromShengel", question: "question", referenceField: "referenceField", token: "token" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\n<!-- <select\n [ngClass]=\"{\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\n 'custom-select': !progressBar\n }\" class=\"custom-select mr-sm-2 dd-height\" \n [id]=\"id\" \n [(ngModel)]=\"selectedValue\"\n (change)=\"selectChange($event.target.value);\" \n [style.borderColor]=\"error ? 'red' : '#858585'\"\n [style.color]=\"error ? 'red' : ''\">\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.value\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.value }}</option>\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\n</select> -->\n<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- VD 07Aug24 - isDependentField change-->\n<!-- VD 25Oct24 - changes-->\n<!-- RS 09DEC24 Changed keys--> \n<ng-select\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\n [(ngModel)]=\"selectedValue\" \n [placeholder]=\"placeholder\"\n [disabled]=\"readOnly\"\n (click)=\"getOptions()\"\n (change)=\"selectChange($event)\"\n [id]=\"id\">\n <ng-option \n *ngFor=\"let option of options\" \n [value]=\"apiObj && !apiObj.isDependentField ? option : option?.value\">\n {{ apiObj && !apiObj.isDependentField && option ? option[labelField] : option?.value }}\n </ng-option> \n</ng-select>\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.NgSelectComponent, selector: "ng-select", inputs: ["markFirst", "dropdownPosition", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "bufferAmount", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "bindLabel", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "virtualScroll", "openOnEnter", "appendTo", "bindValue", "appearance", "maxSelectedItems", "groupBy", "groupValue", "tabIndex", "typeahead"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "component", type: i6.ɵr, selector: "ng-option", inputs: ["disabled", "value"] }] });
179
- }
180
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CustomDropdownComponent, decorators: [{
181
- type: Component,
182
- args: [{ selector: 'app-custom-dropdown', template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\n<!-- <select\n [ngClass]=\"{\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\n 'custom-select': !progressBar\n }\" class=\"custom-select mr-sm-2 dd-height\" \n [id]=\"id\" \n [(ngModel)]=\"selectedValue\"\n (change)=\"selectChange($event.target.value);\" \n [style.borderColor]=\"error ? 'red' : '#858585'\"\n [style.color]=\"error ? 'red' : ''\">\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.value\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.value }}</option>\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\n</select> -->\n<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- VD 07Aug24 - isDependentField change-->\n<!-- VD 25Oct24 - changes-->\n<!-- RS 09DEC24 Changed keys--> \n<ng-select\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\n [(ngModel)]=\"selectedValue\" \n [placeholder]=\"placeholder\"\n [disabled]=\"readOnly\"\n (click)=\"getOptions()\"\n (change)=\"selectChange($event)\"\n [id]=\"id\">\n <ng-option \n *ngFor=\"let option of options\" \n [value]=\"apiObj && !apiObj.isDependentField ? option : option?.value\">\n {{ apiObj && !apiObj.isDependentField && option ? option[labelField] : option?.value }}\n </ng-option> \n</ng-select>\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"] }]
183
- }], ctorParameters: function () { return [{ type: i1.ChangeService }, { type: i2.DataService }, { type: i3.I18nService }]; }, propDecorators: { options: [{
184
- type: Input
185
- }], placeholder: [{
186
- type: Input
187
- }], apiMeta: [{
188
- type: Input
189
- }], selectedValue: [{
190
- type: Input
191
- }], progressBar: [{
192
- type: Input
193
- }], id: [{
194
- type: Input
195
- }], readOnly: [{
196
- type: Input
197
- }], errorMessage: [{
198
- type: Input
199
- }], error: [{
200
- type: Input
201
- }], fromShengel: [{
202
- type: Input
203
- }], question: [{
204
- type: Input
205
- }], referenceField: [{
206
- type: Input
207
- }], token: [{
208
- type: Input
209
- }], valueChange: [{
210
- type: Output
211
- }] } });
212
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2N1c3RvbS1kcm9wZG93bi9jdXN0b20tZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLWRyb3Bkb3duL2N1c3RvbS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFTLEtBQUssRUFBQyxNQUFNLEVBQUMsWUFBWSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBR3RGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7QUFZMUQsTUFBTSxPQUFPLHVCQUF1QjtJQWlCeEI7SUFDQTtJQUNEO0lBbEJBLE9BQU8sQ0FBVztJQUNsQixXQUFXLENBQVM7SUFDcEIsT0FBTyxDQUFTO0lBQ2hCLGFBQWEsQ0FBUztJQUN0QixXQUFXLENBQVU7SUFDckIsRUFBRSxDQUFRO0lBQ1YsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLCtCQUErQjtJQUNqRCxZQUFZLENBQVM7SUFDckIsS0FBSyxDQUFLO0lBQ1YsV0FBVyxHQUFZLEtBQUssQ0FBQztJQUM3QixRQUFRLENBQUs7SUFDYixjQUFjLENBQVE7SUFDdEIsS0FBSyxDQUFRLENBQUksc0NBQXNDO0lBQ3RELFdBQVcsR0FBZ0MsSUFBSSxZQUFZLEVBQWlCLENBQUM7SUFDdkYsZUFBZSxHQUFZLEVBQUUsQ0FBQztJQUM5QixZQUNVLGFBQTRCLEVBQzVCLFdBQXdCLEVBQ3pCLFdBQXdCO1FBRnZCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3pCLGdCQUFXLEdBQVgsV0FBVyxDQUFh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QyxDQUFDO1FBQzlCLHlEQUF5RDtRQUN6RCxJQUFHLEtBQUssRUFBQztZQUNQLElBQUksQ0FBQyxlQUFlLEdBQUUsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzt1R0FyS1UsdUJBQXVCOzJGQUF2Qix1QkFBdUIsa2FDZnBDLDRsREFrQ0E7OzJGRG5CYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UscUJBQXFCO3dKQUt0QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsSW5wdXQsT3V0cHV0LEV2ZW50RW1pdHRlciwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQVBJTWV0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYXBpbWV0YSc7XG5pbXBvcnQgeyBDaGFuZ2VXcmFwcGVyIH0gZnJvbSAnLi4vLi4vbW9kZWwvY2hhbmdlV3JhcHBlcic7XG5pbXBvcnQgeyBDaGFuZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2hhbmdlLnNlcnZpY2UnO1xuLy8gSEEgMTlERUMyMyBpbXBvcnRlZCB0cmFuc2xhdGlvbiBzZXJ2aWNlXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uL2kxOG4uc2VydmljZSc7XG4vLyBWRCAyM0pBTjI0IHVzZWQgc2VydmljZSBmaWxlIGZvciBjYWxsb3V0XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jdXN0b20tZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vY3VzdG9tLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3VzdG9tLWRyb3Bkb3duLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21Ecm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlNZXRhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmFsdWU6IHN0cmluZztcbiAgQElucHV0KCkgcHJvZ3Jlc3NCYXI6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlkOnN0cmluZztcbiAgQElucHV0KCkgcmVhZE9ubHkgPSBmYWxzZTsgLy8gVkQgMTJKdW4yNCAtIHJlYWRvbmx5IGNoYW5nZVxuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgQElucHV0KCkgZXJyb3I6YW55O1xuICBASW5wdXQoKSBmcm9tU2hlbmdlbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBxdWVzdGlvbjphbnk7XG4gIEBJbnB1dCgpIHJlZmVyZW5jZUZpZWxkOnN0cmluZztcbiAgQElucHV0KCkgdG9rZW46c3RyaW5nOyAgICAvLyBWRCAxOUpBTjI0IC0gZ2V0dGluZyB0b2tlbiBhcyBpbnB1dFxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxDaGFuZ2VXcmFwcGVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhbmdlV3JhcHBlcj4oKTtcbiAgaW52YWxpZEZpZWxkSWRzOnN0cmluZ1tdID0gW107XG4gIGNvbnN0cnVjdG9yKCBcbiAgICBwcml2YXRlIGNoYW5nZVNlcnZpY2U6IENoYW5nZVNlcnZpY2UsIFxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxuICAgIHB1YmxpYyBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgICkgeyBcbiAgICB0aGlzLmNoYW5nZVNlcnZpY2Uuc3VibWl0VmFsaWRhdGUkLnN1YnNjcmliZSgoZGF0YSk9PntcbiAgICAgIC8vIHRvIGdldCB0aGUgZXJyb3IgbWVzc2FnZSdzIGZpZWxkIGlkJ3NcbiAgICAgIHRoaXMuaW52YWxpZEZpZWxkSWRzLnB1c2goZGF0YSk7XG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBsYWJlbEZpZWxkOiBzdHJpbmc7XG4gIHB1YmxpYyB2YWx1ZUZpZWxkOiBzdHJpbmc7XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwdWJsaWMgYXBpT2JqOkFQSU1ldGE7XG4gIHB1YmxpYyB1bmlxdWVLZXk6c3RyaW5nO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIFxuICB9XG4gIGdldE9wdGlvbnMoKXtcbiAgICBjb25zb2xlLmxvZygndGVzdCBjbGljaycpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGUgb25pbml0IG9mIGN1c3RvbS1kcm9wZG93biBvZiAnICsgdGhpcy5pZCk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5hcGlNZXRhKTtcbiAgICAvL1ZEIDA3QXVnMjQgLSBpc0RlcGVuZGVudEZpZWxkIGNoYW5nZVxuICAgIC8vIFZEIDI1T2N0MjQgLSBjaGFuZ2VzXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXIgPyB0aGlzLnBsYWNlaG9sZGVyIDogJy0tLVNlbGVjdCBvcHRpb24tLS0nO1xuICAgIGlmKHRoaXMuYXBpTWV0YSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmFwaU9iaiA9IEpTT04ucGFyc2UodGhpcy5hcGlNZXRhKTtcbiAgICAgIC8vIENoZWNrIGlmIGFwaU9iaiBhbmQgYXBpT2JqLmZpZWxkIGFyZSBkZWZpbmVkXG4gICAgICBpZiAodGhpcy5hcGlPYmogJiYgdGhpcy5hcGlPYmouZmllbGQpIHtcbiAgICAgICAgdGhpcy5sYWJlbEZpZWxkID0gdGhpcy5hcGlPYmouZmllbGQ7XG4gICAgICAgIHRoaXMudW5pcXVlS2V5ID0gdGhpcy5hcGlPYmoudW5pcXVlS2V5O1xuICAgICAgICBjb25zdCBjYWNoZWRPcHRpb25zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy51bmlxdWVLZXkpO1xuICAgICAgICBpZiAoY2FjaGVkT3B0aW9ucykge1xuICAgICAgICAgIHRoaXMub3B0aW9ucyA9IEpTT04ucGFyc2UoY2FjaGVkT3B0aW9ucyk7XG4gICAgICAgIH1lbHNlIHtcbiAgICAgICAgICBpZighdGhpcy5hcGlPYmouaXNEZXBlbmRlbnRGaWVsZCl7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIC8vIFZEIDA5U2VwMjQtIHNldHVwIHRoZSBxdWVyeSBwYXJhbSBmb3IgYXBpIGNhbGxcbiAgICAgICAgICAgIGxldCBmdWxsRW5kUG9pbnQgO1xuICAgICAgICAgICAgaWYodGhpcy5hcGlPYmouZW5kcG9pbnQpe1xuICAgICAgICAgICAgICBpZih0aGlzLmFwaU9iai5xdWVyeVZhbHVlUmVmZXJlbmNlICYmIHRoaXMuYXBpT2JqLnF1ZXJ5RmllbGQpe1xuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIGVuZCBwb2ludCB3aXRoIHF1ZXJ5IHBhcmFtXG4gICAgICAgICAgICAgICAgbGV0IHF1ZXJ5UmVmZXJlbmNlcyA9IHRoaXMuYXBpT2JqLnF1ZXJ5VmFsdWVSZWZlcmVuY2Uuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICBsZXQgcXVlcnlQYXJhbXMgPSBbXTtcbiAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgcXVlcnlSZWZlcmVuY2VzIGFuZCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gcmVmZXJlbmNlRGF0YVxuICAgICAgICAgICAgICAgIHF1ZXJ5UmVmZXJlbmNlcy5mb3JFYWNoKHJlZmVyZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBlbGVtZW50IGluIHJlZmVyZW5jZURhdGEgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAvLyBSUyAwOURFQzI0IENoYW5nZWQga2V5c1xuICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoaW5nRWxlbWVudCA9IHRoaXMucXVlc3Rpb24/LnJlZmVyZW5jZVF1ZXJ5RGF0YS5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5yZWZlcmVuY2VGaWVsZCA9PT0gcmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgIC8vIElmIGEgbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZCwgZ2V0IGl0cyBpbnB1dCB2YWx1ZSBhbmQgY3JlYXRlIGEgcXVlcnkgcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goYCR7cmVmZXJlbmNlfT0ke21hdGNoaW5nRWxlbWVudC5pbnB1dH1gKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmdWxsRW5kUG9pbnQgPSB0aGlzLmFwaU9iai5lbmRwb2ludCArICc/JyArIHF1ZXJ5UGFyYW1zLmpvaW4oJyYnKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmdWxsRW5kUG9pbnQpO1xuICAgICAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICAgICAgIC8vIGlmIG5vIHF1ZXJ5IHBhcmFtIGdldCB0aGUgYWN0dWFsIGVuZFBvaW50XG4gICAgICAgICAgICAgICAgZnVsbEVuZFBvaW50ID0gdGhpcy5hcGlPYmouZW5kcG9pbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gVkQgMTlKQU4yNCAtIGFkZGVkIG9uZSBtb3JlIHBhcmFtIGZvciBhdXRoZW50aWNhdGlvblxuICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLmFwaVJlc3BvbnNlKGZ1bGxFbmRQb2ludCk/LnN1YnNjcmliZSgoYXBpUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBIQSAxOC1KQU4tMjQgQXNzaWduZWQgYXBpcmVzcG9uc2UgZGlyZWN0bHkgaWYgd2UgaGF2ZSB0aGUgcmVzcG9uc2UgaW4gYXJyYXkgYWxzb1xuICAgICAgICAgICAgICAgIC8vIFZEIDE5SkFOMjQgLSBpZiByZXNwb25zZSBoYXMga2V5IHdpdGggdmFsdWUod2hpY2ggaXMgYXJyYXkpXG4gICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlcztcbiAgICAgICAgICAgICAgICBpZih0aGlzLmFwaU9iai52YXJpYWJsZSl7XG4gICAgICAgICAgICAgICAgICAvLyBWRCAyMU1heTI0IC0gaGFuZGxpbmcgbXVsdGlwbGUgY2hpbGQgb2JqZWN0c1xuICAgICAgICAgICAgICAgICAgLy8gVkQgMjJNYXkyNCAtIHVzZWQgY29tbW9uIHNlcnZpY2UgZmlsZVxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gdGhpcy5kYXRhU2VydmljZS5nZXRWYWx1ZShhcGlSZXNwb25zZSx0aGlzLmFwaU9iai52YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgLy8gSEEgMTlKQU4yNCBUbyBhdm9pZCB1bmRlZmluZWQgZXJyb3IgaW4gY29uc29sZVxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZXM/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXNwID0gcmVzcG9uc2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzcCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSByZXN1bHRzO1xuICAgICAgICAgICAgICAgIH1lbHNleyAgLy8gVkQgMTlKQU4yNCAtIGlmIHJlc3BvbnNlIGhhcyB2YWx1ZSh3aGljaCBpcyBhcnJheSkgb25seVxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gYXBpUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSByZXNwb25zZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFZEIDI1T2N0MjQgLSBTdG9yZSBmZXRjaGVkIG9wdGlvbnMgaW4gbG9jYWwgc3RvcmFnZVxuICAgICAgICAgICAgICAgIGlmKHRoaXMudW5pcXVlS2V5KXtcbiAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMudW5pcXVlS2V5LCBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUmVmZXJlbmNlIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BuZy1zZWxlY3Qvbmctc2VsZWN0XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVkQgTk9WMjMgLSBoYW5kbGUgdGhlIGRlcGVuZGVudCB1cGRhdGUgZm9yIGRyb3Bkb3duXG4gICAgICAgICAgICAvLyAvLyBWRCAwOVNlcDI0LSBwdXNoIHRoZSBkZXBlbmRlbnQgZmllbGQgdmFsdWVzIGZvciBkcm9wZG93blxuICAgICAgICAgICAgbGV0IHNvdXJjZUlkID0gdGhpcy5hcGlPYmouc291cmNlUXVlc3Rpb25JZDtcbiAgICAgICAgICAgIGlmKHNvdXJjZUlkICYmIHRoaXMuYXBpT2JqLnZhcmlhYmxlIHx8IHRoaXMuYXBpT2JqLnZhbHVlRmllbGQpe1xuICAgICAgICAgICAgICAvLyBTdWJzY3JpYmUgZm9yIHRoZSBjaGFuZ2VzXG4gICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jaGFuZ2VTZXJ2aWNlLmNoYW5nZUFubm91bmNlZCQuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIChjaGFuZ2VWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYoY2hhbmdlVmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGUgc3Vic2NyaXB0aW9uIGZvciB0aGUgY2hhbmdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGNoYW5nZVZhbHVlLnZhbHVlT2JqICE9IHVuZGVmaW5lZCAmJiBjaGFuZ2VWYWx1ZS5mcm9tUXVlc3Rpb25JZCA9PSB0aGlzLmFwaU9iai5zb3VyY2VRdWVzdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IGNoYW5nZVZhbHVlLnZhbHVlT2JqW3RoaXMuYXBpT2JqLnZhbHVlRmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgIC8vICBsZXQgdmFsdWUgPXt9O1xuICAgICAgICAgICAgICAgICAgICAgIC8vICB2YWx1ZVsnbmFtZSddID0gdGhpcy5zZWxlY3RlZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VzO1xuICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmFwaU9iai52YXJpYWJsZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gdGhpcy5kYXRhU2VydmljZS5nZXRWYWx1ZShjaGFuZ2VWYWx1ZS52YWx1ZU9iaix0aGlzLmFwaU9iai52YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlcz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNwID0gcmVzcG9uc2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZXMgPSBjaGFuZ2VWYWx1ZS52YWx1ZU9iajtcbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSByZXNwb25zZXM7XG4gICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBWRCAyNU9jdDI0IC0gU3RvcmUgZmV0Y2hlZCBvcHRpb25zIGluIGxvY2FsIHN0b3JhZ2VcbiAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnVuaXF1ZUtleSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnVuaXF1ZUtleSwgSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZXJ2aWNlLmNvbmZpcm1DaGFuZ2UodGhpcy5hcGlPYmouc291cmNlUXVlc3Rpb25JZCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgYXBpTWV0YTonLCBlcnJvcik7XG4gICAgfVxuICB9IFxufVxuLy8gVkQgMjJNYXkyNCAtIHVzZWQgY29tbW9uIHNlcnZpY2UgZmlsZVxuXG4gIHNlbGVjdENoYW5nZShldmVudDphbnkpIHtcbiAgICBjb25zb2xlLmxvZygnaW5zaWRlIHNlbGVjdENoYW5nZSBmcm9tICcgKyB0aGlzLmlkKTtcbiAgICAvLyBjb25zb2xlLmxvZyhldmVudCk7XG4gICAgbGV0IGNoYW5nZSA9IG5ldyBDaGFuZ2VXcmFwcGVyKCk7IC8vIENoYW5nZVdyYXBwZXIgPSBKU09OLnBhcnNlKCd7fScpO1xuICAgIGNoYW5nZS5mcm9tUXVlc3Rpb25JZCA9IHRoaXMuaWQ7XG4gICAgY2hhbmdlLnZhbHVlT2JqID0gZXZlbnQgPyBldmVudCA6ICcnO1xuICAgIGNoYW5nZS5yZWZlcmVuY2VGaWVsZCA9IHRoaXMucmVmZXJlbmNlRmllbGQ7XG4gICAgY2hhbmdlLnNlbGVjdGVkT2JqID0gZXZlbnQgPyBldmVudFt0aGlzLmxhYmVsRmllbGRdIDogJyc7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGNoYW5nZSk7XG4gICAgLy8gb25jZSBnb3QgdmFsdWUgaW4gZHJvcGRvd24gcmVtb3ZlIHRoZSBlcnJvciB2YWxpZGF0aW9uXG4gICAgaWYoZXZlbnQpe1xuICAgICAgdGhpcy5pbnZhbGlkRmllbGRJZHMgPVtdO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLSBIQSAxOC1KQU4tMjQgQ29tbWVudGluZyB0aGVzZSBsaW5lcyBhcyB3ZSBkb24ndCBoYXZlIHRvIHVzZSBzaGVuZ2VsIGhlcmUgLS0+XG48IS0tIDxzZWxlY3RcbiAgW25nQ2xhc3NdPVwie1xuICAgICdkdC1saW5lIGRwRG93biBkb3duIG15dC1kcm9wYm94IG15dC1ib3JkZXItciBteXQtZm9udDEnOiBwcm9ncmVzc0JhcixcbiAgICAnY3VzdG9tLXNlbGVjdCc6ICFwcm9ncmVzc0JhclxuICB9XCIgY2xhc3M9XCJjdXN0b20tc2VsZWN0IG1yLXNtLTIgZGQtaGVpZ2h0XCIgXG4gIFtpZF09XCJpZFwiIFxuICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkVmFsdWVcIlxuICAoY2hhbmdlKT1cInNlbGVjdENoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKTtcIiBcbiAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImVycm9yID8gJ3JlZCcgOiAnIzg1ODU4NSdcIlxuICBbc3R5bGUuY29sb3JdPVwiZXJyb3IgPyAncmVkJyA6ICcnXCI+XG4gICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIiBbdmFsdWVdPVwidGhpcy5hcGlNZXRhICE9PSB1bmRlZmluZWQgPyBvcHRpb24udGl0bGUgOiBvcHRpb24udmFsdWVcIiBjbGFzcz1cIm9wdGlvblwiPnt7IHRoaXMuYXBpTWV0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9uLnRpdGxlIDogb3B0aW9uLnZhbHVlIH19PC9vcHRpb24+XG4gICAgPG9wdGlvbiAqbmdJZj1cImVycm9yTWVzc2FnZVwiIHZhbHVlPVwiXCIgZGlzYWJsZWQgaGlkZGVuPnt7IGVycm9yTWVzc2FnZSB9fTwvb3B0aW9uPlxuPC9zZWxlY3Q+IC0tPlxuPCEtLSAvLyBWRCAxMkp1bjI0IC0gcmVhZG9ubHkgY2hhbmdlLS0+XG48IS0tIFZEIDAxQXVnMjQgLSB2YWxpZGF0aW9uIGNoYW5nZS0tPlxuPCEtLSBWRCAwN0F1ZzI0IC0gaXNEZXBlbmRlbnRGaWVsZCBjaGFuZ2UtLT5cbjwhLS0gVkQgMjVPY3QyNCAtIGNoYW5nZXMtLT5cbjwhLS0gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXMtLT4gXG48bmctc2VsZWN0XG4gIFtjbGFzc109XCJpbnZhbGlkRmllbGRJZHMuaW5jbHVkZXMoaWQpIHx8IGVycm9yID8gJ3NoZW5nZWwtY3VzdG9tLXNlbGVjdCBpbnZhbGlkJyA6ICdzaGVuZ2VsLWN1c3RvbS1zZWxlY3QnXCJcbiAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFZhbHVlXCIgXG4gIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gIFtkaXNhYmxlZF09XCJyZWFkT25seVwiXG4gIChjbGljayk9XCJnZXRPcHRpb25zKClcIlxuICAoY2hhbmdlKT1cInNlbGVjdENoYW5nZSgkZXZlbnQpXCJcbiAgW2lkXT1cImlkXCI+XG4gIDxuZy1vcHRpb24gXG4gICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCIgXG4gICAgW3ZhbHVlXT1cImFwaU9iaiAmJiAhYXBpT2JqLmlzRGVwZW5kZW50RmllbGQgPyBvcHRpb24gOiBvcHRpb24/LnZhbHVlXCI+XG4gICAge3sgYXBpT2JqICYmICFhcGlPYmouaXNEZXBlbmRlbnRGaWVsZCAmJiBvcHRpb24gPyBvcHRpb25bbGFiZWxGaWVsZF0gOiBvcHRpb24/LnZhbHVlIH19XG4gIDwvbmctb3B0aW9uPiBcbjwvbmctc2VsZWN0PlxuPHNwYW4gKm5nSWY9XCJlcnJvciB8fCBpbnZhbGlkRmllbGRJZHMuaW5jbHVkZXMoaWQpXCIgY2xhc3M9XCJlcnJvci1tc2dcIj57e2Vycm9yTWVzc2FnZX19PC9zcGFuPlxuIl19
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { ChangeWrapper } from '../../model/changeWrapper';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../services/change.service";
5
+ import * as i2 from "../../services/data.service";
6
+ import * as i3 from "../../i18n.service";
7
+ import * as i4 from "@angular/common";
8
+ import * as i5 from "@angular/forms";
9
+ import * as i6 from "@ng-select/ng-select";
10
+ export class CustomDropdownComponent {
11
+ changeService;
12
+ dataService;
13
+ i18nService;
14
+ options;
15
+ placeholder;
16
+ apiMeta;
17
+ selectedValue;
18
+ progressBar;
19
+ id;
20
+ readOnly = false; // VD 12Jun24 - readonly change
21
+ errorMessage;
22
+ error;
23
+ fromShengel = false;
24
+ question;
25
+ referenceField;
26
+ token; // VD 19JAN24 - getting token as input
27
+ valueChange = new EventEmitter();
28
+ invalidFieldIds = [];
29
+ constructor(changeService, dataService, i18nService) {
30
+ this.changeService = changeService;
31
+ this.dataService = dataService;
32
+ this.i18nService = i18nService;
33
+ this.changeService.submitValidate$.subscribe((data) => {
34
+ // to get the error message's field id's
35
+ this.invalidFieldIds.push(data);
36
+ });
37
+ }
38
+ labelField;
39
+ valueField;
40
+ subscription;
41
+ apiObj;
42
+ uniqueKey;
43
+ ngOnInit() {
44
+ }
45
+ getOptions() {
46
+ console.log('test click');
47
+ // console.log('inside oninit of custom-dropdown of ' + this.id);
48
+ // console.log(this.apiMeta);
49
+ //VD 07Aug24 - isDependentField change
50
+ // VD 25Oct24 - changes
51
+ this.placeholder = this.placeholder ? this.placeholder : '---Select option---';
52
+ if (this.apiMeta) {
53
+ try {
54
+ this.apiObj = JSON.parse(this.apiMeta);
55
+ // Check if apiObj and apiObj.field are defined
56
+ if (this.apiObj && this.apiObj.field) {
57
+ this.labelField = this.apiObj.field;
58
+ this.uniqueKey = this.apiObj.uniqueKey;
59
+ const cachedOptions = localStorage.getItem(this.uniqueKey);
60
+ if (cachedOptions) {
61
+ this.options = JSON.parse(cachedOptions);
62
+ }
63
+ else {
64
+ if (!this.apiObj.isDependentField) {
65
+ this.options = [];
66
+ }
67
+ // VD 09Sep24- setup the query param for api call // MR 08JAN24 DependentField API Fix moved below logic from above if condition
68
+ let fullEndPoint;
69
+ if (this.apiObj.endpoint) {
70
+ if (this.apiObj.queryValueReference && this.apiObj.queryField) {
71
+ // process the end point with query param
72
+ let queryReferences = this.apiObj.queryValueReference.split(',');
73
+ let queryFields = this.apiObj.queryField.split(','); // MR 08JAN24 similar to above valuereference get list of QUERY Fields
74
+ let queryValues = this.apiObj.queryValue.split(','); // MR 08JAN24 similar to above valuereference get list of QUERY Values (Default)
75
+ let queryParams = [];
76
+ let qIndex = 0; // MR 08JAN24 Query Index
77
+ // Iterate over queryReferences and find the corresponding element in referenceData
78
+ queryReferences.forEach(reference => {
79
+ // Find the element in referenceData that matches the current reference
80
+ // RS 09DEC24 Changed keys
81
+ let matchingElement = this.question?.referenceQueryData.find(element => element.referenceField === reference);
82
+ // If a matching element is found, get its input value and create a query parameter
83
+ if (reference && matchingElement) { // MR 08JAN24 if reference exist & matching element found
84
+ queryParams.push(`${queryFields[qIndex]}=${matchingElement.input}`); // MR 08JAN24 removed reference
85
+ }
86
+ else { // MR 08JAN24 included option for multiple query params and default value in case of reference is not found
87
+ queryParams.push(`${queryFields[qIndex]}=${queryValues[qIndex]}`);
88
+ }
89
+ qIndex++;
90
+ });
91
+ fullEndPoint = this.apiObj.endpoint + '?' + queryParams.join('&');
92
+ console.log(fullEndPoint);
93
+ }
94
+ else {
95
+ // if no query param get the actual endPoint
96
+ fullEndPoint = this.apiObj.endpoint;
97
+ }
98
+ // VD 19JAN24 - added one more param for authentication
99
+ this.dataService.apiResponse(fullEndPoint)?.subscribe((apiResponse) => {
100
+ // HA 18-JAN-24 Assigned apiresponse directly if we have the response in array also
101
+ // VD 19JAN24 - if response has key with value(which is array)
102
+ let responses;
103
+ if (this.apiObj.variable) {
104
+ // VD 21May24 - handling multiple child objects
105
+ // VD 22May24 - used common service file
106
+ responses = this.dataService.getValue(apiResponse, this.apiObj.variable);
107
+ let results = [];
108
+ // HA 19JAN24 To avoid undefined error in console
109
+ for (let i = 0; i < responses?.length; i++) {
110
+ var resp = responses[i];
111
+ results.push(resp);
112
+ }
113
+ this.options = results;
114
+ }
115
+ else { // VD 19JAN24 - if response has value(which is array) only
116
+ responses = apiResponse;
117
+ this.options = responses;
118
+ }
119
+ // VD 25Oct24 - Store fetched options in local storage
120
+ if (this.uniqueKey) {
121
+ localStorage.setItem(this.uniqueKey, JSON.stringify(this.options));
122
+ }
123
+ // Reference https://www.npmjs.com/package/@ng-select/ng-select
124
+ });
125
+ }
126
+ // VD NOV23 - handle the dependent update for dropdown
127
+ // VD 09Sep24- push the dependent field values for dropdown
128
+ let sourceId = this.apiObj.sourceQuestionId;
129
+ if (sourceId && this.apiObj.variable || this.apiObj.valueField) {
130
+ // Subscribe for the changes
131
+ this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => {
132
+ if (changeValue != undefined) {
133
+ // console.log('inside subscription for the change');
134
+ if (changeValue.valueObj != undefined && changeValue.fromQuestionId == this.apiObj.sourceQuestionId) {
135
+ // this.selectedValue = changeValue.valueObj[this.apiObj.valueField];
136
+ // let value ={};
137
+ // value['name'] = this.selectedValue;
138
+ let responses;
139
+ if (this.apiObj.variable) {
140
+ responses = this.dataService.getValue(changeValue.valueObj, this.apiObj.variable);
141
+ let results = [];
142
+ for (let i = 0; i < responses?.length; i++) {
143
+ var resp = responses[i];
144
+ results.push(resp);
145
+ }
146
+ this.options = results;
147
+ }
148
+ else {
149
+ responses = changeValue.valueObj;
150
+ this.options = responses;
151
+ }
152
+ // VD 25Oct24 - Store fetched options in local storage
153
+ if (this.uniqueKey) {
154
+ localStorage.setItem(this.uniqueKey, JSON.stringify(this.options));
155
+ }
156
+ }
157
+ this.changeService.confirmChange(this.apiObj.sourceQuestionId);
158
+ }
159
+ });
160
+ }
161
+ }
162
+ }
163
+ }
164
+ catch (error) {
165
+ console.error('Error parsing apiMeta:', error);
166
+ }
167
+ }
168
+ }
169
+ // VD 22May24 - used common service file
170
+ selectChange(event) {
171
+ console.log('inside selectChange from ' + this.id);
172
+ // console.log(event);
173
+ let change = new ChangeWrapper(); // ChangeWrapper = JSON.parse('{}');
174
+ change.fromQuestionId = this.id;
175
+ change.valueObj = event ? event : '';
176
+ change.referenceField = this.referenceField;
177
+ change.selectedObj = event ? event[this.labelField] : '';
178
+ this.valueChange.emit(change);
179
+ // once got value in dropdown remove the error validation
180
+ if (event) {
181
+ this.invalidFieldIds = [];
182
+ }
183
+ }
184
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CustomDropdownComponent, deps: [{ token: i1.ChangeService }, { token: i2.DataService }, { token: i3.I18nService }], target: i0.ɵɵFactoryTarget.Component });
185
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CustomDropdownComponent, selector: "app-custom-dropdown", inputs: { options: "options", placeholder: "placeholder", apiMeta: "apiMeta", selectedValue: "selectedValue", progressBar: "progressBar", id: "id", readOnly: "readOnly", errorMessage: "errorMessage", error: "error", fromShengel: "fromShengel", question: "question", referenceField: "referenceField", token: "token" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\r\n<!-- <select\r\n [ngClass]=\"{\r\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\r\n 'custom-select': !progressBar\r\n }\" class=\"custom-select mr-sm-2 dd-height\" \r\n [id]=\"id\" \r\n [(ngModel)]=\"selectedValue\"\r\n (change)=\"selectChange($event.target.value);\" \r\n [style.borderColor]=\"error ? 'red' : '#858585'\"\r\n [style.color]=\"error ? 'red' : ''\">\r\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.value\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.value }}</option>\r\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\r\n</select> -->\r\n<!-- // VD 12Jun24 - readonly change-->\r\n<!-- VD 01Aug24 - validation change-->\r\n<!-- VD 07Aug24 - isDependentField change-->\r\n<!-- VD 25Oct24 - changes-->\r\n<!-- RS 09DEC24 Changed keys--> \r\n<ng-select\r\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\r\n [(ngModel)]=\"selectedValue\" \r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"readOnly\"\r\n (click)=\"getOptions()\"\r\n (change)=\"selectChange($event)\"\r\n [id]=\"id\">\r\n <ng-option \r\n *ngFor=\"let option of options\" \r\n [value]=\"apiObj && !apiObj.isDependentField ? option : option?.value\">\r\n {{ apiObj && !apiObj.isDependentField && option ? option[labelField] : option?.value }}\r\n </ng-option> \r\n</ng-select>\r\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\r\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.NgSelectComponent, selector: "ng-select", inputs: ["markFirst", "dropdownPosition", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "bufferAmount", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "bindLabel", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "virtualScroll", "openOnEnter", "appendTo", "bindValue", "appearance", "maxSelectedItems", "groupBy", "groupValue", "tabIndex", "typeahead"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "component", type: i6.ɵr, selector: "ng-option", inputs: ["disabled", "value"] }] });
186
+ }
187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CustomDropdownComponent, decorators: [{
188
+ type: Component,
189
+ args: [{ selector: 'app-custom-dropdown', template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\r\n<!-- <select\r\n [ngClass]=\"{\r\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\r\n 'custom-select': !progressBar\r\n }\" class=\"custom-select mr-sm-2 dd-height\" \r\n [id]=\"id\" \r\n [(ngModel)]=\"selectedValue\"\r\n (change)=\"selectChange($event.target.value);\" \r\n [style.borderColor]=\"error ? 'red' : '#858585'\"\r\n [style.color]=\"error ? 'red' : ''\">\r\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.value\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.value }}</option>\r\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\r\n</select> -->\r\n<!-- // VD 12Jun24 - readonly change-->\r\n<!-- VD 01Aug24 - validation change-->\r\n<!-- VD 07Aug24 - isDependentField change-->\r\n<!-- VD 25Oct24 - changes-->\r\n<!-- RS 09DEC24 Changed keys--> \r\n<ng-select\r\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\r\n [(ngModel)]=\"selectedValue\" \r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"readOnly\"\r\n (click)=\"getOptions()\"\r\n (change)=\"selectChange($event)\"\r\n [id]=\"id\">\r\n <ng-option \r\n *ngFor=\"let option of options\" \r\n [value]=\"apiObj && !apiObj.isDependentField ? option : option?.value\">\r\n {{ apiObj && !apiObj.isDependentField && option ? option[labelField] : option?.value }}\r\n </ng-option> \r\n</ng-select>\r\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\r\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"] }]
190
+ }], ctorParameters: function () { return [{ type: i1.ChangeService }, { type: i2.DataService }, { type: i3.I18nService }]; }, propDecorators: { options: [{
191
+ type: Input
192
+ }], placeholder: [{
193
+ type: Input
194
+ }], apiMeta: [{
195
+ type: Input
196
+ }], selectedValue: [{
197
+ type: Input
198
+ }], progressBar: [{
199
+ type: Input
200
+ }], id: [{
201
+ type: Input
202
+ }], readOnly: [{
203
+ type: Input
204
+ }], errorMessage: [{
205
+ type: Input
206
+ }], error: [{
207
+ type: Input
208
+ }], fromShengel: [{
209
+ type: Input
210
+ }], question: [{
211
+ type: Input
212
+ }], referenceField: [{
213
+ type: Input
214
+ }], token: [{
215
+ type: Input
216
+ }], valueChange: [{
217
+ type: Output
218
+ }] } });
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2N1c3RvbS1kcm9wZG93bi9jdXN0b20tZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLWRyb3Bkb3duL2N1c3RvbS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFTLEtBQUssRUFBQyxNQUFNLEVBQUMsWUFBWSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBR3RGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7QUFZMUQsTUFBTSxPQUFPLHVCQUF1QjtJQWlCeEI7SUFDQTtJQUNEO0lBbEJBLE9BQU8sQ0FBVztJQUNsQixXQUFXLENBQVM7SUFDcEIsT0FBTyxDQUFTO0lBQ2hCLGFBQWEsQ0FBUztJQUN0QixXQUFXLENBQVU7SUFDckIsRUFBRSxDQUFRO0lBQ1YsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLCtCQUErQjtJQUNqRCxZQUFZLENBQVM7SUFDckIsS0FBSyxDQUFLO0lBQ1YsV0FBVyxHQUFZLEtBQUssQ0FBQztJQUM3QixRQUFRLENBQUs7SUFDYixjQUFjLENBQVE7SUFDdEIsS0FBSyxDQUFRLENBQUksc0NBQXNDO0lBQ3RELFdBQVcsR0FBZ0MsSUFBSSxZQUFZLEVBQWlCLENBQUM7SUFDdkYsZUFBZSxHQUFZLEVBQUUsQ0FBQztJQUM5QixZQUNVLGFBQTRCLEVBQzVCLFdBQXdCLEVBQ3pCLFdBQXdCO1FBRnZCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3pCLGdCQUFXLEdBQVgsV0FBVyxDQUFh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QU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCxJbnB1dCxPdXRwdXQsRXZlbnRFbWl0dGVyLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQVBJTWV0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYXBpbWV0YSc7XHJcbmltcG9ydCB7IENoYW5nZVdyYXBwZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9jaGFuZ2VXcmFwcGVyJztcclxuaW1wb3J0IHsgQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoYW5nZS5zZXJ2aWNlJztcclxuLy8gSEEgMTlERUMyMyBpbXBvcnRlZCB0cmFuc2xhdGlvbiBzZXJ2aWNlXHJcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaTE4bi5zZXJ2aWNlJztcclxuLy8gVkQgMjNKQU4yNCB1c2VkIHNlcnZpY2UgZmlsZSBmb3IgY2FsbG91dFxyXG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1jdXN0b20tZHJvcGRvd24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20tZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS1kcm9wZG93bi5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEN1c3RvbURyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBvcHRpb25zOiBzdHJpbmdbXTtcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGFwaU1ldGE6IHN0cmluZztcclxuICBASW5wdXQoKSBzZWxlY3RlZFZhbHVlOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHJvZ3Jlc3NCYXI6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgaWQ6c3RyaW5nO1xyXG4gIEBJbnB1dCgpIHJlYWRPbmx5ID0gZmFsc2U7IC8vIFZEIDEySnVuMjQgLSByZWFkb25seSBjaGFuZ2VcclxuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICBASW5wdXQoKSBlcnJvcjphbnk7XHJcbiAgQElucHV0KCkgZnJvbVNoZW5nZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBxdWVzdGlvbjphbnk7XHJcbiAgQElucHV0KCkgcmVmZXJlbmNlRmllbGQ6c3RyaW5nO1xyXG4gIEBJbnB1dCgpIHRva2VuOnN0cmluZzsgICAgLy8gVkQgMTlKQU4yNCAtIGdldHRpbmcgdG9rZW4gYXMgaW5wdXRcclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxDaGFuZ2VXcmFwcGVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhbmdlV3JhcHBlcj4oKTtcclxuICBpbnZhbGlkRmllbGRJZHM6c3RyaW5nW10gPSBbXTtcclxuICBjb25zdHJ1Y3RvciggXHJcbiAgICBwcml2YXRlIGNoYW5nZVNlcnZpY2U6IENoYW5nZVNlcnZpY2UsIFxyXG4gICAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLFxyXG4gICAgICAgICkgeyBcclxuICAgIHRoaXMuY2hhbmdlU2VydmljZS5zdWJtaXRWYWxpZGF0ZSQuc3Vic2NyaWJlKChkYXRhKT0+e1xyXG4gICAgICAvLyB0byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UncyBmaWVsZCBpZCdzXHJcbiAgICAgIHRoaXMuaW52YWxpZEZpZWxkSWRzLnB1c2goZGF0YSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGxhYmVsRmllbGQ6IHN0cmluZztcclxuICBwdWJsaWMgdmFsdWVGaWVsZDogc3RyaW5nO1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHB1YmxpYyBhcGlPYmo6QVBJTWV0YTtcclxuICBwdWJsaWMgdW5pcXVlS2V5OnN0cmluZztcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBcclxuICB9XHJcbiAgZ2V0T3B0aW9ucygpe1xyXG4gICAgY29uc29sZS5sb2coJ3Rlc3QgY2xpY2snKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGUgb25pbml0IG9mIGN1c3RvbS1kcm9wZG93biBvZiAnICsgdGhpcy5pZCk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmFwaU1ldGEpO1xyXG4gICAgLy9WRCAwN0F1ZzI0IC0gaXNEZXBlbmRlbnRGaWVsZCBjaGFuZ2VcclxuICAgIC8vIFZEIDI1T2N0MjQgLSBjaGFuZ2VzXHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlciA/IHRoaXMucGxhY2Vob2xkZXIgOiAnLS0tU2VsZWN0IG9wdGlvbi0tLSc7XHJcbiAgICBpZih0aGlzLmFwaU1ldGEpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuYXBpT2JqID0gSlNPTi5wYXJzZSh0aGlzLmFwaU1ldGEpO1xyXG4gICAgICAvLyBDaGVjayBpZiBhcGlPYmogYW5kIGFwaU9iai5maWVsZCBhcmUgZGVmaW5lZFxyXG4gICAgICBpZiAodGhpcy5hcGlPYmogJiYgdGhpcy5hcGlPYmouZmllbGQpIHtcclxuICAgICAgICB0aGlzLmxhYmVsRmllbGQgPSB0aGlzLmFwaU9iai5maWVsZDtcclxuICAgICAgICB0aGlzLnVuaXF1ZUtleSA9IHRoaXMuYXBpT2JqLnVuaXF1ZUtleTtcclxuICAgICAgICBjb25zdCBjYWNoZWRPcHRpb25zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy51bmlxdWVLZXkpO1xyXG4gICAgICAgIGlmIChjYWNoZWRPcHRpb25zKSB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBKU09OLnBhcnNlKGNhY2hlZE9wdGlvbnMpO1xyXG4gICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgIGlmKCF0aGlzLmFwaU9iai5pc0RlcGVuZGVudEZpZWxkKXtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gW107XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gVkQgMDlTZXAyNC0gc2V0dXAgdGhlIHF1ZXJ5IHBhcmFtIGZvciBhcGkgY2FsbCAvLyBNUiAwOEpBTjI0IERlcGVuZGVudEZpZWxkIEFQSSBGaXggbW92ZWQgYmVsb3cgbG9naWMgZnJvbSBhYm92ZSBpZiBjb25kaXRpb25cclxuICAgICAgICAgIGxldCBmdWxsRW5kUG9pbnQgO1xyXG4gICAgICAgICAgaWYodGhpcy5hcGlPYmouZW5kcG9pbnQpIHtcclxuICAgICAgICAgICAgaWYodGhpcy5hcGlPYmoucXVlcnlWYWx1ZVJlZmVyZW5jZSAmJiB0aGlzLmFwaU9iai5xdWVyeUZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgZW5kIHBvaW50IHdpdGggcXVlcnkgcGFyYW1cclxuICAgICAgICAgICAgICBsZXQgcXVlcnlSZWZlcmVuY2VzID0gdGhpcy5hcGlPYmoucXVlcnlWYWx1ZVJlZmVyZW5jZS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICAgIGxldCBxdWVyeUZpZWxkcyA9IHRoaXMuYXBpT2JqLnF1ZXJ5RmllbGQuc3BsaXQoJywnKTsgICAgLy8gTVIgMDhKQU4yNCBzaW1pbGFyIHRvIGFib3ZlIHZhbHVlcmVmZXJlbmNlIGdldCBsaXN0IG9mIFFVRVJZIEZpZWxkc1xyXG4gICAgICAgICAgICAgIGxldCBxdWVyeVZhbHVlcyA9IHRoaXMuYXBpT2JqLnF1ZXJ5VmFsdWUuc3BsaXQoJywnKTsgICAgLy8gTVIgMDhKQU4yNCBzaW1pbGFyIHRvIGFib3ZlIHZhbHVlcmVmZXJlbmNlIGdldCBsaXN0IG9mIFFVRVJZIFZhbHVlcyAoRGVmYXVsdClcclxuICAgICAgICAgICAgICBsZXQgcXVlcnlQYXJhbXMgPSBbXTtcclxuICAgICAgICAgICAgICBsZXQgcUluZGV4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1SIDA4SkFOMjQgUXVlcnkgSW5kZXhcclxuICAgICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgcXVlcnlSZWZlcmVuY2VzIGFuZCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gcmVmZXJlbmNlRGF0YVxyXG4gICAgICAgICAgICAgIHF1ZXJ5UmVmZXJlbmNlcy5mb3JFYWNoKHJlZmVyZW5jZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBlbGVtZW50IGluIHJlZmVyZW5jZURhdGEgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHJlZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcclxuICAgICAgICAgICAgICAgIGxldCBtYXRjaGluZ0VsZW1lbnQgPSB0aGlzLnF1ZXN0aW9uPy5yZWZlcmVuY2VRdWVyeURhdGEuZmluZChlbGVtZW50ID0+IGVsZW1lbnQucmVmZXJlbmNlRmllbGQgPT09IHJlZmVyZW5jZSk7XHJcbiAgICAgICAgICAgICAgLy8gSWYgYSBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kLCBnZXQgaXRzIGlucHV0IHZhbHVlIGFuZCBjcmVhdGUgYSBxdWVyeSBwYXJhbWV0ZXJcclxuICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UgJiYgbWF0Y2hpbmdFbGVtZW50KSB7ICAgLy8gTVIgMDhKQU4yNCBpZiByZWZlcmVuY2UgZXhpc3QgJiBtYXRjaGluZyBlbGVtZW50IGZvdW5kXHJcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goYCR7cXVlcnlGaWVsZHNbcUluZGV4XX09JHttYXRjaGluZ0VsZW1lbnQuaW5wdXR9YCk7ICAgIC8vIE1SIDA4SkFOMjQgcmVtb3ZlZCByZWZlcmVuY2VcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgIC8vIE1SIDA4SkFOMjQgaW5jbHVkZWQgb3B0aW9uIGZvciBtdWx0aXBsZSBxdWVyeSBwYXJhbXMgYW5kIGRlZmF1bHQgdmFsdWUgaW4gY2FzZSBvZiByZWZlcmVuY2UgaXMgbm90IGZvdW5kXHJcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goYCR7cXVlcnlGaWVsZHNbcUluZGV4XX09JHtxdWVyeVZhbHVlc1txSW5kZXhdfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHFJbmRleCsrO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGZ1bGxFbmRQb2ludCA9IHRoaXMuYXBpT2JqLmVuZHBvaW50ICsgJz8nICsgcXVlcnlQYXJhbXMuam9pbignJicpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGZ1bGxFbmRQb2ludCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiBubyBxdWVyeSBwYXJhbSBnZXQgdGhlIGFjdHVhbCBlbmRQb2ludFxyXG4gICAgICAgICAgICAgIGZ1bGxFbmRQb2ludCA9IHRoaXMuYXBpT2JqLmVuZHBvaW50O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBWRCAxOUpBTjI0IC0gYWRkZWQgb25lIG1vcmUgcGFyYW0gZm9yIGF1dGhlbnRpY2F0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UuYXBpUmVzcG9uc2UoZnVsbEVuZFBvaW50KT8uc3Vic2NyaWJlKChhcGlSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIC8vIEhBIDE4LUpBTi0yNCBBc3NpZ25lZCBhcGlyZXNwb25zZSBkaXJlY3RseSBpZiB3ZSBoYXZlIHRoZSByZXNwb25zZSBpbiBhcnJheSBhbHNvXHJcbiAgICAgICAgICAgICAgLy8gVkQgMTlKQU4yNCAtIGlmIHJlc3BvbnNlIGhhcyBrZXkgd2l0aCB2YWx1ZSh3aGljaCBpcyBhcnJheSlcclxuICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VzO1xyXG4gICAgICAgICAgICAgIGlmKHRoaXMuYXBpT2JqLnZhcmlhYmxlKXtcclxuICAgICAgICAgICAgICAgIC8vIFZEIDIxTWF5MjQgLSBoYW5kbGluZyBtdWx0aXBsZSBjaGlsZCBvYmplY3RzXHJcbiAgICAgICAgICAgICAgICAvLyBWRCAyMk1heTI0IC0gdXNlZCBjb21tb24gc2VydmljZSBmaWxlXHJcbiAgICAgICAgICAgICAgICByZXNwb25zZXMgPSB0aGlzLmRhdGFTZXJ2aWNlLmdldFZhbHVlKGFwaVJlc3BvbnNlLHRoaXMuYXBpT2JqLnZhcmlhYmxlKTtcclxuICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gW107XHJcbiAgICAgICAgICAgICAgICAvLyBIQSAxOUpBTjI0IFRvIGF2b2lkIHVuZGVmaW5lZCBlcnJvciBpbiBjb25zb2xlXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlcz8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgdmFyIHJlc3AgPSByZXNwb25zZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXNwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHJlc3VsdHM7XHJcbiAgICAgICAgICAgICAgfWVsc2V7ICAvLyBWRCAxOUpBTjI0IC0gaWYgcmVzcG9uc2UgaGFzIHZhbHVlKHdoaWNoIGlzIGFycmF5KSBvbmx5XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZXMgPSBhcGlSZXNwb25zZTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHJlc3BvbnNlcztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy8gVkQgMjVPY3QyNCAtIFN0b3JlIGZldGNoZWQgb3B0aW9ucyBpbiBsb2NhbCBzdG9yYWdlXHJcbiAgICAgICAgICAgICAgaWYodGhpcy51bmlxdWVLZXkpe1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy51bmlxdWVLZXksIEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucykpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvLyBSZWZlcmVuY2UgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvQG5nLXNlbGVjdC9uZy1zZWxlY3RcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBWRCBOT1YyMyAtIGhhbmRsZSB0aGUgZGVwZW5kZW50IHVwZGF0ZSBmb3IgZHJvcGRvd25cclxuICAgICAgICAgIC8vIFZEIDA5U2VwMjQtIHB1c2ggdGhlIGRlcGVuZGVudCBmaWVsZCB2YWx1ZXMgZm9yIGRyb3Bkb3duXHJcbiAgICAgICAgICBsZXQgc291cmNlSWQgPSB0aGlzLmFwaU9iai5zb3VyY2VRdWVzdGlvbklkO1xyXG4gICAgICAgICAgaWYoc291cmNlSWQgJiYgdGhpcy5hcGlPYmoudmFyaWFibGUgfHwgdGhpcy5hcGlPYmoudmFsdWVGaWVsZCl7XHJcbiAgICAgICAgICAgIC8vIFN1YnNjcmliZSBmb3IgdGhlIGNoYW5nZXNcclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNoYW5nZVNlcnZpY2UuY2hhbmdlQW5ub3VuY2VkJC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgKGNoYW5nZVZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZihjaGFuZ2VWYWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2luc2lkZSBzdWJzY3JpcHRpb24gZm9yIHRoZSBjaGFuZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgaWYoY2hhbmdlVmFsdWUudmFsdWVPYmogIT0gdW5kZWZpbmVkICYmIGNoYW5nZVZhbHVlLmZyb21RdWVzdGlvbklkID09IHRoaXMuYXBpT2JqLnNvdXJjZVF1ZXN0aW9uSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgdGhpcy5zZWxlY3RlZFZhbHVlID0gY2hhbmdlVmFsdWUudmFsdWVPYmpbdGhpcy5hcGlPYmoudmFsdWVGaWVsZF07XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIGxldCB2YWx1ZSA9e307XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gIHZhbHVlWyduYW1lJ10gPSB0aGlzLnNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5hcGlPYmoudmFyaWFibGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZXMgPSB0aGlzLmRhdGFTZXJ2aWNlLmdldFZhbHVlKGNoYW5nZVZhbHVlLnZhbHVlT2JqLHRoaXMuYXBpT2JqLnZhcmlhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZXM/Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3AgPSByZXNwb25zZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHJlc3VsdHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gY2hhbmdlVmFsdWUudmFsdWVPYmo7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHJlc3BvbnNlcztcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBWRCAyNU9jdDI0IC0gU3RvcmUgZmV0Y2hlZCBvcHRpb25zIGluIGxvY2FsIHN0b3JhZ2VcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnVuaXF1ZUtleSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnVuaXF1ZUtleSwgSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VTZXJ2aWNlLmNvbmZpcm1DaGFuZ2UodGhpcy5hcGlPYmouc291cmNlUXVlc3Rpb25JZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGFwaU1ldGE6JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH0gXHJcbn1cclxuLy8gVkQgMjJNYXkyNCAtIHVzZWQgY29tbW9uIHNlcnZpY2UgZmlsZVxyXG5cclxuICBzZWxlY3RDaGFuZ2UoZXZlbnQ6YW55KSB7XHJcbiAgICBjb25zb2xlLmxvZygnaW5zaWRlIHNlbGVjdENoYW5nZSBmcm9tICcgKyB0aGlzLmlkKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKGV2ZW50KTtcclxuICAgIGxldCBjaGFuZ2UgPSBuZXcgQ2hhbmdlV3JhcHBlcigpOyAvLyBDaGFuZ2VXcmFwcGVyID0gSlNPTi5wYXJzZSgne30nKTtcclxuICAgIGNoYW5nZS5mcm9tUXVlc3Rpb25JZCA9IHRoaXMuaWQ7XHJcbiAgICBjaGFuZ2UudmFsdWVPYmogPSBldmVudCA/IGV2ZW50IDogJyc7XHJcbiAgICBjaGFuZ2UucmVmZXJlbmNlRmllbGQgPSB0aGlzLnJlZmVyZW5jZUZpZWxkO1xyXG4gICAgY2hhbmdlLnNlbGVjdGVkT2JqID0gZXZlbnQgPyBldmVudFt0aGlzLmxhYmVsRmllbGRdIDogJyc7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2hhbmdlKTtcclxuICAgIC8vIG9uY2UgZ290IHZhbHVlIGluIGRyb3Bkb3duIHJlbW92ZSB0aGUgZXJyb3IgdmFsaWRhdGlvblxyXG4gICAgaWYoZXZlbnQpe1xyXG4gICAgICB0aGlzLmludmFsaWRGaWVsZElkcyA9W107XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjwhLS0gSEEgMTgtSkFOLTI0IENvbW1lbnRpbmcgdGhlc2UgbGluZXMgYXMgd2UgZG9uJ3QgaGF2ZSB0byB1c2Ugc2hlbmdlbCBoZXJlIC0tPlxyXG48IS0tIDxzZWxlY3RcclxuICBbbmdDbGFzc109XCJ7XHJcbiAgICAnZHQtbGluZSBkcERvd24gZG93biBteXQtZHJvcGJveCBteXQtYm9yZGVyLXIgbXl0LWZvbnQxJzogcHJvZ3Jlc3NCYXIsXHJcbiAgICAnY3VzdG9tLXNlbGVjdCc6ICFwcm9ncmVzc0JhclxyXG4gIH1cIiBjbGFzcz1cImN1c3RvbS1zZWxlY3QgbXItc20tMiBkZC1oZWlnaHRcIiBcclxuICBbaWRdPVwiaWRcIiBcclxuICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkVmFsdWVcIlxyXG4gIChjaGFuZ2UpPVwic2VsZWN0Q2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpO1wiIFxyXG4gIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJlcnJvciA/ICdyZWQnIDogJyM4NTg1ODUnXCJcclxuICBbc3R5bGUuY29sb3JdPVwiZXJyb3IgPyAncmVkJyA6ICcnXCI+XHJcbiAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uc1wiIFt2YWx1ZV09XCJ0aGlzLmFwaU1ldGEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbi50aXRsZSA6IG9wdGlvbi52YWx1ZVwiIGNsYXNzPVwib3B0aW9uXCI+e3sgdGhpcy5hcGlNZXRhICE9PSB1bmRlZmluZWQgPyBvcHRpb24udGl0bGUgOiBvcHRpb24udmFsdWUgfX08L29wdGlvbj5cclxuICAgIDxvcHRpb24gKm5nSWY9XCJlcnJvck1lc3NhZ2VcIiB2YWx1ZT1cIlwiIGRpc2FibGVkIGhpZGRlbj57eyBlcnJvck1lc3NhZ2UgfX08L29wdGlvbj5cclxuPC9zZWxlY3Q+IC0tPlxyXG48IS0tIC8vIFZEIDEySnVuMjQgLSByZWFkb25seSBjaGFuZ2UtLT5cclxuPCEtLSBWRCAwMUF1ZzI0IC0gdmFsaWRhdGlvbiBjaGFuZ2UtLT5cclxuPCEtLSBWRCAwN0F1ZzI0IC0gaXNEZXBlbmRlbnRGaWVsZCBjaGFuZ2UtLT5cclxuPCEtLSBWRCAyNU9jdDI0IC0gY2hhbmdlcy0tPlxyXG48IS0tIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzLS0+IFxyXG48bmctc2VsZWN0XHJcbiAgW2NsYXNzXT1cImludmFsaWRGaWVsZElkcy5pbmNsdWRlcyhpZCkgfHwgZXJyb3IgPyAnc2hlbmdlbC1jdXN0b20tc2VsZWN0IGludmFsaWQnIDogJ3NoZW5nZWwtY3VzdG9tLXNlbGVjdCdcIlxyXG4gIFsobmdNb2RlbCldPVwic2VsZWN0ZWRWYWx1ZVwiIFxyXG4gIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXHJcbiAgW2Rpc2FibGVkXT1cInJlYWRPbmx5XCJcclxuICAoY2xpY2spPVwiZ2V0T3B0aW9ucygpXCJcclxuICAoY2hhbmdlKT1cInNlbGVjdENoYW5nZSgkZXZlbnQpXCJcclxuICBbaWRdPVwiaWRcIj5cclxuICA8bmctb3B0aW9uIFxyXG4gICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCIgXHJcbiAgICBbdmFsdWVdPVwiYXBpT2JqICYmICFhcGlPYmouaXNEZXBlbmRlbnRGaWVsZCA/IG9wdGlvbiA6IG9wdGlvbj8udmFsdWVcIj5cclxuICAgIHt7IGFwaU9iaiAmJiAhYXBpT2JqLmlzRGVwZW5kZW50RmllbGQgJiYgb3B0aW9uID8gb3B0aW9uW2xhYmVsRmllbGRdIDogb3B0aW9uPy52YWx1ZSB9fVxyXG4gIDwvbmctb3B0aW9uPiBcclxuPC9uZy1zZWxlY3Q+XHJcbjxzcGFuICpuZ0lmPVwiZXJyb3IgfHwgaW52YWxpZEZpZWxkSWRzLmluY2x1ZGVzKGlkKVwiIGNsYXNzPVwiZXJyb3ItbXNnXCI+e3tlcnJvck1lc3NhZ2V9fTwvc3Bhbj5cclxuIl19