@bnsights/bbsf-controls 1.0.116 → 1.0.118

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,6 +5,15 @@ BBSF Controls package is part of BBSF 3 packages. It has all the form controls t
5
5
  For more info please visit [BBSF Controls documenation](https://bbsfadmin.bnsights.com/controls) or [BBSF documentation](https://bnsightsprojects.visualstudio.com/BBSF%203/_wiki/wikis/BBSF-3.wiki/65/BBSF-Documentation)
6
6
 
7
7
  # Change Log
8
+ ## 1.0.18 / 8-2-2024
9
+ ===================
10
+ * Update Utilities Library
11
+ * Fix FileUpload Loader issue
12
+
13
+ ## 1.0.117 / 7-2-2024
14
+ ===================
15
+ * Fix MultiligualTextBox Arabic Binding issue
16
+
8
17
  ## 1.0.116 / 7-2-2024
9
18
  ===================
10
19
  * Fix AutoComplate Control Custom Validator Issue
@@ -1,11 +1,10 @@
1
- import { __decorate } from "tslib";
2
- import { Expose } from 'class-transformer';
1
+ // import { Expose, Type } from 'class-transformer';
3
2
  export class EnglishArabicDTO {
3
+ constructor() {
4
+ // @Expose({ name: 'english' })
5
+ this.english = null;
6
+ // @Expose({ name: 'arabic' })
7
+ this.arabic = null;
8
+ }
4
9
  }
5
- __decorate([
6
- Expose({ name: 'english' })
7
- ], EnglishArabicDTO.prototype, "english", void 0);
8
- __decorate([
9
- Expose({ name: 'arabic' })
10
- ], EnglishArabicDTO.prototype, "arabic", void 0);
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5nbGlzaEFyYWJpY0RUTy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9TaGFyZWQvTW9kZWxzL0VuZ2xpc2hBcmFiaWNEVE8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxNQUFNLE9BQU8sZ0JBQWdCO0NBRzVCO0FBRjhCO0lBQTVCLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztpREFBaUI7QUFDakI7SUFBM0IsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO2dEQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXhwb3NlLCBUeXBlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xyXG5leHBvcnQgY2xhc3MgRW5nbGlzaEFyYWJpY0RUTyB7XHJcbiAgQEV4cG9zZSh7IG5hbWU6ICdlbmdsaXNoJyB9KSBlbmdsaXNoOiBzdHJpbmc7XHJcbiAgQEV4cG9zZSh7IG5hbWU6ICdhcmFiaWMnIH0pIGFyYWJpYzogc3RyaW5nXHJcbn1cclxuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5nbGlzaEFyYWJpY0RUTy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9TaGFyZWQvTW9kZWxzL0VuZ2xpc2hBcmFiaWNEVE8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0RBQW9EO0FBQ3BELE1BQU0sT0FBTyxnQkFBZ0I7SUFBN0I7UUFDRSxnQ0FBZ0M7UUFDaEMsWUFBTyxHQUFXLElBQUksQ0FBQztRQUN2QiwrQkFBK0I7UUFDL0IsV0FBTSxHQUFXLElBQUksQ0FBQztJQUN4QixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgeyBFeHBvc2UsIFR5cGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XHJcbmV4cG9ydCBjbGFzcyBFbmdsaXNoQXJhYmljRFRPIHtcclxuICAvLyBARXhwb3NlKHsgbmFtZTogJ2VuZ2xpc2gnIH0pIFxyXG4gIGVuZ2xpc2g6IHN0cmluZyA9IG51bGw7XHJcbiAgLy8gQEV4cG9zZSh7IG5hbWU6ICdhcmFiaWMnIH0pIFxyXG4gIGFyYWJpYzogc3RyaW5nID0gbnVsbDtcclxufVxyXG4iXX0=
@@ -1,7 +1,9 @@
1
1
  import { PagingActionMode } from '../Enums/PagingActionMode';
2
2
  export class FormOptions {
3
3
  constructor() {
4
- //Represents form group of contol
4
+ //Represents from name
5
+ this.formName = null;
6
+ //Represents form group of control
5
7
  this.formGroup = null;
6
8
  //Represents refrence to paging control that needs to be updated after success
7
9
  this.pagingReference = null;
@@ -27,4 +29,4 @@ export class FormOptions {
27
29
  this.disableSubmitWithEnterPress = false;
28
30
  }
29
31
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRm9ybU9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvU2hhcmVkL01vZGVscy9Gb3JtT3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUc3RCxNQUFNLE9BQU8sV0FBVztJQUF4QjtRQUVFLGlDQUFpQztRQUNqQyxjQUFTLEdBQWMsSUFBSSxDQUFDO1FBRTVCLDhFQUE4RTtRQUM5RSxvQkFBZSxHQUF5QixJQUFJLENBQUE7UUFFNUMseUVBQXlFO1FBQ3pFLHFCQUFnQixHQUFxQixnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7UUFFbkUsd0RBQXdEO1FBQ3hELHFCQUFnQixHQUFhLElBQUksQ0FBQztRQUVsQyw0Q0FBNEM7UUFDNUMsMEJBQXFCLEdBQWEsSUFBSSxDQUFDO1FBRXZDLHlEQUF5RDtRQUN6RCxtQkFBYyxHQUFhLElBQUksQ0FBQztRQUVoQywyREFBMkQ7UUFDM0QscUJBQWdCLEdBQWEsSUFBSSxDQUFDO1FBRWxDLDBEQUEwRDtRQUMxRCwrQkFBMEIsR0FBWSxLQUFLLENBQUM7UUFFNUMsd0RBQXdEO1FBQ3hELDZCQUF3QixHQUFZLEtBQUssQ0FBQztRQUUxQyxtREFBbUQ7UUFDbkQsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFaEMscURBQXFEO1FBQ3JELHdCQUFtQixHQUFZLEtBQUssQ0FBQztRQUNyQyw4Q0FBOEM7UUFDOUMsZ0NBQTJCLEdBQVksS0FBSyxDQUFDO0lBQy9DLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYWdpbmdBY3Rpb25Nb2RlIH0gZnJvbSAnLi4vRW51bXMvUGFnaW5nQWN0aW9uTW9kZSc7XHJcbmltcG9ydCB7IFBhZ2luZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL1BhZ2luZy9QYWdpbmcuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBGb3JtT3B0aW9ucyB7XHJcblxyXG4gIC8vUmVwcmVzZW50cyBmb3JtIGdyb3VwIG9mIGNvbnRvbFxyXG4gIGZvcm1Hcm91cDogRm9ybUdyb3VwID0gbnVsbDtcclxuXHJcbiAgLy9SZXByZXNlbnRzwqByZWZyZW5jZSB0byBwYWdpbmcgY29udHJvbCB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgYWZ0ZXIgc3VjY2Vzc1xyXG4gIHBhZ2luZ1JlZmVyZW5jZTogUGFnaW5nQ29tcG9uZW50PGFueT4gPSBudWxsXHJcblxyXG4gIC8vUmVwcmVzZW50cyBwYWdpbmcgYWN0aW9uIGV4Y3V0ZXMgYWZ0ZXIgc3VibWlzc2lvbiAoUmVpbml0aWFsaXplL1VwZGF0ZSlcclxuICBwYWdpbmdBY3Rpb25Nb2RlOiBQYWdpbmdBY3Rpb25Nb2RlID0gUGFnaW5nQWN0aW9uTW9kZS5SZWluaXRpYWxpemU7XHJcblxyXG4gIC8vUmVwcmVzZW50cyBmdW5jdGlvbiB0aGF0IGdldCBmb3JtIG1vZGVsIGZvciBzdWJtaXNzaW9uXHJcbiAgZ2V0TW9kZWxGdW5jdGlvbjogRnVuY3Rpb24gPSBudWxsO1xyXG5cclxuICAvL1JlcHJlc2VudHMgc2VydmljZSBmdW5jdGlvbiBmb3Igc3VibWlzc2lvblxyXG4gIHNlcnZpY2VTdWJtaXRGdW5jdGlvbjogRnVuY3Rpb24gPSBudWxsO1xyXG5cclxuICAvL1JlcHJlc2VudHPCoGZ1bmN0aW9uIHRoYXQgZXhjdXRlcyBhZnRlciBzdWJtaXNzaW9uIGVycm9yXHJcbiAgb25FcnJvckhhbmRsZXI6IEZ1bmN0aW9uID0gbnVsbDtcclxuXHJcbiAgLy9SZXByZXNlbnRzwqBmdW5jdGlvbiB0aGF0IGV4Y3V0ZXMgYWZ0ZXIgc3VibWlzc2lvbiBzdWNjZXNzXHJcbiAgb25TdWNjZXNzSGFuZGxlcjogRnVuY3Rpb24gPSBudWxsO1xyXG5cclxuICAvL0lmID1cInRydWVcIiBkaXNhYmxlIG5vdGlmaWNhdGlvbiBhZnRlciBzdWJtaXNzaW9uIHN1Y2Nlc3NcclxuICBkaXNhYmxlU3VjY2Vzc05vdGlmaWNhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvL0lmID1cInRydWVcIiBkaXNhYmxlIG5vdGlmaWNhdGlvbiBhZnRlciBzdWJtaXNzaW9uIGVycm9yXHJcbiAgZGlzYWJsZUVycm9yTm90aWZpY2F0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vSWYgPVwidHJ1ZVwiIGRpc2FibGUgc3RhcnRibG9ja3VpIGJlZm9yZSBzdWJtaXNzaW9uXHJcbiAgZGlzYWJsZUJsb2NrVUk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy9JZiA9XCJ0cnVlXCIgZGlzYWJsZSBtb2RhbCBmcm9tIGRpc21pc3MgYXV0b21hdGljYWxseVxyXG4gIGRpc2FibGVNb2RhbERpc21pc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvL0lmID1cInRydWVcIiBzdWJtaXQgZm9ybSB3aGVuIHVzZXIgcHJlc3MgZW50ZXJcclxuICBkaXNhYmxlU3VibWl0V2l0aEVudGVyUHJlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxufVxyXG4iXX0=
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRm9ybU9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvU2hhcmVkL01vZGVscy9Gb3JtT3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUc3RCxNQUFNLE9BQU8sV0FBVztJQUF4QjtRQUVFLHNCQUFzQjtRQUN0QixhQUFRLEdBQVcsSUFBSSxDQUFDO1FBRXhCLGtDQUFrQztRQUNsQyxjQUFTLEdBQWMsSUFBSSxDQUFDO1FBRTVCLDhFQUE4RTtRQUM5RSxvQkFBZSxHQUF5QixJQUFJLENBQUE7UUFFNUMseUVBQXlFO1FBQ3pFLHFCQUFnQixHQUFxQixnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7UUFFbkUsd0RBQXdEO1FBQ3hELHFCQUFnQixHQUFhLElBQUksQ0FBQztRQUVsQyw0Q0FBNEM7UUFDNUMsMEJBQXFCLEdBQWEsSUFBSSxDQUFDO1FBRXZDLHlEQUF5RDtRQUN6RCxtQkFBYyxHQUFhLElBQUksQ0FBQztRQUVoQywyREFBMkQ7UUFDM0QscUJBQWdCLEdBQWEsSUFBSSxDQUFDO1FBRWxDLDBEQUEwRDtRQUMxRCwrQkFBMEIsR0FBWSxLQUFLLENBQUM7UUFFNUMsd0RBQXdEO1FBQ3hELDZCQUF3QixHQUFZLEtBQUssQ0FBQztRQUUxQyxtREFBbUQ7UUFDbkQsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFaEMscURBQXFEO1FBQ3JELHdCQUFtQixHQUFZLEtBQUssQ0FBQztRQUNyQyw4Q0FBOEM7UUFDOUMsZ0NBQTJCLEdBQVksS0FBSyxDQUFDO0lBQy9DLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYWdpbmdBY3Rpb25Nb2RlIH0gZnJvbSAnLi4vRW51bXMvUGFnaW5nQWN0aW9uTW9kZSc7XHJcbmltcG9ydCB7IFBhZ2luZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL1BhZ2luZy9QYWdpbmcuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBGb3JtT3B0aW9ucyB7XHJcblxyXG4gIC8vUmVwcmVzZW50cyBmcm9tIG5hbWVcclxuICBmb3JtTmFtZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLy9SZXByZXNlbnRzIGZvcm0gZ3JvdXAgb2YgY29udHJvbFxyXG4gIGZvcm1Hcm91cDogRm9ybUdyb3VwID0gbnVsbDtcclxuXHJcbiAgLy9SZXByZXNlbnRzwqByZWZyZW5jZSB0byBwYWdpbmcgY29udHJvbCB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgYWZ0ZXIgc3VjY2Vzc1xyXG4gIHBhZ2luZ1JlZmVyZW5jZTogUGFnaW5nQ29tcG9uZW50PGFueT4gPSBudWxsXHJcblxyXG4gIC8vUmVwcmVzZW50cyBwYWdpbmcgYWN0aW9uIGV4Y3V0ZXMgYWZ0ZXIgc3VibWlzc2lvbiAoUmVpbml0aWFsaXplL1VwZGF0ZSlcclxuICBwYWdpbmdBY3Rpb25Nb2RlOiBQYWdpbmdBY3Rpb25Nb2RlID0gUGFnaW5nQWN0aW9uTW9kZS5SZWluaXRpYWxpemU7XHJcblxyXG4gIC8vUmVwcmVzZW50cyBmdW5jdGlvbiB0aGF0IGdldCBmb3JtIG1vZGVsIGZvciBzdWJtaXNzaW9uXHJcbiAgZ2V0TW9kZWxGdW5jdGlvbjogRnVuY3Rpb24gPSBudWxsO1xyXG5cclxuICAvL1JlcHJlc2VudHMgc2VydmljZSBmdW5jdGlvbiBmb3Igc3VibWlzc2lvblxyXG4gIHNlcnZpY2VTdWJtaXRGdW5jdGlvbjogRnVuY3Rpb24gPSBudWxsO1xyXG5cclxuICAvL1JlcHJlc2VudHPCoGZ1bmN0aW9uIHRoYXQgZXhjdXRlcyBhZnRlciBzdWJtaXNzaW9uIGVycm9yXHJcbiAgb25FcnJvckhhbmRsZXI6IEZ1bmN0aW9uID0gbnVsbDtcclxuXHJcbiAgLy9SZXByZXNlbnRzwqBmdW5jdGlvbiB0aGF0IGV4Y3V0ZXMgYWZ0ZXIgc3VibWlzc2lvbiBzdWNjZXNzXHJcbiAgb25TdWNjZXNzSGFuZGxlcjogRnVuY3Rpb24gPSBudWxsO1xyXG5cclxuICAvL0lmID1cInRydWVcIiBkaXNhYmxlIG5vdGlmaWNhdGlvbiBhZnRlciBzdWJtaXNzaW9uIHN1Y2Nlc3NcclxuICBkaXNhYmxlU3VjY2Vzc05vdGlmaWNhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvL0lmID1cInRydWVcIiBkaXNhYmxlIG5vdGlmaWNhdGlvbiBhZnRlciBzdWJtaXNzaW9uIGVycm9yXHJcbiAgZGlzYWJsZUVycm9yTm90aWZpY2F0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vSWYgPVwidHJ1ZVwiIGRpc2FibGUgc3RhcnRibG9ja3VpIGJlZm9yZSBzdWJtaXNzaW9uXHJcbiAgZGlzYWJsZUJsb2NrVUk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy9JZiA9XCJ0cnVlXCIgZGlzYWJsZSBtb2RhbCBmcm9tIGRpc21pc3MgYXV0b21hdGljYWxseVxyXG4gIGRpc2FibGVNb2RhbERpc21pc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvL0lmID1cInRydWVcIiBzdWJtaXQgZm9ybSB3aGVuIHVzZXIgcHJlc3MgZW50ZXJcclxuICBkaXNhYmxlU3VibWl0V2l0aEVudGVyUHJlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxufVxyXG4iXX0=
@@ -492,11 +492,11 @@ export class FileUploadComponent {
492
492
  return roundedMegabytes;
493
493
  }
494
494
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FileUploadComponent, deps: [{ token: i1.ControlContainer, optional: true }, { token: i1.FormGroupDirective }, { token: i2.ControlUtility }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }, { token: i5.FileUploadService }], target: i0.ɵɵFactoryTarget.Component }); }
495
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: FileUploadComponent, selector: "BBSF-FileUplaod", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange", isUploadComplete: "isUploadComplete" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-file-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div ng2FileDrop class=\"bbsf-input-container {{options.extraClasses}}\"\r\n *ngIf=\"(options.isDropZone)&&(!((options.isMultipleFile==false)&&(uploader.queue.length)>0))&&!options.isReadonly\"\r\n [ngClass]=\"{'another-file-over-class': hasAnotherDropZoneOver}\" (onFileDrop)=\"onFileChange()\"\r\n (fileOver)=\"fileOverAnother($event)\" [uploader]=\"uploader\" [accept]=\"acceptedType\" (change)=\"onFileChange()\"\r\n id=\"{{options.name}}\" multiple=\"{{options.isMultipleFile?'multiple':''}}\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" type=\"file\" formControlName=\"{{options.name}}\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg text-center\">{{UtilityService.getResourceValue(\"DragAndDropHere\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"validationCountMessage &&options.isMultipleFile &&options.maxNoOfFiles>0\"\r\n [innerHTML]=\"validationCountMessage\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"(!options.isDropZone)&&!(isHideInput())&&!options.isReadonly\"\r\n (click)=\"fileInput.click();\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg text-center\">{{UtilityService.getResourceValue(\"Upload\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"validationCountMessage &&options.isMultipleFile &&options.maxNoOfFiles>0\"\r\n [innerHTML]=\"validationCountMessage\"></div>\r\n </div>\r\n </div>\r\n <input ng2FileSelect [uploader]=\"uploader\" [accept]=\"acceptedType\"\r\n class=\"fileSelector customFileUploadPlacment hidden v-required-multiplefiles d-none\"\r\n multiple=\"{{options.isMultipleFile?'multiple':''}}\" name=\"file\" type=\"file\" value=\"\" autocomplete=\"off\"\r\n (change)=\"onFileChange()\" [ngClass]=\"(options.viewType==1)?'':'col-md-9'\" id=\"{{options.name}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"{{options.name}}\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.isReadonly && !options.value\">\r\n <span class=\"readonly-view\">{{UtilityService.getResourceValue('NA')}}</span>\r\n </div>\r\n </div>\r\n <!--items uploaded-->\r\n <div class=\"uploaded-items\">\r\n <div class=\"btn-group\" *ngFor=\"let item of uploader.queue\">\r\n <a ngbTooltip=\"{{item?.progress<100?UtilityService.getResourceValue('Uploading'):UtilityService.getResourceValue('Uploaded')}}: {{item?.progress}}% {{ convertSizeToMB(item?.file?.size)}}MB\"\r\n href=\"{{ item?.file?.rawFile }}\" class=\"btn btn-download-file btn-sm btn-progress-upload\" download>\r\n <svg *ngIf=\"item?._file?.['iD_GUID']&&!item?.progress\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M21 22H3C2.4 22 2 21.6 2 21C2 20.4 2.4 20 3 20H21C21.6 20 22 20.4 22 21C22 21.6 21.6 22 21 22ZM13 13.4V3C13 2.4 12.6 2 12 2C11.4 2 11 2.4 11 3V13.4H13Z\"\r\n fill=\"currentColor\"></path>\r\n <path opacity=\"0.3\" d=\"M7 13.4H17L12.7 17.7C12.3 18.1 11.7 18.1 11.3 17.7L7 13.4Z\" fill=\"currentColor\"></path>\r\n </svg>\r\n <svg *ngIf=\"item?.progress == 100\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path opacity=\"0.4\"\r\n d=\"M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z\"\r\n stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M7.5 12L10.5 15L16.5 9\" stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <div *ngIf=\"item?.progress < 100\" class=\"spinner-border text-muted\" role=\"status\">\r\n <span class=\"sr-only\">Loading...</span>\r\n </div>\r\n <span class=\"file-name\">{{ item?.file?.name }}</span>\r\n <span class=\"upload\" [class.file-uploaded]=\"item?.progress >= 100\" [style.width.%]=\"item?.progress\"\r\n *ngIf=\"item?.progress > 0\">\r\n </span>\r\n </a>\r\n <button *ngIf=\"!options.isReadonly\" class=\"btn btn-download-file btn-sm btn-danger\"\r\n (click)=\"item.remove();removeFromControlValue(item)\">\r\n <i class=\"fa fa-times px-0\"></i>\r\n </button>\r\n\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(fileUploadFormControl.invalid && fileUploadFormControl.touched)\">\r\n {{getErrorValidation(fileUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\"> {{options.labelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n\r\n</div>", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i8.FileDropDirective, selector: "[ng2FileDrop]", inputs: ["uploader"], outputs: ["fileOver", "onFileDrop"] }, { kind: "directive", type: i8.FileSelectDirective, selector: "[ng2FileSelect]", inputs: ["uploader"], outputs: ["onFileSelected"] }, { kind: "directive", type: i9.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i6.KeyValuePipe, name: "keyvalue" }] }); }
495
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: FileUploadComponent, selector: "BBSF-FileUplaod", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange", isUploadComplete: "isUploadComplete" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-file-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div ng2FileDrop class=\"bbsf-input-container {{options.extraClasses}}\"\r\n *ngIf=\"(options.isDropZone)&&(!((options.isMultipleFile==false)&&(uploader.queue.length)>0))&&!options.isReadonly\"\r\n [ngClass]=\"{'another-file-over-class': hasAnotherDropZoneOver}\" (onFileDrop)=\"onFileChange()\"\r\n (fileOver)=\"fileOverAnother($event)\" [uploader]=\"uploader\" [accept]=\"acceptedType\" (change)=\"onFileChange()\"\r\n id=\"{{options.name}}\" multiple=\"{{options.isMultipleFile?'multiple':''}}\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" type=\"file\" formControlName=\"{{options.name}}\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg text-center\">{{UtilityService.getResourceValue(\"DragAndDropHere\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"validationCountMessage &&options.isMultipleFile &&options.maxNoOfFiles>0\"\r\n [innerHTML]=\"validationCountMessage\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"(!options.isDropZone)&&!(isHideInput())&&!options.isReadonly\"\r\n (click)=\"fileInput.click();\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg text-center\">{{UtilityService.getResourceValue(\"Upload\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"validationCountMessage &&options.isMultipleFile &&options.maxNoOfFiles>0\"\r\n [innerHTML]=\"validationCountMessage\"></div>\r\n </div>\r\n </div>\r\n <input ng2FileSelect [uploader]=\"uploader\" [accept]=\"acceptedType\"\r\n class=\"fileSelector customFileUploadPlacment hidden v-required-multiplefiles d-none\"\r\n multiple=\"{{options.isMultipleFile?'multiple':''}}\" name=\"file\" type=\"file\" value=\"\" autocomplete=\"off\"\r\n (change)=\"onFileChange()\" [ngClass]=\"(options.viewType==1)?'':'col-md-9'\" id=\"{{options.name}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"{{options.name}}\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.isReadonly && !options.value\">\r\n <span class=\"readonly-view\">{{UtilityService.getResourceValue('NA')}}</span>\r\n </div>\r\n </div>\r\n <!--items uploaded-->\r\n <div class=\"uploaded-items\">\r\n <div class=\"btn-group\" *ngFor=\"let item of uploader.queue\">\r\n <a ngbTooltip=\"{{item?.progress<100?UtilityService.getResourceValue('Uploading'):UtilityService.getResourceValue('Uploaded')}}: {{item?.progress}}% {{ convertSizeToMB(item?.file?.size)}}MB\"\r\n href=\"{{ item?.file?.rawFile }}\" class=\"btn btn-download-file btn-sm btn-progress-upload\" download>\r\n <svg *ngIf=\"item?._file?.['iD_GUID']&&!item?.progress\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M21 22H3C2.4 22 2 21.6 2 21C2 20.4 2.4 20 3 20H21C21.6 20 22 20.4 22 21C22 21.6 21.6 22 21 22ZM13 13.4V3C13 2.4 12.6 2 12 2C11.4 2 11 2.4 11 3V13.4H13Z\"\r\n fill=\"currentColor\"></path>\r\n <path opacity=\"0.3\" d=\"M7 13.4H17L12.7 17.7C12.3 18.1 11.7 18.1 11.3 17.7L7 13.4Z\" fill=\"currentColor\"></path>\r\n </svg>\r\n <svg *ngIf=\"item?.progress == 100\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path opacity=\"0.4\"\r\n d=\"M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z\"\r\n stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M7.5 12L10.5 15L16.5 9\" stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <div *ngIf=\"item?.progress < 100&&options.isUploadFileAsync\" class=\"spinner-border text-muted\" role=\"status\">\r\n <span class=\"sr-only\">Loading...</span>\r\n </div>\r\n <span class=\"file-name\">{{ item?.file?.name }}</span>\r\n <span class=\"upload\" [class.file-uploaded]=\"item?.progress >= 100\" [style.width.%]=\"item?.progress\"\r\n *ngIf=\"item?.progress > 0\">\r\n </span>\r\n </a>\r\n <button *ngIf=\"!options.isReadonly\" class=\"btn btn-download-file btn-sm btn-danger\"\r\n (click)=\"item.remove();removeFromControlValue(item)\">\r\n <i class=\"fa fa-times px-0\"></i>\r\n </button>\r\n\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(fileUploadFormControl.invalid && fileUploadFormControl.touched)\">\r\n {{getErrorValidation(fileUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\"> {{options.labelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n\r\n</div>", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i8.FileDropDirective, selector: "[ng2FileDrop]", inputs: ["uploader"], outputs: ["fileOver", "onFileDrop"] }, { kind: "directive", type: i8.FileSelectDirective, selector: "[ng2FileSelect]", inputs: ["uploader"], outputs: ["onFileSelected"] }, { kind: "directive", type: i9.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i6.KeyValuePipe, name: "keyvalue" }] }); }
496
496
  }
497
497
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: FileUploadComponent, decorators: [{
498
498
  type: Component,
499
- args: [{ selector: 'BBSF-FileUplaod', template: "<div class=\"form-group bbsf-control bbsf-file-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div ng2FileDrop class=\"bbsf-input-container {{options.extraClasses}}\"\r\n *ngIf=\"(options.isDropZone)&&(!((options.isMultipleFile==false)&&(uploader.queue.length)>0))&&!options.isReadonly\"\r\n [ngClass]=\"{'another-file-over-class': hasAnotherDropZoneOver}\" (onFileDrop)=\"onFileChange()\"\r\n (fileOver)=\"fileOverAnother($event)\" [uploader]=\"uploader\" [accept]=\"acceptedType\" (change)=\"onFileChange()\"\r\n id=\"{{options.name}}\" multiple=\"{{options.isMultipleFile?'multiple':''}}\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" type=\"file\" formControlName=\"{{options.name}}\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg text-center\">{{UtilityService.getResourceValue(\"DragAndDropHere\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"validationCountMessage &&options.isMultipleFile &&options.maxNoOfFiles>0\"\r\n [innerHTML]=\"validationCountMessage\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"(!options.isDropZone)&&!(isHideInput())&&!options.isReadonly\"\r\n (click)=\"fileInput.click();\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg text-center\">{{UtilityService.getResourceValue(\"Upload\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"validationCountMessage &&options.isMultipleFile &&options.maxNoOfFiles>0\"\r\n [innerHTML]=\"validationCountMessage\"></div>\r\n </div>\r\n </div>\r\n <input ng2FileSelect [uploader]=\"uploader\" [accept]=\"acceptedType\"\r\n class=\"fileSelector customFileUploadPlacment hidden v-required-multiplefiles d-none\"\r\n multiple=\"{{options.isMultipleFile?'multiple':''}}\" name=\"file\" type=\"file\" value=\"\" autocomplete=\"off\"\r\n (change)=\"onFileChange()\" [ngClass]=\"(options.viewType==1)?'':'col-md-9'\" id=\"{{options.name}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"{{options.name}}\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.isReadonly && !options.value\">\r\n <span class=\"readonly-view\">{{UtilityService.getResourceValue('NA')}}</span>\r\n </div>\r\n </div>\r\n <!--items uploaded-->\r\n <div class=\"uploaded-items\">\r\n <div class=\"btn-group\" *ngFor=\"let item of uploader.queue\">\r\n <a ngbTooltip=\"{{item?.progress<100?UtilityService.getResourceValue('Uploading'):UtilityService.getResourceValue('Uploaded')}}: {{item?.progress}}% {{ convertSizeToMB(item?.file?.size)}}MB\"\r\n href=\"{{ item?.file?.rawFile }}\" class=\"btn btn-download-file btn-sm btn-progress-upload\" download>\r\n <svg *ngIf=\"item?._file?.['iD_GUID']&&!item?.progress\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M21 22H3C2.4 22 2 21.6 2 21C2 20.4 2.4 20 3 20H21C21.6 20 22 20.4 22 21C22 21.6 21.6 22 21 22ZM13 13.4V3C13 2.4 12.6 2 12 2C11.4 2 11 2.4 11 3V13.4H13Z\"\r\n fill=\"currentColor\"></path>\r\n <path opacity=\"0.3\" d=\"M7 13.4H17L12.7 17.7C12.3 18.1 11.7 18.1 11.3 17.7L7 13.4Z\" fill=\"currentColor\"></path>\r\n </svg>\r\n <svg *ngIf=\"item?.progress == 100\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path opacity=\"0.4\"\r\n d=\"M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z\"\r\n stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M7.5 12L10.5 15L16.5 9\" stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <div *ngIf=\"item?.progress < 100\" class=\"spinner-border text-muted\" role=\"status\">\r\n <span class=\"sr-only\">Loading...</span>\r\n </div>\r\n <span class=\"file-name\">{{ item?.file?.name }}</span>\r\n <span class=\"upload\" [class.file-uploaded]=\"item?.progress >= 100\" [style.width.%]=\"item?.progress\"\r\n *ngIf=\"item?.progress > 0\">\r\n </span>\r\n </a>\r\n <button *ngIf=\"!options.isReadonly\" class=\"btn btn-download-file btn-sm btn-danger\"\r\n (click)=\"item.remove();removeFromControlValue(item)\">\r\n <i class=\"fa fa-times px-0\"></i>\r\n </button>\r\n\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(fileUploadFormControl.invalid && fileUploadFormControl.touched)\">\r\n {{getErrorValidation(fileUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\"> {{options.labelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n\r\n</div>" }]
499
+ args: [{ selector: 'BBSF-FileUplaod', template: "<div class=\"form-group bbsf-control bbsf-file-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.viewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.hideLabel\" class=\"bbsf-label {{options.labelExtraClasses}}\">\r\n {{options.labelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.showAsterisk&&options.isRequired)||(options.isRequired))&&!options.isReadonly\"\r\n class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div ng2FileDrop class=\"bbsf-input-container {{options.extraClasses}}\"\r\n *ngIf=\"(options.isDropZone)&&(!((options.isMultipleFile==false)&&(uploader.queue.length)>0))&&!options.isReadonly\"\r\n [ngClass]=\"{'another-file-over-class': hasAnotherDropZoneOver}\" (onFileDrop)=\"onFileChange()\"\r\n (fileOver)=\"fileOverAnother($event)\" [uploader]=\"uploader\" [accept]=\"acceptedType\" (change)=\"onFileChange()\"\r\n id=\"{{options.name}}\" multiple=\"{{options.isMultipleFile?'multiple':''}}\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" type=\"file\" formControlName=\"{{options.name}}\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg text-center\">{{UtilityService.getResourceValue(\"DragAndDropHere\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"validationCountMessage &&options.isMultipleFile &&options.maxNoOfFiles>0\"\r\n [innerHTML]=\"validationCountMessage\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"(!options.isDropZone)&&!(isHideInput())&&!options.isReadonly\"\r\n (click)=\"fileInput.click();\">\r\n <div class=\"dropzone-label\">\r\n <div class=\"svg-and-validation\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\"\r\n style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg text-center\">{{UtilityService.getResourceValue(\"Upload\")}} </div>\r\n <div class=\"bbsf-validation-msg text-center\" *ngIf=\"validationMessage\" [innerHTML]=\"validationMessage\"></div>\r\n <div class=\"bbsf-validation-msg ng-star-inserted text-center text-danger\"\r\n *ngIf=\"validationCountMessage &&options.isMultipleFile &&options.maxNoOfFiles>0\"\r\n [innerHTML]=\"validationCountMessage\"></div>\r\n </div>\r\n </div>\r\n <input ng2FileSelect [uploader]=\"uploader\" [accept]=\"acceptedType\"\r\n class=\"fileSelector customFileUploadPlacment hidden v-required-multiplefiles d-none\"\r\n multiple=\"{{options.isMultipleFile?'multiple':''}}\" name=\"file\" type=\"file\" value=\"\" autocomplete=\"off\"\r\n (change)=\"onFileChange()\" [ngClass]=\"(options.viewType==1)?'':'col-md-9'\" id=\"{{options.name}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"{{options.name}}\" #fileInput\r\n [class.is-invalid]=\"fileUploadFormControl.invalid && fileUploadFormControl.touched\">\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.isReadonly && !options.value\">\r\n <span class=\"readonly-view\">{{UtilityService.getResourceValue('NA')}}</span>\r\n </div>\r\n </div>\r\n <!--items uploaded-->\r\n <div class=\"uploaded-items\">\r\n <div class=\"btn-group\" *ngFor=\"let item of uploader.queue\">\r\n <a ngbTooltip=\"{{item?.progress<100?UtilityService.getResourceValue('Uploading'):UtilityService.getResourceValue('Uploaded')}}: {{item?.progress}}% {{ convertSizeToMB(item?.file?.size)}}MB\"\r\n href=\"{{ item?.file?.rawFile }}\" class=\"btn btn-download-file btn-sm btn-progress-upload\" download>\r\n <svg *ngIf=\"item?._file?.['iD_GUID']&&!item?.progress\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M21 22H3C2.4 22 2 21.6 2 21C2 20.4 2.4 20 3 20H21C21.6 20 22 20.4 22 21C22 21.6 21.6 22 21 22ZM13 13.4V3C13 2.4 12.6 2 12 2C11.4 2 11 2.4 11 3V13.4H13Z\"\r\n fill=\"currentColor\"></path>\r\n <path opacity=\"0.3\" d=\"M7 13.4H17L12.7 17.7C12.3 18.1 11.7 18.1 11.3 17.7L7 13.4Z\" fill=\"currentColor\"></path>\r\n </svg>\r\n <svg *ngIf=\"item?.progress == 100\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path opacity=\"0.4\"\r\n d=\"M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z\"\r\n stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M7.5 12L10.5 15L16.5 9\" stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <div *ngIf=\"item?.progress < 100&&options.isUploadFileAsync\" class=\"spinner-border text-muted\" role=\"status\">\r\n <span class=\"sr-only\">Loading...</span>\r\n </div>\r\n <span class=\"file-name\">{{ item?.file?.name }}</span>\r\n <span class=\"upload\" [class.file-uploaded]=\"item?.progress >= 100\" [style.width.%]=\"item?.progress\"\r\n *ngIf=\"item?.progress > 0\">\r\n </span>\r\n </a>\r\n <button *ngIf=\"!options.isReadonly\" class=\"btn btn-download-file btn-sm btn-danger\"\r\n (click)=\"item.remove();removeFromControlValue(item)\">\r\n <i class=\"fa fa-times px-0\"></i>\r\n </button>\r\n\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.isReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(fileUploadFormControl.invalid && fileUploadFormControl.touched)\">\r\n {{getErrorValidation(fileUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.labelDescription!=null\"> {{options.labelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">\r\n {{resetError()}}</div>\r\n </div>\r\n\r\n</div>" }]
500
500
  }], ctorParameters: () => [{ type: i1.ControlContainer, decorators: [{
501
501
  type: Optional
502
502
  }] }, { type: i1.FormGroupDirective }, { type: i2.ControlUtility }, { type: i3.UtilityService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }, { type: i5.FileUploadService }], propDecorators: { fileInput: [{
@@ -511,4 +511,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
511
511
  }], isUploadComplete: [{
512
512
  type: Output
513
513
  }] } });
514
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZVVwbGFvZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvY29udHJvbHMvRmlsZVVwbGFvZC9GaWxlVXBsYW9kLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9GaWxlVXBsYW9kL0ZpbGVVcGxhb2QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFFVCxNQUFNLEVBQ04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsVUFBVSxHQUtYLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLFlBQVksRUFBaUQsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFTdEYsT0FBTyxFQUFjLGFBQWEsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFNcEYsTUFBTSxPQUFPLG1CQUFtQjthQUN2QiwyQkFBc0IsR0FBRyxJQUFJLEFBQVAsQ0FBUTtJQTJCckMsWUFDc0IsZ0JBQWtDLEVBQy9DLDZCQUFpRCxFQUNoRCxjQUE4QixFQUMvQixjQUE4QixFQUM3Qix3QkFBa0QsRUFDbEQsY0FBOEIsRUFDOUIsaUJBQW9DO1FBTnhCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDL0Msa0NBQTZCLEdBQTdCLDZCQUE2QixDQUFvQjtRQUNoRCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzdCLDZCQUF3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Q3JDaEMscTlQQW1ITTs7MkZEOUVPLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDRSxpQkFBaUI7OzBCQWdDeEIsUUFBUTt3T0ExQmdDLFNBQVM7c0JBQW5ELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHaEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBPcHRpb25hbCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1Db250cm9sLFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBDb250cm9sQ29udGFpbmVyLFxyXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9GaWxlVXBsb2FkT3B0aW9ucyc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyLCBGaWxlTGlrZU9iamVjdCwgRmlsZVVwbG9hZGVyT3B0aW9ucywgRmlsZUl0ZW0gfSBmcm9tICduZzItZmlsZS11cGxvYWQnO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkTW9kZWwgfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0ZpbGVVcGxvYWRNb2RlbCc7XHJcbmltcG9ydCB7IE11bHRpcGxlRmlsZVVwbG9hZE1vZGVsIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9NdWx0aXBsZUZpbGVVcGxvYWRNb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgQ29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLFxyXG4gIFV0aWxpdHlTZXJ2aWNlLFxyXG59IGZyb20gJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcyc7XHJcbmltcG9ydCB7IEdsb2JhbFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0dsb2JhbFNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZpbGVEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0ZpbGVEVE8nO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkU2VydmljZSB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9maWxlLXVwbG9hZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ0JCU0YtRmlsZVVwbGFvZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL0ZpbGVVcGxhb2QuY29tcG9uZW50Lmh0bWwnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgc3RhdGljIGNvbnRyb2xDb250YWluZXJzdGF0aWMgPSBudWxsO1xyXG5cclxuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgZmlsZUlucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuICBpc1N1Ym1pdHRlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBncm91cDogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IEZpbGVVcGxvYWRPcHRpb25zO1xyXG4gIEBPdXRwdXQoKSBPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgaXNVcGxvYWRDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgZmlsZVVwbG9hZEZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2w7XHJcbiAgdmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcclxuICB2YWxpZGF0aW9uQ291bnRNZXNzYWdlID0gJyc7XHJcbiAgdXBsb2FkZXI6IEZpbGVVcGxvYWRlcjtcclxuICBoYXNBbm90aGVyRHJvcFpvbmVPdmVyOiBib29sZWFuO1xyXG4gIGFjY2VwdGVkVHlwZTogc3RyaW5nID0gJyc7XHJcbiAgYWNjZXB0ZWRUeXBlQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgdG9vbFRpcFR5cGVBcnJheTogc3RyaW5nW10gPSBbXTtcclxuICBmaWxlTGlrZU9iamVjdDogRmlsZUxpa2VPYmplY3Q7XHJcbiAgbWFya0FsbEFzVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcbiAgZmlsZVVwbG9hZE1vZGVsOiBGaWxlVXBsb2FkTW9kZWw7XHJcbiAgbXVsdGlwbGVGaWxlVXBsb2FkTW9kZWw6IE11bHRpcGxlRmlsZVVwbG9hZE1vZGVsO1xyXG4gIGZpbGU6IGFueTtcclxuICBkZWxldGVkRmlsZXM6IEZpbGVEVE9bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgIHB1YmxpYyBNdWx0aXBsZUZpbGVVcGxhb2RDb250cm9sSG9zdDogRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHksXHJcbiAgICBwdWJsaWMgVXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZ2xvYmFsU2V0dGluZ3M6IEdsb2JhbFNldHRpbmdzLFxyXG4gICAgcHJpdmF0ZSBmaWxlVXBsb2FkU2VydmljZTogRmlsZVVwbG9hZFNlcnZpY2VcclxuICApIHtcclxuICAgIEZpbGVVcGxvYWRDb21wb25lbnQuY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IHRoaXMuY29udHJvbENvbnRhaW5lcjtcclxuICAgIHRoaXMudXBsb2FkZXIgPSBuZXcgRmlsZVVwbG9hZGVyKHtcclxuICAgICAgZGlzYWJsZU11bHRpcGFydDogZmFsc2UsIC8vICdEaXNhYmxlTXVsdGlwYXJ0JyBtdXN0IGJlICd0cnVlJyBmb3IgZm9ybWF0RGF0YUZ1bmN0aW9uIHRvIGJlIGNhbGxlZC5cclxuICAgIH0gYXMgRmlsZVVwbG9hZGVyT3B0aW9ucyk7XHJcbiAgICB0aGlzLmhhc0Fub3RoZXJEcm9wWm9uZU92ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5maWxlVXBsb2FkTW9kZWwgPSBuZXcgRmlsZVVwbG9hZE1vZGVsKCk7XHJcbiAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsID0gbmV3IE11bHRpcGxlRmlsZVVwbG9hZE1vZGVsKCk7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy52aWV3VHlwZSlcclxuICAgICAgdGhpcy5vcHRpb25zLnZpZXdUeXBlID0gdGhpcy5nbG9iYWxTZXR0aW5ncy52aWV3VHlwZTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5pc011bHRpcGxlRmlsZSA9PSB0cnVlKSB7XHJcbiAgICAgICAgLy90aGlzLm9wdGlvbnMuVmFsdWU9dGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHRoaXMub3B0aW9ucy5WYWx1ZT10aGlzLmZpbGVVcGxvYWRNb2RlbFxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlzTXVsdGlwbGVGaWxlID09IHRydWUpIHtcclxuICAgICAgICBsZXQgZmlsZXM6IGFueVtdID0gW107XHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5leGlzdGluZ0ZpbGVzID1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy52YWx1ZS5FeGlzdGluZ0ZpbGVzO1xyXG4gICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwudXBsb2FkZWRGaWxlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoXHJcbiAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgaW5kZXggPCB0aGlzLm9wdGlvbnMudmFsdWUuRXhpc3RpbmdGaWxlcy5sZW5ndGg7XHJcbiAgICAgICAgICBpbmRleCsrXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5vcHRpb25zLnZhbHVlLkV4aXN0aW5nRmlsZXNbaW5kZXhdO1xyXG4gICAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZWxlbWVudC5CeXRlcykgYXMgYW55O1xyXG4gICAgICAgICAgdmFyIGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZShudWxsLCBieXRlcykpO1xyXG4gICAgICAgICAgdGhpcy5maWxlTGlrZU9iamVjdCA9IDxGaWxlTGlrZU9iamVjdD57XHJcbiAgICAgICAgICAgIG5hbWU6IGVsZW1lbnQuTmFtZVdpdGhFeHRlbnNpb24sXHJcbiAgICAgICAgICAgIHR5cGU6IGVsZW1lbnQuTWltZVR5cGUsXHJcbiAgICAgICAgICAgIHJhd0ZpbGU6IDxhbnk+YmFzZTY0XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgLy8gbGV0IGJsb2I6IGFueTtcclxuICAgICAgICAgIC8vIGJsb2IgPSBuZXcgQmxvYihbJyddKSBhcyBhbnk7XHJcbiAgICAgICAgICAvLyBibG9iLm5hbWUgPSBlbGVtZW50LkZpbGVOYW1lO1xyXG4gICAgICAgICAgLy8gYmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbnVsbDtcclxuICAgICAgICAgIC8vIGJsb2Iud2Via2l0UmVsYXRpdmVQYXRoID0gJyc7XHJcbiAgICAgICAgICBsZXQgZmlsZSA9IHRoaXMuZmlsZUxpa2VPYmplY3QgYXMgYW55O1xyXG4gICAgICAgICAgZmlsZS51cmwgPSBlbGVtZW50LkZpbGVVUkw7XHJcbiAgICAgICAgICBmaWxlcy5wdXNoKGZpbGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwbG9hZGVyLmFkZFRvUXVldWUoZmlsZXMpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMudXBsb2FkZXIucXVldWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLm9wdGlvbnMudmFsdWU7XHJcbiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZWxlbWVudC5CeXRlcykgYXMgYW55O1xyXG4gICAgICAgIHZhciBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUobnVsbCwgYnl0ZXMpKTtcclxuICAgICAgICB0aGlzLmZpbGVMaWtlT2JqZWN0ID0gPEZpbGVMaWtlT2JqZWN0PntcclxuICAgICAgICAgIG5hbWU6IGVsZW1lbnQuTmFtZVdpdGhFeHRlbnNpb24sXHJcbiAgICAgICAgICB0eXBlOiBlbGVtZW50Lk1pbWVUeXBlLFxyXG4gICAgICAgICAgcmF3RmlsZTogPGFueT5iYXNlNjQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmZpbGUgPSBlbGVtZW50O1xyXG4gICAgICAgIGxldCBmaWxlID0gdGhpcy5maWxlTGlrZU9iamVjdCBhcyBhbnk7XHJcbiAgICAgICAgZmlsZS51cmwgPSBlbGVtZW50LkZpbGVVUkw7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5hZGRUb1F1ZXVlKFtmaWxlIGFzIGFueV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5sYWJlbEtleSAhPSAnJylcclxuICAgICAgdGhpcy5vcHRpb25zLmxhYmVsVmFsdWUgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsS2V5XHJcbiAgICAgICk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuZmlsZVVwbG9hZEFjY2VwdHNUeXBlcyAhPSBudWxsICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5maWxlVXBsb2FkQWNjZXB0c1R5cGVzLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICBmb3IgKFxyXG4gICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgaW5kZXggPCB0aGlzLm9wdGlvbnMuZmlsZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGg7XHJcbiAgICAgICAgaW5kZXgrK1xyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBUeXBlID0gdGhpcy5vcHRpb25zLmZpbGVVcGxvYWRBY2NlcHRzVHlwZXNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMuYWNjZXB0ZWRUeXBlID0gdGhpcy5hY2NlcHRlZFR5cGUgKyBUeXBlICsgJywnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYWNjZXB0ZWRUeXBlQXJyYXkgPSB0aGlzLmFjY2VwdGVkVHlwZS5zcGxpdCgnLCcpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5hY2NlcHRlZFR5cGVBcnJheS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5hY2NlcHRlZFR5cGVBcnJheVtpbmRleF07XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuYWNjZXB0ZWRUeXBlQXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5hY2NlcHRlZFR5cGVBcnJheVtpbmRleF07XHJcbiAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vcGRmJzpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMudG9vbFRpcFR5cGVBcnJheS5pbmNsdWRlcygnUERGJykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaCgnUERGJyk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL21zd29yZCc6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ1dvcmQnKSlcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbFRpcFR5cGVBcnJheS5wdXNoKCdXb3JkJyk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JzpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMudG9vbFRpcFR5cGVBcnJheS5pbmNsdWRlcygnV29yZCcpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sVGlwVHlwZUFycmF5LnB1c2goJ1dvcmQnKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJzpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMudG9vbFRpcFR5cGVBcnJheS5pbmNsdWRlcygnRXhjZWwnKSlcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbFRpcFR5cGVBcnJheS5wdXNoKCdFeGNlbCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCc6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ0V4Y2VsJykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaCgnRXhjZWwnKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy50b29sVGlwVHlwZUFycmF5LmluY2x1ZGVzKCdQb3dlclBvaW50JykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaCgnUG93ZXJQb2ludCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbmFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy50b29sVGlwVHlwZUFycmF5LmluY2x1ZGVzKCdQb3dlclBvaW50JykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaCgnUG93ZXJQb2ludCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiaW1hZ2UvcG5nXCI6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ1BORycpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sVGlwVHlwZUFycmF5LnB1c2goJ1BORycpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiaW1hZ2UvYm1wXCI6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ0JNUCcpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sVGlwVHlwZUFycmF5LnB1c2goJ0JNUCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiaW1hZ2UvanBlZ1wiOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy50b29sVGlwVHlwZUFycmF5LmluY2x1ZGVzKCdKUEVHJykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaCgnSlBFRycpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID1cclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlICtcclxuICAgICAgICBgJHt0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0V4dGVuc2lvbnMnKX0gKCR7dGhpcy50b29sVGlwVHlwZUFycmF5XHJcbiAgICAgICAgfSkgYDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsZU1heFNpemVJbk1CID4gMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID1cclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlICtcclxuICAgICAgICBgPGJyIC8+ICAke3RoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnRmlsZU1heFNpemVJbk1CJykgKyB0aGlzLm9wdGlvbnMuZmlsZU1heFNpemVJbk1CfSBgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMubWluTm9PZkZpbGVzID4gMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID1cclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlICtcclxuICAgICAgICBgPGJyIC8+ICR7dGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiTWluRmlsZUNvdW50VmFsaWRhdGlvbktleVwiKSArIHRoaXMub3B0aW9ucy5taW5Ob09mRmlsZXN9YDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5maWxlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLmZpbGVVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyb3VwLmFkZENvbnRyb2wodGhpcy5vcHRpb25zLm5hbWUsIG5ldyBGb3JtQ29udHJvbCgnJykpO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wgPSB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5uYW1lXTsgLy8gIG5ldyBGb3JtQ29udHJvbCgnJyx2YWxpZGF0aW9uUnVsZXMpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBWYWxpZGF0aW9ucyA9IHRoaXMub3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVmFsaWRhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25zW2luZGV4XTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRpb24uZnVuY3Rpb25Cb2R5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUgJiYgdGhpcy5vcHRpb25zLm1heE5vT2ZGaWxlcyA+IDApIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uQ291bnRNZXNzYWdlID0gYCR7dGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdNYXhGaWxlc0NvdW50Jyl9IDogJHt0aGlzLm9wdGlvbnMubWF4Tm9PZkZpbGVzfWA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmlzUmVxdWlyZWQpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMudmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlc2FzeW5jKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXNEaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5NdWx0aXBsZUZpbGVVcGxhb2RDb250cm9sSG9zdC5uZ1N1Ym1pdC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZ3JvdXAubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSB0cnVlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5vcHRpb25zLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlTGlzdCAhPSBudWxsKSB7XHJcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vcHRpb25zLm5hbWUpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlTGlzdFtpbmRleF0ua2V5LFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZUxpc3RbaW5kZXhdLnZhbHVlXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRFcnJvciA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLnJlbW92ZUdsb2JhbEVycm9yKCk7XHJcbiAgfTtcclxuXHJcbiAgc2hvd0dsb2JhbEVycm9yKCkge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5zaG93R2xvYmFsRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIGdldEVycm9yVmFsaWRhdGlvbihFcnJvckxpc3QpIHtcclxuICAgIGlmICh0aGlzLm1hcmtBbGxBc1RvdWNoZWQgJiYgdGhpcy5ncm91cC5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0dsb2JhbEVycm9yKCk7XHJcbiAgICAgIHRoaXMubWFya0FsbEFzVG91Y2hlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xVdGlsaXR5LmdldEVycm9yVmFsaWRhdGlvbk1hc3NhZ2UoXHJcbiAgICAgIEVycm9yTGlzdCxcclxuICAgICAgdGhpcy5ncm91cCxcclxuICAgICAgdGhpcy5vcHRpb25zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmlsZU92ZXJBbm90aGVyKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFzQW5vdGhlckRyb3Bab25lT3ZlciA9IGV2ZW50O1xyXG4gIH1cclxuICBpc0hpZGVJbnB1dCgpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhOb09mRmlsZXMgIT0gbnVsbCAmJlxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhOb09mRmlsZXMgPiAwICYmXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm1heE5vT2ZGaWxlcyA9PSB0aGlzLnVwbG9hZGVyLnF1ZXVlLmxlbmd0aFxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMudXBsb2FkZXIucXVldWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIG9uRmlsZUNoYW5nZSgpIHtcclxuICAgIGxldCBGaWxlc0FycmF5ID0gW107XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pc011bHRpcGxlRmlsZSAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMubWluTm9PZkZpbGVzICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLm1pbk5vT2ZGaWxlcyA+IDAgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLm1pbk5vT2ZGaWxlcyA+IHRoaXMudXBsb2FkZXIucXVldWUubGVuZ3RoXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbDtcclxuICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICBNaW5GaWxlQ291bnRWYWxpZGF0aW9uS2V5OiB0aGlzLm9wdGlvbnMubWluTm9PZkZpbGVzLFxyXG4gICAgICB9KTtcclxuICAgICAgZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pc011bHRpcGxlRmlsZSAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZUZvckFsbEZpbGVzSW5NQiAhPSBudWxsICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5tYXhTaXplRm9yQWxsRmlsZXNJbk1CID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBBbGxTaXplRmlsZSA9IDA7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnVwbG9hZGVyLnF1ZXVlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnVwbG9hZGVyLnF1ZXVlW2luZGV4XTtcclxuICAgICAgICBjb25zdCBmaWxlID0gZWxlbWVudC5maWxlO1xyXG4gICAgICAgIEFsbFNpemVGaWxlID0gQWxsU2l6ZUZpbGUgKyBmaWxlLnNpemU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgTWF4U2l6ZUZvckFsbEZpbGVzID1cclxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZUZvckFsbEZpbGVzSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICBpZiAoQWxsU2l6ZUZpbGUgPiBNYXhTaXplRm9yQWxsRmlsZXMpIHtcclxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7XHJcbiAgICAgICAgICBNYXhTaXplRm9yQWxsRmlsZXNJbk1COiB0aGlzLm9wdGlvbnMubWF4U2l6ZUZvckFsbEZpbGVzSW5NQiArICdNJyxcclxuICAgICAgICB9KTtcclxuICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IEFkZGVkUXVldWUgPSB0aGlzLnVwbG9hZGVyLnF1ZXVlLmZpbHRlcihcclxuICAgICAgKG9iamVjdCkgPT4gb2JqZWN0Wydzb21lJ10ubGFzdE1vZGlmaWVkICE9IG51bGxcclxuICAgICk7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgQWRkZWRRdWV1ZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IEFkZGVkUXVldWVbaW5kZXhdO1xyXG4gICAgICBjb25zdCBmaWxlID0gZWxlbWVudC5maWxlO1xyXG4gICAgICBjb25zdCBtYXhGaWxlU2l6ZSA9IHRoaXMub3B0aW9ucy5maWxlTWF4U2l6ZUluTUIgKiAxMDAwICogMTAwMDtcclxuICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICBjb25zdCBmaWxlVHlwZSA9IGZpbGUudHlwZTtcclxuICAgICAgICBpZiAoZmlsZS5zaXplID4gbWF4RmlsZVNpemUpIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgICBmb3JtQ29udHJvbC5zZXRFcnJvcnMoe1xyXG4gICAgICAgICAgICBGaWxlTWF4U2l6ZUluTUI6IHRoaXMub3B0aW9ucy5maWxlTWF4U2l6ZUluTUIgKyAnTScsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgIHRoaXMudXBsb2FkZXIucXVldWUgPSBbXTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmZpbGVVcGxvYWRBY2NlcHRzVHlwZXMgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmZpbGVVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgIShcclxuICAgICAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGVBcnJheS5pbmNsdWRlcyhmaWxlVHlwZS50b1VwcGVyQ2FzZSgpKSB8fFxyXG4gICAgICAgICAgICB0aGlzLmFjY2VwdGVkVHlwZUFycmF5LmluY2x1ZGVzKGZpbGVUeXBlLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgVG9vbFRpcFR5cGVFcnJvcjogdGhpcy50b29sVGlwVHlwZUFycmF5IH0pO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlzVXBsb2FkRmlsZUFzeW5jICYmICF0aGlzLnVwbG9hZGVyLnF1ZXVlW2luZGV4XS5fZmlsZVtcImlEX0dVSURcIl0pIHtcclxuICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZFNlcnZpY2UudXBsb2FkRmlsZSh0aGlzLnVwbG9hZGVyLnF1ZXVlW2luZGV4XS5fZmlsZSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgbmV4dDogKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IE1hdGgucm91bmQoMTAwICogZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWwpXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZXIucXVldWVbaW5kZXhdLnByb2dyZXNzID0gdmFsdWUgPj0gOTUgPyA5NSA6IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlW2luZGV4XS5wcm9ncmVzcyA9IDEwMFxyXG4gICAgICAgICAgICAgICAgICBsZXQgZmlsZUlEID0gZXZlbnQuYm9keS52YWwgYXMgYW55O1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlW2luZGV4XS5fZmlsZVtcImlEX0dVSURcIl0gPSBmaWxlSUQ7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBBZGRlZEZpbGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaURfR1VJRDogZmlsZUlELFxyXG4gICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlzTXVsdGlwbGVGaWxlID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlVXBsb2FkTW9kZWwgPSBuZXcgRmlsZVVwbG9hZE1vZGVsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlVXBsb2FkTW9kZWwuZmlsZSA9IEFkZGVkRmlsZSBhcyBhbnlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpbGVVcGxvYWRNb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLm5hbWUpLnNldFZhbHVlKHRoaXMuZmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudmFsdWUgPSB0aGlzLmZpbGVVcGxvYWRNb2RlbDtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBGaWxlc0FycmF5LnB1c2goQWRkZWRGaWxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLnVwbG9hZGVkRmlsZXMgPSBGaWxlc0FycmF5O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlLkNvcnJlbGF0aW9uSURfR1VJRCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwucmVtb3ZlZEZpbGVzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuY29ycmVsYXRpb25JRF9HVUlEID0gdGhpcy5vcHRpb25zLnZhbHVlPy5Db3JyZWxhdGlvbklEX0dVSURcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwXHJcbiAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vVXNlIHRoaXMgbGluZSB0byBlbmFibGUgdHdvIHdheSBiaW5kaW5nLlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VwbG9hZENvbXBsZXRlLmVtaXQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgbGV0IGZpbGVPYmplY3QgPSBmaWxlLnJhd0ZpbGUgYXMgYW55O1xyXG4gICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZU9iamVjdCk7XHJcbiAgICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZXhpc3RpbmdJRF9HVUlEID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUgJiYgdGhpcy5maWxlKVxyXG4gICAgICAgICAgICAgIGV4aXN0aW5nSURfR1VJRCA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGUuTmFtZVdpdGhFeHRlbnNpb24gPT0gZmlsZS5uYW1lXHJcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5maWxlLmlEX0dVSURcclxuICAgICAgICAgICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgbGV0IEFkZGVkRmlsZTogRmlsZURUTyA9IHtcclxuICAgICAgICAgICAgICBmaWxlTmFtZTogZmlsZS5uYW1lLFxyXG4gICAgICAgICAgICAgIGZpbGVUeXBlOiBmaWxlLnR5cGUsXHJcbiAgICAgICAgICAgICAgZmlsZUJhc2U2NDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLnNwbGl0KCcsJylbMV0sXHJcbiAgICAgICAgICAgICAgZmlsZVNpemVJbk1COiBmaWxlLnNpemUgLyAxMDAwIC8gMTAwMCxcclxuICAgICAgICAgICAgICBuYW1lV2l0aEV4dGVuc2lvbjogZmlsZS5uYW1lLFxyXG4gICAgICAgICAgICAgIGlEX0dVSUQ6IGV4aXN0aW5nSURfR1VJRCxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRNb2RlbCA9IG5ldyBGaWxlVXBsb2FkTW9kZWwoKTtcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRNb2RlbC5maWxlID0gQWRkZWRGaWxlO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpbGVVcGxvYWRNb2RlbCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLm5hbWUpLnNldFZhbHVlKHRoaXMuZmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudmFsdWUgPSB0aGlzLmZpbGVVcGxvYWRNb2RlbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBGaWxlc0FycmF5LnB1c2goQWRkZWRGaWxlKTtcclxuICAgICAgICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLnVwbG9hZGVkRmlsZXMgPSBGaWxlc0FycmF5O1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlLkNvcnJlbGF0aW9uSURfR1VJRCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwucmVtb3ZlZEZpbGVzID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuY29ycmVsYXRpb25JRF9HVUlEID0gdGhpcy5vcHRpb25zLnZhbHVlPy5Db3JyZWxhdGlvbklEX0dVSURcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwXHJcbiAgICAgICAgICAgICAgICAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKVxyXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwpO1xyXG4gICAgICAgICAgICAgIC8vVXNlIHRoaXMgbGluZSB0byBlbmFibGUgdHdvIHdheSBiaW5kaW5nLlxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKS52YWx1ZTtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGNoRnVuY3Rpb24gJiZcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGNoUGF0aCAmJlxyXG4gICAgICAgICAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMubmFtZSkudmFsaWRcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnBhdGNoQ29udHJvbFZhbHVlKFxyXG4gICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGNoRnVuY3Rpb24sXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGNoUGF0aFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5PbkNoYW5nZS5lbWl0KG9yaWdpbmFsVmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShpdGVtOiBGaWxlSXRlbSkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc1VwbG9hZEZpbGVBc3luYyAmJiBpdGVtLnByb2dyZXNzID09IDEwMCkge1xyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRTZXJ2aWNlLmRlbGV0ZUZpbGUoaXRlbS5fZmlsZVtcImlEX0dVSURcIl0pLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUgPT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5maWxlVXBsb2FkTW9kZWwgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKS5zZXRWYWx1ZSh0aGlzLmZpbGVVcGxvYWRNb2RlbCk7XHJcbiAgICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMuZmlsZVVwbG9hZE1vZGVsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWx1ZSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy52YWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlLkNvcnJlbGF0aW9uSURfR1VJRCA9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZWRGaWxlcyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5yZW1vdmVkRmlsZXMgPSBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwucmVtb3ZlZEZpbGVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGxldCBGaWxlT2JqZWN0ID0gaXRlbS5maWxlLnJhd0ZpbGU7XHJcbiAgICAgICAgICAgIGxldCBEZWxldGVkSXRlbSA9IHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuZXhpc3RpbmdGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKE9iamVjdCkgPT4gT2JqZWN0Lm5hbWVXaXRoRXh0ZW5zaW9uID09IEZpbGVPYmplY3QubmFtZVxyXG4gICAgICAgICAgICApWzBdO1xyXG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLmV4aXN0aW5nRmlsZXMgPVxyXG4gICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuZXhpc3RpbmdGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAoT2JqZWN0KSA9PiBPYmplY3QubmFtZVdpdGhFeHRlbnNpb24gIT0gRmlsZU9iamVjdC5uYW1lXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5kZWxldGVkRmlsZXMucHVzaChEZWxldGVkSXRlbSk7XHJcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwucmVtb3ZlZEZpbGVzLnB1c2goRGVsZXRlZEl0ZW0uaURfR1VJRCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgRmlsZU9iamVjdCA9IGl0ZW0uZmlsZS5yYXdGaWxlO1xyXG4gICAgICAgICAgICBsZXQgZGVsZXRlZExpc3QgPSB0aGlzLmRlbGV0ZWRGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKE9iamVjdCkgPT4gT2JqZWN0Lm5hbWVXaXRoRXh0ZW5zaW9uID09IEZpbGVPYmplY3QubmFtZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoZGVsZXRlZExpc3QubGVuZ3RoID09IDAgfHwgZGVsZXRlZExpc3QgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgbGV0IERlbGV0ZWRJdGVtID1cclxuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuZXhpc3RpbmdGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgIChPYmplY3QpID0+IE9iamVjdC5uYW1lV2l0aEV4dGVuc2lvbiA9PSBGaWxlT2JqZWN0Lm5hbWVcclxuICAgICAgICAgICAgICAgIClbMF07XHJcbiAgICAgICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5leGlzdGluZ0ZpbGVzID1cclxuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuZXhpc3RpbmdGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgIChPYmplY3QpID0+IE9iamVjdC5uYW1lV2l0aEV4dGVuc2lvbiAhPSBGaWxlT2JqZWN0Lm5hbWVcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgdGhpcy5kZWxldGVkRmlsZXMucHVzaChEZWxldGVkSXRlbSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5yZW1vdmVkRmlsZXMucHVzaChcclxuICAgICAgICAgICAgICAgIERlbGV0ZWRJdGVtLmlEX0dVSURcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGVsZXRlZEZpbGVzID0gW107XHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5yZW1vdmVkRmlsZXMgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLnVwbG9hZGVkRmlsZXMgPVxyXG4gICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwudXBsb2FkZWRGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAoT2JqZWN0KSA9PiBPYmplY3QubmFtZVdpdGhFeHRlbnNpb24gIT0gaXRlbS5fZmlsZS5uYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgICh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLnVwbG9hZGVkRmlsZXMgPT0gbnVsbCB8fFxyXG4gICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC51cGxvYWRlZEZpbGVzLmxlbmd0aCA9PSAwKSAmJlxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5pc1JlcXVpcmVkXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgIE1pbkZpbGVDb3VudFZhbGlkYXRpb25LZXk6IHRoaXMub3B0aW9ucy5taW5Ob09mRmlsZXMsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQ7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5jb3JyZWxhdGlvbklEX0dVSUQgPSB0aGlzLm9wdGlvbnMudmFsdWU/LkNvcnJlbGF0aW9uSURfR1VJRFxyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLm5hbWUpLnNldFZhbHVlKHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwpO1xyXG4gICAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgICAgdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbDtcclxuICAgIH1cclxuICB9XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICByZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICB0aGlzLm9wdGlvbnNcclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIGFkZFJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuYWRkUmVxdWlyZWRWYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIHJlbW92ZUN1c3RvbVZhbGlkYXRpb24gPSAoY3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5yZW1vdmVDdXN0b21WYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIGN1c3RvbVZhbGlkYXRpb25cclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIGFkZEN1c3RvbVZhbGlkYXRpb24gPSAoY3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5hZGRDdXN0b21WYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIGN1c3RvbVZhbGlkYXRpb25cclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIGlzVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LmlzVmFsaWQodGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wpO1xyXG4gIH07XHJcbiAgY29udmVydFNpemVUb01CKHNpemU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb252ZXJ0IHNpemUgdG8gbWVnYWJ5dGVzXHJcbiAgICBjb25zdCBtZWdhYnl0ZXMgPSBzaXplIC8gKDEwMjQgKiAxMDI0KTtcclxuXHJcbiAgICAvLyBSb3VuZCB0byB0d28gZGVjaW1hbCBwbGFjZXNcclxuICAgIGNvbnN0IHJvdW5kZWRNZWdhYnl0ZXMgPSBNYXRoLnJvdW5kKG1lZ2FieXRlcyAqIDEwMCkgLyAxMDA7XHJcblxyXG4gICAgcmV0dXJuIHJvdW5kZWRNZWdhYnl0ZXM7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGJic2YtY29udHJvbCBiYnNmLWZpbGUtdXBsb2FkXCIgW2Zvcm1Hcm91cF09XCJncm91cFwiPlxyXG4gIDxkaXYgW25nQ2xhc3NdPVwiKG9wdGlvbnMudmlld1R5cGU9PTEpPydiYnNmLXZlcnRpY2FsJzonYmJzZi1ob3Jpem9udGFsJ1wiPlxyXG4gICAgPCEtLWxhYmVsLS0+XHJcbiAgICA8bGFiZWwgW2hpZGRlbl09XCJvcHRpb25zLmhpZGVMYWJlbFwiIGNsYXNzPVwiYmJzZi1sYWJlbCB7e29wdGlvbnMubGFiZWxFeHRyYUNsYXNzZXN9fVwiPlxyXG4gICAgICB7e29wdGlvbnMubGFiZWxWYWx1ZX19XHJcbiAgICAgIDwhLS1Bc3Rlcmlzay0tPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIigob3B0aW9ucy5zaG93QXN0ZXJpc2smJm9wdGlvbnMuaXNSZXF1aXJlZCl8fChvcHRpb25zLmlzUmVxdWlyZWQpKSYmIW9wdGlvbnMuaXNSZWFkb25seVwiXHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gICAgPCEtLUFsbG93IGRyb3Bab25lLS0+XHJcbiAgICA8ZGl2IG5nMkZpbGVEcm9wIGNsYXNzPVwiYmJzZi1pbnB1dC1jb250YWluZXIge3tvcHRpb25zLmV4dHJhQ2xhc3Nlc319XCJcclxuICAgICAgKm5nSWY9XCIob3B0aW9ucy5pc0Ryb3Bab25lKSYmKCEoKG9wdGlvbnMuaXNNdWx0aXBsZUZpbGU9PWZhbHNlKSYmKHVwbG9hZGVyLnF1ZXVlLmxlbmd0aCk+MCkpJiYhb3B0aW9ucy5pc1JlYWRvbmx5XCJcclxuICAgICAgW25nQ2xhc3NdPVwieydhbm90aGVyLWZpbGUtb3Zlci1jbGFzcyc6IGhhc0Fub3RoZXJEcm9wWm9uZU92ZXJ9XCIgKG9uRmlsZURyb3ApPVwib25GaWxlQ2hhbmdlKClcIlxyXG4gICAgICAoZmlsZU92ZXIpPVwiZmlsZU92ZXJBbm90aGVyKCRldmVudClcIiBbdXBsb2FkZXJdPVwidXBsb2FkZXJcIiBbYWNjZXB0XT1cImFjY2VwdGVkVHlwZVwiIChjaGFuZ2UpPVwib25GaWxlQ2hhbmdlKClcIlxyXG4gICAgICBpZD1cInt7b3B0aW9ucy5uYW1lfX1cIiBtdWx0aXBsZT1cInt7b3B0aW9ucy5pc011bHRpcGxlRmlsZT8nbXVsdGlwbGUnOicnfX1cIiBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIlxyXG4gICAgICBhcmlhLWludmFsaWQ9XCJ0cnVlXCIgdHlwZT1cImZpbGVcIiBmb3JtQ29udHJvbE5hbWU9XCJ7e29wdGlvbnMubmFtZX19XCIgI2ZpbGVJbnB1dFxyXG4gICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJmaWxlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBmaWxlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcHpvbmUtbGFiZWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ZnLWFuZC12YWxpZGF0aW9uXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDUwcHg7XCI+XHJcbiAgICAgICAgICAgIDxwYXRoIG9wYWNpdHk9XCIwLjNcIlxyXG4gICAgICAgICAgICAgIGQ9XCJNNSAxNkMzLjMgMTYgMiAxNC43IDIgMTNDMiAxMS4zIDMuMyAxMCA1IDEwSDUuMUM1IDkuNyA1IDkuMyA1IDlDNSA2LjIgNy4yIDQgMTAgNEMxMS45IDQgMTMuNSA1IDE0LjMgNi41QzE0LjggNi4yIDE1LjQgNiAxNiA2QzE3LjcgNiAxOSA3LjMgMTkgOUMxOSA5LjQgMTguOSA5LjcgMTguOCAxMEMxOC45IDEwIDE4LjkgMTAgMTkgMTBDMjAuNyAxMCAyMiAxMS4zIDIyIDEzQzIyIDE0LjcgMjAuNyAxNiAxOSAxNkg1Wk04IDEzLjZIMTZMMTIuNyAxMC4zQzEyLjMgOS44OTk5OSAxMS43IDkuODk5OTkgMTEuMyAxMC4zTDggMTMuNlpcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHlsZT1cImZpbGw6ICNhMWExYTE7XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDEzLjZWMTlDMTEgMTkuNiAxMS40IDIwIDEyIDIwQzEyLjYgMjAgMTMgMTkuNiAxMyAxOVYxMy42SDExWlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwiZmlsbDogIzk4OTg5ODtcIj48L3BhdGg+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwhLS1WYWxpZGF0aW9uIHRleHQtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLXZhbGlkYXRpb24tbXNnIHRleHQtY2VudGVyXCI+e3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRHJhZ0FuZERyb3BIZXJlXCIpfX0gPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZyB0ZXh0LWNlbnRlclwiICpuZ0lmPVwidmFsaWRhdGlvbk1lc3NhZ2VcIiBbaW5uZXJIVE1MXT1cInZhbGlkYXRpb25NZXNzYWdlXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZyBuZy1zdGFyLWluc2VydGVkIHRleHQtY2VudGVyIHRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJ2YWxpZGF0aW9uQ291bnRNZXNzYWdlICYmb3B0aW9ucy5pc011bHRpcGxlRmlsZSAmJm9wdGlvbnMubWF4Tm9PZkZpbGVzPjBcIlxyXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cInZhbGlkYXRpb25Db3VudE1lc3NhZ2VcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1Ob3QgYWxsb3dlZCBkcm9wWm9uZS0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtaW5wdXQtY29udGFpbmVyXCIgKm5nSWY9XCIoIW9wdGlvbnMuaXNEcm9wWm9uZSkmJiEoaXNIaWRlSW5wdXQoKSkmJiFvcHRpb25zLmlzUmVhZG9ubHlcIlxyXG4gICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKCk7XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkcm9wem9uZS1sYWJlbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdmctYW5kLXZhbGlkYXRpb25cIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogNTBweDtcIj5cclxuICAgICAgICAgICAgPHBhdGggb3BhY2l0eT1cIjAuM1wiXHJcbiAgICAgICAgICAgICAgZD1cIk01IDE2QzMuMyAxNiAyIDE0LjcgMiAxM0MyIDExLjMgMy4zIDEwIDUgMTBINS4xQzUgOS43IDUgOS4zIDUgOUM1IDYuMiA3LjIgNCAxMCA0QzExLjkgNCAxMy41IDUgMTQuMyA2LjVDMTQuOCA2LjIgMTUuNCA2IDE2IDZDMTcuNyA2IDE5IDcuMyAxOSA5QzE5IDkuNCAxOC45IDkuNyAxOC44IDEwQzE4LjkgMTAgMTguOSAxMCAxOSAxMEMyMC43IDEwIDIyIDExLjMgMjIgMTNDMjIgMTQuNyAyMC43IDE2IDE5IDE2SDVaTTggMTMuNkgxNkwxMi43IDEwLjNDMTIuMyA5Ljg5OTk5IDExLjcgOS44OTk5OSAxMS4zIDEwLjNMOCAxMy42WlwiXHJcbiAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0eWxlPVwiZmlsbDogI2ExYTFhMTtcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgMTMuNlYxOUMxMSAxOS42IDExLjQgMjAgMTIgMjBDMTIuNiAyMCAxMyAxOS42IDEzIDE5VjEzLjZIMTFaXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmaWxsOiAjOTg5ODk4O1wiPjwvcGF0aD5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPCEtLVZhbGlkYXRpb24gdGV4dC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvbi1tc2cgIHRleHQtY2VudGVyXCI+e3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiVXBsb2FkXCIpfX0gPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZyAgdGV4dC1jZW50ZXJcIiAqbmdJZj1cInZhbGlkYXRpb25NZXNzYWdlXCIgW2lubmVySFRNTF09XCJ2YWxpZGF0aW9uTWVzc2FnZVwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvbi1tc2cgbmctc3Rhci1pbnNlcnRlZCB0ZXh0LWNlbnRlciB0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwidmFsaWRhdGlvbkNvdW50TWVzc2FnZSAmJm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUgJiZvcHRpb25zLm1heE5vT2ZGaWxlcz4wXCJcclxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJ2YWxpZGF0aW9uQ291bnRNZXNzYWdlXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8aW5wdXQgbmcyRmlsZVNlbGVjdCBbdXBsb2FkZXJdPVwidXBsb2FkZXJcIiBbYWNjZXB0XT1cImFjY2VwdGVkVHlwZVwiXHJcbiAgICAgICAgY2xhc3M9XCJmaWxlU2VsZWN0b3IgY3VzdG9tRmlsZVVwbG9hZFBsYWNtZW50IGhpZGRlbiAgdi1yZXF1aXJlZC1tdWx0aXBsZWZpbGVzIGQtbm9uZVwiXHJcbiAgICAgICAgbXVsdGlwbGU9XCJ7e29wdGlvbnMuaXNNdWx0aXBsZUZpbGU/J211bHRpcGxlJzonJ319XCIgbmFtZT1cImZpbGVcIiB0eXBlPVwiZmlsZVwiIHZhbHVlPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgpXCIgW25nQ2xhc3NdPVwiKG9wdGlvbnMudmlld1R5cGU9PTEpPycnOidjb2wtbWQtOSdcIiBpZD1cInt7b3B0aW9ucy5uYW1lfX1cIlxyXG4gICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJlbWFpbC1lcnJvclwiIGFyaWEtaW52YWxpZD1cInRydWVcIiBmb3JtQ29udHJvbE5hbWU9XCJ7e29wdGlvbnMubmFtZX19XCIgI2ZpbGVJbnB1dFxyXG4gICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImZpbGVVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkICYmIGZpbGVVcGxvYWRGb3JtQ29udHJvbC50b3VjaGVkXCI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gcmVhZG9ubHkgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwib3B0aW9ucy5pc1JlYWRvbmx5ICYmICFvcHRpb25zLnZhbHVlXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmlld1wiPnt7VXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnTkEnKX19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPCEtLWl0ZW1zIHVwbG9hZGVkLS0+XHJcbiAgPGRpdiBjbGFzcz1cInVwbG9hZGVkLWl0ZW1zXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdXBsb2FkZXIucXVldWVcIj5cclxuICAgICAgPGEgbmdiVG9vbHRpcD1cInt7aXRlbT8ucHJvZ3Jlc3M8MTAwP1V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ1VwbG9hZGluZycpOlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ1VwbG9hZGVkJyl9fToge3tpdGVtPy5wcm9ncmVzc319JSAgIHt7IGNvbnZlcnRTaXplVG9NQihpdGVtPy5maWxlPy5zaXplKX19TUJcIlxyXG4gICAgICAgIGhyZWY9XCJ7eyBpdGVtPy5maWxlPy5yYXdGaWxlIH19XCIgY2xhc3M9XCJidG4gYnRuLWRvd25sb2FkLWZpbGUgYnRuLXNtIGJ0bi1wcm9ncmVzcy11cGxvYWRcIiBkb3dubG9hZD5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiaXRlbT8uX2ZpbGU/LlsnaURfR1VJRCddJiYhaXRlbT8ucHJvZ3Jlc3NcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgZD1cIk0yMSAyMkgzQzIuNCAyMiAyIDIxLjYgMiAyMUMyIDIwLjQgMi40IDIwIDMgMjBIMjFDMjEuNiAyMCAyMiAyMC40IDIyIDIxQzIyIDIxLjYgMjEuNiAyMiAyMSAyMlpNMTMgMTMuNFYzQzEzIDIuNCAxMi42IDIgMTIgMkMxMS40IDIgMTEgMi40IDExIDNWMTMuNEgxM1pcIlxyXG4gICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9wYXRoPlxyXG4gICAgICAgICAgPHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNNyAxMy40SDE3TDEyLjcgMTcuN0MxMi4zIDE4LjEgMTEuNyAxOC4xIDExLjMgMTcuN0w3IDEzLjRaXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiaXRlbT8ucHJvZ3Jlc3MgPT0gMTAwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgIDxwYXRoIG9wYWNpdHk9XCIwLjRcIlxyXG4gICAgICAgICAgICBkPVwiTTEyIDIyQzE3LjUyMjggMjIgMjIgMTcuNTIyOCAyMiAxMkMyMiA2LjQ3NzE1IDE3LjUyMjggMiAxMiAyQzYuNDc3MTUgMiAyIDYuNDc3MTUgMiAxMkMyIDE3LjUyMjggNi40NzcxNSAyMiAxMiAyMlpcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCJibGFja1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk03LjUgMTJMMTAuNSAxNUwxNi41IDlcIiBzdHJva2U9XCJibGFja1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5wcm9ncmVzcyA8IDEwMFwiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1tdXRlZFwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkxvYWRpbmcuLi48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLW5hbWVcIj57eyBpdGVtPy5maWxlPy5uYW1lIH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidXBsb2FkXCIgW2NsYXNzLmZpbGUtdXBsb2FkZWRdPVwiaXRlbT8ucHJvZ3Jlc3MgPj0gMTAwXCIgW3N0eWxlLndpZHRoLiVdPVwiaXRlbT8ucHJvZ3Jlc3NcIlxyXG4gICAgICAgICAgKm5nSWY9XCJpdGVtPy5wcm9ncmVzcyA+IDBcIj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYT5cclxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFvcHRpb25zLmlzUmVhZG9ubHlcIiBjbGFzcz1cImJ0biBidG4tZG93bmxvYWQtZmlsZSBidG4tc20gYnRuLWRhbmdlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cIml0ZW0ucmVtb3ZlKCk7cmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShpdGVtKVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXMgcHgtMFwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInN1YnRleHQtY29udGFpbmVyXCIgKm5nSWY9XCIhb3B0aW9ucy5pc1JlYWRvbmx5XCI+XHJcbiAgICA8IS0tIHJlcXVpcmVkIHRleHQtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJiYnNmLXZhbGlkYXRpb25cIiAqbmdJZj1cIihmaWxlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBmaWxlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZClcIj5cclxuICAgICAge3tnZXRFcnJvclZhbGlkYXRpb24oZmlsZVVwbG9hZEZvcm1Db250cm9sLmVycm9yc3xrZXl2YWx1ZSl9fVxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIExhYmVsRGVzY3JpcHRpb24tLT5cclxuICAgIDxkaXYgY2xhc3M9XCJiYnNmLWNvbnRyb2wtZGVzY1wiICpuZ0lmPVwib3B0aW9ucy5sYWJlbERlc2NyaXB0aW9uIT1udWxsXCI+IHt7b3B0aW9ucy5sYWJlbERlc2NyaXB0aW9ufX08L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCIoZ3JvdXAudmFsaWQmJmdyb3VwLmRpcnR5JiZncm91cC50b3VjaGVkICl8fChncm91cC51bnRvdWNoZWQmJmdyb3VwLmludmFsaWQmJmdyb3VwLmRpcnR5KSBcIj5cclxuICAgICAge3tyZXNldEVycm9yKCl9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+Il19
514
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZVVwbGFvZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvY29udHJvbHMvRmlsZVVwbGFvZC9GaWxlVXBsYW9kLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9GaWxlVXBsYW9kL0ZpbGVVcGxhb2QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFFVCxNQUFNLEVBQ04sWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsVUFBVSxHQUtYLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLFlBQVksRUFBaUQsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFTdEYsT0FBTyxFQUFjLGFBQWEsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFNcEYsTUFBTSxPQUFPLG1CQUFtQjthQUN2QiwyQkFBc0IsR0FBRyxJQUFJLEFBQVAsQ0FBUTtJQTJCckMsWUFDc0IsZ0JBQWtDLEVBQy9DLDZCQUFpRCxFQUNoRCxjQUE4QixFQUMvQixjQUE4QixFQUM3Qix3QkFBa0QsRUFDbEQsY0FBOEIsRUFDOUIsaUJBQW9DO1FBTnhCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDL0Msa0NBQTZCLEdBQTdCLDZCQUE2QixDQUFvQjtRQUNoRCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzdCLDZCQUF3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Q3JDaEMsZy9QQW1ITTs7MkZEOUVPLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDRSxpQkFBaUI7OzBCQWdDeEIsUUFBUTt3T0ExQmdDLFNBQVM7c0JBQW5ELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHaEMsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBPcHRpb25hbCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1Db250cm9sLFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBDb250cm9sQ29udGFpbmVyLFxyXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9GaWxlVXBsb2FkT3B0aW9ucyc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyLCBGaWxlTGlrZU9iamVjdCwgRmlsZVVwbG9hZGVyT3B0aW9ucywgRmlsZUl0ZW0gfSBmcm9tICduZzItZmlsZS11cGxvYWQnO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkTW9kZWwgfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0ZpbGVVcGxvYWRNb2RlbCc7XHJcbmltcG9ydCB7IE11bHRpcGxlRmlsZVVwbG9hZE1vZGVsIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9NdWx0aXBsZUZpbGVVcGxvYWRNb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgQ29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLFxyXG4gIFV0aWxpdHlTZXJ2aWNlLFxyXG59IGZyb20gJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcyc7XHJcbmltcG9ydCB7IEdsb2JhbFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0dsb2JhbFNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZpbGVEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0ZpbGVEVE8nO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkU2VydmljZSB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9maWxlLXVwbG9hZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ0JCU0YtRmlsZVVwbGFvZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL0ZpbGVVcGxhb2QuY29tcG9uZW50Lmh0bWwnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgc3RhdGljIGNvbnRyb2xDb250YWluZXJzdGF0aWMgPSBudWxsO1xyXG5cclxuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgZmlsZUlucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuICBpc1N1Ym1pdHRlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBncm91cDogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IEZpbGVVcGxvYWRPcHRpb25zO1xyXG4gIEBPdXRwdXQoKSBPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgaXNVcGxvYWRDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgZmlsZVVwbG9hZEZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2w7XHJcbiAgdmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcclxuICB2YWxpZGF0aW9uQ291bnRNZXNzYWdlID0gJyc7XHJcbiAgdXBsb2FkZXI6IEZpbGVVcGxvYWRlcjtcclxuICBoYXNBbm90aGVyRHJvcFpvbmVPdmVyOiBib29sZWFuO1xyXG4gIGFjY2VwdGVkVHlwZTogc3RyaW5nID0gJyc7XHJcbiAgYWNjZXB0ZWRUeXBlQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgdG9vbFRpcFR5cGVBcnJheTogc3RyaW5nW10gPSBbXTtcclxuICBmaWxlTGlrZU9iamVjdDogRmlsZUxpa2VPYmplY3Q7XHJcbiAgbWFya0FsbEFzVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcbiAgZmlsZVVwbG9hZE1vZGVsOiBGaWxlVXBsb2FkTW9kZWw7XHJcbiAgbXVsdGlwbGVGaWxlVXBsb2FkTW9kZWw6IE11bHRpcGxlRmlsZVVwbG9hZE1vZGVsO1xyXG4gIGZpbGU6IGFueTtcclxuICBkZWxldGVkRmlsZXM6IEZpbGVEVE9bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgIHB1YmxpYyBNdWx0aXBsZUZpbGVVcGxhb2RDb250cm9sSG9zdDogRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHksXHJcbiAgICBwdWJsaWMgVXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZ2xvYmFsU2V0dGluZ3M6IEdsb2JhbFNldHRpbmdzLFxyXG4gICAgcHJpdmF0ZSBmaWxlVXBsb2FkU2VydmljZTogRmlsZVVwbG9hZFNlcnZpY2VcclxuICApIHtcclxuICAgIEZpbGVVcGxvYWRDb21wb25lbnQuY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IHRoaXMuY29udHJvbENvbnRhaW5lcjtcclxuICAgIHRoaXMudXBsb2FkZXIgPSBuZXcgRmlsZVVwbG9hZGVyKHtcclxuICAgICAgZGlzYWJsZU11bHRpcGFydDogZmFsc2UsIC8vICdEaXNhYmxlTXVsdGlwYXJ0JyBtdXN0IGJlICd0cnVlJyBmb3IgZm9ybWF0RGF0YUZ1bmN0aW9uIHRvIGJlIGNhbGxlZC5cclxuICAgIH0gYXMgRmlsZVVwbG9hZGVyT3B0aW9ucyk7XHJcbiAgICB0aGlzLmhhc0Fub3RoZXJEcm9wWm9uZU92ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5maWxlVXBsb2FkTW9kZWwgPSBuZXcgRmlsZVVwbG9hZE1vZGVsKCk7XHJcbiAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsID0gbmV3IE11bHRpcGxlRmlsZVVwbG9hZE1vZGVsKCk7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy52aWV3VHlwZSlcclxuICAgICAgdGhpcy5vcHRpb25zLnZpZXdUeXBlID0gdGhpcy5nbG9iYWxTZXR0aW5ncy52aWV3VHlwZTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5pc011bHRpcGxlRmlsZSA9PSB0cnVlKSB7XHJcbiAgICAgICAgLy90aGlzLm9wdGlvbnMuVmFsdWU9dGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHRoaXMub3B0aW9ucy5WYWx1ZT10aGlzLmZpbGVVcGxvYWRNb2RlbFxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlzTXVsdGlwbGVGaWxlID09IHRydWUpIHtcclxuICAgICAgICBsZXQgZmlsZXM6IGFueVtdID0gW107XHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5leGlzdGluZ0ZpbGVzID1cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy52YWx1ZS5FeGlzdGluZ0ZpbGVzO1xyXG4gICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwudXBsb2FkZWRGaWxlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoXHJcbiAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgaW5kZXggPCB0aGlzLm9wdGlvbnMudmFsdWUuRXhpc3RpbmdGaWxlcy5sZW5ndGg7XHJcbiAgICAgICAgICBpbmRleCsrXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5vcHRpb25zLnZhbHVlLkV4aXN0aW5nRmlsZXNbaW5kZXhdO1xyXG4gICAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZWxlbWVudC5CeXRlcykgYXMgYW55O1xyXG4gICAgICAgICAgdmFyIGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZShudWxsLCBieXRlcykpO1xyXG4gICAgICAgICAgdGhpcy5maWxlTGlrZU9iamVjdCA9IDxGaWxlTGlrZU9iamVjdD57XHJcbiAgICAgICAgICAgIG5hbWU6IGVsZW1lbnQuTmFtZVdpdGhFeHRlbnNpb24sXHJcbiAgICAgICAgICAgIHR5cGU6IGVsZW1lbnQuTWltZVR5cGUsXHJcbiAgICAgICAgICAgIHJhd0ZpbGU6IDxhbnk+YmFzZTY0XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgLy8gbGV0IGJsb2I6IGFueTtcclxuICAgICAgICAgIC8vIGJsb2IgPSBuZXcgQmxvYihbJyddKSBhcyBhbnk7XHJcbiAgICAgICAgICAvLyBibG9iLm5hbWUgPSBlbGVtZW50LkZpbGVOYW1lO1xyXG4gICAgICAgICAgLy8gYmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbnVsbDtcclxuICAgICAgICAgIC8vIGJsb2Iud2Via2l0UmVsYXRpdmVQYXRoID0gJyc7XHJcbiAgICAgICAgICBsZXQgZmlsZSA9IHRoaXMuZmlsZUxpa2VPYmplY3QgYXMgYW55O1xyXG4gICAgICAgICAgZmlsZS51cmwgPSBlbGVtZW50LkZpbGVVUkw7XHJcbiAgICAgICAgICBmaWxlcy5wdXNoKGZpbGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwbG9hZGVyLmFkZFRvUXVldWUoZmlsZXMpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMudXBsb2FkZXIucXVldWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLm9wdGlvbnMudmFsdWU7XHJcbiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZWxlbWVudC5CeXRlcykgYXMgYW55O1xyXG4gICAgICAgIHZhciBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUobnVsbCwgYnl0ZXMpKTtcclxuICAgICAgICB0aGlzLmZpbGVMaWtlT2JqZWN0ID0gPEZpbGVMaWtlT2JqZWN0PntcclxuICAgICAgICAgIG5hbWU6IGVsZW1lbnQuTmFtZVdpdGhFeHRlbnNpb24sXHJcbiAgICAgICAgICB0eXBlOiBlbGVtZW50Lk1pbWVUeXBlLFxyXG4gICAgICAgICAgcmF3RmlsZTogPGFueT5iYXNlNjQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmZpbGUgPSBlbGVtZW50O1xyXG4gICAgICAgIGxldCBmaWxlID0gdGhpcy5maWxlTGlrZU9iamVjdCBhcyBhbnk7XHJcbiAgICAgICAgZmlsZS51cmwgPSBlbGVtZW50LkZpbGVVUkw7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5hZGRUb1F1ZXVlKFtmaWxlIGFzIGFueV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5sYWJlbEtleSAhPSAnJylcclxuICAgICAgdGhpcy5vcHRpb25zLmxhYmVsVmFsdWUgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmxhYmVsS2V5XHJcbiAgICAgICk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm9wdGlvbnMuZmlsZVVwbG9hZEFjY2VwdHNUeXBlcyAhPSBudWxsICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5maWxlVXBsb2FkQWNjZXB0c1R5cGVzLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICBmb3IgKFxyXG4gICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgaW5kZXggPCB0aGlzLm9wdGlvbnMuZmlsZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGg7XHJcbiAgICAgICAgaW5kZXgrK1xyXG4gICAgICApIHtcclxuICAgICAgICBjb25zdCBUeXBlID0gdGhpcy5vcHRpb25zLmZpbGVVcGxvYWRBY2NlcHRzVHlwZXNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMuYWNjZXB0ZWRUeXBlID0gdGhpcy5hY2NlcHRlZFR5cGUgKyBUeXBlICsgJywnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYWNjZXB0ZWRUeXBlQXJyYXkgPSB0aGlzLmFjY2VwdGVkVHlwZS5zcGxpdCgnLCcpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5hY2NlcHRlZFR5cGVBcnJheS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5hY2NlcHRlZFR5cGVBcnJheVtpbmRleF07XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuYWNjZXB0ZWRUeXBlQXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5hY2NlcHRlZFR5cGVBcnJheVtpbmRleF07XHJcbiAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vcGRmJzpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMudG9vbFRpcFR5cGVBcnJheS5pbmNsdWRlcygnUERGJykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaCgnUERGJyk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL21zd29yZCc6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ1dvcmQnKSlcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbFRpcFR5cGVBcnJheS5wdXNoKCdXb3JkJyk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JzpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMudG9vbFRpcFR5cGVBcnJheS5pbmNsdWRlcygnV29yZCcpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sVGlwVHlwZUFycmF5LnB1c2goJ1dvcmQnKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJzpcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMudG9vbFRpcFR5cGVBcnJheS5pbmNsdWRlcygnRXhjZWwnKSlcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbFRpcFR5cGVBcnJheS5wdXNoKCdFeGNlbCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCc6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ0V4Y2VsJykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaCgnRXhjZWwnKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy50b29sVGlwVHlwZUFycmF5LmluY2x1ZGVzKCdQb3dlclBvaW50JykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaCgnUG93ZXJQb2ludCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbmFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy50b29sVGlwVHlwZUFycmF5LmluY2x1ZGVzKCdQb3dlclBvaW50JykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaCgnUG93ZXJQb2ludCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiaW1hZ2UvcG5nXCI6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ1BORycpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sVGlwVHlwZUFycmF5LnB1c2goJ1BORycpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiaW1hZ2UvYm1wXCI6XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnRvb2xUaXBUeXBlQXJyYXkuaW5jbHVkZXMoJ0JNUCcpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sVGlwVHlwZUFycmF5LnB1c2goJ0JNUCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiaW1hZ2UvanBlZ1wiOlxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy50b29sVGlwVHlwZUFycmF5LmluY2x1ZGVzKCdKUEVHJykpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xUaXBUeXBlQXJyYXkucHVzaCgnSlBFRycpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID1cclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlICtcclxuICAgICAgICBgJHt0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0V4dGVuc2lvbnMnKX0gKCR7dGhpcy50b29sVGlwVHlwZUFycmF5XHJcbiAgICAgICAgfSkgYDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsZU1heFNpemVJbk1CID4gMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID1cclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlICtcclxuICAgICAgICBgPGJyIC8+ICAke3RoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnRmlsZU1heFNpemVJbk1CJykgKyB0aGlzLm9wdGlvbnMuZmlsZU1heFNpemVJbk1CfSBgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMubWluTm9PZkZpbGVzID4gMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID1cclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlICtcclxuICAgICAgICBgPGJyIC8+ICR7dGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiTWluRmlsZUNvdW50VmFsaWRhdGlvbktleVwiKSArIHRoaXMub3B0aW9ucy5taW5Ob09mRmlsZXN9YDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5maWxlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLmZpbGVVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyb3VwLmFkZENvbnRyb2wodGhpcy5vcHRpb25zLm5hbWUsIG5ldyBGb3JtQ29udHJvbCgnJykpO1xyXG4gICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wgPSB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5uYW1lXTsgLy8gIG5ldyBGb3JtQ29udHJvbCgnJyx2YWxpZGF0aW9uUnVsZXMpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY3VzdG9tVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBWYWxpZGF0aW9ucyA9IHRoaXMub3B0aW9ucy5jdXN0b21WYWxpZGF0aW9uO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVmFsaWRhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25zW2luZGV4XTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRpb24uZnVuY3Rpb25Cb2R5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUgJiYgdGhpcy5vcHRpb25zLm1heE5vT2ZGaWxlcyA+IDApIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uQ291bnRNZXNzYWdlID0gYCR7dGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdNYXhGaWxlc0NvdW50Jyl9IDogJHt0aGlzLm9wdGlvbnMubWF4Tm9PZkZpbGVzfWA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmlzUmVxdWlyZWQpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMudmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlc2FzeW5jKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXNEaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5NdWx0aXBsZUZpbGVVcGxhb2RDb250cm9sSG9zdC5uZ1N1Ym1pdC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZ3JvdXAubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSB0cnVlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5vcHRpb25zLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlTGlzdCAhPSBudWxsKSB7XHJcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vcHRpb25zLm5hbWUpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXR0cmlidXRlTGlzdFtpbmRleF0ua2V5LFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZUxpc3RbaW5kZXhdLnZhbHVlXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRFcnJvciA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLnJlbW92ZUdsb2JhbEVycm9yKCk7XHJcbiAgfTtcclxuXHJcbiAgc2hvd0dsb2JhbEVycm9yKCkge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5zaG93R2xvYmFsRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIGdldEVycm9yVmFsaWRhdGlvbihFcnJvckxpc3QpIHtcclxuICAgIGlmICh0aGlzLm1hcmtBbGxBc1RvdWNoZWQgJiYgdGhpcy5ncm91cC5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0dsb2JhbEVycm9yKCk7XHJcbiAgICAgIHRoaXMubWFya0FsbEFzVG91Y2hlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xVdGlsaXR5LmdldEVycm9yVmFsaWRhdGlvbk1hc3NhZ2UoXHJcbiAgICAgIEVycm9yTGlzdCxcclxuICAgICAgdGhpcy5ncm91cCxcclxuICAgICAgdGhpcy5vcHRpb25zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmlsZU92ZXJBbm90aGVyKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFzQW5vdGhlckRyb3Bab25lT3ZlciA9IGV2ZW50O1xyXG4gIH1cclxuICBpc0hpZGVJbnB1dCgpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhOb09mRmlsZXMgIT0gbnVsbCAmJlxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhOb09mRmlsZXMgPiAwICYmXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLm1heE5vT2ZGaWxlcyA9PSB0aGlzLnVwbG9hZGVyLnF1ZXVlLmxlbmd0aFxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMudXBsb2FkZXIucXVldWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIG9uRmlsZUNoYW5nZSgpIHtcclxuICAgIGxldCBGaWxlc0FycmF5ID0gW107XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pc011bHRpcGxlRmlsZSAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMubWluTm9PZkZpbGVzICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLm1pbk5vT2ZGaWxlcyA+IDAgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLm1pbk5vT2ZGaWxlcyA+IHRoaXMudXBsb2FkZXIucXVldWUubGVuZ3RoXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbDtcclxuICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICBNaW5GaWxlQ291bnRWYWxpZGF0aW9uS2V5OiB0aGlzLm9wdGlvbnMubWluTm9PZkZpbGVzLFxyXG4gICAgICB9KTtcclxuICAgICAgZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5pc011bHRpcGxlRmlsZSAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZUZvckFsbEZpbGVzSW5NQiAhPSBudWxsICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy5tYXhTaXplRm9yQWxsRmlsZXNJbk1CID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBBbGxTaXplRmlsZSA9IDA7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnVwbG9hZGVyLnF1ZXVlLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnVwbG9hZGVyLnF1ZXVlW2luZGV4XTtcclxuICAgICAgICBjb25zdCBmaWxlID0gZWxlbWVudC5maWxlO1xyXG4gICAgICAgIEFsbFNpemVGaWxlID0gQWxsU2l6ZUZpbGUgKyBmaWxlLnNpemU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgTWF4U2l6ZUZvckFsbEZpbGVzID1cclxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZUZvckFsbEZpbGVzSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICBpZiAoQWxsU2l6ZUZpbGUgPiBNYXhTaXplRm9yQWxsRmlsZXMpIHtcclxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7XHJcbiAgICAgICAgICBNYXhTaXplRm9yQWxsRmlsZXNJbk1COiB0aGlzLm9wdGlvbnMubWF4U2l6ZUZvckFsbEZpbGVzSW5NQiArICdNJyxcclxuICAgICAgICB9KTtcclxuICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IEFkZGVkUXVldWUgPSB0aGlzLnVwbG9hZGVyLnF1ZXVlLmZpbHRlcihcclxuICAgICAgKG9iamVjdCkgPT4gb2JqZWN0Wydzb21lJ10ubGFzdE1vZGlmaWVkICE9IG51bGxcclxuICAgICk7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgQWRkZWRRdWV1ZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IEFkZGVkUXVldWVbaW5kZXhdO1xyXG4gICAgICBjb25zdCBmaWxlID0gZWxlbWVudC5maWxlO1xyXG4gICAgICBjb25zdCBtYXhGaWxlU2l6ZSA9IHRoaXMub3B0aW9ucy5maWxlTWF4U2l6ZUluTUIgKiAxMDAwICogMTAwMDtcclxuICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICBjb25zdCBmaWxlVHlwZSA9IGZpbGUudHlwZTtcclxuICAgICAgICBpZiAoZmlsZS5zaXplID4gbWF4RmlsZVNpemUpIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgICBmb3JtQ29udHJvbC5zZXRFcnJvcnMoe1xyXG4gICAgICAgICAgICBGaWxlTWF4U2l6ZUluTUI6IHRoaXMub3B0aW9ucy5maWxlTWF4U2l6ZUluTUIgKyAnTScsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgIHRoaXMudXBsb2FkZXIucXVldWUgPSBbXTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmZpbGVVcGxvYWRBY2NlcHRzVHlwZXMgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmZpbGVVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgIShcclxuICAgICAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGVBcnJheS5pbmNsdWRlcyhmaWxlVHlwZS50b1VwcGVyQ2FzZSgpKSB8fFxyXG4gICAgICAgICAgICB0aGlzLmFjY2VwdGVkVHlwZUFycmF5LmluY2x1ZGVzKGZpbGVUeXBlLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgVG9vbFRpcFR5cGVFcnJvcjogdGhpcy50b29sVGlwVHlwZUFycmF5IH0pO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlzVXBsb2FkRmlsZUFzeW5jICYmICF0aGlzLnVwbG9hZGVyLnF1ZXVlW2luZGV4XS5fZmlsZVtcImlEX0dVSURcIl0pIHtcclxuICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZFNlcnZpY2UudXBsb2FkRmlsZSh0aGlzLnVwbG9hZGVyLnF1ZXVlW2luZGV4XS5fZmlsZSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgbmV4dDogKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IE1hdGgucm91bmQoMTAwICogZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWwpXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZXIucXVldWVbaW5kZXhdLnByb2dyZXNzID0gdmFsdWUgPj0gOTUgPyA5NSA6IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlW2luZGV4XS5wcm9ncmVzcyA9IDEwMFxyXG4gICAgICAgICAgICAgICAgICBsZXQgZmlsZUlEID0gZXZlbnQuYm9keS52YWwgYXMgYW55O1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlW2luZGV4XS5fZmlsZVtcImlEX0dVSURcIl0gPSBmaWxlSUQ7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBBZGRlZEZpbGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaURfR1VJRDogZmlsZUlELFxyXG4gICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlzTXVsdGlwbGVGaWxlID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlVXBsb2FkTW9kZWwgPSBuZXcgRmlsZVVwbG9hZE1vZGVsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlVXBsb2FkTW9kZWwuZmlsZSA9IEFkZGVkRmlsZSBhcyBhbnlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpbGVVcGxvYWRNb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLm5hbWUpLnNldFZhbHVlKHRoaXMuZmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudmFsdWUgPSB0aGlzLmZpbGVVcGxvYWRNb2RlbDtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBGaWxlc0FycmF5LnB1c2goQWRkZWRGaWxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLnVwbG9hZGVkRmlsZXMgPSBGaWxlc0FycmF5O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlLkNvcnJlbGF0aW9uSURfR1VJRCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwucmVtb3ZlZEZpbGVzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuY29ycmVsYXRpb25JRF9HVUlEID0gdGhpcy5vcHRpb25zLnZhbHVlPy5Db3JyZWxhdGlvbklEX0dVSURcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwXHJcbiAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vVXNlIHRoaXMgbGluZSB0byBlbmFibGUgdHdvIHdheSBiaW5kaW5nLlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VwbG9hZENvbXBsZXRlLmVtaXQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgbGV0IGZpbGVPYmplY3QgPSBmaWxlLnJhd0ZpbGUgYXMgYW55O1xyXG4gICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZU9iamVjdCk7XHJcbiAgICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZXhpc3RpbmdJRF9HVUlEID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUgJiYgdGhpcy5maWxlKVxyXG4gICAgICAgICAgICAgIGV4aXN0aW5nSURfR1VJRCA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGUuTmFtZVdpdGhFeHRlbnNpb24gPT0gZmlsZS5uYW1lXHJcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5maWxlLmlEX0dVSURcclxuICAgICAgICAgICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgbGV0IEFkZGVkRmlsZTogRmlsZURUTyA9IHtcclxuICAgICAgICAgICAgICBmaWxlTmFtZTogZmlsZS5uYW1lLFxyXG4gICAgICAgICAgICAgIGZpbGVUeXBlOiBmaWxlLnR5cGUsXHJcbiAgICAgICAgICAgICAgZmlsZUJhc2U2NDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLnNwbGl0KCcsJylbMV0sXHJcbiAgICAgICAgICAgICAgZmlsZVNpemVJbk1COiBmaWxlLnNpemUgLyAxMDAwIC8gMTAwMCxcclxuICAgICAgICAgICAgICBuYW1lV2l0aEV4dGVuc2lvbjogZmlsZS5uYW1lLFxyXG4gICAgICAgICAgICAgIGlEX0dVSUQ6IGV4aXN0aW5nSURfR1VJRCxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRNb2RlbCA9IG5ldyBGaWxlVXBsb2FkTW9kZWwoKTtcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRNb2RlbC5maWxlID0gQWRkZWRGaWxlO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpbGVVcGxvYWRNb2RlbCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLm5hbWUpLnNldFZhbHVlKHRoaXMuZmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudmFsdWUgPSB0aGlzLmZpbGVVcGxvYWRNb2RlbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBGaWxlc0FycmF5LnB1c2goQWRkZWRGaWxlKTtcclxuICAgICAgICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLnVwbG9hZGVkRmlsZXMgPSBGaWxlc0FycmF5O1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlLkNvcnJlbGF0aW9uSURfR1VJRCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwucmVtb3ZlZEZpbGVzID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuY29ycmVsYXRpb25JRF9HVUlEID0gdGhpcy5vcHRpb25zLnZhbHVlPy5Db3JyZWxhdGlvbklEX0dVSURcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwXHJcbiAgICAgICAgICAgICAgICAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKVxyXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwpO1xyXG4gICAgICAgICAgICAgIC8vVXNlIHRoaXMgbGluZSB0byBlbmFibGUgdHdvIHdheSBiaW5kaW5nLlxyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKS52YWx1ZTtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGNoRnVuY3Rpb24gJiZcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGNoUGF0aCAmJlxyXG4gICAgICAgICAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMubmFtZSkudmFsaWRcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnBhdGNoQ29udHJvbFZhbHVlKFxyXG4gICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWUsXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGNoRnVuY3Rpb24sXHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhdGNoUGF0aFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5PbkNoYW5nZS5lbWl0KG9yaWdpbmFsVmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShpdGVtOiBGaWxlSXRlbSkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc1VwbG9hZEZpbGVBc3luYyAmJiBpdGVtLnByb2dyZXNzID09IDEwMCkge1xyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRTZXJ2aWNlLmRlbGV0ZUZpbGUoaXRlbS5fZmlsZVtcImlEX0dVSURcIl0pLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUgPT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5maWxlVXBsb2FkTW9kZWwgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5uYW1lKS5zZXRWYWx1ZSh0aGlzLmZpbGVVcGxvYWRNb2RlbCk7XHJcbiAgICAgIHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMuZmlsZVVwbG9hZE1vZGVsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy52YWx1ZSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy52YWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlLkNvcnJlbGF0aW9uSURfR1VJRCA9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmRlbGV0ZWRGaWxlcyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5yZW1vdmVkRmlsZXMgPSBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwucmVtb3ZlZEZpbGVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGxldCBGaWxlT2JqZWN0ID0gaXRlbS5maWxlLnJhd0ZpbGU7XHJcbiAgICAgICAgICAgIGxldCBEZWxldGVkSXRlbSA9IHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuZXhpc3RpbmdGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKE9iamVjdCkgPT4gT2JqZWN0Lm5hbWVXaXRoRXh0ZW5zaW9uID09IEZpbGVPYmplY3QubmFtZVxyXG4gICAgICAgICAgICApWzBdO1xyXG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLmV4aXN0aW5nRmlsZXMgPVxyXG4gICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuZXhpc3RpbmdGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAoT2JqZWN0KSA9PiBPYmplY3QubmFtZVdpdGhFeHRlbnNpb24gIT0gRmlsZU9iamVjdC5uYW1lXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5kZWxldGVkRmlsZXMucHVzaChEZWxldGVkSXRlbSk7XHJcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwucmVtb3ZlZEZpbGVzLnB1c2goRGVsZXRlZEl0ZW0uaURfR1VJRCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgRmlsZU9iamVjdCA9IGl0ZW0uZmlsZS5yYXdGaWxlO1xyXG4gICAgICAgICAgICBsZXQgZGVsZXRlZExpc3QgPSB0aGlzLmRlbGV0ZWRGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgKE9iamVjdCkgPT4gT2JqZWN0Lm5hbWVXaXRoRXh0ZW5zaW9uID09IEZpbGVPYmplY3QubmFtZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoZGVsZXRlZExpc3QubGVuZ3RoID09IDAgfHwgZGVsZXRlZExpc3QgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgbGV0IERlbGV0ZWRJdGVtID1cclxuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuZXhpc3RpbmdGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgIChPYmplY3QpID0+IE9iamVjdC5uYW1lV2l0aEV4dGVuc2lvbiA9PSBGaWxlT2JqZWN0Lm5hbWVcclxuICAgICAgICAgICAgICAgIClbMF07XHJcbiAgICAgICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5leGlzdGluZ0ZpbGVzID1cclxuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwuZXhpc3RpbmdGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgIChPYmplY3QpID0+IE9iamVjdC5uYW1lV2l0aEV4dGVuc2lvbiAhPSBGaWxlT2JqZWN0Lm5hbWVcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgdGhpcy5kZWxldGVkRmlsZXMucHVzaChEZWxldGVkSXRlbSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5yZW1vdmVkRmlsZXMucHVzaChcclxuICAgICAgICAgICAgICAgIERlbGV0ZWRJdGVtLmlEX0dVSURcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGVsZXRlZEZpbGVzID0gW107XHJcbiAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5yZW1vdmVkRmlsZXMgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLnVwbG9hZGVkRmlsZXMgPVxyXG4gICAgICAgIHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwudXBsb2FkZWRGaWxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAoT2JqZWN0KSA9PiBPYmplY3QubmFtZVdpdGhFeHRlbnNpb24gIT0gaXRlbS5fZmlsZS5uYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgICh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsLnVwbG9hZGVkRmlsZXMgPT0gbnVsbCB8fFxyXG4gICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC51cGxvYWRlZEZpbGVzLmxlbmd0aCA9PSAwKSAmJlxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5pc1JlcXVpcmVkXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgIE1pbkZpbGVDb3VudFZhbGlkYXRpb25LZXk6IHRoaXMub3B0aW9ucy5taW5Ob09mRmlsZXMsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQ7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbC5jb3JyZWxhdGlvbklEX0dVSUQgPSB0aGlzLm9wdGlvbnMudmFsdWU/LkNvcnJlbGF0aW9uSURfR1VJRFxyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm11bHRpcGxlRmlsZVVwbG9hZE1vZGVsKTtcclxuICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLm5hbWUpLnNldFZhbHVlKHRoaXMubXVsdGlwbGVGaWxlVXBsb2FkTW9kZWwpO1xyXG4gICAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgICAgdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy5tdWx0aXBsZUZpbGVVcGxvYWRNb2RlbDtcclxuICAgIH1cclxuICB9XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICByZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICB0aGlzLm9wdGlvbnNcclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIGFkZFJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuYWRkUmVxdWlyZWRWYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIHJlbW92ZUN1c3RvbVZhbGlkYXRpb24gPSAoY3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5yZW1vdmVDdXN0b21WYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIGN1c3RvbVZhbGlkYXRpb25cclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIGFkZEN1c3RvbVZhbGlkYXRpb24gPSAoY3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5hZGRDdXN0b21WYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIGN1c3RvbVZhbGlkYXRpb25cclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIGlzVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LmlzVmFsaWQodGhpcy5maWxlVXBsb2FkRm9ybUNvbnRyb2wpO1xyXG4gIH07XHJcbiAgY29udmVydFNpemVUb01CKHNpemU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb252ZXJ0IHNpemUgdG8gbWVnYWJ5dGVzXHJcbiAgICBjb25zdCBtZWdhYnl0ZXMgPSBzaXplIC8gKDEwMjQgKiAxMDI0KTtcclxuXHJcbiAgICAvLyBSb3VuZCB0byB0d28gZGVjaW1hbCBwbGFjZXNcclxuICAgIGNvbnN0IHJvdW5kZWRNZWdhYnl0ZXMgPSBNYXRoLnJvdW5kKG1lZ2FieXRlcyAqIDEwMCkgLyAxMDA7XHJcblxyXG4gICAgcmV0dXJuIHJvdW5kZWRNZWdhYnl0ZXM7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGJic2YtY29udHJvbCBiYnNmLWZpbGUtdXBsb2FkXCIgW2Zvcm1Hcm91cF09XCJncm91cFwiPlxyXG4gIDxkaXYgW25nQ2xhc3NdPVwiKG9wdGlvbnMudmlld1R5cGU9PTEpPydiYnNmLXZlcnRpY2FsJzonYmJzZi1ob3Jpem9udGFsJ1wiPlxyXG4gICAgPCEtLWxhYmVsLS0+XHJcbiAgICA8bGFiZWwgW2hpZGRlbl09XCJvcHRpb25zLmhpZGVMYWJlbFwiIGNsYXNzPVwiYmJzZi1sYWJlbCB7e29wdGlvbnMubGFiZWxFeHRyYUNsYXNzZXN9fVwiPlxyXG4gICAgICB7e29wdGlvbnMubGFiZWxWYWx1ZX19XHJcbiAgICAgIDwhLS1Bc3Rlcmlzay0tPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIigob3B0aW9ucy5zaG93QXN0ZXJpc2smJm9wdGlvbnMuaXNSZXF1aXJlZCl8fChvcHRpb25zLmlzUmVxdWlyZWQpKSYmIW9wdGlvbnMuaXNSZWFkb25seVwiXHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gICAgPCEtLUFsbG93IGRyb3Bab25lLS0+XHJcbiAgICA8ZGl2IG5nMkZpbGVEcm9wIGNsYXNzPVwiYmJzZi1pbnB1dC1jb250YWluZXIge3tvcHRpb25zLmV4dHJhQ2xhc3Nlc319XCJcclxuICAgICAgKm5nSWY9XCIob3B0aW9ucy5pc0Ryb3Bab25lKSYmKCEoKG9wdGlvbnMuaXNNdWx0aXBsZUZpbGU9PWZhbHNlKSYmKHVwbG9hZGVyLnF1ZXVlLmxlbmd0aCk+MCkpJiYhb3B0aW9ucy5pc1JlYWRvbmx5XCJcclxuICAgICAgW25nQ2xhc3NdPVwieydhbm90aGVyLWZpbGUtb3Zlci1jbGFzcyc6IGhhc0Fub3RoZXJEcm9wWm9uZU92ZXJ9XCIgKG9uRmlsZURyb3ApPVwib25GaWxlQ2hhbmdlKClcIlxyXG4gICAgICAoZmlsZU92ZXIpPVwiZmlsZU92ZXJBbm90aGVyKCRldmVudClcIiBbdXBsb2FkZXJdPVwidXBsb2FkZXJcIiBbYWNjZXB0XT1cImFjY2VwdGVkVHlwZVwiIChjaGFuZ2UpPVwib25GaWxlQ2hhbmdlKClcIlxyXG4gICAgICBpZD1cInt7b3B0aW9ucy5uYW1lfX1cIiBtdWx0aXBsZT1cInt7b3B0aW9ucy5pc011bHRpcGxlRmlsZT8nbXVsdGlwbGUnOicnfX1cIiBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIlxyXG4gICAgICBhcmlhLWludmFsaWQ9XCJ0cnVlXCIgdHlwZT1cImZpbGVcIiBmb3JtQ29udHJvbE5hbWU9XCJ7e29wdGlvbnMubmFtZX19XCIgI2ZpbGVJbnB1dFxyXG4gICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJmaWxlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBmaWxlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcHpvbmUtbGFiZWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ZnLWFuZC12YWxpZGF0aW9uXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDUwcHg7XCI+XHJcbiAgICAgICAgICAgIDxwYXRoIG9wYWNpdHk9XCIwLjNcIlxyXG4gICAgICAgICAgICAgIGQ9XCJNNSAxNkMzLjMgMTYgMiAxNC43IDIgMTNDMiAxMS4zIDMuMyAxMCA1IDEwSDUuMUM1IDkuNyA1IDkuMyA1IDlDNSA2LjIgNy4yIDQgMTAgNEMxMS45IDQgMTMuNSA1IDE0LjMgNi41QzE0LjggNi4yIDE1LjQgNiAxNiA2QzE3LjcgNiAxOSA3LjMgMTkgOUMxOSA5LjQgMTguOSA5LjcgMTguOCAxMEMxOC45IDEwIDE4LjkgMTAgMTkgMTBDMjAuNyAxMCAyMiAxMS4zIDIyIDEzQzIyIDE0LjcgMjAuNyAxNiAxOSAxNkg1Wk04IDEzLjZIMTZMMTIuNyAxMC4zQzEyLjMgOS44OTk5OSAxMS43IDkuODk5OTkgMTEuMyAxMC4zTDggMTMuNlpcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHlsZT1cImZpbGw6ICNhMWExYTE7XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTExIDEzLjZWMTlDMTEgMTkuNiAxMS40IDIwIDEyIDIwQzEyLjYgMjAgMTMgMTkuNiAxMyAxOVYxMy42SDExWlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwiZmlsbDogIzk4OTg5ODtcIj48L3BhdGg+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwhLS1WYWxpZGF0aW9uIHRleHQtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLXZhbGlkYXRpb24tbXNnIHRleHQtY2VudGVyXCI+e3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRHJhZ0FuZERyb3BIZXJlXCIpfX0gPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZyB0ZXh0LWNlbnRlclwiICpuZ0lmPVwidmFsaWRhdGlvbk1lc3NhZ2VcIiBbaW5uZXJIVE1MXT1cInZhbGlkYXRpb25NZXNzYWdlXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZyBuZy1zdGFyLWluc2VydGVkIHRleHQtY2VudGVyIHRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJ2YWxpZGF0aW9uQ291bnRNZXNzYWdlICYmb3B0aW9ucy5pc011bHRpcGxlRmlsZSAmJm9wdGlvbnMubWF4Tm9PZkZpbGVzPjBcIlxyXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cInZhbGlkYXRpb25Db3VudE1lc3NhZ2VcIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1Ob3QgYWxsb3dlZCBkcm9wWm9uZS0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtaW5wdXQtY29udGFpbmVyXCIgKm5nSWY9XCIoIW9wdGlvbnMuaXNEcm9wWm9uZSkmJiEoaXNIaWRlSW5wdXQoKSkmJiFvcHRpb25zLmlzUmVhZG9ubHlcIlxyXG4gICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKCk7XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkcm9wem9uZS1sYWJlbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdmctYW5kLXZhbGlkYXRpb25cIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogNTBweDtcIj5cclxuICAgICAgICAgICAgPHBhdGggb3BhY2l0eT1cIjAuM1wiXHJcbiAgICAgICAgICAgICAgZD1cIk01IDE2QzMuMyAxNiAyIDE0LjcgMiAxM0MyIDExLjMgMy4zIDEwIDUgMTBINS4xQzUgOS43IDUgOS4zIDUgOUM1IDYuMiA3LjIgNCAxMCA0QzExLjkgNCAxMy41IDUgMTQuMyA2LjVDMTQuOCA2LjIgMTUuNCA2IDE2IDZDMTcuNyA2IDE5IDcuMyAxOSA5QzE5IDkuNCAxOC45IDkuNyAxOC44IDEwQzE4LjkgMTAgMTguOSAxMCAxOSAxMEMyMC43IDEwIDIyIDExLjMgMjIgMTNDMjIgMTQuNyAyMC43IDE2IDE5IDE2SDVaTTggMTMuNkgxNkwxMi43IDEwLjNDMTIuMyA5Ljg5OTk5IDExLjcgOS44OTk5OSAxMS4zIDEwLjNMOCAxMy42WlwiXHJcbiAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0eWxlPVwiZmlsbDogI2ExYTFhMTtcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgMTMuNlYxOUMxMSAxOS42IDExLjQgMjAgMTIgMjBDMTIuNiAyMCAxMyAxOS42IDEzIDE5VjEzLjZIMTFaXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmaWxsOiAjOTg5ODk4O1wiPjwvcGF0aD5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPCEtLVZhbGlkYXRpb24gdGV4dC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvbi1tc2cgIHRleHQtY2VudGVyXCI+e3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiVXBsb2FkXCIpfX0gPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uLW1zZyAgdGV4dC1jZW50ZXJcIiAqbmdJZj1cInZhbGlkYXRpb25NZXNzYWdlXCIgW2lubmVySFRNTF09XCJ2YWxpZGF0aW9uTWVzc2FnZVwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvbi1tc2cgbmctc3Rhci1pbnNlcnRlZCB0ZXh0LWNlbnRlciB0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwidmFsaWRhdGlvbkNvdW50TWVzc2FnZSAmJm9wdGlvbnMuaXNNdWx0aXBsZUZpbGUgJiZvcHRpb25zLm1heE5vT2ZGaWxlcz4wXCJcclxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJ2YWxpZGF0aW9uQ291bnRNZXNzYWdlXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8aW5wdXQgbmcyRmlsZVNlbGVjdCBbdXBsb2FkZXJdPVwidXBsb2FkZXJcIiBbYWNjZXB0XT1cImFjY2VwdGVkVHlwZVwiXHJcbiAgICAgICAgY2xhc3M9XCJmaWxlU2VsZWN0b3IgY3VzdG9tRmlsZVVwbG9hZFBsYWNtZW50IGhpZGRlbiAgdi1yZXF1aXJlZC1tdWx0aXBsZWZpbGVzIGQtbm9uZVwiXHJcbiAgICAgICAgbXVsdGlwbGU9XCJ7e29wdGlvbnMuaXNNdWx0aXBsZUZpbGU/J211bHRpcGxlJzonJ319XCIgbmFtZT1cImZpbGVcIiB0eXBlPVwiZmlsZVwiIHZhbHVlPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgpXCIgW25nQ2xhc3NdPVwiKG9wdGlvbnMudmlld1R5cGU9PTEpPycnOidjb2wtbWQtOSdcIiBpZD1cInt7b3B0aW9ucy5uYW1lfX1cIlxyXG4gICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJlbWFpbC1lcnJvclwiIGFyaWEtaW52YWxpZD1cInRydWVcIiBmb3JtQ29udHJvbE5hbWU9XCJ7e29wdGlvbnMubmFtZX19XCIgI2ZpbGVJbnB1dFxyXG4gICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImZpbGVVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkICYmIGZpbGVVcGxvYWRGb3JtQ29udHJvbC50b3VjaGVkXCI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gcmVhZG9ubHkgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwib3B0aW9ucy5pc1JlYWRvbmx5ICYmICFvcHRpb25zLnZhbHVlXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmlld1wiPnt7VXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnTkEnKX19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPCEtLWl0ZW1zIHVwbG9hZGVkLS0+XHJcbiAgPGRpdiBjbGFzcz1cInVwbG9hZGVkLWl0ZW1zXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdXBsb2FkZXIucXVldWVcIj5cclxuICAgICAgPGEgbmdiVG9vbHRpcD1cInt7aXRlbT8ucHJvZ3Jlc3M8MTAwP1V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ1VwbG9hZGluZycpOlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ1VwbG9hZGVkJyl9fToge3tpdGVtPy5wcm9ncmVzc319JSAgIHt7IGNvbnZlcnRTaXplVG9NQihpdGVtPy5maWxlPy5zaXplKX19TUJcIlxyXG4gICAgICAgIGhyZWY9XCJ7eyBpdGVtPy5maWxlPy5yYXdGaWxlIH19XCIgY2xhc3M9XCJidG4gYnRuLWRvd25sb2FkLWZpbGUgYnRuLXNtIGJ0bi1wcm9ncmVzcy11cGxvYWRcIiBkb3dubG9hZD5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiaXRlbT8uX2ZpbGU/LlsnaURfR1VJRCddJiYhaXRlbT8ucHJvZ3Jlc3NcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgZD1cIk0yMSAyMkgzQzIuNCAyMiAyIDIxLjYgMiAyMUMyIDIwLjQgMi40IDIwIDMgMjBIMjFDMjEuNiAyMCAyMiAyMC40IDIyIDIxQzIyIDIxLjYgMjEuNiAyMiAyMSAyMlpNMTMgMTMuNFYzQzEzIDIuNCAxMi42IDIgMTIgMkMxMS40IDIgMTEgMi40IDExIDNWMTMuNEgxM1pcIlxyXG4gICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9wYXRoPlxyXG4gICAgICAgICAgPHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNNyAxMy40SDE3TDEyLjcgMTcuN0MxMi4zIDE4LjEgMTEuNyAxOC4xIDExLjMgMTcuN0w3IDEzLjRaXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3ZnICpuZ0lmPVwiaXRlbT8ucHJvZ3Jlc3MgPT0gMTAwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgIDxwYXRoIG9wYWNpdHk9XCIwLjRcIlxyXG4gICAgICAgICAgICBkPVwiTTEyIDIyQzE3LjUyMjggMjIgMjIgMTcuNTIyOCAyMiAxMkMyMiA2LjQ3NzE1IDE3LjUyMjggMiAxMiAyQzYuNDc3MTUgMiAyIDYuNDc3MTUgMiAxMkMyIDE3LjUyMjggNi40NzcxNSAyMiAxMiAyMlpcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCJibGFja1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk03LjUgMTJMMTAuNSAxNUwxNi41IDlcIiBzdHJva2U9XCJibGFja1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5wcm9ncmVzcyA8IDEwMCYmb3B0aW9ucy5pc1VwbG9hZEZpbGVBc3luY1wiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1tdXRlZFwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkxvYWRpbmcuLi48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLW5hbWVcIj57eyBpdGVtPy5maWxlPy5uYW1lIH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidXBsb2FkXCIgW2NsYXNzLmZpbGUtdXBsb2FkZWRdPVwiaXRlbT8ucHJvZ3Jlc3MgPj0gMTAwXCIgW3N0eWxlLndpZHRoLiVdPVwiaXRlbT8ucHJvZ3Jlc3NcIlxyXG4gICAgICAgICAgKm5nSWY9XCJpdGVtPy5wcm9ncmVzcyA+IDBcIj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYT5cclxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFvcHRpb25zLmlzUmVhZG9ubHlcIiBjbGFzcz1cImJ0biBidG4tZG93bmxvYWQtZmlsZSBidG4tc20gYnRuLWRhbmdlclwiXHJcbiAgICAgICAgKGNsaWNrKT1cIml0ZW0ucmVtb3ZlKCk7cmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShpdGVtKVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXMgcHgtMFwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInN1YnRleHQtY29udGFpbmVyXCIgKm5nSWY9XCIhb3B0aW9ucy5pc1JlYWRvbmx5XCI+XHJcbiAgICA8IS0tIHJlcXVpcmVkIHRleHQtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJiYnNmLXZhbGlkYXRpb25cIiAqbmdJZj1cIihmaWxlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBmaWxlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZClcIj5cclxuICAgICAge3tnZXRFcnJvclZhbGlkYXRpb24oZmlsZVVwbG9hZEZvcm1Db250cm9sLmVycm9yc3xrZXl2YWx1ZSl9fVxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIExhYmVsRGVzY3JpcHRpb24tLT5cclxuICAgIDxkaXYgY2xhc3M9XCJiYnNmLWNvbnRyb2wtZGVzY1wiICpuZ0lmPVwib3B0aW9ucy5sYWJlbERlc2NyaXB0aW9uIT1udWxsXCI+IHt7b3B0aW9ucy5sYWJlbERlc2NyaXB0aW9ufX08L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCIoZ3JvdXAudmFsaWQmJmdyb3VwLmRpcnR5JiZncm91cC50b3VjaGVkICl8fChncm91cC51bnRvdWNoZWQmJmdyb3VwLmludmFsaWQmJmdyb3VwLmRpcnR5KSBcIj5cclxuICAgICAge3tyZXNldEVycm9yKCl9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+Il19