ngx-scandoc 15.2.2 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/core/components/scan/scan.component.d.ts +3 -1
  2. package/core/components/scan-results/scan-results.component.d.ts +1 -1
  3. package/core/components/webcam/webcam/webcam.component.d.ts +1 -1
  4. package/core/interfaces/config.d.ts +1 -0
  5. package/dialogs/components/scan-profile/scan-profile.component.d.ts +1 -1
  6. package/{esm2020 → esm2022}/core/components/camera-switch/camera-switch.component.mjs +4 -4
  7. package/{esm2020 → esm2022}/core/components/components.module.mjs +21 -21
  8. package/{esm2020 → esm2022}/core/components/manual-scan/manual-scan.component.mjs +4 -4
  9. package/esm2022/core/components/scan/scan.component.mjs +714 -0
  10. package/{esm2020 → esm2022}/core/components/scan-results/scan-results.component.mjs +4 -4
  11. package/{esm2020 → esm2022}/core/components/webcam/webcam/webcam.component.mjs +4 -4
  12. package/{esm2020 → esm2022}/core/components/webcam/webcam.module.mjs +5 -5
  13. package/{esm2020 → esm2022}/core/interfaces/config.mjs +1 -1
  14. package/{esm2020 → esm2022}/core/pipes/pipes.module.mjs +5 -5
  15. package/{esm2020 → esm2022}/core/pipes/safeResourceUrl.pipe.mjs +4 -4
  16. package/{esm2020 → esm2022}/core/shared/material.module.mjs +85 -85
  17. package/{esm2020 → esm2022}/dialogs/components/blank/blank.component.mjs +4 -4
  18. package/{esm2020 → esm2022}/dialogs/components/confirm/confirm.component.mjs +4 -4
  19. package/{esm2020 → esm2022}/dialogs/components/loading/loading.component.mjs +4 -4
  20. package/{esm2020 → esm2022}/dialogs/components/prompt-manual/prompt-manual.component.mjs +4 -4
  21. package/{esm2020 → esm2022}/dialogs/components/scan-profile/scan-profile.component.mjs +4 -4
  22. package/{esm2020 → esm2022}/dialogs/components/scan-selfie/scan-selfie.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/dialogs/components/turn-document/turn-document.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/dialogs/dialogs.core.provider.mjs +4 -4
  25. package/{esm2020 → esm2022}/dialogs/dialogs.module.mjs +35 -35
  26. package/esm2022/forms/form.module.mjs +87 -0
  27. package/{esm2020 → esm2022}/forms/types/avatar.type.mjs +6 -6
  28. package/{esm2020 → esm2022}/forms/types/profile.image.type.mjs +6 -6
  29. package/{esm2020 → esm2022}/forms/types/title.type.mjs +6 -6
  30. package/{esm2020 → esm2022}/lib/ngx-scandoc.module.mjs +5 -5
  31. package/{esm2020 → esm2022}/providers/auth.provider.mjs +4 -4
  32. package/{esm2020 → esm2022}/providers/camera.provider.mjs +4 -4
  33. package/{esm2020 → esm2022}/providers/interceptor.provider.mjs +4 -4
  34. package/{esm2020 → esm2022}/providers/layout.provider.mjs +4 -4
  35. package/{esm2020 → esm2022}/providers/scan.form.mjs +4 -4
  36. package/esm2022/providers/scan.provider.mjs +766 -0
  37. package/{esm2020 → esm2022}/providers/translate-loader.provider.mjs +4 -4
  38. package/{esm2020 → esm2022}/providers/translation.provider.mjs +4 -4
  39. package/{esm2020 → esm2022}/providers/webrtc.provider.mjs +4 -4
  40. package/{fesm2020 → fesm2022}/ngx-scandoc.mjs +322 -321
  41. package/fesm2022/ngx-scandoc.mjs.map +1 -0
  42. package/package.json +13 -19
  43. package/providers/scan.provider.d.ts +8 -1
  44. package/src/assets/i18n/de.json +3 -1
  45. package/src/assets/i18n/en.json +3 -2
  46. package/src/assets/i18n/hr.json +3 -1
  47. package/src/assets/i18n/it.json +3 -1
  48. package/esm2020/core/components/scan/scan.component.mjs +0 -723
  49. package/esm2020/forms/form.module.mjs +0 -87
  50. package/esm2020/providers/scan.provider.mjs +0 -756
  51. package/fesm2015/ngx-scandoc.mjs +0 -4476
  52. package/fesm2015/ngx-scandoc.mjs.map +0 -1
  53. package/fesm2020/ngx-scandoc.mjs.map +0 -1
  54. /package/{esm2020 → esm2022}/core/app.worker.mjs +0 -0
  55. /package/{esm2020 → esm2022}/core/components/base.component.mjs +0 -0
  56. /package/{esm2020 → esm2022}/core/components/webcam/domain/webcam-image.mjs +0 -0
  57. /package/{esm2020 → esm2022}/core/components/webcam/domain/webcam-init-error.mjs +0 -0
  58. /package/{esm2020 → esm2022}/core/components/webcam/domain/webcam-mirror-properties.mjs +0 -0
  59. /package/{esm2020 → esm2022}/core/components/webcam/util/webcam.util.mjs +0 -0
  60. /package/{esm2020 → esm2022}/core/helpers/object-utils.mjs +0 -0
  61. /package/{esm2020 → esm2022}/core/interfaces/guest.data.mjs +0 -0
  62. /package/{esm2020 → esm2022}/core/tokens/config.tokens.mjs +0 -0
  63. /package/{esm2020 → esm2022}/ngx-scandoc.mjs +0 -0
  64. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -1,723 +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.scanProvider = this.injector.get(ScanProvider);
98
- if (!this.scanProvider.config.development) {
99
- // console = {
100
- // log: (...args: any) => {},
101
- // time: (...args: any) => {},
102
- // timeEnd: (...args: any) => {},
103
- // warn: (...args: any) => {},
104
- // error: (...args: any) => {},
105
- // };
106
- }
107
- }
108
- resetLogData() {
109
- this.logData = {
110
- Request: null,
111
- Response: null,
112
- ExpectedOutput: null,
113
- AcceptTermsAndConditions: true,
114
- };
115
- }
116
- init() {
117
- this.auth.accesToken.subscribe();
118
- this.resetLogData();
119
- // this.result=true;
120
- // this.result ={};
121
- console.log('INIT SCAN');
122
- }
123
- continue() {
124
- this.documentTypeSelected = false;
125
- setTimeout(() => {
126
- this.selectedSide.image = this.webcamImage;
127
- if (this.selectedSide.side === 'FRONT') {
128
- this.scanBlastData[1].disabled = false;
129
- }
130
- this.cd.detectChanges();
131
- }, 200);
132
- }
133
- scan() {
134
- this.trigger.next(new Date().getTime());
135
- }
136
- handleImage(webcamImage) {
137
- if (this.startTime === 0) {
138
- this.startTime = Date.now();
139
- }
140
- // console.log('[received webcam image]', webcamImage);
141
- this.zone.runOutsideAngular(() => {
142
- const time = new Date().getTime();
143
- if (this.scanImageTimestamps.load > 0) {
144
- const { load } = this.scanImageTimestamps;
145
- const diff = time - load;
146
- // console.log('time:', diff);
147
- this.scanDelay = diff;
148
- }
149
- this.scanImageTimestamps.load = time;
150
- if (webcamImage.imageAsDataUrl) {
151
- this.scannedImages.push(webcamImage);
152
- this.handleLongValidationError(webcamImage, 'worker');
153
- }
154
- this.cd.detectChanges();
155
- if (this.scannedImages.length > 0 && !this.validation) {
156
- // if (this.scanProvider.config.development) {
157
- // this.scannedImages.forEach((img) => {
158
- // const consoleBackground =
159
- // "font-size:100px;background-image: url('" +
160
- // img.imageResized +
161
- // "');background-size: contain; background-repeat: no-repeat;";
162
- // console.log('%c ', consoleBackground);
163
- // });
164
- // }
165
- // this.frontImage = webcamImage.imageResized;
166
- // console.timeEnd('scan');
167
- // console.time('scan');
168
- // get last 10
169
- // console.log('CAPTURED:', this.scannedImages.length);
170
- const images = this.scannedImages.slice(-5);
171
- // set images to 0
172
- this.scannedImages = [];
173
- const imagesArray = images.map((m) => m.imageResized.split(',')[1]);
174
- this.validation = true;
175
- this.handleBurstData(imagesArray, images);
176
- }
177
- else {
178
- if (this.cameraReady) {
179
- this.scan();
180
- }
181
- }
182
- });
183
- }
184
- handleBurstData(imagesArray, images, type = 'plain') {
185
- this.__subs(this.scanProvider.burst(imagesArray)).subscribe((resp) => {
186
- this.displayInfo = 'scandoc.info.c' + resp.InfoCode;
187
- // console.timeEnd('validationPOST');
188
- // console.log('AnalysisTime', resp.AnalysisTime);
189
- const { DocType, Series, Side, InfoCode } = resp;
190
- // if (InfoCode === '1006' && this.idScan) {
191
- // this.handleLongValidationError(image);
192
- // }
193
- // console.warn(resp.Validated, this.numberOfValidations);
194
- if (resp.Validated) {
195
- this.numberOfValidations++;
196
- this.validationDebug.push(resp);
197
- }
198
- else {
199
- this.numberOfValidations = 0;
200
- this.validationDebug = [];
201
- }
202
- if (this.numberOfValidations >= 3) {
203
- this.displayInfo = '';
204
- // console.log('[SCANNED INDEX]', resp.Index);
205
- const selectedImage = images[resp.Index];
206
- // this.preview = this.webcamImage.imageAsDataUrl;
207
- this.cd.detectChanges();
208
- let image = selectedImage;
209
- console.warn(type);
210
- if (type == 'worker') {
211
- //const dataUrl = this.handleBitmapImage(selectedImage.bitmap);
212
- image = selectedImage.imageAsDataUrl;
213
- }
214
- if (InfoCode === '1007') {
215
- // For ID ask for other side
216
- if (Side === 'FRONT') {
217
- this.scanBlastData[0].image = image;
218
- }
219
- else {
220
- this.scanBlastData[1].image = image;
221
- }
222
- if (this.scanBlastData[0].image && this.scanBlastData[1].image) {
223
- // console.warn('UPLOAD');
224
- if (type == 'worker') {
225
- this.imageHandler.next({ type: 'stop' });
226
- }
227
- //console.warn('DEBUG', Side, this.validationDebug);
228
- this.scanBlastFinish();
229
- }
230
- else {
231
- this.numberOfValidations = 0;
232
- // console.warn('DEBUG',Side,this.validationDebug)
233
- this.validationDebug = [];
234
- const num = Side === 'FRONT' ? 1 : 0;
235
- this.scanSecondSide = true;
236
- this.singleScan(this.scanBlastData[num]);
237
- this.idScan = this.scanBlastData[num].side;
238
- if (!this.showDialog) {
239
- this.showDialog = true;
240
- this.cd.detectChanges();
241
- }
242
- // reset manual scan popup interval
243
- this.verificationErrorSent = false;
244
- this.startTime = Date.now();
245
- this.displayInfo = 'scandoc.info.turn';
246
- }
247
- }
248
- else {
249
- // console.warn('DEBUG', Side, this.validationDebug);
250
- this.scanBlastData[0].image = image;
251
- // console.warn('UPLOAD');
252
- if (type == 'worker') {
253
- this.imageHandler.next({ type: 'stop' });
254
- }
255
- this.scanBlastFinish();
256
- }
257
- this.scannedImages = [];
258
- // this.scanBlastData[0].image = selectedImage;
259
- //this.scanBlastFinish();
260
- }
261
- else {
262
- this.validation = false;
263
- this.scan();
264
- }
265
- });
266
- }
267
- closeDialog() {
268
- this.showDialog = false;
269
- this.validation = false;
270
- this.scan();
271
- }
272
- handleInitError(error) {
273
- console.log(error);
274
- }
275
- get scanBlastCanUpload() {
276
- return this.scanBlastData[0].image ? true : false;
277
- }
278
- manualMode(type = 'plain') {
279
- this.manual = true;
280
- this.promptManual = false;
281
- this.scanInProgress = false;
282
- this.cameraProvider.$showSwitch.next(false);
283
- this.cd.detectChanges();
284
- }
285
- handleExtractionError(data) {
286
- this.logData.ExpectedOutput = {};
287
- // if (this.logData.ExpectedOutput?._avatar) {
288
- // delete this.logData.ExpectedOutput._avatar;
289
- // }
290
- // this.scanProvider.sendLog(this.logData).subscribe();
291
- // console.log('LOG DATA', this.logData);
292
- this.__subs(this.scanProvider.sendLog(this.logData)).subscribe();
293
- }
294
- handleLongValidationError(img, type = 'plain') {
295
- // save current image after 10sec
296
- let MANUAL_INTERVAL = this.scanProvider.config.manualScanDelay;
297
- const diff = (Date.now() - this.startTime) / 1000;
298
- const showDialog = diff > MANUAL_INTERVAL;
299
- if (showDialog && !this.verificationErrorSent) {
300
- this.verificationErrorSent = true;
301
- console.warn('[HANDLE ERROR]');
302
- this.zone.run(() => {
303
- // if (!this.scanSecondSide) {
304
- if (this.scanProvider.config.manualModeEnabled) {
305
- this.promptManual = true;
306
- }
307
- // }
308
- this.startTime = Date.now();
309
- });
310
- // this.verificationErrorSent = true;
311
- // const dataUrl = this.handleBitmapImage(img.bitmap);
312
- // console.warn('SENT');
313
- // // this.displayInfo = 'Cant detect document!';
314
- // this.logData.Request = this.__subs(
315
- // this.scanProvider.sendLog({
316
- // AcceptTermsAndConditions: true,
317
- // ExpectedOutput: {},
318
- // Request: {
319
- // verification: dataUrl.split(',')[1],
320
- // },
321
- // Response: {
322
- // TransactionID: uuidv4(),
323
- // },
324
- // })
325
- // ).subscribe();
326
- }
327
- }
328
- ngAfterViewInit() {
329
- // this.result = true;
330
- this.cameraProvider.$showSwitch.next(true);
331
- this.cd.detectChanges();
332
- // this.scanResults.next({ type: 'model', data: {} });
333
- this.__subs(this.cameraProvider.webcamObservable).subscribe((resp) => {
334
- this.cameraReady = false;
335
- this.scanInProgress = false;
336
- this.scannedImages = [];
337
- });
338
- this.__subs(this.cameraProvider.selfie$).subscribe((resp) => {
339
- this.selfie();
340
- });
341
- this.autoScan();
342
- this.__subs(this.layoutProvider.breakpoint$).subscribe((v) => {
343
- this.isMobile = !v.matches || this.platform.IOS || this.platform.ANDROID;
344
- console.log('MNOBILE', this.isMobile);
345
- });
346
- // this.imageHandlerSubscription = this.imageHandler.subscribe(
347
- // (webcamImage: any) => {
348
- // // return;
349
- // if (this.startTime === 0) {
350
- // this.startTime = Date.now();
351
- // }
352
- // this.zone.runOutsideAngular(() => {
353
- // if (webcamImage.base64) {
354
- // const time = new Date().getTime();
355
- // if (this.scanImageTimestamps.load > 0) {
356
- // const { load } = this.scanImageTimestamps;
357
- // const diff = time - load;
358
- // // console.warn('TIME', diff);
359
- // this.scanDelay = diff;
360
- // }
361
- // this.scanImageTimestamps.load = time;
362
- // this.scannedImages.push(webcamImage);
363
- // this.handleLongValidationError(webcamImage, 'worker');
364
- // }
365
- // // this.cd.detectChanges();
366
- // if (this.scannedImages.length > 4 && !this.validation) {
367
- // // get last 10
368
- // console.timeEnd('validationTOTAL_UI');
369
- // console.time('validationTOTAL_UI');
370
- // const images = this.scannedImages.slice(-5);
371
- // // set images to 0
372
- // this.scannedImages = [];
373
- // console.log(images);
374
- // const imagesArray = images.map((m) => m.base64.split(',')[1]);
375
- // this.validation = true;
376
- // // this.handleBurstData(imagesArray, images, 'worker');
377
- // console.time('validationPOST');
378
- // }
379
- // this.cd.detectChanges();
380
- // });
381
- // }
382
- // );
383
- }
384
- handleBitmapImage(bitmap) {
385
- const { width, height } = bitmap;
386
- const offscreenSmall = document.createElement('canvas');
387
- offscreenSmall.width = width;
388
- offscreenSmall.height = height;
389
- const ctx = offscreenSmall.getContext('bitmaprenderer');
390
- if (ctx) {
391
- ctx.imageSmoothingEnabled = false;
392
- ctx.transferFromImageBitmap(bitmap);
393
- bitmap.close();
394
- const data = ctx.canvas.toDataURL('image/jpeg');
395
- return data;
396
- }
397
- return null;
398
- }
399
- autoScan() {
400
- const side = this.scanBlastData[0];
401
- this.idScan = null;
402
- this.singleScan(side);
403
- }
404
- singleScan(side) {
405
- this.scanType = side.side;
406
- this.preview = null;
407
- this.selectedSide = side;
408
- this.selectedSide.image = null;
409
- this.documentTypeSelected = true;
410
- this.scanBlastData[1].disabled = false;
411
- this.cd.detectChanges();
412
- }
413
- manualScanData(data) {
414
- console.log(data);
415
- this.scanBlastData = data;
416
- this.manual = false;
417
- this.manualDataSet = true;
418
- this.scanBlastFinish();
419
- }
420
- getImgBase64(num) {
421
- console.log('GET 64');
422
- // if (this.manualDataSet) {
423
- return this.scanBlastData[num].image._imageAsDataUrl.split(',')[1];
424
- // }
425
- // return this.scanBlastData[num].image.dataUrl.split(',')[1];
426
- }
427
- scanBlastFinish() {
428
- const { browser, os, device } = this.deviceService;
429
- this.zone.run(() => {
430
- this.cameraProvider.$showSwitch.next(false);
431
- });
432
- console.time('upload');
433
- if (this.type === 'mobile') {
434
- this.actions.emit({ data: this.scanBlastData });
435
- this.retake();
436
- return;
437
- }
438
- this.idScan = null;
439
- // const loading = this.dialogs.loading();
440
- this.scaning = true;
441
- this.cd.detectChanges();
442
- console.time('payload');
443
- const payload = {
444
- AcceptTermsAndConditions: true,
445
- DataFields: {
446
- DeviceInfo: {
447
- OS: os,
448
- Device: device,
449
- Browser: browser,
450
- },
451
- FrontImageType: 'base64',
452
- FrontImageCropped: false,
453
- BackImageType: 'base64',
454
- BackImageCropped: false,
455
- FrontImage: this.getImgBase64(0),
456
- BackImage: this.scanBlastData[1].image ? this.getImgBase64(1) : null,
457
- },
458
- Settings: {
459
- ShouldValidate: true,
460
- ShouldReturnDocumentImage: true,
461
- ShouldReturnFaceIfDetected: true,
462
- SkipImageSizeCheck: true,
463
- CanStoreImages: this.scanProvider.canStoreImages,
464
- },
465
- // CallBackUrl: 'http://demo:5000/report/extracted/',
466
- };
467
- this.frontImage = 'data:image/jpeg;base64,' + payload.DataFields.FrontImage;
468
- this.backImage = 'data:image/jpeg;base64,' + payload.DataFields.BackImage;
469
- if (!this.scanBlastData[1].image) {
470
- payload.Settings.IgnoreBackImage = true;
471
- }
472
- this.logData.Request = JSON.parse(JSON.stringify(payload));
473
- console.timeEnd('payload');
474
- this.__subs(this.scanProvider.blastPost(payload).pipe(catchError((e) => {
475
- if (this.manualDataSet) {
476
- // console.warn('MANUAL DATA SET',e);
477
- this.logData.Response = JSON.parse(JSON.stringify(e.error));
478
- this.handleExtractionError({});
479
- }
480
- this.zone.run(() => {
481
- this.error = true;
482
- this.preview = true;
483
- this.cd.detectChanges();
484
- });
485
- // console.log('EEE', e);
486
- return e;
487
- }))).subscribe((data) => {
488
- //console.log(data);
489
- const results = data.Data;
490
- console.timeEnd('upload');
491
- console.time('parse');
492
- // data.InfoCode = '1001';
493
- console.time('p');
494
- this.logData.Response = JSON.parse(JSON.stringify(data));
495
- console.timeEnd('p');
496
- //loading.close();
497
- this.documentTypeSelected = true;
498
- this.scaning = false;
499
- if (data.InfoCode === '1001') {
500
- this.error = true;
501
- console.log('[ERROR] 1001');
502
- this.errorCode = '1001';
503
- // this.scanSide = 0;
504
- this.preview = true;
505
- this.cd.detectChanges();
506
- return;
507
- }
508
- if (data.InfoCode === '1002') {
509
- this.error = true;
510
- console.log('[ERROR] 1002');
511
- this.errorCode = '1002';
512
- // this.scanSide = 0;
513
- this.preview = true;
514
- this.cd.detectChanges();
515
- return;
516
- }
517
- if (results && data.Metadata.length > 0 && data.InfoCode === '1000') {
518
- // console.log('Extraction time', data.AnalysisTime);
519
- // this.zone.run(() => {
520
- // console.time('parseblast');
521
- const result = this.scanProvider.parseBlast(results);
522
- // console.timeEnd('parseblast');
523
- // console.log('RES', this.result);
524
- // this.cd.detectChanges();
525
- const model = result.model;
526
- if (data.ImageData?.FaceImage) {
527
- model._avatar =
528
- 'data:image/jpeg;base64,' + data.ImageData?.FaceImage;
529
- }
530
- if (data.ImageData?.Documents) {
531
- const { Documents } = data.ImageData;
532
- model.images = Documents.map((image, i) => {
533
- return { data: 'data:image/jpeg;base64,' + Documents[i] };
534
- });
535
- }
536
- this.model = model;
537
- // console.log('MODEL', this.model);
538
- this.actions.emit({
539
- type: 'scanFinish',
540
- data: {
541
- model: this.model,
542
- images: this.images,
543
- results,
544
- },
545
- });
546
- if (!this.scanProvider.config.hideResults) {
547
- this.zone.run(() => {
548
- this.result = true;
549
- // console.time('ff');
550
- this.cd.detectChanges();
551
- this.scanResults.next({ type: 'model', data: model });
552
- // this.cd.detectChanges();
553
- // });
554
- // console.timeEnd('ff');
555
- });
556
- }
557
- }
558
- else {
559
- console.log('ERROR');
560
- if (this.manualDataSet) {
561
- this.handleExtractionError(data);
562
- }
563
- // this.scanSide = 0;
564
- this.zone.run(() => {
565
- this.error = true;
566
- this.preview = true;
567
- this.cd.detectChanges();
568
- });
569
- // this.documentTypeSelected = false;
570
- // this.retry();
571
- }
572
- // this.cd.detectChanges();
573
- console.timeEnd('parse');
574
- }, (err) => {
575
- // loading.close();
576
- // this.scanSide = 0;
577
- this.error = true;
578
- this.preview = true;
579
- this.documentTypeSelected = true;
580
- this.scaning = false;
581
- });
582
- }
583
- retry() {
584
- this.preview = false;
585
- this.validation = false;
586
- this.errorCode = '1000';
587
- this.result = false;
588
- this.idScan = null;
589
- this.cameraProvider.$showSwitch.next(true);
590
- if (this.error) {
591
- this.documentTypeSelected = false;
592
- this.scanBlastData.forEach((element) => {
593
- element.image = null;
594
- });
595
- }
596
- this.error = false;
597
- this.startTime = Date.now();
598
- this.autoScan();
599
- this.scan();
600
- this.cd.detectChanges();
601
- }
602
- retake() {
603
- this.validation = false;
604
- this.preview = false;
605
- this.error = false;
606
- this.result = false;
607
- this.scanSide = 0;
608
- this.cameraProvider.$showSwitch.next(true);
609
- this.imageVerified = false;
610
- this.scanDatas = [];
611
- this.scaning = false;
612
- this.images = [];
613
- this.scanInProgress = false;
614
- this.startTime = Date.now();
615
- this.idScan = null;
616
- this.documentTypeSelected = false;
617
- this.scanBlastData.forEach((m) => {
618
- m.image = null;
619
- });
620
- this.scanSecondSide = false;
621
- this.autoScan();
622
- this.cd.detectChanges();
623
- }
624
- use() {
625
- // save images??
626
- if (this.scanProvider.config.sendLog) {
627
- this.logData.ExpectedOutput = JSON.parse(JSON.stringify(this.model));
628
- if (this.logData.ExpectedOutput?._avatar) {
629
- delete this.logData.ExpectedOutput._avatar;
630
- }
631
- this.__subs(this.scanProvider.sendLog(this.logData)).subscribe();
632
- console.log(this.logData);
633
- }
634
- this.actions.emit({
635
- type: 'scanDataClose',
636
- data: {
637
- model: this.model,
638
- images: this.images,
639
- },
640
- });
641
- }
642
- selfie() {
643
- const avatar = this.model?._avatar;
644
- this.dialogs
645
- .scanSelfie({ avatar })
646
- .afterClosed()
647
- .subscribe((resp) => {
648
- if (resp) {
649
- console.log(resp);
650
- if (this.scanProvider.enableVerification) {
651
- this.imageVerified = true;
652
- }
653
- this.scanResults.next({
654
- type: 'avatar',
655
- data: resp.imageAsDataUrl,
656
- });
657
- // this.model._avatar = resp.imageAsDataUrl;
658
- this.cd.detectChanges();
659
- }
660
- });
661
- }
662
- cameraOff(ev) {
663
- this.cameraReady = false;
664
- this.cd.detectChanges();
665
- }
666
- videoReady(event) {
667
- console.log('READY', event);
668
- this.cameraReady = event;
669
- if (this.cameraReady && !this.scanInProgress && !this.manual) {
670
- this.scanInProgress = true;
671
- setTimeout(() => {
672
- this.scan();
673
- }, 20);
674
- }
675
- }
676
- manualSet(key) {
677
- if (key) {
678
- if (this.scanProvider.config.showManualMode) {
679
- this.manualMode();
680
- }
681
- else {
682
- this.actions.emit({
683
- type: 'manualMode',
684
- data: {},
685
- });
686
- }
687
- }
688
- else {
689
- this.promptManual = false;
690
- }
691
- }
692
- ngOnDestroy() {
693
- if (this.scanTimeout) {
694
- clearTimeout(this.scanTimeout);
695
- }
696
- if (this.imageHandlerSubscription) {
697
- this.imageHandlerSubscription.unsubscribe();
698
- }
699
- console.log('DESTROXY');
700
- this.__destroy();
701
- }
702
- }
703
- ScanComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", 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 });
704
- ScanComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ScanComponent, selector: "ngx-scan", inputs: { type: "type", dialogs: "dialogs", 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 >\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"], 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] ", inputs: ["disabled", "disableRipple", "color"], 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 });
705
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ScanComponent, decorators: [{
706
- type: Component,
707
- 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 >\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"] }]
708
- }], ctorParameters: function () { return [{ 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: [{
709
- type: Input
710
- }], dialogs: [{
711
- type: Input
712
- }], actions: [{
713
- type: Output
714
- }], showDialog: [{
715
- type: Input
716
- }], class: [{
717
- type: HostBinding,
718
- args: ['class.mobile']
719
- }], onResize: [{
720
- type: HostListener,
721
- args: ['window:resize', ['$event']]
722
- }] } });
723
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvY29yZS9jb21wb25lbnRzL3NjYW4vc2Nhbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2NhbmRvYy9zcmMvY29yZS9jb21wb25lbnRzL3NjYW4vc2Nhbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sWUFBWSxFQUlaLHVCQUF1QixFQUN2QixLQUFLLEVBSUwsV0FBVyxHQUdaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQWdELE1BQU0sTUFBTSxDQUFDO0FBRzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQXlCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU1oRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQTJCbEQsTUFBTSxPQUFPLGFBQ1gsU0FBUSxhQUFhO0lBcUZyQixJQUFpQyxLQUFLO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBR0QsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBSUQsWUFDUyxFQUFxQixFQUNwQixJQUFZLEVBQ2IsY0FBd0MsRUFDdkMsUUFBa0IsRUFDbEIsY0FBOEIsRUFDOUIsUUFBa0IsRUFDbEIsYUFBb0MsRUFDcEMsSUFBNEIsQ0FBQyw4QkFBOEI7O1FBRW5FLEtB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T0FBTyxDQUFDLElBQUksQ0FBQztvQkFDaEIsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLElBQUksRUFBRSxFQUFFO2lCQUNULENBQUMsQ0FBQzthQUNKO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNoQztRQUNELElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFO1lBQ2pDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM3QztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7OzBHQTV5QlUsYUFBYTs4RkFBYixhQUFhLDRSQzVEMUIsZzlNQTJOQTsyRkQvSmEsYUFBYTtrQkFOekIsU0FBUzsrQkFDRSxVQUFVLG1CQUdILHVCQUF1QixDQUFDLE1BQU07d1RBbUJ0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU07Z0JBMkRFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBUTJCLEtBQUs7c0JBQXJDLFdBQVc7dUJBQUMsY0FBYztnQkFLM0IsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgVmlld0NoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCxcbiAgSG9zdExpc3RlbmVyLFxuICBFbGVtZW50UmVmLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE5nWm9uZSxcbiAgSW5qZWN0b3IsXG4gIEhvc3RCaW5kaW5nLFxuICBWaWV3UmVmLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgZm9ya0pvaW4sIGZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5cbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgc3dpdGNoTWFwLCBtYXAsIGRlbGF5LCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTY2FuUHJvdmlkZXIgfSBmcm9tICcuLi8uLi8uLi9wcm92aWRlcnMvc2Nhbi5wcm92aWRlcic7XG5pbXBvcnQgeyBXZWJjYW1JbWFnZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvY29tcG9uZW50cy93ZWJjYW0vZG9tYWluL3dlYmNhbS1pbWFnZSc7XG5pbXBvcnQgeyBXZWJjYW1Jbml0RXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbXBvbmVudHMvd2ViY2FtL2RvbWFpbi93ZWJjYW0taW5pdC1lcnJvcic7XG5pbXBvcnQgeyBOZ3hTY2FuZG9jQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vcHJvdmlkZXJzL2F1dGgucHJvdmlkZXInO1xuaW1wb3J0IHsgTmd4U2NhbmRvY0NhbWVyYVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vcHJvdmlkZXJzL2NhbWVyYS5wcm92aWRlcic7XG5pbXBvcnQgeyBMYXlvdXRQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL3Byb3ZpZGVycy9sYXlvdXQucHJvdmlkZXInO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcblxuaW1wb3J0IHsgRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlIH0gZnJvbSAnbmd4LWRldmljZS1kZXRlY3Rvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdpbmRvdyBleHRlbmRzIFdpbmRvdyB7XG4gIFRleHREZXRlY3RvcjogYW55O1xufVxuXG5pbnRlcmZhY2UgVHJvdWJsZXNob290aW5nIHtcbiAgUmVxdWVzdDogYW55O1xuICBSZXNwb25zZTogYW55O1xuICBFeHBlY3RlZE91dHB1dDogYW55O1xuICBBY2NlcHRUZXJtc0FuZENvbmRpdGlvbnM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBUaW1lc3RhbXBzIHtcbiAgdGltZTogbnVtYmVyO1xuICBsb2FkOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zY2FuJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NjYW4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY2FuLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTY2FuQ29tcG9uZW50XG4gIGV4dGVuZHMgQmFzZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICBzY2FuQmxhc3REYXRhOiBhbnkgPSBbXG4gICAge1xuICAgICAgdGl0bGU6ICdwbXMuZGlhbG9ncy5jb21wb25lbnRzLnNjYW5Qcm9maWxlLmZyb250JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAncG1zLmRpYWxvZ3MuY29tcG9uZW50cy5zY2FuUHJvZmlsZS5mcm9udERlc2NyaXB0aW9uJyxcbiAgICAgIHNpZGU6ICdGUk9OVCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0aXRsZTogJ3Btcy5kaWFsb2dzLmNvbXBvbmVudHMuc2NhblByb2ZpbGUuYmFjaycsXG4gICAgICBkZXNjcmlwdGlvbjogJ3Btcy5kaWFsb2dzLmNvbXBvbmVudHMuc2NhblByb2ZpbGUuYmFja0Rlc2NyaXB0aW9uJyxcbiAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgc2lkZTogJ0JBQ0snLFxuICAgIH0sXG4gIF07XG4gIEBJbnB1dCgpIHR5cGUgPSAnZGVza3RvcCc7XG4gIEBJbnB1dCgpIGRpYWxvZ3M6IGFueTtcbiAgQE91dHB1dCgpIGFjdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljIGRldmljZUlkPzogc3RyaW5nO1xuXG4gIHNjYW5SZXN1bHRzID0gbmV3IFN1YmplY3QoKTtcbiAgc2NhblNlY29uZFNpZGUgPSBmYWxzZTtcbiAgc3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuXG4gIHNjYW5JblByb2dyZXNzID0gZmFsc2U7XG5cbiAgLy8gd2ViY2FtIHNuYXBzaG90IHRyaWdnZXJcbiAgZG9jdW1lbnRUeXBlU2VsZWN0ZWQgPSBmYWxzZTtcbiAgaW1hZ2VIYW5kbGVyU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xuICBzZWxlY3RlZFNpZGU6IGFueTtcbiAgaW1hZ2VzOiBhbnk7XG4gIHNjYW5UaW1lb3V0OiBhbnk7XG4gIHByZXZpZXc6IGFueSA9IG51bGw7XG4gIHNjYW5UeXBlOiBhbnk7XG5cbiAgZXJyb3JDb2RlID0gJzEwMDAnO1xuICBkaXNwbGF5SW5mbzogYW55ID0gJ3NjYW5kb2MuaW5mby5wb3NpdGlvbic7XG5cbiAgdmVyaWZpY2F0aW9uRXJyb3JTZW50ID0gZmFsc2U7XG4gIGVycm9yID0gZmFsc2U7XG4gIGNhbWVyYVJlYWR5ID0gZmFsc2U7XG4gIHJlc3VsdDogYW55O1xuICBzY2FuaW5nID0gZmFsc2U7XG5cbiAgcHJvbXB0TWFudWFsID0gZmFsc2U7XG5cbiAgZnJvbnRJbWFnZTogYW55O1xuICBiYWNrSW1hZ2U6IGFueTtcblxuICBpbWFnZUhhbmRsZXIgPSBuZXcgU3ViamVjdCgpO1xuICBtYW51YWxEYXRhU2V0ID0gZmFsc2U7XG4gIGxvZ0RhdGE6IFRyb3VibGVzaG9vdGluZyA9IHtcbiAgICBBY2NlcHRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsXG4gICAgUmVxdWVzdDogbnVsbCxcbiAgICBSZXNwb25zZTogbnVsbCxcbiAgICBFeHBlY3RlZE91dHB1dDogbnVsbCxcbiAgfTtcblxuICBzY2FuRGF0YXM6IGFueSA9IFtdO1xuICBzY2FuU2lkZTogYW55O1xuICBpZFNjYW46IGFueSA9IG51bGw7XG4gIHdlYmNhbUltYWdlPzogV2ViY2FtSW1hZ2U7XG4gIG1vZGVsOiBhbnk7XG4gIHZhbGlkYXRpb24gPSBmYWxzZTtcbiAgc2Nhbm5lZEltYWdlczogYW55W10gPSBbXTtcbiAgc2NhbkRlbGF5OiBhbnkgPSAwO1xuICBwdWJsaWMgdHJpZ2dlcjogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICAvLyBzd2l0Y2ggdG8gbmV4dCAvIHByZXZpb3VzIC8gc3BlY2lmaWMgd2ViY2FtOyB0cnVlL2ZhbHNlOiBmb3J3YXJkL2JhY2t3YXJkcywgc3RyaW5nOiBkZXZpY2VJZFxuICBwdWJsaWMgbmV4dFdlYmNhbTogU3ViamVjdDxib29sZWFuIHwgc3RyaW5nPiA9IG5ldyBTdWJqZWN0PFxuICAgIGJvb2xlYW4gfCBzdHJpbmdcbiAgPigpO1xuICBpbWFnZVZlcmlmaWVkID0gZmFsc2U7XG4gIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgbWFudWFsID0gZmFsc2U7XG4gIGlzTW9iaWxlID0gdGhpcy5wbGF0Zm9ybS5JT1MgfHwgdGhpcy5wbGF0Zm9ybS5BTkRST0lEO1xuICBASW5wdXQoKSBzaG93RGlhbG9nID0gZmFsc2U7XG4gIHNjYW5JbWFnZVRpbWVzdGFtcHM6IFRpbWVzdGFtcHMgPSB7XG4gICAgdGltZTogMCxcbiAgICBsb2FkOiAwLFxuICB9O1xuICBudW1iZXJPZlZhbGlkYXRpb25zID0gMDtcbiAgdmFsaWRhdGlvbkRlYnVnOiBhbnkgPSBbXTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1vYmlsZScpIGdldCBjbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICBvblJlc2l6ZSgpIHtcbiAgICBpZiAodGhpcy5yZXN1bHQpIHtcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHNjYW5Qcm92aWRlciE6IFNjYW5Qcm92aWRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxuICAgIHB1YmxpYyBjYW1lcmFQcm92aWRlcjogTmd4U2NhbmRvY0NhbWVyYVByb3ZpZGVyLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgbGF5b3V0UHJvdmlkZXI6IExheW91dFByb3ZpZGVyLFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgZGV2aWNlU2VydmljZTogRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aDogTmd4U2NhbmRvY0F1dGhQcm92aWRlciAvLyBwcml2YXRlIGFwaTogU2VydmVyUHJvdmlkZXJcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNjYW5Qcm92aWRlciA9IHRoaXMuaW5qZWN0b3IuZ2V0KFNjYW5Qcm92aWRlcik7XG5cbiAgICBpZiAoIXRoaXMuc2NhblByb3ZpZGVyLmNvbmZpZy5kZXZlbG9wbWVudCkge1xuICAgICAgLy8gY29uc29sZSA9IHtcbiAgICAgIC8vICAgbG9nOiAoLi4uYXJnczogYW55KSA9PiB7fSxcbiAgICAgIC8vICAgdGltZTogKC4uLmFyZ3M6IGFueSkgPT4ge30sXG4gICAgICAvLyAgIHRpbWVFbmQ6ICguLi5hcmdzOiBhbnkpID0+IHt9LFxuICAgICAgLy8gICB3YXJuOiAoLi4uYXJnczogYW55KSA9PiB7fSxcbiAgICAgIC8vICAgZXJyb3I6ICguLi5hcmdzOiBhbnkpID0+IHt9LFxuICAgICAgLy8gfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0TG9nRGF0YSgpIHtcbiAgICB0aGlzLmxvZ0RhdGEgPSB7XG4gICAgICBSZXF1ZXN0OiBudWxsLFxuICAgICAgUmVzcG9uc2U6IG51bGwsXG4gICAgICBFeHBlY3RlZE91dHB1dDogbnVsbCxcbiAgICAgIEFjY2VwdFRlcm1zQW5kQ29uZGl0aW9uczogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLmF1dGguYWNjZXNUb2tlbi5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnJlc2V0TG9nRGF0YSgpO1xuICAgIC8vIHRoaXMucmVzdWx0PXRydWU7XG4gICAgLy8gdGhpcy5yZXN1bHQgPXt9O1xuXG4gICAgY29uc29sZS5sb2coJ0lOSVQgU0NBTicpO1xuICB9XG5cbiAgY29udGludWUoKSB7XG4gICAgdGhpcy5kb2N1bWVudFR5cGVTZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2lkZS5pbWFnZSA9IHRoaXMud2ViY2FtSW1hZ2U7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFNpZGUuc2lkZSA9PT0gJ0ZST05UJykge1xuICAgICAgICB0aGlzLnNjYW5CbGFzdERhdGFbMV0uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0sIDIwMCk7XG4gIH1cblxuICBzY2FuKCkge1xuICAgIHRoaXMudHJpZ2dlci5uZXh0KG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVJbWFnZSh3ZWJjYW1JbWFnZTogV2ViY2FtSW1hZ2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGFydFRpbWUgPT09IDApIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ1tyZWNlaXZlZCB3ZWJjYW0gaW1hZ2VdJywgd2ViY2FtSW1hZ2UpO1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgICAgIGlmICh0aGlzLnNjYW5JbWFnZVRpbWVzdGFtcHMubG9hZCA+IDApIHtcbiAgICAgICAgY29uc3QgeyBsb2FkIH0gPSB0aGlzLnNjYW5JbWFnZVRpbWVzdGFtcHM7XG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aW1lIC0gbG9hZDtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZygndGltZTonLCBkaWZmKTtcbiAgICAgICAgdGhpcy5zY2FuRGVsYXkgPSBkaWZmO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNjYW5JbWFnZVRpbWVzdGFtcHMubG9hZCA9IHRpbWU7XG5cbiAgICAgIGlmICh3ZWJjYW1JbWFnZS5pbWFnZUFzRGF0YVVybCkge1xuICAgICAgICB0aGlzLnNjYW5uZWRJbWFnZXMucHVzaCh3ZWJjYW1JbWFnZSk7XG4gICAgICAgIHRoaXMuaGFuZGxlTG9uZ1ZhbGlkYXRpb25FcnJvcih3ZWJjYW1JbWFnZSwgJ3dvcmtlcicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIGlmICh0aGlzLnNjYW5uZWRJbWFnZXMubGVuZ3RoID4gMCAmJiAhdGhpcy52YWxpZGF0aW9uKSB7XG4gICAgICAgIC8vIGlmICh0aGlzLnNjYW5Qcm92aWRlci5jb25maWcuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgLy8gICB0aGlzLnNjYW5uZWRJbWFnZXMuZm9yRWFjaCgoaW1nKSA9PiB7XG4gICAgICAgIC8vICAgICBjb25zdCBjb25zb2xlQmFja2dyb3VuZCA9XG4gICAgICAgIC8vICAgICAgIFwiZm9udC1zaXplOjEwMHB4O2JhY2tncm91bmQtaW1hZ2U6IHVybCgnXCIgK1xuICAgICAgICAvLyAgICAgICBpbWcuaW1hZ2VSZXNpemVkICtcbiAgICAgICAgLy8gICAgICAgXCInKTtiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47IGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XCI7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnJWMgICAgJywgY29uc29sZUJhY2tncm91bmQpO1xuICAgICAgICAvLyAgIH0pO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgdGhpcy5mcm9udEltYWdlID0gd2ViY2FtSW1hZ2UuaW1hZ2VSZXNpemVkO1xuXG4gICAgICAgIC8vIGNvbnNvbGUudGltZUVuZCgnc2NhbicpO1xuICAgICAgICAvLyBjb25zb2xlLnRpbWUoJ3NjYW4nKTtcbiAgICAgICAgLy8gZ2V0IGxhc3QgMTBcbiAgICAgICAvLyBjb25zb2xlLmxvZygnQ0FQVFVSRUQ6JywgdGhpcy5zY2FubmVkSW1hZ2VzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGltYWdlcyA9IHRoaXMuc2Nhbm5lZEltYWdlcy5zbGljZSgtNSk7XG4gICAgICAgIC8vIHNldCBpbWFnZXMgdG8gMFxuICAgICAgICB0aGlzLnNjYW5uZWRJbWFnZXMgPSBbXTtcbiAgICAgICAgY29uc3QgaW1hZ2VzQXJyYXkgPSBpbWFnZXMubWFwKChtKSA9PiBtLmltYWdlUmVzaXplZC5zcGxpdCgnLCcpWzFdKTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmhhbmRsZUJ1cnN0RGF0YShpbWFnZXNBcnJheSwgaW1hZ2VzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmNhbWVyYVJlYWR5KSB7XG4gICAgICAgICAgdGhpcy5zY2FuKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQnVyc3REYXRhKFxuICAgIGltYWdlc0FycmF5OiBhbnksXG4gICAgaW1hZ2VzOiBhbnksXG4gICAgdHlwZTogJ3dvcmtlcicgfCAncGxhaW4nID0gJ3BsYWluJ1xuICApIHtcbiAgICB0aGlzLl9fc3Vicyh0aGlzLnNjYW5Qcm92aWRlci5idXJzdChpbWFnZXNBcnJheSkpLnN1YnNjcmliZSgocmVzcDogYW55KSA9PiB7XG4gICAgICB0aGlzLmRpc3BsYXlJbmZvID0gJ3NjYW5kb2MuaW5mby5jJyArIHJlc3AuSW5mb0NvZGU7XG4gICAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ3ZhbGlkYXRpb25QT1NUJyk7XG4gICAgIC8vIGNvbnNvbGUubG9nKCdBbmFseXNpc1RpbWUnLCByZXNwLkFuYWx5c2lzVGltZSk7XG4gICAgICBjb25zdCB7IERvY1R5cGUsIFNlcmllcywgU2lkZSwgSW5mb0NvZGUgfSA9IHJlc3A7XG5cbiAgICAgIC8vIGlmIChJbmZvQ29kZSA9PT0gJzEwMDYnICYmIHRoaXMuaWRTY2FuKSB7XG4gICAgICAvLyAgIHRoaXMuaGFuZGxlTG9uZ1ZhbGlkYXRpb25FcnJvcihpbWFnZSk7XG4gICAgICAvLyB9XG4gICAgLy8gIGNvbnNvbGUud2FybihyZXNwLlZhbGlkYXRlZCwgdGhpcy5udW1iZXJPZlZhbGlkYXRpb25zKTtcblxuICAgICAgaWYgKHJlc3AuVmFsaWRhdGVkKSB7XG4gICAgICAgIHRoaXMubnVtYmVyT2ZWYWxpZGF0aW9ucysrO1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25EZWJ1Zy5wdXNoKHJlc3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5udW1iZXJPZlZhbGlkYXRpb25zID0gMDtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRGVidWc9W107XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5udW1iZXJPZlZhbGlkYXRpb25zID49IDMpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5SW5mbyA9ICcnO1xuICAgICAgIC8vIGNvbnNvbGUubG9nKCdbU0NBTk5FRCBJTkRFWF0nLCByZXNwLkluZGV4KTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbWFnZSA9IGltYWdlc1tyZXNwLkluZGV4XTtcblxuICAgICAgICAvLyB0aGlzLnByZXZpZXcgPSB0aGlzLndlYmNhbUltYWdlLmltYWdlQXNEYXRhVXJsO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICBsZXQgaW1hZ2UgPSBzZWxlY3RlZEltYWdlO1xuICAgICAgICBjb25zb2xlLndhcm4odHlwZSk7XG4gICAgICAgIGlmICh0eXBlID09ICd3b3JrZXInKSB7XG4gICAgICAgICAgLy9jb25zdCBkYXRhVXJsID0gdGhpcy5oYW5kbGVCaXRtYXBJbWFnZShzZWxlY3RlZEltYWdlLmJpdG1hcCk7XG4gICAgICAgICAgaW1hZ2UgPSBzZWxlY3RlZEltYWdlLmltYWdlQXNEYXRhVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEluZm9Db2RlID09PSAnMTAwNycpIHtcbiAgICAgICAgICAvLyBGb3IgSUQgYXNrIGZvciBvdGhlciBzaWRlXG4gICAgICAgICAgaWYgKFNpZGUgPT09ICdGUk9OVCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2NhbkJsYXN0RGF0YVswXS5pbWFnZSA9IGltYWdlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNjYW5CbGFzdERhdGFbMV0uaW1hZ2UgPSBpbWFnZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zY2FuQmxhc3REYXRhWzBdLmltYWdlICYmIHRoaXMuc2NhbkJsYXN0RGF0YVsxXS5pbWFnZSkge1xuICAgICAgICAgLy8gICBjb25zb2xlLndhcm4oJ1VQTE9BRCcpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ3dvcmtlcicpIHtcbiAgICAgICAgICAgICAgdGhpcy5pbWFnZUhhbmRsZXIubmV4dCh7IHR5cGU6ICdzdG9wJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS53YXJuKCdERUJVRycsIFNpZGUsIHRoaXMudmFsaWRhdGlvbkRlYnVnKTtcbiAgICAgICAgICAgIHRoaXMuc2NhbkJsYXN0RmluaXNoKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubnVtYmVyT2ZWYWxpZGF0aW9ucyA9IDA7XG4gICAgICAgICAgIC8vIGNvbnNvbGUud2FybignREVCVUcnLFNpZGUsdGhpcy52YWxpZGF0aW9uRGVidWcpXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25EZWJ1ZyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbnVtID0gU2lkZSA9PT0gJ0ZST05UJyA/IDEgOiAwO1xuICAgICAgICAgICAgdGhpcy5zY2FuU2Vjb25kU2lkZSA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuc2luZ2xlU2Nhbih0aGlzLnNjYW5CbGFzdERhdGFbbnVtXSk7XG5cbiAgICAgICAgICAgIHRoaXMuaWRTY2FuID0gdGhpcy5zY2FuQmxhc3REYXRhW251bV0uc2lkZTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dEaWFsb2cpIHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93RGlhbG9nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXNldCBtYW51YWwgc2NhbiBwb3B1cCBpbnRlcnZhbFxuICAgICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25FcnJvclNlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5SW5mbyA9ICdzY2FuZG9jLmluZm8udHVybic7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgLy8gY29uc29sZS53YXJuKCdERUJVRycsIFNpZGUsIHRoaXMudmFsaWRhdGlvbkRlYnVnKTtcbiAgICAgICAgICB0aGlzLnNjYW5CbGFzdERhdGFbMF0uaW1hZ2UgPSBpbWFnZTtcbiAgICAgICAgIC8vIGNvbnNvbGUud2FybignVVBMT0FEJyk7XG4gICAgICAgICAgaWYgKHR5cGUgPT0gJ3dvcmtlcicpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VIYW5kbGVyLm5leHQoeyB0eXBlOiAnc3RvcCcgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2NhbkJsYXN0RmluaXNoKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjYW5uZWRJbWFnZXMgPSBbXTtcblxuICAgICAgICAvLyB0aGlzLnNjYW5CbGFzdERhdGFbMF0uaW1hZ2UgPSBzZWxlY3RlZEltYWdlO1xuXG4gICAgICAgIC8vdGhpcy5zY2FuQmxhc3RGaW5pc2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjYW4oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlRGlhbG9nKCkge1xuICAgIHRoaXMuc2hvd0RpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMudmFsaWRhdGlvbiA9IGZhbHNlO1xuXG4gICAgdGhpcy5zY2FuKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlSW5pdEVycm9yKGVycm9yOiBXZWJjYW1Jbml0RXJyb3IpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gIH1cblxuICBnZXQgc2NhbkJsYXN0Q2FuVXBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLnNjYW5CbGFzdERhdGFbMF0uaW1hZ2UgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG1hbnVhbE1vZGUodHlwZTogJ3dvcmtlcicgfCAncGxhaW4nID0gJ3BsYWluJykge1xuICAgIHRoaXMubWFudWFsID0gdHJ1ZTtcbiAgICB0aGlzLnByb21wdE1hbnVhbCA9IGZhbHNlO1xuICAgIHRoaXMuc2NhbkluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLmNhbWVyYVByb3ZpZGVyLiRzaG93U3dpdGNoLm5leHQoZmFsc2UpO1xuXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUV4dHJhY3Rpb25FcnJvcihkYXRhOiBhbnkpIHtcbiAgICB0aGlzLmxvZ0RhdGEuRXhwZWN0ZWRPdXRwdXQgPSB7fTtcbiAgICAvLyBpZiAodGhpcy5sb2dEYXRhLkV4cGVjdGVkT3V0cHV0Py5fYXZhdGFyKSB7XG4gICAgLy8gICBkZWxldGUgdGhpcy5sb2dEYXRhLkV4cGVjdGVkT3V0cHV0Ll9hdmF0YXI7XG4gICAgLy8gfVxuICAgIC8vIHRoaXMuc2NhblByb3ZpZGVyLnNlbmRMb2codGhpcy5sb2dEYXRhKS5zdWJzY3JpYmUoKTtcblxuICAgLy8gY29uc29sZS5sb2coJ0xPRyBEQVRBJywgdGhpcy5sb2dEYXRhKTtcbiAgICB0aGlzLl9fc3Vicyh0aGlzLnNjYW5Qcm92aWRlci5zZW5kTG9nKHRoaXMubG9nRGF0YSkpLnN1YnNjcmliZSgpO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlTG9uZ1ZhbGlkYXRpb25FcnJvcihcbiAgICBpbWc6IGFueSxcbiAgICB0eXBlOiAnd29ya2VyJyB8ICdwbGFpbicgPSAncGxhaW4nXG4gICkge1xuICAgIC8vIHNhdmUgY3VycmVudCBpbWFnZSBhZnRlciAxMHNlY1xuICAgIGxldCBNQU5VQUxfSU5URVJWQUwgPSB0aGlzLnNjYW5Qcm92aWRlci5jb25maWcubWFudWFsU2NhbkRlbGF5O1xuICAgIGNvbnN0IGRpZmYgPSAoRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lKSAvIDEwMDA7XG5cbiAgICBjb25zdCBzaG93RGlhbG9nID0gZGlmZiA+IE1BTlVBTF9JTlRFUlZBTDtcblxuICAgIGlmIChzaG93RGlhbG9nICYmICF0aGlzLnZlcmlmaWNhdGlvbkVycm9yU2VudCkge1xuICAgICAgdGhpcy52ZXJpZmljYXRpb25FcnJvclNlbnQgPSB0cnVlO1xuICAgICAgY29uc29sZS53YXJuKCdbSEFORExFIEVSUk9SXScpO1xuXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgLy8gaWYgKCF0aGlzLnNjYW5TZWNvbmRTaWRlKSB7XG4gICAgICAgIGlmICh0aGlzLnNjYW5Qcm92aWRlci5jb25maWcubWFudWFsTW9kZUVuYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnByb21wdE1hbnVhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICB9KTtcbiAgICAgIC8vIHRoaXMudmVyaWZpY2F0aW9uRXJyb3JTZW50ID0gdHJ1ZTtcbiAgICAgIC8vIGNvbnN0IGRhdGFVcmwgPSB0aGlzLmhhbmRsZUJpdG1hcEltYWdlKGltZy5iaXRtYXApO1xuXG4gICAgICAvLyBjb25zb2xlLndhcm4oJ1NFTlQnKTtcbiAgICAgIC8vIC8vICB0aGlzLmRpc3BsYXlJbmZvID0gJ0NhbnQgZGV0ZWN0IGRvY3VtZW50ISc7XG4gICAgICAvLyB0aGlzLmxvZ0RhdGEuUmVxdWVzdCA9IHRoaXMuX19zdWJzKFxuICAgICAgLy8gICB0aGlzLnNjYW5Qcm92aWRlci5zZW5kTG9nKHtcbiAgICAgIC8vICAgICBBY2NlcHRUZXJtc0FuZENvbmRpdGlvbnM6IHRydWUsXG4gICAgICAvLyAgICAgRXhwZWN0ZWRPdXRwdXQ6IHt9LFxuICAgICAgLy8gICAgIFJlcXVlc3Q6IHtcbiAgICAgIC8vICAgICAgIHZlcmlmaWNhdGlvbjogZGF0YVVybC5zcGxpdCgnLCcpWzFdLFxuICAgICAgLy8gICAgIH0sXG4gICAgICAvLyAgICAgUmVzcG9uc2U6IHtcbiAgICAgIC8vICAgICAgIFRyYW5zYWN0aW9uSUQ6IHV1aWR2NCgpLFxuICAgICAgLy8gICAgIH0sXG4gICAgICAvLyAgIH0pXG4gICAgICAvLyApLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gIHRoaXMucmVzdWx0ID0gdHJ1ZTtcblxuICAgIHRoaXMuY2FtZXJhUHJvdmlkZXIuJHNob3dTd2l0Y2gubmV4dCh0cnVlKTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcblxuICAgIC8vIHRoaXMuc2NhblJlc3VsdHMubmV4dCh7IHR5cGU6ICdtb2RlbCcsIGRhdGE6IHt9IH0pO1xuXG4gICAgdGhpcy5fX3N1YnModGhpcy5jYW1lcmFQcm92aWRlci53ZWJjYW1PYnNlcnZhYmxlKS5zdWJzY3JpYmUoKHJlc3ApID0+IHtcbiAgICAgIHRoaXMuY2FtZXJhUmVhZHkgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NhbkluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2Nhbm5lZEltYWdlcyA9IFtdO1xuICAgIH0pO1xuICAgIHRoaXMuX19zdWJzKHRoaXMuY2FtZXJhUHJvdmlkZXIuc2VsZmllJCkuc3Vic2NyaWJlKChyZXNwKSA9PiB7XG4gICAgICB0aGlzLnNlbGZpZSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hdXRvU2NhbigpO1xuXG4gICAgdGhpcy5fX3N1YnModGhpcy5sYXlvdXRQcm92aWRlci5icmVha3BvaW50JCkuc3Vic2NyaWJlKCh2OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuaXNNb2JpbGUgPSAhdi5tYXRjaGVzIHx8IHRoaXMucGxhdGZvcm0uSU9TIHx8IHRoaXMucGxhdGZvcm0uQU5EUk9JRDtcbiAgICAgIGNvbnNvbGUubG9nKCdNTk9CSUxFJywgdGhpcy5pc01vYmlsZSk7XG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLmltYWdlSGFuZGxlclN1YnNjcmlwdGlvbiA9IHRoaXMuaW1hZ2VIYW5kbGVyLnN1YnNjcmliZShcbiAgICAvLyAgICh3ZWJjYW1JbWFnZTogYW55KSA9PiB7XG4gICAgLy8gICAgIC8vIHJldHVybjtcbiAgICAvLyAgICAgaWYgKHRoaXMuc3RhcnRUaW1lID09PSAwKSB7XG4gICAgLy8gICAgICAgdGhpcy5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAvLyAgICAgICBpZiAod2ViY2FtSW1hZ2UuYmFzZTY0KSB7XG4gICAgLy8gICAgICAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgICAvLyAgICAgICAgIGlmICh0aGlzLnNjYW5JbWFnZVRpbWVzdGFtcHMubG9hZCA+IDApIHtcbiAgICAvLyAgICAgICAgICAgY29uc3QgeyBsb2FkIH0gPSB0aGlzLnNjYW5JbWFnZVRpbWVzdGFtcHM7XG4gICAgLy8gICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aW1lIC0gbG9hZDtcbiAgICAvLyAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCdUSU1FJywgZGlmZik7XG4gICAgLy8gICAgICAgICAgIHRoaXMuc2NhbkRlbGF5ID0gZGlmZjtcbiAgICAvLyAgICAgICAgIH1cblxuICAgIC8vICAgICAgICAgdGhpcy5zY2FuSW1hZ2VUaW1lc3RhbXBzLmxvYWQgPSB0aW1lO1xuXG4gICAgLy8gICAgICAgICB0aGlzLnNjYW5uZWRJbWFnZXMucHVzaCh3ZWJjYW1JbWFnZSk7XG4gICAgLy8gICAgICAgICB0aGlzLmhhbmRsZUxvbmdWYWxpZGF0aW9uRXJyb3Iod2ViY2FtSW1hZ2UsICd3b3JrZXInKTtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICAvLyB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAvLyAgICAgICBpZiAodGhpcy5zY2FubmVkSW1hZ2VzLmxlbmd0aCA+IDQgJiYgIXRoaXMudmFsaWRhdGlvbikge1xuICAgIC8vICAgICAgICAgLy8gZ2V0IGxhc3QgMTBcbiAgICAvLyAgICAgICAgIGNvbnNvbGUudGltZUVuZCgndmFsaWRhdGlvblRPVEFMX1VJJyk7XG4gICAgLy8gICAgICAgICBjb25zb2xlLnRpbWUoJ3ZhbGlkYXRpb25UT1RBTF9VSScpO1xuICAgIC8vICAgICAgICAgY29uc3QgaW1hZ2VzID0gdGhpcy5zY2FubmVkSW1hZ2VzLnNsaWNlKC01KTtcbiAgICAvLyAgICAgICAgIC8vIHNldCBpbWFnZXMgdG8gMFxuICAgIC8vICAgICAgICAgdGhpcy5zY2FubmVkSW1hZ2VzID0gW107XG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhpbWFnZXMpO1xuXG4gICAgLy8gICAgICAgICBjb25zdCBpbWFnZXNBcnJheSA9IGltYWdlcy5tYXAoKG0pID0+IG0uYmFzZTY0LnNwbGl0KCcsJylbMV0pO1xuICAgIC8vICAgICAgICAgdGhpcy52YWxpZGF0aW9uID0gdHJ1ZTtcblxuICAgIC8vICAgICAgICAgLy8gdGhpcy5oYW5kbGVCdXJzdERhdGEoaW1hZ2VzQXJyYXksIGltYWdlcywgJ3dvcmtlcicpO1xuXG4gICAgLy8gICAgICAgICBjb25zb2xlLnRpbWUoJ3ZhbGlkYXRpb25QT1NUJyk7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIC8vICAgICB9KTtcbiAgICAvLyAgIH1cbiAgICAvLyApO1xuICB9XG5cbiAgaGFuZGxlQml0bWFwSW1hZ2UoYml0bWFwOiBhbnkpIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGJpdG1hcDtcblxuICAgIGNvbnN0IG9mZnNjcmVlblNtYWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgb2Zmc2NyZWVuU21hbGwud2lkdGggPSB3aWR0aDtcbiAgICBvZmZzY3JlZW5TbWFsbC5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgY3R4OiBhbnkgPSBvZmZzY3JlZW5TbWFsbC5nZXRDb250ZXh0KCdiaXRtYXByZW5kZXJlcicpO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgY3R4LnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKGJpdG1hcCk7XG4gICAgICBiaXRtYXAuY2xvc2UoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBjdHguY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXV0b1NjYW4oKSB7XG4gICAgY29uc3Qgc2lkZSA9IHRoaXMuc2NhbkJsYXN0RGF0YVswXTtcbiAgICB0aGlzLmlkU2NhbiA9IG51bGw7XG4gICAgdGhpcy5zaW5nbGVTY2FuKHNpZGUpO1xuICB9XG5cbiAgc2luZ2xlU2NhbihzaWRlOiBhbnkpIHtcbiAgICB0aGlzLnNjYW5UeXBlID0gc2lkZS5zaWRlO1xuICAgIHRoaXMucHJldmlldyA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZFNpZGUgPSBzaWRlO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNpZGUuaW1hZ2UgPSBudWxsO1xuICAgIHRoaXMuZG9jdW1lbnRUeXBlU2VsZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuc2NhbkJsYXN0RGF0YVsxXS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbWFudWFsU2NhbkRhdGEoZGF0YTogYW55KSB7XG4gICAgY29uc29sZS5sb2coZGF0YSk7XG4gICAgdGhpcy5zY2FuQmxhc3REYXRhID0gZGF0YTtcbiAgICB0aGlzLm1hbnVhbCA9IGZhbHNlO1xuICAgIHRoaXMubWFudWFsRGF0YVNldCA9IHRydWU7XG4gICAgdGhpcy5zY2FuQmxhc3RGaW5pc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW1nQmFzZTY0KG51bTogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ0dFVCA2NCcpO1xuXG4gICAvLyBpZiAodGhpcy5tYW51YWxEYXRhU2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2FuQmxhc3REYXRhW251bV0uaW1hZ2UuX2ltYWdlQXNEYXRhVXJsLnNwbGl0KCcsJylbMV07XG4gICAvLyB9XG4gICAvLyByZXR1cm4gdGhpcy5zY2FuQmxhc3REYXRhW251bV0uaW1hZ2UuZGF0YVVybC5zcGxpdCgnLCcpWzFdO1xuICB9XG4gIHNjYW5CbGFzdEZpbmlzaCgpIHtcbiAgICBjb25zdCB7IGJyb3dzZXIsIG9zLCBkZXZpY2UgfSA9IHRoaXMuZGV2aWNlU2VydmljZTtcblxuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5jYW1lcmFQcm92aWRlci4kc2hvd1N3aXRjaC5uZXh0KGZhbHNlKTtcbiAgICB9KTtcbiAgICBjb25zb2xlLnRpbWUoJ3VwbG9hZCcpO1xuICAgIGlmICh0aGlzLnR5cGUgPT09ICdtb2JpbGUnKSB7XG4gICAgICB0aGlzLmFjdGlvbnMuZW1pdCh7IGRhdGE6IHRoaXMuc2NhbkJsYXN0RGF0YSB9KTtcbiAgICAgIHRoaXMucmV0YWtlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaWRTY2FuID0gbnVsbDtcbiAgICAvLyBjb25zdCBsb2FkaW5nID0gdGhpcy5kaWFsb2dzLmxvYWRpbmcoKTtcbiAgICB0aGlzLnNjYW5pbmcgPSB0cnVlO1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGNvbnNvbGUudGltZSgncGF5bG9hZCcpO1xuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgIEFjY2VwdFRlcm1zQW5kQ29uZGl0aW9uczogdHJ1ZSxcbiAgICAgIERhdGFGaWVsZHM6IHtcbiAgICAgICAgRGV2aWNlSW5mbzoge1xuICAgICAgICAgIE9TOiBvcyxcbiAgICAgICAgICBEZXZpY2U6IGRldmljZSxcbiAgICAgICAgICBCcm93c2VyOiBicm93c2VyLFxuICAgICAgICB9LFxuICAgICAgICBGcm9udEltYWdlVHlwZTogJ2Jhc2U2NCcsXG4gICAgICAgIEZyb250SW1hZ2VDcm9wcGVkOiBmYWxzZSxcbiAgICAgICAgQmFja0ltYWdlVHlwZTogJ2Jhc2U2NCcsXG4gICAgICAgIEJhY2tJbWFnZUNyb3BwZWQ6IGZhbHNlLFxuICAgICAgICBGcm9udEltYWdlOiB0aGlzLmdldEltZ0Jhc2U2NCgwKSxcbiAgICAgICAgQmFja0ltYWdlOiB0aGlzLnNjYW5CbGFzdERhdGFbMV0uaW1hZ2UgPyB0aGlzLmdldEltZ0Jhc2U2NCgxKSA6IG51bGwsXG4gICAgICB9LFxuICAgICAgU2V0dGluZ3M6IHtcbiAgICAgICAgU2hvdWxkVmFsaWRhdGU6IHRydWUsXG4gICAgICAgIFNob3VsZFJldHVybkRvY3VtZW50SW1hZ2U6IHRydWUsXG4gICAgICAgIFNob3VsZFJldHVybkZhY2VJZkRldGVjdGVkOiB0cnVlLFxuICAgICAgICBTa2lwSW1hZ2VTaXplQ2hlY2s6IHRydWUsXG4gICAgICAgIENhblN0b3JlSW1hZ2VzOiB0aGlzLnNjYW5Qcm92aWRlci5jYW5TdG9yZUltYWdlcyxcbiAgICAgIH0sXG4gICAgICAvLyBDYWxsQmFja1VybDogJ2h0dHA6Ly9kZW1vOjUwMDAvcmVwb3J0L2V4dHJhY3RlZC8nLFxuICAgIH07XG4gICAgdGhpcy5mcm9udEltYWdlID0gJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJyArIHBheWxvYWQuRGF0YUZpZWxkcy5Gcm9udEltYWdlO1xuICAgIHRoaXMuYmFja0ltYWdlID0gJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJyArIHBheWxvYWQuRGF0YUZpZWxkcy5CYWNrSW1hZ2U7XG4gICAgaWYgKCF0aGlzLnNjYW5CbGFzdERhdGFbMV0uaW1hZ2UpIHtcbiAgICAgIHBheWxvYWQuU2V0dGluZ3MuSWdub3JlQmFja0ltYWdlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5sb2dEYXRhLlJlcXVlc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcblxuICAgIGNvbnNvbGUudGltZUVuZCgncGF5bG9hZCcpO1xuICAgIHRoaXMuX19zdWJzKFxuICAgICAgdGhpcy5zY2FuUHJvdmlkZXIuYmxhc3RQb3N0KHBheWxvYWQpLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGU6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm1hbnVhbERhdGFTZXQpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignTUFOVUFMIERBVEEgU0VUJyxlKTtcbiAgICAgICAgICAgIHRoaXMubG9nRGF0YS5SZXNwb25zZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZS5lcnJvcikpO1xuXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUV4dHJhY3Rpb25FcnJvcih7fSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucHJldmlldyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnRUVFJywgZSk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKS5zdWJzY3JpYmUoXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coZGF0YSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBkYXRhLkRhdGE7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgndXBsb2FkJyk7XG4gICAgICAgIGNvbnNvbGUudGltZSgncGFyc2UnKTtcbiAgICAgICAgLy8gZGF0YS5JbmZvQ29kZSA9ICcxMDAxJztcbiAgICAgICAgY29uc29sZS50aW1lKCdwJyk7XG4gICAgICAgIHRoaXMubG9nRGF0YS5SZXNwb25zZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3AnKTtcbiAgICAgICAgLy9sb2FkaW5nLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNjYW5pbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAoZGF0YS5JbmZvQ29kZSA9PT0gJzEwMDEnKSB7XG4gICAgICAgICAgdGhpcy5lcnJvciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tFUlJPUl0gMTAwMScpO1xuICAgICAgICAgIHRoaXMuZXJyb3JDb2RlID0gJzEwMDEnO1xuICAgICAgICAgIC8vIHRoaXMuc2NhblNpZGUgPSAwO1xuXG4gICAgICAgICAgdGhpcy5wcmV2aWV3ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuSW5mb0NvZGUgPT09ICcxMDAyJykge1xuICAgICAgICAgIHRoaXMuZXJyb3IgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbRVJST1JdIDEwMDInKTtcbiAgICAgICAgICB0aGlzLmVycm9yQ29kZSA9ICcxMDAyJztcbiAgICAgICAgICAvLyB0aGlzLnNjYW5TaWRlID0gMDtcblxuICAgICAgICAgIHRoaXMucHJldmlldyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHRzICYmIGRhdGEuTWV0YWRhdGEubGVuZ3RoID4gMCAmJiBkYXRhLkluZm9Db2RlID09PSAnMTAwMCcpIHtcbiAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdFeHRyYWN0aW9uIHRpbWUnLCBkYXRhLkFuYWx5c2lzVGltZSk7XG5cbiAgICAgICAgICAvLyAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG5cbiAgICAgICAgIC8vIGNvbnNvbGUudGltZSgncGFyc2VibGFzdCcpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2NhblByb3ZpZGVyLnBhcnNlQmxhc3QocmVzdWx0cyk7XG4gICAgICAgICAvLyBjb25zb2xlLnRpbWVFbmQoJ3BhcnNlYmxhc3QnKTtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnUkVTJywgdGhpcy5yZXN1bHQpO1xuICAgICAgICAgIC8vIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgY29uc3QgbW9kZWwgPSByZXN1bHQubW9kZWw7XG5cbiAgICAgICAgICBpZiAoZGF0YS5JbWFnZURhdGE/LkZhY2VJbWFnZSkge1xuICAgICAgICAgICAgbW9kZWwuX2F2YXRhciA9XG4gICAgICAgICAgICAgICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyBkYXRhLkltYWdlRGF0YT8uRmFjZUltYWdlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhLkltYWdlRGF0YT8uRG9jdW1lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCB7IERvY3VtZW50cyB9ID0gZGF0YS5JbWFnZURhdGE7XG4gICAgICAgICAgICBtb2RlbC5pbWFnZXMgPSBEb2N1bWVudHMubWFwKChpbWFnZTogYW55LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJyArIERvY3VtZW50c1tpXSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnTU9ERUwnLCB0aGlzLm1vZGVsKTtcbiAgICAgICAgICB0aGlzLmFjdGlvbnMuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiAnc2NhbkZpbmlzaCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgICBpbWFnZXM6IHRoaXMuaW1hZ2VzLFxuICAgICAgICAgICAgICByZXN1bHRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghdGhpcy5zY2FuUHJvdmlkZXIuY29uZmlnLmhpZGVSZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgIC8vIGNvbnNvbGUudGltZSgnZmYnKTtcbiAgICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgICAgdGhpcy5zY2FuUmVzdWx0cy5uZXh0KHsgdHlwZTogJ21vZGVsJywgZGF0YTogbW9kZWwgfSk7XG4gICAgICAgICAgICAgIC8vIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAvLyAgfSk7XG4gICAgICAgICAgICAgLy8gY29uc29sZS50aW1lRW5kKCdmZicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUicpO1xuICAgICAgICAgIGlmICh0aGlzLm1hbnVhbERhdGFTZXQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXh0cmFjdGlvbkVycm9yKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB0aGlzLnNjYW5TaWRlID0gMDtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+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+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlcnJvclwiPlxuICAgICAgICA8bmd4LXNjYW5kb2Mtd2ViY2FtXG4gICAgICAgICAgKm5nSWY9XCIhcHJldmlldyAmJiAhc2NhbmluZ1wiXG4gICAgICAgICAgY2xhc3M9XCJtYWluXCJcbiAgICAgICAgICAjd2ViY2FtXG4gICAgICAgICAgdHlwZT1cImRvY3VtZW50XCJcbiAgICAgICAgICBbdHJpZ2dlcl09XCJ0cmlnZ2VyXCJcbiAgICAgICAgICBbaW1hZ2VIYW5kbGVyXT1cImltYWdlSGFuZGxlclwiXG4gICAgICAgICAgKGltYWdlQ2FwdHVyZSk9XCJoYW5kbGVJbWFnZSgkZXZlbnQpXCJcbiAgICAgICAgICAoaW5pdEVycm9yKT1cImhhbmRsZUluaXRFcnJvcigkZXZlbnQpXCJcbiAgICAgICAgICAoZGVzdHJveWVkKT1cImNhbWVyYU9mZigkZXZlbnQpXCJcbiAgICAgICAgICAodmlkZW9SZWFkeSk9XCJ2aWRlb1JlYWR5KCRldmVudClcIlxuICAgICAgICA+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=