ngx-scandoc 1.2.2 → 1.2.4

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.
@@ -86,7 +86,7 @@ export class WebcamComponent extends BaseComponent {
86
86
  });
87
87
  }
88
88
  onResize() {
89
- this.videoReady.next(false);
89
+ // this.videoReady.next(false);
90
90
  this.resizeStage();
91
91
  }
92
92
  /**
@@ -196,7 +196,7 @@ export class WebcamComponent extends BaseComponent {
196
196
  return this.height;
197
197
  }
198
198
  updatecanvasSize() {
199
- console.log(this.width, this.height);
199
+ // console.log(this.width, this.height);
200
200
  const landscape = this.width > this.height;
201
201
  const aspect = this.videoSize.width / this.videoSize.height;
202
202
  let width = this.width;
@@ -322,7 +322,7 @@ export class WebcamComponent extends BaseComponent {
322
322
  : WebcamComponent.DEFAULT_IMAGE_TYPE;
323
323
  let _canvas = document.createElement('canvas'); //this.canvasSnapshot.nativeElement;
324
324
  const { width, height } = this.videoSize;
325
- console.log(width, height);
325
+ // console.log(width, height);
326
326
  const { padding, top, rWidth, rHeight } = this.snapRectangle;
327
327
  _canvas.width = rWidth;
328
328
  _canvas.height = rHeight;
@@ -609,6 +609,7 @@ export class WebcamComponent extends BaseComponent {
609
609
  * Init webcam live view
610
610
  */
611
611
  initWebcam(deviceId, userVideoTrackConstraints) {
612
+ console.log('INIT WEBCAM');
612
613
  const _video = this.nativeVideoElement;
613
614
  // const videoStreamer = this.videoStreamer.nativeElement;
614
615
  // const videoSmall = document.createElement('video');
@@ -669,7 +670,7 @@ export class WebcamComponent extends BaseComponent {
669
670
  get cardRectangle() {
670
671
  const _canvas = this.canvas.nativeElement;
671
672
  const docSize = this.type === 'selfie' ? 1 : 86 / 55;
672
- console.log(_canvas.width, _canvas.height);
673
+ // console.log(_canvas.width, _canvas.height);
673
674
  let padding = 10;
674
675
  let rWidth = _canvas.width - 2 * padding;
675
676
  let rHeight = rWidth / docSize;
@@ -681,7 +682,7 @@ export class WebcamComponent extends BaseComponent {
681
682
  top = (_canvas.height - rHeight) / 2;
682
683
  padding = (_canvas.width - rWidth) / 2;
683
684
  }
684
- console.log(padding, top, rWidth, rHeight);
685
+ // console.log(padding, top, rWidth, rHeight);
685
686
  return { padding, top, rWidth, rHeight };
686
687
  }
687
688
  get snapRectangle() {
@@ -869,4 +870,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
869
870
  type: HostListener,
870
871
  args: ['window:resize', ['$event']]
871
872
  }] } });
872
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zY2FuZG9jL3NyYy9jb3JlL2NvbXBvbmVudHMvd2ViY2FtL3dlYmNhbS93ZWJjYW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2NvcmUvY29tcG9uZW50cy93ZWJjYW0vd2ViY2FtL3dlYmNhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBeUIsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpELE9BQU8sRUFFTCxXQUFXLEdBRVosTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7O0FBU3JELE1BQU0sT0FBTyxlQUNYLFNBQVEsYUFBYTtJQXdIckIsWUFDUyxrQkFBc0MsRUFDdEMsUUFBa0IsRUFDakIsRUFBcUIsRUFDckIsSUFBWSxFQUVaLGNBQXdDO1FBRWhELEtBQUssRUFBRSxDQUFDO1FBUEQsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2pCLE9BQUUsR0FBRixFQUFF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QUdVLFNBQVM7c0JBQXpCLE1BQU07Z0JBR1UsVUFBVTtzQkFBMUIsTUFBTTtnQkFFVSxjQUFjO3NCQUE5QixNQUFNO2dCQUdVLFVBQVU7c0JBQTFCLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTTtnQkFvQnVDLEtBQUs7c0JBQWxELFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFa0IsYUFBYTtzQkFBbEUsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUtHLE1BQU07c0JBQXBELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHa0IsY0FBYztzQkFBcEUsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRVEsWUFBWTtzQkFBaEUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQWNoQyxPQUFPO3NCQURqQixLQUFLO2dCQW1CRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdOLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBXZWJjYW1Jbml0RXJyb3IgfSBmcm9tICcuLi9kb21haW4vd2ViY2FtLWluaXQtZXJyb3InO1xuaW1wb3J0IHsgV2ViY2FtSW1hZ2UgfSBmcm9tICcuLi9kb21haW4vd2ViY2FtLWltYWdlJztcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFdlYmNhbVV0aWwgfSBmcm9tICcuLi91dGlsL3dlYmNhbS51dGlsJztcbmltcG9ydCB7IFdlYmNhbU1pcnJvclByb3BlcnRpZXMgfSBmcm9tICcuLi9kb21haW4vd2ViY2FtLW1pcnJvci1wcm9wZXJ0aWVzJztcbmltcG9ydCB7XG4gIEJyZWFrcG9pbnRPYnNlcnZlcixcbiAgQnJlYWtwb2ludHMsXG4gIEJyZWFrcG9pbnRTdGF0ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyB3b3JrZXJ0ZXh0IH0gZnJvbSAnLi4vLi4vLi4vYXBwLndvcmtlcic7XG5pbXBvcnQgeyBOZ3hTY2FuZG9jQ2FtZXJhUHJvdmlkZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9wcm92aWRlcnMvY2FtZXJhLnByb3ZpZGVyJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9iYXNlLmNvbXBvbmVudCc7XG5cbmRlY2xhcmUgdmFyIE1lZGlhU3RyZWFtVHJhY2tQcm9jZXNzb3I6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LXNjYW5kb2Mtd2ViY2FtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dlYmNhbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dlYmNhbS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBXZWJjYW1Db21wb25lbnRcbiAgZXh0ZW5kcyBCYXNlQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIHRyYWNrUHJvY2Vzc29yOiBhbnk7XG4gIHRyYWNrU2V0dGluZ3M6IGFueTtcblxuICBASW5wdXQoKSBpbWFnZUhhbmRsZXIhOiBTdWJqZWN0PGFueT47XG5cbiAgcHJpdmF0ZSBzdGF0aWMgREVGQVVMVF9WSURFT19PUFRJT05TOiBNZWRpYVRyYWNrQ29uc3RyYWludHMgPSB7XG4gICAgZmFjaW5nTW9kZTogJ2Vudmlyb25tZW50JyxcbiAgfTtcbiAgcHJpdmF0ZSBzdGF0aWMgREVGQVVMVF9JTUFHRV9UWVBFOiBzdHJpbmcgPSAnaW1hZ2UvanBlZyc7XG4gIHByaXZhdGUgc3RhdGljIERFRkFVTFRfSU1BR0VfUVVBTElUWTogbnVtYmVyID0gMTtcblxuICBASW5wdXQoKSBwdWJsaWMgaWQ/OiBhbnk7XG4gIEBJbnB1dCgpIHB1YmxpYyB0eXBlPzogJ2RvY3VtZW50JyB8ICdzZWxmaWUnO1xuICAvKiogRGVmaW5lcyB0aGUgbWF4IHdpZHRoIG9mIHRoZSB3ZWJjYW0gYXJlYSBpbiBweCAqL1xuICBASW5wdXQoKSBwdWJsaWMgd2lkdGg6IG51bWJlciA9IDY0MDtcbiAgLyoqIERlZmluZXMgdGhlIG1heCBoZWlnaHQgb2YgdGhlIHdlYmNhbSBhcmVhIGluIHB4ICovXG4gIEBJbnB1dCgpIHB1YmxpYyBoZWlnaHQ6IG51bWJlciA9IDQ4MDtcbiAgLyoqIERlZmluZXMgYmFzZSBjb25zdHJhaW50cyB0byBhcHBseSB3aGVuIHJlcXVlc3RpbmcgdmlkZW8gdHJhY2sgZnJvbSBVc2VyTWVkaWEgKi9cbiAgQElucHV0KCkgcHVibGljIHZpZGVvT3B0aW9uczogTWVkaWFUcmFja0NvbnN0cmFpbnRzID1cbiAgICBXZWJjYW1Db21wb25lbnQuREVGQVVMVF9WSURFT19PUFRJT05TO1xuICAvKiogRmxhZyB0byBlbmFibGUvZGlzYWJsZSBjYW1lcmEgc3dpdGNoLiBJZiBlbmFibGVkLCBhIHN3aXRjaCBpY29uIHdpbGwgYmUgZGlzcGxheWVkIGlmIG11bHRpcGxlIGNhbWVyYXMgd2VyZSBmb3VuZCAqL1xuICBASW5wdXQoKSBwdWJsaWMgYWxsb3dDYW1lcmFTd2l0Y2g6IGJvb2xlYW4gPSB0cnVlO1xuICAvKiogUGFyYW1ldGVyIHRvIGNvbnRyb2wgaW1hZ2UgbWlycm9yaW5nIChpLmUuIGZvciB1c2VyLWZhY2luZyBjYW1lcmEpLiBbXCJhdXRvXCIsIFwiYWx3YXlzXCIsIFwibmV2ZXJcIl0gKi9cbiAgQElucHV0KCkgcHVibGljIG1pcnJvckltYWdlPzogc3RyaW5nIHwgV2ViY2FtTWlycm9yUHJvcGVydGllcztcbiAgLyoqIEZsYWcgdG8gY29udHJvbCB3aGV0aGVyIGFuIEltYWdlRGF0YSBvYmplY3QgaXMgc3RvcmVkIGludG8gdGhlIFdlYmNhbUltYWdlIG9iamVjdC4gKi9cbiAgQElucHV0KCkgcHVibGljIGNhcHR1cmVJbWFnZURhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIFRoZSBpbWFnZSB0eXBlIHRvIHVzZSB3aGVuIGNhcHR1cmluZyBzbmFwc2hvdHMgKi9cbiAgQElucHV0KCkgcHVibGljIGltYWdlVHlwZTogc3RyaW5nID0gV2ViY2FtQ29tcG9uZW50LkRFRkFVTFRfSU1BR0VfVFlQRTtcbiAgLyoqIFRoZSBpbWFnZSBxdWFsaXR5IHRvIHVzZSB3aGVuIGNhcHR1cmluZyBzbmFwc2hvdHMgKG51bWJlciBiZXR3ZWVuIDAgYW5kIDEpICovXG4gIEBJbnB1dCgpIHB1YmxpYyBpbWFnZVF1YWxpdHk6IG51bWJlciA9IFdlYmNhbUNvbXBvbmVudC5ERUZBVUxUX0lNQUdFX1FVQUxJVFk7XG5cbiAgLyoqIEV2ZW50RW1pdHRlciB3aGljaCBmaXJlcyB3aGVuIGFuIGltYWdlIGhhcyBiZWVuIGNhcHR1cmVkICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgaW1hZ2VDYXB0dXJlOiBFdmVudEVtaXR0ZXI8V2ViY2FtSW1hZ2U+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPFdlYmNhbUltYWdlPigpO1xuICAvKiogRW1pdHMgYSBtZWRpYUVycm9yIGlmIHdlYmNhbSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgKGUuZy4gbWlzc2luZyB1c2VyIHBlcm1pc3Npb25zKSAqL1xuICBAT3V0cHV0KCkgcHVibGljIGluaXRFcnJvcjogRXZlbnRFbWl0dGVyPFdlYmNhbUluaXRFcnJvcj4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8V2ViY2FtSW5pdEVycm9yPigpO1xuICAvKiogRW1pdHMgd2hlbiB0aGUgd2ViY2FtIHZpZGVvIHdhcyBjbGlja2VkICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgaW1hZ2VDbGljazogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgdGhlIGFjdGl2ZSBkZXZpY2VJZCBhZnRlciB0aGUgYWN0aXZlIHZpZGVvIGRldmljZSB3YXMgc3dpdGNoZWQgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBjYW1lcmFTd2l0Y2hlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBPdXRwdXQoKSBwdWJsaWMgdmlkZW9SZWFkeTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIHNob3dWaWRlbyA9IGZhbHNlO1xuICBAT3V0cHV0KCkgZGVzdHJveWVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKiBhdmFpbGFibGUgdmlkZW8gZGV2aWNlcyAqL1xuICBwdWJsaWMgYXZhaWxhYmxlVmlkZW9JbnB1dHM6IE1lZGlhRGV2aWNlSW5mb1tdID0gW107XG5cbiAgLyoqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2aWRlbyBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgc3dpdGNoZWQgKi9cbiAgcHVibGljIHZpZGVvSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjYW52YXNFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXG4gIC8qKiBJZiB0aGUgT2JzZXJ2YWJsZSByZXByZXNlbnRlZCBieSB0aGlzIHN1YnNjcmlwdGlvbiBlbWl0cywgYW4gaW1hZ2Ugd2lsbCBiZSBjYXB0dXJlZCBhbmQgZW1pdHRlZCB0aHJvdWdoXG4gICAqIHRoZSAnaW1hZ2VDYXB0dXJlJyBFdmVudEVtaXR0ZXIgKi9cbiAgcHJpdmF0ZSB0cmlnZ2VyU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAvKiogSW5kZXggb2YgYWN0aXZlIHZpZGVvIGluIGF2YWlsYWJsZVZpZGVvSW5wdXRzICovXG4gIHByaXZhdGUgYWN0aXZlVmlkZW9JbnB1dEluZGV4OiBudW1iZXIgPSAtMTtcbiAgLyoqIFN1YnNjcmlwdGlvbiB0byBzd2l0Y2hDYW1lcmEgZXZlbnRzICovXG4gIHByaXZhdGUgc3dpdGNoQ2FtZXJhU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAvKiogTWVkaWFTdHJlYW0gb2JqZWN0IGluIHVzZSBmb3Igc3RyZWFtaW5nIFVzZXJNZWRpYSBkYXRhICovXG4gIHByaXZhdGUgbWVkaWFTdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbCA9IG51bGw7XG4gIC8vIE9yaWdpbmFsIHZpZGVvXG4gIEBWaWV3Q2hpbGQoJ3ZpZGVvJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSB2aWRlbzogYW55O1xuICAvLyBBZGp1c3RlZCBmb3IgVUlcbiAgQFZpZXdDaGlsZCgndmlkZW9TdHJlYW1lcicsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgdmlkZW9TdHJlYW1lcjogYW55O1xuXG4gIC8vQFZpZXdDaGlsZCgndmlkZW9TbWFsbCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgdmlkZW9TbWFsbDogYW55O1xuICAvL3ZpZGVvU21hbGw6IEhUTUxWaWRlb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAvKiogQ2FudmFzIGZvciBWaWRlbyBTbmFwc2hvdHMgKi9cbiAgQFZpZXdDaGlsZCgnY2FudmFzJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBjYW52YXM6IGFueTtcblxuICAvKiogQ2FudmFzIGZvciBWaWRlbyBTbmFwc2hvdHMgKi9cbiAgQFZpZXdDaGlsZCgnY2FudmFzU25hcHNob3QnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGNhbnZhc1NuYXBzaG90OiBhbnk7XG5cbiAgQFZpZXdDaGlsZCgnY2FudmFzUmVzaXplJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBjYW52YXNSZXNpemU6IGFueTtcbiAgLyoqIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFjdGl2ZSB2aWRlbyBzdHJlYW0gKi9cbiAgYWN0aXZlVmlkZW9TZXR0aW5nczogYW55O1xuXG4gIHNodXRkb3duID0gZmFsc2U7XG4gIHByaXZhdGUgY2FuU3RhcnQgPSB0cnVlO1xuICB2aWRlb1NpemU6IGFueSA9IHsgd2lkdGg6IDE5MjAsIGhlaWdodDogMTA4MCB9O1xuICBjYW52YXNTaXplOiBhbnkgPSB7IHdpZHRoOiAxMjgwLCBoZWlnaHQ6IDcyMCB9O1xuXG4gIHdvcmtlcj86IFdvcmtlcjtcbiAgLyoqXG4gICAqIElmIHRoZSBnaXZlbiBPYnNlcnZhYmxlIGVtaXRzLCBhbiBpbWFnZSB3aWxsIGJlIGNhcHR1cmVkIGFuZCBlbWl0dGVkIHRocm91Z2ggJ2ltYWdlQ2FwdHVyZScgRXZlbnRFbWl0dGVyXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHRyaWdnZXIodHJpZ2dlcjogT2JzZXJ2YWJsZTxudW1iZXI+KSB7XG4gICAgaWYgKHRoaXMudHJpZ2dlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy50cmlnZ2VyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGV2ZW50cyBmcm9tIHRoaXMgT2JzZXJ2YWJsZSB0byB0YWtlIHNuYXBzaG90c1xuICAgIHRoaXMudHJpZ2dlclN1YnNjcmlwdGlvbiA9IHRyaWdnZXIuc3Vic2NyaWJlKCh0aW1lKSA9PiB7XG4gICAgICB0aGlzLnRha2VTbmFwc2hvdCh0aW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZ2l2ZW4gT2JzZXJ2YWJsZSBlbWl0cywgdGhlIGFjdGl2ZSB3ZWJjYW0gd2lsbCBiZSBzd2l0Y2hlZCB0byB0aGUgb25lIGluZGljYXRlZCBieSB0aGUgZW1pdHRlZCB2YWx1ZS5cbiAgICogQHBhcmFtIHN3aXRjaENhbWVyYSBJbmRpY2F0ZXMgd2hpY2ggd2ViY2FtIHRvIHN3aXRjaCB0b1xuICAgKiAgIHRydWU6IGN5Y2xlIGZvcndhcmRzIHRocm91Z2ggYXZhaWxhYmxlIHdlYmNhbXNcbiAgICogICBmYWxzZTogY3ljbGUgYmFja3dhcmRzIHRocm91Z2ggYXZhaWxhYmxlIHdlYmNhbXNcbiAgICogICBzdHJpbmc6IGFjdGl2YXRlIHRoZSB3ZWJjYW0gd2l0aCB0aGUgZ2l2ZW4gaWRcbiAgICovXG4gIEBJbnB1dCgpIHN3aXRjaENhbWVyYTogYW55O1xuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICBvblJlc2l6ZSgpIHtcbiAgICB0aGlzLnZpZGVvUmVhZHkubmV4dChmYWxzZSk7XG4gICAgdGhpcy5yZXNpemVTdGFnZSgpO1xuICB9XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlcixcbiAgICBwdWJsaWMgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxuXG4gICAgcHJpdmF0ZSBjYW1lcmFQcm92aWRlcjogTmd4U2NhbmRvY0NhbWVyYVByb3ZpZGVyXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gaWYgKHR5cGVvZiBXb3JrZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gICAvLyBDcmVhdGUgYSBuZXdcbiAgICAvLyAgIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcihcbiAgICAvLyAgICAgbmV3IFVSTCgnLi8uLi8uLi8uLi8uLi9hcHAvYXBwLndvcmtlcicsIGltcG9ydC5tZXRhLnVybClcbiAgICAvLyAgICk7XG4gICAgLy8gICB0aGlzLndvcmtlci5vbm1lc3NhZ2UgPSAoeyBkYXRhIH0pID0+IHtcbiAgICAvLyAgICAgY29uc29sZS5sb2coYHBhZ2UgZ290IG1lc3NhZ2U6ICR7ZGF0YX1gKTtcbiAgICAvLyAgIH07XG4gICAgLy8gICBjb25zb2xlLmxvZygnUE9TVCcpO1xuICAgIC8vICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2UoJ2hlbGxvJyk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIC8vIFdlYiB3b3JrZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAgLy8gICAvLyBZb3Ugc2hvdWxkIGFkZCBhIGZhbGxiYWNrIHNvIHRoYXQgeW91ciBwcm9ncmFtIHN0aWxsIGV4ZWN1dGVzIGNvcnJlY3RseS5cbiAgICAvLyB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1lZGlhVHJhY2tDb25zdHJhaW50cyB0byByZXF1ZXN0IHN0cmVhbWluZyB0aGUgZ2l2ZW4gZGV2aWNlXG4gICAqIEBwYXJhbSBkZXZpY2VJZFxuICAgKiBAcGFyYW0gYmFzZU1lZGlhVHJhY2tDb25zdHJhaW50cyBiYXNlIGNvbnN0cmFpbnRzIHRvIG1lcmdlIGRldmljZUlkLWNvbnN0cmFpbnQgaW50b1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWVkaWFDb25zdHJhaW50c0ZvckRldmljZShcbiAgICBkZXZpY2VJZDogc3RyaW5nLFxuICAgIGJhc2VNZWRpYVRyYWNrQ29uc3RyYWludHM6IE1lZGlhVHJhY2tDb25zdHJhaW50c1xuICApOiBNZWRpYVRyYWNrQ29uc3RyYWludHMge1xuICAgIGNvbnN0IHJlc3VsdDogTWVkaWFUcmFja0NvbnN0cmFpbnRzID0gYmFzZU1lZGlhVHJhY2tDb25zdHJhaW50c1xuICAgICAgPyBiYXNlTWVkaWFUcmFja0NvbnN0cmFpbnRzXG4gICAgICA6IHRoaXMuREVGQVVMVF9WSURFT19PUFRJT05TO1xuICAgIGlmIChkZXZpY2VJZCkge1xuICAgICAgcmVzdWx0LmRldmljZUlkID0geyBleGFjdDogZGV2aWNlSWQgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIGhhcnZlc3QgdGhlIGRldmljZUlkIGZyb20gdGhlIGdpdmVuIG1lZGlhU3RyZWFtVHJhY2sgb2JqZWN0LlxuICAgKiBCcm93c2VycyBwb3B1bGF0ZSB0aGlzIG9iamVjdCBkaWZmZXJlbnRseTsgdGhpcyBtZXRob2QgdHJpZXMgc29tZSBkaWZmZXJlbnQgYXBwcm9hY2hlc1xuICAgKiB0byByZWFkIHRoZSBpZC5cbiAgICogQHBhcmFtIG1lZGlhU3RyZWFtVHJhY2tcbiAgICogQHJldHVybnMgZGV2aWNlSWQgaWYgZm91bmQgaW4gdGhlIG1lZGlhU3RyZWFtVHJhY2tcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldERldmljZUlkRnJvbU1lZGlhU3RyZWFtVHJhY2soXG4gICAgbWVkaWFTdHJlYW1UcmFjazogTWVkaWFTdHJlYW1UcmFja1xuICApOiBhbnkge1xuICAgIGlmIChcbiAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0U2V0dGluZ3MgJiZcbiAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0U2V0dGluZ3MoKSAmJlxuICAgICAgbWVkaWFTdHJlYW1UcmFjay5nZXRTZXR0aW5ncygpLmRldmljZUlkXG4gICAgKSB7XG4gICAgICByZXR1cm4gbWVkaWFTdHJlYW1UcmFjay5nZXRTZXR0aW5ncygpLmRldmljZUlkO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBtZWRpYVN0cmVhbVRyYWNrLmdldENvbnN0cmFpbnRzICYmXG4gICAgICBtZWRpYVN0cmVhbVRyYWNrLmdldENvbnN0cmFpbnRzKCkgJiZcbiAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0Q29uc3RyYWludHMoKS5kZXZpY2VJZFxuICAgICkge1xuICAgICAgY29uc3QgZGV2aWNlSWRPYmo6IGFueSA9IG1lZGlhU3RyZWFtVHJhY2suZ2V0Q29uc3RyYWludHMoKS5kZXZpY2VJZDtcblxuICAgICAgcmV0dXJuIFdlYmNhbUNvbXBvbmVudC5nZXRWYWx1ZUZyb21Db25zdHJhaW5ET01TdHJpbmcoZGV2aWNlSWRPYmopO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmllcyB0byBoYXJ2ZXN0IHRoZSBmYWNpbmdNb2RlIGZyb20gdGhlIGdpdmVuIG1lZGlhU3RyZWFtVHJhY2sgb2JqZWN0LlxuICAgKiBCcm93c2VycyBwb3B1bGF0ZSB0aGlzIG9iamVjdCBkaWZmZXJlbnRseTsgdGhpcyBtZXRob2QgdHJpZXMgc29tZSBkaWZmZXJlbnQgYXBwcm9hY2hlc1xuICAgKiB0byByZWFkIHRoZSB2YWx1ZS5cbiAgICogQHBhcmFtIG1lZGlhU3RyZWFtVHJhY2tcbiAgICogQHJldHVybnMgZmFjaW5nTW9kZSBpZiBmb3VuZCBpbiB0aGUgbWVkaWFTdHJlYW1UcmFja1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RmFjaW5nTW9kZUZyb21NZWRpYVN0cmVhbVRyYWNrKFxuICAgIG1lZGlhU3RyZWFtVHJhY2s6IE1lZGlhU3RyZWFtVHJhY2tcbiAgKTogYW55IHtcbiAgICBpZiAobWVkaWFTdHJlYW1UcmFjaykge1xuICAgICAgaWYgKFxuICAgICAgICBtZWRpYVN0cmVhbVRyYWNrLmdldFNldHRpbmdzICYmXG4gICAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0U2V0dGluZ3MoKSAmJlxuICAgICAgICBtZWRpYVN0cmVhbVRyYWNrLmdldFNldHRpbmdzKCkuZmFjaW5nTW9kZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBtZWRpYVN0cmVhbVRyYWNrLmdldFNldHRpbmdzKCkuZmFjaW5nTW9kZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0Q29uc3RyYWludHMgJiZcbiAgICAgICAgbWVkaWFTdHJlYW1UcmFjay5nZXRDb25zdHJhaW50cygpICYmXG4gICAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0Q29uc3RyYWludHMoKS5mYWNpbmdNb2RlXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZmFjaW5nTW9kZUNvbnN0cmFpbnQ6IGFueSA9XG4gICAgICAgICAgbWVkaWFTdHJlYW1UcmFjay5nZXRDb25zdHJhaW50cygpLmZhY2luZ01vZGU7XG4gICAgICAgIHJldHVybiBXZWJjYW1Db21wb25lbnQuZ2V0VmFsdWVGcm9tQ29uc3RyYWluRE9NU3RyaW5nKFxuICAgICAgICAgIGZhY2luZ01vZGVDb25zdHJhaW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbWVkaWFTdHJlYW1UcmFjayBjbGFpbXMgaXRzZWxmIGFzIHVzZXIgZmFjaW5nXG4gICAqIEBwYXJhbSBtZWRpYVN0cmVhbVRyYWNrXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpc1VzZXJGYWNpbmcobWVkaWFTdHJlYW1UcmFjazogTWVkaWFTdHJlYW1UcmFjayk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZhY2luZ01vZGU6IHN0cmluZyA9XG4gICAgICBXZWJjYW1Db21wb25lbnQuZ2V0RmFjaW5nTW9kZUZyb21NZWRpYVN0cmVhbVRyYWNrKG1lZGlhU3RyZWFtVHJhY2spO1xuICAgIHJldHVybiBmYWNpbmdNb2RlID8gJ3VzZXInID09PSBmYWNpbmdNb2RlLnRvTG93ZXJDYXNlKCkgOiBmYWxzZTtcbiAgfVxuICBsYW5kc2NhcGUgPSB0cnVlO1xuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHZhbHVlIGZyb20gdGhlIGdpdmVuIENvbnN0cmFpbkRPTVN0cmluZ1xuICAgKiBAcGFyYW0gY29uc3RyYWluRE9NU3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRWYWx1ZUZyb21Db25zdHJhaW5ET01TdHJpbmcoY29uc3RyYWluRE9NU3RyaW5nOiBhbnkpOiBhbnkge1xuICAgIGlmIChjb25zdHJhaW5ET01TdHJpbmcpIHtcbiAgICAgIGlmIChjb25zdHJhaW5ET01TdHJpbmcgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhjb25zdHJhaW5ET01TdHJpbmcpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgQXJyYXkuaXNBcnJheShjb25zdHJhaW5ET01TdHJpbmcpICYmXG4gICAgICAgIEFycmF5KGNvbnN0cmFpbkRPTVN0cmluZykubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoY29uc3RyYWluRE9NU3RyaW5nWzBdKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnN0cmFpbkRPTVN0cmluZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGNvbnN0cmFpbkRPTVN0cmluZ1snZXhhY3QnXSkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoY29uc3RyYWluRE9NU3RyaW5nWydleGFjdCddKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zdHJhaW5ET01TdHJpbmdbJ2lkZWFsJ10pIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGNvbnN0cmFpbkRPTVN0cmluZ1snaWRlYWwnXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlc2l6ZVN0YWdlKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICB0aGlzLnVwZGF0ZWNhbnZhc1NpemUoKTtcbiAgICAgIHRoaXMuZHJhd1JlY3RhbmdsZSgpO1xuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLnZpZGVvUmVhZHkubmV4dCh0cnVlKTtcbiAgICB9LCAxMCk7XG4gIH1cblxuICBnZXQgY2FudmFzSGVpZ2h0KCkge1xuICAgIGNvbnN0IGxhbmRzY2FwZSA9IHRoaXMud2lkdGggPiB0aGlzLmhlaWdodDtcbiAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvU2l6ZS53aWR0aCAvIHRoaXMudmlkZW9TaXplLmhlaWdodDtcbiAgICBpZiAoIWxhbmRzY2FwZSkge1xuICAgICAgcmV0dXJuIHRoaXMud2lkdGggKiBhc3BlY3Q7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhlaWdodDtcbiAgfVxuICB1cGRhdGVjYW52YXNTaXplKCkge1xuICAgIGNvbnNvbGUubG9nKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICBjb25zdCBsYW5kc2NhcGUgPSB0aGlzLndpZHRoID4gdGhpcy5oZWlnaHQ7XG4gICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1NpemUud2lkdGggLyB0aGlzLnZpZGVvU2l6ZS5oZWlnaHQ7XG5cbiAgICBsZXQgd2lkdGggPSB0aGlzLndpZHRoO1xuICAgIGxldCBoZWlnaHQgPSB0aGlzLmhlaWdodDtcblxuICAgIGlmIChsYW5kc2NhcGUpIHtcbiAgICAgIGhlaWdodCA9IHdpZHRoIC8gYXNwZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWlnaHQgPSB3aWR0aCAvIGFzcGVjdDtcbiAgICB9XG5cbiAgICBpZiAoaGVpZ2h0ID4gdGhpcy5oZWlnaHQpIHtcbiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgd2lkdGggPSB0aGlzLmhlaWdodCAqIGFzcGVjdDtcbiAgICB9XG5cbiAgICB0aGlzLmNhbnZhc1NpemUgPSB7IHdpZHRoOiBNYXRoLnJvdW5kKHdpZHRoKSwgaGVpZ2h0OiBNYXRoLnJvdW5kKGhlaWdodCkgfTtcblxuICAgIGNvbnNvbGUubG9nKHRoaXMuY2FudmFzU2l6ZSwgdGhpcy52aWRlb1NpemUpO1xuXG4gICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgIHRoaXMudmlkZW8ubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRoaXMuY2FudmFzU2l6ZS5oZWlnaHQpO1xuICAgICAgdGhpcy52aWRlby5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB0aGlzLmNhbnZhc1NpemUud2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy52aWRlb1NpemUud2lkdGggPiB0aGlzLnZpZGVvU2l6ZS5oaWdodCkge1xuICAgICAgICB0aGlzLnZpZGVvLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCB0aGlzLmNhbnZhc1NpemUuaGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmlkZW8ubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgdGhpcy5jYW52YXNTaXplLndpZHRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRyYXdSZWN0YW5nbGUoKTtcblxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFdvcmtlcigpIHtcbiAgICBpZiAodHlwZW9mIFdvcmtlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ld1xuXG4gICAgICBpZiAodGhpcy50eXBlICE9PSAnc2VsZmllJykge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW3dvcmtlcnRleHRdLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pO1xuXG4gICAgICAgICAgdmFyIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBXb3JrZXIodXJsKTtcbiAgICAgICAgICB0aGlzLndvcmtlci5vbm1lc3NhZ2UgPSAoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhLmJhc2U2NCkge1xuICAgICAgICAgICAgICBkYXRhLnR5cGUgPT0gJ2RhdGEnO1xuICAgICAgICAgICAgICB0aGlzLmltYWdlSGFuZGxlci5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR1cFdvcmtlcigpO1xuXG4gICAgaWYgKHRoaXMuaW1hZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLl9fc3Vicyh0aGlzLmltYWdlSGFuZGxlcikuc3Vic2NyaWJlKChyZXNwKSA9PiB7XG4gICAgICAgIGlmIChyZXNwLnR5cGUgPT09ICdzdG9wJykge1xuICAgICAgICAgIHRoaXMud29ya2VyPy5wb3N0TWVzc2FnZSh7IHR5cGU6ICdzdG9wJyB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX19zdWJzKHRoaXMuYnJlYWtwb2ludE9ic2VydmVyXG4gICAgICAub2JzZXJ2ZShbQnJlYWtwb2ludHMuSGFuZHNldFBvcnRyYWl0LCBCcmVha3BvaW50cy5IYW5kc2V0TGFuZHNjYXBlXSkpXG4gICAgICAuc3Vic2NyaWJlKChzdGF0ZTogQnJlYWtwb2ludFN0YXRlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBsYXRmb3JtLklPUyB8fCB0aGlzLnBsYXRmb3JtLkFORFJPSUQpIHtcbiAgICAgICAgICAvLyB0aGlzLmxhbmRzY2FwZSA9IHN0YXRlLmJyZWFrcG9pbnRzW0JyZWFrcG9pbnRzLkhhbmRzZXRMYW5kc2NhcGVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vYmlsZSA9IHRoaXMucGxhdGZvcm0uSU9TO1xuICAgICAgICBpZiAoc3RhdGUubWF0Y2hlcyAmJiBtb2JpbGUpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZWNhbnZhc1NpemUoKTtcbiAgICAgICAgICB0aGlzLmRyYXdSZWN0YW5nbGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgaWYgKHRoaXMuc3dpdGNoQ2FtZXJhKSB7XG4gICAgICBpZiAodGhpcy5zd2l0Y2hDYW1lcmFTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zd2l0Y2hDYW1lcmFTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3Vic2NyaWJlIHRvIGV2ZW50cyBmcm9tIHRoaXMgT2JzZXJ2YWJsZSB0byBzd2l0Y2ggdmlkZW8gZGV2aWNlXG4gICAgICB0aGlzLnN3aXRjaENhbWVyYVN1YnNjcmlwdGlvbiA9IHRoaXMuc3dpdGNoQ2FtZXJhLnN1YnNjcmliZShcbiAgICAgICAgKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICB0aGlzLnN3aXRjaFRvVmlkZW9JbnB1dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5kZXRlY3RBdmFpbGFibGVEZXZpY2VzKClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gc3RhcnQgdmlkZW9cblxuICAgICAgICBpZiAodGhpcy5jYW5TdGFydCkge1xuICAgICAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0lucHV0KCcnKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5pbml0RXJyb3IubmV4dCg8V2ViY2FtSW5pdEVycm9yPnsgbWVzc2FnZTogZXJyIH0pO1xuICAgICAgICAvLyBmYWxsYmFjazogc3RpbGwgdHJ5IHRvIGxvYWQgd2ViY2FtLCBldmVuIGlmIGRldmljZSBlbnVtZXJhdGlvbiBmYWlsZWRcbiAgICAgICAgaWYgKHRoaXMuY2FuU3RhcnQpIHtcbiAgICAgICAgICB0aGlzLnN3aXRjaFRvVmlkZW9JbnB1dCgnJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2FuU3RhcnQgPSBmYWxzZTtcbiAgICB0aGlzLm5hdGl2ZVZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgIHRoaXMuZGVzdHJveWVkLmVtaXQodHJ1ZSk7XG4gICAgdGhpcy5zdG9wTWVkaWFUcmFja3MoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbVN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLnNodXRkb3duID0gdHJ1ZTtcblxuICAgIC8vIHNodXQgZG93biB3b3JrZXJcbiAgICBpZiAodGhpcy5pbWFnZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMuaW1hZ2VIYW5kbGVyLm5leHQoeyB0eXBlOiAnc3RvcCcgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmF0aXZlVmlkZW9FbGVtZW50LnNyY09iamVjdCkge1xuICAgICAgKCh0aGlzLm5hdGl2ZVZpZGVvRWxlbWVudCBhcyBIVE1MVmlkZW9FbGVtZW50KS5zcmNPYmplY3QgYXMgTWVkaWFTdHJlYW0pXG4gICAgICAgIC5nZXRUcmFja3MoKVxuICAgICAgICAuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5uYXRpdmVWaWRlb0VsZW1lbnQuc3JjT2JqZWN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl9fZGVzdHJveSgpO1xuXG4gICAgLy8gdGhpcy5uYXRpdmVWaWRlb0VsZW1lbnQuc3JjID0gbnVsbDtcbiAgICAvLyB0aGlzLm5hdGl2ZVZpZGVvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB0YWtlU2VsZmllKCkge1xuICAgIGNvbnN0IF92aWRlbyA9IHRoaXMubmF0aXZlVmlkZW9FbGVtZW50O1xuXG4gICAgY29uc3QgbWltZVR5cGU6IHN0cmluZyA9IHRoaXMuaW1hZ2VUeXBlXG4gICAgICA/IHRoaXMuaW1hZ2VUeXBlXG4gICAgICA6IFdlYmNhbUNvbXBvbmVudC5ERUZBVUxUX0lNQUdFX1RZUEU7XG5cbiAgICBsZXQgX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy90aGlzLmNhbnZhc1NuYXBzaG90Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMudmlkZW9TaXplO1xuICAgIGNvbnNvbGUubG9nKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgY29uc3QgeyBwYWRkaW5nLCB0b3AsIHJXaWR0aCwgckhlaWdodCB9ID0gdGhpcy5zbmFwUmVjdGFuZ2xlO1xuICAgIF9jYW52YXMud2lkdGggPSByV2lkdGg7XG4gICAgX2NhbnZhcy5oZWlnaHQgPSBySGVpZ2h0O1xuXG4gICAgY29uc3QgY3R4OiBhbnkgPSBfY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgYWxwaGE6IGZhbHNlLFxuICAgICAgcG93ZXJQcmVmZXJlbmNlOiAnaGlnaC1wZXJmb3JtYW5jZScsXG4gICAgICBhbnRpYWxpYXM6IGZhbHNlLFxuICAgICAgZGVwdGg6IGZhbHNlLFxuICAgICAgZGVzeW5jaHJvbml6ZWQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHguZHJhd0ltYWdlKFxuICAgICAgICBfdmlkZW8sXG4gICAgICAgIHBhZGRpbmcsXG4gICAgICAgIHRvcCxcbiAgICAgICAgcldpZHRoLFxuICAgICAgICBySGVpZ2h0LFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICByV2lkdGgsXG4gICAgICAgIHJIZWlnaHRcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGltZ0FzVXJsOiBhbnkgPSBfY2FudmFzLnRvRGF0YVVSTChtaW1lVHlwZSwgMSk7XG5cbiAgICAgIHRoaXMuaW1hZ2VDYXB0dXJlLmVtaXQoXG4gICAgICAgIG5ldyBXZWJjYW1JbWFnZShpbWdBc1VybCwgbWltZVR5cGUsIG5ldyBJbWFnZURhdGEoMSwgMSksIG51bGwpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHdlYmNhbSdzIHZpZXcgYW5kIGVtaXRzIHRoZSBpbWFnZSBhcyBhbiBldmVudFxuICAgKi9cblxuICBwdWJsaWMgdGFrZVNuYXBzaG90KHRpbWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGUgPT09ICdzZWxmaWUnKSB7XG4gICAgICB0aGlzLnRha2VTZWxmaWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFja1Byb2Nlc3Nvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgY2FudmFzU21hbFNpemUgPSAzODQ7XG5cbiAgICAgIGNvbnN0IF92aWRlbyA9IHRoaXMubmF0aXZlVmlkZW9FbGVtZW50O1xuXG4gICAgICBjb25zdCBtaW1lVHlwZTogc3RyaW5nID0gdGhpcy5pbWFnZVR5cGVcbiAgICAgICAgPyB0aGlzLmltYWdlVHlwZVxuICAgICAgICA6IFdlYmNhbUNvbXBvbmVudC5ERUZBVUxUX0lNQUdFX1RZUEU7XG5cbiAgICAgIGxldCBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvL3RoaXMuY2FudmFzU25hcHNob3QubmF0aXZlRWxlbWVudDtcblxuICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLnZpZGVvU2l6ZTtcblxuICAgICAgX2NhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgX2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgIGNvbnN0IGN0eDogYW55ID0gX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgICAgYWxwaGE6IGZhbHNlLFxuICAgICAgICBwb3dlclByZWZlcmVuY2U6ICdoaWdoLXBlcmZvcm1hbmNlJyxcbiAgICAgICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICAgICAgZGVwdGg6IGZhbHNlLFxuICAgICAgICBkZXN5bmNocm9uaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gbmVlZHMgYW4gaW5pdGlhbCBzaXplXG4gICAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzU21hbFNpemU7XG4gICAgICBjYW52YXMud2lkdGggPSBjYW52YXNTbWFsU2l6ZTtcblxuICAgICAgY29uc3QgY3R4TzogYW55ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgICBhbHBoYTogZmFsc2UsXG4gICAgICAgIHBvd2VyUHJlZmVyZW5jZTogJ2hpZ2gtcGVyZm9ybWFuY2UnLFxuICAgICAgICBhbnRpYWxpYXM6IGZhbHNlLFxuICAgICAgICBkZXB0aDogZmFsc2UsXG4gICAgICAgIGRlc3luY2hyb25pemVkOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChjdHggJiYgY3R4Tykge1xuICAgICAgICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG5cbiAgICAgICAgY3R4LmRyYXdJbWFnZShfdmlkZW8sIDAsIDApO1xuICAgICAgICBjdHhPLmRyYXdJbWFnZShfdmlkZW8sIDAsIDAsIGNhbnZhc1NtYWxTaXplLCBjYW52YXNTbWFsU2l6ZSk7XG5cbiAgICAgICAgY29uc3QgaW1EYXRhOiBhbnkgPSBjdHguZ2V0SW1hZ2VEYXRhKFxuICAgICAgICAgIDAsXG4gICAgICAgICAgMCxcbiAgICAgICAgICB0aGlzLnZpZGVvU2l6ZS53aWR0aCxcbiAgICAgICAgICB0aGlzLnZpZGVvU2l6ZS5oZWlnaHRcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCByZXNpemUgPSBjYW52YXMudG9EYXRhVVJMKG1pbWVUeXBlLCAxKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBkaWZmID0gY3VycmVudFRpbWUgLSB0aW1lO1xuXG4gICAgICAgIGNvbnN0IGRlbGF5ID0gZGlmZiA+IDEwMCA/IDAgOiAxMDAgLSBkaWZmO1xuXG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmltYWdlQ2FwdHVyZS5lbWl0KG5ldyBXZWJjYW1JbWFnZSgnJywgbWltZVR5cGUsIGltRGF0YSwgcmVzaXplKSk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZSgpIHt9XG5cbiAgcmVzaXplSW1hZ2UoYmFzZTY0ZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBsZXQgY2FudmFzOiBhbnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgY29uc3QgbWF4X3NpemUgPSAzODQ7XG4gICAgICBsZXQgaW1hZ2U6IGFueSA9IG5ldyBJbWFnZSgpO1xuXG4gICAgICBpbWFnZS5zcmMgPSBiYXNlNjRkYXRhO1xuICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBsZXQgd2lkdGggPSBpbWFnZS53aWR0aDtcbiAgICAgICAgbGV0IGhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuICAgICAgICBpZiAod2lkdGggPCBoZWlnaHQpIHtcbiAgICAgICAgICBoZWlnaHQgKj0gbWF4X3NpemUgLyB3aWR0aDtcbiAgICAgICAgICB3aWR0aCA9IG1heF9zaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdpZHRoICo9IG1heF9zaXplIC8gaGVpZ2h0O1xuICAgICAgICAgIGhlaWdodCA9IG1heF9zaXplO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAvLyBjdHgucm90YXRlKCg5MCAqIE1hdGguUEkpIC8gMTgwKTtcbiAgICAgICAgICAvLyBjdHgudHJhbnNsYXRlKDAsIC1jYW52YXMud2lkdGgpO1xuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIDM4NCwgMzg0KTtcblxuICAgICAgICAgIG9ic2VydmVyLm5leHQoY2FudmFzLnRvRGF0YVVSTCgpKTtcbiAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIDEsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKHsgdHlwZTogJ2dlbmVyaWMgZXJyb3InIH0pO1xuICAgICAgICB9XG4gICAgICAgIGltYWdlID0gbnVsbDtcbiAgICAgICAgY2FudmFzID0gbnVsbDtcbiAgICAgIH07XG4gICAgICBpbWFnZS5vbmVycm9yID0gKGU6IGFueSkgPT4ge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoZXMgdG8gdGhlIG5leHQvcHJldmlvdXMgdmlkZW8gZGV2aWNlXG4gICAqIEBwYXJhbSBmb3J3YXJkXG4gICAqL1xuICBwdWJsaWMgcm90YXRlVmlkZW9JbnB1dChmb3J3YXJkOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuYXZhaWxhYmxlVmlkZW9JbnB1dHMgJiYgdGhpcy5hdmFpbGFibGVWaWRlb0lucHV0cy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBpbmNyZW1lbnQ6IG51bWJlciA9IGZvcndhcmRcbiAgICAgICAgPyAxXG4gICAgICAgIDogdGhpcy5hdmFpbGFibGVWaWRlb0lucHV0cy5sZW5ndGggLSAxO1xuICAgICAgY29uc3QgbmV4dElucHV0SW5kZXggPVxuICAgICAgICAodGhpcy5hY3RpdmVWaWRlb0lucHV0SW5kZXggKyBpbmNyZW1lbnQpICVcbiAgICAgICAgdGhpcy5hdmFpbGFibGVWaWRlb0lucHV0cy5sZW5ndGg7XG4gICAgICB0aGlzLnN3aXRjaFRvVmlkZW9JbnB1dChcbiAgICAgICAgdGhpcy5hdmFpbGFibGVWaWRlb0lucHV0c1tuZXh0SW5wdXRJbmRleF0uZGV2aWNlSWRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaGVzIHRoZSBjYW1lcmEtdmlldyB0byB0aGUgc3BlY2lmaWVkIHZpZGVvIGRldmljZVxuICAgKi9cbiAgcHVibGljIHN3aXRjaFRvVmlkZW9JbnB1dChkZXZpY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gaWYoZGV2aWNlSWQpe1xuICAgIHRoaXMudmlkZW9Jbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RvcE1lZGlhVHJhY2tzKCk7XG4gICAgdGhpcy5pbml0V2ViY2FtKGRldmljZUlkLCB0aGlzLnZpZGVvT3B0aW9ucyk7XG4gICAgLy8gfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50LWhhbmRsZXIgZm9yIHZpZGVvIHJlc2l6ZSBldmVudC5cbiAgICogVHJpZ2dlcnMgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIHNvIHRoYXQgbmV3IHZpZGVvIGRpbWVuc2lvbnMgZ2V0IGFwcGxpZWRcbiAgICovXG4gIHB1YmxpYyB2aWRlb1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICAvLyBoZXJlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uXG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpZGVvV2lkdGgoKSB7XG4gICAgY29uc3QgdmlkZW9SYXRpbyA9IHRoaXMuZ2V0VmlkZW9Bc3BlY3RSYXRpbygpO1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCAqIHZpZGVvUmF0aW8pO1xuICB9XG5cbiAgcHVibGljIGdldCB2aWRlb0hlaWdodCgpIHtcbiAgICBjb25zdCB2aWRlb1JhdGlvID0gdGhpcy5nZXRWaWRlb0FzcGVjdFJhdGlvKCk7XG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMuaGVpZ2h0LCB0aGlzLndpZHRoIC8gdmlkZW9SYXRpbyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpZGVvU3R5bGVDbGFzc2VzKCkge1xuICAgIGxldCBjbGFzc2VzOiBzdHJpbmcgPSAnJztcblxuICAgIGlmICh0aGlzLmlzTWlycm9ySW1hZ2UoKSkge1xuICAgICAgY2xhc3NlcyArPSAnbWlycm9yZWQgJztcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3Nlcy50cmltKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hdGl2ZVZpZGVvRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy52aWRlby5uYXRpdmVFbGVtZW50O1xuICB9XG4gIC8vIHB1YmxpYyBnZXQgc21hbGxWaWRlb0VsZW1lbnQoKSB7XG4gIC8vICAgcmV0dXJuIHRoaXMudmlkZW9TbWFsbDtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2aWRlbyBhc3BlY3QgcmF0aW8gb2YgdGhlIGFjdGl2ZSB2aWRlbyBzdHJlYW1cbiAgICovXG4gIHByaXZhdGUgZ2V0VmlkZW9Bc3BlY3RSYXRpbygpOiBudW1iZXIge1xuICAgIC8vIGNhbGN1bGF0ZSByYXRpbyBmcm9tIHZpZGVvIGVsZW1lbnQgZGltZW5zaW9ucyBpZiBwcmVzZW50XG4gICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcy5uYXRpdmVWaWRlb0VsZW1lbnQ7XG4gICAgaWYgKFxuICAgICAgdmlkZW9FbGVtZW50LnZpZGVvV2lkdGggJiZcbiAgICAgIHZpZGVvRWxlbWVudC52aWRlb1dpZHRoID4gMCAmJlxuICAgICAgdmlkZW9FbGVtZW50LnZpZGVvSGVpZ2h0ICYmXG4gICAgICB2aWRlb0VsZW1lbnQudmlkZW9IZWlnaHQgPiAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gdmlkZW9FbGVtZW50LnZpZGVvV2lkdGggLyB2aWRlb0VsZW1lbnQudmlkZW9IZWlnaHQ7XG4gICAgfVxuXG4gICAgLy8gbm90aGluZyBwcmVzZW50IC0gY2FsY3VsYXRlIHJhdGlvIGJhc2VkIG9uIHdpZHRoL2hlaWdodCBwYXJhbXNcbiAgICByZXR1cm4gdGhpcy53aWR0aCAvIHRoaXMuaGVpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTaXplKCkge1xuICAgIGNvbnN0IHRyYWNrOiBNZWRpYVN0cmVhbVRyYWNrIHwgdW5kZWZpbmVkID1cbiAgICAgIHRoaXMubWVkaWFTdHJlYW0/LmdldFRyYWNrcygpWzBdO1xuXG4gICAgaWYgKHRyYWNrKSB7XG4gICAgICBsZXQgZGVzaXJlZDogYW55ID0ge1xuICAgICAgICB3aWR0aDoge1xuICAgICAgICAgIGlkZWFsOiAwLFxuICAgICAgICB9LFxuICAgICAgICBoZWlnaHQ6IHtcbiAgICAgICAgICBpZGVhbDogMCxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyAgZmFjaW5nTW9kZTondXNlcicsXG4gICAgICAgIGZyYW1lUmF0ZTogeyBtaW46IDIwLCBpZGVhbDogMjQsIG1heDogMjQgfSxcbiAgICAgIH07XG4gICAgICBpZiAodHlwZW9mIHRyYWNrLmdldENhcGFiaWxpdGllcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRyYWNrLmdldENhcGFiaWxpdGllcygpO1xuICAgICAgICBkZXNpcmVkID0ge1xuICAgICAgICAgIHdpZHRoOiB7XG4gICAgICAgICAgICBpZGVhbDogdGhpcy5sYW5kc2NhcGUgJiYgdGhpcy5pc01vYmlsZSA/IGhlaWdodD8ubWF4IDogd2lkdGg/Lm1heCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlaWdodDoge1xuICAgICAgICAgICAgaWRlYWw6IHRoaXMubGFuZHNjYXBlICYmIHRoaXMuaXNNb2JpbGUgPyB3aWR0aD8ubWF4IDogaGVpZ2h0Py5tYXgsXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8vICBmYWNpbmdNb2RlOid1c2VyJyxcbiAgICAgICAgICBmcmFtZVJhdGU6IHsgbWluOiAyMCwgaWRlYWw6IDI0LCBtYXg6IDI0IH0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXNpcmVkID0ge1xuICAgICAgICAgIHdpZHRoOiB7XG4gICAgICAgICAgICBpZGVhbDogMTkyMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlaWdodDoge1xuICAgICAgICAgICAgaWRlYWw6IDEwODAsXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8vICBmYWNpbmdNb2RlOid1c2VyJyxcbiAgICAgICAgICBmcmFtZVJhdGU6IHsgbWluOiAyMCwgaWRlYWw6IDMwLCBtYXg6IDMxIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbi8vICBkZXNpcmVkLmhlaWdodC5pZGVhbCA9IDEwMDA7XG4vLyAgZGVzaXJlZC53aWR0aC5pZGVhbCA9IDEwMDA7XG5cbiAgICAgIGlmIChkZXNpcmVkLmhlaWdodC5pZGVhbCAmJiBkZXNpcmVkLmhlaWdodC5pZGVhbCA+PSAxNjAwKSB7XG4gICAgICAgIGRlc2lyZWQuaGVpZ2h0LmlkZWFsID0gMTYwMDtcbiAgICAgICAgZGVzaXJlZC53aWR0aC5pZGVhbCA9IDE2MDA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBsYXRmb3JtLkFORFJPSUQpIHtcbiAgICAgICAgLy9kZXNpcmVkLndpZHRoLmlkZWFsID0gMjE2MDtcbiAgICAgICAgLy9kZXNpcmVkLmhlaWdodC5pZGVhbCA9IDIxNjA7XG4gICAgICAgIC8vIGlmICghdGhpcy5sYW5kc2NhcGUpIHtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICBkZXNpcmVkLndpZHRoLmlkZWFsID0gd2lkdGg/Lm1heDtcbiAgICAgICAgLy8gICBkZXNpcmVkLmhlaWdodC5pZGVhbCA9IGhlaWdodD8ubWF4O1xuICAgICAgICAvLyB9XG4gICAgICB9XG5cbiAgICAgIHRyYWNrLmFwcGx5Q29uc3RyYWludHMoZGVzaXJlZCk7XG5cbiAgICAgIC8vdHJhY2suZ2V0U2V0dGluZ3MoKS5mYWNpbmdNb2RlIT09J3VzZXInO1xuXG4gICAgICB0aGlzLnZpZGVvU2l6ZSA9IHtcbiAgICAgICAgaGVpZ2h0OiB0aGlzLmxhbmRzY2FwZVxuICAgICAgICAgID8gdHJhY2suZ2V0U2V0dGluZ3MoKS5oZWlnaHRcbiAgICAgICAgICA6IHRyYWNrLmdldFNldHRpbmdzKCkud2lkdGgsXG4gICAgICAgIHdpZHRoOiB0aGlzLmxhbmRzY2FwZVxuICAgICAgICAgID8gdHJhY2suZ2V0U2V0dGluZ3MoKS53aWR0aFxuICAgICAgICAgIDogdHJhY2suZ2V0U2V0dGluZ3MoKS5oZWlnaHQsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRTdHJlYW1UcmFjayhzdHJlYW06IE1lZGlhU3RyZWFtKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5nZXRWaWRlb1RyYWNrcygpWzBdO1xuICB9XG5cbiAgZ2V0VHJhY2tTZXR0aW5ncygpIHt9XG5cbiAgYWNjZXNWaWRlb1RyYWNrKHZpZGVvVHJhY2tDb25zdHJhaW50czogTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IGFueSB7XG4gICAgcmV0dXJuIGZyb20oXG4gICAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh2aWRlb1RyYWNrQ29uc3RyYWludHMpXG4gICAgKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChzdHJlYW06IE1lZGlhU3RyZWFtKSA9PiB7XG4gICAgICAgIC8vIGRlZmF1bHQgcmVzb2x1dGlvbiAxMjgweDcyMCwgY2hlY2sgbWF4IHJlc29sdXRpb25cblxuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0U3RyZWFtVHJhY2soc3RyZWFtKTtcblxuICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSB0cmFjay5nZXRDYXBhYmlsaXRpZXMoKTtcblxuICAgICAgICBjb25zdCB7IGZhY2luZ01vZGUsIGhlaWdodCwgd2lkdGggfSA9IGNhcGFiaWxpdGllcztcblxuICAgICAgICBjb25zdCBkZXNpcmVkID0ge1xuICAgICAgICAgIHdpZHRoOiB7XG4gICAgICAgICAgICBtaW46IHRoaXMubGFuZHNjYXBlICYmIHRoaXMuaXNNb2JpbGUgPyBoZWlnaHQ/Lm1heCA6IHdpZHRoPy5tYXgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBoZWlnaHQ6IHtcbiAgICAgICAgICAvLyAgIGV4YWN0OiB0aGlzLmxhbmRzY2FwZSAmJiB0aGlzLmlzTW9iaWxlID8gd2lkdGg/Lm1heCA6IGhlaWdodD8ubWF4LFxuICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgLy8gZmFjaW5nTW9kZTonZW4nLFxuICAgICAgICAgIC8vIGZyYW1lUmF0ZTogeyBtaW46IDI1LCBpZGVhbDogMzAsIG1heDogMzEgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZ2V0IG1heCB3aWR0aFxuXG4gICAgICAgIGNvbnN0IHsgd2lkdGg6IHNXaWR0aCwgaGVpZ2h0OiBzSGVpZ2h0IH0gPSB0cmFjay5nZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIGlmIChkZXNpcmVkLndpZHRoLm1pbiAhPSBzV2lkdGgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc1ZpZGVvVHJhY2soeyB2aWRlbzogZGVzaXJlZCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIHRoaXMuYWNjZXNWaWRlb1RyYWNrKHt2aWRlbzpkZXNpcmVkfSk7XG5cbiAgICAgICAgcmV0dXJuIG9mKHN0cmVhbSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGRyYXdSZWN0YW5nbGUoKSB7XG4gICAgY29uc3QgX2NhbnZhcyA9IHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBjdHggPSBfY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBfY2FudmFzLndpZHRoLCBfY2FudmFzLmhlaWdodCk7XG5cbiAgICAvLyBjdHguZHJhd0ltYWdlKF92aWRlbywgMCwgMCwgX2NhbnZhcy53aWR0aCwgX2NhbnZhcy5oZWlnaHQpO1xuXG4gICAgY29uc3QgeyBwYWRkaW5nLCB0b3AsIHJXaWR0aCwgckhlaWdodCB9ID0gdGhpcy5jYXJkUmVjdGFuZ2xlO1xuXG4gICAgY3R4LnN0cm9rZVN0eWxlID0gJ3JlZCc7XG5cbiAgICBjdHguc3Ryb2tlUmVjdChwYWRkaW5nLCB0b3AsIHJXaWR0aCwgckhlaWdodCk7XG4gIH1cblxuICBnZXRNYXhBdmFpbGFibGVSZXNvbHV0aW9uKCkge31cbiAgLyoqXG4gICAqIEluaXQgd2ViY2FtIGxpdmUgdmlld1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0V2ViY2FtKFxuICAgIGRldmljZUlkOiBzdHJpbmcsXG4gICAgdXNlclZpZGVvVHJhY2tDb25zdHJhaW50czogTWVkaWFUcmFja0NvbnN0cmFpbnRzXG4gICkge1xuICAgIGNvbnN0IF92aWRlbyA9IHRoaXMubmF0aXZlVmlkZW9FbGVtZW50O1xuICAgIC8vIGNvbnN0IHZpZGVvU3RyZWFtZXIgPSB0aGlzLnZpZGVvU3RyZWFtZXIubmF0aXZlRWxlbWVudDtcbiAgICAvLyBjb25zdCB2aWRlb1NtYWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICBpZiAobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyAmJiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSkge1xuICAgICAgLy8gbWVyZ2UgZGV2aWNlSWQgLT4gdXNlclZpZGVvVHJhY2tDb25zdHJhaW50c1xuICAgICAgY29uc3QgdmlkZW9UcmFja0NvbnN0cmFpbnRzID1cbiAgICAgICAgV2ViY2FtQ29tcG9uZW50LmdldE1lZGlhQ29uc3RyYWludHNGb3JEZXZpY2UoXG4gICAgICAgICAgZGV2aWNlSWQsXG4gICAgICAgICAgdXNlclZpZGVvVHJhY2tDb25zdHJhaW50c1xuICAgICAgICApO1xuXG4gICAgICAvLyAvLyBpZiAoZGV2aWNlSWQpIHtcbiAgICAgIC8vIHRoaXMuYWNjZXNWaWRlb1RyYWNrKHsgdmlkZW86IHZpZGVvVHJhY2tDb25zdHJhaW50cyB9KS5zdWJzY3JpYmUoXG4gICAgICAvLyAgIChzdHJlYW06IE1lZGlhU3RyZWFtKSA9PiB7XG4gICAgICAvLyAgICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgICAnVkFMSUQgU0VUVElOR1MnLFxuICAgICAgLy8gICAgICAgc3RyZWFtLmdldFZpZGVvVHJhY2tzKClbMF0uZ2V0U2V0dGluZ3MoKVxuICAgICAgLy8gICAgICk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vICk7XG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5wbGF0Zm9ybS5BTkRST0lEKSB7XG4gICAgICAgIHZpZGVvVHJhY2tDb25zdHJhaW50cy53aWR0aCA9IDE2MDA7XG4gICAgICAgIHZpZGVvVHJhY2tDb25zdHJhaW50cy5oZWlnaHQgPSAxNjAwO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb25zdHJhaW50cyA9IHtcbiAgICAgICAgZXhhY3Q6IGRldmljZUlkLFxuICAgICAgICB3aWR0aDogeyBtaW46IDQ4MCwgaWRlYWw6IDEyODAgfSxcbiAgICAgICAgaGVpZ2h0OiB7IG1pbjogNDgwLCBpZGVhbDogNzIwIH0sXG4gICAgICAgIC8vIGFzcGVjdFJhdGlvOiAzIC8gMixcbiAgICAgICAgZnJhbWVSYXRlOiB7IG1pbjogMjAgfSxcbiAgICAgIH07XG5cbiAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXNcbiAgICAgICAgLmdldFVzZXJNZWRpYSg8TWVkaWFTdHJlYW1Db25zdHJhaW50cz57IHZpZGVvOiB2aWRlb1RyYWNrQ29uc3RyYWludHMgfSlcbiAgICAgICAgLnRoZW4oKHN0cmVhbTogTWVkaWFTdHJlYW0pID0+IHtcbiAgICAgICAgICB0aGlzLm1lZGlhU3RyZWFtID0gc3RyZWFtO1xuICAgICAgICAgIF92aWRlby5zcmNPYmplY3QgPSBzdHJlYW07XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZWNhbnZhc1NpemUoKTtcblxuICAgICAgICAgIF92aWRlby5wbGF5KCk7XG5cbiAgICAgICAgICBfdmlkZW8ub25wbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVDYW1lcmEoc3RyZWFtKTtcbiAgICAgICAgICAgIHRoaXMuZHJhd1JlY3RhbmdsZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgIHRoaXMuaW5pdEVycm9yLm5leHQoPFdlYmNhbUluaXRFcnJvcj57XG4gICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIG1lZGlhU3RyZWFtRXJyb3I6IGVycixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdEVycm9yLm5leHQoPFdlYmNhbUluaXRFcnJvcj57XG4gICAgICAgIG1lc3NhZ2U6ICdDYW5ub3QgcmVhZCBVc2VyTWVkaWEgZnJvbSBNZWRpYURldmljZXMuJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc01vYmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybS5BTkRST0lEIHx8IHRoaXMucGxhdGZvcm0uSU9TO1xuICB9XG5cbiAgZ2V0IGNhcmRSZWN0YW5nbGUoKSB7XG4gICAgY29uc3QgX2NhbnZhcyA9IHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZG9jU2l6ZSA9IHRoaXMudHlwZSA9PT0gJ3NlbGZpZScgPyAxIDogODYgLyA1NTtcblxuICAgIGNvbnNvbGUubG9nKF9jYW52YXMud2lkdGgsIF9jYW52YXMuaGVpZ2h0KTtcbiAgICBsZXQgcGFkZGluZyA9IDEwO1xuXG4gICAgbGV0IHJXaWR0aCA9IF9jYW52YXMud2lkdGggLSAyICogcGFkZGluZztcbiAgICBsZXQgckhlaWdodCA9IHJXaWR0aCAvIGRvY1NpemU7XG4gICAgbGV0IHRvcCA9IChfY2FudmFzLmhlaWdodCAtIHJIZWlnaHQpIC8gMjtcblxuICAgIGlmICgoIXRoaXMuaXNNb2JpbGUgJiYgX2NhbnZhcy53aWR0aCE9PSBfY2FudmFzLmhlaWdodCkpIHtcbiAgICAgIHBhZGRpbmcgPSA0MDtcblxuICAgICAgckhlaWdodCA9IF9jYW52YXMuaGVpZ2h0IC0gMiAqIHBhZGRpbmc7XG4gICAgICByV2lkdGggPSBySGVpZ2h0ICogZG9jU2l6ZTtcbiAgICAgIHRvcCA9IChfY2FudmFzLmhlaWdodCAtIHJIZWlnaHQpIC8gMjtcbiAgICAgIHBhZGRpbmcgPSAoX2NhbnZhcy53aWR0aCAtIHJXaWR0aCkgLyAyO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKHBhZGRpbmcsIHRvcCwgcldpZHRoLCBySGVpZ2h0KTtcblxuICAgIHJldHVybiB7IHBhZGRpbmcsIHRvcCwgcldpZHRoLCBySGVpZ2h0IH07XG4gIH1cbiAgZ2V0IHNuYXBSZWN0YW5nbGUoKSB7XG4gICAgY29uc3QgX2NhbnZhcyA9IHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBhciA9IHRoaXMudmlkZW9TaXplLndpZHRoIC8gX2NhbnZhcy53aWR0aDtcblxuICAgIGxldCB7IHBhZGRpbmcsIHRvcCwgcldpZHRoLCBySGVpZ2h0IH0gPSB0aGlzLmNhcmRSZWN0YW5nbGU7XG5cbiAgICBwYWRkaW5nID0gcGFkZGluZyAqIGFyO1xuICAgIHRvcCA9IHRvcCAqIGFyO1xuICAgIHJXaWR0aCA9IHJXaWR0aCAqIGFyO1xuICAgIHJIZWlnaHQgPSBySGVpZ2h0ICogYXI7XG5cbiAgICByZXR1cm4geyBwYWRkaW5nLCB0b3AsIHJXaWR0aCwgckhlaWdodCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBY3RpdmVDYW1lcmEoc3RyZWFtOiBhbnkpIHtcbiAgICB0aGlzLnZpZGVvUmVhZHkubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zaG93VmlkZW8gPSBmYWxzZTtcbiAgICB0aGlzLmFjdGl2ZVZpZGVvU2V0dGluZ3MgPSBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKVswXS5nZXRTZXR0aW5ncygpO1xuICAgIGNvbnN0IGFjdGl2ZURldmljZUlkOiBzdHJpbmcgPVxuICAgICAgV2ViY2FtQ29tcG9uZW50LmdldERldmljZUlkRnJvbU1lZGlhU3RyZWFtVHJhY2soXG4gICAgICAgIHN0cmVhbS5nZXRWaWRlb1RyYWNrcygpWzBdXG4gICAgICApO1xuXG4gICAgY29uc3QgdmlkZW9UcmFjayA9IHN0cmVhbS5nZXRUcmFja3MoKVswXTtcbiAgICB0aGlzLnRyYWNrU2V0dGluZ3MgPSB2aWRlb1RyYWNrLmdldFNldHRpbmdzKCk7XG5cbiAgICB0aGlzLmNhbWVyYVByb3ZpZGVyLmNhbWVyYVdhc1N3aXRjaGVkKGFjdGl2ZURldmljZUlkKTtcblxuICAgIHRoaXMuY2FtZXJhU3dpdGNoZWQubmV4dChhY3RpdmVEZXZpY2VJZCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc2l6ZVN0YWdlKCk7XG4gICAgICAgIHRoaXMuc2hvd1ZpZGVvID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWRlb1JlYWR5Lm5leHQodHJ1ZSk7XG5cbiAgICAgICAgaWYgKE1lZGlhU3RyZWFtVHJhY2tQcm9jZXNzb3IpIHtcbiAgICAgICAgICB0aGlzLnRyYWNrUHJvY2Vzc29yID0gbmV3IE1lZGlhU3RyZWFtVHJhY2tQcm9jZXNzb3IodmlkZW9UcmFjayk7XG4gICAgICAgICAgbGV0IGZyYW1lU3RyZWFtID0gdGhpcy50cmFja1Byb2Nlc3Nvci5yZWFkYWJsZTtcbiAgICAgICAgICBpZiAoIXRoaXMuc2h1dGRvd24pIHtcbiAgICAgICAgICAgIHRoaXMud29ya2VyPy5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzdGFydCcsXG5cbiAgICAgICAgICAgICAgICBmcmFtZVN0cmVhbTogZnJhbWVTdHJlYW0sXG4gICAgICAgICAgICAgICAgdHJhY2tTZXR0aW5nczogdGhpcy50cmFja1NldHRpbmdzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbZnJhbWVTdHJlYW1dXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0aXZlVmlkZW9UcmFjaygpOiBNZWRpYVN0cmVhbVRyYWNrIHwgYW55IHtcbiAgICByZXR1cm4gdGhpcy5tZWRpYVN0cmVhbSA/IHRoaXMubWVkaWFTdHJlYW0uZ2V0VmlkZW9UcmFja3MoKVswXSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGlzTWlycm9ySW1hZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdldEFjdGl2ZVZpZGVvVHJhY2soKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGZvciBleHBsaWNpdCBtaXJyb3Igb3ZlcnJpZGUgcGFyYW1ldGVyXG4gICAge1xuICAgICAgbGV0IG1pcnJvcjogc3RyaW5nID0gJ2F1dG8nO1xuICAgICAgaWYgKHRoaXMubWlycm9ySW1hZ2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1pcnJvckltYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG1pcnJvciA9IFN0cmluZyh0aGlzLm1pcnJvckltYWdlKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlYmNhbU1pcnJvclByb3BlcnRpZXNcbiAgICAgICAgICBpZiAodGhpcy5taXJyb3JJbWFnZS54KSB7XG4gICAgICAgICAgICBtaXJyb3IgPSB0aGlzLm1pcnJvckltYWdlLngudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChtaXJyb3IpIHtcbiAgICAgICAgY2FzZSAnYWx3YXlzJzpcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnbmV2ZXInOlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0OiBlbmFibGUgbWlycm9yaW5nIGlmIHdlYmNhbSBpcyB1c2VyIGZhY2luZ1xuICAgIHJldHVybiBXZWJjYW1Db21wb25lbnQuaXNVc2VyRmFjaW5nKHRoaXMuZ2V0QWN0aXZlVmlkZW9UcmFjaygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyBhbGwgYWN0aXZlIG1lZGlhIHRyYWNrcy5cbiAgICogVGhpcyBwcmV2ZW50cyB0aGUgd2ViY2FtIGZyb20gYmVpbmcgaW5kaWNhdGVkIGFzIGFjdGl2ZSxcbiAgICogZXZlbiBpZiBpdCBpcyBubyBsb25nZXIgdXNlZCBieSB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIHByaXZhdGUgc3RvcE1lZGlhVHJhY2tzKCkge1xuICAgIC8vIHRoaXMudmlkZW8ubmF0aXZlRWxlbWVudC5wYXVzZSgpO1xuICAgIGlmICh0aGlzLnZpZGVvLm5hdGl2ZUVsZW1lbnQuc3JjT2JqZWN0KSB7XG4gICAgICAoKHRoaXMudmlkZW8ubmF0aXZlRWxlbWVudCBhcyBIVE1MVmlkZW9FbGVtZW50KS5zcmNPYmplY3QgYXMgTWVkaWFTdHJlYW0pXG4gICAgICAgIC5nZXRUcmFja3MoKVxuICAgICAgICAuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgdGhpcy52aWRlby5uYXRpdmVFbGVtZW50LnNyY09iamVjdCA9IG51bGw7XG4gICAgICB0aGlzLnZpZGVvLm5hdGl2ZUVsZW1lbnQuc3JjID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWVkaWFTdHJlYW0gJiYgdGhpcy5tZWRpYVN0cmVhbS5nZXRUcmFja3MpIHtcbiAgICAgIC8vIGdldFRyYWNrcygpIHJldHVybnMgYWxsIG1lZGlhIHRyYWNrcyAodmlkZW8rYXVkaW8pXG5cbiAgICAgIHRoaXMubWVkaWFTdHJlYW1cbiAgICAgICAgLmdldFRyYWNrcygpXG4gICAgICAgIC5mb3JFYWNoKCh0cmFjazogTWVkaWFTdHJlYW1UcmFjaykgPT4gdHJhY2suc3RvcCgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmUgZnJvbSBhbGwgb3BlbiBzdWJzY3JpcHRpb25zXG4gICAqL1xuICBwcml2YXRlIHVuc3Vic2NyaWJlRnJvbVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMudHJpZ2dlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy50cmlnZ2VyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN3aXRjaENhbWVyYVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zd2l0Y2hDYW1lcmFTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYXZhaWxhYmxlIGlucHV0IGRldmljZXNcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0QXZhaWxhYmxlRGV2aWNlcygpOiBQcm9taXNlPE1lZGlhRGV2aWNlSW5mb1tdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIFdlYmNhbVV0aWwuZ2V0QXZhaWxhYmxlVmlkZW9JbnB1dHMoKS5zdWJzY3JpYmUoXG4gICAgICAgIChkZXZpY2VzOiBNZWRpYURldmljZUluZm9bXSkgPT4ge1xuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlVmlkZW9JbnB1dHMgPSBkZXZpY2VzO1xuICAgICAgICAgIHJlc29sdmUoZGV2aWNlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZVZpZGVvSW5wdXRzID0gW107XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3ZWJjYW0td3JhcHBlclwiPlxuICA8ZGl2PlxuICAgIDx2aWRlb1xuICAgICAgI3ZpZGVvXG4gICAgICBhdXRvcGxheVxuICAgICAgbXV0ZWRcbiAgICAgIHN0eWxlPVwiZGlzcGxheTogYmxvY2tcIlxuICAgICAgcGxheXNpbmxpbmVcblxuICAgID48L3ZpZGVvPlxuXG4gICAgPGRpdiBjbGFzcz1cInJlY3RhbmdsZVwiPlxuXG4gICAgICA8Y2FudmFzXG4gICAgICAgICNjYW52YXNcbiAgICAgICAgW25nU3R5bGVdPVwieyB2aXNpYmlsaXR5OiBzaG93VmlkZW8gPyAndmlzaWJsZScgOiAnaGlkZGVuJyB9XCJcbiAgICAgICAgW3dpZHRoXT1cImNhbnZhc1NpemUud2lkdGhcIlxuICAgICAgICBbaGVpZ2h0XT1cImNhbnZhc1NpemUuaGVpZ2h0XCJcbiAgICAgID48L2NhbnZhcz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
873
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zY2FuZG9jL3NyYy9jb3JlL2NvbXBvbmVudHMvd2ViY2FtL3dlYmNhbS93ZWJjYW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2NvcmUvY29tcG9uZW50cy93ZWJjYW0vd2ViY2FtL3dlYmNhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBeUIsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpELE9BQU8sRUFFTCxXQUFXLEdBRVosTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7O0FBU3JELE1BQU0sT0FBTyxlQUNYLFNBQVEsYUFBYTtJQXdIckIsWUFDUyxrQkFBc0MsRUFDdEMsUUFBa0IsRUFDakIsRUFBcUIsRUFDckIsSUFBWSxFQUVaLGNBQXdDO1FBRWhELEtBQUssRUFBRSxDQUFDO1FBUEQsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2pCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3JCLFNBQUksR0FBSixJQUFJLENBQVE7UUFFWixtQkFBYyxHQUFkLGNBQWMsQ0FBMEI7UUE5R2xELHFEQUFxRDtRQUNyQyxVQUFLLEdBQVcsR0FBRyxDQUFDO1FBQ3BDLHNEQUFzRDtRQUN0QyxXQUFNLEdBQVcsR0FBRyxDQUFDO1FBQ3JDLG1GQUFtRjtRQUNuRSxpQkFBWSxHQUMxQixlQUFlLENBQUMscUJBQXFCLENBQUM7UUFDeEMsdUhBQXVIO1FBQ3ZHLHNCQUFpQixHQUFZLElBQUksQ0FBQztRQUdsRCx5RkFBeUY7UUFDekUscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xELHFEQUFxRDtRQUNyQyxjQUFTLEdBQVcsZUFBZSxDQUFDLGtCQUFrQixDQUFDO1FBQ3ZFLGlGQUFpRjtRQUNqRSxpQkFBWSxHQUFXLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQztRQUU3RSwrREFBK0Q7UUFDOUMsaUJBQVksR0FDM0IsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUNsQyx5RkFBeUY7UUFDeEUsY0FBUyxHQUN4QixJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUN0Qyw4Q0FBOEM7UUFDN0IsZUFBVSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzNFLDJFQUEyRTtRQUMxRCxtQkFBYyxHQUM3QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBRVosZUFBVSxHQUN6QixJQUFJLFlBQVksRUFBVyxDQUFDO1FBQzlCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDUixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV6Qyw4QkFBOEI7UUFDdkIseUJBQW9CLEdBQXNCLEVBQUUsQ0FBQztRQUVwRCxpRUFBaUU7UUFDMUQscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBRXpDLGFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSzVDLG9EQUFvRDtRQUM1QywwQkFBcUIsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUczQyw2REFBNkQ7UUFDckQsZ0JBQVcsR0FBdUIsSUFBSSxDQUFDO1FBa0IvQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ1QsYUFBUSxHQUFHLElBQUksQ0FBQztRQUN4QixjQUFTLEdBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMvQyxlQUFVLEdBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztRQWdKL0MsY0FBUyxHQUFHLElBQUksQ0FBQztRQXZHZix1Q0FBdUM7UUFDdkMsb0JBQW9CO1FBQ3BCLDhCQUE4QjtRQUM5QiwrREFBK0Q7UUFDL0QsT0FBTztRQUNQLDRDQUE0QztRQUM1QyxnREFBZ0Q7UUFDaEQsT0FBTztRQUNQLHlCQUF5QjtRQUN6QixzQ0FBc0M7UUFDdEMsV0FBVztRQUNYLDBEQUEwRDtRQUMxRCxnRkFBZ0Y7UUFDaEYsSUFBSTtJQUNOLENBQUM7SUFwREQ7O09BRUc7SUFDSCxJQUNXLE9BQU8sQ0FBQyxPQUEyQjtRQUM1QyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDeEM7UUFFRCw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNwRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQVlELFFBQVE7UUFDUCwrQkFBK0I7UUFDOUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUEwQkQ7Ozs7O09BS0c7SUFDSyxNQUFNLENBQUMsNEJBQTRCLENBQ3pDLFFBQWdCLEVBQ2hCLHlCQUFnRDtRQUVoRCxNQUFNLE1BQU0sR0FBMEIseUJBQXlCO1lBQzdELENBQUMsQ0FBQyx5QkFBeUI7WUFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUMvQixJQUFJLFFBQVEsRUFBRTtZQUNaLE1BQU0sQ0FBQyxRQUFRLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7U0FDdkM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLCtCQUErQixDQUM1QyxnQkFBa0M7UUFFbEMsSUFDRSxnQkFBZ0IsQ0FBQyxXQUFXO1lBQzVCLGdCQUFnQixDQUFDLFdBQVcsRUFBRTtZQUM5QixnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQ3ZDO1lBQ0EsT0FBTyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDaEQ7YUFBTSxJQUNMLGdCQUFnQixDQUFDLGNBQWM7WUFDL0IsZ0JBQWdCLENBQUMsY0FBYyxFQUFFO1lBQ2pDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsRUFDMUM7WUFDQSxNQUFNLFdBQVcsR0FBUSxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFFcEUsT0FBTyxlQUFlLENBQUMsOEJBQThCLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDcEU7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLGlDQUFpQyxDQUM5QyxnQkFBa0M7UUFFbEMsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixJQUNFLGdCQUFnQixDQUFDLFdBQVc7Z0JBQzVCLGdCQUFnQixDQUFDLFdBQVcsRUFBRTtnQkFDOUIsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxFQUN6QztnQkFDQSxPQUFPLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQzthQUNsRDtpQkFBTSxJQUNMLGdCQUFnQixDQUFDLGNBQWM7Z0JBQy9CLGdCQUFnQixDQUFDLGNBQWMsRUFBRTtnQkFDakMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLENBQUMsVUFBVSxFQUM1QztnQkFDQSxNQUFNLG9CQUFvQixHQUN4QixnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQy9DLE9BQU8sZUFBZSxDQUFDLDhCQUE4QixDQUNuRCxvQkFBb0IsQ0FDckIsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssTUFBTSxDQUFDLFlBQVksQ0FBQyxnQkFBa0M7UUFDNUQsTUFBTSxVQUFVLEdBQ2QsZUFBZSxDQUFDLGlDQUFpQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdEUsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNsRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssTUFBTSxDQUFDLDhCQUE4QixDQUFDLGtCQUF1QjtRQUNuRSxJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLElBQUksa0JBQWtCLFlBQVksTUFBTSxFQUFFO2dCQUN4QyxPQUFPLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ25DO2lCQUFNLElBQ0wsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztnQkFDakMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDcEM7Z0JBQ0EsT0FBTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QztpQkFBTSxJQUFJLE9BQU8sa0JBQWtCLEtBQUssUUFBUSxFQUFFO2dCQUNqRCxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUMvQixPQUFPLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUM1QztxQkFBTSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUN0QyxPQUFPLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUM1QzthQUNGO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXO1FBQ1QsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzVELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxnQkFBZ0I7UUFDZix3Q0FBd0M7UUFDdkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBRTVELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUV6QixJQUFJLFNBQVMsRUFBRTtZQUNiLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO1NBQ3pCO2FBQU07WUFDTCxNQUFNLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQztTQUN6QjtRQUVELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDeEIsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDckIsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFFM0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2RTthQUFNO1lBQ0wsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3pFO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN2RTtTQUNGO1FBRUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXJCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7WUFDakMsZUFBZTtZQUVmLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO29CQUMvQixJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztvQkFFL0QsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7d0JBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTs0QkFFZixJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQzs0QkFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQzlCO29CQUNILENBQUMsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNoRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO29CQUN4QixJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2lCQUM1QztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0I7YUFDaEMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2FBQ3JFLFNBQVMsQ0FBQyxDQUFDLEtBQXNCLEVBQUUsRUFBRTtZQUNwQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFO2dCQUM5QyxvRUFBb0U7YUFDckU7WUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNqQyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksTUFBTSxFQUFFO2dCQUMzQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDdEI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtnQkFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzdDO1lBRUQsa0VBQWtFO1lBQ2xFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FDekQsQ0FBQyxLQUFhLEVBQUUsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FDRixDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsc0JBQXNCLEVBQUU7YUFDMUIsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNULGNBQWM7WUFFZCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM3QjtRQUNILENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFrQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELHdFQUF3RTtZQUN4RSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM3QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVyQixtQkFBbUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDMUM7UUFFRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGtCQUF1QyxDQUFDLFNBQXlCO2lCQUNyRSxTQUFTLEVBQUU7aUJBQ1gsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2pCLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLENBQUMsQ0FBQyxDQUFDO1lBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDMUM7UUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsc0NBQXNDO1FBQ3RDLDRDQUE0QztJQUM5QyxDQUFDO0lBRU8sVUFBVTtRQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFFdkMsTUFBTSxRQUFRLEdBQVcsSUFBSSxDQUFDLFNBQVM7WUFDckMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQ2hCLENBQUMsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUM7UUFFdkMsSUFBSSxPQUFPLEdBQXNCLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxvQ0FBb0M7UUFFdkcsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFDLDhCQUE4QjtRQUU3QixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM3RCxPQUFPLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUN2QixPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUV6QixNQUFNLEdBQUcsR0FBUSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtZQUN4QyxLQUFLLEVBQUUsS0FBSztZQUNaLGVBQWUsRUFBRSxrQkFBa0I7WUFDbkMsU0FBUyxFQUFFLEtBQUs7WUFDaEIsS0FBSyxFQUFFLEtBQUs7WUFDWixjQUFjLEVBQUUsSUFBSTtTQUNyQixDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsRUFBRTtZQUNQLEdBQUcsQ0FBQyxTQUFTLENBQ1gsTUFBTSxFQUNOLE9BQU8sRUFDUCxHQUFHLEVBQ0gsTUFBTSxFQUNOLE9BQU8sRUFDUCxDQUFDLEVBQ0QsQ0FBQyxFQUNELE1BQU0sRUFDTixPQUFPLENBQ1IsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXJELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNwQixJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FDL0QsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBRUksWUFBWSxDQUFDLElBQVk7UUFDOUIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQy9CLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztZQUUzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFFdkMsTUFBTSxRQUFRLEdBQVcsSUFBSSxDQUFDLFNBQVM7Z0JBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUztnQkFDaEIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQztZQUV2QyxJQUFJLE9BQU8sR0FBc0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG9DQUFvQztZQUV2RyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFFekMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDdEIsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFFeEIsTUFBTSxHQUFHLEdBQVEsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3hDLEtBQUssRUFBRSxLQUFLO2dCQUNaLGVBQWUsRUFBRSxrQkFBa0I7Z0JBQ25DLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixLQUFLLEVBQUUsS0FBSztnQkFDWixjQUFjLEVBQUUsSUFBSTthQUNyQixDQUFDLENBQUM7WUFFSCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsd0JBQXdCO1lBQ3pFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDO1lBRTlCLE1BQU0sSUFBSSxHQUFRLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO2dCQUN4QyxLQUFLLEVBQUUsS0FBSztnQkFDWixlQUFlLEVBQUUsa0JBQWtCO2dCQUNuQyxTQUFTLEVBQUUsS0FBSztnQkFDaEIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osY0FBYyxFQUFFLElBQUk7YUFDckIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7Z0JBRWxDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBRTdELE1BQU0sTUFBTSxHQUFRLEdBQUcsQ0FBQyxZQUFZLENBQ2xDLENBQUMsRUFDRCxDQUFDLEVBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUN0QixDQUFDO2dCQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUU3QyxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN6QyxNQUFNLElBQUksR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUVoQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7Z0JBRTFDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ3RFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDeEIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ1g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxNQUFNLEtBQUksQ0FBQztJQUVuQixXQUFXLENBQUMsVUFBZTtRQUN6QixPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakMsSUFBSSxNQUFNLEdBQVEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQztZQUNyQixJQUFJLEtBQUssR0FBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBRTdCLEtBQUssQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO2dCQUNsQixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUN4QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUUxQixJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUU7b0JBQ2xCLE1BQU0sSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO29CQUMzQixLQUFLLEdBQUcsUUFBUSxDQUFDO2lCQUNsQjtxQkFBTTtvQkFDTCxLQUFLLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQztvQkFDM0IsTUFBTSxHQUFHLFFBQVEsQ0FBQztpQkFDbkI7Z0JBQ0QsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUV2Qiw4QkFBOEI7Z0JBRTlCLElBQUksR0FBRyxFQUFFO29CQUNQLG9DQUFvQztvQkFDcEMsbUNBQW1DO29CQUNuQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFFckMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztvQkFDbEMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDM0I7cUJBQU07b0JBQ0wsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO2lCQUMzQztnQkFDRCxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUNiLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDaEIsQ0FBQyxDQUFDO1lBQ0YsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUN6QixRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGdCQUFnQixDQUFDLE9BQWdCO1FBQ3RDLElBQUksSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JFLE1BQU0sU0FBUyxHQUFXLE9BQU87Z0JBQy9CLENBQUMsQ0FBQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUN6QyxNQUFNLGNBQWMsR0FDbEIsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDO1lBQ25DLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FDbkQsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksa0JBQWtCLENBQUMsUUFBZ0I7UUFDeEMsZ0JBQWdCO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxJQUFJO0lBQ04sQ0FBQztJQUVEOzs7T0FHRztJQUNJLFdBQVc7UUFDaEIsMkNBQTJDO0lBQzdDLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsaUJBQWlCO1FBQzFCLElBQUksT0FBTyxHQUFXLEVBQUUsQ0FBQztRQUV6QixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUN4QixPQUFPLElBQUksV0FBVyxDQUFDO1NBQ3hCO1FBRUQsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQUNELG1DQUFtQztJQUNuQyw0QkFBNEI7SUFDNUIsSUFBSTtJQUVKOztPQUVHO0lBQ0ssbUJBQW1CO1FBQ3pCLDJEQUEyRDtRQUMzRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDN0MsSUFDRSxZQUFZLENBQUMsVUFBVTtZQUN2QixZQUFZLENBQUMsVUFBVSxHQUFHLENBQUM7WUFDM0IsWUFBWSxDQUFDLFdBQVc7WUFDeEIsWUFBWSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQzVCO1lBQ0EsT0FBTyxZQUFZLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7U0FDM0Q7UUFFRCxpRUFBaUU7UUFDakUsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxLQUFLLEdBQ1QsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuQyxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksT0FBTyxHQUFRO2dCQUNqQixLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLENBQUM7aUJBQ1Q7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLEtBQUssRUFBRSxDQUFDO2lCQUNUO2dCQUVELHNCQUFzQjtnQkFDdEIsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUU7YUFDM0MsQ0FBQztZQUNGLElBQUksT0FBTyxLQUFLLENBQUMsZUFBZSxLQUFLLFVBQVUsRUFBRTtnQkFDL0MsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ2xELE9BQU8sR0FBRztvQkFDUixLQUFLLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUc7cUJBQ2xFO29CQUNELE1BQU0sRUFBRTt3QkFDTixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRztxQkFDbEU7b0JBRUQsc0JBQXNCO29CQUN0QixTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtpQkFDM0MsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLE9BQU8sR0FBRztvQkFDUixLQUFLLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLElBQUk7cUJBQ1o7b0JBQ0QsTUFBTSxFQUFFO3dCQUNOLEtBQUssRUFBRSxJQUFJO3FCQUNaO29CQUVELHNCQUFzQjtvQkFDdEIsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUU7aUJBQzNDLENBQUM7YUFDSDtZQUVQLGdDQUFnQztZQUNoQywrQkFBK0I7WUFFekIsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ3hELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2FBQzVCO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtnQkFDekIsNkJBQTZCO2dCQUM3Qiw4QkFBOEI7Z0JBQzlCLHlCQUF5QjtnQkFDekIsV0FBVztnQkFDWCxzQ0FBc0M7Z0JBQ3RDLHdDQUF3QztnQkFDeEMsSUFBSTthQUNMO1lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRWhDLDBDQUEwQztZQUUxQyxJQUFJLENBQUMsU0FBUyxHQUFHO2dCQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDcEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNO29CQUM1QixDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUs7Z0JBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDbkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLO29CQUMzQixDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU07YUFDL0IsQ0FBQztZQUVGLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQW1CO1FBQ2hDLE9BQU8sTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnQkFBZ0IsS0FBSSxDQUFDO0lBRXJCLGVBQWUsQ0FBQyxxQkFBNkM7UUFDM0QsT0FBTyxJQUFJLENBQ1QsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FDM0QsQ0FBQyxJQUFJLENBQ0osU0FBUyxDQUFDLENBQUMsTUFBbUIsRUFBRSxFQUFFO1lBQ2hDLG9EQUFvRDtZQUVwRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTFDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUU3QyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLENBQUM7WUFFbkQsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFO29CQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHO2lCQUNoRTtnQkFDRCxZQUFZO2dCQUNaLHVFQUF1RTtnQkFDdkUsS0FBSztnQkFDTCxtQkFBbUI7Z0JBQ25CLDhDQUE4QzthQUMvQyxDQUFDO1lBQ0YsZ0JBQWdCO1lBRWhCLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFL0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxNQUFNLEVBQUU7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ2pEO1lBRUQsK0NBQStDO1lBRS9DLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU8sYUFBYTtRQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUUxQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuRCw4REFBOEQ7UUFFOUQsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFFN0QsR0FBRyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFeEIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQseUJBQXlCLEtBQUksQ0FBQztJQUM5Qjs7T0FFRztJQUNLLFVBQVUsQ0FDaEIsUUFBZ0IsRUFDaEIseUJBQWdEO1FBRWhELE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ3ZDLDBEQUEwRDtRQUMxRCxzREFBc0Q7UUFDdEQsSUFBSSxTQUFTLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFO1lBQ2pFLDhDQUE4QztZQUM5QyxNQUFNLHFCQUFxQixHQUN6QixlQUFlLENBQUMsNEJBQTRCLENBQzFDLFFBQVEsRUFDUix5QkFBeUIsQ0FDMUIsQ0FBQztZQUVKLHFCQUFxQjtZQUNyQixvRUFBb0U7WUFDcEUsK0JBQStCO1lBQy9CLG1CQUFtQjtZQUNuQiwwQkFBMEI7WUFDMUIsaURBQWlEO1lBQ2pELFNBQVM7WUFDVCxNQUFNO1lBQ04sS0FBSztZQUNMLElBQUk7WUFDSixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFO2dCQUN6QixxQkFBcUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUNuQyxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ3JDO1lBRUQsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCLEtBQUssRUFBRSxRQUFRO2dCQUNmLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtnQkFDaEMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNoQyxzQkFBc0I7Z0JBQ3RCLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUU7YUFDdkIsQ0FBQztZQUVGLFNBQVMsQ0FBQyxZQUFZO2lCQUNuQixZQUFZLENBQXlCLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLENBQUM7aUJBQ3RFLElBQUksQ0FBQyxDQUFDLE1BQW1CLEVBQUUsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7Z0JBQzFCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO2dCQUUxQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUV4QixNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBRWQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBa0I7b0JBQ25DLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztvQkFDcEIsZ0JBQWdCLEVBQUUsR0FBRztpQkFDdEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQWtCO2dCQUNuQyxPQUFPLEVBQUUsMENBQTBDO2FBQ3BELENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFdEQsOENBQThDO1FBQzdDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUVqQixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDekMsSUFBSSxPQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUMvQixJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdkQsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUViLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDdkMsTUFBTSxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDM0IsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDeEM7UUFFRiw4Q0FBOEM7UUFFN0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFDRCxJQUFJLGFBQWE7UUFDZixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUUxQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBRWhELElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRTNELE9BQU8sR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2YsTUFBTSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDckIsT0FBTyxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBVztRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sY0FBYyxHQUNsQixlQUFlLENBQUMsK0JBQStCLENBQzdDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDM0IsQ0FBQztRQUVKLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUU5QyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXpDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUzQixJQUFJLHlCQUF5QixFQUFFO29CQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUkseUJBQXlCLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ2hFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO29CQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTt3QkFDbEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQ3RCOzRCQUNFLElBQUksRUFBRSxPQUFPOzRCQUViLFdBQVcsRUFBRSxXQUFXOzRCQUN4QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7eUJBQ2xDLEVBQ0QsQ0FBQyxXQUFXLENBQUMsQ0FDZCxDQUFDO3FCQUNIO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hFLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRTtZQUMvQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsK0NBQStDO1FBQy9DO1lBQ0UsSUFBSSxNQUFNLEdBQVcsTUFBTSxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDcEIsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFO29CQUN4QyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFDakQ7cUJBQU07b0JBQ0wseUJBQXlCO29CQUN6QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFO3dCQUN0QixNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7cUJBQzNDO2lCQUNGO2FBQ0Y7WUFFRCxRQUFRLE1BQU0sRUFBRTtnQkFDZCxLQUFLLFFBQVE7b0JBQ1gsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsS0FBSyxPQUFPO29CQUNWLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1NBQ0Y7UUFFRCxxREFBcUQ7UUFDckQsT0FBTyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxlQUFlO1FBQ3JCLG9DQUFvQztRQUNwQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRTtZQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWtDLENBQUMsU0FBeUI7aUJBQ3RFLFNBQVMsRUFBRTtpQkFDWCxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDakIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUM7WUFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7U0FDbkM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDbEQscURBQXFEO1lBRXJELElBQUksQ0FBQyxXQUFXO2lCQUNiLFNBQVMsRUFBRTtpQkFDWCxPQUFPLENBQUMsQ0FBQyxLQUF1QixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN2RDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLDRCQUE0QjtRQUNsQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDeEM7UUFDRCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNqQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDN0M7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxzQkFBc0I7UUFDNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxVQUFVLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQzVDLENBQUMsT0FBMEIsRUFBRSxFQUFFO2dCQUM3QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDO2dCQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxFQUNELENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ04sSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBcGhDYyxxQ0FBcUIsR0FBMEI7SUFDNUQsVUFBVSxFQUFFLGFBQWE7Q0FDekIsQ0FBQTtBQUNhLGtDQUFrQixHQUFXLFlBQWEsQ0FBQTtBQUMxQyxxQ0FBcUIsR0FBVyxDQUFFLENBQUE7NEdBYnRDLGVBQWU7Z0dBQWYsZUFBZSxnckNDbkM1QiwrYUFzQkE7MkZEYWEsZUFBZTtrQkFMM0IsU0FBUzsrQkFDRSxvQkFBb0I7NE5BV3JCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBUVUsRUFBRTtzQkFBakIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUVVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBRVUsTUFBTTtzQkFBckIsS0FBSztnQkFFVSxZQUFZO3NCQUEzQixLQUFLO2dCQUdVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFFVSxXQUFXO3NCQUExQixLQUFLO2dCQUVVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFFVSxTQUFTO3NCQUF4QixLQUFLO2dCQUVVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBR1csWUFBWTtzQkFBNUIsTUFBTTtnQkFHVSxTQUFTO3NCQUF6QixNQUFNO2dCQUdVLFVBQVU7c0JBQTFCLE1BQU07Z0JBRVUsY0FBYztzQkFBOUIsTUFBTTtnQkFHVSxVQUFVO3NCQUExQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBb0J1QyxLQUFLO3NCQUFsRCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRWtCLGFBQWE7c0JBQWxFLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFLRyxNQUFNO3NCQUFwRCxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR2tCLGNBQWM7c0JBQXBFLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVRLFlBQVk7c0JBQWhFLFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFjaEMsT0FBTztzQkFEakIsS0FBSztnQkFtQkcsWUFBWTtzQkFBcEIsS0FBSztnQkFHTixRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgV2ViY2FtSW5pdEVycm9yIH0gZnJvbSAnLi4vZG9tYWluL3dlYmNhbS1pbml0LWVycm9yJztcbmltcG9ydCB7IFdlYmNhbUltYWdlIH0gZnJvbSAnLi4vZG9tYWluL3dlYmNhbS1pbWFnZSc7XG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBXZWJjYW1VdGlsIH0gZnJvbSAnLi4vdXRpbC93ZWJjYW0udXRpbCc7XG5pbXBvcnQgeyBXZWJjYW1NaXJyb3JQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vZG9tYWluL3dlYmNhbS1taXJyb3ItcHJvcGVydGllcyc7XG5pbXBvcnQge1xuICBCcmVha3BvaW50T2JzZXJ2ZXIsXG4gIEJyZWFrcG9pbnRzLFxuICBCcmVha3BvaW50U3RhdGUsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgd29ya2VydGV4dCB9IGZyb20gJy4uLy4uLy4uL2FwcC53b3JrZXInO1xuaW1wb3J0IHsgTmd4U2NhbmRvY0NhbWVyYVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJvdmlkZXJzL2NhbWVyYS5wcm92aWRlcic7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFzZS5jb21wb25lbnQnO1xuXG5kZWNsYXJlIHZhciBNZWRpYVN0cmVhbVRyYWNrUHJvY2Vzc29yOiBhbnk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zY2FuZG9jLXdlYmNhbScsXG4gIHRlbXBsYXRlVXJsOiAnLi93ZWJjYW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93ZWJjYW0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgV2ViY2FtQ29tcG9uZW50XG4gIGV4dGVuZHMgQmFzZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICB0cmFja1Byb2Nlc3NvcjogYW55O1xuICB0cmFja1NldHRpbmdzOiBhbnk7XG5cbiAgQElucHV0KCkgaW1hZ2VIYW5kbGVyITogU3ViamVjdDxhbnk+O1xuXG4gIHByaXZhdGUgc3RhdGljIERFRkFVTFRfVklERU9fT1BUSU9OUzogTWVkaWFUcmFja0NvbnN0cmFpbnRzID0ge1xuICAgIGZhY2luZ01vZGU6ICdlbnZpcm9ubWVudCcsXG4gIH07XG4gIHByaXZhdGUgc3RhdGljIERFRkFVTFRfSU1BR0VfVFlQRTogc3RyaW5nID0gJ2ltYWdlL2pwZWcnO1xuICBwcml2YXRlIHN0YXRpYyBERUZBVUxUX0lNQUdFX1FVQUxJVFk6IG51bWJlciA9IDE7XG5cbiAgQElucHV0KCkgcHVibGljIGlkPzogYW55O1xuICBASW5wdXQoKSBwdWJsaWMgdHlwZT86ICdkb2N1bWVudCcgfCAnc2VsZmllJztcbiAgLyoqIERlZmluZXMgdGhlIG1heCB3aWR0aCBvZiB0aGUgd2ViY2FtIGFyZWEgaW4gcHggKi9cbiAgQElucHV0KCkgcHVibGljIHdpZHRoOiBudW1iZXIgPSA2NDA7XG4gIC8qKiBEZWZpbmVzIHRoZSBtYXggaGVpZ2h0IG9mIHRoZSB3ZWJjYW0gYXJlYSBpbiBweCAqL1xuICBASW5wdXQoKSBwdWJsaWMgaGVpZ2h0OiBudW1iZXIgPSA0ODA7XG4gIC8qKiBEZWZpbmVzIGJhc2UgY29uc3RyYWludHMgdG8gYXBwbHkgd2hlbiByZXF1ZXN0aW5nIHZpZGVvIHRyYWNrIGZyb20gVXNlck1lZGlhICovXG4gIEBJbnB1dCgpIHB1YmxpYyB2aWRlb09wdGlvbnM6IE1lZGlhVHJhY2tDb25zdHJhaW50cyA9XG4gICAgV2ViY2FtQ29tcG9uZW50LkRFRkFVTFRfVklERU9fT1BUSU9OUztcbiAgLyoqIEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgY2FtZXJhIHN3aXRjaC4gSWYgZW5hYmxlZCwgYSBzd2l0Y2ggaWNvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiBtdWx0aXBsZSBjYW1lcmFzIHdlcmUgZm91bmQgKi9cbiAgQElucHV0KCkgcHVibGljIGFsbG93Q2FtZXJhU3dpdGNoOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIFBhcmFtZXRlciB0byBjb250cm9sIGltYWdlIG1pcnJvcmluZyAoaS5lLiBmb3IgdXNlci1mYWNpbmcgY2FtZXJhKS4gW1wiYXV0b1wiLCBcImFsd2F5c1wiLCBcIm5ldmVyXCJdICovXG4gIEBJbnB1dCgpIHB1YmxpYyBtaXJyb3JJbWFnZT86IHN0cmluZyB8IFdlYmNhbU1pcnJvclByb3BlcnRpZXM7XG4gIC8qKiBGbGFnIHRvIGNvbnRyb2wgd2hldGhlciBhbiBJbWFnZURhdGEgb2JqZWN0IGlzIHN0b3JlZCBpbnRvIHRoZSBXZWJjYW1JbWFnZSBvYmplY3QuICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjYXB0dXJlSW1hZ2VEYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUaGUgaW1hZ2UgdHlwZSB0byB1c2Ugd2hlbiBjYXB0dXJpbmcgc25hcHNob3RzICovXG4gIEBJbnB1dCgpIHB1YmxpYyBpbWFnZVR5cGU6IHN0cmluZyA9IFdlYmNhbUNvbXBvbmVudC5ERUZBVUxUX0lNQUdFX1RZUEU7XG4gIC8qKiBUaGUgaW1hZ2UgcXVhbGl0eSB0byB1c2Ugd2hlbiBjYXB0dXJpbmcgc25hcHNob3RzIChudW1iZXIgYmV0d2VlbiAwIGFuZCAxKSAqL1xuICBASW5wdXQoKSBwdWJsaWMgaW1hZ2VRdWFsaXR5OiBudW1iZXIgPSBXZWJjYW1Db21wb25lbnQuREVGQVVMVF9JTUFHRV9RVUFMSVRZO1xuXG4gIC8qKiBFdmVudEVtaXR0ZXIgd2hpY2ggZmlyZXMgd2hlbiBhbiBpbWFnZSBoYXMgYmVlbiBjYXB0dXJlZCAqL1xuICBAT3V0cHV0KCkgcHVibGljIGltYWdlQ2FwdHVyZTogRXZlbnRFbWl0dGVyPFdlYmNhbUltYWdlPiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxXZWJjYW1JbWFnZT4oKTtcbiAgLyoqIEVtaXRzIGEgbWVkaWFFcnJvciBpZiB3ZWJjYW0gY2Fubm90IGJlIGluaXRpYWxpemVkIChlLmcuIG1pc3NpbmcgdXNlciBwZXJtaXNzaW9ucykgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBpbml0RXJyb3I6IEV2ZW50RW1pdHRlcjxXZWJjYW1Jbml0RXJyb3I+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPFdlYmNhbUluaXRFcnJvcj4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdGhlIHdlYmNhbSB2aWRlbyB3YXMgY2xpY2tlZCAqL1xuICBAT3V0cHV0KCkgcHVibGljIGltYWdlQ2xpY2s6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIHRoZSBhY3RpdmUgZGV2aWNlSWQgYWZ0ZXIgdGhlIGFjdGl2ZSB2aWRlbyBkZXZpY2Ugd2FzIHN3aXRjaGVkICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2FtZXJhU3dpdGNoZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAT3V0cHV0KCkgcHVibGljIHZpZGVvUmVhZHk6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBzaG93VmlkZW8gPSBmYWxzZTtcbiAgQE91dHB1dCgpIGRlc3Ryb3llZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKiogYXZhaWxhYmxlIHZpZGVvIGRldmljZXMgKi9cbiAgcHVibGljIGF2YWlsYWJsZVZpZGVvSW5wdXRzOiBNZWRpYURldmljZUluZm9bXSA9IFtdO1xuXG4gIC8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdmlkZW8gZGV2aWNlIGlzIHJlYWR5IHRvIGJlIHN3aXRjaGVkICovXG4gIHB1YmxpYyB2aWRlb0luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY2FudmFzRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAvKiogSWYgdGhlIE9ic2VydmFibGUgcmVwcmVzZW50ZWQgYnkgdGhpcyBzdWJzY3JpcHRpb24gZW1pdHMsIGFuIGltYWdlIHdpbGwgYmUgY2FwdHVyZWQgYW5kIGVtaXR0ZWQgdGhyb3VnaFxuICAgKiB0aGUgJ2ltYWdlQ2FwdHVyZScgRXZlbnRFbWl0dGVyICovXG4gIHByaXZhdGUgdHJpZ2dlclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgLyoqIEluZGV4IG9mIGFjdGl2ZSB2aWRlbyBpbiBhdmFpbGFibGVWaWRlb0lucHV0cyAqL1xuICBwcml2YXRlIGFjdGl2ZVZpZGVvSW5wdXRJbmRleDogbnVtYmVyID0gLTE7XG4gIC8qKiBTdWJzY3JpcHRpb24gdG8gc3dpdGNoQ2FtZXJhIGV2ZW50cyAqL1xuICBwcml2YXRlIHN3aXRjaENhbWVyYVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgLyoqIE1lZGlhU3RyZWFtIG9iamVjdCBpbiB1c2UgZm9yIHN0cmVhbWluZyBVc2VyTWVkaWEgZGF0YSAqL1xuICBwcml2YXRlIG1lZGlhU3RyZWFtOiBNZWRpYVN0cmVhbSB8IG51bGwgPSBudWxsO1xuICAvLyBPcmlnaW5hbCB2aWRlb1xuICBAVmlld0NoaWxkKCd2aWRlbycsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgdmlkZW86IGFueTtcbiAgLy8gQWRqdXN0ZWQgZm9yIFVJXG4gIEBWaWV3Q2hpbGQoJ3ZpZGVvU3RyZWFtZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHZpZGVvU3RyZWFtZXI6IGFueTtcblxuICAvL0BWaWV3Q2hpbGQoJ3ZpZGVvU21hbGwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHZpZGVvU21hbGw6IGFueTtcbiAgLy92aWRlb1NtYWxsOiBIVE1MVmlkZW9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgLyoqIENhbnZhcyBmb3IgVmlkZW8gU25hcHNob3RzICovXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgY2FudmFzOiBhbnk7XG5cbiAgLyoqIENhbnZhcyBmb3IgVmlkZW8gU25hcHNob3RzICovXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhc1NuYXBzaG90JywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBjYW52YXNTbmFwc2hvdDogYW55O1xuXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhc1Jlc2l6ZScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgY2FudmFzUmVzaXplOiBhbnk7XG4gIC8qKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBhY3RpdmUgdmlkZW8gc3RyZWFtICovXG4gIGFjdGl2ZVZpZGVvU2V0dGluZ3M6IGFueTtcblxuICBzaHV0ZG93biA9IGZhbHNlO1xuICBwcml2YXRlIGNhblN0YXJ0ID0gdHJ1ZTtcbiAgdmlkZW9TaXplOiBhbnkgPSB7IHdpZHRoOiAxOTIwLCBoZWlnaHQ6IDEwODAgfTtcbiAgY2FudmFzU2l6ZTogYW55ID0geyB3aWR0aDogMTI4MCwgaGVpZ2h0OiA3MjAgfTtcblxuICB3b3JrZXI/OiBXb3JrZXI7XG4gIC8qKlxuICAgKiBJZiB0aGUgZ2l2ZW4gT2JzZXJ2YWJsZSBlbWl0cywgYW4gaW1hZ2Ugd2lsbCBiZSBjYXB0dXJlZCBhbmQgZW1pdHRlZCB0aHJvdWdoICdpbWFnZUNhcHR1cmUnIEV2ZW50RW1pdHRlclxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB0cmlnZ2VyKHRyaWdnZXI6IE9ic2VydmFibGU8bnVtYmVyPikge1xuICAgIGlmICh0aGlzLnRyaWdnZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudHJpZ2dlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8vIFN1YnNjcmliZSB0byBldmVudHMgZnJvbSB0aGlzIE9ic2VydmFibGUgdG8gdGFrZSBzbmFwc2hvdHNcbiAgICB0aGlzLnRyaWdnZXJTdWJzY3JpcHRpb24gPSB0cmlnZ2VyLnN1YnNjcmliZSgodGltZSkgPT4ge1xuICAgICAgdGhpcy50YWtlU25hcHNob3QodGltZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGdpdmVuIE9ic2VydmFibGUgZW1pdHMsIHRoZSBhY3RpdmUgd2ViY2FtIHdpbGwgYmUgc3dpdGNoZWQgdG8gdGhlIG9uZSBpbmRpY2F0ZWQgYnkgdGhlIGVtaXR0ZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBzd2l0Y2hDYW1lcmEgSW5kaWNhdGVzIHdoaWNoIHdlYmNhbSB0byBzd2l0Y2ggdG9cbiAgICogICB0cnVlOiBjeWNsZSBmb3J3YXJkcyB0aHJvdWdoIGF2YWlsYWJsZSB3ZWJjYW1zXG4gICAqICAgZmFsc2U6IGN5Y2xlIGJhY2t3YXJkcyB0aHJvdWdoIGF2YWlsYWJsZSB3ZWJjYW1zXG4gICAqICAgc3RyaW5nOiBhY3RpdmF0ZSB0aGUgd2ViY2FtIHdpdGggdGhlIGdpdmVuIGlkXG4gICAqL1xuICBASW5wdXQoKSBzd2l0Y2hDYW1lcmE6IGFueTtcblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgb25SZXNpemUoKSB7XG4gICAvLyB0aGlzLnZpZGVvUmVhZHkubmV4dChmYWxzZSk7XG4gICAgdGhpcy5yZXNpemVTdGFnZSgpO1xuICB9XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlcixcbiAgICBwdWJsaWMgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxuXG4gICAgcHJpdmF0ZSBjYW1lcmFQcm92aWRlcjogTmd4U2NhbmRvY0NhbWVyYVByb3ZpZGVyXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gaWYgKHR5cGVvZiBXb3JrZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gICAvLyBDcmVhdGUgYSBuZXdcbiAgICAvLyAgIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcihcbiAgICAvLyAgICAgbmV3IFVSTCgnLi8uLi8uLi8uLi8uLi9hcHAvYXBwLndvcmtlcicsIGltcG9ydC5tZXRhLnVybClcbiAgICAvLyAgICk7XG4gICAgLy8gICB0aGlzLndvcmtlci5vbm1lc3NhZ2UgPSAoeyBkYXRhIH0pID0+IHtcbiAgICAvLyAgICAgY29uc29sZS5sb2coYHBhZ2UgZ290IG1lc3NhZ2U6ICR7ZGF0YX1gKTtcbiAgICAvLyAgIH07XG4gICAgLy8gICBjb25zb2xlLmxvZygnUE9TVCcpO1xuICAgIC8vICAgdGhpcy53b3JrZXIucG9zdE1lc3NhZ2UoJ2hlbGxvJyk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIC8vIFdlYiB3b3JrZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAgLy8gICAvLyBZb3Ugc2hvdWxkIGFkZCBhIGZhbGxiYWNrIHNvIHRoYXQgeW91ciBwcm9ncmFtIHN0aWxsIGV4ZWN1dGVzIGNvcnJlY3RseS5cbiAgICAvLyB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1lZGlhVHJhY2tDb25zdHJhaW50cyB0byByZXF1ZXN0IHN0cmVhbWluZyB0aGUgZ2l2ZW4gZGV2aWNlXG4gICAqIEBwYXJhbSBkZXZpY2VJZFxuICAgKiBAcGFyYW0gYmFzZU1lZGlhVHJhY2tDb25zdHJhaW50cyBiYXNlIGNvbnN0cmFpbnRzIHRvIG1lcmdlIGRldmljZUlkLWNvbnN0cmFpbnQgaW50b1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWVkaWFDb25zdHJhaW50c0ZvckRldmljZShcbiAgICBkZXZpY2VJZDogc3RyaW5nLFxuICAgIGJhc2VNZWRpYVRyYWNrQ29uc3RyYWludHM6IE1lZGlhVHJhY2tDb25zdHJhaW50c1xuICApOiBNZWRpYVRyYWNrQ29uc3RyYWludHMge1xuICAgIGNvbnN0IHJlc3VsdDogTWVkaWFUcmFja0NvbnN0cmFpbnRzID0gYmFzZU1lZGlhVHJhY2tDb25zdHJhaW50c1xuICAgICAgPyBiYXNlTWVkaWFUcmFja0NvbnN0cmFpbnRzXG4gICAgICA6IHRoaXMuREVGQVVMVF9WSURFT19PUFRJT05TO1xuICAgIGlmIChkZXZpY2VJZCkge1xuICAgICAgcmVzdWx0LmRldmljZUlkID0geyBleGFjdDogZGV2aWNlSWQgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIGhhcnZlc3QgdGhlIGRldmljZUlkIGZyb20gdGhlIGdpdmVuIG1lZGlhU3RyZWFtVHJhY2sgb2JqZWN0LlxuICAgKiBCcm93c2VycyBwb3B1bGF0ZSB0aGlzIG9iamVjdCBkaWZmZXJlbnRseTsgdGhpcyBtZXRob2QgdHJpZXMgc29tZSBkaWZmZXJlbnQgYXBwcm9hY2hlc1xuICAgKiB0byByZWFkIHRoZSBpZC5cbiAgICogQHBhcmFtIG1lZGlhU3RyZWFtVHJhY2tcbiAgICogQHJldHVybnMgZGV2aWNlSWQgaWYgZm91bmQgaW4gdGhlIG1lZGlhU3RyZWFtVHJhY2tcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldERldmljZUlkRnJvbU1lZGlhU3RyZWFtVHJhY2soXG4gICAgbWVkaWFTdHJlYW1UcmFjazogTWVkaWFTdHJlYW1UcmFja1xuICApOiBhbnkge1xuICAgIGlmIChcbiAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0U2V0dGluZ3MgJiZcbiAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0U2V0dGluZ3MoKSAmJlxuICAgICAgbWVkaWFTdHJlYW1UcmFjay5nZXRTZXR0aW5ncygpLmRldmljZUlkXG4gICAgKSB7XG4gICAgICByZXR1cm4gbWVkaWFTdHJlYW1UcmFjay5nZXRTZXR0aW5ncygpLmRldmljZUlkO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBtZWRpYVN0cmVhbVRyYWNrLmdldENvbnN0cmFpbnRzICYmXG4gICAgICBtZWRpYVN0cmVhbVRyYWNrLmdldENvbnN0cmFpbnRzKCkgJiZcbiAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0Q29uc3RyYWludHMoKS5kZXZpY2VJZFxuICAgICkge1xuICAgICAgY29uc3QgZGV2aWNlSWRPYmo6IGFueSA9IG1lZGlhU3RyZWFtVHJhY2suZ2V0Q29uc3RyYWludHMoKS5kZXZpY2VJZDtcblxuICAgICAgcmV0dXJuIFdlYmNhbUNvbXBvbmVudC5nZXRWYWx1ZUZyb21Db25zdHJhaW5ET01TdHJpbmcoZGV2aWNlSWRPYmopO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmllcyB0byBoYXJ2ZXN0IHRoZSBmYWNpbmdNb2RlIGZyb20gdGhlIGdpdmVuIG1lZGlhU3RyZWFtVHJhY2sgb2JqZWN0LlxuICAgKiBCcm93c2VycyBwb3B1bGF0ZSB0aGlzIG9iamVjdCBkaWZmZXJlbnRseTsgdGhpcyBtZXRob2QgdHJpZXMgc29tZSBkaWZmZXJlbnQgYXBwcm9hY2hlc1xuICAgKiB0byByZWFkIHRoZSB2YWx1ZS5cbiAgICogQHBhcmFtIG1lZGlhU3RyZWFtVHJhY2tcbiAgICogQHJldHVybnMgZmFjaW5nTW9kZSBpZiBmb3VuZCBpbiB0aGUgbWVkaWFTdHJlYW1UcmFja1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RmFjaW5nTW9kZUZyb21NZWRpYVN0cmVhbVRyYWNrKFxuICAgIG1lZGlhU3RyZWFtVHJhY2s6IE1lZGlhU3RyZWFtVHJhY2tcbiAgKTogYW55IHtcbiAgICBpZiAobWVkaWFTdHJlYW1UcmFjaykge1xuICAgICAgaWYgKFxuICAgICAgICBtZWRpYVN0cmVhbVRyYWNrLmdldFNldHRpbmdzICYmXG4gICAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0U2V0dGluZ3MoKSAmJlxuICAgICAgICBtZWRpYVN0cmVhbVRyYWNrLmdldFNldHRpbmdzKCkuZmFjaW5nTW9kZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBtZWRpYVN0cmVhbVRyYWNrLmdldFNldHRpbmdzKCkuZmFjaW5nTW9kZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0Q29uc3RyYWludHMgJiZcbiAgICAgICAgbWVkaWFTdHJlYW1UcmFjay5nZXRDb25zdHJhaW50cygpICYmXG4gICAgICAgIG1lZGlhU3RyZWFtVHJhY2suZ2V0Q29uc3RyYWludHMoKS5mYWNpbmdNb2RlXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZmFjaW5nTW9kZUNvbnN0cmFpbnQ6IGFueSA9XG4gICAgICAgICAgbWVkaWFTdHJlYW1UcmFjay5nZXRDb25zdHJhaW50cygpLmZhY2luZ01vZGU7XG4gICAgICAgIHJldHVybiBXZWJjYW1Db21wb25lbnQuZ2V0VmFsdWVGcm9tQ29uc3RyYWluRE9NU3RyaW5nKFxuICAgICAgICAgIGZhY2luZ01vZGVDb25zdHJhaW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbWVkaWFTdHJlYW1UcmFjayBjbGFpbXMgaXRzZWxmIGFzIHVzZXIgZmFjaW5nXG4gICAqIEBwYXJhbSBtZWRpYVN0cmVhbVRyYWNrXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpc1VzZXJGYWNpbmcobWVkaWFTdHJlYW1UcmFjazogTWVkaWFTdHJlYW1UcmFjayk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZhY2luZ01vZGU6IHN0cmluZyA9XG4gICAgICBXZWJjYW1Db21wb25lbnQuZ2V0RmFjaW5nTW9kZUZyb21NZWRpYVN0cmVhbVRyYWNrKG1lZGlhU3RyZWFtVHJhY2spO1xuICAgIHJldHVybiBmYWNpbmdNb2RlID8gJ3VzZXInID09PSBmYWNpbmdNb2RlLnRvTG93ZXJDYXNlKCkgOiBmYWxzZTtcbiAgfVxuICBsYW5kc2NhcGUgPSB0cnVlO1xuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHZhbHVlIGZyb20gdGhlIGdpdmVuIENvbnN0cmFpbkRPTVN0cmluZ1xuICAgKiBAcGFyYW0gY29uc3RyYWluRE9NU3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRWYWx1ZUZyb21Db25zdHJhaW5ET01TdHJpbmcoY29uc3RyYWluRE9NU3RyaW5nOiBhbnkpOiBhbnkge1xuICAgIGlmIChjb25zdHJhaW5ET01TdHJpbmcpIHtcbiAgICAgIGlmIChjb25zdHJhaW5ET01TdHJpbmcgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhjb25zdHJhaW5ET01TdHJpbmcpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgQXJyYXkuaXNBcnJheShjb25zdHJhaW5ET01TdHJpbmcpICYmXG4gICAgICAgIEFycmF5KGNvbnN0cmFpbkRPTVN0cmluZykubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoY29uc3RyYWluRE9NU3RyaW5nWzBdKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnN0cmFpbkRPTVN0cmluZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGNvbnN0cmFpbkRPTVN0cmluZ1snZXhhY3QnXSkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoY29uc3RyYWluRE9NU3RyaW5nWydleGFjdCddKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zdHJhaW5ET01TdHJpbmdbJ2lkZWFsJ10pIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGNvbnN0cmFpbkRPTVN0cmluZ1snaWRlYWwnXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlc2l6ZVN0YWdlKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICB0aGlzLnVwZGF0ZWNhbnZhc1NpemUoKTtcbiAgICAgIHRoaXMuZHJhd1JlY3RhbmdsZSgpO1xuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLnZpZGVvUmVhZHkubmV4dCh0cnVlKTtcbiAgICB9LCAxMCk7XG4gIH1cblxuICBnZXQgY2FudmFzSGVpZ2h0KCkge1xuICAgIGNvbnN0IGxhbmRzY2FwZSA9IHRoaXMud2lkdGggPiB0aGlzLmhlaWdodDtcbiAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvU2l6ZS53aWR0aCAvIHRoaXMudmlkZW9TaXplLmhlaWdodDtcbiAgICBpZiAoIWxhbmRzY2FwZSkge1xuICAgICAgcmV0dXJuIHRoaXMud2lkdGggKiBhc3BlY3Q7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhlaWdodDtcbiAgfVxuICB1cGRhdGVjYW52YXNTaXplKCkge1xuICAgLy8gY29uc29sZS5sb2codGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgIGNvbnN0IGxhbmRzY2FwZSA9IHRoaXMud2lkdGggPiB0aGlzLmhlaWdodDtcbiAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvU2l6ZS53aWR0aCAvIHRoaXMudmlkZW9TaXplLmhlaWdodDtcblxuICAgIGxldCB3aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgbGV0IGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG4gICAgaWYgKGxhbmRzY2FwZSkge1xuICAgICAgaGVpZ2h0ID0gd2lkdGggLyBhc3BlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlaWdodCA9IHdpZHRoIC8gYXNwZWN0O1xuICAgIH1cblxuICAgIGlmIChoZWlnaHQgPiB0aGlzLmhlaWdodCkge1xuICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgICB3aWR0aCA9IHRoaXMuaGVpZ2h0ICogYXNwZWN0O1xuICAgIH1cblxuICAgIHRoaXMuY2FudmFzU2l6ZSA9IHsgd2lkdGg6IE1hdGgucm91bmQod2lkdGgpLCBoZWlnaHQ6IE1hdGgucm91bmQoaGVpZ2h0KSB9O1xuXG4gICAgY29uc29sZS5sb2codGhpcy5jYW52YXNTaXplLCB0aGlzLnZpZGVvU2l6ZSk7XG5cbiAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgdGhpcy52aWRlby5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgdGhpcy5jYW52YXNTaXplLmhlaWdodCk7XG4gICAgICB0aGlzLnZpZGVvLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMuY2FudmFzU2l6ZS53aWR0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnZpZGVvU2l6ZS53aWR0aCA+IHRoaXMudmlkZW9TaXplLmhpZ2h0KSB7XG4gICAgICAgIHRoaXMudmlkZW8ubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRoaXMuY2FudmFzU2l6ZS5oZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52aWRlby5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB0aGlzLmNhbnZhc1NpemUud2lkdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZHJhd1JlY3RhbmdsZSgpO1xuXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwV29ya2VyKCkge1xuICAgIGlmICh0eXBlb2YgV29ya2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3XG5cbiAgICAgIGlmICh0aGlzLnR5cGUgIT09ICdzZWxmaWUnKSB7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbd29ya2VydGV4dF0sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG5cbiAgICAgICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuICAgICAgICAgIHRoaXMud29ya2VyID0gbmV3IFdvcmtlcih1cmwpO1xuICAgICAgICAgIHRoaXMud29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGEuYmFzZTY0KSB7XG5cbiAgICAgICAgICAgICAgZGF0YS50eXBlID09ICdkYXRhJztcbiAgICAgICAgICAgICAgdGhpcy5pbWFnZUhhbmRsZXIubmV4dChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dXBXb3JrZXIoKTtcblxuICAgIGlmICh0aGlzLmltYWdlSGFuZGxlcikge1xuICAgICAgdGhpcy5fX3N1YnModGhpcy5pbWFnZUhhbmRsZXIpLnN1YnNjcmliZSgocmVzcCkgPT4ge1xuICAgICAgICBpZiAocmVzcC50eXBlID09PSAnc3RvcCcpIHtcbiAgICAgICAgICB0aGlzLndvcmtlcj8ucG9zdE1lc3NhZ2UoeyB0eXBlOiAnc3RvcCcgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9fc3Vicyh0aGlzLmJyZWFrcG9pbnRPYnNlcnZlclxuICAgICAgLm9ic2VydmUoW0JyZWFrcG9pbnRzLkhhbmRzZXRQb3J0cmFpdCwgQnJlYWtwb2ludHMuSGFuZHNldExhbmRzY2FwZV0pKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdGU6IEJyZWFrcG9pbnRTdGF0ZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybS5JT1MgfHwgdGhpcy5wbGF0Zm9ybS5BTkRST0lEKSB7XG4gICAgICAgICAgLy8gdGhpcy5sYW5kc2NhcGUgPSBzdGF0ZS5icmVha3BvaW50c1tCcmVha3BvaW50cy5IYW5kc2V0TGFuZHNjYXBlXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2JpbGUgPSB0aGlzLnBsYXRmb3JtLklPUztcbiAgICAgICAgaWYgKHN0YXRlLm1hdGNoZXMgJiYgbW9iaWxlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVjYW52YXNTaXplKCk7XG4gICAgICAgICAgdGhpcy5kcmF3UmVjdGFuZ2xlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGlmICh0aGlzLnN3aXRjaENhbWVyYSkge1xuICAgICAgaWYgKHRoaXMuc3dpdGNoQ2FtZXJhU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc3dpdGNoQ2FtZXJhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN1YnNjcmliZSB0byBldmVudHMgZnJvbSB0aGlzIE9ic2VydmFibGUgdG8gc3dpdGNoIHZpZGVvIGRldmljZVxuICAgICAgdGhpcy5zd2l0Y2hDYW1lcmFTdWJzY3JpcHRpb24gPSB0aGlzLnN3aXRjaENhbWVyYS5zdWJzY3JpYmUoXG4gICAgICAgICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdGhpcy5zd2l0Y2hUb1ZpZGVvSW5wdXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZGV0ZWN0QXZhaWxhYmxlRGV2aWNlcygpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIHN0YXJ0IHZpZGVvXG5cbiAgICAgICAgaWYgKHRoaXMuY2FuU3RhcnQpIHtcbiAgICAgICAgICB0aGlzLnN3aXRjaFRvVmlkZW9JbnB1dCgnJyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdEVycm9yLm5leHQoPFdlYmNhbUluaXRFcnJvcj57IG1lc3NhZ2U6IGVyciB9KTtcbiAgICAgICAgLy8gZmFsbGJhY2s6IHN0aWxsIHRyeSB0byBsb2FkIHdlYmNhbSwgZXZlbiBpZiBkZXZpY2UgZW51bWVyYXRpb24gZmFpbGVkXG4gICAgICAgIGlmICh0aGlzLmNhblN0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5zd2l0Y2hUb1ZpZGVvSW5wdXQoJycpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNhblN0YXJ0ID0gZmFsc2U7XG4gICAgdGhpcy5uYXRpdmVWaWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICB0aGlzLmRlc3Ryb3llZC5lbWl0KHRydWUpO1xuICAgIHRoaXMuc3RvcE1lZGlhVHJhY2tzKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZUZyb21TdWJzY3JpcHRpb25zKCk7XG4gICAgdGhpcy5zaHV0ZG93biA9IHRydWU7XG5cbiAgICAvLyBzaHV0IGRvd24gd29ya2VyXG4gICAgaWYgKHRoaXMuaW1hZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLmltYWdlSGFuZGxlci5uZXh0KHsgdHlwZTogJ3N0b3AnIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hdGl2ZVZpZGVvRWxlbWVudC5zcmNPYmplY3QpIHtcbiAgICAgICgodGhpcy5uYXRpdmVWaWRlb0VsZW1lbnQgYXMgSFRNTFZpZGVvRWxlbWVudCkuc3JjT2JqZWN0IGFzIE1lZGlhU3RyZWFtKVxuICAgICAgICAuZ2V0VHJhY2tzKClcbiAgICAgICAgLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgdHJhY2suc3RvcCgpO1xuICAgICAgICB9KTtcbiAgICAgIHRoaXMubmF0aXZlVmlkZW9FbGVtZW50LnNyY09iamVjdCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fX2Rlc3Ryb3koKTtcblxuICAgIC8vIHRoaXMubmF0aXZlVmlkZW9FbGVtZW50LnNyYyA9IG51bGw7XG4gICAgLy8gdGhpcy5uYXRpdmVWaWRlb0VsZW1lbnQuc3JjT2JqZWN0ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdGFrZVNlbGZpZSgpIHtcbiAgICBjb25zdCBfdmlkZW8gPSB0aGlzLm5hdGl2ZVZpZGVvRWxlbWVudDtcblxuICAgIGNvbnN0IG1pbWVUeXBlOiBzdHJpbmcgPSB0aGlzLmltYWdlVHlwZVxuICAgICAgPyB0aGlzLmltYWdlVHlwZVxuICAgICAgOiBXZWJjYW1Db21wb25lbnQuREVGQVVMVF9JTUFHRV9UWVBFO1xuXG4gICAgbGV0IF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vdGhpcy5jYW52YXNTbmFwc2hvdC5uYXRpdmVFbGVtZW50O1xuXG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLnZpZGVvU2l6ZTtcbiAgIC8vIGNvbnNvbGUubG9nKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgY29uc3QgeyBwYWRkaW5nLCB0b3AsIHJXaWR0aCwgckhlaWdodCB9ID0gdGhpcy5zbmFwUmVjdGFuZ2xlO1xuICAgIF9jYW52YXMud2lkdGggPSByV2lkdGg7XG4gICAgX2NhbnZhcy5oZWlnaHQgPSBySGVpZ2h0O1xuXG4gICAgY29uc3QgY3R4OiBhbnkgPSBfY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgYWxwaGE6IGZhbHNlLFxuICAgICAgcG93ZXJQcmVmZXJlbmNlOiAnaGlnaC1wZXJmb3JtYW5jZScsXG4gICAgICBhbnRpYWxpYXM6IGZhbHNlLFxuICAgICAgZGVwdGg6IGZhbHNlLFxuICAgICAgZGVzeW5jaHJvbml6ZWQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBjdHguZHJhd0ltYWdlKFxuICAgICAgICBfdmlkZW8sXG4gICAgICAgIHBhZGRpbmcsXG4gICAgICAgIHRvcCxcbiAgICAgICAgcldpZHRoLFxuICAgICAgICBySGVpZ2h0LFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICByV2lkdGgsXG4gICAgICAgIHJIZWlnaHRcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGltZ0FzVXJsOiBhbnkgPSBfY2FudmFzLnRvRGF0YVVSTChtaW1lVHlwZSwgMSk7XG5cbiAgICAgIHRoaXMuaW1hZ2VDYXB0dXJlLmVtaXQoXG4gICAgICAgIG5ldyBXZWJjYW1JbWFnZShpbWdBc1VybCwgbWltZVR5cGUsIG5ldyBJbWFnZURhdGEoMSwgMSksIG51bGwpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHdlYmNhbSdzIHZpZXcgYW5kIGVtaXRzIHRoZSBpbWFnZSBhcyBhbiBldmVudFxuICAgKi9cblxuICBwdWJsaWMgdGFrZVNuYXBzaG90KHRpbWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGUgPT09ICdzZWxmaWUnKSB7XG4gICAgICB0aGlzLnRha2VTZWxmaWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFja1Byb2Nlc3Nvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgY2FudmFzU21hbFNpemUgPSAzODQ7XG5cbiAgICAgIGNvbnN0IF92aWRlbyA9IHRoaXMubmF0aXZlVmlkZW9FbGVtZW50O1xuXG4gICAgICBjb25zdCBtaW1lVHlwZTogc3RyaW5nID0gdGhpcy5pbWFnZVR5cGVcbiAgICAgICAgPyB0aGlzLmltYWdlVHlwZVxuICAgICAgICA6IFdlYmNhbUNvbXBvbmVudC5ERUZBVUxUX0lNQUdFX1RZUEU7XG5cbiAgICAgIGxldCBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvL3RoaXMuY2FudmFzU25hcHNob3QubmF0aXZlRWxlbWVudDtcblxuICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLnZpZGVvU2l6ZTtcblxuICAgICAgX2NhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgX2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgIGNvbnN0IGN0eDogYW55ID0gX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgICAgYWxwaGE6IGZhbHNlLFxuICAgICAgICBwb3dlclByZWZlcmVuY2U6ICdoaWdoLXBlcmZvcm1hbmNlJyxcbiAgICAgICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICAgICAgZGVwdGg6IGZhbHNlLFxuICAgICAgICBkZXN5bmNocm9uaXplZDogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gbmVlZHMgYW4gaW5pdGlhbCBzaXplXG4gICAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzU21hbFNpemU7XG4gICAgICBjYW52YXMud2lkdGggPSBjYW52YXNTbWFsU2l6ZTtcblxuICAgICAgY29uc3QgY3R4TzogYW55ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge1xuICAgICAgICBhbHBoYTogZmFsc2UsXG4gICAgICAgIHBvd2VyUHJlZmVyZW5jZTogJ2hpZ2gtcGVyZm9ybWFuY2UnLFxuICAgICAgICBhbnRpYWxpYXM6IGZhbHNlLFxuICAgICAgICBkZXB0aDogZmFsc2UsXG4gICAgICAgIGRlc3luY2hyb25pemVkOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChjdHggJiYgY3R4Tykge1xuICAgICAgICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG5cbiAgICAgICAgY3R4LmRyYXdJbWFnZShfdmlkZW8sIDAsIDApO1xuICAgICAgICBjdHhPLmRyYXdJbWFnZShfdmlkZW8sIDAsIDAsIGNhbnZhc1NtYWxTaXplLCBjYW52YXNTbWFsU2l6ZSk7XG5cbiAgICAgICAgY29uc3QgaW1EYXRhOiBhbnkgPSBjdHguZ2V0SW1hZ2VEYXRhKFxuICAgICAgICAgIDAsXG4gICAgICAgICAgMCxcbiAgICAgICAgICB0aGlzLnZpZGVvU2l6ZS53aWR0aCxcbiAgICAgICAgICB0aGlzLnZpZGVvU2l6ZS5oZWlnaHRcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCByZXNpemUgPSBjYW52YXMudG9EYXRhVVJMKG1pbWVUeXBlLCAxKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBkaWZmID0gY3VycmVudFRpbWUgLSB0aW1lO1xuXG4gICAgICAgIGNvbnN0IGRlbGF5ID0gZGlmZiA+IDEwMCA/IDAgOiAxMDAgLSBkaWZmO1xuXG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmltYWdlQ2FwdHVyZS5lbWl0KG5ldyBXZWJjYW1JbWFnZSgnJywgbWltZVR5cGUsIGltRGF0YSwgcmVzaXplKSk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZSgpIHt9XG5cbiAgcmVzaXplSW1hZ2UoYmFzZTY0ZGF0YTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBsZXQgY2FudmFzOiBhbnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgY29uc3QgbWF4X3NpemUgPSAzODQ7XG4gICAgICBsZXQgaW1hZ2U6IGFueSA9IG5ldyBJbWFnZSgpO1xuXG4gICAgICBpbWFnZS5zcmMgPSBiYXNlNjRkYXRhO1xuICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBsZXQgd2lkdGggPSBpbWFnZS53aWR0aDtcbiAgICAgICAgbGV0IGhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuICAgICAgICBpZiAod2lkdGggPCBoZWlnaHQpIHtcbiAgICAgICAgICBoZWlnaHQgKj0gbWF4X3NpemUgLyB3aWR0aDtcbiAgICAgICAgICB3aWR0aCA9IG1heF9zaXplO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdpZHRoICo9IG1heF9zaXplIC8gaGVpZ2h0O1xuICAgICAgICAgIGhlaWdodCA9IG1heF9zaXplO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAvLyBjdHgucm90YXRlKCg5MCAqIE1hdGguUEkpIC8gMTgwKTtcbiAgICAgICAgICAvLyBjdHgudHJhbnNsYXRlKDAsIC1jYW52YXMud2lkdGgpO1xuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIDM4NCwgMzg0KTtcblxuICAgICAgICAgIG9ic2VydmVyLm5leHQoY2FudmFzLnRvRGF0YVVSTCgpKTtcbiAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIDEsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKHsgdHlwZTogJ2dlbmVyaWMgZXJyb3InIH0pO1xuICAgICAgICB9XG4gICAgICAgIGltYWdlID0gbnVsbDtcbiAgICAgICAgY2FudmFzID0gbnVsbDtcbiAgICAgIH07XG4gICAgICBpbWFnZS5vbmVycm9yID0gKGU6IGFueSkgPT4ge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoZXMgdG8gdGhlIG5leHQvcHJldmlvdXMgdmlkZW8gZGV2aWNlXG4gICAqIEBwYXJhbSBmb3J3YXJkXG4gICAqL1xuICBwdWJsaWMgcm90YXRlVmlkZW9JbnB1dChmb3J3YXJkOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuYXZhaWxhYmxlVmlkZW9JbnB1dHMgJiYgdGhpcy5hdmFpbGFibGVWaWRlb0lucHV0cy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBpbmNyZW1lbnQ6IG51bWJlciA9IGZvcndhcmRcbiAgICAgICAgPyAxXG4gICAgICAgIDogdGhpcy5hdmFpbGFibGVWaWRlb0lucHV0cy5sZW5ndGggLSAxO1xuICAgICAgY29uc3QgbmV4dElucHV0SW5kZXggPVxuICAgICAgICAodGhpcy5hY3RpdmVWaWRlb0lucHV0SW5kZXggKyBpbmNyZW1lbnQpICVcbiAgICAgICAgdGhpcy5hdmFpbGFibGVWaWRlb0lucHV0cy5sZW5ndGg7XG4gICAgICB0aGlzLnN3aXRjaFRvVmlkZW9JbnB1dChcbiAgICAgICAgdGhpcy5hdmFpbGFibGVWaWRlb0lucHV0c1tuZXh0SW5wdXRJbmRleF0uZGV2aWNlSWRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaGVzIHRoZSBjYW1lcmEtdmlldyB0byB0aGUgc3BlY2lmaWVkIHZpZGVvIGRldmljZVxuICAgKi9cbiAgcHVibGljIHN3aXRjaFRvVmlkZW9JbnB1dChkZXZpY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gaWYoZGV2aWNlSWQpe1xuICAgIHRoaXMudmlkZW9Jbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RvcE1lZGlhVHJhY2tzKCk7XG4gICAgdGhpcy5pbml0V2ViY2FtKGRldmljZUlkLCB0aGlzLnZpZGVvT3B0aW9ucyk7XG4gICAgLy8gfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50LWhhbmRsZXIgZm9yIHZpZGVvIHJlc2l6ZSBldmVudC5cbiAgICogVHJpZ2dlcnMgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIHNvIHRoYXQgbmV3IHZpZGVvIGRpbWVuc2lvbnMgZ2V0IGFwcGxpZWRcbiAgICovXG4gIHB1YmxpYyB2aWRlb1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICAvLyBoZXJlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uXG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpZGVvV2lkdGgoKSB7XG4gICAgY29uc3QgdmlkZW9SYXRpbyA9IHRoaXMuZ2V0VmlkZW9Bc3BlY3RSYXRpbygpO1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCAqIHZpZGVvUmF0aW8pO1xuICB9XG5cbiAgcHVibGljIGdldCB2aWRlb0hlaWdodCgpIHtcbiAgICBjb25zdCB2aWRlb1JhdGlvID0gdGhpcy5nZXRWaWRlb0FzcGVjdFJhdGlvKCk7XG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMuaGVpZ2h0LCB0aGlzLndpZHRoIC8gdmlkZW9SYXRpbyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpZGVvU3R5bGVDbGFzc2VzKCkge1xuICAgIGxldCBjbGFzc2VzOiBzdHJpbmcgPSAnJztcblxuICAgIGlmICh0aGlzLmlzTWlycm9ySW1hZ2UoKSkge1xuICAgICAgY2xhc3NlcyArPSAnbWlycm9yZWQgJztcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3Nlcy50cmltKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hdGl2ZVZpZGVvRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy52aWRlby5uYXRpdmVFbGVtZW50O1xuICB9XG4gIC8vIHB1YmxpYyBnZXQgc21hbGxWaWRlb0VsZW1lbnQoKSB7XG4gIC8vICAgcmV0dXJuIHRoaXMudmlkZW9TbWFsbDtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2aWRlbyBhc3BlY3QgcmF0aW8gb2YgdGhlIGFjdGl2ZSB2aWRlbyBzdHJlYW1cbiAgICovXG4gIHByaXZhdGUgZ2V0VmlkZW9Bc3BlY3RSYXRpbygpOiBudW1iZXIge1xuICAgIC8vIGNhbGN1bGF0ZSByYXRpbyBmcm9tIHZpZGVvIGVsZW1lbnQgZGltZW5zaW9ucyBpZiBwcmVzZW50XG4gICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcy5uYXRpdmVWaWRlb0VsZW1lbnQ7XG4gICAgaWYgKFxuICAgICAgdmlkZW9FbGVtZW50LnZpZGVvV2lkdGggJiZcbiAgICAgIHZpZGVvRWxlbWVudC52aWRlb1dpZHRoID4gMCAmJlxuICAgICAgdmlkZW9FbGVtZW50LnZpZGVvSGVpZ2h0ICYmXG4gICAgICB2aWRlb0VsZW1lbnQudmlkZW9IZWlnaHQgPiAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gdmlkZW9FbGVtZW50LnZpZGVvV2lkdGggLyB2aWRlb0VsZW1lbnQudmlkZW9IZWlnaHQ7XG4gICAgfVxuXG4gICAgLy8gbm90aGluZyBwcmVzZW50IC0gY2FsY3VsYXRlIHJhdGlvIGJhc2VkIG9uIHdpZHRoL2hlaWdodCBwYXJhbXNcbiAgICByZXR1cm4gdGhpcy53aWR0aCAvIHRoaXMuaGVpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTaXplKCkge1xuICAgIGNvbnN0IHRyYWNrOiBNZWRpYVN0cmVhbVRyYWNrIHwgdW5kZWZpbmVkID1cbiAgICAgIHRoaXMubWVkaWFTdHJlYW0/LmdldFRyYWNrcygpWzBdO1xuXG4gICAgaWYgKHRyYWNrKSB7XG4gICAgICBsZXQgZGVzaXJlZDogYW55ID0ge1xuICAgICAgICB3aWR0aDoge1xuICAgICAgICAgIGlkZWFsOiAwLFxuICAgICAgICB9LFxuICAgICAgICBoZWlnaHQ6IHtcbiAgICAgICAgICBpZGVhbDogMCxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyAgZmFjaW5nTW9kZTondXNlcicsXG4gICAgICAgIGZyYW1lUmF0ZTogeyBtaW46IDIwLCBpZGVhbDogMjQsIG1heDogMjQgfSxcbiAgICAgIH07XG4gICAgICBpZiAodHlwZW9mIHRyYWNrLmdldENhcGFiaWxpdGllcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRyYWNrLmdldENhcGFiaWxpdGllcygpO1xuICAgICAgICBkZXNpcmVkID0ge1xuICAgICAgICAgIHdpZHRoOiB7XG4gICAgICAgICAgICBpZGVhbDogdGhpcy5sYW5kc2NhcGUgJiYgdGhpcy5pc01vYmlsZSA/IGhlaWdodD8ubWF4IDogd2lkdGg/Lm1heCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlaWdodDoge1xuICAgICAgICAgICAgaWRlYWw6IHRoaXMubGFuZHNjYXBlICYmIHRoaXMuaXNNb2JpbGUgPyB3aWR0aD8ubWF4IDogaGVpZ2h0Py5tYXgsXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8vICBmYWNpbmdNb2RlOid1c2VyJyxcbiAgICAgICAgICBmcmFtZVJhdGU6IHsgbWluOiAyMCwgaWRlYWw6IDI0LCBtYXg6IDI0IH0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXNpcmVkID0ge1xuICAgICAgICAgIHdpZHRoOiB7XG4gICAgICAgICAgICBpZGVhbDogMTkyMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhlaWdodDoge1xuICAgICAgICAgICAgaWRlYWw6IDEwODAsXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8vICBmYWNpbmdNb2RlOid1c2VyJyxcbiAgICAgICAgICBmcmFtZVJhdGU6IHsgbWluOiAyMCwgaWRlYWw6IDMwLCBtYXg6IDMxIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbi8vICBkZXNpcmVkLmhlaWdodC5pZGVhbCA9IDEwMDA7XG4vLyAgZGVzaXJlZC53aWR0aC5pZGVhbCA9IDEwMDA7XG5cbiAgICAgIGlmIChkZXNpcmVkLmhlaWdodC5pZGVhbCAmJiBkZXNpcmVkLmhlaWdodC5pZGVhbCA+PSAxNjAwKSB7XG4gICAgICAgIGRlc2lyZWQuaGVpZ2h0LmlkZWFsID0gMTYwMDtcbiAgICAgICAgZGVzaXJlZC53aWR0aC5pZGVhbCA9IDE2MDA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBsYXRmb3JtLkFORFJPSUQpIHtcbiAgICAgICAgLy9kZXNpcmVkLndpZHRoLmlkZWFsID0gMjE2MDtcbiAgICAgICAgLy9kZXNpcmVkLmhlaWdodC5pZGVhbCA9IDIxNjA7XG4gICAgICAgIC8vIGlmICghdGhpcy5sYW5kc2NhcGUpIHtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICBkZXNpcmVkLndpZHRoLmlkZWFsID0gd2lkdGg/Lm1heDtcbiAgICAgICAgLy8gICBkZXNpcmVkLmhlaWdodC5pZGVhbCA9IGhlaWdodD8ubWF4O1xuICAgICAgICAvLyB9XG4gICAgICB9XG5cbiAgICAgIHRyYWNrLmFwcGx5Q29uc3RyYWludHMoZGVzaXJlZCk7XG5cbiAgICAgIC8vdHJhY2suZ2V0U2V0dGluZ3MoKS5mYWNpbmdNb2RlIT09J3VzZXInO1xuXG4gICAgICB0aGlzLnZpZGVvU2l6ZSA9IHtcbiAgICAgICAgaGVpZ2h0OiB0aGlzLmxhbmRzY2FwZVxuICAgICAgICAgID8gdHJhY2suZ2V0U2V0dGluZ3MoKS5oZWlnaHRcbiAgICAgICAgICA6IHRyYWNrLmdldFNldHRpbmdzKCkud2lkdGgsXG4gICAgICAgIHdpZHRoOiB0aGlzLmxhbmRzY2FwZVxuICAgICAgICAgID8gdHJhY2suZ2V0U2V0dGluZ3MoKS53aWR0aFxuICAgICAgICAgIDogdHJhY2suZ2V0U2V0dGluZ3MoKS5oZWlnaHQsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRTdHJlYW1UcmFjayhzdHJlYW06IE1lZGlhU3RyZWFtKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5nZXRWaWRlb1RyYWNrcygpWzBdO1xuICB9XG5cbiAgZ2V0VHJhY2tTZXR0aW5ncygpIHt9XG5cbiAgYWNjZXNWaWRlb1RyYWNrKHZpZGVvVHJhY2tDb25zdHJhaW50czogTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IGFueSB7XG4gICAgcmV0dXJuIGZyb20oXG4gICAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh2aWRlb1RyYWNrQ29uc3RyYWludHMpXG4gICAgKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChzdHJlYW06IE1lZGlhU3RyZWFtKSA9PiB7XG4gICAgICAgIC8vIGRlZmF1bHQgcmVzb2x1dGlvbiAxMjgweDcyMCwgY2hlY2sgbWF4IHJlc29sdXRpb25cblxuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0U3RyZWFtVHJhY2soc3RyZWFtKTtcblxuICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSB0cmFjay5nZXRDYXBhYmlsaXRpZXMoKTtcblxuICAgICAgICBjb25zdCB7IGZhY2luZ01vZGUsIGhlaWdodCwgd2lkdGggfSA9IGNhcGFiaWxpdGllcztcblxuICAgICAgICBjb25zdCBkZXNpcmVkID0ge1xuICAgICAgICAgIHdpZHRoOiB7XG4gICAgICAgICAgICBtaW46IHRoaXMubGFuZHNjYXBlICYmIHRoaXMuaXNNb2JpbGUgPyBoZWlnaHQ/Lm1heCA6IHdpZHRoPy5tYXgsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBoZWlnaHQ6IHtcbiAgICAgICAgICAvLyAgIGV4YWN0OiB0aGlzLmxhbmRzY2FwZSAmJiB0aGlzLmlzTW9iaWxlID8gd2lkdGg/Lm1heCA6IGhlaWdodD8ubWF4LFxuICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgLy8gZmFjaW5nTW9kZTonZW4nLFxuICAgICAgICAgIC8vIGZyYW1lUmF0ZTogeyBtaW46IDI1LCBpZGVhbDogMzAsIG1heDogMzEgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZ2V0IG1heCB3aWR0aFxuXG4gICAgICAgIGNvbnN0IHsgd2lkdGg6IHNXaWR0aCwgaGVpZ2h0OiBzSGVpZ2h0IH0gPSB0cmFjay5nZXRTZXR0aW5ncygpO1xuXG4gICAgICAgIGlmIChkZXNpcmVkLndpZHRoLm1pbiAhPSBzV2lkdGgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc1ZpZGVvVHJhY2soeyB2aWRlbzogZGVzaXJlZCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIHRoaXMuYWNjZXNWaWRlb1RyYWNrKHt2aWRlbzpkZXNpcmVkfSk7XG5cbiAgICAgICAgcmV0dXJuIG9mKHN0cmVhbSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGRyYXdSZWN0YW5nbGUoKSB7XG4gICAgY29uc3QgX2NhbnZhcyA9IHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBjdHggPSBfY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBfY2FudmFzLndpZHRoLCBfY2FudmFzLmhlaWdodCk7XG5cbiAgICAvLyBjdHguZHJhd0ltYWdlKF92aWRlbywgMCwgMCwgX2NhbnZhcy53aWR0aCwgX2NhbnZhcy5oZWlnaHQpO1xuXG4gICAgY29uc3QgeyBwYWRkaW5nLCB0b3AsIHJXaWR0aCwgckhlaWdodCB9ID0gdGhpcy5jYXJkUmVjdGFuZ2xlO1xuXG4gICAgY3R4LnN0cm9rZVN0eWxlID0gJ3JlZCc7XG5cbiAgICBjdHguc3Ryb2tlUmVjdChwYWRkaW5nLCB0b3AsIHJXaWR0aCwgckhlaWdodCk7XG4gIH1cblxuICBnZXRNYXhBdmFpbGFibGVSZXNvbHV0aW9uKCkge31cbiAgLyoqXG4gICAqIEluaXQgd2ViY2FtIGxpdmUgdmlld1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0V2ViY2FtKFxuICAgIGRldmljZUlkOiBzdHJpbmcsXG4gICAgdXNlclZpZGVvVHJhY2tDb25zdHJhaW50czogTWVkaWFUcmFja0NvbnN0cmFpbnRzXG4gICkge1xuICAgIGNvbnNvbGUubG9nKCdJTklUIFdFQkNBTScpXG4gICAgY29uc3QgX3ZpZGVvID0gdGhpcy5uYXRpdmVWaWRlb0VsZW1lbnQ7XG4gICAgLy8gY29uc3QgdmlkZW9TdHJlYW1lciA9IHRoaXMudmlkZW9TdHJlYW1lci5uYXRpdmVFbGVtZW50O1xuICAgIC8vIGNvbnN0IHZpZGVvU21hbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKSB7XG4gICAgICAvLyBtZXJnZSBkZXZpY2VJZCAtPiB1c2VyVmlkZW9UcmFja0NvbnN0cmFpbnRzXG4gICAgICBjb25zdCB2aWRlb1RyYWNrQ29uc3RyYWludHMgPVxuICAgICAgICBXZWJjYW1Db21wb25lbnQuZ2V0TWVkaWFDb25zdHJhaW50c0ZvckRldmljZShcbiAgICAgICAgICBkZXZpY2VJZCxcbiAgICAgICAgICB1c2VyVmlkZW9UcmFja0NvbnN0cmFpbnRzXG4gICAgICAgICk7XG5cbiAgICAgIC8vIC8vIGlmIChkZXZpY2VJZCkge1xuICAgICAgLy8gdGhpcy5hY2Nlc1ZpZGVvVHJhY2soeyB2aWRlbzogdmlkZW9UcmFja0NvbnN0cmFpbnRzIH0pLnN1YnNjcmliZShcbiAgICAgIC8vICAgKHN0cmVhbTogTWVkaWFTdHJlYW0pID0+IHtcbiAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICAgICdWQUxJRCBTRVRUSU5HUycsXG4gICAgICAvLyAgICAgICBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKVswXS5nZXRTZXR0aW5ncygpXG4gICAgICAvLyAgICAgKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gKTtcbiAgICAgIC8vIH1cbiAgICAgIGlmICh0aGlzLnBsYXRmb3JtLkFORFJPSUQpIHtcbiAgICAgICAgdmlkZW9UcmFja0NvbnN0cmFpbnRzLndpZHRoID0gMTYwMDtcbiAgICAgICAgdmlkZW9UcmFja0NvbnN0cmFpbnRzLmhlaWdodCA9IDE2MDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnN0cmFpbnRzID0ge1xuICAgICAgICBleGFjdDogZGV2aWNlSWQsXG4gICAgICAgIHdpZHRoOiB7IG1pbjogNDgwLCBpZGVhbDogMTI4MCB9LFxuICAgICAgICBoZWlnaHQ6IHsgbWluOiA0ODAsIGlkZWFsOiA3MjAgfSxcbiAgICAgICAgLy8gYXNwZWN0UmF0aW86IDMgLyAyLFxuICAgICAgICBmcmFtZVJhdGU6IHsgbWluOiAyMCB9LFxuICAgICAgfTtcblxuICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAuZ2V0VXNlck1lZGlhKDxNZWRpYVN0cmVhbUNvbnN0cmFpbnRzPnsgdmlkZW86IHZpZGVvVHJhY2tDb25zdHJhaW50cyB9KVxuICAgICAgICAudGhlbigoc3RyZWFtOiBNZWRpYVN0cmVhbSkgPT4ge1xuICAgICAgICAgIHRoaXMubWVkaWFTdHJlYW0gPSBzdHJlYW07XG4gICAgICAgICAgX3ZpZGVvLnNyY09iamVjdCA9IHN0cmVhbTtcblxuICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgIHRoaXMudXBkYXRlY2FudmFzU2l6ZSgpO1xuXG4gICAgICAgICAgX3ZpZGVvLnBsYXkoKTtcblxuICAgICAgICAgIF92aWRlby5vbnBsYXkgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUNhbWVyYShzdHJlYW0pO1xuICAgICAgICAgICAgdGhpcy5kcmF3UmVjdGFuZ2xlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgdGhpcy5pbml0RXJyb3IubmV4dCg8V2ViY2FtSW5pdEVycm9yPntcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgbWVkaWFTdHJlYW1FcnJvcjogZXJyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbml0RXJyb3IubmV4dCg8V2ViY2FtSW5pdEVycm9yPntcbiAgICAgICAgbWVzc2FnZTogJ0Nhbm5vdCByZWFkIFVzZXJNZWRpYSBmcm9tIE1lZGlhRGV2aWNlcy4nLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzTW9iaWxlKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtLkFORFJPSUQgfHwgdGhpcy5wbGF0Zm9ybS5JT1M7XG4gIH1cblxuICBnZXQgY2FyZFJlY3RhbmdsZSgpIHtcbiAgICBjb25zdCBfY2FudmFzID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBkb2NTaXplID0gdGhpcy50eXBlID09PSAnc2VsZmllJyA/IDEgOiA4NiAvIDU1O1xuXG4gICAvLyBjb25zb2xlLmxvZyhfY2FudmFzLndpZHRoLCBfY2FudmFzLmhlaWdodCk7XG4gICAgbGV0IHBhZGRpbmcgPSAxMDtcblxuICAgIGxldCByV2lkdGggPSBfY2FudmFzLndpZHRoIC0gMiAqIHBhZGRpbmc7XG4gICAgbGV0IHJIZWlnaHQgPSByV2lkdGggLyBkb2NTaXplO1xuICAgIGxldCB0b3AgPSAoX2NhbnZhcy5oZWlnaHQgLSBySGVpZ2h0KSAvIDI7XG5cbiAgICBpZiAoKCF0aGlzLmlzTW9iaWxlICYmIF9jYW52YXMud2lkdGghPT0gX2NhbnZhcy5oZWlnaHQpKSB7XG4gICAgICBwYWRkaW5nID0gNDA7XG5cbiAgICAgIHJIZWlnaHQgPSBfY2FudmFzLmhlaWdodCAtIDIgKiBwYWRkaW5nO1xuICAgICAgcldpZHRoID0gckhlaWdodCAqIGRvY1NpemU7XG4gICAgICB0b3AgPSAoX2NhbnZhcy5oZWlnaHQgLSBySGVpZ2h0KSAvIDI7XG4gICAgICBwYWRkaW5nID0gKF9jYW52YXMud2lkdGggLSByV2lkdGgpIC8gMjtcbiAgICB9XG5cbiAgIC8vIGNvbnNvbGUubG9nKHBhZGRpbmcsIHRvcCwgcldpZHRoLCBySGVpZ2h0KTtcblxuICAgIHJldHVybiB7IHBhZGRpbmcsIHRvcCwgcldpZHRoLCBySGVpZ2h0IH07XG4gIH1cbiAgZ2V0IHNuYXBSZWN0YW5nbGUoKSB7XG4gICAgY29uc3QgX2NhbnZhcyA9IHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBhciA9IHRoaXMudmlkZW9TaXplLndpZHRoIC8gX2NhbnZhcy53aWR0aDtcblxuICAgIGxldCB7IHBhZGRpbmcsIHRvcCwgcldpZHRoLCBySGVpZ2h0IH0gPSB0aGlzLmNhcmRSZWN0YW5nbGU7XG5cbiAgICBwYWRkaW5nID0gcGFkZGluZyAqIGFyO1xuICAgIHRvcCA9IHRvcCAqIGFyO1xuICAgIHJXaWR0aCA9IHJXaWR0aCAqIGFyO1xuICAgIHJIZWlnaHQgPSBySGVpZ2h0ICogYXI7XG5cbiAgICByZXR1cm4geyBwYWRkaW5nLCB0b3AsIHJXaWR0aCwgckhlaWdodCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBY3RpdmVDYW1lcmEoc3RyZWFtOiBhbnkpIHtcbiAgICB0aGlzLnZpZGVvUmVhZHkubmV4dChmYWxzZSk7XG4gICAgdGhpcy5zaG93VmlkZW8gPSBmYWxzZTtcbiAgICB0aGlzLmFjdGl2ZVZpZGVvU2V0dGluZ3MgPSBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKVswXS5nZXRTZXR0aW5ncygpO1xuICAgIGNvbnN0IGFjdGl2ZURldmljZUlkOiBzdHJpbmcgPVxuICAgICAgV2ViY2FtQ29tcG9uZW50LmdldERldmljZUlkRnJvbU1lZGlhU3RyZWFtVHJhY2soXG4gICAgICAgIHN0cmVhbS5nZXRWaWRlb1RyYWNrcygpWzBdXG4gICAgICApO1xuXG4gICAgY29uc3QgdmlkZW9UcmFjayA9IHN0cmVhbS5nZXRUcmFja3MoKVswXTtcbiAgICB0aGlzLnRyYWNrU2V0dGluZ3MgPSB2aWRlb1RyYWNrLmdldFNldHRpbmdzKCk7XG5cbiAgICB0aGlzLmNhbWVyYVByb3ZpZGVyLmNhbWVyYVdhc1N3aXRjaGVkKGFjdGl2ZURldmljZUlkKTtcblxuICAgIHRoaXMuY2FtZXJhU3dpdGNoZWQubmV4dChhY3RpdmVEZXZpY2VJZCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc2l6ZVN0YWdlKCk7XG4gICAgICAgIHRoaXMuc2hvd1ZpZGVvID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWRlb1JlYWR5Lm5leHQodHJ1ZSk7XG5cbiAgICAgICAgaWYgKE1lZGlhU3RyZWFtVHJhY2tQcm9jZXNzb3IpIHtcbiAgICAgICAgICB0aGlzLnRyYWNrUHJvY2Vzc29yID0gbmV3IE1lZGlhU3RyZWFtVHJhY2tQcm9jZXNzb3IodmlkZW9UcmFjayk7XG4gICAgICAgICAgbGV0IGZyYW1lU3RyZWFtID0gdGhpcy50cmFja1Byb2Nlc3Nvci5yZWFkYWJsZTtcbiAgICAgICAgICBpZiAoIXRoaXMuc2h1dGRvd24pIHtcbiAgICAgICAgICAgIHRoaXMud29ya2VyPy5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzdGFydCcsXG5cbiAgICAgICAgICAgICAgICBmcmFtZVN0cmVhbTogZnJhbWVTdHJlYW0sXG4gICAgICAgICAgICAgICAgdHJhY2tTZXR0aW5nczogdGhpcy50cmFja1NldHRpbmdzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbZnJhbWVTdHJlYW1dXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0aXZlVmlkZW9UcmFjaygpOiBNZWRpYVN0cmVhbVRyYWNrIHwgYW55IHtcbiAgICByZXR1cm4gdGhpcy5tZWRpYVN0cmVhbSA/IHRoaXMubWVkaWFTdHJlYW0uZ2V0VmlkZW9UcmFja3MoKVswXSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGlzTWlycm9ySW1hZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdldEFjdGl2ZVZpZGVvVHJhY2soKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGZvciBleHBsaWNpdCBtaXJyb3Igb3ZlcnJpZGUgcGFyYW1ldGVyXG4gICAge1xuICAgICAgbGV0IG1pcnJvcjogc3RyaW5nID0gJ2F1dG8nO1xuICAgICAgaWYgKHRoaXMubWlycm9ySW1hZ2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1pcnJvckltYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIG1pcnJvciA9IFN0cmluZyh0aGlzLm1pcnJvckltYWdlKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlYmNhbU1pcnJvclByb3BlcnRpZXNcbiAgICAgICAgICBpZiAodGhpcy5taXJyb3JJbWFnZS54KSB7XG4gICAgICAgICAgICBtaXJyb3IgPSB0aGlzLm1pcnJvckltYWdlLngudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChtaXJyb3IpIHtcbiAgICAgICAgY2FzZSAnYWx3YXlzJzpcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnbmV2ZXInOlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0OiBlbmFibGUgbWlycm9yaW5nIGlmIHdlYmNhbSBpcyB1c2VyIGZhY2luZ1xuICAgIHJldHVybiBXZWJjYW1Db21wb25lbnQuaXNVc2VyRmFjaW5nKHRoaXMuZ2V0QWN0aXZlVmlkZW9UcmFjaygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyBhbGwgYWN0aXZlIG1lZGlhIHRyYWNrcy5cbiAgICogVGhpcyBwcmV2ZW50cyB0aGUgd2ViY2FtIGZyb20gYmVpbmcgaW5kaWNhdGVkIGFzIGFjdGl2ZSxcbiAgICogZXZlbiBpZiBpdCBpcyBubyBsb25nZXIgdXNlZCBieSB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIHByaXZhdGUgc3RvcE1lZGlhVHJhY2tzKCkge1xuICAgIC8vIHRoaXMudmlkZW8ubmF0aXZlRWxlbWVudC5wYXVzZSgpO1xuICAgIGlmICh0aGlzLnZpZGVvLm5hdGl2ZUVsZW1lbnQuc3JjT2JqZWN0KSB7XG4gICAgICAoKHRoaXMudmlkZW8ubmF0aXZlRWxlbWVudCBhcyBIVE1MVmlkZW9FbGVtZW50KS5zcmNPYmplY3QgYXMgTWVkaWFTdHJlYW0pXG4gICAgICAgIC5nZXRUcmFja3MoKVxuICAgICAgICAuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgdGhpcy52aWRlby5uYXRpdmVFbGVtZW50LnNyY09iamVjdCA9IG51bGw7XG4gICAgICB0aGlzLnZpZGVvLm5hdGl2ZUVsZW1lbnQuc3JjID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWVkaWFTdHJlYW0gJiYgdGhpcy5tZWRpYVN0cmVhbS5nZXRUcmFja3MpIHtcbiAgICAgIC8vIGdldFRyYWNrcygpIHJldHVybnMgYWxsIG1lZGlhIHRyYWNrcyAodmlkZW8rYXVkaW8pXG5cbiAgICAgIHRoaXMubWVkaWFTdHJlYW1cbiAgICAgICAgLmdldFRyYWNrcygpXG4gICAgICAgIC5mb3JFYWNoKCh0cmFjazogTWVkaWFTdHJlYW1UcmFjaykgPT4gdHJhY2suc3RvcCgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmUgZnJvbSBhbGwgb3BlbiBzdWJzY3JpcHRpb25zXG4gICAqL1xuICBwcml2YXRlIHVuc3Vic2NyaWJlRnJvbVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMudHJpZ2dlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy50cmlnZ2VyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN3aXRjaENhbWVyYVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zd2l0Y2hDYW1lcmFTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYXZhaWxhYmxlIGlucHV0IGRldmljZXNcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0QXZhaWxhYmxlRGV2aWNlcygpOiBQcm9taXNlPE1lZGlhRGV2aWNlSW5mb1tdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIFdlYmNhbVV0aWwuZ2V0QXZhaWxhYmxlVmlkZW9JbnB1dHMoKS5zdWJzY3JpYmUoXG4gICAgICAgIChkZXZpY2VzOiBNZWRpYURldmljZUluZm9bXSkgPT4ge1xuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlVmlkZW9JbnB1dHMgPSBkZXZpY2VzO1xuICAgICAgICAgIHJlc29sdmUoZGV2aWNlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZVZpZGVvSW5wdXRzID0gW107XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3ZWJjYW0td3JhcHBlclwiPlxuICA8ZGl2PlxuICAgIDx2aWRlb1xuICAgICAgI3ZpZGVvXG4gICAgICBhdXRvcGxheVxuICAgICAgbXV0ZWRcbiAgICAgIHN0eWxlPVwiZGlzcGxheTogYmxvY2tcIlxuICAgICAgcGxheXNpbmxpbmVcblxuICAgID48L3ZpZGVvPlxuXG4gICAgPGRpdiBjbGFzcz1cInJlY3RhbmdsZVwiPlxuXG4gICAgICA8Y2FudmFzXG4gICAgICAgICNjYW52YXNcbiAgICAgICAgW25nU3R5bGVdPVwieyB2aXNpYmlsaXR5OiBzaG93VmlkZW8gPyAndmlzaWJsZScgOiAnaGlkZGVuJyB9XCJcbiAgICAgICAgW3dpZHRoXT1cImNhbnZhc1NpemUud2lkdGhcIlxuICAgICAgICBbaGVpZ2h0XT1cImNhbnZhc1NpemUuaGVpZ2h0XCJcbiAgICAgID48L2NhbnZhcz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2NvcmUvaW50ZXJmYWNlcy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQXV0aENvbmZpZyB7XG4gIHBhdGg6IHN0cmluZztcbiAgdG9rZW5OYW1lOiBzdHJpbmc7XG4gIGNsaWVudElkOiBzdHJpbmc7XG5cbiAgdmFsaWREb21haW5zPzogc3RyaW5nW107XG59XG5leHBvcnQgaW50ZXJmYWNlIFNjYW5Db25maWcge1xuICBleHRyYWN0aW9uUGF0aDogc3RyaW5nO1xuICB2YWxpZGF0aW9uUGF0aDogc3RyaW5nO1xuICBlcnJvckxvZ2dpbmdQYXRoOiBzdHJpbmc7XG4gIHN0YXRlTGVzc1BhdGg6IHN0cmluZztcblxuICBkZXZlbG9wbWVudD86IGJvb2xlYW47XG4gIGhpZGVSZXN1bHRzPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgU2NhbkRhdGFDb25maWcge1xuICBhdXRoOiBBdXRoQ29uZmlnO1xuICBzY2FuOiBTY2FuQ29uZmlnO1xufVxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNjYW5kb2Mvc3JjL2NvcmUvaW50ZXJmYWNlcy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQXV0aENvbmZpZyB7XG4gIHBhdGg6IHN0cmluZztcbiAgdG9rZW5OYW1lOiBzdHJpbmc7XG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIGxvZ2luPzogc3RyaW5nO1xuICByZWZyZXNoPzogc3RyaW5nO1xuXG4gIHZhbGlkRG9tYWlucz86IHN0cmluZ1tdO1xufVxuZXhwb3J0IGludGVyZmFjZSBTY2FuQ29uZmlnIHtcbiAgZXh0cmFjdGlvblBhdGg6IHN0cmluZztcbiAgdmFsaWRhdGlvblBhdGg6IHN0cmluZztcbiAgZXJyb3JMb2dnaW5nUGF0aDogc3RyaW5nO1xuICBzdGF0ZUxlc3NQYXRoOiBzdHJpbmc7XG5cbiAgZGV2ZWxvcG1lbnQ/OiBib29sZWFuO1xuICBoaWRlUmVzdWx0cz86IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIFNjYW5EYXRhQ29uZmlnIHtcbiAgYXV0aDogQXV0aENvbmZpZztcbiAgc2NhbjogU2NhbkNvbmZpZztcbn1cbiJdfQ==
@@ -2,6 +2,7 @@ import { Inject, Injectable } from '@angular/core';
2
2
  import jwt_decode from 'jwt-decode';
3
3
  import { of } from 'rxjs';
4
4
  import { map, tap } from 'rxjs/operators';
5
+ import moment from 'moment';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "@angular/common/http";
7
8
  export class AuthProvider {
@@ -9,38 +10,88 @@ export class AuthProvider {
9
10
  this.http = http;
10
11
  this.config = config;
11
12
  this.token = '';
13
+ this.refresh_token = '';
12
14
  this.tokenTimestamps = {
13
- exp: 0,
14
- iat: 0,
15
+ Time: 0,
16
+ Client: 0,
17
+ SubClient: 0,
15
18
  };
16
19
  }
20
+ setSubClient(name) {
21
+ this.subClient = name;
22
+ }
17
23
  setConfig() { }
18
24
  get tokenExpired() {
19
- if (this.token == '' || this.tokenTimestamps.exp === 0) {
25
+ console.log(this.tokenTimestamps, this.token);
26
+ if (this.token == '' || this.tokenTimestamps.Time === 0) {
20
27
  console.log('EXPIRED');
21
28
  return true;
22
29
  }
23
- const { iat, exp } = this.tokenTimestamps;
24
- return iat + 20 > exp;
30
+ const { Time } = this.tokenTimestamps;
31
+ const tokenDate = moment(Time);
32
+ const isValid = moment(tokenDate).isBefore(moment().add(5, 'minutes'));
33
+ console.log('VALID', isValid);
34
+ return !isValid;
25
35
  }
26
36
  resetToken() {
27
- this.token = '';
37
+ // this.token = '';
28
38
  }
29
39
  get accesToken() {
30
- return this.tokenExpired ? this.getToken() : of(this.token);
40
+ console.log('AT');
41
+ return this.tokenExpired ? this.fetchToken() : of(this.token);
42
+ }
43
+ fetchToken() {
44
+ if (this.token && this.refresh_token) {
45
+ return this.refreshToken();
46
+ }
47
+ return this.getToken();
48
+ }
49
+ refreshToken() {
50
+ const { path, refresh } = this.config;
51
+ return this.http
52
+ .post(`${path}${refresh}`, {
53
+ refresh_token: this.refresh_token,
54
+ })
55
+ .pipe(tap((token) => {
56
+ // console.log(this.token);
57
+ this.token = token.access_token;
58
+ this.updateToken();
59
+ // this.token = token.access_token;
60
+ // console.log('TOKEN', this.token);
61
+ // this.refresh_token = token.refresh_token;
62
+ // const decoded: any = jwt_decode(this.token);
63
+ // console.log(decoded);
64
+ // const { Time, Client, SubClient } = decoded;
65
+ // this.tokenTimestamps = { Time, Client, SubClient };
66
+ }), map((data) => data.access_token));
67
+ }
68
+ get user_key() {
69
+ return this.config.clientId;
70
+ }
71
+ get sub_client() {
72
+ return this.config.tokenName ? this.config.tokenName : this.subClient;
73
+ }
74
+ updateToken() {
75
+ const decoded = jwt_decode(this.token);
76
+ console.log(decoded);
77
+ const { Time, Client, SubClient } = decoded;
78
+ this.tokenTimestamps = { Time, Client, SubClient };
31
79
  }
32
80
  getToken() {
81
+ console.log('GET');
82
+ const { path, login } = this.config;
33
83
  return this.http
34
- .post(this.config.path, {
35
- clientId: this.config.clientId,
36
- token: this.config.tokenName,
84
+ .post(`${path}${login}`, {
85
+ user_key: this.user_key,
86
+ sub_client: this.sub_client,
37
87
  })
38
- .pipe(map((data) => data.accessToken), tap((token) => {
39
- this.token = token;
40
- const decoded = jwt_decode(this.token);
41
- const { iat, exp } = decoded;
42
- this.tokenTimestamps = { iat, exp };
43
- }));
88
+ .pipe(tap((token) => {
89
+ console.log(this.token);
90
+ this.token = token.access_token;
91
+ console.log('TOKEN', this.token);
92
+ this.refresh_token = token.refresh_token;
93
+ this.updateToken();
94
+ }), map((data) => data.access_token));
44
95
  }
45
96
  }
46
97
  AuthProvider.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AuthProvider, deps: [{ token: i1.HttpClient }, { token: 'configAuth' }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -54,4 +105,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
54
105
  type: Inject,
55
106
  args: ['configAuth']
56
107
  }] }]; } });
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zY2FuZG9jL3NyYy9wcm92aWRlcnMvYXV0aC5wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFhLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFRckQsTUFBTSxPQUFPLFlBQVk7SUFDdkIsWUFDVSxJQUFnQixFQUNLLE1BQWtCO1FBRHZDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDSyxXQUFNLEdBQU4sTUFBTSxDQUFZO1FBT2pELFVBQUssR0FBVyxFQUFFLENBQUM7UUFFbkIsb0JBQWUsR0FBRztZQUNoQixHQUFHLEVBQUUsQ0FBQztZQUNOLEdBQUcsRUFBRSxDQUFDO1NBQ1AsQ0FBQztJQVRGLENBQUM7SUFFRCxTQUFTLEtBQUksQ0FBQztJQVNkLElBQVksWUFBWTtRQUV0QixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDMUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ08sUUFBUTtRQUNkLE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUM5QixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1NBQzdCLENBQUM7YUFDRCxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQ3BDLEdBQUcsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLE1BQU0sT0FBTyxHQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUM7WUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQzs7eUdBakRVLFlBQVksNENBR2IsWUFBWTs2R0FIWCxZQUFZLGNBRlgsTUFBTTsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBSUksTUFBTTsyQkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgand0X2RlY29kZSBmcm9tICdqd3QtZGVjb2RlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBBdXRoQ29uZmlnIH0gZnJvbSAnLi4vY29yZS9pbnRlcmZhY2VzL2NvbmZpZyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRoUHJvdmlkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdCgnY29uZmlnQXV0aCcpIHB1YmxpYyBjb25maWc6IEF1dGhDb25maWdcbiAgKSB7XG5cbiAgfVxuXG4gIHNldENvbmZpZygpIHt9XG5cbiAgdG9rZW46IHN0cmluZyA9ICcnO1xuXG4gIHRva2VuVGltZXN0YW1wcyA9IHtcbiAgICBleHA6IDAsXG4gICAgaWF0OiAwLFxuICB9O1xuXG4gIHByaXZhdGUgZ2V0IHRva2VuRXhwaXJlZCgpOiBib29sZWFuIHtcblxuICAgIGlmICh0aGlzLnRva2VuPT0nJyB8fCB0aGlzLnRva2VuVGltZXN0YW1wcy5leHAgPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFWFBJUkVEJylcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaWF0LCBleHAgfSA9IHRoaXMudG9rZW5UaW1lc3RhbXBzO1xuICAgIHJldHVybiBpYXQgKyAyMCA+IGV4cDtcbiAgfVxuXG4gIHJlc2V0VG9rZW4oKSB7XG4gICAgdGhpcy50b2tlbiA9ICcnO1xuICB9XG4gIGdldCBhY2Nlc1Rva2VuKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5FeHBpcmVkID8gdGhpcy5nZXRUb2tlbigpIDogb2YodGhpcy50b2tlbik7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUb2tlbigpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KHRoaXMuY29uZmlnLnBhdGgsIHtcbiAgICAgICAgY2xpZW50SWQ6IHRoaXMuY29uZmlnLmNsaWVudElkLFxuICAgICAgICB0b2tlbjogdGhpcy5jb25maWcudG9rZW5OYW1lLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4gZGF0YS5hY2Nlc3NUb2tlbiksXG4gICAgICAgIHRhcCgodG9rZW46IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkOiBhbnkgPSBqd3RfZGVjb2RlKHRoaXMudG9rZW4pO1xuICAgICAgICAgIGNvbnN0IHsgaWF0LCBleHAgfSA9IGRlY29kZWQ7XG4gICAgICAgICAgdGhpcy50b2tlblRpbWVzdGFtcHMgPSB7IGlhdCwgZXhwIH07XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG59XG4iXX0=
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zY2FuZG9jL3NyYy9wcm92aWRlcnMvYXV0aC5wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFhLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQzs7O0FBUTVCLE1BQU0sT0FBTyxZQUFZO0lBRXZCLFlBQ1UsSUFBZ0IsRUFDSyxNQUFrQjtRQUR2QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ0ssV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQVFqRCxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBRW5CLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBRTNCLG9CQUFlLEdBQVE7WUFDckIsSUFBSSxFQUFFLENBQUM7WUFDUCxNQUFNLEVBQUUsQ0FBQztZQUNULFNBQVMsRUFBRSxDQUFDO1NBQ2IsQ0FBQztJQWZDLENBQUM7SUFFSixZQUFZLENBQUMsSUFBWTtRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBQ0QsU0FBUyxLQUFJLENBQUM7SUFZZCxJQUFZLFlBQVk7UUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUN2RCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUIsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNsQixDQUFDO0lBRUQsVUFBVTtRQUNSLG1CQUFtQjtJQUNyQixDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNiLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxPQUFPLEVBQUUsRUFBRTtZQUN6QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQzthQUNELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNqQiwyQkFBMkI7WUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixtQ0FBbUM7WUFDbkMsb0NBQW9DO1lBQ3BDLDRDQUE0QztZQUM1QywrQ0FBK0M7WUFDL0Msd0JBQXdCO1lBQ3hCLCtDQUErQztZQUMvQyxzREFBc0Q7UUFDeEQsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQ3RDLENBQUM7SUFDTixDQUFDO0lBRUQsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQVksVUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4RSxDQUFDO0lBQ08sV0FBVztRQUNqQixNQUFNLE9BQU8sR0FBUSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQzVDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFDTyxRQUFRO1FBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVuQixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFcEMsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNiLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLENBQUM7YUFDRCxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUN0QyxDQUFDO0lBQ04sQ0FBQzs7eUdBMUdVLFlBQVksNENBSWIsWUFBWTs2R0FKWCxZQUFZLGNBRlgsTUFBTTsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBS0ksTUFBTTsyQkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgand0X2RlY29kZSBmcm9tICdqd3QtZGVjb2RlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBBdXRoQ29uZmlnIH0gZnJvbSAnLi4vY29yZS9pbnRlcmZhY2VzL2NvbmZpZyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFByb3ZpZGVyIHtcbiAgc3ViQ2xpZW50ITogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdCgnY29uZmlnQXV0aCcpIHB1YmxpYyBjb25maWc6IEF1dGhDb25maWdcbiAgKSB7fVxuXG4gIHNldFN1YkNsaWVudChuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN1YkNsaWVudCA9IG5hbWU7XG4gIH1cbiAgc2V0Q29uZmlnKCkge31cblxuICB0b2tlbjogc3RyaW5nID0gJyc7XG5cbiAgcmVmcmVzaF90b2tlbjogc3RyaW5nID0gJyc7XG5cbiAgdG9rZW5UaW1lc3RhbXBzOiBhbnkgPSB7XG4gICAgVGltZTogMCxcbiAgICBDbGllbnQ6IDAsXG4gICAgU3ViQ2xpZW50OiAwLFxuICB9O1xuXG4gIHByaXZhdGUgZ2V0IHRva2VuRXhwaXJlZCgpOiBib29sZWFuIHtcbiAgICBjb25zb2xlLmxvZyh0aGlzLnRva2VuVGltZXN0YW1wcywgdGhpcy50b2tlbik7XG4gICAgaWYgKHRoaXMudG9rZW4gPT0gJycgfHwgdGhpcy50b2tlblRpbWVzdGFtcHMuVGltZSA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ0VYUElSRUQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgVGltZSB9ID0gdGhpcy50b2tlblRpbWVzdGFtcHM7XG4gICAgY29uc3QgdG9rZW5EYXRlID0gbW9tZW50KFRpbWUpO1xuICAgIGNvbnN0IGlzVmFsaWQgPSBtb21lbnQodG9rZW5EYXRlKS5pc0JlZm9yZShtb21lbnQoKS5hZGQoNSwgJ21pbnV0ZXMnKSk7XG4gICAgY29uc29sZS5sb2coJ1ZBTElEJywgaXNWYWxpZCk7XG4gICAgcmV0dXJuICFpc1ZhbGlkO1xuICB9XG5cbiAgcmVzZXRUb2tlbigpIHtcbiAgICAvLyB0aGlzLnRva2VuID0gJyc7XG4gIH1cbiAgZ2V0IGFjY2VzVG9rZW4oKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zb2xlLmxvZygnQVQnKTtcbiAgICByZXR1cm4gdGhpcy50b2tlbkV4cGlyZWQgPyB0aGlzLmZldGNoVG9rZW4oKSA6IG9mKHRoaXMudG9rZW4pO1xuICB9XG5cbiAgZmV0Y2hUb2tlbigpIHtcbiAgICBpZiAodGhpcy50b2tlbiAmJiB0aGlzLnJlZnJlc2hfdG9rZW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRUb2tlbigpO1xuICB9XG5cbiAgcmVmcmVzaFRva2VuKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgeyBwYXRoLCByZWZyZXNoIH0gPSB0aGlzLmNvbmZpZztcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdChgJHtwYXRofSR7cmVmcmVzaH1gLCB7XG4gICAgICAgIHJlZnJlc2hfdG9rZW46IHRoaXMucmVmcmVzaF90b2tlbixcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCh0b2tlbjogYW55KSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy50b2tlbik7XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuLmFjY2Vzc190b2tlbjtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRva2VuKCk7XG4gICAgICAgICAgLy8gdGhpcy50b2tlbiA9IHRva2VuLmFjY2Vzc190b2tlbjtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnVE9LRU4nLCB0aGlzLnRva2VuKTtcbiAgICAgICAgICAvLyB0aGlzLnJlZnJlc2hfdG9rZW4gPSB0b2tlbi5yZWZyZXNoX3Rva2VuO1xuICAgICAgICAgIC8vIGNvbnN0IGRlY29kZWQ6IGFueSA9IGp3dF9kZWNvZGUodGhpcy50b2tlbik7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coZGVjb2RlZCk7XG4gICAgICAgICAgLy8gY29uc3QgeyBUaW1lLCBDbGllbnQsIFN1YkNsaWVudCB9ID0gZGVjb2RlZDtcbiAgICAgICAgICAvLyB0aGlzLnRva2VuVGltZXN0YW1wcyA9IHsgVGltZSwgQ2xpZW50LCBTdWJDbGllbnQgfTtcbiAgICAgICAgfSksXG4gICAgICAgIG1hcCgoZGF0YTogYW55KSA9PiBkYXRhLmFjY2Vzc190b2tlbilcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldCB1c2VyX2tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuY2xpZW50SWQ7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgc3ViX2NsaWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5OYW1lID8gdGhpcy5jb25maWcudG9rZW5OYW1lIDogdGhpcy5zdWJDbGllbnQ7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVUb2tlbigpIHtcbiAgICBjb25zdCBkZWNvZGVkOiBhbnkgPSBqd3RfZGVjb2RlKHRoaXMudG9rZW4pO1xuICAgIGNvbnNvbGUubG9nKGRlY29kZWQpO1xuICAgIGNvbnN0IHsgVGltZSwgQ2xpZW50LCBTdWJDbGllbnQgfSA9IGRlY29kZWQ7XG4gICAgdGhpcy50b2tlblRpbWVzdGFtcHMgPSB7IFRpbWUsIENsaWVudCwgU3ViQ2xpZW50IH07XG4gIH1cbiAgcHJpdmF0ZSBnZXRUb2tlbigpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnNvbGUubG9nKCdHRVQnKTtcblxuICAgIGNvbnN0IHsgcGF0aCwgbG9naW4gfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoYCR7cGF0aH0ke2xvZ2lufWAsIHtcbiAgICAgICAgdXNlcl9rZXk6IHRoaXMudXNlcl9rZXksXG4gICAgICAgIHN1Yl9jbGllbnQ6IHRoaXMuc3ViX2NsaWVudCxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCh0b2tlbjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2codGhpcy50b2tlbik7XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuLmFjY2Vzc190b2tlbjtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVE9LRU4nLCB0aGlzLnRva2VuKTtcbiAgICAgICAgICB0aGlzLnJlZnJlc2hfdG9rZW4gPSB0b2tlbi5yZWZyZXNoX3Rva2VuO1xuICAgICAgICAgIHRoaXMudXBkYXRlVG9rZW4oKTtcbiAgICAgICAgfSksXG4gICAgICAgIG1hcCgoZGF0YTogYW55KSA9PiBkYXRhLmFjY2Vzc190b2tlbilcbiAgICAgICk7XG4gIH1cbn1cbiJdfQ==