@qbs-origin/origin-form 0.8.5 → 0.8.7
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/formly/formly-scan-id/formly-scan-id.component.mjs +326 -122
- package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +76 -47
- package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +11 -7
- package/esm2022/lib/origin-form-auth.service.mjs +2 -3
- package/esm2022/lib/origin-form.component.mjs +15 -1
- package/esm2022/lib/origin-form.module.mjs +2 -13
- package/fesm2022/qbs-origin-origin-form.mjs +444 -241
- package/fesm2022/qbs-origin-origin-form.mjs.map +1 -1
- package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +44 -10
- package/lib/formly/formly-sign/formly-sign.component.d.ts +4 -0
- package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +1 -0
- package/lib/origin-form-auth.service.d.ts +1 -1
- package/package.json +2 -2
|
@@ -4,9 +4,12 @@ import { FieldType } from '@ngx-formly/core';
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import * as i1 from "../../services/applicationData.service";
|
|
6
6
|
import * as i2 from "@angular/common";
|
|
7
|
-
import * as i3 from "@angular/material/
|
|
8
|
-
import * as i4 from "@angular/material/
|
|
9
|
-
import * as i5 from "@angular/material/
|
|
7
|
+
import * as i3 from "@angular/material/form-field";
|
|
8
|
+
import * as i4 from "@angular/material/core";
|
|
9
|
+
import * as i5 from "@angular/material/select";
|
|
10
|
+
import * as i6 from "@angular/material/button";
|
|
11
|
+
import * as i7 from "@angular/material/icon";
|
|
12
|
+
import * as i8 from "@angular/material/progress-bar";
|
|
10
13
|
export class FormlyScanIdComponent extends FieldType {
|
|
11
14
|
constructor(appDataService, cdr) {
|
|
12
15
|
super();
|
|
@@ -26,8 +29,24 @@ export class FormlyScanIdComponent extends FieldType {
|
|
|
26
29
|
this.photoBase64Back = '';
|
|
27
30
|
this.isLoading = false;
|
|
28
31
|
this.successMessage = null;
|
|
29
|
-
this.videoStream = null;
|
|
30
32
|
this.isScanValid = true;
|
|
33
|
+
// Wizard state
|
|
34
|
+
this.currentWizardStep = 0;
|
|
35
|
+
this.wizardSteps = [];
|
|
36
|
+
// Camera management
|
|
37
|
+
this.cameraActive = false;
|
|
38
|
+
this.availableCameras = [];
|
|
39
|
+
this.selectedCameraId = '';
|
|
40
|
+
// Photo preview (full data URI for img display)
|
|
41
|
+
this.photoPreviewFront = '';
|
|
42
|
+
this.photoPreviewBack = '';
|
|
43
|
+
// Drag and drop
|
|
44
|
+
this.isDragOver = false;
|
|
45
|
+
// Flash animation
|
|
46
|
+
this.showFlash = false;
|
|
47
|
+
// Retry
|
|
48
|
+
this.canRetry = false;
|
|
49
|
+
this.videoStream = null;
|
|
31
50
|
}
|
|
32
51
|
ngOnInit() {
|
|
33
52
|
const group = this.form;
|
|
@@ -40,103 +59,245 @@ export class FormlyScanIdComponent extends FieldType {
|
|
|
40
59
|
if (this.props['config'].collected) {
|
|
41
60
|
const value = this.form.get(this.props['config'].componentCollected)?.value;
|
|
42
61
|
this.control.setValue(value);
|
|
43
|
-
this.form
|
|
62
|
+
this.valueChangesSub = this.form
|
|
44
63
|
.get(this.props['config'].componentCollected)
|
|
45
64
|
?.valueChanges.subscribe(() => {
|
|
46
65
|
this.control.setValue(this.form.get(this.props['config'].componentCollected)?.value);
|
|
47
66
|
});
|
|
48
67
|
}
|
|
68
|
+
this.initWizardSteps();
|
|
69
|
+
}
|
|
70
|
+
ngOnDestroy() {
|
|
71
|
+
this.stopCamera();
|
|
72
|
+
this.valueChangesSub?.unsubscribe();
|
|
73
|
+
}
|
|
74
|
+
get currentPhotoPreview() {
|
|
75
|
+
return this.currentWizardStep === 1
|
|
76
|
+
? this.photoPreviewFront
|
|
77
|
+
: this.photoPreviewBack;
|
|
78
|
+
}
|
|
79
|
+
get currentStepLabel() {
|
|
80
|
+
if (this.currentWizardStep === 1) {
|
|
81
|
+
return (this.props['labels']?.uploadFrontPrompt ||
|
|
82
|
+
'Please upload the front photo of your ID card.');
|
|
83
|
+
}
|
|
84
|
+
return (this.props['labels']?.uploadBackPrompt ||
|
|
85
|
+
'Please upload the back photo of your ID card.');
|
|
49
86
|
}
|
|
87
|
+
get currentStepShortLabel() {
|
|
88
|
+
if (this.currentWizardStep === 1) {
|
|
89
|
+
return this.props['labels']?.frontPhotoLabel || 'Front of ID';
|
|
90
|
+
}
|
|
91
|
+
return this.props['labels']?.backPhotoLabel || 'Back of ID';
|
|
92
|
+
}
|
|
93
|
+
// --- Wizard Step Management ---
|
|
94
|
+
initWizardSteps() {
|
|
95
|
+
this.wizardSteps = [
|
|
96
|
+
{
|
|
97
|
+
label: this.props['labels']?.cardTypeStepLabel || 'Select Card Type',
|
|
98
|
+
status: 'active',
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
updateWizardSteps() {
|
|
103
|
+
const frontLabel = this.props['labels']?.frontPhotoStepLabel || 'Front Photo';
|
|
104
|
+
const backLabel = this.props['labels']?.backPhotoStepLabel || 'Back Photo';
|
|
105
|
+
this.wizardSteps = [
|
|
106
|
+
{
|
|
107
|
+
label: this.props['labels']?.cardTypeStepLabel || 'Select Card Type',
|
|
108
|
+
status: 'completed',
|
|
109
|
+
},
|
|
110
|
+
{ label: frontLabel, status: 'active' },
|
|
111
|
+
];
|
|
112
|
+
if (!this.oldIdCard) {
|
|
113
|
+
this.wizardSteps.push({ label: backLabel, status: 'upcoming' });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// --- Navigation ---
|
|
117
|
+
goBack() {
|
|
118
|
+
this.closeCamera();
|
|
119
|
+
if (this.currentWizardStep === 2) {
|
|
120
|
+
// Go back to front photo step, preserve front photo
|
|
121
|
+
this.wizardSteps[2].status = 'upcoming';
|
|
122
|
+
this.wizardSteps[1].status = 'active';
|
|
123
|
+
this.currentWizardStep = 1;
|
|
124
|
+
}
|
|
125
|
+
else if (this.currentWizardStep === 1) {
|
|
126
|
+
// Go back to card type selection, reset everything
|
|
127
|
+
this.resetForm();
|
|
128
|
+
this.cardTypeSelected = false;
|
|
129
|
+
this.currentWizardStep = 0;
|
|
130
|
+
this.initWizardSteps();
|
|
131
|
+
}
|
|
132
|
+
this.cdr.detectChanges();
|
|
133
|
+
}
|
|
134
|
+
goToStep(stepIndex) {
|
|
135
|
+
if (stepIndex < this.currentWizardStep) {
|
|
136
|
+
while (this.currentWizardStep > stepIndex) {
|
|
137
|
+
this.goBack();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// --- Card Type Selection ---
|
|
50
142
|
selectCardType(isOldIdCard) {
|
|
51
143
|
this.oldIdCard = isOldIdCard;
|
|
52
144
|
this.cardTypeSelected = true;
|
|
53
145
|
this.resetForm();
|
|
146
|
+
this.updateWizardSteps();
|
|
147
|
+
this.currentWizardStep = 1;
|
|
148
|
+
this.cdr.detectChanges();
|
|
54
149
|
}
|
|
55
|
-
|
|
56
|
-
|
|
150
|
+
// --- File Upload ---
|
|
151
|
+
onFileSelected(event) {
|
|
152
|
+
const input = event.target;
|
|
153
|
+
const file = input?.files?.[0];
|
|
57
154
|
if (file) {
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
155
|
+
const isFront = this.currentWizardStep === 1;
|
|
156
|
+
this.processFile(file, isFront);
|
|
157
|
+
}
|
|
158
|
+
// Reset input so same file can be re-selected
|
|
159
|
+
if (input) {
|
|
160
|
+
input.value = '';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
processFile(file, isFront) {
|
|
164
|
+
const fileExtension = '.' + file.name.split('.').pop()?.toLowerCase();
|
|
165
|
+
const fileSizeKB = file.size / 1024;
|
|
166
|
+
if (!this.validFormats.includes(fileExtension)) {
|
|
167
|
+
this.fileError = (this.props['errorMessages']?.invalidType ||
|
|
168
|
+
`Invalid file type. Allowed formats are ${this.validFormats.join(', ')}`).replace('{formats}', this.validFormats.join(', '));
|
|
169
|
+
this.control.setErrors({ invalidType: true });
|
|
170
|
+
this.cdr.detectChanges();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (fileSizeKB > this.maxFileSizeKB || fileSizeKB < 1) {
|
|
174
|
+
this.fileError = (this.props['errorMessages']?.maxSize ||
|
|
175
|
+
`File size must be between 1KB and ${this.maxFileSizeKB}KB.`).replace('{size}', this.maxFileSizeKB.toString());
|
|
176
|
+
this.control.setErrors({ invalidSize: true });
|
|
177
|
+
this.cdr.detectChanges();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
this.fileError = null;
|
|
181
|
+
const reader = new FileReader();
|
|
182
|
+
reader.readAsDataURL(file);
|
|
183
|
+
reader.onload = () => {
|
|
184
|
+
const dataUri = reader.result?.toString() || '';
|
|
185
|
+
const base64 = dataUri.split(',')[1] || '';
|
|
186
|
+
if (isFront) {
|
|
187
|
+
this.fileNameFront = file.name;
|
|
188
|
+
this.photoBase64Front = base64;
|
|
189
|
+
this.photoPreviewFront = dataUri;
|
|
190
|
+
this.frontPhotoUploaded = true;
|
|
65
191
|
}
|
|
66
|
-
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
this.
|
|
70
|
-
|
|
192
|
+
else {
|
|
193
|
+
this.fileNameBack = file.name;
|
|
194
|
+
this.photoBase64Back = base64;
|
|
195
|
+
this.photoPreviewBack = dataUri;
|
|
196
|
+
this.backPhotoUploaded = true;
|
|
71
197
|
}
|
|
72
|
-
this.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
198
|
+
this.cdr.detectChanges();
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
// --- Drag and Drop ---
|
|
202
|
+
onDragOver(event) {
|
|
203
|
+
event.preventDefault();
|
|
204
|
+
event.stopPropagation();
|
|
205
|
+
this.isDragOver = true;
|
|
206
|
+
}
|
|
207
|
+
onDragLeave(event) {
|
|
208
|
+
event.preventDefault();
|
|
209
|
+
this.isDragOver = false;
|
|
210
|
+
}
|
|
211
|
+
onDrop(event) {
|
|
212
|
+
event.preventDefault();
|
|
213
|
+
event.stopPropagation();
|
|
214
|
+
this.isDragOver = false;
|
|
215
|
+
const files = event.dataTransfer?.files;
|
|
216
|
+
if (files && files.length > 0) {
|
|
217
|
+
const isFront = this.currentWizardStep === 1;
|
|
218
|
+
this.processFile(files[0], isFront);
|
|
90
219
|
}
|
|
91
220
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const selectedDeviceId = prompt('Select camera', videoDevices.map((device) => device.label).join(', '));
|
|
108
|
-
const selectedDevice = videoDevices.find((device) => device.label === selectedDeviceId);
|
|
109
|
-
if (selectedDevice) {
|
|
110
|
-
this.startCamera(selectedDevice.deviceId);
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
this.fileError = 'Invalid camera selection.';
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
})
|
|
117
|
-
.catch(() => {
|
|
118
|
-
this.fileError = 'Unable to access the camera devices.';
|
|
221
|
+
// --- Camera ---
|
|
222
|
+
async openCamera() {
|
|
223
|
+
this.fileError = null;
|
|
224
|
+
this.cdr.detectChanges();
|
|
225
|
+
if (!navigator.mediaDevices?.getUserMedia) {
|
|
226
|
+
this.fileError =
|
|
227
|
+
this.props['errorMessages']?.cameraNotSupported ||
|
|
228
|
+
'Camera not supported by this device.';
|
|
229
|
+
this.cdr.detectChanges();
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
// Request permission first (labels are only available after permission grant)
|
|
234
|
+
const tempStream = await navigator.mediaDevices.getUserMedia({
|
|
235
|
+
video: true,
|
|
119
236
|
});
|
|
237
|
+
tempStream.getTracks().forEach((t) => t.stop());
|
|
238
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
239
|
+
this.availableCameras = devices.filter((d) => d.kind === 'videoinput');
|
|
240
|
+
if (this.availableCameras.length === 0) {
|
|
241
|
+
this.fileError =
|
|
242
|
+
this.props['errorMessages']?.noCamera ||
|
|
243
|
+
'No camera devices found.';
|
|
244
|
+
this.cdr.detectChanges();
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
this.selectedCameraId = this.availableCameras[0].deviceId;
|
|
248
|
+
this.cameraActive = true;
|
|
249
|
+
this.cdr.detectChanges();
|
|
250
|
+
await this.startCameraStream(this.selectedCameraId);
|
|
120
251
|
}
|
|
121
|
-
|
|
122
|
-
this.fileError =
|
|
252
|
+
catch {
|
|
253
|
+
this.fileError =
|
|
254
|
+
this.props['errorMessages']?.cameraAccess ||
|
|
255
|
+
'Unable to access camera. Please check permissions.';
|
|
256
|
+
this.cdr.detectChanges();
|
|
123
257
|
}
|
|
124
258
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
259
|
+
async switchCamera(deviceId) {
|
|
260
|
+
this.stopCameraStream();
|
|
261
|
+
await this.startCameraStream(deviceId);
|
|
262
|
+
}
|
|
263
|
+
async startCameraStream(deviceId) {
|
|
264
|
+
try {
|
|
265
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
266
|
+
video: { deviceId: { exact: deviceId } },
|
|
267
|
+
});
|
|
129
268
|
this.videoStream = stream;
|
|
130
|
-
this.
|
|
131
|
-
this.videoElement
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
269
|
+
this.cdr.detectChanges();
|
|
270
|
+
if (this.videoElement?.nativeElement) {
|
|
271
|
+
this.videoElement.nativeElement.srcObject = stream;
|
|
272
|
+
await this.videoElement.nativeElement.play();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
this.fileError =
|
|
277
|
+
this.props['errorMessages']?.cameraAccess ||
|
|
278
|
+
'Unable to access the selected camera.';
|
|
279
|
+
this.cameraActive = false;
|
|
280
|
+
this.cdr.detectChanges();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
stopCameraStream() {
|
|
284
|
+
if (this.videoStream) {
|
|
285
|
+
this.videoStream.getTracks().forEach((track) => track.stop());
|
|
286
|
+
this.videoStream = null;
|
|
287
|
+
}
|
|
136
288
|
}
|
|
137
|
-
|
|
138
|
-
|
|
289
|
+
stopCamera() {
|
|
290
|
+
this.stopCameraStream();
|
|
291
|
+
this.cameraActive = false;
|
|
292
|
+
}
|
|
293
|
+
closeCamera() {
|
|
294
|
+
this.stopCamera();
|
|
295
|
+
this.cdr.detectChanges();
|
|
296
|
+
}
|
|
297
|
+
captureCurrentPhoto() {
|
|
298
|
+
if (!this.videoElement?.nativeElement) {
|
|
139
299
|
this.fileError = 'No video element available.';
|
|
300
|
+
this.cdr.detectChanges();
|
|
140
301
|
return;
|
|
141
302
|
}
|
|
142
303
|
const video = this.videoElement.nativeElement;
|
|
@@ -145,35 +306,68 @@ export class FormlyScanIdComponent extends FieldType {
|
|
|
145
306
|
canvas.height = video.videoHeight;
|
|
146
307
|
const context = canvas.getContext('2d');
|
|
147
308
|
context?.drawImage(video, 0, 0, canvas.width, canvas.height);
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
}, 'image/jpeg');
|
|
309
|
+
// Flash animation
|
|
310
|
+
this.triggerFlash();
|
|
311
|
+
const dataUri = canvas.toDataURL('image/jpeg', 0.9);
|
|
312
|
+
const base64 = dataUri.split(',')[1] || '';
|
|
313
|
+
const isFront = this.currentWizardStep === 1;
|
|
314
|
+
if (isFront) {
|
|
315
|
+
this.photoBase64Front = base64;
|
|
316
|
+
this.photoPreviewFront = dataUri;
|
|
317
|
+
this.frontPhotoUploaded = true;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
this.photoBase64Back = base64;
|
|
321
|
+
this.photoPreviewBack = dataUri;
|
|
322
|
+
this.backPhotoUploaded = true;
|
|
323
|
+
}
|
|
324
|
+
this.stopCamera();
|
|
325
|
+
this.cdr.detectChanges();
|
|
326
|
+
}
|
|
327
|
+
triggerFlash() {
|
|
328
|
+
this.showFlash = true;
|
|
329
|
+
this.cdr.detectChanges();
|
|
330
|
+
setTimeout(() => {
|
|
331
|
+
this.showFlash = false;
|
|
332
|
+
this.cdr.detectChanges();
|
|
333
|
+
}, 300);
|
|
174
334
|
}
|
|
335
|
+
// --- Photo Preview Actions ---
|
|
336
|
+
confirmPhoto() {
|
|
337
|
+
if (this.currentWizardStep === 1 && !this.oldIdCard) {
|
|
338
|
+
// Move to back photo step
|
|
339
|
+
this.wizardSteps[1].status = 'completed';
|
|
340
|
+
this.wizardSteps[2].status = 'active';
|
|
341
|
+
this.currentWizardStep = 2;
|
|
342
|
+
this.cdr.detectChanges();
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
// All photos collected, trigger upload
|
|
346
|
+
this.checkUploadCondition();
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
resetCurrentPhoto() {
|
|
350
|
+
const isFront = this.currentWizardStep === 1;
|
|
351
|
+
if (isFront) {
|
|
352
|
+
this.photoBase64Front = '';
|
|
353
|
+
this.photoPreviewFront = '';
|
|
354
|
+
this.frontPhotoUploaded = false;
|
|
355
|
+
this.fileNameFront = '';
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
this.photoBase64Back = '';
|
|
359
|
+
this.photoPreviewBack = '';
|
|
360
|
+
this.backPhotoUploaded = false;
|
|
361
|
+
this.fileNameBack = '';
|
|
362
|
+
}
|
|
363
|
+
this.fileError = null;
|
|
364
|
+
this.cdr.detectChanges();
|
|
365
|
+
}
|
|
366
|
+
// --- Upload ---
|
|
175
367
|
uploadPhoto() {
|
|
176
368
|
this.isLoading = true;
|
|
369
|
+
this.canRetry = false;
|
|
370
|
+
this.fileError = null;
|
|
177
371
|
this.cdr.detectChanges();
|
|
178
372
|
const command = {
|
|
179
373
|
appId: this.props['appId'],
|
|
@@ -182,13 +376,16 @@ export class FormlyScanIdComponent extends FieldType {
|
|
|
182
376
|
oldIdCard: this.oldIdCard,
|
|
183
377
|
photos: this.oldIdCard
|
|
184
378
|
? [{ base64: this.photoBase64Front }]
|
|
185
|
-
: [
|
|
379
|
+
: [
|
|
380
|
+
{ base64: this.photoBase64Front },
|
|
381
|
+
{ base64: this.photoBase64Back },
|
|
382
|
+
],
|
|
186
383
|
};
|
|
187
384
|
this.appDataService.scanId(command).subscribe({
|
|
188
385
|
next: async (result) => {
|
|
189
386
|
console.log('Scan ID result:', result);
|
|
190
387
|
this.isLoading = false;
|
|
191
|
-
|
|
388
|
+
const appData = await this.appDataService.getSteps(this.props['appDataId']);
|
|
192
389
|
if (appData) {
|
|
193
390
|
const status = this.extractStatusFromAppData(appData);
|
|
194
391
|
console.log('[SCAN-ID] extracted status:', status);
|
|
@@ -196,13 +393,14 @@ export class FormlyScanIdComponent extends FieldType {
|
|
|
196
393
|
this.fileError =
|
|
197
394
|
this.props['errorMessages']?.invalidStatus ||
|
|
198
395
|
'Invalid status response.';
|
|
199
|
-
this.
|
|
396
|
+
this.canRetry = true;
|
|
200
397
|
this.control.setErrors({ invalidStatus: true });
|
|
201
398
|
this.cdr.detectChanges();
|
|
202
399
|
return;
|
|
203
400
|
}
|
|
204
401
|
this.isScanValid = true;
|
|
205
402
|
this.successMessage = 'Upload successful!';
|
|
403
|
+
this.wizardSteps.forEach((s) => (s.status = 'completed'));
|
|
206
404
|
if (this.props['event']) {
|
|
207
405
|
this.props['event'](appData);
|
|
208
406
|
}
|
|
@@ -213,28 +411,37 @@ export class FormlyScanIdComponent extends FieldType {
|
|
|
213
411
|
this.fileError = 'An error occurred while processing the scan.';
|
|
214
412
|
console.error('Scan ID error:', err);
|
|
215
413
|
this.isLoading = false;
|
|
414
|
+
this.canRetry = true;
|
|
216
415
|
this.cdr.detectChanges();
|
|
217
|
-
this.resetForm();
|
|
218
416
|
},
|
|
219
417
|
});
|
|
220
418
|
}
|
|
419
|
+
retryUpload() {
|
|
420
|
+
this.uploadPhoto();
|
|
421
|
+
}
|
|
422
|
+
// --- Helpers ---
|
|
221
423
|
resetForm(preserveError = false) {
|
|
222
424
|
this.fileNameFront = '';
|
|
223
425
|
this.fileNameBack = '';
|
|
224
426
|
this.photoBase64Front = '';
|
|
225
427
|
this.photoBase64Back = '';
|
|
428
|
+
this.photoPreviewFront = '';
|
|
429
|
+
this.photoPreviewBack = '';
|
|
226
430
|
this.frontPhotoUploaded = false;
|
|
227
431
|
this.backPhotoUploaded = false;
|
|
228
432
|
if (!preserveError) {
|
|
229
433
|
this.fileError = null;
|
|
230
434
|
}
|
|
231
|
-
this.
|
|
435
|
+
this.stopCamera();
|
|
232
436
|
this.control.reset();
|
|
233
437
|
this.isLoading = false;
|
|
234
438
|
this.successMessage = null;
|
|
439
|
+
this.canRetry = false;
|
|
440
|
+
this.isDragOver = false;
|
|
235
441
|
}
|
|
236
442
|
checkUploadCondition() {
|
|
237
|
-
if (this.oldIdCard
|
|
443
|
+
if (this.oldIdCard && this.frontPhotoUploaded ||
|
|
444
|
+
!this.oldIdCard && this.frontPhotoUploaded && this.backPhotoUploaded) {
|
|
238
445
|
this.uploadPhoto();
|
|
239
446
|
}
|
|
240
447
|
}
|
|
@@ -256,29 +463,26 @@ export class FormlyScanIdComponent extends FieldType {
|
|
|
256
463
|
if (!step?.sections)
|
|
257
464
|
return null;
|
|
258
465
|
for (const section of step.sections) {
|
|
259
|
-
for (const
|
|
260
|
-
if (typeof
|
|
261
|
-
|
|
262
|
-
return
|
|
466
|
+
for (const ctrl of section.controls || []) {
|
|
467
|
+
if (typeof ctrl.fillValue === 'string' &&
|
|
468
|
+
ctrl.fillValue.trim() !== '') {
|
|
469
|
+
return ctrl.fillValue.trim();
|
|
263
470
|
}
|
|
264
471
|
}
|
|
265
472
|
}
|
|
266
473
|
return null;
|
|
267
474
|
}
|
|
268
475
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormlyScanIdComponent, deps: [{ token: i1.ApplicationDataService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
269
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FormlyScanIdComponent, selector: "app-formly-scan-id", viewQueries: [{ propertyName: "fileInputFront", first: true, predicate: ["fileInputFront"], descendants: true }, { propertyName: "fileInputBack", first: true, predicate: ["fileInputBack"], descendants: true }, { propertyName: "videoElement", first: true, predicate: ["videoElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"scan-id-container\">\n <h2 class=\"title\">{{ props[\"name\"] }}</h2>\n <p class=\"description\">{{ props[\"description\"] }}</p>\n\n <!-- Selection Step -->\n <div class=\"card-selection-container\">\n <div class=\"card-options\">\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n </div>\n </div>\n\n <div *ngIf=\"isLoading\" class=\"loading-spinner\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div *ngIf=\"cardTypeSelected && !isLoading\" class=\"actions\">\n <!-- Step 1: Upload Front Photo -->\n <div *ngIf=\"!frontPhotoUploaded\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadFrontPrompt || 'Please upload the front photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputFront (change)=\"onFileSelected($event, true)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputFront.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameFront ? fileNameFront : props['labels'].uploadFileButtonTranslations || 'Upload Front Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div>\n\n <!-- Step 2: Upload Back Photo (Only for New ID Cards) -->\n <div *ngIf=\"frontPhotoUploaded && !oldIdCard && !isLoading\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadBackPrompt || 'Please upload the back photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputBack (change)=\"onFileSelected($event, false)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputBack.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameBack ? fileNameBack : props['labels'].uploadFileButtonTranslations || 'Upload Back Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div> \n <!-- Take Photo Button (Optional) -->\n <div *ngIf=\"props['config'].showTakePictureButton\" class=\"take-photo-container\">\n <button mat-flat-button color=\"accent\" (click)=\"takePicture()\">\n <mat-icon>camera_alt</mat-icon>\n {{ props['labels'].takePictureButtonTranslations || 'Take a photo' }}\n </button>\n <video #videoElement *ngIf=\"videoStream\" width=\"100%\" class=\"video-preview\" autoplay></video>\n\n <!-- Take Front Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && !frontPhotoUploaded\" (click)=\"capturePhoto(true)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.frontId || 'Take a photo' }}\n </button>\n\n <!-- Take Back Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && frontPhotoUploaded && !oldIdCard\" (click)=\"capturePhoto(false)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.backId || 'Take a photo' }}\n </button>\n </div>\n </div>\n <div *ngIf=\"successMessage && isScanValid\" class=\"success-message-container\">\n <mat-icon class=\"large-icon\" color=\"primary\">check_circle</mat-icon>\n </div>\n</div>", styles: [".loading-spinner{display:flex;justify-content:center;align-items:center;margin-top:20px}.success-message-container{display:flex;align-items:center;gap:8px;color:green;font-weight:700;justify-content:center}.large-icon{font-size:36px;width:36px;height:36px}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:20px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;text-align:center}.scan-id-container .card-selection-container{margin-bottom:20px}.scan-id-container .card-options{display:flex;justify-content:space-around}.scan-id-container .card-option{border:2px solid transparent;border-radius:10px;cursor:pointer;padding:10px;text-align:center;transition:border-color .3s,background-color .3s}.scan-id-container .card-option:hover{border-color:#3f51b5}.scan-id-container .card-option img{max-width:100%;height:auto;margin-bottom:10px}.scan-id-container .card-option p{font-weight:700}.scan-id-container .card-option.selected{border-color:#3f51b5;background-color:#e3f2fd;box-shadow:0 0 10px #0000001a}.scan-id-container .title{font-size:24px;font-weight:700;color:#333;margin-bottom:10px}.scan-id-container .description{font-size:16px;color:#666;margin-bottom:20px}.scan-id-container .actions{display:flex;flex-direction:column;gap:20px}.scan-id-container .actions .upload-button-container,.scan-id-container .actions .take-photo-container{display:flex;flex-direction:column;align-items:center}.scan-id-container .actions .upload-button-container button,.scan-id-container .actions .take-photo-container button{display:flex;align-items:center;gap:8px;padding:10px 20px;font-size:16px;font-weight:600;border-radius:50px;transition:background-color .3s}.scan-id-container .actions .upload-button-container button mat-icon,.scan-id-container .actions .take-photo-container button mat-icon{font-size:20px}.scan-id-container .actions .upload-button-container button:hover,.scan-id-container .actions .take-photo-container button:hover{background-color:#0069c0}.scan-id-container .actions .upload-button-container .error-message,.scan-id-container .actions .take-photo-container .error-message{color:#e53935;font-size:14px;margin-top:10px}.scan-id-container .actions .video-preview{margin-top:20px;border-radius:8px;box-shadow:0 2px 4px #0003}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
476
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FormlyScanIdComponent, selector: "app-formly-scan-id", viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "videoElement", first: true, predicate: ["videoElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"scan-id-container\">\n <!-- Header -->\n <h2 class=\"scan-id-title\">{{ props[\"name\"] }}</h2>\n <p class=\"scan-id-description\">{{ props[\"description\"] }}</p>\n\n <!-- Step Progress Indicator -->\n <div class=\"step-progress\" *ngIf=\"wizardSteps.length > 1\" role=\"list\">\n <div class=\"step-progress__item\" *ngFor=\"let step of wizardSteps; let i = index; let last = last\" role=\"listitem\">\n <div class=\"step-progress__circle\"\n [class.active]=\"step.status === 'active'\"\n [class.completed]=\"step.status === 'completed'\"\n [class.upcoming]=\"step.status === 'upcoming'\"\n [class.clickable]=\"step.status === 'completed'\"\n [attr.aria-current]=\"step.status === 'active' ? 'step' : null\"\n (click)=\"step.status === 'completed' ? goToStep(i) : null\">\n <mat-icon *ngIf=\"step.status === 'completed'\">check</mat-icon>\n <span *ngIf=\"step.status !== 'completed'\">{{ i + 1 }}</span>\n </div>\n <span class=\"step-progress__label\"\n [class.active]=\"step.status === 'active'\"\n [class.completed]=\"step.status === 'completed'\">\n {{ step.label }}\n </span>\n <div class=\"step-progress__connector\" *ngIf=\"!last\"\n [class.completed]=\"step.status === 'completed'\">\n </div>\n </div>\n </div>\n\n <!-- Step 1: Card Type Selection -->\n <div class=\"card-type-step\" *ngIf=\"currentWizardStep === 0\">\n <div class=\"card-type-options\" role=\"radiogroup\">\n <div class=\"card-type-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\"\n (keydown.enter)=\"selectCardType(true)\"\n (keydown.space)=\"selectCardType(true); $event.preventDefault()\"\n role=\"radio\"\n [attr.aria-checked]=\"oldIdCard === true && cardTypeSelected\"\n tabindex=\"0\">\n <div class=\"card-type-option__image-wrapper\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-type-option__info\">\n <span class=\"card-type-option__label\">\n {{ props['labels']?.oldCardLabel || 'Old ID Card' }}\n </span>\n <span class=\"card-type-option__helper\">\n {{ props['labels']?.oldCardHelper || 'Single-sided card - 1 photo needed' }}\n </span>\n </div>\n </div>\n\n <div class=\"card-type-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\"\n (keydown.enter)=\"selectCardType(false)\"\n (keydown.space)=\"selectCardType(false); $event.preventDefault()\"\n role=\"radio\"\n [attr.aria-checked]=\"oldIdCard === false && cardTypeSelected\"\n tabindex=\"0\">\n <div class=\"card-type-option__image-wrapper\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n <div class=\"card-type-option__info\">\n <span class=\"card-type-option__label\">\n {{ props['labels']?.newCardLabel || 'New ID Card' }}\n </span>\n <span class=\"card-type-option__helper\">\n {{ props['labels']?.newCardHelper || 'Card with front and back - 2 photos needed' }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Steps 2-3: Photo Capture / Upload -->\n <div class=\"photo-step\" *ngIf=\"(currentWizardStep === 1 || currentWizardStep === 2) && !isLoading && !(successMessage && isScanValid)\">\n\n <!-- Back Button -->\n <button mat-button class=\"back-btn\" (click)=\"goBack()\">\n <mat-icon>arrow_back</mat-icon>\n {{ currentWizardStep === 1\n ? (props['labels']?.changeCardTypeLabel || 'Change card type')\n : (props['labels']?.backLabel || 'Back') }}\n </button>\n\n <!-- Photo Preview Mode -->\n <div class=\"photo-preview\" *ngIf=\"currentPhotoPreview && !cameraActive\">\n <p class=\"photo-preview__label\">{{ currentStepShortLabel }}</p>\n <img class=\"photo-preview__image\" [src]=\"currentPhotoPreview\" [alt]=\"currentStepShortLabel\" />\n <div class=\"photo-preview__actions\">\n <button mat-stroked-button (click)=\"resetCurrentPhoto()\">\n <mat-icon>refresh</mat-icon>\n {{ props['labels']?.retakeLabel || 'Retake' }}\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"confirmPhoto()\">\n <mat-icon>check</mat-icon>\n {{ props['labels']?.usePhotoLabel || 'Use This Photo' }}\n </button>\n </div>\n </div>\n\n <!-- Capture Mode (no photo yet) -->\n <div class=\"photo-capture\" *ngIf=\"!currentPhotoPreview && !cameraActive\">\n <p class=\"photo-capture__label\">{{ currentStepLabel }}</p>\n\n <!-- Drop Zone -->\n <div class=\"photo-capture__dropzone\"\n [class.dragover]=\"isDragOver\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Drop zone for ' + currentStepShortLabel + ' upload'\">\n <mat-icon class=\"dropzone-icon\">cloud_upload</mat-icon>\n <p class=\"dropzone-text\">\n {{ props['labels']?.dragDropPrompt || 'Drag & drop your photo here, or use the buttons below' }}\n </p>\n <p class=\"dropzone-formats\">\n {{ props['labels']?.formatsLabel || 'Accepted' }}: {{ validFormats.join(', ') }} ·\n {{ props['labels']?.maxSizeLabel || 'Max' }}: {{ maxFileSizeKB }}KB\n </p>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"photo-capture__actions\">\n <input type=\"file\" #fileInput (change)=\"onFileSelected($event)\" hidden [accept]=\"validFormats.join(',')\" />\n <button mat-flat-button color=\"primary\" (click)=\"fileInput.click()\" class=\"action-btn\">\n <mat-icon>upload_file</mat-icon>\n {{ props['labels']?.uploadFileButtonTranslations || 'Upload File' }}\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"openCamera()\" class=\"action-btn\"\n *ngIf=\"props['config'].showTakePictureButton !== false\">\n <mat-icon>photo_camera</mat-icon>\n {{ props['labels']?.takePictureButtonTranslations || 'Take Photo' }}\n </button>\n </div>\n </div>\n\n <!-- Camera Viewfinder -->\n <div class=\"camera-container\" *ngIf=\"cameraActive\">\n <!-- Camera selector -->\n <mat-form-field *ngIf=\"availableCameras.length > 1\" appearance=\"outline\" class=\"camera-selector\">\n <mat-label>{{ props['labels']?.selectCameraLabel || 'Select camera' }}</mat-label>\n <mat-select [(value)]=\"selectedCameraId\" (selectionChange)=\"switchCamera($event.value)\">\n <mat-option *ngFor=\"let cam of availableCameras; let i = index\" [value]=\"cam.deviceId\">\n {{ cam.label || 'Camera ' + (i + 1) }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <div class=\"camera-viewfinder\">\n <video #videoElement autoplay playsinline class=\"camera-video\"></video>\n <div class=\"camera-flash-overlay\" [class.flash]=\"showFlash\"></div>\n </div>\n\n <div class=\"camera-controls\">\n <button mat-stroked-button (click)=\"closeCamera()\" class=\"camera-cancel-btn\">\n {{ props['labels']?.cancelLabel || 'Cancel' }}\n </button>\n <button mat-fab color=\"primary\" (click)=\"captureCurrentPhoto()\" class=\"camera-capture-btn\"\n [attr.aria-label]=\"'Capture ' + currentStepShortLabel\">\n <mat-icon>photo_camera</mat-icon>\n </button>\n <div class=\"camera-spacer\"></div>\n </div>\n </div>\n\n <!-- Error Display -->\n <div class=\"photo-step__error\" *ngIf=\"fileError\" role=\"alert\" aria-live=\"assertive\">\n <mat-icon>error_outline</mat-icon>\n <span>{{ fileError }}</span>\n <button mat-stroked-button *ngIf=\"canRetry\" (click)=\"retryUpload()\" class=\"retry-btn\">\n <mat-icon>refresh</mat-icon>\n {{ props['labels']?.retryLabel || 'Try Again' }}\n </button>\n </div>\n </div>\n\n <!-- Loading / Processing State -->\n <div class=\"processing-overlay\" *ngIf=\"isLoading\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n <p class=\"processing-text\">\n {{ props['labels']?.processingMessage || 'Processing your ID scan...' }}\n </p>\n </div>\n\n <!-- Success State -->\n <div class=\"scan-success\" *ngIf=\"successMessage && isScanValid\" role=\"status\" aria-live=\"polite\">\n <mat-icon class=\"scan-success__icon\">check_circle</mat-icon>\n <h3 class=\"scan-success__title\">\n {{ props['labels']?.successTitle || 'ID scan successful' }}\n </h3>\n </div>\n</div>\n", styles: ["@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes flashCapture{0%{opacity:0}50%{opacity:.8}to{opacity:0}}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:24px;background-color:#fff;border-radius:7px;box-shadow:0 2px 12px #00000014;text-align:center}@media (max-width: 600px){.scan-id-container{padding:16px}}.scan-id-title{font-size:22px;font-weight:700;color:#2a3547;margin:0 0 8px}.scan-id-description{font-size:14px;color:#5a6a85;margin:0 0 24px}.step-progress{display:flex;justify-content:center;align-items:flex-start;gap:0;margin-bottom:32px;padding:0 8px}@media (max-width: 600px){.step-progress{margin-bottom:24px}}.step-progress__item{display:flex;flex-direction:column;align-items:center;position:relative;flex:1;min-width:0}.step-progress__circle{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:600;transition:all .3s ease;position:relative;z-index:1;flex-shrink:0}.step-progress__circle.upcoming{background:#f2f6fa;color:#a1aab4;border:2px solid #dfe5ef}.step-progress__circle.active{background:#5d87ff;color:#fff;border:2px solid #5d87ff;box-shadow:0 2px 8px #5d87ff59}.step-progress__circle.completed{background:#13deb9;color:#fff;border:2px solid #13deb9}.step-progress__circle.completed mat-icon{font-size:18px;width:18px;height:18px}.step-progress__label{font-size:12px;color:#a1aab4;margin-top:8px;text-align:center;line-height:1.3;max-width:100px}.step-progress__label.active{color:#5d87ff;font-weight:600}.step-progress__label.completed{color:#13deb9;font-weight:500}@media (max-width: 600px){.step-progress__label{font-size:11px;max-width:80px}}.step-progress__connector{position:absolute;top:18px;left:calc(50% + 22px);right:calc(-50% + 22px);height:2px;background:#dfe5ef;transition:background .3s ease;z-index:0;width:calc(100% - 44px)}.step-progress__connector.completed{background:#13deb9}.card-type-step{animation:fadeIn .3s ease-out}.card-type-options{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media (max-width: 600px){.card-type-options{grid-template-columns:1fr;gap:12px}}.card-type-option{border:2px solid #e5eaef;border-radius:7px;cursor:pointer;padding:16px;text-align:center;transition:border-color .2s,background-color .2s,box-shadow .2s;outline:none}.card-type-option:hover{border-color:#5d87ff4d;background:#5d87ff14}.card-type-option:focus-visible{border-color:#5d87ff;box-shadow:0 0 0 3px #5d87ff33}.card-type-option.selected{border-color:#5d87ff;background:#5d87ff14;box-shadow:0 2px 8px #5d87ff26}.card-type-option__image-wrapper{margin-bottom:12px}.card-type-option__image-wrapper img{max-width:100%;height:auto;max-height:140px;object-fit:contain;border-radius:4px}@media (max-width: 600px){.card-type-option__image-wrapper img{max-height:120px}}.card-type-option__info{display:flex;flex-direction:column;gap:4px}.card-type-option__label{font-size:15px;font-weight:600;color:#2a3547}.card-type-option__helper{font-size:13px;color:#5a6a85}.back-btn{display:inline-flex;align-items:center;gap:4px;margin-bottom:16px;color:#5a6a85;font-size:14px;cursor:pointer}.back-btn mat-icon{font-size:18px;width:18px;height:18px}.step-progress__circle.clickable{cursor:pointer}.step-progress__circle.clickable:hover{transform:scale(1.1)}.photo-step{animation:fadeIn .3s ease-out}.photo-capture__label{font-size:15px;color:#2a3547;font-weight:500;margin:0 0 16px}.photo-capture__dropzone{border:2px dashed #ccd5e0;border-radius:7px;padding:32px 16px;display:flex;flex-direction:column;align-items:center;gap:8px;transition:border-color .2s,background-color .2s;cursor:default;margin-bottom:16px}.photo-capture__dropzone.dragover{border-color:#5d87ff;background:#5d87ff14}@media (max-width: 600px){.photo-capture__dropzone{padding:24px 12px}}.dropzone-icon{font-size:40px;width:40px;height:40px;color:#a1aab4}.dropzone-text{font-size:14px;color:#5a6a85;margin:0}.dropzone-formats{font-size:12px;color:#a1aab4;margin:0}.photo-capture__actions{display:flex;gap:12px;justify-content:center}@media (max-width: 600px){.photo-capture__actions{flex-direction:column;align-items:stretch}}.action-btn{display:flex;align-items:center;gap:8px;padding:10px 24px;font-size:14px;font-weight:600;border-radius:7px;min-height:44px}.action-btn mat-icon{font-size:20px;width:20px;height:20px}@media (max-width: 600px){.action-btn{justify-content:center;width:100%}}.photo-preview{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;align-items:center;gap:16px}.photo-preview__label{font-size:15px;font-weight:500;color:#2a3547;margin:0}.photo-preview__image{max-height:280px;max-width:100%;object-fit:contain;border-radius:7px;border:1px solid #e5eaef}@media (max-width: 600px){.photo-preview__image{max-height:220px}}.photo-preview__actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}.photo-preview__actions button{display:flex;align-items:center;gap:6px;min-height:44px;border-radius:7px}@media (max-width: 600px){.photo-preview__actions{flex-direction:column;align-items:stretch;width:100%}.photo-preview__actions button{justify-content:center}}.camera-container{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;gap:16px}.camera-selector{width:100%}.camera-viewfinder{position:relative;border-radius:7px;overflow:hidden;background:#000}.camera-video{width:100%;max-height:400px;object-fit:cover;display:block}@media (max-width: 600px){.camera-video{max-height:300px}}.camera-flash-overlay{position:absolute;inset:0;background:#fff;opacity:0;pointer-events:none}.camera-flash-overlay.flash{animation:flashCapture .3s ease-out}.camera-controls{display:flex;align-items:center;justify-content:center;gap:16px;padding:8px 0}.camera-cancel-btn{min-height:44px;border-radius:7px}.camera-capture-btn{width:56px;height:56px}.camera-spacer{width:0}@media (min-width: 600px){.camera-spacer{width:80px}}.photo-step__error{display:flex;align-items:center;gap:12px;padding:12px 16px;margin-top:16px;background:#fa896b14;border:1px solid #fa896b;border-radius:7px;color:#2a3547;text-align:left}.photo-step__error>mat-icon{color:#fa896b;flex-shrink:0}.photo-step__error>span{flex:1;font-size:14px}@media (max-width: 600px){.photo-step__error{flex-wrap:wrap}.photo-step__error .retry-btn{width:100%;justify-content:center}}.retry-btn{display:flex;align-items:center;gap:6px;min-height:36px;border-radius:7px;flex-shrink:0}.processing-overlay{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 0}.processing-overlay mat-progress-bar{width:100%;border-radius:7px}.processing-text{font-size:14px;color:#5a6a85;margin:0}.scan-success{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;align-items:center;gap:12px;padding:32px 16px;background:#13deb914;border:1px solid #13deb9;border-radius:7px}.scan-success__icon{font-size:48px;width:48px;height:48px;color:#13deb9}.scan-success__title{font-size:18px;font-weight:600;color:#2a3547;margin:0}:host-context(.dark-theme) .scan-id-container{background-color:#2a3447;box-shadow:0 2px 12px #0000004d}:host-context(.dark-theme) .scan-id-title,:host-context(.dark-theme) .card-type-option__label,:host-context(.dark-theme) .photo-capture__label,:host-context(.dark-theme) .photo-preview__label,:host-context(.dark-theme) .scan-success__title{color:#ffffffde}:host-context(.dark-theme) .scan-id-description,:host-context(.dark-theme) .card-type-option__helper,:host-context(.dark-theme) .dropzone-text,:host-context(.dark-theme) .processing-text,:host-context(.dark-theme) .back-btn{color:#fff9}:host-context(.dark-theme) .dropzone-icon,:host-context(.dark-theme) .dropzone-formats{color:#fff6}:host-context(.dark-theme) .card-type-option{border-color:#333f55}:host-context(.dark-theme) .card-type-option:hover{border-color:#5d87ff80;background:#5d87ff1a}:host-context(.dark-theme) .card-type-option.selected{border-color:#5d87ff;background:#5d87ff26}:host-context(.dark-theme) .step-progress__circle.upcoming{background:#333f55;border-color:#465670;color:#fff6}:host-context(.dark-theme) .step-progress__label{color:#fff6}:host-context(.dark-theme) .step-progress__connector{background:#465670}:host-context(.dark-theme) .photo-capture__dropzone{border-color:#465670}:host-context(.dark-theme) .photo-capture__dropzone.dragover{border-color:#5d87ff;background:#5d87ff1a}:host-context(.dark-theme) .photo-preview__image{border-color:#333f55}:host-context(.dark-theme) .photo-step__error{background:#fa896b1a;color:#ffffffde}:host-context(.dark-theme) .scan-success{background:#13deb91a}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatFabButton, selector: "button[mat-fab]", inputs: ["extended"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }] }); }
|
|
270
477
|
}
|
|
271
478
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormlyScanIdComponent, decorators: [{
|
|
272
479
|
type: Component,
|
|
273
|
-
args: [{ selector: 'app-formly-scan-id', template: "<div class=\"scan-id-container\">\n <h2 class=\"title\">{{ props[\"name\"] }}</h2>\n <p class=\"description\">{{ props[\"description\"] }}</p>\n\n <!-- Selection Step -->\n <div class=\"card-selection-container\">\n <div class=\"card-options\">\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n </div>\n </div>\n\n <div *ngIf=\"isLoading\" class=\"loading-spinner\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div *ngIf=\"cardTypeSelected && !isLoading\" class=\"actions\">\n <!-- Step 1: Upload Front Photo -->\n <div *ngIf=\"!frontPhotoUploaded\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadFrontPrompt || 'Please upload the front photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputFront (change)=\"onFileSelected($event, true)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputFront.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameFront ? fileNameFront : props['labels'].uploadFileButtonTranslations || 'Upload Front Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div>\n\n <!-- Step 2: Upload Back Photo (Only for New ID Cards) -->\n <div *ngIf=\"frontPhotoUploaded && !oldIdCard && !isLoading\" class=\"upload-button-container\">\n <p>{{ props['labels'].uploadBackPrompt || 'Please upload the back photo of your ID card.' }}</p>\n <input type=\"file\" #fileInputBack (change)=\"onFileSelected($event, false)\" hidden />\n <button mat-flat-button color=\"primary\" (click)=\"fileInputBack.click()\">\n <mat-icon>cloud_upload</mat-icon>\n {{ fileNameBack ? fileNameBack : props['labels'].uploadFileButtonTranslations || 'Upload Back Photo' }}\n </button>\n <div *ngIf=\"fileError\" class=\"error-message\">\n {{ fileError }}\n </div>\n </div> \n <!-- Take Photo Button (Optional) -->\n <div *ngIf=\"props['config'].showTakePictureButton\" class=\"take-photo-container\">\n <button mat-flat-button color=\"accent\" (click)=\"takePicture()\">\n <mat-icon>camera_alt</mat-icon>\n {{ props['labels'].takePictureButtonTranslations || 'Take a photo' }}\n </button>\n <video #videoElement *ngIf=\"videoStream\" width=\"100%\" class=\"video-preview\" autoplay></video>\n\n <!-- Take Front Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && !frontPhotoUploaded\" (click)=\"capturePhoto(true)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.frontId || 'Take a photo' }}\n </button>\n\n <!-- Take Back Photo -->\n <button mat-flat-button color=\"warn\" *ngIf=\"videoStream && frontPhotoUploaded && !oldIdCard\" (click)=\"capturePhoto(false)\">\n <mat-icon>photo_camera</mat-icon>\n {{ this.props['errorMessages']?.backId || 'Take a photo' }}\n </button>\n </div>\n </div>\n <div *ngIf=\"successMessage && isScanValid\" class=\"success-message-container\">\n <mat-icon class=\"large-icon\" color=\"primary\">check_circle</mat-icon>\n </div>\n</div>", styles: [".loading-spinner{display:flex;justify-content:center;align-items:center;margin-top:20px}.success-message-container{display:flex;align-items:center;gap:8px;color:green;font-weight:700;justify-content:center}.large-icon{font-size:36px;width:36px;height:36px}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:20px;background-color:#fff;border-radius:8px;box-shadow:0 4px 8px #0000001a;text-align:center}.scan-id-container .card-selection-container{margin-bottom:20px}.scan-id-container .card-options{display:flex;justify-content:space-around}.scan-id-container .card-option{border:2px solid transparent;border-radius:10px;cursor:pointer;padding:10px;text-align:center;transition:border-color .3s,background-color .3s}.scan-id-container .card-option:hover{border-color:#3f51b5}.scan-id-container .card-option img{max-width:100%;height:auto;margin-bottom:10px}.scan-id-container .card-option p{font-weight:700}.scan-id-container .card-option.selected{border-color:#3f51b5;background-color:#e3f2fd;box-shadow:0 0 10px #0000001a}.scan-id-container .title{font-size:24px;font-weight:700;color:#333;margin-bottom:10px}.scan-id-container .description{font-size:16px;color:#666;margin-bottom:20px}.scan-id-container .actions{display:flex;flex-direction:column;gap:20px}.scan-id-container .actions .upload-button-container,.scan-id-container .actions .take-photo-container{display:flex;flex-direction:column;align-items:center}.scan-id-container .actions .upload-button-container button,.scan-id-container .actions .take-photo-container button{display:flex;align-items:center;gap:8px;padding:10px 20px;font-size:16px;font-weight:600;border-radius:50px;transition:background-color .3s}.scan-id-container .actions .upload-button-container button mat-icon,.scan-id-container .actions .take-photo-container button mat-icon{font-size:20px}.scan-id-container .actions .upload-button-container button:hover,.scan-id-container .actions .take-photo-container button:hover{background-color:#0069c0}.scan-id-container .actions .upload-button-container .error-message,.scan-id-container .actions .take-photo-container .error-message{color:#e53935;font-size:14px;margin-top:10px}.scan-id-container .actions .video-preview{margin-top:20px;border-radius:8px;box-shadow:0 2px 4px #0003}\n"] }]
|
|
274
|
-
}], ctorParameters: () => [{ type: i1.ApplicationDataService }, { type: i0.ChangeDetectorRef }], propDecorators: {
|
|
275
|
-
type: ViewChild,
|
|
276
|
-
args: ['fileInputFront']
|
|
277
|
-
}], fileInputBack: [{
|
|
480
|
+
args: [{ selector: 'app-formly-scan-id', template: "<div class=\"scan-id-container\">\n <!-- Header -->\n <h2 class=\"scan-id-title\">{{ props[\"name\"] }}</h2>\n <p class=\"scan-id-description\">{{ props[\"description\"] }}</p>\n\n <!-- Step Progress Indicator -->\n <div class=\"step-progress\" *ngIf=\"wizardSteps.length > 1\" role=\"list\">\n <div class=\"step-progress__item\" *ngFor=\"let step of wizardSteps; let i = index; let last = last\" role=\"listitem\">\n <div class=\"step-progress__circle\"\n [class.active]=\"step.status === 'active'\"\n [class.completed]=\"step.status === 'completed'\"\n [class.upcoming]=\"step.status === 'upcoming'\"\n [class.clickable]=\"step.status === 'completed'\"\n [attr.aria-current]=\"step.status === 'active' ? 'step' : null\"\n (click)=\"step.status === 'completed' ? goToStep(i) : null\">\n <mat-icon *ngIf=\"step.status === 'completed'\">check</mat-icon>\n <span *ngIf=\"step.status !== 'completed'\">{{ i + 1 }}</span>\n </div>\n <span class=\"step-progress__label\"\n [class.active]=\"step.status === 'active'\"\n [class.completed]=\"step.status === 'completed'\">\n {{ step.label }}\n </span>\n <div class=\"step-progress__connector\" *ngIf=\"!last\"\n [class.completed]=\"step.status === 'completed'\">\n </div>\n </div>\n </div>\n\n <!-- Step 1: Card Type Selection -->\n <div class=\"card-type-step\" *ngIf=\"currentWizardStep === 0\">\n <div class=\"card-type-options\" role=\"radiogroup\">\n <div class=\"card-type-option\"\n [class.selected]=\"oldIdCard === true && cardTypeSelected\"\n (click)=\"selectCardType(true)\"\n (keydown.enter)=\"selectCardType(true)\"\n (keydown.space)=\"selectCardType(true); $event.preventDefault()\"\n role=\"radio\"\n [attr.aria-checked]=\"oldIdCard === true && cardTypeSelected\"\n tabindex=\"0\">\n <div class=\"card-type-option__image-wrapper\">\n <img src=\"assets/images/origin-form/old-id-card.png\" alt=\"Old ID Card\" />\n </div>\n <div class=\"card-type-option__info\">\n <span class=\"card-type-option__label\">\n {{ props['labels']?.oldCardLabel || 'Old ID Card' }}\n </span>\n <span class=\"card-type-option__helper\">\n {{ props['labels']?.oldCardHelper || 'Single-sided card - 1 photo needed' }}\n </span>\n </div>\n </div>\n\n <div class=\"card-type-option\"\n [class.selected]=\"oldIdCard === false && cardTypeSelected\"\n (click)=\"selectCardType(false)\"\n (keydown.enter)=\"selectCardType(false)\"\n (keydown.space)=\"selectCardType(false); $event.preventDefault()\"\n role=\"radio\"\n [attr.aria-checked]=\"oldIdCard === false && cardTypeSelected\"\n tabindex=\"0\">\n <div class=\"card-type-option__image-wrapper\">\n <img src=\"assets/images/origin-form/new-id-card.png\" alt=\"New ID Card\" />\n </div>\n <div class=\"card-type-option__info\">\n <span class=\"card-type-option__label\">\n {{ props['labels']?.newCardLabel || 'New ID Card' }}\n </span>\n <span class=\"card-type-option__helper\">\n {{ props['labels']?.newCardHelper || 'Card with front and back - 2 photos needed' }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Steps 2-3: Photo Capture / Upload -->\n <div class=\"photo-step\" *ngIf=\"(currentWizardStep === 1 || currentWizardStep === 2) && !isLoading && !(successMessage && isScanValid)\">\n\n <!-- Back Button -->\n <button mat-button class=\"back-btn\" (click)=\"goBack()\">\n <mat-icon>arrow_back</mat-icon>\n {{ currentWizardStep === 1\n ? (props['labels']?.changeCardTypeLabel || 'Change card type')\n : (props['labels']?.backLabel || 'Back') }}\n </button>\n\n <!-- Photo Preview Mode -->\n <div class=\"photo-preview\" *ngIf=\"currentPhotoPreview && !cameraActive\">\n <p class=\"photo-preview__label\">{{ currentStepShortLabel }}</p>\n <img class=\"photo-preview__image\" [src]=\"currentPhotoPreview\" [alt]=\"currentStepShortLabel\" />\n <div class=\"photo-preview__actions\">\n <button mat-stroked-button (click)=\"resetCurrentPhoto()\">\n <mat-icon>refresh</mat-icon>\n {{ props['labels']?.retakeLabel || 'Retake' }}\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"confirmPhoto()\">\n <mat-icon>check</mat-icon>\n {{ props['labels']?.usePhotoLabel || 'Use This Photo' }}\n </button>\n </div>\n </div>\n\n <!-- Capture Mode (no photo yet) -->\n <div class=\"photo-capture\" *ngIf=\"!currentPhotoPreview && !cameraActive\">\n <p class=\"photo-capture__label\">{{ currentStepLabel }}</p>\n\n <!-- Drop Zone -->\n <div class=\"photo-capture__dropzone\"\n [class.dragover]=\"isDragOver\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Drop zone for ' + currentStepShortLabel + ' upload'\">\n <mat-icon class=\"dropzone-icon\">cloud_upload</mat-icon>\n <p class=\"dropzone-text\">\n {{ props['labels']?.dragDropPrompt || 'Drag & drop your photo here, or use the buttons below' }}\n </p>\n <p class=\"dropzone-formats\">\n {{ props['labels']?.formatsLabel || 'Accepted' }}: {{ validFormats.join(', ') }} ·\n {{ props['labels']?.maxSizeLabel || 'Max' }}: {{ maxFileSizeKB }}KB\n </p>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"photo-capture__actions\">\n <input type=\"file\" #fileInput (change)=\"onFileSelected($event)\" hidden [accept]=\"validFormats.join(',')\" />\n <button mat-flat-button color=\"primary\" (click)=\"fileInput.click()\" class=\"action-btn\">\n <mat-icon>upload_file</mat-icon>\n {{ props['labels']?.uploadFileButtonTranslations || 'Upload File' }}\n </button>\n <button mat-flat-button color=\"primary\" (click)=\"openCamera()\" class=\"action-btn\"\n *ngIf=\"props['config'].showTakePictureButton !== false\">\n <mat-icon>photo_camera</mat-icon>\n {{ props['labels']?.takePictureButtonTranslations || 'Take Photo' }}\n </button>\n </div>\n </div>\n\n <!-- Camera Viewfinder -->\n <div class=\"camera-container\" *ngIf=\"cameraActive\">\n <!-- Camera selector -->\n <mat-form-field *ngIf=\"availableCameras.length > 1\" appearance=\"outline\" class=\"camera-selector\">\n <mat-label>{{ props['labels']?.selectCameraLabel || 'Select camera' }}</mat-label>\n <mat-select [(value)]=\"selectedCameraId\" (selectionChange)=\"switchCamera($event.value)\">\n <mat-option *ngFor=\"let cam of availableCameras; let i = index\" [value]=\"cam.deviceId\">\n {{ cam.label || 'Camera ' + (i + 1) }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n\n <div class=\"camera-viewfinder\">\n <video #videoElement autoplay playsinline class=\"camera-video\"></video>\n <div class=\"camera-flash-overlay\" [class.flash]=\"showFlash\"></div>\n </div>\n\n <div class=\"camera-controls\">\n <button mat-stroked-button (click)=\"closeCamera()\" class=\"camera-cancel-btn\">\n {{ props['labels']?.cancelLabel || 'Cancel' }}\n </button>\n <button mat-fab color=\"primary\" (click)=\"captureCurrentPhoto()\" class=\"camera-capture-btn\"\n [attr.aria-label]=\"'Capture ' + currentStepShortLabel\">\n <mat-icon>photo_camera</mat-icon>\n </button>\n <div class=\"camera-spacer\"></div>\n </div>\n </div>\n\n <!-- Error Display -->\n <div class=\"photo-step__error\" *ngIf=\"fileError\" role=\"alert\" aria-live=\"assertive\">\n <mat-icon>error_outline</mat-icon>\n <span>{{ fileError }}</span>\n <button mat-stroked-button *ngIf=\"canRetry\" (click)=\"retryUpload()\" class=\"retry-btn\">\n <mat-icon>refresh</mat-icon>\n {{ props['labels']?.retryLabel || 'Try Again' }}\n </button>\n </div>\n </div>\n\n <!-- Loading / Processing State -->\n <div class=\"processing-overlay\" *ngIf=\"isLoading\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n <p class=\"processing-text\">\n {{ props['labels']?.processingMessage || 'Processing your ID scan...' }}\n </p>\n </div>\n\n <!-- Success State -->\n <div class=\"scan-success\" *ngIf=\"successMessage && isScanValid\" role=\"status\" aria-live=\"polite\">\n <mat-icon class=\"scan-success__icon\">check_circle</mat-icon>\n <h3 class=\"scan-success__title\">\n {{ props['labels']?.successTitle || 'ID scan successful' }}\n </h3>\n </div>\n</div>\n", styles: ["@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes flashCapture{0%{opacity:0}50%{opacity:.8}to{opacity:0}}.scan-id-container{max-width:600px;margin:0 auto 16px;padding:24px;background-color:#fff;border-radius:7px;box-shadow:0 2px 12px #00000014;text-align:center}@media (max-width: 600px){.scan-id-container{padding:16px}}.scan-id-title{font-size:22px;font-weight:700;color:#2a3547;margin:0 0 8px}.scan-id-description{font-size:14px;color:#5a6a85;margin:0 0 24px}.step-progress{display:flex;justify-content:center;align-items:flex-start;gap:0;margin-bottom:32px;padding:0 8px}@media (max-width: 600px){.step-progress{margin-bottom:24px}}.step-progress__item{display:flex;flex-direction:column;align-items:center;position:relative;flex:1;min-width:0}.step-progress__circle{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:600;transition:all .3s ease;position:relative;z-index:1;flex-shrink:0}.step-progress__circle.upcoming{background:#f2f6fa;color:#a1aab4;border:2px solid #dfe5ef}.step-progress__circle.active{background:#5d87ff;color:#fff;border:2px solid #5d87ff;box-shadow:0 2px 8px #5d87ff59}.step-progress__circle.completed{background:#13deb9;color:#fff;border:2px solid #13deb9}.step-progress__circle.completed mat-icon{font-size:18px;width:18px;height:18px}.step-progress__label{font-size:12px;color:#a1aab4;margin-top:8px;text-align:center;line-height:1.3;max-width:100px}.step-progress__label.active{color:#5d87ff;font-weight:600}.step-progress__label.completed{color:#13deb9;font-weight:500}@media (max-width: 600px){.step-progress__label{font-size:11px;max-width:80px}}.step-progress__connector{position:absolute;top:18px;left:calc(50% + 22px);right:calc(-50% + 22px);height:2px;background:#dfe5ef;transition:background .3s ease;z-index:0;width:calc(100% - 44px)}.step-progress__connector.completed{background:#13deb9}.card-type-step{animation:fadeIn .3s ease-out}.card-type-options{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media (max-width: 600px){.card-type-options{grid-template-columns:1fr;gap:12px}}.card-type-option{border:2px solid #e5eaef;border-radius:7px;cursor:pointer;padding:16px;text-align:center;transition:border-color .2s,background-color .2s,box-shadow .2s;outline:none}.card-type-option:hover{border-color:#5d87ff4d;background:#5d87ff14}.card-type-option:focus-visible{border-color:#5d87ff;box-shadow:0 0 0 3px #5d87ff33}.card-type-option.selected{border-color:#5d87ff;background:#5d87ff14;box-shadow:0 2px 8px #5d87ff26}.card-type-option__image-wrapper{margin-bottom:12px}.card-type-option__image-wrapper img{max-width:100%;height:auto;max-height:140px;object-fit:contain;border-radius:4px}@media (max-width: 600px){.card-type-option__image-wrapper img{max-height:120px}}.card-type-option__info{display:flex;flex-direction:column;gap:4px}.card-type-option__label{font-size:15px;font-weight:600;color:#2a3547}.card-type-option__helper{font-size:13px;color:#5a6a85}.back-btn{display:inline-flex;align-items:center;gap:4px;margin-bottom:16px;color:#5a6a85;font-size:14px;cursor:pointer}.back-btn mat-icon{font-size:18px;width:18px;height:18px}.step-progress__circle.clickable{cursor:pointer}.step-progress__circle.clickable:hover{transform:scale(1.1)}.photo-step{animation:fadeIn .3s ease-out}.photo-capture__label{font-size:15px;color:#2a3547;font-weight:500;margin:0 0 16px}.photo-capture__dropzone{border:2px dashed #ccd5e0;border-radius:7px;padding:32px 16px;display:flex;flex-direction:column;align-items:center;gap:8px;transition:border-color .2s,background-color .2s;cursor:default;margin-bottom:16px}.photo-capture__dropzone.dragover{border-color:#5d87ff;background:#5d87ff14}@media (max-width: 600px){.photo-capture__dropzone{padding:24px 12px}}.dropzone-icon{font-size:40px;width:40px;height:40px;color:#a1aab4}.dropzone-text{font-size:14px;color:#5a6a85;margin:0}.dropzone-formats{font-size:12px;color:#a1aab4;margin:0}.photo-capture__actions{display:flex;gap:12px;justify-content:center}@media (max-width: 600px){.photo-capture__actions{flex-direction:column;align-items:stretch}}.action-btn{display:flex;align-items:center;gap:8px;padding:10px 24px;font-size:14px;font-weight:600;border-radius:7px;min-height:44px}.action-btn mat-icon{font-size:20px;width:20px;height:20px}@media (max-width: 600px){.action-btn{justify-content:center;width:100%}}.photo-preview{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;align-items:center;gap:16px}.photo-preview__label{font-size:15px;font-weight:500;color:#2a3547;margin:0}.photo-preview__image{max-height:280px;max-width:100%;object-fit:contain;border-radius:7px;border:1px solid #e5eaef}@media (max-width: 600px){.photo-preview__image{max-height:220px}}.photo-preview__actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}.photo-preview__actions button{display:flex;align-items:center;gap:6px;min-height:44px;border-radius:7px}@media (max-width: 600px){.photo-preview__actions{flex-direction:column;align-items:stretch;width:100%}.photo-preview__actions button{justify-content:center}}.camera-container{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;gap:16px}.camera-selector{width:100%}.camera-viewfinder{position:relative;border-radius:7px;overflow:hidden;background:#000}.camera-video{width:100%;max-height:400px;object-fit:cover;display:block}@media (max-width: 600px){.camera-video{max-height:300px}}.camera-flash-overlay{position:absolute;inset:0;background:#fff;opacity:0;pointer-events:none}.camera-flash-overlay.flash{animation:flashCapture .3s ease-out}.camera-controls{display:flex;align-items:center;justify-content:center;gap:16px;padding:8px 0}.camera-cancel-btn{min-height:44px;border-radius:7px}.camera-capture-btn{width:56px;height:56px}.camera-spacer{width:0}@media (min-width: 600px){.camera-spacer{width:80px}}.photo-step__error{display:flex;align-items:center;gap:12px;padding:12px 16px;margin-top:16px;background:#fa896b14;border:1px solid #fa896b;border-radius:7px;color:#2a3547;text-align:left}.photo-step__error>mat-icon{color:#fa896b;flex-shrink:0}.photo-step__error>span{flex:1;font-size:14px}@media (max-width: 600px){.photo-step__error{flex-wrap:wrap}.photo-step__error .retry-btn{width:100%;justify-content:center}}.retry-btn{display:flex;align-items:center;gap:6px;min-height:36px;border-radius:7px;flex-shrink:0}.processing-overlay{display:flex;flex-direction:column;align-items:center;gap:16px;padding:32px 0}.processing-overlay mat-progress-bar{width:100%;border-radius:7px}.processing-text{font-size:14px;color:#5a6a85;margin:0}.scan-success{animation:fadeIn .3s ease-out;display:flex;flex-direction:column;align-items:center;gap:12px;padding:32px 16px;background:#13deb914;border:1px solid #13deb9;border-radius:7px}.scan-success__icon{font-size:48px;width:48px;height:48px;color:#13deb9}.scan-success__title{font-size:18px;font-weight:600;color:#2a3547;margin:0}:host-context(.dark-theme) .scan-id-container{background-color:#2a3447;box-shadow:0 2px 12px #0000004d}:host-context(.dark-theme) .scan-id-title,:host-context(.dark-theme) .card-type-option__label,:host-context(.dark-theme) .photo-capture__label,:host-context(.dark-theme) .photo-preview__label,:host-context(.dark-theme) .scan-success__title{color:#ffffffde}:host-context(.dark-theme) .scan-id-description,:host-context(.dark-theme) .card-type-option__helper,:host-context(.dark-theme) .dropzone-text,:host-context(.dark-theme) .processing-text,:host-context(.dark-theme) .back-btn{color:#fff9}:host-context(.dark-theme) .dropzone-icon,:host-context(.dark-theme) .dropzone-formats{color:#fff6}:host-context(.dark-theme) .card-type-option{border-color:#333f55}:host-context(.dark-theme) .card-type-option:hover{border-color:#5d87ff80;background:#5d87ff1a}:host-context(.dark-theme) .card-type-option.selected{border-color:#5d87ff;background:#5d87ff26}:host-context(.dark-theme) .step-progress__circle.upcoming{background:#333f55;border-color:#465670;color:#fff6}:host-context(.dark-theme) .step-progress__label{color:#fff6}:host-context(.dark-theme) .step-progress__connector{background:#465670}:host-context(.dark-theme) .photo-capture__dropzone{border-color:#465670}:host-context(.dark-theme) .photo-capture__dropzone.dragover{border-color:#5d87ff;background:#5d87ff1a}:host-context(.dark-theme) .photo-preview__image{border-color:#333f55}:host-context(.dark-theme) .photo-step__error{background:#fa896b1a;color:#ffffffde}:host-context(.dark-theme) .scan-success{background:#13deb91a}\n"] }]
|
|
481
|
+
}], ctorParameters: () => [{ type: i1.ApplicationDataService }, { type: i0.ChangeDetectorRef }], propDecorators: { fileInput: [{
|
|
278
482
|
type: ViewChild,
|
|
279
|
-
args: ['
|
|
483
|
+
args: ['fileInput']
|
|
280
484
|
}], videoElement: [{
|
|
281
485
|
type: ViewChild,
|
|
282
486
|
args: ['videoElement']
|
|
283
487
|
}] } });
|
|
284
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFHVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7QUFVN0MsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFNBQVM7SUFzQmxELFlBQ1UsY0FBc0MsRUFDdEMsR0FBc0I7UUFFOUIsS0FBSyxFQUFFLENBQUM7UUFIQSxtQkFBYyxHQUFkLGNBQWMsQ0FBd0I7UUFDdEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF2QmhDLFlBQU8sR0FBZ0IsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFDaEMsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBYSxFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLHNCQUFpQixH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UUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxJQUNFLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxRQUFRO29CQUNyQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDL0IsQ0FBQztvQkFDRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzsrR0F6VFUscUJBQXFCO21HQUFyQixxQkFBcUIsbVlDbEJsQyxraUhBMEVNOzs0RkR4RE8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG9CQUFvQjsySEFvQkQsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0MsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNDLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHBsaWNhdGlvbkRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBTY2FuSWREdG8gfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwbGljYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgQXBwRGF0YUZpbGwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybWx5LXNjYW4taWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybWx5LXNjYW4taWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtbHktc2Nhbi1pZC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlTY2FuSWRDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGUgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgZmlsZUVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZmlsZU5hbWVGcm9udDogc3RyaW5nID0gJyc7XG4gIGZpbGVOYW1lQmFjazogc3RyaW5nID0gJyc7XG4gIHZhbGlkRm9ybWF0czogc3RyaW5nW10gPSBbXTtcbiAgbWF4RmlsZVNpemVLQjogbnVtYmVyID0gMDtcbiAgY2FyZFR5cGVTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBvbGRJZENhcmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZnJvbnRQaG90b1VwbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGJhY2tQaG90b1VwbG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHBob3RvQmFzZTY0RnJvbnQ6IHN0cmluZyA9ICcnO1xuICBwaG90b0Jhc2U2NEJhY2s6IHN0cmluZyA9ICcnO1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dEZyb250JykgZmlsZUlucHV0RnJvbnQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dEJhY2snKSBmaWxlSW5wdXRCYWNrOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd2aWRlb0VsZW1lbnQnKSB2aWRlb0VsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gIHZpZGVvU3RyZWFtOiBNZWRpYVN0cmVhbSB8IG51bGwgPSBudWxsO1xuICBpc1NjYW5WYWxpZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcHBEYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcbiAgICBncm91cC5hZGRDb250cm9sKHRoaXMucHJvcHNbJ2lkZW50aWZpZXInXSwgdGhpcy5jb250cm9sKTtcblxuICAgIHRoaXMudmFsaWRGb3JtYXRzID0gdGhpcy5wcm9wc1snY29uZmlnJ10uYWxsb3dlZEZvcm1hdHM/LnNwbGl0KCcsJykgfHwgW1xuICAgICAgJy5qcGcnLFxuICAgICAgJy5wbmcnLFxuICAgIF07XG4gICAgdGhpcy5tYXhGaWxlU2l6ZUtCID0gdGhpcy5wcm9wc1snY29uZmlnJ10ubWF4RmlsZVNpemVLQiB8fCAyMDAwO1xuXG4gICAgaWYgKHRoaXMucHJvcHNbJ2NvbmZpZyddLmNvbGxlY3RlZCkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm0uZ2V0KFxuICAgICAgICB0aGlzLnByb3BzWydjb25maWcnXS5jb21wb25lbnRDb2xsZWN0ZWRcbiAgICAgICk/LnZhbHVlO1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcblxuICAgICAgdGhpcy5mb3JtXG4gICAgICAgIC5nZXQodGhpcy5wcm9wc1snY29uZmlnJ10uY29tcG9uZW50Q29sbGVjdGVkKVxuICAgICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5wcm9wc1snY29uZmlnJ10uY29tcG9uZW50Q29sbGVjdGVkKT8udmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RDYXJkVHlwZShpc09sZElkQ2FyZDogYm9vbGVhbikge1xuICAgIHRoaXMub2xkSWRDYXJkID0gaXNPbGRJZENhcmQ7XG4gICAgdGhpcy5jYXJkVHlwZVNlbGVjdGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IGFueSwgaXNGcm9udDogYm9vbGVhbikge1xuICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSAnLicgKyBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGZpbGVTaXplS0IgPSBmaWxlLnNpemUgLyAxMDI0O1xuXG4gICAgICBpZiAoIXRoaXMudmFsaWRGb3JtYXRzLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gKFxuICAgICAgICAgIHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8uaW52YWxpZFR5cGUgfHxcbiAgICAgICAgICBgSW52YWxpZCBmaWxlIHR5cGUuIEFsbG93ZWQgZm9ybWF0cyBhcmUgJHt0aGlzLnZhbGlkRm9ybWF0cy5qb2luKFxuICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICl9YFxuICAgICAgICApLnJlcGxhY2UoJ3tmb3JtYXRzfScsIHRoaXMudmFsaWRGb3JtYXRzLmpvaW4oJywgJykpO1xuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0RXJyb3JzKHsgaW52YWxpZFR5cGU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVTaXplS0IgPiB0aGlzLm1heEZpbGVTaXplS0IgfHwgZmlsZVNpemVLQiA8IDEpIHtcbiAgICAgICAgdGhpcy5maWxlRXJyb3IgPSAoXG4gICAgICAgICAgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5tYXhTaXplIHx8XG4gICAgICAgICAgYEZpbGUgc2l6ZSBtdXN0IGJlIGJldHdlZW4gMUtCIGFuZCAke3RoaXMubWF4RmlsZVNpemVLQn1LQi5gXG4gICAgICAgICkucmVwbGFjZSgne3NpemV9JywgdGhpcy5tYXhGaWxlU2l6ZUtCKTtcbiAgICAgICAgdGhpcy5jb250cm9sLnNldEVycm9ycyh7IGludmFsaWRTaXplOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChpc0Zyb250KSB7XG4gICAgICAgICAgdGhpcy5maWxlTmFtZUZyb250ID0gZmlsZS5uYW1lO1xuICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRGcm9udCA9IHJlYWRlci5yZXN1bHQ/LnRvU3RyaW5nKCkuc3BsaXQoJywnKVsxXSB8fCAnJztcbiAgICAgICAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZmlsZU5hbWVCYWNrID0gZmlsZS5uYW1lO1xuICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRCYWNrID0gcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdIHx8ICcnO1xuICAgICAgICAgIHRoaXMuYmFja1Bob3RvVXBsb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hlY2tVcGxvYWRDb25kaXRpb24oKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdGFrZVBpY3R1cmUoKSB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcblxuICAgIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcykge1xuICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAuZW51bWVyYXRlRGV2aWNlcygpXG4gICAgICAgIC50aGVuKChkZXZpY2VzKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmlkZW9EZXZpY2VzID0gZGV2aWNlcy5maWx0ZXIoXG4gICAgICAgICAgICAoZGV2aWNlKSA9PiBkZXZpY2Uua2luZCA9PT0gJ3ZpZGVvaW5wdXQnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVFcnJvciA9ICdObyBjYW1lcmEgZGV2aWNlcyBmb3VuZC4nO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0Q2FtZXJhKHZpZGVvRGV2aWNlc1swXS5kZXZpY2VJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGV2aWNlSWQgPSBwcm9tcHQoXG4gICAgICAgICAgICAgICdTZWxlY3QgY2FtZXJhJyxcbiAgICAgICAgICAgICAgdmlkZW9EZXZpY2VzLm1hcCgoZGV2aWNlKSA9PiBkZXZpY2UubGFiZWwpLmpvaW4oJywgJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERldmljZSA9IHZpZGVvRGV2aWNlcy5maW5kKFxuICAgICAgICAgICAgICAoZGV2aWNlKSA9PiBkZXZpY2UubGFiZWwgPT09IHNlbGVjdGVkRGV2aWNlSWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZSkge1xuICAgICAgICAgICAgICB0aGlzLnN0YXJ0Q2FtZXJhKHNlbGVjdGVkRGV2aWNlLmRldmljZUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ0ludmFsaWQgY2FtZXJhIHNlbGVjdGlvbi4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbGVFcnJvciA9ICdVbmFibGUgdG8gYWNjZXNzIHRoZSBjYW1lcmEgZGV2aWNlcy4nO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAnQ2FtZXJhIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuJztcbiAgICB9XG4gIH1cblxuICBzdGFydENhbWVyYShkZXZpY2VJZDogc3RyaW5nKSB7XG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB7IGRldmljZUlkIH0gfSlcbiAgICAgIC50aGVuKChzdHJlYW0pID0+IHtcbiAgICAgICAgdGhpcy52aWRlb1N0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudC5zcmNPYmplY3QgPSBzdHJlYW07XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGxheSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ1VuYWJsZSB0byBhY2Nlc3MgdGhlIHNlbGVjdGVkIGNhbWVyYS4nO1xuICAgICAgfSk7XG4gIH1cblxuICBjYXB0dXJlUGhvdG8oaXNGcm9udDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy52aWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAnTm8gdmlkZW8gZWxlbWVudCBhdmFpbGFibGUuJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGNvbnRleHQ/LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgIGlmIChibG9iKSB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChpc0Zyb250KSB7XG4gICAgICAgICAgICB0aGlzLnBob3RvQmFzZTY0RnJvbnQgPVxuICAgICAgICAgICAgICByZWFkZXIucmVzdWx0Py50b1N0cmluZygpLnNwbGl0KCcsJylbMV0gfHwgJyc7XG4gICAgICAgICAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGhvdG9CYXNlNjRCYWNrID1cbiAgICAgICAgICAgICAgcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5iYWNrUGhvdG9VcGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNoZWNrVXBsb2FkQ29uZGl0aW9uKCk7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy52aWRlb1N0cmVhbSkge1xuICAgICAgICB0aGlzLnZpZGVvU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICAgICAgICB0aGlzLnZpZGVvU3RyZWFtID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAnaW1hZ2UvanBlZycpO1xuICB9XG5cbiAgdXBsb2FkUGhvdG8oKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICBjb25zdCBjb21tYW5kOiBTY2FuSWREdG8gPSB7XG4gICAgICBhcHBJZDogdGhpcy5wcm9wc1snYXBwSWQnXSxcbiAgICAgIGFwcERhdGFJZDogdGhpcy5wcm9wc1snYXBwRGF0YUlkJ10sXG4gICAgICBzdGVwSWQ6IHRoaXMucHJvcHNbJ3N0ZXBJZCddLFxuICAgICAgb2xkSWRDYXJkOiB0aGlzLm9sZElkQ2FyZCxcbiAgICAgIHBob3RvczogdGhpcy5vbGRJZENhcmRcbiAgICAgICAgPyBbeyBiYXNlNjQ6IHRoaXMucGhvdG9CYXNlNjRGcm9udCB9XVxuICAgICAgICA6IFt7IGJhc2U2NDogdGhpcy5waG90b0Jhc2U2NEZyb250IH0sIHsgYmFzZTY0OiB0aGlzLnBob3RvQmFzZTY0QmFjayB9XSxcbiAgICB9O1xuXG4gICAgdGhpcy5hcHBEYXRhU2VydmljZS5zY2FuSWQoY29tbWFuZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1NjYW4gSUQgcmVzdWx0OicsIHJlc3VsdCk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIGFwcERhdGEgPSBhd2FpdCB0aGlzLmFwcERhdGFTZXJ2aWNlLmdldFN0ZXBzKFxuICAgICAgICAgIHRoaXMucHJvcHNbJ2FwcERhdGFJZCddXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFwcERhdGEpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NDQU4tSURdIGV4dHJhY3RlZCBzdGF0dXM6Jywgc3RhdHVzKTtcblxuICAgICAgICAgIGlmIChzdGF0dXM/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ludmFsaWQnKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlRXJyb3IgPVxuICAgICAgICAgICAgICB0aGlzLnByb3BzWydlcnJvck1lc3NhZ2VzJ10/LmludmFsaWRTdGF0dXMgfHxcbiAgICAgICAgICAgICAgJ0ludmFsaWQgc3RhdHVzIHJlc3BvbnNlLic7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoeyBpbnZhbGlkU3RhdHVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaXNTY2FuVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UgPSAnVXBsb2FkIHN1Y2Nlc3NmdWwhJztcbiAgICAgICAgICBpZiAodGhpcy5wcm9wc1snZXZlbnQnXSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wc1snZXZlbnQnXShhcHBEYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsZUVycm9yID0gJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHNjYW4uJztcbiAgICAgICAgY29uc29sZS5lcnJvcignU2NhbiBJRCBlcnJvcjonLCBlcnIpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRGb3JtKHByZXNlcnZlRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZmlsZU5hbWVGcm9udCA9ICcnO1xuICAgIHRoaXMuZmlsZU5hbWVCYWNrID0gJyc7XG4gICAgdGhpcy5waG90b0Jhc2U2NEZyb250ID0gJyc7XG4gICAgdGhpcy5waG90b0Jhc2U2NEJhY2sgPSAnJztcbiAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuYmFja1Bob3RvVXBsb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoIXByZXNlcnZlRXJyb3IpIHtcbiAgICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy52aWRlb1N0cmVhbSA9IG51bGw7XG4gICAgdGhpcy5jb250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gbnVsbDtcbiAgfVxuXG4gIGNoZWNrVXBsb2FkQ29uZGl0aW9uKCkge1xuICAgIGlmICh0aGlzLm9sZElkQ2FyZCB8fCAodGhpcy5mcm9udFBob3RvVXBsb2FkZWQgJiYgdGhpcy5iYWNrUGhvdG9VcGxvYWRlZCkpIHtcbiAgICAgIHRoaXMudXBsb2FkUGhvdG8oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWFwcERhdGE/LmZpbGxEYXRhIHx8ICF0aGlzLnByb3BzWydzdGVwSWQnXSkgcmV0dXJuIG51bGw7XG5cbiAgICBsZXQgZmlsbERhdGE6IEFwcERhdGFGaWxsO1xuICAgIHRyeSB7XG4gICAgICBmaWxsRGF0YSA9XG4gICAgICAgIHR5cGVvZiBhcHBEYXRhLmZpbGxEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gKEpTT04ucGFyc2UoYXBwRGF0YS5maWxsRGF0YSkgYXMgQXBwRGF0YUZpbGwpXG4gICAgICAgICAgOiBhcHBEYXRhLmZpbGxEYXRhO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tleHRyYWN0U3RhdHVzRnJvbUFwcERhdGFdIEpTT04gcGFyc2UgZXJyb3InLCBlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXAgPSBmaWxsRGF0YS5mbHV4LmZpbmQoXG4gICAgICAoczogYW55KSA9PiBzLnN0ZXBJZCA9PT0gdGhpcy5wcm9wc1snc3RlcElkJ11cbiAgICApO1xuICAgIGlmICghc3RlcD8uc2VjdGlvbnMpIHJldHVybiBudWxsO1xuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHN0ZXAuc2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBzZWN0aW9uLmNvbnRyb2xzIHx8IFtdKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgY29udHJvbC5maWxsVmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgY29udHJvbC5maWxsVmFsdWUudHJpbSgpICE9PSAnJ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY29udHJvbC5maWxsVmFsdWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzY2FuLWlkLWNvbnRhaW5lclwiPlxuICA8aDIgY2xhc3M9XCJ0aXRsZVwiPnt7IHByb3BzW1wibmFtZVwiXSB9fTwvaDI+XG4gIDxwIGNsYXNzPVwiZGVzY3JpcHRpb25cIj57eyBwcm9wc1tcImRlc2NyaXB0aW9uXCJdIH19PC9wPlxuXG4gIDwhLS0gU2VsZWN0aW9uIFN0ZXAgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLXNlbGVjdGlvbi1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1vcHRpb25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1vcHRpb25cIlxuICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwib2xkSWRDYXJkID09PSB0cnVlICYmIGNhcmRUeXBlU2VsZWN0ZWRcIlxuICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2FyZFR5cGUodHJ1ZSlcIj5cbiAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL29yaWdpbi1mb3JtL29sZC1pZC1jYXJkLnBuZ1wiIGFsdD1cIk9sZCBJRCBDYXJkXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtb3B0aW9uXCJcbiAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cIm9sZElkQ2FyZCA9PT0gZmFsc2UgJiYgY2FyZFR5cGVTZWxlY3RlZFwiXG4gICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDYXJkVHlwZShmYWxzZSlcIj5cbiAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL29yaWdpbi1mb3JtL25ldy1pZC1jYXJkLnBuZ1wiIGFsdD1cIk5ldyBJRCBDYXJkXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj5cbiAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImNhcmRUeXBlU2VsZWN0ZWQgJiYgIWlzTG9hZGluZ1wiIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgIDwhLS0gU3RlcCAxOiBVcGxvYWQgRnJvbnQgUGhvdG8gLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFmcm9udFBob3RvVXBsb2FkZWRcIiBjbGFzcz1cInVwbG9hZC1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICA8cD57eyBwcm9wc1snbGFiZWxzJ10udXBsb2FkRnJvbnRQcm9tcHQgfHwgJ1BsZWFzZSB1cGxvYWQgdGhlIGZyb250IHBob3RvIG9mIHlvdXIgSUQgY2FyZC4nIH19PC9wPlxuICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgI2ZpbGVJbnB1dEZyb250IChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50LCB0cnVlKVwiIGhpZGRlbiAvPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImZpbGVJbnB1dEZyb250LmNsaWNrKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmNsb3VkX3VwbG9hZDwvbWF0LWljb24+XG4gICAgICAgIHt7IGZpbGVOYW1lRnJvbnQgPyBmaWxlTmFtZUZyb250IDogcHJvcHNbJ2xhYmVscyddLnVwbG9hZEZpbGVCdXR0b25UcmFuc2xhdGlvbnMgfHwgJ1VwbG9hZCBGcm9udCBQaG90bycgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImZpbGVFcnJvclwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICB7eyBmaWxlRXJyb3IgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGVwIDI6IFVwbG9hZCBCYWNrIFBob3RvIChPbmx5IGZvciBOZXcgSUQgQ2FyZHMpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJmcm9udFBob3RvVXBsb2FkZWQgJiYgIW9sZElkQ2FyZCAmJiAhaXNMb2FkaW5nXCIgY2xhc3M9XCJ1cGxvYWQtYnV0dG9uLWNvbnRhaW5lclwiPlxuICAgICAgPHA+e3sgcHJvcHNbJ2xhYmVscyddLnVwbG9hZEJhY2tQcm9tcHQgfHwgJ1BsZWFzZSB1cGxvYWQgdGhlIGJhY2sgcGhvdG8gb2YgeW91ciBJRCBjYXJkLicgfX08L3A+XG4gICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAjZmlsZUlucHV0QmFjayAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudCwgZmFsc2UpXCIgaGlkZGVuIC8+XG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZmlsZUlucHV0QmFjay5jbGljaygpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5jbG91ZF91cGxvYWQ8L21hdC1pY29uPlxuICAgICAgICB7eyBmaWxlTmFtZUJhY2sgPyBmaWxlTmFtZUJhY2sgOiBwcm9wc1snbGFiZWxzJ10udXBsb2FkRmlsZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVXBsb2FkIEJhY2sgUGhvdG8nIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWxlRXJyb3JcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAge3sgZmlsZUVycm9yIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gXG4gICAgPCEtLSBUYWtlIFBob3RvIEJ1dHRvbiAoT3B0aW9uYWwpIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJwcm9wc1snY29uZmlnJ10uc2hvd1Rha2VQaWN0dXJlQnV0dG9uXCIgY2xhc3M9XCJ0YWtlLXBob3RvLWNvbnRhaW5lclwiPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiAoY2xpY2spPVwidGFrZVBpY3R1cmUoKVwiPlxuICAgICAgICA8bWF0LWljb24+Y2FtZXJhX2FsdDwvbWF0LWljb24+XG4gICAgICAgIHt7IHByb3BzWydsYWJlbHMnXS50YWtlUGljdHVyZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVGFrZSBhIHBob3RvJyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgICA8dmlkZW8gI3ZpZGVvRWxlbWVudCAqbmdJZj1cInZpZGVvU3RyZWFtXCIgd2lkdGg9XCIxMDAlXCIgY2xhc3M9XCJ2aWRlby1wcmV2aWV3XCIgYXV0b3BsYXk+PC92aWRlbz5cblxuICAgICAgPCEtLSBUYWtlIEZyb250IFBob3RvIC0tPlxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gY29sb3I9XCJ3YXJuXCIgKm5nSWY9XCJ2aWRlb1N0cmVhbSAmJiAhZnJvbnRQaG90b1VwbG9hZGVkXCIgKGNsaWNrKT1cImNhcHR1cmVQaG90byh0cnVlKVwiPlxuICAgICAgICA8bWF0LWljb24+cGhvdG9fY2FtZXJhPC9tYXQtaWNvbj5cbiAgICAgICAge3sgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5mcm9udElkIHx8ICdUYWtlIGEgcGhvdG8nIH19XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSBUYWtlIEJhY2sgUGhvdG8gLS0+XG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cIndhcm5cIiAqbmdJZj1cInZpZGVvU3RyZWFtICYmIGZyb250UGhvdG9VcGxvYWRlZCAmJiAhb2xkSWRDYXJkXCIgKGNsaWNrKT1cImNhcHR1cmVQaG90byhmYWxzZSlcIj5cbiAgICAgICAgPG1hdC1pY29uPnBob3RvX2NhbWVyYTwvbWF0LWljb24+XG4gICAgICAgIHt7IHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8uYmFja0lkICB8fCAnVGFrZSBhIHBob3RvJyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwic3VjY2Vzc01lc3NhZ2UgJiYgaXNTY2FuVmFsaWRcIiBjbGFzcz1cInN1Y2Nlc3MtbWVzc2FnZS1jb250YWluZXJcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJsYXJnZS1pY29uXCIgY29sb3I9XCJwcmltYXJ5XCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
488
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9mb3JtbHkvZm9ybWx5LXNjYW4taWQvZm9ybWx5LXNjYW4taWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFJVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7QUFnQjdDLE1BQU0sT0FBTyxxQkFDWCxTQUFRLFNBQVM7SUErQ2pCLFlBQ1UsY0FBc0MsRUFDdEMsR0FBc0I7UUFFOUIsS0FBSyxFQUFFLENBQUM7UUFIQSxtQkFBYyxHQUFkLGNBQWMsQ0FBd0I7UUFDdEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE5Q2hDLFlBQU8sR0FBZ0IsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFDaEMsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBYSxFQUFFLENBQUM7UUFDNUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxxQkFBZ0IsR0FBVyxFQUFFLENBQUM7UUFDOUIsb0JBQWUsR0FBVyxFQUFFLENBQUM7UUFDN0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDckMsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUFFNUIsZUFBZTtRQUNmLHNCQUFpQixHQUFXLENBQUMsQ0FBQztRQUM5QixnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFFL0Isb0JBQW9CO1FBQ3BCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLHFCQUFnQixHQUFzQixFQUFFLENBQUM7UUFDekMscUJBQWdCLEdBQVcsRUFBRSxDQUFDO1FBRTlCLGdEQUFnRDtRQUNoRCxzQkFBaUIsR0FBVyxFQUFFLENBQUM7UUFDL0IscUJBQWdCLEdBQVcsRUFBRSxDQUFDO1FBRTlCLGdCQUFnQjtRQUNoQixlQUFVLEdBQVksS0FBSyxDQUFDO1FBRTVCLGtCQUFrQjtRQUNsQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBRTNCLFFBQVE7UUFDUixhQUFRLEdBQVksS0FBSyxDQUFDO1FBSTFCLGdCQUFXLEdBQXVCLElBQUksQ0FBQztJQVN2QyxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFpQixDQUFDO1FBQ3JDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUk7WUFDckUsTUFBTTtZQUNOLE1BQU07U0FDUCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUM7UUFFaEUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixDQUN4QyxFQUFFLEtBQUssQ0FBQztZQUNULElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUk7aUJBQzdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO2dCQUM3QyxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssQ0FDOUQsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCO1lBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FDTCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLGlCQUFpQjtnQkFDdkMsZ0RBQWdELENBQ2pELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxDQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsZ0JBQWdCO1lBQ3RDLCtDQUErQyxDQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxlQUFlLElBQUksYUFBYSxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsY0FBYyxJQUFJLFlBQVksQ0FBQztJQUM5RCxDQUFDO0lBRUQsaUNBQWlDO0lBRXpCLGVBQWU7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQjtnQkFDRSxLQUFLLEVBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxpQkFBaUIsSUFBSSxrQkFBa0I7Z0JBQy9ELE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsTUFBTSxVQUFVLEdBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxtQkFBbUIsSUFBSSxhQUFhLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxrQkFBa0IsSUFBSSxZQUFZLENBQUM7UUFFM0QsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQjtnQkFDRSxLQUFLLEVBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxpQkFBaUIsSUFBSSxrQkFBa0I7Z0JBQy9ELE1BQU0sRUFBRSxXQUFXO2FBQ3BCO1lBQ0QsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7U0FDeEMsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCO0lBRXJCLE1BQU07UUFDSixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakMsb0RBQW9EO1lBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztZQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUM3QixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEMsbURBQW1EO1lBQ25ELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRLENBQUMsU0FBaUI7UUFDeEIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCw4QkFBOEI7SUFFOUIsY0FBYyxDQUFDLFdBQW9CO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsc0JBQXNCO0lBRXRCLGNBQWMsQ0FBQyxLQUFZO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUEwQixDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixLQUFLLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsOENBQThDO1FBQzlDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxJQUFVLEVBQUUsT0FBZ0I7UUFDOUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRXBDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FDZixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFdBQVc7Z0JBQ3hDLDBDQUEwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDOUQsSUFBSSxDQUNMLEVBQUUsQ0FDSixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxPQUFPO2dCQUNwQyxxQ0FBcUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxDQUM3RCxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNuQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNoRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzQyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztnQkFDakMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztZQUNqQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQztnQkFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsd0JBQXdCO0lBRXhCLFVBQVUsQ0FBQyxLQUFnQjtRQUN6QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBZ0I7UUFDckIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQztRQUN4QyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUI7SUFFakIsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxTQUFTO2dCQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsa0JBQWtCO29CQUMvQyxzQ0FBc0MsQ0FBQztZQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsOEVBQThFO1lBQzlFLE1BQU0sVUFBVSxHQUFHLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQzNELEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFDO1lBQ0gsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFFaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDaEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQ3BDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FDL0IsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFNBQVM7b0JBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRO3dCQUNyQywwQkFBMEIsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDekIsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUMxRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxJQUFJLENBQUMsU0FBUztnQkFDWixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFlBQVk7b0JBQ3pDLG9EQUFvRCxDQUFDO1lBQ3ZELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWdCO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBZ0I7UUFDOUMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztnQkFDdkQsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO2FBQ3pDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO2dCQUNuRCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9DLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLFNBQVM7Z0JBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxZQUFZO29CQUN6Qyx1Q0FBdUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVPLFVBQVU7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsNkJBQTZCLENBQUM7WUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNsQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0Qsa0JBQWtCO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDO1lBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUM7WUFDakMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUNqQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7WUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsZ0NBQWdDO0lBRWhDLFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEQsMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztZQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDMUIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGlCQUFpQjtJQUVqQixXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBYztZQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1lBQ2xDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUNwQixDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckMsQ0FBQyxDQUFDO29CQUNFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDakMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRTtpQkFDakM7U0FDTixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzVDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUV2QixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUN4QixDQUFDO2dCQUVGLElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUVuRCxJQUFJLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzt3QkFDOUMsSUFBSSxDQUFDLFNBQVM7NEJBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxhQUFhO2dDQUMxQywwQkFBMEIsQ0FBQzt3QkFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7d0JBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ2hELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ3pCLE9BQU87b0JBQ1QsQ0FBQztvQkFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUMxRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3QkFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDL0IsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxTQUFTLEdBQUcsOENBQThDLENBQUM7Z0JBQ2hFLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGtCQUFrQjtJQUVsQixTQUFTLENBQUMsZ0JBQXlCLEtBQUs7UUFDdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUNFLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGtCQUFrQjtZQUN6QyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFDcEUsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVPLHdCQUF3QixDQUFDLE9BQVk7UUFDM0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTdELElBQUksUUFBcUIsQ0FBQztRQUMxQixJQUFJLENBQUM7WUFDSCxRQUFRO2dCQUNOLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRO29CQUNsQyxDQUFDLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFpQjtvQkFDL0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDekIsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUM3QixDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUM5QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFakMsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxJQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRO29CQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDNUIsQ0FBQztvQkFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQy9CLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzsrR0FsakJVLHFCQUFxQjttR0FBckIscUJBQXFCLHdSQ3pCbEMsbTVSQXFNQTs7NEZENUthLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxvQkFBb0I7MkhBOENOLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDSyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25EYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcGxpY2F0aW9uRGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IFNjYW5JZER0byB9IGZyb20gJy4uLy4uL21vZGVscy9hcHBsaWNhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBBcHBEYXRhRmlsbCB9IGZyb20gJy4uLy4uL21vZGVscy9mb3Jtcy5tb2RlbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l6YXJkU3RlcCB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHN0YXR1czogJ3VwY29taW5nJyB8ICdhY3RpdmUnIHwgJ2NvbXBsZXRlZCc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1mb3JtbHktc2Nhbi1pZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtbHktc2Nhbi1pZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm1seS1zY2FuLWlkLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seVNjYW5JZENvbXBvbmVudFxuICBleHRlbmRzIEZpZWxkVHlwZVxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIGNvbnRyb2w6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICBmaWxlRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBmaWxlTmFtZUZyb250OiBzdHJpbmcgPSAnJztcbiAgZmlsZU5hbWVCYWNrOiBzdHJpbmcgPSAnJztcbiAgdmFsaWRGb3JtYXRzOiBzdHJpbmdbXSA9IFtdO1xuICBtYXhGaWxlU2l6ZUtCOiBudW1iZXIgPSAwO1xuICBjYXJkVHlwZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIG9sZElkQ2FyZDogYm9vbGVhbiA9IGZhbHNlO1xuICBmcm9udFBob3RvVXBsb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYmFja1Bob3RvVXBsb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGhvdG9CYXNlNjRGcm9udDogc3RyaW5nID0gJyc7XG4gIHBob3RvQmFzZTY0QmFjazogc3RyaW5nID0gJyc7XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGlzU2NhblZhbGlkOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBXaXphcmQgc3RhdGVcbiAgY3VycmVudFdpemFyZFN0ZXA6IG51bWJlciA9IDA7XG4gIHdpemFyZFN0ZXBzOiBXaXphcmRTdGVwW10gPSBbXTtcblxuICAvLyBDYW1lcmEgbWFuYWdlbWVudFxuICBjYW1lcmFBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYXZhaWxhYmxlQ2FtZXJhczogTWVkaWFEZXZpY2VJbmZvW10gPSBbXTtcbiAgc2VsZWN0ZWRDYW1lcmFJZDogc3RyaW5nID0gJyc7XG5cbiAgLy8gUGhvdG8gcHJldmlldyAoZnVsbCBkYXRhIFVSSSBmb3IgaW1nIGRpc3BsYXkpXG4gIHBob3RvUHJldmlld0Zyb250OiBzdHJpbmcgPSAnJztcbiAgcGhvdG9QcmV2aWV3QmFjazogc3RyaW5nID0gJyc7XG5cbiAgLy8gRHJhZyBhbmQgZHJvcFxuICBpc0RyYWdPdmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gRmxhc2ggYW5pbWF0aW9uXG4gIHNob3dGbGFzaDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFJldHJ5XG4gIGNhblJldHJ5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JykgZmlsZUlucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndmlkZW9FbGVtZW50JykgdmlkZW9FbGVtZW50ITogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PjtcbiAgdmlkZW9TdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSB2YWx1ZUNoYW5nZXNTdWI/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcHBEYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcbiAgICBncm91cC5hZGRDb250cm9sKHRoaXMucHJvcHNbJ2lkZW50aWZpZXInXSwgdGhpcy5jb250cm9sKTtcblxuICAgIHRoaXMudmFsaWRGb3JtYXRzID0gdGhpcy5wcm9wc1snY29uZmlnJ10uYWxsb3dlZEZvcm1hdHM/LnNwbGl0KCcsJykgfHwgW1xuICAgICAgJy5qcGcnLFxuICAgICAgJy5wbmcnLFxuICAgIF07XG4gICAgdGhpcy5tYXhGaWxlU2l6ZUtCID0gdGhpcy5wcm9wc1snY29uZmlnJ10ubWF4RmlsZVNpemVLQiB8fCAyMDAwO1xuXG4gICAgaWYgKHRoaXMucHJvcHNbJ2NvbmZpZyddLmNvbGxlY3RlZCkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm0uZ2V0KFxuICAgICAgICB0aGlzLnByb3BzWydjb25maWcnXS5jb21wb25lbnRDb2xsZWN0ZWRcbiAgICAgICk/LnZhbHVlO1xuICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcblxuICAgICAgdGhpcy52YWx1ZUNoYW5nZXNTdWIgPSB0aGlzLmZvcm1cbiAgICAgICAgLmdldCh0aGlzLnByb3BzWydjb25maWcnXS5jb21wb25lbnRDb2xsZWN0ZWQpXG4gICAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKFxuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCh0aGlzLnByb3BzWydjb25maWcnXS5jb21wb25lbnRDb2xsZWN0ZWQpPy52YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdFdpemFyZFN0ZXBzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN0b3BDYW1lcmEoKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50UGhvdG9QcmV2aWV3KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFdpemFyZFN0ZXAgPT09IDFcbiAgICAgID8gdGhpcy5waG90b1ByZXZpZXdGcm9udFxuICAgICAgOiB0aGlzLnBob3RvUHJldmlld0JhY2s7XG4gIH1cblxuICBnZXQgY3VycmVudFN0ZXBMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmN1cnJlbnRXaXphcmRTdGVwID09PSAxKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnByb3BzWydsYWJlbHMnXT8udXBsb2FkRnJvbnRQcm9tcHQgfHxcbiAgICAgICAgJ1BsZWFzZSB1cGxvYWQgdGhlIGZyb250IHBob3RvIG9mIHlvdXIgSUQgY2FyZC4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9wc1snbGFiZWxzJ10/LnVwbG9hZEJhY2tQcm9tcHQgfHxcbiAgICAgICdQbGVhc2UgdXBsb2FkIHRoZSBiYWNrIHBob3RvIG9mIHlvdXIgSUQgY2FyZC4nXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjdXJyZW50U3RlcFNob3J0TGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHNbJ2xhYmVscyddPy5mcm9udFBob3RvTGFiZWwgfHwgJ0Zyb250IG9mIElEJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJvcHNbJ2xhYmVscyddPy5iYWNrUGhvdG9MYWJlbCB8fCAnQmFjayBvZiBJRCc7XG4gIH1cblxuICAvLyAtLS0gV2l6YXJkIFN0ZXAgTWFuYWdlbWVudCAtLS1cblxuICBwcml2YXRlIGluaXRXaXphcmRTdGVwcygpIHtcbiAgICB0aGlzLndpemFyZFN0ZXBzID0gW1xuICAgICAge1xuICAgICAgICBsYWJlbDpcbiAgICAgICAgICB0aGlzLnByb3BzWydsYWJlbHMnXT8uY2FyZFR5cGVTdGVwTGFiZWwgfHwgJ1NlbGVjdCBDYXJkIFR5cGUnLFxuICAgICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVXaXphcmRTdGVwcygpIHtcbiAgICBjb25zdCBmcm9udExhYmVsID1cbiAgICAgIHRoaXMucHJvcHNbJ2xhYmVscyddPy5mcm9udFBob3RvU3RlcExhYmVsIHx8ICdGcm9udCBQaG90byc7XG4gICAgY29uc3QgYmFja0xhYmVsID1cbiAgICAgIHRoaXMucHJvcHNbJ2xhYmVscyddPy5iYWNrUGhvdG9TdGVwTGFiZWwgfHwgJ0JhY2sgUGhvdG8nO1xuXG4gICAgdGhpcy53aXphcmRTdGVwcyA9IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6XG4gICAgICAgICAgdGhpcy5wcm9wc1snbGFiZWxzJ10/LmNhcmRUeXBlU3RlcExhYmVsIHx8ICdTZWxlY3QgQ2FyZCBUeXBlJyxcbiAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgIH0sXG4gICAgICB7IGxhYmVsOiBmcm9udExhYmVsLCBzdGF0dXM6ICdhY3RpdmUnIH0sXG4gICAgXTtcbiAgICBpZiAoIXRoaXMub2xkSWRDYXJkKSB7XG4gICAgICB0aGlzLndpemFyZFN0ZXBzLnB1c2goeyBsYWJlbDogYmFja0xhYmVsLCBzdGF0dXM6ICd1cGNvbWluZycgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIE5hdmlnYXRpb24gLS0tXG5cbiAgZ29CYWNrKCkge1xuICAgIHRoaXMuY2xvc2VDYW1lcmEoKTtcbiAgICBpZiAodGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9PT0gMikge1xuICAgICAgLy8gR28gYmFjayB0byBmcm9udCBwaG90byBzdGVwLCBwcmVzZXJ2ZSBmcm9udCBwaG90b1xuICAgICAgdGhpcy53aXphcmRTdGVwc1syXS5zdGF0dXMgPSAndXBjb21pbmcnO1xuICAgICAgdGhpcy53aXphcmRTdGVwc1sxXS5zdGF0dXMgPSAnYWN0aXZlJztcbiAgICAgIHRoaXMuY3VycmVudFdpemFyZFN0ZXAgPSAxO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9PT0gMSkge1xuICAgICAgLy8gR28gYmFjayB0byBjYXJkIHR5cGUgc2VsZWN0aW9uLCByZXNldCBldmVyeXRoaW5nXG4gICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgdGhpcy5jYXJkVHlwZVNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRXaXphcmRTdGVwID0gMDtcbiAgICAgIHRoaXMuaW5pdFdpemFyZFN0ZXBzKCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGdvVG9TdGVwKHN0ZXBJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHN0ZXBJbmRleCA8IHRoaXMuY3VycmVudFdpemFyZFN0ZXApIHtcbiAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRXaXphcmRTdGVwID4gc3RlcEluZGV4KSB7XG4gICAgICAgIHRoaXMuZ29CYWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIENhcmQgVHlwZSBTZWxlY3Rpb24gLS0tXG5cbiAgc2VsZWN0Q2FyZFR5cGUoaXNPbGRJZENhcmQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLm9sZElkQ2FyZCA9IGlzT2xkSWRDYXJkO1xuICAgIHRoaXMuY2FyZFR5cGVTZWxlY3RlZCA9IHRydWU7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB0aGlzLnVwZGF0ZVdpemFyZFN0ZXBzKCk7XG4gICAgdGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9IDE7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLy8gLS0tIEZpbGUgVXBsb2FkIC0tLVxuXG4gIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZSA9IGlucHV0Py5maWxlcz8uWzBdO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICBjb25zdCBpc0Zyb250ID0gdGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9PT0gMTtcbiAgICAgIHRoaXMucHJvY2Vzc0ZpbGUoZmlsZSwgaXNGcm9udCk7XG4gICAgfVxuICAgIC8vIFJlc2V0IGlucHV0IHNvIHNhbWUgZmlsZSBjYW4gYmUgcmUtc2VsZWN0ZWRcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzRmlsZShmaWxlOiBGaWxlLCBpc0Zyb250OiBib29sZWFuKSB7XG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9ICcuJyArIGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGZpbGVTaXplS0IgPSBmaWxlLnNpemUgLyAxMDI0O1xuXG4gICAgaWYgKCF0aGlzLnZhbGlkRm9ybWF0cy5pbmNsdWRlcyhmaWxlRXh0ZW5zaW9uKSkge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAoXG4gICAgICAgIHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8uaW52YWxpZFR5cGUgfHxcbiAgICAgICAgYEludmFsaWQgZmlsZSB0eXBlLiBBbGxvd2VkIGZvcm1hdHMgYXJlICR7dGhpcy52YWxpZEZvcm1hdHMuam9pbihcbiAgICAgICAgICAnLCAnXG4gICAgICAgICl9YFxuICAgICAgKS5yZXBsYWNlKCd7Zm9ybWF0c30nLCB0aGlzLnZhbGlkRm9ybWF0cy5qb2luKCcsICcpKTtcbiAgICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoeyBpbnZhbGlkVHlwZTogdHJ1ZSB9KTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmlsZVNpemVLQiA+IHRoaXMubWF4RmlsZVNpemVLQiB8fCBmaWxlU2l6ZUtCIDwgMSkge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAoXG4gICAgICAgIHRoaXMucHJvcHNbJ2Vycm9yTWVzc2FnZXMnXT8ubWF4U2l6ZSB8fFxuICAgICAgICBgRmlsZSBzaXplIG11c3QgYmUgYmV0d2VlbiAxS0IgYW5kICR7dGhpcy5tYXhGaWxlU2l6ZUtCfUtCLmBcbiAgICAgICkucmVwbGFjZSgne3NpemV9JywgdGhpcy5tYXhGaWxlU2l6ZUtCLnRvU3RyaW5nKCkpO1xuICAgICAgdGhpcy5jb250cm9sLnNldEVycm9ycyh7IGludmFsaWRTaXplOiB0cnVlIH0pO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhVXJpID0gcmVhZGVyLnJlc3VsdD8udG9TdHJpbmcoKSB8fCAnJztcbiAgICAgIGNvbnN0IGJhc2U2NCA9IGRhdGFVcmkuc3BsaXQoJywnKVsxXSB8fCAnJztcbiAgICAgIGlmIChpc0Zyb250KSB7XG4gICAgICAgIHRoaXMuZmlsZU5hbWVGcm9udCA9IGZpbGUubmFtZTtcbiAgICAgICAgdGhpcy5waG90b0Jhc2U2NEZyb250ID0gYmFzZTY0O1xuICAgICAgICB0aGlzLnBob3RvUHJldmlld0Zyb250ID0gZGF0YVVyaTtcbiAgICAgICAgdGhpcy5mcm9udFBob3RvVXBsb2FkZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maWxlTmFtZUJhY2sgPSBmaWxlLm5hbWU7XG4gICAgICAgIHRoaXMucGhvdG9CYXNlNjRCYWNrID0gYmFzZTY0O1xuICAgICAgICB0aGlzLnBob3RvUHJldmlld0JhY2sgPSBkYXRhVXJpO1xuICAgICAgICB0aGlzLmJhY2tQaG90b1VwbG9hZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gLS0tIERyYWcgYW5kIERyb3AgLS0tXG5cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xuICB9XG5cbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gIH1cblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzO1xuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpc0Zyb250ID0gdGhpcy5jdXJyZW50V2l6YXJkU3RlcCA9PT0gMTtcbiAgICAgIHRoaXMucHJvY2Vzc0ZpbGUoZmlsZXNbMF0sIGlzRnJvbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBDYW1lcmEgLS0tXG5cbiAgYXN5bmMgb3BlbkNhbWVyYSgpIHtcbiAgICB0aGlzLmZpbGVFcnJvciA9IG51bGw7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgaWYgKCFuYXZpZ2F0b3IubWVkaWFEZXZpY2VzPy5nZXRVc2VyTWVkaWEpIHtcbiAgICAgIHRoaXMuZmlsZUVycm9yID1cbiAgICAgICAgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5jYW1lcmFOb3RTdXBwb3J0ZWQgfHxcbiAgICAgICAgJ0NhbWVyYSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlLic7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlcXVlc3QgcGVybWlzc2lvbiBmaXJzdCAobGFiZWxzIGFyZSBvbmx5IGF2YWlsYWJsZSBhZnRlciBwZXJtaXNzaW9uIGdyYW50KVxuICAgICAgY29uc3QgdGVtcFN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcbiAgICAgICAgdmlkZW86IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHRlbXBTdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuXG4gICAgICBjb25zdCBkZXZpY2VzID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCk7XG4gICAgICB0aGlzLmF2YWlsYWJsZUNhbWVyYXMgPSBkZXZpY2VzLmZpbHRlcihcbiAgICAgICAgKGQpID0+IGQua2luZCA9PT0gJ3ZpZGVvaW5wdXQnXG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5hdmFpbGFibGVDYW1lcmFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmZpbGVFcnJvciA9XG4gICAgICAgICAgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5ub0NhbWVyYSB8fFxuICAgICAgICAgICdObyBjYW1lcmEgZGV2aWNlcyBmb3VuZC4nO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWxlY3RlZENhbWVyYUlkID0gdGhpcy5hdmFpbGFibGVDYW1lcmFzWzBdLmRldmljZUlkO1xuICAgICAgdGhpcy5jYW1lcmFBY3RpdmUgPSB0cnVlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydENhbWVyYVN0cmVhbSh0aGlzLnNlbGVjdGVkQ2FtZXJhSWQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPVxuICAgICAgICB0aGlzLnByb3BzWydlcnJvck1lc3NhZ2VzJ10/LmNhbWVyYUFjY2VzcyB8fFxuICAgICAgICAnVW5hYmxlIHRvIGFjY2VzcyBjYW1lcmEuIFBsZWFzZSBjaGVjayBwZXJtaXNzaW9ucy4nO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN3aXRjaENhbWVyYShkZXZpY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zdG9wQ2FtZXJhU3RyZWFtKCk7XG4gICAgYXdhaXQgdGhpcy5zdGFydENhbWVyYVN0cmVhbShkZXZpY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YXJ0Q2FtZXJhU3RyZWFtKGRldmljZUlkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuICAgICAgICB2aWRlbzogeyBkZXZpY2VJZDogeyBleGFjdDogZGV2aWNlSWQgfSB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnZpZGVvU3RyZWFtID0gc3RyZWFtO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgICBhd2FpdCB0aGlzLnZpZGVvRWxlbWVudC5uYXRpdmVFbGVtZW50LnBsYXkoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuZmlsZUVycm9yID1cbiAgICAgICAgdGhpcy5wcm9wc1snZXJyb3JNZXNzYWdlcyddPy5jYW1lcmFBY2Nlc3MgfHxcbiAgICAgICAgJ1VuYWJsZSB0byBhY2Nlc3MgdGhlIHNlbGVjdGVkIGNhbWVyYS4nO1xuICAgICAgdGhpcy5jYW1lcmFBY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0b3BDYW1lcmFTdHJlYW0oKSB7XG4gICAgaWYgKHRoaXMudmlkZW9TdHJlYW0pIHtcbiAgICAgIHRoaXMudmlkZW9TdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodHJhY2spID0+IHRyYWNrLnN0b3AoKSk7XG4gICAgICB0aGlzLnZpZGVvU3RyZWFtID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0b3BDYW1lcmEoKSB7XG4gICAgdGhpcy5zdG9wQ2FtZXJhU3RyZWFtKCk7XG4gICAgdGhpcy5jYW1lcmFBY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIGNsb3NlQ2FtZXJhKCkge1xuICAgIHRoaXMuc3RvcENhbWVyYSgpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGNhcHR1cmVDdXJyZW50UGhvdG8oKSB7XG4gICAgaWYgKCF0aGlzLnZpZGVvRWxlbWVudD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5maWxlRXJyb3IgPSAnTm8gdmlkZW8gZWxlbWVudCBhdmFpbGFibGUuJztcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGNvbnRleHQ/LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIC8vIEZsYXNoIGFuaW1hdGlvblxuICAgIHRoaXMudHJpZ2dlckZsYXNoKCk7XG5cbiAgICBjb25zdCBkYXRhVXJpID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDAuOSk7XG4gICAgY29uc3QgYmFzZTY0ID0gZGF0YVVyaS5zcGxpdCgnLCcpWzFdIHx8ICcnO1xuXG4gICAgY29uc3QgaXNGcm9udCA9IHRoaXMuY3VycmVudFdpemFyZFN0ZXAgPT09IDE7XG4gICAgaWYgKGlzRnJvbnQpIHtcbiAgICAgIHRoaXMucGhvdG9CYXNlNjRGcm9udCA9IGJhc2U2NDtcbiAgICAgIHRoaXMucGhvdG9QcmV2aWV3RnJvbnQgPSBkYXRhVXJpO1xuICAgICAgdGhpcy5mcm9udFBob3RvVXBsb2FkZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBob3RvQmFzZTY0QmFjayA9IGJhc2U2NDtcbiAgICAgIHRoaXMucGhvdG9QcmV2aWV3QmFjayA9IGRhdGFVcmk7XG4gICAgICB0aGlzLmJhY2tQaG90b1VwbG9hZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3BDYW1lcmEoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJGbGFzaCgpIHtcbiAgICB0aGlzLnNob3dGbGFzaCA9IHRydWU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93Rmxhc2ggPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgLy8gLS0tIFBob3RvIFByZXZpZXcgQWN0aW9ucyAtLS1cblxuICBjb25maXJtUGhvdG8oKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFdpemFyZFN0ZXAgPT09IDEgJiYgIXRoaXMub2xkSWRDYXJkKSB7XG4gICAgICAvLyBNb3ZlIHRvIGJhY2sgcGhvdG8gc3RlcFxuICAgICAgdGhpcy53aXphcmRTdGVwc1sxXS5zdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgIHRoaXMud2l6YXJkU3RlcHNbMl0uc3RhdHVzID0gJ2FjdGl2ZSc7XG4gICAgICB0aGlzLmN1cnJlbnRXaXphcmRTdGVwID0gMjtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWxsIHBob3RvcyBjb2xsZWN0ZWQsIHRyaWdnZXIgdXBsb2FkXG4gICAgICB0aGlzLmNoZWNrVXBsb2FkQ29uZGl0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRDdXJyZW50UGhvdG8oKSB7XG4gICAgY29uc3QgaXNGcm9udCA9IHRoaXMuY3VycmVudFdpemFyZFN0ZXAgPT09IDE7XG4gICAgaWYgKGlzRnJvbnQpIHtcbiAgICAgIHRoaXMucGhvdG9CYXNlNjRGcm9udCA9ICcnO1xuICAgICAgdGhpcy5waG90b1ByZXZpZXdGcm9udCA9ICcnO1xuICAgICAgdGhpcy5mcm9udFBob3RvVXBsb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZmlsZU5hbWVGcm9udCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBob3RvQmFzZTY0QmFjayA9ICcnO1xuICAgICAgdGhpcy5waG90b1ByZXZpZXdCYWNrID0gJyc7XG4gICAgICB0aGlzLmJhY2tQaG90b1VwbG9hZGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmZpbGVOYW1lQmFjayA9ICcnO1xuICAgIH1cbiAgICB0aGlzLmZpbGVFcnJvciA9IG51bGw7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLy8gLS0tIFVwbG9hZCAtLS1cblxuICB1cGxvYWRQaG90bygpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5jYW5SZXRyeSA9IGZhbHNlO1xuICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBjb25zdCBjb21tYW5kOiBTY2FuSWREdG8gPSB7XG4gICAgICBhcHBJZDogdGhpcy5wcm9wc1snYXBwSWQnXSxcbiAgICAgIGFwcERhdGFJZDogdGhpcy5wcm9wc1snYXBwRGF0YUlkJ10sXG4gICAgICBzdGVwSWQ6IHRoaXMucHJvcHNbJ3N0ZXBJZCddLFxuICAgICAgb2xkSWRDYXJkOiB0aGlzLm9sZElkQ2FyZCxcbiAgICAgIHBob3RvczogdGhpcy5vbGRJZENhcmRcbiAgICAgICAgPyBbeyBiYXNlNjQ6IHRoaXMucGhvdG9CYXNlNjRGcm9udCB9XVxuICAgICAgICA6IFtcbiAgICAgICAgICAgIHsgYmFzZTY0OiB0aGlzLnBob3RvQmFzZTY0RnJvbnQgfSxcbiAgICAgICAgICAgIHsgYmFzZTY0OiB0aGlzLnBob3RvQmFzZTY0QmFjayB9LFxuICAgICAgICAgIF0sXG4gICAgfTtcblxuICAgIHRoaXMuYXBwRGF0YVNlcnZpY2Uuc2NhbklkKGNvbW1hbmQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTY2FuIElEIHJlc3VsdDonLCByZXN1bHQpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGFwcERhdGEgPSBhd2FpdCB0aGlzLmFwcERhdGFTZXJ2aWNlLmdldFN0ZXBzKFxuICAgICAgICAgIHRoaXMucHJvcHNbJ2FwcERhdGFJZCddXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFwcERhdGEpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1NDQU4tSURdIGV4dHJhY3RlZCBzdGF0dXM6Jywgc3RhdHVzKTtcblxuICAgICAgICAgIGlmIChzdGF0dXM/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ludmFsaWQnKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlRXJyb3IgPVxuICAgICAgICAgICAgICB0aGlzLnByb3BzWydlcnJvck1lc3NhZ2VzJ10/LmludmFsaWRTdGF0dXMgfHxcbiAgICAgICAgICAgICAgJ0ludmFsaWQgc3RhdHVzIHJlc3BvbnNlLic7XG4gICAgICAgICAgICB0aGlzLmNhblJldHJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRFcnJvcnMoeyBpbnZhbGlkU3RhdHVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaXNTY2FuVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UgPSAnVXBsb2FkIHN1Y2Nlc3NmdWwhJztcbiAgICAgICAgICB0aGlzLndpemFyZFN0ZXBzLmZvckVhY2goKHMpID0+IChzLnN0YXR1cyA9ICdjb21wbGV0ZWQnKSk7XG4gICAgICAgICAgaWYgKHRoaXMucHJvcHNbJ2V2ZW50J10pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHNbJ2V2ZW50J10oYXBwRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICB0aGlzLmZpbGVFcnJvciA9ICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBzY2FuLic7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NjYW4gSUQgZXJyb3I6JywgZXJyKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYW5SZXRyeSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZXRyeVVwbG9hZCgpIHtcbiAgICB0aGlzLnVwbG9hZFBob3RvKCk7XG4gIH1cblxuICAvLyAtLS0gSGVscGVycyAtLS1cblxuICByZXNldEZvcm0ocHJlc2VydmVFcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdGhpcy5maWxlTmFtZUZyb250ID0gJyc7XG4gICAgdGhpcy5maWxlTmFtZUJhY2sgPSAnJztcbiAgICB0aGlzLnBob3RvQmFzZTY0RnJvbnQgPSAnJztcbiAgICB0aGlzLnBob3RvQmFzZTY0QmFjayA9ICcnO1xuICAgIHRoaXMucGhvdG9QcmV2aWV3RnJvbnQgPSAnJztcbiAgICB0aGlzLnBob3RvUHJldmlld0JhY2sgPSAnJztcbiAgICB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuYmFja1Bob3RvVXBsb2FkZWQgPSBmYWxzZTtcbiAgICBpZiAoIXByZXNlcnZlRXJyb3IpIHtcbiAgICAgIHRoaXMuZmlsZUVycm9yID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zdG9wQ2FtZXJhKCk7XG4gICAgdGhpcy5jb250cm9sLnJlc2V0KCk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gbnVsbDtcbiAgICB0aGlzLmNhblJldHJ5ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XG4gIH1cblxuICBjaGVja1VwbG9hZENvbmRpdGlvbigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm9sZElkQ2FyZCAmJiB0aGlzLmZyb250UGhvdG9VcGxvYWRlZCB8fFxuICAgICAgIXRoaXMub2xkSWRDYXJkICYmIHRoaXMuZnJvbnRQaG90b1VwbG9hZGVkICYmIHRoaXMuYmFja1Bob3RvVXBsb2FkZWRcbiAgICApIHtcbiAgICAgIHRoaXMudXBsb2FkUGhvdG8oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTdGF0dXNGcm9tQXBwRGF0YShhcHBEYXRhOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWFwcERhdGE/LmZpbGxEYXRhIHx8ICF0aGlzLnByb3BzWydzdGVwSWQnXSkgcmV0dXJuIG51bGw7XG5cbiAgICBsZXQgZmlsbERhdGE6IEFwcERhdGFGaWxsO1xuICAgIHRyeSB7XG4gICAgICBmaWxsRGF0YSA9XG4gICAgICAgIHR5cGVvZiBhcHBEYXRhLmZpbGxEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gKEpTT04ucGFyc2UoYXBwRGF0YS5maWxsRGF0YSkgYXMgQXBwRGF0YUZpbGwpXG4gICAgICAgICAgOiBhcHBEYXRhLmZpbGxEYXRhO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tleHRyYWN0U3RhdHVzRnJvbUFwcERhdGFdIEpTT04gcGFyc2UgZXJyb3InLCBlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXAgPSBmaWxsRGF0YS5mbHV4LmZpbmQoXG4gICAgICAoczogYW55KSA9PiBzLnN0ZXBJZCA9PT0gdGhpcy5wcm9wc1snc3RlcElkJ11cbiAgICApO1xuICAgIGlmICghc3RlcD8uc2VjdGlvbnMpIHJldHVybiBudWxsO1xuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHN0ZXAuc2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY3RybCBvZiBzZWN0aW9uLmNvbnRyb2xzIHx8IFtdKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgY3RybC5maWxsVmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgY3RybC5maWxsVmFsdWUudHJpbSgpICE9PSAnJ1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY3RybC5maWxsVmFsdWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzY2FuLWlkLWNvbnRhaW5lclwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyIGNsYXNzPVwic2Nhbi1pZC10aXRsZVwiPnt7IHByb3BzW1wibmFtZVwiXSB9fTwvaDI+XG4gIDxwIGNsYXNzPVwic2Nhbi1pZC1kZXNjcmlwdGlvblwiPnt7IHByb3BzW1wiZGVzY3JpcHRpb25cIl0gfX08L3A+XG5cbiAgPCEtLSBTdGVwIFByb2dyZXNzIEluZGljYXRvciAtLT5cbiAgPGRpdiBjbGFzcz1cInN0ZXAtcHJvZ3Jlc3NcIiAqbmdJZj1cIndpemFyZFN0ZXBzLmxlbmd0aCA+IDFcIiByb2xlPVwibGlzdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzdGVwLXByb2dyZXNzX19pdGVtXCIgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygd2l6YXJkU3RlcHM7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtcHJvZ3Jlc3NfX2NpcmNsZVwiXG4gICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic3RlcC5zdGF0dXMgPT09ICdhY3RpdmUnXCJcbiAgICAgICAgICAgW2NsYXNzLmNvbXBsZXRlZF09XCJzdGVwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCdcIlxuICAgICAgICAgICBbY2xhc3MudXBjb21pbmddPVwic3RlcC5zdGF0dXMgPT09ICd1cGNvbWluZydcIlxuICAgICAgICAgICBbY2xhc3MuY2xpY2thYmxlXT1cInN0ZXAuc3RhdHVzID09PSAnY29tcGxldGVkJ1wiXG4gICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJzdGVwLnN0YXR1cyA9PT0gJ2FjdGl2ZScgPyAnc3RlcCcgOiBudWxsXCJcbiAgICAgICAgICAgKGNsaWNrKT1cInN0ZXAuc3RhdHVzID09PSAnY29tcGxldGVkJyA/IGdvVG9TdGVwKGkpIDogbnVsbFwiPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzdGVwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCdcIj5jaGVjazwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwic3RlcC5zdGF0dXMgIT09ICdjb21wbGV0ZWQnXCI+e3sgaSArIDEgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3RlcC1wcm9ncmVzc19fbGFiZWxcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzdGVwLnN0YXR1cyA9PT0gJ2FjdGl2ZSdcIlxuICAgICAgICAgICAgW2NsYXNzLmNvbXBsZXRlZF09XCJzdGVwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCdcIj5cbiAgICAgICAge3sgc3RlcC5sYWJlbCB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtcHJvZ3Jlc3NfX2Nvbm5lY3RvclwiICpuZ0lmPVwiIWxhc3RcIlxuICAgICAgICAgICBbY2xhc3MuY29tcGxldGVkXT1cInN0ZXAuc3RhdHVzID09PSAnY29tcGxldGVkJ1wiPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcCAxOiBDYXJkIFR5cGUgU2VsZWN0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC10eXBlLXN0ZXBcIiAqbmdJZj1cImN1cnJlbnRXaXphcmRTdGVwID09PSAwXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25zXCIgcm9sZT1cInJhZGlvZ3JvdXBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXR5cGUtb3B0aW9uXCJcbiAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cIm9sZElkQ2FyZCA9PT0gdHJ1ZSAmJiBjYXJkVHlwZVNlbGVjdGVkXCJcbiAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhcmRUeXBlKHRydWUpXCJcbiAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VsZWN0Q2FyZFR5cGUodHJ1ZSlcIlxuICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJzZWxlY3RDYXJkVHlwZSh0cnVlKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwib2xkSWRDYXJkID09PSB0cnVlICYmIGNhcmRUeXBlU2VsZWN0ZWRcIlxuICAgICAgICAgICB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2ltYWdlLXdyYXBwZXJcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pbWFnZXMvb3JpZ2luLWZvcm0vb2xkLWlkLWNhcmQucG5nXCIgYWx0PVwiT2xkIElEIENhcmRcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2luZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2xhYmVsXCI+XG4gICAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/Lm9sZENhcmRMYWJlbCB8fCAnT2xkIElEIENhcmQnIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC10eXBlLW9wdGlvbl9faGVscGVyXCI+XG4gICAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/Lm9sZENhcmRIZWxwZXIgfHwgJ1NpbmdsZS1zaWRlZCBjYXJkIC0gMSBwaG90byBuZWVkZWQnIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10eXBlLW9wdGlvblwiXG4gICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJvbGRJZENhcmQgPT09IGZhbHNlICYmIGNhcmRUeXBlU2VsZWN0ZWRcIlxuICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2FyZFR5cGUoZmFsc2UpXCJcbiAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VsZWN0Q2FyZFR5cGUoZmFsc2UpXCJcbiAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwic2VsZWN0Q2FyZFR5cGUoZmFsc2UpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgIHJvbGU9XCJyYWRpb1wiXG4gICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJvbGRJZENhcmQgPT09IGZhbHNlICYmIGNhcmRUeXBlU2VsZWN0ZWRcIlxuICAgICAgICAgICB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2ltYWdlLXdyYXBwZXJcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pbWFnZXMvb3JpZ2luLWZvcm0vbmV3LWlkLWNhcmQucG5nXCIgYWx0PVwiTmV3IElEIENhcmRcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2luZm9cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdHlwZS1vcHRpb25fX2xhYmVsXCI+XG4gICAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/Lm5ld0NhcmRMYWJlbCB8fCAnTmV3IElEIENhcmQnIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC10eXBlLW9wdGlvbl9faGVscGVyXCI+XG4gICAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/Lm5ld0NhcmRIZWxwZXIgfHwgJ0NhcmQgd2l0aCBmcm9udCBhbmQgYmFjayAtIDIgcGhvdG9zIG5lZWRlZCcgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RlcHMgMi0zOiBQaG90byBDYXB0dXJlIC8gVXBsb2FkIC0tPlxuICA8ZGl2IGNsYXNzPVwicGhvdG8tc3RlcFwiICpuZ0lmPVwiKGN1cnJlbnRXaXphcmRTdGVwID09PSAxIHx8IGN1cnJlbnRXaXphcmRTdGVwID09PSAyKSAmJiAhaXNMb2FkaW5nICYmICEoc3VjY2Vzc01lc3NhZ2UgJiYgaXNTY2FuVmFsaWQpXCI+XG5cbiAgICA8IS0tIEJhY2sgQnV0dG9uIC0tPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cImJhY2stYnRuXCIgKGNsaWNrKT1cImdvQmFjaygpXCI+XG4gICAgICA8bWF0LWljb24+YXJyb3dfYmFjazwvbWF0LWljb24+XG4gICAgICB7eyBjdXJyZW50V2l6YXJkU3RlcCA9PT0gMVxuICAgICAgICAgPyAocHJvcHNbJ2xhYmVscyddPy5jaGFuZ2VDYXJkVHlwZUxhYmVsIHx8ICdDaGFuZ2UgY2FyZCB0eXBlJylcbiAgICAgICAgIDogKHByb3BzWydsYWJlbHMnXT8uYmFja0xhYmVsIHx8ICdCYWNrJykgfX1cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gUGhvdG8gUHJldmlldyBNb2RlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJwaG90by1wcmV2aWV3XCIgKm5nSWY9XCJjdXJyZW50UGhvdG9QcmV2aWV3ICYmICFjYW1lcmFBY3RpdmVcIj5cbiAgICAgIDxwIGNsYXNzPVwicGhvdG8tcHJldmlld19fbGFiZWxcIj57eyBjdXJyZW50U3RlcFNob3J0TGFiZWwgfX08L3A+XG4gICAgICA8aW1nIGNsYXNzPVwicGhvdG8tcHJldmlld19faW1hZ2VcIiBbc3JjXT1cImN1cnJlbnRQaG90b1ByZXZpZXdcIiBbYWx0XT1cImN1cnJlbnRTdGVwU2hvcnRMYWJlbFwiIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwicGhvdG8tcHJldmlld19fYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwicmVzZXRDdXJyZW50UGhvdG8oKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/LnJldGFrZUxhYmVsIHx8ICdSZXRha2UnIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY29uZmlybVBob3RvKClcIj5cbiAgICAgICAgICA8bWF0LWljb24+Y2hlY2s8L21hdC1pY29uPlxuICAgICAgICAgIHt7IHByb3BzWydsYWJlbHMnXT8udXNlUGhvdG9MYWJlbCB8fCAnVXNlIFRoaXMgUGhvdG8nIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENhcHR1cmUgTW9kZSAobm8gcGhvdG8geWV0KSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwicGhvdG8tY2FwdHVyZVwiICpuZ0lmPVwiIWN1cnJlbnRQaG90b1ByZXZpZXcgJiYgIWNhbWVyYUFjdGl2ZVwiPlxuICAgICAgPHAgY2xhc3M9XCJwaG90by1jYXB0dXJlX19sYWJlbFwiPnt7IGN1cnJlbnRTdGVwTGFiZWwgfX08L3A+XG5cbiAgICAgIDwhLS0gRHJvcCBab25lIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBob3RvLWNhcHR1cmVfX2Ryb3B6b25lXCJcbiAgICAgICAgICAgW2NsYXNzLmRyYWdvdmVyXT1cImlzRHJhZ092ZXJcIlxuICAgICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCJcbiAgICAgICAgICAgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudClcIlxuICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRHJvcCB6b25lIGZvciAnICsgY3VycmVudFN0ZXBTaG9ydExhYmVsICsgJyB1cGxvYWQnXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRyb3B6b25lLWljb25cIj5jbG91ZF91cGxvYWQ8L21hdC1pY29uPlxuICAgICAgICA8cCBjbGFzcz1cImRyb3B6b25lLXRleHRcIj5cbiAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/LmRyYWdEcm9wUHJvbXB0IHx8ICdEcmFnICYgZHJvcCB5b3VyIHBob3RvIGhlcmUsIG9yIHVzZSB0aGUgYnV0dG9ucyBiZWxvdycgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cImRyb3B6b25lLWZvcm1hdHNcIj5cbiAgICAgICAgICB7eyBwcm9wc1snbGFiZWxzJ10/LmZvcm1hdHNMYWJlbCB8fCAnQWNjZXB0ZWQnIH19OiB7eyB2YWxpZEZvcm1hdHMuam9pbignLCAnKSB9fSAmbWlkZG90O1xuICAgICAgICAgIHt7IHByb3BzWydsYWJlbHMnXT8ubWF4U2l6ZUxhYmVsIHx8ICdNYXgnIH19OiB7eyBtYXhGaWxlU2l6ZUtCIH19S0JcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGhvdG8tY2FwdHVyZV9fYWN0aW9uc1wiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAjZmlsZUlucHV0IChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiIGhpZGRlbiBbYWNjZXB0XT1cInZhbGlkRm9ybWF0cy5qb2luKCcsJylcIiAvPlxuICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIiBjbGFzcz1cImFjdGlvbi1idG5cIj5cbiAgICAgICAgICA8bWF0LWljb24+dXBsb2FkX2ZpbGU8L21hdC1pY29uPlxuICAgICAgICAgIHt7IHByb3BzWydsYWJlbHMnXT8udXBsb2FkRmlsZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVXBsb2FkIEZpbGUnIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib3BlbkNhbWVyYSgpXCIgY2xhc3M9XCJhY3Rpb24tYnRuXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInByb3BzWydjb25maWcnXS5zaG93VGFrZVBpY3R1cmVCdXR0b24gIT09IGZhbHNlXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnBob3RvX2NhbWVyYTwvbWF0LWljb24+XG4gICAgICAgICAge3sgcHJvcHNbJ2xhYmVscyddPy50YWtlUGljdHVyZUJ1dHRvblRyYW5zbGF0aW9ucyB8fCAnVGFrZSBQaG90bycgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2FtZXJhIFZpZXdmaW5kZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNhbWVyYS1jb250YWluZXJcIiAqbmdJZj1cImNhbWVyYUFjdGl2ZVwiPlxuICAgICAgPCEtLSBDYW1lcmEgc2VsZWN0b3IgLS0+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJhdmFpbGFibGVDYW1lcmFzLmxlbmd0aCA+IDFcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiY2FtZXJhLXNlbGVjdG9yXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+e3sgcHJvcHNbJ2xhYmVscyddPy5zZWxlY3RDYW1lcmFMYWJlbCB8fCAnU2VsZWN0IGNhbWVyYScgfX08L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwic2VsZWN0ZWRDYW1lcmFJZFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwic3dpdGNoQ2FtZXJhKCRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgY2FtIG9mIGF2YWlsYWJsZUNhbWVyYXM7IGxldCBpID0gaW5kZXhcIiBbdmFsdWVdPVwiY2FtLmRldmljZUlkXCI+XG4gICAgICAgICAgICB7eyBjYW0ubGFiZWwgfHwgJ0NhbWVyYSAnICsgKGkgKyAxKSB9fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPGRpdiBjbGFzcz1cImNhbWVyYS12aWV3ZmluZGVyXCI+XG4gICAgICAgIDx2aWRlbyAjdmlkZW9FbGVtZW50IGF1dG9wbGF5IHBsYXlzaW5saW5lIGNsYXNzPVwiY2FtZXJhLXZpZGVvXCI+PC92aWRlbz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbWVyYS1mbGFzaC1vdmVybGF5XCIgW2NsYXNzLmZsYXNoXT1cInNob3dGbGFzaFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYW1lcmEtY29udHJvbHNcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cImNsb3NlQ2FtZXJhKClcIiBjbGFzcz1cImNhbWVyYS1jYW5jZWwtYnRuXCI+XG4gICAgICAgICAge3sgcHJvcHNbJ2xhYmVscyddPy5jYW5jZWxMYWJlbCB8fCAnQ2FuY2VsJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtZmFiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJjYXB0dXJlQ3VycmVudFBob3RvKClcIiBjbGFzcz1cImNhbWVyYS1jYXB0dXJlLWJ0blwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQ2FwdHVyZSAnICsgY3VycmVudFN0ZXBTaG9ydExhYmVsXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnBob3RvX2NhbWVyYTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FtZXJhLXNwYWNlclwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVycm9yIERpc3BsYXkgLS0+XG4gICAgPGRpdiBjbGFzcz1cInBob3RvLXN0ZXBfX2Vycm9yXCIgKm5nSWY9XCJmaWxlRXJyb3JcIiByb2xlPVwiYWxlcnRcIiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgIDxtYXQtaWNvbj5lcnJvcl9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuPnt7IGZpbGVFcnJvciB9fTwvc3Bhbj5cbiAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uICpuZ0lmPVwiY2FuUmV0cnlcIiAoY2xpY2spPVwicmV0cnlVcGxvYWQoKVwiIGNsYXNzPVwicmV0cnktYnRuXCI+XG4gICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgICAgICAge3sgcHJvcHNbJ2xhYmVscyddPy5yZXRyeUxhYmVsIHx8ICdUcnkgQWdhaW4nIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMb2FkaW5nIC8gUHJvY2Vzc2luZyBTdGF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cInByb2Nlc3Npbmctb3ZlcmxheVwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgPHAgY2xhc3M9XCJwcm9jZXNzaW5nLXRleHRcIj5cbiAgICAgIHt7IHByb3BzWydsYWJlbHMnXT8ucHJvY2Vzc2luZ01lc3NhZ2UgfHwgJ1Byb2Nlc3NpbmcgeW91ciBJRCBzY2FuLi4uJyB9fVxuICAgIDwvcD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdWNjZXNzIFN0YXRlIC0tPlxuICA8ZGl2IGNsYXNzPVwic2Nhbi1zdWNjZXNzXCIgKm5nSWY9XCJzdWNjZXNzTWVzc2FnZSAmJiBpc1NjYW5WYWxpZFwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJzY2FuLXN1Y2Nlc3NfX2ljb25cIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgIDxoMyBjbGFzcz1cInNjYW4tc3VjY2Vzc19fdGl0bGVcIj5cbiAgICAgIHt7IHByb3BzWydsYWJlbHMnXT8uc3VjY2Vzc1RpdGxlIHx8ICdJRCBzY2FuIHN1Y2Nlc3NmdWwnIH19XG4gICAgPC9oMz5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|