@guajiritos/image-picker 17.1.0 → 17.1.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.
@@ -53,8 +53,8 @@ export class GuajiritosImagePicker {
53
53
  maintainAspectRatio = new UntypedFormControl({ value: true, disabled: false });
54
54
  quality = new UntypedFormControl({ value: 70, disabled: false });
55
55
  format = new UntypedFormControl({ value: 'webp', disabled: false });
56
- maxHeight = signal(2000);
57
- maxWidth = signal(2000);
56
+ maxHeight = 2000;
57
+ maxWidth = 2000;
58
58
  cropHeight = new UntypedFormControl({ value: 150, disabled: false });
59
59
  cropWidth = new UntypedFormControl({ value: 150, disabled: false });
60
60
  imageName = signal('download');
@@ -103,8 +103,8 @@ export class GuajiritosImagePicker {
103
103
  this.lastOriginSrc = null;
104
104
  this.$imageOriginal.next(null);
105
105
  this.format.setValue('jpeg');
106
- this.maxHeight.set(2000);
107
- this.maxWidth.set(2000);
106
+ this.maxHeight = 2000;
107
+ this.maxWidth = 2000;
108
108
  this.cropHeight.setValue(150);
109
109
  this.cropWidth.setValue(150);
110
110
  this.maintainAspectRatio.setValue(true);
@@ -138,8 +138,8 @@ export class GuajiritosImagePicker {
138
138
  this.arrayCopiedImages = [];
139
139
  this.arrayCopiedImages.push({
140
140
  lastImage: this.imageSrc(),
141
- width: this.maxWidth(),
142
- height: this.maxHeight(),
141
+ width: this.maxWidth,
142
+ height: this.maxHeight,
143
143
  quality: this.quality.value,
144
144
  });
145
145
  this.$imageOriginal.next(this.imageSrc());
@@ -282,13 +282,13 @@ export class GuajiritosImagePicker {
282
282
  }
283
283
  async onChangeQuality() {
284
284
  const qualityItem = this.quality.value / 100;
285
- this.maxHeight.set(this.maxHeight() ?? 2000);
286
- this.maxWidth.set(this.maxWidth() ?? 2000);
285
+ this.maxHeight = this.maxHeight ?? 2000;
286
+ this.maxWidth = this.maxWidth ?? 2000;
287
287
  await this.wait(250);
288
288
  try {
289
289
  const input = {
290
- height: this.maxHeight(),
291
- width: this.maxWidth(),
290
+ height: this.maxHeight,
291
+ width: this.maxWidth,
292
292
  dataType: this.format.value,
293
293
  quality: qualityItem,
294
294
  maintainRatio: this.maintainAspectRatio.value,
@@ -303,13 +303,13 @@ export class GuajiritosImagePicker {
303
303
  }
304
304
  async onChangeFormat() {
305
305
  let qualityItem = this.quality.value / 100;
306
- this.maxHeight.set(this.maxHeight() ?? 2000);
307
- this.maxWidth.set(this.maxWidth() ?? 2000);
306
+ this.maxHeight = this.maxHeight ?? 2000;
307
+ this.maxWidth = this.maxWidth ?? 2000;
308
308
  await this.wait(250);
309
309
  try {
310
310
  let input = {
311
- height: this.maxHeight(),
312
- width: this.maxWidth(),
311
+ height: this.maxHeight,
312
+ width: this.maxWidth,
313
313
  dataType: this.format.value,
314
314
  quality: qualityItem,
315
315
  maintainRatio: this.maintainAspectRatio.value,
@@ -324,13 +324,13 @@ export class GuajiritosImagePicker {
324
324
  }
325
325
  async onChangeSize(changeWidth, changeHeight) {
326
326
  let qualityItem = this.quality.value / 100;
327
- this.maxHeight.set(this.maxHeight() ?? 2000);
328
- this.maxWidth.set(this.maxWidth() ?? 2000);
327
+ this.maxHeight = this.maxHeight ?? 2000;
328
+ this.maxWidth = this.maxWidth ?? 2000;
329
329
  await this.wait(500);
330
330
  try {
331
331
  let input = {
332
- height: this.maxHeight(),
333
- width: this.maxWidth(),
332
+ height: this.maxHeight,
333
+ width: this.maxWidth,
334
334
  dataType: this.format.value,
335
335
  quality: qualityItem,
336
336
  maintainRatio: this.maintainAspectRatio.value,
@@ -438,8 +438,8 @@ export class GuajiritosImagePicker {
438
438
  this.imageSrc.set(dataUri);
439
439
  this.showCrop.setValue(false);
440
440
  this.onCropStateChange();
441
- this.maxWidth.set(canvas?.width);
442
- this.maxHeight.set(canvas?.height);
441
+ this.maxWidth = canvas?.width;
442
+ this.maxHeight = canvas?.height;
443
443
  this.lastOriginSrc = this.originImageSrc + '';
444
444
  this.originImageSrc = dataUri;
445
445
  this.$imageChanged.next(this.imageSrc());
@@ -452,8 +452,8 @@ export class GuajiritosImagePicker {
452
452
  if (this.arrayCopiedImages.length) {
453
453
  let lastState = this.arrayCopiedImages.pop();
454
454
  this.imageSrc.set(lastState.lastImage);
455
- this.maxWidth.set(lastState.width);
456
- this.maxHeight.set(lastState.height);
455
+ this.maxWidth = lastState.width;
456
+ this.maxHeight = lastState.height;
457
457
  this.originImageSrc = this.lastOriginSrc + '';
458
458
  this.noEdit.set(false);
459
459
  }
@@ -473,8 +473,8 @@ export class GuajiritosImagePicker {
473
473
  this.$imageOriginal.next(null);
474
474
  this.$imageChanged.next(null);
475
475
  this.format.setValue('jpeg');
476
- this.maxHeight.set(2000);
477
- this.maxWidth.set(2000);
476
+ this.maxHeight = 2000;
477
+ this.maxWidth = 2000;
478
478
  this.cropHeight.setValue(150);
479
479
  this.cropWidth.setValue(150);
480
480
  this.maintainAspectRatio.setValue(true);
@@ -527,4 +527,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImpor
527
527
  }], _config: [{
528
528
  type: Input
529
529
  }] } });
530
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VhY2hvcy1pbWFnZS1waWNrZXIvc3JjL2xpYi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWFjaG9zLWltYWdlLXBpY2tlci9zcmMvbGliL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMz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O1FBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7dUdBaGdCVSxxQkFBcUI7MkZBQXJCLHFCQUFxQiwwY0NsRmxDLDZtUEFpS0EscXdNRDdGSSxPQUFPLDBFQUNQLGdCQUFnQiw0VEFDaEIsYUFBYSxtTEFDYixXQUFXLHNKQUNYLGVBQWUsNmJBQ2YsZUFBZSxrYUFDZixpQkFBaUIsNldBQ2pCLGtCQUFrQiwwU0FDbEIsY0FBYywwV0FDZCxlQUFlLHFyQkFDZixXQUFXLDRvQ0FDWCxtQkFBbUI7OzJGQUdWLHFCQUFxQjtrQkFyQmpDLFNBQVM7K0JBQ0UseUJBQXlCLG1CQUdsQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxPQUFPO3dCQUNQLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLFdBQVc7d0JBQ1gsbUJBQW1CO3FCQUN0Qjs4QkF1Q1UsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFdUMsV0FBVztzQkFBdkQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVqQyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFFTSxXQUFXO3NCQUF2QixLQUFLO2dCQWFPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBbUNPLE9BQU87c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIHNpZ25hbCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgV3JpdGFibGVTaWduYWwsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJlc2l6ZU9ic2VydmVyIH0gZnJvbSAncmVzaXplLW9ic2VydmVyJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlckVudHJ5IH0gZnJvbSAncmVzaXplLW9ic2VydmVyL2xpYi9SZXNpemVPYnNlcnZlckVudHJ5JztcclxuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0U2xpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGVyJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSwgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbmltcG9ydCB7IFBpcGVzTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvcGlwZXMvcGlwZXMubW9kdWxlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VQaWNrZXJDb25mIHtcclxuICB3aWR0aD86IHN0cmluZztcclxuICBoZWlnaHQ/OiBzdHJpbmc7XHJcbiAgYm9yZGVyUmFkaXVzPzogc3RyaW5nO1xyXG4gIGNvbXByZXNzSW5pdGlhbD86IGJvb2xlYW47XHJcbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XHJcbiAgaGlkZURlbGV0ZUJ0bj86IGJvb2xlYW47XHJcbiAgaGlkZURvd25sb2FkQnRuPzogYm9vbGVhbjtcclxuICBoaWRlRWRpdEJ0bj86IGJvb2xlYW47XHJcbiAgaGlkZUFkZEJ0bj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VDb252ZXJ0ZXJJbnB1dCB7XHJcbiAgd2lkdGg/OiBudW1iZXI7XHJcbiAgaGVpZ2h0PzogbnVtYmVyO1xyXG4gIHF1YWxpdHk/OiBudW1iZXI7XHJcbiAgZGF0YVR5cGU/OiBzdHJpbmc7XHJcbiAgbWFpbnRhaW5SYXRpbz86IGJvb2xlYW47XHJcbiAgY2hhbmdlSGVpZ2h0PzogYm9vbGVhbjtcclxuICBjaGFuZ2VXaWR0aD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEltYWdlQWxsb3dlZFR5cGVzID1cclxuICAnaW1hZ2UvKidcclxuICB8ICcud2VicCdcclxuICB8ICcucG5nJ1xyXG4gIHwgJy53ZWJwLCAuanBnLCAuanBlZydcclxuICB8ICcud2VicCwgLnBuZydcclxuICB8ICcuanBnLCAuanBlZydcclxuICB8ICcucG5nLCAuanBnLCAuanBlZydcclxuICB8ICcud2VicCwgLnBuZywgLmpwZywgLmpwZWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdndWFqaXJpdG9zLWltYWdlLXBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdTdHlsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgUGlwZXNNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRTbGlkZXJNb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlXHJcbl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHdWFqaXJpdG9zSW1hZ2VQaWNrZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVBbGwkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuICBwcml2YXRlIG9ic2VydmVyOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgb3JpZ2luSW1hZ2VTcmM6IGFueTtcclxuICBwcml2YXRlIHVybEltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBsYXN0T3JpZ2luU3JjOiBhbnk7XHJcblxyXG4gIHByaXZhdGUgYXJyYXlDb3BpZWRJbWFnZXM6IGFueVtdID0gW107XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSB1dWlkRmlsZVBpY2tlcjogc3RyaW5nID0gRGF0ZS5ub3coKS50b1N0cmluZygyMCk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGFsbEZvcm1hdHM6IHN0cmluZ1tdID0gWyd3ZWJwJywgJ2pwZWcnLCAncG5nJ107XHJcbiAgcHVibGljIGNvbmZpZzogV3JpdGFibGVTaWduYWw8SW1hZ2VQaWNrZXJDb25mPiA9IHNpZ25hbCh7XHJcbiAgICBoZWlnaHQ6ICcyNDBweCcsXHJcbiAgICB3aWR0aDogJzMyMHB4JyxcclxuICAgIGJvcmRlclJhZGl1czogJzE2cHgnLFxyXG4gICAgY29tcHJlc3NJbml0aWFsOiB0cnVlLFxyXG4gICAgbGFuZ3VhZ2U6ICdlcycsXHJcbiAgICBoaWRlRGVsZXRlQnRuOiBmYWxzZSxcclxuICAgIGhpZGVEb3dubG9hZEJ0bjogZmFsc2UsXHJcbiAgICBoaWRlRWRpdEJ0bjogZmFsc2UsXHJcbiAgICBoaWRlQWRkQnRuOiBmYWxzZSxcclxuICB9KTtcclxuICBwdWJsaWMgaW1hZ2VTcmM6IFdyaXRhYmxlU2lnbmFsPHN0cmluZz4gPSBzaWduYWwobnVsbCk7XHJcbiAgcHVibGljIHNob3dDcm9wOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IGZhbHNlLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcbiAgcHVibGljIGxvYWRJbWFnZTogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHB1YmxpYyBub0VkaXQ6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gc2lnbmFsKGZhbHNlKTtcclxuICBwdWJsaWMgc2hvd0VkaXRQYW5lbDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHB1YmxpYyBtYWludGFpbkFzcGVjdFJhdGlvOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHsgdmFsdWU6IHRydWUsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgcXVhbGl0eTogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiA3MCwgZGlzYWJsZWQ6IGZhbHNlIH0pO1xyXG4gIHB1YmxpYyBmb3JtYXQ6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogJ3dlYnAnLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcbiAgcHVibGljIG1heEhlaWdodDogV3JpdGFibGVTaWduYWw8bnVtYmVyPiA9IHNpZ25hbCgyMDAwKTtcclxuICBwdWJsaWMgbWF4V2lkdGg6IFdyaXRhYmxlU2lnbmFsPG51bWJlcj4gPSBzaWduYWwoMjAwMCk7XHJcbiAgcHVibGljIGNyb3BIZWlnaHQ6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogMTUwLCBkaXNhYmxlZDogZmFsc2UgfSk7XHJcbiAgcHVibGljIGNyb3BXaWR0aDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiAxNTAsIGRpc2FibGVkOiBmYWxzZSB9KTtcclxuICBwdWJsaWMgaW1hZ2VOYW1lOiBXcml0YWJsZVNpZ25hbDxzdHJpbmc+ID0gc2lnbmFsKCdkb3dubG9hZCcpO1xyXG4gIHB1YmxpYyBjdXJyZW50TGFuZ3VhZ2U6IFdyaXRhYmxlU2lnbmFsPHN0cmluZz4gPSBzaWduYWwoJ2VzJyk7XHJcblxyXG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgPSAnb3V0bGluZSc7XHJcbiAgQElucHV0KCkgY29sb3I6IFRoZW1lUGFsZXR0ZSA9ICdwcmltYXJ5JztcclxuICBASW5wdXQoKSBpbWFnZXNBbGxvd2VkOiBJbWFnZUFsbG93ZWRUeXBlcyA9ICdpbWFnZS8qJztcclxuXHJcbiAgQFZpZXdDaGlsZCgnaW1hZ2VQaWNrZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgaW1hZ2VQaWNrZXI6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBPdXRwdXQoKSAkaW1hZ2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSAkaW1hZ2VPcmlnaW5hbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgaW1hZ2VSZW1vdmVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIEBJbnB1dCgpIHNldCBiYXNlNjRJbWFnZShpbWFnZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoaW1hZ2UpIHtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoaW1hZ2UpO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucHVzaCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gaW1hZ2U7XHJcbiAgICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IGltYWdlO1xyXG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQodGhpcy5vcmlnaW5JbWFnZVNyYyk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBfaW1hZ2VTcmMoaW1hZ2U6IHN0cmluZykge1xyXG4gICAgaWYgKGltYWdlKSB7XHJcbiAgICAgIGxldCB0eXBlczogc3RyaW5nW10gPSBpbWFnZS5zcGxpdCgnLicpO1xyXG4gICAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSh0eXBlc1t0eXBlcy5sZW5ndGggLSAxXSk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuZm9ybWF0LnZhbHVlIHx8ICh0aGlzLmZvcm1hdC52YWx1ZSAhPT0gJ3BuZycgJiYgdGhpcy5mb3JtYXQudmFsdWUgIT09ICdqcGVnJyAmJiB0aGlzLmZvcm1hdC52YWx1ZSAhPT0gJ3dlYnAnKSkge1xyXG4gICAgICAgIHRoaXMuZm9ybWF0LnNldFZhbHVlKCdqcGVnJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGltYWdlKTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzLnB1c2godGhpcy5pbWFnZVNyYygpKTtcclxuICAgICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IGltYWdlO1xyXG4gICAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSBpbWFnZTtcclxuICAgICAgdGhpcy4kaW1hZ2VPcmlnaW5hbC5uZXh0KHRoaXMub3JpZ2luSW1hZ2VTcmMpO1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMubm9FZGl0LnNldCh0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KG51bGwpO1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gbnVsbDtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KGZhbHNlKTtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xyXG4gICAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSBudWxsO1xyXG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQobnVsbCk7XHJcbiAgICAgIHRoaXMuZm9ybWF0LnNldFZhbHVlKCdqcGVnJyk7XHJcbiAgICAgIHRoaXMubWF4SGVpZ2h0LnNldCgyMDAwKTtcclxuICAgICAgdGhpcy5tYXhXaWR0aC5zZXQoMjAwMCk7XHJcbiAgICAgIHRoaXMuY3JvcEhlaWdodC5zZXRWYWx1ZSgxNTApO1xyXG4gICAgICB0aGlzLmNyb3BXaWR0aC5zZXRWYWx1ZSgxNTApO1xyXG4gICAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8uc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2hvd0VkaXRQYW5lbC5zZXQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IF9jb25maWcodmFsdWU6IEltYWdlUGlja2VyQ29uZikge1xyXG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yID09IE9iamVjdCkge1xyXG4gICAgICB0aGlzLmNvbmZpZy5zZXQoe1xyXG4gICAgICAgIC4uLnRoaXMuY29uZmlnKCksXHJcbiAgICAgICAgLi4udmFsdWUsXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVJlYWRlckxvYWRlZChyZWFkZXJFdnQ6IHsgdGFyZ2V0OiB7IHJlc3VsdDogYW55OyB9OyB9KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBiaW5hcnlTdHJpbmc6IHN0cmluZyA9IHJlYWRlckV2dC50YXJnZXQucmVzdWx0O1xyXG4gICAgY29uc3QgYmFzZTY0dGV4dFN0cmluZzogc3RyaW5nID0gYnRvYShiaW5hcnlTdHJpbmcpO1xyXG4gICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IHRoaXMudXJsSW1hZ2UgKyBiYXNlNjR0ZXh0U3RyaW5nO1xyXG4gICAgdGhpcy5sYXN0T3JpZ2luU3JjID0gdGhpcy51cmxJbWFnZSArIGJhc2U2NHRleHRTdHJpbmc7XHJcbiAgICBpZiAodGhpcy5jb25maWcoKT8uY29tcHJlc3NJbml0aWFsKSB7XHJcbiAgICAgIHRoaXMucXVhbGl0eS5zZXRWYWx1ZSg3MCk7XHJcbiAgICAgIGNvbnN0IGlucHV0OiBJbWFnZUNvbnZlcnRlcklucHV0ID0ge1xyXG4gICAgICAgIGRhdGFUeXBlOiB0aGlzLmZvcm1hdC52YWx1ZSxcclxuICAgICAgICBxdWFsaXR5OiAwLjcwLFxyXG4gICAgICAgIG1haW50YWluUmF0aW86IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGF3YWl0IHRoaXMucmVzaXplRGF0YVVSTCh0aGlzLnVybEltYWdlICsgYmFzZTY0dGV4dFN0cmluZywgaW5wdXQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KHRoaXMudXJsSW1hZ2UgKyBiYXNlNjR0ZXh0U3RyaW5nKTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzLnB1c2goe1xyXG4gICAgICAgIGxhc3RJbWFnZTogdGhpcy5pbWFnZVNyYygpLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoKCksXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCgpLFxyXG4gICAgICAgIHF1YWxpdHk6IHRoaXMucXVhbGl0eS52YWx1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuJGltYWdlT3JpZ2luYWwubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQodGhpcy5pbWFnZVNyYygpKTtcclxuICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVzaXplRGF0YVVSTChkYXRhczogc3RyaW5nLCBpbnB1dDogSW1hZ2VDb252ZXJ0ZXJJbnB1dCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoYXN5bmMgZnVuY3Rpb24ocmVzb2x2ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBsZXQgaW1nOiBIVE1MSW1hZ2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgIGltZy5zcmMgPSBkYXRhcyArICcnO1xyXG4gICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcclxuICAgICAgbGV0IHF1YWxpdHk6IG51bWJlciA9IGlucHV0Py5xdWFsaXR5ID8/IDEuMDtcclxuICAgICAgbGV0IG1haW50YWluUmF0aW86IGJvb2xlYW4gPSBpbnB1dC5tYWludGFpblJhdGlvICE9PSB1bmRlZmluZWQgPyBpbnB1dC5tYWludGFpblJhdGlvIDogdHJ1ZTtcclxuXHJcbiAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgICAgY29uc3QgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBsZXQgcmF0aW86IG51bWJlciA9IGltZy53aWR0aCAvIGltZy5oZWlnaHQ7XHJcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBpbnB1dD8ud2lkdGggPz8gaW1nLndpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQ6IG51bWJlciA9IGlucHV0Py5oZWlnaHQgPz8gaW1nLmhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKG1haW50YWluUmF0aW8pIHtcclxuICAgICAgICAgIGlmIChpbnB1dC5jaGFuZ2VIZWlnaHQpIHtcclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaGVpZ2h0ICogcmF0aW87XHJcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IHdpZHRoIC8gcmF0aW87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN0eD8uZHJhd0ltYWdlKGltZywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgICAgICBsZXQgdHlwZTogc3RyaW5nID0gaW5wdXQ/LmRhdGFUeXBlID8/ICd3ZWJwJztcclxuICAgICAgICBjb25zdCBkYXRhVVJJOiBzdHJpbmcgPSBjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke3R5cGV9YCwgcXVhbGl0eSk7XHJcbiAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICBkYXRhVXJpOiBkYXRhVVJJLFxyXG4gICAgICAgICAgd2lkdGg6IGNhbnZhcy53aWR0aCxcclxuICAgICAgICAgIGhlaWdodDogY2FudmFzLmhlaWdodCxcclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuICAgIH0pLnRoZW4oKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm1heEhlaWdodCA9IGRhdGE/LmhlaWdodDtcclxuICAgICAgdGhpcy5tYXhXaWR0aCA9IGRhdGE/LndpZHRoO1xyXG4gICAgICBpZiAodGhpcy5hcnJheUNvcGllZEltYWdlcz8ubGVuZ3RoIDw9IDIwKSB7XHJcbiAgICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcy5wdXNoKHtcclxuICAgICAgICAgIGxhc3RJbWFnZTogZGF0YT8uZGF0YVVyaSxcclxuICAgICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCxcclxuICAgICAgICAgIHF1YWxpdHk6IHRoaXMucXVhbGl0eS52YWx1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGRhdGEuZGF0YVVyaTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3YWl0KG1zPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIG1zID0gbXMgPz8gMTAwMDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSwgbXMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRyYWdFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICBsZXQgcG9zMTogbnVtYmVyID0gMCwgcG9zMjogbnVtYmVyID0gMCwgcG9zMzogbnVtYmVyID0gMCwgcG9zNDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBsZXQgZWw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudC5pZCArICctaGVhZGVyJyk7XHJcbiAgICBpZiAoZWwpIHtcclxuICAgICAgZWwub25tb3VzZWRvd24gPSBkcmFnTW91c2VEb3duO1xyXG4gICAgICBlbC5vbnRvdWNoc3RhcnQgPSBkcmFnTW91c2VEb3duO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWxlbWVudC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XHJcbiAgICAgIGVsZW1lbnQub250b3VjaHN0YXJ0ID0gZHJhZ01vdXNlRG93bjtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkcmFnTW91c2VEb3duKGU6IGFueSk6IHZvaWQge1xyXG4gICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcbiAgICAgIGU/LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHBvczMgPSBlPy5jbGllbnRYO1xyXG4gICAgICBwb3M0ID0gZT8uY2xpZW50WTtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gY2xvc2VEcmFnRWxlbWVudDtcclxuICAgICAgZG9jdW1lbnQub250b3VjaGVuZCA9IGNsb3NlRHJhZ0VsZW1lbnQ7XHJcbiAgICAgIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gZWxlbWVudERyYWc7XHJcbiAgICAgIGRvY3VtZW50Lm9udG91Y2htb3ZlID0gZWxlbWVudERyYWc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZWxlbWVudERyYWcoZTogYW55KTogdm9pZCB7XHJcbiAgICAgIGxldCBob2xkZXJJbWFnZTogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xyXG4gICAgICBlPy5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBwb3MxID0gcG9zMyAtIGU/LmNsaWVudFg7XHJcbiAgICAgIHBvczIgPSBwb3M0IC0gZT8uY2xpZW50WTtcclxuICAgICAgcG9zMyA9IGU/LmNsaWVudFg7XHJcbiAgICAgIHBvczQgPSBlPy5jbGllbnRZO1xyXG5cclxuICAgICAgY29uc3QgbmV3VG9wOiBudW1iZXIgPSBlbGVtZW50Lm9mZnNldFRvcCAtIHBvczI7XHJcbiAgICAgIGNvbnN0IG5ld0xlZnQ6IG51bWJlciA9IGVsZW1lbnQub2Zmc2V0TGVmdCAtIHBvczE7XHJcbiAgICAgIGNvbnN0IHJlY3RIb2xkZXIgPSBob2xkZXJJbWFnZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3QgcmVjdEVsZW1lbnQ6IERPTVJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBpZiAobmV3VG9wID49IHJlY3RIb2xkZXIueSArIDgpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IE1hdGgubWluKG5ld1RvcCwgcmVjdEhvbGRlci55ICsgcmVjdEhvbGRlci5oZWlnaHQgLSByZWN0RWxlbWVudC5oZWlnaHQgLSA0KSArICdweCc7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld0xlZnQgPiByZWN0SG9sZGVyLnggKyA0ICYmIHJlY3RIb2xkZXIueCArIHJlY3RIb2xkZXIud2lkdGggPiByZWN0RWxlbWVudC54ICsgcmVjdEVsZW1lbnQud2lkdGggKyAyKSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gTWF0aC5taW4obmV3TGVmdCwgcmVjdEhvbGRlci54ICsgcmVjdEhvbGRlci53aWR0aCAtIHJlY3RFbGVtZW50LndpZHRoIC0gNCkgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xvc2VEcmFnRWxlbWVudCgpOiB2b2lkIHtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gbnVsbDtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBudWxsO1xyXG4gICAgICBkb2N1bWVudC5vbnRvdWNoZW5kID0gbnVsbDtcclxuICAgICAgZG9jdW1lbnQub250b3VjaG1vdmUgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVXBsb2FkKGV2ZW50OiB7IHByZXZlbnREZWZhdWx0OiAoKSA9PiB2b2lkOyB9KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5pbWFnZVBpY2tlcj8ubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZUZpbGVTZWxlY3QoZXZ0OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpbGVzID0gZXZ0Py50YXJnZXQ/LmZpbGVzO1xyXG4gICAgaWYgKGZpbGVzKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBmaWxlc1swXTtcclxuICAgICAgdGhpcy5pbWFnZU5hbWUuc2V0KGZpbGU/Lm5hbWU/LnNwbGl0KCcuJylbMF0pO1xyXG4gICAgICB0aGlzLnVybEltYWdlID0gYGRhdGE6JHtmaWxlPy50eXBlfTtiYXNlNjQsYDtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuXHJcbiAgICAgIGlmIChmaWxlcyAmJiBmaWxlKSB7XHJcbiAgICAgICAgY29uc3QgcmVhZGVyOiBhbnkgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSB0aGlzLmhhbmRsZVJlYWRlckxvYWRlZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsb3NlRWRpdFBhbmVsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikge1xyXG4gICAgICBsZXQgaW1hZ2VDcm9wcGVyOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xyXG4gICAgICBsZXQgaW1hZ2VGdWxsOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShpbWFnZUNyb3BwZXIpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShpbWFnZUZ1bGwpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaG93Q3JvcC5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB0aGlzLnNob3dFZGl0UGFuZWwuc2V0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZVF1YWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBxdWFsaXR5SXRlbTogbnVtYmVyID0gdGhpcy5xdWFsaXR5LnZhbHVlIC8gMTAwO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KHRoaXMubWF4SGVpZ2h0KCkgPz8gMjAwMCk7XHJcbiAgICB0aGlzLm1heFdpZHRoLnNldCh0aGlzLm1heFdpZHRoKCkgPz8gMjAwMCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy53YWl0KDI1MCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbnB1dDogSW1hZ2VDb252ZXJ0ZXJJbnB1dCA9IHtcclxuICAgICAgICBoZWlnaHQ6IHRoaXMubWF4SGVpZ2h0KCksXHJcbiAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgoKSxcclxuICAgICAgICBkYXRhVHlwZTogdGhpcy5mb3JtYXQudmFsdWUsXHJcbiAgICAgICAgcXVhbGl0eTogcXVhbGl0eUl0ZW0sXHJcbiAgICAgICAgbWFpbnRhaW5SYXRpbzogdGhpcy5tYWludGFpbkFzcGVjdFJhdGlvLnZhbHVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMub3JpZ2luSW1hZ2VTcmMsIGlucHV0KSk7XHJcbiAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZUZvcm1hdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBxdWFsaXR5SXRlbTogbnVtYmVyID0gdGhpcy5xdWFsaXR5LnZhbHVlIC8gMTAwO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KHRoaXMubWF4SGVpZ2h0KCkgPz8gMjAwMCk7XHJcbiAgICB0aGlzLm1heFdpZHRoLnNldCh0aGlzLm1heFdpZHRoKCkgPz8gMjAwMCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy53YWl0KDI1MCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCgpLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoKCksXHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlJdGVtLFxyXG4gICAgICAgIG1haW50YWluUmF0aW86IHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby52YWx1ZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMub3JpZ2luSW1hZ2VTcmMsIGlucHV0KSk7XHJcbiAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZVNpemUoY2hhbmdlV2lkdGg/OiBhbnksIGNoYW5nZUhlaWdodD86IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHF1YWxpdHlJdGVtOiBudW1iZXIgPSB0aGlzLnF1YWxpdHkudmFsdWUgLyAxMDA7XHJcbiAgICB0aGlzLm1heEhlaWdodC5zZXQodGhpcy5tYXhIZWlnaHQoKSA/PyAyMDAwKTtcclxuICAgIHRoaXMubWF4V2lkdGguc2V0KHRoaXMubWF4V2lkdGgoKSA/PyAyMDAwKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLndhaXQoNTAwKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCgpLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoKCksXHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlJdGVtLFxyXG4gICAgICAgIG1haW50YWluUmF0aW86IHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby52YWx1ZSxcclxuICAgICAgICBjaGFuZ2VIZWlnaHQ6IGNoYW5nZUhlaWdodCxcclxuICAgICAgICBjaGFuZ2VXaWR0aDogY2hhbmdlV2lkdGgsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGF3YWl0IHRoaXMucmVzaXplRGF0YVVSTCh0aGlzLm9yaWdpbkltYWdlU3JjLCBpbnB1dCkpO1xyXG4gICAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaGFuZ2VDcm9wKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY3JvcHBlcjogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgIGNyb3BwZXIuc3R5bGUud2lkdGggPSB0aGlzLmNyb3BXaWR0aC52YWx1ZSArICdweCc7XHJcbiAgICBjcm9wcGVyLnN0eWxlLmhlaWdodCA9IHRoaXMuY3JvcEhlaWdodC52YWx1ZSArICdweCc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Dcm9wU3RhdGVDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICBjb25zdCBmdWxsSW1hZ2U6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgIGNvbnN0IGFzcGVjdFJhdGlvOiBudW1iZXIgPSBmdWxsSW1hZ2Uub2Zmc2V0V2lkdGggLyBmdWxsSW1hZ2Uub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgIGlmICh0aGlzLnNob3dDcm9wLnZhbHVlKSB7XHJcbiAgICAgIGNyb3BwZXIuc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xyXG4gICAgICB0aGlzLmRyYWdFbGVtZW50KGNyb3BwZXIpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzOiBSZXNpemVPYnNlcnZlckVudHJ5W10pOiB2b2lkID0+IHtcclxuICAgICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5OiBSZXNpemVPYnNlcnZlckVudHJ5KTogdm9pZCA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zaG93RWRpdFBhbmVsKCkpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudENyb3BwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudEZ1bGw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3RIb2xkZXI6IERPTVJlY3QgPSBlbGVtZW50RnVsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgcmVjdEVsZW1lbnQ6IERPTVJlY3QgPSBlbGVtZW50Q3JvcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1heFdpZHRoOiBudW1iZXIgPSByZWN0SG9sZGVyLnggKyByZWN0SG9sZGVyLndpZHRoIC0gcmVjdEVsZW1lbnQueCAtIDQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1heEhlaWdodDogbnVtYmVyID0gcmVjdEhvbGRlci55ICsgcmVjdEhvbGRlci5oZWlnaHQgLSByZWN0RWxlbWVudC55IC0gNDtcclxuXHJcbiAgICAgICAgICAgIC8vIE9idGVuZXIgZWwgdGFtYcOxbyBkZWwgw6FyZWEgZGUgcmVjb3J0ZSBzZWxlY2Npb25hZGEgcG9yIGVsIHVzdWFyaW9cclxuICAgICAgICAgICAgY29uc3QgY3JvcFdpZHRoOiBudW1iZXIgPSBlbGVtZW50Q3JvcHBlci5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgY3JvcEhlaWdodDogbnVtYmVyID0gZWxlbWVudENyb3BwZXIub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgLy8gQ2FsY3VsYXIgZWwgYW5jaG8geSBlbCBhbHRvIGRlbCDDoXJlYSBkZSByZWNvcnRlIG1hbnRlbmllbmRvIGxhIHJlbGFjacOzbiBkZSBhc3BlY3RvIGRlIGxhIGltYWdlbiBvcmlnaW5hbFxyXG4gICAgICAgICAgICBsZXQgbmV3V2lkdGg6IG51bWJlciA9IGNyb3BXaWR0aDtcclxuICAgICAgICAgICAgbGV0IG5ld0hlaWdodDogbnVtYmVyID0gY3JvcEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1haW50YWluQXNwZWN0UmF0aW8udmFsdWUpIHtcclxuICAgICAgICAgICAgICBpZiAoY3JvcFdpZHRoIC8gY3JvcEhlaWdodCA+IGFzcGVjdFJhdGlvKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSBjcm9wV2lkdGggLyBhc3BlY3RSYXRpbztcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSBjcm9wSGVpZ2h0ICogYXNwZWN0UmF0aW87XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBBanVzdGFyIGVsIGFuY2hvIHkgZWwgYWx0byBkZWwgw6FyZWEgZGUgcmVjb3J0ZSBzaSBzdXBlcmEgbG9zIGzDrW1pdGVzXHJcbiAgICAgICAgICAgIG5ld1dpZHRoID0gTWF0aC5taW4obmV3V2lkdGgsIG1heFdpZHRoKTtcclxuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5taW4obmV3SGVpZ2h0LCBtYXhIZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgLy8gRXN0YWJsZWNlciBlbCB0YW1hw7FvIHkgbGEgcG9zaWNpw7NuIGRlbCDDoXJlYSBkZSByZWNvcnRlXHJcbiAgICAgICAgICAgIGVsZW1lbnRDcm9wcGVyLnN0eWxlLndpZHRoID0gYCR7bmV3V2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBlbGVtZW50Q3JvcHBlci5zdHlsZS5oZWlnaHQgPSBgJHtuZXdIZWlnaHR9cHhgO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jcm9wV2lkdGguc2V0VmFsdWUocmVjdEVsZW1lbnQud2lkdGgpO1xyXG4gICAgICAgICAgICB0aGlzLmNyb3BIZWlnaHQuc2V0VmFsdWUocmVjdEVsZW1lbnQuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlbnRyeS50YXJnZXQuaWQgPT0gJ2ltYWdlLWZ1bGwnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlY3RIb2xkZXIudG9wID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudENyb3BwZXIuc3R5bGUudG9wID0gcmVjdEhvbGRlci50b3AgKyA0ICsgJ3B4JztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxlbWVudENyb3BwZXIuc3R5bGUubGVmdCA9IHJlY3RIb2xkZXIubGVmdCArIDQgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKSk7XHJcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNyb3BwZXIuc3R5bGUub3BhY2l0eSA9ICcwLjAnO1xyXG4gICAgICBpZiAodGhpcy5vYnNlcnZlciBpbnN0YW5jZW9mIFJlc2l6ZU9ic2VydmVyKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudENyb3BwZXI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgICAgICBjb25zdCBlbGVtZW50RnVsbDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIudW5vYnNlcnZlKGVsZW1lbnRDcm9wcGVyKTtcclxuICAgICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50RnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNyb3AodHlwZT86IGFueSk6IHZvaWQge1xyXG4gICAgdHlwZSA9IHR5cGUgPz8gdGhpcy5mb3JtYXQudmFsdWU7XHJcbiAgICBjb25zdCBjcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICBjb25zdCBlbGVtZW50RnVsbDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtZnVsbCcpO1xyXG4gICAgY29uc3QgcmVjdENyb3BwZXI6IERPTVJlY3QgPSBjcm9wcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgZGF0YUhvbGRlclJlY3Q6IERPTVJlY3QgPSBlbGVtZW50RnVsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcclxuICAgICAgbGV0IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICBsZXQgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1hZ2Uuc3JjID0gdGhpcy5pbWFnZVNyYygpO1xyXG4gICAgICBpbWFnZS5vbmxvYWQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgbGV0IHJhdGlvOiBudW1iZXIgPSBpbWFnZS5oZWlnaHQgLyBkYXRhSG9sZGVyUmVjdC5oZWlnaHQ7XHJcbiAgICAgICAgbGV0IG5ld1dpZHRoOiBudW1iZXIgPSByZWN0Q3JvcHBlci53aWR0aCAqIHJhdGlvO1xyXG4gICAgICAgIGxldCBuZXdIZWlnaHQ6IG51bWJlciA9IHJlY3RDcm9wcGVyLmhlaWdodCAqIHJhdGlvO1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IG5ld1dpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBuZXdIZWlnaHQ7XHJcbiAgICAgICAgY3R4Py5kcmF3SW1hZ2UoXHJcbiAgICAgICAgICBpbWFnZSxcclxuICAgICAgICAgIE1hdGguYWJzKHJlY3RDcm9wcGVyLnggKiByYXRpbykgLSBNYXRoLmFicyhkYXRhSG9sZGVyUmVjdC54ICogcmF0aW8pLFxyXG4gICAgICAgICAgTWF0aC5hYnMocmVjdENyb3BwZXIueSAqIHJhdGlvKSAtIE1hdGguYWJzKGRhdGFIb2xkZXJSZWN0LnkgKiByYXRpbyksXHJcbiAgICAgICAgICBuZXdXaWR0aCxcclxuICAgICAgICAgIG5ld0hlaWdodCxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgbmV3V2lkdGgsXHJcbiAgICAgICAgICBuZXdIZWlnaHQsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZShjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke3R5cGV9YCwgdGhpcy5xdWFsaXR5LnZhbHVlKSk7XHJcbiAgICAgIH07XHJcbiAgICAgIGltYWdlLm9uZXJyb3IgPSAoZTogc3RyaW5nIHwgRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgIH07XHJcbiAgICB9KVxyXG4gICAgICAudGhlbigoZGF0YVVyaTogYW55KTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoZGF0YVVyaSk7XHJcbiAgICAgICAgdGhpcy5zaG93Q3JvcC5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5vbkNyb3BTdGF0ZUNoYW5nZSgpO1xyXG4gICAgICAgIHRoaXMubWF4V2lkdGguc2V0KGNhbnZhcz8ud2lkdGgpO1xyXG4gICAgICAgIHRoaXMubWF4SGVpZ2h0LnNldChjYW52YXM/LmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5sYXN0T3JpZ2luU3JjID0gdGhpcy5vcmlnaW5JbWFnZVNyYyArICcnO1xyXG4gICAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSBkYXRhVXJpO1xyXG4gICAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZSk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblJlc3RvcmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hcnJheUNvcGllZEltYWdlcy5sZW5ndGgpIHtcclxuICAgICAgbGV0IGxhc3RTdGF0ZSA9IHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucG9wKCk7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGxhc3RTdGF0ZS5sYXN0SW1hZ2UpO1xyXG4gICAgICB0aGlzLm1heFdpZHRoLnNldChsYXN0U3RhdGUud2lkdGgpO1xyXG4gICAgICB0aGlzLm1heEhlaWdodC5zZXQobGFzdFN0YXRlLmhlaWdodCk7XHJcbiAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSB0aGlzLmxhc3RPcmlnaW5TcmMgKyAnJztcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KHRoaXMubGFzdE9yaWdpblNyYyk7XHJcbiAgICAgIHRoaXMub3JpZ2luSW1hZ2VTcmMgPSB0aGlzLmxhc3RPcmlnaW5TcmMgKyAnJztcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uUmVtb3ZlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbWFnZVNyYy5zZXQobnVsbCk7XHJcbiAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gbnVsbDtcclxuICAgIHRoaXMubG9hZEltYWdlLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSBudWxsO1xyXG4gICAgdGhpcy4kaW1hZ2VPcmlnaW5hbC5uZXh0KG51bGwpO1xyXG4gICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQobnVsbCk7XHJcbiAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSgnanBlZycpO1xyXG4gICAgdGhpcy5tYXhIZWlnaHQuc2V0KDIwMDApO1xyXG4gICAgdGhpcy5tYXhXaWR0aC5zZXQoMjAwMCk7XHJcbiAgICB0aGlzLmNyb3BIZWlnaHQuc2V0VmFsdWUoMTUwKTtcclxuICAgIHRoaXMuY3JvcFdpZHRoLnNldFZhbHVlKDE1MCk7XHJcbiAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8uc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICB0aGlzLnNob3dFZGl0UGFuZWwuc2V0KGZhbHNlKTtcclxuICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XHJcbiAgICB0aGlzLmltYWdlUmVtb3ZlZC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVBbGwkLm5leHQoKTtcclxuICAgIHRoaXMudW5zdWJzY3JpYmVBbGwkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoIWxvYWRJbWFnZSgpKSB7XG4gIDxkaXYgY2xhc3M9J3BsYWNlLWltYWdlJz5cbiAgICA8ZGl2IGNsYXNzPSdpbWFnZS1ob2xkZXInXG4gICAgICAgICBbbmdTdHlsZV09J3sgd2lkdGg6IGNvbmZpZygpPy53aWR0aCxoZWlnaHQ6IGNvbmZpZygpPy5oZWlnaHQsYm9yZGVyUmFkaXVzOiBjb25maWcoKT8uYm9yZGVyUmFkaXVzfSc+XG4gICAgICA8YnV0dG9uIFttYXRUb29sdGlwXT1cIidVUExPQURfQV9JTUFHRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIiBjbGFzcz0naW1hZ2UtdXBsb2FkLWJ0bicgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIChjbGljayk9J29uVXBsb2FkKCRldmVudCknPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+YWRkX2FfcGhvdG88L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8aW5wdXQgI2ltYWdlUGlja2VyIHR5cGU9J2ZpbGUnIGNsYXNzPSdkLW5vbmUnIFtpZF09XCInZmlsZVBpY2tlci0nICsgdXVpZEZpbGVQaWNrZXJcIlxuICAgICAgICAgICAgIChjaGFuZ2UpPSdoYW5kbGVGaWxlU2VsZWN0KCRldmVudCknIFthY2NlcHRdPSdpbWFnZXNBbGxvd2VkJz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59XG5cbkBpZiAobG9hZEltYWdlKCkpIHtcbiAgPGRpdiBjbGFzcz0ncGxhY2UtaW1hZ2UnPlxuICAgIDxkaXYgY2xhc3M9J2ltYWdlLWhvbGRlci1sb2FkZWQnXG4gICAgICAgICBbbmdTdHlsZV09J3t3aWR0aDogY29uZmlnKCk/LndpZHRoLGhlaWdodDogY29uZmlnKCk/LmhlaWdodCxib3JkZXJSYWRpdXM6IGNvbmZpZygpPy5ib3JkZXJSYWRpdXN9Jz5cbiAgICAgIDxpbWcgW3NyY109J2ltYWdlU3JjKCknIGFsdD0naW1hZ2UtbG9hZGVkJyBbbmdTdHlsZV09J3sgYm9yZGVyUmFkaXVzOiBjb25maWcoKT8uYm9yZGVyUmFkaXVzIH0nPlxuICAgICAgPGlucHV0ICNpbWFnZVBpY2tlciB0eXBlPSdmaWxlJyBjbGFzcz0nZC1ub25lJyBbaWRdPVwiJ2ZpbGVQaWNrZXItJyArIHV1aWRGaWxlUGlja2VyXCJcbiAgICAgICAgICAgICAoY2hhbmdlKT0naGFuZGxlRmlsZVNlbGVjdCgkZXZlbnQpJyBbYWNjZXB0XT0naW1hZ2VzQWxsb3dlZCc+XG4gICAgPC9kaXY+XG4gICAgQGlmIChpbWFnZVNyYygpPy5sZW5ndGgpIHtcbiAgICAgIDxwIGNsYXNzPSdtYXQtY2FwdGlvbiBpbWFnZS1jYXB0aW9uJyBbY2xhc3Mud2Fybl09JyhpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSA+IDIwMCdcbiAgICAgICAgIFtjbGFzcy5mdy02MDBdPScoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgPiAyMDAnPlxuICAgICAgICB7eyBcIlNJWkVcIiB8IGkxOG46IGN1cnJlbnRMYW5ndWFnZSgpIH19OiB7eyAoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgfX1LYiAmbmJzcDsge3sgZm9ybWF0LnZhbHVlIH19XG4gICAgICA8L3A+XG4gICAgfVxuICAgIDxkaXYgY2xhc3M9J2VkaXRpbmctYmFyLWJ0bic+XG4gICAgICBAaWYgKCFjb25maWcoKT8uaGlkZUFkZEJ0bikge1xuICAgICAgICA8YnV0dG9uIGlkPSd1cGxvYWQtaW1nJyBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT0nb25VcGxvYWQoJGV2ZW50KSdcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInVVBMT0FEX0FfSU1BR0UnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPSdtYXQtMTgnPmFkZF9hX3Bob3RvPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKCFjb25maWcoKT8uaGlkZUVkaXRCdG4gJiYgIW5vRWRpdCgpKSB7XG4gICAgICAgIDxidXR0b24gaWQ9J2VkaXQtaW1nJyBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT0nc2hvd0VkaXRQYW5lbC5zZXQodHJ1ZSknXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ09QRU5fRURJVE9SX1BBTkVMJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgICBAaWYgKCFjb25maWcoKT8uaGlkZURvd25sb2FkQnRuKSB7XG4gICAgICAgIDxhIGlkPSdkb3dubG9hZC1pbWcnIFttYXRUb29sdGlwXT1cIidET1dOTE9BRCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIlxuICAgICAgICAgICBbaHJlZl09J2ltYWdlU3JjKCknIG1hdC1pY29uLWJ1dHRvbiBbZG93bmxvYWRdPSdpbWFnZU5hbWUnPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5jbG91ZF9kb3dubG9hZDwvbWF0LWljb24+XG4gICAgICAgIDwvYT5cbiAgICAgIH1cbiAgICAgIEBpZiAoIWNvbmZpZygpPy5oaWRlRGVsZXRlQnRuKSB7XG4gICAgICAgIDxidXR0b24gaWQ9J2RlbGV0ZS1pbWcnIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPSdvblJlbW92ZSgpJ1xuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidSRU1PVkUnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPSdtYXQtMTgnPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn1cblxuQGlmIChzaG93RWRpdFBhbmVsKCkpIHtcbiAgPGRpdiBpZD0ncG9wdXAnIGNsYXNzPSdwb3B1cCc+XG4gICAgPGRpdiBjbGFzcz0ncG9wdXAtY2xlYXInPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT0nb25DbG9zZUVkaXRQYW5lbCgpJz5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPSdtYXQtMTgnPmNsZWFyPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9J2ltYWdlLWNvbnRhaW5lcic+XG4gICAgICA8ZGl2IGNsYXNzPSdpbWFnZS1ob2xkZXItZnVsbCc+XG4gICAgICAgIDxpbWcgaWQ9J2ltYWdlLWZ1bGwnIFtzcmNdPSdpbWFnZVNyYygpJyBhbHQ9Jyc+XG4gICAgICAgIDxkaXYgaWQ9J2ltYWdlLWNyb3BwZXInIGNsYXNzPSdpbWFnZS1jcm9wcGVyJz5cbiAgICAgICAgICA8ZGl2IGlkPSdpbWFnZS1jcm9wcGVyLWhlYWRlcic+XG4gICAgICAgICAgICA8bWF0LWljb24+ZHJhZ19pbmRpY2F0b3I8L21hdC1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz0nY29udHJvbC1wYW5lbCc+XG4gICAgICAgIDxwIGNsYXNzPSdpdGVtLXBhbmVsIGZ3LTYwMCc+e3sgJ1FVQUxJVFknIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPSdxdWFsaXR5LWNvbnRhaW5lcic+XG4gICAgICAgICAgPG1hdC1zbGlkZXIgbmdEZWZhdWx0Q29udHJvbCBbY29sb3JdPSdjb2xvcicgY2xhc3M9J3ctMTAwIG13LTEwMCcgKGNoYW5nZSk9J29uQ2hhbmdlUXVhbGl0eSgpJ1xuICAgICAgICAgICAgICAgICAgICAgIFttYXhdPScxMDAnIFttaW5dPScwJyBbc3RlcF09JzEnIFtkaXNjcmV0ZV09J3RydWUnIFtzaG93VGlja01hcmtzXT0ndHJ1ZSc+XG4gICAgICAgICAgICA8aW5wdXQgbWF0U2xpZGVyVGh1bWIgW2Zvcm1Db250cm9sXT0ncXVhbGl0eSc+XG4gICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0naXRlbS1wYW5lbCc+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9J2Z3LTYwMCc+e3sgJ01BWF9ESU1FTlNJT05TJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPSdmbG9hdC1yaWdodCcgW2Zvcm1Db250cm9sXT0nbWFpbnRhaW5Bc3BlY3RSYXRpbycgW2NvbG9yXT0nY29sb3InPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0FTUEVDVF9SQVRJTycgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPSdtYXgtZGltZW5zaW9uLWNvbnRhaW5lcic+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTQ4JyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ01BWF9XSURUSF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT0nb25DaGFuZ2VTaXplKHRydWUsIGZhbHNlKScgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ01BWF9XSURUSF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPSdtYXhXaWR0aCcgdHlwZT0nbnVtYmVyJyBbbWluXT0nMCcgW21heF09JzIwMDAnPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTQ4JyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ01BWF9IRUlHSFRfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9J29uQ2hhbmdlU2l6ZShmYWxzZSwgdHJ1ZSknIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidNQVhfSEVJR0hUX1BYJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiXG4gICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09J21heEhlaWdodCcgdHlwZT0nbnVtYmVyJyBbbWluXT0nMCcgW21heF09JzIwMDAnPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCBjbGFzcz0naXRlbS1wYW5lbCBmdy02MDAnPnt7ICdGT1JNQVQnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPSdmb3JtYXRzLXNlbGVjdGlvbic+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTEwMCBtdy0xMDAnIFthcHBlYXJhbmNlXT0nYXBwZWFyYW5jZScgW2NvbG9yXT0nY29sb3InPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT0nZm9ybWF0JyAoc2VsZWN0aW9uQ2hhbmdlKT0nb25DaGFuZ2VGb3JtYXQoKSc+XG4gICAgICAgICAgICAgIEBmb3IgKGZvcm1hdCBvZiBhbGxGb3JtYXRzOyB0cmFjayBmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPSdmb3JtYXQnPlxuICAgICAgICAgICAgICAgICAge3sgZm9ybWF0IH19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9J3JlZnJlc2gtY29udGFpbmVyJz5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPSdvbkNyb3BTdGF0ZUNoYW5nZSgpJyBbZm9ybUNvbnRyb2xdPSdzaG93Q3JvcCcgW2NvbG9yXT0nY29sb3InPlxuICAgICAgICAgICAgPHAgY2xhc3M9J2l0ZW0tcGFuZWwgZnctNjAwJz57eyAnQ1JPUCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L3A+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4ICc+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSdmbG9hdC1yaWdodCcgbWF0LWljb24tYnV0dG9uIFtjb2xvcl09J2NvbG9yJyAoY2xpY2spPSdvblJlc3RvcmUoKSc+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgQGlmIChzaG93Q3JvcC52YWx1ZSkge1xuICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbY29sb3JdPSdjb2xvcicgKGNsaWNrKT0nb25Dcm9wKCknPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNyb3A8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKHNob3dDcm9wLnZhbHVlKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz0nZGltZW5zaW9uLWNvbnRhaW5lcic+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9J3ctNDggbXctNDgnIFthcHBlYXJhbmNlXT0nYXBwZWFyYW5jZScgW2NvbG9yXT0nY29sb3InPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdXSURUSF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPSdvbkNoYW5nZUNyb3AoKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidXSURUSF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT0nY3JvcFdpZHRoJyB0eXBlPSdudW1iZXInIFttaW5dPScwJyBbbWF4XT0nMjAwMCc+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTQ4IG13LTQ4JyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnSEVJR0hUX1BYJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9J29uQ2hhbmdlQ3JvcCgpJyBtYXRJbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ0hFSUdIVF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT0nY3JvcEhlaWdodCcgdHlwZT0nbnVtYmVyJyBbbWluXT0nMCcgW21heF09JzIwMDAnPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2IGNsYXNzPSdzYXZlLWNvbnRhaW5lcic+XG4gICAgICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gKGNsaWNrKT0nb25DbG9zZUVkaXRQYW5lbCgpJyBbY29sb3JdPSdjb2xvcicgY2xhc3M9J3NhdmUtYnV0dG9uJz5cbiAgICAgICAgICAgIHt7ICdTQVZFJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIEBpZiAoaW1hZ2VTcmMoKT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz0nbWF0LWNhcHRpb24gaW1hZ2UtY2FwdGlvbidcbiAgICAgICAgICAgICAgIFtjbGFzcy53YXJuXT0nKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpID4gMjAwJ1xuICAgICAgICAgICAgICAgW2NsYXNzLmZ3LTYwMF09JyhpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSA+IDIwMCc+XG4gICAgICAgICAgICAgIHt7IFwiU0laRVwiIHwgaTE4bjogY3VycmVudExhbmd1YWdlKCkgfX06IHt7IChpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSB9fUtiXG4gICAgICAgICAgICAgICZuYnNwOyB7eyBmb3JtYXQudmFsdWUgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuIl19
530
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhY2hvcy1pbWFnZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VhY2hvcy1pbWFnZS1waWNrZXIvc3JjL2xpYi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWFjaG9zLWltYWdlLXBpY2tlci9zcmMvbGliL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRzdCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQXlCLGtCQUFrQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDeEYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN6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K0JBQ0UseUJBQXlCLG1CQUdsQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxPQUFPO3dCQUNQLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLFdBQVc7d0JBQ1gsbUJBQW1CO3FCQUNwQjs4QkF1Q1EsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFcUMsV0FBVztzQkFBckQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUUvQixhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFFTSxXQUFXO3NCQUF2QixLQUFLO2dCQWFPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBbUNPLE9BQU87c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIHNpZ25hbCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgV3JpdGFibGVTaWduYWwsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7UmVzaXplT2JzZXJ2ZXJ9IGZyb20gJ3Jlc2l6ZS1vYnNlcnZlcic7XHJcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7UmVzaXplT2JzZXJ2ZXJFbnRyeX0gZnJvbSAncmVzaXplLW9ic2VydmVyL2xpYi9SZXNpemVPYnNlcnZlckVudHJ5JztcclxuaW1wb3J0IHtUaGVtZVBhbGV0dGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQge01hdEljb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQge0Zvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtNYXRUb29sdGlwTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHtNYXRDaGVja2JveE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQge01hdFNsaWRlck1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGVyJztcclxuaW1wb3J0IHtNYXRCdXR0b25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7TWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSwgTWF0Rm9ybUZpZWxkTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHtNYXRJbnB1dE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQge01hdFNlbGVjdE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHtOZ1N0eWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0IHtQaXBlc01vZHVsZX0gZnJvbSAnLi4vdXRpbHMvcGlwZXMvcGlwZXMubW9kdWxlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VQaWNrZXJDb25mIHtcclxuICB3aWR0aD86IHN0cmluZztcclxuICBoZWlnaHQ/OiBzdHJpbmc7XHJcbiAgYm9yZGVyUmFkaXVzPzogc3RyaW5nO1xyXG4gIGNvbXByZXNzSW5pdGlhbD86IGJvb2xlYW47XHJcbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XHJcbiAgaGlkZURlbGV0ZUJ0bj86IGJvb2xlYW47XHJcbiAgaGlkZURvd25sb2FkQnRuPzogYm9vbGVhbjtcclxuICBoaWRlRWRpdEJ0bj86IGJvb2xlYW47XHJcbiAgaGlkZUFkZEJ0bj86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VDb252ZXJ0ZXJJbnB1dCB7XHJcbiAgd2lkdGg/OiBudW1iZXI7XHJcbiAgaGVpZ2h0PzogbnVtYmVyO1xyXG4gIHF1YWxpdHk/OiBudW1iZXI7XHJcbiAgZGF0YVR5cGU/OiBzdHJpbmc7XHJcbiAgbWFpbnRhaW5SYXRpbz86IGJvb2xlYW47XHJcbiAgY2hhbmdlSGVpZ2h0PzogYm9vbGVhbjtcclxuICBjaGFuZ2VXaWR0aD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEltYWdlQWxsb3dlZFR5cGVzID1cclxuICAnaW1hZ2UvKidcclxuICB8ICcud2VicCdcclxuICB8ICcucG5nJ1xyXG4gIHwgJy53ZWJwLCAuanBnLCAuanBlZydcclxuICB8ICcud2VicCwgLnBuZydcclxuICB8ICcuanBnLCAuanBlZydcclxuICB8ICcucG5nLCAuanBnLCAuanBlZydcclxuICB8ICcud2VicCwgLnBuZywgLmpwZywgLmpwZWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdndWFqaXJpdG9zLWltYWdlLXBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2d1YWNob3MtaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ndWFjaG9zLWltYWdlLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdTdHlsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgUGlwZXNNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRTbGlkZXJNb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEd1YWppcml0b3NJbWFnZVBpY2tlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZUFsbCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG4gIHByaXZhdGUgb2JzZXJ2ZXI6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBvcmlnaW5JbWFnZVNyYzogYW55O1xyXG4gIHByaXZhdGUgdXJsSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGxhc3RPcmlnaW5TcmM6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBhcnJheUNvcGllZEltYWdlczogYW55W10gPSBbXTtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IHV1aWRGaWxlUGlja2VyOiBzdHJpbmcgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDIwKTtcclxuICBwdWJsaWMgcmVhZG9ubHkgYWxsRm9ybWF0czogc3RyaW5nW10gPSBbJ3dlYnAnLCAnanBlZycsICdwbmcnXTtcclxuICBwdWJsaWMgY29uZmlnOiBXcml0YWJsZVNpZ25hbDxJbWFnZVBpY2tlckNvbmY+ID0gc2lnbmFsKHtcclxuICAgIGhlaWdodDogJzI0MHB4JyxcclxuICAgIHdpZHRoOiAnMzIwcHgnLFxyXG4gICAgYm9yZGVyUmFkaXVzOiAnMTZweCcsXHJcbiAgICBjb21wcmVzc0luaXRpYWw6IHRydWUsXHJcbiAgICBsYW5ndWFnZTogJ2VzJyxcclxuICAgIGhpZGVEZWxldGVCdG46IGZhbHNlLFxyXG4gICAgaGlkZURvd25sb2FkQnRuOiBmYWxzZSxcclxuICAgIGhpZGVFZGl0QnRuOiBmYWxzZSxcclxuICAgIGhpZGVBZGRCdG46IGZhbHNlLFxyXG4gIH0pO1xyXG4gIHB1YmxpYyBpbWFnZVNyYzogV3JpdGFibGVTaWduYWw8c3RyaW5nPiA9IHNpZ25hbChudWxsKTtcclxuICBwdWJsaWMgc2hvd0Nyb3A6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woe3ZhbHVlOiBmYWxzZSwgZGlzYWJsZWQ6IGZhbHNlfSk7XHJcbiAgcHVibGljIGxvYWRJbWFnZTogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHB1YmxpYyBub0VkaXQ6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gc2lnbmFsKGZhbHNlKTtcclxuICBwdWJsaWMgc2hvd0VkaXRQYW5lbDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHB1YmxpYyBtYWludGFpbkFzcGVjdFJhdGlvOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHt2YWx1ZTogdHJ1ZSwgZGlzYWJsZWQ6IGZhbHNlfSk7XHJcbiAgcHVibGljIHF1YWxpdHk6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woe3ZhbHVlOiA3MCwgZGlzYWJsZWQ6IGZhbHNlfSk7XHJcbiAgcHVibGljIGZvcm1hdDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7dmFsdWU6ICd3ZWJwJywgZGlzYWJsZWQ6IGZhbHNlfSk7XHJcbiAgcHVibGljIG1heEhlaWdodDogbnVtYmVyID0gMjAwMDtcclxuICBwdWJsaWMgbWF4V2lkdGg6IG51bWJlciA9IDIwMDA7XHJcbiAgcHVibGljIGNyb3BIZWlnaHQ6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woe3ZhbHVlOiAxNTAsIGRpc2FibGVkOiBmYWxzZX0pO1xyXG4gIHB1YmxpYyBjcm9wV2lkdGg6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woe3ZhbHVlOiAxNTAsIGRpc2FibGVkOiBmYWxzZX0pO1xyXG4gIHB1YmxpYyBpbWFnZU5hbWU6IFdyaXRhYmxlU2lnbmFsPHN0cmluZz4gPSBzaWduYWwoJ2Rvd25sb2FkJyk7XHJcbiAgcHVibGljIGN1cnJlbnRMYW5ndWFnZTogV3JpdGFibGVTaWduYWw8c3RyaW5nPiA9IHNpZ25hbCgnZXMnKTtcclxuXHJcbiAgQElucHV0KCkgYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSA9ICdvdXRsaW5lJztcclxuICBASW5wdXQoKSBjb2xvcjogVGhlbWVQYWxldHRlID0gJ3ByaW1hcnknO1xyXG4gIEBJbnB1dCgpIGltYWdlc0FsbG93ZWQ6IEltYWdlQWxsb3dlZFR5cGVzID0gJ2ltYWdlLyonO1xyXG5cclxuICBAVmlld0NoaWxkKCdpbWFnZVBpY2tlcicsIHtzdGF0aWM6IGZhbHNlfSkgaW1hZ2VQaWNrZXI6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBPdXRwdXQoKSAkaW1hZ2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSAkaW1hZ2VPcmlnaW5hbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgaW1hZ2VSZW1vdmVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIEBJbnB1dCgpIHNldCBiYXNlNjRJbWFnZShpbWFnZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoaW1hZ2UpIHtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoaW1hZ2UpO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucHVzaCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gaW1hZ2U7XHJcbiAgICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IGltYWdlO1xyXG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQodGhpcy5vcmlnaW5JbWFnZVNyYyk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBfaW1hZ2VTcmMoaW1hZ2U6IHN0cmluZykge1xyXG4gICAgaWYgKGltYWdlKSB7XHJcbiAgICAgIGxldCB0eXBlczogc3RyaW5nW10gPSBpbWFnZS5zcGxpdCgnLicpO1xyXG4gICAgICB0aGlzLmZvcm1hdC5zZXRWYWx1ZSh0eXBlc1t0eXBlcy5sZW5ndGggLSAxXSk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuZm9ybWF0LnZhbHVlIHx8ICh0aGlzLmZvcm1hdC52YWx1ZSAhPT0gJ3BuZycgJiYgdGhpcy5mb3JtYXQudmFsdWUgIT09ICdqcGVnJyAmJiB0aGlzLmZvcm1hdC52YWx1ZSAhPT0gJ3dlYnAnKSkge1xyXG4gICAgICAgIHRoaXMuZm9ybWF0LnNldFZhbHVlKCdqcGVnJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGltYWdlKTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzLnB1c2godGhpcy5pbWFnZVNyYygpKTtcclxuICAgICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IGltYWdlO1xyXG4gICAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSBpbWFnZTtcclxuICAgICAgdGhpcy4kaW1hZ2VPcmlnaW5hbC5uZXh0KHRoaXMub3JpZ2luSW1hZ2VTcmMpO1xyXG4gICAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMubm9FZGl0LnNldCh0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KG51bGwpO1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gbnVsbDtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KGZhbHNlKTtcclxuICAgICAgdGhpcy5ub0VkaXQuc2V0KGZhbHNlKTtcclxuICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xyXG4gICAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSBudWxsO1xyXG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQobnVsbCk7XHJcbiAgICAgIHRoaXMuZm9ybWF0LnNldFZhbHVlKCdqcGVnJyk7XHJcbiAgICAgIHRoaXMubWF4SGVpZ2h0ID0gMjAwMDtcclxuICAgICAgdGhpcy5tYXhXaWR0aCA9IDIwMDA7XHJcbiAgICAgIHRoaXMuY3JvcEhlaWdodC5zZXRWYWx1ZSgxNTApO1xyXG4gICAgICB0aGlzLmNyb3BXaWR0aC5zZXRWYWx1ZSgxNTApO1xyXG4gICAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8uc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgIHRoaXMuc2hvd0VkaXRQYW5lbC5zZXQoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IF9jb25maWcodmFsdWU6IEltYWdlUGlja2VyQ29uZikge1xyXG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yID09IE9iamVjdCkge1xyXG4gICAgICB0aGlzLmNvbmZpZy5zZXQoe1xyXG4gICAgICAgIC4uLnRoaXMuY29uZmlnKCksXHJcbiAgICAgICAgLi4udmFsdWUsXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVJlYWRlckxvYWRlZChyZWFkZXJFdnQ6IHt0YXJnZXQ6IHtyZXN1bHQ6IGFueTt9O30pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGJpbmFyeVN0cmluZzogc3RyaW5nID0gcmVhZGVyRXZ0LnRhcmdldC5yZXN1bHQ7XHJcbiAgICBjb25zdCBiYXNlNjR0ZXh0U3RyaW5nOiBzdHJpbmcgPSBidG9hKGJpbmFyeVN0cmluZyk7XHJcbiAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gdGhpcy51cmxJbWFnZSArIGJhc2U2NHRleHRTdHJpbmc7XHJcbiAgICB0aGlzLmxhc3RPcmlnaW5TcmMgPSB0aGlzLnVybEltYWdlICsgYmFzZTY0dGV4dFN0cmluZztcclxuICAgIGlmICh0aGlzLmNvbmZpZygpPy5jb21wcmVzc0luaXRpYWwpIHtcclxuICAgICAgdGhpcy5xdWFsaXR5LnNldFZhbHVlKDcwKTtcclxuICAgICAgY29uc3QgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQgPSB7XHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IDAuNzAsXHJcbiAgICAgICAgbWFpbnRhaW5SYXRpbzogdHJ1ZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMudXJsSW1hZ2UgKyBiYXNlNjR0ZXh0U3RyaW5nLCBpbnB1dCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQodGhpcy51cmxJbWFnZSArIGJhc2U2NHRleHRTdHJpbmcpO1xyXG4gICAgICB0aGlzLmFycmF5Q29waWVkSW1hZ2VzID0gW107XHJcbiAgICAgIHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMucHVzaCh7XHJcbiAgICAgICAgbGFzdEltYWdlOiB0aGlzLmltYWdlU3JjKCksXHJcbiAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCxcclxuICAgICAgICBxdWFsaXR5OiB0aGlzLnF1YWxpdHkudmFsdWUsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLiRpbWFnZU9yaWdpbmFsLm5leHQodGhpcy5pbWFnZVNyYygpKTtcclxuICAgIH1cclxuICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICB0aGlzLmxvYWRJbWFnZS5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHJlc2l6ZURhdGFVUkwoZGF0YXM6IHN0cmluZywgaW5wdXQ6IEltYWdlQ29udmVydGVySW5wdXQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIGZ1bmN0aW9uIChyZXNvbHZlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgIGxldCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgaW1nLnNyYyA9IGRhdGFzICsgJyc7XHJcbiAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xyXG4gICAgICBsZXQgcXVhbGl0eTogbnVtYmVyID0gaW5wdXQ/LnF1YWxpdHkgPz8gMS4wO1xyXG4gICAgICBsZXQgbWFpbnRhaW5SYXRpbzogYm9vbGVhbiA9IGlucHV0Lm1haW50YWluUmF0aW8gIT09IHVuZGVmaW5lZCA/IGlucHV0Lm1haW50YWluUmF0aW8gOiB0cnVlO1xyXG5cclxuICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgICAgY29uc3QgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBsZXQgcmF0aW86IG51bWJlciA9IGltZy53aWR0aCAvIGltZy5oZWlnaHQ7XHJcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBpbnB1dD8ud2lkdGggPz8gaW1nLndpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQ6IG51bWJlciA9IGlucHV0Py5oZWlnaHQgPz8gaW1nLmhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKG1haW50YWluUmF0aW8pIHtcclxuICAgICAgICAgIGlmIChpbnB1dC5jaGFuZ2VIZWlnaHQpIHtcclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaGVpZ2h0ICogcmF0aW87XHJcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IHdpZHRoIC8gcmF0aW87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN0eD8uZHJhd0ltYWdlKGltZywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgICAgICBsZXQgdHlwZTogc3RyaW5nID0gaW5wdXQ/LmRhdGFUeXBlID8/ICd3ZWJwJztcclxuICAgICAgICBjb25zdCBkYXRhVVJJOiBzdHJpbmcgPSBjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke3R5cGV9YCwgcXVhbGl0eSk7XHJcbiAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICBkYXRhVXJpOiBkYXRhVVJJLFxyXG4gICAgICAgICAgd2lkdGg6IGNhbnZhcy53aWR0aCxcclxuICAgICAgICAgIGhlaWdodDogY2FudmFzLmhlaWdodCxcclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuICAgIH0pLnRoZW4oKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm1heEhlaWdodCA9IGRhdGE/LmhlaWdodDtcclxuICAgICAgdGhpcy5tYXhXaWR0aCA9IGRhdGE/LndpZHRoO1xyXG4gICAgICBpZiAodGhpcy5hcnJheUNvcGllZEltYWdlcz8ubGVuZ3RoIDw9IDIwKSB7XHJcbiAgICAgICAgdGhpcy5hcnJheUNvcGllZEltYWdlcy5wdXNoKHtcclxuICAgICAgICAgIGxhc3RJbWFnZTogZGF0YT8uZGF0YVVyaSxcclxuICAgICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiB0aGlzLm1heEhlaWdodCxcclxuICAgICAgICAgIHF1YWxpdHk6IHRoaXMucXVhbGl0eS52YWx1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGRhdGEuZGF0YVVyaTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3YWl0KG1zPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIG1zID0gbXMgPz8gMTAwMDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSwgbXMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRyYWdFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICBsZXQgcG9zMTogbnVtYmVyID0gMCwgcG9zMjogbnVtYmVyID0gMCwgcG9zMzogbnVtYmVyID0gMCwgcG9zNDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBsZXQgZWw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudC5pZCArICctaGVhZGVyJyk7XHJcbiAgICBpZiAoZWwpIHtcclxuICAgICAgZWwub25tb3VzZWRvd24gPSBkcmFnTW91c2VEb3duO1xyXG4gICAgICBlbC5vbnRvdWNoc3RhcnQgPSBkcmFnTW91c2VEb3duO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWxlbWVudC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XHJcbiAgICAgIGVsZW1lbnQub250b3VjaHN0YXJ0ID0gZHJhZ01vdXNlRG93bjtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBkcmFnTW91c2VEb3duKGU6IGFueSk6IHZvaWQge1xyXG4gICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcbiAgICAgIGU/LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHBvczMgPSBlPy5jbGllbnRYO1xyXG4gICAgICBwb3M0ID0gZT8uY2xpZW50WTtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gY2xvc2VEcmFnRWxlbWVudDtcclxuICAgICAgZG9jdW1lbnQub250b3VjaGVuZCA9IGNsb3NlRHJhZ0VsZW1lbnQ7XHJcbiAgICAgIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gZWxlbWVudERyYWc7XHJcbiAgICAgIGRvY3VtZW50Lm9udG91Y2htb3ZlID0gZWxlbWVudERyYWc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZWxlbWVudERyYWcoZTogYW55KTogdm9pZCB7XHJcbiAgICAgIGxldCBob2xkZXJJbWFnZTogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xyXG4gICAgICBlPy5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBwb3MxID0gcG9zMyAtIGU/LmNsaWVudFg7XHJcbiAgICAgIHBvczIgPSBwb3M0IC0gZT8uY2xpZW50WTtcclxuICAgICAgcG9zMyA9IGU/LmNsaWVudFg7XHJcbiAgICAgIHBvczQgPSBlPy5jbGllbnRZO1xyXG5cclxuICAgICAgY29uc3QgbmV3VG9wOiBudW1iZXIgPSBlbGVtZW50Lm9mZnNldFRvcCAtIHBvczI7XHJcbiAgICAgIGNvbnN0IG5ld0xlZnQ6IG51bWJlciA9IGVsZW1lbnQub2Zmc2V0TGVmdCAtIHBvczE7XHJcbiAgICAgIGNvbnN0IHJlY3RIb2xkZXIgPSBob2xkZXJJbWFnZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3QgcmVjdEVsZW1lbnQ6IERPTVJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBpZiAobmV3VG9wID49IHJlY3RIb2xkZXIueSArIDgpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IE1hdGgubWluKG5ld1RvcCwgcmVjdEhvbGRlci55ICsgcmVjdEhvbGRlci5oZWlnaHQgLSByZWN0RWxlbWVudC5oZWlnaHQgLSA0KSArICdweCc7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld0xlZnQgPiByZWN0SG9sZGVyLnggKyA0ICYmIHJlY3RIb2xkZXIueCArIHJlY3RIb2xkZXIud2lkdGggPiByZWN0RWxlbWVudC54ICsgcmVjdEVsZW1lbnQud2lkdGggKyAyKSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gTWF0aC5taW4obmV3TGVmdCwgcmVjdEhvbGRlci54ICsgcmVjdEhvbGRlci53aWR0aCAtIHJlY3RFbGVtZW50LndpZHRoIC0gNCkgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xvc2VEcmFnRWxlbWVudCgpOiB2b2lkIHtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gbnVsbDtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBudWxsO1xyXG4gICAgICBkb2N1bWVudC5vbnRvdWNoZW5kID0gbnVsbDtcclxuICAgICAgZG9jdW1lbnQub250b3VjaG1vdmUgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVXBsb2FkKGV2ZW50OiB7cHJldmVudERlZmF1bHQ6ICgpID0+IHZvaWQ7fSk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuaW1hZ2VQaWNrZXI/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVGaWxlU2VsZWN0KGV2dDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBmaWxlcyA9IGV2dD8udGFyZ2V0Py5maWxlcztcclxuICAgIGlmIChmaWxlcykge1xyXG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNbMF07XHJcbiAgICAgIHRoaXMuaW1hZ2VOYW1lLnNldChmaWxlPy5uYW1lPy5zcGxpdCgnLicpWzBdKTtcclxuICAgICAgdGhpcy51cmxJbWFnZSA9IGBkYXRhOiR7ZmlsZT8udHlwZX07YmFzZTY0LGA7XHJcbiAgICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XHJcblxyXG4gICAgICBpZiAoZmlsZXMgJiYgZmlsZSkge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlcjogYW55ID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gdGhpcy5oYW5kbGVSZWFkZXJMb2FkZWQuYmluZCh0aGlzKTtcclxuICAgICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGZpbGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbG9zZUVkaXRQYW5lbCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9ic2VydmVyIGluc3RhbmNlb2YgUmVzaXplT2JzZXJ2ZXIpIHtcclxuICAgICAgbGV0IGltYWdlQ3JvcHBlcjogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWNyb3BwZXInKTtcclxuICAgICAgbGV0IGltYWdlRnVsbDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgICAgdGhpcy5vYnNlcnZlci51bm9ic2VydmUoaW1hZ2VDcm9wcGVyKTtcclxuICAgICAgdGhpcy5vYnNlcnZlci51bm9ic2VydmUoaW1hZ2VGdWxsKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd0Nyb3Auc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgdGhpcy5zaG93RWRpdFBhbmVsLnNldChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgb25DaGFuZ2VRdWFsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcXVhbGl0eUl0ZW06IG51bWJlciA9IHRoaXMucXVhbGl0eS52YWx1ZSAvIDEwMDtcclxuICAgIHRoaXMubWF4SGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQgPz8gMjAwMDtcclxuICAgIHRoaXMubWF4V2lkdGggPSB0aGlzLm1heFdpZHRoID8/IDIwMDA7XHJcblxyXG4gICAgYXdhaXQgdGhpcy53YWl0KDI1MCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbnB1dDogSW1hZ2VDb252ZXJ0ZXJJbnB1dCA9IHtcclxuICAgICAgICBoZWlnaHQ6IHRoaXMubWF4SGVpZ2h0LFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoLFxyXG4gICAgICAgIGRhdGFUeXBlOiB0aGlzLmZvcm1hdC52YWx1ZSxcclxuICAgICAgICBxdWFsaXR5OiBxdWFsaXR5SXRlbSxcclxuICAgICAgICBtYWludGFpblJhdGlvOiB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8udmFsdWUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldChhd2FpdCB0aGlzLnJlc2l6ZURhdGFVUkwodGhpcy5vcmlnaW5JbWFnZVNyYywgaW5wdXQpKTtcclxuICAgICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQodGhpcy5pbWFnZVNyYygpKTtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIG9uQ2hhbmdlRm9ybWF0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHF1YWxpdHlJdGVtOiBudW1iZXIgPSB0aGlzLnF1YWxpdHkudmFsdWUgLyAxMDA7XHJcbiAgICB0aGlzLm1heEhlaWdodCA9IHRoaXMubWF4SGVpZ2h0ID8/IDIwMDA7XHJcbiAgICB0aGlzLm1heFdpZHRoID0gdGhpcy5tYXhXaWR0aCA/PyAyMDAwO1xyXG5cclxuICAgIGF3YWl0IHRoaXMud2FpdCgyNTApO1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGlucHV0OiBJbWFnZUNvbnZlcnRlcklucHV0ID0ge1xyXG4gICAgICAgIGhlaWdodDogdGhpcy5tYXhIZWlnaHQsXHJcbiAgICAgICAgd2lkdGg6IHRoaXMubWF4V2lkdGgsXHJcbiAgICAgICAgZGF0YVR5cGU6IHRoaXMuZm9ybWF0LnZhbHVlLFxyXG4gICAgICAgIHF1YWxpdHk6IHF1YWxpdHlJdGVtLFxyXG4gICAgICAgIG1haW50YWluUmF0aW86IHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpby52YWx1ZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5pbWFnZVNyYy5zZXQoYXdhaXQgdGhpcy5yZXNpemVEYXRhVVJMKHRoaXMub3JpZ2luSW1hZ2VTcmMsIGlucHV0KSk7XHJcbiAgICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KHRoaXMuaW1hZ2VTcmMoKSk7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9hZEltYWdlLnNldCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZVNpemUoY2hhbmdlV2lkdGg/OiBhbnksIGNoYW5nZUhlaWdodD86IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHF1YWxpdHlJdGVtOiBudW1iZXIgPSB0aGlzLnF1YWxpdHkudmFsdWUgLyAxMDA7XHJcbiAgICB0aGlzLm1heEhlaWdodCA9IHRoaXMubWF4SGVpZ2h0ID8/IDIwMDA7XHJcbiAgICB0aGlzLm1heFdpZHRoID0gdGhpcy5tYXhXaWR0aCA/PyAyMDAwO1xyXG5cclxuICAgIGF3YWl0IHRoaXMud2FpdCg1MDApO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBpbnB1dDogSW1hZ2VDb252ZXJ0ZXJJbnB1dCA9IHtcclxuICAgICAgICBoZWlnaHQ6IHRoaXMubWF4SGVpZ2h0LFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm1heFdpZHRoLFxyXG4gICAgICAgIGRhdGFUeXBlOiB0aGlzLmZvcm1hdC52YWx1ZSxcclxuICAgICAgICBxdWFsaXR5OiBxdWFsaXR5SXRlbSxcclxuICAgICAgICBtYWludGFpblJhdGlvOiB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8udmFsdWUsXHJcbiAgICAgICAgY2hhbmdlSGVpZ2h0OiBjaGFuZ2VIZWlnaHQsXHJcbiAgICAgICAgY2hhbmdlV2lkdGg6IGNoYW5nZVdpZHRoLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldChhd2FpdCB0aGlzLnJlc2l6ZURhdGFVUkwodGhpcy5vcmlnaW5JbWFnZVNyYywgaW5wdXQpKTtcclxuICAgICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQodGhpcy5pbWFnZVNyYygpKTtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5sb2FkSW1hZ2Uuc2V0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlQ3JvcCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNyb3BwZXI6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICBjcm9wcGVyLnN0eWxlLndpZHRoID0gdGhpcy5jcm9wV2lkdGgudmFsdWUgKyAncHgnO1xyXG4gICAgY3JvcHBlci5zdHlsZS5oZWlnaHQgPSB0aGlzLmNyb3BIZWlnaHQudmFsdWUgKyAncHgnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ3JvcFN0YXRlQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY3JvcHBlcjogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xyXG4gICAgY29uc3QgZnVsbEltYWdlOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1mdWxsJyk7XHJcbiAgICBjb25zdCBhc3BlY3RSYXRpbzogbnVtYmVyID0gZnVsbEltYWdlLm9mZnNldFdpZHRoIC8gZnVsbEltYWdlLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICBpZiAodGhpcy5zaG93Q3JvcC52YWx1ZSkge1xyXG4gICAgICBjcm9wcGVyLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcclxuICAgICAgdGhpcy5kcmFnRWxlbWVudChjcm9wcGVyKTtcclxuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllczogUmVzaXplT2JzZXJ2ZXJFbnRyeVtdKTogdm9pZCA9PiB7XHJcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeTogUmVzaXplT2JzZXJ2ZXJFbnRyeSk6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2hvd0VkaXRQYW5lbCgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRDcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRGdWxsOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1mdWxsJyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZWN0SG9sZGVyOiBET01SZWN0ID0gZWxlbWVudEZ1bGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3RFbGVtZW50OiBET01SZWN0ID0gZWxlbWVudENyb3BwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aDogbnVtYmVyID0gcmVjdEhvbGRlci54ICsgcmVjdEhvbGRlci53aWR0aCAtIHJlY3RFbGVtZW50LnggLSA0O1xyXG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQ6IG51bWJlciA9IHJlY3RIb2xkZXIueSArIHJlY3RIb2xkZXIuaGVpZ2h0IC0gcmVjdEVsZW1lbnQueSAtIDQ7XHJcblxyXG4gICAgICAgICAgICAvLyBPYnRlbmVyIGVsIHRhbWHDsW8gZGVsIMOhcmVhIGRlIHJlY29ydGUgc2VsZWNjaW9uYWRhIHBvciBlbCB1c3VhcmlvXHJcbiAgICAgICAgICAgIGNvbnN0IGNyb3BXaWR0aDogbnVtYmVyID0gZWxlbWVudENyb3BwZXIub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGNyb3BIZWlnaHQ6IG51bWJlciA9IGVsZW1lbnRDcm9wcGVyLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIC8vIENhbGN1bGFyIGVsIGFuY2hvIHkgZWwgYWx0byBkZWwgw6FyZWEgZGUgcmVjb3J0ZSBtYW50ZW5pZW5kbyBsYSByZWxhY2nDs24gZGUgYXNwZWN0byBkZSBsYSBpbWFnZW4gb3JpZ2luYWxcclxuICAgICAgICAgICAgbGV0IG5ld1dpZHRoOiBudW1iZXIgPSBjcm9wV2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBuZXdIZWlnaHQ6IG51bWJlciA9IGNyb3BIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5tYWludGFpbkFzcGVjdFJhdGlvLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGNyb3BXaWR0aCAvIGNyb3BIZWlnaHQgPiBhc3BlY3RSYXRpbykge1xyXG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gY3JvcFdpZHRoIC8gYXNwZWN0UmF0aW87XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gY3JvcEhlaWdodCAqIGFzcGVjdFJhdGlvO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQWp1c3RhciBlbCBhbmNobyB5IGVsIGFsdG8gZGVsIMOhcmVhIGRlIHJlY29ydGUgc2kgc3VwZXJhIGxvcyBsw61taXRlc1xyXG4gICAgICAgICAgICBuZXdXaWR0aCA9IE1hdGgubWluKG5ld1dpZHRoLCBtYXhXaWR0aCk7XHJcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IE1hdGgubWluKG5ld0hlaWdodCwgbWF4SGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEVzdGFibGVjZXIgZWwgdGFtYcOxbyB5IGxhIHBvc2ljacOzbiBkZWwgw6FyZWEgZGUgcmVjb3J0ZVxyXG4gICAgICAgICAgICBlbGVtZW50Q3JvcHBlci5zdHlsZS53aWR0aCA9IGAke25ld1dpZHRofXB4YDtcclxuICAgICAgICAgICAgZWxlbWVudENyb3BwZXIuc3R5bGUuaGVpZ2h0ID0gYCR7bmV3SGVpZ2h0fXB4YDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3JvcFdpZHRoLnNldFZhbHVlKHJlY3RFbGVtZW50LndpZHRoKTtcclxuICAgICAgICAgICAgdGhpcy5jcm9wSGVpZ2h0LnNldFZhbHVlKHJlY3RFbGVtZW50LmhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZW50cnkudGFyZ2V0LmlkID09ICdpbWFnZS1mdWxsJykge1xyXG4gICAgICAgICAgICAgIGlmIChyZWN0SG9sZGVyLnRvcCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRDcm9wcGVyLnN0eWxlLnRvcCA9IHJlY3RIb2xkZXIudG9wICsgNCArICdweCc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsZW1lbnRDcm9wcGVyLnN0eWxlLmxlZnQgPSByZWN0SG9sZGVyLmxlZnQgKyA0ICsgJ3B4JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJykpO1xyXG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjcm9wcGVyLnN0eWxlLm9wYWNpdHkgPSAnMC4wJztcclxuICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIgaW5zdGFuY2VvZiBSZXNpemVPYnNlcnZlcikge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRDcm9wcGVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZS1jcm9wcGVyJyk7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudEZ1bGw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgICAgICB0aGlzLm9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50Q3JvcHBlcik7XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlci51bm9ic2VydmUoZWxlbWVudEZ1bGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Dcm9wKHR5cGU/OiBhbnkpOiB2b2lkIHtcclxuICAgIHR5cGUgPSB0eXBlID8/IHRoaXMuZm9ybWF0LnZhbHVlO1xyXG4gICAgY29uc3QgY3JvcHBlcjogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2UtY3JvcHBlcicpO1xyXG4gICAgY29uc3QgZWxlbWVudEZ1bGw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltYWdlLWZ1bGwnKTtcclxuICAgIGNvbnN0IHJlY3RDcm9wcGVyOiBET01SZWN0ID0gY3JvcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IGRhdGFIb2xkZXJSZWN0OiBET01SZWN0ID0gZWxlbWVudEZ1bGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XHJcbiAgICAgIGxldCBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgbGV0IGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50ID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltYWdlLnNyYyA9IHRoaXMuaW1hZ2VTcmMoKTtcclxuICAgICAgaW1hZ2Uub25sb2FkID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGxldCByYXRpbzogbnVtYmVyID0gaW1hZ2UuaGVpZ2h0IC8gZGF0YUhvbGRlclJlY3QuaGVpZ2h0O1xyXG4gICAgICAgIGxldCBuZXdXaWR0aDogbnVtYmVyID0gcmVjdENyb3BwZXIud2lkdGggKiByYXRpbztcclxuICAgICAgICBsZXQgbmV3SGVpZ2h0OiBudW1iZXIgPSByZWN0Q3JvcHBlci5oZWlnaHQgKiByYXRpbztcclxuICAgICAgICBjYW52YXMud2lkdGggPSBuZXdXaWR0aDtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xyXG4gICAgICAgIGN0eD8uZHJhd0ltYWdlKFxyXG4gICAgICAgICAgaW1hZ2UsXHJcbiAgICAgICAgICBNYXRoLmFicyhyZWN0Q3JvcHBlci54ICogcmF0aW8pIC0gTWF0aC5hYnMoZGF0YUhvbGRlclJlY3QueCAqIHJhdGlvKSxcclxuICAgICAgICAgIE1hdGguYWJzKHJlY3RDcm9wcGVyLnkgKiByYXRpbykgLSBNYXRoLmFicyhkYXRhSG9sZGVyUmVjdC55ICogcmF0aW8pLFxyXG4gICAgICAgICAgbmV3V2lkdGgsXHJcbiAgICAgICAgICBuZXdIZWlnaHQsXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIG5ld1dpZHRoLFxyXG4gICAgICAgICAgbmV3SGVpZ2h0LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJlc29sdmUoY2FudmFzLnRvRGF0YVVSTChgaW1hZ2UvJHt0eXBlfWAsIHRoaXMucXVhbGl0eS52YWx1ZSkpO1xyXG4gICAgICB9O1xyXG4gICAgICBpbWFnZS5vbmVycm9yID0gKGU6IHN0cmluZyB8IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICB9O1xyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKGRhdGFVcmk6IGFueSk6IHZvaWQgPT4ge1xyXG4gICAgICAgIHRoaXMuaW1hZ2VTcmMuc2V0KGRhdGFVcmkpO1xyXG4gICAgICAgIHRoaXMuc2hvd0Nyb3Auc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMub25Dcm9wU3RhdGVDaGFuZ2UoKTtcclxuICAgICAgICB0aGlzLm1heFdpZHRoID0gY2FudmFzPy53aWR0aDtcclxuICAgICAgICB0aGlzLm1heEhlaWdodCA9IGNhbnZhcz8uaGVpZ2h0O1xyXG4gICAgICAgIHRoaXMubGFzdE9yaWdpblNyYyA9IHRoaXMub3JpZ2luSW1hZ2VTcmMgKyAnJztcclxuICAgICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gZGF0YVVyaTtcclxuICAgICAgICB0aGlzLiRpbWFnZUNoYW5nZWQubmV4dCh0aGlzLmltYWdlU3JjKCkpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGUpOiB2b2lkID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25SZXN0b3JlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYXJyYXlDb3BpZWRJbWFnZXMubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBsYXN0U3RhdGUgPSB0aGlzLmFycmF5Q29waWVkSW1hZ2VzLnBvcCgpO1xyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldChsYXN0U3RhdGUubGFzdEltYWdlKTtcclxuICAgICAgdGhpcy5tYXhXaWR0aCA9IGxhc3RTdGF0ZS53aWR0aDtcclxuICAgICAgdGhpcy5tYXhIZWlnaHQgPSBsYXN0U3RhdGUuaGVpZ2h0O1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gdGhpcy5sYXN0T3JpZ2luU3JjICsgJyc7XHJcbiAgICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmltYWdlU3JjLnNldCh0aGlzLmxhc3RPcmlnaW5TcmMpO1xyXG4gICAgICB0aGlzLm9yaWdpbkltYWdlU3JjID0gdGhpcy5sYXN0T3JpZ2luU3JjICsgJyc7XHJcbiAgICAgIHRoaXMubm9FZGl0LnNldChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kaW1hZ2VDaGFuZ2VkLm5leHQodGhpcy5pbWFnZVNyYygpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblJlbW92ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW1hZ2VTcmMuc2V0KG51bGwpO1xyXG4gICAgdGhpcy5vcmlnaW5JbWFnZVNyYyA9IG51bGw7XHJcbiAgICB0aGlzLmxvYWRJbWFnZS5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5hcnJheUNvcGllZEltYWdlcyA9IFtdO1xyXG4gICAgdGhpcy5sYXN0T3JpZ2luU3JjID0gbnVsbDtcclxuICAgIHRoaXMuJGltYWdlT3JpZ2luYWwubmV4dChudWxsKTtcclxuICAgIHRoaXMuJGltYWdlQ2hhbmdlZC5uZXh0KG51bGwpO1xyXG4gICAgdGhpcy5mb3JtYXQuc2V0VmFsdWUoJ2pwZWcnKTtcclxuICAgIHRoaXMubWF4SGVpZ2h0ID0gMjAwMDtcclxuICAgIHRoaXMubWF4V2lkdGggPSAyMDAwO1xyXG4gICAgdGhpcy5jcm9wSGVpZ2h0LnNldFZhbHVlKDE1MCk7XHJcbiAgICB0aGlzLmNyb3BXaWR0aC5zZXRWYWx1ZSgxNTApO1xyXG4gICAgdGhpcy5tYWludGFpbkFzcGVjdFJhdGlvLnNldFZhbHVlKHRydWUpO1xyXG4gICAgdGhpcy5zaG93RWRpdFBhbmVsLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLm5vRWRpdC5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5pbWFnZVJlbW92ZWQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlQWxsJC5uZXh0KCk7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlQWxsJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCJAaWYgKCFsb2FkSW1hZ2UoKSkge1xuICA8ZGl2IGNsYXNzPSdwbGFjZS1pbWFnZSc+XG4gICAgPGRpdiBjbGFzcz0naW1hZ2UtaG9sZGVyJ1xuICAgICAgICAgW25nU3R5bGVdPSd7IHdpZHRoOiBjb25maWcoKT8ud2lkdGgsaGVpZ2h0OiBjb25maWcoKT8uaGVpZ2h0LGJvcmRlclJhZGl1czogY29uZmlnKCk/LmJvcmRlclJhZGl1c30nPlxuICAgICAgPGJ1dHRvbiBbbWF0VG9vbHRpcF09XCInVVBMT0FEX0FfSU1BR0UnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCIgY2xhc3M9J2ltYWdlLXVwbG9hZC1idG4nIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAoY2xpY2spPSdvblVwbG9hZCgkZXZlbnQpJz5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPSdtYXQtMTgnPmFkZF9hX3Bob3RvPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGlucHV0ICNpbWFnZVBpY2tlciB0eXBlPSdmaWxlJyBjbGFzcz0nZC1ub25lJyBbaWRdPVwiJ2ZpbGVQaWNrZXItJyArIHV1aWRGaWxlUGlja2VyXCJcbiAgICAgICAgICAgICAoY2hhbmdlKT0naGFuZGxlRmlsZVNlbGVjdCgkZXZlbnQpJyBbYWNjZXB0XT0naW1hZ2VzQWxsb3dlZCc+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuXG5AaWYgKGxvYWRJbWFnZSgpKSB7XG4gIDxkaXYgY2xhc3M9J3BsYWNlLWltYWdlJz5cbiAgICA8ZGl2IGNsYXNzPSdpbWFnZS1ob2xkZXItbG9hZGVkJ1xuICAgICAgICAgW25nU3R5bGVdPSd7d2lkdGg6IGNvbmZpZygpPy53aWR0aCxoZWlnaHQ6IGNvbmZpZygpPy5oZWlnaHQsYm9yZGVyUmFkaXVzOiBjb25maWcoKT8uYm9yZGVyUmFkaXVzfSc+XG4gICAgICA8aW1nIFtzcmNdPSdpbWFnZVNyYygpJyBhbHQ9J2ltYWdlLWxvYWRlZCcgW25nU3R5bGVdPSd7IGJvcmRlclJhZGl1czogY29uZmlnKCk/LmJvcmRlclJhZGl1cyB9Jz5cbiAgICAgIDxpbnB1dCAjaW1hZ2VQaWNrZXIgdHlwZT0nZmlsZScgY2xhc3M9J2Qtbm9uZScgW2lkXT1cIidmaWxlUGlja2VyLScgKyB1dWlkRmlsZVBpY2tlclwiXG4gICAgICAgICAgICAgKGNoYW5nZSk9J2hhbmRsZUZpbGVTZWxlY3QoJGV2ZW50KScgW2FjY2VwdF09J2ltYWdlc0FsbG93ZWQnPlxuICAgIDwvZGl2PlxuICAgIEBpZiAoaW1hZ2VTcmMoKT8ubGVuZ3RoKSB7XG4gICAgICA8cCBjbGFzcz0nbWF0LWNhcHRpb24gaW1hZ2UtY2FwdGlvbicgW2NsYXNzLndhcm5dPScoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgPiAyMDAnXG4gICAgICAgICBbY2xhc3MuZnctNjAwXT0nKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpID4gMjAwJz5cbiAgICAgICAge3sgXCJTSVpFXCIgfCBpMThuOiBjdXJyZW50TGFuZ3VhZ2UoKSB9fToge3sgKGltYWdlU3JjKCk/Lmxlbmd0aCB8IGNhbGN1bGF0ZVNpemUpIH19S2IgJm5ic3A7IHt7IGZvcm1hdC52YWx1ZSB9fVxuICAgICAgPC9wPlxuICAgIH1cbiAgICA8ZGl2IGNsYXNzPSdlZGl0aW5nLWJhci1idG4nPlxuICAgICAgQGlmICghY29uZmlnKCk/LmhpZGVBZGRCdG4pIHtcbiAgICAgICAgPGJ1dHRvbiBpZD0ndXBsb2FkLWltZycgbWF0LWljb24tYnV0dG9uIChjbGljayk9J29uVXBsb2FkKCRldmVudCknXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1VQTE9BRF9BX0lNQUdFJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5hZGRfYV9waG90bzwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmICghY29uZmlnKCk/LmhpZGVFZGl0QnRuICYmICFub0VkaXQoKSkge1xuICAgICAgICA8YnV0dG9uIGlkPSdlZGl0LWltZycgbWF0LWljb24tYnV0dG9uIChjbGljayk9J3Nob3dFZGl0UGFuZWwuc2V0KHRydWUpJ1xuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidPUEVOX0VESVRPUl9QQU5FTCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmICghY29uZmlnKCk/LmhpZGVEb3dubG9hZEJ0bikge1xuICAgICAgICA8YSBpZD0nZG93bmxvYWQtaW1nJyBbbWF0VG9vbHRpcF09XCInRE9XTkxPQUQnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgW2hyZWZdPSdpbWFnZVNyYygpJyBtYXQtaWNvbi1idXR0b24gW2Rvd25sb2FkXT0naW1hZ2VOYW1lJz5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9J21hdC0xOCc+Y2xvdWRfZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgICA8L2E+XG4gICAgICB9XG4gICAgICBAaWYgKCFjb25maWcoKT8uaGlkZURlbGV0ZUJ0bikge1xuICAgICAgICA8YnV0dG9uIGlkPSdkZWxldGUtaW1nJyBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT0nb25SZW1vdmUoKSdcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInUkVNT1ZFJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59XG5cbkBpZiAoc2hvd0VkaXRQYW5lbCgpKSB7XG4gIDxkaXYgaWQ9J3BvcHVwJyBjbGFzcz0ncG9wdXAnPlxuICAgIDxkaXYgY2xhc3M9J3BvcHVwLWNsZWFyJz5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9J29uQ2xvc2VFZGl0UGFuZWwoKSc+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz0nbWF0LTE4Jz5jbGVhcjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSdpbWFnZS1jb250YWluZXInPlxuICAgICAgPGRpdiBjbGFzcz0naW1hZ2UtaG9sZGVyLWZ1bGwnPlxuICAgICAgICA8aW1nIGlkPSdpbWFnZS1mdWxsJyBbc3JjXT0naW1hZ2VTcmMoKScgYWx0PScnPlxuICAgICAgICA8ZGl2IGlkPSdpbWFnZS1jcm9wcGVyJyBjbGFzcz0naW1hZ2UtY3JvcHBlcic+XG4gICAgICAgICAgPGRpdiBpZD0naW1hZ2UtY3JvcHBlci1oZWFkZXInPlxuICAgICAgICAgICAgPG1hdC1pY29uPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9J2NvbnRyb2wtcGFuZWwnPlxuICAgICAgICA8cCBjbGFzcz0naXRlbS1wYW5lbCBmdy02MDAnPnt7ICdRVUFMSVRZJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz0ncXVhbGl0eS1jb250YWluZXInPlxuICAgICAgICAgIDxtYXQtc2xpZGVyIG5nRGVmYXVsdENvbnRyb2wgW2NvbG9yXT0nY29sb3InIGNsYXNzPSd3LTEwMCBtdy0xMDAnIChjaGFuZ2UpPSdvbkNoYW5nZVF1YWxpdHkoKSdcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4XT0nMTAwJyBbbWluXT0nMCcgW3N0ZXBdPScxJyBbZGlzY3JldGVdPSd0cnVlJyBbc2hvd1RpY2tNYXJrc109J3RydWUnPlxuICAgICAgICAgICAgPGlucHV0IG1hdFNsaWRlclRodW1iIFtmb3JtQ29udHJvbF09J3F1YWxpdHknPlxuICAgICAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9J2l0ZW0tcGFuZWwnPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPSdmdy02MDAnPnt7ICdNQVhfRElNRU5TSU9OUycgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz0nZmxvYXQtcmlnaHQnIFtmb3JtQ29udHJvbF09J21haW50YWluQXNwZWN0UmF0aW8nIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdBU1BFQ1RfUkFUSU8nIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9zcGFuPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0nbWF4LWRpbWVuc2lvbi1jb250YWluZXInPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy00OCcgW2FwcGVhcmFuY2VdPSdhcHBlYXJhbmNlJyBbY29sb3JdPSdjb2xvcic+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdNQVhfV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9J29uQ2hhbmdlU2l6ZSh0cnVlLCBmYWxzZSknIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidNQVhfV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT0nbWF4V2lkdGgnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy00OCcgW2FwcGVhcmFuY2VdPSdhcHBlYXJhbmNlJyBbY29sb3JdPSdjb2xvcic+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdNQVhfSEVJR0hUX1BYJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPSdvbkNoYW5nZVNpemUoZmFsc2UsIHRydWUpJyBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInTUFYX0hFSUdIVF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPSdtYXhIZWlnaHQnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgY2xhc3M9J2l0ZW0tcGFuZWwgZnctNjAwJz57eyAnRk9STUFUJyB8IGkxOG46IGNvbmZpZygpPy5sYW5ndWFnZSB9fTwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz0nZm9ybWF0cy1zZWxlY3Rpb24nPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy0xMDAgbXctMTAwJyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09J2Zvcm1hdCcgKHNlbGVjdGlvbkNoYW5nZSk9J29uQ2hhbmdlRm9ybWF0KCknPlxuICAgICAgICAgICAgICBAZm9yIChmb3JtYXQgb2YgYWxsRm9ybWF0czsgdHJhY2sgZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT0nZm9ybWF0Jz5cbiAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdCB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPSdyZWZyZXNoLWNvbnRhaW5lcic+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT0nb25Dcm9wU3RhdGVDaGFuZ2UoKScgW2Zvcm1Db250cm9sXT0nc2hvd0Nyb3AnIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgIDxwIGNsYXNzPSdpdGVtLXBhbmVsIGZ3LTYwMCc+e3sgJ0NST1AnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9wPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgIDxkaXYgY2xhc3M9J2QtZmxleCAnPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0nZmxvYXQtcmlnaHQnIG1hdC1pY29uLWJ1dHRvbiBbY29sb3JdPSdjb2xvcicgKGNsaWNrKT0nb25SZXN0b3JlKCknPlxuICAgICAgICAgICAgICA8bWF0LWljb24+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIEBpZiAoc2hvd0Nyb3AudmFsdWUpIHtcbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW2NvbG9yXT0nY29sb3InIChjbGljayk9J29uQ3JvcCgpJz5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jcm9wPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChzaG93Q3JvcC52YWx1ZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9J2RpbWVuc2lvbi1jb250YWluZXInPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSd3LTQ4IG13LTQ4JyBbYXBwZWFyYW5jZV09J2FwcGVhcmFuY2UnIFtjb2xvcl09J2NvbG9yJz5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT0nb25DaGFuZ2VDcm9wKCknIG1hdElucHV0IFtwbGFjZWhvbGRlcl09XCInV0lEVEhfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09J2Nyb3BXaWR0aCcgdHlwZT0nbnVtYmVyJyBbbWluXT0nMCcgW21heF09JzIwMDAnPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0ndy00OCBtdy00OCcgW2FwcGVhcmFuY2VdPSdhcHBlYXJhbmNlJyBbY29sb3JdPSdjb2xvcic+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ0hFSUdIVF9QWCcgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPSdvbkNoYW5nZUNyb3AoKScgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidIRUlHSFRfUFgnIHwgaTE4bjogY29uZmlnKCk/Lmxhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09J2Nyb3BIZWlnaHQnIHR5cGU9J251bWJlcicgW21pbl09JzAnIFttYXhdPScyMDAwJz5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz0nc2F2ZS1jb250YWluZXInPlxuICAgICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIChjbGljayk9J29uQ2xvc2VFZGl0UGFuZWwoKScgW2NvbG9yXT0nY29sb3InIGNsYXNzPSdzYXZlLWJ1dHRvbic+XG4gICAgICAgICAgICB7eyAnU0FWRScgfCBpMThuOiBjb25maWcoKT8ubGFuZ3VhZ2UgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICBAaWYgKGltYWdlU3JjKCk/Lmxlbmd0aCkge1xuICAgICAgICAgICAgPHAgY2xhc3M9J21hdC1jYXB0aW9uIGltYWdlLWNhcHRpb24nXG4gICAgICAgICAgICAgICBbY2xhc3Mud2Fybl09JyhpbWFnZVNyYygpPy5sZW5ndGggfCBjYWxjdWxhdGVTaXplKSA+IDIwMCdcbiAgICAgICAgICAgICAgIFtjbGFzcy5mdy02MDBdPScoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgPiAyMDAnPlxuICAgICAgICAgICAgICB7eyBcIlNJWkVcIiB8IGkxOG46IGN1cnJlbnRMYW5ndWFnZSgpIH19OiB7eyAoaW1hZ2VTcmMoKT8ubGVuZ3RoIHwgY2FsY3VsYXRlU2l6ZSkgfX1LYlxuICAgICAgICAgICAgICAmbmJzcDsge3sgZm9ybWF0LnZhbHVlIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn1cbiJdfQ==
@@ -140,8 +140,8 @@ class GuajiritosImagePicker {
140
140
  maintainAspectRatio = new UntypedFormControl({ value: true, disabled: false });
141
141
  quality = new UntypedFormControl({ value: 70, disabled: false });
142
142
  format = new UntypedFormControl({ value: 'webp', disabled: false });
143
- maxHeight = signal(2000);
144
- maxWidth = signal(2000);
143
+ maxHeight = 2000;
144
+ maxWidth = 2000;
145
145
  cropHeight = new UntypedFormControl({ value: 150, disabled: false });
146
146
  cropWidth = new UntypedFormControl({ value: 150, disabled: false });
147
147
  imageName = signal('download');
@@ -190,8 +190,8 @@ class GuajiritosImagePicker {
190
190
  this.lastOriginSrc = null;
191
191
  this.$imageOriginal.next(null);
192
192
  this.format.setValue('jpeg');
193
- this.maxHeight.set(2000);
194
- this.maxWidth.set(2000);
193
+ this.maxHeight = 2000;
194
+ this.maxWidth = 2000;
195
195
  this.cropHeight.setValue(150);
196
196
  this.cropWidth.setValue(150);
197
197
  this.maintainAspectRatio.setValue(true);
@@ -225,8 +225,8 @@ class GuajiritosImagePicker {
225
225
  this.arrayCopiedImages = [];
226
226
  this.arrayCopiedImages.push({
227
227
  lastImage: this.imageSrc(),
228
- width: this.maxWidth(),
229
- height: this.maxHeight(),
228
+ width: this.maxWidth,
229
+ height: this.maxHeight,
230
230
  quality: this.quality.value,
231
231
  });
232
232
  this.$imageOriginal.next(this.imageSrc());
@@ -369,13 +369,13 @@ class GuajiritosImagePicker {
369
369
  }
370
370
  async onChangeQuality() {
371
371
  const qualityItem = this.quality.value / 100;
372
- this.maxHeight.set(this.maxHeight() ?? 2000);
373
- this.maxWidth.set(this.maxWidth() ?? 2000);
372
+ this.maxHeight = this.maxHeight ?? 2000;
373
+ this.maxWidth = this.maxWidth ?? 2000;
374
374
  await this.wait(250);
375
375
  try {
376
376
  const input = {
377
- height: this.maxHeight(),
378
- width: this.maxWidth(),
377
+ height: this.maxHeight,
378
+ width: this.maxWidth,
379
379
  dataType: this.format.value,
380
380
  quality: qualityItem,
381
381
  maintainRatio: this.maintainAspectRatio.value,
@@ -390,13 +390,13 @@ class GuajiritosImagePicker {
390
390
  }
391
391
  async onChangeFormat() {
392
392
  let qualityItem = this.quality.value / 100;
393
- this.maxHeight.set(this.maxHeight() ?? 2000);
394
- this.maxWidth.set(this.maxWidth() ?? 2000);
393
+ this.maxHeight = this.maxHeight ?? 2000;
394
+ this.maxWidth = this.maxWidth ?? 2000;
395
395
  await this.wait(250);
396
396
  try {
397
397
  let input = {
398
- height: this.maxHeight(),
399
- width: this.maxWidth(),
398
+ height: this.maxHeight,
399
+ width: this.maxWidth,
400
400
  dataType: this.format.value,
401
401
  quality: qualityItem,
402
402
  maintainRatio: this.maintainAspectRatio.value,
@@ -411,13 +411,13 @@ class GuajiritosImagePicker {
411
411
  }
412
412
  async onChangeSize(changeWidth, changeHeight) {
413
413
  let qualityItem = this.quality.value / 100;
414
- this.maxHeight.set(this.maxHeight() ?? 2000);
415
- this.maxWidth.set(this.maxWidth() ?? 2000);
414
+ this.maxHeight = this.maxHeight ?? 2000;
415
+ this.maxWidth = this.maxWidth ?? 2000;
416
416
  await this.wait(500);
417
417
  try {
418
418
  let input = {
419
- height: this.maxHeight(),
420
- width: this.maxWidth(),
419
+ height: this.maxHeight,
420
+ width: this.maxWidth,
421
421
  dataType: this.format.value,
422
422
  quality: qualityItem,
423
423
  maintainRatio: this.maintainAspectRatio.value,
@@ -525,8 +525,8 @@ class GuajiritosImagePicker {
525
525
  this.imageSrc.set(dataUri);
526
526
  this.showCrop.setValue(false);
527
527
  this.onCropStateChange();
528
- this.maxWidth.set(canvas?.width);
529
- this.maxHeight.set(canvas?.height);
528
+ this.maxWidth = canvas?.width;
529
+ this.maxHeight = canvas?.height;
530
530
  this.lastOriginSrc = this.originImageSrc + '';
531
531
  this.originImageSrc = dataUri;
532
532
  this.$imageChanged.next(this.imageSrc());
@@ -539,8 +539,8 @@ class GuajiritosImagePicker {
539
539
  if (this.arrayCopiedImages.length) {
540
540
  let lastState = this.arrayCopiedImages.pop();
541
541
  this.imageSrc.set(lastState.lastImage);
542
- this.maxWidth.set(lastState.width);
543
- this.maxHeight.set(lastState.height);
542
+ this.maxWidth = lastState.width;
543
+ this.maxHeight = lastState.height;
544
544
  this.originImageSrc = this.lastOriginSrc + '';
545
545
  this.noEdit.set(false);
546
546
  }
@@ -560,8 +560,8 @@ class GuajiritosImagePicker {
560
560
  this.$imageOriginal.next(null);
561
561
  this.$imageChanged.next(null);
562
562
  this.format.setValue('jpeg');
563
- this.maxHeight.set(2000);
564
- this.maxWidth.set(2000);
563
+ this.maxHeight = 2000;
564
+ this.maxWidth = 2000;
565
565
  this.cropHeight.setValue(150);
566
566
  this.cropWidth.setValue(150);
567
567
  this.maintainAspectRatio.setValue(true);
@@ -1 +1 @@
1
- {"version":3,"file":"guajiritos-image-picker.mjs","sources":["../../../projects/guachos-image-picker/src/utils/pipes/i18n/i18n.pipe.ts","../../../projects/guachos-image-picker/src/utils/pipes/calculate-size/calculate-size.pipe.ts","../../../projects/guachos-image-picker/src/utils/pipes/pipes.module.ts","../../../projects/guachos-image-picker/src/lib/guachos-image-picker.component.ts","../../../projects/guachos-image-picker/src/lib/guachos-image-picker.component.html","../../../projects/guachos-image-picker/src/public-api.ts","../../../projects/guachos-image-picker/src/guajiritos-image-picker.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'i18n'\r\n})\r\nexport class I18nPipe implements PipeTransform {\r\n private en: any = {\r\n UPLOAD_A_IMAGE: 'Upload an image',\r\n MUST_EDIT: 'You must edit the image in order to resize it',\r\n TOO_LARGE: 'too large',\r\n OPEN_EDITOR_PANEL: 'Open the editor panel',\r\n DOWNLOAD: 'Download the image',\r\n CONTROL_PANEL: 'Control Panel',\r\n QUALITY: 'Quality',\r\n SAVE: 'Save',\r\n MAX_DIMENSIONS: 'Max dimensions',\r\n ASPECT_RATIO: 'Aspect ratio',\r\n MAX_WIDTH_PX: 'max-width(px)',\r\n MAX_HEIGHT_PX: 'max-height(px)',\r\n FORMAT: 'Format',\r\n CROP: 'Crop',\r\n WIDTH_PX: 'width(px)',\r\n HEIGHT_PX: 'height(px)',\r\n REMOVE: 'Remove',\r\n SIZE: 'Size'\r\n };\r\n\r\n private es: any = {\r\n UPLOAD_A_IMAGE: 'Suba una imagen',\r\n MUST_EDIT: 'Debe editar la imagen para disminuir su tamaño',\r\n TOO_LARGE: 'muy grande',\r\n OPEN_EDITOR_PANEL: 'Abra el panel de edición',\r\n DOWNLOAD: 'Descargue la imagen',\r\n CONTROL_PANEL: 'Panel de control',\r\n REMOVE: 'Eliminar',\r\n SAVE: 'Guardar',\r\n QUALITY: 'Calidad',\r\n MAX_DIMENSIONS: 'Dimensiones',\r\n ASPECT_RATIO: 'Relación-Aspecto',\r\n MAX_WIDTH_PX: 'max. ancho',\r\n MAX_HEIGHT_PX: 'max. alto',\r\n FORMAT: 'Formato',\r\n CROP: 'Recortar',\r\n WIDTH_PX: 'ancho(px)',\r\n HEIGHT_PX: 'altura(px)',\r\n SIZE: 'Tamaño'\r\n };\r\n\r\n transform(key: string, language: string): string {\r\n return language === 'en' ? this.en?.[key] : this.es?.[key];\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'calculateSize'\r\n})\r\nexport class CalculateSizePipe implements PipeTransform {\r\n\r\n transform(imageLength: number): number {\r\n if (!imageLength) {\r\n return 0;\r\n }\r\n\r\n if (imageLength) {\r\n return Math.ceil(((3 / 4) * imageLength) / 1024);\r\n } else {\r\n return 0;\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { I18nPipe } from './i18n/i18n.pipe';\r\nimport { CalculateSizePipe } from './calculate-size/calculate-size.pipe';\r\n\r\n\r\n@NgModule({\r\n declarations: [I18nPipe, CalculateSizePipe],\r\n exports: [I18nPipe, CalculateSizePipe],\r\n})\r\nexport class PipesModule { }\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n signal,\r\n ViewChild,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { ResizeObserver } from 'resize-observer';\r\nimport { Subject } from 'rxjs';\r\nimport { ResizeObserverEntry } from 'resize-observer/lib/ResizeObserverEntry';\r\nimport { ThemePalette } from '@angular/material/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { NgStyle } from '@angular/common';\r\n\r\nimport { PipesModule } from '../utils/pipes/pipes.module';\r\n\r\nexport interface ImagePickerConf {\r\n width?: string;\r\n height?: string;\r\n borderRadius?: string;\r\n compressInitial?: boolean;\r\n language?: string;\r\n hideDeleteBtn?: boolean;\r\n hideDownloadBtn?: boolean;\r\n hideEditBtn?: boolean;\r\n hideAddBtn?: boolean;\r\n}\r\n\r\nexport interface ImageConverterInput {\r\n width?: number;\r\n height?: number;\r\n quality?: number;\r\n dataType?: string;\r\n maintainRatio?: boolean;\r\n changeHeight?: boolean;\r\n changeWidth?: boolean;\r\n}\r\n\r\nexport type ImageAllowedTypes =\r\n 'image/*'\r\n | '.webp'\r\n | '.png'\r\n | '.webp, .jpg, .jpeg'\r\n | '.webp, .png'\r\n | '.jpg, .jpeg'\r\n | '.png, .jpg, .jpeg'\r\n | '.webp, .png, .jpg, .jpeg';\r\n\r\n@Component({\r\n selector: 'guajiritos-image-picker',\r\n templateUrl: './guachos-image-picker.component.html',\r\n styleUrls: ['./guachos-image-picker.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n NgStyle,\r\n MatTooltipModule,\r\n MatIconModule,\r\n PipesModule,\r\n MatButtonModule,\r\n MatSliderModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n FormsModule,\r\n ReactiveFormsModule\r\n],\r\n})\r\nexport class GuajiritosImagePicker implements OnDestroy {\r\n private unsubscribeAll$: Subject<void> = new Subject();\r\n private observer: any = null;\r\n private originImageSrc: any;\r\n private urlImage: string | undefined;\r\n private lastOriginSrc: any;\r\n\r\n private arrayCopiedImages: any[] = [];\r\n\r\n public readonly uuidFilePicker: string = Date.now().toString(20);\r\n public readonly allFormats: string[] = ['webp', 'jpeg', 'png'];\r\n public config: WritableSignal<ImagePickerConf> = signal({\r\n height: '240px',\r\n width: '320px',\r\n borderRadius: '16px',\r\n compressInitial: true,\r\n language: 'es',\r\n hideDeleteBtn: false,\r\n hideDownloadBtn: false,\r\n hideEditBtn: false,\r\n hideAddBtn: false,\r\n });\r\n public imageSrc: WritableSignal<string> = signal(null);\r\n public showCrop: UntypedFormControl = new UntypedFormControl({ value: false, disabled: false });\r\n public loadImage: WritableSignal<boolean> = signal(false);\r\n public noEdit: WritableSignal<boolean> = signal(false);\r\n public showEditPanel: WritableSignal<boolean> = signal(false);\r\n public maintainAspectRatio: UntypedFormControl = new UntypedFormControl({ value: true, disabled: false });\r\n public quality: UntypedFormControl = new UntypedFormControl({ value: 70, disabled: false });\r\n public format: UntypedFormControl = new UntypedFormControl({ value: 'webp', disabled: false });\r\n public maxHeight: WritableSignal<number> = signal(2000);\r\n public maxWidth: WritableSignal<number> = signal(2000);\r\n public cropHeight: UntypedFormControl = new UntypedFormControl({ value: 150, disabled: false });\r\n public cropWidth: UntypedFormControl = new UntypedFormControl({ value: 150, disabled: false });\r\n public imageName: WritableSignal<string> = signal('download');\r\n public currentLanguage: WritableSignal<string> = signal('es');\r\n\r\n @Input() appearance: MatFormFieldAppearance = 'outline';\r\n @Input() color: ThemePalette = 'primary';\r\n @Input() imagesAllowed: ImageAllowedTypes = 'image/*';\r\n\r\n @ViewChild('imagePicker', { static: false }) imagePicker: ElementRef | undefined;\r\n\r\n @Output() $imageChanged: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() $imageOriginal: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() imageRemoved: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n @Input() set base64Image(image: string) {\r\n if (image) {\r\n this.imageSrc.set(image);\r\n this.arrayCopiedImages = [];\r\n this.arrayCopiedImages.push(this.imageSrc());\r\n this.originImageSrc = image;\r\n this.lastOriginSrc = image;\r\n this.$imageOriginal.next(this.originImageSrc);\r\n this.loadImage.set(true);\r\n this.noEdit.set(false);\r\n }\r\n }\r\n\r\n @Input() set _imageSrc(image: string) {\r\n if (image) {\r\n let types: string[] = image.split('.');\r\n this.format.setValue(types[types.length - 1]);\r\n\r\n if (!this.format.value || (this.format.value !== 'png' && this.format.value !== 'jpeg' && this.format.value !== 'webp')) {\r\n this.format.setValue('jpeg');\r\n }\r\n\r\n this.imageSrc.set(image);\r\n this.arrayCopiedImages = [];\r\n this.arrayCopiedImages.push(this.imageSrc());\r\n this.originImageSrc = image;\r\n this.lastOriginSrc = image;\r\n this.$imageOriginal.next(this.originImageSrc);\r\n this.loadImage.set(true);\r\n this.noEdit.set(true);\r\n } else {\r\n this.imageSrc.set(null);\r\n this.originImageSrc = null;\r\n this.loadImage.set(false);\r\n this.noEdit.set(false);\r\n this.arrayCopiedImages = [];\r\n this.lastOriginSrc = null;\r\n this.$imageOriginal.next(null);\r\n this.format.setValue('jpeg');\r\n this.maxHeight.set(2000);\r\n this.maxWidth.set(2000);\r\n this.cropHeight.setValue(150);\r\n this.cropWidth.setValue(150);\r\n this.maintainAspectRatio.setValue(true);\r\n this.showEditPanel.set(false);\r\n }\r\n }\r\n\r\n @Input() set _config(value: ImagePickerConf) {\r\n if (value && value.constructor == Object) {\r\n this.config.set({\r\n ...this.config(),\r\n ...value,\r\n })\r\n }\r\n }\r\n\r\n private async handleReaderLoaded(readerEvt: { target: { result: any; }; }): Promise<void> {\r\n const binaryString: string = readerEvt.target.result;\r\n const base64textString: string = btoa(binaryString);\r\n this.originImageSrc = this.urlImage + base64textString;\r\n this.lastOriginSrc = this.urlImage + base64textString;\r\n if (this.config()?.compressInitial) {\r\n this.quality.setValue(70);\r\n const input: ImageConverterInput = {\r\n dataType: this.format.value,\r\n quality: 0.70,\r\n maintainRatio: true,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.urlImage + base64textString, input));\r\n } else {\r\n this.imageSrc.set(this.urlImage + base64textString);\r\n this.arrayCopiedImages = [];\r\n this.arrayCopiedImages.push({\r\n lastImage: this.imageSrc(),\r\n width: this.maxWidth(),\r\n height: this.maxHeight(),\r\n quality: this.quality.value,\r\n });\r\n this.$imageOriginal.next(this.imageSrc());\r\n }\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n }\r\n\r\n private async resizeDataURL(datas: string, input: ImageConverterInput): Promise<any> {\r\n return await new Promise(async function(resolve): Promise<void> {\r\n let img: HTMLImageElement = document.createElement('img');\r\n img.src = datas + '';\r\n img.crossOrigin = 'Anonymous';\r\n let quality: number = input?.quality ?? 1.0;\r\n let maintainRatio: boolean = input.maintainRatio !== undefined ? input.maintainRatio : true;\r\n\r\n img.onload = function(): void {\r\n const canvas: HTMLCanvasElement = document.createElement('canvas');\r\n const ctx: CanvasRenderingContext2D = canvas.getContext('2d');\r\n let ratio: number = img.width / img.height;\r\n let width: number = input?.width ?? img.width;\r\n let height: number = input?.height ?? img.height;\r\n\r\n if (maintainRatio) {\r\n if (input.changeHeight) {\r\n canvas.width = height * ratio;\r\n canvas.height = height;\r\n } else {\r\n canvas.width = width;\r\n canvas.height = width / ratio;\r\n }\r\n } else {\r\n canvas.width = width;\r\n canvas.height = height;\r\n }\r\n\r\n ctx?.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n let type: string = input?.dataType ?? 'webp';\r\n const dataURI: string = canvas.toDataURL(`image/${type}`, quality);\r\n resolve({\r\n dataUri: dataURI,\r\n width: canvas.width,\r\n height: canvas.height,\r\n });\r\n };\r\n }).then((data: any) => {\r\n this.maxHeight = data?.height;\r\n this.maxWidth = data?.width;\r\n if (this.arrayCopiedImages?.length <= 20) {\r\n this.arrayCopiedImages.push({\r\n lastImage: data?.dataUri,\r\n width: this.maxWidth,\r\n height: this.maxHeight,\r\n quality: this.quality.value,\r\n });\r\n }\r\n\r\n return data.dataUri;\r\n });\r\n }\r\n\r\n private wait(ms?: number | undefined): Promise<any> {\r\n ms = ms ?? 1000;\r\n return new Promise((resolve): void => {\r\n setTimeout(() => {\r\n return resolve(true);\r\n }, ms);\r\n });\r\n }\r\n\r\n private dragElement(element: HTMLElement): void {\r\n let pos1: number = 0, pos2: number = 0, pos3: number = 0, pos4: number = 0;\r\n\r\n let el: HTMLElement = document.getElementById(element.id + '-header');\r\n if (el) {\r\n el.onmousedown = dragMouseDown;\r\n el.ontouchstart = dragMouseDown;\r\n } else {\r\n element.onmousedown = dragMouseDown;\r\n element.ontouchstart = dragMouseDown;\r\n }\r\n\r\n function dragMouseDown(e: any): void {\r\n e = e || window.event;\r\n e?.preventDefault();\r\n pos3 = e?.clientX;\r\n pos4 = e?.clientY;\r\n document.onmouseup = closeDragElement;\r\n document.ontouchend = closeDragElement;\r\n document.onmousemove = elementDrag;\r\n document.ontouchmove = elementDrag;\r\n }\r\n\r\n function elementDrag(e: any): void {\r\n let holderImage: any = document.getElementById('image-full');\r\n e = e || window.event;\r\n e?.preventDefault();\r\n pos1 = pos3 - e?.clientX;\r\n pos2 = pos4 - e?.clientY;\r\n pos3 = e?.clientX;\r\n pos4 = e?.clientY;\r\n\r\n const newTop: number = element.offsetTop - pos2;\r\n const newLeft: number = element.offsetLeft - pos1;\r\n const rectHolder = holderImage.getBoundingClientRect();\r\n const rectElement: DOMRect = element.getBoundingClientRect();\r\n if (newTop >= rectHolder.y + 8) {\r\n element.style.top = Math.min(newTop, rectHolder.y + rectHolder.height - rectElement.height - 4) + 'px';\r\n }\r\n if (newLeft > rectHolder.x + 4 && rectHolder.x + rectHolder.width > rectElement.x + rectElement.width + 2) {\r\n element.style.left = Math.min(newLeft, rectHolder.x + rectHolder.width - rectElement.width - 4) + 'px';\r\n }\r\n }\r\n\r\n function closeDragElement(): void {\r\n document.onmouseup = null;\r\n document.onmousemove = null;\r\n document.ontouchend = null;\r\n document.ontouchmove = null;\r\n }\r\n }\r\n\r\n public onUpload(event: { preventDefault: () => void; }): void {\r\n event.preventDefault();\r\n this.imagePicker?.nativeElement.click();\r\n }\r\n\r\n public handleFileSelect(evt: any): void {\r\n const files = evt?.target?.files;\r\n if (files) {\r\n const file = files[0];\r\n this.imageName.set(file?.name?.split('.')[0]);\r\n this.urlImage = `data:${file?.type};base64,`;\r\n this.noEdit.set(false);\r\n\r\n if (files && file) {\r\n const reader: any = new FileReader();\r\n reader.onload = this.handleReaderLoaded.bind(this);\r\n reader.readAsBinaryString(file);\r\n }\r\n }\r\n }\r\n\r\n public onCloseEditPanel(): void {\r\n if (this.observer instanceof ResizeObserver) {\r\n let imageCropper: any = document.getElementById('image-cropper');\r\n let imageFull: any = document.getElementById('image-full');\r\n this.observer.unobserve(imageCropper);\r\n this.observer.unobserve(imageFull);\r\n }\r\n this.showCrop.setValue(false);\r\n this.showEditPanel.set(false);\r\n }\r\n\r\n public async onChangeQuality(): Promise<void> {\r\n const qualityItem: number = this.quality.value / 100;\r\n this.maxHeight.set(this.maxHeight() ?? 2000);\r\n this.maxWidth.set(this.maxWidth() ?? 2000);\r\n\r\n await this.wait(250);\r\n try {\r\n const input: ImageConverterInput = {\r\n height: this.maxHeight(),\r\n width: this.maxWidth(),\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n };\r\n\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public async onChangeFormat(): Promise<void> {\r\n let qualityItem: number = this.quality.value / 100;\r\n this.maxHeight.set(this.maxHeight() ?? 2000);\r\n this.maxWidth.set(this.maxWidth() ?? 2000);\r\n\r\n await this.wait(250);\r\n try {\r\n let input: ImageConverterInput = {\r\n height: this.maxHeight(),\r\n width: this.maxWidth(),\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public async onChangeSize(changeWidth?: any, changeHeight?: any): Promise<void> {\r\n let qualityItem: number = this.quality.value / 100;\r\n this.maxHeight.set(this.maxHeight() ?? 2000);\r\n this.maxWidth.set(this.maxWidth() ?? 2000);\r\n\r\n await this.wait(500);\r\n\r\n try {\r\n let input: ImageConverterInput = {\r\n height: this.maxHeight(),\r\n width: this.maxWidth(),\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n changeHeight: changeHeight,\r\n changeWidth: changeWidth,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public onChangeCrop(): void {\r\n const cropper: any = document.getElementById('image-cropper');\r\n cropper.style.width = this.cropWidth.value + 'px';\r\n cropper.style.height = this.cropHeight.value + 'px';\r\n }\r\n\r\n public onCropStateChange(): void {\r\n const cropper: HTMLElement = document.getElementById('image-cropper');\r\n const fullImage: HTMLElement = document.getElementById('image-full');\r\n const aspectRatio: number = fullImage.offsetWidth / fullImage.offsetHeight;\r\n\r\n if (this.showCrop.value) {\r\n cropper.style.opacity = '1.0';\r\n this.dragElement(cropper);\r\n this.observer = new ResizeObserver((entries: ResizeObserverEntry[]): void => {\r\n entries.forEach((entry: ResizeObserverEntry): void => {\r\n if (this.showEditPanel()) {\r\n const elementCropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n\r\n const rectHolder: DOMRect = elementFull.getBoundingClientRect();\r\n const rectElement: DOMRect = elementCropper.getBoundingClientRect();\r\n\r\n const maxWidth: number = rectHolder.x + rectHolder.width - rectElement.x - 4;\r\n const maxHeight: number = rectHolder.y + rectHolder.height - rectElement.y - 4;\r\n\r\n // Obtener el tamaño del área de recorte seleccionada por el usuario\r\n const cropWidth: number = elementCropper.offsetWidth;\r\n const cropHeight: number = elementCropper.offsetHeight;\r\n\r\n // Calcular el ancho y el alto del área de recorte manteniendo la relación de aspecto de la imagen original\r\n let newWidth: number = cropWidth;\r\n let newHeight: number = cropHeight;\r\n\r\n if (this.maintainAspectRatio.value) {\r\n if (cropWidth / cropHeight > aspectRatio) {\r\n newHeight = cropWidth / aspectRatio;\r\n } else {\r\n newWidth = cropHeight * aspectRatio;\r\n }\r\n }\r\n\r\n // Ajustar el ancho y el alto del área de recorte si supera los límites\r\n newWidth = Math.min(newWidth, maxWidth);\r\n newHeight = Math.min(newHeight, maxHeight);\r\n\r\n // Establecer el tamaño y la posición del área de recorte\r\n elementCropper.style.width = `${newWidth}px`;\r\n elementCropper.style.height = `${newHeight}px`;\r\n\r\n this.cropWidth.setValue(rectElement.width);\r\n this.cropHeight.setValue(rectElement.height);\r\n\r\n if (entry.target.id == 'image-full') {\r\n if (rectHolder.top > 0) {\r\n elementCropper.style.top = rectHolder.top + 4 + 'px';\r\n }\r\n elementCropper.style.left = rectHolder.left + 4 + 'px';\r\n }\r\n }\r\n });\r\n });\r\n this.observer.observe(document.getElementById('image-cropper'));\r\n this.observer.observe(document.getElementById('image-full'));\r\n } else {\r\n cropper.style.opacity = '0.0';\r\n if (this.observer instanceof ResizeObserver) {\r\n const elementCropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n this.observer.unobserve(elementCropper);\r\n this.observer.unobserve(elementFull);\r\n }\r\n }\r\n }\r\n\r\n public onCrop(type?: any): void {\r\n type = type ?? this.format.value;\r\n const cropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n const rectCropper: DOMRect = cropper.getBoundingClientRect();\r\n const dataHolderRect: DOMRect = elementFull.getBoundingClientRect();\r\n const canvas: HTMLCanvasElement = document.createElement('canvas');\r\n new Promise((resolve, reject): void => {\r\n let ctx: CanvasRenderingContext2D | null = canvas.getContext('2d');\r\n let image: HTMLImageElement = new Image();\r\n image.src = this.imageSrc();\r\n image.onload = (): void => {\r\n let ratio: number = image.height / dataHolderRect.height;\r\n let newWidth: number = rectCropper.width * ratio;\r\n let newHeight: number = rectCropper.height * ratio;\r\n canvas.width = newWidth;\r\n canvas.height = newHeight;\r\n ctx?.drawImage(\r\n image,\r\n Math.abs(rectCropper.x * ratio) - Math.abs(dataHolderRect.x * ratio),\r\n Math.abs(rectCropper.y * ratio) - Math.abs(dataHolderRect.y * ratio),\r\n newWidth,\r\n newHeight,\r\n 0,\r\n 0,\r\n newWidth,\r\n newHeight,\r\n );\r\n\r\n resolve(canvas.toDataURL(`image/${type}`, this.quality.value));\r\n };\r\n image.onerror = (e: string | Event): void => {\r\n reject(e);\r\n };\r\n })\r\n .then((dataUri: any): void => {\r\n this.imageSrc.set(dataUri);\r\n this.showCrop.setValue(false);\r\n this.onCropStateChange();\r\n this.maxWidth.set(canvas?.width);\r\n this.maxHeight.set(canvas?.height);\r\n this.lastOriginSrc = this.originImageSrc + '';\r\n this.originImageSrc = dataUri;\r\n this.$imageChanged.next(this.imageSrc());\r\n })\r\n .catch((e): void => {\r\n console.log(e);\r\n });\r\n }\r\n\r\n public onRestore(): void {\r\n if (this.arrayCopiedImages.length) {\r\n let lastState = this.arrayCopiedImages.pop();\r\n this.imageSrc.set(lastState.lastImage);\r\n this.maxWidth.set(lastState.width);\r\n this.maxHeight.set(lastState.height);\r\n this.originImageSrc = this.lastOriginSrc + '';\r\n this.noEdit.set(false);\r\n } else {\r\n this.imageSrc.set(this.lastOriginSrc);\r\n this.originImageSrc = this.lastOriginSrc + '';\r\n this.noEdit.set(false);\r\n }\r\n\r\n this.$imageChanged.next(this.imageSrc());\r\n }\r\n\r\n public onRemove(): void {\r\n this.imageSrc.set(null);\r\n this.originImageSrc = null;\r\n this.loadImage.set(false);\r\n this.arrayCopiedImages = [];\r\n this.lastOriginSrc = null;\r\n this.$imageOriginal.next(null);\r\n this.$imageChanged.next(null);\r\n this.format.setValue('jpeg');\r\n this.maxHeight.set(2000);\r\n this.maxWidth.set(2000);\r\n this.cropHeight.setValue(150);\r\n this.cropWidth.setValue(150);\r\n this.maintainAspectRatio.setValue(true);\r\n this.showEditPanel.set(false);\r\n this.noEdit.set(false);\r\n this.imageRemoved.emit();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unsubscribeAll$.next();\r\n this.unsubscribeAll$.complete();\r\n }\r\n}\r\n","@if (!loadImage()) {\n <div class='place-image'>\n <div class='image-holder'\n [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\n (click)='onUpload($event)'>\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n </div>\n}\n\n@if (loadImage()) {\n <div class='place-image'>\n <div class='image-holder-loaded'\n [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n @if (imageSrc()?.length) {\n <p class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{ \"SIZE\" | i18n: currentLanguage() }}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\n </p>\n }\n <div class='editing-bar-btn'>\n @if (!config()?.hideAddBtn) {\n <button id='upload-img' mat-icon-button (click)='onUpload($event)'\n [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n }\n @if (!config()?.hideEditBtn && !noEdit()) {\n <button id='edit-img' mat-icon-button (click)='showEditPanel.set(true)'\n [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\n <mat-icon class='mat-18'>edit</mat-icon>\n </button>\n }\n @if (!config()?.hideDownloadBtn) {\n <a id='download-img' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\n [href]='imageSrc()' mat-icon-button [download]='imageName'>\n <mat-icon class='mat-18'>cloud_download</mat-icon>\n </a>\n }\n @if (!config()?.hideDeleteBtn) {\n <button id='delete-img' mat-icon-button (click)='onRemove()'\n [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>delete</mat-icon>\n </button>\n }\n </div>\n </div>\n}\n\n@if (showEditPanel()) {\n <div id='popup' class='popup'>\n <div class='popup-clear'>\n <button mat-icon-button (click)='onCloseEditPanel()'>\n <mat-icon class='mat-18'>clear</mat-icon>\n </button>\n </div>\n <div class='image-container'>\n <div class='image-holder-full'>\n <img id='image-full' [src]='imageSrc()' alt=''>\n <div id='image-cropper' class='image-cropper'>\n <div id='image-cropper-header'>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n </div>\n </div>\n <div class='control-panel'>\n <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\n <div class='quality-container'>\n <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\n [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\n <input matSliderThumb [formControl]='quality'>\n </mat-slider>\n </div>\n <div class='item-panel'>\n <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\n <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\n <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\n </mat-checkbox>\n </div>\n <div class='max-dimension-container'>\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(true, false)' matInput\n [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\n [(ngModel)]='maxWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(false, true)' matInput\n [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\n [(ngModel)]='maxHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\n <div class='formats-selection'>\n <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\n <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\n @for (format of allFormats; track format) {\n <mat-option [value]='format'>\n {{ format }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div>\n <div class='refresh-container'>\n <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\n <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\n </mat-checkbox>\n <div class='d-flex '>\n <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\n <mat-icon>refresh</mat-icon>\n </button>\n @if (showCrop.value) {\n <p>\n <button mat-icon-button [color]='color' (click)='onCrop()'>\n <mat-icon>crop</mat-icon>\n </button>\n </p>\n }\n </div>\n </div>\n @if (showCrop.value) {\n <div class='dimension-container'>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\n [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\n [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n }\n <div class='save-container'>\n <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\n {{ 'SAVE' | i18n: config()?.language }}\n </button>\n @if (imageSrc()?.length) {\n <p class='mat-caption image-caption'\n [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{ \"SIZE\" | i18n: currentLanguage() }}: {{ (imageSrc()?.length | calculateSize) }}Kb\n &nbsp; {{ format.value }}\n </p>\n }\n </div>\n </div>\n </div>\n </div>\n}\n","/*\r\n * Public API Surface of guachos-image-picker\r\n */\r\n\r\nexport * from './lib/guachos-image-picker.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.I18nPipe","i4.CalculateSizePipe"],"mappings":"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"}
1
+ {"version":3,"file":"guajiritos-image-picker.mjs","sources":["../../../projects/guachos-image-picker/src/utils/pipes/i18n/i18n.pipe.ts","../../../projects/guachos-image-picker/src/utils/pipes/calculate-size/calculate-size.pipe.ts","../../../projects/guachos-image-picker/src/utils/pipes/pipes.module.ts","../../../projects/guachos-image-picker/src/lib/guachos-image-picker.component.ts","../../../projects/guachos-image-picker/src/lib/guachos-image-picker.component.html","../../../projects/guachos-image-picker/src/public-api.ts","../../../projects/guachos-image-picker/src/guajiritos-image-picker.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'i18n'\r\n})\r\nexport class I18nPipe implements PipeTransform {\r\n private en: any = {\r\n UPLOAD_A_IMAGE: 'Upload an image',\r\n MUST_EDIT: 'You must edit the image in order to resize it',\r\n TOO_LARGE: 'too large',\r\n OPEN_EDITOR_PANEL: 'Open the editor panel',\r\n DOWNLOAD: 'Download the image',\r\n CONTROL_PANEL: 'Control Panel',\r\n QUALITY: 'Quality',\r\n SAVE: 'Save',\r\n MAX_DIMENSIONS: 'Max dimensions',\r\n ASPECT_RATIO: 'Aspect ratio',\r\n MAX_WIDTH_PX: 'max-width(px)',\r\n MAX_HEIGHT_PX: 'max-height(px)',\r\n FORMAT: 'Format',\r\n CROP: 'Crop',\r\n WIDTH_PX: 'width(px)',\r\n HEIGHT_PX: 'height(px)',\r\n REMOVE: 'Remove',\r\n SIZE: 'Size'\r\n };\r\n\r\n private es: any = {\r\n UPLOAD_A_IMAGE: 'Suba una imagen',\r\n MUST_EDIT: 'Debe editar la imagen para disminuir su tamaño',\r\n TOO_LARGE: 'muy grande',\r\n OPEN_EDITOR_PANEL: 'Abra el panel de edición',\r\n DOWNLOAD: 'Descargue la imagen',\r\n CONTROL_PANEL: 'Panel de control',\r\n REMOVE: 'Eliminar',\r\n SAVE: 'Guardar',\r\n QUALITY: 'Calidad',\r\n MAX_DIMENSIONS: 'Dimensiones',\r\n ASPECT_RATIO: 'Relación-Aspecto',\r\n MAX_WIDTH_PX: 'max. ancho',\r\n MAX_HEIGHT_PX: 'max. alto',\r\n FORMAT: 'Formato',\r\n CROP: 'Recortar',\r\n WIDTH_PX: 'ancho(px)',\r\n HEIGHT_PX: 'altura(px)',\r\n SIZE: 'Tamaño'\r\n };\r\n\r\n transform(key: string, language: string): string {\r\n return language === 'en' ? this.en?.[key] : this.es?.[key];\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'calculateSize'\r\n})\r\nexport class CalculateSizePipe implements PipeTransform {\r\n\r\n transform(imageLength: number): number {\r\n if (!imageLength) {\r\n return 0;\r\n }\r\n\r\n if (imageLength) {\r\n return Math.ceil(((3 / 4) * imageLength) / 1024);\r\n } else {\r\n return 0;\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { I18nPipe } from './i18n/i18n.pipe';\r\nimport { CalculateSizePipe } from './calculate-size/calculate-size.pipe';\r\n\r\n\r\n@NgModule({\r\n declarations: [I18nPipe, CalculateSizePipe],\r\n exports: [I18nPipe, CalculateSizePipe],\r\n})\r\nexport class PipesModule { }\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n signal,\r\n ViewChild,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport {ResizeObserver} from 'resize-observer';\r\nimport {Subject} from 'rxjs';\r\nimport {ResizeObserverEntry} from 'resize-observer/lib/ResizeObserverEntry';\r\nimport {ThemePalette} from '@angular/material/core';\r\nimport {MatIconModule} from '@angular/material/icon';\r\nimport {FormsModule, ReactiveFormsModule, UntypedFormControl} from '@angular/forms';\r\nimport {MatTooltipModule} from '@angular/material/tooltip';\r\nimport {MatCheckboxModule} from '@angular/material/checkbox';\r\nimport {MatSliderModule} from '@angular/material/slider';\r\nimport {MatButtonModule} from '@angular/material/button';\r\nimport {MatFormFieldAppearance, MatFormFieldModule} from '@angular/material/form-field';\r\nimport {MatInputModule} from '@angular/material/input';\r\nimport {MatSelectModule} from '@angular/material/select';\r\nimport {NgStyle} from '@angular/common';\r\n\r\nimport {PipesModule} from '../utils/pipes/pipes.module';\r\n\r\nexport interface ImagePickerConf {\r\n width?: string;\r\n height?: string;\r\n borderRadius?: string;\r\n compressInitial?: boolean;\r\n language?: string;\r\n hideDeleteBtn?: boolean;\r\n hideDownloadBtn?: boolean;\r\n hideEditBtn?: boolean;\r\n hideAddBtn?: boolean;\r\n}\r\n\r\nexport interface ImageConverterInput {\r\n width?: number;\r\n height?: number;\r\n quality?: number;\r\n dataType?: string;\r\n maintainRatio?: boolean;\r\n changeHeight?: boolean;\r\n changeWidth?: boolean;\r\n}\r\n\r\nexport type ImageAllowedTypes =\r\n 'image/*'\r\n | '.webp'\r\n | '.png'\r\n | '.webp, .jpg, .jpeg'\r\n | '.webp, .png'\r\n | '.jpg, .jpeg'\r\n | '.png, .jpg, .jpeg'\r\n | '.webp, .png, .jpg, .jpeg';\r\n\r\n@Component({\r\n selector: 'guajiritos-image-picker',\r\n templateUrl: './guachos-image-picker.component.html',\r\n styleUrls: ['./guachos-image-picker.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [\r\n NgStyle,\r\n MatTooltipModule,\r\n MatIconModule,\r\n PipesModule,\r\n MatButtonModule,\r\n MatSliderModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n FormsModule,\r\n ReactiveFormsModule\r\n ],\r\n})\r\nexport class GuajiritosImagePicker implements OnDestroy {\r\n private unsubscribeAll$: Subject<void> = new Subject();\r\n private observer: any = null;\r\n private originImageSrc: any;\r\n private urlImage: string | undefined;\r\n private lastOriginSrc: any;\r\n\r\n private arrayCopiedImages: any[] = [];\r\n\r\n public readonly uuidFilePicker: string = Date.now().toString(20);\r\n public readonly allFormats: string[] = ['webp', 'jpeg', 'png'];\r\n public config: WritableSignal<ImagePickerConf> = signal({\r\n height: '240px',\r\n width: '320px',\r\n borderRadius: '16px',\r\n compressInitial: true,\r\n language: 'es',\r\n hideDeleteBtn: false,\r\n hideDownloadBtn: false,\r\n hideEditBtn: false,\r\n hideAddBtn: false,\r\n });\r\n public imageSrc: WritableSignal<string> = signal(null);\r\n public showCrop: UntypedFormControl = new UntypedFormControl({value: false, disabled: false});\r\n public loadImage: WritableSignal<boolean> = signal(false);\r\n public noEdit: WritableSignal<boolean> = signal(false);\r\n public showEditPanel: WritableSignal<boolean> = signal(false);\r\n public maintainAspectRatio: UntypedFormControl = new UntypedFormControl({value: true, disabled: false});\r\n public quality: UntypedFormControl = new UntypedFormControl({value: 70, disabled: false});\r\n public format: UntypedFormControl = new UntypedFormControl({value: 'webp', disabled: false});\r\n public maxHeight: number = 2000;\r\n public maxWidth: number = 2000;\r\n public cropHeight: UntypedFormControl = new UntypedFormControl({value: 150, disabled: false});\r\n public cropWidth: UntypedFormControl = new UntypedFormControl({value: 150, disabled: false});\r\n public imageName: WritableSignal<string> = signal('download');\r\n public currentLanguage: WritableSignal<string> = signal('es');\r\n\r\n @Input() appearance: MatFormFieldAppearance = 'outline';\r\n @Input() color: ThemePalette = 'primary';\r\n @Input() imagesAllowed: ImageAllowedTypes = 'image/*';\r\n\r\n @ViewChild('imagePicker', {static: false}) imagePicker: ElementRef | undefined;\r\n\r\n @Output() $imageChanged: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() $imageOriginal: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() imageRemoved: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n @Input() set base64Image(image: string) {\r\n if (image) {\r\n this.imageSrc.set(image);\r\n this.arrayCopiedImages = [];\r\n this.arrayCopiedImages.push(this.imageSrc());\r\n this.originImageSrc = image;\r\n this.lastOriginSrc = image;\r\n this.$imageOriginal.next(this.originImageSrc);\r\n this.loadImage.set(true);\r\n this.noEdit.set(false);\r\n }\r\n }\r\n\r\n @Input() set _imageSrc(image: string) {\r\n if (image) {\r\n let types: string[] = image.split('.');\r\n this.format.setValue(types[types.length - 1]);\r\n\r\n if (!this.format.value || (this.format.value !== 'png' && this.format.value !== 'jpeg' && this.format.value !== 'webp')) {\r\n this.format.setValue('jpeg');\r\n }\r\n\r\n this.imageSrc.set(image);\r\n this.arrayCopiedImages = [];\r\n this.arrayCopiedImages.push(this.imageSrc());\r\n this.originImageSrc = image;\r\n this.lastOriginSrc = image;\r\n this.$imageOriginal.next(this.originImageSrc);\r\n this.loadImage.set(true);\r\n this.noEdit.set(true);\r\n } else {\r\n this.imageSrc.set(null);\r\n this.originImageSrc = null;\r\n this.loadImage.set(false);\r\n this.noEdit.set(false);\r\n this.arrayCopiedImages = [];\r\n this.lastOriginSrc = null;\r\n this.$imageOriginal.next(null);\r\n this.format.setValue('jpeg');\r\n this.maxHeight = 2000;\r\n this.maxWidth = 2000;\r\n this.cropHeight.setValue(150);\r\n this.cropWidth.setValue(150);\r\n this.maintainAspectRatio.setValue(true);\r\n this.showEditPanel.set(false);\r\n }\r\n }\r\n\r\n @Input() set _config(value: ImagePickerConf) {\r\n if (value && value.constructor == Object) {\r\n this.config.set({\r\n ...this.config(),\r\n ...value,\r\n })\r\n }\r\n }\r\n\r\n private async handleReaderLoaded(readerEvt: {target: {result: any;};}): Promise<void> {\r\n const binaryString: string = readerEvt.target.result;\r\n const base64textString: string = btoa(binaryString);\r\n this.originImageSrc = this.urlImage + base64textString;\r\n this.lastOriginSrc = this.urlImage + base64textString;\r\n if (this.config()?.compressInitial) {\r\n this.quality.setValue(70);\r\n const input: ImageConverterInput = {\r\n dataType: this.format.value,\r\n quality: 0.70,\r\n maintainRatio: true,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.urlImage + base64textString, input));\r\n } else {\r\n this.imageSrc.set(this.urlImage + base64textString);\r\n this.arrayCopiedImages = [];\r\n this.arrayCopiedImages.push({\r\n lastImage: this.imageSrc(),\r\n width: this.maxWidth,\r\n height: this.maxHeight,\r\n quality: this.quality.value,\r\n });\r\n this.$imageOriginal.next(this.imageSrc());\r\n }\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n }\r\n\r\n private async resizeDataURL(datas: string, input: ImageConverterInput): Promise<any> {\r\n return await new Promise(async function (resolve): Promise<void> {\r\n let img: HTMLImageElement = document.createElement('img');\r\n img.src = datas + '';\r\n img.crossOrigin = 'Anonymous';\r\n let quality: number = input?.quality ?? 1.0;\r\n let maintainRatio: boolean = input.maintainRatio !== undefined ? input.maintainRatio : true;\r\n\r\n img.onload = function (): void {\r\n const canvas: HTMLCanvasElement = document.createElement('canvas');\r\n const ctx: CanvasRenderingContext2D = canvas.getContext('2d');\r\n let ratio: number = img.width / img.height;\r\n let width: number = input?.width ?? img.width;\r\n let height: number = input?.height ?? img.height;\r\n\r\n if (maintainRatio) {\r\n if (input.changeHeight) {\r\n canvas.width = height * ratio;\r\n canvas.height = height;\r\n } else {\r\n canvas.width = width;\r\n canvas.height = width / ratio;\r\n }\r\n } else {\r\n canvas.width = width;\r\n canvas.height = height;\r\n }\r\n\r\n ctx?.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n let type: string = input?.dataType ?? 'webp';\r\n const dataURI: string = canvas.toDataURL(`image/${type}`, quality);\r\n resolve({\r\n dataUri: dataURI,\r\n width: canvas.width,\r\n height: canvas.height,\r\n });\r\n };\r\n }).then((data: any) => {\r\n this.maxHeight = data?.height;\r\n this.maxWidth = data?.width;\r\n if (this.arrayCopiedImages?.length <= 20) {\r\n this.arrayCopiedImages.push({\r\n lastImage: data?.dataUri,\r\n width: this.maxWidth,\r\n height: this.maxHeight,\r\n quality: this.quality.value,\r\n });\r\n }\r\n\r\n return data.dataUri;\r\n });\r\n }\r\n\r\n private wait(ms?: number | undefined): Promise<any> {\r\n ms = ms ?? 1000;\r\n return new Promise((resolve): void => {\r\n setTimeout(() => {\r\n return resolve(true);\r\n }, ms);\r\n });\r\n }\r\n\r\n private dragElement(element: HTMLElement): void {\r\n let pos1: number = 0, pos2: number = 0, pos3: number = 0, pos4: number = 0;\r\n\r\n let el: HTMLElement = document.getElementById(element.id + '-header');\r\n if (el) {\r\n el.onmousedown = dragMouseDown;\r\n el.ontouchstart = dragMouseDown;\r\n } else {\r\n element.onmousedown = dragMouseDown;\r\n element.ontouchstart = dragMouseDown;\r\n }\r\n\r\n function dragMouseDown(e: any): void {\r\n e = e || window.event;\r\n e?.preventDefault();\r\n pos3 = e?.clientX;\r\n pos4 = e?.clientY;\r\n document.onmouseup = closeDragElement;\r\n document.ontouchend = closeDragElement;\r\n document.onmousemove = elementDrag;\r\n document.ontouchmove = elementDrag;\r\n }\r\n\r\n function elementDrag(e: any): void {\r\n let holderImage: any = document.getElementById('image-full');\r\n e = e || window.event;\r\n e?.preventDefault();\r\n pos1 = pos3 - e?.clientX;\r\n pos2 = pos4 - e?.clientY;\r\n pos3 = e?.clientX;\r\n pos4 = e?.clientY;\r\n\r\n const newTop: number = element.offsetTop - pos2;\r\n const newLeft: number = element.offsetLeft - pos1;\r\n const rectHolder = holderImage.getBoundingClientRect();\r\n const rectElement: DOMRect = element.getBoundingClientRect();\r\n if (newTop >= rectHolder.y + 8) {\r\n element.style.top = Math.min(newTop, rectHolder.y + rectHolder.height - rectElement.height - 4) + 'px';\r\n }\r\n if (newLeft > rectHolder.x + 4 && rectHolder.x + rectHolder.width > rectElement.x + rectElement.width + 2) {\r\n element.style.left = Math.min(newLeft, rectHolder.x + rectHolder.width - rectElement.width - 4) + 'px';\r\n }\r\n }\r\n\r\n function closeDragElement(): void {\r\n document.onmouseup = null;\r\n document.onmousemove = null;\r\n document.ontouchend = null;\r\n document.ontouchmove = null;\r\n }\r\n }\r\n\r\n public onUpload(event: {preventDefault: () => void;}): void {\r\n event.preventDefault();\r\n this.imagePicker?.nativeElement.click();\r\n }\r\n\r\n public handleFileSelect(evt: any): void {\r\n const files = evt?.target?.files;\r\n if (files) {\r\n const file = files[0];\r\n this.imageName.set(file?.name?.split('.')[0]);\r\n this.urlImage = `data:${file?.type};base64,`;\r\n this.noEdit.set(false);\r\n\r\n if (files && file) {\r\n const reader: any = new FileReader();\r\n reader.onload = this.handleReaderLoaded.bind(this);\r\n reader.readAsBinaryString(file);\r\n }\r\n }\r\n }\r\n\r\n public onCloseEditPanel(): void {\r\n if (this.observer instanceof ResizeObserver) {\r\n let imageCropper: any = document.getElementById('image-cropper');\r\n let imageFull: any = document.getElementById('image-full');\r\n this.observer.unobserve(imageCropper);\r\n this.observer.unobserve(imageFull);\r\n }\r\n this.showCrop.setValue(false);\r\n this.showEditPanel.set(false);\r\n }\r\n\r\n public async onChangeQuality(): Promise<void> {\r\n const qualityItem: number = this.quality.value / 100;\r\n this.maxHeight = this.maxHeight ?? 2000;\r\n this.maxWidth = this.maxWidth ?? 2000;\r\n\r\n await this.wait(250);\r\n try {\r\n const input: ImageConverterInput = {\r\n height: this.maxHeight,\r\n width: this.maxWidth,\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n };\r\n\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public async onChangeFormat(): Promise<void> {\r\n let qualityItem: number = this.quality.value / 100;\r\n this.maxHeight = this.maxHeight ?? 2000;\r\n this.maxWidth = this.maxWidth ?? 2000;\r\n\r\n await this.wait(250);\r\n try {\r\n let input: ImageConverterInput = {\r\n height: this.maxHeight,\r\n width: this.maxWidth,\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public async onChangeSize(changeWidth?: any, changeHeight?: any): Promise<void> {\r\n let qualityItem: number = this.quality.value / 100;\r\n this.maxHeight = this.maxHeight ?? 2000;\r\n this.maxWidth = this.maxWidth ?? 2000;\r\n\r\n await this.wait(500);\r\n\r\n try {\r\n let input: ImageConverterInput = {\r\n height: this.maxHeight,\r\n width: this.maxWidth,\r\n dataType: this.format.value,\r\n quality: qualityItem,\r\n maintainRatio: this.maintainAspectRatio.value,\r\n changeHeight: changeHeight,\r\n changeWidth: changeWidth,\r\n };\r\n this.imageSrc.set(await this.resizeDataURL(this.originImageSrc, input));\r\n this.$imageChanged.next(this.imageSrc());\r\n this.loadImage.set(true);\r\n } catch (error) {\r\n this.loadImage.set(true);\r\n }\r\n }\r\n\r\n public onChangeCrop(): void {\r\n const cropper: any = document.getElementById('image-cropper');\r\n cropper.style.width = this.cropWidth.value + 'px';\r\n cropper.style.height = this.cropHeight.value + 'px';\r\n }\r\n\r\n public onCropStateChange(): void {\r\n const cropper: HTMLElement = document.getElementById('image-cropper');\r\n const fullImage: HTMLElement = document.getElementById('image-full');\r\n const aspectRatio: number = fullImage.offsetWidth / fullImage.offsetHeight;\r\n\r\n if (this.showCrop.value) {\r\n cropper.style.opacity = '1.0';\r\n this.dragElement(cropper);\r\n this.observer = new ResizeObserver((entries: ResizeObserverEntry[]): void => {\r\n entries.forEach((entry: ResizeObserverEntry): void => {\r\n if (this.showEditPanel()) {\r\n const elementCropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n\r\n const rectHolder: DOMRect = elementFull.getBoundingClientRect();\r\n const rectElement: DOMRect = elementCropper.getBoundingClientRect();\r\n\r\n const maxWidth: number = rectHolder.x + rectHolder.width - rectElement.x - 4;\r\n const maxHeight: number = rectHolder.y + rectHolder.height - rectElement.y - 4;\r\n\r\n // Obtener el tamaño del área de recorte seleccionada por el usuario\r\n const cropWidth: number = elementCropper.offsetWidth;\r\n const cropHeight: number = elementCropper.offsetHeight;\r\n\r\n // Calcular el ancho y el alto del área de recorte manteniendo la relación de aspecto de la imagen original\r\n let newWidth: number = cropWidth;\r\n let newHeight: number = cropHeight;\r\n\r\n if (this.maintainAspectRatio.value) {\r\n if (cropWidth / cropHeight > aspectRatio) {\r\n newHeight = cropWidth / aspectRatio;\r\n } else {\r\n newWidth = cropHeight * aspectRatio;\r\n }\r\n }\r\n\r\n // Ajustar el ancho y el alto del área de recorte si supera los límites\r\n newWidth = Math.min(newWidth, maxWidth);\r\n newHeight = Math.min(newHeight, maxHeight);\r\n\r\n // Establecer el tamaño y la posición del área de recorte\r\n elementCropper.style.width = `${newWidth}px`;\r\n elementCropper.style.height = `${newHeight}px`;\r\n\r\n this.cropWidth.setValue(rectElement.width);\r\n this.cropHeight.setValue(rectElement.height);\r\n\r\n if (entry.target.id == 'image-full') {\r\n if (rectHolder.top > 0) {\r\n elementCropper.style.top = rectHolder.top + 4 + 'px';\r\n }\r\n elementCropper.style.left = rectHolder.left + 4 + 'px';\r\n }\r\n }\r\n });\r\n });\r\n this.observer.observe(document.getElementById('image-cropper'));\r\n this.observer.observe(document.getElementById('image-full'));\r\n } else {\r\n cropper.style.opacity = '0.0';\r\n if (this.observer instanceof ResizeObserver) {\r\n const elementCropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n this.observer.unobserve(elementCropper);\r\n this.observer.unobserve(elementFull);\r\n }\r\n }\r\n }\r\n\r\n public onCrop(type?: any): void {\r\n type = type ?? this.format.value;\r\n const cropper: HTMLElement = document.getElementById('image-cropper');\r\n const elementFull: HTMLElement = document.getElementById('image-full');\r\n const rectCropper: DOMRect = cropper.getBoundingClientRect();\r\n const dataHolderRect: DOMRect = elementFull.getBoundingClientRect();\r\n const canvas: HTMLCanvasElement = document.createElement('canvas');\r\n new Promise((resolve, reject): void => {\r\n let ctx: CanvasRenderingContext2D | null = canvas.getContext('2d');\r\n let image: HTMLImageElement = new Image();\r\n image.src = this.imageSrc();\r\n image.onload = (): void => {\r\n let ratio: number = image.height / dataHolderRect.height;\r\n let newWidth: number = rectCropper.width * ratio;\r\n let newHeight: number = rectCropper.height * ratio;\r\n canvas.width = newWidth;\r\n canvas.height = newHeight;\r\n ctx?.drawImage(\r\n image,\r\n Math.abs(rectCropper.x * ratio) - Math.abs(dataHolderRect.x * ratio),\r\n Math.abs(rectCropper.y * ratio) - Math.abs(dataHolderRect.y * ratio),\r\n newWidth,\r\n newHeight,\r\n 0,\r\n 0,\r\n newWidth,\r\n newHeight,\r\n );\r\n\r\n resolve(canvas.toDataURL(`image/${type}`, this.quality.value));\r\n };\r\n image.onerror = (e: string | Event): void => {\r\n reject(e);\r\n };\r\n })\r\n .then((dataUri: any): void => {\r\n this.imageSrc.set(dataUri);\r\n this.showCrop.setValue(false);\r\n this.onCropStateChange();\r\n this.maxWidth = canvas?.width;\r\n this.maxHeight = canvas?.height;\r\n this.lastOriginSrc = this.originImageSrc + '';\r\n this.originImageSrc = dataUri;\r\n this.$imageChanged.next(this.imageSrc());\r\n })\r\n .catch((e): void => {\r\n console.log(e);\r\n });\r\n }\r\n\r\n public onRestore(): void {\r\n if (this.arrayCopiedImages.length) {\r\n let lastState = this.arrayCopiedImages.pop();\r\n this.imageSrc.set(lastState.lastImage);\r\n this.maxWidth = lastState.width;\r\n this.maxHeight = lastState.height;\r\n this.originImageSrc = this.lastOriginSrc + '';\r\n this.noEdit.set(false);\r\n } else {\r\n this.imageSrc.set(this.lastOriginSrc);\r\n this.originImageSrc = this.lastOriginSrc + '';\r\n this.noEdit.set(false);\r\n }\r\n\r\n this.$imageChanged.next(this.imageSrc());\r\n }\r\n\r\n public onRemove(): void {\r\n this.imageSrc.set(null);\r\n this.originImageSrc = null;\r\n this.loadImage.set(false);\r\n this.arrayCopiedImages = [];\r\n this.lastOriginSrc = null;\r\n this.$imageOriginal.next(null);\r\n this.$imageChanged.next(null);\r\n this.format.setValue('jpeg');\r\n this.maxHeight = 2000;\r\n this.maxWidth = 2000;\r\n this.cropHeight.setValue(150);\r\n this.cropWidth.setValue(150);\r\n this.maintainAspectRatio.setValue(true);\r\n this.showEditPanel.set(false);\r\n this.noEdit.set(false);\r\n this.imageRemoved.emit();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.unsubscribeAll$.next();\r\n this.unsubscribeAll$.complete();\r\n }\r\n}\r\n","@if (!loadImage()) {\n <div class='place-image'>\n <div class='image-holder'\n [ngStyle]='{ width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <button [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\" class='image-upload-btn' mat-icon-button\n (click)='onUpload($event)'>\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n </div>\n}\n\n@if (loadImage()) {\n <div class='place-image'>\n <div class='image-holder-loaded'\n [ngStyle]='{width: config()?.width,height: config()?.height,borderRadius: config()?.borderRadius}'>\n <img [src]='imageSrc()' alt='image-loaded' [ngStyle]='{ borderRadius: config()?.borderRadius }'>\n <input #imagePicker type='file' class='d-none' [id]=\"'filePicker-' + uuidFilePicker\"\n (change)='handleFileSelect($event)' [accept]='imagesAllowed'>\n </div>\n @if (imageSrc()?.length) {\n <p class='mat-caption image-caption' [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{ \"SIZE\" | i18n: currentLanguage() }}: {{ (imageSrc()?.length | calculateSize) }}Kb &nbsp; {{ format.value }}\n </p>\n }\n <div class='editing-bar-btn'>\n @if (!config()?.hideAddBtn) {\n <button id='upload-img' mat-icon-button (click)='onUpload($event)'\n [matTooltip]=\"'UPLOAD_A_IMAGE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>add_a_photo</mat-icon>\n </button>\n }\n @if (!config()?.hideEditBtn && !noEdit()) {\n <button id='edit-img' mat-icon-button (click)='showEditPanel.set(true)'\n [matTooltip]=\"'OPEN_EDITOR_PANEL' | i18n: config()?.language\">\n <mat-icon class='mat-18'>edit</mat-icon>\n </button>\n }\n @if (!config()?.hideDownloadBtn) {\n <a id='download-img' [matTooltip]=\"'DOWNLOAD' | i18n: config()?.language\"\n [href]='imageSrc()' mat-icon-button [download]='imageName'>\n <mat-icon class='mat-18'>cloud_download</mat-icon>\n </a>\n }\n @if (!config()?.hideDeleteBtn) {\n <button id='delete-img' mat-icon-button (click)='onRemove()'\n [matTooltip]=\"'REMOVE' | i18n: config()?.language\">\n <mat-icon class='mat-18'>delete</mat-icon>\n </button>\n }\n </div>\n </div>\n}\n\n@if (showEditPanel()) {\n <div id='popup' class='popup'>\n <div class='popup-clear'>\n <button mat-icon-button (click)='onCloseEditPanel()'>\n <mat-icon class='mat-18'>clear</mat-icon>\n </button>\n </div>\n <div class='image-container'>\n <div class='image-holder-full'>\n <img id='image-full' [src]='imageSrc()' alt=''>\n <div id='image-cropper' class='image-cropper'>\n <div id='image-cropper-header'>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n </div>\n </div>\n <div class='control-panel'>\n <p class='item-panel fw-600'>{{ 'QUALITY' | i18n: config()?.language }}</p>\n <div class='quality-container'>\n <mat-slider ngDefaultControl [color]='color' class='w-100 mw-100' (change)='onChangeQuality()'\n [max]='100' [min]='0' [step]='1' [discrete]='true' [showTickMarks]='true'>\n <input matSliderThumb [formControl]='quality'>\n </mat-slider>\n </div>\n <div class='item-panel'>\n <span class='fw-600'>{{ 'MAX_DIMENSIONS' | i18n: config()?.language }}</span>\n <mat-checkbox class='float-right' [formControl]='maintainAspectRatio' [color]='color'>\n <span>{{ 'ASPECT_RATIO' | i18n: config()?.language }}</span>\n </mat-checkbox>\n </div>\n <div class='max-dimension-container'>\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(true, false)' matInput\n [placeholder]=\"'MAX_WIDTH_PX' | i18n: config()?.language\"\n [(ngModel)]='maxWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n <mat-form-field class='w-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'MAX_HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeSize(false, true)' matInput\n [placeholder]=\"'MAX_HEIGHT_PX' | i18n: config()?.language\"\n [(ngModel)]='maxHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n <p class='item-panel fw-600'>{{ 'FORMAT' | i18n: config()?.language }}</p>\n <div class='formats-selection'>\n <mat-form-field class='w-100 mw-100' [appearance]='appearance' [color]='color'>\n <mat-select [formControl]='format' (selectionChange)='onChangeFormat()'>\n @for (format of allFormats; track format) {\n <mat-option [value]='format'>\n {{ format }}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div>\n <div class='refresh-container'>\n <mat-checkbox (change)='onCropStateChange()' [formControl]='showCrop' [color]='color'>\n <p class='item-panel fw-600'>{{ 'CROP' | i18n: config()?.language }}</p>\n </mat-checkbox>\n <div class='d-flex '>\n <button class='float-right' mat-icon-button [color]='color' (click)='onRestore()'>\n <mat-icon>refresh</mat-icon>\n </button>\n @if (showCrop.value) {\n <p>\n <button mat-icon-button [color]='color' (click)='onCrop()'>\n <mat-icon>crop</mat-icon>\n </button>\n </p>\n }\n </div>\n </div>\n @if (showCrop.value) {\n <div class='dimension-container'>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'WIDTH_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'WIDTH_PX' | i18n: config()?.language\"\n [formControl]='cropWidth' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n <mat-form-field class='w-48 mw-48' [appearance]='appearance' [color]='color'>\n <mat-label>{{ 'HEIGHT_PX' | i18n: config()?.language }}</mat-label>\n <input (change)='onChangeCrop()' matInput [placeholder]=\"'HEIGHT_PX' | i18n: config()?.language\"\n [formControl]='cropHeight' type='number' [min]='0' [max]='2000'>\n </mat-form-field>\n </div>\n }\n <div class='save-container'>\n <button mat-flat-button (click)='onCloseEditPanel()' [color]='color' class='save-button'>\n {{ 'SAVE' | i18n: config()?.language }}\n </button>\n @if (imageSrc()?.length) {\n <p class='mat-caption image-caption'\n [class.warn]='(imageSrc()?.length | calculateSize) > 200'\n [class.fw-600]='(imageSrc()?.length | calculateSize) > 200'>\n {{ \"SIZE\" | i18n: currentLanguage() }}: {{ (imageSrc()?.length | calculateSize) }}Kb\n &nbsp; {{ format.value }}\n </p>\n }\n </div>\n </div>\n </div>\n </div>\n}\n","/*\r\n * Public API Surface of guachos-image-picker\r\n */\r\n\r\nexport * from './lib/guachos-image-picker.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.I18nPipe","i4.CalculateSizePipe"],"mappings":"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"}
@@ -42,8 +42,8 @@ export declare class GuajiritosImagePicker implements OnDestroy {
42
42
  maintainAspectRatio: UntypedFormControl;
43
43
  quality: UntypedFormControl;
44
44
  format: UntypedFormControl;
45
- maxHeight: WritableSignal<number>;
46
- maxWidth: WritableSignal<number>;
45
+ maxHeight: number;
46
+ maxWidth: number;
47
47
  cropHeight: UntypedFormControl;
48
48
  cropWidth: UntypedFormControl;
49
49
  imageName: WritableSignal<string>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guajiritos/image-picker",
3
- "version": "17.1.0",
3
+ "version": "17.1.1",
4
4
  "author": {
5
5
  "name": "Guajiritos SRL",
6
6
  "email": "cto@guajiritos.com",