igniteui-angular 18.1.16 → 18.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/esm2022/lib/calendar/calendar.component.mjs +3 -10
  2. package/esm2022/lib/calendar/days-view/days-view.component.mjs +3 -3
  3. package/esm2022/lib/combo/combo.common.mjs +17 -7
  4. package/esm2022/lib/combo/combo.component.mjs +3 -3
  5. package/esm2022/lib/date-common/picker-base.directive.mjs +12 -1
  6. package/esm2022/lib/date-picker/date-picker.component.mjs +10 -7
  7. package/esm2022/lib/date-range-picker/date-range-picker.component.mjs +9 -2
  8. package/esm2022/lib/grids/filtering/base/grid-filtering-row.component.mjs +7 -7
  9. package/esm2022/lib/grids/grid-base.directive.mjs +11 -3
  10. package/esm2022/lib/grids/selection/selection.service.mjs +4 -4
  11. package/esm2022/lib/grids/tree-grid/tree-grid-selection.service.mjs +5 -5
  12. package/esm2022/lib/slider/slider.component.mjs +4 -38
  13. package/esm2022/lib/slider/thumb/thumb-slider.component.mjs +55 -2
  14. package/esm2022/lib/time-picker/time-picker.component.mjs +4 -1
  15. package/fesm2022/igniteui-angular.mjs +133 -79
  16. package/fesm2022/igniteui-angular.mjs.map +1 -1
  17. package/lib/combo/combo.common.d.ts +3 -0
  18. package/lib/date-common/picker-base.directive.d.ts +6 -0
  19. package/lib/date-picker/date-picker.component.d.ts +2 -0
  20. package/lib/date-range-picker/date-range-picker.component.d.ts +2 -0
  21. package/lib/grids/filtering/base/grid-filtering-row.component.d.ts +1 -1
  22. package/lib/grids/grid-base.directive.d.ts +3 -1
  23. package/lib/grids/selection/selection.service.d.ts +1 -1
  24. package/lib/slider/slider.component.d.ts +0 -16
  25. package/lib/slider/thumb/thumb-slider.component.d.ts +12 -1
  26. package/lib/time-picker/time-picker.component.d.ts +1 -0
  27. package/package.json +1 -1
@@ -163,6 +163,9 @@ export class IgxDateRangePickerComponent extends PickerBaseDirective {
163
163
  get separatorClass() {
164
164
  return 'igx-date-range-picker__label';
165
165
  }
166
+ get toggleContainer() {
167
+ return this._calendarContainer;
168
+ }
166
169
  get required() {
167
170
  if (this._ngControl && this._ngControl.control && this._ngControl.control.validator) {
168
171
  const error = this._ngControl.control.validator({});
@@ -496,7 +499,7 @@ export class IgxDateRangePickerComponent extends PickerBaseDirective {
496
499
  if (args.cancel) {
497
500
  return;
498
501
  }
499
- if (this.isDropdown && e?.event && !this.element.nativeElement.contains(e.event.target)) {
502
+ if (this.isDropdown && e?.event && !this.isFocused) {
500
503
  // outside click
501
504
  this.updateValidityOnBlur();
502
505
  }
@@ -523,10 +526,12 @@ export class IgxDateRangePickerComponent extends PickerBaseDirective {
523
526
  return;
524
527
  }
525
528
  this._initializeCalendarContainer(e.componentRef.instance);
529
+ this._calendarContainer = e.componentRef.location.nativeElement;
526
530
  this._collapsed = false;
527
531
  this.updateCalendar();
528
532
  });
529
533
  this._overlayService.opened.pipe(...this._overlaySubFilter).subscribe(() => {
534
+ this.calendar.wrapper.nativeElement.focus();
530
535
  this.opened.emit({ owner: this });
531
536
  });
532
537
  this._overlayService.closing.pipe(...this._overlaySubFilter).subscribe((e) => {
@@ -536,6 +541,8 @@ export class IgxDateRangePickerComponent extends PickerBaseDirective {
536
541
  this._overlayService.detach(this._overlayId);
537
542
  this._collapsed = true;
538
543
  this._overlayId = null;
544
+ this._calendar = null;
545
+ this._calendarContainer = undefined;
539
546
  this.closed.emit({ owner: this });
540
547
  });
541
548
  }
@@ -888,4 +895,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImpor
888
895
  type: HostListener,
889
896
  args: ['keydown', ['$event']]
890
897
  }] } });
891
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ1ksZ0JBQWdCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUM1RixZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQVksS0FBSyxFQUFFLFNBQVMsRUFDN0MsUUFBUSxFQUFFLE1BQU0sRUFDL0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFDMUQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDb0MsU0FBUyxFQUNoRCxhQUFhLEVBQUUsaUJBQWlCLEVBQ25DLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQTRCLElBQUksRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQW1DLE1BQU0sMENBQTBDLENBQUM7QUFDN0gsT0FBTyxFQUFtQyxNQUFNLEVBQUUsU0FBUyxF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QixFQUFFO2dCQW9CL0IsU0FBUztzQkFEZixLQUFLO2dCQWdCSyxjQUFjO3NCQUR4QixLQUFLO2dCQW9CVSxlQUFlO3NCQUQ5QixLQUFLO2dCQWdCVSxhQUFhO3NCQUQ1QixLQUFLO2dCQWVVLFdBQVc7c0JBRDFCLEtBQUs7Z0JBVUssUUFBUTtzQkFEbEIsS0FBSztnQkFpQkssUUFBUTtzQkFEbEIsS0FBSztnQkFlSyxlQUFlO3NCQUR6QixLQUFLO2dCQXFCVSxXQUFXO3NCQUQxQixLQUFLO2dCQWlCVSxNQUFNO3NCQURyQixLQUFLO2dCQWVDLGVBQWU7c0JBRHJCLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBWS9CLFdBQVc7c0JBRGpCLE1BQU07Z0JBS0EsUUFBUTtzQkFEZCxXQUFXO3VCQUFDLDZCQUE2QjtnQkFJbEMsZ0JBQWdCO3NCQUR2QixTQUFTO3VCQUFDLHNCQUFzQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUt0RCxjQUFjO3NCQURwQixTQUFTO3VCQUFDLGlCQUFpQjtnQkFLckIsZUFBZTtzQkFEckIsZUFBZTt1QkFBQywrQkFBK0I7Z0JBSXpDLEtBQUs7c0JBRFgsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBSXhCLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMseUJBQXlCO2dCQUtoQyxxQkFBcUI7c0JBRDNCLFlBQVk7dUJBQUMsOEJBQThCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQXVEeEQsS0FBSztzQkFEZixLQUFLO2dCQWlGQyxTQUFTO3NCQUZmLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LCBib29sZWFuQXR0cmlidXRlLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBMT0NBTEVfSUQsXG4gICAgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLFxuICAgIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlLCBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIG5vb3AsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENhbGVuZGFyU2VsZWN0aW9uLCBJZ3hDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgRGF0ZVJhbmdlVHlwZSB9IGZyb20gJy4uL2NvcmUvZGF0ZXMnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlUGlja2VyUmVzb3VyY2VTdHJpbmdzRU4sIElEYXRlUmFuZ2VQaWNrZXJSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vZGF0ZS1yYW5nZS1waWNrZXItcmVzb3VyY2VzJztcbmltcG9ydCB7IElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MsIGlzRGF0ZSwgcGFyc2VEYXRlLCBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneENhbGVuZGFyQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1jb21tb24vY2FsZW5kYXItY29udGFpbmVyL2NhbGVuZGFyLWNvbnRhaW5lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGlja2VyQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RhdGUtY29tbW9uL3BpY2tlci1iYXNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hQaWNrZXJBY3Rpb25zRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGF0ZS1jb21tb24vcGlja2VyLWljb25zLmNvbW1vbic7XG5pbXBvcnQgeyBEYXRlVGltZVV0aWwgfSBmcm9tICcuLi9kYXRlLWNvbW1vbi91dGlsL2RhdGUtdGltZS51dGlsJztcbmltcG9ydCB7IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gICAgSWd4SW5wdXREaXJlY3RpdmUsIElneElucHV0R3JvdXBDb21wb25lbnQsIElneElucHV0R3JvdXBUeXBlLCBJZ3hJbnB1dFN0YXRlLFxuICAgIElneExhYmVsRGlyZWN0aXZlLCBJR1hfSU5QVVRfR1JPVVBfVFlQRVxufSBmcm9tICcuLi9pbnB1dC1ncm91cC9wdWJsaWNfYXBpJztcbmltcG9ydCB7XG4gICAgQXV0b1Bvc2l0aW9uU3RyYXRlZ3ksIElneE92ZXJsYXlTZXJ2aWNlLCBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncywgT3ZlcmxheUV2ZW50QXJncyxcbiAgICBPdmVybGF5U2V0dGluZ3MsIFBvc2l0aW9uU2V0dGluZ3Ncbn0gZnJvbSAnLi4vc2VydmljZXMvcHVibGljX2FwaSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2UsIElneERhdGVSYW5nZUVuZENvbXBvbmVudCwgSWd4RGF0ZVJhbmdlSW5wdXRzQmFzZUNvbXBvbmVudCwgSWd4RGF0ZVJhbmdlU2VwYXJhdG9yRGlyZWN0aXZlLCBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudCwgRGF0ZVJhbmdlUGlja2VyRm9ybWF0UGlwZSB9IGZyb20gJy4vZGF0ZS1yYW5nZS1waWNrZXItaW5wdXRzLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hQcmVmaXhEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3ByZWZpeC9wcmVmaXguZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcbmltcG9ydCB7IGZhZGVJbiwgZmFkZU91dCB9IGZyb20gJ2lnbml0ZXVpLWFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbmNvbnN0IFNpbmdsZUlucHV0RGF0ZXNDb25jYXRlbmF0aW9uU3RyaW5nID0gJyAtICc7XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gc2VsZWN0IGEgcmFuZ2Ugb2YgZGF0ZXMgZnJvbSBhIGNhbGVuZGFyIFVJIG9yIGVkaXRhYmxlIGlucHV0cy5cbiAqXG4gKiBAaWd4TW9kdWxlIElneERhdGVSYW5nZU1vZHVsZVxuICpcbiAqIEBpZ3hUaGVtZSBpZ3gtaW5wdXQtZ3JvdXAtdGhlbWUsIGlneC1jYWxlbmRhci10aGVtZSwgaWd4LWRhdGUtcmFuZ2UtcGlja2VyLXRoZW1lXG4gKlxuICogQGlneEtleXdvcmRzIGRhdGUsIHJhbmdlLCBkYXRlIHJhbmdlLCBkYXRlIHBpY2tlclxuICpcbiAqIEBpZ3hHcm91cCBzY2hlZHVsaW5nXG4gKlxuICogQHJlbWFya3NcbiAqIEl0IGRpc3BsYXlzIHRoZSByYW5nZSBzZWxlY3Rpb24gaW4gYSBzaW5nbGUgb3IgdHdvIGlucHV0IGZpZWxkcy5cbiAqIFRoZSBkZWZhdWx0IHRlbXBsYXRlIGRpc3BsYXlzIGEgc2luZ2xlICpyZWFkb25seSogaW5wdXQgZmllbGRcbiAqIHdoaWxlIHByb2plY3RpbmcgYGlneC1kYXRlLXJhbmdlLXN0YXJ0YCBhbmQgYGlneC1kYXRlLXJhbmdlLWVuZGBcbiAqIGRpc3BsYXlzIHR3byAqZWRpdGFibGUqIGlucHV0IGZpZWxkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBtb2RlPVwiZHJvcGRvd25cIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1kYXRlLXJhbmdlLXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IElneERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCwgbXVsdGk6IHRydWUgfSxcbiAgICAgICAgeyBwcm92aWRlOiBOR19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogSWd4RGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50LCBtdWx0aTogdHJ1ZSB9XG4gICAgXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdJZixcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICAgICAgSWd4SWNvbkNvbXBvbmVudCxcbiAgICAgICAgSWd4SW5wdXRHcm91cENvbXBvbmVudCxcbiAgICAgICAgSWd4SW5wdXREaXJlY3RpdmUsXG4gICAgICAgIElneFByZWZpeERpcmVjdGl2ZSxcbiAgICAgICAgRGF0ZVJhbmdlUGlja2VyRm9ybWF0UGlwZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgSWd4RGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50IGV4dGVuZHMgUGlja2VyQmFzZURpcmVjdGl2ZVxuICAgIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3BsYXllZCBtb250aCB2aWV3cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGVmYXVsdCBpcyBgMmAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtkaXNwbGF5TW9udGhzQ291bnRdPVwiM1wiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc3BsYXlNb250aHNDb3VudCA9IDI7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciBkYXRlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgY3VycmVudCBtb250aCB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbaGlkZU91dHNpZGVEYXlzXT1cInRydWVcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgaGlkZU91dHNpZGVEYXlzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQSBjdXN0b20gZm9ybWF0dGVyIGZ1bmN0aW9uLCBhcHBsaWVkIG9uIHRoZSBzZWxlY3RlZCBvciBwYXNzZWQgaW4gZGF0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHByaXZhdGUgZGF5Rm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlblwiLCB7IHdlZWtkYXk6IFwibG9uZ1wiIH0pO1xuICAgICAqIHByaXZhdGUgbW9udGhGb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuXCIsIHsgbW9udGg6IFwibG9uZ1wiIH0pO1xuICAgICAqXG4gICAgICogcHVibGljIGZvcm1hdHRlcihkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgKiAgcmV0dXJuIGAke3RoaXMuZGF5Rm9ybWF0dGVyLmZvcm1hdChkYXRlKX0gLSAke3RoaXMubW9udGhGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpfSAtICR7ZGF0ZS5nZXRGdWxsWWVhcigpfWA7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtmb3JtYXR0ZXJdPVwiZm9ybWF0dGVyXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZm9ybWF0dGVyOiAodmFsOiBEYXRlUmFuZ2UpID0+IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB0ZXh0IG9mIHRoZSBjYWxlbmRhciBkaWFsb2cgKipEb25lKiogYnV0dG9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgdmFsdWUgZnJvbSByZXNvdXJjZSBzdHJpbmdzLCBgXCJEb25lXCJgIGZvciB0aGUgYnVpbHQtaW4gRU4uXG4gICAgICogVGhlIGJ1dHRvbiB3aWxsIG9ubHkgc2hvdyB1cCBpbiBgZGlhbG9nYCBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBkb25lQnV0dG9uVGV4dD1cIuWujOS6hlwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkb25lQnV0dG9uVGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RvbmVCdXR0b25UZXh0ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkb25lQnV0dG9uVGV4dCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5fZG9uZUJ1dHRvblRleHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZGF0ZV9yYW5nZV9waWNrZXJfZG9uZV9idXR0b247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvbmVCdXR0b25UZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDdXN0b20gb3ZlcmxheSBzZXR0aW5ncyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGNhbGVuZGFyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbb3ZlcmxheVNldHRpbmdzXT1cImN1c3RvbU92ZXJsYXlTZXR0aW5nc1wiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIG92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZvcm1hdCB1c2VkIHdoZW4gZWRpdGFibGUgaW5wdXRzIGFyZSBub3QgZm9jdXNlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVXNlcyBBbmd1bGFyJ3MgRGF0ZVBpcGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIGRpc3BsYXlGb3JtYXQ9XCJFRS9NL3l5XCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5Rm9ybWF0OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgdXNlciBpbnB1dCBmb3JtYXQgYW5kIHBsYWNlaG9sZGVyLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0IGlzIGBcIidNTS9kZC95eXl5J1wiYFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBpbnB1dEZvcm1hdD1cImRkL01NL3l5XCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaW5wdXRGb3JtYXQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHZhbHVlIGluIGEgdmFsaWQgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW21pblZhbHVlXT1cIm1pbkRhdGVcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgbWluVmFsdWUodmFsdWU6IERhdGUgfCBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbWluVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWluVmFsdWUoKTogRGF0ZSB8IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5WYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSB2YWx1ZSBpbiBhIHZhbGlkIHJhbmdlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFttYXhWYWx1ZV09XCJtYXhEYXRlXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IG1heFZhbHVlKHZhbHVlOiBEYXRlIHwgc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21heFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1heFZhbHVlKCk6IERhdGUgfCBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCBzZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSURhdGVSYW5nZVBpY2tlclJlc291cmNlU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9yZXNvdXJjZVN0cmluZ3MsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBhY2Nlc3NvciB0aGF0IHJldHVybnMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNvdXJjZVN0cmluZ3MoKTogSURhdGVSYW5nZVBpY2tlclJlc291cmNlU3RyaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHBsYWNlaG9sZGVyYCBmb3Igc2luZ2xlLWlucHV0IGBJZ3hEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogICBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtwbGFjZWhvbGRlcl09XCInQ2hvb3NlIHlvdXIgZGF0ZXMnXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcGxhY2Vob2xkZXIgPSAnJztcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgY29udGFpbmVyIHVzZWQgZm9yIHRoZSBwb3B1cCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiAgYG91dGxldGAgaXMgYW4gaW5zdGFuY2Ugb2YgYElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmVgIG9yIGFuIGBFbGVtZW50UmVmYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8ZGl2IGlneE92ZXJsYXlPdXRsZXQgI291dGxldD1cIm92ZXJsYXktb3V0bGV0XCI+PC9kaXY+XG4gICAgICogLy8uLlxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW291dGxldF09XCJvdXRsZXRcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiAvLy4uXG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgb3V0bGV0OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIHwgRWxlbWVudFJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogU2hvdy9oaWRlIHdlZWsgbnVtYmVyc1xuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtzaG93V2Vla051bWJlcnNdPVwidHJ1ZVwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIHNob3dXZWVrTnVtYmVycyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBwaWNrZXIncyB2YWx1ZSBjaGFuZ2VzLiBVc2VkIGZvciB0d28td2F5IGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFsodmFsdWUpXT1cImRhdGVcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVSYW5nZT4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWRhdGUtcmFuZ2UtcGlja2VyJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWRhdGUtcmFuZ2UtcGlja2VyJztcblxuICAgIEBWaWV3Q2hpbGQoSWd4SW5wdXRHcm91cENvbXBvbmVudCwgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hJbnB1dERpcmVjdGl2ZSlcbiAgICBwdWJsaWMgaW5wdXREaXJlY3RpdmU6IElneElucHV0RGlyZWN0aXZlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hEYXRlUmFuZ2VJbnB1dHNCYXNlQ29tcG9uZW50KVxuICAgIHB1YmxpYyBwcm9qZWN0ZWRJbnB1dHM6IFF1ZXJ5TGlzdDxJZ3hEYXRlUmFuZ2VJbnB1dHNCYXNlQ29tcG9uZW50PjtcblxuICAgIEBDb250ZW50Q2hpbGQoSWd4TGFiZWxEaXJlY3RpdmUpXG4gICAgcHVibGljIGxhYmVsOiBJZ3hMYWJlbERpcmVjdGl2ZTtcblxuICAgIEBDb250ZW50Q2hpbGQoSWd4UGlja2VyQWN0aW9uc0RpcmVjdGl2ZSlcbiAgICBwdWJsaWMgcGlja2VyQWN0aW9uczogSWd4UGlja2VyQWN0aW9uc0RpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RGF0ZVJhbmdlU2VwYXJhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGRhdGVTZXBhcmF0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgZGF0ZVNlcGFyYXRvcigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5fZGF0ZVNlcGFyYXRvciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9kYXRlX3JhbmdlX3BpY2tlcl9kYXRlX3NlcGFyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVNlcGFyYXRvcjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGFwcGxpZWRGb3JtYXQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lVXRpbC5nZXRMb2NhbGVEYXRlRm9ybWF0KHRoaXMubG9jYWxlLCB0aGlzLmRpc3BsYXlGb3JtYXQpXG4gICAgICAgICAgICB8fCBEYXRlVGltZVV0aWwuREVGQVVMVF9JTlBVVF9GT1JNQVQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBzaW5nbGVJbnB1dEZvcm1hdCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5wbGFjZWhvbGRlciAhPT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybWF0ID0gdGhpcy5hcHBsaWVkRm9ybWF0O1xuICAgICAgICByZXR1cm4gYCR7Zm9ybWF0fSR7U2luZ2xlSW5wdXREYXRlc0NvbmNhdGVuYXRpb25TdHJpbmd9JHtmb3JtYXR9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGNhbGVuZGFyIHN0YXRlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzdGF0ZSA9IHRoaXMuZGF0ZVJhbmdlLmNvbGxhcHNlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGNvbGxhcHNlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbHVlIC8gcmFuZ2UgZnJvbSB0aGUgY2FsZW5kYXJcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGN1cnJlbnQgdmFsdWUgaXMgb2YgdHlwZSBgRGF0ZVJhbmdlYFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbmV3VmFsdWU6IERhdGVSYW5nZSA9IHsgc3RhcnQ6IG5ldyBEYXRlKFwiMi8yLzIwMTJcIiksIGVuZDogbmV3IERhdGUoXCIzLzMvMjAxM1wiKX07XG4gICAgICogdGhpcy5kYXRlUmFuZ2VQaWNrZXIudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IERhdGVSYW5nZSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBEYXRlUmFuZ2UgfCBudWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodmFsdWUpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGFzUHJvamVjdGVkSW5wdXRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0ZWRJbnB1dHM/Lmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBzZXBhcmF0b3JDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJ2lneC1kYXRlLXJhbmdlLXBpY2tlcl9fbGFiZWwnO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fbmdDb250cm9sICYmIHRoaXMuX25nQ29udHJvbC5jb250cm9sICYmIHRoaXMuX25nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvcikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3Ioe30gYXMgQWJzdHJhY3RDb250cm9sKTtcbiAgICAgICAgICAgIHJldHVybiAoZXJyb3IgJiYgZXJyb3IucmVxdWlyZWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGNhbGVuZGFyKCk6IElneENhbGVuZGFyQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFyO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGRyb3Bkb3duT3ZlcmxheVNldHRpbmdzKCk6IE92ZXJsYXlTZXR0aW5ncyB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9kcm9wRG93bk92ZXJsYXlTZXR0aW5ncywgdGhpcy5vdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGRpYWxvZ092ZXJsYXlTZXR0aW5ncygpOiBPdmVybGF5U2V0dGluZ3Mge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZGlhbG9nT3ZlcmxheVNldHRpbmdzLCB0aGlzLm92ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzb3VyY2VTdHJpbmdzID0gZ2V0Q3VycmVudFJlc291cmNlU3RyaW5ncyhEYXRlUmFuZ2VQaWNrZXJSZXNvdXJjZVN0cmluZ3NFTik7XG4gICAgcHJpdmF0ZSBfZG9uZUJ1dHRvblRleHQgPSBudWxsO1xuICAgIHByaXZhdGUgX2RhdGVTZXBhcmF0b3IgPSBudWxsO1xuICAgIHByaXZhdGUgX3ZhbHVlOiBEYXRlUmFuZ2UgfCBudWxsO1xuICAgIHByaXZhdGUgX292ZXJsYXlJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX25nQ29udHJvbDogTmdDb250cm9sO1xuICAgIHByaXZhdGUgX3N0YXR1c0NoYW5nZXMkOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBfY2FsZW5kYXI6IElneENhbGVuZGFyQ29tcG9uZW50O1xuICAgIHByaXZhdGUgX3Bvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3M7XG4gICAgcHJpdmF0ZSBfZm9jdXNlZElucHV0OiBJZ3hEYXRlUmFuZ2VJbnB1dHNCYXNlQ29tcG9uZW50O1xuICAgIHByaXZhdGUgX292ZXJsYXlTdWJGaWx0ZXI6XG4gICAgICAgIFtNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb248T3ZlcmxheUV2ZW50QXJncz4sIE1vbm9UeXBlT3BlcmF0b3JGdW5jdGlvbjxPdmVybGF5RXZlbnRBcmdzIHwgT3ZlcmxheUNhbmNlbGFibGVFdmVudEFyZ3M+XSA9IFtcbiAgICAgICAgICAgIGZpbHRlcih4ID0+IHguaWQgPT09IHRoaXMuX292ZXJsYXlJZCksXG4gICAgICAgICAgICB0YWtlVW50aWwobWVyZ2UodGhpcy5fZGVzdHJveSQsIHRoaXMuY2xvc2VkKSlcbiAgICAgICAgXTtcbiAgICBwcml2YXRlIF9kaWFsb2dPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgbW9kYWw6IHRydWUsXG4gICAgICAgIGNsb3NlT25Fc2NhcGU6IHRydWVcbiAgICB9O1xuICAgIHByaXZhdGUgX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbkVzY2FwZTogdHJ1ZVxuICAgIH07XG4gICAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoZGF0ZVJhbmdlOiBEYXRlUmFuZ2UpID0+IHZvaWQgPSBub29wO1xuICAgIHByaXZhdGUgb25Ub3VjaENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgICBwcml2YXRlIG9uVmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkID0gbm9vcDtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBfbG9jYWxlSWQ6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwsXG4gICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChJZ3hPdmVybGF5U2VydmljZSkgcHJpdmF0ZSBfb3ZlcmxheVNlcnZpY2U6IElneE92ZXJsYXlTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KElHWF9JTlBVVF9HUk9VUF9UWVBFKSBfaW5wdXRHcm91cFR5cGU/OiBJZ3hJbnB1dEdyb3VwVHlwZSkge1xuICAgICAgICBzdXBlcihlbGVtZW50LCBfbG9jYWxlSWQsIF9pbnB1dEdyb3VwVHlwZSk7XG4gICAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5sb2NhbGUgfHwgdGhpcy5fbG9jYWxlSWQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSB0aGlzLnBsYXRmb3JtLktFWU1BUC5BUlJPV19VUDpcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHRoaXMucGxhdGZvcm0uS0VZTUFQLkFSUk9XX0RPV046XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyB0aGUgZGF0ZSByYW5nZSBwaWNrZXIncyBkcm9wZG93biBvciBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyICNkYXRlUmFuZ2U+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICpcbiAgICAgKiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZ3hCdXR0b24gKGNsaWNrKT1cImRhdGVSYW5nZS5vcGVuKClcIj5PcGVuIERpYWxvZzwvYnV0dG9uXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG9wZW4ob3ZlcmxheVNldHRpbmdzPzogT3ZlcmxheVNldHRpbmdzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb2xsYXBzZWQgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmlzRHJvcGRvd25cbiAgICAgICAgICAgID8gdGhpcy5kcm9wZG93bk92ZXJsYXlTZXR0aW5nc1xuICAgICAgICAgICAgOiB0aGlzLmRpYWxvZ092ZXJsYXlTZXR0aW5nc1xuICAgICAgICAgICAgLCBvdmVybGF5U2V0dGluZ3MpO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlJZCA9IHRoaXMuX292ZXJsYXlTZXJ2aWNlXG4gICAgICAgICAgICAuYXR0YWNoKElneENhbGVuZGFyQ29udGFpbmVyQ29tcG9uZW50LCB0aGlzLnZpZXdDb250YWluZXJSZWYsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb092ZXJsYXlFdmVudHMoKTtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2Uuc2hvdyh0aGlzLl9vdmVybGF5SWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgZGF0ZSByYW5nZSBwaWNrZXIncyBkcm9wZG93biBvciBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyICNkYXRlUmFuZ2U+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICpcbiAgICAgKiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZ3hCdXR0b24gKGNsaWNrKT1cImRhdGVSYW5nZS5jbG9zZSgpXCI+Q2xvc2UgRGlhbG9nPC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5oaWRlKHRoaXMuX292ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBkYXRlIHJhbmdlIHBpY2tlcidzIGRyb3Bkb3duIG9yIGRpYWxvZ1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciAjZGF0ZVJhbmdlPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqXG4gICAgICogPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIChjbGljayk9XCJkYXRlUmFuZ2UudG9nZ2xlKClcIj5Ub2dnbGUgRGlhbG9nPC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZShvdmVybGF5U2V0dGluZ3M/OiBPdmVybGF5U2V0dGluZ3MpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuKG92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIGEgcmFuZ2Ugb2YgZGF0ZXMuIElmIG5vIGBlbmREYXRlYCBpcyBwYXNzZWQsIHJhbmdlIGlzIDEgZGF5IChvbmx5IGBzdGFydERhdGVgKVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIHNlbGVjdEZpdmVEYXlSYW5nZSgpIHtcbiAgICAgKiAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAqICBjb25zdCBpbkZpdmVEYXlzID0gbmV3IERhdGUobmV3IERhdGUoKS5zZXREYXRlKHRvZGF5LmdldERhdGUoKSArIDUpKTtcbiAgICAgKiAgdGhpcy5kYXRlUmFuZ2Uuc2VsZWN0KHRvZGF5LCBpbkZpdmVEYXlzKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdChzdGFydERhdGU6IERhdGUsIGVuZERhdGU/OiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGVuZERhdGUgPSBlbmREYXRlID8/IHN0YXJ0RGF0ZTtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlID0gW3N0YXJ0RGF0ZSwgZW5kRGF0ZV07XG4gICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uKGRhdGVSYW5nZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IERhdGVSYW5nZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaENhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgY29uc3QgdmFsdWU6IERhdGVSYW5nZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5wdXQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRJbnB1dCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydElucHV0LmRhdGVUaW1lRWRpdG9yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCB7IHN0YXJ0VmFsdWU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZW5kSW5wdXQuZGF0ZVRpbWVFZGl0b3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvcnMsIHsgZW5kVmFsdWU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtaW4gPSBwYXJzZURhdGUodGhpcy5taW5WYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBtYXggPSBwYXJzZURhdGUodGhpcy5tYXhWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHBhcnNlRGF0ZSh2YWx1ZS5zdGFydCk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBwYXJzZURhdGUodmFsdWUuZW5kKTtcbiAgICAgICAgICAgIGlmICgobWluICYmIHN0YXJ0ICYmIERhdGVUaW1lVXRpbC5sZXNzVGhhbk1pblZhbHVlKHN0YXJ0LCBtaW4sIGZhbHNlKSlcbiAgICAgICAgICAgICAgICB8fCAobWluICYmIGVuZCAmJiBEYXRlVGltZVV0aWwubGVzc1RoYW5NaW5WYWx1ZShlbmQsIG1pbiwgZmFsc2UpKSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCB7IG1pblZhbHVlOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChtYXggJiYgc3RhcnQgJiYgRGF0ZVRpbWVVdGlsLmdyZWF0ZXJUaGFuTWF4VmFsdWUoc3RhcnQsIG1heCwgZmFsc2UpKVxuICAgICAgICAgICAgICAgIHx8IChtYXggJiYgZW5kICYmIERhdGVUaW1lVXRpbC5ncmVhdGVyVGhhbk1heFZhbHVlKGVuZCwgbWF4LCBmYWxzZSkpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvcnMsIHsgbWF4VmFsdWU6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPiAwID8gZXJyb3JzIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZT8oZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25nQ29udHJvbCA9IHRoaXMuX2luamVjdG9yLmdldDxOZ0NvbnRyb2w+KE5nQ29udHJvbCwgbnVsbCk7XG5cbiAgICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmxvY2FsZSB8fCB0aGlzLl9sb2NhbGVJZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvRGF0ZUVkaXRvckV2ZW50cygpO1xuICAgICAgICB0aGlzLmNvbmZpZ1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5jb25maWdPdmVybGF5U2V0dGluZ3MoKTtcbiAgICAgICAgdGhpcy5jYWNoZUZvY3VzZWRJbnB1dCgpO1xuICAgICAgICB0aGlzLmF0dGFjaE9uVG91Y2hlZCgpO1xuXG4gICAgICAgIHRoaXMuc2V0UmVxdWlyZWRUb0lucHV0cygpO1xuXG4gICAgICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1c0NoYW5nZXMkID0gdGhpcy5fbmdDb250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHRoaXMub25TdGF0dXNDaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGVsYXkgaW52b2NhdGlvbnMgdW50aWwgdGhlIGN1cnJlbnQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSBoYXMgY29tcGxldGVkXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNhYmxlZFN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxTZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbnB1dHMoKTtcbiAgICAgICAgICAgIC8vIEIuUC4gMDcgSnVseSAyMDIxIC0gSWd4RGF0ZVJhbmdlUGlja2VyIG5vdCBzaG93aW5nIGluaXRpYWwgZGlzYWJsZWQgc3RhdGUgd2l0aCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2ggIzk3NzZcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogaWYgZGlzYWJsZWQgaXMgcGxhY2VkIG9uIHRoZSByYW5nZSBwaWNrZXIgZWxlbWVudCBhbmQgdGhlcmUgYXJlIHByb2plY3RlZCBpbnB1dHNcbiAgICAgICAgICAgICAqIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIHNpbmNlIGlneElucHV0IHdpbGwgaW5pdGlhbGx5IHNldCB0aGUgcHJvamVjdGVkIGlucHV0cycgZGlzYWJsZWQgdG8gZmFsc2VcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzICYmIHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlGb3JtYXQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dEZvcm1hdCgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydkaXNwbGF5Rm9ybWF0J10gJiYgdGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheUZvcm1hdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydpbnB1dEZvcm1hdCddICYmIHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUlucHV0Rm9ybWF0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWRTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5fc3RhdHVzQ2hhbmdlcyQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1c0NoYW5nZXMkLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuZGV0YWNoKHRoaXMuX292ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0RWRpdEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0RGlyZWN0aXZlLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uU3RhdHVzQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGl0eVN0YXRlKHRoaXMuaW5wdXREaXJlY3RpdmUsIHRoaXMuaW5wdXRHcm91cC5pc0ZvY3VzZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2plY3RlZElucHV0c1xuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRpdHlTdGF0ZShpLmlucHV0RGlyZWN0aXZlLCBpLmlzRm9jdXNlZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRSZXF1aXJlZFRvSW5wdXRzKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0VmFsaWRpdHlTdGF0ZShpbnB1dERpcmVjdGl2ZTogSWd4SW5wdXREaXJlY3RpdmUsIGlzRm9jdXNlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbmdDb250cm9sICYmICF0aGlzLl9uZ0NvbnRyb2wuZGlzYWJsZWQgJiYgdGhpcy5pc1RvdWNoZWRPckRpcnR5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWYWxpZGF0b3JzICYmIGlzRm9jdXNlZCkge1xuICAgICAgICAgICAgICAgIGlucHV0RGlyZWN0aXZlLnZhbGlkID0gdGhpcy5fbmdDb250cm9sLnZhbGlkID8gSWd4SW5wdXRTdGF0ZS5WQUxJRCA6IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5wdXREaXJlY3RpdmUudmFsaWQgPSB0aGlzLl9uZ0NvbnRyb2wudmFsaWQgPyBJZ3hJbnB1dFN0YXRlLklOSVRJQUwgOiBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dERpcmVjdGl2ZS52YWxpZCA9IElneElucHV0U3RhdGUuSU5JVElBTDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzVG91Y2hlZE9yRGlydHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5fbmdDb250cm9sLmNvbnRyb2wudG91Y2hlZCB8fCB0aGlzLl9uZ0NvbnRyb2wuY29udHJvbC5kaXJ0eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaGFzVmFsaWRhdG9ycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICghIXRoaXMuX25nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvciB8fCAhIXRoaXMuX25nQ29udHJvbC5jb250cm9sLmFzeW5jVmFsaWRhdG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVNlbGVjdGlvbihzZWxlY3Rpb25EYXRhOiBEYXRlW10pOiB2b2lkIHtcbiAgICAgICAgbGV0IG5ld1ZhbHVlID0gdGhpcy5leHRyYWN0UmFuZ2Uoc2VsZWN0aW9uRGF0YSk7XG4gICAgICAgIGlmICghbmV3VmFsdWUuc3RhcnQgJiYgIW5ld1ZhbHVlLmVuZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wZG93biAmJiBzZWxlY3Rpb25EYXRhPy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUNsb3NpbmcoZTogSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncyk6IHZvaWQge1xuICAgICAgICBjb25zdCBhcmdzID0geyBvd25lcjogdGhpcywgY2FuY2VsOiBlPy5jYW5jZWwsIGV2ZW50OiBlPy5ldmVudCB9O1xuICAgICAgICB0aGlzLmNsb3NpbmcuZW1pdChhcmdzKTtcbiAgICAgICAgZS5jYW5jZWwgPSBhcmdzLmNhbmNlbDtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duICYmIGU/LmV2ZW50ICYmICF0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhlLmV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIC8vIG91dHNpZGUgY2xpY2tcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRpdHlPbkJsdXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaENhbGxiYWNrKCk7XG4gICAgICAgICAgICAvLyBpbnB1dCBjbGlja1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzICYmIHRoaXMuX2ZvY3VzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRJbnB1dC5zZXRGb2N1cygpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRJbnB1dCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVG9PdmVybGF5RXZlbnRzKCkge1xuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5vcGVuaW5nLnBpcGUoLi4udGhpcy5fb3ZlcmxheVN1YkZpbHRlcikuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5RXZlbnQgPSBlIGFzIE92ZXJsYXlDYW5jZWxhYmxlRXZlbnRBcmdzO1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IHsgb3duZXI6IHRoaXMsIGNhbmNlbDogb3ZlcmxheUV2ZW50Py5jYW5jZWwsIGV2ZW50OiBlLmV2ZW50IH07XG4gICAgICAgICAgICB0aGlzLm9wZW5pbmcuZW1pdChhcmdzKTtcbiAgICAgICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9vdmVybGF5SWQpO1xuICAgICAgICAgICAgICAgIG92ZXJsYXlFdmVudC5jYW5jZWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUNhbGVuZGFyQ29udGFpbmVyKGUuY29tcG9uZW50UmVmLmluc3RhbmNlKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbGxhcHNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5vcGVuZWQucGlwZSguLi50aGlzLl9vdmVybGF5U3ViRmlsdGVyKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcGVuZWQuZW1pdCh7IG93bmVyOiB0aGlzIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5jbG9zaW5nLnBpcGUoLi4udGhpcy5fb3ZlcmxheVN1YkZpbHRlcikuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNsb3NpbmcoZSBhcyBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmNsb3NlZC5waXBlKC4uLnRoaXMuX292ZXJsYXlTdWJGaWx0ZXIpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fb3ZlcmxheUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbGxhcHNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5SWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jbG9zZWQuZW1pdCh7IG93bmVyOiB0aGlzIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVZhbHVlKHZhbHVlOiBEYXRlUmFuZ2UpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSA/IHZhbHVlIDogbnVsbDtcbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dHMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVmFsaWRpdHlPbkJsdXIoKSB7XG4gICAgICAgIHRoaXMub25Ub3VjaENhbGxiYWNrKCk7XG4gICAgICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdGVkSW5wdXRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbmdDb250cm9sLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpLnVwZGF0ZUlucHV0VmFsaWRpdHkoSWd4SW5wdXRTdGF0ZS5JTlZBTElEKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkudXBkYXRlSW5wdXRWYWxpZGl0eShJZ3hJbnB1dFN0YXRlLklOSVRJQUwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0RGlyZWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9uZ0NvbnRyb2wudmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS52YWxpZCA9IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRGlzYWJsZWRTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQpIGFzIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50O1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQpIGFzIElneERhdGVSYW5nZUVuZENvbXBvbmVudDtcbiAgICAgICAgICAgIHN0YXJ0LmlucHV0RGlyZWN0aXZlLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcbiAgICAgICAgICAgIGVuZC5pbnB1dERpcmVjdGl2ZS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFJlcXVpcmVkVG9JbnB1dHMoKTogdm9pZCB7XG4gICAgICAgIC8vIHdvcmthcm91bmQgZm9yIGlneElucHV0IHNldHRpbmcgcmVxdWlyZWRcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1JlcXVpcmVkID0gdGhpcy5yZXF1aXJlZDtcbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0R3JvdXAgJiYgdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgIT09IGlzUmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0R3JvdXAuaXNSZXF1aXJlZCA9IGlzUmVxdWlyZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzICYmIHRoaXMuX25nQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdGVkSW5wdXRzLmZvckVhY2goaSA9PiBpLmlzUmVxdWlyZWQgPSBpc1JlcXVpcmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZU1pblZhbHVlKHZhbHVlOiBzdHJpbmcgfCBEYXRlKTogRGF0ZSB8IG51bGwge1xuICAgICAgICBsZXQgbWluVmFsdWU6IERhdGUgPSBwYXJzZURhdGUodmFsdWUpO1xuICAgICAgICBpZiAoIW1pblZhbHVlICYmIHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbHRlcihpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudClbMF07XG4gICAgICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IHBhcnNlRGF0ZShzdGFydC5kYXRlVGltZUVkaXRvci5taW5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZU1heFZhbHVlKHZhbHVlOiBzdHJpbmcgfCBEYXRlKTogRGF0ZSB8IG51bGwge1xuICAgICAgICBsZXQgbWF4VmFsdWU6IERhdGUgPSBwYXJzZURhdGUodmFsdWUpO1xuICAgICAgICBpZiAoIW1heFZhbHVlICYmIHRoaXMucHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maWx0ZXIoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KVswXTtcbiAgICAgICAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgICAgICAgICBtYXhWYWx1ZSA9IHBhcnNlRGF0ZShlbmQuZGF0ZVRpbWVFZGl0b3IubWF4VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1heFZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jYWxlbmRhcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsZW5kYXIuZGlzYWJsZWREYXRlcyA9IFtdO1xuICAgICAgICBjb25zdCBtaW5WYWx1ZSA9IHRoaXMucGFyc2VNaW5WYWx1ZSh0aGlzLm1pblZhbHVlKTtcbiAgICAgICAgaWYgKG1pblZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyLmRpc2FibGVkRGF0ZXMucHVzaCh7IHR5cGU6IERhdGVSYW5nZVR5cGUuQmVmb3JlLCBkYXRlUmFuZ2U6IFttaW5WYWx1ZV0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF4VmFsdWUgPSB0aGlzLnBhcnNlTWF4VmFsdWUodGhpcy5tYXhWYWx1ZSk7XG4gICAgICAgIGlmIChtYXhWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5kaXNhYmxlZERhdGVzLnB1c2goeyB0eXBlOiBEYXRlUmFuZ2VUeXBlLkFmdGVyLCBkYXRlUmFuZ2U6IFttYXhWYWx1ZV0gfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYW5nZTogRGF0ZVtdID0gW107XG4gICAgICAgIGlmICh0aGlzLnZhbHVlPy5zdGFydCAmJiB0aGlzLnZhbHVlPy5lbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IF92YWx1ZSA9IHRoaXMudG9SYW5nZU9mRGF0ZXModGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoRGF0ZVRpbWVVdGlsLmdyZWF0ZXJUaGFuTWF4VmFsdWUoX3ZhbHVlLnN0YXJ0LCBfdmFsdWUuZW5kKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3dhcEVkaXRvckRhdGVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZUluUmFuZ2UodGhpcy52YWx1ZSwgbWluVmFsdWUsIG1heFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJhbmdlLnB1c2goX3ZhbHVlLnN0YXJ0LCBfdmFsdWUuZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYW5nZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyLnNlbGVjdERhdGUocmFuZ2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmNhbGVuZGFyLm1vbnRoVmlld3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuZGVzZWxlY3REYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxlbmRhci52aWV3RGF0ZSA9IHJhbmdlWzBdIHx8IG5ldyBEYXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzd2FwRWRpdG9yRGF0ZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudDtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQ7XG4gICAgICAgICAgICBbc3RhcnQuZGF0ZVRpbWVFZGl0b3IudmFsdWUsIGVuZC5kYXRlVGltZUVkaXRvci52YWx1ZV0gPSBbZW5kLmRhdGVUaW1lRWRpdG9yLnZhbHVlLCBzdGFydC5kYXRlVGltZUVkaXRvci52YWx1ZV07XG4gICAgICAgICAgICBbdGhpcy52YWx1ZS5zdGFydCwgdGhpcy52YWx1ZS5lbmRdID0gW3RoaXMudmFsdWUuZW5kLCB0aGlzLnZhbHVlLnN0YXJ0XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmFsdWVJblJhbmdlKHZhbHVlOiBEYXRlUmFuZ2UsIG1pblZhbHVlPzogRGF0ZSwgbWF4VmFsdWU/OiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IF92YWx1ZSA9IHRoaXMudG9SYW5nZU9mRGF0ZXModmFsdWUpO1xuICAgICAgICBpZiAobWluVmFsdWUgJiYgRGF0ZVRpbWVVdGlsLmxlc3NUaGFuTWluVmFsdWUoX3ZhbHVlLnN0YXJ0LCBtaW5WYWx1ZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heFZhbHVlICYmIERhdGVUaW1lVXRpbC5ncmVhdGVyVGhhbk1heFZhbHVlKF92YWx1ZS5lbmQsIG1heFZhbHVlLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXh0cmFjdFJhbmdlKHNlbGVjdGlvbjogRGF0ZVtdKTogRGF0ZVJhbmdlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXJ0OiBzZWxlY3Rpb25bMF0gfHwgbnVsbCxcbiAgICAgICAgICAgIGVuZDogc2VsZWN0aW9uLmxlbmd0aCA+IDAgPyBzZWxlY3Rpb25bc2VsZWN0aW9uLmxlbmd0aCAtIDFdIDogbnVsbFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9SYW5nZU9mRGF0ZXMocmFuZ2U6IERhdGVSYW5nZSk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHtcbiAgICAgICAgbGV0IHN0YXJ0O1xuICAgICAgICBsZXQgZW5kO1xuICAgICAgICBpZiAoIWlzRGF0ZShyYW5nZS5zdGFydCkpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gRGF0ZVRpbWVVdGlsLnBhcnNlSXNvRGF0ZShyYW5nZS5zdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0RhdGUocmFuZ2UuZW5kKSkge1xuICAgICAgICAgICAgZW5kID0gRGF0ZVRpbWVVdGlsLnBhcnNlSXNvRGF0ZShyYW5nZS5lbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXJ0IHx8IGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHJhbmdlLnN0YXJ0IGFzIERhdGUsIGVuZDogcmFuZ2UuZW5kIGFzIERhdGUgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN1YnNjcmliZVRvRGF0ZUVkaXRvckV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQpIGFzIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50O1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQpIGFzIElneERhdGVSYW5nZUVuZENvbXBvbmVudDtcbiAgICAgICAgICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgICAgICAgICAgICBzdGFydC5kYXRlVGltZUVkaXRvci52YWx1ZUNoYW5nZVxuICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQ6IHZhbHVlLCBlbmQ6IHRoaXMudmFsdWUuZW5kIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiB2YWx1ZSwgZW5kOiBudWxsIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVuZC5kYXRlVGltZUVkaXRvci52YWx1ZUNoYW5nZVxuICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQ6IHRoaXMudmFsdWUuc3RhcnQsIGVuZDogdmFsdWUgYXMgRGF0ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0geyBzdGFydDogbnVsbCwgZW5kOiB2YWx1ZSBhcyBEYXRlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hPblRvdWNoZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICBmcm9tRXZlbnQoaS5kYXRlVGltZUVkaXRvci5uYXRpdmVFbGVtZW50LCAnYmx1cicpXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGl0eU9uQmx1cigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbUV2ZW50KHRoaXMuaW5wdXREaXJlY3RpdmUubmF0aXZlRWxlbWVudCwgJ2JsdXInKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGl0eU9uQmx1cigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNhY2hlRm9jdXNlZElucHV0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdGVkSW5wdXRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICAgICAgZnJvbUV2ZW50KGkuZGF0ZVRpbWVFZGl0b3IubmF0aXZlRWxlbWVudCwgJ2ZvY3VzJylcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9mb2N1c2VkSW5wdXQgPSBpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maWdQb3NpdGlvblN0cmF0ZWd5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogZmFkZUluLFxuICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IGZhZGVPdXRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZHJvcERvd25PdmVybGF5U2V0dGluZ3MucG9zaXRpb25TdHJhdGVneSA9IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSh0aGlzLl9wb3NpdGlvblNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fZHJvcERvd25PdmVybGF5U2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maWdPdmVybGF5U2V0dGluZ3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXlTZXR0aW5ncyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fZHJvcERvd25PdmVybGF5U2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9kcm9wRG93bk92ZXJsYXlTZXR0aW5ncywgdGhpcy5vdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nT3ZlcmxheVNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZGlhbG9nT3ZlcmxheVNldHRpbmdzLCB0aGlzLm92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxTZXRWYWx1ZSgpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gdmFsdWUgYW5kIG5vIG5nQ29udHJvbCBvbiB0aGUgcGlja2VyIGJ1dCB3ZSBoYXZlIGlucHV0cyB3ZSBtYXkgaGF2ZSB2YWx1ZSBzZXQgdGhyb3VnaFxuICAgICAgICAvLyB0aGVpciBuZ01vZGVscyAtIHdlIHNob3VsZCBnZW5lcmF0ZSBvdXIgaW5pdGlhbCBjb250cm9sIHZhbHVlXG4gICAgICAgIGlmICgoIXRoaXMudmFsdWUgfHwgKCF0aGlzLnZhbHVlLnN0YXJ0ICYmICF0aGlzLnZhbHVlLmVuZCkpICYmIHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzICYmICF0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudCk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZUVuZENvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQuZGF0ZVRpbWVFZGl0b3IudmFsdWUgYXMgRGF0ZSxcbiAgICAgICAgICAgICAgICBlbmQ6IGVuZC5kYXRlVGltZUVkaXRvci52YWx1ZSBhcyBEYXRlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVJbnB1dHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHM/LmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQpIGFzIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50O1xuICAgICAgICBjb25zdCBlbmQgPSB0aGlzLnByb2plY3RlZElucHV0cz8uZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQpIGFzIElneERhdGVSYW5nZUVuZENvbXBvbmVudDtcbiAgICAgICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgICAgICAgICAgY29uc3QgX3ZhbHVlID0gdGhpcy52YWx1ZSA/IHRoaXMudG9SYW5nZU9mRGF0ZXModGhpcy52YWx1ZSkgOiBudWxsO1xuICAgICAgICAgICAgc3RhcnQudXBkYXRlSW5wdXRWYWx1ZShfdmFsdWU/LnN0YXJ0IHx8IG51bGwpO1xuICAgICAgICAgICAgZW5kLnVwZGF0ZUlucHV0VmFsdWUoX3ZhbHVlPy5lbmQgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZURpc3BsYXlGb3JtYXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJvamVjdGVkSW5wdXRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGkgYXMgSWd4RGF0ZVJhbmdlSW5wdXRzQmFzZUNvbXBvbmVudDtcbiAgICAgICAgICAgIGlucHV0LmRhdGVUaW1lRWRpdG9yLmRpc3BsYXlGb3JtYXQgPSB0aGlzLmRpc3BsYXlGb3JtYXQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSW5wdXRGb3JtYXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJvamVjdGVkSW5wdXRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGkgYXMgSWd4RGF0ZVJhbmdlSW5wdXRzQmFzZUNvbXBvbmVudDtcbiAgICAgICAgICAgIGlmIChpbnB1dC5kYXRlVGltZUVkaXRvci5pbnB1dEZvcm1hdCAhPT0gdGhpcy5pbnB1dEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGVUaW1lRWRpdG9yLmlucHV0Rm9ybWF0ID0gdGhpcy5pbnB1dEZvcm1hdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5pdGlhbGl6ZUNhbGVuZGFyQ29udGFpbmVyKGNvbXBvbmVudEluc3RhbmNlOiBJZ3hDYWxlbmRhckNvbnRhaW5lckNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9jYWxlbmRhciA9IGNvbXBvbmVudEluc3RhbmNlLmNhbGVuZGFyO1xuICAgICAgICB0aGlzLmNhbGVuZGFyLmhhc0hlYWRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhbGVuZGFyLmxvY2FsZSA9IHRoaXMubG9jYWxlO1xuICAgICAgICB0aGlzLmNhbGVuZGFyLnNlbGVjdGlvbiA9IENhbGVuZGFyU2VsZWN0aW9uLlJBTkdFO1xuICAgICAgICB0aGlzLmNhbGVuZGFyLndlZWtTdGFydCA9IHRoaXMud2Vla1N0YXJ0O1xuICAgICAgICB0aGlzLmNhbGVuZGFyLmhpZGVPdXRzaWRlRGF5cyA9IHRoaXMuaGlkZU91dHNpZGVEYXlzO1xuICAgICAgICB0aGlzLmNhbGVuZGFyLm1vbnRoc1ZpZXdOdW1iZXIgPSB0aGlzLmRpc3BsYXlNb250aHNDb3VudDtcbiAgICAgICAgdGhpcy5jYWxlbmRhci5zaG93V2Vla051bWJlcnMgPSB0aGlzLnNob3dXZWVrTnVtYmVycztcbiAgICAgICAgdGhpcy5jYWxlbmRhci5zZWxlY3RlZC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoZXY6IERhdGVbXSkgPT4gdGhpcy5oYW5kbGVTZWxlY3Rpb24oZXYpKTtcblxuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5tb2RlID0gdGhpcy5tb2RlO1xuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5jbG9zZUJ1dHRvbkxhYmVsID0gIXRoaXMuaXNEcm9wZG93biA/IHRoaXMuZG9uZUJ1dHRvblRleHQgOiBudWxsO1xuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5waWNrZXJBY3Rpb25zID0gdGhpcy5waWNrZXJBY3Rpb25zO1xuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5jYWxlbmRhckNsb3NlLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhhc1Byb2plY3RlZElucHV0cyA/IHN0YXJ0RW5kVGVtcGxhdGUgOiBkZWZUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3NpbmdsZVRlbXBsYXRlPlxuICAgIDxkaXYgKGNsaWNrKT1cIm9wZW4oKVwiIGNsYXNzPVwiY29udGVudC13cmFwXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImlneC1kYXRlLXNpbmdsZVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3RhcnRFbmRUZW1wbGF0ZT5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtZGF0ZS1yYW5nZS1zdGFydFwiPjwvbmctY29udGVudD5cbiAgICA8ZGl2IFtjbGFzc05hbWVdPVwic2VwYXJhdG9yQ2xhc3NcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRhdGVTZXBhcmF0b3JUZW1wbGF0ZSB8fCBkZWZEYXRlU2VwYXJhdG9yVGVtcGxhdGU7XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImlneC1kYXRlLXJhbmdlLWVuZFwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmSWNvbj5cbiAgICA8aWd4LWljb24gZmFtaWx5PVwiZGVmYXVsdFwiIG5hbWU9XCJkYXRlX3JhbmdlXCI+PC9pZ3gtaWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmRGF0ZVNlcGFyYXRvclRlbXBsYXRlPnt7IGRhdGVTZXBhcmF0b3IgfX08L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZlRlbXBsYXRlPlxuICAgIDxpZ3gtaW5wdXQtZ3JvdXAgW3R5cGVdPVwidHlwZVwiIChjbGljayk9XCJvcGVuKClcIj5cbiAgICAgICAgPCEtLSBvbmx5IHNldCBtYXNrIHBsYWNlaG9sZGVyIHdoZW4gZW1wdHksIG90aGVyd2lzZSBpbnB1dCBncm91cCBtaWdodCB1c2UgaXQgYXMgbGFiZWwgaWYgbm9uZSBpcyBzZXQgLS0+XG4gICAgICAgIDxpbnB1dCAjc2luZ2xlSW5wdXQgaWd4SW5wdXQgdHlwZT1cInRleHRcIiByZWFkb25seSBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbcGxhY2Vob2xkZXJdPVwidmFsdWUgPyAnJyA6IHNpbmdsZUlucHV0Rm9ybWF0XCJcbiAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiIGFyaWEtaGFzcG9wdXA9XCJncmlkXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCIhY29sbGFwc2VkXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImxhYmVsPy5pZFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWUgfCBkYXRlUmFuZ2U6IGFwcGxpZWRGb3JtYXQgOiBsb2NhbGUgOiBmb3JtYXR0ZXJcIiAvPlxuXG4gICAgICAgIDxpZ3gtcHJlZml4ICpuZ0lmPVwiIXRvZ2dsZUNvbXBvbmVudHMubGVuZ3RoXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVmSWNvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2lneC1wcmVmaXg+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cIltpZ3hMYWJlbF1cIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ3hMYWJlbF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwiaWd4LXByZWZpeFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXByZWZpeCxbaWd4UHJlZml4XVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbmdQcm9qZWN0QXM9XCJpZ3gtc3VmZml4XCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtc3VmZml4LFtpZ3hTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cImlneC1oaW50XCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtaGludCxbaWd4SGludF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvaWd4LWlucHV0LWdyb3VwPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
898
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ1ksZ0JBQWdCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUM1RixZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQVksS0FBSyxFQUFFLFNBQVMsRUFDN0MsUUFBUSxFQUFFLE1BQU0sRUFDL0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFDMUQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDb0MsU0FBUyxFQUNoRCxhQUFhLEVBQUUsaUJBQWlCLEVBQ25DLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQTRCLElBQUksRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQW1DLE1BQU0sMENBQTBDLENBQUM7QUFDN0gsT0FBTyxFQUFtQyxNQUFNLEVBQUUsU0FBUyxF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O3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCwgYm9vbGVhbkF0dHJpYnV0ZSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgTE9DQUxFX0lELFxuICAgIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCxcbiAgICBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSwgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uLCBub29wLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDYWxlbmRhclNlbGVjdGlvbiwgSWd4Q2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuLi9jYWxlbmRhci9wdWJsaWNfYXBpJztcbmltcG9ydCB7IERhdGVSYW5nZVR5cGUgfSBmcm9tICcuLi9jb3JlL2RhdGVzJztcbmltcG9ydCB7IERhdGVSYW5nZVBpY2tlclJlc291cmNlU3RyaW5nc0VOLCBJRGF0ZVJhbmdlUGlja2VyUmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL2RhdGUtcmFuZ2UtcGlja2VyLXJlc291cmNlcyc7XG5pbXBvcnQgeyBJQmFzZUNhbmNlbGFibGVCcm93c2VyRXZlbnRBcmdzLCBpc0RhdGUsIHBhcnNlRGF0ZSwgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBJZ3hDYWxlbmRhckNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtY29tbW9uL2NhbGVuZGFyLWNvbnRhaW5lci9jYWxlbmRhci1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBpY2tlckJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9kYXRlLWNvbW1vbi9waWNrZXItYmFzZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4UGlja2VyQWN0aW9uc0RpcmVjdGl2ZSB9IGZyb20gJy4uL2RhdGUtY29tbW9uL3BpY2tlci1pY29ucy5jb21tb24nO1xuaW1wb3J0IHsgRGF0ZVRpbWVVdGlsIH0gZnJvbSAnLi4vZGF0ZS1jb21tb24vdXRpbC9kYXRlLXRpbWUudXRpbCc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIElneElucHV0RGlyZWN0aXZlLCBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LCBJZ3hJbnB1dEdyb3VwVHlwZSwgSWd4SW5wdXRTdGF0ZSxcbiAgICBJZ3hMYWJlbERpcmVjdGl2ZSwgSUdYX0lOUFVUX0dST1VQX1RZUEVcbn0gZnJvbSAnLi4vaW5wdXQtZ3JvdXAvcHVibGljX2FwaSc7XG5pbXBvcnQge1xuICAgIEF1dG9Qb3NpdGlvblN0cmF0ZWd5LCBJZ3hPdmVybGF5U2VydmljZSwgT3ZlcmxheUNhbmNlbGFibGVFdmVudEFyZ3MsIE92ZXJsYXlFdmVudEFyZ3MsXG4gICAgT3ZlcmxheVNldHRpbmdzLCBQb3NpdGlvblNldHRpbmdzXG59IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgRGF0ZVJhbmdlLCBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQsIElneERhdGVSYW5nZUlucHV0c0Jhc2VDb21wb25lbnQsIElneERhdGVSYW5nZVNlcGFyYXRvckRpcmVjdGl2ZSwgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQsIERhdGVSYW5nZVBpY2tlckZvcm1hdFBpcGUgfSBmcm9tICcuL2RhdGUtcmFuZ2UtcGlja2VyLWlucHV0cy5jb21tb24nO1xuaW1wb3J0IHsgSWd4UHJlZml4RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9wcmVmaXgvcHJlZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBmYWRlSW4sIGZhZGVPdXQgfSBmcm9tICdpZ25pdGV1aS1hbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5jb25zdCBTaW5nbGVJbnB1dERhdGVzQ29uY2F0ZW5hdGlvblN0cmluZyA9ICcgLSAnO1xuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIHNlbGVjdCBhIHJhbmdlIG9mIGRhdGVzIGZyb20gYSBjYWxlbmRhciBVSSBvciBlZGl0YWJsZSBpbnB1dHMuXG4gKlxuICogQGlneE1vZHVsZSBJZ3hEYXRlUmFuZ2VNb2R1bGVcbiAqXG4gKiBAaWd4VGhlbWUgaWd4LWlucHV0LWdyb3VwLXRoZW1lLCBpZ3gtY2FsZW5kYXItdGhlbWUsIGlneC1kYXRlLXJhbmdlLXBpY2tlci10aGVtZVxuICpcbiAqIEBpZ3hLZXl3b3JkcyBkYXRlLCByYW5nZSwgZGF0ZSByYW5nZSwgZGF0ZSBwaWNrZXJcbiAqXG4gKiBAaWd4R3JvdXAgc2NoZWR1bGluZ1xuICpcbiAqIEByZW1hcmtzXG4gKiBJdCBkaXNwbGF5cyB0aGUgcmFuZ2Ugc2VsZWN0aW9uIGluIGEgc2luZ2xlIG9yIHR3byBpbnB1dCBmaWVsZHMuXG4gKiBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSBkaXNwbGF5cyBhIHNpbmdsZSAqcmVhZG9ubHkqIGlucHV0IGZpZWxkXG4gKiB3aGlsZSBwcm9qZWN0aW5nIGBpZ3gtZGF0ZS1yYW5nZS1zdGFydGAgYW5kIGBpZ3gtZGF0ZS1yYW5nZS1lbmRgXG4gKiBkaXNwbGF5cyB0d28gKmVkaXRhYmxlKiBpbnB1dCBmaWVsZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgbW9kZT1cImRyb3Bkb3duXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtZGF0ZS1yYW5nZS1waWNrZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBJZ3hEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQsIG11bHRpOiB0cnVlIH0sXG4gICAgICAgIHsgcHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IElneERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCwgbXVsdGk6IHRydWUgfVxuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgICAgIElneEljb25Db21wb25lbnQsXG4gICAgICAgIElneElucHV0R3JvdXBDb21wb25lbnQsXG4gICAgICAgIElneElucHV0RGlyZWN0aXZlLFxuICAgICAgICBJZ3hQcmVmaXhEaXJlY3RpdmUsXG4gICAgICAgIERhdGVSYW5nZVBpY2tlckZvcm1hdFBpcGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIElneERhdGVSYW5nZVBpY2tlckNvbXBvbmVudCBleHRlbmRzIFBpY2tlckJhc2VEaXJlY3RpdmVcbiAgICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXNwbGF5ZWQgbW9udGggdmlld3MuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERlZmF1bHQgaXMgYDJgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbZGlzcGxheU1vbnRoc0NvdW50XT1cIjNcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNwbGF5TW9udGhzQ291bnQgPSAyO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgZGF0ZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGN1cnJlbnQgbW9udGggd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW2hpZGVPdXRzaWRlRGF5c109XCJ0cnVlXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGhpZGVPdXRzaWRlRGF5czogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEEgY3VzdG9tIGZvcm1hdHRlciBmdW5jdGlvbiwgYXBwbGllZCBvbiB0aGUgc2VsZWN0ZWQgb3IgcGFzc2VkIGluIGRhdGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwcml2YXRlIGRheUZvcm1hdHRlciA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW5cIiwgeyB3ZWVrZGF5OiBcImxvbmdcIiB9KTtcbiAgICAgKiBwcml2YXRlIG1vbnRoRm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlblwiLCB7IG1vbnRoOiBcImxvbmdcIiB9KTtcbiAgICAgKlxuICAgICAqIHB1YmxpYyBmb3JtYXR0ZXIoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICogIHJldHVybiBgJHt0aGlzLmRheUZvcm1hdHRlci5mb3JtYXQoZGF0ZSl9IC0gJHt0aGlzLm1vbnRoRm9ybWF0dGVyLmZvcm1hdChkYXRlKX0gLSAke2RhdGUuZ2V0RnVsbFllYXIoKX1gO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbZm9ybWF0dGVyXT1cImZvcm1hdHRlclwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGZvcm1hdHRlcjogKHZhbDogRGF0ZVJhbmdlKSA9PiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgdGV4dCBvZiB0aGUgY2FsZW5kYXIgZGlhbG9nICoqRG9uZSoqIGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHZhbHVlIGZyb20gcmVzb3VyY2Ugc3RyaW5ncywgYFwiRG9uZVwiYCBmb3IgdGhlIGJ1aWx0LWluIEVOLlxuICAgICAqIFRoZSBidXR0b24gd2lsbCBvbmx5IHNob3cgdXAgaW4gYGRpYWxvZ2AgbW9kZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgZG9uZUJ1dHRvblRleHQ9XCLlrozkuoZcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZG9uZUJ1dHRvblRleHQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kb25lQnV0dG9uVGV4dCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZG9uZUJ1dHRvblRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuX2RvbmVCdXR0b25UZXh0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2RhdGVfcmFuZ2VfcGlja2VyX2RvbmVfYnV0dG9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kb25lQnV0dG9uVGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3VzdG9tIG92ZXJsYXkgc2V0dGluZ3MgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBjYWxlbmRhci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgW292ZXJsYXlTZXR0aW5nc109XCJjdXN0b21PdmVybGF5U2V0dGluZ3NcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSBvdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncztcblxuICAgIC8qKlxuICAgICAqIFRoZSBmb3JtYXQgdXNlZCB3aGVuIGVkaXRhYmxlIGlucHV0cyBhcmUgbm90IGZvY3VzZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFVzZXMgQW5ndWxhcidzIERhdGVQaXBlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBkaXNwbGF5Rm9ybWF0PVwiRUUvTS95eVwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZGlzcGxheUZvcm1hdDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIHVzZXIgaW5wdXQgZm9ybWF0IGFuZCBwbGFjZWhvbGRlci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGVmYXVsdCBpcyBgXCInTU0vZGQveXl5eSdcImBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF0ZS1yYW5nZS1waWNrZXIgaW5wdXRGb3JtYXQ9XCJkZC9NTS95eVwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIGlucHV0Rm9ybWF0OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSB2YWx1ZSBpbiBhIHZhbGlkIHJhbmdlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFttaW5WYWx1ZV09XCJtaW5EYXRlXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IG1pblZhbHVlKHZhbHVlOiBEYXRlIHwgc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21pblZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1pblZhbHVlKCk6IERhdGUgfCBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gdmFsdWUgaW4gYSB2YWxpZCByYW5nZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbbWF4VmFsdWVdPVwibWF4RGF0ZVwiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBtYXhWYWx1ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZykge1xuICAgICAgICB0aGlzLl9tYXhWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtYXhWYWx1ZSgpOiBEYXRlIHwgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heFZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFjY2Vzc29yIHRoYXQgc2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgRU4gcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXNvdXJjZVN0cmluZ3ModmFsdWU6IElEYXRlUmFuZ2VQaWNrZXJSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWNjZXNzb3IgdGhhdCByZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElEYXRlUmFuZ2VQaWNrZXJSZXNvdXJjZVN0cmluZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VTdHJpbmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBwbGFjZWhvbGRlcmAgZm9yIHNpbmdsZS1pbnB1dCBgSWd4RGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqICAgQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbcGxhY2Vob2xkZXJdPVwiJ0Nob29zZSB5b3VyIGRhdGVzJ1wiPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIHBsYWNlaG9sZGVyID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGNvbnRhaW5lciB1c2VkIGZvciB0aGUgcG9wdXAgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogIGBvdXRsZXRgIGlzIGFuIGluc3RhbmNlIG9mIGBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlYCBvciBhbiBgRWxlbWVudFJlZmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGRpdiBpZ3hPdmVybGF5T3V0bGV0ICNvdXRsZXQ9XCJvdmVybGF5LW91dGxldFwiPjwvZGl2PlxuICAgICAqIC8vLi5cbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyIFtvdXRsZXRdPVwib3V0bGV0XCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogLy8uLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIG91dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSB8IEVsZW1lbnRSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIFNob3cvaGlkZSB3ZWVrIG51bWJlcnNcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbc2hvd1dlZWtOdW1iZXJzXT1cInRydWVcIj48L2lneC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICAgKiBgYFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBzaG93V2Vla051bWJlcnMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcGlja2VyJ3MgdmFsdWUgY2hhbmdlcy4gVXNlZCBmb3IgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciBbKHZhbHVlKV09XCJkYXRlXCI+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U+KCk7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kYXRlLXJhbmdlLXBpY2tlcicpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1kYXRlLXJhbmdlLXBpY2tlcic7XG5cbiAgICBAVmlld0NoaWxkKElneElucHV0R3JvdXBDb21wb25lbnQsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4SW5wdXREaXJlY3RpdmUpXG4gICAgcHVibGljIGlucHV0RGlyZWN0aXZlOiBJZ3hJbnB1dERpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4RGF0ZVJhbmdlSW5wdXRzQmFzZUNvbXBvbmVudClcbiAgICBwdWJsaWMgcHJvamVjdGVkSW5wdXRzOiBRdWVyeUxpc3Q8SWd4RGF0ZVJhbmdlSW5wdXRzQmFzZUNvbXBvbmVudD47XG5cbiAgICBAQ29udGVudENoaWxkKElneExhYmVsRGlyZWN0aXZlKVxuICAgIHB1YmxpYyBsYWJlbDogSWd4TGFiZWxEaXJlY3RpdmU7XG5cbiAgICBAQ29udGVudENoaWxkKElneFBpY2tlckFjdGlvbnNEaXJlY3RpdmUpXG4gICAgcHVibGljIHBpY2tlckFjdGlvbnM6IElneFBpY2tlckFjdGlvbnNEaXJlY3RpdmU7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkKElneERhdGVSYW5nZVNlcGFyYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBkYXRlU2VwYXJhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGVTZXBhcmF0b3IoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuX2RhdGVTZXBhcmF0b3IgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZGF0ZV9yYW5nZV9waWNrZXJfZGF0ZV9zZXBhcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVTZXBhcmF0b3I7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBhcHBsaWVkRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBEYXRlVGltZVV0aWwuZ2V0TG9jYWxlRGF0ZUZvcm1hdCh0aGlzLmxvY2FsZSwgdGhpcy5kaXNwbGF5Rm9ybWF0KVxuICAgICAgICAgICAgfHwgRGF0ZVRpbWVVdGlsLkRFRkFVTFRfSU5QVVRfRk9STUFUO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgc2luZ2xlSW5wdXRGb3JtYXQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMucGxhY2Vob2xkZXIgIT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuYXBwbGllZEZvcm1hdDtcbiAgICAgICAgcmV0dXJuIGAke2Zvcm1hdH0ke1NpbmdsZUlucHV0RGF0ZXNDb25jYXRlbmF0aW9uU3RyaW5nfSR7Zm9ybWF0fWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBjYWxlbmRhciBzdGF0ZS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgc3RhdGUgPSB0aGlzLmRhdGVSYW5nZS5jb2xsYXBzZWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2xsYXBzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWx1ZSAvIHJhbmdlIGZyb20gdGhlIGNhbGVuZGFyXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBjdXJyZW50IHZhbHVlIGlzIG9mIHR5cGUgYERhdGVSYW5nZWBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG5ld1ZhbHVlOiBEYXRlUmFuZ2UgPSB7IHN0YXJ0OiBuZXcgRGF0ZShcIjIvMi8yMDEyXCIpLCBlbmQ6IG5ldyBEYXRlKFwiMy8zLzIwMTNcIil9O1xuICAgICAqIHRoaXMuZGF0ZVJhbmdlUGlja2VyLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBEYXRlUmFuZ2UgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZVJhbmdlIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHZhbHVlKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1Byb2plY3RlZElucHV0cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdGVkSW5wdXRzPy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgc2VwYXJhdG9yQ2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdpZ3gtZGF0ZS1yYW5nZS1waWNrZXJfX2xhYmVsJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0IHRvZ2dsZUNvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxlbmRhckNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX25nQ29udHJvbCAmJiB0aGlzLl9uZ0NvbnRyb2wuY29udHJvbCAmJiB0aGlzLl9uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yKHt9IGFzIEFic3RyYWN0Q29udHJvbCk7XG4gICAgICAgICAgICByZXR1cm4gKGVycm9yICYmIGVycm9yLnJlcXVpcmVkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBjYWxlbmRhcigpOiBJZ3hDYWxlbmRhckNvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxlbmRhcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBkcm9wZG93bk92ZXJsYXlTZXR0aW5ncygpOiBPdmVybGF5U2V0dGluZ3Mge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZHJvcERvd25PdmVybGF5U2V0dGluZ3MsIHRoaXMub3ZlcmxheVNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBkaWFsb2dPdmVybGF5U2V0dGluZ3MoKTogT3ZlcmxheVNldHRpbmdzIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2RpYWxvZ092ZXJsYXlTZXR0aW5ncywgdGhpcy5vdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncyA9IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MoRGF0ZVJhbmdlUGlja2VyUmVzb3VyY2VTdHJpbmdzRU4pO1xuICAgIHByaXZhdGUgX2RvbmVCdXR0b25UZXh0ID0gbnVsbDtcbiAgICBwcml2YXRlIF9kYXRlU2VwYXJhdG9yID0gbnVsbDtcbiAgICBwcml2YXRlIF92YWx1ZTogRGF0ZVJhbmdlIHwgbnVsbDtcbiAgICBwcml2YXRlIF9vdmVybGF5SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9uZ0NvbnRyb2w6IE5nQ29udHJvbDtcbiAgICBwcml2YXRlIF9zdGF0dXNDaGFuZ2VzJDogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgX2NhbGVuZGFyOiBJZ3hDYWxlbmRhckNvbXBvbmVudDtcbiAgICBwcml2YXRlIF9jYWxlbmRhckNvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgX3Bvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3M7XG4gICAgcHJpdmF0ZSBfZm9jdXNlZElucHV0OiBJZ3hEYXRlUmFuZ2VJbnB1dHNCYXNlQ29tcG9uZW50O1xuICAgIHByaXZhdGUgX292ZXJsYXlTdWJGaWx0ZXI6XG4gICAgICAgIFtNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb248T3ZlcmxheUV2ZW50QXJncz4sIE1vbm9UeXBlT3BlcmF0b3JGdW5jdGlvbjxPdmVybGF5RXZlbnRBcmdzIHwgT3ZlcmxheUNhbmNlbGFibGVFdmVudEFyZ3M+XSA9IFtcbiAgICAgICAgICAgIGZpbHRlcih4ID0+IHguaWQgPT09IHRoaXMuX292ZXJsYXlJZCksXG4gICAgICAgICAgICB0YWtlVW50aWwobWVyZ2UodGhpcy5fZGVzdHJveSQsIHRoaXMuY2xvc2VkKSlcbiAgICAgICAgXTtcbiAgICBwcml2YXRlIF9kaWFsb2dPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgbW9kYWw6IHRydWUsXG4gICAgICAgIGNsb3NlT25Fc2NhcGU6IHRydWVcbiAgICB9O1xuICAgIHByaXZhdGUgX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbkVzY2FwZTogdHJ1ZVxuICAgIH07XG4gICAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoZGF0ZVJhbmdlOiBEYXRlUmFuZ2UpID0+IHZvaWQgPSBub29wO1xuICAgIHByaXZhdGUgb25Ub3VjaENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgICBwcml2YXRlIG9uVmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkID0gbm9vcDtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBfbG9jYWxlSWQ6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwsXG4gICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChJZ3hPdmVybGF5U2VydmljZSkgcHJpdmF0ZSBfb3ZlcmxheVNlcnZpY2U6IElneE92ZXJsYXlTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KElHWF9JTlBVVF9HUk9VUF9UWVBFKSBfaW5wdXRHcm91cFR5cGU/OiBJZ3hJbnB1dEdyb3VwVHlwZSkge1xuICAgICAgICBzdXBlcihlbGVtZW50LCBfbG9jYWxlSWQsIF9pbnB1dEdyb3VwVHlwZSk7XG4gICAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5sb2NhbGUgfHwgdGhpcy5fbG9jYWxlSWQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSB0aGlzLnBsYXRmb3JtLktFWU1BUC5BUlJPV19VUDpcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHRoaXMucGxhdGZvcm0uS0VZTUFQLkFSUk9XX0RPV046XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyB0aGUgZGF0ZSByYW5nZSBwaWNrZXIncyBkcm9wZG93biBvciBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyICNkYXRlUmFuZ2U+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICpcbiAgICAgKiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZ3hCdXR0b24gKGNsaWNrKT1cImRhdGVSYW5nZS5vcGVuKClcIj5PcGVuIERpYWxvZzwvYnV0dG9uXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG9wZW4ob3ZlcmxheVNldHRpbmdzPzogT3ZlcmxheVNldHRpbmdzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb2xsYXBzZWQgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmlzRHJvcGRvd25cbiAgICAgICAgICAgID8gdGhpcy5kcm9wZG93bk92ZXJsYXlTZXR0aW5nc1xuICAgICAgICAgICAgOiB0aGlzLmRpYWxvZ092ZXJsYXlTZXR0aW5nc1xuICAgICAgICAgICAgLCBvdmVybGF5U2V0dGluZ3MpO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlJZCA9IHRoaXMuX292ZXJsYXlTZXJ2aWNlXG4gICAgICAgICAgICAuYXR0YWNoKElneENhbGVuZGFyQ29udGFpbmVyQ29tcG9uZW50LCB0aGlzLnZpZXdDb250YWluZXJSZWYsIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb092ZXJsYXlFdmVudHMoKTtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2Uuc2hvdyh0aGlzLl9vdmVybGF5SWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgZGF0ZSByYW5nZSBwaWNrZXIncyBkcm9wZG93biBvciBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRhdGUtcmFuZ2UtcGlja2VyICNkYXRlUmFuZ2U+PC9pZ3gtZGF0ZS1yYW5nZS1waWNrZXI+XG4gICAgICpcbiAgICAgKiA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZ3hCdXR0b24gKGNsaWNrKT1cImRhdGVSYW5nZS5jbG9zZSgpXCI+Q2xvc2UgRGlhbG9nPC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5oaWRlKHRoaXMuX292ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBkYXRlIHJhbmdlIHBpY2tlcidzIGRyb3Bkb3duIG9yIGRpYWxvZ1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1kYXRlLXJhbmdlLXBpY2tlciAjZGF0ZVJhbmdlPjwvaWd4LWRhdGUtcmFuZ2UtcGlja2VyPlxuICAgICAqXG4gICAgICogPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIChjbGljayk9XCJkYXRlUmFuZ2UudG9nZ2xlKClcIj5Ub2dnbGUgRGlhbG9nPC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZShvdmVybGF5U2V0dGluZ3M/OiBPdmVybGF5U2V0dGluZ3MpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuKG92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIGEgcmFuZ2Ugb2YgZGF0ZXMuIElmIG5vIGBlbmREYXRlYCBpcyBwYXNzZWQsIHJhbmdlIGlzIDEgZGF5IChvbmx5IGBzdGFydERhdGVgKVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIHNlbGVjdEZpdmVEYXlSYW5nZSgpIHtcbiAgICAgKiAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAqICBjb25zdCBpbkZpdmVEYXlzID0gbmV3IERhdGUobmV3IERhdGUoKS5zZXREYXRlKHRvZGF5LmdldERhdGUoKSArIDUpKTtcbiAgICAgKiAgdGhpcy5kYXRlUmFuZ2Uuc2VsZWN0KHRvZGF5LCBpbkZpdmVEYXlzKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdChzdGFydERhdGU6IERhdGUsIGVuZERhdGU/OiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGVuZERhdGUgPSBlbmREYXRlID8/IHN0YXJ0RGF0ZTtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlID0gW3N0YXJ0RGF0ZSwgZW5kRGF0ZV07XG4gICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uKGRhdGVSYW5nZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IERhdGVSYW5nZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaENhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgY29uc3QgdmFsdWU6IERhdGVSYW5nZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5wdXQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRJbnB1dCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KSBhcyBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydElucHV0LmRhdGVUaW1lRWRpdG9yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCB7IHN0YXJ0VmFsdWU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZW5kSW5wdXQuZGF0ZVRpbWVFZGl0b3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvcnMsIHsgZW5kVmFsdWU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtaW4gPSBwYXJzZURhdGUodGhpcy5taW5WYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBtYXggPSBwYXJzZURhdGUodGhpcy5tYXhWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHBhcnNlRGF0ZSh2YWx1ZS5zdGFydCk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBwYXJzZURhdGUodmFsdWUuZW5kKTtcbiAgICAgICAgICAgIGlmICgobWluICYmIHN0YXJ0ICYmIERhdGVUaW1lVXRpbC5sZXNzVGhhbk1pblZhbHVlKHN0YXJ0LCBtaW4sIGZhbHNlKSlcbiAgICAgICAgICAgICAgICB8fCAobWluICYmIGVuZCAmJiBEYXRlVGltZVV0aWwubGVzc1RoYW5NaW5WYWx1ZShlbmQsIG1pbiwgZmFsc2UpKSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3JzLCB7IG1pblZhbHVlOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChtYXggJiYgc3RhcnQgJiYgRGF0ZVRpbWVVdGlsLmdyZWF0ZXJUaGFuTWF4VmFsdWUoc3RhcnQsIG1heCwgZmFsc2UpKVxuICAgICAgICAgICAgICAgIHx8IChtYXggJiYgZW5kICYmIERhdGVUaW1lVXRpbC5ncmVhdGVyVGhhbk1heFZhbHVlKGVuZCwgbWF4LCBmYWxzZSkpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvcnMsIHsgbWF4VmFsdWU6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPiAwID8gZXJyb3JzIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZT8oZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25nQ29udHJvbCA9IHRoaXMuX2luamVjdG9yLmdldDxOZ0NvbnRyb2w+KE5nQ29udHJvbCwgbnVsbCk7XG5cbiAgICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmxvY2FsZSB8fCB0aGlzLl9sb2NhbGVJZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvRGF0ZUVkaXRvckV2ZW50cygpO1xuICAgICAgICB0aGlzLmNvbmZpZ1Bvc2l0aW9uU3RyYXRlZ3koKTtcbiAgICAgICAgdGhpcy5jb25maWdPdmVybGF5U2V0dGluZ3MoKTtcbiAgICAgICAgdGhpcy5jYWNoZUZvY3VzZWRJbnB1dCgpO1xuICAgICAgICB0aGlzLmF0dGFjaE9uVG91Y2hlZCgpO1xuXG4gICAgICAgIHRoaXMuc2V0UmVxdWlyZWRUb0lucHV0cygpO1xuXG4gICAgICAgIGlmICh0aGlzLl9uZ0NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1c0NoYW5nZXMkID0gdGhpcy5fbmdDb250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHRoaXMub25TdGF0dXNDaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGVsYXkgaW52b2NhdGlvbnMgdW50aWwgdGhlIGN1cnJlbnQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSBoYXMgY29tcGxldGVkXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNhYmxlZFN0YXRlKCk7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxTZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbnB1dHMoKTtcbiAgICAgICAgICAgIC8vIEIuUC4gMDcgSnVseSAyMDIxIC0gSWd4RGF0ZVJhbmdlUGlja2VyIG5vdCBzaG93aW5nIGluaXRpYWwgZGlzYWJsZWQgc3RhdGUgd2l0aCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2ggIzk3NzZcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogaWYgZGlzYWJsZWQgaXMgcGxhY2VkIG9uIHRoZSByYW5nZSBwaWNrZXIgZWxlbWVudCBhbmQgdGhlcmUgYXJlIHByb2plY3RlZCBpbnB1dHNcbiAgICAgICAgICAgICAqIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIHNpbmNlIGlneElucHV0IHdpbGwgaW5pdGlhbGx5IHNldCB0aGUgcHJvamVjdGVkIGlucHV0cycgZGlzYWJsZWQgdG8gZmFsc2VcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzICYmIHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlGb3JtYXQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dEZvcm1hdCgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydkaXNwbGF5Rm9ybWF0J10gJiYgdGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheUZvcm1hdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydpbnB1dEZvcm1hdCddICYmIHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUlucHV0Rm9ybWF0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWRTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5fc3RhdHVzQ2hhbmdlcyQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1c0NoYW5nZXMkLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuZGV0YWNoKHRoaXMuX292ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0RWRpdEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0RGlyZWN0aXZlLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uU3RhdHVzQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGl0eVN0YXRlKHRoaXMuaW5wdXREaXJlY3RpdmUsIHRoaXMuaW5wdXRHcm91cC5pc0ZvY3VzZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2plY3RlZElucHV0c1xuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRpdHlTdGF0ZShpLmlucHV0RGlyZWN0aXZlLCBpLmlzRm9jdXNlZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRSZXF1aXJlZFRvSW5wdXRzKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0VmFsaWRpdHlTdGF0ZShpbnB1dERpcmVjdGl2ZTogSWd4SW5wdXREaXJlY3RpdmUsIGlzRm9jdXNlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbmdDb250cm9sICYmICF0aGlzLl9uZ0NvbnRyb2wuZGlzYWJsZWQgJiYgdGhpcy5pc1RvdWNoZWRPckRpcnR5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWYWxpZGF0b3JzICYmIGlzRm9jdXNlZCkge1xuICAgICAgICAgICAgICAgIGlucHV0RGlyZWN0aXZlLnZhbGlkID0gdGhpcy5fbmdDb250cm9sLnZhbGlkID8gSWd4SW5wdXRTdGF0ZS5WQUxJRCA6IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5wdXREaXJlY3RpdmUudmFsaWQgPSB0aGlzLl9uZ0NvbnRyb2wudmFsaWQgPyBJZ3hJbnB1dFN0YXRlLklOSVRJQUwgOiBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dERpcmVjdGl2ZS52YWxpZCA9IElneElucHV0U3RhdGUuSU5JVElBTDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzVG91Y2hlZE9yRGlydHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5fbmdDb250cm9sLmNvbnRyb2wudG91Y2hlZCB8fCB0aGlzLl9uZ0NvbnRyb2wuY29udHJvbC5kaXJ0eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaGFzVmFsaWRhdG9ycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICghIXRoaXMuX25nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvciB8fCAhIXRoaXMuX25nQ29udHJvbC5jb250cm9sLmFzeW5jVmFsaWRhdG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVNlbGVjdGlvbihzZWxlY3Rpb25EYXRhOiBEYXRlW10pOiB2b2lkIHtcbiAgICAgICAgbGV0IG5ld1ZhbHVlID0gdGhpcy5leHRyYWN0UmFuZ2Uoc2VsZWN0aW9uRGF0YSk7XG4gICAgICAgIGlmICghbmV3VmFsdWUuc3RhcnQgJiYgIW5ld1ZhbHVlLmVuZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wZG93biAmJiBzZWxlY3Rpb25EYXRhPy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUNsb3NpbmcoZTogSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncyk6IHZvaWQge1xuICAgICAgICBjb25zdCBhcmdzID0geyBvd25lcjogdGhpcywgY2FuY2VsOiBlPy5jYW5jZWwsIGV2ZW50OiBlPy5ldmVudCB9O1xuICAgICAgICB0aGlzLmNsb3NpbmcuZW1pdChhcmdzKTtcbiAgICAgICAgZS5jYW5jZWwgPSBhcmdzLmNhbmNlbDtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duICYmIGU/LmV2ZW50ICYmICF0aGlzLmlzRm9jdXNlZCkge1xuICAgICAgICAgICAgLy8gb3V0c2lkZSBjbGlja1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGl0eU9uQmx1cigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vblRvdWNoQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIC8vIGlucHV0IGNsaWNrXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMgJiYgdGhpcy5fZm9jdXNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZElucHV0LnNldEZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZElucHV0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0RGlyZWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb092ZXJsYXlFdmVudHMoKSB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLm9wZW5pbmcucGlwZSguLi50aGlzLl9vdmVybGF5U3ViRmlsdGVyKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlFdmVudCA9IGUgYXMgT3ZlcmxheUNhbmNlbGFibGVFdmVudEFyZ3M7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0geyBvd25lcjogdGhpcywgY2FuY2VsOiBvdmVybGF5RXZlbnQ/LmNhbmNlbCwgZXZlbnQ6IGUuZXZlbnQgfTtcbiAgICAgICAgICAgIHRoaXMub3BlbmluZy5lbWl0KGFyZ3MpO1xuICAgICAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuZGV0YWNoKHRoaXMuX292ZXJsYXlJZCk7XG4gICAgICAgICAgICAgICAgb3ZlcmxheUV2ZW50LmNhbmNlbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplQ2FsZW5kYXJDb250YWluZXIoZS5jb21wb25lbnRSZWYuaW5zdGFuY2UpO1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJDb250YWluZXIgPSBlLmNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5fY29sbGFwc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLm9wZW5lZC5waXBlKC4uLnRoaXMuX292ZXJsYXlTdWJGaWx0ZXIpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyLndyYXBwZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5vcGVuZWQuZW1pdCh7IG93bmVyOiB0aGlzIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5jbG9zaW5nLnBpcGUoLi4udGhpcy5fb3ZlcmxheVN1YkZpbHRlcikuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNsb3NpbmcoZSBhcyBPdmVybGF5Q2FuY2VsYWJsZUV2ZW50QXJncyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmNsb3NlZC5waXBlKC4uLnRoaXMuX292ZXJsYXlTdWJGaWx0ZXIpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fb3ZlcmxheUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbGxhcHNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5SWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXIgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJDb250YWluZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHsgb3duZXI6IHRoaXMgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVmFsdWUodmFsdWU6IERhdGVSYW5nZSkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlID8gdmFsdWUgOiBudWxsO1xuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0cygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFyKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWxpZGl0eU9uQmx1cigpIHtcbiAgICAgICAgdGhpcy5vblRvdWNoQ2FsbGJhY2soKTtcbiAgICAgICAgaWYgKHRoaXMuX25nQ29udHJvbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9uZ0NvbnRyb2wudmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkudXBkYXRlSW5wdXRWYWxpZGl0eShJZ3hJbnB1dFN0YXRlLklOVkFMSUQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaS51cGRhdGVJbnB1dFZhbGlkaXR5KElneElucHV0U3RhdGUuSU5JVElBTCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXREaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX25nQ29udHJvbC52YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUudmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVEaXNhYmxlZFN0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZUVuZENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50O1xuICAgICAgICAgICAgc3RhcnQuaW5wdXREaXJlY3RpdmUuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuICAgICAgICAgICAgZW5kLmlucHV0RGlyZWN0aXZlLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0UmVxdWlyZWRUb0lucHV0cygpOiB2b2lkIHtcbiAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgaWd4SW5wdXQgc2V0dGluZyByZXF1aXJlZFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVxdWlyZWQgPSB0aGlzLnJlcXVpcmVkO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRHcm91cCAmJiB0aGlzLmlucHV0R3JvdXAuaXNSZXF1aXJlZCAhPT0gaXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkID0gaXNSZXF1aXJlZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMgJiYgdGhpcy5fbmdDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZm9yRWFjaChpID0+IGkuaXNSZXF1aXJlZCA9IGlzUmVxdWlyZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlTWluVmFsdWUodmFsdWU6IHN0cmluZyB8IERhdGUpOiBEYXRlIHwgbnVsbCB7XG4gICAgICAgIGxldCBtaW5WYWx1ZTogRGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSk7XG4gICAgICAgIGlmICghbWluVmFsdWUgJiYgdGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmlsdGVyKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KVswXTtcbiAgICAgICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgICAgIG1pblZhbHVlID0gcGFyc2VEYXRlKHN0YXJ0LmRhdGVUaW1lRWRpdG9yLm1pblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtaW5WYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlTWF4VmFsdWUodmFsdWU6IHN0cmluZyB8IERhdGUpOiBEYXRlIHwgbnVsbCB7XG4gICAgICAgIGxldCBtYXhWYWx1ZTogRGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSk7XG4gICAgICAgIGlmICghbWF4VmFsdWUgJiYgdGhpcy5wcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbHRlcihpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQpWzBdO1xuICAgICAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgICAgIG1heFZhbHVlID0gcGFyc2VEYXRlKGVuZC5kYXRlVGltZUVkaXRvci5tYXhWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF4VmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDYWxlbmRhcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGVuZGFyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxlbmRhci5kaXNhYmxlZERhdGVzID0gW107XG4gICAgICAgIGNvbnN0IG1pblZhbHVlID0gdGhpcy5wYXJzZU1pblZhbHVlKHRoaXMubWluVmFsdWUpO1xuICAgICAgICBpZiAobWluVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuZGlzYWJsZWREYXRlcy5wdXNoKHsgdHlwZTogRGF0ZVJhbmdlVHlwZS5CZWZvcmUsIGRhdGVSYW5nZTogW21pblZhbHVlXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXhWYWx1ZSA9IHRoaXMucGFyc2VNYXhWYWx1ZSh0aGlzLm1heFZhbHVlKTtcbiAgICAgICAgaWYgKG1heFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyLmRpc2FibGVkRGF0ZXMucHVzaCh7IHR5cGU6IERhdGVSYW5nZVR5cGUuQWZ0ZXIsIGRhdGVSYW5nZTogW21heFZhbHVlXSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhbmdlOiBEYXRlW10gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWU/LnN0YXJ0ICYmIHRoaXMudmFsdWU/LmVuZCkge1xuICAgICAgICAgICAgY29uc3QgX3ZhbHVlID0gdGhpcy50b1JhbmdlT2ZEYXRlcyh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChEYXRlVGltZVV0aWwuZ3JlYXRlclRoYW5NYXhWYWx1ZShfdmFsdWUuc3RhcnQsIF92YWx1ZS5lbmQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zd2FwRWRpdG9yRGF0ZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlSW5SYW5nZSh0aGlzLnZhbHVlLCBtaW5WYWx1ZSwgbWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2UucHVzaChfdmFsdWUuc3RhcnQsIF92YWx1ZS5lbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJhbmdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuc2VsZWN0RGF0ZShyYW5nZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmFuZ2UubGVuZ3RoID09PSAwICYmIHRoaXMuY2FsZW5kYXIubW9udGhWaWV3cykge1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5kZXNlbGVjdERhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGVuZGFyLnZpZXdEYXRlID0gcmFuZ2VbMF0gfHwgbmV3IERhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN3YXBFZGl0b3JEYXRlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQpIGFzIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50O1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VFbmRDb21wb25lbnQpIGFzIElneERhdGVSYW5nZUVuZENvbXBvbmVudDtcbiAgICAgICAgICAgIFtzdGFydC5kYXRlVGltZUVkaXRvci52YWx1ZSwgZW5kLmRhdGVUaW1lRWRpdG9yLnZhbHVlXSA9IFtlbmQuZGF0ZVRpbWVFZGl0b3IudmFsdWUsIHN0YXJ0LmRhdGVUaW1lRWRpdG9yLnZhbHVlXTtcbiAgICAgICAgICAgIFt0aGlzLnZhbHVlLnN0YXJ0LCB0aGlzLnZhbHVlLmVuZF0gPSBbdGhpcy52YWx1ZS5lbmQsIHRoaXMudmFsdWUuc3RhcnRdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWx1ZUluUmFuZ2UodmFsdWU6IERhdGVSYW5nZSwgbWluVmFsdWU/OiBEYXRlLCBtYXhWYWx1ZT86IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgX3ZhbHVlID0gdGhpcy50b1JhbmdlT2ZEYXRlcyh2YWx1ZSk7XG4gICAgICAgIGlmIChtaW5WYWx1ZSAmJiBEYXRlVGltZVV0aWwubGVzc1RoYW5NaW5WYWx1ZShfdmFsdWUuc3RhcnQsIG1pblZhbHVlLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4VmFsdWUgJiYgRGF0ZVRpbWVVdGlsLmdyZWF0ZXJUaGFuTWF4VmFsdWUoX3ZhbHVlLmVuZCwgbWF4VmFsdWUsIGZhbHNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHRyYWN0UmFuZ2Uoc2VsZWN0aW9uOiBEYXRlW10pOiBEYXRlUmFuZ2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhcnQ6IHNlbGVjdGlvblswXSB8fCBudWxsLFxuICAgICAgICAgICAgZW5kOiBzZWxlY3Rpb24ubGVuZ3RoID4gMCA/IHNlbGVjdGlvbltzZWxlY3Rpb24ubGVuZ3RoIC0gMV0gOiBudWxsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b1JhbmdlT2ZEYXRlcyhyYW5nZTogRGF0ZVJhbmdlKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0ge1xuICAgICAgICBsZXQgc3RhcnQ7XG4gICAgICAgIGxldCBlbmQ7XG4gICAgICAgIGlmICghaXNEYXRlKHJhbmdlLnN0YXJ0KSkge1xuICAgICAgICAgICAgc3RhcnQgPSBEYXRlVGltZVV0aWwucGFyc2VJc29EYXRlKHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRGF0ZShyYW5nZS5lbmQpKSB7XG4gICAgICAgICAgICBlbmQgPSBEYXRlVGltZVV0aWwucGFyc2VJc29EYXRlKHJhbmdlLmVuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnQgfHwgZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBzdGFydDogcmFuZ2Uuc3RhcnQgYXMgRGF0ZSwgZW5kOiByYW5nZS5lbmQgYXMgRGF0ZSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVG9EYXRlRWRpdG9yRXZlbnRzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZUVuZENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50O1xuICAgICAgICAgICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0LmRhdGVUaW1lRWRpdG9yLnZhbHVlQ2hhbmdlXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0geyBzdGFydDogdmFsdWUsIGVuZDogdGhpcy52YWx1ZS5lbmQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQ6IHZhbHVlLCBlbmQ6IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZW5kLmRhdGVUaW1lRWRpdG9yLnZhbHVlQ2hhbmdlXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0geyBzdGFydDogdGhpcy52YWx1ZS5zdGFydCwgZW5kOiB2YWx1ZSBhcyBEYXRlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IHZhbHVlIGFzIERhdGUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaE9uVG91Y2hlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzUHJvamVjdGVkSW5wdXRzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2plY3RlZElucHV0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgICAgIGZyb21FdmVudChpLmRhdGVUaW1lRWRpdG9yLm5hdGl2ZUVsZW1lbnQsICdibHVyJylcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkaXR5T25CbHVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcm9tRXZlbnQodGhpcy5pbnB1dERpcmVjdGl2ZS5uYXRpdmVFbGVtZW50LCAnYmx1cicpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkaXR5T25CbHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FjaGVGb2N1c2VkSW5wdXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Byb2plY3RlZElucHV0cykge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICBmcm9tRXZlbnQoaS5kYXRlVGltZUVkaXRvci5uYXRpdmVFbGVtZW50LCAnZm9jdXMnKVxuICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2ZvY3VzZWRJbnB1dCA9IGkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbmZpZ1Bvc2l0aW9uU3RyYXRlZ3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgICAgICBvcGVuQW5pbWF0aW9uOiBmYWRlSW4sXG4gICAgICAgICAgICBjbG9zZUFuaW1hdGlvbjogZmFkZU91dFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kcm9wRG93bk92ZXJsYXlTZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5ID0gbmV3IEF1dG9Qb3NpdGlvblN0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uU2V0dGluZ3MpO1xuICAgICAgICB0aGlzLl9kcm9wRG93bk92ZXJsYXlTZXR0aW5ncy50YXJnZXQgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbmZpZ092ZXJsYXlTZXR0aW5ncygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3ZlcmxheVNldHRpbmdzICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9kcm9wRG93bk92ZXJsYXlTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2Ryb3BEb3duT3ZlcmxheVNldHRpbmdzLCB0aGlzLm92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgICAgICB0aGlzLl9kaWFsb2dPdmVybGF5U2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9kaWFsb2dPdmVybGF5U2V0dGluZ3MsIHRoaXMub3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbFNldFZhbHVlKCkge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyB2YWx1ZSBhbmQgbm8gbmdDb250cm9sIG9uIHRoZSBwaWNrZXIgYnV0IHdlIGhhdmUgaW5wdXRzIHdlIG1heSBoYXZlIHZhbHVlIHNldCB0aHJvdWdoXG4gICAgICAgIC8vIHRoZWlyIG5nTW9kZWxzIC0gd2Ugc2hvdWxkIGdlbmVyYXRlIG91ciBpbml0aWFsIGNvbnRyb2wgdmFsdWVcbiAgICAgICAgaWYgKCghdGhpcy52YWx1ZSB8fCAoIXRoaXMudmFsdWUuc3RhcnQgJiYgIXRoaXMudmFsdWUuZW5kKSkgJiYgdGhpcy5oYXNQcm9qZWN0ZWRJbnB1dHMgJiYgIXRoaXMuX25nQ29udHJvbCkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnByb2plY3RlZElucHV0cy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZVN0YXJ0Q29tcG9uZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucHJvamVjdGVkSW5wdXRzLmZpbmQoaSA9PiBpIGluc3RhbmNlb2YgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5kYXRlVGltZUVkaXRvci52YWx1ZSBhcyBEYXRlLFxuICAgICAgICAgICAgICAgIGVuZDogZW5kLmRhdGVUaW1lRWRpdG9yLnZhbHVlIGFzIERhdGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnByb2plY3RlZElucHV0cz8uZmluZChpID0+IGkgaW5zdGFuY2VvZiBJZ3hEYXRlUmFuZ2VTdGFydENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlU3RhcnRDb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucHJvamVjdGVkSW5wdXRzPy5maW5kKGkgPT4gaSBpbnN0YW5jZW9mIElneERhdGVSYW5nZUVuZENvbXBvbmVudCkgYXMgSWd4RGF0ZVJhbmdlRW5kQ29tcG9uZW50O1xuICAgICAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICAgICAgICBjb25zdCBfdmFsdWUgPSB0aGlzLnZhbHVlID8gdGhpcy50b1JhbmdlT2ZEYXRlcyh0aGlzLnZhbHVlKSA6IG51bGw7XG4gICAgICAgICAgICBzdGFydC51cGRhdGVJbnB1dFZhbHVlKF92YWx1ZT8uc3RhcnQgfHwgbnVsbCk7XG4gICAgICAgICAgICBlbmQudXBkYXRlSW5wdXRWYWx1ZShfdmFsdWU/LmVuZCB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRGlzcGxheUZvcm1hdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gaSBhcyBJZ3hEYXRlUmFuZ2VJbnB1dHNCYXNlQ29tcG9uZW50O1xuICAgICAgICAgICAgaW5wdXQuZGF0ZVRpbWVFZGl0b3IuZGlzcGxheUZvcm1hdCA9IHRoaXMuZGlzcGxheUZvcm1hdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVJbnB1dEZvcm1hdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0ZWRJbnB1dHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gaSBhcyBJZ3hEYXRlUmFuZ2VJbnB1dHNCYXNlQ29tcG9uZW50O1xuICAgICAgICAgICAgaWYgKGlucHV0LmRhdGVUaW1lRWRpdG9yLmlucHV0Rm9ybWF0ICE9PSB0aGlzLmlucHV0Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0ZVRpbWVFZGl0b3IuaW5wdXRGb3JtYXQgPSB0aGlzLmlucHV0Rm9ybWF0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0aWFsaXplQ2FsZW5kYXJDb250YWluZXIoY29tcG9uZW50SW5zdGFuY2U6IElneENhbGVuZGFyQ29udGFpbmVyQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyID0gY29tcG9uZW50SW5zdGFuY2UuY2FsZW5kYXI7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIuaGFzSGVhZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIubG9jYWxlID0gdGhpcy5sb2NhbGU7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIuc2VsZWN0aW9uID0gQ2FsZW5kYXJTZWxlY3Rpb24uUkFOR0U7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIud2Vla1N0YXJ0ID0gdGhpcy53ZWVrU3RhcnQ7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIuaGlkZU91dHNpZGVEYXlzID0gdGhpcy5oaWRlT3V0c2lkZURheXM7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIubW9udGhzVmlld051bWJlciA9IHRoaXMuZGlzcGxheU1vbnRoc0NvdW50O1xuICAgICAgICB0aGlzLmNhbGVuZGFyLnNob3dXZWVrTnVtYmVycyA9IHRoaXMuc2hvd1dlZWtOdW1iZXJzO1xuICAgICAgICB0aGlzLmNhbGVuZGFyLnNlbGVjdGVkLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKChldjogRGF0ZVtdKSA9PiB0aGlzLmhhbmRsZVNlbGVjdGlvbihldikpO1xuXG4gICAgICAgIGNvbXBvbmVudEluc3RhbmNlLm1vZGUgPSB0aGlzLm1vZGU7XG4gICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmNsb3NlQnV0dG9uTGFiZWwgPSAhdGhpcy5pc0Ryb3Bkb3duID8gdGhpcy5kb25lQnV0dG9uVGV4dCA6IG51bGw7XG4gICAgICAgIGNvbXBvbmVudEluc3RhbmNlLnBpY2tlckFjdGlvbnMgPSB0aGlzLnBpY2tlckFjdGlvbnM7XG4gICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmNhbGVuZGFyQ2xvc2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGFzUHJvamVjdGVkSW5wdXRzID8gc3RhcnRFbmRUZW1wbGF0ZSA6IGRlZlRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjc2luZ2xlVGVtcGxhdGU+XG4gICAgPGRpdiAoY2xpY2spPVwib3BlbigpXCIgY2xhc3M9XCJjb250ZW50LXdyYXBcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LWRhdGUtc2luZ2xlXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzdGFydEVuZFRlbXBsYXRlPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImlneC1kYXRlLXJhbmdlLXN0YXJ0XCI+PC9uZy1jb250ZW50PlxuICAgIDxkaXYgW2NsYXNzTmFtZV09XCJzZXBhcmF0b3JDbGFzc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGF0ZVNlcGFyYXRvclRlbXBsYXRlIHx8IGRlZkRhdGVTZXBhcmF0b3JUZW1wbGF0ZTtcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LWRhdGUtcmFuZ2UtZW5kXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZJY29uPlxuICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJkZWZhdWx0XCIgbmFtZT1cImRhdGVfcmFuZ2VcIj48L2lneC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZEYXRlU2VwYXJhdG9yVGVtcGxhdGU+e3sgZGF0ZVNlcGFyYXRvciB9fTwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmVGVtcGxhdGU+XG4gICAgPGlneC1pbnB1dC1ncm91cCBbdHlwZV09XCJ0eXBlXCIgKGNsaWNrKT1cIm9wZW4oKVwiPlxuICAgICAgICA8IS0tIG9ubHkgc2V0IG1hc2sgcGxhY2Vob2xkZXIgd2hlbiBlbXB0eSwgb3RoZXJ3aXNlIGlucHV0IGdyb3VwIG1pZ2h0IHVzZSBpdCBhcyBsYWJlbCBpZiBub25lIGlzIHNldCAtLT5cbiAgICAgICAgPGlucHV0ICNzaW5nbGVJbnB1dCBpZ3hJbnB1dCB0eXBlPVwidGV4dFwiIHJlYWRvbmx5IFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtwbGFjZWhvbGRlcl09XCJ2YWx1ZSA/ICcnIDogc2luZ2xlSW5wdXRGb3JtYXRcIlxuICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCIgYXJpYS1oYXNwb3B1cD1cImdyaWRcIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIiFjb2xsYXBzZWRcIiBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwibGFiZWw/LmlkXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZSB8IGRhdGVSYW5nZTogYXBwbGllZEZvcm1hdCA6IGxvY2FsZSA6IGZvcm1hdHRlclwiIC8+XG5cbiAgICAgICAgPGlneC1wcmVmaXggKm5nSWY9XCIhdG9nZ2xlQ29tcG9uZW50cy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWZJY29uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvaWd4LXByZWZpeD5cblxuICAgICAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwiW2lneExhYmVsXVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2lneExhYmVsXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbmdQcm9qZWN0QXM9XCJpZ3gtcHJlZml4XCI+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtcHJlZml4LFtpZ3hQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cImlneC1zdWZmaXhcIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImlneC1zdWZmaXgsW2lneFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwiaWd4LWhpbnRcIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImlneC1oaW50LFtpZ3hIaW50XVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9pZ3gtaW5wdXQtZ3JvdXA+XG48L25nLXRlbXBsYXRlPlxuIl19