master-control 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/master-control.component.mjs +6 -4
- package/esm2022/lib/master-control.service.mjs +20 -1
- package/esm2022/lib/medial-questions/medial-questions.component.mjs +601 -0
- package/esm2022/lib/medial-questions/questions.json +39682 -0
- package/esm2022/lib/multiple-select/multiple-select.component.mjs +4 -3
- package/esm2022/lib/radio/radio.component.mjs +3 -3
- package/esm2022/lib/stepper/stepper.component.mjs +16 -7
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/master-control.mjs +40398 -19
- package/fesm2022/master-control.mjs.map +1 -1
- package/lib/medial-questions/medial-questions.component.d.ts +62 -0
- package/lib/multiple-select/multiple-select.component.d.ts +2 -1
- package/lib/stepper/stepper.component.d.ts +5 -0
- package/master-control-0.2.6.tgz +0 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/master-control-0.2.5.tgz +0 -0
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
import { GoogleMapsModule } from '@angular/google-maps';
|
|
2
|
+
import { Component, Input, ViewChild, input } from '@angular/core';
|
|
3
|
+
import * as questionsResponse from './questions.json';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
+
import { TextboxComponent } from '../textbox/textbox.component';
|
|
7
|
+
import { RadioComponent } from '../radio/radio.component';
|
|
8
|
+
import { CheckboxComponent } from '../checkbox/checkbox.component';
|
|
9
|
+
import { SelectComponent } from '../select/select.component';
|
|
10
|
+
import { DobComponent } from '../dob/dob.component';
|
|
11
|
+
import { UploadComponent } from '../upload/upload.component';
|
|
12
|
+
import { MultipleSelectComponent } from '../multiple-select/multiple-select.component';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "@angular/common";
|
|
15
|
+
import * as i2 from "@angular/forms";
|
|
16
|
+
import * as i3 from "@angular/google-maps";
|
|
17
|
+
export class MedialQuestionsComponent {
|
|
18
|
+
ngZone;
|
|
19
|
+
medialQuestionResponse = questionsResponse;
|
|
20
|
+
addressInput;
|
|
21
|
+
autocomplete;
|
|
22
|
+
field = input.required();
|
|
23
|
+
questionList = [];
|
|
24
|
+
currentCoordinates = {};
|
|
25
|
+
personUwResponseObj = [];
|
|
26
|
+
center = { lat: 40.73061, lng: -73.935242 };
|
|
27
|
+
latitude;
|
|
28
|
+
longitude;
|
|
29
|
+
zoom;
|
|
30
|
+
marker = {};
|
|
31
|
+
personUwAnswers = {
|
|
32
|
+
medicalQuestionsHeightUnit: 'FEET',
|
|
33
|
+
};
|
|
34
|
+
medQuestionObj = {};
|
|
35
|
+
listOfDomainValuesForCheckBox = [];
|
|
36
|
+
medicalQuestionsFeetList = [];
|
|
37
|
+
medicalQuestionsInchesList = [];
|
|
38
|
+
questionHeader = ['eia details', 'abha details', 'pep details'];
|
|
39
|
+
medicalQuestionsHeightUnitTypes = [
|
|
40
|
+
{
|
|
41
|
+
label: 'Cm',
|
|
42
|
+
value: 'CM'
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
label: 'Feet',
|
|
46
|
+
value: 'FEET'
|
|
47
|
+
}
|
|
48
|
+
];
|
|
49
|
+
showDropdown = false;
|
|
50
|
+
addressSuggestions = [];
|
|
51
|
+
hoveredIndex = -1;
|
|
52
|
+
searchTimeout;
|
|
53
|
+
constructor(ngZone) {
|
|
54
|
+
this.ngZone = ngZone;
|
|
55
|
+
console.log('medialQuestionResponseeeeee', this.medialQuestionResponse);
|
|
56
|
+
}
|
|
57
|
+
ngOnInit() {
|
|
58
|
+
if ('geolocation' in navigator) {
|
|
59
|
+
navigator.geolocation.getCurrentPosition((position) => {
|
|
60
|
+
this.latitude = position.coords.latitude;
|
|
61
|
+
this.longitude = position.coords.longitude;
|
|
62
|
+
this.zoom = 15;
|
|
63
|
+
this.currentCoordinates = {
|
|
64
|
+
lat: this.latitude,
|
|
65
|
+
lng: this.longitude,
|
|
66
|
+
};
|
|
67
|
+
this.center = { ...this.currentCoordinates };
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
this.preparePersonUwQuestionsObj();
|
|
71
|
+
}
|
|
72
|
+
ngAfterViewInit() {
|
|
73
|
+
this.initializeAutocomplete();
|
|
74
|
+
}
|
|
75
|
+
initializeAutocomplete() {
|
|
76
|
+
this.autocomplete = new google.maps.places.Autocomplete(this.addressInput?.nativeElement, {
|
|
77
|
+
types: ['address'],
|
|
78
|
+
componentRestrictions: { country: 'IN' },
|
|
79
|
+
fields: ['place_id', 'geometry', 'name', 'formatted_address']
|
|
80
|
+
});
|
|
81
|
+
this.autocomplete.addListener('place_changed', () => {
|
|
82
|
+
this.ngZone.run(() => {
|
|
83
|
+
this.onPlaceSelected();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
onPlaceSelected() {
|
|
88
|
+
const place = this.autocomplete.getPlace();
|
|
89
|
+
if (!place.geometry || !place.geometry.location) {
|
|
90
|
+
console.log('No details available for input: ', place.name);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const location = place.geometry.location;
|
|
94
|
+
this.center = {
|
|
95
|
+
lat: location.lat(),
|
|
96
|
+
lng: location.lng()
|
|
97
|
+
};
|
|
98
|
+
this.currentCoordinates = this.center;
|
|
99
|
+
if (place.geometry.viewport) {
|
|
100
|
+
this.zoom = 15;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
this.zoom = 13;
|
|
104
|
+
}
|
|
105
|
+
console.log('Selected place:', {
|
|
106
|
+
name: place.name,
|
|
107
|
+
address: place.formatted_address,
|
|
108
|
+
coordinates: this.center
|
|
109
|
+
});
|
|
110
|
+
this.storeSelectedAddress(place);
|
|
111
|
+
}
|
|
112
|
+
storeSelectedAddress(place) {
|
|
113
|
+
const addressData = {
|
|
114
|
+
placeId: place.place_id,
|
|
115
|
+
name: place.name,
|
|
116
|
+
formattedAddress: place.formatted_address,
|
|
117
|
+
coordinates: this.center
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
searchAddress(address) {
|
|
121
|
+
const geocoder = new google.maps.Geocoder();
|
|
122
|
+
geocoder.geocode({ address: address }, (results, status) => {
|
|
123
|
+
if (status === 'OK' && results && results[0]) {
|
|
124
|
+
const location = results[0].geometry.location;
|
|
125
|
+
this.ngZone.run(() => {
|
|
126
|
+
this.center = {
|
|
127
|
+
lat: location.lat(),
|
|
128
|
+
lng: location.lng()
|
|
129
|
+
};
|
|
130
|
+
this.currentCoordinates = this.center;
|
|
131
|
+
this.zoom = 15;
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
console.log('Geocode was not successful for the following reason: ' + status);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
onAddressInputKeyup(event) {
|
|
140
|
+
const query = event.target.value;
|
|
141
|
+
// Clear previous timeout
|
|
142
|
+
if (this.searchTimeout) {
|
|
143
|
+
clearTimeout(this.searchTimeout);
|
|
144
|
+
}
|
|
145
|
+
// Handle arrow key navigation
|
|
146
|
+
if (event.key === 'ArrowDown') {
|
|
147
|
+
this.hoveredIndex = Math.min(this.hoveredIndex + 1, this.addressSuggestions.length - 1);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
else if (event.key === 'ArrowUp') {
|
|
151
|
+
this.hoveredIndex = Math.max(this.hoveredIndex - 1, -1);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
else if (event.key === 'Enter') {
|
|
155
|
+
if (this.hoveredIndex >= 0 && this.addressSuggestions[this.hoveredIndex]) {
|
|
156
|
+
this.selectAddress(this.addressSuggestions[this.hoveredIndex]);
|
|
157
|
+
}
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
else if (event.key === 'Escape') {
|
|
161
|
+
this.showDropdown = false;
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (query.length < 2) {
|
|
165
|
+
this.addressSuggestions = [];
|
|
166
|
+
this.showDropdown = false;
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
this.searchTimeout = setTimeout(() => {
|
|
170
|
+
this.searchAddresses(query);
|
|
171
|
+
}, 300);
|
|
172
|
+
}
|
|
173
|
+
searchAddresses(query) {
|
|
174
|
+
// Replace this with your actual address search API call
|
|
175
|
+
// For example, using Google Places API:
|
|
176
|
+
const service = new google.maps.places.AutocompleteService();
|
|
177
|
+
service.getPlacePredictions({
|
|
178
|
+
input: query,
|
|
179
|
+
types: ['address']
|
|
180
|
+
}, (predictions, status) => {
|
|
181
|
+
if (status === google.maps.places.PlacesServiceStatus.OK && predictions) {
|
|
182
|
+
this.addressSuggestions = predictions.map(prediction => ({
|
|
183
|
+
place_id: prediction.place_id,
|
|
184
|
+
main_text: prediction.structured_formatting.main_text,
|
|
185
|
+
secondary_text: prediction.structured_formatting.secondary_text,
|
|
186
|
+
description: prediction.description
|
|
187
|
+
}));
|
|
188
|
+
this.showDropdown = true;
|
|
189
|
+
this.hoveredIndex = -1;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.addressSuggestions = [];
|
|
193
|
+
this.showDropdown = false;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
selectAddress(suggestion) {
|
|
198
|
+
const addressInput = document.querySelector('#addressInput');
|
|
199
|
+
if (addressInput) {
|
|
200
|
+
addressInput.value = suggestion.description;
|
|
201
|
+
}
|
|
202
|
+
const service = new google.maps.places.PlacesService(document.createElement('div'));
|
|
203
|
+
service.getDetails({
|
|
204
|
+
placeId: suggestion.place_id,
|
|
205
|
+
fields: ['geometry', 'formatted_address']
|
|
206
|
+
}, (place, status) => {
|
|
207
|
+
if (status === google.maps.places.PlacesServiceStatus.OK && place) {
|
|
208
|
+
const lat = place.geometry?.location?.lat();
|
|
209
|
+
const lng = place.geometry?.location?.lng();
|
|
210
|
+
if (lat !== undefined && lng !== undefined) {
|
|
211
|
+
this.longitude = lng;
|
|
212
|
+
this.latitude = lat;
|
|
213
|
+
this.center = { lat, lng };
|
|
214
|
+
this.currentCoordinates = this.center;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
this.showDropdown = false;
|
|
219
|
+
this.addressSuggestions = [];
|
|
220
|
+
}
|
|
221
|
+
onInputBlur() {
|
|
222
|
+
setTimeout(() => {
|
|
223
|
+
this.showDropdown = false;
|
|
224
|
+
}, 200);
|
|
225
|
+
}
|
|
226
|
+
preparePersonUwQuestionsObj() {
|
|
227
|
+
this.questionList = [];
|
|
228
|
+
let data = questionsResponse;
|
|
229
|
+
this.listOfDomainValuesForCheckBox = [];
|
|
230
|
+
if (!this.checkIfValueIsEmpty(data['questionsResponse'])) {
|
|
231
|
+
let personUwIdArray = [];
|
|
232
|
+
data['questionsResponse'].forEach((singleQuestionObj) => {
|
|
233
|
+
personUwIdArray.push(singleQuestionObj['personUWId']);
|
|
234
|
+
});
|
|
235
|
+
if (!this.checkIfValueIsEmpty(data) && !this.checkIfValueIsEmpty(data['questionsResponse'])) {
|
|
236
|
+
if (!this.checkIfValueIsEmpty(data['questionsResponse'])) {
|
|
237
|
+
let distinctSteps = [];
|
|
238
|
+
data['questionsResponse'].forEach((singlePersonObject) => {
|
|
239
|
+
if (!this.checkIfValueIsEmpty(singlePersonObject['questionList'])) {
|
|
240
|
+
singlePersonObject['questionList'].forEach((singleQuestion) => {
|
|
241
|
+
singleQuestion['domainValues'] = data['domainValues'][singleQuestion['domainName']];
|
|
242
|
+
singleQuestion['field'] = this.getField(singleQuestion);
|
|
243
|
+
if (singleQuestion['cammundaQuestionCode'] === 'PAN') {
|
|
244
|
+
singleQuestion['validations'] = '{"Type":"AlphaNumeric","MinValue":"10","MaxValue":"10","regexPattern":"/^([a-zA-Z]){5}([0-9]){4}([a-zA-Z]){1}?$/"}';
|
|
245
|
+
}
|
|
246
|
+
// if (singleQuestion['cammundaQuestionCode'] === 'FtcaCntcDetls') {
|
|
247
|
+
// singleQuestion['validations'] = '{"customValidation":[{"country":"IN","MinValue":"10","MaxValue":"10","regexPattern":"((^[6-9]){1}([0-9]){9}$)"},{"country":"OTHER","MinValue":"5","MaxValue":"14"}]}';
|
|
248
|
+
// }
|
|
249
|
+
if (singleQuestion['questionType'] === 'CHECKBOX' &&
|
|
250
|
+
!this.checkIfValueIsEmpty(singleQuestion['questionRelation'])) {
|
|
251
|
+
singleQuestion['questionRelation'].forEach((singleQuestionRelationObj) => {
|
|
252
|
+
let nextQuestionObject = singlePersonObject['questionList'].filter((object) => object['questionId'] === singleQuestionRelationObj['nextQuestionId']);
|
|
253
|
+
if (nextQuestionObject.length > 0) {
|
|
254
|
+
nextQuestionObject[0]['answeredValue'] = singleQuestionRelationObj['parentQuestionValue'];
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
if (singleQuestion['questionType'] === 'CHECKBOX') {
|
|
259
|
+
if (!this.checkIfValueIsEmpty(singleQuestion['domainName']) && !this.checkIfValueIsEmpty(data['domainValues'][singleQuestion['domainName']])) {
|
|
260
|
+
data['domainValues'][singleQuestion['domainName']].forEach((singleDomainValue) => {
|
|
261
|
+
if (!this.checkIfValueIsEmpty(singleDomainValue['domainInternalValue'])) {
|
|
262
|
+
this.listOfDomainValuesForCheckBox.push(singleDomainValue['domainInternalValue']);
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (!distinctSteps.includes(singleQuestion['step'])) {
|
|
268
|
+
distinctSteps.push(singleQuestion['step']);
|
|
269
|
+
}
|
|
270
|
+
singleQuestion['isMedicalSubQuestion'] = false;
|
|
271
|
+
});
|
|
272
|
+
singlePersonObject['questionList'].forEach((question) => {
|
|
273
|
+
question['isShowQuestionInUI'] = false;
|
|
274
|
+
if (question['questionType'] === 'IMAGE TEXT') {
|
|
275
|
+
question['questionText'] = question['questionText'].replaceAll('\\n', '<br>');
|
|
276
|
+
}
|
|
277
|
+
if (question['cammundaQuestionCode'] === 'QHTF') {
|
|
278
|
+
this.medicalQuestionsFeetList = question['domainValues'];
|
|
279
|
+
this.medQuestionObj['QHTF'] = question;
|
|
280
|
+
this.medQuestionObj['QHTF']['field']['isShowLabel'] = false;
|
|
281
|
+
}
|
|
282
|
+
if (question['cammundaQuestionCode'] === 'QHTI') {
|
|
283
|
+
this.medicalQuestionsInchesList = question['domainValues'];
|
|
284
|
+
this.medQuestionObj['QHTI'] = question;
|
|
285
|
+
this.medQuestionObj['QHTI']['field']['isShowLabel'] = false;
|
|
286
|
+
}
|
|
287
|
+
if (question['questionType'] === 'DECLARATION') {
|
|
288
|
+
if (question['cammundaQuestionCode'] === 'recvSftCopy') {
|
|
289
|
+
// this.personUwAnswers[singlePersonObject['role']][] = false;
|
|
290
|
+
question['domainValues'] = [];
|
|
291
|
+
question['domainValues'].push({
|
|
292
|
+
domainInternalValue: question['questionId'],
|
|
293
|
+
domainUiValue: 'N'
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
question['domainValues'] = [];
|
|
297
|
+
question['domainValues'].push({
|
|
298
|
+
domainInternalValue: question['questionId'],
|
|
299
|
+
domainUiValue: 'Y'
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
if (question['cammundaQuestionCode'] === 'hardCopyLang') {
|
|
303
|
+
question['questionType'] = 'HARD COPY';
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
singlePersonObject['questionList'].sort((a, b) => a['step'] - b['step'] || a['displayOrder'] - b['displayOrder']);
|
|
307
|
+
}
|
|
308
|
+
let questionsListForLA = [];
|
|
309
|
+
distinctSteps.forEach((steps) => {
|
|
310
|
+
let filteredObj = singlePersonObject['questionList'].filter((singleQuestion) => singleQuestion['step'] === steps);
|
|
311
|
+
let obj = {
|
|
312
|
+
step: steps,
|
|
313
|
+
personUWId: singlePersonObject['personUWId'].toString(),
|
|
314
|
+
questions: !this.checkIfValueIsEmpty(filteredObj) ? filteredObj : [],
|
|
315
|
+
sectionName: !this.checkIfValueIsEmpty(filteredObj) ? filteredObj[0]['title'] : '',
|
|
316
|
+
isMedicalSubQuestion: false,
|
|
317
|
+
showSection: true
|
|
318
|
+
};
|
|
319
|
+
if (!this.checkIfValueIsEmpty(filteredObj)) {
|
|
320
|
+
// Hard Copy and Map question
|
|
321
|
+
let filteredHardCopyQuestion = filteredObj.filter((singleQuestion) => singleQuestion['cammundaQuestionCode'] === 'recvSftCopy');
|
|
322
|
+
if (!this.checkIfValueIsEmpty(filteredHardCopyQuestion)) {
|
|
323
|
+
obj['questions'].push({
|
|
324
|
+
questionType: "MAP",
|
|
325
|
+
isShowQuestionInUI: true,
|
|
326
|
+
parentQuestionRelation: {
|
|
327
|
+
parentQuestionId: filteredHardCopyQuestion[0]['questionId'],
|
|
328
|
+
parentQuestionAnswer: 'Y'
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
// if NRI then passport upload is required
|
|
333
|
+
let filteredNationalityQuestion = filteredObj.filter((singleQuestion) => singleQuestion['cammundaQuestionCode'] === 'Nationality');
|
|
334
|
+
if (!this.checkIfValueIsEmpty(filteredNationalityQuestion)) {
|
|
335
|
+
singlePersonObject['questionList'].push({
|
|
336
|
+
questionType: "PASSPORT_UPLOAD",
|
|
337
|
+
optionalQuestion: 'N',
|
|
338
|
+
questionText: 'Passport Details ',
|
|
339
|
+
isShowQuestionInUI: true,
|
|
340
|
+
parentQuestionRelation: {
|
|
341
|
+
parentQuestionId: filteredNationalityQuestion[0]['questionId'],
|
|
342
|
+
parentQuestionAnswer: 'forgnNational'
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
obj['questions'].push({
|
|
346
|
+
questionType: "PASSPORT_UPLOAD",
|
|
347
|
+
optionalQuestion: 'N',
|
|
348
|
+
questionText: 'Passport Details ',
|
|
349
|
+
isShowQuestionInUI: true,
|
|
350
|
+
parentQuestionRelation: {
|
|
351
|
+
parentQuestionId: filteredNationalityQuestion[0]['questionId'],
|
|
352
|
+
parentQuestionAnswer: 'forgnNational'
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
questionsListForLA.push(obj);
|
|
358
|
+
});
|
|
359
|
+
// let lifeAssuredObjectIndexInMaster: any = this.questionList.findIndex((singleObj: any) => singleObj['role'] === singlePersonObject['role']);
|
|
360
|
+
// if (lifeAssuredObjectIndexInMaster !== this.numberMinusOne) {
|
|
361
|
+
this.questionList = questionsListForLA;
|
|
362
|
+
// }
|
|
363
|
+
});
|
|
364
|
+
this.personUwResponseObj = data['questionsResponse'];
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
this.removeSubQuestionValues();
|
|
369
|
+
this.medQuestionObj['heightObjectTypes'] = {
|
|
370
|
+
"controlStyle": {},
|
|
371
|
+
"fieldName": null,
|
|
372
|
+
"label": "feet / inches",
|
|
373
|
+
"placeHolder": "",
|
|
374
|
+
"metaId": "",
|
|
375
|
+
"isVisible": true,
|
|
376
|
+
"isDisable": false,
|
|
377
|
+
"validators": {
|
|
378
|
+
"isRequired": false,
|
|
379
|
+
"requiredMessage": "This field cannot be empty",
|
|
380
|
+
"minLength": null,
|
|
381
|
+
"minLengthMessage": null,
|
|
382
|
+
"maxLength": 150,
|
|
383
|
+
"maxLengthMessage": null,
|
|
384
|
+
"pattern": null,
|
|
385
|
+
"patternMessage": ""
|
|
386
|
+
},
|
|
387
|
+
"options": [
|
|
388
|
+
{
|
|
389
|
+
"label": "Cm",
|
|
390
|
+
"value": "CM"
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
"label": "Feet",
|
|
394
|
+
"value": "FEET"
|
|
395
|
+
}
|
|
396
|
+
],
|
|
397
|
+
"cssClass": null,
|
|
398
|
+
"value": null,
|
|
399
|
+
"style": null,
|
|
400
|
+
"imageUrl": null,
|
|
401
|
+
"configData": {},
|
|
402
|
+
"metaDataObj": null,
|
|
403
|
+
"isShowLabel": false,
|
|
404
|
+
"isMasterControl": false,
|
|
405
|
+
"controlType": "select"
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
checkIfValueIsEmpty(value) {
|
|
409
|
+
if (typeof value === 'string') {
|
|
410
|
+
value = value.trim();
|
|
411
|
+
}
|
|
412
|
+
return (value === undefined ||
|
|
413
|
+
value === null ||
|
|
414
|
+
value === '' ||
|
|
415
|
+
(value instanceof Array && value.length === 0) ||
|
|
416
|
+
JSON.stringify(value) === '{}');
|
|
417
|
+
}
|
|
418
|
+
getTitleCase(header) {
|
|
419
|
+
if (header) {
|
|
420
|
+
if (this.questionHeader.includes(header.toLocaleLowerCase())) {
|
|
421
|
+
let val = header.split(' ');
|
|
422
|
+
return (val[0].toUpperCase() + ' ' + this.toTitleCase(val[1]));
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
if (header.toUpperCase() === 'FATCA DETAILS') {
|
|
426
|
+
return header;
|
|
427
|
+
}
|
|
428
|
+
return this.toTitleCase(header);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
toTitleCase(value) {
|
|
433
|
+
if (!this.checkIfValueIsEmpty(value)) {
|
|
434
|
+
return value.toString().replace(/\w\S*/g, (txt) => txt[0].toUpperCase() + txt.substr(1).toLowerCase());
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
getField(questionObj) {
|
|
438
|
+
let optionsObj = [];
|
|
439
|
+
if (questionObj['domainValues']) {
|
|
440
|
+
questionObj['domainValues'].forEach((singleOptionValue) => {
|
|
441
|
+
optionsObj.push({
|
|
442
|
+
label: singleOptionValue['domainUiValue'],
|
|
443
|
+
value: singleOptionValue['domainInternalValue'],
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
return {
|
|
448
|
+
configData: this.field()?.configData,
|
|
449
|
+
controlStyle: this.field()?.controlStyle,
|
|
450
|
+
controlType: questionObj['questionType'] === 'FREE TEXT' ? 'text' : (questionObj['questionType'] === 'RADIO BUTTON' || questionObj['questionType'] === 'ADDMORE') ? 'radio' : (questionObj['questionType'] === 'CHECKBOX' || questionObj['questionType'] === 'DECLARATION') ? 'checkbox' : questionObj['questionType'] === 'CALENDAR' ? 'date' : questionObj['questionType'] === 'DROPDOWN' ? 'select' : questionObj['questionType'] === 'DOCUPLOAD' ? 'file' : '',
|
|
451
|
+
fieldName: questionObj['cammundaQuestionCode'],
|
|
452
|
+
isDisable: false,
|
|
453
|
+
label: questionObj['questionText'],
|
|
454
|
+
placeHolder: questionObj['questionText'],
|
|
455
|
+
validators: {
|
|
456
|
+
isRequired: questionObj['optionalQuestion'] === 'N' ? true : false,
|
|
457
|
+
},
|
|
458
|
+
isVisible: true,
|
|
459
|
+
options: optionsObj,
|
|
460
|
+
isShowLabel: true,
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
removeSubQuestionValues(question) {
|
|
464
|
+
if (!this.checkIfValueIsEmpty(this.questionList)) {
|
|
465
|
+
this.questionList.forEach((singleSection) => {
|
|
466
|
+
if (!this.checkIfValueIsEmpty(singleSection['questions'])) {
|
|
467
|
+
singleSection['questions'].forEach((singleQuestion) => {
|
|
468
|
+
if (!this.showQuestion(singleQuestion)) {
|
|
469
|
+
singleQuestion['isShowQuestionInUI'] = false;
|
|
470
|
+
// if (singleQuestion['questionType'] === 'CHECKBOX' && !this.checkIfValueIsEmpty(singleQuestion['domainValues'])) {
|
|
471
|
+
// singleQuestion['domainValues'].forEach((domainValueObj: any) => {
|
|
472
|
+
// if (!this.checkIfValueIsEmpty(this.personUwAnswers[domainValueObj['domainInternalValue']])) {
|
|
473
|
+
// delete this.personUwAnswers[domainValueObj['domainInternalValue']];
|
|
474
|
+
// }
|
|
475
|
+
// });
|
|
476
|
+
// }
|
|
477
|
+
// if (singleQuestion['questionType'] !== 'CHECKBOX') {
|
|
478
|
+
if (!this.checkIfValueIsEmpty(this.personUwAnswers[singleQuestion['questionId']])) {
|
|
479
|
+
delete this.personUwAnswers[singleQuestion['questionId']];
|
|
480
|
+
}
|
|
481
|
+
// }
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
singleQuestion['isShowQuestionInUI'] = true;
|
|
485
|
+
}
|
|
486
|
+
if (singleQuestion['questionType'] === 'CHECKBOX') {
|
|
487
|
+
if (!this.checkIfValueIsEmpty(singleQuestion['domainValues'])) {
|
|
488
|
+
let isNoneInDomainValues = singleQuestion['domainValues'].filter((singleObj) => singleObj['domainUiValue'].toUpperCase() === 'NONE');
|
|
489
|
+
singleQuestion['domainValues'].forEach((singleDomainValue) => {
|
|
490
|
+
if (!this.checkIfValueIsEmpty(isNoneInDomainValues) && !this.checkIfValueIsEmpty(this.personUwAnswers[isNoneInDomainValues[0]['domainInternalValue']]) && this.personUwAnswers[isNoneInDomainValues[0]['domainInternalValue']]) {
|
|
491
|
+
// none is selected
|
|
492
|
+
singleQuestion['domainValues'].forEach((singleDomainValue) => {
|
|
493
|
+
// remove all selected checkbox questions
|
|
494
|
+
if (singleDomainValue.domainUiValue.toUpperCase() !== 'NONE') {
|
|
495
|
+
singleDomainValue.isDisabled = true;
|
|
496
|
+
delete this.personUwAnswers[singleDomainValue['domainInternalValue']];
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
singleDomainValue.isDisabled = false;
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
// let isSectionExistsInBlockedList: any = this.isBlockedQuestionsList.filter((singleBlockedObj: any) => singleBlockedObj['sectionTitle'].trim() === singleSection['sectionName'].trim());
|
|
509
|
+
// singleSection['showSection'] = !this.checkIfValueIsEmpty(singleSection['questions'].filter((singleQuestion: any) => singleQuestion['isShowQuestionInUI']))
|
|
510
|
+
// if (!this.checkIfValueIsEmpty(isSectionExistsInBlockedList)) {
|
|
511
|
+
// if (isSectionExistsInBlockedList[0].isBlockedForCustomerFlow && !this.loadingAgentportal) {
|
|
512
|
+
// singleSection['showSection'] = false;
|
|
513
|
+
// let filteredIndex: any = this.personUwResponseObj['questionsResponse'].findIndex((singlePersonObj: any) => singlePersonObj['role'] === singlePersonObj['role']);
|
|
514
|
+
// singleSection['questions'].forEach((singleQuestionObjInSection: any) => {
|
|
515
|
+
// let filteredQuestion: any = this.personUwResponseObj['questionsResponse'][filteredIndex]['questionList'].filter((singleQuestion: any) => singleQuestion['questionId'] === singleQuestionObjInSection['questionId']);
|
|
516
|
+
// if (!this.checkIfValueIsEmpty(filteredQuestion)) {
|
|
517
|
+
// filteredQuestion[0]['isShowQuestionInUI'] = singleSection['showSection'];
|
|
518
|
+
// }
|
|
519
|
+
// });
|
|
520
|
+
// }
|
|
521
|
+
// if ((isSectionExistsInBlockedList[0].isBlockedForAgentFlow || sessionStorage.getItem('agentChannel') === 'D20' || sessionStorage.getItem('agentChannel') === 'D05' || sessionStorage.getItem('agentChannel') === 'D06') && this.loadingAgentportal) {
|
|
522
|
+
// singleSection['showSection'] = false;
|
|
523
|
+
// let filteredIndex: any = this.personUwResponseObj['questionsResponse'].findIndex((singlePersonObj: any) => singlePersonObj['role'] === singlePersonObj['role']);
|
|
524
|
+
// singleSection['questions'].forEach((singleQuestionObjInSection: any) => {
|
|
525
|
+
// let filteredQuestion: any = this.personUwResponseObj['questionsResponse'][filteredIndex]['questionList'].filter((singleQuestion: any) => singleQuestion['questionId'] === singleQuestionObjInSection['questionId']);
|
|
526
|
+
// if (!this.checkIfValueIsEmpty(filteredQuestion)) {
|
|
527
|
+
// filteredQuestion[0]['isShowQuestionInUI'] = singleSection['showSection'];
|
|
528
|
+
// }
|
|
529
|
+
// });
|
|
530
|
+
// }
|
|
531
|
+
// }
|
|
532
|
+
let hiddenQuestions = this.questionList.filter((singleSectionObj) => !singleSectionObj['showSection']);
|
|
533
|
+
if (this.checkIfValueIsEmpty(hiddenQuestions)) {
|
|
534
|
+
hiddenQuestions.forEach((singleSection) => {
|
|
535
|
+
singleSection['questions'].forEach((singleQuestionObjInSection) => {
|
|
536
|
+
singleQuestionObjInSection['isShowQuestionInUI'] = false;
|
|
537
|
+
// let filteredQuestion: any = this.personUwResponseObj['questionsResponse'][0]['questionList'].filter((singleQuestion: any) => singleQuestion['questionId'] === singleQuestionObjInSection['questionId']);
|
|
538
|
+
// if (!this.checkIfValueIsEmpty(filteredQuestion)) {
|
|
539
|
+
// filteredQuestion[0]['isShowQuestionInUI'] = false;
|
|
540
|
+
// }
|
|
541
|
+
});
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
this.questionList.sort((a, b) => a['step'] - b['step']);
|
|
547
|
+
console.log('questions list', this.questionList);
|
|
548
|
+
console.log('questions answers', this.personUwAnswers);
|
|
549
|
+
}
|
|
550
|
+
showQuestion(currentQuestion) {
|
|
551
|
+
let showQuestion = false;
|
|
552
|
+
let subQuestions = [];
|
|
553
|
+
// let currentSectionIndex: any = questionsResponse['questionsResponse'].findIndex((singlePersonObj: any) => singlePersonObj['role'] === personRole)
|
|
554
|
+
// let role = this.personUwResponseObj['questionsResponse'][currentSectionIndex]['role']
|
|
555
|
+
this.personUwResponseObj[0].questionList.forEach((singleQuestion) => {
|
|
556
|
+
let isSubQuestionObject = [];
|
|
557
|
+
if (!this.checkIfValueIsEmpty(singleQuestion['questionRelation'])) {
|
|
558
|
+
isSubQuestionObject = singleQuestion['questionRelation'].filter((questionRelationObj) => questionRelationObj['nextQuestionId'] === currentQuestion['questionId']);
|
|
559
|
+
}
|
|
560
|
+
if (isSubQuestionObject.length > 0) {
|
|
561
|
+
subQuestions.push(singleQuestion);
|
|
562
|
+
isSubQuestionObject.forEach((singleSubQuestion) => {
|
|
563
|
+
if ((singleQuestion['questionType'] !== 'CHECKBOX' &&
|
|
564
|
+
(singleSubQuestion['parentQuestionValue'].toString()[0] !== '!' &&
|
|
565
|
+
this.personUwAnswers[singleQuestion['questionId']] ===
|
|
566
|
+
singleSubQuestion['parentQuestionValue'])) ||
|
|
567
|
+
(singleSubQuestion['parentQuestionValue'].toString()[0] === '!' &&
|
|
568
|
+
!this.checkIfValueIsEmpty(this.personUwAnswers[singleQuestion['questionId']]) &&
|
|
569
|
+
this.personUwAnswers[singleQuestion['questionId']] !==
|
|
570
|
+
singleSubQuestion['parentQuestionValue'].toString().split('!')[1]) ||
|
|
571
|
+
(singleQuestion['questionType'] === 'CHECKBOX' && !this.checkIfValueIsEmpty(this.personUwAnswers[singleQuestion['questionId']]) &&
|
|
572
|
+
this.personUwAnswers[singleQuestion['questionId']].filter((singleObj) => singleObj['value'] === singleSubQuestion['parentQuestionValue']).length > 0)) {
|
|
573
|
+
showQuestion = true;
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
if (this.checkIfValueIsEmpty(subQuestions) && this.checkIfValueIsEmpty(currentQuestion['parentQuestionRelation'])) {
|
|
579
|
+
showQuestion = true;
|
|
580
|
+
}
|
|
581
|
+
if (!this.checkIfValueIsEmpty(currentQuestion['parentQuestionRelation']) && !this.checkIfValueIsEmpty(currentQuestion['parentQuestionRelation']['parentQuestionId']) && !this.checkIfValueIsEmpty(this.personUwAnswers[currentQuestion['parentQuestionRelation']['parentQuestionId']]) && this.personUwAnswers[currentQuestion['parentQuestionRelation']['parentQuestionId']] === currentQuestion['parentQuestionRelation']['parentQuestionAnswer']) {
|
|
582
|
+
showQuestion = true;
|
|
583
|
+
}
|
|
584
|
+
if (currentQuestion['questionType'] === 'NODISPLAY') {
|
|
585
|
+
showQuestion = false;
|
|
586
|
+
}
|
|
587
|
+
return showQuestion;
|
|
588
|
+
}
|
|
589
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MedialQuestionsComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
590
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: MedialQuestionsComponent, isStandalone: true, selector: "lib-medial-questions", inputs: { medialQuestionResponse: { classPropertyName: "medialQuestionResponse", publicName: "medialQuestionResponse", isSignal: false, isRequired: false, transformFunction: null }, field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "addressInput", first: true, predicate: ["addressInput"], descendants: true }], ngImport: i0, template: "\r\n<div *ngFor=\"let section of questionList\">\r\n <div\r\n *ngIf=\"\r\n !checkIfValueIsEmpty(section['questions']) &&\r\n section['showSection']\r\n \"\r\n class=\"card p-3 my-2\"\r\n id=\"personUwMedicalQuestions\"\r\n >\r\n <h6 class=\"page-title\">\r\n {{ getTitleCase(section[\"sectionName\"]) }}\r\n </h6>\r\n <div *ngFor=\"let questions of section['questions']\">\r\n <!-- <div *ngIf=\"questions['questionType'] === 'IMAGE TEXT'\">\r\n <img [src]=\"questions['sampleS3Link']\" class=\"d-block mx-auto\" [alt]=\"questions['title']\">\r\n <h3 [innerHTML]=\"questions['questionText']\"></h3>\r\n </div> -->\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'FREE TEXT' &&\r\n questions['cammundaQuestionCode'] !== 'QHT' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <label class=\"card-topic d-block\"\r\n >{{ questions[\"questionText\"] }}\r\n <span\r\n *ngIf=\"\r\n questions.optionalQuestion === 'N'\r\n \"\r\n style=\"color: #ee0000\"\r\n >*</span\r\n >\r\n </label>\r\n <div class=\"col-5 px-0\">\r\n <lib-textbox [(ngModel)]=\"personUwAnswers[questions.questionId]\" [field]=\"questions['field']\" />\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'HEIGHTINPUT' &&\r\n questions['cammundaQuestionCode'] === 'QHTF' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <label class=\"card-topic d-block\"\r\n >Height\r\n <span\r\n style=\"color: #ee0000\"\r\n >*</span\r\n >\r\n </label>\r\n <div\r\n class=\"col-auto px-0 my-0 py-0 heightinput\"\r\n\r\n >\r\n <div\r\n class=\"col-7 py-0 heightInputs\"\r\n style=\"transform: translate(6px, 3px);\"\r\n *ngIf=\"\r\n personUwAnswers['medicalQuestionsHeightUnit'] === 'CM'\r\n \"\r\n >\r\n <lib-textbox [field]=\"questions['field']\" />\r\n <lib-select [(ngModel)]=\"personUwAnswers['medicalQuestionsHeightUnit']\" [field]=\"medQuestionObj['heightObjectTypes']\" />\r\n </div>\r\n <div\r\n class=\"py-0\"\r\n style=\"display: flex;\"\r\n *ngIf=\"\r\n personUwAnswers[\r\n 'medicalQuestionsHeightUnit'\r\n ] === 'FEET'\r\n \"\r\n >\r\n <div class=\"col-auto py-0 heightInputs px-1\">\r\n <lib-select [field]=\"medQuestionObj['QHTF']['field']\" />\r\n </div>\r\n <div class=\"col-auto py-0 heightInputs px-1\">\r\n <lib-select [field]=\"medQuestionObj['QHTI']['field']\" />\r\n </div>\r\n <div\r\n class=\"col-auto py-0 heightInputs px-1\"\r\n >\r\n <lib-select [(ngModel)]=\"personUwAnswers['medicalQuestionsHeightUnit']\" [field]=\"medQuestionObj['heightObjectTypes']\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"row mt-0 pt-0\"\r\n *ngIf=\"\r\n questions['questionType'] === 'MAP' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n\r\n\r\n <div class=\"map-container\">\r\n <div class=\"address-search-container mb-3\">\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6\">\r\n <label class=\"form-label\">Longitude</label>\r\n <input \r\n type=\"number\" \r\n class=\"form-control\"\r\n [(ngModel)]=\"longitude\"\r\n placeholder=\"Enter longitude\"\r\n step=\"any\"\r\n readonly\r\n >\r\n </div>\r\n <div class=\"col-6\">\r\n <label class=\"form-label\">Latitude</label>\r\n <input \r\n type=\"number\" \r\n class=\"form-control\"\r\n [(ngModel)]=\"latitude\"\r\n placeholder=\"Enter latitude\"\r\n step=\"any\"\r\n readonly\r\n >\r\n </div>\r\n </div>\r\n\r\n <input \r\n #addressInput \r\n type=\"text\" \r\n class=\"form-control\"\r\n placeholder=\"Search for address\"\r\n (keyup)=\"onAddressInputKeyup($event)\"\r\n (focus)=\"showDropdown = true\"\r\n (blur)=\"onInputBlur()\"\r\n autocomplete=\"off\"\r\n >\r\n <div \r\n *ngIf=\"showDropdown && addressSuggestions.length > 0\" \r\n class=\"autocomplete-dropdown position-absolute w-100 mt-1\"\r\n style=\"z-index: 1000; max-height: 200px; overflow-y: auto; background: white; border: 1px solid #ccc; border-radius: 4px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);\"\r\n >\r\n <div \r\n *ngFor=\"let suggestion of addressSuggestions; let i = index\"\r\n class=\"dropdown-item p-2\"\r\n style=\"cursor: pointer; border-bottom: 1px solid #eee;\"\r\n (mousedown)=\"selectAddress(suggestion)\"\r\n (mouseenter)=\"hoveredIndex = i\"\r\n [class.bg-light]=\"hoveredIndex === i\"\r\n >\r\n <div class=\"fw-bold\">{{ suggestion.main_text }}</div>\r\n <small class=\"text-muted\">{{ suggestion.secondary_text }}</small>\r\n </div>\r\n </div>\r\n <small class=\"text-muted\">Start typing to search for addresses</small>\r\n </div>\r\n <google-map [center]=\"center\" [zoom]=\"zoom\">\r\n <map-marker [position]=\"currentCoordinates\"></map-marker>\r\n </google-map>\r\n </div>\r\n </div>\r\n\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n (questions['questionType'] === 'RADIO BUTTON' ||\r\n questions['questionType'] === 'ADDMORE') &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-radio [(ngModel)]=\"personUwAnswers[questions.questionId]\" (ngModelChange)=\"removeSubQuestionValues()\" [field]=\"questions['field']\" />\r\n </div>\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'CHECKBOX' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-multiple-select [(ngModel)]=\"personUwAnswers[questions.questionId]\" (ngModelChange)=\"removeSubQuestionValues()\" [field]=\"questions['field']\" />\r\n </div>\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'DECLARATION' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-checkbox [(ngModel)]=\"personUwAnswers[questions.questionId]\" (ngModelChange)=\"removeSubQuestionValues()\" [field]=\"questions['field']\" />\r\n </div>\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'DROPDOWN' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-select [(ngModel)]=\"personUwAnswers[questions.questionId]\" [field]=\"questions['field']\" />\r\n </div>\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'CALENDAR' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-dob [(ngModel)]=\"personUwAnswers[questions.questionId]\" [field]=\"questions['field']\" />\r\n </div>\r\n\r\n <!-- <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'HEIGHTINPUT' &&\r\n questions['cammundaQuestionCode'] === 'QHTF' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n </div> -->\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'DOCUPLOAD' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-upload [field]=\"questions['field']\" />\r\n </div>\r\n\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'PASSPORT_UPLOAD' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <!-- pending -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n", styles: [".map-container{width:100%;position:relative}.address-search-container{position:relative}.address-search-container input{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;box-sizing:border-box}.address-search-container input:focus{outline:none;border-color:#4285f4;box-shadow:0 0 0 2px #4285f433}.pac-container{z-index:10000!important;border-radius:4px;border:1px solid #ddd;box-shadow:0 2px 6px #0000004d}.pac-item{padding:10px;border-bottom:1px solid #eee;cursor:pointer}.pac-item:hover{background-color:#f5f5f5}.selected-address{padding:8px;background-color:#f8f9fa;border-radius:4px;border-left:3px solid #28a745}.map-container ::ng-deep google-map>div{height:400px!important;width:auto!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: TextboxComponent, selector: "lib-textbox", inputs: ["field", "reactiveFormControlobject"] }, { kind: "component", type: RadioComponent, selector: "lib-radio", inputs: ["field"] }, { kind: "component", type: CheckboxComponent, selector: "lib-checkbox", inputs: ["field"] }, { kind: "component", type: SelectComponent, selector: "lib-select", inputs: ["field", "reactiveFormControlobject"] }, { kind: "component", type: DobComponent, selector: "lib-dob", inputs: ["field", "reactiveFormControlobject"] }, { kind: "component", type: UploadComponent, selector: "lib-upload", inputs: ["field"] }, { kind: "component", type: MultipleSelectComponent, selector: "lib-multiple-select", inputs: ["field", "reactiveFormControlobject"] }, { kind: "ngmodule", type: GoogleMapsModule }, { kind: "component", type: i3.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i3.MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged", "markerInitialized"], exportAs: ["mapMarker"] }] });
|
|
591
|
+
}
|
|
592
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MedialQuestionsComponent, decorators: [{
|
|
593
|
+
type: Component,
|
|
594
|
+
args: [{ selector: 'lib-medial-questions', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule, TextboxComponent, RadioComponent, CheckboxComponent, SelectComponent, DobComponent, UploadComponent, MultipleSelectComponent, GoogleMapsModule], template: "\r\n<div *ngFor=\"let section of questionList\">\r\n <div\r\n *ngIf=\"\r\n !checkIfValueIsEmpty(section['questions']) &&\r\n section['showSection']\r\n \"\r\n class=\"card p-3 my-2\"\r\n id=\"personUwMedicalQuestions\"\r\n >\r\n <h6 class=\"page-title\">\r\n {{ getTitleCase(section[\"sectionName\"]) }}\r\n </h6>\r\n <div *ngFor=\"let questions of section['questions']\">\r\n <!-- <div *ngIf=\"questions['questionType'] === 'IMAGE TEXT'\">\r\n <img [src]=\"questions['sampleS3Link']\" class=\"d-block mx-auto\" [alt]=\"questions['title']\">\r\n <h3 [innerHTML]=\"questions['questionText']\"></h3>\r\n </div> -->\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'FREE TEXT' &&\r\n questions['cammundaQuestionCode'] !== 'QHT' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <label class=\"card-topic d-block\"\r\n >{{ questions[\"questionText\"] }}\r\n <span\r\n *ngIf=\"\r\n questions.optionalQuestion === 'N'\r\n \"\r\n style=\"color: #ee0000\"\r\n >*</span\r\n >\r\n </label>\r\n <div class=\"col-5 px-0\">\r\n <lib-textbox [(ngModel)]=\"personUwAnswers[questions.questionId]\" [field]=\"questions['field']\" />\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'HEIGHTINPUT' &&\r\n questions['cammundaQuestionCode'] === 'QHTF' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <label class=\"card-topic d-block\"\r\n >Height\r\n <span\r\n style=\"color: #ee0000\"\r\n >*</span\r\n >\r\n </label>\r\n <div\r\n class=\"col-auto px-0 my-0 py-0 heightinput\"\r\n\r\n >\r\n <div\r\n class=\"col-7 py-0 heightInputs\"\r\n style=\"transform: translate(6px, 3px);\"\r\n *ngIf=\"\r\n personUwAnswers['medicalQuestionsHeightUnit'] === 'CM'\r\n \"\r\n >\r\n <lib-textbox [field]=\"questions['field']\" />\r\n <lib-select [(ngModel)]=\"personUwAnswers['medicalQuestionsHeightUnit']\" [field]=\"medQuestionObj['heightObjectTypes']\" />\r\n </div>\r\n <div\r\n class=\"py-0\"\r\n style=\"display: flex;\"\r\n *ngIf=\"\r\n personUwAnswers[\r\n 'medicalQuestionsHeightUnit'\r\n ] === 'FEET'\r\n \"\r\n >\r\n <div class=\"col-auto py-0 heightInputs px-1\">\r\n <lib-select [field]=\"medQuestionObj['QHTF']['field']\" />\r\n </div>\r\n <div class=\"col-auto py-0 heightInputs px-1\">\r\n <lib-select [field]=\"medQuestionObj['QHTI']['field']\" />\r\n </div>\r\n <div\r\n class=\"col-auto py-0 heightInputs px-1\"\r\n >\r\n <lib-select [(ngModel)]=\"personUwAnswers['medicalQuestionsHeightUnit']\" [field]=\"medQuestionObj['heightObjectTypes']\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"row mt-0 pt-0\"\r\n *ngIf=\"\r\n questions['questionType'] === 'MAP' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n\r\n\r\n <div class=\"map-container\">\r\n <div class=\"address-search-container mb-3\">\r\n\r\n <div class=\"row mb-3\">\r\n <div class=\"col-6\">\r\n <label class=\"form-label\">Longitude</label>\r\n <input \r\n type=\"number\" \r\n class=\"form-control\"\r\n [(ngModel)]=\"longitude\"\r\n placeholder=\"Enter longitude\"\r\n step=\"any\"\r\n readonly\r\n >\r\n </div>\r\n <div class=\"col-6\">\r\n <label class=\"form-label\">Latitude</label>\r\n <input \r\n type=\"number\" \r\n class=\"form-control\"\r\n [(ngModel)]=\"latitude\"\r\n placeholder=\"Enter latitude\"\r\n step=\"any\"\r\n readonly\r\n >\r\n </div>\r\n </div>\r\n\r\n <input \r\n #addressInput \r\n type=\"text\" \r\n class=\"form-control\"\r\n placeholder=\"Search for address\"\r\n (keyup)=\"onAddressInputKeyup($event)\"\r\n (focus)=\"showDropdown = true\"\r\n (blur)=\"onInputBlur()\"\r\n autocomplete=\"off\"\r\n >\r\n <div \r\n *ngIf=\"showDropdown && addressSuggestions.length > 0\" \r\n class=\"autocomplete-dropdown position-absolute w-100 mt-1\"\r\n style=\"z-index: 1000; max-height: 200px; overflow-y: auto; background: white; border: 1px solid #ccc; border-radius: 4px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);\"\r\n >\r\n <div \r\n *ngFor=\"let suggestion of addressSuggestions; let i = index\"\r\n class=\"dropdown-item p-2\"\r\n style=\"cursor: pointer; border-bottom: 1px solid #eee;\"\r\n (mousedown)=\"selectAddress(suggestion)\"\r\n (mouseenter)=\"hoveredIndex = i\"\r\n [class.bg-light]=\"hoveredIndex === i\"\r\n >\r\n <div class=\"fw-bold\">{{ suggestion.main_text }}</div>\r\n <small class=\"text-muted\">{{ suggestion.secondary_text }}</small>\r\n </div>\r\n </div>\r\n <small class=\"text-muted\">Start typing to search for addresses</small>\r\n </div>\r\n <google-map [center]=\"center\" [zoom]=\"zoom\">\r\n <map-marker [position]=\"currentCoordinates\"></map-marker>\r\n </google-map>\r\n </div>\r\n </div>\r\n\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n (questions['questionType'] === 'RADIO BUTTON' ||\r\n questions['questionType'] === 'ADDMORE') &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-radio [(ngModel)]=\"personUwAnswers[questions.questionId]\" (ngModelChange)=\"removeSubQuestionValues()\" [field]=\"questions['field']\" />\r\n </div>\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'CHECKBOX' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-multiple-select [(ngModel)]=\"personUwAnswers[questions.questionId]\" (ngModelChange)=\"removeSubQuestionValues()\" [field]=\"questions['field']\" />\r\n </div>\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'DECLARATION' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-checkbox [(ngModel)]=\"personUwAnswers[questions.questionId]\" (ngModelChange)=\"removeSubQuestionValues()\" [field]=\"questions['field']\" />\r\n </div>\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'DROPDOWN' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-select [(ngModel)]=\"personUwAnswers[questions.questionId]\" [field]=\"questions['field']\" />\r\n </div>\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'CALENDAR' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-dob [(ngModel)]=\"personUwAnswers[questions.questionId]\" [field]=\"questions['field']\" />\r\n </div>\r\n\r\n <!-- <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'HEIGHTINPUT' &&\r\n questions['cammundaQuestionCode'] === 'QHTF' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n </div> -->\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'DOCUPLOAD' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <lib-upload [field]=\"questions['field']\" />\r\n </div>\r\n\r\n\r\n <div\r\n class=\"\"\r\n *ngIf=\"\r\n questions['questionType'] === 'PASSPORT_UPLOAD' &&\r\n questions['isShowQuestionInUI']\r\n \"\r\n >\r\n <!-- pending -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n", styles: [".map-container{width:100%;position:relative}.address-search-container{position:relative}.address-search-container input{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;box-sizing:border-box}.address-search-container input:focus{outline:none;border-color:#4285f4;box-shadow:0 0 0 2px #4285f433}.pac-container{z-index:10000!important;border-radius:4px;border:1px solid #ddd;box-shadow:0 2px 6px #0000004d}.pac-item{padding:10px;border-bottom:1px solid #eee;cursor:pointer}.pac-item:hover{background-color:#f5f5f5}.selected-address{padding:8px;background-color:#f8f9fa;border-radius:4px;border-left:3px solid #28a745}.map-container ::ng-deep google-map>div{height:400px!important;width:auto!important}\n"] }]
|
|
595
|
+
}], ctorParameters: () => [{ type: i0.NgZone }], propDecorators: { medialQuestionResponse: [{
|
|
596
|
+
type: Input
|
|
597
|
+
}], addressInput: [{
|
|
598
|
+
type: ViewChild,
|
|
599
|
+
args: ['addressInput']
|
|
600
|
+
}] } });
|
|
601
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaWFsLXF1ZXN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXN0ZXItY29udHJvbC9zcmMvbGliL21lZGlhbC1xdWVzdGlvbnMvbWVkaWFsLXF1ZXN0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXN0ZXItY29udHJvbC9zcmMvbGliL21lZGlhbC1xdWVzdGlvbnMvbWVkaWFsLXF1ZXN0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBVSxTQUFTLEVBQXlCLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RyxPQUFPLEtBQUssaUJBQWlCLE1BQU0sa0JBQWtCLENBQUE7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7Ozs7O0FBU3ZGLE1BQU0sT0FBTyx3QkFBd0I7SUFxQ2Y7SUFwQ1gsc0JB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Ozs0RkFJN0wsd0JBQXdCO2tCQVBwQyxTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSx1QkFBdUIsRUFBRSxnQkFBZ0IsQ0FBQzsyRUFLaE0sc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNxQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHb29nbGVNYXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZ29vZ2xlLW1hcHMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCwgTmdab25lLCBBZnRlclZpZXdJbml0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBxdWVzdGlvbnNSZXNwb25zZSBmcm9tICcuL3F1ZXN0aW9ucy5qc29uJ1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVGV4dGJveENvbXBvbmVudCB9IGZyb20gJy4uL3RleHRib3gvdGV4dGJveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBSYWRpb0NvbXBvbmVudCB9IGZyb20gJy4uL3JhZGlvL3JhZGlvLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VsZWN0L3NlbGVjdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEb2JDb21wb25lbnQgfSBmcm9tICcuLi9kb2IvZG9iLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFVwbG9hZENvbXBvbmVudCB9IGZyb20gJy4uL3VwbG9hZC91cGxvYWQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTXVsdGlwbGVTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9tdWx0aXBsZS1zZWxlY3QvbXVsdGlwbGUtc2VsZWN0LmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1tZWRpYWwtcXVlc3Rpb25zJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBUZXh0Ym94Q29tcG9uZW50LCBSYWRpb0NvbXBvbmVudCwgQ2hlY2tib3hDb21wb25lbnQsIFNlbGVjdENvbXBvbmVudCwgRG9iQ29tcG9uZW50LCBVcGxvYWRDb21wb25lbnQsIE11bHRpcGxlU2VsZWN0Q29tcG9uZW50LCBHb29nbGVNYXBzTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vbWVkaWFsLXF1ZXN0aW9ucy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL21lZGlhbC1xdWVzdGlvbnMuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIE1lZGlhbFF1ZXN0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCAsIEFmdGVyVmlld0luaXR7XHJcbiAgQElucHV0KCkgbWVkaWFsUXVlc3Rpb25SZXNwb25zZTogYW55ID0gcXVlc3Rpb25zUmVzcG9uc2U7XHJcbiAgQFZpZXdDaGlsZCgnYWRkcmVzc0lucHV0JykgYWRkcmVzc0lucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBwcml2YXRlIGF1dG9jb21wbGV0ZSE6IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGU7XHJcbiAgZmllbGQgOiBhbnkgPSBpbnB1dC5yZXF1aXJlZDxhbnk+KCk7XHJcbiAgcXVlc3Rpb25MaXN0IDogYW55ID0gW107XHJcbiAgY3VycmVudENvb3JkaW5hdGVzIDogYW55ID0ge307XHJcbiAgcGVyc29uVXdSZXNwb25zZU9iaiA6IGFueSA9IFtdO1xyXG4gIGNlbnRlcjogZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbCA9IHsgbGF0OiA0MC43MzA2MSwgbG5nOiAtNzMuOTM1MjQyIH07XHJcbiAgbGF0aXR1ZGU6IGFueTtcclxuICBsb25naXR1ZGU6IGFueTtcclxuICB6b29tOmFueTtcclxuICBtYXJrZXIgOiBhbnkgPSB7fVxyXG5cclxuICBwZXJzb25Vd0Fuc3dlcnMgOiBhbnkgPSB7XHJcbiAgICBtZWRpY2FsUXVlc3Rpb25zSGVpZ2h0VW5pdDogJ0ZFRVQnLFxyXG4gIH07XHJcbiAgbWVkUXVlc3Rpb25PYmogOiBhbnkgPSB7fTtcclxuICBsaXN0T2ZEb21haW5WYWx1ZXNGb3JDaGVja0JveCA6IGFueSA9IFtdO1xyXG4gIG1lZGljYWxRdWVzdGlvbnNGZWV0TGlzdCA6IGFueSA9IFtdO1xyXG4gIG1lZGljYWxRdWVzdGlvbnNJbmNoZXNMaXN0IDogYW55ID0gW107XHJcbiAgcXVlc3Rpb25IZWFkZXI6IGFueSA9IFsnZWlhIGRldGFpbHMnLCAnYWJoYSBkZXRhaWxzJywgJ3BlcCBkZXRhaWxzJ107XHJcbiAgbWVkaWNhbFF1ZXN0aW9uc0hlaWdodFVuaXRUeXBlczogYW55ID0gW1xyXG4gICAge1xyXG4gICAgICBsYWJlbDogJ0NtJyxcclxuICAgICAgdmFsdWU6ICdDTSdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGxhYmVsOiAnRmVldCcsXHJcbiAgICAgIHZhbHVlOiAnRkVFVCdcclxuICAgIH1cclxuICBdXHJcbiAgc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbmFkZHJlc3NTdWdnZXN0aW9uczogYW55W10gPSBbXTtcclxuaG92ZXJlZEluZGV4ID0gLTE7XHJcbnNlYXJjaFRpbWVvdXQ6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoIHB1YmxpYyBuZ1pvbmU6IE5nWm9uZSkge1xyXG4gICAgY29uc29sZS5sb2coJ21lZGlhbFF1ZXN0aW9uUmVzcG9uc2VlZWVlZScsIHRoaXMubWVkaWFsUXVlc3Rpb25SZXNwb25zZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICgnZ2VvbG9jYXRpb24nIGluIG5hdmlnYXRvcikge1xyXG4gICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigocG9zaXRpb24pID0+IHtcclxuICAgICAgICAgdGhpcy5sYXRpdHVkZSA9IHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZTtcclxuICAgICAgICAgdGhpcy5sb25naXR1ZGUgPSBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlO1xyXG4gICAgICAgICB0aGlzLnpvb20gPSAxNTtcclxuICAgICAgICAgdGhpcy5jdXJyZW50Q29vcmRpbmF0ZXMgPSB7XHJcbiAgICAgICAgICBsYXQgOiB0aGlzLmxhdGl0dWRlLFxyXG4gICAgICAgICAgbG5nIDogdGhpcy5sb25naXR1ZGUsXHJcbiAgICAgICAgIH1cclxuICAgICAgICAgdGhpcy5jZW50ZXIgPSB7Li4udGhpcy5jdXJyZW50Q29vcmRpbmF0ZXN9O1xyXG4gICAgICAgfSk7XHJcbiAgICAgfVxyXG4gICAgdGhpcy5wcmVwYXJlUGVyc29uVXdRdWVzdGlvbnNPYmooKTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0aWFsaXplQXV0b2NvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAgcHJpdmF0ZSBpbml0aWFsaXplQXV0b2NvbXBsZXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hdXRvY29tcGxldGUgPSBuZXcgZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZShcclxuICAgICAgdGhpcy5hZGRyZXNzSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgIHtcclxuICAgICAgICB0eXBlczogWydhZGRyZXNzJ10sXHJcbiAgICAgICAgY29tcG9uZW50UmVzdHJpY3Rpb25zOiB7IGNvdW50cnk6ICdJTicgfSxcclxuICAgICAgICBmaWVsZHM6IFsncGxhY2VfaWQnLCAnZ2VvbWV0cnknLCAnbmFtZScsICdmb3JtYXR0ZWRfYWRkcmVzcyddXHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5hdXRvY29tcGxldGUuYWRkTGlzdGVuZXIoJ3BsYWNlX2NoYW5nZWQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vblBsYWNlU2VsZWN0ZWQoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gICBwcml2YXRlIG9uUGxhY2VTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBsYWNlID0gdGhpcy5hdXRvY29tcGxldGUuZ2V0UGxhY2UoKTtcclxuXHJcbiAgICBpZiAoIXBsYWNlLmdlb21ldHJ5IHx8ICFwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbikge1xyXG4gICAgICBjb25zb2xlLmxvZygnTm8gZGV0YWlscyBhdmFpbGFibGUgZm9yIGlucHV0OiAnLCBwbGFjZS5uYW1lKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxvY2F0aW9uID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb247XHJcbiAgICB0aGlzLmNlbnRlciA9IHtcclxuICAgICAgbGF0OiBsb2NhdGlvbi5sYXQoKSxcclxuICAgICAgbG5nOiBsb2NhdGlvbi5sbmcoKVxyXG4gICAgfTtcclxuICAgIHRoaXMuY3VycmVudENvb3JkaW5hdGVzID0gdGhpcy5jZW50ZXI7XHJcblxyXG4gICAgaWYgKHBsYWNlLmdlb21ldHJ5LnZpZXdwb3J0KSB7XHJcbiAgICAgIHRoaXMuem9vbSA9IDE1O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy56b29tID0gMTM7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIHBsYWNlOicsIHtcclxuICAgICAgbmFtZTogcGxhY2UubmFtZSxcclxuICAgICAgYWRkcmVzczogcGxhY2UuZm9ybWF0dGVkX2FkZHJlc3MsXHJcbiAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLmNlbnRlclxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdG9yZVNlbGVjdGVkQWRkcmVzcyhwbGFjZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzdG9yZVNlbGVjdGVkQWRkcmVzcyhwbGFjZTogZ29vZ2xlLm1hcHMucGxhY2VzLlBsYWNlUmVzdWx0KTogdm9pZCB7XHJcbiAgICBjb25zdCBhZGRyZXNzRGF0YSA9IHtcclxuICAgICAgcGxhY2VJZDogcGxhY2UucGxhY2VfaWQsXHJcbiAgICAgIG5hbWU6IHBsYWNlLm5hbWUsXHJcbiAgICAgIGZvcm1hdHRlZEFkZHJlc3M6IHBsYWNlLmZvcm1hdHRlZF9hZGRyZXNzLFxyXG4gICAgICBjb29yZGluYXRlczogdGhpcy5jZW50ZXJcclxuICAgIH07XHJcblxyXG4gIH1cclxuXHJcbiAgIHNlYXJjaEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xyXG5cclxuICAgIGdlb2NvZGVyLmdlb2NvZGUoeyBhZGRyZXNzOiBhZGRyZXNzIH0sIChyZXN1bHRzLCBzdGF0dXMpID0+IHtcclxuICAgICAgaWYgKHN0YXR1cyA9PT0gJ09LJyAmJiByZXN1bHRzICYmIHJlc3VsdHNbMF0pIHtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHJlc3VsdHNbMF0uZ2VvbWV0cnkubG9jYXRpb247XHJcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2VudGVyID0ge1xyXG4gICAgICAgICAgICBsYXQ6IGxvY2F0aW9uLmxhdCgpLFxyXG4gICAgICAgICAgICBsbmc6IGxvY2F0aW9uLmxuZygpXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q29vcmRpbmF0ZXMgPSB0aGlzLmNlbnRlcjtcclxuICAgICAgICAgIHRoaXMuem9vbSA9IDE1O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdHZW9jb2RlIHdhcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb246ICcgKyBzdGF0dXMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQWRkcmVzc0lucHV0S2V5dXAoZXZlbnQ6IGFueSkge1xyXG4gIGNvbnN0IHF1ZXJ5ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG5cclxuICAvLyBDbGVhciBwcmV2aW91cyB0aW1lb3V0XHJcbiAgaWYgKHRoaXMuc2VhcmNoVGltZW91dCkge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoVGltZW91dCk7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgYXJyb3cga2V5IG5hdmlnYXRpb25cclxuICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xyXG4gICAgdGhpcy5ob3ZlcmVkSW5kZXggPSBNYXRoLm1pbih0aGlzLmhvdmVyZWRJbmRleCArIDEsIHRoaXMuYWRkcmVzc1N1Z2dlc3Rpb25zLmxlbmd0aCAtIDEpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcclxuICAgIHRoaXMuaG92ZXJlZEluZGV4ID0gTWF0aC5tYXgodGhpcy5ob3ZlcmVkSW5kZXggLSAxLCAtMSk7XHJcbiAgICByZXR1cm47XHJcbiAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcclxuICAgIGlmICh0aGlzLmhvdmVyZWRJbmRleCA+PSAwICYmIHRoaXMuYWRkcmVzc1N1Z2dlc3Rpb25zW3RoaXMuaG92ZXJlZEluZGV4XSkge1xyXG4gICAgICB0aGlzLnNlbGVjdEFkZHJlc3ModGhpcy5hZGRyZXNzU3VnZ2VzdGlvbnNbdGhpcy5ob3ZlcmVkSW5kZXhdKTtcclxuICAgIH1cclxuICAgIHJldHVybjtcclxuICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcclxuICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBpZiAocXVlcnkubGVuZ3RoIDwgMikge1xyXG4gICAgdGhpcy5hZGRyZXNzU3VnZ2VzdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICB0aGlzLnNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIHRoaXMuc2VhcmNoQWRkcmVzc2VzKHF1ZXJ5KTtcclxuICB9LCAzMDApO1xyXG59XHJcblxyXG5zZWFyY2hBZGRyZXNzZXMocXVlcnk6IHN0cmluZykge1xyXG4gIC8vIFJlcGxhY2UgdGhpcyB3aXRoIHlvdXIgYWN0dWFsIGFkZHJlc3Mgc2VhcmNoIEFQSSBjYWxsXHJcbiAgLy8gRm9yIGV4YW1wbGUsIHVzaW5nIEdvb2dsZSBQbGFjZXMgQVBJOlxyXG5cclxuICBjb25zdCBzZXJ2aWNlID0gbmV3IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVTZXJ2aWNlKCk7XHJcbiAgc2VydmljZS5nZXRQbGFjZVByZWRpY3Rpb25zKFxyXG4gICAge1xyXG4gICAgICBpbnB1dDogcXVlcnksXHJcbiAgICAgIHR5cGVzOiBbJ2FkZHJlc3MnXVxyXG4gICAgfSxcclxuICAgIChwcmVkaWN0aW9ucywgc3RhdHVzKSA9PiB7XHJcbiAgICAgIGlmIChzdGF0dXMgPT09IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZXNTZXJ2aWNlU3RhdHVzLk9LICYmIHByZWRpY3Rpb25zKSB7XHJcbiAgICAgICAgdGhpcy5hZGRyZXNzU3VnZ2VzdGlvbnMgPSBwcmVkaWN0aW9ucy5tYXAocHJlZGljdGlvbiA9PiAoe1xyXG4gICAgICAgICAgcGxhY2VfaWQ6IHByZWRpY3Rpb24ucGxhY2VfaWQsXHJcbiAgICAgICAgICBtYWluX3RleHQ6IHByZWRpY3Rpb24uc3RydWN0dXJlZF9mb3JtYXR0aW5nLm1haW5fdGV4dCxcclxuICAgICAgICAgIHNlY29uZGFyeV90ZXh0OiBwcmVkaWN0aW9uLnN0cnVjdHVyZWRfZm9ybWF0dGluZy5zZWNvbmRhcnlfdGV4dCxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwcmVkaWN0aW9uLmRlc2NyaXB0aW9uXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmhvdmVyZWRJbmRleCA9IC0xO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWRkcmVzc1N1Z2dlc3Rpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICk7XHJcbn1cclxuXHJcbnNlbGVjdEFkZHJlc3Moc3VnZ2VzdGlvbjogYW55KSB7XHJcbiAgY29uc3QgYWRkcmVzc0lucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FkZHJlc3NJbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgaWYgKGFkZHJlc3NJbnB1dCkge1xyXG4gICAgYWRkcmVzc0lucHV0LnZhbHVlID0gc3VnZ2VzdGlvbi5kZXNjcmlwdGlvbjtcclxuICB9XHJcblxyXG4gIGNvbnN0IHNlcnZpY2UgPSBuZXcgZ29vZ2xlLm1hcHMucGxhY2VzLlBsYWNlc1NlcnZpY2UoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xyXG4gIHNlcnZpY2UuZ2V0RGV0YWlscyhcclxuICAgIHtcclxuICAgICAgcGxhY2VJZDogc3VnZ2VzdGlvbi5wbGFjZV9pZCxcclxuICAgICAgZmllbGRzOiBbJ2dlb21ldHJ5JywgJ2Zvcm1hdHRlZF9hZGRyZXNzJ11cclxuICAgIH0sXHJcbiAgICAocGxhY2UsIHN0YXR1cykgPT4ge1xyXG4gICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5wbGFjZXMuUGxhY2VzU2VydmljZVN0YXR1cy5PSyAmJiBwbGFjZSkge1xyXG4gICAgICAgIGNvbnN0IGxhdCA9IHBsYWNlLmdlb21ldHJ5Py5sb2NhdGlvbj8ubGF0KCk7XHJcbiAgICAgICAgY29uc3QgbG5nID0gcGxhY2UuZ2VvbWV0cnk/LmxvY2F0aW9uPy5sbmcoKTtcclxuXHJcbiAgICAgICAgaWYgKGxhdCAhPT0gdW5kZWZpbmVkICYmIGxuZyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvbmdpdHVkZSA9IGxuZztcclxuICAgICAgICAgIHRoaXMubGF0aXR1ZGUgPSBsYXQ7XHJcblxyXG4gICAgICAgICAgdGhpcy5jZW50ZXIgPSB7IGxhdCwgbG5nIH07XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDb29yZGluYXRlcyA9IHRoaXMuY2VudGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICk7XHJcblxyXG4gIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbiAgdGhpcy5hZGRyZXNzU3VnZ2VzdGlvbnMgPSBbXTtcclxufVxyXG5cclxub25JbnB1dEJsdXIoKSB7XHJcbiAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG4gIH0sIDIwMCk7XHJcbn1cclxuXHJcbiAgcHJlcGFyZVBlcnNvblV3UXVlc3Rpb25zT2JqKCkge1xyXG4gICAgdGhpcy5xdWVzdGlvbkxpc3QgPSBbXTtcclxuICAgIGxldCBkYXRhIDogYW55ID0gcXVlc3Rpb25zUmVzcG9uc2U7XHJcbiAgICB0aGlzLmxpc3RPZkRvbWFpblZhbHVlc0ZvckNoZWNrQm94ID0gW107XHJcblxyXG5cclxuICAgIGlmICghdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KGRhdGFbJ3F1ZXN0aW9uc1Jlc3BvbnNlJ10pKSB7XHJcbiAgICAgIGxldCBwZXJzb25Vd0lkQXJyYXk6IGFueSA9IFtdO1xyXG4gICAgICBkYXRhWydxdWVzdGlvbnNSZXNwb25zZSddLmZvckVhY2goKHNpbmdsZVF1ZXN0aW9uT2JqOiBhbnkpID0+IHtcclxuICAgICAgICBwZXJzb25Vd0lkQXJyYXkucHVzaChzaW5nbGVRdWVzdGlvbk9ialsncGVyc29uVVdJZCddKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuY2hlY2tJZlZhbHVlSXNFbXB0eShkYXRhKSAmJiAhdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KGRhdGFbJ3F1ZXN0aW9uc1Jlc3BvbnNlJ10pKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KGRhdGFbJ3F1ZXN0aW9uc1Jlc3BvbnNlJ10pKSB7XHJcbiAgICAgICAgICBsZXQgZGlzdGluY3RTdGVwczogYW55ID0gW107XHJcbiAgICAgICAgICBkYXRhWydxdWVzdGlvbnNSZXNwb25zZSddLmZvckVhY2goKHNpbmdsZVBlcnNvbk9iamVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KHNpbmdsZVBlcnNvbk9iamVjdFsncXVlc3Rpb25MaXN0J10pKSB7XHJcbiAgICAgICAgICAgICAgc2luZ2xlUGVyc29uT2JqZWN0WydxdWVzdGlvbkxpc3QnXS5mb3JFYWNoKChzaW5nbGVRdWVzdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzaW5nbGVRdWVzdGlvblsnZG9tYWluVmFsdWVzJ10gPSBkYXRhWydkb21haW5WYWx1ZXMnXVtzaW5nbGVRdWVzdGlvblsnZG9tYWluTmFtZSddXTtcclxuXHJcbiAgICAgICAgICAgICAgICBzaW5nbGVRdWVzdGlvblsnZmllbGQnXSA9IHRoaXMuZ2V0RmllbGQoc2luZ2xlUXVlc3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaW5nbGVRdWVzdGlvblsnY2FtbXVuZGFRdWVzdGlvbkNvZGUnXSA9PT0gJ1BBTicpIHtcclxuICAgICAgICAgICAgICAgICAgc2luZ2xlUXVlc3Rpb25bJ3ZhbGlkYXRpb25zJ10gPSAne1wiVHlwZVwiOlwiQWxwaGFOdW1lcmljXCIsXCJNaW5WYWx1ZVwiOlwiMTBcIixcIk1heFZhbHVlXCI6XCIxMFwiLFwicmVnZXhQYXR0ZXJuXCI6XCIvXihbYS16QS1aXSl7NX0oWzAtOV0pezR9KFthLXpBLVpdKXsxfT8kL1wifSc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoc2luZ2xlUXVlc3Rpb25bJ2NhbW11bmRhUXVlc3Rpb25Db2RlJ10gPT09ICdGdGNhQ250Y0RldGxzJykge1xyXG4gICAgICAgICAgICAgICAgLy8gICBzaW5nbGVRdWVzdGlvblsndmFsaWRhdGlvbnMnXSA9ICd7XCJjdXN0b21WYWxpZGF0aW9uXCI6W3tcImNvdW50cnlcIjpcIklOXCIsXCJNaW5WYWx1ZVwiOlwiMTBcIixcIk1heFZhbHVlXCI6XCIxMFwiLFwicmVnZXhQYXR0ZXJuXCI6XCIoKF5bNi05XSl7MX0oWzAtOV0pezl9JClcIn0se1wiY291bnRyeVwiOlwiT1RIRVJcIixcIk1pblZhbHVlXCI6XCI1XCIsXCJNYXhWYWx1ZVwiOlwiMTRcIn1dfSc7XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIHNpbmdsZVF1ZXN0aW9uWydxdWVzdGlvblR5cGUnXSA9PT0gJ0NIRUNLQk9YJyAmJlxyXG4gICAgICAgICAgICAgICAgICAhdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KHNpbmdsZVF1ZXN0aW9uWydxdWVzdGlvblJlbGF0aW9uJ10pXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgc2luZ2xlUXVlc3Rpb25bJ3F1ZXN0aW9uUmVsYXRpb24nXS5mb3JFYWNoKChzaW5nbGVRdWVzdGlvblJlbGF0aW9uT2JqOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFF1ZXN0aW9uT2JqZWN0OiBhbnkgPSBzaW5nbGVQZXJzb25PYmplY3RbJ3F1ZXN0aW9uTGlzdCddLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAgIChvYmplY3Q6IGFueSkgPT4gb2JqZWN0WydxdWVzdGlvbklkJ10gPT09IHNpbmdsZVF1ZXN0aW9uUmVsYXRpb25PYmpbJ25leHRRdWVzdGlvbklkJ11cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UXVlc3Rpb25PYmplY3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFF1ZXN0aW9uT2JqZWN0WzBdWydhbnN3ZXJlZFZhbHVlJ10gPSBzaW5nbGVRdWVzdGlvblJlbGF0aW9uT2JqWydwYXJlbnRRdWVzdGlvblZhbHVlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlUXVlc3Rpb25bJ3F1ZXN0aW9uVHlwZSddID09PSAnQ0hFQ0tCT1gnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KHNpbmdsZVF1ZXN0aW9uWydkb21haW5OYW1lJ10pICYmICF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkoZGF0YVsnZG9tYWluVmFsdWVzJ11bc2luZ2xlUXVlc3Rpb25bJ2RvbWFpbk5hbWUnXV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YVsnZG9tYWluVmFsdWVzJ11bc2luZ2xlUXVlc3Rpb25bJ2RvbWFpbk5hbWUnXV0uZm9yRWFjaCgoc2luZ2xlRG9tYWluVmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkoc2luZ2xlRG9tYWluVmFsdWVbJ2RvbWFpbkludGVybmFsVmFsdWUnXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0T2ZEb21haW5WYWx1ZXNGb3JDaGVja0JveC5wdXNoKHNpbmdsZURvbWFpblZhbHVlWydkb21haW5JbnRlcm5hbFZhbHVlJ10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFkaXN0aW5jdFN0ZXBzLmluY2x1ZGVzKHNpbmdsZVF1ZXN0aW9uWydzdGVwJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRpc3RpbmN0U3RlcHMucHVzaChzaW5nbGVRdWVzdGlvblsnc3RlcCddKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzaW5nbGVRdWVzdGlvblsnaXNNZWRpY2FsU3ViUXVlc3Rpb24nXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICBzaW5nbGVQZXJzb25PYmplY3RbJ3F1ZXN0aW9uTGlzdCddLmZvckVhY2goKHF1ZXN0aW9uOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uWydpc1Nob3dRdWVzdGlvbkluVUknXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXN0aW9uWydxdWVzdGlvblR5cGUnXSA9PT0gJ0lNQUdFIFRFWFQnKSB7XHJcbiAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uWydxdWVzdGlvblRleHQnXSA9IHF1ZXN0aW9uWydxdWVzdGlvblRleHQnXS5yZXBsYWNlQWxsKCdcXFxcbicsICc8YnI+Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXN0aW9uWydjYW1tdW5kYVF1ZXN0aW9uQ29kZSddID09PSAnUUhURicpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpY2FsUXVlc3Rpb25zRmVldExpc3QgPSBxdWVzdGlvblsnZG9tYWluVmFsdWVzJ107XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubWVkUXVlc3Rpb25PYmpbJ1FIVEYnXSA9IHF1ZXN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lZFF1ZXN0aW9uT2JqWydRSFRGJ11bJ2ZpZWxkJ11bJ2lzU2hvd0xhYmVsJ10gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocXVlc3Rpb25bJ2NhbW11bmRhUXVlc3Rpb25Db2RlJ10gPT09ICdRSFRJJykge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLm1lZGljYWxRdWVzdGlvbnNJbmNoZXNMaXN0ID0gcXVlc3Rpb25bJ2RvbWFpblZhbHVlcyddXHJcbiAgICAgICAgICAgICAgICAgICB0aGlzLm1lZFF1ZXN0aW9uT2JqWydRSFRJJ10gPSBxdWVzdGlvbjtcclxuICAgICAgICAgICAgICAgICAgIHRoaXMubWVkUXVlc3Rpb25PYmpbJ1FIVEknXVsnZmllbGQnXVsnaXNTaG93TGFiZWwnXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChxdWVzdGlvblsncXVlc3Rpb25UeXBlJ10gPT09ICdERUNMQVJBVElPTicpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmIChxdWVzdGlvblsnY2FtbXVuZGFRdWVzdGlvbkNvZGUnXSA9PT0gJ3JlY3ZTZnRDb3B5Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMucGVyc29uVXdBbnN3ZXJzW3NpbmdsZVBlcnNvbk9iamVjdFsncm9sZSddXVtdID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25bJ2RvbWFpblZhbHVlcyddID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25bJ2RvbWFpblZhbHVlcyddLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgZG9tYWluSW50ZXJuYWxWYWx1ZTogcXVlc3Rpb25bJ3F1ZXN0aW9uSWQnXSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRvbWFpblVpVmFsdWU6ICdOJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uWydkb21haW5WYWx1ZXMnXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICBxdWVzdGlvblsnZG9tYWluVmFsdWVzJ10ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9tYWluSW50ZXJuYWxWYWx1ZTogcXVlc3Rpb25bJ3F1ZXN0aW9uSWQnXSxcclxuICAgICAgICAgICAgICAgICAgICBkb21haW5VaVZhbHVlOiAnWSdcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXN0aW9uWydjYW1tdW5kYVF1ZXN0aW9uQ29kZSddID09PSAnaGFyZENvcHlMYW5nJykge1xyXG4gICAgICAgICAgICAgICAgICBxdWVzdGlvblsncXVlc3Rpb25UeXBlJ10gPSAnSEFSRCBDT1BZJztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICBzaW5nbGVQZXJzb25PYmplY3RbJ3F1ZXN0aW9uTGlzdCddLnNvcnQoXHJcbiAgICAgICAgICAgICAgICAoYTogYW55LCBiOiBhbnkpID0+IGFbJ3N0ZXAnXSAtIGJbJ3N0ZXAnXSB8fCBhWydkaXNwbGF5T3JkZXInXSAtIGJbJ2Rpc3BsYXlPcmRlciddXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGxldCBxdWVzdGlvbnNMaXN0Rm9yTEE6IGFueSA9IFtdO1xyXG4gICAgICAgICAgICBkaXN0aW5jdFN0ZXBzLmZvckVhY2goKHN0ZXBzOiBhbnkpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkT2JqOiBhbnkgPSBzaW5nbGVQZXJzb25PYmplY3RbJ3F1ZXN0aW9uTGlzdCddLmZpbHRlcigoc2luZ2xlUXVlc3Rpb246IGFueSkgPT4gc2luZ2xlUXVlc3Rpb25bJ3N0ZXAnXSA9PT0gc3RlcHMpO1xyXG4gICAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHtcclxuICAgICAgICAgICAgICAgIHN0ZXA6IHN0ZXBzLFxyXG4gICAgICAgICAgICAgICAgcGVyc29uVVdJZDogc2luZ2xlUGVyc29uT2JqZWN0WydwZXJzb25VV0lkJ10udG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uczogIXRoaXMuY2hlY2tJZlZhbHVlSXNFbXB0eShmaWx0ZXJlZE9iaikgPyBmaWx0ZXJlZE9iaiA6IFtdLFxyXG4gICAgICAgICAgICAgICAgc2VjdGlvbk5hbWU6ICF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkoZmlsdGVyZWRPYmopID8gZmlsdGVyZWRPYmpbMF1bJ3RpdGxlJ10gOiAnJyxcclxuICAgICAgICAgICAgICAgIGlzTWVkaWNhbFN1YlF1ZXN0aW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHNob3dTZWN0aW9uOiB0cnVlXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tJZlZhbHVlSXNFbXB0eShmaWx0ZXJlZE9iaikpIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhcmQgQ29weSBhbmQgTWFwIHF1ZXN0aW9uXHJcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyZWRIYXJkQ29weVF1ZXN0aW9uOiBhbnkgPSBmaWx0ZXJlZE9iai5maWx0ZXIoKHNpbmdsZVF1ZXN0aW9uOiBhbnkpID0+IHNpbmdsZVF1ZXN0aW9uWydjYW1tdW5kYVF1ZXN0aW9uQ29kZSddID09PSAncmVjdlNmdENvcHknKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KGZpbHRlcmVkSGFyZENvcHlRdWVzdGlvbikpIHtcclxuICAgICAgICAgICAgICAgICAgb2JqWydxdWVzdGlvbnMnXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvblR5cGU6IFwiTUFQXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNTaG93UXVlc3Rpb25JblVJOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFF1ZXN0aW9uUmVsYXRpb246IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFF1ZXN0aW9uSWQ6IGZpbHRlcmVkSGFyZENvcHlRdWVzdGlvblswXVsncXVlc3Rpb25JZCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFyZW50UXVlc3Rpb25BbnN3ZXI6ICdZJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiBOUkkgdGhlbiBwYXNzcG9ydCB1cGxvYWQgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJlZE5hdGlvbmFsaXR5UXVlc3Rpb246IGFueSA9IGZpbHRlcmVkT2JqLmZpbHRlcigoc2luZ2xlUXVlc3Rpb246IGFueSkgPT4gc2luZ2xlUXVlc3Rpb25bJ2NhbW11bmRhUXVlc3Rpb25Db2RlJ10gPT09ICdOYXRpb25hbGl0eScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkoZmlsdGVyZWROYXRpb25hbGl0eVF1ZXN0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICBzaW5nbGVQZXJzb25PYmplY3RbJ3F1ZXN0aW9uTGlzdCddLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uVHlwZTogXCJQQVNTUE9SVF9VUExPQURcIixcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbFF1ZXN0aW9uOiAnTicsXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25UZXh0OiAnUGFzc3BvcnQgRGV0YWlscyAnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzU2hvd1F1ZXN0aW9uSW5VSTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRRdWVzdGlvblJlbGF0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRRdWVzdGlvbklkOiBmaWx0ZXJlZE5hdGlvbmFsaXR5UXVlc3Rpb25bMF1bJ3F1ZXN0aW9uSWQnXSxcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFF1ZXN0aW9uQW5zd2VyOiAnZm9yZ25OYXRpb25hbCdcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICBvYmpbJ3F1ZXN0aW9ucyddLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uVHlwZTogXCJQQVNTUE9SVF9VUExPQURcIixcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbFF1ZXN0aW9uOiAnTicsXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25UZXh0OiAnUGFzc3BvcnQgRGV0YWlscyAnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzU2hvd1F1ZXN0aW9uSW5VSTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRRdWVzdGlvblJlbGF0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRRdWVzdGlvbklkOiBmaWx0ZXJlZE5hdGlvbmFsaXR5UXVlc3Rpb25bMF1bJ3F1ZXN0aW9uSWQnXSxcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFF1ZXN0aW9uQW5zd2VyOiAnZm9yZ25OYXRpb25hbCdcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBxdWVzdGlvbnNMaXN0Rm9yTEEucHVzaChvYmopO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gbGV0IGxpZmVBc3N1cmVkT2JqZWN0SW5kZXhJbk1hc3RlcjogYW55ID0gdGhpcy5xdWVzdGlvbkxpc3QuZmluZEluZGV4KChzaW5nbGVPYmo6IGFueSkgPT4gc2luZ2xlT2JqWydyb2xlJ10gPT09IHNpbmdsZVBlcnNvbk9iamVjdFsncm9sZSddKTtcclxuICAgICAgICAgICAgLy8gaWYgKGxpZmVBc3N1cmVkT2JqZWN0SW5kZXhJbk1hc3RlciAhPT0gdGhpcy5udW1iZXJNaW51c09uZSkge1xyXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uTGlzdCA9IHF1ZXN0aW9uc0xpc3RGb3JMQTtcclxuICAgICAgICAgICAgLy8gfVxyXG5cclxuXHJcblxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnBlcnNvblV3UmVzcG9uc2VPYmogPSBkYXRhWydxdWVzdGlvbnNSZXNwb25zZSddO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbW92ZVN1YlF1ZXN0aW9uVmFsdWVzKCk7XHJcblxyXG4gICAgdGhpcy5tZWRRdWVzdGlvbk9ialsnaGVpZ2h0T2JqZWN0VHlwZXMnXSA9IHtcclxuICAgICAgXCJjb250cm9sU3R5bGVcIjoge30sXHJcbiAgICAgIFwiZmllbGROYW1lXCI6IG51bGwsXHJcbiAgICAgIFwibGFiZWxcIjogXCJmZWV0IC8gaW5jaGVzXCIsXHJcbiAgICAgIFwicGxhY2VIb2xkZXJcIjogXCJcIixcclxuICAgICAgXCJtZXRhSWRcIjogXCJcIixcclxuICAgICAgXCJpc1Zpc2libGVcIjogdHJ1ZSxcclxuICAgICAgXCJpc0Rpc2FibGVcIjogZmFsc2UsXHJcbiAgICAgIFwidmFsaWRhdG9yc1wiOiB7XHJcbiAgICAgICAgXCJpc1JlcXVpcmVkXCI6IGZhbHNlLFxyXG4gICAgICAgIFwicmVxdWlyZWRNZXNzYWdlXCI6IFwiVGhpcyBmaWVsZCBjYW5ub3QgYmUgZW1wdHlcIixcclxuICAgICAgICBcIm1pbkxlbmd0aFwiOiBudWxsLFxyXG4gICAgICAgIFwibWluTGVuZ3RoTWVzc2FnZVwiOiBudWxsLFxyXG4gICAgICAgIFwibWF4TGVuZ3RoXCI6IDE1MCxcclxuICAgICAgICBcIm1heExlbmd0aE1lc3NhZ2VcIjogbnVsbCxcclxuICAgICAgICBcInBhdHRlcm5cIjogbnVsbCxcclxuICAgICAgICBcInBhdHRlcm5NZXNzYWdlXCI6IFwiXCJcclxuICAgICAgfSxcclxuICAgICAgXCJvcHRpb25zXCI6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBcImxhYmVsXCI6IFwiQ21cIixcclxuICAgICAgICAgIFwidmFsdWVcIjogXCJDTVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBcImxhYmVsXCI6IFwiRmVldFwiLFxyXG4gICAgICAgICAgXCJ2YWx1ZVwiOiBcIkZFRVRcIlxyXG4gICAgICAgIH1cclxuICAgICAgXSxcclxuICAgICAgXCJjc3NDbGFzc1wiOiBudWxsLFxyXG4gICAgICBcInZhbHVlXCI6IG51bGwsXHJcbiAgICAgIFwic3R5bGVcIjogbnVsbCxcclxuICAgICAgXCJpbWFnZVVybFwiOiBudWxsLFxyXG4gICAgICBcImNvbmZpZ0RhdGFcIjoge30sXHJcbiAgICAgIFwibWV0YURhdGFPYmpcIjogbnVsbCxcclxuICAgICAgXCJpc1Nob3dMYWJlbFwiOiBmYWxzZSxcclxuICAgICAgXCJpc01hc3RlckNvbnRyb2xcIjogZmFsc2UsXHJcbiAgICAgIFwiY29udHJvbFR5cGVcIjogXCJzZWxlY3RcIlxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGNoZWNrSWZWYWx1ZUlzRW1wdHkodmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XHJcblxyXG4gICAgfVxyXG4gICAgcmV0dXJuIChcclxuICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxyXG4gICAgICB2YWx1ZSA9PT0gJycgfHxcclxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB8fFxyXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgPT09ICd7fSdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRUaXRsZUNhc2UoaGVhZGVyOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKGhlYWRlcikge1xyXG4gICAgICBpZiAodGhpcy5xdWVzdGlvbkhlYWRlci5pbmNsdWRlcyhoZWFkZXIudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHtcclxuICAgICAgICBsZXQgdmFsID0gaGVhZGVyLnNwbGl0KCcgJyk7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIHZhbFswXS50b1VwcGVyQ2FzZSgpICsgJyAnICsgdGhpcy50b1RpdGxlQ2FzZSh2YWxbMV0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZihoZWFkZXIudG9VcHBlckNhc2UoKSA9PT0gJ0ZBVENBIERFVEFJTFMnKXtcclxuICAgICAgICAgIHJldHVybiBoZWFkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRvVGl0bGVDYXNlKGhlYWRlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvVGl0bGVDYXNlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKFxyXG4gICAgICAgIC9cXHdcXFMqL2csXHJcbiAgICAgICAgKHR4dDogYW55KSA9PiB0eHRbMF0udG9VcHBlckNhc2UoKSArIHR4dC5zdWJzdHIoMSkudG9Mb3dlckNhc2UoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGQocXVlc3Rpb25PYmogOiBhbnkpIHtcclxuICAgIGxldCBvcHRpb25zT2JqIDogYW55ID0gW107XHJcbiAgICBpZihxdWVzdGlvbk9ialsnZG9tYWluVmFsdWVzJ10pIHtcclxuICAgICAgcXVlc3Rpb25PYmpbJ2RvbWFpblZhbHVlcyddLmZvckVhY2goKHNpbmdsZU9wdGlvblZhbHVlIDogYW55KSA9PiB7XHJcbiAgICAgICAgb3B0aW9uc09iai5wdXNoKHtcclxuICAgICAgICAgIGxhYmVsIDogc2luZ2xlT3B0aW9uVmFsdWVbJ2RvbWFpblVpVmFsdWUnXSxcclxuICAgICAgICAgIHZhbHVlIDogc2luZ2xlT3B0aW9uVmFsdWVbJ2RvbWFpbkludGVybmFsVmFsdWUnXSxcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjb25maWdEYXRhIDogdGhpcy5maWVsZCgpPy5jb25maWdEYXRhLFxyXG4gICAgICBjb250cm9sU3R5bGU6IHRoaXMuZmllbGQoKT8uY29udHJvbFN0eWxlLFxyXG4gICAgICBjb250cm9sVHlwZTogcXVlc3Rpb25PYmpbJ3F1ZXN0aW9uVHlwZSddID09PSAnRlJFRSBURVhUJyA/ICd0ZXh0JyA6ICAocXVlc3Rpb25PYmpbJ3F1ZXN0aW9uVHlwZSddID09PSAnUkFESU8gQlVUVE9OJyB8fCBxdWVzdGlvbk9ialsncXVlc3Rpb25UeXBlJ10gPT09ICdBRERNT1JFJyk/ICdyYWRpbycgOiAocXVlc3Rpb25PYmpbJ3F1ZXN0aW9uVHlwZSddID09PSAnQ0hFQ0tCT1gnIHx8IHF1ZXN0aW9uT2JqWydxdWVzdGlvblR5cGUnXSA9PT0gJ0RFQ0xBUkFUSU9OJykgPyAnY2hlY2tib3gnIDogcXVlc3Rpb25PYmpbJ3F1ZXN0aW9uVHlwZSddID09PSAnQ0FMRU5EQVInID8gJ2RhdGUnIDogcXVlc3Rpb25PYmpbJ3F1ZXN0aW9uVHlwZSddID09PSAnRFJPUERPV04nID8gJ3NlbGVjdCcgOiBxdWVzdGlvbk9ialsncXVlc3Rpb25UeXBlJ10gPT09ICdET0NVUExPQUQnID8gJ2ZpbGUnIDogJycsXHJcbiAgICAgIGZpZWxkTmFtZSA6IHF1ZXN0aW9uT2JqWydjYW1tdW5kYVF1ZXN0aW9uQ29kZSddLFxyXG4gICAgICBpc0Rpc2FibGUgOiBmYWxzZSxcclxuICAgICAgbGFiZWwgOiBxdWVzdGlvbk9ialsncXVlc3Rpb25UZXh0J10sXHJcbiAgICAgIHBsYWNlSG9sZGVyIDogcXVlc3Rpb25PYmpbJ3F1ZXN0aW9uVGV4dCddLFxyXG4gICAgICB2YWxpZGF0b3JzIDoge1xyXG4gICAgICAgIGlzUmVxdWlyZWQgOiBxdWVzdGlvbk9ialsnb3B0aW9uYWxRdWVzdGlvbiddID09PSAnTicgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIGlzVmlzaWJsZSA6IHRydWUsXHJcbiAgICAgIG9wdGlvbnMgOiBvcHRpb25zT2JqLFxyXG4gICAgICBpc1Nob3dMYWJlbCA6IHRydWUsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVTdWJRdWVzdGlvblZhbHVlcyhxdWVzdGlvbj86IGFueSkge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkodGhpcy5xdWVzdGlvbkxpc3QpKSB7XHJcbiAgICAgIHRoaXMucXVlc3Rpb25MaXN0LmZvckVhY2goKHNpbmdsZVNlY3Rpb246IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KHNpbmdsZVNlY3Rpb25bJ3F1ZXN0aW9ucyddKSkge1xyXG4gICAgICAgICAgc2luZ2xlU2VjdGlvblsncXVlc3Rpb25zJ10uZm9yRWFjaCgoc2luZ2xlUXVlc3Rpb246IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvd1F1ZXN0aW9uKHNpbmdsZVF1ZXN0aW9uKSkge1xyXG4gICAgICAgICAgICAgIHNpbmdsZVF1ZXN0aW9uWydpc1Nob3dRdWVzdGlvbkluVUknXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIC8vIGlmIChzaW5nbGVRdWVzdGlvblsncXVlc3Rpb25UeXBlJ10gPT09ICdDSEVDS0JPWCcgJiYgIXRoaXMuY2hlY2tJZlZhbHVlSXNFbXB0eShzaW5nbGVRdWVzdGlvblsnZG9tYWluVmFsdWVzJ10pKSB7XHJcbiAgICAgICAgICAgICAgLy8gICBzaW5nbGVRdWVzdGlvblsnZG9tYWluVmFsdWVzJ10uZm9yRWFjaCgoZG9tYWluVmFsdWVPYmo6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIC8vICAgICBpZiAoIXRoaXMuY2hlY2tJZlZhbHVlSXNFbXB0eSh0aGlzLnBlcnNvblV3QW5zd2Vyc1tkb21haW5WYWx1ZU9ialsnZG9tYWluSW50ZXJuYWxWYWx1ZSddXSkpIHtcclxuICAgICAgICAgICAgICAvLyAgICAgICBkZWxldGUgdGhpcy5wZXJzb25Vd0Fuc3dlcnNbZG9tYWluVmFsdWVPYmpbJ2RvbWFpbkludGVybmFsVmFsdWUnXV07XHJcbiAgICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAvLyBpZiAoc2luZ2xlUXVlc3Rpb25bJ3F1ZXN0aW9uVHlwZSddICE9PSAnQ0hFQ0tCT1gnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tJZlZhbHVlSXNFbXB0eSh0aGlzLnBlcnNvblV3QW5zd2Vyc1tzaW5nbGVRdWVzdGlvblsncXVlc3Rpb25JZCddXSkpIHtcclxuICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucGVyc29uVXdBbnN3ZXJzW3NpbmdsZVF1ZXN0aW9uWydxdWVzdGlvbklkJ11dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBzaW5nbGVRdWVzdGlvblsnaXNTaG93UXVlc3Rpb25JblVJJ10gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2luZ2xlUXVlc3Rpb25bJ3F1ZXN0aW9uVHlwZSddID09PSAnQ0hFQ0tCT1gnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkoc2luZ2xlUXVlc3Rpb25bJ2RvbWFpblZhbHVlcyddKSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGlzTm9uZUluRG9tYWluVmFsdWVzOiBhbnkgPSBzaW5nbGVRdWVzdGlvblsnZG9tYWluVmFsdWVzJ10uZmlsdGVyKChzaW5nbGVPYmo6IGFueSkgPT4gc2luZ2xlT2JqWydkb21haW5VaVZhbHVlJ10udG9VcHBlckNhc2UoKSA9PT0gJ05PTkUnKTtcclxuICAgICAgICAgICAgICAgIHNpbmdsZVF1ZXN0aW9uWydkb21haW5WYWx1ZXMnXS5mb3JFYWNoKChzaW5nbGVEb21haW5WYWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KGlzTm9uZUluRG9tYWluVmFsdWVzKSAmJiAhdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KHRoaXMucGVyc29uVXdBbnN3ZXJzW2lzTm9uZUluRG9tYWluVmFsdWVzWzBdWydkb21haW5JbnRlcm5hbFZhbHVlJ11dKSAmJiB0aGlzLnBlcnNvblV3QW5zd2Vyc1tpc05vbmVJbkRvbWFpblZhbHVlc1swXVsnZG9tYWluSW50ZXJuYWxWYWx1ZSddXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbmUgaXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVRdWVzdGlvblsnZG9tYWluVmFsdWVzJ10uZm9yRWFjaCgoc2luZ2xlRG9tYWluVmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBzZWxlY3RlZCBjaGVja2JveCBxdWVzdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzaW5nbGVEb21haW5WYWx1ZS5kb21haW5VaVZhbHVlLnRvVXBwZXJDYXNlKCkgIT09ICdOT05FJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVEb21haW5WYWx1ZS5pc0Rpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucGVyc29uVXdBbnN3ZXJzW3NpbmdsZURvbWFpblZhbHVlWydkb21haW5JbnRlcm5hbFZhbHVlJ11dO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZURvbWFpblZhbHVlLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbGV0IGlzU2VjdGlvbkV4aXN0c0luQmxvY2tlZExpc3Q6IGFueSA9IHRoaXMuaXNCbG9ja2VkUXVlc3Rpb25zTGlzdC5maWx0ZXIoKHNpbmdsZUJsb2NrZWRPYmo6IGFueSkgPT4gc2luZ2xlQmxvY2tlZE9ialsnc2VjdGlvblRpdGxlJ10udHJpbSgpID09PSBzaW5nbGVTZWN0aW9uWydzZWN0aW9uTmFtZSddLnRyaW0oKSk7XHJcbiAgICAgICAgLy8gc2luZ2xlU2VjdGlvblsnc2hvd1NlY3Rpb24nXSA9ICF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkoc2luZ2xlU2VjdGlvblsncXVlc3Rpb25zJ10uZmlsdGVyKChzaW5nbGVRdWVzdGlvbjogYW55KSA9PiBzaW5nbGVRdWVzdGlvblsnaXNTaG93UXVlc3Rpb25JblVJJ10pKVxyXG4gICAgICAgIC8vIGlmICghdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KGlzU2VjdGlvbkV4aXN0c0luQmxvY2tlZExpc3QpKSB7XHJcbiAgICAgICAgLy8gICBpZiAoaXNTZWN0aW9uRXhpc3RzSW5CbG9ja2VkTGlzdFswXS5pc0Jsb2NrZWRGb3JDdXN0b21lckZsb3cgJiYgIXRoaXMubG9hZGluZ0FnZW50cG9ydGFsKSB7XHJcbiAgICAgICAgLy8gICAgIHNpbmdsZVNlY3Rpb25bJ3Nob3dTZWN0aW9uJ10gPSBmYWxzZTtcclxuICAgICAgICAvLyAgICAgbGV0IGZpbHRlcmVkSW5kZXg6IGFueSA9IHRoaXMucGVyc29uVXdSZXNwb25zZU9ialsncXVlc3Rpb25zUmVzcG9uc2UnXS5maW5kSW5kZXgoKHNpbmdsZVBlcnNvbk9iajogYW55KSA9PiBzaW5nbGVQZXJzb25PYmpbJ3JvbGUnXSA9PT0gc2luZ2xlUGVyc29uT2JqWydyb2xlJ10pO1xyXG4gICAgICAgIC8vICAgICBzaW5nbGVTZWN0aW9uWydxdWVzdGlvbnMnXS5mb3JFYWNoKChzaW5nbGVRdWVzdGlvbk9iakluU2VjdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgbGV0IGZpbHRlcmVkUXVlc3Rpb246IGFueSA9IHRoaXMucGVyc29uVXdSZXNwb25zZU9ialsncXVlc3Rpb25zUmVzcG9uc2UnXVtmaWx0ZXJlZEluZGV4XVsncXVlc3Rpb25MaXN0J10uZmlsdGVyKChzaW5nbGVRdWVzdGlvbjogYW55KSA9PiBzaW5nbGVRdWVzdGlvblsncXVlc3Rpb25JZCddID09PSBzaW5nbGVRdWVzdGlvbk9iakluU2VjdGlvblsncXVlc3Rpb25JZCddKTtcclxuICAgICAgICAvLyAgICAgICBpZiAoIXRoaXMuY2hlY2tJZlZhbHVlSXNFbXB0eShmaWx0ZXJlZFF1ZXN0aW9uKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgZmlsdGVyZWRRdWVzdGlvblswXVsnaXNTaG93UXVlc3Rpb25JblVJJ10gPSBzaW5nbGVTZWN0aW9uWydzaG93U2VjdGlvbiddO1xyXG4gICAgICAgIC8vICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfSk7XHJcbiAgICAgICAgLy8gICB9XHJcbiAgICAgICAgLy8gICBpZiAoKGlzU2VjdGlvbkV4aXN0c0luQmxvY2tlZExpc3RbMF0uaXNCbG9ja2VkRm9yQWdlbnRGbG93IHx8IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2FnZW50Q2hhbm5lbCcpID09PSAnRDIwJyB8fCBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdhZ2VudENoYW5uZWwnKSA9PT0gJ0QwNScgfHwgc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnYWdlbnRDaGFubmVsJykgPT09ICdEMDYnKSAmJiB0aGlzLmxvYWRpbmdBZ2VudHBvcnRhbCkge1xyXG4gICAgICAgIC8vICAgICBzaW5nbGVTZWN0aW9uWydzaG93U2VjdGlvbiddID0gZmFsc2U7XHJcbiAgICAgICAgLy8gICAgIGxldCBmaWx0ZXJlZEluZGV4OiBhbnkgPSB0aGlzLnBlcnNvblV3UmVzcG9uc2VPYmpbJ3F1ZXN0aW9uc1Jlc3BvbnNlJ10uZmluZEluZGV4KChzaW5nbGVQZXJzb25PYmo6IGFueSkgPT4gc2luZ2xlUGVyc29uT2JqWydyb2xlJ10gPT09IHNpbmdsZVBlcnNvbk9ialsncm9sZSddKTtcclxuICAgICAgICAvLyAgICAgc2luZ2xlU2VjdGlvblsncXVlc3Rpb25zJ10uZm9yRWFjaCgoc2luZ2xlUXVlc3Rpb25PYmpJblNlY3Rpb246IGFueSkgPT4ge1xyXG4gICAgICAgIC8vICAgICAgIGxldCBmaWx0ZXJlZFF1ZXN0aW9uOiBhbnkgPSB0aGlzLnBlcnNvblV3UmVzcG9uc2VPYmpbJ3F1ZXN0aW9uc1Jlc3BvbnNlJ11bZmlsdGVyZWRJbmRleF1bJ3F1ZXN0aW9uTGlzdCddLmZpbHRlcigoc2luZ2xlUXVlc3Rpb246IGFueSkgPT4gc2luZ2xlUXVlc3Rpb25bJ3F1ZXN0aW9uSWQnXSA9PT0gc2luZ2xlUXVlc3Rpb25PYmpJblNlY3Rpb25bJ3F1ZXN0aW9uSWQnXSk7XHJcbiAgICAgICAgLy8gICAgICAgaWYgKCF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkoZmlsdGVyZWRRdWVzdGlvbikpIHtcclxuICAgICAgICAvLyAgICAgICAgIGZpbHRlcmVkUXVlc3Rpb25bMF1bJ2lzU2hvd1F1ZXN0aW9uSW5VSSddID0gc2luZ2xlU2VjdGlvblsnc2hvd1NlY3Rpb24nXTtcclxuICAgICAgICAvLyAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBsZXQgaGlkZGVuUXVlc3Rpb25zOiBhbnkgPSB0aGlzLnF1ZXN0aW9uTGlzdC5maWx0ZXIoKHNpbmdsZVNlY3Rpb25PYmo6IGFueSkgPT4gIXNpbmdsZVNlY3Rpb25PYmpbJ3Nob3dTZWN0aW9uJ10pO1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkoaGlkZGVuUXVlc3Rpb25zKSkge1xyXG4gICAgICAgICAgaGlkZGVuUXVlc3Rpb25zLmZvckVhY2goKHNpbmdsZVNlY3Rpb246IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBzaW5nbGVTZWN0aW9uWydxdWVzdGlvbnMnXS5mb3JFYWNoKChzaW5nbGVRdWVzdGlvbk9iakluU2VjdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgc2luZ2xlUXVlc3Rpb25PYmpJblNlY3Rpb25bJ2lzU2hvd1F1ZXN0aW9uSW5VSSddID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgLy8gbGV0IGZpbHRlcmVkUXVlc3Rpb246IGFueSA9IHRoaXMucGVyc29uVXdSZXNwb25zZU9ialsncXVlc3Rpb25zUmVzcG9uc2UnXVswXVsncXVlc3Rpb25MaXN0J10uZmlsdGVyKChzaW5nbGVRdWVzdGlvbjogYW55KSA9PiBzaW5nbGVRdWVzdGlvblsncXVlc3Rpb25JZCddID09PSBzaW5nbGVRdWVzdGlvbk9iakluU2VjdGlvblsncXVlc3Rpb25JZCddKTtcclxuICAgICAgICAgICAgICAvLyBpZiAoIXRoaXMuY2hlY2tJZlZhbHVlSXNFbXB0eShmaWx0ZXJlZFF1ZXN0aW9uKSkge1xyXG4gICAgICAgICAgICAgIC8vICAgZmlsdGVyZWRRdWVzdGlvblswXVsnaXNTaG93UXVlc3Rpb25JblVJJ10gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnF1ZXN0aW9uTGlzdC5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gYVsnc3RlcCddIC0gYlsnc3RlcCddKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygncXVlc3Rpb25zIGxpc3QnLCB0aGlzLnF1ZXN0aW9uTGlzdCk7XHJcbiAgICBjb25zb2xlLmxvZygncXVlc3Rpb25zIGFuc3dlcnMnLCB0aGlzLnBlcnNvblV3QW5zd2Vycyk7XHJcblxyXG4gIH1cclxuXHJcbiAgc2hvd1F1ZXN0aW9uKGN1cnJlbnRRdWVzdGlvbjogYW55KSB7XHJcbiAgICBsZXQgc2hvd1F1ZXN0aW9uOiBhbnkgPSBmYWxzZTtcclxuICAgIGxldCBzdWJRdWVzdGlvbnM6IGFueSA9IFtdO1xyXG4gICAgLy8gbGV0IGN1cnJlbnRTZWN0aW9uSW5kZXg6IGFueSA9IHF1ZXN0aW9uc1Jlc3BvbnNlWydxdWVzdGlvbnNSZXNwb25zZSddLmZpbmRJbmRleCgoc2luZ2xlUGVyc29uT2JqOiBhbnkpID0+IHNpbmdsZVBlcnNvbk9ialsncm9sZSddID09PSBwZXJzb25Sb2xlKVxyXG4gICAgLy8gbGV0IHJvbGUgPSB0aGlzLnBlcnNvblV3UmVzcG9uc2VPYmpbJ3F1ZXN0aW9uc1Jlc3BvbnNlJ11bY3VycmVudFNlY3Rpb25JbmRleF1bJ3JvbGUnXVxyXG5cclxuICAgIHRoaXMucGVyc29uVXdSZXNwb25zZU9ialswXS5xdWVzdGlvbkxpc3QuZm9yRWFjaCgoc2luZ2xlUXVlc3Rpb246IGFueSkgPT4ge1xyXG4gICAgICBsZXQgaXNTdWJRdWVzdGlvbk9iamVjdDogYW55ID0gW107XHJcbiAgICAgIGlmICghdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KHNpbmdsZVF1ZXN0aW9uWydxdWVzdGlvblJlbGF0aW9uJ10pKSB7XHJcbiAgICAgICAgaXNTdWJRdWVzdGlvbk9iamVjdCA9IHNpbmdsZVF1ZXN0aW9uWydxdWVzdGlvblJlbGF0aW9uJ10uZmlsdGVyKFxyXG4gICAgICAgICAgKHF1ZXN0aW9uUmVsYXRpb25PYmo6IGFueSkgPT4gcXVlc3Rpb25SZWxhdGlvbk9ialsnbmV4dFF1ZXN0aW9uSWQnXSA9PT0gY3VycmVudFF1ZXN0aW9uWydxdWVzdGlvbklkJ11cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc1N1YlF1ZXN0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICBzdWJRdWVzdGlvbnMucHVzaChzaW5nbGVRdWVzdGlvbik7XHJcbiAgICAgICAgaXNTdWJRdWVzdGlvbk9iamVjdC5mb3JFYWNoKChzaW5nbGVTdWJRdWVzdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIChzaW5nbGVRdWVzdGlvblsncXVlc3Rpb25UeXBlJ10gIT09ICdDSEVDS0JPWCcgJiZcclxuICAgICAgICAgICAgICAoc2luZ2xlU3ViUXVlc3Rpb25bJ3BhcmVudFF1ZXN0aW9uVmFsdWUnXS50b1N0cmluZygpWzBdICE9PSAnIScgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMucGVyc29uVXdBbnN3ZXJzW3NpbmdsZVF1ZXN0aW9uWydxdWVzdGlvbklkJ11dID09PVxyXG4gICAgICAgICAgICAgICAgc2luZ2xlU3ViUXVlc3Rpb25bJ3BhcmVudFF1ZXN0aW9uVmFsdWUnXSkpIHx8XHJcbiAgICAgICAgICAgIChzaW5nbGVTdWJRdWVzdGlvblsncGFyZW50UXVlc3Rpb25WYWx1ZSddLnRvU3RyaW5nKClbMF0gPT09ICchJyAmJlxyXG4gICAgICAgICAgICAgICF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkodGhpcy5wZXJzb25Vd0Fuc3dlcnNbc2luZ2xlUXVlc3Rpb25bJ3F1ZXN0aW9uSWQnXV0pICYmXHJcbiAgICAgICAgICAgICAgdGhpcy5wZXJzb25Vd0Fuc3dlcnNbc2luZ2xlUXVlc3Rpb25bJ3F1ZXN0aW9uSWQnXV0gIT09XHJcbiAgICAgICAgICAgICAgc2luZ2xlU3ViUXVlc3Rpb25bJ3BhcmVudFF1ZXN0aW9uVmFsdWUnXS50b1N0cmluZygpLnNwbGl0KCchJylbXHJcbiAgICAgICAgICAgICAgMVxyXG4gICAgICAgICAgICAgIF0pIHx8XHJcbiAgICAgICAgICAgIChzaW5nbGVRdWVzdGlvblsncXVlc3Rpb25UeXBlJ10gPT09ICdDSEVDS0JPWCcgJiYgIXRoaXMuY2hlY2tJZlZhbHVlSXNFbXB0eSh0aGlzLnBlcnNvblV3QW5zd2Vyc1tzaW5nbGVRdWVzdGlvblsncXVlc3Rpb25JZCddXSkgJiZcclxuICAgICAgICAgICAgICB0aGlzLnBlcnNvblV3QW5zd2Vyc1tzaW5nbGVRdWVzdGlvblsncXVlc3Rpb25JZCddXS5maWx0ZXIoKHNpbmdsZU9iaiA6IGFueSkgPT4gc2luZ2xlT2JqWyd2YWx1ZSddID09PSBzaW5nbGVTdWJRdWVzdGlvblsncGFyZW50UXVlc3Rpb25WYWx1ZSddKS5sZW5ndGggPiAwIClcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBzaG93UXVlc3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KHN1YlF1ZXN0aW9ucykgJiYgdGhpcy5jaGVja0lmVmFsdWVJc0VtcHR5KGN1cnJlbnRRdWVzdGlvblsncGFyZW50UXVlc3Rpb25SZWxhdGlvbiddKSkge1xyXG4gICAgICBzaG93UXVlc3Rpb24gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkoY3VycmVudFF1ZXN0aW9uWydwYXJlbnRRdWVzdGlvblJlbGF0aW9uJ10pICYmICF0aGlzLmNoZWNrSWZWYWx1ZUlzRW1wdHkoY3VycmVudFF1ZXN0aW9uWydwYXJlbnRRdWVzdGlvblJlbGF0aW9uJ11bJ3BhcmVudFF1ZXN0aW9uSWQnXSkgJiYgIXRoaXMuY2hlY2tJZlZhbHVlSXNFbXB0eSh0aGlzLnBlcnNvblV3QW5zd2Vyc1tjdXJyZW50UXVlc3Rpb25bJ3BhcmVudFF1ZXN0aW9uUmVsYXRpb24nXVsncGFyZW50UXVlc3Rpb25JZCddXSkgJiYgdGhpcy5wZXJzb25Vd0Fuc3dlcnNbY3VycmVudFF1ZXN0aW9uWydwYXJlbnRRdWVzdGlvblJlbGF0aW9uJ11bJ3BhcmVudFF1ZXN0aW9uSWQnXV0gPT09IGN1cnJlbnRRdWVzdGlvblsncGFyZW50UXVlc3Rpb25SZWxhdGlvbiddWydwYXJlbnRRdWVzdGlvbkFuc3dlciddKSB7XHJcbiAgICAgIHNob3dRdWVzdGlvbiA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY3VycmVudFF1ZXN0aW9uWydxdWVzdGlvblR5cGUnXSA9PT0gJ05PRElTUExBWScpIHtcclxuICAgICAgc2hvd1F1ZXN0aW9uID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2hvd1F1ZXN0aW9uO1xyXG4gIH1cclxufVxyXG4iLCJcclxuPGRpdiAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBxdWVzdGlvbkxpc3RcIj5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJcclxuICAgICAgICAhY2hlY2tJZlZhbHVlSXNFbXB0eShzZWN0aW9uWydxdWVzdGlvbnMnXSkgJiZcclxuICAgICAgICBzZWN0aW9uWydzaG93U2VjdGlvbiddXHJcbiAgICAgIFwiXHJcbiAgICAgIGNsYXNzPVwiY2FyZCBwLTMgbXktMlwiXHJcbiAgICAgIGlkPVwicGVyc29uVXdNZWRpY2FsUXVlc3Rpb25zXCJcclxuICAgID5cclxuICAgICAgPGg2IGNsYXNzPVwicGFnZS10aXRsZVwiPlxyXG4gICAgICAgIHt7IGdldFRpdGxlQ2FzZShzZWN0aW9uW1wic2VjdGlvbk5hbWVcIl0pIH19XHJcbiAgICAgIDwvaDY+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHF1ZXN0aW9ucyBvZiBzZWN0aW9uWydxdWVzdGlvbnMnXVwiPlxyXG4gICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInF1ZXN0aW9uc1sncXVlc3Rpb25UeXBlJ10gPT09ICdJTUFHRSBURVhUJ1wiPlxyXG4gICAgICAgICAgPGltZyBbc3JjXT1cInF1ZXN0aW9uc1snc2FtcGxlUzNMaW5rJ11cIiBjbGFzcz1cImQtYmxvY2sgbXgtYXV0b1wiIFthbHRdPVwicXVlc3Rpb25zWyd0aXRsZSddXCI+XHJcbiAgICAgICAgICA8aDMgW2lubmVySFRNTF09XCJxdWVzdGlvbnNbJ3F1ZXN0aW9uVGV4dCddXCI+PC9oMz5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiXCJcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uc1sncXVlc3Rpb25UeXBlJ10gPT09ICdGUkVFIFRFWFQnICYmXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uc1snY2FtbXVuZGFRdWVzdGlvbkNvZGUnXSAhPT0gJ1FIVCcgJiZcclxuICAgICAgICAgICAgcXVlc3Rpb25zWydpc1Nob3dRdWVzdGlvbkluVUknXVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjYXJkLXRvcGljIGQtYmxvY2tcIlxyXG4gICAgICAgICAgICA+e3sgcXVlc3Rpb25zW1wicXVlc3Rpb25UZXh0XCJdIH19XHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIHF1ZXN0aW9ucy5vcHRpb25hbFF1ZXN0aW9uID09PSAnTidcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6ICNlZTAwMDBcIlxyXG4gICAgICAgICAgICAgID4mIzQyOzwvc3BhblxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC01IHB4LTBcIj5cclxuICAgICAgICAgICAgPGxpYi10ZXh0Ym94IFsobmdNb2RlbCldPVwicGVyc29uVXdBbnN3ZXJzW3F1ZXN0aW9ucy5xdWVzdGlvbklkXVwiIFtmaWVsZF09XCJxdWVzdGlvbnNbJ2ZpZWxkJ11cIiAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiXCJcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uc1sncXVlc3Rpb25UeXBlJ10gPT09ICdIRUlHSFRJTlBVVCcgJiZcclxuICAgICAgICAgICAgcXVlc3Rpb25zWydjYW1tdW5kYVF1ZXN0aW9uQ29kZSddID09PSAnUUhURicgJiZcclxuICAgICAgICAgICAgcXVlc3Rpb25zWydpc1Nob3dRdWVzdGlvbkluVUknXVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjYXJkLXRvcGljIGQtYmxvY2tcIlxyXG4gICAgICAgICAgICA+SGVpZ2h0XHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjogI2VlMDAwMFwiXHJcbiAgICAgICAgICAgICAgPiYjNDI7PC9zcGFuXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiY29sLWF1dG8gcHgtMCBteS0wIHB5LTAgaGVpZ2h0aW5wdXRcIlxyXG5cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY29sLTcgcHktMCBoZWlnaHRJbnB1dHNcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwidHJhbnNmb3JtOiB0cmFuc2xhdGUoNnB4LCAzcHgpO1wiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIHBlcnNvblV3QW5zd2Vyc1snbWVkaWNhbFF1ZXN0aW9uc0hlaWdodFVuaXQnXSA9PT0gJ0NNJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bGliLXRleHRib3ggW2ZpZWxkXT1cInF1ZXN0aW9uc1snZmllbGQnXVwiICAgLz5cclxuICAgICAgICAgICAgICA8bGliLXNlbGVjdCBbKG5nTW9kZWwpXT1cInBlcnNvblV3QW5zd2Vyc1snbWVkaWNhbFF1ZXN0aW9uc0hlaWdodFVuaXQnXVwiIFtmaWVsZF09XCJtZWRRdWVzdGlvbk9ialsnaGVpZ2h0T2JqZWN0VHlwZXMnXVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJweS0wXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCJcclxuICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgcGVyc29uVXdBbnN3ZXJzW1xyXG4gICAgICAgICAgICAgICAgICAnbWVkaWNhbFF1ZXN0aW9uc0hlaWdodFVuaXQnXHJcbiAgICAgICAgICAgICAgICBdID09PSAnRkVFVCdcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIHB5LTAgaGVpZ2h0SW5wdXRzIHB4LTFcIj5cclxuICAgICAgICAgICAgICAgIDxsaWItc2VsZWN0IFtmaWVsZF09XCJtZWRRdWVzdGlvbk9ialsnUUhURiddWydmaWVsZCddXCIgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gcHktMCBoZWlnaHRJbnB1dHMgcHgtMVwiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1zZWxlY3QgW2ZpZWxkXT1cIm1lZFF1ZXN0aW9uT2JqWydRSFRJJ11bJ2ZpZWxkJ11cIiAvPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWF1dG8gcHktMCBoZWlnaHRJbnB1dHMgcHgtMVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXJzb25Vd0Fuc3dlcnNbJ21lZGljYWxRdWVzdGlvbnNIZWlnaHRVbml0J11cIiBbZmllbGRdPVwibWVkUXVlc3Rpb25PYmpbJ2hlaWdodE9iamVjdFR5cGVzJ11cIiAvPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwicm93IG10LTAgcHQtMFwiXHJcbiAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICBxdWVzdGlvbnNbJ3F1ZXN0aW9uVHlwZSddID09PSAnTUFQJyAmJlxyXG4gICAgICAgICAgICBxdWVzdGlvbnNbJ2lzU2hvd1F1ZXN0aW9uSW5VSSddXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgID5cclxuXHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3Mtc2VhcmNoLWNvbnRhaW5lciBtYi0zXCI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5Mb25naXR1ZGU8L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBcclxuICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwibG9uZ2l0dWRlXCJcclxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgbG9uZ2l0dWRlXCJcclxuICAgICAgICAgIHN0ZXA9XCJhbnlcIlxyXG4gICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICA+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+TGF0aXR1ZGU8L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBcclxuICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwibGF0aXR1ZGVcIlxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBsYXRpdHVkZVwiXHJcbiAgICAgICAgICBzdGVwPVwiYW55XCJcclxuICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGlucHV0IFxyXG4gICAgICAgICNhZGRyZXNzSW5wdXQgXHJcbiAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggZm9yIGFkZHJlc3NcIlxyXG4gICAgICAgIChrZXl1cCk9XCJvbkFkZHJlc3NJbnB1dEtleXVwKCRldmVudClcIlxyXG4gICAgICAgIChmb2N1cyk9XCJzaG93RHJvcGRvd24gPSB0cnVlXCJcclxuICAgICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigpXCJcclxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICA+XHJcbiAgICAgIDxkaXYgXHJcbiAgICAqbmdJZj1cInNob3dEcm9wZG93biAmJiBhZGRyZXNzU3VnZ2VzdGlvbnMubGVuZ3RoID4gMFwiIFxyXG4gICAgY2xhc3M9XCJhdXRvY29tcGxldGUtZHJvcGRvd24gcG9zaXRpb24tYWJzb2x1dGUgdy0xMDAgbXQtMVwiXHJcbiAgICBzdHlsZT1cInotaW5kZXg6IDEwMDA7IG1heC1oZWlnaHQ6IDIwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyBiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgYm9yZGVyLXJhZGl1czogNHB4OyBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLDAsMCwwLjEpO1wiXHJcbiAgPlxyXG4gICAgPGRpdiBcclxuICAgICAgKm5nRm9yPVwibGV0IHN1Z2dlc3Rpb24gb2YgYWRkcmVzc1N1Z2dlc3Rpb25zOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHAtMlwiXHJcbiAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTtcIlxyXG4gICAgICAobW91c2Vkb3duKT1cInNlbGVjdEFkZHJlc3Moc3VnZ2VzdGlvbilcIlxyXG4gICAgICAobW91c2VlbnRlcik9XCJob3ZlcmVkSW5kZXggPSBpXCJcclxuICAgICAgW2NsYXNzLmJnLWxpZ2h0XT1cImhvdmVyZWRJbmRleCA9PT0gaVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmdy1ib2xkXCI+e3sgc3VnZ2VzdGlvbi5tYWluX3RleHQgfX08L2Rpdj5cclxuICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPnt7IHN1Z2dlc3Rpb24uc2Vjb25kYXJ5X3RleHQgfX08L3NtYWxsPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj5TdGFydCB0eXBpbmcgdG8gc2VhcmNoIGZvciBhZGRyZXNzZXM8L3NtYWxsPlxyXG4gICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxnb29nbGUtbWFwIFtjZW50ZXJdPVwiY2VudGVyXCIgW3pvb21dPVwiem9vbVwiPlxyXG4gICAgICAgICAgICAgIDxtYXAtbWFya2VyIFtwb3NpdGlvbl09XCJjdXJyZW50Q29vcmRpbmF0ZXNcIj48L21hcC1tYXJrZXI+XHJcbiAgICAgICAgICAgIDwvZ29vZ2xlLW1hcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJcIlxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgKHF1ZXN0aW9uc1sncXVlc3Rpb25UeXBlJ10gPT09ICdSQURJTyBCVVRUT04nIHx8XHJcbiAgICAgICAgICAgICAgcXVlc3Rpb25zWydxdWVzdGlvblR5cGUnXSA9PT0gJ0FERE1PUkUnKSAmJlxyXG4gICAgICAgICAgICAgIHF1ZXN0aW9uc1snaXNTaG93UXVlc3Rpb25JblVJJ11cclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGxpYi1yYWRpbyBbKG5nTW9kZWwpXT1cInBlcnNvblV3QW5zd2Vyc1txdWVzdGlvbnMucXVlc3Rpb25JZF1cIiAobmdNb2RlbENoYW5nZSk9XCJyZW1vdmVTdWJRdWVzdGlvblZhbHVlcygpXCIgW2ZpZWxkXT1cInF1ZXN0aW9uc1snZmllbGQnXVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiXCJcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uc1sncXVlc3Rpb25UeXBlJ10gPT09ICdDSEVDS0JPWCcgJiZcclxuICAgICAgICAgICAgcXVlc3Rpb25zWydpc1Nob3dRdWVzdGlvbkluVUknXVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bGliLW11bHRpcGxlLXNlbGVjdCBbKG5nTW9kZWwpXT1cInBlcnNvblV3QW5zd2Vyc1txdWVzdGlvbnMucXVlc3Rpb25JZF1cIiAobmdNb2RlbENoYW5nZSk9XCJyZW1vdmVTdWJRdWVzdGlvblZhbHVlcygpXCIgW2ZpZWxkXT1cInF1ZXN0aW9uc1snZmllbGQnXVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiXCJcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uc1sncXVlc3Rpb25UeXBlJ10gPT09ICdERUNMQVJBVElPTicgJiZcclxuICAgICAgICAgICAgcXVlc3Rpb25zWydpc1Nob3dRdWVzdGlvbkluVUknXVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bGliLWNoZWNrYm94IFsobmdNb2RlbCldPVwicGVyc29uVXdBbnN3ZXJzW3F1ZXN0aW9ucy5xdWVzdGlvbklkXVwiIChuZ01vZGVsQ2hhbmdlKT1cInJlbW92ZVN1YlF1ZXN0aW9uVmFsdWVzKClcIiBbZmllbGRdPVwicXVlc3Rpb25zWydmaWVsZCddXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJcIlxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgcXVlc3Rpb25zWydxdWVzdGlvblR5cGUnXSA9PT0gJ0RST1BET1dOJyAmJlxyXG4gICAgICAgICAgICBxdWVzdGlvbnNbJ2lzU2hvd1F1ZXN0aW9uSW5VSSddXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxsaWItc2VsZWN0IFsobmdNb2RlbCldPVwicGVyc29uVXdBbnN3ZXJzW3F1ZXN0aW9ucy5xdWVzdGlvbklkXVwiIFtmaWVsZF09XCJxdWVzdGlvbnNbJ2ZpZWxkJ11cIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cIlwiXHJcbiAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICBxdWVzdGlvbnNbJ3F1ZXN0aW9uVHlwZSddID09PSAnQ0FMRU5EQVInICYmXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uc1snaXNTaG93UXVlc3Rpb25JblVJJ11cclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGxpYi1kb2IgWyhuZ01vZGVsKV09XCJwZXJzb25Vd0Fuc3dlcnNbcXVlc3Rpb25zLnF1ZXN0aW9uSWRdXCIgW2ZpZWxkXT1cInF1ZXN0aW9uc1snZmllbGQnXVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJcIlxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgcXVlc3Rpb25zWydxdWVzdGlvblR5cGUnXSA9PT0gJ0hFSUdIVElOUFVUJyAmJlxyXG4gICAgICAgICAgICBxdWVzdGlvbnNbJ2NhbW11bmRhUXVlc3Rpb25Db2RlJ10gPT09ICdRSFRGJyAmJlxyXG4gICAgICAgICAgICBxdWVzdGlvbnNbJ2lzU2hvd1F1ZXN0aW9uSW5VSSddXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJcIlxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgcXVlc3Rpb25zWydxdWVzdGlvblR5cGUnXSA9PT0gJ0RPQ1VQTE9BRCcgJiZcclxuICAgICAgICAgICAgcXVlc3Rpb25zWydpc1Nob3dRdWVzdGlvbkluVUknXVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bGliLXVwbG9hZCBbZmllbGRdPVwicXVlc3Rpb25zWydmaWVsZCddXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiXCJcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uc1sncXVlc3Rpb25UeXBlJ10gPT09ICdQQVNTUE9SVF9VUExPQUQnICYmXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uc1snaXNTaG93UXVlc3Rpb25JblVJJ11cclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwhLS0gcGVuZGluZyAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuIl19
|