ngx-scandoc 18.0.2 → 19.0.1
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/fesm2022/ngx-scandoc.mjs +130 -130
- package/fesm2022/ngx-scandoc.mjs.map +1 -1
- package/package.json +9 -11
- package/esm2022/core/app.worker.mjs +0 -236
- package/esm2022/core/components/base.component.mjs +0 -15
- package/esm2022/core/components/camera-switch/camera-switch.component.mjs +0 -25
- package/esm2022/core/components/components.module.mjs +0 -69
- package/esm2022/core/components/manual-scan/manual-scan.component.mjs +0 -290
- package/esm2022/core/components/scan/scan.component.mjs +0 -733
- package/esm2022/core/components/scan-results/scan-results.component.mjs +0 -65
- package/esm2022/core/components/webcam/domain/webcam-image.mjs +0 -58
- package/esm2022/core/components/webcam/domain/webcam-init-error.mjs +0 -3
- package/esm2022/core/components/webcam/domain/webcam-mirror-properties.mjs +0 -3
- package/esm2022/core/components/webcam/util/webcam.util.mjs +0 -50
- package/esm2022/core/components/webcam/webcam/webcam.component.mjs +0 -543
- package/esm2022/core/components/webcam/webcam.module.mjs +0 -29
- package/esm2022/core/helpers/object-utils.mjs +0 -100
- package/esm2022/core/interfaces/config.mjs +0 -2
- package/esm2022/core/interfaces/guest.data.mjs +0 -2
- package/esm2022/core/pipes/pipes.module.mjs +0 -19
- package/esm2022/core/pipes/safeResourceUrl.pipe.mjs +0 -20
- package/esm2022/core/shared/material.module.mjs +0 -162
- package/esm2022/core/tokens/config.tokens.mjs +0 -4
- package/esm2022/dialogs/components/blank/blank.component.mjs +0 -46
- package/esm2022/dialogs/components/confirm/confirm.component.mjs +0 -51
- package/esm2022/dialogs/components/loading/loading.component.mjs +0 -12
- package/esm2022/dialogs/components/prompt-manual/prompt-manual.component.mjs +0 -30
- package/esm2022/dialogs/components/scan-profile/scan-profile.component.mjs +0 -79
- package/esm2022/dialogs/components/scan-selfie/scan-selfie.component.mjs +0 -95
- package/esm2022/dialogs/components/turn-document/turn-document.component.mjs +0 -31
- package/esm2022/dialogs/dialogs.core.provider.mjs +0 -120
- package/esm2022/dialogs/dialogs.module.mjs +0 -102
- package/esm2022/forms/form.module.mjs +0 -87
- package/esm2022/forms/types/avatar.type.mjs +0 -58
- package/esm2022/forms/types/profile.image.type.mjs +0 -64
- package/esm2022/forms/types/title.type.mjs +0 -32
- package/esm2022/lib/ngx-scandoc.module.mjs +0 -44
- package/esm2022/ngx-scandoc.mjs +0 -5
- package/esm2022/providers/auth.provider.mjs +0 -113
- package/esm2022/providers/camera.provider.mjs +0 -87
- package/esm2022/providers/interceptor.provider.mjs +0 -77
- package/esm2022/providers/layout.provider.mjs +0 -30
- package/esm2022/providers/scan.form.mjs +0 -347
- package/esm2022/providers/scan.provider.mjs +0 -756
- package/esm2022/providers/translate-loader.provider.mjs +0 -126
- package/esm2022/providers/translation.provider.mjs +0 -133
- package/esm2022/providers/webrtc.provider.mjs +0 -58
- package/esm2022/public-api.mjs +0 -33
|
@@ -1,733 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Output, HostListener, ChangeDetectionStrategy, Input, HostBinding, } from '@angular/core';
|
|
2
|
-
import { Subject } from 'rxjs';
|
|
3
|
-
import { FormGroup } from '@angular/forms';
|
|
4
|
-
import { catchError } from 'rxjs/operators';
|
|
5
|
-
import { ScanProvider } from '../../../providers/scan.provider';
|
|
6
|
-
import { BaseComponent } from '../base.component';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "../../../providers/camera.provider";
|
|
9
|
-
import * as i2 from "../../../providers/layout.provider";
|
|
10
|
-
import * as i3 from "@angular/cdk/platform";
|
|
11
|
-
import * as i4 from "ngx-device-detector";
|
|
12
|
-
import * as i5 from "../../../providers/auth.provider";
|
|
13
|
-
import * as i6 from "@angular/common";
|
|
14
|
-
import * as i7 from "../webcam/webcam/webcam.component";
|
|
15
|
-
import * as i8 from "@angular/material/icon";
|
|
16
|
-
import * as i9 from "@angular/material/button";
|
|
17
|
-
import * as i10 from "@angular/material/progress-bar";
|
|
18
|
-
import * as i11 from "../scan-results/scan-results.component";
|
|
19
|
-
import * as i12 from "../manual-scan/manual-scan.component";
|
|
20
|
-
import * as i13 from "@ngx-translate/core";
|
|
21
|
-
export class ScanComponent extends BaseComponent {
|
|
22
|
-
get class() {
|
|
23
|
-
return this.isMobile;
|
|
24
|
-
}
|
|
25
|
-
onResize() {
|
|
26
|
-
if (this.result) {
|
|
27
|
-
this.cd.detectChanges();
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
constructor(cd, zone, cameraProvider, injector, layoutProvider, platform, deviceService, auth // private api: ServerProvider
|
|
31
|
-
) {
|
|
32
|
-
super();
|
|
33
|
-
this.cd = cd;
|
|
34
|
-
this.zone = zone;
|
|
35
|
-
this.cameraProvider = cameraProvider;
|
|
36
|
-
this.injector = injector;
|
|
37
|
-
this.layoutProvider = layoutProvider;
|
|
38
|
-
this.platform = platform;
|
|
39
|
-
this.deviceService = deviceService;
|
|
40
|
-
this.auth = auth;
|
|
41
|
-
this.scanBlastData = [
|
|
42
|
-
{
|
|
43
|
-
title: 'pms.dialogs.components.scanProfile.front',
|
|
44
|
-
description: 'pms.dialogs.components.scanProfile.frontDescription',
|
|
45
|
-
side: 'FRONT',
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
title: 'pms.dialogs.components.scanProfile.back',
|
|
49
|
-
description: 'pms.dialogs.components.scanProfile.backDescription',
|
|
50
|
-
disabled: true,
|
|
51
|
-
side: 'BACK',
|
|
52
|
-
},
|
|
53
|
-
];
|
|
54
|
-
this.type = 'desktop';
|
|
55
|
-
this.actions = new EventEmitter();
|
|
56
|
-
this.scanResults = new Subject();
|
|
57
|
-
this.scanSecondSide = false;
|
|
58
|
-
this.startTime = 0;
|
|
59
|
-
this.scanInProgress = false;
|
|
60
|
-
// webcam snapshot trigger
|
|
61
|
-
this.documentTypeSelected = false;
|
|
62
|
-
this.preview = null;
|
|
63
|
-
this.errorCode = '1000';
|
|
64
|
-
this.displayInfo = 'scandoc.info.position';
|
|
65
|
-
this.verificationErrorSent = false;
|
|
66
|
-
this.error = false;
|
|
67
|
-
this.cameraReady = false;
|
|
68
|
-
this.scaning = false;
|
|
69
|
-
this.promptManual = false;
|
|
70
|
-
this.imageHandler = new Subject();
|
|
71
|
-
this.manualDataSet = false;
|
|
72
|
-
this.logData = {
|
|
73
|
-
AcceptTermsAndConditions: true,
|
|
74
|
-
Request: null,
|
|
75
|
-
Response: null,
|
|
76
|
-
ExpectedOutput: null,
|
|
77
|
-
};
|
|
78
|
-
this.scanDatas = [];
|
|
79
|
-
this.idScan = null;
|
|
80
|
-
this.validation = false;
|
|
81
|
-
this.scannedImages = [];
|
|
82
|
-
this.scanDelay = 0;
|
|
83
|
-
this.trigger = new Subject();
|
|
84
|
-
// switch to next / previous / specific webcam; true/false: forward/backwards, string: deviceId
|
|
85
|
-
this.nextWebcam = new Subject();
|
|
86
|
-
this.imageVerified = false;
|
|
87
|
-
this.form = new FormGroup({});
|
|
88
|
-
this.manual = false;
|
|
89
|
-
this.isMobile = this.platform.IOS || this.platform.ANDROID;
|
|
90
|
-
this.showDialog = false;
|
|
91
|
-
this.scanImageTimestamps = {
|
|
92
|
-
time: 0,
|
|
93
|
-
load: 0,
|
|
94
|
-
};
|
|
95
|
-
this.numberOfValidations = 0;
|
|
96
|
-
this.validationDebug = [];
|
|
97
|
-
this.blurValues = [];
|
|
98
|
-
this.scanProvider = this.injector.get(ScanProvider);
|
|
99
|
-
if (!this.scanProvider.config.development) {
|
|
100
|
-
// console = {
|
|
101
|
-
// log: (...args: any) => {},
|
|
102
|
-
// time: (...args: any) => {},
|
|
103
|
-
// timeEnd: (...args: any) => {},
|
|
104
|
-
// warn: (...args: any) => {},
|
|
105
|
-
// error: (...args: any) => {},
|
|
106
|
-
// };
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
resetLogData() {
|
|
110
|
-
this.logData = {
|
|
111
|
-
Request: null,
|
|
112
|
-
Response: null,
|
|
113
|
-
ExpectedOutput: null,
|
|
114
|
-
AcceptTermsAndConditions: true,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
init() {
|
|
118
|
-
this.auth.accesToken.subscribe();
|
|
119
|
-
this.resetLogData();
|
|
120
|
-
// this.result=true;
|
|
121
|
-
// this.result ={};
|
|
122
|
-
console.log('INIT SCAN');
|
|
123
|
-
}
|
|
124
|
-
continue() {
|
|
125
|
-
this.documentTypeSelected = false;
|
|
126
|
-
setTimeout(() => {
|
|
127
|
-
this.selectedSide.image = this.webcamImage;
|
|
128
|
-
if (this.selectedSide.side === 'FRONT') {
|
|
129
|
-
this.scanBlastData[1].disabled = false;
|
|
130
|
-
}
|
|
131
|
-
this.cd.detectChanges();
|
|
132
|
-
}, 200);
|
|
133
|
-
}
|
|
134
|
-
scan() {
|
|
135
|
-
this.trigger.next(new Date().getTime());
|
|
136
|
-
}
|
|
137
|
-
handleImage(webcamImage) {
|
|
138
|
-
if (this.startTime === 0) {
|
|
139
|
-
this.startTime = Date.now();
|
|
140
|
-
}
|
|
141
|
-
// console.log('[received webcam image]', webcamImage);
|
|
142
|
-
this.zone.runOutsideAngular(() => {
|
|
143
|
-
const time = new Date().getTime();
|
|
144
|
-
if (this.scanImageTimestamps.load > 0) {
|
|
145
|
-
const { load } = this.scanImageTimestamps;
|
|
146
|
-
const diff = time - load;
|
|
147
|
-
// console.log('time:', diff);
|
|
148
|
-
this.scanDelay = diff;
|
|
149
|
-
}
|
|
150
|
-
this.scanImageTimestamps.load = time;
|
|
151
|
-
if (webcamImage.imageAsDataUrl) {
|
|
152
|
-
this.scannedImages.push(webcamImage);
|
|
153
|
-
this.handleLongValidationError(webcamImage, 'worker');
|
|
154
|
-
}
|
|
155
|
-
this.cd.detectChanges();
|
|
156
|
-
if (this.scannedImages.length > 0 && !this.validation) {
|
|
157
|
-
// if (this.scanProvider.config.development) {
|
|
158
|
-
// this.scannedImages.forEach((img) => {
|
|
159
|
-
// const consoleBackground =
|
|
160
|
-
// "font-size:100px;background-image: url('" +
|
|
161
|
-
// img.imageResized +
|
|
162
|
-
// "');background-size: contain; background-repeat: no-repeat;";
|
|
163
|
-
// console.log('%c ', consoleBackground);
|
|
164
|
-
// });
|
|
165
|
-
// }
|
|
166
|
-
// this.frontImage = webcamImage.imageResized;
|
|
167
|
-
// console.timeEnd('scan');
|
|
168
|
-
// console.time('scan');
|
|
169
|
-
// get last 10
|
|
170
|
-
// console.log('CAPTURED:', this.scannedImages.length);
|
|
171
|
-
const images = this.scannedImages.slice(-5);
|
|
172
|
-
// set images to 0
|
|
173
|
-
this.scannedImages = [];
|
|
174
|
-
const imagesArray = images.map((m) => m.imageResized.split(',')[1]);
|
|
175
|
-
this.validation = true;
|
|
176
|
-
this.handleBurstData(imagesArray, images);
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
if (this.cameraReady) {
|
|
180
|
-
this.scan();
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
handleBurstData(imagesArray, images, type = 'plain') {
|
|
186
|
-
this.__subs(this.scanProvider.burst(imagesArray, this.blurValues)).subscribe((resp) => {
|
|
187
|
-
this.displayInfo = 'scandoc.info.c' + resp.InfoCode;
|
|
188
|
-
// console.timeEnd('validationPOST');
|
|
189
|
-
// console.log('AnalysisTime', resp.AnalysisTime);
|
|
190
|
-
const { DocType, Series, Side, InfoCode, TransactionID } = resp;
|
|
191
|
-
this.handleLongValidationError(TransactionID, images[0].imageAsDataUrl.split(',')[1]);
|
|
192
|
-
// if (InfoCode === '1006' && this.idScan) {
|
|
193
|
-
// this.handleLongValidationError(image);
|
|
194
|
-
// }
|
|
195
|
-
// console.warn(resp.Validated, this.numberOfValidations);
|
|
196
|
-
if (resp.DetectedBlurValue) {
|
|
197
|
-
this.blurValues.push(resp.DetectedBlurValue);
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
this.blurValues = [];
|
|
201
|
-
}
|
|
202
|
-
if (resp.Validated) {
|
|
203
|
-
this.numberOfValidations++;
|
|
204
|
-
this.validationDebug.push(resp);
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
this.numberOfValidations = 0;
|
|
208
|
-
this.validationDebug = [];
|
|
209
|
-
}
|
|
210
|
-
if (this.numberOfValidations >= 3) {
|
|
211
|
-
this.displayInfo = '';
|
|
212
|
-
// console.log('[SCANNED INDEX]', resp.Index);
|
|
213
|
-
const selectedImage = images[resp.Index];
|
|
214
|
-
// this.preview = this.webcamImage.imageAsDataUrl;
|
|
215
|
-
this.cd.detectChanges();
|
|
216
|
-
let image = selectedImage;
|
|
217
|
-
console.warn(type);
|
|
218
|
-
if (type == 'worker') {
|
|
219
|
-
//const dataUrl = this.handleBitmapImage(selectedImage.bitmap);
|
|
220
|
-
image = selectedImage.imageAsDataUrl;
|
|
221
|
-
}
|
|
222
|
-
if (InfoCode === '1007') {
|
|
223
|
-
// For ID ask for other side
|
|
224
|
-
if (Side === 'FRONT') {
|
|
225
|
-
this.scanBlastData[0].image = image;
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
this.scanBlastData[1].image = image;
|
|
229
|
-
}
|
|
230
|
-
if (this.scanBlastData[0].image && this.scanBlastData[1].image) {
|
|
231
|
-
// console.warn('UPLOAD');
|
|
232
|
-
if (type == 'worker') {
|
|
233
|
-
this.imageHandler.next({ type: 'stop' });
|
|
234
|
-
}
|
|
235
|
-
//console.warn('DEBUG', Side, this.validationDebug);
|
|
236
|
-
this.scanBlastFinish();
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
this.numberOfValidations = 0;
|
|
240
|
-
// console.warn('DEBUG',Side,this.validationDebug)
|
|
241
|
-
this.validationDebug = [];
|
|
242
|
-
const num = Side === 'FRONT' ? 1 : 0;
|
|
243
|
-
this.scanSecondSide = true;
|
|
244
|
-
this.singleScan(this.scanBlastData[num]);
|
|
245
|
-
this.idScan = this.scanBlastData[num].side;
|
|
246
|
-
if (!this.showDialog) {
|
|
247
|
-
this.showDialog = true;
|
|
248
|
-
this.cd.detectChanges();
|
|
249
|
-
}
|
|
250
|
-
// reset manual scan popup interval
|
|
251
|
-
this.verificationErrorSent = false;
|
|
252
|
-
this.startTime = Date.now();
|
|
253
|
-
this.displayInfo = 'scandoc.info.turn';
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
// console.warn('DEBUG', Side, this.validationDebug);
|
|
258
|
-
this.scanBlastData[0].image = image;
|
|
259
|
-
// console.warn('UPLOAD');
|
|
260
|
-
if (type == 'worker') {
|
|
261
|
-
this.imageHandler.next({ type: 'stop' });
|
|
262
|
-
}
|
|
263
|
-
this.scanBlastFinish();
|
|
264
|
-
}
|
|
265
|
-
this.scannedImages = [];
|
|
266
|
-
// this.scanBlastData[0].image = selectedImage;
|
|
267
|
-
//this.scanBlastFinish();
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
this.validation = false;
|
|
271
|
-
this.scan();
|
|
272
|
-
}
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
closeDialog() {
|
|
276
|
-
this.showDialog = false;
|
|
277
|
-
this.validation = false;
|
|
278
|
-
this.scan();
|
|
279
|
-
}
|
|
280
|
-
handleInitError(error) {
|
|
281
|
-
console.log(error);
|
|
282
|
-
}
|
|
283
|
-
get scanBlastCanUpload() {
|
|
284
|
-
return this.scanBlastData[0].image ? true : false;
|
|
285
|
-
}
|
|
286
|
-
manualMode(type = 'plain') {
|
|
287
|
-
this.manual = true;
|
|
288
|
-
this.promptManual = false;
|
|
289
|
-
this.scanInProgress = false;
|
|
290
|
-
this.cameraProvider.$showSwitch.next(false);
|
|
291
|
-
this.cd.detectChanges();
|
|
292
|
-
}
|
|
293
|
-
handleExtractionError(data) {
|
|
294
|
-
this.logData.ExpectedOutput = {};
|
|
295
|
-
// if (this.logData.ExpectedOutput?._avatar) {
|
|
296
|
-
// delete this.logData.ExpectedOutput._avatar;
|
|
297
|
-
// }
|
|
298
|
-
// this.scanProvider.sendLog(this.logData).subscribe();
|
|
299
|
-
// console.log('LOG DATA', this.logData);
|
|
300
|
-
this.__subs(this.scanProvider.sendLog(this.logData)).subscribe();
|
|
301
|
-
}
|
|
302
|
-
handleLongValidationError(img, type = 'plain') {
|
|
303
|
-
// save current image after 10sec
|
|
304
|
-
let MANUAL_INTERVAL = this.scanProvider.config.manualScanDelay;
|
|
305
|
-
const diff = (Date.now() - this.startTime) / 1000;
|
|
306
|
-
const showDialog = diff > MANUAL_INTERVAL;
|
|
307
|
-
if (showDialog && !this.verificationErrorSent) {
|
|
308
|
-
this.verificationErrorSent = true;
|
|
309
|
-
console.warn('[HANDLE ERROR]');
|
|
310
|
-
this.zone.run(() => {
|
|
311
|
-
// if (!this.scanSecondSide) {
|
|
312
|
-
if (this.scanProvider.config.manualModeEnabled) {
|
|
313
|
-
this.promptManual = true;
|
|
314
|
-
}
|
|
315
|
-
// }
|
|
316
|
-
this.startTime = Date.now();
|
|
317
|
-
});
|
|
318
|
-
// this.verificationErrorSent = true;
|
|
319
|
-
// const dataUrl = this.handleBitmapImage(img.bitmap);
|
|
320
|
-
// console.warn('SENT');
|
|
321
|
-
// // this.displayInfo = 'Cant detect document!';
|
|
322
|
-
// this.logData.Request = this.__subs(
|
|
323
|
-
// this.scanProvider.sendLog({
|
|
324
|
-
// AcceptTermsAndConditions: true,
|
|
325
|
-
// ExpectedOutput: {},
|
|
326
|
-
// Request: {
|
|
327
|
-
// verification: dataUrl.split(',')[1],
|
|
328
|
-
// },
|
|
329
|
-
// Response: {
|
|
330
|
-
// TransactionID: uuidv4(),
|
|
331
|
-
// },
|
|
332
|
-
// })
|
|
333
|
-
// ).subscribe();
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
ngAfterViewInit() {
|
|
337
|
-
// this.result = true;
|
|
338
|
-
this.cameraProvider.$showSwitch.next(true);
|
|
339
|
-
this.cd.detectChanges();
|
|
340
|
-
// this.scanResults.next({ type: 'model', data: {} });
|
|
341
|
-
this.__subs(this.cameraProvider.webcamObservable).subscribe((resp) => {
|
|
342
|
-
this.cameraReady = false;
|
|
343
|
-
this.scanInProgress = false;
|
|
344
|
-
this.scannedImages = [];
|
|
345
|
-
});
|
|
346
|
-
this.__subs(this.cameraProvider.selfie$).subscribe((resp) => {
|
|
347
|
-
this.selfie();
|
|
348
|
-
});
|
|
349
|
-
this.autoScan();
|
|
350
|
-
this.__subs(this.layoutProvider.breakpoint$).subscribe((v) => {
|
|
351
|
-
this.isMobile = !v.matches || this.platform.IOS || this.platform.ANDROID;
|
|
352
|
-
console.log('MNOBILE', this.isMobile);
|
|
353
|
-
});
|
|
354
|
-
// this.imageHandlerSubscription = this.imageHandler.subscribe(
|
|
355
|
-
// (webcamImage: any) => {
|
|
356
|
-
// // return;
|
|
357
|
-
// if (this.startTime === 0) {
|
|
358
|
-
// this.startTime = Date.now();
|
|
359
|
-
// }
|
|
360
|
-
// this.zone.runOutsideAngular(() => {
|
|
361
|
-
// if (webcamImage.base64) {
|
|
362
|
-
// const time = new Date().getTime();
|
|
363
|
-
// if (this.scanImageTimestamps.load > 0) {
|
|
364
|
-
// const { load } = this.scanImageTimestamps;
|
|
365
|
-
// const diff = time - load;
|
|
366
|
-
// // console.warn('TIME', diff);
|
|
367
|
-
// this.scanDelay = diff;
|
|
368
|
-
// }
|
|
369
|
-
// this.scanImageTimestamps.load = time;
|
|
370
|
-
// this.scannedImages.push(webcamImage);
|
|
371
|
-
// this.handleLongValidationError(webcamImage, 'worker');
|
|
372
|
-
// }
|
|
373
|
-
// // this.cd.detectChanges();
|
|
374
|
-
// if (this.scannedImages.length > 4 && !this.validation) {
|
|
375
|
-
// // get last 10
|
|
376
|
-
// console.timeEnd('validationTOTAL_UI');
|
|
377
|
-
// console.time('validationTOTAL_UI');
|
|
378
|
-
// const images = this.scannedImages.slice(-5);
|
|
379
|
-
// // set images to 0
|
|
380
|
-
// this.scannedImages = [];
|
|
381
|
-
// console.log(images);
|
|
382
|
-
// const imagesArray = images.map((m) => m.base64.split(',')[1]);
|
|
383
|
-
// this.validation = true;
|
|
384
|
-
// // this.handleBurstData(imagesArray, images, 'worker');
|
|
385
|
-
// console.time('validationPOST');
|
|
386
|
-
// }
|
|
387
|
-
// this.cd.detectChanges();
|
|
388
|
-
// });
|
|
389
|
-
// }
|
|
390
|
-
// );
|
|
391
|
-
}
|
|
392
|
-
handleBitmapImage(bitmap) {
|
|
393
|
-
const { width, height } = bitmap;
|
|
394
|
-
const offscreenSmall = document.createElement('canvas');
|
|
395
|
-
offscreenSmall.width = width;
|
|
396
|
-
offscreenSmall.height = height;
|
|
397
|
-
const ctx = offscreenSmall.getContext('bitmaprenderer');
|
|
398
|
-
if (ctx) {
|
|
399
|
-
ctx.imageSmoothingEnabled = false;
|
|
400
|
-
ctx.transferFromImageBitmap(bitmap);
|
|
401
|
-
bitmap.close();
|
|
402
|
-
const data = ctx.canvas.toDataURL('image/jpeg');
|
|
403
|
-
return data;
|
|
404
|
-
}
|
|
405
|
-
return null;
|
|
406
|
-
}
|
|
407
|
-
autoScan() {
|
|
408
|
-
const side = this.scanBlastData[0];
|
|
409
|
-
this.idScan = null;
|
|
410
|
-
this.singleScan(side);
|
|
411
|
-
}
|
|
412
|
-
singleScan(side) {
|
|
413
|
-
this.scanType = side.side;
|
|
414
|
-
this.preview = null;
|
|
415
|
-
this.selectedSide = side;
|
|
416
|
-
this.selectedSide.image = null;
|
|
417
|
-
this.documentTypeSelected = true;
|
|
418
|
-
this.scanBlastData[1].disabled = false;
|
|
419
|
-
this.cd.detectChanges();
|
|
420
|
-
}
|
|
421
|
-
manualScanData(data) {
|
|
422
|
-
console.log(data);
|
|
423
|
-
this.scanBlastData = data;
|
|
424
|
-
this.manual = false;
|
|
425
|
-
this.manualDataSet = true;
|
|
426
|
-
this.scanBlastFinish();
|
|
427
|
-
}
|
|
428
|
-
getImgBase64(num) {
|
|
429
|
-
console.log('GET 64');
|
|
430
|
-
// if (this.manualDataSet) {
|
|
431
|
-
return this.scanBlastData[num].image._imageAsDataUrl.split(',')[1];
|
|
432
|
-
// }
|
|
433
|
-
// return this.scanBlastData[num].image.dataUrl.split(',')[1];
|
|
434
|
-
}
|
|
435
|
-
scanBlastFinish() {
|
|
436
|
-
const { browser, os, device } = this.deviceService;
|
|
437
|
-
this.zone.run(() => {
|
|
438
|
-
this.cameraProvider.$showSwitch.next(false);
|
|
439
|
-
});
|
|
440
|
-
console.time('upload');
|
|
441
|
-
if (this.type === 'mobile') {
|
|
442
|
-
this.actions.emit({ data: this.scanBlastData });
|
|
443
|
-
this.retake();
|
|
444
|
-
return;
|
|
445
|
-
}
|
|
446
|
-
this.idScan = null;
|
|
447
|
-
// const loading = this.dialogs.loading();
|
|
448
|
-
this.scaning = true;
|
|
449
|
-
this.cd.detectChanges();
|
|
450
|
-
console.time('payload');
|
|
451
|
-
const payload = {
|
|
452
|
-
AcceptTermsAndConditions: true,
|
|
453
|
-
DataFields: {
|
|
454
|
-
DeviceInfo: {
|
|
455
|
-
OS: os,
|
|
456
|
-
Device: device,
|
|
457
|
-
Browser: browser,
|
|
458
|
-
},
|
|
459
|
-
FrontImageType: 'base64',
|
|
460
|
-
FrontImageCropped: false,
|
|
461
|
-
BackImageType: 'base64',
|
|
462
|
-
BackImageCropped: false,
|
|
463
|
-
FrontImage: this.getImgBase64(0),
|
|
464
|
-
BackImage: this.scanBlastData[1].image ? this.getImgBase64(1) : null,
|
|
465
|
-
},
|
|
466
|
-
Settings: {
|
|
467
|
-
ShouldValidate: true,
|
|
468
|
-
ShouldReturnDocumentImage: true,
|
|
469
|
-
ShouldReturnFaceIfDetected: true,
|
|
470
|
-
SkipImageSizeCheck: true,
|
|
471
|
-
CanStoreImages: this.scanProvider.canStoreImages,
|
|
472
|
-
},
|
|
473
|
-
// CallBackUrl: 'http://demo:5000/report/extracted/',
|
|
474
|
-
};
|
|
475
|
-
this.frontImage = 'data:image/jpeg;base64,' + payload.DataFields.FrontImage;
|
|
476
|
-
this.backImage = 'data:image/jpeg;base64,' + payload.DataFields.BackImage;
|
|
477
|
-
if (!this.scanBlastData[1].image) {
|
|
478
|
-
payload.Settings.IgnoreBackImage = true;
|
|
479
|
-
}
|
|
480
|
-
this.logData.Request = JSON.parse(JSON.stringify(payload));
|
|
481
|
-
console.timeEnd('payload');
|
|
482
|
-
this.__subs(this.scanProvider.blastPost(payload).pipe(catchError((e) => {
|
|
483
|
-
if (this.manualDataSet) {
|
|
484
|
-
// console.warn('MANUAL DATA SET',e);
|
|
485
|
-
this.logData.Response = JSON.parse(JSON.stringify(e.error));
|
|
486
|
-
this.handleExtractionError({});
|
|
487
|
-
}
|
|
488
|
-
this.zone.run(() => {
|
|
489
|
-
this.error = true;
|
|
490
|
-
this.preview = true;
|
|
491
|
-
this.cd.detectChanges();
|
|
492
|
-
});
|
|
493
|
-
// console.log('EEE', e);
|
|
494
|
-
return e;
|
|
495
|
-
}))).subscribe((data) => {
|
|
496
|
-
//console.log(data);
|
|
497
|
-
const results = data.Data;
|
|
498
|
-
console.timeEnd('upload');
|
|
499
|
-
console.time('parse');
|
|
500
|
-
// data.InfoCode = '1001';
|
|
501
|
-
console.time('p');
|
|
502
|
-
this.logData.Response = JSON.parse(JSON.stringify(data));
|
|
503
|
-
console.timeEnd('p');
|
|
504
|
-
//loading.close();
|
|
505
|
-
this.documentTypeSelected = true;
|
|
506
|
-
this.scaning = false;
|
|
507
|
-
if (data.InfoCode === '1001') {
|
|
508
|
-
this.error = true;
|
|
509
|
-
console.log('[ERROR] 1001');
|
|
510
|
-
this.errorCode = '1001';
|
|
511
|
-
// this.scanSide = 0;
|
|
512
|
-
this.preview = true;
|
|
513
|
-
this.cd.detectChanges();
|
|
514
|
-
return;
|
|
515
|
-
}
|
|
516
|
-
if (data.InfoCode === '1002') {
|
|
517
|
-
this.error = true;
|
|
518
|
-
console.log('[ERROR] 1002');
|
|
519
|
-
this.errorCode = '1002';
|
|
520
|
-
// this.scanSide = 0;
|
|
521
|
-
this.preview = true;
|
|
522
|
-
this.cd.detectChanges();
|
|
523
|
-
return;
|
|
524
|
-
}
|
|
525
|
-
if (results && data.Metadata.length > 0 && data.InfoCode === '1000') {
|
|
526
|
-
// console.log('Extraction time', data.AnalysisTime);
|
|
527
|
-
// this.zone.run(() => {
|
|
528
|
-
// console.time('parseblast');
|
|
529
|
-
const result = this.scanProvider.parseBlast(results);
|
|
530
|
-
// console.timeEnd('parseblast');
|
|
531
|
-
// console.log('RES', this.result);
|
|
532
|
-
// this.cd.detectChanges();
|
|
533
|
-
const model = result.model;
|
|
534
|
-
if (data.ImageData?.FaceImage) {
|
|
535
|
-
model._avatar =
|
|
536
|
-
'data:image/jpeg;base64,' + data.ImageData?.FaceImage;
|
|
537
|
-
}
|
|
538
|
-
if (data.ImageData?.Documents) {
|
|
539
|
-
const { Documents } = data.ImageData;
|
|
540
|
-
model.images = Documents.map((image, i) => {
|
|
541
|
-
return { data: 'data:image/jpeg;base64,' + Documents[i] };
|
|
542
|
-
});
|
|
543
|
-
}
|
|
544
|
-
this.model = model;
|
|
545
|
-
// console.log('MODEL', this.model);
|
|
546
|
-
this.actions.emit({
|
|
547
|
-
type: 'scanFinish',
|
|
548
|
-
data: {
|
|
549
|
-
model: this.model,
|
|
550
|
-
images: this.images,
|
|
551
|
-
results,
|
|
552
|
-
},
|
|
553
|
-
});
|
|
554
|
-
if (!this.scanProvider.config.hideResults) {
|
|
555
|
-
this.zone.run(() => {
|
|
556
|
-
this.result = true;
|
|
557
|
-
// console.time('ff');
|
|
558
|
-
this.cd.detectChanges();
|
|
559
|
-
this.scanResults.next({ type: 'model', data: model });
|
|
560
|
-
// this.cd.detectChanges();
|
|
561
|
-
// });
|
|
562
|
-
// console.timeEnd('ff');
|
|
563
|
-
});
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
else {
|
|
567
|
-
console.log('ERROR');
|
|
568
|
-
if (this.manualDataSet) {
|
|
569
|
-
this.handleExtractionError(data);
|
|
570
|
-
}
|
|
571
|
-
// this.scanSide = 0;
|
|
572
|
-
this.zone.run(() => {
|
|
573
|
-
this.error = true;
|
|
574
|
-
this.preview = true;
|
|
575
|
-
this.cd.detectChanges();
|
|
576
|
-
});
|
|
577
|
-
// this.documentTypeSelected = false;
|
|
578
|
-
// this.retry();
|
|
579
|
-
}
|
|
580
|
-
// this.cd.detectChanges();
|
|
581
|
-
console.timeEnd('parse');
|
|
582
|
-
}, (err) => {
|
|
583
|
-
// loading.close();
|
|
584
|
-
// this.scanSide = 0;
|
|
585
|
-
this.error = true;
|
|
586
|
-
this.preview = true;
|
|
587
|
-
this.documentTypeSelected = true;
|
|
588
|
-
this.scaning = false;
|
|
589
|
-
});
|
|
590
|
-
}
|
|
591
|
-
retry() {
|
|
592
|
-
this.preview = false;
|
|
593
|
-
this.validation = false;
|
|
594
|
-
this.errorCode = '1000';
|
|
595
|
-
this.result = false;
|
|
596
|
-
this.idScan = null;
|
|
597
|
-
this.cameraProvider.$showSwitch.next(true);
|
|
598
|
-
if (this.error) {
|
|
599
|
-
this.documentTypeSelected = false;
|
|
600
|
-
this.scanBlastData.forEach((element) => {
|
|
601
|
-
element.image = null;
|
|
602
|
-
});
|
|
603
|
-
}
|
|
604
|
-
this.error = false;
|
|
605
|
-
this.startTime = Date.now();
|
|
606
|
-
this.autoScan();
|
|
607
|
-
this.scan();
|
|
608
|
-
this.cd.detectChanges();
|
|
609
|
-
}
|
|
610
|
-
retake() {
|
|
611
|
-
this.validation = false;
|
|
612
|
-
this.preview = false;
|
|
613
|
-
this.error = false;
|
|
614
|
-
this.result = false;
|
|
615
|
-
this.scanSide = 0;
|
|
616
|
-
this.cameraProvider.$showSwitch.next(true);
|
|
617
|
-
this.imageVerified = false;
|
|
618
|
-
this.scanDatas = [];
|
|
619
|
-
this.scaning = false;
|
|
620
|
-
this.images = [];
|
|
621
|
-
this.scanInProgress = false;
|
|
622
|
-
this.startTime = Date.now();
|
|
623
|
-
this.idScan = null;
|
|
624
|
-
this.documentTypeSelected = false;
|
|
625
|
-
this.scanBlastData.forEach((m) => {
|
|
626
|
-
m.image = null;
|
|
627
|
-
});
|
|
628
|
-
this.scanSecondSide = false;
|
|
629
|
-
this.autoScan();
|
|
630
|
-
this.cd.detectChanges();
|
|
631
|
-
}
|
|
632
|
-
use() {
|
|
633
|
-
// save images??
|
|
634
|
-
if (this.scanProvider.config.sendLog) {
|
|
635
|
-
this.logData.ExpectedOutput = JSON.parse(JSON.stringify(this.model));
|
|
636
|
-
if (this.logData.ExpectedOutput?._avatar) {
|
|
637
|
-
delete this.logData.ExpectedOutput._avatar;
|
|
638
|
-
}
|
|
639
|
-
this.__subs(this.scanProvider.sendLog(this.logData)).subscribe();
|
|
640
|
-
console.log(this.logData);
|
|
641
|
-
}
|
|
642
|
-
this.actions.emit({
|
|
643
|
-
type: 'scanDataClose',
|
|
644
|
-
data: {
|
|
645
|
-
model: this.model,
|
|
646
|
-
images: this.images,
|
|
647
|
-
},
|
|
648
|
-
});
|
|
649
|
-
}
|
|
650
|
-
selfie() {
|
|
651
|
-
const avatar = this.model?._avatar;
|
|
652
|
-
this.dialogs
|
|
653
|
-
.scanSelfie({ avatar })
|
|
654
|
-
.afterClosed()
|
|
655
|
-
.subscribe((resp) => {
|
|
656
|
-
if (resp) {
|
|
657
|
-
console.log(resp);
|
|
658
|
-
if (this.scanProvider.enableVerification) {
|
|
659
|
-
this.imageVerified = true;
|
|
660
|
-
}
|
|
661
|
-
this.scanResults.next({
|
|
662
|
-
type: 'avatar',
|
|
663
|
-
data: resp.imageAsDataUrl,
|
|
664
|
-
});
|
|
665
|
-
// this.model._avatar = resp.imageAsDataUrl;
|
|
666
|
-
this.cd.detectChanges();
|
|
667
|
-
}
|
|
668
|
-
});
|
|
669
|
-
}
|
|
670
|
-
cameraOff(ev) {
|
|
671
|
-
this.cameraReady = false;
|
|
672
|
-
this.cd.detectChanges();
|
|
673
|
-
}
|
|
674
|
-
videoReady(event) {
|
|
675
|
-
console.log('READY', event);
|
|
676
|
-
this.cameraReady = event;
|
|
677
|
-
if (this.cameraReady && !this.scanInProgress && !this.manual) {
|
|
678
|
-
this.scanInProgress = true;
|
|
679
|
-
setTimeout(() => {
|
|
680
|
-
this.scan();
|
|
681
|
-
}, 20);
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
manualSet(key) {
|
|
685
|
-
if (key) {
|
|
686
|
-
if (this.scanProvider.config.showManualMode) {
|
|
687
|
-
this.manualMode();
|
|
688
|
-
}
|
|
689
|
-
else {
|
|
690
|
-
this.actions.emit({
|
|
691
|
-
type: 'manualMode',
|
|
692
|
-
data: {},
|
|
693
|
-
});
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
else {
|
|
697
|
-
this.promptManual = false;
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
ngOnDestroy() {
|
|
701
|
-
if (this.scanTimeout) {
|
|
702
|
-
clearTimeout(this.scanTimeout);
|
|
703
|
-
}
|
|
704
|
-
if (this.imageHandlerSubscription) {
|
|
705
|
-
this.imageHandlerSubscription.unsubscribe();
|
|
706
|
-
}
|
|
707
|
-
console.log('DESTROXY');
|
|
708
|
-
this.__destroy();
|
|
709
|
-
}
|
|
710
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScanComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i1.NgxScandocCameraProvider }, { token: i0.Injector }, { token: i2.LayoutProvider }, { token: i3.Platform }, { token: i4.DeviceDetectorService }, { token: i5.NgxScandocAuthProvider }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
711
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ScanComponent, selector: "ngx-scan", inputs: { type: "type", dialogs: "dialogs", refresh: "refresh", showDialog: "showDialog" }, outputs: { actions: "actions" }, host: { listeners: { "window:resize": "onResize($event)" }, properties: { "class.mobile": "this.class" } }, usesInheritance: true, ngImport: i0, template: "<ng-container\n *ngIf=\"cameraProvider.rectPosition.t > 0 && displayInfo && !result && !manual\"\n>\n <div class=\"hint\" [ngStyle]=\"{ top: cameraProvider.hintPosition + 'px' }\">\n <span class=\"text\">\n {{ displayInfo | translate }}\n </span>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"showDialog\">\n <div class=\"pageTurn\">\n <div class=\"content\">\n <div class=\"inner\">\n <mat-icon>360</mat-icon>\n <div class=\"text\">\n <ng-container *ngIf=\"idScan === 'BACK'\">\n {{ \"scandoc.turnAndCapture.back\" | translate }}\n </ng-container>\n <ng-container *ngIf=\"idScan === 'FRONT'\">\n {{ \"scandoc.turnAndCapture.front\" | translate }}\n </ng-container>\n </div>\n </div>\n <footer>\n <button (click)=\"closeDialog()\" mat-raised-button>Ok</button>\n </footer>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"promptManual\">\n <div class=\"manualMode\">\n <div class=\"content\">\n <div class=\"inner\">\n <mat-icon>screenshot</mat-icon>\n <div class=\"text\">\n {{ \"scandoc.manual\" | translate }}\n </div>\n </div>\n <footer>\n <button\n style=\"margin-right: 8px\"\n (click)=\"manualSet(true)\"\n mat-raised-button\n >\n {{ \"scandoc.yes\" | translate }}\n </button>\n <button\n style=\"margin-left: 8px\"\n (click)=\"manualSet(false)\"\n mat-raised-button\n >\n {{ \"scandoc.no\" | translate }}\n </button>\n </footer>\n </div>\n </div>\n</ng-container>\n<ng-container *ngIf=\"result\">\n <section>\n <ngx-scan-results\n (action)=\"selfie()\"\n [form]=\"form\"\n [data]=\"scanResults\"\n ></ngx-scan-results>\n\n <footer>\n <div class=\"actions\">\n <button class=\"mr-4\" mat-raised-button (click)=\"retake()\">\n {{ \"scandoc.reTake\" | translate }}\n </button>\n <button\n [disabled]=\"error || form.invalid\"\n class=\"ml-4\"\n mat-raised-button\n (click)=\"use()\"\n >\n {{ \"scandoc.useData\" | translate }}\n </button>\n </div>\n </footer>\n </section>\n</ng-container>\n\n<ng-container *ngIf=\"manual\">\n <section>\n <ngx-manual-scan (action)=\"manualScanData($event)\"></ngx-manual-scan>\n </section>\n</ng-container>\n<ng-container *ngIf=\"!result && documentTypeSelected && !manual\">\n <section>\n <div #wraper class=\"wraper\">\n <div class=\"loading\" *ngIf=\"(!cameraReady && !preview) || scaning\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n\n <ng-container *ngIf=\"!error\">\n <ngx-scandoc-webcam\n *ngIf=\"!preview && !scaning\"\n class=\"main\"\n #webcam\n type=\"document\"\n [trigger]=\"trigger\"\n [imageHandler]=\"imageHandler\"\n (imageCapture)=\"handleImage($event)\"\n (initError)=\"handleInitError($event)\"\n (destroyed)=\"cameraOff($event)\"\n (videoReady)=\"videoReady($event)\"\n [refresh]=\"refresh\"\n >\n </ngx-scandoc-webcam>\n </ng-container>\n <div\n class=\"previewData\"\n *ngIf=\"preview\"\n style=\"\n z-index: 20;\n display: flex;\n position: absolute;\n width: 100%;\n height: 100%;\n \"\n >\n <div class=\"p-16 error\" *ngIf=\"error\">\n <div>\n <div class=\"title\">\n <mat-icon>error_outline</mat-icon\n ><span class=\"ml-8\">{{\n \"scandoc.unableToDetectId\" | translate\n }}</span>\n </div>\n\n <ng-container *ngIf=\"errorCode === '1001'\">\n <div>\n {{ \"scandoc.extraction.c1001\" | translate }}\n </div>\n </ng-container>\n <ng-container *ngIf=\"errorCode === '1002'\">\n <div>\n {{ \"scandoc.extraction.c1002\" | translate }}\n </div>\n </ng-container>\n\n <ul *ngIf=\"errorCode === '1000'\">\n <li>\n {{ \"scandoc.placeIdCloseToDevice\" | translate }}\n </li>\n <li>\n {{ \"scandoc.ensureSufficientLight\" | translate }}\n </li>\n <li>\n {{ \"scandoc.holdDocumentSteady\" | translate }}\n </li>\n <li>\n {{ \"scandoc.makeSureAllEdgesOfTheIdAreVisible\" | translate }}\n </li>\n <li>\n {{\n \"scandoc.makeSureThereAreNoGlareAndShadowsOnTheId\" | translate\n }}\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"scanPreview\" *ngIf=\"!error && !scaning\">\n <!-- <div class=\"py-16\" style=\"font-size: 16px\">\n {{\n \"scandoc.ensureAllTextsAreVisible\"\n | translate\n }}\n </div> -->\n <div\n class=\"image\"\n [style.background-image]=\"'url(' + preview + ')'\"\n ></div>\n </div>\n </div>\n </div>\n\n <footer *ngIf=\"preview\">\n <!-- <div class=\"displayInfo\" *ngIf=\"!preview && cameraReady\">\n <ng-container *ngIf=\"displayInfo\">\n {{ displayInfo | translate }}\n </ng-container>\n </div> -->\n <!-- <div style=\"height: 26px\">\n <div\n style=\"text-align: center; font-size: 18px\"\n *ngIf=\"idScan && !preview && cameraReady\"\n >\n <ng-container *ngIf=\"idScan === 'BACK'\">\n Turn document and:\n {{ \"scandoc.captureBack\" | translate }}\n </ng-container>\n <ng-container *ngIf=\"idScan === 'FRONT'\">\n Turn document and:\n {{ \"scandoc.captureFront\" | translate }}\n </ng-container>\n </div>\n </div> -->\n\n <div class=\"actions\" *ngIf=\"preview\">\n <button class=\"mr-4\" mat-raised-button (click)=\"retry()\">\n {{ \"scandoc.retry\" | translate }}\n </button>\n\n <button\n [disabled]=\"error\"\n class=\"ml-4\"\n mat-raised-button\n (click)=\"continue()\"\n >\n {{ \"scandoc.continueWithSelectedImage\" | translate }}\n </button>\n </div>\n </footer>\n </section>\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column!important;flex:1;background-color:#f5f5f5;overflow:hidden;position:relative}:host.mobile .hint{font-size:13px}section{flex:1;display:flex;flex-direction:column;position:relative;overflow:hidden}.wraper{position:relative;overflow:hidden;display:flex;flex-direction:column;flex:1}.wraper .loading{position:absolute;inset:0;z-index:20;background-color:#f5f5f5}.documentTurnOver{position:absolute;width:100%;height:100%;top:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center}.documentTurnOver mat-icon{width:200px;color:#fff;height:200px;font-size:100px}.displayInfo{text-align:center;flex:1;width:100%;background-color:#000;height:50px;display:flex;flex-direction:row;align-items:center;justify-content:center;color:#fff;z-index:200}.displayInfo.mobile{font-size:12px}.preview{width:100%;border-radius:1%}footer button{box-shadow:none!important;height:45px;min-height:45px;text-transform:uppercase}footer .actions{display:flex;flex-direction:row;align-items:center;padding:8px}footer .actions button{flex:1}.error{display:flex;align-items:center;justify-content:center;flex:1}.error .title{font-size:20px;margin-bottom:8px}.error .title mat-icon{margin-right:8px}.error ul{font-size:18px;list-style-type:none}mat-card{box-shadow:none!important}.mr-4{margin-right:4px}.ml-4{margin-left:4px}.p-16{padding:16px}.p-8{padding:8px}.py-16{padding:16px 0}.w-100-p{width:100%}.scanPreview{padding:16px}.scanPreview .image{background-position:center;background-repeat:no-repeat;background-size:contain}.empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.manualMode{position:absolute;width:100%;height:100%;z-index:200;top:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center}.manualMode .content{margin-top:20px;background-color:#fff;border-radius:6px;max-width:300px;width:100%;display:flex;flex-direction:column;padding:30px 20px 0}.manualMode .inner{display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:14px}.manualMode .inner mat-icon{width:60px;height:60px;font-size:60px}.manualMode .inner .text{margin:20px 0}.manualMode footer{display:flex;flex-direction:row;align-items:center;justify-content:center;padding-bottom:20px}.manualMode footer button{min-width:140px;box-shadow:none;border:1px solid #ccc}.pageTurn{position:absolute;width:100%;height:100%;z-index:200;top:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center}.pageTurn .content{background-color:#fff;border-radius:6px;max-width:300px;width:100%;display:flex;flex-direction:column;padding:30px 20px 0}.pageTurn .inner{display:flex;flex-direction:column;align-items:center;justify-content:center}.pageTurn .inner mat-icon{width:60px;height:60px;font-size:60px}.pageTurn .inner .text{margin:20px 0;font-size:14px}.pageTurn footer{display:flex;flex-direction:row;align-items:center;justify-content:center;padding-bottom:20px}.pageTurn footer button{min-width:200px;box-shadow:none;border:1px solid #ccc}.hint{position:absolute;z-index:5;font-size:18px;line-height:18px;display:flex;flex-direction:row;align-items:center;justify-content:center;width:100%}.hint .text{border-radius:3px;padding:4px 8px;background-color:#000;color:#fff;text-align:center;display:inline;-webkit-box-decoration-break:clone;box-decoration-break:clone}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i7.WebcamComponent, selector: "ngx-scandoc-webcam", inputs: ["imageHandler", "type", "trigger", "refresh"], outputs: ["cameraSwitched", "videoReady", "imageCapture", "initError"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i10.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i11.ScanResultsComponent, selector: "ngx-scan-results", inputs: ["data", "images", "form"], outputs: ["action"] }, { kind: "component", type: i12.ManualScanComponent, selector: "ngx-manual-scan", outputs: ["action"] }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
712
|
-
}
|
|
713
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScanComponent, decorators: [{
|
|
714
|
-
type: Component,
|
|
715
|
-
args: [{ selector: 'ngx-scan', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container\n *ngIf=\"cameraProvider.rectPosition.t > 0 && displayInfo && !result && !manual\"\n>\n <div class=\"hint\" [ngStyle]=\"{ top: cameraProvider.hintPosition + 'px' }\">\n <span class=\"text\">\n {{ displayInfo | translate }}\n </span>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"showDialog\">\n <div class=\"pageTurn\">\n <div class=\"content\">\n <div class=\"inner\">\n <mat-icon>360</mat-icon>\n <div class=\"text\">\n <ng-container *ngIf=\"idScan === 'BACK'\">\n {{ \"scandoc.turnAndCapture.back\" | translate }}\n </ng-container>\n <ng-container *ngIf=\"idScan === 'FRONT'\">\n {{ \"scandoc.turnAndCapture.front\" | translate }}\n </ng-container>\n </div>\n </div>\n <footer>\n <button (click)=\"closeDialog()\" mat-raised-button>Ok</button>\n </footer>\n </div>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"promptManual\">\n <div class=\"manualMode\">\n <div class=\"content\">\n <div class=\"inner\">\n <mat-icon>screenshot</mat-icon>\n <div class=\"text\">\n {{ \"scandoc.manual\" | translate }}\n </div>\n </div>\n <footer>\n <button\n style=\"margin-right: 8px\"\n (click)=\"manualSet(true)\"\n mat-raised-button\n >\n {{ \"scandoc.yes\" | translate }}\n </button>\n <button\n style=\"margin-left: 8px\"\n (click)=\"manualSet(false)\"\n mat-raised-button\n >\n {{ \"scandoc.no\" | translate }}\n </button>\n </footer>\n </div>\n </div>\n</ng-container>\n<ng-container *ngIf=\"result\">\n <section>\n <ngx-scan-results\n (action)=\"selfie()\"\n [form]=\"form\"\n [data]=\"scanResults\"\n ></ngx-scan-results>\n\n <footer>\n <div class=\"actions\">\n <button class=\"mr-4\" mat-raised-button (click)=\"retake()\">\n {{ \"scandoc.reTake\" | translate }}\n </button>\n <button\n [disabled]=\"error || form.invalid\"\n class=\"ml-4\"\n mat-raised-button\n (click)=\"use()\"\n >\n {{ \"scandoc.useData\" | translate }}\n </button>\n </div>\n </footer>\n </section>\n</ng-container>\n\n<ng-container *ngIf=\"manual\">\n <section>\n <ngx-manual-scan (action)=\"manualScanData($event)\"></ngx-manual-scan>\n </section>\n</ng-container>\n<ng-container *ngIf=\"!result && documentTypeSelected && !manual\">\n <section>\n <div #wraper class=\"wraper\">\n <div class=\"loading\" *ngIf=\"(!cameraReady && !preview) || scaning\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n\n <ng-container *ngIf=\"!error\">\n <ngx-scandoc-webcam\n *ngIf=\"!preview && !scaning\"\n class=\"main\"\n #webcam\n type=\"document\"\n [trigger]=\"trigger\"\n [imageHandler]=\"imageHandler\"\n (imageCapture)=\"handleImage($event)\"\n (initError)=\"handleInitError($event)\"\n (destroyed)=\"cameraOff($event)\"\n (videoReady)=\"videoReady($event)\"\n [refresh]=\"refresh\"\n >\n </ngx-scandoc-webcam>\n </ng-container>\n <div\n class=\"previewData\"\n *ngIf=\"preview\"\n style=\"\n z-index: 20;\n display: flex;\n position: absolute;\n width: 100%;\n height: 100%;\n \"\n >\n <div class=\"p-16 error\" *ngIf=\"error\">\n <div>\n <div class=\"title\">\n <mat-icon>error_outline</mat-icon\n ><span class=\"ml-8\">{{\n \"scandoc.unableToDetectId\" | translate\n }}</span>\n </div>\n\n <ng-container *ngIf=\"errorCode === '1001'\">\n <div>\n {{ \"scandoc.extraction.c1001\" | translate }}\n </div>\n </ng-container>\n <ng-container *ngIf=\"errorCode === '1002'\">\n <div>\n {{ \"scandoc.extraction.c1002\" | translate }}\n </div>\n </ng-container>\n\n <ul *ngIf=\"errorCode === '1000'\">\n <li>\n {{ \"scandoc.placeIdCloseToDevice\" | translate }}\n </li>\n <li>\n {{ \"scandoc.ensureSufficientLight\" | translate }}\n </li>\n <li>\n {{ \"scandoc.holdDocumentSteady\" | translate }}\n </li>\n <li>\n {{ \"scandoc.makeSureAllEdgesOfTheIdAreVisible\" | translate }}\n </li>\n <li>\n {{\n \"scandoc.makeSureThereAreNoGlareAndShadowsOnTheId\" | translate\n }}\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"scanPreview\" *ngIf=\"!error && !scaning\">\n <!-- <div class=\"py-16\" style=\"font-size: 16px\">\n {{\n \"scandoc.ensureAllTextsAreVisible\"\n | translate\n }}\n </div> -->\n <div\n class=\"image\"\n [style.background-image]=\"'url(' + preview + ')'\"\n ></div>\n </div>\n </div>\n </div>\n\n <footer *ngIf=\"preview\">\n <!-- <div class=\"displayInfo\" *ngIf=\"!preview && cameraReady\">\n <ng-container *ngIf=\"displayInfo\">\n {{ displayInfo | translate }}\n </ng-container>\n </div> -->\n <!-- <div style=\"height: 26px\">\n <div\n style=\"text-align: center; font-size: 18px\"\n *ngIf=\"idScan && !preview && cameraReady\"\n >\n <ng-container *ngIf=\"idScan === 'BACK'\">\n Turn document and:\n {{ \"scandoc.captureBack\" | translate }}\n </ng-container>\n <ng-container *ngIf=\"idScan === 'FRONT'\">\n Turn document and:\n {{ \"scandoc.captureFront\" | translate }}\n </ng-container>\n </div>\n </div> -->\n\n <div class=\"actions\" *ngIf=\"preview\">\n <button class=\"mr-4\" mat-raised-button (click)=\"retry()\">\n {{ \"scandoc.retry\" | translate }}\n </button>\n\n <button\n [disabled]=\"error\"\n class=\"ml-4\"\n mat-raised-button\n (click)=\"continue()\"\n >\n {{ \"scandoc.continueWithSelectedImage\" | translate }}\n </button>\n </div>\n </footer>\n </section>\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column!important;flex:1;background-color:#f5f5f5;overflow:hidden;position:relative}:host.mobile .hint{font-size:13px}section{flex:1;display:flex;flex-direction:column;position:relative;overflow:hidden}.wraper{position:relative;overflow:hidden;display:flex;flex-direction:column;flex:1}.wraper .loading{position:absolute;inset:0;z-index:20;background-color:#f5f5f5}.documentTurnOver{position:absolute;width:100%;height:100%;top:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center}.documentTurnOver mat-icon{width:200px;color:#fff;height:200px;font-size:100px}.displayInfo{text-align:center;flex:1;width:100%;background-color:#000;height:50px;display:flex;flex-direction:row;align-items:center;justify-content:center;color:#fff;z-index:200}.displayInfo.mobile{font-size:12px}.preview{width:100%;border-radius:1%}footer button{box-shadow:none!important;height:45px;min-height:45px;text-transform:uppercase}footer .actions{display:flex;flex-direction:row;align-items:center;padding:8px}footer .actions button{flex:1}.error{display:flex;align-items:center;justify-content:center;flex:1}.error .title{font-size:20px;margin-bottom:8px}.error .title mat-icon{margin-right:8px}.error ul{font-size:18px;list-style-type:none}mat-card{box-shadow:none!important}.mr-4{margin-right:4px}.ml-4{margin-left:4px}.p-16{padding:16px}.p-8{padding:8px}.py-16{padding:16px 0}.w-100-p{width:100%}.scanPreview{padding:16px}.scanPreview .image{background-position:center;background-repeat:no-repeat;background-size:contain}.empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.manualMode{position:absolute;width:100%;height:100%;z-index:200;top:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center}.manualMode .content{margin-top:20px;background-color:#fff;border-radius:6px;max-width:300px;width:100%;display:flex;flex-direction:column;padding:30px 20px 0}.manualMode .inner{display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:14px}.manualMode .inner mat-icon{width:60px;height:60px;font-size:60px}.manualMode .inner .text{margin:20px 0}.manualMode footer{display:flex;flex-direction:row;align-items:center;justify-content:center;padding-bottom:20px}.manualMode footer button{min-width:140px;box-shadow:none;border:1px solid #ccc}.pageTurn{position:absolute;width:100%;height:100%;z-index:200;top:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center}.pageTurn .content{background-color:#fff;border-radius:6px;max-width:300px;width:100%;display:flex;flex-direction:column;padding:30px 20px 0}.pageTurn .inner{display:flex;flex-direction:column;align-items:center;justify-content:center}.pageTurn .inner mat-icon{width:60px;height:60px;font-size:60px}.pageTurn .inner .text{margin:20px 0;font-size:14px}.pageTurn footer{display:flex;flex-direction:row;align-items:center;justify-content:center;padding-bottom:20px}.pageTurn footer button{min-width:200px;box-shadow:none;border:1px solid #ccc}.hint{position:absolute;z-index:5;font-size:18px;line-height:18px;display:flex;flex-direction:row;align-items:center;justify-content:center;width:100%}.hint .text{border-radius:3px;padding:4px 8px;background-color:#000;color:#fff;text-align:center;display:inline;-webkit-box-decoration-break:clone;box-decoration-break:clone}\n"] }]
|
|
716
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1.NgxScandocCameraProvider }, { type: i0.Injector }, { type: i2.LayoutProvider }, { type: i3.Platform }, { type: i4.DeviceDetectorService }, { type: i5.NgxScandocAuthProvider }], propDecorators: { type: [{
|
|
717
|
-
type: Input
|
|
718
|
-
}], dialogs: [{
|
|
719
|
-
type: Input
|
|
720
|
-
}], refresh: [{
|
|
721
|
-
type: Input
|
|
722
|
-
}], actions: [{
|
|
723
|
-
type: Output
|
|
724
|
-
}], showDialog: [{
|
|
725
|
-
type: Input
|
|
726
|
-
}], class: [{
|
|
727
|
-
type: HostBinding,
|
|
728
|
-
args: ['class.mobile']
|
|
729
|
-
}], onResize: [{
|
|
730
|
-
type: HostListener,
|
|
731
|
-
args: ['window:resize', ['$event']]
|
|
732
|
-
}] } });
|
|
733
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvY29yZS9jb21wb25lbnRzL3NjYW4vc2Nhbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvY29yZS9jb21wb25lbnRzL3NjYW4vc2Nhbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sWUFBWSxFQUlaLHVCQUF1QixFQUN2QixLQUFLLEVBSUwsV0FBVyxHQUdaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQWdELE1BQU0sTUFBTSxDQUFDO0FBRzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQXlCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU1oRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQTJCbEQsTUFBTSxPQUFPLGFBQ1gsU0FBUSxhQUFhO0lBd0ZyQixJQUFpQyxLQUFLO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBR0QsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFNRCxZQUNTLEVBQXFCLEVBQ3BCLElBQVksRUFDYixjQUF3QyxFQUN2QyxRQUFrQixFQUNsQixjQUE4QixFQUM5QixRQUFrQixFQUNsQixhQUFvQyxFQUNwQyxJQUE0QixDQUFDLDhCQUE4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LENBQUM7WUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQzsrR0E3ekJVLGFBQWE7bUdBQWIsYUFBYSxnVEM1RDFCLGkvTUE0TkE7OzRGRGhLYSxhQUFhO2tCQU56QixTQUFTOytCQUNFLFVBQVUsbUJBR0gsdUJBQXVCLENBQUMsTUFBTTtzU0FtQnRDLElBQUk7c0JBQVosS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVJLE9BQU87c0JBQWhCLE1BQU07Z0JBMkRFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBUTJCLEtBQUs7c0JBQXJDLFdBQVc7dUJBQUMsY0FBYztnQkFLM0IsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgVmlld0NoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCxcbiAgSG9zdExpc3RlbmVyLFxuICBFbGVtZW50UmVmLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE5nWm9uZSxcbiAgSW5qZWN0b3IsXG4gIEhvc3RCaW5kaW5nLFxuICBWaWV3UmVmLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgZm9ya0pvaW4sIGZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5cbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgc3dpdGNoTWFwLCBtYXAsIGRlbGF5LCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTY2FuUHJvdmlkZXIgfSBmcm9tICcuLi8uLi8uLi9wcm92aWRlcnMvc2Nhbi5wcm92aWRlcic7XG5pbXBvcnQgeyBXZWJjYW1JbWFnZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvY29tcG9uZW50cy93ZWJjYW0vZG9tYWluL3dlYmNhbS1pbWFnZSc7XG5pbXBvcnQgeyBXZWJjYW1Jbml0RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbXBvbmVudHMvd2ViY2FtL2RvbWFpbi93ZWJjYW0taW5pdC1lcnJvcic7XG5pbXBvcnQgeyBOZ3hTY2FuZG9jQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vcHJvdmlkZXJzL2F1dGgucHJvdmlkZXInO1xuaW1wb3J0IHsgTmd4U2NhbmRvY0NhbWVyYVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vcHJvdmlkZXJzL2NhbWVyYS5wcm92aWRlcic7XG5pbXBvcnQgeyBMYXlvdXRQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL3Byb3ZpZGVycy9sYXlvdXQucHJvdmlkZXInO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcblxuaW1wb3J0IHsgRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlIH0gZnJvbSAnbmd4LWRldmljZS1kZXRlY3Rvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdpbmRvdyBleHRlbmRzIFdpbmRvdyB7XG4gIFRleHREZXRlY3RvcjogYW55O1xufVxuXG5pbnRlcmZhY2UgVHJvdWJsZXNob290aW5nIHtcbiAgUmVxdWVzdDogYW55O1xuICBSZXNwb25zZTogYW55O1xuICBFeHBlY3RlZE91dHB1dDogYW55O1xuICBBY2NlcHRUZXJtc0FuZENvbmRpdGlvbnM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBUaW1lc3RhbXBzIHtcbiAgdGltZTogbnVtYmVyO1xuICBsb2FkOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zY2FuJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NjYW4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY2FuLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTY2FuQ29tcG9uZW50XG4gIGV4dGVuZHMgQmFzZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICBzY2FuQmxhc3REYXRhOiBhbnkgPSBbXG4gICAge1xuICAgICAgdGl0bGU6ICdwbXMuZGlhbG9ncy5jb21wb25lbnRzLnNjYW5Qcm9maWxlLmZyb250JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAncG1zLmRpYWxvZ3MuY29tcG9uZW50cy5zY2FuUHJvZmlsZS5mcm9udERlc2NyaXB0aW9uJyxcbiAgICAgIHNpZGU6ICdGUk9OVCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0aXRsZTogJ3Btcy5kaWFsb2dzLmNvbXBvbmVudHMuc2NhblByb2ZpbGUuYmFjaycsXG4gICAgICBkZXNjcmlwdGlvbjogJ3Btcy5kaWFsb2dzLmNvbXBvbmVudHMuc2NhblByb2ZpbGUuYmFja0Rlc2NyaXB0aW9uJyxcbiAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgc2lkZTogJ0JBQ0snLFxuICAgIH0sXG4gIF07XG4gIEBJbnB1dCgpIHR5cGUgPSAnZGVza3RvcCc7XG4gIEBJbnB1dCgpIGRpYWxvZ3M6IGFueTtcblxuICBASW5wdXQoKSByZWZyZXNoITogU3ViamVjdDxib29sZWFuPjtcblxuICBAT3V0cHV0KCkgYWN0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgZGV2aWNlSWQ/OiBzdHJpbmc7XG5cbiAgc2NhblJlc3VsdHMgPSBuZXcgU3ViamVjdCgpO1xuICBzY2FuU2Vjb25kU2lkZSA9IGZhbHNlO1xuICBzdGFydFRpbWU6IG51bWJlciA9IDA7XG5cbiAgc2NhbkluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAvLyB3ZWJjYW0gc25hcHNob3QgdHJpZ2dlclxuICBkb2N1bWVudFR5cGVTZWxlY3RlZCA9IGZhbHNlO1xuICBpbWFnZUhhbmRsZXJTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG4gIHNlbGVjdGVkU2lkZTogYW55O1xuICBpbWFnZXM6IGFueTtcbiAgc2NhblRpbWVvdXQ6IGFueTtcbiAgcHJldmlldzogYW55ID0gbnVsbDtcbiAgc2NhblR5cGU6IGFueTtcblxuICBlcnJvckNvZGUgPSAnMTAwMCc7XG4gIGRpc3BsYXlJbmZvOiBhbnkgPSAnc2NhbmRvYy5pbmZvLnBvc2l0aW9uJztcblxuICB2ZXJpZmljYXRpb25FcnJvclNlbnQgPSBmYWxzZTtcbiAgZXJyb3IgPSBmYWxzZTtcbiAgY2FtZXJhUmVhZHkgPSBmYWxzZTtcbiAgcmVzdWx0OiBhbnk7XG4gIHNjYW5pbmcgPSBmYWxzZTtcblxuICBwcm9tcHRNYW51YWwgPSBmYWxzZTtcblxuICBmcm9udEltYWdlOiBhbnk7XG4gIGJhY2tJbWFnZTogYW55O1xuXG4gIGltYWdlSGFuZGxlciA9IG5ldyBTdWJqZWN0KCk7XG4gIG1hbnVhbERhdGFTZXQgPSBmYWxzZTtcbiAgbG9nRGF0YTogVHJvdWJsZXNob290aW5nID0ge1xuICAgIEFjY2VwdFRlcm1zQW5kQ29uZGl0aW9uczogdHJ1ZSxcbiAgICBSZXF1ZXN0OiBudWxsLFxuICAgIFJlc3BvbnNlOiBudWxsLFxuICAgIEV4cGVjdGVkT3V0cHV0OiBudWxsLFxuICB9O1xuXG4gIHNjYW5EYXRhczogYW55ID0gW107XG4gIHNjYW5TaWRlOiBhbnk7XG4gIGlkU2NhbjogYW55ID0gbnVsbDtcbiAgd2ViY2FtSW1hZ2U/OiBXZWJjYW1JbWFnZTtcbiAgbW9kZWw6IGFueTtcbiAgdmFsaWRhdGlvbiA9IGZhbHNlO1xuICBzY2FubmVkSW1hZ2VzOiBhbnlbXSA9IFtdO1xuICBzY2FuRGVsYXk6IGFueSA9IDA7XG4gIHB1YmxpYyB0cmlnZ2VyOiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIC8vIHN3aXRjaCB0byBuZXh0IC8gcHJldmlvdXMgLyBzcGVjaWZpYyB3ZWJjYW07IHRydWUvZmFsc2U6IGZvcndhcmQvYmFja3dhcmRzLCBzdHJpbmc6IGRldmljZUlkXG4gIHB1YmxpYyBuZXh0V2ViY2FtOiBTdWJqZWN0PGJvb2xlYW4gfCBzdHJpbmc+ID0gbmV3IFN1YmplY3Q8XG4gICAgYm9vbGVhbiB8IHN0cmluZ1xuICA+KCk7XG4gIGltYWdlVmVyaWZpZWQgPSBmYWxzZTtcbiAgZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICBtYW51YWwgPSBmYWxzZTtcbiAgaXNNb2JpbGUgPSB0aGlzLnBsYXRmb3JtLklPUyB8fCB0aGlzLnBsYXRmb3JtLkFORFJPSUQ7XG4gIEBJbnB1dCgpIHNob3dEaWFsb2cgPSBmYWxzZTtcbiAgc2NhbkltYWdlVGltZXN0YW1wczogVGltZXN0YW1wcyA9IHtcbiAgICB0aW1lOiAwLFxuICAgIGxvYWQ6IDAsXG4gIH07XG4gIG51bWJlck9mVmFsaWRhdGlvbnMgPSAwO1xuICB2YWxpZGF0aW9uRGVidWc6IGFueSA9IFtdO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MubW9iaWxlJykgZ2V0IGNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLmlzTW9iaWxlO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIG9uUmVzaXplKCkge1xuICAgIGlmICh0aGlzLnJlc3VsdCkge1xuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgc2NhblByb3ZpZGVyITogU2NhblByb3ZpZGVyO1xuXG4gIGJsdXJWYWx1ZXM6IGFueSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgcHVibGljIGNhbWVyYVByb3ZpZGVyOiBOZ3hTY2FuZG9jQ2FtZXJhUHJvdmlkZXIsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBsYXlvdXRQcm92aWRlcjogTGF5b3V0UHJvdmlkZXIsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBkZXZpY2VTZXJ2aWNlOiBEZXZpY2VEZXRlY3RvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoOiBOZ3hTY2FuZG9jQXV0aFByb3ZpZGVyIC8vIHByaXZhdGUgYXBpOiBTZXJ2ZXJQcm92aWRlclxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2NhblByb3ZpZGVyID0gdGhpcy5pbmplY3Rvci5nZXQoU2NhblByb3ZpZGVyKTtcblxuICAgIGlmICghdGhpcy5zY2FuUHJvdmlkZXIuY29uZmlnLmRldmVsb3BtZW50KSB7XG4gICAgICAvLyBjb25zb2xlID0ge1xuICAgICAgLy8gICBsb2c6ICguLi5hcmdzOiBhbnkpID0+IHt9LFxuICAgICAgLy8gICB0aW1lOiAoLi4uYXJnczogYW55KSA9PiB7fSxcbiAgICAgIC8vICAgdGltZUVuZDogKC4uLmFyZ3M6IGFueSkgPT4ge30sXG4gICAgICAvLyAgIHdhcm46ICguLi5hcmdzOiBhbnkpID0+IHt9LFxuICAgICAgLy8gICBlcnJvcjogKC4uLmFyZ3M6IGFueSkgPT4ge30sXG4gICAgICAvLyB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRMb2dEYXRhKCkge1xuICAgIHRoaXMubG9nRGF0YSA9IHtcbiAgICAgIFJlcXVlc3Q6IG51bGwsXG4gICAgICBSZXNwb25zZTogbnVsbCxcbiAgICAgIEV4cGVjdGVkT3V0cHV0OiBudWxsLFxuICAgICAgQWNjZXB0VGVybXNBbmRDb25kaXRpb25zOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuYXV0aC5hY2Nlc1Rva2VuLnN1YnNjcmliZSgpO1xuICAgIHRoaXMucmVzZXRMb2dEYXRhKCk7XG4gICAgLy8gdGhpcy5yZXN1bHQ9dHJ1ZTtcbiAgICAvLyB0aGlzLnJlc3VsdCA9e307XG5cbiAgICBjb25zb2xlLmxvZygnSU5JVCBTQ0FOJyk7XG4gIH1cblxuICBjb250aW51ZSgpIHtcbiAgICB0aGlzLmRvY3VtZW50VHlwZVNlbGVjdGVkID0gZmFsc2U7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTaWRlLmltYWdlID0gdGhpcy53ZWJjYW1JbWFnZTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkU2lkZS5zaWRlID09PSAnRlJPTlQnKSB7XG4gICAgICAgIHRoaXMuc2NhbkJsYXN0RGF0YVsxXS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHNjYW4oKSB7XG4gICAgdGhpcy50cmlnZ2VyLm5leHQobmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUltYWdlKHdlYmNhbUltYWdlOiBXZWJjYW1JbWFnZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXJ0VGltZSA9PT0gMCkge1xuICAgICAgdGhpcy5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZygnW3JlY2VpdmVkIHdlYmNhbSBpbWFnZV0nLCB3ZWJjYW1JbWFnZSk7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IHRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgICAgaWYgKHRoaXMuc2NhbkltYWdlVGltZXN0YW1wcy5sb2FkID4gMCkge1xuICAgICAgICBjb25zdCB7IGxvYWQgfSA9IHRoaXMuc2NhbkltYWdlVGltZXN0YW1wcztcbiAgICAgICAgY29uc3QgZGlmZiA9IHRpbWUgLSBsb2FkO1xuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCd0aW1lOicsIGRpZmYpO1xuICAgICAgICB0aGlzLnNjYW5EZWxheSA9IGRpZmY7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2NhbkltYWdlVGltZXN0YW1wcy5sb2FkID0gdGltZTtcblxuICAgICAgaWYgKHdlYmNhbUltYWdlLmltYWdlQXNEYXRhVXJsKSB7XG4gICAgICAgIHRoaXMuc2Nhbm5lZEltYWdlcy5wdXNoKHdlYmNhbUltYWdlKTtcbiAgICAgICAgdGhpcy5oYW5kbGVMb25nVmFsaWRhdGlvbkVycm9yKHdlYmNhbUltYWdlLCAnd29ya2VyJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgaWYgKHRoaXMuc2Nhbm5lZEltYWdlcy5sZW5ndGggPiAwICYmICF0aGlzLnZhbGlkYXRpb24pIHtcbiAgICAgICAgLy8gaWYgKHRoaXMuc2NhblByb3ZpZGVyLmNvbmZpZy5kZXZlbG9wbWVudCkge1xuICAgICAgICAvLyAgIHRoaXMuc2Nhbm5lZEltYWdlcy5mb3JFYWNoKChpbWcpID0+IHtcbiAgICAgICAgLy8gICAgIGNvbnN0IGNvbnNvbGVCYWNrZ3JvdW5kID1cbiAgICAgICAgLy8gICAgICAgXCJmb250LXNpemU6MTAwcHg7YmFja2dyb3VuZC1pbWFnZTogdXJsKCdcIiArXG4gICAgICAgIC8vICAgICAgIGltZy5pbWFnZVJlc2l6ZWQgK1xuICAgICAgICAvLyAgICAgICBcIicpO2JhY2tncm91bmQtc2l6ZTogY29udGFpbjsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcIjtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKCclYyAgICAnLCBjb25zb2xlQmFja2dyb3VuZCk7XG4gICAgICAgIC8vICAgfSk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gICB0aGlzLmZyb250SW1hZ2UgPSB3ZWJjYW1JbWFnZS5pbWFnZVJlc2l6ZWQ7XG5cbiAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKCdzY2FuJyk7XG4gICAgICAgIC8vIGNvbnNvbGUudGltZSgnc2NhbicpO1xuICAgICAgICAvLyBnZXQgbGFzdCAxMFxuICAgICAgICAvLyBjb25zb2xlLmxvZygnQ0FQVFVSRUQ6JywgdGhpcy5zY2FubmVkSW1hZ2VzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGltYWdlcyA9IHRoaXMuc2Nhbm5lZEltYWdlcy5zbGljZSgtNSk7XG4gICAgICAgIC8vIHNldCBpbWFnZXMgdG8gMFxuICAgICAgICB0aGlzLnNjYW5uZWRJbWFnZXMgPSBbXTtcbiAgICAgICAgY29uc3QgaW1hZ2VzQXJyYXkgPSBpbWFnZXMubWFwKChtKSA9PiBtLmltYWdlUmVzaXplZC5zcGxpdCgnLCcpWzFdKTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmhhbmRsZUJ1cnN0RGF0YShpbWFnZXNBcnJheSwgaW1hZ2VzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmNhbWVyYVJlYWR5KSB7XG4gICAgICAgICAgdGhpcy5zY2FuKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQnVyc3REYXRhKFxuICAgIGltYWdlc0FycmF5OiBhbnksXG4gICAgaW1hZ2VzOiBhbnksXG4gICAgdHlwZTogJ3dvcmtlcicgfCAncGxhaW4nID0gJ3BsYWluJ1xuICApIHtcbiAgICB0aGlzLl9fc3VicyhcbiAgICAgIHRoaXMuc2NhblByb3ZpZGVyLmJ1cnN0KGltYWdlc0FycmF5LCB0aGlzLmJsdXJWYWx1ZXMpXG4gICAgKS5zdWJzY3JpYmUoKHJlc3A6IGFueSkgPT4ge1xuICAgICAgdGhpcy5kaXNwbGF5SW5mbyA9ICdzY2FuZG9jLmluZm8uYycgKyByZXNwLkluZm9Db2RlO1xuICAgICAgLy8gY29uc29sZS50aW1lRW5kKCd2YWxpZGF0aW9uUE9TVCcpO1xuICAgICAgLy8gY29uc29sZS5sb2coJ0FuYWx5c2lzVGltZScsIHJlc3AuQW5hbHlzaXNUaW1lKTtcbiAgICAgIGNvbnN0IHsgRG9jVHlwZSwgU2VyaWVzLCBTaWRlLCBJbmZvQ29kZSwgVHJhbnNhY3Rpb25JRCB9ID0gcmVzcDtcblxuICAgICAgdGhpcy5oYW5kbGVMb25nVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBUcmFuc2FjdGlvbklELFxuICAgICAgICBpbWFnZXNbMF0uaW1hZ2VBc0RhdGFVcmwuc3BsaXQoJywnKVsxXVxuICAgICAgKTtcblxuICAgICAgLy8gaWYgKEluZm9Db2RlID09PSAnMTAwNicgJiYgdGhpcy5pZFNjYW4pIHtcbiAgICAgIC8vICAgdGhpcy5oYW5kbGVMb25nVmFsaWRhdGlvbkVycm9yKGltYWdlKTtcbiAgICAgIC8vIH1cbiAgICAgIC8vICBjb25zb2xlLndhcm4ocmVzcC5WYWxpZGF0ZWQsIHRoaXMubnVtYmVyT2ZWYWxpZGF0aW9ucyk7XG4gICAgICBpZiAocmVzcC5EZXRlY3RlZEJsdXJWYWx1ZSkge1xuICAgICAgICB0aGlzLmJsdXJWYWx1ZXMucHVzaChyZXNwLkRldGVjdGVkQmx1clZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYmx1clZhbHVlcyA9IFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcC5WYWxpZGF0ZWQpIHtcbiAgICAgICAgdGhpcy5udW1iZXJPZlZhbGlkYXRpb25zKys7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbkRlYnVnLnB1c2gocmVzcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm51bWJlck9mVmFsaWRhdGlvbnMgPSAwO1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25EZWJ1ZyA9IFtdO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubnVtYmVyT2ZWYWxpZGF0aW9ucyA+PSAzKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUluZm8gPSAnJztcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tTQ0FOTkVEIElOREVYXScsIHJlc3AuSW5kZXgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEltYWdlID0gaW1hZ2VzW3Jlc3AuSW5kZXhdO1xuXG4gICAgICAgIC8vIHRoaXMucHJldmlldyA9IHRoaXMud2ViY2FtSW1hZ2UuaW1hZ2VBc0RhdGFVcmw7XG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIGxldCBpbWFnZSA9IHNlbGVjdGVkSW1hZ2U7XG4gICAgICAgIGNvbnNvbGUud2Fybih0eXBlKTtcbiAgICAgICAgaWYgKHR5cGUgPT0gJ3dvcmtlcicpIHtcbiAgICAgICAgICAvL2NvbnN0IGRhdGFVcmwgPSB0aGlzLmhhbmRsZUJpdG1hcEltYWdlKHNlbGVjdGVkSW1hZ2UuYml0bWFwKTtcbiAgICAgICAgICBpbWFnZSA9IHNlbGVjdGVkSW1hZ2UuaW1hZ2VBc0RhdGFVcmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoSW5mb0NvZGUgPT09ICcxMDA3Jykge1xuICAgICAgICAgIC8vIEZvciBJRCBhc2sgZm9yIG90aGVyIHNpZGVcbiAgICAgICAgICBpZiAoU2lkZSA9PT0gJ0ZST05UJykge1xuICAgICAgICAgICAgdGhpcy5zY2FuQmxhc3REYXRhWzBdLmltYWdlID0gaW1hZ2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2NhbkJsYXN0RGF0YVsxXS5pbWFnZSA9IGltYWdlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLnNjYW5CbGFzdERhdGFbMF0uaW1hZ2UgJiYgdGhpcy5zY2FuQmxhc3REYXRhWzFdLmltYWdlKSB7XG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUud2FybignVVBMT0FEJyk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAnd29ya2VyJykge1xuICAgICAgICAgICAgICB0aGlzLmltYWdlSGFuZGxlci5uZXh0KHsgdHlwZTogJ3N0b3AnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb25zb2xlLndhcm4oJ0RFQlVHJywgU2lkZSwgdGhpcy52YWxpZGF0aW9uRGVidWcpO1xuICAgICAgICAgICAgdGhpcy5zY2FuQmxhc3RGaW5pc2goKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5udW1iZXJPZlZhbGlkYXRpb25zID0gMDtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignREVCVUcnLFNpZGUsdGhpcy52YWxpZGF0aW9uRGVidWcpXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25EZWJ1ZyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbnVtID0gU2lkZSA9PT0gJ0ZST05UJyA/IDEgOiAwO1xuICAgICAgICAgICAgdGhpcy5zY2FuU2Vjb25kU2lkZSA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuc2luZ2xlU2Nhbih0aGlzLnNjYW5CbGFzdERhdGFbbnVtXSk7XG5cbiAgICAgICAgICAgIHRoaXMuaWRTY2FuID0gdGhpcy5zY2FuQmxhc3REYXRhW251bV0uc2lkZTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dEaWFsb2cpIHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93RGlhbG9nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXNldCBtYW51YWwgc2NhbiBwb3B1cCBpbnRlcnZhbFxuICAgICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25FcnJvclNlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5SW5mbyA9ICdzY2FuZG9jLmluZm8udHVybic7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNvbnNvbGUud2FybignREVCVUcnLCBTaWRlLCB0aGlzLnZhbGlkYXRpb25EZWJ1Zyk7XG4gICAgICAgICAgdGhpcy5zY2FuQmxhc3REYXRhWzBdLmltYWdlID0gaW1hZ2U7XG4gICAgICAgICAgLy8gY29uc29sZS53YXJuKCdVUExPQUQnKTtcbiAgICAgICAgICBpZiAodHlwZSA9PSAnd29ya2VyJykge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUhhbmRsZXIubmV4dCh7IHR5cGU6ICdzdG9wJyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zY2FuQmxhc3RGaW5pc2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2Nhbm5lZEltYWdlcyA9IFtdO1xuXG4gICAgICAgIC8vIHRoaXMuc2NhbkJsYXN0RGF0YVswXS5pbWFnZSA9IHNlbGVjdGVkSW1hZ2U7XG5cbiAgICAgICAgLy90aGlzLnNjYW5CbGFzdEZpbmlzaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2NhbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xvc2VEaWFsb2coKSB7XG4gICAgdGhpcy5zaG93RGlhbG9nID0gZmFsc2U7XG4gICAgdGhpcy52YWxpZGF0aW9uID0gZmFsc2U7XG5cbiAgICB0aGlzLnNjYW4oKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVJbml0RXJyb3IoZXJyb3I6IFdlYmNhbUluaXRFcnJvcik6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgfVxuXG4gIGdldCBzY2FuQmxhc3RDYW5VcGxvYWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NhbkJsYXN0RGF0YVswXS5pbWFnZSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgbWFudWFsTW9kZSh0eXBlOiAnd29ya2VyJyB8ICdwbGFpbicgPSAncGxhaW4nKSB7XG4gICAgdGhpcy5tYW51YWwgPSB0cnVlO1xuICAgIHRoaXMucHJvbXB0TWFudWFsID0gZmFsc2U7XG4gICAgdGhpcy5zY2FuSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHRoaXMuY2FtZXJhUHJvdmlkZXIuJHNob3dTd2l0Y2gubmV4dChmYWxzZSk7XG5cbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXh0cmFjdGlvbkVycm9yKGRhdGE6IGFueSkge1xuICAgIHRoaXMubG9nRGF0YS5FeHBlY3RlZE91dHB1dCA9IHt9O1xuICAgIC8vIGlmICh0aGlzLmxvZ0RhdGEuRXhwZWN0ZWRPdXRwdXQ/Ll9hdmF0YXIpIHtcbiAgICAvLyAgIGRlbGV0ZSB0aGlzLmxvZ0RhdGEuRXhwZWN0ZWRPdXRwdXQuX2F2YXRhcjtcbiAgICAvLyB9XG4gICAgLy8gdGhpcy5zY2FuUHJvdmlkZXIuc2VuZExvZyh0aGlzLmxvZ0RhdGEpLnN1YnNjcmliZSgpO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ0xPRyBEQVRBJywgdGhpcy5sb2dEYXRhKTtcbiAgICB0aGlzLl9fc3Vicyh0aGlzLnNjYW5Qcm92aWRlci5zZW5kTG9nKHRoaXMubG9nRGF0YSkpLnN1YnNjcmliZSgpO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlTG9uZ1ZhbGlkYXRpb25FcnJvcihcbiAgICBpbWc6IGFueSxcbiAgICB0eXBlOiAnd29ya2VyJyB8ICdwbGFpbicgPSAncGxhaW4nXG4gICkge1xuICAgIC8vIHNhdmUgY3VycmVudCBpbWFnZSBhZnRlciAxMHNlY1xuICAgIGxldCBNQU5VQUxfSU5URVJWQUwgPSB0aGlzLnNjYW5Qcm92aWRlci5jb25maWcubWFudWFsU2NhbkRlbGF5O1xuICAgIGNvbnN0IGRpZmYgPSAoRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lKSAvIDEwMDA7XG5cbiAgICBjb25zdCBzaG93RGlhbG9nID0gZGlmZiA+IE1BTlVBTF9JTlRFUlZBTDtcblxuICAgIGlmIChzaG93RGlhbG9nICYmICF0aGlzLnZlcmlmaWNhdGlvbkVycm9yU2VudCkge1xuICAgICAgdGhpcy52ZXJpZmljYXRpb25FcnJvclNlbnQgPSB0cnVlO1xuICAgICAgY29uc29sZS53YXJuKCdbSEFORExFIEVSUk9SXScpO1xuXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgLy8gaWYgKCF0aGlzLnNjYW5TZWNvbmRTaWRlKSB7XG4gICAgICAgIGlmICh0aGlzLnNjYW5Qcm92aWRlci5jb25maWcubWFudWFsTW9kZUVuYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnByb21wdE1hbnVhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICB9KTtcbiAgICAgIC8vIHRoaXMudmVyaWZpY2F0aW9uRXJyb3JTZW50ID0gdHJ1ZTtcbiAgICAgIC8vIGNvbnN0IGRhdGFVcmwgPSB0aGlzLmhhbmRsZUJpdG1hcEltYWdlKGltZy5iaXRtYXApO1xuXG4gICAgICAvLyBjb25zb2xlLndhcm4oJ1NFTlQnKTtcbiAgICAgIC8vIC8vICB0aGlzLmRpc3BsYXlJbmZvID0gJ0NhbnQgZGV0ZWN0IGRvY3VtZW50ISc7XG4gICAgICAvLyB0aGlzLmxvZ0RhdGEuUmVxdWVzdCA9IHRoaXMuX19zdWJzKFxuICAgICAgLy8gICB0aGlzLnNjYW5Qcm92aWRlci5zZW5kTG9nKHtcbiAgICAgIC8vICAgICBBY2NlcHRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsXG4gICAgICAvLyAgICAgRXhwZWN0ZWRPdXRwdXQ6IHt9LFxuICAgICAgLy8gICAgIFJlcXVlc3Q6IHtcbiAgICAgIC8vICAgICAgIHZlcmlmaWNhdGlvbjogZGF0YVVybC5zcGxpdCgnLCcpWzFdLFxuICAgICAgLy8gICAgIH0sXG4gICAgICAvLyAgICAgUmVzcG9uc2U6IHtcbiAgICAgIC8vICAgICAgIFRyYW5zYWN0aW9uSUQ6IHV1aWR2NCgpLFxuICAgICAgLy8gICAgIH0sXG4gICAgICAvLyAgIH0pXG4gICAgICAvLyApLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gIHRoaXMucmVzdWx0ID0gdHJ1ZTtcblxuICAgIHRoaXMuY2FtZXJhUHJvdmlkZXIuJHNob3dTd2l0Y2gubmV4dCh0cnVlKTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcblxuICAgIC8vIHRoaXMuc2NhblJlc3VsdHMubmV4dCh7IHR5cGU6ICdtb2RlbCcsIGRhdGE6IHt9IH0pO1xuXG4gICAgdGhpcy5fX3N1YnModGhpcy5jYW1lcmFQcm92aWRlci53ZWJjYW1PYnNlcnZhYmxlKS5zdWJzY3JpYmUoKHJlc3ApID0+IHtcbiAgICAgIHRoaXMuY2FtZXJhUmVhZHkgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NhbkluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2Nhbm5lZEltYWdlcyA9IFtdO1xuICAgIH0pO1xuICAgIHRoaXMuX19zdWJzKHRoaXMuY2FtZXJhUHJvdmlkZXIuc2VsZmllJCkuc3Vic2NyaWJlKChyZXNwKSA9PiB7XG4gICAgICB0aGlzLnNlbGZpZSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hdXRvU2NhbigpO1xuXG4gICAgdGhpcy5fX3N1YnModGhpcy5sYXlvdXRQcm92aWRlci5icmVha3BvaW50JCkuc3Vic2NyaWJlKCh2OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuaXNNb2JpbGUgPSAhdi5tYXRjaGVzIHx8IHRoaXMucGxhdGZvcm0uSU9TIHx8IHRoaXMucGxhdGZvcm0uQU5EUk9JRDtcbiAgICAgIGNvbnNvbGUubG9nKCdNTk9CSUxFJywgdGhpcy5pc01vYmlsZSk7XG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLmltYWdlSGFuZGxlclN1YnNjcmlwdGlvbiA9IHRoaXMuaW1hZ2VIYW5kbGVyLnN1YnNjcmliZShcbiAgICAvLyAgICh3ZWJjYW1JbWFnZTogYW55KSA9PiB7XG4gICAgLy8gICAgIC8vIHJldHVybjtcbiAgICAvLyAgICAgaWYgKHRoaXMuc3RhcnRUaW1lID09PSAwKSB7XG4gICAgLy8gICAgICAgdGhpcy5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAvLyAgICAgICBpZiAod2ViY2FtSW1hZ2UuYmFzZTY0KSB7XG4gICAgLy8gICAgICAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgICAvLyAgICAgICAgIGlmICh0aGlzLnNjYW5JbWFnZVRpbWVzdGFtcHMubG9hZCA+IDApIHtcbiAgICAvLyAgICAgICAgICAgY29uc3QgeyBsb2FkIH0gPSB0aGlzLnNjYW5JbWFnZVRpbWVzdGFtcHM7XG4gICAgLy8gICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aW1lIC0gbG9hZDtcbiAgICAvLyAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCdUSU1FJywgZGlmZik7XG4gICAgLy8gICAgICAgICAgIHRoaXMuc2NhbkRlbGF5ID0gZGlmZjtcbiAgICAvLyAgICAgICAgIH1cblxuICAgIC8vICAgICAgICAgdGhpcy5zY2FuSW1hZ2VUaW1lc3RhbXBzLmxvYWQgPSB0aW1lO1xuXG4gICAgLy8gICAgICAgICB0aGlzLnNjYW5uZWRJbWFnZXMucHVzaCh3ZWJjYW1JbWFnZSk7XG4gICAgLy8gICAgICAgICB0aGlzLmhhbmRsZUxvbmdWYWxpZGF0aW9uRXJyb3Iod2ViY2FtSW1hZ2UsICd3b3JrZXInKTtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICAvLyB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAvLyAgICAgICBpZiAodGhpcy5zY2FubmVkSW1hZ2VzLmxlbmd0aCA+IDQgJiYgIXRoaXMudmFsaWRhdGlvbikge1xuICAgIC8vICAgICAgICAgLy8gZ2V0IGxhc3QgMTBcbiAgICAvLyAgICAgICAgIGNvbnNvbGUudGltZUVuZCgndmFsaWRhdGlvblRPVEFMX1VJJyk7XG4gICAgLy8gICAgICAgICBjb25zb2xlLnRpbWUoJ3ZhbGlkYXRpb25UT1RBTF9VSScpO1xuICAgIC8vICAgICAgICAgY29uc3QgaW1hZ2VzID0gdGhpcy5zY2FubmVkSW1hZ2VzLnNsaWNlKC01KTtcbiAgICAvLyAgICAgICAgIC8vIHNldCBpbWFnZXMgdG8gMFxuICAgIC8vICAgICAgICAgdGhpcy5zY2FubmVkSW1hZ2VzID0gW107XG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhpbWFnZXMpO1xuXG4gICAgLy8gICAgICAgICBjb25zdCBpbWFnZXNBcnJheSA9IGltYWdlcy5tYXAoKG0pID0+IG0uYmFzZTY0LnNwbGl0KCcsJylbMV0pO1xuICAgIC8vICAgICAgICAgdGhpcy52YWxpZGF0aW9uID0gdHJ1ZTtcblxuICAgIC8vICAgICAgICAgLy8gdGhpcy5oYW5kbGVCdXJzdERhdGEoaW1hZ2VzQXJyYXksIGltYWdlcywgJ3dvcmtlcicpO1xuXG4gICAgLy8gICAgICAgICBjb25zb2xlLnRpbWUoJ3ZhbGlkYXRpb25QT1NUJyk7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIC8vICAgICB9KTtcbiAgICAvLyAgIH1cbiAgICAvLyApO1xuICB9XG5cbiAgaGFuZGxlQml0bWFwSW1hZ2UoYml0bWFwOiBhbnkpIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGJpdG1hcDtcblxuICAgIGNvbnN0IG9mZnNjcmVlblNtYWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgb2Zmc2NyZWVuU21hbGwud2lkdGggPSB3aWR0aDtcbiAgICBvZmZzY3JlZW5TbWFsbC5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgY3R4OiBhbnkgPSBvZmZzY3JlZW5TbWFsbC5nZXRDb250ZXh0KCdiaXRtYXByZW5kZXJlcicpO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgY3R4LnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKGJpdG1hcCk7XG4gICAgICBiaXRtYXAuY2xvc2UoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBjdHguY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXV0b1NjYW4oKSB7XG4gICAgY29uc3Qgc2lkZSA9IHRoaXMuc2NhbkJsYXN0RGF0YVswXTtcbiAgICB0aGlzLmlkU2NhbiA9IG51bGw7XG4gICAgdGhpcy5zaW5nbGVTY2FuKHNpZGUpO1xuICB9XG5cbiAgc2luZ2xlU2NhbihzaWRlOiBhbnkpIHtcbiAgICB0aGlzLnNjYW5UeXBlID0gc2lkZS5zaWRlO1xuICAgIHRoaXMucHJldmlldyA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZFNpZGUgPSBzaWRlO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNpZGUuaW1hZ2UgPSBudWxsO1xuICAgIHRoaXMuZG9jdW1lbnRUeXBlU2VsZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuc2NhbkJsYXN0RGF0YVsxXS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbWFudWFsU2NhbkRhdGEoZGF0YTogYW55KSB7XG4gICAgY29uc29sZS5sb2coZGF0YSk7XG4gICAgdGhpcy5zY2FuQmxhc3REYXRhID0gZGF0YTtcbiAgICB0aGlzLm1hbnVhbCA9IGZhbHNlO1xuICAgIHRoaXMubWFudWFsRGF0YVNldCA9IHRydWU7XG4gICAgdGhpcy5zY2FuQmxhc3RGaW5pc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW1nQmFzZTY0KG51bTogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ0dFVCA2NCcpO1xuXG4gICAgLy8gaWYgKHRoaXMubWFudWFsRGF0YVNldCkge1xuICAgIHJldHVybiB0aGlzLnNjYW5CbGFzdERhdGFbbnVtXS5pbWFnZS5faW1hZ2VBc0RhdGFVcmwuc3BsaXQoJywnKVsxXTtcbiAgICAvLyB9XG4gICAgLy8gcmV0dXJuIHRoaXMuc2NhbkJsYXN0RGF0YVtudW1dLmltYWdlLmRhdGFVcmwuc3BsaXQoJywnKVsxXTtcbiAgfVxuICBzY2FuQmxhc3RGaW5pc2goKSB7XG4gICAgY29uc3QgeyBicm93c2VyLCBvcywgZGV2aWNlIH0gPSB0aGlzLmRldmljZVNlcnZpY2U7XG5cbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuY2FtZXJhUHJvdmlkZXIuJHNob3dTd2l0Y2gubmV4dChmYWxzZSk7XG4gICAgfSk7XG4gICAgY29uc29sZS50aW1lKCd1cGxvYWQnKTtcbiAgICBpZiAodGhpcy50eXBlID09PSAnbW9iaWxlJykge1xuICAgICAgdGhpcy5hY3Rpb25zLmVtaXQoeyBkYXRhOiB0aGlzLnNjYW5CbGFzdERhdGEgfSk7XG4gICAgICB0aGlzLnJldGFrZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlkU2NhbiA9IG51bGw7XG4gICAgLy8gY29uc3QgbG9hZGluZyA9IHRoaXMuZGlhbG9ncy5sb2FkaW5nKCk7XG4gICAgdGhpcy5zY2FuaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICBjb25zb2xlLnRpbWUoJ3BheWxvYWQnKTtcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICBBY2NlcHRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsXG4gICAgICBEYXRhRmllbGRzOiB7XG4gICAgICAgIERldmljZUluZm86IHtcbiAgICAgICAgICBPUzogb3MsXG4gICAgICAgICAgRGV2aWNlOiBkZXZpY2UsXG4gICAgICAgICAgQnJvd3NlcjogYnJvd3NlcixcbiAgICAgICAgfSxcbiAgICAgICAgRnJvbnRJbWFnZVR5cGU6ICdiYXNlNjQnLFxuICAgICAgICBGcm9udEltYWdlQ3JvcHBlZDogZmFsc2UsXG4gICAgICAgIEJhY2tJbWFnZVR5cGU6ICdiYXNlNjQnLFxuICAgICAgICBCYWNrSW1hZ2VDcm9wcGVkOiBmYWxzZSxcbiAgICAgICAgRnJvbnRJbWFnZTogdGhpcy5nZXRJbWdCYXNlNjQoMCksXG4gICAgICAgIEJhY2tJbWFnZTogdGhpcy5zY2FuQmxhc3REYXRhWzFdLmltYWdlID8gdGhpcy5nZXRJbWdCYXNlNjQoMSkgOiBudWxsLFxuICAgICAgfSxcbiAgICAgIFNldHRpbmdzOiB7XG4gICAgICAgIFNob3VsZFZhbGlkYXRlOiB0cnVlLFxuICAgICAgICBTaG91bGRSZXR1cm5Eb2N1bWVudEltYWdlOiB0cnVlLFxuICAgICAgICBTaG91bGRSZXR1cm5GYWNlSWZEZXRlY3RlZDogdHJ1ZSxcbiAgICAgICAgU2tpcEltYWdlU2l6ZUNoZWNrOiB0cnVlLFxuICAgICAgICBDYW5TdG9yZUltYWdlczogdGhpcy5zY2FuUHJvdmlkZXIuY2FuU3RvcmVJbWFnZXMsXG4gICAgICB9LFxuICAgICAgLy8gQ2FsbEJhY2tVcmw6ICdodHRwOi8vZGVtbzo1MDAwL3JlcG9ydC9leHRyYWN0ZWQvJyxcbiAgICB9O1xuICAgIHRoaXMuZnJvbnRJbWFnZSA9ICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyBwYXlsb2FkLkRhdGFGaWVsZHMuRnJvbnRJbWFnZTtcbiAgICB0aGlzLmJhY2tJbWFnZSA9ICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyBwYXlsb2FkLkRhdGFGaWVsZHMuQmFja0ltYWdlO1xuICAgIGlmICghdGhpcy5zY2FuQmxhc3REYXRhWzFdLmltYWdlKSB7XG4gICAgICBwYXlsb2FkLlNldHRpbmdzLklnbm9yZUJhY2tJbWFnZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMubG9nRGF0YS5SZXF1ZXN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG5cbiAgICBjb25zb2xlLnRpbWVFbmQoJ3BheWxvYWQnKTtcbiAgICB0aGlzLl9fc3VicyhcbiAgICAgIHRoaXMuc2NhblByb3ZpZGVyLmJsYXN0UG9zdChwYXlsb2FkKS5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5tYW51YWxEYXRhU2V0KSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJ01BTlVBTCBEQVRBIFNFVCcsZSk7XG4gICAgICAgICAgICB0aGlzLmxvZ0RhdGEuUmVzcG9uc2UgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUuZXJyb3IpKTtcblxuICAgICAgICAgICAgdGhpcy5oYW5kbGVFeHRyYWN0aW9uRXJyb3Ioe30pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ0VFRScsIGUpO1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICkuc3Vic2NyaWJlKFxuICAgICAgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gZGF0YS5EYXRhO1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3VwbG9hZCcpO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ3BhcnNlJyk7XG4gICAgICAgIC8vIGRhdGEuSW5mb0NvZGUgPSAnMTAwMSc7XG4gICAgICAgIGNvbnNvbGUudGltZSgncCcpO1xuICAgICAgICB0aGlzLmxvZ0RhdGEuUmVzcG9uc2UgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdwJyk7XG4gICAgICAgIC8vbG9hZGluZy5jbG9zZSgpO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZVNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY2FuaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGRhdGEuSW5mb0NvZGUgPT09ICcxMDAxJykge1xuICAgICAgICAgIHRoaXMuZXJyb3IgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbRVJST1JdIDEwMDEnKTtcbiAgICAgICAgICB0aGlzLmVycm9yQ29kZSA9ICcxMDAxJztcbiAgICAgICAgICAvLyB0aGlzLnNjYW5TaWRlID0gMDtcblxuICAgICAgICAgIHRoaXMucHJldmlldyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLkluZm9Db2RlID09PSAnMTAwMicpIHtcbiAgICAgICAgICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0VSUk9SXSAxMDAyJyk7XG4gICAgICAgICAgdGhpcy5lcnJvckNvZGUgPSAnMTAwMic7XG4gICAgICAgICAgLy8gdGhpcy5zY2FuU2lkZSA9IDA7XG5cbiAgICAgICAgICB0aGlzLnByZXZpZXcgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0cyAmJiBkYXRhLk1ldGFkYXRhLmxlbmd0aCA+IDAgJiYgZGF0YS5JbmZvQ29kZSA9PT0gJzEwMDAnKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ0V4dHJhY3Rpb24gdGltZScsIGRhdGEuQW5hbHlzaXNUaW1lKTtcblxuICAgICAgICAgIC8vICB0aGlzLnpvbmUucnVuKCgpID0+IHtcblxuICAgICAgICAgIC8vIGNvbnNvbGUudGltZSgncGFyc2VibGFzdCcpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2NhblByb3ZpZGVyLnBhcnNlQmxhc3QocmVzdWx0cyk7XG4gICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKCdwYXJzZWJsYXN0Jyk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ1JFUycsIHRoaXMucmVzdWx0KTtcbiAgICAgICAgICAvLyB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAgIGNvbnN0IG1vZGVsID0gcmVzdWx0Lm1vZGVsO1xuXG4gICAgICAgICAgaWYgKGRhdGEuSW1hZ2VEYXRhPy5GYWNlSW1hZ2UpIHtcbiAgICAgICAgICAgIG1vZGVsLl9hdmF0YXIgPVxuICAgICAgICAgICAgICAnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnICsgZGF0YS5JbWFnZURhdGE/LkZhY2VJbWFnZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGF0YS5JbWFnZURhdGE/LkRvY3VtZW50cykge1xuICAgICAgICAgICAgY29uc3QgeyBEb2N1bWVudHMgfSA9IGRhdGEuSW1hZ2VEYXRhO1xuICAgICAgICAgICAgbW9kZWwuaW1hZ2VzID0gRG9jdW1lbnRzLm1hcCgoaW1hZ2U6IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6ICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyBEb2N1bWVudHNbaV0gfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ01PREVMJywgdGhpcy5tb2RlbCk7XG4gICAgICAgICAgdGhpcy5hY3Rpb25zLmVtaXQoe1xuICAgICAgICAgICAgdHlwZTogJ3NjYW5GaW5pc2gnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgaW1hZ2VzOiB0aGlzLmltYWdlcyxcbiAgICAgICAgICAgICAgcmVzdWx0cyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuc2NhblByb3ZpZGVyLmNvbmZpZy5oaWRlUmVzdWx0cykge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lKCdmZicpO1xuICAgICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAgICAgICB0aGlzLnNjYW5SZXN1bHRzLm5leHQoeyB0eXBlOiAnbW9kZWwnLCBkYXRhOiBtb2RlbCB9KTtcbiAgICAgICAgICAgICAgLy8gdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIC8vICB9KTtcbiAgICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKCdmZicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicpO1xuICAgICAgICAgIGlmICh0aGlzLm1hbnVhbERhdGFTZXQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXh0cmFjdGlvbkVycm9yKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB0aGlzLnNjYW5TaWRlID0gMDtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIHRoaXMuZG9jdW1lbnRUeXBlU2VsZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIHRoaXMucmV0cnkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3BhcnNlJyk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICAvLyBsb2FkaW5nLmNsb3NlKCk7XG4gICAgICAgIC8vIHRoaXMuc2NhblNpZGUgPSAwO1xuICAgICAgICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmV2aWV3ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2NhbmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICByZXRyeSgpIHtcbiAgICB0aGlzLnByZXZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLnZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmVycm9yQ29kZSA9ICcxMDAwJztcbiAgICB0aGlzLnJlc3VsdCA9IGZhbHNlO1xuICAgIHRoaXMuaWRTY2FuID0gbnVsbDtcbiAgICB0aGlzLmNhbWVyYVByb3ZpZGVyLiRzaG93U3dpdGNoLm5leHQodHJ1ZSk7XG4gICAgaWYgKHRoaXMuZXJyb3IpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRUeXBlU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NhbkJsYXN0RGF0YS5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgZWxlbWVudC5pbWFnZSA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5lcnJvciA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmF1dG9TY2FuKCk7XG4gICAgdGhpcy5zY2FuKCk7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgcmV0YWtlKCkge1xuICAgIHRoaXMudmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMucHJldmlldyA9IGZhbHNlO1xuICAgIHRoaXMuZXJyb3IgPSBmYWxzZTtcbiAgICB0aGlzLnJlc3VsdCA9IGZhbHNlO1xuICAgIHRoaXMuc2NhblNpZGUgPSAwO1xuICAgIHRoaXMuY2FtZXJhUHJvdmlkZXIuJHNob3dTd2l0Y2gubmV4dCh0cnVlKTtcbiAgICB0aGlzLmltYWdlVmVyaWZpZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNjYW5EYXRhcyA9IFtdO1xuICAgIHRoaXMuc2NhbmluZyA9IGZhbHNlO1xuICAgIHRoaXMuaW1hZ2VzID0gW107XG4gICAgdGhpcy5zY2FuSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmlkU2NhbiA9IG51bGw7XG4gICAgdGhpcy5kb2N1bWVudFR5cGVTZWxlY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2NhbkJsYXN0RGF0YS5mb3JFYWNoKChtOiBhbnkpID0+IHtcbiAgICAgIG0uaW1hZ2UgPSBudWxsO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zY2FuU2Vjb25kU2lkZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5hdXRvU2NhbigpO1xuXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICB1c2UoKSB7XG4gICAgLy8gc2F2ZSBpbWFnZXM/P1xuXG4gICAgaWYgKHRoaXMuc2NhblByb3ZpZGVyLmNvbmZpZy5zZW5kTG9nKSB7XG4gICAgICB0aGlzLmxvZ0RhdGEuRXhwZWN0ZWRPdXRwdXQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMubW9kZWwpKTtcbiAgICAgIGlmICh0aGlzLmxvZ0RhdGEuRXhwZWN0ZWRPdXRwdXQ/Ll9hdmF0YXIpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMubG9nRGF0YS5FeHBlY3RlZE91dHB1dC5fYXZhdGFyO1xuICAgICAgfVxuICAgICAgdGhpcy5fX3N1YnModGhpcy5zY2FuUHJvdmlkZXIuc2VuZExvZyh0aGlzLmxvZ0RhdGEpKS5zdWJzY3JpYmUoKTtcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMubG9nRGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5hY3Rpb25zLmVtaXQoe1xuICAgICAgdHlwZTogJ3NjYW5EYXRhQ2xvc2UnLFxuICAgICAgZGF0YToge1xuICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgaW1hZ2VzOiB0aGlzLmltYWdlcyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgc2VsZmllKCkge1xuICAgIGNvbnN0IGF2YXRhciA9IHRoaXMubW9kZWw/Ll9hdmF0YXI7XG4gICAgdGhpcy5kaWFsb2dzXG4gICAgICAuc2NhblNlbGZpZSh7IGF2YXRhciB9KVxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3A6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzcCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3ApO1xuICAgICAgICAgIGlmICh0aGlzLnNjYW5Qcm92aWRlci5lbmFibGVWZXJpZmljYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VWZXJpZmllZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2NhblJlc3VsdHMubmV4dCh7XG4gICAgICAgICAgICB0eXBlOiAnYXZhdGFyJyxcbiAgICAgICAgICAgIGRhdGE6IHJlc3AuaW1hZ2VBc0RhdGFVcmwsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gdGhpcy5tb2RlbC5fYXZhdGFyID0gcmVzcC5pbWFnZUFzRGF0YVVybDtcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBjYW1lcmFPZmYoZXY6IGFueSkge1xuICAgIHRoaXMuY2FtZXJhUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHZpZGVvUmVhZHkoZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICBjb25zb2xlLmxvZygnUkVBRFknLCBldmVudCk7XG4gICAgdGhpcy5jYW1lcmFSZWFkeSA9IGV2ZW50O1xuICAgIGlmICh0aGlzLmNhbWVyYVJlYWR5ICYmICF0aGlzLnNjYW5JblByb2dyZXNzICYmICF0aGlzLm1hbnVhbCkge1xuICAgICAgdGhpcy5zY2FuSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zY2FuKCk7XG4gICAgICB9LCAyMCk7XG4gICAgfVxuICB9XG5cbiAgbWFudWFsU2V0KGtleTogYm9vbGVhbikge1xuICAgIGlmIChrZXkpIHtcbiAgICAgIGlmICh0aGlzLnNjYW5Qcm92aWRlci5jb25maWcuc2hvd01hbnVhbE1vZGUpIHtcbiAgICAgICAgdGhpcy5tYW51YWxNb2RlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGlvbnMuZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ21hbnVhbE1vZGUnLFxuICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9tcHRNYW51YWwgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zY2FuVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2NhblRpbWVvdXQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbWFnZUhhbmRsZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuaW1hZ2VIYW5kbGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ0RFU1RST1hZJyk7XG5cbiAgICB0aGlzLl9fZGVzdHJveSgpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyXG4gICpuZ0lmPVwiY2FtZXJhUHJvdmlkZXIucmVjdFBvc2l0aW9uLnQgPiAwICYmIGRpc3BsYXlJbmZvICYmICFyZXN1bHQgJiYgIW1hbnVhbFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJoaW50XCIgW25nU3R5bGVdPVwieyB0b3A6IGNhbWVyYVByb3ZpZGVyLmhpbnRQb3NpdGlvbiArICdweCcgfVwiPlxuICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiPlxuICAgICAge3sgZGlzcGxheUluZm8gfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RGlhbG9nXCI+XG4gIDxkaXYgY2xhc3M9XCJwYWdlVHVyblwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5uZXJcIj5cbiAgICAgICAgPG1hdC1pY29uPjM2MDwvbWF0LWljb24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlkU2NhbiA9PT0gJ0JBQ0snXCI+XG4gICAgICAgICAgICB7eyBcInNjYW5kb2MudHVybkFuZENhcHR1cmUuYmFja1wiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlkU2NhbiA9PT0gJ0ZST05UJ1wiPlxuICAgICAgICAgICAge3sgXCJzY2FuZG9jLnR1cm5BbmRDYXB0dXJlLmZyb250XCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxmb290ZXI+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIiBtYXQtcmFpc2VkLWJ1dHRvbj5PazwvYnV0dG9uPlxuICAgICAgPC9mb290ZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9tcHRNYW51YWxcIj5cbiAgPGRpdiBjbGFzcz1cIm1hbnVhbE1vZGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlubmVyXCI+XG4gICAgICAgIDxtYXQtaWNvbj5zY3JlZW5zaG90PC9tYXQtaWNvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHRcIj5cbiAgICAgICAgICB7eyBcInNjYW5kb2MubWFudWFsXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxmb290ZXI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1yaWdodDogOHB4XCJcbiAgICAgICAgICAoY2xpY2spPVwibWFudWFsU2V0KHRydWUpXCJcbiAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICA+XG4gICAgICAgICAge3sgXCJzY2FuZG9jLnllc1wiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgc3R5bGU9XCJtYXJnaW4tbGVmdDogOHB4XCJcbiAgICAgICAgICAoY2xpY2spPVwibWFudWFsU2V0KGZhbHNlKVwiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgPlxuICAgICAgICAgIHt7IFwic2NhbmRvYy5ub1wiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9mb290ZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyICpuZ0lmPVwicmVzdWx0XCI+XG4gIDxzZWN0aW9uPlxuICAgIDxuZ3gtc2Nhbi1yZXN1bHRzXG4gICAgICAoYWN0aW9uKT1cInNlbGZpZSgpXCJcbiAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgICAgW2RhdGFdPVwic2NhblJlc3VsdHNcIlxuICAgID48L25neC1zY2FuLXJlc3VsdHM+XG5cbiAgICA8Zm9vdGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1yLTRcIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwicmV0YWtlKClcIj5cbiAgICAgICAgICB7eyBcInNjYW5kb2MucmVUYWtlXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZXJyb3IgfHwgZm9ybS5pbnZhbGlkXCJcbiAgICAgICAgICBjbGFzcz1cIm1sLTRcIlxuICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInVzZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IFwic2NhbmRvYy51c2VEYXRhXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvb3Rlcj5cbiAgPC9zZWN0aW9uPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJtYW51YWxcIj5cbiAgPHNlY3Rpb24+XG4gICAgPG5neC1tYW51YWwtc2NhbiAoYWN0aW9uKT1cIm1hbnVhbFNjYW5EYXRhKCRldmVudClcIj48L25neC1tYW51YWwtc2Nhbj5cbiAgPC9zZWN0aW9uPlxuPC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyICpuZ0lmPVwiIXJlc3VsdCAmJiBkb2N1bWVudFR5cGVTZWxlY3RlZCAmJiAhbWFudWFsXCI+XG4gIDxzZWN0aW9uPlxuICAgIDxkaXYgI3dyYXBlciBjbGFzcz1cIndyYXBlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmdcIiAqbmdJZj1cIighY2FtZXJhUmVhZHkgJiYgIXByZXZpZXcpIHx8IHNjYW5pbmdcIj5cbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlcnJvclwiPlxuICAgICAgICA8bmd4LXNjYW5kb2Mtd2ViY2FtXG4gICAgICAgICAgKm5nSWY9XCIhcHJldmlldyAmJiAhc2NhbmluZ1wiXG4gICAgICAgICAgY2xhc3M9XCJtYWluXCJcbiAgICAgICAgICAjd2ViY2FtXG4gICAgICAgICAgdHlwZT1cImRvY3VtZW50XCJcbiAgICAgICAgICBbdHJpZ2dlcl09XCJ0cmlnZ2VyXCJcbiAgICAgICAgICBbaW1hZ2VIYW5kbGVyXT1cImltYWdlSGFuZGxlclwiXG4gICAgICAgICAgKGltYWdlQ2FwdHVyZSk9XCJoYW5kbGVJbWFnZSgkZXZlbnQpXCJcbiAgICAgICAgICAoaW5pdEVycm9yKT1cImhhbmRsZUluaXRFcnJvcigkZXZlbnQpXCJcbiAgICAgICAgICAoZGVzdHJveWVkKT1cImNhbWVyYU9mZigkZXZlbnQpXCJcbiAgICAgICAgICAodmlkZW9SZWFkeSk9XCJ2aWRlb1JlYWR5KCRldmVudClcIlxuICAgICAgICAgIFtyZWZyZXNoXT1cInJlZnJlc2hcIlxuICAgICAgICA+XG4gICAgICAgIDwvbmd4LXNjYW5kb2Mtd2ViY2FtPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicHJldmlld0RhdGFcIlxuICAgICAgICAqbmdJZj1cInByZXZpZXdcIlxuICAgICAgICBzdHlsZT1cIlxuICAgICAgICAgIHotaW5kZXg6IDIwO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtMTYgZXJyb3JcIiAqbmdJZj1cImVycm9yXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+ZXJyb3Jfb3V0bGluZTwvbWF0LWljb25cbiAgICAgICAgICAgICAgPjxzcGFuIGNsYXNzPVwibWwtOFwiPnt7XG4gICAgICAgICAgICAgICAgXCJzY2FuZG9jLnVuYWJsZVRvRGV0ZWN0SWRcIiB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXJyb3JDb2RlID09PSAnMTAwMSdcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7eyBcInNjYW5kb2MuZXh0cmFjdGlvbi5jMTAwMVwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXJyb3JDb2RlID09PSAnMTAwMidcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7eyBcInNjYW5kb2MuZXh0cmFjdGlvbi5jMTAwMlwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDx1bCAqbmdJZj1cImVycm9yQ29kZSA9PT0gJzEwMDAnXCI+XG4gICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICB7eyBcInNjYW5kb2MucGxhY2VJZENsb3NlVG9EZXZpY2VcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAge3sgXCJzY2FuZG9jLmVuc3VyZVN1ZmZpY2llbnRMaWdodFwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICB7eyBcInNjYW5kb2MuaG9sZERvY3VtZW50U3RlYWR5XCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIHt7IFwic2NhbmRvYy5tYWtlU3VyZUFsbEVkZ2VzT2ZUaGVJZEFyZVZpc2libGVcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgIFwic2NhbmRvYy5tYWtlU3VyZVRoZXJlQXJlTm9HbGFyZUFuZFNoYWRvd3NPblRoZUlkXCIgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjYW5QcmV2aWV3XCIgKm5nSWY9XCIhZXJyb3IgJiYgIXNjYW5pbmdcIj5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJweS0xNlwiIHN0eWxlPVwiZm9udC1zaXplOiAxNnB4XCI+XG4gICAgICAgICAge3tcbiAgICAgICAgICAgIFwic2NhbmRvYy5lbnN1cmVBbGxUZXh0c0FyZVZpc2libGVcIlxuICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgIH19XG4gICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImltYWdlXCJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cIid1cmwoJyArIHByZXZpZXcgKyAnKSdcIlxuICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxmb290ZXIgKm5nSWY9XCJwcmV2aWV3XCI+XG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkaXNwbGF5SW5mb1wiICpuZ0lmPVwiIXByZXZpZXcgJiYgY2FtZXJhUmVhZHlcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5SW5mb1wiPlxuICAgICAgICB7eyBkaXNwbGF5SW5mbyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+IC0tPlxuICAgICAgPCEtLSA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAyNnB4XCI+XG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE4cHhcIlxuICAgICAgICAqbmdJZj1cImlkU2NhbiAmJiAhcHJldmlldyAmJiBjYW1lcmFSZWFkeVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpZFNjYW4gPT09ICdCQUNLJ1wiPlxuICAgICAgICAgIFR1cm4gZG9jdW1lbnQgYW5kOlxuICAgICAgICAgIHt7IFwic2NhbmRvYy5jYXB0dXJlQmFja1wiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaWRTY2FuID09PSAnRlJPTlQnXCI+XG4gICAgICAgICAgVHVybiBkb2N1bWVudCBhbmQ6XG4gICAgICAgICAge3sgXCJzY2FuZG9jLmNhcHR1cmVGcm9udFwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+IC0tPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiICpuZ0lmPVwicHJldmlld1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibXItNFwiIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJyZXRyeSgpXCI+XG4gICAgICAgICAge3sgXCJzY2FuZG9jLnJldHJ5XCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIFtkaXNhYmxlZF09XCJlcnJvclwiXG4gICAgICAgICAgY2xhc3M9XCJtbC00XCJcbiAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgIChjbGljayk9XCJjb250aW51ZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IFwic2NhbmRvYy5jb250aW51ZVdpdGhTZWxlY3RlZEltYWdlXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvb3Rlcj5cbiAgPC9zZWN0aW9uPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
|